Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
8697644
release: v2.2.0 (#59558)
github-actions[bot] Oct 27, 2026
0b1f125
docs(console): every harness reaches every model (#59611)
vimtor Oct 27, 2026
5f8487f
fix(core): offer Console web search only when the workspace enables i…
vimtor Oct 27, 2026
5e31344
refactor(core): drop the legacy Console config path (#59595)
vimtor Oct 27, 2026
d78b817
refactor(core): drop the ManagedPolicy service (#59609)
vimtor Oct 27, 2026
112427a
fix(app): make dropdowns open instantly (#59268)
usrnk1 Oct 27, 2026
51e4de1
fix(cli): put dev builds back on the shared service and database (#59…
thdxr Oct 27, 2026
4a85158
feat(app): highlight quote source while writing its first comment (#5…
usrnk1 Oct 27, 2026
1151139
feat(app): refine project and worktree picker (#59397)
usrnk1 Oct 27, 2026
4ba064f
feat(app): add session location menu actions (#59607)
usrnk1 Oct 27, 2026
d012e07
feat(app): focus prompt history search (#59626)
usrnk1 Oct 27, 2026
7b1e54a
feat(app): align search and command palettes (#59604)
usrnk1 Oct 27, 2026
24bf4d4
fix(core): keep prompt cache settings out of model variants (#59500)
rekram1-node Oct 27, 2026
96ae220
chore(ai): drop five unused legacy provider entrypoint aliases (#59506)
rekram1-node Oct 27, 2026
618b890
fix(ai): don't treat 429 throttles as context overflow (#59649)
rekram1-node Oct 27, 2026
320445a
fix(session-ui): remove agent finish checkmark (#59646)
usrnk1 Oct 27, 2026
e26f85b
refactor(codemode): run programs on one job queue instead of a fiber …
rekram1-node Oct 27, 2026
5f1f8d0
test: deflake shutdown-deadline cleanup and PowerShell permission tim…
opencode-agent[bot] Oct 27, 2026
b3de41a
feat(app): refine artifact previews and file actions (#59657)
usrnk1 Oct 27, 2026
cdaba26
perf(core): coalesce snapshot captures and skip repeat ignore work (#…
rekram1-node Oct 27, 2026
432d870
fix(session-ui): use V2 styling for retry tooltip (#59647)
usrnk1 Oct 27, 2026
caebbcc
fix(console): link to v2 docs (#59679)
thdxr Oct 27, 2026
b431db8
chore(desktop): preserve appearance during CDP diagnostics (#59681)
usrnk1 Oct 27, 2026
3f74f03
fix(app): keep location shortcut working after tooltip hover (#59680)
usrnk1 Oct 27, 2026
92db5e1
chore(core): log cancelled and expired oauth attempts (#59689)
rekram1-node Oct 27, 2026
76e1f5b
chore(process-daemon): move opencode-pty into the monorepo (#59694)
jlongster Oct 27, 2026
1ed00ce
fix(core): keep snapshots working in repos with a split index (#59417)
rekram1-node Oct 27, 2026
9f43157
chore(deps): bump dompurify to 3.4.17 (#59709)
rekram1-node Oct 27, 2026
40c7ea2
chore(web): remove unused dependencies (#59719)
rekram1-node Oct 27, 2026
b981937
chore(deps): bump astro to 7.3.8 (#59711)
rekram1-node Oct 27, 2026
c756016
chore(deps): bump solid-js to 1.9.17 (#59710)
rekram1-node Oct 27, 2026
2cc6d4f
fix(app): drop model details tooltip from the composer model chip (#5…
opencode-agent[bot] Oct 27, 2026
84f757a
chore(console): remove unused dependencies (#59715)
rekram1-node Oct 27, 2026
86cd210
chore(stats): remove unused @cloudflare/workers-types (#59717)
rekram1-node Oct 27, 2026
cb9ccda
chore: update nix node_modules hashes (#59724)
github-actions[bot] Oct 27, 2026
1dab9ae
chore(plugin): remove unused @tsconfig/node22 (#59718)
rekram1-node Oct 27, 2026
28ed9f8
chore(session-ui): remove unused @solidjs/meta (#59716)
rekram1-node Oct 27, 2026
6dde272
chore(gui-plugins): remove unused dependencies (#59714)
rekram1-node Oct 27, 2026
d76552c
chore(app): remove unused @solid-primitives/scheduled (#59713)
rekram1-node Oct 27, 2026
f7d0ce1
chore: remove unused root dependencies (#59712)
rekram1-node Oct 27, 2026
3a409f4
fix(app): keep rendering when tool metadata is not an object (#59736)
neriousy Oct 27, 2026
2ed5743
fix(codemode): explain a stalled program and point at the await that …
rekram1-node Oct 27, 2026
17837a2
fix(core): apply webfetch URL rules to redirect targets (#59748)
rekram1-node Oct 27, 2026
427c27a
chore(deps): refresh zod in lockfile (#59746)
rekram1-node Oct 27, 2026
5aeac4f
chore(deps): refresh devalue in lockfile (#59745)
rekram1-node Oct 27, 2026
f90e04c
chore(deps): refresh brace-expansion in lockfile (#59737)
rekram1-node Oct 27, 2026
1d12835
chore(deps): refresh undici in lockfile (#59738)
rekram1-node Oct 27, 2026
581561c
chore(deps): refresh js-yaml in lockfile (#59739)
rekram1-node Oct 27, 2026
70ef02a
chore(deps): refresh ip-address in lockfile (#59740)
rekram1-node Oct 27, 2026
f930aa8
chore(deps): refresh postcss-selector-parser in lockfile (#59741)
rekram1-node Oct 27, 2026
6e97811
chore(deps): refresh http-cache-semantics in lockfile (#59742)
rekram1-node Oct 27, 2026
fd8268e
chore(deps): refresh smol-toml in lockfile (#59743)
rekram1-node Oct 27, 2026
f4ecbf3
chore(process-daemon): publish from the monorepo (#59695)
jlongster Oct 27, 2026
5f394f6
feat(process-daemon): support a private Unix socket directory (#59697)
jlongster Oct 27, 2026
f5cac12
fix(process-daemon): block subscriptions instead of polling (#59698)
jlongster Oct 27, 2026
c250c27
chore(deps): refresh source-map-js in lockfile (#59744)
rekram1-node Oct 27, 2026
6abf95b
chore: update nix node_modules hashes (#59728)
github-actions[bot] Oct 27, 2026
426c7d8
fix(ci): sign macOS builds with release environment credentials (#59760)
thdxr Oct 27, 2026
14e378b
fix(update): only apply minimum versions on stable channels (#59761)
thdxr Oct 27, 2026
45b53fe
fix(changelog): keep line breaks in code blocks (#59762)
opencode-agent[bot] Oct 27, 2026
891a020
fix(ci): import passwordless macOS signing certificate (#59768)
thdxr Oct 27, 2026
f0160a1
refactor(process-daemon): route stop and ownership through Control (#…
jlongster Oct 28, 2026
0610a81
fix(process-daemon): wait for readiness instead of polling (#59701)
jlongster Oct 28, 2026
86ce19d
fix(process-daemon): poll every 25 ms on Windows (#59702)
jlongster Oct 28, 2026
0416987
feat(ai): make provider model() settings optional and rename configur…
rekram1-node Oct 28, 2026
fc6922f
chore(core): remove bundled cohere, vercel and perplexity AI SDK pack…
rekram1-node Oct 28, 2026
9adc42b
chore(deps): bump zod to 4.6.7 (#59763)
rekram1-node Oct 28, 2026
fa1260d
fix(tui): send pasted image and PDF paths to local servers (#59833)
rekram1-node Oct 28, 2026
587f2cb
fix(stats): show the current language in the footer select (#59772)
opencode-agent[bot] Oct 28, 2026
62ae125
fix(stats): ignore requests rejected before routing (#59773)
opencode-agent[bot] Oct 28, 2026
d6867f2
fix(stats): dismiss mobile chart tooltips on scroll-away and outside …
opencode-agent[bot] Oct 28, 2026
950111f
feat(app): simplify composer model labels (#59735)
usrnk1 Oct 28, 2026
b94a305
fix(gui-plugins): align file tree guides with chevrons (#59884)
usrnk1 Oct 28, 2026
ecf1d36
fix(app): stop side panel close from restyling the whole transcript (…
usrnk1 Oct 28, 2026
3d7eceb
fix(desktop): regenerate macOS icon sizes without edge halo (#59900)
opencode-agent[bot] Oct 28, 2026
1e7ba46
fix(app): polish recently closed files (#59876)
usrnk1 Oct 28, 2026
8d083cb
fix(tui): pad the empty /usage dialog message (#59918)
Tarquinen Oct 28, 2026
d1bd20f
fix(ui): show panel toggle tooltip when expanded (#59894)
usrnk1 Oct 28, 2026
8c2e163
fix(core): skip image models without an image package (#59926)
rekram1-node Oct 28, 2026
4d33928
chore(process-daemon): release 0.3.2 under the @opencode scope (#59879)
jlongster Oct 28, 2026
c96d200
fix(codemode): report parse errors with a location and a hint (#59834)
rekram1-node Oct 28, 2026
4aba9a6
chore(deps): bump vite to 7.3.7 (#59828)
rekram1-node Oct 28, 2026
b6c43a5
chore(deps): bump vite to 8.2.4 (#59830)
rekram1-node Oct 28, 2026
35a4a68
feat(app): add /reload to reload configuration (#59887)
opencode-agent[bot] Oct 28, 2026
629d9e2
docs(console): document Go Teams and the billing drawer (#59960)
adamdotdevin Oct 28, 2026
f822b10
feat(app): opt into experimental-media-uri and keep draft media bytes…
kitlangton Oct 28, 2026
06d3c06
docs(go): list MiniMax M3's price above 512K tokens (#59964)
vimtor Oct 28, 2026
45713a3
feat(ai): freeform tools (#59963)
rekram1-node Oct 28, 2026
71d3556
fix(tui): show spinner while a continued subagent runs (#59950)
rekram1-node Oct 28, 2026
506ac20
fix(ai): request inline image bytes by default (#59947)
rekram1-node Oct 28, 2026
7461d15
feat(ai): add MiniMax image generation (#59929)
rekram1-node Oct 28, 2026
a882cf9
feat(codemode): let extension globals return Effects (#59948)
rekram1-node Oct 28, 2026
da702a8
fix(core): leave headroom when fitting output to the context window (…
neriousy Oct 28, 2026
dd35fbc
feat(ai): Responses routes for OpenRouter, DigitalOcean and Venice (#…
rekram1-node Oct 28, 2026
dfa6329
refactor(ai): remove fal, Black Forest Labs, Replicate and Stability …
rekram1-node Oct 28, 2026
3364bf5
feat(ai): add test clients for image, video, speech, transcription an…
rekram1-node Oct 28, 2026
ced73dc
feat(ai): expose compaction on the Promise client (#59987)
rekram1-node Oct 28, 2026
6f80292
fix(app): calmer background shell pill (#59480)
kitlangton Oct 28, 2026
4585c31
feat(core): scheduled tasks storage and time triggers (experimental) …
kitlangton Oct 28, 2026
651032b
feat(app): fold long user messages behind an experimental setting (#5…
kitlangton Oct 28, 2026
711802c
fix(codemode): let search be awaited or chained like a Promise (#59981)
rekram1-node Oct 28, 2026
a97dc23
chore(web): upgrade docs site to astro 7 (#59845)
rekram1-node Oct 28, 2026
97fd7ac
feat(app): show a background shell's output from the pill (#59496)
kitlangton Oct 28, 2026
b799259
feat(theme): lay out migrated V1 themes on opencode2 steps under new …
jlongster Oct 28, 2026
76243df
chore(deps): bump hono to 4.13.13 (#60022)
rekram1-node Oct 28, 2026
1c49e51
fix(codemode): run extension before hooks before the host call (#60024)
rekram1-node Oct 28, 2026
410644a
fix(ai): document Bedrock Mantle base URL per model (#59990)
rekram1-node Oct 28, 2026
fe04f0e
fix(app): treat the reachable end as the end under desktop zoom (#60034)
Hona Oct 28, 2026
9a9386e
refactor(client): group experimental SDK methods under client.experim…
kitlangton Oct 28, 2026
c63a939
docs(console): note that Go Teams starts with Extra Usage on (#60043)
adamdotdevin Oct 28, 2026
0e10290
fix(core): tell agents they can message running subagents (#60045)
rekram1-node Oct 28, 2026
77a0fd6
fix(app): always list OpenCode free models in the model picker (#60047)
Hona Oct 28, 2026
f43563b
fix(theme): give migrated V1 dialogs an opaque background (#60016)
jlongster Oct 29, 2026
8de0323
feat(core): add /goal with a client-side done check (#59437)
neriousy Oct 29, 2026
e85207b
chore(deps): bump katex to 0.18.11 (#60037)
rekram1-node Oct 29, 2026
01abece
chore(deps): bump @ai-sdk/provider-utils to 4.0.62 (#60036)
rekram1-node Oct 29, 2026
c5d9c30
fix(core): stop merging credential metadata into model settings (#60057)
rekram1-node Oct 29, 2026
7c47eb7
fix(session-ui): stop shell text showing through the copy button (#59…
opencode-agent[bot] Oct 29, 2026
89f3ac1
feat(core): add image_generate tool (#59939)
rekram1-node Oct 29, 2026
9039a2a
chore: add Hona as GUI plugin SDK codeowner (#60071)
Hona Oct 29, 2026
aaa0d7c
fix(core): tell Code Mode models built-in tools stay top-level (#57627)
rekram1-node Oct 29, 2026
78c31ea
fix(ai): send image sizes the way OpenRouter, Vercel Grok and Google …
rekram1-node Oct 29, 2026
6a0acd1
fix(tui): show execution failures that happen before any step (#60079)
rekram1-node Oct 29, 2026
27641b3
fix(ai): send OpenRouter image edits as input references (#60067)
rekram1-node Oct 29, 2026
eb06c3c
feat(app): redesign the integrations dialog (#59976)
arvsrn Oct 29, 2026
085a891
feat(ai): load Meta Muse Image through a meta/images entrypoint (#60081)
rekram1-node Oct 29, 2026
fbb47c9
feat(core): schedule prompts from agents, /schedule and the experimen…
kitlangton Oct 29, 2026
d142014
feat(core): offer gpt-image-2 on the Codex login (#60085)
rekram1-node Oct 29, 2026
2f3e56d
fix(core): rewrite the image_generate description (#60090)
rekram1-node Oct 29, 2026
5c0376f
fix(app): let a plugin server's event stream follow its endpoint (#60…
Hona Oct 29, 2026
a9caf6d
feat(app): make the new model picker the default (#59997)
arvsrn Oct 29, 2026
f023f7c
feat(core): make image_generate opt-in with one experimental config f…
rekram1-node Oct 29, 2026
79349e8
chore: update nix node_modules hashes (#59827)
github-actions[bot] Oct 29, 2026
3ebcf9a
release: v2.2.1
github-actions[bot] Oct 29, 2026
feeff2a
chore(sync): merge upstream v2 through v2.2.1
cursoragent Oct 29, 2026
50d9e68
fix(core): drop duplicate Job import after upstream merge
cursoragent Oct 29, 2026
58d2deb
fix(process-daemon): restore npm package version to 0.3.2
cursoragent Oct 29, 2026
76a7040
chore(ci): drop upstream process-daemon release workflow
cursoragent Oct 29, 2026
69b43a7
chore(ci): drop process-daemon check workflow
cursoragent Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
packages/app/ @Hona @Brendonovich
packages/desktop/ @Hona @Brendonovich

# GUI plugin SDK
# changes here must be meticulous - pls chat first :)
packages/plugin/src/gui/ @Hona

# CI and releases. Release jobs that hold secrets run only .github/workflows/release.yml and .github/release/,
# which makes this path the release security boundary.
/.github/ @anomalyco/releasers
6 changes: 3 additions & 3 deletions .github/release/sign-desktop-macos.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# notarizes them in one submission, staples them, and only then builds opencode-desktop-mac-<arch>.{zip,dmg,app.tar.gz}
# from the stapled apps. Dry runs sign ad-hoc and skip notarization. Dev and beta trade larger files for faster
# packaging (zip and dmg at zlib level 1) and skip the .app.tar.gz, which only the retired Tauri updater feed read.
# Notarization reads APPLE_API_KEY_CONTENT, APPLE_API_KEY_ID and APPLE_API_ISSUER.
# Notarization reads APPLE_NOTARY_KEY (the .p8 contents), APPLE_NOTARY_KEY_ID and APPLE_NOTARY_ISSUER_ID.
# shellcheck source-path=SCRIPTDIR
# shellcheck source=lib.sh
. "$(dirname "$0")/lib.sh"
Expand Down Expand Up @@ -62,9 +62,9 @@ done

if ! dry_run; then
key=$(mktemp)
printf '%s\n' "$APPLE_API_KEY_CONTENT" > "$key"
printf '%s\n' "$APPLE_NOTARY_KEY" > "$key"
ditto -c -k --sequesterRsrc "$apps" "$apps.zip"
xcrun notarytool submit "$apps.zip" --key "$key" --key-id "$APPLE_API_KEY_ID" --issuer "$APPLE_API_ISSUER" \
xcrun notarytool submit "$apps.zip" --key "$key" --key-id "$APPLE_NOTARY_KEY_ID" --issuer "$APPLE_NOTARY_ISSUER_ID" \
--wait --timeout 60m --output-format json > "$apps.json"
rm -f "$key"
cat "$apps.json"
Expand Down
27 changes: 27 additions & 0 deletions .oxlintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,33 @@
}
]
}
},
{
"files": ["packages/codemode/src/interpreter/**", "packages/codemode/src/stdlib/**"],
"rules": {
"no-restricted-imports": [
"error",
{
"paths": [
{
"name": "effect",
"allowTypeImports": true,
"message": "The evaluator and built-ins are plain generators driven by the job queue in runner.ts. Start host work with runner.host or block on it with runner.blocking; only runner.ts, execute.ts, and extensions.ts run Effects."
}
]
}
]
}
},
{
"files": [
"packages/codemode/src/interpreter/runner.ts",
"packages/codemode/src/interpreter/execute.ts",
"packages/codemode/src/interpreter/extensions.ts"
],
"rules": {
"no-restricted-imports": "off"
}
}
],
"ignorePatterns": [
Expand Down
17 changes: 17 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ identity facts when merging or refactoring:
- The script discovers the server with `shuvcode service status`, injects its private local credential from `shuvcode service get password`, and uses the `dev` TUI storage channel so tabs and other client-local state match the installed client.
- Prefer `dev:live` over plain `bun run dev` for this workflow. An implicit managed-service connection may replace the live server when the worktree client version differs; explicit `--server` warns and continues without replacing it.

## Live Desktop Diagnostics

- When attaching Playwright to a running desktop app, use `chromium.connectOverCDP(endpoint, { noDefaults: true })`.
- Without `noDefaults`, Playwright applies light-mode media emulation during attachment. An app following the system theme then flashes light until the connection closes. The option also preserves the existing focus and other media preferences.
- Do not emulate a color scheme or reduced-motion preference on the user's live window unless explicitly requested; use an isolated test context for those scenarios.

## V2 TUI Stories

- When a user asks for a TUI story, add a fixture-driven story under `packages/tui/src/feature-plugins/system/storybook` and register it in `index.tsx`.
Expand Down Expand Up @@ -202,6 +208,17 @@ const table = sqliteTable("session", {
})
```

### Experimental API

- An experimental endpoint lives at `/api/experimental/<group>/...`, its OpenAPI identifier is `experimental.<group>.<method>`, and it lands in the SDK as `client.experimental.<group>.<method>`. Its description says "Experimental: may change without compatibility guarantees."
- `packages/protocol/test/experimental-identifiers.test.ts` enforces the path and identifier match in both directions; the SDK namespace follows from the path.
- An experimental field or parameter on a stable endpoint goes under an `experimental` key (`experimental.<name>`), the same way config does (`config.experimental.*`).
- New endpoints and new default behaviors start experimental.
- To graduate one, move the route out of `/api/experimental`, drop the `experimental.` prefix, and note it in `CHANGELOG.md`.
- Experimental HTTP routes change without aliases: rename or remove the route, then update the callers.
- A breaking move of shipped SDK or plugin API (including moving it under `experimental`) keeps the old path and type names as deprecated aliases of the new ones until the next minor, each marked `@deprecated` with the replacement and "Removed in the next minor". Generated SDK moves get them from the codegen (`compile(..., { aliases: true })` in `packages/client/script/generate.ts`), not by hand.
- Experimental plugin hooks are named `experimental.*` (`experimental.ws.handshake`).

## Testing

- Avoid mocks as much as possible, you shouldn't be using globalThis.\* at all unless it's the only option.
Expand Down
93 changes: 93 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,99 @@

Release notes for OpenCode V2, newest first.

## v2.2.1 — 2026-10-29

### Highlights

- **Keep Working Toward a Goal**: Run `/goal <objective>` in the TUI or Desktop to let the session continue until a reviewer confirms the objective is met. Use `/goal pause`, `/goal resume`, or `/goal clear` to control it. ([#59437](https://github.com/anomalyco/opencode/pull/59437))
- **Generate Images**: Enable `experimental.image_generate` to let agents create or edit images with the new `image_generate` tool. You can optionally set its default model with `experimental.image_generate.model`. ([#59939](https://github.com/anomalyco/opencode/pull/59939), [#60096](https://github.com/anomalyco/opencode/pull/60096))
- **Inspect Background Shells**: Click a running shell in the Desktop activity pill to see its live output and stop it without leaving the menu. ([#59496](https://github.com/anomalyco/opencode/pull/59496))
- **New Default Model Picker**: Search favorites, recent models, providers, and variants from the redesigned model picker, which is now the default in Desktop. ([#59997](https://github.com/anomalyco/opencode/pull/59997))

### Breaking changes

#### `@opencode/ai` provider removals and renames

These changes affect code that imports `@opencode/ai` directly. They don't change the CLI, Desktop, or the HTTP API.

- The fal, Black Forest Labs, Replicate, and Stability providers are removed, along with their `./providers/fal`, `./providers/black-forest-labs`, `./providers/replicate`, and `./providers/stability` entry points. ([#59977](https://github.com/anomalyco/opencode/pull/59977))
- Five legacy entry points are removed. Import the nested paths instead, which 2.2.0 already exports: `./providers/amazon-bedrock-mantle` → `./providers/amazon-bedrock/mantle`, and `./providers/google-vertex-chat`, `-interactions`, `-mistral`, and `-responses` → `./providers/google-vertex/chat`, `/interactions`, `/mistral`, and `/responses`. ([#59506](https://github.com/anomalyco/opencode/pull/59506))
- Each provider's `configure()` input type is now named `Config`, for example `Groq.LanguageModelOptions` → `Groq.Config`, and `model()` settings are optional when every setting is optional. ([#59765](https://github.com/anomalyco/opencode/pull/59765))

### Core

#### Improvements

- Add `/goal <objective>` with pause, resume, and clear controls, plus automatic progress review until the objective is met. ([#59437](https://github.com/anomalyco/opencode/pull/59437))
- Add opt-in scheduled prompts through `/schedule`, agent tools, and `experimental.schedules`. ([#59401](https://github.com/anomalyco/opencode/pull/59401), [#59457](https://github.com/anomalyco/opencode/pull/59457))
- Add the opt-in `image_generate` tool for background image creation and editing, with automatic or configured model selection. ([#59939](https://github.com/anomalyco/opencode/pull/59939), [#60096](https://github.com/anomalyco/opencode/pull/60096))
- Offer GPT Image 2 after Codex sign-in and add MiniMax and Meta Muse image generation support. ([#60085](https://github.com/anomalyco/opencode/pull/60085), [#59929](https://github.com/anomalyco/opencode/pull/59929), [#60081](https://github.com/anomalyco/opencode/pull/60081))
- Add Responses API support for OpenRouter, DigitalOcean, and Venice, including freeform tools. ([#59991](https://github.com/anomalyco/opencode/pull/59991), [#59963](https://github.com/anomalyco/opencode/pull/59963))
- Improve snapshot performance by coalescing captures and avoiding repeated ignore-file work. ([#59419](https://github.com/anomalyco/opencode/pull/59419))

#### Bug fixes

- Preserve more context headroom when fitting tool output into the context window. ([#59934](https://github.com/anomalyco/opencode/pull/59934))
- Retry provider throttling correctly instead of reporting it as context overflow. ([#59649](https://github.com/anomalyco/opencode/pull/59649))
- Send image-edit references and image sizes in the formats expected by OpenRouter, Google, and Vercel Grok. ([#60067](https://github.com/anomalyco/opencode/pull/60067), [#59927](https://github.com/anomalyco/opencode/pull/59927))
- Keep credential metadata and prompt-cache settings out of model settings and variants. ([#60057](https://github.com/anomalyco/opencode/pull/60057), [#59500](https://github.com/anomalyco/opencode/pull/59500))
- Keep Git snapshots working in repositories that use a split index. ([#59417](https://github.com/anomalyco/opencode/pull/59417))
- Expose Console web search only when the workspace enables it. ([#59592](https://github.com/anomalyco/opencode/pull/59592))
- Improve Code Mode diagnostics for parse errors, stalled awaits, and promise-like search results. ([#59834](https://github.com/anomalyco/opencode/pull/59834), [#59749](https://github.com/anomalyco/opencode/pull/59749), [#59981](https://github.com/anomalyco/opencode/pull/59981))

### TUI

#### Improvements

- Show `/goal` status below the prompt and provide a dialog for pausing, resuming, or clearing it. ([#59437](https://github.com/anomalyco/opencode/pull/59437))

#### Bug fixes

- Show execution failures that occur before the first model step. ([#60079](https://github.com/anomalyco/opencode/pull/60079))
- Keep the activity spinner visible while a continued subagent runs. ([#59950](https://github.com/anomalyco/opencode/pull/59950))
- Send pasted image and PDF paths correctly when connected to a local server. ([#59833](https://github.com/anomalyco/opencode/pull/59833))
- Improve spacing in an empty `/usage` dialog. Thanks [@Tarquinen](https://github.com/Tarquinen). ([#59918](https://github.com/anomalyco/opencode/pull/59918))

### Desktop

#### Improvements

- Add `/reload` to reload configuration without restarting. ([#59887](https://github.com/anomalyco/opencode/pull/59887))
- Make the redesigned searchable model picker the default, with dedicated Favorites and Recent sections and keyboard-accessible provider controls. ([#59997](https://github.com/anomalyco/opencode/pull/59997))
- Show live output and a Stop action when you select a background shell from the activity pill. ([#59496](https://github.com/anomalyco/opencode/pull/59496))
- Show `/goal` state and actions in a composer pill. ([#59437](https://github.com/anomalyco/opencode/pull/59437))
- Redesign the integrations dialog and always include OpenCode free models in the model picker. ([#59976](https://github.com/anomalyco/opencode/pull/59976), [#60047](https://github.com/anomalyco/opencode/pull/60047))
- Add project, worktree, open-in-app, and terminal actions to the session location menu. ([#59607](https://github.com/anomalyco/opencode/pull/59607))
- Refine project and worktree selection, command search, prompt-history focus, composer model labels, and artifact preview controls. ([#59397](https://github.com/anomalyco/opencode/pull/59397), [#59604](https://github.com/anomalyco/opencode/pull/59604), [#59626](https://github.com/anomalyco/opencode/pull/59626), [#59735](https://github.com/anomalyco/opencode/pull/59735), [#59657](https://github.com/anomalyco/opencode/pull/59657))
- Highlight quoted timeline content while you write its first comment. ([#59286](https://github.com/anomalyco/opencode/pull/59286))
- Keep draft attachment bytes local when using experimental media URIs. ([#59104](https://github.com/anomalyco/opencode/pull/59104))

#### Bug fixes

- Follow each plugin server’s configured endpoint when connecting to its event stream. ([#60087](https://github.com/anomalyco/opencode/pull/60087))
- Treat the reachable scroll boundary as the end when Desktop zoom is active. ([#60034](https://github.com/anomalyco/opencode/pull/60034))
- Prevent shell text from showing through copy buttons and avoid restyling the transcript when closing a side panel. ([#59901](https://github.com/anomalyco/opencode/pull/59901), [#59878](https://github.com/anomalyco/opencode/pull/59878))
- Keep rendering malformed tool metadata instead of crashing the timeline. ([#59736](https://github.com/anomalyco/opencode/pull/59736))
- Make dropdowns open immediately and keep the new-session location shortcut working after tooltip interactions. ([#59268](https://github.com/anomalyco/opencode/pull/59268), [#59680](https://github.com/anomalyco/opencode/pull/59680))
- Remove edge halos from macOS application icons. ([#59900](https://github.com/anomalyco/opencode/pull/59900))

### SDK

#### Improvements

- Add `client.experimental.schedule.{create,list,get,pause,resume,delete}` for managing scheduled prompts. ([#59457](https://github.com/anomalyco/opencode/pull/59457))
- Group experimental generated-client methods under `client.experimental`; previous locations remain as deprecated aliases until the next minor release. ([#59072](https://github.com/anomalyco/opencode/pull/59072))
- Expose compaction through the Promise AI client. ([#59987](https://github.com/anomalyco/opencode/pull/59987))
- Add freeform tool support and Responses routes for OpenRouter, DigitalOcean, and Venice. ([#59963](https://github.com/anomalyco/opencode/pull/59963), [#59991](https://github.com/anomalyco/opencode/pull/59991))

### Extensions

#### Improvements

- Add the experimental `experimental.idle` Session hook so plugins can continue work before a session goes idle. ([#59437](https://github.com/anomalyco/opencode/pull/59437))
- Let Code Mode extension globals return Effects and declare required services. ([#59948](https://github.com/anomalyco/opencode/pull/59948))
- Add custom composer-pill popovers for GUI plugins. ([#59437](https://github.com/anomalyco/opencode/pull/59437))

## v2.2.0 — 2026-10-27

### Highlights
Expand Down
Loading
Loading