@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,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document service — Phases 1 and 2 of the large-file ingestion plan.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1: pointer-only registry (register / get / list / delete).
|
|
5
|
+
* Phase 2: text indexing — `indexText` chunks supplied text, embeds
|
|
6
|
+
* the chunks via the existing core embedding stack, persists chunks to
|
|
7
|
+
* `document_chunks`, and writes one provenance-linked memory per chunk
|
|
8
|
+
* so `/v1/memories/search` can retrieve them. Implementation lives in
|
|
9
|
+
* `document-indexer.ts`; this service is a thin facade.
|
|
10
|
+
*
|
|
11
|
+
* Schema validation lives in `src/schemas/documents.ts`; this service
|
|
12
|
+
* trusts the validated input shape and only enforces the Phase 1
|
|
13
|
+
* storage-mode invariant defensively (so direct in-process callers
|
|
14
|
+
* can't bypass the Zod gate). No managed blob storage, no fact
|
|
15
|
+
* extraction — those are Phase 3+.
|
|
16
|
+
*
|
|
17
|
+
* See `Atomicmemory-research/docs/core-repo/design/large-file-ingestion-and-raw-storage-plan-2026-05-08.md`.
|
|
18
|
+
*/
|
|
19
|
+
import { getRawDocumentById, listRawDocuments, registerRawDocument, upsertRawSource, } from '../db/raw-document-repository.js';
|
|
20
|
+
import { listDocumentsForUser, listDocumentsWithoutMemoriesForUser, } from '../db/document-list-repository.js';
|
|
21
|
+
import { listPassportFeed, } from '../db/passport-feed-repository.js';
|
|
22
|
+
import { decodeListCursor } from '../db/document-list-cursor.js';
|
|
23
|
+
import { listOrphanedManagedBlobsForDocument, } from '../db/raw-document-blob-repository.js';
|
|
24
|
+
import { softDeleteDocumentCascade } from '../db/repository-document-delete.js';
|
|
25
|
+
import { cleanupManagedBlobs, ManagedBlobCleanupError } from '../storage/cleanup.js';
|
|
26
|
+
import { buildRawStorageCleanupFailureEnvelope, markCleanupFailedAndSyncArtifact, markCleanupSuccessAndSyncArtifact, } from '../db/raw-doc-artifact-sync.js';
|
|
27
|
+
import { singleStoreRegistry, } from '../storage/store-registry.js';
|
|
28
|
+
import { indexDocumentText, } from './document-indexer.js';
|
|
29
|
+
import { uploadRawDocument, } from './document-upload.js';
|
|
30
|
+
import { markExtractionFailure as markExtractionFailureCore, markIndexFailure as markIndexFailureCore, } from './document-failure-markers.js';
|
|
31
|
+
import { emitFilecoinEvent } from './filecoin-observability.js';
|
|
32
|
+
import { NoopRawContentCodec } from '../storage/codecs/noop-codec.js';
|
|
33
|
+
const PHASE_1_STORAGE_MODE = 'pointer_only';
|
|
34
|
+
const DEFAULT_UPLOAD_CONFIG = {
|
|
35
|
+
rawStorageMode: 'pointer_only',
|
|
36
|
+
rawStoragePrefix: '',
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Document service. Phase 1 covers register/get/list/delete; Phase 2
|
|
40
|
+
* adds `indexText`; Phase 3 adds `uploadRaw` (managed-blob storage).
|
|
41
|
+
* The Phase-3 dependencies (`rawContentStore`, raw-storage config) are
|
|
42
|
+
* optional so existing test contexts that only need pointer-only
|
|
43
|
+
* registration don't have to thread the new wiring.
|
|
44
|
+
*/
|
|
45
|
+
export class DocumentService {
|
|
46
|
+
pool;
|
|
47
|
+
rawContentStore;
|
|
48
|
+
storeRegistry;
|
|
49
|
+
codec;
|
|
50
|
+
uploadConfig;
|
|
51
|
+
constructor(pool, options = {}) {
|
|
52
|
+
this.pool = pool;
|
|
53
|
+
this.rawContentStore = options.rawContentStore ?? null;
|
|
54
|
+
this.storeRegistry = options.storeRegistry ?? singleStoreRegistry(this.rawContentStore);
|
|
55
|
+
this.codec = options.codec ?? new NoopRawContentCodec();
|
|
56
|
+
this.uploadConfig = options.config ?? DEFAULT_UPLOAD_CONFIG;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Per-row provider dispatch registry. Exposed so the route layer's
|
|
60
|
+
* Phase 7a formatters can resolve `delete_semantics` from each
|
|
61
|
+
* row's `storage_provider` without rebuilding the registry. The
|
|
62
|
+
* registry is read-only at the route boundary.
|
|
63
|
+
*/
|
|
64
|
+
getStoreRegistry() {
|
|
65
|
+
return this.storeRegistry;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Idempotently register a document pointer. Looks up (or inserts) the
|
|
69
|
+
* matching `raw_sources` row, then registers the document.
|
|
70
|
+
*
|
|
71
|
+
* Returns `{ document, created }` where `created = false` when an
|
|
72
|
+
* active row already existed for the (user, source, external_id,
|
|
73
|
+
* provider_version) namespace (route handler maps that to a 200; new
|
|
74
|
+
* inserts map to 201).
|
|
75
|
+
*/
|
|
76
|
+
async register(input) {
|
|
77
|
+
assertPointerOnly(input.storageMode);
|
|
78
|
+
const source = await upsertRawSource(this.pool, {
|
|
79
|
+
userId: input.userId,
|
|
80
|
+
sourceSite: input.sourceSite,
|
|
81
|
+
provider: input.provider,
|
|
82
|
+
accountId: input.accountId,
|
|
83
|
+
storageMode: input.storageMode,
|
|
84
|
+
retentionPolicy: input.retentionPolicy,
|
|
85
|
+
consentPolicy: input.consentPolicy,
|
|
86
|
+
});
|
|
87
|
+
return registerRawDocument(this.pool, {
|
|
88
|
+
userId: input.userId,
|
|
89
|
+
rawSourceId: source.id,
|
|
90
|
+
externalId: input.externalId,
|
|
91
|
+
externalUri: input.externalUri,
|
|
92
|
+
displayName: input.displayName,
|
|
93
|
+
mimeType: input.mimeType,
|
|
94
|
+
sizeBytes: input.sizeBytes,
|
|
95
|
+
contentHash: input.contentHash,
|
|
96
|
+
providerVersion: input.providerVersion,
|
|
97
|
+
sourceModifiedAt: input.sourceModifiedAt,
|
|
98
|
+
storageMode: input.storageMode,
|
|
99
|
+
metadata: input.metadata,
|
|
100
|
+
extractionStatus: input.extractionStatus,
|
|
101
|
+
semanticIndexStatus: input.semanticIndexStatus,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/** Fetch one active document by id; null when missing/deleted/cross-user. */
|
|
105
|
+
async get(userId, id) {
|
|
106
|
+
return getRawDocumentById(this.pool, userId, id);
|
|
107
|
+
}
|
|
108
|
+
/** List active documents for a user, optionally filtered by source_site. */
|
|
109
|
+
async list(input) {
|
|
110
|
+
return listRawDocuments(this.pool, input);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Phase D — cursor-paginated user-scoped document list with optional
|
|
114
|
+
* recovery-status bucket filter. Distinct from {@link list} which uses
|
|
115
|
+
* offset/limit + source_site filter (kept for backwards
|
|
116
|
+
* compatibility with `GET /v1/documents/list`). The route layer
|
|
117
|
+
* decodes the opaque `cursor` query param via `decodeListCursor`
|
|
118
|
+
* BEFORE calling this method, so a malformed cursor surfaces as 400
|
|
119
|
+
* upstream rather than a 500 from the SQL layer.
|
|
120
|
+
*/
|
|
121
|
+
async listForUser(input) {
|
|
122
|
+
const decoded = input.cursor !== undefined
|
|
123
|
+
? decodeListCursor(input.cursor)
|
|
124
|
+
: null;
|
|
125
|
+
if (input.cursor !== undefined && decoded === null) {
|
|
126
|
+
throw new InvalidDocumentListCursorError();
|
|
127
|
+
}
|
|
128
|
+
const repoInput = {
|
|
129
|
+
userId: input.userId,
|
|
130
|
+
limit: input.limit,
|
|
131
|
+
cursor: decoded,
|
|
132
|
+
statusFilter: input.statusFilter,
|
|
133
|
+
};
|
|
134
|
+
return listDocumentsForUser(this.pool, repoInput);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Phase D — list active documents WITHOUT non-deleted memories,
|
|
138
|
+
* narrowed by the layer-aware recovery filter. Backs the
|
|
139
|
+
* passport server-side merge document-only stream and the
|
|
140
|
+
* `GET /v1/documents/without-memories` endpoint.
|
|
141
|
+
*/
|
|
142
|
+
async listWithoutMemoriesForUser(input) {
|
|
143
|
+
const decoded = input.cursor !== undefined
|
|
144
|
+
? decodeListCursor(input.cursor)
|
|
145
|
+
: null;
|
|
146
|
+
if (input.cursor !== undefined && decoded === null) {
|
|
147
|
+
throw new InvalidDocumentListCursorError();
|
|
148
|
+
}
|
|
149
|
+
const repoInput = {
|
|
150
|
+
userId: input.userId,
|
|
151
|
+
limit: input.limit,
|
|
152
|
+
cursor: decoded,
|
|
153
|
+
statusFilter: input.statusFilter,
|
|
154
|
+
};
|
|
155
|
+
return listDocumentsWithoutMemoriesForUser(this.pool, repoInput);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Phase D — passport feed (data-layer grouped query). Backs
|
|
159
|
+
* `GET /v1/documents/passport-feed`. The webapp's
|
|
160
|
+
* `/api/context/passport` route consumes this as the memory-feed
|
|
161
|
+
* stream of its server-side two-stream merge.
|
|
162
|
+
*
|
|
163
|
+
* Cursor decoding mirrors the other Phase D list facades; a
|
|
164
|
+
* malformed cursor (incl. structurally-valid-but-non-server
|
|
165
|
+
* sortAt) throws `InvalidDocumentListCursorError` so the route
|
|
166
|
+
* layer maps it to 400 invalid_cursor.
|
|
167
|
+
*/
|
|
168
|
+
async listPassportFeed(input) {
|
|
169
|
+
const decoded = input.cursor !== undefined
|
|
170
|
+
? decodeListCursor(input.cursor)
|
|
171
|
+
: null;
|
|
172
|
+
if (input.cursor !== undefined && decoded === null) {
|
|
173
|
+
throw new InvalidDocumentListCursorError();
|
|
174
|
+
}
|
|
175
|
+
const repoInput = {
|
|
176
|
+
userId: input.userId,
|
|
177
|
+
limit: input.limit ?? 50,
|
|
178
|
+
cursor: decoded,
|
|
179
|
+
};
|
|
180
|
+
return listPassportFeed(this.pool, repoInput);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Soft-delete one document together with its Phase 2 derived chunks
|
|
184
|
+
* and provenance-linked memories, in one transaction with a per-doc
|
|
185
|
+
* advisory lock. `alreadyDeleted = true` when the row was missing or
|
|
186
|
+
* previously tombstoned — keeps DELETE idempotent.
|
|
187
|
+
*/
|
|
188
|
+
async delete(userId, id) {
|
|
189
|
+
const { removed, blobs: freshBlobs } = await softDeleteDocumentCascade(this.pool, userId, id);
|
|
190
|
+
// When the document was already tombstoned by a prior call but
|
|
191
|
+
// its managed blob still needs cleanup (raw_storage_failed),
|
|
192
|
+
// pick those orphans up here. Otherwise an `alreadyDeleted=true`
|
|
193
|
+
// response would hide a still-orphaned blob.
|
|
194
|
+
const blobs = freshBlobs.length > 0
|
|
195
|
+
? freshBlobs
|
|
196
|
+
: await listOrphanedManagedBlobsForDocument(this.pool, userId, id);
|
|
197
|
+
if (blobs.length > 0) {
|
|
198
|
+
await this.runBlobCleanupOrThrow(userId, blobs);
|
|
199
|
+
}
|
|
200
|
+
return { success: true, alreadyDeleted: !removed };
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Run cleanup against `blobs`; on failure mark each failing row
|
|
204
|
+
* `raw_storage_failed` and throw, on success flip the rows to the
|
|
205
|
+
* terminal `blob_deleted` state so a future retry of `DELETE
|
|
206
|
+
* /v1/documents/:id` short-circuits cleanly.
|
|
207
|
+
*/
|
|
208
|
+
async runBlobCleanupOrThrow(userId, blobs) {
|
|
209
|
+
const result = await cleanupManagedBlobs(this.storeRegistry, blobs);
|
|
210
|
+
// Mark partial successes *before* surfacing the error so a retry
|
|
211
|
+
// doesn't re-attempt cleanup on URIs that are already clean. Per
|
|
212
|
+
// Phase 4a §1, the marker is chosen by the adapter's `semantics`
|
|
213
|
+
// field — `'deleted'` writes `blob_deleted`, `'unpinned'` /
|
|
214
|
+
// `'tombstoned'` write `blob_tombstoned`. Both terminal states
|
|
215
|
+
// are clean; the orphan-lookup helpers skip both.
|
|
216
|
+
//
|
|
217
|
+
// Step 7 of the storage-sibling plan: each marker write is
|
|
218
|
+
// paired with a sync onto the linked `storage_artifacts` row so
|
|
219
|
+
// the artifact's `status` follows `raw_documents` through the
|
|
220
|
+
// terminal state.
|
|
221
|
+
for (const success of result.successes) {
|
|
222
|
+
// Step 7 paired marker + artifact sync. Each `success` carries
|
|
223
|
+
// its `rawDocumentId` (the cleanup blob-ref now threads the
|
|
224
|
+
// source-row id) so we never disambiguate by URI.
|
|
225
|
+
await markCleanupSuccessAndSyncArtifact(this.pool, {
|
|
226
|
+
userId,
|
|
227
|
+
rawDocumentId: success.rawDocumentId,
|
|
228
|
+
storageUri: success.storageUri,
|
|
229
|
+
semantics: success.semantics,
|
|
230
|
+
});
|
|
231
|
+
emitDeleteEvent(userId, success.storageProvider, success.semantics);
|
|
232
|
+
}
|
|
233
|
+
if (result.failures.length > 0) {
|
|
234
|
+
for (const failure of result.failures) {
|
|
235
|
+
await markCleanupFailedAndSyncArtifact(this.pool, {
|
|
236
|
+
userId,
|
|
237
|
+
rawDocumentId: failure.rawDocumentId,
|
|
238
|
+
lastError: buildRawStorageCleanupFailureEnvelope(failure.message, failure.storageProvider),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
throw new ManagedBlobCleanupError(result);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Phase 2 indexing entry point. Idempotent on byte-identical text
|
|
246
|
+
* + current `chunker_version`; otherwise re-chunks (soft-deleting
|
|
247
|
+
* the prior generation of chunks + derived memories first). The
|
|
248
|
+
* heavy lifting lives in `document-indexer.ts`.
|
|
249
|
+
*/
|
|
250
|
+
async indexText(input) {
|
|
251
|
+
return indexDocumentText(this.pool, input);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Phase 3 managed-blob upload. Throws `ManagedStorageDisabledError`
|
|
255
|
+
* (→ 503) when the deployment runs `rawStorageMode='pointer_only'`,
|
|
256
|
+
* `UploadDocumentNotFoundError` (→ 404) when the document is missing
|
|
257
|
+
* or owned by a different user. Idempotent on byte-identical input.
|
|
258
|
+
*/
|
|
259
|
+
async uploadRaw(input) {
|
|
260
|
+
return uploadRawDocument(this.pool, this.rawContentStore, this.codec, this.uploadConfig, input);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Phase C constrained extraction-layer transition. See
|
|
264
|
+
* `services/document-failure-markers.ts` for the full state-machine
|
|
265
|
+
* docstring; this is a thin facade so route handlers can call into
|
|
266
|
+
* the service the same way they do for `register` / `indexText` /
|
|
267
|
+
* `uploadRaw`.
|
|
268
|
+
*/
|
|
269
|
+
async markExtractionFailure(input) {
|
|
270
|
+
return markExtractionFailureCore(this.pool, input);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Phase C constrained semantic-index-layer transition.
|
|
274
|
+
*/
|
|
275
|
+
async markIndexFailure(input) {
|
|
276
|
+
return markIndexFailureCore(this.pool, input);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Phase D — sentinel thrown by {@link DocumentService.listForUser}
|
|
281
|
+
* when the supplied opaque cursor is malformed. Route handlers map
|
|
282
|
+
* this to 400 with `error: 'invalid_cursor'`.
|
|
283
|
+
*/
|
|
284
|
+
export class InvalidDocumentListCursorError extends Error {
|
|
285
|
+
constructor() {
|
|
286
|
+
super('cursor: invalid base64 / malformed payload');
|
|
287
|
+
this.name = 'InvalidDocumentListCursorError';
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Phase 1 storage-mode invariant. The schema layer rejects non-pointer
|
|
292
|
+
* modes with 400, so this only fires on direct in-process callers; when
|
|
293
|
+
* it does, it's a contract violation and a 500 is the right outcome.
|
|
294
|
+
*/
|
|
295
|
+
function assertPointerOnly(mode) {
|
|
296
|
+
if (mode !== PHASE_1_STORAGE_MODE) {
|
|
297
|
+
throw new Error(`DocumentService: storage_mode '${mode}' is not yet supported — Phase 1 implements pointer_only only`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Phase 8.5 — emit a delete-path observability event keyed to the
|
|
302
|
+
* adapter's `semantics`. The event taxonomy is `filecoin.delete.*`
|
|
303
|
+
* so we ONLY emit when the row's `storageProvider === 'filecoin'`
|
|
304
|
+
* (review-fix HIGH 3); a hypothetical future immediate provider
|
|
305
|
+
* with `'unpinned'` semantics (e.g. an S3-Glacier-style adapter)
|
|
306
|
+
* would need its own provider-prefixed event name.
|
|
307
|
+
*
|
|
308
|
+
* `'deleted'` semantics (local_fs / s3) emits nothing — the
|
|
309
|
+
* Filecoin event stream is for Filecoin-shaped lifecycle moments
|
|
310
|
+
* only.
|
|
311
|
+
*/
|
|
312
|
+
function emitDeleteEvent(userId, storageProvider, semantics) {
|
|
313
|
+
if (storageProvider !== 'filecoin')
|
|
314
|
+
return;
|
|
315
|
+
if (semantics === 'deleted')
|
|
316
|
+
return;
|
|
317
|
+
const name = semantics === 'tombstoned'
|
|
318
|
+
? 'filecoin.delete.tombstoned'
|
|
319
|
+
: 'filecoin.delete.unpinned';
|
|
320
|
+
emitFilecoinEvent(name, {
|
|
321
|
+
userId,
|
|
322
|
+
provider: storageProvider,
|
|
323
|
+
statusAfter: 'blob_tombstoned',
|
|
324
|
+
});
|
|
325
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Step-7 storage-sibling artifact wiring for the upload pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `document-upload.ts` so that file stays under the
|
|
5
|
+
* workspace 400-non-comment-LOC cap. Owns:
|
|
6
|
+
*
|
|
7
|
+
* - `recordUploadResultAndSwapArtifact` — Phase β2 transactional
|
|
8
|
+
* helper that records the upload, soft-deletes any prior pointer
|
|
9
|
+
* artifact, and inserts a new managed artifact in
|
|
10
|
+
* `status='pending'`.
|
|
11
|
+
* - `finalizeUploadAndSyncArtifact` — paired Phase γ transaction
|
|
12
|
+
* that runs `finalizeUploadStatusWithClient` AND the artifact
|
|
13
|
+
* sync in one BEGIN..COMMIT, so the document's
|
|
14
|
+
* `raw_storage_status` and the artifact's `status` either both
|
|
15
|
+
* commit or both roll back.
|
|
16
|
+
* - `failClaimedUploadAndSyncArtifact` — paired failure tx that
|
|
17
|
+
* marks the upload row `raw_storage_failed` AND syncs the
|
|
18
|
+
* linked artifact.
|
|
19
|
+
*
|
|
20
|
+
* The pointer-mode provider constant `EXTERNAL_POINTER_PROVIDER`
|
|
21
|
+
* lives in `../db/storage-artifact-providers.ts` (DB-layer, no
|
|
22
|
+
* service-layer dependency); import it from there directly.
|
|
23
|
+
*/
|
|
24
|
+
import pg from 'pg';
|
|
25
|
+
import type { RawDocumentRow } from '../db/raw-document-types.js';
|
|
26
|
+
import type { StoredRawContent } from '../storage/raw-content-store.js';
|
|
27
|
+
export interface RecordUploadResultInput {
|
|
28
|
+
userId: string;
|
|
29
|
+
documentId: string;
|
|
30
|
+
claimId: string;
|
|
31
|
+
storageUri: string;
|
|
32
|
+
storageProvider: string;
|
|
33
|
+
rawStorageMetadata: Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
export interface SwapToManagedInput {
|
|
36
|
+
document: Pick<RawDocumentRow, 'id' | 'userId' | 'mimeType'>;
|
|
37
|
+
contentHash: string;
|
|
38
|
+
stored: StoredRawContent;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Phase β2 atomic combo: writes the URI/provider/metadata via
|
|
42
|
+
* `recordUploadResultWithClient`, soft-deletes any prior pointer
|
|
43
|
+
* artifact, inserts a new managed artifact in `status='pending'`,
|
|
44
|
+
* and links the document. All within a single BEGIN..COMMIT so the
|
|
45
|
+
* row never sees a half-applied transition.
|
|
46
|
+
*
|
|
47
|
+
* Returns the new artifact id. Throws when the claim was lost (the
|
|
48
|
+
* caller maps this to `UploadClaimLostError` and runs compensation).
|
|
49
|
+
*/
|
|
50
|
+
export declare function recordUploadResultAndSwapArtifact(pool: pg.Pool, args: RecordUploadResultInput & SwapToManagedInput): Promise<{
|
|
51
|
+
rowCount: number;
|
|
52
|
+
artifactId: string | null;
|
|
53
|
+
}>;
|
|
54
|
+
export interface FinalizeUploadAndSyncInput {
|
|
55
|
+
userId: string;
|
|
56
|
+
documentId: string;
|
|
57
|
+
claimId: string;
|
|
58
|
+
finalStatus: 'blob_stored' | 'blob_pending' | 'blob_available';
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Phase γ paired transition: flip `raw_storage_status` to the final
|
|
62
|
+
* terminal state AND sync the artifact in the same transaction.
|
|
63
|
+
* Returns 0 when the CAS-on-claim missed (caller maps to
|
|
64
|
+
* `UploadClaimLostError`).
|
|
65
|
+
*/
|
|
66
|
+
export declare function finalizeUploadAndSyncArtifact(pool: pg.Pool, args: FinalizeUploadAndSyncInput): Promise<number>;
|
|
67
|
+
export interface FailClaimedUploadAndSyncInput {
|
|
68
|
+
userId: string;
|
|
69
|
+
documentId: string;
|
|
70
|
+
claimId: string;
|
|
71
|
+
lastError: Record<string, unknown>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Phase β failure path: mark the upload row `raw_storage_failed`
|
|
75
|
+
* AND sync the artifact to `failed` in one transaction. Errors are
|
|
76
|
+
* not swallowed — the caller decides whether to propagate, but the
|
|
77
|
+
* marker write and the sync share the same atomicity guarantee as
|
|
78
|
+
* every other paired transition in Step 7.
|
|
79
|
+
*/
|
|
80
|
+
export declare function failClaimedUploadAndSyncArtifact(pool: pg.Pool, args: FailClaimedUploadAndSyncInput): Promise<number>;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Step-7 storage-sibling artifact wiring for the upload pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `document-upload.ts` so that file stays under the
|
|
5
|
+
* workspace 400-non-comment-LOC cap. Owns:
|
|
6
|
+
*
|
|
7
|
+
* - `recordUploadResultAndSwapArtifact` — Phase β2 transactional
|
|
8
|
+
* helper that records the upload, soft-deletes any prior pointer
|
|
9
|
+
* artifact, and inserts a new managed artifact in
|
|
10
|
+
* `status='pending'`.
|
|
11
|
+
* - `finalizeUploadAndSyncArtifact` — paired Phase γ transaction
|
|
12
|
+
* that runs `finalizeUploadStatusWithClient` AND the artifact
|
|
13
|
+
* sync in one BEGIN..COMMIT, so the document's
|
|
14
|
+
* `raw_storage_status` and the artifact's `status` either both
|
|
15
|
+
* commit or both roll back.
|
|
16
|
+
* - `failClaimedUploadAndSyncArtifact` — paired failure tx that
|
|
17
|
+
* marks the upload row `raw_storage_failed` AND syncs the
|
|
18
|
+
* linked artifact.
|
|
19
|
+
*
|
|
20
|
+
* The pointer-mode provider constant `EXTERNAL_POINTER_PROVIDER`
|
|
21
|
+
* lives in `../db/storage-artifact-providers.ts` (DB-layer, no
|
|
22
|
+
* service-layer dependency); import it from there directly.
|
|
23
|
+
*/
|
|
24
|
+
import { failClaimedUploadWithClient, finalizeUploadStatusWithClient, recordUploadResultWithClient, } from '../db/raw-document-blob-repository.js';
|
|
25
|
+
import { assertArtifactLinkable, createStorageArtifact, softDeleteArtifactByIdWithClient, } from '../db/storage-artifact-repository.js';
|
|
26
|
+
import { projectArtifactProviderFields } from '../storage/provider-metadata-projection.js';
|
|
27
|
+
import { syncArtifactStatusFromRawDocument } from '../db/raw-doc-artifact-sync.js';
|
|
28
|
+
/**
|
|
29
|
+
* Phase β2 atomic combo: writes the URI/provider/metadata via
|
|
30
|
+
* `recordUploadResultWithClient`, soft-deletes any prior pointer
|
|
31
|
+
* artifact, inserts a new managed artifact in `status='pending'`,
|
|
32
|
+
* and links the document. All within a single BEGIN..COMMIT so the
|
|
33
|
+
* row never sees a half-applied transition.
|
|
34
|
+
*
|
|
35
|
+
* Returns the new artifact id. Throws when the claim was lost (the
|
|
36
|
+
* caller maps this to `UploadClaimLostError` and runs compensation).
|
|
37
|
+
*/
|
|
38
|
+
export async function recordUploadResultAndSwapArtifact(pool, args) {
|
|
39
|
+
const client = await pool.connect();
|
|
40
|
+
try {
|
|
41
|
+
await client.query('BEGIN');
|
|
42
|
+
const rowCount = await recordUploadResultWithClient(client, {
|
|
43
|
+
userId: args.userId,
|
|
44
|
+
documentId: args.documentId,
|
|
45
|
+
claimId: args.claimId,
|
|
46
|
+
storageUri: args.storageUri,
|
|
47
|
+
storageProvider: args.storageProvider,
|
|
48
|
+
rawStorageMetadata: args.rawStorageMetadata,
|
|
49
|
+
});
|
|
50
|
+
if (rowCount === 0) {
|
|
51
|
+
await client.query('ROLLBACK');
|
|
52
|
+
return { rowCount: 0, artifactId: null };
|
|
53
|
+
}
|
|
54
|
+
const artifactId = await swapToManagedArtifact(client, args);
|
|
55
|
+
await client.query('COMMIT');
|
|
56
|
+
return { rowCount, artifactId };
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
client.release();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function swapToManagedArtifact(client, args) {
|
|
67
|
+
const priorLookup = await client.query(`SELECT storage_artifact_id FROM raw_documents WHERE id = $1`, [args.document.id]);
|
|
68
|
+
const priorArtifactId = priorLookup.rows[0]?.storage_artifact_id ?? null;
|
|
69
|
+
if (priorArtifactId !== null) {
|
|
70
|
+
// Refuse the swap if the prior artifact's delete lifecycle has
|
|
71
|
+
// already started (`deleting` / `deleted` / `delete_failed`).
|
|
72
|
+
// Otherwise the swap's own soft-delete races with the original
|
|
73
|
+
// caller's claim-and-finalize flow, leaving the doc's cascade
|
|
74
|
+
// attached to whichever caller wins. Throwing
|
|
75
|
+
// `ArtifactNotLinkableError` here is preferable: the upload
|
|
76
|
+
// caller retries after the in-flight delete completes.
|
|
77
|
+
await assertArtifactLinkable(client, args.document.userId, priorArtifactId);
|
|
78
|
+
await softDeleteArtifactByIdWithClient(client, args.document.userId, priorArtifactId);
|
|
79
|
+
}
|
|
80
|
+
const projected = projectArtifactProviderFields(args.stored.storageProvider, args.stored.providerMetadata);
|
|
81
|
+
const artifact = await createStorageArtifact(client, {
|
|
82
|
+
userId: args.document.userId,
|
|
83
|
+
provider: args.stored.storageProvider,
|
|
84
|
+
mode: 'managed',
|
|
85
|
+
uri: args.stored.storageUri,
|
|
86
|
+
status: 'pending',
|
|
87
|
+
sizeBytes: args.stored.sizeBytes,
|
|
88
|
+
contentType: args.document.mimeType ?? null,
|
|
89
|
+
plaintextHash: args.contentHash,
|
|
90
|
+
storedHash: args.stored.contentHash,
|
|
91
|
+
contentEncoding: 'identity',
|
|
92
|
+
discloseContentHash: false,
|
|
93
|
+
identifiers: projected.identifiers,
|
|
94
|
+
providerDetails: projected.providerDetails,
|
|
95
|
+
metadata: {},
|
|
96
|
+
});
|
|
97
|
+
await client.query(`UPDATE raw_documents SET storage_artifact_id = $1, updated_at = NOW()
|
|
98
|
+
WHERE id = $2`, [artifact.id, args.document.id]);
|
|
99
|
+
return artifact.id;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Phase γ paired transition: flip `raw_storage_status` to the final
|
|
103
|
+
* terminal state AND sync the artifact in the same transaction.
|
|
104
|
+
* Returns 0 when the CAS-on-claim missed (caller maps to
|
|
105
|
+
* `UploadClaimLostError`).
|
|
106
|
+
*/
|
|
107
|
+
export async function finalizeUploadAndSyncArtifact(pool, args) {
|
|
108
|
+
const client = await pool.connect();
|
|
109
|
+
try {
|
|
110
|
+
await client.query('BEGIN');
|
|
111
|
+
const rowCount = await finalizeUploadStatusWithClient(client, args);
|
|
112
|
+
if (rowCount === 0) {
|
|
113
|
+
await client.query('ROLLBACK');
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
await syncArtifactStatusFromRawDocument(client, {
|
|
117
|
+
rawDocumentId: args.documentId,
|
|
118
|
+
newRawStatus: args.finalStatus,
|
|
119
|
+
});
|
|
120
|
+
await client.query('COMMIT');
|
|
121
|
+
return rowCount;
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
client.release();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Phase β failure path: mark the upload row `raw_storage_failed`
|
|
133
|
+
* AND sync the artifact to `failed` in one transaction. Errors are
|
|
134
|
+
* not swallowed — the caller decides whether to propagate, but the
|
|
135
|
+
* marker write and the sync share the same atomicity guarantee as
|
|
136
|
+
* every other paired transition in Step 7.
|
|
137
|
+
*/
|
|
138
|
+
export async function failClaimedUploadAndSyncArtifact(pool, args) {
|
|
139
|
+
const client = await pool.connect();
|
|
140
|
+
try {
|
|
141
|
+
await client.query('BEGIN');
|
|
142
|
+
const rowCount = await failClaimedUploadWithClient(client, args);
|
|
143
|
+
if (rowCount === 0) {
|
|
144
|
+
await client.query('ROLLBACK');
|
|
145
|
+
return 0;
|
|
146
|
+
}
|
|
147
|
+
await syncArtifactStatusFromRawDocument(client, {
|
|
148
|
+
rawDocumentId: args.documentId,
|
|
149
|
+
newRawStatus: 'raw_storage_failed',
|
|
150
|
+
lastError: args.lastError,
|
|
151
|
+
});
|
|
152
|
+
await client.query('COMMIT');
|
|
153
|
+
return rowCount;
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
157
|
+
throw err;
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
client.release();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase β2 orphan-bytes compensation + raw-document failure-marker
|
|
3
|
+
* helpers for the managed-blob upload pipeline.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from `document-upload.ts` so the orchestration module
|
|
6
|
+
* stays under the workspace 400-non-comment-LOC cap. The two
|
|
7
|
+
* exported helpers cover the post-`store.put` failure window:
|
|
8
|
+
*
|
|
9
|
+
* - `compensateOrphanedBlob` runs a best-effort `store.delete`
|
|
10
|
+
* for bytes that were durably written but never linked
|
|
11
|
+
* (e.g. the prior artifact entered a delete lifecycle between
|
|
12
|
+
* our claim and the swap, so `ArtifactNotLinkableError` fires).
|
|
13
|
+
* - `markBeta2FailureOnDocument` flips the raw_document to
|
|
14
|
+
* `raw_storage_failed` with a typed envelope so the public
|
|
15
|
+
* status surfaces stop saying "upload in progress" for a doc
|
|
16
|
+
* whose upload actually failed. When cleanup also failed the
|
|
17
|
+
* envelope carries `internal_recovery_hint` so a reconciler /
|
|
18
|
+
* ops can find the abandoned bytes. The wire formatter
|
|
19
|
+
* (`document-response-formatters.ts`) strips `internal_*`
|
|
20
|
+
* keys before exposing `last_error` on the public response.
|
|
21
|
+
*/
|
|
22
|
+
import type pg from 'pg';
|
|
23
|
+
import type { StoredRawContent } from '../storage/raw-content-store.js';
|
|
24
|
+
import type { RawContentStore } from '../storage/raw-content-store.js';
|
|
25
|
+
import type { RawDocumentRow } from '../db/raw-document-types.js';
|
|
26
|
+
export type Beta2Compensation = {
|
|
27
|
+
cleanupSucceeded: true;
|
|
28
|
+
} | {
|
|
29
|
+
cleanupSucceeded: false;
|
|
30
|
+
cleanupError: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Best-effort `store.delete` for the orphan-bytes window between
|
|
34
|
+
* `store.put` returning and `recordUploadResultAndSwapArtifact`
|
|
35
|
+
* committing the artifact swap. Returns whether cleanup succeeded
|
|
36
|
+
* (the caller uses this to decide whether to embed the orphan
|
|
37
|
+
* URI/provider in the raw_document's recovery-hint envelope).
|
|
38
|
+
*
|
|
39
|
+
* A cleanup failure is also logged with the originating error so
|
|
40
|
+
* a `grep '[STORAGE]'` operator can correlate.
|
|
41
|
+
*/
|
|
42
|
+
export declare function compensateOrphanedBlob(store: RawContentStore, storageUri: string, documentId: string, cause: unknown): Promise<Beta2Compensation>;
|
|
43
|
+
export interface Beta2FailureMarkerArgs {
|
|
44
|
+
pool: pg.Pool;
|
|
45
|
+
document: Pick<RawDocumentRow, 'id' | 'userId'>;
|
|
46
|
+
claimId: string;
|
|
47
|
+
stored: StoredRawContent & {
|
|
48
|
+
codecMetadata: Record<string, unknown>;
|
|
49
|
+
};
|
|
50
|
+
reasonCode: 'artifact_not_linkable' | 'beta2_swap_failed';
|
|
51
|
+
reasonMessage: string;
|
|
52
|
+
compensation: Beta2Compensation;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Mark the doc `raw_storage_failed` with the `artifact_not_linkable`
|
|
56
|
+
* envelope (or generic `beta2_swap_failed` for other throws).
|
|
57
|
+
*
|
|
58
|
+
* Uses the raw-document-only `failClaimedUploadWithClient` — NOT
|
|
59
|
+
* the paired `failClaimedUploadAndSyncArtifact`. Syncing here
|
|
60
|
+
* would clobber the prior artifact's state, which is already in
|
|
61
|
+
* its OWN delete lifecycle and owned by the caller that's
|
|
62
|
+
* tombstoning it.
|
|
63
|
+
*
|
|
64
|
+
* CAS-guarded by `claim_id`: a no-op when the claim was lost,
|
|
65
|
+
* which prevents a stale marker from overwriting a fresh
|
|
66
|
+
* worker's state.
|
|
67
|
+
*
|
|
68
|
+
* Orphan recovery hint: when cleanup failed the envelope carries
|
|
69
|
+
* `internal_recovery_hint: { storage_uri, storage_provider, cleanup_error }`
|
|
70
|
+
* so a reconciler / ops can find the abandoned bytes.
|
|
71
|
+
*/
|
|
72
|
+
export declare function markBeta2FailureOnDocument(args: Beta2FailureMarkerArgs): Promise<void>;
|