@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,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BEAM CR fix — retrieval-side enrichment for AUDN bilateral preservation.
|
|
3
|
+
*
|
|
4
|
+
* Two responsibilities, both flag-gated by `contradictionSurfacingEnabled`:
|
|
5
|
+
*
|
|
6
|
+
* 1. enrichTopKWithContradictions: scan top-K SearchResults for
|
|
7
|
+
* `contradiction_active=true`. For each such hit, look up its
|
|
8
|
+
* active contradiction row and inject the counterpart memory into
|
|
9
|
+
* the final set (deduplicated). Returns the augmented memory list
|
|
10
|
+
* plus the resolved contradiction pairs so the prompt can quote both
|
|
11
|
+
* sides verbatim.
|
|
12
|
+
*
|
|
13
|
+
* 2. buildContradictionsBlock: render the resolved pairs as a
|
|
14
|
+
* `## CONTRADICTIONS_DETECTED` markdown section. Returns undefined
|
|
15
|
+
* when there are no contradictions to surface, so callers can
|
|
16
|
+
* conditionally prepend the block to the injection text.
|
|
17
|
+
*
|
|
18
|
+
* Pure functions plus one DB read via ContradictionsRepository.
|
|
19
|
+
* No fallback behavior — when the surfacing flag is off OR the store is
|
|
20
|
+
* missing, callers see `{ memories, pairs: [] }`.
|
|
21
|
+
*/
|
|
22
|
+
import { QuestionType } from './answer-format.js';
|
|
23
|
+
/**
|
|
24
|
+
* Inspect top-K results for `contradiction_active=true` hits, fetch their
|
|
25
|
+
* counterparts, and produce an augmented memory list + the resolved pairs.
|
|
26
|
+
* Pure additive: never drops memories from the input list.
|
|
27
|
+
*/
|
|
28
|
+
export async function enrichTopKWithContradictions(input) {
|
|
29
|
+
if (!input.enabled || !input.contradictions) {
|
|
30
|
+
return { memories: input.memories, pairs: [] };
|
|
31
|
+
}
|
|
32
|
+
const activeHitIds = input.memories
|
|
33
|
+
.filter((m) => isContradictionActive(m))
|
|
34
|
+
.map((m) => m.id);
|
|
35
|
+
if (activeHitIds.length === 0) {
|
|
36
|
+
return { memories: input.memories, pairs: [] };
|
|
37
|
+
}
|
|
38
|
+
const rows = await input.contradictions.findActiveByUserAndMemoryIds(input.userId, activeHitIds);
|
|
39
|
+
if (rows.length === 0) {
|
|
40
|
+
return { memories: input.memories, pairs: [] };
|
|
41
|
+
}
|
|
42
|
+
const memoryById = new Map(input.memories.map((m) => [m.id, m]));
|
|
43
|
+
const augmented = [...input.memories];
|
|
44
|
+
const pairs = [];
|
|
45
|
+
for (const row of rows) {
|
|
46
|
+
const counterpartId = pickCounterpartId(row, memoryById);
|
|
47
|
+
if (counterpartId && !memoryById.has(counterpartId)) {
|
|
48
|
+
const fetched = await input.fetchCounterpart(counterpartId);
|
|
49
|
+
if (fetched) {
|
|
50
|
+
augmented.push(fetched);
|
|
51
|
+
memoryById.set(fetched.id, fetched);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
pairs.push({
|
|
55
|
+
contradictionId: row.id,
|
|
56
|
+
leftMemoryId: row.leftMemoryId,
|
|
57
|
+
rightMemoryId: row.rightMemoryId,
|
|
58
|
+
leftSummary: row.leftSummary,
|
|
59
|
+
rightSummary: row.rightSummary,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return { memories: augmented, pairs: dedupePairs(pairs) };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Render the `## CONTRADICTIONS_DETECTED` markdown block. Returns undefined
|
|
66
|
+
* when there's nothing to render OR when the question type is not one of
|
|
67
|
+
* the contradiction-relevant types (e.g., simple summary). Per spec, the
|
|
68
|
+
* block is always rendered for CR queries OR when pairs are present.
|
|
69
|
+
*/
|
|
70
|
+
export function buildContradictionsBlock(pairs, questionType) {
|
|
71
|
+
if (pairs.length === 0)
|
|
72
|
+
return undefined;
|
|
73
|
+
const relevant = questionType === QuestionType.CONTRADICTION ||
|
|
74
|
+
questionType === QuestionType.SUMMARY ||
|
|
75
|
+
questionType === QuestionType.OTHER;
|
|
76
|
+
if (!relevant)
|
|
77
|
+
return undefined;
|
|
78
|
+
const lines = pairs.map((p) => `- You said: "${p.leftSummary}" but also: "${p.rightSummary}"`);
|
|
79
|
+
return `## CONTRADICTIONS_DETECTED\n${lines.join('\n')}\n\n`;
|
|
80
|
+
}
|
|
81
|
+
function isContradictionActive(memory) {
|
|
82
|
+
// The column was added by the audn_bilateral migration; some older rows
|
|
83
|
+
// may not surface it through the row normalizer. Treat absence as false.
|
|
84
|
+
const value = memory.contradiction_active;
|
|
85
|
+
return value === true;
|
|
86
|
+
}
|
|
87
|
+
function pickCounterpartId(row, memoryById) {
|
|
88
|
+
// Prefer the side that's NOT already in top-K. If both are in, return null
|
|
89
|
+
// (no extra fetch needed). If neither is in, prefer the left memory (the
|
|
90
|
+
// older side that AUDN would have discarded pre-fix).
|
|
91
|
+
const leftIn = memoryById.has(row.leftMemoryId);
|
|
92
|
+
const rightIn = memoryById.has(row.rightMemoryId);
|
|
93
|
+
if (leftIn && !rightIn)
|
|
94
|
+
return row.rightMemoryId;
|
|
95
|
+
if (!leftIn && rightIn)
|
|
96
|
+
return row.leftMemoryId;
|
|
97
|
+
if (!leftIn && !rightIn)
|
|
98
|
+
return row.leftMemoryId;
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
function dedupePairs(pairs) {
|
|
102
|
+
const seen = new Set();
|
|
103
|
+
const out = [];
|
|
104
|
+
for (const p of pairs) {
|
|
105
|
+
if (seen.has(p.contradictionId))
|
|
106
|
+
continue;
|
|
107
|
+
seen.add(p.contradictionId);
|
|
108
|
+
out.push(p);
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight per-call cost telemetry.
|
|
3
|
+
* Writes JSONL events for LLM and embedding calls when enabled.
|
|
4
|
+
*/
|
|
5
|
+
export type CostStage = 'extract' | 'answer' | 'judge' | 'embedding' | 'other';
|
|
6
|
+
export interface CostUsage {
|
|
7
|
+
inputTokens?: number | null;
|
|
8
|
+
outputTokens?: number | null;
|
|
9
|
+
totalTokens?: number | null;
|
|
10
|
+
}
|
|
11
|
+
export interface CostEvent {
|
|
12
|
+
ts: string;
|
|
13
|
+
runId: string;
|
|
14
|
+
stage: CostStage;
|
|
15
|
+
provider: string;
|
|
16
|
+
model: string;
|
|
17
|
+
requestKind: 'chat' | 'embedding';
|
|
18
|
+
durationMs: number;
|
|
19
|
+
cacheHit: boolean;
|
|
20
|
+
inputTokens: number | null;
|
|
21
|
+
outputTokens: number | null;
|
|
22
|
+
totalTokens: number | null;
|
|
23
|
+
estimatedCostUsd: number | null;
|
|
24
|
+
meta?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
export declare function getCostStage(): CostStage;
|
|
27
|
+
export declare function withCostStage<T>(stage: CostStage, fn: () => Promise<T>): Promise<T>;
|
|
28
|
+
export declare function estimateCostUsd(provider: string, model: string, usage?: CostUsage): number | null;
|
|
29
|
+
/**
|
|
30
|
+
* Config subset consumed by writeCostEvent. Narrow Pick<> of the supported
|
|
31
|
+
* operator-config surface so callers only thread what the function reads.
|
|
32
|
+
*/
|
|
33
|
+
export interface WriteCostEventConfig {
|
|
34
|
+
costLoggingEnabled: boolean;
|
|
35
|
+
costRunId: string;
|
|
36
|
+
costLogDir: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function writeCostEvent(event: Omit<CostEvent, 'ts' | 'runId'>, config: WriteCostEventConfig): void;
|
|
39
|
+
export declare function summarizeUsage(inputTokens?: number | null, outputTokens?: number | null, totalTokens?: number | null): CostUsage;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight per-call cost telemetry.
|
|
3
|
+
* Writes JSONL events for LLM and embedding calls when enabled.
|
|
4
|
+
*/
|
|
5
|
+
import { mkdirSync, appendFileSync } from 'node:fs';
|
|
6
|
+
import { dirname, resolve } from 'node:path';
|
|
7
|
+
let currentStage = 'other';
|
|
8
|
+
const PRICE_PER_MILLION = {
|
|
9
|
+
'openai:gpt-4.1-mini': { input: 0.4, output: 1.6 },
|
|
10
|
+
};
|
|
11
|
+
function setCostStage(stage) {
|
|
12
|
+
currentStage = stage;
|
|
13
|
+
}
|
|
14
|
+
export function getCostStage() {
|
|
15
|
+
return currentStage;
|
|
16
|
+
}
|
|
17
|
+
export async function withCostStage(stage, fn) {
|
|
18
|
+
const prev = currentStage;
|
|
19
|
+
currentStage = stage;
|
|
20
|
+
try {
|
|
21
|
+
return await fn();
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
currentStage = prev;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function estimateCostUsd(provider, model, usage) {
|
|
28
|
+
if (!usage)
|
|
29
|
+
return null;
|
|
30
|
+
const price = PRICE_PER_MILLION[`${provider}:${model}`];
|
|
31
|
+
if (!price)
|
|
32
|
+
return null;
|
|
33
|
+
const input = usage.inputTokens ?? 0;
|
|
34
|
+
const output = usage.outputTokens ?? 0;
|
|
35
|
+
return (input / 1_000_000) * price.input + (output / 1_000_000) * price.output;
|
|
36
|
+
}
|
|
37
|
+
export function writeCostEvent(event, config) {
|
|
38
|
+
if (!config.costLoggingEnabled)
|
|
39
|
+
return;
|
|
40
|
+
const runId = config.costRunId || `adhoc-${new Date().toISOString().slice(0, 10)}`;
|
|
41
|
+
const logPath = resolve(config.costLogDir, `${runId}.jsonl`);
|
|
42
|
+
mkdirSync(dirname(logPath), { recursive: true });
|
|
43
|
+
const fullEvent = {
|
|
44
|
+
ts: new Date().toISOString(),
|
|
45
|
+
runId,
|
|
46
|
+
...event,
|
|
47
|
+
};
|
|
48
|
+
appendFileSync(logPath, JSON.stringify(fullEvent) + '\n', 'utf-8');
|
|
49
|
+
}
|
|
50
|
+
export function summarizeUsage(inputTokens, outputTokens, totalTokens) {
|
|
51
|
+
return {
|
|
52
|
+
inputTokens: inputTokens ?? null,
|
|
53
|
+
outputTokens: outputTokens ?? null,
|
|
54
|
+
totalTokens: totalTokens ?? ((inputTokens ?? null) !== null || (outputTokens ?? null) !== null
|
|
55
|
+
? (inputTokens ?? 0) + (outputTokens ?? 0)
|
|
56
|
+
: null),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Counter-evidence retrieval (Sprint 3 v1.1, V2 backlog item 1).
|
|
3
|
+
*
|
|
4
|
+
* After RRF + MMR selects top-K candidates, look up the belief_edges graph
|
|
5
|
+
* for any COUNTER edges where the target is a top-K memory. Fetch the
|
|
6
|
+
* counter-source memories (which represent the *other side* of a recorded
|
|
7
|
+
* contradiction) and append them to the result set.
|
|
8
|
+
*
|
|
9
|
+
* Surfaces both halves of a contradiction by construction, fixing the
|
|
10
|
+
* failure pattern we diagnosed on AMB BEAM-100K conv 1 question
|
|
11
|
+
* "Have I integrated Flask-Login?" where retrieval surfaced only the
|
|
12
|
+
* affirmative memory and the contradicting denial was scored 0.
|
|
13
|
+
*
|
|
14
|
+
* Feature flag: counterEvidenceEnabled (default OFF). Requires TBC to have
|
|
15
|
+
* been ON at ingest so belief_edges rows exist.
|
|
16
|
+
*/
|
|
17
|
+
import pg from 'pg';
|
|
18
|
+
import type { SearchResult } from '../db/repository-types.js';
|
|
19
|
+
export interface CounterEvidenceDeps {
|
|
20
|
+
pool: pg.Pool;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Expand a result list with counter-evidence linked memories.
|
|
24
|
+
*
|
|
25
|
+
* For each candidate, find belief_edges where target_id = candidate.id AND
|
|
26
|
+
* edge_type='counter'. Fetch the unique counter-source memories. Tag each
|
|
27
|
+
* appended row with metadata.counter_evidence_for = [target_ids] so the
|
|
28
|
+
* answer LLM can recognize them as contradicting claims.
|
|
29
|
+
*
|
|
30
|
+
* Returns the original candidates + the expanded set (deduped by id).
|
|
31
|
+
* The expansion preserves the existing top-K order and appends new IDs
|
|
32
|
+
* at the end; downstream MMR/packaging is unchanged.
|
|
33
|
+
*/
|
|
34
|
+
export declare function expandWithCounterEvidence(deps: CounterEvidenceDeps, userId: string, candidates: SearchResult[]): Promise<SearchResult[]>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Counter-evidence retrieval (Sprint 3 v1.1, V2 backlog item 1).
|
|
3
|
+
*
|
|
4
|
+
* After RRF + MMR selects top-K candidates, look up the belief_edges graph
|
|
5
|
+
* for any COUNTER edges where the target is a top-K memory. Fetch the
|
|
6
|
+
* counter-source memories (which represent the *other side* of a recorded
|
|
7
|
+
* contradiction) and append them to the result set.
|
|
8
|
+
*
|
|
9
|
+
* Surfaces both halves of a contradiction by construction, fixing the
|
|
10
|
+
* failure pattern we diagnosed on AMB BEAM-100K conv 1 question
|
|
11
|
+
* "Have I integrated Flask-Login?" where retrieval surfaced only the
|
|
12
|
+
* affirmative memory and the contradicting denial was scored 0.
|
|
13
|
+
*
|
|
14
|
+
* Feature flag: counterEvidenceEnabled (default OFF). Requires TBC to have
|
|
15
|
+
* been ON at ingest so belief_edges rows exist.
|
|
16
|
+
*/
|
|
17
|
+
/** Max counter-source memories to append per result. Keeps the answer
|
|
18
|
+
* context from exploding when there are many recorded contradictions. */
|
|
19
|
+
const MAX_COUNTER_PER_TARGET = 2;
|
|
20
|
+
/**
|
|
21
|
+
* Expand a result list with counter-evidence linked memories.
|
|
22
|
+
*
|
|
23
|
+
* For each candidate, find belief_edges where target_id = candidate.id AND
|
|
24
|
+
* edge_type='counter'. Fetch the unique counter-source memories. Tag each
|
|
25
|
+
* appended row with metadata.counter_evidence_for = [target_ids] so the
|
|
26
|
+
* answer LLM can recognize them as contradicting claims.
|
|
27
|
+
*
|
|
28
|
+
* Returns the original candidates + the expanded set (deduped by id).
|
|
29
|
+
* The expansion preserves the existing top-K order and appends new IDs
|
|
30
|
+
* at the end; downstream MMR/packaging is unchanged.
|
|
31
|
+
*/
|
|
32
|
+
export async function expandWithCounterEvidence(deps, userId, candidates) {
|
|
33
|
+
if (candidates.length === 0)
|
|
34
|
+
return candidates;
|
|
35
|
+
const candidateIds = candidates.map((c) => c.id);
|
|
36
|
+
const counterSources = await fetchCounterSources(deps.pool, userId, candidateIds);
|
|
37
|
+
if (counterSources.size === 0)
|
|
38
|
+
return candidates;
|
|
39
|
+
const existingIds = new Set(candidateIds);
|
|
40
|
+
const sourceIdsToFetch = Array.from(counterSources.keys()).filter((id) => !existingIds.has(id));
|
|
41
|
+
if (sourceIdsToFetch.length === 0)
|
|
42
|
+
return candidates;
|
|
43
|
+
const fetched = await fetchMemoriesByIds(deps.pool, userId, sourceIdsToFetch);
|
|
44
|
+
// Tag each fetched memory with which target(s) it counters.
|
|
45
|
+
const tagged = fetched.map((m) => {
|
|
46
|
+
const targets = counterSources.get(m.id) ?? [];
|
|
47
|
+
const extraMeta = { counter_evidence_for: targets, counter_evidence_source: true };
|
|
48
|
+
return {
|
|
49
|
+
...m,
|
|
50
|
+
metadata: { ...(m.metadata ?? {}), ...extraMeta },
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
return [...candidates, ...tagged];
|
|
54
|
+
}
|
|
55
|
+
/** Returns a map source_id → list of target_ids that source counters. */
|
|
56
|
+
async function fetchCounterSources(pool, userId, targetIds) {
|
|
57
|
+
if (targetIds.length === 0)
|
|
58
|
+
return new Map();
|
|
59
|
+
const result = await pool.query(`SELECT source_id, target_id
|
|
60
|
+
FROM belief_edges
|
|
61
|
+
WHERE user_id = $1
|
|
62
|
+
AND target_id = ANY($2::uuid[])
|
|
63
|
+
AND edge_type = 'counter'
|
|
64
|
+
ORDER BY created_at DESC
|
|
65
|
+
LIMIT $3`, [userId, targetIds, targetIds.length * MAX_COUNTER_PER_TARGET]);
|
|
66
|
+
const out = new Map();
|
|
67
|
+
for (const row of result.rows) {
|
|
68
|
+
const existing = out.get(row.source_id) ?? [];
|
|
69
|
+
if (!existing.includes(row.target_id)) {
|
|
70
|
+
existing.push(row.target_id);
|
|
71
|
+
}
|
|
72
|
+
out.set(row.source_id, existing);
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
async function fetchMemoriesByIds(pool, userId, ids) {
|
|
77
|
+
if (ids.length === 0)
|
|
78
|
+
return [];
|
|
79
|
+
const result = await pool.query(`SELECT *,
|
|
80
|
+
0.5 AS similarity,
|
|
81
|
+
0.5 AS score,
|
|
82
|
+
0.5 AS semantic_similarity,
|
|
83
|
+
0.5 AS relevance,
|
|
84
|
+
0.5 AS ranking_score
|
|
85
|
+
FROM memories
|
|
86
|
+
WHERE id = ANY($1::uuid[])
|
|
87
|
+
AND user_id = $2
|
|
88
|
+
AND deleted_at IS NULL
|
|
89
|
+
AND expired_at IS NULL
|
|
90
|
+
AND status = 'active'`, [ids, userId]);
|
|
91
|
+
return result.rows;
|
|
92
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Present-state reranking for queries asking what is true now.
|
|
3
|
+
*
|
|
4
|
+
* Detects implicit current-state queries ("What database does the project use?")
|
|
5
|
+
* and applies recency-based boosting so newer facts outrank older superseded ones.
|
|
6
|
+
*
|
|
7
|
+
* Key signals:
|
|
8
|
+
* - Recency rank: newer results get higher boost
|
|
9
|
+
* - Transition detection: facts describing state changes ("migrated to X",
|
|
10
|
+
* "switched to Y") get a bonus — they establish current state
|
|
11
|
+
* - Historical-only penalty: facts about old state without transition markers
|
|
12
|
+
* ("uses Angular 15") get no boost
|
|
13
|
+
*/
|
|
14
|
+
import type { SearchResult } from '../db/memory-repository.js';
|
|
15
|
+
export interface CurrentStateRankingResult {
|
|
16
|
+
triggered: boolean;
|
|
17
|
+
results: SearchResult[];
|
|
18
|
+
}
|
|
19
|
+
export declare function applyCurrentStateRanking(query: string, results: SearchResult[]): CurrentStateRankingResult;
|
|
20
|
+
export declare function isHistoricalQuery(query: string): boolean;
|
|
21
|
+
export declare function isCurrentStateQuery(query: string): boolean;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Present-state reranking for queries asking what is true now.
|
|
3
|
+
*
|
|
4
|
+
* Detects implicit current-state queries ("What database does the project use?")
|
|
5
|
+
* and applies recency-based boosting so newer facts outrank older superseded ones.
|
|
6
|
+
*
|
|
7
|
+
* Key signals:
|
|
8
|
+
* - Recency rank: newer results get higher boost
|
|
9
|
+
* - Transition detection: facts describing state changes ("migrated to X",
|
|
10
|
+
* "switched to Y") get a bonus — they establish current state
|
|
11
|
+
* - Historical-only penalty: facts about old state without transition markers
|
|
12
|
+
* ("uses Angular 15") get no boost
|
|
13
|
+
*/
|
|
14
|
+
const CURRENT_QUERY_MARKERS = [' now', ' current ', ' currently', ' right now', ' at the moment', ' latest '];
|
|
15
|
+
const HISTORICAL_QUERY_MARKERS = ['used to', 'previously', 'former', 'old ', 'history', 'timeline', 'before switching', 'before migrating', 'before moving', 'earlier '];
|
|
16
|
+
const CURRENT_QUERY_STARTERS = [' what ', ' where ', ' who '];
|
|
17
|
+
const CURRENT_DOMAIN_MARKERS = [
|
|
18
|
+
' use', ' using', ' backend', ' system', ' engine', ' framework',
|
|
19
|
+
' database', ' employer', ' work', ' live', ' salary', ' library',
|
|
20
|
+
' orm', ' stack', ' tool',
|
|
21
|
+
];
|
|
22
|
+
/**
|
|
23
|
+
* Quantity/frequency/duration starters that implicitly ask about the latest value.
|
|
24
|
+
* "How many X do I have?" → current count. "How often do I X?" → current frequency.
|
|
25
|
+
* These bypass the domain-marker requirement because the question structure
|
|
26
|
+
* itself implies current-state intent.
|
|
27
|
+
*/
|
|
28
|
+
const QUANTITY_STARTERS = ['how many ', 'how often ', 'how long ', 'how much '];
|
|
29
|
+
const TEMPORAL_COMPARISON_MARKERS = [
|
|
30
|
+
' between ', ' first ', ' second ', ' before ', ' after ',
|
|
31
|
+
' elapsed ', ' lapsed ', ' passed ',
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* Markers in result content indicating the fact describes current state.
|
|
35
|
+
* "uses X" or "is using X" → this is what's true now.
|
|
36
|
+
*/
|
|
37
|
+
const CURRENT_RESULT_MARKERS = [
|
|
38
|
+
'current ', 'currently ', ' now ', 'uses ', 'is using ',
|
|
39
|
+
'started at', 'started working', 'new package', 'new company',
|
|
40
|
+
'just moved', 'moved to', 'renting',
|
|
41
|
+
];
|
|
42
|
+
/**
|
|
43
|
+
* Transition markers — facts that describe a change FROM old state TO new state.
|
|
44
|
+
* These establish current state and should be boosted, not penalized.
|
|
45
|
+
* Pattern: "migrated from X to Y", "switched to Y", "completed migration"
|
|
46
|
+
*/
|
|
47
|
+
const TRANSITION_MARKERS = [
|
|
48
|
+
'switched to', 'migrated to', 'migration to', 'completed migration',
|
|
49
|
+
'completed the migration', 'moved from', 'changed to', 'upgraded to',
|
|
50
|
+
'transitioned to', 'replaced with', 'rewritten', 'left ',
|
|
51
|
+
'all data has been migrated', 'migration is complete',
|
|
52
|
+
'have been rewritten', 'instead of',
|
|
53
|
+
'correction:', 'correction ',
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* Markers indicating purely historical content without transition context.
|
|
57
|
+
* Only applied when the fact does NOT also contain a transition marker.
|
|
58
|
+
*/
|
|
59
|
+
const HISTORICAL_ONLY_MARKERS = [
|
|
60
|
+
'previously ', 'used to ', 'former ', 'at that time',
|
|
61
|
+
'earlier ', 'was an earlier', 'an earlier ',
|
|
62
|
+
];
|
|
63
|
+
const RECENCY_BONUS = 2.5;
|
|
64
|
+
const CURRENT_TEXT_BONUS = 0.45;
|
|
65
|
+
const TRANSITION_BONUS = 1.5;
|
|
66
|
+
const HISTORICAL_ONLY_PENALTY = 0.6;
|
|
67
|
+
export function applyCurrentStateRanking(query, results) {
|
|
68
|
+
if (results.length === 0)
|
|
69
|
+
return { triggered: false, results };
|
|
70
|
+
if (isHistoricalQuery(query)) {
|
|
71
|
+
return applyHistoricalRanking(results);
|
|
72
|
+
}
|
|
73
|
+
if (!isCurrentStateQuery(query)) {
|
|
74
|
+
return { triggered: false, results };
|
|
75
|
+
}
|
|
76
|
+
const rankMap = buildRecencyRankMap(results);
|
|
77
|
+
const rescored = results
|
|
78
|
+
.map((result) => ({ ...result, score: result.score + computeBoost(result, rankMap, results.length) }))
|
|
79
|
+
.sort((left, right) => right.score - left.score);
|
|
80
|
+
return { triggered: true, results: rescored };
|
|
81
|
+
}
|
|
82
|
+
const HISTORICAL_OLDNESS_BONUS = 1.5;
|
|
83
|
+
const HISTORICAL_TRANSITION_PENALTY = 1.2;
|
|
84
|
+
/**
|
|
85
|
+
* Historical query ranking — inverse of current-state ranking.
|
|
86
|
+
* Boosts older results and penalizes transition/current-state content.
|
|
87
|
+
*/
|
|
88
|
+
function applyHistoricalRanking(results) {
|
|
89
|
+
const rankMap = buildRecencyRankMap(results);
|
|
90
|
+
const total = results.length;
|
|
91
|
+
const rescored = results
|
|
92
|
+
.map((result) => {
|
|
93
|
+
const recencyRank = rankMap.get(result.id) ?? total - 1;
|
|
94
|
+
const oldnessBoost = HISTORICAL_OLDNESS_BONUS * (recencyRank / total);
|
|
95
|
+
const transitionPenalty = hasTransitionMarker(result.content) ? HISTORICAL_TRANSITION_PENALTY : 0;
|
|
96
|
+
const currentPenalty = hasCurrentMarker(result.content) ? CURRENT_TEXT_BONUS : 0;
|
|
97
|
+
const historicalBoost = hasHistoricalOnlyMarker(result.content) ? HISTORICAL_ONLY_PENALTY : 0;
|
|
98
|
+
return { ...result, score: result.score + oldnessBoost + historicalBoost - transitionPenalty - currentPenalty };
|
|
99
|
+
})
|
|
100
|
+
.sort((left, right) => right.score - left.score);
|
|
101
|
+
return { triggered: true, results: rescored };
|
|
102
|
+
}
|
|
103
|
+
export function isHistoricalQuery(query) {
|
|
104
|
+
const padded = ` ${query.toLowerCase()} `;
|
|
105
|
+
return HISTORICAL_QUERY_MARKERS.some((marker) => padded.includes(marker));
|
|
106
|
+
}
|
|
107
|
+
export function isCurrentStateQuery(query) {
|
|
108
|
+
const padded = ` ${query.toLowerCase()} `;
|
|
109
|
+
if (HISTORICAL_QUERY_MARKERS.some((marker) => padded.includes(marker)))
|
|
110
|
+
return false;
|
|
111
|
+
if (CURRENT_QUERY_MARKERS.some((marker) => padded.includes(marker)))
|
|
112
|
+
return true;
|
|
113
|
+
if (QUANTITY_STARTERS.some((starter) => padded.trimStart().startsWith(starter))) {
|
|
114
|
+
const isTemporalComparison = TEMPORAL_COMPARISON_MARKERS.some((marker) => padded.includes(marker));
|
|
115
|
+
return !isTemporalComparison;
|
|
116
|
+
}
|
|
117
|
+
const startsWithQuestionWord = CURRENT_QUERY_STARTERS.some((starter) => padded.startsWith(starter));
|
|
118
|
+
return startsWithQuestionWord && CURRENT_DOMAIN_MARKERS.some((marker) => padded.includes(marker));
|
|
119
|
+
}
|
|
120
|
+
/** Build a map from memory id to its recency rank (0 = most recent). */
|
|
121
|
+
function buildRecencyRankMap(results) {
|
|
122
|
+
const recencyOrder = [...results]
|
|
123
|
+
.map((result) => result.id)
|
|
124
|
+
.sort((left, right) => compareRecency(results, left, right));
|
|
125
|
+
return new Map(recencyOrder.map((id, index) => [id, index]));
|
|
126
|
+
}
|
|
127
|
+
function compareRecency(results, leftId, rightId) {
|
|
128
|
+
const left = results.find((result) => result.id === leftId);
|
|
129
|
+
const right = results.find((result) => result.id === rightId);
|
|
130
|
+
return right.created_at.getTime() - left.created_at.getTime();
|
|
131
|
+
}
|
|
132
|
+
function computeBoost(result, rankMap, total) {
|
|
133
|
+
const recencyRank = rankMap.get(result.id) ?? total - 1;
|
|
134
|
+
const recencyBoost = RECENCY_BONUS * ((total - recencyRank) / total);
|
|
135
|
+
const isTransition = hasTransitionMarker(result.content);
|
|
136
|
+
const transitionBoost = isTransition ? TRANSITION_BONUS : 0;
|
|
137
|
+
const textBoost = hasCurrentMarker(result.content) ? CURRENT_TEXT_BONUS : 0;
|
|
138
|
+
const historicalPenalty = !isTransition && hasHistoricalOnlyMarker(result.content) ? HISTORICAL_ONLY_PENALTY : 0;
|
|
139
|
+
return recencyBoost + transitionBoost + textBoost - historicalPenalty;
|
|
140
|
+
}
|
|
141
|
+
function hasCurrentMarker(text) {
|
|
142
|
+
const lower = text.toLowerCase();
|
|
143
|
+
return CURRENT_RESULT_MARKERS.some((marker) => lower.includes(marker));
|
|
144
|
+
}
|
|
145
|
+
function hasTransitionMarker(text) {
|
|
146
|
+
const lower = text.toLowerCase();
|
|
147
|
+
return TRANSITION_MARKERS.some((marker) => lower.includes(marker));
|
|
148
|
+
}
|
|
149
|
+
function hasHistoricalOnlyMarker(text) {
|
|
150
|
+
const lower = text.toLowerCase();
|
|
151
|
+
return HISTORICAL_ONLY_MARKERS.some((marker) => lower.includes(marker));
|
|
152
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deferred AUDN Reconciliation Service.
|
|
3
|
+
*
|
|
4
|
+
* When DEFERRED_AUDN_ENABLED=true, facts with conflict candidates
|
|
5
|
+
* (0.7 ≤ similarity < 0.95) are stored immediately as ADD and flagged
|
|
6
|
+
* for background reconciliation. This eliminates the 500–2000ms LLM
|
|
7
|
+
* AUDN call from the synchronous ingest path.
|
|
8
|
+
*
|
|
9
|
+
* The reconciliation pass processes flagged memories in batches,
|
|
10
|
+
* running the full LLM AUDN pipeline and applying decisions
|
|
11
|
+
* (NOOP → delete, SUPERSEDE → soft-delete original, UPDATE → merge).
|
|
12
|
+
*
|
|
13
|
+
* Expected latency improvement: 60–80% reduction for ingest batches
|
|
14
|
+
* with moderate conflict rates (30–70% of facts hitting candidates).
|
|
15
|
+
*/
|
|
16
|
+
import type pg from 'pg';
|
|
17
|
+
import type { MemoryStore } from '../db/stores.js';
|
|
18
|
+
import { type CandidateMemory } from './conflict-policy.js';
|
|
19
|
+
export interface ReconciliationResult {
|
|
20
|
+
processed: number;
|
|
21
|
+
resolved: number;
|
|
22
|
+
noops: number;
|
|
23
|
+
updates: number;
|
|
24
|
+
supersedes: number;
|
|
25
|
+
deletes: number;
|
|
26
|
+
adds: number;
|
|
27
|
+
errors: number;
|
|
28
|
+
durationMs: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check whether a set of candidates should be deferred rather than
|
|
32
|
+
* resolved via LLM AUDN synchronously.
|
|
33
|
+
*/
|
|
34
|
+
export declare function shouldDeferAudn(fastDecisionResolved: boolean, candidateCount: number): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Mark a newly stored memory for deferred reconciliation.
|
|
37
|
+
*/
|
|
38
|
+
export declare function deferMemoryForReconciliation(pool: pg.Pool, memoryId: string, candidates: CandidateMemory[]): Promise<void>;
|
|
39
|
+
/** Run a reconciliation pass for a single user. */
|
|
40
|
+
export declare function reconcileUser(pool: pg.Pool, repo: MemoryStore, userId: string, batchSize?: number): Promise<ReconciliationResult>;
|
|
41
|
+
/** Run a reconciliation pass across all users. */
|
|
42
|
+
export declare function reconcileAll(pool: pg.Pool, repo: MemoryStore, batchSize?: number): Promise<ReconciliationResult>;
|
|
43
|
+
/** Get reconciliation status for a user. */
|
|
44
|
+
export declare function getReconciliationStatus(pool: pg.Pool, userId: string): Promise<{
|
|
45
|
+
pending: number;
|
|
46
|
+
enabled: boolean;
|
|
47
|
+
}>;
|