@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.
- package/dist/db/db.d.ts +19 -0
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +210 -15
- package/dist/db/db.js.map +1 -1
- package/dist/db/queries.d.ts +36 -10
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +96 -75
- package/dist/db/queries.js.map +1 -1
- package/dist/db/share-drafts.d.ts +51 -0
- package/dist/db/share-drafts.d.ts.map +1 -0
- package/dist/db/share-drafts.js +47 -0
- package/dist/db/share-drafts.js.map +1 -0
- package/dist/doctor/checks/config.d.ts +3 -0
- package/dist/doctor/checks/config.d.ts.map +1 -0
- package/dist/doctor/checks/config.js +123 -0
- package/dist/doctor/checks/config.js.map +1 -0
- package/dist/doctor/checks/db.d.ts +3 -0
- package/dist/doctor/checks/db.d.ts.map +1 -0
- package/dist/doctor/checks/db.js +225 -0
- package/dist/doctor/checks/db.js.map +1 -0
- package/dist/doctor/checks/env.d.ts +3 -0
- package/dist/doctor/checks/env.d.ts.map +1 -0
- package/dist/doctor/checks/env.js +70 -0
- package/dist/doctor/checks/env.js.map +1 -0
- package/dist/doctor/checks/index.d.ts +3 -0
- package/dist/doctor/checks/index.d.ts.map +1 -0
- package/dist/doctor/checks/index.js +13 -0
- package/dist/doctor/checks/index.js.map +1 -0
- package/dist/doctor/checks/native.d.ts +3 -0
- package/dist/doctor/checks/native.d.ts.map +1 -0
- package/dist/doctor/checks/native.js +42 -0
- package/dist/doctor/checks/native.js.map +1 -0
- package/dist/doctor/checks/versions.d.ts +3 -0
- package/dist/doctor/checks/versions.d.ts.map +1 -0
- package/dist/doctor/checks/versions.js +79 -0
- package/dist/doctor/checks/versions.js.map +1 -0
- package/dist/doctor/index.d.ts +3 -0
- package/dist/doctor/index.d.ts.map +1 -0
- package/dist/doctor/index.js +3 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/preflight.d.ts +18 -0
- package/dist/doctor/preflight.d.ts.map +1 -0
- package/dist/doctor/preflight.js +27 -0
- package/dist/doctor/preflight.js.map +1 -0
- package/dist/doctor/runner.d.ts +12 -0
- package/dist/doctor/runner.d.ts.map +1 -0
- package/dist/doctor/runner.js +37 -0
- package/dist/doctor/runner.js.map +1 -0
- package/dist/doctor/types.d.ts +27 -0
- package/dist/doctor/types.d.ts.map +1 -0
- package/dist/doctor/types.js +2 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/migrations/agent-search-cleanup.d.ts +36 -0
- package/dist/migrations/agent-search-cleanup.d.ts.map +1 -0
- package/dist/migrations/agent-search-cleanup.js +182 -0
- package/dist/migrations/agent-search-cleanup.js.map +1 -0
- package/dist/migrations/worktree-identity-upgrade.d.ts +31 -0
- package/dist/migrations/worktree-identity-upgrade.d.ts.map +1 -0
- package/dist/migrations/worktree-identity-upgrade.js +22 -0
- package/dist/migrations/worktree-identity-upgrade.js.map +1 -0
- package/dist/parsers/claude.d.ts.map +1 -1
- package/dist/parsers/claude.js +25 -12
- package/dist/parsers/claude.js.map +1 -1
- package/dist/parsers/codex.d.ts.map +1 -1
- package/dist/parsers/codex.js +32 -5
- package/dist/parsers/codex.js.map +1 -1
- package/dist/parsers/gemini.d.ts.map +1 -1
- package/dist/parsers/gemini.js +5 -5
- package/dist/parsers/gemini.js.map +1 -1
- package/dist/parsers/spool-prelude.d.ts +16 -0
- package/dist/parsers/spool-prelude.d.ts.map +1 -0
- package/dist/parsers/spool-prelude.js +21 -0
- package/dist/parsers/spool-prelude.js.map +1 -0
- package/dist/projects/display-name.d.ts +2 -0
- package/dist/projects/display-name.d.ts.map +1 -0
- package/dist/projects/display-name.js +8 -0
- package/dist/projects/display-name.js.map +1 -0
- package/dist/projects/fs.d.ts +3 -0
- package/dist/projects/fs.d.ts.map +1 -0
- package/dist/projects/fs.js +20 -0
- package/dist/projects/fs.js.map +1 -0
- package/dist/projects/groups.d.ts +4 -0
- package/dist/projects/groups.d.ts.map +1 -0
- package/dist/projects/groups.js +20 -0
- package/dist/projects/groups.js.map +1 -0
- package/dist/projects/identity-synthesizers.d.ts +22 -0
- package/dist/projects/identity-synthesizers.d.ts.map +1 -0
- package/dist/projects/identity-synthesizers.js +29 -0
- package/dist/projects/identity-synthesizers.js.map +1 -0
- package/dist/projects/identity.d.ts +16 -0
- package/dist/projects/identity.d.ts.map +1 -0
- package/dist/projects/identity.js +172 -0
- package/dist/projects/identity.js.map +1 -0
- package/dist/projects/sessions.d.ts +12 -0
- package/dist/projects/sessions.d.ts.map +1 -0
- package/dist/projects/sessions.js +47 -0
- package/dist/projects/sessions.js.map +1 -0
- package/dist/projects/worktree-resolvers.d.ts +19 -0
- package/dist/projects/worktree-resolvers.d.ts.map +1 -0
- package/dist/projects/worktree-resolvers.js +65 -0
- package/dist/projects/worktree-resolvers.js.map +1 -0
- package/dist/sync/syncer.d.ts.map +1 -1
- package/dist/sync/syncer.js +11 -3
- package/dist/sync/syncer.js.map +1 -1
- package/dist/types.d.ts +15 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/connectors/capabilities/cookies-chrome.d.ts +0 -19
- package/dist/connectors/capabilities/cookies-chrome.d.ts.map +0 -1
- package/dist/connectors/capabilities/cookies-chrome.js +0 -199
- package/dist/connectors/capabilities/cookies-chrome.js.map +0 -1
- package/dist/connectors/capabilities/exec-impl.d.ts +0 -3
- package/dist/connectors/capabilities/exec-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/exec-impl.js +0 -108
- package/dist/connectors/capabilities/exec-impl.js.map +0 -1
- package/dist/connectors/capabilities/fetch-impl.d.ts +0 -3
- package/dist/connectors/capabilities/fetch-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/fetch-impl.js +0 -4
- package/dist/connectors/capabilities/fetch-impl.js.map +0 -1
- package/dist/connectors/capabilities/index.d.ts +0 -6
- package/dist/connectors/capabilities/index.d.ts.map +0 -1
- package/dist/connectors/capabilities/index.js +0 -6
- package/dist/connectors/capabilities/index.js.map +0 -1
- package/dist/connectors/capabilities/log-impl.d.ts +0 -3
- package/dist/connectors/capabilities/log-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/log-impl.js +0 -26
- package/dist/connectors/capabilities/log-impl.js.map +0 -1
- package/dist/connectors/capabilities/sqlite-impl.d.ts +0 -3
- package/dist/connectors/capabilities/sqlite-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/sqlite-impl.js +0 -19
- package/dist/connectors/capabilities/sqlite-impl.js.map +0 -1
- package/dist/connectors/loader.d.ts +0 -47
- package/dist/connectors/loader.d.ts.map +0 -1
- package/dist/connectors/loader.js +0 -328
- package/dist/connectors/loader.js.map +0 -1
- package/dist/connectors/npm-install.d.ts +0 -26
- package/dist/connectors/npm-install.d.ts.map +0 -1
- package/dist/connectors/npm-install.js +0 -74
- package/dist/connectors/npm-install.js.map +0 -1
- package/dist/connectors/prerequisites.d.ts +0 -14
- package/dist/connectors/prerequisites.d.ts.map +0 -1
- package/dist/connectors/prerequisites.js +0 -109
- package/dist/connectors/prerequisites.js.map +0 -1
- package/dist/connectors/registry-fetch.d.ts +0 -22
- package/dist/connectors/registry-fetch.d.ts.map +0 -1
- package/dist/connectors/registry-fetch.js +0 -54
- package/dist/connectors/registry-fetch.js.map +0 -1
- package/dist/connectors/registry.d.ts +0 -23
- package/dist/connectors/registry.d.ts.map +0 -1
- package/dist/connectors/registry.js +0 -59
- package/dist/connectors/registry.js.map +0 -1
- package/dist/connectors/sync-engine.d.ts +0 -31
- package/dist/connectors/sync-engine.d.ts.map +0 -1
- package/dist/connectors/sync-engine.js +0 -604
- package/dist/connectors/sync-engine.js.map +0 -1
- package/dist/connectors/sync-scheduler.d.ts +0 -56
- package/dist/connectors/sync-scheduler.d.ts.map +0 -1
- package/dist/connectors/sync-scheduler.js +0 -238
- package/dist/connectors/sync-scheduler.js.map +0 -1
- package/dist/connectors/trust-store.d.ts +0 -13
- package/dist/connectors/trust-store.d.ts.map +0 -1
- package/dist/connectors/trust-store.js +0 -48
- package/dist/connectors/trust-store.js.map +0 -1
- package/dist/connectors/types.d.ts +0 -111
- package/dist/connectors/types.d.ts.map +0 -1
- package/dist/connectors/types.js +0 -50
- 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
|
package/dist/db/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;
|
|
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
|
|
222
|
-
//
|
|
223
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
242
|
+
if (tableExists(db, 'captures_fts')) {
|
|
233
243
|
db.exec("INSERT INTO captures_fts(captures_fts) VALUES('rebuild')");
|
|
234
244
|
}
|
|
235
|
-
|
|
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
|
-
|
|
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
|
|
289
|
-
//
|
|
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":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"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"}
|
package/dist/db/queries.d.ts
CHANGED
|
@@ -1,7 +1,32 @@
|
|
|
1
1
|
import type Database from 'better-sqlite3';
|
|
2
|
-
import type { Session, Message, FragmentResult, StatusInfo, SessionSource,
|
|
3
|
-
export declare function getOrCreateProject(db: Database.Database, sourceId: number, slug: string, displayPath: string, displayName: string
|
|
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
|
-
|
|
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
|
|
56
|
-
export declare function
|
|
57
|
-
export declare function
|
|
58
|
-
export declare function
|
|
59
|
-
|
|
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
|
package/dist/db/queries.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAmB,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}
|