@remnic/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 (551) hide show
  1. package/dist/abstraction-nodes.d.ts +52 -0
  2. package/dist/abstraction-nodes.js +15 -0
  3. package/dist/abstraction-nodes.js.map +1 -0
  4. package/dist/access-cli.d.ts +5 -0
  5. package/dist/access-cli.js +308 -0
  6. package/dist/access-cli.js.map +1 -0
  7. package/dist/access-http.d.ts +158 -0
  8. package/dist/access-http.js +32 -0
  9. package/dist/access-http.js.map +1 -0
  10. package/dist/access-idempotency.d.ts +31 -0
  11. package/dist/access-idempotency.js +11 -0
  12. package/dist/access-idempotency.js.map +1 -0
  13. package/dist/access-mcp.d.ts +76 -0
  14. package/dist/access-mcp.js +8 -0
  15. package/dist/access-mcp.js.map +1 -0
  16. package/dist/access-schema.d.ts +266 -0
  17. package/dist/access-schema.js +29 -0
  18. package/dist/access-schema.js.map +1 -0
  19. package/dist/access-service.d.ts +614 -0
  20. package/dist/access-service.js +32 -0
  21. package/dist/access-service.js.map +1 -0
  22. package/dist/behavior-learner.d.ts +16 -0
  23. package/dist/behavior-learner.js +124 -0
  24. package/dist/behavior-learner.js.map +1 -0
  25. package/dist/behavior-signals.d.ts +15 -0
  26. package/dist/behavior-signals.js +11 -0
  27. package/dist/behavior-signals.js.map +1 -0
  28. package/dist/bootstrap.d.ts +46 -0
  29. package/dist/bootstrap.js +9 -0
  30. package/dist/bootstrap.js.map +1 -0
  31. package/dist/boxes.d.ts +93 -0
  32. package/dist/boxes.js +14 -0
  33. package/dist/boxes.js.map +1 -0
  34. package/dist/buffer.d.ts +22 -0
  35. package/dist/buffer.js +9 -0
  36. package/dist/buffer.js.map +1 -0
  37. package/dist/calibration.d.ts +81 -0
  38. package/dist/calibration.js +239 -0
  39. package/dist/calibration.js.map +1 -0
  40. package/dist/causal-behavior.d.ts +79 -0
  41. package/dist/causal-behavior.js +190 -0
  42. package/dist/causal-behavior.js.map +1 -0
  43. package/dist/causal-chain.d.ts +61 -0
  44. package/dist/causal-chain.js +24 -0
  45. package/dist/causal-chain.js.map +1 -0
  46. package/dist/causal-consolidation.d.ts +71 -0
  47. package/dist/causal-consolidation.js +211 -0
  48. package/dist/causal-consolidation.js.map +1 -0
  49. package/dist/causal-retrieval.d.ts +44 -0
  50. package/dist/causal-retrieval.js +184 -0
  51. package/dist/causal-retrieval.js.map +1 -0
  52. package/dist/causal-trajectory-graph.d.ts +13 -0
  53. package/dist/causal-trajectory-graph.js +59 -0
  54. package/dist/causal-trajectory-graph.js.map +1 -0
  55. package/dist/causal-trajectory.d.ts +68 -0
  56. package/dist/causal-trajectory.js +18 -0
  57. package/dist/causal-trajectory.js.map +1 -0
  58. package/dist/chunk-2CJCWDMR.js +87 -0
  59. package/dist/chunk-2CJCWDMR.js.map +1 -0
  60. package/dist/chunk-2NMMFZ5T.js +216 -0
  61. package/dist/chunk-2NMMFZ5T.js.map +1 -0
  62. package/dist/chunk-2PO5ZRKV.js +103 -0
  63. package/dist/chunk-2PO5ZRKV.js.map +1 -0
  64. package/dist/chunk-3QKK7QOS.js +154 -0
  65. package/dist/chunk-3QKK7QOS.js.map +1 -0
  66. package/dist/chunk-3SLRNYNG.js +26 -0
  67. package/dist/chunk-3SLRNYNG.js.map +1 -0
  68. package/dist/chunk-4A24LIM2.js +68 -0
  69. package/dist/chunk-4A24LIM2.js.map +1 -0
  70. package/dist/chunk-6HZ6AO2P.js +164 -0
  71. package/dist/chunk-6HZ6AO2P.js.map +1 -0
  72. package/dist/chunk-763GUIOU.js +302 -0
  73. package/dist/chunk-763GUIOU.js.map +1 -0
  74. package/dist/chunk-AAI7JARD.js +173 -0
  75. package/dist/chunk-AAI7JARD.js.map +1 -0
  76. package/dist/chunk-B7LOFDVE.js +112 -0
  77. package/dist/chunk-B7LOFDVE.js.map +1 -0
  78. package/dist/chunk-BDFZXRSO.js +318 -0
  79. package/dist/chunk-BDFZXRSO.js.map +1 -0
  80. package/dist/chunk-BOUYNNYD.js +707 -0
  81. package/dist/chunk-BOUYNNYD.js.map +1 -0
  82. package/dist/chunk-BRK4ODMI.js +60 -0
  83. package/dist/chunk-BRK4ODMI.js.map +1 -0
  84. package/dist/chunk-C6QPK5GG.js +111 -0
  85. package/dist/chunk-C6QPK5GG.js.map +1 -0
  86. package/dist/chunk-C7VW7C3F.js +117 -0
  87. package/dist/chunk-C7VW7C3F.js.map +1 -0
  88. package/dist/chunk-CDW777AI.js +621 -0
  89. package/dist/chunk-CDW777AI.js.map +1 -0
  90. package/dist/chunk-CULXMQJH.js +185 -0
  91. package/dist/chunk-CULXMQJH.js.map +1 -0
  92. package/dist/chunk-CXWFUJR2.js +1203 -0
  93. package/dist/chunk-CXWFUJR2.js.map +1 -0
  94. package/dist/chunk-DGXUHMOV.js +61 -0
  95. package/dist/chunk-DGXUHMOV.js.map +1 -0
  96. package/dist/chunk-DM2T26WE.js +61 -0
  97. package/dist/chunk-DM2T26WE.js.map +1 -0
  98. package/dist/chunk-DORBM6OB.js +81 -0
  99. package/dist/chunk-DORBM6OB.js.map +1 -0
  100. package/dist/chunk-DT5TVLJE.js +32 -0
  101. package/dist/chunk-DT5TVLJE.js.map +1 -0
  102. package/dist/chunk-EEQLFRUM.js +89 -0
  103. package/dist/chunk-EEQLFRUM.js.map +1 -0
  104. package/dist/chunk-EQINRHYR.js +672 -0
  105. package/dist/chunk-EQINRHYR.js.map +1 -0
  106. package/dist/chunk-ESSMF2FR.js +146 -0
  107. package/dist/chunk-ESSMF2FR.js.map +1 -0
  108. package/dist/chunk-ETOW6ACV.js +158 -0
  109. package/dist/chunk-ETOW6ACV.js.map +1 -0
  110. package/dist/chunk-FYIYMQ5N.js +221 -0
  111. package/dist/chunk-FYIYMQ5N.js.map +1 -0
  112. package/dist/chunk-G3AG3KZN.js +78 -0
  113. package/dist/chunk-G3AG3KZN.js.map +1 -0
  114. package/dist/chunk-GJR6D6KC.js +61 -0
  115. package/dist/chunk-GJR6D6KC.js.map +1 -0
  116. package/dist/chunk-GPGBSNKM.js +380 -0
  117. package/dist/chunk-GPGBSNKM.js.map +1 -0
  118. package/dist/chunk-H63EDPFJ.js +57 -0
  119. package/dist/chunk-H63EDPFJ.js.map +1 -0
  120. package/dist/chunk-HG2NKWR2.js +185 -0
  121. package/dist/chunk-HG2NKWR2.js.map +1 -0
  122. package/dist/chunk-HL4DB7TO.js +13 -0
  123. package/dist/chunk-HL4DB7TO.js.map +1 -0
  124. package/dist/chunk-HLBYLYRD.js +346 -0
  125. package/dist/chunk-HLBYLYRD.js.map +1 -0
  126. package/dist/chunk-HLXVTBF3.js +109 -0
  127. package/dist/chunk-HLXVTBF3.js.map +1 -0
  128. package/dist/chunk-IFFFR3MR.js +68 -0
  129. package/dist/chunk-IFFFR3MR.js.map +1 -0
  130. package/dist/chunk-ISY75RLM.js +1027 -0
  131. package/dist/chunk-ISY75RLM.js.map +1 -0
  132. package/dist/chunk-IZME7KW2.js +1886 -0
  133. package/dist/chunk-IZME7KW2.js.map +1 -0
  134. package/dist/chunk-J3BT33K7.js +720 -0
  135. package/dist/chunk-J3BT33K7.js.map +1 -0
  136. package/dist/chunk-J47FNDR7.js +113 -0
  137. package/dist/chunk-J47FNDR7.js.map +1 -0
  138. package/dist/chunk-JWPLJLDU.js +63 -0
  139. package/dist/chunk-JWPLJLDU.js.map +1 -0
  140. package/dist/chunk-K6WK37A6.js +865 -0
  141. package/dist/chunk-K6WK37A6.js.map +1 -0
  142. package/dist/chunk-KL4CP4SB.js +130 -0
  143. package/dist/chunk-KL4CP4SB.js.map +1 -0
  144. package/dist/chunk-KT4NEUNF.js +315 -0
  145. package/dist/chunk-KT4NEUNF.js.map +1 -0
  146. package/dist/chunk-KWBU5S5U.js +42 -0
  147. package/dist/chunk-KWBU5S5U.js.map +1 -0
  148. package/dist/chunk-L5RPWGFK.js +59 -0
  149. package/dist/chunk-L5RPWGFK.js.map +1 -0
  150. package/dist/chunk-L7WO3MZ4.js +128 -0
  151. package/dist/chunk-L7WO3MZ4.js.map +1 -0
  152. package/dist/chunk-LIRZNNUP.js +74 -0
  153. package/dist/chunk-LIRZNNUP.js.map +1 -0
  154. package/dist/chunk-LK6SGL53.js +22 -0
  155. package/dist/chunk-LK6SGL53.js.map +1 -0
  156. package/dist/chunk-LOBRX7VD.js +200 -0
  157. package/dist/chunk-LOBRX7VD.js.map +1 -0
  158. package/dist/chunk-LPSF4OQH.js +47 -0
  159. package/dist/chunk-LPSF4OQH.js.map +1 -0
  160. package/dist/chunk-LU3GQNDQ.js +152 -0
  161. package/dist/chunk-LU3GQNDQ.js.map +1 -0
  162. package/dist/chunk-M5KEYE5E.js +350 -0
  163. package/dist/chunk-M5KEYE5E.js.map +1 -0
  164. package/dist/chunk-M62O4P4T.js +41 -0
  165. package/dist/chunk-M62O4P4T.js.map +1 -0
  166. package/dist/chunk-MARWOCVP.js +48 -0
  167. package/dist/chunk-MARWOCVP.js.map +1 -0
  168. package/dist/chunk-MDDAA2AO.js +925 -0
  169. package/dist/chunk-MDDAA2AO.js.map +1 -0
  170. package/dist/chunk-MWGVGUIS.js +198 -0
  171. package/dist/chunk-MWGVGUIS.js.map +1 -0
  172. package/dist/chunk-N5AKDXAI.js +74 -0
  173. package/dist/chunk-N5AKDXAI.js.map +1 -0
  174. package/dist/chunk-NGAVDO7E.js +115 -0
  175. package/dist/chunk-NGAVDO7E.js.map +1 -0
  176. package/dist/chunk-NTTLPF7F.js +283 -0
  177. package/dist/chunk-NTTLPF7F.js.map +1 -0
  178. package/dist/chunk-ONRU4L2N.js +240 -0
  179. package/dist/chunk-ONRU4L2N.js.map +1 -0
  180. package/dist/chunk-ORZMT74A.js +209 -0
  181. package/dist/chunk-ORZMT74A.js.map +1 -0
  182. package/dist/chunk-OTAVQCSF.js +268 -0
  183. package/dist/chunk-OTAVQCSF.js.map +1 -0
  184. package/dist/chunk-PGK3VUHN.js +160 -0
  185. package/dist/chunk-PGK3VUHN.js.map +1 -0
  186. package/dist/chunk-Q6FETXJA.js +1362 -0
  187. package/dist/chunk-Q6FETXJA.js.map +1 -0
  188. package/dist/chunk-QANCTXQF.js +271 -0
  189. package/dist/chunk-QANCTXQF.js.map +1 -0
  190. package/dist/chunk-QCCCQT3O.js +189 -0
  191. package/dist/chunk-QCCCQT3O.js.map +1 -0
  192. package/dist/chunk-QDOSNLB4.js +1048 -0
  193. package/dist/chunk-QDOSNLB4.js.map +1 -0
  194. package/dist/chunk-QFQVZOGA.js +2168 -0
  195. package/dist/chunk-QFQVZOGA.js.map +1 -0
  196. package/dist/chunk-QPKFPHOO.js +178 -0
  197. package/dist/chunk-QPKFPHOO.js.map +1 -0
  198. package/dist/chunk-QSVPYQPG.js +268 -0
  199. package/dist/chunk-QSVPYQPG.js.map +1 -0
  200. package/dist/chunk-QWUUMMIK.js +3045 -0
  201. package/dist/chunk-QWUUMMIK.js.map +1 -0
  202. package/dist/chunk-QY2BHY5O.js +2378 -0
  203. package/dist/chunk-QY2BHY5O.js.map +1 -0
  204. package/dist/chunk-SCHEKPYH.js +349 -0
  205. package/dist/chunk-SCHEKPYH.js.map +1 -0
  206. package/dist/chunk-SCU65EZI.js +15 -0
  207. package/dist/chunk-SCU65EZI.js.map +1 -0
  208. package/dist/chunk-T4WRIV2C.js +170 -0
  209. package/dist/chunk-T4WRIV2C.js.map +1 -0
  210. package/dist/chunk-TKO4HZCK.js +1852 -0
  211. package/dist/chunk-TKO4HZCK.js.map +1 -0
  212. package/dist/chunk-TP4FZJIZ.js +93 -0
  213. package/dist/chunk-TP4FZJIZ.js.map +1 -0
  214. package/dist/chunk-TPB3I2AC.js +403 -0
  215. package/dist/chunk-TPB3I2AC.js.map +1 -0
  216. package/dist/chunk-TVVVQQAK.js +1431 -0
  217. package/dist/chunk-TVVVQQAK.js.map +1 -0
  218. package/dist/chunk-U4PV25RD.js +14 -0
  219. package/dist/chunk-U4PV25RD.js.map +1 -0
  220. package/dist/chunk-UCYSTFZR.js +284 -0
  221. package/dist/chunk-UCYSTFZR.js.map +1 -0
  222. package/dist/chunk-UHGBNIOS.js +205 -0
  223. package/dist/chunk-UHGBNIOS.js.map +1 -0
  224. package/dist/chunk-UIYZ5T3I.js +108 -0
  225. package/dist/chunk-UIYZ5T3I.js.map +1 -0
  226. package/dist/chunk-UV2FO7J4.js +747 -0
  227. package/dist/chunk-UV2FO7J4.js.map +1 -0
  228. package/dist/chunk-UZB5KHKX.js +63 -0
  229. package/dist/chunk-UZB5KHKX.js.map +1 -0
  230. package/dist/chunk-V3RXWQIE.js +626 -0
  231. package/dist/chunk-V3RXWQIE.js.map +1 -0
  232. package/dist/chunk-V4YC4LUK.js +444 -0
  233. package/dist/chunk-V4YC4LUK.js.map +1 -0
  234. package/dist/chunk-VEWZZM3H.js +133 -0
  235. package/dist/chunk-VEWZZM3H.js.map +1 -0
  236. package/dist/chunk-WWIQTB2Y.js +98 -0
  237. package/dist/chunk-WWIQTB2Y.js.map +1 -0
  238. package/dist/chunk-X7XN6YU4.js +24 -0
  239. package/dist/chunk-X7XN6YU4.js.map +1 -0
  240. package/dist/chunk-XKECPATV.js +202 -0
  241. package/dist/chunk-XKECPATV.js.map +1 -0
  242. package/dist/chunk-XYIK4LF6.js +75 -0
  243. package/dist/chunk-XYIK4LF6.js.map +1 -0
  244. package/dist/chunk-Y27UJK6V.js +39 -0
  245. package/dist/chunk-Y27UJK6V.js.map +1 -0
  246. package/dist/chunk-Y4Z4I6WK.js +9 -0
  247. package/dist/chunk-Y4Z4I6WK.js.map +1 -0
  248. package/dist/chunk-YAPUAHAY.js +10761 -0
  249. package/dist/chunk-YAPUAHAY.js.map +1 -0
  250. package/dist/chunk-YAZNBMNF.js +92 -0
  251. package/dist/chunk-YAZNBMNF.js.map +1 -0
  252. package/dist/chunk-YCN4BVDK.js +66 -0
  253. package/dist/chunk-YCN4BVDK.js.map +1 -0
  254. package/dist/chunk-YNCQ7E4M.js +388 -0
  255. package/dist/chunk-YNCQ7E4M.js.map +1 -0
  256. package/dist/chunk-YNI4S5WT.js +143 -0
  257. package/dist/chunk-YNI4S5WT.js.map +1 -0
  258. package/dist/chunk-YRMVARQP.js +406 -0
  259. package/dist/chunk-YRMVARQP.js.map +1 -0
  260. package/dist/chunk-Z5AAYHUC.js +79 -0
  261. package/dist/chunk-Z5AAYHUC.js.map +1 -0
  262. package/dist/chunk-Z5LAYHGJ.js +15 -0
  263. package/dist/chunk-Z5LAYHGJ.js.map +1 -0
  264. package/dist/chunk-ZJLY4QSU.js +823 -0
  265. package/dist/chunk-ZJLY4QSU.js.map +1 -0
  266. package/dist/chunk-ZKYI7UVO.js +276 -0
  267. package/dist/chunk-ZKYI7UVO.js.map +1 -0
  268. package/dist/chunk-ZPKBYX2F.js +297 -0
  269. package/dist/chunk-ZPKBYX2F.js.map +1 -0
  270. package/dist/chunking.d.ts +48 -0
  271. package/dist/chunking.js +11 -0
  272. package/dist/chunking.js.map +1 -0
  273. package/dist/cli.d.ts +1162 -0
  274. package/dist/cli.js +7187 -0
  275. package/dist/cli.js.map +1 -0
  276. package/dist/commitment-ledger.d.ts +83 -0
  277. package/dist/commitment-ledger.js +19 -0
  278. package/dist/commitment-ledger.js.map +1 -0
  279. package/dist/compression-optimizer.d.ts +37 -0
  280. package/dist/compression-optimizer.js +13 -0
  281. package/dist/compression-optimizer.js.map +1 -0
  282. package/dist/config.d.ts +6 -0
  283. package/dist/config.js +12 -0
  284. package/dist/config.js.map +1 -0
  285. package/dist/cue-anchors.d.ts +50 -0
  286. package/dist/cue-anchors.js +15 -0
  287. package/dist/cue-anchors.js.map +1 -0
  288. package/dist/dashboard-runtime.d.ts +46 -0
  289. package/dist/dashboard-runtime.js +10 -0
  290. package/dist/dashboard-runtime.js.map +1 -0
  291. package/dist/day-summary.d.ts +6 -0
  292. package/dist/day-summary.js +10 -0
  293. package/dist/day-summary.js.map +1 -0
  294. package/dist/delinearize.d.ts +34 -0
  295. package/dist/delinearize.js +11 -0
  296. package/dist/delinearize.js.map +1 -0
  297. package/dist/embedding-fallback.d.ts +22 -0
  298. package/dist/embedding-fallback.js +8 -0
  299. package/dist/embedding-fallback.js.map +1 -0
  300. package/dist/engine-P26JFSVY.js +19 -0
  301. package/dist/engine-P26JFSVY.js.map +1 -0
  302. package/dist/entity-retrieval.d.ts +23 -0
  303. package/dist/entity-retrieval.js +24 -0
  304. package/dist/entity-retrieval.js.map +1 -0
  305. package/dist/evals.d.ts +282 -0
  306. package/dist/evals.js +32 -0
  307. package/dist/evals.js.map +1 -0
  308. package/dist/explicit-capture.d.ts +60 -0
  309. package/dist/explicit-capture.js +23 -0
  310. package/dist/explicit-capture.js.map +1 -0
  311. package/dist/extraction.d.ts +141 -0
  312. package/dist/extraction.js +22 -0
  313. package/dist/extraction.js.map +1 -0
  314. package/dist/fallback-llm.d.ts +95 -0
  315. package/dist/fallback-llm.js +12 -0
  316. package/dist/fallback-llm.js.map +1 -0
  317. package/dist/graph-dashboard-diff.d.ts +12 -0
  318. package/dist/graph-dashboard-diff.js +8 -0
  319. package/dist/graph-dashboard-diff.js.map +1 -0
  320. package/dist/graph-dashboard-key.d.ts +5 -0
  321. package/dist/graph-dashboard-key.js +7 -0
  322. package/dist/graph-dashboard-key.js.map +1 -0
  323. package/dist/graph-dashboard-parser.d.ts +20 -0
  324. package/dist/graph-dashboard-parser.js +8 -0
  325. package/dist/graph-dashboard-parser.js.map +1 -0
  326. package/dist/graph.d.ts +157 -0
  327. package/dist/graph.js +27 -0
  328. package/dist/graph.js.map +1 -0
  329. package/dist/harmonic-retrieval.d.ts +27 -0
  330. package/dist/harmonic-retrieval.js +12 -0
  331. package/dist/harmonic-retrieval.js.map +1 -0
  332. package/dist/himem.d.ts +23 -0
  333. package/dist/himem.js +7 -0
  334. package/dist/himem.js.map +1 -0
  335. package/dist/hygiene.d.ts +24 -0
  336. package/dist/hygiene.js +9 -0
  337. package/dist/hygiene.js.map +1 -0
  338. package/dist/identity-continuity.d.ts +17 -0
  339. package/dist/identity-continuity.js +19 -0
  340. package/dist/identity-continuity.js.map +1 -0
  341. package/dist/importance.d.ts +25 -0
  342. package/dist/importance.js +11 -0
  343. package/dist/importance.js.map +1 -0
  344. package/dist/index.d.ts +923 -0
  345. package/dist/index.js +2512 -0
  346. package/dist/index.js.map +1 -0
  347. package/dist/intent.d.ts +8 -0
  348. package/dist/intent.js +13 -0
  349. package/dist/intent.js.map +1 -0
  350. package/dist/json-extract.d.ts +14 -0
  351. package/dist/json-extract.js +9 -0
  352. package/dist/json-extract.js.map +1 -0
  353. package/dist/json-store.d.ts +5 -0
  354. package/dist/json-store.js +11 -0
  355. package/dist/json-store.js.map +1 -0
  356. package/dist/legacy-hook-compat.d.ts +3 -0
  357. package/dist/legacy-hook-compat.js +35 -0
  358. package/dist/legacy-hook-compat.js.map +1 -0
  359. package/dist/lifecycle.d.ts +52 -0
  360. package/dist/lifecycle.js +21 -0
  361. package/dist/lifecycle.js.map +1 -0
  362. package/dist/local-llm.d.ts +154 -0
  363. package/dist/local-llm.js +10 -0
  364. package/dist/local-llm.js.map +1 -0
  365. package/dist/logger.d.ts +15 -0
  366. package/dist/logger.js +9 -0
  367. package/dist/logger.js.map +1 -0
  368. package/dist/memory-action-policy.d.ts +13 -0
  369. package/dist/memory-action-policy.js +7 -0
  370. package/dist/memory-action-policy.js.map +1 -0
  371. package/dist/memory-cache.d.ts +35 -0
  372. package/dist/memory-cache.js +37 -0
  373. package/dist/memory-cache.js.map +1 -0
  374. package/dist/memory-lifecycle-ledger-utils.d.ts +13 -0
  375. package/dist/memory-lifecycle-ledger-utils.js +23 -0
  376. package/dist/memory-lifecycle-ledger-utils.js.map +1 -0
  377. package/dist/memory-projection-format.d.ts +4 -0
  378. package/dist/memory-projection-format.js +9 -0
  379. package/dist/memory-projection-format.js.map +1 -0
  380. package/dist/memory-projection-store-NxMkbocT.d.ts +221 -0
  381. package/dist/memory-projection-store.d.ts +3 -0
  382. package/dist/memory-projection-store.js +31 -0
  383. package/dist/memory-projection-store.js.map +1 -0
  384. package/dist/model-registry.d.ts +60 -0
  385. package/dist/model-registry.js +8 -0
  386. package/dist/model-registry.js.map +1 -0
  387. package/dist/native-knowledge.d.ts +94 -0
  388. package/dist/native-knowledge.js +26 -0
  389. package/dist/native-knowledge.js.map +1 -0
  390. package/dist/negative.d.ts +26 -0
  391. package/dist/negative.js +8 -0
  392. package/dist/negative.js.map +1 -0
  393. package/dist/objective-state-writers.d.ts +22 -0
  394. package/dist/objective-state-writers.js +313 -0
  395. package/dist/objective-state-writers.js.map +1 -0
  396. package/dist/objective-state.d.ts +75 -0
  397. package/dist/objective-state.js +17 -0
  398. package/dist/objective-state.js.map +1 -0
  399. package/dist/openai-chat-compat.d.ts +13 -0
  400. package/dist/openai-chat-compat.js +11 -0
  401. package/dist/openai-chat-compat.js.map +1 -0
  402. package/dist/operator-toolkit.d.ts +304 -0
  403. package/dist/operator-toolkit.js +41 -0
  404. package/dist/operator-toolkit.js.map +1 -0
  405. package/dist/opik-exporter.d.ts +72 -0
  406. package/dist/opik-exporter.js +361 -0
  407. package/dist/opik-exporter.js.map +1 -0
  408. package/dist/orchestrator-zTa-Qo-1.d.ts +1104 -0
  409. package/dist/orchestrator.d.ts +21 -0
  410. package/dist/orchestrator.js +145 -0
  411. package/dist/orchestrator.js.map +1 -0
  412. package/dist/policy-runtime.d.ts +37 -0
  413. package/dist/policy-runtime.js +13 -0
  414. package/dist/policy-runtime.js.map +1 -0
  415. package/dist/port-C1GZFv8h.d.ts +41 -0
  416. package/dist/profiling.d.ts +80 -0
  417. package/dist/profiling.js +10 -0
  418. package/dist/profiling.js.map +1 -0
  419. package/dist/qmd-recall-cache.d.ts +29 -0
  420. package/dist/qmd-recall-cache.js +13 -0
  421. package/dist/qmd-recall-cache.js.map +1 -0
  422. package/dist/qmd.d.ts +105 -0
  423. package/dist/qmd.js +13 -0
  424. package/dist/qmd.js.map +1 -0
  425. package/dist/recall-qos.d.ts +33 -0
  426. package/dist/recall-qos.js +10 -0
  427. package/dist/recall-qos.js.map +1 -0
  428. package/dist/recall-query-policy.d.ts +20 -0
  429. package/dist/recall-query-policy.js +11 -0
  430. package/dist/recall-query-policy.js.map +1 -0
  431. package/dist/recall-state.d.ts +113 -0
  432. package/dist/recall-state.js +12 -0
  433. package/dist/recall-state.js.map +1 -0
  434. package/dist/recall-tokenization.d.ts +4 -0
  435. package/dist/recall-tokenization.js +9 -0
  436. package/dist/recall-tokenization.js.map +1 -0
  437. package/dist/reconstruct.d.ts +16 -0
  438. package/dist/reconstruct.js +7 -0
  439. package/dist/reconstruct.js.map +1 -0
  440. package/dist/release-changelog.d.ts +7 -0
  441. package/dist/release-changelog.js +30 -0
  442. package/dist/release-changelog.js.map +1 -0
  443. package/dist/relevance.d.ts +18 -0
  444. package/dist/relevance.js +8 -0
  445. package/dist/relevance.js.map +1 -0
  446. package/dist/rerank.d.ts +57 -0
  447. package/dist/rerank.js +11 -0
  448. package/dist/rerank.js.map +1 -0
  449. package/dist/resolve-provider-secret.d.ts +16 -0
  450. package/dist/resolve-provider-secret.js +11 -0
  451. package/dist/resolve-provider-secret.js.map +1 -0
  452. package/dist/resume-bundles.d.ts +66 -0
  453. package/dist/resume-bundles.js +27 -0
  454. package/dist/resume-bundles.js.map +1 -0
  455. package/dist/retrieval-agents.d.ts +129 -0
  456. package/dist/retrieval-agents.js +23 -0
  457. package/dist/retrieval-agents.js.map +1 -0
  458. package/dist/retrieval.d.ts +19 -0
  459. package/dist/retrieval.js +10 -0
  460. package/dist/retrieval.js.map +1 -0
  461. package/dist/sanitize.d.ts +9 -0
  462. package/dist/sanitize.js +9 -0
  463. package/dist/sanitize.js.map +1 -0
  464. package/dist/schemas.d.ts +688 -0
  465. package/dist/schemas.js +51 -0
  466. package/dist/schemas.js.map +1 -0
  467. package/dist/sdk-compat.d.ts +21 -0
  468. package/dist/sdk-compat.js +28 -0
  469. package/dist/sdk-compat.js.map +1 -0
  470. package/dist/semantic-consolidation.d.ts +42 -0
  471. package/dist/semantic-consolidation.js +12 -0
  472. package/dist/semantic-consolidation.js.map +1 -0
  473. package/dist/semantic-rule-promotion.d.ts +28 -0
  474. package/dist/semantic-rule-promotion.js +17 -0
  475. package/dist/semantic-rule-promotion.js.map +1 -0
  476. package/dist/semantic-rule-verifier.d.ts +19 -0
  477. package/dist/semantic-rule-verifier.js +18 -0
  478. package/dist/semantic-rule-verifier.js.map +1 -0
  479. package/dist/session-integrity.d.ts +67 -0
  480. package/dist/session-integrity.js +11 -0
  481. package/dist/session-integrity.js.map +1 -0
  482. package/dist/session-observer-bands.d.ts +6 -0
  483. package/dist/session-observer-bands.js +9 -0
  484. package/dist/session-observer-bands.js.map +1 -0
  485. package/dist/session-observer-state.d.ts +40 -0
  486. package/dist/session-observer-state.js +11 -0
  487. package/dist/session-observer-state.js.map +1 -0
  488. package/dist/signal.d.ts +6 -0
  489. package/dist/signal.js +9 -0
  490. package/dist/signal.js.map +1 -0
  491. package/dist/storage.d.ts +453 -0
  492. package/dist/storage.js +24 -0
  493. package/dist/storage.js.map +1 -0
  494. package/dist/store-contract.d.ts +10 -0
  495. package/dist/store-contract.js +21 -0
  496. package/dist/store-contract.js.map +1 -0
  497. package/dist/summarizer.d.ts +35 -0
  498. package/dist/summarizer.js +17 -0
  499. package/dist/summarizer.js.map +1 -0
  500. package/dist/summary-snapshot.d.ts +8 -0
  501. package/dist/summary-snapshot.js +13 -0
  502. package/dist/summary-snapshot.js.map +1 -0
  503. package/dist/temporal-index.d.ts +139 -0
  504. package/dist/temporal-index.js +29 -0
  505. package/dist/temporal-index.js.map +1 -0
  506. package/dist/threading.d.ts +62 -0
  507. package/dist/threading.js +8 -0
  508. package/dist/threading.js.map +1 -0
  509. package/dist/tier-migration.d.ts +44 -0
  510. package/dist/tier-migration.js +7 -0
  511. package/dist/tier-migration.js.map +1 -0
  512. package/dist/tier-routing.d.ts +21 -0
  513. package/dist/tier-routing.js +10 -0
  514. package/dist/tier-routing.js.map +1 -0
  515. package/dist/tmt.d.ts +79 -0
  516. package/dist/tmt.js +29 -0
  517. package/dist/tmt.js.map +1 -0
  518. package/dist/tokens.d.ts +24 -0
  519. package/dist/tokens.js +21 -0
  520. package/dist/tokens.js.map +1 -0
  521. package/dist/topics.d.ts +29 -0
  522. package/dist/topics.js +9 -0
  523. package/dist/topics.js.map +1 -0
  524. package/dist/transcript.d.ts +171 -0
  525. package/dist/transcript.js +9 -0
  526. package/dist/transcript.js.map +1 -0
  527. package/dist/trust-zones.d.ts +170 -0
  528. package/dist/trust-zones.js +32 -0
  529. package/dist/trust-zones.js.map +1 -0
  530. package/dist/types.d.ts +1243 -0
  531. package/dist/types.js +9 -0
  532. package/dist/types.js.map +1 -0
  533. package/dist/utility-learner.d.ts +59 -0
  534. package/dist/utility-learner.js +17 -0
  535. package/dist/utility-learner.js.map +1 -0
  536. package/dist/utility-runtime.d.ts +21 -0
  537. package/dist/utility-runtime.js +16 -0
  538. package/dist/utility-runtime.js.map +1 -0
  539. package/dist/utility-telemetry.d.ts +68 -0
  540. package/dist/utility-telemetry.js +17 -0
  541. package/dist/utility-telemetry.js.map +1 -0
  542. package/dist/verified-recall.d.ts +17 -0
  543. package/dist/verified-recall.js +19 -0
  544. package/dist/verified-recall.js.map +1 -0
  545. package/dist/version-utils.d.ts +4 -0
  546. package/dist/version-utils.js +7 -0
  547. package/dist/version-utils.js.map +1 -0
  548. package/dist/work-product-ledger.d.ts +65 -0
  549. package/dist/work-product-ledger.js +18 -0
  550. package/dist/work-product-ledger.js.map +1 -0
  551. package/package.json +58 -0
@@ -0,0 +1,283 @@
1
+ import {
2
+ topicOverlapScore
3
+ } from "./chunk-M5KEYE5E.js";
4
+ import {
5
+ countRecallTokenOverlap,
6
+ normalizeRecallTokens
7
+ } from "./chunk-DT5TVLJE.js";
8
+ import {
9
+ log
10
+ } from "./chunk-KWBU5S5U.js";
11
+ import {
12
+ assertIsoRecordedAt,
13
+ assertString,
14
+ isRecord,
15
+ recordStoreDay
16
+ } from "./chunk-DGXUHMOV.js";
17
+ import {
18
+ listJsonFiles,
19
+ readJsonFile
20
+ } from "./chunk-LPSF4OQH.js";
21
+
22
+ // src/causal-chain.ts
23
+ import path from "path";
24
+ import { mkdir, readFile, writeFile } from "fs/promises";
25
+ import { createHash } from "crypto";
26
+ var STITCH_WEIGHTS = {
27
+ followUpToGoal: 4,
28
+ outcomeToGoal: 2,
29
+ entityOverlap: 3,
30
+ tagOverlap: 1.5,
31
+ temporalProximity: 1
32
+ };
33
+ function validateCausalEdge(raw) {
34
+ if (!isRecord(raw)) throw new Error("CausalEdge must be an object");
35
+ if (raw.schemaVersion !== 1) throw new Error("CausalEdge.schemaVersion must be 1");
36
+ const edgeType = assertString(raw.edgeType, "edgeType");
37
+ const validEdgeTypes = ["follow_up_to_goal", "retry", "continuation", "correction"];
38
+ if (!validEdgeTypes.includes(edgeType)) {
39
+ throw new Error(`CausalEdge.edgeType must be one of ${validEdgeTypes.join(", ")}`);
40
+ }
41
+ const stitchMethod = assertString(raw.stitchMethod, "stitchMethod");
42
+ const validMethods = ["lexical", "entity", "temporal", "explicit"];
43
+ if (!validMethods.includes(stitchMethod)) {
44
+ throw new Error(`CausalEdge.stitchMethod must be one of ${validMethods.join(", ")}`);
45
+ }
46
+ const confidence = typeof raw.confidence === "number" ? raw.confidence : 0;
47
+ if (confidence < 0 || confidence > 1) throw new Error("CausalEdge.confidence must be in [0, 1]");
48
+ return {
49
+ schemaVersion: 1,
50
+ edgeId: assertString(raw.edgeId, "edgeId"),
51
+ fromTrajectoryId: assertString(raw.fromTrajectoryId, "fromTrajectoryId"),
52
+ toTrajectoryId: assertString(raw.toTrajectoryId, "toTrajectoryId"),
53
+ edgeType,
54
+ confidence,
55
+ stitchMethod,
56
+ createdAt: assertIsoRecordedAt(assertString(raw.createdAt, "createdAt")),
57
+ metadata: isRecord(raw.metadata) ? Object.fromEntries(
58
+ Object.entries(raw.metadata).filter(
59
+ (entry) => typeof entry[1] === "string"
60
+ )
61
+ ) : void 0
62
+ };
63
+ }
64
+ function makeEdgeId(fromId, toId) {
65
+ const digest = createHash("sha256").update(`${fromId}\0${toId}`).digest("hex").slice(0, 12);
66
+ return `edge-${digest}`;
67
+ }
68
+ function resolveChainsDir(memoryDir, causalTrajectoryStoreDir) {
69
+ const root = causalTrajectoryStoreDir ? path.join(memoryDir, causalTrajectoryStoreDir) : path.join(memoryDir, "state", "causal-trajectories");
70
+ return path.join(root, "chains");
71
+ }
72
+ function chainIndexPath(chainsDir) {
73
+ return path.join(chainsDir, "chain-index.json");
74
+ }
75
+ function edgeFilePath(chainsDir, edge) {
76
+ const day = recordStoreDay(edge.createdAt);
77
+ return path.join(chainsDir, "edges", day, `${edge.edgeId}.json`);
78
+ }
79
+ async function readChainIndex(chainsDir) {
80
+ try {
81
+ const raw = JSON.parse(await readFile(chainIndexPath(chainsDir), "utf8"));
82
+ return {
83
+ outgoing: isRecord(raw.outgoing) ? raw.outgoing : {},
84
+ incoming: isRecord(raw.incoming) ? raw.incoming : {},
85
+ edges: isRecord(raw.edges) ? raw.edges : {},
86
+ updatedAt: typeof raw.updatedAt === "string" ? raw.updatedAt : (/* @__PURE__ */ new Date()).toISOString()
87
+ };
88
+ } catch {
89
+ return { outgoing: {}, incoming: {}, edges: {}, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
90
+ }
91
+ }
92
+ async function writeChainIndex(chainsDir, index) {
93
+ await mkdir(chainsDir, { recursive: true });
94
+ index.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
95
+ await writeFile(chainIndexPath(chainsDir), JSON.stringify(index, null, 2), "utf8");
96
+ }
97
+ async function persistEdge(chainsDir, edge) {
98
+ const filePath = edgeFilePath(chainsDir, edge);
99
+ await mkdir(path.dirname(filePath), { recursive: true });
100
+ await writeFile(filePath, JSON.stringify(edge, null, 2), "utf8");
101
+ return filePath;
102
+ }
103
+ function addEdgeToIndex(index, edge) {
104
+ if (!index.outgoing[edge.fromTrajectoryId]) {
105
+ index.outgoing[edge.fromTrajectoryId] = [];
106
+ }
107
+ if (!index.outgoing[edge.fromTrajectoryId].includes(edge.edgeId)) {
108
+ index.outgoing[edge.fromTrajectoryId].push(edge.edgeId);
109
+ }
110
+ if (!index.incoming[edge.toTrajectoryId]) {
111
+ index.incoming[edge.toTrajectoryId] = [];
112
+ }
113
+ if (!index.incoming[edge.toTrajectoryId].includes(edge.edgeId)) {
114
+ index.incoming[edge.toTrajectoryId].push(edge.edgeId);
115
+ }
116
+ index.edges[edge.edgeId] = edge;
117
+ }
118
+ function scoreStitchCandidate(newTrajectory, candidate) {
119
+ let score = 0;
120
+ let dominantMethod = "lexical";
121
+ let maxComponent = 0;
122
+ const newFollowUpTokens = new Set(
123
+ normalizeRecallTokens(newTrajectory.followUpSummary ?? "", [])
124
+ );
125
+ const candidateGoalTokens = normalizeRecallTokens(candidate.goal, []);
126
+ if (newFollowUpTokens.size > 0 && candidateGoalTokens.length > 0) {
127
+ const overlap = countRecallTokenOverlap(newFollowUpTokens, candidate.goal, []);
128
+ const normalized = overlap / Math.max(newFollowUpTokens.size, candidateGoalTokens.length);
129
+ const component = normalized * STITCH_WEIGHTS.followUpToGoal;
130
+ score += component;
131
+ if (component > maxComponent) {
132
+ maxComponent = component;
133
+ dominantMethod = "lexical";
134
+ }
135
+ }
136
+ const candidateFollowUpTokens = new Set(
137
+ normalizeRecallTokens(candidate.followUpSummary ?? "", [])
138
+ );
139
+ const newGoalTokens = normalizeRecallTokens(newTrajectory.goal, []);
140
+ if (candidateFollowUpTokens.size > 0 && newGoalTokens.length > 0) {
141
+ const overlap = countRecallTokenOverlap(candidateFollowUpTokens, newTrajectory.goal, []);
142
+ const normalized = overlap / Math.max(candidateFollowUpTokens.size, newGoalTokens.length);
143
+ const component = normalized * 3;
144
+ score += component;
145
+ if (component > maxComponent) {
146
+ maxComponent = component;
147
+ dominantMethod = "lexical";
148
+ }
149
+ }
150
+ const newOutcomeTokens = new Set(
151
+ normalizeRecallTokens(newTrajectory.outcomeSummary, [])
152
+ );
153
+ if (newOutcomeTokens.size > 0) {
154
+ const overlap = countRecallTokenOverlap(newOutcomeTokens, candidate.goal, []);
155
+ const normalized = overlap / Math.max(newOutcomeTokens.size, candidateGoalTokens.length || 1);
156
+ const component = normalized * STITCH_WEIGHTS.outcomeToGoal;
157
+ score += component;
158
+ if (component > maxComponent) {
159
+ maxComponent = component;
160
+ dominantMethod = "lexical";
161
+ }
162
+ }
163
+ const newEntities = newTrajectory.entityRefs ?? [];
164
+ const candidateEntities = candidate.entityRefs ?? [];
165
+ if (newEntities.length > 0 && candidateEntities.length > 0) {
166
+ const entityJaccard = topicOverlapScore(newEntities, candidateEntities);
167
+ const component = entityJaccard * STITCH_WEIGHTS.entityOverlap;
168
+ score += component;
169
+ if (component > maxComponent) {
170
+ maxComponent = component;
171
+ dominantMethod = "entity";
172
+ }
173
+ }
174
+ const newTags = newTrajectory.tags ?? [];
175
+ const candidateTags = candidate.tags ?? [];
176
+ if (newTags.length > 0 && candidateTags.length > 0) {
177
+ const tagJaccard = topicOverlapScore(newTags, candidateTags);
178
+ const component = tagJaccard * STITCH_WEIGHTS.tagOverlap;
179
+ score += component;
180
+ if (component > maxComponent) {
181
+ maxComponent = component;
182
+ dominantMethod = "lexical";
183
+ }
184
+ }
185
+ const newMs = Date.parse(newTrajectory.recordedAt);
186
+ const candidateMs = Date.parse(candidate.recordedAt);
187
+ if (Number.isFinite(newMs) && Number.isFinite(candidateMs)) {
188
+ const gapHours = Math.abs(newMs - candidateMs) / 36e5;
189
+ const proximity = 1 / (1 + gapHours / 24);
190
+ const component = proximity * STITCH_WEIGHTS.temporalProximity;
191
+ score += component;
192
+ if (component > maxComponent) {
193
+ maxComponent = component;
194
+ dominantMethod = "temporal";
195
+ }
196
+ }
197
+ let edgeType = "continuation";
198
+ const goalTokens = new Set(normalizeRecallTokens(newTrajectory.goal, []));
199
+ const candidateGoalSet = new Set(candidateGoalTokens);
200
+ const goalOverlap = [...goalTokens].filter((t) => candidateGoalSet.has(t)).length;
201
+ const goalSimilarity = goalTokens.size > 0 ? goalOverlap / goalTokens.size : 0;
202
+ if (goalSimilarity > 0.7 && candidate.outcomeKind === "failure") {
203
+ edgeType = "retry";
204
+ } else if (goalSimilarity > 0.7 && newTrajectory.outcomeKind !== candidate.outcomeKind) {
205
+ edgeType = "correction";
206
+ } else if (newFollowUpTokens.size > 0 && candidateGoalTokens.length > 0) {
207
+ const followUpGoalOverlap = countRecallTokenOverlap(newFollowUpTokens, candidate.goal, []);
208
+ if (followUpGoalOverlap > 0) {
209
+ edgeType = "follow_up_to_goal";
210
+ }
211
+ }
212
+ return { trajectory: candidate, score, edgeType, stitchMethod: dominantMethod };
213
+ }
214
+ async function readRecentTrajectories(memoryDir, causalTrajectoryStoreDir, currentSessionKey, lookbackDays) {
215
+ const root = causalTrajectoryStoreDir ? path.join(memoryDir, causalTrajectoryStoreDir) : path.join(memoryDir, "state", "causal-trajectories");
216
+ const trajectoriesDir = path.join(root, "trajectories");
217
+ const files = await listJsonFiles(trajectoriesDir).catch(() => []);
218
+ if (files.length === 0) return [];
219
+ const cutoff = Date.now() - lookbackDays * 864e5;
220
+ const results = [];
221
+ for (const filePath of files) {
222
+ try {
223
+ const raw = await readJsonFile(filePath);
224
+ if (!isRecord(raw)) continue;
225
+ const sessionKey = typeof raw.sessionKey === "string" ? raw.sessionKey : "";
226
+ if (sessionKey === currentSessionKey) continue;
227
+ const recordedAt = typeof raw.recordedAt === "string" ? raw.recordedAt : "";
228
+ const ms = Date.parse(recordedAt);
229
+ if (!Number.isFinite(ms) || ms < cutoff) continue;
230
+ results.push(raw);
231
+ } catch {
232
+ }
233
+ }
234
+ return results;
235
+ }
236
+ async function stitchCausalChain(options) {
237
+ const { memoryDir, causalTrajectoryStoreDir, newTrajectory, config: stitchConfig } = options;
238
+ const chainsDir = resolveChainsDir(memoryDir, causalTrajectoryStoreDir);
239
+ const candidates = await readRecentTrajectories(
240
+ memoryDir,
241
+ causalTrajectoryStoreDir,
242
+ newTrajectory.sessionKey,
243
+ stitchConfig.lookbackDays
244
+ );
245
+ if (candidates.length === 0) return [];
246
+ const scored = candidates.map((c) => scoreStitchCandidate(newTrajectory, c)).filter((s) => s.score >= stitchConfig.minScore).sort((a, b) => b.score - a.score).slice(0, stitchConfig.maxEdgesPerTrajectory);
247
+ if (scored.length === 0) return [];
248
+ const index = await readChainIndex(chainsDir);
249
+ const newEdges = [];
250
+ for (const candidate of scored) {
251
+ const edgeId = makeEdgeId(candidate.trajectory.trajectoryId, newTrajectory.trajectoryId);
252
+ if (index.edges[edgeId]) continue;
253
+ const edge = {
254
+ schemaVersion: 1,
255
+ edgeId,
256
+ fromTrajectoryId: candidate.trajectory.trajectoryId,
257
+ toTrajectoryId: newTrajectory.trajectoryId,
258
+ edgeType: candidate.edgeType,
259
+ confidence: Math.min(1, candidate.score / 10),
260
+ stitchMethod: candidate.stitchMethod,
261
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
262
+ };
263
+ addEdgeToIndex(index, edge);
264
+ await persistEdge(chainsDir, edge);
265
+ newEdges.push(edge);
266
+ }
267
+ if (newEdges.length > 0) {
268
+ await writeChainIndex(chainsDir, index);
269
+ log.debug(`[cmc] stitched ${newEdges.length} causal edge(s) for trajectory ${newTrajectory.trajectoryId}`);
270
+ }
271
+ return newEdges;
272
+ }
273
+
274
+ export {
275
+ validateCausalEdge,
276
+ makeEdgeId,
277
+ resolveChainsDir,
278
+ readChainIndex,
279
+ writeChainIndex,
280
+ scoreStitchCandidate,
281
+ stitchCausalChain
282
+ };
283
+ //# sourceMappingURL=chunk-NTTLPF7F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/causal-chain.ts"],"sourcesContent":["/**\n * causal-chain.ts — Cross-session causal chain persistence for CMC.\n *\n * Stitches causal trajectories across session boundaries by detecting\n * when a trajectory in one session follows up on a trajectory from\n * another session. Persists edges in a graph index for later retrieval.\n */\n\nimport path from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { listJsonFiles, readJsonFile } from \"./json-store.js\";\nimport type { CausalTrajectoryRecord } from \"./causal-trajectory.js\";\nimport { topicOverlapScore } from \"./boxes.js\";\nimport { countRecallTokenOverlap, normalizeRecallTokens } from \"./recall-tokenization.js\";\nimport {\n assertIsoRecordedAt,\n assertString,\n isRecord,\n recordStoreDay,\n} from \"./store-contract.js\";\nimport { log } from \"./logger.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface CausalEdge {\n schemaVersion: 1;\n edgeId: string;\n fromTrajectoryId: string;\n toTrajectoryId: string;\n edgeType: \"follow_up_to_goal\" | \"retry\" | \"continuation\" | \"correction\";\n confidence: number;\n stitchMethod: \"lexical\" | \"entity\" | \"temporal\" | \"explicit\";\n createdAt: string;\n metadata?: Record<string, string>;\n}\n\nexport interface CausalChainIndex {\n outgoing: Record<string, string[]>;\n incoming: Record<string, string[]>;\n edges: Record<string, CausalEdge>;\n updatedAt: string;\n}\n\nexport interface StitchConfig {\n lookbackDays: number;\n minScore: number;\n maxEdgesPerTrajectory: number;\n}\n\nexport interface StitchCandidate {\n trajectory: CausalTrajectoryRecord;\n score: number;\n edgeType: CausalEdge[\"edgeType\"];\n stitchMethod: CausalEdge[\"stitchMethod\"];\n}\n\n// ─── Scoring Weights ─────────────────────────────────────────────────────────\n\nconst STITCH_WEIGHTS = {\n followUpToGoal: 4.0,\n outcomeToGoal: 2.0,\n entityOverlap: 3.0,\n tagOverlap: 1.5,\n temporalProximity: 1.0,\n} as const;\n\n// ─── Validation ──────────────────────────────────────────────────────────────\n\nexport function validateCausalEdge(raw: unknown): CausalEdge {\n if (!isRecord(raw)) throw new Error(\"CausalEdge must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"CausalEdge.schemaVersion must be 1\");\n\n const edgeType = assertString(raw.edgeType, \"edgeType\");\n const validEdgeTypes = [\"follow_up_to_goal\", \"retry\", \"continuation\", \"correction\"];\n if (!validEdgeTypes.includes(edgeType)) {\n throw new Error(`CausalEdge.edgeType must be one of ${validEdgeTypes.join(\", \")}`);\n }\n\n const stitchMethod = assertString(raw.stitchMethod, \"stitchMethod\");\n const validMethods = [\"lexical\", \"entity\", \"temporal\", \"explicit\"];\n if (!validMethods.includes(stitchMethod)) {\n throw new Error(`CausalEdge.stitchMethod must be one of ${validMethods.join(\", \")}`);\n }\n\n const confidence = typeof raw.confidence === \"number\" ? raw.confidence : 0;\n if (confidence < 0 || confidence > 1) throw new Error(\"CausalEdge.confidence must be in [0, 1]\");\n\n return {\n schemaVersion: 1,\n edgeId: assertString(raw.edgeId, \"edgeId\"),\n fromTrajectoryId: assertString(raw.fromTrajectoryId, \"fromTrajectoryId\"),\n toTrajectoryId: assertString(raw.toTrajectoryId, \"toTrajectoryId\"),\n edgeType: edgeType as CausalEdge[\"edgeType\"],\n confidence: confidence,\n stitchMethod: stitchMethod as CausalEdge[\"stitchMethod\"],\n createdAt: assertIsoRecordedAt(assertString(raw.createdAt, \"createdAt\")),\n metadata: isRecord(raw.metadata)\n ? Object.fromEntries(\n Object.entries(raw.metadata).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n )\n : undefined,\n };\n}\n\n// ─── Stable Edge ID ──────────────────────────────────────────────────────────\n\nexport function makeEdgeId(fromId: string, toId: string): string {\n const digest = createHash(\"sha256\")\n .update(`${fromId}\\0${toId}`)\n .digest(\"hex\")\n .slice(0, 12);\n return `edge-${digest}`;\n}\n\n// ─── Storage Paths ───────────────────────────────────────────────────────────\n\nexport function resolveChainsDir(memoryDir: string, causalTrajectoryStoreDir?: string): string {\n const root = causalTrajectoryStoreDir\n ? path.join(memoryDir, causalTrajectoryStoreDir)\n : path.join(memoryDir, \"state\", \"causal-trajectories\");\n return path.join(root, \"chains\");\n}\n\nfunction chainIndexPath(chainsDir: string): string {\n return path.join(chainsDir, \"chain-index.json\");\n}\n\nfunction edgeFilePath(chainsDir: string, edge: CausalEdge): string {\n const day = recordStoreDay(edge.createdAt);\n return path.join(chainsDir, \"edges\", day, `${edge.edgeId}.json`);\n}\n\n// ─── Chain Index CRUD ────────────────────────────────────────────────────────\n\nexport async function readChainIndex(chainsDir: string): Promise<CausalChainIndex> {\n try {\n const raw = JSON.parse(await readFile(chainIndexPath(chainsDir), \"utf8\"));\n return {\n outgoing: isRecord(raw.outgoing) ? raw.outgoing as Record<string, string[]> : {},\n incoming: isRecord(raw.incoming) ? raw.incoming as Record<string, string[]> : {},\n edges: isRecord(raw.edges) ? raw.edges as Record<string, CausalEdge> : {},\n updatedAt: typeof raw.updatedAt === \"string\" ? raw.updatedAt : new Date().toISOString(),\n };\n } catch {\n return { outgoing: {}, incoming: {}, edges: {}, updatedAt: new Date().toISOString() };\n }\n}\n\nexport async function writeChainIndex(chainsDir: string, index: CausalChainIndex): Promise<void> {\n await mkdir(chainsDir, { recursive: true });\n index.updatedAt = new Date().toISOString();\n await writeFile(chainIndexPath(chainsDir), JSON.stringify(index, null, 2), \"utf8\");\n}\n\nasync function persistEdge(chainsDir: string, edge: CausalEdge): Promise<string> {\n const filePath = edgeFilePath(chainsDir, edge);\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, JSON.stringify(edge, null, 2), \"utf8\");\n return filePath;\n}\n\nfunction addEdgeToIndex(index: CausalChainIndex, edge: CausalEdge): void {\n if (!index.outgoing[edge.fromTrajectoryId]) {\n index.outgoing[edge.fromTrajectoryId] = [];\n }\n if (!index.outgoing[edge.fromTrajectoryId].includes(edge.edgeId)) {\n index.outgoing[edge.fromTrajectoryId].push(edge.edgeId);\n }\n\n if (!index.incoming[edge.toTrajectoryId]) {\n index.incoming[edge.toTrajectoryId] = [];\n }\n if (!index.incoming[edge.toTrajectoryId].includes(edge.edgeId)) {\n index.incoming[edge.toTrajectoryId].push(edge.edgeId);\n }\n\n index.edges[edge.edgeId] = edge;\n}\n\n// ─── Stitching Algorithm ─────────────────────────────────────────────────────\n\n/**\n * Score how strongly a candidate trajectory from another session\n * relates to the new trajectory being recorded.\n */\nexport function scoreStitchCandidate(\n newTrajectory: CausalTrajectoryRecord,\n candidate: CausalTrajectoryRecord,\n): StitchCandidate {\n let score = 0;\n let dominantMethod: CausalEdge[\"stitchMethod\"] = \"lexical\";\n let maxComponent = 0;\n\n // 1. Follow-up → Goal match (token overlap)\n const newFollowUpTokens = new Set(\n normalizeRecallTokens(newTrajectory.followUpSummary ?? \"\", []),\n );\n const candidateGoalTokens = normalizeRecallTokens(candidate.goal, []);\n if (newFollowUpTokens.size > 0 && candidateGoalTokens.length > 0) {\n const overlap = countRecallTokenOverlap(newFollowUpTokens, candidate.goal, []);\n const normalized = overlap / Math.max(newFollowUpTokens.size, candidateGoalTokens.length);\n const component = normalized * STITCH_WEIGHTS.followUpToGoal;\n score += component;\n if (component > maxComponent) {\n maxComponent = component;\n dominantMethod = \"lexical\";\n }\n }\n\n // 1b. Candidate follow-up → New goal match (reverse direction)\n const candidateFollowUpTokens = new Set(\n normalizeRecallTokens(candidate.followUpSummary ?? \"\", []),\n );\n const newGoalTokens = normalizeRecallTokens(newTrajectory.goal, []);\n if (candidateFollowUpTokens.size > 0 && newGoalTokens.length > 0) {\n const overlap = countRecallTokenOverlap(candidateFollowUpTokens, newTrajectory.goal, []);\n const normalized = overlap / Math.max(candidateFollowUpTokens.size, newGoalTokens.length);\n const component = normalized * 3.0;\n score += component;\n if (component > maxComponent) {\n maxComponent = component;\n dominantMethod = \"lexical\";\n }\n }\n\n // 2. Outcome → Goal match\n const newOutcomeTokens = new Set(\n normalizeRecallTokens(newTrajectory.outcomeSummary, []),\n );\n if (newOutcomeTokens.size > 0) {\n const overlap = countRecallTokenOverlap(newOutcomeTokens, candidate.goal, []);\n const normalized = overlap / Math.max(newOutcomeTokens.size, candidateGoalTokens.length || 1);\n const component = normalized * STITCH_WEIGHTS.outcomeToGoal;\n score += component;\n if (component > maxComponent) {\n maxComponent = component;\n dominantMethod = \"lexical\";\n }\n }\n\n // 3. Entity overlap (Jaccard)\n const newEntities = newTrajectory.entityRefs ?? [];\n const candidateEntities = candidate.entityRefs ?? [];\n if (newEntities.length > 0 && candidateEntities.length > 0) {\n const entityJaccard = topicOverlapScore(newEntities, candidateEntities);\n const component = entityJaccard * STITCH_WEIGHTS.entityOverlap;\n score += component;\n if (component > maxComponent) {\n maxComponent = component;\n dominantMethod = \"entity\";\n }\n }\n\n // 4. Tag overlap (Jaccard)\n const newTags = newTrajectory.tags ?? [];\n const candidateTags = candidate.tags ?? [];\n if (newTags.length > 0 && candidateTags.length > 0) {\n const tagJaccard = topicOverlapScore(newTags, candidateTags);\n const component = tagJaccard * STITCH_WEIGHTS.tagOverlap;\n score += component;\n if (component > maxComponent) {\n maxComponent = component;\n dominantMethod = \"lexical\";\n }\n }\n\n // 5. Temporal proximity: 1/(1 + gapHours/24)\n const newMs = Date.parse(newTrajectory.recordedAt);\n const candidateMs = Date.parse(candidate.recordedAt);\n if (Number.isFinite(newMs) && Number.isFinite(candidateMs)) {\n const gapHours = Math.abs(newMs - candidateMs) / 3_600_000;\n const proximity = 1 / (1 + gapHours / 24);\n const component = proximity * STITCH_WEIGHTS.temporalProximity;\n score += component;\n if (component > maxComponent) {\n maxComponent = component;\n dominantMethod = \"temporal\";\n }\n }\n\n // Determine edge type by heuristic\n let edgeType: CausalEdge[\"edgeType\"] = \"continuation\";\n const goalTokens = new Set(normalizeRecallTokens(newTrajectory.goal, []));\n const candidateGoalSet = new Set(candidateGoalTokens);\n const goalOverlap = [...goalTokens].filter((t) => candidateGoalSet.has(t)).length;\n const goalSimilarity = goalTokens.size > 0 ? goalOverlap / goalTokens.size : 0;\n\n if (goalSimilarity > 0.7 && candidate.outcomeKind === \"failure\") {\n edgeType = \"retry\";\n } else if (goalSimilarity > 0.7 && newTrajectory.outcomeKind !== candidate.outcomeKind) {\n edgeType = \"correction\";\n } else if (newFollowUpTokens.size > 0 && candidateGoalTokens.length > 0) {\n const followUpGoalOverlap = countRecallTokenOverlap(newFollowUpTokens, candidate.goal, []);\n if (followUpGoalOverlap > 0) {\n edgeType = \"follow_up_to_goal\";\n }\n }\n\n return { trajectory: candidate, score, edgeType, stitchMethod: dominantMethod };\n}\n\n/**\n * Read trajectory records from the causal-trajectories store within\n * the lookback window, excluding the current session.\n */\nasync function readRecentTrajectories(\n memoryDir: string,\n causalTrajectoryStoreDir: string | undefined,\n currentSessionKey: string,\n lookbackDays: number,\n): Promise<CausalTrajectoryRecord[]> {\n const root = causalTrajectoryStoreDir\n ? path.join(memoryDir, causalTrajectoryStoreDir)\n : path.join(memoryDir, \"state\", \"causal-trajectories\");\n const trajectoriesDir = path.join(root, \"trajectories\");\n\n const files = await listJsonFiles(trajectoriesDir).catch(() => [] as string[]);\n if (files.length === 0) return [];\n\n const cutoff = Date.now() - lookbackDays * 86_400_000;\n const results: CausalTrajectoryRecord[] = [];\n\n for (const filePath of files) {\n try {\n const raw = await readJsonFile(filePath);\n if (!isRecord(raw)) continue;\n const sessionKey = typeof raw.sessionKey === \"string\" ? raw.sessionKey : \"\";\n if (sessionKey === currentSessionKey) continue;\n const recordedAt = typeof raw.recordedAt === \"string\" ? raw.recordedAt : \"\";\n const ms = Date.parse(recordedAt);\n if (!Number.isFinite(ms) || ms < cutoff) continue;\n results.push(raw as unknown as CausalTrajectoryRecord);\n } catch {\n // skip invalid files\n }\n }\n\n return results;\n}\n\n/**\n * After a new trajectory is recorded, attempt to stitch it to\n * existing trajectories from other sessions.\n */\nexport async function stitchCausalChain(options: {\n memoryDir: string;\n causalTrajectoryStoreDir?: string;\n newTrajectory: CausalTrajectoryRecord;\n config: StitchConfig;\n}): Promise<CausalEdge[]> {\n const { memoryDir, causalTrajectoryStoreDir, newTrajectory, config: stitchConfig } = options;\n const chainsDir = resolveChainsDir(memoryDir, causalTrajectoryStoreDir);\n\n const candidates = await readRecentTrajectories(\n memoryDir,\n causalTrajectoryStoreDir,\n newTrajectory.sessionKey,\n stitchConfig.lookbackDays,\n );\n\n if (candidates.length === 0) return [];\n\n const scored = candidates\n .map((c) => scoreStitchCandidate(newTrajectory, c))\n .filter((s) => s.score >= stitchConfig.minScore)\n .sort((a, b) => b.score - a.score)\n .slice(0, stitchConfig.maxEdgesPerTrajectory);\n\n if (scored.length === 0) return [];\n\n const index = await readChainIndex(chainsDir);\n const newEdges: CausalEdge[] = [];\n\n for (const candidate of scored) {\n const edgeId = makeEdgeId(candidate.trajectory.trajectoryId, newTrajectory.trajectoryId);\n\n // Skip if edge already exists\n if (index.edges[edgeId]) continue;\n\n const edge: CausalEdge = {\n schemaVersion: 1,\n edgeId,\n fromTrajectoryId: candidate.trajectory.trajectoryId,\n toTrajectoryId: newTrajectory.trajectoryId,\n edgeType: candidate.edgeType,\n confidence: Math.min(1, candidate.score / 10),\n stitchMethod: candidate.stitchMethod,\n createdAt: new Date().toISOString(),\n };\n\n addEdgeToIndex(index, edge);\n await persistEdge(chainsDir, edge);\n newEdges.push(edge);\n }\n\n if (newEdges.length > 0) {\n await writeChainIndex(chainsDir, index);\n log.debug(`[cmc] stitched ${newEdges.length} causal edge(s) for trajectory ${newTrajectory.trajectoryId}`);\n }\n\n return newEdges;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAQA,OAAO,UAAU;AACjB,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,kBAAkB;AAiD3B,IAAM,iBAAiB;AAAA,EACrB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,mBAAmB;AACrB;AAIO,SAAS,mBAAmB,KAA0B;AAC3D,MAAI,CAAC,SAAS,GAAG,EAAG,OAAM,IAAI,MAAM,8BAA8B;AAClE,MAAI,IAAI,kBAAkB,EAAG,OAAM,IAAI,MAAM,oCAAoC;AAEjF,QAAM,WAAW,aAAa,IAAI,UAAU,UAAU;AACtD,QAAM,iBAAiB,CAAC,qBAAqB,SAAS,gBAAgB,YAAY;AAClF,MAAI,CAAC,eAAe,SAAS,QAAQ,GAAG;AACtC,UAAM,IAAI,MAAM,sCAAsC,eAAe,KAAK,IAAI,CAAC,EAAE;AAAA,EACnF;AAEA,QAAM,eAAe,aAAa,IAAI,cAAc,cAAc;AAClE,QAAM,eAAe,CAAC,WAAW,UAAU,YAAY,UAAU;AACjE,MAAI,CAAC,aAAa,SAAS,YAAY,GAAG;AACxC,UAAM,IAAI,MAAM,0CAA0C,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,EACrF;AAEA,QAAM,aAAa,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AACzE,MAAI,aAAa,KAAK,aAAa,EAAG,OAAM,IAAI,MAAM,yCAAyC;AAE/F,SAAO;AAAA,IACL,eAAe;AAAA,IACf,QAAQ,aAAa,IAAI,QAAQ,QAAQ;AAAA,IACzC,kBAAkB,aAAa,IAAI,kBAAkB,kBAAkB;AAAA,IACvE,gBAAgB,aAAa,IAAI,gBAAgB,gBAAgB;AAAA,IACjE;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,oBAAoB,aAAa,IAAI,WAAW,WAAW,CAAC;AAAA,IACvE,UAAU,SAAS,IAAI,QAAQ,IAC3B,OAAO;AAAA,MACL,OAAO,QAAQ,IAAI,QAAQ,EAAE;AAAA,QAC3B,CAAC,UAAqC,OAAO,MAAM,CAAC,MAAM;AAAA,MAC5D;AAAA,IACF,IACA;AAAA,EACN;AACF;AAIO,SAAS,WAAW,QAAgB,MAAsB;AAC/D,QAAM,SAAS,WAAW,QAAQ,EAC/B,OAAO,GAAG,MAAM,KAAK,IAAI,EAAE,EAC3B,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AACd,SAAO,QAAQ,MAAM;AACvB;AAIO,SAAS,iBAAiB,WAAmB,0BAA2C;AAC7F,QAAM,OAAO,2BACT,KAAK,KAAK,WAAW,wBAAwB,IAC7C,KAAK,KAAK,WAAW,SAAS,qBAAqB;AACvD,SAAO,KAAK,KAAK,MAAM,QAAQ;AACjC;AAEA,SAAS,eAAe,WAA2B;AACjD,SAAO,KAAK,KAAK,WAAW,kBAAkB;AAChD;AAEA,SAAS,aAAa,WAAmB,MAA0B;AACjE,QAAM,MAAM,eAAe,KAAK,SAAS;AACzC,SAAO,KAAK,KAAK,WAAW,SAAS,KAAK,GAAG,KAAK,MAAM,OAAO;AACjE;AAIA,eAAsB,eAAe,WAA8C;AACjF,MAAI;AACF,UAAM,MAAM,KAAK,MAAM,MAAM,SAAS,eAAe,SAAS,GAAG,MAAM,CAAC;AACxE,WAAO;AAAA,MACL,UAAU,SAAS,IAAI,QAAQ,IAAI,IAAI,WAAuC,CAAC;AAAA,MAC/E,UAAU,SAAS,IAAI,QAAQ,IAAI,IAAI,WAAuC,CAAC;AAAA,MAC/E,OAAO,SAAS,IAAI,KAAK,IAAI,IAAI,QAAsC,CAAC;AAAA,MACxE,WAAW,OAAO,IAAI,cAAc,WAAW,IAAI,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACxF;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,OAAO,CAAC,GAAG,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE;AAAA,EACtF;AACF;AAEA,eAAsB,gBAAgB,WAAmB,OAAwC;AAC/F,QAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,UAAU,eAAe,SAAS,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,MAAM;AACnF;AAEA,eAAe,YAAY,WAAmB,MAAmC;AAC/E,QAAM,WAAW,aAAa,WAAW,IAAI;AAC7C,QAAM,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,QAAM,UAAU,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,MAAM;AAC/D,SAAO;AACT;AAEA,SAAS,eAAe,OAAyB,MAAwB;AACvE,MAAI,CAAC,MAAM,SAAS,KAAK,gBAAgB,GAAG;AAC1C,UAAM,SAAS,KAAK,gBAAgB,IAAI,CAAC;AAAA,EAC3C;AACA,MAAI,CAAC,MAAM,SAAS,KAAK,gBAAgB,EAAE,SAAS,KAAK,MAAM,GAAG;AAChE,UAAM,SAAS,KAAK,gBAAgB,EAAE,KAAK,KAAK,MAAM;AAAA,EACxD;AAEA,MAAI,CAAC,MAAM,SAAS,KAAK,cAAc,GAAG;AACxC,UAAM,SAAS,KAAK,cAAc,IAAI,CAAC;AAAA,EACzC;AACA,MAAI,CAAC,MAAM,SAAS,KAAK,cAAc,EAAE,SAAS,KAAK,MAAM,GAAG;AAC9D,UAAM,SAAS,KAAK,cAAc,EAAE,KAAK,KAAK,MAAM;AAAA,EACtD;AAEA,QAAM,MAAM,KAAK,MAAM,IAAI;AAC7B;AAQO,SAAS,qBACd,eACA,WACiB;AACjB,MAAI,QAAQ;AACZ,MAAI,iBAA6C;AACjD,MAAI,eAAe;AAGnB,QAAM,oBAAoB,IAAI;AAAA,IAC5B,sBAAsB,cAAc,mBAAmB,IAAI,CAAC,CAAC;AAAA,EAC/D;AACA,QAAM,sBAAsB,sBAAsB,UAAU,MAAM,CAAC,CAAC;AACpE,MAAI,kBAAkB,OAAO,KAAK,oBAAoB,SAAS,GAAG;AAChE,UAAM,UAAU,wBAAwB,mBAAmB,UAAU,MAAM,CAAC,CAAC;AAC7E,UAAM,aAAa,UAAU,KAAK,IAAI,kBAAkB,MAAM,oBAAoB,MAAM;AACxF,UAAM,YAAY,aAAa,eAAe;AAC9C,aAAS;AACT,QAAI,YAAY,cAAc;AAC5B,qBAAe;AACf,uBAAiB;AAAA,IACnB;AAAA,EACF;AAGA,QAAM,0BAA0B,IAAI;AAAA,IAClC,sBAAsB,UAAU,mBAAmB,IAAI,CAAC,CAAC;AAAA,EAC3D;AACA,QAAM,gBAAgB,sBAAsB,cAAc,MAAM,CAAC,CAAC;AAClE,MAAI,wBAAwB,OAAO,KAAK,cAAc,SAAS,GAAG;AAChE,UAAM,UAAU,wBAAwB,yBAAyB,cAAc,MAAM,CAAC,CAAC;AACvF,UAAM,aAAa,UAAU,KAAK,IAAI,wBAAwB,MAAM,cAAc,MAAM;AACxF,UAAM,YAAY,aAAa;AAC/B,aAAS;AACT,QAAI,YAAY,cAAc;AAC5B,qBAAe;AACf,uBAAiB;AAAA,IACnB;AAAA,EACF;AAGA,QAAM,mBAAmB,IAAI;AAAA,IAC3B,sBAAsB,cAAc,gBAAgB,CAAC,CAAC;AAAA,EACxD;AACA,MAAI,iBAAiB,OAAO,GAAG;AAC7B,UAAM,UAAU,wBAAwB,kBAAkB,UAAU,MAAM,CAAC,CAAC;AAC5E,UAAM,aAAa,UAAU,KAAK,IAAI,iBAAiB,MAAM,oBAAoB,UAAU,CAAC;AAC5F,UAAM,YAAY,aAAa,eAAe;AAC9C,aAAS;AACT,QAAI,YAAY,cAAc;AAC5B,qBAAe;AACf,uBAAiB;AAAA,IACnB;AAAA,EACF;AAGA,QAAM,cAAc,cAAc,cAAc,CAAC;AACjD,QAAM,oBAAoB,UAAU,cAAc,CAAC;AACnD,MAAI,YAAY,SAAS,KAAK,kBAAkB,SAAS,GAAG;AAC1D,UAAM,gBAAgB,kBAAkB,aAAa,iBAAiB;AACtE,UAAM,YAAY,gBAAgB,eAAe;AACjD,aAAS;AACT,QAAI,YAAY,cAAc;AAC5B,qBAAe;AACf,uBAAiB;AAAA,IACnB;AAAA,EACF;AAGA,QAAM,UAAU,cAAc,QAAQ,CAAC;AACvC,QAAM,gBAAgB,UAAU,QAAQ,CAAC;AACzC,MAAI,QAAQ,SAAS,KAAK,cAAc,SAAS,GAAG;AAClD,UAAM,aAAa,kBAAkB,SAAS,aAAa;AAC3D,UAAM,YAAY,aAAa,eAAe;AAC9C,aAAS;AACT,QAAI,YAAY,cAAc;AAC5B,qBAAe;AACf,uBAAiB;AAAA,IACnB;AAAA,EACF;AAGA,QAAM,QAAQ,KAAK,MAAM,cAAc,UAAU;AACjD,QAAM,cAAc,KAAK,MAAM,UAAU,UAAU;AACnD,MAAI,OAAO,SAAS,KAAK,KAAK,OAAO,SAAS,WAAW,GAAG;AAC1D,UAAM,WAAW,KAAK,IAAI,QAAQ,WAAW,IAAI;AACjD,UAAM,YAAY,KAAK,IAAI,WAAW;AACtC,UAAM,YAAY,YAAY,eAAe;AAC7C,aAAS;AACT,QAAI,YAAY,cAAc;AAC5B,qBAAe;AACf,uBAAiB;AAAA,IACnB;AAAA,EACF;AAGA,MAAI,WAAmC;AACvC,QAAM,aAAa,IAAI,IAAI,sBAAsB,cAAc,MAAM,CAAC,CAAC,CAAC;AACxE,QAAM,mBAAmB,IAAI,IAAI,mBAAmB;AACpD,QAAM,cAAc,CAAC,GAAG,UAAU,EAAE,OAAO,CAAC,MAAM,iBAAiB,IAAI,CAAC,CAAC,EAAE;AAC3E,QAAM,iBAAiB,WAAW,OAAO,IAAI,cAAc,WAAW,OAAO;AAE7E,MAAI,iBAAiB,OAAO,UAAU,gBAAgB,WAAW;AAC/D,eAAW;AAAA,EACb,WAAW,iBAAiB,OAAO,cAAc,gBAAgB,UAAU,aAAa;AACtF,eAAW;AAAA,EACb,WAAW,kBAAkB,OAAO,KAAK,oBAAoB,SAAS,GAAG;AACvE,UAAM,sBAAsB,wBAAwB,mBAAmB,UAAU,MAAM,CAAC,CAAC;AACzF,QAAI,sBAAsB,GAAG;AAC3B,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,SAAO,EAAE,YAAY,WAAW,OAAO,UAAU,cAAc,eAAe;AAChF;AAMA,eAAe,uBACb,WACA,0BACA,mBACA,cACmC;AACnC,QAAM,OAAO,2BACT,KAAK,KAAK,WAAW,wBAAwB,IAC7C,KAAK,KAAK,WAAW,SAAS,qBAAqB;AACvD,QAAM,kBAAkB,KAAK,KAAK,MAAM,cAAc;AAEtD,QAAM,QAAQ,MAAM,cAAc,eAAe,EAAE,MAAM,MAAM,CAAC,CAAa;AAC7E,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAEhC,QAAM,SAAS,KAAK,IAAI,IAAI,eAAe;AAC3C,QAAM,UAAoC,CAAC;AAE3C,aAAW,YAAY,OAAO;AAC5B,QAAI;AACF,YAAM,MAAM,MAAM,aAAa,QAAQ;AACvC,UAAI,CAAC,SAAS,GAAG,EAAG;AACpB,YAAM,aAAa,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AACzE,UAAI,eAAe,kBAAmB;AACtC,YAAM,aAAa,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AACzE,YAAM,KAAK,KAAK,MAAM,UAAU;AAChC,UAAI,CAAC,OAAO,SAAS,EAAE,KAAK,KAAK,OAAQ;AACzC,cAAQ,KAAK,GAAwC;AAAA,IACvD,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAMA,eAAsB,kBAAkB,SAKd;AACxB,QAAM,EAAE,WAAW,0BAA0B,eAAe,QAAQ,aAAa,IAAI;AACrF,QAAM,YAAY,iBAAiB,WAAW,wBAAwB;AAEtE,QAAM,aAAa,MAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AAEA,MAAI,WAAW,WAAW,EAAG,QAAO,CAAC;AAErC,QAAM,SAAS,WACZ,IAAI,CAAC,MAAM,qBAAqB,eAAe,CAAC,CAAC,EACjD,OAAO,CAAC,MAAM,EAAE,SAAS,aAAa,QAAQ,EAC9C,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,aAAa,qBAAqB;AAE9C,MAAI,OAAO,WAAW,EAAG,QAAO,CAAC;AAEjC,QAAM,QAAQ,MAAM,eAAe,SAAS;AAC5C,QAAM,WAAyB,CAAC;AAEhC,aAAW,aAAa,QAAQ;AAC9B,UAAM,SAAS,WAAW,UAAU,WAAW,cAAc,cAAc,YAAY;AAGvF,QAAI,MAAM,MAAM,MAAM,EAAG;AAEzB,UAAM,OAAmB;AAAA,MACvB,eAAe;AAAA,MACf;AAAA,MACA,kBAAkB,UAAU,WAAW;AAAA,MACvC,gBAAgB,cAAc;AAAA,MAC9B,UAAU,UAAU;AAAA,MACpB,YAAY,KAAK,IAAI,GAAG,UAAU,QAAQ,EAAE;AAAA,MAC5C,cAAc,UAAU;AAAA,MACxB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAEA,mBAAe,OAAO,IAAI;AAC1B,UAAM,YAAY,WAAW,IAAI;AACjC,aAAS,KAAK,IAAI;AAAA,EACpB;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,gBAAgB,WAAW,KAAK;AACtC,QAAI,MAAM,kBAAkB,SAAS,MAAM,kCAAkC,cAAc,YAAY,EAAE;AAAA,EAC3G;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,240 @@
1
+ import {
2
+ log
3
+ } from "./chunk-KWBU5S5U.js";
4
+
5
+ // src/model-registry.ts
6
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
7
+ import { join } from "path";
8
+ var DEFAULT_CAPABILITIES = {
9
+ modelId: "default",
10
+ maxPositionEmbeddings: 32768,
11
+ contextWindow: 32768,
12
+ supportsExtendedContext: false,
13
+ typicalOutputTokens: 8192,
14
+ source: "default",
15
+ fetchedAt: (/* @__PURE__ */ new Date()).toISOString()
16
+ };
17
+ var KNOWN_MODELS = {
18
+ "qwen3-30b-a3b-instruct": {
19
+ maxPositionEmbeddings: 40960,
20
+ contextWindow: 131072,
21
+ // 128K with YaRN - but LM Studio defaults to ~32K
22
+ supportsExtendedContext: true,
23
+ ropeScaling: {
24
+ type: "yarn",
25
+ factor: 4,
26
+ originalMaxPositionEmbeddings: 32768
27
+ },
28
+ typicalOutputTokens: 8192
29
+ },
30
+ "qwen3-coder-30b-a3b-instruct": {
31
+ maxPositionEmbeddings: 40960,
32
+ contextWindow: 131072,
33
+ // 128K with YaRN - but LM Studio defaults to ~32K
34
+ supportsExtendedContext: true,
35
+ ropeScaling: {
36
+ type: "yarn",
37
+ factor: 4,
38
+ originalMaxPositionEmbeddings: 32768
39
+ },
40
+ typicalOutputTokens: 8192
41
+ },
42
+ "qwen3-8b": {
43
+ maxPositionEmbeddings: 40960,
44
+ contextWindow: 131072,
45
+ supportsExtendedContext: true,
46
+ typicalOutputTokens: 4096
47
+ },
48
+ "qwen3-14b": {
49
+ maxPositionEmbeddings: 40960,
50
+ contextWindow: 131072,
51
+ supportsExtendedContext: true,
52
+ typicalOutputTokens: 4096
53
+ },
54
+ "qwen3-32b": {
55
+ maxPositionEmbeddings: 40960,
56
+ contextWindow: 131072,
57
+ supportsExtendedContext: true,
58
+ typicalOutputTokens: 4096
59
+ },
60
+ "llama-3.1": {
61
+ maxPositionEmbeddings: 131072,
62
+ contextWindow: 131072,
63
+ supportsExtendedContext: false,
64
+ typicalOutputTokens: 8192
65
+ },
66
+ "llama-3.2": {
67
+ maxPositionEmbeddings: 131072,
68
+ contextWindow: 131072,
69
+ supportsExtendedContext: false,
70
+ typicalOutputTokens: 8192
71
+ },
72
+ "mistral-nemo": {
73
+ maxPositionEmbeddings: 131072,
74
+ contextWindow: 131072,
75
+ supportsExtendedContext: false,
76
+ typicalOutputTokens: 8192
77
+ },
78
+ "gemma-2": {
79
+ maxPositionEmbeddings: 8192,
80
+ contextWindow: 8192,
81
+ supportsExtendedContext: false,
82
+ typicalOutputTokens: 4096
83
+ }
84
+ };
85
+ var ModelRegistry = class {
86
+ registryPath;
87
+ data;
88
+ CACHE_TTL_DAYS = 7;
89
+ constructor(memoryDir) {
90
+ const registryDir = join(memoryDir, ".registry");
91
+ if (!existsSync(registryDir)) {
92
+ mkdirSync(registryDir, { recursive: true });
93
+ }
94
+ this.registryPath = join(registryDir, "model-capabilities.json");
95
+ this.data = this.loadRegistry();
96
+ }
97
+ loadRegistry() {
98
+ try {
99
+ if (existsSync(this.registryPath)) {
100
+ const content = readFileSync(this.registryPath, "utf-8");
101
+ const data = JSON.parse(content);
102
+ log.info(`ModelRegistry: loaded ${Object.keys(data.models).length} cached models`);
103
+ return data;
104
+ }
105
+ } catch (err) {
106
+ log.warn(`ModelRegistry: failed to load registry: ${err}`);
107
+ }
108
+ return { models: {}, version: 1 };
109
+ }
110
+ saveRegistry() {
111
+ try {
112
+ writeFileSync(this.registryPath, JSON.stringify(this.data, null, 2));
113
+ } catch (err) {
114
+ log.warn(`ModelRegistry: failed to save registry: ${err}`);
115
+ }
116
+ }
117
+ isCacheExpired(model) {
118
+ const fetched = new Date(model.fetchedAt);
119
+ const now = /* @__PURE__ */ new Date();
120
+ const daysDiff = (now.getTime() - fetched.getTime()) / (1e3 * 60 * 60 * 24);
121
+ return daysDiff > this.CACHE_TTL_DAYS;
122
+ }
123
+ normalizeModelId(modelId) {
124
+ return modelId.toLowerCase().replace(/@\d+bit$/, "").replace(/-mlx$/, "").replace(/-awq$/, "").replace(/-gptq$/, "").replace(/-gguf$/, "").replace(/^mlx-community\//, "").replace(/^models\//, "").trim();
125
+ }
126
+ /**
127
+ * Get capabilities for a model, using cache if available
128
+ */
129
+ getCapabilities(modelId) {
130
+ const normalizedId = this.normalizeModelId(modelId);
131
+ if (this.data.models[normalizedId]) {
132
+ const cached = this.data.models[normalizedId];
133
+ if (!this.isCacheExpired(cached)) {
134
+ log.info(`ModelRegistry: using cached capabilities for ${modelId}`);
135
+ return cached;
136
+ }
137
+ log.info(`ModelRegistry: cache expired for ${modelId}, will refresh`);
138
+ }
139
+ for (const [knownId, capabilities] of Object.entries(KNOWN_MODELS)) {
140
+ if (normalizedId.includes(knownId)) {
141
+ log.info(`ModelRegistry: using known capabilities for ${modelId}`);
142
+ const caps = {
143
+ ...DEFAULT_CAPABILITIES,
144
+ ...capabilities,
145
+ modelId: normalizedId,
146
+ source: "default",
147
+ fetchedAt: (/* @__PURE__ */ new Date()).toISOString()
148
+ };
149
+ this.data.models[normalizedId] = caps;
150
+ this.saveRegistry();
151
+ return caps;
152
+ }
153
+ }
154
+ log.info(`ModelRegistry: using default capabilities for ${modelId}`);
155
+ return {
156
+ ...DEFAULT_CAPABILITIES,
157
+ modelId: normalizedId
158
+ };
159
+ }
160
+ /**
161
+ * Store capabilities for a model
162
+ */
163
+ setCapabilities(modelId, capabilities) {
164
+ const normalizedId = this.normalizeModelId(modelId);
165
+ const caps = {
166
+ ...capabilities,
167
+ modelId: normalizedId,
168
+ fetchedAt: (/* @__PURE__ */ new Date()).toISOString()
169
+ };
170
+ this.data.models[normalizedId] = caps;
171
+ this.saveRegistry();
172
+ log.info(`ModelRegistry: stored capabilities for ${modelId}`);
173
+ }
174
+ /**
175
+ * Calculate optimal input/output sizes for a model
176
+ * @param maxContextOverride - Optional override for max context (e.g., if LLM server defaults to smaller window)
177
+ */
178
+ calculateContextSizes(modelId, maxContextOverride) {
179
+ const caps = this.getCapabilities(modelId);
180
+ const effectiveContextWindow = maxContextOverride ?? caps.contextWindow;
181
+ const overheadTokens = Math.min(1e3, Math.floor(effectiveContextWindow / 10));
182
+ const minInputTokens = Math.min(512, Math.floor(effectiveContextWindow / 4));
183
+ const minOutputTokens = 256;
184
+ let outputTokens = caps.typicalOutputTokens;
185
+ if (effectiveContextWindow > 65536) {
186
+ outputTokens = Math.min(Math.floor(effectiveContextWindow / 8), 16384);
187
+ }
188
+ outputTokens = Math.min(outputTokens, Math.floor(effectiveContextWindow / 4));
189
+ outputTokens = Math.max(
190
+ minOutputTokens,
191
+ Math.min(outputTokens, effectiveContextWindow - overheadTokens - minInputTokens)
192
+ );
193
+ const availableForInput = Math.max(
194
+ 0,
195
+ effectiveContextWindow - outputTokens - overheadTokens
196
+ );
197
+ const maxInputChars = Math.max(0, Math.floor(availableForInput * 3.5));
198
+ const source = maxContextOverride ? "user override" : caps.source;
199
+ return {
200
+ maxInputChars,
201
+ maxOutputTokens: outputTokens,
202
+ description: `${caps.modelId}: ${effectiveContextWindow.toLocaleString()} context (${source}), using ${maxInputChars.toLocaleString()} chars input / ${outputTokens} tokens output`
203
+ };
204
+ }
205
+ /**
206
+ * Fetch capabilities from Hugging Face (if available)
207
+ * Returns true if successful
208
+ */
209
+ async fetchFromHuggingFace(modelId) {
210
+ log.info(`ModelRegistry: fetchFromHuggingFace not yet implemented for ${modelId}`);
211
+ return false;
212
+ }
213
+ /**
214
+ * List all cached models
215
+ */
216
+ listCached() {
217
+ return Object.keys(this.data.models);
218
+ }
219
+ /**
220
+ * Clear expired cache entries
221
+ */
222
+ cleanExpired() {
223
+ const before = Object.keys(this.data.models).length;
224
+ this.data.models = Object.fromEntries(
225
+ Object.entries(this.data.models).filter(([_, caps]) => !this.isCacheExpired(caps))
226
+ );
227
+ const after = Object.keys(this.data.models).length;
228
+ const removed = before - after;
229
+ if (removed > 0) {
230
+ this.saveRegistry();
231
+ log.info(`ModelRegistry: cleaned ${removed} expired entries`);
232
+ }
233
+ return removed;
234
+ }
235
+ };
236
+
237
+ export {
238
+ ModelRegistry
239
+ };
240
+ //# sourceMappingURL=chunk-ONRU4L2N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/model-registry.ts"],"sourcesContent":["/**\n * Model Registry - Stores and retrieves model capabilities\n * Avoids repeated external lookups by caching model info locally\n */\n\nimport { log } from \"./logger.js\";\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface ModelCapabilities {\n modelId: string;\n maxPositionEmbeddings: number;\n contextWindow: number;\n supportsExtendedContext: boolean;\n ropeScaling?: {\n type: string;\n factor: number;\n originalMaxPositionEmbeddings: number;\n };\n typicalOutputTokens: number;\n source: \"huggingface\" | \"lmstudio\" | \"manual\" | \"default\";\n fetchedAt: string;\n}\n\ninterface ModelRegistryData {\n models: Record<string, ModelCapabilities>;\n version: number;\n}\n\nconst DEFAULT_CAPABILITIES: ModelCapabilities = {\n modelId: \"default\",\n maxPositionEmbeddings: 32768,\n contextWindow: 32768,\n supportsExtendedContext: false,\n typicalOutputTokens: 8192,\n source: \"default\",\n fetchedAt: new Date().toISOString(),\n};\n\n// Known model capabilities (fallback when offline)\n// NOTE: Context windows here are the MODEL's theoretical maximum. Local LLM servers\n// (LM Studio, Ollama, etc.) often load models with smaller default context windows.\n// If you get \"context length exceeded\" errors, either:\n// 1. Increase the context window in your LLM server UI (recommended)\n// 2. Set localLlmMaxContext in openclaw.json to limit prompts (fallback)\nconst KNOWN_MODELS: Record<string, Partial<ModelCapabilities>> = {\n \"qwen3-30b-a3b-instruct\": {\n maxPositionEmbeddings: 40960,\n contextWindow: 131072, // 128K with YaRN - but LM Studio defaults to ~32K\n supportsExtendedContext: true,\n ropeScaling: {\n type: \"yarn\",\n factor: 4.0,\n originalMaxPositionEmbeddings: 32768,\n },\n typicalOutputTokens: 8192,\n },\n \"qwen3-coder-30b-a3b-instruct\": {\n maxPositionEmbeddings: 40960,\n contextWindow: 131072, // 128K with YaRN - but LM Studio defaults to ~32K\n supportsExtendedContext: true,\n ropeScaling: {\n type: \"yarn\",\n factor: 4.0,\n originalMaxPositionEmbeddings: 32768,\n },\n typicalOutputTokens: 8192,\n },\n \"qwen3-8b\": {\n maxPositionEmbeddings: 40960,\n contextWindow: 131072,\n supportsExtendedContext: true,\n typicalOutputTokens: 4096,\n },\n \"qwen3-14b\": {\n maxPositionEmbeddings: 40960,\n contextWindow: 131072,\n supportsExtendedContext: true,\n typicalOutputTokens: 4096,\n },\n \"qwen3-32b\": {\n maxPositionEmbeddings: 40960,\n contextWindow: 131072,\n supportsExtendedContext: true,\n typicalOutputTokens: 4096,\n },\n \"llama-3.1\": {\n maxPositionEmbeddings: 131072,\n contextWindow: 131072,\n supportsExtendedContext: false,\n typicalOutputTokens: 8192,\n },\n \"llama-3.2\": {\n maxPositionEmbeddings: 131072,\n contextWindow: 131072,\n supportsExtendedContext: false,\n typicalOutputTokens: 8192,\n },\n \"mistral-nemo\": {\n maxPositionEmbeddings: 131072,\n contextWindow: 131072,\n supportsExtendedContext: false,\n typicalOutputTokens: 8192,\n },\n \"gemma-2\": {\n maxPositionEmbeddings: 8192,\n contextWindow: 8192,\n supportsExtendedContext: false,\n typicalOutputTokens: 4096,\n },\n};\n\nexport class ModelRegistry {\n private registryPath: string;\n private data: ModelRegistryData;\n private readonly CACHE_TTL_DAYS = 7;\n\n constructor(memoryDir: string) {\n const registryDir = join(memoryDir, \".registry\");\n if (!existsSync(registryDir)) {\n mkdirSync(registryDir, { recursive: true });\n }\n this.registryPath = join(registryDir, \"model-capabilities.json\");\n this.data = this.loadRegistry();\n }\n\n private loadRegistry(): ModelRegistryData {\n try {\n if (existsSync(this.registryPath)) {\n const content = readFileSync(this.registryPath, \"utf-8\");\n const data = JSON.parse(content) as ModelRegistryData;\n log.info(`ModelRegistry: loaded ${Object.keys(data.models).length} cached models`);\n return data;\n }\n } catch (err) {\n log.warn(`ModelRegistry: failed to load registry: ${err}`);\n }\n return { models: {}, version: 1 };\n }\n\n private saveRegistry(): void {\n try {\n writeFileSync(this.registryPath, JSON.stringify(this.data, null, 2));\n } catch (err) {\n log.warn(`ModelRegistry: failed to save registry: ${err}`);\n }\n }\n\n private isCacheExpired(model: ModelCapabilities): boolean {\n const fetched = new Date(model.fetchedAt);\n const now = new Date();\n const daysDiff = (now.getTime() - fetched.getTime()) / (1000 * 60 * 60 * 24);\n return daysDiff > this.CACHE_TTL_DAYS;\n }\n\n private normalizeModelId(modelId: string): string {\n // Remove common suffixes and prefixes for matching\n return modelId\n .toLowerCase()\n .replace(/@\\d+bit$/, \"\") // Remove @4bit, @8bit\n .replace(/-mlx$/, \"\")\n .replace(/-awq$/, \"\")\n .replace(/-gptq$/, \"\")\n .replace(/-gguf$/, \"\")\n .replace(/^mlx-community\\//, \"\")\n .replace(/^models\\//, \"\")\n .trim();\n }\n\n /**\n * Get capabilities for a model, using cache if available\n */\n getCapabilities(modelId: string): ModelCapabilities {\n const normalizedId = this.normalizeModelId(modelId);\n\n // Check cache first\n if (this.data.models[normalizedId]) {\n const cached = this.data.models[normalizedId];\n if (!this.isCacheExpired(cached)) {\n log.info(`ModelRegistry: using cached capabilities for ${modelId}`);\n return cached;\n }\n log.info(`ModelRegistry: cache expired for ${modelId}, will refresh`);\n }\n\n // Check known models\n for (const [knownId, capabilities] of Object.entries(KNOWN_MODELS)) {\n if (normalizedId.includes(knownId)) {\n log.info(`ModelRegistry: using known capabilities for ${modelId}`);\n const caps: ModelCapabilities = {\n ...DEFAULT_CAPABILITIES,\n ...capabilities,\n modelId: normalizedId,\n source: \"default\",\n fetchedAt: new Date().toISOString(),\n };\n this.data.models[normalizedId] = caps;\n this.saveRegistry();\n return caps;\n }\n }\n\n // Return defaults\n log.info(`ModelRegistry: using default capabilities for ${modelId}`);\n return {\n ...DEFAULT_CAPABILITIES,\n modelId: normalizedId,\n };\n }\n\n /**\n * Store capabilities for a model\n */\n setCapabilities(modelId: string, capabilities: Omit<ModelCapabilities, \"modelId\" | \"fetchedAt\">): void {\n const normalizedId = this.normalizeModelId(modelId);\n const caps: ModelCapabilities = {\n ...capabilities,\n modelId: normalizedId,\n fetchedAt: new Date().toISOString(),\n };\n this.data.models[normalizedId] = caps;\n this.saveRegistry();\n log.info(`ModelRegistry: stored capabilities for ${modelId}`);\n }\n\n /**\n * Calculate optimal input/output sizes for a model\n * @param maxContextOverride - Optional override for max context (e.g., if LLM server defaults to smaller window)\n */\n calculateContextSizes(modelId: string, maxContextOverride?: number): {\n maxInputChars: number;\n maxOutputTokens: number;\n description: string;\n } {\n const caps = this.getCapabilities(modelId);\n\n // Use override if provided (e.g., user knows their LLM server limits), otherwise use detected caps\n const effectiveContextWindow = maxContextOverride ?? caps.contextWindow;\n\n // Guardrails: never allow output budget to exceed the model/server context window.\n // If we do, input budget goes negative and we end up generating huge, invalid prompts.\n const overheadTokens = Math.min(1000, Math.floor(effectiveContextWindow / 10)); // <=10% overhead, max 1k\n const minInputTokens = Math.min(512, Math.floor(effectiveContextWindow / 4)); // keep some room even on small contexts\n const minOutputTokens = 256;\n\n // Base output budget: typical output, but scaled down for small contexts.\n let outputTokens = caps.typicalOutputTokens;\n\n // For very large contexts, default to ~12.5% output (capped), which tends to be plenty for JSON extraction.\n if (effectiveContextWindow > 65536) {\n outputTokens = Math.min(Math.floor(effectiveContextWindow / 8), 16384);\n }\n\n // Never let output exceed 25% of context.\n outputTokens = Math.min(outputTokens, Math.floor(effectiveContextWindow / 4));\n\n // Clamp output so we always have positive input headroom.\n outputTokens = Math.max(\n minOutputTokens,\n Math.min(outputTokens, effectiveContextWindow - overheadTokens - minInputTokens),\n );\n\n const availableForInput = Math.max(\n 0,\n effectiveContextWindow - outputTokens - overheadTokens,\n );\n\n // Convert to characters (rough estimate: 1 token ≈ 4 chars)\n const maxInputChars = Math.max(0, Math.floor(availableForInput * 3.5)); // Conservative: 3.5 chars/token\n\n const source = maxContextOverride ? \"user override\" : caps.source;\n return {\n maxInputChars,\n maxOutputTokens: outputTokens,\n description: `${caps.modelId}: ${effectiveContextWindow.toLocaleString()} context (${source}), using ${maxInputChars.toLocaleString()} chars input / ${outputTokens} tokens output`,\n };\n }\n\n /**\n * Fetch capabilities from Hugging Face (if available)\n * Returns true if successful\n */\n async fetchFromHuggingFace(modelId: string): Promise<boolean> {\n // This would be implemented to fetch from HF Hub API\n // For now, we rely on the known models and manual updates\n log.info(`ModelRegistry: fetchFromHuggingFace not yet implemented for ${modelId}`);\n return false;\n }\n\n /**\n * List all cached models\n */\n listCached(): string[] {\n return Object.keys(this.data.models);\n }\n\n /**\n * Clear expired cache entries\n */\n cleanExpired(): number {\n const before = Object.keys(this.data.models).length;\n this.data.models = Object.fromEntries(\n Object.entries(this.data.models).filter(([_, caps]) => !this.isCacheExpired(caps))\n );\n const after = Object.keys(this.data.models).length;\n const removed = before - after;\n if (removed > 0) {\n this.saveRegistry();\n log.info(`ModelRegistry: cleaned ${removed} expired entries`);\n }\n return removed;\n }\n}\n"],"mappings":"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","names":[]}