Agent Deck v1.16.33
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.33Changelog
- e7167b6 build(deps-dev): bump vite from 8.3.1 to 8.3.4 in /tests/web in the npm_and_yarn group across 1 directory (#2829)
- fa53c4d docs(macapp): app-side checks of the Browser panel in macapp-open.md and events.md (#2750 step 5) (#2799)
- 7b6a294 feat(perf): opt-in local operation timings and agent-deck perf; cli.list bench guard (#2883)
- b12b080 feat(release): release-readiness check before a tag, update path end to end (#2785)
- 208076d feat(remote): Ctrl+V pastes a clipboard image into a remote attach (#2775)
- e4f8ece feat(remote): opt-in require_same_profile scopes remote talkback to the remote's profile (#2831) (#2886)
- 5251d6d feat(scripts): check-fix-has-test flags fix PRs without a regression test (#2788)
- 0934f44 feat(session): every session gets the identity block: ssh, sandbox, opencode, copilot (#2875)
- e92cd42 feat(session): idle sessions restart onto a newer Claude/Codex build (ASK-14) (#2787)
- 3257182 feat: hand a session to another as a reference (ASK-111) (#2882)
- 3f00704 feat: report a problem from the TUI and CLI, with a scrubbed preview (ASK-109) (#2887)
- 7e38565 fix(attach): hold keys typed while an attach starts; Ctrl+Q works from the first byte; rebind gate sized from the largest copy (#2856)
- cf922ad fix(bridge): find a renamed conductor's inbox by its conductor name (#2867)
- 2cf6927 fix(cli): launch, fork and move resolve -g like add; the TUI heartbeats on every status tick (#2845)
- eb9a2f7 fix(cli): self and auto-parent fallbacks match the whole tmux name, not its suffix (#2871)
- c7aa23a fix(codex): reconcile a send the running turn took up (#2836) (#2877)
- 2ea4bb3 fix(comms): read spool entries of one millisecond in write order (#2823) (#2859)
- 9e47880 fix(costs): compare cost_events timestamps as datetimes in ProjectedMonthly and PurgeOlderThan (#2811)
- 248ec99 fix(costs): start "this week" on the current Monday, not the previous one (#2812)
- b471303 fix(events): macapp events follow-ups (undoable deletes, box exit codes, private log, lowercase kinds) (#2761)
- 0682675 fix(inbox): say when no notify-daemon is running in drain and the fleet line (#2834) (#2863)
- 0b423bb fix(notify): stop re-reading the bus and spawning tmux per session every pass (#2770) (#2774)
- 2d75216 fix(opencode2): recognize newly created sessions as OpenCode (#2838)
- 1e29e5d fix(opencode2): retain launcher identity in the main menu (#2830)
- cc6814e fix(remote): image paste over ssh: no dropped Ctrl+V, size and timeout honest, safe paths, title restored (#2870)
- 61815ab fix(remote): kill ssh process groups on timeout/signal, bound remote commands (#2764)
- 9fe6c54 fix(remote): resolve single-target sessions without a full remote list (#2768)
- 4479e50 fix(security): bridges and webhook hardening (#2884)
- 908ab6d fix(security): private state files and sockets, per-user SSH control dir, env secrets out of argv (#2885)
- 5d2ddbd fix(security): shell-quote launch values and log folder-trust grants (#2876)
- ce87be9 fix(security): validate spawn-guard paths and log values; bound an args index (CodeQL) (#2891)
- 652b2b4 fix(send): a send to a busy session with queued input queues instead of being refused (#2847)
- 0e22bdc fix(session): a deliberate stop of a restarted child is not reported as an error (#2853) (#2888)
- de86d05 fix(session): a queued start seeds folder trust and delivers the -m message once (#2879)
- f0a7fdc fix(session): a restart is quiet on every path, not only the snapshot edge (#2792) (#2802)
- 589faaa fix(session): a resume-only restart sends the parent no completion notice (#2792) (#2793)
- fa7035b fix(session): a stop tells a restart from a dead-pane sample (#2874)
- a897aae fix(session): a stop writes stopped right after the kill, so an error sample cannot refuse it (#2850)
- 381bc03 fix(session): find Claude transcripts under the session's own config dir (#2769) (#2772)
- d50e9dd fix(session): no false 'resumed session reports an error' after an idle refresh (#2869)
- 7122aea fix(session): no false error or false finished record after a clean idle restart (#2866)
- 3cfe06e fix(session): refuse writes to another profile's state store (#2786)
- 868b8ca fix(session): sanitize the instance id and error in storage cleanup warnings (CodeQL) (#2892)
- 0074d6f fix(session): shell panes start with AGENTDECK_* set instead of a typed export (#2817) (#2842)
- fe7a604 fix(session): tell the parent when an idle child dies; send the idle-restart line when the boot flip is unseen (#2806, #2813) (#2846)
- 681ec52 fix(session): transcript readers follow the copy the live Claude writes after an account switch (#2840)
- cba073f fix(ssh): use %C in ControlPath so long user@host stays under sun_path (#2837) (#2849)
- 6104b32 fix(switch): hands-free account switch: settle after restart (trust, plugins, kick, verify) (#2778)
- 721f1bf fix(switch): keep a switch whose session came up on the target despite a start error; one-line stderr reason on every failure (#2816)
- 9d7bcc5 fix(testutil): IsolateHome also clears the agent tools' config-dir vars (#2783)
- 04ba77d fix(tmux): join the previous fast-death watcher before Start renames the session (#2807)
- 4106b0b fix(tmux): read Session.Name and Command under a lock on status paths (#2808) (#2843)
- a748737 fix(tmux): status counter normalization; tests that can fail instead of grep or log (#2794)
- b159dc6 fix(ui): a mouse report never reaches the TUI split across reads (#2826) (#2858)
- 6bedc7a fix(ui): attached TUI says an update waits; idle auto-compaction sends no record; ssh Ctrl+V hint (#2857)
- c94fe64 fix(ui): back off remote polls of a slow or failing host; remote polling contract (#2763)
- 97a1eda fix(ui): bound the web undo sweep, clear the record of an undone delete (#2776)
- 3804651 fix(ui): remote poll backoff follow-ups (#2771) (#2773)
- 1cc837f fix(ui): remote session preview keeps the pane's bottom (status line, footer) (#2766)
- 973485b fix(ui): the TUI's input owns no kqueue/epoll, so attaches stop leaking descriptors (#2692) (#2815)
- 4dd8882 fix(update): notify daemon recycles after a binary swap; every install writes one auto-update.log line (#2777)
- 975326f fix(watcher): cap each watcher's pending deliveries and count refusals; log only the tail of setup output (#2881)
- 7210bc7 fix: archived sessions are left out of status counts, the TUI header and desktop alerts (#2878)
- 901c9a5 fix: code-health batch 1 (edit-paths under HOME, profile migrate tx, registration lock, cost watcher, MCP config preserve) (#2851)
- 6b8c05f fix: code-health batch 2 (UTF-8 truncation, Gemini hooks, web group parent, plugin CLI, starting status, settings runes, ssh paste notice) (#2852)
- b1d364f fix: code-health batch 3 (group flags, inbox stats scope, run-task profile, statusline tools, trust seed root, Cursor hooks, search index) (#2854)
- a3a9206 fix: four small fixes from Yasir (FormatPath HOME prefix, ElectPrimary claim, add -g ambiguous name, Codex queued wrap) (#2839)
- 21151b9 fix: nine small fixes from Yasir (netstat, watcher routing/backoff/UTF-8, jj prune, branch picker, MCP restart, web push timeout, releases-behind) (#2848)
- 1764d27 fix: six small fixes from Yasir (shellwords, recall hint unset, inbox wake classify, current session id, StripANSI OSC, truncatePath CJK) (#2844)
- 5449cf8 perf(list): one batched tmux capture per socket for list --json status passes (#2762)
- 41f4960 perf(status): one ps snapshot per pass for Codex; dead rows from one tmux listing (#2880)
- 5a2a127 perf(status): stop probing tmux per session when the session or server is gone (#2835)
- 1599566 perf: events publish 1016 -> 13 ms; web menu status pass 948 -> 171 ms at 100 sessions (#2861)
- adc1000 refactor(cli): split session_cmd.go into topic files (pure move) (#2865)
- a2c1c7d refactor(costs): move the send budget gate into internal/session so the daemon can call it (#2825)
- f1227f6 refactor: menu snapshot contract moves to internal/menudata; ui no longer imports web (#2864)
- 8f98296 refactor: split tmux.go, instance.go and home.go into topic files (pure move) (#2872)
- 52b553d release: v1.16.33 (#2898)
- eb1a01b test(ci): validate tests/known-flaky.txt against real tests and the summary parser (#2784)
- 8de0a58 test(cli): cut cmd/agent-deck from ~600 s to 290 s (race 773 s to 361 s), same assertions (#2804)
- 4f85d1b test(cli): every subcommand answers --help and -h without side effects (#2779)
- 6594d2c test(cli): pin profile selection across state-writing commands (#2782)
- accf344 test(cli): remove shared eval build dir in TestMain; bound runRemoveCLI by process group (#2798)
- edb7234 test(cli): stub launchctl and systemctl so cmd tests never touch the host's daemons (#2822)
- 7549db2 test(core): queued-start tests wait for spawn goroutines and the events bus before cleanup (#2890)
- 4d63303 test(inbox): pin the whole drain-target resolution matrix in one table (#2781)
- 352c448 test(sandboxguard): clear DSH_HOME, name the leaked env var, guard home-derived tool paths (#2796)
- 2ae021f test(send): end-to-end delivery on a real tmux pane: busy queue, foreign draft, inbox across restarts (#2789)
- e18cf40 test(send): pin #2077 stranded-composer send end to end, both send modes (#2780)
- 828da93 test(session): the transcript stream test waits for the stop event (#2862)
- 5b0d9f0 test(tmux): status pane corpus with one check per detector (#2791)
- 74a8fd0 test(tmux): two tests wait for what they assert on tmux 3.6 (#2860)
Full Changelog: v1.16.30...v1.16.33