Skip to content

Releases: docker/docker-agent

v1.98.0

Choose a tag to compare

@docker-read-write docker-read-write released this 03 Jul 12:32
9cd759f

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 /effort is used with no argument, instead of printing a usage hint
  • Adds a Lean Mode checkbox to the agent picker panel, toggleable with the l key or mouse click
  • Agent picker now discovers ~/.agents config files (.yaml, .yml, .hcl) when no explicit list is given, in addition to the built-in default and coder agents
  • Adds cross-process locking and atomic writes for SQLite memory storage

Bug Fixes

  • Fixes toolset Start during 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 --record proxy 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 /tools dialog 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 fdOwnershipPin with 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

Choose a tag to compare

@docker-read-write docker-read-write released this 02 Jul 16:35
cf30a47

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-shell working_dir and env fields, giving them the same treatment as other working_dir fields

Bug Fixes

  • Fixes hook field merging so all HooksConfig fields 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_DeleteEmitsSessionExited test 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

Choose a tag to compare

@docker-read-write docker-read-write released this 02 Jul 13:12
002fe90

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 --record sessions, producing a ready-to-edit *_test.go file alongside the cassette with synchronization points derived from the recorded session
  • Adds a Docker Wiki example agent with /init, /update, /status, and /help commands

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 /effort or Shift+Tab thinking cycle on newer Claude models (Opus 4.7+) — the adaptive display field is now sent by default even when provider_opts.thinking_display is 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 --record session 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

Choose a tag to compare

@docker-read-write docker-read-write released this 02 Jul 09:19
f03bf88

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.JoinHorizontal with 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

Choose a tag to compare

@docker-read-write docker-read-write released this 02 Jul 09:08
3949d8a

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 tags field to agent config and surfaces tags as coloured chips in the agent picker
  • Adds /effort slash command to select the model's reasoning level directly (available in both full and lean TUI)
  • Adds SafetyPolicy primitive (unsafe/safer/strict) to sessions, forwarded to hooks via hooks.Input.SafetyPolicy
  • Enforces lifecycle.startup_timeout for MCP/LSP toolset startup, which was previously parsed but never acted on
  • Adapts safer_shell hook classification to the session SafetyPolicy
  • 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+i visibility 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 WithoutCancel without a deadline, preventing indefinite blocking
  • Fixes concurrent Connect races 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 --yolo in 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_tokens to 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 calleeObject helper in lint cops to remove duplication
  • Adds OTelTracerName lint cop to enforce scoped OpenTelemetry tracer names
  • Replaces 44 time.Sleep calls 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

Choose a tag to compare

@docker-read-write docker-read-write released this 30 Jun 18:02
11b008a

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_KEY is set, the provider is auto-detected and its base URL resolved automatically
  • Adds a compaction_model field to allow a dedicated model for session summary generation, separate from the primary agent model
  • Adds a bypass_models_gateway boolean 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

Choose a tag to compare

@docker-read-write docker-read-write released this 30 Jun 15:31
63a2a2e

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_context toolset with list_sessions and read_session tools, allowing agents to reference previous sessions as context
  • Adds WithRoot option to worktree creation to decouple from the global data directory
  • Caches op:// secret resolutions and coalesces concurrent lookups to avoid redundant op CLI 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 in model and base_url config fields not being substituted before being sent to providers
  • Fixes ${env.X} placeholders not being accepted in the base_url schema validation
  • Fixes empty agent responses on OpenAI-compatible providers caused by multiple consecutive system messages; consecutive system messages are now merged on the openai_chatcompletions path (scoped to openai_chatcompletions endpoints)
  • Fixes os.Chmod in Registry.Write breaking non-owner callers by making the permission tightening best-effort
  • Fixes a data race on the defaultRegistry pointer by switching to atomic.Pointer
  • Fixes ${env.VAR} not being normalized before os.ExpandEnv in filesystem path expansion
  • Fixes a transient failure when promoting a worktree directory under concurrency

Technical Changes

  • Extracts themeRegistry struct to eliminate global state and enable parallel-safe tests
  • Introduces Registry struct in runregistry to replace process-global directory state
  • Removes process-global clock and ID variables from pkg/session, moving them into per-session fields
  • Introduces Resolver type in userid and injects cagent ID source in httpclient for 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

Choose a tag to compare

@docker-read-write docker-read-write released this 30 Jun 07:50
e07c94c

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_plan toolset alongside the existing plan toolset, providing per-session markdown plan storage
  • Extends instruction_file to accept either a single string or a list of file paths, with contents concatenated when multiple paths are provided
  • Adds support for a title field in POST /api/sessions to skip LLM title generation when a title is supplied

Bug Fixes

  • Fixes a data race in stalledStream.Close by replacing an unguarded closed bool field with sync.Once
  • Fixes instruction_file to 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 renderAgentLine function
  • Computes badge column width once in agentInfo in the sidebar
  • Extracts a readInstructionFiles helper with deferred root.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_results always-on builtin, the title field in POST /api/sessions, and model hook working_dir and env behaviour

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

Choose a tag to compare

@docker-read-write docker-read-write released this 29 Jun 17:31
9c68eb1

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 via OPENCODE_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

Choose a tag to compare

@docker-read-write docker-read-write released this 29 Jun 14:12
e6d4974

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 usage and cost fields to the after_llm_call hook payload, exposing per-turn token usage and computed USD cost
  • Adds a triage-prs skill 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 metadata field to tool-call confirmation events, rendered in the TUI confirmation dialog
  • Adds ${env.X} expansion support in toolset env values (in addition to the existing ${X} syntax)
  • Adds triage-prs skill 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_tools and toolsets frontmatter fields
  • Adds url field support in agent /commands config, 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 Error session items so errors survive session reload and appear in the TUI
  • Adds instruction_file field to agent config for referencing external instruction files
  • Adds open_url built-in toolset for agents to open a configured URL in the user's default browser
  • Adds preempt_yolo flag on pre_tool_use hook entries and a safer_shell builtin 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_file and update_plan_from_file tools
  • Embeds a models.dev catalog snapshot as a binary fallback for offline/air-gapped environments
  • Adds timing instrumentation to the model picker pipeline
  • Adds /feedback and /bug slash commands to the TUI
  • Adds WrapErrors lint cop to catch fmt.Errorf calls 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 ContextConnectivity whole-program lint cop and threads context throughout the codebase
  • Builtin hooks now honor working_dir and env fields

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+1ctrl+9 agent quick-switch shortcuts broken under the Kitty keyboard protocol
  • Fixes lock-state modifiers being incorrectly applied to ctrl+N agent 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 UserMessageEvent before StreamStarted on retry
  • Fixes ~ expansion to respect the HOME environment variable before falling back to os.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.Metadata serialization to avoid duplicate/stale wire fields
  • Fixes session working directory usage in TUI so /shell opens 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-image CI 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 Coordinator methods to be receiver-based, keeping package-level shims for compatibility
  • Extracts buildDefaultStore for testability and adds fallback-ordering tests
  • Extracts isClaudeOpus46To48 helper to deduplicate Opus matching logic
  • Threads context through Runtime interface methods, RAG helpers, DB setup, memory initialization, sound playback, and other call paths
  • Uses context.WithoutCancel for 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...
Read more