## What Allow Up and Down to navigate filtered Plugins and MCP dialogs without presenting keyboard focus as a durable current selection. ## Before / After **Before:** Plugins and MCP fed the highlighted row back into `DialogSelect.current`. Since `current` means the externally current value, this added a dot to whichever row the keyboard happened to highligh
## What Render Mermaid `timeline` fences as terminal-native vertical timelines in OpenCode instead of falling back to source code. ```text Product history Foundation ───┐ │ 2024 ───● Prototype │ First release ``` Bare, `TD`, and `LR` timeline headers preserve Mermaid parse semantics while sharing the vertical layout that remains readable in narrow terminal v
## What Adopts `opencode-drive` into the V2 monorepo and gives the captured TUI state browser a first-party internal home at `dev.opencode.ai/lab/catalog`. - `packages/drive`: the published Drive library and CLI, now consuming the workspace V2 client directly. - `packages/lab/catalog`: the terminal UI catalog with complete Opencode, Tokyo Night, and Everfore
### Issue for this PR N/A ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Defaults session moves to steer delivery and preserves an active model continuation across the Location handoff. The source runner returns the next logical step to SessionExecution, which reloads the Ses
## Summary - replace the active session tab when selecting normally from the Sessions picker - open a new tab for Shift-click, Shift+Enter, and iTerm2 linefeed activation - preserve existing tabs when selecting a session that is already open - rename the V2 filesystem operation and generated SDK method from `find` to `get` while retaining `/api/fs/find` ## T
## What Make activity spinners readable when their session row is selected in the Open and Sessions pickers. ## Before / After **Before:** activity spinners always used the default muted spinner color. On a selected row, that color had low contrast against the focused background and made the running state difficult to see. **After:** gutter content receives
## What Refines session-tab activity feedback in both layouts: - vertical tabs use a compact 10-cell running sweep instead of washing the full row - selected shortcuts stay neutral, while running shortcuts turn interactive blue - start, reprompt, and completion brighten the shortcut, then settle into its durable state - vertical flashes radiate from the shor
## Summary - replace the V2 ProjectCopy and ProjectDirectories domains with a global Worktree service - consolidate project roots and managed worktrees into a dedicated worktree table - expose global list, create, remove, and refresh operations through the generated Promise and Effect clients - migrate the current V2 TUI and SDK Next surfaces to Worktree ter
### Issue for this PR Fixes #30067 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Resubmission of #30058 by meitalbensinai (auto-closed for missing PR template; commit cherry-picked unchanged, authorship preserved). Replaces `text += delta` accumulation in the `reasoning-delt
### Issue for this PR Closes # No issue — docs-only addition, under the "Documentation improvements" bullet in CONTRIBUTING.md. Happy to open one if you'd prefer. ### Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? Adds Orshot to the MCP server examples, in the same shape as the S
## Summary - pass the provider ID into system-prompt selection - select the Kimi prompt for models served by Kimi providers even when the model ID is bare, such as `k3` - cover provider-based Kimi prompt selection with a regression test ## Checks - `bun test test/plugin/system-prompt.test.ts` (packages/core) - `bun typecheck` (packages/core) Requested by: @r
### Issue for this PR Closes #38121 ### Type of change - [x] Bug fix ### What does this PR do? The `question` tool blocked indefinitely in ACP mode. The root cause: `question.asked` events carry a QuestionV2 request ID that must be passed to `sdk.question.reply/reject` to unblock the waiting deferred — but the event subscription never handled these events at
## What Serve the catalog app shell at `https://dev.opencode.ai/lab/catalog` and its client-side deep links. ## Before / After **Before:** the Worker rewrote app routes to `/index.html`, then Cloudflare Assets applied its default HTML canonicalization and redirected that internal path to `https://dev.opencode.ai/`. The bare catalog route returned a redirect/
## Summary - loosen the patched xAI SDK reasoning-effort schemas from a fixed enum to a string for both Chat and Responses - preserve arbitrary effort values on the outbound provider request - cover `xhigh` pass-through for both xAI APIs ## Related issues - #32459 ## Checks - `bun test test/provider-xai-responses.test.ts` (from `packages/core`) - `bun typech
## Summary - select the Kimi system prompt for models served by the official Kimi and Moonshot providers - handle bare model IDs such as `k3` and `k3-256k` without relying on the model ID containing `kimi` - cover provider-based prompt selection with a regression test ## Checks - `bun test test/session/system.test.ts` (packages/opencode) - `bun typecheck` (p
## Summary - loosen the patched Mistral SDK reasoning-effort schema from a fixed enum to a string - preserve arbitrary effort values on the outbound provider request - add regression coverage for an unknown effort value ## Checks - `bun test test/provider-mistral.test.ts` (from `packages/core`) - `bun typecheck` (from `packages/core`) - clean forced install
## What Keep shell execution usable when tree-sitter parser assets cannot load, such as in workerd runtimes without filesystem-backed assets. Permission analysis falls back to one conservative command resource instead of failing the scan. ## How Capture parser loading with `Effect.exit`. On failure, return the full command as the resource, derive the reusabl
## What Before, permission checks used only the current session's agent ruleset, so a subagent session escaped every configured deny in its ancestry. After, denies are fences and asks are per-agent gates: | Ancestor verdict | Current agent + remembered verdict | Result | | --- | --- | --- | | deny | any | deny | | ask or allow | deny | deny | | ask or allow
## What Expose the `Event` schema namespace from `@opencode-ai/sdk-next` so embedders consuming typed session and event streams do not need to deep-import `@opencode-ai/schema`. ## How Re-export `Event` alongside the SDK entrypoint’s existing schema namespaces and extend the canonical contract test to verify its identity and public presence. ## Scope Only th
## What Adds click-to-annotate feedback to the lab catalog viewer. Open any capture, press `A` (or the Annotate button), click a terminal cell, type a note in a composer anchored at that point, and press Enter. Each capture's annotations become one prefilled GitHub issue with readable notes plus machine-readable JSON, so design feedback lands in the tracker
## What Prevent an older CLI or Desktop client from replacing a newer managed background service. ## Before / After **Before** A client required its exact installed version. After an update, an older client saw the newer service as incompatible and replaced it with the older binary. A newer client could then replace that service again. **After** CLI and Desk
## What Require the managed service to authenticate and accept an exact-instance stop request before a client starts a replacement. ## Before / After **Before** If health or stop requests timed out, the client could fall back to `SIGTERM` and `SIGKILL` using the PID from registration. Rejected stops could also be ignored while replacement continued. **After*
## What Validate managed-service registration and health data before the Promise client uses it for discovery. ## Before / After **Before** The Promise client cast `JSON.parse` and health response bodies to trusted types. Primitive, partial, or incorrectly typed data could reach lifecycle logic. **After** Discovery accepts only registrations with a string UR
## What Keep the migration status overlay polling through temporary server transport loss. ## Before / After **Before** A transient disconnect while the background service restarted ended migration polling and displayed a migration failure toast. **After** Transport errors retry after one second. Actual API or migration errors still surface, and unmount abor
## What Add one cell of left padding to the update preflight footer so its monogram no longer touches the terminal edge. ## Before / After **Before:** The update monogram began in terminal column zero and appeared flush against the left edge. **After:** The footer content starts one cell in, matching the intended visual inset while preserving the existing sp
## Summary - run the local Desktop server with the CLI package dev script - remove the native production CLI build from local Desktop startup - keep downloaded and packaged CLI behavior unchanged ## Verification - bun typecheck from packages/desktop - bun run build from packages/desktop
## Summary - run the local Desktop server with the CLI package dev script - remove the native production CLI build from local Desktop startup - keep downloaded and packaged CLI behavior unchanged ## Verification - bun typecheck from packages/desktop - bun run build from packages/desktop
**What** Keep the queued-prompt dock to one terminal row when the next queued prompt contains multiple lines. **Before / After** **Before:** Queuing a multiline prompt preserved its newline characters in the dock preview. Although the text renderer used `wrapMode="none"` and `truncate`, explicit newlines expanded the dock and could consume much of the sessio
## Summary - raise the active top-model chart bar within the tablet breakpoint - keep its static tooltip above later chart bars without changing desktop or mobile stacking ## Validation - `bun typecheck` (`packages/stats/app`) - `bun --bun run build` (`packages/stats/app`) - Playwright visual check at 767, 768, 927, and 929 px; the tooltip layering changes o
## What Repair the deterministic Linux unit failures introduced by the current OpenTUI and Drive configuration baselines. ## Before / After **Before** - Monochrome fenced code could render Unicode source such as `Café → …` after a `CodeRenderable` was reused across Markdown block types. - Drive tests parsed generated `.jsonc` files with strict JSON APIs and
## 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
## What Repair Drive tests so generated `opencode.jsonc` and `tui.jsonc` files are parsed as JSONC. ## Before / After **Before** Instance and CLI integration tests called `Bun.file(...).json()` on JSONC files. Once the default configuration included comments, Linux unit jobs failed with `SyntaxError: Failed to parse JSON` before checking the generated config
## What Sharing a catalog link now unfurls with a real preview. Every captured screen/theme pair gets an auto-generated 1200x630 Open Graph card showing the actual rendered terminal frame, and the worker injects per-URL meta tags so scrapers (which never run JS) see the right card for deep links. ## How - `scripts/generate-og.ts` — runs after the production
### Issue for this PR No linked issue — new feature. ### Type of change - [x] New feature ### What does this PR do? Adds an optional per-session budget that stops the assistant when the session cost reaches it, plus a small widget in the TUI sidebar Context panel to view and set it. - `budget` field on the session schema (v1 + current), a nullable `budget` c
## What Skip shell command parsing when the effective agent configuration provably allows every shell command and every external directory. This lets sandboxed runtimes with an unconditional shell policy execute without loading tree-sitter. Runtimes with granular asks or denies retain the existing parser-backed permission decomposition. ## Before / After **B
## What Replace repeated ad-hoc `Permission.Service` test implementations with one small core test helper. Tests keep their local permission assertion capture, denial behavior, post-approval hooks, and `allowsAll` customization without repeating unused service methods. ## How - Add `packages/core/test/lib/permission.ts`, following existing `Layer.mock` test
## What Removes OpenCode Drive and the terminal catalog from this monorepo after transferring catalog ownership and all current state coverage to anomalyco/opencode-drive#57. The standalone PR contains the complete current catalog, including annotations, faceted filtering, per-capture Open Graph cards, deployment routing, all 76 screens across three themes,
## What Replace repeated complete `Project.Service` test layers with one small global-project test stub. The affected session tests all need the same behavior: no listed projects or directories, and every directory resolves to the global project unchanged. ## How - Add `packages/core/test/lib/project.ts` with `globalProjectLayer`. - Migrate six exact duplica
## What Reduce native memory growth when long-lived Promise SSE subscriptions reconnect or are cancelled. ## Before / After **Before** The caller AbortSignal remained attached to the native fetch for the entire SSE lifetime. Cancelling a connected stream aborted Bun HTTP directly, and repeated reconnects increased RSS by about 29 MB across 40 tiny-event stre
## Summary - direct desktop contributors to follow Solid best practices - require comments when code intentionally violates the linked guidance ## Testing - Not run (documentation-only change) Requested by: @Hona (Hona via Slack)
## What Highlight Bash syntax wherever commands are shown or edited in the TUI: - `!` Shell-mode prompt input while the user types - agent shell tool commands in inline and expanded tool views Keywords, strings, variables, comments, and punctuation use the active TUI syntax theme. ## How - `packages/tui/src/component/prompt/index.tsx` parses Shell-mode input
## Summary - invalidate the ripgrep fallback file index when the project filesystem changes - rebuild the snapshot on the next file search instead of requiring a daemon restart - cover newly created files appearing in subsequent searches ## Tests - `bun test test/filesystem/search.test.ts` - `bun typecheck` Requested by: @Hona (Luke Parker via Slack)
## What Adds a subtle raised background when the queued-prompts dock is hovered, making its existing click behavior discoverable. ## Before / After **Before:** The queued-prompts dock looked identical at rest and under the pointer, so it did not read as interactive. **After:** Hovering raises the dock background using the existing elevated theme treatment. C
## What Replace `@opencode-ai/util`'s single `xdg-basedir` use with a behavior-compatible local implementation, removing one direct runtime dependency (6,813 unpacked bytes across 5 files). ## How - Preserve import-time XDG environment overrides and home-directory defaults in `global-roots.ts`. - Preserve empty-value fallback behavior and platform-specific h