@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,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Child representation storage for dual-write memory cells.
|
|
3
|
+
* Parent `memories` rows remain the packaging unit; atomic facts and foresight
|
|
4
|
+
* rows provide retrieval-optimized child views over the same memory.
|
|
5
|
+
*/
|
|
6
|
+
import pgvector from 'pgvector/pg';
|
|
7
|
+
import { config } from '../config.js';
|
|
8
|
+
import { normalizeAtomicFactRow, normalizeForesightRow, normalizeSearchRow, } from './repository-types.js';
|
|
9
|
+
import { RRF_K, buildHybridSearchParams } from './query-helpers.js';
|
|
10
|
+
export async function storeAtomicFacts(queryable, facts) {
|
|
11
|
+
const insertedIds = [];
|
|
12
|
+
for (const fact of facts) {
|
|
13
|
+
const result = await queryable.query(`INSERT INTO memory_atomic_facts (
|
|
14
|
+
user_id, parent_memory_id, fact_text, embedding, fact_type, importance,
|
|
15
|
+
source_site, source_url, episode_id, keywords, metadata,
|
|
16
|
+
workspace_id, agent_id
|
|
17
|
+
)
|
|
18
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11::jsonb, $12, $13)
|
|
19
|
+
RETURNING id`, [
|
|
20
|
+
fact.userId,
|
|
21
|
+
fact.parentMemoryId,
|
|
22
|
+
fact.factText,
|
|
23
|
+
pgvector.toSql(fact.embedding),
|
|
24
|
+
fact.factType,
|
|
25
|
+
fact.importance,
|
|
26
|
+
fact.sourceSite,
|
|
27
|
+
fact.sourceUrl ?? '',
|
|
28
|
+
fact.episodeId ?? null,
|
|
29
|
+
fact.keywords ?? '',
|
|
30
|
+
JSON.stringify(fact.metadata ?? {}),
|
|
31
|
+
fact.workspaceId ?? null,
|
|
32
|
+
fact.agentId ?? null,
|
|
33
|
+
]);
|
|
34
|
+
insertedIds.push(result.rows[0].id);
|
|
35
|
+
}
|
|
36
|
+
return insertedIds;
|
|
37
|
+
}
|
|
38
|
+
export async function replaceAtomicFactsForMemory(queryable, userId, parentMemoryId, facts) {
|
|
39
|
+
await queryable.query('DELETE FROM memory_atomic_facts WHERE user_id = $1 AND parent_memory_id = $2', [userId, parentMemoryId]);
|
|
40
|
+
if (facts.length === 0)
|
|
41
|
+
return [];
|
|
42
|
+
return storeAtomicFacts(queryable, facts);
|
|
43
|
+
}
|
|
44
|
+
export async function listAtomicFactsForMemory(queryable, userId, parentMemoryId) {
|
|
45
|
+
const result = await queryable.query(`SELECT * FROM memory_atomic_facts
|
|
46
|
+
WHERE user_id = $1 AND parent_memory_id = $2
|
|
47
|
+
ORDER BY created_at ASC`, [userId, parentMemoryId]);
|
|
48
|
+
return result.rows.map(normalizeAtomicFactRow);
|
|
49
|
+
}
|
|
50
|
+
export async function storeForesight(queryable, foresight) {
|
|
51
|
+
const insertedIds = [];
|
|
52
|
+
for (const entry of foresight) {
|
|
53
|
+
const result = await queryable.query(`INSERT INTO memory_foresight (
|
|
54
|
+
user_id, parent_memory_id, content, embedding, foresight_type, source_site,
|
|
55
|
+
source_url, episode_id, metadata, valid_from, valid_to,
|
|
56
|
+
workspace_id, agent_id
|
|
57
|
+
)
|
|
58
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::jsonb, $10, $11, $12, $13)
|
|
59
|
+
RETURNING id`, [
|
|
60
|
+
entry.userId,
|
|
61
|
+
entry.parentMemoryId,
|
|
62
|
+
entry.content,
|
|
63
|
+
pgvector.toSql(entry.embedding),
|
|
64
|
+
entry.foresightType,
|
|
65
|
+
entry.sourceSite,
|
|
66
|
+
entry.sourceUrl ?? '',
|
|
67
|
+
entry.episodeId ?? null,
|
|
68
|
+
JSON.stringify(entry.metadata ?? {}),
|
|
69
|
+
(entry.validFrom ?? new Date()).toISOString(),
|
|
70
|
+
entry.validTo?.toISOString() ?? null,
|
|
71
|
+
entry.workspaceId ?? null,
|
|
72
|
+
entry.agentId ?? null,
|
|
73
|
+
]);
|
|
74
|
+
insertedIds.push(result.rows[0].id);
|
|
75
|
+
}
|
|
76
|
+
return insertedIds;
|
|
77
|
+
}
|
|
78
|
+
export async function replaceForesightForMemory(queryable, userId, parentMemoryId, foresight) {
|
|
79
|
+
await queryable.query('DELETE FROM memory_foresight WHERE user_id = $1 AND parent_memory_id = $2', [userId, parentMemoryId]);
|
|
80
|
+
if (foresight.length === 0)
|
|
81
|
+
return [];
|
|
82
|
+
return storeForesight(queryable, foresight);
|
|
83
|
+
}
|
|
84
|
+
export async function listForesightForMemory(queryable, userId, parentMemoryId) {
|
|
85
|
+
const result = await queryable.query(`SELECT * FROM memory_foresight
|
|
86
|
+
WHERE user_id = $1 AND parent_memory_id = $2
|
|
87
|
+
ORDER BY valid_from ASC, created_at ASC`, [userId, parentMemoryId]);
|
|
88
|
+
return result.rows.map(normalizeForesightRow);
|
|
89
|
+
}
|
|
90
|
+
export async function searchAtomicFactsHybrid(pool, userId, queryText, queryEmbedding, limit, sourceSite, referenceTime) {
|
|
91
|
+
const { params, siteFilter } = buildHybridSearchParams(queryEmbedding, userId, queryText, limit, 'af.source_site', sourceSite, referenceTime);
|
|
92
|
+
const result = await pool.query(`WITH vector_ranked AS (
|
|
93
|
+
SELECT af.id, af.parent_memory_id, af.fact_text,
|
|
94
|
+
ROW_NUMBER() OVER (ORDER BY af.embedding <=> $1) AS vrank,
|
|
95
|
+
1 - (af.embedding <=> $1) AS similarity
|
|
96
|
+
FROM memory_atomic_facts af
|
|
97
|
+
JOIN memories m ON m.id = af.parent_memory_id
|
|
98
|
+
WHERE af.user_id = $2
|
|
99
|
+
AND m.deleted_at IS NULL
|
|
100
|
+
AND m.expired_at IS NULL
|
|
101
|
+
AND m.status = 'active'
|
|
102
|
+
AND m.workspace_id IS NULL
|
|
103
|
+
${siteFilter}
|
|
104
|
+
ORDER BY af.embedding <=> $1
|
|
105
|
+
LIMIT $4 * 6
|
|
106
|
+
),
|
|
107
|
+
fts_ranked AS (
|
|
108
|
+
SELECT af.id, af.parent_memory_id, af.fact_text,
|
|
109
|
+
ROW_NUMBER() OVER (ORDER BY ts_rank(af.search_vector, plainto_tsquery('english', $3)) DESC) AS ftsrank
|
|
110
|
+
FROM memory_atomic_facts af
|
|
111
|
+
JOIN memories m ON m.id = af.parent_memory_id
|
|
112
|
+
WHERE af.user_id = $2
|
|
113
|
+
AND m.deleted_at IS NULL
|
|
114
|
+
AND m.expired_at IS NULL
|
|
115
|
+
AND m.status = 'active'
|
|
116
|
+
AND m.workspace_id IS NULL
|
|
117
|
+
${siteFilter}
|
|
118
|
+
AND af.search_vector @@ plainto_tsquery('english', $3)
|
|
119
|
+
ORDER BY ts_rank(af.search_vector, plainto_tsquery('english', $3)) DESC
|
|
120
|
+
LIMIT $4 * 6
|
|
121
|
+
),
|
|
122
|
+
fused_facts AS (
|
|
123
|
+
SELECT
|
|
124
|
+
COALESCE(v.id, f.id) AS fact_id,
|
|
125
|
+
COALESCE(v.parent_memory_id, f.parent_memory_id) AS parent_memory_id,
|
|
126
|
+
COALESCE(v.fact_text, f.fact_text) AS fact_text,
|
|
127
|
+
COALESCE(v.similarity, 0) AS similarity,
|
|
128
|
+
COALESCE(1.0 / (${RRF_K} + v.vrank), 0) + COALESCE(1.0 / (${RRF_K} + f.ftsrank), 0) AS rrf_score
|
|
129
|
+
FROM vector_ranked v
|
|
130
|
+
FULL OUTER JOIN fts_ranked f ON v.id = f.id
|
|
131
|
+
),
|
|
132
|
+
parent_ranked AS (
|
|
133
|
+
SELECT
|
|
134
|
+
parent_memory_id,
|
|
135
|
+
MAX(similarity) AS similarity,
|
|
136
|
+
MAX(rrf_score) AS best_rrf_score,
|
|
137
|
+
(ARRAY_AGG(fact_text ORDER BY (similarity + rrf_score) DESC))[1:3] AS matched_facts,
|
|
138
|
+
(ARRAY_AGG(fact_id::text ORDER BY (similarity + rrf_score) DESC))[1:3] AS matched_fact_ids
|
|
139
|
+
FROM fused_facts
|
|
140
|
+
GROUP BY parent_memory_id
|
|
141
|
+
)
|
|
142
|
+
SELECT
|
|
143
|
+
m.*,
|
|
144
|
+
p.similarity,
|
|
145
|
+
(
|
|
146
|
+
$5 * p.similarity
|
|
147
|
+
+ CASE WHEN p.similarity >= $9 THEN (
|
|
148
|
+
$6 * m.importance
|
|
149
|
+
+ $7 * EXP(-EXTRACT(EPOCH FROM ($8::timestamptz - m.last_accessed_at)) / 2592000.0)
|
|
150
|
+
) ELSE 0 END
|
|
151
|
+
-- Lexical RRF stays outside the semantic boost gate because exact text match is itself a relevance signal.
|
|
152
|
+
+ ${config.retrievalProfileSettings.lexicalWeight} * p.best_rrf_score
|
|
153
|
+
) * COALESCE(m.trust_score, 1.0) AS score,
|
|
154
|
+
p.matched_facts,
|
|
155
|
+
p.matched_fact_ids,
|
|
156
|
+
'atomic_fact'::text AS retrieval_layer
|
|
157
|
+
FROM parent_ranked p
|
|
158
|
+
JOIN memories m ON m.id = p.parent_memory_id
|
|
159
|
+
ORDER BY score DESC
|
|
160
|
+
LIMIT $4`, params);
|
|
161
|
+
return result.rows.map(normalizeSearchRow);
|
|
162
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BEAM v38: temporal-state repository helpers.
|
|
3
|
+
*
|
|
4
|
+
* Two operations are exposed:
|
|
5
|
+
* - `supersedePriorStateMemories` — UPDATE prior memories with the same
|
|
6
|
+
* (user_id, state_key) so they close their event_end window when a
|
|
7
|
+
* new memory takes over that key. Fails closed; the caller MUST
|
|
8
|
+
* propagate the error and abort the ingest if this throws.
|
|
9
|
+
* - `findActiveStateMemoryIds` — diagnostic / test helper returning the
|
|
10
|
+
* IDs of memories that are currently active (event_end IS NULL) for
|
|
11
|
+
* a (user_id, state_key) pair.
|
|
12
|
+
*/
|
|
13
|
+
import type pg from 'pg';
|
|
14
|
+
/**
|
|
15
|
+
* Set `event_end = $eventEnd` on every prior, non-deleted memory whose
|
|
16
|
+
* (user_id, state_key) matches, EXCEPT the new memory itself. Returns
|
|
17
|
+
* the number of rows updated.
|
|
18
|
+
*
|
|
19
|
+
* Why fail closed: the supersede signal is the entire point of the
|
|
20
|
+
* temporal layer. Silently dropping it would leave both rows active
|
|
21
|
+
* and break the read-time rerank invariant.
|
|
22
|
+
*/
|
|
23
|
+
export declare function supersedePriorStateMemories(pool: pg.Pool, args: {
|
|
24
|
+
userId: string;
|
|
25
|
+
stateKey: string;
|
|
26
|
+
newMemoryId: string;
|
|
27
|
+
eventEnd: Date;
|
|
28
|
+
}): Promise<number>;
|
|
29
|
+
/**
|
|
30
|
+
* Return the IDs of the active memories for a (user_id, state_key) pair.
|
|
31
|
+
* Used in tests and as a diagnostic seam — production retrieval does NOT
|
|
32
|
+
* call this; it reranks the candidates already in hand by their
|
|
33
|
+
* `event_end` field.
|
|
34
|
+
*/
|
|
35
|
+
export declare function findActiveStateMemoryIds(pool: pg.Pool, userId: string, stateKey: string): Promise<string[]>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BEAM v38: temporal-state repository helpers.
|
|
3
|
+
*
|
|
4
|
+
* Two operations are exposed:
|
|
5
|
+
* - `supersedePriorStateMemories` — UPDATE prior memories with the same
|
|
6
|
+
* (user_id, state_key) so they close their event_end window when a
|
|
7
|
+
* new memory takes over that key. Fails closed; the caller MUST
|
|
8
|
+
* propagate the error and abort the ingest if this throws.
|
|
9
|
+
* - `findActiveStateMemoryIds` — diagnostic / test helper returning the
|
|
10
|
+
* IDs of memories that are currently active (event_end IS NULL) for
|
|
11
|
+
* a (user_id, state_key) pair.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Set `event_end = $eventEnd` on every prior, non-deleted memory whose
|
|
15
|
+
* (user_id, state_key) matches, EXCEPT the new memory itself. Returns
|
|
16
|
+
* the number of rows updated.
|
|
17
|
+
*
|
|
18
|
+
* Why fail closed: the supersede signal is the entire point of the
|
|
19
|
+
* temporal layer. Silently dropping it would leave both rows active
|
|
20
|
+
* and break the read-time rerank invariant.
|
|
21
|
+
*/
|
|
22
|
+
export async function supersedePriorStateMemories(pool, args) {
|
|
23
|
+
const result = await pool.query(`UPDATE memories
|
|
24
|
+
SET event_end = $4
|
|
25
|
+
WHERE user_id = $1
|
|
26
|
+
AND state_key = $2
|
|
27
|
+
AND id <> $3::uuid
|
|
28
|
+
AND event_end IS NULL
|
|
29
|
+
AND deleted_at IS NULL`, [args.userId, args.stateKey, args.newMemoryId, args.eventEnd.toISOString()]);
|
|
30
|
+
return result.rowCount ?? 0;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Return the IDs of the active memories for a (user_id, state_key) pair.
|
|
34
|
+
* Used in tests and as a diagnostic seam — production retrieval does NOT
|
|
35
|
+
* call this; it reranks the candidates already in hand by their
|
|
36
|
+
* `event_end` field.
|
|
37
|
+
*/
|
|
38
|
+
export async function findActiveStateMemoryIds(pool, userId, stateKey) {
|
|
39
|
+
const result = await pool.query(`SELECT id FROM memories
|
|
40
|
+
WHERE user_id = $1
|
|
41
|
+
AND state_key = $2
|
|
42
|
+
AND event_end IS NULL
|
|
43
|
+
AND deleted_at IS NULL
|
|
44
|
+
ORDER BY event_start DESC NULLS LAST`, [userId, stateKey]);
|
|
45
|
+
return result.rows.map((row) => row.id);
|
|
46
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository for the Temporal Linkage List (TLL) — per-entity sparse graph
|
|
3
|
+
* of event nodes connected by predecessor/successor edges.
|
|
4
|
+
*
|
|
5
|
+
* Purpose: maintain "what happened in what order, per entity" without
|
|
6
|
+
* paying the full graph-DB cost. Each new memory referencing an entity
|
|
7
|
+
* appends an event node; the predecessor pointer lets us traverse the
|
|
8
|
+
* chain backward at query time for EO/MSR/TR questions.
|
|
9
|
+
*/
|
|
10
|
+
import pg from 'pg';
|
|
11
|
+
export interface TLLEvent {
|
|
12
|
+
memoryId: string;
|
|
13
|
+
predecessorMemoryId: string | null;
|
|
14
|
+
observationDate: Date;
|
|
15
|
+
positionInChain: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class TllRepository {
|
|
18
|
+
private pool;
|
|
19
|
+
constructor(pool: pg.Pool);
|
|
20
|
+
/**
|
|
21
|
+
* Append an event node to each entity's chain. Idempotent on
|
|
22
|
+
* (user_id, entity_id, memory_id). Predecessor is the most-recent
|
|
23
|
+
* existing event for the entity; position is len(chain).
|
|
24
|
+
*
|
|
25
|
+
* Race-safety: each (user_id, entity_id) append runs inside a transaction
|
|
26
|
+
* guarded by `pg_advisory_xact_lock`. Concurrent appends targeting the
|
|
27
|
+
* same chain serialize on the lock, then compute the next position from
|
|
28
|
+
* committed rows via INSERT...SELECT. The
|
|
29
|
+
* `(user_id, entity_id, position_in_chain)` unique index is the
|
|
30
|
+
* defense-in-depth backstop that fails loudly if any caller bypasses the
|
|
31
|
+
* lock path.
|
|
32
|
+
*/
|
|
33
|
+
append(userId: string, memoryId: string, entityIds: string[], observationDate: Date): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Append one (entity, memory) row under an advisory lock keyed on the
|
|
36
|
+
* chain. The INSERT...SELECT computes predecessor + position inline from
|
|
37
|
+
* the latest committed row, so the read-then-write window the previous
|
|
38
|
+
* implementation exposed cannot reorder concurrent appends.
|
|
39
|
+
*/
|
|
40
|
+
private appendOne;
|
|
41
|
+
/**
|
|
42
|
+
* Get the full event chain for an entity, ordered by observation_date
|
|
43
|
+
* (the conversation timestamp). Used for EO/TR/MSR queries that need
|
|
44
|
+
* chronological order — a backfilled event with an earlier
|
|
45
|
+
* observation_date surfaces in its true chronological position even
|
|
46
|
+
* though it was inserted last.
|
|
47
|
+
*
|
|
48
|
+
* `positionInChain` returned here is the 0-based chronological rank,
|
|
49
|
+
* derived via `ROW_NUMBER()` over the chronological order. The stored
|
|
50
|
+
* `position_in_chain` column is insertion-order audit metadata and is
|
|
51
|
+
* not exposed by this API. `predecessorMemoryId` is the immediate
|
|
52
|
+
* chronologically-prior memory (via `LAG()`) — also chronological,
|
|
53
|
+
* not the position-tip predecessor recorded at insert time.
|
|
54
|
+
*
|
|
55
|
+
* Tiebreaker for events sharing an `observation_date` (e.g. the same
|
|
56
|
+
* conversation timestamp) is the stored `position_in_chain` (insertion
|
|
57
|
+
* order), keeping the result deterministic.
|
|
58
|
+
*/
|
|
59
|
+
chain(userId: string, entityId: string): Promise<TLLEvent[]>;
|
|
60
|
+
/**
|
|
61
|
+
* Bulk: get chains for multiple entities. Returns memory_ids in order
|
|
62
|
+
* across all entity chains, deduplicated. Used as a retrieval signal
|
|
63
|
+
* for queries that span multiple entities (MSR).
|
|
64
|
+
*/
|
|
65
|
+
chainsFor(userId: string, entityIds: string[]): Promise<string[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Bulk-retrieve enriched event chains: per-entity ordered list of events
|
|
68
|
+
* joined with memory content. Used by the event-chains HTTP endpoint and
|
|
69
|
+
* by EO-shaped read paths that need content alongside chain position.
|
|
70
|
+
*
|
|
71
|
+
* Returns one entry per entity; entities with no events are dropped.
|
|
72
|
+
* Within an entity, events are ordered by `observation_date` (the
|
|
73
|
+
* conversation timestamp), not insertion order — see `chain()` for
|
|
74
|
+
* the rationale and the `LAG`/`ROW_NUMBER` derivation of
|
|
75
|
+
* `predecessorMemoryId` and `positionInChain`. Tiebreaker for events
|
|
76
|
+
* sharing an observation_date is the stored insertion `position_in_chain`.
|
|
77
|
+
*/
|
|
78
|
+
chainEventsForEntities(userId: string, entityIds: string[]): Promise<Array<{
|
|
79
|
+
entityId: string;
|
|
80
|
+
events: Array<{
|
|
81
|
+
memoryId: string;
|
|
82
|
+
content: string;
|
|
83
|
+
observationDate: Date;
|
|
84
|
+
positionInChain: number;
|
|
85
|
+
predecessorMemoryId: string | null;
|
|
86
|
+
}>;
|
|
87
|
+
}>>;
|
|
88
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository for the Temporal Linkage List (TLL) — per-entity sparse graph
|
|
3
|
+
* of event nodes connected by predecessor/successor edges.
|
|
4
|
+
*
|
|
5
|
+
* Purpose: maintain "what happened in what order, per entity" without
|
|
6
|
+
* paying the full graph-DB cost. Each new memory referencing an entity
|
|
7
|
+
* appends an event node; the predecessor pointer lets us traverse the
|
|
8
|
+
* chain backward at query time for EO/MSR/TR questions.
|
|
9
|
+
*/
|
|
10
|
+
// Stable namespace for pg_advisory_xact_lock keying. Keeps TLL appends from
|
|
11
|
+
// colliding with unrelated advisory-lock callers in the same process.
|
|
12
|
+
const TLL_ADVISORY_LOCK_NAMESPACE = 0x544c4c00; // "TLL\0"
|
|
13
|
+
export class TllRepository {
|
|
14
|
+
pool;
|
|
15
|
+
constructor(pool) {
|
|
16
|
+
this.pool = pool;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Append an event node to each entity's chain. Idempotent on
|
|
20
|
+
* (user_id, entity_id, memory_id). Predecessor is the most-recent
|
|
21
|
+
* existing event for the entity; position is len(chain).
|
|
22
|
+
*
|
|
23
|
+
* Race-safety: each (user_id, entity_id) append runs inside a transaction
|
|
24
|
+
* guarded by `pg_advisory_xact_lock`. Concurrent appends targeting the
|
|
25
|
+
* same chain serialize on the lock, then compute the next position from
|
|
26
|
+
* committed rows via INSERT...SELECT. The
|
|
27
|
+
* `(user_id, entity_id, position_in_chain)` unique index is the
|
|
28
|
+
* defense-in-depth backstop that fails loudly if any caller bypasses the
|
|
29
|
+
* lock path.
|
|
30
|
+
*/
|
|
31
|
+
async append(userId, memoryId, entityIds, observationDate) {
|
|
32
|
+
if (entityIds.length === 0)
|
|
33
|
+
return;
|
|
34
|
+
const uniqueEntities = [...new Set(entityIds)];
|
|
35
|
+
// Per-entity transactions keep the advisory-lock scope narrow and let
|
|
36
|
+
// independent chains proceed in parallel.
|
|
37
|
+
for (const entityId of uniqueEntities) {
|
|
38
|
+
await this.appendOne(userId, memoryId, entityId, observationDate);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Append one (entity, memory) row under an advisory lock keyed on the
|
|
43
|
+
* chain. The INSERT...SELECT computes predecessor + position inline from
|
|
44
|
+
* the latest committed row, so the read-then-write window the previous
|
|
45
|
+
* implementation exposed cannot reorder concurrent appends.
|
|
46
|
+
*/
|
|
47
|
+
async appendOne(userId, memoryId, entityId, observationDate) {
|
|
48
|
+
const client = await this.pool.connect();
|
|
49
|
+
try {
|
|
50
|
+
await client.query('BEGIN');
|
|
51
|
+
await client.query('SELECT pg_advisory_xact_lock($1, hashtext($2))', [
|
|
52
|
+
TLL_ADVISORY_LOCK_NAMESPACE,
|
|
53
|
+
`${userId}:${entityId}`,
|
|
54
|
+
]);
|
|
55
|
+
await client.query(`INSERT INTO temporal_linkage_list
|
|
56
|
+
(user_id, entity_id, memory_id, predecessor_memory_id,
|
|
57
|
+
observation_date, position_in_chain)
|
|
58
|
+
SELECT
|
|
59
|
+
$1, $2, $3,
|
|
60
|
+
(SELECT memory_id FROM temporal_linkage_list
|
|
61
|
+
WHERE user_id = $1 AND entity_id = $2
|
|
62
|
+
ORDER BY position_in_chain DESC LIMIT 1),
|
|
63
|
+
$4,
|
|
64
|
+
COALESCE(
|
|
65
|
+
(SELECT MAX(position_in_chain) FROM temporal_linkage_list
|
|
66
|
+
WHERE user_id = $1 AND entity_id = $2),
|
|
67
|
+
-1
|
|
68
|
+
) + 1
|
|
69
|
+
ON CONFLICT (user_id, entity_id, memory_id) DO NOTHING`, [userId, entityId, memoryId, observationDate]);
|
|
70
|
+
await client.query('COMMIT');
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
await client.query('ROLLBACK').catch((rollbackErr) => console.error('[tll] rollback failed:', rollbackErr instanceof Error ? rollbackErr.message : rollbackErr));
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
client.release();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get the full event chain for an entity, ordered by observation_date
|
|
82
|
+
* (the conversation timestamp). Used for EO/TR/MSR queries that need
|
|
83
|
+
* chronological order — a backfilled event with an earlier
|
|
84
|
+
* observation_date surfaces in its true chronological position even
|
|
85
|
+
* though it was inserted last.
|
|
86
|
+
*
|
|
87
|
+
* `positionInChain` returned here is the 0-based chronological rank,
|
|
88
|
+
* derived via `ROW_NUMBER()` over the chronological order. The stored
|
|
89
|
+
* `position_in_chain` column is insertion-order audit metadata and is
|
|
90
|
+
* not exposed by this API. `predecessorMemoryId` is the immediate
|
|
91
|
+
* chronologically-prior memory (via `LAG()`) — also chronological,
|
|
92
|
+
* not the position-tip predecessor recorded at insert time.
|
|
93
|
+
*
|
|
94
|
+
* Tiebreaker for events sharing an `observation_date` (e.g. the same
|
|
95
|
+
* conversation timestamp) is the stored `position_in_chain` (insertion
|
|
96
|
+
* order), keeping the result deterministic.
|
|
97
|
+
*/
|
|
98
|
+
async chain(userId, entityId) {
|
|
99
|
+
const result = await this.pool.query(`SELECT memory_id,
|
|
100
|
+
observation_date,
|
|
101
|
+
LAG(memory_id) OVER w AS chronological_predecessor,
|
|
102
|
+
ROW_NUMBER() OVER w - 1 AS chronological_position
|
|
103
|
+
FROM temporal_linkage_list
|
|
104
|
+
WHERE user_id = $1 AND entity_id = $2
|
|
105
|
+
WINDOW w AS (ORDER BY observation_date ASC, position_in_chain ASC)
|
|
106
|
+
ORDER BY observation_date ASC, position_in_chain ASC`, [userId, entityId]);
|
|
107
|
+
return result.rows.map((row) => ({
|
|
108
|
+
memoryId: row.memory_id,
|
|
109
|
+
predecessorMemoryId: row.chronological_predecessor ?? null,
|
|
110
|
+
observationDate: row.observation_date,
|
|
111
|
+
positionInChain: Number(row.chronological_position),
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Bulk: get chains for multiple entities. Returns memory_ids in order
|
|
116
|
+
* across all entity chains, deduplicated. Used as a retrieval signal
|
|
117
|
+
* for queries that span multiple entities (MSR).
|
|
118
|
+
*/
|
|
119
|
+
async chainsFor(userId, entityIds) {
|
|
120
|
+
if (entityIds.length === 0)
|
|
121
|
+
return [];
|
|
122
|
+
const result = await this.pool.query(`SELECT DISTINCT memory_id, observation_date
|
|
123
|
+
FROM temporal_linkage_list
|
|
124
|
+
WHERE user_id = $1 AND entity_id = ANY($2::uuid[])
|
|
125
|
+
ORDER BY observation_date ASC`, [userId, [...new Set(entityIds)]]);
|
|
126
|
+
return result.rows.map((row) => row.memory_id);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Bulk-retrieve enriched event chains: per-entity ordered list of events
|
|
130
|
+
* joined with memory content. Used by the event-chains HTTP endpoint and
|
|
131
|
+
* by EO-shaped read paths that need content alongside chain position.
|
|
132
|
+
*
|
|
133
|
+
* Returns one entry per entity; entities with no events are dropped.
|
|
134
|
+
* Within an entity, events are ordered by `observation_date` (the
|
|
135
|
+
* conversation timestamp), not insertion order — see `chain()` for
|
|
136
|
+
* the rationale and the `LAG`/`ROW_NUMBER` derivation of
|
|
137
|
+
* `predecessorMemoryId` and `positionInChain`. Tiebreaker for events
|
|
138
|
+
* sharing an observation_date is the stored insertion `position_in_chain`.
|
|
139
|
+
*/
|
|
140
|
+
async chainEventsForEntities(userId, entityIds) {
|
|
141
|
+
if (entityIds.length === 0)
|
|
142
|
+
return [];
|
|
143
|
+
const unique = [...new Set(entityIds)];
|
|
144
|
+
// `m.workspace_id IS NULL` — this is the global event-chain endpoint;
|
|
145
|
+
// workspace-scoped memories must not surface here even if they share
|
|
146
|
+
// an entity with a global memory.
|
|
147
|
+
const result = await this.pool.query(`SELECT t.entity_id,
|
|
148
|
+
t.memory_id,
|
|
149
|
+
t.observation_date,
|
|
150
|
+
LAG(t.memory_id) OVER w AS chronological_predecessor,
|
|
151
|
+
ROW_NUMBER() OVER w - 1 AS chronological_position,
|
|
152
|
+
m.content
|
|
153
|
+
FROM temporal_linkage_list t
|
|
154
|
+
JOIN memories m ON m.id = t.memory_id
|
|
155
|
+
WHERE t.user_id = $1
|
|
156
|
+
AND t.entity_id = ANY($2::uuid[])
|
|
157
|
+
AND m.deleted_at IS NULL
|
|
158
|
+
AND m.status = 'active'
|
|
159
|
+
AND m.workspace_id IS NULL
|
|
160
|
+
WINDOW w AS (
|
|
161
|
+
PARTITION BY t.entity_id
|
|
162
|
+
ORDER BY t.observation_date ASC, t.position_in_chain ASC
|
|
163
|
+
)
|
|
164
|
+
ORDER BY t.entity_id, t.observation_date ASC, t.position_in_chain ASC`, [userId, unique]);
|
|
165
|
+
const grouped = new Map();
|
|
166
|
+
for (const row of result.rows) {
|
|
167
|
+
const list = grouped.get(row.entity_id) ?? [];
|
|
168
|
+
list.push({
|
|
169
|
+
memoryId: row.memory_id,
|
|
170
|
+
content: row.content,
|
|
171
|
+
observationDate: row.observation_date,
|
|
172
|
+
positionInChain: Number(row.chronological_position),
|
|
173
|
+
predecessorMemoryId: row.chronological_predecessor ?? null,
|
|
174
|
+
});
|
|
175
|
+
grouped.set(row.entity_id, list);
|
|
176
|
+
}
|
|
177
|
+
return [...grouped.entries()].map(([entityId, events]) => ({ entityId, events }));
|
|
178
|
+
}
|
|
179
|
+
}
|