Repository navigation
Releases: docker/docker-agent
Release list
v1.152.0
This release delivers significant Claude 5.x support improvements, RAG sharing optimizations, security hardening for the REST API, and history load performance gains.
What's New
- Adds syntax highlighting for scripts in common shell wrappers, including Python, Node/JavaScript, Ruby, Perl, and shell heredocs in the TUI
- Adds an explicit Claude 5.x model table covering nine models, replacing name-based guesses for request policy on Anthropic Direct, Vertex, and Bedrock
- Adds warnings and refusals when Claude 5.x cannot honor
thinking_budget none, and rejects final assistant prefill for Claude 5.x - Refuses server-side fallback involving Claude 5.x and refuses Claude Mythos 5 on Bedrock (unsupported configurations)
- Adds versioned, attributed provider raw state (
ProviderStategainsVersionandModelfields) with explicit policy for unreplayable thinking blocks - Adds helpers for raw-state replay policy and seals provider state after generated media
Improvements
- Deduplicates history entries in linear time on load, replacing a quadratic scan-and-splice approach
- Redacts loaded history messages concurrently across available CPU workers, reducing sequential redaction overhead
- Shares a single RAG index, file watcher, and embedding concurrency cap across all agents referencing the same RAG definition, eliminating redundant re-indexing
- Accumulates Bedrock native block text in a
strings.Builderinstead of copying immutable strings on every delta, fixing quadratic behavior on Bedrock streams
Bug Fixes
- Fixes OAuth token endpoint auth method: registration now requests
client_secret_postunless the server only offersbasicornone, and token exchange follows the registered method - Fixes OAuth default: omitted
token_endpoint_auth_methods_supportedandtoken_endpoint_auth_methodnow default toclient_secret_basic - Locks down the REST session API against CSRF and DNS rebinding: rejects cross-origin requests on all methods, validates
Hostheaders on unauthenticated TCP listeners, and requires tokens on non-loopback listeners - Fixes Anthropic Haiku 5.x: omits sampling parameters (e.g. temperature) that the model rejects
- Fixes RAG: skips re-embedding files already indexed by another store, and does not attribute shared background indexing to a session
- Fixes Bedrock: captures, persists, and replays native Claude reasoning blocks in order; never replays unsigned reasoning blocks
- Fixes Anthropic: preserves thinking blocks from another provider's raw state
- Fixes structured output on Claude 5.x: fails correctly without a prefill retry
- Fixes provider factory: keeps VertexAI out of the factory's dependencies; scopes the Claude 5.x thinking warning to Model Garden and zero budgets
- Fixes images in tool results: restores typed image attachments after tool replies, handles the explicit-cache path, and preserves following user text on message merge
- Fixes theme watcher races:
ThemeWatchernow uses a blocking, context-ownedRunmethod instead of an internally managed goroutine - Fixes transcription: preserves transcripts and errors through dictation finalization;
Capturer.RunandTranscriber.Runare now context-owned per run - Replaces models removed from the models.dev snapshot
Technical Changes
- Refreshes the embedded models.dev catalog snapshot (+661 added, -71 removed, ~381 modified)
- Updates Go to 1.27.3, picking up security fixes
What's Changed
- fix: lock down REST session API against CSRF and DNS rebinding by @dgageot in #4632
- perf(history): deduplicate entries in linear time on load by @dgageot in #4633
- fix(oauth): send the registered token auth method by @locker95 in #4595
- chore(deps): bump portcullis to v1.1.2 by @dgageot in #4635
- docs: update CHANGELOG.md for v1.151.0 by @docker-read-write[bot] in #4638
- perf(history): redact loaded messages concurrently by @dgageot in #4639
- chore: refresh models.dev snapshot (+661 -71 ~381) by @github-actions[bot] in #4631
- fix(anthropic): omit sampling params for Haiku 5.x by @locker95 in #4640
- feat: highlight scripts in common shell wrappers by @rumpl in #4649
- fix(rag): share one index across agents referencing the same RAG by @aheritier in #4650
- docs: document TUI shell command syntax highlighting (2026-10-20) by @aheritier in #4662
- test(runtime): make TestHandleStream_ContextCancellation deterministic by @aheritier in #4648
- test(teamloader): stop LSP tests from auto-installing gopls by @aheritier in #4647
- fix: preserve images in tool results by @topabomb in #4661
- chore: bump direct Go dependencies by @dgageot in #4663
- fix(claude): explicit Claude 5.x model table for request policy by @aheritier in #4657
- feat(claude): refuse Claude 5.x fallbacks and Mythos 5 on Bedrock by @aheritier in #4658
- fix(bedrock): capture and replay native Claude reasoning blocks by @aheritier in #4666
- perf(bedrock): accumulate native block text in a strings.Builder by @aheritier in #4667
- test: shrink GitHub archive file-count fixtures by @dgageot in #4670
- test: disable tool installation when loading examples by @dgageot in #4669
- feat(provider): versioned raw state and explicit policy for unreplayable thinking by @aheritier in #4668
- fix: harden context-owned theme watching by @dgageot in #4673
- refactor: make transcription and capture context-owned per run by @dgageot in #4674
- test: speed up test fixtures and completion checks by @dgageot in #4675
- ci: prune unused Go build-cache entries before saving by @dgageot in #4676
- bump Go to 1.27.3 by @trungutt in #4679
New Contributors
Full Changelog: v1.151.0...v1.152.0
v1.151.0
This release adds Atlas Cloud and API Route as new provider aliases, introduces live background agent visibility in the sidebar, streaming file previews in the lean TUI, and the Command Code harness type, alongside numerous bug fixes for A2A compatibility, provider cloning, think tool concurrency, and TUI settings.
What's New
- Adds Atlas Cloud as a built-in OpenAI-compatible provider alias, with automatic
ATLASCLOUD_API_KEYdiscovery and credential forwarding - Adds API Route as an OpenAI-compatible provider alias, using
https://global.api-route.com/v1andAPI_ROUTE_API_KEY - Adds
command-codeharness type, enabling agents to be run by the Command Code CLI (cmd) - Shows a live "Background: N running" indicator in the expanded and collapsed Agents sidebar
- Streams syntax-highlighted file previews in the lean TUI as
write_filetool arguments arrive, with filename-based syntax highlighting and plain-text fallback - Merges streaming deltas in the API server's SSE streams, coalescing per-provider chunks into larger events
Improvements
- Shows the command or file path in tool-call titles (e.g.,
Shell: docker ps -a) instead of just the tool name - Redesigns the TUI settings dialog to be responsive, contiguous within sections, with clickable category tabs and stable geometry across category switches
Bug Fixes
- Fixes race condition in the Think tool when multiple concurrent tool calls append to a shared slice without synchronization
- Fixes A2A toolset failing to read A2A 1.0 agent cards, which caused
no compatible transports founderrors when calling agents served byserve a2a - Fixes A2A toolset failing to discover agent cards under a base URL that has a path component
- Fixes A2A toolset panicking on null agent card interfaces instead of rejecting them
- Fixes A2A toolset not sending configured headers to the endpoint the client selects
- Fixes think scratchpads being shared across conversations instead of isolated per conversation
- Fixes provider clones not preserving transport, and surfaces clone failures with actionable errors
- Fixes routed provider clones not being isolated, and retains thinking-off intent and numeric precision across clones
- Fixes serving model accounting for routed turns, so only the successful attempt is priced using the serving leaf's catalogue entry
- Fixes serving metadata and fallback sidebar updates not being preserved across retries
- Fixes fallback serving model notifications not reaching all UI consumers
- Fixes runtime decisions delivered before confirmation waits being dropped
- Fixes
context_size: 64000(bare YAML integer) being ignored in Docker Model Runner configuration - Fixes tool-result images being sent incorrectly in chat completions; images are now sent as text (data URI/URL) inside the tool message
- Fixes canceled input reads leaking goroutines blocked on the underlying read
- Fixes potential deadlock in
gitbranchwatcher when replacing pending changes on a full channel - Fixes skills not unblocking inherited output pipes on cancellation
- Fixes skills caching oversized files instead of rejecting them upfront
- Fixes chat server not finalizing conversations before sending terminal responses
- Fixes chat server not preserving cached history when execution is canceled
- Fixes selected agent not being preserved during background usage updates
- Fixes collapsed sidebar not sizing correctly from the wrapped agent summary
- Fixes OpenAI requests not being priced by actual service tier (
fast/priority/ultrafastpremiums now derived per-model from the catalogue)
Technical Changes
- Enables 11 additional shared rubocop-go lint cops, bringing enforcement to 34 of 36 available cops
- Drops
ContextFirstParameterandNoContextFieldlint suppressions - Decouples attention dialogs, tool expansion, title generation, RAG backend, streaming sender, and command resolution from concrete types via consumer-defined interfaces
- Adds
Lint/ChannelDirectioncop to flag unnecessarily bidirectional channel parameters and return values - Adds
Lint/ChannelStateCheck,Lint/CancellationLoop, andLint/ClosedChannelLoopcops to detect channel drain races and busy-wait loops - Adds
cancellation_safe_result_sendandnonblocking_channel_replacementlint cops paired with the concurrency fixes - Reduces lint runtime by adopting shared rubocop-go execution infrastructure and targeted hot-path optimizations (deduped interface method sets, memoized escaped channel types, cached position keys)
- Binds OAuth callback ports during startup rather than on demand
- Shares streaming delta merging logic in
pkg/runtime/eventmerge - Adds community resources documentation page and relocates operational guides
- Adds Atelier to community resources
What's Changed
- docs: update CHANGELOG.md for v1.150.0 by @docker-read-write[bot] in #4563
- feat: add Atlas Cloud provider by @binyangzhu000-sudo in #3962
- lint: enable the expanded shared rubocop-go cop catalog by @dgageot in #4564
- refactor: consumer-owned interfaces for dialogs, tools, and app services by @dgageot in #4565
- chore(deps): bump docker/docs/.github/workflows/validate-upstream.yml from 1cb9a4d2c65d712da863e30cd3a1319ddeea3298 to 3f5e702096f8f304d5c007fa633d57098506123b in the actions group across 1 directory by @dependabot[bot] in #4574
- chore: refresh models.dev snapshot (+151 -138 ~264) by @github-actions[bot] in #4573
- docs: auto-update for merged PRs (2026-10-10) by @aheritier in #4566
- codingharness: add the command-code harness type by @PremModhaOfficial in #4577
- fix(think): protect concurrent tool calls with a mutex by @dlanov in #4570
- docs(claude): distinguish access paths and feature limits by @aheritier in #4586
- fix(runtime): retain decisions delivered before confirmation waits by @aheritier in #4589
- docs: auto-update for merged PRs (2026-10-14) by @aheritier in #4591
- fix: price routed turns using the serving model by @aheritier in #4579
- fix(provider): preserve transport and surface clone failures by @aheritier in #4587
- fix: isolate think scratchpads by conversation by @aheritier in #4592
- fix(dmr): honor a YAML integer context_size by @locker95 in #4596
- fix(a2a): read A2A 1.0 agent cards in the a2a toolset by @smashingtags in #4572
- feat: add API Route as an OpenAI-compatible provider alias by @DennyHo0917 in #4567
- chore: bump direct Go dependencies by @dgageot in #4598
- fix(tui): clean up the settings dialog by @dgageot in #4599
- fix(acp): show the command in tool-call titles by @locker95 in #4603
- lint: detect unnecessarily bidirectional channels by @dgageot in #4604
- fix: send tool-result images as text in chat completions by @rumpl in #4610
- feat: show live background agent count in Agents sidebar by @dgageot in #4611
- fix: concurrency/correctness fixes with matching custom lint cops by @dgageot in #4605
- test: reuse checked-in CLI fixtures across cases by @dgageot in #4613
- fix: stabilize flaky tests and chat conversation finalization by @dgageot in #4614
- lint: detect channel drain races and busy-wait loops by @dgageot in #4612
- test: run gitbranch watcher stress test in-memory with synctest by @dgageot in #4616
- docs: auto-update for merged PRs (2026-10-16) by @aheritier in #4606
- docs: add community resources and keep Community on GitHub Pages by @aheritier in #4618
- docs: add Atelier to community resources by @rumpl in #4622
- perf(lint): adopt shared rubocop-go execution and reduce analysis overhead by @dgageot in #4626
- test: speed up fixtures and isolate flaky test dependencies by @dgageot in #4627
- docs: auto-update for merged PRs (2026-10-17) by @aheritier in #4623
- fix: price OpenAI requests by actual service tier by @dgageot in #4625
- test: make Gemini integration fixtures reviewer-only by @aheritier in #4619
- feat: stream syntax-highlighted file previews in lean TUI by @rumpl in #4628
- chore(deps): bump the actions group across 1 directory with 5 updates by @dependabot[bot] in #4630
- feat(server): merge streaming deltas in the API server's SSE streams by @trungutt in #4634
New Contributors
- @binyangzhu000-sudo made their first contribution in #3962
- @PremModhaOfficial made their...
v1.150.0
This release adds new built-in toolsets, provider support, and agent execution capability reporting, along with several bug fixes for runtime configuration propagation and TUI startup behavior.
What's New
- Adds DaoXE as a built-in OpenAI-compatible provider alias, authenticated via
DAOXE_API_KEYwith theapi.daoxe.com/v1base URL - Reports program status via OSC 7501 in both TUI and lean mode, allowing terminals and multiplexers to surface agent idle/working/waiting states
- Exposes agent execution capabilities to callers
- Adds a
datetimebuilt-in toolset for retrieving and formatting the current time - Adds a
calculatorbuilt-in toolset for exact arithmetic - Adds a
randombuilt-in toolset for agent-chosen integer draws - Adds an OpenAI Decisions hook routing example (
examples/hook_routing_openai.yaml) usinggpt-6-lunaas the evaluator
Bug Fixes
- Fixes manifest-level budgets not being enforced on native runtimes created through the API server
- Fixes agent limits (memory, SQLite, provider truncation) being silently dropped when resuming an A2A session
- Moves image support probing to before the TUI claims the terminal, preventing dropped input, screen blink, or startup stalls; also short-circuits the 300 ms timeout on a negative reply
- Fixes failed or canceled first harness turns to remain resumable
- Adopts upstream harness streaming fixes for the codex exec
--jsonrunner
Technical Changes
- Refreshes the models.dev catalog snapshot (91 models added, 27 removed, ~130 updated)
- Decouples YAML node decoding in the OpenAPI package via a
nodeDecoderinterface to support the libopenapi v0.41.5 upgrade - Updates linting configuration to use shared rubocop-go cops, removing locally duplicated detection logic
- Bumps Go toolchain to 1.27.2 and updates golangci-lint to v2.14.0
What's Changed
- feat: report program status via OSC 7501 in TUI and lean mode by @dgageot in #4544
- fix: propagate budgets and execution capabilities across runtimes by @dgageot in #4541
- chore(lint): update rubocop-go and use shared cops by @dgageot in #4543
- docs: update CHANGELOG.md for v1.149.0 by @docker-read-write[bot] in #4545
- fix: probe image support before the TUI takes the terminal by @dgageot in #4546
- feat: add DaoXE as an OpenAI-compatible provider alias by @seven7763 in #4246
- chore: refresh models.dev snapshot (+91 -27 ~130) by @github-actions[bot] in #4549
- fix: adopt upstream harness streaming fixes and preserve failed threads by @dgageot in #4548
- feat: add datetime, calculator, and random built-in toolsets by @dgageot in #4547
- docs: add OpenAI Decisions hook routing example by @hamza-jeddad in #4542
- test: avoid file-backed SQLite in TestBranchSessionClonesSubSession by @dgageot in #4551
- chore(deps): bump OpenTelemetry to v1.47.0 by @dgageot in #4552
- test(eval): avoid ETXTBSY in parallel fake-runtime tests by @dgageot in #4556
- chore(deps): bump libopenapi to v0.41.5 by @dgageot in #4554
- chore(deps): bump Anthropic SDK to v1.79.1 by @dgageot in #4558
- chore: bump Go to 1.27.2 by @dgageot in #4562
New Contributors
- @seven7763 made their first contribution in #4246
Full Changelog: v1.149.0...v1.150.0
v1.149.0
This release adds GitHub repository skill loading, evaluator routing through the models gateway, and several model pricing and capability fixes, along with TUI stability improvements and expanded debug tool hook support.
What's New
- Adds support for loading skills from public GitHub repositories via
https://github.com/owner/repoURLs inskills:entries - Runs
tool_input_transformandpost_tool_usehooks on debug tool calls, completing the full hook pipeline fordocker agent debug tool - Adds an evaluator judge backend, enabling a dedicated evaluator service as an alternative to the LLM-as-judge path
- Routes evaluators through the models gateway by default and adds OpenAI Decisions as a native evaluator backend
- Prices OpenAI
fast,priority, andultrafastservice tiers based on the tier actually served in the response rather than the requested tier - Adds a Nativ provider guide covering setup, authentication, and API support for the local Apple Silicon inference server
Bug Fixes
- Fixes ChatGPT models incorrectly treated as text-only by inferring image input capability from the matching OpenAI catalogue entry when no direct ChatGPT entry exists
- Fixes provider IDs (
fireworks-ai,togetherai,moonshotai,opencode) to align with canonical models.dev catalogue IDs, preserving legacy IDs as aliases - Fixes custom and gateway provider filters being dropped when resolving model providers
- Fixes fast/priority and ultrafast service-tier cost multipliers falling back to standard rates when
base_urlis explicitly set to the official OpenAI endpoint - Fixes redundant full re-renders triggered by token usage events when the sidebar is hidden in the TUI
- Fixes the lean TUI working indicator to remain above the input with a permanent separator, replacing inline spinners with static markers to avoid redraws on every tick
Technical Changes
- Separates loader defaults from runtime registration so building loader options no longer mutates process-wide runtime state as a side effect
- Centralizes loaded runtime configuration assembly and narrows the
chatserverruntime contract - Runs
tool_response_transformhooks on debug tool output (previously missing from the debug tool path) - Updates documentation for the defuse loop termination argument to reflect the correct invariant
- Stabilizes the debug-tool test on Windows by removing a flaky native shell dependency from the affected test case
What's Changed
- chore(deps): bump the actions group across 1 directory with 4 updates by @dependabot[bot] in #4510
- feat: run tool_input_transform and post_tool_use hooks on debug tool calls by @dgageot in #4518
- docs: update CHANGELOG.md for v1.148.0 by @docker-read-write[bot] in #4519
- docs(attachment): state the real termination argument for the defuse loop by @PerryLink in #4372
- fix(tui): avoid redundant frames for hidden-sidebar usage updates by @dgageot in #4523
- fix: stabilize debug-tool test against windows shell flake by @dgageot in #4524
- test(runtime): isolate client fixtures on private HTTP transports by @aheritier in #4526
- test(eval): avoid writing executable runtimes during parallel tests by @aheritier in #4527
- fix(chatgpt): infer image input from OpenAI catalogue by @aheritier in #4528
- feat(eval): add evaluator judge backend by @dgageot in #4531
- feat(skills): load skills from public GitHub repositories by @dgageot in #4525
- feat: price OpenAI fast/priority and ultrafast by actual service tier by @dgageot in #4532
- refactor: separate loader defaults, bootstrap runtime opts, narrow chatserver contract by @dgageot in #4533
- fix(models): align provider IDs with the catalogue by @aheritier in #4530
- docs: add Nativ provider guide by @dgageot in #4534
- feat: route evaluators through the models gateway, add OpenAI Decisions by @dgageot in #4537
- fix: keep lean TUI working indicator above the input by @rumpl in #4538
- fix: honor configured OpenAI base_url when pricing fast tiers by @dgageot in #4536
New Contributors
- @PerryLink made their first contribution in #4372
Full Changelog: v1.148.0...v1.149.0
v1.148.0
This release fixes two issues: oversized tool output handling and duplicate line rendering in the lean TUI.
Bug Fixes
- Fixes oversized tool results from blocking chat or compaction requests by bounding complete tool results to 50 KiB and sanitizing historical tool results on outgoing requests
- Fixes duplicate lines appearing while streaming wrapped text in the lean TUI by avoiding replay of archived lines when markdown changes only affect ANSI formatting
What's Changed
- fix: bound tool results and recover oversized session history by @melmennaoui in #4515
- fix(leantui): avoid duplicate lines while streaming wrapped text by @rumpl in #4503
- docs: update CHANGELOG.md for v1.147.0 by @docker-read-write[bot] in #4517
Full Changelog: v1.147.0...v1.148.0
v1.147.0
This release adds hook-driven agent routing, a lean TUI settings panel, codemode tool call visibility, and several new CLI and eval capabilities, alongside a broad set of bug fixes for assistant message handling, DMR routing, and TUI rendering.
What's New
- Adds a
/settingscommand to the lean TUI with an inline settings panel supporting keyboard navigation, save/cancel, and persistence of preferences - Adds hook-driven agent routing with a
routingblock (allowed_agents,default_agent) and newbefore_agent_run/after_agent_completehook events - Adds native JSON field selection (
transform_json) as a builtin hook for trimming tool response payloads - Adds a
debug toolcommand (docker agent debug tool <config> <tool> [JSON params]) to call tools directly outside of any LLM loop - Adds
--lastflag todocker agent run --execto print only the final answer, buffering intermediate output - Adds
max_output_bytesfield to theopenapitoolset to cap response text size (omitting it keeps the 30,000-byte default;0disables the cutoff) - Adds
SessionRecoveredevent for idle recovery boundaries in the runtime - Exposes codemode tool calls and highlights scripts in TUIs, emitting standard tool-call, streamed-output, and response events for tools invoked inside Code Mode
- Returns promises from codemode tool calls, supporting concurrent execution,
Promise.all,Promise.allSettled, and top-level await - Supports
DOCKER_AGENT_DATA_DIRenvironment variable for setting the data directory - Adds repeat stability and cost outlier reporting to eval runs with
--repeat > 1 - Adds
--flavorsupport and structured tool output capture todocker agent eval
Improvements
- Lean TUI unmatched slash queries now fall back to model selection instead of dismissing the menu, supporting multi-term queries like
/openai astra - Prompt history now follows
--data-dir(including~expansion) and forwards the setting to the sandbox - Eval judge model default updated to
openai/gpt-5.6-terra
Bug Fixes
- Fixes DMR commands routing through the selected Docker connection (context/host/config/TLS) instead of falling back to a hardcoded local socket
- Fixes DMR transport errors to include the name of the selected Docker connection (
--host,--context, etc.) - Fixes assistant messages being dropped across TUIs, remote sessions, and recovery
- Fixes tool-call XML leaking into canonical and reloaded assistant text
- Fixes generated media losing stable identity on redraw in the TUI
- Fixes remote session history loss across idle recovery, OAuth elicitation, and snapshots taken mid-turn
- Fixes lean TUI tool updates duplicating content in terminal scrollback
- Fixes lean TUI replaying the full offscreen suffix on every redraw
- Fixes tool argument declaration order not being preserved in generated schemas
- Fixes reasoning and response output running together in exec text mode — a blank line is now inserted between them
- Fixes eval containers picking up a stale local agent image digest instead of the most recently built one
- Fixes
--data-dirnot expanding~and not forwarding the path to the sandbox - Clarifies
/speaktranscription requirements: requiresOPENAI_API_KEYand does not work with the Docker models gateway
Technical Changes
- Removes flaky
TestTmuxVisibilityLifecycletmux integration test
What's Changed
- chore: refresh models.dev snapshot (+38 -14 ~95) by @github-actions[bot] in #4482
- chore: refresh models.dev snapshot (+30 -14 ~39) by @github-actions[bot] in #4483
- feat: add settings command to lean TUI by @rumpl in #4484
- fix: route DMR through the selected Docker connection safely by @dgageot in #4481
- feat: return promises from codemode tool calls by @rumpl in #4487
- test(tui): remove flaky tmux visibility lifecycle test by @rumpl in #4488
- docs: auto-update for merged PRs (2026-10-01) by @aheritier in #4489
- fix: name selected Docker connection in DMR transport errors by @dgageot in #4491
- feat(openapi): add max_output_bytes to cap response text size by @dgageot in #4490
- feat: add debug tool command to call tools directly by @dgageot in #4492
- fix: stop dropping assistant turns across TUIs, remote sessions and recovery by @dgageot in #4493
- feat: expose codemode tool calls and highlight scripts in TUIs by @rumpl in #4494
- feat: honor --data-dir for prompt history and sandbox forwarding by @dgageot in #4496
- feat: add hook-driven agent routing by @hamza-jeddad in #4495
- fix: clarify speech input requirements by @aheritier in #4498
- feat(eval): forward --flavor overrides and record structured tool output by @dgageot in #4499
- feat(eval): report repeat stability and cost outliers by @dgageot in #4500
- docs: auto-update for merged PRs (2026-10-03) by @aheritier in #4502
- fix: prevent lean TUI tool updates from duplicating scrollback by @rumpl in #4501
- fix(eval): pin local agent image digest when building containers by @dgageot in #4506
- fix(leantui): switch unmatched slash queries to model selection by @rumpl in #4507
- chore: refresh models.dev snapshot (+132 -38 ~155) by @github-actions[bot] in #4511
- feat: add --last flag for exec to print only the final answer by @dgageot in #4504
- feat(hooks): add transform_json builtin for field selection by @dgageot in #4505
- fix: preserve tool argument declaration order by @rumpl in #4508
- fix(cli): separate reasoning from response in exec text mode by @dgageot in #4513
- eval: default judge model to openai/gpt-5.6-terra by @dgageot in #4514
- docs: auto-update for merged PRs (2026-10-05) by @aheritier in #4509
Full Changelog: v1.146.0...v1.147.0
v1.145.0
This release adds ACP request trace propagation, new lint cops for code quality, and a fix for lean TUI scrollback preservation during partial tool calls.
What's New
- Adds ACP request trace propagation using W3C
traceparent/tracestateheaders, with server spans for each of the 13 implemented agent protocol handlers - Adds
Lint/FieldsSeqLookupcop to detectstrings.Fieldslookup patterns that could usestrings.FieldsSeqinstead - Adds
Lint/SlicesConcatcop to flag nestedappendchains that could be replaced withslices.Concat
Bug Fixes
- Fixes lean TUI scrollback being lost during partial tool calls by repainting only visible rows when a streaming tool call changes above the viewport
Technical Changes
- Replaces multi-source
appendchains withslices.Concatacross the codebase - Warms Linux and Windows Go build caches on main when tests are skipped
What's Changed
- feat(acp): propagate request traces and test capability matrix by @dgageot in #4471
- feat(lint): detect strings.FieldsSeq lookup opportunities by @dgageot in #4456
- ci: warm Linux/Windows build caches when tests are skipped on main by @dgageot in #4473
- test(tui): fix startup resize race in hidden-frame tests by @dgageot in #4474
- docs: update CHANGELOG.md for v1.144.0 by @docker-read-write[bot] in #4472
- refactor: replace append chains with slices.Concat by @dgageot in #4461
- fix: preserve lean TUI scrollback during partial tool calls by @rumpl in #4477
- chore(deps): bump the actions group across 2 directories with 6 updates by @dependabot[bot] in #4478
Full Changelog: v1.144.0...v1.145.0
v1.144.0
This release expands ACP v1 compatibility with session management, audio prompts, client terminals, remote MCP servers, and host credential authentication, while also closing several sandbox and filesystem confinement gaps and improving TUI rendering performance.
What's New
- Adds ACP session deletion after draining owned work, with
sessionCapabilities.deletesupport - Adds ACP elicitation bridge supporting negotiated form and URL elicitation capabilities
- Adds ACP session model reasoning and safety options, including
session/set_config_optionand legacysession/set_mode - Adds ACP shell tool execution through client terminals via
terminal/createand related wire methods - Adds ACP support for client-supplied Streamable HTTP and legacy SSE MCP servers in
session/new,session/resume, andsession/load - Adds ACP host credential authentication and connection-local logout
- Adds ACP audio prompt support and bounded history replay
- Adds ACP message identity persistence and tool name exposure
- Adds sandbox cloud mode (
--cloud) and v3 kit support for running sandboxes without a local Docker dependency - Adds evaluator support for exact endpoints on compatible services via an optional
endpointfield inEvaluatorConfig - Adds
Lint/CutPrefixcop to detectHasPrefix+TrimPrefixpatterns that should usestrings.CutPrefix - Adds
Lint/CutSuffixcop to detectHasSuffix+TrimSuffixpatterns that should usestrings.CutSuffix - Adds
Lint/SlicesClonecop to detect manual slice-copy idioms that should useslices.Clone - Adds
Lint/SortStableFunccop to detectsort.SliceStablecalls that should useslices.SortStableFunc - Adds additional lint cops:
Lint/SplitTrimJoin,Lint/NewExpr,Lint/FieldsSeq, and detectors for AWS scalar pointer helpers, paired reflection field loops, stdlib UUID string opportunities, equivalent manual URL clones, buffered JSON newline workarounds, and simple benchmark loop modernization
Improvements
- Streams bang command progress in TUIs, running commands asynchronously and emitting lifecycle/output events in both lean and full TUIs
- Replaces tmux focus-events heuristic with an async poll that checks real pane visibility, so only hidden panes pause rendering
- Keeps tmux chooser previews rendering continuously
- Reuses chat pane formatting while scrolling the sidebar, avoiding redundant re-formatting on unchanged message content
- Migrates
sort.SliceStableusages toslices.SortStableFuncin model picker, lean TUI, and deferred search ranking - Migrates manual slice-copy idioms to
slices.Cloneacross the codebase - Migrates
HasPrefix+TrimPrefixandHasSuffix+TrimSuffixpatterns tostrings.CutPrefix/strings.CutSuffixacross multiple packages
Bug Fixes
- Fixes
nonereasoning effort being ignored on GPT-6 Sol/Luna models, which caused silent fallback to"low"effort - Fixes skill supporting-file reads to be confined to the skill directory using
os.OpenRoot, preventing symlink escapes - Fixes filesystem path policies to reject dangling symlinks
- Fixes prompt file staging to be confined to the kit directory
- Fixes sandbox skill staging reads to be anchored to the source root
- Fixes tool extraction to use
os.Rootconfinement, closing a symlink-swap gap during archive extraction - Fixes forked skill output and session IDs from bleeding across message groups by keying batching on session ID in addition to agent name
- Fixes active segment offset going stale when an earlier message resizes while scrolled up, preventing clipped transcript rendering
Technical Changes
- Refactors TUI command contracts, tool confirmation dialogs, and tool renderer registry to be dependency-light and reusable
- Enables
errorsastypeandreflecttypeassertlint modernization checks - Switches to shared cops from
rubocop-go v1.0.0, removing duplicate local implementations
What's Changed
- fix: stream bang command progress in TUIs by @rumpl in #4423
- fix(tui): pause rendering only for hidden tmux panes by @dgageot in #4429
- feat(acp): delete sessions after draining owned work by @dgageot in #4431
- docs: update CHANGELOG.md for v1.143.0 by @docker-read-write[bot] in #4430
- feat(lint): enforce recent Go modernization patterns by @dgageot in #4433
- test: make timer coverage deterministic with synctest by @dgageot in #4436
- test(httpclient): use in-memory HTTP for SSE filter tests by @dgageot in #4437
- fix(skills): confine supporting-file reads to the skill directory by @dgageot in #4438
- feat(acp): bridge negotiated form and URL elicitation by @dgageot in #4434
- fix: support none reasoning effort on GPT-6 Sol/Luna by @dgageot in #4435
- test(tui): wait for shell completion in bang command tests by @dgageot in #4439
- chore(deps): bump charm.land/bubbletea/v2 v2.0.9→v2.0.10 by @dgageot in #4442
- chore(deps): bump github.com/docker/cli to v29.8.1 by @dgageot in #4443
- test: speed up slow test suites with deterministic waits by @dgageot in #4444
- feat(acp): expose session model reasoning and safety options by @dgageot in #4445
- feat(evaluators): support exact endpoints for compatible services by @dgageot in #4432
- test: make board heartbeat checks deterministic by @dgageot in #4447
- feat(acp): execute shell tools through client terminals by @dgageot in #4448
- fix: confine tool extraction with os.Root by @dgageot in #4446
- docs: auto-update for merged PRs (2026-09-25) by @aheritier in #4449
- feat(acp): support client-supplied HTTP and SSE MCP servers by @dgageot in #4450
- fix: stop forked skill output from bleeding across message groups by @dgageot in #4451
- feat(acp): add host credential authentication and connection logout by @dgageot in #4452
- fix: close filesystem and sandbox kit confinement gaps by @dgageot in #4440
- chore(lint): use shared cops from rubocop-go v1.0.0 by @dgageot in #4441
- fix: keep active segment offset in sync when earlier item resizes by @dgageot in #4454
- test: synchronize askpass helper cancellation test by @dgageot in #4459
- lint: add SlicesClone cop and migrate manual slice-copy idioms by @dgageot in #4462
- test: fix encrypt mode timestamp flake by @dgageot in #4457
- feat(acp): support audio prompts and bounded history replay by @dgageot in #4464
- chore(deps): bump AWS SDK v2 direct dependencies by @dgageot in #4466
- lint: add SortStableFunc cop for sort.SliceStable migrations by @dgageot in #4460
- feat(sandbox): add cloud mode and v3 kit support by @dgageot in #4465
- feat(lint): detect strings.CutPrefix opportunities by @dgageot in #4455
- feat(acp): persist message identities and expose tool names by @dgageot in #4468
- perf(tui): reuse chat pane formatting while scrolling sidebar by @dgageot in #4469
- refactor(tui): make reusable components dependency-light by @dgageot in #4470
- feat(lint): add CutSuffix cop and fix its findings by @dgageot in #4458
Full Changelog: v1.143.0...v1.144.0
v1.143.0
This release delivers a large set of ACP (Agent Control Protocol) compatibility improvements, new evaluator and provider features, and significant TUI stability fixes, alongside broad test modernization using Go's synctest framework.
What's New
- Adds
session/loadACP endpoint that reconnects to a session and replays persisted history before returning the load response - Adds support for client-supplied stdio MCP servers in ACP
session/newandsession/resume, with eager initialization and per-session ownership - Adds provider-backed evaluators with TypeSafe Jev support, wiring named evaluators into the hook system
- Tracks evaluator token usage and cost across sessions, budgets, and the cost dialog
- Adds
provider_opts.extra_bodypassthrough for Chat Completions, enabling vendor-specific fields (e.g.,reasoning_effort,enable_thinking) to be forwarded to backends - Implements ACP slash commands
/compact,/usage, and/newwith real dispatch under session turn admission and cancellation handling - Adds
skill_content_guardandprompt_file_guardhook events for operator-controlled interception of skill content and prompt file loading - Adds custom lint rules detecting split-trim-join suffix loops, temporary pointer returns with
newexpressions, and fields slices used only for iteration
Improvements
- Keeps the TUI composing frames and running animation ticks when the terminal is unfocused or in an inactive tmux pane; removes the tmux startup focus probe and deferred-render behavior
- Trims textarea padding using
strings.CutLastin the TUI for faster word wrapping - Iterates wrapped and dialog words in the TUI without allocating a fields slice
Bug Fixes
- Fixes ACP "Allow and remember my choice" scoping so approval is remembered only for the selected tool, not the entire session
- Fixes ACP iteration-limit permission handler to require an exact
continueselection, rejecting unknown, empty, or wrong-case option IDs - Fixes stale scrollbar state causing the conversation view to jump to incorrect positions on mouse release
- Fixes ACP to load a fresh team and provider registry per session, so workspace-rooted toolsets resolve paths against the correct session workspace
- Fixes ACP to enforce filesystem policies and post-edit hooks before read/write/edit RPCs, and to reject dangling symlinks
- Fixes ACP resume to validate workspace identity with
os.SameFileand replace additional roots correctly without rewriting persisted workspace provenance - Fixes ACP session close to drain foreground turns, runtime cleanup, and toolset shutdown before acknowledging close, preventing races with resume
- Fixes ACP to decline unsupported elicitation requests immediately rather than waiting indefinitely
- Fixes ACP to report accurate prompt outcomes (
end_turn,max_tokens,refusal,max_turn_requests,error) instead of always returningend_turn - Fixes ACP to filter and paginate
session/listresults (max 50 per page, ordered by creation time), honoring optionalcwdfilters and keyset cursors - Fixes ACP to capture accurate edit diffs from full client-read content and to resolve tool locations to absolute paths
- Fixes ACP tool-call lifecycle reporting to track each tool with a stable ACP ID through
pending,in_progress, and completion states - Fixes ACP to honor client filesystem capabilities during tool discovery and to read client-provided content in
read_multiple_files - Fixes ACP to preserve prompt attachments (embedded text, blobs, images, file links) and decode file URIs only once
- Fixes ACP multi-agent cost tracking to accumulate costs by runtime session ID rather than replacing root-session display with child costs
- Fixes ACP to emit empty plan snapshots so clients clear stale plans when the todo list is emptied
- Fixes
GOOGLE_GENAI_USE_VERTEXAIto be parsed as a boolean, so setting it tofalseor0correctly disables Vertex AI routing - Fixes TUI goroutine leaks when sessions close (throttler and fan-out goroutines now stop with the app context)
- Fixes TUI to reconcile transcript geometry before scroll-state clamping, preventing the conversation view from jumping during background updates
- Fixes ACP to preserve parallel tool batches when replaying evaluator events
- Fixes ACP to validate and fully account evaluator request usage
- Fixes runtime to preserve tool callback scope during manual compaction
- Fixes
SkillContenttype placement to break a tools→skills→httpclient→desktop import cycle
Technical Changes
- Refreshes the models.dev catalog snapshot embedded in the binary (multiple updates)
- Marks models.dev snapshot files as linguist-generated in
.gitattributesto collapse diffs on GitHub - Migrates UUID generation and parsing to Go 1.27 stdlib
uuidpackage, removing thegithub.com/google/uuiddependency from the common path - Adopts
errors.AsTypegeneric helper across 34 call sites, replacing thevar target *Type; errors.Aspattern - Adopts
sync.WaitGroup.Goin the scheduler and test workers - Adopts
reflect.Value.Fieldsfor hook field iteration andreflect.TypeAssertin TUI test helpers - Replaces Bedrock AWS pointer helpers (
aws.String,aws.Int32,aws.Float32) with Go 1.26new(expr) - Replaces manual URL struct copy in
EgressProxyFromContextwithurl.URL.Clone - Simplifies JSON tool result encoding using
encoding/json/v2 - Converts a large number of concurrency-heavy tests across the codebase to use Go's
synctestframework for deterministic timing - Stores TUI frame dumps in test artifact directories via
testing.TB.ArtifactDir() - Reverts OpenAI SDK bump pending license approval
What's Changed
- docs: update CHANGELOG.md for v1.142.0 by @docker-read-write[bot] in #4370
- chore: refresh models.dev snapshot (+262 -186 ~399) by @github-actions[bot] in #4369
- chore(deps): bump the actions group across 1 directory with 2 updates by @dependabot[bot] in #4368
- chore: mark models.dev snapshot files as generated in .gitattributes by @aheritier in #4371
- feat: add skill_content_guard and prompt_file_guard hook events by @dgageot in #4373
- fix(acp): scope remembered approval to the selected tool by @dgageot in #4376
- chore(deps): bump Go dependencies (anthropic, openai, goja, libopenapi, doublestar, smithy-go, x/tools) by @dgageot in #4374
- fix(acp): reject unknown iteration-limit permission choices by @dgageot in #4377
- fix(tui): prevent stale scrollbar state from jumping the conversation by @dgageot in #4378
- fix(acp): load workspace-rooted teams per session by @dgageot in #4379
- fix(acp): enforce filesystem policies and post-edit hooks by @dgageot in #4380
- fix(acp): validate resume workspaces and replace additional roots by @dgageot in #4381
- feat: add provider-backed evaluators with TypeSafe Jev by @dgageot in #4375
- chore(deps): bump portcullis v1.0.0→v1.1.0 and libopenapi v0.39.0→v0.39.1 by @dgageot in #4382
- fix(acp): synchronize session close and shutdown by @dgageot in #4383
- fix(acp): decline unsupported elicitation requests by @dgageot in #4385
- feat(acp): support client-supplied stdio MCP servers by @dgageot in #4386
- feat: track evaluator usage and cost across sessions and budgets by @dgageot in #4387
- fix(acp): report accurate prompt outcomes and structured errors by @dgageot in #4388
- chore: refresh models.dev snapshot (+247 -54 ~151) by @github-actions[bot] in #4389
- fix(acp): filter and paginate session listings by @dgageot in #4390
- chore: refresh models.dev snapshot (+58 -0 ~74) by @github-actions[bot] in #4392
- feat(acp): implement supported slash commands by @dgageot in #4391
- fix(acp): capture accurate edit diffs and absolute tool locations by @dgageot in #4393
- fix(acp): report consistent tool-call lifecycles by @dgageot in #4394
- fix: treat GOOGLE_GENAI_USE_VERTEXAI as a boolean by @dgageot in #4395
- fix(acp): honor client filesystem capabilities and batch reads by @dgageot in #4396
- feat(providers): add provider_opts.extra_body passthrough for Chat Completions by @dgageot in #4397
- test: stabilize failed-turn conversation cache coverage by @dgageot in #4398
- refactor(httpclient): use URL.Clone for egress proxy URLs by @dgageot in #4399
- test(wire): use in-memory HTTP test servers by @dgageot in #4403
- refactor: simplify JSON tool result encoding by @dgageot in #4402
- refactor: migrate UUID generation and parsing to Go 1.27 stdlib by @dgageot in #4404
- test: remove environment and timing dependencies from flaky tests by @dgageot in https://github.com/docker...
v1.142.0
This release adds several new features including background agent synchronization, native Anthropic compaction, expanded Gemini capabilities, OpenAI provider options, and a WebAssembly shared runtime, alongside numerous bug fixes for token accounting, streaming usage, and cost tracking.
What's New
- Adds
wait_background_agentstool that performs an all-settled join on a caller-supplied list of task IDs, waiting up to a configurable timeout and returning an ordered result array - Adds native Anthropic conversation compaction with replay guards and prefix mismatch controls, opt-in progress updates, strict tool argument enforcement, cache diagnostics, and request-context secret redaction
- Adds
cache_diagnostics,preserve_reasoning, andnative_tool_searchprovider opts for OpenAI's Responses API - Adds native Gemini text embeddings support, enabling RAG use-cases on Gemini via the dedicated embeddings API
- Adds support for Gemini service tiers via
provider_opts.service_tier, including flex tier with extended idle timeout handling - Adds support for Gemini URL Context via
provider_opts.url_context: true, allowing the model to fetch and reason over public URLs at inference time - Adds Docker Model Runner model metadata and context limit discovery via the
/engines/_configureendpoint, enabling auto-compaction and context gauge support for DMR models - Replaces the WebAssembly bespoke event loop with the shared
embeddedchat-backed agent runtime, adding portable tools, in-memory storage, egress proxy, session-scoped MCP OAuth token stores, and opt-in cloud provider builds
Improvements
- Defers TUI frame composition while the terminal is blurred, avoiding unnecessary rendering work during unfocused sessions
Bug Fixes
- Fixes deferred tail buffer not being cleared when a different assistant message becomes the active owner, preventing old content from bleeding into new message output
- Fixes Gemini native tool-call IDs being stripped instead of preserved, and fixes tool-response name matching to prevent malformed conversation history
- Fixes Gemini native tool-call
ProviderIDnot being preserved in the WASM accumulator - Fixes session compaction not drawing from the session's cost or token budgets, allowing spend beyond configured ceilings
- Fixes TUI animations continuing to run in unfocused and detached (tmux) sessions
- Fixes empty, refused, or reasoning-only assistant responses being skipped even when the provider reported billable usage
- Fixes OpenAI WebSocket pool allowing a single idle connection to be shared across concurrent streaming requests, which could corrupt both responses
- Fixes concurrent map and slice access on session model-state fields (
AgentModelOverrides,CustomModelsUsed) causing data races - Fixes unsafe concurrent
CloseandNext/retry calls on WebSocket and Anthropic streams - Fixes runtime streams being abandoned before fully drained, which could release streaming locks or turn tokens prematurely
- Fixes cache tokens not being counted toward
max_tokenstoken budgets; previously only input+output tokens were counted, allowing cache-heavy calls to bypass configured limits - Fixes Gemini tool-use input tokens (
ToolUsePromptTokenCount) being dropped, understating token usage and cost - Fixes Anthropic streaming input token counts and cache read/write metrics being dropped because they were read from
message_deltainstead of the accumulated usage object - Fixes per-call telemetry costs being reported incorrectly; previously cumulative session cost was emitted before the current call was charged
- Fixes context limits not being bounded before narrowing to int in the runtime
- Fixes deferral state not being preserved across session reloads for tools
- Fixes Bedrock SDK bearer authentication scheme configuration
- Fixes concurrent indexing usage accounting in RAG
Technical Changes
- Refactors external reference name and config import suffix parsing to use
strings.CutLast - Simplifies test sleep-and-wait pairs using Go 1.27's
synctest.Sleep - Simplifies composite literals in runtime and config packages using Go 1.27 promoted fields
- Adds
Lint/ExclusiveStreamLeaseanalyzer to detect shared WebSocket stream leases - Adds
Lint/SessionStateAccessorscop to require session model-state accessors - Adds
Lint/StreamCloseSafetycop to detect unsafe stream close access - Adds lint detection for abandoned runtime streams
- Consolidates and deduplicates documentation across custom commands, thinking/task budgets, provider credentials, MCP configuration, server CLI flags, generated media, provider inheritance examples, and tool concepts
What's Changed
- refactor: parse reference names and import suffixes with strings.CutLast by @dgageot in #4325
- test: simplify sleep-and-wait pairs with synctest.Sleep by @dgageot in #4323
- refactor: simplify literals with Go 1.27 promoted fields by @dgageot in #4324
- docs: update CHANGELOG.md for v1.141.0 by @docker-read-write[bot] in #4326
- chore(deps): bump openai-go/v3 to v3.61.0 by @dgageot in #4327
- fix: preserve final TUI responses across deferred message transitions by @dgageot in #4328
- feat: add wait_background_agents join tool by @dgageot in #4330
- docs: consolidate custom command documentation by @dgageot in #4331
- docs: consolidate thinking and task budget references by @dgageot in #4332
- docs: centralize provider credential reference by @dgageot in #4333
- docs: separate MCP and shared tool configuration references by @dgageot in #4334
- fix(gemini): preserve native tool-call IDs and fix tool-response matching by @dgageot in #4339
- docs: centralize server CLI flag tables by @dgageot in #4335
- docs: consolidate generated media documentation by @dgageot in #4336
- docs: reuse provider inheritance examples by @dgageot in #4337
- docs: link tool concepts to the canonical catalog by @dgageot in #4338
- fix: charge compaction to shared session budgets by @dgageot in #4343
- feat(dmr): discover model metadata and context limits by @dgageot in #4340
- feat(openai): add cache_diagnostics, preserve_reasoning, and native_tool_search provider opts by @dgageot in #4355
- fix: report per-call costs in telemetry by @dgageot in #4341
- feat: support native Gemini text embeddings by @dgageot in #4350
- feat(anthropic): native compaction, progress updates, strict tools, cache diagnostics, and secret redaction by @dgageot in #4354
- feat: support Gemini service tiers by @dgageot in #4348
- fix(app): guard session model state with an accessor cop by @dgageot in #4347
- fix(tui): pause animations in unfocused and detached sessions by @dgageot in #4344
- fix(runtime): retain costs for empty assistant responses by @dgageot in #4345
- feat: support Gemini URL Context by @dgageot in #4349
- perf(tui): defer frame composition while blurred by @dgageot in #4342
- fix(openai): lease WebSocket connections exclusively by @dgageot in #4346
- fix: account for Gemini tool-use input tokens by @dgageot in #4359
- fix(runtime): count cache tokens toward token budgets by @dgageot in #4358
- fix: preserve Anthropic streaming input and cache usage by @dgageot in #4360
- test(tui): fix ordering race in TestThemeWatcher_WatchUserTheme by @aheritier in #4305
- fix: drain runtime streams before releasing turn ownership by @dgageot in #4353
- chore(deps): bump anyio from 4.9.0 to 4.14.2 in /examples/dhi/dhi_mcp_server in the pip group across 1 directory by @dependabot[bot] in #4361
- docs: auto-update for merged PRs (2026-09-19) by @aheritier in #4362
- feat(wasm): shared runtime, portable tools, in-memory storage, egress proxy, and cloud provider builds by @dgageot in #4357
- docs: auto-update for merged PRs (2026-09-21) by @aheritier in #4367
Full Changelog: v1.141.0...v1.142.0
