## What Add an opt-in V2 TUI experiment that remembers the reading position of each open session tab and provides a direct return to the latest transcript content. Enable **Remember tab scroll** from the DevTools **Experiments** dialog. ## Before / After **Before:** Switching away from a session tab unmounted its transcript. Returning always snapped to the b
### Issue for this PR Closes #28150 ### Type of change - [x] Bug fix ### What does this PR do? **Issue:** Granular read permission deny rules don't block file access. When a user configures `{ read: { "*.env": "deny", "*": "allow" } }`, the deny rule is bypassed for paths like `src/.env`. **Root cause:** Wildcard `*` was converted to regex `.*`, which matche
### Issue for this PR Closes #36374 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Avoids adding a dangling comma when `$schema` is inserted into an empty config object. The comma is now included only when the parsed config already has keys, so `{}` remains valid strict JSON
### Issue for this PR Closes #36417 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Removes the temporary `sidebarOpen` override from the TUI session view. Sidebar visibility is now controlled by the persisted `auto` or `hide` setting and the existing terminal-width check, so
### Issue for this PR Closes #36456 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Makes right-click dispatch the existing `prompt.paste` command when mouse capture is enabled and the prompt is focused. This supports clipboard text and images while preserving the experimental
### Issue for this PR Closes #36489 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? PR #9591 fixed a text rendering bug where `direction: rtl` + `text-overflow: ellipsis` on paths starting with a leading dot (e.g. `.config/opencode/`) causes the dot to be misplaced by the Unic
### Issue for this PR Closes #4714 ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Adds interactive incremental search over the current session transcript — readline/less-style rather than a modal prompt. Press `ctrl+r` and a search bar attaches to the top of the prompt input:
### Issue for this PR Closes #30197 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The node server bundle that the desktop app ships as its sidecar is built by `script/build-node.ts`, which defines `OPENCODE_CHANNEL` but not `OPENCODE_VERSION` (the CLI build in `script/build.
### Issue for this PR Closes #36558 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? `Process.stop()` in `packages/opencode/src/util/process.ts` only sent `proc.kill()` (SIGTERM) with no timeout or SIGKILL fallback. When an LSP server ignores SIGTERM (e.g. rust-analyzer, clangd
## Summary - rename desktop menu navigation to Previous Tab and Next Tab - traverse tab selection history instead of visual tab order - skip closed tabs and duplicate entries for the active tab ## Testing - bun test --preload ./happydom.ts ./src/desktop-menu.test.ts ./src/context/tab-history.test.ts ./src/context/tabs.test.ts - bun typecheck - pre-push works
### Issue for this PR Closes #38277 ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? This PR adds a toggle button to switch between the plan/build modes. It only shows as toggle button when there are exactly 2 options, in all other cases it will fallback to the dropdown behavio
### Issue for this PR Related to #39740. Session cost is already visible in the sidebar Context section, but users also need an optional total for all sessions updated today without running `opencode stats --days 1`. ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Adds an opti
### Issue for this PR Closes #37580 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? A model endpoint can return headers and then stop sending body data. OpenCode waits forever in that state, so a stalled child can pin a parent session. This adds a provider-neutral idle watchdo
### Issue for this PR Closes #18134 ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Clicking X on the desktop app used to quit it entirely, which killed any running agent work. This makes the window hide to the system tray instead on Windows/Linux. Tray menu has Show/Quit, cli
### Issue for this PR ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Adds a Run button to the titlebar that executes the project startup command. The button appears only when a project has a startup command configured in its settings. ### How did you verify your code works? R
### Issue for this PR Closes #41628 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Fresh ACP sessions retained the configured default model but not the matching default agent variant, so initial effort fell back to the first available variant. This carries the variant in the
### Issue for this PR Closes #21960 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Follow-up to #41939, which added the fixed `RETRY_MAX_RETRIES = 5` cap. That default is right for most cases, but the retry budget users want differs per provider (an aggressive retry loop agai
### Issue for this PR Closes #41753 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? **Problem.** When the assistant is mid-task and calls the bash tool with a long-running command (e.g. `sleep 30`), submitting a new prompt is not handled until the command finishes. The new pro
## Summary Audit of the app UI against SolidJS best practices ([reference](https://www.brenelz.com/posts/solid-js-best-practices/)), with fixes across `packages/app`, `packages/ui`, and `packages/session-ui`. ### Pass values to JSX props, not signal accessors Components received `Accessor<T>` / `() => T` props and called them internally. JSX props compile to
Fixes #41454. ## Problem When a user attaches an image, PDF, or other binary file in the TUI (or the Web app) the part is sent to the model as a Vercel AI SDK `file` part with only the basename and the data URL. The on-disk path is kept in `FilePartSource` for UI metadata but is never threaded through to the model context, so the agent cannot reference the f
Reason: MiniMax image generation is not available as an executable tool on the default branch. ## Summary - add the canonical `minimax_image_generation` built-in tool with permission checks and credential-safe failures - support the global and China image endpoints, both current image models, and the documented text-to-image request controls - return generat
### Issue for this PR Closes #41996 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? When opencode spawns MCP servers in parallel (`concurrency: "unbounded"` in `packages/opencode/src/mcp/index.ts`), transient races — e.g. `bun x` cache contention while many subprocesses resolv
### Type of change - [x] Bug fix (docs grammar) - [ ] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? Fixes two English grammar mistakes in the docs: 1. `packages/web/src/content/docs/sdk.mdx` — "specifying an `format`" → "specifying a `format`" (`format` starts with a consonant, so "a" is correct). 2. `packages/we
Adds [@oyadotai/opencode-plugin](https://www.npmjs.com/package/@oyadotai/opencode-plugin) to the plugins table on the ecosystem page. The plugin lets OpenCode build, deploy, and manage [Oya](https://getoya.ai) AI agents via the Oya MCP server: create agents with skills and scheduled routines, deploy them to a sandboxed cloud runtime, connect gateways (Slack,
### Issue for this PR Refs #42026 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Skips plugin tool definitions whose `description` field is not a string before they enter the tool registry. The file-scanned tool path already guarded malformed exports with `isPluginTool(...)`,
### Issue for this PR Closes #42097 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? On Linux, closing the desktop app could terminate the Electron NodeService utility process with SIGABRT while local server cleanup was still running. That could trigger systemd-coredump and con
## Summary - Adds `packages/opencode/src/acp/elicitation.ts` — a handler (modelled on `permission.ts`) that translates the `question` tool part into an `unstable_createElicitation` ACP request and maps the client response back to `sdk.question.reply/reject` - Wires the handler into `ACPEvent.Subscription.handleToolPart` — when `toolName === "question"` and t
### Issue for this PR Closes # ### Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Please provide a description of the issue, the changes you made to fix it, and why they work. It is expected that you understand why your changes work and if you do not understand why at least say a
### Issue for this PR Closes #42116 ### Type of change - [ x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Catch errors related from invalid values in OPENCODE_CONFIG_DIR / OPENCODE_CONFIG, report error instead of printing stack trace (bun dev)/unexpecter error (opencode binary) ### How did you ver
### Issue for this PR Closes #42170 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Desktop crashed on session load with `Error: no such column: project_id` in `Project.migrateProjectId`. Some builds replaced the `workspace` table with a provider/binding schema and dropped `pr
## Summary - migrate Desktop WSL servers from opencode to opencode2 - require the WSL CLI version to match the Desktop server version exactly - use the official V2 installer with --version for releases - build the Linux CLI only when a local WSL install is requested, then install it with --binary - simplify the WSL controller around the normal user flow ## V
## Bug Clipboard helper processes spawned by `packages/tui/src/clipboard.ts` (e.g. `wl-copy` on Wayland) inherited opencode's process group. `wl-copy` forks into the background to keep serving the clipboard selection after the initiating process exits — but since it shares opencode's pgid, sending `Ctrl-Z` to the terminal delivers `SIGTSTP` to the whole fore
### Issue for this PR Closes # ### Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Please provide a description of the issue, the changes you made to fix it, and why they work. It is expected that you understand why your changes work and if you do not understand why at least say a
### 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 #42258 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Custom tool files (`.opencode/tool/*.{js,ts}`) are dynamically imported when building the tool registry. If one file throws on import (e.g. its `@opencode-ai/plugin` dependency couldn't be inst
### Issue for this PR Closes #41526 ### Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? PR adds mention of Apify Open Code plugin to documentation in all the languages. Plugin lives here: https://github.com/apify/apify-opencode-plugin. Changes are simple docs update without any co
### Issue for this PR Fixes #42276 and #28966 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The SDK's `client.config.update` (PATCH `/config`) returned 200 but the mutation was silently lost: a follow-up GET returned the original config and the file on disk was untouched. Up
Fixes #40747 — `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 provider's `retry-after`, which for a monthly limit is days. While the schedule sleeps, `halt()` never runs, so no `session.error` and no `idle` are publishe
### Issue for this PR Closes #41399 ### Type of change - [x] Bug fix ### What does this PR do? The Review / Files Changed panel in a session shows the full working-tree diff of the project directory. The working tree is shared by every session in the same folder, so a clean session B displays files that a concurrent session A is actively writing (#41399, #40
Clarified the global config path to include both JSON and JSONC formats. ### Issue for this PR Closes #32717 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Fixes an issue where AI agents almost always miss out on looking for opencode.jsonc file and assumes the global config f
## What Add an opt-in TUI experiment for preserving reading position across visible quick-slot tabs and returning to the latest transcript content. Run it with: ```sh OPENCODE_EXPERIMENTAL_TAB_SCROLL=1 bun dev ``` When a visible tab is scrolled away from the bottom, switching away remembers its offset. Returning restores that reading position and shows a cli
## What When the managed background service exits before registering, the CLI now explains what happened and what to do next instead of dumping a raw Effect error and bundled stack frames. **1. The background service does not register** OpenCode starts its normal managed-service flow, but the child exits before creating its registration. ```text Starting bac
## Summary - track normal TUI prompt submissions for a two-second quick-undo window - make the second Escape abort and revert the exact submitted message - restore the prompt through the existing session revert flow and keep input focus ## Verification - `bun test src/component/prompt/quick-undo.test.ts` - `bun run typecheck` - `bun x prettier --check src/co
### Issue for this PR Closes #35831 ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? This PR completes the Portuguese (Brazil) translation for OpenCode by adding all missing keys in both: - \packages/ui/src/i18n/br.ts\ (added 23 missing UI strings) - \packages/app/src/i18n/br.t
### Issue for this PR Closes #36494 ### Type of change - [x] New feature ### What does this PR do? Adds a new agent config field `hiddenFromCycle` (`hidden_from_cycle` in markdown frontmatter) that hides agents from tab/shift+tab rotation while keeping them visible and selectable via `/agents`. Previously `hidden` controlled both. **What changed:** - V1/V2 c
### Issue for this PR Closes #36382 Closes #30517 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The `QuestionPrompt` component has two `useBindings` calls with mutually exclusive `enabled` conditions: - Editing bindings: `enabled: store.editing && !confirm()` - List bindings
## Summary - add `keep: "head" | "tail"` to shell output pagination, defaulting to `head` - have ShellTool keep the final capture window without reaching into Shell backing storage - add a regression test proving the tail marker remains, the head marker is omitted, and the saved-output notice remains - regenerate current client surfaces for the query option
## Summary - Session title generation now prefers `Catalog.model.small(provider)` when the title agent has no explicit model - Falls back to the session model if no small model is available or resolution fails - Agent-configured title model still wins over both ## Test plan - [x] `bun test test/session-title.test.ts` in `packages/core` - [x] `bun typecheck`
## What Large sessions no longer become permanently wedged when their model context fits but the serialized inference request exceeds the service's 10 MiB body limit. Before, auto-compaction only considered model token pressure. A session at roughly 240k of a 1M-token context could therefore skip compaction and receive HTTP 413 forever. Compaction itself cou