@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,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw-content storage interface for the document pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Adapter-agnostic facade for the bytes that back a document with
|
|
5
|
+
* `storage_mode = 'managed_blob'`. Implementations live alongside this
|
|
6
|
+
* file (`local-fs-store.ts`, `s3-store.ts`); the factory in
|
|
7
|
+
* `factory.ts` selects one at startup based on `RuntimeConfig`.
|
|
8
|
+
*
|
|
9
|
+
* Contract:
|
|
10
|
+
*
|
|
11
|
+
* - `put` writes the supplied bytes under the supplied key, returns the
|
|
12
|
+
* URI we will persist on `raw_documents.storage_uri`.
|
|
13
|
+
* - `get` and `head` accept the same URI shape `put` returned. They are
|
|
14
|
+
* the read-side hooks the future parsing path will call.
|
|
15
|
+
* - `delete` is **idempotent**: a missing key returns `{ deleted: false }`,
|
|
16
|
+
* not an error. Transport/auth failures still throw.
|
|
17
|
+
* - Adapters MUST NOT silently fall back to a different provider; if
|
|
18
|
+
* their config is wrong or the upstream service is unavailable, they
|
|
19
|
+
* must throw.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Lifecycle hint returned by `put`. Immediate providers (`local_fs`,
|
|
23
|
+
* `s3`) always report `'stored'` — bytes are retrievable the moment
|
|
24
|
+
* `put` returns. Eventual providers (e.g. Filecoin onramps in a future
|
|
25
|
+
* phase) may report `'pending'` when the provider has accepted the
|
|
26
|
+
* upload but storage/retrievability is not yet confirmed; the service
|
|
27
|
+
* layer maps that onto `raw_storage_status='blob_pending'` and a
|
|
28
|
+
* reconciler later promotes the row to `'blob_available'` or
|
|
29
|
+
* `'blob_archival_failed'`.
|
|
30
|
+
*/
|
|
31
|
+
export type StoredRawContentStatus = 'stored' | 'pending';
|
|
32
|
+
/** Identifier returned by `put`; opaque to the rest of the codebase. */
|
|
33
|
+
export interface StoredRawContent {
|
|
34
|
+
/** Adapter-prefixed URI we persist on `raw_documents.storage_uri`. */
|
|
35
|
+
storageUri: string;
|
|
36
|
+
/** Adapter id (e.g. `local_fs`, `s3`). Mirrors `raw_documents.storage_provider`. */
|
|
37
|
+
storageProvider: string;
|
|
38
|
+
/** SHA-256 hex of the bytes the adapter actually stored. */
|
|
39
|
+
contentHash: string;
|
|
40
|
+
/** Bytes actually persisted. Always equals `input.body.length`. */
|
|
41
|
+
sizeBytes: number;
|
|
42
|
+
/** See {@link StoredRawContentStatus}. */
|
|
43
|
+
status: StoredRawContentStatus;
|
|
44
|
+
/** Provider-side identifiers the service layer persists on `raw_documents.raw_storage_metadata`. */
|
|
45
|
+
providerMetadata: RawContentProviderMetadata;
|
|
46
|
+
}
|
|
47
|
+
export interface PutRawContentInput {
|
|
48
|
+
/** Adapter-relative key (e.g. `<prefix>/s/<hmac-hex32>/documents/<doc-id>/<hash>.bin`). */
|
|
49
|
+
key: string;
|
|
50
|
+
/** Bytes to persist. The adapter does not mutate this. */
|
|
51
|
+
body: Buffer;
|
|
52
|
+
/** Optional MIME type, persisted alongside the blob when supported. */
|
|
53
|
+
contentType?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Free-form provider-side metadata. Immediate providers may
|
|
57
|
+
* populate scalar fields like `etag`/`versionId`/`mtime`;
|
|
58
|
+
* content-addressed providers nest a provider-keyed sibling
|
|
59
|
+
* carrying their own internal shape (e.g. the Filecoin adapter
|
|
60
|
+
* writes `{ filecoin: { piece_cid, copies, … } }`). The exact
|
|
61
|
+
* sub-shape is provider-specific and treated as opaque by the
|
|
62
|
+
* upload pipeline; the public-projection seam
|
|
63
|
+
* (`filecoin-public-metadata.ts` and friends) is the single
|
|
64
|
+
* translator from that internal shape to the wire response.
|
|
65
|
+
*/
|
|
66
|
+
export type RawContentProviderMetadata = Record<string, unknown>;
|
|
67
|
+
export interface RawContentMetadata {
|
|
68
|
+
contentLength: number;
|
|
69
|
+
contentType: string | null;
|
|
70
|
+
contentHash: string | null;
|
|
71
|
+
providerMetadata: RawContentProviderMetadata;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Permanent-failure signal returned by `head()` when the provider
|
|
75
|
+
* itself reports that this specific URI / CID will NEVER become
|
|
76
|
+
* retrievable. The reconciler routes a `permanent` head
|
|
77
|
+
* result directly to `blob_archival_failed` without consuming a
|
|
78
|
+
* retry — there's no point in continuing to probe.
|
|
79
|
+
*
|
|
80
|
+
* Adapters MUST only set this for per-row terminal failures
|
|
81
|
+
* (Filecoin onramp `status: 'failed'`, malformed `ipfs://` URI,
|
|
82
|
+
* etc.). Auth / capability / rate-limit / 5xx outages are GLOBAL
|
|
83
|
+
* infra failures affecting every row — those stay transient
|
|
84
|
+
* (thrown errors or `exists: false`) so a single misconfigured
|
|
85
|
+
* deployment doesn't permanently fail every pending row.
|
|
86
|
+
*/
|
|
87
|
+
export interface RawContentPermanentFailure {
|
|
88
|
+
code: string;
|
|
89
|
+
message: string;
|
|
90
|
+
}
|
|
91
|
+
export interface RawContentHeadResult {
|
|
92
|
+
exists: boolean;
|
|
93
|
+
metadata: RawContentMetadata | null;
|
|
94
|
+
/** Optional per-row terminal-failure signal; see {@link RawContentPermanentFailure}. */
|
|
95
|
+
failure?: RawContentPermanentFailure;
|
|
96
|
+
}
|
|
97
|
+
export interface RawContentGetResult {
|
|
98
|
+
body: Buffer;
|
|
99
|
+
metadata: RawContentMetadata;
|
|
100
|
+
}
|
|
101
|
+
export interface RawContentDeleteResult {
|
|
102
|
+
/**
|
|
103
|
+
* `true` when the adapter actively removed bytes; `false` when the
|
|
104
|
+
* adapter found nothing to remove (already-missing). Both are
|
|
105
|
+
* NON-ERROR outcomes — the cleanup helper records both in
|
|
106
|
+
* `successes[]` and writes a terminal status marker either way.
|
|
107
|
+
*/
|
|
108
|
+
deleted: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* What the adapter's `delete` call DID at the provider boundary
|
|
111
|
+
* (rev-2 §1, rev-7 §5). Drives the cleanup marker:
|
|
112
|
+
*
|
|
113
|
+
* - `'deleted'` → `markRawStorageDeletedByUri` → `blob_deleted`
|
|
114
|
+
* - `'unpinned'` → `markRawStorageTombstonedByUri` → `blob_tombstoned`
|
|
115
|
+
* - `'tombstoned'` → `markRawStorageTombstonedByUri` → `blob_tombstoned`
|
|
116
|
+
*
|
|
117
|
+
* Already-missing carries the provider's natural semantics — a
|
|
118
|
+
* local_fs `ENOENT` is still `'deleted'` (bytes are gone), a
|
|
119
|
+
* Filecoin already-removed is still `'tombstoned'` (we stop
|
|
120
|
+
* managing the bytes either way).
|
|
121
|
+
*/
|
|
122
|
+
semantics: 'deleted' | 'unpinned' | 'tombstoned';
|
|
123
|
+
/**
|
|
124
|
+
* **Internal-only** billing/cost-impact metadata for uncertain
|
|
125
|
+
* delete outcomes (Phase 7 of the Filecoin harvest plan). For
|
|
126
|
+
* Filecoin, the Synapse SDK's `deletePiece({piece})` returns
|
|
127
|
+
* an on-chain `0x…` transaction hash that scheduled the
|
|
128
|
+
* removal — operators correlate this hash to chain-side gas
|
|
129
|
+
* cost so they can audit the cost-impact of a cleanup pass.
|
|
130
|
+
* Other providers (`local_fs`, `s3`) leave the field
|
|
131
|
+
* `undefined`.
|
|
132
|
+
*
|
|
133
|
+
* **MUST NOT cross any public boundary.** The cleanup-result
|
|
134
|
+
* DTO (`ManagedBlobCleanupSuccess`) is closed-key by design;
|
|
135
|
+
* the route response shape never includes `txHash`. The only
|
|
136
|
+
* legitimate consumer is the internal observability emitter
|
|
137
|
+
* (`emitFilecoinEvent('filecoin.delete.tombstoned', { …,
|
|
138
|
+
* deleteTxHash })`), which logs to operator-side telemetry.
|
|
139
|
+
* The leak-invariant tests in
|
|
140
|
+
* `cleanup-leak-invariants.test.ts` pin the absence on the
|
|
141
|
+
* public side.
|
|
142
|
+
*/
|
|
143
|
+
txHash?: string;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Capability advertisement for a `RawContentStore` instance. The
|
|
147
|
+
* upload service, status mapping, and `/v1/documents/limits` route
|
|
148
|
+
* read these to decide (a) which `raw_storage_status` to write after a
|
|
149
|
+
* successful `put`, (b) how `delete` interacts with the managed
|
|
150
|
+
* object (issued provider removal vs unpin vs tombstone), and (c)
|
|
151
|
+
* what semantics to advertise to clients via the preflight endpoint.
|
|
152
|
+
*/
|
|
153
|
+
export interface RawContentStoreCapabilities {
|
|
154
|
+
/**
|
|
155
|
+
* `'location'` — provider URIs are path-addressed (S3 key, local-fs
|
|
156
|
+
* path). A subsequent `put` to the same key replaces the bytes the
|
|
157
|
+
* URI resolves to; the URI does NOT carry a content commitment.
|
|
158
|
+
* `'content'` — provider URIs are content-addressed (e.g. CID), so
|
|
159
|
+
* the URI is itself a commitment over the bytes the caller stored.
|
|
160
|
+
*/
|
|
161
|
+
addressing: 'location' | 'content';
|
|
162
|
+
/**
|
|
163
|
+
* `'immediate'` — bytes are retrievable the instant `put` resolves.
|
|
164
|
+
* `'eventual'` — bytes may not yet be retrievable when `put`
|
|
165
|
+
* resolves; the provider exposes a separate "is it available yet"
|
|
166
|
+
* signal that the future reconciler consults.
|
|
167
|
+
*/
|
|
168
|
+
retrievalConsistency: 'immediate' | 'eventual';
|
|
169
|
+
/**
|
|
170
|
+
* Describes what AtomicMemory's `delete` call DOES at the provider
|
|
171
|
+
* boundary; it does NOT promise universal byte erasure (provider
|
|
172
|
+
* versioning, object-lock, retention policy, replication, etc. live
|
|
173
|
+
* outside AtomicMemory's control).
|
|
174
|
+
*
|
|
175
|
+
* `'delete'` — `delete` issues the provider's removal operation for
|
|
176
|
+
* the managed object (e.g. `DeleteObject`, `unlink`). The provider
|
|
177
|
+
* may still retain prior versions / replicas / backups according to
|
|
178
|
+
* its own configuration; AtomicMemory does not assert otherwise.
|
|
179
|
+
* `'unpin'` — `delete` removes AtomicMemory's pin/reference only;
|
|
180
|
+
* the provider may continue to serve the bytes from other peers.
|
|
181
|
+
* `'tombstone'` — AtomicMemory stops managing the bytes and cannot
|
|
182
|
+
* issue removal at the provider (typical for decentralized
|
|
183
|
+
* networks where AtomicMemory is one of many holders).
|
|
184
|
+
*/
|
|
185
|
+
deleteSemantics: 'delete' | 'unpin' | 'tombstone';
|
|
186
|
+
/** Whether `head` is implemented (true for all current adapters). */
|
|
187
|
+
supportsHead: boolean;
|
|
188
|
+
/** Whether `get` is implemented (true for all current adapters). */
|
|
189
|
+
supportsGet: boolean;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Opaque provider hints that `head`/`delete` MAY consult to optimize
|
|
193
|
+
* lookups. Shape: a provider-keyed map mirroring the sidecar
|
|
194
|
+
* `raw_documents.raw_storage_metadata` carries (e.g.
|
|
195
|
+
* `{ filecoin: { data_set_id: '42' } }`). Adapters MUST treat
|
|
196
|
+
* unknown / malformed / missing entries as ABSENT and fall back to
|
|
197
|
+
* their normal lookup path — hints are an optimization, never a
|
|
198
|
+
* correctness contract. The generic shape stays a plain
|
|
199
|
+
* `Record<string, unknown>` so the boundary doesn't acquire any
|
|
200
|
+
* provider-specific surface (rev-c201f21 instruction §4); each
|
|
201
|
+
* adapter parses its own sibling internally.
|
|
202
|
+
*/
|
|
203
|
+
export type RawContentHints = Readonly<Record<string, unknown>>;
|
|
204
|
+
/**
|
|
205
|
+
* Raw-content adapter. All methods are user-agnostic — caller scoping
|
|
206
|
+
* lives in the key the route layer constructs.
|
|
207
|
+
*
|
|
208
|
+
* `head` and `delete` accept an optional `hints` object that adapters
|
|
209
|
+
* MAY use to short-circuit lookups (e.g. the Filecoin adapter reads
|
|
210
|
+
* `hints.filecoin.data_set_id` so it can call
|
|
211
|
+
* `createContext({dataSetId})` directly instead of scanning every
|
|
212
|
+
* owned data set via `findDataSets`). Adapters that don't recognize
|
|
213
|
+
* a hint MUST ignore it.
|
|
214
|
+
*/
|
|
215
|
+
export interface RawContentStore {
|
|
216
|
+
/** Adapter id, persisted on `raw_documents.storage_provider`. */
|
|
217
|
+
readonly provider: string;
|
|
218
|
+
/** See {@link RawContentStoreCapabilities}. */
|
|
219
|
+
readonly capabilities: RawContentStoreCapabilities;
|
|
220
|
+
put(input: PutRawContentInput): Promise<StoredRawContent>;
|
|
221
|
+
get(storageUri: string): Promise<RawContentGetResult>;
|
|
222
|
+
head(storageUri: string, hints?: RawContentHints): Promise<RawContentHeadResult>;
|
|
223
|
+
delete(storageUri: string, hints?: RawContentHints): Promise<RawContentDeleteResult>;
|
|
224
|
+
}
|
|
225
|
+
/** Thrown when a storage URI doesn't match the adapter's expected shape. */
|
|
226
|
+
export declare class RawStorageUriError extends Error {
|
|
227
|
+
constructor(message: string);
|
|
228
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw-content storage interface for the document pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Adapter-agnostic facade for the bytes that back a document with
|
|
5
|
+
* `storage_mode = 'managed_blob'`. Implementations live alongside this
|
|
6
|
+
* file (`local-fs-store.ts`, `s3-store.ts`); the factory in
|
|
7
|
+
* `factory.ts` selects one at startup based on `RuntimeConfig`.
|
|
8
|
+
*
|
|
9
|
+
* Contract:
|
|
10
|
+
*
|
|
11
|
+
* - `put` writes the supplied bytes under the supplied key, returns the
|
|
12
|
+
* URI we will persist on `raw_documents.storage_uri`.
|
|
13
|
+
* - `get` and `head` accept the same URI shape `put` returned. They are
|
|
14
|
+
* the read-side hooks the future parsing path will call.
|
|
15
|
+
* - `delete` is **idempotent**: a missing key returns `{ deleted: false }`,
|
|
16
|
+
* not an error. Transport/auth failures still throw.
|
|
17
|
+
* - Adapters MUST NOT silently fall back to a different provider; if
|
|
18
|
+
* their config is wrong or the upstream service is unavailable, they
|
|
19
|
+
* must throw.
|
|
20
|
+
*/
|
|
21
|
+
/** Thrown when a storage URI doesn't match the adapter's expected shape. */
|
|
22
|
+
export class RawStorageUriError extends Error {
|
|
23
|
+
constructor(message) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = 'RawStorageUriError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3-compatible adapter for `RawContentStore`.
|
|
3
|
+
*
|
|
4
|
+
* Backed by `@aws-sdk/client-s3`. Works against AWS S3 (no `endpoint`
|
|
5
|
+
* override) and against S3-compatible providers like Cloudflare R2 or
|
|
6
|
+
* MinIO when an explicit `endpoint` URL is supplied. The adapter is
|
|
7
|
+
* stateless across calls — one `S3Client` is shared per instance.
|
|
8
|
+
*
|
|
9
|
+
* Storage URI shape: `s3://<bucket>/<key>`. The bucket carried in the
|
|
10
|
+
* URI is what the adapter writes/reads; if a future operator changes
|
|
11
|
+
* `RAW_STORAGE_BUCKET`, the URIs persisted on existing rows still point
|
|
12
|
+
* at the original bucket, which is the correct semantics for moving the
|
|
13
|
+
* default bucket without orphaning historical blobs.
|
|
14
|
+
*
|
|
15
|
+
* Idempotent delete: S3 `DeleteObject` is itself idempotent (no error
|
|
16
|
+
* on missing key); `head` translates `NotFound`/`NoSuchKey` to
|
|
17
|
+
* `{exists: false}` rather than throwing.
|
|
18
|
+
*/
|
|
19
|
+
import { S3Client } from '@aws-sdk/client-s3';
|
|
20
|
+
import { type PutRawContentInput, type RawContentDeleteResult, type RawContentGetResult, type RawContentHeadResult, type RawContentHints, type RawContentStore, type RawContentStoreCapabilities, type StoredRawContent } from './raw-content-store.js';
|
|
21
|
+
export interface S3RawContentStoreOptions {
|
|
22
|
+
/** Default bucket new puts write to. Existing URIs honor their own bucket. */
|
|
23
|
+
bucket: string;
|
|
24
|
+
region: string;
|
|
25
|
+
/** Custom endpoint URL for R2/MinIO/etc. Omit for AWS S3 default. */
|
|
26
|
+
endpoint?: string;
|
|
27
|
+
accessKeyId: string;
|
|
28
|
+
secretAccessKey: string;
|
|
29
|
+
/** Optional pre-built client — primarily an injection seam for tests. */
|
|
30
|
+
client?: S3Client;
|
|
31
|
+
}
|
|
32
|
+
export declare class S3RawContentStore implements RawContentStore {
|
|
33
|
+
readonly provider: "s3";
|
|
34
|
+
readonly capabilities: RawContentStoreCapabilities;
|
|
35
|
+
private readonly client;
|
|
36
|
+
private readonly bucket;
|
|
37
|
+
constructor(options: S3RawContentStoreOptions);
|
|
38
|
+
put(input: PutRawContentInput): Promise<StoredRawContent>;
|
|
39
|
+
get(storageUri: string): Promise<RawContentGetResult>;
|
|
40
|
+
head(storageUri: string, _hints?: RawContentHints): Promise<RawContentHeadResult>;
|
|
41
|
+
delete(storageUri: string, _hints?: RawContentHints): Promise<RawContentDeleteResult>;
|
|
42
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3-compatible adapter for `RawContentStore`.
|
|
3
|
+
*
|
|
4
|
+
* Backed by `@aws-sdk/client-s3`. Works against AWS S3 (no `endpoint`
|
|
5
|
+
* override) and against S3-compatible providers like Cloudflare R2 or
|
|
6
|
+
* MinIO when an explicit `endpoint` URL is supplied. The adapter is
|
|
7
|
+
* stateless across calls — one `S3Client` is shared per instance.
|
|
8
|
+
*
|
|
9
|
+
* Storage URI shape: `s3://<bucket>/<key>`. The bucket carried in the
|
|
10
|
+
* URI is what the adapter writes/reads; if a future operator changes
|
|
11
|
+
* `RAW_STORAGE_BUCKET`, the URIs persisted on existing rows still point
|
|
12
|
+
* at the original bucket, which is the correct semantics for moving the
|
|
13
|
+
* default bucket without orphaning historical blobs.
|
|
14
|
+
*
|
|
15
|
+
* Idempotent delete: S3 `DeleteObject` is itself idempotent (no error
|
|
16
|
+
* on missing key); `head` translates `NotFound`/`NoSuchKey` to
|
|
17
|
+
* `{exists: false}` rather than throwing.
|
|
18
|
+
*/
|
|
19
|
+
import { createHash } from 'node:crypto';
|
|
20
|
+
import { DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, PutObjectCommand, S3Client, } from '@aws-sdk/client-s3';
|
|
21
|
+
import { RawStorageUriError, } from './raw-content-store.js';
|
|
22
|
+
const PROVIDER = 's3';
|
|
23
|
+
const URI_PREFIX = 's3://';
|
|
24
|
+
/**
|
|
25
|
+
* S3 is path-addressed (`s3://<bucket>/<key>` — overwrites of the same
|
|
26
|
+
* key replace the bytes the URI resolves to), bytes are retrievable
|
|
27
|
+
* the moment `PutObject` returns (read-after-write consistent), and
|
|
28
|
+
* `DeleteObject` issues the provider's removal operation for the
|
|
29
|
+
* managed object. AtomicMemory does not assert what the bucket's
|
|
30
|
+
* versioning, object-lock, retention, or replication policies do
|
|
31
|
+
* with that delete call — those live outside the adapter contract.
|
|
32
|
+
*/
|
|
33
|
+
const CAPABILITIES = Object.freeze({
|
|
34
|
+
addressing: 'location',
|
|
35
|
+
retrievalConsistency: 'immediate',
|
|
36
|
+
deleteSemantics: 'delete',
|
|
37
|
+
supportsHead: true,
|
|
38
|
+
supportsGet: true,
|
|
39
|
+
});
|
|
40
|
+
export class S3RawContentStore {
|
|
41
|
+
provider = PROVIDER;
|
|
42
|
+
capabilities = CAPABILITIES;
|
|
43
|
+
client;
|
|
44
|
+
bucket;
|
|
45
|
+
constructor(options) {
|
|
46
|
+
if (!options.bucket)
|
|
47
|
+
throw new Error('S3RawContentStore: bucket is required');
|
|
48
|
+
if (!options.region)
|
|
49
|
+
throw new Error('S3RawContentStore: region is required');
|
|
50
|
+
this.bucket = options.bucket;
|
|
51
|
+
this.client = options.client ?? new S3Client(buildClientConfig(options));
|
|
52
|
+
}
|
|
53
|
+
async put(input) {
|
|
54
|
+
await this.client.send(new PutObjectCommand({
|
|
55
|
+
Bucket: this.bucket,
|
|
56
|
+
Key: input.key,
|
|
57
|
+
Body: input.body,
|
|
58
|
+
ContentType: input.contentType,
|
|
59
|
+
}));
|
|
60
|
+
return {
|
|
61
|
+
storageUri: `${URI_PREFIX}${this.bucket}/${input.key}`,
|
|
62
|
+
storageProvider: PROVIDER,
|
|
63
|
+
contentHash: sha256Hex(input.body),
|
|
64
|
+
sizeBytes: input.body.length,
|
|
65
|
+
status: 'stored',
|
|
66
|
+
providerMetadata: {},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async get(storageUri) {
|
|
70
|
+
const { bucket, key } = parseUri(storageUri);
|
|
71
|
+
const result = await this.client.send(new GetObjectCommand({ Bucket: bucket, Key: key }));
|
|
72
|
+
const body = await collectBody(result.Body);
|
|
73
|
+
return {
|
|
74
|
+
body,
|
|
75
|
+
metadata: {
|
|
76
|
+
contentLength: result.ContentLength ?? body.length,
|
|
77
|
+
contentType: result.ContentType ?? null,
|
|
78
|
+
contentHash: sha256Hex(body),
|
|
79
|
+
providerMetadata: extractProviderMetadata(result),
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async head(storageUri, _hints) {
|
|
84
|
+
const { bucket, key } = parseUri(storageUri);
|
|
85
|
+
try {
|
|
86
|
+
const result = await this.client.send(new HeadObjectCommand({ Bucket: bucket, Key: key }));
|
|
87
|
+
return {
|
|
88
|
+
exists: true,
|
|
89
|
+
metadata: {
|
|
90
|
+
contentLength: result.ContentLength ?? 0,
|
|
91
|
+
contentType: result.ContentType ?? null,
|
|
92
|
+
contentHash: null,
|
|
93
|
+
providerMetadata: extractProviderMetadata(result),
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
if (isNotFound(err))
|
|
99
|
+
return { exists: false, metadata: null };
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async delete(storageUri, _hints) {
|
|
104
|
+
const { bucket, key } = parseUri(storageUri);
|
|
105
|
+
try {
|
|
106
|
+
// Pre-check existence so the response distinguishes "we deleted
|
|
107
|
+
// something" from "it was already gone". S3's DeleteObject would
|
|
108
|
+
// otherwise return success in both cases.
|
|
109
|
+
const present = await this.head(storageUri);
|
|
110
|
+
if (!present.exists)
|
|
111
|
+
return { deleted: false, semantics: 'deleted' };
|
|
112
|
+
await this.client.send(new DeleteObjectCommand({ Bucket: bucket, Key: key }));
|
|
113
|
+
return { deleted: true, semantics: 'deleted' };
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
if (isNotFound(err))
|
|
117
|
+
return { deleted: false, semantics: 'deleted' };
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function buildClientConfig(options) {
|
|
123
|
+
const cfg = {
|
|
124
|
+
region: options.region,
|
|
125
|
+
credentials: {
|
|
126
|
+
accessKeyId: options.accessKeyId,
|
|
127
|
+
secretAccessKey: options.secretAccessKey,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
if (options.endpoint) {
|
|
131
|
+
cfg.endpoint = options.endpoint;
|
|
132
|
+
// R2 / MinIO require path-style addressing; AWS S3 supports it too.
|
|
133
|
+
cfg.forcePathStyle = true;
|
|
134
|
+
}
|
|
135
|
+
return cfg;
|
|
136
|
+
}
|
|
137
|
+
function parseUri(storageUri) {
|
|
138
|
+
if (!storageUri.startsWith(URI_PREFIX)) {
|
|
139
|
+
throw new RawStorageUriError(`expected s3:// URI, got: ${storageUri}`);
|
|
140
|
+
}
|
|
141
|
+
const trimmed = storageUri.slice(URI_PREFIX.length);
|
|
142
|
+
const slash = trimmed.indexOf('/');
|
|
143
|
+
if (slash <= 0 || slash === trimmed.length - 1) {
|
|
144
|
+
throw new RawStorageUriError(`malformed s3 URI: ${storageUri}`);
|
|
145
|
+
}
|
|
146
|
+
return { bucket: trimmed.slice(0, slash), key: trimmed.slice(slash + 1) };
|
|
147
|
+
}
|
|
148
|
+
function sha256Hex(buf) {
|
|
149
|
+
return createHash('sha256').update(buf).digest('hex');
|
|
150
|
+
}
|
|
151
|
+
async function collectBody(body) {
|
|
152
|
+
if (body == null)
|
|
153
|
+
return Buffer.alloc(0);
|
|
154
|
+
const candidate = body;
|
|
155
|
+
if (typeof candidate.transformToByteArray === 'function') {
|
|
156
|
+
return Buffer.from(await candidate.transformToByteArray());
|
|
157
|
+
}
|
|
158
|
+
// Fallback for already-buffered bodies (mocks/tests).
|
|
159
|
+
if (Buffer.isBuffer(body))
|
|
160
|
+
return body;
|
|
161
|
+
if (body instanceof Uint8Array)
|
|
162
|
+
return Buffer.from(body);
|
|
163
|
+
throw new Error('S3 GetObject body shape not recognized');
|
|
164
|
+
}
|
|
165
|
+
function extractProviderMetadata(result) {
|
|
166
|
+
const meta = {};
|
|
167
|
+
if (result.ETag)
|
|
168
|
+
meta.etag = result.ETag;
|
|
169
|
+
if (result.VersionId)
|
|
170
|
+
meta.versionId = result.VersionId;
|
|
171
|
+
if (result.LastModified)
|
|
172
|
+
meta.lastModified = result.LastModified.toISOString();
|
|
173
|
+
return meta;
|
|
174
|
+
}
|
|
175
|
+
function isNotFound(err) {
|
|
176
|
+
if (typeof err !== 'object' || err === null)
|
|
177
|
+
return false;
|
|
178
|
+
const e = err;
|
|
179
|
+
return e.name === 'NotFound' || e.name === 'NoSuchKey' || e.Code === 'NoSuchKey'
|
|
180
|
+
|| e.$metadata?.httpStatusCode === 404;
|
|
181
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Per-row `StorageBackend` registry — direct-storage parallel
|
|
3
|
+
* to `RawContentStoreRegistry`.
|
|
4
|
+
*
|
|
5
|
+
* The storage service's read/delete/verify paths dispatch on the
|
|
6
|
+
* artifact row's `provider` column, NOT on the deployment's active
|
|
7
|
+
* backend, so a row written when the deployment was on `local_fs`
|
|
8
|
+
* keeps working after the operator switches to `s3`. Pointer rows
|
|
9
|
+
* short-circuit before the registry is even consulted (no backend
|
|
10
|
+
* required for `mode='pointer'`); only managed rows go through
|
|
11
|
+
* `get(provider)`.
|
|
12
|
+
*
|
|
13
|
+
* Failure semantics: a managed row whose provider is not registered
|
|
14
|
+
* is an operational unavailability (the deployment dropped a
|
|
15
|
+
* provider that still has live data). The service translates the
|
|
16
|
+
* `BackendNotRegisteredError` lookup miss into HTTP 503
|
|
17
|
+
* `storage_backend_unavailable` — see `src/routes/storage.ts`. The
|
|
18
|
+
* registry itself returns `undefined`; callers MUST fail loud.
|
|
19
|
+
*/
|
|
20
|
+
import type { StorageBackend } from './storage-backend.js';
|
|
21
|
+
export interface StorageBackendRegistry {
|
|
22
|
+
/**
|
|
23
|
+
* The backend the deployment writes NEW managed artifacts to.
|
|
24
|
+
* Returns `null` when the deployment is pointer-only (no managed
|
|
25
|
+
* uploads); pointer artifacts still work because they
|
|
26
|
+
* short-circuit before backend lookup.
|
|
27
|
+
*/
|
|
28
|
+
readonly active: StorageBackend | null;
|
|
29
|
+
/**
|
|
30
|
+
* Look up the backend matching `storage_artifacts.provider`.
|
|
31
|
+
* Returns `undefined` when no adapter is registered for that
|
|
32
|
+
* provider. Callers (the storage service's read/delete/verify
|
|
33
|
+
* paths) MUST translate `undefined` into a typed error rather
|
|
34
|
+
* than fall through to the active backend.
|
|
35
|
+
*/
|
|
36
|
+
get(provider: string): StorageBackend | undefined;
|
|
37
|
+
/** True when `provider` has a registered backend in this registry. */
|
|
38
|
+
has(provider: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* `(provider, backend)` pairs the registry knows about. Iteration
|
|
41
|
+
* order is the order providers were registered (active first,
|
|
42
|
+
* then legacy adapters).
|
|
43
|
+
*/
|
|
44
|
+
readonly entries: ReadonlyArray<readonly [string, StorageBackend]>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Build a backend registry from the active backend + optional
|
|
48
|
+
* legacy read-only adapters. `active` is `null` for pointer-only
|
|
49
|
+
* deployments. Throws when the same provider id is registered
|
|
50
|
+
* twice; that's a composition bug the caller must fix.
|
|
51
|
+
*/
|
|
52
|
+
export declare function buildBackendRegistry(active: StorageBackend | null, legacy?: ReadonlyArray<StorageBackend>): StorageBackendRegistry;
|
|
53
|
+
/**
|
|
54
|
+
* Convenience for unit tests + single-provider deployments. Wraps
|
|
55
|
+
* one already-constructed backend (or `null` for pointer-only) in a
|
|
56
|
+
* registry with no legacy entries.
|
|
57
|
+
*/
|
|
58
|
+
export declare function singleBackendRegistry(backend: StorageBackend | null): StorageBackendRegistry;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Per-row `StorageBackend` registry — direct-storage parallel
|
|
3
|
+
* to `RawContentStoreRegistry`.
|
|
4
|
+
*
|
|
5
|
+
* The storage service's read/delete/verify paths dispatch on the
|
|
6
|
+
* artifact row's `provider` column, NOT on the deployment's active
|
|
7
|
+
* backend, so a row written when the deployment was on `local_fs`
|
|
8
|
+
* keeps working after the operator switches to `s3`. Pointer rows
|
|
9
|
+
* short-circuit before the registry is even consulted (no backend
|
|
10
|
+
* required for `mode='pointer'`); only managed rows go through
|
|
11
|
+
* `get(provider)`.
|
|
12
|
+
*
|
|
13
|
+
* Failure semantics: a managed row whose provider is not registered
|
|
14
|
+
* is an operational unavailability (the deployment dropped a
|
|
15
|
+
* provider that still has live data). The service translates the
|
|
16
|
+
* `BackendNotRegisteredError` lookup miss into HTTP 503
|
|
17
|
+
* `storage_backend_unavailable` — see `src/routes/storage.ts`. The
|
|
18
|
+
* registry itself returns `undefined`; callers MUST fail loud.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Build a backend registry from the active backend + optional
|
|
22
|
+
* legacy read-only adapters. `active` is `null` for pointer-only
|
|
23
|
+
* deployments. Throws when the same provider id is registered
|
|
24
|
+
* twice; that's a composition bug the caller must fix.
|
|
25
|
+
*/
|
|
26
|
+
export function buildBackendRegistry(active, legacy = []) {
|
|
27
|
+
const map = new Map();
|
|
28
|
+
if (active)
|
|
29
|
+
map.set(active.provider, active);
|
|
30
|
+
for (const backend of legacy) {
|
|
31
|
+
if (map.has(backend.provider)) {
|
|
32
|
+
throw new Error(`StorageBackendRegistry: provider '${backend.provider}' is registered twice. ` +
|
|
33
|
+
`Active='${active?.provider ?? 'none'}', legacy contains a duplicate.`);
|
|
34
|
+
}
|
|
35
|
+
map.set(backend.provider, backend);
|
|
36
|
+
}
|
|
37
|
+
const entries = Array.from(map.entries());
|
|
38
|
+
return {
|
|
39
|
+
active,
|
|
40
|
+
entries,
|
|
41
|
+
get(provider) {
|
|
42
|
+
return map.get(provider);
|
|
43
|
+
},
|
|
44
|
+
has(provider) {
|
|
45
|
+
return map.has(provider);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Convenience for unit tests + single-provider deployments. Wraps
|
|
51
|
+
* one already-constructed backend (or `null` for pointer-only) in a
|
|
52
|
+
* registry with no legacy entries.
|
|
53
|
+
*/
|
|
54
|
+
export function singleBackendRegistry(backend) {
|
|
55
|
+
return buildBackendRegistry(backend, []);
|
|
56
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Backend abstraction the storage service writes through.
|
|
3
|
+
*
|
|
4
|
+
* Step 5 of the storage-sibling plan. Adapter, not rewrite: existing
|
|
5
|
+
* `RawContentStore` providers (`local_fs`, `s3`, `filecoin`) stay
|
|
6
|
+
* intact; `raw-content-store-backend-adapter.ts` exposes them as a
|
|
7
|
+
* `StorageBackend` for the storage service so the service never
|
|
8
|
+
* needs to know which adapter shape it is talking to.
|
|
9
|
+
*
|
|
10
|
+
* The backend handles managed-mode I/O only. Pointer-mode artifacts
|
|
11
|
+
* are metadata-only and live entirely in the database — the storage
|
|
12
|
+
* service NEVER calls a backend method against a pointer URI.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Concrete result of a `put` against a managed backend. The service
|
|
16
|
+
* persists every field on the `storage_artifacts` row.
|
|
17
|
+
*/
|
|
18
|
+
export interface PutBackendResult {
|
|
19
|
+
/** Adapter-returned URI we persist on `storage_artifacts.uri`. */
|
|
20
|
+
uri: string;
|
|
21
|
+
/** Bytes actually persisted. Equals the input body length. */
|
|
22
|
+
sizeBytes: number;
|
|
23
|
+
/**
|
|
24
|
+
* Plaintext SHA-256 of the caller bytes. For the `identity` codec
|
|
25
|
+
* (v1 default for `local_fs` and `s3`) this equals `storedHash`.
|
|
26
|
+
* Always computed; exposed on the wire only when the caller opted
|
|
27
|
+
* into `disclose_content_hash` at put time.
|
|
28
|
+
*/
|
|
29
|
+
plaintextHash: string;
|
|
30
|
+
/**
|
|
31
|
+
* SHA-256 of the bytes the adapter actually wrote. For the
|
|
32
|
+
* `aes_gcm` codec this is the ciphertext hash (Filecoin lifecycle)
|
|
33
|
+
* and is NEVER on the wire. v1 keeps Filecoin direct uploads
|
|
34
|
+
* behind a 501, so identity-codec equality is the typical case.
|
|
35
|
+
*/
|
|
36
|
+
storedHash: string;
|
|
37
|
+
/** Free-form provider sidecar; the service redacts before exposing. */
|
|
38
|
+
providerMetadata: Record<string, unknown>;
|
|
39
|
+
}
|
|
40
|
+
export interface PutBackendInput {
|
|
41
|
+
/** Owner-namespaced storage key (e.g. `s/<hmac-hex32>/<artifact-id>.bin`). */
|
|
42
|
+
key: string;
|
|
43
|
+
body: Buffer;
|
|
44
|
+
contentType: string;
|
|
45
|
+
}
|
|
46
|
+
export interface GetBackendResult {
|
|
47
|
+
body: Buffer;
|
|
48
|
+
contentType: string | null;
|
|
49
|
+
sizeBytes: number;
|
|
50
|
+
}
|
|
51
|
+
export interface HeadBackendResult {
|
|
52
|
+
exists: boolean;
|
|
53
|
+
sizeBytes: number | null;
|
|
54
|
+
contentType: string | null;
|
|
55
|
+
}
|
|
56
|
+
export interface DeleteBackendResult {
|
|
57
|
+
/** `true` when bytes were removed; `false` for already-missing keys. */
|
|
58
|
+
deleted: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* What the adapter's `delete` did at the provider boundary:
|
|
61
|
+
* - `'deleted'` — `local_fs` / `s3` removed the object.
|
|
62
|
+
* - `'unpinned'` — provider supports unpin-only (Filecoin).
|
|
63
|
+
* - `'tombstoned'` — decentralized network: we stopped managing
|
|
64
|
+
* the bytes but the network may still serve.
|
|
65
|
+
* Drives the cleanup-side terminal raw_storage_status selection
|
|
66
|
+
* (`blob_deleted` vs `blob_tombstoned`) and the artifact-delete
|
|
67
|
+
* cascade in `StorageService.deleteArtifact`.
|
|
68
|
+
*/
|
|
69
|
+
semantics: 'deleted' | 'unpinned' | 'tombstoned';
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Provider-agnostic managed-storage I/O surface the service depends
|
|
73
|
+
* on. Adapters live alongside this file (`raw-content-store-backend-adapter.ts`).
|
|
74
|
+
*/
|
|
75
|
+
export interface StorageBackend {
|
|
76
|
+
/** Provider id; matches `RawContentStore.provider`. */
|
|
77
|
+
readonly provider: string;
|
|
78
|
+
put(input: PutBackendInput): Promise<PutBackendResult>;
|
|
79
|
+
get(uri: string): Promise<GetBackendResult>;
|
|
80
|
+
head(uri: string): Promise<HeadBackendResult>;
|
|
81
|
+
delete(uri: string): Promise<DeleteBackendResult>;
|
|
82
|
+
}
|