teernisse 3fe8d7d3b5 Add comprehensive test suite for progress tracking system
Test fixture updates:
- Add toolUseId fields (toolu_read1, toolu_edit1) to tool_use blocks
- Add parentToolUseID-linked progress events for read and edit tools
- Add orphaned SessionStart progress event (no parent)
- Update tool_result references to match new toolUseId values
- Add bash_progress and mcp_progress subtypes for subtype derivation

session-parser tests (7 new):
- toolUseId extraction from tool_use blocks with and without id field
- parentToolUseId and progressSubtype extraction from hook_progress
- Subtype derivation for bash_progress, mcp_progress, agent_progress
- Fallback to "hook" for unknown data types
- Undefined parentToolUseId when field is absent

progress-grouper tests (7 new):
- Partition parented progress into toolProgress map
- Remove parented progress from filtered messages array
- Keep orphaned progress (no parentToolUseId) in main stream
- Keep progress with invalid parentToolUseId (no matching tool_call)
- Empty input handling
- Sort each group by rawIndex
- Multiple tool_call parents tracked independently

agent-progress-parser tests (full suite):
- Parse user text events with prompt/agentId metadata extraction
- Parse tool_use blocks into AgentToolCall events
- Parse tool_result blocks with content extraction
- Parse text content as text_response with line counting
- Handle multiple content blocks in single turn
- Post-pass tool_result→tool_call linking (sourceTool, language)
- Empty input and malformed JSON → raw_content fallback
- stripLineNumbers for cat-n prefixed output
- summarizeToolCall for Read, Grep, Glob, Bash, Task, WarpGrep, etc.

ProgressBadge component tests:
- Collapsed state shows pill counts, hides content
- Expanded state shows all event content via markdown
- Subtype counting accuracy
- Agent-only events route to AgentProgressView

AgentProgressView component tests:
- Prompt banner rendering with truncation
- Agent ID and turn count display
- Summary rows with timestamps and tool names
- Click-to-expand drill-down content

html-exporter tests (8 new):
- Collapsible rendering for thinking, tool_call, tool_result
- Toggle button and JavaScript inclusion
- Non-collapsible messages lack collapse attributes
- Diff content detection and highlighting
- Progress badge rendering with toolProgress data

filters tests (2 new):
- hook_progress included/excluded by category toggle

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 23:05:01 -05:00

Session Viewer

Browse, filter, redact, and export Claude Code sessions as self-contained HTML files.

Session Viewer reads session data from ~/.claude/projects/ and presents it in a dark-themed web interface with full-text search, message filtering, sensitive data redaction, and one-click HTML export.

Quick Start

# Install dependencies
npm install

# Run in development mode (starts both server and client with hot reload)
npm run dev

# Or run from the CLI entry point (opens browser automatically)
node bin/session-viewer.js

The API server runs on http://localhost:3848 and the Vite dev server on http://localhost:3847 (proxying API requests to the backend).

Features

Session Navigation

  • Project grouping -- Sessions are organized by their originating project directory.
  • Session metadata -- Each session displays its summary, first prompt, message count, duration, and last-modified date.
  • Sorted by recency -- Most recently modified sessions appear first.

Message Display

  • Nine message categories -- user_message, assistant_text, thinking, tool_call, tool_result, system_message, hook_progress, file_snapshot, and summary, each with a distinct color indicator.
  • Collapsible sections -- Thinking blocks, tool calls, and tool results collapse by default to reduce noise.
  • Diff rendering -- Git-style diffs are auto-detected and rendered with line-level syntax coloring.
  • Code blocks -- Fenced code blocks display a language label and a copy-to-clipboard button.
  • Time gap indicators -- Gaps of more than five minutes between messages are shown as labeled dividers.
  • Hash anchor links -- Each message has a copyable anchor link (#msg-{uuid}) for deep linking.
  • Full-text search across message content and tool input.
  • Match cycling -- Navigate between matches with Enter/Shift+Enter or Ctrl+G/Ctrl+Shift+G.
  • Match counter -- Displays current position and total matches (e.g., "3/12").
  • Minimap -- A scrollbar overlay shows match positions as yellow ticks with a viewport indicator. Click a tick to jump to that match.
  • Dimming -- Non-matching messages are visually dimmed while search is active.
  • Keyboard shortcut -- Press / to focus the search bar; Escape to clear and blur.

Filtering

  • Category toggles -- Show or hide any of the nine message categories. Thinking and hook progress are hidden by default.
  • Filters compose with search -- Category filters and search operate independently.

Redaction

  • Manual redaction -- Click the eye icon on any message to select it, then confirm to redact. Redacted messages are replaced by a visual divider.
  • Auto-redaction -- Toggle automatic detection of sensitive data (API keys, tokens, secrets, PII) using 37 regex patterns derived from gitleaks. Matching content is replaced with [REDACTED] inline.
  • Export-aware -- Both manual and auto-redaction states are respected during export.

Export

  • Self-contained HTML -- Export the current session view as a standalone HTML file with embedded CSS and syntax highlighting.
  • Respects filters -- The export includes only visible messages and applies the current redaction state.
  • Clean filenames -- Output files are named session-{id}.html with sanitized IDs.

Architecture

src/
  client/          React + Vite frontend
    components/    UI components (SessionList, SessionViewer, MessageBubble, etc.)
    hooks/         useSession, useFilters
    lib/           Markdown rendering, sensitive redactor, types, utilities
    styles/        CSS custom properties, Tailwind, design tokens
  server/          Express backend
    routes/        /api/sessions, /api/export
    services/      Session discovery, JSONL parser, HTML exporter
  shared/          Types shared between client and server
bin/               CLI entry point
tests/
  unit/            Vitest unit tests
  e2e/             Playwright end-to-end tests
  fixtures/        Test data

Tech Stack

Layer Technology
Frontend React 18, Tailwind CSS, Vite
Backend Express 4, Node.js
Markdown marked + marked-highlight + highlight.js
Testing Vitest (unit), Playwright (e2e)
Language TypeScript (strict mode)

API Endpoints

Method Path Description
GET /api/health Health check
GET /api/sessions List all sessions (30s server cache)
GET /api/sessions/:id Get session detail with parsed messages
POST /api/export Generate self-contained HTML export

Scripts

Script Description
npm run dev Start server + client with hot reload
npm run build TypeScript compile + Vite production build
npm run test Run unit tests (Vitest)
npm run test:e2e Run end-to-end tests (Playwright)
npm run typecheck TypeScript type checking
npm run lint ESLint

Configuration

Variable Default Description
PORT 3848 API server port
SESSION_VIEWER_OPEN_BROWSER unset Set to 1 to auto-open browser on start

Security

  • Path traversal protection -- Session discovery validates all paths stay within ~/.claude/projects/.
  • HTML escaping -- All user content is escaped before interpolation in exports.
  • Filename sanitization -- Export filenames strip non-alphanumeric characters.
  • Localhost binding -- Both the API server and Vite dev server bind to 127.0.0.1 only.
Description
No description provided
Readme 499 KiB
Languages
TypeScript 84.7%
HTML 8.8%
CSS 5%
JavaScript 1.5%