## Summary - define V2 keybinds directly by canonical command ID while keeping the legacy plugin shim on V1 - migrate fresh and existing CLI config keybinds with canonical precedence, duplicate-value preservation, JSONC preservation, and serialized config access - wire app, composer, diff viewer, dialog, and mini commands through resolved V2 bindings - prese
## Summary - consume the organization selected during Console device approval - persist the returned `org_id` instead of choosing the alphabetically first organization - fail login if the selected organization is no longer available Depends on anomalyco/opencode-console#953. Fixes #37161. ## Tests - `bun typecheck` (`packages/core`) - `bun test test/plugin/p
### Issue for this PR Closes #38066 ### Type of change - [x] Bug fix ### What does this PR do? `SessionReminders.apply` (packages/opencode/src/session/reminders.ts) decides whether to inject the "operational mode has changed from plan to build" reminder using: ```ts const wasPlan = input.messages.some((msg) => msg.info.role === "assistant" && msg.info.agent
### Issue for this PR Closes #38674 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? In Safari, typing CJK text in the web app prompt input misbehaves in two ways: the IME composition gets aborted mid-input, and the Enter that confirms a candidate submits the message with the r
### Issue for this PR Closes #37267 ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Adds a "Subagents" tab to the session side panel, so subagent activity can be followed without it being buried by the main agent's log stream, the problem described in #37267. The tab lists eac
### Issue for this PR Closes #39869. Related to #17223 (runtime cost tracking for custom providers — this PR addresses only the misleading display for unpriced models, not the runtime cost calculation or usage handling). ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? In the T
### Issue for this PR Closes #40111 Also partially addresses https://github.com/anomalyco/opencode/issues/23506 Rather than disabling verification globally, fingerprint pinning achieves the same goal — trusting a specific self-signed cert — without insecure: true. caFile handles private CAs cleanly without a blanket bypass. https://github.com/anomalyco/openc
### Issue for this PR No issue filed — small QoL addition to an existing menu. ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The session-header "Open options" menu (the "Open in" dropdown next to the project path) is a hardcoded per-OS list of editors you can open the curren
### Issue for this PR Closes #41218 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? `DIAGNOSTICS_DOCUMENT_WAIT_TIMEOUT_MS` (5s) and `DIAGNOSTICS_FULL_WAIT_TIMEOUT_MS` (10s) in `lsp/client.ts` are hardcoded. If a language server takes longer than that to produce diagnostics, th
## What Show a worktree session's branch on the existing project detail row in vertical tabs. - worktree tabs render as `project ⎇ branch` - main-checkout tabs retain the existing project-only label - missing location or VCS data falls back to the project-only label - long detail rows fade at the right edge without an ellipsis ## How - `session-tabs.tsx` com
### Issue for this PR Closes # ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Adds proactive RAM management to the desktop Electron app. A monitor polls `app.getAppMetrics()` every 30s and runs GC (main process, sidecar, renderers) when the peak working set crosses 1.8 GiB. `
### Issue for this PR Closes #41681 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? When a queued `task_id` resume starts under a different subagent, atomically refresh its stored agent and Task-owned permission rules before prompting it. Rules derived for the previous agent a
### Issue for this PR Closes #40490 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Updates desktop window titles from the active tab so macOS Window menu entries are distinguishable. The title uses `<tab name> — <directory name>`, falls back to `OpenCode` when no tab is activ
## Summary - use canonical command IDs for V2 TUI keybind configuration and migration - preserve queued-prompt and newline behavior added on the current V2 base - cover migrated bindings, component shortcuts, config persistence, and diff-viewer behavior ## Validation - `bun typecheck` in `packages/cli` - `bun typecheck` in `packages/tui` - full `packages/tui
## What Adds a **workerd runtime profile** so an OpenCode server can boot inside a Cloudflare Durable Object, plus the SDK entrypoint and a CI guard that proves it in a real isolate. The destination is *one OpenCode server per Durable Object* — a Slack bot where each thread is a DO hosting a full server, with OpenCode's database being the DO's own SQLite and
### Issue for this PR Closes #41916 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Nested values merged from the global config cache could retain shared references. A plugin config hook mutating one workspace could therefore leak MCP configuration into workspaces loaded later
## What Prevent managed-service restart storms when a running TUI outlives an automatic CLI update, and harden lifecycle recovery so clients never terminate a process from registration data alone. This fixes the incident where a `next-17271` TUI remained alive after the installed package became `next-17272`. The old process repeatedly treated each `17272` se
## Summary - promote text content into the Code Mode return value when a tool has no declared structured output - keep declared structured outputs unchanged and continue collecting file content separately - cover content-only Promise plugin and MCP tool execution through Code Mode Fixes #41949 ## Testing - `bun test test/plugin/promise.test.ts test/mcp.test.
### Issue for this PR Closes #42220 ### Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? Two related zh-cn documentation improvements: 1. **Terminology unification**: The zh-cn docs used 代理 for "Agent" while the UI (zh.ts) uses 智能体. Replaced 代理 with 智能体 across 19 files (docs + i18n
## Summary - require `application/json` for `POST /global/upgrade`, forcing browser cross-origin calls through CORS preflight - reject upgrade targets that are not valid semantic versions - cover JSON, content-type, and semver behavior with focused HTTP API tests ## Checks - `bun test test/server/httpapi-global.test.ts` - `bun run generate` from `packages/cl
## Summary - admit session moves durably through `session_pending` instead of interrupting active execution - apply deferred moves after execution settlement and route successor work through the new location - preserve latest-wins replacement, startup recovery, and exact admission consumption semantics - regenerate public clients and narrow TUI pending-input
### Issue for this PR Closes #7103 ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? Adds an `allowed_bots` input to the GitHub Action so trusted GitHub App bots can trigger OpenCode workflows. Bots remain denied by default; callers can allow specific comma-separated bot usernam
## What Right-clicking a session tab now opens a borderless context menu beneath the cursor with: - New tab - Rename - Close Right-clicking the new-session control shows the valid New tab action. The menu works in both horizontal and vertical tab layouts, clamps to the terminal bounds, and keeps existing left-click selection, close, and drag behavior unchang
## What Route local/stdio MCP server processes through each location's `Environment.spawner` instead of the MCP SDK's host-bound `StdioClientTransport`. MCP is already location-scoped, but stdio servers were host-ambient. A workspace-backed location could run Shell and Ripgrep inside its sandbox while its MCP servers still ran on the OpenCode host. After thi
## Summary - delete the wall-clock-driven tab pulse rendering test - give the canonical-worktree snapshot test enough time for Git setup on Windows - give shell permission/progress integration tests realistic Windows CI timeouts - increase the shell command timeout assertion window so process startup cannot race the expected output ## Why Recent Windows CI r
### Issue for this PR Fixes #42081 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? `apply_patch` silently deletes the final blank line of any file ending with `\n\n`, even when the patch doesn't touch it (#42081). Both patch implementations pop the sentinel `""` that `split("\
## Summary - mark the zero-day retention entries for both DeepSeek V4 models with an asterisk - clarify that the monthly ZDR agreement applies to DeepSeek generally, not only DeepSeek V4 Flash ## Checks - `git diff --check` - Web build not run: this worktree does not have the Astro executable installed Requested by: @thdxr (Dax Raad via Slack)
## What Keep the populated Control-O session/project picker stable when it opens, reopens, or receives the shortcut repeatedly. ## Before / After **Before:** Opening reset the shared dialog to medium width, mounted a partial picker from local state, then resized it and inserted projects and cross-project recents as two asynchronous requests completed. This p
## Summary - allow only the applications exposed by the Open in menu to cross the desktop IPC boundary - resolve Windows executable paths in the main process after validating the requested application - fall back to the system file opener for unsupported or unavailable applications - add platform-specific allowlist coverage ## Why The renderer previously sup
## What Use **Developer tools** as the user-facing command name and keep turn token usage controls inside the developer tools bar instead of exposing them as a separate command. Clickable sections in the developer tools bar now use the theme's brighter hover background so they read as interactive before selection. ## Before / After **Before:** The command pa
## What Restore session tab marquee behavior when hover reveals the close control, and prevent a previous tab's marquee from remaining active after the pointer moves to a title that fits. ## Before / After **Before** A title could fit the resting tab width but become clipped when hover reserved cells for the close control. Overflow eligibility still used the
## What Keep the full V2 TUI's armed interrupt confirmation visible after the first Escape. ## Before / After **Before:** A running session showed `esc interrupt`. The first Escape correctly armed the two-press confirmation without calling the interrupt API, but the footer used `theme.background.action.primary.default` as a foreground color. In the reproduce
## What Move the OpenTUI renderer debug overlay behind the TUI's Developer Tools surface. The Developer Tools **UI** pane now exposes a `Debug overlay` checkbox that stays synchronized with the renderer. The existing `app.debug` command remains available to explicit keybindings, but is no longer globally discoverable in the command palette. ## Before / After
## Summary - rewrite models.dev GitHub Copilot fallback models to use the bundled Copilot provider package - keep the rewrite inside the GitHub Copilot catalog transform - preserve account-specific base URL overrides when live model synchronization is unavailable - cover fallback package rewriting with a provider plugin test ## Verification - `bun test test/
## What Keep sessions created before Git initialization visible after their directory acquires a stable project identity. ## Before / After **Before:** A session created in a non-Git directory belonged to the `global` project. After `git init`, project resolution assigned the directory a real project ID, but the session row kept its stale `global` ownership,
### Issue for this PR Closes #41224 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Adds CORS headers to actual Zen model-list responses, not only OPTIONS preflight responses. The shared helper is also used by the main Zen chat handler response headers so normal GET/POST respo
## What Fixes terminal Mermaid flowcharts that use quoted multiline labels and inline italics. Valid labels now keep their punctuation, split on `<br/>`, render `<i>` / `<em>` as terminal italics, and reserve horizontal room only where that label is routed. ## Before / After **Before:** the flowchart parser measured edge operators against a masked statement
## Summary - Add `neriousy` to `.github/TEAM_MEMBERS`. - Add `neriousy` to the core team assignment pool used by the GitHub issue triage agent. - Let GitHub automations recognize him as a core team member and assign matching issues to him. ## Verification - Confirmed the login appears exactly once in the shared roster. - Confirmed the core triage pool contai
## Summary - Add `neriousy` to `.github/TEAM_MEMBERS`. - Add `neriousy` to the core team assignment pool used by the GitHub issue triage agent. - Let GitHub automations recognize him as a core team member and assign matching issues to him. ## Verification - Confirmed the login appears exactly once in the shared roster. - Confirmed the core triage pool contai
## Summary - fix worktree names in the TUI session list dialog - remove the session subpath before deriving the worktree name - show linked worktree names instead of the nested session directory or project fallback - truncate worktree labels to 25 terminal cells ## Verification - reproduced with OpenCode Drive using two linked worktrees with sessions under `
## Summary - replace the input-specific pending model with a generic per-session inbox for user, synthetic, compaction, and move items - add durable inbox lifecycle events, generic steer/queue scheduling, and atomic delivery batches for compaction and move - add the pending-only session_inbox table and expose inbox list, cancel, steer, and queue APIs across
## Summary - record the first visible text timestamp and provider generation completion timestamp for each V2 assistant step - calculate per-request output speed as `(visible output tokens - 1) / (last token - first token)` - show `tok/s` for completed `stop` and `length` responses in assistant footers and turn-token diagnostics - reject tool-call, error, bu
## What Complete the workerd profile's capability story after #41918 and #42076: a bare location now has a typed no-execution-plane process spawner instead of profile-level process stubs. Shell and stdio MCP route through the location `Environment`. Bare locations fail each operation with a clear location-specific error; attaching a workspace driver automati
## What Make interrupt actions acknowledge immediately in the app and TUI while OpenCode finishes server-side cancellation and durable settlement. The stop control now enters a pending state as soon as the user interrupts, disables duplicate requests, and resets when the session becomes idle or the interrupt request fails. The TUI footer similarly changes fr
## Summary - validate model-facing tool definitions before mutating the Location registry - return a `Tool.RegistrationError` that names the malformed tool and includes the schema failure - preserve atomic registration batches so one invalid plugin tool cannot poison subsequent model requests Fixes #42026 ## Tests - `cd packages/core && bun test ./test/sessi
## What / Why Runtimes bundled with the `workerd` condition cannot carry the TypeScript transpiler dependency: the compiler is large and probes Node internals during module initialization. Route interpreter transpilation through a `#transpile` conditional import. Node and Bun resolve the extracted TypeScript implementation, preserving the existing path byte-
## What / Why Bundles using the `workerd` condition crash at import time because `import.meta.url` is undefined there and `createRequire(import.meta.url)` currently runs at module scope. The watcher is never loaded on that runtime, so resolving the require eagerly turns unreachable functionality into a bundle-wide startup failure. Before, importing the bundl
## What Keep terminal Mermaid rendering responsive and readable for oversized or malformed diagrams, and fold wide horizontal Markdown flowcharts before they are silently clipped. ## Before / After **Before:** a long malformed flowchart statement could spend seconds backtracking in edge parsing; near-million-cell canvases could allocate hundreds of megabytes