@fgv/ts-agent-memory 5.1.0-46 → 5.1.0-48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/dist/packlets/ingest/orchestrator.js +115 -20
- 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/store/fileTreeMemoryStore.js +63 -135
- 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/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 +389 -71
- package/lib/packlets/ingest/orchestrator.d.ts +62 -5
- package/lib/packlets/ingest/orchestrator.d.ts.map +1 -1
- package/lib/packlets/ingest/orchestrator.js +115 -20
- 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/store/fileTreeMemoryStore.d.ts +97 -60
- package/lib/packlets/store/fileTreeMemoryStore.d.ts.map +1 -1
- package/lib/packlets/store/fileTreeMemoryStore.js +63 -135
- 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/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/6e1299d1cebb080772163a532c221cd181b54f9f.tar.log +0 -462
- 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/orchestrator.test.js +0 -1055
- 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 -841
- 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 -938
- 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/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 -1057
- 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 -843
- 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 -873
- 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 -1834
- 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/orchestrator.test.ts +0 -1351
- 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 -1120
- 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 -302
- package/temp/build/typescript/ts_8nwakTlr.json +0 -1
- package/temp/ts-agent-memory.api.json +0 -20933
- package/temp/ts-agent-memory.api.md +0 -938
- package/tsconfig.json +0 -8
|
@@ -9,6 +9,7 @@ const ts_utils_1 = require("@fgv/ts-utils");
|
|
|
9
9
|
const ts_json_base_1 = require("@fgv/ts-json-base");
|
|
10
10
|
const types_1 = require("../types");
|
|
11
11
|
const converters_1 = require("../converters");
|
|
12
|
+
const vectorMaintenance_1 = require("./vectorMaintenance");
|
|
12
13
|
const index_1 = require("../index");
|
|
13
14
|
const scopeEncoding_1 = require("./scopeEncoding");
|
|
14
15
|
/** The on-disk extension for a memory record file. */
|
|
@@ -29,11 +30,13 @@ const MEMORY_FILE_EXTENSION = '.md';
|
|
|
29
30
|
*/
|
|
30
31
|
class FileTreeMemoryStore {
|
|
31
32
|
constructor(params) {
|
|
33
|
+
var _a;
|
|
32
34
|
this._root = params.root;
|
|
33
35
|
this._registry = params.registry;
|
|
34
36
|
this._writePolicies = params.writePolicies;
|
|
35
37
|
this._codecs = params.codecs;
|
|
36
38
|
this._rankProjectors = params.rankProjectors;
|
|
39
|
+
this._embedKinds = (_a = params.embedKinds) !== null && _a !== void 0 ? _a : undefined;
|
|
37
40
|
this._defaultCodec = params.defaultCodec;
|
|
38
41
|
this._defaultPolicy = params.defaultPolicy;
|
|
39
42
|
this._scopeEncoding = params.scopeEncoding;
|
|
@@ -42,10 +45,14 @@ class FileTreeMemoryStore {
|
|
|
42
45
|
this._hasher = new ts_utils_1.Hash.Crc32Normalizer();
|
|
43
46
|
this._observers = params.observers;
|
|
44
47
|
this._logger = params.logger;
|
|
45
|
-
this.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
this._vectors = new vectorMaintenance_1.VectorMaintenance({
|
|
49
|
+
vectorIndex: params.vectorIndex,
|
|
50
|
+
embed: params.embed,
|
|
51
|
+
fragmentIndex: params.fragmentIndex,
|
|
52
|
+
fragmentEmbedder: params.fragmentEmbedder,
|
|
53
|
+
warn: (message) => this._warnSwallowed(message),
|
|
54
|
+
embedsKind: (kind) => this.embedsKind(kind)
|
|
55
|
+
});
|
|
49
56
|
this._skippedRecords = [];
|
|
50
57
|
this._seq = 0;
|
|
51
58
|
this._observationSeq = 0;
|
|
@@ -78,6 +85,7 @@ class FileTreeMemoryStore {
|
|
|
78
85
|
writePolicies: (_a = params.writePolicies) !== null && _a !== void 0 ? _a : new Map(),
|
|
79
86
|
codecs: (_b = params.codecs) !== null && _b !== void 0 ? _b : new Map(),
|
|
80
87
|
rankProjectors: (_c = params.rankProjectors) !== null && _c !== void 0 ? _c : new Map(),
|
|
88
|
+
embedKinds: params.embedKinds,
|
|
81
89
|
defaultCodec: params.defaultCodec,
|
|
82
90
|
defaultPolicy,
|
|
83
91
|
scopeEncoding: (_d = params.scopeEncoding) !== null && _d !== void 0 ? _d : scopeEncoding_1.defaultMemoryScopeEncoding,
|
|
@@ -171,7 +179,14 @@ class FileTreeMemoryStore {
|
|
|
171
179
|
}
|
|
172
180
|
/** {@inheritDoc IMemoryStore.asRecordSource} */
|
|
173
181
|
asRecordSource() {
|
|
174
|
-
return {
|
|
182
|
+
return {
|
|
183
|
+
// Filtered to the kinds that participate in the record vector index. This
|
|
184
|
+
// source exists to drive `IVectorIndex` rebuilds, so a kind excluded from the
|
|
185
|
+
// index has no business being re-embedded on open — which is where the cost
|
|
186
|
+
// is worst, since a rebuild embeds the whole vault serially. With no
|
|
187
|
+
// `embedKinds` declaration every kind passes and this is the identity filter.
|
|
188
|
+
list: async () => (await this.listScoped()).onSuccess((scoped) => (0, ts_utils_1.succeed)(scoped.filter((s) => this.embedsKind(s.record.envelope.kind))))
|
|
189
|
+
};
|
|
175
190
|
}
|
|
176
191
|
/**
|
|
177
192
|
* Collapse temporal records to the single version valid at `asOf` per entity;
|
|
@@ -213,7 +228,8 @@ class FileTreeMemoryStore {
|
|
|
213
228
|
outcome: result.isSuccess() ? 'success' : 'failure',
|
|
214
229
|
id: result.isSuccess() ? result.value.record.envelope.id : record.envelope.id,
|
|
215
230
|
provenance: record.envelope.provenance,
|
|
216
|
-
error: result.isFailure() ? result.message : undefined
|
|
231
|
+
error: result.isFailure() ? result.message : undefined,
|
|
232
|
+
embed: result.isSuccess() ? result.value.embed : undefined
|
|
217
233
|
});
|
|
218
234
|
// Fire one `'delete'` observation per record evicted by cap-cull. The
|
|
219
235
|
// evicted records are always in the same `(scope, kind)` cohort as the
|
|
@@ -269,7 +285,8 @@ class FileTreeMemoryStore {
|
|
|
269
285
|
kind,
|
|
270
286
|
outcome: details.outcome,
|
|
271
287
|
error: details.error,
|
|
272
|
-
provenance: details.provenance
|
|
288
|
+
provenance: details.provenance,
|
|
289
|
+
embed: details.embed
|
|
273
290
|
};
|
|
274
291
|
const awaited = [];
|
|
275
292
|
for (const observer of this._observers) {
|
|
@@ -351,9 +368,11 @@ class FileTreeMemoryStore {
|
|
|
351
368
|
* vector index, the on-disk file, and the derived index never interleave.
|
|
352
369
|
*/
|
|
353
370
|
async _writeResolved(record, body, scope, idStem, hash) {
|
|
354
|
-
var _a;
|
|
355
371
|
const policy = this._policyFor(record.envelope.kind);
|
|
356
|
-
|
|
372
|
+
// Read through the public accessor so the write path and every external
|
|
373
|
+
// caller (the ingest orchestrator's layer-1) resolve dedup granularity from
|
|
374
|
+
// ONE place — there is no second declaration site.
|
|
375
|
+
const dedupScope = this.dedupScopeFor(record.envelope.kind);
|
|
357
376
|
// Content-hash dedup runs BEFORE policy. Its granularity is the kind's
|
|
358
377
|
// `dedupScope`:
|
|
359
378
|
// - 'content': an identical { kind, body, links } triple ANYWHERE in the
|
|
@@ -420,89 +439,27 @@ class FileTreeMemoryStore {
|
|
|
420
439
|
}
|
|
421
440
|
return this._buildRecord(record, body, existing, policy, hash)
|
|
422
441
|
.onSuccess((built) => (0, ts_utils_1.succeed)(this._stampRank(built)))
|
|
423
|
-
.thenOnSuccess((built) => this.
|
|
424
|
-
.thenOnSuccess((
|
|
425
|
-
.onSuccess((
|
|
426
|
-
.thenOnSuccess(async (persisted) => {
|
|
442
|
+
.thenOnSuccess((built) => this._vectors.embedOnWrite(built, scope))
|
|
443
|
+
.thenOnSuccess(async (embedded) => (await this._vectors.embedFragmentsOnWrite(embedded.record, scope)).onSuccess((withFragments) => (0, ts_utils_1.succeed)(Object.assign(Object.assign({}, embedded), { record: withFragments }))))
|
|
444
|
+
.onSuccess((embedded) => this._persist(embedded.record, scope, idStem).onSuccess((persisted) => (0, ts_utils_1.succeed)({ persisted, stale: embedded.stale, embed: embedded.embed })))
|
|
445
|
+
.thenOnSuccess(async ({ persisted, stale, embed }) => {
|
|
427
446
|
// Everything after the authoritative `_persist` commit is best-effort and
|
|
428
447
|
// never turns a committed write into a `Failure`:
|
|
448
|
+
// - a stale vector superseded by a decline is pruned here rather than at
|
|
449
|
+
// the point of the decline, because a `_persist` that fails leaves the
|
|
450
|
+
// PREVIOUS content on disk — content that vector is still an accurate
|
|
451
|
+
// embedding of. Pruning early would delete a correct vector on behalf
|
|
452
|
+
// of a write that never landed;
|
|
429
453
|
// - a cull-oldest eviction that fails is logged (the per-(scope,kind)
|
|
430
454
|
// cap may be transiently exceeded; the next write's admission restores
|
|
431
455
|
// it), and only the successfully-evicted ids flow onward;
|
|
432
456
|
// - vector pruning of the evicted cohort is likewise best-effort.
|
|
457
|
+
await this._vectors.pruneStaleVector(stale);
|
|
433
458
|
const evicted = this._applyEvictions(decision, scope);
|
|
434
|
-
await this.
|
|
435
|
-
return (0, ts_utils_1.succeed)({ record: persisted, evicted });
|
|
459
|
+
await this._vectors.removeEvictedVectors(evicted, scope);
|
|
460
|
+
return (0, ts_utils_1.succeed)({ record: persisted, evicted, embed });
|
|
436
461
|
});
|
|
437
462
|
}
|
|
438
|
-
/**
|
|
439
|
-
* Best-effort embed-on-write. When a vector index AND an embedder are wired,
|
|
440
|
-
* embeds the built record, `add`s the vector (replace semantics handle a same-id
|
|
441
|
-
* re-embed — no explicit remove), and stamps the returned `embeddingRef`. A
|
|
442
|
-
* failure (returned `fail` OR a thrown/rejected hook) is logged and the
|
|
443
|
-
* unembedded record is returned unchanged — the put still persists, and the
|
|
444
|
-
* derived index is reconciled by a later `rebuild`. A pass-through no-op when
|
|
445
|
-
* unwired (byte-identical record).
|
|
446
|
-
*
|
|
447
|
-
* Always succeeds (`Result` is the chain's shape, never a vector-induced
|
|
448
|
-
* failure).
|
|
449
|
-
*/
|
|
450
|
-
async _embedOnWrite(built, scope) {
|
|
451
|
-
if (this._vectorIndex === undefined || this._embed === undefined) {
|
|
452
|
-
return (0, ts_utils_1.succeed)(built);
|
|
453
|
-
}
|
|
454
|
-
const vectorIndex = this._vectorIndex;
|
|
455
|
-
const embed = this._embed;
|
|
456
|
-
const target = { scope, id: built.envelope.id };
|
|
457
|
-
const embedded = await this._tryVectorOp(() => embed(built), `embedding '${built.envelope.id}'`);
|
|
458
|
-
if (embedded.isFailure()) {
|
|
459
|
-
return (0, ts_utils_1.succeed)(built);
|
|
460
|
-
}
|
|
461
|
-
const added = await this._tryVectorOp(() => vectorIndex.add(target, embedded.value), `vector add for '${built.envelope.id}'`);
|
|
462
|
-
if (added.isFailure()) {
|
|
463
|
-
return (0, ts_utils_1.succeed)(built);
|
|
464
|
-
}
|
|
465
|
-
return (0, ts_utils_1.succeed)({ envelope: Object.assign(Object.assign({}, built.envelope), { embeddingRef: added.value }), body: built.body });
|
|
466
|
-
}
|
|
467
|
-
/**
|
|
468
|
-
* Best-effort fragment-embed-on-write. When a fragment index AND a fragment
|
|
469
|
-
* embedder are wired, chunks + embeds the built record and replaces its
|
|
470
|
-
* fragments in the index (`addFragments` is whole-record-replace, so a re-authored
|
|
471
|
-
* document never leaves stale fragments behind — no explicit remove needed). A
|
|
472
|
-
* failure (returned `fail` OR a thrown/rejected hook) is logged and the record is
|
|
473
|
-
* returned unchanged — the put still persists, and the fragment index is a derived
|
|
474
|
-
* view a later `rebuild` reconciles. Unlike {@link FileTreeMemoryStore._embedOnWrite}
|
|
475
|
-
* it stamps nothing on the record (fragments have no per-record `embeddingRef`
|
|
476
|
-
* analog). A pass-through no-op when unwired (byte-identical record).
|
|
477
|
-
*/
|
|
478
|
-
async _embedFragmentsOnWrite(built, scope) {
|
|
479
|
-
if (this._fragmentIndex === undefined || this._fragmentEmbedder === undefined) {
|
|
480
|
-
return (0, ts_utils_1.succeed)(built);
|
|
481
|
-
}
|
|
482
|
-
const fragmentIndex = this._fragmentIndex;
|
|
483
|
-
const fragmentEmbedder = this._fragmentEmbedder;
|
|
484
|
-
const target = { scope, id: built.envelope.id };
|
|
485
|
-
const embedded = await this._tryVectorOp(() => fragmentEmbedder(built), `fragment embedding '${built.envelope.id}'`);
|
|
486
|
-
if (embedded.isFailure()) {
|
|
487
|
-
return (0, ts_utils_1.succeed)(built);
|
|
488
|
-
}
|
|
489
|
-
await this._tryVectorOp(() => fragmentIndex.addFragments(target, embedded.value), `fragment add for '${built.envelope.id}'`);
|
|
490
|
-
return (0, ts_utils_1.succeed)(built);
|
|
491
|
-
}
|
|
492
|
-
/**
|
|
493
|
-
* Best-effort fragment removal. A no-op unless the full fragment lifecycle is
|
|
494
|
-
* wired (both an index AND an embedder), so an unwired store does no fragment
|
|
495
|
-
* work and behaves byte-identically. Failures are logged, never surfaced — a
|
|
496
|
-
* committed delete/eviction must not fail because a derived fragment index could
|
|
497
|
-
* not be pruned.
|
|
498
|
-
*/
|
|
499
|
-
async _removeFragmentsBestEffort(target) {
|
|
500
|
-
if (this._fragmentIndex === undefined || this._fragmentEmbedder === undefined) {
|
|
501
|
-
return;
|
|
502
|
-
}
|
|
503
|
-
const fragmentIndex = this._fragmentIndex;
|
|
504
|
-
await this._tryVectorOp(() => fragmentIndex.remove(target), `fragment removal for '${target.id}'`);
|
|
505
|
-
}
|
|
506
463
|
/**
|
|
507
464
|
* Evict the records named by a `cull-oldest` decision, best-effort. Runs only
|
|
508
465
|
* after the authoritative `_persist`, so a failed eviction is logged (never
|
|
@@ -526,49 +483,6 @@ class FileTreeMemoryStore {
|
|
|
526
483
|
}
|
|
527
484
|
return evicted;
|
|
528
485
|
}
|
|
529
|
-
/**
|
|
530
|
-
* Best-effort vector removal for each evicted record (never fails the put).
|
|
531
|
-
* Every evicted record is in the same `scope` as the incoming write (the
|
|
532
|
-
* cull-oldest cohort is the incoming record's `(scope, kind)` cohort), so that
|
|
533
|
-
* scope qualifies each removal target.
|
|
534
|
-
*/
|
|
535
|
-
async _removeEvictedVectors(evicted, scope) {
|
|
536
|
-
for (const id of evicted) {
|
|
537
|
-
await this._removeVectorBestEffort({ scope, id });
|
|
538
|
-
await this._removeFragmentsBestEffort({ scope, id });
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
/**
|
|
542
|
-
* Run a consumer-supplied vector hook, normalizing a thrown/rejected hook into a
|
|
543
|
-
* `Failure` and logging any failure at `warn`. Best-effort: the caller proceeds
|
|
544
|
-
* regardless, since the index is rebuildable.
|
|
545
|
-
*/
|
|
546
|
-
async _tryVectorOp(op, label) {
|
|
547
|
-
let result;
|
|
548
|
-
try {
|
|
549
|
-
result = await op();
|
|
550
|
-
}
|
|
551
|
-
catch (err) {
|
|
552
|
-
result = (0, ts_utils_1.fail)(`${label} threw: ${String(err)}`);
|
|
553
|
-
}
|
|
554
|
-
if (result.isFailure()) {
|
|
555
|
-
this._warnSwallowed(`memory: ${label} failed (best-effort; derived index left for rebuild): ${result.message}`);
|
|
556
|
-
}
|
|
557
|
-
return result;
|
|
558
|
-
}
|
|
559
|
-
/**
|
|
560
|
-
* Best-effort vector removal. A no-op unless the full vector lifecycle is wired
|
|
561
|
-
* (both an index AND an embedder), so an unwired store does no vector work and
|
|
562
|
-
* behaves byte-identically. Failures are logged, never surfaced — a committed
|
|
563
|
-
* delete/eviction must not fail because a derived index could not be pruned.
|
|
564
|
-
*/
|
|
565
|
-
async _removeVectorBestEffort(target) {
|
|
566
|
-
if (this._vectorIndex === undefined || this._embed === undefined) {
|
|
567
|
-
return;
|
|
568
|
-
}
|
|
569
|
-
const vectorIndex = this._vectorIndex;
|
|
570
|
-
await this._tryVectorOp(() => vectorIndex.remove(target), `vector removal for '${target.id}'`);
|
|
571
|
-
}
|
|
572
486
|
/**
|
|
573
487
|
* Build the record to persist. On a first write the incoming envelope is the
|
|
574
488
|
* base (final content equals the incoming content, so the dedup `hash` is
|
|
@@ -638,8 +552,7 @@ class FileTreeMemoryStore {
|
|
|
638
552
|
return this._deleteFile(scope, idStem)
|
|
639
553
|
.onSuccess(() => this._index.patch('delete', { scope, record: existing }))
|
|
640
554
|
.thenOnSuccess(async () => {
|
|
641
|
-
await this.
|
|
642
|
-
await this._removeFragmentsBestEffort({ scope, id: existing.envelope.id });
|
|
555
|
+
await this._vectors.removeAll({ scope, id: existing.envelope.id });
|
|
643
556
|
return (0, ts_utils_1.succeed)(existing.envelope.id);
|
|
644
557
|
});
|
|
645
558
|
});
|
|
@@ -677,7 +590,6 @@ class FileTreeMemoryStore {
|
|
|
677
590
|
* version's `valid_at` lower-bounds its interval.
|
|
678
591
|
*/
|
|
679
592
|
async _putVersioned(record, body, codec, scope) {
|
|
680
|
-
var _a;
|
|
681
593
|
const envelope = record.envelope;
|
|
682
594
|
const entityId = envelope.entityId;
|
|
683
595
|
const kind = envelope.kind;
|
|
@@ -689,7 +601,8 @@ class FileTreeMemoryStore {
|
|
|
689
601
|
const priorCurrents = versions.filter(types_1.isVersionCurrent);
|
|
690
602
|
const current = (0, types_1.selectCurrentVersion)(versions);
|
|
691
603
|
const policy = this._policyFor(kind);
|
|
692
|
-
|
|
604
|
+
// Same single-owner read as the flat path (see `_writeResolved`).
|
|
605
|
+
const dedupScope = this.dedupScopeFor(kind);
|
|
693
606
|
return this._contentHash(kind, body, envelope.links).thenOnSuccess((hash) => {
|
|
694
607
|
// Entity-scoped dedup: a re-put is a no-op only when the CURRENT content AND
|
|
695
608
|
// its mutable metadata are unchanged (does not spawn a redundant version).
|
|
@@ -725,11 +638,15 @@ class FileTreeMemoryStore {
|
|
|
725
638
|
.withErrorFormat((msg) => `memory put '${entityId}': ${msg}`)
|
|
726
639
|
.thenOnSuccess((versionStem) => this._buildVersionedRecord(record, body, current, policy, hash, versionStem, validAt, now, seq)
|
|
727
640
|
.onSuccess((built) => (0, ts_utils_1.succeed)(this._stampRank(built)))
|
|
728
|
-
.thenOnSuccess((built) => this.
|
|
729
|
-
.thenOnSuccess((
|
|
730
|
-
.onSuccess((
|
|
731
|
-
.onSuccess((persisted) => this._invalidateCurrents(scope, priorCurrents, validAt, now).onSuccess(() => (0, ts_utils_1.succeed)(persisted)))
|
|
732
|
-
|
|
641
|
+
.thenOnSuccess((built) => this._vectors.embedOnWrite(built, scope))
|
|
642
|
+
.thenOnSuccess(async (embedded) => (await this._vectors.embedFragmentsOnWrite(embedded.record, scope)).onSuccess((withFragments) => (0, ts_utils_1.succeed)(Object.assign(Object.assign({}, embedded), { record: withFragments }))))
|
|
643
|
+
.onSuccess((embedded) => this._persist(embedded.record, scope, versionStem).onSuccess((persisted) => (0, ts_utils_1.succeed)({ persisted, stale: embedded.stale, embed: embedded.embed })))
|
|
644
|
+
.onSuccess(({ persisted, stale, embed }) => this._invalidateCurrents(scope, priorCurrents, validAt, now).onSuccess(() => (0, ts_utils_1.succeed)({ persisted, stale, embed })))
|
|
645
|
+
// Post-commit and best-effort, exactly as on the flat path.
|
|
646
|
+
.thenOnSuccess(async ({ persisted, stale, embed }) => {
|
|
647
|
+
await this._vectors.pruneStaleVector(stale);
|
|
648
|
+
return (0, ts_utils_1.succeed)({ record: persisted, evicted: [], embed });
|
|
649
|
+
}));
|
|
733
650
|
});
|
|
734
651
|
});
|
|
735
652
|
}
|
|
@@ -937,6 +854,17 @@ class FileTreeMemoryStore {
|
|
|
937
854
|
var _a;
|
|
938
855
|
return (_a = this._writePolicies.get(kind)) !== null && _a !== void 0 ? _a : this._defaultPolicy;
|
|
939
856
|
}
|
|
857
|
+
/** {@inheritDoc IMemoryStore.dedupScopeFor} */
|
|
858
|
+
dedupScopeFor(kind) {
|
|
859
|
+
var _a;
|
|
860
|
+
return (_a = this._policyFor(kind).dedupScope) !== null && _a !== void 0 ? _a : types_1.DEFAULT_DEDUP_SCOPE;
|
|
861
|
+
}
|
|
862
|
+
/** {@inheritDoc IMemoryStore.embedsKind} */
|
|
863
|
+
embedsKind(kind) {
|
|
864
|
+
// No declaration means every kind participates — the behavior that predates
|
|
865
|
+
// this param, so an existing consumer is unaffected.
|
|
866
|
+
return this._embedKinds === undefined || this._embedKinds.has(kind);
|
|
867
|
+
}
|
|
940
868
|
/**
|
|
941
869
|
* Read and validate the record at `<scope>/<idStem>.md`, returning `undefined`
|
|
942
870
|
* when the scope directory or file is absent. Verifies the on-disk id ↔
|