Live agent tasks¶
When a CLI agent runs in your Terminal pane, Loom mirrors its task list into the Tasks pane in real time.
Where the data comes from¶
Claude Code writes per-session task state to:
Each JSON file describes one task: id, title, status (pending, in_progress, complete), parent session, timestamps.
Codex records its plan inside the rollout JSONL it writes for each session:
Loom scans the rollout for update_plan function calls and surfaces the most recent active plan whose plan update is inside the active window. A later Codex task_complete event or final-answer event hides that plan until the rollout emits a newer update_plan, which keeps completed turns from looking stuck. Status maps directly: pending, in_progress, completed. The task header also uses the latest Codex turn_context model when the rollout includes one.
Gemini CLI does not currently write plan state to disk in any format Loom can read; Gemini terminals show in the agent picker but won't appear in the Tasks pane until the CLI emits a structured plan log.
Loom polls every 2 seconds via LiveAgentTasksService and groups results by product + model + session id. Claude model labels come from the matching ~/.claude/projects/.../<session-id>.jsonl when available.
What you see¶
In a Prompt workspace's Tasks pane, live agent tasks appear in their own section above the kanban columns:
- Header: <product> · <model> · <session-id-prefix> (for example,
Codex · gpt-5.5 · 019e34ad). - One row per task, with a status badge (•, ▶, ✓).
- Click a task to expand and read its full description.
When the session finishes, all tasks become terminal, or the session id rotates, the live block clears. Completed and cancelled-only groups are not treated as live.
Multiple sessions¶
If you have several CLI agents running across multiple Terminal panes — or if Claude Code is also running outside Loom — the pane shows all live sessions, each with its own header. Use the workspace's Stale window (Settings → Tasks) to hide sessions that haven't been touched recently.
Stale window¶
Configurable in Settings → Tasks. Sessions whose most recent task update is older than the window are treated as dead and hidden:
| Window | Hides sessions older than |
|---|---|
| 30 minutes | 30 min |
| 1 hour | 1h (default) |
| 4 hours | 4h |
| 12 hours | 12h |
| 24 hours | 24h |
| Never | (always shows everything) |
The poll keeps running regardless of the window — it's purely a display filter.
Privacy¶
Loom only reads files under ~/.claude/tasks/, ~/.claude/projects/, ~/.codex/sessions/, and ~/.loom/tasks/. Nothing leaves your machine. The polling service uses standard FileManager calls and does not watch via FSEvents (which would require a separate privacy entitlement).
Clearing sessions¶
Every session in the Tasks pane has a × button, and the trash icon in the header runs "Clear all". What happens on disk depends on the source:
- Claude Code and LM Studio task JSON files are deleted. If the session is still live it rewrites its tasks on the next turn; truly stuck/zombie sessions stay gone.
- Codex rollout files are left untouched because they hold conversation history. Loom records a dismissal timestamp keyed to the product/model/session and hides the group until a newer
update_planevent advances past that mark. Codextask_completeand final-answer events also hide older plans until a newer plan appears. An active Codex session reappears after its next plan update; a stuck or completed session stays cleared. - Gemini is currently never collected from disk, so there's nothing to clear; the same dismissal mechanism applies if a future Gemini source is added.
Dismissals persist across launches via UserDefaults key loom.tasks.dismissedSessions.