v1.16.27

asheshgoplani/agent-deckv1.16.27Oct 10, 2026by github-actions[bot]

Upgrading?

AI Summary

This release focuses on fixing critical session management issues, improving Codex integration, and enhancing conductor functionality. Key improvements include better inbox export operations, session sending behavior fixes, conductor recovery turns, and OpenCode 2.x service discovery through shared API.

Key Highlights

  • Fixed inbox export to stay within one profile
  • Improved Codex session sending with thread adoption
  • Conductor recovery turn feature
  • OpenCode 2.x service discovery through shared API
  • Enhanced watcher event routing to conductors

Breaking Changes

  • Conductor recovery turn is now on by default
  • Slack routing now uses default_conductor for unprefixed messages
  • Inbox export with --profile flag changes behavior

New Features

  • Idle session watching with Monitor showing 'watching' substate
  • Inbox export with profile selection
  • Slack routing with default_conductor and thread affinity
  • OpenCode 2.x service discovery
  • Watcher webhook port specification
  • Improved watcher event delivery to conductors
  • Enhanced telemetry reporting

Full Release Notes

## Agent Deck v1.16.27

Terminal session manager for AI coding agents.

### Installation

**Homebrew (recommended):**
```bash
brew install asheshgoplani/tap/agent-deck
```

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

**Go Install:**
```bash
go install github.com/asheshgoplani/agent-deck/cmd/agent-deck@v1.16.27
```

## What's new in 1.16.27

### Fixes

- `inbox export` and `remote drain` stay inside one profile. The export returns only the invoking profile's records (never a record without a profile), including on the `--after` cursor 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 --wait` and `--stream` return 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 send` to 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 reports `acceptance_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_blocked` without typing anything, and the queue retries it later (#2536, reported by @cherninely).
- Capacity-queued sessions stay `queued` instead of being reported and persisted as `error`, so stopping a running session drains the queue again (#2528, fixes #2526, thanks @jtymas-preiss).
- Session metrics and `health --json` ignore 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 attach` forwards 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-file` delivers 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 `watching` substate 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 = false` to turn it off (#2518, reported by @kaneda-fr).
- Slack routing gains `default_conductor` for unprefixed messages and thread affinity, so replies in a conductor's thread (including NEED alert threads) reach that conductor. `conductor setup` keeps existing Slack keys when it adds tokens (#2548, fixes #2547, thanks @koenzhao).
- `[conductor] permission_ask = false` drops the managed ask list from the conductor's Claude settings on the next `agent-deck conductor setup <name>`, so auto mode decides on mutating commands. The default stays `true` (#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 --service` process 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 N` writes 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 status` and `fleet recover` are no longer reported as fleet launches, mistyped flags are still counted, and `uninstall` no longer recreates the telemetry directory. See "How CLI commands are counted" in TELEMETRY.md for the effect on trends.
  - `activity.hourly` is sent once per local hour across TUI runs; `install.tick` carries the coarse `os` and `arch` (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 `add` records its session create and a CLI fork is labelled `cli_fork`; the default CLI `session stop` and 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.
- 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: -profile` instead of receiving every profile's records. Update the remote (`agent-deck remote update <name>`) first. `inbox export` run 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_ask` defaults to `true` (unchanged behavior). Setting it to `false` takes effect when you run `agent-deck conductor setup <name>` again, and it also removes a user ask rule that is identical to a managed entry.
- #2548: `default_conductor` and thread affinity are Slack only; Telegram, Discord and `/ad-restart` still 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**: https://github.com/asheshgoplani/agent-deck/compare/v1.16.26...v1.16.27

Related Repositories