Repository navigation
v2.2.3
Highlights
- Use Claude Code in OpenCode: Install Claude Code, run
claude auth login, then select Claude Agent in/connectto use your Claude Code login and models. (#58782) - Faster Long Sessions in Desktop: Streaming replies and long conversations now do much less rendering work. (#60489, #60521, #60513, #60481)
- Desktop Stability Fixes: Fixes side-panel tabs, repeated "Session not found" toasts, and Open file over HTTP. (#60430, #60436, #60459, #60462)
Breaking changes
@opencode/ai experimental media and one tool()
These changes affect code that imports @opencode/ai directly. They don't change the CLI, Desktop, or the HTTP API.
- Speech, transcription, video, and their clients and types moved from
@opencode/ai/effectto@opencode/ai/experimental. On the Promise client, useai.experimental.speech,ai.experimental.transcription, andai.experimental.video.TestSpeech,TestTranscription, andTestVideomoved to@opencode/ai/experimental/testing. (#60484) - Both clients build tools with
tool(...), which replacesAI.toolandTool.make, andtesting.toolis nowtesting.toolCall. (#60407)
TUI plugins require OpenTUI 0.8
@opencode/plugin now requires @opentui/core and @opentui/solid 0.8.0 or later. In OpenTUI 0.8, a ScrollBox's wrapper, viewport, content, and scrollbars are facade objects instead of renderables, and a custom RenderContext must implement clock and onAnimationTick. See the OpenTUI 0.8.0 release notes. (#60385)
Managed policy: integration.use covers integrations only
integration.use now controls which integration accounts can be used, and the new mcp.use, skill.use, and plugin.use actions control MCP servers, skills, and plugins. Rules with the old mcp:, skill:, and plugin: resource prefixes are converted automatically, but a bare integration.use rule no longer applies to MCP servers, skills, or plugins. (#60315)
Core
Improvements
- Added the built-in Claude Agent provider. Install Claude Code, run
claude auth login, and select Claude Agent in/connect;OPENCODE_CLAUDE_PATHcan override the Claude executable. Thanks @Tarquinen. (#58782) - Added Code Mode JavaScript checks to experimental schedules, including statically authorized tool calls, persistent state, and custom wake messages. (#60140)
- Added separate managed-policy actions for connecting to integrations and using integrations, MCP servers, skills, and plugins. (#60315)
Bug fixes
- Preserved plugin-provided model variants and delayed dynamic provider fallback until external SDK hooks have run. (#60097, #60380)
- Preserved permission reasons and feedback in MCP failures, and made Code Mode failures match direct tool-call failures. (#60102, #60109)
- Fixed invalid Code Mode schedule checks so creation fails immediately and existing invalid checks pause without repeated execution. (#60349)
- Removed a session’s persistent terminals when the session is deleted. (#60322)
- Kept nested tool progress from replacing the parent
executecall rows. (#60480)
TUI
Improvements
- Added lazy loading for stored image references when
experimental.media_blobis enabled. Images are downloaded only for previews, while undo, revert, fork, and prompt recall restore referenced attachments safely. (#60116) - Added a distinct marker for the selected composer suggestion in the new designs. (#60393)
Bug fixes
- Fixed PHP syntax highlighting for code blocks without an opening
<?phptag. (#60359) - Preserved
#in file-search paths unless it introduces a valid line range. (#60336) - Kept the configured default cursor style after config reloads. (#60302)
- Matched the search cursor to the highlighted row when a selection dialog has no query. (#60310)
Desktop
Improvements
- Added a Desktop spellcheck toggle under Settings → General and system-language dictionary selection on Windows and Linux. (#59129)
- Added
PageUpandPageDowntimeline paging from the composer without moving the draft cursor or focus. (#59426) - Added independently configurable question notifications and sounds under Settings → Notifications → Questions. Thanks @YuriNek0. (#60358)
- Added separate project and worktree actions to the new-session control. (#60486)
- Added one-click version copying in Settings → About. (#52356)
- Grouped added projects in workspace settings. (#60221)
- Made question-answer text selectable. (#60372)
- Adapted the session header to narrow timeline widths. (#59512)
Bug fixes
- Side-panel tabs close again and New tab launchers respond to clicks, fixing a 2.2.2 regression. (#60430, #60436)
- Open file in the side panel works again in the web app over HTTP. (#60462)
- Kept question options and submit controls reachable on mobile. (#60335)
- Preserved simultaneous request notifications and inbox scroll position when opening sessions. (#60378, #60356)
- Fixed consecutive dropped files so every file mention is inserted into the composer. (#60463)
- Kept the current
@and command-menu selection stable while results update under a stationary pointer. (#59434, #60368) - Fixed
⌘Wside-panel closing and focus restoration when no closable tabs remain. (#59002, #60435) - Kept the mobile session drawer open while a session loads. (#59427)
- Restored maximized windows on their saved display and retained renderer permissions across shared-session windows. (#60482, #60458)
- Fixed timeline growth, zoom-end scrolling, highlighting, and DOM-observer performance issues in long sessions. (#60489, #60481, #60488, #60513, #60521)
- Kept models with unknown release dates visible. Thanks @joe-ieta. (#60496)
- Fixed reasoning-capability detection for models that expose reasoning through variants or compatibility metadata. (#60457)
- Evicted deleted sessions after a
404instead of retrying or showing repeated errors. (#60459) - Fixed the macOS application icon and added the required folder-access description to the app bundle. (#60020, #60503)
SDK
Improvements
- Preserved partial
LLMResponseoutput onAIError.partialwhen generation, object generation, or a tool loop fails. (#60477) - Unified Effect and Promise tool declarations around
tool(...), with optional output schemas and executable or declaration-only tools. (#60407) - Added typed OpenRouter
debug,models,plugins,provider, anduseroptions to the Responses route. (#60044) - Added
withMediaRefs,mediaHashFromUri, andMediaRequestOptionsto the Promise client for experimental stored-media references. (#60116)
Bug fixes
- Matched the Promise AI client more closely to the Effect API and accepted typed tools in loops. (#60465, #60390)
- Kept tools whose
executehandler can throw available to the AI client. (#60431) - Continued polling queued media generations when providers return unknown intermediate statuses. (#59988)
- Stopped sending an incompatible
filenamealongsidefile_urlon OpenAI Responses requests. (#60382)
Extensions
Improvements
- Added persistent-terminal renaming to the process daemon, including capability discovery and user titles that override shell-provided titles until cleared. (#60324)
Bug fixes
- Preserved
nullvalues in Code Mode text encoding. Thanks @xiajiahang. (#57639) - Tidied nested Extensions menus. (#59468)