@swarmify/agents-cli 1.7.1 → 1.8.1

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,376 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ import * as crypto from 'crypto';
5
+ import * as readline from 'readline';
6
+ import { SESSION_AGENTS } from './types.js';
7
+ const HOME = os.homedir();
8
+ /**
9
+ * Discover sessions across all installed agents.
10
+ * Returns SessionMeta[] sorted by timestamp descending (most recent first).
11
+ */
12
+ export async function discoverSessions(options) {
13
+ const agents = options?.agent ? [options.agent] : SESSION_AGENTS;
14
+ const limit = options?.limit ?? 50;
15
+ const results = await Promise.all(agents.map(agent => {
16
+ switch (agent) {
17
+ case 'claude': return discoverClaudeSessions();
18
+ case 'codex': return discoverCodexSessions();
19
+ case 'gemini': return discoverGeminiSessions();
20
+ }
21
+ }));
22
+ let sessions = results.flat();
23
+ // Filter by project (case-insensitive substring match)
24
+ if (options?.project) {
25
+ const query = options.project.toLowerCase();
26
+ sessions = sessions.filter(s => s.project?.toLowerCase().includes(query));
27
+ }
28
+ // Sort by timestamp descending
29
+ sessions.sort((a, b) => {
30
+ const ta = new Date(a.timestamp).getTime() || 0;
31
+ const tb = new Date(b.timestamp).getTime() || 0;
32
+ return tb - ta;
33
+ });
34
+ return sessions.slice(0, limit);
35
+ }
36
+ /**
37
+ * Resolve a session by full or short ID from the full index.
38
+ */
39
+ export function resolveSessionById(sessions, idQuery) {
40
+ const query = idQuery.toLowerCase();
41
+ // Exact match first
42
+ const exact = sessions.filter(s => s.id.toLowerCase() === query);
43
+ if (exact.length > 0)
44
+ return exact;
45
+ // Prefix match
46
+ return sessions.filter(s => s.id.toLowerCase().startsWith(query));
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // Claude
50
+ // ---------------------------------------------------------------------------
51
+ async function discoverClaudeSessions() {
52
+ const projectsDir = path.join(HOME, '.claude', 'projects');
53
+ if (!fs.existsSync(projectsDir))
54
+ return [];
55
+ const sessions = [];
56
+ let projectDirs;
57
+ try {
58
+ projectDirs = fs.readdirSync(projectsDir);
59
+ }
60
+ catch {
61
+ return [];
62
+ }
63
+ for (const dirName of projectDirs) {
64
+ const dirPath = path.join(projectsDir, dirName);
65
+ const stat = safeStatSync(dirPath);
66
+ if (!stat?.isDirectory())
67
+ continue;
68
+ let files;
69
+ try {
70
+ files = fs.readdirSync(dirPath).filter(f => f.endsWith('.jsonl'));
71
+ }
72
+ catch {
73
+ continue;
74
+ }
75
+ for (const file of files) {
76
+ const filePath = path.join(dirPath, file);
77
+ const sessionId = file.replace('.jsonl', '');
78
+ try {
79
+ const meta = await readClaudeMeta(filePath, sessionId);
80
+ if (meta) {
81
+ sessions.push(meta);
82
+ }
83
+ }
84
+ catch {
85
+ // Skip unreadable files
86
+ }
87
+ }
88
+ }
89
+ return sessions;
90
+ }
91
+ async function readClaudeMeta(filePath, sessionId) {
92
+ const lines = await readFirstLines(filePath, 5);
93
+ for (const line of lines) {
94
+ let parsed;
95
+ try {
96
+ parsed = JSON.parse(line);
97
+ }
98
+ catch {
99
+ continue;
100
+ }
101
+ // Look for first user or assistant line with timestamp/cwd
102
+ if ((parsed.type === 'user' || parsed.type === 'assistant') && parsed.timestamp) {
103
+ const cwd = parsed.cwd || '';
104
+ return {
105
+ id: sessionId,
106
+ shortId: sessionId.slice(0, 8),
107
+ agent: 'claude',
108
+ timestamp: parsed.timestamp,
109
+ project: cwd ? path.basename(cwd) : undefined,
110
+ cwd,
111
+ filePath,
112
+ gitBranch: parsed.gitBranch || undefined,
113
+ };
114
+ }
115
+ }
116
+ // Fallback: use file mtime
117
+ const stat = safeStatSync(filePath);
118
+ return {
119
+ id: sessionId,
120
+ shortId: sessionId.slice(0, 8),
121
+ agent: 'claude',
122
+ timestamp: stat ? stat.mtime.toISOString() : new Date().toISOString(),
123
+ filePath,
124
+ };
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // Codex
128
+ // ---------------------------------------------------------------------------
129
+ async function discoverCodexSessions() {
130
+ const sessionsDir = path.join(HOME, '.codex', 'sessions');
131
+ if (!fs.existsSync(sessionsDir))
132
+ return [];
133
+ const sessions = [];
134
+ const jsonlFiles = walkForFiles(sessionsDir, '.jsonl', 200);
135
+ for (const filePath of jsonlFiles) {
136
+ try {
137
+ const meta = await readCodexMeta(filePath);
138
+ if (meta)
139
+ sessions.push(meta);
140
+ }
141
+ catch {
142
+ // Skip unreadable files
143
+ }
144
+ }
145
+ return sessions;
146
+ }
147
+ async function readCodexMeta(filePath) {
148
+ const lines = await readFirstLines(filePath, 1);
149
+ if (lines.length === 0)
150
+ return null;
151
+ let parsed;
152
+ try {
153
+ parsed = JSON.parse(lines[0]);
154
+ }
155
+ catch {
156
+ return null;
157
+ }
158
+ if (parsed.type !== 'session_meta')
159
+ return null;
160
+ const payload = parsed.payload || {};
161
+ const sessionId = payload.id || '';
162
+ if (!sessionId)
163
+ return null;
164
+ const cwd = payload.cwd || '';
165
+ return {
166
+ id: sessionId,
167
+ shortId: sessionId.slice(0, 8),
168
+ agent: 'codex',
169
+ timestamp: payload.timestamp || parsed.timestamp || new Date().toISOString(),
170
+ project: cwd ? path.basename(cwd) : undefined,
171
+ cwd,
172
+ filePath,
173
+ gitBranch: payload.git?.branch || undefined,
174
+ };
175
+ }
176
+ // ---------------------------------------------------------------------------
177
+ // Gemini
178
+ // ---------------------------------------------------------------------------
179
+ async function discoverGeminiSessions() {
180
+ const tmpDir = path.join(HOME, '.gemini', 'tmp');
181
+ if (!fs.existsSync(tmpDir))
182
+ return [];
183
+ // Build project hash -> name map
184
+ const projectMap = buildGeminiProjectMap();
185
+ const sessions = [];
186
+ let hashDirs;
187
+ try {
188
+ hashDirs = fs.readdirSync(tmpDir);
189
+ }
190
+ catch {
191
+ return [];
192
+ }
193
+ for (const hashDir of hashDirs) {
194
+ const chatsDir = path.join(tmpDir, hashDir, 'chats');
195
+ if (!fs.existsSync(chatsDir))
196
+ continue;
197
+ let chatFiles;
198
+ try {
199
+ chatFiles = fs.readdirSync(chatsDir).filter(f => f.endsWith('.json'));
200
+ }
201
+ catch {
202
+ continue;
203
+ }
204
+ for (const file of chatFiles) {
205
+ const filePath = path.join(chatsDir, file);
206
+ try {
207
+ const meta = readGeminiMeta(filePath, hashDir, projectMap);
208
+ if (meta)
209
+ sessions.push(meta);
210
+ }
211
+ catch {
212
+ // Skip unreadable files
213
+ }
214
+ }
215
+ }
216
+ return sessions;
217
+ }
218
+ function readGeminiMeta(filePath, hashDir, projectMap) {
219
+ // Read the first ~2KB to get top-level fields without parsing entire messages array
220
+ const fd = fs.openSync(filePath, 'r');
221
+ const buf = Buffer.alloc(2048);
222
+ const bytesRead = fs.readSync(fd, buf, 0, 2048, 0);
223
+ fs.closeSync(fd);
224
+ const header = buf.toString('utf-8', 0, bytesRead);
225
+ // Extract fields via regex (avoids parsing potentially huge messages array)
226
+ const sessionId = extractJsonField(header, 'sessionId');
227
+ const startTime = extractJsonField(header, 'startTime');
228
+ const projectHash = extractJsonField(header, 'projectHash');
229
+ if (!sessionId)
230
+ return null;
231
+ // Resolve project name from hash
232
+ const projectInfo = projectMap.get(projectHash || hashDir);
233
+ const project = projectInfo?.name || hashDir.slice(0, 12);
234
+ const cwd = projectInfo?.path;
235
+ // Count messages roughly by counting occurrences of "type":" in the full file size
236
+ const stat = safeStatSync(filePath);
237
+ return {
238
+ id: sessionId,
239
+ shortId: sessionId.slice(0, 8),
240
+ agent: 'gemini',
241
+ timestamp: startTime || (stat ? stat.mtime.toISOString() : new Date().toISOString()),
242
+ project,
243
+ cwd,
244
+ filePath,
245
+ };
246
+ }
247
+ function buildGeminiProjectMap() {
248
+ const map = new Map();
249
+ const projectsJsonPath = path.join(HOME, '.gemini', 'projects.json');
250
+ if (!fs.existsSync(projectsJsonPath))
251
+ return map;
252
+ try {
253
+ const data = JSON.parse(fs.readFileSync(projectsJsonPath, 'utf-8'));
254
+ const projects = data.projects;
255
+ if (typeof projects === 'object' && projects !== null) {
256
+ if (Array.isArray(projects)) {
257
+ // Array format: ["path1", "path2"]
258
+ for (const p of projects) {
259
+ if (typeof p === 'string') {
260
+ const hash = sha256(p);
261
+ map.set(hash, { name: path.basename(p), path: p });
262
+ // Also try the raw directory name
263
+ map.set(p, { name: path.basename(p), path: p });
264
+ }
265
+ }
266
+ }
267
+ else {
268
+ // Object format: {path: name}
269
+ for (const [p, name] of Object.entries(projects)) {
270
+ const hash = sha256(p);
271
+ map.set(hash, { name: String(name), path: p });
272
+ }
273
+ }
274
+ }
275
+ }
276
+ catch {
277
+ // Ignore parse errors
278
+ }
279
+ // Also check ~/.gemini/history/*/.project_root for additional mappings
280
+ const historyDir = path.join(HOME, '.gemini', 'history');
281
+ if (fs.existsSync(historyDir)) {
282
+ try {
283
+ for (const name of fs.readdirSync(historyDir)) {
284
+ const rootFile = path.join(historyDir, name, '.project_root');
285
+ if (fs.existsSync(rootFile)) {
286
+ try {
287
+ const projectPath = fs.readFileSync(rootFile, 'utf-8').trim();
288
+ if (projectPath) {
289
+ const hash = sha256(projectPath);
290
+ map.set(hash, { name, path: projectPath });
291
+ }
292
+ }
293
+ catch {
294
+ // Skip
295
+ }
296
+ }
297
+ }
298
+ }
299
+ catch {
300
+ // Skip
301
+ }
302
+ }
303
+ return map;
304
+ }
305
+ // ---------------------------------------------------------------------------
306
+ // Utilities
307
+ // ---------------------------------------------------------------------------
308
+ function readFirstLines(filePath, maxLines) {
309
+ return new Promise((resolve) => {
310
+ const lines = [];
311
+ const stream = fs.createReadStream(filePath, { encoding: 'utf-8' });
312
+ const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
313
+ rl.on('line', (line) => {
314
+ if (line.trim()) {
315
+ lines.push(line);
316
+ }
317
+ if (lines.length >= maxLines) {
318
+ rl.close();
319
+ stream.destroy();
320
+ }
321
+ });
322
+ rl.on('close', () => resolve(lines));
323
+ rl.on('error', () => resolve(lines));
324
+ });
325
+ }
326
+ /**
327
+ * Walk a directory recursively for files with a given extension.
328
+ * Returns at most `limit` files, sorted by mtime descending.
329
+ */
330
+ function walkForFiles(dir, ext, limit) {
331
+ const results = [];
332
+ function walk(d, depth) {
333
+ if (depth > 5)
334
+ return; // Prevent deep recursion
335
+ let entries;
336
+ try {
337
+ entries = fs.readdirSync(d);
338
+ }
339
+ catch {
340
+ return;
341
+ }
342
+ for (const entry of entries) {
343
+ const full = path.join(d, entry);
344
+ const stat = safeStatSync(full);
345
+ if (!stat)
346
+ continue;
347
+ if (stat.isDirectory()) {
348
+ walk(full, depth + 1);
349
+ }
350
+ else if (entry.endsWith(ext)) {
351
+ results.push({ path: full, mtime: stat.mtimeMs });
352
+ }
353
+ }
354
+ }
355
+ walk(dir, 0);
356
+ // Sort by mtime descending and limit
357
+ results.sort((a, b) => b.mtime - a.mtime);
358
+ return results.slice(0, limit).map(r => r.path);
359
+ }
360
+ function extractJsonField(text, field) {
361
+ const re = new RegExp(`"${field}"\\s*:\\s*"([^"]*)"`, 'i');
362
+ const match = text.match(re);
363
+ return match ? match[1] : '';
364
+ }
365
+ function sha256(input) {
366
+ return crypto.createHash('sha256').update(input).digest('hex');
367
+ }
368
+ function safeStatSync(p) {
369
+ try {
370
+ return fs.statSync(p);
371
+ }
372
+ catch {
373
+ return null;
374
+ }
375
+ }
376
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/lib/session/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { SessionAgentId, SessionEvent } from './types.js';
2
+ /**
3
+ * Auto-detect agent type from file path and parse the session.
4
+ */
5
+ export declare function parseSession(filePath: string, agent?: SessionAgentId): SessionEvent[];
6
+ export declare function detectAgent(filePath: string): SessionAgentId | null;
7
+ /**
8
+ * Summarize a tool_use into a one-liner string.
9
+ */
10
+ export declare function summarizeToolUse(tool: string, args?: Record<string, any>): string;
11
+ export declare function parseClaude(filePath: string): SessionEvent[];
12
+ export declare function parseCodex(filePath: string): SessionEvent[];
13
+ export declare function parseGemini(filePath: string): SessionEvent[];
14
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/lib/session/parse.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,YAAY,EAAE,CAWrF;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAQnE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CA4CjF;AAgBD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CA+I5D;AAMD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CA2H3D;AAMD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CA2G5D"}