Skip to content

v1.143.0

Latest

Choose a tag to compare

@docker-read-write docker-read-write released this 24 Sep 12:22
· 48 commits to main since this release
d27c65c

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/load ACP 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/new and session/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_body passthrough 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 /new with real dispatch under session turn admission and cancellation handling
  • Adds skill_content_guard and prompt_file_guard hook 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 new expressions, 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.CutLast in 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 continue selection, 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.SameFile and 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 returning end_turn
  • Fixes ACP to filter and paginate session/list results (max 50 per page, ordered by creation time), honoring optional cwd filters 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_VERTEXAI to be parsed as a boolean, so setting it to false or 0 correctly 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 SkillContent type 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 .gitattributes to collapse diffs on GitHub
  • Migrates UUID generation and parsing to Go 1.27 stdlib uuid package, removing the github.com/google/uuid dependency from the common path
  • Adopts errors.AsType generic helper across 34 call sites, replacing the var target *Type; errors.As pattern
  • Adopts sync.WaitGroup.Go in the scheduler and test workers
  • Adopts reflect.Value.Fields for hook field iteration and reflect.TypeAssert in TUI test helpers
  • Replaces Bedrock AWS pointer helpers (aws.String, aws.Int32, aws.Float32) with Go 1.26 new(expr)
  • Replaces manual URL struct copy in EgressProxyFromContext with url.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 synctest framework 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 #4405
  • refactor(config): iterate hook fields with reflect.Value.Fields by @dgageot in #4406
  • refactor: adopt errors.AsType in error handlers by @dgageot in #4409
  • test(telemetry): use t.Output() for two lifetime-safe stderr loggers by @dgageot in #4410
  • fix: stop TUI goroutines when sessions close by @dgageot in #4414
  • refactor: adopt WaitGroup.Go for scheduler and test workers by @dgageot in #4411
  • fix(acp): preserve prompt attachments and decode file URIs once by @dgageot in #4412
  • refactor(bedrock): use new expressions for pointer values by @dgageot in #4407
  • test: store TUI frame dumps in test artifacts by @dgageot in #4408
  • test: harden flaky-test isolation and failure cleanup by @dgageot in #4415
  • test(tui): use reflect.TypeAssert in command helpers by @dgageot in #4413
  • test(acp): allow headroom for Windows workspace shell checks by @dgageot in #4416
  • fix(tui): reconcile transcript geometry before scroll-state clamping by @dgageot in #4419
  • fix(acp): separate root context from multi-agent cost by @dgageot in #4418
  • chore(deps): bump github.com/pb33f/libopenapi v0.39.1→v0.40.0 by @dgageot in #4422
  • fix(acp): emit empty plan snapshots by @dgageot in #4421
  • fix(tui): keep redrawing when unfocused by @rumpl in #4426
  • test: make isolated concurrency tests deterministic with synctest by @dgageot in #4427
  • feat(acp): load sessions with persisted history replay by @dgageot in #4428
  • test(app): use B.Loop in event merging benchmarks by @dgageot in #4425
  • feat(lint): flag split-trim-join, new-expr, and fields-seq waste by @dgageot in #4424

Full Changelog: v1.142.0...v1.143.0