Agent Deck v1.16.27
Terminal session manager for AI coding agents.
Installation
Homebrew (recommended):
brew install asheshgoplani/tap/agent-deckQuick Install:
curl -fsSL https://raw.githubusercontent.com/asheshgoplani/agent-deck/main/install.sh | bashGo Install:
go install github.com/asheshgoplani/agent-deck/cmd/agent-deck@v1.16.27What's new in 1.16.27
Fixes
inbox exportandremote drainstay inside one profile. The export returns only the invoking profile's records (never a record without a profile), including on the--aftercursor path, and a drain always names the remote's configured profile and drops any other profile's record before it is written (#2539, reported by @jwr456).session send --waitand--streamreturn the reply when Claude writes its final message as separate thinking and text records, instead of an earlier sentence from the same turn (#2543, fixes #2540, thanks @wallacms).- A Codex Guardian review thread no longer replaces a session's saved Codex id, and restart resumes the user's own thread (#2546, fixes #2529, thanks @seanfreiburg, and @tomasaschan for the report).
session sendto Codex adopts the live user thread when the stored id has gone stale, so sends are no longer refused forever. Ambiguous, sub-agent, Guardian and peer-owned threads are never adopted. A refused send reportsacceptance_unavailable, and a queued send fails after 5 consecutive refusals (about 15 seconds) with the reason (#2549, reported by @Abeansits).- Codex sends respect an unsent draft in the composer: the send waits, then is refused with
composer_blockedwithout typing anything, and the queue retries it later (#2536, reported by @cherninely). - Capacity-queued sessions stay
queuedinstead of being reported and persisted aserror, so stopping a running session drains the queue again (#2528, fixes #2526, thanks @jtymas-preiss). - Session metrics and
health --jsonignore substate-only journal changes, so turn counts are no longer inflated and turn durations no longer reset (#2527, fixes #2525, thanks @jtymas-preiss). agent-deck attachforwards OSC 10/11 color replies, so tmux can answer a pane's foreground and background color queries (#2522, fixes #2520, thanks @AKarbas).- A fresh OpenCode session reads as waiting instead of running forever (the home-screen logo no longer matches the spinner rule), so gated sends are delivered; live pulses still read as busy while the composer is visible (#2523, fixes #2519, thanks @Skadoge, and @tedmellors for the report and macOS testing).
- pi 1.0.x panes are recognised: the context-usage footer counts as ready and the escape-interrupt bar as busy, so
launch --message-filedelivers and the startup watchdog no longer kills a healthy pi session (#2521, reported by @koenzhao). - The open-descriptor budget grows with the fleet (512 plus 16 per managed session, capped at four fifths of the soft open-file limit). The footer warns only after two consecutive over-budget samples and names the count, the budget and
agent-deck health(#2535, reported by @netllama).
Features
- A Claude session idle at its prompt with an armed Monitor shows as waiting with a
watchingsubstate and a watcher count, instead of running. A finite Workflow, background agent or shell still keeps the session running. inbox export --profile <name>selects the profile to export. It defaults to the invoking profile and refuses a value that disagrees with-p(#2539).
Conductor
- A conductor start or restart sends one recovery turn, so the conductor resumes its durable work instead of sitting idle. On by default; set
[conductor] recovery_turn = falseto turn it off (#2518, reported by @kaneda-fr). - Slack routing gains
default_conductorfor unprefixed messages and thread affinity, so replies in a conductor's thread (including NEED alert threads) reach that conductor.conductor setupkeeps existing Slack keys when it adds tokens (#2548, fixes #2547, thanks @koenzhao). [conductor] permission_ask = falsedrops the managed ask list from the conductor's Claude settings on the nextagent-deck conductor setup <name>, so auto mode decides on mutating commands. The default staystrue(#2544, fixes #2541, thanks @wallacms).
OpenCode 2.x
- Sessions are discovered through the shared service API: listing follows the pagination cursor, sub-agent roots are skipped, an unbound session adopts only a conversation created after it started, and a bound session keeps its id instead of switching to a newer sibling (#2512, thanks @3rwww1).
- The shared
opencode serve --serviceprocess is never owned or reaped by a deck session, while 1.x per-session servers are still cleaned up (#2514, thanks @3rwww1). Forks and status over the service event stream (#2513, #2515) follow in a later release; tracking issue: #2511.
Watchers
- Routed watcher events and health alerts reach the conductor while the TUI is attached to a session. Delivery to each conductor pane is one event at a time and in order, the backlog is bounded and kept across a quit, and quit reports what is still undelivered (#2534, fixes #2524, thanks @AndreIntelas).
watcher create webhook --port Nwrites the port into the watcher config, so the engine listens on it, and create refuses to overwrite an existing watcher config (#2532, reported by @AndreIntelas).- ntfy and Slack watchers keep their resume position across restarts and catch up on messages published while agent-deck was down. Replay is bounded to 24 hours by default (
[source] resume_max_age,"0"turns the bound off), and bursts over 64 messages are no longer dropped (#2538, reported by @AndreIntelas). - Watcher health alerts go to the conductor the watcher routes to, once per change into warning or error, followed by one recovery notice (#2531, reported by @AndreIntelas).
Internal
- Opt-in telemetry only (nothing changes while telemetry is off):
- Saying yes again after the schema 3 re-prompt keeps the existing install id and sends data recorded before the yes instead of deleting it; the prompt says so. A lowered level never sends events recorded earlier at
full. - CLI features are counted after the command finishes, with failures as errors and without first-use milestones;
fleet statusandfleet recoverare no longer reported as fleet launches, mistyped flags are still counted, anduninstallno longer recreates the telemetry directory. See "How CLI commands are counted" in TELEMETRY.md for the effect on trends. activity.hourlyis sent once per local hour across TUI runs;install.tickcarries the coarseosandarch(schema stays 3, no new prompt); daily rollups carry the release that recorded the day and a neutral actor and surface.- TUI sends, rename, group create and move to group are counted; plain
addrecords its session create and a CLI fork is labelledcli_fork; the default CLIsession stopand web stop and restart record session end; every update install path records its outcome; real failures (session start, send, MCP config, worktree, web 5xx, TUI exit) are recorded as error events. 13 events that no release emits are listed as planned. - An upload no longer holds the telemetry state lock during the network send, so the TUI start that uploads keeps its own start events.
- Saying yes again after the schema 3 re-prompt keeps the existing install id and sends data recorded before the yes instead of deleting it; the prompt says so. A lowered level never sends events recorded earlier at
- A UI test no longer leaks XDG directories into later tests (#2533, reported by @AndreIntelas).
- Regression tests for #2529, #2541, #2543 and the OpenCode shared service (#2514) are part of the repository.
- The contributor self-check runs Go tests only inside a container and otherwise prints the Docker command.
Upgrading
- #2539: a drain from an upgraded host against a remote that is still on 1.16.26 or older now fails with
flag provided but not defined: -profileinstead of receiving every profile's records. Update the remote (agent-deck remote update <name>) first.inbox exportrun by hand returns only the invoking profile's records; export each profile separately if you relied on the host-wide output. - #2518: the recovery turn is on by default and costs one turn per conductor start or restart. Opt out with
[conductor] recovery_turn = false. - #2544:
[conductor] permission_askdefaults totrue(unchanged behavior). Setting it tofalsetakes effect when you runagent-deck conductor setup <name>again, and it also removes a user ask rule that is identical to a managed entry. - #2548:
default_conductorand thread affinity are Slack only; Telegram, Discord and/ad-restartstill route an unprefixed message to the first conductor. - #2536: a Codex send into a pane showing an approval menu or the transcript overlay is now held and then refused instead of typed into it.
Known issues
- govulncheck reports GO-2026-6617 (HTTP/2 server crash in golang.org/x/net and net/http); agent-deck serves no HTTP/2 (plain http.Server, no TLS, no h2c), so it is not reachable; the Go 1.26.9 and x/net 0.60.0 move ships in the next release.
Thanks to @wallacms, @jtymas-preiss, @AndreIntelas, @3rwww1, @koenzhao, @seanfreiburg, @Skadoge and @AKarbas for their pull requests, and to @jwr456, @tomasaschan, @Abeansits, @cherninely, @tedmellors, @netllama and @kaneda-fr for their reports.
Full Changelog: v1.16.26...v1.16.27