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 unlocks by @dgageot in #3288
- Faster lint by @dgageot in #3293
- test: speed up Go test suite by ~37% with shared shims and offline fixtures by @dgageot in #3294
- feat: builtin hooks now honor working_dir and env by @dgageot in #3295
- test: add t.Parallel() to eligible tests by @dgageot in #3296
- feat: safety_check hook + safer_shell builtin by @melmennaoui in #3273
- docs: replace stale safety_check references with preempt_yolo pre_tool_use by @dgageot in #3297
- refactor: receiver-based Coordinator and parallel provider tests by @dgageot in #3299
- fix(hooks): cap oversized mcp and a2a tool results by @Sayt-0 in #3301
- chore: bump direct Go dependencies by @dgageot in #3300
- fix: respect HOME env var when expanding ~ in paths by @Divyansh670 in #3088
New Contributors
- @melmennaoui made their first contribution in #3273
- @Divyansh670 made their first contribution in #3088
Full Changelog: v1.88.1...v1.89.0