@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,205 @@
1
+ /**
2
+ * Deterministic event-anchor fact generation for Cat2-style disambiguation.
3
+ * Converts high-signal extracted facts into explicit event memories such as
4
+ * "event anchor mentorship.received for Jon occurred on June 15 2023" so
5
+ * retrieval and answer-time prompting can rely on structured event labels.
6
+ */
7
+ import { dedupeEntities } from './entity-dedup.js';
8
+ import { extractRelativeTemporalAnchors } from './relative-temporal.js';
9
+ const RECORDED_DATE_PATTERN = /^As of ([A-Za-z]+ \d{1,2} \d{4}),\s*/i;
10
+ const EXPLICIT_EVENT_ANCHOR_PATTERN = /\bevent anchor\s+[a-z.]+/i;
11
+ const EVENT_DATE_PATTERN = /\boccurred on ([A-Za-z]+ \d{1,2} \d{4})\b/i;
12
+ const NON_SUBJECT_TOKENS = new Set(['Hey', 'Long', 'Yesterday', 'Thats', 'Awesome', 'Oh', 'Paris', 'Rome', 'Barcelona']);
13
+ const MONTH_INDEX = {
14
+ january: 0,
15
+ february: 1,
16
+ march: 2,
17
+ april: 3,
18
+ may: 4,
19
+ june: 5,
20
+ july: 6,
21
+ august: 7,
22
+ september: 8,
23
+ october: 9,
24
+ november: 10,
25
+ december: 11,
26
+ };
27
+ export function inferEventAnchorFacts(fact) {
28
+ if (EXPLICIT_EVENT_ANCHOR_PATTERN.test(fact.fact)) {
29
+ return [];
30
+ }
31
+ const recordedDate = parseRecordedDate(fact.fact);
32
+ if (!recordedDate) {
33
+ return [];
34
+ }
35
+ return inferDescriptors(fact, recordedDate).map((descriptor) => buildAnchorFact(fact, descriptor));
36
+ }
37
+ function inferDescriptors(fact, recordedDate) {
38
+ const lower = fact.fact.toLowerCase();
39
+ const subject = inferSubject(fact);
40
+ if (!subject) {
41
+ return [];
42
+ }
43
+ const eventDateIso = inferEventDateIso(fact.fact, recordedDate);
44
+ const descriptors = [];
45
+ for (const rule of DESCRIPTOR_RULES) {
46
+ const labels = rule(lower);
47
+ for (const label of labels) {
48
+ descriptors.push({ label, subject, eventDateIso });
49
+ }
50
+ }
51
+ return dedupeDescriptors(descriptors);
52
+ }
53
+ /** Ordered list of pattern-matching rules, each returning zero or more labels. */
54
+ const DESCRIPTOR_RULES = [
55
+ (l) => l.includes('accepted') && l.includes('internship') ? ['internship.accepted'] : [],
56
+ (l) => l.includes('interview') && l.includes('internship') ? ['internship.interviewed'] : [],
57
+ (l) => (l.includes('got mentored') || l.includes('mentored by') || l.includes('received mentorship')) ? ['mentorship.received'] : [],
58
+ (l) => (l.includes('mentoring') || l.includes('mentor aspiring') || l.includes('one-on-one mentoring')) ? ['mentorship.given'] : [],
59
+ inferNetworkingLabels,
60
+ inferParisLabels,
61
+ inferRomeLabels,
62
+ (l) => (l.includes('collaborat') || l.includes('content creation') || l.includes('social media management'))
63
+ && (l.includes('plan') || l.includes('help') || l.includes('offered')) ? ['collaboration.decided'] : [],
64
+ (l) => l.includes('shia labeouf') ? ['quote.mentioned'] : [],
65
+ (l) => l.includes('dance class') && l.includes('group of friends') ? ['dance_class.attended'] : [],
66
+ ];
67
+ function inferNetworkingLabels(lower) {
68
+ if (!lower.includes('networking'))
69
+ return [];
70
+ if (lower.includes('chose to attend') || lower.includes('go to networking')
71
+ || lower.includes('visit networking') || lower.includes('yesterday')) {
72
+ return ['networking.first_visit'];
73
+ }
74
+ if (lower.includes('last networking event') || lower.includes('met investors')) {
75
+ return ['networking.followup'];
76
+ }
77
+ return [];
78
+ }
79
+ function inferParisLabels(lower) {
80
+ if (!lower.includes('paris'))
81
+ return [];
82
+ const labels = ['trip.paris'];
83
+ if (lower.includes('return') || lower.includes('returned from') || lower.includes('returns from')) {
84
+ labels.push('trip.returned_from_paris');
85
+ }
86
+ return labels;
87
+ }
88
+ function inferRomeLabels(lower) {
89
+ if (!lower.includes('rome'))
90
+ return [];
91
+ const labels = ['trip.rome'];
92
+ if (lower.includes('short trip')) {
93
+ labels.push('trip.took_short_trip_rome');
94
+ }
95
+ return labels;
96
+ }
97
+ function buildAnchorFact(sourceFact, descriptor) {
98
+ const recordedPrefix = sourceFact.fact.match(RECORDED_DATE_PATTERN)?.[1];
99
+ const eventDateHuman = formatHumanDate(descriptor.eventDateIso);
100
+ const anchorFact = `As of ${recordedPrefix}, event anchor ${descriptor.label} for ${descriptor.subject} occurred on ${eventDateHuman}.`;
101
+ return {
102
+ fact: anchorFact,
103
+ headline: `Event ${descriptor.label}`,
104
+ importance: Math.max(sourceFact.importance, 0.85),
105
+ type: 'knowledge',
106
+ keywords: buildKeywords(descriptor),
107
+ entities: buildEntities(sourceFact.entities, descriptor.subject),
108
+ relations: [],
109
+ network: sourceFact.network,
110
+ opinionConfidence: sourceFact.opinionConfidence ?? null,
111
+ };
112
+ }
113
+ function inferSubject(fact) {
114
+ const people = fact.entities
115
+ .filter((entity) => entity.name !== 'User' && looksLikeSubjectEntity(entity))
116
+ .map((entity) => entity.name);
117
+ if (people.length >= 2 && fact.fact.toLowerCase().includes('collaborat')) {
118
+ return people.sort().join(' and ');
119
+ }
120
+ if (people.length > 0) {
121
+ return people[people.length - 1];
122
+ }
123
+ if (/\buser\b/i.test(fact.fact)) {
124
+ return 'User';
125
+ }
126
+ return null;
127
+ }
128
+ function looksLikeSubjectEntity(entity) {
129
+ if (NON_SUBJECT_TOKENS.has(entity.name)) {
130
+ return false;
131
+ }
132
+ if (entity.type === 'person') {
133
+ return true;
134
+ }
135
+ return entity.type === 'concept' && /^[A-Z][a-z]+(?:\s+[A-Z][a-z]+)?$/.test(entity.name);
136
+ }
137
+ function inferEventDateIso(text, recordedDate) {
138
+ const relativeAnchor = extractRelativeTemporalAnchors(text, recordedDate)[0];
139
+ if (relativeAnchor) {
140
+ return relativeAnchor.eventDate;
141
+ }
142
+ const explicit = text.match(EVENT_DATE_PATTERN);
143
+ if (explicit) {
144
+ return formatIsoDate(explicit[1]);
145
+ }
146
+ return recordedDate.toISOString().slice(0, 10);
147
+ }
148
+ function buildKeywords(descriptor) {
149
+ return [
150
+ ...descriptor.label.split('.'),
151
+ descriptor.label,
152
+ descriptor.subject,
153
+ formatHumanDate(descriptor.eventDateIso),
154
+ ];
155
+ }
156
+ function buildEntities(entities, subject) {
157
+ const baseEntities = entities.filter((entity) => entity.type === 'person' && entity.name !== 'User');
158
+ const subjectEntities = subject
159
+ .split(' and ')
160
+ .map((name) => name.trim())
161
+ .filter(Boolean)
162
+ .map((name) => ({ name, type: 'person' }));
163
+ return dedupeEntities([...baseEntities, ...subjectEntities, { name: 'event anchor', type: 'concept' }]);
164
+ }
165
+ function dedupeDescriptors(descriptors) {
166
+ const unique = new Map();
167
+ for (const descriptor of descriptors) {
168
+ unique.set(`${descriptor.label}:${descriptor.subject}:${descriptor.eventDateIso}`, descriptor);
169
+ }
170
+ return [...unique.values()];
171
+ }
172
+ function parseRecordedDate(text) {
173
+ const match = text.match(RECORDED_DATE_PATTERN);
174
+ if (!match) {
175
+ return null;
176
+ }
177
+ return parseHumanDate(match[1]);
178
+ }
179
+ function parseHumanDate(input) {
180
+ const match = input.match(/^([A-Za-z]+) (\d{1,2}) (\d{4})$/);
181
+ if (!match) {
182
+ return null;
183
+ }
184
+ const month = MONTH_INDEX[match[1].toLowerCase()];
185
+ if (month === undefined) {
186
+ return null;
187
+ }
188
+ return new Date(Date.UTC(Number(match[3]), month, Number(match[2]), 0, 0, 0, 0));
189
+ }
190
+ function formatHumanDate(isoDate) {
191
+ const [year, month, day] = isoDate.split('-').map(Number);
192
+ return new Date(Date.UTC(year, month - 1, day, 0, 0, 0, 0)).toLocaleDateString('en-US', {
193
+ timeZone: 'UTC',
194
+ month: 'long',
195
+ day: 'numeric',
196
+ year: 'numeric',
197
+ });
198
+ }
199
+ function formatIsoDate(input) {
200
+ const parsed = parseHumanDate(input);
201
+ if (!parsed) {
202
+ return input;
203
+ }
204
+ return parsed.toISOString().slice(0, 10);
205
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Event-chain detector — finds per-entity chronological sequences in a set
3
+ * of retrieved memories.
4
+ *
5
+ * Replaces the TLL invocation regex. Rather than guess from query phrasing
6
+ * whether ordering matters, this module inspects the retrieved data: if 3+
7
+ * memories share an entity AND span 3+ distinct observed_at dates AND
8
+ * exhibit state-change between them, that's a chain worth emitting.
9
+ *
10
+ * Decisions are data-driven; no prompt regex.
11
+ */
12
+ export interface ChainMember {
13
+ memoryId: string;
14
+ observedAt: Date;
15
+ text: string;
16
+ }
17
+ export interface EventChain {
18
+ entity: string;
19
+ /** Members sorted ascending by observedAt. */
20
+ members: ChainMember[];
21
+ /**
22
+ * Score reflecting confidence the chain is meaningful for ordering questions.
23
+ * Higher = more confident. Computed from #members × distinct-date-count × 1.0.
24
+ */
25
+ score: number;
26
+ }
27
+ export interface ChainDetectorCandidate {
28
+ id: string;
29
+ text: string;
30
+ observedAt: Date;
31
+ /** Primary entity key; when provided, used directly for grouping. */
32
+ entityIds?: string[];
33
+ }
34
+ export interface ChainDetectorInput {
35
+ /** The retrieved memories from RRF + reranking. Order does not matter. */
36
+ candidates: ReadonlyArray<ChainDetectorCandidate>;
37
+ /** Minimum members to qualify as a chain. Recommended default: 3. */
38
+ minMembers: number;
39
+ /** Minimum number of distinct observed_at dates among members. Recommended default: 3. */
40
+ minDistinctDates: number;
41
+ }
42
+ export interface ChainDetectorResult {
43
+ /** Event chains sorted descending by score. */
44
+ chains: EventChain[];
45
+ }
46
+ /**
47
+ * Detect per-entity chronological event chains in a retrieved candidate set.
48
+ *
49
+ * Returns chains sorted descending by score. Chains below CHAIN_SCORE_FLOOR
50
+ * or with fewer than minMembers / minDistinctDates are excluded.
51
+ */
52
+ export declare function detectEventChains(input: ChainDetectorInput): ChainDetectorResult;
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Event-chain detector — finds per-entity chronological sequences in a set
3
+ * of retrieved memories.
4
+ *
5
+ * Replaces the TLL invocation regex. Rather than guess from query phrasing
6
+ * whether ordering matters, this module inspects the retrieved data: if 3+
7
+ * memories share an entity AND span 3+ distinct observed_at dates AND
8
+ * exhibit state-change between them, that's a chain worth emitting.
9
+ *
10
+ * Decisions are data-driven; no prompt regex.
11
+ */
12
+ /** Minimum score a candidate chain must reach to be emitted. */
13
+ const CHAIN_SCORE_FLOOR = 9;
14
+ /**
15
+ * Extract a fallback grouping key from memory text when entityIds is absent.
16
+ * Takes the first non-stopword token from the text, normalized to lowercase.
17
+ * Crude but avoids an LLM call — keeps this module synchronous and zero-latency.
18
+ */
19
+ function extractFallbackEntityKey(text) {
20
+ const stopwords = new Set([
21
+ 'the', 'a', 'an', 'i', 'my', 'your', 'user', 'is', 'was', 'has', 'have',
22
+ 'to', 'of', 'in', 'on', 'at', 'for', 'and', 'or', 'it', 'this', 'that',
23
+ ]);
24
+ const tokens = text.toLowerCase().replace(/[^a-z0-9\s]/g, '').split(/\s+/);
25
+ const meaningful = tokens.find((t) => t.length >= 3 && !stopwords.has(t));
26
+ return meaningful ?? '__unknown__';
27
+ }
28
+ /** Derive a stable entity key from a candidate. */
29
+ function entityKey(candidate) {
30
+ if (candidate.entityIds && candidate.entityIds.length > 0) {
31
+ return candidate.entityIds[0];
32
+ }
33
+ return extractFallbackEntityKey(candidate.text);
34
+ }
35
+ /** Count the number of distinct calendar-day strings in a set of dates. */
36
+ function countDistinctDates(dates) {
37
+ return new Set(dates.map((d) => d.toISOString().slice(0, 10))).size;
38
+ }
39
+ /** Build one EventChain from a validated group of candidates. */
40
+ function buildChain(entity, group) {
41
+ const sorted = [...group].sort((a, b) => a.observedAt.getTime() - b.observedAt.getTime());
42
+ const distinctDates = countDistinctDates(sorted.map((c) => c.observedAt));
43
+ const score = sorted.length * distinctDates;
44
+ const members = sorted.map((c) => ({
45
+ memoryId: c.id,
46
+ observedAt: c.observedAt,
47
+ text: c.text,
48
+ }));
49
+ return { entity, members, score };
50
+ }
51
+ /**
52
+ * Detect per-entity chronological event chains in a retrieved candidate set.
53
+ *
54
+ * Returns chains sorted descending by score. Chains below CHAIN_SCORE_FLOOR
55
+ * or with fewer than minMembers / minDistinctDates are excluded.
56
+ */
57
+ export function detectEventChains(input) {
58
+ const { candidates, minMembers, minDistinctDates } = input;
59
+ if (candidates.length === 0)
60
+ return { chains: [] };
61
+ // Group candidates by entity key
62
+ const groups = new Map();
63
+ for (const candidate of candidates) {
64
+ const key = entityKey(candidate);
65
+ if (!groups.has(key))
66
+ groups.set(key, []);
67
+ groups.get(key).push(candidate);
68
+ }
69
+ const chains = [];
70
+ for (const [entity, group] of groups) {
71
+ if (group.length < minMembers)
72
+ continue;
73
+ const distinctDates = countDistinctDates(group.map((c) => c.observedAt));
74
+ if (distinctDates < minDistinctDates)
75
+ continue;
76
+ const chain = buildChain(entity, group);
77
+ if (chain.score < CHAIN_SCORE_FLOOR)
78
+ continue;
79
+ chains.push(chain);
80
+ }
81
+ chains.sort((a, b) => b.score - a.score);
82
+ return { chains };
83
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Disk-based extraction cache for deterministic eval runs.
3
+ * Caches extractFacts() and resolveAUDN() results keyed by input hash.
4
+ * When EXTRACTION_CACHE_ENABLED=true, identical inputs produce identical
5
+ * outputs across runs, eliminating LLM non-determinism from eval comparisons.
6
+ */
7
+ import { type AUDNDecision, type ExtractionOptions, type ExtractedFact, type ExistingMemory } from './extraction.js';
8
+ export declare function cachedExtractFacts(conversationText: string, options?: ExtractionOptions): Promise<ExtractedFact[]>;
9
+ export declare function cachedResolveAUDN(newFact: string, existingMemories: ExistingMemory[]): Promise<AUDNDecision>;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Disk-based extraction cache for deterministic eval runs.
3
+ * Caches extractFacts() and resolveAUDN() results keyed by input hash.
4
+ * When EXTRACTION_CACHE_ENABLED=true, identical inputs produce identical
5
+ * outputs across runs, eliminating LLM non-determinism from eval comparisons.
6
+ */
7
+ import { createHash } from 'node:crypto';
8
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { config } from '../config.js';
11
+ import { extractFacts, resolveAUDN, } from './extraction.js';
12
+ function hashInput(parts) {
13
+ return createHash('sha256').update(parts.join('\0')).digest('hex').slice(0, 16);
14
+ }
15
+ function cacheFilePath(key) {
16
+ return join(config.extractionCacheDir, `${key}.json`);
17
+ }
18
+ function readCache(filePath) {
19
+ if (!existsSync(filePath))
20
+ return null;
21
+ const raw = readFileSync(filePath, 'utf-8');
22
+ return JSON.parse(raw);
23
+ }
24
+ function writeCache(filePath, value) {
25
+ mkdirSync(config.extractionCacheDir, { recursive: true });
26
+ const tmpPath = `${filePath}.tmp`;
27
+ writeFileSync(tmpPath, JSON.stringify(value, null, 2), 'utf-8');
28
+ renameSync(tmpPath, filePath);
29
+ }
30
+ export async function cachedExtractFacts(conversationText, options = {}) {
31
+ if (!config.extractionCacheEnabled)
32
+ return extractFacts(conversationText, options);
33
+ const key = `extract-${hashInput([conversationText, JSON.stringify(options)])}`;
34
+ const filePath = cacheFilePath(key);
35
+ const cached = readCache(filePath);
36
+ if (cached)
37
+ return cached;
38
+ const result = await extractFacts(conversationText, options);
39
+ writeCache(filePath, result);
40
+ return result;
41
+ }
42
+ export async function cachedResolveAUDN(newFact, existingMemories) {
43
+ if (!config.extractionCacheEnabled)
44
+ return resolveAUDN(newFact, existingMemories);
45
+ const memoriesKey = JSON.stringify(existingMemories.map((m) => ({ id: m.id, content: m.content, similarity: m.similarity })));
46
+ const key = `audn-${hashInput([newFact, memoriesKey])}`;
47
+ const filePath = cacheFilePath(key);
48
+ const cached = readCache(filePath);
49
+ if (cached)
50
+ return cached;
51
+ const result = await resolveAUDN(newFact, existingMemories);
52
+ writeCache(filePath, result);
53
+ return result;
54
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Deterministic enrichment for extracted entities and relations.
3
+ * Complements LLM extraction by adding a stable self entity plus high-signal
4
+ * relation/entity patterns that the model often omits in temporal comparison
5
+ * facts and advisor/timeline facts.
6
+ */
7
+ import type { ExtractedFact } from './extraction.js';
8
+ export declare function enrichExtractedFacts(facts: ExtractedFact[]): ExtractedFact[];
9
+ export declare function enrichExtractedFact(fact: ExtractedFact): ExtractedFact;
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Deterministic enrichment for extracted entities and relations.
3
+ * Complements LLM extraction by adding a stable self entity plus high-signal
4
+ * relation/entity patterns that the model often omits in temporal comparison
5
+ * facts and advisor/timeline facts.
6
+ */
7
+ import { dedupeEntities } from './entity-dedup.js';
8
+ import { inferEventAnchorFacts } from './event-anchor-facts.js';
9
+ const SELF_ENTITY = { name: 'User', type: 'person' };
10
+ const SELF_MARKERS = ['user ', 'user\'s', 'i ', 'i\'m', 'i’ve', 'i have', 'my '];
11
+ const PREFERENCE_MARKERS = ['prefer', 'favorite', 'love', 'like', "can't go back"];
12
+ const USES_MARKERS = ['using', 'use', 'added', 'implemented', 'integration', 'switched from', 'switch from', 'switch to'];
13
+ const WORKS_ON_MARKERS = ['building', 'working on', 'started', 'created', 'built', 'update on'];
14
+ const KNOWS_MARKERS = ['advisor', 'career advice from', 'supportive', 'recommendation letter', 'recommended by'];
15
+ const STUDIES_MARKERS = ['focus on', 'studying', 'research', 'paper on'];
16
+ const TOOL_NAMES = new Set([
17
+ 'React',
18
+ 'TypeScript',
19
+ 'Vite',
20
+ 'Tailwind CSS',
21
+ 'Supabase',
22
+ 'Plaid',
23
+ 'tRPC',
24
+ 'React Query',
25
+ 'TanStack Virtual',
26
+ 'Vercel',
27
+ 'GRE',
28
+ 'EMNLP 2025',
29
+ 'ACL 2026',
30
+ ]);
31
+ const ORGANIZATION_NAMES = new Set([
32
+ 'OpenAI',
33
+ 'Anthropic',
34
+ 'Google',
35
+ 'Meta',
36
+ 'Microsoft Research',
37
+ 'Stanford',
38
+ 'MIT',
39
+ 'CMU',
40
+ 'UC Berkeley',
41
+ ]);
42
+ const CANONICAL_ENTITY_NAMES = {
43
+ msr: 'Microsoft Research',
44
+ };
45
+ export function enrichExtractedFacts(facts) {
46
+ const enriched = facts.flatMap((fact) => {
47
+ const baseFact = enrichExtractedFact(fact);
48
+ return [baseFact, ...inferEventAnchorFacts(baseFact)];
49
+ });
50
+ return dedupeFacts(enriched);
51
+ }
52
+ export function enrichExtractedFact(fact) {
53
+ const entities = dedupeEntities([
54
+ ...fact.entities,
55
+ ...inferKeywordEntities(fact),
56
+ ...inferFactEntities(fact.fact),
57
+ ]);
58
+ const withSelf = shouldAddSelfEntity(fact.fact) ? dedupeEntities([SELF_ENTITY, ...entities]) : entities;
59
+ const relations = dedupeRelations([
60
+ ...fact.relations,
61
+ ...inferRelations(fact.fact, withSelf),
62
+ ]);
63
+ return { ...fact, entities: withSelf, relations };
64
+ }
65
+ function shouldAddSelfEntity(text) {
66
+ const lower = text.toLowerCase();
67
+ return SELF_MARKERS.some((marker) => lower.includes(marker));
68
+ }
69
+ function inferKeywordEntities(fact) {
70
+ return fact.keywords
71
+ .map((keyword) => inferEntityFromToken(keyword, fact.fact))
72
+ .filter((entity) => entity !== null);
73
+ }
74
+ function inferFactEntities(text) {
75
+ const matches = [];
76
+ const personMatches = text.match(/\bDr\.\s+[A-Z][a-z]+(?:\s+[A-Z][a-z]+)?\b/g) ?? [];
77
+ for (const match of personMatches) {
78
+ matches.push({ name: match.trim(), type: 'person' });
79
+ }
80
+ const projectMatches = text.match(/\b(?:the\s+)?([A-Za-z0-9.-]+(?:\s+[A-Za-z0-9.-]+){0,2}\s+(?:tracker|project|app|repo|dashboard|paper))\b/gi) ?? [];
81
+ for (const match of projectMatches) {
82
+ matches.push({ name: normalizeEntityDisplay(match), type: 'project' });
83
+ }
84
+ const orgMatches = text.match(/\b(?:Microsoft Research|UC Berkeley|Stanford|MIT|CMU|Google|Meta|OpenAI|Anthropic)\b/g) ?? [];
85
+ for (const match of orgMatches) {
86
+ matches.push({ name: normalizeEntityDisplay(match), type: 'organization' });
87
+ }
88
+ const titleMatches = [
89
+ ...extractPatternCaptures(text, /\b(?:recommended|reading|book(?:\s+\w+){0,2}\s+was|favorite childhood book was|favorite book was|song|songs|listening to|fan of)\s+("?)([A-Z][A-Za-z'’.-]+(?:\s+[A-Z][A-Za-z'’.-]+)*)\1/g),
90
+ ...extractPatternCaptures(text, /["“”]([^"“”]{2,80})["“”]/g),
91
+ ];
92
+ for (const match of titleMatches) {
93
+ matches.push({ name: normalizeEntityDisplay(match), type: 'concept' });
94
+ }
95
+ const petMatches = extractPatternCaptures(text, /\b([A-Z][a-z]+)\s+(?:hid|hides|found|finds|was|is)\s+(?:his|her|a|an|the)\b/g);
96
+ for (const match of petMatches) {
97
+ matches.push({ name: normalizeEntityDisplay(match), type: 'concept' });
98
+ }
99
+ return matches;
100
+ }
101
+ function inferEntityFromToken(token, factText) {
102
+ const cleaned = normalizeEntityDisplay(token);
103
+ const canonical = CANONICAL_ENTITY_NAMES[cleaned.toLowerCase()] ?? cleaned;
104
+ if (TOOL_NAMES.has(canonical)) {
105
+ return { name: canonical, type: 'tool' };
106
+ }
107
+ if (ORGANIZATION_NAMES.has(canonical)) {
108
+ return { name: canonical, type: 'organization' };
109
+ }
110
+ if (/^Dr\.\s+[A-Z]/.test(canonical)) {
111
+ return { name: canonical, type: 'person' };
112
+ }
113
+ if (looksLikeProject(canonical, factText)) {
114
+ return { name: canonical, type: 'project' };
115
+ }
116
+ if (looksLikeConcept(canonical, factText)) {
117
+ return { name: canonical, type: 'concept' };
118
+ }
119
+ return null;
120
+ }
121
+ function inferRelations(text, entities) {
122
+ const lower = text.toLowerCase();
123
+ const relations = [];
124
+ const grouped = groupEntitiesByType(entities);
125
+ if (grouped.self) {
126
+ inferSelfRelations(lower, grouped.self.name, grouped, relations);
127
+ }
128
+ inferCrossEntityRelations(lower, grouped, relations);
129
+ return relations.filter((relation) => relation.source !== relation.target);
130
+ }
131
+ /** Partition entities into typed groups for relation inference. */
132
+ function groupEntitiesByType(entities) {
133
+ return {
134
+ self: entities.find((e) => e.name === SELF_ENTITY.name),
135
+ people: entities.filter((e) => e.type === 'person' && e.name !== SELF_ENTITY.name),
136
+ tools: entities.filter((e) => e.type === 'tool'),
137
+ projects: entities.filter((e) => e.type === 'project'),
138
+ orgs: entities.filter((e) => e.type === 'organization'),
139
+ concepts: entities.filter((e) => e.type === 'concept'),
140
+ };
141
+ }
142
+ /** Infer relations from the self entity to other entities based on text markers. */
143
+ function inferSelfRelations(lower, selfName, grouped, relations) {
144
+ const markerRules = [
145
+ { markers: USES_MARKERS, targets: grouped.tools, type: 'uses' },
146
+ { markers: WORKS_ON_MARKERS, targets: grouped.projects, type: 'works_on' },
147
+ { markers: PREFERENCE_MARKERS, targets: grouped.tools, type: 'prefers' },
148
+ { markers: KNOWS_MARKERS, targets: grouped.people, type: 'knows' },
149
+ { markers: STUDIES_MARKERS, targets: grouped.concepts, type: 'studies' },
150
+ ];
151
+ for (const rule of markerRules) {
152
+ if (containsAny(lower, rule.markers)) {
153
+ for (const target of rule.targets) {
154
+ relations.push({ source: selfName, target: target.name, type: rule.type });
155
+ }
156
+ }
157
+ }
158
+ if (/\bwork(?:ing)?(?:\s+as\s+.+?)?\s+at\b/.test(lower)) {
159
+ for (const org of grouped.orgs) {
160
+ relations.push({ source: selfName, target: org.name, type: 'works_at' });
161
+ }
162
+ }
163
+ }
164
+ /** Infer cross-entity relations (person-org, project-tool). */
165
+ function inferCrossEntityRelations(lower, grouped, relations) {
166
+ if (grouped.people.length > 0 && grouped.orgs.length > 0 && /\bat\b/.test(lower)) {
167
+ for (const person of grouped.people) {
168
+ for (const org of grouped.orgs) {
169
+ relations.push({ source: person.name, target: org.name, type: 'works_at' });
170
+ }
171
+ }
172
+ }
173
+ if (grouped.projects.length > 0 && grouped.tools.length > 0 && containsAny(lower, USES_MARKERS)) {
174
+ for (const project of grouped.projects) {
175
+ for (const tool of grouped.tools) {
176
+ relations.push({ source: project.name, target: tool.name, type: 'uses' });
177
+ }
178
+ }
179
+ }
180
+ }
181
+ function containsAny(text, markers) {
182
+ return markers.some((marker) => text.includes(marker));
183
+ }
184
+ function looksLikeProject(token, factText) {
185
+ const lowerToken = token.toLowerCase();
186
+ return /\b(tracker|project|app|repo|dashboard|paper)\b/.test(lowerToken)
187
+ || factText.toLowerCase().includes(`the ${lowerToken}`)
188
+ || lowerToken === 'dotctl';
189
+ }
190
+ function looksLikeConcept(token, factText) {
191
+ const lowerToken = token.toLowerCase();
192
+ return /\b(llms?|machine translation|transfer learning|low-resource|phd|languages?)\b/.test(lowerToken)
193
+ || /\b(focus on|research|paper on|studying)\b/.test(factText.toLowerCase());
194
+ }
195
+ function normalizeEntityDisplay(token) {
196
+ return token.trim().replace(/^[Tt]he\s+/, '').replace(/[. ]+$/, '');
197
+ }
198
+ function extractPatternCaptures(text, pattern) {
199
+ const matches = [];
200
+ const regex = new RegExp(pattern.source, pattern.flags);
201
+ let match;
202
+ while ((match = regex.exec(text)) !== null) {
203
+ const captured = match[2] ?? match[1];
204
+ if (captured) {
205
+ matches.push(captured.trim());
206
+ }
207
+ }
208
+ return matches;
209
+ }
210
+ function dedupeFacts(facts) {
211
+ const unique = new Map();
212
+ for (const fact of facts) {
213
+ unique.set(fact.fact.toLowerCase().replace(/\s+/g, ' ').trim(), fact);
214
+ }
215
+ return [...unique.values()];
216
+ }
217
+ function dedupeRelations(relations) {
218
+ const unique = new Map();
219
+ for (const relation of relations) {
220
+ unique.set(`${relation.source.toLowerCase()}:${relation.type}:${relation.target.toLowerCase()}`, relation);
221
+ }
222
+ return [...unique.values()];
223
+ }