@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,53 @@
1
+ /**
2
+ * Phase 2 specialist dispatcher.
3
+ *
4
+ * After RRF + reranking produce top-K memories, the dispatcher checks
5
+ * specialists in priority order (most-specific pattern first). The first
6
+ * specialist whose shouldInvoke* matches AND whose runSpecialist returns
7
+ * handled=true with a non-empty answer SHORT-CIRCUITS the rest of the
8
+ * pipeline: that answer becomes the LLM-facing answer; shared-spine
9
+ * prompt assembly is skipped.
10
+ *
11
+ * If all specialists return handled=false, the dispatcher returns
12
+ * { handled: false } and the shared spine takes over.
13
+ *
14
+ * Pure DI: every dependency is passed in.
15
+ */
16
+ import type { BeliefEdgesRepository } from '../../db/belief-edges-repository.js';
17
+ import type { MemoryRow } from '../../db/repository-types.js';
18
+ import type { EntityValuesRepository } from '../../db/entity-values-repository.js';
19
+ export interface DispatchMemoryInput {
20
+ id: string;
21
+ text: string;
22
+ observedAt?: Date;
23
+ }
24
+ /** Minimal memory-lookup surface needed by the CR specialist. */
25
+ export interface MemoryLookup {
26
+ getMemory(id: string, userId?: string): Promise<MemoryRow | null>;
27
+ }
28
+ export interface SpecialistDispatchDeps {
29
+ memories: ReadonlyArray<DispatchMemoryInput>;
30
+ query: string;
31
+ userId: string;
32
+ model: string;
33
+ /** BeliefEdgesRepository — null when tbcEnabled or phase2 is off. */
34
+ beliefEdges: BeliefEdgesRepository | null;
35
+ /** Memory lookup for fetching contradiction sides not in top-K. */
36
+ memoryRepo: MemoryLookup;
37
+ /** EntityValuesRepository — null when phase2 is off. */
38
+ entityValues: EntityValuesRepository | null;
39
+ }
40
+ export interface SpecialistDispatchResult {
41
+ handled: boolean;
42
+ answer: string;
43
+ specialist: 'cr' | 'msr' | 'tr' | 'ie_ku' | 'none';
44
+ }
45
+ /**
46
+ * Dispatch in priority order. The order matters because some patterns overlap
47
+ * (e.g. "how many days between" matches both MSR's "how many" and TR's
48
+ * "how many days between") — TR is more specific and should win, so TR comes
49
+ * before MSR.
50
+ *
51
+ * Priority: CR → TR → MSR → IE/KU → none (shared spine)
52
+ */
53
+ export declare function dispatchSpecialists(deps: SpecialistDispatchDeps): Promise<SpecialistDispatchResult>;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Phase 2 specialist dispatcher.
3
+ *
4
+ * After RRF + reranking produce top-K memories, the dispatcher checks
5
+ * specialists in priority order (most-specific pattern first). The first
6
+ * specialist whose shouldInvoke* matches AND whose runSpecialist returns
7
+ * handled=true with a non-empty answer SHORT-CIRCUITS the rest of the
8
+ * pipeline: that answer becomes the LLM-facing answer; shared-spine
9
+ * prompt assembly is skipped.
10
+ *
11
+ * If all specialists return handled=false, the dispatcher returns
12
+ * { handled: false } and the shared spine takes over.
13
+ *
14
+ * Pure DI: every dependency is passed in.
15
+ */
16
+ import { runCrSpecialist, shouldInvokeCrSpecialist } from './cr-specialist.js';
17
+ import { runMsrSpecialist, shouldInvokeMsrSpecialist } from './msr-specialist.js';
18
+ import { runTrSpecialist, shouldInvokeTrSpecialist } from './tr-specialist.js';
19
+ import { runIeKuSpecialist, shouldInvokeIeKuSpecialist } from './ie-ku-specialist.js';
20
+ /**
21
+ * Detect specialist refusals so the dispatcher abdicates to the shared spine
22
+ * instead of replacing v11's confidence-prefixed retrieval answer with a raw
23
+ * "I cannot find" string. v12 evidence: PHASE2_SPECIALISTS_ENABLED=true cost
24
+ * −0.174 composite because specialists returned `handled=true` with refusal
25
+ * answers, discarding the full injectionText. Fail open: any refusal pattern
26
+ * → treat as not-handled.
27
+ */
28
+ const REFUSAL_PATTERNS = [
29
+ /\b(can(?:not|'t)\s+find|cannot\s+find\s+(?:sufficient|the))/i,
30
+ /\b(?:do(?:es)?\s+not|don'?t)\s+(?:contain|have)\b/i,
31
+ /\bno\s+(?:information|relevant\s+memories|matching\s+facts)\b/i,
32
+ /\bnot\s+(?:enough|sufficient)\s+(?:information|context|memories)/i,
33
+ /\bcontext\s+does\s+not\s+(?:contain|include|specify)\b/i,
34
+ /\bI\s+(?:am\s+unable|don'?t\s+have\s+enough)/i,
35
+ /\binsufficient\s+(?:information|context|memories)/i,
36
+ ];
37
+ function isRefusal(answer) {
38
+ if (!answer || answer.trim().length === 0)
39
+ return true;
40
+ return REFUSAL_PATTERNS.some((p) => p.test(answer));
41
+ }
42
+ /**
43
+ * Dispatch in priority order. The order matters because some patterns overlap
44
+ * (e.g. "how many days between" matches both MSR's "how many" and TR's
45
+ * "how many days between") — TR is more specific and should win, so TR comes
46
+ * before MSR.
47
+ *
48
+ * Priority: CR → TR → MSR → IE/KU → none (shared spine)
49
+ */
50
+ // fallow-ignore-next-line complexity
51
+ export async function dispatchSpecialists(deps) {
52
+ // 1. CR — bilateral contradiction
53
+ if (deps.beliefEdges && shouldInvokeCrSpecialist(deps.query)) {
54
+ const cr = await runCrSpecialist({
55
+ memories: deps.memories,
56
+ query: deps.query,
57
+ userId: deps.userId,
58
+ model: deps.model,
59
+ beliefEdges: deps.beliefEdges,
60
+ // MemoryLookup structurally satisfies MemoryRepository's getMemory surface
61
+ memoryRepo: deps.memoryRepo,
62
+ });
63
+ if (cr.handled && cr.answer && !isRefusal(cr.answer)) {
64
+ return { handled: true, answer: cr.answer, specialist: 'cr' };
65
+ }
66
+ }
67
+ // 2. TR — temporal arithmetic (more specific than MSR; check first)
68
+ if (shouldInvokeTrSpecialist(deps.query)) {
69
+ const tr = await runTrSpecialist({
70
+ memories: deps.memories,
71
+ query: deps.query,
72
+ model: deps.model,
73
+ });
74
+ if (tr.handled && tr.answer && !isRefusal(tr.answer)) {
75
+ return { handled: true, answer: tr.answer, specialist: 'tr' };
76
+ }
77
+ }
78
+ // 3. MSR — multi-session count
79
+ if (shouldInvokeMsrSpecialist(deps.query)) {
80
+ const msr = await runMsrSpecialist({
81
+ memories: deps.memories,
82
+ query: deps.query,
83
+ model: deps.model,
84
+ });
85
+ if (msr.handled && msr.answer && !isRefusal(msr.answer)) {
86
+ return { handled: true, answer: msr.answer, specialist: 'msr' };
87
+ }
88
+ }
89
+ // 4. IE/KU — literal-value SQL lookup
90
+ if (deps.entityValues && shouldInvokeIeKuSpecialist(deps.query)) {
91
+ const ieku = await runIeKuSpecialist({
92
+ values: deps.entityValues,
93
+ query: deps.query,
94
+ userId: deps.userId,
95
+ model: deps.model,
96
+ });
97
+ if (ieku.handled && ieku.answer && !isRefusal(ieku.answer)) {
98
+ return { handled: true, answer: ieku.answer, specialist: 'ie_ku' };
99
+ }
100
+ }
101
+ return { handled: false, answer: '', specialist: 'none' };
102
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * IE/KU (Information Extraction / Knowledge Update) specialist.
3
+ *
4
+ * BEAM IE/KU questions ask for literal values ("what is the X", "when
5
+ * does X"). LLMs paraphrase, judges do literal-string match → score zero.
6
+ *
7
+ * Flow:
8
+ * 1) Pattern-match the query
9
+ * 2) Use a tiny Haiku tool-use call to extract (entity, attribute) from
10
+ * the query itself
11
+ * 3) SQL lookup against entity_values for the most recent matching row
12
+ * 4) Return the literal value as the answer
13
+ * 5) On miss, return handled=false → shared spine takes over
14
+ */
15
+ import type { EntityValuesRepository } from '../../db/entity-values-repository.js';
16
+ /**
17
+ * Returns true when the query matches IE/KU question shapes: "what is the X",
18
+ * "when does/did X", "what date", "the deadline for".
19
+ */
20
+ export declare function shouldInvokeIeKuSpecialist(query: string): boolean;
21
+ export interface IeKuSpecialistDeps {
22
+ values: EntityValuesRepository;
23
+ query: string;
24
+ userId: string;
25
+ model: string;
26
+ }
27
+ export interface IeKuSpecialistResult {
28
+ answer: string;
29
+ handled: boolean;
30
+ matchedEntity: string | null;
31
+ matchedAttribute: string | null;
32
+ }
33
+ /**
34
+ * Run the IE/KU specialist against a factual query.
35
+ * Returns the literal stored value on a SQL hit, or handled=false on miss.
36
+ */
37
+ export declare function runIeKuSpecialist(deps: IeKuSpecialistDeps): Promise<IeKuSpecialistResult>;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * IE/KU (Information Extraction / Knowledge Update) specialist.
3
+ *
4
+ * BEAM IE/KU questions ask for literal values ("what is the X", "when
5
+ * does X"). LLMs paraphrase, judges do literal-string match → score zero.
6
+ *
7
+ * Flow:
8
+ * 1) Pattern-match the query
9
+ * 2) Use a tiny Haiku tool-use call to extract (entity, attribute) from
10
+ * the query itself
11
+ * 3) SQL lookup against entity_values for the most recent matching row
12
+ * 4) Return the literal value as the answer
13
+ * 5) On miss, return handled=false → shared spine takes over
14
+ */
15
+ import { callAnthropicTool } from '../llm.js';
16
+ /**
17
+ * Returns true when the query matches IE/KU question shapes: "what is the X",
18
+ * "when does/did X", "what date", "the deadline for".
19
+ */
20
+ export function shouldInvokeIeKuSpecialist(query) {
21
+ // "what is the X", "when does/did", "what date X" (when X is a noun phrase)
22
+ return /\b(what is the|what'?s the|when does|when did|what date|the deadline for)\b/i.test(query);
23
+ }
24
+ const QUERY_PARSE_SCHEMA = {
25
+ name: 'parse_factual_query',
26
+ description: 'Extract the (entity, attribute) the user is asking about.',
27
+ input_schema: {
28
+ type: 'object',
29
+ properties: {
30
+ entity: { type: 'string', description: 'The subject of the question.' },
31
+ attribute: { type: 'string', description: 'The specific property being asked about.' },
32
+ },
33
+ required: ['entity', 'attribute'],
34
+ },
35
+ };
36
+ const QUERY_PARSE_SYSTEM = `Extract the (entity, attribute) pair the user is asking about.
37
+
38
+ Examples:
39
+ - "What is the daily call quota for the API key?" → entity="API key", attribute="daily quota"
40
+ - "When does my first sprint end?" → entity="first sprint", attribute="end date"
41
+ - "What is the test coverage?" → entity="test coverage", attribute="percentage"
42
+
43
+ Call parse_factual_query.`;
44
+ /**
45
+ * Run the IE/KU specialist against a factual query.
46
+ * Returns the literal stored value on a SQL hit, or handled=false on miss.
47
+ */
48
+ export async function runIeKuSpecialist(deps) {
49
+ if (!shouldInvokeIeKuSpecialist(deps.query)) {
50
+ return { answer: '', handled: false, matchedEntity: null, matchedAttribute: null };
51
+ }
52
+ const parsed = await callAnthropicTool(deps.model, QUERY_PARSE_SYSTEM, `Query: ${deps.query}`, QUERY_PARSE_SCHEMA);
53
+ const row = await deps.values.findLatest(deps.userId, parsed.entity, parsed.attribute);
54
+ if (!row) {
55
+ return { answer: '', handled: false, matchedEntity: parsed.entity, matchedAttribute: parsed.attribute };
56
+ }
57
+ return {
58
+ answer: row.value,
59
+ handled: true,
60
+ matchedEntity: parsed.entity,
61
+ matchedAttribute: parsed.attribute,
62
+ };
63
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * MSR (Multi-Session Reasoning) specialist — DETERMINISTIC.
3
+ *
4
+ * Smoke v5 evidence: LLM-based dedup overcounted (12 vs gold 'Four')
5
+ * because it couldn't apply the question's implicit verb-filter ('wanting
6
+ * to handle' vs 'mentioned overall').
7
+ *
8
+ * New approach:
9
+ * 1) Extract the action verb from the query ("wanting", "adding", "fixing").
10
+ * 2) Filter retrieved memories to those whose text contains the verb.
11
+ * 3) Group remaining memories by entity (lowercase substring / word overlap).
12
+ * 4) Count distinct entities.
13
+ *
14
+ * Zero LLM calls. The output uses number-word format for small N to match
15
+ * BEAM gold ('Four', 'Two').
16
+ */
17
+ /** Pattern check: should the MSR specialist handle this query? */
18
+ export declare function shouldInvokeMsrSpecialist(query: string): boolean;
19
+ export interface MsrMemoryInput {
20
+ id: string;
21
+ text: string;
22
+ observedAt?: Date;
23
+ }
24
+ export interface MsrSpecialistDeps {
25
+ /** The retrieved top-K memories from the shared spine. */
26
+ memories: ReadonlyArray<MsrMemoryInput>;
27
+ /** Original user query. */
28
+ query: string;
29
+ /** Unused — kept for API compat. */
30
+ model?: string;
31
+ }
32
+ export interface MsrSpecialistResult {
33
+ /** Final answer text to return to the user. */
34
+ answer: string;
35
+ /** Distinct items the aggregator identified. */
36
+ items: string[];
37
+ /** Whether the specialist actually handled the query (vs falling through). */
38
+ handled: boolean;
39
+ /** Telemetry: always false in this deterministic implementation. */
40
+ usedLlm: boolean;
41
+ }
42
+ interface DetectedVerb {
43
+ verb: string;
44
+ memoryPattern: RegExp;
45
+ }
46
+ /**
47
+ * Find the action verb in the query and return a matcher for memory text.
48
+ * Returns null if no known action verb is found.
49
+ */
50
+ export declare function detectActionVerb(query: string): DetectedVerb | null;
51
+ /**
52
+ * Run the deterministic MSR specialist.
53
+ *
54
+ * 1. Gate on shouldInvokeMsrSpecialist.
55
+ * 2. Detect the action verb in the query.
56
+ * 3. Filter memories to those whose text matches the verb.
57
+ * 4. Extract and deduplicate entity signatures.
58
+ * 5. Return a number-word answer.
59
+ */
60
+ export declare function runMsrSpecialist(deps: MsrSpecialistDeps): Promise<MsrSpecialistResult>;
61
+ export {};
@@ -0,0 +1,162 @@
1
+ /**
2
+ * MSR (Multi-Session Reasoning) specialist — DETERMINISTIC.
3
+ *
4
+ * Smoke v5 evidence: LLM-based dedup overcounted (12 vs gold 'Four')
5
+ * because it couldn't apply the question's implicit verb-filter ('wanting
6
+ * to handle' vs 'mentioned overall').
7
+ *
8
+ * New approach:
9
+ * 1) Extract the action verb from the query ("wanting", "adding", "fixing").
10
+ * 2) Filter retrieved memories to those whose text contains the verb.
11
+ * 3) Group remaining memories by entity (lowercase substring / word overlap).
12
+ * 4) Count distinct entities.
13
+ *
14
+ * Zero LLM calls. The output uses number-word format for small N to match
15
+ * BEAM gold ('Four', 'Two').
16
+ */
17
+ /** Pattern check: should the MSR specialist handle this query? */
18
+ export function shouldInvokeMsrSpecialist(query) {
19
+ return /\b(how many|total number of|across all|combined number)\b/i.test(query);
20
+ }
21
+ const ACTION_VERB_TABLE = [
22
+ {
23
+ verb: 'add',
24
+ queryPattern: /\b(?:wanting to add|want to add|adding|added|wanted to add)\b/i,
25
+ memoryPattern: /\badd(?:ed|ing|s)?\b/i,
26
+ },
27
+ {
28
+ verb: 'fix',
29
+ queryPattern: /\b(?:fixed|fixing|wanting to fix|tried to fix|wanted to fix)\b/i,
30
+ memoryPattern: /\bfix(?:ed|ing|es)?\b/i,
31
+ },
32
+ {
33
+ verb: 'implement',
34
+ queryPattern: /\b(?:implementing|implemented|trying to implement|wanting to implement|wanted to implement)\b/i,
35
+ memoryPattern: /\bimplement(?:ed|ing|s|ation)?\b/i,
36
+ },
37
+ {
38
+ verb: 'use',
39
+ queryPattern: /\b(?:using|used|wanting to use|tried to use)\b/i,
40
+ memoryPattern: /\bus(?:ed|ing|es)\b/i,
41
+ },
42
+ {
43
+ verb: 'handle',
44
+ queryPattern: /\b(?:wanting to handle|want to handle|handling|wanted to handle)\b/i,
45
+ memoryPattern: /\bhandl(?:ed|ing|es|e)\b/i,
46
+ },
47
+ {
48
+ verb: 'mention',
49
+ queryPattern: /\b(?:mentioned|mentioning|mention)\b/i,
50
+ memoryPattern: /\bmention(?:ed|ing|s)?\b/i,
51
+ },
52
+ {
53
+ verb: 'request',
54
+ queryPattern: /\b(?:requested|requesting|asked for|request)\b/i,
55
+ memoryPattern: /\b(?:request(?:ed|ing|s)?|asked for)\b/i,
56
+ },
57
+ ];
58
+ /**
59
+ * Find the action verb in the query and return a matcher for memory text.
60
+ * Returns null if no known action verb is found.
61
+ */
62
+ export function detectActionVerb(query) {
63
+ for (const entry of ACTION_VERB_TABLE) {
64
+ if (entry.queryPattern.test(query)) {
65
+ return { verb: entry.verb, memoryPattern: entry.memoryPattern };
66
+ }
67
+ }
68
+ return null;
69
+ }
70
+ /**
71
+ * Common filler words that appear in many memories and should not count as
72
+ * distinctive entity words for deduplication purposes.
73
+ */
74
+ const STOP_WORDS = new Set([
75
+ 'user', 'wants', 'want', 'need', 'needs', 'says', 'said', 'mentioned',
76
+ 'discuss', 'discussed', 'note', 'noted', 'adds', 'added', 'tries', 'tried',
77
+ 'handle', 'handles', 'handled', 'handling', 'using', 'used', 'uses',
78
+ 'implement', 'implementing', 'implemented', 'with', 'that', 'this', 'from',
79
+ 'have', 'their', 'they', 'will', 'about', 'also', 'more', 'when',
80
+ 'make', 'made', 'should', 'would', 'could', 'into', 'some',
81
+ ]);
82
+ /**
83
+ * Extract the distinctive content words from a memory text for deduplication.
84
+ * Strips bullet/list prefixes, lowercases, removes stop words, keeps content
85
+ * words (length > 3 and not in STOP_WORDS).
86
+ */
87
+ function extractEntity(text) {
88
+ const cleaned = text.replace(/^[-•*\d.)\s]+/, '').trim().toLowerCase();
89
+ const words = cleaned
90
+ .split(/\s+/)
91
+ .filter((w) => w.length > 3 && !STOP_WORDS.has(w));
92
+ // Return the first 5 distinctive words as the entity signature.
93
+ // Falls back to full 80-char cleaned string if no content words found.
94
+ return words.length > 0 ? words.slice(0, 5).join(' ') : cleaned.slice(0, 80);
95
+ }
96
+ /**
97
+ * Two entity strings are considered the same when they share substantial
98
+ * word overlap (Jaccard-style ≥ 0.6 on content words).
99
+ */
100
+ function entitiesMatch(a, b) {
101
+ if (a === b)
102
+ return true;
103
+ const wordsOf = (s) => new Set(s.split(/\s+/));
104
+ const aw = wordsOf(a);
105
+ const bw = wordsOf(b);
106
+ if (aw.size === 0 || bw.size === 0)
107
+ return a === b;
108
+ let common = 0;
109
+ for (const w of aw) {
110
+ if (bw.has(w))
111
+ common++;
112
+ }
113
+ const union = new Set([...aw, ...bw]).size;
114
+ // Jaccard similarity on content-word sets
115
+ return common / union >= 0.5;
116
+ }
117
+ /** Return deduplicated entity list using entitiesMatch. */
118
+ function dedupEntities(entities) {
119
+ const out = [];
120
+ for (const e of entities) {
121
+ if (!out.some((existing) => entitiesMatch(existing, e))) {
122
+ out.push(e);
123
+ }
124
+ }
125
+ return out;
126
+ }
127
+ const NUMBER_WORDS = [
128
+ 'Zero', 'One', 'Two', 'Three', 'Four', 'Five',
129
+ 'Six', 'Seven', 'Eight', 'Nine', 'Ten',
130
+ ];
131
+ /** Format a count as a number-word (≤ 10) or plain digit. */
132
+ function formatCount(n) {
133
+ return n >= 0 && n < NUMBER_WORDS.length ? NUMBER_WORDS[n] : String(n);
134
+ }
135
+ /**
136
+ * Run the deterministic MSR specialist.
137
+ *
138
+ * 1. Gate on shouldInvokeMsrSpecialist.
139
+ * 2. Detect the action verb in the query.
140
+ * 3. Filter memories to those whose text matches the verb.
141
+ * 4. Extract and deduplicate entity signatures.
142
+ * 5. Return a number-word answer.
143
+ */
144
+ export async function runMsrSpecialist(deps) {
145
+ if (!shouldInvokeMsrSpecialist(deps.query)) {
146
+ return { answer: '', items: [], handled: false, usedLlm: false };
147
+ }
148
+ if (deps.memories.length === 0) {
149
+ return { answer: formatCount(0), items: [], handled: true, usedLlm: false };
150
+ }
151
+ const detected = detectActionVerb(deps.query);
152
+ const filtered = detected
153
+ ? deps.memories.filter((m) => detected.memoryPattern.test(m.text))
154
+ : deps.memories;
155
+ const entities = filtered.map((m) => extractEntity(m.text));
156
+ const distinct = dedupEntities(entities);
157
+ const n = distinct.length;
158
+ const answer = n <= 10
159
+ ? formatCount(n)
160
+ : `${n}: ${distinct.join(', ')}.`;
161
+ return { answer, items: distinct, handled: true, usedLlm: false };
162
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * TR (Temporal Reasoning) specialist — DETERMINISTIC (no LLM in hot path).
3
+ *
4
+ * Smoke v5 showed Haiku-in-the-loop pattern hurts: when asked "find the two
5
+ * dates," Haiku returned missing_dates=true even when its own output text
6
+ * cited both dates explicitly. The over-abstention propagated.
7
+ *
8
+ * This version extracts dates from retrieved memories directly via regex +
9
+ * observed_at column, matches them to query anchors via substring, computes
10
+ * the duration in TypeScript, and emits the literal answer that BEAM's
11
+ * judge expects ("21 days between X and Y").
12
+ */
13
+ /** Pattern: "how many days/weeks/months between" / "how long between/since/until". */
14
+ export declare function shouldInvokeTrSpecialist(query: string): boolean;
15
+ export interface TrMemoryInput {
16
+ id: string;
17
+ text: string;
18
+ observedAt?: Date;
19
+ }
20
+ export interface TrSpecialistDeps {
21
+ memories: ReadonlyArray<TrMemoryInput>;
22
+ query: string;
23
+ /** Unused — kept for API compatibility with the prior LLM version. */
24
+ model?: string;
25
+ }
26
+ export interface TrSpecialistResult {
27
+ answer: string;
28
+ handled: boolean;
29
+ startDate: Date | null;
30
+ endDate: Date | null;
31
+ durationDays: number | null;
32
+ /** Telemetry: always false in this implementation. */
33
+ usedLlm: boolean;
34
+ }
35
+ /** Extract every parseable date from a string, returning Date objects. */
36
+ export declare function extractDatesFromText(text: string, defaultYear?: number): Date[];
37
+ export declare function runTrSpecialist(deps: TrSpecialistDeps): Promise<TrSpecialistResult>;
@@ -0,0 +1,146 @@
1
+ /**
2
+ * TR (Temporal Reasoning) specialist — DETERMINISTIC (no LLM in hot path).
3
+ *
4
+ * Smoke v5 showed Haiku-in-the-loop pattern hurts: when asked "find the two
5
+ * dates," Haiku returned missing_dates=true even when its own output text
6
+ * cited both dates explicitly. The over-abstention propagated.
7
+ *
8
+ * This version extracts dates from retrieved memories directly via regex +
9
+ * observed_at column, matches them to query anchors via substring, computes
10
+ * the duration in TypeScript, and emits the literal answer that BEAM's
11
+ * judge expects ("21 days between X and Y").
12
+ */
13
+ /** Pattern: "how many days/weeks/months between" / "how long between/since/until". */
14
+ export function shouldInvokeTrSpecialist(query) {
15
+ return /\b(how many (days|weeks|months|years)|how long (between|since|until))\b/i.test(query);
16
+ }
17
+ const DAY_MS = 1000 * 60 * 60 * 24;
18
+ // ISO YYYY-MM-DD, with optional time
19
+ const ISO_DATE_PATTERN = /\b(\d{4})-(\d{2})-(\d{2})\b/g;
20
+ const MONTH_NAMES = [
21
+ 'january', 'february', 'march', 'april', 'may', 'june',
22
+ 'july', 'august', 'september', 'october', 'november', 'december',
23
+ ];
24
+ const MONTH_ABBR = MONTH_NAMES.map(m => m.slice(0, 3));
25
+ const MONTH_PATTERN = new RegExp(`\\b(${[...MONTH_NAMES, ...MONTH_ABBR].join('|')})\\s+(\\d{1,2})(?:,?\\s+(\\d{4}))?\\b`, 'gi');
26
+ function parseIsoDate(s) {
27
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(s))
28
+ return null;
29
+ const d = new Date(s + 'T00:00:00Z');
30
+ return isNaN(d.getTime()) ? null : d;
31
+ }
32
+ function monthIndex(name) {
33
+ const lower = name.toLowerCase();
34
+ const full = MONTH_NAMES.indexOf(lower);
35
+ return full >= 0 ? full : MONTH_ABBR.indexOf(lower);
36
+ }
37
+ /** Extract every parseable date from a string, returning Date objects. */
38
+ export function extractDatesFromText(text, defaultYear) {
39
+ const out = [];
40
+ for (const m of text.matchAll(ISO_DATE_PATTERN)) {
41
+ const d = parseIsoDate(m[0]);
42
+ if (d)
43
+ out.push(d);
44
+ }
45
+ for (const m of text.matchAll(MONTH_PATTERN)) {
46
+ const month = monthIndex(m[1]);
47
+ const day = parseInt(m[2], 10);
48
+ const year = m[3] ? parseInt(m[3], 10) : (defaultYear ?? new Date().getUTCFullYear());
49
+ if (month >= 0 && day >= 1 && day <= 31) {
50
+ const d = new Date(Date.UTC(year, month, day));
51
+ if (!isNaN(d.getTime()))
52
+ out.push(d);
53
+ }
54
+ }
55
+ return out;
56
+ }
57
+ /** Identify two anchor phrases from the query (between X and Y / from X to Y). */
58
+ function extractAnchorPhrases(query) {
59
+ const patterns = [
60
+ /between (.+?) and (.+?)(?:\?|\.|$)/i,
61
+ /from (.+?) (?:to|until) (.+?)(?:\?|\.|$)/i,
62
+ /\b(.+?) (?:to|until|and) (.+?)(?:\?|\.|$)/i,
63
+ ];
64
+ for (const p of patterns) {
65
+ const m = query.match(p);
66
+ if (m?.[1] && m[2]) {
67
+ return { start: m[1].trim(), end: m[2].trim() };
68
+ }
69
+ }
70
+ return null;
71
+ }
72
+ /** Score how strongly a memory matches an anchor phrase (substring + word-overlap). */
73
+ function anchorMatchScore(anchorText, memoryText) {
74
+ const anchor = anchorText.toLowerCase();
75
+ const mem = memoryText.toLowerCase();
76
+ if (mem.includes(anchor))
77
+ return 1.0;
78
+ const anchorWords = anchor.split(/\s+/).filter(w => w.length > 3);
79
+ if (anchorWords.length === 0)
80
+ return 0;
81
+ const hits = anchorWords.filter(w => mem.includes(w)).length;
82
+ return hits / anchorWords.length;
83
+ }
84
+ /** Pick the best-matching memory for an anchor phrase, return its primary date. */
85
+ function dateForAnchor(anchorText, memories) {
86
+ let bestScore = 0.5;
87
+ let bestDate = null;
88
+ for (const m of memories) {
89
+ const score = anchorMatchScore(anchorText, m.text);
90
+ if (score < bestScore)
91
+ continue;
92
+ const candidates = [];
93
+ if (m.observedAt)
94
+ candidates.push(m.observedAt);
95
+ candidates.push(...extractDatesFromText(m.text));
96
+ if (candidates.length > 0) {
97
+ bestScore = score;
98
+ bestDate = candidates[0];
99
+ }
100
+ }
101
+ return bestDate;
102
+ }
103
+ function formatDurationForQuery(query, days) {
104
+ if (/\bweeks?\b/i.test(query)) {
105
+ const weeks = Math.round(days / 7);
106
+ return `${weeks} weeks`;
107
+ }
108
+ if (/\bmonths?\b/i.test(query)) {
109
+ const months = Math.round(days / 30);
110
+ return `${months} months`;
111
+ }
112
+ return `${days} days`;
113
+ }
114
+ function isoSlice(d) { return d.toISOString().slice(0, 10); }
115
+ export async function runTrSpecialist(deps) {
116
+ const empty = {
117
+ answer: '',
118
+ handled: false,
119
+ startDate: null,
120
+ endDate: null,
121
+ durationDays: null,
122
+ usedLlm: false,
123
+ };
124
+ if (!shouldInvokeTrSpecialist(deps.query))
125
+ return empty;
126
+ const handled = { ...empty, handled: true };
127
+ if (deps.memories.length === 0)
128
+ return handled;
129
+ const anchors = extractAnchorPhrases(deps.query);
130
+ if (!anchors)
131
+ return handled;
132
+ const startDate = dateForAnchor(anchors.start, deps.memories);
133
+ const endDate = dateForAnchor(anchors.end, deps.memories);
134
+ if (!startDate || !endDate)
135
+ return handled;
136
+ const days = Math.abs(Math.round((endDate.getTime() - startDate.getTime()) / DAY_MS));
137
+ const dur = formatDurationForQuery(deps.query, days);
138
+ return {
139
+ answer: `${dur} between ${anchors.start} (${isoSlice(startDate)}) and ${anchors.end} (${isoSlice(endDate)}).`,
140
+ handled: true,
141
+ startDate,
142
+ endDate,
143
+ durationDays: days,
144
+ usedLlm: false,
145
+ };
146
+ }