@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,369 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Direct storage API routes (`/v1/storage/*`).
|
|
3
|
+
*
|
|
4
|
+
* Step 3 added `GET /v1/storage/capabilities`; Step 5 adds the
|
|
5
|
+
* artifact CRUD surface on top of the same router:
|
|
6
|
+
*
|
|
7
|
+
* POST /v1/storage/artifacts pointer (JSON body) or
|
|
8
|
+
* ?mode=managed (raw bytes)
|
|
9
|
+
* GET /v1/storage/artifacts/:id public metadata
|
|
10
|
+
* GET /v1/storage/artifacts/:id/content bytes (managed) or 409 (pointer)
|
|
11
|
+
* HEAD /v1/storage/artifacts/:id metadata via response headers
|
|
12
|
+
* DELETE /v1/storage/artifacts/:id?policy=...
|
|
13
|
+
* POST /v1/storage/artifacts/:id/verify backend.head()-based shim
|
|
14
|
+
*
|
|
15
|
+
* Body parsing is per-route:
|
|
16
|
+
* * Pointer-mode put + verify use the standard JSON parser.
|
|
17
|
+
* * Managed-mode put uses `express.raw({ type: '*\/*' })` with the
|
|
18
|
+
* configured byte cap; the route extracts the caller-supplied
|
|
19
|
+
* `X-AtomicMemory-Metadata` header (base64-encoded JSON) and
|
|
20
|
+
* validates it against the decoded-JSON cap.
|
|
21
|
+
*
|
|
22
|
+
* Redaction posture: every public response runs through
|
|
23
|
+
* `formatStoredArtifact` (or its sibling formatters) which projects
|
|
24
|
+
* an allowlisted shape THEN `.strict()`-parses through the schema in
|
|
25
|
+
* `STORAGE_RESPONSE_SCHEMAS`. Internal columns (`stored_hash`,
|
|
26
|
+
* `last_error`, `delete_attempt_id`) never reach the wire.
|
|
27
|
+
*/
|
|
28
|
+
import express, { Router } from 'express';
|
|
29
|
+
import { handleRouteError } from './route-errors.js';
|
|
30
|
+
import { validateResponse } from '../middleware/validate-response.js';
|
|
31
|
+
import { STORAGE_RESPONSE_SCHEMAS } from './response-schema-map.js';
|
|
32
|
+
import { formatArtifactHeadHeaders, formatStoredArtifact, } from './storage-response-formatters.js';
|
|
33
|
+
import { getStorageCapabilities, } from '../storage/storage-capabilities.js';
|
|
34
|
+
import { InvalidArtifactMetadataError, StorageArtifactNotFoundError, } from '../services/storage-service-errors.js';
|
|
35
|
+
import { LegacyUserIdRejection, handleStorageError, } from './storage-error-handlers.js';
|
|
36
|
+
import { validateArtifactMetadata, } from '../services/storage-service.js';
|
|
37
|
+
import { PutPointerBodySchema } from '../schemas/storage-schemas.js';
|
|
38
|
+
const METADATA_HEADER = 'x-atomicmemory-metadata';
|
|
39
|
+
const METADATA_HEADER_MAX_ENCODED_BYTES = 8 * 1024;
|
|
40
|
+
const DEFAULT_JSON_LIMIT = '1mb';
|
|
41
|
+
export function createStorageRouter(opts) {
|
|
42
|
+
const router = Router();
|
|
43
|
+
router.use(validateResponse(STORAGE_RESPONSE_SCHEMAS));
|
|
44
|
+
registerCapabilitiesRoute(router, opts.capabilities);
|
|
45
|
+
registerPutArtifactRoute(router, opts);
|
|
46
|
+
// HEAD MUST register before GET /:id — Express's auto-HEAD-from-GET
|
|
47
|
+
// path is picked when the GET handler is registered first, which
|
|
48
|
+
// suppresses our explicit `X-AtomicMemory-*` response headers.
|
|
49
|
+
registerHeadArtifactRoute(router, opts.service);
|
|
50
|
+
registerGetArtifactRoute(router, opts.service);
|
|
51
|
+
registerGetArtifactContentRoute(router, opts.service);
|
|
52
|
+
registerDeleteArtifactRoute(router, opts.service);
|
|
53
|
+
registerVerifyArtifactRoute(router, opts.service);
|
|
54
|
+
return router;
|
|
55
|
+
}
|
|
56
|
+
function registerCapabilitiesRoute(router, snapshot) {
|
|
57
|
+
router.get('/capabilities', (_req, res) => {
|
|
58
|
+
try {
|
|
59
|
+
res.json(getStorageCapabilities(snapshot));
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
handleRouteError(res, 'get_storage_capabilities', error);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function registerPutArtifactRoute(router, opts) {
|
|
67
|
+
const rawParser = express.raw({
|
|
68
|
+
type: '*/*',
|
|
69
|
+
limit: opts.managedUploadMaxBytes,
|
|
70
|
+
});
|
|
71
|
+
const jsonParser = express.json({ limit: DEFAULT_JSON_LIMIT });
|
|
72
|
+
router.post('/artifacts', (req, res, next) => {
|
|
73
|
+
if (req.query.mode === 'managed')
|
|
74
|
+
return rawParser(req, res, next);
|
|
75
|
+
return jsonParser(req, res, next);
|
|
76
|
+
}, async (req, res) => {
|
|
77
|
+
try {
|
|
78
|
+
const userId = readUserId(req);
|
|
79
|
+
if (req.query.mode === 'managed') {
|
|
80
|
+
await handleManagedPut(req, res, opts.service, userId, opts.managedUploadMaxBytes);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
await handlePointerPut(req, res, opts.service, userId);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
if (handleStorageError(res, err))
|
|
87
|
+
return;
|
|
88
|
+
handleRouteError(res, 'POST /v1/storage/artifacts', err);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async function handlePointerPut(req, res, service, userId) {
|
|
93
|
+
// Project-and-validate the pointer body through the strict schema
|
|
94
|
+
// BEFORE persistence: this catches negative / fractional
|
|
95
|
+
// `size_bytes`, empty `uri` / `content_type`, and unknown keys —
|
|
96
|
+
// all of which would otherwise either insert a bad row or fail
|
|
97
|
+
// the response-shape validation after the row was already stored.
|
|
98
|
+
const parsed = PutPointerBodySchema.safeParse(req.body);
|
|
99
|
+
if (!parsed.success) {
|
|
100
|
+
res.status(400).json({
|
|
101
|
+
error_code: 'invalid_pointer_body',
|
|
102
|
+
error: 'pointer-mode body failed validation',
|
|
103
|
+
issues: parsed.error.issues.map((i) => ({ path: i.path, message: i.message })),
|
|
104
|
+
});
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// Re-validate metadata for the 4 KiB cap — `PutPointerBodySchema`
|
|
108
|
+
// bounds the value types but the byte-size check is policy that
|
|
109
|
+
// lives on the service-shared validator.
|
|
110
|
+
validateArtifactMetadata(parsed.data.metadata);
|
|
111
|
+
const row = await service.putPointer({
|
|
112
|
+
userId,
|
|
113
|
+
uri: parsed.data.uri,
|
|
114
|
+
contentType: parsed.data.content_type,
|
|
115
|
+
sizeBytes: parsed.data.size_bytes ?? null,
|
|
116
|
+
contentHash: parsed.data.content_hash ?? null,
|
|
117
|
+
metadata: parsed.data.metadata,
|
|
118
|
+
});
|
|
119
|
+
res.status(201).json(formatStoredArtifact(row));
|
|
120
|
+
}
|
|
121
|
+
async function handleManagedPut(req, res, service, userId, maxBytes) {
|
|
122
|
+
const lengthCheck = checkManagedContentLength(req, maxBytes);
|
|
123
|
+
if (lengthCheck !== null) {
|
|
124
|
+
res.status(lengthCheck.status).json({ error: lengthCheck.error });
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const disclose = parseDiscloseFlag(req.query.disclose_content_hash);
|
|
128
|
+
if (disclose === 'invalid') {
|
|
129
|
+
res.status(400).json({
|
|
130
|
+
error_code: 'invalid_disclose_content_hash',
|
|
131
|
+
error: 'disclose_content_hash query parameter must be "true" or "false"',
|
|
132
|
+
});
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const body = req.body;
|
|
136
|
+
if (!Buffer.isBuffer(body) || body.length === 0) {
|
|
137
|
+
res.status(400).json({ error: 'request body is required' });
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const row = await service.putManaged({
|
|
141
|
+
userId,
|
|
142
|
+
body,
|
|
143
|
+
contentType: readManagedContentType(req),
|
|
144
|
+
discloseContentHash: disclose,
|
|
145
|
+
metadata: parseMetadataHeader(req),
|
|
146
|
+
});
|
|
147
|
+
res.status(201).json(formatStoredArtifact(row));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Parse the `disclose_content_hash` query value with a closed
|
|
151
|
+
* tri-state result: `true`, `false`, or `'invalid'`. The route maps
|
|
152
|
+
* `'invalid'` to a 400 envelope so an unexpected value cannot
|
|
153
|
+
* silently default to `false` (which would suppress
|
|
154
|
+
* `content_hash` on the response without the caller realising).
|
|
155
|
+
*/
|
|
156
|
+
function parseDiscloseFlag(value) {
|
|
157
|
+
if (value === undefined)
|
|
158
|
+
return false;
|
|
159
|
+
if (value === 'true')
|
|
160
|
+
return true;
|
|
161
|
+
if (value === 'false')
|
|
162
|
+
return false;
|
|
163
|
+
return 'invalid';
|
|
164
|
+
}
|
|
165
|
+
function checkManagedContentLength(req, maxBytes) {
|
|
166
|
+
const header = req.headers['content-length'];
|
|
167
|
+
if (typeof header !== 'string') {
|
|
168
|
+
return { status: 411, error: 'Content-Length is required for managed uploads' };
|
|
169
|
+
}
|
|
170
|
+
const value = Number(header);
|
|
171
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
172
|
+
return { status: 411, error: 'Content-Length must be a positive integer' };
|
|
173
|
+
}
|
|
174
|
+
if (value > maxBytes) {
|
|
175
|
+
return { status: 413, error: `request body exceeds ${maxBytes}-byte cap` };
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
function readManagedContentType(req) {
|
|
180
|
+
const ct = req.headers['content-type'];
|
|
181
|
+
if (typeof ct === 'string' && ct.length > 0)
|
|
182
|
+
return ct;
|
|
183
|
+
return 'application/octet-stream';
|
|
184
|
+
}
|
|
185
|
+
function parseMetadataHeader(req) {
|
|
186
|
+
const raw = req.headers[METADATA_HEADER];
|
|
187
|
+
if (raw === undefined)
|
|
188
|
+
return {};
|
|
189
|
+
if (typeof raw !== 'string') {
|
|
190
|
+
throw new InvalidArtifactMetadataError('header X-AtomicMemory-Metadata must be a single header value');
|
|
191
|
+
}
|
|
192
|
+
if (Buffer.byteLength(raw, 'utf8') > METADATA_HEADER_MAX_ENCODED_BYTES) {
|
|
193
|
+
throw new InvalidArtifactMetadataError(`header X-AtomicMemory-Metadata exceeds ${METADATA_HEADER_MAX_ENCODED_BYTES}-byte encoded cap`);
|
|
194
|
+
}
|
|
195
|
+
let decoded;
|
|
196
|
+
try {
|
|
197
|
+
decoded = Buffer.from(raw, 'base64').toString('utf8');
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
throw new InvalidArtifactMetadataError('header X-AtomicMemory-Metadata is not valid base64');
|
|
201
|
+
}
|
|
202
|
+
let parsed;
|
|
203
|
+
try {
|
|
204
|
+
parsed = JSON.parse(decoded);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
throw new InvalidArtifactMetadataError('header X-AtomicMemory-Metadata payload is not valid JSON');
|
|
208
|
+
}
|
|
209
|
+
// The inner validator throws plain `invalid_metadata`-shaped errors;
|
|
210
|
+
// rewrap to preserve the header-mode classification.
|
|
211
|
+
try {
|
|
212
|
+
return validateArtifactMetadata(parsed);
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
if (err instanceof InvalidArtifactMetadataError) {
|
|
216
|
+
throw new InvalidArtifactMetadataError(`header X-AtomicMemory-Metadata: ${err.reason}`);
|
|
217
|
+
}
|
|
218
|
+
throw err;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
function readArtifactId(req) {
|
|
222
|
+
return req.params.id;
|
|
223
|
+
}
|
|
224
|
+
function registerGetArtifactRoute(router, service) {
|
|
225
|
+
router.get('/artifacts/:id', async (req, res) => {
|
|
226
|
+
try {
|
|
227
|
+
const row = await service.getArtifactMetadata(readUserId(req), readArtifactId(req));
|
|
228
|
+
res.json(formatStoredArtifact(row));
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
if (handleStorageError(res, err))
|
|
232
|
+
return;
|
|
233
|
+
handleRouteError(res, 'GET /v1/storage/artifacts/:id', err);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
function registerGetArtifactContentRoute(router, service) {
|
|
238
|
+
router.get('/artifacts/:id/content', async (req, res) => {
|
|
239
|
+
try {
|
|
240
|
+
const { row, body } = await service.getArtifactContent(readUserId(req), readArtifactId(req));
|
|
241
|
+
res.setHeader('Content-Type', row.contentType ?? 'application/octet-stream');
|
|
242
|
+
res.setHeader('Content-Length', body.length.toString());
|
|
243
|
+
res.status(200).end(body);
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
if (handleStorageError(res, err))
|
|
247
|
+
return;
|
|
248
|
+
handleRouteError(res, 'GET /v1/storage/artifacts/:id/content', err);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
function registerHeadArtifactRoute(router, service) {
|
|
253
|
+
router.head('/artifacts/:id', async (req, res) => {
|
|
254
|
+
try {
|
|
255
|
+
const row = await service.getArtifactMetadata(readUserId(req), readArtifactId(req));
|
|
256
|
+
const headers = formatArtifactHeadHeaders(row);
|
|
257
|
+
res.setHeader('Content-Type', headers.contentType);
|
|
258
|
+
res.setHeader('Content-Length', headers.contentLength.toString());
|
|
259
|
+
res.setHeader('X-AtomicMemory-Artifact-Id', headers.artifactId);
|
|
260
|
+
res.setHeader('X-AtomicMemory-Storage-Mode', headers.storageMode);
|
|
261
|
+
res.setHeader('X-AtomicMemory-Storage-Status', headers.storageStatus);
|
|
262
|
+
res.setHeader('X-AtomicMemory-Provider', headers.provider);
|
|
263
|
+
res.status(200).end();
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
if (err instanceof StorageArtifactNotFoundError) {
|
|
267
|
+
res.status(404).end();
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
handleRouteError(res, 'HEAD /v1/storage/artifacts/:id', err);
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
function registerDeleteArtifactRoute(router, service) {
|
|
275
|
+
router.delete('/artifacts/:id', async (req, res) => {
|
|
276
|
+
try {
|
|
277
|
+
if ('force' in req.query) {
|
|
278
|
+
// Any presence of `force` (bare `?force`, `?force=true`,
|
|
279
|
+
// `?force=false`, multi-value) is rejected with a stable
|
|
280
|
+
// typed envelope. Silently coercing to `policy=artifact_only`
|
|
281
|
+
// would mask a caller bug: pre-Step-5 deployments accepted
|
|
282
|
+
// `?force=true` to bypass the reference gate; the new
|
|
283
|
+
// contract requires explicit `policy=with_documents`.
|
|
284
|
+
res.status(400).json({
|
|
285
|
+
error_code: 'force_not_supported',
|
|
286
|
+
error: 'force is not a supported parameter; use policy=with_documents to cascade',
|
|
287
|
+
});
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
const policyRaw = String(req.query.policy ?? 'artifact_only');
|
|
291
|
+
if (policyRaw !== 'artifact_only' && policyRaw !== 'with_documents') {
|
|
292
|
+
res.status(400).json({
|
|
293
|
+
error_code: 'invalid_policy',
|
|
294
|
+
error: "policy must be 'artifact_only' or 'with_documents'",
|
|
295
|
+
});
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
const result = await service.deleteArtifact({
|
|
299
|
+
userId: readUserId(req),
|
|
300
|
+
id: readArtifactId(req),
|
|
301
|
+
policy: policyRaw,
|
|
302
|
+
});
|
|
303
|
+
res.status(200).json({
|
|
304
|
+
artifact_id: result.artifact.id,
|
|
305
|
+
status: result.artifact.status === 'deleted' ? 'deleted' : 'delete_failed',
|
|
306
|
+
...(result.cascadedDocumentIds.length > 0
|
|
307
|
+
? { cascaded_document_ids: result.cascadedDocumentIds }
|
|
308
|
+
: {}),
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
if (handleStorageError(res, err))
|
|
313
|
+
return;
|
|
314
|
+
handleRouteError(res, 'DELETE /v1/storage/artifacts/:id', err);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
function registerVerifyArtifactRoute(router, service) {
|
|
319
|
+
router.post('/artifacts/:id/verify', async (req, res) => {
|
|
320
|
+
try {
|
|
321
|
+
const id = readArtifactId(req);
|
|
322
|
+
const result = await service.verifyArtifact(readUserId(req), id);
|
|
323
|
+
res.status(200).json({
|
|
324
|
+
artifact_id: id,
|
|
325
|
+
kind: result.kind,
|
|
326
|
+
...(result.kind === 'verified'
|
|
327
|
+
? { details: result.details ?? {} }
|
|
328
|
+
: { reason: result.reason }),
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
if (handleStorageError(res, err))
|
|
333
|
+
return;
|
|
334
|
+
handleRouteError(res, 'POST /v1/storage/artifacts/:id/verify', err);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
const USER_ID_HEADER = 'x-atomicmemory-user-id';
|
|
339
|
+
/**
|
|
340
|
+
* Owner scope for every direct-storage call comes from the
|
|
341
|
+
* `X-AtomicMemory-User-Id` request header. The legacy `?user_id=`
|
|
342
|
+
* query and body `user_id` field are explicitly rejected — sending
|
|
343
|
+
* identity in URLs leaks into proxy/CDN/error-tracker logs, and
|
|
344
|
+
* body assertion would silently survive a path migration.
|
|
345
|
+
*
|
|
346
|
+
* The `Authorization: Bearer <CORE_API_KEY>` middleware already ran
|
|
347
|
+
* upstream (`requireBearer`); this function only resolves which user
|
|
348
|
+
* the validated caller is acting on behalf of.
|
|
349
|
+
*/
|
|
350
|
+
function readUserId(req) {
|
|
351
|
+
if (hasLegacyUserId(req)) {
|
|
352
|
+
throw new LegacyUserIdRejection();
|
|
353
|
+
}
|
|
354
|
+
const fromHeader = req.headers[USER_ID_HEADER];
|
|
355
|
+
if (typeof fromHeader === 'string' && fromHeader.length > 0)
|
|
356
|
+
return fromHeader;
|
|
357
|
+
throw new InvalidArtifactMetadataError('X-AtomicMemory-User-Id header is required');
|
|
358
|
+
}
|
|
359
|
+
function hasLegacyUserId(req) {
|
|
360
|
+
if (typeof req.query.user_id === 'string' && req.query.user_id.length > 0) {
|
|
361
|
+
return true;
|
|
362
|
+
}
|
|
363
|
+
if (req.body && typeof req.body === 'object') {
|
|
364
|
+
const candidate = req.body.user_id;
|
|
365
|
+
if (typeof candidate === 'string' && candidate.length > 0)
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upstream AI provider error classification for HTTP routes.
|
|
3
|
+
*
|
|
4
|
+
* Provider SDKs expose slightly different error classes, but they
|
|
5
|
+
* consistently carry an HTTP-ish `status` plus message text. This
|
|
6
|
+
* module converts those raw SDK failures into a small sanitized
|
|
7
|
+
* envelope for route handlers without coupling routes to one vendor.
|
|
8
|
+
*/
|
|
9
|
+
export interface UpstreamProviderFailure {
|
|
10
|
+
status: number;
|
|
11
|
+
errorCode: string;
|
|
12
|
+
error: string;
|
|
13
|
+
message: string;
|
|
14
|
+
providerStatus: number;
|
|
15
|
+
retryable: boolean;
|
|
16
|
+
details: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function classifyUpstreamProviderFailure(err: unknown): UpstreamProviderFailure | null;
|
|
19
|
+
export declare function routeErrorMessage(err: unknown): string;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upstream AI provider error classification for HTTP routes.
|
|
3
|
+
*
|
|
4
|
+
* Provider SDKs expose slightly different error classes, but they
|
|
5
|
+
* consistently carry an HTTP-ish `status` plus message text. This
|
|
6
|
+
* module converts those raw SDK failures into a small sanitized
|
|
7
|
+
* envelope for route handlers without coupling routes to one vendor.
|
|
8
|
+
*/
|
|
9
|
+
export function classifyUpstreamProviderFailure(err) {
|
|
10
|
+
const providerStatus = readProviderStatus(err);
|
|
11
|
+
if (providerStatus === null || !looksLikeProviderError(err, providerStatus))
|
|
12
|
+
return null;
|
|
13
|
+
const details = sanitizeProviderDetails(errorMessage(err));
|
|
14
|
+
if (providerStatus === 429 && isQuotaFailure(details)) {
|
|
15
|
+
return providerFailure('upstream_provider_quota_exceeded', 503, providerStatus, false, details);
|
|
16
|
+
}
|
|
17
|
+
if (providerStatus === 429) {
|
|
18
|
+
return providerFailure('upstream_provider_rate_limited', 503, providerStatus, true, details);
|
|
19
|
+
}
|
|
20
|
+
if (providerStatus === 401 || providerStatus === 403) {
|
|
21
|
+
return providerFailure('upstream_provider_auth_failed', 502, providerStatus, false, details);
|
|
22
|
+
}
|
|
23
|
+
return providerFailure('upstream_provider_error', providerStatus >= 500 ? 503 : 502, providerStatus, providerStatus >= 500, details);
|
|
24
|
+
}
|
|
25
|
+
export function routeErrorMessage(err) {
|
|
26
|
+
return err instanceof Error ? err.message : String(err ?? 'Internal server error');
|
|
27
|
+
}
|
|
28
|
+
function providerFailure(errorCode, status, providerStatus, retryable, details) {
|
|
29
|
+
const messages = providerFailureMessages(errorCode);
|
|
30
|
+
return { status, errorCode, providerStatus, retryable, details, ...messages };
|
|
31
|
+
}
|
|
32
|
+
function providerFailureMessages(errorCode) {
|
|
33
|
+
if (errorCode === 'upstream_provider_quota_exceeded')
|
|
34
|
+
return quotaMessage();
|
|
35
|
+
if (errorCode === 'upstream_provider_rate_limited')
|
|
36
|
+
return rateLimitMessage();
|
|
37
|
+
if (errorCode === 'upstream_provider_auth_failed')
|
|
38
|
+
return authFailureMessage();
|
|
39
|
+
return {
|
|
40
|
+
error: 'Upstream provider request failed',
|
|
41
|
+
message: 'The configured AI provider rejected the request. Check provider configuration and provider status.',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function quotaMessage() {
|
|
45
|
+
return {
|
|
46
|
+
error: 'Upstream provider quota exceeded',
|
|
47
|
+
message: 'The configured AI provider rejected the request because its account quota or billing is unavailable.',
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function rateLimitMessage() {
|
|
51
|
+
return {
|
|
52
|
+
error: 'Upstream provider rate limited',
|
|
53
|
+
message: 'The configured AI provider rate-limited the request. Retry after the provider limit resets.',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function authFailureMessage() {
|
|
57
|
+
return {
|
|
58
|
+
error: 'Upstream provider authentication failed',
|
|
59
|
+
message: 'The configured AI provider rejected the request credentials. Check the provider API key and account access.',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function readProviderStatus(err) {
|
|
63
|
+
if (!err || typeof err !== 'object' || !('status' in err))
|
|
64
|
+
return null;
|
|
65
|
+
const status = err.status;
|
|
66
|
+
return typeof status === 'number' && Number.isInteger(status) ? status : null;
|
|
67
|
+
}
|
|
68
|
+
function looksLikeProviderError(err, status) {
|
|
69
|
+
const message = routeErrorMessage(err).toLowerCase();
|
|
70
|
+
if (status === 401 || status === 403 || status === 429 || status >= 500) {
|
|
71
|
+
return hasProviderErrorShape(err) || hasProviderKeyword(message);
|
|
72
|
+
}
|
|
73
|
+
return hasProviderErrorShape(err) && status >= 400;
|
|
74
|
+
}
|
|
75
|
+
function hasProviderErrorShape(err) {
|
|
76
|
+
if (!err || typeof err !== 'object')
|
|
77
|
+
return false;
|
|
78
|
+
const candidate = err;
|
|
79
|
+
return 'headers' in candidate || 'request_id' in candidate || 'code' in candidate || 'type' in candidate;
|
|
80
|
+
}
|
|
81
|
+
function hasProviderKeyword(message) {
|
|
82
|
+
return /\b(openai|anthropic|ollama|voyage|google|gemini|groq|provider|llm|embedding|embed|api key|quota|billing|rate limit)\b/.test(message);
|
|
83
|
+
}
|
|
84
|
+
function isQuotaFailure(details) {
|
|
85
|
+
return /\b(quota|billing|insufficient_quota|credits?)\b/i.test(details);
|
|
86
|
+
}
|
|
87
|
+
function errorMessage(err) {
|
|
88
|
+
return routeErrorMessage(err);
|
|
89
|
+
}
|
|
90
|
+
function sanitizeProviderDetails(message) {
|
|
91
|
+
return message
|
|
92
|
+
.replace(/sk-[A-Za-z0-9_-]{8,}/g, '[REDACTED_API_KEY]')
|
|
93
|
+
.replace(/Bearer\s+[A-Za-z0-9._~+/=-]{8,}/gi, 'Bearer [REDACTED_TOKEN]')
|
|
94
|
+
.slice(0, 500);
|
|
95
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Zod schemas for the 5 /v1/agents/* routes.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the inline parsers at `src/routes/agents.ts:86-109`
|
|
5
|
+
* byte-for-byte:
|
|
6
|
+
* - `requireString` accepts either a string OR an array (takes
|
|
7
|
+
* first element via `String(value[0])`) — this handles Express
|
|
8
|
+
* query strings with duplicate params. Throws
|
|
9
|
+
* `"${field} is required"` on missing/non-accepted input.
|
|
10
|
+
* - `requireTrustLevel` distinguishes type error ("trust_level must
|
|
11
|
+
* be a number between 0.0 and 1.0") from range error
|
|
12
|
+
* ("trust_level must be between 0.0 and 1.0").
|
|
13
|
+
* - `requireResolution` accepts the three enum variants; anything
|
|
14
|
+
* else throws the full list-of-valid-values message.
|
|
15
|
+
*
|
|
16
|
+
* Every error message matches the pre-refactor text exactly so HTTP
|
|
17
|
+
* clients that regex on `{ error }` continue to match.
|
|
18
|
+
*/
|
|
19
|
+
import { z } from './zod-setup.js';
|
|
20
|
+
export declare const SetTrustBodySchema: z.ZodPipe<z.ZodObject<{
|
|
21
|
+
agent_id: z.ZodPipe<z.ZodPipe<z.ZodUnknown, z.ZodTransform<string | undefined, unknown>> & z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>, z.ZodTransform<string, string>>;
|
|
22
|
+
user_id: z.ZodPipe<z.ZodPipe<z.ZodUnknown, z.ZodTransform<string | undefined, unknown>> & z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>, z.ZodTransform<string, string>>;
|
|
23
|
+
trust_level: z.ZodPipe<z.ZodUnknown, z.ZodTransform<number, unknown>>;
|
|
24
|
+
display_name: z.ZodPipe<z.ZodUnknown, z.ZodTransform<string | undefined, unknown>>;
|
|
25
|
+
}, z.core.$strip>, z.ZodTransform<{
|
|
26
|
+
agentId: string;
|
|
27
|
+
userId: string;
|
|
28
|
+
trustLevel: number;
|
|
29
|
+
displayName: string | undefined;
|
|
30
|
+
}, {
|
|
31
|
+
agent_id: string;
|
|
32
|
+
user_id: string;
|
|
33
|
+
trust_level: number;
|
|
34
|
+
display_name: string | undefined;
|
|
35
|
+
}>>;
|
|
36
|
+
export type SetTrustBody = z.infer<typeof SetTrustBodySchema>;
|
|
37
|
+
export declare const GetTrustQuerySchema: z.ZodPipe<z.ZodObject<{
|
|
38
|
+
agent_id: z.ZodPipe<z.ZodPipe<z.ZodUnknown, z.ZodTransform<string | undefined, unknown>> & z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>, z.ZodTransform<string, string>>;
|
|
39
|
+
user_id: z.ZodPipe<z.ZodPipe<z.ZodUnknown, z.ZodTransform<string | undefined, unknown>> & z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>, z.ZodTransform<string, string>>;
|
|
40
|
+
}, z.core.$strip>, z.ZodTransform<{
|
|
41
|
+
agentId: string;
|
|
42
|
+
userId: string;
|
|
43
|
+
}, {
|
|
44
|
+
agent_id: string;
|
|
45
|
+
user_id: string;
|
|
46
|
+
}>>;
|
|
47
|
+
export type GetTrustQuery = z.infer<typeof GetTrustQuerySchema>;
|
|
48
|
+
export declare const UserIdFromQuerySchema: z.ZodPipe<z.ZodObject<{
|
|
49
|
+
user_id: z.ZodPipe<z.ZodPipe<z.ZodUnknown, z.ZodTransform<string | undefined, unknown>> & z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>, z.ZodTransform<string, string>>;
|
|
50
|
+
}, z.core.$strip>, z.ZodTransform<{
|
|
51
|
+
userId: string;
|
|
52
|
+
}, {
|
|
53
|
+
user_id: string;
|
|
54
|
+
}>>;
|
|
55
|
+
export type UserIdFromQuery = z.infer<typeof UserIdFromQuerySchema>;
|
|
56
|
+
export declare const UserIdFromBodySchema: z.ZodPipe<z.ZodObject<{
|
|
57
|
+
user_id: z.ZodPipe<z.ZodPipe<z.ZodUnknown, z.ZodTransform<string | undefined, unknown>> & z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>, z.ZodTransform<string, string>>;
|
|
58
|
+
}, z.core.$strip>, z.ZodTransform<{
|
|
59
|
+
userId: string;
|
|
60
|
+
}, {
|
|
61
|
+
user_id: string;
|
|
62
|
+
}>>;
|
|
63
|
+
export type UserIdFromBody = z.infer<typeof UserIdFromBodySchema>;
|
|
64
|
+
export declare const ConflictIdParamSchema: z.ZodPipe<z.ZodObject<{
|
|
65
|
+
id: z.ZodString;
|
|
66
|
+
}, z.core.$strip>, z.ZodTransform<{
|
|
67
|
+
id: string;
|
|
68
|
+
}, {
|
|
69
|
+
id: string;
|
|
70
|
+
}>>;
|
|
71
|
+
export type ConflictIdParam = z.infer<typeof ConflictIdParamSchema>;
|
|
72
|
+
export declare const ResolveConflictBodySchema: z.ZodPipe<z.ZodObject<{
|
|
73
|
+
resolution: z.ZodPipe<z.ZodUnknown & z.ZodType<"resolved_new" | "resolved_existing" | "resolved_both", unknown, z.core.$ZodTypeInternals<"resolved_new" | "resolved_existing" | "resolved_both", unknown>>, z.ZodTransform<"resolved_new" | "resolved_existing" | "resolved_both", "resolved_new" | "resolved_existing" | "resolved_both">>;
|
|
74
|
+
}, z.core.$strip>, z.ZodTransform<{
|
|
75
|
+
resolution: "resolved_new" | "resolved_existing" | "resolved_both";
|
|
76
|
+
}, {
|
|
77
|
+
resolution: "resolved_new" | "resolved_existing" | "resolved_both";
|
|
78
|
+
}>>;
|
|
79
|
+
export type ResolveConflictBody = z.infer<typeof ResolveConflictBodySchema>;
|