@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.
Files changed (589) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +201 -0
  3. package/README.md +314 -0
  4. package/dist/app/bind-ephemeral.d.ts +18 -0
  5. package/dist/app/bind-ephemeral.js +22 -0
  6. package/dist/app/cors-headers.d.ts +12 -0
  7. package/dist/app/cors-headers.js +18 -0
  8. package/dist/app/create-app.d.ts +25 -0
  9. package/dist/app/create-app.js +156 -0
  10. package/dist/app/runtime-config-route-snapshot.d.ts +27 -0
  11. package/dist/app/runtime-config-route-snapshot.js +27 -0
  12. package/dist/app/runtime-container.d.ts +281 -0
  13. package/dist/app/runtime-container.js +297 -0
  14. package/dist/app/startup-checks.d.ts +28 -0
  15. package/dist/app/startup-checks.js +45 -0
  16. package/dist/bin.d.ts +17 -0
  17. package/dist/bin.js +128 -0
  18. package/dist/config.d.ts +680 -0
  19. package/dist/config.js +808 -0
  20. package/dist/db/agent-trust-repository.d.ts +49 -0
  21. package/dist/db/agent-trust-repository.js +66 -0
  22. package/dist/db/belief-edges-repository.d.ts +68 -0
  23. package/dist/db/belief-edges-repository.js +124 -0
  24. package/dist/db/claim-repository.d.ts +6 -0
  25. package/dist/db/claim-repository.js +4 -0
  26. package/dist/db/contradictions-repository.d.ts +56 -0
  27. package/dist/db/contradictions-repository.js +88 -0
  28. package/dist/db/document-chunk-repository.d.ts +48 -0
  29. package/dist/db/document-chunk-repository.js +145 -0
  30. package/dist/db/document-chunk-types.d.ts +35 -0
  31. package/dist/db/document-chunk-types.js +9 -0
  32. package/dist/db/document-list-cursor.d.ts +45 -0
  33. package/dist/db/document-list-cursor.js +111 -0
  34. package/dist/db/document-list-repository.d.ts +103 -0
  35. package/dist/db/document-list-repository.js +204 -0
  36. package/dist/db/entity-cards-repository.d.ts +37 -0
  37. package/dist/db/entity-cards-repository.js +46 -0
  38. package/dist/db/entity-values-repository.d.ts +26 -0
  39. package/dist/db/entity-values-repository.js +57 -0
  40. package/dist/db/link-repository.d.ts +30 -0
  41. package/dist/db/link-repository.js +54 -0
  42. package/dist/db/memory-repository.d.ts +163 -0
  43. package/dist/db/memory-repository.js +232 -0
  44. package/dist/db/migrate.d.ts +6 -0
  45. package/dist/db/migrate.js +36 -0
  46. package/dist/db/mmr.d.ts +14 -0
  47. package/dist/db/mmr.js +57 -0
  48. package/dist/db/passport-feed-repository.d.ts +91 -0
  49. package/dist/db/passport-feed-repository.js +198 -0
  50. package/dist/db/pg-episode-store.d.ts +19 -0
  51. package/dist/db/pg-episode-store.js +17 -0
  52. package/dist/db/pg-link-store.d.ts +17 -0
  53. package/dist/db/pg-link-store.js +14 -0
  54. package/dist/db/pg-memory-store.d.ts +68 -0
  55. package/dist/db/pg-memory-store.js +53 -0
  56. package/dist/db/pg-recap-store.d.ts +13 -0
  57. package/dist/db/pg-recap-store.js +19 -0
  58. package/dist/db/pg-representation-store.d.ts +17 -0
  59. package/dist/db/pg-representation-store.js +17 -0
  60. package/dist/db/pg-search-store.d.ts +29 -0
  61. package/dist/db/pg-search-store.js +47 -0
  62. package/dist/db/pool.d.ts +5 -0
  63. package/dist/db/pool.js +21 -0
  64. package/dist/db/ppr.d.ts +56 -0
  65. package/dist/db/ppr.js +178 -0
  66. package/dist/db/query-helpers.d.ts +44 -0
  67. package/dist/db/query-helpers.js +60 -0
  68. package/dist/db/raw-doc-artifact-sync.d.ts +128 -0
  69. package/dist/db/raw-doc-artifact-sync.js +259 -0
  70. package/dist/db/raw-document-blob-repository.d.ts +148 -0
  71. package/dist/db/raw-document-blob-repository.js +300 -0
  72. package/dist/db/raw-document-repository.d.ts +104 -0
  73. package/dist/db/raw-document-repository.js +410 -0
  74. package/dist/db/raw-document-status-repository.d.ts +122 -0
  75. package/dist/db/raw-document-status-repository.js +183 -0
  76. package/dist/db/raw-document-types.d.ts +236 -0
  77. package/dist/db/raw-document-types.js +10 -0
  78. package/dist/db/raw-storage-reconciliation-repository.d.ts +110 -0
  79. package/dist/db/raw-storage-reconciliation-repository.js +200 -0
  80. package/dist/db/reflection-jobs-repository.d.ts +33 -0
  81. package/dist/db/reflection-jobs-repository.js +48 -0
  82. package/dist/db/reflections-repository.d.ts +41 -0
  83. package/dist/db/reflections-repository.js +83 -0
  84. package/dist/db/repository-claims.d.ts +141 -0
  85. package/dist/db/repository-claims.js +376 -0
  86. package/dist/db/repository-deferred-audn.d.ts +33 -0
  87. package/dist/db/repository-deferred-audn.js +69 -0
  88. package/dist/db/repository-document-delete.d.ts +53 -0
  89. package/dist/db/repository-document-delete.js +156 -0
  90. package/dist/db/repository-entities.d.ts +114 -0
  91. package/dist/db/repository-entities.js +317 -0
  92. package/dist/db/repository-entity-attributes.d.ts +41 -0
  93. package/dist/db/repository-entity-attributes.js +65 -0
  94. package/dist/db/repository-entity-graph.d.ts +32 -0
  95. package/dist/db/repository-entity-graph.js +87 -0
  96. package/dist/db/repository-first-mentions.d.ts +41 -0
  97. package/dist/db/repository-first-mentions.js +79 -0
  98. package/dist/db/repository-lessons.d.ts +51 -0
  99. package/dist/db/repository-lessons.js +90 -0
  100. package/dist/db/repository-links.d.ts +26 -0
  101. package/dist/db/repository-links.js +105 -0
  102. package/dist/db/repository-observation.d.ts +26 -0
  103. package/dist/db/repository-observation.js +51 -0
  104. package/dist/db/repository-read.d.ts +56 -0
  105. package/dist/db/repository-read.js +271 -0
  106. package/dist/db/repository-recaps.d.ts +59 -0
  107. package/dist/db/repository-recaps.js +158 -0
  108. package/dist/db/repository-representations.d.ts +48 -0
  109. package/dist/db/repository-representations.js +162 -0
  110. package/dist/db/repository-temporal-state.d.ts +35 -0
  111. package/dist/db/repository-temporal-state.js +46 -0
  112. package/dist/db/repository-tll.d.ts +88 -0
  113. package/dist/db/repository-tll.js +179 -0
  114. package/dist/db/repository-types.d.ts +313 -0
  115. package/dist/db/repository-types.js +142 -0
  116. package/dist/db/repository-user-profiles.d.ts +17 -0
  117. package/dist/db/repository-user-profiles.js +28 -0
  118. package/dist/db/repository-vector-search.d.ts +33 -0
  119. package/dist/db/repository-vector-search.js +373 -0
  120. package/dist/db/repository-wipe.d.ts +34 -0
  121. package/dist/db/repository-wipe.js +94 -0
  122. package/dist/db/repository-write.d.ts +61 -0
  123. package/dist/db/repository-write.js +279 -0
  124. package/dist/db/schema.sql +1355 -0
  125. package/dist/db/storage-artifact-delete-tx.d.ts +56 -0
  126. package/dist/db/storage-artifact-delete-tx.js +123 -0
  127. package/dist/db/storage-artifact-providers.d.ts +21 -0
  128. package/dist/db/storage-artifact-providers.js +21 -0
  129. package/dist/db/storage-artifact-recovery-repository.d.ts +66 -0
  130. package/dist/db/storage-artifact-recovery-repository.js +58 -0
  131. package/dist/db/storage-artifact-repository.d.ts +329 -0
  132. package/dist/db/storage-artifact-repository.js +497 -0
  133. package/dist/db/stores.d.ts +220 -0
  134. package/dist/db/stores.js +12 -0
  135. package/dist/db/summaries-repository.d.ts +74 -0
  136. package/dist/db/summaries-repository.js +125 -0
  137. package/dist/eval/beam-10m-loader.d.ts +98 -0
  138. package/dist/eval/beam-10m-loader.js +128 -0
  139. package/dist/index.d.ts +18 -0
  140. package/dist/index.js +17 -0
  141. package/dist/middleware/require-bearer.d.ts +27 -0
  142. package/dist/middleware/require-bearer.js +60 -0
  143. package/dist/middleware/validate-response.d.ts +33 -0
  144. package/dist/middleware/validate-response.js +55 -0
  145. package/dist/middleware/validate.d.ts +43 -0
  146. package/dist/middleware/validate.js +85 -0
  147. package/dist/routes/agents.d.ts +13 -0
  148. package/dist/routes/agents.js +89 -0
  149. package/dist/routes/document-response-formatters.d.ts +98 -0
  150. package/dist/routes/document-response-formatters.js +243 -0
  151. package/dist/routes/documents.d.ts +74 -0
  152. package/dist/routes/documents.js +425 -0
  153. package/dist/routes/memories.d.ts +29 -0
  154. package/dist/routes/memories.js +725 -0
  155. package/dist/routes/memory-response-formatters.d.ts +179 -0
  156. package/dist/routes/memory-response-formatters.js +210 -0
  157. package/dist/routes/public-raw-storage-metadata.d.ts +54 -0
  158. package/dist/routes/public-raw-storage-metadata.js +56 -0
  159. package/dist/routes/reflect.d.ts +14 -0
  160. package/dist/routes/reflect.js +19 -0
  161. package/dist/routes/response-schema-map.d.ts +14 -0
  162. package/dist/routes/response-schema-map.js +69 -0
  163. package/dist/routes/route-errors.d.ts +12 -0
  164. package/dist/routes/route-errors.js +30 -0
  165. package/dist/routes/storage-error-handlers.d.ts +34 -0
  166. package/dist/routes/storage-error-handlers.js +185 -0
  167. package/dist/routes/storage-response-formatters.d.ts +44 -0
  168. package/dist/routes/storage-response-formatters.js +155 -0
  169. package/dist/routes/storage.d.ts +38 -0
  170. package/dist/routes/storage.js +369 -0
  171. package/dist/routes/upstream-provider-errors.d.ts +19 -0
  172. package/dist/routes/upstream-provider-errors.js +95 -0
  173. package/dist/schemas/agents.d.ts +79 -0
  174. package/dist/schemas/agents.js +126 -0
  175. package/dist/schemas/common.d.ts +110 -0
  176. package/dist/schemas/common.js +190 -0
  177. package/dist/schemas/document-list-responses.d.ts +102 -0
  178. package/dist/schemas/document-list-responses.js +87 -0
  179. package/dist/schemas/document-list-schemas.d.ts +123 -0
  180. package/dist/schemas/document-list-schemas.js +174 -0
  181. package/dist/schemas/document-response-schemas.d.ts +610 -0
  182. package/dist/schemas/document-response-schemas.js +264 -0
  183. package/dist/schemas/document-status-envelope.d.ts +48 -0
  184. package/dist/schemas/document-status-envelope.js +54 -0
  185. package/dist/schemas/documents.d.ts +292 -0
  186. package/dist/schemas/documents.js +449 -0
  187. package/dist/schemas/errors.d.ts +75 -0
  188. package/dist/schemas/errors.js +105 -0
  189. package/dist/schemas/memories.d.ts +378 -0
  190. package/dist/schemas/memories.js +542 -0
  191. package/dist/schemas/openapi.d.ts +24 -0
  192. package/dist/schemas/openapi.js +1038 -0
  193. package/dist/schemas/response-scalars.d.ts +10 -0
  194. package/dist/schemas/response-scalars.js +10 -0
  195. package/dist/schemas/responses.d.ts +536 -0
  196. package/dist/schemas/responses.js +350 -0
  197. package/dist/schemas/search-response-parts.d.ts +97 -0
  198. package/dist/schemas/search-response-parts.js +103 -0
  199. package/dist/schemas/storage-schemas.d.ts +175 -0
  200. package/dist/schemas/storage-schemas.js +277 -0
  201. package/dist/schemas/zod-setup.d.ts +15 -0
  202. package/dist/schemas/zod-setup.js +17 -0
  203. package/dist/server.d.ts +13 -0
  204. package/dist/server.js +57 -0
  205. package/dist/services/abstract-query-policy.d.ts +13 -0
  206. package/dist/services/abstract-query-policy.js +50 -0
  207. package/dist/services/affinity-clustering.d.ts +66 -0
  208. package/dist/services/affinity-clustering.js +125 -0
  209. package/dist/services/agentic-retrieval.d.ts +38 -0
  210. package/dist/services/agentic-retrieval.js +126 -0
  211. package/dist/services/answer-format.d.ts +56 -0
  212. package/dist/services/answer-format.js +118 -0
  213. package/dist/services/answer-rescue.d.ts +72 -0
  214. package/dist/services/answer-rescue.js +177 -0
  215. package/dist/services/answer-verifier.d.ts +24 -0
  216. package/dist/services/answer-verifier.js +73 -0
  217. package/dist/services/api-retry.d.ts +6 -0
  218. package/dist/services/api-retry.js +41 -0
  219. package/dist/services/assistant-turn-filter.d.ts +20 -0
  220. package/dist/services/assistant-turn-filter.js +69 -0
  221. package/dist/services/atomicmem-uri.d.ts +33 -0
  222. package/dist/services/atomicmem-uri.js +86 -0
  223. package/dist/services/audit-events.d.ts +54 -0
  224. package/dist/services/audit-events.js +56 -0
  225. package/dist/services/chunked-extraction.d.ts +21 -0
  226. package/dist/services/chunked-extraction.js +108 -0
  227. package/dist/services/claim-slotting.d.ts +27 -0
  228. package/dist/services/claim-slotting.js +38 -0
  229. package/dist/services/claude-code-llm.d.ts +19 -0
  230. package/dist/services/claude-code-llm.js +96 -0
  231. package/dist/services/composite-dedup.d.ts +50 -0
  232. package/dist/services/composite-dedup.js +153 -0
  233. package/dist/services/composite-grouping.d.ts +41 -0
  234. package/dist/services/composite-grouping.js +111 -0
  235. package/dist/services/composite-staleness.d.ts +20 -0
  236. package/dist/services/composite-staleness.js +50 -0
  237. package/dist/services/conciseness-preference.d.ts +14 -0
  238. package/dist/services/conciseness-preference.js +42 -0
  239. package/dist/services/conflict-policy.d.ts +20 -0
  240. package/dist/services/conflict-policy.js +335 -0
  241. package/dist/services/consensus-extraction.d.ts +39 -0
  242. package/dist/services/consensus-extraction.js +147 -0
  243. package/dist/services/consensus-validation.d.ts +52 -0
  244. package/dist/services/consensus-validation.js +206 -0
  245. package/dist/services/consolidation-service.d.ts +60 -0
  246. package/dist/services/consolidation-service.js +171 -0
  247. package/dist/services/content-detection.d.ts +18 -0
  248. package/dist/services/content-detection.js +25 -0
  249. package/dist/services/contradiction-surfacing.d.ts +62 -0
  250. package/dist/services/contradiction-surfacing.js +111 -0
  251. package/dist/services/cost-telemetry.d.ts +39 -0
  252. package/dist/services/cost-telemetry.js +58 -0
  253. package/dist/services/counter-evidence.d.ts +34 -0
  254. package/dist/services/counter-evidence.js +92 -0
  255. package/dist/services/current-state-ranking.d.ts +21 -0
  256. package/dist/services/current-state-ranking.js +152 -0
  257. package/dist/services/deferred-audn.d.ts +47 -0
  258. package/dist/services/deferred-audn.js +162 -0
  259. package/dist/services/document-chunker.d.ts +50 -0
  260. package/dist/services/document-chunker.js +153 -0
  261. package/dist/services/document-failure-markers.d.ts +91 -0
  262. package/dist/services/document-failure-markers.js +305 -0
  263. package/dist/services/document-indexer.d.ts +122 -0
  264. package/dist/services/document-indexer.js +405 -0
  265. package/dist/services/document-service.d.ts +245 -0
  266. package/dist/services/document-service.js +325 -0
  267. package/dist/services/document-upload-artifact-sync.d.ts +80 -0
  268. package/dist/services/document-upload-artifact-sync.js +162 -0
  269. package/dist/services/document-upload-beta2-recovery.d.ts +72 -0
  270. package/dist/services/document-upload-beta2-recovery.js +94 -0
  271. package/dist/services/document-upload.d.ts +44 -0
  272. package/dist/services/document-upload.js +353 -0
  273. package/dist/services/embedding.d.ts +57 -0
  274. package/dist/services/embedding.js +416 -0
  275. package/dist/services/entity-attribute-extractor.d.ts +34 -0
  276. package/dist/services/entity-attribute-extractor.js +117 -0
  277. package/dist/services/entity-card-synthesis.d.ts +54 -0
  278. package/dist/services/entity-card-synthesis.js +92 -0
  279. package/dist/services/entity-dedup.d.ts +9 -0
  280. package/dist/services/entity-dedup.js +14 -0
  281. package/dist/services/entity-graph.d.ts +17 -0
  282. package/dist/services/entity-graph.js +135 -0
  283. package/dist/services/entropy-gate.d.ts +52 -0
  284. package/dist/services/entropy-gate.js +56 -0
  285. package/dist/services/episode-fetcher.d.ts +47 -0
  286. package/dist/services/episode-fetcher.js +128 -0
  287. package/dist/services/event-anchor-facts.d.ts +8 -0
  288. package/dist/services/event-anchor-facts.js +205 -0
  289. package/dist/services/event-chain-detector.d.ts +52 -0
  290. package/dist/services/event-chain-detector.js +83 -0
  291. package/dist/services/extraction-cache.d.ts +9 -0
  292. package/dist/services/extraction-cache.js +54 -0
  293. package/dist/services/extraction-enrichment.d.ts +9 -0
  294. package/dist/services/extraction-enrichment.js +223 -0
  295. package/dist/services/extraction.d.ts +69 -0
  296. package/dist/services/extraction.js +596 -0
  297. package/dist/services/fact-normalization.d.ts +12 -0
  298. package/dist/services/fact-normalization.js +248 -0
  299. package/dist/services/filecoin-observability.d.ts +127 -0
  300. package/dist/services/filecoin-observability.js +200 -0
  301. package/dist/services/first-mention-service.d.ts +76 -0
  302. package/dist/services/first-mention-service.js +186 -0
  303. package/dist/services/hierarchical-retrieval.d.ts +49 -0
  304. package/dist/services/hierarchical-retrieval.js +50 -0
  305. package/dist/services/ingest-fact-pipeline.d.ts +32 -0
  306. package/dist/services/ingest-fact-pipeline.js +212 -0
  307. package/dist/services/ingest-post-write.d.ts +50 -0
  308. package/dist/services/ingest-post-write.js +117 -0
  309. package/dist/services/ingest-trace.d.ts +32 -0
  310. package/dist/services/ingest-trace.js +60 -0
  311. package/dist/services/input-sanitizer.d.ts +41 -0
  312. package/dist/services/input-sanitizer.js +135 -0
  313. package/dist/services/iterative-retrieval.d.ts +26 -0
  314. package/dist/services/iterative-retrieval.js +139 -0
  315. package/dist/services/keyword-expansion.d.ts +10 -0
  316. package/dist/services/keyword-expansion.js +26 -0
  317. package/dist/services/lesson-service.d.ts +68 -0
  318. package/dist/services/lesson-service.js +178 -0
  319. package/dist/services/literal-extractor.d.ts +16 -0
  320. package/dist/services/literal-extractor.js +74 -0
  321. package/dist/services/literal-list-protection.d.ts +17 -0
  322. package/dist/services/literal-list-protection.js +134 -0
  323. package/dist/services/literal-query-expansion.d.ts +20 -0
  324. package/dist/services/literal-query-expansion.js +181 -0
  325. package/dist/services/llm.d.ts +61 -0
  326. package/dist/services/llm.js +265 -0
  327. package/dist/services/memcell-projection.d.ts +17 -0
  328. package/dist/services/memcell-projection.js +41 -0
  329. package/dist/services/memory-audn.d.ts +43 -0
  330. package/dist/services/memory-audn.js +419 -0
  331. package/dist/services/memory-crud.d.ts +93 -0
  332. package/dist/services/memory-crud.js +255 -0
  333. package/dist/services/memory-ingest.d.ts +21 -0
  334. package/dist/services/memory-ingest.js +249 -0
  335. package/dist/services/memory-lifecycle.d.ts +75 -0
  336. package/dist/services/memory-lifecycle.js +108 -0
  337. package/dist/services/memory-lineage.d.ts +181 -0
  338. package/dist/services/memory-lineage.js +232 -0
  339. package/dist/services/memory-network.d.ts +40 -0
  340. package/dist/services/memory-network.js +75 -0
  341. package/dist/services/memory-search-types.d.ts +25 -0
  342. package/dist/services/memory-search-types.js +10 -0
  343. package/dist/services/memory-search.d.ts +48 -0
  344. package/dist/services/memory-search.js +505 -0
  345. package/dist/services/memory-service-types.d.ts +371 -0
  346. package/dist/services/memory-service-types.js +8 -0
  347. package/dist/services/memory-service.d.ts +152 -0
  348. package/dist/services/memory-service.js +225 -0
  349. package/dist/services/memory-storage.d.ts +33 -0
  350. package/dist/services/memory-storage.js +328 -0
  351. package/dist/services/msr-aggregator.d.ts +38 -0
  352. package/dist/services/msr-aggregator.js +97 -0
  353. package/dist/services/msr-detector.d.ts +35 -0
  354. package/dist/services/msr-detector.js +65 -0
  355. package/dist/services/namespace-retrieval.d.ts +60 -0
  356. package/dist/services/namespace-retrieval.js +180 -0
  357. package/dist/services/observation-date-extraction.d.ts +12 -0
  358. package/dist/services/observation-date-extraction.js +50 -0
  359. package/dist/services/observation-service.d.ts +27 -0
  360. package/dist/services/observation-service.js +84 -0
  361. package/dist/services/packaging-observability.d.ts +29 -0
  362. package/dist/services/packaging-observability.js +146 -0
  363. package/dist/services/query-expansion.d.ts +83 -0
  364. package/dist/services/query-expansion.js +242 -0
  365. package/dist/services/query-keyword-matches.d.ts +6 -0
  366. package/dist/services/query-keyword-matches.js +56 -0
  367. package/dist/services/query-term-visibility.d.ts +28 -0
  368. package/dist/services/query-term-visibility.js +100 -0
  369. package/dist/services/quick-extraction.d.ts +25 -0
  370. package/dist/services/quick-extraction.js +431 -0
  371. package/dist/services/quoted-entity-extraction.d.ts +10 -0
  372. package/dist/services/quoted-entity-extraction.js +161 -0
  373. package/dist/services/raw-storage-reconciler-backoff.d.ts +8 -0
  374. package/dist/services/raw-storage-reconciler-backoff.js +14 -0
  375. package/dist/services/raw-storage-reconciler-scheduler.d.ts +29 -0
  376. package/dist/services/raw-storage-reconciler-scheduler.js +43 -0
  377. package/dist/services/raw-storage-reconciler.d.ts +71 -0
  378. package/dist/services/raw-storage-reconciler.js +278 -0
  379. package/dist/services/recap-builder.d.ts +49 -0
  380. package/dist/services/recap-builder.js +157 -0
  381. package/dist/services/reflect-jobs.d.ts +23 -0
  382. package/dist/services/reflect-jobs.js +36 -0
  383. package/dist/services/reflect-prompts.d.ts +71 -0
  384. package/dist/services/reflect-prompts.js +99 -0
  385. package/dist/services/reflect-retrieval.d.ts +33 -0
  386. package/dist/services/reflect-retrieval.js +30 -0
  387. package/dist/services/reflect.d.ts +49 -0
  388. package/dist/services/reflect.js +84 -0
  389. package/dist/services/relative-temporal.d.ts +14 -0
  390. package/dist/services/relative-temporal.js +163 -0
  391. package/dist/services/relevance-policy.d.ts +37 -0
  392. package/dist/services/relevance-policy.js +109 -0
  393. package/dist/services/rerank.d.ts +32 -0
  394. package/dist/services/rerank.js +118 -0
  395. package/dist/services/reranker.d.ts +20 -0
  396. package/dist/services/reranker.js +99 -0
  397. package/dist/services/retrieval-channel-rules.d.ts +34 -0
  398. package/dist/services/retrieval-channel-rules.js +41 -0
  399. package/dist/services/retrieval-config-overlay.d.ts +36 -0
  400. package/dist/services/retrieval-config-overlay.js +44 -0
  401. package/dist/services/retrieval-format.d.ts +119 -0
  402. package/dist/services/retrieval-format.js +559 -0
  403. package/dist/services/retrieval-policy.d.ts +69 -0
  404. package/dist/services/retrieval-policy.js +275 -0
  405. package/dist/services/retrieval-profiles.d.ts +37 -0
  406. package/dist/services/retrieval-profiles.js +90 -0
  407. package/dist/services/retrieval-side-effects.d.ts +14 -0
  408. package/dist/services/retrieval-side-effects.js +26 -0
  409. package/dist/services/retrieval-trace.d.ts +108 -0
  410. package/dist/services/retrieval-trace.js +147 -0
  411. package/dist/services/rrf-fusion.d.ts +18 -0
  412. package/dist/services/rrf-fusion.js +34 -0
  413. package/dist/services/search-pipeline.d.ts +71 -0
  414. package/dist/services/search-pipeline.js +788 -0
  415. package/dist/services/session-date.d.ts +20 -0
  416. package/dist/services/session-date.js +61 -0
  417. package/dist/services/session-packaging.d.ts +53 -0
  418. package/dist/services/session-packaging.js +182 -0
  419. package/dist/services/session-summary-generator.d.ts +53 -0
  420. package/dist/services/session-summary-generator.js +134 -0
  421. package/dist/services/specialists/cr-specialist.d.ts +52 -0
  422. package/dist/services/specialists/cr-specialist.js +121 -0
  423. package/dist/services/specialists/dispatch.d.ts +53 -0
  424. package/dist/services/specialists/dispatch.js +102 -0
  425. package/dist/services/specialists/ie-ku-specialist.d.ts +37 -0
  426. package/dist/services/specialists/ie-ku-specialist.js +63 -0
  427. package/dist/services/specialists/msr-specialist.d.ts +61 -0
  428. package/dist/services/specialists/msr-specialist.js +162 -0
  429. package/dist/services/specialists/tr-specialist.d.ts +37 -0
  430. package/dist/services/specialists/tr-specialist.js +146 -0
  431. package/dist/services/storage-key-prefix.d.ts +42 -0
  432. package/dist/services/storage-key-prefix.js +45 -0
  433. package/dist/services/storage-put-recovery.d.ts +71 -0
  434. package/dist/services/storage-put-recovery.js +269 -0
  435. package/dist/services/storage-service-errors.d.ts +124 -0
  436. package/dist/services/storage-service-errors.js +189 -0
  437. package/dist/services/storage-service.d.ts +176 -0
  438. package/dist/services/storage-service.js +423 -0
  439. package/dist/services/subject-aware-ranking.d.ts +19 -0
  440. package/dist/services/subject-aware-ranking.js +161 -0
  441. package/dist/services/supplemental-extraction.d.ts +7 -0
  442. package/dist/services/supplemental-extraction.js +116 -0
  443. package/dist/services/tbc-execution.d.ts +49 -0
  444. package/dist/services/tbc-execution.js +284 -0
  445. package/dist/services/temporal-classifier.d.ts +56 -0
  446. package/dist/services/temporal-classifier.js +94 -0
  447. package/dist/services/temporal-endpoint-evidence.d.ts +12 -0
  448. package/dist/services/temporal-endpoint-evidence.js +313 -0
  449. package/dist/services/temporal-fingerprint.d.ts +6 -0
  450. package/dist/services/temporal-fingerprint.js +12 -0
  451. package/dist/services/temporal-format.d.ts +9 -0
  452. package/dist/services/temporal-format.js +21 -0
  453. package/dist/services/temporal-intent.d.ts +39 -0
  454. package/dist/services/temporal-intent.js +78 -0
  455. package/dist/services/temporal-query-constraints.d.ts +16 -0
  456. package/dist/services/temporal-query-constraints.js +107 -0
  457. package/dist/services/temporal-query-expansion.d.ts +14 -0
  458. package/dist/services/temporal-query-expansion.js +131 -0
  459. package/dist/services/temporal-rerank.d.ts +22 -0
  460. package/dist/services/temporal-rerank.js +47 -0
  461. package/dist/services/temporal-result-protection.d.ts +7 -0
  462. package/dist/services/temporal-result-protection.js +60 -0
  463. package/dist/services/temporal-state-write.d.ts +57 -0
  464. package/dist/services/temporal-state-write.js +45 -0
  465. package/dist/services/tiered-context.d.ts +87 -0
  466. package/dist/services/tiered-context.js +214 -0
  467. package/dist/services/tiered-loading.d.ts +88 -0
  468. package/dist/services/tiered-loading.js +263 -0
  469. package/dist/services/timeline-pack.d.ts +36 -0
  470. package/dist/services/timeline-pack.js +50 -0
  471. package/dist/services/timing.d.ts +13 -0
  472. package/dist/services/timing.js +72 -0
  473. package/dist/services/tll-augmentation.d.ts +20 -0
  474. package/dist/services/tll-augmentation.js +125 -0
  475. package/dist/services/tll-retrieval.d.ts +55 -0
  476. package/dist/services/tll-retrieval.js +101 -0
  477. package/dist/services/topic-abstraction.d.ts +36 -0
  478. package/dist/services/topic-abstraction.js +105 -0
  479. package/dist/services/trust-scoring.d.ts +43 -0
  480. package/dist/services/trust-scoring.js +89 -0
  481. package/dist/services/typed-belief-calculus.d.ts +126 -0
  482. package/dist/services/typed-belief-calculus.js +204 -0
  483. package/dist/services/upload-config.d.ts +34 -0
  484. package/dist/services/upload-config.js +23 -0
  485. package/dist/services/upload-decision.d.ts +65 -0
  486. package/dist/services/upload-decision.js +98 -0
  487. package/dist/services/upload-helpers.d.ts +107 -0
  488. package/dist/services/upload-helpers.js +148 -0
  489. package/dist/services/user-profile-builder.d.ts +22 -0
  490. package/dist/services/user-profile-builder.js +109 -0
  491. package/dist/services/voyage-embedding.d.ts +22 -0
  492. package/dist/services/voyage-embedding.js +77 -0
  493. package/dist/services/write-security.d.ts +31 -0
  494. package/dist/services/write-security.js +64 -0
  495. package/dist/storage/artifact-public-redaction.d.ts +34 -0
  496. package/dist/storage/artifact-public-redaction.js +83 -0
  497. package/dist/storage/cleanup.d.ts +103 -0
  498. package/dist/storage/cleanup.js +138 -0
  499. package/dist/storage/codec-factory.d.ts +17 -0
  500. package/dist/storage/codec-factory.js +33 -0
  501. package/dist/storage/codecs/aes-gcm-codec.d.ts +44 -0
  502. package/dist/storage/codecs/aes-gcm-codec.js +108 -0
  503. package/dist/storage/codecs/noop-codec.d.ts +16 -0
  504. package/dist/storage/codecs/noop-codec.js +23 -0
  505. package/dist/storage/factory.d.ts +44 -0
  506. package/dist/storage/factory.js +99 -0
  507. package/dist/storage/filecoin-cid-validation.d.ts +82 -0
  508. package/dist/storage/filecoin-cid-validation.js +122 -0
  509. package/dist/storage/filecoin-public-metadata.d.ts +73 -0
  510. package/dist/storage/filecoin-public-metadata.js +110 -0
  511. package/dist/storage/local-fs-store.d.ts +39 -0
  512. package/dist/storage/local-fs-store.js +145 -0
  513. package/dist/storage/pointer-uri-allowlist.d.ts +38 -0
  514. package/dist/storage/pointer-uri-allowlist.js +70 -0
  515. package/dist/storage/provider-metadata-projection.d.ts +27 -0
  516. package/dist/storage/provider-metadata-projection.js +68 -0
  517. package/dist/storage/providers/filecoin/backend.d.ts +42 -0
  518. package/dist/storage/providers/filecoin/backend.js +250 -0
  519. package/dist/storage/providers/filecoin/config.d.ts +70 -0
  520. package/dist/storage/providers/filecoin/config.js +275 -0
  521. package/dist/storage/providers/filecoin/errors.d.ts +45 -0
  522. package/dist/storage/providers/filecoin/errors.js +56 -0
  523. package/dist/storage/providers/filecoin/filecoin-pin-car.d.ts +78 -0
  524. package/dist/storage/providers/filecoin/filecoin-pin-car.js +155 -0
  525. package/dist/storage/providers/filecoin/filecoin-pin-client.d.ts +92 -0
  526. package/dist/storage/providers/filecoin/filecoin-pin-client.js +199 -0
  527. package/dist/storage/providers/filecoin/filecoin-pin-mapping.d.ts +58 -0
  528. package/dist/storage/providers/filecoin/filecoin-pin-mapping.js +103 -0
  529. package/dist/storage/providers/filecoin/filecoin-pin-timeout.d.ts +30 -0
  530. package/dist/storage/providers/filecoin/filecoin-pin-timeout.js +53 -0
  531. package/dist/storage/providers/filecoin/filecoin-pin-vendor.d.ts +111 -0
  532. package/dist/storage/providers/filecoin/filecoin-pin-vendor.js +87 -0
  533. package/dist/storage/providers/filecoin/hints.d.ts +71 -0
  534. package/dist/storage/providers/filecoin/hints.js +123 -0
  535. package/dist/storage/providers/filecoin/index.d.ts +51 -0
  536. package/dist/storage/providers/filecoin/index.js +103 -0
  537. package/dist/storage/providers/filecoin/ipfs-cid.d.ts +50 -0
  538. package/dist/storage/providers/filecoin/ipfs-cid.js +64 -0
  539. package/dist/storage/providers/filecoin/metadata.d.ts +72 -0
  540. package/dist/storage/providers/filecoin/metadata.js +137 -0
  541. package/dist/storage/providers/filecoin/piece-cid.d.ts +48 -0
  542. package/dist/storage/providers/filecoin/piece-cid.js +57 -0
  543. package/dist/storage/providers/filecoin/provider-client.d.ts +234 -0
  544. package/dist/storage/providers/filecoin/provider-client.js +27 -0
  545. package/dist/storage/providers/filecoin/readiness.d.ts +62 -0
  546. package/dist/storage/providers/filecoin/readiness.js +85 -0
  547. package/dist/storage/providers/filecoin/retriever.d.ts +82 -0
  548. package/dist/storage/providers/filecoin/retriever.js +63 -0
  549. package/dist/storage/providers/filecoin/skeleton-client.d.ts +36 -0
  550. package/dist/storage/providers/filecoin/skeleton-client.js +55 -0
  551. package/dist/storage/providers/filecoin/synapse-client.d.ts +169 -0
  552. package/dist/storage/providers/filecoin/synapse-client.js +343 -0
  553. package/dist/storage/providers/filecoin/synapse-construction.d.ts +26 -0
  554. package/dist/storage/providers/filecoin/synapse-construction.js +47 -0
  555. package/dist/storage/providers/filecoin/synapse-error-mapping.d.ts +23 -0
  556. package/dist/storage/providers/filecoin/synapse-error-mapping.js +49 -0
  557. package/dist/storage/providers/filecoin/synapse-readiness.d.ts +37 -0
  558. package/dist/storage/providers/filecoin/synapse-readiness.js +231 -0
  559. package/dist/storage/providers/filecoin/uri.d.ts +49 -0
  560. package/dist/storage/providers/filecoin/uri.js +84 -0
  561. package/dist/storage/providers/filecoin/verified-fetch-lifecycle.d.ts +77 -0
  562. package/dist/storage/providers/filecoin/verified-fetch-lifecycle.js +196 -0
  563. package/dist/storage/providers/filecoin/verified-fetch-retriever.d.ts +54 -0
  564. package/dist/storage/providers/filecoin/verified-fetch-retriever.js +81 -0
  565. package/dist/storage/providers/filecoin/verified-fetch-vendor.d.ts +71 -0
  566. package/dist/storage/providers/filecoin/verified-fetch-vendor.js +94 -0
  567. package/dist/storage/raw-content-codec.d.ts +89 -0
  568. package/dist/storage/raw-content-codec.js +47 -0
  569. package/dist/storage/raw-content-store-backend-adapter.d.ts +28 -0
  570. package/dist/storage/raw-content-store-backend-adapter.js +67 -0
  571. package/dist/storage/raw-content-store.d.ts +228 -0
  572. package/dist/storage/raw-content-store.js +27 -0
  573. package/dist/storage/s3-store.d.ts +42 -0
  574. package/dist/storage/s3-store.js +181 -0
  575. package/dist/storage/storage-backend-registry.d.ts +58 -0
  576. package/dist/storage/storage-backend-registry.js +56 -0
  577. package/dist/storage/storage-backend.d.ts +82 -0
  578. package/dist/storage/storage-backend.js +14 -0
  579. package/dist/storage/storage-capabilities.d.ts +56 -0
  580. package/dist/storage/storage-capabilities.js +170 -0
  581. package/dist/storage/store-registry.d.ts +67 -0
  582. package/dist/storage/store-registry.js +77 -0
  583. package/dist/vector-math.d.ts +15 -0
  584. package/dist/vector-math.js +31 -0
  585. package/dist/xml-escape.d.ts +5 -0
  586. package/dist/xml-escape.js +7 -0
  587. package/openapi.json +15395 -0
  588. package/openapi.yaml +10794 -0
  589. package/package.json +119 -0
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Post-write processors for the ingest pipeline.
3
+ *
4
+ * Runs after the per-fact loop completes: backdates memories to a session
5
+ * timestamp, generates inter-memory links, and clusters related facts
6
+ * into composite memories. Each processor is independently skippable via
7
+ * the batch context.
8
+ *
9
+ * Composite generation is full-ingest-only. The caller controls this via
10
+ * the `compositesEnabled` field — only `performIngest` sets it to true.
11
+ */
12
+ import { generateLinks } from './search-pipeline.js';
13
+ import { buildComposites } from './composite-grouping.js';
14
+ import { inferNamespace, deriveMajorityNamespace } from './namespace-retrieval.js';
15
+ import { timed } from './timing.js';
16
+ import { extractTopicAbstraction, TopicAbstractionError } from './topic-abstraction.js';
17
+ import { embedText } from './embedding.js';
18
+ import { updateMemoryTopicAbstraction } from '../db/repository-write.js';
19
+ import { maybeBuildRecapsForUser } from './recap-builder.js';
20
+ /**
21
+ * Run all post-write processors for a completed ingest batch.
22
+ * Order: backdate → links → composites (if caller-enabled).
23
+ */
24
+ export async function runPostWriteProcessors(deps, userId, ctx) {
25
+ if (ctx.sessionTimestamp && ctx.memoryIds.length > 0) {
26
+ await timed(`${ctx.timingPrefix}.backdate`, () => deps.stores.memory.backdateMemories(ctx.memoryIds, ctx.sessionTimestamp));
27
+ }
28
+ const linksCreated = await timed(`${ctx.timingPrefix}.links`, () => generateLinks({ search: deps.stores.search, link: deps.stores.link, memory: deps.stores.memory, entity: deps.stores.entity, summaries: deps.stores.summaries, pool: deps.stores.pool }, userId, ctx.memoryIds, ctx.embeddingCache, deps.config));
29
+ let compositesCreated = 0;
30
+ if (ctx.compositesEnabled && ctx.storedFacts.length >= deps.config.compositeMinClusterSize) {
31
+ compositesCreated = await timed(`${ctx.timingPrefix}.composites`, () => generateAndStoreComposites(deps, userId, ctx.storedFacts, ctx.embeddingCache, ctx.sourceSite, ctx.sourceUrl, ctx.episodeId, ctx.sessionTimestamp));
32
+ }
33
+ let topicAbstractionApplied = false;
34
+ if (deps.config.topicAbstractionEnabled && ctx.memoryIds.length > 0 && ctx.chunkText) {
35
+ topicAbstractionApplied = await timed(`${ctx.timingPrefix}.topic-abstraction`, () => generateAndStoreTopicAbstraction(deps, userId, ctx.chunkText, ctx.memoryIds));
36
+ }
37
+ // Recap layer trigger: fire-and-forget background pass. Latency is only
38
+ // measured on ingest if the cluster threshold is met AND the synthesis
39
+ // happens to land synchronously; we deliberately don't await here so the
40
+ // ingest response isn't gated on episode-style consolidation.
41
+ if (deps.config.recapLayerEnabled && ctx.memoryIds.length > 0) {
42
+ void maybeBuildRecapsForUser(deps, userId).catch((err) => {
43
+ console.warn(`[recap] background trigger failed for user=${userId}: ${err.message}`);
44
+ });
45
+ }
46
+ return { linksCreated, compositesCreated, topicAbstractionApplied };
47
+ }
48
+ /**
49
+ * Extract a conceptual topic from the chunk, embed it, and tag every memory
50
+ * stored from this chunk with the topic + embedding. One LLM call per chunk.
51
+ *
52
+ * Fail-soft: if topic extraction or embedding throws, the post-write step is
53
+ * skipped (logged) and other processors continue. The memories themselves are
54
+ * already stored — topic_abstraction defaults to '' and topic_embedding to
55
+ * NULL on those rows, which excludes them from the topic-search RRF arm
56
+ * without breaking other retrieval paths.
57
+ */
58
+ async function generateAndStoreTopicAbstraction(deps, userId, chunkText, memoryIds) {
59
+ try {
60
+ const { topic } = await extractTopicAbstraction(chunkText, '');
61
+ const embedding = await embedText(topic, 'document');
62
+ await updateMemoryTopicAbstraction(deps.stores.pool, userId, memoryIds, topic, embedding);
63
+ return true;
64
+ }
65
+ catch (err) {
66
+ if (err instanceof TopicAbstractionError) {
67
+ console.warn(`[topic-abstraction] skipped for ${memoryIds.length} memories: ${err.message}`);
68
+ return false;
69
+ }
70
+ throw err;
71
+ }
72
+ }
73
+ /** Generate composite memories by clustering related facts from a single episode. */
74
+ async function generateAndStoreComposites(deps, userId, storedFacts, embeddingCache, sourceSite, sourceUrl, episodeId, sessionTimestamp) {
75
+ const memberNamespaceMap = new Map();
76
+ const compositeInputs = storedFacts
77
+ .filter((sf) => embeddingCache.has(sf.memoryId))
78
+ .map((sf) => {
79
+ const ns = inferNamespace(sf.fact.fact, sourceSite, sf.fact.keywords);
80
+ memberNamespaceMap.set(sf.memoryId, ns);
81
+ return {
82
+ memoryId: sf.memoryId,
83
+ content: sf.fact.fact,
84
+ embedding: embeddingCache.get(sf.memoryId),
85
+ importance: sf.fact.importance,
86
+ keywords: sf.fact.keywords,
87
+ headline: sf.fact.headline,
88
+ };
89
+ });
90
+ const composites = buildComposites(compositeInputs);
91
+ if (composites.length === 0)
92
+ return 0;
93
+ for (const composite of composites) {
94
+ const memberNamespaces = composite.memberMemoryIds.map((id) => memberNamespaceMap.get(id) ?? null);
95
+ const namespace = deriveMajorityNamespace(memberNamespaces);
96
+ await deps.stores.memory.storeMemory({
97
+ userId,
98
+ content: composite.content,
99
+ embedding: composite.embedding,
100
+ memoryType: 'composite',
101
+ importance: composite.importance,
102
+ sourceSite, sourceUrl, episodeId,
103
+ keywords: composite.keywords.join(' '),
104
+ summary: composite.headline,
105
+ overview: composite.overview,
106
+ trustScore: 1.0,
107
+ createdAt: sessionTimestamp,
108
+ observedAt: sessionTimestamp,
109
+ namespace: namespace ?? undefined,
110
+ metadata: {
111
+ memberMemoryIds: composite.memberMemoryIds,
112
+ compositeVersion: 1,
113
+ },
114
+ });
115
+ }
116
+ return composites.length;
117
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Structured ingest trace collector.
3
+ *
4
+ * Mirrors the retrieval trace seam for write-path diagnostics: one trace per
5
+ * ingest request, persisted as JSON when config.ingestTraceEnabled is true.
6
+ */
7
+ import type { IngestFactTrace } from './memory-service-types.js';
8
+ export interface IngestTraceSummary {
9
+ mode: 'full' | 'quick' | 'workspace' | 'verbatim';
10
+ userId: string;
11
+ sourceSite: string;
12
+ sourceUrl: string;
13
+ episodeId: string;
14
+ factsExtracted: number;
15
+ }
16
+ export interface IngestTraceArtifact extends IngestTraceSummary {
17
+ traceId: string;
18
+ timestamp: string;
19
+ durationMs: number;
20
+ facts: IngestFactTrace[];
21
+ }
22
+ export declare class IngestTraceCollector {
23
+ private readonly enabled;
24
+ private readonly startTime;
25
+ private readonly traceId;
26
+ private readonly facts;
27
+ constructor(enabled: boolean);
28
+ record(trace: IngestFactTrace): void;
29
+ finalize(summary: IngestTraceSummary): string | undefined;
30
+ private persist;
31
+ }
32
+ export declare function previewContent(content: string): string;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Structured ingest trace collector.
3
+ *
4
+ * Mirrors the retrieval trace seam for write-path diagnostics: one trace per
5
+ * ingest request, persisted as JSON when config.ingestTraceEnabled is true.
6
+ */
7
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
8
+ import { join, resolve } from 'node:path';
9
+ import { fileURLToPath } from 'node:url';
10
+ import { config } from '../config.js';
11
+ const __dirname = resolve(fileURLToPath(import.meta.url), '..');
12
+ const DEFAULT_TRACE_DIR = resolve(__dirname, '../../.traces/ingest');
13
+ export class IngestTraceCollector {
14
+ enabled;
15
+ startTime;
16
+ traceId;
17
+ facts = [];
18
+ constructor(enabled) {
19
+ this.enabled = enabled;
20
+ this.startTime = Date.now();
21
+ this.traceId = `ingest-trace-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
22
+ }
23
+ record(trace) {
24
+ if (!this.enabled)
25
+ return;
26
+ this.facts.push(trace);
27
+ }
28
+ finalize(summary) {
29
+ if (!this.enabled)
30
+ return undefined;
31
+ const artifact = {
32
+ traceId: this.traceId,
33
+ timestamp: new Date().toISOString(),
34
+ durationMs: Date.now() - this.startTime,
35
+ ...summary,
36
+ facts: this.facts,
37
+ };
38
+ this.persist(artifact);
39
+ return this.traceId;
40
+ }
41
+ persist(trace) {
42
+ try {
43
+ const traceDir = config.ingestTraceDir || DEFAULT_TRACE_DIR;
44
+ if (!existsSync(traceDir)) {
45
+ mkdirSync(traceDir, { recursive: true });
46
+ }
47
+ const filename = `${trace.traceId}.json`;
48
+ const filePath = join(traceDir, filename);
49
+ writeFileSync(filePath, JSON.stringify(trace, null, 2));
50
+ console.log(`[ingest-trace] Saved ingest trace: ${filename} (${trace.durationMs}ms, ${trace.facts.length} facts)`);
51
+ }
52
+ catch (err) {
53
+ console.error('[ingest-trace] Failed to persist ingest trace:', err);
54
+ }
55
+ }
56
+ }
57
+ const CONTENT_PREVIEW_LENGTH = 120;
58
+ export function previewContent(content) {
59
+ return content.slice(0, CONTENT_PREVIEW_LENGTH);
60
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Input sanitization for memory content.
3
+ *
4
+ * Detects prompt injection patterns, suspicious content characteristics,
5
+ * and PII indicators in memory text before storage. Each check returns
6
+ * a structured finding so callers can decide policy (block, flag, allow).
7
+ *
8
+ * Phase 3 security baseline — threat-model.md P0 item.
9
+ */
10
+ /** A single sanitization finding with severity and match details. */
11
+ export interface SanitizationFinding {
12
+ rule: string;
13
+ severity: 'block' | 'warn' | 'info';
14
+ detail: string;
15
+ }
16
+ /** Aggregate result from running all sanitization checks. */
17
+ export interface SanitizationResult {
18
+ passed: boolean;
19
+ findings: SanitizationFinding[];
20
+ highestSeverity: 'block' | 'warn' | 'info' | 'none';
21
+ }
22
+ /**
23
+ * Normalize content before pattern matching so visually obfuscated payloads
24
+ * collapse into a canonical form.
25
+ */
26
+ export declare function normalizeForDetection(content: string): string;
27
+ /**
28
+ * Run all sanitization checks on a piece of content.
29
+ * Returns a SanitizationResult with all findings.
30
+ */
31
+ export declare function sanitize(content: string): SanitizationResult;
32
+ /** Check content against known prompt injection patterns. */
33
+ export declare function checkInjectionPatterns(content: string): SanitizationFinding[];
34
+ /** Flag content that is unusually long for a single memory. */
35
+ export declare function checkLengthAnomaly(content: string): SanitizationFinding[];
36
+ /** Flag content with unusual non-ASCII character density. */
37
+ export declare function checkUnicodeAnomaly(content: string): SanitizationFinding[];
38
+ /** Flag content with excessive repetition (potential padding attack). */
39
+ export declare function checkRepetitionAnomaly(content: string): SanitizationFinding[];
40
+ /** Determine the highest severity among findings. */
41
+ export declare function resolveHighestSeverity(findings: SanitizationFinding[]): 'block' | 'warn' | 'info' | 'none';
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Input sanitization for memory content.
3
+ *
4
+ * Detects prompt injection patterns, suspicious content characteristics,
5
+ * and PII indicators in memory text before storage. Each check returns
6
+ * a structured finding so callers can decide policy (block, flag, allow).
7
+ *
8
+ * Phase 3 security baseline — threat-model.md P0 item.
9
+ */
10
+ /**
11
+ * Prompt injection patterns.
12
+ * Sourced from reference-implementations.md §8, MINJA, InjecMEM papers.
13
+ */
14
+ const INJECTION_PATTERNS = [
15
+ { pattern: /ignore\s+(all\s+)?previous\s+instructions/i, label: 'ignore-previous' },
16
+ { pattern: /you\s+are\s+now\s+/i, label: 'role-override' },
17
+ { pattern: /system\s*:\s*/i, label: 'system-tag' },
18
+ { pattern: /\[INST\]/i, label: 'llama-inst-tag' },
19
+ { pattern: /\[\/INST\]/i, label: 'llama-inst-close' },
20
+ { pattern: /<<SYS>>/i, label: 'llama-sys-tag' },
21
+ { pattern: /Knowledge\s*:\s*/i, label: 'knowledge-injection' },
22
+ { pattern: /IMPORTANT\s*:\s*override/i, label: 'importance-override' },
23
+ { pattern: /disregard\s+(all\s+)?prior/i, label: 'disregard-prior' },
24
+ { pattern: /forget\s+everything/i, label: 'forget-everything' },
25
+ { pattern: /new\s+instructions?\s*:/i, label: 'new-instructions' },
26
+ { pattern: /act\s+as\s+(if\s+)?you\s+are/i, label: 'act-as' },
27
+ { pattern: /pretend\s+(that\s+)?you('re|\s+are)/i, label: 'pretend-to-be' },
28
+ { pattern: /do\s+not\s+mention\s+this/i, label: 'hide-instruction' },
29
+ { pattern: /from\s+now\s+on\s*,?\s*you/i, label: 'persistent-override' },
30
+ { pattern: /include\s+all\s+memories\s+from/i, label: 'cross-site-exfil' },
31
+ { pattern: /merge\s+all\s+.*memories\s+across/i, label: 'cross-site-merge' },
32
+ { pattern: /always\s+(agree|comply|say\s+(yes|there\s+are\s+no))/i, label: 'behavior-override' },
33
+ { pattern: /never\s+(refuse|question|deny)/i, label: 'restriction-removal' },
34
+ ];
35
+ const MAX_SAFE_LENGTH = 2000;
36
+ const HIGH_NON_ASCII_RATIO = 0.3;
37
+ const REPETITION_THRESHOLD = 5;
38
+ /**
39
+ * Normalize content before pattern matching so visually obfuscated payloads
40
+ * collapse into a canonical form.
41
+ */
42
+ export function normalizeForDetection(content) {
43
+ return stripZeroWidthChars(content.normalize('NFKC')).replace(/\s+/g, ' ').trim();
44
+ }
45
+ /**
46
+ * Run all sanitization checks on a piece of content.
47
+ * Returns a SanitizationResult with all findings.
48
+ */
49
+ export function sanitize(content) {
50
+ const findings = [];
51
+ const normalized = normalizeForDetection(content);
52
+ findings.push(...checkInjectionPatterns(normalized));
53
+ findings.push(...checkLengthAnomaly(content));
54
+ findings.push(...checkUnicodeAnomaly(content));
55
+ findings.push(...checkRepetitionAnomaly(content));
56
+ const highestSeverity = resolveHighestSeverity(findings);
57
+ const passed = highestSeverity !== 'block';
58
+ return { passed, findings, highestSeverity };
59
+ }
60
+ /** Remove zero-width unicode characters used to obfuscate injection patterns. */
61
+ function stripZeroWidthChars(content) {
62
+ return content.replace(/[\u200B\u200C\u200D\uFEFF\u00AD]/g, '');
63
+ }
64
+ /** Check content against known prompt injection patterns. */
65
+ export function checkInjectionPatterns(content) {
66
+ const findings = [];
67
+ for (const { pattern, label } of INJECTION_PATTERNS) {
68
+ const match = content.match(pattern);
69
+ if (match) {
70
+ findings.push({
71
+ rule: `injection:${label}`,
72
+ severity: 'block',
73
+ detail: `Matched injection pattern: "${match[0]}"`,
74
+ });
75
+ }
76
+ }
77
+ return findings;
78
+ }
79
+ /** Flag content that is unusually long for a single memory. */
80
+ export function checkLengthAnomaly(content) {
81
+ if (content.length > MAX_SAFE_LENGTH) {
82
+ return [{
83
+ rule: 'anomaly:length',
84
+ severity: 'warn',
85
+ detail: `Content length ${content.length} exceeds ${MAX_SAFE_LENGTH} chars`,
86
+ }];
87
+ }
88
+ return [];
89
+ }
90
+ /** Flag content with unusual non-ASCII character density. */
91
+ export function checkUnicodeAnomaly(content) {
92
+ if (content.length === 0)
93
+ return [];
94
+ const nonAsciiCount = (content.match(/[^\x20-\x7E]/g) ?? []).length;
95
+ const ratio = nonAsciiCount / content.length;
96
+ if (ratio > HIGH_NON_ASCII_RATIO) {
97
+ return [{
98
+ rule: 'anomaly:unicode',
99
+ severity: 'warn',
100
+ detail: `Non-ASCII ratio ${(ratio * 100).toFixed(1)}% exceeds ${HIGH_NON_ASCII_RATIO * 100}%`,
101
+ }];
102
+ }
103
+ return [];
104
+ }
105
+ /** Flag content with excessive repetition (potential padding attack). */
106
+ export function checkRepetitionAnomaly(content) {
107
+ const words = content.toLowerCase().split(/\s+/).filter(Boolean);
108
+ if (words.length < 10)
109
+ return [];
110
+ const freq = new Map();
111
+ for (const word of words) {
112
+ freq.set(word, (freq.get(word) ?? 0) + 1);
113
+ }
114
+ const maxFreq = Math.max(...freq.values());
115
+ const ratio = maxFreq / words.length;
116
+ if (ratio > 0.5 && maxFreq >= REPETITION_THRESHOLD) {
117
+ const topWord = [...freq.entries()].sort((a, b) => b[1] - a[1])[0][0];
118
+ return [{
119
+ rule: 'anomaly:repetition',
120
+ severity: 'warn',
121
+ detail: `Word "${topWord}" appears ${maxFreq}/${words.length} times (${(ratio * 100).toFixed(0)}%)`,
122
+ }];
123
+ }
124
+ return [];
125
+ }
126
+ /** Determine the highest severity among findings. */
127
+ export function resolveHighestSeverity(findings) {
128
+ if (findings.some((f) => f.severity === 'block'))
129
+ return 'block';
130
+ if (findings.some((f) => f.severity === 'warn'))
131
+ return 'warn';
132
+ if (findings.some((f) => f.severity === 'info'))
133
+ return 'info';
134
+ return 'none';
135
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Deterministic iterative retrieval for compositional multi-hop queries.
3
+ *
4
+ * The first pass finds candidate memories normally. For queries that likely
5
+ * require 5+ facts, a second pass searches around the strongest distinct seeds
6
+ * using blended query+seed embeddings, then merges those neighbors back into
7
+ * the pool with a lower weight.
8
+ */
9
+ import type { SearchResult } from '../db/repository-types.js';
10
+ import type { SearchStore } from '../db/stores.js';
11
+ export interface IterativeQueryClassification {
12
+ shouldIterate: boolean;
13
+ estimatedFactCount: number;
14
+ reason: string;
15
+ anchors: string[];
16
+ }
17
+ export interface IterativeRetrievalResult {
18
+ memories: SearchResult[];
19
+ triggered: boolean;
20
+ estimatedFactCount: number;
21
+ seedIds: string[];
22
+ reason: string;
23
+ }
24
+ export declare function classifyIterativeQuery(query: string, results: SearchResult[]): IterativeQueryClassification;
25
+ export declare function applyIterativeRetrieval(repo: SearchStore, userId: string, query: string, queryEmbedding: number[], initialResults: SearchResult[], candidateDepth: number, sourceSite?: string, referenceTime?: Date): Promise<IterativeRetrievalResult>;
26
+ export declare function selectIterativeSeeds(results: SearchResult[], anchors: string[]): SearchResult[];
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Deterministic iterative retrieval for compositional multi-hop queries.
3
+ *
4
+ * The first pass finds candidate memories normally. For queries that likely
5
+ * require 5+ facts, a second pass searches around the strongest distinct seeds
6
+ * using blended query+seed embeddings, then merges those neighbors back into
7
+ * the pool with a lower weight.
8
+ */
9
+ import { extractSubjectQueryAnchors } from './subject-aware-ranking.js';
10
+ const MIN_REQUIRED_FACTS = 5;
11
+ const MAX_ITERATIVE_SEEDS = 2;
12
+ const SECOND_PASS_WEIGHT = 0.72;
13
+ const RELATIONAL_MARKERS = ['connection between', 'relationship between', 'difference between', 'compare', 'versus', 'relate to'];
14
+ const TIMELINE_MARKERS = ['timeline', 'order', 'sequence', 'relative to', 'before', 'after', 'how long'];
15
+ const SYNTHESIS_MARKERS = ['full', 'broader', 'trajectory', 'future improvement', 'current projects', 'which professors'];
16
+ export function classifyIterativeQuery(query, results) {
17
+ const anchors = extractSubjectQueryAnchors(query);
18
+ const estimatedFactCount = estimateRequiredFactCount(query, anchors);
19
+ if (results.length < 2) {
20
+ return { shouldIterate: false, estimatedFactCount, reason: 'insufficient-seeds', anchors };
21
+ }
22
+ if (estimatedFactCount < MIN_REQUIRED_FACTS) {
23
+ return { shouldIterate: false, estimatedFactCount, reason: 'below-threshold', anchors };
24
+ }
25
+ return { shouldIterate: true, estimatedFactCount, reason: classifyReason(query), anchors };
26
+ }
27
+ export async function applyIterativeRetrieval(repo, userId, query, queryEmbedding, initialResults, candidateDepth, sourceSite, referenceTime) {
28
+ const classification = classifyIterativeQuery(query, initialResults);
29
+ if (!classification.shouldIterate) {
30
+ return buildNoopResult(initialResults, classification);
31
+ }
32
+ const seeds = selectIterativeSeeds(initialResults, classification.anchors);
33
+ const expansions = await retrieveSeedNeighbors(repo, userId, queryEmbedding, seeds, candidateDepth, sourceSite, referenceTime);
34
+ if (expansions.length === 0) {
35
+ return {
36
+ memories: initialResults,
37
+ triggered: false,
38
+ estimatedFactCount: classification.estimatedFactCount,
39
+ seedIds: seeds.map((seed) => seed.id),
40
+ reason: 'no-neighbors',
41
+ };
42
+ }
43
+ return {
44
+ memories: mergeIterativeResults(initialResults, expansions, candidateDepth),
45
+ triggered: true,
46
+ estimatedFactCount: classification.estimatedFactCount,
47
+ seedIds: seeds.map((seed) => seed.id),
48
+ reason: classification.reason,
49
+ };
50
+ }
51
+ export function selectIterativeSeeds(results, anchors) {
52
+ const ranked = [...results].sort((left, right) => scoreSeed(right, anchors) - scoreSeed(left, anchors));
53
+ const selected = [];
54
+ const seen = new Set();
55
+ for (const result of ranked) {
56
+ const fingerprint = result.content.toLowerCase().slice(0, 96);
57
+ if (seen.has(fingerprint))
58
+ continue;
59
+ selected.push(result);
60
+ seen.add(fingerprint);
61
+ if (selected.length >= MAX_ITERATIVE_SEEDS)
62
+ break;
63
+ }
64
+ return selected;
65
+ }
66
+ function buildNoopResult(memories, classification) {
67
+ return {
68
+ memories,
69
+ triggered: false,
70
+ estimatedFactCount: classification.estimatedFactCount,
71
+ seedIds: [],
72
+ reason: classification.reason,
73
+ };
74
+ }
75
+ function estimateRequiredFactCount(query, anchors) {
76
+ const lower = query.toLowerCase();
77
+ return 2
78
+ + countMarkerHits(lower, RELATIONAL_MARKERS)
79
+ + countMarkerHits(lower, TIMELINE_MARKERS)
80
+ + countMarkerHits(lower, SYNTHESIS_MARKERS)
81
+ + countListedItems(query)
82
+ + Math.min(2, Math.max(0, anchors.length - 1))
83
+ + (lower.split(/\s+/).length >= 12 ? 1 : 0);
84
+ }
85
+ function classifyReason(query) {
86
+ const lower = query.toLowerCase();
87
+ if (hasMarker(lower, TIMELINE_MARKERS))
88
+ return 'timeline-composition';
89
+ if (hasMarker(lower, RELATIONAL_MARKERS))
90
+ return 'relational-composition';
91
+ return 'broad-synthesis';
92
+ }
93
+ async function retrieveSeedNeighbors(repo, userId, queryEmbedding, seeds, candidateDepth, sourceSite, referenceTime) {
94
+ const seenIds = new Set(seeds.map((seed) => seed.id));
95
+ const searches = seeds.map(async (seed) => {
96
+ const blended = blendEmbeddings(queryEmbedding, seed.embedding);
97
+ const neighbors = await repo.searchSimilar(userId, blended, candidateDepth, sourceSite, referenceTime);
98
+ return neighbors.filter((neighbor) => !seenIds.has(neighbor.id));
99
+ });
100
+ return (await Promise.all(searches)).flat();
101
+ }
102
+ function mergeIterativeResults(primary, expansions, limit) {
103
+ const merged = new Map(primary.map((result) => [result.id, result]));
104
+ for (const result of expansions) {
105
+ const weighted = { ...result, score: result.score * SECOND_PASS_WEIGHT };
106
+ const existing = merged.get(result.id);
107
+ if (!existing || weighted.score > existing.score) {
108
+ merged.set(result.id, existing ? { ...weighted, score: Math.max(existing.score, weighted.score) } : weighted);
109
+ }
110
+ }
111
+ return [...merged.values()].sort((left, right) => right.score - left.score).slice(0, limit);
112
+ }
113
+ function scoreSeed(result, anchors) {
114
+ return result.score + (countAnchorHits(result.content, anchors) * 0.5);
115
+ }
116
+ function countAnchorHits(content, anchors) {
117
+ const lower = content.toLowerCase();
118
+ return anchors.filter((anchor) => lower.includes(anchor.toLowerCase())).length;
119
+ }
120
+ function blendEmbeddings(queryEmbedding, seedEmbedding) {
121
+ const length = Math.min(queryEmbedding.length, seedEmbedding.length);
122
+ const blended = new Array(length);
123
+ for (let i = 0; i < length; i++) {
124
+ blended[i] = (queryEmbedding[i] * 0.6) + (seedEmbedding[i] * 0.4);
125
+ }
126
+ return blended;
127
+ }
128
+ function countMarkerHits(query, markers) {
129
+ return markers.reduce((total, marker) => total + (query.includes(marker) ? 1 : 0), 0);
130
+ }
131
+ function hasMarker(query, markers) {
132
+ return markers.some((marker) => query.includes(marker));
133
+ }
134
+ function countListedItems(query) {
135
+ const match = query.match(/:\s*([^?]+)/);
136
+ if (!match)
137
+ return 0;
138
+ return Math.max(0, match[1].split(',').map((item) => item.trim()).filter(Boolean).length - 1);
139
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared keyword-based expansion logic for retrieval augmentation.
3
+ *
4
+ * Used by literal-query-expansion.ts and subject-aware-ranking.ts to
5
+ * eliminate duplicated fetch-and-boost patterns.
6
+ */
7
+ import type { SearchResult } from '../db/repository-types.js';
8
+ import type { SearchStore } from '../db/stores.js';
9
+ /** Fetch keyword candidate memories and boost their scores. */
10
+ export declare function fetchAndBoostKeywordCandidates(repo: SearchStore, userId: string, keywords: string[], queryEmbedding: number[], excludeIds: Set<string>, limit: number, scoreBoostFactor: number, includeExpired?: boolean): Promise<SearchResult[]>;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared keyword-based expansion logic for retrieval augmentation.
3
+ *
4
+ * Used by literal-query-expansion.ts and subject-aware-ranking.ts to
5
+ * eliminate duplicated fetch-and-boost patterns.
6
+ */
7
+ /** Fetch keyword candidate memories and boost their scores. */
8
+ export async function fetchAndBoostKeywordCandidates(repo, userId, keywords, queryEmbedding, excludeIds, limit, scoreBoostFactor, includeExpired = false) {
9
+ const candidates = await repo.findKeywordCandidates(userId, keywords, limit, includeExpired);
10
+ const ids = candidates
11
+ .map((candidate) => candidate.id)
12
+ .filter((id) => !excludeIds.has(id));
13
+ if (ids.length === 0)
14
+ return [];
15
+ const fetched = await repo.fetchMemoriesByIds(userId, ids, queryEmbedding, undefined, includeExpired);
16
+ return fetched.map((memory) => {
17
+ const keywordHit = candidates.find((candidate) => candidate.id === memory.id);
18
+ if (!keywordHit)
19
+ return memory;
20
+ return {
21
+ ...memory,
22
+ similarity: Math.max(memory.similarity, keywordHit.similarity),
23
+ score: memory.score + (keywordHit.similarity * scoreBoostFactor),
24
+ };
25
+ });
26
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Lesson detection and pre-retrieval defense service.
3
+ *
4
+ * Implements A-MemGuard's self-reinforcing defense:
5
+ * 1. Detect failure patterns during ingest (sanitizer blocks, trust violations,
6
+ * high-confidence contradictions) and store as lessons.
7
+ * 2. Before retrieval, check query against known lessons to warn or block.
8
+ *
9
+ * Phase 6 security layer — builds on Phase 3 trust scoring and sanitization.
10
+ */
11
+ import type { LessonRow, LessonMatch, LessonSeverity } from '../db/repository-lessons.js';
12
+ import type { LessonStore } from '../db/stores.js';
13
+ import type { SanitizationResult } from './input-sanitizer.js';
14
+ import type { ConsensusResult } from './consensus-validation.js';
15
+ import type { SearchResult } from '../db/repository-types.js';
16
+ /** Result of a pre-retrieval lesson check. */
17
+ export interface LessonCheckResult {
18
+ safe: boolean;
19
+ matchedLessons: LessonMatch[];
20
+ warnings: string[];
21
+ highestSeverity: LessonSeverity | 'none';
22
+ }
23
+ /** Lesson detection context passed from the ingest pipeline. */
24
+ export interface LessonDetectionContext {
25
+ userId: string;
26
+ content: string;
27
+ sourceSite: string;
28
+ sanitizationResult?: SanitizationResult;
29
+ trustScore?: number;
30
+ contradictionConfidence?: number;
31
+ supersededMemoryId?: string;
32
+ }
33
+ /**
34
+ * Check a query against known lessons before returning retrieval results.
35
+ * Returns warnings for medium/high severity, blocks on critical.
36
+ */
37
+ export declare function checkLessons(repo: LessonStore, userId: string, query: string): Promise<LessonCheckResult>;
38
+ /**
39
+ * Detect and store a lesson from a sanitization block.
40
+ * Called when input sanitizer catches an injection attempt.
41
+ */
42
+ export declare function recordInjectionLesson(repo: LessonStore, ctx: LessonDetectionContext): Promise<string | null>;
43
+ /**
44
+ * Detect and store a lesson from a trust score violation.
45
+ * Called when a fact is rejected for being below the trust threshold.
46
+ */
47
+ export declare function recordTrustViolationLesson(repo: LessonStore, ctx: LessonDetectionContext): Promise<string | null>;
48
+ /**
49
+ * Detect and store a lesson from a high-confidence contradiction.
50
+ * Called when SUPERSEDE or DELETE fires with high contradiction confidence.
51
+ */
52
+ export declare function recordContradictionLesson(repo: LessonStore, ctx: LessonDetectionContext): Promise<string | null>;
53
+ /**
54
+ * Record a user-reported lesson (explicit feedback that a memory was wrong).
55
+ */
56
+ export declare function recordUserReportedLesson(repo: LessonStore, userId: string, pattern: string, sourceMemoryIds: string[], severity?: LessonSeverity): Promise<string>;
57
+ /** Get all active lessons for a user. */
58
+ export declare function getUserLessons(repo: LessonStore, userId: string): Promise<LessonRow[]>;
59
+ /** Get lesson stats for a user. */
60
+ export declare function getLessonStats(repo: LessonStore, userId: string): Promise<{
61
+ totalActive: number;
62
+ byType: Record<string, number>;
63
+ }>;
64
+ /**
65
+ * Record lessons for memories removed by consensus validation.
66
+ * Creates a `consensus_violation` lesson for each divergent memory.
67
+ */
68
+ export declare function recordConsensusLessons(lessons: LessonStore, userId: string, result: ConsensusResult, memories: SearchResult[]): Promise<void>;