@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,410 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postgres queries for the document pipeline (Phase 1 — pointer-only).
|
|
3
|
+
*
|
|
4
|
+
* Function-style module mirroring `repository-write.ts`. The split
|
|
5
|
+
* `*WithClient` variants exist so `deleteBySource` can include
|
|
6
|
+
* document soft-deletion inside its existing transaction.
|
|
7
|
+
*
|
|
8
|
+
* Phase 1 contract: callers only ever pass `storageMode = 'pointer_only'`.
|
|
9
|
+
* The CHECK constraint on `raw_documents.storage_mode` accepts
|
|
10
|
+
* `managed_blob` and `inline_small_text` as well, but the service layer
|
|
11
|
+
* rejects them until those phases land. No raw content is ever written
|
|
12
|
+
* by this module — `storage_uri` and `storage_provider` are NEVER set
|
|
13
|
+
* in Phase 1.
|
|
14
|
+
*/
|
|
15
|
+
import { createStorageArtifact } from './storage-artifact-repository.js';
|
|
16
|
+
import { EXTERNAL_POINTER_PROVIDER } from './storage-artifact-providers.js';
|
|
17
|
+
const RAW_SOURCE_COLUMNS = 'id, user_id, source_site, provider, account_id, storage_mode, retention_policy, consent_policy, created_at, updated_at';
|
|
18
|
+
/**
|
|
19
|
+
* Full column set on `raw_documents`. Exported so the Phase D list /
|
|
20
|
+
* recovery / passport-feed repositories (which moved to focused
|
|
21
|
+
* modules to keep this file under the 400 LOC rule) can build their
|
|
22
|
+
* SELECT lists from the same canonical source.
|
|
23
|
+
*/
|
|
24
|
+
export const RAW_DOCUMENT_COLUMNS = 'id, user_id, raw_source_id, external_id, external_uri, display_name, mime_type, size_bytes, content_hash, provider_version, source_modified_at, storage_mode, storage_uri, storage_provider, registration_status, raw_storage_status, raw_storage_metadata, metadata, created_at, updated_at, deleted_at, indexed_content_hash, indexed_at, extraction_status, semantic_index_status, last_error, raw_storage_claim_id, raw_storage_claimed_at, raw_storage_last_checked_at, raw_storage_next_check_at, raw_storage_reconcile_attempts, raw_storage_pending_since, storage_artifact_id';
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// raw_sources
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Idempotently insert (or update) a `raw_sources` row keyed on
|
|
30
|
+
* `(user_id, source_site, provider, COALESCE(account_id, ''))`. Returns
|
|
31
|
+
* the persisted row.
|
|
32
|
+
*
|
|
33
|
+
* On conflict the storage_mode + retention/consent policies are
|
|
34
|
+
* **overwritten** with the input values — those describe the caller's
|
|
35
|
+
* current intent, and silently keeping a stale policy on the existing
|
|
36
|
+
* row would mask configuration drift.
|
|
37
|
+
*/
|
|
38
|
+
export async function upsertRawSource(pool, input) {
|
|
39
|
+
const accountId = input.accountId ?? null;
|
|
40
|
+
const storageMode = input.storageMode ?? 'pointer_only';
|
|
41
|
+
const retentionPolicy = input.retentionPolicy ?? {};
|
|
42
|
+
const consentPolicy = input.consentPolicy ?? {};
|
|
43
|
+
const result = await pool.query(`INSERT INTO raw_sources (user_id, source_site, provider, account_id, storage_mode, retention_policy, consent_policy)
|
|
44
|
+
VALUES ($1, $2, $3, $4, $5, $6::jsonb, $7::jsonb)
|
|
45
|
+
ON CONFLICT (user_id, source_site, provider, COALESCE(account_id, ''))
|
|
46
|
+
DO UPDATE SET
|
|
47
|
+
storage_mode = EXCLUDED.storage_mode,
|
|
48
|
+
retention_policy = EXCLUDED.retention_policy,
|
|
49
|
+
consent_policy = EXCLUDED.consent_policy,
|
|
50
|
+
updated_at = NOW()
|
|
51
|
+
RETURNING ${RAW_SOURCE_COLUMNS}`, [
|
|
52
|
+
input.userId,
|
|
53
|
+
input.sourceSite,
|
|
54
|
+
input.provider,
|
|
55
|
+
accountId,
|
|
56
|
+
storageMode,
|
|
57
|
+
JSON.stringify(retentionPolicy),
|
|
58
|
+
JSON.stringify(consentPolicy),
|
|
59
|
+
]);
|
|
60
|
+
return rowToRawSource(result.rows[0]);
|
|
61
|
+
}
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// raw_documents
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
/**
|
|
66
|
+
* Idempotently register a `raw_documents` row. Returns
|
|
67
|
+
* `{ document, created: true }` when a fresh row was inserted, or
|
|
68
|
+
* `{ document, created: false }` when an active row already existed
|
|
69
|
+
* (matched on `idx_raw_documents_active_unique`).
|
|
70
|
+
*
|
|
71
|
+
* Implemented as a single atomic `INSERT ... ON CONFLICT DO NOTHING
|
|
72
|
+
* RETURNING ...` followed by a fallback SELECT when no row was
|
|
73
|
+
* inserted. Two concurrent calls for the same namespace see exactly
|
|
74
|
+
* one INSERT win and one fallback SELECT — neither caller observes
|
|
75
|
+
* the unique-violation error that the previous find-then-insert
|
|
76
|
+
* pattern could surface.
|
|
77
|
+
*
|
|
78
|
+
* Soft-deleted rows are excluded by the partial unique index, so a
|
|
79
|
+
* re-registration after `softDeleteRawDocument` always inserts a new id.
|
|
80
|
+
*/
|
|
81
|
+
export async function registerRawDocument(pool, input) {
|
|
82
|
+
// Step 7 of the storage-sibling plan: when the caller supplies an
|
|
83
|
+
// `external_uri`, this insert ALSO writes a paired pointer-mode
|
|
84
|
+
// `storage_artifacts` row and links `raw_documents.storage_artifact_id`
|
|
85
|
+
// in the same transaction. Documents registered without an
|
|
86
|
+
// `external_uri` remain pure registration stubs (NULL link). A
|
|
87
|
+
// later managed upload (Phase β2 in `document-upload.ts`) is the
|
|
88
|
+
// first place the row gets a managed artifact.
|
|
89
|
+
if (input.externalUri)
|
|
90
|
+
return registerWithPointerArtifact(pool, input);
|
|
91
|
+
return registerWithoutArtifact(pool, input);
|
|
92
|
+
}
|
|
93
|
+
async function registerWithoutArtifact(pool, input) {
|
|
94
|
+
const inserted = await tryInsertRawDocument(pool, input);
|
|
95
|
+
if (inserted)
|
|
96
|
+
return { document: inserted, created: true };
|
|
97
|
+
const existing = await findActiveDocumentRow(pool, input);
|
|
98
|
+
if (existing)
|
|
99
|
+
return { document: existing, created: false };
|
|
100
|
+
throw new Error('raw_documents: concurrent soft-delete observed during registration');
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Registration that pairs the new document with a pointer-mode
|
|
104
|
+
* `storage_artifacts` row in one transaction. On idempotent re-
|
|
105
|
+
* registration (the partial-unique index already has an active row),
|
|
106
|
+
* the caller's external_uri is ignored and the existing artifact
|
|
107
|
+
* link is preserved.
|
|
108
|
+
*/
|
|
109
|
+
async function registerWithPointerArtifact(pool, input) {
|
|
110
|
+
const client = await pool.connect();
|
|
111
|
+
try {
|
|
112
|
+
await client.query('BEGIN');
|
|
113
|
+
const inserted = await tryInsertRawDocumentWithClient(client, input);
|
|
114
|
+
if (inserted === null) {
|
|
115
|
+
await client.query('COMMIT');
|
|
116
|
+
const existing = await findActiveDocumentRow(pool, input);
|
|
117
|
+
if (existing)
|
|
118
|
+
return { document: existing, created: false };
|
|
119
|
+
throw new Error('raw_documents: concurrent soft-delete observed during registration');
|
|
120
|
+
}
|
|
121
|
+
const artifact = await createStorageArtifact(client, {
|
|
122
|
+
userId: input.userId,
|
|
123
|
+
provider: EXTERNAL_POINTER_PROVIDER,
|
|
124
|
+
mode: 'pointer',
|
|
125
|
+
uri: input.externalUri,
|
|
126
|
+
status: 'stored',
|
|
127
|
+
sizeBytes: input.sizeBytes ?? null,
|
|
128
|
+
contentType: input.mimeType ?? null,
|
|
129
|
+
contentEncoding: 'identity',
|
|
130
|
+
discloseContentHash: false,
|
|
131
|
+
identifiers: input.contentHash ? { contentHash: input.contentHash } : {},
|
|
132
|
+
metadata: {},
|
|
133
|
+
});
|
|
134
|
+
const linked = await client.query(`UPDATE raw_documents SET storage_artifact_id = $1, updated_at = NOW()
|
|
135
|
+
WHERE id = $2 RETURNING ${RAW_DOCUMENT_COLUMNS}`, [artifact.id, inserted.id]);
|
|
136
|
+
await client.query('COMMIT');
|
|
137
|
+
return { document: rowToRawDocument(linked.rows[0]), created: true };
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
141
|
+
throw err;
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
client.release();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const INSERT_RAW_DOCUMENT_COLUMNS = 'user_id, raw_source_id, external_id, external_uri, display_name, mime_type, size_bytes, content_hash, provider_version, source_modified_at, storage_mode, metadata, extraction_status, semantic_index_status';
|
|
148
|
+
const INSERT_RAW_DOCUMENT_PLACEHOLDERS = '$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12::jsonb, $13, $14';
|
|
149
|
+
/**
|
|
150
|
+
* Treat `undefined` as `null` at the wire-to-SQL boundary. Tiny helper so
|
|
151
|
+
* the param builder doesn't fan out one `?? null` branch per nullable
|
|
152
|
+
* column — keeping the builder's cyclomatic complexity at one path.
|
|
153
|
+
*/
|
|
154
|
+
function nullify(value) {
|
|
155
|
+
return value ?? null;
|
|
156
|
+
}
|
|
157
|
+
function buildInsertRawDocumentParams(input) {
|
|
158
|
+
return [
|
|
159
|
+
input.userId,
|
|
160
|
+
input.rawSourceId,
|
|
161
|
+
input.externalId,
|
|
162
|
+
nullify(input.externalUri),
|
|
163
|
+
nullify(input.displayName),
|
|
164
|
+
nullify(input.mimeType),
|
|
165
|
+
nullify(input.sizeBytes),
|
|
166
|
+
nullify(input.contentHash),
|
|
167
|
+
nullify(input.providerVersion),
|
|
168
|
+
nullify(input.sourceModifiedAt),
|
|
169
|
+
input.storageMode ?? 'pointer_only',
|
|
170
|
+
JSON.stringify(input.metadata ?? {}),
|
|
171
|
+
// Phase B — restricted-initial-state writes. Default
|
|
172
|
+
// `'not_required'` matches the column default; clients that opt
|
|
173
|
+
// into the document pipeline pass `'pending'` (see
|
|
174
|
+
// `RegisterDocumentBodySchema` for the wire-side guard).
|
|
175
|
+
input.extractionStatus ?? 'not_required',
|
|
176
|
+
input.semanticIndexStatus ?? 'not_required',
|
|
177
|
+
];
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Atomic INSERT on the active-unique partial index. Returns the
|
|
181
|
+
* persisted row when this call won the insert; null when an active
|
|
182
|
+
* row already exists (a concurrent caller, or this was a re-register
|
|
183
|
+
* with the same namespace).
|
|
184
|
+
*/
|
|
185
|
+
async function tryInsertRawDocument(pool, input) {
|
|
186
|
+
return tryInsertRawDocumentWithClient(pool, input);
|
|
187
|
+
}
|
|
188
|
+
async function tryInsertRawDocumentWithClient(q, input) {
|
|
189
|
+
const result = await q.query(`INSERT INTO raw_documents (${INSERT_RAW_DOCUMENT_COLUMNS})
|
|
190
|
+
VALUES (${INSERT_RAW_DOCUMENT_PLACEHOLDERS})
|
|
191
|
+
ON CONFLICT (user_id, raw_source_id, external_id, COALESCE(provider_version, ''))
|
|
192
|
+
WHERE deleted_at IS NULL DO NOTHING
|
|
193
|
+
RETURNING ${RAW_DOCUMENT_COLUMNS}`, buildInsertRawDocumentParams(input));
|
|
194
|
+
if (result.rows.length === 0)
|
|
195
|
+
return null;
|
|
196
|
+
return rowToRawDocument(result.rows[0]);
|
|
197
|
+
}
|
|
198
|
+
async function findActiveDocumentRow(pool, input) {
|
|
199
|
+
const result = await pool.query(`SELECT ${RAW_DOCUMENT_COLUMNS}
|
|
200
|
+
FROM raw_documents
|
|
201
|
+
WHERE user_id = $1
|
|
202
|
+
AND raw_source_id = $2
|
|
203
|
+
AND external_id = $3
|
|
204
|
+
AND COALESCE(provider_version, '') = COALESCE($4, '')
|
|
205
|
+
AND deleted_at IS NULL`, [input.userId, input.rawSourceId, input.externalId, input.providerVersion ?? null]);
|
|
206
|
+
if (result.rows.length === 0)
|
|
207
|
+
return null;
|
|
208
|
+
return rowToRawDocument(result.rows[0]);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Fetch one active document by id, scoped to a user. Returns null when
|
|
212
|
+
* the row is missing, deleted, or owned by a different user.
|
|
213
|
+
*/
|
|
214
|
+
export async function getRawDocumentById(q, userId, id) {
|
|
215
|
+
const result = await q.query(`SELECT ${RAW_DOCUMENT_COLUMNS}
|
|
216
|
+
FROM raw_documents
|
|
217
|
+
WHERE id = $1 AND user_id = $2 AND deleted_at IS NULL`, [id, userId]);
|
|
218
|
+
if (result.rows.length === 0)
|
|
219
|
+
return null;
|
|
220
|
+
return rowToRawDocument(result.rows[0]);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* List active documents for a user, optionally filtered by source_site.
|
|
224
|
+
* Limit is clamped to [1, 100]; offset is non-negative.
|
|
225
|
+
*/
|
|
226
|
+
export async function listRawDocuments(pool, input) {
|
|
227
|
+
const limit = Math.max(1, Math.min(100, Math.floor(input.limit ?? 20)));
|
|
228
|
+
const offset = Math.max(0, Math.floor(input.offset ?? 0));
|
|
229
|
+
const params = [input.userId, limit, offset];
|
|
230
|
+
let where = `d.user_id = $1 AND d.deleted_at IS NULL`;
|
|
231
|
+
if (input.sourceSite) {
|
|
232
|
+
params.push(input.sourceSite);
|
|
233
|
+
where += ` AND s.source_site = $${params.length}`;
|
|
234
|
+
}
|
|
235
|
+
const result = await pool.query(`SELECT ${RAW_DOCUMENT_COLUMNS.split(', ').map(c => `d.${c}`).join(', ')}
|
|
236
|
+
FROM raw_documents d
|
|
237
|
+
JOIN raw_sources s ON s.id = d.raw_source_id
|
|
238
|
+
WHERE ${where}
|
|
239
|
+
ORDER BY d.created_at DESC
|
|
240
|
+
LIMIT $2 OFFSET $3`, params);
|
|
241
|
+
return result.rows.map(rowToRawDocument);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Soft-delete one document by id, scoped to a user. Returns true when
|
|
245
|
+
* a row transitioned from active to deleted; false when the row was
|
|
246
|
+
* missing, already deleted, or owned by a different user.
|
|
247
|
+
*/
|
|
248
|
+
export async function softDeleteRawDocument(q, userId, id) {
|
|
249
|
+
const result = await q.query(`UPDATE raw_documents
|
|
250
|
+
SET deleted_at = NOW(), updated_at = NOW()
|
|
251
|
+
WHERE id = $1 AND user_id = $2 AND deleted_at IS NULL`, [id, userId]);
|
|
252
|
+
return (result.rowCount ?? 0) > 0;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Fetch one active document together with its parent source's
|
|
256
|
+
* `source_site`. The Phase 2 indexer uses `source_site` to populate the
|
|
257
|
+
* `memories.source_site` column on derived memories without needing a
|
|
258
|
+
* second round-trip.
|
|
259
|
+
*/
|
|
260
|
+
export async function getDocumentWithSourceSite(q, userId, id) {
|
|
261
|
+
const result = await q.query(`SELECT ${RAW_DOCUMENT_COLUMNS.split(', ').map((c) => `d.${c}`).join(', ')}, s.source_site
|
|
262
|
+
FROM raw_documents d
|
|
263
|
+
JOIN raw_sources s ON s.id = d.raw_source_id
|
|
264
|
+
WHERE d.id = $1 AND d.user_id = $2 AND d.deleted_at IS NULL`, [id, userId]);
|
|
265
|
+
if (result.rows.length === 0)
|
|
266
|
+
return null;
|
|
267
|
+
const row = result.rows[0];
|
|
268
|
+
return {
|
|
269
|
+
document: rowToRawDocument(row),
|
|
270
|
+
sourceSite: row.source_site,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Update the indexed-text fingerprint on an active document. Called by
|
|
275
|
+
* the Phase 2 indexer on a successful re-chunk pass so subsequent index
|
|
276
|
+
* calls can short-circuit on byte-identical input.
|
|
277
|
+
*
|
|
278
|
+
* Writes only `indexed_content_hash` + `indexed_at` (and `updated_at`).
|
|
279
|
+
* `content_hash` is reserved for the upstream/provider raw-content
|
|
280
|
+
* fingerprint and must not be touched by the indexer.
|
|
281
|
+
*/
|
|
282
|
+
export async function setRawDocumentIndexedHashWithClient(client, userId, id, indexedContentHash) {
|
|
283
|
+
await client.query(`UPDATE raw_documents
|
|
284
|
+
SET indexed_content_hash = $1,
|
|
285
|
+
indexed_at = NOW(),
|
|
286
|
+
updated_at = NOW()
|
|
287
|
+
WHERE id = $2 AND user_id = $3 AND deleted_at IS NULL`, [indexedContentHash, id, userId]);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Soft-delete every active document whose source_site matches.
|
|
291
|
+
* Joins through `raw_sources` so callers don't need to know
|
|
292
|
+
* `raw_source_id`. Used by `deleteBySource` to keep document deletion
|
|
293
|
+
* inside the same transactional reset.
|
|
294
|
+
*/
|
|
295
|
+
export async function deleteDocumentsBySourceWithClient(client, userId, sourceSite) {
|
|
296
|
+
const result = await client.query(`UPDATE raw_documents d
|
|
297
|
+
SET deleted_at = NOW(), updated_at = NOW()
|
|
298
|
+
FROM raw_sources s
|
|
299
|
+
WHERE d.raw_source_id = s.id
|
|
300
|
+
AND d.user_id = $1
|
|
301
|
+
AND s.source_site = $2
|
|
302
|
+
AND d.deleted_at IS NULL`, [userId, sourceSite]);
|
|
303
|
+
return result.rowCount ?? 0;
|
|
304
|
+
}
|
|
305
|
+
// ---------------------------------------------------------------------------
|
|
306
|
+
// Row mappers — accept the snake_case shape Postgres returns and emit
|
|
307
|
+
// the camelCase TypeScript types the rest of the codebase consumes.
|
|
308
|
+
// ---------------------------------------------------------------------------
|
|
309
|
+
function rowToRawSource(row) {
|
|
310
|
+
return {
|
|
311
|
+
id: row.id,
|
|
312
|
+
userId: row.user_id,
|
|
313
|
+
sourceSite: row.source_site,
|
|
314
|
+
provider: row.provider,
|
|
315
|
+
accountId: row.account_id ?? null,
|
|
316
|
+
storageMode: row.storage_mode,
|
|
317
|
+
retentionPolicy: row.retention_policy ?? {},
|
|
318
|
+
consentPolicy: row.consent_policy ?? {},
|
|
319
|
+
createdAt: row.created_at,
|
|
320
|
+
updatedAt: row.updated_at,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
function nullableString(value) {
|
|
324
|
+
return value ?? null;
|
|
325
|
+
}
|
|
326
|
+
function nullableDate(value) {
|
|
327
|
+
return value ?? null;
|
|
328
|
+
}
|
|
329
|
+
function nullableBigInt(value) {
|
|
330
|
+
return value === null || value === undefined ? null : Number(value);
|
|
331
|
+
}
|
|
332
|
+
/** Identifying fields shared by every active raw_documents row. */
|
|
333
|
+
function rowToRawDocumentIdentity(row) {
|
|
334
|
+
return {
|
|
335
|
+
id: row.id,
|
|
336
|
+
userId: row.user_id,
|
|
337
|
+
rawSourceId: row.raw_source_id,
|
|
338
|
+
externalId: row.external_id,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
/** Provider/source-side metadata fields. */
|
|
342
|
+
function rowToRawDocumentSourceMeta(row) {
|
|
343
|
+
return {
|
|
344
|
+
externalUri: nullableString(row.external_uri),
|
|
345
|
+
displayName: nullableString(row.display_name),
|
|
346
|
+
mimeType: nullableString(row.mime_type),
|
|
347
|
+
sizeBytes: nullableBigInt(row.size_bytes),
|
|
348
|
+
contentHash: nullableString(row.content_hash),
|
|
349
|
+
providerVersion: nullableString(row.provider_version),
|
|
350
|
+
sourceModifiedAt: nullableDate(row.source_modified_at),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
/** Storage + lifecycle status fields. */
|
|
354
|
+
function rowToRawDocumentStatus(row) {
|
|
355
|
+
return {
|
|
356
|
+
storageMode: row.storage_mode,
|
|
357
|
+
storageUri: nullableString(row.storage_uri),
|
|
358
|
+
storageProvider: nullableString(row.storage_provider),
|
|
359
|
+
registrationStatus: row.registration_status,
|
|
360
|
+
rawStorageStatus: row.raw_storage_status,
|
|
361
|
+
rawStorageMetadata: row.raw_storage_metadata ?? {},
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Phase 5 / Phase 6 private worker columns. Read into RawDocumentRow
|
|
366
|
+
* so the upload service and the reconciler can drive their state
|
|
367
|
+
* machines off typed fields; never projected to the wire.
|
|
368
|
+
*/
|
|
369
|
+
function rowToRawDocumentWorkerState(row) {
|
|
370
|
+
return {
|
|
371
|
+
rawStorageClaimId: nullableString(row.raw_storage_claim_id),
|
|
372
|
+
rawStorageClaimedAt: nullableDate(row.raw_storage_claimed_at),
|
|
373
|
+
rawStorageLastCheckedAt: nullableDate(row.raw_storage_last_checked_at),
|
|
374
|
+
rawStorageNextCheckAt: nullableDate(row.raw_storage_next_check_at),
|
|
375
|
+
rawStorageReconcileAttempts: typeof row.raw_storage_reconcile_attempts === 'number'
|
|
376
|
+
? row.raw_storage_reconcile_attempts
|
|
377
|
+
: 0,
|
|
378
|
+
rawStoragePendingSince: nullableDate(row.raw_storage_pending_since),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
/** Phase B — per-layer status fields + last_error envelope. */
|
|
382
|
+
function rowToRawDocumentLayerStatus(row) {
|
|
383
|
+
return {
|
|
384
|
+
extractionStatus: row.extraction_status,
|
|
385
|
+
semanticIndexStatus: row.semantic_index_status,
|
|
386
|
+
lastError: row.last_error ?? null,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Map a flat Postgres row into the typed `RawDocumentRow` shape.
|
|
391
|
+
* Exported so the Phase D list / recovery / passport-feed
|
|
392
|
+
* repositories can reuse it without re-implementing the column-by-
|
|
393
|
+
* column projection.
|
|
394
|
+
*/
|
|
395
|
+
export function rowToRawDocument(row) {
|
|
396
|
+
return {
|
|
397
|
+
...rowToRawDocumentIdentity(row),
|
|
398
|
+
...rowToRawDocumentSourceMeta(row),
|
|
399
|
+
...rowToRawDocumentStatus(row),
|
|
400
|
+
...rowToRawDocumentLayerStatus(row),
|
|
401
|
+
...rowToRawDocumentWorkerState(row),
|
|
402
|
+
metadata: row.metadata ?? {},
|
|
403
|
+
createdAt: row.created_at,
|
|
404
|
+
updatedAt: row.updated_at,
|
|
405
|
+
deletedAt: nullableDate(row.deleted_at),
|
|
406
|
+
indexedContentHash: nullableString(row.indexed_content_hash),
|
|
407
|
+
indexedAt: nullableDate(row.indexed_at),
|
|
408
|
+
storageArtifactId: nullableString(row.storage_artifact_id),
|
|
409
|
+
};
|
|
410
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-layer status repository helpers (Phase B).
|
|
3
|
+
*
|
|
4
|
+
* The audit at
|
|
5
|
+
* `Atomicmemory-research/docs/core-repo/design/document-ingest-audit.md`
|
|
6
|
+
* and the rev-18 hardening plan call for **service-owned** transitions
|
|
7
|
+
* of `extraction_status`, `semantic_index_status`, `raw_storage_status`
|
|
8
|
+
* and the `last_error` JSONB envelope. This module exposes the SQL
|
|
9
|
+
* primitives that the indexer (`document-indexer.ts`), the upload
|
|
10
|
+
* service (`document-upload.ts`), and any future async worker call to
|
|
11
|
+
* record those transitions.
|
|
12
|
+
*
|
|
13
|
+
* Design notes (cross-referenced from the plan):
|
|
14
|
+
*
|
|
15
|
+
* * Each helper accepts `pg.Pool | pg.PoolClient` so it works inside
|
|
16
|
+
* an in-flight transaction (e.g. the indexer's running-tx) and
|
|
17
|
+
* from a **fresh** statement after a parent rolled back. The catch
|
|
18
|
+
* paths in `document-upload.ts` and `document-indexer.ts` use the
|
|
19
|
+
* fresh-statement form deliberately so the durable failure write
|
|
20
|
+
* survives the rollback that drops the in-tx work.
|
|
21
|
+
*
|
|
22
|
+
* * Mark helpers are scoped by `user_id` + `id` and skip soft-deleted
|
|
23
|
+
* rows. They are **idempotent** at the SQL level - re-applying the
|
|
24
|
+
* same status (e.g. `'failed'` -> `'failed'` with the same code)
|
|
25
|
+
* returns the row unchanged.
|
|
26
|
+
*
|
|
27
|
+
* * `last_error` write rule: a failure transition writes the supplied
|
|
28
|
+
* envelope; a success transition clears `last_error` **only when
|
|
29
|
+
* the existing envelope was scoped to the same layer**. A
|
|
30
|
+
* successful semantic-index pass should not silently erase a
|
|
31
|
+
* previous extraction failure that someone else still needs to
|
|
32
|
+
* reconcile.
|
|
33
|
+
*/
|
|
34
|
+
import pg from 'pg';
|
|
35
|
+
import type { ExtractionStatus, LastError, LastErrorLayer, SemanticIndexStatus } from './raw-document-types.js';
|
|
36
|
+
/** Pool or in-flight client - matches the union the rest of the repo uses. */
|
|
37
|
+
type Querier = pg.Pool | pg.PoolClient;
|
|
38
|
+
interface MarkArgs {
|
|
39
|
+
q: Querier;
|
|
40
|
+
userId: string;
|
|
41
|
+
documentId: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Update `extraction_status` on an active row. Pass `lastError` for
|
|
45
|
+
* failure / unsupported transitions; success transitions clear the
|
|
46
|
+
* column when the prior `last_error` was scoped to the extraction
|
|
47
|
+
* layer.
|
|
48
|
+
*/
|
|
49
|
+
export declare function markExtractionStatus(args: MarkArgs & {
|
|
50
|
+
status: ExtractionStatus;
|
|
51
|
+
lastError?: LastError | null;
|
|
52
|
+
}): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Update `semantic_index_status` on an active row. Same `last_error`
|
|
55
|
+
* scoping rule as {@link markExtractionStatus} - a successful
|
|
56
|
+
* indexing pass clears the column only when it was last set by the
|
|
57
|
+
* semantic-index layer.
|
|
58
|
+
*/
|
|
59
|
+
export declare function markSemanticIndexStatus(args: MarkArgs & {
|
|
60
|
+
status: SemanticIndexStatus;
|
|
61
|
+
lastError?: LastError | null;
|
|
62
|
+
}): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Mark a row as `raw_storage_status='raw_storage_failed'` from a
|
|
65
|
+
* **document id** (not a storage URI). The audit fix the upload
|
|
66
|
+
* service relies on: when `store.put` throws before returning a URI
|
|
67
|
+
* the URI-keyed marker can't fire, so this doc-id form lives next to
|
|
68
|
+
* it and runs in the catch path of `uploadRawDocument` in a fresh
|
|
69
|
+
* statement after the parent transaction rolled back.
|
|
70
|
+
*/
|
|
71
|
+
export declare function markRawStorageFailedByDocumentId(args: MarkArgs & {
|
|
72
|
+
lastError: LastError;
|
|
73
|
+
}): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Clear `last_error` on a row when the existing envelope is scoped to
|
|
76
|
+
* `layer`. Optional helper for retry paths that want to reset only
|
|
77
|
+
* one layer's failure marker without touching status fields.
|
|
78
|
+
*/
|
|
79
|
+
export declare function clearLastError(args: MarkArgs & {
|
|
80
|
+
layer: LastErrorLayer;
|
|
81
|
+
}): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Hard cap on the persisted `last_error.message` length (UTF-16 code
|
|
84
|
+
* units, the JS string-length unit). Producer-facing failure messages
|
|
85
|
+
* vary widely - DB-driver stack traces, embedding-provider error
|
|
86
|
+
* blobs, file-extractor exceptions - and persisting them verbatim
|
|
87
|
+
* risks (a) blowing JSONB row-size budgets on operational noise and
|
|
88
|
+
* (b) leaking sensitive operational strings (URIs, keys baked into
|
|
89
|
+
* exception messages). This cap is the central knob; producers funnel
|
|
90
|
+
* through {@link buildLastError} so the cap applies uniformly to every
|
|
91
|
+
* `last_error` write.
|
|
92
|
+
*
|
|
93
|
+
* The number is sized to fit a useful human-readable detail line
|
|
94
|
+
* (e.g. one stack-frame's worth of context) without becoming a
|
|
95
|
+
* dumping ground for raw exception text.
|
|
96
|
+
*/
|
|
97
|
+
export declare const MAX_LAST_ERROR_MESSAGE_CHARS = 1000;
|
|
98
|
+
/**
|
|
99
|
+
* Normalize a producer-supplied error message before persisting it on
|
|
100
|
+
* `raw_documents.last_error`:
|
|
101
|
+
* * control chars (including TAB, CR, LF, and NUL) are replaced
|
|
102
|
+
* with a single space - keeps multi-line stack traces from
|
|
103
|
+
* breaking the UI's row layout and prevents NUL bytes from
|
|
104
|
+
* reaching clients that mishandle them;
|
|
105
|
+
* * runs of whitespace collapse to a single space - the message
|
|
106
|
+
* reads as a single line of operator detail;
|
|
107
|
+
* * the result is truncated to {@link MAX_LAST_ERROR_MESSAGE_CHARS}
|
|
108
|
+
* code units. No truncation marker is appended; readers compare
|
|
109
|
+
* against the cap if they want to flag truncation client-side.
|
|
110
|
+
*
|
|
111
|
+
* Exported so producer-side code paths (route handlers, services
|
|
112
|
+
* that need to build envelopes outside `buildLastError`) can apply
|
|
113
|
+
* the same sanitization rule without re-implementing it.
|
|
114
|
+
*/
|
|
115
|
+
export declare function sanitizeLastErrorMessage(raw: string): string;
|
|
116
|
+
/**
|
|
117
|
+
* Build a `LastError` envelope. Producers should funnel through this
|
|
118
|
+
* helper so the wire / JSONB shape stays uniform AND the message is
|
|
119
|
+
* sanitized + capped (see {@link sanitizeLastErrorMessage}).
|
|
120
|
+
*/
|
|
121
|
+
export declare function buildLastError(layer: LastErrorLayer, code: string, message: string, occurredAt?: Date): LastError;
|
|
122
|
+
export {};
|