Skip to content

[Feature]: Session grouping, unread state, and full session controls on web, iOS, and Android #100739

Description

@steipete

Summary

Bring the session list on web, iOS, and Android to parity with modern session managers: user-defined groups with sections, unread indicators with mark-as-unread, and a full per-session control menu (pin, rename, fork, move to group, archive, delete).

Problem to solve

Session management is uneven across clients today:

  • Web sidebar only offers hover pin/archive; grouping by category exists only on the dedicated Sessions page; there is no unread concept anywhere.
  • iOS session list (Command Center) is read-only: no rename, pin, archive, delete, group, or fork controls at all.
  • Android session list has sort/filter pills but no per-session controls either.
  • The gateway has no unread state, so no client can show "this session has new activity" or offer mark-as-unread, and there is no one-step way to fork a session's transcript into a new session.

Proposed solution

Gateway (additive protocol, no version bump):

  • SessionEntry gains lastReadAt, markedUnreadAt, lastActivityAt (epoch ms). lastActivityAt is bumped in the canonical post-run store update; metadata patches do not bump it.
  • Session rows expose derived unread (explicit mark, or activity after last read; never-read sessions stay read to avoid an all-unread explosion on upgrade), plus lastReadAt/lastActivityAt.
  • sessions.patch gains unread?: boolean (false = mark read, true = mark unread).
  • sessions.create gains fork?: boolean (with parentSessionKey) reusing the existing transcript-fork runtime.

Clients (web sidebar + sessions page, iOS Command Center, Android SessionsScreen):

  • Grouping: Pinned section, then one section per category (the existing org bucket = "group"), then Ungrouped.
  • Unread dot on rows; opening a session marks it read; explicit "Mark as unread".
  • Context menu (web kebab/right-click, iOS context menu, Android long-press): Pin/Unpin, Mark as unread/read, Rename, Fork, Move to group (incl. New group / Remove from group), Archive, Delete with confirmation.
  • Mobile gains a "Show archived" filter so archive is reversible everywhere.

Alternatives considered

  • Client-side unread (localStorage/per-device): rejected — unread should be consistent across devices and survive reinstalls; gateway is the natural owner.
  • New sessions.fork method: rejected — sessions.create already owns creation with parent linkage; a fork flag is additive and keeps one creation path.
  • Separate "groups" entity: rejected — category already exists on the wire and in sessions.patch; no new state needed.

Impact

All operator clients (web, iOS, Android) get consistent session organization and triage; heavy multi-session users can tell at a glance which background sessions produced new output.

Evidence/examples

  • Gateway already supports label, category, pinned, archived via sessions.patch (packages/gateway-protocol/src/schema/sessions.ts), so most controls are pure client work.
  • No unread concept exists in SessionEntry (src/config/sessions/types.ts) or row projection (src/gateway/session-utils.ts).
  • iOS list is read-only: apps/ios/Sources/Design/CommandCenterTab.swift has no mutation calls; Android SessionsScreen.kt likewise.

Additional information

Implementation PR follows on branch claude/friendly-germain-e9501b. "Open PR"/"Open in" from the desktop reference UI are not applicable to OpenClaw sessions and are out of scope.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Normal backlog priority with limited blast radius.clawsweeper:fix-shape-clearClawSweeper found a clear likely implementation shape for this issue.clawsweeper:needs-maintainer-reviewClawSweeper marked this issue as needing maintainer review before automation.clawsweeper:needs-product-decisionClawSweeper marked this issue as needing a product or behavior decision.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.enhancementNew feature or requestimpact:session-stateSession, memory, transcript, context, or agent state can drift or corrupt.impact:ux-frictionUser-facing flow adds avoidable confusion or support burden without fully blocking progress.issue-rating: 🌊 off-meta tidepoolIssue quality rating does not apply to this item.maintainerMaintainer-authored PRmaturity:stableIssue affects a taxonomy feature currently scored M4/M5.

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions