---
title: Interrupted sessions section (sidebar)
---

# Interrupted sessions section (sidebar)

## 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 `ended` session, 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 `isInterruptedSectionMember` rule, EXCLUDING rate-limit `waiting` (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](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](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](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](gray-session-triage.md)).

## For agents

### Where it lives in code

- **Partition**: `splitSessionsBySection()` in [sort.ts](../../src/renderer/src/lib/session-host/sort.ts) — a status-keyed partition (`paused` → paused, else → live). Its interrupted test is the `isInterruptedSectionMember` helper: `ended`, `waiting` (rate-limit park — added 2026-08-14, session-bucket Phase 2), OR (`error`/`stalled` AND 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](../../src/renderer/src/features/session-host/SessionSectionList.tsx) — the shared section stack rendered by both the main sidebar and integration sidebars.
- **Mobile rendering**: [MobileSessionsList.tsx](../../src/renderer/src/features/dashboard/MobileSessionsList.tsx).
- **Navigation**: [session-navigation.ts](../../src/renderer/src/stores/session-navigation.ts) — `getVisibleProjectSessionsInOrder` applies the same partition and concatenates `[...interrupted, ...live, ...paused]` (collapse-gated), so swipe / Tab / J/K traverse Interrupted → Live → Paused continuously.
- **Collapse state**: `interruptedExpandedByProject` Map in [session-expansion-slice.ts](../../src/renderer/src/stores/slices/session-expansion-slice.ts) — `setInterruptedExpanded` / `getInterruptedExpanded`, default `?? true` (expanded).
- **Dot color / tooltip**: `STATUS_DISPLAY.ended` in [utils.ts](../../src/renderer/src/lib/utils.ts).
- **Contracts**: [frontend-session-sort-contract.md](../../.claude/memory/contracts/frontend-session-sort-contract.md) (sort + section split), [session-host-contract.md](../../.claude/memory/contracts/session-host-contract.md) (the reusable seam), [unified-sidebar-engine-contract.md](../../.claude/memory/contracts/unified-sidebar-engine-contract.md) (V2 roadmap).

## Related

- [gray-session-triage.md](gray-session-triage.md) — auto-advance through the interrupted pile
- [paused-session-triage.md](paused-session-triage.md) — auto-advance through the paused pile
- [pause-or-stop-a-session.md](pause-or-stop-a-session.md) — how a session becomes paused (deliberate) vs ended (interrupted)
- [archive-a-session.md](archive-a-session.md) — removing a session from the sidebar
- [crash-recovery.md](crash-recovery.md) — sessions interrupted by an app crash/restart
