github docker/docker-agent v1.89.0

latest release: v1.90.0
7 hours ago

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

Full Changelog: v1.88.1...v1.89.0

Don't miss a new docker-agent release

NewReleases is sending notifications on new releases.