·
48 commits
to main
since this release
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 #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