Claude Code Sessions & Agents
Never lose a Claude Code session again. See what every session is doing, find any past conversation by what was said in it, and read a session's whole story — agents, thoughts and files included — without resuming it.

▶ Click to play the full 48-second tour (1080p, 60 fps, with narration). Everything in it is invented demo data — no real sessions. Narration voiced with ElevenLabs.
Why this exists
I use Claude Code all day. In six weeks that was 96 sessions, and most of their titles sounded the same: Fix flaky cart test, Fix flaky login test, Fix flaky webhook test. I kept getting lost. Which one fixed the Stripe bug? Which one is waiting on me? Which one finished an hour ago?
Claude Code shows you the session you have open. This extension shows you all of them: which are running, which are waiting on you, what happened inside each, and how to get back to any of them.
See what is running A live list of every session — working, asking you something, waiting on a permission, done — with a status-bar count and a bell that rings only while the ball is in your court. |
Find anything Search what was actually said, not just titles: "retry storm", pr:482, is:headless. One keystroke: Ctrl+Alt+S. |
Read any session A threaded timeline of every agent, their tasks and results, and a readable transcript — thoughts, JSON, file previews — all without resuming the session. |

Everything is read from Claude Code's own transcript files. Nothing is installed into Claude Code, and nothing leaves your machine (see Privacy).
Quick start
- Install Claude Code Sessions & Agents from the Marketplace. The official Claude Code extension comes with it as a dependency.
- Click the sessions icon in the activity bar. Your sessions are already there.
- Press
Ctrl+Alt+S (Cmd+Alt+S on macOS) and type a few words you remember from a conversation.
Formerly Claude Code Session Finder. Same extension id, so an existing install updates in place; the commands, settings and keybinding are unchanged. Inside VS Code the view is simply Claude Code Sessions.
Three ways in
| Surface |
Open it |
For |
| Sessions view + status bar |
the sessions icon in the activity bar |
what is running or needs you right now, recent history, and a filter box that searches inside sessions while keeping the list browsable |
| Search picker |
Ctrl+Alt+S (Cmd+Alt+S on macOS) or Claude: Search Sessions |
the same search as a Quick Pick, when you know you want to jump to exactly one session |
| Session View |
V on a row, the tree icon on a search result, or Claude: Open Session View |
reading a session: agents, timeline, transcript |
What is a session?
Every conversation you have with Claude Code — in the VS Code extension or the terminal — is a session. Claude Code writes each one to disk as it goes, under ~/.claude/projects/, as a transcript of your prompts, Claude's replies, every tool call and its result, and one file per subagent the session spawned. That is the complete record of the work, and it outlives the chat window.
See what is running
The status bar shows ⟳ 2 🔔 3: two sessions working, and three where the ball is in your court and you have not looked yet. Hover for the list, ringing ones first; click to open the Sessions view. The same glyphs mark rows in the Sessions view and in search results:
| Glyph |
State |
Meaning |
⟳ spinning |
running |
the model is working — including long answers, which write nothing for a while |
? |
asks you |
Claude asked a question (AskUserQuestion) or has a plan for you to approve, and is waiting for the answer |
🔔 |
may need you |
waiting on a tool call for a while: usually a permission prompt, sometimes a slow tool |
💬 |
done |
Claude finished its turn and is waiting for you |
⊘ |
interrupted |
you stopped it (Esc); nothing is running until you type again |
⚠ |
stalled |
nothing written for 15+ minutes mid-turn; probably abandoned |
The bell rings while the ball is in your court and you have not seen it there. A finished turn, an interruption or a quiet tool call stops ringing once you look at the session — its Claude Code tab or its Session View on screen in a focused window, in any editor group — and a reply that lands while you watch never rings. A question or a plan to approve keeps ringing until you answer it. A ringing row has the accent bar and a bold title; one you have seen is plain. Looking in one window quiets the bell in all of them. A session running in a terminal, or in Claude Code's side panel, has no tab to look at: it rings until you reply or close it.
It feels alive. A working session's words shimmer and its glyph is a breathing sparkle; a session that just finished throws a small burst of sparks; with reduced motion on, nothing moves. Hover a glyph for the sentence behind it.
Rows stay put. Rows are ordered by when you last touched them — a prompt (typed, or queued while Claude works), a slash command, Esc, an answer to a question or a plan — newest on top. A row moves only because of something you did: Claude replying, finishing or asking never reorders the list, so nothing shuffles under your pointer, and the bell marks what needs you. A session you start goes on top; a session you resume goes on top when you send it something. Active keeps the room it has needed since the view opened, plus a row, so Closed stays where it is as sessions come and go.
Cost meter. Each active row carries a small bar with its context size: the tokens the model was given on its last turn, and therefore what every further turn costs. One absolute scale for every session toward sessionFinder.contextBudget (1M by default, where compaction lands): cyan until 80% of it, amber from there, and pinned full in red past it: compact or start a new session. Hover the bar for the numbers.
Headless runs. A session started without a UI — claude -p, the Agent SDK, a daemon — wears a purple ghost (purple means nothing else in the view) in place of the state glyph, with a dot on its corner for how the run is doing: blue and pulsing while it works, green when it finished, red when it stopped before finishing. Claude Code's own tab shows these sessions blank, so clicking one reads it in the Session View; the right-panel button still resumes it in Claude Code. The ghost button in the view's title bar hides them (per workspace; a "N headless runs hidden · show" link brings them back), and is:headless in the filter finds them either way.
State is derived from the last conversational record of each recently written transcript, so a session in another window, another worktree, or a terminal shows up too. Sessions written within sessionFinder.activeWindow (default 4 h), or open in a Claude Code tab in this window, carry a state; sessionFinder.toolQuietSeconds (60) and sessionFinder.stalledMinutes (15) tune the two thresholds.
Browse sessions
The Sessions view lists what is live and what is closed for this workspace: sessions from its folders, their git repository and every worktree of it. Sessions from other projects stay out until you press the filter button in the view title (or sessionFinder.sidebarScope). The status bar and the search picker always cover every project.
The row for the session in your active editor tab is highlighted, and follows you as you switch between Claude Code tabs and Session Views.
- Active — sessions written in the last
activeWindow, or open in a Claude Code tab in this window, the one you touched last on top. The time label says what the session is doing — working · 3m, may need you · 3m, asks you · 1m, done · 6m ago, interrupted · 2m, stalled · 2h — and how long since it last wrote: the last prompt or reply, not the file, so looking at a session does not count. Hover it for what the number measures. One kept here only by its tab, past the window, wears an orange > 19h or > 2d 1h tag instead (red after a day): close it when you mean to, and not before.
- Closed — the 50 sessions you touched most recently that are not active, with the day you last touched each, its branch, PRs and Slack threads, and Search all… for everything older. Clicking one resumes it, which makes it active.
Under each title: where the work is, and what it links to. The branch the session last worked on comes first: not the main or detached HEAD it went back to after opening a PR (hover it to see where it is now). Then its worktree, when the worktree's folder name says something the branch does not, struck through once the folder is gone. A session from another project names its project. Then every PR the session linked, newest first, and every Slack thread you pasted into it — buttons: hover for the details, click to open. A PR's icon is its state on GitHub — open (green), merged (the merge icon, in the text colour), closed (red) or draft — and its tooltip carries its title; see Privacy. Every PR shown keeps its number: the three newest show, with the newest Slack thread, and the rest fold into +N at the end, whose tooltip counts them ("6 more PRs (5 merged, 1 closed) and 1 Slack thread") and which lists every link. They sit beside the branch while there is room and take a line of their own when there is not, folding further there if they must.
Keyboard. ↑ ↓ move · Enter opens in a tab · Shift+Enter opens in the right panel · V opens the Session View · T opens the raw transcript · Delete closes the session · / filters. Hover or focus a row for the same actions as buttons, plus a copyable deep link — laid over the line below the title, so nothing moves and the title keeps its width — and right-click a row for all of them as a menu. In a narrow sidebar (under 380 px) the title has the first line to itself and the state words start the second.
Opening in the right panel uses Claude Code's own "Open in Side Bar", which also makes that the default for new sessions until you run Claude Code: Open in New Tab; the first time, a notice says so.
Closing a session. Resuming a session writes its transcript, so one accidental click under Closed promotes a finished session to Active for the whole activeWindow. The × at the end of an active row's actions (or Delete on the focused row, or Claude: Close Session from the palette) puts it back under Closed at once and closes its Claude Code tab. Closing the tab stops the session, so if Claude is still working in it you are asked first. A tab that cannot be told apart from another session's (Claude Code labels tabs with the first 24 characters of the title) is left open, and a message says so. It works the other way too: closing a Claude Code tab yourself moves its session under Closed. A closed session stays closed until its transcript is written again after the close — you resumed it and sent a message — or you open it from the view.
Search inside sessions
Claude Code's own picker matches session titles. Once a title stops reminding you what happened, that session is lost. Search here — in the sidebar's filter box (type, or press /) or the Ctrl+Alt+S picker — matches what you and Claude actually said:

| Type |
To find |
paste image |
sessions containing both words |
"paste image" |
that exact phrase |
pr:1234 |
the session that opened that PR — exact, so the recency window is ignored |
since:30d, since:all |
narrow or widen the default 60-day window (sessionFinder.defaultWindow) |
is:headless, -is:headless |
only headless runs (claude -p and kin), or everything but them — on its own, every run in the window |
!"npm run build" |
also search tool calls and results, including subagents — slower |
A ! search matches whole transcripts, so quote a phrase unless you really do want every session that mentions all those words anywhere.
In the sidebar, results replace the list and stay on screen: open one in a tab, read another in the Session View, come back, refine, and Esc or the × restores Active and Closed. Deep ! searches stay in the picker.
| Row action |
Behavior |
Enter |
opens the session — revealing an already-open tab, or opening a new one. A session from another git worktree opens in a window on that folder. A headless run (👻) opens in the Session View instead |
| 🌳 Session View |
reads the session without resuming it |
| 🔗 Copy deep link |
vscode://anthropic.claude-code/open?session=<id> |
| 📁 Reveal folder |
reveals the session's folder in the explorer |
| 📄 Open transcript |
the raw .jsonl, which works even for a session that can no longer be resumed |
Read a session
The Session View opens a session in an editor tab straight from its transcript — running, finished, or from a worktree that no longer exists — and keeps up with the files while the session is active.

- Timeline — every agent is a thread that branches off the lane of whoever started it, at the moment it did; a running one glows at its open end. Stretches nobody was working (over 20 minutes) fold into a marked gap — "3h 36m idle" — so a two-day session's bursts are not slivers. Click a lane.
- Agents — the session, then everything it started: a workflow is a group with a strip of its agents' outcomes; each agent shows its model (a cyan chip, deeper for bigger models), when in the session it ran, and — while it runs — the call it is in right now ("Bash · npm run bench · 42s").
- Overview of the selected agent — where it sits (session › workflow › agent), the task it was given, what it is doing now and the last thing it said, every step it took with timings, and its result.
- Transcript — prompts and replies laid out as Markdown (headings, lists, tables, code; a
<context> section as a labelled box; the ★ Insight block as a callout), each tool call a row that expands to its input and output. Every thought whose text Claude Code kept is shown — about a quarter of Opus's, none of Sonnet's — and the rest are counted ("2 thoughts not kept"). JSON opens Formatted when it is a shape we know (a review's verdict and findings, as cards), else Pretty; the Dump is a click away, and your choice sticks for that tool. Every block has a copy button in its corner, and inline code copies on a click.
- File names anywhere — absolute, relative,
path:line — are live: hover for a card with the file's size, lines, when it changed and a preview (the image itself, or the lines around the one named), click to open it beside the view. A relative name is found where the agent was working (its worktree), then up the tree; a file in a worktree that has since been removed is found at the same path in the main checkout, and the card says so.

"Raw transcript" in the header opens the underlying .jsonl for anything the reader summarises. For a session you already have open, Claude Code's own agents pill shows the same tree live; this view is for the ones you don't.
Commands and settings
| Command |
|
| Claude: Search Sessions |
Ctrl+Alt+S / Cmd+Alt+S |
| Claude: Show Sessions |
focus the Sessions view |
| Claude: Filter Sessions |
focus the sidebar's filter box |
| Claude: Sessions — Show All Projects / Show This Workspace Only |
toggle the sidebar's scope for this workspace |
| Claude: Sessions — Hide Headless Runs / Show Headless Runs |
the ghost button: toggle headless runs in the sidebar for this workspace |
| Claude: Open Session View |
read the current or a chosen session |
| Claude: Open Session in Tab / in Right Panel |
resume a session where you want it |
| Claude: Copy Session Link / Open Session Transcript File / Close Session |
also on a row's right-click menu |
| Claude: Refresh Sessions |
re-scan now |
| Setting |
Default |
|
sessionFinder.defaultWindow |
60d |
recency window for searches; pr: ignores it |
sessionFinder.sidebarScope |
workspace |
workspace: this workspace's folders, repo and worktrees · all: every project. The view's filter button overrides it per workspace |
sessionFinder.hideHeadlessRuns |
false |
keep headless runs out of the Sessions view; the ghost button overrides it per workspace |
sessionFinder.activeWindow |
4h |
sessions written within this are Active and carry a state |
sessionFinder.toolQuietSeconds |
60 |
waiting on a tool longer than this shows 🔔 |
sessionFinder.stalledMinutes |
15 |
silence longer than this mid-turn shows ⚠ |
sessionFinder.prStates |
true |
colour each linked PR by its state on GitHub, asked through gh; false makes no network request |
Privacy
This extension reads your Claude Code transcripts from ~/.claude/projects, extracts the conversational text, and stores an index in VS Code's local extension storage on your machine. Nothing is uploaded or shared with anyone, including the author. There is no telemetry and no analytics of any kind.
One network request is made, and you can turn it off: to colour each PR on a row by its state and show its title, the extension asks GitHub about those PRs — their repository and number, nothing else — through your own GitHub CLI (gh), signed in as you, when it is installed. A merged or closed PR is asked about once; an open one again after ten minutes, while it is on screen. Set sessionFinder.prStates to false and the extension makes no network request at all.
Requirements
The official Claude Code extension, installed automatically as a dependency.
For contributors: why it activates at startup
activationEvents is ["onStartupFinished"] on purpose — do not change it to []. When you open a session that belongs to a different folder, this extension writes a single-use hand-off file and asks VS Code to open that folder. The window that ends up on the target folder has to notice that file, and a lazily-activated extension in a window nobody has invoked a command in never would. Startup activation is what makes the hand-off arrive. It is also what lets the status bar show live state before you ask.
License
MIT