Releases: docker/docker-agent
Release list
v1.98.0
This release adds several new TUI features including an interactive getting-started tour, an effort picker dialog, and Lean Mode support in the agent picker, along with stability fixes for startup, shutdown, and proxy recovery.
What's New
- Adds an interactive getting-started tour offered on first run and replayable on demand, implemented as a floating card that observes the real UI's message stream
- Opens an effort picker dialog when
/effortis used with no argument, instead of printing a usage hint - Adds a Lean Mode checkbox to the agent picker panel, toggleable with the
lkey or mouse click - Agent picker now discovers
~/.agentsconfig files (.yaml,.yml,.hcl) when no explicit list is given, in addition to the built-indefaultandcoderagents - Adds cross-process locking and atomic writes for SQLite memory storage
Bug Fixes
- Fixes toolset
Startduring startup so the sidebar tools spinner can no longer animate forever when Docker is wedged - Fixes TUI exit being blocked by a wedged resource cleanup
- Fixes
--recordproxy bypassing the configured models gateway, which caused HTTP 401 errors when gateway-managed credentials were expected - Hardens gateway forwarding in record mode against credential leakage
- Fixes proxy recovery after cooldown — previously a socket error would permanently latch the transport to direct connections for the lifetime of the process
- Fixes
/toolsdialog showing Go type names (e.g.*skills.ToolSet) instead of human-readable names for loader-created toolsets - Fixes telemetry incorrectly recording an error on a chat span after a successful LLM completion
- Fixes agent picker hardening: windowing, escapes, FIFO skip, sentinel, and description guard
- Keeps agent picker panel geometry stable and windowing math in sync
Technical Changes
- Fixes flaky frame synchronization in TUI test driver
sendSync - Fixes file descriptor double-close corrupting parallel tests in
TestListen_FD - Guards
fdOwnershipPinwith a mutex to fix a data race in server tests - Trims comments in the fallback transport
What's Changed
- test: fix flaky tuitest frame sync and TestListen_FD fd double-close by @dgageot in #3420
- fix: bound toolset startup and never block the TUI exit when Docker is wedged by @dgageot in #3423
- docs: update CHANGELOG.md for v1.97.0 by @docker-read-write[bot] in #3424
- feat(tui): open effort picker when /effort has no argument by @Sayt-0 in #3425
- fix: route --record proxy through the configured models gateway by @dgageot in #3428
- docs: sync documentation with recent merges by @aheritier in #3430
- feat(tui): interactive getting-started tour on first run, replayable on demand by @Sayt-0 in #3427
- fix: show proper toolset names in /tools dialog for loader-created toolsets by @dgageot in #3441
- feat(memory): add cross-process locking and atomic writes for sqlite by @yunasora in #3114
- fix(remote): recover proxy after cooldown instead of latching to direct by @trungutt in #3431
- telemetry: don't record error on chat span after successful LLM completion by @jedp-docker in #3281
- feat(picker): add Lean Mode checkbox to agent picker by @dgageot in #3443
- feat: agent picker discovers ~/.agents configs when no list is given by @dgageot in #3444
New Contributors
Full Changelog: v1.97.0...v1.98.0
v1.97.0
This release adds global hook support in user config, expands environment variable references in hook and script-shell fields, and fixes hook field merging.
What's New
- Adds support for global hooks in user config (
~/.config/cagent/config.yaml), with hooks merged in order: agent config → global → CLI - Adds
${env.X}expansion in hook and script-shellworking_dirandenvfields, giving them the same treatment as otherworking_dirfields
Bug Fixes
- Fixes hook field merging so all
HooksConfigfields are combined correctly when merging config and CLI hooks - Fixes unset
${env.X}references to log at debug level instead of silently failing; config env now takes precedence over host env
Technical Changes
- Fixes flaky
TestAttachedServer_DeleteEmitsSessionExitedtest caused by a race between session deletion and event log subscription
What's Changed
- docs: update CHANGELOG.md for v1.96.0 by @docker-read-write[bot] in #3417
- test: fix flaky TestAttachedServer_DeleteEmitsSessionExited by @dgageot in #3418
- feat(config): expand ${env.X} in hook and script-shell working_dir/env by @dgageot in #3416
- fix: merge all hook fields by @rumpl in #3419
- feat: support global hooks in user config by @rumpl in #3422
Full Changelog: v1.96.0...v1.97.0
v1.96.0
This release adds session resumption across agent URL changes, TUI e2e test generation from recorded sessions, and fixes for duplicate tool names and Anthropic adaptive thinking display.
What's New
- Adds ability to resume sessions across agent URL query changes when using
docker-agent serve api(e.g. when relaunching with a different agent version tag) - Adds TUI e2e test generation from
--recordsessions, producing a ready-to-edit*_test.gofile alongside the cassette with synchronization points derived from the recorded session - Adds a Docker Wiki example agent with
/init,/update,/status, and/helpcommands
Bug Fixes
- Fixes duplicate tool names being sent to providers by deduplicating in
collectTools()— the first toolset wins and a warning is shown once per streak naming the conflicting toolsets (fixes Anthropic HTTP 400 "Tool names must be unique" errors) - Fixes missing reasoning display in the TUI when using
/effortor Shift+Tab thinking cycle on newer Claude models (Opus 4.7+) — the adaptivedisplayfield is now sent by default even whenprovider_opts.thinking_displayis not explicitly configured
What's Changed
- docs: update CHANGELOG.md for v1.94.0 by @docker-read-write[bot] in #3406
- docs: update CHANGELOG.md for v1.95.0 by @docker-read-write[bot] in #3407
- docs: add docker wiki example agent by @rumpl in #3408
- feat(server): resume sessions across agent URL query changes by @gtardif in #3410
- fix(agent): dedupe duplicate tool names with once-per-streak warning by @Sayt-0 in #3409
- feat(tui): generate a TUI e2e test from a
--recordsession by @dgageot in #3412 - docs: single-source documentation for the docs.docker.com Hugo module mount by @Sayt-0 in #3413
- fix(anthropic): default adaptive thinking display to summarized by @Sayt-0 in #3415
- docs: prepare pages for the docs.docker.com module mount by @Sayt-0 in #3414
Full Changelog: v1.95.0...v1.96.0
v1.95.0
This release focuses on TUI rendering performance improvements for long conversations, along with a bug fix for test reliability and a configuration version update.
Improvements
- Memoizes scrollbar rendering across frames to reduce redundant computation during TUI redraws
- Memoizes content line widths in the scroll view to avoid recalculating unchanged values each frame
- Replaces
lipgloss.JoinHorizontalwith direct column zipping for scrollbar rendering, reducing allocations per frame
Bug Fixes
- Fixes restyled lines incorrectly using cached widths instead of re-measuring after style changes
- Fixes flaky renderer-registry tests that were racing on a shared global registry
Technical Changes
- Freezes config v11 and promotes v12 as the latest configuration version
What's Changed
- chore: bump direct Go dependencies by @dgageot in #3405
- freeze config v11 and start v12 as latest by @dgageot in #3401
- perf(tui): memoize rendering hot paths for long conversations by @dgageot in #3404
Full Changelog: v1.94.0...v1.95.0
v1.94.0
This release significantly expands model provider support with 12 new built-in providers, adds mouse support and new commands to the TUI, introduces a SafetyPolicy primitive, and includes numerous bug fixes and performance improvements.
What's New
- Adds Baseten as a built-in model provider (
provider: baseten) - Adds OVHcloud AI Endpoints as a built-in model provider (
provider: ovhcloud) - Adds Groq as a built-in model provider (
provider: groq) - Adds DeepSeek as a built-in model provider (
provider: deepseek) - Adds Cerebras as a built-in model provider (
provider: cerebras) - Adds Fireworks AI as a built-in model provider (
provider: fireworks) - Adds Together AI as a built-in model provider (
provider: together) - Adds Hugging Face Inference Providers as a built-in model provider (
provider: huggingface) - Adds Moonshot AI (Kimi) as a built-in model provider (
provider: moonshot) - Adds Vercel AI Gateway as a built-in model provider (
provider: vercel) - Adds Cloudflare Workers AI and Cloudflare AI Gateway as built-in model providers
- Adds mouse support to the agent picker: hover highlights a card, single click selects it, double-click immediately starts the session, and scroll wheel navigates the YAML details panel
- Adds metadata
tagsfield to agent config and surfaces tags as coloured chips in the agent picker - Adds
/effortslash command to select the model's reasoning level directly (available in both full and lean TUI) - Adds
SafetyPolicyprimitive (unsafe/safer/strict) to sessions, forwarded to hooks viahooks.Input.SafetyPolicy - Enforces
lifecycle.startup_timeoutfor MCP/LSP toolset startup, which was previously parsed but never acted on - Adapts
safer_shellhook classification to the sessionSafetyPolicy - Collapses file picker keyboard shortcuts to a single line on wide dialogs
- Strengthens default memory toolset instructions
Improvements
- Memoizes successful OCI config reads per process, halving warm startup latency for OCI agent refs
- Suppresses spurious empty-response warning for benign post-tool stops in forked-skill sub-sessions
- Agent picker dialog is larger and truncates long lines instead of wrapping; cards are 70 columns wide
Bug Fixes
- Fixes coalescing of system messages for self-hosted and OpenAI-compatible endpoints that reject multiple system messages (e.g. vLLM with Qwen)
- Fixes OVHcloud default model to
Qwen3.5-397B-A17B - Fixes macOS Option-key characters not triggering file picker
alt+h/alt+ivisibility toggles - Removes duplicate "Initializing MCP servers…" spinner from the sidebar that fired on every turn even for agents with no MCP servers
- Adds 5-second timeout to graceful-shutdown calls that previously used
WithoutCancelwithout a deadline, preventing indefinite blocking - Fixes concurrent
Connectraces and goroutine leak on startup timeout for MCP/LSP toolsets - Fixes auto-deny of tool asks in non-interactive sessions instead of blocking indefinitely
- Fixes tool-call confirmations being dropped without a Resume under
--yoloin JSON mode - Fixes Anthropic provider falling back to token thinking for effort levels on models without adaptive thinking support (e.g. Haiku 4.5)
- Fixes tool call render briefly disappearing or shrinking while JSON arguments are still streaming in the lean TUI
- Clamps
max_tokensto the context window for OpenAI-compatible providers to prevent "context window exceeded" errors on self-hosted vLLM - Fixes cost and context limit display in the lean TUI
Technical Changes
- Derives provider API-key env vars forwarded to eval containers from the provider registry instead of a hard-coded list
- Refactors provider client boilerplate into shared helpers across openai, anthropic, gemini, bedrock, and dmr clients
- Consolidates OpenAI-compatible alias provider tests into a single shared test
- Extracts shared
calleeObjecthelper in lint cops to remove duplication - Adds
OTelTracerNamelint cop to enforce scoped OpenTelemetry tracer names - Replaces 44
time.Sleepcalls in the test suite with deterministic synchronization primitives
What's Changed
- docs: update CHANGELOG.md for v1.93.0 by @docker-read-write[bot] in #3339
- docs: sync documentation with recent main merges by @aheritier in #3340
- feat: add Baseten provider support by @dgageot in #3341
- feat: add OVHcloud AI Endpoints provider support by @aheritier in #3343
- chore: bump github.com/anthropics/anthropic-sdk-go to v1.55.0 by @dgageot in #3345
- feat: add Groq as a supported model provider by @Sayt-0 in #3358
- fix(openai): coalesce system messages for self-hosted and open-model endpoints by @Sayt-0 in #3357
- feat: add DeepSeek as a supported model provider by @Sayt-0 in #3361
- docs: group and collapse left navigation sections by @aheritier in #3360
- docs: list providers alphabetically by name in nav by @aheritier in #3364
- fix(docs): restore inline code contrast in light mode by @aheritier in #3365
- feat: collapse file picker shortcuts to one line on wide dialogs by @dgageot in #3366
- fix(tui): remove duplicate MCP-init spinner from sidebar by @dgageot in #3367
- fix: add 5s timeout to graceful-shutdown calls that used WithoutCancel by @dgageot in #3370
- feat: add Cerebras as a supported model provider by @Sayt-0 in #3368
- fix(tui): accept macOS Option-key chars for file picker toggles by @Sayt-0 in #3333
- feat: add Fireworks AI as a supported model provider by @Sayt-0 in #3369
- test: consolidate OpenAI-compatible alias provider tests by @dgageot in #3374
- refactor(config): derive provider API-key env vars from config by @dgageot in #3375
- feat: enforce lifecycle.startup_timeout for MCP/LSP toolset startup by @dgageot in #3373
- feat: add Hugging Face Inference Providers as a supported model provider by @Sayt-0 in #3379
- docs: tighten comment guidance in AGENTS.md by @dgageot in #3380
- fix: unblock headless tool-Ask paths (dispatcher + JSON runner) by @melmennaoui in #3377
- feat(session): add SafetyPolicy primitive and hook pass-through by @melmennaoui in #3378
- feat: add Together AI as a supported model provider by @Sayt-0 in #3376
- fix(anthropic): use token thinking for effort levels on models without adaptive support by @Sayt-0 in #3381
- fix(tui): keep tool call render stable while args stream by @rumpl in #3382
- feat(hooks/safer_shell): adapt classification to session SafetyPolicy by @melmennaoui in #3383
- feat: add Moonshot AI (Kimi) as a supported model provider by @Sayt-0 in #3384
- feat: add Vercel AI Gateway as a supported model provider by @Sayt-0 in #3385
- feat: add Cloudflare Workers AI and AI Gateway as model providers by @Sayt-0 in #3389
- test: make models-list tests hermetic and parallelizable by @dgageot in #3388
- feat(lint): add OTelTracerName cop to enforce scoped tracer names by @dgageot in #3386
- feat: add tags field to agent config metadata by @dgageot in #3390
- feat: add mouse support to the agent picker (hover, double-click, wheel) by @dgageot in #3391
- fix(runtime): suppress spurious empty-response warning for benign post-tool stops by @dgageot in #3392
- feat(memory): strengthen default toolset instructions by @dgageot in #3395
- fix: clamp max_tokens to the context window for OpenAI-compatible providers by @Sayt-0 in #3393
- test: make the test suite faster and sleep-free by @dgageot in #3399
- perf(config): memoize successful OCI reads to halve warm startup latency by @dgageot in #3397
- fix: show lean tui cost and context limit by @rumpl in #3400
- refactor: extract shared calleeObject helper in lint cops by @dgageot in #3396
- feat: show metadata tags as coloured chips in the agent picker by @dgageot in #3394
- refactor(provider): deduplicate provider client boilerplate by @dgageot in #3398
- feat(tui): add /effort command to select the model's reasoning level by @Sayt-0 in #3403
Full Changelog: v1.93.0...v1.94.0
v1.93.0
This release adds OpenRouter as a built-in provider, introduces per-model gateway bypass support, and allows a dedicated model for session compaction, alongside several internal refactoring improvements.
What's New
- Adds OpenRouter as a first-class built-in provider; when
OPENROUTER_API_KEYis set, the provider is auto-detected and its base URL resolved automatically - Adds a
compaction_modelfield to allow a dedicated model for session summary generation, separate from the primary agent model - Adds a
bypass_models_gatewayboolean field on a per-model basis, allowing specific models to connect directly to their provider instead of routing through the configured models gateway
Technical Changes
- Replaces mutex usage with atomic types (
atomic.Bool,atomic.Pointer) for single mutable fields in several structs - Replaces package-level global variables with explicit parameters or struct fields to enable parallel-safe testing across several packages (
toolinstall,runtime,mcp,notification,tui,cmd/root) - Adds a concurrency group to the PR review trigger CI workflow to prevent duplicate reviews for the same PR
What's Changed
- docs: update CHANGELOG.md for v1.92.0 by @docker-read-write[bot] in #3331
- refactor: replace single-variable mutexes with atomic types by @dgageot in #3330
- ci: add concurrency group to pr-review-trigger to prevent duplicate reviews by @derekmisler in #3334
- refactor: replace test-overridden globals with parallel-safe injection by @dgageot in #3332
- feat(compaction): allow a dedicated model for session summary generation by @Sayt-0 in #3335
- feat: add OpenRouter provider by @dgageot in #3337
- feat: add per-model bypass_models_gateway option by @dgageot in #3338
Full Changelog: v1.92.0...v1.93.0
v1.92.0
This release adds session context referencing and 1Password secret caching, fixes silent failures on empty/reasoning-only agent turns, and resolves environment variable substitution in model configuration fields.
What's New
- Adds a
session_contexttoolset withlist_sessionsandread_sessiontools, allowing agents to reference previous sessions as context - Adds
WithRootoption to worktree creation to decouple from the global data directory - Caches
op://secret resolutions and coalesces concurrent lookups to avoid redundantopCLI invocations
Bug Fixes
- Fixes silent failure when the runtime receives empty or reasoning-only turns; these are now surfaced instead of dropped
- Fixes whitespace-only turns being treated as valid output, which could cause re-entry loops
- Fixes
${env.X}references inmodelandbase_urlconfig fields not being substituted before being sent to providers - Fixes
${env.X}placeholders not being accepted in thebase_urlschema validation - Fixes empty agent responses on OpenAI-compatible providers caused by multiple consecutive system messages; consecutive system messages are now merged on the
openai_chatcompletionspath (scoped toopenai_chatcompletionsendpoints) - Fixes
os.ChmodinRegistry.Writebreaking non-owner callers by making the permission tightening best-effort - Fixes a data race on the
defaultRegistrypointer by switching toatomic.Pointer - Fixes
${env.VAR}not being normalized beforeos.ExpandEnvin filesystem path expansion - Fixes a transient failure when promoting a worktree directory under concurrency
Technical Changes
- Extracts
themeRegistrystruct to eliminate global state and enable parallel-safe tests - Introduces
Registrystruct inrunregistryto replace process-global directory state - Removes process-global clock and ID variables from
pkg/session, moving them into per-session fields - Introduces
Resolvertype inuseridand injects cagent ID source inhttpclientfor parallel-safe tests - Replaces package-level globals with dependency injection across multiple packages to enable parallel-safe tests
- Enables
t.Parallel()across ~337 test functions in the test suite - Makes
${env.X}the canonical variable-expansion syntax in documentation and example YAML files
What's Changed
- docs: update CHANGELOG.md for v1.91.0 by @docker-read-write[bot] in #3314
- refactor: introduce Resolver type in userid and inject cagent ID source in httpclient for parallel-safe tests by @dgageot in #3321
- chore: bump direct Go dependencies by @dgageot in #3315
- refactor: extract themeRegistry struct for parallel-safe tests by @dgageot in #3316
- refactor(runregistry): introduce Registry struct and tighten dir permissions by @dgageot in #3317
- feat(worktree): add WithRoot option to decouple from global data dir by @dgageot in #3318
- feat(1password): cache op:// resolutions and coalesce concurrent lookups by @dgageot in #3322
- fix: make chmod in Registry.Write best-effort to avoid breaking non-owner callers by @dgageot in #3323
- fix: eliminate themeRegistry data race and TOCTOU window by @dgageot in #3324
- refactor: remove process-global clock/ID vars from pkg/session by @dgageot in #3319
- fix(config): substitute ${env.X} in model and base_url fields by @Sayt-0 in #3304
- refactor: replace test-mutated globals with dependency injection by @dgageot in #3326
- docs: make ${env.X} the canonical variable-expansion syntax (+ fixes) by @dgageot in #3325
- test: enable t.Parallel() across the test suite by @dgageot in #3328
- feat(session_context): reference previous sessions as context by @Sayt-0 in #3320
- test: enable t.Parallel() in environment, config, and sessioncontext tests by @dgageot in #3329
- fix(#3145): empty agent response from multiple system messages on OpenAI-compatible providers by @Sayt-0 in #3327
Full Changelog: v1.91.0...v1.92.0
v1.91.0
This release adds per-session markdown plan toolset support, extends instruction_file to accept multiple files, and includes several bug fixes and documentation updates.
What's New
- Adds a
session_plantoolset alongside the existingplantoolset, providing per-session markdown plan storage - Extends
instruction_fileto accept either a single string or a list of file paths, with contents concatenated when multiple paths are provided - Adds support for a
titlefield inPOST /api/sessionsto skip LLM title generation when a title is supplied
Bug Fixes
- Fixes a data race in
stalledStream.Closeby replacing an unguardedclosed boolfield withsync.Once - Fixes
instruction_fileto omit empty values and drop empty-string list entries
Technical Changes
- Redesigns the TUI sidebar agents panel to use uniform two-line entries for all agents via a single
renderAgentLinefunction - Computes badge column width once in
agentInfoin the sidebar - Extracts a
readInstructionFileshelper with deferredroot.Close - Adds
t.Parallel()to isolated unit tests across multiple packages - Corrects a stale doc comment and restores alignment assertion in
effort_gauge_test - Updates documentation for
limit_large_tool_resultsalways-on builtin, thetitlefield inPOST /api/sessions, and model hookworking_dirandenvbehaviour
What's Changed
- docs: update CHANGELOG.md for v1.90.0 by @docker-read-write[bot] in #3308
- feat(server): accept title in POST /api/sessions to skip LLM title generation by @zampani-docker in #3310
- fix: data race in stalledStream.Close using sync.Once by @dgageot in #3312
- test: enable t.Parallel() on isolated unit tests by @dgageot in #3311
- chore: bump direct Go dependencies by @dgageot in #3309
- refactor(sidebar): redesign agents panel to uniform two-line entries by @dgageot in #3307
- docs: sync /docs with recent merged PRs by @aheritier in #3313
- feat(session_plan): per-session markdown plan toolset alongside plan by @trungutt in #3305
- feat: allow instruction_file to accept a list of files by @dgageot in #3306
Full Changelog: v1.90.0...v1.91.0
v1.90.0
This release adds support for OpenCode Go and OpenCode Zen providers and improves error handling for stream truncation during model inference.
What's New
- Adds OpenCode Go (
opencode-go) and OpenCode Zen (opencode-zen) as built-in provider aliases, including automatic API key detection viaOPENCODE_API_KEY
Bug Fixes
- Fixes handling of stream truncation errors: retries when a stream is unexpectedly cut mid-response and clarifies the error message shown to users
- Fixes error handling for mid-stream connection drops in truncation error reporting
What's Changed
- fix(modelerrors): retry stream truncation and clarify the error (#3298) by @Sayt-0 in #3302
- docs: update CHANGELOG.md for v1.89.0 by @docker-read-write[bot] in #3303
- feat: add OpenCode Go and OpenCode Zen provider support by @jopsis in #3211
New Contributors
Full Changelog: v1.89.0...v1.90.0
v1.89.0
This release brings significant new capabilities including a safety-check hook system, TUI improvements with retry support and new slash commands, expanded hook and config features, and a large number of internal quality improvements around context threading, linting, and test performance.
What's New
- Adds
usageandcostfields to theafter_llm_callhook payload, exposing per-turn token usage and computed USD cost - Adds a
triage-prsskill for triaging open pull requests - Adds a TUI e2e test harness (
tuitest) with VCR cassette support, plus live/frame-dump debugging, mouse, and clipboard helpers - Adds a retry button to TUI error messages, allowing one-click recovery after agent turn failures
- Adds key/value
metadatafield to tool-call confirmation events, rendered in the TUI confirmation dialog - Adds
${env.X}expansion support in toolsetenvvalues (in addition to the existing${X}syntax) - Adds
triage-prsskill for automated PR classification and triage - Adds fork suffix deduplication across sibling forks so parallel forks of the same parent get unique
(fork N)suffixes - Adds tool-scoping for fork-mode skills via
allowed_toolsandtoolsetsfrontmatter fields - Adds
urlfield support in agent/commandsconfig, opening a URL in the user's default browser instead of sending a prompt - Adds
{{session_id}}expansion in URL commands - Persists agent failures as first-class
Errorsession items so errors survive session reload and appear in the TUI - Adds
instruction_filefield to agent config for referencing external instruction files - Adds
open_urlbuilt-in toolset for agents to open a configured URL in the user's default browser - Adds
preempt_yoloflag onpre_tool_usehook entries and asafer_shellbuiltin that classifies shell commands and forces confirmation for destructive operations - Adds file-based plan revisions, free-form status field, and optimistic locking to the plan toolset, including new
export_plan_to_fileandupdate_plan_from_filetools - Embeds a models.dev catalog snapshot as a binary fallback for offline/air-gapped environments
- Adds timing instrumentation to the model picker pipeline
- Adds
/feedbackand/bugslash commands to the TUI - Adds
WrapErrorslint cop to catchfmt.Errorfcalls that discard error chains - Adds constructor side-effect lint cops preventing goroutines, command execution, and network I/O in constructors
- Adds deferred mutex unlock lint cop and converts existing terminal unlocks to deferred form
- Adds
ContextConnectivitywhole-program lint cop and threads context throughout the codebase - Builtin hooks now honor
working_dirandenvfields
Improvements
- Returns 1,000,000-token context window for Claude Opus 4.6/4.7/4.8 families instead of the 200k fallback
- Reuses a single warmed models.dev store across runtime, server, and embedded-chat paths instead of warming independently per session
- Caps oversized tool result payloads (filesystem, shell, MCP, and A2A) at 2,000 lines / 50 KiB, saving the full output to a temp file
- Removes redundant agent-switch and thinking-level toast notifications whose results are already visible in the UI
- Speeds up Go test suite by ~37% with shared shims and offline fixtures
Bug Fixes
- Fixes per-model attachment capability override so custom/aliased OpenAI-compatible providers (Ollama, xai, mistral, etc.) can declare image/PDF support when absent from models.dev
- Fixes cycling thinking level in the lean TUI via Shift+Tab
- Fixes
ctrl+1–ctrl+9agent quick-switch shortcuts broken under the Kitty keyboard protocol - Fixes lock-state modifiers being incorrectly applied to
ctrl+Nagent switch - Fixes MCP OAuth token persistence in sandboxes by falling back to a file-backed keyring when the OS keyring is unavailable, using a per-install random passphrase
- Fixes data races in scroll state and session store updates
- Fixes suppression of re-emitted
UserMessageEventbeforeStreamStartedon retry - Fixes
~expansion to respect theHOMEenvironment variable before falling back toos.UserHomeDir() - Fixes DMR model selection to prefer locally pulled models and surface actionable pull errors
- Fixes recovery from corrupted partial model downloads (HTTP 416)
- Fixes URL validation before handing URLs to the OS opener
- Fixes context cancellation being passed to the browser opener (strips it before launch)
- Fixes
Tool.Metadataserialization to avoid duplicate/stale wire fields - Fixes session working directory usage in TUI so
/shellopens in the worktree directory rather than the process CWD - Fixes context-cancelled errors being cached in the model picker
- Fixes branching and cloning sessions that contain error items
Technical Changes
- Freezes config schema v10 and starts v11 as latest
- Parallelizes
build-imageCI job across native runners - Switches CI Task installation from source compilation to prebuilt binary (~51s → 1s)
- Adds
t.Parallel()to 1,216 eligible top-level tests across 165 files - Refactors
Coordinatormethods to be receiver-based, keeping package-level shims for compatibility - Extracts
buildDefaultStorefor testability and adds fallback-ordering tests - Extracts
isClaudeOpus46To48helper to deduplicate Opus matching logic - Threads context through
Runtimeinterface methods, RAG helpers, DB setup, memory initialization, sound playback, and other call paths - Uses
context.WithoutCancelfor shutdown and flush paths - Resolves proxy allowlist at dial time and caches it at construction
- Speeds up custom linters using new rubocop-go helpers
What's Changed
- feat(skills): add triage-prs skill by @aheritier in #3249
- freeze config v10 and start v11 as latest by @dgageot in #3248
- fix: cycle thinking level in lean tui by @rumpl in #3246
- docs: update CHANGELOG.md for v1.88.1 by @docker-read-write[bot] in #3251
- feat: add TUI e2e test harness by @dgageot in #3252
- feat: add retry button to TUI error messages by @dgageot in #3253
- fix(providers): add per-model attachment capability override (#2741) by @Sayt-0 in #3205
- feat(server): bump fork suffix across sibling forks by @trungutt in #3254
- ci: parallelize build-image across native runners by @dgageot in #3258
- feat(config): accept ${env.X} in toolset env values (#2615) by @dgageot in #3257
- feat: support URL-opening /commands in agent config by @dgageot in #3261
- refactor(tui): remove redundant agent-switch and thinking-level toasts by @dgageot in #3266
- feat: return 1M context for Claude Opus 4.6/4.7/4.8 families by @dgageot in #3267
- feat: persist agent failures in the session by @dgageot in #3259
- feat: add tool-scoping for fork-mode skills by @dgageot in #3260
- fix(tui): restore ctrl+1..ctrl+9 agent quick-switch shortcuts by @dgageot in #3265
- fix: persist MCP OAuth tokens in sandboxes via file-backed keyring fallback (#3037) by @dgageot in #3255
- feat: add key/value metadata to tool-call confirmation events by @dgageot in #3256
- docs: document URL-opening /commands and clean up /feedback and /bug by @dgageot in #3270
- ci: install Task from prebuilt binary instead of compiling by @dgageot in #3269
- fix(dmr): prefer local models and surface actionable pull errors by @Sayt-0 in #3268
- feat(runtime): expose per-turn usage and cost in the after_llm_call hook payload by @kimizuka in #2994
- feat(config): support external instruction files via instruction_file by @Sayt-0 in #3272
- feat(plan): file-based revisions, free-form status, and optimistic locking by @Sayt-0 in #3274
- docs(runtime): document StreamStopped ordering and teardown trade-offs (#3074) by @Sayt-0 in #3275
- feat: add open_url built-in toolset by @dgageot in #3276
- Remove thinking cycle notice by @rumpl in #3280
- docs: document capabilities override and TUI error recovery by @aheritier in #3283
- feat: reuse warmed model store, add picker timing, and fix discovery error caching by @dgageot in #3285
- Add constructor side-effect lint cops by @dgageot in #3289
- fix: open /shell in the session working directory (e.g. --worktree) by @dgageot in #3286
- feat(modelsdev): embed models.dev catalog snapshot as binary fallback by @dgageot in #3277
- lint: add WrapErrors cop by @dgageot in #3287
- refactor: thread context throughout and enforce ContextConnectivity lint rule by @dgageot in #3279
- feat(hooks): cap oversized tool result payloads by @rumpl in #3290
- lint: enforce deferred mutex unlo...