@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,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase β2 orphan-bytes compensation + raw-document failure-marker
|
|
3
|
+
* helpers for the managed-blob upload pipeline.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from `document-upload.ts` so the orchestration module
|
|
6
|
+
* stays under the workspace 400-non-comment-LOC cap. The two
|
|
7
|
+
* exported helpers cover the post-`store.put` failure window:
|
|
8
|
+
*
|
|
9
|
+
* - `compensateOrphanedBlob` runs a best-effort `store.delete`
|
|
10
|
+
* for bytes that were durably written but never linked
|
|
11
|
+
* (e.g. the prior artifact entered a delete lifecycle between
|
|
12
|
+
* our claim and the swap, so `ArtifactNotLinkableError` fires).
|
|
13
|
+
* - `markBeta2FailureOnDocument` flips the raw_document to
|
|
14
|
+
* `raw_storage_failed` with a typed envelope so the public
|
|
15
|
+
* status surfaces stop saying "upload in progress" for a doc
|
|
16
|
+
* whose upload actually failed. When cleanup also failed the
|
|
17
|
+
* envelope carries `internal_recovery_hint` so a reconciler /
|
|
18
|
+
* ops can find the abandoned bytes. The wire formatter
|
|
19
|
+
* (`document-response-formatters.ts`) strips `internal_*`
|
|
20
|
+
* keys before exposing `last_error` on the public response.
|
|
21
|
+
*/
|
|
22
|
+
import { failClaimedUploadWithClient } from '../db/raw-document-blob-repository.js';
|
|
23
|
+
import { describeError } from './upload-helpers.js';
|
|
24
|
+
/**
|
|
25
|
+
* Best-effort `store.delete` for the orphan-bytes window between
|
|
26
|
+
* `store.put` returning and `recordUploadResultAndSwapArtifact`
|
|
27
|
+
* committing the artifact swap. Returns whether cleanup succeeded
|
|
28
|
+
* (the caller uses this to decide whether to embed the orphan
|
|
29
|
+
* URI/provider in the raw_document's recovery-hint envelope).
|
|
30
|
+
*
|
|
31
|
+
* A cleanup failure is also logged with the originating error so
|
|
32
|
+
* a `grep '[STORAGE]'` operator can correlate.
|
|
33
|
+
*/
|
|
34
|
+
export async function compensateOrphanedBlob(store, storageUri, documentId, cause) {
|
|
35
|
+
try {
|
|
36
|
+
await store.delete(storageUri);
|
|
37
|
+
return { cleanupSucceeded: true };
|
|
38
|
+
}
|
|
39
|
+
catch (cleanupErr) {
|
|
40
|
+
const cleanupErrorMessage = describeError(cleanupErr);
|
|
41
|
+
// eslint-disable-next-line no-console
|
|
42
|
+
console.error(`runPhaseBeta2: failed to compensate orphan blob ` +
|
|
43
|
+
`(documentId=${documentId}, storageUri=${storageUri}) after ` +
|
|
44
|
+
`${describeError(cause)}; cleanup error: ${cleanupErrorMessage}`);
|
|
45
|
+
return { cleanupSucceeded: false, cleanupError: cleanupErrorMessage };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Mark the doc `raw_storage_failed` with the `artifact_not_linkable`
|
|
50
|
+
* envelope (or generic `beta2_swap_failed` for other throws).
|
|
51
|
+
*
|
|
52
|
+
* Uses the raw-document-only `failClaimedUploadWithClient` — NOT
|
|
53
|
+
* the paired `failClaimedUploadAndSyncArtifact`. Syncing here
|
|
54
|
+
* would clobber the prior artifact's state, which is already in
|
|
55
|
+
* its OWN delete lifecycle and owned by the caller that's
|
|
56
|
+
* tombstoning it.
|
|
57
|
+
*
|
|
58
|
+
* CAS-guarded by `claim_id`: a no-op when the claim was lost,
|
|
59
|
+
* which prevents a stale marker from overwriting a fresh
|
|
60
|
+
* worker's state.
|
|
61
|
+
*
|
|
62
|
+
* Orphan recovery hint: when cleanup failed the envelope carries
|
|
63
|
+
* `internal_recovery_hint: { storage_uri, storage_provider, cleanup_error }`
|
|
64
|
+
* so a reconciler / ops can find the abandoned bytes.
|
|
65
|
+
*/
|
|
66
|
+
export async function markBeta2FailureOnDocument(args) {
|
|
67
|
+
const envelope = {
|
|
68
|
+
layer: 'raw_storage',
|
|
69
|
+
code: args.reasonCode,
|
|
70
|
+
message: args.reasonMessage,
|
|
71
|
+
occurred_at: new Date().toISOString(),
|
|
72
|
+
};
|
|
73
|
+
if (!args.compensation.cleanupSucceeded) {
|
|
74
|
+
envelope.internal_recovery_hint = {
|
|
75
|
+
storage_uri: args.stored.storageUri,
|
|
76
|
+
storage_provider: args.stored.storageProvider,
|
|
77
|
+
cleanup_error: args.compensation.cleanupError,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
await failClaimedUploadWithClient(args.pool, {
|
|
82
|
+
userId: args.document.userId,
|
|
83
|
+
documentId: args.document.id,
|
|
84
|
+
claimId: args.claimId,
|
|
85
|
+
lastError: envelope,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (markerErr) {
|
|
89
|
+
// eslint-disable-next-line no-console
|
|
90
|
+
console.error(`runPhaseBeta2: failed to mark raw_storage_failed for ` +
|
|
91
|
+
`document ${args.document.id} (claim ${args.claimId}); ` +
|
|
92
|
+
`marker error: ${describeError(markerErr)}; original reason: ${args.reasonMessage}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Managed-blob upload pipeline for the document registry (the managed-upload
|
|
3
|
+
* α/β/β2/γ split).
|
|
4
|
+
*
|
|
5
|
+
* Atomicity model: the slow `store.put()` no longer runs inside a DB
|
|
6
|
+
* transaction. Instead the pipeline is split into four phases:
|
|
7
|
+
*
|
|
8
|
+
* - the claim step (short tx, advisory-locked): load the row, run
|
|
9
|
+
* `classifyIdempotent` against the incoming hash, either short-
|
|
10
|
+
* circuit (returnExisting) or claim the slot. The claim writes
|
|
11
|
+
* `raw_storage_status='blob_uploading'` + `raw_storage_claim_id`
|
|
12
|
+
* + plaintext `content_hash`/`size_bytes`. COMMIT, release lock.
|
|
13
|
+
* - the provider-write step (no DB locks): `codec.encode()` + `store.put()`. On
|
|
14
|
+
* throw, mark row `raw_storage_failed` via the per-claim guard.
|
|
15
|
+
* - the durable URI-write step (short tx): record `storage_uri`/`storage_provider`/
|
|
16
|
+
* `raw_storage_metadata` durably; status STAYS `blob_uploading`.
|
|
17
|
+
* Guarded by claim_id; 0-row means another worker reclaimed —
|
|
18
|
+
* compensate with `store.delete()`.
|
|
19
|
+
* - the finalization step (short tx): compare-and-set status flip to the final
|
|
20
|
+
* terminal state via `deriveFinalRawStorageStatus`. Clears claim;
|
|
21
|
+
* stamps `pending_since` for the observability metric.
|
|
22
|
+
*
|
|
23
|
+
* Same-bytes crash recovery (rev-10 / rev-11):
|
|
24
|
+
* - blob_uploading WITHOUT URI → reclaimAndUpload (re-run β/β2/γ).
|
|
25
|
+
* - blob_uploading WITH URI → finalize (skip β + β2; γ alone).
|
|
26
|
+
*
|
|
27
|
+
* Plaintext source of truth: `content_hash` and `size_bytes` written
|
|
28
|
+
* to the row are the PLAINTEXT hash + length; the encoded-byte hash +
|
|
29
|
+
* encoded size live only under `raw_storage_metadata.codec.*` for ops
|
|
30
|
+
* diagnostics (rev-2 §5).
|
|
31
|
+
*/
|
|
32
|
+
import pg from 'pg';
|
|
33
|
+
import type { UploadConfig } from './upload-config.js';
|
|
34
|
+
import type { RawContentStore } from '../storage/raw-content-store.js';
|
|
35
|
+
import type { RawContentCodec } from '../storage/raw-content-codec.js';
|
|
36
|
+
import { type UploadRawInput, type UploadRawResult } from './upload-helpers.js';
|
|
37
|
+
export { ManagedStorageDisabledError, UploadDocumentConflictError, UploadDocumentNotFoundError, type UploadRawInput, type UploadRawResult, } from './upload-helpers.js';
|
|
38
|
+
/**
|
|
39
|
+
* Run the full the managed-upload α/β/β2/γ upload path. Idempotent on
|
|
40
|
+
* byte-identical input. Crash-recoverable: a process death between
|
|
41
|
+
* any two phases is resumable by a same-bytes retry — the claim step's
|
|
42
|
+
* classifyIdempotent decision table picks the right branch.
|
|
43
|
+
*/
|
|
44
|
+
export declare function uploadRawDocument(pool: pg.Pool, store: RawContentStore | null, codec: RawContentCodec, cfg: UploadConfig, input: UploadRawInput): Promise<UploadRawResult>;
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Managed-blob upload pipeline for the document registry (the managed-upload
|
|
3
|
+
* α/β/β2/γ split).
|
|
4
|
+
*
|
|
5
|
+
* Atomicity model: the slow `store.put()` no longer runs inside a DB
|
|
6
|
+
* transaction. Instead the pipeline is split into four phases:
|
|
7
|
+
*
|
|
8
|
+
* - the claim step (short tx, advisory-locked): load the row, run
|
|
9
|
+
* `classifyIdempotent` against the incoming hash, either short-
|
|
10
|
+
* circuit (returnExisting) or claim the slot. The claim writes
|
|
11
|
+
* `raw_storage_status='blob_uploading'` + `raw_storage_claim_id`
|
|
12
|
+
* + plaintext `content_hash`/`size_bytes`. COMMIT, release lock.
|
|
13
|
+
* - the provider-write step (no DB locks): `codec.encode()` + `store.put()`. On
|
|
14
|
+
* throw, mark row `raw_storage_failed` via the per-claim guard.
|
|
15
|
+
* - the durable URI-write step (short tx): record `storage_uri`/`storage_provider`/
|
|
16
|
+
* `raw_storage_metadata` durably; status STAYS `blob_uploading`.
|
|
17
|
+
* Guarded by claim_id; 0-row means another worker reclaimed —
|
|
18
|
+
* compensate with `store.delete()`.
|
|
19
|
+
* - the finalization step (short tx): compare-and-set status flip to the final
|
|
20
|
+
* terminal state via `deriveFinalRawStorageStatus`. Clears claim;
|
|
21
|
+
* stamps `pending_since` for the observability metric.
|
|
22
|
+
*
|
|
23
|
+
* Same-bytes crash recovery (rev-10 / rev-11):
|
|
24
|
+
* - blob_uploading WITHOUT URI → reclaimAndUpload (re-run β/β2/γ).
|
|
25
|
+
* - blob_uploading WITH URI → finalize (skip β + β2; γ alone).
|
|
26
|
+
*
|
|
27
|
+
* Plaintext source of truth: `content_hash` and `size_bytes` written
|
|
28
|
+
* to the row are the PLAINTEXT hash + length; the encoded-byte hash +
|
|
29
|
+
* encoded size live only under `raw_storage_metadata.codec.*` for ops
|
|
30
|
+
* diagnostics (rev-2 §5).
|
|
31
|
+
*/
|
|
32
|
+
import { randomUUID } from 'node:crypto';
|
|
33
|
+
import { claimUploadSlotWithClient } from '../db/raw-document-blob-repository.js';
|
|
34
|
+
import { ArtifactNotLinkableError } from '../db/storage-artifact-repository.js';
|
|
35
|
+
import { deriveStorageKeyPrefix } from './storage-key-prefix.js';
|
|
36
|
+
import { failClaimedUploadAndSyncArtifact, finalizeUploadAndSyncArtifact, recordUploadResultAndSwapArtifact, } from './document-upload-artifact-sync.js';
|
|
37
|
+
import { compensateOrphanedBlob, markBeta2FailureOnDocument, } from './document-upload-beta2-recovery.js';
|
|
38
|
+
import { buildLastError } from '../db/raw-document-status-repository.js';
|
|
39
|
+
import { classifyIdempotent, deriveFinalRawStorageStatus, readPersistedStoredStatus, } from './upload-decision.js';
|
|
40
|
+
import { blobKey, buildPhaseBeta2Metadata, buildUploadResult, describeError, idempotentResult, loadActive, ManagedStorageDisabledError, markRawStorageFailureBestEffort, sha256Hex, UploadClaimLostError, UploadDocumentConflictError, UploadDocumentNotFoundError, } from './upload-helpers.js';
|
|
41
|
+
import { emitFilecoinEvent, sanitizeErrorMessage, } from './filecoin-observability.js';
|
|
42
|
+
export { ManagedStorageDisabledError, UploadDocumentConflictError, UploadDocumentNotFoundError, } from './upload-helpers.js';
|
|
43
|
+
/**
|
|
44
|
+
* Run the full the managed-upload α/β/β2/γ upload path. Idempotent on
|
|
45
|
+
* byte-identical input. Crash-recoverable: a process death between
|
|
46
|
+
* any two phases is resumable by a same-bytes retry — the claim step's
|
|
47
|
+
* classifyIdempotent decision table picks the right branch.
|
|
48
|
+
*/
|
|
49
|
+
export async function uploadRawDocument(pool, store, codec, cfg, input) {
|
|
50
|
+
if (cfg.rawStorageMode !== 'managed_blob' || !store) {
|
|
51
|
+
await markRawStorageFailureBestEffort(pool, input.userId, input.documentId, 'managed_storage_disabled', 'managed_blob storage is not enabled for this deployment');
|
|
52
|
+
throw new ManagedStorageDisabledError();
|
|
53
|
+
}
|
|
54
|
+
const contentHash = sha256Hex(input.body);
|
|
55
|
+
const sizeBytes = input.body.length;
|
|
56
|
+
// upload-observability — drives `upload_latency_seconds` aggregation. The
|
|
57
|
+
// event taxonomy is `filecoin.upload.*` so we only emit when the
|
|
58
|
+
// active adapter is Filecoin storage. local_fs / s3 uploads
|
|
59
|
+
// produce no `[FILECOIN]` events.
|
|
60
|
+
const isFilecoin = store.provider === 'filecoin';
|
|
61
|
+
const startedAt = Date.now();
|
|
62
|
+
if (isFilecoin) {
|
|
63
|
+
emitFilecoinEvent('filecoin.upload.started', {
|
|
64
|
+
documentId: input.documentId,
|
|
65
|
+
userId: input.userId,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return runUploadPhases(pool, store, codec, cfg, contentHash, sizeBytes, input, {
|
|
69
|
+
startedAt, isFilecoin,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async function runUploadPhases(pool, store, codec, cfg, contentHash, sizeBytes, input, obs) {
|
|
73
|
+
try {
|
|
74
|
+
const alpha = await runPhaseAlpha(pool, contentHash, sizeBytes, input);
|
|
75
|
+
const result = alpha.kind === 'returnExisting'
|
|
76
|
+
? alpha.result
|
|
77
|
+
: alpha.kind === 'finalize'
|
|
78
|
+
? await runPhaseGammaOnly(pool, alpha, input)
|
|
79
|
+
: await runPhaseBetaThroughGamma(pool, store, codec, cfg, alpha, input);
|
|
80
|
+
if (obs.isFilecoin) {
|
|
81
|
+
emitFilecoinEvent('filecoin.upload.accepted', {
|
|
82
|
+
documentId: input.documentId,
|
|
83
|
+
userId: input.userId,
|
|
84
|
+
provider: result.storageProvider ?? undefined,
|
|
85
|
+
statusAfter: result.rawStorageStatus,
|
|
86
|
+
durationMs: Date.now() - obs.startedAt,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (obs.isFilecoin) {
|
|
93
|
+
emitFilecoinEvent('filecoin.upload.failed', {
|
|
94
|
+
documentId: input.documentId,
|
|
95
|
+
userId: input.userId,
|
|
96
|
+
errorCode: extractUploadErrorCode(err),
|
|
97
|
+
errorMessage: sanitizeErrorMessage(err),
|
|
98
|
+
durationMs: Date.now() - obs.startedAt,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
throw err;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function extractUploadErrorCode(err) {
|
|
105
|
+
if (err instanceof Error) {
|
|
106
|
+
const candidate = err.code;
|
|
107
|
+
if (typeof candidate === 'string')
|
|
108
|
+
return candidate;
|
|
109
|
+
if (err.name === 'UploadDocumentConflictError')
|
|
110
|
+
return 'document_conflict';
|
|
111
|
+
if (err.name === 'UploadDocumentNotFoundError')
|
|
112
|
+
return 'document_not_found';
|
|
113
|
+
if (err.name === 'UploadClaimLostError')
|
|
114
|
+
return 'upload_claim_lost';
|
|
115
|
+
if (err.name === 'ManagedStorageDisabledError')
|
|
116
|
+
return 'managed_storage_disabled';
|
|
117
|
+
}
|
|
118
|
+
return 'unknown';
|
|
119
|
+
}
|
|
120
|
+
async function runPhaseAlpha(pool, contentHash, sizeBytes, input) {
|
|
121
|
+
const client = await pool.connect();
|
|
122
|
+
try {
|
|
123
|
+
await client.query('BEGIN');
|
|
124
|
+
await client.query('SELECT pg_advisory_xact_lock(hashtext($1))', [input.documentId]);
|
|
125
|
+
const document = await loadActive(client, input);
|
|
126
|
+
const decision = classifyIdempotent(document, contentHash);
|
|
127
|
+
const earlyReturn = checkPhaseAlphaEarlyExit(document, contentHash, sizeBytes, decision);
|
|
128
|
+
if (earlyReturn) {
|
|
129
|
+
await client.query('COMMIT');
|
|
130
|
+
if (earlyReturn.kind === 'throw')
|
|
131
|
+
throw earlyReturn.err;
|
|
132
|
+
return earlyReturn.result;
|
|
133
|
+
}
|
|
134
|
+
return await commitPhaseAlphaClaim(client, document, contentHash, sizeBytes, decision, input);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
138
|
+
throw err;
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
client.release();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function checkPhaseAlphaEarlyExit(document, contentHash, sizeBytes, decision) {
|
|
145
|
+
if (decision?.kind === 'returnExisting') {
|
|
146
|
+
return {
|
|
147
|
+
kind: 'return',
|
|
148
|
+
result: { kind: 'returnExisting', result: idempotentResult(document, contentHash, sizeBytes) },
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
if (decision === null && hasConflictingManagedBlob(document, contentHash)) {
|
|
152
|
+
return {
|
|
153
|
+
kind: 'throw',
|
|
154
|
+
err: new UploadDocumentConflictError(document.id, document.contentHash ?? '', contentHash),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
async function commitPhaseAlphaClaim(client, document, contentHash, sizeBytes, decision, input) {
|
|
160
|
+
// `checkPhaseAlphaEarlyExit` already handled returnExisting +
|
|
161
|
+
// conflict; what reaches us is reclaimAndUpload / finalize / null.
|
|
162
|
+
const branch = decision?.kind === 'finalize' ? 'finalize' : 'reclaimAndUpload';
|
|
163
|
+
// Finalize preserves the durable URI (the bytes are already on the
|
|
164
|
+
// provider); reclaim/fresh clear it so a crash before the durable URI-write step can't
|
|
165
|
+
// strand the row in a finalize-recovery window pointing at stale
|
|
166
|
+
// bytes (rev-fix HIGH 2).
|
|
167
|
+
const claimId = randomUUID();
|
|
168
|
+
const claimed = await claimUploadSlotWithClient(client, {
|
|
169
|
+
userId: input.userId, documentId: input.documentId, claimId, contentHash, sizeBytes,
|
|
170
|
+
clearDurableUri: branch === 'reclaimAndUpload',
|
|
171
|
+
});
|
|
172
|
+
if (claimed === 0) {
|
|
173
|
+
await client.query('COMMIT');
|
|
174
|
+
throw new UploadDocumentNotFoundError(input.documentId);
|
|
175
|
+
}
|
|
176
|
+
await client.query('COMMIT');
|
|
177
|
+
return { kind: branch, claimId, document, contentHash, sizeBytes };
|
|
178
|
+
}
|
|
179
|
+
async function runPhaseBetaThroughGamma(pool, store, codec, cfg, alpha, input) {
|
|
180
|
+
const stored = await runPhaseBeta(pool, store, codec, cfg, alpha, input);
|
|
181
|
+
await runPhaseBeta2(pool, store, alpha, stored);
|
|
182
|
+
return runPhaseGammaFromStored(pool, alpha, stored, input);
|
|
183
|
+
}
|
|
184
|
+
async function runPhaseBeta(pool, store, codec, cfg, alpha, input) {
|
|
185
|
+
try {
|
|
186
|
+
const encoded = await codec.encode({ body: input.body });
|
|
187
|
+
const userPrefix = deriveStorageKeyPrefix(cfg.storageKeyHmacSecret, input.userId);
|
|
188
|
+
const stored = await store.put({
|
|
189
|
+
key: blobKey(cfg.rawStoragePrefix, userPrefix, input.documentId, alpha.contentHash),
|
|
190
|
+
body: encoded.body,
|
|
191
|
+
contentType: input.contentType,
|
|
192
|
+
});
|
|
193
|
+
return { ...stored, codecMetadata: encoded.metadata };
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
const lastError = buildLastError('raw_storage', 'transport_error', describeError(err));
|
|
197
|
+
// the paired artifact-sync implementation paired the provider-write step failure: flip raw_storage_status AND
|
|
198
|
+
// sync the linked artifact to 'failed' in one transaction so
|
|
199
|
+
// the two rows never diverge across a failed store.put().
|
|
200
|
+
//
|
|
201
|
+
// Marker failures used to swallow the inner error silently; we
|
|
202
|
+
// now log with context so a follow-up worker can see that the
|
|
203
|
+
// claim cleanup itself failed (the outer throw still wins so
|
|
204
|
+
// the upload pipeline surfaces the original store.put error).
|
|
205
|
+
try {
|
|
206
|
+
await failClaimedUploadAndSyncArtifact(pool, {
|
|
207
|
+
userId: input.userId,
|
|
208
|
+
documentId: input.documentId,
|
|
209
|
+
claimId: alpha.claimId,
|
|
210
|
+
lastError,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
catch (markerErr) {
|
|
214
|
+
// eslint-disable-next-line no-console
|
|
215
|
+
console.error(`runPhaseBeta: failed to mark raw_storage_failed + sync artifact for ` +
|
|
216
|
+
`document ${input.documentId} after store.put error: ${describeError(markerErr)}`);
|
|
217
|
+
}
|
|
218
|
+
throw err;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async function runPhaseBeta2(pool, store, alpha, stored) {
|
|
222
|
+
const metadata = buildPhaseBeta2Metadata(stored);
|
|
223
|
+
// the paired artifact-sync implementation paired the durable URI-write step: URI write + artifact swap commit
|
|
224
|
+
// together. Two failure modes after `store.put` has durably
|
|
225
|
+
// written bytes:
|
|
226
|
+
//
|
|
227
|
+
// 1. `rowCount === 0` — the upload claim was lost (another
|
|
228
|
+
// worker reclaimed the row). The artifact swap helper
|
|
229
|
+
// rolled back; we compensate by deleting the bytes we
|
|
230
|
+
// wrote and throw `UploadClaimLostError`. The raw_document
|
|
231
|
+
// is now owned by the new worker so we DO NOT write to its
|
|
232
|
+
// `last_error`.
|
|
233
|
+
// 2. The swap helper THROWS (e.g. `ArtifactNotLinkableError`
|
|
234
|
+
// when the prior artifact entered a delete lifecycle
|
|
235
|
+
// between our claim and the swap). Without explicit
|
|
236
|
+
// compensation the bytes would orphan. We catch every
|
|
237
|
+
// throw, attempt provider cleanup, AND flip the doc's
|
|
238
|
+
// `raw_storage_status` to `raw_storage_failed` with a
|
|
239
|
+
// typed `artifact_not_linkable` envelope so the public
|
|
240
|
+
// status surfaces stop saying "upload in progress" for a
|
|
241
|
+
// doc whose upload actually failed.
|
|
242
|
+
//
|
|
243
|
+
// The cleanup `store.delete` call is best-effort. When it fails
|
|
244
|
+
// the orphan URI + provider are embedded in the raw_document's
|
|
245
|
+
// `last_error.internal_recovery_hint` (wire-stripped by the
|
|
246
|
+
// response formatter) so a reconciler / ops can find the
|
|
247
|
+
// abandoned bytes later.
|
|
248
|
+
let result;
|
|
249
|
+
try {
|
|
250
|
+
result = await recordUploadResultAndSwapArtifact(pool, {
|
|
251
|
+
userId: alpha.document.userId,
|
|
252
|
+
documentId: alpha.document.id,
|
|
253
|
+
claimId: alpha.claimId,
|
|
254
|
+
storageUri: stored.storageUri,
|
|
255
|
+
storageProvider: stored.storageProvider,
|
|
256
|
+
rawStorageMetadata: metadata,
|
|
257
|
+
document: alpha.document,
|
|
258
|
+
contentHash: alpha.contentHash,
|
|
259
|
+
stored,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
const compensation = await compensateOrphanedBlob(store, stored.storageUri, alpha.document.id, err);
|
|
264
|
+
await markBeta2FailureOnDocument({
|
|
265
|
+
pool, document: alpha.document, claimId: alpha.claimId, stored,
|
|
266
|
+
reasonCode: err instanceof ArtifactNotLinkableError ? 'artifact_not_linkable' : 'beta2_swap_failed',
|
|
267
|
+
reasonMessage: describeError(err),
|
|
268
|
+
compensation,
|
|
269
|
+
});
|
|
270
|
+
throw err;
|
|
271
|
+
}
|
|
272
|
+
if (result.rowCount === 0) {
|
|
273
|
+
// Lost-claim path: another worker now owns the row's lifecycle.
|
|
274
|
+
// Compensate the orphan bytes if we can, but DO NOT write to
|
|
275
|
+
// the row's `last_error` — that belongs to the new claim. The
|
|
276
|
+
// structured log event below carries the orphan info when
|
|
277
|
+
// cleanup fails (best we can do without clobbering the new
|
|
278
|
+
// claim's state).
|
|
279
|
+
await compensateOrphanedBlob(store, stored.storageUri, alpha.document.id, new UploadClaimLostError(alpha.document.id, alpha.claimId, 'beta2'));
|
|
280
|
+
throw new UploadClaimLostError(alpha.document.id, alpha.claimId, 'beta2');
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
async function runPhaseGammaFromStored(pool, alpha, stored, input) {
|
|
284
|
+
const finalStatus = deriveFinalRawStorageStatus({
|
|
285
|
+
storedStatus: stored.status,
|
|
286
|
+
storageProvider: stored.storageProvider,
|
|
287
|
+
});
|
|
288
|
+
const rowCount = await finalizeUploadAndSyncArtifact(pool, {
|
|
289
|
+
userId: input.userId, documentId: input.documentId,
|
|
290
|
+
claimId: alpha.claimId, finalStatus,
|
|
291
|
+
});
|
|
292
|
+
if (rowCount === 0) {
|
|
293
|
+
throw new UploadClaimLostError(input.documentId, alpha.claimId, 'gamma');
|
|
294
|
+
}
|
|
295
|
+
return buildUploadResult({
|
|
296
|
+
documentId: alpha.document.id,
|
|
297
|
+
storageProvider: stored.storageProvider,
|
|
298
|
+
storageUri: stored.storageUri,
|
|
299
|
+
contentHash: alpha.contentHash,
|
|
300
|
+
sizeBytes: alpha.sizeBytes,
|
|
301
|
+
finalStatus,
|
|
302
|
+
rawStorageMetadata: buildPhaseBeta2Metadata(stored),
|
|
303
|
+
idempotentSkip: false,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
async function runPhaseGammaOnly(pool, alpha, input) {
|
|
307
|
+
const storedStatus = readPersistedStoredStatus(alpha.document.rawStorageMetadata);
|
|
308
|
+
if (storedStatus === null) {
|
|
309
|
+
throw new Error(`the finalization step finalize-recovery: row ${input.documentId} has blob_uploading + storage_uri but ` +
|
|
310
|
+
'no raw_storage_metadata.upload_result.stored_status sidecar (the durable URI-write step incomplete?)');
|
|
311
|
+
}
|
|
312
|
+
const storageProvider = alpha.document.storageProvider;
|
|
313
|
+
if (!storageProvider) {
|
|
314
|
+
throw new Error(`the finalization step finalize-recovery: row ${input.documentId} has no storage_provider despite a durable URI`);
|
|
315
|
+
}
|
|
316
|
+
const finalStatus = deriveFinalRawStorageStatus({ storedStatus, storageProvider });
|
|
317
|
+
const rowCount = await finalizeUploadAndSyncArtifact(pool, {
|
|
318
|
+
userId: input.userId, documentId: input.documentId,
|
|
319
|
+
claimId: alpha.claimId, finalStatus,
|
|
320
|
+
});
|
|
321
|
+
if (rowCount === 0) {
|
|
322
|
+
throw new UploadClaimLostError(input.documentId, alpha.claimId, 'gamma');
|
|
323
|
+
}
|
|
324
|
+
return buildUploadResult({
|
|
325
|
+
documentId: alpha.document.id,
|
|
326
|
+
storageProvider,
|
|
327
|
+
storageUri: alpha.document.storageUri,
|
|
328
|
+
contentHash: alpha.contentHash,
|
|
329
|
+
sizeBytes: alpha.sizeBytes,
|
|
330
|
+
finalStatus,
|
|
331
|
+
rawStorageMetadata: alpha.document.rawStorageMetadata,
|
|
332
|
+
idempotentSkip: false,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
function isManagedBlobOccupied(status) {
|
|
336
|
+
return status === 'blob_stored'
|
|
337
|
+
|| status === 'blob_pending'
|
|
338
|
+
|| status === 'blob_available'
|
|
339
|
+
|| status === 'blob_uploading';
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Conflict guard: fires on any occupied managed_blob state where the
|
|
343
|
+
* incoming hash disagrees with the persisted plaintext hash. Crucially
|
|
344
|
+
* does NOT require `storage_uri !== null` — a `blob_uploading` row
|
|
345
|
+
* whose the claim step recorded the plaintext hash but whose the durable URI-write step hasn't
|
|
346
|
+
* yet written the URI still owns the slot, and a different-hash
|
|
347
|
+
* caller arriving in that window must 409 (rev-fix HIGH 1).
|
|
348
|
+
*/
|
|
349
|
+
function hasConflictingManagedBlob(document, contentHash) {
|
|
350
|
+
return (isManagedBlobOccupied(document.rawStorageStatus)
|
|
351
|
+
&& document.contentHash !== null
|
|
352
|
+
&& document.contentHash !== contentHash);
|
|
353
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding provider abstraction.
|
|
3
|
+
* Supports OpenAI, Ollama, OpenAI-compatible APIs, Voyage AI, and local
|
|
4
|
+
* WASM (via @huggingface/transformers with ONNX Runtime). Provider/model
|
|
5
|
+
* selection comes from the RuntimeConfig bound by createCoreRuntime().
|
|
6
|
+
*/
|
|
7
|
+
import { type WriteCostEventConfig } from './cost-telemetry.js';
|
|
8
|
+
import type { EmbeddingProviderName } from '../config.js';
|
|
9
|
+
/**
|
|
10
|
+
* Config subset consumed by the embedding module. After Phase 7 Step 3c,
|
|
11
|
+
* provider/model selection is startup-only, so it's safe for embedding to
|
|
12
|
+
* hold this as module-level state and rebind only on explicit reinit.
|
|
13
|
+
*
|
|
14
|
+
* Includes WriteCostEventConfig so cost-telemetry calls can be threaded
|
|
15
|
+
* through without a second init.
|
|
16
|
+
*/
|
|
17
|
+
export interface EmbeddingConfig extends WriteCostEventConfig {
|
|
18
|
+
embeddingProvider: EmbeddingProviderName;
|
|
19
|
+
embeddingModel: string;
|
|
20
|
+
embeddingDimensions: number;
|
|
21
|
+
embeddingApiUrl?: string;
|
|
22
|
+
embeddingApiKey?: string;
|
|
23
|
+
voyageApiKey?: string;
|
|
24
|
+
voyageDocumentModel: string;
|
|
25
|
+
voyageQueryModel: string;
|
|
26
|
+
openaiApiKey: string;
|
|
27
|
+
ollamaBaseUrl: string;
|
|
28
|
+
embeddingCacheEnabled: boolean;
|
|
29
|
+
extractionCacheDir: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Bind the embedding module's config. Called once by the composition
|
|
33
|
+
* root (`createCoreRuntime`). Calling again rebinds and invalidates the
|
|
34
|
+
* stateful provider cache — primarily for tests that need to swap
|
|
35
|
+
* providers within a process.
|
|
36
|
+
*/
|
|
37
|
+
export declare function initEmbedding(config: EmbeddingConfig): void;
|
|
38
|
+
export type EmbeddingTask = 'query' | 'document';
|
|
39
|
+
export interface EmbeddingProvider {
|
|
40
|
+
embed(text: string, task: EmbeddingTask): Promise<number[]>;
|
|
41
|
+
embedBatch(texts: string[], task: EmbeddingTask): Promise<number[][]>;
|
|
42
|
+
}
|
|
43
|
+
/** Embed a single text — primary API used throughout the codebase. */
|
|
44
|
+
export declare function embedText(text: string, task?: EmbeddingTask): Promise<number[]>;
|
|
45
|
+
/** Embed multiple texts in one call, with per-text cache integration. */
|
|
46
|
+
export declare function embedTexts(texts: string[], task?: EmbeddingTask): Promise<number[][]>;
|
|
47
|
+
/** Get current cache size (for testing/monitoring). */
|
|
48
|
+
export declare function getEmbeddingCacheSize(): number;
|
|
49
|
+
/** Clear the embedding cache (for testing). */
|
|
50
|
+
export declare function clearEmbeddingCache(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Detect the actual embedding width returned by the active provider.
|
|
53
|
+
* Some OpenAI-compatible backends ignore the requested dimensions parameter,
|
|
54
|
+
* so the database schema must align to the real vector width, not just config.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolveEmbeddingDimensions(): Promise<number>;
|
|
57
|
+
export { cosineSimilarity } from '../vector-math.js';
|