57 lines
1.9 KiB
Markdown
57 lines
1.9 KiB
Markdown
# Sessions sidebar
|
|
|
|
**Status:** Implemented · **Code:** `Scripts/sidebar.js`, `Scripts/sessions-store.js`
|
|
|
|
Two sections: **Claude** (account, model, permission mode) and **Sessions** (the
|
|
project's conversations, newest first, each expanding into its actions).
|
|
|
|
```
|
|
Claude
|
|
Account [email protected] · Pro
|
|
Model Opus
|
|
Permissions Plan only
|
|
Sessions
|
|
▾ fix the parser bug 2h ago
|
|
Copy Resume Command
|
|
Copy Resume + Remote Control
|
|
Reveal Session File
|
|
```
|
|
|
|
## Where sessions come from
|
|
|
|
Claude Code stores one JSONL transcript per session:
|
|
|
|
```
|
|
~/.claude/projects/<slug>/<session-id>.jsonl
|
|
```
|
|
|
|
The slug is the project path with `/` and `.` flattened to `-`
|
|
(`/Users/me/git.example.ca/thing` → `-Users-me-git-example-ca-thing`). Files are
|
|
sorted by mtime; `firstPrompt()` reads up to 40 lines looking for the first
|
|
non-meta, non-synthetic user message to use as the row's label, falling back to
|
|
the short session id.
|
|
|
|
**Sessions started in a terminal appear here too** — it is the CLI's own store,
|
|
not something this extension maintains.
|
|
|
|
## Refreshing
|
|
|
|
Sessions live in `~/.claude`, **outside the workspace**, so `nova.fs.watch`
|
|
would never fire for them (and would cost a callback on every project file
|
|
change). Instead the list is rescanned when the Sessions section becomes
|
|
visible, plus on demand from the header's refresh button.
|
|
|
|
## Row plumbing
|
|
|
|
- `TreeItem.command` fires on **double-click**. A session row copies its resume
|
|
command; an action row runs its own action via `claudenova.sessionAction`,
|
|
which reads `sessionsView.selection[0]`.
|
|
- Session rows are `Collapsed` by default — with 25 rows, expanding all of them
|
|
would bury the list.
|
|
- `getParent()` returns the session for action rows so `reveal()` works.
|
|
|
|
## Gotchas
|
|
|
|
- `firstPrompt()` uses `readline()` and stops early: transcripts reach megabytes.
|
|
- Zero-byte and non-`.jsonl` entries are skipped.
|