@polpo-ai/core 0.15.46 → 0.15.48

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.
Files changed (89) hide show
  1. package/dist/__tests__/brain-contracts.test.d.ts +2 -0
  2. package/dist/__tests__/brain-contracts.test.d.ts.map +1 -0
  3. package/dist/__tests__/brain-contracts.test.js +366 -0
  4. package/dist/__tests__/brain-contracts.test.js.map +1 -0
  5. package/dist/__tests__/brain-local.test.d.ts +2 -0
  6. package/dist/__tests__/brain-local.test.d.ts.map +1 -0
  7. package/dist/__tests__/brain-local.test.js +627 -0
  8. package/dist/__tests__/brain-local.test.js.map +1 -0
  9. package/dist/__tests__/brain-service.test.d.ts +2 -0
  10. package/dist/__tests__/brain-service.test.d.ts.map +1 -0
  11. package/dist/__tests__/brain-service.test.js +193 -0
  12. package/dist/__tests__/brain-service.test.js.map +1 -0
  13. package/dist/adapter.d.ts +5 -0
  14. package/dist/adapter.d.ts.map +1 -1
  15. package/dist/brain/chunking.d.ts +13 -0
  16. package/dist/brain/chunking.d.ts.map +1 -0
  17. package/dist/brain/chunking.js +99 -0
  18. package/dist/brain/chunking.js.map +1 -0
  19. package/dist/brain/contracts.d.ts +15 -0
  20. package/dist/brain/contracts.d.ts.map +1 -0
  21. package/dist/brain/contracts.js +361 -0
  22. package/dist/brain/contracts.js.map +1 -0
  23. package/dist/brain/errors.d.ts +7 -0
  24. package/dist/brain/errors.d.ts.map +1 -0
  25. package/dist/brain/errors.js +11 -0
  26. package/dist/brain/errors.js.map +1 -0
  27. package/dist/brain/in-memory-store.d.ts +59 -0
  28. package/dist/brain/in-memory-store.d.ts.map +1 -0
  29. package/dist/brain/in-memory-store.js +797 -0
  30. package/dist/brain/in-memory-store.js.map +1 -0
  31. package/dist/brain/index.d.ts +24 -0
  32. package/dist/brain/index.d.ts.map +1 -0
  33. package/dist/brain/index.js +14 -0
  34. package/dist/brain/index.js.map +1 -0
  35. package/dist/brain/ingestion.d.ts +23 -0
  36. package/dist/brain/ingestion.d.ts.map +1 -0
  37. package/dist/brain/ingestion.js +161 -0
  38. package/dist/brain/ingestion.js.map +1 -0
  39. package/dist/brain/lifecycle.d.ts +6 -0
  40. package/dist/brain/lifecycle.d.ts.map +1 -0
  41. package/dist/brain/lifecycle.js +50 -0
  42. package/dist/brain/lifecycle.js.map +1 -0
  43. package/dist/brain/parsers.d.ts +7 -0
  44. package/dist/brain/parsers.d.ts.map +1 -0
  45. package/dist/brain/parsers.js +47 -0
  46. package/dist/brain/parsers.js.map +1 -0
  47. package/dist/brain/ports.d.ts +18 -0
  48. package/dist/brain/ports.d.ts.map +1 -0
  49. package/dist/brain/ports.js +2 -0
  50. package/dist/brain/ports.js.map +1 -0
  51. package/dist/brain/reading.d.ts +25 -0
  52. package/dist/brain/reading.d.ts.map +1 -0
  53. package/dist/brain/reading.js +96 -0
  54. package/dist/brain/reading.js.map +1 -0
  55. package/dist/brain/retrieval.d.ts +19 -0
  56. package/dist/brain/retrieval.d.ts.map +1 -0
  57. package/dist/brain/retrieval.js +134 -0
  58. package/dist/brain/retrieval.js.map +1 -0
  59. package/dist/brain/scope.d.ts +5 -0
  60. package/dist/brain/scope.d.ts.map +1 -0
  61. package/dist/brain/scope.js +26 -0
  62. package/dist/brain/scope.js.map +1 -0
  63. package/dist/brain/service.d.ts +68 -0
  64. package/dist/brain/service.d.ts.map +1 -0
  65. package/dist/brain/service.js +2 -0
  66. package/dist/brain/service.js.map +1 -0
  67. package/dist/brain/store-errors.d.ts +17 -0
  68. package/dist/brain/store-errors.d.ts.map +1 -0
  69. package/dist/brain/store-errors.js +39 -0
  70. package/dist/brain/store-errors.js.map +1 -0
  71. package/dist/brain/stores.d.ts +44 -0
  72. package/dist/brain/stores.d.ts.map +1 -0
  73. package/dist/brain/stores.js +2 -0
  74. package/dist/brain/stores.js.map +1 -0
  75. package/dist/brain/types.d.ts +300 -0
  76. package/dist/brain/types.d.ts.map +1 -0
  77. package/dist/brain/types.js +43 -0
  78. package/dist/brain/types.js.map +1 -0
  79. package/dist/brain/validation.d.ts +12 -0
  80. package/dist/brain/validation.d.ts.map +1 -0
  81. package/dist/brain/validation.js +129 -0
  82. package/dist/brain/validation.js.map +1 -0
  83. package/dist/index.d.ts +1 -0
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +2 -0
  86. package/dist/index.js.map +1 -1
  87. package/dist/scheduling/driver.d.ts +8 -3
  88. package/dist/scheduling/driver.d.ts.map +1 -1
  89. package/package.json +5 -1
@@ -0,0 +1,627 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { BrainStoreConflictError, BrainStoreValidationError, InMemoryBrainStore, PlainTextBrainParser, chunkBrainSections, createBrainIngestionJob, createBrainSource, createBrainSourceVersion, ingestBrainSource, retrieveBrain, } from "../brain/index.js";
3
+ const projectA = { kind: "project", subjectId: "project-a" };
4
+ const projectB = { kind: "project", subjectId: "project-b" };
5
+ const at = "2026-07-28T12:00:00.000Z";
6
+ const actor = {
7
+ actor: "agent",
8
+ actorId: "support",
9
+ agentName: "support",
10
+ projectId: "project-a",
11
+ };
12
+ const allow = {
13
+ authorize: async () => ({ allowed: true, reason: "test" }),
14
+ };
15
+ function source(id, scope = projectA, label = "Support guide") {
16
+ return createBrainSource({
17
+ id,
18
+ scope,
19
+ type: "paste",
20
+ label,
21
+ trust: "user_provided",
22
+ }, { now: () => at });
23
+ }
24
+ function version(sourceId, name) {
25
+ return createBrainSourceVersion({
26
+ sourceId,
27
+ version: name,
28
+ }, { now: () => at });
29
+ }
30
+ async function seed(store, input = {}) {
31
+ const sourceId = input.sourceId ?? "source-1";
32
+ const scope = input.scope ?? projectA;
33
+ const versionName = input.version ?? "v1";
34
+ await store.createSource(source(sourceId, scope, input.label));
35
+ await store.createVersion(scope, version(sourceId, versionName));
36
+ return ingestBrainSource({
37
+ ref: { scope, sourceId },
38
+ version: versionName,
39
+ body: {
40
+ kind: "text",
41
+ text: input.content ?? "Billing refunds are processed within five days.",
42
+ },
43
+ contentType: "text/plain",
44
+ actor,
45
+ }, {
46
+ sourceStore: store,
47
+ versionStore: store,
48
+ chunkStore: store,
49
+ accessPolicy: allow,
50
+ parsers: [new PlainTextBrainParser()],
51
+ now: () => at,
52
+ });
53
+ }
54
+ describe("InMemoryBrainStore", () => {
55
+ it("isolates identical source ids by explicit scope", async () => {
56
+ const store = new InMemoryBrainStore();
57
+ await store.createSource(source("same", projectA, "A"));
58
+ await store.createSource(source("same", projectB, "B"));
59
+ await expect(store.getSource({ scope: projectA, sourceId: "same" }))
60
+ .resolves.toMatchObject({ label: "A" });
61
+ await expect(store.getSource({ scope: projectB, sourceId: "same" }))
62
+ .resolves.toMatchObject({ label: "B" });
63
+ await expect(store.getSource({
64
+ scope: { kind: "project", subjectId: "project-c" },
65
+ sourceId: "same",
66
+ })).resolves.toBeNull();
67
+ });
68
+ it("rejects unscoped list and candidate searches", async () => {
69
+ const store = new InMemoryBrainStore();
70
+ await expect(store.listSources({ scopes: [] })).rejects.toBeInstanceOf(BrainStoreValidationError);
71
+ await expect(store.searchCandidates({
72
+ sources: [{
73
+ scope: { kind: "project", subjectId: "" },
74
+ sourceId: "source-1",
75
+ }],
76
+ query: "billing",
77
+ limit: 5,
78
+ })).rejects.toBeInstanceOf(BrainStoreValidationError);
79
+ await expect(store.searchCandidates({
80
+ sources: [],
81
+ query: "billing",
82
+ limit: 5,
83
+ })).resolves.toEqual([]);
84
+ });
85
+ it("rejects duplicate sources only inside the same scope", async () => {
86
+ const store = new InMemoryBrainStore();
87
+ await store.createSource(source("source-1"));
88
+ await expect(store.createSource(source("source-1"))).rejects.toBeInstanceOf(BrainStoreConflictError);
89
+ await expect(store.createSource(source("source-1", projectB))).resolves
90
+ .toMatchObject({ scope: projectB });
91
+ });
92
+ it("atomically rejects malformed chunk replacements", async () => {
93
+ const store = new InMemoryBrainStore();
94
+ await store.createSource(source("source-1"));
95
+ await store.createVersion(projectA, version("source-1", "v1"));
96
+ const valid = chunkBrainSections({
97
+ source: source("source-1"),
98
+ version: "v1",
99
+ sections: [{ content: "First valid chunk." }],
100
+ createId: () => "chunk-1",
101
+ });
102
+ await store.replaceVersionChunks({
103
+ scope: projectA,
104
+ sourceId: "source-1",
105
+ version: "v1",
106
+ chunks: valid,
107
+ });
108
+ await expect(store.replaceVersionChunks({
109
+ scope: projectA,
110
+ sourceId: "source-1",
111
+ version: "v1",
112
+ chunks: [
113
+ valid[0],
114
+ { ...valid[0], id: "chunk-2", index: 0 },
115
+ ],
116
+ })).rejects.toBeInstanceOf(BrainStoreValidationError);
117
+ await expect(store.listVersionChunks({
118
+ scope: projectA,
119
+ sourceId: "source-1",
120
+ version: "v1",
121
+ })).resolves.toEqual(valid);
122
+ });
123
+ it("publishes an indexed version and preserves citations in keyword results", async () => {
124
+ const store = new InMemoryBrainStore();
125
+ await seed(store);
126
+ const stored = await store.getSource({ scope: projectA, sourceId: "source-1" });
127
+ expect(stored).toMatchObject({
128
+ status: "indexed",
129
+ currentVersion: "v1",
130
+ });
131
+ const results = await store.searchCandidates({
132
+ sources: [{ scope: projectA, sourceId: "source-1" }],
133
+ query: "billing refunds",
134
+ limit: 5,
135
+ });
136
+ expect(results).toHaveLength(1);
137
+ expect(results[0].chunk.citation).toMatchObject({
138
+ sourceId: "source-1",
139
+ version: "v1",
140
+ chunkId: results[0].chunk.id,
141
+ });
142
+ expect(results[0].score).toBeGreaterThan(0);
143
+ });
144
+ it("keeps the previous indexed version visible when reindex parsing fails", async () => {
145
+ const store = new InMemoryBrainStore();
146
+ await seed(store, { content: "Stable billing policy." });
147
+ await store.createVersion(projectA, version("source-1", "v2"));
148
+ await expect(ingestBrainSource({
149
+ ref: { scope: projectA, sourceId: "source-1" },
150
+ version: "v2",
151
+ body: { kind: "text", text: "new content" },
152
+ contentType: "application/x-broken",
153
+ actor,
154
+ }, {
155
+ sourceStore: store,
156
+ versionStore: store,
157
+ chunkStore: store,
158
+ accessPolicy: allow,
159
+ parsers: [new PlainTextBrainParser()],
160
+ now: () => "2026-07-28T12:01:00.000Z",
161
+ })).rejects.toThrow(/parser/i);
162
+ await expect(store.getSource({
163
+ scope: projectA,
164
+ sourceId: "source-1",
165
+ })).resolves.toMatchObject({
166
+ status: "indexed",
167
+ currentVersion: "v1",
168
+ });
169
+ await expect(store.getVersion({
170
+ scope: projectA,
171
+ sourceId: "source-1",
172
+ version: "v2",
173
+ })).resolves.toMatchObject({ status: "failed" });
174
+ const results = await store.searchCandidates({
175
+ sources: [{ scope: projectA, sourceId: "source-1" }],
176
+ query: "stable billing",
177
+ limit: 5,
178
+ });
179
+ expect(results.map((result) => result.chunk.version)).toEqual(["v1"]);
180
+ });
181
+ it("makes deletion immediately invisible to retrieval", async () => {
182
+ const store = new InMemoryBrainStore();
183
+ await seed(store);
184
+ await store.deleteSource({ scope: projectA, sourceId: "source-1" });
185
+ await expect(store.searchCandidates({
186
+ sources: [{ scope: projectA, sourceId: "source-1" }],
187
+ query: "billing",
188
+ limit: 5,
189
+ })).resolves.toEqual([]);
190
+ });
191
+ it("exports and restores an immutable validated snapshot", async () => {
192
+ const store = new InMemoryBrainStore();
193
+ await seed(store);
194
+ const snapshot = store.snapshot();
195
+ const restored = new InMemoryBrainStore({ snapshot });
196
+ const first = await restored.searchCandidates({
197
+ sources: [{ scope: projectA, sourceId: "source-1" }],
198
+ query: "billing",
199
+ limit: 5,
200
+ });
201
+ expect(first).toHaveLength(1);
202
+ expect(Object.isFrozen(snapshot)).toBe(true);
203
+ expect(() => new InMemoryBrainStore({
204
+ snapshot: {
205
+ ...snapshot,
206
+ version: 999,
207
+ },
208
+ })).toThrow(BrainStoreValidationError);
209
+ });
210
+ it("restores versions with identical source ids into their exact scopes", async () => {
211
+ const store = new InMemoryBrainStore();
212
+ await seed(store, {
213
+ sourceId: "shared",
214
+ scope: projectA,
215
+ content: "Project A billing policy.",
216
+ });
217
+ await seed(store, {
218
+ sourceId: "shared",
219
+ scope: projectB,
220
+ content: "Project B retention policy.",
221
+ });
222
+ const restored = new InMemoryBrainStore({ snapshot: store.snapshot() });
223
+ await expect(restored.searchCandidates({
224
+ sources: [{ scope: projectA, sourceId: "shared" }],
225
+ query: "billing",
226
+ limit: 5,
227
+ })).resolves.toHaveLength(1);
228
+ await expect(restored.searchCandidates({
229
+ sources: [{ scope: projectA, sourceId: "shared" }],
230
+ query: "retention",
231
+ limit: 5,
232
+ })).resolves.toEqual([]);
233
+ await expect(restored.searchCandidates({
234
+ sources: [{ scope: projectB, sourceId: "shared" }],
235
+ query: "retention",
236
+ limit: 5,
237
+ })).resolves.toHaveLength(1);
238
+ });
239
+ });
240
+ describe("Brain ingestion jobs", () => {
241
+ function job(id = "job-1", dedupeKey = "source-1:v1") {
242
+ return createBrainIngestionJob({
243
+ id,
244
+ scope: projectA,
245
+ sourceId: "source-1",
246
+ version: "v1",
247
+ operation: "ingest",
248
+ dedupeKey,
249
+ maxAttempts: 2,
250
+ }, { now: () => at });
251
+ }
252
+ it("deduplicates enqueue delivery by scope and dedupe key", async () => {
253
+ const store = new InMemoryBrainStore();
254
+ await expect(store.enqueueJob(job())).resolves.toMatchObject({ created: true });
255
+ await expect(store.enqueueJob(job("job-duplicate"))).resolves.toMatchObject({
256
+ created: false,
257
+ job: { id: "job-1" },
258
+ });
259
+ await expect(store.enqueueJob(createBrainIngestionJob({
260
+ ...job("job-b"),
261
+ scope: projectB,
262
+ }))).resolves.toMatchObject({ created: true });
263
+ });
264
+ it("claims a job once and rejects stale claim tokens", async () => {
265
+ let id = 0;
266
+ const store = new InMemoryBrainStore({
267
+ createId: () => `claim-${++id}`,
268
+ });
269
+ await store.enqueueJob(job());
270
+ const claimInput = {
271
+ scope: projectA,
272
+ workerId: "worker-1",
273
+ now: at,
274
+ leaseMs: 60_000,
275
+ };
276
+ const [first, second] = await Promise.all([
277
+ store.claimNextJob(claimInput),
278
+ store.claimNextJob(claimInput),
279
+ ]);
280
+ expect([first, second].filter(Boolean)).toHaveLength(1);
281
+ const claimed = first ?? second;
282
+ expect(claimed).toMatchObject({
283
+ status: "processing",
284
+ attempt: 1,
285
+ claimedBy: "worker-1",
286
+ });
287
+ await expect(store.completeJob({
288
+ scope: projectA,
289
+ jobId: claimed.id,
290
+ claimToken: "stale",
291
+ now: "2026-07-28T12:00:30.000Z",
292
+ })).rejects.toBeInstanceOf(BrainStoreConflictError);
293
+ await expect(store.completeJob({
294
+ scope: projectA,
295
+ jobId: claimed.id,
296
+ claimToken: claimed.claimToken,
297
+ now: "2026-07-28T12:00:30.000Z",
298
+ })).resolves.toMatchObject({ status: "completed" });
299
+ });
300
+ it("requeues retryable failures and terminally fails after max attempts", async () => {
301
+ let id = 0;
302
+ const store = new InMemoryBrainStore({
303
+ createId: () => `claim-${++id}`,
304
+ });
305
+ await store.enqueueJob(job());
306
+ const first = await store.claimNextJob({
307
+ scope: projectA,
308
+ workerId: "worker",
309
+ now: at,
310
+ leaseMs: 1_000,
311
+ });
312
+ const pending = await store.failJob({
313
+ scope: projectA,
314
+ jobId: first.id,
315
+ claimToken: first.claimToken,
316
+ now: "2026-07-28T12:00:00.500Z",
317
+ retryAt: "2026-07-28T12:01:00.000Z",
318
+ failure: { code: "timeout", message: "Timed out", retryable: true },
319
+ });
320
+ expect(pending).toMatchObject({ status: "pending", attempt: 1 });
321
+ expect(await store.claimNextJob({
322
+ scope: projectA,
323
+ workerId: "worker",
324
+ now: "2026-07-28T12:00:59.999Z",
325
+ leaseMs: 1_000,
326
+ })).toBeNull();
327
+ const second = await store.claimNextJob({
328
+ scope: projectA,
329
+ workerId: "worker",
330
+ now: "2026-07-28T12:01:00.000Z",
331
+ leaseMs: 1_000,
332
+ });
333
+ const failed = await store.failJob({
334
+ scope: projectA,
335
+ jobId: second.id,
336
+ claimToken: second.claimToken,
337
+ now: "2026-07-28T12:01:00.500Z",
338
+ failure: { code: "timeout", message: "Timed out", retryable: true },
339
+ });
340
+ expect(failed).toMatchObject({ status: "failed", attempt: 2 });
341
+ });
342
+ it("terminally fails an expired final lease instead of orphaning the job", async () => {
343
+ const store = new InMemoryBrainStore({ createId: () => "claim-final" });
344
+ await store.enqueueJob(createBrainIngestionJob({
345
+ ...job(),
346
+ maxAttempts: 1,
347
+ }));
348
+ const claimed = await store.claimNextJob({
349
+ scope: projectA,
350
+ workerId: "worker",
351
+ now: at,
352
+ leaseMs: 1_000,
353
+ });
354
+ expect(claimed).toMatchObject({ status: "processing", attempt: 1 });
355
+ await expect(store.claimNextJob({
356
+ scope: projectA,
357
+ workerId: "other-worker",
358
+ now: "2026-07-28T12:00:01.001Z",
359
+ leaseMs: 1_000,
360
+ })).resolves.toBeNull();
361
+ await expect(store.getJob({
362
+ scope: projectA,
363
+ jobId: claimed.id,
364
+ })).resolves.toMatchObject({
365
+ status: "failed",
366
+ failure: { code: "lease_exhausted", retryable: false },
367
+ });
368
+ });
369
+ });
370
+ describe("Brain ingestion and retrieval", () => {
371
+ it("chunks deterministically with bounded overlap and stable citations", () => {
372
+ let id = 0;
373
+ const chunks = chunkBrainSections({
374
+ source: source("source-1"),
375
+ version: "v1",
376
+ sections: [{
377
+ locator: "chapter 1",
378
+ content: "Sentence one. ".repeat(400),
379
+ }],
380
+ maxCharacters: 240,
381
+ overlapCharacters: 40,
382
+ createId: () => `chunk-${++id}`,
383
+ });
384
+ expect(chunks.length).toBeGreaterThan(2);
385
+ expect(chunks.every((chunk, index) => (chunk.index === index
386
+ && chunk.content.length <= 240
387
+ && chunk.citation.chunkId === chunk.id
388
+ && chunk.citation.locator?.startsWith("chapter 1")))).toBe(true);
389
+ expect(() => chunkBrainSections({
390
+ source: source("source-1"),
391
+ version: "v1",
392
+ sections: [{ content: "text" }],
393
+ maxCharacters: 100,
394
+ overlapCharacters: 100,
395
+ })).toThrow(BrainStoreValidationError);
396
+ });
397
+ it("authorizes every source before candidate ranking", async () => {
398
+ const store = new InMemoryBrainStore();
399
+ await seed(store, { sourceId: "allowed", content: "Allowed billing guide." });
400
+ await seed(store, { sourceId: "denied", content: "Denied secret billing guide." });
401
+ const search = vi.spyOn(store, "searchCandidates");
402
+ const policy = {
403
+ authorize: async ({ source }) => ({
404
+ allowed: source.id === "allowed",
405
+ reason: source.id === "allowed" ? "grant" : "deny",
406
+ }),
407
+ };
408
+ const results = await retrieveBrain({
409
+ query: "billing guide",
410
+ scopes: [projectA],
411
+ actor,
412
+ limit: 10,
413
+ tokenBudget: 1_000,
414
+ }, {
415
+ sourceStore: store,
416
+ chunkStore: store,
417
+ accessPolicy: policy,
418
+ });
419
+ expect(results.map((result) => result.chunk.sourceId)).toEqual(["allowed"]);
420
+ expect(search).toHaveBeenCalledWith(expect.objectContaining({
421
+ sources: [{ scope: projectA, sourceId: "allowed" }],
422
+ }));
423
+ });
424
+ it("never sends a same-id source from a denied scope to the reranker", async () => {
425
+ const store = new InMemoryBrainStore();
426
+ await seed(store, {
427
+ sourceId: "shared",
428
+ scope: projectA,
429
+ content: "Allowed billing guide.",
430
+ });
431
+ await seed(store, {
432
+ sourceId: "shared",
433
+ scope: projectB,
434
+ content: "Denied billing secret.",
435
+ });
436
+ let reranked = [];
437
+ const reranker = {
438
+ rerank: async ({ results }) => {
439
+ reranked = results;
440
+ return results;
441
+ },
442
+ };
443
+ const policy = {
444
+ authorize: async ({ source }) => ({
445
+ allowed: source.scope.subjectId === projectA.subjectId,
446
+ reason: "scope grant",
447
+ }),
448
+ };
449
+ const results = await retrieveBrain({
450
+ query: "billing",
451
+ scopes: [projectA, projectB],
452
+ actor,
453
+ limit: 5,
454
+ tokenBudget: 1_000,
455
+ }, {
456
+ sourceStore: store,
457
+ chunkStore: store,
458
+ accessPolicy: policy,
459
+ reranker,
460
+ });
461
+ expect(reranked).toHaveLength(1);
462
+ expect(reranked[0].scope).toEqual(projectA);
463
+ expect(results).toHaveLength(1);
464
+ expect(results[0].scope).toEqual(projectA);
465
+ });
466
+ it("fails closed when access policy throws or returns malformed data", async () => {
467
+ const store = new InMemoryBrainStore();
468
+ await seed(store);
469
+ for (const authorize of [
470
+ async () => {
471
+ throw new Error("policy offline");
472
+ },
473
+ async () => ({ allowed: "yes" }),
474
+ ]) {
475
+ await expect(retrieveBrain({
476
+ query: "billing",
477
+ scopes: [projectA],
478
+ actor,
479
+ limit: 5,
480
+ tokenBudget: 1_000,
481
+ }, {
482
+ sourceStore: store,
483
+ chunkStore: store,
484
+ accessPolicy: { authorize },
485
+ })).resolves.toEqual([]);
486
+ }
487
+ });
488
+ it("rechecks authorization after ranking before returning content", async () => {
489
+ const store = new InMemoryBrainStore();
490
+ await seed(store);
491
+ let calls = 0;
492
+ const policy = {
493
+ authorize: async () => ({
494
+ allowed: ++calls === 1,
495
+ reason: calls === 1 ? "initial grant" : "revoked",
496
+ }),
497
+ };
498
+ await expect(retrieveBrain({
499
+ query: "billing",
500
+ scopes: [projectA],
501
+ actor,
502
+ limit: 5,
503
+ tokenBudget: 1_000,
504
+ }, {
505
+ sourceStore: store,
506
+ chunkStore: store,
507
+ accessPolicy: policy,
508
+ })).resolves.toEqual([]);
509
+ });
510
+ it("drops sources deleted while a reranker is running", async () => {
511
+ const store = new InMemoryBrainStore();
512
+ await seed(store);
513
+ const reranker = {
514
+ rerank: async ({ results }) => {
515
+ await store.deleteSource({ scope: projectA, sourceId: "source-1" });
516
+ return results;
517
+ },
518
+ };
519
+ await expect(retrieveBrain({
520
+ query: "billing",
521
+ scopes: [projectA],
522
+ actor,
523
+ limit: 5,
524
+ tokenBudget: 1_000,
525
+ }, {
526
+ sourceStore: store,
527
+ chunkStore: store,
528
+ accessPolicy: allow,
529
+ reranker,
530
+ })).resolves.toEqual([]);
531
+ });
532
+ it("falls back to lexical order when embedding or reranking fails", async () => {
533
+ const embedder = {
534
+ embed: async () => {
535
+ throw new Error("embedding offline");
536
+ },
537
+ };
538
+ const store = new InMemoryBrainStore({ embeddingProvider: embedder });
539
+ await seed(store, {
540
+ sourceId: "b",
541
+ content: "Billing guide alpha.",
542
+ label: "B",
543
+ });
544
+ await seed(store, {
545
+ sourceId: "a",
546
+ content: "Billing guide alpha.",
547
+ label: "A",
548
+ });
549
+ const reranker = {
550
+ rerank: async () => {
551
+ throw new Error("reranker offline");
552
+ },
553
+ };
554
+ const results = await retrieveBrain({
555
+ query: "billing guide",
556
+ scopes: [projectA],
557
+ actor,
558
+ limit: 10,
559
+ tokenBudget: 1_000,
560
+ }, {
561
+ sourceStore: store,
562
+ chunkStore: store,
563
+ accessPolicy: allow,
564
+ reranker,
565
+ failureMode: "fallback",
566
+ });
567
+ expect(results.map((result) => result.chunk.sourceId)).toEqual(["a", "b"]);
568
+ });
569
+ it("rejects a reranker that drops citation identity in strict mode", async () => {
570
+ const store = new InMemoryBrainStore();
571
+ await seed(store);
572
+ const reranker = {
573
+ rerank: async ({ results }) => [{
574
+ ...results[0],
575
+ chunk: {
576
+ ...results[0].chunk,
577
+ citation: {
578
+ ...results[0].chunk.citation,
579
+ sourceId: "other-source",
580
+ },
581
+ },
582
+ }],
583
+ };
584
+ await expect(retrieveBrain({
585
+ query: "billing",
586
+ scopes: [projectA],
587
+ actor,
588
+ limit: 5,
589
+ tokenBudget: 1_000,
590
+ }, {
591
+ sourceStore: store,
592
+ chunkStore: store,
593
+ accessPolicy: allow,
594
+ reranker,
595
+ failureMode: "strict",
596
+ })).rejects.toThrow(/reranker/i);
597
+ });
598
+ it("enforces the final token budget and returns no segment for empty input", async () => {
599
+ const store = new InMemoryBrainStore();
600
+ await seed(store, {
601
+ content: "billing ".repeat(800),
602
+ });
603
+ await expect(retrieveBrain({
604
+ query: "billing",
605
+ scopes: [projectA],
606
+ actor,
607
+ limit: 10,
608
+ tokenBudget: 0,
609
+ }, {
610
+ sourceStore: store,
611
+ chunkStore: store,
612
+ accessPolicy: allow,
613
+ })).resolves.toEqual([]);
614
+ await expect(retrieveBrain({
615
+ query: " ",
616
+ scopes: [projectA],
617
+ actor,
618
+ limit: 10,
619
+ tokenBudget: 1_000,
620
+ }, {
621
+ sourceStore: store,
622
+ chunkStore: store,
623
+ accessPolicy: allow,
624
+ })).resolves.toEqual([]);
625
+ });
626
+ });
627
+ //# sourceMappingURL=brain-local.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-local.test.js","sourceRoot":"","sources":["../../src/__tests__/brain-local.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=brain-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-service.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/brain-service.test.ts"],"names":[],"mappings":""}