@kybernesis/brain-core 0.10.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,16 @@
1
+ /**
2
+ * Content fingerprint (moved here from brain-storage-sqlite in Spec C):
3
+ * sha256 over RAW FILE BYTES — deliberately not normalized/extracted text, so
4
+ * the hash is simple, stable, decoupled from extraction, and fails safe.
5
+ *
6
+ * Lives in brain-core so the KERNEL owns the hash contract — the same
7
+ * function serves both sides: hosts compute it at file-read for ingest AND
8
+ * when building the diskList for reconcile; the brain only stores and
9
+ * compares. Honest caveat: today `import { contentHash } from
10
+ * '@kybernesis/brain-core'` still loads better-sqlite3 transitively (the
11
+ * Stage-1 auto-default storage seam is a static import in the barrel); a
12
+ * `./hash` subpath export is the future hardening for hosts that talk to a
13
+ * remote brain and never want the native dep.
14
+ */
15
+ export declare function contentHash(rawBytes: Uint8Array | string): string;
16
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAEjE"}
package/dist/hash.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Content fingerprint (moved here from brain-storage-sqlite in Spec C):
3
+ * sha256 over RAW FILE BYTES — deliberately not normalized/extracted text, so
4
+ * the hash is simple, stable, decoupled from extraction, and fails safe.
5
+ *
6
+ * Lives in brain-core so the KERNEL owns the hash contract — the same
7
+ * function serves both sides: hosts compute it at file-read for ingest AND
8
+ * when building the diskList for reconcile; the brain only stores and
9
+ * compares. Honest caveat: today `import { contentHash } from
10
+ * '@kybernesis/brain-core'` still loads better-sqlite3 transitively (the
11
+ * Stage-1 auto-default storage seam is a static import in the barrel); a
12
+ * `./hash` subpath export is the future hardening for hosts that talk to a
13
+ * remote brain and never want the native dep.
14
+ */
15
+ import { createHash } from 'node:crypto';
16
+ export function contentHash(rawBytes) {
17
+ return createHash('sha256').update(rawBytes).digest('hex');
18
+ }
19
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,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
@@ -33,4 +33,8 @@ export { storeConversation, filterNoiseEntities, isStoreActive, } from './store-
33
33
  export type { ConversationInput } from './store-conversation.js';
34
34
  export { formatRecall, formatTimelineRich, formatSearchRich, } from './ops.js';
35
35
  export type { TimelineFormatOpts, SearchFormatOpts } from './ops.js';
36
+ export { diffFilePaths, reconcile } from './reconcile.js';
37
+ export type { ReconcileOptions, ReconcileReport, ReconcileError } from './reconcile.js';
38
+ export type { DiskFileEntry, BrainFileEntry, FilePathsDiff } from '@kybernesis/brain-contracts';
39
+ export { contentHash } from './hash.js';
36
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -18,4 +18,11 @@ export { factFirstSearch } from './fact-retrieval.js';
18
18
  export { hybridSearch } from './hybrid-search.js';
19
19
  export { storeConversation, filterNoiseEntities, isStoreActive, } from './store-conversation.js';
20
20
  export { formatRecall, formatTimelineRich, formatSearchRich, } from './ops.js';
21
+ // ─── Reconcile core (Spec C) ──────────────────────────────────────────────────
22
+ // The boundary: hosts walk disk + hash (contentHash); the brain answers its
23
+ // file list; the PURE diff compares; reconcile() applies repairs through the
24
+ // storage provider's SQL primitives. Policy lives here in the kernel —
25
+ // backends only execute SQL. Entry types live in brain-contracts.
26
+ export { diffFilePaths, reconcile } from './reconcile.js';
27
+ export { contentHash } from './hash.js';
21
28
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,SAAS,EACT,UAAU,GACX,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,UAAU,EAAE,cAAc,EAAE,WAAW,EACvC,oBAAoB,EAAE,sBAAsB,EAAE,kBAAkB,EAChE,aAAa,GACd,MAAM,cAAc,CAAC;AAKtB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,IAAI,oBAAoB,GACvC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACd,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,SAAS,EACT,UAAU,GACX,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,UAAU,EAAE,cAAc,EAAE,WAAW,EACvC,oBAAoB,EAAE,sBAAsB,EAAE,kBAAkB,EAChE,aAAa,GACd,MAAM,cAAc,CAAC;AAKtB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,IAAI,oBAAoB,GACvC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACd,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAGlB,iFAAiF;AACjF,4EAA4E;AAC5E,6EAA6E;AAC7E,uEAAuE;AACvE,kEAAkE;AAClE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Reconcile core (Spec C — docs/plans/reconcile-provenance-roadmap.md).
3
+ *
4
+ * THE BOUNDARY: the brain never touches the filesystem. The HOST walks its
5
+ * watched roots, filters, and hashes (sha256 of raw bytes — `contentHash`) and
6
+ * passes the result as `diskList`. The BRAIN answers its file list
7
+ * (TimelineRepository.listAllFilePaths). `diffFilePaths` — pure, zero I/O —
8
+ * compares, and `reconcile()` applies repairs through the storage provider's
9
+ * SQL primitives. Policy lives HERE in the kernel; backends only execute SQL —
10
+ * a future libsql/Turso backend inherits reconcile by implementing four
11
+ * primitives (listAllFilePaths, relabelFilePath, stampContentHash,
12
+ * removeFileCluster).
13
+ *
14
+ * Classification:
15
+ * missing — on disk, no brain row (→ repair: re-ingest via callback)
16
+ * stale — both, hashes differ (→ repair: re-ingest via callback)
17
+ * orphaned — brain row, not on disk (→ removeOrphaned: delete cluster)
18
+ * renamed — a missing path whose hash equals an orphaned row's hash
19
+ * (→ repair: ONE file_path relabel — cluster, enrichment, and
20
+ * embeddings all survive; no re-ingest, no re-embed)
21
+ * baseline — NULL-hash row matched on disk → stamp the current file's hash
22
+ * (lazy legacy backfill; the one report-mode write, by design)
23
+ *
24
+ * Fail-safety at the seam (the host can be wrong; the brain must not pay):
25
+ * - diskList entries are VALIDATED — empty file_path or a non-sha256-hex
26
+ * content_hash throws loudly instead of silently classifying the whole
27
+ * corpus stale (which under repair would re-extract + re-embed everything).
28
+ * Hash comparison is case-insensitive.
29
+ * - removeOrphaned REFUSES an empty diskList while the brain holds file rows:
30
+ * an empty list usually means the host's walk failed (unmounted root,
31
+ * permissions, swallowed error) — proceeding would delete every cluster.
32
+ * - Repair loops are isolated per item: one failed relabel/re-ingest/removal
33
+ * (e.g. a unique-index collision from a concurrent ingest, an LLM error)
34
+ * is recorded in `report.errors` and the run continues — the report is
35
+ * always returned. Reconcile is idempotent; rerun to converge.
36
+ *
37
+ * REPORT-ONLY by default. Re-ingest is delegated to `opts.reingest` because
38
+ * full ingestion (LLM extraction + embedding) is wired by the consumer
39
+ * (storeConversation). Rename-and-edit is NOT detected (hashes differ) — it
40
+ * degrades to the missing + orphaned pair. The watched-folders manifest is
41
+ * never consulted; the diskList is the truth.
42
+ */
43
+ import type { TenantContext, DiskFileEntry, BrainFileEntry, FilePathsDiff } from '@kybernesis/brain-contracts';
44
+ /**
45
+ * Pure classification — zero I/O, inputs never mutated. Throws on malformed
46
+ * disk entries (empty file_path, non-sha256-hex content_hash); hash comparison
47
+ * is case-insensitive. Duplicate disk paths: first entry wins. Duplicate
48
+ * hashes among orphans: the LAST-listed orphan is the rename candidate
49
+ * (deterministic, pinned by tests); among missing files, the FIRST claims the
50
+ * rename and later ones stay missing.
51
+ */
52
+ export declare function diffFilePaths<D extends DiskFileEntry>(diskList: readonly D[], brainList: readonly BrainFileEntry[]): FilePathsDiff<D>;
53
+ /** A repair step that failed; the run continued (per-item isolation). */
54
+ export interface ReconcileError {
55
+ stage: 'baseline' | 'relabel' | 'reingest' | 'remove';
56
+ file_path: string;
57
+ error: string;
58
+ }
59
+ export interface ReconcileReport<D extends DiskFileEntry = DiskFileEntry> {
60
+ missing: D[];
61
+ stale: Array<D & {
62
+ id: number;
63
+ brain_hash: string;
64
+ }>;
65
+ orphaned: BrainFileEntry[];
66
+ renamed: Array<{
67
+ id: number;
68
+ from: string;
69
+ to: string;
70
+ }>;
71
+ /** Legacy NULL-hash rows stamped with the current file's hash this run. */
72
+ baselined: number;
73
+ /** Entries in the supplied diskList. */
74
+ scanned: number;
75
+ /** Actions actually performed (empty unless repair/removeOrphaned). */
76
+ repaired: {
77
+ relabelled: number;
78
+ reingested: number;
79
+ removed: number;
80
+ };
81
+ /** Per-item repair failures — the run continues past them; rerun to converge. */
82
+ errors: ReconcileError[];
83
+ }
84
+ export interface ReconcileOptions<D extends DiskFileEntry = DiskFileEntry> {
85
+ /**
86
+ * The HOST's view of disk: relative path + sha256(raw bytes) per file,
87
+ * walked/filtered/hashed by the caller. Extra fields (e.g. absolute_path)
88
+ * pass through to the report and the reingest callback.
89
+ */
90
+ diskList: readonly D[];
91
+ /** Apply renames (relabel) and re-ingest missing/stale via `reingest`. */
92
+ repair?: boolean;
93
+ /**
94
+ * Delete orphaned rows + their clusters. DESTRUCTIVE — explicitly opt-in,
95
+ * and refused when `diskList` is empty while the brain holds file rows
96
+ * (an empty list usually means the host's walk failed; proceeding would
97
+ * delete every file cluster in the brain).
98
+ */
99
+ removeOrphaned?: boolean;
100
+ /** Consumer-provided ingest (storeConversation wired by the consumer). */
101
+ reingest?: (file: D) => Promise<void>;
102
+ }
103
+ export declare function reconcile<D extends DiskFileEntry>(t: TenantContext, opts: ReconcileOptions<D>): Promise<ReconcileReport<D>>;
104
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAK/G;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,aAAa,EACnD,QAAQ,EAAE,SAAS,CAAC,EAAE,EACtB,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,aAAa,CAAC,CAAC,CAAC,CAuDlB;AAED,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACtE,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,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,wCAAwC;IACxC,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;IACtE,iFAAiF;IACjF,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACvE;;;;OAIG;IACH,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;IACvB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAsB,SAAS,CAAC,CAAC,SAAS,aAAa,EACrD,CAAC,EAAE,aAAa,EAChB,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CA0E7B"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Reconcile core (Spec C — docs/plans/reconcile-provenance-roadmap.md).
3
+ *
4
+ * THE BOUNDARY: the brain never touches the filesystem. The HOST walks its
5
+ * watched roots, filters, and hashes (sha256 of raw bytes — `contentHash`) and
6
+ * passes the result as `diskList`. The BRAIN answers its file list
7
+ * (TimelineRepository.listAllFilePaths). `diffFilePaths` — pure, zero I/O —
8
+ * compares, and `reconcile()` applies repairs through the storage provider's
9
+ * SQL primitives. Policy lives HERE in the kernel; backends only execute SQL —
10
+ * a future libsql/Turso backend inherits reconcile by implementing four
11
+ * primitives (listAllFilePaths, relabelFilePath, stampContentHash,
12
+ * removeFileCluster).
13
+ *
14
+ * Classification:
15
+ * missing — on disk, no brain row (→ repair: re-ingest via callback)
16
+ * stale — both, hashes differ (→ repair: re-ingest via callback)
17
+ * orphaned — brain row, not on disk (→ removeOrphaned: delete cluster)
18
+ * renamed — a missing path whose hash equals an orphaned row's hash
19
+ * (→ repair: ONE file_path relabel — cluster, enrichment, and
20
+ * embeddings all survive; no re-ingest, no re-embed)
21
+ * baseline — NULL-hash row matched on disk → stamp the current file's hash
22
+ * (lazy legacy backfill; the one report-mode write, by design)
23
+ *
24
+ * Fail-safety at the seam (the host can be wrong; the brain must not pay):
25
+ * - diskList entries are VALIDATED — empty file_path or a non-sha256-hex
26
+ * content_hash throws loudly instead of silently classifying the whole
27
+ * corpus stale (which under repair would re-extract + re-embed everything).
28
+ * Hash comparison is case-insensitive.
29
+ * - removeOrphaned REFUSES an empty diskList while the brain holds file rows:
30
+ * an empty list usually means the host's walk failed (unmounted root,
31
+ * permissions, swallowed error) — proceeding would delete every cluster.
32
+ * - Repair loops are isolated per item: one failed relabel/re-ingest/removal
33
+ * (e.g. a unique-index collision from a concurrent ingest, an LLM error)
34
+ * is recorded in `report.errors` and the run continues — the report is
35
+ * always returned. Reconcile is idempotent; rerun to converge.
36
+ *
37
+ * REPORT-ONLY by default. Re-ingest is delegated to `opts.reingest` because
38
+ * full ingestion (LLM extraction + embedding) is wired by the consumer
39
+ * (storeConversation). Rename-and-edit is NOT detected (hashes differ) — it
40
+ * degrades to the missing + orphaned pair. The watched-folders manifest is
41
+ * never consulted; the diskList is the truth.
42
+ */
43
+ import { getStorage } from './storage.js';
44
+ const SHA256_HEX = /^[0-9a-f]{64}$/;
45
+ /**
46
+ * Pure classification — zero I/O, inputs never mutated. Throws on malformed
47
+ * disk entries (empty file_path, non-sha256-hex content_hash); hash comparison
48
+ * is case-insensitive. Duplicate disk paths: first entry wins. Duplicate
49
+ * hashes among orphans: the LAST-listed orphan is the rename candidate
50
+ * (deterministic, pinned by tests); among missing files, the FIRST claims the
51
+ * rename and later ones stay missing.
52
+ */
53
+ export function diffFilePaths(diskList, brainList) {
54
+ const diskByPath = new Map();
55
+ const diskHashByPath = new Map();
56
+ for (const f of diskList) {
57
+ if (!f.file_path) {
58
+ throw new TypeError('[brain-core/diffFilePaths] disk entry with empty file_path — host walk bug; refusing to classify');
59
+ }
60
+ const hash = f.content_hash?.toLowerCase();
61
+ if (!hash || !SHA256_HEX.test(hash)) {
62
+ throw new TypeError(`[brain-core/diffFilePaths] invalid content_hash for '${f.file_path}' (expected 64-char sha256 hex) — ` +
63
+ `a host hashing bug here would classify the entire corpus stale and re-ingest everything; refusing`);
64
+ }
65
+ if (!diskByPath.has(f.file_path)) {
66
+ diskByPath.set(f.file_path, f);
67
+ diskHashByPath.set(f.file_path, hash);
68
+ }
69
+ }
70
+ const stale = [];
71
+ const orphaned = [];
72
+ const baseline = [];
73
+ const brainPaths = new Set();
74
+ for (const row of brainList) {
75
+ brainPaths.add(row.file_path);
76
+ const disk = diskByPath.get(row.file_path);
77
+ if (!disk) {
78
+ orphaned.push(row);
79
+ }
80
+ else if (row.content_hash === null) {
81
+ baseline.push({ id: row.id, file_path: row.file_path, content_hash: diskHashByPath.get(row.file_path) });
82
+ }
83
+ else if (row.content_hash.toLowerCase() !== diskHashByPath.get(row.file_path)) {
84
+ stale.push({ ...disk, id: row.id, brain_hash: row.content_hash });
85
+ }
86
+ }
87
+ const renamed = [];
88
+ const orphanByHash = new Map();
89
+ for (const o of orphaned)
90
+ if (o.content_hash)
91
+ orphanByHash.set(o.content_hash.toLowerCase(), o);
92
+ const missing = [];
93
+ for (const f of diskByPath.values()) {
94
+ if (brainPaths.has(f.file_path))
95
+ continue;
96
+ const o = orphanByHash.get(diskHashByPath.get(f.file_path));
97
+ if (o) {
98
+ renamed.push({ id: o.id, from: o.file_path, to: f.file_path });
99
+ orphanByHash.delete(diskHashByPath.get(f.file_path));
100
+ orphaned.splice(orphaned.indexOf(o), 1);
101
+ }
102
+ else {
103
+ missing.push(f);
104
+ }
105
+ }
106
+ return { missing, stale, orphaned, renamed, baseline };
107
+ }
108
+ export async function reconcile(t, opts) {
109
+ const timeline = getStorage().repositories.timeline;
110
+ const brainRows = await timeline.listAllFilePaths(t);
111
+ if (opts.removeOrphaned && opts.diskList.length === 0 && brainRows.length > 0) {
112
+ throw new Error(`[brain-core/reconcile] refusing removeOrphaned with an EMPTY diskList while the brain holds ` +
113
+ `${brainRows.length} file row(s). An empty disk list usually means the host's walk failed ` +
114
+ `(unmounted root, permission error, swallowed exception) — proceeding would delete every ` +
115
+ `file cluster. Run report-only to inspect, or pass the real disk list.`);
116
+ }
117
+ const diff = diffFilePaths(opts.diskList, brainRows);
118
+ const errors = [];
119
+ const repaired = { relabelled: 0, reingested: 0, removed: 0 };
120
+ // Lazy baseline stamp — the one report-mode write (documented).
121
+ let baselined = 0;
122
+ for (const b of diff.baseline) {
123
+ try {
124
+ await timeline.stampContentHash(t, b.id, b.content_hash);
125
+ baselined++;
126
+ }
127
+ catch (err) {
128
+ errors.push({ stage: 'baseline', file_path: b.file_path, error: String(err) });
129
+ }
130
+ }
131
+ if (opts.repair) {
132
+ for (const r of diff.renamed) {
133
+ try {
134
+ // Can throw SQLITE_CONSTRAINT if a concurrent ingest (or a non-'file'
135
+ // row invisible to listAllFilePaths) already holds the target path in
136
+ // the partial unique index — isolated so the run completes.
137
+ await timeline.relabelFilePath(t, r.id, r.to);
138
+ repaired.relabelled++;
139
+ }
140
+ catch (err) {
141
+ errors.push({ stage: 'relabel', file_path: r.to, error: String(err) });
142
+ }
143
+ }
144
+ if (opts.reingest) {
145
+ for (const f of [...diff.missing, ...diff.stale]) {
146
+ try {
147
+ await opts.reingest(f);
148
+ repaired.reingested++;
149
+ }
150
+ catch (err) {
151
+ errors.push({ stage: 'reingest', file_path: f.file_path, error: String(err) });
152
+ }
153
+ }
154
+ }
155
+ }
156
+ if (opts.removeOrphaned) {
157
+ for (const o of diff.orphaned) {
158
+ try {
159
+ await timeline.removeFileCluster(t, o.file_path, { removeEvent: true });
160
+ repaired.removed++;
161
+ }
162
+ catch (err) {
163
+ errors.push({ stage: 'remove', file_path: o.file_path, error: String(err) });
164
+ }
165
+ }
166
+ }
167
+ return {
168
+ missing: diff.missing,
169
+ stale: diff.stale,
170
+ orphaned: diff.orphaned,
171
+ renamed: diff.renamed,
172
+ baselined,
173
+ scanned: opts.diskList.length,
174
+ repaired,
175
+ errors,
176
+ };
177
+ }
178
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kybernesis/brain-core",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "Kernel brain methods — timeline, entity-graph, facts, vectors, retrieval, sleep",
5
5
  "license": "MIT",
6
6
  "author": "David Cruwys (AppyDave)",
@@ -27,11 +27,11 @@
27
27
  "README.md"
28
28
  ],
29
29
  "dependencies": {
30
- "@kybernesis/brain-contracts": "0.10.0",
31
- "@kybernesis/brain-storage-sqlite": "0.10.0"
30
+ "@kybernesis/brain-contracts": "0.11.0",
31
+ "@kybernesis/brain-storage-sqlite": "0.11.0"
32
32
  },
33
33
  "peerDependencies": {
34
- "@kybernesis/brain-storage-vec": "0.10.0"
34
+ "@kybernesis/brain-storage-vec": "0.11.0"
35
35
  },
36
36
  "peerDependenciesMeta": {
37
37
  "@kybernesis/brain-storage-vec": {
@@ -39,8 +39,10 @@
39
39
  }
40
40
  },
41
41
  "devDependencies": {
42
- "@kybernesis/brain-testkit": "0.10.0",
43
- "@kybernesis/brain-storage-vec": "0.10.0"
42
+ "@types/better-sqlite3": "^7.6.13",
43
+ "better-sqlite3": "^12.10.0",
44
+ "@kybernesis/brain-storage-vec": "0.11.0",
45
+ "@kybernesis/brain-testkit": "0.11.0"
44
46
  },
45
47
  "publishConfig": {
46
48
  "access": "public"