@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,97 @@
1
+ /**
2
+ * MSR cross-conversation aggregator.
3
+ *
4
+ * Retrieval-side intervention for multi-session-reasoning queries. v39-multihop
5
+ * diagnostic on v26 MSR failures: gold facts WERE in the top-K but spread
6
+ * across 2-4 conversations; the answer LLM could not synthesize them and
7
+ * returned inflated counts ("Twenty-three" vs gold "Four").
8
+ *
9
+ * Strategy: group retrieved memories by `episode_id` (= conversation id in
10
+ * BEAM). For each group with >=2 memories, emit a 1-sentence summary via the
11
+ * configured chat LLM (cheap — defaults to Haiku). Groups with a single
12
+ * memory pass through verbatim (no LLM call). The concatenated
13
+ * `## CONVERSATION N SUMMARY` blocks become an additional channel BEFORE
14
+ * the standard OBSERVATIONS / TIMELINE / ENTITY_STATE blocks.
15
+ *
16
+ * Fail-closed: any LLM error during summarization throws — no silent
17
+ * fallback to raw text. Matches the AUDN mutation invariant.
18
+ */
19
+ const DEFAULT_MAX_TOKENS = 80;
20
+ const NO_EPISODE_KEY = '__no_episode__';
21
+ /** Group retrieved memories by episode_id, preserving first-seen order. */
22
+ function groupByEpisode(memories) {
23
+ const groups = new Map();
24
+ for (const memory of memories) {
25
+ const key = memory.episode_id ?? NO_EPISODE_KEY;
26
+ const existing = groups.get(key);
27
+ if (existing) {
28
+ existing.push(memory);
29
+ }
30
+ else {
31
+ groups.set(key, [memory]);
32
+ }
33
+ }
34
+ return Array.from(groups.entries()).map(([key, mems]) => ({ key, memories: mems }));
35
+ }
36
+ /** Build the LLM prompt for a single conversation-summary call. */
37
+ function buildSummaryPrompt(query, memories) {
38
+ const factLines = memories.map((m, i) => `${i + 1}. ${m.content}`).join('\n');
39
+ const system = 'You summarize what was discussed in one conversation. Output exactly one ' +
40
+ 'concise sentence (max ~30 words) that captures only what relates to the ' +
41
+ "user's question. Do not invent facts. Do not list — write one sentence.";
42
+ const user = `User's question: ${query}\n\n` +
43
+ `Facts retrieved from this conversation:\n${factLines}\n\n` +
44
+ 'One-sentence summary of what was discussed in this conversation that ' +
45
+ "relates to the user's question:";
46
+ return [
47
+ { role: 'system', content: system },
48
+ { role: 'user', content: user },
49
+ ];
50
+ }
51
+ /**
52
+ * Summarize a single conversation group via the chat LLM. Fail-closed: if the
53
+ * LLM throws or returns an empty string, this re-throws with context — no
54
+ * silent fallback.
55
+ */
56
+ async function summarizeGroup(group, query, deps) {
57
+ const messages = buildSummaryPrompt(query, group.memories);
58
+ const text = await deps.llm.chat(messages, {
59
+ temperature: 0,
60
+ maxTokens: deps.maxTokensPerSummary ?? DEFAULT_MAX_TOKENS,
61
+ });
62
+ const trimmed = text.trim();
63
+ if (trimmed.length === 0) {
64
+ throw new Error(`msr-aggregator: LLM returned empty summary for episode_id=${group.key}`);
65
+ }
66
+ return trimmed;
67
+ }
68
+ /**
69
+ * Render a single memory's content verbatim — used for groups with exactly
70
+ * one memory, where summarization would only add LLM cost without
71
+ * cross-source synthesis benefit.
72
+ */
73
+ function renderPassthrough(group) {
74
+ return group.memories[0].content.trim();
75
+ }
76
+ /**
77
+ * Build the per-conversation aggregated string. Groups are 1-indexed by
78
+ * first-seen episode order. Multi-memory groups go through the LLM; single-
79
+ * memory groups pass through verbatim.
80
+ *
81
+ * Returns an empty string when there are no retrieved memories — caller
82
+ * should treat that as "no MSR channel to add" and skip the prefix.
83
+ */
84
+ export async function aggregateByConversation(memories, query, deps) {
85
+ if (memories.length === 0)
86
+ return '';
87
+ const groups = groupByEpisode(memories);
88
+ const sections = [];
89
+ for (let i = 0; i < groups.length; i++) {
90
+ const group = groups[i];
91
+ const body = group.memories.length >= 2
92
+ ? await summarizeGroup(group, query, deps)
93
+ : renderPassthrough(group);
94
+ sections.push(`## CONVERSATION ${i + 1} SUMMARY\n${body}`);
95
+ }
96
+ return sections.join('\n\n');
97
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * MSR (Multi-Session Reasoning) query detector — pure regex, no LLM.
3
+ *
4
+ * Distinct from the Phase 2 deterministic specialist in
5
+ * `services/specialists/msr-specialist.ts`. That module is an ANSWER-side
6
+ * specialist: it short-circuits the answer LLM and emits a number-word.
7
+ *
8
+ * THIS module is a RETRIEVAL-side classifier: when true, the caller (see
9
+ * `memory-search.ts`) inserts a cross-conversation aggregation channel into
10
+ * the injection text BEFORE the answer LLM sees the retrieved chunks.
11
+ *
12
+ * MSR queries explicitly span multiple conversations or sessions, e.g.
13
+ * "across my conversations", "different X I mentioned", "throughout all my
14
+ * chats". Single-conversation queries (KU, IE, SUM, CR) return false.
15
+ *
16
+ * v39-multihop diagnostic on v26 MSR failures showed gold facts WERE in the
17
+ * top-K but spread across 2-4 conversations; the answer LLM could not
18
+ * synthesize across them and gave inflated or noisy counts.
19
+ */
20
+ /**
21
+ * Returns true iff the query explicitly references cross-conversation /
22
+ * cross-session aggregation. Pure regex, deterministic, no side effects.
23
+ *
24
+ * Examples that return true:
25
+ * - "How many different user roles ... across my sessions?"
26
+ * - "How many different features ... across my weather app conversations?"
27
+ * - "What different topics have I discussed across all my chats?"
28
+ *
29
+ * Examples that return false:
30
+ * - "What's the latest version of my dashboard?" (KU)
31
+ * - "When does my first sprint end?" (IE)
32
+ * - "Summarize my budget tracker project" (SUM)
33
+ * - "Have I ever worked on Flask routes?" (CR — single-conversation lookup)
34
+ */
35
+ export declare function isMsrQuery(query: string): boolean;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * MSR (Multi-Session Reasoning) query detector — pure regex, no LLM.
3
+ *
4
+ * Distinct from the Phase 2 deterministic specialist in
5
+ * `services/specialists/msr-specialist.ts`. That module is an ANSWER-side
6
+ * specialist: it short-circuits the answer LLM and emits a number-word.
7
+ *
8
+ * THIS module is a RETRIEVAL-side classifier: when true, the caller (see
9
+ * `memory-search.ts`) inserts a cross-conversation aggregation channel into
10
+ * the injection text BEFORE the answer LLM sees the retrieved chunks.
11
+ *
12
+ * MSR queries explicitly span multiple conversations or sessions, e.g.
13
+ * "across my conversations", "different X I mentioned", "throughout all my
14
+ * chats". Single-conversation queries (KU, IE, SUM, CR) return false.
15
+ *
16
+ * v39-multihop diagnostic on v26 MSR failures showed gold facts WERE in the
17
+ * top-K but spread across 2-4 conversations; the answer LLM could not
18
+ * synthesize across them and gave inflated or noisy counts.
19
+ */
20
+ /**
21
+ * MSR trigger patterns. Each pattern targets a phrase that explicitly signals
22
+ * cross-conversation aggregation. Patterns are tested case-insensitively and
23
+ * combined via OR — any match returns true.
24
+ */
25
+ const MSR_PATTERNS = [
26
+ // "across my conversations / sessions / chats / weather app conversations"
27
+ /\bacross (?:my |all (?:my )?)?(?:conversations?|sessions?|chats?)\b/i,
28
+ /\bacross (?:my |all (?:my )?)?\w+(?:\s+\w+)?\s+(?:conversations?|sessions?|chats?)\b/i,
29
+ // "throughout all my conversations / chats"
30
+ /\bthroughout (?:all )?(?:my )?(?:conversations?|sessions?|chats?)\b/i,
31
+ // "different X I mentioned / talked about / discussed"
32
+ /\bdifferent\b[^?.]*\b(?:mentioned|talked|discussed|brought up|wanted|tried)\b/i,
33
+ // "how many X did I talk about / discuss / mention"
34
+ /\bhow many\b[^?.]*\b(?:talked|discussed|mentioned|chatted|wrote)\b/i,
35
+ // "what (different) topics / features / concerns have I (ever) X across"
36
+ /\b(?:what|which)\b[^?.]*\bacross (?:my |all (?:my )?)?(?:conversations?|sessions?|chats?)\b/i,
37
+ // "across (my|all (my)?) sessions" with possessive forms
38
+ /\bacross\s+all\s+(?:my\s+)?(?:conversations?|sessions?|chats?)\b/i,
39
+ // "in (any of|all of) my conversations / chats"
40
+ /\bin (?:any|all) of (?:my )?(?:conversations?|sessions?|chats?)\b/i,
41
+ ];
42
+ /**
43
+ * Returns true iff the query explicitly references cross-conversation /
44
+ * cross-session aggregation. Pure regex, deterministic, no side effects.
45
+ *
46
+ * Examples that return true:
47
+ * - "How many different user roles ... across my sessions?"
48
+ * - "How many different features ... across my weather app conversations?"
49
+ * - "What different topics have I discussed across all my chats?"
50
+ *
51
+ * Examples that return false:
52
+ * - "What's the latest version of my dashboard?" (KU)
53
+ * - "When does my first sprint end?" (IE)
54
+ * - "Summarize my budget tracker project" (SUM)
55
+ * - "Have I ever worked on Flask routes?" (CR — single-conversation lookup)
56
+ */
57
+ export function isMsrQuery(query) {
58
+ if (!query || query.length === 0)
59
+ return false;
60
+ for (const pattern of MSR_PATTERNS) {
61
+ if (pattern.test(query))
62
+ return true;
63
+ }
64
+ return false;
65
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Namespace-Aware Retrieval — hierarchical scope narrowing for memories.
3
+ *
4
+ * Adds project/topic/scope-aware retrieval as a pre-filter before vector
5
+ * search. Memories are tagged with a slash-separated namespace path
6
+ * (e.g., "project/atomicmem/docs", "user/preferences/editor") and
7
+ * retrieval can be scoped to a namespace prefix.
8
+ *
9
+ * Namespace hierarchy (Phase 2 Canonical Taxonomy):
10
+ * - "user/preferences/*"
11
+ * - "user/memories/*"
12
+ * - "project/{project}/docs/*"
13
+ * - "project/{project}/decisions/*"
14
+ * - "project/{project}/tasks/*"
15
+ * - "agent/{agent}/skills/*"
16
+ * - "agent/{agent}/task-memories/*"
17
+ * - "workspace/{workspace}/shared/*"
18
+ *
19
+ * This implements Phase 2's "Canonical Namespaces" from the
20
+ * OpenViking integration design (2026-03-20).
21
+ */
22
+ /** A slash-separated namespace path. */
23
+ export type Namespace = string;
24
+ /**
25
+ * Parse a namespace string into its hierarchical segments.
26
+ * "project/atomicmem/docs" → ["project", "atomicmem", "docs"]
27
+ */
28
+ export declare function parseNamespace(ns: string): string[];
29
+ /**
30
+ * Return all ancestor scopes from root to leaf.
31
+ * "project/atomicmem/docs" → ["project", "project/atomicmem", "project/atomicmem/docs"]
32
+ */
33
+ export declare function getAncestorScopes(ns: string): string[];
34
+ /**
35
+ * Check if a memory's namespace matches a query scope.
36
+ * A scope matches if the memory's namespace starts with the scope prefix.
37
+ */
38
+ export declare function isInScope(memoryNamespace: string | null, queryScope: string | null): boolean;
39
+ /**
40
+ * Build a SQL WHERE clause for namespace prefix matching.
41
+ * Uses LIKE with escaped delimiters for prefix matching.
42
+ */
43
+ export declare function buildNamespaceClause(scope: string | null, paramOffset: number): {
44
+ clause: string;
45
+ params: unknown[];
46
+ } | null;
47
+ /**
48
+ * Use LLM to classify a memory into the canonical taxonomy.
49
+ */
50
+ export declare function classifyNamespace(content: string, sourceSite: string, keywords: string[]): Promise<string>;
51
+ /**
52
+ * Extract a legacy namespace suggestion from memory content.
53
+ * Retained for fallback and non-LLM paths.
54
+ */
55
+ export declare function inferNamespace(content: string, sourceSite: string, keywords: string[]): string | null;
56
+ /**
57
+ * Derive a namespace for a composite from the namespaces of its member atomics.
58
+ * Returns the most common non-null namespace. If all members are null, returns null.
59
+ */
60
+ export declare function deriveMajorityNamespace(memberNamespaces: Array<string | null>): string | null;
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Namespace-Aware Retrieval — hierarchical scope narrowing for memories.
3
+ *
4
+ * Adds project/topic/scope-aware retrieval as a pre-filter before vector
5
+ * search. Memories are tagged with a slash-separated namespace path
6
+ * (e.g., "project/atomicmem/docs", "user/preferences/editor") and
7
+ * retrieval can be scoped to a namespace prefix.
8
+ *
9
+ * Namespace hierarchy (Phase 2 Canonical Taxonomy):
10
+ * - "user/preferences/*"
11
+ * - "user/memories/*"
12
+ * - "project/{project}/docs/*"
13
+ * - "project/{project}/decisions/*"
14
+ * - "project/{project}/tasks/*"
15
+ * - "agent/{agent}/skills/*"
16
+ * - "agent/{agent}/task-memories/*"
17
+ * - "workspace/{workspace}/shared/*"
18
+ *
19
+ * This implements Phase 2's "Canonical Namespaces" from the
20
+ * OpenViking integration design (2026-03-20).
21
+ */
22
+ import { llm } from './llm.js';
23
+ /**
24
+ * Parse a namespace string into its hierarchical segments.
25
+ * "project/atomicmem/docs" → ["project", "atomicmem", "docs"]
26
+ */
27
+ export function parseNamespace(ns) {
28
+ if (!ns || ns.trim() === '')
29
+ return [];
30
+ // Support both dot and slash during transition
31
+ const delimiter = ns.includes('/') ? '/' : '.';
32
+ return ns.split(delimiter).filter(Boolean);
33
+ }
34
+ /**
35
+ * Return all ancestor scopes from root to leaf.
36
+ * "project/atomicmem/docs" → ["project", "project/atomicmem", "project/atomicmem/docs"]
37
+ */
38
+ export function getAncestorScopes(ns) {
39
+ const segments = parseNamespace(ns);
40
+ return segments.map((_, index) => segments.slice(0, index + 1).join(ns.includes('/') ? '/' : '.'));
41
+ }
42
+ /**
43
+ * Check if a memory's namespace matches a query scope.
44
+ * A scope matches if the memory's namespace starts with the scope prefix.
45
+ */
46
+ export function isInScope(memoryNamespace, queryScope) {
47
+ if (queryScope === null || queryScope === '')
48
+ return true;
49
+ if (memoryNamespace === null || memoryNamespace === '')
50
+ return true;
51
+ const scopeSegments = parseNamespace(queryScope);
52
+ const memorySegments = parseNamespace(memoryNamespace);
53
+ if (memorySegments.length < scopeSegments.length)
54
+ return false;
55
+ for (let i = 0; i < scopeSegments.length; i++) {
56
+ if (memorySegments[i].toLowerCase() !== scopeSegments[i].toLowerCase())
57
+ return false;
58
+ }
59
+ return true;
60
+ }
61
+ /**
62
+ * Build a SQL WHERE clause for namespace prefix matching.
63
+ * Uses LIKE with escaped delimiters for prefix matching.
64
+ */
65
+ export function buildNamespaceClause(scope, paramOffset) {
66
+ if (!scope || scope.trim() === '')
67
+ return null;
68
+ const escaped = scope.replace(/[%_\\]/g, '\\$&');
69
+ // Support both dot and slash prefix matching
70
+ const delimiter = scope.includes('/') ? '/' : '.';
71
+ return {
72
+ clause: `(m.namespace IS NULL OR m.namespace = $${paramOffset + 1} OR m.namespace LIKE $${paramOffset + 2})`,
73
+ params: [scope, `${escaped}${delimiter}%`],
74
+ };
75
+ }
76
+ const CLASSIFICATION_PROMPT = `You are a memory classifier. Categorize the given memory into the most appropriate canonical namespace.
77
+
78
+ TAXONOMY:
79
+ - user/preferences: Likes, dislikes, editor settings, UI preferences
80
+ - user/memories: Personal facts, life events, non-technical context
81
+ - project/{name}/docs: Documentation, architectural plans, guides
82
+ - project/{name}/decisions: Key technical or product decisions made
83
+ - project/{name}/tasks: Task progress, TODOs, bugs
84
+ - agent/{name}/skills: Capability descriptions, tool usage patterns
85
+ - agent/{name}/task-memories: Private working memory for specific tasks
86
+ - workspace/shared: General knowledge or facts shared across all agents
87
+
88
+ RULES:
89
+ - Respond ONLY with the namespace path (e.g. "project/atomicmem/decisions").
90
+ - Replace {name} with the actual project or agent name found in context.
91
+ - Use lowercase and slashes.
92
+ - If unsure, default to "user/memories".
93
+
94
+ MEMORY:
95
+ {{content}}
96
+
97
+ SOURCE SITE:
98
+ {{sourceSite}}
99
+
100
+ KEYWORDS:
101
+ {{keywords}}`;
102
+ /**
103
+ * Use LLM to classify a memory into the canonical taxonomy.
104
+ */
105
+ export async function classifyNamespace(content, sourceSite, keywords) {
106
+ const prompt = CLASSIFICATION_PROMPT
107
+ .replace('{{content}}', content)
108
+ .replace('{{sourceSite}}', sourceSite)
109
+ .replace('{{keywords}}', keywords.join(', '));
110
+ const response = await llm.chat([
111
+ { role: 'system', content: 'You are a precise classification engine.' },
112
+ { role: 'user', content: prompt },
113
+ ], { temperature: 0, maxTokens: 50 });
114
+ return response.trim().toLowerCase();
115
+ }
116
+ /**
117
+ * Extract a legacy namespace suggestion from memory content.
118
+ * Retained for fallback and non-LLM paths.
119
+ */
120
+ export function inferNamespace(content, sourceSite, keywords) {
121
+ const lower = content.toLowerCase();
122
+ const kwLower = keywords.map((k) => k.toLowerCase());
123
+ if (sourceSite && sourceSite !== 'unknown') {
124
+ const site = sourceSite.replace(/[^a-z0-9]/gi, '/').toLowerCase();
125
+ return `site/${site}`;
126
+ }
127
+ for (const kw of kwLower) {
128
+ if (PROJECT_INDICATORS.some((p) => kw.includes(p))) {
129
+ const projectName = extractProjectName(lower, kwLower);
130
+ if (projectName)
131
+ return `project/${projectName}/docs`;
132
+ }
133
+ }
134
+ for (const [category, terms] of Object.entries(TOPIC_INDICATORS)) {
135
+ if (terms.some((t) => lower.includes(t) || kwLower.includes(t))) {
136
+ return `topic/${category}`;
137
+ }
138
+ }
139
+ return null;
140
+ }
141
+ const PROJECT_INDICATORS = ['project', 'repo', 'repository', 'codebase', 'workspace'];
142
+ const TOPIC_INDICATORS = {
143
+ databases: ['postgresql', 'postgres', 'mysql', 'mongodb', 'redis', 'database', 'sql', 'nosql'],
144
+ frontend: ['react', 'vue', 'angular', 'css', 'html', 'ui', 'ux', 'frontend'],
145
+ backend: ['api', 'server', 'express', 'fastapi', 'django', 'backend', 'endpoint'],
146
+ infrastructure: ['docker', 'kubernetes', 'aws', 'gcp', 'azure', 'terraform', 'ci/cd', 'deploy'],
147
+ testing: ['test', 'testing', 'vitest', 'jest', 'playwright', 'e2e', 'unit test'],
148
+ security: ['auth', 'authentication', 'encryption', 'security', 'oauth', 'jwt'],
149
+ };
150
+ /**
151
+ * Derive a namespace for a composite from the namespaces of its member atomics.
152
+ * Returns the most common non-null namespace. If all members are null, returns null.
153
+ */
154
+ export function deriveMajorityNamespace(memberNamespaces) {
155
+ const counts = new Map();
156
+ for (const ns of memberNamespaces) {
157
+ if (ns === null)
158
+ continue;
159
+ counts.set(ns, (counts.get(ns) ?? 0) + 1);
160
+ }
161
+ if (counts.size === 0)
162
+ return null;
163
+ let best = null;
164
+ let bestCount = 0;
165
+ for (const [ns, count] of counts) {
166
+ if (count > bestCount) {
167
+ best = ns;
168
+ bestCount = count;
169
+ }
170
+ }
171
+ return best;
172
+ }
173
+ function extractProjectName(content, keywords) {
174
+ for (const kw of keywords) {
175
+ if (!PROJECT_INDICATORS.includes(kw) && kw.length > 2 && /^[a-z0-9-]+$/.test(kw)) {
176
+ return kw;
177
+ }
178
+ }
179
+ return null;
180
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Observation-date extraction helpers.
3
+ *
4
+ * Keeps benchmark-only temporal prompt and post-processing behavior behind one
5
+ * default-off option so relative-date experiments can run by configuration.
6
+ */
7
+ import type { ExtractedFact } from './extraction.js';
8
+ export interface ExtractionOptions {
9
+ observationDateExtractionEnabled?: boolean;
10
+ }
11
+ export declare function buildExtractionUserMessage(conversationText: string, options?: ExtractionOptions): string;
12
+ export declare function applyObservationDateAnchors(facts: ExtractedFact[], conversationText: string, options?: ExtractionOptions): ExtractedFact[];
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Observation-date extraction helpers.
3
+ *
4
+ * Keeps benchmark-only temporal prompt and post-processing behavior behind one
5
+ * default-off option so relative-date experiments can run by configuration.
6
+ */
7
+ import { annotateRelativeTemporalText, extractRelativeTemporalAnchors, } from './relative-temporal.js';
8
+ import { extractSessionTimestamp, parseSessionDate } from './session-date.js';
9
+ export function buildExtractionUserMessage(conversationText, options = {}) {
10
+ if (!options.observationDateExtractionEnabled) {
11
+ return `Conversation to extract from:\n${conversationText}`;
12
+ }
13
+ const observationTimestamp = extractObservationTimestamp(conversationText);
14
+ if (!observationTimestamp) {
15
+ return `Conversation to extract from:\n${conversationText}`;
16
+ }
17
+ return [
18
+ `Observation timestamp: ${observationTimestamp}`,
19
+ 'Use this timestamp to resolve relative dates in the conversation.',
20
+ 'For relative phrases such as "last Friday", include the resolved absolute date in extracted facts when possible.',
21
+ '',
22
+ `Conversation to extract from:\n${conversationText}`,
23
+ ].join('\n');
24
+ }
25
+ export function applyObservationDateAnchors(facts, conversationText, options = {}) {
26
+ if (!options.observationDateExtractionEnabled)
27
+ return facts;
28
+ const observationDate = parseObservationDate(conversationText);
29
+ if (!observationDate)
30
+ return facts;
31
+ return facts.map((fact) => annotateFact(fact, observationDate));
32
+ }
33
+ function annotateFact(fact, observationDate) {
34
+ const annotatedFact = annotateRelativeTemporalText(fact.fact, observationDate);
35
+ if (annotatedFact === fact.fact)
36
+ return fact;
37
+ const anchorKeywords = extractRelativeTemporalAnchors(fact.fact, observationDate)
38
+ .map((anchor) => anchor.eventDate);
39
+ return {
40
+ ...fact,
41
+ fact: annotatedFact,
42
+ keywords: [...new Set([...fact.keywords, ...anchorKeywords])],
43
+ };
44
+ }
45
+ function parseObservationDate(conversationText) {
46
+ return parseSessionDate(conversationText);
47
+ }
48
+ function extractObservationTimestamp(conversationText) {
49
+ return extractSessionTimestamp(conversationText);
50
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Observation network service — synthesizes entity profiles from scattered
3
+ * facts across the memory store. Part of the 4-network architecture
4
+ * (Hindsight-inspired).
5
+ *
6
+ * Observations are NOT created during ingest. Instead, ingest marks entities
7
+ * as "dirty" in the observation_dirty table. This service processes the
8
+ * dirty queue asynchronously, synthesizing profiles via LLM and storing
9
+ * them as network='observation' memories.
10
+ *
11
+ * Why async: Entity profile synthesis requires reading all facts about an
12
+ * entity and calling an LLM — too expensive for the ingest hot path.
13
+ */
14
+ import { ObservationRepository } from '../db/repository-observation.js';
15
+ import { MemoryRepository } from '../db/memory-repository.js';
16
+ export declare class ObservationService {
17
+ private observationRepo;
18
+ private memoryRepo;
19
+ constructor(observationRepo: ObservationRepository, memoryRepo: MemoryRepository);
20
+ /** Mark entity subjects as needing profile regeneration. Fire-and-forget safe. */
21
+ markDirty(userId: string, entityNames: string[]): Promise<void>;
22
+ /**
23
+ * Process pending observation regeneration tasks.
24
+ * Call this from a background job or periodic timer.
25
+ */
26
+ regeneratePending(limit?: number): Promise<number>;
27
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Observation network service — synthesizes entity profiles from scattered
3
+ * facts across the memory store. Part of the 4-network architecture
4
+ * (Hindsight-inspired).
5
+ *
6
+ * Observations are NOT created during ingest. Instead, ingest marks entities
7
+ * as "dirty" in the observation_dirty table. This service processes the
8
+ * dirty queue asynchronously, synthesizing profiles via LLM and storing
9
+ * them as network='observation' memories.
10
+ *
11
+ * Why async: Entity profile synthesis requires reading all facts about an
12
+ * entity and calling an LLM — too expensive for the ingest hot path.
13
+ */
14
+ import { embedText } from './embedding.js';
15
+ import { llm } from './llm.js';
16
+ const SYNTHESIS_PROMPT = `You are a memory synthesis system. Given a set of facts about a subject, produce a comprehensive profile summary.
17
+
18
+ RULES:
19
+ - Synthesize all facts into a coherent profile of the subject
20
+ - Include: key attributes, relationships, preferences, and notable activities
21
+ - Maintain factual accuracy — do not infer beyond what the facts state
22
+ - Write in third person (e.g., "The user works at Google" not "You work at Google")
23
+ - Keep the summary concise: 2-4 sentences for simple subjects, up to 8 for complex ones
24
+ - Include temporal context when available (e.g., "as of March 2026")
25
+
26
+ Return ONLY the profile summary text, no formatting or labels.`;
27
+ export class ObservationService {
28
+ observationRepo;
29
+ memoryRepo;
30
+ constructor(observationRepo, memoryRepo) {
31
+ this.observationRepo = observationRepo;
32
+ this.memoryRepo = memoryRepo;
33
+ }
34
+ /** Mark entity subjects as needing profile regeneration. Fire-and-forget safe. */
35
+ async markDirty(userId, entityNames) {
36
+ await this.observationRepo.markDirty(userId, entityNames);
37
+ }
38
+ /**
39
+ * Process pending observation regeneration tasks.
40
+ * Call this from a background job or periodic timer.
41
+ */
42
+ async regeneratePending(limit = 10) {
43
+ const pending = await this.observationRepo.getPending(limit);
44
+ let processed = 0;
45
+ for (const { userId, subject } of pending) {
46
+ const memories = await this.observationRepo.findMemoriesForSubject(userId, subject);
47
+ if (memories.length === 0) {
48
+ await this.observationRepo.clearDirty(userId, subject);
49
+ continue;
50
+ }
51
+ const factsText = memories.map((m, i) => `[${i + 1}] ${m.content}`).join('\n');
52
+ const prompt = `Subject: ${subject}\n\nFacts:\n${factsText}`;
53
+ const profileText = await llm.chat([
54
+ { role: 'system', content: SYNTHESIS_PROMPT },
55
+ { role: 'user', content: prompt },
56
+ ], { temperature: 0, maxTokens: 300 });
57
+ if (!profileText.trim()) {
58
+ await this.observationRepo.clearDirty(userId, subject);
59
+ continue;
60
+ }
61
+ const embedding = await embedText(profileText);
62
+ // Expire previous observation for this subject
63
+ const existingId = await this.observationRepo.findExistingObservation(userId, subject);
64
+ if (existingId) {
65
+ await this.memoryRepo.expireMemory(userId, existingId);
66
+ }
67
+ // Store new observation
68
+ await this.memoryRepo.storeMemory({
69
+ userId,
70
+ content: profileText,
71
+ embedding,
72
+ memoryType: 'semantic',
73
+ importance: 0.8,
74
+ sourceSite: 'observation-service',
75
+ keywords: subject,
76
+ network: 'observation',
77
+ observationSubject: subject,
78
+ });
79
+ await this.observationRepo.clearDirty(userId, subject);
80
+ processed++;
81
+ }
82
+ return processed;
83
+ }
84
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Packaging and assembly observability helpers.
3
+ *
4
+ * Builds explicit summaries for the packaged context emitted by search()
5
+ * without changing candidate membership, ranking, or canonical storage.
6
+ */
7
+ import type { SearchResult } from '../db/memory-repository.js';
8
+ import type { RetrievalMode } from './memory-service-types.js';
9
+ import type { AssemblyTraceSummary, PackagingTraceSummary } from './retrieval-trace.js';
10
+ import type { TraceCollector } from './retrieval-trace.js';
11
+ import type { TierAssignment } from './tiered-loading.js';
12
+ export interface FinalizePackagingInput {
13
+ outputMemories: SearchResult[];
14
+ mode: RetrievalMode;
15
+ injectionText: string;
16
+ estimatedContextTokens?: number;
17
+ tierAssignments?: TierAssignment[];
18
+ tokenBudget?: number;
19
+ }
20
+ /**
21
+ * Build packaging + assembly summaries, emit the tiered-packaging trace
22
+ * event when in tiered mode, and attach both summaries to the active
23
+ * trace. Returns the summaries so the caller can include them in the
24
+ * retrieval result. Does NOT finalize the trace — caller owns that.
25
+ */
26
+ export declare function finalizePackagingTrace(activeTrace: TraceCollector, input: FinalizePackagingInput): {
27
+ packagingSummary: PackagingTraceSummary;
28
+ assemblySummary: AssemblyTraceSummary;
29
+ };