@kybernesis/brain-testkit 0.2.0 → 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.
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Backend conformance suite (Stage 2, Layer A).
3
+ *
4
+ * A backend-agnostic set of behavioural cases that ANY StorageProvider must
5
+ * satisfy. Authored against the interfaces (not SQL), so the SAME corpus that
6
+ * SQLite passes is the done-gate for a future backend (libsql in Stage 3): the
7
+ * new impl is "done" when it goes green against these — not when its author
8
+ * hand-writes backend-specific tests.
9
+ *
10
+ * Pure (no vitest dependency), matching brain-testkit's parity-harness style.
11
+ * Each case throws on failure; the consumer drives them with it.each and gives
12
+ * each case a FRESH provider + isolated tenant. Scope = the persistence layer
13
+ * seamed in 0.3.0: timeline, entities, facts, vectors. (sleep/hybrid-search/
14
+ * fact-retrieval are 0.4.0 — not part of the persistence contract yet.)
15
+ */
16
+ import type { StorageProvider, TenantContext } from '@kybernesis/brain-contracts';
17
+ export interface ConformanceCase {
18
+ name: string;
19
+ run: (s: StorageProvider, t: TenantContext) => Promise<void>;
20
+ }
21
+ export declare const storageConformanceCases: ConformanceCase[];
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conformance/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAsB,MAAM,6BAA6B,CAAC;AAsCtG,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED,eAAO,MAAM,uBAAuB,EAAE,eAAe,EA6JpD,CAAC"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Backend conformance suite (Stage 2, Layer A).
3
+ *
4
+ * A backend-agnostic set of behavioural cases that ANY StorageProvider must
5
+ * satisfy. Authored against the interfaces (not SQL), so the SAME corpus that
6
+ * SQLite passes is the done-gate for a future backend (libsql in Stage 3): the
7
+ * new impl is "done" when it goes green against these — not when its author
8
+ * hand-writes backend-specific tests.
9
+ *
10
+ * Pure (no vitest dependency), matching brain-testkit's parity-harness style.
11
+ * Each case throws on failure; the consumer drives them with it.each and gives
12
+ * each case a FRESH provider + isolated tenant. Scope = the persistence layer
13
+ * seamed in 0.3.0: timeline, entities, facts, vectors. (sleep/hybrid-search/
14
+ * fact-retrieval are 0.4.0 — not part of the persistence contract yet.)
15
+ */
16
+ import { EMBEDDING_DIM } from '@kybernesis/brain-contracts';
17
+ // ─── tiny assertion helpers (vitest-free) ─────────────────────────────────────
18
+ function assert(cond, msg) {
19
+ if (!cond)
20
+ throw new Error(`conformance: ${msg}`);
21
+ }
22
+ function eq(actual, expected, msg) {
23
+ if (actual !== expected)
24
+ throw new Error(`conformance: ${msg} — expected ${String(expected)}, got ${String(actual)}`);
25
+ }
26
+ const ISO = (n) => new Date(Date.UTC(2026, 0, n, 12, 0, 0)).toISOString();
27
+ function event(overrides) {
28
+ return {
29
+ type: 'note',
30
+ timestamp: ISO(1),
31
+ title: 'Title',
32
+ summary: 'Summary',
33
+ entities: [],
34
+ topics: [],
35
+ priority: 0.5,
36
+ decay_score: 0,
37
+ tier: 'warm',
38
+ access_count: 0,
39
+ is_pinned: false,
40
+ ...overrides,
41
+ };
42
+ }
43
+ /** Deterministic 1536-dim vector seeded by `seed` (distinct seeds ⇒ distinct vectors). */
44
+ function vec(seed) {
45
+ const v = new Array(EMBEDDING_DIM);
46
+ for (let i = 0; i < EMBEDDING_DIM; i++)
47
+ v[i] = (Math.sin(seed * (i + 1)) + 1) / 2;
48
+ return v;
49
+ }
50
+ export const storageConformanceCases = [
51
+ // ── timeline ────────────────────────────────────────────────────────────────
52
+ {
53
+ name: 'timeline: addEvent returns a usable id and round-trips',
54
+ run: async (s, t) => {
55
+ const id = await s.repositories.timeline.addEvent(t, event({ source_path: '/c/1', title: 'Hello', entities: ['alice'] }));
56
+ assert(id > 0, 'addEvent should return a positive id');
57
+ const got = await s.repositories.timeline.getEventById(t, id);
58
+ assert(got, 'getEventById should find the event');
59
+ eq(got.title, 'Hello', 'title round-trips');
60
+ eq(got.source_path, '/c/1', 'source_path round-trips (snake_case field)');
61
+ },
62
+ },
63
+ {
64
+ name: 'timeline: addEvent upserts on source_path (no duplicate)',
65
+ run: async (s, t) => {
66
+ await s.repositories.timeline.addEvent(t, event({ source_path: '/c/dup', title: 'First' }));
67
+ await s.repositories.timeline.addEvent(t, event({ source_path: '/c/dup', title: 'Second' }));
68
+ const got = await s.repositories.timeline.getEventByPath(t, '/c/dup');
69
+ eq(got.title, 'Second', 'upsert overwrites title');
70
+ const stats = await s.repositories.timeline.stats(t);
71
+ eq(stats.totalEvents, 1, 'upsert does not create a duplicate row');
72
+ },
73
+ },
74
+ {
75
+ name: 'timeline: FTS query MATCHes inserted content',
76
+ run: async (s, t) => {
77
+ await s.repositories.timeline.addEvent(t, event({ source_path: '/c/fts', title: 'Kybernesis roadmap' }));
78
+ const hits = await s.repositories.timeline.query(t, { search: 'kybernesis' });
79
+ assert(hits.some(e => e.source_path === '/c/fts'), 'FTS MATCH finds the event');
80
+ },
81
+ },
82
+ {
83
+ name: 'timeline: deleteEventById removes and reports',
84
+ run: async (s, t) => {
85
+ const id = await s.repositories.timeline.addEvent(t, event({ source_path: '/c/del' }));
86
+ eq(await s.repositories.timeline.deleteEventById(t, id), true, 'delete reports true');
87
+ eq(await s.repositories.timeline.getEventById(t, id), null, 'event is gone');
88
+ },
89
+ },
90
+ // ── entities ──────────────────────────────────────────────────────────────
91
+ {
92
+ name: 'entities: findOrCreateEntity is idempotent on (normalized_name, type)',
93
+ run: async (s, t) => {
94
+ const a = await s.repositories.entities.findOrCreateEntity(t, 'Alice', 'person', ISO(1));
95
+ const b = await s.repositories.entities.findOrCreateEntity(t, ' alice ', 'person', ISO(2));
96
+ eq(b.id, a.id, 'same normalized name+type returns same entity');
97
+ eq(b.mention_count, 2, 'mention_count bumps on repeat');
98
+ },
99
+ },
100
+ {
101
+ name: 'entities: mention round-trips via getEntityContext',
102
+ run: async (s, t) => {
103
+ const e = await s.repositories.entities.findOrCreateEntity(t, 'Bob', 'person', ISO(1));
104
+ await s.repositories.entities.addEntityMention(t, e.id, 'conv1', '/c/1', 'met Bob', ISO(1));
105
+ const ctx = await s.repositories.entities.getEntityContext(t, e.id);
106
+ assert(ctx, 'context found');
107
+ eq(ctx.mentions.length, 1, 'one mention recorded');
108
+ },
109
+ },
110
+ {
111
+ name: 'entities: mergeEntities relocates BOTH source- and target-side edges',
112
+ run: async (s, t) => {
113
+ const keep = await s.repositories.entities.findOrCreateEntity(t, 'Robert', 'person', ISO(1));
114
+ const remove = await s.repositories.entities.findOrCreateEntity(t, 'Bob', 'person', ISO(1));
115
+ const acme = await s.repositories.entities.findOrCreateEntity(t, 'Acme', 'company', ISO(1));
116
+ const dave = await s.repositories.entities.findOrCreateEntity(t, 'Dave', 'person', ISO(1));
117
+ // remove is source of one directional edge and target of another
118
+ await s.repositories.entities.linkEntitiesWithType(t, remove.id, acme.id, { relationship: 'works_at', confidence: 0.9 });
119
+ await s.repositories.entities.linkEntitiesWithType(t, dave.id, remove.id, { relationship: 'manages', confidence: 0.9 });
120
+ const { relations_moved } = await s.repositories.entities.mergeEntities(t, keep.id, remove.id, 'dedupe');
121
+ eq(relations_moved, 2, 'both edge directions relocate (guards the historical merge bug)');
122
+ },
123
+ },
124
+ {
125
+ name: 'entities: trackAccess increments access_count',
126
+ run: async (s, t) => {
127
+ const e = await s.repositories.entities.findOrCreateEntity(t, 'Carol', 'person', ISO(1));
128
+ await s.repositories.entities.trackAccess(t, e.id);
129
+ const ctx = await s.repositories.entities.getEntityContext(t, e.id);
130
+ eq(ctx.entity.access_count, 1, 'access_count bumped');
131
+ },
132
+ },
133
+ // ── facts ───────────────────────────────────────────────────────────────────
134
+ {
135
+ name: 'facts: storeFact returns an id and getFactById round-trips',
136
+ run: async (s, t) => {
137
+ await s.repositories.timeline.ensureSchema(t); // facts table lives in timeline.db; timeline owns its DDL
138
+ const id = await s.repositories.facts.storeFact(t, {
139
+ content: 'Alice likes tea', source_path: '/f/1', source_conversation_id: 'c1',
140
+ entities: ['alice'], timestamp: ISO(1), confidence: 0.9, category: 'preference',
141
+ source_type: 'chat', tags: [],
142
+ });
143
+ assert(id > 0, 'storeFact returns positive id');
144
+ const got = await s.repositories.facts.getFactById(t, id);
145
+ eq(got.content, 'Alice likes tea', 'fact content round-trips');
146
+ },
147
+ },
148
+ {
149
+ name: 'facts: searchFactsFts MATCHes and getFactsForEntity filters by entity',
150
+ run: async (s, t) => {
151
+ await s.repositories.timeline.ensureSchema(t);
152
+ await s.repositories.facts.storeFact(t, {
153
+ content: 'Bob founded Acme', source_path: '/f/2', source_conversation_id: 'c1',
154
+ entities: ['bob', 'acme'], timestamp: ISO(1), confidence: 0.9, category: 'biographical',
155
+ source_type: 'chat', tags: [],
156
+ });
157
+ const fts = await s.repositories.facts.searchFactsFts(t, 'Acme', 10);
158
+ assert(fts.some(f => f.source_path === '/f/2'), 'FTS finds the fact');
159
+ const forBob = await s.repositories.facts.getFactsForEntity(t, 'bob');
160
+ assert(forBob.some(f => f.source_path === '/f/2'), 'entity filter finds the fact');
161
+ },
162
+ },
163
+ {
164
+ name: 'facts: getFactContentsByCategory respects frecency vs recent ordering',
165
+ run: async (s, t) => {
166
+ await s.repositories.timeline.ensureSchema(t);
167
+ await s.repositories.facts.storeFact(t, {
168
+ content: 'older high-confidence', source_path: '/f/a', source_conversation_id: 'c1',
169
+ entities: [], timestamp: ISO(1), confidence: 0.95, category: 'plan', source_type: 'chat', tags: [],
170
+ });
171
+ await s.repositories.facts.storeFact(t, {
172
+ content: 'newer low-confidence', source_path: '/f/b', source_conversation_id: 'c1',
173
+ entities: [], timestamp: ISO(9), confidence: 0.3, category: 'plan', source_type: 'chat', tags: [],
174
+ });
175
+ const frecency = await s.repositories.facts.getFactContentsByCategory(t, 'plan', 10, 'frecency');
176
+ eq(frecency[0], 'older high-confidence', 'frecency orders by confidence first');
177
+ const recent = await s.repositories.facts.getFactContentsByCategory(t, 'plan', 10, 'recent');
178
+ eq(recent[0], 'newer low-confidence', 'recent orders by timestamp first');
179
+ },
180
+ },
181
+ // ── vectors ───────────────────────────────────────────────────────────────
182
+ {
183
+ name: 'vectors: insertChunk + stats count, hasOrigin dedupe',
184
+ run: async (s, t) => {
185
+ if (!(await s.repositories.vectors.available(t)))
186
+ return; // skip if sqlite-vec unavailable on this platform
187
+ await s.repositories.vectors.insertChunk(t, { embedding: vec(1), ts: ISO(1), content: 'apples', source: '/v/1', origin_id: 'o1' });
188
+ const stats = await s.repositories.vectors.stats(t);
189
+ eq(stats.count, 1, 'one chunk indexed');
190
+ eq(await s.repositories.vectors.hasOrigin(t, 'o1'), true, 'hasOrigin true for indexed origin');
191
+ eq(await s.repositories.vectors.hasOrigin(t, 'nope'), false, 'hasOrigin false for unknown origin');
192
+ },
193
+ },
194
+ {
195
+ name: 'vectors: search returns the nearest chunk first',
196
+ run: async (s, t) => {
197
+ if (!(await s.repositories.vectors.available(t)))
198
+ return;
199
+ await s.repositories.vectors.insertChunk(t, { embedding: vec(1), ts: ISO(1), content: 'apples', source: '/v/1' });
200
+ await s.repositories.vectors.insertChunk(t, { embedding: vec(50), ts: ISO(2), content: 'oranges', source: '/v/2' });
201
+ const rows = await s.repositories.vectors.search(t, vec(1), 2);
202
+ assert(rows.length >= 1, 'search returns rows');
203
+ eq(rows[0].content, 'apples', 'nearest vector (same seed) ranks first');
204
+ },
205
+ },
206
+ ];
207
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conformance/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './parity/index.js';
2
+ export * from './conformance/index.js';
2
3
  export * from './helpers/tenant.js';
3
4
  export * from './llm-stub.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './parity/index.js';
2
+ export * from './conformance/index.js';
2
3
  export * from './helpers/tenant.js';
3
4
  export * from './llm-stub.js';
4
5
  //# 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":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kybernesis/brain-testkit",
3
- "version": "0.2.0",
3
+ "version": "0.6.0",
4
4
  "description": "In-memory fakes and parity harness for testing brain-* consumers",
5
5
  "license": "MIT",
6
6
  "author": "David Cruwys (AppyDave)",
@@ -25,6 +25,10 @@
25
25
  "types": "./dist/parity/index.d.ts",
26
26
  "default": "./dist/parity/index.js"
27
27
  },
28
+ "./conformance": {
29
+ "types": "./dist/conformance/index.d.ts",
30
+ "default": "./dist/conformance/index.js"
31
+ },
28
32
  "./helpers": {
29
33
  "types": "./dist/helpers/tenant.d.ts",
30
34
  "default": "./dist/helpers/tenant.js"
@@ -35,7 +39,7 @@
35
39
  "README.md"
36
40
  ],
37
41
  "dependencies": {
38
- "@kybernesis/brain-contracts": "0.2.0"
42
+ "@kybernesis/brain-contracts": "0.6.0"
39
43
  },
40
44
  "publishConfig": {
41
45
  "access": "public"