@spool-lab/core 0.4.0 → 0.4.12

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 (171) hide show
  1. package/dist/db/db.d.ts +19 -0
  2. package/dist/db/db.d.ts.map +1 -1
  3. package/dist/db/db.js +210 -15
  4. package/dist/db/db.js.map +1 -1
  5. package/dist/db/queries.d.ts +36 -10
  6. package/dist/db/queries.d.ts.map +1 -1
  7. package/dist/db/queries.js +96 -75
  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 +5 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +5 -0
  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 +12 -0
  99. package/dist/projects/sessions.d.ts.map +1 -0
  100. package/dist/projects/sessions.js +47 -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/sync/syncer.d.ts.map +1 -1
  107. package/dist/sync/syncer.js +11 -3
  108. package/dist/sync/syncer.js.map +1 -1
  109. package/dist/types.d.ts +15 -6
  110. package/dist/types.d.ts.map +1 -1
  111. package/package.json +2 -2
  112. package/dist/connectors/capabilities/cookies-chrome.d.ts +0 -19
  113. package/dist/connectors/capabilities/cookies-chrome.d.ts.map +0 -1
  114. package/dist/connectors/capabilities/cookies-chrome.js +0 -199
  115. package/dist/connectors/capabilities/cookies-chrome.js.map +0 -1
  116. package/dist/connectors/capabilities/exec-impl.d.ts +0 -3
  117. package/dist/connectors/capabilities/exec-impl.d.ts.map +0 -1
  118. package/dist/connectors/capabilities/exec-impl.js +0 -108
  119. package/dist/connectors/capabilities/exec-impl.js.map +0 -1
  120. package/dist/connectors/capabilities/fetch-impl.d.ts +0 -3
  121. package/dist/connectors/capabilities/fetch-impl.d.ts.map +0 -1
  122. package/dist/connectors/capabilities/fetch-impl.js +0 -4
  123. package/dist/connectors/capabilities/fetch-impl.js.map +0 -1
  124. package/dist/connectors/capabilities/index.d.ts +0 -6
  125. package/dist/connectors/capabilities/index.d.ts.map +0 -1
  126. package/dist/connectors/capabilities/index.js +0 -6
  127. package/dist/connectors/capabilities/index.js.map +0 -1
  128. package/dist/connectors/capabilities/log-impl.d.ts +0 -3
  129. package/dist/connectors/capabilities/log-impl.d.ts.map +0 -1
  130. package/dist/connectors/capabilities/log-impl.js +0 -26
  131. package/dist/connectors/capabilities/log-impl.js.map +0 -1
  132. package/dist/connectors/capabilities/sqlite-impl.d.ts +0 -3
  133. package/dist/connectors/capabilities/sqlite-impl.d.ts.map +0 -1
  134. package/dist/connectors/capabilities/sqlite-impl.js +0 -19
  135. package/dist/connectors/capabilities/sqlite-impl.js.map +0 -1
  136. package/dist/connectors/loader.d.ts +0 -47
  137. package/dist/connectors/loader.d.ts.map +0 -1
  138. package/dist/connectors/loader.js +0 -328
  139. package/dist/connectors/loader.js.map +0 -1
  140. package/dist/connectors/npm-install.d.ts +0 -26
  141. package/dist/connectors/npm-install.d.ts.map +0 -1
  142. package/dist/connectors/npm-install.js +0 -74
  143. package/dist/connectors/npm-install.js.map +0 -1
  144. package/dist/connectors/prerequisites.d.ts +0 -14
  145. package/dist/connectors/prerequisites.d.ts.map +0 -1
  146. package/dist/connectors/prerequisites.js +0 -109
  147. package/dist/connectors/prerequisites.js.map +0 -1
  148. package/dist/connectors/registry-fetch.d.ts +0 -22
  149. package/dist/connectors/registry-fetch.d.ts.map +0 -1
  150. package/dist/connectors/registry-fetch.js +0 -54
  151. package/dist/connectors/registry-fetch.js.map +0 -1
  152. package/dist/connectors/registry.d.ts +0 -23
  153. package/dist/connectors/registry.d.ts.map +0 -1
  154. package/dist/connectors/registry.js +0 -59
  155. package/dist/connectors/registry.js.map +0 -1
  156. package/dist/connectors/sync-engine.d.ts +0 -31
  157. package/dist/connectors/sync-engine.d.ts.map +0 -1
  158. package/dist/connectors/sync-engine.js +0 -604
  159. package/dist/connectors/sync-engine.js.map +0 -1
  160. package/dist/connectors/sync-scheduler.d.ts +0 -56
  161. package/dist/connectors/sync-scheduler.d.ts.map +0 -1
  162. package/dist/connectors/sync-scheduler.js +0 -238
  163. package/dist/connectors/sync-scheduler.js.map +0 -1
  164. package/dist/connectors/trust-store.d.ts +0 -13
  165. package/dist/connectors/trust-store.d.ts.map +0 -1
  166. package/dist/connectors/trust-store.js +0 -48
  167. package/dist/connectors/trust-store.js.map +0 -1
  168. package/dist/connectors/types.d.ts +0 -111
  169. package/dist/connectors/types.d.ts.map +0 -1
  170. package/dist/connectors/types.js +0 -50
  171. package/dist/connectors/types.js.map +0 -1
package/dist/db/db.d.ts CHANGED
@@ -1,10 +1,29 @@
1
1
  import Database from 'better-sqlite3';
2
+ import { type IdentityFs } from '../projects/identity.js';
2
3
  export declare const SPOOL_DIR: string;
3
4
  export declare const DB_PATH: string;
5
+ /**
6
+ * Latest schema version the running build knows how to migrate to.
7
+ * Bump in lockstep with the last `db.pragma('user_version = N')` in runMigrations.
8
+ */
9
+ export declare const LATEST_SCHEMA_VERSION = 11;
4
10
  export declare function getDB(_readonly?: boolean): Database.Database;
5
11
  /** True if the DB file did not exist before this process opened it. */
6
12
  export declare function wasNewDb(): boolean;
7
13
  /** user_version of the DB before any migrations ran this process. Null if getDB() hasn't been called. */
8
14
  export declare function getInitialUserVersion(): number | null;
9
15
  export declare function getDBSize(): number;
16
+ export declare function runMigrations(db: Database.Database): void;
17
+ export declare function backfillProjectIdentities(db: Database.Database, fs: IdentityFs): void;
18
+ /**
19
+ * Snapshot the DB to `<dbDir>/backups/spool-pre-v{fromVersion+1}-<ts>.db`
20
+ * via VACUUM INTO, before a destructive migration runs.
21
+ *
22
+ * Returns the backup file path on success, or null when a backup is skipped:
23
+ * - in-memory DBs (db.memory)
24
+ * - fresh-install / no-data DBs (sessions table empty or missing)
25
+ *
26
+ * Each call writes to a distinct path; v5 and v7 produce separate files.
27
+ */
28
+ export declare function backupBeforeDestructive(db: Database.Database, fromVersion: number): string | null;
10
29
  //# sourceMappingURL=db.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAKrC,eAAO,MAAM,SAAS,QAA6D,CAAA;AACnF,eAAO,MAAM,OAAO,QAA8B,CAAA;AAMlD,wBAAgB,KAAK,CAAC,SAAS,UAAQ,GAAG,QAAQ,CAAC,QAAQ,CAgB1D;AAED,uEAAuE;AACvE,wBAAgB,QAAQ,IAAI,OAAO,CAAqB;AAExD,yGAAyG;AACzG,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAA+B;AAErF,wBAAgB,SAAS,IAAI,MAAM,CAMlC"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAIrC,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAK1E,eAAO,MAAM,SAAS,QAA6D,CAAA;AACnF,eAAO,MAAM,OAAO,QAA8B,CAAA;AAElD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAA;AAMvC,wBAAgB,KAAK,CAAC,SAAS,UAAQ,GAAG,QAAQ,CAAC,QAAQ,CAgB1D;AAED,uEAAuE;AACvE,wBAAgB,QAAQ,IAAI,OAAO,CAAqB;AAExD,yGAAyG;AACzG,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAA+B;AAErF,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAoazD;AAED,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,UAAU,QAgB9E;AA0BD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAef"}
package/dist/db/db.js CHANGED
@@ -1,9 +1,18 @@
1
1
  import Database from 'better-sqlite3';
2
2
  import { homedir } from 'node:os';
3
- import { join } from 'node:path';
3
+ import { dirname, join } from 'node:path';
4
4
  import { existsSync, mkdirSync, statSync } from 'node:fs';
5
+ import { computeIdentity } from '../projects/identity.js';
6
+ import { realFs } from '../projects/fs.js';
7
+ import { runAgentSearchCleanup } from '../migrations/agent-search-cleanup.js';
8
+ import { upgradeWorktreeIdentities } from '../migrations/worktree-identity-upgrade.js';
5
9
  export const SPOOL_DIR = process.env['SPOOL_DATA_DIR'] ?? join(homedir(), '.spool');
6
10
  export const DB_PATH = join(SPOOL_DIR, 'spool.db');
11
+ /**
12
+ * Latest schema version the running build knows how to migrate to.
13
+ * Bump in lockstep with the last `db.pragma('user_version = N')` in runMigrations.
14
+ */
15
+ export const LATEST_SCHEMA_VERSION = 11;
7
16
  let _db = null;
8
17
  let _wasNewDb = false;
9
18
  let _initialUserVersion = null;
@@ -37,7 +46,7 @@ export function getDBSize() {
37
46
  return 0;
38
47
  }
39
48
  }
40
- function runMigrations(db) {
49
+ export function runMigrations(db) {
41
50
  db.exec(`
42
51
  CREATE TABLE IF NOT EXISTS sources (
43
52
  id INTEGER PRIMARY KEY,
@@ -68,6 +77,7 @@ function runMigrations(db) {
68
77
  session_uuid TEXT NOT NULL UNIQUE,
69
78
  file_path TEXT NOT NULL UNIQUE,
70
79
  title TEXT,
80
+ title_source TEXT NOT NULL DEFAULT 'derived',
71
81
  started_at TEXT NOT NULL,
72
82
  ended_at TEXT NOT NULL,
73
83
  message_count INTEGER NOT NULL DEFAULT 0,
@@ -218,29 +228,27 @@ function runMigrations(db) {
218
228
  // Each migration runs exactly once. Add new migrations at the end with
219
229
  // the next sequential version number.
220
230
  const version = db.pragma('user_version')[0].user_version;
221
- // Historical connector migrations (v1-v3): all operate on the captures /
222
- // connector_sync_state tables that were dropped in v5. Wrapped to no-op
223
- // when those tables aren't present (fresh install on the post-v5 schema).
231
+ // Historical connector migrations (v1-v3): all operate on tables that v5
232
+ // dropped (connector_sync_state, captures, capture_connectors,
233
+ // captures_fts*). Guard each on the relevant table existing fresh
234
+ // installs (post-v5 schema) skip these without ever touching the SQL.
224
235
  if (version < 1) {
225
- try {
236
+ if (tableExists(db, 'connector_sync_state')) {
226
237
  db.exec('ALTER TABLE connector_sync_state ADD COLUMN last_error_at TEXT');
227
238
  }
228
- catch { }
229
239
  db.pragma('user_version = 1');
230
240
  }
231
241
  if (version < 2) {
232
- try {
242
+ if (tableExists(db, 'captures_fts')) {
233
243
  db.exec("INSERT INTO captures_fts(captures_fts) VALUES('rebuild')");
234
244
  }
235
- catch { }
236
- try {
245
+ if (tableExists(db, 'captures_fts_trigram')) {
237
246
  db.exec("INSERT INTO captures_fts_trigram(captures_fts_trigram) VALUES('rebuild')");
238
247
  }
239
- catch { }
240
248
  db.pragma('user_version = 2');
241
249
  }
242
250
  if (version < 3) {
243
- try {
251
+ if (tableExists(db, 'captures') && tableExists(db, 'capture_connectors')) {
244
252
  db.transaction(() => {
245
253
  db.exec(`
246
254
  INSERT OR IGNORE INTO capture_connectors (capture_id, connector_id)
@@ -261,7 +269,6 @@ function runMigrations(db) {
261
269
  db.exec(`DROP INDEX IF EXISTS idx_captures_source`);
262
270
  })();
263
271
  }
264
- catch { }
265
272
  db.pragma('user_version = 3');
266
273
  }
267
274
  if (version < 4) {
@@ -285,8 +292,9 @@ function runMigrations(db) {
285
292
  // SQLite can't ALTER a CHECK constraint, so we rebuild the stars table.
286
293
  // For users who never had the wide CHECK (fresh install on post-v5
287
294
  // schema), the rebuild is a no-op rename round-trip — safe and cheap.
288
- // Captures data is dropped without backup; users were directed to Spool
289
- // Daemon for connector functionality.
295
+ // Captures data is dropped here; users were directed to Spool Daemon for
296
+ // connector functionality. We snapshot first so the data is recoverable.
297
+ backupBeforeDestructive(db, 4);
290
298
  db.transaction(() => {
291
299
  db.exec(`DROP TRIGGER IF EXISTS captures_fts_insert`);
292
300
  db.exec(`DROP TRIGGER IF EXISTS captures_fts_delete`);
@@ -313,10 +321,197 @@ function runMigrations(db) {
313
321
  })();
314
322
  db.pragma('user_version = 5');
315
323
  }
324
+ if (version < 6) {
325
+ db.transaction(() => {
326
+ db.exec(`
327
+ ALTER TABLE projects ADD COLUMN identity_kind TEXT;
328
+ ALTER TABLE projects ADD COLUMN identity_key TEXT;
329
+ CREATE INDEX IF NOT EXISTS idx_projects_identity
330
+ ON projects (identity_kind, identity_key);
331
+
332
+ CREATE VIEW IF NOT EXISTS project_groups_v AS
333
+ SELECT
334
+ p.identity_kind,
335
+ p.identity_key,
336
+ MIN(p.display_name) AS display_name,
337
+ GROUP_CONCAT(DISTINCT s.name) AS sources_csv,
338
+ COALESCE(SUM(c.session_count),0) AS session_count,
339
+ MAX(c.last_session_at) AS last_session_at
340
+ FROM projects p
341
+ JOIN sources s ON s.id = p.source_id
342
+ LEFT JOIN (
343
+ SELECT project_id,
344
+ COUNT(*) AS session_count,
345
+ MAX(started_at) AS last_session_at
346
+ FROM sessions
347
+ WHERE message_count > 0
348
+ GROUP BY project_id
349
+ ) c ON c.project_id = p.id
350
+ WHERE p.identity_kind IS NOT NULL
351
+ GROUP BY p.identity_kind, p.identity_key;
352
+ `);
353
+ })();
354
+ db.pragma('user_version = 6');
355
+ backfillProjectIdentities(db, realFs);
356
+ }
357
+ if (version < 7) {
358
+ backupBeforeDestructive(db, 6);
359
+ db.transaction(() => {
360
+ db.exec(`
361
+ CREATE TABLE pins (
362
+ session_uuid TEXT PRIMARY KEY,
363
+ pinned_at TEXT NOT NULL DEFAULT (datetime('now'))
364
+ );
365
+ CREATE INDEX IF NOT EXISTS idx_pins_pinned_at ON pins (pinned_at DESC);
366
+ INSERT OR IGNORE INTO pins (session_uuid, pinned_at)
367
+ SELECT item_uuid, starred_at FROM stars WHERE item_type = 'session';
368
+ DROP TABLE stars;
369
+ `);
370
+ })();
371
+ db.pragma('user_version = 7');
372
+ }
373
+ if (version < 8) {
374
+ // v8: title_source column distinguishes title authority. 'derived' = parsed
375
+ // from source JSONL (default; sync may overwrite). 'spool' = written by
376
+ // Spool itself (e.g. agent-search session created in-app). 'user' = user
377
+ // edited in Spool. Sync only overwrites 'derived' rows.
378
+ if (!columnExists(db, 'sessions', 'title_source')) {
379
+ db.exec(`ALTER TABLE sessions ADD COLUMN title_source TEXT NOT NULL DEFAULT 'derived'`);
380
+ }
381
+ db.pragma('user_version = 8');
382
+ }
383
+ // Schema sanity runs BEFORE any data migration that depends on these
384
+ // columns. Repairs DBs where a version pragma was bumped (by experimental
385
+ // code, a manual upgrade, or a half-finished migration) without the
386
+ // corresponding column being added. Each check is a fast no-op when the
387
+ // column already exists.
388
+ ensureSchemaSanity(db);
389
+ if (version < 9) {
390
+ // v9: one-time data cleanup of historical agent-search sessions indexed
391
+ // before #150-#153. Detection is gated on the Spool buildPrompt blob in
392
+ // a user message (Spool-unique signal) so it can never sweep up real
393
+ // coding sessions whose first message happened to be Claude Code's
394
+ // injected <local-command-caveat>. See migrations/agent-search-cleanup.ts
395
+ // for the full rationale.
396
+ backupBeforeDestructive(db, 8);
397
+ db.transaction(() => {
398
+ runAgentSearchCleanup(db);
399
+ })();
400
+ db.pragma('user_version = 9');
401
+ }
402
+ if (version < 10) {
403
+ // v10: re-classify path-kind projects that are stranded worktree cwds.
404
+ // Before the worktree resolvers landed, a session synced after its
405
+ // worktree was deleted couldn't reach the upstream git remote and was
406
+ // bucketed as its own path-kind project. The resolver now reads the
407
+ // worktree tool's persistent registry (e.g. ~/.superset/local.db) and
408
+ // recovers the real identity. See migrations/worktree-identity-upgrade.ts.
409
+ db.transaction(() => {
410
+ upgradeWorktreeIdentities(db, realFs);
411
+ })();
412
+ db.pragma('user_version = 10');
413
+ }
414
+ if (version < 11) {
415
+ // v11: share_drafts table — locally-persisted in-progress shares
416
+ // managed by Spool Share's editor. Independent of the sessions index;
417
+ // a draft can survive its source session being deleted because the
418
+ // full snapshot is captured at compose time and stored as JSON.
419
+ //
420
+ // Two JSON payloads per row:
421
+ // - snapshot_json: the complete SpoolDocument (full conversation +
422
+ // opts). Used when opening the editor. Can be hundreds of KB on
423
+ // long sessions.
424
+ // - preview_json: a slim subset used by the Shares grid card —
425
+ // opts + title + source + word count + the first handful of
426
+ // turns. Kept under a few KB so listShareDrafts can SELECT it
427
+ // across hundreds of rows without shipping multi-MB IPC payloads
428
+ // to the renderer.
429
+ db.exec(`
430
+ CREATE TABLE IF NOT EXISTS share_drafts (
431
+ draft_id TEXT PRIMARY KEY,
432
+ source_kind TEXT NOT NULL CHECK (source_kind IN (
433
+ 'spool-session', 'pasted-url', 'imported-file', 'imported-jsonl'
434
+ )),
435
+ source_origin TEXT,
436
+ title TEXT NOT NULL DEFAULT '',
437
+ snapshot_json TEXT NOT NULL,
438
+ preview_json TEXT NOT NULL DEFAULT '{}',
439
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
440
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
441
+ );
442
+ CREATE INDEX IF NOT EXISTS idx_share_drafts_updated_at
443
+ ON share_drafts(updated_at DESC);
444
+ CREATE INDEX IF NOT EXISTS idx_share_drafts_source_origin
445
+ ON share_drafts(source_origin);
446
+ `);
447
+ db.pragma('user_version = 11');
448
+ }
316
449
  rebuildFtsTableIfEmpty(db, 'messages', 'messages_fts_trigram');
317
450
  rebuildFtsTableIfEmpty(db, 'session_search', 'session_search_fts');
318
451
  rebuildFtsTableIfEmpty(db, 'session_search', 'session_search_fts_trigram');
319
452
  }
453
+ export function backfillProjectIdentities(db, fs) {
454
+ const rows = db.prepare(`SELECT id, display_path FROM projects WHERE identity_kind IS NULL`).all();
455
+ if (rows.length === 0)
456
+ return;
457
+ const update = db.prepare(`UPDATE projects
458
+ SET identity_kind = ?, identity_key = ?, display_name = COALESCE(?, display_name)
459
+ WHERE id = ?`);
460
+ db.transaction(() => {
461
+ for (const r of rows) {
462
+ const id = computeIdentity(r.display_path, fs);
463
+ update.run(id.kind, id.key, id.displayName, r.id);
464
+ }
465
+ })();
466
+ }
467
+ function tableExists(db, name) {
468
+ const row = db.prepare(`SELECT name FROM sqlite_master WHERE type IN ('table','virtual') AND name = ?`).get(name);
469
+ return row !== undefined;
470
+ }
471
+ function columnExists(db, table, column) {
472
+ const rows = db.prepare(`PRAGMA table_info(${table})`).all();
473
+ return rows.some(r => r.name === column);
474
+ }
475
+ function ensureSchemaSanity(db) {
476
+ // Backfill columns the head schema requires but historical DBs (or test
477
+ // fixtures that seed an intentionally-minimal table) may be missing.
478
+ // Each ALTER is a fast no-op when the column already exists.
479
+ const ensureCol = (col, ddl) => {
480
+ if (!columnExists(db, 'sessions', col))
481
+ db.exec(`ALTER TABLE sessions ADD COLUMN ${col} ${ddl}`);
482
+ };
483
+ ensureCol('title', 'TEXT');
484
+ ensureCol('title_source', `TEXT NOT NULL DEFAULT 'derived'`);
485
+ ensureCol('message_count', 'INTEGER NOT NULL DEFAULT 0');
486
+ }
487
+ /**
488
+ * Snapshot the DB to `<dbDir>/backups/spool-pre-v{fromVersion+1}-<ts>.db`
489
+ * via VACUUM INTO, before a destructive migration runs.
490
+ *
491
+ * Returns the backup file path on success, or null when a backup is skipped:
492
+ * - in-memory DBs (db.memory)
493
+ * - fresh-install / no-data DBs (sessions table empty or missing)
494
+ *
495
+ * Each call writes to a distinct path; v5 and v7 produce separate files.
496
+ */
497
+ export function backupBeforeDestructive(db, fromVersion) {
498
+ if (db.memory)
499
+ return null;
500
+ const dbPath = db.name;
501
+ if (!dbPath)
502
+ return null;
503
+ if (!tableExists(db, 'sessions'))
504
+ return null;
505
+ const sessions = db.prepare(`SELECT COUNT(*) AS c FROM sessions`).get();
506
+ if (sessions.c === 0)
507
+ return null;
508
+ const backupDir = join(dirname(dbPath), 'backups');
509
+ mkdirSync(backupDir, { recursive: true });
510
+ const ts = new Date().toISOString().replace(/[:.]/g, '-');
511
+ const backupPath = join(backupDir, `spool-pre-v${fromVersion + 1}-${ts}.db`);
512
+ db.exec(`VACUUM INTO '${backupPath.replace(/'/g, "''")}'`);
513
+ return backupPath;
514
+ }
320
515
  function rebuildFtsTableIfEmpty(db, contentTable, ftsTable) {
321
516
  const sourceCount = db.prepare(`SELECT COUNT(*) AS count FROM ${contentTable}`).get().count;
322
517
  if (sourceCount === 0)
package/dist/db/db.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,32 @@
1
1
  import type Database from 'better-sqlite3';
2
- import type { Session, Message, FragmentResult, StatusInfo, SessionSource, StarKind, StarredItem } from '../types.js';
3
- export declare function getOrCreateProject(db: Database.Database, sourceId: number, slug: string, displayPath: string, displayName: string): number;
2
+ import type { Session, Message, FragmentResult, StatusInfo, SessionSource, ProjectIdentityKind } from '../types.js';
3
+ export declare function getOrCreateProject(db: Database.Database, sourceId: number, slug: string, displayPath: string, displayName: string, identity: {
4
+ identityKind: ProjectIdentityKind;
5
+ identityKey: string;
6
+ }): number;
4
7
  export declare function getSourceId(db: Database.Database, name: SessionSource): number;
8
+ /**
9
+ * Get/create the virtual "Asks" project that holds Spool-authored agent-search
10
+ * sessions. One per source so each agent's sessions stay grouped under their
11
+ * own row in project_groups_v (joined by identity for cross-source grouping).
12
+ */
13
+ export declare function getOrCreateAskProject(db: Database.Database, source: SessionSource): number;
14
+ /**
15
+ * Insert a session row authored by Spool itself (e.g. agent search). Title is
16
+ * locked via title_source='spool' so subsequent sync of the source-side JSONL
17
+ * won't overwrite it. file_path uses a sentinel ('spool:pending:<uuid>') that
18
+ * upsertSession rebinds to the real path when sync first sees the JSONL.
19
+ *
20
+ * Idempotent: if a row with the same session_uuid already exists, returns its
21
+ * id without modifying anything.
22
+ */
23
+ export declare function insertSpoolAuthoredSession(db: Database.Database, opts: {
24
+ projectId: number;
25
+ sourceId: number;
26
+ sessionUuid: string;
27
+ title: string;
28
+ cwd: string;
29
+ }): number;
5
30
  export declare function getSessionMtime(db: Database.Database, filePath: string): string | null;
6
31
  export declare function deleteSessionByFilePath(db: Database.Database, filePath: string): boolean;
7
32
  export declare function getAllSessionMtimes(db: Database.Database): Map<string, string>;
@@ -35,6 +60,7 @@ export declare function insertMessages(db: Database.Database, sessionId: number,
35
60
  toolNames: string[];
36
61
  seq: number;
37
62
  }>): void;
63
+ export declare const SESSION_SELECT = "\n SELECT\n s.id, s.project_id AS projectId, s.source_id AS sourceId,\n s.session_uuid AS sessionUuid, s.file_path AS filePath,\n s.title, s.started_at AS startedAt, s.ended_at AS endedAt,\n s.message_count AS messageCount, s.has_tool_use AS hasToolUse,\n s.cwd, s.model,\n src.name AS source,\n p.display_path AS projectDisplayPath,\n p.display_name AS projectDisplayName\n FROM sessions s\n JOIN sources src ON src.id = s.source_id\n JOIN projects p ON p.id = s.project_id";
38
64
  export declare function listRecentSessions(db: Database.Database, limit?: number): Session[];
39
65
  export declare function getSessionWithMessages(db: Database.Database, sessionUuid: string): {
40
66
  session: Session;
@@ -44,7 +70,8 @@ export declare function searchFragments(db: Database.Database, query: string, op
44
70
  limit?: number;
45
71
  source?: SessionSource;
46
72
  since?: string;
47
- onlyStarred?: boolean;
73
+ onlyPinned?: boolean;
74
+ identityKey?: string;
48
75
  }): FragmentResult[];
49
76
  export declare function searchSessionPreview(db: Database.Database, query: string, opts?: {
50
77
  limit?: number;
@@ -52,12 +79,11 @@ export declare function searchSessionPreview(db: Database.Database, query: strin
52
79
  since?: string;
53
80
  }): FragmentResult[];
54
81
  export declare function buildLikeSnippet(text: string, terms: string[]): string;
55
- export declare function starItem(db: Database.Database, kind: StarKind, uuid: string): void;
56
- export declare function unstarItem(db: Database.Database, kind: StarKind, uuid: string): void;
57
- export declare function isStarred(db: Database.Database, kind: StarKind, uuid: string): boolean;
58
- export declare function getStarredUuidsByType(db: Database.Database): {
59
- session: string[];
60
- };
61
- export declare function listStarredItems(db: Database.Database, limit?: number): StarredItem[];
82
+ export declare function pinSession(db: Database.Database, sessionUuid: string): void;
83
+ export declare function unpinSession(db: Database.Database, sessionUuid: string): void;
84
+ export declare function isPinned(db: Database.Database, sessionUuid: string): boolean;
85
+ export declare function getPinnedUuids(db: Database.Database): string[];
86
+ export declare function listPinnedSessions(db: Database.Database): Session[];
62
87
  export declare function getStatus(db: Database.Database): StatusInfo;
88
+ export declare function rowToSession(r: Record<string, unknown>): Session;
63
89
  //# sourceMappingURL=queries.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}