@fgv/ts-agent-memory 5.1.0-47 → 5.1.0-49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packlets/ingest/orchestrator.js +11 -1
- package/dist/packlets/ingest/orchestrator.js.map +1 -1
- package/dist/packlets/observe/memoryObservationStore.js +6 -0
- package/dist/packlets/observe/memoryObservationStore.js.map +1 -1
- package/dist/packlets/observe/observer.js.map +1 -1
- package/dist/packlets/retrieve/linkTraversalRetriever.js +1 -1
- package/dist/packlets/retrieve/linkTraversalRetriever.js.map +1 -1
- package/dist/packlets/retrieve/recencyRetriever.js +1 -1
- package/dist/packlets/retrieve/recencyRetriever.js.map +1 -1
- package/dist/packlets/retrieve/retriever.js +11 -5
- package/dist/packlets/retrieve/retriever.js.map +1 -1
- package/dist/packlets/retrieve/structuredFilterRetriever.js +27 -5
- package/dist/packlets/retrieve/structuredFilterRetriever.js.map +1 -1
- package/dist/packlets/retrieve/tagRetriever.js +1 -1
- package/dist/packlets/retrieve/tagRetriever.js.map +1 -1
- package/dist/packlets/retrieve/temporalRetrievers.js +1 -1
- package/dist/packlets/retrieve/temporalRetrievers.js.map +1 -1
- package/dist/packlets/store/fileTreeMemoryStore.js +152 -132
- package/dist/packlets/store/fileTreeMemoryStore.js.map +1 -1
- package/dist/packlets/store/vectorMaintenance.js +251 -0
- package/dist/packlets/store/vectorMaintenance.js.map +1 -0
- package/dist/packlets/types/envelope.js.map +1 -1
- package/dist/packlets/vector/inMemoryCosineIndex.js +81 -18
- package/dist/packlets/vector/inMemoryCosineIndex.js.map +1 -1
- package/dist/packlets/vector/inMemoryFragmentCosineIndex.js +7 -0
- package/dist/packlets/vector/inMemoryFragmentCosineIndex.js.map +1 -1
- package/dist/packlets/vector/vectorIndex.js.map +1 -1
- package/dist/ts-agent-memory.d.ts +431 -79
- package/lib/packlets/ingest/orchestrator.d.ts.map +1 -1
- package/lib/packlets/ingest/orchestrator.js +11 -1
- package/lib/packlets/ingest/orchestrator.js.map +1 -1
- package/lib/packlets/observe/memoryObservationStore.d.ts.map +1 -1
- package/lib/packlets/observe/memoryObservationStore.js +6 -0
- package/lib/packlets/observe/memoryObservationStore.js.map +1 -1
- package/lib/packlets/observe/observer.d.ts +61 -0
- package/lib/packlets/observe/observer.d.ts.map +1 -1
- package/lib/packlets/observe/observer.js.map +1 -1
- package/lib/packlets/retrieve/linkTraversalRetriever.d.ts +1 -1
- package/lib/packlets/retrieve/linkTraversalRetriever.js +1 -1
- package/lib/packlets/retrieve/linkTraversalRetriever.js.map +1 -1
- package/lib/packlets/retrieve/recencyRetriever.d.ts +1 -1
- package/lib/packlets/retrieve/recencyRetriever.js +1 -1
- package/lib/packlets/retrieve/recencyRetriever.js.map +1 -1
- package/lib/packlets/retrieve/retriever.d.ts +26 -7
- package/lib/packlets/retrieve/retriever.d.ts.map +1 -1
- package/lib/packlets/retrieve/retriever.js +11 -5
- package/lib/packlets/retrieve/retriever.js.map +1 -1
- package/lib/packlets/retrieve/structuredFilterRetriever.d.ts +26 -4
- package/lib/packlets/retrieve/structuredFilterRetriever.d.ts.map +1 -1
- package/lib/packlets/retrieve/structuredFilterRetriever.js +27 -5
- package/lib/packlets/retrieve/structuredFilterRetriever.js.map +1 -1
- package/lib/packlets/retrieve/tagRetriever.d.ts +1 -1
- package/lib/packlets/retrieve/tagRetriever.js +1 -1
- package/lib/packlets/retrieve/tagRetriever.js.map +1 -1
- package/lib/packlets/retrieve/temporalRetrievers.js +1 -1
- package/lib/packlets/retrieve/temporalRetrievers.js.map +1 -1
- package/lib/packlets/store/fileTreeMemoryStore.d.ts +135 -59
- package/lib/packlets/store/fileTreeMemoryStore.d.ts.map +1 -1
- package/lib/packlets/store/fileTreeMemoryStore.js +151 -131
- package/lib/packlets/store/fileTreeMemoryStore.js.map +1 -1
- package/lib/packlets/store/vectorMaintenance.d.ts +149 -0
- package/lib/packlets/store/vectorMaintenance.d.ts.map +1 -0
- package/lib/packlets/store/vectorMaintenance.js +255 -0
- package/lib/packlets/store/vectorMaintenance.js.map +1 -0
- package/lib/packlets/types/envelope.d.ts +11 -0
- package/lib/packlets/types/envelope.d.ts.map +1 -1
- package/lib/packlets/types/envelope.js.map +1 -1
- package/lib/packlets/vector/inMemoryCosineIndex.d.ts +30 -7
- package/lib/packlets/vector/inMemoryCosineIndex.d.ts.map +1 -1
- package/lib/packlets/vector/inMemoryCosineIndex.js +80 -17
- package/lib/packlets/vector/inMemoryCosineIndex.js.map +1 -1
- package/lib/packlets/vector/inMemoryFragmentCosineIndex.d.ts +7 -0
- package/lib/packlets/vector/inMemoryFragmentCosineIndex.d.ts.map +1 -1
- package/lib/packlets/vector/inMemoryFragmentCosineIndex.js +7 -0
- package/lib/packlets/vector/inMemoryFragmentCosineIndex.js.map +1 -1
- package/lib/packlets/vector/vectorIndex.d.ts +129 -1
- package/lib/packlets/vector/vectorIndex.d.ts.map +1 -1
- package/lib/packlets/vector/vectorIndex.js.map +1 -1
- package/package.json +17 -7
- package/.rush/temp/5667e36f1c0cc503a5c20a3ebff76e7b9a702d41.tar.log +0 -468
- package/.rush/temp/chunked-rush-logs/ts-agent-memory.build.chunks.jsonl +0 -9
- package/.rush/temp/operation/build/all.log +0 -9
- package/.rush/temp/operation/build/log-chunks.jsonl +0 -9
- package/.rush/temp/operation/build/state.json +0 -3
- package/.rush/temp/shrinkwrap-deps.json +0 -689
- package/config/api-extractor.json +0 -343
- package/config/jest.config.json +0 -14
- package/config/rig.json +0 -4
- package/dist/test/unit/converters/antagonistRoundTrip.test.js +0 -95
- package/dist/test/unit/converters/antagonistRoundTrip.test.js.map +0 -1
- package/dist/test/unit/converters/bodyConverterRegistry.test.js +0 -72
- package/dist/test/unit/converters/bodyConverterRegistry.test.js.map +0 -1
- package/dist/test/unit/converters/envelopeConverter.test.js +0 -313
- package/dist/test/unit/converters/envelopeConverter.test.js.map +0 -1
- package/dist/test/unit/index/memoryIndex.test.js +0 -214
- package/dist/test/unit/index/memoryIndex.test.js.map +0 -1
- package/dist/test/unit/ingest/antagonistCycleAndParity.test.js +0 -277
- package/dist/test/unit/ingest/antagonistCycleAndParity.test.js.map +0 -1
- package/dist/test/unit/ingest/cycleGuard.test.js +0 -81
- package/dist/test/unit/ingest/cycleGuard.test.js.map +0 -1
- package/dist/test/unit/ingest/dedupScope.test.js +0 -434
- package/dist/test/unit/ingest/dedupScope.test.js.map +0 -1
- package/dist/test/unit/ingest/orchestrator.test.js +0 -1058
- package/dist/test/unit/ingest/orchestrator.test.js.map +0 -1
- package/dist/test/unit/observe/memoryObservationStore.test.js +0 -118
- package/dist/test/unit/observe/memoryObservationStore.test.js.map +0 -1
- package/dist/test/unit/retrieve/fragmentSemanticRetriever.test.js +0 -116
- package/dist/test/unit/retrieve/fragmentSemanticRetriever.test.js.map +0 -1
- package/dist/test/unit/retrieve/linkTraversalRetriever.test.js +0 -257
- package/dist/test/unit/retrieve/linkTraversalRetriever.test.js.map +0 -1
- package/dist/test/unit/retrieve/retrievers.test.js +0 -768
- package/dist/test/unit/retrieve/retrievers.test.js.map +0 -1
- package/dist/test/unit/retrieve/temporalRetrievers.test.js +0 -182
- package/dist/test/unit/retrieve/temporalRetrievers.test.js.map +0 -1
- package/dist/test/unit/store/antagonistTemporalBoundary.test.js +0 -120
- package/dist/test/unit/store/antagonistTemporalBoundary.test.js.map +0 -1
- package/dist/test/unit/store/embedOnWrite.test.js +0 -317
- package/dist/test/unit/store/embedOnWrite.test.js.map +0 -1
- package/dist/test/unit/store/fileTreeMemoryStore.test.js +0 -778
- package/dist/test/unit/store/fileTreeMemoryStore.test.js.map +0 -1
- package/dist/test/unit/store/fragmentEmbedOnWrite.test.js +0 -255
- package/dist/test/unit/store/fragmentEmbedOnWrite.test.js.map +0 -1
- package/dist/test/unit/store/indexInjection.test.js +0 -432
- package/dist/test/unit/store/indexInjection.test.js.map +0 -1
- package/dist/test/unit/store/lenientOpen.test.js +0 -248
- package/dist/test/unit/store/lenientOpen.test.js.map +0 -1
- package/dist/test/unit/store/listScoped.test.js +0 -109
- package/dist/test/unit/store/listScoped.test.js.map +0 -1
- package/dist/test/unit/store/observations.test.js +0 -239
- package/dist/test/unit/store/observations.test.js.map +0 -1
- package/dist/test/unit/store/rankAxis.test.js +0 -254
- package/dist/test/unit/store/rankAxis.test.js.map +0 -1
- package/dist/test/unit/store/scopeEncoding.test.js +0 -24
- package/dist/test/unit/store/scopeEncoding.test.js.map +0 -1
- package/dist/test/unit/store/temporalStore.test.js +0 -398
- package/dist/test/unit/store/temporalStore.test.js.map +0 -1
- package/dist/test/unit/tools/memoryTools.test.js +0 -842
- package/dist/test/unit/tools/memoryTools.test.js.map +0 -1
- package/dist/test/unit/types/identityCodec.test.js +0 -187
- package/dist/test/unit/types/identityCodec.test.js.map +0 -1
- package/dist/test/unit/types/ids.test.js +0 -84
- package/dist/test/unit/types/ids.test.js.map +0 -1
- package/dist/test/unit/types/temporalCodec.test.js +0 -203
- package/dist/test/unit/types/temporalCodec.test.js.map +0 -1
- package/dist/test/unit/types/temporalPolicy.test.js +0 -83
- package/dist/test/unit/types/temporalPolicy.test.js.map +0 -1
- package/dist/test/unit/types/writePolicy.test.js +0 -331
- package/dist/test/unit/types/writePolicy.test.js.map +0 -1
- package/dist/test/unit/vector/fragmentConverters.test.js +0 -58
- package/dist/test/unit/vector/fragmentConverters.test.js.map +0 -1
- package/dist/test/unit/vector/inMemoryCosineIndex.test.js +0 -252
- package/dist/test/unit/vector/inMemoryCosineIndex.test.js.map +0 -1
- package/dist/test/unit/vector/inMemoryFragmentCosineIndex.test.js +0 -362
- package/dist/test/unit/vector/inMemoryFragmentCosineIndex.test.js.map +0 -1
- package/dist/test/unit/vector/vectorIndex.test.js +0 -51
- package/dist/test/unit/vector/vectorIndex.test.js.map +0 -1
- package/eslint.config.js +0 -15
- package/etc/ts-agent-memory.api.md +0 -940
- package/lib/test/unit/converters/antagonistRoundTrip.test.d.ts +0 -10
- package/lib/test/unit/converters/antagonistRoundTrip.test.d.ts.map +0 -1
- package/lib/test/unit/converters/antagonistRoundTrip.test.js +0 -97
- package/lib/test/unit/converters/antagonistRoundTrip.test.js.map +0 -1
- package/lib/test/unit/converters/bodyConverterRegistry.test.d.ts +0 -2
- package/lib/test/unit/converters/bodyConverterRegistry.test.d.ts.map +0 -1
- package/lib/test/unit/converters/bodyConverterRegistry.test.js +0 -74
- package/lib/test/unit/converters/bodyConverterRegistry.test.js.map +0 -1
- package/lib/test/unit/converters/envelopeConverter.test.d.ts +0 -2
- package/lib/test/unit/converters/envelopeConverter.test.d.ts.map +0 -1
- package/lib/test/unit/converters/envelopeConverter.test.js +0 -315
- package/lib/test/unit/converters/envelopeConverter.test.js.map +0 -1
- package/lib/test/unit/index/memoryIndex.test.d.ts +0 -2
- package/lib/test/unit/index/memoryIndex.test.d.ts.map +0 -1
- package/lib/test/unit/index/memoryIndex.test.js +0 -216
- package/lib/test/unit/index/memoryIndex.test.js.map +0 -1
- package/lib/test/unit/ingest/antagonistCycleAndParity.test.d.ts +0 -9
- package/lib/test/unit/ingest/antagonistCycleAndParity.test.d.ts.map +0 -1
- package/lib/test/unit/ingest/antagonistCycleAndParity.test.js +0 -279
- package/lib/test/unit/ingest/antagonistCycleAndParity.test.js.map +0 -1
- package/lib/test/unit/ingest/cycleGuard.test.d.ts +0 -2
- package/lib/test/unit/ingest/cycleGuard.test.d.ts.map +0 -1
- package/lib/test/unit/ingest/cycleGuard.test.js +0 -83
- package/lib/test/unit/ingest/cycleGuard.test.js.map +0 -1
- package/lib/test/unit/ingest/dedupScope.test.d.ts +0 -2
- package/lib/test/unit/ingest/dedupScope.test.d.ts.map +0 -1
- package/lib/test/unit/ingest/dedupScope.test.js +0 -436
- package/lib/test/unit/ingest/dedupScope.test.js.map +0 -1
- package/lib/test/unit/ingest/orchestrator.test.d.ts +0 -2
- package/lib/test/unit/ingest/orchestrator.test.d.ts.map +0 -1
- package/lib/test/unit/ingest/orchestrator.test.js +0 -1060
- package/lib/test/unit/ingest/orchestrator.test.js.map +0 -1
- package/lib/test/unit/observe/memoryObservationStore.test.d.ts +0 -2
- package/lib/test/unit/observe/memoryObservationStore.test.d.ts.map +0 -1
- package/lib/test/unit/observe/memoryObservationStore.test.js +0 -120
- package/lib/test/unit/observe/memoryObservationStore.test.js.map +0 -1
- package/lib/test/unit/retrieve/fragmentSemanticRetriever.test.d.ts +0 -2
- package/lib/test/unit/retrieve/fragmentSemanticRetriever.test.d.ts.map +0 -1
- package/lib/test/unit/retrieve/fragmentSemanticRetriever.test.js +0 -118
- package/lib/test/unit/retrieve/fragmentSemanticRetriever.test.js.map +0 -1
- package/lib/test/unit/retrieve/linkTraversalRetriever.test.d.ts +0 -2
- package/lib/test/unit/retrieve/linkTraversalRetriever.test.d.ts.map +0 -1
- package/lib/test/unit/retrieve/linkTraversalRetriever.test.js +0 -259
- package/lib/test/unit/retrieve/linkTraversalRetriever.test.js.map +0 -1
- package/lib/test/unit/retrieve/retrievers.test.d.ts +0 -2
- package/lib/test/unit/retrieve/retrievers.test.d.ts.map +0 -1
- package/lib/test/unit/retrieve/retrievers.test.js +0 -770
- package/lib/test/unit/retrieve/retrievers.test.js.map +0 -1
- package/lib/test/unit/retrieve/temporalRetrievers.test.d.ts +0 -2
- package/lib/test/unit/retrieve/temporalRetrievers.test.d.ts.map +0 -1
- package/lib/test/unit/retrieve/temporalRetrievers.test.js +0 -184
- package/lib/test/unit/retrieve/temporalRetrievers.test.js.map +0 -1
- package/lib/test/unit/store/antagonistTemporalBoundary.test.d.ts +0 -9
- package/lib/test/unit/store/antagonistTemporalBoundary.test.d.ts.map +0 -1
- package/lib/test/unit/store/antagonistTemporalBoundary.test.js +0 -122
- package/lib/test/unit/store/antagonistTemporalBoundary.test.js.map +0 -1
- package/lib/test/unit/store/embedOnWrite.test.d.ts +0 -2
- package/lib/test/unit/store/embedOnWrite.test.d.ts.map +0 -1
- package/lib/test/unit/store/embedOnWrite.test.js +0 -319
- package/lib/test/unit/store/embedOnWrite.test.js.map +0 -1
- package/lib/test/unit/store/fileTreeMemoryStore.test.d.ts +0 -2
- package/lib/test/unit/store/fileTreeMemoryStore.test.d.ts.map +0 -1
- package/lib/test/unit/store/fileTreeMemoryStore.test.js +0 -780
- package/lib/test/unit/store/fileTreeMemoryStore.test.js.map +0 -1
- package/lib/test/unit/store/fragmentEmbedOnWrite.test.d.ts +0 -2
- package/lib/test/unit/store/fragmentEmbedOnWrite.test.d.ts.map +0 -1
- package/lib/test/unit/store/fragmentEmbedOnWrite.test.js +0 -257
- package/lib/test/unit/store/fragmentEmbedOnWrite.test.js.map +0 -1
- package/lib/test/unit/store/indexInjection.test.d.ts +0 -2
- package/lib/test/unit/store/indexInjection.test.d.ts.map +0 -1
- package/lib/test/unit/store/indexInjection.test.js +0 -434
- package/lib/test/unit/store/indexInjection.test.js.map +0 -1
- package/lib/test/unit/store/lenientOpen.test.d.ts +0 -2
- package/lib/test/unit/store/lenientOpen.test.d.ts.map +0 -1
- package/lib/test/unit/store/lenientOpen.test.js +0 -250
- package/lib/test/unit/store/lenientOpen.test.js.map +0 -1
- package/lib/test/unit/store/listScoped.test.d.ts +0 -2
- package/lib/test/unit/store/listScoped.test.d.ts.map +0 -1
- package/lib/test/unit/store/listScoped.test.js +0 -111
- package/lib/test/unit/store/listScoped.test.js.map +0 -1
- package/lib/test/unit/store/observations.test.d.ts +0 -2
- package/lib/test/unit/store/observations.test.d.ts.map +0 -1
- package/lib/test/unit/store/observations.test.js +0 -241
- package/lib/test/unit/store/observations.test.js.map +0 -1
- package/lib/test/unit/store/rankAxis.test.d.ts +0 -2
- package/lib/test/unit/store/rankAxis.test.d.ts.map +0 -1
- package/lib/test/unit/store/rankAxis.test.js +0 -256
- package/lib/test/unit/store/rankAxis.test.js.map +0 -1
- package/lib/test/unit/store/scopeEncoding.test.d.ts +0 -2
- package/lib/test/unit/store/scopeEncoding.test.d.ts.map +0 -1
- package/lib/test/unit/store/scopeEncoding.test.js +0 -26
- package/lib/test/unit/store/scopeEncoding.test.js.map +0 -1
- package/lib/test/unit/store/temporalStore.test.d.ts +0 -2
- package/lib/test/unit/store/temporalStore.test.d.ts.map +0 -1
- package/lib/test/unit/store/temporalStore.test.js +0 -400
- package/lib/test/unit/store/temporalStore.test.js.map +0 -1
- package/lib/test/unit/tools/memoryTools.test.d.ts +0 -2
- package/lib/test/unit/tools/memoryTools.test.d.ts.map +0 -1
- package/lib/test/unit/tools/memoryTools.test.js +0 -844
- package/lib/test/unit/tools/memoryTools.test.js.map +0 -1
- package/lib/test/unit/types/identityCodec.test.d.ts +0 -2
- package/lib/test/unit/types/identityCodec.test.d.ts.map +0 -1
- package/lib/test/unit/types/identityCodec.test.js +0 -189
- package/lib/test/unit/types/identityCodec.test.js.map +0 -1
- package/lib/test/unit/types/ids.test.d.ts +0 -2
- package/lib/test/unit/types/ids.test.d.ts.map +0 -1
- package/lib/test/unit/types/ids.test.js +0 -86
- package/lib/test/unit/types/ids.test.js.map +0 -1
- package/lib/test/unit/types/temporalCodec.test.d.ts +0 -2
- package/lib/test/unit/types/temporalCodec.test.d.ts.map +0 -1
- package/lib/test/unit/types/temporalCodec.test.js +0 -205
- package/lib/test/unit/types/temporalCodec.test.js.map +0 -1
- package/lib/test/unit/types/temporalPolicy.test.d.ts +0 -2
- package/lib/test/unit/types/temporalPolicy.test.d.ts.map +0 -1
- package/lib/test/unit/types/temporalPolicy.test.js +0 -85
- package/lib/test/unit/types/temporalPolicy.test.js.map +0 -1
- package/lib/test/unit/types/writePolicy.test.d.ts +0 -2
- package/lib/test/unit/types/writePolicy.test.d.ts.map +0 -1
- package/lib/test/unit/types/writePolicy.test.js +0 -333
- package/lib/test/unit/types/writePolicy.test.js.map +0 -1
- package/lib/test/unit/vector/fragmentConverters.test.d.ts +0 -2
- package/lib/test/unit/vector/fragmentConverters.test.d.ts.map +0 -1
- package/lib/test/unit/vector/fragmentConverters.test.js +0 -60
- package/lib/test/unit/vector/fragmentConverters.test.js.map +0 -1
- package/lib/test/unit/vector/inMemoryCosineIndex.test.d.ts +0 -2
- package/lib/test/unit/vector/inMemoryCosineIndex.test.d.ts.map +0 -1
- package/lib/test/unit/vector/inMemoryCosineIndex.test.js +0 -254
- package/lib/test/unit/vector/inMemoryCosineIndex.test.js.map +0 -1
- package/lib/test/unit/vector/inMemoryFragmentCosineIndex.test.d.ts +0 -2
- package/lib/test/unit/vector/inMemoryFragmentCosineIndex.test.d.ts.map +0 -1
- package/lib/test/unit/vector/inMemoryFragmentCosineIndex.test.js +0 -364
- package/lib/test/unit/vector/inMemoryFragmentCosineIndex.test.js.map +0 -1
- package/lib/test/unit/vector/vectorIndex.test.d.ts +0 -2
- package/lib/test/unit/vector/vectorIndex.test.d.ts.map +0 -1
- package/lib/test/unit/vector/vectorIndex.test.js +0 -53
- package/lib/test/unit/vector/vectorIndex.test.js.map +0 -1
- package/rush-logs/ts-agent-memory.build.cache.log +0 -3
- package/rush-logs/ts-agent-memory.build.log +0 -9
- package/src/index.ts +0 -14
- package/src/packlets/converters/bodyConverterRegistry.ts +0 -105
- package/src/packlets/converters/envelopeConverter.ts +0 -233
- package/src/packlets/converters/index.ts +0 -7
- package/src/packlets/index/index.ts +0 -6
- package/src/packlets/index/memoryIndex.ts +0 -332
- package/src/packlets/ingest/cycleGuard.ts +0 -153
- package/src/packlets/ingest/hostStages.ts +0 -111
- package/src/packlets/ingest/index.ts +0 -9
- package/src/packlets/ingest/model.ts +0 -195
- package/src/packlets/ingest/orchestrator.ts +0 -968
- package/src/packlets/observe/index.ts +0 -7
- package/src/packlets/observe/memoryObservationStore.ts +0 -153
- package/src/packlets/observe/observer.ts +0 -119
- package/src/packlets/retrieve/fragmentSemanticRetriever.ts +0 -138
- package/src/packlets/retrieve/hybridRetriever.ts +0 -194
- package/src/packlets/retrieve/index.ts +0 -14
- package/src/packlets/retrieve/linkTraversalRetriever.ts +0 -158
- package/src/packlets/retrieve/recencyRetriever.ts +0 -54
- package/src/packlets/retrieve/retriever.ts +0 -291
- package/src/packlets/retrieve/semanticRetriever.ts +0 -152
- package/src/packlets/retrieve/structuredFilterRetriever.ts +0 -58
- package/src/packlets/retrieve/tagRetriever.ts +0 -58
- package/src/packlets/retrieve/temporalRetrievers.ts +0 -210
- package/src/packlets/store/fileTreeMemoryStore.ts +0 -1872
- package/src/packlets/store/index.ts +0 -7
- package/src/packlets/store/scopeEncoding.ts +0 -36
- package/src/packlets/tools/index.ts +0 -6
- package/src/packlets/tools/memoryTools.ts +0 -706
- package/src/packlets/types/envelope.ts +0 -196
- package/src/packlets/types/filenameSafety.ts +0 -57
- package/src/packlets/types/identityCodec.ts +0 -447
- package/src/packlets/types/ids.ts +0 -124
- package/src/packlets/types/index.ts +0 -11
- package/src/packlets/types/temporal.ts +0 -96
- package/src/packlets/types/writePolicy.ts +0 -612
- package/src/packlets/vector/fragmentConverters.ts +0 -55
- package/src/packlets/vector/inMemoryCosineIndex.ts +0 -196
- package/src/packlets/vector/inMemoryFragmentCosineIndex.ts +0 -289
- package/src/packlets/vector/index.ts +0 -9
- package/src/packlets/vector/vectorIndex.ts +0 -273
- package/src/test/unit/converters/antagonistRoundTrip.test.ts +0 -110
- package/src/test/unit/converters/bodyConverterRegistry.test.ts +0 -89
- package/src/test/unit/converters/envelopeConverter.test.ts +0 -418
- package/src/test/unit/index/memoryIndex.test.ts +0 -272
- package/src/test/unit/ingest/antagonistCycleAndParity.test.ts +0 -367
- package/src/test/unit/ingest/cycleGuard.test.ts +0 -110
- package/src/test/unit/ingest/dedupScope.test.ts +0 -542
- package/src/test/unit/ingest/orchestrator.test.ts +0 -1355
- package/src/test/unit/observe/memoryObservationStore.test.ts +0 -158
- package/src/test/unit/retrieve/fragmentSemanticRetriever.test.ts +0 -163
- package/src/test/unit/retrieve/linkTraversalRetriever.test.ts +0 -329
- package/src/test/unit/retrieve/retrievers.test.ts +0 -1018
- package/src/test/unit/retrieve/temporalRetrievers.test.ts +0 -226
- package/src/test/unit/store/antagonistTemporalBoundary.test.ts +0 -158
- package/src/test/unit/store/embedOnWrite.test.ts +0 -418
- package/src/test/unit/store/fileTreeMemoryStore.test.ts +0 -1041
- package/src/test/unit/store/fragmentEmbedOnWrite.test.ts +0 -349
- package/src/test/unit/store/indexInjection.test.ts +0 -550
- package/src/test/unit/store/lenientOpen.test.ts +0 -292
- package/src/test/unit/store/listScoped.test.ts +0 -138
- package/src/test/unit/store/observations.test.ts +0 -290
- package/src/test/unit/store/rankAxis.test.ts +0 -349
- package/src/test/unit/store/scopeEncoding.test.ts +0 -37
- package/src/test/unit/store/temporalStore.test.ts +0 -469
- package/src/test/unit/tools/memoryTools.test.ts +0 -1121
- package/src/test/unit/types/identityCodec.test.ts +0 -266
- package/src/test/unit/types/ids.test.ts +0 -94
- package/src/test/unit/types/temporalCodec.test.ts +0 -259
- package/src/test/unit/types/temporalPolicy.test.ts +0 -124
- package/src/test/unit/types/writePolicy.test.ts +0 -446
- package/src/test/unit/vector/fragmentConverters.test.ts +0 -80
- package/src/test/unit/vector/inMemoryCosineIndex.test.ts +0 -318
- package/src/test/unit/vector/inMemoryFragmentCosineIndex.test.ts +0 -477
- package/src/test/unit/vector/vectorIndex.test.ts +0 -64
- package/temp/build/lint/_eslint-5eVG3S6w.json +0 -306
- package/temp/build/typescript/ts_8nwakTlr.json +0 -1
- package/temp/ts-agent-memory.api.json +0 -21030
- package/temp/ts-agent-memory.api.md +0 -940
- package/tsconfig.json +0 -8
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.test.js","sourceRoot":"","sources":["../../../../src/test/unit/ingest/orchestrator.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 CONTRADICTS_LINK_TYPE,\n DEFAULT_SIMILARITY_THRESHOLD,\n DEFAULT_SIMILARITY_TOP_K,\n DedupScope,\n EntityId,\n FileTreeMemoryStore,\n HOST_INGEST_PROVENANCE_SOURCE,\n IBodyConverterRegistry,\n ICandidateEdge,\n ICandidateRecord,\n IEdgeTarget,\n IEntityResolutionCandidate,\n IEntityResolver,\n IFactExtractor,\n IIdentityCodec,\n IIngestItem,\n IIngestItemResult,\n InMemoryCosineIndex,\n IMemoryClassification,\n IMemoryClassifier,\n IMemoryEnvelope,\n IMemoryRecord,\n IMemoryRecordSource,\n IMemoryStore,\n IProvenance,\n IScopedMemoryRecord,\n IRelationContext,\n IRelationExtractor,\n IVectorIndex,\n IVectorQueryHit,\n IWritePolicy,\n Kind,\n KnowledgeIdentityCodec,\n LinkType,\n LtmIdentityCodec,\n MemoryEmbedder,\n MtmIdentityCodec,\n MemoryId,\n MemoryIngestOrchestrator,\n MemoryScopeKey,\n ResolutionVerdict,\n Tag,\n TemporalIdentityCodec,\n TemporalVersionedPolicy,\n serializeMemoryFile\n} from '../../../index';\n\n// --- kinds --------------------------------------------------------------------\nconst noteKind: Kind = 'note' as Kind;\nconst factKind: Kind = 'fact' as Kind;\nconst numKind: Kind = 'num' as Kind;\nconst orphanKind: Kind = 'orphan' as Kind;\nconst ltmKind: Kind = 'ltm' as Kind;\n\n// --- shared fixtures ----------------------------------------------------------\nlet clockValue: number;\nconst clock = (): number => clockValue;\n\nfunction mutableRoot(\n files: ReadonlyArray<{ path: string; contents: string }> = []\n): FileTree.IMutableFileTreeDirectoryItem {\n const tree = FileTree.inMemory([...files], { 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 registry(): IBodyConverterRegistry {\n const reg = BodyConverterRegistry.create().orThrow();\n reg.register(noteKind, Converters.string);\n reg.register(factKind, Converters.string);\n reg.register(numKind, Converters.number);\n reg.register(orphanKind, Converters.string);\n reg.register(ltmKind, Converters.string);\n return reg;\n}\n\nconst codecs: ReadonlyMap<Kind, IIdentityCodec> = new Map<Kind, IIdentityCodec>([\n [noteKind, new KnowledgeIdentityCodec()],\n [numKind, new KnowledgeIdentityCodec()],\n [ltmKind, new LtmIdentityCodec()],\n [factKind, TemporalIdentityCodec.create('facts').orThrow()]\n]);\n\nconst policies: ReadonlyMap<Kind, IWritePolicy> = new Map<Kind, IWritePolicy>([\n [factKind, TemporalVersionedPolicy.create().orThrow()]\n]);\n\n// A deterministic embedder keyed by body text (three-dimensional vectors so\n// cosine relationships are controllable). Unknown bodies map to a distinct axis.\nconst VECTORS: ReadonlyMap<string, ReadonlyArray<number>> = new Map<string, ReadonlyArray<number>>([\n ['apple pie', [1, 0, 0]],\n ['apple tart', [0.99, 0.14, 0]],\n ['banana bread', [0, 1, 0]]\n]);\nconst embed: MemoryEmbedder = (record) => {\n if (record.body === 'boom') {\n return Promise.resolve(fail('embed boom'));\n }\n const vec: ReadonlyArray<number> = VECTORS.get(record.body as string) ?? [0, 0, 1];\n return Promise.resolve(succeed(Float32Array.from(vec)));\n};\n\n// --- mock host stages ---------------------------------------------------------\nfunction classifier(fn: (item: IIngestItem) => Result<IMemoryClassification>): IMemoryClassifier {\n return { classify: (item) => Promise.resolve(fn(item)) };\n}\nfunction throwingClassifier(): IMemoryClassifier {\n return {\n classify: () => {\n throw new Error('classifier boom');\n }\n };\n}\nfunction extractor(\n fn: (item: IIngestItem, c: IMemoryClassification) => Result<ReadonlyArray<ICandidateRecord>>\n): IFactExtractor {\n return { extract: (item, c) => Promise.resolve(fn(item, c)) };\n}\nfunction resolver(\n fn: (\n candidate: ICandidateRecord,\n similar: ReadonlyArray<IEntityResolutionCandidate>\n ) => Result<ResolutionVerdict>\n): IEntityResolver {\n return { resolve: (candidate, similar) => Promise.resolve(fn(candidate, similar)) };\n}\nfunction relater(fn: (ctx: IRelationContext) => Result<ReadonlyArray<ICandidateEdge>>): IRelationExtractor {\n return { relate: (ctx) => Promise.resolve(fn(ctx)) };\n}\n\nconst noEdges: IRelationExtractor = relater(() => succeed([]));\nconst classifyNote: IMemoryClassifier = classifier(() => succeed({ kind: noteKind, confidence: 0.9 }));\n\n/** Extractor that emits one note candidate per item, body = item.content, entityId = item.id. */\nfunction oneNoteExtractor(): IFactExtractor {\n return extractor((item) => succeed([candidate(noteKind, item.id, item.content as string)]));\n}\n\nfunction candidate(\n kind: Kind,\n entityId: string,\n body: unknown,\n opts: {\n readonly tags?: ReadonlyArray<string>;\n readonly links?: ICandidateRecord['envelope']['links'];\n readonly provenance?: IProvenance;\n readonly temporal?: IMemoryEnvelope['temporal'];\n } = {}\n): ICandidateRecord {\n return {\n envelope: {\n entityId: entityId as EntityId,\n kind,\n tags: (opts.tags ?? []) as ReadonlyArray<Tag>,\n links: opts.links ?? [],\n provenance: opts.provenance ?? { source: 'agent' },\n ...(opts.temporal !== undefined ? { temporal: opts.temporal } : {})\n },\n body\n };\n}\n\n/**\n * A scope-qualified target, authored as `scope#id` or a bare id defaulting to the\n * knowledge scope (where the note/num fixtures live). `kt` is the assertion-side\n * spelling of the same helper.\n */\nfunction scopedTarget(spec: string): IEdgeTarget {\n const hash: number = spec.indexOf('#');\n const scope: string = hash >= 0 ? spec.slice(0, hash) : 'knowledge';\n const id: string = hash >= 0 ? spec.slice(hash + 1) : spec;\n return { scope: scope as MemoryScopeKey, id: id as MemoryId };\n}\nfunction kt(id: string, scope: string = 'knowledge'): IEdgeTarget {\n return { scope: scope as MemoryScopeKey, id: id as MemoryId };\n}\n\n/** The scope-qualified reference of a candidate about to be written, by its entityId. */\nfunction srcOf(ctx: IRelationContext, entityId: string): IEdgeTarget {\n const found = ctx.candidates.find((rc) => rc.candidate.envelope.entityId === (entityId as EntityId));\n if (found === undefined) {\n throw new Error(`test relater: no candidate with entityId '${entityId}'`);\n }\n return found.id;\n}\n\nfunction candEdge(source: string, type: string, target: string, confidence?: number): ICandidateEdge {\n return {\n source: scopedTarget(source),\n edge: {\n type: type as LinkType,\n target: scopedTarget(target),\n ...(confidence !== undefined ? { confidence } : {})\n }\n };\n}\n\ninterface IBuildParams {\n readonly files?: ReadonlyArray<{ path: string; contents: string }>;\n readonly registry?: IBodyConverterRegistry;\n readonly vectorIndex?: IVectorIndex;\n readonly embed?: MemoryEmbedder;\n}\n\nfunction buildStore(params: IBuildParams = {}): FileTreeMemoryStore {\n return FileTreeMemoryStore.create({\n root: mutableRoot(params.files),\n registry: params.registry ?? registry(),\n codecs,\n writePolicies: policies,\n clock,\n vectorIndex: params.vectorIndex,\n embed: params.embed\n }).orThrow();\n}\n\ninterface IOrchestratorParams {\n readonly store: IMemoryStore;\n readonly registry?: IBodyConverterRegistry;\n readonly classifier?: IMemoryClassifier;\n readonly extractor?: IFactExtractor;\n readonly relationExtractor?: IRelationExtractor;\n readonly entityResolver?: IEntityResolver;\n readonly vectorIndex?: IVectorIndex;\n readonly embed?: MemoryEmbedder;\n readonly similarityThreshold?: number;\n readonly cycleGuard?: 'reject' | 'off';\n}\n\nfunction buildOrchestrator(params: IOrchestratorParams): MemoryIngestOrchestrator {\n return MemoryIngestOrchestrator.create({\n store: params.store,\n registry: params.registry ?? registry(),\n codecs,\n classifier: params.classifier ?? classifyNote,\n extractor: params.extractor ?? oneNoteExtractor(),\n relationExtractor: params.relationExtractor ?? noEdges,\n entityResolver: params.entityResolver,\n vectorIndex: params.vectorIndex,\n embed: params.embed,\n similarityThreshold: params.similarityThreshold,\n cycleGuard: params.cycleGuard\n }).orThrow();\n}\n\n/** A seeded note file with only `source` provenance (the additive-provenance baseline). */\nfunction seedNote(\n id: string,\n body: string,\n provenance: Record<string, unknown> = { source: 'agent' }\n): {\n path: string;\n contents: string;\n} {\n const envelope: IMemoryEnvelope = {\n id: id as MemoryId,\n entityId: id as EntityId,\n kind: noteKind,\n tags: [],\n links: [],\n created: 1,\n updated: 1,\n seq: 4,\n contentHash: 'seed',\n provenance: provenance as unknown as IProvenance\n };\n return { path: `knowledge/${id}.md`, contents: serializeMemoryFile(envelope, body).orThrow() };\n}\n\nbeforeEach(() => {\n clockValue = 1000;\n});\n\ndescribe('MemoryIngestOrchestrator', () => {\n describe('create', () => {\n test('constructs via the factory', () => {\n expect(\n MemoryIngestOrchestrator.create({\n store: buildStore(),\n registry: registry(),\n codecs,\n classifier: classifyNote,\n extractor: oneNoteExtractor(),\n relationExtractor: noEdges\n })\n ).toSucceed();\n });\n\n test('exposes the documented similarity defaults', () => {\n expect(DEFAULT_SIMILARITY_THRESHOLD).toBe(0.85);\n expect(DEFAULT_SIMILARITY_TOP_K).toBe(5);\n });\n });\n\n describe('single-item ingest (first-class path)', () => {\n test('classifies, extracts, and writes one record end-to-end with host-ingest provenance + derivedFrom', async () => {\n const store = buildStore();\n const orch = buildOrchestrator({ store });\n const sourceId: IEdgeTarget = {\n scope: 'conversations/c1' as MemoryScopeKey,\n id: 'turn-3' as MemoryId\n };\n const result = await orch.ingestItem({ id: 'doc-1', content: 'the sky is blue', sourceId });\n expect(result).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.item.id).toBe('doc-1');\n expect(r.records).toHaveLength(1);\n const rec = r.records[0];\n expect(rec.disposition).toBe('written');\n expect(rec.resolution.verdict).toBe('new');\n expect(rec.id).toBe('doc-1');\n expect(rec.record?.envelope.provenance.source).toBe(HOST_INGEST_PROVENANCE_SOURCE);\n expect(rec.record?.envelope.provenance.derivedFrom).toEqual(sourceId);\n expect(rec.record?.body).toBe('the sky is blue');\n expect(rec.interlock).toBeUndefined();\n });\n expect(await store.get(noteKind, 'doc-1' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => {\n expect(rec?.body).toBe('the sky is blue');\n }\n );\n });\n\n test('omits derivedFrom when the item carries no sourceId', async () => {\n const store = buildStore();\n const orch = buildOrchestrator({ store });\n const result = await orch.ingestItem({ id: 'doc-1', content: 'a fact' });\n expect(result).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].record?.envelope.provenance.derivedFrom).toBeUndefined();\n expect(r.records[0].record?.envelope.provenance.source).toBe(HOST_INGEST_PROVENANCE_SOURCE);\n });\n });\n\n test('yields an empty record set when the extractor finds nothing memorable', async () => {\n const store = buildStore();\n const orch = buildOrchestrator({ store, extractor: extractor(() => succeed([])) });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'noise' })).toSucceedAndSatisfy(\n (r: IIngestItemResult) => {\n expect(r.records).toEqual([]);\n }\n );\n });\n });\n\n describe('host-stage failures abort loudly', () => {\n test('classifier failure', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n classifier: classifier(() => fail('cannot classify'))\n });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(/cannot classify/);\n });\n\n test('classifier throw is captured as a failure', async () => {\n const orch = buildOrchestrator({ store: buildStore(), classifier: throwingClassifier() });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(\n /classify threw.*classifier boom/\n );\n });\n\n test('extractor failure', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => fail('extract error'))\n });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(/extract error/);\n });\n\n test('relation-extractor failure', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n relationExtractor: relater(() => fail('relate error'))\n });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(/relate error/);\n });\n });\n\n describe('stage 3b — typed validation boundary', () => {\n test('rejects a candidate whose body fails the kind converter', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-1', 42)]))\n });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(\n /candidate body for kind 'note' is invalid/\n );\n });\n\n test('rejects a non-string body even when the converter accepts it', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => succeed([candidate(numKind, 'n-1', 42)]))\n });\n expect(await orch.ingestItem({ id: 'n-1', content: 'x' })).toFailWith(/must be a string/);\n });\n\n test('fails when no identity codec is registered for the candidate kind', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => succeed([candidate(orphanKind, 'o-1', 'body')]))\n });\n expect(await orch.ingestItem({ id: 'o-1', content: 'x' })).toFailWith(/no identity codec/);\n });\n\n test('fails loudly when a pre-existing snapshot record cannot be scoped (no codec for its kind)', async () => {\n // The store can persist a note (it has the note codec), but the orchestrator\n // below is wired WITHOUT a note codec — so when it snapshots the store to run\n // the edge path, it cannot resolve the seeded note's scope and fails loudly\n // (never silently drops it from the cycle graph). This is the branch the\n // scope-qualified edge change added.\n const store = buildStore();\n await putNote(store, 'legacy', 'anchor');\n const orch = MemoryIngestOrchestrator.create({\n store,\n registry: registry(),\n // Deliberately omit the note codec (and any default) that the seeded record needs.\n codecs: new Map<Kind, IIdentityCodec>([[numKind, new KnowledgeIdentityCodec()]]),\n classifier: classifier(() => succeed({ kind: numKind })),\n extractor: extractor(() => succeed([candidate(numKind, 'n-1', 7)])),\n relationExtractor: noEdges\n }).orThrow();\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /cannot resolve scope for stored record 'legacy'.*no identity codec registered for kind 'note'/i\n );\n });\n });\n\n describe('stage 4 — exact dedup (layer 1)', () => {\n test('an exact {kind,body} match in scope is duplicate-of (no resolver)', async () => {\n const store = buildStore({ files: [seedNote('doc-a', 'hello')] });\n const orch = buildOrchestrator({\n store,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'hello')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('deduped');\n expect(r.records[0].resolution).toEqual({ verdict: 'duplicate-of', target: kt('doc-a') });\n expect(r.records[0].id).toBe('doc-a');\n });\n // doc-b was never written.\n expect(await store.get(noteKind, 'doc-b' as EntityId)).toSucceedWith(undefined);\n });\n\n test('exact dedup takes precedence over the resolver (resolver never called)', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ files: [seedNote('doc-a', 'hello')] });\n const orch = buildOrchestrator({\n store,\n entityResolver: resolver(() => fail('resolver must not be called')),\n vectorIndex,\n embed,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'hello')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('deduped');\n });\n });\n\n test('a distinct body is a fresh write (no resolver → exact-only fall-back)', async () => {\n const store = buildStore({ files: [seedNote('doc-a', 'hello')] });\n const orch = buildOrchestrator({\n store,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'goodbye')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('written');\n expect(r.records[0].resolution.verdict).toBe('new');\n });\n });\n });\n});\n\n// --- similarity + resolver fixtures ------------------------------------------\nconst classifyFact: IMemoryClassifier = classifier(() => succeed({ kind: factKind }));\nfunction oneFactExtractor(): IFactExtractor {\n return extractor((item) => succeed([candidate(factKind, item.id, item.content as string)]));\n}\n\nasync function putNote(store: FileTreeMemoryStore, id: string, body: string): Promise<void> {\n const rec: IMemoryRecord<unknown> = {\n envelope: {\n id: id as MemoryId,\n entityId: id as EntityId,\n kind: noteKind,\n tags: [],\n links: [],\n created: 0,\n updated: 0,\n seq: 0,\n contentHash: '',\n provenance: { source: 'agent' }\n },\n body\n };\n (await store.put(rec)).orThrow();\n}\n\nfunction mockStore(overrides: Partial<IMemoryStore>): IMemoryStore {\n return {\n get:\n overrides.get ??\n ((): Promise<Result<IMemoryRecord<unknown> | undefined>> => Promise.resolve(succeed(undefined))),\n getById:\n overrides.getById ??\n ((): Promise<Result<IMemoryRecord<unknown> | undefined>> => Promise.resolve(succeed(undefined))),\n list:\n overrides.list ??\n ((): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>> => Promise.resolve(succeed([]))),\n listScoped:\n overrides.listScoped ??\n ((): Promise<Result<ReadonlyArray<IScopedMemoryRecord>>> => Promise.resolve(succeed([]))),\n // Mirrors the store's default policy (KnowledgeLwwPolicy → 'content'), so a\n // mock store keeps the pre-accessor layer-1 behavior unless a test overrides it.\n dedupScopeFor: overrides.dedupScopeFor ?? ((): DedupScope => 'content'),\n asRecordSource:\n overrides.asRecordSource ??\n ((): IMemoryRecordSource => ({\n list: (): Promise<Result<ReadonlyArray<IScopedMemoryRecord>>> => Promise.resolve(succeed([]))\n })),\n put: overrides.put ?? ((r): Promise<Result<IMemoryRecord<unknown>>> => Promise.resolve(succeed(r))),\n delete: overrides.delete ?? ((): Promise<Result<MemoryId>> => Promise.resolve(fail('n/a')))\n };\n}\n\ndescribe('MemoryIngestOrchestrator — stage 4 similarity (layer 2)', () => {\n test('resolver verdict new writes the candidate despite a near-duplicate', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'new' })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('written');\n expect(r.records[0].resolution.verdict).toBe('new');\n });\n });\n\n test('resolver verdict duplicate-of dedups against the surfaced neighbor', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) =>\n succeed({ verdict: 'duplicate-of', target: similar[0].target })\n ),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('deduped');\n expect(r.records[0].id).toBe('doc-a');\n });\n expect(await store.get(noteKind, 'doc-b' as EntityId)).toSucceedWith(undefined);\n });\n\n test('resolver verdict supersede writes the candidate and records the superseded target', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) =>\n succeed({ verdict: 'supersede', target: similar[0].target })\n ),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('written');\n expect(r.records[0].resolution).toEqual({ verdict: 'supersede', target: kt('doc-a') });\n expect(r.records[0].id).toBe('doc-b');\n });\n expect(await store.get(noteKind, 'doc-b' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => expect(rec?.body).toBe('apple tart')\n );\n });\n\n test('resolver verdict merge-into re-addresses the write to the target entity', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) =>\n succeed({ verdict: 'merge-into', target: similar[0].target })\n ),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('merged');\n expect(r.records[0].id).toBe('doc-a');\n });\n // The merge updated doc-a's body (LWW merge patch) and never minted doc-b.\n expect(await store.get(noteKind, 'doc-a' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => expect(rec?.body).toBe('apple tart')\n );\n expect(await store.get(noteKind, 'doc-b' as EntityId)).toSucceedWith(undefined);\n });\n\n test('merge-into with a non-existent target fails loudly', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'merge-into', target: kt('ghost') })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /merge-into target 'knowledge\\/ghost' does not exist/\n );\n });\n\n test('a below-threshold neighbor is not surfaced (resolver not called)', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => fail('resolver must not be called')),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'banana bread')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].resolution.verdict).toBe('new');\n });\n });\n\n test('the candidate self-hit is excluded from surfaced neighbors', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => fail('resolver must not be called')),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-a', 'apple tart')]))\n });\n // Re-ingesting the SAME entity: its own prior vector is the only over-threshold\n // hit, and it is skipped as the self-hit, so no resolver dispatch occurs.\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].resolution.verdict).toBe('new');\n expect(r.records[0].disposition).toBe('written');\n });\n });\n\n test('a surfaced hit with no backing record is skipped', async () => {\n const ghostIndex: IVectorIndex = {\n add: (t) => Promise.resolve(succeed(t.id as string)),\n remove: (t) => Promise.resolve(succeed(t)),\n query: (): Promise<Result<ReadonlyArray<IVectorQueryHit>>> =>\n Promise.resolve(succeed([{ target: kt('ghost'), score: 0.99 }]))\n };\n const orch = buildOrchestrator({\n store: buildStore(),\n vectorIndex: ghostIndex,\n embed,\n entityResolver: resolver(() => fail('resolver must not be called')),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].resolution.verdict).toBe('new');\n });\n });\n\n test('an embedder failure surfaces loudly', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const orch = buildOrchestrator({\n store: buildStore(),\n vectorIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'new' })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'boom')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(/embed boom/);\n });\n\n test('a similarity-query failure surfaces loudly', async () => {\n const failingIndex: IVectorIndex = {\n add: (t) => Promise.resolve(succeed(t.id as string)),\n remove: (t) => Promise.resolve(succeed(t)),\n query: (): Promise<Result<ReadonlyArray<IVectorQueryHit>>> => Promise.resolve(fail('query kaput'))\n };\n const orch = buildOrchestrator({\n store: buildStore(),\n vectorIndex: failingIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'new' })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(/query kaput/);\n });\n\n test('a custom similarityThreshold gates the resolver dispatch', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n similarityThreshold: 0.999, // 0.99 neighbor now falls below threshold\n entityResolver: resolver(() => fail('resolver must not be called')),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].resolution.verdict).toBe('new');\n });\n });\n});\n\ndescribe('MemoryIngestOrchestrator — layer-2 wiring gates (exact-only fall-back)', () => {\n const failResolver: IEntityResolver = resolver(() => fail('resolver must not be called'));\n const almostSimilar = extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]));\n\n test('no resolver → exact-only', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({ store, vectorIndex, embed, extractor: almostSimilar });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) =>\n expect(r.records[0].resolution.verdict).toBe('new')\n );\n });\n\n test('resolver + embed but no vector index → exact-only', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n embed,\n entityResolver: failResolver,\n extractor: almostSimilar\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) =>\n expect(r.records[0].resolution.verdict).toBe('new')\n );\n });\n\n test('resolver + vector index but no embedder → exact-only', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const orch = buildOrchestrator({\n store: buildStore(),\n vectorIndex,\n entityResolver: failResolver,\n extractor: almostSimilar\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) =>\n expect(r.records[0].resolution.verdict).toBe('new')\n );\n });\n});\n\ndescribe('MemoryIngestOrchestrator — stage 5 relate + cycle guard', () => {\n test('attaches a valid edge to an existing record', async () => {\n const store = buildStore();\n await putNote(store, 'doc-a', 'anchor');\n const orch = buildOrchestrator({\n store,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'goodbye')])),\n relationExtractor: relater(() => succeed([candEdge('doc-b', 'mentions', 'doc-a', 0.7)]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].edges).toHaveLength(1);\n expect(r.records[0].record?.envelope.links).toEqual([\n { type: 'mentions', target: kt('doc-a'), confidence: 0.7 }\n ]);\n });\n });\n\n test('attaches an edge between two sibling candidates', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() =>\n succeed([candidate(noteKind, 'doc-b', 'first'), candidate(noteKind, 'doc-c', 'second')])\n ),\n relationExtractor: relater(() => succeed([candEdge('doc-b', 'rel', 'doc-c')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records).toHaveLength(2);\n expect(r.records[0].record?.envelope.links).toEqual([{ type: 'rel', target: kt('doc-c') }]);\n expect(r.records[1].edges).toEqual([]);\n });\n });\n\n test('rejects an edge whose source is not a candidate being written', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'x')])),\n relationExtractor: relater(() => succeed([candEdge('ghost', 'rel', 'doc-b')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /edge source 'knowledge\\/ghost' is not a candidate being written/\n );\n });\n\n test('rejects an edge whose target resolves to nothing', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'x')])),\n relationExtractor: relater(() => succeed([candEdge('doc-b', 'rel', 'ghost')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /edge target 'knowledge\\/ghost' resolves to neither/\n );\n });\n\n test('rejects a cycle-inducing edge (default guard)', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() =>\n succeed([candidate(noteKind, 'doc-b', 'first'), candidate(noteKind, 'doc-c', 'second')])\n ),\n relationExtractor: relater(() =>\n succeed([candEdge('doc-b', 'rel', 'doc-c'), candEdge('doc-c', 'rel', 'doc-b')])\n )\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(/would create a cycle/);\n });\n\n test('cycleGuard \"off\" admits an otherwise-cyclic edge set', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n cycleGuard: 'off',\n extractor: extractor(() =>\n succeed([candidate(noteKind, 'doc-b', 'first'), candidate(noteKind, 'doc-c', 'second')])\n ),\n relationExtractor: relater(() =>\n succeed([candEdge('doc-b', 'rel', 'doc-c'), candEdge('doc-c', 'rel', 'doc-b')])\n )\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].record?.envelope.links).toEqual([{ type: 'rel', target: kt('doc-c') }]);\n expect(r.records[1].record?.envelope.links).toEqual([{ type: 'rel', target: kt('doc-b') }]);\n });\n });\n\n test('a contradicts edge on a NON-temporal kind persists as a plain link (no interlock)', async () => {\n const store = buildStore();\n await putNote(store, 'doc-a', 'anchor');\n const orch = buildOrchestrator({\n store,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'goodbye')])),\n relationExtractor: relater(() => succeed([candEdge('doc-b', 'contradicts', 'doc-a')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].interlock).toBeUndefined();\n expect(r.records[0].record?.envelope.links).toEqual([{ type: 'contradicts', target: kt('doc-a') }]);\n });\n });\n\n describe('_validateEdges cross-scope target disambiguation', () => {\n // Two EXISTING records share the idStem 'turn-3' across two conversations\n // (the MTM codec mints per-scope stems). A stage-5 edge target must resolve\n // to the CORRECT (scope, id) — with bare-id keying both would alias and a\n // wrong-scope target would silently validate. Guards the ingest-validation seam.\n const mtmKind: Kind = 'mtm' as Kind;\n\n function mtmRegistry(): IBodyConverterRegistry {\n const reg = registry();\n reg.register(mtmKind, Converters.string);\n return reg;\n }\n\n const mtmCodecs: ReadonlyMap<Kind, IIdentityCodec> = new Map<Kind, IIdentityCodec>([\n [mtmKind, new MtmIdentityCodec()]\n ]);\n\n async function seedTurn(store: FileTreeMemoryStore, entityId: string, body: string): Promise<void> {\n const addr = new MtmIdentityCodec().encode(entityId as EntityId).orThrow();\n const rec: IMemoryRecord<unknown> = {\n envelope: {\n id: addr.idStem as MemoryId,\n entityId: entityId as EntityId,\n kind: mtmKind,\n tags: [],\n links: [],\n created: 0,\n updated: 0,\n seq: 0,\n contentHash: '',\n provenance: { source: 'agent' }\n },\n body\n };\n (await store.put(rec)).orThrow();\n }\n\n function buildMtmOrchestrator(\n store: FileTreeMemoryStore,\n relationExtractor: IRelationExtractor\n ): MemoryIngestOrchestrator {\n return MemoryIngestOrchestrator.create({\n store,\n registry: mtmRegistry(),\n codecs: mtmCodecs,\n classifier: classifier(() => succeed({ kind: mtmKind })),\n // The candidate is a fresh turn-5 under conv-a (distinct stem from the seeds).\n extractor: extractor(() => succeed([candidate(mtmKind, 'conv-a:5', 'a new turn')])),\n relationExtractor\n }).orThrow();\n }\n\n async function seededStore(): Promise<FileTreeMemoryStore> {\n const store = FileTreeMemoryStore.create({\n root: mutableRoot(),\n registry: mtmRegistry(),\n codecs: mtmCodecs,\n clock\n }).orThrow();\n await seedTurn(store, 'conv-a:3', 'anchor in conversation a');\n await seedTurn(store, 'conv-b:3', 'anchor in conversation b');\n return store;\n }\n\n test('accepts a same-stem edge target that resolves to the correct scope', async () => {\n const store = await seededStore();\n const orch = buildMtmOrchestrator(\n store,\n relater((ctx) =>\n succeed([\n {\n source: srcOf(ctx, 'conv-a:5'),\n edge: { type: 'rel' as LinkType, target: kt('turn-3', 'conversations/conv-a') }\n }\n ])\n )\n );\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].record?.envelope.links).toEqual([\n { type: 'rel', target: kt('turn-3', 'conversations/conv-a') }\n ]);\n });\n });\n\n test('rejects a same-stem edge target whose scope has no matching record', async () => {\n const store = await seededStore();\n const orch = buildMtmOrchestrator(\n store,\n relater((ctx) =>\n succeed([\n {\n source: srcOf(ctx, 'conv-a:5'),\n // turn-3 exists under conv-a and conv-b, but NOT conv-z.\n edge: { type: 'rel' as LinkType, target: kt('turn-3', 'conversations/conv-z') }\n }\n ])\n )\n );\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /edge target 'conversations\\/conv-z\\/turn-3' resolves to neither a sibling candidate nor an existing record/\n );\n });\n });\n});\n\ndescribe('MemoryIngestOrchestrator — contradicts→temporal interlock', () => {\n test('a contradicts edge on a temporal kind invalidates the prior version and writes a new one', async () => {\n const store = buildStore();\n const firstOrch = buildOrchestrator({\n store,\n classifier: classifyFact,\n extractor: oneFactExtractor()\n });\n clockValue = 1000;\n const first = await firstOrch.ingestItem({ id: 'fact-1', content: 'the sky is blue' });\n const v1Id: MemoryId = first.orThrow().records[0].id;\n expect(v1Id).toBe('fact-1-v1');\n\n clockValue = 2000;\n const secondOrch = buildOrchestrator({\n store,\n classifier: classifyFact,\n extractor: extractor(() => succeed([candidate(factKind, 'fact-1', 'the sky is grey')])),\n relationExtractor: relater((ctx) =>\n succeed([\n {\n source: srcOf(ctx, 'fact-1'),\n edge: { type: CONTRADICTS_LINK_TYPE, target: kt(v1Id, 'facts/entities/fact-1') }\n }\n ])\n )\n });\n expect(await secondOrch.ingestItem({ id: 'fact-1', content: 'the sky is grey' })).toSucceedAndSatisfy(\n (r: IIngestItemResult) => {\n expect(r.records[0].interlock).toBe('temporal-versioned');\n expect(r.records[0].disposition).toBe('written');\n expect(r.records[0].record?.envelope.links).toEqual([\n { type: CONTRADICTS_LINK_TYPE, target: kt(v1Id, 'facts/entities/fact-1') }\n ]);\n }\n );\n\n // The current version is the new (contradicting) one.\n expect(await store.get(factKind, 'fact-1' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => expect(rec?.body).toBe('the sky is grey')\n );\n // The prior version is invalidated (invalidate-don't-delete).\n expect(await store.list()).toSucceedAndSatisfy((all: ReadonlyArray<IMemoryRecord<unknown>>) => {\n const v1 = all.find((rec) => rec.envelope.id === v1Id);\n expect(v1?.envelope.temporal?.invalid_at).toBe(2000);\n });\n });\n\n test('an invalidated version does not exact-dedup a later candidate that repeats its body', async () => {\n const store = buildStore();\n clockValue = 1000;\n const o1 = buildOrchestrator({ store, classifier: classifyFact, extractor: oneFactExtractor() });\n const first = await o1.ingestItem({ id: 'fact-1', content: 'blue' });\n const v1Id: MemoryId = first.orThrow().records[0].id;\n\n clockValue = 2000;\n const o2 = buildOrchestrator({\n store,\n classifier: classifyFact,\n extractor: extractor(() => succeed([candidate(factKind, 'fact-1', 'grey')])),\n relationExtractor: relater((ctx) =>\n succeed([\n {\n source: srcOf(ctx, 'fact-1'),\n edge: { type: CONTRADICTS_LINK_TYPE, target: kt(v1Id, 'facts/entities/fact-1') }\n }\n ])\n )\n });\n (await o2.ingestItem({ id: 'fact-1', content: 'grey' })).orThrow();\n\n // Re-introduce the ORIGINAL body: the invalidated v1 must be skipped by exact\n // dedup, so this is a NEW version, not a duplicate-of.\n clockValue = 3000;\n const o3 = buildOrchestrator({\n store,\n classifier: classifyFact,\n extractor: extractor(() => succeed([candidate(factKind, 'fact-1', 'blue')]))\n });\n expect(await o3.ingestItem({ id: 'fact-1', content: 'blue' })).toSucceedAndSatisfy(\n (r: IIngestItemResult) => {\n expect(r.records[0].resolution.verdict).toBe('new');\n expect(r.records[0].disposition).toBe('written');\n }\n );\n });\n});\n\ndescribe('MemoryIngestOrchestrator — additive-provenance non-regression', () => {\n test('a pre-existing record with only source provenance still loads and validates unchanged', async () => {\n const store = buildStore({ files: [seedNote('legacy', 'old note', { source: 'human' })] });\n // Loads at construction time.\n expect(await store.getById('knowledge' as MemoryScopeKey, 'legacy' as MemoryId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => {\n expect(rec?.envelope.provenance).toEqual({ source: 'human' });\n expect(rec?.envelope.provenance.by).toBeUndefined();\n expect(rec?.envelope.provenance.derivedFrom).toBeUndefined();\n }\n );\n // An unrelated ingest does not disturb it.\n const orch = buildOrchestrator({ store });\n (await orch.ingestItem({ id: 'fresh', content: 'new content' })).orThrow();\n expect(await store.getById('knowledge' as MemoryScopeKey, 'legacy' as MemoryId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => {\n expect(rec?.envelope.provenance).toEqual({ source: 'human' });\n }\n );\n });\n});\n\ndescribe('MemoryIngestOrchestrator — ingestBatch', () => {\n test('ingests a batch in order', async () => {\n const store = buildStore();\n const orch = buildOrchestrator({ store });\n const result = await orch.ingestBatch([\n { id: 'doc-1', content: 'one' },\n { id: 'doc-2', content: 'two' }\n ]);\n expect(result).toSucceedAndSatisfy((results: ReadonlyArray<IIngestItemResult>) => {\n expect(results).toHaveLength(2);\n expect(results.map((r) => r.item.id)).toEqual(['doc-1', 'doc-2']);\n expect(results.every((r) => r.records[0].disposition === 'written')).toBe(true);\n });\n });\n\n test('aborts the batch on the first item failure', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n classifier: classifier((item) =>\n item.id === 'bad' ? fail('classify bad') : succeed({ kind: noteKind })\n )\n });\n expect(\n await orch.ingestBatch([\n { id: 'bad', content: 'one' },\n { id: 'doc-2', content: 'two' }\n ])\n ).toFailWith(/classify bad/);\n });\n});\n\ndescribe('MemoryIngestOrchestrator — store failure paths', () => {\n test('a store snapshot (list) failure aborts the item', async () => {\n const store = mockStore({ list: () => Promise.resolve(fail('list down')) });\n const orch = buildOrchestrator({ store });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(\n /failed to snapshot store.*list down/\n );\n });\n\n test('a store put failure surfaces as a write failure', async () => {\n const store = mockStore({ put: () => Promise.resolve(fail('put kaput')) });\n const orch = buildOrchestrator({ store });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(/write failed.*put kaput/);\n });\n});\n\ndescribe('MemoryIngestOrchestrator — optional constructor params', () => {\n test('falls back to defaultCodec when no per-kind codec map is supplied', async () => {\n const store = buildStore();\n const orch = MemoryIngestOrchestrator.create({\n store,\n registry: registry(),\n defaultCodec: new KnowledgeIdentityCodec(),\n classifier: classifyNote,\n extractor: oneNoteExtractor(),\n relationExtractor: noEdges\n }).orThrow();\n expect(await orch.ingestItem({ id: 'doc-1', content: 'hello' })).toSucceedAndSatisfy(\n (r: IIngestItemResult) => expect(r.records[0].disposition).toBe('written')\n );\n });\n\n test('honors an explicit similarityTopK and logs a captured host throw to the supplied logger', async () => {\n const logger = new Logging.InMemoryLogger('detail');\n const orch = MemoryIngestOrchestrator.create({\n store: buildStore(),\n registry: registry(),\n codecs,\n classifier: throwingClassifier(),\n extractor: oneNoteExtractor(),\n relationExtractor: noEdges,\n similarityTopK: 3,\n logger\n }).orThrow();\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(/classifier boom/);\n expect(logger.logged.some((m) => /classifier boom/.test(m))).toBe(true);\n });\n});\n\ndescribe('MemoryIngestOrchestrator — review-punch-list fixes', () => {\n test('a stored record with a non-string body fails the exact-dedup pass loudly', async () => {\n const weird: IMemoryRecord<unknown> = {\n envelope: {\n id: 'weird' as MemoryId,\n entityId: 'weird' as EntityId,\n kind: noteKind,\n tags: [],\n links: [],\n created: 0,\n updated: 0,\n seq: 0,\n contentHash: '',\n provenance: { source: 'agent' }\n },\n body: 42\n };\n const store = mockStore({ list: () => Promise.resolve(succeed([weird])) });\n const orch = buildOrchestrator({ store });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'hello' })).toFailWith(\n /stored record 'weird' has a non-string body/\n );\n });\n\n test('duplicate stage-5 edges are deduped on the written record', async () => {\n const store = buildStore();\n await putNote(store, 'doc-a', 'anchor');\n const orch = buildOrchestrator({\n store,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'goodbye')])),\n relationExtractor: relater(() =>\n succeed([candEdge('doc-b', 'rel', 'doc-a'), candEdge('doc-b', 'rel', 'doc-a')])\n )\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].record?.envelope.links).toEqual([{ type: 'rel', target: kt('doc-a') }]);\n });\n });\n\n test('two candidates merging into the same target do not duplicate a shared edge', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n await putNote(store, 'doc-x', 'target');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) =>\n succeed({ verdict: 'merge-into', target: similar[0].target })\n ),\n extractor: extractor(() =>\n succeed([candidate(noteKind, 'doc-b', 'apple tart'), candidate(noteKind, 'doc-c', 'apple tart')])\n ),\n relationExtractor: relater(() => succeed([candEdge('doc-a', 'rel', 'doc-x')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceed();\n expect(await store.get(noteKind, 'doc-a' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => {\n expect(rec?.envelope.links).toEqual([{ type: 'rel', target: kt('doc-x') }]);\n }\n );\n });\n});\n\ndescribe('MemoryIngestOrchestrator — merge-into safety (second review)', () => {\n // Seed a record with pre-existing tags + links under a flat codec (id === entityId).\n async function putFull(\n store: FileTreeMemoryStore,\n kind: Kind,\n entityId: string,\n body: string,\n opts: { tags?: ReadonlyArray<string>; links?: IMemoryEnvelope['links'] } = {}\n ): Promise<void> {\n const rec: IMemoryRecord<unknown> = {\n envelope: {\n id: entityId as MemoryId,\n entityId: entityId as EntityId,\n kind,\n tags: (opts.tags ?? []) as ReadonlyArray<Tag>,\n links: opts.links ?? [],\n created: 0,\n updated: 0,\n seq: 0,\n contentHash: '',\n provenance: { source: 'agent' }\n },\n body\n };\n (await store.put(rec)).orThrow();\n }\n\n test('merge-into UNIONs the target’s existing tags + links (never overwrites them)', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putFull(store, noteKind, 'doc-a', 'apple pie', {\n tags: ['old-tag'],\n links: [{ type: 'existing' as LinkType, target: kt('doc-z') }]\n });\n await putFull(store, noteKind, 'doc-x', 'target of stage-5');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) =>\n succeed({ verdict: 'merge-into', target: similar[0].target })\n ),\n extractor: extractor(() =>\n succeed([\n candidate(noteKind, 'doc-b', 'apple tart', {\n tags: ['new-tag'],\n links: [{ type: 'candlink' as LinkType, target: kt('doc-z') }]\n })\n ])\n ),\n relationExtractor: relater(() => succeed([candEdge('doc-a', 'stage5', 'doc-x')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('merged');\n });\n expect(await store.get(noteKind, 'doc-a' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => {\n // Original tag preserved AND the candidate's tag gained, each once.\n expect([...(rec?.envelope.tags ?? [])].sort()).toEqual(['new-tag', 'old-tag']);\n // Original link + candidate link + stage-5 edge, each exactly once.\n expect(rec?.envelope.links).toEqual([\n { type: 'existing', target: kt('doc-z') },\n { type: 'candlink', target: kt('doc-z') },\n { type: 'stage5', target: kt('doc-x') }\n ]);\n }\n );\n });\n\n test('merge-into a different-kind target fails loudly', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n // A DIFFERENT-kind (ltm) record embedded so it surfaces as a neighbor of a note candidate.\n await putFull(store, ltmKind, 'conv-1', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) =>\n succeed({ verdict: 'merge-into', target: similar[0].target })\n ),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /merge-into target 'conversations\\/conv-1' is kind 'ltm' but the candidate is kind 'note'/\n );\n });\n\n test('supersede with a non-existent target fails loudly', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putFull(store, noteKind, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'supersede', target: kt('ghost') })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /supersede target 'knowledge\\/ghost' does not exist/\n );\n });\n\n test('duplicate-of with a non-existent target fails loudly', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putFull(store, noteKind, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'duplicate-of', target: kt('ghost') })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /duplicate-of target 'knowledge\\/ghost' does not exist/\n );\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memoryObservationStore.test.d.ts","sourceRoot":"","sources":["../../../../src/test/unit/observe/memoryObservationStore.test.ts"],"names":[],"mappings":"AAKA,OAAO,oBAAoB,CAAC"}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
* Copyright (c) 2026 Erik Fortune
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
require("@fgv/ts-utils-jest");
|
|
8
|
-
const index_1 = require("../../../index");
|
|
9
|
-
function obs(spec) {
|
|
10
|
-
var _a, _b, _c;
|
|
11
|
-
return {
|
|
12
|
-
seq: spec.seq,
|
|
13
|
-
timestamp: (_a = spec.timestamp) !== null && _a !== void 0 ? _a : spec.seq,
|
|
14
|
-
phase: (_b = spec.phase) !== null && _b !== void 0 ? _b : 'write',
|
|
15
|
-
scope: spec.scope === undefined ? undefined : spec.scope,
|
|
16
|
-
kind: spec.kind === undefined ? undefined : spec.kind,
|
|
17
|
-
id: spec.id === undefined ? undefined : spec.id,
|
|
18
|
-
outcome: (_c = spec.outcome) !== null && _c !== void 0 ? _c : 'success'
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
function seqs(records) {
|
|
22
|
-
return records.map((r) => r.seq);
|
|
23
|
-
}
|
|
24
|
-
describe('MemoryObservationStore', () => {
|
|
25
|
-
describe('create', () => {
|
|
26
|
-
test('builds with defaults', () => {
|
|
27
|
-
expect(index_1.MemoryObservationStore.create()).toSucceedAndSatisfy((store) => {
|
|
28
|
-
expect(store.size).toBe(0);
|
|
29
|
-
expect(store.lastSeq).toBe(0);
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
test('rejects a non-positive-integer maxRecords', () => {
|
|
33
|
-
expect(index_1.MemoryObservationStore.create({ maxRecords: 0 })).toFailWith(/positive integer/i);
|
|
34
|
-
expect(index_1.MemoryObservationStore.create({ maxRecords: 2.5 })).toFailWith(/positive integer/i);
|
|
35
|
-
expect(index_1.MemoryObservationStore.create({ maxRecords: -1 })).toFailWith(/positive integer/i);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
describe('observe', () => {
|
|
39
|
-
test('retains records and tracks size + lastSeq', async () => {
|
|
40
|
-
const store = index_1.MemoryObservationStore.create().orThrow();
|
|
41
|
-
expect(await store.observe(obs({ seq: 1 }))).toSucceed();
|
|
42
|
-
expect(await store.observe(obs({ seq: 2 }))).toSucceed();
|
|
43
|
-
expect(store.size).toBe(2);
|
|
44
|
-
expect(store.lastSeq).toBe(2);
|
|
45
|
-
});
|
|
46
|
-
test('evicts the oldest beyond maxRecords, preserving lastSeq', async () => {
|
|
47
|
-
const store = index_1.MemoryObservationStore.create({ maxRecords: 2 }).orThrow();
|
|
48
|
-
await store.observe(obs({ seq: 1 }));
|
|
49
|
-
await store.observe(obs({ seq: 2 }));
|
|
50
|
-
await store.observe(obs({ seq: 3 }));
|
|
51
|
-
expect(store.size).toBe(2);
|
|
52
|
-
expect(store.lastSeq).toBe(3);
|
|
53
|
-
expect(seqs(store.query())).toEqual([2, 3]);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
describe('query', () => {
|
|
57
|
-
let store;
|
|
58
|
-
beforeEach(async () => {
|
|
59
|
-
store = index_1.MemoryObservationStore.create().orThrow();
|
|
60
|
-
await store.observe(obs({
|
|
61
|
-
seq: 1,
|
|
62
|
-
timestamp: 100,
|
|
63
|
-
phase: 'write',
|
|
64
|
-
scope: 'knowledge',
|
|
65
|
-
kind: 'knowledge',
|
|
66
|
-
outcome: 'success'
|
|
67
|
-
}));
|
|
68
|
-
await store.observe(obs({
|
|
69
|
-
seq: 2,
|
|
70
|
-
timestamp: 200,
|
|
71
|
-
phase: 'read',
|
|
72
|
-
scope: 'knowledge',
|
|
73
|
-
kind: 'knowledge',
|
|
74
|
-
outcome: 'failure'
|
|
75
|
-
}));
|
|
76
|
-
await store.observe(obs({ seq: 3, timestamp: 300, phase: 'delete', scope: 'other', kind: 'note', outcome: 'success' }));
|
|
77
|
-
});
|
|
78
|
-
test('returns all records oldest-first with no criteria', () => {
|
|
79
|
-
expect(seqs(store.query())).toEqual([1, 2, 3]);
|
|
80
|
-
});
|
|
81
|
-
test('pages by sinceSeq', () => {
|
|
82
|
-
expect(seqs(store.query({ sinceSeq: 1 }))).toEqual([2, 3]);
|
|
83
|
-
});
|
|
84
|
-
test('limits to the most-recent N', () => {
|
|
85
|
-
expect(seqs(store.query({ limit: 2 }))).toEqual([2, 3]);
|
|
86
|
-
});
|
|
87
|
-
test('filters by timestamp window', () => {
|
|
88
|
-
expect(seqs(store.query({ since: 200 }))).toEqual([2, 3]);
|
|
89
|
-
expect(seqs(store.query({ until: 200 }))).toEqual([1, 2]);
|
|
90
|
-
expect(seqs(store.query({ since: 150, until: 250 }))).toEqual([2]);
|
|
91
|
-
});
|
|
92
|
-
test('filters by scope', () => {
|
|
93
|
-
expect(seqs(store.query({ scope: 'knowledge' }))).toEqual([1, 2]);
|
|
94
|
-
});
|
|
95
|
-
test('filters by kind', () => {
|
|
96
|
-
expect(seqs(store.query({ kind: 'note' }))).toEqual([3]);
|
|
97
|
-
});
|
|
98
|
-
test('filters by phase', () => {
|
|
99
|
-
expect(seqs(store.query({ phase: 'read' }))).toEqual([2]);
|
|
100
|
-
});
|
|
101
|
-
test('filters by outcome', () => {
|
|
102
|
-
expect(seqs(store.query({ outcome: 'failure' }))).toEqual([2]);
|
|
103
|
-
});
|
|
104
|
-
test('combines criteria with AND', () => {
|
|
105
|
-
expect(seqs(store.query({ scope: 'knowledge', outcome: 'success' }))).toEqual([1]);
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
describe('clear', () => {
|
|
109
|
-
test('drops records but preserves lastSeq as a cursor floor', async () => {
|
|
110
|
-
const store = index_1.MemoryObservationStore.create().orThrow();
|
|
111
|
-
await store.observe(obs({ seq: 1 }));
|
|
112
|
-
await store.observe(obs({ seq: 2 }));
|
|
113
|
-
store.clear();
|
|
114
|
-
expect(store.size).toBe(0);
|
|
115
|
-
expect(store.lastSeq).toBe(2);
|
|
116
|
-
expect(store.query()).toEqual([]);
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
//# sourceMappingURL=memoryObservationStore.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memoryObservationStore.test.js","sourceRoot":"","sources":["../../../../src/test/unit/observe/memoryObservationStore.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 {\n IMemoryObservationRecord,\n Kind,\n MemoryId,\n MemoryObservationPhase,\n MemoryObservationStore,\n MemoryScopeKey\n} from '../../../index';\n\ninterface IObsSpec {\n readonly seq: number;\n readonly timestamp?: number;\n readonly phase?: MemoryObservationPhase;\n readonly scope?: string;\n readonly kind?: string;\n readonly id?: string;\n readonly outcome?: 'success' | 'failure';\n}\n\nfunction obs(spec: IObsSpec): IMemoryObservationRecord {\n return {\n seq: spec.seq,\n timestamp: spec.timestamp ?? spec.seq,\n phase: spec.phase ?? 'write',\n scope: spec.scope === undefined ? undefined : (spec.scope as MemoryScopeKey),\n kind: spec.kind === undefined ? undefined : (spec.kind as Kind),\n id: spec.id === undefined ? undefined : (spec.id as MemoryId),\n outcome: spec.outcome ?? 'success'\n };\n}\n\nfunction seqs(records: ReadonlyArray<IMemoryObservationRecord>): ReadonlyArray<number> {\n return records.map((r) => r.seq);\n}\n\ndescribe('MemoryObservationStore', () => {\n describe('create', () => {\n test('builds with defaults', () => {\n expect(MemoryObservationStore.create()).toSucceedAndSatisfy((store: MemoryObservationStore) => {\n expect(store.size).toBe(0);\n expect(store.lastSeq).toBe(0);\n });\n });\n\n test('rejects a non-positive-integer maxRecords', () => {\n expect(MemoryObservationStore.create({ maxRecords: 0 })).toFailWith(/positive integer/i);\n expect(MemoryObservationStore.create({ maxRecords: 2.5 })).toFailWith(/positive integer/i);\n expect(MemoryObservationStore.create({ maxRecords: -1 })).toFailWith(/positive integer/i);\n });\n });\n\n describe('observe', () => {\n test('retains records and tracks size + lastSeq', async () => {\n const store = MemoryObservationStore.create().orThrow();\n expect(await store.observe(obs({ seq: 1 }))).toSucceed();\n expect(await store.observe(obs({ seq: 2 }))).toSucceed();\n expect(store.size).toBe(2);\n expect(store.lastSeq).toBe(2);\n });\n\n test('evicts the oldest beyond maxRecords, preserving lastSeq', async () => {\n const store = MemoryObservationStore.create({ maxRecords: 2 }).orThrow();\n await store.observe(obs({ seq: 1 }));\n await store.observe(obs({ seq: 2 }));\n await store.observe(obs({ seq: 3 }));\n expect(store.size).toBe(2);\n expect(store.lastSeq).toBe(3);\n expect(seqs(store.query())).toEqual([2, 3]);\n });\n });\n\n describe('query', () => {\n let store: MemoryObservationStore;\n\n beforeEach(async () => {\n store = MemoryObservationStore.create().orThrow();\n await store.observe(\n obs({\n seq: 1,\n timestamp: 100,\n phase: 'write',\n scope: 'knowledge',\n kind: 'knowledge',\n outcome: 'success'\n })\n );\n await store.observe(\n obs({\n seq: 2,\n timestamp: 200,\n phase: 'read',\n scope: 'knowledge',\n kind: 'knowledge',\n outcome: 'failure'\n })\n );\n await store.observe(\n obs({ seq: 3, timestamp: 300, phase: 'delete', scope: 'other', kind: 'note', outcome: 'success' })\n );\n });\n\n test('returns all records oldest-first with no criteria', () => {\n expect(seqs(store.query())).toEqual([1, 2, 3]);\n });\n\n test('pages by sinceSeq', () => {\n expect(seqs(store.query({ sinceSeq: 1 }))).toEqual([2, 3]);\n });\n\n test('limits to the most-recent N', () => {\n expect(seqs(store.query({ limit: 2 }))).toEqual([2, 3]);\n });\n\n test('filters by timestamp window', () => {\n expect(seqs(store.query({ since: 200 }))).toEqual([2, 3]);\n expect(seqs(store.query({ until: 200 }))).toEqual([1, 2]);\n expect(seqs(store.query({ since: 150, until: 250 }))).toEqual([2]);\n });\n\n test('filters by scope', () => {\n expect(seqs(store.query({ scope: 'knowledge' as MemoryScopeKey }))).toEqual([1, 2]);\n });\n\n test('filters by kind', () => {\n expect(seqs(store.query({ kind: 'note' as Kind }))).toEqual([3]);\n });\n\n test('filters by phase', () => {\n expect(seqs(store.query({ phase: 'read' }))).toEqual([2]);\n });\n\n test('filters by outcome', () => {\n expect(seqs(store.query({ outcome: 'failure' }))).toEqual([2]);\n });\n\n test('combines criteria with AND', () => {\n expect(seqs(store.query({ scope: 'knowledge' as MemoryScopeKey, outcome: 'success' }))).toEqual([1]);\n });\n });\n\n describe('clear', () => {\n test('drops records but preserves lastSeq as a cursor floor', async () => {\n const store = MemoryObservationStore.create().orThrow();\n await store.observe(obs({ seq: 1 }));\n await store.observe(obs({ seq: 2 }));\n store.clear();\n expect(store.size).toBe(0);\n expect(store.lastSeq).toBe(2);\n expect(store.query()).toEqual([]);\n });\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fragmentSemanticRetriever.test.d.ts","sourceRoot":"","sources":["../../../../src/test/unit/retrieve/fragmentSemanticRetriever.test.ts"],"names":[],"mappings":"AAKA,OAAO,oBAAoB,CAAC"}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
* Copyright (c) 2026 Erik Fortune
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
require("@fgv/ts-utils-jest");
|
|
8
|
-
const ts_utils_1 = require("@fgv/ts-utils");
|
|
9
|
-
const index_1 = require("../../../index");
|
|
10
|
-
function target(scope, id) {
|
|
11
|
-
return { scope: scope, id: id };
|
|
12
|
-
}
|
|
13
|
-
function loc(start, end) {
|
|
14
|
-
return { start, end };
|
|
15
|
-
}
|
|
16
|
-
function hit(scope, id, start, end, score) {
|
|
17
|
-
return { target: target(scope, id), score, locator: loc(start, end) };
|
|
18
|
-
}
|
|
19
|
-
const okEmbed = () => Promise.resolve((0, ts_utils_1.succeed)(Float32Array.from([0.1, 0.2])));
|
|
20
|
-
/** A scripted fragment index that records the args it was queried with. */
|
|
21
|
-
class FakeFragmentIndex {
|
|
22
|
-
constructor(hits, shouldFail = false) {
|
|
23
|
-
this._hits = hits;
|
|
24
|
-
this._fail = shouldFail;
|
|
25
|
-
}
|
|
26
|
-
addFragments(__t, fragments) {
|
|
27
|
-
return Promise.resolve((0, ts_utils_1.succeed)(fragments.length));
|
|
28
|
-
}
|
|
29
|
-
remove(t) {
|
|
30
|
-
return Promise.resolve((0, ts_utils_1.succeed)(t));
|
|
31
|
-
}
|
|
32
|
-
query(__vector, topK, maxPerRecord) {
|
|
33
|
-
this.lastTopK = topK;
|
|
34
|
-
this.lastMaxPerRecord = maxPerRecord;
|
|
35
|
-
return Promise.resolve(this._fail ? (0, ts_utils_1.fail)('fragment backend down') : (0, ts_utils_1.succeed)(this._hits));
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
describe('FragmentSemanticRetriever', () => {
|
|
39
|
-
test('reports supportsFragmentRecall=false when no backend is wired', () => {
|
|
40
|
-
const r = index_1.FragmentSemanticRetriever.create({}).orThrow();
|
|
41
|
-
expect(r.capabilities.supportsFragmentRecall).toBe(false);
|
|
42
|
-
});
|
|
43
|
-
test('reports supportsFragmentRecall=true when a backend is wired', () => {
|
|
44
|
-
const r = index_1.FragmentSemanticRetriever.create({
|
|
45
|
-
backend: { fragmentIndex: new FakeFragmentIndex([]), embedQuery: okEmbed }
|
|
46
|
-
}).orThrow();
|
|
47
|
-
expect(r.capabilities.supportsFragmentRecall).toBe(true);
|
|
48
|
-
});
|
|
49
|
-
test('degrades loudly when no backend is wired — never a silent empty', async () => {
|
|
50
|
-
const r = index_1.FragmentSemanticRetriever.create({}).orThrow();
|
|
51
|
-
expect(await r.retrieve({ semantic: 'hi' })).toFailWith(index_1.FRAGMENT_SEMANTIC_UNWIRED_MESSAGE);
|
|
52
|
-
});
|
|
53
|
-
test('returns the per-fragment hits (target + locator + score) in backend order', async () => {
|
|
54
|
-
const hits = [hit('knowledge', 'doc-a', 0, 5, 0.9), hit('knowledge', 'doc-a', 20, 25, 0.4)];
|
|
55
|
-
const r = index_1.FragmentSemanticRetriever.create({
|
|
56
|
-
backend: { fragmentIndex: new FakeFragmentIndex(hits), embedQuery: okEmbed }
|
|
57
|
-
}).orThrow();
|
|
58
|
-
expect(await r.retrieve({ semantic: 'q' })).toSucceedAndSatisfy((result) => {
|
|
59
|
-
expect(result).toEqual(hits);
|
|
60
|
-
expect(result[0].locator).toEqual(loc(0, 5));
|
|
61
|
-
expect(result[1].locator).toEqual(loc(20, 25));
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
test('forwards topK and maxPerRecord to the fragment index', async () => {
|
|
65
|
-
const fragmentIndex = new FakeFragmentIndex([hit('knowledge', 'doc-a', 0, 5, 0.9)]);
|
|
66
|
-
const r = index_1.FragmentSemanticRetriever.create({
|
|
67
|
-
backend: { fragmentIndex, embedQuery: okEmbed }
|
|
68
|
-
}).orThrow();
|
|
69
|
-
expect(await r.retrieve({ semantic: 'q', topK: 3, maxPerRecord: 1 })).toSucceed();
|
|
70
|
-
expect(fragmentIndex.lastTopK).toBe(3);
|
|
71
|
-
expect(fragmentIndex.lastMaxPerRecord).toBe(1);
|
|
72
|
-
});
|
|
73
|
-
test('defaults topK to 10 and leaves maxPerRecord undefined when the query omits them', async () => {
|
|
74
|
-
const fragmentIndex = new FakeFragmentIndex([hit('knowledge', 'doc-a', 0, 5, 0.9)]);
|
|
75
|
-
const r = index_1.FragmentSemanticRetriever.create({
|
|
76
|
-
backend: { fragmentIndex, embedQuery: okEmbed }
|
|
77
|
-
}).orThrow();
|
|
78
|
-
expect(await r.retrieve({ semantic: 'q' })).toSucceed();
|
|
79
|
-
expect(fragmentIndex.lastTopK).toBe(10);
|
|
80
|
-
expect(fragmentIndex.lastMaxPerRecord).toBeUndefined();
|
|
81
|
-
});
|
|
82
|
-
test('fails loudly when the embedder fails', async () => {
|
|
83
|
-
const r = index_1.FragmentSemanticRetriever.create({
|
|
84
|
-
backend: {
|
|
85
|
-
fragmentIndex: new FakeFragmentIndex([]),
|
|
86
|
-
embedQuery: () => Promise.resolve((0, ts_utils_1.fail)('no embed model'))
|
|
87
|
-
}
|
|
88
|
-
}).orThrow();
|
|
89
|
-
expect(await r.retrieve({ semantic: 'q' })).toFailWith(/fragment recall: query embedding failed: no embed model/i);
|
|
90
|
-
});
|
|
91
|
-
test('fails loudly when the fragment backend fails', async () => {
|
|
92
|
-
const r = index_1.FragmentSemanticRetriever.create({
|
|
93
|
-
backend: { fragmentIndex: new FakeFragmentIndex([], true), embedQuery: okEmbed }
|
|
94
|
-
}).orThrow();
|
|
95
|
-
expect(await r.retrieve({ semantic: 'q' })).toFailWith(/fragment recall: fragment query failed: fragment backend down/i);
|
|
96
|
-
});
|
|
97
|
-
test('normalizes a rejecting embedder into a Failure (never escapes as a rejection)', async () => {
|
|
98
|
-
const r = index_1.FragmentSemanticRetriever.create({
|
|
99
|
-
backend: {
|
|
100
|
-
fragmentIndex: new FakeFragmentIndex([]),
|
|
101
|
-
embedQuery: () => Promise.reject(new Error('embedder blew up'))
|
|
102
|
-
}
|
|
103
|
-
}).orThrow();
|
|
104
|
-
expect(await r.retrieve({ semantic: 'q' })).toFailWith(/fragment recall: query embedding failed: .*embedder blew up/i);
|
|
105
|
-
});
|
|
106
|
-
test('normalizes a rejecting fragment backend into a Failure', async () => {
|
|
107
|
-
const rejectingIndex = {
|
|
108
|
-
addFragments: (__t, f) => Promise.resolve((0, ts_utils_1.succeed)(f.length)),
|
|
109
|
-
remove: (t) => Promise.resolve((0, ts_utils_1.succeed)(t)),
|
|
110
|
-
query: () => Promise.reject(new Error('socket hangup'))
|
|
111
|
-
};
|
|
112
|
-
const r = index_1.FragmentSemanticRetriever.create({
|
|
113
|
-
backend: { fragmentIndex: rejectingIndex, embedQuery: okEmbed }
|
|
114
|
-
}).orThrow();
|
|
115
|
-
expect(await r.retrieve({ semantic: 'q' })).toFailWith(/fragment recall: fragment query failed: .*socket hangup/i);
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
//# sourceMappingURL=fragmentSemanticRetriever.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fragmentSemanticRetriever.test.js","sourceRoot":"","sources":["../../../../src/test/unit/retrieve/fragmentSemanticRetriever.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 FRAGMENT_SEMANTIC_UNWIRED_MESSAGE,\n FragmentSemanticRetriever,\n IEdgeTarget,\n IEmbeddedFragment,\n IFragmentLocator,\n IFragmentVectorIndex,\n IVectorQueryHit,\n MemoryId,\n MemoryScopeKey\n} from '../../../index';\n\nfunction target(scope: string, id: string): IEdgeTarget {\n return { scope: scope as MemoryScopeKey, id: id as MemoryId };\n}\n\nfunction loc(start: number, end: number): IFragmentLocator {\n return { start, end };\n}\n\nfunction hit(scope: string, id: string, start: number, end: number, score: number): IVectorQueryHit {\n return { target: target(scope, id), score, locator: loc(start, end) };\n}\n\nconst okEmbed = (): Promise<Result<Float32Array>> => Promise.resolve(succeed(Float32Array.from([0.1, 0.2])));\n\n/** A scripted fragment index that records the args it was queried with. */\nclass FakeFragmentIndex implements IFragmentVectorIndex {\n public lastTopK: number | undefined;\n public lastMaxPerRecord: number | undefined;\n private readonly _hits: ReadonlyArray<IVectorQueryHit>;\n private readonly _fail: boolean;\n public constructor(hits: ReadonlyArray<IVectorQueryHit>, shouldFail: boolean = false) {\n this._hits = hits;\n this._fail = shouldFail;\n }\n public addFragments(\n __t: IEdgeTarget,\n fragments: ReadonlyArray<IEmbeddedFragment>\n ): Promise<Result<number>> {\n return Promise.resolve(succeed(fragments.length));\n }\n public remove(t: IEdgeTarget): Promise<Result<IEdgeTarget>> {\n return Promise.resolve(succeed(t));\n }\n public query(\n __vector: Float32Array,\n topK: number,\n maxPerRecord?: number\n ): Promise<Result<ReadonlyArray<IVectorQueryHit>>> {\n this.lastTopK = topK;\n this.lastMaxPerRecord = maxPerRecord;\n return Promise.resolve(this._fail ? fail('fragment backend down') : succeed(this._hits));\n }\n}\n\ndescribe('FragmentSemanticRetriever', () => {\n test('reports supportsFragmentRecall=false when no backend is wired', () => {\n const r = FragmentSemanticRetriever.create({}).orThrow();\n expect(r.capabilities.supportsFragmentRecall).toBe(false);\n });\n\n test('reports supportsFragmentRecall=true when a backend is wired', () => {\n const r = FragmentSemanticRetriever.create({\n backend: { fragmentIndex: new FakeFragmentIndex([]), embedQuery: okEmbed }\n }).orThrow();\n expect(r.capabilities.supportsFragmentRecall).toBe(true);\n });\n\n test('degrades loudly when no backend is wired — never a silent empty', async () => {\n const r = FragmentSemanticRetriever.create({}).orThrow();\n expect(await r.retrieve({ semantic: 'hi' })).toFailWith(FRAGMENT_SEMANTIC_UNWIRED_MESSAGE);\n });\n\n test('returns the per-fragment hits (target + locator + score) in backend order', async () => {\n const hits = [hit('knowledge', 'doc-a', 0, 5, 0.9), hit('knowledge', 'doc-a', 20, 25, 0.4)];\n const r = FragmentSemanticRetriever.create({\n backend: { fragmentIndex: new FakeFragmentIndex(hits), embedQuery: okEmbed }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toSucceedAndSatisfy(\n (result: ReadonlyArray<IVectorQueryHit>) => {\n expect(result).toEqual(hits);\n expect(result[0].locator).toEqual(loc(0, 5));\n expect(result[1].locator).toEqual(loc(20, 25));\n }\n );\n });\n\n test('forwards topK and maxPerRecord to the fragment index', async () => {\n const fragmentIndex = new FakeFragmentIndex([hit('knowledge', 'doc-a', 0, 5, 0.9)]);\n const r = FragmentSemanticRetriever.create({\n backend: { fragmentIndex, embedQuery: okEmbed }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q', topK: 3, maxPerRecord: 1 })).toSucceed();\n expect(fragmentIndex.lastTopK).toBe(3);\n expect(fragmentIndex.lastMaxPerRecord).toBe(1);\n });\n\n test('defaults topK to 10 and leaves maxPerRecord undefined when the query omits them', async () => {\n const fragmentIndex = new FakeFragmentIndex([hit('knowledge', 'doc-a', 0, 5, 0.9)]);\n const r = FragmentSemanticRetriever.create({\n backend: { fragmentIndex, embedQuery: okEmbed }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toSucceed();\n expect(fragmentIndex.lastTopK).toBe(10);\n expect(fragmentIndex.lastMaxPerRecord).toBeUndefined();\n });\n\n test('fails loudly when the embedder fails', async () => {\n const r = FragmentSemanticRetriever.create({\n backend: {\n fragmentIndex: new FakeFragmentIndex([]),\n embedQuery: () => Promise.resolve(fail('no embed model'))\n }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(\n /fragment recall: query embedding failed: no embed model/i\n );\n });\n\n test('fails loudly when the fragment backend fails', async () => {\n const r = FragmentSemanticRetriever.create({\n backend: { fragmentIndex: new FakeFragmentIndex([], true), embedQuery: okEmbed }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(\n /fragment recall: fragment query failed: fragment backend down/i\n );\n });\n\n test('normalizes a rejecting embedder into a Failure (never escapes as a rejection)', async () => {\n const r = FragmentSemanticRetriever.create({\n backend: {\n fragmentIndex: new FakeFragmentIndex([]),\n embedQuery: () => Promise.reject(new Error('embedder blew up'))\n }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(\n /fragment recall: query embedding failed: .*embedder blew up/i\n );\n });\n\n test('normalizes a rejecting fragment backend into a Failure', async () => {\n const rejectingIndex: IFragmentVectorIndex = {\n addFragments: (__t: IEdgeTarget, f: ReadonlyArray<IEmbeddedFragment>) =>\n Promise.resolve(succeed(f.length)),\n remove: (t: IEdgeTarget) => Promise.resolve(succeed(t)),\n query: () => Promise.reject(new Error('socket hangup'))\n };\n const r = FragmentSemanticRetriever.create({\n backend: { fragmentIndex: rejectingIndex, embedQuery: okEmbed }\n }).orThrow();\n expect(await r.retrieve({ semantic: 'q' })).toFailWith(\n /fragment recall: fragment query failed: .*socket hangup/i\n );\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"linkTraversalRetriever.test.d.ts","sourceRoot":"","sources":["../../../../src/test/unit/retrieve/linkTraversalRetriever.test.ts"],"names":[],"mappings":"AAKA,OAAO,oBAAoB,CAAC"}
|