@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.
Files changed (40) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +28 -0
  3. package/dist/commands/__tests__/sessions.test.js +67 -0
  4. package/dist/commands/__tests__/sessions.test.js.map +1 -1
  5. package/dist/commands/sessions.d.ts.map +1 -1
  6. package/dist/commands/sessions.js +64 -8
  7. package/dist/commands/sessions.js.map +1 -1
  8. package/dist/commands/versions.d.ts.map +1 -1
  9. package/dist/commands/versions.js +26 -8
  10. package/dist/commands/versions.js.map +1 -1
  11. package/dist/commands/view.d.ts.map +1 -1
  12. package/dist/commands/view.js +16 -43
  13. package/dist/commands/view.js.map +1 -1
  14. package/dist/lib/__tests__/exec.test.js +16 -0
  15. package/dist/lib/__tests__/exec.test.js.map +1 -1
  16. package/dist/lib/__tests__/usage.test.d.ts +2 -0
  17. package/dist/lib/__tests__/usage.test.d.ts.map +1 -0
  18. package/dist/lib/__tests__/usage.test.js +145 -0
  19. package/dist/lib/__tests__/usage.test.js.map +1 -0
  20. package/dist/lib/exec.d.ts.map +1 -1
  21. package/dist/lib/exec.js +11 -0
  22. package/dist/lib/exec.js.map +1 -1
  23. package/dist/lib/session/discover.d.ts +10 -0
  24. package/dist/lib/session/discover.d.ts.map +1 -1
  25. package/dist/lib/session/discover.js +226 -9
  26. package/dist/lib/session/discover.js.map +1 -1
  27. package/dist/lib/session/prompt.d.ts.map +1 -1
  28. package/dist/lib/session/prompt.js +1 -0
  29. package/dist/lib/session/prompt.js.map +1 -1
  30. package/dist/lib/session/types.d.ts +6 -0
  31. package/dist/lib/session/types.d.ts.map +1 -1
  32. package/dist/lib/shims.d.ts +5 -0
  33. package/dist/lib/shims.d.ts.map +1 -1
  34. package/dist/lib/shims.js +20 -1
  35. package/dist/lib/shims.js.map +1 -1
  36. package/dist/lib/usage.d.ts +25 -0
  37. package/dist/lib/usage.d.ts.map +1 -1
  38. package/dist/lib/usage.js +88 -23
  39. package/dist/lib/usage.js.map +1 -1
  40. 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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/lib/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAsB7C,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAExD,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,mBAAmB,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;IAE9C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAiB;IAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAoB;IAC/C,OAAO;QACL,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,OAAO,CAAC,GAAG;KACf,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,aAAa,GAAgD;IACxE,MAAM,EAAE;QACN,IAAI,EAAE,2BAA2B;QACjC,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE,iBAAiB;KAC5B;IACD,KAAK,EAAE;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,mBAAmB;KAC9B;IACD,MAAM,EAAE;QACN,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,wBAAwB;QACjC,QAAQ,EAAE,sBAAsB;KACjC;IACD,MAAM,EAAE;QACN,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,YAAY;KACvB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,+BAA+B;QACrC,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,yBAAyB;KACpC;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,2BAA2B;QACjC,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE,iBAAiB;KAC5B;IACD,OAAO,EAAE;QACP,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,mBAAmB;KAC9B;IACD,GAAG,EAAE;QACH,IAAI,EAAE,2BAA2B;QACjC,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE,iBAAiB;KAC5B;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,2BAA2B;QACjC,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE,iBAAiB;KAC5B;IACD,KAAK,EAAE;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,mBAAmB;KAC9B;IACD,GAAG,EAAE;QACH,IAAI,EAAE,2BAA2B;QACjC,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE,iBAAiB;KAC5B;CACF,CAAC;AAiBF,MAAM,CAAC,MAAM,cAAc,GAA0C;IACnE,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE;YACT,IAAI,EAAE,CAAC,mBAAmB,EAAE,MAAM,CAAC;YACnC,IAAI,EAAE,CAAC,mBAAmB,EAAE,aAAa,CAAC;YAC1C,IAAI,EAAE,CAAC,gCAAgC,CAAC;SACzC;QACD,SAAS,EAAE,CAAC,iBAAiB,EAAE,aAAa,EAAE,WAAW,CAAC;QAC1D,SAAS,EAAE,SAAS;QACpB,UAAU,EAAE,CAAC,SAAS,CAAC;QACvB,WAAW,EAAE,WAAW;KACzB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE;YACT,IAAI,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC;YACtC,IAAI,EAAE,CAAC,WAAW,EAAE,iBAAiB,EAAE,aAAa,CAAC;YACrD,IAAI,EAAE,CAAC,aAAa,CAAC;SACtB;QACD,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,SAAS,EAAE,SAAS;KACrB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE;YACT,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,CAAC,QAAQ,CAAC;YAChB,IAAI,EAAE,CAAC,QAAQ,CAAC;SACjB;QACD,SAAS,EAAE,CAAC,iBAAiB,EAAE,aAAa,CAAC;QAC7C,SAAS,EAAE,SAAS;KACrB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,cAAc,CAAC;QACtB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE;YACT,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,CAAC,IAAI,CAAC;SACb;QACD,SAAS,EAAE,CAAC,iBAAiB,EAAE,aAAa,CAAC;QAC7C,SAAS,EAAE,SAAS;KACrB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC;QACzB,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE;YACT,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;YACzB,IAAI,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;YAC1B,IAAI,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;SAC3B;QACD,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;QAC/B,SAAS,EAAE,SAAS;KACrB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,UAAU,CAAC;QAClB,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE;YACT,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;YACxB,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;YACxB,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;SACzB;QACD,SAAS,EAAE,CAAC,iBAAiB,EAAE,aAAa,CAAC;QAC7C,SAAS,EAAE,SAAS;KACrB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE;YACT,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE;SACT;QACD,SAAS,EAAE,SAAS;KACrB;IACD,GAAG,EAAE;QACH,IAAI,EAAE,CAAC,KAAK,CAAC;QACb,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE;YACT,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;YACxB,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;YACxB,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;SACzB;QACD,SAAS,EAAE,SAAS;KACrB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC,UAAU,CAAC;QAClB,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE;YACT,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE;SACT;QACD,SAAS,EAAE,SAAS;KACrB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;QACtB,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE;YACT,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE;SACT;KACF;IACD,GAAG,EAAE;QACH,IAAI,EAAE,CAAC,KAAK,CAAC;QACb,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE;YACT,IAAI,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;YAC7B,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;YACxB,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;SACzB;QACD,SAAS,EAAE,SAAS;KACrB;CACF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACnD,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAa,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEzC,gFAAgF;IAChF,IAAI,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,iBAAiB;IACjB,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IAEvB,2BAA2B;IAC3B,IAAI,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED,+BAA+B;IAC/B,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,qDAAqD;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5E,IAAI,KAAK,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,qCAAqC;IACrC,IAAI,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,yCAAyC;IACzC,IAAI,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC5C,0DAA0D;QAC1D,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,aAAa;IACb,IAAI,QAAQ,CAAC,UAAU,KAAK,YAAY,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,4BAA4B;IAC5B,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAoB;IAClD,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IAElC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9E,4EAA4E;IAC5E,yEAAyE;IACzE,sEAAsE;IACtE,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IAEpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;YACpC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YACjC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;YACzD,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC;YAC1B,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QAEH,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,KAAgD,CAAC;QACrD,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;YAChD,CAAC,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,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;AAS9D,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;CAChB;AAuBD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA4DxF;AAQD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAW1F;AA+CD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAqC3E;AAyuBD,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"}
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' && !topic)
839
- topic = extractSessionTopic(text);
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