cyberine
UsageRun recipes

Agents view — one unified list of chats (c)

Press c in the fleet list to switch into the agents view: ONE flat/grouped list where every row is a "conversation" — either a dispatched run or a stored chat session — not two separate screens. This is the agents-as-chat model: 1 agent = 1 chat, one list, one control set. Internally the merged list is built by buildConversations(runs, chatSessions) (src/tui/conversation.ts), a read-time projection over both stores; neither store's file format changes.

The view keeps the SAME folder-grouped layout as runs mode: one header per folder ([-]/[+] prefix, quick-sum N runs · M chats, divider) with that folder's runs AND chats interleaved as rows beneath (title, a run/chat kind tag, age, tokens, cost when available), live conversations sorted first, then most-recently-updated. Collapse state (Space/←/→ on a header) and hidden folders (H/U) are SHARED with runs mode.

↑↓/jk navigate. ⏎ opens the right thing for the row kind:

  • On a chat row — resumes it: the fleet suspends, cyberine chat --resume <id> takes the TTY in that session's folder, and the fleet returns when you exit the chat.
  • On a run row — opens the run AS a read-only, live-updating chat transcript (see "Opening a run as a chat" below) — reopening IS opening; there is no separate resume step.
  • On a folder header — opens a NEW chat in that folder.

One manage/ping/stop surface applies to a run row (a chat row has no run to control):

  • x — stop the run (or reap it if its engine died and the run is a zombie).
  • m — ping: opens the same steer panel as the runs-only list, pre-targeted at that run; type guidance and press Enter to inject it (only enabled while the run is live).

Ctrl+X on a chat row arms delete (press Ctrl+X again to delete), twice to confirm; it has no effect on a run row (stop/reap uses x, not Ctrl+X, to avoid clobbering the delete-arm chord). c toggles back to the runs-only list. The same chat history is also reachable headlessly via cyberine chat sessions / --continue / --resume <id>.

Opening a run as a chat

Pressing ⏎ on a run row renders that run's work as a chat transcript — the SAME <Transcript> component a live cyberine chat session renders, fed by runToChatMessages(run, events) (src/tui/runTranscript.ts). One synthetic user turn per step (the step's prompt / phase title), then each worker's tool-call trail (extracted from events.jsonl, shared with the r trajectory replay under RunDetail) as assistant/tool turns, the worker's final output or error as the last turn, and — for a judged multi-worker step — one system note with the winner's verdict. While the run is still live, the currently-running worker's in-flight text streams in as one streaming turn (the same live-tail mechanism the runs-only detail view uses). A finished run just stays displayed — no auto-close.

Keys inside the open transcript: x stop, m ping (same steer panel as the list), esc/←/h back to the agents list. The footer line states plainly when a finished run has disabled stop/ping. This screen replaces RunDetail as the primary "open a run" path from the agents view; RunDetail's per-worker table/race-bar view (and its own r trajectory-replay, p prompt, d diff keys) stays reachable only via the legacy runs-only list's ⏎ (i.e. with the agents view toggled OFF via c), for cases that want the raw per-worker breakdown instead of a transcript.