@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,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file PII-safe storage-key prefix derivation.
|
|
3
|
+
*
|
|
4
|
+
* The storage-sibling plan removed plaintext `users/${userId}/...`
|
|
5
|
+
* path segments from every provider key/URI we hand to a backend.
|
|
6
|
+
* Replacement: an HMAC-SHA256 prefix that is:
|
|
7
|
+
*
|
|
8
|
+
* - deterministic (same `(secret, userId)` → same 32-hex prefix),
|
|
9
|
+
* so retries / same-bytes re-uploads still collide on the same
|
|
10
|
+
* key and the idempotency contract holds end-to-end;
|
|
11
|
+
* - non-reversible (HMAC of a server-side secret), so an
|
|
12
|
+
* operator scanning backend listings cannot recover the
|
|
13
|
+
* `user_id` from a key — addresses the PII leak that motivated
|
|
14
|
+
* this commit;
|
|
15
|
+
* - per-user (different `userId` derives a different prefix), so
|
|
16
|
+
* ownership is still visually separable in the backend listing
|
|
17
|
+
* (one prefix = one user).
|
|
18
|
+
*
|
|
19
|
+
* Output shape: the leading 32 hex chars (16 bytes) of the HMAC.
|
|
20
|
+
* 16 bytes is enough collision resistance — birthday at 2^64 over
|
|
21
|
+
* the user-space — while keeping keys short. The `s/<hex32>/`
|
|
22
|
+
* route is the only consumer; do NOT slice differently elsewhere.
|
|
23
|
+
*
|
|
24
|
+
* The secret is required at startup via
|
|
25
|
+
* `RuntimeConfig.storageKeyHmacSecret`; callers thread it through
|
|
26
|
+
* the service constructors. NEVER read `process.env` directly here.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Length of the hex slice we keep as the per-user prefix.
|
|
30
|
+
* Workspace constant — do not change without a key-migration plan
|
|
31
|
+
* (existing keys would no longer collide with their re-upload).
|
|
32
|
+
*/
|
|
33
|
+
export declare const STORAGE_KEY_PREFIX_LENGTH = 32;
|
|
34
|
+
/**
|
|
35
|
+
* Derive the per-user HMAC prefix used at the head of every
|
|
36
|
+
* managed-storage key. Stable across retries; non-reversible.
|
|
37
|
+
*
|
|
38
|
+
* `secret` is the deployment-wide `STORAGE_KEY_HMAC_SECRET`. The
|
|
39
|
+
* caller MUST source it from `RuntimeConfig.storageKeyHmacSecret`
|
|
40
|
+
* (validated at startup as >=64 hex chars); never read env here.
|
|
41
|
+
*/
|
|
42
|
+
export declare function deriveStorageKeyPrefix(secret: string, userId: string): string;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file PII-safe storage-key prefix derivation.
|
|
3
|
+
*
|
|
4
|
+
* The storage-sibling plan removed plaintext `users/${userId}/...`
|
|
5
|
+
* path segments from every provider key/URI we hand to a backend.
|
|
6
|
+
* Replacement: an HMAC-SHA256 prefix that is:
|
|
7
|
+
*
|
|
8
|
+
* - deterministic (same `(secret, userId)` → same 32-hex prefix),
|
|
9
|
+
* so retries / same-bytes re-uploads still collide on the same
|
|
10
|
+
* key and the idempotency contract holds end-to-end;
|
|
11
|
+
* - non-reversible (HMAC of a server-side secret), so an
|
|
12
|
+
* operator scanning backend listings cannot recover the
|
|
13
|
+
* `user_id` from a key — addresses the PII leak that motivated
|
|
14
|
+
* this commit;
|
|
15
|
+
* - per-user (different `userId` derives a different prefix), so
|
|
16
|
+
* ownership is still visually separable in the backend listing
|
|
17
|
+
* (one prefix = one user).
|
|
18
|
+
*
|
|
19
|
+
* Output shape: the leading 32 hex chars (16 bytes) of the HMAC.
|
|
20
|
+
* 16 bytes is enough collision resistance — birthday at 2^64 over
|
|
21
|
+
* the user-space — while keeping keys short. The `s/<hex32>/`
|
|
22
|
+
* route is the only consumer; do NOT slice differently elsewhere.
|
|
23
|
+
*
|
|
24
|
+
* The secret is required at startup via
|
|
25
|
+
* `RuntimeConfig.storageKeyHmacSecret`; callers thread it through
|
|
26
|
+
* the service constructors. NEVER read `process.env` directly here.
|
|
27
|
+
*/
|
|
28
|
+
import { createHmac } from 'node:crypto';
|
|
29
|
+
/**
|
|
30
|
+
* Length of the hex slice we keep as the per-user prefix.
|
|
31
|
+
* Workspace constant — do not change without a key-migration plan
|
|
32
|
+
* (existing keys would no longer collide with their re-upload).
|
|
33
|
+
*/
|
|
34
|
+
export const STORAGE_KEY_PREFIX_LENGTH = 32;
|
|
35
|
+
/**
|
|
36
|
+
* Derive the per-user HMAC prefix used at the head of every
|
|
37
|
+
* managed-storage key. Stable across retries; non-reversible.
|
|
38
|
+
*
|
|
39
|
+
* `secret` is the deployment-wide `STORAGE_KEY_HMAC_SECRET`. The
|
|
40
|
+
* caller MUST source it from `RuntimeConfig.storageKeyHmacSecret`
|
|
41
|
+
* (validated at startup as >=64 hex chars); never read env here.
|
|
42
|
+
*/
|
|
43
|
+
export function deriveStorageKeyPrefix(secret, userId) {
|
|
44
|
+
return createHmac('sha256', secret).update(userId).digest('hex').slice(0, STORAGE_KEY_PREFIX_LENGTH);
|
|
45
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Pending-row-first put recovery helpers for `StorageService`.
|
|
3
|
+
*
|
|
4
|
+
* `storage-service.ts` orchestrates managed-mode puts: claim a
|
|
5
|
+
* pending row, call `backend.put`, finalize via a CAS to `'stored'`.
|
|
6
|
+
* This module owns every branch the orchestrator hands off to when
|
|
7
|
+
* something on either side fails, plus the closed-set event names
|
|
8
|
+
* the helpers emit:
|
|
9
|
+
*
|
|
10
|
+
* - `persistUploadedOrRecover` — happy success + retry, then
|
|
11
|
+
* reconciliation (commit-after-throw), then recovery.
|
|
12
|
+
* - `recordBackendPutFailure` — `backend.put` threw before
|
|
13
|
+
* finalization; CAS-flip to `'failed'`.
|
|
14
|
+
* - the post-put recovery branches (cleanup OK / cleanup failed)
|
|
15
|
+
* and the durable orphan-URI marker that the reconciler reads.
|
|
16
|
+
*
|
|
17
|
+
* Extracted from `storage-service.ts` to keep that file under the
|
|
18
|
+
* workspace 400-LOC cap. No behavior change vs the inline form.
|
|
19
|
+
*/
|
|
20
|
+
import type pg from 'pg';
|
|
21
|
+
import { type StorageArtifactRow } from '../db/storage-artifact-repository.js';
|
|
22
|
+
import type { PutBackendResult, StorageBackend } from '../storage/storage-backend.js';
|
|
23
|
+
/** Re-export of the backend `put` result shape used by the recovery helpers. */
|
|
24
|
+
export type PutResult = PutBackendResult;
|
|
25
|
+
/**
|
|
26
|
+
* Closed enum of structured-log event names emitted by the put
|
|
27
|
+
* recovery pipeline. Adding a name here is the explicit permission
|
|
28
|
+
* to surface it in the `[STORAGE]` log stream; the TS checker
|
|
29
|
+
* blocks accidental typos.
|
|
30
|
+
*/
|
|
31
|
+
export type StorageEventName = 'storage.put.post_put_unrecoverable' | 'storage.put.post_put_failed_cleaned_up' | 'storage.put.post_put_unrecoverable_mark_error' | 'storage.put.post_put_failed_cleaned_up_mark_error' | 'storage.put.backend_put_failed_mark_skipped' | 'storage.put.backend_put_failed_mark_error';
|
|
32
|
+
/**
|
|
33
|
+
* Normalize an arbitrary thrown value into a single-line string.
|
|
34
|
+
* Exported because `StorageService.executeBackendDelete` also
|
|
35
|
+
* needs to format `backend.delete` errors into `last_error`
|
|
36
|
+
* envelopes; the function shape is identical to the one the
|
|
37
|
+
* recovery helpers use so they share a single implementation.
|
|
38
|
+
*/
|
|
39
|
+
export declare function errorMessage(err: unknown): string;
|
|
40
|
+
export interface PutClaim {
|
|
41
|
+
row: StorageArtifactRow;
|
|
42
|
+
claimId: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Success-path orchestrator: CAS-flip the pending row to `stored`,
|
|
46
|
+
* with one retry. On every failure mode (throw, CAS miss, or the
|
|
47
|
+
* commit-after-throw race) call `reconcileAlreadyFinalized` BEFORE
|
|
48
|
+
* recovery so an already-finalized row is not erroneously cleaned
|
|
49
|
+
* up.
|
|
50
|
+
*/
|
|
51
|
+
export declare function persistUploadedOrRecover(args: {
|
|
52
|
+
pool: pg.Pool;
|
|
53
|
+
userId: string;
|
|
54
|
+
backend: StorageBackend;
|
|
55
|
+
claim: PutClaim;
|
|
56
|
+
putResult: PutResult;
|
|
57
|
+
}): Promise<StorageArtifactRow>;
|
|
58
|
+
/**
|
|
59
|
+
* Failure branch invoked from `putManaged` when `backend.put`
|
|
60
|
+
* itself threw. CAS-flip the pending row to `'failed'`. If the CAS
|
|
61
|
+
* marker misses or its UPDATE throws, emit a typed event so the
|
|
62
|
+
* failure stays observable; the caller re-throws the original put
|
|
63
|
+
* error regardless.
|
|
64
|
+
*/
|
|
65
|
+
export declare function recordBackendPutFailure(args: {
|
|
66
|
+
pool: pg.Pool;
|
|
67
|
+
userId: string;
|
|
68
|
+
claim: PutClaim;
|
|
69
|
+
provider: string;
|
|
70
|
+
putError: unknown;
|
|
71
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Pending-row-first put recovery helpers for `StorageService`.
|
|
3
|
+
*
|
|
4
|
+
* `storage-service.ts` orchestrates managed-mode puts: claim a
|
|
5
|
+
* pending row, call `backend.put`, finalize via a CAS to `'stored'`.
|
|
6
|
+
* This module owns every branch the orchestrator hands off to when
|
|
7
|
+
* something on either side fails, plus the closed-set event names
|
|
8
|
+
* the helpers emit:
|
|
9
|
+
*
|
|
10
|
+
* - `persistUploadedOrRecover` — happy success + retry, then
|
|
11
|
+
* reconciliation (commit-after-throw), then recovery.
|
|
12
|
+
* - `recordBackendPutFailure` — `backend.put` threw before
|
|
13
|
+
* finalization; CAS-flip to `'failed'`.
|
|
14
|
+
* - the post-put recovery branches (cleanup OK / cleanup failed)
|
|
15
|
+
* and the durable orphan-URI marker that the reconciler reads.
|
|
16
|
+
*
|
|
17
|
+
* Extracted from `storage-service.ts` to keep that file under the
|
|
18
|
+
* workspace 400-LOC cap. No behavior change vs the inline form.
|
|
19
|
+
*/
|
|
20
|
+
import { getStorageArtifactByIdIncludingDeleted, markPutFailed, recordUploadedArtifact, } from '../db/storage-artifact-repository.js';
|
|
21
|
+
import { projectArtifactProviderFields } from '../storage/provider-metadata-projection.js';
|
|
22
|
+
import { PutPostPersistError } from './storage-service-errors.js';
|
|
23
|
+
/** Emit a structured `[STORAGE]` event to stderr (one JSON line). */
|
|
24
|
+
function emitStorageEvent(event, detail) {
|
|
25
|
+
const payload = { event, timestamp: new Date().toISOString(), detail };
|
|
26
|
+
process.stderr.write(`[STORAGE] ${JSON.stringify(payload)}\n`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Normalize an arbitrary thrown value into a single-line string.
|
|
30
|
+
* Exported because `StorageService.executeBackendDelete` also
|
|
31
|
+
* needs to format `backend.delete` errors into `last_error`
|
|
32
|
+
* envelopes; the function shape is identical to the one the
|
|
33
|
+
* recovery helpers use so they share a single implementation.
|
|
34
|
+
*/
|
|
35
|
+
export function errorMessage(err) {
|
|
36
|
+
if (err instanceof Error)
|
|
37
|
+
return err.message;
|
|
38
|
+
return String(err ?? 'unknown error');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Success-path orchestrator: CAS-flip the pending row to `stored`,
|
|
42
|
+
* with one retry. On every failure mode (throw, CAS miss, or the
|
|
43
|
+
* commit-after-throw race) call `reconcileAlreadyFinalized` BEFORE
|
|
44
|
+
* recovery so an already-finalized row is not erroneously cleaned
|
|
45
|
+
* up.
|
|
46
|
+
*/
|
|
47
|
+
export async function persistUploadedOrRecover(args) {
|
|
48
|
+
const projected = projectArtifactProviderFields(args.backend.provider, args.putResult.providerMetadata);
|
|
49
|
+
const recordInput = {
|
|
50
|
+
userId: args.userId,
|
|
51
|
+
artifactId: args.claim.row.id,
|
|
52
|
+
putAttemptId: args.claim.claimId,
|
|
53
|
+
uri: args.putResult.uri,
|
|
54
|
+
sizeBytes: args.putResult.sizeBytes,
|
|
55
|
+
plaintextHash: args.putResult.plaintextHash,
|
|
56
|
+
storedHash: args.putResult.storedHash,
|
|
57
|
+
identifiers: projected.identifiers,
|
|
58
|
+
providerDetails: projected.providerDetails,
|
|
59
|
+
};
|
|
60
|
+
let firstError;
|
|
61
|
+
try {
|
|
62
|
+
const recorded = await recordUploadedArtifact(args.pool, recordInput);
|
|
63
|
+
if (recorded !== null)
|
|
64
|
+
return recorded;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
firstError = err;
|
|
68
|
+
}
|
|
69
|
+
const reconciled = await reconcileAlreadyFinalized(args.pool, args.userId, args.claim.row.id, args.putResult);
|
|
70
|
+
if (reconciled !== null)
|
|
71
|
+
return reconciled;
|
|
72
|
+
let retryError;
|
|
73
|
+
try {
|
|
74
|
+
const retried = await recordUploadedArtifact(args.pool, recordInput);
|
|
75
|
+
if (retried !== null)
|
|
76
|
+
return retried;
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
retryError = err;
|
|
80
|
+
}
|
|
81
|
+
const reconciledAfterRetry = await reconcileAlreadyFinalized(args.pool, args.userId, args.claim.row.id, args.putResult);
|
|
82
|
+
if (reconciledAfterRetry !== null)
|
|
83
|
+
return reconciledAfterRetry;
|
|
84
|
+
// Synthesize a typed error so recovery has a meaningful message
|
|
85
|
+
// when both calls returned null without throwing. URI stays
|
|
86
|
+
// server-side; only the artifact id is in the message.
|
|
87
|
+
const persistError = firstError ?? retryError ?? new Error(`recordUploadedArtifact CAS missed twice for artifact '${args.claim.row.id}' ` +
|
|
88
|
+
'and the row was not reconcilable; treating as post-put DB failure');
|
|
89
|
+
return recoverPostPutFailure({
|
|
90
|
+
pool: args.pool,
|
|
91
|
+
userId: args.userId,
|
|
92
|
+
claim: args.claim,
|
|
93
|
+
backend: args.backend,
|
|
94
|
+
putResult: args.putResult,
|
|
95
|
+
persistError,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Commit-after-throw reconciliation. Reads the row by id (within
|
|
100
|
+
* the user scope) and returns it if `status='stored'` AND its
|
|
101
|
+
* `(uri, plaintextHash, storedHash)` match the bytes we just
|
|
102
|
+
* uploaded. Returns null otherwise.
|
|
103
|
+
*/
|
|
104
|
+
async function reconcileAlreadyFinalized(pool, userId, artifactId, putResult) {
|
|
105
|
+
const row = await getStorageArtifactByIdIncludingDeleted(pool, userId, artifactId);
|
|
106
|
+
if (row === null)
|
|
107
|
+
return null;
|
|
108
|
+
if (row.status !== 'stored')
|
|
109
|
+
return null;
|
|
110
|
+
if (row.uri !== putResult.uri)
|
|
111
|
+
return null;
|
|
112
|
+
if (row.plaintextHash !== putResult.plaintextHash)
|
|
113
|
+
return null;
|
|
114
|
+
if (row.storedHash !== putResult.storedHash)
|
|
115
|
+
return null;
|
|
116
|
+
return row;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Cleanup-then-mark recovery. Attempts `backend.delete(uri)` to
|
|
120
|
+
* roll back the just-uploaded bytes; depending on the outcome
|
|
121
|
+
* either marks the row `failed` with `put_post_persist_failed_cleaned_up`
|
|
122
|
+
* and re-throws the original DB error, OR persists a durable
|
|
123
|
+
* `put_post_persist_unrecoverable` marker (with the orphan URI on
|
|
124
|
+
* the internal `last_error` envelope) and throws `PutPostPersistError`.
|
|
125
|
+
*/
|
|
126
|
+
async function recoverPostPutFailure(args) {
|
|
127
|
+
const persistMessage = errorMessage(args.persistError);
|
|
128
|
+
try {
|
|
129
|
+
await args.backend.delete(args.putResult.uri);
|
|
130
|
+
}
|
|
131
|
+
catch (cleanupError) {
|
|
132
|
+
await markPostPutUnrecoverableBestEffort({
|
|
133
|
+
pool: args.pool,
|
|
134
|
+
userId: args.userId,
|
|
135
|
+
artifactId: args.claim.row.id,
|
|
136
|
+
putAttemptId: args.claim.claimId,
|
|
137
|
+
provider: args.backend.provider,
|
|
138
|
+
uri: args.putResult.uri,
|
|
139
|
+
persistMessage,
|
|
140
|
+
cleanupMessage: errorMessage(cleanupError),
|
|
141
|
+
});
|
|
142
|
+
throw new PutPostPersistError(args.claim.row.id, args.backend.provider, args.putResult.uri, persistMessage);
|
|
143
|
+
}
|
|
144
|
+
await markCleanedUpBestEffort({
|
|
145
|
+
pool: args.pool,
|
|
146
|
+
userId: args.userId,
|
|
147
|
+
artifactId: args.claim.row.id,
|
|
148
|
+
putAttemptId: args.claim.claimId,
|
|
149
|
+
provider: args.backend.provider,
|
|
150
|
+
persistMessage,
|
|
151
|
+
});
|
|
152
|
+
throw args.persistError;
|
|
153
|
+
}
|
|
154
|
+
async function markCleanedUpBestEffort(args) {
|
|
155
|
+
const envelope = {
|
|
156
|
+
layer: 'raw_storage',
|
|
157
|
+
code: 'put_post_persist_failed_cleaned_up',
|
|
158
|
+
message: args.persistMessage,
|
|
159
|
+
storage_provider: args.provider,
|
|
160
|
+
occurred_at: new Date().toISOString(),
|
|
161
|
+
};
|
|
162
|
+
const matched = await runScopedFailureMarker({
|
|
163
|
+
pool: args.pool,
|
|
164
|
+
userId: args.userId,
|
|
165
|
+
artifactId: args.artifactId,
|
|
166
|
+
putAttemptId: args.putAttemptId,
|
|
167
|
+
envelope,
|
|
168
|
+
dbErrorEvent: 'storage.put.post_put_failed_cleaned_up_mark_error',
|
|
169
|
+
});
|
|
170
|
+
if (!matched) {
|
|
171
|
+
emitStorageEvent('storage.put.post_put_failed_cleaned_up', {
|
|
172
|
+
artifact_id: args.artifactId,
|
|
173
|
+
provider: args.provider,
|
|
174
|
+
persist_error: args.persistMessage,
|
|
175
|
+
reason: 'cas_miss_or_db_error',
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function markPostPutUnrecoverableBestEffort(args) {
|
|
180
|
+
const envelope = {
|
|
181
|
+
layer: 'raw_storage',
|
|
182
|
+
code: 'put_post_persist_unrecoverable',
|
|
183
|
+
message: args.persistMessage,
|
|
184
|
+
cleanup_error: args.cleanupMessage,
|
|
185
|
+
orphan_uri: args.uri,
|
|
186
|
+
storage_provider: args.provider,
|
|
187
|
+
occurred_at: new Date().toISOString(),
|
|
188
|
+
};
|
|
189
|
+
const matched = await runScopedFailureMarker({
|
|
190
|
+
pool: args.pool,
|
|
191
|
+
userId: args.userId,
|
|
192
|
+
artifactId: args.artifactId,
|
|
193
|
+
putAttemptId: args.putAttemptId,
|
|
194
|
+
envelope,
|
|
195
|
+
dbErrorEvent: 'storage.put.post_put_unrecoverable_mark_error',
|
|
196
|
+
});
|
|
197
|
+
emitStorageEvent('storage.put.post_put_unrecoverable', {
|
|
198
|
+
artifact_id: args.artifactId,
|
|
199
|
+
provider: args.provider,
|
|
200
|
+
uri: args.uri,
|
|
201
|
+
persist_error: args.persistMessage,
|
|
202
|
+
cleanup_error: args.cleanupMessage,
|
|
203
|
+
marker_persisted: matched,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/** Shared CAS-scoped failure marker — CAS on
|
|
207
|
+
* `(id, user_id, put_attempt_id, status='pending')`. Emits the
|
|
208
|
+
* supplied typed event on DB error; never swallows. */
|
|
209
|
+
async function runScopedFailureMarker(args) {
|
|
210
|
+
try {
|
|
211
|
+
const result = await args.pool.query(`UPDATE storage_artifacts
|
|
212
|
+
SET status = 'failed',
|
|
213
|
+
last_error = $4::jsonb,
|
|
214
|
+
put_attempt_id = NULL,
|
|
215
|
+
updated_at = NOW()
|
|
216
|
+
WHERE id = $1
|
|
217
|
+
AND user_id = $2
|
|
218
|
+
AND put_attempt_id = $3
|
|
219
|
+
AND status = 'pending'`, [args.artifactId, args.userId, args.putAttemptId, JSON.stringify(args.envelope)]);
|
|
220
|
+
return (result.rowCount ?? 0) > 0;
|
|
221
|
+
}
|
|
222
|
+
catch (markError) {
|
|
223
|
+
emitStorageEvent(args.dbErrorEvent, {
|
|
224
|
+
artifact_id: args.artifactId,
|
|
225
|
+
mark_error: errorMessage(markError),
|
|
226
|
+
});
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Failure branch invoked from `putManaged` when `backend.put`
|
|
232
|
+
* itself threw. CAS-flip the pending row to `'failed'`. If the CAS
|
|
233
|
+
* marker misses or its UPDATE throws, emit a typed event so the
|
|
234
|
+
* failure stays observable; the caller re-throws the original put
|
|
235
|
+
* error regardless.
|
|
236
|
+
*/
|
|
237
|
+
export async function recordBackendPutFailure(args) {
|
|
238
|
+
const envelope = {
|
|
239
|
+
layer: 'raw_storage',
|
|
240
|
+
code: 'backend_put_failed',
|
|
241
|
+
message: errorMessage(args.putError),
|
|
242
|
+
storage_provider: args.provider,
|
|
243
|
+
occurred_at: new Date().toISOString(),
|
|
244
|
+
};
|
|
245
|
+
try {
|
|
246
|
+
const marked = await markPutFailed(args.pool, {
|
|
247
|
+
userId: args.userId,
|
|
248
|
+
artifactId: args.claim.row.id,
|
|
249
|
+
putAttemptId: args.claim.claimId,
|
|
250
|
+
lastError: envelope,
|
|
251
|
+
});
|
|
252
|
+
if (marked !== null)
|
|
253
|
+
return;
|
|
254
|
+
emitStorageEvent('storage.put.backend_put_failed_mark_skipped', {
|
|
255
|
+
artifact_id: args.claim.row.id,
|
|
256
|
+
provider: args.provider,
|
|
257
|
+
reason: 'cas_miss',
|
|
258
|
+
put_error: envelope.message,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
catch (markError) {
|
|
262
|
+
emitStorageEvent('storage.put.backend_put_failed_mark_error', {
|
|
263
|
+
artifact_id: args.claim.row.id,
|
|
264
|
+
provider: args.provider,
|
|
265
|
+
put_error: envelope.message,
|
|
266
|
+
mark_error: errorMessage(markError),
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Typed errors thrown by `StorageService`.
|
|
3
|
+
*
|
|
4
|
+
* The route layer pattern-matches these by `instanceof` to emit the
|
|
5
|
+
* correct HTTP status + error envelope. Service code never embeds
|
|
6
|
+
* status codes itself; the route is the single place where service
|
|
7
|
+
* outcomes map to HTTP.
|
|
8
|
+
*/
|
|
9
|
+
export declare class StorageArtifactNotFoundError extends Error {
|
|
10
|
+
readonly artifactId: string;
|
|
11
|
+
constructor(artifactId: string);
|
|
12
|
+
}
|
|
13
|
+
export declare class PointerContentNotManagedError extends Error {
|
|
14
|
+
readonly artifactId: string;
|
|
15
|
+
readonly uri: string;
|
|
16
|
+
constructor(artifactId: string, uri: string);
|
|
17
|
+
}
|
|
18
|
+
export declare class FilecoinDirectStorageNotSupportedError extends Error {
|
|
19
|
+
readonly provider: string;
|
|
20
|
+
constructor(provider?: string);
|
|
21
|
+
}
|
|
22
|
+
export declare class UnsupportedPointerSchemeError extends Error {
|
|
23
|
+
readonly uri: string;
|
|
24
|
+
readonly allowedSchemes: ReadonlyArray<string>;
|
|
25
|
+
constructor(uri: string, allowedSchemes: ReadonlyArray<string>);
|
|
26
|
+
}
|
|
27
|
+
export declare class ArtifactInUseError extends Error {
|
|
28
|
+
readonly artifactId: string;
|
|
29
|
+
readonly referencedByDocumentCount: number;
|
|
30
|
+
constructor(artifactId: string, count: number);
|
|
31
|
+
}
|
|
32
|
+
export declare class ManagedStorageDisabledError extends Error {
|
|
33
|
+
constructor();
|
|
34
|
+
}
|
|
35
|
+
export declare class InvalidArtifactMetadataError extends Error {
|
|
36
|
+
readonly reason: string;
|
|
37
|
+
constructor(reason: string);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Thrown when a managed-mode artifact row's `provider` is not
|
|
41
|
+
* registered with the active `StorageBackendRegistry`. This is an
|
|
42
|
+
* operational unavailability (the deployment dropped a backend that
|
|
43
|
+
* still has live data), NOT a 5xx crash — the route layer maps it
|
|
44
|
+
* to HTTP 503 `storage_backend_unavailable`. The envelope carries
|
|
45
|
+
* only `provider_id`; internal stack/error details stay server-side.
|
|
46
|
+
*/
|
|
47
|
+
export declare class BackendNotRegisteredError extends Error {
|
|
48
|
+
readonly providerId: string;
|
|
49
|
+
readonly artifactId: string;
|
|
50
|
+
constructor(providerId: string, artifactId: string);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Thrown by `StorageService.putManaged` when the put would write
|
|
54
|
+
* through a backend whose provider isn't part of the registry's
|
|
55
|
+
* known set (registered backends + the pointer-only marker). The
|
|
56
|
+
* route maps this to HTTP 503 `storage_backend_unavailable`. Unlike
|
|
57
|
+
* `BackendNotRegisteredError` (which fires on read against an
|
|
58
|
+
* already-persisted row), this fires BEFORE any DB write — the
|
|
59
|
+
* upload is rejected at the entry point.
|
|
60
|
+
*/
|
|
61
|
+
export declare class UnregisteredProviderError extends Error {
|
|
62
|
+
readonly providerId: string;
|
|
63
|
+
constructor(providerId: string);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Thrown by `StorageService.putManaged` when `backend.put` succeeded
|
|
67
|
+
* but the post-put DB update and the subsequent recovery (DB retry +
|
|
68
|
+
* backend cleanup of the just-uploaded bytes) ALL failed. At that
|
|
69
|
+
* point the bytes survive at the backend AND the DB does not know
|
|
70
|
+
* the URI. The route maps this to HTTP 503 `put_post_persist_failed`
|
|
71
|
+
* with the artifact id and provider so ops can investigate. The
|
|
72
|
+
* orphan URI is captured server-side (in the row's `last_error`
|
|
73
|
+
* envelope + a structured `storage.put.post_put_unrecoverable`
|
|
74
|
+
* event) but NEVER on the wire.
|
|
75
|
+
*/
|
|
76
|
+
export declare class PutPostPersistError extends Error {
|
|
77
|
+
readonly artifactId: string;
|
|
78
|
+
readonly providerId: string;
|
|
79
|
+
/** Orphan URI — internal only; the route never surfaces this on the wire. */
|
|
80
|
+
readonly uri: string;
|
|
81
|
+
constructor(artifactId: string, providerId: string, uri: string, cause: string);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Thrown when a public API caller requests bytes or verifies an
|
|
85
|
+
* artifact whose managed upload is still in flight (`status='pending'`).
|
|
86
|
+
* Route maps this to HTTP 409 `artifact_not_ready`. Distinct from
|
|
87
|
+
* `ArtifactUnavailableError` (terminal `failed`) because the row
|
|
88
|
+
* MIGHT still reach `stored` if the upload finishes.
|
|
89
|
+
*/
|
|
90
|
+
export declare class ArtifactNotReadyError extends Error {
|
|
91
|
+
readonly artifactId: string;
|
|
92
|
+
constructor(artifactId: string);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Thrown when a public API caller requests bytes or verifies an
|
|
96
|
+
* artifact whose managed upload terminally failed (`status='failed'`
|
|
97
|
+
* with no URI). The row exists for ops visibility — the caller's
|
|
98
|
+
* action against it would never succeed because the backend never
|
|
99
|
+
* persisted the bytes. Route maps this to HTTP 410 `artifact_unavailable`.
|
|
100
|
+
*/
|
|
101
|
+
export declare class ArtifactUnavailableError extends Error {
|
|
102
|
+
readonly artifactId: string;
|
|
103
|
+
readonly reason: string;
|
|
104
|
+
constructor(artifactId: string, reason: string);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Thrown by `deleteArtifact` when `claimDeleteAttempt` returns null
|
|
108
|
+
* AND the row is currently in `status='deleting'` — another caller
|
|
109
|
+
* holds an active claim and is mid-cascade / mid-backend-delete.
|
|
110
|
+
*
|
|
111
|
+
* Distinct from the idempotent terminal `status='deleted'` path
|
|
112
|
+
* (which still returns the prior terminal envelope as success) and
|
|
113
|
+
* from `StorageArtifactNotFoundError` (missing / cross-user). Route
|
|
114
|
+
* maps this to HTTP 409 `delete_in_flight` with `retryable=true` so
|
|
115
|
+
* the caller knows the action isn't fatal — just contended — and a
|
|
116
|
+
* later retry will either find the row `deleted` (idempotent
|
|
117
|
+
* success) or re-claim it (if the other caller's attempt failed
|
|
118
|
+
* and the row transitioned to `delete_failed`).
|
|
119
|
+
*/
|
|
120
|
+
export declare class ArtifactDeleteInFlightError extends Error {
|
|
121
|
+
readonly artifactId: string;
|
|
122
|
+
readonly currentStatus: string;
|
|
123
|
+
constructor(artifactId: string, currentStatus: string);
|
|
124
|
+
}
|