@atomicmemory/core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/LICENSE +201 -0
- package/README.md +314 -0
- package/dist/app/bind-ephemeral.d.ts +18 -0
- package/dist/app/bind-ephemeral.js +22 -0
- package/dist/app/cors-headers.d.ts +12 -0
- package/dist/app/cors-headers.js +18 -0
- package/dist/app/create-app.d.ts +25 -0
- package/dist/app/create-app.js +156 -0
- package/dist/app/runtime-config-route-snapshot.d.ts +27 -0
- package/dist/app/runtime-config-route-snapshot.js +27 -0
- package/dist/app/runtime-container.d.ts +281 -0
- package/dist/app/runtime-container.js +297 -0
- package/dist/app/startup-checks.d.ts +28 -0
- package/dist/app/startup-checks.js +45 -0
- package/dist/bin.d.ts +17 -0
- package/dist/bin.js +128 -0
- package/dist/config.d.ts +680 -0
- package/dist/config.js +808 -0
- package/dist/db/agent-trust-repository.d.ts +49 -0
- package/dist/db/agent-trust-repository.js +66 -0
- package/dist/db/belief-edges-repository.d.ts +68 -0
- package/dist/db/belief-edges-repository.js +124 -0
- package/dist/db/claim-repository.d.ts +6 -0
- package/dist/db/claim-repository.js +4 -0
- package/dist/db/contradictions-repository.d.ts +56 -0
- package/dist/db/contradictions-repository.js +88 -0
- package/dist/db/document-chunk-repository.d.ts +48 -0
- package/dist/db/document-chunk-repository.js +145 -0
- package/dist/db/document-chunk-types.d.ts +35 -0
- package/dist/db/document-chunk-types.js +9 -0
- package/dist/db/document-list-cursor.d.ts +45 -0
- package/dist/db/document-list-cursor.js +111 -0
- package/dist/db/document-list-repository.d.ts +103 -0
- package/dist/db/document-list-repository.js +204 -0
- package/dist/db/entity-cards-repository.d.ts +37 -0
- package/dist/db/entity-cards-repository.js +46 -0
- package/dist/db/entity-values-repository.d.ts +26 -0
- package/dist/db/entity-values-repository.js +57 -0
- package/dist/db/link-repository.d.ts +30 -0
- package/dist/db/link-repository.js +54 -0
- package/dist/db/memory-repository.d.ts +163 -0
- package/dist/db/memory-repository.js +232 -0
- package/dist/db/migrate.d.ts +6 -0
- package/dist/db/migrate.js +36 -0
- package/dist/db/mmr.d.ts +14 -0
- package/dist/db/mmr.js +57 -0
- package/dist/db/passport-feed-repository.d.ts +91 -0
- package/dist/db/passport-feed-repository.js +198 -0
- package/dist/db/pg-episode-store.d.ts +19 -0
- package/dist/db/pg-episode-store.js +17 -0
- package/dist/db/pg-link-store.d.ts +17 -0
- package/dist/db/pg-link-store.js +14 -0
- package/dist/db/pg-memory-store.d.ts +68 -0
- package/dist/db/pg-memory-store.js +53 -0
- package/dist/db/pg-recap-store.d.ts +13 -0
- package/dist/db/pg-recap-store.js +19 -0
- package/dist/db/pg-representation-store.d.ts +17 -0
- package/dist/db/pg-representation-store.js +17 -0
- package/dist/db/pg-search-store.d.ts +29 -0
- package/dist/db/pg-search-store.js +47 -0
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +21 -0
- package/dist/db/ppr.d.ts +56 -0
- package/dist/db/ppr.js +178 -0
- package/dist/db/query-helpers.d.ts +44 -0
- package/dist/db/query-helpers.js +60 -0
- package/dist/db/raw-doc-artifact-sync.d.ts +128 -0
- package/dist/db/raw-doc-artifact-sync.js +259 -0
- package/dist/db/raw-document-blob-repository.d.ts +148 -0
- package/dist/db/raw-document-blob-repository.js +300 -0
- package/dist/db/raw-document-repository.d.ts +104 -0
- package/dist/db/raw-document-repository.js +410 -0
- package/dist/db/raw-document-status-repository.d.ts +122 -0
- package/dist/db/raw-document-status-repository.js +183 -0
- package/dist/db/raw-document-types.d.ts +236 -0
- package/dist/db/raw-document-types.js +10 -0
- package/dist/db/raw-storage-reconciliation-repository.d.ts +110 -0
- package/dist/db/raw-storage-reconciliation-repository.js +200 -0
- package/dist/db/reflection-jobs-repository.d.ts +33 -0
- package/dist/db/reflection-jobs-repository.js +48 -0
- package/dist/db/reflections-repository.d.ts +41 -0
- package/dist/db/reflections-repository.js +83 -0
- package/dist/db/repository-claims.d.ts +141 -0
- package/dist/db/repository-claims.js +376 -0
- package/dist/db/repository-deferred-audn.d.ts +33 -0
- package/dist/db/repository-deferred-audn.js +69 -0
- package/dist/db/repository-document-delete.d.ts +53 -0
- package/dist/db/repository-document-delete.js +156 -0
- package/dist/db/repository-entities.d.ts +114 -0
- package/dist/db/repository-entities.js +317 -0
- package/dist/db/repository-entity-attributes.d.ts +41 -0
- package/dist/db/repository-entity-attributes.js +65 -0
- package/dist/db/repository-entity-graph.d.ts +32 -0
- package/dist/db/repository-entity-graph.js +87 -0
- package/dist/db/repository-first-mentions.d.ts +41 -0
- package/dist/db/repository-first-mentions.js +79 -0
- package/dist/db/repository-lessons.d.ts +51 -0
- package/dist/db/repository-lessons.js +90 -0
- package/dist/db/repository-links.d.ts +26 -0
- package/dist/db/repository-links.js +105 -0
- package/dist/db/repository-observation.d.ts +26 -0
- package/dist/db/repository-observation.js +51 -0
- package/dist/db/repository-read.d.ts +56 -0
- package/dist/db/repository-read.js +271 -0
- package/dist/db/repository-recaps.d.ts +59 -0
- package/dist/db/repository-recaps.js +158 -0
- package/dist/db/repository-representations.d.ts +48 -0
- package/dist/db/repository-representations.js +162 -0
- package/dist/db/repository-temporal-state.d.ts +35 -0
- package/dist/db/repository-temporal-state.js +46 -0
- package/dist/db/repository-tll.d.ts +88 -0
- package/dist/db/repository-tll.js +179 -0
- package/dist/db/repository-types.d.ts +313 -0
- package/dist/db/repository-types.js +142 -0
- package/dist/db/repository-user-profiles.d.ts +17 -0
- package/dist/db/repository-user-profiles.js +28 -0
- package/dist/db/repository-vector-search.d.ts +33 -0
- package/dist/db/repository-vector-search.js +373 -0
- package/dist/db/repository-wipe.d.ts +34 -0
- package/dist/db/repository-wipe.js +94 -0
- package/dist/db/repository-write.d.ts +61 -0
- package/dist/db/repository-write.js +279 -0
- package/dist/db/schema.sql +1355 -0
- package/dist/db/storage-artifact-delete-tx.d.ts +56 -0
- package/dist/db/storage-artifact-delete-tx.js +123 -0
- package/dist/db/storage-artifact-providers.d.ts +21 -0
- package/dist/db/storage-artifact-providers.js +21 -0
- package/dist/db/storage-artifact-recovery-repository.d.ts +66 -0
- package/dist/db/storage-artifact-recovery-repository.js +58 -0
- package/dist/db/storage-artifact-repository.d.ts +329 -0
- package/dist/db/storage-artifact-repository.js +497 -0
- package/dist/db/stores.d.ts +220 -0
- package/dist/db/stores.js +12 -0
- package/dist/db/summaries-repository.d.ts +74 -0
- package/dist/db/summaries-repository.js +125 -0
- package/dist/eval/beam-10m-loader.d.ts +98 -0
- package/dist/eval/beam-10m-loader.js +128 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +17 -0
- package/dist/middleware/require-bearer.d.ts +27 -0
- package/dist/middleware/require-bearer.js +60 -0
- package/dist/middleware/validate-response.d.ts +33 -0
- package/dist/middleware/validate-response.js +55 -0
- package/dist/middleware/validate.d.ts +43 -0
- package/dist/middleware/validate.js +85 -0
- package/dist/routes/agents.d.ts +13 -0
- package/dist/routes/agents.js +89 -0
- package/dist/routes/document-response-formatters.d.ts +98 -0
- package/dist/routes/document-response-formatters.js +243 -0
- package/dist/routes/documents.d.ts +74 -0
- package/dist/routes/documents.js +425 -0
- package/dist/routes/memories.d.ts +29 -0
- package/dist/routes/memories.js +725 -0
- package/dist/routes/memory-response-formatters.d.ts +179 -0
- package/dist/routes/memory-response-formatters.js +210 -0
- package/dist/routes/public-raw-storage-metadata.d.ts +54 -0
- package/dist/routes/public-raw-storage-metadata.js +56 -0
- package/dist/routes/reflect.d.ts +14 -0
- package/dist/routes/reflect.js +19 -0
- package/dist/routes/response-schema-map.d.ts +14 -0
- package/dist/routes/response-schema-map.js +69 -0
- package/dist/routes/route-errors.d.ts +12 -0
- package/dist/routes/route-errors.js +30 -0
- package/dist/routes/storage-error-handlers.d.ts +34 -0
- package/dist/routes/storage-error-handlers.js +185 -0
- package/dist/routes/storage-response-formatters.d.ts +44 -0
- package/dist/routes/storage-response-formatters.js +155 -0
- package/dist/routes/storage.d.ts +38 -0
- package/dist/routes/storage.js +369 -0
- package/dist/routes/upstream-provider-errors.d.ts +19 -0
- package/dist/routes/upstream-provider-errors.js +95 -0
- package/dist/schemas/agents.d.ts +79 -0
- package/dist/schemas/agents.js +126 -0
- package/dist/schemas/common.d.ts +110 -0
- package/dist/schemas/common.js +190 -0
- package/dist/schemas/document-list-responses.d.ts +102 -0
- package/dist/schemas/document-list-responses.js +87 -0
- package/dist/schemas/document-list-schemas.d.ts +123 -0
- package/dist/schemas/document-list-schemas.js +174 -0
- package/dist/schemas/document-response-schemas.d.ts +610 -0
- package/dist/schemas/document-response-schemas.js +264 -0
- package/dist/schemas/document-status-envelope.d.ts +48 -0
- package/dist/schemas/document-status-envelope.js +54 -0
- package/dist/schemas/documents.d.ts +292 -0
- package/dist/schemas/documents.js +449 -0
- package/dist/schemas/errors.d.ts +75 -0
- package/dist/schemas/errors.js +105 -0
- package/dist/schemas/memories.d.ts +378 -0
- package/dist/schemas/memories.js +542 -0
- package/dist/schemas/openapi.d.ts +24 -0
- package/dist/schemas/openapi.js +1038 -0
- package/dist/schemas/response-scalars.d.ts +10 -0
- package/dist/schemas/response-scalars.js +10 -0
- package/dist/schemas/responses.d.ts +536 -0
- package/dist/schemas/responses.js +350 -0
- package/dist/schemas/search-response-parts.d.ts +97 -0
- package/dist/schemas/search-response-parts.js +103 -0
- package/dist/schemas/storage-schemas.d.ts +175 -0
- package/dist/schemas/storage-schemas.js +277 -0
- package/dist/schemas/zod-setup.d.ts +15 -0
- package/dist/schemas/zod-setup.js +17 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.js +57 -0
- package/dist/services/abstract-query-policy.d.ts +13 -0
- package/dist/services/abstract-query-policy.js +50 -0
- package/dist/services/affinity-clustering.d.ts +66 -0
- package/dist/services/affinity-clustering.js +125 -0
- package/dist/services/agentic-retrieval.d.ts +38 -0
- package/dist/services/agentic-retrieval.js +126 -0
- package/dist/services/answer-format.d.ts +56 -0
- package/dist/services/answer-format.js +118 -0
- package/dist/services/answer-rescue.d.ts +72 -0
- package/dist/services/answer-rescue.js +177 -0
- package/dist/services/answer-verifier.d.ts +24 -0
- package/dist/services/answer-verifier.js +73 -0
- package/dist/services/api-retry.d.ts +6 -0
- package/dist/services/api-retry.js +41 -0
- package/dist/services/assistant-turn-filter.d.ts +20 -0
- package/dist/services/assistant-turn-filter.js +69 -0
- package/dist/services/atomicmem-uri.d.ts +33 -0
- package/dist/services/atomicmem-uri.js +86 -0
- package/dist/services/audit-events.d.ts +54 -0
- package/dist/services/audit-events.js +56 -0
- package/dist/services/chunked-extraction.d.ts +21 -0
- package/dist/services/chunked-extraction.js +108 -0
- package/dist/services/claim-slotting.d.ts +27 -0
- package/dist/services/claim-slotting.js +38 -0
- package/dist/services/claude-code-llm.d.ts +19 -0
- package/dist/services/claude-code-llm.js +96 -0
- package/dist/services/composite-dedup.d.ts +50 -0
- package/dist/services/composite-dedup.js +153 -0
- package/dist/services/composite-grouping.d.ts +41 -0
- package/dist/services/composite-grouping.js +111 -0
- package/dist/services/composite-staleness.d.ts +20 -0
- package/dist/services/composite-staleness.js +50 -0
- package/dist/services/conciseness-preference.d.ts +14 -0
- package/dist/services/conciseness-preference.js +42 -0
- package/dist/services/conflict-policy.d.ts +20 -0
- package/dist/services/conflict-policy.js +335 -0
- package/dist/services/consensus-extraction.d.ts +39 -0
- package/dist/services/consensus-extraction.js +147 -0
- package/dist/services/consensus-validation.d.ts +52 -0
- package/dist/services/consensus-validation.js +206 -0
- package/dist/services/consolidation-service.d.ts +60 -0
- package/dist/services/consolidation-service.js +171 -0
- package/dist/services/content-detection.d.ts +18 -0
- package/dist/services/content-detection.js +25 -0
- package/dist/services/contradiction-surfacing.d.ts +62 -0
- package/dist/services/contradiction-surfacing.js +111 -0
- package/dist/services/cost-telemetry.d.ts +39 -0
- package/dist/services/cost-telemetry.js +58 -0
- package/dist/services/counter-evidence.d.ts +34 -0
- package/dist/services/counter-evidence.js +92 -0
- package/dist/services/current-state-ranking.d.ts +21 -0
- package/dist/services/current-state-ranking.js +152 -0
- package/dist/services/deferred-audn.d.ts +47 -0
- package/dist/services/deferred-audn.js +162 -0
- package/dist/services/document-chunker.d.ts +50 -0
- package/dist/services/document-chunker.js +153 -0
- package/dist/services/document-failure-markers.d.ts +91 -0
- package/dist/services/document-failure-markers.js +305 -0
- package/dist/services/document-indexer.d.ts +122 -0
- package/dist/services/document-indexer.js +405 -0
- package/dist/services/document-service.d.ts +245 -0
- package/dist/services/document-service.js +325 -0
- package/dist/services/document-upload-artifact-sync.d.ts +80 -0
- package/dist/services/document-upload-artifact-sync.js +162 -0
- package/dist/services/document-upload-beta2-recovery.d.ts +72 -0
- package/dist/services/document-upload-beta2-recovery.js +94 -0
- package/dist/services/document-upload.d.ts +44 -0
- package/dist/services/document-upload.js +353 -0
- package/dist/services/embedding.d.ts +57 -0
- package/dist/services/embedding.js +416 -0
- package/dist/services/entity-attribute-extractor.d.ts +34 -0
- package/dist/services/entity-attribute-extractor.js +117 -0
- package/dist/services/entity-card-synthesis.d.ts +54 -0
- package/dist/services/entity-card-synthesis.js +92 -0
- package/dist/services/entity-dedup.d.ts +9 -0
- package/dist/services/entity-dedup.js +14 -0
- package/dist/services/entity-graph.d.ts +17 -0
- package/dist/services/entity-graph.js +135 -0
- package/dist/services/entropy-gate.d.ts +52 -0
- package/dist/services/entropy-gate.js +56 -0
- package/dist/services/episode-fetcher.d.ts +47 -0
- package/dist/services/episode-fetcher.js +128 -0
- package/dist/services/event-anchor-facts.d.ts +8 -0
- package/dist/services/event-anchor-facts.js +205 -0
- package/dist/services/event-chain-detector.d.ts +52 -0
- package/dist/services/event-chain-detector.js +83 -0
- package/dist/services/extraction-cache.d.ts +9 -0
- package/dist/services/extraction-cache.js +54 -0
- package/dist/services/extraction-enrichment.d.ts +9 -0
- package/dist/services/extraction-enrichment.js +223 -0
- package/dist/services/extraction.d.ts +69 -0
- package/dist/services/extraction.js +596 -0
- package/dist/services/fact-normalization.d.ts +12 -0
- package/dist/services/fact-normalization.js +248 -0
- package/dist/services/filecoin-observability.d.ts +127 -0
- package/dist/services/filecoin-observability.js +200 -0
- package/dist/services/first-mention-service.d.ts +76 -0
- package/dist/services/first-mention-service.js +186 -0
- package/dist/services/hierarchical-retrieval.d.ts +49 -0
- package/dist/services/hierarchical-retrieval.js +50 -0
- package/dist/services/ingest-fact-pipeline.d.ts +32 -0
- package/dist/services/ingest-fact-pipeline.js +212 -0
- package/dist/services/ingest-post-write.d.ts +50 -0
- package/dist/services/ingest-post-write.js +117 -0
- package/dist/services/ingest-trace.d.ts +32 -0
- package/dist/services/ingest-trace.js +60 -0
- package/dist/services/input-sanitizer.d.ts +41 -0
- package/dist/services/input-sanitizer.js +135 -0
- package/dist/services/iterative-retrieval.d.ts +26 -0
- package/dist/services/iterative-retrieval.js +139 -0
- package/dist/services/keyword-expansion.d.ts +10 -0
- package/dist/services/keyword-expansion.js +26 -0
- package/dist/services/lesson-service.d.ts +68 -0
- package/dist/services/lesson-service.js +178 -0
- package/dist/services/literal-extractor.d.ts +16 -0
- package/dist/services/literal-extractor.js +74 -0
- package/dist/services/literal-list-protection.d.ts +17 -0
- package/dist/services/literal-list-protection.js +134 -0
- package/dist/services/literal-query-expansion.d.ts +20 -0
- package/dist/services/literal-query-expansion.js +181 -0
- package/dist/services/llm.d.ts +61 -0
- package/dist/services/llm.js +265 -0
- package/dist/services/memcell-projection.d.ts +17 -0
- package/dist/services/memcell-projection.js +41 -0
- package/dist/services/memory-audn.d.ts +43 -0
- package/dist/services/memory-audn.js +419 -0
- package/dist/services/memory-crud.d.ts +93 -0
- package/dist/services/memory-crud.js +255 -0
- package/dist/services/memory-ingest.d.ts +21 -0
- package/dist/services/memory-ingest.js +249 -0
- package/dist/services/memory-lifecycle.d.ts +75 -0
- package/dist/services/memory-lifecycle.js +108 -0
- package/dist/services/memory-lineage.d.ts +181 -0
- package/dist/services/memory-lineage.js +232 -0
- package/dist/services/memory-network.d.ts +40 -0
- package/dist/services/memory-network.js +75 -0
- package/dist/services/memory-search-types.d.ts +25 -0
- package/dist/services/memory-search-types.js +10 -0
- package/dist/services/memory-search.d.ts +48 -0
- package/dist/services/memory-search.js +505 -0
- package/dist/services/memory-service-types.d.ts +371 -0
- package/dist/services/memory-service-types.js +8 -0
- package/dist/services/memory-service.d.ts +152 -0
- package/dist/services/memory-service.js +225 -0
- package/dist/services/memory-storage.d.ts +33 -0
- package/dist/services/memory-storage.js +328 -0
- package/dist/services/msr-aggregator.d.ts +38 -0
- package/dist/services/msr-aggregator.js +97 -0
- package/dist/services/msr-detector.d.ts +35 -0
- package/dist/services/msr-detector.js +65 -0
- package/dist/services/namespace-retrieval.d.ts +60 -0
- package/dist/services/namespace-retrieval.js +180 -0
- package/dist/services/observation-date-extraction.d.ts +12 -0
- package/dist/services/observation-date-extraction.js +50 -0
- package/dist/services/observation-service.d.ts +27 -0
- package/dist/services/observation-service.js +84 -0
- package/dist/services/packaging-observability.d.ts +29 -0
- package/dist/services/packaging-observability.js +146 -0
- package/dist/services/query-expansion.d.ts +83 -0
- package/dist/services/query-expansion.js +242 -0
- package/dist/services/query-keyword-matches.d.ts +6 -0
- package/dist/services/query-keyword-matches.js +56 -0
- package/dist/services/query-term-visibility.d.ts +28 -0
- package/dist/services/query-term-visibility.js +100 -0
- package/dist/services/quick-extraction.d.ts +25 -0
- package/dist/services/quick-extraction.js +431 -0
- package/dist/services/quoted-entity-extraction.d.ts +10 -0
- package/dist/services/quoted-entity-extraction.js +161 -0
- package/dist/services/raw-storage-reconciler-backoff.d.ts +8 -0
- package/dist/services/raw-storage-reconciler-backoff.js +14 -0
- package/dist/services/raw-storage-reconciler-scheduler.d.ts +29 -0
- package/dist/services/raw-storage-reconciler-scheduler.js +43 -0
- package/dist/services/raw-storage-reconciler.d.ts +71 -0
- package/dist/services/raw-storage-reconciler.js +278 -0
- package/dist/services/recap-builder.d.ts +49 -0
- package/dist/services/recap-builder.js +157 -0
- package/dist/services/reflect-jobs.d.ts +23 -0
- package/dist/services/reflect-jobs.js +36 -0
- package/dist/services/reflect-prompts.d.ts +71 -0
- package/dist/services/reflect-prompts.js +99 -0
- package/dist/services/reflect-retrieval.d.ts +33 -0
- package/dist/services/reflect-retrieval.js +30 -0
- package/dist/services/reflect.d.ts +49 -0
- package/dist/services/reflect.js +84 -0
- package/dist/services/relative-temporal.d.ts +14 -0
- package/dist/services/relative-temporal.js +163 -0
- package/dist/services/relevance-policy.d.ts +37 -0
- package/dist/services/relevance-policy.js +109 -0
- package/dist/services/rerank.d.ts +32 -0
- package/dist/services/rerank.js +118 -0
- package/dist/services/reranker.d.ts +20 -0
- package/dist/services/reranker.js +99 -0
- package/dist/services/retrieval-channel-rules.d.ts +34 -0
- package/dist/services/retrieval-channel-rules.js +41 -0
- package/dist/services/retrieval-config-overlay.d.ts +36 -0
- package/dist/services/retrieval-config-overlay.js +44 -0
- package/dist/services/retrieval-format.d.ts +119 -0
- package/dist/services/retrieval-format.js +559 -0
- package/dist/services/retrieval-policy.d.ts +69 -0
- package/dist/services/retrieval-policy.js +275 -0
- package/dist/services/retrieval-profiles.d.ts +37 -0
- package/dist/services/retrieval-profiles.js +90 -0
- package/dist/services/retrieval-side-effects.d.ts +14 -0
- package/dist/services/retrieval-side-effects.js +26 -0
- package/dist/services/retrieval-trace.d.ts +108 -0
- package/dist/services/retrieval-trace.js +147 -0
- package/dist/services/rrf-fusion.d.ts +18 -0
- package/dist/services/rrf-fusion.js +34 -0
- package/dist/services/search-pipeline.d.ts +71 -0
- package/dist/services/search-pipeline.js +788 -0
- package/dist/services/session-date.d.ts +20 -0
- package/dist/services/session-date.js +61 -0
- package/dist/services/session-packaging.d.ts +53 -0
- package/dist/services/session-packaging.js +182 -0
- package/dist/services/session-summary-generator.d.ts +53 -0
- package/dist/services/session-summary-generator.js +134 -0
- package/dist/services/specialists/cr-specialist.d.ts +52 -0
- package/dist/services/specialists/cr-specialist.js +121 -0
- package/dist/services/specialists/dispatch.d.ts +53 -0
- package/dist/services/specialists/dispatch.js +102 -0
- package/dist/services/specialists/ie-ku-specialist.d.ts +37 -0
- package/dist/services/specialists/ie-ku-specialist.js +63 -0
- package/dist/services/specialists/msr-specialist.d.ts +61 -0
- package/dist/services/specialists/msr-specialist.js +162 -0
- package/dist/services/specialists/tr-specialist.d.ts +37 -0
- package/dist/services/specialists/tr-specialist.js +146 -0
- package/dist/services/storage-key-prefix.d.ts +42 -0
- package/dist/services/storage-key-prefix.js +45 -0
- package/dist/services/storage-put-recovery.d.ts +71 -0
- package/dist/services/storage-put-recovery.js +269 -0
- package/dist/services/storage-service-errors.d.ts +124 -0
- package/dist/services/storage-service-errors.js +189 -0
- package/dist/services/storage-service.d.ts +176 -0
- package/dist/services/storage-service.js +423 -0
- package/dist/services/subject-aware-ranking.d.ts +19 -0
- package/dist/services/subject-aware-ranking.js +161 -0
- package/dist/services/supplemental-extraction.d.ts +7 -0
- package/dist/services/supplemental-extraction.js +116 -0
- package/dist/services/tbc-execution.d.ts +49 -0
- package/dist/services/tbc-execution.js +284 -0
- package/dist/services/temporal-classifier.d.ts +56 -0
- package/dist/services/temporal-classifier.js +94 -0
- package/dist/services/temporal-endpoint-evidence.d.ts +12 -0
- package/dist/services/temporal-endpoint-evidence.js +313 -0
- package/dist/services/temporal-fingerprint.d.ts +6 -0
- package/dist/services/temporal-fingerprint.js +12 -0
- package/dist/services/temporal-format.d.ts +9 -0
- package/dist/services/temporal-format.js +21 -0
- package/dist/services/temporal-intent.d.ts +39 -0
- package/dist/services/temporal-intent.js +78 -0
- package/dist/services/temporal-query-constraints.d.ts +16 -0
- package/dist/services/temporal-query-constraints.js +107 -0
- package/dist/services/temporal-query-expansion.d.ts +14 -0
- package/dist/services/temporal-query-expansion.js +131 -0
- package/dist/services/temporal-rerank.d.ts +22 -0
- package/dist/services/temporal-rerank.js +47 -0
- package/dist/services/temporal-result-protection.d.ts +7 -0
- package/dist/services/temporal-result-protection.js +60 -0
- package/dist/services/temporal-state-write.d.ts +57 -0
- package/dist/services/temporal-state-write.js +45 -0
- package/dist/services/tiered-context.d.ts +87 -0
- package/dist/services/tiered-context.js +214 -0
- package/dist/services/tiered-loading.d.ts +88 -0
- package/dist/services/tiered-loading.js +263 -0
- package/dist/services/timeline-pack.d.ts +36 -0
- package/dist/services/timeline-pack.js +50 -0
- package/dist/services/timing.d.ts +13 -0
- package/dist/services/timing.js +72 -0
- package/dist/services/tll-augmentation.d.ts +20 -0
- package/dist/services/tll-augmentation.js +125 -0
- package/dist/services/tll-retrieval.d.ts +55 -0
- package/dist/services/tll-retrieval.js +101 -0
- package/dist/services/topic-abstraction.d.ts +36 -0
- package/dist/services/topic-abstraction.js +105 -0
- package/dist/services/trust-scoring.d.ts +43 -0
- package/dist/services/trust-scoring.js +89 -0
- package/dist/services/typed-belief-calculus.d.ts +126 -0
- package/dist/services/typed-belief-calculus.js +204 -0
- package/dist/services/upload-config.d.ts +34 -0
- package/dist/services/upload-config.js +23 -0
- package/dist/services/upload-decision.d.ts +65 -0
- package/dist/services/upload-decision.js +98 -0
- package/dist/services/upload-helpers.d.ts +107 -0
- package/dist/services/upload-helpers.js +148 -0
- package/dist/services/user-profile-builder.d.ts +22 -0
- package/dist/services/user-profile-builder.js +109 -0
- package/dist/services/voyage-embedding.d.ts +22 -0
- package/dist/services/voyage-embedding.js +77 -0
- package/dist/services/write-security.d.ts +31 -0
- package/dist/services/write-security.js +64 -0
- package/dist/storage/artifact-public-redaction.d.ts +34 -0
- package/dist/storage/artifact-public-redaction.js +83 -0
- package/dist/storage/cleanup.d.ts +103 -0
- package/dist/storage/cleanup.js +138 -0
- package/dist/storage/codec-factory.d.ts +17 -0
- package/dist/storage/codec-factory.js +33 -0
- package/dist/storage/codecs/aes-gcm-codec.d.ts +44 -0
- package/dist/storage/codecs/aes-gcm-codec.js +108 -0
- package/dist/storage/codecs/noop-codec.d.ts +16 -0
- package/dist/storage/codecs/noop-codec.js +23 -0
- package/dist/storage/factory.d.ts +44 -0
- package/dist/storage/factory.js +99 -0
- package/dist/storage/filecoin-cid-validation.d.ts +82 -0
- package/dist/storage/filecoin-cid-validation.js +122 -0
- package/dist/storage/filecoin-public-metadata.d.ts +73 -0
- package/dist/storage/filecoin-public-metadata.js +110 -0
- package/dist/storage/local-fs-store.d.ts +39 -0
- package/dist/storage/local-fs-store.js +145 -0
- package/dist/storage/pointer-uri-allowlist.d.ts +38 -0
- package/dist/storage/pointer-uri-allowlist.js +70 -0
- package/dist/storage/provider-metadata-projection.d.ts +27 -0
- package/dist/storage/provider-metadata-projection.js +68 -0
- package/dist/storage/providers/filecoin/backend.d.ts +42 -0
- package/dist/storage/providers/filecoin/backend.js +250 -0
- package/dist/storage/providers/filecoin/config.d.ts +70 -0
- package/dist/storage/providers/filecoin/config.js +275 -0
- package/dist/storage/providers/filecoin/errors.d.ts +45 -0
- package/dist/storage/providers/filecoin/errors.js +56 -0
- package/dist/storage/providers/filecoin/filecoin-pin-car.d.ts +78 -0
- package/dist/storage/providers/filecoin/filecoin-pin-car.js +155 -0
- package/dist/storage/providers/filecoin/filecoin-pin-client.d.ts +92 -0
- package/dist/storage/providers/filecoin/filecoin-pin-client.js +199 -0
- package/dist/storage/providers/filecoin/filecoin-pin-mapping.d.ts +58 -0
- package/dist/storage/providers/filecoin/filecoin-pin-mapping.js +103 -0
- package/dist/storage/providers/filecoin/filecoin-pin-timeout.d.ts +30 -0
- package/dist/storage/providers/filecoin/filecoin-pin-timeout.js +53 -0
- package/dist/storage/providers/filecoin/filecoin-pin-vendor.d.ts +111 -0
- package/dist/storage/providers/filecoin/filecoin-pin-vendor.js +87 -0
- package/dist/storage/providers/filecoin/hints.d.ts +71 -0
- package/dist/storage/providers/filecoin/hints.js +123 -0
- package/dist/storage/providers/filecoin/index.d.ts +51 -0
- package/dist/storage/providers/filecoin/index.js +103 -0
- package/dist/storage/providers/filecoin/ipfs-cid.d.ts +50 -0
- package/dist/storage/providers/filecoin/ipfs-cid.js +64 -0
- package/dist/storage/providers/filecoin/metadata.d.ts +72 -0
- package/dist/storage/providers/filecoin/metadata.js +137 -0
- package/dist/storage/providers/filecoin/piece-cid.d.ts +48 -0
- package/dist/storage/providers/filecoin/piece-cid.js +57 -0
- package/dist/storage/providers/filecoin/provider-client.d.ts +234 -0
- package/dist/storage/providers/filecoin/provider-client.js +27 -0
- package/dist/storage/providers/filecoin/readiness.d.ts +62 -0
- package/dist/storage/providers/filecoin/readiness.js +85 -0
- package/dist/storage/providers/filecoin/retriever.d.ts +82 -0
- package/dist/storage/providers/filecoin/retriever.js +63 -0
- package/dist/storage/providers/filecoin/skeleton-client.d.ts +36 -0
- package/dist/storage/providers/filecoin/skeleton-client.js +55 -0
- package/dist/storage/providers/filecoin/synapse-client.d.ts +169 -0
- package/dist/storage/providers/filecoin/synapse-client.js +343 -0
- package/dist/storage/providers/filecoin/synapse-construction.d.ts +26 -0
- package/dist/storage/providers/filecoin/synapse-construction.js +47 -0
- package/dist/storage/providers/filecoin/synapse-error-mapping.d.ts +23 -0
- package/dist/storage/providers/filecoin/synapse-error-mapping.js +49 -0
- package/dist/storage/providers/filecoin/synapse-readiness.d.ts +37 -0
- package/dist/storage/providers/filecoin/synapse-readiness.js +231 -0
- package/dist/storage/providers/filecoin/uri.d.ts +49 -0
- package/dist/storage/providers/filecoin/uri.js +84 -0
- package/dist/storage/providers/filecoin/verified-fetch-lifecycle.d.ts +77 -0
- package/dist/storage/providers/filecoin/verified-fetch-lifecycle.js +196 -0
- package/dist/storage/providers/filecoin/verified-fetch-retriever.d.ts +54 -0
- package/dist/storage/providers/filecoin/verified-fetch-retriever.js +81 -0
- package/dist/storage/providers/filecoin/verified-fetch-vendor.d.ts +71 -0
- package/dist/storage/providers/filecoin/verified-fetch-vendor.js +94 -0
- package/dist/storage/raw-content-codec.d.ts +89 -0
- package/dist/storage/raw-content-codec.js +47 -0
- package/dist/storage/raw-content-store-backend-adapter.d.ts +28 -0
- package/dist/storage/raw-content-store-backend-adapter.js +67 -0
- package/dist/storage/raw-content-store.d.ts +228 -0
- package/dist/storage/raw-content-store.js +27 -0
- package/dist/storage/s3-store.d.ts +42 -0
- package/dist/storage/s3-store.js +181 -0
- package/dist/storage/storage-backend-registry.d.ts +58 -0
- package/dist/storage/storage-backend-registry.js +56 -0
- package/dist/storage/storage-backend.d.ts +82 -0
- package/dist/storage/storage-backend.js +14 -0
- package/dist/storage/storage-capabilities.d.ts +56 -0
- package/dist/storage/storage-capabilities.js +170 -0
- package/dist/storage/store-registry.d.ts +67 -0
- package/dist/storage/store-registry.js +77 -0
- package/dist/vector-math.d.ts +15 -0
- package/dist/vector-math.js +31 -0
- package/dist/xml-escape.d.ts +5 -0
- package/dist/xml-escape.js +7 -0
- package/openapi.json +15395 -0
- package/openapi.yaml +10794 -0
- package/package.json +119 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRUD operations and auxiliary methods extracted from MemoryService.
|
|
3
|
+
* Covers list, get, delete, stats, consolidation, decay, audit, lessons, and backfill.
|
|
4
|
+
*/
|
|
5
|
+
import { config } from '../config.js';
|
|
6
|
+
import { findConsolidationCandidates, executeConsolidation } from './consolidation-service.js';
|
|
7
|
+
import { evaluateDecayCandidates, checkMemoryCap } from './memory-lifecycle.js';
|
|
8
|
+
import { emitAuditEvent } from './audit-events.js';
|
|
9
|
+
import { reconcileUser, reconcileAll, getReconciliationStatus } from './deferred-audn.js';
|
|
10
|
+
import { buildPersistedRelationClaimSlot } from './claim-slotting.js';
|
|
11
|
+
import { cleanupManagedBlobs, ManagedBlobCleanupError } from '../storage/cleanup.js';
|
|
12
|
+
import { singleStoreRegistry } from '../storage/store-registry.js';
|
|
13
|
+
import { listOrphanedManagedBlobsBySource, } from '../db/raw-document-blob-repository.js';
|
|
14
|
+
import { markCleanupFailedAndSyncArtifact, markCleanupSuccessAndSyncArtifact, } from '../db/raw-doc-artifact-sync.js';
|
|
15
|
+
export async function listMemories(deps, userId, limit = 20, offset = 0, sourceSite, episodeId) {
|
|
16
|
+
return deps.stores.memory.listMemories(userId, limit, offset, sourceSite, episodeId);
|
|
17
|
+
}
|
|
18
|
+
export async function listMemoriesInWorkspace(deps, workspaceId, limit = 20, offset = 0, callerAgentId) {
|
|
19
|
+
return deps.stores.memory.listMemoriesInWorkspace(workspaceId, limit, offset, callerAgentId);
|
|
20
|
+
}
|
|
21
|
+
export async function getMemory(deps, id, userId) {
|
|
22
|
+
return deps.stores.memory.getMemory(id, userId);
|
|
23
|
+
}
|
|
24
|
+
export async function getMemoryInWorkspace(deps, id, workspaceId, callerAgentId) {
|
|
25
|
+
return deps.stores.memory.getMemoryInWorkspace(id, workspaceId, callerAgentId);
|
|
26
|
+
}
|
|
27
|
+
/** Workspace delete enforces visibility: returns false if caller can't see the memory. */
|
|
28
|
+
export async function deleteMemoryInWorkspace(deps, id, workspaceId, callerAgentId) {
|
|
29
|
+
const memory = await deps.stores.memory.getMemoryInWorkspace(id, workspaceId, callerAgentId);
|
|
30
|
+
if (!memory)
|
|
31
|
+
return false;
|
|
32
|
+
await deps.stores.memory.softDeleteMemoryInWorkspace(id, workspaceId);
|
|
33
|
+
if (config.auditLoggingEnabled) {
|
|
34
|
+
emitAuditEvent('memory:delete', '', {}, { memoryId: id, workspaceId });
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
/** Expand staged summaries to full content for on-demand loading. */
|
|
39
|
+
export async function expandMemories(deps, userId, memoryIds) {
|
|
40
|
+
const fetched = await Promise.all(memoryIds.map((id) => deps.stores.memory.getMemory(id, userId)));
|
|
41
|
+
return fetched.filter(Boolean).map((m) => ({ id: m.id, content: m.content }));
|
|
42
|
+
}
|
|
43
|
+
export async function expandMemoriesInWorkspace(deps, workspaceId, memoryIds, callerAgentId) {
|
|
44
|
+
const fetched = await Promise.all(memoryIds.map((id) => deps.stores.memory.getMemoryInWorkspace(id, workspaceId, callerAgentId)));
|
|
45
|
+
return fetched.filter(Boolean).map((m) => ({ id: m.id, content: m.content }));
|
|
46
|
+
}
|
|
47
|
+
export async function deleteMemory(deps, id, userId) {
|
|
48
|
+
const version = await deps.stores.claim.getClaimVersionByMemoryId(userId, id);
|
|
49
|
+
const target = version ? { claimId: version.claim_id, versionId: version.id } : null;
|
|
50
|
+
await deps.stores.memory.softDeleteMemory(userId, id);
|
|
51
|
+
if (config.auditLoggingEnabled) {
|
|
52
|
+
emitAuditEvent('memory:delete', userId, {}, { memoryId: id });
|
|
53
|
+
}
|
|
54
|
+
if (!target)
|
|
55
|
+
return;
|
|
56
|
+
await deps.stores.claim.supersedeClaimVersion(userId, target.versionId, null);
|
|
57
|
+
await deps.stores.claim.invalidateClaim(userId, target.claimId);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Delete all memories, episodes, claims, and related data for a user + source_site,
|
|
61
|
+
* and tombstone (soft-delete) every `raw_documents` row registered against the
|
|
62
|
+
* same source. Surgical reset scoped to a single source -- does NOT wipe the whole user.
|
|
63
|
+
*/
|
|
64
|
+
export async function resetBySource(deps, userId, sourceSite) {
|
|
65
|
+
const result = await deps.stores.memory.deleteBySource(userId, sourceSite);
|
|
66
|
+
// Cleanup target: blobs the cascade just tombstoned, OR — when the
|
|
67
|
+
// cascade found nothing fresh to soft-delete (typical retry path) —
|
|
68
|
+
// the orphan blobs left behind by a previously-failed cleanup pass
|
|
69
|
+
// for this source. Without this lookup, a retry of source reset
|
|
70
|
+
// could see zero active rows, skip cleanup, and report success
|
|
71
|
+
// while bytes were still on disk.
|
|
72
|
+
const blobsToClean = result.blobs.length > 0
|
|
73
|
+
? result.blobs
|
|
74
|
+
: await listOrphanedManagedBlobsBySource(deps.stores.pool, userId, sourceSite);
|
|
75
|
+
if (blobsToClean.length > 0) {
|
|
76
|
+
const registry = deps.storeRegistry ?? singleStoreRegistry(deps.rawContentStore ?? null);
|
|
77
|
+
const cleanup = await cleanupManagedBlobs(registry, blobsToClean);
|
|
78
|
+
// Mark partial successes terminal *before* throwing. A mixed-result
|
|
79
|
+
// cleanup that doesn't record the wins would leak retry work onto
|
|
80
|
+
// rows that are already clean. The marker is chosen by the
|
|
81
|
+
// adapter's `semantics` field — `'deleted'` → `blob_deleted`,
|
|
82
|
+
// `'unpinned'`/`'tombstoned'` → `blob_tombstoned` (Phase 4a §1).
|
|
83
|
+
for (const success of cleanup.successes) {
|
|
84
|
+
await markCleanupSuccessAndSyncArtifact(deps.stores.pool, {
|
|
85
|
+
userId,
|
|
86
|
+
rawDocumentId: success.rawDocumentId,
|
|
87
|
+
storageUri: success.storageUri,
|
|
88
|
+
semantics: success.semantics,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (cleanup.failures.length > 0) {
|
|
92
|
+
for (const failure of cleanup.failures) {
|
|
93
|
+
await markCleanupFailedAndSyncArtifact(deps.stores.pool, {
|
|
94
|
+
userId,
|
|
95
|
+
rawDocumentId: failure.rawDocumentId,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
throw new ManagedBlobCleanupError(cleanup);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (config.auditLoggingEnabled) {
|
|
102
|
+
emitAuditEvent('memory:reset-source', userId, {
|
|
103
|
+
sourceSite,
|
|
104
|
+
deletedMemories: result.deletedMemories,
|
|
105
|
+
deletedEpisodes: result.deletedEpisodes,
|
|
106
|
+
deletedDocuments: result.deletedDocuments,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
deletedMemories: result.deletedMemories,
|
|
111
|
+
deletedEpisodes: result.deletedEpisodes,
|
|
112
|
+
deletedDocuments: result.deletedDocuments,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
export async function getStats(deps, userId) {
|
|
116
|
+
return deps.stores.memory.getMemoryStats(userId);
|
|
117
|
+
}
|
|
118
|
+
/** Identify memory clusters that are candidates for consolidation. */
|
|
119
|
+
export async function consolidate(deps, userId) {
|
|
120
|
+
return findConsolidationCandidates(deps.stores.memory, userId);
|
|
121
|
+
}
|
|
122
|
+
/** Execute consolidation: synthesize clusters via LLM and archive originals. */
|
|
123
|
+
export async function performExecuteConsolidation(deps, userId) {
|
|
124
|
+
return executeConsolidation(deps.stores.memory, deps.stores.claim, userId, undefined, deps.config);
|
|
125
|
+
}
|
|
126
|
+
/** Run deferred AUDN reconciliation for a user (background pass). */
|
|
127
|
+
export async function reconcileDeferred(deps, userId) {
|
|
128
|
+
return reconcileUser(deps.stores.pool, deps.stores.memory, userId);
|
|
129
|
+
}
|
|
130
|
+
/** Run deferred AUDN reconciliation across all users (batch job). */
|
|
131
|
+
export async function reconcileDeferredAll(deps) {
|
|
132
|
+
return reconcileAll(deps.stores.pool, deps.stores.memory);
|
|
133
|
+
}
|
|
134
|
+
/** Get deferred AUDN reconciliation status for a user. */
|
|
135
|
+
export async function getDeferredStatus(deps, userId) {
|
|
136
|
+
return getReconciliationStatus(deps.stores.pool, userId);
|
|
137
|
+
}
|
|
138
|
+
/** Evaluate memories for decay and return archival candidates. */
|
|
139
|
+
export async function evaluateDecay(deps, userId, referenceTime) {
|
|
140
|
+
const memories = await deps.stores.memory.listMemories(userId, 500, 0);
|
|
141
|
+
const decayConfig = {
|
|
142
|
+
retentionThreshold: config.decayRetentionThreshold,
|
|
143
|
+
importanceWeight: 0.4, recencyWeight: 0.4, accessWeight: 0.2,
|
|
144
|
+
minAgeMs: config.decayMinAgeDays * 24 * 60 * 60 * 1000,
|
|
145
|
+
};
|
|
146
|
+
return evaluateDecayCandidates(memories, referenceTime ?? new Date(), decayConfig);
|
|
147
|
+
}
|
|
148
|
+
/** Archive memories identified by the decay cycle. */
|
|
149
|
+
export async function archiveDecayed(deps, userId, memoryIds) {
|
|
150
|
+
for (const id of memoryIds) {
|
|
151
|
+
await deps.stores.memory.softDeleteMemory(userId, id);
|
|
152
|
+
if (config.auditLoggingEnabled)
|
|
153
|
+
emitAuditEvent('memory:delete', userId, { reason: 'decay' }, { memoryId: id });
|
|
154
|
+
}
|
|
155
|
+
return memoryIds.length;
|
|
156
|
+
}
|
|
157
|
+
/** Check whether the user's memory count exceeds the configured cap. */
|
|
158
|
+
export async function checkCap(deps, userId) {
|
|
159
|
+
const count = await deps.stores.memory.countMemories(userId);
|
|
160
|
+
return checkMemoryCap(count, { maxMemories: config.memoryCapMax, warnRatio: config.memoryCapWarnRatio });
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get the full mutation audit trail for a single memory.
|
|
164
|
+
* Traces back through claim versions to show the complete lifecycle.
|
|
165
|
+
*/
|
|
166
|
+
export async function getAuditTrail(deps, userId, memoryId) {
|
|
167
|
+
const found = await deps.stores.claim.findClaimByMemoryId(userId, memoryId);
|
|
168
|
+
if (!found)
|
|
169
|
+
return [];
|
|
170
|
+
return found.versions.map((v) => ({
|
|
171
|
+
versionId: v.id,
|
|
172
|
+
claimId: v.claim_id,
|
|
173
|
+
content: v.content,
|
|
174
|
+
mutationType: v.mutation_type,
|
|
175
|
+
mutationReason: v.mutation_reason,
|
|
176
|
+
actorModel: v.actor_model,
|
|
177
|
+
contradictionConfidence: v.contradiction_confidence,
|
|
178
|
+
previousVersionId: v.previous_version_id,
|
|
179
|
+
supersededByVersionId: v.superseded_by_version_id,
|
|
180
|
+
validFrom: v.valid_from,
|
|
181
|
+
validTo: v.valid_to,
|
|
182
|
+
memoryId: v.memory_id,
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
/** Get aggregate mutation statistics for a user's memory store. */
|
|
186
|
+
export async function getMutationSummary(deps, userId) {
|
|
187
|
+
return deps.stores.claim.getUserMutationSummary(userId);
|
|
188
|
+
}
|
|
189
|
+
/** Get recent mutations for a user, ordered newest first. */
|
|
190
|
+
export async function getRecentMutations(deps, userId, limit = 20) {
|
|
191
|
+
return deps.stores.claim.getRecentMutations(userId, limit);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Backfill deterministic relation slots for active legacy claims.
|
|
195
|
+
* This repairs claims written before canonical slot metadata existed.
|
|
196
|
+
*/
|
|
197
|
+
export async function backfillClaimSlots(deps, userId) {
|
|
198
|
+
if (!deps.stores.entity) {
|
|
199
|
+
return { scanned: 0, updated: 0 };
|
|
200
|
+
}
|
|
201
|
+
const candidates = await deps.stores.claim.listClaimsMissingSlots(userId);
|
|
202
|
+
let updated = 0;
|
|
203
|
+
for (const candidate of candidates) {
|
|
204
|
+
const slot = await derivePersistedClaimSlot(deps, candidate.userId, candidate.memoryId);
|
|
205
|
+
if (!slot)
|
|
206
|
+
continue;
|
|
207
|
+
await deps.stores.claim.updateClaimSlot(candidate.userId, candidate.claimId, slot);
|
|
208
|
+
updated += 1;
|
|
209
|
+
}
|
|
210
|
+
return { scanned: candidates.length, updated };
|
|
211
|
+
}
|
|
212
|
+
/** Trace the supersession chain forward from a version. */
|
|
213
|
+
export async function getReversalChain(deps, userId, versionId) {
|
|
214
|
+
return deps.stores.claim.getReversalChain(userId, versionId);
|
|
215
|
+
}
|
|
216
|
+
/** Get all active lessons for a user. */
|
|
217
|
+
export async function getLessons(deps, userId) {
|
|
218
|
+
if (!deps.stores.lesson)
|
|
219
|
+
return [];
|
|
220
|
+
const { getUserLessons } = await import('./lesson-service.js');
|
|
221
|
+
return getUserLessons(deps.stores.lesson, userId);
|
|
222
|
+
}
|
|
223
|
+
/** Get lesson stats for a user. */
|
|
224
|
+
export async function getLessonStats(deps, userId) {
|
|
225
|
+
if (!deps.stores.lesson)
|
|
226
|
+
return { totalActive: 0, byType: {} };
|
|
227
|
+
const { getLessonStats: getStats } = await import('./lesson-service.js');
|
|
228
|
+
return getStats(deps.stores.lesson, userId);
|
|
229
|
+
}
|
|
230
|
+
/** Record a user-reported lesson (explicit feedback). */
|
|
231
|
+
export async function reportLesson(deps, userId, pattern, sourceMemoryIds, severity) {
|
|
232
|
+
if (!deps.stores.lesson)
|
|
233
|
+
throw new Error('Lessons are not enabled');
|
|
234
|
+
const { recordUserReportedLesson } = await import('./lesson-service.js');
|
|
235
|
+
return recordUserReportedLesson(deps.stores.lesson, userId, pattern, sourceMemoryIds, severity);
|
|
236
|
+
}
|
|
237
|
+
/** Deactivate a lesson. */
|
|
238
|
+
export async function deactivateLesson(deps, userId, lessonId) {
|
|
239
|
+
if (!deps.stores.lesson)
|
|
240
|
+
throw new Error('Lessons are not enabled');
|
|
241
|
+
return deps.stores.lesson.deactivateLesson(userId, lessonId);
|
|
242
|
+
}
|
|
243
|
+
/** Derive a persisted claim slot from existing entity relations. */
|
|
244
|
+
export async function derivePersistedClaimSlot(deps, userId, memoryId) {
|
|
245
|
+
if (!deps.stores.entity)
|
|
246
|
+
return null;
|
|
247
|
+
const relations = await deps.stores.entity.getRelationsForMemory(userId, memoryId);
|
|
248
|
+
if (relations.length === 0)
|
|
249
|
+
return null;
|
|
250
|
+
return buildPersistedRelationClaimSlot(relations.map((relation) => ({
|
|
251
|
+
sourceEntityId: relation.source_entity_id,
|
|
252
|
+
targetEntityId: relation.target_entity_id,
|
|
253
|
+
relationType: relation.relation_type,
|
|
254
|
+
})));
|
|
255
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level ingest pipeline logic: performIngest, performQuickIngest, performWorkspaceIngest.
|
|
3
|
+
* Delegates AUDN resolution to memory-audn.ts and storage to memory-storage.ts.
|
|
4
|
+
*/
|
|
5
|
+
import type { MemoryMetadata, WorkspaceContext } from '../db/repository-types.js';
|
|
6
|
+
import type { IngestResult, MemoryServiceDeps } from './memory-service-types.js';
|
|
7
|
+
/** Full consensus-based ingest pipeline. */
|
|
8
|
+
export declare function performIngest(deps: MemoryServiceDeps, userId: string, conversationText: string, sourceSite: string, sourceUrl?: string, sessionTimestamp?: Date): Promise<IngestResult>;
|
|
9
|
+
/**
|
|
10
|
+
* Fast ingest path for UC2 (background capture).
|
|
11
|
+
* Uses rule-based extraction (~50ms) instead of LLM consensus (~22s).
|
|
12
|
+
*/
|
|
13
|
+
export declare function performQuickIngest(deps: MemoryServiceDeps, userId: string, conversationText: string, sourceSite: string, sourceUrl?: string, sessionTimestamp?: Date): Promise<IngestResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Store content as a single memory without fact extraction.
|
|
16
|
+
* Used for user-created contexts (text/file uploads) where
|
|
17
|
+
* the content should remain as one canonical memory record.
|
|
18
|
+
*/
|
|
19
|
+
export declare function performStoreVerbatim(deps: MemoryServiceDeps, userId: string, content: string, sourceSite: string, sourceUrl?: string, metadata?: MemoryMetadata): Promise<IngestResult>;
|
|
20
|
+
/** Workspace-scoped ingest: stores memories tagged with workspace_id and agent_id. */
|
|
21
|
+
export declare function performWorkspaceIngest(deps: MemoryServiceDeps, userId: string, conversationText: string, sourceSite: string, sourceUrl: string | undefined, workspace: WorkspaceContext, sessionTimestamp?: Date): Promise<IngestResult>;
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level ingest pipeline logic: performIngest, performQuickIngest, performWorkspaceIngest.
|
|
3
|
+
* Delegates AUDN resolution to memory-audn.ts and storage to memory-storage.ts.
|
|
4
|
+
*/
|
|
5
|
+
import { embedText } from './embedding.js';
|
|
6
|
+
import { consensusExtractFacts } from './consensus-extraction.js';
|
|
7
|
+
import { quickExtractFacts } from './quick-extraction.js';
|
|
8
|
+
import { IngestTraceCollector } from './ingest-trace.js';
|
|
9
|
+
import { assessWriteSecurity } from './write-security.js';
|
|
10
|
+
import { timed } from './timing.js';
|
|
11
|
+
import { runPostWriteProcessors } from './ingest-post-write.js';
|
|
12
|
+
import { extractLiteralsFromFact } from './literal-extractor.js';
|
|
13
|
+
import { processFactThroughPipeline } from './ingest-fact-pipeline.js';
|
|
14
|
+
import { resolveSessionDate } from './session-date.js';
|
|
15
|
+
import { maybeRebuildProfileForUser } from './user-profile-builder.js';
|
|
16
|
+
import { maybeExtractEntityAttributesForIngest } from './entity-attribute-extractor.js';
|
|
17
|
+
/** Enqueue a reflection job for (userId, conversationId) when the feature gate is on. */
|
|
18
|
+
async function maybeEnqueueReflectionJob(reflectionJobs, reflectEnabled, userId, conversationId) {
|
|
19
|
+
if (!reflectEnabled || !reflectionJobs)
|
|
20
|
+
return;
|
|
21
|
+
try {
|
|
22
|
+
await reflectionJobs.enqueue(userId, conversationId);
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
// Enqueue failure must NEVER block the ingest response.
|
|
26
|
+
console.error('[memory-ingest] reflection enqueue failed:', e);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function createIngestAccumulator() {
|
|
30
|
+
return {
|
|
31
|
+
counters: { stored: 0, updated: 0, deleted: 0, skipped: 0, preserved_contradiction: 0 },
|
|
32
|
+
storedMemoryIds: [],
|
|
33
|
+
updatedMemoryIds: [],
|
|
34
|
+
memoryIds: [],
|
|
35
|
+
embeddingCache: new Map(),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Record a single fact result into the accumulator. */
|
|
39
|
+
function accumulateFactResult(acc, result) {
|
|
40
|
+
if (result.memoryId) {
|
|
41
|
+
acc.memoryIds.push(result.memoryId);
|
|
42
|
+
if (result.outcome === 'stored')
|
|
43
|
+
acc.storedMemoryIds.push(result.memoryId);
|
|
44
|
+
else if (result.outcome === 'updated')
|
|
45
|
+
acc.updatedMemoryIds.push(result.memoryId);
|
|
46
|
+
// BEAM CR fix: bilateral preservation keeps both sides — the returned
|
|
47
|
+
// memoryId is the NEW row (the existing counterpart already lives in
|
|
48
|
+
// memories). Treat as "stored" for downstream linking/processing.
|
|
49
|
+
else if (result.outcome === 'preserved_contradiction')
|
|
50
|
+
acc.storedMemoryIds.push(result.memoryId);
|
|
51
|
+
if (result.embedding)
|
|
52
|
+
acc.embeddingCache.set(result.memoryId, result.embedding);
|
|
53
|
+
}
|
|
54
|
+
acc.counters[result.outcome]++;
|
|
55
|
+
}
|
|
56
|
+
function buildIngestResult(episodeId, factsCount, acc, linksCreated, compositesCreated) {
|
|
57
|
+
return {
|
|
58
|
+
episodeId, factsExtracted: factsCount,
|
|
59
|
+
memoriesStored: acc.counters.stored, memoriesUpdated: acc.counters.updated,
|
|
60
|
+
memoriesDeleted: acc.counters.deleted, memoriesSkipped: acc.counters.skipped,
|
|
61
|
+
storedMemoryIds: acc.storedMemoryIds, updatedMemoryIds: acc.updatedMemoryIds,
|
|
62
|
+
memoryIds: acc.memoryIds, linksCreated, compositesCreated,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function finalizeIngestResult(episodeId, factsCount, acc, linksCreated, compositesCreated, traceCollector, traceMetadata) {
|
|
66
|
+
return {
|
|
67
|
+
...buildIngestResult(episodeId, factsCount, acc, linksCreated, compositesCreated),
|
|
68
|
+
ingestTraceId: traceCollector.finalize(traceMetadata),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Full consensus-based ingest pipeline. */
|
|
72
|
+
export async function performIngest(deps, userId, conversationText, sourceSite, sourceUrl = '', sessionTimestamp) {
|
|
73
|
+
const ingestStart = performance.now();
|
|
74
|
+
const logicalSessionTimestamp = resolveSessionDate(sessionTimestamp, conversationText);
|
|
75
|
+
const episodeId = await timed('ingest.store-episode', () => deps.stores.episode.storeEpisode({ userId, content: conversationText, sourceSite, sourceUrl }));
|
|
76
|
+
const facts = await timed('ingest.extract', () => consensusExtractFacts(conversationText, deps.config));
|
|
77
|
+
const traceCollector = new IngestTraceCollector(deps.config.ingestTraceEnabled);
|
|
78
|
+
const acc = createIngestAccumulator();
|
|
79
|
+
const supersededTargets = new Set();
|
|
80
|
+
const entropyCtx = { seenEntities: new Set(), previousEmbedding: null };
|
|
81
|
+
const storedFacts = [];
|
|
82
|
+
for (const fact of facts) {
|
|
83
|
+
const result = await timed('ingest.fact', () => processFactThroughPipeline(deps, userId, fact, sourceSite, sourceUrl, episodeId, { entropyGate: true, fullAudn: true, supersededTargets, entropyCtx, logicalTimestamp: logicalSessionTimestamp, timingPrefix: 'ingest', traceCollector }));
|
|
84
|
+
accumulateFactResult(acc, result);
|
|
85
|
+
if (result.memoryId)
|
|
86
|
+
storedFacts.push({ memoryId: result.memoryId, fact });
|
|
87
|
+
}
|
|
88
|
+
const postWrite = await runPostWriteProcessors(deps, userId, {
|
|
89
|
+
episodeId, sourceSite, sourceUrl, storedFacts,
|
|
90
|
+
memoryIds: acc.memoryIds, embeddingCache: acc.embeddingCache,
|
|
91
|
+
sessionTimestamp: logicalSessionTimestamp, compositesEnabled: deps.config.compositeGroupingEnabled,
|
|
92
|
+
timingPrefix: 'ingest',
|
|
93
|
+
chunkText: conversationText,
|
|
94
|
+
});
|
|
95
|
+
// Phase 2: literal extraction for IE/KU specialist.
|
|
96
|
+
// Awaited so the container doesn't exit before writes complete.
|
|
97
|
+
// Per-fact failures are logged and never block subsequent facts or the response.
|
|
98
|
+
if (deps.config.phase2SpecialistsEnabled && deps.stores.entityValues) {
|
|
99
|
+
const entityValues = deps.stores.entityValues;
|
|
100
|
+
const model = deps.config.llmModel;
|
|
101
|
+
await Promise.allSettled(acc.storedMemoryIds.map(async (memoryId) => {
|
|
102
|
+
const stored = storedFacts.find((sf) => sf.memoryId === memoryId);
|
|
103
|
+
if (!stored)
|
|
104
|
+
return;
|
|
105
|
+
try {
|
|
106
|
+
await extractLiteralsFromFact({ values: entityValues, model }, {
|
|
107
|
+
userId,
|
|
108
|
+
factId: memoryId,
|
|
109
|
+
factText: stored.fact.fact,
|
|
110
|
+
observedAt: logicalSessionTimestamp ?? new Date(),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
console.error('[literal-extractor] extraction failed for fact', memoryId, e);
|
|
115
|
+
}
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
if (deps.config.userProfileChannelEnabled) {
|
|
119
|
+
void maybeRebuildProfileForUser(deps, userId, acc.storedMemoryIds);
|
|
120
|
+
}
|
|
121
|
+
if (deps.config.entityAttributesEnabled) {
|
|
122
|
+
void maybeExtractEntityAttributesForIngest(deps, userId, conversationText, logicalSessionTimestamp, acc.storedMemoryIds);
|
|
123
|
+
}
|
|
124
|
+
await maybeEnqueueReflectionJob(deps.reflectionJobs, deps.reflectEnabled, userId, episodeId);
|
|
125
|
+
console.log(`[timing] ingest.total: ${(performance.now() - ingestStart).toFixed(1)}ms (${facts.length} facts, ${postWrite.compositesCreated} composites, topic=${postWrite.topicAbstractionApplied})`);
|
|
126
|
+
return finalizeIngestResult(episodeId, facts.length, acc, postWrite.linksCreated, postWrite.compositesCreated, traceCollector, { mode: 'full', userId, sourceSite, sourceUrl, episodeId, factsExtracted: facts.length });
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Fast ingest path for UC2 (background capture).
|
|
130
|
+
* Uses rule-based extraction (~50ms) instead of LLM consensus (~22s).
|
|
131
|
+
*/
|
|
132
|
+
export async function performQuickIngest(deps, userId, conversationText, sourceSite, sourceUrl = '', sessionTimestamp) {
|
|
133
|
+
const ingestStart = performance.now();
|
|
134
|
+
const logicalSessionTimestamp = resolveSessionDate(sessionTimestamp, conversationText);
|
|
135
|
+
const episodeId = await deps.stores.episode.storeEpisode({ userId, content: conversationText, sourceSite, sourceUrl });
|
|
136
|
+
const facts = timed('quick-ingest.extract', () => Promise.resolve(quickExtractFacts(conversationText)));
|
|
137
|
+
const extractedFacts = await facts;
|
|
138
|
+
const traceCollector = new IngestTraceCollector(deps.config.ingestTraceEnabled);
|
|
139
|
+
const acc = createIngestAccumulator();
|
|
140
|
+
for (const fact of extractedFacts) {
|
|
141
|
+
const result = await timed('quick-ingest.fact', () => processFactThroughPipeline(deps, userId, fact, sourceSite, sourceUrl, episodeId, { entropyGate: false, fullAudn: false, supersededTargets: new Set(), entropyCtx: { seenEntities: new Set(), previousEmbedding: null }, logicalTimestamp: logicalSessionTimestamp, timingPrefix: 'quick-ingest', traceCollector }));
|
|
142
|
+
accumulateFactResult(acc, result);
|
|
143
|
+
}
|
|
144
|
+
const postWrite = await runPostWriteProcessors(deps, userId, {
|
|
145
|
+
episodeId, sourceSite, sourceUrl, storedFacts: [],
|
|
146
|
+
memoryIds: acc.memoryIds, embeddingCache: acc.embeddingCache,
|
|
147
|
+
sessionTimestamp: logicalSessionTimestamp, compositesEnabled: false,
|
|
148
|
+
timingPrefix: 'quick-ingest',
|
|
149
|
+
chunkText: conversationText,
|
|
150
|
+
});
|
|
151
|
+
console.log(`[timing] quick-ingest.total: ${(performance.now() - ingestStart).toFixed(1)}ms (${extractedFacts.length} facts, ${acc.counters.stored} stored, ${acc.counters.skipped} skipped)`);
|
|
152
|
+
return finalizeIngestResult(episodeId, extractedFacts.length, acc, postWrite.linksCreated, 0, traceCollector, { mode: 'quick', userId, sourceSite, sourceUrl, episodeId, factsExtracted: extractedFacts.length });
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Store content as a single memory without fact extraction.
|
|
156
|
+
* Used for user-created contexts (text/file uploads) where
|
|
157
|
+
* the content should remain as one canonical memory record.
|
|
158
|
+
*/
|
|
159
|
+
export async function performStoreVerbatim(deps, userId, content, sourceSite, sourceUrl = '', metadata) {
|
|
160
|
+
const episodeId = await deps.stores.episode.storeEpisode({ userId, content, sourceSite, sourceUrl });
|
|
161
|
+
const embedding = await embedText(content);
|
|
162
|
+
const writeSecurity = assessWriteSecurity(content, sourceSite, deps.config);
|
|
163
|
+
const trustScore = writeSecurity.allowed ? writeSecurity.trust.score : 0.5;
|
|
164
|
+
const traceCollector = new IngestTraceCollector(deps.config.ingestTraceEnabled);
|
|
165
|
+
const memoryId = await deps.stores.memory.storeMemory({
|
|
166
|
+
userId,
|
|
167
|
+
content,
|
|
168
|
+
embedding,
|
|
169
|
+
memoryType: 'semantic',
|
|
170
|
+
importance: 0.5,
|
|
171
|
+
sourceSite,
|
|
172
|
+
sourceUrl,
|
|
173
|
+
episodeId,
|
|
174
|
+
status: 'active',
|
|
175
|
+
keywords: '',
|
|
176
|
+
summary: content.slice(0, 200),
|
|
177
|
+
trustScore,
|
|
178
|
+
metadata,
|
|
179
|
+
});
|
|
180
|
+
traceCollector.record({
|
|
181
|
+
factText: content,
|
|
182
|
+
headline: content.slice(0, 80),
|
|
183
|
+
factType: 'verbatim',
|
|
184
|
+
importance: 0.5,
|
|
185
|
+
writeSecurity: {
|
|
186
|
+
allowed: writeSecurity.allowed,
|
|
187
|
+
blockedBy: writeSecurity.blockedBy,
|
|
188
|
+
trustScore: writeSecurity.trust.score,
|
|
189
|
+
},
|
|
190
|
+
decision: {
|
|
191
|
+
source: 'verbatim',
|
|
192
|
+
action: 'ADD',
|
|
193
|
+
reasonCode: 'verbatim-store',
|
|
194
|
+
targetMemoryId: null,
|
|
195
|
+
},
|
|
196
|
+
outcome: 'stored',
|
|
197
|
+
memoryId,
|
|
198
|
+
});
|
|
199
|
+
return {
|
|
200
|
+
episodeId,
|
|
201
|
+
factsExtracted: 1,
|
|
202
|
+
memoriesStored: 1,
|
|
203
|
+
memoriesUpdated: 0,
|
|
204
|
+
memoriesDeleted: 0,
|
|
205
|
+
memoriesSkipped: 0,
|
|
206
|
+
storedMemoryIds: [memoryId],
|
|
207
|
+
updatedMemoryIds: [],
|
|
208
|
+
memoryIds: [memoryId],
|
|
209
|
+
linksCreated: 0,
|
|
210
|
+
compositesCreated: 0,
|
|
211
|
+
ingestTraceId: traceCollector.finalize({ mode: 'verbatim', userId, sourceSite, sourceUrl, episodeId, factsExtracted: 1 }),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/** Workspace-scoped ingest: stores memories tagged with workspace_id and agent_id. */
|
|
215
|
+
export async function performWorkspaceIngest(deps, userId, conversationText, sourceSite, sourceUrl = '', workspace, sessionTimestamp) {
|
|
216
|
+
const ingestStart = performance.now();
|
|
217
|
+
const logicalSessionTimestamp = resolveSessionDate(sessionTimestamp, conversationText);
|
|
218
|
+
const episodeId = await timed('ws-ingest.store-episode', () => deps.stores.episode.storeEpisode({
|
|
219
|
+
userId, content: conversationText, sourceSite, sourceUrl,
|
|
220
|
+
workspaceId: workspace.workspaceId, agentId: workspace.agentId,
|
|
221
|
+
}));
|
|
222
|
+
const facts = await timed('ws-ingest.extract', () => consensusExtractFacts(conversationText, deps.config));
|
|
223
|
+
const traceCollector = new IngestTraceCollector(deps.config.ingestTraceEnabled);
|
|
224
|
+
const acc = createIngestAccumulator();
|
|
225
|
+
const supersededTargets = new Set();
|
|
226
|
+
const entropyCtx = { seenEntities: new Set(), previousEmbedding: null };
|
|
227
|
+
for (const fact of facts) {
|
|
228
|
+
const result = await timed('ws-ingest.fact', () => processFactThroughPipeline(deps, userId, fact, sourceSite, sourceUrl, episodeId, {
|
|
229
|
+
workspace,
|
|
230
|
+
entropyGate: false,
|
|
231
|
+
fullAudn: true,
|
|
232
|
+
supersededTargets,
|
|
233
|
+
entropyCtx,
|
|
234
|
+
logicalTimestamp: logicalSessionTimestamp,
|
|
235
|
+
timingPrefix: 'ws-ingest',
|
|
236
|
+
traceCollector,
|
|
237
|
+
}));
|
|
238
|
+
accumulateFactResult(acc, result);
|
|
239
|
+
}
|
|
240
|
+
const postWrite = await runPostWriteProcessors(deps, userId, {
|
|
241
|
+
episodeId, sourceSite, sourceUrl, storedFacts: [],
|
|
242
|
+
memoryIds: acc.memoryIds, embeddingCache: acc.embeddingCache,
|
|
243
|
+
sessionTimestamp: logicalSessionTimestamp, compositesEnabled: false,
|
|
244
|
+
timingPrefix: 'ws-ingest',
|
|
245
|
+
chunkText: conversationText,
|
|
246
|
+
});
|
|
247
|
+
console.log(`[timing] ws-ingest.total: ${(performance.now() - ingestStart).toFixed(1)}ms (${facts.length} facts, workspace=${workspace.workspaceId})`);
|
|
248
|
+
return finalizeIngestResult(episodeId, facts.length, acc, postWrite.linksCreated, 0, traceCollector, { mode: 'workspace', userId, sourceSite, sourceUrl, episodeId, factsExtracted: facts.length });
|
|
249
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory lifecycle management: decay cycle and memory count cap.
|
|
3
|
+
*
|
|
4
|
+
* Decay cycle: Computes a retention score for each memory using the same
|
|
5
|
+
* three-signal formula as retrieval scoring (similarity excluded since there's
|
|
6
|
+
* no query). Memories below the retention threshold are archived (soft-deleted).
|
|
7
|
+
* This implements the Ebbinghaus forgetting curve for long-term store health.
|
|
8
|
+
*
|
|
9
|
+
* Memory count cap: Checks whether a user's active memory count exceeds
|
|
10
|
+
* a configured limit and returns a recommendation for whether consolidation
|
|
11
|
+
* or decay should run.
|
|
12
|
+
*
|
|
13
|
+
* Both features are pure functions over memory data + config — they compute
|
|
14
|
+
* what should happen but let the caller decide when to act.
|
|
15
|
+
*/
|
|
16
|
+
import type { MemoryRow } from '../db/repository-types.js';
|
|
17
|
+
export interface DecayConfig {
|
|
18
|
+
/** Retention score below which memories are archived. */
|
|
19
|
+
retentionThreshold: number;
|
|
20
|
+
/** Weight for importance in retention score. */
|
|
21
|
+
importanceWeight: number;
|
|
22
|
+
/** Weight for recency in retention score. */
|
|
23
|
+
recencyWeight: number;
|
|
24
|
+
/** Weight for access frequency in retention score. */
|
|
25
|
+
accessWeight: number;
|
|
26
|
+
/** Minimum age in milliseconds before a memory can be decayed. */
|
|
27
|
+
minAgeMs: number;
|
|
28
|
+
}
|
|
29
|
+
export declare const DEFAULT_DECAY_CONFIG: DecayConfig;
|
|
30
|
+
export interface DecayCandidate {
|
|
31
|
+
id: string;
|
|
32
|
+
content: string;
|
|
33
|
+
retentionScore: number;
|
|
34
|
+
importance: number;
|
|
35
|
+
daysSinceAccess: number;
|
|
36
|
+
accessCount: number;
|
|
37
|
+
}
|
|
38
|
+
export interface DecayResult {
|
|
39
|
+
memoriesEvaluated: number;
|
|
40
|
+
candidatesForArchival: DecayCandidate[];
|
|
41
|
+
retentionThreshold: number;
|
|
42
|
+
avgRetentionScore: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Compute the retention score for a single memory.
|
|
46
|
+
*
|
|
47
|
+
* Formula: importanceWeight * importance + recencyWeight * recency + accessWeight * accessFreq
|
|
48
|
+
* Where recency = exp(-timeSinceAccess / TAU) and accessFreq = min(1, accessCount / 10).
|
|
49
|
+
*/
|
|
50
|
+
export declare function computeRetentionScore(memory: Pick<MemoryRow, 'importance' | 'last_accessed_at' | 'access_count' | 'trust_score'>, referenceTime: Date, decayConfig: DecayConfig): number;
|
|
51
|
+
/**
|
|
52
|
+
* Evaluate a batch of memories and identify those below the retention threshold.
|
|
53
|
+
* Does not modify any data — returns candidates for the caller to archive.
|
|
54
|
+
*/
|
|
55
|
+
export declare function evaluateDecayCandidates(memories: MemoryRow[], referenceTime: Date, decayConfig?: DecayConfig): DecayResult;
|
|
56
|
+
export interface CapConfig {
|
|
57
|
+
/** Maximum number of active memories before triggering lifecycle actions. */
|
|
58
|
+
maxMemories: number;
|
|
59
|
+
/** Warn threshold as a fraction of maxMemories (0.0-1.0). */
|
|
60
|
+
warnRatio: number;
|
|
61
|
+
}
|
|
62
|
+
export type CapStatus = 'ok' | 'warn' | 'exceeded';
|
|
63
|
+
export interface CapCheckResult {
|
|
64
|
+
activeMemories: number;
|
|
65
|
+
maxMemories: number;
|
|
66
|
+
status: CapStatus;
|
|
67
|
+
usageRatio: number;
|
|
68
|
+
recommendation: CapRecommendation;
|
|
69
|
+
}
|
|
70
|
+
export type CapRecommendation = 'none' | 'consolidate' | 'decay' | 'consolidate-and-decay';
|
|
71
|
+
/**
|
|
72
|
+
* Check whether a user's memory count is within the configured cap.
|
|
73
|
+
* Returns a status and recommendation for what lifecycle action to take.
|
|
74
|
+
*/
|
|
75
|
+
export declare function checkMemoryCap(activeMemories: number, capConfig?: CapConfig): CapCheckResult;
|