@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,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase C constrained failure-marker transitions.
|
|
3
|
+
*
|
|
4
|
+
* `POST /v1/documents/:id/extraction-failure` and
|
|
5
|
+
* `POST /v1/documents/:id/index-failure` need to be **constrained**
|
|
6
|
+
* client-side surfaces, not arbitrary status writes - clients can
|
|
7
|
+
* declare *that* extraction or indexing failed and *what category*,
|
|
8
|
+
* but cannot put a document into arbitrary status combinations or
|
|
9
|
+
* smuggle log content into `last_error`. This module owns the
|
|
10
|
+
* load-then-transition logic for both endpoints:
|
|
11
|
+
*
|
|
12
|
+
* 1. Open a transaction and take the per-document
|
|
13
|
+
* `pg_advisory_xact_lock` so concurrent markers serialize.
|
|
14
|
+
* 2. Load the row's raw / extraction / semantic-index status.
|
|
15
|
+
* 3. Match the current state against the allowed source set and
|
|
16
|
+
* apply the corresponding write (or throw an
|
|
17
|
+
* `*InvalidStateError` -> 409).
|
|
18
|
+
* 4. Read the row back and COMMIT so the caller can see the
|
|
19
|
+
* durable post-transition shape.
|
|
20
|
+
*
|
|
21
|
+
* The audit fix the Phase B plan calls out (rev 18 Phase C section):
|
|
22
|
+
* the marker MUST sit in front of `markExtractionStatus` /
|
|
23
|
+
* `markSemanticIndexStatus` so the row's status pair stays internally
|
|
24
|
+
* consistent (e.g. `extraction='failed'` + `semantic_index='not_required'`
|
|
25
|
+
* always travel together).
|
|
26
|
+
*/
|
|
27
|
+
import { getRawDocumentById } from '../db/raw-document-repository.js';
|
|
28
|
+
import { buildLastError, markExtractionStatus, markSemanticIndexStatus, } from '../db/raw-document-status-repository.js';
|
|
29
|
+
/** Document not found / not owned by user. Routes map to 404. */
|
|
30
|
+
export class FailureMarkerDocumentNotFoundError extends Error {
|
|
31
|
+
documentId;
|
|
32
|
+
constructor(documentId) {
|
|
33
|
+
super(`document ${documentId} not found`);
|
|
34
|
+
this.documentId = documentId;
|
|
35
|
+
this.name = 'FailureMarkerDocumentNotFoundError';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Phase C - the row's current state does not allow the requested
|
|
40
|
+
* extraction-layer transition. Routes map to 409 and echo `current`
|
|
41
|
+
* in the response so the caller can decide whether to retry.
|
|
42
|
+
*/
|
|
43
|
+
export class ExtractionFailureInvalidStateError extends Error {
|
|
44
|
+
documentId;
|
|
45
|
+
current;
|
|
46
|
+
constructor(documentId, current) {
|
|
47
|
+
super(`document ${documentId} cannot transition to extraction_status='failed' ` +
|
|
48
|
+
`from current state ${JSON.stringify(current)}`);
|
|
49
|
+
this.documentId = documentId;
|
|
50
|
+
this.current = current;
|
|
51
|
+
this.name = 'ExtractionFailureInvalidStateError';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Phase C - the row's current state does not allow the requested
|
|
56
|
+
* index-layer transition. Routes map to 409 and echo `current` in
|
|
57
|
+
* the response.
|
|
58
|
+
*/
|
|
59
|
+
export class IndexFailureInvalidStateError extends Error {
|
|
60
|
+
documentId;
|
|
61
|
+
current;
|
|
62
|
+
constructor(documentId, current) {
|
|
63
|
+
super(`document ${documentId} cannot transition to semantic_index_status='failed' ` +
|
|
64
|
+
`from current state ${JSON.stringify(current)}`);
|
|
65
|
+
this.documentId = documentId;
|
|
66
|
+
this.current = current;
|
|
67
|
+
this.name = 'IndexFailureInvalidStateError';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** Raw-storage states that mean "raw bytes are recoverable for retry / forensics". */
|
|
71
|
+
const RAW_OK = new Set([
|
|
72
|
+
'blob_stored',
|
|
73
|
+
'inline_text_stored',
|
|
74
|
+
'pointer_recorded',
|
|
75
|
+
]);
|
|
76
|
+
function snapshot(row) {
|
|
77
|
+
return {
|
|
78
|
+
raw_storage_status: row.rawStorageStatus,
|
|
79
|
+
extraction_status: row.extractionStatus,
|
|
80
|
+
semantic_index_status: row.semanticIndexStatus,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async function withDocumentLock(pool, userId, documentId, body) {
|
|
84
|
+
const client = await pool.connect();
|
|
85
|
+
try {
|
|
86
|
+
await client.query('BEGIN');
|
|
87
|
+
await client.query('SELECT pg_advisory_xact_lock(hashtext($1))', [documentId]);
|
|
88
|
+
const row = await getRawDocumentById(client, userId, documentId);
|
|
89
|
+
if (!row) {
|
|
90
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
91
|
+
throw new FailureMarkerDocumentNotFoundError(documentId);
|
|
92
|
+
}
|
|
93
|
+
let result;
|
|
94
|
+
try {
|
|
95
|
+
result = await body(client, row);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
await client.query('COMMIT');
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
client.release();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function reload(client, userId, documentId) {
|
|
109
|
+
const row = await getRawDocumentById(client, userId, documentId);
|
|
110
|
+
if (!row) {
|
|
111
|
+
// Cannot happen inside the advisory lock unless the row was hard-
|
|
112
|
+
// deleted by something outside this code path; treat as not-found
|
|
113
|
+
// rather than corrupting the caller's flow.
|
|
114
|
+
throw new FailureMarkerDocumentNotFoundError(documentId);
|
|
115
|
+
}
|
|
116
|
+
return row;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Apply the indexer-layer `'failed'` write + reload-and-return the
|
|
120
|
+
* fresh row. Used by both branches of `markIndexFailure` (idempotent
|
|
121
|
+
* `last_error` refresh + first-time failure from pending) so the SQL
|
|
122
|
+
* shape is owned in one place. The caller decides the `idempotent`
|
|
123
|
+
* flag.
|
|
124
|
+
*/
|
|
125
|
+
async function applySemanticIndexFailedAndReload(args) {
|
|
126
|
+
await markSemanticIndexStatus({
|
|
127
|
+
q: args.client,
|
|
128
|
+
userId: args.userId,
|
|
129
|
+
documentId: args.documentId,
|
|
130
|
+
status: 'failed',
|
|
131
|
+
lastError: args.lastError,
|
|
132
|
+
});
|
|
133
|
+
const reloaded = await reload(args.client, args.userId, args.documentId);
|
|
134
|
+
return { document: reloaded, idempotent: args.idempotent };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Phase C constrained transition for the extraction layer.
|
|
138
|
+
*
|
|
139
|
+
* Allowed source states:
|
|
140
|
+
* * `extraction_status='failed'` + same `errorCode` -> idempotent
|
|
141
|
+
* no-op; caller sees the existing row with `idempotent: true`.
|
|
142
|
+
* * `extraction_status='failed'` + different `errorCode` -> refresh
|
|
143
|
+
* `last_error` only; status stays `'failed'`. `idempotent: true`.
|
|
144
|
+
* * `extraction_status='pending'` + raw stored ->
|
|
145
|
+
* `extraction_status='failed'` + `semantic_index_status='not_required'`
|
|
146
|
+
* + new `last_error.layer='extraction'`. `idempotent: false`.
|
|
147
|
+
*
|
|
148
|
+
* Any other state throws `ExtractionFailureInvalidStateError` (-> 409).
|
|
149
|
+
*/
|
|
150
|
+
export async function markExtractionFailure(pool, input) {
|
|
151
|
+
return withDocumentLock(pool, input.userId, input.documentId, async (client, row) => {
|
|
152
|
+
const lastError = buildLastError('extraction', input.errorCode, input.errorMessage);
|
|
153
|
+
// Branch 1: idempotent retry on an already-failed row.
|
|
154
|
+
if (row.extractionStatus === 'failed') {
|
|
155
|
+
const sameCode = row.lastError?.layer === 'extraction'
|
|
156
|
+
&& row.lastError.code === input.errorCode;
|
|
157
|
+
if (sameCode) {
|
|
158
|
+
// Same code: do not touch the row - preserves the original
|
|
159
|
+
// `occurred_at` so per-incident timestamps stay stable across
|
|
160
|
+
// retries from the same caller.
|
|
161
|
+
return { document: row, idempotent: true };
|
|
162
|
+
}
|
|
163
|
+
// Different code (or stale envelope): refresh `last_error`.
|
|
164
|
+
// `markExtractionStatus(failed, lastError)` writes the new
|
|
165
|
+
// envelope unconditionally on the failed-status branch.
|
|
166
|
+
await markExtractionStatus({
|
|
167
|
+
q: client,
|
|
168
|
+
userId: input.userId,
|
|
169
|
+
documentId: input.documentId,
|
|
170
|
+
status: 'failed',
|
|
171
|
+
lastError,
|
|
172
|
+
});
|
|
173
|
+
const reloaded = await reload(client, input.userId, input.documentId);
|
|
174
|
+
return { document: reloaded, idempotent: true };
|
|
175
|
+
}
|
|
176
|
+
// Branch 2: first-time failure from `'pending'` + raw stored.
|
|
177
|
+
if (row.extractionStatus === 'pending' && RAW_OK.has(row.rawStorageStatus)) {
|
|
178
|
+
await markExtractionStatus({
|
|
179
|
+
q: client,
|
|
180
|
+
userId: input.userId,
|
|
181
|
+
documentId: input.documentId,
|
|
182
|
+
status: 'failed',
|
|
183
|
+
lastError,
|
|
184
|
+
});
|
|
185
|
+
// Failed extraction implies nothing to index. Service-owned
|
|
186
|
+
// semantic-index status flip; the helper's success-branch
|
|
187
|
+
// `last_error` clear ignores envelopes scoped to other layers,
|
|
188
|
+
// so the extraction `last_error` we just wrote is preserved.
|
|
189
|
+
await markSemanticIndexStatus({
|
|
190
|
+
q: client,
|
|
191
|
+
userId: input.userId,
|
|
192
|
+
documentId: input.documentId,
|
|
193
|
+
status: 'not_required',
|
|
194
|
+
});
|
|
195
|
+
const reloaded = await reload(client, input.userId, input.documentId);
|
|
196
|
+
return { document: reloaded, idempotent: false };
|
|
197
|
+
}
|
|
198
|
+
// Anything else - 409.
|
|
199
|
+
throw new ExtractionFailureInvalidStateError(input.documentId, snapshot(row));
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Phase C constrained transition for the semantic-index layer.
|
|
204
|
+
*
|
|
205
|
+
* Allowed source states:
|
|
206
|
+
* * `semantic_index_status='failed'` + same `errorCode` -> idempotent
|
|
207
|
+
* no-op (`idempotent: true`).
|
|
208
|
+
* * `semantic_index_status='failed'` + different `errorCode` ->
|
|
209
|
+
* refresh `last_error` only; status stays `'failed'`.
|
|
210
|
+
* `idempotent: true`.
|
|
211
|
+
* * `extraction_status='complete'` +
|
|
212
|
+
* `semantic_index_status='pending'` + raw stored ->
|
|
213
|
+
* `semantic_index_status='failed'` +
|
|
214
|
+
* `last_error.layer='semantic_index'`. `idempotent: false`.
|
|
215
|
+
* * `extraction_status='pending'` +
|
|
216
|
+
* `semantic_index_status='pending'` AND
|
|
217
|
+
* `errorCode='index_text_too_large'` + raw stored -> atomically
|
|
218
|
+
* `extraction_status='complete'` +
|
|
219
|
+
* `semantic_index_status='failed'` + `last_error`. The
|
|
220
|
+
* atomic-extraction-complete shortcut models the upload-pipeline
|
|
221
|
+
* case where the webapp has the extracted text in hand but it
|
|
222
|
+
* exceeded the index byte cap before reaching `POST /:id/index`.
|
|
223
|
+
*
|
|
224
|
+
* Any other state -> `IndexFailureInvalidStateError` (-> 409).
|
|
225
|
+
*/
|
|
226
|
+
/** True when the row matches the "extraction completed, indexing pending" branch. */
|
|
227
|
+
function isCompleteThenPendingIndex(row) {
|
|
228
|
+
return (row.extractionStatus === 'complete'
|
|
229
|
+
&& row.semanticIndexStatus === 'pending'
|
|
230
|
+
&& RAW_OK.has(row.rawStorageStatus));
|
|
231
|
+
}
|
|
232
|
+
/** True when the row matches the upload-pipeline atomic shortcut branch. */
|
|
233
|
+
function isPendingPendingIndexTooLarge(row, errorCode) {
|
|
234
|
+
return (row.extractionStatus === 'pending'
|
|
235
|
+
&& row.semanticIndexStatus === 'pending'
|
|
236
|
+
&& RAW_OK.has(row.rawStorageStatus)
|
|
237
|
+
&& errorCode === 'index_text_too_large');
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Idempotent-retry handler for a row already in
|
|
241
|
+
* `semantic_index_status='failed'`. Same code -> no-op; different
|
|
242
|
+
* code -> refresh `last_error`. Always reports `idempotent: true`.
|
|
243
|
+
*/
|
|
244
|
+
async function indexFailureIdempotentRetry(args) {
|
|
245
|
+
const sameCode = args.row.lastError?.layer === 'semantic_index'
|
|
246
|
+
&& args.row.lastError.code === args.input.errorCode;
|
|
247
|
+
if (sameCode) {
|
|
248
|
+
return { document: args.row, idempotent: true };
|
|
249
|
+
}
|
|
250
|
+
return applySemanticIndexFailedAndReload({
|
|
251
|
+
client: args.client,
|
|
252
|
+
userId: args.input.userId,
|
|
253
|
+
documentId: args.input.documentId,
|
|
254
|
+
lastError: args.lastError,
|
|
255
|
+
idempotent: true,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Atomic extraction-complete shortcut for the upload-pipeline
|
|
260
|
+
* `index_text_too_large` case. Order matters within the transaction:
|
|
261
|
+
* 1. `markExtractionStatus(complete)` clears any prior
|
|
262
|
+
* extraction-scoped `last_error` (none expected, but the
|
|
263
|
+
* helper guards regardless) and flips extraction.
|
|
264
|
+
* 2. `markSemanticIndexStatus(failed, lastError)` writes the
|
|
265
|
+
* durable failure envelope. The two writes COMMIT together
|
|
266
|
+
* so external readers never observe the intermediate
|
|
267
|
+
* `extraction='complete'` + `semantic_index='pending'` state
|
|
268
|
+
* (the lock plus the single COMMIT serializes them).
|
|
269
|
+
*/
|
|
270
|
+
async function indexFailurePendingShortcut(args) {
|
|
271
|
+
await markExtractionStatus({
|
|
272
|
+
q: args.client,
|
|
273
|
+
userId: args.input.userId,
|
|
274
|
+
documentId: args.input.documentId,
|
|
275
|
+
status: 'complete',
|
|
276
|
+
});
|
|
277
|
+
return applySemanticIndexFailedAndReload({
|
|
278
|
+
client: args.client,
|
|
279
|
+
userId: args.input.userId,
|
|
280
|
+
documentId: args.input.documentId,
|
|
281
|
+
lastError: args.lastError,
|
|
282
|
+
idempotent: false,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
export async function markIndexFailure(pool, input) {
|
|
286
|
+
return withDocumentLock(pool, input.userId, input.documentId, async (client, row) => {
|
|
287
|
+
const lastError = buildLastError('semantic_index', input.errorCode, input.errorMessage);
|
|
288
|
+
if (row.semanticIndexStatus === 'failed') {
|
|
289
|
+
return indexFailureIdempotentRetry({ client, row, input, lastError });
|
|
290
|
+
}
|
|
291
|
+
if (isCompleteThenPendingIndex(row)) {
|
|
292
|
+
return applySemanticIndexFailedAndReload({
|
|
293
|
+
client,
|
|
294
|
+
userId: input.userId,
|
|
295
|
+
documentId: input.documentId,
|
|
296
|
+
lastError,
|
|
297
|
+
idempotent: false,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
if (isPendingPendingIndexTooLarge(row, input.errorCode)) {
|
|
301
|
+
return indexFailurePendingShortcut({ client, input, lastError });
|
|
302
|
+
}
|
|
303
|
+
throw new IndexFailureInvalidStateError(input.documentId, snapshot(row));
|
|
304
|
+
});
|
|
305
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document indexer (Phase 2 + Phase B hardening).
|
|
3
|
+
*
|
|
4
|
+
* Takes a registered document + a body of text, deterministically
|
|
5
|
+
* chunks it, embeds every chunk in one batch via the existing core
|
|
6
|
+
* `embedTexts` helper, persists chunks to `document_chunks`, and writes
|
|
7
|
+
* one row per chunk into `memories` with `raw_document_id` +
|
|
8
|
+
* `document_chunk_id` provenance set so the existing
|
|
9
|
+
* `/v1/memories/search` retrieval pipeline finds them.
|
|
10
|
+
*
|
|
11
|
+
* Phase B (rev-18 plan, Phase B section "document-indexer.ts") rewrote
|
|
12
|
+
* the flow so it cannot leave a row in a stuck pending/running state:
|
|
13
|
+
*
|
|
14
|
+
* 1. Schema validation — type check only, no row touched (`IndexInputError` → 400).
|
|
15
|
+
* 2. Open transaction, take per-document advisory lock, load row.
|
|
16
|
+
* 3. Idempotent / re-index short-circuits BEFORE marking running:
|
|
17
|
+
* - `'complete'` + same `indexed_content_hash` → COMMIT, return idempotent skip.
|
|
18
|
+
* - `'complete'` + different hash → fall through; the conditional
|
|
19
|
+
* UPDATE below moves the row through 'running' and the existing
|
|
20
|
+
* `clearPriorGeneration` path replaces chunks atomically.
|
|
21
|
+
* 4. Atomic conditional UPDATE → `'running'` (CAS). Only fires when
|
|
22
|
+
* `semantic_index_status IN ('pending','failed','stale','complete')`;
|
|
23
|
+
* `'running'` (concurrent writer) and `'not_required'` (registered
|
|
24
|
+
* not-to-index) yield rowCount=0 → ROLLBACK + 409.
|
|
25
|
+
* 5. Known-document semantic validation: text-too-large / empty bodies
|
|
26
|
+
* ROLLBACK the running write, then write durable `'failed'` from
|
|
27
|
+
* a fresh statement so direct SDK callers cannot leave a stuck
|
|
28
|
+
* pending row.
|
|
29
|
+
* 6. Prepare chunks (chunkText + embedTexts), persist inside the same
|
|
30
|
+
* transaction, mark `'complete'` + clear `last_error.semantic_index`,
|
|
31
|
+
* COMMIT.
|
|
32
|
+
*
|
|
33
|
+
* Visibility note: the `'running'` state is written *inside* the
|
|
34
|
+
* BEGIN..COMMIT transaction, so under READ COMMITTED isolation other
|
|
35
|
+
* connections never observe it — the row reads as the prior committed
|
|
36
|
+
* state until COMMIT, at which point the row reads as `'complete'`
|
|
37
|
+
* (success) or — after the catch-path fresh-tx write — `'failed'`. The
|
|
38
|
+
* `'running'` value exists for the conditional-UPDATE concurrency
|
|
39
|
+
* guard, not as a UI state. UI rendering of "indexing in progress"
|
|
40
|
+
* requires a future async-worker design that commits `'running'`
|
|
41
|
+
* before doing the work, with a lease/heartbeat (out of scope; see
|
|
42
|
+
* the rev-18 "Out of scope" section).
|
|
43
|
+
*
|
|
44
|
+
* Idempotency contract (preserved): a re-index with byte-identical text
|
|
45
|
+
* under the current `chunker_version` is a no-op (no fresh chunks, no
|
|
46
|
+
* fresh memories, `indexed_content_hash` unchanged). A re-index with
|
|
47
|
+
* new text soft-deletes the prior chunk + memory generation in
|
|
48
|
+
* user-scope before inserting the fresh one. Retry from
|
|
49
|
+
* `semantic_index_status='failed'` proceeds normally (no skip), clears
|
|
50
|
+
* `last_error`, and lands `'complete'`.
|
|
51
|
+
*/
|
|
52
|
+
import pg from 'pg';
|
|
53
|
+
import { type ChunkOptions } from './document-chunker.js';
|
|
54
|
+
import type { SemanticIndexStatus } from '../db/raw-document-types.js';
|
|
55
|
+
export interface IndexDocumentInput {
|
|
56
|
+
userId: string;
|
|
57
|
+
documentId: string;
|
|
58
|
+
text: string;
|
|
59
|
+
chunkOptions?: ChunkOptions;
|
|
60
|
+
}
|
|
61
|
+
export interface IndexDocumentResult {
|
|
62
|
+
documentId: string;
|
|
63
|
+
/**
|
|
64
|
+
* SHA-256 of the indexed text under the current `chunker_version`.
|
|
65
|
+
* Distinct from `RawDocumentRow.contentHash` (which is the
|
|
66
|
+
* upstream/provider raw-content fingerprint) — both can co-exist on
|
|
67
|
+
* the same document.
|
|
68
|
+
*/
|
|
69
|
+
indexedContentHash: string;
|
|
70
|
+
chunksCreated: number;
|
|
71
|
+
memoriesCreated: number;
|
|
72
|
+
/** True when the input text matched the prior indexed text and no work was done. */
|
|
73
|
+
idempotentSkip: boolean;
|
|
74
|
+
chunkerVersion: string;
|
|
75
|
+
parserVersion: string;
|
|
76
|
+
}
|
|
77
|
+
/** Document not found / not owned by user. Routes map to 404. */
|
|
78
|
+
export declare class DocumentNotFoundError extends Error {
|
|
79
|
+
readonly documentId: string;
|
|
80
|
+
constructor(documentId: string);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Schema-level (pre-document) input failure. Routes map to 400; no
|
|
84
|
+
* row update fires because the document hasn't been loaded yet (and
|
|
85
|
+
* may not even exist).
|
|
86
|
+
*/
|
|
87
|
+
export declare class IndexInputError extends Error {
|
|
88
|
+
constructor(message: string);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Phase B — the conditional UPDATE that moves
|
|
92
|
+
* `semantic_index_status` to `'running'` returned rowCount=0. The
|
|
93
|
+
* row is in a state that does not allow indexing (`'running'`
|
|
94
|
+
* concurrent writer, `'not_required'`, or vanished between load
|
|
95
|
+
* and the CAS write). Routes map to 409.
|
|
96
|
+
*/
|
|
97
|
+
export declare class IndexInvalidStateError extends Error {
|
|
98
|
+
readonly documentId: string;
|
|
99
|
+
readonly currentStatus: SemanticIndexStatus;
|
|
100
|
+
constructor(documentId: string, currentStatus: SemanticIndexStatus);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Phase B — known-document semantic validation failure. Thrown after
|
|
104
|
+
* the row has been loaded and the running CAS has fired, so the
|
|
105
|
+
* indexer's catch path writes durable `semantic_index_status='failed'`
|
|
106
|
+
* + `last_error` BEFORE rethrowing. Routes map to 413/400 with the
|
|
107
|
+
* `documentId` echoed in the body so callers can navigate to the
|
|
108
|
+
* failed row's detail view.
|
|
109
|
+
*/
|
|
110
|
+
export type IndexSemanticValidationCode = 'index_text_too_large' | 'extraction_empty';
|
|
111
|
+
export declare class IndexSemanticValidationError extends Error {
|
|
112
|
+
readonly documentId: string;
|
|
113
|
+
readonly code: IndexSemanticValidationCode;
|
|
114
|
+
constructor(documentId: string, code: IndexSemanticValidationCode, message: string);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Run the full index path. See file docstring for the six-phase
|
|
118
|
+
* structure. The `pool` is used to check out one client for the
|
|
119
|
+
* mutation transaction; failure markers ride a fresh statement on the
|
|
120
|
+
* same pool so they survive the rollback.
|
|
121
|
+
*/
|
|
122
|
+
export declare function indexDocumentText(pool: pg.Pool, input: IndexDocumentInput): Promise<IndexDocumentResult>;
|