OpenCode v1.14.51 - #11031
Conversation
Co-authored-by: Andrew Suffield <asuffield@cloudflare.com> Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
…pt handler (#27196)
| if ( | ||
| (isLiteLLMProxy || input.model.providerID.includes("github-copilot")) && | ||
| input.model.providerID.includes("github-copilot") && |
There was a problem hiding this comment.
WARNING: LiteLLM stub tool removed — potential breaking change for LiteLLM users
The previous code injected a stub tool for providers containing litellm in their ID (or with litellmProxy: true option) when message history has tool calls but no active tools (e.g. during compaction). This fix removes that behavior entirely, leaving only GitHub Copilot.
Users running Kilo against LiteLLM proxies will now get API validation errors during compaction because the backend requires a tools parameter when message history contains tool calls but the tools array is empty. This is an upstream change — worth flagging to verify if any Kilo-specific LiteLLM users exist who need a migration path or workaround.
| @@ -219,7 +226,6 @@ export const layer = Layer.effect( | |||
| glob: "allow", | |||
There was a problem hiding this comment.
SUGGESTION: codesearch permission removed from Scout agent
The codesearch: "allow" permission was removed from the Scout agent's permission list. If Scout is expected to use code search to explore referenced repositories, removing it may silently break that functionality. Verify this is intentional — possibly Scout no longer needs codesearch, or a different mechanism is now used.
| Effect.fn("BackgroundJob.state")(function* () { | ||
| return { | ||
| jobs: yield* SynchronizedRef.make(new Map()), | ||
| scope: yield* Scope.Scope, |
There was a problem hiding this comment.
SUGGESTION: Scope.Scope is acquired from InstanceState.make context but the State type stores it as a plain Scope.Scope reference
The scope in State is obtained via yield* Scope.Scope inside InstanceState.make's init callback. This scope is the ScopedCache entry scope — forking jobs into it means they are tied to the cache entry's lifetime (i.e. invalidated when the instance is removed). That looks intentional for cleanup, but note that jobs are forked with Effect.forkIn(s.scope) which means the scope must still be open when the job starts. If InstanceState.invalidate closes the scope before all forked fibers are interrupted, there could be a brief window where new start() calls race against scope teardown.
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Previously Flagged Issues — All Resolved
Incremental Changes Reviewed (commit b2798ef)Session patch preservation fixThe single new commit (
Files Reviewed (incremental — 8 files)
Reviewed by claude-4.6-sonnet-20260217 · 896,532 tokens Review guidance: REVIEW.md from base branch |
Provider inventory auditCompared the Kilo provider stack immediately before the upstream merge ( Summary
Provider-by-provider implementation comparisonThe following table covers every provider-specific plugin in the new v2 stack. “Generic” means the provider already existed in the models.dev catalog and used the shared AI SDK path before this PR.
Additions and removals
Bundled fallback snapshot caveatThe new checked-in
They are still returned by the live models.dev API and remain loadable through the dynamic provider path, so this is snapshot staleness rather than an online provider removal. It does mean those providers are unavailable when Kilo must fall back entirely to the bundled snapshot. ConclusionNo provider was removed from the normal online Kilo provider catalog by this merge. The main changes are the parallel v2 plugin architecture and new DigitalOcean OAuth/router support. The two follow-ups worth tracking are refreshing the bundled fallback snapshot and deciding whether Apertis and GitHub Copilot Enterprise need first-class v2 catalog support before clients move fully to the v2 provider API. |
Merge decision recordThis PR is the cumulative OpenCode The merge touched 802 upstream files. Automation and rerere reduced 130 initial conflicts to 90 manual conflicts. The general resolution rule was the same as the previous merge: adopt upstream architecture and bug fixes, preserve Kilo product behavior through Kilo-owned code or the narrowest possible marked hook, and skip upstream products and infrastructure that do not exist in the Kilo monorepo. Scope decisions made before manual resolution
Manual conflict resolutions by domain
Post-conflict regressions found and correctedThe textual conflict pass was not sufficient for this merge. Cross-package typechecking, runtime tests, and manual product checks found several semantic breaks that were fixed before the branch was considered integrated:
Later
|
…opencode-v1.14.51 OpenCode v1.14.51
1.14.49
Core
Improvements
opencode.jsoncautomatically when no config existscustomize-opencodeby default with a linked full schemaBugfixes
TUI
Improvements
Bugfixes
runexit behaviorrun --jsonoutput drainingDesktop
Improvements
Bugfixes
1.14.50
Core
Bugfixes
small_modelvalues to fall back cleanlyTUI
Improvements
SDK
Improvements
instance.directoryandinstance.workspacequery support to v2 model and provider calls1.14.51
Core
Improvements
Bugfixes
TUI
Bugfixes
Desktop
Improvements
Bugfixes
Extensions
Bugfixes