@swarmify/agents-cli 1.11.0 → 1.11.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.
- package/CHANGELOG.md +13 -0
- package/README.md +28 -0
- package/dist/commands/__tests__/sessions.test.js +67 -0
- package/dist/commands/__tests__/sessions.test.js.map +1 -1
- package/dist/commands/sessions.d.ts.map +1 -1
- package/dist/commands/sessions.js +64 -8
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/versions.d.ts.map +1 -1
- package/dist/commands/versions.js +26 -8
- package/dist/commands/versions.js.map +1 -1
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +16 -43
- package/dist/commands/view.js.map +1 -1
- package/dist/lib/__tests__/exec.test.js +16 -0
- package/dist/lib/__tests__/exec.test.js.map +1 -1
- package/dist/lib/__tests__/usage.test.d.ts +2 -0
- package/dist/lib/__tests__/usage.test.d.ts.map +1 -0
- package/dist/lib/__tests__/usage.test.js +145 -0
- package/dist/lib/__tests__/usage.test.js.map +1 -0
- package/dist/lib/exec.d.ts.map +1 -1
- package/dist/lib/exec.js +11 -0
- package/dist/lib/exec.js.map +1 -1
- package/dist/lib/session/discover.d.ts +10 -0
- package/dist/lib/session/discover.d.ts.map +1 -1
- package/dist/lib/session/discover.js +226 -9
- package/dist/lib/session/discover.js.map +1 -1
- package/dist/lib/session/prompt.d.ts.map +1 -1
- package/dist/lib/session/prompt.js +1 -0
- package/dist/lib/session/prompt.js.map +1 -1
- package/dist/lib/session/types.d.ts +6 -0
- package/dist/lib/session/types.d.ts.map +1 -1
- package/dist/lib/shims.d.ts +5 -0
- package/dist/lib/shims.d.ts.map +1 -1
- package/dist/lib/shims.js +20 -1
- package/dist/lib/shims.js.map +1 -1
- package/dist/lib/usage.d.ts +25 -0
- package/dist/lib/usage.d.ts.map +1 -1
- package/dist/lib/usage.js +88 -23
- package/dist/lib/usage.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/exec.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
+
import * as path from 'path';
|
|
2
3
|
import { parseTimeout } from './routines.js';
|
|
4
|
+
import { getVersionHomePath, isVersionInstalled, resolveVersion } from './versions.js';
|
|
3
5
|
const EXEC_ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
4
6
|
function parseExecEnvEntry(entry) {
|
|
5
7
|
const separatorIndex = entry.indexOf('=');
|
|
@@ -20,8 +22,17 @@ export function parseExecEnv(entries) {
|
|
|
20
22
|
return Object.fromEntries(entries.map(parseExecEnvEntry));
|
|
21
23
|
}
|
|
22
24
|
export function buildExecEnv(options) {
|
|
25
|
+
const managedEnv = {};
|
|
26
|
+
if (options.agent === 'claude') {
|
|
27
|
+
const cwd = options.cwd || process.cwd();
|
|
28
|
+
const version = options.version || resolveVersion('claude', cwd);
|
|
29
|
+
if (version && isVersionInstalled('claude', version)) {
|
|
30
|
+
managedEnv.CLAUDE_CONFIG_DIR = path.join(getVersionHomePath('claude', version), '.claude');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
23
33
|
return {
|
|
24
34
|
...process.env,
|
|
35
|
+
...managedEnv,
|
|
25
36
|
...options.env,
|
|
26
37
|
};
|
|
27
38
|
}
|
package/dist/lib/exec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/lib/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/lib/exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,10 @@ export interface DiscoverOptions {
|
|
|
5
5
|
all?: boolean;
|
|
6
6
|
cwd?: string;
|
|
7
7
|
limit?: number;
|
|
8
|
+
/** Filter sessions newer than this (ISO timestamp or "7d", "30d", "90d") */
|
|
9
|
+
since?: string;
|
|
10
|
+
/** Filter sessions older than this (ISO timestamp) */
|
|
11
|
+
until?: string;
|
|
8
12
|
}
|
|
9
13
|
/**
|
|
10
14
|
* Discover sessions across all installed agents, versions, and backups.
|
|
@@ -32,4 +36,10 @@ export declare function readFirstLines(filePath: string, maxLines: number): Prom
|
|
|
32
36
|
* Returns at most `limit` files, sorted by mtime descending.
|
|
33
37
|
*/
|
|
34
38
|
export declare function walkForFiles(dir: string, ext: string, limit: number): string[];
|
|
39
|
+
export declare function parseTimeFilter(input: string): number;
|
|
40
|
+
/**
|
|
41
|
+
* Score sessions by matching against terms from the content index.
|
|
42
|
+
* Returns sessions with matched terms attached for highlighting.
|
|
43
|
+
*/
|
|
44
|
+
export declare function searchContentIndex(sessions: SessionMeta[], query: string): Map<string, SessionMeta>;
|
|
35
45
|
//# sourceMappingURL=discover.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/lib/session/discover.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/lib/session/discover.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAa9D,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6BD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA0ExF;AAQD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAW1F;AAmHD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAqC3E;AAywBD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBpF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B9E;AAsLD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUrD;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,MAAM,GACZ,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAmC1B"}
|
|
@@ -4,12 +4,16 @@ import * as os from 'os';
|
|
|
4
4
|
import * as crypto from 'crypto';
|
|
5
5
|
import * as readline from 'readline';
|
|
6
6
|
import { execSync } from 'child_process';
|
|
7
|
+
import { getCliVersion } from '../agents.js';
|
|
8
|
+
import { getConfigSymlinkVersion } from '../shims.js';
|
|
7
9
|
import { SESSION_AGENTS } from './types.js';
|
|
8
10
|
import { extractSessionTopic } from './prompt.js';
|
|
9
11
|
const HOME = os.homedir();
|
|
10
12
|
const AGENTS_DIR = path.join(HOME, '.agents');
|
|
11
13
|
const SESSIONS_DIR = path.join(AGENTS_DIR, 'sessions');
|
|
12
14
|
const INDEX_PATH = path.join(SESSIONS_DIR, 'index.jsonl');
|
|
15
|
+
const CONTENT_INDEX_PATH = path.join(SESSIONS_DIR, 'content_index.jsonl');
|
|
16
|
+
const cachedAgentVersions = new Map();
|
|
13
17
|
/**
|
|
14
18
|
* Discover sessions across all installed agents, versions, and backups.
|
|
15
19
|
* Merges with a persistent index so sessions survive version removal.
|
|
@@ -44,12 +48,24 @@ export async function discoverSessions(options) {
|
|
|
44
48
|
toSave.set(s.id, s);
|
|
45
49
|
}
|
|
46
50
|
saveIndex([...toSave.values()]);
|
|
51
|
+
// Build content index for all discovered sessions
|
|
52
|
+
const contentIndex = await buildContentIndex(sessions);
|
|
53
|
+
saveContentIndex(contentIndex);
|
|
47
54
|
const projectQuery = options?.project?.trim();
|
|
48
55
|
// Filter by project (case-insensitive substring match)
|
|
49
56
|
if (projectQuery) {
|
|
50
57
|
const query = projectQuery.toLowerCase();
|
|
51
58
|
sessions = sessions.filter(s => s.project?.toLowerCase().includes(query));
|
|
52
59
|
}
|
|
60
|
+
// Apply time range filters
|
|
61
|
+
if (options?.since || options?.until) {
|
|
62
|
+
const sinceMs = options.since ? parseTimeFilter(options.since) : 0;
|
|
63
|
+
const untilMs = options.until ? new Date(options.until).getTime() : Infinity;
|
|
64
|
+
sessions = sessions.filter(s => {
|
|
65
|
+
const ts = new Date(s.timestamp).getTime();
|
|
66
|
+
return ts >= sinceMs && ts <= untilMs;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
53
69
|
// An explicit project search should scan across directories instead of
|
|
54
70
|
// intersecting with the default cwd-only scope.
|
|
55
71
|
if (!options?.all && !projectQuery) {
|
|
@@ -126,6 +142,81 @@ function saveIndex(sessions) {
|
|
|
126
142
|
}
|
|
127
143
|
}
|
|
128
144
|
// ---------------------------------------------------------------------------
|
|
145
|
+
// Content index (inverted term -> session terms)
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
async function buildContentIndex(sessions) {
|
|
148
|
+
const index = new Map();
|
|
149
|
+
for (const session of sessions) {
|
|
150
|
+
const terms = extractSessionTerms(session);
|
|
151
|
+
for (const term of terms) {
|
|
152
|
+
if (!index.has(term))
|
|
153
|
+
index.set(term, new Set());
|
|
154
|
+
index.get(term).add(session.id);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return index;
|
|
158
|
+
}
|
|
159
|
+
function extractSessionTerms(session) {
|
|
160
|
+
const textParts = [];
|
|
161
|
+
if (session.topic)
|
|
162
|
+
textParts.push(session.topic);
|
|
163
|
+
if (session.project)
|
|
164
|
+
textParts.push(session.project);
|
|
165
|
+
if (session.cwd)
|
|
166
|
+
textParts.push(session.cwd);
|
|
167
|
+
if (session.gitBranch)
|
|
168
|
+
textParts.push(session.gitBranch);
|
|
169
|
+
if (session.account)
|
|
170
|
+
textParts.push(session.account);
|
|
171
|
+
if (session._userTerms)
|
|
172
|
+
textParts.push(session._userTerms.join('\n'));
|
|
173
|
+
return tokenizeText(textParts.join('\n'));
|
|
174
|
+
}
|
|
175
|
+
function tokenizeText(text) {
|
|
176
|
+
const seen = new Set();
|
|
177
|
+
const terms = [];
|
|
178
|
+
const tokens = text.toLowerCase().split(/[^a-z0-9]+/);
|
|
179
|
+
for (const token of tokens) {
|
|
180
|
+
if (token.length < 2 || seen.has(token))
|
|
181
|
+
continue;
|
|
182
|
+
seen.add(token);
|
|
183
|
+
terms.push(token);
|
|
184
|
+
}
|
|
185
|
+
return terms;
|
|
186
|
+
}
|
|
187
|
+
function saveContentIndex(index) {
|
|
188
|
+
try {
|
|
189
|
+
fs.mkdirSync(SESSIONS_DIR, { recursive: true });
|
|
190
|
+
const lines = [];
|
|
191
|
+
for (const [term, sessionIds] of index) {
|
|
192
|
+
lines.push(JSON.stringify({ term, sessions: [...sessionIds] }));
|
|
193
|
+
}
|
|
194
|
+
fs.writeFileSync(CONTENT_INDEX_PATH, lines.join('\n') + '\n', 'utf-8');
|
|
195
|
+
}
|
|
196
|
+
catch { /* index save failure is non-fatal */ }
|
|
197
|
+
}
|
|
198
|
+
function loadContentIndex() {
|
|
199
|
+
const index = new Map();
|
|
200
|
+
if (!fs.existsSync(CONTENT_INDEX_PATH))
|
|
201
|
+
return index;
|
|
202
|
+
try {
|
|
203
|
+
const content = fs.readFileSync(CONTENT_INDEX_PATH, 'utf-8');
|
|
204
|
+
for (const line of content.split('\n')) {
|
|
205
|
+
if (!line.trim())
|
|
206
|
+
continue;
|
|
207
|
+
try {
|
|
208
|
+
const entry = JSON.parse(line);
|
|
209
|
+
if (entry.term && entry.sessions) {
|
|
210
|
+
index.set(entry.term, new Set(entry.sessions));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch { /* malformed index entry, skip */ }
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch { /* index load failure is non-fatal */ }
|
|
217
|
+
return index;
|
|
218
|
+
}
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
129
220
|
// Multi-version directory scanning
|
|
130
221
|
// ---------------------------------------------------------------------------
|
|
131
222
|
/**
|
|
@@ -279,6 +370,7 @@ async function readClaudeMeta(filePath, sessionId, account) {
|
|
|
279
370
|
topic: scan.topic,
|
|
280
371
|
messageCount: scan.messageCount,
|
|
281
372
|
tokenCount: scan.tokenCount,
|
|
373
|
+
_userTerms: scan.userTerms?.flatMap(splitLines),
|
|
282
374
|
};
|
|
283
375
|
}
|
|
284
376
|
// Fallback: use file mtime
|
|
@@ -293,6 +385,7 @@ async function readClaudeMeta(filePath, sessionId, account) {
|
|
|
293
385
|
messageCount: scan.messageCount,
|
|
294
386
|
tokenCount: scan.tokenCount,
|
|
295
387
|
topic: scan.topic,
|
|
388
|
+
_userTerms: scan.userTerms?.flatMap(splitLines),
|
|
296
389
|
};
|
|
297
390
|
}
|
|
298
391
|
// ---------------------------------------------------------------------------
|
|
@@ -345,12 +438,13 @@ async function discoverCodexSessions() {
|
|
|
345
438
|
const sessions = [];
|
|
346
439
|
const seen = new Set();
|
|
347
440
|
const account = getCodexAccount();
|
|
441
|
+
const currentVersion = await getCurrentAgentVersion('codex');
|
|
348
442
|
let skipped = 0;
|
|
349
443
|
for (const sessionsDir of getAgentSessionDirs('codex', 'sessions')) {
|
|
350
444
|
const jsonlFiles = walkForFiles(sessionsDir, '.jsonl', 200);
|
|
351
445
|
for (const filePath of jsonlFiles) {
|
|
352
446
|
try {
|
|
353
|
-
const meta = await readCodexMeta(filePath, account);
|
|
447
|
+
const meta = await readCodexMeta(filePath, account, currentVersion);
|
|
354
448
|
if (meta && !seen.has(meta.id)) {
|
|
355
449
|
seen.add(meta.id);
|
|
356
450
|
sessions.push(meta);
|
|
@@ -366,7 +460,7 @@ async function discoverCodexSessions() {
|
|
|
366
460
|
}
|
|
367
461
|
return sessions;
|
|
368
462
|
}
|
|
369
|
-
async function readCodexMeta(filePath, account) {
|
|
463
|
+
async function readCodexMeta(filePath, account, currentVersion) {
|
|
370
464
|
const scan = await scanCodexSession(filePath);
|
|
371
465
|
const sessionId = scan.sessionId || '';
|
|
372
466
|
if (!sessionId)
|
|
@@ -381,11 +475,12 @@ async function readCodexMeta(filePath, account) {
|
|
|
381
475
|
cwd,
|
|
382
476
|
filePath,
|
|
383
477
|
gitBranch: scan.gitBranch,
|
|
384
|
-
version: scan.version,
|
|
478
|
+
version: resolveSessionVersion('codex', filePath, scan.version, currentVersion),
|
|
385
479
|
topic: scan.topic,
|
|
386
480
|
messageCount: scan.messageCount,
|
|
387
481
|
tokenCount: scan.tokenCount,
|
|
388
482
|
account,
|
|
483
|
+
_userTerms: scan.userTerms?.flatMap(splitLines),
|
|
389
484
|
};
|
|
390
485
|
}
|
|
391
486
|
// ---------------------------------------------------------------------------
|
|
@@ -395,6 +490,7 @@ async function discoverGeminiSessions() {
|
|
|
395
490
|
const projectMap = buildGeminiProjectMap();
|
|
396
491
|
const sessions = [];
|
|
397
492
|
const seen = new Set();
|
|
493
|
+
const currentVersion = await getCurrentAgentVersion('gemini');
|
|
398
494
|
let skipped = 0;
|
|
399
495
|
for (const tmpDir of getAgentSessionDirs('gemini', 'tmp')) {
|
|
400
496
|
let hashDirs;
|
|
@@ -418,7 +514,7 @@ async function discoverGeminiSessions() {
|
|
|
418
514
|
for (const file of chatFiles) {
|
|
419
515
|
const filePath = path.join(chatsDir, file);
|
|
420
516
|
try {
|
|
421
|
-
const meta = readGeminiMeta(filePath, hashDir, projectMap);
|
|
517
|
+
const meta = readGeminiMeta(filePath, hashDir, projectMap, currentVersion);
|
|
422
518
|
if (meta && !seen.has(meta.id)) {
|
|
423
519
|
seen.add(meta.id);
|
|
424
520
|
sessions.push(meta);
|
|
@@ -435,7 +531,7 @@ async function discoverGeminiSessions() {
|
|
|
435
531
|
}
|
|
436
532
|
return sessions;
|
|
437
533
|
}
|
|
438
|
-
function readGeminiMeta(filePath, hashDir, projectMap) {
|
|
534
|
+
function readGeminiMeta(filePath, hashDir, projectMap, currentVersion) {
|
|
439
535
|
let session;
|
|
440
536
|
try {
|
|
441
537
|
session = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
@@ -446,6 +542,11 @@ function readGeminiMeta(filePath, hashDir, projectMap) {
|
|
|
446
542
|
const sessionId = typeof session.sessionId === 'string' ? session.sessionId : '';
|
|
447
543
|
const startTime = typeof session.startTime === 'string' ? session.startTime : '';
|
|
448
544
|
const projectHash = typeof session.projectHash === 'string' ? session.projectHash : '';
|
|
545
|
+
const embeddedVersion = typeof session.version === 'string'
|
|
546
|
+
? session.version
|
|
547
|
+
: typeof session.cliVersion === 'string'
|
|
548
|
+
? session.cliVersion
|
|
549
|
+
: undefined;
|
|
449
550
|
if (!sessionId)
|
|
450
551
|
return null;
|
|
451
552
|
// Resolve project name from hash
|
|
@@ -458,11 +559,13 @@ function readGeminiMeta(filePath, hashDir, projectMap) {
|
|
|
458
559
|
let messageCount = 0;
|
|
459
560
|
let tokenCount = 0;
|
|
460
561
|
let sawTokenCount = false;
|
|
562
|
+
const userTerms = [];
|
|
461
563
|
for (const message of messages) {
|
|
462
564
|
if (message.type === 'user') {
|
|
463
565
|
const text = extractGeminiMessageText(message.content);
|
|
464
566
|
if (text) {
|
|
465
567
|
messageCount++;
|
|
568
|
+
userTerms.push(text);
|
|
466
569
|
if (!topic)
|
|
467
570
|
topic = extractSessionTopic(text);
|
|
468
571
|
}
|
|
@@ -486,9 +589,11 @@ function readGeminiMeta(filePath, hashDir, projectMap) {
|
|
|
486
589
|
project,
|
|
487
590
|
cwd,
|
|
488
591
|
filePath,
|
|
592
|
+
version: resolveSessionVersion('gemini', filePath, embeddedVersion, currentVersion),
|
|
489
593
|
topic,
|
|
490
594
|
messageCount,
|
|
491
595
|
tokenCount: sawTokenCount ? tokenCount : undefined,
|
|
596
|
+
_userTerms: userTerms.length > 0 ? userTerms : undefined,
|
|
492
597
|
};
|
|
493
598
|
}
|
|
494
599
|
function buildGeminiProjectMap() {
|
|
@@ -569,6 +674,7 @@ async function discoverOpenCodeSessions() {
|
|
|
569
674
|
if (!fs.existsSync(OPENCODE_DB))
|
|
570
675
|
return [];
|
|
571
676
|
const account = getOpenCodeAccount();
|
|
677
|
+
const currentVersion = await getCurrentAgentVersion('opencode');
|
|
572
678
|
try {
|
|
573
679
|
// Query sessions. time_created is millisecond epoch. Limit to 200 most recent.
|
|
574
680
|
// Use session.title as topic (OpenCode auto-generates good titles).
|
|
@@ -624,7 +730,7 @@ async function discoverOpenCodeSessions() {
|
|
|
624
730
|
project: directory ? path.basename(directory) : undefined,
|
|
625
731
|
cwd: directory || undefined,
|
|
626
732
|
filePath: `${OPENCODE_DB}#${id}`,
|
|
627
|
-
version: version || undefined,
|
|
733
|
+
version: resolveSessionVersion('opencode', OPENCODE_DB, version || undefined, currentVersion),
|
|
628
734
|
account,
|
|
629
735
|
topic,
|
|
630
736
|
messageCount: Number.isNaN(messageCount) ? undefined : messageCount,
|
|
@@ -652,6 +758,7 @@ async function discoverOpenClawSessions() {
|
|
|
652
758
|
catch {
|
|
653
759
|
return sessions;
|
|
654
760
|
}
|
|
761
|
+
const currentVersion = await getCurrentAgentVersion('openclaw');
|
|
655
762
|
// Discover active channels
|
|
656
763
|
// Format: "- Telegram default (Jeff): enabled, configured, running, out:2h ago, mode:polling, token:config"
|
|
657
764
|
try {
|
|
@@ -674,6 +781,7 @@ async function discoverOpenClawSessions() {
|
|
|
674
781
|
agent: 'openclaw',
|
|
675
782
|
timestamp: new Date().toISOString(),
|
|
676
783
|
project: name,
|
|
784
|
+
version: currentVersion,
|
|
677
785
|
filePath: '',
|
|
678
786
|
});
|
|
679
787
|
}
|
|
@@ -716,6 +824,7 @@ async function discoverOpenClawSessions() {
|
|
|
716
824
|
timestamp: new Date().toISOString(),
|
|
717
825
|
project: `${jobName} (${agentId || 'unknown'})`,
|
|
718
826
|
cwd: status,
|
|
827
|
+
version: currentVersion,
|
|
719
828
|
filePath: '',
|
|
720
829
|
});
|
|
721
830
|
}
|
|
@@ -737,6 +846,7 @@ async function scanClaudeSession(filePath) {
|
|
|
737
846
|
let tokenCount = 0;
|
|
738
847
|
let sawTokenCount = false;
|
|
739
848
|
const seenAssistantIds = new Set();
|
|
849
|
+
const userTexts = [];
|
|
740
850
|
try {
|
|
741
851
|
for await (const line of rl) {
|
|
742
852
|
if (!line.trim())
|
|
@@ -758,6 +868,7 @@ async function scanClaudeSession(filePath) {
|
|
|
758
868
|
const text = extractClaudeUserText(parsed);
|
|
759
869
|
if (text) {
|
|
760
870
|
messageCount++;
|
|
871
|
+
userTexts.push(text);
|
|
761
872
|
if (!topic)
|
|
762
873
|
topic = extractSessionTopic(text);
|
|
763
874
|
}
|
|
@@ -794,6 +905,7 @@ async function scanClaudeSession(filePath) {
|
|
|
794
905
|
topic,
|
|
795
906
|
messageCount,
|
|
796
907
|
tokenCount: sawTokenCount ? tokenCount : undefined,
|
|
908
|
+
userTerms: userTexts.length > 0 ? userTexts : undefined,
|
|
797
909
|
};
|
|
798
910
|
}
|
|
799
911
|
async function scanCodexSession(filePath) {
|
|
@@ -807,6 +919,7 @@ async function scanCodexSession(filePath) {
|
|
|
807
919
|
let topic;
|
|
808
920
|
let messageCount = 0;
|
|
809
921
|
let tokenCount;
|
|
922
|
+
const userTexts = [];
|
|
810
923
|
try {
|
|
811
924
|
for await (const line of rl) {
|
|
812
925
|
if (!line.trim())
|
|
@@ -824,7 +937,7 @@ async function scanCodexSession(filePath) {
|
|
|
824
937
|
timestamp = payload.timestamp || parsed.timestamp || timestamp;
|
|
825
938
|
cwd = payload.cwd || cwd;
|
|
826
939
|
gitBranch = payload.git?.branch || gitBranch;
|
|
827
|
-
version = payload.version || version;
|
|
940
|
+
version = payload.cli_version || payload.version || version;
|
|
828
941
|
continue;
|
|
829
942
|
}
|
|
830
943
|
if (parsed.type === 'response_item' && parsed.payload?.type === 'message') {
|
|
@@ -835,8 +948,11 @@ async function scanCodexSession(filePath) {
|
|
|
835
948
|
if (!text)
|
|
836
949
|
continue;
|
|
837
950
|
messageCount++;
|
|
838
|
-
if (role === 'user'
|
|
839
|
-
|
|
951
|
+
if (role === 'user') {
|
|
952
|
+
userTexts.push(text);
|
|
953
|
+
if (!topic)
|
|
954
|
+
topic = extractSessionTopic(text);
|
|
955
|
+
}
|
|
840
956
|
continue;
|
|
841
957
|
}
|
|
842
958
|
if (parsed.type === 'event_msg' && parsed.payload?.type === 'token_count') {
|
|
@@ -859,6 +975,7 @@ async function scanCodexSession(filePath) {
|
|
|
859
975
|
topic,
|
|
860
976
|
messageCount,
|
|
861
977
|
tokenCount,
|
|
978
|
+
userTerms: userTexts.length > 0 ? userTexts : undefined,
|
|
862
979
|
};
|
|
863
980
|
}
|
|
864
981
|
// ---------------------------------------------------------------------------
|
|
@@ -956,6 +1073,9 @@ function extractClaudeUserText(parsed) {
|
|
|
956
1073
|
function isLocalCommandMessage(text) {
|
|
957
1074
|
return /<local-command-caveat>|<bash-(input|stdout|stderr)>/i.test(text);
|
|
958
1075
|
}
|
|
1076
|
+
function splitLines(text) {
|
|
1077
|
+
return text.split('\n').map(l => l.trim()).filter(Boolean);
|
|
1078
|
+
}
|
|
959
1079
|
function getClaudeUsageTotal(usage) {
|
|
960
1080
|
if (!usage || typeof usage !== 'object')
|
|
961
1081
|
return null;
|
|
@@ -984,6 +1104,46 @@ function extractCodexMessageText(contentBlocks, role) {
|
|
|
984
1104
|
});
|
|
985
1105
|
return text || undefined;
|
|
986
1106
|
}
|
|
1107
|
+
function normalizeVersion(version) {
|
|
1108
|
+
const trimmed = version?.trim();
|
|
1109
|
+
return trimmed ? trimmed : undefined;
|
|
1110
|
+
}
|
|
1111
|
+
function extractVersionFromManagedPath(agent, sourcePath) {
|
|
1112
|
+
if (!sourcePath)
|
|
1113
|
+
return undefined;
|
|
1114
|
+
const candidates = [sourcePath, safeRealpathSync(sourcePath) || ''];
|
|
1115
|
+
const marker = `/.agents/versions/${agent}/`;
|
|
1116
|
+
for (const candidate of candidates) {
|
|
1117
|
+
if (!candidate)
|
|
1118
|
+
continue;
|
|
1119
|
+
const normalized = candidate.split(path.sep).join('/');
|
|
1120
|
+
const start = normalized.indexOf(marker);
|
|
1121
|
+
if (start === -1)
|
|
1122
|
+
continue;
|
|
1123
|
+
const version = normalized.slice(start + marker.length).split('/')[0];
|
|
1124
|
+
if (version)
|
|
1125
|
+
return version;
|
|
1126
|
+
}
|
|
1127
|
+
return undefined;
|
|
1128
|
+
}
|
|
1129
|
+
async function getCurrentAgentVersion(agent) {
|
|
1130
|
+
const cached = cachedAgentVersions.get(agent);
|
|
1131
|
+
if (cached)
|
|
1132
|
+
return cached;
|
|
1133
|
+
const promise = (async () => {
|
|
1134
|
+
const symlinkVersion = normalizeVersion(getConfigSymlinkVersion(agent));
|
|
1135
|
+
if (symlinkVersion)
|
|
1136
|
+
return symlinkVersion;
|
|
1137
|
+
return normalizeVersion(await getCliVersion(agent));
|
|
1138
|
+
})();
|
|
1139
|
+
cachedAgentVersions.set(agent, promise);
|
|
1140
|
+
return promise;
|
|
1141
|
+
}
|
|
1142
|
+
function resolveSessionVersion(agent, sourcePath, embeddedVersion, currentVersion) {
|
|
1143
|
+
return normalizeVersion(embeddedVersion)
|
|
1144
|
+
|| extractVersionFromManagedPath(agent, sourcePath)
|
|
1145
|
+
|| normalizeVersion(currentVersion);
|
|
1146
|
+
}
|
|
987
1147
|
function getCodexTokenCount(totalTokenUsage) {
|
|
988
1148
|
if (!totalTokenUsage || typeof totalTokenUsage !== 'object')
|
|
989
1149
|
return null;
|
|
@@ -1035,4 +1195,61 @@ function sumKnownNumbers(values) {
|
|
|
1035
1195
|
}
|
|
1036
1196
|
return found ? total : null;
|
|
1037
1197
|
}
|
|
1198
|
+
// ---------------------------------------------------------------------------
|
|
1199
|
+
// Time range parsing
|
|
1200
|
+
// ---------------------------------------------------------------------------
|
|
1201
|
+
export function parseTimeFilter(input) {
|
|
1202
|
+
const relativeMatch = input.match(/^(\d+)([dw])$/i);
|
|
1203
|
+
if (relativeMatch) {
|
|
1204
|
+
const value = parseInt(relativeMatch[1], 10);
|
|
1205
|
+
const unit = relativeMatch[2].toLowerCase();
|
|
1206
|
+
if (unit === 'd')
|
|
1207
|
+
return Date.now() - value * 86_400_000;
|
|
1208
|
+
if (unit === 'w')
|
|
1209
|
+
return Date.now() - value * 7 * 86_400_000;
|
|
1210
|
+
}
|
|
1211
|
+
const ts = new Date(input).getTime();
|
|
1212
|
+
return Number.isNaN(ts) ? 0 : ts;
|
|
1213
|
+
}
|
|
1214
|
+
// ---------------------------------------------------------------------------
|
|
1215
|
+
// Content index search
|
|
1216
|
+
// ---------------------------------------------------------------------------
|
|
1217
|
+
/**
|
|
1218
|
+
* Score sessions by matching against terms from the content index.
|
|
1219
|
+
* Returns sessions with matched terms attached for highlighting.
|
|
1220
|
+
*/
|
|
1221
|
+
export function searchContentIndex(sessions, query) {
|
|
1222
|
+
const index = loadContentIndex();
|
|
1223
|
+
if (index.size === 0)
|
|
1224
|
+
return new Map();
|
|
1225
|
+
const terms = tokenizeText(query);
|
|
1226
|
+
if (terms.length === 0)
|
|
1227
|
+
return new Map();
|
|
1228
|
+
const scored = new Map();
|
|
1229
|
+
for (const term of terms) {
|
|
1230
|
+
const matchingSessions = index.get(term);
|
|
1231
|
+
if (!matchingSessions)
|
|
1232
|
+
continue;
|
|
1233
|
+
for (const sessionId of matchingSessions) {
|
|
1234
|
+
const entry = scored.get(sessionId);
|
|
1235
|
+
if (!entry) {
|
|
1236
|
+
scored.set(sessionId, { score: 1, matchedTerms: [term] });
|
|
1237
|
+
}
|
|
1238
|
+
else {
|
|
1239
|
+
entry.score += 1;
|
|
1240
|
+
if (!entry.matchedTerms.includes(term)) {
|
|
1241
|
+
entry.matchedTerms.push(term);
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
const result = new Map();
|
|
1247
|
+
for (const [sessionId, info] of scored) {
|
|
1248
|
+
const session = sessions.find(s => s.id === sessionId);
|
|
1249
|
+
if (session) {
|
|
1250
|
+
result.set(sessionId, { ...session, _matchedTerms: info.matchedTerms });
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
return result;
|
|
1254
|
+
}
|
|
1038
1255
|
//# sourceMappingURL=discover.js.map
|