opencode v2.1.0 ships persistent Windows PTYs and TUI todo lists, and renames provider replay data to `native` across the SDK and plugin contracts
v2.1.0 published on @opencode/cli on October 20, 2026 — the first minor bump of the v2 line, again with no GitHub release page — so this article reads the official changelog entry at opencode.ai/changelog (fetched 2026-10-21). It bundles three headline features with a single deliberate breaking-changes refactor (#57260).
Highlights: Windows PTYs, TUI todos, and commands that outlive Bun’s deadline
Persistent terminals on Windows: Windows x64 and ARM64 get persistent PTYs, matching the macOS/Linux workflow (#56245). Todo lists in the TUI: enabled with { "experimental": { "todo": true } }, task lists render in the session, compact cards, and the sidebar; the todowrite tool returns behind the same flag, accepting { todos: [{ content, status }] } (#56947). Long-running TUI commands: plugin commands, shell calls, and requests that used to hit Bun’s five-minute fetch deadline now keep running to completion (#55149).
The breaking part: replay data is “native” now
One intentional refactor (#57260) renames the same concept across the SDK, the HTTP message/event stream, and plugin contracts: state becomes native on text/reasoning parts and their lifecycle events (and on session.tool.called); providerState becomes native on assistant/compaction messages, on session.step.ended/session.step.failed/session.compaction.ended, and on plugin compaction hook results; resultState becomes native on tool success/failure events; the exported schema type SessionMessage.ProviderState becomes SessionMessage.Native. A tool’s execution state and UI metadata are separate and are not renamed. Tool calls and results now share one optional tool.native (replacing providerState/providerResultState), and replay matches provider/model ID rather than provenance. Beyond the renames: Credential.Key.configuration is removed in favor of metadata for setup answers; new summary compactions reference kept messages via metadata.keepID (recent removed) and store provider compaction windows in native.messages (providerContext removed); and the session.compacted event is gone in favor of session.compaction.started/ended. The changelog states that stored sessions, credentials, and older imports remain readable through compatibility decoders — no database migration.
Also in 2.1.0
Session archiving returns with filtering and restore (#53759). Saved permission actions and resource patterns become editable after the fact (#56659). Summary compaction now covers the whole conversation, keeps recent text verbatim, and starts earlier (#57091). A new streamUsage model compatibility option turns off stream_options for providers that reject it (#57255). In the TUI, /models opens on the current model and preserves the server’s preferred order (#57151). In the SDK, Gemini Live joins client.voice.session(...) for gemini-3.8-live* models over WebSocket, authenticated with a stored Google key or GEMINI_API_KEY / GOOGLE_GENERATIVE_AI_API_KEY / GOOGLE_API_KEY (#56888); client.permission.saved.update(...) changes a saved permission’s action or resource (#56659); archive filtering arrives in client.session.list(...) (#53759); and plugin authors get a paginated ctx.session.list(...) in both Effect and Promise APIs (#56264).
v2.1.1 followed the same day
npm’s latest moved to 2.1.1 at 13:33 UTC the same day (published 2026-10-20). It has no changelog entry yet (checked 2026-10-21), so the facts here come only from the repository’s v2.1.0…v2.1.1 compare and npm, and nothing further is claimed: the new-design TUI wave lands — model switcher, settings and export dialogs, session export dialog, a free-model picker, and setting descriptions (#56093 through #56100) — plus a fix that builds provider variants after package normalization (#57075) and server-wide broadcast of models.dev catalog refreshes (#57148).
source: https://opencode.ai/changelog