contribution/compass
anomalyco/opencode

OpenCode

602 signals · 626 observation events

Open repository ↗

The open source coding agent.

197.0K stars25.3K forksTypeScriptMITkeyword: OpenCode
PROJECT NEWS

Release, roadmap, and discussion

All news →
anomalyco/opencode

OpenCode

Coding-Agent Infrastructure
Latest stable

v1.18.18

v1.18.18
  • Core
  • Bugfixes
  • Select the Kimi system prompt correctly for official Moonshot and Kimi providers
  • Fix xhigh reasoning effort for xai models
Original release notes ↗

Publicly indicated next

  • No public prerelease or open milestone found.

Prereleases and milestones indicate public plans; they are not delivery commitments.

Observation trail

  1. discoveredinitial snapshot
  2. changedupdatedAt, metrics, assignees
  3. changedupdatedAt, metrics
  4. discoveredinitial snapshot
  5. discoveredinitial snapshot
  6. discoveredinitial snapshot
  7. discoveredinitial snapshot
  8. changedtext, updatedAt
  9. discoveredinitial snapshot
  10. discoveredinitial snapshot
  11. changedupdatedAt, metrics, state
  12. discoveredinitial snapshot
  13. changedupdatedAt
  14. discoveredinitial snapshot
  15. discoveredinitial snapshot
  16. changedtitle, text, updatedAt
  17. changedmetrics
  18. changedmetrics
  19. changedmetrics
  20. changedmetrics
  21. changedmetrics
  22. changedmetrics
  23. changedmetrics
  24. changedmetrics
  25. changedmetrics
  26. changedmetrics
  27. changedmetrics
  28. changedmetrics
  29. changedmetrics
  30. changedtext, updatedAt, state
50 shown
pull request

fix(core): reject invalid UTF-8 directory paths in serve

### 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`

importance 3@extencilopenOriginal evidence ↗
pull request

feat(desktop): Improve keyboard navigation and add accept button in open project dialog

### 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

importance 3@razzeeeopenOriginal evidence ↗
pull request

feat(tui): add spinnerVerbs config to customize TUI spinner text

### 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

importance 3@dev-tnsqopenOriginal evidence ↗
pull request

some experimental perf improvements

## 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

importance 3@HonaopenbetaOriginal evidence ↗
pull request

fix: log plugin load failures to stderr

### 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

importance 3@YoannDev90closedOriginal evidence ↗
pull request

fix(provider): add Merge Gateway reasoning variants

### 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

importance 3@MatthewFerozclosedOriginal evidence ↗
pull request

fix(app): unify v2 server and session lifecycle

## 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

importance 3@HonaclosedbetaOriginal evidence ↗
pull request

fix(web/desktop): restore agent mode selector and Linux old-layout eligibility

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

importance 3@rasrazclosedneeds:titleOriginal evidence ↗
pull request

fix(app): prevent settings dialog handler from locking up on cleanup

### 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

importance 3@MaaBlockopenOriginal evidence ↗
pull request

fix(tui): keep session directory filter toggle usable in the picker

### 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

importance 3@thepigdestroyeropenOriginal evidence ↗
pull request

feat(tui): allow binding a key to permission.mode

## 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

importance 3@thepigdestroyerclosedneeds:complianceOriginal evidence ↗
pull request

fix(tui): exit on empty non-interactive stdin

### 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

importance 3@xichen1997openOriginal evidence ↗
pull request

fix(tui): refresh terminal size before resize

## Summary - refresh cached TTY dimensions before OpenTUI reads them - install the refresh listener ahead of the OpenTUI `SIGWINCH` listener - remove the listener with the TUI scope ## Testing - `bun test` in `packages/tui` - `bun typecheck` in `packages/tui` - tmux conversation resize smoke test: 68 -> 119 -> 68 columns Fixes #42225

importance 3@fanciveclosedcontributorOriginal evidence ↗
pull request

feat(tui): prototype missing location recovery

## 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

importance 3@kitlangtonopencontributorOriginal evidence ↗
pull request

feat: LLM command-approval classifier (auto mode)

### 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),

importance 2@thomaslwangOriginal evidence ↗
pull request

fix(ui): standardize v2 tooltip delay

## 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

importance 2@opencode-agent[bot]opencontributorOriginal evidence ↗
pull request

fix(storage): index session list queries

### 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

importance 2@literally-danopenOriginal evidence ↗
pull request

fix(opencode): speed up long session forks

### 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

importance 2@evan-choiopenOriginal evidence ↗
pull request

feat(tui): surface plugin failures

## 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

importance 2@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(cli): survive broken stdio pipes

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

importance 2@HonaopenOriginal evidence ↗
pull request

feat: voice input

### 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

importance 2@js2meOriginal evidence ↗
pull request

feat(client): support service version ranges

### 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" }

importance 2@mattrobrobclosedOriginal evidence ↗
pull request

docs: fix provider display name and PAT typos

### 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

importance 2@skyzhao1223closedOriginal evidence ↗
pull request

fix(core): route Muse models to Meta prompt

## 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

importance 2@opencode-agent[bot]closedcontributorOriginal evidence ↗
pull request

docs: fix broken DigitalOcean and Daytona links

### 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

importance 2@skyzhao1223closedneeds:complianceOriginal evidence ↗
pull request

fix(tui): hide background badge on interrupted shells

## 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`) -

importance 2@opencode-agent[bot]opencontributorOriginal evidence ↗
pull request

feat(tui): display chained shell commands across multiple lines

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

importance 2@fowlmouthopenOriginal evidence ↗
pull request

fix(tui): smooth session tab marquees

## 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

importance 2@kitlangtonclosedcontributorOriginal evidence ↗
pull request

feat(tui): jump between open menu sections

## 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

importance 2@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(tui): fill image message background

## 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

importance 2@opencode-agent[bot]closedcontributorOriginal evidence ↗
pull request

fix(tui): preserve transcript image height

## 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

importance 2@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(tui): restore navigation keybind defaults

## 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

importance 2@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(core): generate session titles before model execution

## 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

importance 2@kitlangtonclosedcontributorOriginal evidence ↗
pull request

docs: add opencode-stream-rules to ecosystem

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

importance 2@jiesouclosedneeds:complianceOriginal evidence ↗
pull request

fix(tui): keep exact-fit tab titles stationary

## 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

importance 2@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(opencode): limit default GPT verbosity

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

importance 2@Lp-Francoisclosedneeds:issueOriginal evidence ↗
pull request

fix(llm): preserve nested OpenAI stream errors

### 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

importance 2@vladislav-miroshnikovopenOriginal evidence ↗
pull request

chore(ci): surface bun exit code with ::warning:: on failure

## 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

importance 2@niSteeclosedOriginal evidence ↗
pull request

fix(session): set finish status on halted assistant message

### 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

importance 2@vladislav-miroshnikovopenOriginal evidence ↗
pull request

fix(cli): dispose all instances on command exit

### 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

importance 2@vladislav-miroshnikovopenOriginal evidence ↗
pull request

fix(core): apply variable substitution to v2 config loading

### 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

importance 2@vladislav-miroshnikovopenOriginal evidence ↗
pull request

fix(console): drop non-function tools when converting Responses to chat completions

## 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

importance 2@miupsclosedneeds:issueOriginal evidence ↗
pull request

fix(shell): encode PowerShell commands to preserve multi-line output

### 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

importance 2@vladislav-miroshnikovopenOriginal evidence ↗
pull request

fix(core): resolve child process exit signal on exit event

### 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

importance 2@vladislav-miroshnikovopenOriginal evidence ↗
pull request

fix(opencode): drop empty text separators between signed reasoning blocks

### 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

importance 2@vladislav-miroshnikovopenOriginal evidence ↗
pull request

fix(opencode): clarify possible tool argument truncation

### 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

importance 2@vladislav-miroshnikovopenOriginal evidence ↗
pull request

fix(opencode): cascade auto permissions to subagent sessions

### 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

importance 2@vladislav-miroshnikovopenOriginal evidence ↗
pull request

fix(opencode): filter compaction events from jsonl output

### 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

importance 2@vladislav-miroshnikovopenOriginal evidence ↗
pull request

fix(opencode): include agent identity in system prompt

### 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

importance 2@vladislav-miroshnikovopenOriginal evidence ↗