Interrupted sessions section (sidebar)
A dedicated sidebar section, above Live Sessions, holding the sessions whose process stopped on its own rather than by your hand — a crash, a finish, or an unexpected exit. The header counts them and each row carries a red dot, because Interrupted means something ended that you did not end.
What it is
When a session's CLI process stops (status flips to ended), the row moves into a dedicated Interrupted section in the project sidebar — rendered above Live Sessions (Paused Sessions sits below Live). Needs You and Pinned still sit above all three. The section header shows an ember-colored warning triangle (AlertTriangle icon) and the label "Interrupted (N)" where N is the count. Each session's dot shows red (a true failure/broken state since the 2026-08-13 color consolidation) instead of the default gray, signaling that something stopped unexpectedly and the user may need to take action.
This is different from Paused, which the user chose deliberately. Interrupted means the process died or finished on its own — the app didn't restart, the user didn't click Pause. The section tells the user "these need your attention — resume or archive them."
Errored / stalled sessions now group here too (2026-08-11, owner rule). A session that hits an error or stalls is no longer treated as an "attention" item — it does not pop into the Inbox, add a project count badge, or play a chime. Instead it collects quietly in this Interrupted section (sorted by recency), exactly like an
endedsession, so you get to it when you're ready. Exception: a session the app is actively reconnecting (a dropped CLI it's quietly bringing back) stays in Live with an ember "Reconnecting…" dot until it returns. So the Interrupted pile is now the home for ended, plain-errored, and stalled sessions alike.
Every failure / give-up / interruption groups here now (2026-08-21, owner rule). The Interrupted pile is the home for anything that stopped without delivering a final message — a give-up ("Recovery failed", incl. out-of-balance), an API or auth error, a stop you triggered, a dropped/aborted turn, a sub-agent timeout, or an app-close interruption. Needs You is now reserved for sessions that succeeded and need your response (a finished answer, a question, a plan to approve, a permission, a mission, or a merge-conflict handback). So failures no longer pop into the Inbox, chime, or add a badge — they wait quietly here (still a red dot, still one-click retriable). This reverses the 2026-08-14 rule that surfaced "Recovery failed" in Needs You.
The hub row now shows an interrupted count (2026-08-22). Every project/hub row in the sidebar surfaces a red interrupted count — the number of sessions in this same Interrupted pile, drawn from the exact same
isInterruptedSectionMemberrule, EXCLUDING rate-limitwaiting(which keeps its own orange count) and, since 2026-09-24, any pinned or saved session (those sit in their own Pinned / Saved sections, not in this one) — so you can see at a glance which hubs have interrupted sessions without opening each one. Opening a hub loads its whole Interrupted pile (not just its most recent sessions), so the red number and this section's header agree even on a very busy hub. It is a passive glance badge only: no Inbox row, no chime, no taskbar Needs You badge (those stay quiet). See projects-sidebar.md "Status counts on project rows".
Rate-limit-parked (
waiting) sessions group here too (2026-08-14, owner Direction B). A session paused on a usage limit — the ember "waiting" state that auto-resumes on its own — now collects in this Interrupted section instead of showing under Live (where it read as active work). It stays calm ember and needs nothing from you — though its banner now carries a one-click Stop (2026-08-16) if you'd rather halt it than let it auto-resume (that Stop pauses it, so it won't auto-resume until you Unpause; see pause-or-stop-a-session.md); only its section changed. (It's still never an amber "attention" item and never chimes — the account-capacity rules are unchanged.)
Where to find it
In the project sidebar, in the section headed Interrupted (N) with an ember-coloured warning triangle — rendered above Live Sessions, while Paused Sessions sits below it. Needs You and Pinned still sit above all three.
How it behaves
The Live Sessions header count leads with what's actually running
The Live Sessions header reads "Live Sessions (R · S starting)" — R is the number of sessions actively running right now (streaming), and S is the remainder that are launched but not yet streaming (spinning up, or briefly reconnecting). When there's no such remainder it's simply "Live Sessions (R)". (Rate-limit-parked waiting sessions no longer count here — as of 2026-08-14 they sit in the Interrupted section, not Live.) This leads with the honest "how many are working" number and matches the green "N active" account chip (both count only genuinely-running sessions via the same rule). Teal "ready" blanks you've opened but haven't sent yet are NOT counted — a not-yet-launched blank isn't a live session, so it never inflates the number; it still shows as a row in the list, but the count skips it. It is a display refinement only: the session list, sort order, and keyboard/swipe navigation are unchanged. Because unsent blanks are excluded, R + S counts only the sessions that are actually launched, which can be fewer than the rows shown when ready blanks are present — a list of nothing but unsent blanks reads "Live Sessions (0)".
The section only appears when the "show ended sessions" setting is on (Settings → Workflow). When off, ended sessions are hidden entirely and the Interrupted header vanishes. The section header is collapsible (click to hide/show its rows), default expanded. Collapse state persists per-project.
How to use it
- Opens at the very bottom: clicking an interrupted session always jumps you to the bottom — its latest output and the reason it stopped — and keeps you pinned there while the conversation finishes rendering, so you never land stranded in the middle. (It stays put the instant you scroll up to read back.)
- Revive a session: click it, then send a message (or click the "Please continue" nudge button). Omniscio auto-resumes the CLI. After reviving, Omniscio auto-advances you to the next interrupted session — see gray-session-triage.md.
- Archive it: middle-click, right-click → Archive, or press E / Ctrl+W. Per-section advance keeps you in the Interrupted pile (never jumps to Paused).
- Collapse the section: click the "Interrupted (N)" header to hide its rows. The collapse state is saved per-project.
Visual design
| Element | Value |
|---|---|
| Icon | AlertTriangle (lucide-react), ember-colored |
| Header text color | text-ember-500 (hover: text-ember-600) |
Dot color (STATUS_DISPLAY for ended) |
bg-status-error / text-status-error |
| Tooltip on the dot | "Session was interrupted — resume or archive" |
| Status label | "Interrupted" |
How it differs from Paused
| Interrupted | Paused | |
|---|---|---|
| Trigger | Process stopped on its own (ended) | User deliberately paused |
| User action needed | Yes — resume or archive | Optional — unpause when ready |
| Dot color | Red (failure) | Blue |
| Icon | AlertTriangle (⚠) | Pause |
History
Originally added 2026-06-26 as "Suspended" with a gray Moon icon by an audit agent (commit 93e99a6bd6) without human review or documentation. Renamed to "Interrupted" with an ember AlertTriangle icon on 2026-07-06 after a human reported confusion: "suspended" and "paused" are synonyms, making the two sections appear redundant. The rename clarifies that Interrupted is a warning state (process stopped unexpectedly) while Paused is an intentional hold. Moved above Live (from between Live and Paused) on 2026-07-19 at the user's request, so interrupted sessions surface at the top of the session list instead of below the running ones. The Live header count was refined on 2026-08-05 to also exclude teal ready (not-yet-launched / unsent) blanks — opening a blank you haven't submitted no longer bumps the count, though the blank still shows as a row. On 2026-08-14 (session-bucket redesign Phase 2, owner Direction B), rate-limit-parked waiting sessions moved from Live into this Interrupted section (they auto-resume, so they aren't "running") — and the Manage-sessions Stop list gained the same pile grouping so its count reconciles with the sidebar. On 2026-08-23 the per-section auto-advance (act on a row → jump to the next in the same section) was broadened from ended-only to the WHOLE Interrupted section — so acting on a waiting / errored / interrupted-needs_you row now advances to the next Interrupted session and bounces back within the section, matching Needs You and Paused (see gray-session-triage.md).
For agents
Where it lives in code
- Partition:
splitSessionsBySection()in sort.ts — a status-keyed partition (paused→ paused, else → live). Its interrupted test is theisInterruptedSectionMemberhelper:ended,waiting(rate-limit park — added 2026-08-14, session-bucket Phase 2), OR (error/stalledAND NOT actively reconnecting) — the error/stalled grouping added 2026-08-11 so plain errored/stalled sessions group here, while a reconnecting one stays in Live. The return type is{ live: T[]; interrupted: T[]; paused: T[] }. - Desktop rendering: SessionSectionList.tsx — the shared section stack rendered by both the main sidebar and integration sidebars.
- Mobile rendering: MobileSessionsList.tsx.
- Navigation: session-navigation.ts —
getVisibleProjectSessionsInOrderapplies the same partition and concatenates[...interrupted, ...live, ...paused](collapse-gated), so swipe / Tab / J/K traverse Interrupted → Live → Paused continuously. - Collapse state:
interruptedExpandedByProjectMap in session-expansion-slice.ts —setInterruptedExpanded/getInterruptedExpanded, default?? true(expanded). - Dot color / tooltip:
STATUS_DISPLAY.endedin utils.ts. - Contracts: frontend-session-sort-contract.md (sort + section split), session-host-contract.md (the reusable seam), unified-sidebar-engine-contract.md (V2 roadmap).
Related
- gray-session-triage.md — auto-advance through the interrupted pile
- paused-session-triage.md — auto-advance through the paused pile
- pause-or-stop-a-session.md — how a session becomes paused (deliberate) vs ended (interrupted)
- archive-a-session.md — removing a session from the sidebar
- crash-recovery.md — sessions interrupted by an app crash/restart
Last verified 2026-10-05