@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,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateless helpers extracted out of `document-upload.ts` to keep the
|
|
3
|
+
* orchestration file under the workspace 400-line cap. These are pure
|
|
4
|
+
* functions + small async wrappers — no orchestration state, no
|
|
5
|
+
* codec/store/registry coupling beyond the typed argument bag.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
import { buildLastError, markRawStorageFailedByDocumentId, } from '../db/raw-document-status-repository.js';
|
|
9
|
+
import { getRawDocumentById } from '../db/raw-document-repository.js';
|
|
10
|
+
export class UploadDocumentNotFoundError extends Error {
|
|
11
|
+
documentId;
|
|
12
|
+
constructor(documentId) {
|
|
13
|
+
super(`document ${documentId} not found`);
|
|
14
|
+
this.documentId = documentId;
|
|
15
|
+
this.name = 'UploadDocumentNotFoundError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class ManagedStorageDisabledError extends Error {
|
|
19
|
+
constructor() {
|
|
20
|
+
super('managed_blob storage is not enabled for this deployment');
|
|
21
|
+
this.name = 'ManagedStorageDisabledError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export class UploadDocumentConflictError extends Error {
|
|
25
|
+
documentId;
|
|
26
|
+
existingContentHash;
|
|
27
|
+
incomingContentHash;
|
|
28
|
+
constructor(documentId, existingContentHash, incomingContentHash) {
|
|
29
|
+
super(`document ${documentId} already has a managed blob with content_hash=` +
|
|
30
|
+
`${existingContentHash}; refusing to overwrite with content_hash=${incomingContentHash}`);
|
|
31
|
+
this.documentId = documentId;
|
|
32
|
+
this.existingContentHash = existingContentHash;
|
|
33
|
+
this.incomingContentHash = incomingContentHash;
|
|
34
|
+
this.name = 'UploadDocumentConflictError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Surfaced when Phase β2 or Phase γ's compare-and-set found 0 rows.
|
|
39
|
+
* Means our claim was lost — another worker reclaimed the row or it
|
|
40
|
+
* was concurrently deleted. Not exported because route handlers
|
|
41
|
+
* currently map any such error to a generic 500; promote to `export`
|
|
42
|
+
* when Phase 8.5 observability needs to discriminate it.
|
|
43
|
+
*/
|
|
44
|
+
export class UploadClaimLostError extends Error {
|
|
45
|
+
documentId;
|
|
46
|
+
claimId;
|
|
47
|
+
phase;
|
|
48
|
+
constructor(documentId, claimId, phase) {
|
|
49
|
+
super(`upload claim ${claimId} for document ${documentId} was lost between ` +
|
|
50
|
+
`phase α and phase ${phase} (concurrent reclaim or row deletion)`);
|
|
51
|
+
this.documentId = documentId;
|
|
52
|
+
this.claimId = claimId;
|
|
53
|
+
this.phase = phase;
|
|
54
|
+
this.name = 'UploadClaimLostError';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export async function loadActive(client, input) {
|
|
58
|
+
const document = await getRawDocumentById(client, input.userId, input.documentId);
|
|
59
|
+
if (!document)
|
|
60
|
+
throw new UploadDocumentNotFoundError(input.documentId);
|
|
61
|
+
return document;
|
|
62
|
+
}
|
|
63
|
+
export function sha256Hex(buf) {
|
|
64
|
+
return createHash('sha256').update(buf).digest('hex');
|
|
65
|
+
}
|
|
66
|
+
export function describeError(err) {
|
|
67
|
+
if (err instanceof Error)
|
|
68
|
+
return `${err.name}: ${err.message}`;
|
|
69
|
+
return String(err);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Build the adapter-relative key the blob is stored under. Includes
|
|
73
|
+
* the content hash so byte-identical re-uploads collide on the same
|
|
74
|
+
* key (no orphan from re-uploading the same content).
|
|
75
|
+
*
|
|
76
|
+
* `userPrefix` MUST be the HMAC-SHA256-derived per-user prefix from
|
|
77
|
+
* `deriveStorageKeyPrefix(secret, userId)`. The plaintext `userId`
|
|
78
|
+
* MUST NEVER appear in any provider key/URI — the HMAC prefix is
|
|
79
|
+
* the PII-safe replacement. Stable across retries (same user → same
|
|
80
|
+
* prefix) so the same-bytes re-upload idempotency contract holds.
|
|
81
|
+
*/
|
|
82
|
+
export function blobKey(prefix, userPrefix, documentId, contentHash) {
|
|
83
|
+
const head = prefix.length > 0 ? prefix.replace(/^\/+|\/+$/g, '') + '/' : '';
|
|
84
|
+
return `${head}s/${userPrefix}/documents/${documentId}/${contentHash}.bin`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Echo the row's existing state as the idempotent-skip response.
|
|
88
|
+
* Phase α returns this when `classifyIdempotent === 'returnExisting'`.
|
|
89
|
+
*/
|
|
90
|
+
export function idempotentResult(document, contentHash, sizeBytes) {
|
|
91
|
+
const status = document.rawStorageStatus;
|
|
92
|
+
return {
|
|
93
|
+
documentId: document.id,
|
|
94
|
+
storageProvider: document.storageProvider ?? '',
|
|
95
|
+
storageUri: document.storageUri ?? '',
|
|
96
|
+
contentHash,
|
|
97
|
+
sizeBytes,
|
|
98
|
+
rawStorageStatus: status,
|
|
99
|
+
storageMode: 'managed_blob',
|
|
100
|
+
rawStorageMetadata: document.rawStorageMetadata,
|
|
101
|
+
idempotentSkip: true,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
export function buildUploadResult(args) {
|
|
105
|
+
return {
|
|
106
|
+
documentId: args.documentId,
|
|
107
|
+
storageProvider: args.storageProvider,
|
|
108
|
+
storageUri: args.storageUri,
|
|
109
|
+
contentHash: args.contentHash,
|
|
110
|
+
sizeBytes: args.sizeBytes,
|
|
111
|
+
rawStorageStatus: args.finalStatus,
|
|
112
|
+
storageMode: 'managed_blob',
|
|
113
|
+
rawStorageMetadata: args.rawStorageMetadata,
|
|
114
|
+
idempotentSkip: args.idempotentSkip,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Build the `raw_storage_metadata` JSONB Phase β2 writes:
|
|
119
|
+
* - `codec`: the encoder's sidecar (name + version + AES-GCM internals).
|
|
120
|
+
* - spread of `stored.providerMetadata`: `{ filecoin: { ... } }` for
|
|
121
|
+
* Filecoin; `{}` for immediate providers.
|
|
122
|
+
* - `upload_result.stored_status`: INTERNAL sidecar Phase γ reads
|
|
123
|
+
* on the finalize-recovery path. Public formatters strip it.
|
|
124
|
+
*/
|
|
125
|
+
export function buildPhaseBeta2Metadata(stored) {
|
|
126
|
+
return {
|
|
127
|
+
codec: stored.codecMetadata,
|
|
128
|
+
...stored.providerMetadata,
|
|
129
|
+
upload_result: { stored_status: stored.status },
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Best-effort `raw_storage_failed` marker. Logs (does not swallow)
|
|
134
|
+
* the marker failure so the original upload error is the one the
|
|
135
|
+
* caller sees.
|
|
136
|
+
*/
|
|
137
|
+
export async function markRawStorageFailureBestEffort(q, userId, documentId, code, message) {
|
|
138
|
+
try {
|
|
139
|
+
await markRawStorageFailedByDocumentId({
|
|
140
|
+
q, userId, documentId,
|
|
141
|
+
lastError: buildLastError('raw_storage', code, message),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch (markerErr) {
|
|
145
|
+
console.error(`[upload-raw] failed to record raw_storage_failed marker for document ${documentId}: ` +
|
|
146
|
+
`${describeError(markerErr)} (original code=${code} message=${message})`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Honcho-style user-profile builder (Sprint 3 v1.5 — H2).
|
|
3
|
+
*
|
|
4
|
+
* After a user's ingest stores >= MIN_NEW_MEMORIES_FOR_REBUILD new
|
|
5
|
+
* facts, this builder fires (post-write, fire-and-forget) a single LLM
|
|
6
|
+
* call that synthesizes a ~200-word profile capturing the user's
|
|
7
|
+
* stated preferences, persistent instructions, and open commitments.
|
|
8
|
+
*
|
|
9
|
+
* Failure-closed: throws on JSON parse failure or empty profile.
|
|
10
|
+
* Caller wraps in try/catch to keep ingest latency unaffected.
|
|
11
|
+
*/
|
|
12
|
+
import type { LLMProvider } from './llm.js';
|
|
13
|
+
import type { MemoryServiceDeps } from './memory-service-types.js';
|
|
14
|
+
export interface UserProfile {
|
|
15
|
+
profile: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class UserProfileBuilderError extends Error {
|
|
18
|
+
readonly cause?: unknown | undefined;
|
|
19
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
20
|
+
}
|
|
21
|
+
export declare function synthesizeUserProfile(memoryContents: string[], llmClient?: LLMProvider): Promise<UserProfile>;
|
|
22
|
+
export declare function maybeRebuildProfileForUser(deps: MemoryServiceDeps, userId: string, newlyStoredMemoryIds: string[]): Promise<boolean>;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { llm as defaultLlm } from './llm.js';
|
|
2
|
+
import { extractFirstJsonObject } from './extraction.js';
|
|
3
|
+
const PROFILE_MAX_TOKENS = 768;
|
|
4
|
+
const PROFILE_TARGET_WORDS = 200;
|
|
5
|
+
const MIN_NEW_MEMORIES_FOR_REBUILD = 3;
|
|
6
|
+
const MAX_SOURCE_MEMORY_CHARS = 300;
|
|
7
|
+
const MAX_SOURCES_PER_BUILD = 40;
|
|
8
|
+
const MIN_PROFILE_WORD_COUNT = 20;
|
|
9
|
+
const MIN_REBUILD_INTERVAL_MS = 60_000; // 60 s — coalesces bursty ingest into one rebuild
|
|
10
|
+
const PROFILE_SYSTEM_PROMPT = [
|
|
11
|
+
'You synthesize a concise user profile from a list of stored memories.',
|
|
12
|
+
'',
|
|
13
|
+
'Rules:',
|
|
14
|
+
'- Capture the user’s explicit preferences, persistent instructions, and open commitments.',
|
|
15
|
+
'- Preserve specific facts (names, dates, decisions). Do not infer or speculate.',
|
|
16
|
+
'- Only state facts present in the numbered memories above. If a memory does not support a claim, do not include it.',
|
|
17
|
+
'- Write ~' + String(PROFILE_TARGET_WORDS) + ' words in three sections:',
|
|
18
|
+
' 1. Preferences: ...',
|
|
19
|
+
' 2. Instructions: ...',
|
|
20
|
+
' 3. Open commitments: ...',
|
|
21
|
+
'- Output JSON: {"profile": "<200-word document>"}.',
|
|
22
|
+
'- No markdown fences. No prose around the JSON.',
|
|
23
|
+
].join('\n');
|
|
24
|
+
export class UserProfileBuilderError extends Error {
|
|
25
|
+
cause;
|
|
26
|
+
constructor(message, cause) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.cause = cause;
|
|
29
|
+
this.name = 'UserProfileBuilderError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function buildProfileMessages(memoryContents) {
|
|
33
|
+
const truncated = memoryContents
|
|
34
|
+
.slice(0, MAX_SOURCES_PER_BUILD)
|
|
35
|
+
.map((c, i) => `[${i + 1}] ${c.trim().slice(0, MAX_SOURCE_MEMORY_CHARS)}`);
|
|
36
|
+
return [
|
|
37
|
+
{ role: 'system', content: PROFILE_SYSTEM_PROMPT },
|
|
38
|
+
{
|
|
39
|
+
role: 'user',
|
|
40
|
+
content: [
|
|
41
|
+
'MEMORIES:',
|
|
42
|
+
truncated.join('\n\n'),
|
|
43
|
+
'',
|
|
44
|
+
'Return JSON: {"profile": "<200-word profile>"}',
|
|
45
|
+
].join('\n'),
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
function parseProfileResponse(raw) {
|
|
50
|
+
if (!raw)
|
|
51
|
+
throw new UserProfileBuilderError('profile LLM returned empty content');
|
|
52
|
+
const cleaned = extractFirstJsonObject(raw);
|
|
53
|
+
let parsed;
|
|
54
|
+
try {
|
|
55
|
+
parsed = JSON.parse(cleaned);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
throw new UserProfileBuilderError(`profile LLM returned non-JSON: ${cleaned.slice(0, 200)}`, err);
|
|
59
|
+
}
|
|
60
|
+
const profile = typeof parsed.profile === 'string' ? parsed.profile.trim() : '';
|
|
61
|
+
if (!profile || profile.split(/\s+/).filter(Boolean).length < MIN_PROFILE_WORD_COUNT) {
|
|
62
|
+
throw new UserProfileBuilderError('profile too short or missing');
|
|
63
|
+
}
|
|
64
|
+
return { profile };
|
|
65
|
+
}
|
|
66
|
+
export async function synthesizeUserProfile(memoryContents, llmClient = defaultLlm) {
|
|
67
|
+
if (memoryContents.length === 0) {
|
|
68
|
+
throw new UserProfileBuilderError('cannot build profile from zero memories');
|
|
69
|
+
}
|
|
70
|
+
const messages = buildProfileMessages(memoryContents);
|
|
71
|
+
let raw;
|
|
72
|
+
try {
|
|
73
|
+
raw = await llmClient.chat(messages, {
|
|
74
|
+
temperature: 0,
|
|
75
|
+
jsonMode: true,
|
|
76
|
+
maxTokens: PROFILE_MAX_TOKENS,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
throw new UserProfileBuilderError(`profile LLM call failed: ${err.message}`, err);
|
|
81
|
+
}
|
|
82
|
+
return parseProfileResponse(raw);
|
|
83
|
+
}
|
|
84
|
+
export async function maybeRebuildProfileForUser(deps, userId, newlyStoredMemoryIds) {
|
|
85
|
+
if (!deps.config.userProfileChannelEnabled)
|
|
86
|
+
return false;
|
|
87
|
+
if (newlyStoredMemoryIds.length < MIN_NEW_MEMORIES_FOR_REBUILD)
|
|
88
|
+
return false;
|
|
89
|
+
const profileRepo = deps.stores.userProfile;
|
|
90
|
+
if (!profileRepo)
|
|
91
|
+
return false;
|
|
92
|
+
try {
|
|
93
|
+
const current = await profileRepo.getProfile(userId);
|
|
94
|
+
if (current && Date.now() - current.updated_at.getTime() < MIN_REBUILD_INTERVAL_MS) {
|
|
95
|
+
console.info(`[profile] rebuild debounced for user=${userId} (recent within ${MIN_REBUILD_INTERVAL_MS}ms)`);
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
const recent = await deps.stores.memory.listMemories(userId, MAX_SOURCES_PER_BUILD, 0);
|
|
99
|
+
if (recent.length === 0)
|
|
100
|
+
return false;
|
|
101
|
+
const { profile } = await synthesizeUserProfile(recent.map((m) => m.content));
|
|
102
|
+
await profileRepo.upsertProfile(userId, profile, recent.map((m) => m.id), current?.updated_at);
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
console.warn(`[profile] rebuild failed for user=${userId}: ${err.message}`);
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voyage AI embedding provider for isolated benchmark lanes.
|
|
3
|
+
*
|
|
4
|
+
* Voyage 4 models share an embedding space across the family, allowing
|
|
5
|
+
* document and query embeddings to use different compatible models while
|
|
6
|
+
* remaining searchable in the same pgvector index.
|
|
7
|
+
*/
|
|
8
|
+
import type { EmbeddingConfig, EmbeddingProvider, EmbeddingTask } from './embedding.js';
|
|
9
|
+
export declare const VOYAGE_API_BASE = "https://api.voyageai.com";
|
|
10
|
+
export declare class VoyageEmbedding implements EmbeddingProvider {
|
|
11
|
+
private readonly config;
|
|
12
|
+
private readonly apiKey;
|
|
13
|
+
private readonly documentModel;
|
|
14
|
+
private readonly queryModel;
|
|
15
|
+
private readonly dimensions;
|
|
16
|
+
constructor(config: EmbeddingConfig, apiKey: string, documentModel: string, queryModel: string, dimensions: number);
|
|
17
|
+
embed(text: string, task: EmbeddingTask): Promise<number[]>;
|
|
18
|
+
embedBatch(texts: string[], task: EmbeddingTask): Promise<number[][]>;
|
|
19
|
+
private modelFor;
|
|
20
|
+
private requestAndTrack;
|
|
21
|
+
private writeUsage;
|
|
22
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voyage AI embedding provider for isolated benchmark lanes.
|
|
3
|
+
*
|
|
4
|
+
* Voyage 4 models share an embedding space across the family, allowing
|
|
5
|
+
* document and query embeddings to use different compatible models while
|
|
6
|
+
* remaining searchable in the same pgvector index.
|
|
7
|
+
*/
|
|
8
|
+
import { estimateCostUsd, summarizeUsage, writeCostEvent, } from './cost-telemetry.js';
|
|
9
|
+
export const VOYAGE_API_BASE = 'https://api.voyageai.com';
|
|
10
|
+
export class VoyageEmbedding {
|
|
11
|
+
config;
|
|
12
|
+
apiKey;
|
|
13
|
+
documentModel;
|
|
14
|
+
queryModel;
|
|
15
|
+
dimensions;
|
|
16
|
+
constructor(config, apiKey, documentModel, queryModel, dimensions) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.apiKey = apiKey;
|
|
19
|
+
this.documentModel = documentModel;
|
|
20
|
+
this.queryModel = queryModel;
|
|
21
|
+
this.dimensions = dimensions;
|
|
22
|
+
}
|
|
23
|
+
async embed(text, task) {
|
|
24
|
+
const response = await this.requestAndTrack(text, task);
|
|
25
|
+
return response.data[0].embedding;
|
|
26
|
+
}
|
|
27
|
+
async embedBatch(texts, task) {
|
|
28
|
+
if (texts.length === 0)
|
|
29
|
+
return [];
|
|
30
|
+
const response = await this.requestAndTrack(texts, task);
|
|
31
|
+
return response.data
|
|
32
|
+
.sort((a, b) => a.index - b.index)
|
|
33
|
+
.map((d) => d.embedding);
|
|
34
|
+
}
|
|
35
|
+
modelFor(task) {
|
|
36
|
+
return task === 'query' ? this.queryModel : this.documentModel;
|
|
37
|
+
}
|
|
38
|
+
async requestAndTrack(input, task) {
|
|
39
|
+
const model = this.modelFor(task);
|
|
40
|
+
const started = performance.now();
|
|
41
|
+
const response = await fetch(`${VOYAGE_API_BASE}/v1/embeddings`, {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
headers: {
|
|
44
|
+
'Content-Type': 'application/json',
|
|
45
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
46
|
+
},
|
|
47
|
+
body: JSON.stringify({
|
|
48
|
+
input,
|
|
49
|
+
model,
|
|
50
|
+
input_type: task,
|
|
51
|
+
output_dimension: this.dimensions,
|
|
52
|
+
}),
|
|
53
|
+
signal: AbortSignal.timeout(300_000),
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
throw new Error(`Voyage embed failed (${response.status}): ${await response.text()}`);
|
|
57
|
+
}
|
|
58
|
+
const body = await response.json();
|
|
59
|
+
this.writeUsage(model, body.usage?.total_tokens ?? null, started);
|
|
60
|
+
return body;
|
|
61
|
+
}
|
|
62
|
+
writeUsage(model, totalTokens, started) {
|
|
63
|
+
const usage = summarizeUsage(totalTokens, null, totalTokens);
|
|
64
|
+
writeCostEvent({
|
|
65
|
+
stage: 'embedding',
|
|
66
|
+
provider: this.config.embeddingProvider,
|
|
67
|
+
model,
|
|
68
|
+
requestKind: 'embedding',
|
|
69
|
+
durationMs: performance.now() - started,
|
|
70
|
+
cacheHit: false,
|
|
71
|
+
inputTokens: usage.inputTokens ?? null,
|
|
72
|
+
outputTokens: usage.outputTokens ?? null,
|
|
73
|
+
totalTokens: usage.totalTokens ?? null,
|
|
74
|
+
estimatedCostUsd: estimateCostUsd(this.config.embeddingProvider, model, usage),
|
|
75
|
+
}, this.config);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared write-time security gate for memory ingest paths.
|
|
3
|
+
*
|
|
4
|
+
* Centralizes sanitization/trust enforcement so standard and hive ingest flows
|
|
5
|
+
* cannot diverge on whether unsafe content is allowed into storage.
|
|
6
|
+
*/
|
|
7
|
+
import type { LessonStore } from '../db/stores.js';
|
|
8
|
+
import { type TrustScore } from './trust-scoring.js';
|
|
9
|
+
export type WriteBlockReason = 'sanitization' | 'trust' | null;
|
|
10
|
+
export interface WriteSecurityDecision {
|
|
11
|
+
allowed: boolean;
|
|
12
|
+
blockedBy: WriteBlockReason;
|
|
13
|
+
trust: TrustScore;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Config subset consumed by assessWriteSecurity. Narrow `Pick<>` of
|
|
17
|
+
* IngestRuntimeConfig so callers only need to thread what the function
|
|
18
|
+
* actually reads.
|
|
19
|
+
*/
|
|
20
|
+
export interface WriteSecurityAssessConfig {
|
|
21
|
+
trustScoringEnabled: boolean;
|
|
22
|
+
trustScoreMinThreshold: number;
|
|
23
|
+
}
|
|
24
|
+
/** Config subset consumed by recordRejectedWrite. */
|
|
25
|
+
export interface WriteSecurityRecordConfig {
|
|
26
|
+
auditLoggingEnabled: boolean;
|
|
27
|
+
lessonsEnabled: boolean;
|
|
28
|
+
trustScoreMinThreshold: number;
|
|
29
|
+
}
|
|
30
|
+
export declare function assessWriteSecurity(content: string, sourceSite: string, config: WriteSecurityAssessConfig): WriteSecurityDecision;
|
|
31
|
+
export declare function recordRejectedWrite(userId: string, content: string, sourceSite: string, decision: WriteSecurityDecision, config: WriteSecurityRecordConfig, lessons?: LessonStore | null): Promise<void>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared write-time security gate for memory ingest paths.
|
|
3
|
+
*
|
|
4
|
+
* Centralizes sanitization/trust enforcement so standard and hive ingest flows
|
|
5
|
+
* cannot diverge on whether unsafe content is allowed into storage.
|
|
6
|
+
*/
|
|
7
|
+
import { emitAuditEvent } from './audit-events.js';
|
|
8
|
+
import { recordInjectionLesson, recordTrustViolationLesson } from './lesson-service.js';
|
|
9
|
+
import { computeTrustScore, meetsMinimumTrust } from './trust-scoring.js';
|
|
10
|
+
export function assessWriteSecurity(content, sourceSite, config) {
|
|
11
|
+
const trust = config.trustScoringEnabled
|
|
12
|
+
? computeTrustScore(content, sourceSite)
|
|
13
|
+
: PASS_THROUGH_TRUST;
|
|
14
|
+
if (!config.trustScoringEnabled) {
|
|
15
|
+
return { allowed: true, blockedBy: null, trust };
|
|
16
|
+
}
|
|
17
|
+
if (!trust.sanitization.passed) {
|
|
18
|
+
return { allowed: false, blockedBy: 'sanitization', trust };
|
|
19
|
+
}
|
|
20
|
+
if (!meetsMinimumTrust(trust, config.trustScoreMinThreshold)) {
|
|
21
|
+
return { allowed: false, blockedBy: 'trust', trust };
|
|
22
|
+
}
|
|
23
|
+
return { allowed: true, blockedBy: null, trust };
|
|
24
|
+
}
|
|
25
|
+
export async function recordRejectedWrite(userId, content, sourceSite, decision, config, lessons) {
|
|
26
|
+
if (config.auditLoggingEnabled && !decision.trust.sanitization.passed) {
|
|
27
|
+
emitAuditEvent('sanitization:block', userId, {
|
|
28
|
+
fact: content.slice(0, 200),
|
|
29
|
+
findings: decision.trust.sanitization.findings,
|
|
30
|
+
}, { sourceSite });
|
|
31
|
+
}
|
|
32
|
+
if (config.lessonsEnabled && lessons && !decision.trust.sanitization.passed) {
|
|
33
|
+
await recordInjectionLesson(lessons, {
|
|
34
|
+
userId,
|
|
35
|
+
content,
|
|
36
|
+
sourceSite,
|
|
37
|
+
sanitizationResult: decision.trust.sanitization,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (decision.blockedBy !== 'trust')
|
|
41
|
+
return;
|
|
42
|
+
if (config.auditLoggingEnabled) {
|
|
43
|
+
emitAuditEvent('trust:below-threshold', userId, {
|
|
44
|
+
fact: content.slice(0, 200),
|
|
45
|
+
trustScore: decision.trust.score,
|
|
46
|
+
threshold: config.trustScoreMinThreshold,
|
|
47
|
+
}, { sourceSite });
|
|
48
|
+
}
|
|
49
|
+
if (config.lessonsEnabled && lessons) {
|
|
50
|
+
await recordTrustViolationLesson(lessons, {
|
|
51
|
+
userId,
|
|
52
|
+
content,
|
|
53
|
+
sourceSite,
|
|
54
|
+
trustScore: decision.trust.score,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const PASS_THROUGH_TRUST = {
|
|
59
|
+
score: 1.0,
|
|
60
|
+
domainTrust: 1.0,
|
|
61
|
+
contentPenalty: 0,
|
|
62
|
+
injectionPenalty: 0,
|
|
63
|
+
sanitization: { passed: true, findings: [], highestSeverity: 'none' },
|
|
64
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Per-provider redaction for `storage_artifacts` wire responses.
|
|
3
|
+
*
|
|
4
|
+
* Explicit projection from the
|
|
5
|
+
* (potentially noisy) `provider_metadata` / `identifiers` columns to
|
|
6
|
+
* the closed set of fields each provider is allowed to surface on
|
|
7
|
+
* the wire. Project-then-validate: the formatter constructs the
|
|
8
|
+
* allowlisted object by named keys, and the `StoredArtifactResponseSchema`
|
|
9
|
+
* `.strict()` parse in the route layer is the final lock that drops
|
|
10
|
+
* any field the formatter accidentally let through.
|
|
11
|
+
*
|
|
12
|
+
* Scope: backends that v1 actually writes (`local_fs`, `s3`,
|
|
13
|
+
* `filecoin`). Filecoin direct managed uploads are 501 in v1 so the
|
|
14
|
+
* filecoin formatter mostly matters for pointer-mode artifacts that
|
|
15
|
+
* carry caller-supplied `identifiers` (e.g. an IPFS CID the caller
|
|
16
|
+
* already knows).
|
|
17
|
+
*/
|
|
18
|
+
/** Wire shape — discoverable identifiers only. Values are scalars. */
|
|
19
|
+
export type PublicArtifactIdentifiers = Record<string, string>;
|
|
20
|
+
/** Wire shape — provider-side public state. */
|
|
21
|
+
export type PublicArtifactProviderDetails = Record<string, unknown>;
|
|
22
|
+
/**
|
|
23
|
+
* Project a raw `(identifiers, providerDetails)` pair into the
|
|
24
|
+
* provider-specific public shape. Unknown providers contribute an
|
|
25
|
+
* empty object on both fields — the formatter never falls back to a
|
|
26
|
+
* passthrough.
|
|
27
|
+
*/
|
|
28
|
+
export declare function redactArtifactPublic(provider: string, raw: {
|
|
29
|
+
identifiers: Record<string, unknown>;
|
|
30
|
+
providerDetails: Record<string, unknown> | null;
|
|
31
|
+
}): {
|
|
32
|
+
identifiers: PublicArtifactIdentifiers;
|
|
33
|
+
providerDetails: PublicArtifactProviderDetails;
|
|
34
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Per-provider redaction for `storage_artifacts` wire responses.
|
|
3
|
+
*
|
|
4
|
+
* Explicit projection from the
|
|
5
|
+
* (potentially noisy) `provider_metadata` / `identifiers` columns to
|
|
6
|
+
* the closed set of fields each provider is allowed to surface on
|
|
7
|
+
* the wire. Project-then-validate: the formatter constructs the
|
|
8
|
+
* allowlisted object by named keys, and the `StoredArtifactResponseSchema`
|
|
9
|
+
* `.strict()` parse in the route layer is the final lock that drops
|
|
10
|
+
* any field the formatter accidentally let through.
|
|
11
|
+
*
|
|
12
|
+
* Scope: backends that v1 actually writes (`local_fs`, `s3`,
|
|
13
|
+
* `filecoin`). Filecoin direct managed uploads are 501 in v1 so the
|
|
14
|
+
* filecoin formatter mostly matters for pointer-mode artifacts that
|
|
15
|
+
* carry caller-supplied `identifiers` (e.g. an IPFS CID the caller
|
|
16
|
+
* already knows).
|
|
17
|
+
*/
|
|
18
|
+
/** Closed allowlists, one per known provider. */
|
|
19
|
+
const LOCAL_FS_IDENTIFIER_KEYS = ['etag'];
|
|
20
|
+
const LOCAL_FS_PROVIDER_DETAIL_KEYS = [];
|
|
21
|
+
const S3_IDENTIFIER_KEYS = ['etag', 'versionId'];
|
|
22
|
+
const S3_PROVIDER_DETAIL_KEYS = ['bucket', 'region'];
|
|
23
|
+
const FILECOIN_IDENTIFIER_KEYS = ['ipfsCid', 'pieceCid', 'carRootCid', 'dataSetId'];
|
|
24
|
+
/**
|
|
25
|
+
* Filecoin currently has NO public `provider_details`. Keeping this
|
|
26
|
+
* empty prevents the wire from carrying provider fields the storage
|
|
27
|
+
* backend has not explicitly projected.
|
|
28
|
+
*/
|
|
29
|
+
const FILECOIN_PROVIDER_DETAIL_KEYS = [];
|
|
30
|
+
/**
|
|
31
|
+
* Project a raw `(identifiers, providerDetails)` pair into the
|
|
32
|
+
* provider-specific public shape. Unknown providers contribute an
|
|
33
|
+
* empty object on both fields — the formatter never falls back to a
|
|
34
|
+
* passthrough.
|
|
35
|
+
*/
|
|
36
|
+
export function redactArtifactPublic(provider, raw) {
|
|
37
|
+
const idKeys = identifierKeysFor(provider);
|
|
38
|
+
const detailKeys = providerDetailKeysFor(provider);
|
|
39
|
+
return {
|
|
40
|
+
identifiers: pickStringKeys(raw.identifiers, idKeys),
|
|
41
|
+
providerDetails: pickScalarKeys(raw.providerDetails ?? {}, detailKeys),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function identifierKeysFor(provider) {
|
|
45
|
+
if (provider === 'local_fs')
|
|
46
|
+
return LOCAL_FS_IDENTIFIER_KEYS;
|
|
47
|
+
if (provider === 's3')
|
|
48
|
+
return S3_IDENTIFIER_KEYS;
|
|
49
|
+
if (provider === 'filecoin')
|
|
50
|
+
return FILECOIN_IDENTIFIER_KEYS;
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
function providerDetailKeysFor(provider) {
|
|
54
|
+
if (provider === 'local_fs')
|
|
55
|
+
return LOCAL_FS_PROVIDER_DETAIL_KEYS;
|
|
56
|
+
if (provider === 's3')
|
|
57
|
+
return S3_PROVIDER_DETAIL_KEYS;
|
|
58
|
+
if (provider === 'filecoin')
|
|
59
|
+
return FILECOIN_PROVIDER_DETAIL_KEYS;
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
function pickStringKeys(source, keys) {
|
|
63
|
+
const out = {};
|
|
64
|
+
for (const key of keys) {
|
|
65
|
+
const value = source[key];
|
|
66
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
67
|
+
out[key] = value;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
function pickScalarKeys(source, keys) {
|
|
73
|
+
const out = {};
|
|
74
|
+
for (const key of keys) {
|
|
75
|
+
const value = source[key];
|
|
76
|
+
if (value === undefined || value === null)
|
|
77
|
+
continue;
|
|
78
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
79
|
+
out[key] = value;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|