@steno-ai/engine 0.1.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 (428) hide show
  1. package/dist/adapters/cache.d.ts +9 -0
  2. package/dist/adapters/cache.d.ts.map +1 -0
  3. package/dist/adapters/cache.js +2 -0
  4. package/dist/adapters/cache.js.map +1 -0
  5. package/dist/adapters/embedding.d.ts +7 -0
  6. package/dist/adapters/embedding.d.ts.map +1 -0
  7. package/dist/adapters/embedding.js +2 -0
  8. package/dist/adapters/embedding.js.map +1 -0
  9. package/dist/adapters/gemini-embedding.d.ts +18 -0
  10. package/dist/adapters/gemini-embedding.d.ts.map +1 -0
  11. package/dist/adapters/gemini-embedding.js +53 -0
  12. package/dist/adapters/gemini-embedding.js.map +1 -0
  13. package/dist/adapters/index.d.ts +7 -0
  14. package/dist/adapters/index.d.ts.map +1 -0
  15. package/dist/adapters/index.js +7 -0
  16. package/dist/adapters/index.js.map +1 -0
  17. package/dist/adapters/llm.d.ts +19 -0
  18. package/dist/adapters/llm.d.ts.map +1 -0
  19. package/dist/adapters/llm.js +2 -0
  20. package/dist/adapters/llm.js.map +1 -0
  21. package/dist/adapters/perplexity-embedding.d.ts +24 -0
  22. package/dist/adapters/perplexity-embedding.d.ts.map +1 -0
  23. package/dist/adapters/perplexity-embedding.js +78 -0
  24. package/dist/adapters/perplexity-embedding.js.map +1 -0
  25. package/dist/adapters/storage.d.ts +172 -0
  26. package/dist/adapters/storage.d.ts.map +1 -0
  27. package/dist/adapters/storage.js +2 -0
  28. package/dist/adapters/storage.js.map +1 -0
  29. package/dist/auth/api-key.d.ts +8 -0
  30. package/dist/auth/api-key.d.ts.map +1 -0
  31. package/dist/auth/api-key.js +27 -0
  32. package/dist/auth/api-key.js.map +1 -0
  33. package/dist/auth/index.d.ts +2 -0
  34. package/dist/auth/index.d.ts.map +1 -0
  35. package/dist/auth/index.js +2 -0
  36. package/dist/auth/index.js.map +1 -0
  37. package/dist/config.d.ts +296 -0
  38. package/dist/config.d.ts.map +1 -0
  39. package/dist/config.js +92 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/extraction/contradiction.d.ts +15 -0
  42. package/dist/extraction/contradiction.d.ts.map +1 -0
  43. package/dist/extraction/contradiction.js +23 -0
  44. package/dist/extraction/contradiction.js.map +1 -0
  45. package/dist/extraction/dedup.d.ts +12 -0
  46. package/dist/extraction/dedup.d.ts.map +1 -0
  47. package/dist/extraction/dedup.js +93 -0
  48. package/dist/extraction/dedup.js.map +1 -0
  49. package/dist/extraction/entity-extractor.d.ts +30 -0
  50. package/dist/extraction/entity-extractor.d.ts.map +1 -0
  51. package/dist/extraction/entity-extractor.js +145 -0
  52. package/dist/extraction/entity-extractor.js.map +1 -0
  53. package/dist/extraction/hasher.d.ts +5 -0
  54. package/dist/extraction/hasher.d.ts.map +1 -0
  55. package/dist/extraction/hasher.js +8 -0
  56. package/dist/extraction/hasher.js.map +1 -0
  57. package/dist/extraction/heuristic.d.ts +3 -0
  58. package/dist/extraction/heuristic.d.ts.map +1 -0
  59. package/dist/extraction/heuristic.js +282 -0
  60. package/dist/extraction/heuristic.js.map +1 -0
  61. package/dist/extraction/index.d.ts +10 -0
  62. package/dist/extraction/index.d.ts.map +1 -0
  63. package/dist/extraction/index.js +10 -0
  64. package/dist/extraction/index.js.map +1 -0
  65. package/dist/extraction/llm-extractor.d.ts +23 -0
  66. package/dist/extraction/llm-extractor.d.ts.map +1 -0
  67. package/dist/extraction/llm-extractor.js +238 -0
  68. package/dist/extraction/llm-extractor.js.map +1 -0
  69. package/dist/extraction/pipeline.d.ts +30 -0
  70. package/dist/extraction/pipeline.d.ts.map +1 -0
  71. package/dist/extraction/pipeline.js +398 -0
  72. package/dist/extraction/pipeline.js.map +1 -0
  73. package/dist/extraction/prompts.d.ts +28 -0
  74. package/dist/extraction/prompts.d.ts.map +1 -0
  75. package/dist/extraction/prompts.js +196 -0
  76. package/dist/extraction/prompts.js.map +1 -0
  77. package/dist/extraction/sliding-window.d.ts +41 -0
  78. package/dist/extraction/sliding-window.d.ts.map +1 -0
  79. package/dist/extraction/sliding-window.js +84 -0
  80. package/dist/extraction/sliding-window.js.map +1 -0
  81. package/dist/extraction/types.d.ts +80 -0
  82. package/dist/extraction/types.d.ts.map +1 -0
  83. package/dist/extraction/types.js +2 -0
  84. package/dist/extraction/types.js.map +1 -0
  85. package/dist/feedback/index.d.ts +2 -0
  86. package/dist/feedback/index.d.ts.map +1 -0
  87. package/dist/feedback/index.js +2 -0
  88. package/dist/feedback/index.js.map +1 -0
  89. package/dist/feedback/tracker.d.ts +25 -0
  90. package/dist/feedback/tracker.d.ts.map +1 -0
  91. package/dist/feedback/tracker.js +90 -0
  92. package/dist/feedback/tracker.js.map +1 -0
  93. package/dist/index.d.ts +12 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +13 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/models/api-key.d.ts +54 -0
  98. package/dist/models/api-key.d.ts.map +1 -0
  99. package/dist/models/api-key.js +21 -0
  100. package/dist/models/api-key.js.map +1 -0
  101. package/dist/models/edge.d.ts +78 -0
  102. package/dist/models/edge.d.ts.map +1 -0
  103. package/dist/models/edge.js +29 -0
  104. package/dist/models/edge.js.map +1 -0
  105. package/dist/models/entity.d.ts +60 -0
  106. package/dist/models/entity.d.ts.map +1 -0
  107. package/dist/models/entity.js +22 -0
  108. package/dist/models/entity.js.map +1 -0
  109. package/dist/models/extraction.d.ts +111 -0
  110. package/dist/models/extraction.d.ts.map +1 -0
  111. package/dist/models/extraction.js +40 -0
  112. package/dist/models/extraction.js.map +1 -0
  113. package/dist/models/fact-entity.d.ts +33 -0
  114. package/dist/models/fact-entity.d.ts.map +1 -0
  115. package/dist/models/fact-entity.js +14 -0
  116. package/dist/models/fact-entity.js.map +1 -0
  117. package/dist/models/fact.d.ts +191 -0
  118. package/dist/models/fact.d.ts.map +1 -0
  119. package/dist/models/fact.js +72 -0
  120. package/dist/models/fact.js.map +1 -0
  121. package/dist/models/index.d.ts +13 -0
  122. package/dist/models/index.d.ts.map +1 -0
  123. package/dist/models/index.js +13 -0
  124. package/dist/models/index.js.map +1 -0
  125. package/dist/models/memory-access.d.ts +89 -0
  126. package/dist/models/memory-access.d.ts.map +1 -0
  127. package/dist/models/memory-access.js +33 -0
  128. package/dist/models/memory-access.js.map +1 -0
  129. package/dist/models/session.d.ts +60 -0
  130. package/dist/models/session.d.ts.map +1 -0
  131. package/dist/models/session.js +23 -0
  132. package/dist/models/session.js.map +1 -0
  133. package/dist/models/tenant.d.ts +448 -0
  134. package/dist/models/tenant.d.ts.map +1 -0
  135. package/dist/models/tenant.js +23 -0
  136. package/dist/models/tenant.js.map +1 -0
  137. package/dist/models/trigger.d.ts +87 -0
  138. package/dist/models/trigger.d.ts.map +1 -0
  139. package/dist/models/trigger.js +41 -0
  140. package/dist/models/trigger.js.map +1 -0
  141. package/dist/models/usage-record.d.ts +37 -0
  142. package/dist/models/usage-record.d.ts.map +1 -0
  143. package/dist/models/usage-record.js +14 -0
  144. package/dist/models/usage-record.js.map +1 -0
  145. package/dist/models/webhook.d.ts +50 -0
  146. package/dist/models/webhook.d.ts.map +1 -0
  147. package/dist/models/webhook.js +25 -0
  148. package/dist/models/webhook.js.map +1 -0
  149. package/dist/profiles/index.d.ts +3 -0
  150. package/dist/profiles/index.d.ts.map +1 -0
  151. package/dist/profiles/index.js +2 -0
  152. package/dist/profiles/index.js.map +1 -0
  153. package/dist/profiles/profile.d.ts +22 -0
  154. package/dist/profiles/profile.d.ts.map +1 -0
  155. package/dist/profiles/profile.js +59 -0
  156. package/dist/profiles/profile.js.map +1 -0
  157. package/dist/retrieval/compound-search.d.ts +13 -0
  158. package/dist/retrieval/compound-search.d.ts.map +1 -0
  159. package/dist/retrieval/compound-search.js +87 -0
  160. package/dist/retrieval/compound-search.js.map +1 -0
  161. package/dist/retrieval/contradiction-surfacer.d.ts +18 -0
  162. package/dist/retrieval/contradiction-surfacer.d.ts.map +1 -0
  163. package/dist/retrieval/contradiction-surfacer.js +64 -0
  164. package/dist/retrieval/contradiction-surfacer.js.map +1 -0
  165. package/dist/retrieval/embedding-cache.d.ts +17 -0
  166. package/dist/retrieval/embedding-cache.d.ts.map +1 -0
  167. package/dist/retrieval/embedding-cache.js +56 -0
  168. package/dist/retrieval/embedding-cache.js.map +1 -0
  169. package/dist/retrieval/fusion.d.ts +27 -0
  170. package/dist/retrieval/fusion.d.ts.map +1 -0
  171. package/dist/retrieval/fusion.js +87 -0
  172. package/dist/retrieval/fusion.js.map +1 -0
  173. package/dist/retrieval/graph-traversal.d.ts +29 -0
  174. package/dist/retrieval/graph-traversal.d.ts.map +1 -0
  175. package/dist/retrieval/graph-traversal.js +208 -0
  176. package/dist/retrieval/graph-traversal.js.map +1 -0
  177. package/dist/retrieval/index.d.ts +14 -0
  178. package/dist/retrieval/index.d.ts.map +1 -0
  179. package/dist/retrieval/index.js +13 -0
  180. package/dist/retrieval/index.js.map +1 -0
  181. package/dist/retrieval/keyword-search.d.ts +4 -0
  182. package/dist/retrieval/keyword-search.d.ts.map +1 -0
  183. package/dist/retrieval/keyword-search.js +27 -0
  184. package/dist/retrieval/keyword-search.js.map +1 -0
  185. package/dist/retrieval/query-expansion.d.ts +20 -0
  186. package/dist/retrieval/query-expansion.d.ts.map +1 -0
  187. package/dist/retrieval/query-expansion.js +76 -0
  188. package/dist/retrieval/query-expansion.js.map +1 -0
  189. package/dist/retrieval/reranker.d.ts +15 -0
  190. package/dist/retrieval/reranker.d.ts.map +1 -0
  191. package/dist/retrieval/reranker.js +47 -0
  192. package/dist/retrieval/reranker.js.map +1 -0
  193. package/dist/retrieval/salience-scorer.d.ts +15 -0
  194. package/dist/retrieval/salience-scorer.d.ts.map +1 -0
  195. package/dist/retrieval/salience-scorer.js +41 -0
  196. package/dist/retrieval/salience-scorer.js.map +1 -0
  197. package/dist/retrieval/search.d.ts +21 -0
  198. package/dist/retrieval/search.d.ts.map +1 -0
  199. package/dist/retrieval/search.js +228 -0
  200. package/dist/retrieval/search.js.map +1 -0
  201. package/dist/retrieval/temporal-scorer.d.ts +18 -0
  202. package/dist/retrieval/temporal-scorer.d.ts.map +1 -0
  203. package/dist/retrieval/temporal-scorer.js +106 -0
  204. package/dist/retrieval/temporal-scorer.js.map +1 -0
  205. package/dist/retrieval/trigger-matcher.d.ts +18 -0
  206. package/dist/retrieval/trigger-matcher.d.ts.map +1 -0
  207. package/dist/retrieval/trigger-matcher.js +134 -0
  208. package/dist/retrieval/trigger-matcher.js.map +1 -0
  209. package/dist/retrieval/types.d.ts +70 -0
  210. package/dist/retrieval/types.d.ts.map +1 -0
  211. package/dist/retrieval/types.js +9 -0
  212. package/dist/retrieval/types.js.map +1 -0
  213. package/dist/retrieval/vector-search.d.ts +5 -0
  214. package/dist/retrieval/vector-search.d.ts.map +1 -0
  215. package/dist/retrieval/vector-search.js +24 -0
  216. package/dist/retrieval/vector-search.js.map +1 -0
  217. package/dist/salience/decay.d.ts +9 -0
  218. package/dist/salience/decay.d.ts.map +1 -0
  219. package/dist/salience/decay.js +15 -0
  220. package/dist/salience/decay.js.map +1 -0
  221. package/dist/salience/index.d.ts +2 -0
  222. package/dist/salience/index.d.ts.map +1 -0
  223. package/dist/salience/index.js +2 -0
  224. package/dist/salience/index.js.map +1 -0
  225. package/dist/scratchpad/index.d.ts +2 -0
  226. package/dist/scratchpad/index.d.ts.map +1 -0
  227. package/dist/scratchpad/index.js +2 -0
  228. package/dist/scratchpad/index.js.map +1 -0
  229. package/dist/scratchpad/scratchpad.d.ts +23 -0
  230. package/dist/scratchpad/scratchpad.d.ts.map +1 -0
  231. package/dist/scratchpad/scratchpad.js +107 -0
  232. package/dist/scratchpad/scratchpad.js.map +1 -0
  233. package/dist/sessions/index.d.ts +2 -0
  234. package/dist/sessions/index.d.ts.map +1 -0
  235. package/dist/sessions/index.js +2 -0
  236. package/dist/sessions/index.js.map +1 -0
  237. package/dist/sessions/manager.d.ts +11 -0
  238. package/dist/sessions/manager.d.ts.map +1 -0
  239. package/dist/sessions/manager.js +63 -0
  240. package/dist/sessions/manager.js.map +1 -0
  241. package/package.json +38 -0
  242. package/src/adapters/cache.d.ts +9 -0
  243. package/src/adapters/cache.d.ts.map +1 -0
  244. package/src/adapters/cache.js.map +1 -0
  245. package/src/adapters/cache.ts +8 -0
  246. package/src/adapters/embedding.d.ts +7 -0
  247. package/src/adapters/embedding.d.ts.map +1 -0
  248. package/src/adapters/embedding.js.map +1 -0
  249. package/src/adapters/embedding.ts +6 -0
  250. package/src/adapters/gemini-embedding.ts +67 -0
  251. package/src/adapters/index.ts +6 -0
  252. package/src/adapters/llm.d.ts +19 -0
  253. package/src/adapters/llm.d.ts.map +1 -0
  254. package/src/adapters/llm.js.map +1 -0
  255. package/src/adapters/llm.ts +16 -0
  256. package/src/adapters/perplexity-embedding.d.ts +24 -0
  257. package/src/adapters/perplexity-embedding.d.ts.map +1 -0
  258. package/src/adapters/perplexity-embedding.js.map +1 -0
  259. package/src/adapters/perplexity-embedding.ts +98 -0
  260. package/src/adapters/storage.d.ts +172 -0
  261. package/src/adapters/storage.d.ts.map +1 -0
  262. package/src/adapters/storage.js.map +1 -0
  263. package/src/adapters/storage.ts +187 -0
  264. package/src/auth/api-key.ts +33 -0
  265. package/src/auth/index.ts +1 -0
  266. package/src/config.d.ts +86 -0
  267. package/src/config.d.ts.map +1 -0
  268. package/src/config.js.map +1 -0
  269. package/src/config.ts +131 -0
  270. package/src/extraction/contradiction.d.ts +15 -0
  271. package/src/extraction/contradiction.d.ts.map +1 -0
  272. package/src/extraction/contradiction.js.map +1 -0
  273. package/src/extraction/contradiction.ts +33 -0
  274. package/src/extraction/dedup.d.ts +12 -0
  275. package/src/extraction/dedup.d.ts.map +1 -0
  276. package/src/extraction/dedup.js.map +1 -0
  277. package/src/extraction/dedup.ts +133 -0
  278. package/src/extraction/entity-extractor.d.ts +30 -0
  279. package/src/extraction/entity-extractor.d.ts.map +1 -0
  280. package/src/extraction/entity-extractor.js.map +1 -0
  281. package/src/extraction/entity-extractor.ts +193 -0
  282. package/src/extraction/hasher.d.ts +5 -0
  283. package/src/extraction/hasher.d.ts.map +1 -0
  284. package/src/extraction/hasher.js.map +1 -0
  285. package/src/extraction/hasher.ts +7 -0
  286. package/src/extraction/heuristic.d.ts +3 -0
  287. package/src/extraction/heuristic.d.ts.map +1 -0
  288. package/src/extraction/heuristic.js.map +1 -0
  289. package/src/extraction/heuristic.ts +341 -0
  290. package/src/extraction/index.ts +9 -0
  291. package/src/extraction/llm-extractor.d.ts +21 -0
  292. package/src/extraction/llm-extractor.d.ts.map +1 -0
  293. package/src/extraction/llm-extractor.js.map +1 -0
  294. package/src/extraction/llm-extractor.ts +267 -0
  295. package/src/extraction/pipeline.d.ts +27 -0
  296. package/src/extraction/pipeline.d.ts.map +1 -0
  297. package/src/extraction/pipeline.js.map +1 -0
  298. package/src/extraction/pipeline.ts +515 -0
  299. package/src/extraction/prompts.js.map +1 -0
  300. package/src/extraction/prompts.ts +233 -0
  301. package/src/extraction/sliding-window.d.ts +41 -0
  302. package/src/extraction/sliding-window.d.ts.map +1 -0
  303. package/src/extraction/sliding-window.js.map +1 -0
  304. package/src/extraction/sliding-window.ts +121 -0
  305. package/src/extraction/types.d.ts +68 -0
  306. package/src/extraction/types.d.ts.map +1 -0
  307. package/src/extraction/types.js.map +1 -0
  308. package/src/extraction/types.ts +80 -0
  309. package/src/feedback/index.ts +1 -0
  310. package/src/feedback/tracker.d.ts +25 -0
  311. package/src/feedback/tracker.d.ts.map +1 -0
  312. package/src/feedback/tracker.js.map +1 -0
  313. package/src/feedback/tracker.ts +119 -0
  314. package/src/index.ts +12 -0
  315. package/src/models/api-key.d.ts +54 -0
  316. package/src/models/api-key.d.ts.map +1 -0
  317. package/src/models/api-key.js.map +1 -0
  318. package/src/models/api-key.ts +26 -0
  319. package/src/models/edge.d.ts +78 -0
  320. package/src/models/edge.d.ts.map +1 -0
  321. package/src/models/edge.js.map +1 -0
  322. package/src/models/edge.ts +34 -0
  323. package/src/models/entity.d.ts +60 -0
  324. package/src/models/entity.d.ts.map +1 -0
  325. package/src/models/entity.js.map +1 -0
  326. package/src/models/entity.ts +27 -0
  327. package/src/models/extraction.d.ts +111 -0
  328. package/src/models/extraction.d.ts.map +1 -0
  329. package/src/models/extraction.js.map +1 -0
  330. package/src/models/extraction.ts +45 -0
  331. package/src/models/fact-entity.d.ts +33 -0
  332. package/src/models/fact-entity.d.ts.map +1 -0
  333. package/src/models/fact-entity.js.map +1 -0
  334. package/src/models/fact-entity.ts +19 -0
  335. package/src/models/fact.ts +85 -0
  336. package/src/models/index.d.ts +13 -0
  337. package/src/models/index.d.ts.map +1 -0
  338. package/src/models/index.js.map +1 -0
  339. package/src/models/index.ts +12 -0
  340. package/src/models/memory-access.d.ts +89 -0
  341. package/src/models/memory-access.d.ts.map +1 -0
  342. package/src/models/memory-access.js.map +1 -0
  343. package/src/models/memory-access.ts +41 -0
  344. package/src/models/session.d.ts +60 -0
  345. package/src/models/session.d.ts.map +1 -0
  346. package/src/models/session.js.map +1 -0
  347. package/src/models/session.ts +28 -0
  348. package/src/models/tenant.d.ts +214 -0
  349. package/src/models/tenant.d.ts.map +1 -0
  350. package/src/models/tenant.js.map +1 -0
  351. package/src/models/tenant.ts +28 -0
  352. package/src/models/trigger.d.ts +87 -0
  353. package/src/models/trigger.d.ts.map +1 -0
  354. package/src/models/trigger.js.map +1 -0
  355. package/src/models/trigger.ts +58 -0
  356. package/src/models/usage-record.d.ts +37 -0
  357. package/src/models/usage-record.d.ts.map +1 -0
  358. package/src/models/usage-record.js.map +1 -0
  359. package/src/models/usage-record.ts +16 -0
  360. package/src/models/webhook.d.ts +50 -0
  361. package/src/models/webhook.d.ts.map +1 -0
  362. package/src/models/webhook.js.map +1 -0
  363. package/src/models/webhook.ts +30 -0
  364. package/src/profiles/index.ts +2 -0
  365. package/src/profiles/profile.ts +81 -0
  366. package/src/retrieval/compound-search.d.ts +13 -0
  367. package/src/retrieval/compound-search.d.ts.map +1 -0
  368. package/src/retrieval/compound-search.js.map +1 -0
  369. package/src/retrieval/compound-search.ts +104 -0
  370. package/src/retrieval/contradiction-surfacer.d.ts +18 -0
  371. package/src/retrieval/contradiction-surfacer.d.ts.map +1 -0
  372. package/src/retrieval/contradiction-surfacer.js.map +1 -0
  373. package/src/retrieval/contradiction-surfacer.ts +87 -0
  374. package/src/retrieval/embedding-cache.d.ts +17 -0
  375. package/src/retrieval/embedding-cache.d.ts.map +1 -0
  376. package/src/retrieval/embedding-cache.js.map +1 -0
  377. package/src/retrieval/embedding-cache.ts +63 -0
  378. package/src/retrieval/fusion.d.ts +26 -0
  379. package/src/retrieval/fusion.d.ts.map +1 -0
  380. package/src/retrieval/fusion.js.map +1 -0
  381. package/src/retrieval/fusion.ts +129 -0
  382. package/src/retrieval/graph-traversal.d.ts +28 -0
  383. package/src/retrieval/graph-traversal.d.ts.map +1 -0
  384. package/src/retrieval/graph-traversal.js.map +1 -0
  385. package/src/retrieval/graph-traversal.ts +235 -0
  386. package/src/retrieval/index.ts +13 -0
  387. package/src/retrieval/keyword-search.ts +39 -0
  388. package/src/retrieval/query-expansion.d.ts +20 -0
  389. package/src/retrieval/query-expansion.d.ts.map +1 -0
  390. package/src/retrieval/query-expansion.js.map +1 -0
  391. package/src/retrieval/query-expansion.ts +86 -0
  392. package/src/retrieval/reranker.d.ts +15 -0
  393. package/src/retrieval/reranker.d.ts.map +1 -0
  394. package/src/retrieval/reranker.js.map +1 -0
  395. package/src/retrieval/reranker.ts +56 -0
  396. package/src/retrieval/salience-scorer.d.ts +15 -0
  397. package/src/retrieval/salience-scorer.d.ts.map +1 -0
  398. package/src/retrieval/salience-scorer.js.map +1 -0
  399. package/src/retrieval/salience-scorer.ts +57 -0
  400. package/src/retrieval/search.d.ts +21 -0
  401. package/src/retrieval/search.d.ts.map +1 -0
  402. package/src/retrieval/search.js.map +1 -0
  403. package/src/retrieval/search.ts +271 -0
  404. package/src/retrieval/temporal-scorer.ts +111 -0
  405. package/src/retrieval/trigger-matcher.d.ts +18 -0
  406. package/src/retrieval/trigger-matcher.d.ts.map +1 -0
  407. package/src/retrieval/trigger-matcher.js.map +1 -0
  408. package/src/retrieval/trigger-matcher.ts +180 -0
  409. package/src/retrieval/types.d.ts +66 -0
  410. package/src/retrieval/types.d.ts.map +1 -0
  411. package/src/retrieval/types.js.map +1 -0
  412. package/src/retrieval/types.ts +82 -0
  413. package/src/retrieval/vector-search.d.ts +5 -0
  414. package/src/retrieval/vector-search.d.ts.map +1 -0
  415. package/src/retrieval/vector-search.js.map +1 -0
  416. package/src/retrieval/vector-search.ts +38 -0
  417. package/src/salience/decay.d.ts +9 -0
  418. package/src/salience/decay.d.ts.map +1 -0
  419. package/src/salience/decay.js.map +1 -0
  420. package/src/salience/decay.ts +25 -0
  421. package/src/salience/index.ts +1 -0
  422. package/src/scratchpad/index.ts +1 -0
  423. package/src/scratchpad/scratchpad.d.ts +23 -0
  424. package/src/scratchpad/scratchpad.d.ts.map +1 -0
  425. package/src/scratchpad/scratchpad.js.map +1 -0
  426. package/src/scratchpad/scratchpad.ts +140 -0
  427. package/src/sessions/index.ts +1 -0
  428. package/src/sessions/manager.ts +87 -0
@@ -0,0 +1,341 @@
1
+ import nlp from 'compromise';
2
+ import type { ExtractionResult, ExtractedFact, ExtractedEntity } from './types.js';
3
+
4
+ // ---------------------------------------------------------------------------
5
+ // Regex patterns
6
+ // ---------------------------------------------------------------------------
7
+
8
+ const REGEX = {
9
+ email: /\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,
10
+ phone: /(?:\+?1[\s\-.]?)?\(?\d{3}\)?[\s\-.]?\d{3}[\s\-.]?\d{4}\b/g,
11
+ url: /https?:\/\/[^\s/$.?#].[^\s]*/g,
12
+ date: /\b(?:\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}|\d{4}[\/\-]\d{2}[\/\-]\d{2}|(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}(?:st|nd|rd|th)?,?\s+\d{4}|\d{1,2}(?:st|nd|rd|th)?\s+(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{4})\b/gi,
13
+ money: /\$\s?\d+(?:[.,]\d+)*(?:\.\d{2})?|\b\d+(?:[.,]\d+)*(?:\.\d{2})?\s?(?:dollars?|USD|EUR|GBP|euros?|pounds?)\b/gi,
14
+ };
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Pattern rules for personal facts
18
+ // ---------------------------------------------------------------------------
19
+
20
+ interface PatternRule {
21
+ pattern: RegExp;
22
+ template: (match: RegExpMatchArray) => string;
23
+ importance: number;
24
+ tags: string[];
25
+ }
26
+
27
+ const PATTERN_RULES: PatternRule[] = [
28
+ // Health / allergy — importance 0.95
29
+ {
30
+ pattern: /\bi(?:'m| am)\s+allergic\s+to\s+(.+?)(?:[.!?]|$)/i,
31
+ template: (m) => `User is allergic to ${m[1]!.trim()}`,
32
+ importance: 0.95,
33
+ tags: ['health', 'allergy'],
34
+ },
35
+ {
36
+ pattern: /\bi\s+have\s+(?:a\s+)?(?:allergy|allergies)\s+to\s+(.+?)(?:[.!?]|$)/i,
37
+ template: (m) => `User is allergic to ${m[1]!.trim()}`,
38
+ importance: 0.95,
39
+ tags: ['health', 'allergy'],
40
+ },
41
+ {
42
+ pattern: /\bi\s+(?:have|suffer from|was diagnosed with)\s+(.+?)(?:[.!?]|$)/i,
43
+ template: (m) => `User has ${m[1]!.trim()}`,
44
+ importance: 0.95,
45
+ tags: ['health'],
46
+ },
47
+
48
+ // Name — importance 0.9
49
+ {
50
+ pattern: /\bmy\s+name\s+is\s+([A-Za-z][a-zA-Z\s\-']{1,40}?)(?:[.!?,]|$)/i,
51
+ template: (m) => `User's name is ${m[1]!.trim()}`,
52
+ importance: 0.9,
53
+ tags: ['identity', 'name'],
54
+ },
55
+ {
56
+ pattern: /\bthey\s+call\s+me\s+([A-Za-z][a-zA-Z\s\-']{1,40}?)(?:[.!?,]|$)/i,
57
+ template: (m) => `User's name is ${m[1]!.trim()}`,
58
+ importance: 0.9,
59
+ tags: ['identity', 'name'],
60
+ },
61
+
62
+ // Identity — importance 0.85
63
+ {
64
+ pattern: /\bi(?:'m| am)\s+a(?:n)?\s+(.+?)(?:[.!?]|$)/i,
65
+ template: (m) => `User is a ${m[1]!.trim()}`,
66
+ importance: 0.85,
67
+ tags: ['identity'],
68
+ },
69
+ {
70
+ pattern: /\bi(?:'m| am)\s+([A-Z][a-z]+(?:\s+[A-Z][a-z]+)*)(?:[.!?,]|$)/,
71
+ template: (m) => `User is ${m[1]!.trim()}`,
72
+ importance: 0.85,
73
+ tags: ['identity'],
74
+ },
75
+
76
+ // Work / company — importance 0.8
77
+ {
78
+ pattern: /\bi\s+work\s+(?:at|for)\s+(.+?)(?:[.!?]|$)/i,
79
+ template: (m) => `User works at ${m[1]!.trim()}`,
80
+ importance: 0.8,
81
+ tags: ['work', 'company'],
82
+ },
83
+ {
84
+ pattern: /\bmy\s+(?:job|career|profession|occupation)\s+is\s+(.+?)(?:[.!?]|$)/i,
85
+ template: (m) => `User's job is ${m[1]!.trim()}`,
86
+ importance: 0.8,
87
+ tags: ['work'],
88
+ },
89
+ {
90
+ pattern: /\bi\s+(?:work|am employed)\s+as\s+(?:a(?:n)?\s+)?(.+?)(?:[.!?]|$)/i,
91
+ template: (m) => `User works as ${m[1]!.trim()}`,
92
+ importance: 0.8,
93
+ tags: ['work'],
94
+ },
95
+
96
+ // Location — importance 0.7
97
+ {
98
+ pattern: /\bi\s+live\s+in\s+(.+?)(?:[.!?]|$)/i,
99
+ template: (m) => `User lives in ${m[1]!.trim()}`,
100
+ importance: 0.7,
101
+ tags: ['location'],
102
+ },
103
+ {
104
+ pattern: /\bi(?:'m| am)\s+from\s+(.+?)(?:[.!?]|$)/i,
105
+ template: (m) => `User is from ${m[1]!.trim()}`,
106
+ importance: 0.7,
107
+ tags: ['location'],
108
+ },
109
+ {
110
+ pattern: /\bi\s+(?:moved|relocated)\s+to\s+(.+?)(?:[.!?]|$)/i,
111
+ template: (m) => `User moved to ${m[1]!.trim()}`,
112
+ importance: 0.7,
113
+ tags: ['location'],
114
+ },
115
+
116
+ // Preferences (like/love/enjoy) — importance 0.6
117
+ {
118
+ pattern: /\bi\s+(?:really\s+)?(?:like|love|enjoy|adore)\s+(.+?)(?:[.!?]|$)/i,
119
+ template: (m) => `User likes ${m[1]!.trim()}`,
120
+ importance: 0.6,
121
+ tags: ['preference', 'like'],
122
+ },
123
+ {
124
+ pattern: /\bmy\s+favorite\s+(?:\w+\s+)?is\s+(.+?)(?:[.!?]|$)/i,
125
+ template: (m) => `User's favorite is ${m[1]!.trim()}`,
126
+ importance: 0.6,
127
+ tags: ['preference', 'like'],
128
+ },
129
+
130
+ // Dislikes — importance 0.6
131
+ {
132
+ pattern: /\bi\s+(?:really\s+)?(?:hate|dislike|can'?t stand|despise|detest)\s+(.+?)(?:[.!?]|$)/i,
133
+ template: (m) => `User dislikes ${m[1]!.trim()}`,
134
+ importance: 0.6,
135
+ tags: ['preference', 'dislike'],
136
+ },
137
+
138
+ // Trivia / other — importance 0.3
139
+ {
140
+ pattern: /\bi\s+(?:think|believe|feel|guess|suppose)\s+(?:that\s+)?(.+?)(?:[.!?]|$)/i,
141
+ template: (m) => `User thinks ${m[1]!.trim()}`,
142
+ importance: 0.3,
143
+ tags: ['opinion'],
144
+ },
145
+ ];
146
+
147
+ // ---------------------------------------------------------------------------
148
+ // Helpers
149
+ // ---------------------------------------------------------------------------
150
+
151
+ /** Strip a "role: " prefix like "user: " or "assistant: " from a line. */
152
+ function stripRolePrefix(line: string): string {
153
+ return line.replace(/^[a-zA-Z_\-]+:\s*/, '');
154
+ }
155
+
156
+ function makeFact(
157
+ content: string,
158
+ originalContent: string,
159
+ importance: number,
160
+ confidence: number,
161
+ tags: string[],
162
+ entityCanonicalNames: string[] = [],
163
+ ): ExtractedFact {
164
+ return {
165
+ content,
166
+ importance,
167
+ confidence,
168
+ sourceType: 'conversation',
169
+ modality: 'text',
170
+ tags,
171
+ originalContent,
172
+ operation: 'add',
173
+ entityCanonicalNames,
174
+ };
175
+ }
176
+
177
+ // ---------------------------------------------------------------------------
178
+ // Regex extraction (runs on the full text)
179
+ // ---------------------------------------------------------------------------
180
+
181
+ function extractRegex(text: string): ExtractedFact[] {
182
+ const facts: ExtractedFact[] = [];
183
+ const seenContents = new Set<string>();
184
+
185
+ function addFact(content: string, original: string, tags: string[]): void {
186
+ if (!seenContents.has(content)) {
187
+ seenContents.add(content);
188
+ facts.push(makeFact(content, original, 0.8, 0.9, tags));
189
+ }
190
+ }
191
+
192
+ // Emails
193
+ for (const match of text.matchAll(REGEX.email)) {
194
+ const email = match[0]!;
195
+ addFact(`User's email is ${email}`, email, ['contact', 'email']);
196
+ }
197
+
198
+ // Phone numbers
199
+ for (const match of text.matchAll(REGEX.phone)) {
200
+ const phone = match[0]!;
201
+ addFact(`User's phone number is ${phone}`, phone, ['contact', 'phone']);
202
+ }
203
+
204
+ // URLs
205
+ for (const match of text.matchAll(REGEX.url)) {
206
+ const url = match[0]!;
207
+ addFact(`User mentioned URL: ${url}`, url, ['url']);
208
+ }
209
+
210
+ // Dates
211
+ for (const match of text.matchAll(REGEX.date)) {
212
+ const date = match[0]!;
213
+ addFact(`Mentioned date: ${date}`, date, ['date']);
214
+ }
215
+
216
+ // Money
217
+ for (const match of text.matchAll(REGEX.money)) {
218
+ const amount = match[0]!;
219
+ addFact(`Mentioned monetary amount: ${amount}`, amount, ['money']);
220
+ }
221
+
222
+ return facts;
223
+ }
224
+
225
+ // ---------------------------------------------------------------------------
226
+ // Pattern extraction (runs line by line, role prefix stripped)
227
+ // ---------------------------------------------------------------------------
228
+
229
+ function extractPatterns(lines: string[]): ExtractedFact[] {
230
+ const facts: ExtractedFact[] = [];
231
+ const seenContents = new Set<string>();
232
+
233
+ for (const rawLine of lines) {
234
+ const line = stripRolePrefix(rawLine).trim();
235
+ if (!line) continue;
236
+
237
+ for (const rule of PATTERN_RULES) {
238
+ // Reset lastIndex for global regexes (these aren't global, but be safe)
239
+ const match = line.match(rule.pattern);
240
+ if (match) {
241
+ const content = rule.template(match);
242
+ if (!seenContents.has(content)) {
243
+ seenContents.add(content);
244
+ facts.push(makeFact(content, line, rule.importance, 0.7, rule.tags));
245
+ }
246
+ // Only use the first matching rule per line to avoid overlapping facts
247
+ break;
248
+ }
249
+ }
250
+ }
251
+
252
+ return facts;
253
+ }
254
+
255
+ // ---------------------------------------------------------------------------
256
+ // NER via compromise
257
+ // ---------------------------------------------------------------------------
258
+
259
+ function extractEntities(text: string): ExtractedEntity[] {
260
+ const doc = nlp(text);
261
+ const entities: ExtractedEntity[] = [];
262
+ const seenCanonical = new Set<string>();
263
+
264
+ function addEntity(name: string, entityType: string): void {
265
+ const trimmed = name.trim();
266
+ if (!trimmed) return;
267
+ const canonical = trimmed.toLowerCase();
268
+ if (!seenCanonical.has(`${entityType}:${canonical}`)) {
269
+ seenCanonical.add(`${entityType}:${canonical}`);
270
+ entities.push({
271
+ name: trimmed,
272
+ entityType,
273
+ canonicalName: canonical,
274
+ properties: {},
275
+ });
276
+ }
277
+ }
278
+
279
+ // People
280
+ const people = doc.people().out('array') as string[];
281
+ for (const name of people) {
282
+ addEntity(name, 'person');
283
+ }
284
+
285
+ // Organizations
286
+ const orgs = doc.organizations().out('array') as string[];
287
+ for (const org of orgs) {
288
+ addEntity(org, 'organization');
289
+ }
290
+
291
+ // Places
292
+ const places = doc.places().out('array') as string[];
293
+ for (const place of places) {
294
+ addEntity(place, 'location');
295
+ }
296
+
297
+ return entities;
298
+ }
299
+
300
+ // ---------------------------------------------------------------------------
301
+ // Main export
302
+ // ---------------------------------------------------------------------------
303
+
304
+ export function extractHeuristic(text: string): ExtractionResult {
305
+ const lines = text.split('\n');
306
+
307
+ // 1. Regex extraction — run on full text
308
+ const regexFacts = extractRegex(text);
309
+ const regexContents = new Set(regexFacts.map((f) => f.content));
310
+
311
+ // 2. Pattern extraction — line by line, strip role prefix
312
+ const patternFacts = extractPatterns(lines);
313
+
314
+ // 3. De-duplicate: remove pattern facts whose content overlaps with regex facts
315
+ // (e.g., if regex grabbed the email and a pattern also mentions it)
316
+ const filteredPatternFacts = patternFacts.filter((f) => !regexContents.has(f.content));
317
+
318
+ // 4. NER entities via compromise
319
+ const entities = extractEntities(text);
320
+
321
+ const facts = [...regexFacts, ...filteredPatternFacts];
322
+
323
+ // Overall confidence: weighted average or fixed 0.9 for regex, 0.7 for pattern
324
+ // Use the maximum confidence across extracted facts, or 0.9 if only regex results exist
325
+ const confidence = facts.length > 0
326
+ ? Math.max(...facts.map((f) => f.confidence))
327
+ : entities.length > 0
328
+ ? 0.6
329
+ : 0.5;
330
+
331
+ return {
332
+ facts,
333
+ entities,
334
+ edges: [],
335
+ tier: 'heuristic',
336
+ confidence,
337
+ tokensInput: 0,
338
+ tokensOutput: 0,
339
+ model: null,
340
+ };
341
+ }
@@ -0,0 +1,9 @@
1
+ export * from './types.js';
2
+ export * from './hasher.js';
3
+ export * from './prompts.js';
4
+ export * from './heuristic.js';
5
+ export * from './contradiction.js';
6
+ export * from './entity-extractor.js';
7
+ export * from './llm-extractor.js';
8
+ export * from './dedup.js';
9
+ export * from './pipeline.js';
@@ -0,0 +1,21 @@
1
+ import type { LLMAdapter } from '../adapters/llm.js';
2
+ import type { ExtractionResult } from './types.js';
3
+ import type { ExtractionTier } from '../config.js';
4
+ export interface LLMExtractorConfig {
5
+ llm: LLMAdapter;
6
+ tier: ExtractionTier;
7
+ }
8
+ /**
9
+ * Two-pass extraction like Mem0:
10
+ * Pass 1: Extract facts as simple strings (focused, high quality)
11
+ * Pass 2: Extract entities + edges from the facts (separate concern)
12
+ */
13
+ export declare function extractWithLLM(config: LLMExtractorConfig, input: string, existingFacts?: Array<{
14
+ lineageId: string;
15
+ content: string;
16
+ }>): Promise<ExtractionResult>;
17
+ /**
18
+ * Normalize an entity name to a clean canonical form.
19
+ */
20
+ export declare function normalizeEntityName(raw: string): string;
21
+ //# sourceMappingURL=llm-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-extractor.d.ts","sourceRoot":"","sources":["llm-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAiD,MAAM,YAAY,CAAC;AAClG,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,cAAc,CAAC;AAI7D,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,UAAU,CAAC;IAChB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5D,OAAO,CAAC,gBAAgB,CAAC,CAiL3B;AAsBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAavD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-extractor.js","sourceRoot":"","sources":["llm-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,267 @@
1
+ import type { LLMAdapter } from '../adapters/llm.js';
2
+ import type { ExtractionResult, ExtractedFact, ExtractedEntity, ExtractedEdge } from './types.js';
3
+ import type { ExtractionTier, EdgeType, DomainEntityType } from '../config.js';
4
+ import { buildFactExtractionPrompt, buildGraphExtractionPrompt, buildExtractionPrompt } from './prompts.js';
5
+ import { createEnrichedSegments } from './sliding-window.js';
6
+
7
+ export interface LLMExtractorConfig {
8
+ llm: LLMAdapter;
9
+ tier: ExtractionTier;
10
+ entityTypes?: string[];
11
+ domainEntityTypes?: DomainEntityType[];
12
+ }
13
+
14
+ /**
15
+ * Two-pass extraction like Mem0:
16
+ * Pass 1: Extract facts as simple strings (focused, high quality)
17
+ * Pass 2: Extract entities + edges from the facts (separate concern)
18
+ */
19
+ export async function extractWithLLM(
20
+ config: LLMExtractorConfig,
21
+ input: string,
22
+ existingFacts?: Array<{ lineageId: string; content: string }>,
23
+ ): Promise<ExtractionResult> {
24
+ let totalTokensIn = 0;
25
+ let totalTokensOut = 0;
26
+
27
+ // ── PASS 1: Fact extraction with Sliding Window Inference ──
28
+ // For long inputs, split into overlapping segments so the LLM can resolve
29
+ // pronouns and references using surrounding context (like Hydra DB).
30
+ const segments = createEnrichedSegments(input);
31
+
32
+ let factStrings: string[] = [];
33
+ let factEntries: Array<{ text: string; importance: number; sourceChunk: string; eventDate?: Date; documentDate?: Date }> = [];
34
+
35
+ // Process segments (in parallel for speed, up to 4 at a time)
36
+ const segmentBatches: typeof segments[] = [];
37
+ for (let i = 0; i < segments.length; i += 4) {
38
+ segmentBatches.push(segments.slice(i, i + 4));
39
+ }
40
+
41
+ for (const batch of segmentBatches) {
42
+ const batchPromises = batch.map(async (seg) => {
43
+ const factMessages = buildFactExtractionPrompt(seg.contextWindow);
44
+
45
+ // Append existing facts for dedup context
46
+ if (existingFacts && existingFacts.length > 0) {
47
+ const factsBlock = existingFacts
48
+ .map(f => `- [lineage: ${f.lineageId}] ${f.content}`)
49
+ .join('\n');
50
+ factMessages[1]!.content += `\n\n--- EXISTING FACTS (skip duplicates, mark updates) ---\n${factsBlock}`;
51
+ }
52
+
53
+ // Also append already-extracted facts from previous segments to avoid duplicates
54
+ if (factEntries.length > 0) {
55
+ const alreadyExtracted = factEntries.map(f => `- ${f.text}`).join('\n');
56
+ factMessages[1]!.content += `\n\n--- ALREADY EXTRACTED (skip these) ---\n${alreadyExtracted}`;
57
+ }
58
+
59
+ try {
60
+ const factResponse = await config.llm.complete(factMessages, { temperature: 0, responseFormat: 'json' });
61
+ totalTokensIn += factResponse.tokensInput;
62
+ totalTokensOut += factResponse.tokensOutput;
63
+
64
+ const parsed = JSON.parse(factResponse.content) as Record<string, unknown>;
65
+ const rawFacts = Array.isArray(parsed.facts) ? parsed.facts : [];
66
+ const entries: Array<{ text: string; importance: number; sourceChunk: string; eventDate?: Date; documentDate?: Date }> = [];
67
+ for (const f of rawFacts) {
68
+ if (typeof f === 'string') {
69
+ const trimmed = f.trim();
70
+ if (trimmed.length > 0) entries.push({ text: trimmed, importance: 0.5, sourceChunk: seg.contextWindow });
71
+ } else if (f && typeof f === 'object') {
72
+ const obj = f as Record<string, unknown>;
73
+ const text = (typeof obj.t === 'string' ? obj.t : typeof obj.text === 'string' ? obj.text : '').trim();
74
+ const importance = typeof obj.i === 'number' ? obj.i : typeof obj.importance === 'number' ? obj.importance : 0.5;
75
+ const eventDate = obj.ed ? new Date(obj.ed as string) : undefined;
76
+ const documentDate = obj.dd ? new Date(obj.dd as string) : undefined;
77
+ if (text.length > 0) entries.push({
78
+ text,
79
+ importance: Math.max(0, Math.min(1, importance)),
80
+ sourceChunk: seg.contextWindow,
81
+ eventDate: eventDate && !isNaN(eventDate.getTime()) ? eventDate : undefined,
82
+ documentDate: documentDate && !isNaN(documentDate.getTime()) ? documentDate : undefined,
83
+ });
84
+ }
85
+ }
86
+ return entries;
87
+ } catch {
88
+ return [];
89
+ }
90
+ });
91
+
92
+ const batchResults = await Promise.all(batchPromises);
93
+ for (const entries of batchResults) {
94
+ factEntries.push(...entries);
95
+ }
96
+ }
97
+
98
+ // Deduplicate facts by content similarity (simple string match)
99
+ const seenContent = new Set<string>();
100
+ factEntries = factEntries.filter(e => {
101
+ const key = e.text.toLowerCase().trim();
102
+ if (seenContent.has(key)) return false;
103
+ seenContent.add(key);
104
+ return true;
105
+ });
106
+ factStrings = factEntries.map(e => e.text);
107
+
108
+ if (factEntries.length === 0) {
109
+ return emptyResult(config.tier, config.llm.model);
110
+ }
111
+
112
+ if (factStrings.length === 0) {
113
+ return emptyResult(config.tier, config.llm.model);
114
+ }
115
+
116
+ // Build ExtractedFact objects from parsed entries with LLM-scored importance
117
+ const facts: ExtractedFact[] = factEntries.map(({ text, importance, sourceChunk, eventDate, documentDate }) => ({
118
+ content: text,
119
+ importance,
120
+ confidence: 0.8,
121
+ sourceType: 'conversation' as const,
122
+ modality: 'text' as const,
123
+ tags: [],
124
+ originalContent: input,
125
+ entityCanonicalNames: [],
126
+ sourceChunk,
127
+ eventDate,
128
+ documentDate,
129
+ }));
130
+
131
+ // ── Contextual memory wrappers ──
132
+ // Prepend source context so the embedding captures the full meaning.
133
+ // E.g. "User went to the gym" becomes "Context: <segment>... | Fact: User went to the gym"
134
+ // This is a transient field — only used at embedding time, never stored.
135
+ for (const fact of facts) {
136
+ const src = fact.sourceChunk ?? input;
137
+ const contextPrefix = src.length > 100
138
+ ? `Context: ${src.slice(0, 200).trim()}... | Fact: `
139
+ : `Context: ${src.trim()} | Fact: `;
140
+ fact.contextualContent = contextPrefix + fact.content;
141
+ }
142
+
143
+ // ── PASS 2: Graph extraction (entities + edges) from the facts ──
144
+ let entities: ExtractedEntity[] = [];
145
+ let edges: ExtractedEdge[] = [];
146
+
147
+ try {
148
+ const graphMessages = buildGraphExtractionPrompt(factStrings, config.entityTypes, config.domainEntityTypes);
149
+ const graphResponse = await config.llm.complete(graphMessages, { temperature: 0, responseFormat: 'json' });
150
+ totalTokensIn += graphResponse.tokensInput;
151
+ totalTokensOut += graphResponse.tokensOutput;
152
+
153
+ const graphParsed = JSON.parse(graphResponse.content) as Record<string, unknown>;
154
+
155
+ // Parse entities
156
+ const seenEntities = new Set<string>();
157
+ if (Array.isArray(graphParsed.entities)) {
158
+ for (const e of graphParsed.entities as unknown[]) {
159
+ if (!e || typeof (e as Record<string, unknown>).name !== 'string') continue;
160
+ const entity = e as Record<string, unknown>;
161
+ const canonical = normalizeEntityName(entity.name as string);
162
+ if (canonical.length === 0 || seenEntities.has(canonical)) continue;
163
+ seenEntities.add(canonical);
164
+ // Capture properties from domain entity types (e.g., {"company_size": "enterprise"})
165
+ const rawProps = entity.properties;
166
+ const properties: Record<string, unknown> = (rawProps && typeof rawProps === 'object' && !Array.isArray(rawProps))
167
+ ? rawProps as Record<string, unknown>
168
+ : {};
169
+
170
+ entities.push({
171
+ name: canonical.split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' '),
172
+ entityType: String(entity.entity_type ?? entity.type ?? 'concept'),
173
+ canonicalName: canonical,
174
+ properties,
175
+ });
176
+ }
177
+ }
178
+
179
+ // Parse edges
180
+ if (Array.isArray(graphParsed.edges)) {
181
+ for (const r of graphParsed.edges as unknown[]) {
182
+ if (!r) continue;
183
+ const rel = r as Record<string, unknown>;
184
+ const rawSource = typeof rel.source === 'string' ? rel.source :
185
+ typeof rel.source_name === 'string' ? rel.source_name : null;
186
+ const rawTarget = typeof rel.target === 'string' ? rel.target :
187
+ typeof rel.target_name === 'string' ? rel.target_name : null;
188
+ if (!rawSource || !rawTarget) continue;
189
+ const source = normalizeEntityName(rawSource);
190
+ const target = normalizeEntityName(rawTarget);
191
+ if (!source || !target) continue;
192
+ edges.push({
193
+ sourceName: source,
194
+ targetName: target,
195
+ relation: String(rel.relation ?? 'related_to'),
196
+ edgeType: isValidEdgeType(rel.edge_type) ? rel.edge_type : 'associative',
197
+ confidence: 0.8,
198
+ });
199
+ }
200
+ }
201
+
202
+ // Link entities to facts by text match
203
+ for (const fact of facts) {
204
+ const contentLower = fact.content.toLowerCase();
205
+ for (const entity of entities) {
206
+ if (entity.canonicalName === 'user') {
207
+ if (contentLower.startsWith('user ') || contentLower.includes(' user ')) {
208
+ fact.entityCanonicalNames!.push(entity.canonicalName);
209
+ }
210
+ } else if (entity.canonicalName.length >= 3 && contentLower.includes(entity.canonicalName)) {
211
+ fact.entityCanonicalNames!.push(entity.canonicalName);
212
+ }
213
+ }
214
+ }
215
+ } catch {
216
+ // Graph pass failed — we still have facts, just no graph. That's OK.
217
+ }
218
+
219
+ return {
220
+ facts,
221
+ entities,
222
+ edges,
223
+ tier: config.tier,
224
+ confidence: 0.8,
225
+ tokensInput: totalTokensIn,
226
+ tokensOutput: totalTokensOut,
227
+ model: config.llm.model,
228
+ };
229
+ }
230
+
231
+ function emptyResult(tier: ExtractionTier, model: string): ExtractionResult {
232
+ return {
233
+ facts: [],
234
+ entities: [],
235
+ edges: [],
236
+ tier,
237
+ confidence: 0,
238
+ tokensInput: 0,
239
+ tokensOutput: 0,
240
+ model,
241
+ };
242
+ }
243
+
244
+ function isValidEdgeType(t: unknown): t is EdgeType {
245
+ return (
246
+ typeof t === 'string' &&
247
+ ['associative', 'causal', 'temporal', 'contradictory', 'hierarchical'].includes(t)
248
+ );
249
+ }
250
+
251
+ /**
252
+ * Normalize an entity name to a clean canonical form.
253
+ */
254
+ export function normalizeEntityName(raw: string): string {
255
+ let name = raw.trim();
256
+ name = name.replace(/^[-–—*•#>]+\s*/g, '');
257
+ name = name.replace(/'s$/i, '');
258
+ name = name.replace(/\u2019s$/i, '');
259
+ name = name.replace(/^[^a-zA-Z0-9]+/, '');
260
+ name = name.replace(/[^a-zA-Z0-9]+$/, '');
261
+ const leadingNoise = /^(the|a|an|when|where|how|what|why|who|is|are|was|were|has|have|had|my|our|their|his|her|its|this|that|these|those)\s+/i;
262
+ name = name.replace(leadingNoise, '');
263
+ name = name.replace(leadingNoise, '');
264
+ name = name.replace(/\s+/g, ' ').trim();
265
+ name = name.toLowerCase();
266
+ return name;
267
+ }
@@ -0,0 +1,27 @@
1
+ import type { StorageAdapter } from '../adapters/storage.js';
2
+ import type { EmbeddingAdapter } from '../adapters/embedding.js';
3
+ import type { LLMAdapter } from '../adapters/llm.js';
4
+ import type { ExtractionInput, PipelineResult, ExtractedFact, ExtractedEntity } from './types.js';
5
+ export interface PipelineConfig {
6
+ storage: StorageAdapter;
7
+ embedding: EmbeddingAdapter;
8
+ cheapLLM: LLMAdapter;
9
+ smartLLM?: LLMAdapter;
10
+ extractionTier?: 'heuristic_only' | 'cheap_only' | 'auto' | 'smart_only';
11
+ embeddingModel: string;
12
+ embeddingDim: number;
13
+ decayHalfLifeDays?: number;
14
+ decayNormalizationK?: number;
15
+ }
16
+ export declare function inputToText(input: ExtractionInput): string;
17
+ export declare function mergeFacts(heuristic: ExtractedFact[], llm: ExtractedFact[]): ExtractedFact[];
18
+ export declare function mergeEntities(heuristic: ExtractedEntity[], llm: ExtractedEntity[]): ExtractedEntity[];
19
+ export declare function runExtractionPipeline(config: PipelineConfig, input: ExtractionInput): Promise<PipelineResult>;
20
+ /**
21
+ * Run extraction for a pre-created extraction record (from queue).
22
+ * Unlike runExtractionPipeline, this does NOT create the extraction record
23
+ * or perform hash-based dedup — both were already handled by the API route.
24
+ * It updates the existing record through the pipeline lifecycle.
25
+ */
26
+ export declare function runExtractionFromQueue(config: PipelineConfig, extractionId: string, input: ExtractionInput): Promise<PipelineResult>;
27
+ //# sourceMappingURL=pipeline.d.ts.map