This release adds an opt-in shared plans sidebar to the TUI, delivers multiple performance improvements across session handling, tools, and filesystem operations, and fixes several bugs including lost user config updates and OpenCode session header handling.
What's New
- Adds an opt-in shared plans sidebar to the TUI (
settings.layout.show_plans), listing the five most recently updated shared plans with support for opening, refreshing, and browsing all plans
Improvements
- Avoids HTML escaping in JSON tool results, reducing unnecessary escape sequences in LLM payloads
- Trims redundant prompt text in the fetch tool
- Fixes O(n²) string conversion in URL prefix scanning (
urldetect) - Eliminates wasted
strings.Joinallocation inscrollview.composefor the two most common render paths - Replaces
strings.Splitwith lazystrings.SplitSeqinsearch_files_contentto avoid materializing full line slices (~9.5% allocation reduction) - Reduces attachment data URI allocations by replacing
fmt.Sprintfwith plain string concatenation - Adds
OwnMessageCountto count session messages without cloning the full message slice - Adds
AllMessageCountto count all messages across the session tree without cloning - Avoids cloning the session tree in last-message lookups (
getLastMessageContentByRole)
Bug Fixes
- Fixes sending of
x-opencode-sessionheader to OpenCode providers via a shared transport for all clients, gated on the host - Fixes plans sidebar reconciliation with upstream tab lifecycle in the TUI
- Fixes lost user config updates after file-lock timeouts by serializing in-process
Updatecalls with a mutex - Fixes eval agent validation to occur before judge setup, so missing or invalid agent configs fail early
Technical Changes
- Warms PowerShell before hook tests on Windows to avoid cold-start overhead interfering with the 60-second hook timeout
- Widens the program-quiescence settle window in TUI tests under
-raceto reduce flakiness - Records client lifetimes in
AGENTS.mdand points to the contributing guide - Documents
options.WithTokenSourcein the Go SDK guide - Trims comments in the OpenCode session transport, its tests, and the OpenCode gate/WebSocket fallback
What's Changed
- chore: update docker-agent-action to v2.0.8 by @docker-agent in #4298
- docs: update CHANGELOG.md for v1.140.0 by @docker-read-write[bot] in #4301
- feat(tui): add an opt-in shared plans sidebar by @gargsajal9 in #4253
- fix: send x-opencode-session header to OpenCode providers by @IsmaelMartinez in #4190
- chore: update docker-agent-action to v2.0.9 by @docker-agent in #4304
- test: warm PowerShell before hook tests on Windows by @aheritier in #4306
- docs: auto-update for merged PRs (2026-09-16) by @aheritier in #4308
- docs: record client lifetimes in AGENTS.md and point at the contributing guide by @IsmaelMartinez in #4197
- test(tui): widen the program-quiescence settle window for -race by @aheritier in #4307
- chore(deps): bump direct Go dependencies by @dgageot in #4311
- fix(eval): validate agent before judge setup by @aheritier in #4313
- perf(tools/fetch): avoid HTML escaping in JSON results and trim fetch prompt overhead by @dgageot in #4314
- perf(session): add OwnMessageCount to avoid cloning OwnMessages for a count by @dgageot in #4319
- perf: reduce attachment data URI allocations by @dgageot in #4318
- perf(urldetect): avoid O(n²) string conversion in URL prefix scan by @dgageot in #4315
- perf(filesystem): use strings.SplitSeq to avoid allocating line slice in search by @dgageot in #4317
- perf(tui): avoid discarded strings.Join in scrollview.compose by @dgageot in #4316
- perf(session): count messages without cloning session history by @dgageot in #4321
- fix(userconfig): prevent lost updates after lock timeouts by @dgageot in #4322
- perf(session): avoid cloning session tree in getLastMessageContentByRole by @dgageot in #4320
New Contributors
- @gargsajal9 made their first contribution in #4253
Full Changelog: v1.140.0...v1.141.0