### Issue for this PR Closes #38235 Closes #37764 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? While running `opencode serve`, I got a session whose directory ended with two U+FFFD replacement characters: `.../bin/��`. The file picker rejected that path, and `prompt_async`
### Issue for this PR Closes #38338 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The Open Project dialog immediately resolved and closed when clicking a suggestion or pressing Enter, making it impossible to navigate into a subdirectory and continue. There was also no explic
### Issue for this PR Closes #19401 ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Adds a `spinner_verbs` config option to `.opencode/tui.json` that lets users customize the verb text shown next to the spinner while the model is thinking, matching a feature available in simil
## TL;DR This is the reduced v2-only performance series. The rebase removed all dev-era legacy-layout, compatibility-client, Home-worker, locale, and profiler changes that do not apply to `v2`. | Area | v2 baseline | PR behavior | | --- | --- | --- | | Session route loading | Session page is in the initial route graph | Canonical session route is a lazy rout
### 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
### Issue for this PR Closes #41868 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Merge Gateway models can declare reasoning effort choices through models.dev, but OpenCode did not recognize the adapter's `mergeGateway` provider-options key. As a result, reasoning variants w
## Server sync is a lifecycle, not a fetch The visible failures looked unrelated: - A model dialog opened with no models. - The provider dialog showed only the custom OpenAI-compatible entry. - The agent dropdown vanished after a project swap and never came back. - A missing Session escaped the Session route and reached the renderer error boundary. - A recon
Restores the composer agent selector (build/plan) when only built-in agents are present, and makes existing Linux/macOS desktop installs eligible to opt back into the previous dashboard. - app: `isAgentsVisible` shows the selector whenever more than one selectable agent exists (matches the legacy composer). - desktop: old-layout eligibility now also checks t
### Issue for this PR Closes #42042 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? useSettingsDialog drops subsequent open attempts if the component unmounts or re-renders once, because onCleanup permanently sets dead = true. This removes the dead check so settings.open works
### Issue for this PR Closes #42060 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? A key bound to `app.toggle.session_directory_filter` does nothing inside the session picker, which is where the toggle matters. It works on the main screen, so it looks intermittent. Cause: the
## Problem Auto-approve permission mode can be reached three ways today: - CLI flags at launch: `--auto`, `--yolo`, `--dangerously-skip-permissions` - the `permission.mode` command in the command palette - programmatically, via `toggle()` on the permission context What is missing is a keybind. `Definitions` in `packages/tui/src/config/keybind.ts` has no `per
### Issue for this PR Closes #42234 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Exits before starting the TUI when stdin is non-interactive, reaches EOF, and no prompt was provided. This prevents OpenCode from holding an active exec session indefinitely and blocking auto-s
## What Add a persistent recovery surface when a session's location cannot initialize. The transcript remains readable, the durable model identity remains visible in existing message chrome, and the normal composer is replaced with a focused `Choose directory` action using the same question-panel pattern as permissions. ## Before / After **Before** 1. A sess
### Issue for this PR Closes #33585 ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Adds an opt-in "auto mode" classifier that gates the *would-auto-approve* path in `Permission.ask`. When a rule resolves to `allow`, a model is consulted first; it can allow (proceed silently),
## Summary - standardize TooltipV2 hover delay at 400ms across the new layout - add an intent-delay mode for V2 model-picker details: 1s for the first tooltip, instant while moving directly between models, and reset after leaving - apply intent delay to paid and unpaid V2 model pickers used by session and new-session composers - isolate V2 model-preview warm
### Issue for this PR Closes #30609 This replaces #30636, which was closed by automated cleanup. I rebased the change on the current `dev` branch and updated the indexes to match the queries now used by session lists. ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Session lis
### Issue for this PR Closes #41698 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? A synthetic 986-message session now forks in **625 ms instead of 4.3 s** — **6.8× faster**. Forks publish and project cloned events in 3,000-event batches, while source messages are read in 1,0
## What Surface failed MCP servers and TUI plugins directly from the new-session screen, with `/mcps` and `/plugins` as direct paths to full diagnostics. Failed rows open one shared error-details view with scrolling and copy support. A failed hot reload that keeps the previous plugin version running remains toggleable, so diagnostics do not remove the user's
The compiled Bun CLI dies from unhandled EPIPE errors in two distinct ways, and both are fatal for the background service. 1. Stdio pipes: when the consumer of the service's stdout/stderr goes away while the server keeps logging, the next write raises EPIPE. The Node wrapper guarded stdout only; the Bun-compiled binary that the desktop stages had no guard, a
### Issue for this PR Closes # ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? This thing provides the ability to use microphone and your voice to talk with AI agents using web version ### How did you verify your code works? Manual testing. ### Screenshots / recordings <img wi
### Issue for this PR Closes #42010 ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? Allows the existing `version` option in `Service.discover()` and `Service.ensure()` to accept npm semver ranges as well as exact values. ```ts await Service.ensure({ version: ">=2.0.0 <3.0.0" }
### Issue for this PR Fixes #42032 ### Type of change - [x] Bug fix (docs typo) - [ ] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? Fixes two typos in the docs: 1. `packages/web/src/content/docs/providers.mdx:2490` and `:2528` — `"My AI ProviderDisplay Name"` → `"My AI Provider Display Name"` (missing space in th
## Summary - route Muse-family model IDs through the Meta system prompt - render the correct Muse Spark or Muse Glimmer name in identity and feedback text - cover both model families and verify no template placeholder reaches the final prompt ## Tests - `bun test test/plugin/system-prompt.test.ts` - `bun typecheck` Requested by: @rekram1-node (Aiden Cline vi
### Type of change - [x] Bug fix (docs: dead links) - [ ] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? Fixes two broken (404) links in the docs: 1. `packages/web/src/content/docs/providers.mdx` — the DigitalOcean "Inference Routers" link pointed to `docs.digitalocean.com/products/genai-platform/concepts/inferenc
## Summary - record the shell execution status in tool result metadata - render the `Background` badge only when the shell explicitly reports a detached running state - keep interrupted and failed foreground shells from being mislabeled as background work ## Testing - `bun test test/tool-shell.test.ts` (`packages/core`) - `bun typecheck` (`packages/core`) -
Add commandDisplay field to shell tool that splits &&-chained commands with backslash continuations for readable display in the session view and permission prompt. ### Issue for this PR N/A ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Long-chained shell commands quickly bec
## What Smooth session tab marquees across pointer movement, looping, and hover exit. - Moving the pointer across child renderables inside one tab no longer restarts the marquee delay or resets its offset. - Repeated titles are separated by exactly ` · `. - Leaving a scrolling tab keeps the title moving forward until the next natural beginning, then settles
## What Add section-level keyboard navigation to the Open menu: - `Option+Down` selects the first item in the next visible section. - `Option+Up` selects the first item in the previous visible section. - Navigation wraps between Sessions and Projects. - If filtering leaves one visible section, the selection remains in that section. ## How - `packages/tui/src
## Summary - apply the user-message surface background to the outer transcript message container - extend the same background behind image previews without changing tool-result image styling or message interactions ## Validation - `bun typecheck` (`packages/tui`) - `bun test` (`packages/tui`): 678 passed, 5 skipped - real TUI before/after at 100×32 with the
## What Keep transcript image preview rows at the same full height used by composer image previews. ## Before / After **Before:** The transcript image container could collapse inside the scrolling timeline, so an image submitted from the composer appeared shorter in message history. **After:** The transcript preview row explicitly reserves the calculated ima
## What Restore the V2 TUI keybind defaults that were unintentionally overwritten or omitted by the command-ID migration in #41882: - `Option+Up` / `Option+Down` switch to the previous / next open tab. - `Option+Shift+Up` / `Option+Shift+Down` switch to the previous / next unread tab. - `Ctrl+0` and `<leader>0` select the tenth tab. - `Ctrl+O` opens the rece
## What Generate a new root session's title as soon as its first admitted prompt becomes visible, instead of waiting for the first model step and its tool calls to finish. This restores the responsive title behavior from V1 while preserving V2's durable prompt admission boundary: queued input does not trigger title generation until it is promoted. ## Before
Adds [opencode-stream-rules](https://github.com/jiesou/opencode-stream-rules) to the ecosystem plugins table. It's a just-in-time rule injection plugin: rules stay dormant and are surfaced (via a SYSTEM NOTICE or a tool-call rejection) only when the agent is about to break one, keeping the system prompt clean. Inspired by oh-my-pi's time-traveling stream rul
## What Keep exact-fit session tab titles stationary and free of overflow fades when hover reveals the close button. ## Before / After **Before** A title that exactly filled its resting tab width became one or two cells too wide only because hover reserved space for `×`. That activated the marquee and its leading-edge fade, producing a dark mass at the front
Context: when using Bedrock with a Gateway such as LiteLLM, we see rejection errors from the Bedrock mantle. A fix for now is to create a plugin such as: ```ts // In plugins/gateway-compat.ts import type { Plugin } from "@opencode-ai/plugin" /** * gateway-compat: strip parameters the Contentful AI Gateway (LiteLLM) rejects. * * OpenCode auto-adds `textVerbos
### Issue for this PR Closes #42007 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The nested OpenAI Responses SSE error handling from #36130 (commit bd0dffd) is missing from `dev`. The fix was merged to `v2` but lost during the branch transition — `git merge-base --is-ancest
## Summary Wrap the `bun script/github/close-prs.ts` invocation in `.github/workflows/close-prs.yml` so a non-zero exit code emits a `::warning::` annotation visible in the run log. Fixes #42157 ## Problem When the close-prs bun script fails (GraphQL pagination error, token-scope error, unhandled exception), the workflow step fails silently — the error is bu
### Issue for this PR Closes #42070 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? When the session processor halts due to an error that isn't a ContextOverflow (e.g. an API error from the model), the assistant message gets `error` set but `finish` stays undefined. The prompt
### Issue for this PR Closes #41841 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? `opencode run --session <id> --dir <path>` can load a second InstanceContext via server middleware when the session's original directory differs from `--dir`. The CLI's finally block was callin
### Issue for this PR Closes #41973 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The v2 config loading path in `packages/core/src/config.ts` reads config files and parses them as JSONC without applying `{file:}` and `{env:}` variable substitution. The v1 path in `packages/o
## What Fixes the `tools[N].function: missing field "name"` 400 that Codex hits on `/v1/responses` (OpenCode Go / Zen) when the upstream model speaks chat completions instead of native Responses (e.g. `deepseek-v4-pro`). ## Why Codex always sends a `web_search` tool on `/v1/responses`: ```json {"type":"web_search","external_web_access":true} ``` It has no `n
### Issue for this PR Closes #41983 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? On Windows, a configured PowerShell `.cmd` or `.bat` wrapper passes through `cmd.exe`, which treats newlines in a `-Command` argument as command separators. Only the first line can reach PowerS
### Issue for this PR Fixes #41806 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? `ChildProcessHandle.exitCode` was settled from Node's `close` event, which waits for stdio to close after the direct child exits. A descendant that inherits one of those pipes can therefore keep
### Issue for this PR Closes #41738 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Anthropic signs `thinking`/`redacted_thinking` reasoning blocks and rejects any modification to the assistant message that contains them. Empty text parts (`""`) can appear as structural separa
### Issue for this PR Closes #42224 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Large tool arguments can end in an unterminated JSON string when generation stops before the model emits the closing syntax. The resulting parser error does not explain the likely cause or how
### Issue for this PR Fixes #41730 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? When `opencode run` spawns a subagent, permission requests belong to the child session. Filtering only for the root session leaves that subagent waiting forever. The run event loop now accepts p
### Issue for this PR Fixes #42238 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? When auto-compaction occurs, `opencode run --format json` emits internal compaction output (summaries, step events, reasoning) as ordinary JSONL events. Consumers cannot distinguish these from u
### Issue for this PR Fixes #42125 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The model does not know which agent it is running as because the agent identity is not included in the system prompt. The `<env>` block already contains model ID, working directory, platform, an