@spool-lab/core 0.4.1 → 0.4.20

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 (152) hide show
  1. package/dist/db/db.d.ts +28 -1
  2. package/dist/db/db.d.ts.map +1 -1
  3. package/dist/db/db.js +320 -17
  4. package/dist/db/db.js.map +1 -1
  5. package/dist/db/queries.d.ts +36 -11
  6. package/dist/db/queries.d.ts.map +1 -1
  7. package/dist/db/queries.js +118 -83
  8. package/dist/db/queries.js.map +1 -1
  9. package/dist/db/share-drafts.d.ts +51 -0
  10. package/dist/db/share-drafts.d.ts.map +1 -0
  11. package/dist/db/share-drafts.js +47 -0
  12. package/dist/db/share-drafts.js.map +1 -0
  13. package/dist/doctor/checks/config.d.ts +3 -0
  14. package/dist/doctor/checks/config.d.ts.map +1 -0
  15. package/dist/doctor/checks/config.js +123 -0
  16. package/dist/doctor/checks/config.js.map +1 -0
  17. package/dist/doctor/checks/db.d.ts +3 -0
  18. package/dist/doctor/checks/db.d.ts.map +1 -0
  19. package/dist/doctor/checks/db.js +225 -0
  20. package/dist/doctor/checks/db.js.map +1 -0
  21. package/dist/doctor/checks/env.d.ts +3 -0
  22. package/dist/doctor/checks/env.d.ts.map +1 -0
  23. package/dist/doctor/checks/env.js +70 -0
  24. package/dist/doctor/checks/env.js.map +1 -0
  25. package/dist/doctor/checks/index.d.ts +3 -0
  26. package/dist/doctor/checks/index.d.ts.map +1 -0
  27. package/dist/doctor/checks/index.js +13 -0
  28. package/dist/doctor/checks/index.js.map +1 -0
  29. package/dist/doctor/checks/native.d.ts +3 -0
  30. package/dist/doctor/checks/native.d.ts.map +1 -0
  31. package/dist/doctor/checks/native.js +42 -0
  32. package/dist/doctor/checks/native.js.map +1 -0
  33. package/dist/doctor/checks/versions.d.ts +3 -0
  34. package/dist/doctor/checks/versions.d.ts.map +1 -0
  35. package/dist/doctor/checks/versions.js +79 -0
  36. package/dist/doctor/checks/versions.js.map +1 -0
  37. package/dist/doctor/index.d.ts +3 -0
  38. package/dist/doctor/index.d.ts.map +1 -0
  39. package/dist/doctor/index.js +3 -0
  40. package/dist/doctor/index.js.map +1 -0
  41. package/dist/doctor/preflight.d.ts +18 -0
  42. package/dist/doctor/preflight.d.ts.map +1 -0
  43. package/dist/doctor/preflight.js +27 -0
  44. package/dist/doctor/preflight.js.map +1 -0
  45. package/dist/doctor/runner.d.ts +12 -0
  46. package/dist/doctor/runner.d.ts.map +1 -0
  47. package/dist/doctor/runner.js +37 -0
  48. package/dist/doctor/runner.js.map +1 -0
  49. package/dist/doctor/types.d.ts +27 -0
  50. package/dist/doctor/types.d.ts.map +1 -0
  51. package/dist/doctor/types.js +2 -0
  52. package/dist/doctor/types.js.map +1 -0
  53. package/dist/index.d.ts +7 -1
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +7 -1
  56. package/dist/index.js.map +1 -1
  57. package/dist/migrations/agent-search-cleanup.d.ts +36 -0
  58. package/dist/migrations/agent-search-cleanup.d.ts.map +1 -0
  59. package/dist/migrations/agent-search-cleanup.js +182 -0
  60. package/dist/migrations/agent-search-cleanup.js.map +1 -0
  61. package/dist/migrations/worktree-identity-upgrade.d.ts +31 -0
  62. package/dist/migrations/worktree-identity-upgrade.d.ts.map +1 -0
  63. package/dist/migrations/worktree-identity-upgrade.js +22 -0
  64. package/dist/migrations/worktree-identity-upgrade.js.map +1 -0
  65. package/dist/parsers/claude.d.ts.map +1 -1
  66. package/dist/parsers/claude.js +25 -12
  67. package/dist/parsers/claude.js.map +1 -1
  68. package/dist/parsers/codex.d.ts.map +1 -1
  69. package/dist/parsers/codex.js +32 -5
  70. package/dist/parsers/codex.js.map +1 -1
  71. package/dist/parsers/gemini.d.ts.map +1 -1
  72. package/dist/parsers/gemini.js +5 -5
  73. package/dist/parsers/gemini.js.map +1 -1
  74. package/dist/parsers/spool-prelude.d.ts +16 -0
  75. package/dist/parsers/spool-prelude.d.ts.map +1 -0
  76. package/dist/parsers/spool-prelude.js +21 -0
  77. package/dist/parsers/spool-prelude.js.map +1 -0
  78. package/dist/projects/display-name.d.ts +2 -0
  79. package/dist/projects/display-name.d.ts.map +1 -0
  80. package/dist/projects/display-name.js +8 -0
  81. package/dist/projects/display-name.js.map +1 -0
  82. package/dist/projects/fs.d.ts +3 -0
  83. package/dist/projects/fs.d.ts.map +1 -0
  84. package/dist/projects/fs.js +20 -0
  85. package/dist/projects/fs.js.map +1 -0
  86. package/dist/projects/groups.d.ts +4 -0
  87. package/dist/projects/groups.d.ts.map +1 -0
  88. package/dist/projects/groups.js +20 -0
  89. package/dist/projects/groups.js.map +1 -0
  90. package/dist/projects/identity-synthesizers.d.ts +22 -0
  91. package/dist/projects/identity-synthesizers.d.ts.map +1 -0
  92. package/dist/projects/identity-synthesizers.js +29 -0
  93. package/dist/projects/identity-synthesizers.js.map +1 -0
  94. package/dist/projects/identity.d.ts +16 -0
  95. package/dist/projects/identity.d.ts.map +1 -0
  96. package/dist/projects/identity.js +172 -0
  97. package/dist/projects/identity.js.map +1 -0
  98. package/dist/projects/sessions.d.ts +40 -0
  99. package/dist/projects/sessions.d.ts.map +1 -0
  100. package/dist/projects/sessions.js +151 -0
  101. package/dist/projects/sessions.js.map +1 -0
  102. package/dist/projects/worktree-resolvers.d.ts +19 -0
  103. package/dist/projects/worktree-resolvers.d.ts.map +1 -0
  104. package/dist/projects/worktree-resolvers.js +65 -0
  105. package/dist/projects/worktree-resolvers.js.map +1 -0
  106. package/dist/security/index.d.ts +14 -0
  107. package/dist/security/index.d.ts.map +1 -0
  108. package/dist/security/index.js +7 -0
  109. package/dist/security/index.js.map +1 -0
  110. package/dist/security/maintenance.d.ts +15 -0
  111. package/dist/security/maintenance.d.ts.map +1 -0
  112. package/dist/security/maintenance.js +68 -0
  113. package/dist/security/maintenance.js.map +1 -0
  114. package/dist/security/profile.d.ts +47 -0
  115. package/dist/security/profile.d.ts.map +1 -0
  116. package/dist/security/profile.js +122 -0
  117. package/dist/security/profile.js.map +1 -0
  118. package/dist/security/purge.d.ts +49 -0
  119. package/dist/security/purge.d.ts.map +1 -0
  120. package/dist/security/purge.js +159 -0
  121. package/dist/security/purge.js.map +1 -0
  122. package/dist/security/repo.d.ts +141 -0
  123. package/dist/security/repo.d.ts.map +1 -0
  124. package/dist/security/repo.js +469 -0
  125. package/dist/security/repo.js.map +1 -0
  126. package/dist/security/scan.d.ts +50 -0
  127. package/dist/security/scan.d.ts.map +1 -0
  128. package/dist/security/scan.js +120 -0
  129. package/dist/security/scan.js.map +1 -0
  130. package/dist/security/types.d.ts +128 -0
  131. package/dist/security/types.d.ts.map +1 -0
  132. package/dist/security/types.js +10 -0
  133. package/dist/security/types.js.map +1 -0
  134. package/dist/security/worker.d.ts +53 -0
  135. package/dist/security/worker.d.ts.map +1 -0
  136. package/dist/security/worker.js +180 -0
  137. package/dist/security/worker.js.map +1 -0
  138. package/dist/sync/source-paths.d.ts +1 -0
  139. package/dist/sync/source-paths.d.ts.map +1 -1
  140. package/dist/sync/source-paths.js +13 -3
  141. package/dist/sync/source-paths.js.map +1 -1
  142. package/dist/sync/syncer.d.ts +8 -1
  143. package/dist/sync/syncer.d.ts.map +1 -1
  144. package/dist/sync/syncer.js +37 -17
  145. package/dist/sync/syncer.js.map +1 -1
  146. package/dist/types.d.ts +28 -6
  147. package/dist/types.d.ts.map +1 -1
  148. package/dist/util/resolve-bin.d.ts +34 -0
  149. package/dist/util/resolve-bin.d.ts.map +1 -1
  150. package/dist/util/resolve-bin.js +175 -20
  151. package/dist/util/resolve-bin.js.map +1 -1
  152. package/package.json +5 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/doctor/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export { runChecks, listChecks } from './runner.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/doctor/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,18 @@
1
+ type SqliteStatus = {
2
+ ok: true;
3
+ } | {
4
+ ok: false;
5
+ error: Error;
6
+ };
7
+ /**
8
+ * Confirms the bundled better-sqlite3 binary can actually load and open a
9
+ * database. The most common failure is a Node ABI mismatch (NODE_MODULE_VERSION)
10
+ * after upgrading Node without rebuilding native modules — that error message
11
+ * is verbose, so we capture it once here and let downstream checks short-circuit
12
+ * with a short pointer to `native.sqlite`.
13
+ */
14
+ export declare function probeSqlite(): SqliteStatus;
15
+ /** Test hook — reset the cache between runs. */
16
+ export declare function _resetProbeForTest(): void;
17
+ export {};
18
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/doctor/preflight.ts"],"names":[],"mappings":"AAEA,KAAK,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAA;AAI9D;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,YAAY,CAU1C;AAED,gDAAgD;AAChD,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
@@ -0,0 +1,27 @@
1
+ import Database from 'better-sqlite3';
2
+ let cached = null;
3
+ /**
4
+ * Confirms the bundled better-sqlite3 binary can actually load and open a
5
+ * database. The most common failure is a Node ABI mismatch (NODE_MODULE_VERSION)
6
+ * after upgrading Node without rebuilding native modules — that error message
7
+ * is verbose, so we capture it once here and let downstream checks short-circuit
8
+ * with a short pointer to `native.sqlite`.
9
+ */
10
+ export function probeSqlite() {
11
+ if (cached)
12
+ return cached;
13
+ try {
14
+ const db = new Database(':memory:');
15
+ db.close();
16
+ cached = { ok: true };
17
+ }
18
+ catch (err) {
19
+ cached = { ok: false, error: err instanceof Error ? err : new Error(String(err)) };
20
+ }
21
+ return cached;
22
+ }
23
+ /** Test hook — reset the cache between runs. */
24
+ export function _resetProbeForTest() {
25
+ cached = null;
26
+ }
27
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/doctor/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAIrC,IAAI,MAAM,GAAwB,IAAI,CAAA;AAEtC;;;;;;GAMG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAA;QACnC,EAAE,CAAC,KAAK,EAAE,CAAA;QACV,MAAM,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;IACpF,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,IAAI,CAAA;AACf,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Check, CheckResult } from './types.js';
2
+ /**
3
+ * Run every check (or a filtered subset by id). Each check is isolated:
4
+ * a thrown error is converted into an `error` result so one bad check
5
+ * cannot mask the rest of the report.
6
+ *
7
+ * Checks are run sequentially — they share filesystem state and a few
8
+ * (read-only) sqlite connections, and parallelism would buy almost nothing.
9
+ */
10
+ export declare function runChecks(filterIds?: readonly string[]): Promise<CheckResult[]>;
11
+ export declare function listChecks(): Array<Pick<Check, 'id' | 'category' | 'title'>>;
12
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/doctor/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGpD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CASrF;AAgBD,wBAAgB,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,UAAU,GAAG,OAAO,CAAC,CAAC,CAE5E"}
@@ -0,0 +1,37 @@
1
+ import { allChecks } from './checks/index.js';
2
+ /**
3
+ * Run every check (or a filtered subset by id). Each check is isolated:
4
+ * a thrown error is converted into an `error` result so one bad check
5
+ * cannot mask the rest of the report.
6
+ *
7
+ * Checks are run sequentially — they share filesystem state and a few
8
+ * (read-only) sqlite connections, and parallelism would buy almost nothing.
9
+ */
10
+ export async function runChecks(filterIds) {
11
+ const selected = filterIds && filterIds.length > 0
12
+ ? allChecks.filter(c => filterIds.includes(c.id))
13
+ : allChecks;
14
+ const results = [];
15
+ for (const check of selected) {
16
+ results.push(await runOne(check));
17
+ }
18
+ return results;
19
+ }
20
+ async function runOne(check) {
21
+ try {
22
+ return await check.run();
23
+ }
24
+ catch (err) {
25
+ return {
26
+ id: check.id,
27
+ category: check.category,
28
+ title: check.title,
29
+ severity: 'error',
30
+ message: `Check threw: ${err instanceof Error ? err.message : String(err)}`,
31
+ };
32
+ }
33
+ }
34
+ export function listChecks() {
35
+ return allChecks.map(({ id, category, title }) => ({ id, category, title }));
36
+ }
37
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/doctor/runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE7C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAA6B;IAC3D,MAAM,QAAQ,GAAG,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAChD,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,OAAO,GAAkB,EAAE,CAAA;IACjC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,KAAY;IAChC,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,CAAA;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SAC5E,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;AAC9E,CAAC"}
@@ -0,0 +1,27 @@
1
+ export type Severity = 'ok' | 'warn' | 'error';
2
+ export type Category = 'env' | 'versions' | 'db' | 'config' | 'native';
3
+ export interface FixDescriptor {
4
+ description: string;
5
+ destructive: boolean;
6
+ apply: () => Promise<FixResult> | FixResult;
7
+ }
8
+ export interface FixResult {
9
+ ok: boolean;
10
+ message: string;
11
+ }
12
+ export interface CheckResult {
13
+ id: string;
14
+ category: Category;
15
+ title: string;
16
+ severity: Severity;
17
+ message: string;
18
+ details?: Record<string, unknown>;
19
+ fix?: FixDescriptor;
20
+ }
21
+ export interface Check {
22
+ id: string;
23
+ category: Category;
24
+ title: string;
25
+ run: () => Promise<CheckResult> | CheckResult;
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,CAAA;AAE9C,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEtE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IACpB,KAAK,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;CAC5C;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,OAAO,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,QAAQ,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,GAAG,CAAC,EAAE,aAAa,CAAA;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAA;CAC9C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,16 @@
1
1
  export * from './types.js';
2
2
  export * from './db/db.js';
3
3
  export * from './db/queries.js';
4
+ export * from './db/share-drafts.js';
4
5
  export * from './parsers/claude.js';
5
6
  export * from './parsers/codex.js';
6
7
  export * from './parsers/gemini.js';
8
+ export * from './parsers/spool-prelude.js';
7
9
  export * from './sync/syncer.js';
8
10
  export * from './sync/watcher.js';
9
- export { resolveSystemBinary, cachedResolve, clearResolveCache } from './util/resolve-bin.js';
11
+ export * from './projects/groups.js';
12
+ export * from './projects/sessions.js';
13
+ export { resolveSystemBinary, resolveSystemBinaryAsync, cachedResolve, cachedResolveAsync, clearResolveCache, hydrateResolveCache, getResolveCacheSnapshot, } from './util/resolve-bin.js';
14
+ export * from './doctor/index.js';
15
+ export * from './security/index.js';
10
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,uBAAuB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA"}
package/dist/index.js CHANGED
@@ -1,10 +1,16 @@
1
1
  export * from './types.js';
2
2
  export * from './db/db.js';
3
3
  export * from './db/queries.js';
4
+ export * from './db/share-drafts.js';
4
5
  export * from './parsers/claude.js';
5
6
  export * from './parsers/codex.js';
6
7
  export * from './parsers/gemini.js';
8
+ export * from './parsers/spool-prelude.js';
7
9
  export * from './sync/syncer.js';
8
10
  export * from './sync/watcher.js';
9
- export { resolveSystemBinary, cachedResolve, clearResolveCache } from './util/resolve-bin.js';
11
+ export * from './projects/groups.js';
12
+ export * from './projects/sessions.js';
13
+ export { resolveSystemBinary, resolveSystemBinaryAsync, cachedResolve, cachedResolveAsync, clearResolveCache, hydrateResolveCache, getResolveCacheSnapshot, } from './util/resolve-bin.js';
14
+ export * from './doctor/index.js';
15
+ export * from './security/index.js';
10
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,uBAAuB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA"}
@@ -0,0 +1,36 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { SessionSource } from '../types.js';
3
+ export interface Candidate {
4
+ sessionId: number;
5
+ sessionUuid: string;
6
+ source: SessionSource;
7
+ sourceId: number;
8
+ currentProjectId: number;
9
+ currentTitle: string;
10
+ extractedQuery: string | null;
11
+ }
12
+ export interface MigrationPlan {
13
+ candidates: Candidate[];
14
+ /** projectId → number of candidate sessions currently in it */
15
+ affectedProjects: Map<number, number>;
16
+ }
17
+ export interface MigrationResult {
18
+ sessionsTouched: number;
19
+ sessionsTitleUpdated: number;
20
+ sessionsExtractionFailed: number;
21
+ projectsDeleted: number[];
22
+ }
23
+ export declare function computeMigrationPlan(db: Database.Database): MigrationPlan;
24
+ /**
25
+ * Find the user's real query inside a candidate session's stored messages.
26
+ * Walks user messages in seq order, skips known-noise rows, and returns:
27
+ * - the substring captured by `User query: "(.+)"` if the message is the
28
+ * Spool buildPrompt blob, or
29
+ * - the message itself, trimmed and capped at 120 chars, otherwise.
30
+ * Returns null when no usable user message exists (extreme corruption case).
31
+ */
32
+ export declare function extractQueryForSession(db: Database.Database, sessionId: number): string | null;
33
+ export declare function applyMigration(db: Database.Database, plan: MigrationPlan): MigrationResult;
34
+ /** Convenience entry point used by the v9 schema migration. */
35
+ export declare function runAgentSearchCleanup(db: Database.Database): MigrationResult;
36
+ //# sourceMappingURL=agent-search-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-search-cleanup.d.ts","sourceRoot":"","sources":["../../src/migrations/agent-search-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AA0ChD,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,aAAa,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,+DAA+D;IAC/D,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAA;IACvB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,wBAAwB,EAAE,MAAM,CAAA;IAChC,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,aAAa,CA2DzE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0B9F;AAOD,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,GAAG,eAAe,CA0D1F;AAED,+DAA+D;AAC/D,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAG5E"}
@@ -0,0 +1,182 @@
1
+ import { getOrCreateAskProject } from '../db/queries.js';
2
+ /**
3
+ * v9 data migration: rewrites historical agent-search sessions that were
4
+ * indexed before #150-#153 landed.
5
+ *
6
+ * Pre-#151 agent search relied on the next sync to pick up the JSONL the
7
+ * downstream agent (Claude / Codex) wrote on its own. The JSONL was full of
8
+ * noise (Claude Code's <local-command-caveat>, /model default slash command,
9
+ * Spool's own giant system prompt) and landed in whatever folder Electron's
10
+ * process.cwd() pointed at — usually "/" in prod, packages/app in dev.
11
+ * Result: every old agent-search session sits under a synthetic project
12
+ * named "(root)" or similar, with a derived title that's just
13
+ * "Caveat: The messages below..." or "You have access to a local
14
+ * knowledge base...".
15
+ *
16
+ * This migration finds those sessions by an explicit triple-gate, extracts
17
+ * the user's real query out of the long Spool-system-prompt blob, rewrites
18
+ * title + title_source='spool', and moves the session to the per-source
19
+ * "Asks" virtual project. Empty old projects are deleted.
20
+ *
21
+ * Runs once via the v8→v9 schema-migration step. Idempotent: a re-run sees
22
+ * 0 candidates because all migrated rows have title_source='spool'.
23
+ */
24
+ const CAVEAT_TITLE_PREFIX = 'Caveat: The messages below were generated by the user while running local commands';
25
+ const SPOOL_PROMPT_TITLE_PREFIX = 'You have access to a local knowledge base called Spool';
26
+ const SPOOL_PROMPT_BODY_MARKER = 'You have access to a local knowledge base called Spool';
27
+ // Noise message patterns left over from old-parser sync. These were the
28
+ // inner text of <local-command-caveat>, <command-args>, <local-command-stdout>
29
+ // tags before #153 added the strip rules.
30
+ const NOISE_PATTERNS = [
31
+ /^Caveat: The messages below were generated by the user while running local commands/i,
32
+ /^default$/,
33
+ /^Set model to /i,
34
+ /^The user opened/i,
35
+ ];
36
+ const USER_QUERY_RE = /User query:\s*"([\s\S]+?)"\s*$/;
37
+ export function computeMigrationPlan(db) {
38
+ // A row is a candidate only when ALL THREE hold:
39
+ // (a) title_source = 'derived' (not yet migrated by Spool itself)
40
+ // (b) the title is one of the noise prefixes pre-#153 Spool agent
41
+ // search produced (cheap title-based filter)
42
+ // (c) at least one of the session's user messages contains the Spool
43
+ // buildPrompt blob signature — text that no human ever types and
44
+ // no agent ever generates, so it uniquely identifies a session
45
+ // that came out of Spool's agent search pipeline.
46
+ //
47
+ // (c) is what guards real coding sessions whose first message happened
48
+ // to be Claude Code's injected <local-command-caveat>. An earlier draft
49
+ // also accepted "cwd is in a Spool-specific path" as an alternative to
50
+ // (c), but those paths were either too narrow (only my dev environment)
51
+ // or too broad (cwd='/' could be anyone running claude from the
52
+ // filesystem root). The blob check is the only signal that's both
53
+ // Spool-unique and cross-environment robust.
54
+ const rows = db.prepare(`
55
+ SELECT s.id, s.session_uuid, s.source_id, s.project_id, s.title,
56
+ src.name AS source_name
57
+ FROM sessions s
58
+ JOIN sources src ON src.id = s.source_id
59
+ WHERE s.title_source = 'derived'
60
+ AND (s.title LIKE ? OR s.title LIKE ?)
61
+ AND EXISTS (
62
+ SELECT 1 FROM messages m
63
+ WHERE m.session_id = s.id
64
+ AND m.role = 'user'
65
+ AND m.content_text LIKE ?
66
+ )
67
+ `).all(`${CAVEAT_TITLE_PREFIX}%`, `${SPOOL_PROMPT_TITLE_PREFIX}%`, `%${SPOOL_PROMPT_BODY_MARKER}%`);
68
+ const candidates = rows.map(r => ({
69
+ sessionId: r.id,
70
+ sessionUuid: r.session_uuid,
71
+ source: r.source_name,
72
+ sourceId: r.source_id,
73
+ currentProjectId: r.project_id,
74
+ currentTitle: r.title,
75
+ extractedQuery: extractQueryForSession(db, r.id),
76
+ }));
77
+ const affectedProjects = new Map();
78
+ for (const c of candidates) {
79
+ affectedProjects.set(c.currentProjectId, (affectedProjects.get(c.currentProjectId) ?? 0) + 1);
80
+ }
81
+ return { candidates, affectedProjects };
82
+ }
83
+ /**
84
+ * Find the user's real query inside a candidate session's stored messages.
85
+ * Walks user messages in seq order, skips known-noise rows, and returns:
86
+ * - the substring captured by `User query: "(.+)"` if the message is the
87
+ * Spool buildPrompt blob, or
88
+ * - the message itself, trimmed and capped at 120 chars, otherwise.
89
+ * Returns null when no usable user message exists (extreme corruption case).
90
+ */
91
+ export function extractQueryForSession(db, sessionId) {
92
+ const messages = db.prepare(`
93
+ SELECT content_text FROM messages
94
+ WHERE session_id = ? AND role = 'user'
95
+ ORDER BY seq
96
+ `).all(sessionId);
97
+ for (const m of messages) {
98
+ const text = m.content_text.trim();
99
+ if (!text)
100
+ continue;
101
+ if (NOISE_PATTERNS.some(re => re.test(text)))
102
+ continue;
103
+ if (text.includes(SPOOL_PROMPT_BODY_MARKER)) {
104
+ const match = USER_QUERY_RE.exec(text);
105
+ if (match?.[1]) {
106
+ const q = match[1].trim();
107
+ return q.length > 0 ? truncateForTitle(q) : null;
108
+ }
109
+ // Spool prompt blob present but query couldn't be extracted; fall
110
+ // through to next message (defensive — shouldn't normally happen).
111
+ continue;
112
+ }
113
+ return truncateForTitle(text);
114
+ }
115
+ return null;
116
+ }
117
+ function truncateForTitle(s) {
118
+ const cleaned = s.replace(/\s+/g, ' ').trim();
119
+ return cleaned.length > 120 ? cleaned.slice(0, 117) + '...' : cleaned;
120
+ }
121
+ export function applyMigration(db, plan) {
122
+ let sessionsTouched = 0;
123
+ let sessionsTitleUpdated = 0;
124
+ let sessionsExtractionFailed = 0;
125
+ // Pre-create per-source Asks projects so the loop is simple.
126
+ const askProjectId = new Map();
127
+ for (const c of plan.candidates) {
128
+ if (!askProjectId.has(c.source)) {
129
+ askProjectId.set(c.source, getOrCreateAskProject(db, c.source));
130
+ }
131
+ }
132
+ const updateWithTitle = db.prepare(`
133
+ UPDATE sessions
134
+ SET title = ?, title_source = 'spool', project_id = ?
135
+ WHERE id = ?
136
+ `);
137
+ const updateProjectOnly = db.prepare(`
138
+ UPDATE sessions
139
+ SET project_id = ?, title_source = 'spool'
140
+ WHERE id = ?
141
+ `);
142
+ for (const c of plan.candidates) {
143
+ const targetProjectId = askProjectId.get(c.source);
144
+ if (targetProjectId === undefined)
145
+ continue;
146
+ sessionsTouched += 1;
147
+ if (c.extractedQuery) {
148
+ updateWithTitle.run(c.extractedQuery, targetProjectId, c.sessionId);
149
+ sessionsTitleUpdated += 1;
150
+ }
151
+ else {
152
+ // Couldn't extract query — keep the (noisy) title rather than blank
153
+ // it out, but still move the row out of the wrong project and lock
154
+ // title_source so future sync doesn't keep re-applying the noise.
155
+ updateProjectOnly.run(targetProjectId, c.sessionId);
156
+ sessionsExtractionFailed += 1;
157
+ }
158
+ }
159
+ // Delete old projects that became empty as a result.
160
+ const projectsDeleted = [];
161
+ const countSessions = db.prepare(`SELECT COUNT(*) AS c FROM sessions WHERE project_id = ?`);
162
+ const deleteProject = db.prepare(`DELETE FROM projects WHERE id = ?`);
163
+ for (const projectId of plan.affectedProjects.keys()) {
164
+ const remaining = countSessions.get(projectId).c;
165
+ if (remaining === 0) {
166
+ deleteProject.run(projectId);
167
+ projectsDeleted.push(projectId);
168
+ }
169
+ }
170
+ return {
171
+ sessionsTouched,
172
+ sessionsTitleUpdated,
173
+ sessionsExtractionFailed,
174
+ projectsDeleted,
175
+ };
176
+ }
177
+ /** Convenience entry point used by the v9 schema migration. */
178
+ export function runAgentSearchCleanup(db) {
179
+ const plan = computeMigrationPlan(db);
180
+ return applyMigration(db, plan);
181
+ }
182
+ //# sourceMappingURL=agent-search-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-search-cleanup.js","sourceRoot":"","sources":["../../src/migrations/agent-search-cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type Database from 'better-sqlite3';
2
+ import { type IdentityFs } from '../projects/identity.js';
3
+ /**
4
+ * v10 data migration: re-classify historical `path`-kind project rows whose
5
+ * `identity_key` is a worktree path that has since been deleted.
6
+ *
7
+ * Before the worktree resolvers landed, a session synced AFTER its worktree
8
+ * was torn down had no way to recover its upstream remote — `computeIdentity`
9
+ * would walk up looking for `.git`, find nothing (the worktree was gone),
10
+ * and fall through to `path` kind. That created an orphan project per
11
+ * deleted worktree, even when the user had a perfectly good `spool` project
12
+ * already grouped under `git_remote: github.com/spool-lab/spool`.
13
+ *
14
+ * This migration re-runs `computeIdentity` against the stored `identity_key`.
15
+ * The resolver chain (default: superset) now reads the worktree tool's
16
+ * persistent registry to find the upstream main-repo path, runs git on it,
17
+ * and returns a real `git_remote` / `git_common_dir` identity. Same identity
18
+ * tuple as the parent project → `project_groups_v` collapses them into one
19
+ * row in the sidebar without any explicit row merging.
20
+ *
21
+ * Idempotent: re-running sees no `path`-kind candidates that resolve to a
22
+ * different identity, so it's a no-op on the second pass. Rows that still
23
+ * fail to resolve (e.g. genuine ad-hoc paths, or worktree tools we don't
24
+ * have a resolver for yet) stay untouched.
25
+ */
26
+ export interface WorktreeUpgradeResult {
27
+ examined: number;
28
+ upgraded: number;
29
+ }
30
+ export declare function upgradeWorktreeIdentities(db: Database.Database, fs: IdentityFs): WorktreeUpgradeResult;
31
+ //# sourceMappingURL=worktree-identity-upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-identity-upgrade.d.ts","sourceRoot":"","sources":["../../src/migrations/worktree-identity-upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE1E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,EAAE,EAAE,UAAU,GACb,qBAAqB,CAyBvB"}
@@ -0,0 +1,22 @@
1
+ import { computeIdentity } from '../projects/identity.js';
2
+ export function upgradeWorktreeIdentities(db, fs) {
3
+ const rows = db.prepare(`SELECT id, identity_key FROM projects WHERE identity_kind = 'path'`).all();
4
+ if (rows.length === 0)
5
+ return { examined: 0, upgraded: 0 };
6
+ const update = db.prepare(`UPDATE projects
7
+ SET identity_kind = ?, identity_key = ?, display_name = ?
8
+ WHERE id = ?`);
9
+ let upgraded = 0;
10
+ for (const row of rows) {
11
+ const id = computeIdentity(row.identity_key, fs);
12
+ // Only upgrade when the resolver produced something stronger than path.
13
+ // (`loose` shouldn't happen here since we feed it a real cwd, but skip
14
+ // defensively to avoid demoting rows.)
15
+ if (id.kind === 'path' || id.kind === 'loose')
16
+ continue;
17
+ update.run(id.kind, id.key, id.displayName, row.id);
18
+ upgraded += 1;
19
+ }
20
+ return { examined: rows.length, upgraded };
21
+ }
22
+ //# sourceMappingURL=worktree-identity-upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-identity-upgrade.js","sourceRoot":"","sources":["../../src/migrations/worktree-identity-upgrade.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAmB,MAAM,yBAAyB,CAAA;AA+B1E,MAAM,UAAU,yBAAyB,CACvC,EAAqB,EACrB,EAAc;IAEd,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,oEAAoE,CACrE,CAAC,GAAG,EAAiD,CAAA;IAEtD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;IAE1D,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB;;kBAEc,CACf,CAAA;IAED,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;QAChD,wEAAwE;QACxE,uEAAuE;QACvE,uCAAuC;QACvC,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO;YAAE,SAAQ;QACvD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;QACnD,QAAQ,IAAI,CAAC,CAAA;IACf,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAA;AAC5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/parsers/claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAA;AASnF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAkHtE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAOzE;AA2BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD"}
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/parsers/claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAA;AASnF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAkHtE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAOzE;AAwCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD"}
@@ -116,22 +116,35 @@ export function parseClaudeSession(filePath) {
116
116
  return null;
117
117
  }
118
118
  }
119
+ // Slash-command records in Claude Code JSONL come as a triplet:
120
+ // <command-name>/X</command-name>
121
+ // <command-message>X</command-message>
122
+ // <command-args>Y</command-args>
123
+ // Strip the whole record as one unit so bare <command-args> appearing in
124
+ // legitimate user content (e.g. a user pasting log output that contains
125
+ // these tags) is preserved.
126
+ const SLASH_COMMAND_RECORD = /<command-name>[\s\S]*?<\/command-name>(?:\s*<command-message>[\s\S]*?<\/command-message>)?(?:\s*<command-args>[\s\S]*?<\/command-args>)?/g;
119
127
  function extractText(content) {
128
+ let raw;
120
129
  if (typeof content === 'string') {
121
- return content
122
- .replace(/<command-message>[\s\S]*?<\/command-message>/g, '')
123
- .replace(/<command-name>[\s\S]*?<\/command-name>/g, '')
124
- .replace(/<local-command-stdout>[\s\S]*?<\/local-command-stdout>/g, '')
125
- .replace(/<system-reminder>[\s\S]*?<\/system-reminder>/g, '')
126
- .replace(/<[^>]+>/g, '')
127
- .trim();
130
+ raw = content;
128
131
  }
129
- if (!Array.isArray(content))
132
+ else if (Array.isArray(content)) {
133
+ raw = content
134
+ .filter(item => item.type === 'text')
135
+ .map(item => item.text ?? '')
136
+ .join('\n');
137
+ }
138
+ else {
130
139
  return '';
131
- return content
132
- .filter(item => item.type === 'text')
133
- .map(item => item.text ?? '')
134
- .join('\n')
140
+ }
141
+ return raw
142
+ .replace(/<spool-system-prelude>[\s\S]*?<\/spool-system-prelude>/g, '')
143
+ .replace(SLASH_COMMAND_RECORD, '')
144
+ .replace(/<local-command-stdout>[\s\S]*?<\/local-command-stdout>/g, '')
145
+ .replace(/<local-command-caveat>[\s\S]*?<\/local-command-caveat>/g, '')
146
+ .replace(/<system-reminder>[\s\S]*?<\/system-reminder>/g, '')
147
+ .replace(/<[^>]+>/g, '')
135
148
  .trim();
136
149
  }
137
150
  function extractToolNames(content) {
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/parsers/claude.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/parsers/claude.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/parsers/codex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAA;AAQnF,eAAO,MAAM,mBAAmB,wEAAwE,CAAA;AAexG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAyJrE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAOxE"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/parsers/codex.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAA;AASnF,eAAO,MAAM,mBAAmB,wEAAwE,CAAA;AAiBxG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAuJrE;AA6BD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAOxE"}