@spool-lab/core 0.5.2 → 0.6.0
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 +1 -1
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +82 -2
- package/dist/db/db.js.map +1 -1
- package/dist/db/published-shares-cache.d.ts +39 -0
- package/dist/db/published-shares-cache.d.ts.map +1 -0
- package/dist/db/published-shares-cache.js +60 -0
- package/dist/db/published-shares-cache.js.map +1 -0
- package/dist/db/queries.d.ts +5 -0
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +146 -29
- package/dist/db/queries.js.map +1 -1
- package/dist/db/search-query.d.ts +7 -0
- package/dist/db/search-query.d.ts.map +1 -1
- package/dist/db/search-query.js +26 -0
- package/dist/db/search-query.js.map +1 -1
- package/dist/db/share-drafts.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/migrations/worktree-identity-upgrade.d.ts +5 -3
- package/dist/migrations/worktree-identity-upgrade.d.ts.map +1 -1
- package/dist/migrations/worktree-identity-upgrade.js +23 -2
- package/dist/migrations/worktree-identity-upgrade.js.map +1 -1
- package/dist/observability/exporter-file.d.ts.map +1 -1
- package/dist/observability/exporter-pretty.d.ts.map +1 -1
- package/dist/observability/exporter-pretty.js.map +1 -1
- package/dist/parsers/claude.d.ts.map +1 -1
- package/dist/parsers/claude.js +4 -144
- package/dist/parsers/claude.js.map +1 -1
- package/dist/parsers/codex.d.ts +7 -1
- package/dist/parsers/codex.d.ts.map +1 -1
- package/dist/parsers/codex.js +47 -186
- package/dist/parsers/codex.js.map +1 -1
- package/dist/parsers/gemini.d.ts.map +1 -1
- package/dist/parsers/gemini.js +102 -2
- package/dist/parsers/gemini.js.map +1 -1
- package/dist/parsers/pi.d.ts +18 -0
- package/dist/parsers/pi.d.ts.map +1 -0
- package/dist/parsers/pi.js +154 -0
- package/dist/parsers/pi.js.map +1 -0
- package/dist/parsers/spool-prelude.d.ts +1 -15
- package/dist/parsers/spool-prelude.d.ts.map +1 -1
- package/dist/parsers/spool-prelude.js +3 -20
- package/dist/parsers/spool-prelude.js.map +1 -1
- package/dist/projects/groups.d.ts +4 -1
- package/dist/projects/groups.d.ts.map +1 -1
- package/dist/projects/groups.js +26 -9
- package/dist/projects/groups.js.map +1 -1
- package/dist/projects/identity.d.ts +1 -1
- package/dist/projects/identity.d.ts.map +1 -1
- package/dist/projects/identity.js +12 -1
- package/dist/projects/identity.js.map +1 -1
- package/dist/projects/sessions.js.map +1 -1
- package/dist/projects/worktree-resolvers.d.ts +3 -0
- package/dist/projects/worktree-resolvers.d.ts.map +1 -1
- package/dist/projects/worktree-resolvers.js +130 -2
- package/dist/projects/worktree-resolvers.js.map +1 -1
- package/dist/security/profile.d.ts.map +1 -1
- package/dist/security/profile.js +2 -3
- package/dist/security/profile.js.map +1 -1
- package/dist/security/purge.d.ts.map +1 -1
- package/dist/security/purge.js +12 -0
- package/dist/security/purge.js.map +1 -1
- package/dist/security/worker.js +1 -1
- package/dist/security/worker.js.map +1 -1
- package/dist/sync/source-paths.d.ts.map +1 -1
- package/dist/sync/source-paths.js +47 -11
- package/dist/sync/source-paths.js.map +1 -1
- package/dist/sync/syncer.d.ts.map +1 -1
- package/dist/sync/syncer.js +50 -42
- package/dist/sync/syncer.js.map +1 -1
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +3 -1
- package/dist/sync/watcher.js.map +1 -1
- package/dist/types.d.ts +8 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/util/resolve-bin.js.map +1 -1
- package/package.json +7 -4
package/dist/db/db.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export declare const DB_PATH: string;
|
|
|
6
6
|
* Latest schema version the running build knows how to migrate to.
|
|
7
7
|
* Bump in lockstep with the last `db.pragma('user_version = N')` in runMigrations.
|
|
8
8
|
*/
|
|
9
|
-
export declare const LATEST_SCHEMA_VERSION =
|
|
9
|
+
export declare const LATEST_SCHEMA_VERSION = 15;
|
|
10
10
|
export interface OpenOptions {
|
|
11
11
|
/** Worker-thread callers should pass `false` — the main process has
|
|
12
12
|
* already run migrations on the shared DB file before spawning, and
|
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;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,MAAM,WAAW,WAAW;IAC1B;;;;oEAIgE;IAChE,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAqBpE;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,
|
|
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,MAAM,WAAW,WAAW;IAC1B;;;;oEAIgE;IAChE,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAqBpE;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,CAmqBzD;AAgCD,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,UAAU,QAgB9E;AA8BD;;;;;;;;;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
|
@@ -12,7 +12,7 @@ export const DB_PATH = join(SPOOL_DIR, 'spool.db');
|
|
|
12
12
|
* Latest schema version the running build knows how to migrate to.
|
|
13
13
|
* Bump in lockstep with the last `db.pragma('user_version = N')` in runMigrations.
|
|
14
14
|
*/
|
|
15
|
-
export const LATEST_SCHEMA_VERSION =
|
|
15
|
+
export const LATEST_SCHEMA_VERSION = 15;
|
|
16
16
|
let _db = null;
|
|
17
17
|
let _wasNewDb = false;
|
|
18
18
|
let _initialUserVersion = null;
|
|
@@ -63,7 +63,8 @@ export function runMigrations(db) {
|
|
|
63
63
|
('claude', '~/.claude/projects'),
|
|
64
64
|
('codex', '~/.codex/sessions'),
|
|
65
65
|
('gemini', '~/.gemini/tmp'),
|
|
66
|
-
('opencode', '~/.local/share/opencode/opencode.db')
|
|
66
|
+
('opencode', '~/.local/share/opencode/opencode.db'),
|
|
67
|
+
('pi', '~/.pi/agent/sessions');
|
|
67
68
|
|
|
68
69
|
CREATE TABLE IF NOT EXISTS projects (
|
|
69
70
|
id INTEGER PRIMARY KEY,
|
|
@@ -628,9 +629,88 @@ export function runMigrations(db) {
|
|
|
628
629
|
db.pragma('user_version = 14');
|
|
629
630
|
})();
|
|
630
631
|
}
|
|
632
|
+
if (version < 15) {
|
|
633
|
+
// v15: published_shares_cache — local mirror of /api/me/shares so the
|
|
634
|
+
// Published tab in SharesPage renders instantly on cold start and
|
|
635
|
+
// remains readable when the user is offline. This is NOT the source
|
|
636
|
+
// of truth — the canonical published index lives in the share backend's
|
|
637
|
+
// D1. Rows are upserted whenever myShares() succeeds; entries that
|
|
638
|
+
// disappear from the remote response are cleared via clearAll +
|
|
639
|
+
// upsertMany on each successful fetch.
|
|
640
|
+
//
|
|
641
|
+
// `draft_id` mirrors the same column on the backend's published_shares
|
|
642
|
+
// and is the link from a share back to its editable source in
|
|
643
|
+
// share_drafts. The Share popover queries this index to decide
|
|
644
|
+
// between the publish form and the manage view when an editor mounts
|
|
645
|
+
// for a given draft. Nullable only to accommodate pre-v0.5.0 rows
|
|
646
|
+
// published before the column existed; every new publish writes a
|
|
647
|
+
// non-null value.
|
|
648
|
+
// `client_request_id` mirrors the backend's `published_shares
|
|
649
|
+
// .client_request_id` — the content hash that drove the publish.
|
|
650
|
+
// The editor recomputes the same hash on the live draft and
|
|
651
|
+
// compares; a mismatch surfaces the "Unpublished edits" badge in
|
|
652
|
+
// the manage view so the user knows their next Republish click
|
|
653
|
+
// will actually change something on spool.pro.
|
|
654
|
+
db.exec(`
|
|
655
|
+
CREATE TABLE IF NOT EXISTS published_shares_cache (
|
|
656
|
+
id TEXT PRIMARY KEY,
|
|
657
|
+
title TEXT NOT NULL DEFAULT '',
|
|
658
|
+
visibility TEXT NOT NULL,
|
|
659
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
660
|
+
published_at INTEGER NOT NULL,
|
|
661
|
+
revoked_at INTEGER,
|
|
662
|
+
draft_id TEXT,
|
|
663
|
+
client_request_id TEXT,
|
|
664
|
+
updated_at INTEGER NOT NULL
|
|
665
|
+
);
|
|
666
|
+
CREATE INDEX IF NOT EXISTS idx_published_shares_cache_published_at
|
|
667
|
+
ON published_shares_cache(published_at DESC);
|
|
668
|
+
CREATE INDEX IF NOT EXISTS idx_published_shares_cache_draft_id
|
|
669
|
+
ON published_shares_cache(draft_id) WHERE draft_id IS NOT NULL;
|
|
670
|
+
`);
|
|
671
|
+
db.pragma('user_version = 15');
|
|
672
|
+
}
|
|
631
673
|
rebuildFtsTableIfEmpty(db, 'messages', 'messages_fts_trigram');
|
|
632
674
|
rebuildFtsTableIfEmpty(db, 'session_search', 'session_search_fts');
|
|
633
675
|
rebuildFtsTableIfEmpty(db, 'session_search', 'session_search_fts_trigram');
|
|
676
|
+
// Identity resolution depends on live checkouts and worktree-tool state,
|
|
677
|
+
// which can improve independently of the DB schema (for example, Orca is
|
|
678
|
+
// installed after Spool, or a previously missing worktree is recreated).
|
|
679
|
+
// Reconcile cheap `path` fallbacks on every open instead of stranding them
|
|
680
|
+
// behind a one-time schema migration forever.
|
|
681
|
+
db.transaction(() => {
|
|
682
|
+
upgradeWorktreeIdentities(db, realFs);
|
|
683
|
+
})();
|
|
684
|
+
recreateProjectGroupsView(db);
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* project_groups_v is the single definition of cross-source project grouping
|
|
688
|
+
* (consumed by projects/groups.ts). It holds no data, so instead of being
|
|
689
|
+
* frozen at its migration-time definition (v6) it is dropped and recreated on
|
|
690
|
+
* every launch — old and new installs always run the definition below.
|
|
691
|
+
*
|
|
692
|
+
* The path/cwd aggregates use JSON_GROUP_ARRAY rather than GROUP_CONCAT so
|
|
693
|
+
* paths containing commas survive round-tripping (e.g. "/Users/me/foo,bar").
|
|
694
|
+
*/
|
|
695
|
+
function recreateProjectGroupsView(db) {
|
|
696
|
+
db.exec(`
|
|
697
|
+
DROP VIEW IF EXISTS project_groups_v;
|
|
698
|
+
CREATE VIEW project_groups_v AS
|
|
699
|
+
SELECT
|
|
700
|
+
p.identity_kind,
|
|
701
|
+
p.identity_key,
|
|
702
|
+
MIN(p.display_name) AS display_name,
|
|
703
|
+
GROUP_CONCAT(DISTINCT src.name) AS sources_csv,
|
|
704
|
+
JSON_GROUP_ARRAY(DISTINCT p.display_path) FILTER (WHERE p.display_path IS NOT NULL AND p.display_path <> '') AS display_paths_json,
|
|
705
|
+
JSON_GROUP_ARRAY(DISTINCT s.cwd) FILTER (WHERE s.cwd IS NOT NULL AND s.cwd <> '') AS cwds_json,
|
|
706
|
+
COUNT(s.id) AS session_count,
|
|
707
|
+
MAX(s.started_at) AS last_session_at
|
|
708
|
+
FROM projects p
|
|
709
|
+
JOIN sources src ON src.id = p.source_id
|
|
710
|
+
LEFT JOIN sessions s ON s.project_id = p.id AND s.message_count > 0
|
|
711
|
+
WHERE p.identity_kind IS NOT NULL
|
|
712
|
+
GROUP BY p.identity_kind, p.identity_key;
|
|
713
|
+
`);
|
|
634
714
|
}
|
|
635
715
|
export function backfillProjectIdentities(db, fs) {
|
|
636
716
|
const rows = db.prepare(`SELECT id, display_path FROM projects WHERE identity_kind IS NULL`).all();
|
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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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
/** Row shape persisted in `published_shares_cache`. Mirrors the
|
|
3
|
+
* `MyShare` payload the share-backend returns from `/api/me/shares`,
|
|
4
|
+
* with timestamps stored as epoch-millis integers. `draft_id` is the
|
|
5
|
+
* link back to share_drafts; non-null for every share published from
|
|
6
|
+
* v0.5.0 onward, nullable for pre-existing rows surfaced through
|
|
7
|
+
* legacy `/api/me/shares` responses. `client_request_id` is the
|
|
8
|
+
* publish-time content hash, used by the editor's "Unpublished
|
|
9
|
+
* edits" badge to detect drift between the live draft and the
|
|
10
|
+
* currently-published snapshot. */
|
|
11
|
+
export interface PublishedShareCacheItem {
|
|
12
|
+
id: string;
|
|
13
|
+
title: string;
|
|
14
|
+
visibility: string;
|
|
15
|
+
version: number;
|
|
16
|
+
published_at: number;
|
|
17
|
+
revoked_at: number | null;
|
|
18
|
+
draft_id: string | null;
|
|
19
|
+
client_request_id: string | null;
|
|
20
|
+
updated_at: number;
|
|
21
|
+
}
|
|
22
|
+
/** Returns all cached published shares ordered by publish date desc. */
|
|
23
|
+
export declare function listAll(db: Database.Database): PublishedShareCacheItem[];
|
|
24
|
+
/** Look up the most recent share for a given draft, or null. The index
|
|
25
|
+
* on draft_id makes this O(log n); we return the most recently
|
|
26
|
+
* published row in the rare case multiple shares share a draft_id
|
|
27
|
+
* (e.g., a revoke + re-publish that bumped the slug). */
|
|
28
|
+
export declare function getByDraftId(db: Database.Database, draftId: string): PublishedShareCacheItem | null;
|
|
29
|
+
/** Per-row upsert. Useful for partial updates (e.g., a single revoke);
|
|
30
|
+
* the renderer typically uses {@link replaceAll} for full syncs. */
|
|
31
|
+
export declare function upsertMany(db: Database.Database, items: ReadonlyArray<PublishedShareCacheItem>): void;
|
|
32
|
+
/** Replaces the cache contents with `items` (wipes rows not present). */
|
|
33
|
+
export declare function replaceAll(db: Database.Database, items: ReadonlyArray<PublishedShareCacheItem>): void;
|
|
34
|
+
export declare function clearAll(db: Database.Database): void;
|
|
35
|
+
/** Flip a single row's revoked_at without touching the rest. Used by
|
|
36
|
+
* the renderer-side revoke IPC so the cache (and any open editor)
|
|
37
|
+
* reflects the unpublish without waiting for the next myShares poll. */
|
|
38
|
+
export declare function markRevoked(db: Database.Database, id: string, revokedAt: number): void;
|
|
39
|
+
//# sourceMappingURL=published-shares-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"published-shares-cache.d.ts","sourceRoot":"","sources":["../../src/db/published-shares-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAE1C;;;;;;;;oCAQoC;AACpC,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,UAAU,EAAE,MAAM,CAAA;CACnB;AAKD,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,uBAAuB,EAAE,CAIxE;AAED;;;0DAG0D;AAC1D,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,GACd,uBAAuB,GAAG,IAAI,CAWhC;AAED;qEACqE;AACrE,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,aAAa,CAAC,uBAAuB,CAAC,GAC5C,IAAI,CAiBN;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,aAAa,CAAC,uBAAuB,CAAC,GAC5C,IAAI,CASN;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAEpD;AAED;;yEAEyE;AACzE,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAChB,IAAI,CAMN"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const COLS = 'id, title, visibility, version, published_at, revoked_at, draft_id, client_request_id, updated_at';
|
|
2
|
+
/** Returns all cached published shares ordered by publish date desc. */
|
|
3
|
+
export function listAll(db) {
|
|
4
|
+
return db
|
|
5
|
+
.prepare(`SELECT ${COLS} FROM published_shares_cache ORDER BY published_at DESC`)
|
|
6
|
+
.all();
|
|
7
|
+
}
|
|
8
|
+
/** Look up the most recent share for a given draft, or null. The index
|
|
9
|
+
* on draft_id makes this O(log n); we return the most recently
|
|
10
|
+
* published row in the rare case multiple shares share a draft_id
|
|
11
|
+
* (e.g., a revoke + re-publish that bumped the slug). */
|
|
12
|
+
export function getByDraftId(db, draftId) {
|
|
13
|
+
return (db
|
|
14
|
+
.prepare(`SELECT ${COLS} FROM published_shares_cache
|
|
15
|
+
WHERE draft_id = ?
|
|
16
|
+
ORDER BY published_at DESC
|
|
17
|
+
LIMIT 1`)
|
|
18
|
+
.get(draftId) ?? null);
|
|
19
|
+
}
|
|
20
|
+
/** Per-row upsert. Useful for partial updates (e.g., a single revoke);
|
|
21
|
+
* the renderer typically uses {@link replaceAll} for full syncs. */
|
|
22
|
+
export function upsertMany(db, items) {
|
|
23
|
+
const stmt = db.prepare(`INSERT INTO published_shares_cache (${COLS})
|
|
24
|
+
VALUES (@id, @title, @visibility, @version, @published_at, @revoked_at, @draft_id, @client_request_id, @updated_at)
|
|
25
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
26
|
+
title = excluded.title,
|
|
27
|
+
visibility = excluded.visibility,
|
|
28
|
+
version = excluded.version,
|
|
29
|
+
published_at = excluded.published_at,
|
|
30
|
+
revoked_at = excluded.revoked_at,
|
|
31
|
+
draft_id = excluded.draft_id,
|
|
32
|
+
client_request_id = excluded.client_request_id,
|
|
33
|
+
updated_at = excluded.updated_at`);
|
|
34
|
+
db.transaction(() => {
|
|
35
|
+
for (const it of items)
|
|
36
|
+
stmt.run(it);
|
|
37
|
+
})();
|
|
38
|
+
}
|
|
39
|
+
/** Replaces the cache contents with `items` (wipes rows not present). */
|
|
40
|
+
export function replaceAll(db, items) {
|
|
41
|
+
db.transaction(() => {
|
|
42
|
+
db.prepare('DELETE FROM published_shares_cache').run();
|
|
43
|
+
const stmt = db.prepare(`INSERT INTO published_shares_cache (${COLS})
|
|
44
|
+
VALUES (@id, @title, @visibility, @version, @published_at, @revoked_at, @draft_id, @client_request_id, @updated_at)`);
|
|
45
|
+
for (const it of items)
|
|
46
|
+
stmt.run(it);
|
|
47
|
+
})();
|
|
48
|
+
}
|
|
49
|
+
export function clearAll(db) {
|
|
50
|
+
db.prepare('DELETE FROM published_shares_cache').run();
|
|
51
|
+
}
|
|
52
|
+
/** Flip a single row's revoked_at without touching the rest. Used by
|
|
53
|
+
* the renderer-side revoke IPC so the cache (and any open editor)
|
|
54
|
+
* reflects the unpublish without waiting for the next myShares poll. */
|
|
55
|
+
export function markRevoked(db, id, revokedAt) {
|
|
56
|
+
db.prepare(`UPDATE published_shares_cache
|
|
57
|
+
SET revoked_at = ?, updated_at = ?
|
|
58
|
+
WHERE id = ?`).run(revokedAt, revokedAt, id);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=published-shares-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"published-shares-cache.js","sourceRoot":"","sources":["../../src/db/published-shares-cache.ts"],"names":[],"mappings":"AAuBA,MAAM,IAAI,GACR,mGAAmG,CAAA;AAErG,wEAAwE;AACxE,MAAM,UAAU,OAAO,CAAC,EAAqB;IAC3C,OAAO,EAAE;SACN,OAAO,CAAC,UAAU,IAAI,yDAAyD,CAAC;SAChF,GAAG,EAA+B,CAAA;AACvC,CAAC;AAED;;;0DAG0D;AAC1D,MAAM,UAAU,YAAY,CAC1B,EAAqB,EACrB,OAAe;IAEf,OAAO,CACJ,EAAE;SACA,OAAO,CACN,UAAU,IAAI;;;iBAGL,CACV;SACA,GAAG,CAAC,OAAO,CAAyC,IAAI,IAAI,CAChE,CAAA;AACH,CAAC;AAED;qEACqE;AACrE,MAAM,UAAU,UAAU,CACxB,EAAqB,EACrB,KAA6C;IAE7C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,uCAAuC,IAAI;;;;;;;;;;+CAUA,CAC5C,CAAA;IACD,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAClB,KAAK,MAAM,EAAE,IAAI,KAAK;YAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACtC,CAAC,CAAC,EAAE,CAAA;AACN,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,UAAU,CACxB,EAAqB,EACrB,KAA6C;IAE7C,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAClB,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAE,CAAA;QACtD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,uCAAuC,IAAI;2HAC0E,CACtH,CAAA;QACD,KAAK,MAAM,EAAE,IAAI,KAAK;YAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACtC,CAAC,CAAC,EAAE,CAAA;AACN,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAqB;IAC5C,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAE,CAAA;AACxD,CAAC;AAED;;yEAEyE;AACzE,MAAM,UAAU,WAAW,CACzB,EAAqB,EACrB,EAAU,EACV,SAAiB;IAEjB,EAAE,CAAC,OAAO,CACR;;kBAEc,CACf,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;AACjC,CAAC"}
|
package/dist/db/queries.d.ts
CHANGED
|
@@ -65,6 +65,10 @@ export declare function upsertSessionSearch(db: Database.Database, opts: {
|
|
|
65
65
|
userText: string;
|
|
66
66
|
assistantText: string;
|
|
67
67
|
}): void;
|
|
68
|
+
/** Rebuild the denormalized session-level search document from the authoritative
|
|
69
|
+
* session title and current message rows. Security purge calls this inside its
|
|
70
|
+
* transaction so raw values cannot survive in either session-level FTS index. */
|
|
71
|
+
export declare function refreshSessionSearchFromMessages(db: Database.Database, sessionId: number): void;
|
|
68
72
|
/** Insert message rows, skipping any that collide with the partial
|
|
69
73
|
* UNIQUE index on (session_id, msg_uuid). Returns the count of rows
|
|
70
74
|
* actually inserted — callers use this to decide whether anything
|
|
@@ -103,6 +107,7 @@ export declare function insertMessages(db: Database.Database, sessionId: number,
|
|
|
103
107
|
* collapse is intentional, not a lost signal. */
|
|
104
108
|
export declare function getMessageSnapshot(db: Database.Database, sessionUuid: string): {
|
|
105
109
|
firstUuid: string | null;
|
|
110
|
+
lastUuid: string | null;
|
|
106
111
|
total: number;
|
|
107
112
|
};
|
|
108
113
|
/** Refresh `sessions.message_count` for a single session from the
|
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,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAIpI,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE;IAAE,YAAY,EAAE,mBAAmB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACnE,MAAM,
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}
|
package/dist/db/queries.js
CHANGED
|
@@ -1,16 +1,41 @@
|
|
|
1
1
|
import { DB_PATH, getDBSize } from './db.js';
|
|
2
|
-
import { buildSearchPlan, canUseSessionSearchFts, getNaturalSearchPhrase, getNaturalSearchTerms, selectFtsTableKind } from './search-query.js';
|
|
2
|
+
import { buildPreviewFtsPlan, buildSearchPlan, canUseSessionSearchFts, containsCjk, getNaturalSearchPhrase, getNaturalSearchTerms, selectFtsTableKind } from './search-query.js';
|
|
3
3
|
export function getOrCreateProject(db, sourceId, slug, displayPath, displayName, identity) {
|
|
4
4
|
const existing = db
|
|
5
|
-
.prepare('SELECT id FROM projects WHERE source_id = ? AND slug = ?')
|
|
5
|
+
.prepare('SELECT id, identity_kind FROM projects WHERE source_id = ? AND slug = ?')
|
|
6
6
|
.get(sourceId, slug);
|
|
7
|
-
if (existing)
|
|
7
|
+
if (existing) {
|
|
8
|
+
// Project rows predate identity grouping and are keyed by source + slug.
|
|
9
|
+
// A worktree may have been missing on first sync (stored as `path`) and
|
|
10
|
+
// become resolvable later. Refresh the row when the new signal is at least
|
|
11
|
+
// as strong, but never let a temporarily missing checkout downgrade a
|
|
12
|
+
// stable git/manifest identity back to `path`.
|
|
13
|
+
if (identityRank(identity.identityKind) >= identityRank(existing.identity_kind)) {
|
|
14
|
+
db.prepare(`
|
|
15
|
+
UPDATE projects
|
|
16
|
+
SET display_path = ?, display_name = ?, identity_kind = ?, identity_key = ?
|
|
17
|
+
WHERE id = ?
|
|
18
|
+
`).run(displayPath, displayName, identity.identityKind, identity.identityKey, existing.id);
|
|
19
|
+
}
|
|
8
20
|
return existing.id;
|
|
21
|
+
}
|
|
9
22
|
const result = db
|
|
10
23
|
.prepare('INSERT INTO projects (source_id, slug, display_path, display_name, identity_kind, identity_key) VALUES (?, ?, ?, ?, ?, ?)')
|
|
11
24
|
.run(sourceId, slug, displayPath, displayName, identity.identityKind, identity.identityKey);
|
|
12
25
|
return Number(result.lastInsertRowid);
|
|
13
26
|
}
|
|
27
|
+
function identityRank(kind) {
|
|
28
|
+
switch (kind) {
|
|
29
|
+
case 'git_remote': return 5;
|
|
30
|
+
case 'git_common_dir': return 4;
|
|
31
|
+
case 'manifest_path': return 3;
|
|
32
|
+
case 'synthetic':
|
|
33
|
+
case 'spool_internal': return 2;
|
|
34
|
+
case 'loose': return 1;
|
|
35
|
+
case 'path':
|
|
36
|
+
case null: return 0;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
14
39
|
export function getSourceId(db, name) {
|
|
15
40
|
const row = db.prepare('SELECT id FROM sources WHERE name = ?').get(name);
|
|
16
41
|
if (!row)
|
|
@@ -124,6 +149,35 @@ export function upsertSessionSearch(db, opts) {
|
|
|
124
149
|
updated_at = datetime('now')
|
|
125
150
|
`).run(opts.sessionId, opts.title, opts.userText, opts.assistantText);
|
|
126
151
|
}
|
|
152
|
+
/** Rebuild the denormalized session-level search document from the authoritative
|
|
153
|
+
* session title and current message rows. Security purge calls this inside its
|
|
154
|
+
* transaction so raw values cannot survive in either session-level FTS index. */
|
|
155
|
+
export function refreshSessionSearchFromMessages(db, sessionId) {
|
|
156
|
+
const session = db.prepare('SELECT title FROM sessions WHERE id = ?')
|
|
157
|
+
.get(sessionId);
|
|
158
|
+
if (!session)
|
|
159
|
+
return;
|
|
160
|
+
const rows = db.prepare(`
|
|
161
|
+
SELECT role, content_text AS contentText
|
|
162
|
+
FROM messages
|
|
163
|
+
WHERE session_id = ?
|
|
164
|
+
AND is_sidechain = 0
|
|
165
|
+
AND role IN ('user', 'assistant')
|
|
166
|
+
ORDER BY seq, id
|
|
167
|
+
`).all(sessionId);
|
|
168
|
+
const byRole = { user: [], assistant: [] };
|
|
169
|
+
for (const row of rows) {
|
|
170
|
+
const text = row.contentText.trim();
|
|
171
|
+
if (text)
|
|
172
|
+
byRole[row.role].push(text);
|
|
173
|
+
}
|
|
174
|
+
upsertSessionSearch(db, {
|
|
175
|
+
sessionId,
|
|
176
|
+
title: session.title ?? '',
|
|
177
|
+
userText: byRole.user.join('\n'),
|
|
178
|
+
assistantText: byRole.assistant.join('\n'),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
127
181
|
/** Insert message rows, skipping any that collide with the partial
|
|
128
182
|
* UNIQUE index on (session_id, msg_uuid). Returns the count of rows
|
|
129
183
|
* actually inserted — callers use this to decide whether anything
|
|
@@ -167,19 +221,24 @@ export function insertMessages(db, sessionId, sourceId, messages) {
|
|
|
167
221
|
* rows" — classifySync treats both as `rewrite` so the two-state
|
|
168
222
|
* collapse is intentional, not a lost signal. */
|
|
169
223
|
export function getMessageSnapshot(db, sessionUuid) {
|
|
170
|
-
// Single window-function query: pulls total
|
|
171
|
-
// index scan over (session_id, msg_uuid). `LIMIT 1`
|
|
172
|
-
// smallest-seq row; `COUNT(*) OVER ()`
|
|
173
|
-
//
|
|
174
|
-
// WHERE already scopes to one session).
|
|
175
|
-
const row = db.prepare(`SELECT m.msg_uuid AS msg_uuid,
|
|
224
|
+
// Single window-function query: pulls total plus leading and trailing
|
|
225
|
+
// uuids in one index scan over (session_id, msg_uuid). `LIMIT 1`
|
|
226
|
+
// returns the smallest-seq row; `COUNT(*) OVER ()` / `LAST_VALUE`
|
|
227
|
+
// annotate it with the partition-wide total and tail (no GROUP BY
|
|
228
|
+
// needed since the WHERE already scopes to one session).
|
|
229
|
+
const row = db.prepare(`SELECT m.msg_uuid AS msg_uuid,
|
|
230
|
+
COUNT(*) OVER () AS total,
|
|
231
|
+
LAST_VALUE(m.msg_uuid) OVER (
|
|
232
|
+
ORDER BY m.seq, m.id
|
|
233
|
+
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
|
|
234
|
+
) AS last_uuid
|
|
176
235
|
FROM messages m
|
|
177
236
|
JOIN sessions s ON s.id = m.session_id
|
|
178
237
|
WHERE s.session_uuid = ? AND m.msg_uuid IS NOT NULL
|
|
179
238
|
ORDER BY m.seq, m.id LIMIT 1`).get(sessionUuid);
|
|
180
239
|
if (!row)
|
|
181
|
-
return { firstUuid: null, total: 0 };
|
|
182
|
-
return { firstUuid: row.msg_uuid, total: row.total };
|
|
240
|
+
return { firstUuid: null, lastUuid: null, total: 0 };
|
|
241
|
+
return { firstUuid: row.msg_uuid, lastUuid: row.last_uuid, total: row.total };
|
|
183
242
|
}
|
|
184
243
|
/** Refresh `sessions.message_count` for a single session from the
|
|
185
244
|
* actual non-sidechain row count. Called after every sync's INSERT
|
|
@@ -269,15 +328,18 @@ export function searchFragments(db, query, opts = {}) {
|
|
|
269
328
|
export function searchSessionPreview(db, query, opts = {}) {
|
|
270
329
|
const { limit = 5, source, since } = opts;
|
|
271
330
|
const normalizedQuery = query.trim();
|
|
272
|
-
|
|
331
|
+
// Single-character ascii previews stay gated (a per-keystroke full scan
|
|
332
|
+
// buys nothing), but a single CJK character is a meaningful query — it
|
|
333
|
+
// takes the LIKE fallback below, as it did before the FTS preview landed.
|
|
334
|
+
if (Array.from(normalizedQuery).length < 2 && !containsCjk(normalizedQuery))
|
|
273
335
|
return [];
|
|
274
336
|
const terms = getNaturalSearchTerms(query);
|
|
275
337
|
const previewTerms = terms.length > 0 ? terms : [normalizedQuery];
|
|
276
|
-
const rows = searchPreviewRows(db, previewTerms, limit, {
|
|
338
|
+
const rows = searchPreviewRows(db, normalizedQuery, previewTerms, limit, {
|
|
277
339
|
...(source ? { source } : {}),
|
|
278
340
|
...(since ? { since } : {}),
|
|
279
341
|
});
|
|
280
|
-
const snippetRows = selectBestSessionSnippets(db, rows.map(row => row['sessionId']), previewTerms);
|
|
342
|
+
const snippetRows = selectBestSessionSnippets(db, rows.map(row => row['sessionId']), previewTerms, buildPreviewFtsPlan(normalizedQuery));
|
|
281
343
|
return rows.map((row, index) => {
|
|
282
344
|
const sessionId = row['sessionId'];
|
|
283
345
|
const snippetRow = snippetRows.get(sessionId);
|
|
@@ -348,7 +410,52 @@ function searchFragmentRows(db, ftsTable, ftsQuery, limit, opts = {}) {
|
|
|
348
410
|
`;
|
|
349
411
|
return db.prepare(sql).all(...params);
|
|
350
412
|
}
|
|
351
|
-
function searchPreviewRows(db, terms, limit, opts = {}) {
|
|
413
|
+
function searchPreviewRows(db, query, terms, limit, opts = {}) {
|
|
414
|
+
const ftsPlan = buildPreviewFtsPlan(query);
|
|
415
|
+
if (ftsPlan) {
|
|
416
|
+
return searchPreviewRowsByFts(db, query, ftsPlan, limit, opts);
|
|
417
|
+
}
|
|
418
|
+
return searchPreviewRowsByLike(db, terms, limit, opts);
|
|
419
|
+
}
|
|
420
|
+
function searchPreviewRowsByFts(db, query, plan, limit, opts = {}) {
|
|
421
|
+
const { source, since } = opts;
|
|
422
|
+
const ftsTable = plan.tableKind === 'trigram'
|
|
423
|
+
? 'session_search_fts_trigram'
|
|
424
|
+
: 'session_search_fts';
|
|
425
|
+
const conditions = [`${ftsTable} MATCH ?`];
|
|
426
|
+
const filterParams = [plan.query];
|
|
427
|
+
if (source) {
|
|
428
|
+
conditions.push('src2.name = ?');
|
|
429
|
+
filterParams.push(source);
|
|
430
|
+
}
|
|
431
|
+
if (since) {
|
|
432
|
+
conditions.push('sess.started_at >= ?');
|
|
433
|
+
filterParams.push(since);
|
|
434
|
+
}
|
|
435
|
+
const sql = `
|
|
436
|
+
SELECT
|
|
437
|
+
sess.id AS sessionId,
|
|
438
|
+
sess.session_uuid AS sessionUuid,
|
|
439
|
+
sess.file_path AS filePath,
|
|
440
|
+
sess.title AS sessionTitle,
|
|
441
|
+
sess.started_at AS startedAt,
|
|
442
|
+
sess.cwd AS cwd,
|
|
443
|
+
p.display_path AS project,
|
|
444
|
+
src2.name AS source,
|
|
445
|
+
CASE WHEN ss.title LIKE ? ESCAPE '\\' THEN 1 ELSE 0 END AS titlePrefixScore,
|
|
446
|
+
bm25(${ftsTable}, 5.0, 1.5, 0.8) AS ftsScore
|
|
447
|
+
FROM ${ftsTable}
|
|
448
|
+
JOIN session_search ss ON ss.session_id = ${ftsTable}.rowid
|
|
449
|
+
JOIN sessions sess ON sess.id = ss.session_id
|
|
450
|
+
JOIN projects p ON p.id = sess.project_id
|
|
451
|
+
JOIN sources src2 ON src2.id = sess.source_id
|
|
452
|
+
WHERE ${conditions.join(' AND ')}
|
|
453
|
+
ORDER BY titlePrefixScore DESC, ftsScore ASC, sess.started_at DESC
|
|
454
|
+
LIMIT ?
|
|
455
|
+
`;
|
|
456
|
+
return db.prepare(sql).all(`${escapeLike(query)}%`, ...filterParams, limit);
|
|
457
|
+
}
|
|
458
|
+
function searchPreviewRowsByLike(db, terms, limit, opts = {}) {
|
|
352
459
|
const { source, since } = opts;
|
|
353
460
|
const scoreParts = [];
|
|
354
461
|
const scoreParams = [];
|
|
@@ -658,28 +765,36 @@ function searchSessionRowsByFts(db, terms, phrase, limit, matchType, opts = {})
|
|
|
658
765
|
`;
|
|
659
766
|
return db.prepare(sql).all(...params);
|
|
660
767
|
}
|
|
661
|
-
function selectBestSessionSnippets(db, sessionIds, terms) {
|
|
768
|
+
function selectBestSessionSnippets(db, sessionIds, terms, ftsPlan = null) {
|
|
662
769
|
if (sessionIds.length === 0)
|
|
663
770
|
return new Map();
|
|
664
|
-
const coverageExpr = terms.map(() => `CASE WHEN content_text LIKE ? ESCAPE '\\' THEN 1 ELSE 0 END`).join(' + ');
|
|
665
|
-
const anyClauses = terms.map(() => 'content_text LIKE ? ESCAPE \'\\\'').join(' OR ');
|
|
771
|
+
const coverageExpr = terms.map(() => `CASE WHEN m.content_text LIKE ? ESCAPE '\\' THEN 1 ELSE 0 END`).join(' + ');
|
|
772
|
+
const anyClauses = terms.map(() => 'm.content_text LIKE ? ESCAPE \'\\\'').join(' OR ');
|
|
666
773
|
const allPatterns = terms.map(toLikePattern);
|
|
667
774
|
const anyPatterns = terms.map(toLikePattern);
|
|
668
775
|
const sessionPlaceholders = sessionIds.map(() => '?').join(', ');
|
|
776
|
+
const messageSource = ftsPlan
|
|
777
|
+
? `${ftsPlan.tableKind === 'trigram' ? 'messages_fts_trigram' : 'messages_fts'} AS message_matches
|
|
778
|
+
JOIN messages AS m ON m.id = message_matches.rowid`
|
|
779
|
+
: 'messages AS m';
|
|
780
|
+
const matchCondition = ftsPlan
|
|
781
|
+
? 'message_matches.content_text MATCH ?'
|
|
782
|
+
: `(${anyClauses})`;
|
|
783
|
+
const matchParams = ftsPlan ? [ftsPlan.anyTermQuery] : anyPatterns;
|
|
669
784
|
const matchSql = `
|
|
670
785
|
WITH raw AS (
|
|
671
786
|
SELECT
|
|
672
|
-
id AS messageId,
|
|
673
|
-
session_id AS sessionId,
|
|
674
|
-
role AS messageRole,
|
|
675
|
-
timestamp AS messageTimestamp,
|
|
676
|
-
content_text AS contentText,
|
|
677
|
-
seq,
|
|
787
|
+
m.id AS messageId,
|
|
788
|
+
m.session_id AS sessionId,
|
|
789
|
+
m.role AS messageRole,
|
|
790
|
+
m.timestamp AS messageTimestamp,
|
|
791
|
+
m.content_text AS contentText,
|
|
792
|
+
m.seq,
|
|
678
793
|
${coverageExpr} AS termCoverage
|
|
679
|
-
FROM
|
|
680
|
-
WHERE session_id IN (${sessionPlaceholders})
|
|
681
|
-
AND is_sidechain = 0
|
|
682
|
-
AND
|
|
794
|
+
FROM ${messageSource}
|
|
795
|
+
WHERE m.session_id IN (${sessionPlaceholders})
|
|
796
|
+
AND m.is_sidechain = 0
|
|
797
|
+
AND ${matchCondition}
|
|
683
798
|
),
|
|
684
799
|
ranked AS (
|
|
685
800
|
SELECT
|
|
@@ -707,7 +822,7 @@ function selectBestSessionSnippets(db, sessionIds, terms) {
|
|
|
707
822
|
FROM ranked
|
|
708
823
|
WHERE rn = 1
|
|
709
824
|
`;
|
|
710
|
-
const rows = db.prepare(matchSql).all(...allPatterns, ...sessionIds, ...
|
|
825
|
+
const rows = db.prepare(matchSql).all(...allPatterns, ...sessionIds, ...matchParams);
|
|
711
826
|
return new Map(rows.map(row => [row.sessionId, row]));
|
|
712
827
|
}
|
|
713
828
|
export function buildLikeSnippet(text, terms) {
|
|
@@ -799,6 +914,7 @@ export function getStatus(db) {
|
|
|
799
914
|
const codexRow = counts.find(r => r.name === 'codex');
|
|
800
915
|
const geminiRow = counts.find(r => r.name === 'gemini');
|
|
801
916
|
const opencodeRow = counts.find(r => r.name === 'opencode');
|
|
917
|
+
const piRow = counts.find(r => r.name === 'pi');
|
|
802
918
|
return {
|
|
803
919
|
dbPath: DB_PATH,
|
|
804
920
|
totalSessions,
|
|
@@ -806,6 +922,7 @@ export function getStatus(db) {
|
|
|
806
922
|
codexSessions: codexRow?.cnt ?? 0,
|
|
807
923
|
geminiSessions: geminiRow?.cnt ?? 0,
|
|
808
924
|
opencodeSessions: opencodeRow?.cnt ?? 0,
|
|
925
|
+
piSessions: piRow?.cnt ?? 0,
|
|
809
926
|
lastSyncedAt: lastSync?.last ?? null,
|
|
810
927
|
dbSizeBytes: getDBSize(),
|
|
811
928
|
};
|