@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,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Vendor-boundary helpers for the filecoin-pin driver.
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates the surface that crosses from our code into
|
|
5
|
+
* `filecoin-pin/core/upload` + `@ipld/car`. The split exists so
|
|
6
|
+
* `filecoin-pin-client.ts` stays focused on the
|
|
7
|
+
* `FilecoinProviderClient` implementation while this file owns:
|
|
8
|
+
*
|
|
9
|
+
* - The closed minimal type aliases that mirror just the bits
|
|
10
|
+
* of the vendor shapes we consume.
|
|
11
|
+
* - The runtime dynamic-import helpers
|
|
12
|
+
* (`loadExecuteUpload` / `loadCarReader`).
|
|
13
|
+
* - The noop `Logger`-shaped object we hand to
|
|
14
|
+
* `executeUpload`'s required `logger` option (so we don't
|
|
15
|
+
* pull `pino` into the production type graph).
|
|
16
|
+
*
|
|
17
|
+
* Source-build invariant. The production build path
|
|
18
|
+
* (`tsc -p tsconfig.build.json` / `npm run build`) compiles WITHOUT
|
|
19
|
+
* the `optionalDependencies` graph present. Two patterns enforce
|
|
20
|
+
* that here:
|
|
21
|
+
*
|
|
22
|
+
* 1. **Local minimal types.** We do NOT `import type { ... }`
|
|
23
|
+
* from any optional package. Every shape we consume is
|
|
24
|
+
* defined locally so `tsc` never has to resolve the vendor
|
|
25
|
+
* type declarations.
|
|
26
|
+
*
|
|
27
|
+
* 2. **Non-literal dynamic-import specifiers.** Each
|
|
28
|
+
* `await import(...)` call site uses a `VENDOR_*`
|
|
29
|
+
* `const`-stored specifier. `tsc` does not statically
|
|
30
|
+
* resolve a non-literal `import(specifier)` argument, so a
|
|
31
|
+
* synapse-only install
|
|
32
|
+
* (`npm ci --legacy-peer-deps --omit=optional`) successfully
|
|
33
|
+
* runs `tsc -p tsconfig.build.json` even though the optional
|
|
34
|
+
* modules are absent.
|
|
35
|
+
*
|
|
36
|
+
* The dev-mode `tsc --noEmit` (against `tsconfig.json`) still
|
|
37
|
+
* requires the optional packages because TEST files in
|
|
38
|
+
* `providers/filecoin/__tests__/` import them directly (e.g.
|
|
39
|
+
* `@ipld/car` for a hand-rolled multi-root CAR fixture). Tests
|
|
40
|
+
* never run on omit-optional production installs;
|
|
41
|
+
* `tsconfig.build.json` excludes `__tests__`. See
|
|
42
|
+
* `filecoin-pin-lazy-boundary.test.ts` for the static-import
|
|
43
|
+
* invariant that pins this split.
|
|
44
|
+
*/
|
|
45
|
+
// Specifiers stored as `const`s so `tsc` does not statically
|
|
46
|
+
// resolve the optional modules. See file header for the
|
|
47
|
+
// source-build-safety rationale.
|
|
48
|
+
const VENDOR_FILECOIN_PIN_UPLOAD = 'filecoin-pin/core/upload';
|
|
49
|
+
const VENDOR_IPLD_CAR = '@ipld/car';
|
|
50
|
+
/**
|
|
51
|
+
* Lazy-load `executeUpload` from `filecoin-pin/core/upload`. The
|
|
52
|
+
* package is in `optionalDependencies`; if a synapse-only build
|
|
53
|
+
* was installed via `npm ci --legacy-peer-deps --omit=optional`,
|
|
54
|
+
* this resolution fails only when an operator selects
|
|
55
|
+
* `RAW_STORAGE_FILECOIN_DRIVER=filecoin_pin` — the intended
|
|
56
|
+
* failure mode.
|
|
57
|
+
*/
|
|
58
|
+
export async function loadExecuteUpload() {
|
|
59
|
+
const mod = (await import(VENDOR_FILECOIN_PIN_UPLOAD));
|
|
60
|
+
return mod.executeUpload;
|
|
61
|
+
}
|
|
62
|
+
/** Lazy-load `CarReader.fromBytes` from `@ipld/car`. */
|
|
63
|
+
export async function loadCarReader(carBytes) {
|
|
64
|
+
const mod = (await import(VENDOR_IPLD_CAR));
|
|
65
|
+
return mod.CarReader.fromBytes(carBytes);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Pino-shape silent logger used to satisfy `executeUpload`'s
|
|
69
|
+
* required `logger` option without taking on `pino` as a runtime
|
|
70
|
+
* dep. The `MinimalUploadOptions.logger` field is `unknown` by
|
|
71
|
+
* design so we don't drag pino into the production type graph;
|
|
72
|
+
* the shape below mirrors the closed set of methods filecoin-pin's
|
|
73
|
+
* `executeUpload` actually invokes. If a future filecoin-pin
|
|
74
|
+
* upgrade widens that surface, the runtime call site fails with
|
|
75
|
+
* a clear vendor-side error rather than producing silent test
|
|
76
|
+
* passes against a stale shape.
|
|
77
|
+
*/
|
|
78
|
+
export function noopLogger() {
|
|
79
|
+
const noop = () => undefined;
|
|
80
|
+
const logger = {
|
|
81
|
+
level: 'silent',
|
|
82
|
+
fatal: noop, error: noop, warn: noop, info: noop, debug: noop, trace: noop,
|
|
83
|
+
silent: noop,
|
|
84
|
+
child: () => logger,
|
|
85
|
+
};
|
|
86
|
+
return logger;
|
|
87
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Strict readers for the `filecoin.*` hints adapters MAY
|
|
3
|
+
* consult to short-circuit lookups (`head`) and bypass the SDK's
|
|
4
|
+
* CID→active-piece resolution (`delete`).
|
|
5
|
+
*
|
|
6
|
+
* Source: `raw_storage_metadata.filecoin` sidecar that
|
|
7
|
+
* `FilecoinRawContentStore.put` wrote (`backend.ts`). The
|
|
8
|
+
* reconciler / cleanup loop read `raw_documents.raw_storage_metadata`
|
|
9
|
+
* straight out of the DB and pass it as the generic
|
|
10
|
+
* `RawContentHints` argument; this module is the only place that
|
|
11
|
+
* interprets it.
|
|
12
|
+
*
|
|
13
|
+
* Validation contract: every numeric id field MUST be a non-empty
|
|
14
|
+
* positive decimal `bigint` string (regex `^[1-9][0-9]*$`).
|
|
15
|
+
* Anything else — `0`, negative, hex/`0x...`, floats, scientific
|
|
16
|
+
* notation, surrounding whitespace, non-string types, missing
|
|
17
|
+
* keys, the `filecoin` sibling not being an object — is treated
|
|
18
|
+
* as **absent**. Malformed values NEVER throw; the helper returns
|
|
19
|
+
* `null` and emits a sanitized `filecoin.hint.malformed`
|
|
20
|
+
* diagnostic so an operator can see in observability that a hint
|
|
21
|
+
* was rejected without the malformed value itself crossing the
|
|
22
|
+
* boundary.
|
|
23
|
+
*/
|
|
24
|
+
import type { RawContentHints } from '../../raw-content-store.js';
|
|
25
|
+
/**
|
|
26
|
+
* Bundled hints `delete` consumes. `dataSetId` locates the
|
|
27
|
+
* `StorageContext`; `pieceId` bypasses the CID-based active-piece
|
|
28
|
+
* lookup that fails for freshly-uploaded pieces (the live
|
|
29
|
+
* calibration smoke surfaced this failure mode). Either field
|
|
30
|
+
* may be `null` independently — the adapter MUST tolerate partial
|
|
31
|
+
* hints (data_set_id present + piece_id missing falls back to
|
|
32
|
+
* CID-based delete on the resolved context; both missing falls
|
|
33
|
+
* back to the scan path).
|
|
34
|
+
*/
|
|
35
|
+
export interface FilecoinDeleteHints {
|
|
36
|
+
readonly dataSetId: string | null;
|
|
37
|
+
readonly pieceId: string | null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Returns the validated `data_set_id` string, or `null` when the
|
|
41
|
+
* hint is missing or malformed. Callers pass the result straight
|
|
42
|
+
* through to `FilecoinProviderClient.head({ dataSetId })`; `null`
|
|
43
|
+
* means "no hint, scan normally".
|
|
44
|
+
*
|
|
45
|
+
* `documentIdForDiagnostic` is optional — when supplied (e.g. by
|
|
46
|
+
* the reconciler) it appears on the `filecoin.hint.malformed`
|
|
47
|
+
* event so an operator can correlate the diagnostic with the
|
|
48
|
+
* specific row. The value itself NEVER appears in the event.
|
|
49
|
+
*/
|
|
50
|
+
export declare function readFilecoinDataSetIdHint(hints: RawContentHints | undefined, documentIdForDiagnostic?: string): string | null;
|
|
51
|
+
/**
|
|
52
|
+
* Returns `{ dataSetId, pieceId }` from the sidecar — the bundle
|
|
53
|
+
* `FilecoinRawContentStore.delete` consumes. `pieceId` is picked
|
|
54
|
+
* from `filecoin.copies[]`:
|
|
55
|
+
*
|
|
56
|
+
* 1. Top-level `data_set_id` is validated first (positive
|
|
57
|
+
* decimal bigint or `null`).
|
|
58
|
+
* 2. Each copy is read; only copies whose `data_set_id` is a
|
|
59
|
+
* valid positive decimal bigint AND whose `piece_id` is a
|
|
60
|
+
* valid positive decimal bigint are eligible.
|
|
61
|
+
* 3. If the top-level `data_set_id` resolved (non-null), we
|
|
62
|
+
* prefer the first eligible copy whose `data_set_id`
|
|
63
|
+
* matches it. Otherwise the first eligible copy wins.
|
|
64
|
+
*
|
|
65
|
+
* Returns `{ dataSetId, pieceId }` where each field is the
|
|
66
|
+
* validated string or `null`. Never throws. Malformed entries
|
|
67
|
+
* emit one `filecoin.hint.malformed` diagnostic per offending
|
|
68
|
+
* field (per copy) so the rejection is visible without leaking
|
|
69
|
+
* the rejected value.
|
|
70
|
+
*/
|
|
71
|
+
export declare function readFilecoinDeleteHints(hints: RawContentHints | undefined, documentIdForDiagnostic?: string): FilecoinDeleteHints;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Strict readers for the `filecoin.*` hints adapters MAY
|
|
3
|
+
* consult to short-circuit lookups (`head`) and bypass the SDK's
|
|
4
|
+
* CID→active-piece resolution (`delete`).
|
|
5
|
+
*
|
|
6
|
+
* Source: `raw_storage_metadata.filecoin` sidecar that
|
|
7
|
+
* `FilecoinRawContentStore.put` wrote (`backend.ts`). The
|
|
8
|
+
* reconciler / cleanup loop read `raw_documents.raw_storage_metadata`
|
|
9
|
+
* straight out of the DB and pass it as the generic
|
|
10
|
+
* `RawContentHints` argument; this module is the only place that
|
|
11
|
+
* interprets it.
|
|
12
|
+
*
|
|
13
|
+
* Validation contract: every numeric id field MUST be a non-empty
|
|
14
|
+
* positive decimal `bigint` string (regex `^[1-9][0-9]*$`).
|
|
15
|
+
* Anything else — `0`, negative, hex/`0x...`, floats, scientific
|
|
16
|
+
* notation, surrounding whitespace, non-string types, missing
|
|
17
|
+
* keys, the `filecoin` sibling not being an object — is treated
|
|
18
|
+
* as **absent**. Malformed values NEVER throw; the helper returns
|
|
19
|
+
* `null` and emits a sanitized `filecoin.hint.malformed`
|
|
20
|
+
* diagnostic so an operator can see in observability that a hint
|
|
21
|
+
* was rejected without the malformed value itself crossing the
|
|
22
|
+
* boundary.
|
|
23
|
+
*/
|
|
24
|
+
import { emitFilecoinEvent } from '../../../services/filecoin-observability.js';
|
|
25
|
+
const POSITIVE_DECIMAL_BIGINT = /^[1-9][0-9]*$/;
|
|
26
|
+
/**
|
|
27
|
+
* Returns the validated `data_set_id` string, or `null` when the
|
|
28
|
+
* hint is missing or malformed. Callers pass the result straight
|
|
29
|
+
* through to `FilecoinProviderClient.head({ dataSetId })`; `null`
|
|
30
|
+
* means "no hint, scan normally".
|
|
31
|
+
*
|
|
32
|
+
* `documentIdForDiagnostic` is optional — when supplied (e.g. by
|
|
33
|
+
* the reconciler) it appears on the `filecoin.hint.malformed`
|
|
34
|
+
* event so an operator can correlate the diagnostic with the
|
|
35
|
+
* specific row. The value itself NEVER appears in the event.
|
|
36
|
+
*/
|
|
37
|
+
export function readFilecoinDataSetIdHint(hints, documentIdForDiagnostic) {
|
|
38
|
+
const sibling = readFilecoinSibling(hints);
|
|
39
|
+
if (sibling === null)
|
|
40
|
+
return null;
|
|
41
|
+
return readPositiveBigintString(sibling['data_set_id'], 'data_set_id', documentIdForDiagnostic);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Returns `{ dataSetId, pieceId }` from the sidecar — the bundle
|
|
45
|
+
* `FilecoinRawContentStore.delete` consumes. `pieceId` is picked
|
|
46
|
+
* from `filecoin.copies[]`:
|
|
47
|
+
*
|
|
48
|
+
* 1. Top-level `data_set_id` is validated first (positive
|
|
49
|
+
* decimal bigint or `null`).
|
|
50
|
+
* 2. Each copy is read; only copies whose `data_set_id` is a
|
|
51
|
+
* valid positive decimal bigint AND whose `piece_id` is a
|
|
52
|
+
* valid positive decimal bigint are eligible.
|
|
53
|
+
* 3. If the top-level `data_set_id` resolved (non-null), we
|
|
54
|
+
* prefer the first eligible copy whose `data_set_id`
|
|
55
|
+
* matches it. Otherwise the first eligible copy wins.
|
|
56
|
+
*
|
|
57
|
+
* Returns `{ dataSetId, pieceId }` where each field is the
|
|
58
|
+
* validated string or `null`. Never throws. Malformed entries
|
|
59
|
+
* emit one `filecoin.hint.malformed` diagnostic per offending
|
|
60
|
+
* field (per copy) so the rejection is visible without leaking
|
|
61
|
+
* the rejected value.
|
|
62
|
+
*/
|
|
63
|
+
export function readFilecoinDeleteHints(hints, documentIdForDiagnostic) {
|
|
64
|
+
const sibling = readFilecoinSibling(hints);
|
|
65
|
+
if (sibling === null)
|
|
66
|
+
return { dataSetId: null, pieceId: null };
|
|
67
|
+
const dataSetId = readPositiveBigintString(sibling['data_set_id'], 'data_set_id', documentIdForDiagnostic);
|
|
68
|
+
const pieceId = pickPieceIdFromCopies(sibling['copies'], dataSetId, documentIdForDiagnostic);
|
|
69
|
+
return { dataSetId, pieceId };
|
|
70
|
+
}
|
|
71
|
+
function readFilecoinSibling(hints) {
|
|
72
|
+
if (!hints || typeof hints !== 'object')
|
|
73
|
+
return null;
|
|
74
|
+
const sibling = hints['filecoin'];
|
|
75
|
+
if (!sibling || typeof sibling !== 'object' || Array.isArray(sibling))
|
|
76
|
+
return null;
|
|
77
|
+
return sibling;
|
|
78
|
+
}
|
|
79
|
+
function readPositiveBigintString(raw, fieldName, documentIdForDiagnostic) {
|
|
80
|
+
if (raw === undefined || raw === null)
|
|
81
|
+
return null;
|
|
82
|
+
if (typeof raw !== 'string') {
|
|
83
|
+
emitMalformed(`${fieldName}_not_a_string`, documentIdForDiagnostic);
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
if (!POSITIVE_DECIMAL_BIGINT.test(raw)) {
|
|
87
|
+
emitMalformed(`${fieldName}_not_positive_decimal_bigint`, documentIdForDiagnostic);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
return raw;
|
|
91
|
+
}
|
|
92
|
+
function pickPieceIdFromCopies(raw, preferredDataSetId, documentIdForDiagnostic) {
|
|
93
|
+
if (!Array.isArray(raw))
|
|
94
|
+
return null;
|
|
95
|
+
let fallback = null;
|
|
96
|
+
for (const entry of raw) {
|
|
97
|
+
const pair = readCopyPair(entry, documentIdForDiagnostic);
|
|
98
|
+
if (pair === null)
|
|
99
|
+
continue;
|
|
100
|
+
if (preferredDataSetId !== null && pair.dataSetId === preferredDataSetId)
|
|
101
|
+
return pair.pieceId;
|
|
102
|
+
if (fallback === null)
|
|
103
|
+
fallback = pair.pieceId;
|
|
104
|
+
}
|
|
105
|
+
return fallback;
|
|
106
|
+
}
|
|
107
|
+
function readCopyPair(entry, documentIdForDiagnostic) {
|
|
108
|
+
if (!entry || typeof entry !== 'object' || Array.isArray(entry))
|
|
109
|
+
return null;
|
|
110
|
+
const copy = entry;
|
|
111
|
+
const dataSetId = readPositiveBigintString(copy['data_set_id'], 'data_set_id', documentIdForDiagnostic);
|
|
112
|
+
const pieceId = readPositiveBigintString(copy['piece_id'], 'piece_id', documentIdForDiagnostic);
|
|
113
|
+
if (dataSetId === null || pieceId === null)
|
|
114
|
+
return null;
|
|
115
|
+
return { dataSetId, pieceId };
|
|
116
|
+
}
|
|
117
|
+
function emitMalformed(errorCode, documentIdForDiagnostic) {
|
|
118
|
+
emitFilecoinEvent('filecoin.hint.malformed', {
|
|
119
|
+
provider: 'filecoin',
|
|
120
|
+
errorCode,
|
|
121
|
+
...(documentIdForDiagnostic ? { documentId: documentIdForDiagnostic } : {}),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Filecoin storage provider — composition entry point.
|
|
3
|
+
*
|
|
4
|
+
* `createFilecoinStorageBackend(config)` is the single entry point
|
|
5
|
+
* that `src/storage/factory.ts` calls when
|
|
6
|
+
* `rawStorageProvider === 'filecoin'`. The provider REQUIRES a
|
|
7
|
+
* non-null parsed `FilecoinProviderConfig` — the null-config
|
|
8
|
+
* runtime path is not supported now that
|
|
9
|
+
* `head`/`get`/`delete` advertise real capabilities. The central
|
|
10
|
+
* `parseFilecoinProviderConfig` in `src/config.ts` already enforces
|
|
11
|
+
* "filecoin selected ⇒ full env block validated", so production
|
|
12
|
+
* never reaches this entry with a null config.
|
|
13
|
+
*
|
|
14
|
+
* The test client stays isolated in `./skeleton-client.ts` for
|
|
15
|
+
* tests that need a `FilecoinProviderClient`-shaped stub without standing up a real
|
|
16
|
+
* Synapse handle.
|
|
17
|
+
*
|
|
18
|
+
* Reverse import-boundary invariant (enforced by the
|
|
19
|
+
* `import-boundary.test.ts`): this module's only outward imports
|
|
20
|
+
* are sibling files inside `providers/filecoin/`, the adapter
|
|
21
|
+
* contract from `src/storage/raw-content-store.js`, and (inside
|
|
22
|
+
* `synapse-construction.ts`) the vendor packages
|
|
23
|
+
* `@filoz/synapse-sdk` + `viem`. No `RuntimeConfig`, no
|
|
24
|
+
* `process.env`, no route/db/service code.
|
|
25
|
+
*/
|
|
26
|
+
import type { FilecoinProviderConfig } from './config.js';
|
|
27
|
+
import type { RawContentStore } from '../../raw-content-store.js';
|
|
28
|
+
/**
|
|
29
|
+
* Build the Filecoin backend from a validated
|
|
30
|
+
* `FilecoinProviderConfig`. Throws `FilecoinProviderError` when
|
|
31
|
+
* the caller passes a non-config — the only path that can happen
|
|
32
|
+
* in production is a misconfiguration the central config
|
|
33
|
+
* validator should have caught, so the throw is a defense-in-
|
|
34
|
+
* depth signal rather than an expected branch.
|
|
35
|
+
*
|
|
36
|
+
* **Lazy-load contract.** Synchronous construction of the default
|
|
37
|
+
* `synapse` client is fine — its imports (`@filoz/synapse-sdk`,
|
|
38
|
+
* `viem`) are already in this module's static graph. The
|
|
39
|
+
* `filecoin_pin` client, however, pulls a much heavier graph
|
|
40
|
+
* (`filecoin-pin/core/upload`, `@helia/unixfs`, `@ipld/car`,
|
|
41
|
+
* `blockstore-core`), so we `await import` it ONLY inside the
|
|
42
|
+
* `filecoin_pin` branch. A deployment running the default
|
|
43
|
+
* `RAW_STORAGE_FILECOIN_DRIVER=synapse` never resolves the
|
|
44
|
+
* filecoin-pin module subtree at runtime, which keeps the
|
|
45
|
+
* `filecoin-pin` package's `optionalDependencies` status honest
|
|
46
|
+
* (a synapse-only deployment can be built without the package
|
|
47
|
+
* installed at all). The function returns `Promise<RawContentStore>`
|
|
48
|
+
* so the dynamic-import branch can await its loader.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createFilecoinStorageBackend(config: FilecoinProviderConfig): Promise<RawContentStore>;
|
|
51
|
+
export { FilecoinRawContentStore } from './backend.js';
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Filecoin storage provider — composition entry point.
|
|
3
|
+
*
|
|
4
|
+
* `createFilecoinStorageBackend(config)` is the single entry point
|
|
5
|
+
* that `src/storage/factory.ts` calls when
|
|
6
|
+
* `rawStorageProvider === 'filecoin'`. The provider REQUIRES a
|
|
7
|
+
* non-null parsed `FilecoinProviderConfig` — the null-config
|
|
8
|
+
* runtime path is not supported now that
|
|
9
|
+
* `head`/`get`/`delete` advertise real capabilities. The central
|
|
10
|
+
* `parseFilecoinProviderConfig` in `src/config.ts` already enforces
|
|
11
|
+
* "filecoin selected ⇒ full env block validated", so production
|
|
12
|
+
* never reaches this entry with a null config.
|
|
13
|
+
*
|
|
14
|
+
* The test client stays isolated in `./skeleton-client.ts` for
|
|
15
|
+
* tests that need a `FilecoinProviderClient`-shaped stub without standing up a real
|
|
16
|
+
* Synapse handle.
|
|
17
|
+
*
|
|
18
|
+
* Reverse import-boundary invariant (enforced by the
|
|
19
|
+
* `import-boundary.test.ts`): this module's only outward imports
|
|
20
|
+
* are sibling files inside `providers/filecoin/`, the adapter
|
|
21
|
+
* contract from `src/storage/raw-content-store.js`, and (inside
|
|
22
|
+
* `synapse-construction.ts`) the vendor packages
|
|
23
|
+
* `@filoz/synapse-sdk` + `viem`. No `RuntimeConfig`, no
|
|
24
|
+
* `process.env`, no route/db/service code.
|
|
25
|
+
*/
|
|
26
|
+
import { FilecoinRawContentStore } from './backend.js';
|
|
27
|
+
import { SynapseFilecoinProviderClient } from './synapse-client.js';
|
|
28
|
+
import { FilecoinProviderError } from './errors.js';
|
|
29
|
+
import { buildSynapse } from './synapse-construction.js';
|
|
30
|
+
/**
|
|
31
|
+
* Build the Filecoin backend from a validated
|
|
32
|
+
* `FilecoinProviderConfig`. Throws `FilecoinProviderError` when
|
|
33
|
+
* the caller passes a non-config — the only path that can happen
|
|
34
|
+
* in production is a misconfiguration the central config
|
|
35
|
+
* validator should have caught, so the throw is a defense-in-
|
|
36
|
+
* depth signal rather than an expected branch.
|
|
37
|
+
*
|
|
38
|
+
* **Lazy-load contract.** Synchronous construction of the default
|
|
39
|
+
* `synapse` client is fine — its imports (`@filoz/synapse-sdk`,
|
|
40
|
+
* `viem`) are already in this module's static graph. The
|
|
41
|
+
* `filecoin_pin` client, however, pulls a much heavier graph
|
|
42
|
+
* (`filecoin-pin/core/upload`, `@helia/unixfs`, `@ipld/car`,
|
|
43
|
+
* `blockstore-core`), so we `await import` it ONLY inside the
|
|
44
|
+
* `filecoin_pin` branch. A deployment running the default
|
|
45
|
+
* `RAW_STORAGE_FILECOIN_DRIVER=synapse` never resolves the
|
|
46
|
+
* filecoin-pin module subtree at runtime, which keeps the
|
|
47
|
+
* `filecoin-pin` package's `optionalDependencies` status honest
|
|
48
|
+
* (a synapse-only deployment can be built without the package
|
|
49
|
+
* installed at all). The function returns `Promise<RawContentStore>`
|
|
50
|
+
* so the dynamic-import branch can await its loader.
|
|
51
|
+
*/
|
|
52
|
+
export async function createFilecoinStorageBackend(config) {
|
|
53
|
+
if (config === null || config === undefined) {
|
|
54
|
+
throw new FilecoinProviderError('filecoin_provider_not_configured', 'createFilecoinStorageBackend was called without a FilecoinProviderConfig. ' +
|
|
55
|
+
'Set the RAW_STORAGE_FILECOIN_* env block before selecting filecoin.');
|
|
56
|
+
}
|
|
57
|
+
const synapse = buildSynapse(config);
|
|
58
|
+
const synapseClient = new SynapseFilecoinProviderClient(synapse, {
|
|
59
|
+
copies: config.copies,
|
|
60
|
+
providerIds: config.providerIds,
|
|
61
|
+
dataSetMetadata: filecoinDataSetMetadataToStrings(config.dataSetMetadata),
|
|
62
|
+
withCdn: config.withCdn,
|
|
63
|
+
uploadTimeoutMs: config.uploadTimeoutMs,
|
|
64
|
+
retrievalTimeoutMs: config.retrievalTimeoutMs,
|
|
65
|
+
minUploadBytes: config.minUploadBytes,
|
|
66
|
+
maxUploadBytes: config.maxUploadBytes,
|
|
67
|
+
});
|
|
68
|
+
let client = synapseClient;
|
|
69
|
+
if (config.driver === 'filecoin_pin') {
|
|
70
|
+
// Dynamic import keeps the filecoin-pin module subtree out
|
|
71
|
+
// of the synapse-only startup graph. The boundary test
|
|
72
|
+
// (`__tests__/lazy-loading-boundary.test.ts`) asserts this
|
|
73
|
+
// invariant statically by AST-scanning `index.ts`.
|
|
74
|
+
const { FilecoinPinFilecoinProviderClient } = await import('./filecoin-pin-client.js');
|
|
75
|
+
client = new FilecoinPinFilecoinProviderClient(synapse, synapseClient, {
|
|
76
|
+
...(config.copies !== null ? { copies: config.copies } : {}),
|
|
77
|
+
providerIds: config.providerIds,
|
|
78
|
+
dataSetMetadata: filecoinDataSetMetadataToStrings(config.dataSetMetadata),
|
|
79
|
+
...(config.uploadTimeoutMs !== null ? { uploadTimeoutMs: config.uploadTimeoutMs } : {}),
|
|
80
|
+
...(config.retrievalTimeoutMs !== null ? { retrievalTimeoutMs: config.retrievalTimeoutMs } : {}),
|
|
81
|
+
minUploadBytes: config.minUploadBytes,
|
|
82
|
+
maxUploadBytes: config.maxUploadBytes,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return new FilecoinRawContentStore(client);
|
|
86
|
+
}
|
|
87
|
+
export { FilecoinRawContentStore } from './backend.js';
|
|
88
|
+
// Public read-side projection lives in `src/storage/filecoin-public-metadata.ts`
|
|
89
|
+
// so route + service consumers don't import providers/filecoin/* directly.
|
|
90
|
+
// The provider directory keeps the internal upload allowlist only.
|
|
91
|
+
/**
|
|
92
|
+
* Synapse `metadata` accepts `Record<string, string>` only. Convert
|
|
93
|
+
* any number/boolean values from the parsed `dataSetMetadata` to
|
|
94
|
+
* their canonical string form so the SDK boundary stays
|
|
95
|
+
* type-aligned with no silent truncation.
|
|
96
|
+
*/
|
|
97
|
+
function filecoinDataSetMetadataToStrings(metadata) {
|
|
98
|
+
const out = {};
|
|
99
|
+
for (const [k, v] of Object.entries(metadata)) {
|
|
100
|
+
out[k] = typeof v === 'string' ? v : String(v);
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file IPFS / CAR-root CID parser for the provider boundary.
|
|
3
|
+
*
|
|
4
|
+
* Phase 4 introduces an optional `ipfs_cid` slot on the
|
|
5
|
+
* Filecoin sidecar: a future driver (filecoin-pin) will emit
|
|
6
|
+
* the IPFS / CAR-root identity alongside the canonical PieceCID
|
|
7
|
+
* so consumers that resolve content via IPFS gateways can do so
|
|
8
|
+
* without re-deriving the CID from bytes. Today the live Synapse
|
|
9
|
+
* driver leaves the slot undefined; this parser exists to gate
|
|
10
|
+
* the slot whenever a future driver populates it.
|
|
11
|
+
*
|
|
12
|
+
* The parser uses `multiformats/cid`, which is already inside
|
|
13
|
+
* the lazy provider-load graph (it's a transitive dependency of
|
|
14
|
+
* `@filoz/synapse-core/piece`). Importing it here therefore does
|
|
15
|
+
* NOT change the eager-import surface — non-Filecoin-provider
|
|
16
|
+
* startups still avoid the Filecoin SDK entirely.
|
|
17
|
+
*
|
|
18
|
+
* Codec policy: we accept any CIDv1 (`code` is any IPLD codec,
|
|
19
|
+
* `version === 1`). CIDv0 (`Qm…` base58btc) is rejected — the
|
|
20
|
+
* sidecar slot is a forward-looking field and we do not need to
|
|
21
|
+
* accept the legacy 1.0 shape. The canonical multibase form is
|
|
22
|
+
* `base32-lower` (`b…`); non-canonical encodings (e.g. base58btc
|
|
23
|
+
* `z…`) parse but are returned in their canonical form so the
|
|
24
|
+
* persisted sidecar value is deterministic regardless of how the
|
|
25
|
+
* driver originally serialized it.
|
|
26
|
+
*
|
|
27
|
+
* Sister module — `./piece-cid.ts` performs the same role for
|
|
28
|
+
* PieceCIDv2 via the Synapse SDK's `asPieceCID`. The two parsers
|
|
29
|
+
* are kept separate because the PieceCID parser ALSO enforces
|
|
30
|
+
* codec semantics (raw codec 0x55 + multihash 0x1011), which
|
|
31
|
+
* the IPFS CID slot intentionally does NOT — an IPFS CID may
|
|
32
|
+
* be dag-pb, raw, dag-cbor, etc.
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* Returns the canonical CIDv1 string form of `value`, or throws
|
|
36
|
+
* `FilecoinProviderError('invalid_ipfs_cid', ...)` with a
|
|
37
|
+
* sanitized message when the value is not a string, is not a
|
|
38
|
+
* parsable CID, or is a CIDv0 (`Qm…`). Promoting a CIDv1 from a
|
|
39
|
+
* non-canonical multibase encoding to its canonical base32-lower
|
|
40
|
+
* `b…` form is done here so callers always get the deterministic
|
|
41
|
+
* persisted shape.
|
|
42
|
+
*
|
|
43
|
+
* `context` is a short noun-phrase that names the seam the
|
|
44
|
+
* caller is guarding (e.g. `"upload result ipfsCid"`). The
|
|
45
|
+
* rejected 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 declare function requireIpfsCid(value: unknown, context: string): string;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file IPFS / CAR-root CID parser for the provider boundary.
|
|
3
|
+
*
|
|
4
|
+
* Phase 4 introduces an optional `ipfs_cid` slot on the
|
|
5
|
+
* Filecoin sidecar: a future driver (filecoin-pin) will emit
|
|
6
|
+
* the IPFS / CAR-root identity alongside the canonical PieceCID
|
|
7
|
+
* so consumers that resolve content via IPFS gateways can do so
|
|
8
|
+
* without re-deriving the CID from bytes. Today the live Synapse
|
|
9
|
+
* driver leaves the slot undefined; this parser exists to gate
|
|
10
|
+
* the slot whenever a future driver populates it.
|
|
11
|
+
*
|
|
12
|
+
* The parser uses `multiformats/cid`, which is already inside
|
|
13
|
+
* the lazy provider-load graph (it's a transitive dependency of
|
|
14
|
+
* `@filoz/synapse-core/piece`). Importing it here therefore does
|
|
15
|
+
* NOT change the eager-import surface — non-Filecoin-provider
|
|
16
|
+
* startups still avoid the Filecoin SDK entirely.
|
|
17
|
+
*
|
|
18
|
+
* Codec policy: we accept any CIDv1 (`code` is any IPLD codec,
|
|
19
|
+
* `version === 1`). CIDv0 (`Qm…` base58btc) is rejected — the
|
|
20
|
+
* sidecar slot is a forward-looking field and we do not need to
|
|
21
|
+
* accept the legacy 1.0 shape. The canonical multibase form is
|
|
22
|
+
* `base32-lower` (`b…`); non-canonical encodings (e.g. base58btc
|
|
23
|
+
* `z…`) parse but are returned in their canonical form so the
|
|
24
|
+
* persisted sidecar value is deterministic regardless of how the
|
|
25
|
+
* driver originally serialized it.
|
|
26
|
+
*
|
|
27
|
+
* Sister module — `./piece-cid.ts` performs the same role for
|
|
28
|
+
* PieceCIDv2 via the Synapse SDK's `asPieceCID`. The two parsers
|
|
29
|
+
* are kept separate because the PieceCID parser ALSO enforces
|
|
30
|
+
* codec semantics (raw codec 0x55 + multihash 0x1011), which
|
|
31
|
+
* the IPFS CID slot intentionally does NOT — an IPFS CID may
|
|
32
|
+
* be dag-pb, raw, dag-cbor, etc.
|
|
33
|
+
*/
|
|
34
|
+
import { CID } from 'multiformats/cid';
|
|
35
|
+
import { FilecoinProviderError } from './errors.js';
|
|
36
|
+
/**
|
|
37
|
+
* Returns the canonical CIDv1 string form of `value`, or throws
|
|
38
|
+
* `FilecoinProviderError('invalid_ipfs_cid', ...)` with a
|
|
39
|
+
* sanitized message when the value is not a string, is not a
|
|
40
|
+
* parsable CID, or is a CIDv0 (`Qm…`). Promoting a CIDv1 from a
|
|
41
|
+
* non-canonical multibase encoding to its canonical base32-lower
|
|
42
|
+
* `b…` form is done here so callers always get the deterministic
|
|
43
|
+
* persisted shape.
|
|
44
|
+
*
|
|
45
|
+
* `context` is a short noun-phrase that names the seam the
|
|
46
|
+
* caller is guarding (e.g. `"upload result ipfsCid"`). The
|
|
47
|
+
* rejected value itself is NEVER echoed into the error message —
|
|
48
|
+
* malformed CIDs may encode adversarial bytes worth keeping out
|
|
49
|
+
* of log streams. The closed-set `errorCode` is the diagnostic
|
|
50
|
+
* surface.
|
|
51
|
+
*/
|
|
52
|
+
export function requireIpfsCid(value, context) {
|
|
53
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
54
|
+
try {
|
|
55
|
+
const parsed = CID.parse(value);
|
|
56
|
+
if (parsed.version === 1)
|
|
57
|
+
return parsed.toString();
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Fall through to the sanitized throw below.
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
throw new FilecoinProviderError('invalid_ipfs_cid', `Filecoin ${context} carries a value that is not a valid CIDv1.`);
|
|
64
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
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 declare const ALLOWED_FILECOIN_METADATA_KEYS: readonly ["artifact_id", "storage_profile_id", "content_type", "stored_hash", "codec_name", "codec_version", "codec_key_id", "source_kind"];
|
|
37
|
+
export type AllowedFilecoinMetadataKey = (typeof ALLOWED_FILECOIN_METADATA_KEYS)[number];
|
|
38
|
+
/**
|
|
39
|
+
* Closed denylist — keys / shapes `buildFilecoinMetadata` MUST
|
|
40
|
+
* reject if a caller (or a stray test fixture) tries to push them
|
|
41
|
+
* onto a Filecoin upload. The list pins items that, if leaked
|
|
42
|
+
* through `provider_metadata` or `data_set_metadata`, would expose
|
|
43
|
+
* secrets or sensitive operational state.
|
|
44
|
+
*/
|
|
45
|
+
export declare const FILECOIN_METADATA_DENYLIST: readonly ["private_key", "wallet_address", "payment_rail", "rail_id", "signed_request", "authorization", "auth_header", "ucan_proof", "synapse_response", "raw_synapse_payload"];
|
|
46
|
+
export declare const FILECOIN_METADATA_RESERVED_PREFIXES: readonly ["atomicmemory.", "synapse.", "filecoin.", "_"];
|
|
47
|
+
/**
|
|
48
|
+
* Scalar leaf-type set accepted by `buildFilecoinMetadata`.
|
|
49
|
+
* Matches the existing `ArtifactMetadata` write-side contract
|
|
50
|
+
* (string | finite number | boolean).
|
|
51
|
+
*/
|
|
52
|
+
export type FilecoinMetadataLeaf = string | number | boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Input to `buildFilecoinMetadata`: any caller-supplied bag of
|
|
55
|
+
* metadata. Keys are normalized to the allowlist before any I/O;
|
|
56
|
+
* non-leaf values (arrays, objects, null, undefined) cause the
|
|
57
|
+
* call to throw so callers cannot quietly leak shape.
|
|
58
|
+
*/
|
|
59
|
+
export type FilecoinMetadataInput = Record<string, unknown>;
|
|
60
|
+
/** Projected closed-shape envelope ready to ship to the provider. */
|
|
61
|
+
export type FilecoinMetadataEnvelope = Readonly<Partial<Record<AllowedFilecoinMetadataKey, FilecoinMetadataLeaf>>>;
|
|
62
|
+
/**
|
|
63
|
+
* Project caller-supplied metadata down to the allowlisted closed
|
|
64
|
+
* envelope, enforcing Synapse's per-piece limits (≤5 entries, ≤32
|
|
65
|
+
* char keys, ≤128 char string values). Throws on denylisted keys,
|
|
66
|
+
* reserved-prefix keys, non-scalar values, over-long strings, or
|
|
67
|
+
* an output that would exceed the 5-key cap. Unknown (non-
|
|
68
|
+
* allowlisted, non-denylisted) keys are silently dropped — fail-
|
|
69
|
+
* open on inputs we don't understand would surface secrets on a
|
|
70
|
+
* future contributor's keystroke.
|
|
71
|
+
*/
|
|
72
|
+
export declare function buildFilecoinMetadata(input: FilecoinMetadataInput): FilecoinMetadataEnvelope;
|