@fgv/ts-agent-memory 5.1.0-39 → 5.1.0-41
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/.rush/temp/{b82cf6bdece20481260e6bab946179eeec9d7b46.tar.log → cbbdbe09515171b4eba8f2592be2dace1e4e8142.tar.log} +14 -2
- package/.rush/temp/chunked-rush-logs/ts-agent-memory.build.chunks.jsonl +2 -2
- package/.rush/temp/operation/build/all.log +2 -2
- package/.rush/temp/operation/build/log-chunks.jsonl +2 -2
- package/.rush/temp/operation/build/state.json +1 -1
- package/dist/packlets/converters/envelopeConverter.js +17 -3
- package/dist/packlets/converters/envelopeConverter.js.map +1 -1
- package/dist/packlets/index/memoryIndex.js +58 -10
- package/dist/packlets/index/memoryIndex.js.map +1 -1
- package/dist/packlets/ingest/cycleGuard.js +13 -6
- package/dist/packlets/ingest/cycleGuard.js.map +1 -1
- package/dist/packlets/ingest/hostStages.js.map +1 -1
- package/dist/packlets/ingest/model.js.map +1 -1
- package/dist/packlets/ingest/orchestrator.js +94 -49
- package/dist/packlets/ingest/orchestrator.js.map +1 -1
- package/dist/packlets/retrieve/hybridRetriever.js +13 -2
- package/dist/packlets/retrieve/hybridRetriever.js.map +1 -1
- package/dist/packlets/retrieve/linkTraversalRetriever.js +46 -57
- package/dist/packlets/retrieve/linkTraversalRetriever.js.map +1 -1
- package/dist/packlets/retrieve/recencyRetriever.js +3 -3
- package/dist/packlets/retrieve/recencyRetriever.js.map +1 -1
- package/dist/packlets/retrieve/retriever.js +50 -7
- package/dist/packlets/retrieve/retriever.js.map +1 -1
- package/dist/packlets/retrieve/semanticRetriever.js +9 -3
- package/dist/packlets/retrieve/semanticRetriever.js.map +1 -1
- package/dist/packlets/retrieve/structuredFilterRetriever.js +3 -3
- package/dist/packlets/retrieve/structuredFilterRetriever.js.map +1 -1
- package/dist/packlets/retrieve/tagRetriever.js +3 -3
- package/dist/packlets/retrieve/tagRetriever.js.map +1 -1
- package/dist/packlets/retrieve/temporalRetrievers.js +3 -3
- package/dist/packlets/retrieve/temporalRetrievers.js.map +1 -1
- package/dist/packlets/store/fileTreeMemoryStore.js +72 -16
- package/dist/packlets/store/fileTreeMemoryStore.js.map +1 -1
- package/dist/packlets/tools/memoryTools.js +104 -21
- package/dist/packlets/tools/memoryTools.js.map +1 -1
- package/dist/packlets/types/envelope.js +13 -1
- package/dist/packlets/types/envelope.js.map +1 -1
- package/dist/packlets/vector/inMemoryCosineIndex.js +22 -17
- package/dist/packlets/vector/inMemoryCosineIndex.js.map +1 -1
- package/dist/packlets/vector/vectorIndex.js.map +1 -1
- package/dist/test/unit/converters/antagonistRoundTrip.test.js +3 -3
- package/dist/test/unit/converters/antagonistRoundTrip.test.js.map +1 -1
- package/dist/test/unit/converters/envelopeConverter.test.js +125 -8
- package/dist/test/unit/converters/envelopeConverter.test.js.map +1 -1
- package/dist/test/unit/index/memoryIndex.test.js +87 -25
- package/dist/test/unit/index/memoryIndex.test.js.map +1 -1
- package/dist/test/unit/ingest/antagonistCycleAndParity.test.js +20 -16
- package/dist/test/unit/ingest/antagonistCycleAndParity.test.js.map +1 -1
- package/dist/test/unit/ingest/cycleGuard.test.js +28 -1
- package/dist/test/unit/ingest/cycleGuard.test.js.map +1 -1
- package/dist/test/unit/ingest/orchestrator.test.js +187 -45
- package/dist/test/unit/ingest/orchestrator.test.js.map +1 -1
- package/dist/test/unit/retrieve/linkTraversalRetriever.test.js +106 -31
- package/dist/test/unit/retrieve/linkTraversalRetriever.test.js.map +1 -1
- package/dist/test/unit/retrieve/retrievers.test.js +299 -37
- package/dist/test/unit/retrieve/retrievers.test.js.map +1 -1
- package/dist/test/unit/store/embedOnWrite.test.js +69 -12
- package/dist/test/unit/store/embedOnWrite.test.js.map +1 -1
- package/dist/test/unit/store/listScoped.test.js +109 -0
- package/dist/test/unit/store/listScoped.test.js.map +1 -0
- package/dist/test/unit/store/rankAxis.test.js +254 -0
- package/dist/test/unit/store/rankAxis.test.js.map +1 -0
- package/dist/test/unit/tools/memoryTools.test.js +280 -11
- package/dist/test/unit/tools/memoryTools.test.js.map +1 -1
- package/dist/test/unit/types/writePolicy.test.js +9 -2
- package/dist/test/unit/types/writePolicy.test.js.map +1 -1
- package/dist/test/unit/vector/inMemoryCosineIndex.test.js +95 -35
- package/dist/test/unit/vector/inMemoryCosineIndex.test.js.map +1 -1
- package/dist/test/unit/vector/vectorIndex.test.js +24 -15
- package/dist/test/unit/vector/vectorIndex.test.js.map +1 -1
- package/dist/ts-agent-memory.d.ts +384 -97
- package/etc/ts-agent-memory.api.md +64 -22
- package/lib/packlets/converters/envelopeConverter.d.ts +8 -1
- package/lib/packlets/converters/envelopeConverter.d.ts.map +1 -1
- package/lib/packlets/converters/envelopeConverter.js +18 -4
- package/lib/packlets/converters/envelopeConverter.js.map +1 -1
- package/lib/packlets/index/memoryIndex.d.ts +42 -10
- package/lib/packlets/index/memoryIndex.d.ts.map +1 -1
- package/lib/packlets/index/memoryIndex.js +58 -10
- package/lib/packlets/index/memoryIndex.js.map +1 -1
- package/lib/packlets/ingest/cycleGuard.d.ts +5 -5
- package/lib/packlets/ingest/cycleGuard.d.ts.map +1 -1
- package/lib/packlets/ingest/cycleGuard.js +13 -6
- package/lib/packlets/ingest/cycleGuard.js.map +1 -1
- package/lib/packlets/ingest/hostStages.d.ts +3 -3
- package/lib/packlets/ingest/hostStages.d.ts.map +1 -1
- package/lib/packlets/ingest/hostStages.js.map +1 -1
- package/lib/packlets/ingest/model.d.ts +25 -14
- package/lib/packlets/ingest/model.d.ts.map +1 -1
- package/lib/packlets/ingest/model.js.map +1 -1
- package/lib/packlets/ingest/orchestrator.d.ts +18 -4
- package/lib/packlets/ingest/orchestrator.d.ts.map +1 -1
- package/lib/packlets/ingest/orchestrator.js +93 -48
- package/lib/packlets/ingest/orchestrator.js.map +1 -1
- package/lib/packlets/retrieve/hybridRetriever.d.ts.map +1 -1
- package/lib/packlets/retrieve/hybridRetriever.js +12 -1
- package/lib/packlets/retrieve/hybridRetriever.js.map +1 -1
- package/lib/packlets/retrieve/linkTraversalRetriever.d.ts +18 -23
- package/lib/packlets/retrieve/linkTraversalRetriever.d.ts.map +1 -1
- package/lib/packlets/retrieve/linkTraversalRetriever.js +45 -56
- package/lib/packlets/retrieve/linkTraversalRetriever.js.map +1 -1
- package/lib/packlets/retrieve/recencyRetriever.js +2 -2
- package/lib/packlets/retrieve/recencyRetriever.js.map +1 -1
- package/lib/packlets/retrieve/retriever.d.ts +70 -11
- package/lib/packlets/retrieve/retriever.d.ts.map +1 -1
- package/lib/packlets/retrieve/retriever.js +52 -7
- package/lib/packlets/retrieve/retriever.js.map +1 -1
- package/lib/packlets/retrieve/semanticRetriever.d.ts.map +1 -1
- package/lib/packlets/retrieve/semanticRetriever.js +9 -3
- package/lib/packlets/retrieve/semanticRetriever.js.map +1 -1
- package/lib/packlets/retrieve/structuredFilterRetriever.js +2 -2
- package/lib/packlets/retrieve/structuredFilterRetriever.js.map +1 -1
- package/lib/packlets/retrieve/tagRetriever.js +2 -2
- package/lib/packlets/retrieve/tagRetriever.js.map +1 -1
- package/lib/packlets/retrieve/temporalRetrievers.js +3 -3
- package/lib/packlets/retrieve/temporalRetrievers.js.map +1 -1
- package/lib/packlets/store/fileTreeMemoryStore.d.ts +57 -3
- package/lib/packlets/store/fileTreeMemoryStore.d.ts.map +1 -1
- package/lib/packlets/store/fileTreeMemoryStore.js +72 -16
- package/lib/packlets/store/fileTreeMemoryStore.js.map +1 -1
- package/lib/packlets/tools/memoryTools.d.ts +24 -0
- package/lib/packlets/tools/memoryTools.d.ts.map +1 -1
- package/lib/packlets/tools/memoryTools.js +104 -21
- package/lib/packlets/tools/memoryTools.js.map +1 -1
- package/lib/packlets/types/envelope.d.ts +61 -8
- package/lib/packlets/types/envelope.d.ts.map +1 -1
- package/lib/packlets/types/envelope.js +14 -0
- package/lib/packlets/types/envelope.js.map +1 -1
- package/lib/packlets/vector/inMemoryCosineIndex.d.ts +9 -5
- package/lib/packlets/vector/inMemoryCosineIndex.d.ts.map +1 -1
- package/lib/packlets/vector/inMemoryCosineIndex.js +22 -17
- package/lib/packlets/vector/inMemoryCosineIndex.js.map +1 -1
- package/lib/packlets/vector/vectorIndex.d.ts +46 -20
- package/lib/packlets/vector/vectorIndex.d.ts.map +1 -1
- package/lib/packlets/vector/vectorIndex.js.map +1 -1
- package/lib/test/unit/converters/antagonistRoundTrip.test.js +3 -3
- package/lib/test/unit/converters/antagonistRoundTrip.test.js.map +1 -1
- package/lib/test/unit/converters/envelopeConverter.test.js +124 -7
- package/lib/test/unit/converters/envelopeConverter.test.js.map +1 -1
- package/lib/test/unit/index/memoryIndex.test.js +86 -24
- package/lib/test/unit/index/memoryIndex.test.js.map +1 -1
- package/lib/test/unit/ingest/antagonistCycleAndParity.test.js +20 -16
- package/lib/test/unit/ingest/antagonistCycleAndParity.test.js.map +1 -1
- package/lib/test/unit/ingest/cycleGuard.test.js +28 -1
- package/lib/test/unit/ingest/cycleGuard.test.js.map +1 -1
- package/lib/test/unit/ingest/orchestrator.test.js +186 -44
- package/lib/test/unit/ingest/orchestrator.test.js.map +1 -1
- package/lib/test/unit/retrieve/linkTraversalRetriever.test.js +106 -31
- package/lib/test/unit/retrieve/linkTraversalRetriever.test.js.map +1 -1
- package/lib/test/unit/retrieve/retrievers.test.js +298 -36
- package/lib/test/unit/retrieve/retrievers.test.js.map +1 -1
- package/lib/test/unit/store/embedOnWrite.test.js +68 -11
- package/lib/test/unit/store/embedOnWrite.test.js.map +1 -1
- package/lib/test/unit/store/listScoped.test.d.ts +2 -0
- package/lib/test/unit/store/listScoped.test.d.ts.map +1 -0
- package/lib/test/unit/store/listScoped.test.js +111 -0
- package/lib/test/unit/store/listScoped.test.js.map +1 -0
- package/lib/test/unit/store/rankAxis.test.d.ts +2 -0
- package/lib/test/unit/store/rankAxis.test.d.ts.map +1 -0
- package/lib/test/unit/store/rankAxis.test.js +256 -0
- package/lib/test/unit/store/rankAxis.test.js.map +1 -0
- package/lib/test/unit/tools/memoryTools.test.js +280 -11
- package/lib/test/unit/tools/memoryTools.test.js.map +1 -1
- package/lib/test/unit/types/writePolicy.test.js +9 -2
- package/lib/test/unit/types/writePolicy.test.js.map +1 -1
- package/lib/test/unit/vector/inMemoryCosineIndex.test.js +95 -35
- package/lib/test/unit/vector/inMemoryCosineIndex.test.js.map +1 -1
- package/lib/test/unit/vector/vectorIndex.test.js +24 -15
- package/lib/test/unit/vector/vectorIndex.test.js.map +1 -1
- package/package.json +7 -7
- package/rush-logs/ts-agent-memory.build.cache.log +1 -1
- package/rush-logs/ts-agent-memory.build.log +2 -2
- package/src/packlets/converters/envelopeConverter.ts +27 -4
- package/src/packlets/index/memoryIndex.ts +86 -22
- package/src/packlets/ingest/cycleGuard.ts +22 -11
- package/src/packlets/ingest/hostStages.ts +3 -3
- package/src/packlets/ingest/model.ts +25 -14
- package/src/packlets/ingest/orchestrator.ts +143 -67
- package/src/packlets/retrieve/hybridRetriever.ts +14 -1
- package/src/packlets/retrieve/linkTraversalRetriever.ts +51 -62
- package/src/packlets/retrieve/recencyRetriever.ts +3 -3
- package/src/packlets/retrieve/retriever.ts +97 -13
- package/src/packlets/retrieve/semanticRetriever.ts +10 -5
- package/src/packlets/retrieve/structuredFilterRetriever.ts +3 -3
- package/src/packlets/retrieve/tagRetriever.ts +3 -3
- package/src/packlets/retrieve/temporalRetrievers.ts +3 -3
- package/src/packlets/store/fileTreeMemoryStore.ts +117 -12
- package/src/packlets/tools/memoryTools.ts +152 -25
- package/src/packlets/types/envelope.ts +66 -8
- package/src/packlets/vector/inMemoryCosineIndex.ts +45 -22
- package/src/packlets/vector/vectorIndex.ts +47 -20
- package/src/test/unit/converters/antagonistRoundTrip.test.ts +3 -3
- package/src/test/unit/converters/envelopeConverter.test.ts +168 -11
- package/src/test/unit/index/memoryIndex.test.ts +99 -14
- package/src/test/unit/ingest/antagonistCycleAndParity.test.ts +23 -18
- package/src/test/unit/ingest/cycleGuard.test.ts +44 -2
- package/src/test/unit/ingest/orchestrator.test.ts +234 -41
- package/src/test/unit/retrieve/linkTraversalRetriever.test.ts +134 -35
- package/src/test/unit/retrieve/retrievers.test.ts +381 -25
- package/src/test/unit/store/embedOnWrite.test.ts +83 -11
- package/src/test/unit/store/listScoped.test.ts +138 -0
- package/src/test/unit/store/rankAxis.test.ts +349 -0
- package/src/test/unit/tools/memoryTools.test.ts +362 -13
- package/src/test/unit/types/writePolicy.test.ts +11 -2
- package/src/test/unit/vector/inMemoryCosineIndex.test.ts +115 -39
- package/src/test/unit/vector/vectorIndex.test.ts +33 -17
- package/temp/build/lint/_eslint-5eVG3S6w.json +41 -33
- package/temp/build/typescript/ts_8nwakTlr.json +1 -1
- package/temp/ts-agent-memory.api.json +1080 -136
- package/temp/ts-agent-memory.api.md +64 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrievers.test.js","sourceRoot":"","sources":["../../../../src/test/unit/retrieve/retrievers.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2026 Erik Fortune\n * SPDX-License-Identifier: MIT\n */\n\nimport '@fgv/ts-utils-jest';\nimport { Result, fail, succeed } from '@fgv/ts-utils';\nimport {\n HybridRetriever,\n IIndexedMemoryRecord,\n IMemoryQuery,\n IMemoryRecord,\n IMemoryRetriever,\n IMemoryRetrieverCapabilities,\n IVectorIndex,\n IVectorQueryHit,\n Kind,\n MemoryId,\n MemoryIndex,\n MemoryScopeKey,\n RecencyRetriever,\n ScoreUnionMergeStrategy,\n SemanticRetriever,\n StructuredFilterRetriever,\n Tag,\n TagRetriever,\n envelopeConverter,\n guardRetrieverCapabilities,\n limitRecords\n} from '../../../index';\n\ninterface IRecordSpec {\n readonly id: string;\n readonly scope?: string;\n readonly kind?: string;\n readonly tags?: ReadonlyArray<string>;\n readonly updated?: number;\n readonly seq?: number;\n}\n\nfunction makeEntry(spec: IRecordSpec): IIndexedMemoryRecord {\n const record: IMemoryRecord<unknown> = {\n envelope: envelopeConverter\n .convert({\n id: spec.id,\n entityId: spec.id,\n kind: spec.kind ?? 'knowledge',\n tags: spec.tags ?? [],\n links: [],\n created: 0,\n updated: spec.updated ?? 0,\n seq: spec.seq ?? 0,\n contentHash: 'h',\n provenance: { source: 'agent' }\n })\n .orThrow(),\n body: `body-${spec.id}`\n };\n return { scope: (spec.scope ?? 'knowledge') as MemoryScopeKey, record };\n}\n\nfunction buildIndex(specs: ReadonlyArray<IRecordSpec>): MemoryIndex {\n const index = MemoryIndex.create().orThrow();\n index.rebuild(specs.map(makeEntry)).orThrow();\n return index;\n}\n\nfunction ids(records: ReadonlyArray<IMemoryRecord<unknown>>): ReadonlyArray<string> {\n return records.map((r) => r.envelope.id as string);\n}\n\nconst knowledge: Kind = 'knowledge' as Kind;\n\ndescribe('retrieve helpers', () => {\n describe('guardRetrieverCapabilities', () => {\n const noCaps = {\n supportsSemanticRecall: false,\n supportsTemporalQuery: false,\n supportsLinkTraversal: false\n };\n\n test('passes when no unsupported capability is requested', () => {\n expect(guardRetrieverCapabilities({}, noCaps)).toSucceed();\n });\n\n test('fails loudly when semantic recall is requested but unsupported', () => {\n expect(guardRetrieverCapabilities({ semantic: 'q' }, noCaps)).toFailWith(\n /semantic recall requires a vector index; none configured/i\n );\n });\n\n test('fails loudly when an as-of query is requested but unsupported', () => {\n expect(guardRetrieverCapabilities({ asOf: 5 }, noCaps)).toFailWith(\n /temporal query requires temporal index; none configured/i\n );\n });\n\n test('names the kind in the temporal failure when present', () => {\n expect(guardRetrieverCapabilities({ asOf: 5, kind: knowledge }, noCaps)).toFailWith(\n /none configured for kind knowledge/i\n );\n });\n\n test('fails loudly when a link-traversal axis is requested but unsupported', () => {\n expect(guardRetrieverCapabilities({ linkedTo: 'x' as MemoryId }, noCaps)).toFailWith(\n /link traversal requires a backlink index; none configured/i\n );\n expect(guardRetrieverCapabilities({ linkedFrom: 'x' as MemoryId }, noCaps)).toFailWith(\n /link traversal requires/i\n );\n expect(guardRetrieverCapabilities({ hops: 2 }, noCaps)).toFailWith(/link traversal requires/i);\n });\n\n test('passes a link-traversal axis when the capability is supported', () => {\n expect(\n guardRetrieverCapabilities({ linkedTo: 'x' as MemoryId }, { ...noCaps, supportsLinkTraversal: true })\n ).toSucceed();\n });\n });\n\n describe('limitRecords', () => {\n const records = buildIndex([{ id: 'a' }, { id: 'b' }, { id: 'c' }])\n .entries()\n .map((e) => e.record);\n\n test('returns all records when no limit is supplied', () => {\n expect(limitRecords(records)).toHaveLength(3);\n });\n\n test('truncates to the top-N for a positive limit', () => {\n expect(limitRecords(records, 2)).toHaveLength(2);\n });\n\n test('returns an empty array for a zero or negative limit', () => {\n expect(limitRecords(records, 0)).toEqual([]);\n expect(limitRecords(records, -1)).toEqual([]);\n });\n });\n});\n\ndescribe('RecencyRetriever', () => {\n test('reports all-false capabilities', () => {\n const r = RecencyRetriever.create(buildIndex([])).orThrow();\n expect(r.capabilities).toEqual({\n supportsSemanticRecall: false,\n supportsTemporalQuery: false,\n supportsLinkTraversal: false\n });\n });\n\n test('returns every record most-recently-updated first', async () => {\n const r = RecencyRetriever.create(\n buildIndex([\n { id: 'a', updated: 10 },\n { id: 'b', updated: 30 },\n { id: 'c', updated: 20 }\n ])\n ).orThrow();\n expect(await r.retrieve({})).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'c', 'a']);\n });\n });\n\n test('breaks ties on seq descending', async () => {\n const r = RecencyRetriever.create(\n buildIndex([\n { id: 'a', updated: 10, seq: 1 },\n { id: 'b', updated: 10, seq: 3 },\n { id: 'c', updated: 10, seq: 2 }\n ])\n ).orThrow();\n expect(await r.retrieve({})).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'c', 'a']);\n });\n });\n\n test('honors scope, kind, tag, predicate, and limit filters', async () => {\n const index = buildIndex([\n { id: 'a', scope: 'knowledge', kind: 'knowledge', tags: ['x'], updated: 50 },\n { id: 'b', scope: 'knowledge', kind: 'knowledge', tags: ['y'], updated: 40 },\n { id: 'c', scope: 'other', kind: 'knowledge', tags: ['x'], updated: 60 },\n { id: 'd', scope: 'knowledge', kind: 'note', tags: ['x'], updated: 70 }\n ]);\n const r = RecencyRetriever.create(index).orThrow();\n expect(\n await r.retrieve({\n scope: 'knowledge' as MemoryScopeKey,\n kind: knowledge,\n tag: 'x' as Tag,\n filter: (rec) => rec.envelope.id !== ('skip' as MemoryId),\n limit: 5\n })\n ).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['a']);\n });\n });\n\n test('limit truncates to the top-N after ordering', async () => {\n const r = RecencyRetriever.create(\n buildIndex([\n { id: 'a', updated: 10 },\n { id: 'b', updated: 30 },\n { id: 'c', updated: 20 }\n ])\n ).orThrow();\n expect(await r.retrieve({ limit: 2 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'c']);\n }\n );\n });\n\n test('degrades loudly on a semantic request', async () => {\n const r = RecencyRetriever.create(buildIndex([{ id: 'a' }])).orThrow();\n expect(await r.retrieve({ semantic: 'hello' })).toFailWith(/semantic recall requires a vector index/i);\n });\n\n test('degrades loudly on a link-traversal request', async () => {\n const r = RecencyRetriever.create(buildIndex([{ id: 'a' }])).orThrow();\n expect(await r.retrieve({ linkedTo: 'a' as MemoryId })).toFailWith(/link traversal requires/i);\n });\n});\n\n/** A retriever with configurable capabilities that records the query it received. */\nclass RecordingRetriever implements IMemoryRetriever {\n public lastQuery: IMemoryQuery | undefined;\n public readonly capabilities: IMemoryRetrieverCapabilities;\n public constructor(capabilities: IMemoryRetrieverCapabilities) {\n this.capabilities = capabilities;\n }\n public retrieve(query: IMemoryQuery): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>> {\n this.lastQuery = query;\n return Promise.resolve(succeed([]));\n }\n}\n\ndescribe('TagRetriever', () => {\n test('returns records carrying the tag, recency-ordered', async () => {\n const r = TagRetriever.create(\n buildIndex([\n { id: 'a', tags: ['x'], updated: 10 },\n { id: 'b', tags: ['x', 'y'], updated: 30 },\n { id: 'c', tags: ['y'], updated: 20 }\n ])\n ).orThrow();\n expect(await r.retrieve({ tag: 'x' as Tag })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'a']);\n }\n );\n });\n\n test('returns empty (not failure) when no tag is supplied', async () => {\n const r = TagRetriever.create(buildIndex([{ id: 'a', tags: ['x'] }])).orThrow();\n expect(await r.retrieve({})).toSucceedWith([]);\n });\n\n test('degrades loudly on a semantic request', async () => {\n const r = TagRetriever.create(buildIndex([{ id: 'a', tags: ['x'] }])).orThrow();\n expect(await r.retrieve({ tag: 'x' as Tag, semantic: 'q' })).toFailWith(/semantic recall requires/i);\n });\n});\n\ndescribe('StructuredFilterRetriever', () => {\n test('applies the predicate over the scope/kind/tag pre-filter', async () => {\n const r = StructuredFilterRetriever.create(\n buildIndex([\n { id: 'keep-1', updated: 10 },\n { id: 'drop-1', updated: 30 },\n { id: 'keep-2', updated: 20 }\n ])\n ).orThrow();\n expect(\n await r.retrieve({ filter: (rec) => (rec.envelope.id as string).startsWith('keep') })\n ).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['keep-2', 'keep-1']);\n });\n });\n\n test('returns empty (not failure) when no predicate is supplied', async () => {\n const r = StructuredFilterRetriever.create(buildIndex([{ id: 'a' }])).orThrow();\n expect(await r.retrieve({})).toSucceedWith([]);\n });\n});\n\n/** A scripted in-memory vector index returning canned hits. */\nclass FakeVectorIndex implements IVectorIndex {\n private readonly _hits: ReadonlyArray<IVectorQueryHit>;\n private readonly _failQuery: boolean;\n /** The `topK` the most recent `query` call received — asserts forwarding. */\n public lastTopK: number | undefined;\n public constructor(hits: ReadonlyArray<IVectorQueryHit>, failQuery: boolean = false) {\n this._hits = hits;\n this._failQuery = failQuery;\n }\n public add(id: MemoryId): Promise<Result<string>> {\n return Promise.resolve(succeed(`ref-${id}`));\n }\n public remove(id: MemoryId): Promise<Result<MemoryId>> {\n return Promise.resolve(succeed(id));\n }\n public query(__vector: Float32Array, topK: number): Promise<Result<ReadonlyArray<IVectorQueryHit>>> {\n this.lastTopK = topK;\n return Promise.resolve(this._failQuery ? fail('vector backend down') : succeed(this._hits));\n }\n}\n\ndescribe('SemanticRetriever', () => {\n const okEmbed = (): Promise<Result<Float32Array>> =>\n Promise.resolve(succeed(Float32Array.from([0.1, 0.2])));\n\n test('reports supportsSemanticRecall=false when no backend is wired', () => {\n const r = SemanticRetriever.create({ index: buildIndex([]) }).orThrow();\n expect(r.capabilities.supportsSemanticRecall).toBe(false);\n });\n\n test('reports supportsSemanticRecall=true when a backend is wired', () => {\n const r = SemanticRetriever.create({\n index: buildIndex([]),\n backend: { vectorIndex: new FakeVectorIndex([]), embedQuery: okEmbed }\n }).orThrow();\n expect(r.capabilities.supportsSemanticRecall).toBe(true);\n });\n\n test('degrades loudly on a semantic request when no backend is wired', async () => {\n const r = SemanticRetriever.create({ index: buildIndex([{ id: 'a' }]) }).orThrow();\n expect(await r.retrieve({ semantic: 'hi' })).toFailWith(\n /semantic recall requires a vector index; none configured/i\n );\n });\n\n test('returns empty (not failure) when no semantic term is supplied', async () => {\n const r = SemanticRetriever.create({ index: buildIndex([{ id: 'a' }]) }).orThrow();\n expect(await r.retrieve({})).toSucceedWith([]);\n });\n\n test('degrades loudly on an as-of request', async () => {\n const r = SemanticRetriever.create({ index: buildIndex([{ id: 'a' }]) }).orThrow();\n expect(await r.retrieve({ asOf: 5 })).toFailWith(/temporal query requires temporal index/i);\n });\n\n test('resolves vector hits back to records in hit order', async () => {\n const index = buildIndex([\n { id: 'a', updated: 1 },\n { id: 'b', updated: 99 },\n { id: 'c', updated: 50 }\n ]);\n const r = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([\n { id: 'b' as MemoryId, score: 0.9 },\n { id: 'a' as MemoryId, score: 0.5 }\n ]),\n embedQuery: okEmbed\n }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n // Hit order preserved (b before a), NOT recency order.\n expect(ids(records)).toEqual(['b', 'a']);\n }\n );\n });\n\n test('drops hits not present in the index and applies query filters', async () => {\n const index = buildIndex([\n { id: 'a', tags: ['x'] },\n { id: 'b', tags: ['y'] }\n ]);\n const r = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([\n { id: 'gone' as MemoryId, score: 0.99 },\n { id: 'b' as MemoryId, score: 0.8 },\n { id: 'a' as MemoryId, score: 0.7 }\n ]),\n embedQuery: okEmbed\n }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q', tag: 'x' as Tag })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['a']);\n }\n );\n });\n\n test('forwards topK to the vector index and applies the post-filter limit', async () => {\n const index = buildIndex([{ id: 'a' }, { id: 'b' }, { id: 'c' }]);\n const vectorIndex = new FakeVectorIndex([\n { id: 'a' as MemoryId, score: 0.9 },\n { id: 'b' as MemoryId, score: 0.8 },\n { id: 'c' as MemoryId, score: 0.7 }\n ]);\n const r = SemanticRetriever.create({ index, backend: { vectorIndex, embedQuery: okEmbed } }).orThrow();\n expect(await r.retrieve({ semantic: 'q', topK: 2, limit: 2 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['a', 'b']);\n }\n );\n // The retriever must forward the caller's topK to the vector backend, not its default.\n expect(vectorIndex.lastTopK).toBe(2);\n });\n\n test('defaults topK to 10 when the query omits it', async () => {\n const vectorIndex = new FakeVectorIndex([{ id: 'a' as MemoryId, score: 0.9 }]);\n const r = SemanticRetriever.create({\n index: buildIndex([{ id: 'a' }]),\n backend: { vectorIndex, embedQuery: okEmbed }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toSucceed();\n expect(vectorIndex.lastTopK).toBe(10);\n });\n\n test('fails loudly when the embedder fails', async () => {\n const r = SemanticRetriever.create({\n index: buildIndex([{ id: 'a' }]),\n backend: {\n vectorIndex: new FakeVectorIndex([]),\n embedQuery: () => Promise.resolve(fail('no embed model'))\n }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(/query embedding failed: no embed model/i);\n });\n\n test('fails loudly when the vector backend fails', async () => {\n const r = SemanticRetriever.create({\n index: buildIndex([{ id: 'a' }]),\n backend: { vectorIndex: new FakeVectorIndex([], true), embedQuery: okEmbed }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(/vector query failed: vector backend down/i);\n });\n\n test('normalizes a rejecting embedder into a Failure (never escapes as a rejection)', async () => {\n const r = SemanticRetriever.create({\n index: buildIndex([{ id: 'a' }]),\n backend: {\n vectorIndex: new FakeVectorIndex([]),\n embedQuery: () => Promise.reject(new Error('embedder blew up'))\n }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(/query embedding failed: .*embedder blew up/i);\n });\n\n test('normalizes a rejecting vector backend into a Failure', async () => {\n // A vector index whose `query` rejects (throws) rather than returning a fail.\n const rejectingIndex: IVectorIndex = {\n add: (id: MemoryId) => Promise.resolve(succeed(`ref-${id}`)),\n remove: (id: MemoryId) => Promise.resolve(succeed(id)),\n query: () => Promise.reject(new Error('socket hangup'))\n };\n const r = SemanticRetriever.create({\n index: buildIndex([{ id: 'a' }]),\n backend: { vectorIndex: rejectingIndex, embedQuery: okEmbed }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(/vector query failed: .*socket hangup/i);\n });\n});\n\ndescribe('ScoreUnionMergeStrategy', () => {\n test('unions, dedupes by id, and scores by retriever count', () => {\n const strategy = ScoreUnionMergeStrategy.create().orThrow();\n const [a, b, c] = [\n makeEntry({ id: 'a', updated: 10 }).record,\n makeEntry({ id: 'b', updated: 30 }).record,\n makeEntry({ id: 'c', updated: 20 }).record\n ];\n // 'b' appears in two sets (score 2); 'a' and 'c' in one each (score 1) — among\n // score-1 records, recency breaks the tie (c.updated 20 > a.updated 10).\n expect(\n strategy.merge([\n [a, b],\n [b, c]\n ])\n ).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'c', 'a']);\n });\n });\n\n test('counts an id at most once per result set', () => {\n const strategy = ScoreUnionMergeStrategy.create().orThrow();\n const a = makeEntry({ id: 'a', updated: 10 }).record;\n const b = makeEntry({ id: 'b', updated: 5 }).record;\n // 'a' twice in one set still scores 1; 'b' in two sets scores 2 → b ranks first.\n expect(strategy.merge([[a, a], [b], [b]])).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'a']);\n }\n );\n });\n});\n\ndescribe('HybridRetriever', () => {\n function build(): { index: MemoryIndex } {\n return {\n index: buildIndex([\n { id: 'a', tags: ['x'], updated: 10 },\n { id: 'b', tags: ['y'], updated: 30 },\n { id: 'c', tags: ['x'], updated: 20 }\n ])\n };\n }\n\n test('requires at least one retriever', () => {\n const strategy = ScoreUnionMergeStrategy.create().orThrow();\n expect(HybridRetriever.create([], strategy)).toFailWith(/at least one retriever is required/i);\n });\n\n test('capabilities are the union of composed retrievers', () => {\n const { index } = build();\n const recency = RecencyRetriever.create(index).orThrow();\n const semantic = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([]),\n embedQuery: () => Promise.resolve(succeed(Float32Array.from([1])))\n }\n }).orThrow();\n const hybrid = HybridRetriever.create(\n [recency, semantic],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n expect(hybrid.capabilities).toEqual({\n supportsSemanticRecall: true,\n supportsTemporalQuery: false,\n supportsLinkTraversal: false\n });\n });\n\n test('merges the results of composed retrievers', async () => {\n const { index } = build();\n const recency = RecencyRetriever.create(index).orThrow();\n const tag = TagRetriever.create(index).orThrow();\n const hybrid = HybridRetriever.create(\n [recency, tag],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n // recency returns a,b,c (with tag x filter: a,c); tag x returns a,c. Both\n // surface a & c (score 2), b absent. Use tag:x so recency also filters to x.\n expect(await hybrid.retrieve({ tag: 'x' as Tag })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect([...ids(records)].sort()).toEqual(['a', 'c']);\n }\n );\n });\n\n test('routes a semantic query only to the semantic-capable child', async () => {\n const { index } = build();\n const recency = RecencyRetriever.create(index).orThrow();\n const semantic = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([{ id: 'b' as MemoryId, score: 0.9 }]),\n embedQuery: () => Promise.resolve(succeed(Float32Array.from([1])))\n }\n }).orThrow();\n const hybrid = HybridRetriever.create(\n [recency, semantic],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n // recency (no semantic support) gets the semantic field stripped → returns all\n // three; semantic returns just b. b therefore scores 2 and ranks first.\n expect(await hybrid.retrieve({ semantic: 'q' })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(records[0].envelope.id).toBe('b');\n expect([...ids(records)].sort()).toEqual(['a', 'b', 'c']);\n }\n );\n });\n\n test('routes link-traversal axes only to the link-capable child', async () => {\n const linkChild = new RecordingRetriever({\n supportsSemanticRecall: false,\n supportsTemporalQuery: false,\n supportsLinkTraversal: true\n });\n const plainChild = new RecordingRetriever({\n supportsSemanticRecall: false,\n supportsTemporalQuery: false,\n supportsLinkTraversal: false\n });\n const hybrid = HybridRetriever.create(\n [linkChild, plainChild],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n expect(hybrid.capabilities.supportsLinkTraversal).toBe(true);\n // Union supports link traversal, so the hybrid does NOT loud-fail.\n expect(await hybrid.retrieve({ linkedTo: 'a' as MemoryId, hops: 2 })).toSucceed();\n // The link-capable child keeps the axes; the plain child has them stripped.\n expect(linkChild.lastQuery?.linkedTo).toBe('a');\n expect(linkChild.lastQuery?.hops).toBe(2);\n expect(plainChild.lastQuery?.linkedTo).toBeUndefined();\n expect(plainChild.lastQuery?.hops).toBeUndefined();\n });\n\n test('degrades loudly when its union does not support a requested capability', async () => {\n const { index } = build();\n const recency = RecencyRetriever.create(index).orThrow();\n const hybrid = HybridRetriever.create([recency], ScoreUnionMergeStrategy.create().orThrow()).orThrow();\n expect(await hybrid.retrieve({ semantic: 'q' })).toFailWith(/semantic recall requires/i);\n });\n\n test('propagates a child failure rather than dropping it silently', async () => {\n const { index } = build();\n const semantic = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([], true),\n embedQuery: () => Promise.resolve(succeed(Float32Array.from([1])))\n }\n }).orThrow();\n const hybrid = HybridRetriever.create([semantic], ScoreUnionMergeStrategy.create().orThrow()).orThrow();\n expect(await hybrid.retrieve({ semantic: 'q' })).toFailWith(/vector query failed/i);\n });\n\n test('does not pre-truncate child result sets: limit is applied only post-merge', async () => {\n // Recency full order is [d,c,b,a]; semantic surfaces [d,a]. With a correct\n // (post-merge-only) limit, the merge sees BOTH full sets, so d and a each\n // score 2 and the limit-2 result is [d,a]. If the limit leaked into the\n // children, recency would pre-truncate to [d,c] and the result would wrongly\n // be [d,c] — a never reaching the merge to score 2.\n const index = buildIndex([\n { id: 'a', updated: 10 },\n { id: 'b', updated: 20 },\n { id: 'c', updated: 30 },\n { id: 'd', updated: 40 }\n ]);\n const recency = RecencyRetriever.create(index).orThrow();\n const semantic = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([\n { id: 'd' as MemoryId, score: 0.9 },\n { id: 'a' as MemoryId, score: 0.8 }\n ]),\n embedQuery: () => Promise.resolve(succeed(Float32Array.from([1])))\n }\n }).orThrow();\n const hybrid = HybridRetriever.create(\n [recency, semantic],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n expect(await hybrid.retrieve({ semantic: 'q', limit: 2 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['d', 'a']);\n }\n );\n });\n\n test('applies the hybrid-level limit after merge', async () => {\n const { index } = build();\n const recency = RecencyRetriever.create(index).orThrow();\n const hybrid = HybridRetriever.create([recency], ScoreUnionMergeStrategy.create().orThrow()).orThrow();\n expect(await hybrid.retrieve({ limit: 1 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(records).toHaveLength(1);\n expect(records[0].envelope.id).toBe('b');\n }\n );\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"retrievers.test.js","sourceRoot":"","sources":["../../../../src/test/unit/retrieve/retrievers.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2026 Erik Fortune\n * SPDX-License-Identifier: MIT\n */\n\nimport '@fgv/ts-utils-jest';\nimport { Result, fail, succeed } from '@fgv/ts-utils';\nimport {\n HybridRetriever,\n IEdgeTarget,\n IIndexedMemoryRecord,\n IMemoryQuery,\n IMemoryRecord,\n IMemoryRetriever,\n IMemoryRetrieverCapabilities,\n IVectorIndex,\n IVectorQueryHit,\n Kind,\n MemoryId,\n MemoryIndex,\n MemoryScopeKey,\n RecencyRetriever,\n ScoreUnionMergeStrategy,\n SemanticRetriever,\n StructuredFilterRetriever,\n Tag,\n TagRetriever,\n envelopeConverter,\n guardRetrieverCapabilities,\n limitRecords,\n orderingCompare,\n rankCompare,\n recencyCompare\n} from '../../../index';\n\n/** A scope-qualified link-traversal seed for the retriever tests. */\nfunction et(id: string, scope: string = 'knowledge'): IEdgeTarget {\n return { scope: scope as MemoryScopeKey, id: id as MemoryId };\n}\n\ninterface IRecordSpec {\n readonly id: string;\n readonly scope?: string;\n readonly kind?: string;\n readonly tags?: ReadonlyArray<string>;\n readonly updated?: number;\n readonly seq?: number;\n readonly rank?: number;\n}\n\nfunction makeEntry(spec: IRecordSpec): IIndexedMemoryRecord {\n const record: IMemoryRecord<unknown> = {\n envelope: envelopeConverter\n .convert({\n id: spec.id,\n entityId: spec.id,\n kind: spec.kind ?? 'knowledge',\n tags: spec.tags ?? [],\n links: [],\n created: 0,\n updated: spec.updated ?? 0,\n seq: spec.seq ?? 0,\n contentHash: 'h',\n ...(spec.rank !== undefined ? { rank: spec.rank } : {}),\n provenance: { source: 'agent' }\n })\n .orThrow(),\n body: `body-${spec.id}`\n };\n return { scope: (spec.scope ?? 'knowledge') as MemoryScopeKey, record };\n}\n\nfunction buildIndex(specs: ReadonlyArray<IRecordSpec>): MemoryIndex {\n const index = MemoryIndex.create().orThrow();\n index.rebuild(specs.map(makeEntry)).orThrow();\n return index;\n}\n\nfunction ids(records: ReadonlyArray<IMemoryRecord<unknown>>): ReadonlyArray<string> {\n return records.map((r) => r.envelope.id as string);\n}\n\nconst knowledge: Kind = 'knowledge' as Kind;\n\ndescribe('retrieve helpers', () => {\n describe('guardRetrieverCapabilities', () => {\n const noCaps = {\n supportsSemanticRecall: false,\n supportsTemporalQuery: false,\n supportsLinkTraversal: false\n };\n\n test('passes when no unsupported capability is requested', () => {\n expect(guardRetrieverCapabilities({}, noCaps)).toSucceed();\n });\n\n test('fails loudly when semantic recall is requested but unsupported', () => {\n expect(guardRetrieverCapabilities({ semantic: 'q' }, noCaps)).toFailWith(\n /semantic recall requires a vector index; none configured/i\n );\n });\n\n test('fails loudly when an as-of query is requested but unsupported', () => {\n expect(guardRetrieverCapabilities({ asOf: 5 }, noCaps)).toFailWith(\n /temporal query requires temporal index; none configured/i\n );\n });\n\n test('names the kind in the temporal failure when present', () => {\n expect(guardRetrieverCapabilities({ asOf: 5, kind: knowledge }, noCaps)).toFailWith(\n /none configured for kind knowledge/i\n );\n });\n\n test('fails loudly when a link-traversal axis is requested but unsupported', () => {\n expect(guardRetrieverCapabilities({ linkedTo: et('x') }, noCaps)).toFailWith(\n /link traversal requires a backlink index; none configured/i\n );\n expect(guardRetrieverCapabilities({ linkedFrom: et('x') }, noCaps)).toFailWith(\n /link traversal requires/i\n );\n expect(guardRetrieverCapabilities({ hops: 2 }, noCaps)).toFailWith(/link traversal requires/i);\n });\n\n test('passes a link-traversal axis when the capability is supported', () => {\n expect(\n guardRetrieverCapabilities({ linkedTo: et('x') }, { ...noCaps, supportsLinkTraversal: true })\n ).toSucceed();\n });\n });\n\n describe('limitRecords', () => {\n const records = buildIndex([{ id: 'a' }, { id: 'b' }, { id: 'c' }])\n .entries()\n .map((e) => e.record);\n\n test('returns all records when no limit is supplied', () => {\n expect(limitRecords(records)).toHaveLength(3);\n });\n\n test('truncates to the top-N for a positive limit', () => {\n expect(limitRecords(records, 2)).toHaveLength(2);\n });\n\n test('returns an empty array for a zero or negative limit', () => {\n expect(limitRecords(records, 0)).toEqual([]);\n expect(limitRecords(records, -1)).toEqual([]);\n });\n\n test('an absent offset is a no-op (byte-identical to today) — same reference returned', () => {\n expect(limitRecords(records, undefined, undefined)).toBe(records);\n expect(limitRecords(records, 2, undefined)).toHaveLength(2);\n // A non-positive offset is guarded like a non-positive limit — no skip.\n expect(limitRecords(records, undefined, 0)).toBe(records);\n expect(ids(limitRecords(records, undefined, -5))).toEqual(['a', 'b', 'c']);\n });\n\n test('offset skips after ordering; { offset, limit } is a stable page window', () => {\n expect(ids(limitRecords(records, undefined, 1))).toEqual(['b', 'c']);\n expect(ids(limitRecords(records, 1, 1))).toEqual(['b']);\n expect(ids(limitRecords(records, 2, 1))).toEqual(['b', 'c']);\n });\n\n test('an offset past the end yields an empty page (never a throw)', () => {\n expect(limitRecords(records, undefined, 3)).toEqual([]);\n expect(limitRecords(records, 5, 99)).toEqual([]);\n });\n\n test('a non-positive limit still wins over an offset window', () => {\n expect(limitRecords(records, 0, 1)).toEqual([]);\n });\n });\n});\n\ndescribe('RecencyRetriever', () => {\n test('reports all-false capabilities', () => {\n const r = RecencyRetriever.create(buildIndex([])).orThrow();\n expect(r.capabilities).toEqual({\n supportsSemanticRecall: false,\n supportsTemporalQuery: false,\n supportsLinkTraversal: false\n });\n });\n\n test('returns every record most-recently-updated first', async () => {\n const r = RecencyRetriever.create(\n buildIndex([\n { id: 'a', updated: 10 },\n { id: 'b', updated: 30 },\n { id: 'c', updated: 20 }\n ])\n ).orThrow();\n expect(await r.retrieve({})).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'c', 'a']);\n });\n });\n\n test('breaks ties on seq descending', async () => {\n const r = RecencyRetriever.create(\n buildIndex([\n { id: 'a', updated: 10, seq: 1 },\n { id: 'b', updated: 10, seq: 3 },\n { id: 'c', updated: 10, seq: 2 }\n ])\n ).orThrow();\n expect(await r.retrieve({})).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'c', 'a']);\n });\n });\n\n test('honors scope, kind, tag, predicate, and limit filters', async () => {\n const index = buildIndex([\n { id: 'a', scope: 'knowledge', kind: 'knowledge', tags: ['x'], updated: 50 },\n { id: 'b', scope: 'knowledge', kind: 'knowledge', tags: ['y'], updated: 40 },\n { id: 'c', scope: 'other', kind: 'knowledge', tags: ['x'], updated: 60 },\n { id: 'd', scope: 'knowledge', kind: 'note', tags: ['x'], updated: 70 }\n ]);\n const r = RecencyRetriever.create(index).orThrow();\n expect(\n await r.retrieve({\n scope: 'knowledge' as MemoryScopeKey,\n kind: knowledge,\n tag: 'x' as Tag,\n filter: (rec) => rec.envelope.id !== ('skip' as MemoryId),\n limit: 5\n })\n ).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['a']);\n });\n });\n\n test('limit truncates to the top-N after ordering', async () => {\n const r = RecencyRetriever.create(\n buildIndex([\n { id: 'a', updated: 10 },\n { id: 'b', updated: 30 },\n { id: 'c', updated: 20 }\n ])\n ).orThrow();\n expect(await r.retrieve({ limit: 2 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'c']);\n }\n );\n });\n\n test('degrades loudly on a semantic request', async () => {\n const r = RecencyRetriever.create(buildIndex([{ id: 'a' }])).orThrow();\n expect(await r.retrieve({ semantic: 'hello' })).toFailWith(/semantic recall requires a vector index/i);\n });\n\n test('degrades loudly on a link-traversal request', async () => {\n const r = RecencyRetriever.create(buildIndex([{ id: 'a' }])).orThrow();\n expect(await r.retrieve({ linkedTo: et('a') })).toFailWith(/link traversal requires/i);\n });\n});\n\ndescribe('orderBy: rank axis', () => {\n const a1 = makeEntry({ id: 'a', rank: 1, updated: 100, seq: 1 }).record;\n const b3 = makeEntry({ id: 'b', rank: 3, updated: 100, seq: 2 }).record;\n const c2 = makeEntry({ id: 'c', rank: 2, updated: 100, seq: 3 }).record;\n const unranked = makeEntry({ id: 'z', updated: 999, seq: 4 }).record;\n\n describe('rankCompare', () => {\n test('orders by rank descending', () => {\n expect(\n [a1, b3, c2]\n .slice()\n .sort(rankCompare)\n .map((r) => r.envelope.id)\n ).toEqual(['b', 'c', 'a']);\n });\n\n test('places an absent-rank record last regardless of recency', () => {\n // `unranked` has the newest `updated`, but an absent rank sorts after every ranked record.\n expect(\n [unranked, a1, b3]\n .slice()\n .sort(rankCompare)\n .map((r) => r.envelope.id)\n ).toEqual(['b', 'a', 'z']);\n // Symmetric: absent on the left side of the compare too.\n expect(\n [a1, unranked]\n .slice()\n .sort(rankCompare)\n .map((r) => r.envelope.id)\n ).toEqual(['a', 'z']);\n });\n\n test('breaks an equal-rank tie by recency', () => {\n const b3b = makeEntry({ id: 'b2', rank: 3, updated: 50, seq: 9 }).record;\n // Equal rank 3 → newer `updated` (b3 at 100) first.\n expect(\n [b3b, b3]\n .slice()\n .sort(rankCompare)\n .map((r) => r.envelope.id)\n ).toEqual(['b', 'b2']);\n });\n });\n\n describe('orderingCompare', () => {\n test(\"returns recencyCompare for absent orderBy and 'recency'\", () => {\n expect(orderingCompare()).toBe(recencyCompare);\n expect(orderingCompare('recency')).toBe(recencyCompare);\n });\n\n test(\"returns rankCompare for 'rank'\", () => {\n expect(orderingCompare('rank')).toBe(rankCompare);\n });\n });\n\n describe.each([\n ['RecencyRetriever', (index: MemoryIndex): IMemoryRetriever => RecencyRetriever.create(index).orThrow()],\n ['TagRetriever', (index: MemoryIndex): IMemoryRetriever => TagRetriever.create(index).orThrow()],\n [\n 'StructuredFilterRetriever',\n (index: MemoryIndex): IMemoryRetriever => StructuredFilterRetriever.create(index).orThrow()\n ]\n ])('%s honors orderBy', (name, make) => {\n // Tag / structured-filter need their axis present to return anything.\n const axis: IMemoryQuery =\n name === 'TagRetriever'\n ? { tag: 'x' as Tag }\n : name === 'StructuredFilterRetriever'\n ? { filter: () => true }\n : {};\n\n function orderedIndex(): MemoryIndex {\n return buildIndex([\n { id: 'a', rank: 1, tags: ['x'], updated: 100, seq: 1 },\n { id: 'b', rank: 3, tags: ['x'], updated: 100, seq: 2 },\n { id: 'c', rank: 2, tags: ['x'], updated: 100, seq: 3 },\n { id: 'z', tags: ['x'], updated: 999, seq: 4 }\n ]);\n }\n\n test(\"orderBy 'rank' orders by rank descending, absent last\", async () => {\n const r = make(orderedIndex());\n expect(await r.retrieve({ ...axis, orderBy: 'rank' })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'c', 'a', 'z']);\n }\n );\n });\n\n test('orderBy absent is unchanged recency order', async () => {\n const r = make(orderedIndex());\n expect(await r.retrieve({ ...axis })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n // `z` has the newest `updated`; the rest tie on `updated` and break by\n // seq descending (c=3, b=2, a=1) — recency order regardless of rank.\n expect(ids(records)).toEqual(['z', 'c', 'b', 'a']);\n }\n );\n });\n\n test('rank ordering composes with { limit, offset } for a bounded top-M page', async () => {\n const r = make(orderedIndex());\n expect(await r.retrieve({ ...axis, orderBy: 'rank', limit: 1, offset: 1 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['c']);\n }\n );\n });\n });\n\n test(\"HybridRetriever re-orders the merged set by rank for orderBy 'rank'\", async () => {\n const index = buildIndex([\n { id: 'a', rank: 1, tags: ['x'], updated: 100, seq: 1 },\n { id: 'b', rank: 3, tags: ['x'], updated: 100, seq: 2 },\n { id: 'c', rank: 2, tags: ['x'], updated: 100, seq: 3 }\n ]);\n const hybrid = HybridRetriever.create(\n [RecencyRetriever.create(index).orThrow(), TagRetriever.create(index).orThrow()],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n expect(await hybrid.retrieve({ tag: 'x' as Tag, orderBy: 'rank' })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n // All three score 2 (surfaced by both children); orderBy rank re-sorts the merge.\n expect(ids(records)).toEqual(['b', 'c', 'a']);\n }\n );\n });\n\n test(\"SemanticRetriever preserves vector-similarity order regardless of orderBy 'rank'\", async () => {\n const index = buildIndex([\n { id: 'a', rank: 9, updated: 1 },\n { id: 'b', rank: 1, updated: 1 }\n ]);\n const vectorIndex: IVectorIndex = {\n add: (t: IEdgeTarget) => Promise.resolve(succeed(`ref-${t.id}`)),\n remove: (t: IEdgeTarget) => Promise.resolve(succeed(t)),\n query: () =>\n Promise.resolve(\n succeed([\n { target: et('b'), score: 0.9 },\n { target: et('a'), score: 0.5 }\n ])\n )\n };\n const r = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex,\n embedQuery: () => Promise.resolve(succeed(Float32Array.from([0.1])))\n }\n }).orThrow();\n // Even though `a` has the higher rank, semantic keeps the similarity order (b before a).\n expect(await r.retrieve({ semantic: 'q', orderBy: 'rank' })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'a']);\n }\n );\n });\n});\n\ndescribe('query axes: kinds (kind-set) and offset', () => {\n function multiKindRetriever(): RecencyRetriever {\n return RecencyRetriever.create(\n buildIndex([\n { id: 'k1', kind: 'knowledge', updated: 40 },\n { id: 'n1', kind: 'note', updated: 30 },\n { id: 'e1', kind: 'event', updated: 20 },\n { id: 'k2', kind: 'knowledge', updated: 10 }\n ])\n ).orThrow();\n }\n\n describe('kinds', () => {\n test(\"an absent kinds axis imposes no kind constraint (today's behavior)\", async () => {\n expect(await multiKindRetriever().retrieve({})).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect([...ids(records)].sort()).toEqual(['e1', 'k1', 'k2', 'n1']);\n }\n );\n });\n\n test('restricts to records in ANY of the listed kinds', async () => {\n expect(\n await multiKindRetriever().retrieve({\n kinds: ['knowledge', 'event'] as unknown as ReadonlyArray<Kind>\n })\n ).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect([...ids(records)].sort()).toEqual(['e1', 'k1', 'k2']);\n });\n });\n\n test('an explicit empty kinds array matches NOTHING (not match-all)', async () => {\n expect(await multiKindRetriever().retrieve({ kinds: [] })).toSucceedWith([]);\n });\n\n test('kind and kinds compose as AND (kind must be a member of kinds)', async () => {\n // kind=knowledge AND kinds includes knowledge → knowledge records only.\n expect(\n await multiKindRetriever().retrieve({\n kind: knowledge,\n kinds: ['knowledge', 'note'] as unknown as ReadonlyArray<Kind>\n })\n ).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect([...ids(records)].sort()).toEqual(['k1', 'k2']);\n });\n // kind=knowledge but kinds excludes knowledge → nothing can satisfy both.\n expect(\n await multiKindRetriever().retrieve({\n kind: knowledge,\n kinds: ['note', 'event'] as unknown as ReadonlyArray<Kind>\n })\n ).toSucceedWith([]);\n });\n });\n\n describe('offset', () => {\n function ordered(): RecencyRetriever {\n return RecencyRetriever.create(\n buildIndex([\n { id: 'a', updated: 10 },\n { id: 'b', updated: 40 },\n { id: 'c', updated: 30 },\n { id: 'd', updated: 20 }\n ])\n ).orThrow();\n }\n\n test('skips after ordering, forming a stable { offset, limit } page window', async () => {\n // Recency order is [b, c, d, a].\n expect(await ordered().retrieve({ offset: 1, limit: 2 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['c', 'd']);\n }\n );\n });\n\n test('an absent offset is unchanged from today', async () => {\n expect(await ordered().retrieve({ limit: 2 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'c']);\n }\n );\n });\n\n test('an offset past the end yields an empty page', async () => {\n expect(await ordered().retrieve({ offset: 99 })).toSucceedWith([]);\n });\n\n test('a negative offset does not slip into slice (treated as no skip)', async () => {\n expect(await ordered().retrieve({ offset: -3, limit: 2 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'c']);\n }\n );\n });\n });\n});\n\n/** A retriever with configurable capabilities that records the query it received. */\nclass RecordingRetriever implements IMemoryRetriever {\n public lastQuery: IMemoryQuery | undefined;\n public readonly capabilities: IMemoryRetrieverCapabilities;\n public constructor(capabilities: IMemoryRetrieverCapabilities) {\n this.capabilities = capabilities;\n }\n public retrieve(query: IMemoryQuery): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>> {\n this.lastQuery = query;\n return Promise.resolve(succeed([]));\n }\n}\n\ndescribe('TagRetriever', () => {\n test('returns records carrying the tag, recency-ordered', async () => {\n const r = TagRetriever.create(\n buildIndex([\n { id: 'a', tags: ['x'], updated: 10 },\n { id: 'b', tags: ['x', 'y'], updated: 30 },\n { id: 'c', tags: ['y'], updated: 20 }\n ])\n ).orThrow();\n expect(await r.retrieve({ tag: 'x' as Tag })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'a']);\n }\n );\n });\n\n test('returns empty (not failure) when no tag is supplied', async () => {\n const r = TagRetriever.create(buildIndex([{ id: 'a', tags: ['x'] }])).orThrow();\n expect(await r.retrieve({})).toSucceedWith([]);\n });\n\n test('degrades loudly on a semantic request', async () => {\n const r = TagRetriever.create(buildIndex([{ id: 'a', tags: ['x'] }])).orThrow();\n expect(await r.retrieve({ tag: 'x' as Tag, semantic: 'q' })).toFailWith(/semantic recall requires/i);\n });\n});\n\ndescribe('StructuredFilterRetriever', () => {\n test('applies the predicate over the scope/kind/tag pre-filter', async () => {\n const r = StructuredFilterRetriever.create(\n buildIndex([\n { id: 'keep-1', updated: 10 },\n { id: 'drop-1', updated: 30 },\n { id: 'keep-2', updated: 20 }\n ])\n ).orThrow();\n expect(\n await r.retrieve({ filter: (rec) => (rec.envelope.id as string).startsWith('keep') })\n ).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['keep-2', 'keep-1']);\n });\n });\n\n test('returns empty (not failure) when no predicate is supplied', async () => {\n const r = StructuredFilterRetriever.create(buildIndex([{ id: 'a' }])).orThrow();\n expect(await r.retrieve({})).toSucceedWith([]);\n });\n});\n\n/** A scripted in-memory vector index returning canned hits. */\nclass FakeVectorIndex implements IVectorIndex {\n private readonly _hits: ReadonlyArray<IVectorQueryHit>;\n private readonly _failQuery: boolean;\n /** The `topK` the most recent `query` call received — asserts forwarding. */\n public lastTopK: number | undefined;\n public constructor(hits: ReadonlyArray<IVectorQueryHit>, failQuery: boolean = false) {\n this._hits = hits;\n this._failQuery = failQuery;\n }\n public add(t: IEdgeTarget): Promise<Result<string>> {\n return Promise.resolve(succeed(`ref-${t.id}`));\n }\n public remove(t: IEdgeTarget): Promise<Result<IEdgeTarget>> {\n return Promise.resolve(succeed(t));\n }\n public query(__vector: Float32Array, topK: number): Promise<Result<ReadonlyArray<IVectorQueryHit>>> {\n this.lastTopK = topK;\n return Promise.resolve(this._failQuery ? fail('vector backend down') : succeed(this._hits));\n }\n}\n\ndescribe('SemanticRetriever', () => {\n const okEmbed = (): Promise<Result<Float32Array>> =>\n Promise.resolve(succeed(Float32Array.from([0.1, 0.2])));\n\n test('reports supportsSemanticRecall=false when no backend is wired', () => {\n const r = SemanticRetriever.create({ index: buildIndex([]) }).orThrow();\n expect(r.capabilities.supportsSemanticRecall).toBe(false);\n });\n\n test('reports supportsSemanticRecall=true when a backend is wired', () => {\n const r = SemanticRetriever.create({\n index: buildIndex([]),\n backend: { vectorIndex: new FakeVectorIndex([]), embedQuery: okEmbed }\n }).orThrow();\n expect(r.capabilities.supportsSemanticRecall).toBe(true);\n });\n\n test('degrades loudly on a semantic request when no backend is wired', async () => {\n const r = SemanticRetriever.create({ index: buildIndex([{ id: 'a' }]) }).orThrow();\n expect(await r.retrieve({ semantic: 'hi' })).toFailWith(\n /semantic recall requires a vector index; none configured/i\n );\n });\n\n test('returns empty (not failure) when no semantic term is supplied', async () => {\n const r = SemanticRetriever.create({ index: buildIndex([{ id: 'a' }]) }).orThrow();\n expect(await r.retrieve({})).toSucceedWith([]);\n });\n\n test('degrades loudly on an as-of request', async () => {\n const r = SemanticRetriever.create({ index: buildIndex([{ id: 'a' }]) }).orThrow();\n expect(await r.retrieve({ asOf: 5 })).toFailWith(/temporal query requires temporal index/i);\n });\n\n test('resolves vector hits back to records in hit order', async () => {\n const index = buildIndex([\n { id: 'a', updated: 1 },\n { id: 'b', updated: 99 },\n { id: 'c', updated: 50 }\n ]);\n const r = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([\n { target: et('b'), score: 0.9 },\n { target: et('a'), score: 0.5 }\n ]),\n embedQuery: okEmbed\n }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n // Hit order preserved (b before a), NOT recency order.\n expect(ids(records)).toEqual(['b', 'a']);\n }\n );\n });\n\n test('drops hits not present in the index and applies query filters', async () => {\n const index = buildIndex([\n { id: 'a', tags: ['x'] },\n { id: 'b', tags: ['y'] }\n ]);\n const r = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([\n { target: et('gone'), score: 0.99 },\n { target: et('b'), score: 0.8 },\n { target: et('a'), score: 0.7 }\n ]),\n embedQuery: okEmbed\n }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q', tag: 'x' as Tag })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['a']);\n }\n );\n });\n\n test('resolves a hit to the correctly-scoped record when two records share an id stem across scopes', async () => {\n // Two records with the identical stem `turn-3` under different scopes — the\n // exact same-stem-across-scopes collision the scope-qualified hit fixes. The\n // retriever must re-resolve each hit through its full `(scope, id)` key, not a\n // bare id (which would ambiguously match either record).\n const index = buildIndex([\n { id: 'turn-3', scope: 'conv-a', tags: ['from-a'] },\n { id: 'turn-3', scope: 'conv-b', tags: ['from-b'] }\n ]);\n const r = SemanticRetriever.create({\n index,\n backend: {\n // The vector backend scored the conv-b record; the retriever must return\n // exactly that record, never the same-stem conv-a record.\n vectorIndex: new FakeVectorIndex([{ target: et('turn-3', 'conv-b'), score: 0.9 }]),\n embedQuery: okEmbed\n }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(records).toHaveLength(1);\n expect(records[0].envelope.id).toBe('turn-3');\n // The tag proves it is the conv-b record, not the same-stem conv-a one.\n expect(records[0].envelope.tags).toEqual(['from-b']);\n }\n );\n });\n\n test('forwards topK to the vector index and applies the post-filter limit', async () => {\n const index = buildIndex([{ id: 'a' }, { id: 'b' }, { id: 'c' }]);\n const vectorIndex = new FakeVectorIndex([\n { target: et('a'), score: 0.9 },\n { target: et('b'), score: 0.8 },\n { target: et('c'), score: 0.7 }\n ]);\n const r = SemanticRetriever.create({ index, backend: { vectorIndex, embedQuery: okEmbed } }).orThrow();\n expect(await r.retrieve({ semantic: 'q', topK: 2, limit: 2 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['a', 'b']);\n }\n );\n // The retriever must forward the caller's topK to the vector backend, not its default.\n expect(vectorIndex.lastTopK).toBe(2);\n });\n\n test('defaults topK to 10 when the query omits it', async () => {\n const vectorIndex = new FakeVectorIndex([{ target: et('a'), score: 0.9 }]);\n const r = SemanticRetriever.create({\n index: buildIndex([{ id: 'a' }]),\n backend: { vectorIndex, embedQuery: okEmbed }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toSucceed();\n expect(vectorIndex.lastTopK).toBe(10);\n });\n\n test('fails loudly when the embedder fails', async () => {\n const r = SemanticRetriever.create({\n index: buildIndex([{ id: 'a' }]),\n backend: {\n vectorIndex: new FakeVectorIndex([]),\n embedQuery: () => Promise.resolve(fail('no embed model'))\n }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(/query embedding failed: no embed model/i);\n });\n\n test('fails loudly when the vector backend fails', async () => {\n const r = SemanticRetriever.create({\n index: buildIndex([{ id: 'a' }]),\n backend: { vectorIndex: new FakeVectorIndex([], true), embedQuery: okEmbed }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(/vector query failed: vector backend down/i);\n });\n\n test('normalizes a rejecting embedder into a Failure (never escapes as a rejection)', async () => {\n const r = SemanticRetriever.create({\n index: buildIndex([{ id: 'a' }]),\n backend: {\n vectorIndex: new FakeVectorIndex([]),\n embedQuery: () => Promise.reject(new Error('embedder blew up'))\n }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(/query embedding failed: .*embedder blew up/i);\n });\n\n test('normalizes a rejecting vector backend into a Failure', async () => {\n // A vector index whose `query` rejects (throws) rather than returning a fail.\n const rejectingIndex: IVectorIndex = {\n add: (t: IEdgeTarget) => Promise.resolve(succeed(`ref-${t.id}`)),\n remove: (t: IEdgeTarget) => Promise.resolve(succeed(t)),\n query: () => Promise.reject(new Error('socket hangup'))\n };\n const r = SemanticRetriever.create({\n index: buildIndex([{ id: 'a' }]),\n backend: { vectorIndex: rejectingIndex, embedQuery: okEmbed }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(/vector query failed: .*socket hangup/i);\n });\n});\n\ndescribe('ScoreUnionMergeStrategy', () => {\n test('unions, dedupes by id, and scores by retriever count', () => {\n const strategy = ScoreUnionMergeStrategy.create().orThrow();\n const [a, b, c] = [\n makeEntry({ id: 'a', updated: 10 }).record,\n makeEntry({ id: 'b', updated: 30 }).record,\n makeEntry({ id: 'c', updated: 20 }).record\n ];\n // 'b' appears in two sets (score 2); 'a' and 'c' in one each (score 1) — among\n // score-1 records, recency breaks the tie (c.updated 20 > a.updated 10).\n expect(\n strategy.merge([\n [a, b],\n [b, c]\n ])\n ).toSucceedAndSatisfy((records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'c', 'a']);\n });\n });\n\n test('counts an id at most once per result set', () => {\n const strategy = ScoreUnionMergeStrategy.create().orThrow();\n const a = makeEntry({ id: 'a', updated: 10 }).record;\n const b = makeEntry({ id: 'b', updated: 5 }).record;\n // 'a' twice in one set still scores 1; 'b' in two sets scores 2 → b ranks first.\n expect(strategy.merge([[a, a], [b], [b]])).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['b', 'a']);\n }\n );\n });\n});\n\ndescribe('HybridRetriever', () => {\n function build(): { index: MemoryIndex } {\n return {\n index: buildIndex([\n { id: 'a', tags: ['x'], updated: 10 },\n { id: 'b', tags: ['y'], updated: 30 },\n { id: 'c', tags: ['x'], updated: 20 }\n ])\n };\n }\n\n test('requires at least one retriever', () => {\n const strategy = ScoreUnionMergeStrategy.create().orThrow();\n expect(HybridRetriever.create([], strategy)).toFailWith(/at least one retriever is required/i);\n });\n\n test('capabilities are the union of composed retrievers', () => {\n const { index } = build();\n const recency = RecencyRetriever.create(index).orThrow();\n const semantic = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([]),\n embedQuery: () => Promise.resolve(succeed(Float32Array.from([1])))\n }\n }).orThrow();\n const hybrid = HybridRetriever.create(\n [recency, semantic],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n expect(hybrid.capabilities).toEqual({\n supportsSemanticRecall: true,\n supportsTemporalQuery: false,\n supportsLinkTraversal: false\n });\n });\n\n test('merges the results of composed retrievers', async () => {\n const { index } = build();\n const recency = RecencyRetriever.create(index).orThrow();\n const tag = TagRetriever.create(index).orThrow();\n const hybrid = HybridRetriever.create(\n [recency, tag],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n // recency returns a,b,c (with tag x filter: a,c); tag x returns a,c. Both\n // surface a & c (score 2), b absent. Use tag:x so recency also filters to x.\n expect(await hybrid.retrieve({ tag: 'x' as Tag })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect([...ids(records)].sort()).toEqual(['a', 'c']);\n }\n );\n });\n\n test('routes a semantic query only to the semantic-capable child', async () => {\n const { index } = build();\n const recency = RecencyRetriever.create(index).orThrow();\n const semantic = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([{ target: et('b'), score: 0.9 }]),\n embedQuery: () => Promise.resolve(succeed(Float32Array.from([1])))\n }\n }).orThrow();\n const hybrid = HybridRetriever.create(\n [recency, semantic],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n // recency (no semantic support) gets the semantic field stripped → returns all\n // three; semantic returns just b. b therefore scores 2 and ranks first.\n expect(await hybrid.retrieve({ semantic: 'q' })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(records[0].envelope.id).toBe('b');\n expect([...ids(records)].sort()).toEqual(['a', 'b', 'c']);\n }\n );\n });\n\n test('routes link-traversal axes only to the link-capable child', async () => {\n const linkChild = new RecordingRetriever({\n supportsSemanticRecall: false,\n supportsTemporalQuery: false,\n supportsLinkTraversal: true\n });\n const plainChild = new RecordingRetriever({\n supportsSemanticRecall: false,\n supportsTemporalQuery: false,\n supportsLinkTraversal: false\n });\n const hybrid = HybridRetriever.create(\n [linkChild, plainChild],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n expect(hybrid.capabilities.supportsLinkTraversal).toBe(true);\n // Union supports link traversal, so the hybrid does NOT loud-fail.\n expect(await hybrid.retrieve({ linkedTo: et('a'), hops: 2 })).toSucceed();\n // The link-capable child keeps the axes; the plain child has them stripped.\n expect(linkChild.lastQuery?.linkedTo).toEqual(et('a'));\n expect(linkChild.lastQuery?.hops).toBe(2);\n expect(plainChild.lastQuery?.linkedTo).toBeUndefined();\n expect(plainChild.lastQuery?.hops).toBeUndefined();\n });\n\n test('degrades loudly when its union does not support a requested capability', async () => {\n const { index } = build();\n const recency = RecencyRetriever.create(index).orThrow();\n const hybrid = HybridRetriever.create([recency], ScoreUnionMergeStrategy.create().orThrow()).orThrow();\n expect(await hybrid.retrieve({ semantic: 'q' })).toFailWith(/semantic recall requires/i);\n });\n\n test('propagates a child failure rather than dropping it silently', async () => {\n const { index } = build();\n const semantic = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([], true),\n embedQuery: () => Promise.resolve(succeed(Float32Array.from([1])))\n }\n }).orThrow();\n const hybrid = HybridRetriever.create([semantic], ScoreUnionMergeStrategy.create().orThrow()).orThrow();\n expect(await hybrid.retrieve({ semantic: 'q' })).toFailWith(/vector query failed/i);\n });\n\n test('does not pre-truncate child result sets: limit is applied only post-merge', async () => {\n // Recency full order is [d,c,b,a]; semantic surfaces [d,a]. With a correct\n // (post-merge-only) limit, the merge sees BOTH full sets, so d and a each\n // score 2 and the limit-2 result is [d,a]. If the limit leaked into the\n // children, recency would pre-truncate to [d,c] and the result would wrongly\n // be [d,c] — a never reaching the merge to score 2.\n const index = buildIndex([\n { id: 'a', updated: 10 },\n { id: 'b', updated: 20 },\n { id: 'c', updated: 30 },\n { id: 'd', updated: 40 }\n ]);\n const recency = RecencyRetriever.create(index).orThrow();\n const semantic = SemanticRetriever.create({\n index,\n backend: {\n vectorIndex: new FakeVectorIndex([\n { target: et('d'), score: 0.9 },\n { target: et('a'), score: 0.8 }\n ]),\n embedQuery: () => Promise.resolve(succeed(Float32Array.from([1])))\n }\n }).orThrow();\n const hybrid = HybridRetriever.create(\n [recency, semantic],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n expect(await hybrid.retrieve({ semantic: 'q', limit: 2 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['d', 'a']);\n }\n );\n });\n\n test('applies the hybrid-level limit after merge', async () => {\n const { index } = build();\n const recency = RecencyRetriever.create(index).orThrow();\n const hybrid = HybridRetriever.create([recency], ScoreUnionMergeStrategy.create().orThrow()).orThrow();\n expect(await hybrid.retrieve({ limit: 1 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(records).toHaveLength(1);\n expect(records[0].envelope.id).toBe('b');\n }\n );\n });\n\n test('applies the { offset, limit } window after merge', async () => {\n const { index } = build();\n const recency = RecencyRetriever.create(index).orThrow();\n const hybrid = HybridRetriever.create([recency], ScoreUnionMergeStrategy.create().orThrow()).orThrow();\n // Merged recency order is [b(30), c(20), a(10)]; offset 1 + limit 1 → [c].\n expect(await hybrid.retrieve({ offset: 1, limit: 1 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n expect(ids(records)).toEqual(['c']);\n }\n );\n });\n\n test('strips offset from child queries (offset is a post-merge concern)', async () => {\n const child = new RecordingRetriever({\n supportsSemanticRecall: false,\n supportsTemporalQuery: false,\n supportsLinkTraversal: false\n });\n const hybrid = HybridRetriever.create([child], ScoreUnionMergeStrategy.create().orThrow()).orThrow();\n expect(await hybrid.retrieve({ offset: 2, limit: 3 })).toSucceed();\n expect(child.lastQuery?.offset).toBeUndefined();\n expect(child.lastQuery?.limit).toBeUndefined();\n });\n\n test('passes the kinds axis through to children (a shared pre-filter axis)', async () => {\n const child = new RecordingRetriever({\n supportsSemanticRecall: false,\n supportsTemporalQuery: false,\n supportsLinkTraversal: false\n });\n const hybrid = HybridRetriever.create([child], ScoreUnionMergeStrategy.create().orThrow()).orThrow();\n expect(await hybrid.retrieve({ kinds: ['knowledge'] as unknown as ReadonlyArray<Kind> })).toSucceed();\n expect(child.lastQuery?.kinds).toEqual(['knowledge']);\n });\n});\n"]}
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
import '@fgv/ts-utils-jest';
|
|
6
6
|
import { Converters, Logging, fail, succeed } from '@fgv/ts-utils';
|
|
7
7
|
import { FileTree } from '@fgv/ts-json-base';
|
|
8
|
-
import { BodyConverterRegistry, FileTreeMemoryStore, InMemoryCosineIndex, KnowledgeIdentityCodec, MemoryCapCullPolicy, MemoryIndex, MtmIdentityCodec, SemanticRetriever, envelopeConverter } from '../../../index';
|
|
8
|
+
import { BodyConverterRegistry, FileTreeMemoryStore, InMemoryCosineIndex, KnowledgeIdentityCodec, MemoryCapCullPolicy, MemoryIndex, MtmIdentityCodec, SemanticRetriever, TemporalIdentityCodec, TemporalVersionedPolicy, envelopeConverter } from '../../../index';
|
|
9
9
|
const knowledgeKind = 'knowledge';
|
|
10
10
|
const mtmKind = 'mtm';
|
|
11
|
+
const factKind = 'fact';
|
|
11
12
|
function mutableRoot() {
|
|
12
13
|
const tree = FileTree.inMemory([], { mutable: true }).orThrow();
|
|
13
14
|
const root = tree.getDirectory('/').orThrow();
|
|
@@ -61,13 +62,13 @@ class SpyVectorIndex {
|
|
|
61
62
|
this.failRemove = false;
|
|
62
63
|
this._inner = InMemoryCosineIndex.create().orThrow();
|
|
63
64
|
}
|
|
64
|
-
async add(
|
|
65
|
-
this.calls.push(`add:${id}`);
|
|
66
|
-
return this.failAdd ? fail('add boom') : this._inner.add(
|
|
65
|
+
async add(target, vector) {
|
|
66
|
+
this.calls.push(`add:${target.id}`);
|
|
67
|
+
return this.failAdd ? fail('add boom') : this._inner.add(target, vector);
|
|
67
68
|
}
|
|
68
|
-
async remove(
|
|
69
|
-
this.calls.push(`remove:${id}`);
|
|
70
|
-
return this.failRemove ? fail('remove boom') : this._inner.remove(
|
|
69
|
+
async remove(target) {
|
|
70
|
+
this.calls.push(`remove:${target.id}`);
|
|
71
|
+
return this.failRemove ? fail('remove boom') : this._inner.remove(target);
|
|
71
72
|
}
|
|
72
73
|
query(vector, topK) {
|
|
73
74
|
return this._inner.query(vector, topK);
|
|
@@ -91,17 +92,18 @@ describe('FileTreeMemoryStore embed-on-write', () => {
|
|
|
91
92
|
const index = InMemoryCosineIndex.create().orThrow();
|
|
92
93
|
const store = knowledgeStore(index, recordEmbed);
|
|
93
94
|
expect(await store.put(makeRecord('doc-a', 'cat cat'))).toSucceedAndSatisfy((record) => {
|
|
94
|
-
// InMemoryCosineIndex keys entries by
|
|
95
|
-
|
|
95
|
+
// InMemoryCosineIndex keys entries by the scope-qualified target, so the
|
|
96
|
+
// ref IS that canonical key (scope + NUL + id).
|
|
97
|
+
expect(record.envelope.embeddingRef).toBe('knowledge\0doc-a');
|
|
96
98
|
});
|
|
97
99
|
expect(index.size).toBe(1);
|
|
98
100
|
// The persisted file carries the embeddingRef (round-trips through disk).
|
|
99
101
|
expect(await store.getById('knowledge', 'doc-a')).toSucceedAndSatisfy((record) => {
|
|
100
|
-
expect(record === null || record === void 0 ? void 0 : record.envelope.embeddingRef).toBe('
|
|
102
|
+
expect(record === null || record === void 0 ? void 0 : record.envelope.embeddingRef).toBe('knowledge\0doc-a');
|
|
101
103
|
});
|
|
102
104
|
// The vector is queryable.
|
|
103
105
|
expect(await index.query(featureVector('cat'), 1)).toSucceedAndSatisfy((hits) => {
|
|
104
|
-
expect(hits[0].id).toBe('doc-a');
|
|
106
|
+
expect(hits[0].target.id).toBe('doc-a');
|
|
105
107
|
});
|
|
106
108
|
});
|
|
107
109
|
test('re-embeds on a content change by re-adding (replace semantics, no eager remove)', async () => {
|
|
@@ -157,7 +159,7 @@ describe('FileTreeMemoryStore embed-on-write', () => {
|
|
|
157
159
|
// turn-0 was evicted from the store AND the vector index.
|
|
158
160
|
expect(index.size).toBe(2);
|
|
159
161
|
expect(await index.query(featureVector('cat'), 5)).toSucceedAndSatisfy((hits) => {
|
|
160
|
-
expect(hits.map((h) => h.id)).not.toContain('turn-0');
|
|
162
|
+
expect(hits.map((h) => h.target.id)).not.toContain('turn-0');
|
|
161
163
|
});
|
|
162
164
|
});
|
|
163
165
|
test('persists the record (best-effort) and logs when embedding fails', async () => {
|
|
@@ -256,5 +258,60 @@ describe('FileTreeMemoryStore embed-on-write', () => {
|
|
|
256
258
|
});
|
|
257
259
|
});
|
|
258
260
|
});
|
|
261
|
+
describe('versioned (temporal) embed-on-write', () => {
|
|
262
|
+
// Wires the vector lifecycle against a TemporalIdentityCodec-backed kind so the
|
|
263
|
+
// versioned put path (`_putVersioned -> _embedOnWrite(built, scope)`) is
|
|
264
|
+
// exercised with a real vector index. The flat-path tests already cover the
|
|
265
|
+
// SHARED `_embedOnWrite` line, so this asserts specifically that the VERSIONED
|
|
266
|
+
// call site threads the correct entity scope (not the version stem or some
|
|
267
|
+
// other variable) into the vector target — a scope swap at that call site would
|
|
268
|
+
// fail these assertions, whereas line coverage alone would not catch it.
|
|
269
|
+
function temporalStore(vectorIndex, embed) {
|
|
270
|
+
const reg = BodyConverterRegistry.create().orThrow();
|
|
271
|
+
reg.register(factKind, Converters.string);
|
|
272
|
+
return FileTreeMemoryStore.create({
|
|
273
|
+
root: mutableRoot(),
|
|
274
|
+
registry: reg,
|
|
275
|
+
codecs: new Map([[factKind, TemporalIdentityCodec.create('facts').orThrow()]]),
|
|
276
|
+
writePolicies: new Map([[factKind, TemporalVersionedPolicy.create().orThrow()]]),
|
|
277
|
+
vectorIndex,
|
|
278
|
+
embed
|
|
279
|
+
}).orThrow();
|
|
280
|
+
}
|
|
281
|
+
test('stamps the entity-scope-qualified target as embeddingRef for each version', async () => {
|
|
282
|
+
const spy = new SpyVectorIndex();
|
|
283
|
+
const store = temporalStore(spy, recordEmbed);
|
|
284
|
+
// Two versions of the SAME temporal entity `greeting` (distinct bodies so the
|
|
285
|
+
// second mints a new version rather than deduping). The entity subtree scope
|
|
286
|
+
// is `facts/entities/greeting`; the version stem is `greeting-v<store-seq>`
|
|
287
|
+
// (the store's monotonic seq, which starts at 1 for the first write).
|
|
288
|
+
expect(await store.put(makeRecord('greeting', 'cat', 'fact'))).toSucceedAndSatisfy((record) => {
|
|
289
|
+
// embeddingRef IS edgeTargetKey(target) = `<entity-scope>\0<version-stem>`.
|
|
290
|
+
// A wrong scope at the versioned call site would corrupt the prefix here.
|
|
291
|
+
expect(record.envelope.embeddingRef).toBe('facts/entities/greeting\0greeting-v1');
|
|
292
|
+
});
|
|
293
|
+
expect(await store.put(makeRecord('greeting', 'dog', 'fact'))).toSucceedAndSatisfy((record) => {
|
|
294
|
+
expect(record.envelope.embeddingRef).toBe('facts/entities/greeting\0greeting-v2');
|
|
295
|
+
});
|
|
296
|
+
// Both versions were added under the entity scope, keyed by their version stems.
|
|
297
|
+
expect(spy.calls).toEqual(['add:greeting-v1', 'add:greeting-v2']);
|
|
298
|
+
});
|
|
299
|
+
test('keeps two temporal entities under distinct scopes — no cross-entity vector collision', async () => {
|
|
300
|
+
const index = InMemoryCosineIndex.create().orThrow();
|
|
301
|
+
const store = temporalStore(index, recordEmbed);
|
|
302
|
+
(await store.put(makeRecord('greeting', 'cat', 'fact'))).orThrow();
|
|
303
|
+
(await store.put(makeRecord('farewell', 'fish', 'fact'))).orThrow();
|
|
304
|
+
// Two distinct entity subtrees → two distinct vector entries.
|
|
305
|
+
expect(index.size).toBe(2);
|
|
306
|
+
// A query surfaces both, each carrying its own entity-scope-qualified target.
|
|
307
|
+
expect(await index.query(featureVector('cat'), 5)).toSucceedAndSatisfy((hits) => {
|
|
308
|
+
const targets = hits.map((h) => `${h.target.scope}\0${h.target.id}`).sort();
|
|
309
|
+
expect(targets).toEqual([
|
|
310
|
+
'facts/entities/farewell\0farewell-v2',
|
|
311
|
+
'facts/entities/greeting\0greeting-v1'
|
|
312
|
+
]);
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
});
|
|
259
316
|
});
|
|
260
317
|
//# sourceMappingURL=embedOnWrite.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedOnWrite.test.js","sourceRoot":"","sources":["../../../../src/test/unit/store/embedOnWrite.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2026 Erik Fortune\n * SPDX-License-Identifier: MIT\n */\n\nimport '@fgv/ts-utils-jest';\nimport { Converters, Logging, Result, fail, succeed } from '@fgv/ts-utils';\nimport { FileTree } from '@fgv/ts-json-base';\nimport {\n BodyConverterRegistry,\n FileTreeMemoryStore,\n IBodyConverterRegistry,\n IIdentityCodec,\n IIndexedMemoryRecord,\n IMemoryRecord,\n IVectorIndex,\n IVectorQueryHit,\n InMemoryCosineIndex,\n Kind,\n KnowledgeIdentityCodec,\n MemoryCapCullPolicy,\n EntityId,\n MemoryId,\n MemoryIndex,\n MemoryScopeKey,\n MtmIdentityCodec,\n IWritePolicy,\n SemanticRetriever,\n envelopeConverter\n} from '../../../index';\n\nconst knowledgeKind: Kind = 'knowledge' as Kind;\nconst mtmKind: Kind = 'mtm' as Kind;\n\nfunction mutableRoot(): FileTree.IMutableFileTreeDirectoryItem {\n const tree = FileTree.inMemory([], { mutable: true }).orThrow();\n const root = tree.getDirectory('/').orThrow();\n if (!FileTree.isMutableDirectoryItem(root)) {\n throw new Error('expected a mutable root directory');\n }\n return root;\n}\n\nfunction makeRecord(\n id: string,\n body: string,\n kind: string = 'knowledge',\n entityId?: string\n): IMemoryRecord<unknown> {\n return {\n envelope: envelopeConverter\n .convert({\n id,\n entityId: entityId ?? id,\n kind,\n tags: [],\n links: [],\n created: 0,\n updated: 0,\n seq: 0,\n contentHash: '',\n provenance: { source: 'agent' }\n })\n .orThrow(),\n body\n };\n}\n\n/**\n * Deterministic keyword-count embedder (no network). Counts occurrences of three\n * marker words, so a record's vector and a query's vector live in the same space\n * and cosine ordering is fully predictable.\n */\nconst MARKERS: ReadonlyArray<string> = ['cat', 'dog', 'fish'];\nfunction featureVector(text: string): Float32Array {\n const lower: string = text.toLowerCase();\n return Float32Array.from(MARKERS.map((m) => lower.split(m).length - 1));\n}\nconst recordEmbed = (r: IMemoryRecord<unknown>): Promise<Result<Float32Array>> =>\n // A real embedder receives an `IMemoryRecord<unknown>` and must validate the\n // body through a Converter rather than casting — this models that idiom.\n Promise.resolve(\n Converters.string\n .convert(r.body)\n .withErrorFormat((msg) => `cannot embed: body is not a string: ${msg}`)\n .onSuccess((body) => succeed(featureVector(body)))\n );\nconst queryEmbed = (text: string): Promise<Result<Float32Array>> =>\n Promise.resolve(succeed(featureVector(text)));\n\n/** Records add/remove call order and can be configured to fail either op. */\nclass SpyVectorIndex implements IVectorIndex {\n public readonly calls: string[] = [];\n public failAdd: boolean = false;\n public failRemove: boolean = false;\n private readonly _inner: InMemoryCosineIndex = InMemoryCosineIndex.create().orThrow();\n\n public async add(id: MemoryId, vector: Float32Array): Promise<Result<string>> {\n this.calls.push(`add:${id}`);\n return this.failAdd ? fail('add boom') : this._inner.add(id, vector);\n }\n public async remove(id: MemoryId): Promise<Result<MemoryId>> {\n this.calls.push(`remove:${id}`);\n return this.failRemove ? fail('remove boom') : this._inner.remove(id);\n }\n public query(vector: Float32Array, topK: number): Promise<Result<ReadonlyArray<IVectorQueryHit>>> {\n return this._inner.query(vector, topK);\n }\n}\n\nfunction knowledgeStore(\n vectorIndex?: IVectorIndex,\n embed?: (r: IMemoryRecord<unknown>) => Promise<Result<Float32Array>>,\n logger?: Logging.ILogger\n): FileTreeMemoryStore {\n const registry: IBodyConverterRegistry = BodyConverterRegistry.create().orThrow();\n registry.register(knowledgeKind, Converters.string);\n return FileTreeMemoryStore.create({\n root: mutableRoot(),\n registry,\n codecs: new Map<Kind, IIdentityCodec>([[knowledgeKind, new KnowledgeIdentityCodec()]]),\n vectorIndex,\n embed,\n logger\n }).orThrow();\n}\n\ndescribe('FileTreeMemoryStore embed-on-write', () => {\n describe('when wired', () => {\n test('embeds on write, stamps embeddingRef, and indexes the vector', async () => {\n const index = InMemoryCosineIndex.create().orThrow();\n const store = knowledgeStore(index, recordEmbed);\n expect(await store.put(makeRecord('doc-a', 'cat cat'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n // InMemoryCosineIndex keys entries by id, so the ref IS the id.\n expect(record.envelope.embeddingRef).toBe('doc-a');\n }\n );\n expect(index.size).toBe(1);\n // The persisted file carries the embeddingRef (round-trips through disk).\n expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown> | undefined) => {\n expect(record?.envelope.embeddingRef).toBe('doc-a');\n }\n );\n // The vector is queryable.\n expect(await index.query(featureVector('cat'), 1)).toSucceedAndSatisfy(\n (hits: ReadonlyArray<IVectorQueryHit>) => {\n expect(hits[0].id).toBe('doc-a');\n }\n );\n });\n\n test('re-embeds on a content change by re-adding (replace semantics, no eager remove)', async () => {\n const spy = new SpyVectorIndex();\n const store = knowledgeStore(spy, recordEmbed);\n (await store.put(makeRecord('doc-a', 'cat'))).orThrow();\n (await store.put(makeRecord('doc-a', 'dog'))).orThrow();\n // The content change re-adds (IVectorIndex.add replaces for a same id) —\n // no redundant eager remove.\n expect(spy.calls).toEqual(['add:doc-a', 'add:doc-a']);\n // The index now reflects the new content ('dog'), not the original.\n expect(await spy.query(featureVector('dog'), 1)).toSucceedAndSatisfy(\n (hits: ReadonlyArray<IVectorQueryHit>) => {\n expect(hits[0].score).toBeCloseTo(1);\n }\n );\n });\n\n test('does not re-embed a dedup no-op (identical content)', async () => {\n const spy = new SpyVectorIndex();\n const store = knowledgeStore(spy, recordEmbed);\n (await store.put(makeRecord('doc-a', 'cat'))).orThrow();\n (await store.put(makeRecord('doc-a', 'cat'))).orThrow();\n // The second identical put is a content-dedup no-op — no second embedding.\n expect(spy.calls).toEqual(['add:doc-a']);\n });\n\n test('removes the vector on delete', async () => {\n const spy = new SpyVectorIndex();\n const store = knowledgeStore(spy, recordEmbed);\n (await store.put(makeRecord('doc-a', 'cat'))).orThrow();\n expect(await store.delete(knowledgeKind, 'doc-a' as unknown as EntityId)).toSucceedWith(\n 'doc-a' as MemoryId\n );\n expect(spy.calls).toEqual(['add:doc-a', 'remove:doc-a']);\n expect(await spy.query(featureVector('cat'), 5)).toSucceedWith([]);\n });\n\n test('removes evicted vectors on cap-cull eviction', async () => {\n const index = InMemoryCosineIndex.create().orThrow();\n const capCull: IWritePolicy = MemoryCapCullPolicy.create({\n maxRecords: 2,\n mutableFields: ['body', 'tags', 'links', 'provenance', 'embeddingRef']\n }).orThrow();\n const registry: IBodyConverterRegistry = BodyConverterRegistry.create().orThrow();\n registry.register(mtmKind, Converters.string);\n const store = FileTreeMemoryStore.create({\n root: mutableRoot(),\n registry,\n codecs: new Map<Kind, IIdentityCodec>([[mtmKind, new MtmIdentityCodec()]]),\n writePolicies: new Map<Kind, IWritePolicy>([[mtmKind, capCull]]),\n vectorIndex: index,\n embed: recordEmbed\n }).orThrow();\n\n // Distinct bodies so each gets a distinct vector; maxRecords=2 evicts the\n // oldest on the third write.\n (await store.put(makeRecord('turn-0', 'cat', 'mtm', 'conv-1:0'))).orThrow();\n (await store.put(makeRecord('turn-1', 'dog', 'mtm', 'conv-1:1'))).orThrow();\n (await store.put(makeRecord('turn-2', 'fish', 'mtm', 'conv-1:2'))).orThrow();\n // turn-0 was evicted from the store AND the vector index.\n expect(index.size).toBe(2);\n expect(await index.query(featureVector('cat'), 5)).toSucceedAndSatisfy(\n (hits: ReadonlyArray<IVectorQueryHit>) => {\n expect(hits.map((h) => h.id)).not.toContain('turn-0');\n }\n );\n });\n\n test('persists the record (best-effort) and logs when embedding fails', async () => {\n const index = InMemoryCosineIndex.create().orThrow();\n const logger = new Logging.InMemoryLogger();\n const failEmbed = (): Promise<Result<Float32Array>> => Promise.resolve(fail('no model'));\n const store = knowledgeStore(index, failEmbed, logger);\n // The durable write succeeds; only the derived index is skipped (rebuildable).\n expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n expect(record.envelope.embeddingRef).toBeUndefined();\n }\n );\n expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown> | undefined) => {\n expect(record?.envelope.id).toBe('doc-a');\n }\n );\n expect(index.size).toBe(0);\n expect(logger.logged.some((m) => /embedding 'doc-a' failed.*no model/i.test(m))).toBe(true);\n });\n\n test('persists the record (best-effort) and logs when the vector add fails', async () => {\n const spy = new SpyVectorIndex();\n spy.failAdd = true;\n const logger = new Logging.InMemoryLogger();\n const store = knowledgeStore(spy, recordEmbed, logger);\n expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n expect(record.envelope.embeddingRef).toBeUndefined();\n }\n );\n expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown> | undefined) => {\n expect(record?.envelope.id).toBe('doc-a');\n }\n );\n expect(logger.logged.some((m) => /vector add for 'doc-a' failed.*add boom/i.test(m))).toBe(true);\n });\n\n test('best-effort embed survives a throwing/rejecting embedder', async () => {\n const index = InMemoryCosineIndex.create().orThrow();\n const logger = new Logging.InMemoryLogger();\n const throwingEmbed = (): Promise<Result<Float32Array>> => Promise.reject(new Error('embedder kaboom'));\n const store = knowledgeStore(index, throwingEmbed, logger);\n expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceed();\n expect(index.size).toBe(0);\n expect(logger.logged.some((m) => /embedding 'doc-a' threw.*embedder kaboom/i.test(m))).toBe(true);\n });\n\n test('a committed delete succeeds (best-effort) and logs when vector removal fails', async () => {\n const spy = new SpyVectorIndex();\n const logger = new Logging.InMemoryLogger();\n const store = knowledgeStore(spy, recordEmbed, logger);\n (await store.put(makeRecord('doc-a', 'cat'))).orThrow();\n spy.failRemove = true;\n // The record is already gone; vector cleanup failure must NOT fail the delete.\n expect(await store.delete(knowledgeKind, 'doc-a' as unknown as EntityId)).toSucceedWith(\n 'doc-a' as MemoryId\n );\n expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedWith(\n undefined\n );\n expect(logger.logged.some((m) => /vector removal for 'doc-a' failed.*remove boom/i.test(m))).toBe(true);\n });\n });\n\n describe('when unwired', () => {\n test('a store without a vector index or embedder leaves embeddingRef unset', async () => {\n const store = knowledgeStore();\n expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n expect(record.envelope.embeddingRef).toBeUndefined();\n }\n );\n });\n\n test('a vector index without an embedder is fully inert (no add or remove)', async () => {\n const spy = new SpyVectorIndex();\n const store = knowledgeStore(spy, undefined);\n expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n expect(record.envelope.embeddingRef).toBeUndefined();\n }\n );\n // The vector lifecycle is wholly off without an embedder: neither put nor\n // delete touches the index (a remove would target a record never embedded).\n (await store.delete(knowledgeKind, 'doc-a' as unknown as EntityId)).orThrow();\n expect(spy.calls).toEqual([]);\n });\n });\n\n describe('semantic recall end-to-end', () => {\n test('a wired store + InMemoryCosineIndex + SemanticRetriever returns cosine top-k', async () => {\n const index = InMemoryCosineIndex.create().orThrow();\n const store = knowledgeStore(index, recordEmbed);\n (await store.put(makeRecord('cats', 'cat cat cat'))).orThrow();\n (await store.put(makeRecord('dogs', 'dog dog dog'))).orThrow();\n (await store.put(makeRecord('fishes', 'fish fish fish'))).orThrow();\n\n // SemanticRetriever takes an IMemoryIndex separate from the store (the\n // store's derived index is private and the two are intentionally\n // decoupled), so build a record index mirroring the store — keyed by the\n // shared vectorIndex instance — for hit hydration.\n const listed: ReadonlyArray<IMemoryRecord<unknown>> = (await store.list()).orThrow();\n const recordIndex = MemoryIndex.create().orThrow();\n recordIndex\n .rebuild(\n listed.map((record): IIndexedMemoryRecord => ({ scope: 'knowledge' as MemoryScopeKey, record }))\n )\n .orThrow();\n\n const retriever = SemanticRetriever.create({\n index: recordIndex,\n backend: { vectorIndex: index, embedQuery: queryEmbed }\n }).orThrow();\n expect(retriever.capabilities.supportsSemanticRecall).toBe(true);\n\n expect(await retriever.retrieve({ semantic: 'cat', topK: 2 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n // 'cats' is the closest; 'dogs'/'fishes' are orthogonal (cosine 0) so\n // only the cat record ranks above them — it is first.\n expect(records[0].envelope.id).toBe('cats');\n }\n );\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"embedOnWrite.test.js","sourceRoot":"","sources":["../../../../src/test/unit/store/embedOnWrite.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2026 Erik Fortune\n * SPDX-License-Identifier: MIT\n */\n\nimport '@fgv/ts-utils-jest';\nimport { Converters, Logging, Result, fail, succeed } from '@fgv/ts-utils';\nimport { FileTree } from '@fgv/ts-json-base';\nimport {\n BodyConverterRegistry,\n FileTreeMemoryStore,\n IBodyConverterRegistry,\n IEdgeTarget,\n IIdentityCodec,\n IIndexedMemoryRecord,\n IMemoryRecord,\n IVectorIndex,\n IVectorQueryHit,\n InMemoryCosineIndex,\n Kind,\n KnowledgeIdentityCodec,\n MemoryCapCullPolicy,\n EntityId,\n MemoryId,\n MemoryIndex,\n MemoryScopeKey,\n MtmIdentityCodec,\n IWritePolicy,\n SemanticRetriever,\n TemporalIdentityCodec,\n TemporalVersionedPolicy,\n envelopeConverter\n} from '../../../index';\n\nconst knowledgeKind: Kind = 'knowledge' as Kind;\nconst mtmKind: Kind = 'mtm' as Kind;\nconst factKind: Kind = 'fact' as Kind;\n\nfunction mutableRoot(): FileTree.IMutableFileTreeDirectoryItem {\n const tree = FileTree.inMemory([], { mutable: true }).orThrow();\n const root = tree.getDirectory('/').orThrow();\n if (!FileTree.isMutableDirectoryItem(root)) {\n throw new Error('expected a mutable root directory');\n }\n return root;\n}\n\nfunction makeRecord(\n id: string,\n body: string,\n kind: string = 'knowledge',\n entityId?: string\n): IMemoryRecord<unknown> {\n return {\n envelope: envelopeConverter\n .convert({\n id,\n entityId: entityId ?? id,\n kind,\n tags: [],\n links: [],\n created: 0,\n updated: 0,\n seq: 0,\n contentHash: '',\n provenance: { source: 'agent' }\n })\n .orThrow(),\n body\n };\n}\n\n/**\n * Deterministic keyword-count embedder (no network). Counts occurrences of three\n * marker words, so a record's vector and a query's vector live in the same space\n * and cosine ordering is fully predictable.\n */\nconst MARKERS: ReadonlyArray<string> = ['cat', 'dog', 'fish'];\nfunction featureVector(text: string): Float32Array {\n const lower: string = text.toLowerCase();\n return Float32Array.from(MARKERS.map((m) => lower.split(m).length - 1));\n}\nconst recordEmbed = (r: IMemoryRecord<unknown>): Promise<Result<Float32Array>> =>\n // A real embedder receives an `IMemoryRecord<unknown>` and must validate the\n // body through a Converter rather than casting — this models that idiom.\n Promise.resolve(\n Converters.string\n .convert(r.body)\n .withErrorFormat((msg) => `cannot embed: body is not a string: ${msg}`)\n .onSuccess((body) => succeed(featureVector(body)))\n );\nconst queryEmbed = (text: string): Promise<Result<Float32Array>> =>\n Promise.resolve(succeed(featureVector(text)));\n\n/** Records add/remove call order and can be configured to fail either op. */\nclass SpyVectorIndex implements IVectorIndex {\n public readonly calls: string[] = [];\n public failAdd: boolean = false;\n public failRemove: boolean = false;\n private readonly _inner: InMemoryCosineIndex = InMemoryCosineIndex.create().orThrow();\n\n public async add(target: IEdgeTarget, vector: Float32Array): Promise<Result<string>> {\n this.calls.push(`add:${target.id}`);\n return this.failAdd ? fail('add boom') : this._inner.add(target, vector);\n }\n public async remove(target: IEdgeTarget): Promise<Result<IEdgeTarget>> {\n this.calls.push(`remove:${target.id}`);\n return this.failRemove ? fail('remove boom') : this._inner.remove(target);\n }\n public query(vector: Float32Array, topK: number): Promise<Result<ReadonlyArray<IVectorQueryHit>>> {\n return this._inner.query(vector, topK);\n }\n}\n\nfunction knowledgeStore(\n vectorIndex?: IVectorIndex,\n embed?: (r: IMemoryRecord<unknown>) => Promise<Result<Float32Array>>,\n logger?: Logging.ILogger\n): FileTreeMemoryStore {\n const registry: IBodyConverterRegistry = BodyConverterRegistry.create().orThrow();\n registry.register(knowledgeKind, Converters.string);\n return FileTreeMemoryStore.create({\n root: mutableRoot(),\n registry,\n codecs: new Map<Kind, IIdentityCodec>([[knowledgeKind, new KnowledgeIdentityCodec()]]),\n vectorIndex,\n embed,\n logger\n }).orThrow();\n}\n\ndescribe('FileTreeMemoryStore embed-on-write', () => {\n describe('when wired', () => {\n test('embeds on write, stamps embeddingRef, and indexes the vector', async () => {\n const index = InMemoryCosineIndex.create().orThrow();\n const store = knowledgeStore(index, recordEmbed);\n expect(await store.put(makeRecord('doc-a', 'cat cat'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n // InMemoryCosineIndex keys entries by the scope-qualified target, so the\n // ref IS that canonical key (scope + NUL + id).\n expect(record.envelope.embeddingRef).toBe('knowledge\\0doc-a');\n }\n );\n expect(index.size).toBe(1);\n // The persisted file carries the embeddingRef (round-trips through disk).\n expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown> | undefined) => {\n expect(record?.envelope.embeddingRef).toBe('knowledge\\0doc-a');\n }\n );\n // The vector is queryable.\n expect(await index.query(featureVector('cat'), 1)).toSucceedAndSatisfy(\n (hits: ReadonlyArray<IVectorQueryHit>) => {\n expect(hits[0].target.id).toBe('doc-a');\n }\n );\n });\n\n test('re-embeds on a content change by re-adding (replace semantics, no eager remove)', async () => {\n const spy = new SpyVectorIndex();\n const store = knowledgeStore(spy, recordEmbed);\n (await store.put(makeRecord('doc-a', 'cat'))).orThrow();\n (await store.put(makeRecord('doc-a', 'dog'))).orThrow();\n // The content change re-adds (IVectorIndex.add replaces for a same id) —\n // no redundant eager remove.\n expect(spy.calls).toEqual(['add:doc-a', 'add:doc-a']);\n // The index now reflects the new content ('dog'), not the original.\n expect(await spy.query(featureVector('dog'), 1)).toSucceedAndSatisfy(\n (hits: ReadonlyArray<IVectorQueryHit>) => {\n expect(hits[0].score).toBeCloseTo(1);\n }\n );\n });\n\n test('does not re-embed a dedup no-op (identical content)', async () => {\n const spy = new SpyVectorIndex();\n const store = knowledgeStore(spy, recordEmbed);\n (await store.put(makeRecord('doc-a', 'cat'))).orThrow();\n (await store.put(makeRecord('doc-a', 'cat'))).orThrow();\n // The second identical put is a content-dedup no-op — no second embedding.\n expect(spy.calls).toEqual(['add:doc-a']);\n });\n\n test('removes the vector on delete', async () => {\n const spy = new SpyVectorIndex();\n const store = knowledgeStore(spy, recordEmbed);\n (await store.put(makeRecord('doc-a', 'cat'))).orThrow();\n expect(await store.delete(knowledgeKind, 'doc-a' as unknown as EntityId)).toSucceedWith(\n 'doc-a' as MemoryId\n );\n expect(spy.calls).toEqual(['add:doc-a', 'remove:doc-a']);\n expect(await spy.query(featureVector('cat'), 5)).toSucceedWith([]);\n });\n\n test('removes evicted vectors on cap-cull eviction', async () => {\n const index = InMemoryCosineIndex.create().orThrow();\n const capCull: IWritePolicy = MemoryCapCullPolicy.create({\n maxRecords: 2,\n mutableFields: ['body', 'tags', 'links', 'provenance', 'embeddingRef']\n }).orThrow();\n const registry: IBodyConverterRegistry = BodyConverterRegistry.create().orThrow();\n registry.register(mtmKind, Converters.string);\n const store = FileTreeMemoryStore.create({\n root: mutableRoot(),\n registry,\n codecs: new Map<Kind, IIdentityCodec>([[mtmKind, new MtmIdentityCodec()]]),\n writePolicies: new Map<Kind, IWritePolicy>([[mtmKind, capCull]]),\n vectorIndex: index,\n embed: recordEmbed\n }).orThrow();\n\n // Distinct bodies so each gets a distinct vector; maxRecords=2 evicts the\n // oldest on the third write.\n (await store.put(makeRecord('turn-0', 'cat', 'mtm', 'conv-1:0'))).orThrow();\n (await store.put(makeRecord('turn-1', 'dog', 'mtm', 'conv-1:1'))).orThrow();\n (await store.put(makeRecord('turn-2', 'fish', 'mtm', 'conv-1:2'))).orThrow();\n // turn-0 was evicted from the store AND the vector index.\n expect(index.size).toBe(2);\n expect(await index.query(featureVector('cat'), 5)).toSucceedAndSatisfy(\n (hits: ReadonlyArray<IVectorQueryHit>) => {\n expect(hits.map((h) => h.target.id)).not.toContain('turn-0');\n }\n );\n });\n\n test('persists the record (best-effort) and logs when embedding fails', async () => {\n const index = InMemoryCosineIndex.create().orThrow();\n const logger = new Logging.InMemoryLogger();\n const failEmbed = (): Promise<Result<Float32Array>> => Promise.resolve(fail('no model'));\n const store = knowledgeStore(index, failEmbed, logger);\n // The durable write succeeds; only the derived index is skipped (rebuildable).\n expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n expect(record.envelope.embeddingRef).toBeUndefined();\n }\n );\n expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown> | undefined) => {\n expect(record?.envelope.id).toBe('doc-a');\n }\n );\n expect(index.size).toBe(0);\n expect(logger.logged.some((m) => /embedding 'doc-a' failed.*no model/i.test(m))).toBe(true);\n });\n\n test('persists the record (best-effort) and logs when the vector add fails', async () => {\n const spy = new SpyVectorIndex();\n spy.failAdd = true;\n const logger = new Logging.InMemoryLogger();\n const store = knowledgeStore(spy, recordEmbed, logger);\n expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n expect(record.envelope.embeddingRef).toBeUndefined();\n }\n );\n expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown> | undefined) => {\n expect(record?.envelope.id).toBe('doc-a');\n }\n );\n expect(logger.logged.some((m) => /vector add for 'doc-a' failed.*add boom/i.test(m))).toBe(true);\n });\n\n test('best-effort embed survives a throwing/rejecting embedder', async () => {\n const index = InMemoryCosineIndex.create().orThrow();\n const logger = new Logging.InMemoryLogger();\n const throwingEmbed = (): Promise<Result<Float32Array>> => Promise.reject(new Error('embedder kaboom'));\n const store = knowledgeStore(index, throwingEmbed, logger);\n expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceed();\n expect(index.size).toBe(0);\n expect(logger.logged.some((m) => /embedding 'doc-a' threw.*embedder kaboom/i.test(m))).toBe(true);\n });\n\n test('a committed delete succeeds (best-effort) and logs when vector removal fails', async () => {\n const spy = new SpyVectorIndex();\n const logger = new Logging.InMemoryLogger();\n const store = knowledgeStore(spy, recordEmbed, logger);\n (await store.put(makeRecord('doc-a', 'cat'))).orThrow();\n spy.failRemove = true;\n // The record is already gone; vector cleanup failure must NOT fail the delete.\n expect(await store.delete(knowledgeKind, 'doc-a' as unknown as EntityId)).toSucceedWith(\n 'doc-a' as MemoryId\n );\n expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedWith(\n undefined\n );\n expect(logger.logged.some((m) => /vector removal for 'doc-a' failed.*remove boom/i.test(m))).toBe(true);\n });\n });\n\n describe('when unwired', () => {\n test('a store without a vector index or embedder leaves embeddingRef unset', async () => {\n const store = knowledgeStore();\n expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n expect(record.envelope.embeddingRef).toBeUndefined();\n }\n );\n });\n\n test('a vector index without an embedder is fully inert (no add or remove)', async () => {\n const spy = new SpyVectorIndex();\n const store = knowledgeStore(spy, undefined);\n expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n expect(record.envelope.embeddingRef).toBeUndefined();\n }\n );\n // The vector lifecycle is wholly off without an embedder: neither put nor\n // delete touches the index (a remove would target a record never embedded).\n (await store.delete(knowledgeKind, 'doc-a' as unknown as EntityId)).orThrow();\n expect(spy.calls).toEqual([]);\n });\n });\n\n describe('semantic recall end-to-end', () => {\n test('a wired store + InMemoryCosineIndex + SemanticRetriever returns cosine top-k', async () => {\n const index = InMemoryCosineIndex.create().orThrow();\n const store = knowledgeStore(index, recordEmbed);\n (await store.put(makeRecord('cats', 'cat cat cat'))).orThrow();\n (await store.put(makeRecord('dogs', 'dog dog dog'))).orThrow();\n (await store.put(makeRecord('fishes', 'fish fish fish'))).orThrow();\n\n // SemanticRetriever takes an IMemoryIndex separate from the store (the\n // store's derived index is private and the two are intentionally\n // decoupled), so build a record index mirroring the store — keyed by the\n // shared vectorIndex instance — for hit hydration.\n const listed: ReadonlyArray<IMemoryRecord<unknown>> = (await store.list()).orThrow();\n const recordIndex = MemoryIndex.create().orThrow();\n recordIndex\n .rebuild(\n listed.map((record): IIndexedMemoryRecord => ({ scope: 'knowledge' as MemoryScopeKey, record }))\n )\n .orThrow();\n\n const retriever = SemanticRetriever.create({\n index: recordIndex,\n backend: { vectorIndex: index, embedQuery: queryEmbed }\n }).orThrow();\n expect(retriever.capabilities.supportsSemanticRecall).toBe(true);\n\n expect(await retriever.retrieve({ semantic: 'cat', topK: 2 })).toSucceedAndSatisfy(\n (records: ReadonlyArray<IMemoryRecord<unknown>>) => {\n // 'cats' is the closest; 'dogs'/'fishes' are orthogonal (cosine 0) so\n // only the cat record ranks above them — it is first.\n expect(records[0].envelope.id).toBe('cats');\n }\n );\n });\n });\n\n describe('versioned (temporal) embed-on-write', () => {\n // Wires the vector lifecycle against a TemporalIdentityCodec-backed kind so the\n // versioned put path (`_putVersioned -> _embedOnWrite(built, scope)`) is\n // exercised with a real vector index. The flat-path tests already cover the\n // SHARED `_embedOnWrite` line, so this asserts specifically that the VERSIONED\n // call site threads the correct entity scope (not the version stem or some\n // other variable) into the vector target — a scope swap at that call site would\n // fail these assertions, whereas line coverage alone would not catch it.\n function temporalStore(\n vectorIndex: IVectorIndex,\n embed: (r: IMemoryRecord<unknown>) => Promise<Result<Float32Array>>\n ): FileTreeMemoryStore {\n const reg: IBodyConverterRegistry = BodyConverterRegistry.create().orThrow();\n reg.register(factKind, Converters.string);\n return FileTreeMemoryStore.create({\n root: mutableRoot(),\n registry: reg,\n codecs: new Map<Kind, IIdentityCodec>([[factKind, TemporalIdentityCodec.create('facts').orThrow()]]),\n writePolicies: new Map<Kind, IWritePolicy>([[factKind, TemporalVersionedPolicy.create().orThrow()]]),\n vectorIndex,\n embed\n }).orThrow();\n }\n\n test('stamps the entity-scope-qualified target as embeddingRef for each version', async () => {\n const spy = new SpyVectorIndex();\n const store = temporalStore(spy, recordEmbed);\n // Two versions of the SAME temporal entity `greeting` (distinct bodies so the\n // second mints a new version rather than deduping). The entity subtree scope\n // is `facts/entities/greeting`; the version stem is `greeting-v<store-seq>`\n // (the store's monotonic seq, which starts at 1 for the first write).\n expect(await store.put(makeRecord('greeting', 'cat', 'fact'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n // embeddingRef IS edgeTargetKey(target) = `<entity-scope>\\0<version-stem>`.\n // A wrong scope at the versioned call site would corrupt the prefix here.\n expect(record.envelope.embeddingRef).toBe('facts/entities/greeting\\0greeting-v1');\n }\n );\n expect(await store.put(makeRecord('greeting', 'dog', 'fact'))).toSucceedAndSatisfy(\n (record: IMemoryRecord<unknown>) => {\n expect(record.envelope.embeddingRef).toBe('facts/entities/greeting\\0greeting-v2');\n }\n );\n // Both versions were added under the entity scope, keyed by their version stems.\n expect(spy.calls).toEqual(['add:greeting-v1', 'add:greeting-v2']);\n });\n\n test('keeps two temporal entities under distinct scopes — no cross-entity vector collision', async () => {\n const index = InMemoryCosineIndex.create().orThrow();\n const store = temporalStore(index, recordEmbed);\n (await store.put(makeRecord('greeting', 'cat', 'fact'))).orThrow();\n (await store.put(makeRecord('farewell', 'fish', 'fact'))).orThrow();\n // Two distinct entity subtrees → two distinct vector entries.\n expect(index.size).toBe(2);\n // A query surfaces both, each carrying its own entity-scope-qualified target.\n expect(await index.query(featureVector('cat'), 5)).toSucceedAndSatisfy(\n (hits: ReadonlyArray<IVectorQueryHit>) => {\n const targets = hits.map((h) => `${h.target.scope}\\0${h.target.id}`).sort();\n expect(targets).toEqual([\n 'facts/entities/farewell\\0farewell-v2',\n 'facts/entities/greeting\\0greeting-v1'\n ]);\n }\n );\n });\n });\n});\n"]}
|