@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,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Filecoin provider-internal metadata allowlist + denylist.
|
|
3
|
+
*
|
|
4
|
+
* The public projector lives in
|
|
5
|
+
* `src/storage/filecoin-public-metadata.ts` so routes / services
|
|
6
|
+
* don't have to import `providers/filecoin/*` directly. What
|
|
7
|
+
* remains here is provider-internal:
|
|
8
|
+
*
|
|
9
|
+
* - `buildFilecoinMetadata(input)` produces the closed-shape
|
|
10
|
+
* Synapse piece-metadata envelope upload calls may pass through.
|
|
11
|
+
* Synapse's `METADATA_LIMITS.MAX_KEYS_PER_PIECE`
|
|
12
|
+
* is 5 (per docs.filecoin.cloud/reference/filoz/synapse-core/
|
|
13
|
+
* utils/variables/metadata_limits/); this builder enforces the
|
|
14
|
+
* cap so an over-allowed envelope cannot reach Synapse and
|
|
15
|
+
* fail mid-upload. Key length is also capped at the documented
|
|
16
|
+
* 32 chars and string values at 128 chars.
|
|
17
|
+
* - The allowlist, denylist, and reserved-prefix constants the
|
|
18
|
+
* upload + central config validators share (config.ts's
|
|
19
|
+
* DATA_SET_METADATA validation reads from the same constants
|
|
20
|
+
* and applies the dataset-side limits 10 / 32 / 128).
|
|
21
|
+
*
|
|
22
|
+
* Upload-side safety rule: this module NEVER lets private keys,
|
|
23
|
+
* wallet addresses, payment-rail state, signed requests, auth
|
|
24
|
+
* headers, UCAN proofs, raw Synapse responses, or any other key on
|
|
25
|
+
* the denylist reach the provider. Reserved prefixes
|
|
26
|
+
* (`atomicmemory.`, `synapse.`, `filecoin.`, `_`) are rejected as
|
|
27
|
+
* caller-supplied keys.
|
|
28
|
+
*
|
|
29
|
+
* Read-side projection — what survives onto the public wire when
|
|
30
|
+
* reading `raw_documents.raw_storage_metadata.filecoin` back — is
|
|
31
|
+
* the shared module's job (`projectFilecoinPublicMetadata`). The
|
|
32
|
+
* internal `copies: [{ provider_id, status }]` shape flattens to
|
|
33
|
+
* scalar `copy_count` / `provider_ids` / `copy_statuses` over
|
|
34
|
+
* there.
|
|
35
|
+
*/
|
|
36
|
+
export const ALLOWED_FILECOIN_METADATA_KEYS = [
|
|
37
|
+
'artifact_id',
|
|
38
|
+
'storage_profile_id',
|
|
39
|
+
'content_type',
|
|
40
|
+
'stored_hash',
|
|
41
|
+
'codec_name',
|
|
42
|
+
'codec_version',
|
|
43
|
+
'codec_key_id',
|
|
44
|
+
'source_kind',
|
|
45
|
+
];
|
|
46
|
+
/**
|
|
47
|
+
* Closed denylist — keys / shapes `buildFilecoinMetadata` MUST
|
|
48
|
+
* reject if a caller (or a stray test fixture) tries to push them
|
|
49
|
+
* onto a Filecoin upload. The list pins items that, if leaked
|
|
50
|
+
* through `provider_metadata` or `data_set_metadata`, would expose
|
|
51
|
+
* secrets or sensitive operational state.
|
|
52
|
+
*/
|
|
53
|
+
export const FILECOIN_METADATA_DENYLIST = [
|
|
54
|
+
'private_key',
|
|
55
|
+
'wallet_address',
|
|
56
|
+
'payment_rail',
|
|
57
|
+
'rail_id',
|
|
58
|
+
'signed_request',
|
|
59
|
+
'authorization',
|
|
60
|
+
'auth_header',
|
|
61
|
+
'ucan_proof',
|
|
62
|
+
'synapse_response',
|
|
63
|
+
'raw_synapse_payload',
|
|
64
|
+
];
|
|
65
|
+
export const FILECOIN_METADATA_RESERVED_PREFIXES = [
|
|
66
|
+
'atomicmemory.',
|
|
67
|
+
'synapse.',
|
|
68
|
+
'filecoin.',
|
|
69
|
+
'_',
|
|
70
|
+
];
|
|
71
|
+
const ALLOWED_KEY_SET = new Set(ALLOWED_FILECOIN_METADATA_KEYS);
|
|
72
|
+
const DENY_KEY_SET = new Set(FILECOIN_METADATA_DENYLIST);
|
|
73
|
+
/**
|
|
74
|
+
* Mirrored from Synapse's `METADATA_LIMITS` (per
|
|
75
|
+
* docs.filecoin.cloud/reference/filoz/synapse-core/utils/variables/
|
|
76
|
+
* metadata_limits/). The dataset-side limits (10 keys) live in
|
|
77
|
+
* `./config.ts`; the piece-side limits (5 keys) live here because
|
|
78
|
+
* `buildFilecoinMetadata` produces the per-piece envelope.
|
|
79
|
+
*/
|
|
80
|
+
const MAX_PIECE_METADATA_KEYS = 5;
|
|
81
|
+
const MAX_PIECE_METADATA_KEY_LENGTH = 32;
|
|
82
|
+
const MAX_PIECE_METADATA_VALUE_LENGTH = 128;
|
|
83
|
+
/**
|
|
84
|
+
* Project caller-supplied metadata down to the allowlisted closed
|
|
85
|
+
* envelope, enforcing Synapse's per-piece limits (≤5 entries, ≤32
|
|
86
|
+
* char keys, ≤128 char string values). Throws on denylisted keys,
|
|
87
|
+
* reserved-prefix keys, non-scalar values, over-long strings, or
|
|
88
|
+
* an output that would exceed the 5-key cap. Unknown (non-
|
|
89
|
+
* allowlisted, non-denylisted) keys are silently dropped — fail-
|
|
90
|
+
* open on inputs we don't understand would surface secrets on a
|
|
91
|
+
* future contributor's keystroke.
|
|
92
|
+
*/
|
|
93
|
+
export function buildFilecoinMetadata(input) {
|
|
94
|
+
const out = {};
|
|
95
|
+
let count = 0;
|
|
96
|
+
for (const [key, value] of Object.entries(input)) {
|
|
97
|
+
rejectReservedOrDeniedKey(key);
|
|
98
|
+
if (!ALLOWED_KEY_SET.has(key))
|
|
99
|
+
continue;
|
|
100
|
+
if (key.length > MAX_PIECE_METADATA_KEY_LENGTH) {
|
|
101
|
+
throw new Error(`Filecoin metadata key '${key}' exceeds Synapse MAX_KEY_LENGTH ` +
|
|
102
|
+
`(${MAX_PIECE_METADATA_KEY_LENGTH}).`);
|
|
103
|
+
}
|
|
104
|
+
if (count >= MAX_PIECE_METADATA_KEYS) {
|
|
105
|
+
throw new Error(`Filecoin piece metadata would exceed Synapse MAX_KEYS_PER_PIECE ` +
|
|
106
|
+
`(${MAX_PIECE_METADATA_KEYS}). Drop entries before calling buildFilecoinMetadata.`);
|
|
107
|
+
}
|
|
108
|
+
out[key] = coerceLeaf(key, value);
|
|
109
|
+
count += 1;
|
|
110
|
+
}
|
|
111
|
+
return out;
|
|
112
|
+
}
|
|
113
|
+
function rejectReservedOrDeniedKey(key) {
|
|
114
|
+
for (const prefix of FILECOIN_METADATA_RESERVED_PREFIXES) {
|
|
115
|
+
if (key.startsWith(prefix)) {
|
|
116
|
+
throw new Error(`Filecoin metadata key '${key}' uses reserved prefix '${prefix}'.`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (DENY_KEY_SET.has(key.toLowerCase())) {
|
|
120
|
+
throw new Error(`Filecoin metadata key '${key}' is denylisted.`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function coerceLeaf(key, value) {
|
|
124
|
+
if (typeof value === 'string') {
|
|
125
|
+
if (value.length > MAX_PIECE_METADATA_VALUE_LENGTH) {
|
|
126
|
+
throw new Error(`Filecoin metadata value for '${key}' exceeds Synapse ` +
|
|
127
|
+
`MAX_VALUE_LENGTH (${MAX_PIECE_METADATA_VALUE_LENGTH}, got ${value.length}).`);
|
|
128
|
+
}
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
132
|
+
return value;
|
|
133
|
+
if (typeof value === 'boolean')
|
|
134
|
+
return value;
|
|
135
|
+
throw new Error(`Filecoin metadata value for '${key}' must be a scalar ` +
|
|
136
|
+
'(string, finite number, or boolean).');
|
|
137
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Synapse-SDK-backed PieceCID parser for the provider
|
|
3
|
+
* boundary.
|
|
4
|
+
*
|
|
5
|
+
* The shared validator (`src/storage/filecoin-cid-validation.ts`)
|
|
6
|
+
* is intentionally a structural-shape regex with no codec
|
|
7
|
+
* awareness. It exists so the public-projection seam can silently
|
|
8
|
+
* drop adversarial JSONB without dynamically loading the Filecoin
|
|
9
|
+
* SDK at startup (the eager-import path runs even when
|
|
10
|
+
* `RAW_STORAGE_PROVIDER !== 'filecoin'`).
|
|
11
|
+
*
|
|
12
|
+
* The provider boundary is the OPPOSITE trust seam: anything that
|
|
13
|
+
* crosses `parsePieceUri` / `formatPieceUri` /
|
|
14
|
+
* `FilecoinRawContentStore.put` must match the real PieceCIDv2
|
|
15
|
+
* grammar the rest of the Synapse pipeline operates on — CIDv1,
|
|
16
|
+
* raw codec (0x55), multihash code 0x1011
|
|
17
|
+
* (`fr32-sha2-256-trunc254-padded-binary-tree` from
|
|
18
|
+
* `@web3-storage/data-segment`). A string that merely "looks like"
|
|
19
|
+
* a PieceCID but cannot round-trip through the SDK would be
|
|
20
|
+
* persisted only to fail downstream at `head` / `get` / `delete`
|
|
21
|
+
* with a vendor-shaped error that callers can't sanitize.
|
|
22
|
+
*
|
|
23
|
+
* This module sits inside the provider directory and is reached
|
|
24
|
+
* only through the lazy provider-load graph established in Phase
|
|
25
|
+
* 2 — importing it does NOT pull the Synapse SDK into a non-
|
|
26
|
+
* Filecoin-provider startup. The wrapper is intentionally
|
|
27
|
+
* minimal: it just translates the SDK's `asPieceCID(...) | null`
|
|
28
|
+
* contract into a typed `FilecoinProviderError('invalid_piece_cid',
|
|
29
|
+
* ...)` with a sanitized message (no value echo) so callers
|
|
30
|
+
* never surface vendor stack traces.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Returns the SDK's canonical string form of `value` as a
|
|
34
|
+
* PieceCIDv2, or throws `FilecoinProviderError('invalid_piece_cid',
|
|
35
|
+
* ...)` with a sanitized message when the value is not a string,
|
|
36
|
+
* not a parsable CID, or is a CID that does not satisfy
|
|
37
|
+
* `isPieceCID` (codec/multihash/version).
|
|
38
|
+
*
|
|
39
|
+
* Used at trust seams where a malformed value must NOT be
|
|
40
|
+
* persisted (URI parser, URI formatter, upload result mapper).
|
|
41
|
+
* `context` is a short noun-phrase that names the seam the
|
|
42
|
+
* caller is guarding (e.g. `"upload result"`, `"storage URI"`).
|
|
43
|
+
* The value itself is NEVER echoed into the error message —
|
|
44
|
+
* malformed CIDs may encode adversarial bytes worth keeping out
|
|
45
|
+
* of log streams. The closed-set `errorCode` is the diagnostic
|
|
46
|
+
* surface.
|
|
47
|
+
*/
|
|
48
|
+
export declare function requirePieceCid(value: unknown, context: string): string;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Synapse-SDK-backed PieceCID parser for the provider
|
|
3
|
+
* boundary.
|
|
4
|
+
*
|
|
5
|
+
* The shared validator (`src/storage/filecoin-cid-validation.ts`)
|
|
6
|
+
* is intentionally a structural-shape regex with no codec
|
|
7
|
+
* awareness. It exists so the public-projection seam can silently
|
|
8
|
+
* drop adversarial JSONB without dynamically loading the Filecoin
|
|
9
|
+
* SDK at startup (the eager-import path runs even when
|
|
10
|
+
* `RAW_STORAGE_PROVIDER !== 'filecoin'`).
|
|
11
|
+
*
|
|
12
|
+
* The provider boundary is the OPPOSITE trust seam: anything that
|
|
13
|
+
* crosses `parsePieceUri` / `formatPieceUri` /
|
|
14
|
+
* `FilecoinRawContentStore.put` must match the real PieceCIDv2
|
|
15
|
+
* grammar the rest of the Synapse pipeline operates on — CIDv1,
|
|
16
|
+
* raw codec (0x55), multihash code 0x1011
|
|
17
|
+
* (`fr32-sha2-256-trunc254-padded-binary-tree` from
|
|
18
|
+
* `@web3-storage/data-segment`). A string that merely "looks like"
|
|
19
|
+
* a PieceCID but cannot round-trip through the SDK would be
|
|
20
|
+
* persisted only to fail downstream at `head` / `get` / `delete`
|
|
21
|
+
* with a vendor-shaped error that callers can't sanitize.
|
|
22
|
+
*
|
|
23
|
+
* This module sits inside the provider directory and is reached
|
|
24
|
+
* only through the lazy provider-load graph established in Phase
|
|
25
|
+
* 2 — importing it does NOT pull the Synapse SDK into a non-
|
|
26
|
+
* Filecoin-provider startup. The wrapper is intentionally
|
|
27
|
+
* minimal: it just translates the SDK's `asPieceCID(...) | null`
|
|
28
|
+
* contract into a typed `FilecoinProviderError('invalid_piece_cid',
|
|
29
|
+
* ...)` with a sanitized message (no value echo) so callers
|
|
30
|
+
* never surface vendor stack traces.
|
|
31
|
+
*/
|
|
32
|
+
import { asPieceCID } from '@filoz/synapse-core/piece';
|
|
33
|
+
import { FilecoinProviderError } from './errors.js';
|
|
34
|
+
/**
|
|
35
|
+
* Returns the SDK's canonical string form of `value` as a
|
|
36
|
+
* PieceCIDv2, or throws `FilecoinProviderError('invalid_piece_cid',
|
|
37
|
+
* ...)` with a sanitized message when the value is not a string,
|
|
38
|
+
* not a parsable CID, or is a CID that does not satisfy
|
|
39
|
+
* `isPieceCID` (codec/multihash/version).
|
|
40
|
+
*
|
|
41
|
+
* Used at trust seams where a malformed value must NOT be
|
|
42
|
+
* persisted (URI parser, URI formatter, upload result mapper).
|
|
43
|
+
* `context` is a short noun-phrase that names the seam the
|
|
44
|
+
* caller is guarding (e.g. `"upload result"`, `"storage URI"`).
|
|
45
|
+
* The value itself is NEVER echoed into the error message —
|
|
46
|
+
* malformed CIDs may encode adversarial bytes worth keeping out
|
|
47
|
+
* of log streams. The closed-set `errorCode` is the diagnostic
|
|
48
|
+
* surface.
|
|
49
|
+
*/
|
|
50
|
+
export function requirePieceCid(value, context) {
|
|
51
|
+
if (typeof value === 'string') {
|
|
52
|
+
const parsed = asPieceCID(value);
|
|
53
|
+
if (parsed !== null)
|
|
54
|
+
return parsed.toString();
|
|
55
|
+
}
|
|
56
|
+
throw new FilecoinProviderError('invalid_piece_cid', `Filecoin ${context} carries a value that is not a valid PieceCIDv2.`);
|
|
57
|
+
}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Filecoin provider-client interface — the seam between the
|
|
3
|
+
* `RawContentStore` adapter and any vendor-specific Filecoin client.
|
|
4
|
+
*
|
|
5
|
+
* The interface admits two drivers today (`FilecoinDriverName =
|
|
6
|
+
* 'synapse' | 'filecoin_pin'`). The default is `'synapse'`,
|
|
7
|
+
* backed by `@filoz/synapse-sdk` directly; the Phase 5 opt-in
|
|
8
|
+
* `'filecoin_pin'` driver is backed by `filecoin-pin/core/upload`
|
|
9
|
+
* and composes the Synapse client for non-CAR-first operations.
|
|
10
|
+
* The closed-union type forces every new driver to be a literal-
|
|
11
|
+
* by-literal addition; never widen it to plain `string`.
|
|
12
|
+
*
|
|
13
|
+
* Boundary rules:
|
|
14
|
+
*
|
|
15
|
+
* - The wrapper `backend.ts` is the ONLY caller of these methods.
|
|
16
|
+
* The reconciler, the route layer, and the service layer never
|
|
17
|
+
* talk to a `FilecoinProviderClient` directly.
|
|
18
|
+
* - Inputs and outputs are AtomicMemory-shaped, NOT Synapse-shaped.
|
|
19
|
+
* Mapping happens inside the concrete client
|
|
20
|
+
* (`synapse-client.ts`); vendor types never escape
|
|
21
|
+
* `providers/filecoin/`.
|
|
22
|
+
* - Sanitization (see `errors.ts`): any vendor error a client
|
|
23
|
+
* catches must be replaced with a `FilecoinProviderError` whose
|
|
24
|
+
* `errorCode` is one of the documented stable codes. Raw vendor
|
|
25
|
+
* messages do not escape.
|
|
26
|
+
*/
|
|
27
|
+
export interface FilecoinCopySnapshot {
|
|
28
|
+
/** SP identifier (stringified bigint — JSON cannot carry bigint). */
|
|
29
|
+
readonly providerId: string;
|
|
30
|
+
/** Data-set identifier this copy lives in (stringified bigint). */
|
|
31
|
+
readonly dataSetId: string;
|
|
32
|
+
/**
|
|
33
|
+
* Piece-id within the data set (stringified positive decimal
|
|
34
|
+
* bigint). OMITTED when the underlying driver returned a
|
|
35
|
+
* sentinel/non-positive value: filecoin-pin's `executeUpload`
|
|
36
|
+
* can return `pieceId === 0n` for copies that have been stored
|
|
37
|
+
* at the SP but not yet confirmed at the data-set, and writing
|
|
38
|
+
* the raw `'0'` into the sidecar would later trip the hint
|
|
39
|
+
* reader's positive-decimal-bigint validator and emit a
|
|
40
|
+
* spurious `filecoin.hint.malformed` diagnostic on every
|
|
41
|
+
* delete. Absent is silently skipped; only positive values are
|
|
42
|
+
* carried.
|
|
43
|
+
*/
|
|
44
|
+
readonly pieceId?: string;
|
|
45
|
+
/** `'primary'` (uploaded direct) or `'secondary'` (pulled SP→SP). */
|
|
46
|
+
readonly role: 'primary' | 'secondary';
|
|
47
|
+
}
|
|
48
|
+
export interface FilecoinFailedAttempt {
|
|
49
|
+
readonly providerId: string;
|
|
50
|
+
readonly role: 'primary' | 'secondary';
|
|
51
|
+
/** Sanitized error code; never the raw vendor message. */
|
|
52
|
+
readonly errorCode: string;
|
|
53
|
+
/** Whether the caller explicitly pinned the provider (no retry). */
|
|
54
|
+
readonly explicit: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface FilecoinPutInput {
|
|
57
|
+
/**
|
|
58
|
+
* Storage-key prefix the upload pipeline computed (PII-safe HMAC).
|
|
59
|
+
* The Synapse client does not consume this directly — the SDK
|
|
60
|
+
* routes by data set, not key — but the adapter still propagates
|
|
61
|
+
* it for shared observability/metrics with the immediate
|
|
62
|
+
* providers.
|
|
63
|
+
*/
|
|
64
|
+
readonly key: string;
|
|
65
|
+
/** Bytes to upload. The Synapse SDK accepts `Uint8Array | ReadableStream`. */
|
|
66
|
+
readonly body: Buffer;
|
|
67
|
+
readonly contentType?: string;
|
|
68
|
+
/**
|
|
69
|
+
* Optional sanitized per-piece metadata produced by
|
|
70
|
+
* `metadata.ts:buildFilecoinMetadata`. Caller is responsible for
|
|
71
|
+
* staying under Synapse's `MAX_KEYS_PER_PIECE` cap. The adapter
|
|
72
|
+
* passes this through to `StorageManager.upload`'s
|
|
73
|
+
* `pieceMetadata` option as string-only entries.
|
|
74
|
+
*/
|
|
75
|
+
readonly pieceMetadata?: Readonly<Record<string, string>>;
|
|
76
|
+
/** Per-call timeout (ms); the adapter wires this to an `AbortSignal`. */
|
|
77
|
+
readonly timeoutMs?: number;
|
|
78
|
+
}
|
|
79
|
+
export interface FilecoinPutResult {
|
|
80
|
+
/** PieceCID stringified for stable serialization across logs/storage. */
|
|
81
|
+
readonly pieceCid: string;
|
|
82
|
+
/**
|
|
83
|
+
* Canonical storage URI persisted on the row, of the form
|
|
84
|
+
* `filecoin://piece/<pieceCid>`.
|
|
85
|
+
*/
|
|
86
|
+
readonly storageUri: string;
|
|
87
|
+
/** Bytes the SDK reported as stored (post-padding). */
|
|
88
|
+
readonly sizeBytes: number;
|
|
89
|
+
/** Successful copies reported by `UploadResult.copies`. */
|
|
90
|
+
readonly copies: ReadonlyArray<FilecoinCopySnapshot>;
|
|
91
|
+
/** Sanitized failed attempts from `UploadResult.failedAttempts`. */
|
|
92
|
+
readonly failedAttempts: ReadonlyArray<FilecoinFailedAttempt>;
|
|
93
|
+
/** `true` iff every requested copy succeeded. */
|
|
94
|
+
readonly complete: boolean;
|
|
95
|
+
/** Copy count the caller requested (echoed from the SDK). */
|
|
96
|
+
readonly requestedCopies: number;
|
|
97
|
+
/**
|
|
98
|
+
* Optional IPFS / CAR-root CID (CIDv1, any IPLD codec) the
|
|
99
|
+
* driver derived alongside the PieceCID. The live Synapse
|
|
100
|
+
* driver leaves this `undefined` today; the filecoin-pin
|
|
101
|
+
* driver (Phase 5) is expected to populate it so consumers
|
|
102
|
+
* can resolve content via IPFS gateways without re-deriving
|
|
103
|
+
* the CID from bytes. The adapter validates the value via
|
|
104
|
+
* `requireIpfsCid` (real `multiformats/cid` parse), persists
|
|
105
|
+
* the canonical multibase form under
|
|
106
|
+
* `raw_storage_metadata.filecoin.ipfs_cid`, and projects it
|
|
107
|
+
* publicly as `ipfs_cid`. The canonical AtomicMemory storage
|
|
108
|
+
* URI stays `filecoin://piece/<canonicalPieceCid>` regardless —
|
|
109
|
+
* `ipfsCid` does NOT change row identity.
|
|
110
|
+
*/
|
|
111
|
+
readonly ipfsCid?: string;
|
|
112
|
+
}
|
|
113
|
+
export interface FilecoinGetInput {
|
|
114
|
+
readonly storageUri: string;
|
|
115
|
+
readonly timeoutMs?: number;
|
|
116
|
+
}
|
|
117
|
+
export interface FilecoinGetResult {
|
|
118
|
+
readonly body: Buffer;
|
|
119
|
+
/**
|
|
120
|
+
* Bounded provider metadata that survived public projection. The
|
|
121
|
+
* adapter does NOT echo the full SDK download result back — it
|
|
122
|
+
* only carries the piece identity for the reconciler.
|
|
123
|
+
*/
|
|
124
|
+
readonly providerMetadata: Record<string, unknown>;
|
|
125
|
+
}
|
|
126
|
+
export interface FilecoinHeadInput {
|
|
127
|
+
readonly storageUri: string;
|
|
128
|
+
/**
|
|
129
|
+
* Optional hint for which data set holds the piece. When omitted
|
|
130
|
+
* the adapter consults `StorageManager.findDataSets` to locate
|
|
131
|
+
* the right context.
|
|
132
|
+
*/
|
|
133
|
+
readonly dataSetId?: string;
|
|
134
|
+
}
|
|
135
|
+
export interface FilecoinHeadResult {
|
|
136
|
+
readonly exists: boolean;
|
|
137
|
+
/**
|
|
138
|
+
* `true` once the piece is retrievable AND the data set's most
|
|
139
|
+
* recent proof has been accepted. Bounded so the reconciler can
|
|
140
|
+
* promote `blob_pending → blob_available` without exposing the
|
|
141
|
+
* full PDP cycle state on the public wire.
|
|
142
|
+
*/
|
|
143
|
+
readonly proven: boolean;
|
|
144
|
+
readonly providerMetadata: Record<string, unknown>;
|
|
145
|
+
}
|
|
146
|
+
export interface FilecoinDeleteInput {
|
|
147
|
+
readonly storageUri: string;
|
|
148
|
+
readonly dataSetId?: string;
|
|
149
|
+
/**
|
|
150
|
+
* Positive decimal bigint string carrying the per-copy
|
|
151
|
+
* `piece_id` Synapse assigned at upload time (see
|
|
152
|
+
* `UploadResult.copies[].pieceId` and the sidecar
|
|
153
|
+
* `raw_storage_metadata.filecoin.copies[].piece_id`). When
|
|
154
|
+
* supplied, the Synapse driver issues
|
|
155
|
+
* `deletePiece({ piece: BigInt(pieceId) })` against the
|
|
156
|
+
* resolved data-set context. This bypasses the SDK's
|
|
157
|
+
* CID→active-piece lookup, which cannot resolve freshly
|
|
158
|
+
* uploaded pieces before PDP proof lands — the lookup path
|
|
159
|
+
* is the failure mode the live calibration smoke surfaced.
|
|
160
|
+
*/
|
|
161
|
+
readonly pieceId?: string;
|
|
162
|
+
}
|
|
163
|
+
export interface FilecoinDeleteResult {
|
|
164
|
+
readonly deleted: boolean;
|
|
165
|
+
readonly semantics: 'tombstone' | 'unpin' | 'delete';
|
|
166
|
+
/**
|
|
167
|
+
* Hex transaction hash of the scheduled-removal tx, when the
|
|
168
|
+
* provider returned one. `undefined` is reported as
|
|
169
|
+
* `already-scheduled` semantics.
|
|
170
|
+
*/
|
|
171
|
+
readonly txHash?: string;
|
|
172
|
+
}
|
|
173
|
+
export interface FilecoinVerifyInput {
|
|
174
|
+
readonly storageUri: string;
|
|
175
|
+
readonly expectedContentHash: string;
|
|
176
|
+
readonly timeoutMs?: number;
|
|
177
|
+
}
|
|
178
|
+
export interface FilecoinVerifyResult {
|
|
179
|
+
readonly verified: boolean;
|
|
180
|
+
readonly reason?: string;
|
|
181
|
+
}
|
|
182
|
+
export type FilecoinReadinessNetwork = 'calibration' | 'mainnet';
|
|
183
|
+
export type FilecoinReadinessStatus = 'passed' | 'failed' | 'unknown';
|
|
184
|
+
/**
|
|
185
|
+
* Closed-shape readiness probe entry. Errors are reported via the
|
|
186
|
+
* opaque `errorCode` from a documented stable set — raw vendor
|
|
187
|
+
* messages, wallet addresses, allowances, and provider auth
|
|
188
|
+
* payloads do NOT cross this boundary.
|
|
189
|
+
*/
|
|
190
|
+
export interface FilecoinReadinessCheck {
|
|
191
|
+
readonly name: string;
|
|
192
|
+
readonly status: FilecoinReadinessStatus;
|
|
193
|
+
readonly errorCode?: string;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Closed union of accepted driver names. New drivers MUST be added
|
|
197
|
+
* to this union literal-by-literal so exhaustive `switch (driver)`
|
|
198
|
+
* coverage stays compiler-enforced. NEVER widen this to plain
|
|
199
|
+
* `string` — that would forfeit the exhaustiveness invariant the
|
|
200
|
+
* harvest plan §Virtues 1 calls out. Adding a new value here is a
|
|
201
|
+
* type-level capability gate; runtime acceptance is gated
|
|
202
|
+
* separately by `parseFilecoinProviderConfig` in `config.ts`.
|
|
203
|
+
*/
|
|
204
|
+
export type FilecoinDriverName = 'synapse' | 'filecoin_pin';
|
|
205
|
+
export interface FilecoinProviderClient {
|
|
206
|
+
readonly provider: 'filecoin';
|
|
207
|
+
readonly driver: FilecoinDriverName;
|
|
208
|
+
put(input: FilecoinPutInput): Promise<FilecoinPutResult>;
|
|
209
|
+
get(input: FilecoinGetInput): Promise<FilecoinGetResult>;
|
|
210
|
+
head(input: FilecoinHeadInput): Promise<FilecoinHeadResult>;
|
|
211
|
+
delete(input: FilecoinDeleteInput): Promise<FilecoinDeleteResult>;
|
|
212
|
+
verify(input: FilecoinVerifyInput): Promise<FilecoinVerifyResult>;
|
|
213
|
+
/**
|
|
214
|
+
* Non-mutating readiness probe used by the factory and (later)
|
|
215
|
+
* the reconciler. The provider client owns the probe — the
|
|
216
|
+
* adapter, route layer, and document service never call into
|
|
217
|
+
* the SDK for readiness. Every check carries a stable
|
|
218
|
+
* `errorCode` from the documented enum so log consumers and
|
|
219
|
+
* tests can rely on the shape regardless of how the SDK
|
|
220
|
+
* reports the underlying condition.
|
|
221
|
+
*/
|
|
222
|
+
checkReadiness(network: FilecoinReadinessNetwork): Promise<ReadonlyArray<FilecoinReadinessCheck>>;
|
|
223
|
+
/**
|
|
224
|
+
* Non-mutating SDK read of the provider's advertised minimum
|
|
225
|
+
* upload size in bytes. Used by preflight/sizing callers
|
|
226
|
+
* (live calibration smoke + future direct-upload sizing) to
|
|
227
|
+
* size payloads against the provider's real contract rather
|
|
228
|
+
* than a baked-in constant. Lookup failures throw a typed
|
|
229
|
+
* `FilecoinProviderError` (errorCode `filecoin_storage_info_failed`
|
|
230
|
+
* on Synapse; per-driver code on other implementations); they
|
|
231
|
+
* never resolve to `null` or silently degrade.
|
|
232
|
+
*/
|
|
233
|
+
getServiceMinUploadBytes(): Promise<number>;
|
|
234
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Filecoin provider-client interface — the seam between the
|
|
3
|
+
* `RawContentStore` adapter and any vendor-specific Filecoin client.
|
|
4
|
+
*
|
|
5
|
+
* The interface admits two drivers today (`FilecoinDriverName =
|
|
6
|
+
* 'synapse' | 'filecoin_pin'`). The default is `'synapse'`,
|
|
7
|
+
* backed by `@filoz/synapse-sdk` directly; the Phase 5 opt-in
|
|
8
|
+
* `'filecoin_pin'` driver is backed by `filecoin-pin/core/upload`
|
|
9
|
+
* and composes the Synapse client for non-CAR-first operations.
|
|
10
|
+
* The closed-union type forces every new driver to be a literal-
|
|
11
|
+
* by-literal addition; never widen it to plain `string`.
|
|
12
|
+
*
|
|
13
|
+
* Boundary rules:
|
|
14
|
+
*
|
|
15
|
+
* - The wrapper `backend.ts` is the ONLY caller of these methods.
|
|
16
|
+
* The reconciler, the route layer, and the service layer never
|
|
17
|
+
* talk to a `FilecoinProviderClient` directly.
|
|
18
|
+
* - Inputs and outputs are AtomicMemory-shaped, NOT Synapse-shaped.
|
|
19
|
+
* Mapping happens inside the concrete client
|
|
20
|
+
* (`synapse-client.ts`); vendor types never escape
|
|
21
|
+
* `providers/filecoin/`.
|
|
22
|
+
* - Sanitization (see `errors.ts`): any vendor error a client
|
|
23
|
+
* catches must be replaced with a `FilecoinProviderError` whose
|
|
24
|
+
* `errorCode` is one of the documented stable codes. Raw vendor
|
|
25
|
+
* messages do not escape.
|
|
26
|
+
*/
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Filecoin readiness — INTERNAL-only.
|
|
3
|
+
*
|
|
4
|
+
* The check types (`FilecoinReadinessCheck`,
|
|
5
|
+
* `FilecoinReadinessStatus`, `FilecoinReadinessNetwork`) live on
|
|
6
|
+
* `provider-client.ts` because they are part of the
|
|
7
|
+
* `FilecoinProviderClient.checkReadiness` boundary. This module
|
|
8
|
+
* carries:
|
|
9
|
+
*
|
|
10
|
+
* - `FilecoinReadiness` — the aggregate shape consumers see.
|
|
11
|
+
* - `aggregateFilecoinReadiness` — pure aggregator (closed,
|
|
12
|
+
* fail-closed on empty input).
|
|
13
|
+
* - `checkFilecoinReadiness(client, network)` — thin wrapper
|
|
14
|
+
* that delegates to `client.checkReadiness(network)` and
|
|
15
|
+
* builds the aggregate.
|
|
16
|
+
* - `FILECOIN_READINESS_REQUIRED_CHECKS` — documented required
|
|
17
|
+
* probe names.
|
|
18
|
+
*
|
|
19
|
+
* The aggregate is INTERNAL to `src/storage/providers/filecoin/`
|
|
20
|
+
* in v1. It is NOT exposed on any public HTTP route, NOT
|
|
21
|
+
* projected into the SDK, and NOT included in the OpenAPI schema.
|
|
22
|
+
* The factory exposes the helper so the document-upload pipeline
|
|
23
|
+
* and (later) the reconciler can gate work on a successful probe
|
|
24
|
+
* without re-implementing the SDK contract.
|
|
25
|
+
*
|
|
26
|
+
* Sanitization rule: the readiness object NEVER carries wallet
|
|
27
|
+
* addresses, balances, allowances, provider auth payloads, or
|
|
28
|
+
* raw vendor messages. The only public fields are the check
|
|
29
|
+
* `name`, status enum, and an opaque `errorCode` string from the
|
|
30
|
+
* closed set documented at the bottom of this file.
|
|
31
|
+
*/
|
|
32
|
+
import type { FilecoinDriverName, FilecoinProviderClient, FilecoinReadinessCheck, FilecoinReadinessNetwork } from './provider-client.js';
|
|
33
|
+
export type { FilecoinDriverName, FilecoinReadinessCheck, FilecoinReadinessNetwork, FilecoinReadinessStatus, } from './provider-client.js';
|
|
34
|
+
export interface FilecoinReadiness {
|
|
35
|
+
readonly provider: 'filecoin';
|
|
36
|
+
readonly driver: FilecoinDriverName;
|
|
37
|
+
readonly network: FilecoinReadinessNetwork;
|
|
38
|
+
readonly ready: boolean;
|
|
39
|
+
readonly checks: ReadonlyArray<FilecoinReadinessCheck>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Documented required-check names. Callers may treat any
|
|
43
|
+
* name not in this list as advisory; everything in it must be
|
|
44
|
+
* `'passed'` for `ready === true`.
|
|
45
|
+
*/
|
|
46
|
+
export declare const FILECOIN_READINESS_REQUIRED_CHECKS: readonly ["network_reachable", "key_loadable", "account_on_expected_network", "payment_covers_minimum_upload", "provider_ids_reachable", "data_set_available", "retrieval_available", "upload_size_bounds_compatible"];
|
|
47
|
+
/**
|
|
48
|
+
* Pure aggregator: `ready === true` iff (1) the supplied checks
|
|
49
|
+
* list is non-empty AND (2) every supplied check has
|
|
50
|
+
* `status === 'passed'`. An empty list fails CLOSED — a future
|
|
51
|
+
* wiring bug that hands this function an empty array must NOT
|
|
52
|
+
* mark Filecoin ready.
|
|
53
|
+
*/
|
|
54
|
+
export declare function aggregateFilecoinReadiness(checks: ReadonlyArray<FilecoinReadinessCheck>): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Delegate to the underlying provider client's
|
|
57
|
+
* `checkReadiness(network)` probe and wrap the result in the
|
|
58
|
+
* documented aggregate shape. The test client returns all-
|
|
59
|
+
* `'unknown'` checks; the real Synapse client issues
|
|
60
|
+
* non-mutating SDK reads.
|
|
61
|
+
*/
|
|
62
|
+
export declare function checkFilecoinReadiness(client: FilecoinProviderClient, network: FilecoinReadinessNetwork): Promise<FilecoinReadiness>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Filecoin readiness — INTERNAL-only.
|
|
3
|
+
*
|
|
4
|
+
* The check types (`FilecoinReadinessCheck`,
|
|
5
|
+
* `FilecoinReadinessStatus`, `FilecoinReadinessNetwork`) live on
|
|
6
|
+
* `provider-client.ts` because they are part of the
|
|
7
|
+
* `FilecoinProviderClient.checkReadiness` boundary. This module
|
|
8
|
+
* carries:
|
|
9
|
+
*
|
|
10
|
+
* - `FilecoinReadiness` — the aggregate shape consumers see.
|
|
11
|
+
* - `aggregateFilecoinReadiness` — pure aggregator (closed,
|
|
12
|
+
* fail-closed on empty input).
|
|
13
|
+
* - `checkFilecoinReadiness(client, network)` — thin wrapper
|
|
14
|
+
* that delegates to `client.checkReadiness(network)` and
|
|
15
|
+
* builds the aggregate.
|
|
16
|
+
* - `FILECOIN_READINESS_REQUIRED_CHECKS` — documented required
|
|
17
|
+
* probe names.
|
|
18
|
+
*
|
|
19
|
+
* The aggregate is INTERNAL to `src/storage/providers/filecoin/`
|
|
20
|
+
* in v1. It is NOT exposed on any public HTTP route, NOT
|
|
21
|
+
* projected into the SDK, and NOT included in the OpenAPI schema.
|
|
22
|
+
* The factory exposes the helper so the document-upload pipeline
|
|
23
|
+
* and (later) the reconciler can gate work on a successful probe
|
|
24
|
+
* without re-implementing the SDK contract.
|
|
25
|
+
*
|
|
26
|
+
* Sanitization rule: the readiness object NEVER carries wallet
|
|
27
|
+
* addresses, balances, allowances, provider auth payloads, or
|
|
28
|
+
* raw vendor messages. The only public fields are the check
|
|
29
|
+
* `name`, status enum, and an opaque `errorCode` string from the
|
|
30
|
+
* closed set documented at the bottom of this file.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Documented required-check names. Callers may treat any
|
|
34
|
+
* name not in this list as advisory; everything in it must be
|
|
35
|
+
* `'passed'` for `ready === true`.
|
|
36
|
+
*/
|
|
37
|
+
export const FILECOIN_READINESS_REQUIRED_CHECKS = [
|
|
38
|
+
'network_reachable',
|
|
39
|
+
'key_loadable',
|
|
40
|
+
'account_on_expected_network',
|
|
41
|
+
'payment_covers_minimum_upload',
|
|
42
|
+
'provider_ids_reachable',
|
|
43
|
+
'data_set_available',
|
|
44
|
+
'retrieval_available',
|
|
45
|
+
'upload_size_bounds_compatible',
|
|
46
|
+
];
|
|
47
|
+
/**
|
|
48
|
+
* Pure aggregator: `ready === true` iff (1) the supplied checks
|
|
49
|
+
* list is non-empty AND (2) every supplied check has
|
|
50
|
+
* `status === 'passed'`. An empty list fails CLOSED — a future
|
|
51
|
+
* wiring bug that hands this function an empty array must NOT
|
|
52
|
+
* mark Filecoin ready.
|
|
53
|
+
*/
|
|
54
|
+
export function aggregateFilecoinReadiness(checks) {
|
|
55
|
+
if (checks.length === 0)
|
|
56
|
+
return false;
|
|
57
|
+
for (const check of checks) {
|
|
58
|
+
if (check.status !== 'passed')
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Delegate to the underlying provider client's
|
|
65
|
+
* `checkReadiness(network)` probe and wrap the result in the
|
|
66
|
+
* documented aggregate shape. The test client returns all-
|
|
67
|
+
* `'unknown'` checks; the real Synapse client issues
|
|
68
|
+
* non-mutating SDK reads.
|
|
69
|
+
*/
|
|
70
|
+
export async function checkFilecoinReadiness(client, network) {
|
|
71
|
+
const checks = await client.checkReadiness(network);
|
|
72
|
+
// `driver` reflects the boundary's actual driver — never a
|
|
73
|
+
// hardcoded literal. Production: the live Synapse client →
|
|
74
|
+
// `'synapse'`. Tests / a future filecoin-pin client → that
|
|
75
|
+
// driver's literal. Hardcoding here would lie for non-Synapse
|
|
76
|
+
// implementations and undermine the driver-agnostic invariant
|
|
77
|
+
// the harvest plan establishes.
|
|
78
|
+
return {
|
|
79
|
+
provider: 'filecoin',
|
|
80
|
+
driver: client.driver,
|
|
81
|
+
network,
|
|
82
|
+
ready: aggregateFilecoinReadiness(checks),
|
|
83
|
+
checks,
|
|
84
|
+
};
|
|
85
|
+
}
|