@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,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Paired DB transactions for `StorageService.deleteArtifact`'s
|
|
3
|
+
* `policy=with_documents` finalization.
|
|
4
|
+
*
|
|
5
|
+
* Step 7 follow-up fix: the artifact's CAS-on-claim update and the
|
|
6
|
+
* cascaded `raw_documents.raw_storage_status` propagation must
|
|
7
|
+
* commit or roll back together. If they were two separate DB
|
|
8
|
+
* operations a partial-commit could leave the artifact terminal
|
|
9
|
+
* (`deleted` / `delete_failed`) while the linked raw_documents
|
|
10
|
+
* stayed at `blob_stored`/`blob_available`, and the
|
|
11
|
+
* `deleteArtifact` retry path would not heal it (a second DELETE
|
|
12
|
+
* on a `deleted` artifact short-circuits early; a `delete_failed`
|
|
13
|
+
* artifact skips the reference gate).
|
|
14
|
+
*
|
|
15
|
+
* Backend.delete itself runs OUTSIDE the transaction (it is a
|
|
16
|
+
* network call); the DB finalization of `artifact + cascaded docs`
|
|
17
|
+
* is what must be atomic.
|
|
18
|
+
*/
|
|
19
|
+
import pg from 'pg';
|
|
20
|
+
import { type StorageArtifactRow } from './storage-artifact-repository.js';
|
|
21
|
+
export interface FinalizeArtifactDeleteSuccessInput {
|
|
22
|
+
userId: string;
|
|
23
|
+
artifactId: string;
|
|
24
|
+
claimId: string;
|
|
25
|
+
cascadedDocumentIds: ReadonlyArray<string>;
|
|
26
|
+
/** Backend's delete semantics — drives the cascaded doc state. */
|
|
27
|
+
semantics: 'deleted' | 'unpinned' | 'tombstoned';
|
|
28
|
+
}
|
|
29
|
+
export interface FinalizeArtifactDeleteFailureInput {
|
|
30
|
+
userId: string;
|
|
31
|
+
artifactId: string;
|
|
32
|
+
claimId: string;
|
|
33
|
+
cascadedDocumentIds: ReadonlyArray<string>;
|
|
34
|
+
/** Error envelope for the artifact's `last_error` + each cascaded doc. */
|
|
35
|
+
lastError: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Success-path transaction. CAS-flips the artifact to `deleted` AND
|
|
39
|
+
* advances every cascaded raw_documents row to its terminal
|
|
40
|
+
* `blob_deleted` / `blob_tombstoned` state in one BEGIN..COMMIT.
|
|
41
|
+
* Either both commit or both roll back; a partial-commit cannot
|
|
42
|
+
* leave the rows in a drifted state.
|
|
43
|
+
*/
|
|
44
|
+
export declare function finalizeArtifactDeleteSuccessTx(pool: pg.Pool, input: FinalizeArtifactDeleteSuccessInput): Promise<StorageArtifactRow>;
|
|
45
|
+
/**
|
|
46
|
+
* Failure-path transaction. CAS-flips the artifact to `delete_failed`
|
|
47
|
+
* (recording `last_error`) AND advances every cascaded
|
|
48
|
+
* raw_documents row to `raw_storage_failed` with the same envelope,
|
|
49
|
+
* atomically.
|
|
50
|
+
*/
|
|
51
|
+
export declare function finalizeArtifactDeleteFailureTx(pool: pg.Pool, input: FinalizeArtifactDeleteFailureInput): Promise<StorageArtifactRow>;
|
|
52
|
+
export declare class CascadedRawDocumentMismatchError extends Error {
|
|
53
|
+
readonly matched: number;
|
|
54
|
+
readonly expectedIds: ReadonlyArray<string>;
|
|
55
|
+
constructor(matched: number, expectedIds: ReadonlyArray<string>);
|
|
56
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Paired DB transactions for `StorageService.deleteArtifact`'s
|
|
3
|
+
* `policy=with_documents` finalization.
|
|
4
|
+
*
|
|
5
|
+
* Step 7 follow-up fix: the artifact's CAS-on-claim update and the
|
|
6
|
+
* cascaded `raw_documents.raw_storage_status` propagation must
|
|
7
|
+
* commit or roll back together. If they were two separate DB
|
|
8
|
+
* operations a partial-commit could leave the artifact terminal
|
|
9
|
+
* (`deleted` / `delete_failed`) while the linked raw_documents
|
|
10
|
+
* stayed at `blob_stored`/`blob_available`, and the
|
|
11
|
+
* `deleteArtifact` retry path would not heal it (a second DELETE
|
|
12
|
+
* on a `deleted` artifact short-circuits early; a `delete_failed`
|
|
13
|
+
* artifact skips the reference gate).
|
|
14
|
+
*
|
|
15
|
+
* Backend.delete itself runs OUTSIDE the transaction (it is a
|
|
16
|
+
* network call); the DB finalization of `artifact + cascaded docs`
|
|
17
|
+
* is what must be atomic.
|
|
18
|
+
*/
|
|
19
|
+
import { markDeleteFailed, markDeleteSuccess, } from './storage-artifact-repository.js';
|
|
20
|
+
/**
|
|
21
|
+
* Success-path transaction. CAS-flips the artifact to `deleted` AND
|
|
22
|
+
* advances every cascaded raw_documents row to its terminal
|
|
23
|
+
* `blob_deleted` / `blob_tombstoned` state in one BEGIN..COMMIT.
|
|
24
|
+
* Either both commit or both roll back; a partial-commit cannot
|
|
25
|
+
* leave the rows in a drifted state.
|
|
26
|
+
*/
|
|
27
|
+
export async function finalizeArtifactDeleteSuccessTx(pool, input) {
|
|
28
|
+
const client = await pool.connect();
|
|
29
|
+
try {
|
|
30
|
+
await client.query('BEGIN');
|
|
31
|
+
const artifact = await markDeleteSuccess(client, {
|
|
32
|
+
userId: input.userId,
|
|
33
|
+
id: input.artifactId,
|
|
34
|
+
claimId: input.claimId,
|
|
35
|
+
});
|
|
36
|
+
await propagateRawStorageTerminalWithClient(client, input.userId, input.cascadedDocumentIds, input.semantics);
|
|
37
|
+
await client.query('COMMIT');
|
|
38
|
+
return artifact;
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
client.release();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Failure-path transaction. CAS-flips the artifact to `delete_failed`
|
|
50
|
+
* (recording `last_error`) AND advances every cascaded
|
|
51
|
+
* raw_documents row to `raw_storage_failed` with the same envelope,
|
|
52
|
+
* atomically.
|
|
53
|
+
*/
|
|
54
|
+
export async function finalizeArtifactDeleteFailureTx(pool, input) {
|
|
55
|
+
const client = await pool.connect();
|
|
56
|
+
try {
|
|
57
|
+
await client.query('BEGIN');
|
|
58
|
+
const artifact = await markDeleteFailed(client, {
|
|
59
|
+
userId: input.userId,
|
|
60
|
+
id: input.artifactId,
|
|
61
|
+
claimId: input.claimId,
|
|
62
|
+
lastError: input.lastError,
|
|
63
|
+
});
|
|
64
|
+
await propagateRawStorageFailureWithClient(client, input.userId, input.cascadedDocumentIds, input.lastError);
|
|
65
|
+
await client.query('COMMIT');
|
|
66
|
+
return artifact;
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
client.release();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function propagateRawStorageTerminalWithClient(client, userId, ids, semantics) {
|
|
77
|
+
if (ids.length === 0)
|
|
78
|
+
return;
|
|
79
|
+
const uniqueIds = Array.from(new Set(ids));
|
|
80
|
+
const newStatus = semantics === 'deleted' ? 'blob_deleted' : 'blob_tombstoned';
|
|
81
|
+
const result = await client.query(`UPDATE raw_documents
|
|
82
|
+
SET raw_storage_status = $1, updated_at = NOW()
|
|
83
|
+
WHERE user_id = $2 AND id = ANY($3::uuid[]) AND deleted_at IS NOT NULL`, [newStatus, userId, uniqueIds]);
|
|
84
|
+
assertCascadedRowCount(result.rowCount ?? 0, uniqueIds);
|
|
85
|
+
}
|
|
86
|
+
async function propagateRawStorageFailureWithClient(client, userId, ids, lastError) {
|
|
87
|
+
if (ids.length === 0)
|
|
88
|
+
return;
|
|
89
|
+
const uniqueIds = Array.from(new Set(ids));
|
|
90
|
+
const result = await client.query(`UPDATE raw_documents
|
|
91
|
+
SET raw_storage_status = 'raw_storage_failed',
|
|
92
|
+
last_error = $1::jsonb,
|
|
93
|
+
updated_at = NOW()
|
|
94
|
+
WHERE user_id = $2 AND id = ANY($3::uuid[]) AND deleted_at IS NOT NULL`, [JSON.stringify(lastError), userId, uniqueIds]);
|
|
95
|
+
assertCascadedRowCount(result.rowCount ?? 0, uniqueIds);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Refuse to commit the paired tx when the cascaded raw_documents
|
|
99
|
+
* UPDATE matched fewer rows than the caller asked us to propagate
|
|
100
|
+
* onto. SQL UPDATE success is not semantic success — a stale id,
|
|
101
|
+
* wrong-owner id, or not-yet-soft-deleted id would otherwise let the
|
|
102
|
+
* artifact finalize as `deleted` / `delete_failed` while at least
|
|
103
|
+
* one intended raw_document stayed at `blob_stored` / `blob_available`,
|
|
104
|
+
* and no retry path heals that drift. Throwing rolls back the whole
|
|
105
|
+
* tx so caller + DB stay consistent.
|
|
106
|
+
*/
|
|
107
|
+
function assertCascadedRowCount(matched, uniqueIds) {
|
|
108
|
+
if (matched === uniqueIds.length)
|
|
109
|
+
return;
|
|
110
|
+
throw new CascadedRawDocumentMismatchError(matched, uniqueIds);
|
|
111
|
+
}
|
|
112
|
+
export class CascadedRawDocumentMismatchError extends Error {
|
|
113
|
+
matched;
|
|
114
|
+
expectedIds;
|
|
115
|
+
constructor(matched, expectedIds) {
|
|
116
|
+
super(`finalize cascade matched ${matched} of ${expectedIds.length} raw_documents ` +
|
|
117
|
+
`(ids: ${expectedIds.join(', ')}) — refusing to finalize artifact while ` +
|
|
118
|
+
'a cascaded row remains stale');
|
|
119
|
+
this.matched = matched;
|
|
120
|
+
this.expectedIds = expectedIds;
|
|
121
|
+
this.name = 'CascadedRawDocumentMismatchError';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Neutral constants for `storage_artifacts.provider` values.
|
|
3
|
+
*
|
|
4
|
+
* Step 7 originally exported `EXTERNAL_POINTER_PROVIDER` from
|
|
5
|
+
* `services/document-upload-artifact-sync.ts`, but that reversed the
|
|
6
|
+
* dependency direction: `db/raw-document-repository.ts` (a low-level
|
|
7
|
+
* persistence module) had to import from a service. Moving the
|
|
8
|
+
* constant here keeps the DB and service layers free to share it
|
|
9
|
+
* without the cycle.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* `provider` value for pointer-mode `storage_artifacts` rows created
|
|
13
|
+
* at document-registration time. The bytes live at a caller-supplied
|
|
14
|
+
* URI managed by some external system; the AtomicMemory deployment
|
|
15
|
+
* is NOT the provider — it only tracks the reference. Treated as a
|
|
16
|
+
* backend-agnostic external pointer; the redaction allowlist
|
|
17
|
+
* (`src/storage/artifact-public-redaction.ts`) does not have an
|
|
18
|
+
* entry for `'external_pointer'`, so `identifiers` /
|
|
19
|
+
* `provider_details` come back as empty objects on the wire.
|
|
20
|
+
*/
|
|
21
|
+
export declare const EXTERNAL_POINTER_PROVIDER: "external_pointer";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Neutral constants for `storage_artifacts.provider` values.
|
|
3
|
+
*
|
|
4
|
+
* Step 7 originally exported `EXTERNAL_POINTER_PROVIDER` from
|
|
5
|
+
* `services/document-upload-artifact-sync.ts`, but that reversed the
|
|
6
|
+
* dependency direction: `db/raw-document-repository.ts` (a low-level
|
|
7
|
+
* persistence module) had to import from a service. Moving the
|
|
8
|
+
* constant here keeps the DB and service layers free to share it
|
|
9
|
+
* without the cycle.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* `provider` value for pointer-mode `storage_artifacts` rows created
|
|
13
|
+
* at document-registration time. The bytes live at a caller-supplied
|
|
14
|
+
* URI managed by some external system; the AtomicMemory deployment
|
|
15
|
+
* is NOT the provider — it only tracks the reference. Treated as a
|
|
16
|
+
* backend-agnostic external pointer; the redaction allowlist
|
|
17
|
+
* (`src/storage/artifact-public-redaction.ts`) does not have an
|
|
18
|
+
* entry for `'external_pointer'`, so `identifiers` /
|
|
19
|
+
* `provider_details` come back as empty objects on the wire.
|
|
20
|
+
*/
|
|
21
|
+
export const EXTERNAL_POINTER_PROVIDER = 'external_pointer';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Storage-level recovery-hint repository.
|
|
3
|
+
*
|
|
4
|
+
* `recordStorageUploadRecoveryHint` writes an
|
|
5
|
+
* `internal_recovery_hint` envelope onto `storage_artifacts.last_error`
|
|
6
|
+
* for a pending row, scoped by `(id, user_id, put_attempt_id)` CAS.
|
|
7
|
+
* The helper exists as its own module (not folded into
|
|
8
|
+
* `storage-artifact-repository.ts`) so the existing 800-line repo
|
|
9
|
+
* file stays under the workspace LOC cap and so the recovery
|
|
10
|
+
* envelope shape is documented in a single place.
|
|
11
|
+
*
|
|
12
|
+
* v1 path: reuses the existing `last_error` JSONB column. A
|
|
13
|
+
* dedicated `storage_recovery_events` table is deferred — multi-step
|
|
14
|
+
* recovery state machines can land that table when a real consumer
|
|
15
|
+
* shows up.
|
|
16
|
+
*
|
|
17
|
+
* Document-side recovery (the rarer post-put orphan branch in
|
|
18
|
+
* `storage-put-recovery.ts`) writes its own envelopes. This helper
|
|
19
|
+
* is for non-document storage flows that produce a recovery hint
|
|
20
|
+
* BEFORE the row leaves the `pending` state — direct
|
|
21
|
+
* `POST /v1/storage/artifacts` uploads, the future Filecoin
|
|
22
|
+
* readiness gate, etc. The envelope shape matches the existing
|
|
23
|
+
* `{ layer, code, message, occurred_at }` contract so log readers
|
|
24
|
+
* see one consistent shape.
|
|
25
|
+
*/
|
|
26
|
+
import type pg from 'pg';
|
|
27
|
+
/**
|
|
28
|
+
* Closed type for the recovery hint code. New entries land here as
|
|
29
|
+
* the contract grows; ad-hoc strings are rejected at the API
|
|
30
|
+
* boundary so log consumers can rely on a stable enum.
|
|
31
|
+
*/
|
|
32
|
+
export type StorageUploadRecoveryHintCode = 'manual_delete_required' | 'awaiting_provider_readiness' | 'awaiting_payment_authorization' | 'operator_intervention_required';
|
|
33
|
+
export interface StorageUploadRecoveryHintInput {
|
|
34
|
+
readonly artifactId: string;
|
|
35
|
+
readonly userId: string;
|
|
36
|
+
readonly putAttemptId: string;
|
|
37
|
+
readonly hint: StorageUploadRecoveryHintCode;
|
|
38
|
+
readonly message?: string;
|
|
39
|
+
readonly storageProvider?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Shape of the JSONB envelope written to `storage_artifacts.last_error`.
|
|
43
|
+
* Exported so tests + downstream log consumers can construct or
|
|
44
|
+
* inspect envelopes without re-typing the field set.
|
|
45
|
+
*/
|
|
46
|
+
export interface StorageUploadRecoveryHintEnvelope {
|
|
47
|
+
readonly layer: 'raw_storage';
|
|
48
|
+
readonly code: 'internal_recovery_hint';
|
|
49
|
+
readonly internal_recovery_hint: StorageUploadRecoveryHintCode;
|
|
50
|
+
readonly message: string;
|
|
51
|
+
readonly storage_provider?: string;
|
|
52
|
+
readonly occurred_at: string;
|
|
53
|
+
}
|
|
54
|
+
export declare function buildRecoveryHintEnvelope(input: StorageUploadRecoveryHintInput, now?: () => Date): StorageUploadRecoveryHintEnvelope;
|
|
55
|
+
/**
|
|
56
|
+
* CAS-write a recovery hint onto `storage_artifacts.last_error` for
|
|
57
|
+
* a pending row. Returns `true` when the CAS matched (`id`,
|
|
58
|
+
* `user_id`, `put_attempt_id`, `status='pending'`), `false` when
|
|
59
|
+
* the row was finalized or claimed by another worker.
|
|
60
|
+
*
|
|
61
|
+
* The hint is RECORDED ONLY — this helper does not mutate `status`,
|
|
62
|
+
* `put_attempt_id`, or any other column. The next phase (manual
|
|
63
|
+
* operator intervention, retry, etc.) is responsible for clearing
|
|
64
|
+
* or replacing the hint via the existing CAS helpers.
|
|
65
|
+
*/
|
|
66
|
+
export declare function recordStorageUploadRecoveryHint(q: pg.Pool | pg.PoolClient, input: StorageUploadRecoveryHintInput, now?: () => Date): Promise<boolean>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Storage-level recovery-hint repository.
|
|
3
|
+
*
|
|
4
|
+
* `recordStorageUploadRecoveryHint` writes an
|
|
5
|
+
* `internal_recovery_hint` envelope onto `storage_artifacts.last_error`
|
|
6
|
+
* for a pending row, scoped by `(id, user_id, put_attempt_id)` CAS.
|
|
7
|
+
* The helper exists as its own module (not folded into
|
|
8
|
+
* `storage-artifact-repository.ts`) so the existing 800-line repo
|
|
9
|
+
* file stays under the workspace LOC cap and so the recovery
|
|
10
|
+
* envelope shape is documented in a single place.
|
|
11
|
+
*
|
|
12
|
+
* v1 path: reuses the existing `last_error` JSONB column. A
|
|
13
|
+
* dedicated `storage_recovery_events` table is deferred — multi-step
|
|
14
|
+
* recovery state machines can land that table when a real consumer
|
|
15
|
+
* shows up.
|
|
16
|
+
*
|
|
17
|
+
* Document-side recovery (the rarer post-put orphan branch in
|
|
18
|
+
* `storage-put-recovery.ts`) writes its own envelopes. This helper
|
|
19
|
+
* is for non-document storage flows that produce a recovery hint
|
|
20
|
+
* BEFORE the row leaves the `pending` state — direct
|
|
21
|
+
* `POST /v1/storage/artifacts` uploads, the future Filecoin
|
|
22
|
+
* readiness gate, etc. The envelope shape matches the existing
|
|
23
|
+
* `{ layer, code, message, occurred_at }` contract so log readers
|
|
24
|
+
* see one consistent shape.
|
|
25
|
+
*/
|
|
26
|
+
export function buildRecoveryHintEnvelope(input, now = () => new Date()) {
|
|
27
|
+
const envelope = {
|
|
28
|
+
layer: 'raw_storage',
|
|
29
|
+
code: 'internal_recovery_hint',
|
|
30
|
+
internal_recovery_hint: input.hint,
|
|
31
|
+
message: input.message ?? input.hint,
|
|
32
|
+
...(input.storageProvider ? { storage_provider: input.storageProvider } : {}),
|
|
33
|
+
occurred_at: now().toISOString(),
|
|
34
|
+
};
|
|
35
|
+
return envelope;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* CAS-write a recovery hint onto `storage_artifacts.last_error` for
|
|
39
|
+
* a pending row. Returns `true` when the CAS matched (`id`,
|
|
40
|
+
* `user_id`, `put_attempt_id`, `status='pending'`), `false` when
|
|
41
|
+
* the row was finalized or claimed by another worker.
|
|
42
|
+
*
|
|
43
|
+
* The hint is RECORDED ONLY — this helper does not mutate `status`,
|
|
44
|
+
* `put_attempt_id`, or any other column. The next phase (manual
|
|
45
|
+
* operator intervention, retry, etc.) is responsible for clearing
|
|
46
|
+
* or replacing the hint via the existing CAS helpers.
|
|
47
|
+
*/
|
|
48
|
+
export async function recordStorageUploadRecoveryHint(q, input, now = () => new Date()) {
|
|
49
|
+
const envelope = buildRecoveryHintEnvelope(input, now);
|
|
50
|
+
const result = await q.query(`UPDATE storage_artifacts
|
|
51
|
+
SET last_error = $4::jsonb,
|
|
52
|
+
updated_at = NOW()
|
|
53
|
+
WHERE id = $1
|
|
54
|
+
AND user_id = $2
|
|
55
|
+
AND put_attempt_id = $3
|
|
56
|
+
AND status = 'pending'`, [input.artifactId, input.userId, input.putAttemptId, JSON.stringify(envelope)]);
|
|
57
|
+
return (result.rowCount ?? 0) > 0;
|
|
58
|
+
}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Postgres queries for the `storage_artifacts` table.
|
|
3
|
+
*
|
|
4
|
+
* Step 4 of the storage-sibling plan. Single DB seam for everything
|
|
5
|
+
* artifact-shaped. No HTTP routes, no business logic, no response
|
|
6
|
+
* formatters — those land in Step 5.
|
|
7
|
+
*
|
|
8
|
+
* Owner-scoping rule: every public method except `createStorageArtifact`
|
|
9
|
+
* takes `userId` and routes it into the WHERE clause. Cross-user reads
|
|
10
|
+
* and writes return `null` / zero / no rows; they never throw. The
|
|
11
|
+
* route layer (Step 5) is responsible for translating that into the
|
|
12
|
+
* correct 404 envelope.
|
|
13
|
+
*
|
|
14
|
+
* Internal columns:
|
|
15
|
+
* * `plaintext_hash` / `stored_hash` — visible on the repository's
|
|
16
|
+
* row type for diagnostic queries. The Step-5 response formatter
|
|
17
|
+
* is the only call site that decides whether to expose them on
|
|
18
|
+
* the wire (gated by `discloseContentHash`).
|
|
19
|
+
* * `last_error` — internal failure envelope; same story.
|
|
20
|
+
*
|
|
21
|
+
* The repo writes a closed set of `status` values:
|
|
22
|
+
*
|
|
23
|
+
* stored | pending | available | unavailable | deleting | deleted
|
|
24
|
+
* | delete_failed | failed
|
|
25
|
+
*
|
|
26
|
+
* Mirrors the SDK's `StorageArtifactStatus` and is enforced by the
|
|
27
|
+
* `storage_artifacts_status_check` constraint in `schema.sql`.
|
|
28
|
+
*/
|
|
29
|
+
import pg from 'pg';
|
|
30
|
+
/** Internal lifecycle state — closed enum mirrored from the SDK. */
|
|
31
|
+
export type StorageArtifactStatus = 'stored' | 'pending' | 'available' | 'unavailable' | 'deleting' | 'deleted' | 'delete_failed' | 'failed';
|
|
32
|
+
export type StorageArtifactMode = 'pointer' | 'managed';
|
|
33
|
+
export type StorageContentEncoding = 'identity' | 'aes_gcm';
|
|
34
|
+
/**
|
|
35
|
+
* Full column projection. Carries the internal-only columns
|
|
36
|
+
* (`plaintext_hash`, `stored_hash`, `last_error`) — Step-5 wire
|
|
37
|
+
* projection is responsible for redaction.
|
|
38
|
+
*/
|
|
39
|
+
export interface StorageArtifactRow {
|
|
40
|
+
id: string;
|
|
41
|
+
userId: string;
|
|
42
|
+
orgId: string | null;
|
|
43
|
+
projectId: string | null;
|
|
44
|
+
provider: string;
|
|
45
|
+
mode: StorageArtifactMode;
|
|
46
|
+
/**
|
|
47
|
+
* Adapter URI. NULL while a managed row is in `pending` (the
|
|
48
|
+
* backend hasn't returned a URI yet) or `failed` (backend.put
|
|
49
|
+
* threw). Always set on `pointer` rows and on managed rows that
|
|
50
|
+
* reached `stored` / `available`.
|
|
51
|
+
*/
|
|
52
|
+
uri: string | null;
|
|
53
|
+
status: StorageArtifactStatus;
|
|
54
|
+
sizeBytes: number | null;
|
|
55
|
+
contentType: string | null;
|
|
56
|
+
plaintextHash: string | null;
|
|
57
|
+
storedHash: string | null;
|
|
58
|
+
contentEncoding: StorageContentEncoding;
|
|
59
|
+
discloseContentHash: boolean;
|
|
60
|
+
identifiers: Record<string, unknown>;
|
|
61
|
+
lifecycle: Record<string, unknown>;
|
|
62
|
+
replication: Record<string, unknown> | null;
|
|
63
|
+
verification: Record<string, unknown> | null;
|
|
64
|
+
retrieval: Record<string, unknown> | null;
|
|
65
|
+
providerDetails: Record<string, unknown> | null;
|
|
66
|
+
metadata: Record<string, unknown>;
|
|
67
|
+
lastError: Record<string, unknown> | null;
|
|
68
|
+
/** CAS token for the upload pipeline (pending → stored / failed). */
|
|
69
|
+
putAttemptId: string | null;
|
|
70
|
+
deleteAttemptId: string | null;
|
|
71
|
+
createdAt: Date;
|
|
72
|
+
updatedAt: Date;
|
|
73
|
+
deletedAt: Date | null;
|
|
74
|
+
}
|
|
75
|
+
export interface CreateStorageArtifactInput {
|
|
76
|
+
userId: string;
|
|
77
|
+
orgId?: string | null;
|
|
78
|
+
projectId?: string | null;
|
|
79
|
+
provider: string;
|
|
80
|
+
mode: StorageArtifactMode;
|
|
81
|
+
uri: string;
|
|
82
|
+
status: StorageArtifactStatus;
|
|
83
|
+
sizeBytes?: number | null;
|
|
84
|
+
contentType?: string | null;
|
|
85
|
+
plaintextHash?: string | null;
|
|
86
|
+
storedHash?: string | null;
|
|
87
|
+
contentEncoding?: StorageContentEncoding;
|
|
88
|
+
discloseContentHash?: boolean;
|
|
89
|
+
identifiers?: Record<string, unknown>;
|
|
90
|
+
lifecycle?: Record<string, unknown>;
|
|
91
|
+
replication?: Record<string, unknown> | null;
|
|
92
|
+
verification?: Record<string, unknown> | null;
|
|
93
|
+
retrieval?: Record<string, unknown> | null;
|
|
94
|
+
providerDetails?: Record<string, unknown> | null;
|
|
95
|
+
metadata?: Record<string, unknown>;
|
|
96
|
+
}
|
|
97
|
+
export interface StorageArtifactListCursor {
|
|
98
|
+
createdAt: string;
|
|
99
|
+
id: string;
|
|
100
|
+
}
|
|
101
|
+
export interface ListArtifactsOptions {
|
|
102
|
+
limit: number;
|
|
103
|
+
cursor?: StorageArtifactListCursor;
|
|
104
|
+
}
|
|
105
|
+
export interface ListArtifactsResult {
|
|
106
|
+
rows: StorageArtifactRow[];
|
|
107
|
+
nextCursor: StorageArtifactListCursor | null;
|
|
108
|
+
}
|
|
109
|
+
export interface MarkDeleteSuccessInput {
|
|
110
|
+
userId: string;
|
|
111
|
+
id: string;
|
|
112
|
+
claimId: string;
|
|
113
|
+
}
|
|
114
|
+
export interface MarkDeleteFailedInput {
|
|
115
|
+
userId: string;
|
|
116
|
+
id: string;
|
|
117
|
+
claimId: string;
|
|
118
|
+
lastError: Record<string, unknown>;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Insert a new artifact row. Status, provider, and mode must already
|
|
122
|
+
* be validated by the caller — the DB-level CHECKs are a backstop, not
|
|
123
|
+
* a substitute for service-layer input validation.
|
|
124
|
+
*/
|
|
125
|
+
export declare function createStorageArtifact(q: pg.Pool | pg.PoolClient, input: CreateStorageArtifactInput): Promise<StorageArtifactRow>;
|
|
126
|
+
/**
|
|
127
|
+
* Pending-row-first upload helpers — see
|
|
128
|
+
* `StorageService.putManaged` for the full lifecycle. The flow:
|
|
129
|
+
*
|
|
130
|
+
* 1. `claimPendingArtifact` inserts `status='pending'`, `uri=NULL`,
|
|
131
|
+
* `put_attempt_id=<fresh uuid>`. Returns the row + claim id.
|
|
132
|
+
* 2. Service calls `backend.put(...)` OUTSIDE the DB.
|
|
133
|
+
* 3a. On success: `recordUploadedArtifact` CAS-flips the row to
|
|
134
|
+
* `status='stored'`, sets `uri` + hashes + size, clears
|
|
135
|
+
* `put_attempt_id`. Returns the updated row.
|
|
136
|
+
* 3b. On `backend.put` failure: `markPutFailed` CAS-flips the row
|
|
137
|
+
* to `status='failed'`, records `last_error`, clears
|
|
138
|
+
* `put_attempt_id`.
|
|
139
|
+
* 3c. On post-put DB failure: the service's recovery path runs
|
|
140
|
+
* backend cleanup and writes a durable failed marker on the
|
|
141
|
+
* row (`put_post_persist_failed_cleaned_up` envelope) so ops
|
|
142
|
+
* sees `status='failed'`. When cleanup also fails, a durable
|
|
143
|
+
* `put_post_persist_unrecoverable` envelope captures the
|
|
144
|
+
* orphan URI on `last_error` server-side so the reconciler
|
|
145
|
+
* can find and delete the abandoned bytes later. See
|
|
146
|
+
* `services/storage-put-recovery.ts` for the full branch tree.
|
|
147
|
+
*/
|
|
148
|
+
export interface ClaimPendingArtifactInput {
|
|
149
|
+
userId: string;
|
|
150
|
+
orgId?: string | null;
|
|
151
|
+
projectId?: string | null;
|
|
152
|
+
provider: string;
|
|
153
|
+
contentType?: string | null;
|
|
154
|
+
contentEncoding?: StorageContentEncoding;
|
|
155
|
+
discloseContentHash?: boolean;
|
|
156
|
+
metadata?: Record<string, unknown>;
|
|
157
|
+
}
|
|
158
|
+
export interface ClaimPendingArtifactResult {
|
|
159
|
+
row: StorageArtifactRow;
|
|
160
|
+
claimId: string;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Insert a `status='pending'` managed artifact row with a fresh
|
|
164
|
+
* `put_attempt_id`. The URI is NULL — set by `recordUploadedArtifact`
|
|
165
|
+
* after the backend put succeeds.
|
|
166
|
+
*/
|
|
167
|
+
export declare function claimPendingArtifact(q: pg.Pool | pg.PoolClient, input: ClaimPendingArtifactInput): Promise<ClaimPendingArtifactResult>;
|
|
168
|
+
export interface RecordUploadedArtifactInput {
|
|
169
|
+
userId: string;
|
|
170
|
+
artifactId: string;
|
|
171
|
+
putAttemptId: string;
|
|
172
|
+
uri: string;
|
|
173
|
+
sizeBytes: number;
|
|
174
|
+
plaintextHash: string;
|
|
175
|
+
storedHash: string;
|
|
176
|
+
identifiers?: Record<string, unknown>;
|
|
177
|
+
providerDetails?: Record<string, unknown> | null;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* CAS-flip a pending row to `status='stored'`. Matches on
|
|
181
|
+
* `(id, user_id, put_attempt_id, status='pending')` so a stale
|
|
182
|
+
* caller cannot finalize someone else's claim. Returns the updated
|
|
183
|
+
* row when the CAS succeeded; `null` when it lost the race.
|
|
184
|
+
*/
|
|
185
|
+
export declare function recordUploadedArtifact(q: pg.Pool | pg.PoolClient, input: RecordUploadedArtifactInput): Promise<StorageArtifactRow | null>;
|
|
186
|
+
export interface MarkPutFailedInput {
|
|
187
|
+
userId: string;
|
|
188
|
+
artifactId: string;
|
|
189
|
+
putAttemptId: string;
|
|
190
|
+
lastError: Record<string, unknown>;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* CAS-flip a pending row to `status='failed'` with the supplied
|
|
194
|
+
* `last_error` envelope. Same CAS shape as `recordUploadedArtifact`.
|
|
195
|
+
* Returns the failed row when the CAS succeeded; `null` when it
|
|
196
|
+
* lost the race (claim already cleared by another caller).
|
|
197
|
+
*/
|
|
198
|
+
export declare function markPutFailed(q: pg.Pool | pg.PoolClient, input: MarkPutFailedInput): Promise<StorageArtifactRow | null>;
|
|
199
|
+
/** Owner-scoped lookup. Returns `null` for cross-user / missing / deleted rows. */
|
|
200
|
+
export declare function getStorageArtifactById(pool: pg.Pool, userId: string, id: string): Promise<StorageArtifactRow | null>;
|
|
201
|
+
/**
|
|
202
|
+
* Owner-scoped lookup that DOES return soft-deleted rows. Used by
|
|
203
|
+
* the delete-policy state machine so a second `DELETE` on an
|
|
204
|
+
* already-deleted artifact can return the prior terminal envelope
|
|
205
|
+
* (the plan's idempotency contract) instead of a 404.
|
|
206
|
+
*/
|
|
207
|
+
export declare function getStorageArtifactByIdIncludingDeleted(pool: pg.Pool, userId: string, id: string): Promise<StorageArtifactRow | null>;
|
|
208
|
+
/**
|
|
209
|
+
* Mark an artifact `status='deleted'` + stamp `deleted_at`. Used by
|
|
210
|
+
* Step 7's document-ingestion refactor when a managed upload
|
|
211
|
+
* replaces a previously-linked pointer artifact (or when a managed
|
|
212
|
+
* artifact's bytes are cleaned up post-document-delete). Owner-
|
|
213
|
+
* scoped + idempotent: a row that is already `deleted` stays so.
|
|
214
|
+
*
|
|
215
|
+
* Distinct from `markDeleteSuccess` because there is no claim id
|
|
216
|
+
* to CAS on — the caller has already confirmed the row should be
|
|
217
|
+
* tombstoned (e.g. the upload service holds the document-row
|
|
218
|
+
* advisory lock).
|
|
219
|
+
*/
|
|
220
|
+
export declare function softDeleteArtifactByIdWithClient(q: pg.Pool | pg.PoolClient, userId: string, id: string): Promise<void>;
|
|
221
|
+
/**
|
|
222
|
+
* Count active `raw_documents` rows that reference this artifact for
|
|
223
|
+
* the supplied owner. The Step-5 delete route uses this to enforce
|
|
224
|
+
* the `artifact_in_use` 409 envelope when callers omit
|
|
225
|
+
* `policy=with_documents`.
|
|
226
|
+
*
|
|
227
|
+
* Owner-scope invariant: the count includes a row only when BOTH the
|
|
228
|
+
* artifact and the referencing document belong to `$userId`. The
|
|
229
|
+
* schema-level composite FK on `raw_documents(storage_artifact_id,
|
|
230
|
+
* user_id) -> storage_artifacts(id, user_id)` makes the cross-user
|
|
231
|
+
* row impossible, but this join restates the invariant explicitly so
|
|
232
|
+
* the query is unambiguous against any DB that pre-dates the
|
|
233
|
+
* composite FK.
|
|
234
|
+
*/
|
|
235
|
+
export declare function countReferencingDocuments(pool: pg.Pool, userId: string, artifactId: string): Promise<number>;
|
|
236
|
+
/**
|
|
237
|
+
* Return the ids of active `raw_documents` rows that reference this
|
|
238
|
+
* artifact for the supplied owner. Same owner-scope invariant as
|
|
239
|
+
* `countReferencingDocuments`. Used by the delete `with_documents`
|
|
240
|
+
* cascade path so the service can soft-delete each referencing
|
|
241
|
+
* document before flipping the artifact's status.
|
|
242
|
+
*/
|
|
243
|
+
export declare function listReferencingDocumentIds(pool: pg.Pool, userId: string, artifactId: string): Promise<string[]>;
|
|
244
|
+
/**
|
|
245
|
+
* Atomically transition an artifact into `status='deleting'` and stamp
|
|
246
|
+
* a fresh `delete_attempt_id`. Returns the new claim id on success,
|
|
247
|
+
* `null` when the row is missing, cross-user, or already in a state
|
|
248
|
+
* that forbids a new claim (`deleting` / `deleted`).
|
|
249
|
+
*
|
|
250
|
+
* `delete_failed` rows ARE re-claimable so the delete-retry path can
|
|
251
|
+
* make forward progress; the plan defines the second `DELETE` on a
|
|
252
|
+
* `delete_failed` row as a retry, not an error. The retry path also
|
|
253
|
+
* clears the prior `last_error` so the in-flight artifact never
|
|
254
|
+
* reports `status='deleting'` alongside a stale provider error — the
|
|
255
|
+
* field is repopulated only if THIS attempt fails.
|
|
256
|
+
*/
|
|
257
|
+
export declare function claimDeleteAttempt(pool: pg.Pool, userId: string, id: string): Promise<{
|
|
258
|
+
claimId: string;
|
|
259
|
+
} | null>;
|
|
260
|
+
/**
|
|
261
|
+
* Finalize a successful delete. The row's `status` flips to `deleted`,
|
|
262
|
+
* `deleted_at` is stamped, and the `delete_attempt_id` is cleared.
|
|
263
|
+
* The CAS condition (matching claim id + current `status='deleting'`)
|
|
264
|
+
* means a stale caller cannot finalize someone else's claim.
|
|
265
|
+
*
|
|
266
|
+
* Throws when no row matches — callers MUST hold a current claim.
|
|
267
|
+
*/
|
|
268
|
+
export declare function markDeleteSuccess(q: pg.Pool | pg.PoolClient, args: MarkDeleteSuccessInput): Promise<StorageArtifactRow>;
|
|
269
|
+
/**
|
|
270
|
+
* Record a provider-cleanup failure. Same CAS guard as
|
|
271
|
+
* `markDeleteSuccess`; `last_error` is replaced with the supplied
|
|
272
|
+
* envelope so the caller can retry against a clean state. Status
|
|
273
|
+
* lands on `delete_failed`, which is re-claimable by a subsequent
|
|
274
|
+
* `claimDeleteAttempt`.
|
|
275
|
+
*/
|
|
276
|
+
export declare function markDeleteFailed(q: pg.Pool | pg.PoolClient, args: MarkDeleteFailedInput): Promise<StorageArtifactRow>;
|
|
277
|
+
export interface ReleaseDeleteClaimInput {
|
|
278
|
+
userId: string;
|
|
279
|
+
id: string;
|
|
280
|
+
claimId: string;
|
|
281
|
+
/** Status the row must revert to (typically the pre-claim status). */
|
|
282
|
+
restoreStatus: StorageArtifactStatus;
|
|
283
|
+
/** `last_error` the row had before the claim cleared it. */
|
|
284
|
+
restoreLastError: Record<string, unknown> | null;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Release a `deleting` claim without finalizing. Used by the
|
|
288
|
+
* delete-cascade race fix (Commit D): claim runs BEFORE the
|
|
289
|
+
* reference-count gate so concurrent INSERTs cannot slip in a new
|
|
290
|
+
* link, but if the gate then throws `ArtifactInUseError` we must
|
|
291
|
+
* revert the row from `deleting` back to its pre-claim status
|
|
292
|
+
* (and restore the pre-claim `last_error`, since `claimDeleteAttempt`
|
|
293
|
+
* cleared it). CAS-scoped to the row's `(user_id, delete_attempt_id,
|
|
294
|
+
* status='deleting')` so a stale caller cannot revert someone
|
|
295
|
+
* else's claim. Returns true on a real revert, false on CAS miss
|
|
296
|
+
* (e.g., concurrent recovery already finalized the row).
|
|
297
|
+
*/
|
|
298
|
+
export declare function releaseDeleteClaim(pool: pg.Pool, args: ReleaseDeleteClaimInput): Promise<boolean>;
|
|
299
|
+
/**
|
|
300
|
+
* Sentinel thrown by `assertArtifactLinkable` when a caller tries
|
|
301
|
+
* to link a `raw_documents.storage_artifact_id` to an artifact
|
|
302
|
+
* that has already entered (or completed) its delete lifecycle.
|
|
303
|
+
* The link-write sites surface this so a concurrent delete cannot
|
|
304
|
+
* race with a fresh link and end up with a document pointing at
|
|
305
|
+
* deleted content.
|
|
306
|
+
*/
|
|
307
|
+
export declare class ArtifactNotLinkableError extends Error {
|
|
308
|
+
readonly artifactId: string;
|
|
309
|
+
readonly status: StorageArtifactStatus;
|
|
310
|
+
constructor(artifactId: string, status: StorageArtifactStatus);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Refuse to link a `raw_documents` row to an artifact whose status
|
|
314
|
+
* is in `UNLINKABLE_STATUSES`. Throws `ArtifactNotLinkableError`
|
|
315
|
+
* on a hit; no-ops otherwise. Takes a `PoolClient` so the caller
|
|
316
|
+
* can scope the check to its own transaction.
|
|
317
|
+
*/
|
|
318
|
+
export declare function assertArtifactLinkable(q: pg.Pool | pg.PoolClient, userId: string, artifactId: string): Promise<void>;
|
|
319
|
+
/**
|
|
320
|
+
* List a user's artifacts in `(created_at DESC, id DESC)` order with
|
|
321
|
+
* keyset pagination. The cursor encodes the last row of the previous
|
|
322
|
+
* page; pass `undefined` for the first page. Returns `nextCursor=null`
|
|
323
|
+
* when the caller has reached the end of the user's rows.
|
|
324
|
+
*
|
|
325
|
+
* Soft-deleted rows (`deleted_at IS NOT NULL`) are excluded from the
|
|
326
|
+
* listing — the Step-5 list endpoint does NOT show tombstones by
|
|
327
|
+
* default.
|
|
328
|
+
*/
|
|
329
|
+
export declare function listArtifactsForUser(pool: pg.Pool, userId: string, opts: ListArtifactsOptions): Promise<ListArtifactsResult>;
|