### Issue for this PR Closes #42221 Also addresses #41562 ### Type of change - [x] Bug fix ### What does this PR do? `opencode -c` in a directory with no prior sessions showed an old directory instead of the current one. Two issues caused this: 1. **SDK `pick()` didn't fall back to `config.directory`** — When the `x-opencode-directory` header was missing fro
## What Render `session.composer.top` above the complete composer stack instead of between the queued-prompt rail and prompt. This keeps additions such as session recaps above the composer as a whole, while the queued rail remains visually attached to the prompt it belongs to. ## Before / After **Before** The top slot split the two composer-owned sections. `
## What Preserve the typed `WorkspaceDriver.ProviderNotFound` contract for every unregistered provider name after removing the built-in Modal workspace driver in #42142. ## Before / After **Before:** the registry read `drivers[provider]` directly. Names inherited from `Object.prototype`, such as `constructor`, `toString`, and `__proto__`, resolved to unrelat
## What Replace V2 Core webfetch's Turndown/Domino HTML-to-Markdown conversion with a purpose-built `htmlparser2` event renderer. The renderer preserves model-readable document structure without constructing a browser DOM and removes Core's `turndown`, `@mixmark-io/domino`, and `@types/turndown` closure. | Measurement | Before | After | Change | | --- | ---:
### Issue for this PR Closes #40214 ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Adds `strict?: boolean` to the tool definition and the `tool.definition` plugin hook, passed to the AI SDK `Tool` only when a tool sets it. Today `session/llm/request.ts` forces `strict: false`
### Issue for this PR N/A — feat PR (feature PRs skip issue requirement per contributing guidelines) ### Type of change - [x] New feature ### What does this PR do? Completes the GitGraph feature landed in #42179: the parser currently rejects `cherry-pick` with "Cherry-pick is not supported". This PR implements cherry-pick per Mermaid semantics: - `cherry-pic
## Summary - order the resolved default agent first in agent list responses - preserve the existing order of all remaining agents - cover configured-default ordering in the core agent service ## Checks - `bun test test/agent.test.ts` (packages/core) - `bun typecheck` (packages/core) Requested by: @thdxr (Dax Raad via Slack)
### Issue for this PR Closes #41849 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? **Problem:** When two identical permission requests (same `sessionID`, `permission`, and `patterns`) arrive within the same second, each creates an independent pending prompt. The user has to a
### Issue for this PR Closes #42246 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? V2 generated a stable session cache key but only passed it through the OpenAI provider namespace. This meant OpenRouter did not receive the key its route already supports, while native OpenAI C
### Issue for this PR Closes #42259 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Two related problems in how session outcomes reach the UI: 1. **Session run defects were silently dropped.** When a session run failed with an unexpected defect, no error reached the UI — the s
## Summary - consolidate server-scoped SDK, sync, notification, permission, and model state behind keyed server contexts - simplify desktop route and provider composition while preserving reactive session and directory changes - update app and desktop consumers to use the unified server data architecture and remove obsolete legacy layers ## Verification - `b
fix(tui): align skill descriptions with wide characters ### Issue for this PR https://github.com/anomalyco/opencode/issues/40605 Closes #40605 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? When a skill's name contains wide characters (e.g. CJK), the `/skills`dialog padded ti
### Issue for this PR Closes #42277 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? `tail()` walks the output lines backwards and, when even the last line on its own exceeds `max_bytes`, byte-slices that line so the model still gets a tail. The fallback is guarded by `out.leng
### Issue for this PR Closes #42280 ### Type of change - [x] Bug fix ### What does this PR do? `ConfigExternalPlugin` loads plugins in a `forkScoped` fiber, which inherits the ambient `State` batch. Startup wraps loading in `State.batch(...)`, so once the startup effect returns, the batch is drained and gone — but the async plugin load finishes later, and it
### Issue for this PR Closes #42282 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? `filterCompacted` decides "this compaction is complete" twice, with two different tests. The truncation loop requires `summary && finish && !error`; the reordering branch underneath only checks
### Issue for this PR Closes #42286 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? When a persisted `task` call outlives its in-memory session runner, abort now marks the stale task part and its parent assistant message as aborted instead of leaving both unfinished. It also a
### Issue for this PR Fixes #42335 Related to #37037 / #36210 (caret jumps around in the prompt input while the session updates). This PR fixes the variant I could reproduce and verify on the current v2 composer: inserting a @mention mid-text on the **session page** collapses the caret to the END of the prompt instead of keeping it right after the mention. I
### Issue for this PR Closes #42308 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Config is loaded by substituting `{env:...}` / `{file:...}` first and parsing the result, so when parsing fails `jsonc()` quotes back the substituted text - the one that has the real values in
### Issue for this PR Closes # ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Updates the desktop composer dropzone to use a 0.5px focus-token outline with 3px dashes and a 5% accent background in both themes. The outline is rendered in an absolute overlay to avoid changing t
## Summary - replace hand-written install tabs with Blume's formatter-safe `CodeGroup` - combine npm, bun, pnpm, Yarn, and curl into one install selector with npm first - keep package manager labels separate from the `bash` syntax language - prevent the repository generation/formatting workflow from collapsing fences and reintroducing `bash` as command text
## Summary - remove Ling-3.0-tiny Free from Zen model and pricing tables - remove its promotional availability and data-use notes across all localized Zen docs ## Verification - `bun run build` in `packages/web` - repository pre-push typecheck - `git diff --check`
### Issue for this PR Closes #42237 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Snapshot capture now recovers an invalid private Git index after a failed capture. Recovery is restricted to OpenCode snapshot storage, replaces only the index from the source repository, and r
### Issue for this PR ### Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? - I translated the `references.mdx` page into Italian. ### How did you verify your code works? - in packages/web run `bun run build` - repository pre-push typecheck ### Checklist - [x] I have tested my chang
### Issue for this PR Closes #42324 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? In multi-step tool-call messages, `processor.ts` overwrites `assistantMessage.tokens` on every `step-finish` event, so only the last step's output, reasoning, and cache.write survive — while `c
### Issue for this PR Closes #42265 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Direct visits to `/:dir/session` in the new layout created a draft without adding the directory to the current server's project state. Register and touch the directory before creating the draft
### Issue for this PR Closes #42232 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The titlebar update pill used a fixed 68px expanded width, leaving excess space around short translations such as Chinese and constraining longer labels. Size the expanded pill from its label's
### Issue for this PR Fixes #31137 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? V2 Settings already receives a session ID for active sessions, but draft and directory-backed new-session routes have no session ID even though the layout knows their active directory. That leav
## Summary - show a differing shell working directory as a display-only `cd <path> &&` prefix - keep the running spinner and completed `$` prompt in the same command slot - render the full shell invocation as one wrapping text flow instead of narrow prompt and command columns ## Checks - `bun typecheck` (`packages/tui`) - `bun test test/mini/entry.body.test.
### Issue for this PR Closes #40747 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? `opencode run` produces no output and never returns when a model's quota is exhausted. It isn't wedged, it's sleeping. The quota error is classified as retryable, and `delay()` honors the provi
## What Keep truncated session tab titles stationary and disclose the full title in a delayed hover tooltip instead of scrolling it as a marquee. The tooltip appears only when the title exceeds its available cells, stays within the terminal bounds, and works in both the vertical session rail and horizontal tab strip. ## Before / After **Before:** Hovering a
## What Smoothly transition every visual state in the vertical session sidebar. Selecting an unread tab now eases its background, text, shortcut number, unread glow, and separator hue back to the active/read state instead of snapping between colors. ## Before / After **Before:** selecting an unread or failed tab cleared its unread state immediately. The puls
## What Prevent disabled tab pulses from keeping the OpenTUI renderer live after their session becomes active. Enabled running sweeps, breathing, flashes, and completion animations are unchanged. ## Before / After **Before** 1. A tab pulse mounted with animations disabled. 2. Its session later transitioned to active. 3. `PulseState.live` returned `true` from
## Summary - update `ai-gateway-provider` from 3.1.2 to 3.2.0 in both `packages/core` and `packages/opencode` - refresh the lockfile, including the provider's updated optional AI SDK integrations - remain on the AI SDK 6-compatible provider line; 4.x requires AI SDK 7 ## Upstream changes 3.2.0 adds: - `byokAlias` and `zdr` universal-endpoint options - curren
## What Keep the ripgrep-backed filename index fresh without restoring a recursive project filesystem watch. Fallback file search now serves its current index immediately and starts at most one background refresh when the last completed scan is 10 seconds old. A completed refresh atomically replaces the prior index. ## Before / After **Before** The fallback
## What Replace Core's tree-sitter Bash and PowerShell permission parsing with a dependency-free, fail-closed scanner. This removes the tree-sitter runtime, grammar packages, WASM assets, asset staging, and parser environment variables used by Core shell-permission parsing. The scanner is 10.5 KB minified / 3.8 KB gzip and is bundled into published Core arti
### Issue for this PR Closes # ### Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? [Opencode Obvious Grid](https://github.com/ray062/opencode-obvious-grid) Adds opencode-obvious-grid to the Plugins table — a self-contained very visible and bold status-page plugin (aggregate view o
## What Add automatic provider selection and failover for V2 web search. Users can configure `websearch.provider` as `"auto"`, or select **Allow web search** on first use. Each search snapshots the currently registered providers, shuffles them once, and tries each provider at most once until one succeeds. Fixed provider selections and explicit request provid
### Issue for this PR Fixes/Closes #15033 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Makes missing `{file:...}` config variables resolve to an empty string instead of failing opencode start when file is not present. Existing file references are still read normally, and no
## What Prevent oversized Ripgrep line previews from persisting half of a Unicode character. A malformed preview could display as `�` and poison subsequent provider requests. ## Before / After **Before** A grep match longer than 2,000 JavaScript string units could place an emoji across the preview boundary. `slice(0, 2_000)` retained only the emoji's first U
### Issue for this PR Closes #38338 Rebase of #38345 by @razzeee onto current `dev`, opened with their permission (https://github.com/anomalyco/opencode/pull/38345#issuecomment-5280628324). Original commit and authorship preserved. ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR d
## What Make unsent prompt drafts belong to the tab where they were written. Session tabs and the home tab now restore only their own drafts, with no experiment toggle required. The experiment framework remains available in DevTools for future flags. Its registry is currently empty, so the Experiments pane shows an explicit `No experiments available` state w
## What Keep OpenCode Drive responsive when the TUI has no focused renderable. Drive currently hangs on its first `ui.state` request for full-screen plugin routes such as Storybook. The state object includes `focused.renderable: undefined`, which cannot be encoded as JSON. Encoding defects the control-server response fiber, so the client waits until its 30-s
## Summary - ignore `ELECTRON_RENDERER_URL` in packaged desktop applications - use one guarded parser for both renderer loading and trusted-origin checks - preserve the override for local Electron development - cover development, packaged, and invalid URL behavior ## Why The packaged app previously honored an environment-provided renderer URL and then treate
## Summary - document Grok 4.5 on OpenCode Go using the Responses API endpoint - update the corresponding AI SDK package to `@ai-sdk/openai` ## Checks - `git diff --check` Relates to #40206 Requested by: @rekram1-node (Aiden Cline via Slack)
## What Restore `Ctrl+D` shell termination from the TUI composer Shell tab when a global binding also recognizes the key. ## Before / After **Before:** The Shell tab rendered `kill ctrl+d`, but the key could be consumed before `composer.shell.kill`, so no `DELETE /api/shell/:id` request was sent and the background process continued running. **After:** While
### Issue for this PR No issue filed; small UX addition to the existing context usage indicator. ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The context usage indicator (progress circle shown in the session header and message timeline) already shows cost, context usage % a
## Summary - update the Grok 4.5 Go endpoint to the Responses API - use the matching `@ai-sdk/openai` package - keep all localized Go docs in sync ## Testing - `git diff --check origin/dev...HEAD` - `bun turbo typecheck` (pre-push hook)
### Issue for this PR Closes #41817 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Plugin load errors are only published as a `Session.Event.Error` in `publishPluginError` (`packages/opencode/src/plugin/index.ts`). The desktop renderer does not consume that event, so a plugin