Worker Views (v1)
Starting in v0.16.0, the Ink REPL renders a chip strip along the bottom of the screen showing the coordinator plus every spawned worker. You can switch between transcripts without leaving the REPL.
Worker views are read-only in v1. Typing in a worker view and pressing Enter surfaces a quiet hint and is never sent anywhere. Steering (sending prompts to a specific worker) is planned for v2.
What you see
- A horizontal strip of chips, one per view, anchored above the input area
- The active view is highlighted; chips reflect each worker's live status
- The coordinator is always the leftmost chip
- Ghost chips appear for workers that ran in a prior session (after
--resume); their transcript is lazily loaded the first time you switch to them
When no workers are spawned, the strip is hidden entirely so the coordinator-only flow is unchanged.
Per-worker transcripts
Each worker has its own append-only NDJSON transcript file (one .ndjson per worker), aggregated from the worker's SDK events by WorkerTranscriptStore and persisted via NDJSONTranscriptPersistence. Switching views just re-reads the corresponding transcript — there is no live tail-following yet.
On --resume, ghost chips are re-hydrated from session metadata for any workers that previously persisted a transcript. The transcript itself is lazy-loaded the first time you switch to that view (via a reverse-byte-scan loadTail), so resume stays fast even when historical workers accumulate.
Switching views
| Action | Binding | Notes |
|---|---|---|
| Cycle next view | Ctrl+] (canonical) | reliable across terminals |
| Cycle previous view | Ctrl+[ (canonical) | reliable across terminals |
| Cycle next / prev (opportunistic) | Ctrl+Tab / Ctrl+Shift+Tab | terminal-dependent — many terminals swallow these |
| Return to Coordinator | Esc | only fires when the input buffer is empty |
| Focus the chip strip | Ctrl+G | navigate with ← / →, Enter to switch |
| Dismiss the cursor chip (strip-focus) | d or Delete | only for completed / failed / killed workers |
| Dismiss all terminal chips at once | Shift+D | skips the active view; toast pinned to coordinator |
| Switch to a named view | /view <name> | accepts agent id, display name, or prefix |
| List available views | /view | also marks the active one |
| Enter strip-focus from input | /view focus | equivalent to Ctrl+G |
Ctrl+] and Ctrl+[ are the canonical bindings — they map to ASCII 0x1D / 0x1B and are reliably emitted by virtually every terminal. The Ctrl+Tab family is documented as opportunistic because many terminals (and some multiplexers) intercept it before it reaches the application.
Strip-focus mode
Ctrl+G (or /view focus) enters strip-focus mode: the chip strip becomes the keyboard-focus target and the input is gated.
| Key | Effect |
|---|---|
← / → | Move the cursor between chips (wraps) |
Enter | Apply the cursor as the active view and exit focus |
Esc | Exit focus without applying |
d / Delete | Dismiss the cursored chip (subject to the rules below) |
Shift+D | Dismiss all terminal (completed / failed / killed) chips at once; the active view is preserved |
Dismiss rules
Dismissing a chip removes it from the strip. Dismissal is refused — with a dim transcript hint — in the following cases:
- Coordinator chip — the coordinator can never be dismissed
- Currently active chip — switch away first (
Ctrl+]or/view <name>), re-enter strip-focus, then dismiss - Worker still running — stop it first with
/stop <agent-id>or wait for it to reach a terminal state (completed / failed / killed)
After a successful dismissal the cursor moves to the next surviving chip (falling back to the coordinator if none remain).
Dismiss-all (Shift+D)
Shift+D from strip-focus dismisses every chip in a terminal state in one shot, skipping the chip that is currently the active view. It is a convenience wrapper around the per-chip d rule — no chip is dismissed that could not also be dismissed individually.
A short toast confirms the result (⊘ Dismissed N chip(s) or ⊘ No chips to dismiss). The toast is pinned to the coordinator transcript, so if you trigger Shift+D while viewing a worker transcript, switch back to the coordinator (Ctrl+]) to see the confirmation.
Caps Lock note. Pressing
Dtriggers dismiss-all regardless of how the uppercase character was produced (Shift+dorCapsLock + d). This is a documented limitation of Ink'suseInput: it cannot distinguish Shift from Caps Lock for letter keys. If you keep Caps Lock on and want to single-dismiss the cursor chip, useDeleteinstead ofd.
Read-only behaviour
- The input prompt prefix changes to indicate the active worker view (e.g.
👁 worker-3 ❯) - Pressing
Enteron a non-empty buffer in a worker view shows a transcript hint and does not callmessageBus.sendorsession.send - Slash commands (e.g.
/help,/view) still work in worker views - The hint is recorded as a quiet entry — it does not trigger transcript saves
Footer hint
When at least one worker chip is present, a single dim line appears just above the identity bar:
Ctrl+] views • /view <name> • read-only in v1When no workers are spawned, the hint is hidden so the coordinator-only flow remains uncluttered.
See also
/help— full keybinding referencecommands-manual.md— slash command reference