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(tui): correct working directory when continuing session in a new directory

### Issue for this PR Closes #42221 Also addresses #41562 ### Type of change - [x] Bug fix ### What does this PR do? `opencode -c` in a directory with no prior sessions showed an old directory instead of the current one. Two issues caused this: 1. **SDK `pick()` didn't fall back to `config.directory`** — When the `x-opencode-directory` header was missing fro

importance 0@shinelonopenOriginal evidence ↗
pull request

fix(tui): position composer top slot above queue

## What Render `session.composer.top` above the complete composer stack instead of between the queued-prompt rail and prompt. This keeps additions such as session recaps above the composer as a whole, while the queued rail remains visually attached to the prompt it belongs to. ## Before / After **Before** The top slot split the two composer-owned sections. `

importance 0@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(core): reject inherited workspace providers

## What Preserve the typed `WorkspaceDriver.ProviderNotFound` contract for every unregistered provider name after removing the built-in Modal workspace driver in #42142. ## Before / After **Before:** the registry read `drivers[provider]` directly. Names inherited from `Object.prototype`, such as `constructor`, `toString`, and `__proto__`, resolved to unrelat

importance 0@kitlangtonclosedcontributorOriginal evidence ↗
pull request

feat(core): replace webfetch markdown renderer

## What Replace V2 Core webfetch's Turndown/Domino HTML-to-Markdown conversion with a purpose-built `htmlparser2` event renderer. The renderer preserves model-readable document structure without constructing a browser DOM and removes Core's `turndown`, `@mixmark-io/domino`, and `@types/turndown` closure. | Measurement | Before | After | Change | | --- | ---:

importance 0@kitlangtonopencontributorOriginal evidence ↗
pull request

feat(opencode): let tools opt into strict mode

### Issue for this PR Closes #40214 ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Adds `strict?: boolean` to the tool definition and the `tool.definition` plugin hook, passed to the AI SDK `Tool` only when a tool sets it. Today `session/llm/request.ts` forces `strict: false`

importance 0@mayshwartz2openOriginal evidence ↗
pull request

feat(merman): support cherry-pick in GitGraph diagrams

### Issue for this PR N/A — feat PR (feature PRs skip issue requirement per contributing guidelines) ### Type of change - [x] New feature ### What does this PR do? Completes the GitGraph feature landed in #42179: the parser currently rejects `cherry-pick` with "Cherry-pick is not supported". This PR implements cherry-pick per Mermaid semantics: - `cherry-pic

importance 0@Robin1987ChinaopencontributorOriginal evidence ↗
pull request

fix(core): list default agent first

## Summary - order the resolved default agent first in agent list responses - preserve the existing order of all remaining agents - cover configured-default ordering in the core agent service ## Checks - `bun test test/agent.test.ts` (packages/core) - `bun typecheck` (packages/core) Requested by: @thdxr (Dax Raad via Slack)

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

fix: deduplicate identical permission prompts in same session

### Issue for this PR Closes #41849 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? **Problem:** When two identical permission requests (same `sessionID`, `permission`, and `patterns`) arrive within the same second, each creates an independent pending prompt. The user has to a

importance 0@weicongheopencontributorOriginal evidence ↗
pull request

fix(core): preserve prompt cache affinity

### Issue for this PR Closes #42246 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? V2 generated a stable session cache key but only passed it through the OpenAI provider namespace. This meant OpenRouter did not receive the key its route already supports, while native OpenAI C

importance 0@phall1openOriginal evidence ↗
pull request

fix(opencode): propagate session errors and surface tool-load warnings in the UI

### Issue for this PR Closes #42259 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Two related problems in how session outcomes reach the UI: 1. **Session run defects were silently dropped.** When a session run failed with an unexpected defect, no error reached the UI — the s

importance 0@DatScreameropenOriginal evidence ↗
pull request

refactor(app): consolidate desktop server data contexts

## Summary - consolidate server-scoped SDK, sync, notification, permission, and model state behind keyed server contexts - simplify desktop route and provider composition while preserving reactive session and directory changes - update app and desktop consumers to use the unified server data architecture and remove obsolete legacy layers ## Verification - `b

importance 0@BrendonovichopenOriginal evidence ↗
pull request

fix(tui): align skill descriptions with wide characters

fix(tui): align skill descriptions with wide characters ### Issue for this PR https://github.com/anomalyco/opencode/issues/40605 Closes #40605 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? When a skill's name contains wide characters (e.g. CJK), the `/skills`dialog padded ti

importance 0@liujianbo2013openOriginal evidence ↗
pull request

fix(opencode): keep shell tail when oversized line ends with newline

### Issue for this PR Closes #42277 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? `tail()` walks the output lines backwards and, when even the last line on its own exceeds `max_bytes`, byte-slices that line so the model still gets a tail. The fallback is guarded by `out.leng

importance 0@codeAnqiang-maopenOriginal evidence ↗
pull request

fix(core): apply external plugin changes after startup batch commits

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

importance 0@To-TermopenOriginal evidence ↗
pull request

fix(session): ignore failed compaction summaries when reordering

### Issue for this PR Closes #42282 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? `filterCompacted` decides "this compaction is complete" twice, with two different tests. The truncation loop requires `summary && finish && !error`; the reordering branch underneath only checks

importance 0@codeAnqiang-maopenOriginal evidence ↗
pull request

fix(session): recover orphaned task runs

### Issue for this PR Closes #42286 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? When a persisted `task` call outlives its in-memory session runner, abort now marks the stale task part and its parent assistant message as aborted instead of leaving both unfinished. It also a

importance 0@0xfedopenOriginal evidence ↗
pull request

fix(session-ui): preserve caret after prompt editor rebuild

### Issue for this PR Fixes #42335 Related to #37037 / #36210 (caret jumps around in the prompt input while the session updates). This PR fixes the variant I could reproduce and verify on the current v2 composer: inserting a @mention mid-text on the **session page** collapses the caret to the END of the prompt instead of keeping it right after the mention. I

importance 0@gold-beyondopenOriginal evidence ↗
pull request

fix(opencode): report config parse errors against the original text

### Issue for this PR Closes #42308 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Config is loaded by substituting `{env:...}` / `{file:...}` first and parsing the result, so when parsing fails `jsonc()` quotes back the substituted text - the one that has the real values in

importance 0@codeAnqiang-maopenOriginal evidence ↗
pull request

chore(catalog): remove wrangler state

## Summary - remove checked-in Miniflare cache database files - ignore catalog-local `.wrangler` runtime state ## Checks - `git diff --check` - `git check-ignore -v packages/lab/catalog/.wrangler/example.sqlite` Requested by: @kitlangton (Kit Langton via Slack)

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

feat(desktop): update composer dropzone

### Issue for this PR Closes # ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Updates the desktop composer dropzone to use a 0.5px focus-token outline with 3px dashes and a 5% accent background in both themes. The outline is rendered in an absolute overlay to avoid changing t

importance 0@usrnk1opencontributorOriginal evidence ↗
pull request

docs: fix package manager code blocks

## Summary - replace hand-written install tabs with Blume's formatter-safe `CodeGroup` - combine npm, bun, pnpm, Yarn, and curl into one install selector with npm first - keep package manager labels separate from the `bash` syntax language - prevent the repository generation/formatting workflow from collapsing fences and reintroducing `bash` as command text

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

docs: remove Ling 3.0 Tiny free model

## Summary - remove Ling-3.0-tiny Free from Zen model and pricing tables - remove its promotional availability and data-use notes across all localized Zen docs ## Verification - `bun run build` in `packages/web` - repository pre-push typecheck - `git diff --check`

importance 0@MrMushrooooomclosedcontributorOriginal evidence ↗
pull request

fix(core): recover corrupt snapshot index

### Issue for this PR Closes #42237 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Snapshot capture now recovers an invalid private Git index after a failed capture. Recovery is restricted to OpenCode snapshot storage, replaces only the index from the source repository, and r

importance 0@dajiaohuangopenOriginal evidence ↗
pull request

docs: italian translation of references.mdx page

### Issue for this PR ### Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? - I translated the `references.mdx` page into Italian. ### How did you verify your code works? - in packages/web run `bun run build` - repository pre-push typecheck ### Checklist - [x] I have tested my chang

importance 0@DomeT99openOriginal evidence ↗
pull request

fix(opencode): accumulate step tokens instead of overwriting

### Issue for this PR Closes #42324 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? In multi-step tool-call messages, `processor.ts` overwrites `assistantMessage.tokens` on every `step-finish` event, so only the last step's output, reasoning, and cache.write survive — while `c

importance 0@gold-beyondopenOriginal evidence ↗
pull request

fix(app): register direct session projects

### Issue for this PR Closes #42265 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Direct visits to `/:dir/session` in the new layout created a draft without adding the directory to the current server's project state. Register and touch the directory before creating the draft

importance 0@dajiaohuangopenOriginal evidence ↗
pull request

fix(app): size update pill to label

### Issue for this PR Closes #42232 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The titlebar update pill used a fixed 68px expanded width, leaving excess space around short translations such as Chinese and constraining longer labels. Size the expanded pill from its label's

importance 0@dajiaohuangopenOriginal evidence ↗
pull request

fix(app): enable directory auto-accept settings

### Issue for this PR Fixes #31137 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? V2 Settings already receives a session ID for active sessions, but draft and directory-backed new-session routes have no session ID even though the layout knows their active directory. That leav

importance 0@michaelbuckneropenOriginal evidence ↗
pull request

fix(tui): keep shell commands full width

## Summary - show a differing shell working directory as a display-only `cd <path> &&` prefix - keep the running spinner and completed `$` prompt in the same command slot - render the full shell invocation as one wrapping text flow instead of narrow prompt and command columns ## Checks - `bun typecheck` (`packages/tui`) - `bun test test/mini/entry.body.test.

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

fix(cli): stop `run` from sleeping through an exhausted quota

### Issue for this PR Closes #40747 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? `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 provi

importance 0@DaisukeYodaopenOriginal evidence ↗
pull request

fix(tui): disclose truncated tab titles

## What Keep truncated session tab titles stationary and disclose the full title in a delayed hover tooltip instead of scrolling it as a marquee. The tooltip appears only when the title exceeds its available cells, stays within the terminal bounds, and works in both the vertical session rail and horizontal tab strip. ## Before / After **Before:** Hovering a

importance 0@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(tui): transition vertical tab states

## What Smoothly transition every visual state in the vertical session sidebar. Selecting an unread tab now eases its background, text, shortcut number, unread glow, and separator hue back to the active/read state instead of snapping between colors. ## Before / After **Before:** selecting an unread or failed tab cleared its unread state immediately. The puls

importance 0@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(tui): stop disabled tab pulse rendering

## What Prevent disabled tab pulses from keeping the OpenTUI renderer live after their session becomes active. Enabled running sweeps, breathing, flashes, and completion animations are unchanged. ## Before / After **Before** 1. A tab pulse mounted with animations disabled. 2. Its session later transitioned to active. 3. `PulseState.live` returned `true` from

importance 0@kitlangtonopencontributorOriginal evidence ↗
pull request

chore: update ai gateway provider

## Summary - update `ai-gateway-provider` from 3.1.2 to 3.2.0 in both `packages/core` and `packages/opencode` - refresh the lockfile, including the provider's updated optional AI SDK integrations - remain on the AI SDK 6-compatible provider line; 4.x requires AI SDK 7 ## Upstream changes 3.2.0 adds: - `byokAlias` and `zdr` universal-endpoint options - curren

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

fix(core): refresh fallback file search

## What Keep the ripgrep-backed filename index fresh without restoring a recursive project filesystem watch. Fallback file search now serves its current index immediately and starts at most one background refresh when the last completed scan is 10 seconds old. A completed refresh atomically replaces the prior index. ## Before / After **Before** The fallback

importance 0@kitlangtonclosedcontributorOriginal evidence ↗
pull request

feat(core): add portable shell permission scanner

## What Replace Core's tree-sitter Bash and PowerShell permission parsing with a dependency-free, fail-closed scanner. This removes the tree-sitter runtime, grammar packages, WASM assets, asset staging, and parser environment variables used by Core shell-permission parsing. The scanner is 10.5 KB minified / 3.8 KB gzip and is bundled into published Core arti

importance 0@kitlangtonopencontributorOriginal evidence ↗
pull request

docs(ecosystem): add opencode-obvious-grid plugin

### Issue for this PR Closes # ### Type of change - [ ] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [x] Documentation ### What does this PR do? [Opencode Obvious Grid](https://github.com/ray062/opencode-obvious-grid) Adds opencode-obvious-grid to the Plugins table — a self-contained very visible and bold status-page plugin (aggregate view o

importance 0@ray062openOriginal evidence ↗
pull request

feat(core): add automatic web search routing

## What Add automatic provider selection and failover for V2 web search. Users can configure `websearch.provider` as `"auto"`, or select **Allow web search** on first use. Each search snapshots the currently registered providers, shuffles them once, and tries each provider at most once until one succeeds. Fixed provider selections and explicit request provid

importance 0@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(config): tolerate missing file variables in config

### Issue for this PR Fixes/Closes #15033 ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? Makes missing `{file:...}` config variables resolve to an empty string instead of failing opencode start when file is not present. Existing file references are still read normally, and no

importance 0@stone-w4tch3ropenOriginal evidence ↗
pull request

fix(core): preserve unicode in grep previews

## What Prevent oversized Ripgrep line previews from persisting half of a Unicode character. A malformed preview could display as `�` and poison subsequent provider requests. ## Before / After **Before** A grep match longer than 2,000 JavaScript string units could place an emoji across the preview boundary. `slice(0, 2_000)` retained only the emoji's first U

importance 0@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(app): navigate into directories in the open project dialog

### Issue for this PR Closes #38338 Rebase of #38345 by @razzeee onto current `dev`, opened with their permission (https://github.com/anomalyco/opencode/pull/38345#issuecomment-5280628324). Original commit and authorship preserved. ### Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR d

importance 0@BongHwiopenOriginal evidence ↗
pull request

feat(tui): graduate per-tab prompt drafts

## What Make unsent prompt drafts belong to the tab where they were written. Session tabs and the home tab now restore only their own drafts, with no experiment toggle required. The experiment framework remains available in DevTools for future flags. Its registry is currently empty, so the Experiments pane shows an explicit `No experiments available` state w

importance 0@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(drive): serialize unfocused UI state

## What Keep OpenCode Drive responsive when the TUI has no focused renderable. Drive currently hangs on its first `ui.state` request for full-screen plugin routes such as Storybook. The state object includes `focused.renderable: undefined`, which cannot be encoded as JSON. Encoding defects the control-server response fiber, so the client waits until its 30-s

importance 0@kitlangtonclosedcontributorOriginal evidence ↗
pull request

fix(desktop): ignore packaged renderer override

## Summary - ignore `ELECTRON_RENDERER_URL` in packaged desktop applications - use one guarded parser for both renderer loading and trusted-origin checks - preserve the override for local Electron development - cover development, packaged, and invalid URL behavior ## Why The packaged app previously honored an environment-provided renderer URL and then treate

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

docs(go): use responses endpoint for Grok 4.5

## Summary - document Grok 4.5 on OpenCode Go using the Responses API endpoint - update the corresponding AI SDK package to `@ai-sdk/openai` ## Checks - `git diff --check` Relates to #40206 Requested by: @rekram1-node (Aiden Cline via Slack)

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

fix(tui): restore composer shell kill shortcut

## What Restore `Ctrl+D` shell termination from the TUI composer Shell tab when a global binding also recognizes the key. ## Before / After **Before:** The Shell tab rendered `kill ctrl+d`, but the key could be consumed before `composer.shell.kill`, so no `DELETE /api/shell/:id` request was sent and the background process continued running. **After:** While

importance 0@kitlangtonclosedcontributorOriginal evidence ↗
pull request

feat(app): show tokens-per-second in context usage indicator

### Issue for this PR No issue filed; small UX addition to the existing context usage indicator. ### Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / code improvement - [ ] Documentation ### What does this PR do? The context usage indicator (progress circle shown in the session header and message timeline) already shows cost, context usage % a

importance 0@894864openOriginal evidence ↗
pull request

docs(go): use responses API for Grok 4.5

## Summary - update the Grok 4.5 Go endpoint to the Responses API - use the matching `@ai-sdk/openai` package - keep all localized Go docs in sync ## Testing - `git diff --check origin/dev...HEAD` - `bun turbo typecheck` (pre-push hook)

importance 0@MrMushrooooomclosedcontributorOriginal 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 0@YoannDev90openneeds:complianceOriginal evidence ↗
pull request

feat(tui): show failed shell exit code

## Summary - detect non-zero shell exit metadata - show a pinned red `× exited with code N` row - keep the failure visible outside collapsed command output, including output previews longer than ten lines ## Checks - `bun typecheck` (`packages/tui`) - `bun test test/mini/entry.body.test.ts test/mini/scrollback.surface.test.ts` (`packages/tui`) - real V2 sess

importance 0@opencode-agent[bot]opencontributorOriginal evidence ↗