@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,36 @@
|
|
|
1
|
+
export async function processOnePendingJob(deps) {
|
|
2
|
+
const [job] = await deps.jobs.fetchPending(1);
|
|
3
|
+
if (!job)
|
|
4
|
+
return false;
|
|
5
|
+
await deps.jobs.markInProgress(job.id);
|
|
6
|
+
try {
|
|
7
|
+
await deps.runReflect(job.userId, job.conversationId);
|
|
8
|
+
await deps.jobs.markCompleted(job.id);
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
12
|
+
await deps.jobs.markFailed(job.id, msg);
|
|
13
|
+
}
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
export function startReflectWorker(deps, pollMs) {
|
|
17
|
+
let stopped = false;
|
|
18
|
+
const tick = async () => {
|
|
19
|
+
if (stopped)
|
|
20
|
+
return;
|
|
21
|
+
try {
|
|
22
|
+
const didWork = await processOnePendingJob(deps);
|
|
23
|
+
if (!didWork) {
|
|
24
|
+
await new Promise(r => setTimeout(r, pollMs));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
console.error('[reflect-worker] unexpected error:', e);
|
|
29
|
+
await new Promise(r => setTimeout(r, pollMs * 2));
|
|
30
|
+
}
|
|
31
|
+
if (!stopped)
|
|
32
|
+
void tick();
|
|
33
|
+
};
|
|
34
|
+
void tick();
|
|
35
|
+
return { stop: () => { stopped = true; } };
|
|
36
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt assembly + Anthropic tool-use schema for the async Reflect step.
|
|
3
|
+
*
|
|
4
|
+
* The Reflect call presents Sonnet with a chronologically-sorted list of the
|
|
5
|
+
* session's raw memories (each with its memory id and observed_at) and asks
|
|
6
|
+
* Sonnet to consolidate them into a small set of typed observations. Each
|
|
7
|
+
* observation MUST cite the memory_ids it draws from, so retrieval can verify
|
|
8
|
+
* evidence still exists when the observation is later read by the answer LLM.
|
|
9
|
+
*
|
|
10
|
+
* Tool-use guarantees structured output — Sonnet returns a JSON payload that
|
|
11
|
+
* matches REFLECT_TOOL_SCHEMA, eliminating the freeform-prose parsing failures
|
|
12
|
+
* we saw with the Sprint 3 verifier pass.
|
|
13
|
+
*/
|
|
14
|
+
export interface ReflectMemoryInput {
|
|
15
|
+
id: string;
|
|
16
|
+
text: string;
|
|
17
|
+
observedAt: Date;
|
|
18
|
+
}
|
|
19
|
+
export interface ReflectMessages {
|
|
20
|
+
system: string;
|
|
21
|
+
user: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const REFLECT_TOOL_SCHEMA: {
|
|
24
|
+
readonly name: "record_observations";
|
|
25
|
+
readonly description: "Persist the consolidated observations for this conversation.";
|
|
26
|
+
readonly input_schema: {
|
|
27
|
+
readonly type: "object";
|
|
28
|
+
readonly properties: {
|
|
29
|
+
readonly observations: {
|
|
30
|
+
readonly type: "array";
|
|
31
|
+
readonly items: {
|
|
32
|
+
readonly type: "object";
|
|
33
|
+
readonly required: readonly ["text", "type", "evidence_memory_ids"];
|
|
34
|
+
readonly properties: {
|
|
35
|
+
readonly text: {
|
|
36
|
+
readonly type: "string";
|
|
37
|
+
};
|
|
38
|
+
readonly type: {
|
|
39
|
+
readonly type: "string";
|
|
40
|
+
readonly enum: readonly ["entity_state", "event_summary", "preference", "contradiction", "decision", "numeric_value"];
|
|
41
|
+
};
|
|
42
|
+
readonly evidence_memory_ids: {
|
|
43
|
+
readonly type: "array";
|
|
44
|
+
readonly items: {
|
|
45
|
+
readonly type: "string";
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
readonly required: readonly ["observations"];
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
export declare function buildReflectMessages(memories: readonly ReflectMemoryInput[]): ReflectMessages;
|
|
56
|
+
/**
|
|
57
|
+
* Input shape for entity-card synthesis. One observation per row, with the
|
|
58
|
+
* observation_id citation, observation date, and observation text. Used by
|
|
59
|
+
* the always-on ENTITY_CARD channel synthesizer.
|
|
60
|
+
*/
|
|
61
|
+
export interface EntityCardObservationInput {
|
|
62
|
+
id: string;
|
|
63
|
+
text: string;
|
|
64
|
+
observedAt: Date;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Assemble the messages for an entity-card synthesis call. The model sees the
|
|
68
|
+
* prior card (if any) and a list of new observations citing their obs_ids
|
|
69
|
+
* and dates, and is asked to output ONLY the updated card text.
|
|
70
|
+
*/
|
|
71
|
+
export declare function buildEntityCardMessages(entityName: string, priorCardText: string | null, observations: readonly EntityCardObservationInput[]): ReflectMessages;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt assembly + Anthropic tool-use schema for the async Reflect step.
|
|
3
|
+
*
|
|
4
|
+
* The Reflect call presents Sonnet with a chronologically-sorted list of the
|
|
5
|
+
* session's raw memories (each with its memory id and observed_at) and asks
|
|
6
|
+
* Sonnet to consolidate them into a small set of typed observations. Each
|
|
7
|
+
* observation MUST cite the memory_ids it draws from, so retrieval can verify
|
|
8
|
+
* evidence still exists when the observation is later read by the answer LLM.
|
|
9
|
+
*
|
|
10
|
+
* Tool-use guarantees structured output — Sonnet returns a JSON payload that
|
|
11
|
+
* matches REFLECT_TOOL_SCHEMA, eliminating the freeform-prose parsing failures
|
|
12
|
+
* we saw with the Sprint 3 verifier pass.
|
|
13
|
+
*/
|
|
14
|
+
const SYSTEM_PROMPT = [
|
|
15
|
+
'You are consolidating a single conversation\'s raw memories into a small set of typed observations.',
|
|
16
|
+
'Each observation must (a) be answerable from the cited evidence_memory_ids alone, (b) prefer concrete factual claims over narrative, (c) avoid restating the raw facts verbatim.',
|
|
17
|
+
'',
|
|
18
|
+
'Observation types (use exactly one per observation):',
|
|
19
|
+
'- entity_state: the current value of an attribute on an entity, with the latest-known value',
|
|
20
|
+
'- event_summary: a discrete event or action that happened',
|
|
21
|
+
'- preference: a stated user preference, opinion, or choice',
|
|
22
|
+
'- contradiction: two facts in the session that disagree (include both sides)',
|
|
23
|
+
'- decision: a user decision made during the session',
|
|
24
|
+
'- numeric_value: a numeric fact (count, amount, duration, percentage)',
|
|
25
|
+
'',
|
|
26
|
+
'REQUIRED FIRST OBSERVATION — topic inventory:',
|
|
27
|
+
'Always emit FIRST an event_summary observation whose text BEGINS with "TOPIC_INVENTORY: " followed by a comma-separated list of the 3–8 distinct top-level concerns/topics/features discussed in this session. GROUP related items into broad categories (e.g. "error handling for 404", "error handling for 401", and "retry logic" → ONE category "API error handling"). The count of items in this list will be used to answer "how many distinct X did I mention" questions, so prefer the smallest reasonable number of broad categories. Cite all relevant memory_ids as evidence.',
|
|
28
|
+
'',
|
|
29
|
+
'Output 5–15 observations TOTAL (including the required topic inventory). Call the record_observations tool.',
|
|
30
|
+
].join('\n');
|
|
31
|
+
export const REFLECT_TOOL_SCHEMA = {
|
|
32
|
+
name: 'record_observations',
|
|
33
|
+
description: 'Persist the consolidated observations for this conversation.',
|
|
34
|
+
input_schema: {
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
observations: {
|
|
38
|
+
type: 'array',
|
|
39
|
+
items: {
|
|
40
|
+
type: 'object',
|
|
41
|
+
required: ['text', 'type', 'evidence_memory_ids'],
|
|
42
|
+
properties: {
|
|
43
|
+
text: { type: 'string' },
|
|
44
|
+
type: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
enum: [
|
|
47
|
+
'entity_state', 'event_summary', 'preference',
|
|
48
|
+
'contradiction', 'decision', 'numeric_value',
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
evidence_memory_ids: {
|
|
52
|
+
type: 'array',
|
|
53
|
+
items: { type: 'string' },
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
required: ['observations'],
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
export function buildReflectMessages(memories) {
|
|
63
|
+
const lines = memories.map(m => `[${m.id}] (${m.observedAt.toISOString().slice(0, 10)}) ${m.text}`);
|
|
64
|
+
const user = ['Memories from this conversation (chronological):', '', ...lines].join('\n');
|
|
65
|
+
return { system: SYSTEM_PROMPT, user };
|
|
66
|
+
}
|
|
67
|
+
const ENTITY_CARD_SYSTEM_PROMPT = (entityName) => [
|
|
68
|
+
`You maintain a durable summary card for entity "${entityName}".`,
|
|
69
|
+
'',
|
|
70
|
+
'The card is read by an answer LLM that must respond to questions about this entity',
|
|
71
|
+
'across multiple sessions without re-retrieving raw memories. The card must be',
|
|
72
|
+
'self-contained, dated where relevant, and capture:',
|
|
73
|
+
'- identity',
|
|
74
|
+
'- current_values (latest known values)',
|
|
75
|
+
'- preferences',
|
|
76
|
+
'- decisions',
|
|
77
|
+
'- contradictions (both sides if any)',
|
|
78
|
+
'- open_threads',
|
|
79
|
+
'',
|
|
80
|
+
'Hard limit: 250 tokens. Prefer short bulleted lines over prose.',
|
|
81
|
+
].join('\n');
|
|
82
|
+
/**
|
|
83
|
+
* Assemble the messages for an entity-card synthesis call. The model sees the
|
|
84
|
+
* prior card (if any) and a list of new observations citing their obs_ids
|
|
85
|
+
* and dates, and is asked to output ONLY the updated card text.
|
|
86
|
+
*/
|
|
87
|
+
export function buildEntityCardMessages(entityName, priorCardText, observations) {
|
|
88
|
+
const obsLines = observations.map(o => `[${o.id}] (${o.observedAt.toISOString().slice(0, 10)}) ${o.text}`);
|
|
89
|
+
const user = [
|
|
90
|
+
'Prior card:',
|
|
91
|
+
priorCardText && priorCardText.trim().length > 0 ? priorCardText : '(none)',
|
|
92
|
+
'',
|
|
93
|
+
'New observations:',
|
|
94
|
+
...obsLines,
|
|
95
|
+
'',
|
|
96
|
+
'Output ONLY the updated card text. No preamble.',
|
|
97
|
+
].join('\n');
|
|
98
|
+
return { system: ENTITY_CARD_SYSTEM_PROMPT(entityName), user };
|
|
99
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query-time reflection retrieval. When the question classifier returns one of
|
|
3
|
+
* the "synthesis-heavy" types (summary, contradiction, preference, ...), this
|
|
4
|
+
* module embeds the query and pulls top-K reflections by cosine similarity.
|
|
5
|
+
* The result is later emitted as a ## OBSERVATIONS prompt channel by
|
|
6
|
+
* retrieval-format.ts.
|
|
7
|
+
*
|
|
8
|
+
* Returns [] when disabled or when the question type is OTHER — the caller
|
|
9
|
+
* passes the empty array through and downstream packaging emits no
|
|
10
|
+
* observations block.
|
|
11
|
+
*/
|
|
12
|
+
import type { Reflection, ReflectionsRepository } from '../db/reflections-repository.js';
|
|
13
|
+
import { QuestionType } from './answer-format.js';
|
|
14
|
+
export interface ReflectRetrievalDeps {
|
|
15
|
+
reflections: Pick<ReflectionsRepository, 'findSimilar'>;
|
|
16
|
+
embed: (text: string) => Promise<number[]>;
|
|
17
|
+
topK: number;
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Fetch reflections most similar to a user query by cosine similarity.
|
|
22
|
+
*
|
|
23
|
+
* When `enabled` is false, returns []. When the question type is OTHER or
|
|
24
|
+
* ABSTAIN, returns [] (no routing). Otherwise embeds the query and calls
|
|
25
|
+
* findSimilar on the session_reflections table.
|
|
26
|
+
*
|
|
27
|
+
* @param deps DI container with reflections repo, embeddings fn, config
|
|
28
|
+
* @param userId User ID for scoping the reflection query
|
|
29
|
+
* @param query Raw user question string to embed
|
|
30
|
+
* @param questionType Classified question type from answer-format classifier
|
|
31
|
+
* @returns Array of Reflection objects, empty if disabled or not routed
|
|
32
|
+
*/
|
|
33
|
+
export declare function fetchReflectionsForQuery(deps: ReflectRetrievalDeps, userId: string, query: string, questionType: QuestionType): Promise<Reflection[]>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { QuestionType } from './answer-format.js';
|
|
2
|
+
const ROUTED_TYPES = new Set([
|
|
3
|
+
QuestionType.SUMMARY,
|
|
4
|
+
QuestionType.CONTRADICTION,
|
|
5
|
+
QuestionType.PREFERENCE,
|
|
6
|
+
QuestionType.NUMERIC_COUNT,
|
|
7
|
+
QuestionType.EXACT_DATE,
|
|
8
|
+
QuestionType.ORDERED_LIST,
|
|
9
|
+
]);
|
|
10
|
+
/**
|
|
11
|
+
* Fetch reflections most similar to a user query by cosine similarity.
|
|
12
|
+
*
|
|
13
|
+
* When `enabled` is false, returns []. When the question type is OTHER or
|
|
14
|
+
* ABSTAIN, returns [] (no routing). Otherwise embeds the query and calls
|
|
15
|
+
* findSimilar on the session_reflections table.
|
|
16
|
+
*
|
|
17
|
+
* @param deps DI container with reflections repo, embeddings fn, config
|
|
18
|
+
* @param userId User ID for scoping the reflection query
|
|
19
|
+
* @param query Raw user question string to embed
|
|
20
|
+
* @param questionType Classified question type from answer-format classifier
|
|
21
|
+
* @returns Array of Reflection objects, empty if disabled or not routed
|
|
22
|
+
*/
|
|
23
|
+
export async function fetchReflectionsForQuery(deps, userId, query, questionType) {
|
|
24
|
+
if (!deps.enabled)
|
|
25
|
+
return [];
|
|
26
|
+
if (!ROUTED_TYPES.has(questionType))
|
|
27
|
+
return [];
|
|
28
|
+
const embedding = await deps.embed(query);
|
|
29
|
+
return deps.reflections.findSimilar(userId, embedding, deps.topK);
|
|
30
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reflect orchestrator. Pulls a conversation's memories, sends them to the
|
|
3
|
+
* answer-LLM tool-use endpoint with the record_observations schema, embeds
|
|
4
|
+
* each returned observation, and persists them to session_reflections.
|
|
5
|
+
*
|
|
6
|
+
* Also drives the always-on ENTITY_CARD channel: after observations are
|
|
7
|
+
* persisted, groups them by entity, loads the prior cards for the
|
|
8
|
+
* conversation, calls the entity-card synthesizer (Sonnet 4.5), and upserts
|
|
9
|
+
* each resulting card. Entity-card synthesis is gated by
|
|
10
|
+
* `runtimeConfig.entityCardEnabled` and uses Promise.allSettled to fail
|
|
11
|
+
* soft on individual entity failures — each rejection is logged.
|
|
12
|
+
*
|
|
13
|
+
* Pure dependency-injected — the worker (reflect-jobs) supplies real
|
|
14
|
+
* implementations; tests supply mocks. No I/O of its own beyond what the
|
|
15
|
+
* injected dependencies do.
|
|
16
|
+
*/
|
|
17
|
+
import type { ReflectionsRepository, ObservationType } from '../db/reflections-repository.js';
|
|
18
|
+
import type { EntityCardsRepository } from '../db/entity-cards-repository.js';
|
|
19
|
+
import { REFLECT_TOOL_SCHEMA, type ReflectMemoryInput } from './reflect-prompts.js';
|
|
20
|
+
import { type SynthesizeCardsDeps } from './entity-card-synthesis.js';
|
|
21
|
+
export interface ReflectToolOutput {
|
|
22
|
+
observations: Array<{
|
|
23
|
+
text: string;
|
|
24
|
+
type: ObservationType;
|
|
25
|
+
evidence_memory_ids: string[];
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
28
|
+
/** Optional entity-card dependencies; absent when entityCardEnabled is false. */
|
|
29
|
+
export interface ReflectEntityCardDeps {
|
|
30
|
+
enabled: boolean;
|
|
31
|
+
repo: EntityCardsRepository;
|
|
32
|
+
synth: SynthesizeCardsDeps;
|
|
33
|
+
maxCardsPerSession: number;
|
|
34
|
+
}
|
|
35
|
+
export interface ReflectDeps {
|
|
36
|
+
fetchMemories: (userId: string, conversationId: string) => Promise<readonly ReflectMemoryInput[]>;
|
|
37
|
+
llmCallTool: (system: string, user: string, toolSchema: typeof REFLECT_TOOL_SCHEMA) => Promise<ReflectToolOutput>;
|
|
38
|
+
embed: (text: string) => Promise<number[]>;
|
|
39
|
+
reflections: Pick<ReflectionsRepository, 'insertMany'>;
|
|
40
|
+
maxObservations: number;
|
|
41
|
+
/** Optional always-on ENTITY_CARD channel. When absent, no cards are synthesized. */
|
|
42
|
+
entityCards?: ReflectEntityCardDeps;
|
|
43
|
+
}
|
|
44
|
+
export interface ReflectResult {
|
|
45
|
+
count: number;
|
|
46
|
+
/** Number of entity cards upserted in this run. 0 when entity cards are disabled. */
|
|
47
|
+
entityCardCount: number;
|
|
48
|
+
}
|
|
49
|
+
export declare function runReflectForConversation(deps: ReflectDeps, userId: string, conversationId: string): Promise<ReflectResult>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { buildReflectMessages, REFLECT_TOOL_SCHEMA, } from './reflect-prompts.js';
|
|
2
|
+
import { synthesizeCards, } from './entity-card-synthesis.js';
|
|
3
|
+
export async function runReflectForConversation(deps, userId, conversationId) {
|
|
4
|
+
const memories = await deps.fetchMemories(userId, conversationId);
|
|
5
|
+
if (memories.length === 0)
|
|
6
|
+
return { count: 0, entityCardCount: 0 };
|
|
7
|
+
const { system, user } = buildReflectMessages(memories);
|
|
8
|
+
const out = await deps.llmCallTool(system, user, REFLECT_TOOL_SCHEMA);
|
|
9
|
+
const truncated = out.observations.slice(0, deps.maxObservations);
|
|
10
|
+
const rows = [];
|
|
11
|
+
for (const o of truncated) {
|
|
12
|
+
const embedding = await deps.embed(o.text);
|
|
13
|
+
rows.push({
|
|
14
|
+
userId,
|
|
15
|
+
conversationId,
|
|
16
|
+
observation: o.text,
|
|
17
|
+
observationType: o.type,
|
|
18
|
+
evidenceMemoryIds: o.evidence_memory_ids,
|
|
19
|
+
embedding,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
await deps.reflections.insertMany(rows);
|
|
23
|
+
const entityCardCount = await maybeSynthesizeEntityCards(deps.entityCards, userId, conversationId, truncated, rows);
|
|
24
|
+
return { count: rows.length, entityCardCount };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Drive the always-on ENTITY_CARD channel. Returns the number of cards
|
|
28
|
+
* upserted. Fails soft on individual entity synthesis errors (each rejection
|
|
29
|
+
* is logged via console.error per CLAUDE.md "no silent error catching").
|
|
30
|
+
*/
|
|
31
|
+
async function maybeSynthesizeEntityCards(entityCards, userId, conversationId, truncatedObs, rows) {
|
|
32
|
+
if (!entityCards || !entityCards.enabled)
|
|
33
|
+
return 0;
|
|
34
|
+
void rows; // rows reserved for future provenance threading
|
|
35
|
+
// Synthetic observation IDs: the reflect insertMany path does not
|
|
36
|
+
// return persisted IDs in the v1 schema, so we cite the index. Future
|
|
37
|
+
// work: thread row IDs through repository for full provenance.
|
|
38
|
+
const obsForCards = truncatedObs.map((o, idx) => ({
|
|
39
|
+
id: `obs-${idx}`,
|
|
40
|
+
text: o.text,
|
|
41
|
+
type: o.type,
|
|
42
|
+
observedAt: new Date(),
|
|
43
|
+
}));
|
|
44
|
+
// BEAM/AMB note: the upstream harness encodes BEAM's conversation_id INTO
|
|
45
|
+
// user_id (per-conversation isolation). The reflect job's conversationId is
|
|
46
|
+
// a fresh episodeId per ingest, so cards keyed on it never accumulate across
|
|
47
|
+
// a conversation's many ingests. Scope entity-cards by userId on both sides:
|
|
48
|
+
// write and read both use userId as the conversation key so cards build up
|
|
49
|
+
// across the lifetime of the conversation. Outside the BEAM benchmark this
|
|
50
|
+
// still gives per-conversation scoping because consumers pass conversation-
|
|
51
|
+
// unique userIds via the AtomicMemory v1 API.
|
|
52
|
+
void conversationId;
|
|
53
|
+
const cardScope = userId;
|
|
54
|
+
const priorCards = await loadPriorCards(entityCards, userId, cardScope);
|
|
55
|
+
const cards = await synthesizeCards(obsForCards, priorCards, entityCards.synth);
|
|
56
|
+
const settled = await Promise.allSettled(cards.map((card) => entityCards.repo.upsert({
|
|
57
|
+
userId,
|
|
58
|
+
conversationId: cardScope,
|
|
59
|
+
entityName: card.entityName,
|
|
60
|
+
cardText: card.cardText,
|
|
61
|
+
sourceObservationIds: card.sourceObservationIds,
|
|
62
|
+
version: 1, // repo ON CONFLICT increments via entity_cards.version + 1
|
|
63
|
+
})));
|
|
64
|
+
let upserted = 0;
|
|
65
|
+
for (const r of settled) {
|
|
66
|
+
if (r.status === 'fulfilled')
|
|
67
|
+
upserted += 1;
|
|
68
|
+
else
|
|
69
|
+
console.error('[reflect:entity-card] upsert failed:', r.reason);
|
|
70
|
+
}
|
|
71
|
+
return upserted;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Load prior cards for the conversation and return a (entityName -> cardText)
|
|
75
|
+
* lookup map. Errors propagate to the caller (entity-card synthesis is
|
|
76
|
+
* fail-soft at the worker boundary).
|
|
77
|
+
*/
|
|
78
|
+
async function loadPriorCards(entityCards, userId, conversationId) {
|
|
79
|
+
const prior = await entityCards.repo.findByConversation(userId, conversationId, entityCards.maxCardsPerSession);
|
|
80
|
+
const map = new Map();
|
|
81
|
+
for (const p of prior)
|
|
82
|
+
map.set(p.entityName, p.cardText);
|
|
83
|
+
return map;
|
|
84
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared relative-temporal helpers for deterministic extraction and retrieval.
|
|
3
|
+
* Converts phrases like "yesterday" or "next month" into explicit anchors
|
|
4
|
+
* without depending on an LLM.
|
|
5
|
+
*/
|
|
6
|
+
export type RelativeTemporalPrecision = 'day' | 'week' | 'month';
|
|
7
|
+
export interface RelativeTemporalAnchor {
|
|
8
|
+
eventDate: string;
|
|
9
|
+
precision: RelativeTemporalPrecision;
|
|
10
|
+
phrase: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function annotateRelativeTemporalText(text: string, recordedDate: Date): string;
|
|
13
|
+
export declare function extractRelativeTemporalAnchors(text: string, recordedDate: Date): RelativeTemporalAnchor[];
|
|
14
|
+
export declare function containsRelativeTemporalPhrase(text: string): boolean;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared relative-temporal helpers for deterministic extraction and retrieval.
|
|
3
|
+
* Converts phrases like "yesterday" or "next month" into explicit anchors
|
|
4
|
+
* without depending on an LLM.
|
|
5
|
+
*/
|
|
6
|
+
const WEEKDAY_INDEX = {
|
|
7
|
+
sunday: 0,
|
|
8
|
+
monday: 1,
|
|
9
|
+
tuesday: 2,
|
|
10
|
+
wednesday: 3,
|
|
11
|
+
thursday: 4,
|
|
12
|
+
friday: 5,
|
|
13
|
+
saturday: 6,
|
|
14
|
+
};
|
|
15
|
+
const RELATIVE_PATTERNS = [
|
|
16
|
+
{
|
|
17
|
+
regex: /\bthe day before\b/gi,
|
|
18
|
+
resolve: (recordedDate) => buildDayAnchor('the day before', shiftDays(recordedDate, -1)),
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
regex: /\bday before\b/gi,
|
|
22
|
+
resolve: (recordedDate) => buildDayAnchor('day before', shiftDays(recordedDate, -1)),
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
regex: /\byesterday\b/gi,
|
|
26
|
+
resolve: (recordedDate) => buildDayAnchor('yesterday', shiftDays(recordedDate, -1)),
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
regex: /\btoday\b/gi,
|
|
30
|
+
resolve: (recordedDate) => buildDayAnchor('today', recordedDate),
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
regex: /\btomorrow\b/gi,
|
|
34
|
+
resolve: (recordedDate) => buildDayAnchor('tomorrow', shiftDays(recordedDate, 1)),
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
regex: /\blast week\b/gi,
|
|
38
|
+
resolve: (recordedDate) => ({
|
|
39
|
+
eventDate: formatIsoDay(shiftDays(recordedDate, -7)),
|
|
40
|
+
precision: 'week',
|
|
41
|
+
phrase: 'last week',
|
|
42
|
+
}),
|
|
43
|
+
},
|
|
44
|
+
...Object.keys(WEEKDAY_INDEX).map((weekday) => ({
|
|
45
|
+
regex: new RegExp(`\\blast\\s+${weekday}\\b`, 'gi'),
|
|
46
|
+
resolve: (recordedDate) => buildDayAnchor(`last ${weekday}`, previousWeekday(recordedDate, WEEKDAY_INDEX[weekday])),
|
|
47
|
+
})),
|
|
48
|
+
{
|
|
49
|
+
regex: /\bthis month\b/gi,
|
|
50
|
+
resolve: (recordedDate) => ({
|
|
51
|
+
eventDate: formatIsoMonth(recordedDate),
|
|
52
|
+
precision: 'month',
|
|
53
|
+
phrase: 'this month',
|
|
54
|
+
}),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
regex: /\blast month\b/gi,
|
|
58
|
+
resolve: (recordedDate) => ({
|
|
59
|
+
eventDate: formatIsoMonth(shiftMonths(recordedDate, -1)),
|
|
60
|
+
precision: 'month',
|
|
61
|
+
phrase: 'last month',
|
|
62
|
+
}),
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
regex: /\bnext month\b/gi,
|
|
66
|
+
resolve: (recordedDate) => ({
|
|
67
|
+
eventDate: formatIsoMonth(shiftMonths(recordedDate, 1)),
|
|
68
|
+
precision: 'month',
|
|
69
|
+
phrase: 'next month',
|
|
70
|
+
}),
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
export function annotateRelativeTemporalText(text, recordedDate) {
|
|
74
|
+
let annotated = text;
|
|
75
|
+
for (const pattern of RELATIVE_PATTERNS) {
|
|
76
|
+
annotated = annotated.replace(pattern.regex, (match) => {
|
|
77
|
+
const anchor = pattern.resolve(recordedDate);
|
|
78
|
+
return `${match} (${formatAnchorDescriptor(anchor)})`;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return annotated;
|
|
82
|
+
}
|
|
83
|
+
export function extractRelativeTemporalAnchors(text, recordedDate) {
|
|
84
|
+
const anchors = [];
|
|
85
|
+
for (const pattern of RELATIVE_PATTERNS) {
|
|
86
|
+
const matches = text.match(pattern.regex);
|
|
87
|
+
if (!matches)
|
|
88
|
+
continue;
|
|
89
|
+
for (const _match of matches) {
|
|
90
|
+
anchors.push(pattern.resolve(recordedDate));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return dedupeAnchors(anchors);
|
|
94
|
+
}
|
|
95
|
+
export function containsRelativeTemporalPhrase(text) {
|
|
96
|
+
return RELATIVE_PATTERNS.some((pattern) => {
|
|
97
|
+
pattern.regex.lastIndex = 0;
|
|
98
|
+
return pattern.regex.test(text);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function buildDayAnchor(phrase, date) {
|
|
102
|
+
return {
|
|
103
|
+
eventDate: formatIsoDay(date),
|
|
104
|
+
precision: 'day',
|
|
105
|
+
phrase,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function formatAnchorDescriptor(anchor) {
|
|
109
|
+
if (anchor.precision === 'month') {
|
|
110
|
+
return `in ${formatHumanMonth(anchor.eventDate)}`;
|
|
111
|
+
}
|
|
112
|
+
if (anchor.precision === 'week') {
|
|
113
|
+
return `around ${formatHumanDay(anchor.eventDate)}`;
|
|
114
|
+
}
|
|
115
|
+
return `on ${formatHumanDay(anchor.eventDate)}`;
|
|
116
|
+
}
|
|
117
|
+
function dedupeAnchors(anchors) {
|
|
118
|
+
const unique = new Map();
|
|
119
|
+
for (const anchor of anchors) {
|
|
120
|
+
unique.set(`${anchor.phrase}:${anchor.precision}:${anchor.eventDate}`, anchor);
|
|
121
|
+
}
|
|
122
|
+
return [...unique.values()];
|
|
123
|
+
}
|
|
124
|
+
function shiftDays(date, days) {
|
|
125
|
+
const shifted = new Date(date.getTime());
|
|
126
|
+
shifted.setUTCDate(shifted.getUTCDate() + days);
|
|
127
|
+
return shifted;
|
|
128
|
+
}
|
|
129
|
+
function shiftMonths(date, months) {
|
|
130
|
+
const shifted = new Date(date.getTime());
|
|
131
|
+
shifted.setUTCMonth(shifted.getUTCMonth() + months, 1);
|
|
132
|
+
return shifted;
|
|
133
|
+
}
|
|
134
|
+
function previousWeekday(date, targetWeekday) {
|
|
135
|
+
const shifted = new Date(date.getTime());
|
|
136
|
+
const currentWeekday = shifted.getUTCDay();
|
|
137
|
+
const delta = (currentWeekday - targetWeekday + 7) % 7 || 7;
|
|
138
|
+
shifted.setUTCDate(shifted.getUTCDate() - delta);
|
|
139
|
+
return shifted;
|
|
140
|
+
}
|
|
141
|
+
function formatIsoDay(date) {
|
|
142
|
+
return date.toISOString().slice(0, 10);
|
|
143
|
+
}
|
|
144
|
+
function formatIsoMonth(date) {
|
|
145
|
+
return date.toISOString().slice(0, 7);
|
|
146
|
+
}
|
|
147
|
+
function formatHumanDay(isoDay) {
|
|
148
|
+
const date = new Date(`${isoDay}T00:00:00.000Z`);
|
|
149
|
+
return date.toLocaleDateString('en-US', {
|
|
150
|
+
timeZone: 'UTC',
|
|
151
|
+
month: 'long',
|
|
152
|
+
day: 'numeric',
|
|
153
|
+
year: 'numeric',
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
function formatHumanMonth(isoMonth) {
|
|
157
|
+
const date = new Date(`${isoMonth}-01T00:00:00.000Z`);
|
|
158
|
+
return date.toLocaleDateString('en-US', {
|
|
159
|
+
timeZone: 'UTC',
|
|
160
|
+
month: 'long',
|
|
161
|
+
year: 'numeric',
|
|
162
|
+
});
|
|
163
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Score semantics and relevance threshold policy for retrieval packaging.
|
|
3
|
+
*/
|
|
4
|
+
import type { SearchResult } from '../db/repository-types.js';
|
|
5
|
+
import { type QueryComplexityLabel } from './retrieval-policy.js';
|
|
6
|
+
export interface RelevanceGateConfig {
|
|
7
|
+
similarityThreshold: number;
|
|
8
|
+
}
|
|
9
|
+
export interface RelevanceGateContext {
|
|
10
|
+
asOf?: string;
|
|
11
|
+
sourceSite?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface RelevanceGate {
|
|
14
|
+
threshold: number | null;
|
|
15
|
+
source: 'request' | 'config' | 'disabled';
|
|
16
|
+
reason: string;
|
|
17
|
+
queryLabel: QueryComplexityLabel;
|
|
18
|
+
}
|
|
19
|
+
export interface RelevanceFilterDecision {
|
|
20
|
+
id: string;
|
|
21
|
+
sourceSite: string;
|
|
22
|
+
sourceKind: 'integration' | 'local';
|
|
23
|
+
namespace: string | null;
|
|
24
|
+
semanticSimilarity: number;
|
|
25
|
+
rankingScore: number;
|
|
26
|
+
relevance: number;
|
|
27
|
+
threshold: number | null;
|
|
28
|
+
decision: 'kept' | 'filtered';
|
|
29
|
+
reason: string;
|
|
30
|
+
}
|
|
31
|
+
export interface RelevanceFilterResult {
|
|
32
|
+
memories: SearchResult[];
|
|
33
|
+
decisions: RelevanceFilterDecision[];
|
|
34
|
+
removedIds: string[];
|
|
35
|
+
}
|
|
36
|
+
export declare function resolveRelevanceGate(query: string, requestedThreshold: number | undefined, runtimeConfig: RelevanceGateConfig, context?: RelevanceGateContext): RelevanceGate;
|
|
37
|
+
export declare function applyRelevanceFilter(memories: SearchResult[], gate: RelevanceGate): RelevanceFilterResult;
|