@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,542 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Zod schemas for every /v1/memories/* route.
|
|
3
|
+
*
|
|
4
|
+
* Each request body schema authors fields in **snake_case** (the wire
|
|
5
|
+
* format) and `.transform()`s to a camelCase output consumed by
|
|
6
|
+
* handlers. The output shape of each schema was chosen to drop-in
|
|
7
|
+
* replace the value previously returned by `parseIngestBody` /
|
|
8
|
+
* `parseSearchBody` etc. so handler bodies don't change.
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ Behavior-preservation invariants worth noting:
|
|
11
|
+
* - `requireBodyString` rejects empty string AND non-string with
|
|
12
|
+
* the same 400 message. `requiredStringBody(label)` below emits
|
|
13
|
+
* the exact "${label} (string) is required" text for every
|
|
14
|
+
* failure mode (missing, null, wrong type, empty).
|
|
15
|
+
* - `parseOptionalWorkspaceContext` / `parseOptionalAgentScope`
|
|
16
|
+
* NEVER 400 on invalid shapes — they silently drop to undefined.
|
|
17
|
+
* Composition here uses the `.catch(undefined)` primitives from
|
|
18
|
+
* `./common`.
|
|
19
|
+
* - `parseOptionalIsoTimestamp` treats `''` and `null` as absent,
|
|
20
|
+
* rejects other invalid strings. `IsoTimestamp` in `./common`
|
|
21
|
+
* preserves that with a preprocess step.
|
|
22
|
+
* - `retrieval_mode` absence is silent (undefined), invalid values
|
|
23
|
+
* throw the exact message from memories.ts:553-555.
|
|
24
|
+
* - `token_budget` must be a finite number in [100, 50000], floored
|
|
25
|
+
* on success. Matches memories.ts:560-568.
|
|
26
|
+
* - `limit` on POST /search / /search/fast bodies: non-number yields
|
|
27
|
+
* undefined (not an error); number is clamped to
|
|
28
|
+
* [1, MAX_SEARCH_LIMIT=100] and floored. Matches memories.ts:629-632.
|
|
29
|
+
* - `conversation` max length = 100_000 chars. Over the limit
|
|
30
|
+
* throws 'conversation exceeds max length of 100000 characters'.
|
|
31
|
+
*
|
|
32
|
+
* Source: `src/routes/memories.ts:515-647` (the inline parsers this
|
|
33
|
+
* file replaces).
|
|
34
|
+
*/
|
|
35
|
+
import { z } from './zod-setup.js';
|
|
36
|
+
import { IsoTimestamp, AgentScopeSchema, WorkspaceIdField, AgentIdField, VisibilityField, OptionalBodyString, requiredStringBody, } from './common.js';
|
|
37
|
+
import { RESERVED_METADATA_KEYS } from '../db/repository-types.js';
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Constants mirroring memories.ts limits
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
const MAX_CONVERSATION_LENGTH = 100_000;
|
|
42
|
+
const MAX_METADATA_SERIALIZED_BYTES = 32 * 1024;
|
|
43
|
+
const MAX_SEARCH_LIMIT = 100;
|
|
44
|
+
const MAX_TOKEN_BUDGET = 50_000;
|
|
45
|
+
const MIN_TOKEN_BUDGET = 100;
|
|
46
|
+
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Reusable body-level field schemas
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// `OptionalBodyString` and `requiredStringBody` are imported from
|
|
51
|
+
// `./common.js` so /v1/documents/* and other future resource schemas can
|
|
52
|
+
// reuse the same wire-contract behavior without copying the helpers.
|
|
53
|
+
/** Boolean field that silently coerces non-boolean inputs to undefined. */
|
|
54
|
+
const OptionalBooleanField = (description) => z
|
|
55
|
+
.unknown()
|
|
56
|
+
.transform(v => (typeof v === 'boolean' ? v : undefined))
|
|
57
|
+
.openapi({ type: 'boolean', ...(description ? { description } : {}) });
|
|
58
|
+
/**
|
|
59
|
+
* Build a schema that produces `"${label} (string[]) is required"` for
|
|
60
|
+
* every failure mode that the old array guard threw on. Matches the
|
|
61
|
+
* memory_ids check at memories.ts:213-215.
|
|
62
|
+
*/
|
|
63
|
+
function requiredStringArrayBody(label) {
|
|
64
|
+
const message = `${label} (string[]) is required`;
|
|
65
|
+
return z
|
|
66
|
+
.unknown()
|
|
67
|
+
.refine((v) => Array.isArray(v) && v.every(x => typeof x === 'string'), { message })
|
|
68
|
+
.transform(v => v)
|
|
69
|
+
.openapi({
|
|
70
|
+
type: 'array',
|
|
71
|
+
items: { type: 'string' },
|
|
72
|
+
description: `Required. ${label}.`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** POST /search and /search/fast accept body.limit as a number only; other types → undefined. */
|
|
76
|
+
const SearchBodyLimit = z
|
|
77
|
+
.preprocess(v => (typeof v === 'number' && Number.isFinite(v) ? v : undefined), z.number().optional())
|
|
78
|
+
.transform(n => typeof n === 'number'
|
|
79
|
+
? Math.max(1, Math.min(MAX_SEARCH_LIMIT, Math.floor(n)))
|
|
80
|
+
: undefined)
|
|
81
|
+
.openapi({ type: 'integer', minimum: 1, maximum: MAX_SEARCH_LIMIT });
|
|
82
|
+
/** token_budget: finite number in [100, 50000], floored. Throws on invalid. */
|
|
83
|
+
const TokenBudgetSchema = optionalFiniteNumber('token_budget')
|
|
84
|
+
.refine(v => v === undefined ||
|
|
85
|
+
(typeof v === 'number' &&
|
|
86
|
+
v >= MIN_TOKEN_BUDGET &&
|
|
87
|
+
v <= MAX_TOKEN_BUDGET), {
|
|
88
|
+
message: `token_budget must be between ${MIN_TOKEN_BUDGET} and ${MAX_TOKEN_BUDGET}`,
|
|
89
|
+
})
|
|
90
|
+
.transform(v => (typeof v === 'number' ? Math.floor(v) : undefined))
|
|
91
|
+
.openapi({ type: 'integer', minimum: MIN_TOKEN_BUDGET, maximum: MAX_TOKEN_BUDGET });
|
|
92
|
+
/** threshold: normalized relevance floor in [0, 1]. Throws on invalid. */
|
|
93
|
+
const SearchThresholdSchema = optionalFiniteNumber('threshold')
|
|
94
|
+
.refine(v => v === undefined || (v >= 0 && v <= 1), { message: 'threshold must be between 0 and 1' })
|
|
95
|
+
.transform(v => (typeof v === 'number' ? v : undefined))
|
|
96
|
+
.openapi({
|
|
97
|
+
type: 'number',
|
|
98
|
+
minimum: 0,
|
|
99
|
+
maximum: 1,
|
|
100
|
+
description: 'Optional normalized relevance threshold. Results below this semantic relevance floor are excluded before injection packaging.',
|
|
101
|
+
});
|
|
102
|
+
function optionalFiniteNumber(label) {
|
|
103
|
+
return z
|
|
104
|
+
.preprocess(v => (v === undefined || v === null ? undefined : v), z.unknown().optional())
|
|
105
|
+
.refine((v) => v === undefined ||
|
|
106
|
+
(typeof v === 'number' && Number.isFinite(v)), { message: `${label} must be a finite number` });
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* retrieval_mode: string enum or undefined. Absent/null → undefined;
|
|
110
|
+
* wrong type → throw 'retrieval_mode must be a string'; wrong enum
|
|
111
|
+
* value → throw the full valid-list message. Matches memories.ts:551-557.
|
|
112
|
+
*/
|
|
113
|
+
const RetrievalModeField = z
|
|
114
|
+
.preprocess(v => (v === undefined || v === null ? undefined : v), z.unknown().optional())
|
|
115
|
+
.superRefine((v, ctx) => {
|
|
116
|
+
if (v === undefined)
|
|
117
|
+
return;
|
|
118
|
+
if (typeof v !== 'string') {
|
|
119
|
+
ctx.addIssue({ code: 'custom', message: 'retrieval_mode must be a string' });
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (!['flat', 'tiered', 'abstract-aware'].includes(v)) {
|
|
123
|
+
ctx.addIssue({
|
|
124
|
+
code: 'custom',
|
|
125
|
+
message: `retrieval_mode must be one of: ${['flat', 'tiered', 'abstract-aware'].join(', ')}`,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
})
|
|
129
|
+
.transform(v => (v === undefined ? undefined : v))
|
|
130
|
+
.openapi({
|
|
131
|
+
type: 'string',
|
|
132
|
+
enum: ['flat', 'tiered', 'abstract-aware'],
|
|
133
|
+
});
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// Per-request config override
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
/**
|
|
138
|
+
* Per-request overlay on the startup RuntimeConfig. Applied as a shallow
|
|
139
|
+
* merge (`{ ...startup, ...override }`) onto the effective request-scope
|
|
140
|
+
* config.
|
|
141
|
+
*
|
|
142
|
+
* **Shape is permissive by design.** The schema accepts any object whose
|
|
143
|
+
* values are primitives (boolean, number, string, null) — no
|
|
144
|
+
* enumerated field list. This is deliberate: enumerating fields would
|
|
145
|
+
* couple every new overlay-eligible RuntimeConfig field to a core
|
|
146
|
+
* release, which defeats the purpose of a per-request config mechanism.
|
|
147
|
+
*
|
|
148
|
+
* **Unknown-key handling is soft**, not a 400:
|
|
149
|
+
* - If an override key doesn't match a `RuntimeConfig` field at
|
|
150
|
+
* request-handling time, the merge is still performed (the key rides
|
|
151
|
+
* along on the effective config object), but the route handler emits
|
|
152
|
+
* a `X-Atomicmem-Unknown-Override-Keys` response header listing the
|
|
153
|
+
* unmatched keys and logs a warning. This catches typos without
|
|
154
|
+
* rejecting a request that would otherwise be valid once the field
|
|
155
|
+
* lands in a future release.
|
|
156
|
+
* - If you want a typed, IDE-autocompleted experience, import
|
|
157
|
+
* `RuntimeConfig` from `src/config.ts` and type your override as
|
|
158
|
+
* `Partial<RuntimeConfig>` on the caller side.
|
|
159
|
+
*
|
|
160
|
+
* **`config_override` absent →** zero-cost path, no headers emitted,
|
|
161
|
+
* startup config used as-is.
|
|
162
|
+
*/
|
|
163
|
+
export const ConfigOverrideSchema = z
|
|
164
|
+
.record(z.string(), z.union([z.boolean(), z.number(), z.string(), z.null()]))
|
|
165
|
+
.openapi({
|
|
166
|
+
description: 'Optional per-request overlay on RuntimeConfig. Keys correspond to RuntimeConfig field names; values must be primitives (boolean / number / string / null). Unknown keys are accepted but surfaced via the X-Atomicmem-Unknown-Override-Keys response header and a server-side warning log — they do not cause a 400. Scope: just this request — no server mutation.',
|
|
167
|
+
});
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
// Ingest
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
export const IngestBodySchema = z
|
|
172
|
+
.object({
|
|
173
|
+
user_id: requiredStringBody('user_id'),
|
|
174
|
+
conversation: requiredStringBody('conversation').refine(s => s.length <= MAX_CONVERSATION_LENGTH, { message: `conversation exceeds max length of ${MAX_CONVERSATION_LENGTH} characters` }),
|
|
175
|
+
source_site: requiredStringBody('source_site'),
|
|
176
|
+
source_url: OptionalBodyString,
|
|
177
|
+
workspace_id: WorkspaceIdField,
|
|
178
|
+
agent_id: AgentIdField,
|
|
179
|
+
visibility: VisibilityField,
|
|
180
|
+
/** Only POST /ingest/quick reads this — safely ignored elsewhere. */
|
|
181
|
+
skip_extraction: OptionalBooleanField(),
|
|
182
|
+
config_override: ConfigOverrideSchema.optional(),
|
|
183
|
+
/**
|
|
184
|
+
* Caller-supplied metadata, persisted alongside the memory. Only
|
|
185
|
+
* honored on POST /v1/memories/ingest/quick with skip_extraction=true
|
|
186
|
+
* and no workspace context — rejected with 400 on every other branch.
|
|
187
|
+
* Reserved keys (RESERVED_METADATA_KEYS in repository-types) are
|
|
188
|
+
* rejected. Max 32 KB UTF-8 serialized.
|
|
189
|
+
*/
|
|
190
|
+
metadata: z
|
|
191
|
+
.record(z.string(), z.unknown())
|
|
192
|
+
.optional()
|
|
193
|
+
.openapi({
|
|
194
|
+
description: 'Caller-supplied metadata, persisted alongside the memory. ' +
|
|
195
|
+
'Honored ONLY on /v1/memories/ingest/quick with skip_extraction=true ' +
|
|
196
|
+
'and no workspace context — rejected with 400 on every other branch. ' +
|
|
197
|
+
'Reserved keys (RESERVED_METADATA_KEYS in repository-types) are rejected. ' +
|
|
198
|
+
'Max 32 KB UTF-8 serialized.',
|
|
199
|
+
}),
|
|
200
|
+
})
|
|
201
|
+
.refine(b => !b.metadata ||
|
|
202
|
+
Buffer.byteLength(JSON.stringify(b.metadata), 'utf8') <=
|
|
203
|
+
MAX_METADATA_SERIALIZED_BYTES, {
|
|
204
|
+
message: `metadata exceeds max serialized size of ${MAX_METADATA_SERIALIZED_BYTES} bytes (utf-8)`,
|
|
205
|
+
})
|
|
206
|
+
.superRefine((b, ctx) => {
|
|
207
|
+
if (!b.metadata)
|
|
208
|
+
return;
|
|
209
|
+
const reserved = Object.keys(b.metadata).filter(k => RESERVED_METADATA_KEYS.has(k));
|
|
210
|
+
if (reserved.length > 0) {
|
|
211
|
+
ctx.addIssue({
|
|
212
|
+
code: 'custom',
|
|
213
|
+
message: `metadata contains reserved key(s) [${reserved.join(', ')}] — ` +
|
|
214
|
+
`these are core-internal and cannot be set by callers. ` +
|
|
215
|
+
`See RESERVED_METADATA_KEYS in repository-types.`,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
})
|
|
219
|
+
.transform(b => ({
|
|
220
|
+
userId: b.user_id,
|
|
221
|
+
conversation: b.conversation,
|
|
222
|
+
sourceSite: b.source_site,
|
|
223
|
+
sourceUrl: b.source_url ?? '',
|
|
224
|
+
workspace: buildWorkspaceContext(b.workspace_id, b.agent_id, b.visibility),
|
|
225
|
+
skipExtraction: b.skip_extraction === true,
|
|
226
|
+
configOverride: b.config_override,
|
|
227
|
+
metadata: b.metadata,
|
|
228
|
+
}))
|
|
229
|
+
.openapi({
|
|
230
|
+
description: 'Ingest a conversation transcript. User-scoped unless workspace_id + agent_id are both provided.',
|
|
231
|
+
});
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
// Search
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
export const SearchBodySchema = z
|
|
236
|
+
.object({
|
|
237
|
+
user_id: requiredStringBody('user_id'),
|
|
238
|
+
query: requiredStringBody('query'),
|
|
239
|
+
// source_site / namespace_scope intentionally preserve empty
|
|
240
|
+
// string — optionalBodyString() did not collapse '' to undefined.
|
|
241
|
+
source_site: OptionalBodyString,
|
|
242
|
+
limit: SearchBodyLimit,
|
|
243
|
+
as_of: IsoTimestamp,
|
|
244
|
+
retrieval_mode: RetrievalModeField,
|
|
245
|
+
token_budget: TokenBudgetSchema,
|
|
246
|
+
threshold: SearchThresholdSchema,
|
|
247
|
+
namespace_scope: OptionalBodyString,
|
|
248
|
+
skip_repair: OptionalBooleanField(),
|
|
249
|
+
workspace_id: WorkspaceIdField,
|
|
250
|
+
agent_id: AgentIdField,
|
|
251
|
+
visibility: VisibilityField,
|
|
252
|
+
agent_scope: AgentScopeSchema,
|
|
253
|
+
config_override: ConfigOverrideSchema.optional(),
|
|
254
|
+
})
|
|
255
|
+
.transform(b => ({
|
|
256
|
+
userId: b.user_id,
|
|
257
|
+
query: b.query,
|
|
258
|
+
sourceSite: b.source_site,
|
|
259
|
+
limit: b.limit,
|
|
260
|
+
asOf: b.as_of,
|
|
261
|
+
retrievalMode: b.retrieval_mode,
|
|
262
|
+
tokenBudget: b.token_budget,
|
|
263
|
+
relevanceThreshold: b.threshold,
|
|
264
|
+
namespaceScope: b.namespace_scope,
|
|
265
|
+
skipRepair: b.skip_repair === true,
|
|
266
|
+
workspace: buildWorkspaceContext(b.workspace_id, b.agent_id, b.visibility),
|
|
267
|
+
agentScope: b.agent_scope,
|
|
268
|
+
configOverride: b.config_override,
|
|
269
|
+
}))
|
|
270
|
+
.openapi({
|
|
271
|
+
description: 'Search memories. User-scoped unless workspace_id + agent_id are both provided.',
|
|
272
|
+
});
|
|
273
|
+
// ---------------------------------------------------------------------------
|
|
274
|
+
// Expand
|
|
275
|
+
// ---------------------------------------------------------------------------
|
|
276
|
+
export const ExpandBodySchema = z
|
|
277
|
+
.object({
|
|
278
|
+
user_id: requiredStringBody('user_id'),
|
|
279
|
+
memory_ids: requiredStringArrayBody('memory_ids'),
|
|
280
|
+
workspace_id: WorkspaceIdField,
|
|
281
|
+
agent_id: AgentIdField,
|
|
282
|
+
visibility: VisibilityField,
|
|
283
|
+
})
|
|
284
|
+
.transform(b => ({
|
|
285
|
+
userId: b.user_id,
|
|
286
|
+
memoryIds: b.memory_ids,
|
|
287
|
+
workspace: buildWorkspaceContext(b.workspace_id, b.agent_id, b.visibility),
|
|
288
|
+
}))
|
|
289
|
+
.openapi({
|
|
290
|
+
description: 'Expand a list of memory IDs into full objects.',
|
|
291
|
+
});
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
// Verify (H5 — Sprint 3 v1.7)
|
|
294
|
+
// ---------------------------------------------------------------------------
|
|
295
|
+
export const VerifyBodySchema = z
|
|
296
|
+
.object({
|
|
297
|
+
question: requiredStringBody('question'),
|
|
298
|
+
context: requiredStringBody('context'),
|
|
299
|
+
candidate_answer: requiredStringBody('candidate_answer'),
|
|
300
|
+
})
|
|
301
|
+
.transform(b => ({
|
|
302
|
+
question: b.question,
|
|
303
|
+
context: b.context,
|
|
304
|
+
candidateAnswer: b.candidate_answer,
|
|
305
|
+
}))
|
|
306
|
+
.openapi({
|
|
307
|
+
description: 'Re-ground a candidate answer against retrieved context. Returns the original answer if all specifics are grounded, or a rewritten answer if not.',
|
|
308
|
+
});
|
|
309
|
+
// ---------------------------------------------------------------------------
|
|
310
|
+
// Admin routes (consolidate / decay / cap / reset-source / reconcile)
|
|
311
|
+
// ---------------------------------------------------------------------------
|
|
312
|
+
export const ConsolidateBodySchema = z
|
|
313
|
+
.object({
|
|
314
|
+
user_id: requiredStringBody('user_id'),
|
|
315
|
+
execute: OptionalBooleanField(),
|
|
316
|
+
})
|
|
317
|
+
.transform(b => ({ userId: b.user_id, execute: b.execute === true }));
|
|
318
|
+
export const DecayBodySchema = z
|
|
319
|
+
.object({
|
|
320
|
+
user_id: requiredStringBody('user_id'),
|
|
321
|
+
/** Defaults to true — false means actually archive. */
|
|
322
|
+
dry_run: OptionalBooleanField(),
|
|
323
|
+
})
|
|
324
|
+
.transform(b => ({ userId: b.user_id, dryRun: b.dry_run !== false }));
|
|
325
|
+
export const ReconcileBodySchema = z
|
|
326
|
+
.object({
|
|
327
|
+
// user_id is genuinely optional on this route — empty string
|
|
328
|
+
// behaves the same as absent (falls back to reconcileDeferredAll).
|
|
329
|
+
user_id: OptionalBodyString,
|
|
330
|
+
})
|
|
331
|
+
.transform(b => ({
|
|
332
|
+
userId: typeof b.user_id === 'string' && b.user_id.length > 0 ? b.user_id : undefined,
|
|
333
|
+
}));
|
|
334
|
+
export const ResetSourceBodySchema = z
|
|
335
|
+
.object({
|
|
336
|
+
user_id: requiredStringBody('user_id'),
|
|
337
|
+
source_site: requiredStringBody('source_site'),
|
|
338
|
+
})
|
|
339
|
+
.transform(b => ({ userId: b.user_id, sourceSite: b.source_site }));
|
|
340
|
+
// ---------------------------------------------------------------------------
|
|
341
|
+
// Lessons
|
|
342
|
+
// ---------------------------------------------------------------------------
|
|
343
|
+
export const LessonReportBodySchema = z
|
|
344
|
+
.object({
|
|
345
|
+
user_id: requiredStringBody('user_id'),
|
|
346
|
+
pattern: requiredStringBody('pattern'),
|
|
347
|
+
source_memory_ids: z
|
|
348
|
+
.unknown()
|
|
349
|
+
.transform(v => Array.isArray(v) && v.every((x) => typeof x === 'string')
|
|
350
|
+
? v
|
|
351
|
+
: [])
|
|
352
|
+
.openapi({ type: 'array', items: { type: 'string' } }),
|
|
353
|
+
severity: z.unknown().optional(),
|
|
354
|
+
})
|
|
355
|
+
.transform(b => ({
|
|
356
|
+
userId: b.user_id,
|
|
357
|
+
pattern: b.pattern,
|
|
358
|
+
sourceMemoryIds: Array.isArray(b.source_memory_ids) ? b.source_memory_ids : [],
|
|
359
|
+
severity: b.severity,
|
|
360
|
+
}));
|
|
361
|
+
// ---------------------------------------------------------------------------
|
|
362
|
+
// Queries
|
|
363
|
+
// ---------------------------------------------------------------------------
|
|
364
|
+
/** requireQueryString: truthy + typeof string. Matches memories.ts:580-583. */
|
|
365
|
+
const RequiredQueryString = z.string().min(1);
|
|
366
|
+
export const UserIdQuerySchema = z
|
|
367
|
+
.object({ user_id: RequiredQueryString })
|
|
368
|
+
.transform(q => ({ userId: q.user_id }));
|
|
369
|
+
/** Auto-converts limit to number with default; matches parseUserIdAndLimit. */
|
|
370
|
+
export const UserIdLimitQuerySchema = z
|
|
371
|
+
.object({
|
|
372
|
+
user_id: RequiredQueryString,
|
|
373
|
+
limit: z.string().optional(),
|
|
374
|
+
})
|
|
375
|
+
.transform(q => ({
|
|
376
|
+
userId: q.user_id,
|
|
377
|
+
limit: parseIntegerLimit(q.limit, 20),
|
|
378
|
+
}));
|
|
379
|
+
export const ListQuerySchema = z
|
|
380
|
+
.object({
|
|
381
|
+
user_id: RequiredQueryString,
|
|
382
|
+
limit: z.string().optional(),
|
|
383
|
+
offset: z.string().optional(),
|
|
384
|
+
workspace_id: OptionalQueryField(),
|
|
385
|
+
agent_id: OptionalUuidQueryField('agent_id'),
|
|
386
|
+
source_site: OptionalQueryField(),
|
|
387
|
+
episode_id: OptionalUuidQueryField('episode_id'),
|
|
388
|
+
})
|
|
389
|
+
.transform(q => ({
|
|
390
|
+
userId: q.user_id,
|
|
391
|
+
limit: parseIntegerLimit(q.limit, 20),
|
|
392
|
+
offset: parseIntegerLimit(q.offset, 0),
|
|
393
|
+
workspaceId: q.workspace_id,
|
|
394
|
+
agentId: q.agent_id,
|
|
395
|
+
sourceSite: q.source_site,
|
|
396
|
+
episodeId: q.episode_id,
|
|
397
|
+
}))
|
|
398
|
+
.refine(q => !(q.workspaceId && !q.agentId), {
|
|
399
|
+
message: 'agent_id is required for workspace queries',
|
|
400
|
+
});
|
|
401
|
+
/** Used by GET /:id and DELETE /:id. Same workspace-requires-agent rule. */
|
|
402
|
+
export const MemoryByIdQuerySchema = z
|
|
403
|
+
.object({
|
|
404
|
+
user_id: RequiredQueryString,
|
|
405
|
+
workspace_id: OptionalQueryField(),
|
|
406
|
+
agent_id: OptionalUuidQueryField('agent_id'),
|
|
407
|
+
})
|
|
408
|
+
.transform(q => ({
|
|
409
|
+
userId: q.user_id,
|
|
410
|
+
workspaceId: q.workspace_id,
|
|
411
|
+
agentId: q.agent_id,
|
|
412
|
+
}))
|
|
413
|
+
.refine(q => !(q.workspaceId && !q.agentId), {
|
|
414
|
+
message: 'agent_id is required for workspace queries',
|
|
415
|
+
});
|
|
416
|
+
/**
|
|
417
|
+
* Anti-amplification cap for `GET /v1/memories/event-chains`. The endpoint
|
|
418
|
+
* fans out per entity (one chain hydration each); without an upper bound a
|
|
419
|
+
* single request can pull tens of thousands of rows.
|
|
420
|
+
*/
|
|
421
|
+
const MAX_ENTITY_IDS_PER_REQUEST = 100;
|
|
422
|
+
/**
|
|
423
|
+
* Query for `GET /v1/memories/event-chains`. Accepts a comma-separated list
|
|
424
|
+
* of entity UUIDs and returns the per-entity ordered event chain.
|
|
425
|
+
* `entity_ids` is parsed as comma-separated, trimmed, deduplicated; empty
|
|
426
|
+
* tokens skipped. At least one valid UUID required, capped at
|
|
427
|
+
* MAX_ENTITY_IDS_PER_REQUEST entries.
|
|
428
|
+
*/
|
|
429
|
+
export const EventChainsQuerySchema = z
|
|
430
|
+
.object({
|
|
431
|
+
user_id: RequiredQueryString,
|
|
432
|
+
entity_ids: RequiredQueryString,
|
|
433
|
+
})
|
|
434
|
+
.transform(q => {
|
|
435
|
+
const ids = [...new Set(q.entity_ids
|
|
436
|
+
.split(',')
|
|
437
|
+
.map(s => s.trim())
|
|
438
|
+
.filter(s => s.length > 0))];
|
|
439
|
+
return { userId: q.user_id, entityIds: ids };
|
|
440
|
+
})
|
|
441
|
+
.refine(q => q.entityIds.length > 0, {
|
|
442
|
+
message: 'entity_ids must contain at least one non-empty value',
|
|
443
|
+
})
|
|
444
|
+
.refine(q => q.entityIds.length <= MAX_ENTITY_IDS_PER_REQUEST, {
|
|
445
|
+
message: `entity_ids must contain at most ${MAX_ENTITY_IDS_PER_REQUEST} values`,
|
|
446
|
+
})
|
|
447
|
+
.refine(q => q.entityIds.every(id => UUID_REGEX.test(id)), {
|
|
448
|
+
message: 'entity_ids entries must be valid UUIDs',
|
|
449
|
+
});
|
|
450
|
+
/**
|
|
451
|
+
* Body for `POST /v1/memories/first-mentions/extract`. Accepts the full
|
|
452
|
+
* conversation transcript plus a turn-id-to-memory-id mapping (the harness
|
|
453
|
+
* provides this — the in-core ingest pipeline does not retain turn
|
|
454
|
+
* structure). The service runs a single LLM call to identify chronological
|
|
455
|
+
* topic-introduction events and persists them.
|
|
456
|
+
*/
|
|
457
|
+
export const FirstMentionsExtractBodySchema = z
|
|
458
|
+
.object({
|
|
459
|
+
user_id: z.string().min(1),
|
|
460
|
+
conversation_text: z.string().min(1).max(MAX_CONVERSATION_LENGTH),
|
|
461
|
+
source_site: z.string().min(1),
|
|
462
|
+
// Values must be UUIDs — they're inserted into a UUID column
|
|
463
|
+
// (`first_mention_events.memory_id`). Validate at the schema layer so a
|
|
464
|
+
// bad value returns 400 instead of leaking a Postgres "invalid input
|
|
465
|
+
// syntax for type uuid" error as a 500.
|
|
466
|
+
memory_ids_by_turn_id: z.record(z.string(), z.string().uuid()),
|
|
467
|
+
})
|
|
468
|
+
.transform(b => {
|
|
469
|
+
const map = new Map();
|
|
470
|
+
for (const [k, v] of Object.entries(b.memory_ids_by_turn_id)) {
|
|
471
|
+
const n = Number(k);
|
|
472
|
+
if (Number.isFinite(n) && Number.isInteger(n))
|
|
473
|
+
map.set(n, v);
|
|
474
|
+
}
|
|
475
|
+
return {
|
|
476
|
+
userId: b.user_id,
|
|
477
|
+
conversationText: b.conversation_text,
|
|
478
|
+
sourceSite: b.source_site,
|
|
479
|
+
memoryIdsByTurnId: map,
|
|
480
|
+
};
|
|
481
|
+
});
|
|
482
|
+
// ---------------------------------------------------------------------------
|
|
483
|
+
// Path params
|
|
484
|
+
// ---------------------------------------------------------------------------
|
|
485
|
+
export const UuidIdParamSchema = z
|
|
486
|
+
.object({
|
|
487
|
+
// The .openapi() tag pins `format: "uuid"` in the emitted spec
|
|
488
|
+
// instead of letting zod-to-openapi stringify the JS regex literal
|
|
489
|
+
// (including the `/i` flag) as a JSON Schema `pattern`, which is
|
|
490
|
+
// not a valid regex string per the OpenAPI pattern spec.
|
|
491
|
+
id: z
|
|
492
|
+
.string()
|
|
493
|
+
.regex(UUID_REGEX, 'id must be a valid UUID')
|
|
494
|
+
.openapi({ type: 'string', format: 'uuid' }),
|
|
495
|
+
})
|
|
496
|
+
.transform(p => ({ id: p.id }));
|
|
497
|
+
/** Non-UUID :id used by DELETE /lessons/:id (lessonId is a free string). */
|
|
498
|
+
export const FreeIdParamSchema = z
|
|
499
|
+
.object({
|
|
500
|
+
id: z.string().min(1),
|
|
501
|
+
})
|
|
502
|
+
.transform(p => ({ id: p.id }));
|
|
503
|
+
// ---------------------------------------------------------------------------
|
|
504
|
+
// Config (PUT /config) — special case
|
|
505
|
+
// ---------------------------------------------------------------------------
|
|
506
|
+
/**
|
|
507
|
+
* PUT /config body is intentionally loose: the handler enforces the
|
|
508
|
+
* startup-only-fields + 410 checks. We expose the body as an open
|
|
509
|
+
* object so the 410-first-check-then-reject-then-apply flow stays in
|
|
510
|
+
* the handler where it belongs.
|
|
511
|
+
*/
|
|
512
|
+
export const ConfigBodySchema = z
|
|
513
|
+
.object({})
|
|
514
|
+
.passthrough()
|
|
515
|
+
.openapi({ description: 'Runtime config mutation. See handler for 410 and rejected[] paths.' });
|
|
516
|
+
// ---------------------------------------------------------------------------
|
|
517
|
+
// Internal helpers
|
|
518
|
+
// ---------------------------------------------------------------------------
|
|
519
|
+
function buildWorkspaceContext(workspaceId, agentId, visibility) {
|
|
520
|
+
if (!workspaceId || !agentId)
|
|
521
|
+
return undefined;
|
|
522
|
+
return { workspaceId, agentId, visibility };
|
|
523
|
+
}
|
|
524
|
+
/** parseInt with default. Non-numeric strings → NaN → handler falls back. */
|
|
525
|
+
function parseIntegerLimit(raw, defaultVal) {
|
|
526
|
+
return parseInt(String(raw ?? String(defaultVal)), 10);
|
|
527
|
+
}
|
|
528
|
+
function OptionalQueryField() {
|
|
529
|
+
return z
|
|
530
|
+
.unknown()
|
|
531
|
+
.transform(v => (typeof v === 'string' && v.length > 0 ? v : undefined))
|
|
532
|
+
.openapi({ type: 'string' });
|
|
533
|
+
}
|
|
534
|
+
function OptionalUuidQueryField(label) {
|
|
535
|
+
return z
|
|
536
|
+
.unknown()
|
|
537
|
+
.transform(v => (typeof v === 'string' && v.length > 0 ? v : undefined))
|
|
538
|
+
.refine(s => s === undefined || UUID_REGEX.test(s), {
|
|
539
|
+
message: `${label} must be a valid UUID`,
|
|
540
|
+
})
|
|
541
|
+
.openapi({ type: 'string', format: 'uuid' });
|
|
542
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file OpenAPI 3.1 registry — single source of truth for the spec.
|
|
3
|
+
*
|
|
4
|
+
* Wires every /v1/memories/*, /v1/agents/*, and /v1/documents/* route
|
|
5
|
+
* into an OpenAPIRegistry. `scripts/generate-openapi.ts` walks this
|
|
6
|
+
* registry to emit `openapi.yaml` + `openapi.json` at repo root.
|
|
7
|
+
*
|
|
8
|
+
* Each route entry records:
|
|
9
|
+
* - method + path (the public wire contract with the `/v1` prefix)
|
|
10
|
+
* - operationId (stable identifier clients can reference)
|
|
11
|
+
* - tag (groups routes under logical sections in the rendered docs)
|
|
12
|
+
* - request body and/or query / path params (Zod schemas from
|
|
13
|
+
* `./memories.ts` + `./agents.ts`)
|
|
14
|
+
* - per-route response inventory — includes every status code the
|
|
15
|
+
* real handler can emit, not a generic 200+400+500 default. The
|
|
16
|
+
* special 410 + rich-400 envelopes on PUT /config and 404 on
|
|
17
|
+
* GET/DELETE /:id are spelled out.
|
|
18
|
+
*/
|
|
19
|
+
import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
|
|
20
|
+
export declare const API_TITLE = "AtomicMemory HTTP API";
|
|
21
|
+
export declare const API_VERSION = "1.0.0";
|
|
22
|
+
export declare const API_DESCRIPTION = "Semantic memory engine for AI applications. Request/response bodies are JSON; fields on the wire use snake_case.";
|
|
23
|
+
/** Build and populate the OpenAPI registry. */
|
|
24
|
+
export declare function buildRegistry(): OpenAPIRegistry;
|