@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,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search and retrieval orchestration for MemoryService.
|
|
3
|
+
* Pure orchestration: delegates formatting to retrieval-format, dedup to
|
|
4
|
+
* composite-dedup, side effects to retrieval-side-effects, lesson recording
|
|
5
|
+
* to lesson-service, and the main retrieval to search-pipeline.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentScope, WorkspaceContext } from '../db/repository-types.js';
|
|
8
|
+
import type { MemoryServiceDeps, RetrievalOptions, RetrievalResult } from './memory-service-types.js';
|
|
9
|
+
/** Full search with lesson check, URI resolution, pipeline, post-processing, and packaging. */
|
|
10
|
+
export declare function performSearch(deps: MemoryServiceDeps, userId: string, query: string, sourceSite?: string, limit?: number, asOf?: string, referenceTime?: Date, namespaceScope?: string, retrievalOptions?: RetrievalOptions): Promise<RetrievalResult>;
|
|
11
|
+
/**
|
|
12
|
+
* Latency-optimized search that skips repair/reranking for simple and medium
|
|
13
|
+
* queries, but escalates to the full pipeline for multi-hop, aggregation, and
|
|
14
|
+
* complex queries where the LLM rewrite materially improves retrieval.
|
|
15
|
+
*/
|
|
16
|
+
export declare function performFastSearch(deps: MemoryServiceDeps, userId: string, query: string, sourceSite?: string, limit?: number, namespaceScope?: string, retrievalOptions?: RetrievalOptions): Promise<RetrievalResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Options for the abstention-rescue retrieval pass.
|
|
19
|
+
*/
|
|
20
|
+
export interface RescueSearchOptions {
|
|
21
|
+
/** Original query that produced the abstaining answer. */
|
|
22
|
+
query: string;
|
|
23
|
+
/** Answer text produced by the first LLM pass (checked for abstention). */
|
|
24
|
+
candidateAnswer: string;
|
|
25
|
+
/** userId scoping this retrieval. */
|
|
26
|
+
userId: string;
|
|
27
|
+
/** Injection text from the first pass (used as system context for Sonnet rescue). */
|
|
28
|
+
firstInjectionText: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Abstention-rescue search: runs a second retrieval pass with keyword-augmented
|
|
32
|
+
* query and returns either a merged injectionText (for Haiku re-prompt) or a
|
|
33
|
+
* Sonnet-rescue answer (via specialistAnswer) when Haiku still abstains.
|
|
34
|
+
*
|
|
35
|
+
* Only fires when `abstentionRescueEnabled` is true in deps.config.
|
|
36
|
+
* Returns null when rescue is disabled or abstention was not detected.
|
|
37
|
+
*/
|
|
38
|
+
export declare function performRescueSearch(deps: MemoryServiceDeps, opts: RescueSearchOptions): Promise<Pick<RetrievalResult, 'injectionText' | 'specialistAnswer'> | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Workspace-scoped search: retrieves memories from the workspace memory pool.
|
|
41
|
+
* Uses workspace-filtered vector search with agent scope and visibility enforcement.
|
|
42
|
+
*/
|
|
43
|
+
export declare function performWorkspaceSearch(deps: MemoryServiceDeps, userId: string, query: string, workspace: WorkspaceContext, options?: {
|
|
44
|
+
agentScope?: AgentScope;
|
|
45
|
+
limit?: number;
|
|
46
|
+
referenceTime?: Date;
|
|
47
|
+
retrievalOptions?: RetrievalOptions;
|
|
48
|
+
}): Promise<RetrievalResult>;
|
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search and retrieval orchestration for MemoryService.
|
|
3
|
+
* Pure orchestration: delegates formatting to retrieval-format, dedup to
|
|
4
|
+
* composite-dedup, side effects to retrieval-side-effects, lesson recording
|
|
5
|
+
* to lesson-service, and the main retrieval to search-pipeline.
|
|
6
|
+
*/
|
|
7
|
+
import { checkLessons, recordConsensusLessons } from './lesson-service.js';
|
|
8
|
+
import { validateConsensus } from './consensus-validation.js';
|
|
9
|
+
import { embedText } from './embedding.js';
|
|
10
|
+
import { resolveSearchLimitDetailed, classifyQueryDetailed } from './retrieval-policy.js';
|
|
11
|
+
import { runSearchPipelineWithTrace } from './search-pipeline.js';
|
|
12
|
+
import { buildCitations as buildRichCitations, buildInjection, computePackagingSignal } from './retrieval-format.js';
|
|
13
|
+
import { QuestionType, classifyQuestion, isKuStyleQuery } from './answer-format.js';
|
|
14
|
+
import { fetchEntityFactsForInjection, fetchEpisodesForInjection, fetchUserProfileText, } from './episode-fetcher.js';
|
|
15
|
+
import { finalizePackagingTrace } from './packaging-observability.js';
|
|
16
|
+
import { isCurrentStateQuery } from './current-state-ranking.js';
|
|
17
|
+
import { TraceCollector } from './retrieval-trace.js';
|
|
18
|
+
import { excludeStaleComposites } from './composite-staleness.js';
|
|
19
|
+
import { applyFlatPackagingPolicy } from './composite-dedup.js';
|
|
20
|
+
import { recordSearchSideEffects } from './retrieval-side-effects.js';
|
|
21
|
+
import { applyRelevanceFilter, resolveRelevanceGate, } from './relevance-policy.js';
|
|
22
|
+
import { appendTllAugmentation } from './tll-augmentation.js';
|
|
23
|
+
import { dispatchSpecialists } from './specialists/dispatch.js';
|
|
24
|
+
import { applyConfidencePrefix, detectAbstention, extractKeywordsFromQuery, callSonnetRescue, } from './answer-rescue.js';
|
|
25
|
+
import { buildContradictionsBlock, enrichTopKWithContradictions, } from './contradiction-surfacing.js';
|
|
26
|
+
import { isMsrQuery } from './msr-detector.js';
|
|
27
|
+
import { aggregateByConversation } from './msr-aggregator.js';
|
|
28
|
+
import { llm as defaultLlm } from './llm.js';
|
|
29
|
+
import { applyTemporalStateRerank } from './temporal-rerank.js';
|
|
30
|
+
import { TemporalIntent, classifyTemporalIntent } from './temporal-intent.js';
|
|
31
|
+
/**
|
|
32
|
+
* Fetch a contradiction counterpart memory and shape it as a SearchResult.
|
|
33
|
+
* Includes expired rows because contradiction counterparts may have been
|
|
34
|
+
* superseded by an earlier (pre-bilateral) AUDN path and we still want
|
|
35
|
+
* to surface them when their pair is active.
|
|
36
|
+
* Returns null if the row is missing or hard-deleted.
|
|
37
|
+
*/
|
|
38
|
+
async function fetchCounterpartAsSearchResult(deps, userId, memoryId, queryEmbedding) {
|
|
39
|
+
const rows = await deps.stores.search.fetchMemoriesByIds(userId, [memoryId], queryEmbedding, undefined, true);
|
|
40
|
+
return rows[0] ?? null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* MSR cross-conversation aggregation (v39-multihop). Returns an aggregated
|
|
44
|
+
* per-conversation summary block when the flag is on AND the query is
|
|
45
|
+
* classified as multi-session-reasoning. Returns undefined otherwise so the
|
|
46
|
+
* caller can skip the channel without branching.
|
|
47
|
+
*
|
|
48
|
+
* Fail-closed by delegation: `aggregateByConversation` throws on any LLM
|
|
49
|
+
* error, which propagates and aborts the search — matching the AUDN-style
|
|
50
|
+
* "no silent degradation" invariant.
|
|
51
|
+
*/
|
|
52
|
+
async function maybeBuildMsrAggregationBlock(deps, memories, query) {
|
|
53
|
+
if (!deps.config.msrAggregatorEnabled)
|
|
54
|
+
return undefined;
|
|
55
|
+
if (!isMsrQuery(query))
|
|
56
|
+
return undefined;
|
|
57
|
+
if (memories.length === 0)
|
|
58
|
+
return undefined;
|
|
59
|
+
const aggregated = await aggregateByConversation(memories, query, {
|
|
60
|
+
llm: defaultLlm,
|
|
61
|
+
model: deps.config.llmModel,
|
|
62
|
+
});
|
|
63
|
+
return aggregated.length > 0 ? aggregated : undefined;
|
|
64
|
+
}
|
|
65
|
+
/** Check lessons safety gate; returns undefined if lessons disabled. */
|
|
66
|
+
async function checkSearchLessons(deps, userId, query) {
|
|
67
|
+
if (!deps.config.lessonsEnabled || !deps.stores.lesson)
|
|
68
|
+
return undefined;
|
|
69
|
+
return checkLessons(deps.stores.lesson, userId, query);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Always-on ENTITY_CARD channel renderer. Reads the top entity cards for
|
|
73
|
+
* the active conversation and renders them as a `## ENTITY_STATE` block.
|
|
74
|
+
* Returns undefined when the channel is off, the store is missing, or the
|
|
75
|
+
* conversationId is not in the request — never throws so a degraded
|
|
76
|
+
* channel does not break retrieval.
|
|
77
|
+
*/
|
|
78
|
+
async function fetchEntityStateBlock(deps, userId, conversationId, questionType) {
|
|
79
|
+
if (!deps.config.entityCardEnabled)
|
|
80
|
+
return undefined;
|
|
81
|
+
// Per-question-type gating: v27b c1 A/B under gpt-5.4-mini-semantic showed
|
|
82
|
+
// ENTITY_CARDS lift PF by +0.375 but regress CR by -0.125 and SUM by -0.20.
|
|
83
|
+
// Card synthesis compresses contradictions (loses both sides) and trims
|
|
84
|
+
// narrative breadth (hurts comprehensive summaries). Suppress the channel
|
|
85
|
+
// for those two question types; keep it on by default for everything else.
|
|
86
|
+
if (questionType === QuestionType.CONTRADICTION)
|
|
87
|
+
return undefined;
|
|
88
|
+
if (questionType === QuestionType.SUMMARY)
|
|
89
|
+
return undefined;
|
|
90
|
+
const store = deps.stores.entityCards;
|
|
91
|
+
if (!store)
|
|
92
|
+
return undefined;
|
|
93
|
+
// BEAM/AMB note: the AMB adapter encodes BEAM's conversation_id INTO user_id
|
|
94
|
+
// (each conversation lives in its own user-id namespace). When no explicit
|
|
95
|
+
// conversationId is in the request, fall back to userId so the channel still
|
|
96
|
+
// fires in benchmark harnesses that do not forward conversation_id.
|
|
97
|
+
const convScope = conversationId ?? userId;
|
|
98
|
+
const cards = await store.findByConversation(userId, convScope, 5);
|
|
99
|
+
if (cards.length === 0)
|
|
100
|
+
return undefined;
|
|
101
|
+
const userCard = cards.find((c) => c.entityName.toLowerCase() === 'user');
|
|
102
|
+
const ordered = userCard
|
|
103
|
+
? [userCard, ...cards.filter((c) => c !== userCard)]
|
|
104
|
+
: cards;
|
|
105
|
+
const sections = ordered.map((c) => `### ${c.entityName.toUpperCase()}\n${c.cardText}`);
|
|
106
|
+
return `## ENTITY_STATE (pre-synthesized, always-on)\n${sections.join('\n')}\n\n`;
|
|
107
|
+
}
|
|
108
|
+
/** Try to resolve an atomicmem:// URI query. Returns result or null. */
|
|
109
|
+
async function tryUriResolution(deps, query, userId, retrievalOptions, trace) {
|
|
110
|
+
if (!query.startsWith('atomicmem://'))
|
|
111
|
+
return null;
|
|
112
|
+
const uriTier = retrievalOptions?.retrievalMode === 'flat' ? 'L2' : 'L1';
|
|
113
|
+
const resolved = await deps.uriResolver.resolve(query, userId, uriTier);
|
|
114
|
+
if (!resolved)
|
|
115
|
+
return null;
|
|
116
|
+
const resultMemories = Array.isArray(resolved.data) ? resolved.data : [resolved.data];
|
|
117
|
+
trace.event('uri-resolution', { uri: query, type: resolved.type, tier: uriTier });
|
|
118
|
+
trace.finalize(resultMemories);
|
|
119
|
+
return {
|
|
120
|
+
memories: resultMemories,
|
|
121
|
+
injectionText: deps.uriResolver.format(resolved),
|
|
122
|
+
citations: resultMemories.map((m) => m.id),
|
|
123
|
+
retrievalMode: retrievalOptions?.retrievalMode ?? 'flat',
|
|
124
|
+
budgetConstrained: false,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/** Execute the core search (as-of or pipeline). */
|
|
128
|
+
async function executeSearchStep(deps, userId, query, effectiveLimit, sourceSite, referenceTime, namespaceScope, retrievalOptions, asOf, trace) {
|
|
129
|
+
if (asOf) {
|
|
130
|
+
const queryEmbedding = await embedText(query, 'query');
|
|
131
|
+
const memories = await deps.stores.claim.searchClaimVersions(userId, queryEmbedding, effectiveLimit, asOf, sourceSite);
|
|
132
|
+
trace.stage('as-of-search', memories, { asOf });
|
|
133
|
+
return { memories, activeTrace: trace, queryEmbedding, chainResult: { chains: [] }, reflections: [], questionType: QuestionType.OTHER };
|
|
134
|
+
}
|
|
135
|
+
const pipelineStores = {
|
|
136
|
+
search: deps.stores.search,
|
|
137
|
+
link: deps.stores.link,
|
|
138
|
+
memory: deps.stores.memory,
|
|
139
|
+
entity: deps.stores.entity,
|
|
140
|
+
summaries: deps.stores.summaries,
|
|
141
|
+
recap: deps.stores.recap,
|
|
142
|
+
reflections: deps.stores.reflections,
|
|
143
|
+
pool: deps.stores.pool,
|
|
144
|
+
};
|
|
145
|
+
const pipelineResult = await runSearchPipelineWithTrace(pipelineStores, userId, query, effectiveLimit, sourceSite, referenceTime, {
|
|
146
|
+
namespaceScope,
|
|
147
|
+
retrievalMode: retrievalOptions?.retrievalMode,
|
|
148
|
+
searchStrategy: retrievalOptions?.searchStrategy,
|
|
149
|
+
skipRepairLoop: retrievalOptions?.skipRepairLoop,
|
|
150
|
+
skipReranking: retrievalOptions?.skipReranking,
|
|
151
|
+
runtimeConfig: deps.config,
|
|
152
|
+
});
|
|
153
|
+
return {
|
|
154
|
+
memories: pipelineResult.filtered,
|
|
155
|
+
activeTrace: pipelineResult.trace,
|
|
156
|
+
queryEmbedding: pipelineResult.queryEmbedding,
|
|
157
|
+
chainResult: pipelineResult.chainResult,
|
|
158
|
+
reflections: pipelineResult.reflections,
|
|
159
|
+
questionType: pipelineResult.questionType,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/** Filter workspace-scoped, stale composites, and consensus-violating memories. */
|
|
163
|
+
async function postProcessResults(deps, rawMemories, activeTrace, userId, query, asOf, sourceSite, retrievalOptions) {
|
|
164
|
+
let memories = rawMemories.filter((m) => !m.workspace_id);
|
|
165
|
+
if (!asOf) {
|
|
166
|
+
const compositeResult = await excludeStaleComposites(deps.stores.memory, userId, memories);
|
|
167
|
+
if (compositeResult.removedCompositeIds.length > 0) {
|
|
168
|
+
memories = compositeResult.filtered;
|
|
169
|
+
activeTrace.stage('stale-composite-filter', memories, {
|
|
170
|
+
removedCount: compositeResult.removedCompositeIds.length,
|
|
171
|
+
removedIds: compositeResult.removedCompositeIds,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
let consensusResult;
|
|
176
|
+
if (deps.config.consensusValidationEnabled && memories.length >= deps.config.consensusMinMemories) {
|
|
177
|
+
consensusResult = await validateConsensus(query, memories);
|
|
178
|
+
if (consensusResult.removedMemoryIds.length > 0) {
|
|
179
|
+
const removedSet = new Set(consensusResult.removedMemoryIds);
|
|
180
|
+
memories = memories.filter((m) => !removedSet.has(m.id));
|
|
181
|
+
activeTrace.stage('consensus-filter', memories, {
|
|
182
|
+
removedCount: consensusResult.removedMemoryIds.length,
|
|
183
|
+
removedIds: consensusResult.removedMemoryIds,
|
|
184
|
+
});
|
|
185
|
+
if (deps.config.lessonsEnabled && deps.stores.lesson) {
|
|
186
|
+
recordConsensusLessons(deps.stores.lesson, userId, consensusResult, memories).catch((err) => console.error('Consensus lesson recording failed:', err));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const relevanceFilter = applySearchRelevanceFilter(memories, activeTrace, query, retrievalOptions, deps.config, { asOf, sourceSite });
|
|
191
|
+
return { memories: relevanceFilter.memories, consensusResult, relevanceFilter };
|
|
192
|
+
}
|
|
193
|
+
function applySearchRelevanceFilter(memories, activeTrace, query, retrievalOptions, runtimeConfig, gateContext = {}) {
|
|
194
|
+
const gate = resolveRelevanceGate(query, retrievalOptions?.relevanceThreshold, runtimeConfig, gateContext);
|
|
195
|
+
const result = applyRelevanceFilter(memories, gate);
|
|
196
|
+
const summary = {
|
|
197
|
+
threshold: gate.threshold,
|
|
198
|
+
source: gate.source,
|
|
199
|
+
reason: gate.reason,
|
|
200
|
+
queryLabel: gate.queryLabel,
|
|
201
|
+
removedIds: result.removedIds,
|
|
202
|
+
decisions: result.decisions,
|
|
203
|
+
};
|
|
204
|
+
activeTrace.stage('relevance-filter', result.memories, {
|
|
205
|
+
...summary,
|
|
206
|
+
removedCount: result.removedIds.length,
|
|
207
|
+
});
|
|
208
|
+
return { ...summary, memories: result.memories };
|
|
209
|
+
}
|
|
210
|
+
/** Package memories, build injection text, and assemble the final response. */
|
|
211
|
+
async function assembleResponse(deps, postProcessed, query, userId, activeTrace, retrievalOptions, asOf, sourceSite, lessonCheck, queryEmbedding, chainResult, reflections, questionType = QuestionType.OTHER) {
|
|
212
|
+
// Phase 2 specialist short-circuit — runs before buildInjection + answer LLM.
|
|
213
|
+
if (deps.config.phase2SpecialistsEnabled) {
|
|
214
|
+
const specialistResult = await dispatchSpecialists({
|
|
215
|
+
memories: postProcessed.memories.map((m) => ({
|
|
216
|
+
id: m.id,
|
|
217
|
+
text: m.content,
|
|
218
|
+
observedAt: m.observed_at,
|
|
219
|
+
})),
|
|
220
|
+
query,
|
|
221
|
+
userId,
|
|
222
|
+
model: deps.config.llmModel,
|
|
223
|
+
beliefEdges: deps.stores.beliefEdges ?? null,
|
|
224
|
+
memoryRepo: deps.stores.memory,
|
|
225
|
+
entityValues: deps.stores.entityValues ?? null,
|
|
226
|
+
});
|
|
227
|
+
if (specialistResult.handled) {
|
|
228
|
+
return {
|
|
229
|
+
memories: postProcessed.memories,
|
|
230
|
+
injectionText: '',
|
|
231
|
+
citations: postProcessed.memories.map((m) => m.id),
|
|
232
|
+
retrievalMode: retrievalOptions?.retrievalMode ?? 'flat',
|
|
233
|
+
budgetConstrained: false,
|
|
234
|
+
lessonCheck,
|
|
235
|
+
consensusResult: postProcessed.consensusResult,
|
|
236
|
+
specialistAnswer: specialistResult.answer,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const userProfileText = await fetchUserProfileText(deps, userId);
|
|
241
|
+
const episodes = deps.config.episodesChannelEnabled
|
|
242
|
+
? await fetchEpisodesForInjection(deps, userId, queryEmbedding)
|
|
243
|
+
: [];
|
|
244
|
+
const entityFacts = await fetchEntityFactsForInjection(deps, userId, query);
|
|
245
|
+
const entityStateBlock = await fetchEntityStateBlock(deps, userId, retrievalOptions?.conversationId, questionType);
|
|
246
|
+
// BEAM CR fix: bilateral surfacing. When the flag is on, augment top-K with
|
|
247
|
+
// contradiction counterparts and capture both-sides verbatim pairs to
|
|
248
|
+
// render as `## CONTRADICTIONS_DETECTED`.
|
|
249
|
+
const enrichment = await enrichTopKWithContradictions({
|
|
250
|
+
userId,
|
|
251
|
+
memories: postProcessed.memories,
|
|
252
|
+
contradictions: deps.stores.contradictions,
|
|
253
|
+
enabled: deps.config.contradictionSurfacingEnabled,
|
|
254
|
+
fetchCounterpart: (memoryId) => fetchCounterpartAsSearchResult(deps, userId, memoryId, queryEmbedding),
|
|
255
|
+
});
|
|
256
|
+
const enrichedPostProcessed = {
|
|
257
|
+
...postProcessed,
|
|
258
|
+
memories: enrichment.memories,
|
|
259
|
+
};
|
|
260
|
+
const contradictionsBlock = buildContradictionsBlock(enrichment.pairs, questionType);
|
|
261
|
+
const msrAggregationBlock = await maybeBuildMsrAggregationBlock(deps, enrichment.memories, query);
|
|
262
|
+
const packaged = packageSearchOutput(enrichedPostProcessed, query, activeTrace, retrievalOptions, userProfileText, episodes, entityFacts, deps.config, chainResult, reflections, questionType, entityStateBlock, contradictionsBlock, msrAggregationBlock);
|
|
263
|
+
recordSearchSideEffects(deps, packaged.outputMemories, userId, query, sourceSite, asOf);
|
|
264
|
+
updateRetrievalSummary(activeTrace, packaged.outputMemories, query, retrievalOptions, postProcessed.relevanceFilter);
|
|
265
|
+
activeTrace.finalize(packaged.outputMemories);
|
|
266
|
+
return buildRetrievalResult(postProcessed, packaged, activeTrace, lessonCheck);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* BEAM v42 KU recency reorder. Gated by `kuRecencySortEnabled`, restricted to
|
|
270
|
+
* NUMERIC_COUNT queries that also match the KU-style framing
|
|
271
|
+
* ("what is the average/current/latest/daily X"). Reorders packaged retrieval
|
|
272
|
+
* by observed_at DESC so the most recent measurement appears first for the
|
|
273
|
+
* answer LLM. Keeps ALL memories — pure reorder. Targets KU Mode B
|
|
274
|
+
* (wrong-value-forced) where Haiku picks the earlier of two competing values.
|
|
275
|
+
*/
|
|
276
|
+
function maybeApplyKuRecencySort(packaged, query, questionType, runtimeConfig, activeTrace) {
|
|
277
|
+
if (!runtimeConfig.kuRecencySortEnabled)
|
|
278
|
+
return packaged;
|
|
279
|
+
if (questionType !== QuestionType.NUMERIC_COUNT)
|
|
280
|
+
return packaged;
|
|
281
|
+
if (!isKuStyleQuery(query))
|
|
282
|
+
return packaged;
|
|
283
|
+
const sorted = [...packaged].sort((a, b) => b.observed_at.getTime() - a.observed_at.getTime());
|
|
284
|
+
activeTrace.event('ku-recency-sort', {
|
|
285
|
+
candidateCount: sorted.length,
|
|
286
|
+
orderedIds: sorted.map((m) => m.id),
|
|
287
|
+
});
|
|
288
|
+
return sorted;
|
|
289
|
+
}
|
|
290
|
+
// fallow-ignore-next-line complexity
|
|
291
|
+
function packageSearchOutput(postProcessed, query, activeTrace, retrievalOptions, userProfileText, episodes, entityFacts, runtimeConfig, chainResult, reflections, questionType = QuestionType.OTHER, entityStateBlock, contradictionsBlock, msrAggregationBlock) {
|
|
292
|
+
const mode = retrievalOptions?.retrievalMode ?? 'flat';
|
|
293
|
+
const packaged = applyFlatPackagingPolicy(postProcessed.memories, query, mode, activeTrace);
|
|
294
|
+
const baseOrdered = isCurrentStateQuery(query) ? packaged.sort((a, b) => b.score - a.score) : packaged;
|
|
295
|
+
const outputMemories = maybeApplyKuRecencySort(baseOrdered, query, questionType, runtimeConfig, activeTrace);
|
|
296
|
+
const buildResult = buildInjection(outputMemories, query, mode, retrievalOptions?.tokenBudget, userProfileText, episodes, entityFacts, chainResult?.chains, reflections, questionType);
|
|
297
|
+
const { tierAssignments, expandIds, estimatedContextTokens } = buildResult;
|
|
298
|
+
const renderedMemories = buildResult.includedMemories;
|
|
299
|
+
// CONTRADICTIONS_DETECTED block (BEAM CR fix) is prepended above
|
|
300
|
+
// ENTITY_STATE so the answer LLM sees both sides verbatim before any
|
|
301
|
+
// compressed entity summary that may have lost the contradiction.
|
|
302
|
+
const bodyWithContradictions = contradictionsBlock
|
|
303
|
+
? `${contradictionsBlock}${buildResult.injectionText}`
|
|
304
|
+
: buildResult.injectionText;
|
|
305
|
+
// ENTITY_STATE channel: prepend the always-on per-entity cards block above
|
|
306
|
+
// every other channel so the answer LLM has canonical user state up front.
|
|
307
|
+
const bodyWithEntityState = entityStateBlock
|
|
308
|
+
? `${entityStateBlock}${bodyWithContradictions}`
|
|
309
|
+
: bodyWithContradictions;
|
|
310
|
+
// MSR cross-conversation aggregation (v39-multihop): prepend above
|
|
311
|
+
// ENTITY_STATE so the answer LLM sees per-conversation summaries BEFORE
|
|
312
|
+
// the raw chunks that triggered the misjoin.
|
|
313
|
+
const bodyWithMsr = msrAggregationBlock
|
|
314
|
+
? `## CROSS-SESSION SUMMARY\n${msrAggregationBlock}\n\n${bodyWithEntityState}`
|
|
315
|
+
: bodyWithEntityState;
|
|
316
|
+
// Confidence-priming prefix: prepend when abstention rescue is enabled so the
|
|
317
|
+
// external answer LLM commits to facts it can see rather than hedging.
|
|
318
|
+
const injectionText = applyConfidencePrefix(bodyWithMsr, runtimeConfig.abstentionRescueEnabled, {
|
|
319
|
+
adaptive: runtimeConfig.confidencePrefixAdaptiveEnabled,
|
|
320
|
+
questionType,
|
|
321
|
+
});
|
|
322
|
+
const { packagingSummary, assemblySummary } = finalizePackagingTrace(activeTrace, {
|
|
323
|
+
outputMemories: renderedMemories, mode, injectionText, estimatedContextTokens, tierAssignments,
|
|
324
|
+
tokenBudget: retrievalOptions?.tokenBudget,
|
|
325
|
+
});
|
|
326
|
+
return {
|
|
327
|
+
mode,
|
|
328
|
+
outputMemories: renderedMemories,
|
|
329
|
+
injectionText,
|
|
330
|
+
tierAssignments,
|
|
331
|
+
expandIds,
|
|
332
|
+
estimatedContextTokens,
|
|
333
|
+
budgetConstrained: buildResult.budgetConstrained,
|
|
334
|
+
packagingSummary,
|
|
335
|
+
assemblySummary,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
function updateRetrievalSummary(activeTrace, outputMemories, query, retrievalOptions, relevanceFilter) {
|
|
339
|
+
const priorSummary = activeTrace.getRetrievalSummary();
|
|
340
|
+
activeTrace.setRetrievalSummary({
|
|
341
|
+
candidateIds: outputMemories.map((memory) => memory.id),
|
|
342
|
+
candidateCount: outputMemories.length,
|
|
343
|
+
queryText: priorSummary?.queryText ?? query,
|
|
344
|
+
skipRepair: priorSummary?.skipRepair ?? retrievalOptions?.skipRepairLoop ?? false,
|
|
345
|
+
relevanceThreshold: relevanceFilter.threshold,
|
|
346
|
+
relevanceFilterSource: relevanceFilter.source,
|
|
347
|
+
relevanceFilterReason: relevanceFilter.reason,
|
|
348
|
+
filteredCandidateIds: relevanceFilter.removedIds,
|
|
349
|
+
filterDecisions: relevanceFilter.decisions,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
function buildRetrievalResult(postProcessed, packaged, activeTrace, lessonCheck) {
|
|
353
|
+
return {
|
|
354
|
+
memories: packaged.outputMemories,
|
|
355
|
+
injectionText: packaged.injectionText,
|
|
356
|
+
citations: buildRichCitations(packaged.outputMemories).map((c) => c.memory_id),
|
|
357
|
+
retrievalMode: packaged.mode,
|
|
358
|
+
tierAssignments: packaged.tierAssignments,
|
|
359
|
+
expandIds: packaged.expandIds,
|
|
360
|
+
estimatedContextTokens: packaged.estimatedContextTokens,
|
|
361
|
+
budgetConstrained: packaged.budgetConstrained,
|
|
362
|
+
lessonCheck, consensusResult: postProcessed.consensusResult,
|
|
363
|
+
packagingSignal: computePackagingSignal(packaged.outputMemories),
|
|
364
|
+
retrievalSummary: activeTrace.getRetrievalSummary(),
|
|
365
|
+
packagingSummary: packaged.packagingSummary,
|
|
366
|
+
assemblySummary: packaged.assemblySummary,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
/** Full search with lesson check, URI resolution, pipeline, post-processing, and packaging. */
|
|
370
|
+
export async function performSearch(deps, userId, query, sourceSite, limit, asOf, referenceTime, namespaceScope, retrievalOptions) {
|
|
371
|
+
const lessonCheck = await checkSearchLessons(deps, userId, query);
|
|
372
|
+
if (lessonCheck && !lessonCheck.safe) {
|
|
373
|
+
return {
|
|
374
|
+
memories: [],
|
|
375
|
+
injectionText: '',
|
|
376
|
+
citations: [],
|
|
377
|
+
retrievalMode: retrievalOptions?.retrievalMode ?? 'flat',
|
|
378
|
+
budgetConstrained: false,
|
|
379
|
+
lessonCheck,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
const { limit: effectiveLimit, classification } = resolveSearchLimitDetailed(query, limit, deps.config);
|
|
383
|
+
const trace = new TraceCollector(query, userId);
|
|
384
|
+
trace.event('query-classification', { label: classification.label, limit: effectiveLimit, matchedMarker: classification.matchedMarker });
|
|
385
|
+
const uriResult = await tryUriResolution(deps, query, userId, retrievalOptions, trace);
|
|
386
|
+
if (uriResult)
|
|
387
|
+
return uriResult;
|
|
388
|
+
const { memories: rawMemories, activeTrace, queryEmbedding, chainResult, reflections, questionType } = await executeSearchStep(deps, userId, query, effectiveLimit, sourceSite, referenceTime, namespaceScope, retrievalOptions, asOf, trace);
|
|
389
|
+
const filteredMemories = await postProcessResults(deps, rawMemories, activeTrace, userId, query, asOf, sourceSite, retrievalOptions);
|
|
390
|
+
const reranked = maybeApplyTemporalRerank(filteredMemories, query, deps.config, activeTrace);
|
|
391
|
+
const augmented = await appendTllAugmentation(deps, userId, query, reranked, effectiveLimit, activeTrace);
|
|
392
|
+
return assembleResponse(deps, augmented, query, userId, activeTrace, retrievalOptions, asOf, sourceSite, lessonCheck, queryEmbedding, chainResult, reflections, questionType);
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* BEAM v38 read seam — when `temporalStateEnabled` is on and the query
|
|
396
|
+
* intent is CURRENT_STATE, additively rerank candidates by their
|
|
397
|
+
* state_key activity. Always returns the same record shape so the rest
|
|
398
|
+
* of the pipeline is unaware of the optional channel.
|
|
399
|
+
*/
|
|
400
|
+
function maybeApplyTemporalRerank(postProcessed, query, runtimeConfig, activeTrace) {
|
|
401
|
+
if (!runtimeConfig.temporalStateEnabled)
|
|
402
|
+
return postProcessed;
|
|
403
|
+
const intent = classifyTemporalIntent(query);
|
|
404
|
+
if (intent !== TemporalIntent.CURRENT_STATE)
|
|
405
|
+
return postProcessed;
|
|
406
|
+
const reranked = applyTemporalStateRerank(postProcessed.memories);
|
|
407
|
+
activeTrace.event('temporal-state-rerank', {
|
|
408
|
+
intent,
|
|
409
|
+
candidateCount: reranked.length,
|
|
410
|
+
activeIds: reranked
|
|
411
|
+
.filter((m) => m.state_key && (m.event_end === null || m.event_end === undefined))
|
|
412
|
+
.map((m) => m.id),
|
|
413
|
+
});
|
|
414
|
+
return { ...postProcessed, memories: reranked };
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Latency-optimized search that skips repair/reranking for simple and medium
|
|
418
|
+
* queries, but escalates to the full pipeline for multi-hop, aggregation, and
|
|
419
|
+
* complex queries where the LLM rewrite materially improves retrieval.
|
|
420
|
+
*/
|
|
421
|
+
export async function performFastSearch(deps, userId, query, sourceSite, limit, namespaceScope, retrievalOptions) {
|
|
422
|
+
const label = classifyQueryDetailed(query).label;
|
|
423
|
+
const escalate = label === 'multi-hop' || label === 'aggregation' || label === 'complex';
|
|
424
|
+
// Fast search owns these latency toggles based on query class; caller options
|
|
425
|
+
// still flow through for packaging, threshold, and strategy controls.
|
|
426
|
+
return performSearch(deps, userId, query, sourceSite, limit, undefined, undefined, namespaceScope, {
|
|
427
|
+
...retrievalOptions,
|
|
428
|
+
skipRepairLoop: !escalate,
|
|
429
|
+
skipReranking: !escalate,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Abstention-rescue search: runs a second retrieval pass with keyword-augmented
|
|
434
|
+
* query and returns either a merged injectionText (for Haiku re-prompt) or a
|
|
435
|
+
* Sonnet-rescue answer (via specialistAnswer) when Haiku still abstains.
|
|
436
|
+
*
|
|
437
|
+
* Only fires when `abstentionRescueEnabled` is true in deps.config.
|
|
438
|
+
* Returns null when rescue is disabled or abstention was not detected.
|
|
439
|
+
*/
|
|
440
|
+
// fallow-ignore-next-line unused-export
|
|
441
|
+
export async function performRescueSearch(deps, opts) {
|
|
442
|
+
if (!deps.config.abstentionRescueEnabled)
|
|
443
|
+
return null;
|
|
444
|
+
if (!detectAbstention(opts.candidateAnswer))
|
|
445
|
+
return null;
|
|
446
|
+
const keywords = extractKeywordsFromQuery(opts.query);
|
|
447
|
+
const augmentedQuery = keywords ? `${opts.query} ${keywords}` : opts.query;
|
|
448
|
+
const rescueK = deps.config.abstentionRescueRetrieveK;
|
|
449
|
+
const rescueResult = await performSearch(deps, opts.userId, augmentedQuery, undefined, rescueK);
|
|
450
|
+
const { injectionText: rescueInjection } = rescueResult;
|
|
451
|
+
const mergedInjection = applyConfidencePrefix(opts.firstInjectionText + '\n\n' + rescueInjection, true, {
|
|
452
|
+
adaptive: deps.config.confidencePrefixAdaptiveEnabled,
|
|
453
|
+
questionType: classifyQuestion(opts.query),
|
|
454
|
+
});
|
|
455
|
+
if (!detectAbstention(opts.candidateAnswer)) {
|
|
456
|
+
return { injectionText: mergedInjection };
|
|
457
|
+
}
|
|
458
|
+
const apiKey = deps.config.anthropicApiKey ?? '';
|
|
459
|
+
const sonnetAnswer = await callSonnetRescue({ model: deps.config.abstentionRescueSonnetModel, apiKey }, mergedInjection, opts.query);
|
|
460
|
+
return { injectionText: mergedInjection, specialistAnswer: sonnetAnswer || undefined };
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Workspace-scoped search: retrieves memories from the workspace memory pool.
|
|
464
|
+
* Uses workspace-filtered vector search with agent scope and visibility enforcement.
|
|
465
|
+
*/
|
|
466
|
+
export async function performWorkspaceSearch(deps, userId, query, workspace, options = {}) {
|
|
467
|
+
const { limit: effectiveLimit } = resolveSearchLimitDetailed(query, options.limit, deps.config);
|
|
468
|
+
const queryEmbedding = await embedText(query, 'query');
|
|
469
|
+
const memories = await deps.stores.search.searchSimilarInWorkspace(workspace.workspaceId, queryEmbedding, effectiveLimit, options.agentScope ?? 'all', workspace.agentId, options.referenceTime);
|
|
470
|
+
const trace = new TraceCollector(query, userId);
|
|
471
|
+
trace.stage('workspace-search', memories, {
|
|
472
|
+
workspaceId: workspace.workspaceId,
|
|
473
|
+
agentId: workspace.agentId,
|
|
474
|
+
agentScope: options.agentScope ?? 'all',
|
|
475
|
+
});
|
|
476
|
+
const { filtered: staleFilteredMemories, removedCompositeIds } = await excludeStaleComposites(deps.stores.memory, userId, memories);
|
|
477
|
+
if (removedCompositeIds.length > 0) {
|
|
478
|
+
trace.stage('stale-composite-filter', staleFilteredMemories, {
|
|
479
|
+
removedCount: removedCompositeIds.length,
|
|
480
|
+
removedIds: removedCompositeIds,
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
const relevanceFilter = applySearchRelevanceFilter(staleFilteredMemories, trace, query, options.retrievalOptions, deps.config);
|
|
484
|
+
const filteredMemories = relevanceFilter.memories;
|
|
485
|
+
for (const m of filteredMemories)
|
|
486
|
+
deps.stores.memory.touchMemory(m.id).catch(() => { });
|
|
487
|
+
const mode = options.retrievalOptions?.retrievalMode ?? 'flat';
|
|
488
|
+
const workspaceQuestionType = classifyQuestion(query);
|
|
489
|
+
const rawInjection = buildInjection(filteredMemories, query, mode, options.retrievalOptions?.tokenBudget, undefined, undefined, undefined, undefined, undefined, workspaceQuestionType);
|
|
490
|
+
const wsInjectionText = applyConfidencePrefix(rawInjection.injectionText, deps.config.abstentionRescueEnabled, {
|
|
491
|
+
adaptive: deps.config.confidencePrefixAdaptiveEnabled,
|
|
492
|
+
questionType: workspaceQuestionType,
|
|
493
|
+
});
|
|
494
|
+
const injection = { ...rawInjection, injectionText: wsInjectionText };
|
|
495
|
+
const outputMemories = injection.includedMemories;
|
|
496
|
+
updateRetrievalSummary(trace, outputMemories, query, options.retrievalOptions, relevanceFilter);
|
|
497
|
+
trace.finalize(outputMemories);
|
|
498
|
+
return {
|
|
499
|
+
memories: outputMemories,
|
|
500
|
+
citations: outputMemories.map((m) => m.id),
|
|
501
|
+
retrievalMode: mode,
|
|
502
|
+
retrievalSummary: trace.getRetrievalSummary(),
|
|
503
|
+
...injection,
|
|
504
|
+
};
|
|
505
|
+
}
|