Make chat sessions pinnable #38

Open
opened 2026-08-22 18:26:32 +00:00 by kayg · 0 comments
Owner

Ask

Allow sessions to be pinned and keep pinned sessions surfaced consistently in the chat sidebar. This is the state/display half of the section work in the companion sections issue: a pinned section at the top is the likely presentation, but the implementation may use an equivalent top placement that remains obvious.

Files and APIs

  • Sources/Hermternal/Views/SidebarView.swift: List, Section, and SessionRow presentation.
  • The session state behind AppModel.sessions and selectedSessionID, including persistence of the pinned state.
  • Sources/Hermternal/Views/RootView.swift / ChatWindow only where sidebar state is composed.

Acceptance

  • A session can be pinned and unpinned, and the pinned state survives a sidebar refresh or relaunch.
  • Pinned sessions are visibly separated from or consistently ordered ahead of unpinned sessions; pinning or unpinning updates that placement immediately without losing selection.
  • A pinned session still opens the correct transcript, and its title/metadata remain correct after moving sections.
  • The account display row tracked by #33 remains an account row, not a pinnable session; this issue does not duplicate that work.
  • Pin state is server-side through PATCH /api/sessions/{id} with {"pinned": bool}, so it needs no local store and syncs across devices for free.
  • There is no manual pin order: the server stores only a Boolean and has no order column, so a local order would sync on one device and not another. Pinning may return with folder sync.
## Ask Allow sessions to be pinned and keep pinned sessions surfaced consistently in the chat sidebar. This is the state/display half of the section work in the companion sections issue: a pinned section at the top is the likely presentation, but the implementation may use an equivalent top placement that remains obvious. ## Files and APIs - `Sources/Hermternal/Views/SidebarView.swift`: `List`, `Section`, and `SessionRow` presentation. - The session state behind `AppModel.sessions` and `selectedSessionID`, including persistence of the pinned state. - `Sources/Hermternal/Views/RootView.swift` / `ChatWindow` only where sidebar state is composed. ## Acceptance - A session can be pinned and unpinned, and the pinned state survives a sidebar refresh or relaunch. - Pinned sessions are visibly separated from or consistently ordered ahead of unpinned sessions; pinning or unpinning updates that placement immediately without losing selection. - A pinned session still opens the correct transcript, and its title/metadata remain correct after moving sections. - The account display row tracked by [#33](https://git.kayg.org/kayg/hermternal-apple/issues/33) remains an account row, not a pinnable session; this issue does not duplicate that work. - Pin state is server-side through `PATCH /api/sessions/{id}` with `{"pinned": bool}`, so it needs no local store and syncs across devices for free. - There is no manual pin order: the server stores only a Boolean and has no order column, so a local order would sync on one device and not another. Pinning may return with folder sync.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/hermternal-apple#38
No description provided.