heyiam 0.1.2 → 0.1.3

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.
@@ -0,0 +1,209 @@
1
+ import { readFile, readdir } from "node:fs/promises";
2
+ import { createHash } from "node:crypto";
3
+ import { join } from "node:path";
4
+ import { homedir } from "node:os";
5
+ const IDLE_THRESHOLD_MS = 5 * 60 * 1000;
6
+ const GEMINI_BASE = () => join(homedir(), ".gemini", "tmp");
7
+ // --- File path extraction from message text ---
8
+ const ABS_PATH_RE = /(?:^|\s)(\/[\w./-]+\.\w+)/g;
9
+ const AT_REF_RE = /@([\w./-]+)/g;
10
+ function extractFileRefsFromText(text) {
11
+ const files = new Set();
12
+ for (const match of text.matchAll(ABS_PATH_RE)) {
13
+ files.add(match[1]);
14
+ }
15
+ for (const match of text.matchAll(AT_REF_RE)) {
16
+ files.add(match[1]);
17
+ }
18
+ return [...files];
19
+ }
20
+ // --- Parse log entries ---
21
+ function parseGeminiLog(raw) {
22
+ try {
23
+ const parsed = JSON.parse(raw);
24
+ if (!Array.isArray(parsed))
25
+ return [];
26
+ return parsed.filter((e) => typeof e === "object" &&
27
+ e !== null &&
28
+ typeof e.sessionId === "string" &&
29
+ typeof e.timestamp === "string");
30
+ }
31
+ catch {
32
+ return [];
33
+ }
34
+ }
35
+ function groupBySession(entries) {
36
+ const groups = new Map();
37
+ for (const entry of entries) {
38
+ const group = groups.get(entry.sessionId) ?? [];
39
+ group.push(entry);
40
+ groups.set(entry.sessionId, group);
41
+ }
42
+ return groups;
43
+ }
44
+ // --- Convert to RawEntry[] ---
45
+ function toRawEntries(entries) {
46
+ return entries.map((e) => ({
47
+ type: e.type === "model" ? "assistant" : "user",
48
+ uuid: `${e.sessionId}-${e.messageId}`,
49
+ timestamp: e.timestamp,
50
+ sessionId: e.sessionId,
51
+ message: {
52
+ role: e.type === "model" ? "assistant" : "user",
53
+ content: e.message,
54
+ },
55
+ }));
56
+ }
57
+ // --- Duration ---
58
+ function computeDuration(entries) {
59
+ if (entries.length === 0) {
60
+ return { duration_ms: 0, wall_clock_ms: 0, start_time: null, end_time: null };
61
+ }
62
+ const timestamps = entries.map((e) => new Date(e.timestamp).getTime());
63
+ const start_time = entries[0].timestamp;
64
+ const end_time = entries[entries.length - 1].timestamp;
65
+ if (timestamps.length < 2) {
66
+ return { duration_ms: 0, wall_clock_ms: 0, start_time, end_time };
67
+ }
68
+ const wall_clock_ms = timestamps[timestamps.length - 1] - timestamps[0];
69
+ let activeMs = 0;
70
+ for (let i = 1; i < timestamps.length; i++) {
71
+ const gap = timestamps[i] - timestamps[i - 1];
72
+ if (gap < IDLE_THRESHOLD_MS) {
73
+ activeMs += gap;
74
+ }
75
+ }
76
+ return { duration_ms: Math.max(activeMs, 0), wall_clock_ms: Math.max(wall_clock_ms, 0), start_time, end_time };
77
+ }
78
+ // --- Turns ---
79
+ function countTurns(entries) {
80
+ // Gemini only logs user messages. Each user message implies an exchange.
81
+ // But consecutive user messages without a model type between them
82
+ // are likely the same turn (follow-ups). Count each user message as a turn.
83
+ return entries.filter((e) => e.type === "user").length;
84
+ }
85
+ // --- Files touched ---
86
+ function extractFilesTouched(entries) {
87
+ const files = new Set();
88
+ for (const entry of entries) {
89
+ for (const f of extractFileRefsFromText(entry.message)) {
90
+ files.add(f);
91
+ }
92
+ }
93
+ return [...files].sort();
94
+ }
95
+ // --- Analyze a single session ---
96
+ function analyzeSession(entries) {
97
+ const { duration_ms, wall_clock_ms, start_time, end_time } = computeDuration(entries);
98
+ const filesTouched = extractFilesTouched(entries);
99
+ return {
100
+ source: "gemini",
101
+ turns: countTurns(entries),
102
+ tool_calls: [],
103
+ files_touched: filesTouched,
104
+ duration_ms,
105
+ wall_clock_ms,
106
+ loc_stats: { loc_added: 0, loc_removed: 0, loc_net: 0, files_changed: [] },
107
+ raw_entries: toRawEntries(entries),
108
+ start_time,
109
+ end_time,
110
+ };
111
+ }
112
+ // --- SessionParser interface ---
113
+ async function detect(path) {
114
+ if (!path.endsWith(".json"))
115
+ return false;
116
+ try {
117
+ const raw = await readFile(path, "utf-8");
118
+ const parsed = JSON.parse(raw);
119
+ if (!Array.isArray(parsed) || parsed.length === 0)
120
+ return false;
121
+ const first = parsed[0];
122
+ return typeof first.sessionId === "string" && typeof first.messageId === "number" && typeof first.timestamp === "string";
123
+ }
124
+ catch {
125
+ return false;
126
+ }
127
+ }
128
+ async function parse(path) {
129
+ const raw = await readFile(path, "utf-8");
130
+ const allEntries = parseGeminiLog(raw);
131
+ if (allEntries.length === 0) {
132
+ return analyzeSession([]);
133
+ }
134
+ // If the path contains a session ID query param, filter to that session
135
+ // Otherwise, analyze all entries as one combined session
136
+ const groups = groupBySession(allEntries);
137
+ // For a single session request (gemini://{hash}?session={id}), filter
138
+ if (path.startsWith("gemini://")) {
139
+ const url = new URL(path);
140
+ const sessionId = url.searchParams.get("session");
141
+ if (sessionId && groups.has(sessionId)) {
142
+ return analyzeSession(groups.get(sessionId));
143
+ }
144
+ }
145
+ // Default: merge all entries in the file (sorted by timestamp)
146
+ const sorted = allEntries.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
147
+ return analyzeSession(sorted);
148
+ }
149
+ export const geminiParser = {
150
+ name: "gemini",
151
+ detect,
152
+ parse,
153
+ };
154
+ // --- Discovery ---
155
+ export function hashProjectDir(dir) {
156
+ return createHash("sha256").update(dir).digest("hex");
157
+ }
158
+ export async function discoverGeminiSessions() {
159
+ const base = GEMINI_BASE();
160
+ const results = [];
161
+ let dirs;
162
+ try {
163
+ dirs = await readdir(base, { withFileTypes: true });
164
+ }
165
+ catch {
166
+ return results;
167
+ }
168
+ for (const entry of dirs) {
169
+ if (!entry.isDirectory())
170
+ continue;
171
+ const logsPath = join(base, entry.name, "logs.json");
172
+ let raw;
173
+ try {
174
+ raw = await readFile(logsPath, "utf-8");
175
+ }
176
+ catch {
177
+ continue;
178
+ }
179
+ const entries = parseGeminiLog(raw);
180
+ const groups = groupBySession(entries);
181
+ for (const [sessionId] of groups) {
182
+ results.push({
183
+ path: logsPath,
184
+ sessionId,
185
+ projectHash: entry.name,
186
+ projectDir: undefined, // resolved below if possible
187
+ });
188
+ }
189
+ }
190
+ return results;
191
+ }
192
+ /**
193
+ * Try to resolve a project hash to a directory by hashing candidate paths.
194
+ * Pass known project directories (e.g., from Claude or Cursor) and this
195
+ * will match them against Gemini's hashes.
196
+ */
197
+ export function resolveProjectDirs(sessions, knownDirs) {
198
+ const hashToDir = new Map();
199
+ for (const dir of knownDirs) {
200
+ hashToDir.set(hashProjectDir(dir), dir);
201
+ }
202
+ return sessions.map((s) => ({
203
+ ...s,
204
+ projectDir: hashToDir.get(s.projectHash) ?? s.projectDir,
205
+ }));
206
+ }
207
+ // Re-exports for testing
208
+ export { parseGeminiLog, groupBySession, analyzeSession, extractFileRefsFromText };
209
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/parsers/gemini.ts"],"names":[],"mappings":"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"}
@@ -14,15 +14,36 @@ export interface SessionMeta {
14
14
  agentRole?: string;
15
15
  children?: SessionMeta[];
16
16
  }
17
- /** Scan for all Claude Code session files under a base path.
17
+ /**
18
+ * Convert an absolute directory path to Claude Code's encoded format.
19
+ * "/Users/ben/Dev/heyi-am" → "-Users-ben-Dev-heyi-am"
18
20
  *
19
- * Claude Code stores sessions as:
20
- * ~/.claude/projects/{encoded-path}/{uuid}.jsonl ← main sessions
21
- * ~/.claude/projects/{encoded-path}/{uuid}/subagents/{id}.jsonl ← subagent sessions
22
- *
23
- * Children are linked to parents by matching the directory name ({uuid}/)
24
- * to the parent's session file ({uuid}.jsonl). By default, only parent
25
- * sessions are returned at the top level; children are nested in the
26
- * parent's `children` array.
21
+ * This encoding is lossy: `-` in directory names is indistinguishable from
22
+ * the `-` used as a separator (e.g. `/a/b-c` and `/a/b/c` both encode to
23
+ * `-a-b-c`). We accept this trade-off because Claude Code uses the same
24
+ * encoding for its own project directories (~/.claude/projects/-Users-...),
25
+ * and we must match it so sessions from different tools (Claude, Cursor,
26
+ * Codex, Gemini) group under the same project key. In practice, users are
27
+ * unlikely to have two project directories whose paths differ only by `-`
28
+ * vs `/`.
29
+ */
30
+ export declare function encodeDirPath(absolutePath: string): string;
31
+ /**
32
+ * Scan all supported tools for sessions and merge by project directory.
33
+ * Claude Code, Cursor, Codex, and Gemini sessions for the same directory
34
+ * are grouped under the same projectDir key.
27
35
  */
28
36
  export declare function listSessions(basePath?: string): Promise<SessionMeta[]>;
37
+ /**
38
+ * Merge sessions from subdirectory projects into their parent when file
39
+ * evidence confirms they're part of the same codebase.
40
+ *
41
+ * Example: sessions from /Dev/heyi.am/cli (encoded: -Dev-heyi-am-cli)
42
+ * that touch files like /Dev/heyi.am/lib/foo.ex prove they belong to the
43
+ * parent project /Dev/heyi.am (encoded: -Dev-heyi-am).
44
+ *
45
+ * We sample 1-2 sessions from the candidate child, parse them, and check
46
+ * whether files_touched reference paths outside the subdirectory. This
47
+ * avoids false merges (e.g., /Dev should NOT absorb /Dev/heyi.am).
48
+ */
49
+ export declare function mergeSubdirectoryProjects(sessions: SessionMeta[], realPaths: Map<string, string>, parseFn?: (path: string) => Promise<SessionAnalysis>): Promise<SessionMeta[]>;
@@ -1,8 +1,12 @@
1
1
  import { readdir, readFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { homedir } from "node:os";
4
+ import { execFile } from "node:child_process";
4
5
  import { claudeParser, mapAgentRole } from "./claude.js";
5
- const parsers = [claudeParser];
6
+ import { cursorParser, discoverCursorWorkspaces, listConversations } from "./cursor.js";
7
+ import { codexParser, discoverCodexSessions } from "./codex.js";
8
+ import { geminiParser, discoverGeminiSessions } from "./gemini.js";
9
+ const parsers = [claudeParser, cursorParser, codexParser, geminiParser];
6
10
  /** Detect which parser handles a given file and parse it */
7
11
  export async function parseSession(path) {
8
12
  for (const parser of parsers) {
@@ -12,18 +16,270 @@ export async function parseSession(path) {
12
16
  }
13
17
  throw new Error(`No parser detected for: ${path}`);
14
18
  }
15
- /** Scan for all Claude Code session files under a base path.
19
+ /**
20
+ * Convert an absolute directory path to Claude Code's encoded format.
21
+ * "/Users/ben/Dev/heyi-am" → "-Users-ben-Dev-heyi-am"
16
22
  *
17
- * Claude Code stores sessions as:
18
- * ~/.claude/projects/{encoded-path}/{uuid}.jsonl ← main sessions
19
- * ~/.claude/projects/{encoded-path}/{uuid}/subagents/{id}.jsonl ← subagent sessions
20
- *
21
- * Children are linked to parents by matching the directory name ({uuid}/)
22
- * to the parent's session file ({uuid}.jsonl). By default, only parent
23
- * sessions are returned at the top level; children are nested in the
24
- * parent's `children` array.
23
+ * This encoding is lossy: `-` in directory names is indistinguishable from
24
+ * the `-` used as a separator (e.g. `/a/b-c` and `/a/b/c` both encode to
25
+ * `-a-b-c`). We accept this trade-off because Claude Code uses the same
26
+ * encoding for its own project directories (~/.claude/projects/-Users-...),
27
+ * and we must match it so sessions from different tools (Claude, Cursor,
28
+ * Codex, Gemini) group under the same project key. In practice, users are
29
+ * unlikely to have two project directories whose paths differ only by `-`
30
+ * vs `/`.
31
+ */
32
+ export function encodeDirPath(absolutePath) {
33
+ return absolutePath.replace(/[/.]/g, "-");
34
+ }
35
+ /**
36
+ * Scan all supported tools for sessions and merge by project directory.
37
+ * Claude Code, Cursor, Codex, and Gemini sessions for the same directory
38
+ * are grouped under the same projectDir key.
25
39
  */
26
40
  export async function listSessions(basePath) {
41
+ const allSessions = [];
42
+ // 1. Claude Code sessions
43
+ const claudeSessions = await listClaudeSessions(basePath);
44
+ allSessions.push(...claudeSessions);
45
+ // When basePath is provided (tests, custom scan), only scan Claude sessions
46
+ if (basePath)
47
+ return allSessions;
48
+ // 2. Cursor sessions
49
+ const cursorSessions = await listCursorSessions();
50
+ allSessions.push(...cursorSessions);
51
+ // 3. Codex sessions
52
+ try {
53
+ const codexFiles = await discoverCodexSessions();
54
+ for (const cf of codexFiles) {
55
+ allSessions.push({
56
+ path: cf.path,
57
+ source: "codex",
58
+ sessionId: cf.sessionId,
59
+ projectDir: encodeDirPath(cf.cwd),
60
+ isSubagent: false,
61
+ });
62
+ }
63
+ }
64
+ catch { /* codex discovery failed */ }
65
+ // 4. Gemini sessions
66
+ try {
67
+ const geminiFiles = await discoverGeminiSessions();
68
+ for (const gf of geminiFiles) {
69
+ const dir = gf.projectDir ?? gf.projectHash;
70
+ allSessions.push({
71
+ path: gf.path,
72
+ source: "gemini",
73
+ sessionId: gf.sessionId,
74
+ projectDir: encodeDirPath(dir),
75
+ isSubagent: false,
76
+ });
77
+ }
78
+ }
79
+ catch { /* gemini discovery failed */ }
80
+ // Build map of encoded projectDir → real absolute path for git checks.
81
+ // Cursor workspaces and Codex/Gemini sessions have real paths;
82
+ // Claude dirs can't be reliably decoded (lossy encoding).
83
+ const realPaths = new Map();
84
+ try {
85
+ for (const ws of await discoverCursorWorkspaces()) {
86
+ realPaths.set(encodeDirPath(ws.projectDir), ws.projectDir);
87
+ }
88
+ }
89
+ catch { }
90
+ try {
91
+ for (const cf of await discoverCodexSessions()) {
92
+ realPaths.set(encodeDirPath(cf.cwd), cf.cwd);
93
+ }
94
+ }
95
+ catch { }
96
+ return mergeSubdirectoryProjects(allSessions, realPaths);
97
+ }
98
+ /** Get the git remote URL for a directory, or null if not a git repo. */
99
+ function getGitRemote(dirPath) {
100
+ return new Promise(resolve => {
101
+ execFile("git", ["-C", dirPath, "remote", "get-url", "origin"], { timeout: 3000 }, (err, stdout) => {
102
+ if (err)
103
+ return resolve(null);
104
+ const url = stdout.trim();
105
+ resolve(url || null);
106
+ });
107
+ });
108
+ }
109
+ /**
110
+ * Merge sessions from subdirectory projects into their parent when file
111
+ * evidence confirms they're part of the same codebase.
112
+ *
113
+ * Example: sessions from /Dev/heyi.am/cli (encoded: -Dev-heyi-am-cli)
114
+ * that touch files like /Dev/heyi.am/lib/foo.ex prove they belong to the
115
+ * parent project /Dev/heyi.am (encoded: -Dev-heyi-am).
116
+ *
117
+ * We sample 1-2 sessions from the candidate child, parse them, and check
118
+ * whether files_touched reference paths outside the subdirectory. This
119
+ * avoids false merges (e.g., /Dev should NOT absorb /Dev/heyi.am).
120
+ */
121
+ export async function mergeSubdirectoryProjects(sessions, realPaths, parseFn = parseSession) {
122
+ // Group by projectDir
123
+ const byDir = new Map();
124
+ for (const s of sessions) {
125
+ const list = byDir.get(s.projectDir) ?? [];
126
+ list.push(s);
127
+ byDir.set(s.projectDir, list);
128
+ }
129
+ const dirs = [...byDir.keys()].sort((a, b) => a.length - b.length);
130
+ const mergeMap = new Map(); // child → parent
131
+ for (let i = 0; i < dirs.length; i++) {
132
+ const candidate = dirs[i];
133
+ if (mergeMap.has(candidate))
134
+ continue; // already merged
135
+ // Find potential parents (shorter dirs that are a prefix)
136
+ const parents = [];
137
+ for (let j = 0; j < i; j++) {
138
+ const potential = mergeMap.get(dirs[j]) ?? dirs[j]; // follow chain
139
+ if (candidate.startsWith(potential + "-") && candidate !== potential) {
140
+ parents.push(potential);
141
+ }
142
+ }
143
+ if (parents.length === 0)
144
+ continue;
145
+ // Pick the longest parent (closest ancestor)
146
+ const parent = parents.sort((a, b) => b.length - a.length)[0];
147
+ // Signal 1: git remote match — if both dirs resolve to the same repo
148
+ const parentReal = realPaths.get(parent);
149
+ const childReal = realPaths.get(candidate);
150
+ if (parentReal && childReal) {
151
+ const [parentRemote, childRemote] = await Promise.all([
152
+ getGitRemote(parentReal),
153
+ getGitRemote(childReal),
154
+ ]);
155
+ if (parentRemote && childRemote && parentRemote === childRemote) {
156
+ mergeMap.set(candidate, parent);
157
+ continue;
158
+ }
159
+ }
160
+ // Signal 2: file-change sampling — parse 1-2 sessions and check
161
+ // if files_touched reference paths at the parent level
162
+ const childSessions = byDir.get(candidate) ?? [];
163
+ const samples = childSessions
164
+ .filter(s => !s.isSubagent)
165
+ .slice(0, 2);
166
+ if (samples.length === 0)
167
+ continue;
168
+ let shouldMerge = false;
169
+ for (const sample of samples) {
170
+ try {
171
+ const parsed = await parseFn(sample.path);
172
+ // If we got a cwd from parsing, try git remote as a fallback
173
+ if (!shouldMerge && parsed.cwd && parentReal) {
174
+ const [pRemote, cRemote] = await Promise.all([
175
+ getGitRemote(parentReal),
176
+ getGitRemote(parsed.cwd),
177
+ ]);
178
+ if (pRemote && cRemote && pRemote === cRemote) {
179
+ shouldMerge = true;
180
+ break;
181
+ }
182
+ }
183
+ const filePaths = parsed.files_touched.length > 0
184
+ ? parsed.files_touched
185
+ : parsed.tool_calls
186
+ .map(tc => tc.input.file_path)
187
+ .filter((p) => typeof p === "string");
188
+ // Check if any file lives at the parent project level but outside
189
+ // the child's own subtree. Walk up each file's ancestors; if we hit
190
+ // the child's own projectDir first, this file is just inside its own
191
+ // project — skip it. Only count it as evidence if we reach the
192
+ // parent before (or without) hitting the child.
193
+ for (const fp of filePaths) {
194
+ const parts = fp.split("/").filter(Boolean);
195
+ let hitChild = false;
196
+ for (let k = parts.length - 1; k >= 2; k--) {
197
+ const ancestor = "/" + parts.slice(0, k).join("/");
198
+ const encoded = encodeDirPath(ancestor);
199
+ if (encoded === candidate) {
200
+ hitChild = true;
201
+ break; // file is inside child's own tree — not evidence
202
+ }
203
+ if (encoded === parent) {
204
+ shouldMerge = true;
205
+ break;
206
+ }
207
+ }
208
+ if (shouldMerge)
209
+ break;
210
+ }
211
+ if (shouldMerge)
212
+ break;
213
+ }
214
+ catch {
215
+ // Parsing failed — skip this sample
216
+ }
217
+ }
218
+ if (shouldMerge) {
219
+ mergeMap.set(candidate, parent);
220
+ }
221
+ }
222
+ // Apply merges
223
+ if (mergeMap.size === 0)
224
+ return sessions;
225
+ return sessions.map(s => {
226
+ const newDir = mergeMap.get(s.projectDir);
227
+ if (newDir) {
228
+ return { ...s, projectDir: newDir };
229
+ }
230
+ return s;
231
+ });
232
+ }
233
+ /** Discover Cursor sessions and convert to SessionMeta[] */
234
+ async function listCursorSessions() {
235
+ const sessions = [];
236
+ let workspaces;
237
+ try {
238
+ workspaces = await discoverCursorWorkspaces();
239
+ }
240
+ catch {
241
+ return sessions;
242
+ }
243
+ // Cursor migrated conversation storage to the global cursorDiskKV table
244
+ // around August 2025 (composer.planMigrationToHomeDirCompleted). Sessions
245
+ // before this have metadata (title, date) but no recoverable content.
246
+ const CURSOR_DATA_CUTOFF = new Date("2025-09-01").getTime();
247
+ for (const ws of workspaces) {
248
+ const conversations = listConversations(ws);
249
+ for (const conv of conversations) {
250
+ // Skip conversations without a name — Cursor only generates names for
251
+ // conversations with real interaction. Unnamed ones are empty stubs.
252
+ if (!conv.name)
253
+ continue;
254
+ // Skip sessions before September 2025 — bubble data not available
255
+ if (conv.createdAt < CURSOR_DATA_CUTOFF)
256
+ continue;
257
+ // Encode metadata into the cursor:// URL so the parser can use it
258
+ const params = new URLSearchParams();
259
+ if (conv.name)
260
+ params.set("name", conv.name);
261
+ if (conv.createdAt)
262
+ params.set("createdAt", String(conv.createdAt));
263
+ if (conv.lastUpdatedAt)
264
+ params.set("lastUpdatedAt", String(conv.lastUpdatedAt));
265
+ if (conv.totalLinesAdded)
266
+ params.set("linesAdded", String(conv.totalLinesAdded));
267
+ if (conv.totalLinesRemoved)
268
+ params.set("linesRemoved", String(conv.totalLinesRemoved));
269
+ const qs = params.toString();
270
+ sessions.push({
271
+ path: `cursor://${conv.composerId}${qs ? '?' + qs : ''}`,
272
+ source: "cursor",
273
+ sessionId: conv.composerId,
274
+ projectDir: encodeDirPath(ws.projectDir),
275
+ isSubagent: false,
276
+ });
277
+ }
278
+ }
279
+ return sessions;
280
+ }
281
+ /** Original Claude Code session scanning, extracted from old listSessions */
282
+ async function listClaudeSessions(basePath) {
27
283
  const base = basePath ?? join(homedir(), ".claude", "projects");
28
284
  const parents = [];
29
285
  const childrenByParentId = new Map();
@@ -48,13 +304,11 @@ export async function listSessions(basePath) {
48
304
  }
49
305
  for (const file of files) {
50
306
  if (file.name.endsWith(".jsonl") && !file.isDirectory()) {
51
- // Main session file
52
307
  const fullPath = join(projectPath, file.name);
53
308
  const sessionId = file.name.replace(/\.jsonl$/, "");
54
309
  await tryAddSession(fullPath, sessionId, projectDir, false, parents);
55
310
  }
56
311
  else if (file.isDirectory()) {
57
- // Directory name is the parent session UUID
58
312
  const parentSessionId = file.name;
59
313
  const children = await collectSubagents(join(projectPath, file.name), projectDir, parentSessionId);
60
314
  if (children.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  export type SessionSource = "claude" | "cursor" | "codex" | "gemini" | "antigravity";
2
+ /** Display names for source tools */
3
+ export declare const SOURCE_DISPLAY_NAMES: Record<SessionSource, string>;
2
4
  export interface ToolCall {
3
5
  id: string;
4
6
  name: string;
@@ -1,2 +1,9 @@
1
- export {};
1
+ /** Display names for source tools */
2
+ export const SOURCE_DISPLAY_NAMES = {
3
+ claude: "Claude Code",
4
+ cursor: "Cursor",
5
+ codex: "Codex",
6
+ gemini: "Gemini CLI",
7
+ antigravity: "Antigravity",
8
+ };
2
9
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/parsers/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/parsers/types.ts"],"names":[],"mappings":"AAEA,qCAAqC;AACrC,MAAM,CAAC,MAAM,oBAAoB,GAAkC;IACjE,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,YAAY;IACpB,WAAW,EAAE,aAAa;CAC3B,CAAC"}