@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,559 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provenance-first retrieval formatting helpers.
|
|
3
|
+
*
|
|
4
|
+
* Supports two modes:
|
|
5
|
+
* - Full: each memory's complete content is included (default)
|
|
6
|
+
* - Staged (L0): only summaries are included, with memory IDs for
|
|
7
|
+
* on-demand expansion via POST /v1/memories/expand. Reduces injection
|
|
8
|
+
* tokens by ~80% for typical workloads.
|
|
9
|
+
*/
|
|
10
|
+
import { config } from '../config.js';
|
|
11
|
+
import { applyFormatHint, QuestionType } from './answer-format.js';
|
|
12
|
+
import { shouldApplyFormatHint, shouldEmitEventChain, shouldEmitObservations, } from './retrieval-channel-rules.js';
|
|
13
|
+
import { assignTiers as assignTierBudgets, estimateTokens, getContentAtTier, } from './tiered-loading.js';
|
|
14
|
+
import { isAnswerBearing, sortBySessionPriority } from './session-packaging.js';
|
|
15
|
+
import { deduplicateCompositeMembersHard } from './composite-dedup.js';
|
|
16
|
+
import { prefersAbstractAwareRetrieval } from './abstract-query-policy.js';
|
|
17
|
+
import { escapeXml } from '../xml-escape.js';
|
|
18
|
+
import { spansMultipleDates, buildTimelinePack, formatTimelinePack } from './timeline-pack.js';
|
|
19
|
+
import { buildTemporalEvidenceBlock } from './temporal-endpoint-evidence.js';
|
|
20
|
+
import { preserveQueryTermVisibility, sumAssignmentTokens } from './query-term-visibility.js';
|
|
21
|
+
import { formatDateLabel, formatDuration } from './temporal-format.js';
|
|
22
|
+
/**
|
|
23
|
+
* Compare score-descending order to the order produced by packaging
|
|
24
|
+
* (session-priority sort, answer-bearing promotion, chronological).
|
|
25
|
+
*/
|
|
26
|
+
export function computePackagingSignal(memories) {
|
|
27
|
+
if (memories.length === 0) {
|
|
28
|
+
return { reordered: false, episodeCount: 0, answerBearingCount: 0, contextCount: 0, reorderDistance: 0 };
|
|
29
|
+
}
|
|
30
|
+
const scoreOrder = [...memories].sort((a, b) => b.score - a.score).map((m) => m.id);
|
|
31
|
+
const packagedOrder = sortBySessionPriority(memories).map((m) => m.id);
|
|
32
|
+
const reordered = !scoreOrder.every((id, i) => id === packagedOrder[i]);
|
|
33
|
+
const episodeCount = new Set(memories.map((m) => m.episode_id).filter(Boolean)).size;
|
|
34
|
+
const answerBearingCount = memories.filter((m) => isAnswerBearing(m.content)).length;
|
|
35
|
+
const contextCount = memories.length - answerBearingCount;
|
|
36
|
+
const reorderDistance = kendallTauDistance(scoreOrder, packagedOrder);
|
|
37
|
+
return { reordered, episodeCount, answerBearingCount, contextCount, reorderDistance };
|
|
38
|
+
}
|
|
39
|
+
/** Count pairwise inversions between two orderings of the same IDs. */
|
|
40
|
+
function kendallTauDistance(orderA, orderB) {
|
|
41
|
+
const posB = new Map(orderB.map((id, i) => [id, i]));
|
|
42
|
+
let inversions = 0;
|
|
43
|
+
for (let i = 0; i < orderA.length; i++) {
|
|
44
|
+
for (let j = i + 1; j < orderA.length; j++) {
|
|
45
|
+
const posI = posB.get(orderA[i]) ?? 0;
|
|
46
|
+
const posJ = posB.get(orderA[j]) ?? 0;
|
|
47
|
+
if (posI > posJ)
|
|
48
|
+
inversions++;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return inversions;
|
|
52
|
+
}
|
|
53
|
+
function buildEpisodesChannel(episodes) {
|
|
54
|
+
const sections = episodes.map((ep, i) => `### Episode ${i + 1}: ${ep.topic}\n${ep.narrative}`);
|
|
55
|
+
return `## EPISODES\n${sections.join('\n\n')}`;
|
|
56
|
+
}
|
|
57
|
+
function buildFactsChannel(facts) {
|
|
58
|
+
if (facts.length === 0)
|
|
59
|
+
return '';
|
|
60
|
+
const lines = facts
|
|
61
|
+
.map((f) => `- (${f.entity}.${f.attribute} = ${f.value}) [as of ${f.observedAt.toISOString().slice(0, 10)}]`)
|
|
62
|
+
.join('\n');
|
|
63
|
+
return `## FACTS\n${lines}`;
|
|
64
|
+
}
|
|
65
|
+
export function buildCitations(memories) {
|
|
66
|
+
return memories.map((memory) => ({
|
|
67
|
+
memory_id: memory.id,
|
|
68
|
+
source_site: memory.source_site,
|
|
69
|
+
created_at: memory.created_at.toISOString(),
|
|
70
|
+
importance: memory.importance,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Effective timestamp for packaging. When enabled, observed_at represents
|
|
75
|
+
* the conversation-time ordering while created_at remains the ingest time.
|
|
76
|
+
*/
|
|
77
|
+
function pickPackagingDate(memory) {
|
|
78
|
+
if (config.packagingUseObservedAt && memory.observed_at)
|
|
79
|
+
return memory.observed_at;
|
|
80
|
+
return memory.created_at;
|
|
81
|
+
}
|
|
82
|
+
/** Sort memories by effective packaging date ascending. */
|
|
83
|
+
function sortChronologically(memories) {
|
|
84
|
+
return [...memories].sort((a, b) => pickPackagingDate(a).getTime() - pickPackagingDate(b).getTime());
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* A2 injection: session-priority sort with answer-bearing tags, grouped by
|
|
88
|
+
* namespace. Flat subject headers for all groups (no timeline packs).
|
|
89
|
+
* Used by the packaging ablation to isolate session-pack effects from
|
|
90
|
+
* timeline-pack effects.
|
|
91
|
+
*/
|
|
92
|
+
function formatSessionPackInjection(memories) {
|
|
93
|
+
if (memories.length === 0)
|
|
94
|
+
return '';
|
|
95
|
+
const groups = groupByNamespace(memories);
|
|
96
|
+
const sections = [...groups.entries()].map(([ns, groupMemories]) => formatSubjectSection(ns, groupMemories));
|
|
97
|
+
return appendTemporalSummary(sections, memories);
|
|
98
|
+
}
|
|
99
|
+
/** Simple dash-delimited injection format (no XML). */
|
|
100
|
+
export function formatSimpleInjection(memories) {
|
|
101
|
+
if (memories.length === 0)
|
|
102
|
+
return '';
|
|
103
|
+
const groups = groupByNamespace(memories);
|
|
104
|
+
const sections = [...groups.entries()].map(([ns, groupMemories]) => {
|
|
105
|
+
if (spansMultipleDates(groupMemories)) {
|
|
106
|
+
const pack = buildTimelinePack(ns, groupMemories);
|
|
107
|
+
return formatTimelinePack(pack);
|
|
108
|
+
}
|
|
109
|
+
return formatSubjectSection(ns, groupMemories);
|
|
110
|
+
});
|
|
111
|
+
return appendTemporalSummary(sections, memories);
|
|
112
|
+
}
|
|
113
|
+
/** Group memories by namespace for subject-partitioned injection. */
|
|
114
|
+
function groupByNamespace(memories) {
|
|
115
|
+
const groups = new Map();
|
|
116
|
+
for (const m of memories) {
|
|
117
|
+
const ns = m.namespace || 'general';
|
|
118
|
+
if (!groups.has(ns))
|
|
119
|
+
groups.set(ns, []);
|
|
120
|
+
groups.get(ns).push(m);
|
|
121
|
+
}
|
|
122
|
+
return groups;
|
|
123
|
+
}
|
|
124
|
+
/** Format a single namespace group as a subject section with answer/context labels. */
|
|
125
|
+
function formatSubjectSection(ns, groupMemories) {
|
|
126
|
+
const sorted = sortBySessionPriority(groupMemories);
|
|
127
|
+
const lines = sorted.map((m) => {
|
|
128
|
+
const date = pickPackagingDate(m).toISOString().slice(0, 10);
|
|
129
|
+
const kind = isAnswerBearing(m.content) ? 'answer' : 'context';
|
|
130
|
+
return `- [${date}] [${kind}] ${m.content}`;
|
|
131
|
+
}).join('\n');
|
|
132
|
+
return `### Subject: ${ns}\n${lines}`;
|
|
133
|
+
}
|
|
134
|
+
/** Join sections and append temporal summary if present. */
|
|
135
|
+
function appendTemporalSummary(sections, memories) {
|
|
136
|
+
const sortedAll = sortChronologically(memories);
|
|
137
|
+
const timeline = buildTemporalSummary(sortedAll);
|
|
138
|
+
const mainContent = sections.join('\n\n');
|
|
139
|
+
return timeline ? `${mainContent}\n\n${timeline}` : mainContent;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Build a timeline summary with computed time gaps between distinct dates.
|
|
143
|
+
* Helps weak LLMs answer temporal questions without doing date arithmetic.
|
|
144
|
+
*/
|
|
145
|
+
function buildTemporalSummary(sortedMemories) {
|
|
146
|
+
const uniqueDates = getUniqueDates(sortedMemories);
|
|
147
|
+
if (uniqueDates.length < 2)
|
|
148
|
+
return '';
|
|
149
|
+
const gaps = [];
|
|
150
|
+
for (let i = 1; i < uniqueDates.length; i++) {
|
|
151
|
+
const prev = uniqueDates[i - 1];
|
|
152
|
+
const curr = uniqueDates[i];
|
|
153
|
+
const diffMs = curr.getTime() - prev.getTime();
|
|
154
|
+
const diffDays = Math.round(diffMs / 86400000);
|
|
155
|
+
if (diffDays === 0)
|
|
156
|
+
continue;
|
|
157
|
+
const duration = formatDuration(diffDays);
|
|
158
|
+
gaps.push(`- ${formatDateLabel(prev)} → ${formatDateLabel(curr)}: ${duration}`);
|
|
159
|
+
}
|
|
160
|
+
if (gaps.length === 0)
|
|
161
|
+
return '';
|
|
162
|
+
const first = uniqueDates[0];
|
|
163
|
+
const last = uniqueDates[uniqueDates.length - 1];
|
|
164
|
+
const totalDays = Math.round((last.getTime() - first.getTime()) / 86400000);
|
|
165
|
+
const totalLine = `Total span: ${formatDateLabel(first)} to ${formatDateLabel(last)} (${formatDuration(totalDays)})`;
|
|
166
|
+
const evidenceLines = buildTemporalEvidenceLines(sortedMemories, uniqueDates);
|
|
167
|
+
const evidenceBlock = evidenceLines.length > 0
|
|
168
|
+
? `\nKey temporal evidence:\n${evidenceLines.join('\n')}`
|
|
169
|
+
: '';
|
|
170
|
+
return `Timeline:\n${gaps.join('\n')}\n${totalLine}${evidenceBlock}`;
|
|
171
|
+
}
|
|
172
|
+
function getUniqueDates(memories) {
|
|
173
|
+
const seen = new Set();
|
|
174
|
+
const dates = [];
|
|
175
|
+
for (const m of memories) {
|
|
176
|
+
const ts = pickPackagingDate(m);
|
|
177
|
+
const key = ts.toISOString().slice(0, 10);
|
|
178
|
+
if (!seen.has(key)) {
|
|
179
|
+
seen.add(key);
|
|
180
|
+
dates.push(ts);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return dates;
|
|
184
|
+
}
|
|
185
|
+
function buildTemporalEvidenceLines(memories, dates) {
|
|
186
|
+
return dates
|
|
187
|
+
.slice(0, 4)
|
|
188
|
+
.map((date) => buildTemporalEvidenceLine(memories, date))
|
|
189
|
+
.filter((line) => line !== null);
|
|
190
|
+
}
|
|
191
|
+
function buildTemporalEvidenceLine(memories, date) {
|
|
192
|
+
const key = formatDateLabel(date);
|
|
193
|
+
const sameDate = memories.filter((memory) => formatDateLabel(pickPackagingDate(memory)) === key);
|
|
194
|
+
const selected = sameDate.find((memory) => isAnswerBearing(memory.content)) ?? sameDate[0];
|
|
195
|
+
if (!selected)
|
|
196
|
+
return null;
|
|
197
|
+
return `- ${key}: ${truncateTemporalEvidence(selected.content)}`;
|
|
198
|
+
}
|
|
199
|
+
function truncateTemporalEvidence(content) {
|
|
200
|
+
const normalized = content.replace(/\s+/g, ' ').trim();
|
|
201
|
+
if (normalized.length <= 180)
|
|
202
|
+
return normalized;
|
|
203
|
+
return `${normalized.slice(0, 177)}...`;
|
|
204
|
+
}
|
|
205
|
+
const MIN_AFTER_FILTER = 3;
|
|
206
|
+
const DEDUP_FINGERPRINT_PREFIX = 80;
|
|
207
|
+
function answerOnlyFilter(memories) {
|
|
208
|
+
if (!config.answerOnlyRetrievalFilter)
|
|
209
|
+
return memories;
|
|
210
|
+
const filtered = memories.filter((memory) => isAnswerBearing(memory.content));
|
|
211
|
+
return filtered.length >= MIN_AFTER_FILTER ? filtered : memories;
|
|
212
|
+
}
|
|
213
|
+
function contentFingerprint(content) {
|
|
214
|
+
return content.toLowerCase().replace(/[^a-z0-9]/g, '').slice(0, DEDUP_FINGERPRINT_PREFIX);
|
|
215
|
+
}
|
|
216
|
+
function dedupNearDuplicates(memories) {
|
|
217
|
+
if (!config.retrievalDedupEnabled)
|
|
218
|
+
return memories;
|
|
219
|
+
const seen = new Set();
|
|
220
|
+
const result = [];
|
|
221
|
+
for (const memory of memories) {
|
|
222
|
+
const fingerprint = contentFingerprint(memory.content);
|
|
223
|
+
if (fingerprint.length === 0) {
|
|
224
|
+
result.push(memory);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (seen.has(fingerprint))
|
|
228
|
+
continue;
|
|
229
|
+
seen.add(fingerprint);
|
|
230
|
+
result.push(memory);
|
|
231
|
+
}
|
|
232
|
+
return result.length >= MIN_AFTER_FILTER ? result : memories;
|
|
233
|
+
}
|
|
234
|
+
export function formatInjection(memories, options = {}) {
|
|
235
|
+
const filteredMemories = dedupNearDuplicates(answerOnlyFilter(memories));
|
|
236
|
+
const hasProfile = !!options.userProfileText && options.userProfileText.trim().length > 0;
|
|
237
|
+
const hasEpisodes = !!options.episodes && options.episodes.length > 0;
|
|
238
|
+
const hasFacts = !!options.entityFacts && options.entityFacts.length > 0;
|
|
239
|
+
if (filteredMemories.length === 0 && !hasProfile && !hasEpisodes && !hasFacts)
|
|
240
|
+
return '';
|
|
241
|
+
const stagedLoadingEnabled = options.stagedLoadingEnabled ?? config.stagedLoadingEnabled;
|
|
242
|
+
const profileBlock = hasProfile ? `## USER PROFILE\n${options.userProfileText}\n\n` : '';
|
|
243
|
+
const factsBlock = hasFacts ? `${buildFactsChannel(options.entityFacts)}\n\n` : '';
|
|
244
|
+
const episodesBlock = hasEpisodes ? `${buildEpisodesChannel(options.episodes)}\n\n` : '';
|
|
245
|
+
const body = filteredMemories.length === 0
|
|
246
|
+
? ''
|
|
247
|
+
: (stagedLoadingEnabled ? formatStagedInjection(filteredMemories) : formatFullInjection(filteredMemories));
|
|
248
|
+
return `${profileBlock}${factsBlock}${episodesBlock}${body}`;
|
|
249
|
+
}
|
|
250
|
+
function formatFullInjection(memories) {
|
|
251
|
+
const sorted = sortChronologically(memories);
|
|
252
|
+
const lines = sorted.map((memory, index) => formatFullLine(memory, index));
|
|
253
|
+
const body = `<atomicmem_context count="${memories.length}">\n${lines.join('\n')}\n</atomicmem_context>`;
|
|
254
|
+
const timeline = config.timelineChannelEnabled ? buildTimelineChannel(memories) : '';
|
|
255
|
+
return timeline ? `${timeline}\n\n${body}` : body;
|
|
256
|
+
}
|
|
257
|
+
function buildTimelineChannel(memories) {
|
|
258
|
+
const dates = memories
|
|
259
|
+
.map((m) => m.observed_at)
|
|
260
|
+
.filter((d) => d instanceof Date)
|
|
261
|
+
.sort((a, b) => a.getTime() - b.getTime());
|
|
262
|
+
if (dates.length === 0)
|
|
263
|
+
return '';
|
|
264
|
+
const seen = new Set();
|
|
265
|
+
const unique = [];
|
|
266
|
+
for (const d of dates) {
|
|
267
|
+
const key = d.toISOString().slice(0, 10);
|
|
268
|
+
if (!seen.has(key)) {
|
|
269
|
+
seen.add(key);
|
|
270
|
+
unique.push(key);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
const lines = unique.map((d) => `- ${d}`).join('\n');
|
|
274
|
+
return `## TIMELINE\n${lines}`;
|
|
275
|
+
}
|
|
276
|
+
function formatStagedInjection(memories) {
|
|
277
|
+
const sorted = sortChronologically(memories);
|
|
278
|
+
const lines = sorted.map((memory, index) => formatStagedLine(memory, index));
|
|
279
|
+
const ids = sorted.map((m) => m.id).join(',');
|
|
280
|
+
return [
|
|
281
|
+
`<atomicmem_context count="${memories.length}" mode="staged" expand_ids="${ids}">`,
|
|
282
|
+
lines.join('\n'),
|
|
283
|
+
'<expand_hint>To see full content for any memory, request expansion by ID.</expand_hint>',
|
|
284
|
+
'</atomicmem_context>',
|
|
285
|
+
].join('\n');
|
|
286
|
+
}
|
|
287
|
+
function formatFullLine(memory, index) {
|
|
288
|
+
const attrs = buildCommonAttrs(memory, index);
|
|
289
|
+
return `<memory ${attrs}>\n${escapeXml(memory.content)}\n</memory>`;
|
|
290
|
+
}
|
|
291
|
+
function formatStagedLine(memory, index) {
|
|
292
|
+
const attrs = buildCommonAttrs(memory, index);
|
|
293
|
+
const summary = memory.summary || truncateContent(memory.content);
|
|
294
|
+
return `<memory ${attrs} staged="true">\n${escapeXml(summary)}\n</memory>`;
|
|
295
|
+
}
|
|
296
|
+
function buildCommonAttrs(memory, index) {
|
|
297
|
+
const date = pickPackagingDate(memory);
|
|
298
|
+
const attrs = [
|
|
299
|
+
`index="${index + 1}"`,
|
|
300
|
+
`source="${escapeXml(memory.source_site)}"`,
|
|
301
|
+
`memory_id="${memory.id}"`,
|
|
302
|
+
`created_at="${memory.created_at.toISOString()}"`,
|
|
303
|
+
];
|
|
304
|
+
if (config.packagingDualDate
|
|
305
|
+
&& memory.observed_at
|
|
306
|
+
&& memory.observed_at.getTime() !== memory.created_at.getTime()) {
|
|
307
|
+
attrs.push(`observed_at="${memory.observed_at.toISOString()}"`);
|
|
308
|
+
}
|
|
309
|
+
attrs.push(`importance="${memory.importance.toFixed(1)}"`, `similarity="${memory.similarity.toFixed(2)}"`, `score="${memory.score.toFixed(2)}"`, `age="${formatAge(date)}"`);
|
|
310
|
+
return attrs.join(' ');
|
|
311
|
+
}
|
|
312
|
+
const STAGED_TRUNCATE_LENGTH = 60;
|
|
313
|
+
/** Fallback when no summary is stored: first 60 chars + ellipsis. */
|
|
314
|
+
function truncateContent(content) {
|
|
315
|
+
if (content.length <= STAGED_TRUNCATE_LENGTH)
|
|
316
|
+
return content;
|
|
317
|
+
return content.slice(0, STAGED_TRUNCATE_LENGTH) + '...';
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Format injection using tier assignments from the budget allocator.
|
|
321
|
+
* Uses a compact line-oriented format so tier metadata does not erase
|
|
322
|
+
* the token savings from L0/L1 compression.
|
|
323
|
+
*
|
|
324
|
+
* Iteration is driven off `assignments`: the rendered output contains
|
|
325
|
+
* exactly the memories named by the assignment list, in chronological
|
|
326
|
+
* order. Memories present in the input but missing from `assignments`
|
|
327
|
+
* are not rendered — that's how excluded-by-budget memories stay
|
|
328
|
+
* absent from the package. Throws when an assignment references a
|
|
329
|
+
* memory id that isn't in the input list (caller bug).
|
|
330
|
+
*/
|
|
331
|
+
export function formatTieredInjection(memories, assignments, query = '', options = {}) {
|
|
332
|
+
if (assignments.length === 0)
|
|
333
|
+
return '';
|
|
334
|
+
const memoryById = new Map(memories.map((m) => [m.id, m]));
|
|
335
|
+
const tierById = new Map(assignments.map((a) => [a.memoryId, a.tier]));
|
|
336
|
+
const assignedMemories = assignments.map((a) => {
|
|
337
|
+
const memory = memoryById.get(a.memoryId);
|
|
338
|
+
if (!memory) {
|
|
339
|
+
throw new Error(`formatTieredInjection: assignment references missing memory id "${a.memoryId}"`);
|
|
340
|
+
}
|
|
341
|
+
return memory;
|
|
342
|
+
});
|
|
343
|
+
const sorted = sortChronologically(assignedMemories);
|
|
344
|
+
const lines = sorted.map((memory) => formatTieredLine(memory, tierById.get(memory.id)));
|
|
345
|
+
const expandableIds = assignments
|
|
346
|
+
.filter((a) => a.tier !== 'L2')
|
|
347
|
+
.map((a) => a.memoryId)
|
|
348
|
+
.join(',');
|
|
349
|
+
const sections = expandableIds
|
|
350
|
+
? [lines.join('\n'), `Expandable IDs: ${expandableIds}`]
|
|
351
|
+
: [lines.join('\n')];
|
|
352
|
+
if (options.includeExtraBlock === false)
|
|
353
|
+
return sections.join('\n\n');
|
|
354
|
+
const temporalEvidenceBlock = buildTemporalEvidenceBlock(sorted, query);
|
|
355
|
+
if (temporalEvidenceBlock) {
|
|
356
|
+
return [...sections, temporalEvidenceBlock].join('\n\n');
|
|
357
|
+
}
|
|
358
|
+
return appendTemporalSummary(sections, sorted);
|
|
359
|
+
}
|
|
360
|
+
function buildEventChainChannel(chains, enabled) {
|
|
361
|
+
if (!enabled || !chains || chains.length === 0)
|
|
362
|
+
return '';
|
|
363
|
+
const top = chains[0];
|
|
364
|
+
const lines = top.members.map((m, i) => {
|
|
365
|
+
const date = m.observedAt.toISOString().slice(0, 10);
|
|
366
|
+
return `${i + 1}) [${date}] ${m.text}`;
|
|
367
|
+
});
|
|
368
|
+
return `## EVENT_CHAIN [entity: ${top.entity}] (chronological)\n${lines.join('\n')}`;
|
|
369
|
+
}
|
|
370
|
+
function buildObservationsChannel(reflections) {
|
|
371
|
+
if (!reflections || reflections.length === 0)
|
|
372
|
+
return '';
|
|
373
|
+
const lines = reflections.map((r) => {
|
|
374
|
+
const evidence = r.evidenceMemoryIds.join(', ');
|
|
375
|
+
return `- [${r.observationType}] ${r.observation}\n evidence: ${evidence}`;
|
|
376
|
+
});
|
|
377
|
+
return `## OBSERVATIONS\n${lines.join('\n')}\n\n`;
|
|
378
|
+
}
|
|
379
|
+
function formatTieredLine(memory, tier) {
|
|
380
|
+
const date = pickPackagingDate(memory).toISOString().slice(0, 10);
|
|
381
|
+
const kind = memory.memory_type === 'composite' ? 'composite' : 'atomic';
|
|
382
|
+
const content = getContentAtTier(memory, tier);
|
|
383
|
+
return `- [${date}] [${tier}] [${kind}] ${content}`;
|
|
384
|
+
}
|
|
385
|
+
function formatAge(date) {
|
|
386
|
+
const hours = (Date.now() - date.getTime()) / 3600000;
|
|
387
|
+
if (hours < 1)
|
|
388
|
+
return 'just now';
|
|
389
|
+
if (hours < 24)
|
|
390
|
+
return `${Math.round(hours)}h ago`;
|
|
391
|
+
const days = Math.round(hours / 24);
|
|
392
|
+
if (days < 30)
|
|
393
|
+
return `${days}d ago`;
|
|
394
|
+
return `${Math.round(days / 30)}mo ago`;
|
|
395
|
+
}
|
|
396
|
+
const UNBOUNDED_INJECTION_TOKEN_BUDGET = Number.POSITIVE_INFINITY;
|
|
397
|
+
/**
|
|
398
|
+
* Build injection text from search results, optionally using tiered packaging.
|
|
399
|
+
* Flat mode returns the existing chronological format.
|
|
400
|
+
* Tiered mode assigns L0/L1/L2 tiers under the caller's token budget.
|
|
401
|
+
* When no token budget is provided, tiered packaging is unbounded:
|
|
402
|
+
* quotas still shape rich-detail tiers, but budget_constrained remains
|
|
403
|
+
* false because no caller budget was applied.
|
|
404
|
+
*/
|
|
405
|
+
export function buildInjection(memories, query, mode, tokenBudget, userProfileText, episodes, entityFacts, chains, reflections, questionType = QuestionType.OTHER) {
|
|
406
|
+
const prefix = buildPromptChannelPrefix(userProfileText, episodes, entityFacts, chains, reflections, questionType);
|
|
407
|
+
const applyHint = shouldApplyFormatHint(questionType) && config.answerFormatAlignmentEnabled;
|
|
408
|
+
if (memories.length === 0) {
|
|
409
|
+
const text = applyHint && prefix ? applyFormatHint(prefix, query, true) : prefix;
|
|
410
|
+
return { injectionText: text, budgetConstrained: false, includedMemories: [] };
|
|
411
|
+
}
|
|
412
|
+
if (mode === 'flat') {
|
|
413
|
+
const body = `${prefix}${formatSimpleInjection(memories)}`;
|
|
414
|
+
return {
|
|
415
|
+
injectionText: applyHint ? applyFormatHint(body, query, true) : body,
|
|
416
|
+
budgetConstrained: false,
|
|
417
|
+
includedMemories: memories,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
const tiered = buildTieredInjection(memories, query, mode, tokenBudget);
|
|
421
|
+
const body = `${prefix}${tiered.injectionText}`;
|
|
422
|
+
return {
|
|
423
|
+
...tiered,
|
|
424
|
+
injectionText: applyHint ? applyFormatHint(body, query, true) : body,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
function buildPromptChannelPrefix(userProfileText, episodes, entityFacts, chains, reflections, questionType) {
|
|
428
|
+
const profile = userProfileText?.trim();
|
|
429
|
+
const profileBlock = profile ? `## USER PROFILE\n${profile}\n\n` : '';
|
|
430
|
+
const factsBlock = entityFacts && entityFacts.length > 0 ? `${buildFactsChannel(entityFacts)}\n\n` : '';
|
|
431
|
+
const episodesBlock = episodes && episodes.length > 0 ? `${buildEpisodesChannel(episodes)}\n\n` : '';
|
|
432
|
+
const observationsBlock = shouldEmitObservations(questionType)
|
|
433
|
+
? buildObservationsChannel(reflections)
|
|
434
|
+
: '';
|
|
435
|
+
const rawChainSection = shouldEmitEventChain(questionType)
|
|
436
|
+
? buildEventChainChannel(chains, config.eventChainPackagingEnabled)
|
|
437
|
+
: '';
|
|
438
|
+
const eventChainBlock = rawChainSection ? `${rawChainSection}\n\n` : '';
|
|
439
|
+
return `${profileBlock}${factsBlock}${episodesBlock}${observationsBlock}${eventChainBlock}`;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Tiered-mode package: dedupe composites, reserve tokens for the
|
|
443
|
+
* "extra block" the renderer will append (temporal evidence on
|
|
444
|
+
* temporal queries, timeline summary otherwise — see
|
|
445
|
+
* `computeRenderedExtraTokens`) using a conservative upper-bound from
|
|
446
|
+
* the full deduplicated set, capped so the highest-ranked (top of
|
|
447
|
+
* list) memory's L0 always fits — see `computeExtraBlockReservation`.
|
|
448
|
+
* L0-fit + tier-assign on whatever survives. If the included
|
|
449
|
+
* memories' rendered tokens plus the actual extra block would
|
|
450
|
+
* overflow the budget, drop the extra block and rerun allocation
|
|
451
|
+
* with the full budget so the reserved tokens aren't wasted. Render
|
|
452
|
+
* and report from the surviving subset only.
|
|
453
|
+
*/
|
|
454
|
+
function buildTieredInjection(memories, query, mode, tokenBudget) {
|
|
455
|
+
const deduplicated = deduplicateCompositeMembersHard(memories);
|
|
456
|
+
const budget = tokenBudget ?? UNBOUNDED_INJECTION_TOKEN_BUDGET;
|
|
457
|
+
const forceRichTopHit = prefersAbstractAwareRetrieval(mode, query);
|
|
458
|
+
// First pass: reserve budget for the extra block.
|
|
459
|
+
const reservation = computeExtraBlockReservation(deduplicated, query, budget);
|
|
460
|
+
let pass = runTieredPass(deduplicated, query, reservation.assignmentBudget, forceRichTopHit);
|
|
461
|
+
let extraBlockTokens = computeRenderedExtraTokens(pass.tier.includedMemories, query);
|
|
462
|
+
let extraBlockOmitted = false;
|
|
463
|
+
// If the extra block won't fit alongside the included memories, the
|
|
464
|
+
// reserved tokens are now wasted: rerun allocation against the FULL
|
|
465
|
+
// budget and render without the extra block. Without this second
|
|
466
|
+
// pass, the reservation cap silently shrinks the package even
|
|
467
|
+
// though the omitted block freed those tokens. Deterministic — no
|
|
468
|
+
// iteration, no timing.
|
|
469
|
+
if (pass.sumAssignments + extraBlockTokens > budget) {
|
|
470
|
+
extraBlockOmitted = true;
|
|
471
|
+
pass = runTieredPass(deduplicated, query, budget, forceRichTopHit);
|
|
472
|
+
extraBlockTokens = 0;
|
|
473
|
+
}
|
|
474
|
+
if (pass.tier.includedMemories.length === 0) {
|
|
475
|
+
return {
|
|
476
|
+
injectionText: '',
|
|
477
|
+
budgetConstrained: pass.tier.excludedMemoryIds.length > 0 || reservation.reservationCapped,
|
|
478
|
+
includedMemories: [],
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
const expandIds = pass.visibility.assignments.filter((a) => a.tier !== 'L2').map((a) => a.memoryId);
|
|
482
|
+
return {
|
|
483
|
+
injectionText: formatTieredInjection(pass.tier.includedMemories, pass.visibility.assignments, query, { includeExtraBlock: !extraBlockOmitted }),
|
|
484
|
+
tierAssignments: pass.visibility.assignments,
|
|
485
|
+
expandIds: expandIds.length > 0 ? expandIds : undefined,
|
|
486
|
+
estimatedContextTokens: pass.sumAssignments + extraBlockTokens,
|
|
487
|
+
budgetConstrained: computeBudgetConstrained(pass.tier, pass.visibility, reservation.reservationCapped, extraBlockOmitted),
|
|
488
|
+
includedMemories: pass.tier.includedMemories,
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Run one allocation pass: tier-assign within `assignmentBudget`,
|
|
493
|
+
* then run query-term-visibility upgrades within the same budget.
|
|
494
|
+
* Returns empty-but-shaped state when no memory survives L0-fit so
|
|
495
|
+
* the caller can branch on `tier.includedMemories.length` without
|
|
496
|
+
* defensive nullability checks.
|
|
497
|
+
*/
|
|
498
|
+
function runTieredPass(deduplicated, query, assignmentBudget, forceRichTopHit) {
|
|
499
|
+
const tier = assignTierBudgets(deduplicated, assignmentBudget, { forceRichTopHit });
|
|
500
|
+
if (tier.includedMemories.length === 0) {
|
|
501
|
+
return { tier, visibility: { assignments: [], budgetBlockedVisibilityIds: [] }, sumAssignments: 0 };
|
|
502
|
+
}
|
|
503
|
+
const visibility = preserveQueryTermVisibility(tier.includedMemories, tier.assignments, query, assignmentBudget);
|
|
504
|
+
return { tier, visibility, sumAssignments: sumAssignmentTokens(visibility.assignments) };
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Reserve tokens for whatever extra block `formatTieredInjection`
|
|
508
|
+
* will append (temporal evidence OR timeline summary), capped so the
|
|
509
|
+
* highest-ranked memory's L0 representation can still fit. The cap is
|
|
510
|
+
* rank-aware (top of the list), not min-anywhere, because
|
|
511
|
+
* `selectL0Fit` does strict tail exclusion: a memory only enters the
|
|
512
|
+
* included set if every higher-ranked memory has already fit. A min-
|
|
513
|
+
* anywhere cap would leave room for a smaller lower-ranked memory
|
|
514
|
+
* while excluding the top, blanking the rendered package. When
|
|
515
|
+
* capping actually trims the desired reservation, surface that as a
|
|
516
|
+
* budget-constrained signal.
|
|
517
|
+
*/
|
|
518
|
+
function computeExtraBlockReservation(deduplicated, query, budget) {
|
|
519
|
+
const desired = computeRenderedExtraTokens(deduplicated, query);
|
|
520
|
+
if (desired === 0) {
|
|
521
|
+
return { assignmentBudget: budget, reservationCapped: false };
|
|
522
|
+
}
|
|
523
|
+
const topL0 = deduplicated.length === 0
|
|
524
|
+
? 0
|
|
525
|
+
: estimateTokens(getContentAtTier(deduplicated[0], 'L0'));
|
|
526
|
+
const maxReservation = Math.max(0, budget - topL0);
|
|
527
|
+
const reservation = Math.min(desired, maxReservation);
|
|
528
|
+
return {
|
|
529
|
+
assignmentBudget: Math.max(0, budget - reservation),
|
|
530
|
+
reservationCapped: reservation < desired,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Token cost of whatever extra block `formatTieredInjection` will
|
|
535
|
+
* append for these memories + this query. Mirrors the renderer's
|
|
536
|
+
* branch: try `buildTemporalEvidenceBlock` first; if empty, fall
|
|
537
|
+
* through to the timeline summary that `appendTemporalSummary`
|
|
538
|
+
* would emit. Keeping this in lockstep with the renderer is what
|
|
539
|
+
* guarantees `estimatedContextTokens` matches the rendered text —
|
|
540
|
+
* a previous version only counted the endpoint block, missing
|
|
541
|
+
* timeline tokens on non-temporal queries with multi-date memories.
|
|
542
|
+
*/
|
|
543
|
+
function computeRenderedExtraTokens(memories, query) {
|
|
544
|
+
if (memories.length === 0)
|
|
545
|
+
return 0;
|
|
546
|
+
const sorted = sortChronologically(memories);
|
|
547
|
+
const endpoint = buildTemporalEvidenceBlock(sorted, query);
|
|
548
|
+
if (endpoint)
|
|
549
|
+
return estimateTokens(endpoint);
|
|
550
|
+
const timeline = buildTemporalSummary(sorted);
|
|
551
|
+
return timeline ? estimateTokens(timeline) : 0;
|
|
552
|
+
}
|
|
553
|
+
function computeBudgetConstrained(tier, visibility, reservationCapped, extraBlockOmitted) {
|
|
554
|
+
return (reservationCapped ||
|
|
555
|
+
extraBlockOmitted ||
|
|
556
|
+
tier.excludedMemoryIds.length > 0 ||
|
|
557
|
+
tier.budgetLimitedPromotionIds.length > 0 ||
|
|
558
|
+
visibility.budgetBlockedVisibilityIds.length > 0);
|
|
559
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adaptive retrieval and repair-loop policy helpers.
|
|
3
|
+
*/
|
|
4
|
+
import type { CoreRuntimeConfig } from '../app/runtime-container.js';
|
|
5
|
+
import type { SearchResult } from '../db/memory-repository.js';
|
|
6
|
+
export declare const AGGREGATION_QUERY_LIMIT = 25;
|
|
7
|
+
type AdaptiveLimitConfig = Pick<CoreRuntimeConfig, 'adaptiveRetrievalEnabled' | 'maxSearchResults' | 'adaptiveSimpleLimit' | 'adaptiveMediumLimit' | 'adaptiveComplexLimit' | 'adaptiveMultiHopLimit' | 'adaptiveAggregationLimit'>;
|
|
8
|
+
type RankingEligibilityConfig = Pick<CoreRuntimeConfig, 'retrievalProfileSettings'>;
|
|
9
|
+
export interface RankingEligibilityContext {
|
|
10
|
+
sourceSite?: string;
|
|
11
|
+
referenceTime?: Date;
|
|
12
|
+
}
|
|
13
|
+
export interface RecallBypassContext {
|
|
14
|
+
asOf?: string;
|
|
15
|
+
referenceTime?: Date;
|
|
16
|
+
sourceSite?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface RankingEligibilityDecision {
|
|
19
|
+
id: string;
|
|
20
|
+
similarity: number;
|
|
21
|
+
threshold: number;
|
|
22
|
+
decision: 'eligible' | 'filtered';
|
|
23
|
+
reason: string;
|
|
24
|
+
}
|
|
25
|
+
export interface RankingEligibilityResult {
|
|
26
|
+
results: SearchResult[];
|
|
27
|
+
decisions: RankingEligibilityDecision[];
|
|
28
|
+
removedIds: string[];
|
|
29
|
+
threshold: number | null;
|
|
30
|
+
reason: string;
|
|
31
|
+
queryLabel: QueryComplexityLabel;
|
|
32
|
+
triggered: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface ResolvedLimit {
|
|
35
|
+
limit: number;
|
|
36
|
+
classification: QueryClassification;
|
|
37
|
+
}
|
|
38
|
+
export declare function resolveSearchLimit(query: string, requestedLimit: number | undefined, runtimeConfig: AdaptiveLimitConfig): number;
|
|
39
|
+
export declare function resolveSearchLimitDetailed(query: string, requestedLimit: number | undefined, runtimeConfig: AdaptiveLimitConfig): ResolvedLimit;
|
|
40
|
+
export declare function shouldRunRepairLoop(query: string, memories: SearchResult[], runtimeConfig: Pick<CoreRuntimeConfig, 'repairLoopEnabled' | 'repairLoopMinSimilarity'> & AdaptiveLimitConfig): boolean;
|
|
41
|
+
export interface RepairDecision {
|
|
42
|
+
accepted: boolean;
|
|
43
|
+
reason: 'no-repair-needed' | 'rewrite-unchanged' | 'delta-below-threshold' | 'below-confidence-floor' | 'sabotage-detected' | 'accepted';
|
|
44
|
+
initialTopSim: number;
|
|
45
|
+
repairedTopSim: number;
|
|
46
|
+
simDelta: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Decides whether to accept repaired results over initial results.
|
|
50
|
+
* Gates on two heuristics:
|
|
51
|
+
* 1. Similarity-delta anti-thrash: reject if top-1 similarity didn't improve enough.
|
|
52
|
+
* 2. Confidence floor: reject if repaired top-1 similarity is still too low.
|
|
53
|
+
* Both thresholds default to 0 (always accept) to preserve current behavior.
|
|
54
|
+
*/
|
|
55
|
+
export declare function shouldAcceptRepair(initial: SearchResult[], repaired: SearchResult[], runtimeConfig: Pick<CoreRuntimeConfig, 'repairDeltaThreshold' | 'repairConfidenceFloor'>): RepairDecision;
|
|
56
|
+
export declare function mergeSearchResults(primary: SearchResult[], repair: SearchResult[], limit: number, runtimeConfig: Pick<CoreRuntimeConfig, 'retrievalProfileSettings' | 'maxSearchResults'>): SearchResult[];
|
|
57
|
+
export declare function resolveRerankDepth(limit: number, runtimeConfig: Pick<CoreRuntimeConfig, 'retrievalProfileSettings'>): number;
|
|
58
|
+
export declare function applyRankingEligibility(query: string, candidates: SearchResult[], runtimeConfig: RankingEligibilityConfig, context?: RankingEligibilityContext): RankingEligibilityResult;
|
|
59
|
+
export type QueryComplexityLabel = 'simple' | 'medium' | 'complex' | 'multi-hop' | 'aggregation';
|
|
60
|
+
export interface QueryClassification {
|
|
61
|
+
limit: number;
|
|
62
|
+
label: QueryComplexityLabel;
|
|
63
|
+
/** The marker that triggered a multi-hop or aggregation classification, if any. */
|
|
64
|
+
matchedMarker?: string;
|
|
65
|
+
}
|
|
66
|
+
export declare function classifyQueryDetailed(query: string): QueryClassification;
|
|
67
|
+
export declare function resolveRecallBypass(query: string, queryLabel: QueryComplexityLabel, context: RecallBypassContext): string | null;
|
|
68
|
+
export declare function isAggregationQuery(lowerQuery: string): boolean;
|
|
69
|
+
export {};
|