@kybernesis/brain-storage-sqlite 0.9.0 → 0.11.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/hash.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @deprecated (Spec C) — `contentHash` moved to `@kybernesis/brain-core` so
3
+ * HOSTS (the side that reads files) can hash without the sqlite dep. This
4
+ * copy survives only for 0.10.0 back-compat of the package surface; it cannot
5
+ * re-export from brain-core because brain-core depends on this package
6
+ * (re-exporting would create a package cycle). Same algorithm: sha256 hex over
7
+ * RAW FILE BYTES. New code imports from brain-core.
8
+ */
9
+ /** @deprecated import `contentHash` from `@kybernesis/brain-core` instead. */
10
+ export declare function contentHash(rawBytes: Uint8Array | string): string;
11
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAEjE"}
package/dist/hash.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @deprecated (Spec C) — `contentHash` moved to `@kybernesis/brain-core` so
3
+ * HOSTS (the side that reads files) can hash without the sqlite dep. This
4
+ * copy survives only for 0.10.0 back-compat of the package surface; it cannot
5
+ * re-export from brain-core because brain-core depends on this package
6
+ * (re-exporting would create a package cycle). Same algorithm: sha256 hex over
7
+ * RAW FILE BYTES. New code imports from brain-core.
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ /** @deprecated import `contentHash` from `@kybernesis/brain-core` instead. */
11
+ export function contentHash(rawBytes) {
12
+ return createHash('sha256').update(rawBytes).digest('hex');
13
+ }
14
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,QAA6B;IACvD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC"}
package/dist/index.d.ts CHANGED
@@ -10,6 +10,7 @@ export { setAutoMigrate } from './migrations/config.js';
10
10
  export { registry as migrationRegistry, sentinelTables } from './migrations/registry.js';
11
11
  export { SchemaAheadError, SchemaBehindError, ChecksumDriftError } from './migrations/errors.js';
12
12
  export type { Migration, MigrationKind, MigrationOptions } from './migrations/types.js';
13
+ export { contentHash } from './hash.js';
13
14
  import type { TenantContext } from '@kybernesis/brain-contracts';
14
15
  export type DbKind = 'timeline' | 'entityGraph' | 'vectors' | 'sleep' | 'idempotency';
15
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAWhE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAKnG,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjG,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;AAkBtF;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CA2BvE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOjD;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAK/B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAWhE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAKnG,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjG,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAKxF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAIxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;AAkBtF;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CA2BvE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOjD;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAK/B"}
package/dist/index.js CHANGED
@@ -25,6 +25,11 @@ export { copyFileBackup } from './migrations/backup.js';
25
25
  export { setAutoMigrate } from './migrations/config.js';
26
26
  export { registry as migrationRegistry, sentinelTables } from './migrations/registry.js';
27
27
  export { SchemaAheadError, SchemaBehindError, ChecksumDriftError } from './migrations/errors.js';
28
+ // Reconcile moved to brain-core (Spec C): the kernel owns policy; this backend
29
+ // exposes only the SQL primitives (TimelineRepository.listAllFilePaths /
30
+ // relabelFilePath / stampContentHash / removeFileCluster). contentHash export
31
+ // kept @deprecated for the 0.10.0 surface — new code imports it from brain-core.
32
+ export { contentHash } from './hash.js';
28
33
  import { runMigrations } from './migrations/runner.js';
29
34
  import { getAutoMigrate } from './migrations/config.js';
30
35
  const pool = new Map();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/migrations/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAKlE,CAAC;AAYF,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,SAAS,EAAE,CAAC,CAK1E,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/migrations/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAKlE,CAAC;AAYF,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,SAAS,EAAE,CAAC,CAK1E,CAAC"}
@@ -3,6 +3,7 @@
3
3
  * `_migrations` table and version line). Append-only: new migrations go at the
4
4
  * END of a kind's list; shipped entries are immutable (checksum-guarded).
5
5
  */
6
+ import { migration as fileProvenance } from './timeline/002-file-provenance.js';
6
7
  /**
7
8
  * Legacy-detection signal per DB (baseline decision, Spec A T6): if this table
8
9
  * exists but `_migrations` doesn't, the DB predates the migration system —
@@ -25,7 +26,7 @@ function baseline(db) {
25
26
  return { id: '001-baseline', db, statements: [], baseline: true };
26
27
  }
27
28
  export const registry = {
28
- timeline: [baseline('timeline')],
29
+ timeline: [baseline('timeline'), fileProvenance],
29
30
  entityGraph: [baseline('entityGraph')],
30
31
  sleep: [baseline('sleep')],
31
32
  vectors: [baseline('vectors')],
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/migrations/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAA4C;IACrE,QAAQ,EAAE,iBAAiB;IAC3B,WAAW,EAAE,UAAU;IACvB,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,YAAY;CACtB,CAAC;AAEF;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,EAAiB;IACjC,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAA0D;IAC7E,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACtC,KAAK,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;CAC/B,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/migrations/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAA4C;IACrE,QAAQ,EAAE,iBAAiB;IAC3B,WAAW,EAAE,UAAU;IACvB,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,YAAY;CACtB,CAAC;AAEF;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,EAAiB;IACjC,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAA0D;IAC7E,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC;IAChD,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACtC,KAAK,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;CAC/B,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Spec B (docs/specs/file-provenance-and-reconcile.md): file provenance.
3
+ *
4
+ * Adds the mutable LOCATOR (`file_path`, relative path, type='file' rows only)
5
+ * and the VERSION fingerprint (`content_hash` = sha256 of raw file bytes) to
6
+ * timeline_events. Stable identity (random source_path / chunk origin_id) is
7
+ * deliberately untouched — separating identity from locator is what makes a
8
+ * rename a one-row UPDATE.
9
+ *
10
+ * The unique index is PARTIAL: conversation rows keep file_path NULL in any
11
+ * number; non-NULL paths are unique (the dual-key upsert rides on it — proven
12
+ * in partial-upsert.spike.test.ts on better-sqlite3 + libsql).
13
+ *
14
+ * Backfill stamps file_path from the legacy `title` ("… File: <relpath>") —
15
+ * in-DB only, no file reads; content_hash stays NULL on legacy rows (the first
16
+ * reconcile run stamps it lazily). DEDUPE-AWARE: legacy brains can hold
17
+ * duplicate rows for the same file (the pile-up bug Spec B fixes) — stamping
18
+ * all of them would violate the new unique index and roll back the whole
19
+ * migration, so only the NEWEST row (MAX(id)) per title gets the locator;
20
+ * older duplicates stay NULL and remain reachable by source_path.
21
+ */
22
+ import type { Migration } from '../types.js';
23
+ export declare const migration: Migration;
24
+ //# sourceMappingURL=002-file-provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"002-file-provenance.d.ts","sourceRoot":"","sources":["../../../src/migrations/timeline/002-file-provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,SAAS,EAAE,SAoBvB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Spec B (docs/specs/file-provenance-and-reconcile.md): file provenance.
3
+ *
4
+ * Adds the mutable LOCATOR (`file_path`, relative path, type='file' rows only)
5
+ * and the VERSION fingerprint (`content_hash` = sha256 of raw file bytes) to
6
+ * timeline_events. Stable identity (random source_path / chunk origin_id) is
7
+ * deliberately untouched — separating identity from locator is what makes a
8
+ * rename a one-row UPDATE.
9
+ *
10
+ * The unique index is PARTIAL: conversation rows keep file_path NULL in any
11
+ * number; non-NULL paths are unique (the dual-key upsert rides on it — proven
12
+ * in partial-upsert.spike.test.ts on better-sqlite3 + libsql).
13
+ *
14
+ * Backfill stamps file_path from the legacy `title` ("… File: <relpath>") —
15
+ * in-DB only, no file reads; content_hash stays NULL on legacy rows (the first
16
+ * reconcile run stamps it lazily). DEDUPE-AWARE: legacy brains can hold
17
+ * duplicate rows for the same file (the pile-up bug Spec B fixes) — stamping
18
+ * all of them would violate the new unique index and roll back the whole
19
+ * migration, so only the NEWEST row (MAX(id)) per title gets the locator;
20
+ * older duplicates stay NULL and remain reachable by source_path.
21
+ */
22
+ export const migration = {
23
+ id: '002-file-provenance',
24
+ db: 'timeline',
25
+ statements: [
26
+ `ALTER TABLE timeline_events ADD COLUMN file_path TEXT`,
27
+ `ALTER TABLE timeline_events ADD COLUMN content_hash TEXT`,
28
+ `CREATE UNIQUE INDEX IF NOT EXISTS idx_timeline_file_path
29
+ ON timeline_events(file_path) WHERE file_path IS NOT NULL`,
30
+ ],
31
+ backfill(db) {
32
+ db.exec(`
33
+ UPDATE timeline_events
34
+ SET file_path = substr(title, instr(title, 'File: ') + 6)
35
+ WHERE id IN (
36
+ SELECT MAX(id) FROM timeline_events
37
+ WHERE type = 'file' AND file_path IS NULL AND title LIKE '%File: %'
38
+ GROUP BY title
39
+ )
40
+ `);
41
+ },
42
+ };
43
+ //# sourceMappingURL=002-file-provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"002-file-provenance.js","sourceRoot":"","sources":["../../../src/migrations/timeline/002-file-provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,EAAE,EAAE,qBAAqB;IACzB,EAAE,EAAE,UAAU;IACd,UAAU,EAAE;QACV,uDAAuD;QACvD,0DAA0D;QAC1D;iEAC6D;KAC9D;IACD,QAAQ,CAAC,EAAE;QACT,EAAE,CAAC,IAAI,CAAC;;;;;;;;KAQP,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -11,8 +11,7 @@
11
11
  */
12
12
  import type { StorageProvider } from '@kybernesis/brain-contracts';
13
13
  import type { MigrationOptions } from './migrations/types.js';
14
- /** Reset the lazy vec-store cache (test/utility). */
15
- export declare function resetLazyVectorStore(): void;
14
+ export { resetLazyVectorStore } from './vec-lazy.js';
16
15
  export interface SqliteStorageProviderOptions {
17
16
  /**
18
17
  * Migration trigger (Spec A) — consumer-chosen, off when omitted.
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAgC9D,qDAAqD;AACrD,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AA6BD,MAAM,WAAW,4BAA4B;IAC3C;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;CAC1C;AAED,wBAAgB,2BAA2B,CACzC,OAAO,GAAE,4BAAiC,GACzC,eAAe,CAoBjB"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAa9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,4BAA4B;IAC3C;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;CAC1C;AAED,wBAAgB,2BAA2B,CACzC,OAAO,GAAE,4BAAiC,GACzC,eAAe,CAoBjB"}
package/dist/provider.js CHANGED
@@ -17,63 +17,11 @@ import { sqliteSleepStore } from './sleep-store.js';
17
17
  import { sqliteSleepMaintenance } from './sleep-maintenance.js';
18
18
  import { sqliteSearchQueries } from './search-queries.js';
19
19
  import { sqliteFactRetrievalQueries } from './fact-retrieval-queries.js';
20
- // ─── Lazy vector store ────────────────────────────────────────────────────────
21
- // VectorRepository is a first-class member of the bundle (decision #3 Option A), but
22
- // brain-storage-vec carries the sqlite-vec NATIVE binary. We load it lazily on
23
- // first vector use so it never costs apps anything at provider-creation time,
24
- // and brain-storage-sqlite keeps NO static dependency on sqlite-vec. If the
25
- // package can't be loaded (not installed / wrong platform), the store degrades
26
- // to safe no-ops — brain-core's vectors layer maps these to its graceful results.
27
- let _vecStore = null;
28
- let _vecAttempted = false;
29
- async function loadVecStore() {
30
- if (_vecAttempted)
31
- return _vecStore;
32
- _vecAttempted = true;
33
- try {
34
- const mod = await import('@kybernesis/brain-storage-vec');
35
- _vecStore = mod.sqliteVecStore;
36
- }
37
- catch {
38
- _vecStore = null;
39
- }
40
- return _vecStore;
41
- }
42
- /** Reset the lazy vec-store cache (test/utility). */
43
- export function resetLazyVectorStore() {
44
- _vecStore = null;
45
- _vecAttempted = false;
46
- }
47
- const lazyVectorStore = {
48
- async available(t) {
49
- const s = await loadVecStore();
50
- return s ? s.available(t) : false;
51
- },
52
- async hasOrigin(t, originId) {
53
- const s = await loadVecStore();
54
- if (!s)
55
- return false;
56
- return s.hasOrigin(t, originId);
57
- },
58
- async insertChunk(t, chunk) {
59
- const s = await loadVecStore();
60
- if (!s)
61
- throw new Error('[brain-storage-sqlite] vector backend unavailable');
62
- return s.insertChunk(t, chunk);
63
- },
64
- async search(t, embedding, limit) {
65
- const s = await loadVecStore();
66
- if (!s)
67
- return [];
68
- return s.search(t, embedding, limit);
69
- },
70
- async stats(t) {
71
- const s = await loadVecStore();
72
- if (!s)
73
- return { count: 0, available: false };
74
- return s.stats(t);
75
- },
76
- };
20
+ // Lazy vector store lives in vec-lazy.ts (Spec B: timeline.ts also needs it
21
+ // for cluster cleanup, and importing provider.ts from timeline.ts would close
22
+ // the documented eval-order cycle). Re-exported here for API compatibility.
23
+ import { lazyVectorStore } from './vec-lazy.js';
24
+ export { resetLazyVectorStore } from './vec-lazy.js';
77
25
  export function createSqliteStorageProvider(options = {}) {
78
26
  if (options.autoMigrate !== undefined) {
79
27
  setAutoMigrate(options.autoMigrate);
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAEzE,4EAA4E;AAC5E,8EAA8E;AAC9E,4EAA4E;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAarD,MAAM,UAAU,2BAA2B,CACzC,UAAwC,EAAE;IAE1C,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACtC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IACD,OAAO;QACL,YAAY,EAAE;YACZ,QAAQ,EAAE,mBAAmB;YAC7B,QAAQ,EAAE,sBAAsB;YAChC,KAAK,EAAE,eAAe;YACtB,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE,eAAe;SACzB;QACD,gFAAgF;QAChF,MAAM,EAAE;YACN,MAAM,EAAE,mBAAmB,EAAE,KAAK;YAClC,aAAa,EAAE,0BAA0B,EAAE,KAAK;YAChD,KAAK,EAAE,sBAAsB,EAAE,OAAO;SAEvC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Reconcile (Spec B) — diff the brain against the filesystem and converge.
3
+ * This is the capability that catches the 42-files class: files marked
4
+ * "synced" but silently absent from the brain.
5
+ *
6
+ * REPORT-ONLY by default: a plain run returns structured findings and makes no
7
+ * destructive change. The one write a report run performs is the documented
8
+ * lazy baseline (resolved decision #2): a legacy row with NULL content_hash
9
+ * whose file exists on disk gets the CURRENT file's hash stamped and is
10
+ * classified up-to-date — trusting the present file as baseline avoids a full
11
+ * re-embed of every legacy row.
12
+ *
13
+ * Classification:
14
+ * missing — on disk, no brain row (→ repair: re-ingest via callback)
15
+ * stale — both, hashes differ (→ repair: re-ingest via callback)
16
+ * orphaned — brain row, no file on disk (→ removeOrphaned: delete cluster)
17
+ * renamed — a missing path whose hash equals an orphaned row's hash
18
+ * (→ repair: ONE file_path UPDATE — cluster, enrichment, and
19
+ * embeddings all survive; no re-ingest, no re-embed)
20
+ *
21
+ * Rename-and-edit is NOT detected (hashes differ) — it degrades to the
22
+ * missing + orphaned pair, i.e. add + remove. Documented limitation.
23
+ *
24
+ * Re-ingest is delegated to `opts.reingest` because ingestion is brain-core's
25
+ * pipeline (LLM extraction + embedding) and the dependency points the other
26
+ * way. The consumer (KBDE/KyberBot sweep, Arcana job) wires storeConversation
27
+ * into it — see the spec's consumer-integration section.
28
+ *
29
+ * Filesystem truth = the walked roots; the watched-folders manifest is never
30
+ * consulted. Dotfiles and dot-directories are skipped.
31
+ */
32
+ import type { TenantContext } from '@kybernesis/brain-contracts';
33
+ export interface ReconcileDiskFile {
34
+ file_path: string;
35
+ absolute_path: string;
36
+ content_hash: string;
37
+ }
38
+ export interface ReconcileReport {
39
+ missing: ReconcileDiskFile[];
40
+ stale: Array<ReconcileDiskFile & {
41
+ id: number;
42
+ brain_hash: string;
43
+ }>;
44
+ orphaned: Array<{
45
+ id: number;
46
+ file_path: string;
47
+ content_hash: string | null;
48
+ }>;
49
+ renamed: Array<{
50
+ id: number;
51
+ from: string;
52
+ to: string;
53
+ }>;
54
+ /** Legacy NULL-hash rows stamped with the current file's hash this run. */
55
+ baselined: number;
56
+ /** Files seen on disk across all roots. */
57
+ scanned: number;
58
+ /** Actions actually performed (empty unless repair/removeOrphaned). */
59
+ repaired: {
60
+ relabelled: number;
61
+ reingested: number;
62
+ removed: number;
63
+ };
64
+ }
65
+ export interface ReconcileOptions {
66
+ /** Filesystem roots to walk; brain file_paths are relative to one of these. */
67
+ roots: string[];
68
+ /** Apply renames (relabel) and re-ingest missing/stale via `reingest`. */
69
+ repair?: boolean;
70
+ /** Delete orphaned rows + their clusters. Destructive — explicitly opt-in. */
71
+ removeOrphaned?: boolean;
72
+ /** Consumer-provided ingest (brain-core storeConversation wired by the consumer). */
73
+ reingest?: (file: ReconcileDiskFile) => Promise<void>;
74
+ }
75
+ export declare function reconcile(t: TenantContext, opts: ReconcileOptions): Promise<ReconcileReport>;
76
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAKjE,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,KAAK,EAAE,KAAK,CAAC,iBAAiB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAChF,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACvE;AAED,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAkBD,wBAAsB,SAAS,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAqElG"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Reconcile (Spec B) — diff the brain against the filesystem and converge.
3
+ * This is the capability that catches the 42-files class: files marked
4
+ * "synced" but silently absent from the brain.
5
+ *
6
+ * REPORT-ONLY by default: a plain run returns structured findings and makes no
7
+ * destructive change. The one write a report run performs is the documented
8
+ * lazy baseline (resolved decision #2): a legacy row with NULL content_hash
9
+ * whose file exists on disk gets the CURRENT file's hash stamped and is
10
+ * classified up-to-date — trusting the present file as baseline avoids a full
11
+ * re-embed of every legacy row.
12
+ *
13
+ * Classification:
14
+ * missing — on disk, no brain row (→ repair: re-ingest via callback)
15
+ * stale — both, hashes differ (→ repair: re-ingest via callback)
16
+ * orphaned — brain row, no file on disk (→ removeOrphaned: delete cluster)
17
+ * renamed — a missing path whose hash equals an orphaned row's hash
18
+ * (→ repair: ONE file_path UPDATE — cluster, enrichment, and
19
+ * embeddings all survive; no re-ingest, no re-embed)
20
+ *
21
+ * Rename-and-edit is NOT detected (hashes differ) — it degrades to the
22
+ * missing + orphaned pair, i.e. add + remove. Documented limitation.
23
+ *
24
+ * Re-ingest is delegated to `opts.reingest` because ingestion is brain-core's
25
+ * pipeline (LLM extraction + embedding) and the dependency points the other
26
+ * way. The consumer (KBDE/KyberBot sweep, Arcana job) wires storeConversation
27
+ * into it — see the spec's consumer-integration section.
28
+ *
29
+ * Filesystem truth = the walked roots; the watched-folders manifest is never
30
+ * consulted. Dotfiles and dot-directories are skipped.
31
+ */
32
+ import { readdirSync, readFileSync } from 'node:fs';
33
+ import { join } from 'node:path';
34
+ import { getDb } from './index.js';
35
+ import { contentHash } from './hash.js';
36
+ import { sqliteTimelineStore } from './timeline.js';
37
+ function walk(dir, relBase, acc) {
38
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
39
+ if (entry.name.startsWith('.'))
40
+ continue;
41
+ const abs = join(dir, entry.name);
42
+ const rel = relBase ? `${relBase}/${entry.name}` : entry.name;
43
+ if (entry.isDirectory()) {
44
+ walk(abs, rel, acc);
45
+ }
46
+ else if (entry.isFile()) {
47
+ // first root wins on cross-root relpath collision
48
+ if (!acc.has(rel)) {
49
+ acc.set(rel, { file_path: rel, absolute_path: abs, content_hash: contentHash(readFileSync(abs)) });
50
+ }
51
+ }
52
+ }
53
+ }
54
+ export async function reconcile(t, opts) {
55
+ const onDisk = new Map();
56
+ for (const root of opts.roots)
57
+ walk(root, '', onDisk);
58
+ const brainRows = await sqliteTimelineStore.listAllFilePaths(t);
59
+ const db = getDb(t, 'timeline');
60
+ const stampHash = db.prepare(`UPDATE timeline_events SET content_hash = ? WHERE id = ?`);
61
+ let baselined = 0;
62
+ const stale = [];
63
+ const orphaned = [];
64
+ const brainPaths = new Set();
65
+ for (const row of brainRows) {
66
+ brainPaths.add(row.file_path);
67
+ const disk = onDisk.get(row.file_path);
68
+ if (!disk) {
69
+ orphaned.push(row);
70
+ }
71
+ else if (row.content_hash === null) {
72
+ stampHash.run(disk.content_hash, row.id); // lazy baseline: trust the current file
73
+ baselined++;
74
+ }
75
+ else if (row.content_hash !== disk.content_hash) {
76
+ stale.push({ ...disk, id: row.id, brain_hash: row.content_hash });
77
+ }
78
+ }
79
+ let missing = [...onDisk.values()].filter((f) => !brainPaths.has(f.file_path));
80
+ // Rename detection: a missing path whose content matches an orphaned row's
81
+ // hash is the same file under a new name — relocate the LOCATOR, keep the
82
+ // cluster. (Requires the orphaned row to carry a hash; legacy NULL-hash
83
+ // orphans can't match and stay orphaned.)
84
+ const renamed = [];
85
+ const orphanByHash = new Map();
86
+ for (const o of orphaned)
87
+ if (o.content_hash)
88
+ orphanByHash.set(o.content_hash, o);
89
+ missing = missing.filter((m) => {
90
+ const o = orphanByHash.get(m.content_hash);
91
+ if (!o)
92
+ return true;
93
+ renamed.push({ id: o.id, from: o.file_path, to: m.file_path });
94
+ orphanByHash.delete(m.content_hash);
95
+ orphaned.splice(orphaned.indexOf(o), 1);
96
+ return false;
97
+ });
98
+ const repaired = { relabelled: 0, reingested: 0, removed: 0 };
99
+ if (opts.repair) {
100
+ const relabel = db.prepare(`UPDATE timeline_events SET file_path = ? WHERE id = ?`);
101
+ for (const r of renamed) {
102
+ relabel.run(r.to, r.id);
103
+ repaired.relabelled++;
104
+ }
105
+ if (opts.reingest) {
106
+ for (const f of [...missing, ...stale]) {
107
+ await opts.reingest(f);
108
+ repaired.reingested++;
109
+ }
110
+ }
111
+ }
112
+ if (opts.removeOrphaned) {
113
+ for (const o of orphaned) {
114
+ await sqliteTimelineStore.removeFileCluster(t, o.file_path, { removeEvent: true });
115
+ repaired.removed++;
116
+ }
117
+ }
118
+ return { missing, stale, orphaned, renamed, baselined, scanned: onDisk.size, repaired };
119
+ }
120
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAOV,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AAwDrC,iEAAiE;AACjE,wBAAgB,wBAAwB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAG5D;AAuGD,eAAO,MAAM,mBAAmB,EAAE,kBAiNjC,CAAC"}
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAOV,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AA6DrC,iEAAiE;AACjE,wBAAgB,wBAAwB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAG5D;AA2GD,eAAO,MAAM,mBAAmB,EAAE,kBAmSjC,CAAC"}
package/dist/timeline.js CHANGED
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { getDb } from './index.js';
8
8
  import { sanitizeFtsQuery } from './fts-sanitizer.js';
9
+ import { lazyVectorStore } from './vec-lazy.js';
9
10
  function rowToEvent(row) {
10
11
  return {
11
12
  id: row.id,
@@ -29,6 +30,8 @@ function rowToEvent(row) {
29
30
  classification: row.classification ?? undefined,
30
31
  connection_id: row.connection_id ?? undefined,
31
32
  source_did: row.source_did ?? undefined,
33
+ file_path: row.file_path ?? undefined,
34
+ content_hash: row.content_hash ?? undefined,
32
35
  };
33
36
  }
34
37
  const initialized = new Set();
@@ -65,7 +68,9 @@ function ensureSchema(t) {
65
68
  project_id TEXT,
66
69
  classification TEXT,
67
70
  connection_id TEXT,
68
- source_did TEXT
71
+ source_did TEXT,
72
+ file_path TEXT,
73
+ content_hash TEXT
69
74
  );
70
75
 
71
76
  CREATE INDEX IF NOT EXISTS idx_timeline_timestamp ON timeline_events(timestamp);
@@ -77,6 +82,8 @@ function ensureSchema(t) {
77
82
  CREATE INDEX IF NOT EXISTS idx_timeline_project ON timeline_events(project_id);
78
83
  CREATE INDEX IF NOT EXISTS idx_timeline_classification ON timeline_events(classification);
79
84
  CREATE INDEX IF NOT EXISTS idx_timeline_connection ON timeline_events(connection_id);
85
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_timeline_file_path
86
+ ON timeline_events(file_path) WHERE file_path IS NOT NULL;
80
87
 
81
88
  CREATE VIRTUAL TABLE IF NOT EXISTS timeline_fts USING fts5(
82
89
  title, summary, entities, topics, content='',
@@ -145,13 +152,13 @@ export const sqliteTimelineStore = {
145
152
  async addEvent(t, event) {
146
153
  ensureSchema(t);
147
154
  const db = getDb(t, 'timeline');
148
- const result = db.prepare(`
149
- INSERT INTO timeline_events
150
- (type, timestamp, end_timestamp, title, summary, source_path,
151
- entities_json, topics_json,
152
- project_id, tags_json, classification, connection_id, source_did)
153
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
154
- ON CONFLICT(source_path) DO UPDATE SET
155
+ // Dual-key upsert (Spec B): file rows converge on file_path (the mutable
156
+ // locator), conversation rows on source_path — exactly as before. In the
157
+ // file branch the row ADOPTS the new ingest's source_path (the fresh
158
+ // facts/chunks cluster lives under it; exact-match cleanup removes the old
159
+ // one), while the row id and enrichment columns (priority, tier, decay,
160
+ // pin, access, last_enriched) persist by omission from the SET list.
161
+ const sharedSet = `
155
162
  type = excluded.type,
156
163
  timestamp = excluded.timestamp,
157
164
  end_timestamp = excluded.end_timestamp,
@@ -163,10 +170,73 @@ export const sqliteTimelineStore = {
163
170
  tags_json = COALESCE(excluded.tags_json, timeline_events.tags_json),
164
171
  classification = COALESCE(excluded.classification, timeline_events.classification),
165
172
  connection_id = COALESCE(excluded.connection_id, timeline_events.connection_id),
166
- source_did = COALESCE(excluded.source_did, timeline_events.source_did)
167
- `).run(event.type, event.timestamp, event.end_timestamp ?? null, event.title, event.summary ?? '', event.source_path, JSON.stringify(event.entities), JSON.stringify(event.topics), event.project_id ?? null, event.tags ? JSON.stringify(event.tags) : null, event.classification ?? null, event.connection_id ?? null, event.source_did ?? null);
173
+ source_did = COALESCE(excluded.source_did, timeline_events.source_did)`;
174
+ const conflictClause = event.file_path
175
+ ? `ON CONFLICT(file_path) WHERE file_path IS NOT NULL DO UPDATE SET
176
+ source_path = excluded.source_path,
177
+ content_hash = excluded.content_hash,${sharedSet}`
178
+ : `ON CONFLICT(source_path) DO UPDATE SET
179
+ file_path = COALESCE(excluded.file_path, timeline_events.file_path),
180
+ content_hash = COALESCE(excluded.content_hash, timeline_events.content_hash),${sharedSet}`;
181
+ const result = db.prepare(`
182
+ INSERT INTO timeline_events
183
+ (type, timestamp, end_timestamp, title, summary, source_path,
184
+ entities_json, topics_json,
185
+ project_id, tags_json, classification, connection_id, source_did,
186
+ file_path, content_hash)
187
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
188
+ ${conflictClause}
189
+ `).run(event.type, event.timestamp, event.end_timestamp ?? null, event.title, event.summary ?? '', event.source_path, JSON.stringify(event.entities), JSON.stringify(event.topics), event.project_id ?? null, event.tags ? JSON.stringify(event.tags) : null, event.classification ?? null, event.connection_id ?? null, event.source_did ?? null, event.file_path ?? null, event.content_hash ?? null);
168
190
  return result.lastInsertRowid;
169
191
  },
192
+ async removeFileCluster(t, filePath, opts = {}) {
193
+ ensureSchema(t);
194
+ const db = getDb(t, 'timeline');
195
+ // EXACT match only — the substring approach this replaces cross-deleted
196
+ // notes.md when re-ingesting meeting-notes.md (baseline bug #14).
197
+ const row = db
198
+ .prepare(`SELECT id, source_path FROM timeline_events WHERE file_path = ?`)
199
+ .get(filePath);
200
+ if (!row)
201
+ return { removed: false, facts: 0, chunks: 0 };
202
+ // source_path = channel://<channel>/<conversationId> — the cluster key.
203
+ const conversationId = row.source_path.split('/').pop() ?? '';
204
+ const facts = conversationId
205
+ ? db.prepare(`DELETE FROM facts WHERE source_conversation_id = ?`).run(conversationId).changes
206
+ : 0;
207
+ const chunks = conversationId
208
+ ? await lazyVectorStore.deleteByOriginPrefix(t, `${conversationId}_seg_`)
209
+ : 0;
210
+ if (opts.removeEvent) {
211
+ db.prepare(`DELETE FROM timeline_events WHERE id = ?`).run(row.id);
212
+ }
213
+ return { removed: true, facts, chunks };
214
+ },
215
+ async listAllFilePaths(t, opts = {}) {
216
+ ensureSchema(t);
217
+ const db = getDb(t, 'timeline');
218
+ return db
219
+ .prepare(`
220
+ SELECT id, file_path, content_hash FROM timeline_events
221
+ WHERE type = 'file' AND file_path IS NOT NULL AND id > ?
222
+ ORDER BY id ASC
223
+ LIMIT ?
224
+ `)
225
+ .all(opts.afterId ?? 0, opts.limit ?? -1);
226
+ },
227
+ // Reconcile SQL primitives (Spec C). Policy — when to relabel, when to stamp,
228
+ // report-only semantics — lives in brain-core's reconcile(); these are only
229
+ // the UPDATEs it drives through the provider seam.
230
+ async relabelFilePath(t, id, newFilePath) {
231
+ ensureSchema(t);
232
+ const db = getDb(t, 'timeline');
233
+ db.prepare(`UPDATE timeline_events SET file_path = ? WHERE id = ?`).run(newFilePath, id);
234
+ },
235
+ async stampContentHash(t, id, contentHash) {
236
+ ensureSchema(t);
237
+ const db = getDb(t, 'timeline');
238
+ db.prepare(`UPDATE timeline_events SET content_hash = ? WHERE id = ?`).run(contentHash, id);
239
+ },
170
240
  async removeEventByPath(t, sourcePath) {
171
241
  ensureSchema(t);
172
242
  const db = getDb(t, 'timeline');
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Lazy vector store — moved out of provider.ts (Spec B) so timeline.ts can
3
+ * reach it for cluster cleanup WITHOUT importing provider.ts (provider imports
4
+ * timeline; that import would close the eval-order cycle index.ts warns
5
+ * about).
6
+ *
7
+ * VectorRepository is a first-class member of the bundle (decision #3 Option
8
+ * A), but brain-storage-vec carries the sqlite-vec NATIVE binary. We load it
9
+ * lazily on first vector use so it never costs apps anything at
10
+ * provider-creation time, and brain-storage-sqlite keeps NO static dependency
11
+ * on sqlite-vec. If the package can't be loaded (not installed / wrong
12
+ * platform), the store degrades to safe no-ops — brain-core's vectors layer
13
+ * maps these to its graceful results.
14
+ */
15
+ import type { VectorRepository } from '@kybernesis/brain-contracts';
16
+ /** Reset the lazy vec-store cache (test/utility). */
17
+ export declare function resetLazyVectorStore(): void;
18
+ export declare const lazyVectorStore: VectorRepository;
19
+ //# sourceMappingURL=vec-lazy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vec-lazy.d.ts","sourceRoot":"","sources":["../src/vec-lazy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAiB,gBAAgB,EAAoB,MAAM,6BAA6B,CAAC;AAiBrG,qDAAqD;AACrD,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AAED,eAAO,MAAM,eAAe,EAAE,gBAkC7B,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Lazy vector store — moved out of provider.ts (Spec B) so timeline.ts can
3
+ * reach it for cluster cleanup WITHOUT importing provider.ts (provider imports
4
+ * timeline; that import would close the eval-order cycle index.ts warns
5
+ * about).
6
+ *
7
+ * VectorRepository is a first-class member of the bundle (decision #3 Option
8
+ * A), but brain-storage-vec carries the sqlite-vec NATIVE binary. We load it
9
+ * lazily on first vector use so it never costs apps anything at
10
+ * provider-creation time, and brain-storage-sqlite keeps NO static dependency
11
+ * on sqlite-vec. If the package can't be loaded (not installed / wrong
12
+ * platform), the store degrades to safe no-ops — brain-core's vectors layer
13
+ * maps these to its graceful results.
14
+ */
15
+ let _vecStore = null;
16
+ let _vecAttempted = false;
17
+ async function loadVecStore() {
18
+ if (_vecAttempted)
19
+ return _vecStore;
20
+ _vecAttempted = true;
21
+ try {
22
+ const mod = await import('@kybernesis/brain-storage-vec');
23
+ _vecStore = mod.sqliteVecStore;
24
+ }
25
+ catch {
26
+ _vecStore = null;
27
+ }
28
+ return _vecStore;
29
+ }
30
+ /** Reset the lazy vec-store cache (test/utility). */
31
+ export function resetLazyVectorStore() {
32
+ _vecStore = null;
33
+ _vecAttempted = false;
34
+ }
35
+ export const lazyVectorStore = {
36
+ async available(t) {
37
+ const s = await loadVecStore();
38
+ return s ? s.available(t) : false;
39
+ },
40
+ async hasOrigin(t, originId) {
41
+ const s = await loadVecStore();
42
+ if (!s)
43
+ return false;
44
+ return s.hasOrigin(t, originId);
45
+ },
46
+ async insertChunk(t, chunk) {
47
+ const s = await loadVecStore();
48
+ if (!s)
49
+ throw new Error('[brain-storage-sqlite] vector backend unavailable');
50
+ return s.insertChunk(t, chunk);
51
+ },
52
+ async search(t, embedding, limit) {
53
+ const s = await loadVecStore();
54
+ if (!s)
55
+ return [];
56
+ return s.search(t, embedding, limit);
57
+ },
58
+ async stats(t) {
59
+ const s = await loadVecStore();
60
+ if (!s)
61
+ return { count: 0, available: false };
62
+ return s.stats(t);
63
+ },
64
+ async deleteByOriginPrefix(t, originIdPrefix) {
65
+ const s = await loadVecStore();
66
+ if (!s)
67
+ return 0; // graceful: nothing indexed if the backend never loaded
68
+ try {
69
+ return await s.deleteByOriginPrefix(t, originIdPrefix);
70
+ }
71
+ catch {
72
+ return 0; // vec DB absent/unopenable → no chunks to delete
73
+ }
74
+ },
75
+ };
76
+ //# sourceMappingURL=vec-lazy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vec-lazy.js","sourceRoot":"","sources":["../src/vec-lazy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,IAAI,SAAS,GAA4B,IAAI,CAAC;AAC9C,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B,KAAK,UAAU,YAAY;IACzB,IAAI,aAAa;QAAE,OAAO,SAAS,CAAC;IACpC,aAAa,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;QAC1D,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,oBAAoB;IAClC,SAAS,GAAG,IAAI,CAAC;IACjB,aAAa,GAAG,KAAK,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,KAAK,CAAC,SAAS,CAAC,CAAgB;QAC9B,MAAM,CAAC,GAAG,MAAM,YAAY,EAAE,CAAC;QAC/B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACpC,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,CAAgB,EAAE,QAAgB;QAChD,MAAM,CAAC,GAAG,MAAM,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACrB,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,CAAgB,EAAE,KAAuB;QACzD,MAAM,CAAC,GAAG,MAAM,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,CAAgB,EAAE,SAAmB,EAAE,KAAa;QAC/D,MAAM,CAAC,GAAG,MAAM,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,CAAgB;QAC1B,MAAM,CAAC,GAAG,MAAM,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9C,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,KAAK,CAAC,oBAAoB,CAAC,CAAgB,EAAE,cAAsB;QACjE,MAAM,CAAC,GAAG,MAAM,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,wDAAwD;QAC1E,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,CAAC,iDAAiD;QAC7D,CAAC;IACH,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kybernesis/brain-storage-sqlite",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "better-sqlite3 StructuredStore implementation for brain-core",
5
5
  "license": "MIT",
6
6
  "author": "David Cruwys (AppyDave)",
@@ -27,10 +27,10 @@
27
27
  "README.md"
28
28
  ],
29
29
  "dependencies": {
30
- "@kybernesis/brain-contracts": "0.9.0"
30
+ "@kybernesis/brain-contracts": "0.11.0"
31
31
  },
32
32
  "optionalDependencies": {
33
- "@kybernesis/brain-storage-vec": "0.9.0"
33
+ "@kybernesis/brain-storage-vec": "0.11.0"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "better-sqlite3": ">=9.0.0"
@@ -39,7 +39,7 @@
39
39
  "@libsql/client": "^0.17.3",
40
40
  "@types/better-sqlite3": "^7.6.0",
41
41
  "better-sqlite3": "^12.0.0",
42
- "@kybernesis/brain-testkit": "0.9.0"
42
+ "@kybernesis/brain-testkit": "0.11.0"
43
43
  },
44
44
  "publishConfig": {
45
45
  "access": "public"