sessiongraph 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/guide.md CHANGED
@@ -62,9 +62,9 @@ pnpm start
62
62
 
63
63
  ## Import and update
64
64
 
65
- On first launch, choose the apps to import. Change that selection in **Settings → Sources** or **Manage sources** next to the source filter, then click **Import selected sources** / **Import updates**. **Refresh sessions** imports updates from your selected sources.
65
+ On first launch, choose the apps to import. Change that selection in **Settings → Sources** or **Manage sources** next to the source filter, then click **Import selected sources** / **Import updates**. The compact options show each app's icon, detection status, and saved count; hover for source details. **Refresh sessions** imports updates from your selected sources.
66
66
 
67
- **Auto-import sessions** is on by default in **Settings → Sources**. It checks previously selected sources on startup, when returning to the app, and every minute while the app is visible. Checks pause while hidden or a dialog is open, share a 30-second cooldown with recent imports, and never overlap an active import. Unchanged libraries do not rebuild the graph; background updates preserve your camera, playback, and selection. Automatic imports do not select new sources for you.
67
+ **Auto-import sessions** is on by default in **Settings → Sources**. It checks previously selected sources on startup, when returning to the app, and every minute while the app is visible. Checks pause while hidden or a dialog is open, share a 30-second cooldown with recent imports, and never overlap an active import. Unchanged libraries do not rebuild the graph. Both manual and automatic refresh preserve your camera, zoom, playback, and selection. Existing layout positions stay stable as new history arrives; **Fit view (F)** recalculates the overview when you want to reframe it. Automatic imports do not select new sources for you.
68
68
 
69
69
  The auto-import choice is saved in the local SQLite library, so it survives desktop restarts and is shared by browser and desktop instances using that library. Turning it off stops future automatic checks; an import already running can finish. Manual Refresh remains available. There is no background service after the app closes. OpenCode's local service must still be running to import its new history.
70
70
 
@@ -84,7 +84,7 @@ Onboarding closes automatically after a successful import and library refresh. I
84
84
  | Source | Read-only interface | Relationships and limitations |
85
85
  | --- | --- | --- |
86
86
  | OpenCode | Official authenticated local service discovery and V2 GET API | Explicit forks and child IDs; authoritative snapshot paths where available. OpenCode must be running for an import, but not to browse saved data. Remote endpoints are rejected. |
87
- | Claude Code | SDK `listSessions`, `getSessionMessages`, `getSubagentMessages`; local transcript metadata | All local projects, worktrees, and subagent transcripts. SDK-visible conversation chain can omit pre-compaction text. No inferred fork ancestry. File evidence requires a successful matching edit-tool result. |
87
+ | Claude Code | SDK conversation-chain parsing with read-only local transcript discovery | CLI and VS Code extension sessions, including IDE-prefixed prompts omitted by the SDK listing. Reads the discovered file directly, including Windows paths and moved workspaces; preserves recorded message times and explicit subagent metadata. SDK-visible history can omit pre-compaction text. No inferred fork ancestry. File evidence requires a successful matching edit-tool result. |
88
88
  | Codex | Bounded streaming reads of active and archived local JSONL rollouts | Explicit recorded fork/parent fields; completed file-change events. Mirrored event text is not imported twice. Store-only/cloud-only history and ordinary ChatGPT desktop/web chats are not imported. No agent process is started. |
89
89
  | Cursor | IDE JSONL transcripts in `~/.cursor/projects/*/agent-transcripts/`, CLI `~/.cursor/chats/` and ACP `~/.cursor/acp-sessions/` stores | Explicit subagent directories; one representation per native ID, preferring the committed store conversation. No inferred forks or successful edits. Legacy Composer databases, older `.txt` transcripts, cloud-only and SDK-only history are excluded. |
90
90
  | Gemini CLI | `~/.gemini/tmp/*/chats/` JSON/JSONL; sandbox cache equivalent | Reconstructs append-only patches and rewinds. Explicit subagent directories form parent links. Workspace identity comes from `.project_root`; unknown directories stay unknown. |
@@ -98,6 +98,8 @@ Onboarding closes automatically after a successful import and library refresh. I
98
98
 
99
99
  Source roots respect `CLAUDE_CONFIG_DIR` and `CODEX_HOME`. `SESSIONGRAPH_SERVICE_FILE` selects a local OpenCode service registration. Adapters never read authentication files or execute source configuration, hooks, or agents. Source formats can evolve: unsupported history is disclosed rather than fabricated.
100
100
 
101
+ Claude Code's local VS Code extension uses the same transcript directory as its CLI: `~/.claude/projects` (`%USERPROFILE%\.claude\projects` on Windows), or `projects` under `CLAUDE_CONFIG_DIR`. A separate CLI installation is not required for import. History in WSL, SSH hosts, or dev containers must be accessible in the environment running SessionGraph.
102
+
101
103
  ### Additional source locations
102
104
 
103
105
  - Gemini respects `GEMINI_CLI_HOME` as a replacement home directory. `SESSIONGRAPH_GEMINI_HOME` selects a `.gemini`-style directory containing `tmp/`.
@@ -140,15 +142,20 @@ Desktop update checks and downloads contact GitHub without session content; npm
140
142
  ## Explore
141
143
 
142
144
  - Full-viewport, antialiased Three.js map with floating, draggable, dismissible cards. **H** hides/restores cards; **F** fits the view.
143
- - Source badges distinguish harnesses in the list, inspector, tooltips, and search. Filter by source, project, directory/worktree, date, archived status, or children. The default window is 90 days.
144
- - Time runs left to right. Each session's trail starts at creation and connects exactly to its node at the latest saved message timestamp. Missing message timestamps leave the node at creation; metadata update times are not substituted. Directory colors group sessions; only distinct fork and child edges represent ancestry. Date filters use session creation; the list and histogram follow session endpoints.
145
- - Click a session to center its node and recent message trail together in the map area between your panels. Small, dim icons above the dots distinguish user/assistant messages, tools, reasoning, file changes, and other events. Icons are collision-culled and bounded to 64; all plotted dots remain interactive. The latest message uses the session sphere instead of an overlapping dot and remains readable in the explorer. Markers load lazily, capped at the latest 2,000 timed items within the lifetime, plus a selected older item. Counts disclose untimed and out-of-lifetime items.
146
- - Hover a marker to preview its message or tool payload. Click to focus that marker and open message details below the session card, keeping the map interactive. **Previous / Next** and **← / → / ↑ / ↓** step through events and focus their recorded positions. Untimed items remain readable without inventing a map location. Escape closes message details first; arrow keys on session cards or the map navigate sessions when message details are closed. Form controls and panel-drag handles retain their own arrow-key behavior.
147
- - **Browse saved events** in the message panel provides filters and 60-item pages. Details include bounded text/input/output, timestamp provenance, status, native IDs, and links between tool calls/results. Saved source order is preserved even without timestamps; no timestamps or tool pairing are inferred. Nearby markers can overlap; step through them with the navigation controls.
145
+ - Source badges distinguish harnesses in the list, inspector, tooltips, and search. Filter by source, project, directory/worktree, date, or children. The default window is **All time**; archived sessions are hidden unless enabled in **Settings → Interface → Show archived sessions**. Previously saved choices remain honored.
146
+ - Selecting a session dims surrounding nodes, halos, and trails. Click or tap empty map space to clear selection and restore the full map brightness without moving the camera. Drags and right-clicks keep the selection; **Settings → Graphics → Focus dimming** controls the dimming effect.
147
+ - Time runs left to right. Each session orb appears at creation and travels with the playback frontier, leaving a tapered shooting-star trail and a subtle spiral particle wake. The trail ends at the latest saved message timestamp; the sphere sits just beyond it so message dots stay visible. Missing message timestamps leave the endpoint at creation; metadata update times are not substituted. Full directory paths share one colored stream across harnesses; unknown directories fall back to harness-scoped project IDs. Distinct directories and worktrees stay separate. Curved fork and child links retain recorded ancestry and attachment times. Date filters use session creation; the list and histogram follow session endpoints.
148
+ - Click a session for a close-up of its orb; click a message dot for a tighter close-up of that message. Focus preserves your current viewing side and angle; zoom and pinch remain unrestricted. All saved timed conversation markers load on selection, including the final message. File history scans automatically in cancellable batches. Bright white message dots follow the same subtle spiral as the comet trail, retaining their recorded X/time positions; small icons distinguish user and assistant messages. Icons are collision-culled and bounded to 64; all plotted dots remain interactive. Untimed and out-of-lifetime messages remain available in the message explorer, which loads message bodies on demand.
149
+ - Hover a marker to preview its message. Click to focus that marker and open message details below the session card, keeping the map interactive. **Previous / Next** and **← / → / ↑ / ↓** step through user and assistant messages and focus their recorded positions. Untimed messages remain readable without inventing a map location. Escape closes message details first; arrow keys on session cards or the map navigate sessions when message details are closed. Form controls and panel-drag handles retain their own arrow-key behavior.
150
+ - **Browse messages** opens 60-message pages of the conversation. Details include message text, recorded time, and source provenance. Tool calls, reasoning, and other detailed events are excluded from the dots and message browser. Underlying imported history and file evidence remain saved. Source order is preserved even without timestamps. Nearby markers can overlap; step through them with the navigation controls.
148
151
  - Older libraries migrate to schema v4 using their existing saved messages. Reconstructed events are labeled partial; **Refresh sessions** enriches them with structured source events. The explorer asks you to reload if an import changes its snapshot while browsing.
149
152
  - Click a session for changed-file satellites and source evidence. File details load in 120-message batches; the map displays at most 80 files. Evidence describes historical edits, not today's Git diff.
150
- - **Play** follows newly appearing clusters with a half-turn around the graph and a closing pullback (30 seconds at 1×). Dragging, zooming, scrubbing, fitting, or opening a dialog pauses playback. 2D pans without orbiting; reduced motion keeps the camera still.
151
- - The timeline's calendar offers a styled range picker with presets, month/year navigation, typed ISO dates, and keyboard navigation. Date boundaries are inclusive in your local timezone. Select menus share keyboard/typeahead behavior and styling across filters, settings, search, events, and the launcher.
153
+ - **Play** follows newly appearing clusters with close camera framing, a half-turn around the graph, and a closing pullback (15 seconds at 1×). It then makes a full 360° overview orbit over 5 seconds, slowing gently over the final 1.75 seconds and returning to the exact view where the timeline finished. A 1-second final hold precedes UI restoration: 21 seconds total at 1×. The graph sits above the date and counters; shared animations use the same framing and ending. Orbs appear with a brief, soft sparkle; their trails fade in afterward. Glowing gold forks curve, while lavender subagent links stay straight; both draw from parent to child at the child's recorded start. Rewinding resets their entrances. Recorded token usage has a moderate, logarithmic effect on orb size, capped so large sessions stay readable. Dragging, zooming, scrubbing, fitting, or opening a dialog pauses playback. 2D pans without orbiting; reduced motion keeps the camera still and reveals without animation.
154
+ - Playback hides the other panels and controls, leaving a borderless timeline, a compact approximate date, large **Sessions** and **Burnt tokens** counters, and a prominent **Share SessionGraph** button. The date shows month and year for histories spanning at least 90 days, and includes the day for shorter ranges; shared animations use the same date. Session counts include every filtered session as its orb appears, regardless of token coverage. Pausing or pressing **Esc** restores the panels immediately. Recorded token totals from OpenCode and Continue accumulate when each session reaches its latest saved message; cache is included where reported. Token counts skip missing/unsupported usage and include totals without message timestamps only at the end. Missing usage displays **—**; no usage is estimated between messages.
155
+ - **Share SessionGraph** offers **GIF** and **MP4 video**, rendered locally at 960×600 and 30 fps: 15 seconds of playback, a 5-second overview orbit, and a 1-second ending hold (630 frames; GIF timing alternates 30/40 ms). MP4 uses H.264 with fixed frame timestamps and requires WebCodecs encoding support; GIF remains available on other browsers. Each directory stream gets a unique random two-word alias such as **Project Cosmic Wombat**, shared by both formats while the dialog is open. A separate export model excludes original names, paths, session titles, native IDs, messages, and file details. Previews and saved animations contain the map, aliases, timeline, date, session count, and known burnt-token totals. Switching formats cancels unfinished rendering; completed formats stay ready until the dialog closes. Cancel releases rendering resources.
156
+ - **Save GIF / Save MP4** opens a file picker in the desktop app and supporting browsers; other browsers start a download with visible feedback. **Share…** opens system file sharing when supported, or a tray with save, caption-copy, and X options. **Share in X** opens a draft; attach the saved animation there. Rendering stays local, and sharing happens only through your chosen destination.
157
+ - Exports use gentler, tighter glow. GIF adds precise color mapping with subtle shadow dithering to reduce banded halos in its limited palette; MP4 preserves smoother gradients and more colors.
158
+ - The timeline's calendar offers a styled range picker with presets, month/year navigation, typed ISO dates, and keyboard navigation. Date boundaries are inclusive in your local timezone. Select menus share keyboard/typeahead behavior and styling across filters, settings, search, and the launcher.
152
159
  - **Open session** lets you choose one of eight CLI destinations and a working directory. See cross-harness continuation below.
153
160
  - Unknown model/cost/token fields stay unknown. Session selection is encoded in a local permalink.
154
161
 
@@ -156,10 +163,10 @@ Desktop update checks and downloads contact GitHub without session content; npm
156
163
 
157
164
  Open **Settings** using the gear button. Changes apply live and persist on this device:
158
165
 
159
- - **Interface:** 2D/3D, system/on/off motion, list density, panel transparency, and reset panel positions.
166
+ - **Interface:** 2D/3D, system/on/off motion, list density, archived-session visibility, panel transparency, and reset panel positions.
160
167
  - **Sound:** procedural interaction tones, volume, chime preview, and mute. Only control interactions produce sound; there is no ambient audio. The speaker button mutes feedback quickly; no audio is downloaded.
161
- - **Graphics:** performance/balanced/high rendering, glow, node size, stars, labels, and focus dimming.
162
- - **Trails & playback:** all/selected/hidden lifetime trails, brightness, decorative flow and speed, relationship links, event markers, and 0.25×–3× playback. Flow respects reduced motion and never changes event timestamps or trail endpoints.
168
+ - **Graphics:** performance/balanced/high rendering, glow, node size, stars, labels, and focus dimming. Balanced and high retain antialiasing and bloom with bounded high-DPI buffers; the soft bloom pyramid uses a lower resolution to reduce GPU work.
169
+ - **Trails & playback:** all/selected/hidden lifetime trails, brightness, decorative flow and speed, relationship links, message dots, and 0.25×–3× playback. Flow respects reduced motion and never changes message timestamps or saved trail endpoints.
163
170
 
164
171
  **Restore defaults** resets these preferences; they are saved in the local library, with an appearance cache in browser/WebView local storage.
165
172
 
@@ -186,7 +193,7 @@ Press **/** or **⌘/Ctrl+K**. MiniSearch runs in a worker with fuzzy, accent-in
186
193
  - Search documents and pagination checkpoints are saved incrementally in **SQLite**, shared by the browser and desktop builds. Reloading restores them locally and resumes unfinished indexing. Previous IndexedDB caches are retired after SQLite is reachable.
187
194
  - **Conversations** pauses/resumes indexing. **Filters → Clear saved index** clears only search checkpoints, preserving imported sessions; enabling Conversations rebuilds from SQLite without rereading the source apps.
188
195
  - Indexing is bounded: 24 million characters overall, at most 48,000 per session, up to eight 60-message pages. Preview pages cap text at 64,000 characters and individual strings at 8,000. Coverage indicators disclose sampling and partial histories. The imported SQLite messages can contain more history than the searchable sample.
189
- - Imports are capped at 50,000 normalized messages, 16 million text/payload characters, or 2,000 pages per session. Structured event payloads are additionally bounded to 128,000 characters per message, and the timeline table to 200,000 items / 32 MB per session. Claude SDK reads are limited to 128 MB transcript files; Codex streams bounded lines. Limits are disclosed in history coverage.
196
+ - Imports are capped at 50,000 normalized messages, 16 million text/payload characters, or 2,000 pages per session. Structured event payloads are additionally bounded to 128,000 characters per message, and the timeline table to 200,000 items / 32 MB per session. Claude reads are limited to 128 MB / 200,000 source records per transcript; Codex streams bounded lines. Incomplete imports are labeled **Partial history**.
190
197
 
191
198
  ## Architecture / adding sources
192
199
 
@@ -207,7 +214,7 @@ src/imports.ts Onboarding and source management
207
214
  src/search/ Worker search and SQLite checkpoint bridge
208
215
  src/layout.ts, scene.ts Source-agnostic graph and cinematic visualization
209
216
  src/timeline.ts Shared message/tool/event envelope and presentation types
210
- src/event-explorer.ts Lazy event browsing, details, and tool correlation links
217
+ src/event-explorer.ts Lazy user/assistant message browsing and details
211
218
  src/event-hover.ts Bounded, cancellable message previews on marker hover
212
219
  src/preferences.ts Validated, versioned local appearance/audio settings
213
220
  src/settings.ts, audio.ts Settings dialog and offline procedural audio lifecycle
package/docs/v1.0.1.md ADDED
@@ -0,0 +1,25 @@
1
+ # SessionGraph v1.0.1
2
+
3
+ **Explore & visualize all your LLM sessions**
4
+
5
+ - **Moving orbs:** sessions appear at creation and travel with time, leaving their trails behind before resting at the latest saved message.
6
+ - **Cleaner conversations:** message dots match their session orb. The message browser shows user and assistant messages with simple Previous / Next navigation.
7
+ - **Better defaults:** start with **All time** and archived sessions hidden. **Settings → Interface → Show archived sessions** brings them back; saved choices remain honored.
8
+ - **Keep your place:** manual and automatic refresh preserve camera position, zoom, and session/message selection. Added history keeps existing layout positions and directory colors stable. **Fit view (F)** explicitly reframes the map.
9
+ - **Twelve recognizable sources:** locally bundled icons throughout the app, with compact source options showing detection status and saved counts. All twelve fit in the desktop picker without searching.
10
+ - **Clearer focus:** stronger dimming for surrounding nodes, halos, and trails. Click or tap empty map space to deselect; panning and orbiting keep your selection.
11
+ - **Smoother demo:** a new 60 FPS video with gentle zoom, orbit, timeline playback, message exploration, conversation search, and the compact source picker. All demo sessions are synthetic.
12
+
13
+ ## Update
14
+
15
+ Use the desktop **Update** pill to download and verify the update, then choose **Restart** when ready. Native downloads are available for macOS Apple Silicon/Intel, Windows x64, and Linux x64/ARM64.
16
+
17
+ With Node.js 24+:
18
+
19
+ ```sh
20
+ npx sessiongraph@1.0.1
21
+ # Browser edition:
22
+ npx sessiongraph@1.0.1 --browser
23
+ ```
24
+
25
+ [Watch the 60 FPS demo](https://github.com/arvindell/sessiongraph/releases/download/v1.0.1/sessiongraph-demo.mp4) · [Privacy](https://github.com/arvindell/sessiongraph/blob/v1.0.1/PRIVACY.md) · [MIT license](https://github.com/arvindell/sessiongraph/blob/v1.0.1/LICENSE)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sessiongraph",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -25,11 +25,11 @@
25
25
  "README.md"
26
26
  ],
27
27
  "optionalDependencies": {
28
- "sessiongraph-app-darwin-arm64": "1.0.0",
29
- "sessiongraph-app-darwin-x64": "1.0.0",
30
- "sessiongraph-app-linux-arm64": "1.0.0",
31
- "sessiongraph-app-linux-x64": "1.0.0",
32
- "sessiongraph-app-win32-x64": "1.0.0"
28
+ "sessiongraph-app-darwin-arm64": "1.0.2",
29
+ "sessiongraph-app-darwin-x64": "1.0.2",
30
+ "sessiongraph-app-linux-arm64": "1.0.2",
31
+ "sessiongraph-app-linux-x64": "1.0.2",
32
+ "sessiongraph-app-win32-x64": "1.0.2"
33
33
  },
34
34
  "type": "module",
35
35
  "engines": {
@@ -54,6 +54,8 @@
54
54
  "@opencode/client": "^2.2.1",
55
55
  "@tauri-apps/api": "^2.12.4",
56
56
  "@tauri-apps/cli": "^2.12.4",
57
+ "@tauri-apps/plugin-dialog": "^2.8.4",
58
+ "@tauri-apps/plugin-fs": "^2.7.1",
57
59
  "@tauri-apps/plugin-process": "^2.4.0",
58
60
  "@tauri-apps/plugin-updater": "^2.14.1",
59
61
  "@types/node": "^24.0.0",
@@ -62,7 +64,9 @@
62
64
  "@zag-js/select": "^1.47.0",
63
65
  "@zag-js/vanilla": "^1.47.0",
64
66
  "esbuild": "^0.28.2",
67
+ "gifenc": "1.0.3",
65
68
  "lucide": "^0.468.0",
69
+ "mediabunny": "^1.65.0",
66
70
  "minisearch": "^7.2.0",
67
71
  "three": "^0.180.0",
68
72
  "tsx": "^4.23.15",
@@ -70,5 +74,5 @@
70
74
  "vite": "^7.2.0"
71
75
  },
72
76
  "packageManager": "pnpm@11.10.0",
73
- "sessionGraphCommit": "5cfead10aa54c81c46ed55bf6ab2725fa5c14cb7"
77
+ "sessionGraphCommit": "c6210c490717ba6f3e7783e2e31857c0291ffb63"
74
78
  }