Skip to content

agent-deck

v1.10.11 Security

This release includes 3 security fixes for security teams reviewing exposed deployments.

βœ“ No known CVEs patched
Read the diff β†’ Tool health β†’ What is this tool? β†’
This release patches 3 known CVEs

Topics

ai-agent ai-agents ai-coding-assistant aider bubble-tea claude-code
+11 more
cli codex developer-tools discord gemini-cli go mcp productivity session-manager tmux tui

Affected surfaces

auth

Summary

AI summary

Broad release touches πŸ“š Docs, πŸ›‘οΈ Security and dependencies, πŸ› Fixes, and ✨ Features.

Full changelog

What's new in v1.10.11

This is the reliability release. Three classes of failure that could take out real work are now closed: a session's identity could be silently re-bound to the wrong project directory, a single tmux maintenance job could kill an entire fleet of live sessions, and three separate polling paths burned CPU proportional to fleet size. On top of that: a security-clean dependency tree and the largest batch of community contributions this project has had.

πŸ”’ Session identity is immutable (data-corruption fix)

  • project_path is now fixed at creation, and foreign-cwd candidates are excluded from session binding. project_path was writable after creation and the binding candidate search accepted working directories that did not belong to the session, so a session could be silently re-pointed at another project's path. That path is the identity conversation resume, worktree bookkeeping, and group placement all key on, so a bad rebind corrupted all three at once. (#1731, closes #1729)

🧨 The tmux fleet-death fixes

On 2026-07-26 a maintenance job that matched tmux servers by process name (pgrep -fx "tmux -C") killed the default-socket server and, with it, roughly 65 live sessions at once. The reason it matched: insert mode spawned a bare tmux -C client, and on macOS a process keeps the argv it was exec'd with, so the server auto-started by that client was itself named exactly tmux -C. Two independent flaws, fatal only together.

  • Insert mode no longer spawns a bare tmux -C, and the reaper identifies servers by socket path only. The keysender now attaches explicitly (tmux -C attach-session -t <target>), creates no session, verifies the attach handshake, and tears down its process group on close. A control-mode client with no command falls back to new-session, so every insert-mode entry used to mint an extra session with a live shell pane and its own pty that close never reaped. scripts/reap-stale-tmux.sh now ships in the repo and probes and kills exclusively through tmux -S <socket>, never pgrep or pkill, because argv is not identity. (#1736)
  • An auth-dead session is held instead of flapping the whole fleet. When credentials went bad, the status and revive machinery kept retrying, and every retry churned tmux and the token, turning one broken login into fleet-wide restart flapping that also fed the multi-session OAuth rotation race. Auth-dead sessions now park in an explicit hold state until the credential problem is actually resolved. (#1743)
  • New: agent-deck fleet recover. Sequential, verified, brake-equipped recovery after a fleet-wide death. It restarts eligible sessions one at a time with spacing, confirms each one came back before moving on, and stops on a failure threshold instead of grinding through a broken fleet. (#1742)
  • Orphaned tmux -C control clients are swept server-wide at TUI startup. Previously they were only reaped for sessions a new TUI actively reconnected to, so orphans left by crashed or OOM-killed TUIs accumulated indefinitely. Observed in the wild at 176 orphaned control clients against macOS's kern.tty.ptmx_max=511 pty cap, past which no new tmux session or terminal can be allocated at all.

⚑ CPU and fork storms

  • tmux show-environment misses are cached. Every status sweep re-forked a tmux client per session to look up a variable that provably was not there, so steady-state CPU scaled with fleet size. (#1735, closes #1728)
  • codex: the process-file probe backs off to 30s once the session ID is known, instead of polling at startup cadence forever. Thanks @jwiegley. (#1686, #1552)
  • Every cadence tmux command carries a deadline, so a wedged tmux server degrades instead of freezing the poller that called it. Thanks @drmzperx. (#1700)
  • The terminal bridge is reaped when its websocket peer dies, instead of leaking one bridge process per dropped browser terminal. Thanks @hfreire. (#1695)

✨ Features

  • Claude 5 models in the session pickers. Thanks @scottyallen. (#1730)
  • GPT-5.6 models in the Codex session pickers. Thanks @mdrzn. (#1697)
  • Reasoning-effort pickers for Claude and Codex, so effort is a choice at creation time rather than a tool default. Thanks @mdrzn. (#1699)
  • hermes: R/restart resumes the hermes session instead of silently doing nothing, which used to look like a hang. Thanks @xcompass. (#1693)
  • Worktree setup-script failures are surfaced in the TUI instead of failing quietly and leaving a half-prepared worktree. Thanks @Clarity-89. (#1696)
  • agent-deck session handoff, a read-only handoff prompt builder that summarizes a session's working context without mutating it. Phase 1 of runtime switching. (#1669)
  • [cursor] hooks_enabled, a durable opt-out so uninstalling Cursor hooks is not undone by the next TUI auto-install pass. (#1673, closes #1672)

πŸ› Fixes

  • A clean one-shot exit is no longer red. Status reads the pane exit code, so a command that finished successfully shows as finished. Thanks @p4p3r. (#1725)
  • session send detects an unsent multi-line initial prompt whose first line is short, instead of leaving the prompt sitting in the composer. Thanks @p4p3r. (#1724)
  • A dim prompt autosuggestion is never mistaken for an operator draft, so send stops refusing to overwrite greyed-out ghost text. Thanks @thelastguardian. (#1677)
  • Runtime tool detection prefers the pane command, so a session's agent is identified from what is actually running. Thanks @mdrzn. (#1719, closes #1718)
  • SGR state is isolated across incremental row repaints, ending colour bleed between rows. Thanks @mdrzn. (#1716)
  • The last visible row of a group renders its └─ connector correctly when filtering hides rows. Thanks @xcompass. (#1667)
  • Remote host headers align flush with local root groups. Thanks @xcompass. (#1665)
  • The browser terminal translates native terminal keystrokes, so control sequences and navigation keys reach the session. Thanks @dbeaudoin. (#1662)
  • Handoff resolution reuses the transcript UUID fallback, so a session whose ID is only recoverable from the transcript resolves. Thanks @vigneshakaviki. (#1740, closes #1671)
  • The New Session path cursor parks at the end of the path on reopen, so typing appends instead of splicing into the middle. (#1737, closes #1702)
  • A manual session rename survives a reload race. The pending-title queue now carries the lock intent alongside the string, so a user rename is restored locked and the next Claude-name sync cannot overwrite it with the auto-derived folder name.

πŸ›‘οΈ Security and dependencies

  • Go: every open advisory closed, including golang.org/x/text GO-2026-5970, plus golang.org/x/crypto and golang.org/x/net. govulncheck is clean at this tag. (#1689)
  • JS: all six open advisories in tests/web resolved. (#1734)
  • All remaining third-party GitHub Actions are pinned to commit SHAs. No workflow here resolves a third-party action by mutable tag. (#1668)

πŸ§ͺ Tests and CI truthfulness

  • The Playwright reporter writes a clean JSON report. Non-JSON output was polluting the report file, so downstream parsing of web-test results silently produced nothing and a run could look reported when it was not. Thanks @vigneshakaviki. (#1741)
  • The weekly-regression report walks nested suites instead of stopping at the top level and under-reporting; the settings-drawer visual baseline is refreshed. (#1678, closes #1674)
  • session restart --all JSON output, exit code, and skip reporting are pinned. Thanks @c436zhan. (#1748, closes #1745)
  • The status lock may no longer be held across a slow tmux probe, pinned by a regression test. Thanks @vigneshakaviki. (#1739, closes #1732)
  • Cursor-hooks CLI wiring and the TUI auto-install gate are covered. Thanks @AnayGarodia. (#1680)
  • Test tmux servers can no longer strand themselves or reach your real server. Isolation helpers kill every server under a socket dir before removing it (unlinking a socket does not signal its listener), isolation is now sticky so goroutines outliving a suite cannot fall back to the live default server, and the argv factory panics before spawning if a test binary's tmux command would target the user's default socket. One kill-server on that path ends every session on the machine, which is exactly the incident above.
  • Lighthouse total-byte-weight budget recalibrated to the current shipped bundle. (#1666)
  • Action bumps: actions/setup-go 6 β†’ 7 (#1690), actions/setup-node 6 β†’ 7 (#1691), actions/setup-python 6 β†’ 7 (#1692), goreleaser/goreleaser-action 7.2.2 β†’ 7.2.3 (#1688).

πŸ“š Docs

  • Naming and identity standard, plus proactive session-lifecycle design proposals. (#1738, #1703, #1704)

πŸ™Œ Credits

This release is community-shaped. Thank you to @p4p3r (#1725, #1724), @mdrzn (#1697, #1699, #1719, #1716), @vigneshakaviki (#1741, #1739, #1740), @xcompass (#1693, #1667, #1665), @scottyallen (#1730), @c436zhan (#1748), @Clarity-89 (#1696), @hfreire (#1695), @drmzperx (#1700), @jwiegley (#1686), @thelastguardian (#1677), @AnayGarodia (#1680), and @dbeaudoin (#1662).

Maintainers and contributors are still wanted. If any of the above looks like work you would enjoy, the contributor guide is in CONTRIBUTING.md.

Agent Deck v1.10.11

Terminal session manager for AI coding agents.

Installation

Homebrew (recommended):

brew install asheshgoplani/tap/agent-deck

Quick Install:

curl -fsSL https://raw.githubusercontent.com/asheshgoplani/agent-deck/main/install.sh | bash

Go Install:

go install github.com/asheshgoplani/agent-deck/cmd/[email protected]

Changelog

  • a06e9b28d89004577763e2248aa08514e077cb9c chore(ci): pin remaining third-party actions to commit SHAs (#1668)
  • 992d3741f1a1b5e283f43071da202b16775a36f2 chore(ci): recalibrate lighthouse total-byte-weight budget to 368000 (#1666)
  • 82eb17a3822a57fd3ff7ed1323ea6e808ffba0a4 chore(deps): bump actions/setup-go from 6 to 7 (#1690)
  • f8bf960fef762f5c473424eb2fd5edc5856caa97 chore(deps): bump actions/setup-node from 6 to 7 (#1691)
  • cc0b6e0683ea64b291a4441f76b8945091683029 chore(deps): bump actions/setup-python from 6 to 7 (#1692)
  • 646a265c01de37c1e5bea664517c31142e02dc7e chore(deps): bump go-minor-patch group (x/text GO-2026-5970 fix, x/crypto, x/net) (#1689)
  • ae7352b9616af86345a1aa3e6cf83ce5237525e2 chore(deps): bump goreleaser/goreleaser-action (#1688)
  • ef758ec2568a9b65d75775de3b33dbc6f4c11e02 chore(deps): fix all open JS dependency advisories in tests/web (#1734)
  • 1a4711dea3e053a1fdef3217e6814476e12ee630 chore(release): bump to v1.10.11, update CHANGELOG
  • 2c476aadf7265f13510c1f5b04df9f319e99922e docs(design): naming standard + proactive session lifecycle proposals (#1738)
  • 8c08c4e3ba4a31e2cb8232bd4d47c1b3294aaeb8 feat(claude): add Claude 5 models to session pickers (#1730)
  • a13408b45184089de6c5dd9a4081892b1d14961b feat(codex): add GPT-5.6 models to session pickers (#1697)
  • 6ede29db6b66398489d51f8fec3130988ceeeac9 feat(fleet): add 'agent-deck fleet recover' β€” sequential, verified, brake-equipped recovery (#1742)
  • 2ba0687871bec18616d3b85138a9c3f9fffdc92e feat(hermes): make R/restart resume the hermes session instead of a silent no-op (#1693)
  • 935f6453d955ec09870078b3b7de714c3d337dff feat(session): handoff prompt builder + read-only 'session handoff' command (#1669)
  • bcc1543af132b2c89a90ffac64a92b1c1ebff66b feat(ui): surface worktree setup-script failures in TUI (#1696)
  • 14982eb75e88835f210ed2bc2a46bdd76d57a1bb feat: add Claude and Codex reasoning effort pickers (#1699)
  • fd1923c7105b08d104f692096dfdaf977e6ad702 fix(auth): hold auth-dead sessions instead of flapping the fleet (#1743)
  • d639ae83b7a40a761666a74f006f3c428cf6998b fix(ci): weekly-regression report walks nested suites + refreshed settings-drawer baseline (#1678, closes #1674)
  • fa3647a25214bb4585cdadd7c266badddf165586 fix(ci): write clean Playwright JSON report (#1741)
  • 21876eae0eba51d66d0d4552fa7b23af3a8e6c31 fix(codex): back off process-file probe to 30s once session ID is known (#1552) (#1686)
  • c64b431d7145de8b3cd1288df0473d61575ceff6 fix(cursor): durable hooks opt-out via [cursor] hooks_enabled (#1673, closes #1672)
  • 4bf81d513483534b7e271aba4f0d82e7304d6706 fix(handoff): reuse transcript UUID fallback in handoff resolution (#1740, closes #1671)
  • c966d5290010c89ef2be584a5943e460b737f8f5 fix(send): detect an unsent multi-line initial prompt with a short first line (#1724)
  • d16d2bc9849536ab4c7f4490d629153305140ff8 fix(send): never treat a dim prompt autosuggestion as an operator draft (#1677)
  • eea964af45259b6c0a9cdfa12b4733608b90f052 fix(status): read pane exit code so a clean one-shot exit is not an error (#1725)
  • 311ebd1abeeb1beda26402d4e403b39f1b773679 fix(tmux): bound every cadence tmux command with a deadline (#1700)
  • 4b72051ff0fd20e89b081e35f8ce6fd2d4d86077 fix(tmux): cache show-environment misses to stop per-sweep fork storm (#1735, closes #1728)
  • 673a54f9265eeb7abb0cfe50186a6f6ffbb6ff23 fix(tmux): prefer pane command for runtime tool detection (#1719, closes #1718)
  • 9ed26c287f8cd952a9d5a53e05961de4c4be57bf fix(tmux): stop spawning bare 'tmux -C', reap stale servers by socket path only (#1736)
  • 01d6ba8103364e5bc67a64a45ee489ab7f0c0406 fix(ui): align remote host header flush with local root groups (#1665)
  • e71de8a9bf317cdaaf8cc74401fda0c31316fd7e fix(ui): isolate SGR state across incremental row repaints (#1716)
  • 16e43a95410fccedce93a20294150571271a326c fix(ui): park New Session path cursor at the end on reopen (#1737, closes #1702)
  • 33673cfaac882c159f4b3f8e652c02c9e16bcb45 fix(ui): recompute IsLastInGroup so the last visible group row renders correctly (#1667)
  • 82590e68d0b004433ecdacda1519511ed3f3a732 fix(web): translate native terminal keystrokes in the browser terminal (#1662)
  • 1b3ae4df4af6f0a3db7c09e308c02a3ecd7e7837 fix: project_path immutable post-creation; foreign-cwd candidates excluded from session binding (#1729) (#1731)
  • 23e93aee76ab677b80d862225ca08fb9e2724c4f fix: reap leaked tmux terminal bridge on dead websocket peer (#1695)
  • ad252f1d3064bd5d986a11fa1d795f1e4e31773d test(status): pin lock drop during slow tmux probe (#1739, closes #1732)

Full Changelog: https://github.com/asheshgoplani/agent-deck/compare/v1.10.10...v1.10.11

Breaking Changes

  • `project_path` is now immutable after creation; foreign‑cwd candidates are excluded from session binding.

Security Fixes

  • All open Go advisories (including golang.org/x/text GO-2026-5970) closed; `govulncheck` clean.
  • All six JS advisories in `tests/web` resolved.
  • All third‑party GitHub Actions pinned to commit SHAs.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track agent-deck

Get notified when new releases ship.

Sign up free

About agent-deck

Terminal session manager for AI coding agents. One TUI for Claude, Gemini, OpenCode, Codex, and more.

All releases β†’

Related context

Earlier breaking changes

  • v1.10.9 Stop global -p/--profile from shadowing a subcommand's -p flag

Beta — feedback welcome: [email protected]