@iowarp/clio-coder 0.4.9 → 0.5.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 (1172) hide show
  1. package/.claude-plugin/marketplace.json +11 -3
  2. package/CHANGELOG.md +153 -0
  3. package/CODE_OF_CONDUCT.md +10 -0
  4. package/CONTRIBUTING.md +208 -382
  5. package/NOTICE +8 -2
  6. package/README.md +199 -418
  7. package/ROADMAP.md +82 -0
  8. package/SECURITY.md +14 -11
  9. package/dist/acp-KS7ARGV6.js +132 -0
  10. package/dist/agents-YOGJ2YEJ.js +163 -0
  11. package/dist/assets/codewiki.json +1 -1
  12. package/dist/auth-CEDCO6O6.js +557 -0
  13. package/dist/background-YWTBPSQU.js +39 -0
  14. package/dist/builtins-GDYO4RTR.js +23 -0
  15. package/dist/chunk-27YTM2CV.js +175 -0
  16. package/dist/chunk-2AF6YC7Q.js +75 -0
  17. package/dist/chunk-2DTIWSAW.js +381 -0
  18. package/dist/chunk-2EMLKSCX.js +262 -0
  19. package/dist/chunk-2OJ3YZQP.js +665 -0
  20. package/dist/chunk-2VLYHHFT.js +35 -0
  21. package/dist/chunk-2WVPJF3Z.js +204 -0
  22. package/dist/chunk-33OASOS6.js +176 -0
  23. package/dist/chunk-3BD2LXYJ.js +19 -0
  24. package/dist/chunk-3JHUFKG7.js +30 -0
  25. package/dist/chunk-3JLTRPN7.js +711 -0
  26. package/dist/chunk-3LT34CAM.js +2796 -0
  27. package/dist/chunk-3O5JWP4L.js +1670 -0
  28. package/dist/chunk-3UW3KU4A.js +21 -0
  29. package/dist/chunk-4A6YRGV4.js +569 -0
  30. package/dist/chunk-4D2BRCZ3.js +67 -0
  31. package/dist/chunk-4SYHGVDE.js +668 -0
  32. package/dist/chunk-4VDHLCF5.js +66 -0
  33. package/dist/chunk-4WOOTKFD.js +637 -0
  34. package/dist/chunk-4WV4PI66.js +80 -0
  35. package/dist/chunk-53OXPRI6.js +195 -0
  36. package/dist/chunk-55RMDDFM.js +1347 -0
  37. package/dist/chunk-56XP4FJU.js +2025 -0
  38. package/dist/chunk-5B3RTYAK.js +123 -0
  39. package/dist/chunk-5CD243WE.js +45 -0
  40. package/dist/chunk-5JQR5B4D.js +709 -0
  41. package/dist/chunk-5KQEUIWM.js +597 -0
  42. package/dist/chunk-5LP5FNNR.js +915 -0
  43. package/dist/chunk-62UK7AGW.js +9344 -0
  44. package/dist/chunk-6CTHLZFB.js +563 -0
  45. package/dist/chunk-6EJYVCTN.js +23 -0
  46. package/dist/chunk-6OWUM2NC.js +12289 -0
  47. package/dist/chunk-6RJMYYIE.js +1023 -0
  48. package/dist/chunk-6W75D37F.js +643 -0
  49. package/dist/chunk-733ZBT5P.js +1721 -0
  50. package/dist/chunk-77DCC6JZ.js +3710 -0
  51. package/dist/chunk-7QXCO3AF.js +156 -0
  52. package/dist/chunk-7RET77VB.js +481 -0
  53. package/dist/chunk-A4MVRV4C.js +65 -0
  54. package/dist/chunk-ALJWT6O6.js +93 -0
  55. package/dist/chunk-AVSR2HKI.js +232 -0
  56. package/dist/chunk-B7GY6QER.js +42 -0
  57. package/dist/chunk-BFOSV5EZ.js +178 -0
  58. package/dist/chunk-BGOIM7NB.js +103 -0
  59. package/dist/chunk-BJH6WFIB.js +372 -0
  60. package/dist/chunk-BOBCCDJ6.js +1533 -0
  61. package/dist/chunk-BRCOSE7O.js +117 -0
  62. package/dist/chunk-BYFHHCFV.js +601 -0
  63. package/dist/chunk-C2CPOIH2.js +83 -0
  64. package/dist/chunk-C7AQTPCE.js +694 -0
  65. package/dist/chunk-CBAQPTDU.js +165 -0
  66. package/dist/chunk-CDQ2UC6W.js +125 -0
  67. package/dist/chunk-CN6SW5DC.js +177 -0
  68. package/dist/chunk-CRHPCPZP.js +132 -0
  69. package/dist/chunk-CTFPFW3H.js +44 -0
  70. package/dist/chunk-D3KWFOUT.js +103 -0
  71. package/dist/chunk-D65E25JG.js +185 -0
  72. package/dist/chunk-DCGHJQ2U.js +236 -0
  73. package/dist/chunk-DE2LU267.js +106 -0
  74. package/dist/chunk-DF6PI6GN.js +97 -0
  75. package/dist/chunk-DGC6X6XR.js +53 -0
  76. package/dist/chunk-DOUISWEE.js +526 -0
  77. package/dist/chunk-DR3TAEUA.js +188 -0
  78. package/dist/chunk-DVTBERFY.js +33 -0
  79. package/dist/chunk-DXSETN72.js +1051 -0
  80. package/dist/chunk-DZLR4UEH.js +128 -0
  81. package/dist/chunk-E6IPKW2E.js +77 -0
  82. package/dist/chunk-EG4ARXPC.js +139 -0
  83. package/dist/chunk-EKV4UBCM.js +652 -0
  84. package/dist/chunk-EOJPDNUP.js +1325 -0
  85. package/dist/chunk-EX57VVWW.js +4157 -0
  86. package/dist/chunk-EYTLV3W3.js +5937 -0
  87. package/dist/chunk-EZD2BXGP.js +475 -0
  88. package/dist/chunk-EZDCA34W.js +314 -0
  89. package/dist/chunk-FD2I4KBR.js +33 -0
  90. package/dist/chunk-FD3IAHQM.js +27 -0
  91. package/dist/chunk-FFYTC2KQ.js +416 -0
  92. package/dist/chunk-FGSQHUCK.js +110 -0
  93. package/dist/chunk-GCQFN7YI.js +32 -0
  94. package/dist/chunk-GGPF6LLE.js +38 -0
  95. package/dist/chunk-GGWI3OVM.js +215 -0
  96. package/dist/chunk-GLIQT7SU.js +172 -0
  97. package/dist/chunk-GN7QBEEI.js +95 -0
  98. package/dist/chunk-GRHOXDKB.js +1104 -0
  99. package/dist/chunk-HMN2C6YL.js +54 -0
  100. package/dist/chunk-HOEDA42N.js +310 -0
  101. package/dist/chunk-HOYZUKG7.js +192 -0
  102. package/dist/chunk-HQVN7G4F.js +1021 -0
  103. package/dist/chunk-HSQQFDB3.js +519 -0
  104. package/dist/chunk-I4ELN5BX.js +47 -0
  105. package/dist/chunk-I4Y4WKZR.js +386 -0
  106. package/dist/chunk-IFPDAD7R.js +797 -0
  107. package/dist/chunk-IN7DGBVS.js +582 -0
  108. package/dist/chunk-ISHUS7HC.js +396 -0
  109. package/dist/chunk-JPXLJSGR.js +191 -0
  110. package/dist/chunk-JQCLXSFI.js +69 -0
  111. package/dist/chunk-KBUTSJSR.js +61 -0
  112. package/dist/chunk-KW5HXKLJ.js +56 -0
  113. package/dist/chunk-L4APUGCT.js +139 -0
  114. package/dist/chunk-L7G7K4I2.js +505 -0
  115. package/dist/chunk-LAR7DX5E.js +1840 -0
  116. package/dist/chunk-LAVUQX3B.js +462 -0
  117. package/dist/chunk-LJRBX7QR.js +116 -0
  118. package/dist/chunk-LNOXCGN2.js +1864 -0
  119. package/dist/chunk-LTWH2ACR.js +23002 -0
  120. package/dist/chunk-LYJJ6546.js +661 -0
  121. package/dist/chunk-M2IPMWCN.js +457 -0
  122. package/dist/chunk-MGLRTOCK.js +101 -0
  123. package/dist/chunk-MZF5IKZT.js +160 -0
  124. package/dist/chunk-N24R6KWS.js +386 -0
  125. package/dist/chunk-NASYVWDB.js +604 -0
  126. package/dist/chunk-NBXFPI7U.js +195 -0
  127. package/dist/chunk-NDPF2N2L.js +400 -0
  128. package/dist/chunk-NFSK2VNU.js +446 -0
  129. package/dist/chunk-NG3QQSXY.js +43 -0
  130. package/dist/chunk-NOCSM22Y.js +63 -0
  131. package/dist/chunk-NVPXXW2H.js +1143 -0
  132. package/dist/chunk-O63U2I6I.js +30 -0
  133. package/dist/chunk-OJXOA6YU.js +98 -0
  134. package/dist/chunk-OPD7GL6F.js +1196 -0
  135. package/dist/chunk-OQ2EOAHA.js +14399 -0
  136. package/dist/chunk-OV62D6KO.js +688 -0
  137. package/dist/chunk-OZ76TLGU.js +740 -0
  138. package/dist/chunk-P4GNZPXO.js +1156 -0
  139. package/dist/chunk-PS6JAWJZ.js +78 -0
  140. package/dist/chunk-PXRCXGLK.js +1865 -0
  141. package/dist/chunk-QDUUOZ3S.js +108 -0
  142. package/dist/chunk-QG6I2T5E.js +1416 -0
  143. package/dist/chunk-QHSBROEW.js +308 -0
  144. package/dist/chunk-QNUQ7K7D.js +46 -0
  145. package/dist/chunk-QZTTRSJE.js +333 -0
  146. package/dist/chunk-R2UUNSNQ.js +1605 -0
  147. package/dist/chunk-R7FGRZNF.js +1794 -0
  148. package/dist/chunk-RNDCROSG.js +199 -0
  149. package/dist/chunk-S36CXHO2.js +302 -0
  150. package/dist/chunk-SJGS3GDI.js +575 -0
  151. package/dist/chunk-SQZHXUB3.js +510 -0
  152. package/dist/chunk-SUTLW6ND.js +686 -0
  153. package/dist/chunk-SYF7FVBL.js +179 -0
  154. package/dist/chunk-T2MDZES3.js +1577 -0
  155. package/dist/chunk-T33IYTZM.js +1146 -0
  156. package/dist/chunk-TDGYTWM6.js +49 -0
  157. package/dist/chunk-TGL5FZVD.js +132 -0
  158. package/dist/chunk-TGWZXJ7L.js +1205 -0
  159. package/dist/chunk-TKDRT2DF.js +114 -0
  160. package/dist/chunk-TV2EBCSQ.js +152 -0
  161. package/dist/chunk-U26XXPJS.js +367 -0
  162. package/dist/chunk-U5QU5ZOD.js +419 -0
  163. package/dist/chunk-U6YTUVOX.js +1011 -0
  164. package/dist/chunk-UCINIRHW.js +188 -0
  165. package/dist/chunk-UJD5MPP6.js +52 -0
  166. package/dist/chunk-URCXX7WJ.js +146 -0
  167. package/dist/chunk-UX2L5CUD.js +898 -0
  168. package/dist/chunk-UZVYEF57.js +114 -0
  169. package/dist/chunk-V35KZDUZ.js +218 -0
  170. package/dist/chunk-VESL6DQY.js +1058 -0
  171. package/dist/chunk-VKHLUZNO.js +986 -0
  172. package/dist/chunk-VOYUCAQF.js +584 -0
  173. package/dist/chunk-VYRQHORQ.js +414 -0
  174. package/dist/chunk-W53XSRQE.js +245 -0
  175. package/dist/chunk-X4CEFOSG.js +226 -0
  176. package/dist/chunk-XDHUDE5K.js +380 -0
  177. package/dist/chunk-XISLDHEL.js +1290 -0
  178. package/dist/chunk-XM34YQ2Y.js +169 -0
  179. package/dist/chunk-XMDBTYCH.js +661 -0
  180. package/dist/chunk-XS2QPZJE.js +449 -0
  181. package/dist/chunk-YBUECLAF.js +618 -0
  182. package/dist/chunk-YQ6XEFVK.js +332 -0
  183. package/dist/chunk-YYLCPDCC.js +990 -0
  184. package/dist/chunk-Z4GLJ6J4.js +1035 -0
  185. package/dist/chunk-ZARZ4POR.js +210 -0
  186. package/dist/chunk-ZJPORZTC.js +119 -0
  187. package/dist/chunk-ZNUZ3EXD.js +243 -0
  188. package/dist/chunk-ZPST2KQO.js +49 -0
  189. package/dist/chunk-ZR5YA6ZF.js +512 -0
  190. package/dist/chunk-ZU4JPCPR.js +319 -0
  191. package/dist/chunk-ZUKUCZYZ.js +39 -0
  192. package/dist/cli/index.js +56 -45
  193. package/dist/clio-K2PBVCEM.js +27 -0
  194. package/dist/clio-context-tools-GR4OHFSO.js +145 -0
  195. package/dist/code-nav-4X3OI6DK.js +715 -0
  196. package/dist/codewiki/build-worker.js +4 -4
  197. package/dist/compile-cache-YRB6QRO7.js +18 -0
  198. package/dist/components-RQOJ6NUR.js +675 -0
  199. package/dist/config-Q5J7UBAB.js +291 -0
  200. package/dist/config-XE7XYZLU.js +38 -0
  201. package/dist/config-graph-P3555574.js +175 -0
  202. package/dist/configure-KIJ32ZO6.js +104 -0
  203. package/dist/context-LFBQOSXT.js +344 -0
  204. package/dist/context-NNLBES2Y.js +82 -0
  205. package/dist/context-WBH3KSVR.js +302 -0
  206. package/dist/context-clear-YOHMQ6SQ.js +208 -0
  207. package/dist/context-index-X2N5UAIF.js +120 -0
  208. package/dist/context-map-HOSMGUG2.js +555 -0
  209. package/dist/context-working-set-MRAEVDNV.js +1564 -0
  210. package/dist/data-tool-JJPBGMQJ.js +2986 -0
  211. package/dist/detail-RHJOTGN4.js +139 -0
  212. package/dist/dispatch-runner-NC7PYNIO.js +2477 -0
  213. package/dist/docs-K4GBWRUX.js +342 -0
  214. package/dist/doctor-S5KZ2GTN.js +1138 -0
  215. package/dist/doctor-deep-2EJQSHIZ.js +130 -0
  216. package/dist/domain-loader-MB34FDPD.js +13 -0
  217. package/dist/eval-3D6M36N7.js +5220 -0
  218. package/dist/eval-inventory-SM3HNM47.js +260 -0
  219. package/dist/evals-FO6JEUCN.js +104 -0
  220. package/dist/evidence-6IYN52ET.js +262 -0
  221. package/dist/evidence-JVECPI3F.js +250 -0
  222. package/dist/evidence-XNVPPLVK.js +410 -0
  223. package/dist/evolve-TLPUDJDM.js +634 -0
  224. package/dist/extensions-ROZJ5X3J.js +311 -0
  225. package/dist/fleet-6RJWIOEO.js +284 -0
  226. package/dist/fleet-WKVBF5SZ.js +942 -0
  227. package/dist/fleet-commands-L6WFT7KZ.js +76 -0
  228. package/dist/fleet-decisions-BTQMWU5A.js +55 -0
  229. package/dist/fleet-graph-553DZ67Q.js +141 -0
  230. package/dist/fleet-inspect-236FZPRB.js +329 -0
  231. package/dist/fleet-new-CKUXP3CO.js +48 -0
  232. package/dist/fleet-preflight-NZQHABWO.js +95 -0
  233. package/dist/fleet-validate-7NLAE26R.js +96 -0
  234. package/dist/fleet-verify-E3RO6A5W.js +226 -0
  235. package/dist/fleet-view-KMZQY7YJ.js +144 -0
  236. package/dist/gui/client/assets/abnfDiagram-VCTEODGH-DPBWQwNn.js +1 -0
  237. package/dist/gui/client/assets/architecture-7GRP2DOG-D1w8FrFW.js +1 -0
  238. package/dist/gui/client/assets/architectureDiagram-5GKGNRK7-CVPgKd1-.js +36 -0
  239. package/dist/gui/client/assets/blockDiagram-I7D4REHJ-BLmnqkK5.js +129 -0
  240. package/dist/gui/client/assets/c4Diagram-7LVT6UL2-4AU9cfM7.js +38 -0
  241. package/dist/gui/client/assets/channel-DwFZ0m8S.js +1 -0
  242. package/dist/gui/client/assets/chunk-4HAMMTFA-EOWkKCav.js +62 -0
  243. package/dist/gui/client/assets/chunk-75Z2AOVW-CygeoIMl.js +2 -0
  244. package/dist/gui/client/assets/chunk-DU6HZSFF-s27fViLb.js +125 -0
  245. package/dist/gui/client/assets/chunk-F27PBJKO-BrHvwLsZ.js +1 -0
  246. package/dist/gui/client/assets/chunk-GMAD6QVW-DzPh-7jt.js +72 -0
  247. package/dist/gui/client/assets/chunk-GVQU2GXP-pIaQkIzm.js +1 -0
  248. package/dist/gui/client/assets/chunk-IMKFNOWR-BGJVE_Br.js +231 -0
  249. package/dist/gui/client/assets/chunk-L3NEJ4N5-B3YLuhww.js +1 -0
  250. package/dist/gui/client/assets/chunk-OSK3NFVY-BRj61HHU.js +10 -0
  251. package/dist/gui/client/assets/chunk-P2QGCYS3-Sno90KxP.js +1 -0
  252. package/dist/gui/client/assets/chunk-POPQ4Y6H-Cw8NTbxr.js +1 -0
  253. package/dist/gui/client/assets/chunk-PWAF6VOD-BIhHgz37.js +1 -0
  254. package/dist/gui/client/assets/chunk-SHT3W25Y-Cqv7npBj.js +168 -0
  255. package/dist/gui/client/assets/chunk-SVP7TREG-Hxzl6Dee.js +88 -0
  256. package/dist/gui/client/assets/chunk-TICWLB2K-CIFVyVP2.js +206 -0
  257. package/dist/gui/client/assets/classDiagram-ZZMXUADV-BJbAiI_w.js +1 -0
  258. package/dist/gui/client/assets/classDiagram-v2-VYDZK3BY-BJbAiI_w.js +1 -0
  259. package/dist/gui/client/assets/cynefin-OW5HDTMX-DecLWZ-y.js +1 -0
  260. package/dist/gui/client/assets/cynefinDiagram-5FMLGOSQ-CK-T2N-D.js +62 -0
  261. package/dist/gui/client/assets/dagre-GXQ25YYZ-C0dfg-OS.js +4 -0
  262. package/dist/gui/client/assets/diagram-S7CK7UJ4-EaJukVh-.js +30 -0
  263. package/dist/gui/client/assets/diagram-UQ7AKVKN-xcOucEtP.js +41 -0
  264. package/dist/gui/client/assets/diagram-VSXAHHWV-3AUJACMf.js +3 -0
  265. package/dist/gui/client/assets/diagram-VX7I27RA-TPknLqam.js +24 -0
  266. package/dist/gui/client/assets/diagram-Z3DM3KII-wa1q3YMF.js +24 -0
  267. package/dist/gui/client/assets/ebnfDiagram-PWID7BFC-JBCF2-s7.js +1 -0
  268. package/dist/gui/client/assets/erDiagram-RLTQ6QDP-CmXjXPc4.js +99 -0
  269. package/dist/gui/client/assets/eventmodeling-NTZA5JFV-D_1aJWYl.js +1 -0
  270. package/dist/gui/client/assets/flowDiagram-HODETNUW-BQtZlael.js +1 -0
  271. package/dist/gui/client/assets/framework-Bq-znqwW.js +9 -0
  272. package/dist/gui/client/assets/ganttDiagram-EL5Y4UJY-IPaL_kaa.js +292 -0
  273. package/dist/gui/client/assets/gitGraph-4MIJSDKK-Oy0Q3hoc.js +1 -0
  274. package/dist/gui/client/assets/gitGraphDiagram-WWUBYQGX-jtAuBmbc.js +106 -0
  275. package/dist/gui/client/assets/index-CuFuBEdL.css +1 -0
  276. package/dist/gui/client/assets/index-hMbEIsX0.js +87 -0
  277. package/dist/gui/client/assets/info-A6RAGUB7-UtEs1tv7.js +1 -0
  278. package/dist/gui/client/assets/infoDiagram-27XIBGKW-hlwR1pBW.js +2 -0
  279. package/dist/gui/client/assets/ishikawaDiagram-5VMMS53U-C6vMtfsd.js +70 -0
  280. package/dist/gui/client/assets/journeyDiagram-3NMN7TZE-EAwAl_PS.js +139 -0
  281. package/dist/gui/client/assets/kanban-definition-UXKFOSKX-CQOhRKHW.js +89 -0
  282. package/dist/gui/client/assets/line-DbcwGZTW.js +1 -0
  283. package/dist/gui/client/assets/mermaid-parser.core-C2QfVcHd.js +7 -0
  284. package/dist/gui/client/assets/mermaid.core-N9qUTre1.js +44 -0
  285. package/dist/gui/client/assets/mindmap-definition-YA3MSWOX-BR_FL9gK.js +96 -0
  286. package/dist/gui/client/assets/packet-AYTQ26CC-CbBJ2oAa.js +1 -0
  287. package/dist/gui/client/assets/pegDiagram-XKGWAZYB-BruU0IHM.js +1 -0
  288. package/dist/gui/client/assets/pie-WAS4IAKB-BWdSng4H.js +1 -0
  289. package/dist/gui/client/assets/pieDiagram-E7YTZNPT-CR3ljgdU.js +39 -0
  290. package/dist/gui/client/assets/quadrantDiagram-AXDQQJYC-C-boKslr.js +7 -0
  291. package/dist/gui/client/assets/radar-RG4KPBEZ-CGlOnAKG.js +1 -0
  292. package/dist/gui/client/assets/railroad-74A4TZTK-CDvuAlyC.js +1 -0
  293. package/dist/gui/client/assets/railroad-abnf-HS5TGJTU-CQUA9crC.js +1 -0
  294. package/dist/gui/client/assets/railroad-ebnf-LZEXJU2U-CD857gxq.js +1 -0
  295. package/dist/gui/client/assets/railroad-peg-WCYAUIDC-DUV4k35E.js +1 -0
  296. package/dist/gui/client/assets/railroadDiagram-O6MQD6OU-DMR4LXmA.js +1 -0
  297. package/dist/gui/client/assets/requirementDiagram-BXWQKSXE-DVltaF6c.js +84 -0
  298. package/dist/gui/client/assets/sankeyDiagram-P5KCCOFB-CHdNz472.js +40 -0
  299. package/dist/gui/client/assets/sequenceDiagram-WJ2MYXX4-DaMafIty.js +162 -0
  300. package/dist/gui/client/assets/stateDiagram-D77RDMKH-CEbBHqn3.js +1 -0
  301. package/dist/gui/client/assets/stateDiagram-v2-MP3YSRHH-B3JgDdFg.js +1 -0
  302. package/dist/gui/client/assets/swimlanes-42K2YHIH-BlPHndnJ.js +1 -0
  303. package/dist/gui/client/assets/swimlanesDiagram-VR7AAH4N-BPabHwsZ.js +8 -0
  304. package/dist/gui/client/assets/timeline-definition-24CTP7MA-E4Y1lPBI.js +120 -0
  305. package/dist/gui/client/assets/treeView-Q6P3EWNA-DrY0uhTN.js +1 -0
  306. package/dist/gui/client/assets/treemap-WGGIJYW6-CVotnLHf.js +1 -0
  307. package/dist/gui/client/assets/vennDiagram-4TSXK5OY-DJNrLIOF.js +34 -0
  308. package/dist/gui/client/assets/wardley-WFR3VGLG-ClOpAp5S.js +1 -0
  309. package/dist/gui/client/assets/wardleyDiagram-VM6X3IG4-qhMoKOXc.js +78 -0
  310. package/dist/gui/client/assets/xychartDiagram-S5SC5T6Z-CTuXoo9R.js +7 -0
  311. package/dist/gui/client/index.html +6 -0
  312. package/dist/gui/ops-worker.js +167 -0
  313. package/dist/gui/reads-worker.js +473 -0
  314. package/dist/gui/server.js +9780 -0
  315. package/dist/gui-QJS7XQMV.js +16 -0
  316. package/dist/init-DV5B6HQG.js +354 -0
  317. package/dist/install-6C45YXFP.js +19 -0
  318. package/dist/install-O7NSRU2W.js +13 -0
  319. package/dist/interactive-OXGYZYAS.js +22381 -0
  320. package/dist/interop-J7UOBOSF.js +254 -0
  321. package/dist/inventory-OEGIL6PY.js +144 -0
  322. package/dist/library-B3UPGY4V.js +83 -0
  323. package/dist/library-MXQA5DLT.js +309 -0
  324. package/dist/library-ROZAMUIL.js +496 -0
  325. package/dist/library-import-2LTWOVBD.js +190 -0
  326. package/dist/library-inventory-LJ3XHLWO.js +60 -0
  327. package/dist/library-validation-DARHHUNW.js +46 -0
  328. package/dist/mcp-2GSPYQ54.js +28 -0
  329. package/dist/memory-J3STUUIK.js +537 -0
  330. package/dist/models-Y3GMFJ2V.js +314 -0
  331. package/dist/monitor-LHNH577J.js +811 -0
  332. package/dist/orchestrator-DTAPXULA.js +12117 -0
  333. package/dist/panes-A743ONZ5.js +103 -0
  334. package/dist/panes-CTNO57ZY.js +76 -0
  335. package/dist/paths-3SBYJQDP.js +68 -0
  336. package/dist/preload-OJBMAIXF.js +140 -0
  337. package/dist/providers-CMETPZNS.js +232 -0
  338. package/dist/registry-37T4U6X2.js +15 -0
  339. package/dist/reset-O7EUCYWO.js +346 -0
  340. package/dist/resources-FY6XYFN2.js +189 -0
  341. package/dist/run-H64MEVTA.js +1067 -0
  342. package/dist/run-script-PQ5NRU3X.js +42 -0
  343. package/dist/settings-SNIQNXCW.js +73 -0
  344. package/dist/settings-controls-X6GMCPVG.js +202 -0
  345. package/dist/share-CAFMMQLM.js +299 -0
  346. package/dist/skills-ERKQUC7L.js +114 -0
  347. package/dist/skills-eval-CQ23MYQK.js +1099 -0
  348. package/dist/skills-inventory-TVUYJDVN.js +142 -0
  349. package/dist/slash-commands-ROG3KIFJ.js +107 -0
  350. package/dist/startup-background-KDWCQMWT.js +247 -0
  351. package/dist/steer-KKYXJSH4.js +77 -0
  352. package/dist/support-M3RCUUEL.js +40 -0
  353. package/dist/system-ZDW44ZGX.js +142 -0
  354. package/dist/target-runtimes-PWA22WVW.js +73 -0
  355. package/dist/targets-AJWA6E7Z.js +1207 -0
  356. package/dist/tasks-6L2JJRC5.js +39 -0
  357. package/dist/terminal-lease-YFUSDPAD.js +432 -0
  358. package/dist/tools-5XJUABRD.js +30 -0
  359. package/dist/trace-LA5MVR4Y.js +527 -0
  360. package/dist/tree-sitter-TQW3Y52T.js +4673 -0
  361. package/dist/tui-primitives-IUCVWLH5.js +19 -0
  362. package/dist/uninstall-SAWGGXAB.js +448 -0
  363. package/dist/upgrade-HSNSVTZG.js +300 -0
  364. package/dist/usage-XSILDHKF.js +1083 -0
  365. package/dist/verifiers-ECA5GIHL.js +633 -0
  366. package/dist/verify-R6QQCCEB.js +31 -0
  367. package/dist/version-PLZYB5KW.js +22 -0
  368. package/dist/web-fetch-PVZNMBOB.js +803 -0
  369. package/dist/wiki-generate-RP22WP5K.js +647 -0
  370. package/dist/with-panes-W3PAZPRF.js +629 -0
  371. package/dist/worker/entry.js +324 -284
  372. package/dist/workspace-check-3764ZKC2.js +83 -0
  373. package/docs/README.md +26 -10
  374. package/docs/architecture/acp.md +179 -12
  375. package/docs/architecture/artifact-placement.md +1 -1
  376. package/docs/architecture/capacity-and-scheduling.md +7 -8
  377. package/docs/architecture/context-engine.md +350 -95
  378. package/docs/architecture/model-catalog.md +18 -11
  379. package/docs/architecture/observability.md +1 -1
  380. package/docs/architecture/pi-boundary.md +59 -6
  381. package/docs/architecture/prompt-envelope-and-tools.md +147 -39
  382. package/docs/architecture/provider-adapter-cookbook.md +2 -2
  383. package/docs/architecture/safety-model.md +18 -4
  384. package/docs/architecture/trace-store.md +2 -2
  385. package/docs/architecture/tui-design.md +41 -81
  386. package/docs/architecture/worker-dispatch-mechanics.md +9 -1
  387. package/docs/gui/README.md +69 -0
  388. package/docs/gui/boundary-doctrine.md +104 -0
  389. package/docs/gui/chat-rendering-spec.md +1440 -0
  390. package/docs/gui/cli-surface-routing.md +148 -0
  391. package/docs/gui/delivery-order.md +53 -0
  392. package/docs/gui/event-bus-coverage.md +103 -0
  393. package/docs/gui/inspector-presentation.md +71 -0
  394. package/docs/gui/parity/01-cli-surface.md +74 -0
  395. package/docs/gui/parity/02-slash-and-surfaces.md +110 -0
  396. package/docs/gui/parity/03-domains-and-plan.md +69 -0
  397. package/docs/gui/performance-baseline.md +76 -0
  398. package/docs/gui/settings-write-surface.md +267 -0
  399. package/docs/gui/workflow-coverage.md +64 -0
  400. package/docs/guide/built-in-agents.md +1 -1
  401. package/docs/guide/commands-and-modes.md +256 -99
  402. package/docs/guide/configuration-and-targets.md +485 -124
  403. package/docs/guide/configuration-reference.md +165 -82
  404. package/docs/guide/doctor.md +127 -0
  405. package/docs/guide/environment-variables.md +1 -1
  406. package/docs/guide/exit-codes-and-output.md +3 -1
  407. package/docs/guide/extensions-and-sharing.md +3 -14
  408. package/docs/guide/fleet-dispatch.md +231 -45
  409. package/docs/guide/glossary.md +1 -1
  410. package/docs/guide/installation-and-lifecycle.md +27 -16
  411. package/docs/guide/interop.md +2 -2
  412. package/docs/guide/proactive-memory.md +154 -68
  413. package/docs/guide/resource-library.md +4 -0
  414. package/docs/guide/skills-marketplace.md +8 -4
  415. package/docs/guide/slurm.md +88 -0
  416. package/docs/guide/tool-usage.md +134 -11
  417. package/docs/guide/troubleshooting.md +4 -2
  418. package/docs/process/battletest-2026-09-20-fixes.md +161 -0
  419. package/docs/process/configure-tree-proposal.md +637 -0
  420. package/docs/process/documentation-coverage.md +8 -0
  421. package/docs/process/documentation-guide.md +18 -1
  422. package/docs/process/eval-runner.md +58 -14
  423. package/docs/process/performance-methodology.md +11 -3
  424. package/docs/process/release-cut-checklist.md +29 -3
  425. package/docs/process/tool-audit-v0.4.9.md +3 -0
  426. package/examples/extensions/README.md +1 -3
  427. package/examples/extensions/lab-status/clio-coder-extension.json +1 -1
  428. package/examples/extensions/measurements/clio-coder-extension.json +1 -1
  429. package/library/registry.yaml +30 -5
  430. package/library/skills/git/fix-issue/SKILL.md +2 -1
  431. package/library/skills/git/fix-issue/plugin.json +1 -1
  432. package/library/skills/git/ship/SKILL.md +2 -1
  433. package/library/skills/git/ship/plugin.json +1 -1
  434. package/library/skills/meta/clio-coder-test/SKILL.md +5 -6
  435. package/library/skills/meta/clio-coder-test/evals.md +2 -2
  436. package/library/skills/meta/clio-coder-test/references/test-map.md +2 -2
  437. package/library/skills/registry.yaml +9 -5
  438. package/library/skills/research/slurm-jobs/SKILL.md +110 -0
  439. package/library/skills/research/slurm-jobs/evals.md +39 -0
  440. package/library/skills/research/slurm-jobs/plugin.json +23 -0
  441. package/library/skills/skill-marketplace.json +18 -2
  442. package/package.json +15 -10
  443. package/src/cli/args.ts +59 -0
  444. package/src/cli/argv.ts +7 -0
  445. package/src/cli/clio.ts +9 -1
  446. package/src/cli/configure-controls.ts +136 -0
  447. package/src/cli/configure-onboarding.ts +24 -7
  448. package/src/cli/configure-quick.ts +32 -7
  449. package/src/cli/configure-target.ts +11 -1
  450. package/src/cli/configure.ts +253 -256
  451. package/src/cli/docs-server.ts +290 -0
  452. package/src/cli/docs.ts +60 -15
  453. package/src/cli/doctor-deep.ts +126 -0
  454. package/src/cli/doctor-hpc.ts +122 -0
  455. package/src/cli/doctor-slurm.ts +130 -0
  456. package/src/cli/doctor-task-worktrees.ts +88 -0
  457. package/src/cli/doctor.ts +165 -16
  458. package/src/cli/fleet-verify.ts +3 -2
  459. package/src/cli/gui.ts +111 -0
  460. package/src/cli/index.ts +14 -4
  461. package/src/cli/library.ts +2 -7
  462. package/src/cli/modes/json-stream.ts +4 -2
  463. package/src/cli/modes/print.ts +252 -25
  464. package/src/cli/run.ts +199 -71
  465. package/src/cli/skills.ts +25 -7
  466. package/src/cli/targets.ts +87 -9
  467. package/src/cli/uninstall.ts +28 -8
  468. package/src/cli/usage.ts +2 -1
  469. package/src/cli/workspace-check.ts +71 -0
  470. package/src/core/bash-exec.ts +8 -2
  471. package/src/core/bus-events.ts +32 -3
  472. package/src/core/cache-telemetry.ts +3 -2
  473. package/src/core/compile-cache.ts +11 -1
  474. package/src/core/config.ts +59 -6
  475. package/src/core/defaults.ts +27 -5
  476. package/src/core/diagnostics.ts +25 -0
  477. package/src/core/event-bus.ts +2 -1
  478. package/src/core/gateway-routing.ts +10 -3
  479. package/src/core/git-commit-attribution.ts +2 -1
  480. package/src/core/naming-compat.ts +6 -4
  481. package/src/core/package-root.ts +0 -9
  482. package/src/core/path-canonical.ts +143 -24
  483. package/src/core/residency-target-key.ts +2 -6
  484. package/src/core/run-overrides.ts +1 -1
  485. package/src/core/settings-awareness.ts +108 -0
  486. package/src/core/settings-controls.ts +673 -0
  487. package/src/core/settings-navigation.ts +116 -0
  488. package/src/core/theme-token-hex.ts +19 -9
  489. package/src/core/turn-constraints.ts +52 -0
  490. package/src/domains/agents/builtins/scout.md +7 -17
  491. package/src/domains/agents/catalog.ts +5 -1
  492. package/src/domains/agents/extension.ts +2 -1
  493. package/src/domains/agents/registry.ts +4 -3
  494. package/src/domains/agents/result-contract.ts +132 -1
  495. package/src/domains/config/classify.ts +11 -7
  496. package/src/domains/config/extension.ts +5 -1
  497. package/src/domains/config/keybindings.ts +2 -2
  498. package/src/domains/context/codewiki/coordinator.ts +10 -0
  499. package/src/domains/context/worker/snapshot.ts +6 -3
  500. package/src/domains/dispatch/active-route-planner.ts +2 -0
  501. package/src/domains/dispatch/agent-candidates.ts +5 -1
  502. package/src/domains/dispatch/capability-match.ts +1 -1
  503. package/src/domains/dispatch/contract.ts +28 -0
  504. package/src/domains/dispatch/event-pump.ts +37 -3
  505. package/src/domains/dispatch/extension.ts +391 -48
  506. package/src/domains/dispatch/failure-classification.ts +37 -2
  507. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  508. package/src/domains/dispatch/run-identity.ts +10 -3
  509. package/src/domains/dispatch/target-breaker.ts +163 -0
  510. package/src/domains/dispatch/types.ts +29 -2
  511. package/src/domains/dispatch/worker-model-loads.ts +66 -0
  512. package/src/domains/dispatch/worker-protocol.ts +20 -1
  513. package/src/domains/dispatch/worker-spawn.ts +28 -2
  514. package/src/domains/eval/artifacts/redact.ts +9 -0
  515. package/src/domains/eval/metrics/noop.ts +61 -0
  516. package/src/domains/eval/reports/junit.ts +5 -1
  517. package/src/domains/eval/reports/text.ts +7 -0
  518. package/src/domains/eval/runners/clio-run.ts +19 -8
  519. package/src/domains/eval/runners/external-command.ts +29 -4
  520. package/src/domains/eval/schema/adapter.ts +6 -2
  521. package/src/domains/eval/schema/suite.ts +2 -0
  522. package/src/domains/eval/schema/validate.ts +3 -0
  523. package/src/domains/eval/suites/run.ts +167 -26
  524. package/src/domains/evidence/detail.ts +3 -2
  525. package/src/domains/extensions/operator-runtime.ts +11 -4
  526. package/src/domains/gateway/mcp/client.ts +1 -1
  527. package/src/domains/lifecycle/doctor.ts +42 -26
  528. package/src/domains/lifecycle/migrations/2026-09-18-ollama-runtime-id.ts +38 -0
  529. package/src/domains/lifecycle/migrations/index.ts +2 -0
  530. package/src/domains/middleware/demo-guidance.ts +36 -0
  531. package/src/domains/middleware/dispatch-nudge.ts +1 -1
  532. package/src/domains/middleware/memory-intervention.ts +51 -4
  533. package/src/domains/middleware/runtime.ts +5 -4
  534. package/src/domains/middleware/skills-reminder.ts +29 -52
  535. package/src/domains/middleware/task-nudge.ts +1 -0
  536. package/src/domains/middleware/watchdog.ts +4 -0
  537. package/src/domains/observability/extension.ts +2 -1
  538. package/src/domains/observability/out-of-turn-usage.ts +3 -2
  539. package/src/domains/observability/projection.ts +3 -2
  540. package/src/domains/observability/worker-progress.ts +48 -0
  541. package/src/domains/prompts/compiler.ts +148 -52
  542. package/src/domains/prompts/contract.ts +3 -3
  543. package/src/domains/prompts/demo-guidance.ts +8 -0
  544. package/src/domains/prompts/extension.ts +12 -7
  545. package/src/domains/prompts/fragments/identity/clio.md +2 -1
  546. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -0
  547. package/src/domains/prompts/fragments/identity/self-awareness.md +4 -0
  548. package/src/domains/prompts/fragments/operating/contract.md +16 -7
  549. package/src/domains/prompts/fragments/operating/delegation.md +29 -13
  550. package/src/domains/prompts/fragments/operating/skills.md +18 -10
  551. package/src/domains/prompts/fragments/operating/worker.md +2 -0
  552. package/src/domains/providers/cache-deployment.ts +45 -2
  553. package/src/domains/providers/contract.ts +52 -11
  554. package/src/domains/providers/extension.ts +230 -53
  555. package/src/domains/providers/model-discovery.ts +22 -8
  556. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +5 -7
  557. package/src/domains/providers/plugins.ts +3 -4
  558. package/src/domains/providers/probe/fingerprint.ts +2 -2
  559. package/src/domains/providers/probe/reasoning.ts +9 -16
  560. package/src/domains/providers/probe/tool-call.ts +236 -0
  561. package/src/domains/providers/registry.ts +51 -8
  562. package/src/domains/providers/runtime-resolution.ts +60 -12
  563. package/src/domains/providers/runtimes/boot-manifest.ts +1 -1
  564. package/src/domains/providers/runtimes/builtins.ts +2 -2
  565. package/src/domains/providers/runtimes/common/lmstudio-http.ts +57 -41
  566. package/src/domains/providers/runtimes/common/local-synth.ts +3 -1
  567. package/src/domains/providers/runtimes/common/ollama-model-ids.ts +11 -0
  568. package/src/domains/providers/runtimes/common/probe-helpers.ts +53 -0
  569. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +3 -1
  570. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +7 -13
  571. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +7 -17
  572. package/src/domains/providers/runtimes/local-native/llamacpp.ts +1 -0
  573. package/src/domains/providers/runtimes/local-native/ollama.ts +211 -0
  574. package/src/domains/providers/runtimes/protocol/litellm.ts +77 -65
  575. package/src/domains/providers/support.ts +1 -1
  576. package/src/domains/providers/types/local-model-quirks.ts +2 -3
  577. package/src/domains/providers/types/runtime-descriptor.ts +23 -3
  578. package/src/domains/providers/types/target-descriptor.ts +15 -3
  579. package/src/domains/resources/collision.ts +7 -2
  580. package/src/domains/resources/index.ts +1 -0
  581. package/src/domains/resources/library-actions.ts +4 -2
  582. package/src/domains/resources/library-inventory.ts +6 -2
  583. package/src/domains/resources/prompts/loader.ts +20 -7
  584. package/src/domains/resources/skills/availability.ts +56 -0
  585. package/src/domains/resources/skills/loader.ts +20 -9
  586. package/src/domains/safety/action-classifier.ts +282 -31
  587. package/src/domains/safety/audit.ts +2 -1
  588. package/src/domains/safety/autonomy.ts +54 -11
  589. package/src/domains/safety/decision-presentation.ts +17 -4
  590. package/src/domains/safety/finish-contract-registration.ts +25 -1
  591. package/src/domains/safety/finish-contract.ts +20 -5
  592. package/src/domains/safety/path-policy.ts +6 -2
  593. package/src/domains/safety/policy-engine.ts +168 -48
  594. package/src/domains/safety/protected-artifacts.ts +527 -16
  595. package/src/domains/safety/read-scope.ts +120 -0
  596. package/src/domains/safety/skill-authority.ts +52 -16
  597. package/src/domains/scheduling/cluster.ts +14 -3
  598. package/src/domains/scheduling/contract.ts +7 -0
  599. package/src/domains/scheduling/extension.ts +20 -9
  600. package/src/domains/scheduling/local-capacity.ts +160 -0
  601. package/src/domains/session/context-accounting.ts +44 -31
  602. package/src/domains/session/context-ledger.ts +10 -3
  603. package/src/domains/session/entries.ts +4 -0
  604. package/src/domains/session/history.ts +1 -1
  605. package/src/domains/session/prompt-cache.ts +1 -0
  606. package/src/domains/session/prompt-manifest.ts +3 -1
  607. package/src/domains/session/retry.ts +4 -6
  608. package/src/domains/session/task-board.ts +19 -4
  609. package/src/domains/session/tree/preview.ts +3 -2
  610. package/src/engine/acp/commands.ts +653 -0
  611. package/src/engine/acp/server.ts +639 -20
  612. package/src/engine/acp/tool-mediator.ts +30 -7
  613. package/src/engine/acp/types.ts +58 -0
  614. package/src/engine/agent.ts +55 -10
  615. package/src/engine/ai.ts +11 -2
  616. package/src/engine/api-registry.ts +5 -4
  617. package/src/engine/apis/degraded-inference.ts +243 -0
  618. package/src/engine/apis/llamacpp-residency.ts +50 -6
  619. package/src/engine/apis/lmstudio-residency.ts +3 -5
  620. package/src/engine/apis/lmstudio.ts +137 -31
  621. package/src/engine/apis/ollama-http.ts +118 -0
  622. package/src/engine/apis/ollama-native.ts +216 -97
  623. package/src/engine/apis/openai-completions.ts +191 -189
  624. package/src/engine/apis/output-budget.ts +3 -1
  625. package/src/engine/apis/residency-lock.ts +2 -1
  626. package/src/engine/apis/residency.ts +339 -89
  627. package/src/engine/apis/sampling-overrides.ts +23 -2
  628. package/src/engine/apis/types.ts +1 -2
  629. package/src/engine/claude/tool-safety.ts +30 -5
  630. package/src/engine/context.ts +13 -0
  631. package/src/engine/env-api-keys.ts +2 -1
  632. package/src/engine/gemma-channel-filter.ts +3 -2
  633. package/src/engine/instrumented-tui.ts +25 -0
  634. package/src/engine/loop-guard.ts +172 -6
  635. package/src/engine/pi-mono-names.ts +16 -0
  636. package/src/engine/prewarm.ts +44 -15
  637. package/src/engine/provider-payload.ts +52 -14
  638. package/src/engine/session.ts +4 -2
  639. package/src/engine/worker-events.ts +9 -1
  640. package/src/engine/worker-runtime.ts +269 -42
  641. package/src/engine/worker-tools.ts +8 -3
  642. package/src/entry/boot-options.ts +23 -0
  643. package/src/entry/orchestrator.ts +207 -36
  644. package/src/interactive/assistant-generation-timing.ts +52 -0
  645. package/src/interactive/chat-loop-messages.ts +4 -1
  646. package/src/interactive/chat-loop.ts +59 -9
  647. package/src/interactive/chat-panel.ts +10 -1
  648. package/src/interactive/clio-editor.ts +51 -79
  649. package/src/interactive/context-meter.ts +1 -0
  650. package/src/interactive/context-overlay.ts +21 -8
  651. package/src/interactive/cost-overlay.ts +1 -1
  652. package/src/interactive/dispatch-board.ts +39 -8
  653. package/src/interactive/editor-bash.ts +0 -34
  654. package/src/interactive/editor-rails.ts +43 -0
  655. package/src/interactive/editor-submit.ts +34 -2
  656. package/src/interactive/footer/dashboard.ts +67 -38
  657. package/src/interactive/footer/demo-hints.ts +40 -0
  658. package/src/interactive/footer/key-hints.ts +21 -0
  659. package/src/interactive/footer/notifications.ts +1 -1
  660. package/src/interactive/footer/pages.ts +486 -0
  661. package/src/interactive/footer/system-metrics.ts +147 -0
  662. package/src/interactive/footer/widgets.ts +158 -63
  663. package/src/interactive/footer-panel.ts +29 -7
  664. package/src/interactive/interactive-application.ts +109 -21
  665. package/src/interactive/interactive-event-projection.ts +6 -2
  666. package/src/interactive/interactive-presentation.ts +25 -29
  667. package/src/interactive/interactive-slash-runtime.ts +32 -18
  668. package/src/interactive/interactive-subscriptions.ts +25 -5
  669. package/src/interactive/interactive-tickers.ts +21 -5
  670. package/src/interactive/keybinding-manager.ts +9 -0
  671. package/src/interactive/overlay-frame.ts +29 -7
  672. package/src/interactive/overlay-lifecycle.ts +5 -3
  673. package/src/interactive/overlay-model-selectors.ts +4 -0
  674. package/src/interactive/overlay-permission-lifecycle.ts +6 -5
  675. package/src/interactive/overlays/ask-user.ts +103 -110
  676. package/src/interactive/overlays/help-reference.ts +1 -0
  677. package/src/interactive/overlays/message-picker.ts +3 -29
  678. package/src/interactive/overlays/session-selector.ts +3 -2
  679. package/src/interactive/overlays/settings-sections.ts +2 -30
  680. package/src/interactive/overlays/settings.ts +310 -607
  681. package/src/interactive/permission-hint.ts +3 -3
  682. package/src/interactive/permission-overlay.ts +45 -27
  683. package/src/interactive/renderers/doctor-report.ts +43 -0
  684. package/src/interactive/renderers/tool-execution.ts +87 -62
  685. package/src/interactive/renderers/worker-entry.ts +76 -3
  686. package/src/interactive/side-question.ts +3 -1
  687. package/src/interactive/slash-commands.ts +78 -23
  688. package/src/interactive/startup-background.ts +131 -0
  689. package/src/interactive/startup-diagnostics.ts +16 -0
  690. package/src/interactive/status/state-machine.ts +16 -3
  691. package/src/interactive/status/types.ts +2 -0
  692. package/src/interactive/status/verbs.ts +1 -1
  693. package/src/interactive/terminal-lease.ts +26 -22
  694. package/src/interactive/theme/components.ts +1 -1
  695. package/src/interactive/theme/rules.ts +1 -1
  696. package/src/interactive/theme/tokens.ts +16 -10
  697. package/src/interactive/transcript-detail.ts +4 -0
  698. package/src/interactive/turn-context.ts +56 -20
  699. package/src/interactive/turn-middleware.ts +57 -9
  700. package/src/interactive/turn-prewarm.ts +121 -18
  701. package/src/interactive/turn-recovery.ts +10 -8
  702. package/src/interactive/turn-runtime.ts +74 -29
  703. package/src/interactive/turn-state.ts +3 -0
  704. package/src/interactive/welcome-art.ts +36 -0
  705. package/src/interactive/welcome-dashboard.ts +209 -49
  706. package/src/interactive/worker-replay.ts +4 -0
  707. package/src/interactive/worker-stream.ts +17 -2
  708. package/src/tools/agent-tools.ts +22 -1
  709. package/src/tools/builtin-tool-catalog.ts +2 -2
  710. package/src/tools/codewiki/code-nav.ts +1 -1
  711. package/src/tools/codewiki/shared.ts +39 -1
  712. package/src/tools/compete-worktrees.ts +8 -91
  713. package/src/tools/context/docs-engine.ts +44 -12
  714. package/src/tools/context/index.ts +126 -22
  715. package/src/tools/context/library.ts +1 -1
  716. package/src/tools/context/surface.ts +12 -7
  717. package/src/tools/core-bootstrap.ts +3 -0
  718. package/src/tools/dispatch-runner.ts +18 -0
  719. package/src/tools/dispatch-schema.ts +187 -206
  720. package/src/tools/edit.ts +46 -42
  721. package/src/tools/file-mutation-queue.ts +25 -26
  722. package/src/tools/gateway/clio-context-surface.ts +1 -1
  723. package/src/tools/gateway/index.ts +7 -3
  724. package/src/tools/gateway/mcp-capabilities.ts +5 -3
  725. package/src/tools/grep.ts +14 -2
  726. package/src/tools/ls.ts +1 -4
  727. package/src/tools/monitor.ts +14 -1
  728. package/src/tools/observation.ts +1 -3
  729. package/src/tools/path-utils.ts +51 -18
  730. package/src/tools/process-lease.ts +99 -0
  731. package/src/tools/read.ts +1 -1
  732. package/src/tools/registry.ts +71 -9
  733. package/src/tools/task-worktree.ts +296 -17
  734. package/src/tools/tasks.ts +29 -7
  735. package/src/tools/worker-evidence.ts +60 -1
  736. package/src/tools/worktree-root.ts +252 -0
  737. package/src/tools/write.ts +34 -30
  738. package/src/worker/entry.ts +18 -1
  739. package/src/worker/protocol.ts +54 -1
  740. package/src/worker/spec-contract.ts +22 -2
  741. package/dist/acp-ZWZCPS2A.js +0 -130
  742. package/dist/agents-LYSOWZUE.js +0 -150
  743. package/dist/auth-WBQGKWQ5.js +0 -551
  744. package/dist/background-BUMOBAQN.js +0 -37
  745. package/dist/builtins-ODRJOEDI.js +0 -22
  746. package/dist/chunk-2DRRZ57Q.js +0 -571
  747. package/dist/chunk-2JBZYUPY.js +0 -105
  748. package/dist/chunk-2VBWFXYE.js +0 -198
  749. package/dist/chunk-2X2R3UTH.js +0 -1018
  750. package/dist/chunk-32KJPXAM.js +0 -75
  751. package/dist/chunk-37LW32LZ.js +0 -32
  752. package/dist/chunk-3A3CUMKA.js +0 -54
  753. package/dist/chunk-3AND2EFU.js +0 -215
  754. package/dist/chunk-3RDHGNU7.js +0 -647
  755. package/dist/chunk-3SUDBGEI.js +0 -1323
  756. package/dist/chunk-3TQN67I2.js +0 -396
  757. package/dist/chunk-3U4BL2EV.js +0 -103
  758. package/dist/chunk-3UQADNG2.js +0 -302
  759. package/dist/chunk-434LRQ6Z.js +0 -13441
  760. package/dist/chunk-4ATBOFRP.js +0 -7802
  761. package/dist/chunk-4DNL43EZ.js +0 -139
  762. package/dist/chunk-4HFJKRGZ.js +0 -5250
  763. package/dist/chunk-555E2WVV.js +0 -322
  764. package/dist/chunk-5GZICIYO.js +0 -462
  765. package/dist/chunk-5PHVPU4G.js +0 -160
  766. package/dist/chunk-5RTEFNBP.js +0 -197
  767. package/dist/chunk-64XJW7NT.js +0 -380
  768. package/dist/chunk-6TKOFFGE.js +0 -1058
  769. package/dist/chunk-6UJ7RDI7.js +0 -1143
  770. package/dist/chunk-7FBCRWVT.js +0 -1801
  771. package/dist/chunk-7JSOSVLP.js +0 -283
  772. package/dist/chunk-7N3OLLSL.js +0 -637
  773. package/dist/chunk-7QQRPB2E.js +0 -915
  774. package/dist/chunk-A6DULIMH.js +0 -986
  775. package/dist/chunk-AB3QXXBC.js +0 -123
  776. package/dist/chunk-ACCECAH4.js +0 -49
  777. package/dist/chunk-AM6CEP2K.js +0 -2120
  778. package/dist/chunk-AUHVBIDW.js +0 -19
  779. package/dist/chunk-AY4XE6GN.js +0 -665
  780. package/dist/chunk-BBA2TAWV.js +0 -667
  781. package/dist/chunk-BFPHMSK7.js +0 -169
  782. package/dist/chunk-BMNVVKEW.js +0 -604
  783. package/dist/chunk-CKK25WN3.js +0 -72
  784. package/dist/chunk-CTGZCEI6.js +0 -33
  785. package/dist/chunk-DIAJYJYG.js +0 -446
  786. package/dist/chunk-DVNAPPXU.js +0 -27
  787. package/dist/chunk-DXVMLM3Z.js +0 -92
  788. package/dist/chunk-E3LEPLQ2.js +0 -68
  789. package/dist/chunk-EHZRAB4U.js +0 -63
  790. package/dist/chunk-EM2DIQAJ.js +0 -179
  791. package/dist/chunk-EM2WNQS2.js +0 -93
  792. package/dist/chunk-ETF4ROKH.js +0 -595
  793. package/dist/chunk-F2YM3JY4.js +0 -22513
  794. package/dist/chunk-FEBQWHJT.js +0 -1023
  795. package/dist/chunk-FPS4R2RN.js +0 -1975
  796. package/dist/chunk-GD55RTIW.js +0 -33
  797. package/dist/chunk-GJDRMBDI.js +0 -573
  798. package/dist/chunk-GREYLTZ5.js +0 -658
  799. package/dist/chunk-H2WSCZZT.js +0 -238
  800. package/dist/chunk-H6IUCY6Q.js +0 -117
  801. package/dist/chunk-H72DCH3E.js +0 -563
  802. package/dist/chunk-H7TXJR23.js +0 -705
  803. package/dist/chunk-HBJQQTKM.js +0 -40
  804. package/dist/chunk-HCVKSGNZ.js +0 -990
  805. package/dist/chunk-HVCAY2FH.js +0 -67
  806. package/dist/chunk-I47EJPYL.js +0 -1377
  807. package/dist/chunk-IALGWTLO.js +0 -36
  808. package/dist/chunk-IALZJE37.js +0 -1710
  809. package/dist/chunk-IC7JXLOM.js +0 -1577
  810. package/dist/chunk-IOSVTTCD.js +0 -108
  811. package/dist/chunk-IPTPMLA6.js +0 -475
  812. package/dist/chunk-IZZI3SKQ.js +0 -128
  813. package/dist/chunk-JABWPKFY.js +0 -27
  814. package/dist/chunk-JIYWMQZ5.js +0 -175
  815. package/dist/chunk-JKU34ACI.js +0 -693
  816. package/dist/chunk-JOBN2YQQ.js +0 -176
  817. package/dist/chunk-JOL2QRLE.js +0 -152
  818. package/dist/chunk-JTR3VSV3.js +0 -44
  819. package/dist/chunk-JU6MAMRJ.js +0 -362
  820. package/dist/chunk-JURMQWVJ.js +0 -15
  821. package/dist/chunk-K2BLQC5E.js +0 -262
  822. package/dist/chunk-K3XN4LZ4.js +0 -402
  823. package/dist/chunk-KIVFXGBM.js +0 -688
  824. package/dist/chunk-KKRXONXG.js +0 -43
  825. package/dist/chunk-KOAHT3N2.js +0 -395
  826. package/dist/chunk-KP5BPXR3.js +0 -73
  827. package/dist/chunk-KQ6IDQIB.js +0 -39
  828. package/dist/chunk-KRJQG47M.js +0 -1289
  829. package/dist/chunk-KW6OJ7IY.js +0 -221
  830. package/dist/chunk-L3NBWLSN.js +0 -314
  831. package/dist/chunk-L4RUTLRL.js +0 -59
  832. package/dist/chunk-LGTVWPRN.js +0 -47
  833. package/dist/chunk-LSQW6KZO.js +0 -200
  834. package/dist/chunk-LTR5QCLS.js +0 -446
  835. package/dist/chunk-LWJYOHT3.js +0 -165
  836. package/dist/chunk-M6YLF66Z.js +0 -2687
  837. package/dist/chunk-MJ4QEJVT.js +0 -185
  838. package/dist/chunk-MO65K5CH.js +0 -1148
  839. package/dist/chunk-MTOZEQHL.js +0 -637
  840. package/dist/chunk-MZDPF35R.js +0 -45
  841. package/dist/chunk-MZKYVIWW.js +0 -188
  842. package/dist/chunk-NBPA5QM6.js +0 -386
  843. package/dist/chunk-NMBEW4PP.js +0 -688
  844. package/dist/chunk-NPLLK3HO.js +0 -3610
  845. package/dist/chunk-NSYGPIVW.js +0 -39
  846. package/dist/chunk-NXTV5OI5.js +0 -1020
  847. package/dist/chunk-NYDG4QP4.js +0 -689
  848. package/dist/chunk-OA2GDACN.js +0 -146
  849. package/dist/chunk-PJI57EC6.js +0 -236
  850. package/dist/chunk-PJJBUGMR.js +0 -4484
  851. package/dist/chunk-PNJE7JPS.js +0 -50
  852. package/dist/chunk-PP23PZEV.js +0 -1347
  853. package/dist/chunk-PPIFDSBK.js +0 -409
  854. package/dist/chunk-PTFISXQO.js +0 -319
  855. package/dist/chunk-QB33Z5S7.js +0 -1865
  856. package/dist/chunk-QGNII5VC.js +0 -110
  857. package/dist/chunk-QH3ZTUOA.js +0 -113
  858. package/dist/chunk-QI72X67S.js +0 -481
  859. package/dist/chunk-QJMRYTCX.js +0 -56
  860. package/dist/chunk-QKHZZFKH.js +0 -98
  861. package/dist/chunk-RDKX2PME.js +0 -66
  862. package/dist/chunk-RL7LJYN4.js +0 -66
  863. package/dist/chunk-RPMNIFRY.js +0 -65
  864. package/dist/chunk-RQROVOV3.js +0 -670
  865. package/dist/chunk-S34A7BSP.js +0 -97
  866. package/dist/chunk-SJETVJHX.js +0 -119
  867. package/dist/chunk-SJMNU4ZS.js +0 -634
  868. package/dist/chunk-SL2RDHKO.js +0 -19
  869. package/dist/chunk-SLLG2G44.js +0 -85
  870. package/dist/chunk-SQAZN2V3.js +0 -2744
  871. package/dist/chunk-SQBT46OF.js +0 -814
  872. package/dist/chunk-SRCEQKQS.js +0 -165
  873. package/dist/chunk-TCUOGIL2.js +0 -52
  874. package/dist/chunk-TIWPKCVO.js +0 -42
  875. package/dist/chunk-U44YYLVV.js +0 -1529
  876. package/dist/chunk-UIU7MGZ3.js +0 -486
  877. package/dist/chunk-USBBEKHW.js +0 -177
  878. package/dist/chunk-VHKTOLEW.js +0 -1416
  879. package/dist/chunk-VPWGADBG.js +0 -3151
  880. package/dist/chunk-VQD7NH7Z.js +0 -356
  881. package/dist/chunk-VWFCAK34.js +0 -697
  882. package/dist/chunk-W5RM7YAH.js +0 -78
  883. package/dist/chunk-W72LLZAV.js +0 -243
  884. package/dist/chunk-WGRDABW7.js +0 -207
  885. package/dist/chunk-WWRV5RJI.js +0 -165
  886. package/dist/chunk-XCUDZQLX.js +0 -195
  887. package/dist/chunk-XFLSL7BT.js +0 -386
  888. package/dist/chunk-XJZEDCNT.js +0 -391
  889. package/dist/chunk-XLLEL3K7.js +0 -709
  890. package/dist/chunk-XNZWWDC3.js +0 -686
  891. package/dist/chunk-XRECG65F.js +0 -308
  892. package/dist/chunk-XTQ7MEJG.js +0 -457
  893. package/dist/chunk-XW2UZICE.js +0 -372
  894. package/dist/chunk-Y3M2T5RO.js +0 -891
  895. package/dist/chunk-YGDMBK7O.js +0 -567
  896. package/dist/chunk-YJCCMYYT.js +0 -125
  897. package/dist/chunk-YPQOPFP7.js +0 -797
  898. package/dist/chunk-YQYINEJI.js +0 -132
  899. package/dist/chunk-ZF6CV4WZ.js +0 -5614
  900. package/dist/chunk-ZKJU55MX.js +0 -326
  901. package/dist/chunk-ZKQ63XZ5.js +0 -1196
  902. package/dist/chunk-ZKVMDNAN.js +0 -962
  903. package/dist/chunk-ZST3FRCV.js +0 -132
  904. package/dist/clio-JUDCLNHC.js +0 -26
  905. package/dist/clio-context-tools-FT672MNZ.js +0 -136
  906. package/dist/code-nav-7OVCTP2Z.js +0 -688
  907. package/dist/compile-cache-WJEPUZEJ.js +0 -16
  908. package/dist/components-OZXZMDWU.js +0 -674
  909. package/dist/config-P3ZQVF63.js +0 -275
  910. package/dist/config-graph-GKAOBAS5.js +0 -160
  911. package/dist/configure-25LRYZJG.js +0 -86
  912. package/dist/context-72VQV7JX.js +0 -73
  913. package/dist/context-COWRWXP3.js +0 -286
  914. package/dist/context-WB3D474G.js +0 -344
  915. package/dist/context-clear-Y4LYMWC6.js +0 -192
  916. package/dist/context-index-W6A4V7OC.js +0 -120
  917. package/dist/context-map-DKL3QT6D.js +0 -555
  918. package/dist/context-working-set-TMZYVC7A.js +0 -1560
  919. package/dist/data-tool-KMBWKKWR.js +0 -2987
  920. package/dist/detail-4GLROGY5.js +0 -123
  921. package/dist/dispatch-runner-TR3LBP5P.js +0 -2446
  922. package/dist/docs-ZK777W2G.js +0 -101
  923. package/dist/doctor-WC4OV2OB.js +0 -814
  924. package/dist/eval-FUNWJNUJ.js +0 -5050
  925. package/dist/eval-inventory-CX24K2JT.js +0 -260
  926. package/dist/evals-L73EBHSU.js +0 -104
  927. package/dist/evidence-AVJ2RTHX.js +0 -392
  928. package/dist/evidence-P4NZOAK7.js +0 -233
  929. package/dist/evidence-Y55WKYHH.js +0 -246
  930. package/dist/evolve-MAWKRYWF.js +0 -617
  931. package/dist/extensions-PYQH3H47.js +0 -308
  932. package/dist/fleet-M4H2QBWT.js +0 -268
  933. package/dist/fleet-ULBXXRDR.js +0 -923
  934. package/dist/fleet-commands-7NNC4JZU.js +0 -76
  935. package/dist/fleet-decisions-EHEY7KPU.js +0 -52
  936. package/dist/fleet-graph-LQ2AHZT3.js +0 -136
  937. package/dist/fleet-inspect-5IGBIIYZ.js +0 -312
  938. package/dist/fleet-new-RCKGSRDV.js +0 -48
  939. package/dist/fleet-preflight-UTTNOKMG.js +0 -27
  940. package/dist/fleet-validate-YGILJKA6.js +0 -91
  941. package/dist/fleet-verify-AUWTCDKR.js +0 -210
  942. package/dist/fleet-view-TGUFCY5A.js +0 -127
  943. package/dist/init-GFN2Z7NF.js +0 -333
  944. package/dist/install-3RZDDP23.js +0 -13
  945. package/dist/install-6PIF6F6W.js +0 -19
  946. package/dist/interop-EF5JUWWK.js +0 -246
  947. package/dist/inventory-I6VJDDYF.js +0 -127
  948. package/dist/library-3J5IO2OJ.js +0 -75
  949. package/dist/library-IJTOFTDS.js +0 -307
  950. package/dist/library-Z3KZSHPE.js +0 -492
  951. package/dist/library-import-IMKFLDHX.js +0 -183
  952. package/dist/library-inventory-CQP5D6GU.js +0 -56
  953. package/dist/library-validation-33UTX7AI.js +0 -42
  954. package/dist/mcp-5FWZKUS6.js +0 -26
  955. package/dist/memory-36CWN67Y.js +0 -520
  956. package/dist/models-KQ6PQJJQ.js +0 -302
  957. package/dist/monitor-XX6ZD6KC.js +0 -785
  958. package/dist/orchestrator-SK6HDAOP.js +0 -42067
  959. package/dist/panes-L27QRXUH.js +0 -74
  960. package/dist/panes-LXZIWNOZ.js +0 -103
  961. package/dist/paths-7DJDU4P4.js +0 -67
  962. package/dist/preload-K2TDYI4Y.js +0 -124
  963. package/dist/registry-DESGAXWK.js +0 -11
  964. package/dist/reset-73VU3XNT.js +0 -345
  965. package/dist/resources-3BYJYVYL.js +0 -181
  966. package/dist/run-AR7PY6GW.js +0 -896
  967. package/dist/run-script-H2KUDIII.js +0 -41
  968. package/dist/settings-3VMBMWID.js +0 -72
  969. package/dist/share-HVWH4FPF.js +0 -293
  970. package/dist/skills-5TYEY75Q.js +0 -100
  971. package/dist/skills-eval-CK3MD63Z.js +0 -1083
  972. package/dist/skills-inventory-KSFYG3I6.js +0 -138
  973. package/dist/slash-commands-DMVHML7P.js +0 -98
  974. package/dist/steer-XCD6V3EW.js +0 -77
  975. package/dist/support-JAZL6VBR.js +0 -38
  976. package/dist/system-3TDQRMZZ.js +0 -116
  977. package/dist/targets-EZKHAYRN.js +0 -1117
  978. package/dist/tasks-SNEFHWYW.js +0 -36
  979. package/dist/terminal-lease-BNLFA4OF.js +0 -419
  980. package/dist/tools-7IM6BDCE.js +0 -28
  981. package/dist/trace-C3MBGD4S.js +0 -524
  982. package/dist/tree-sitter-AQUUOSYM.js +0 -4673
  983. package/dist/tui-primitives-36BY2774.js +0 -18
  984. package/dist/uninstall-WWLOSZ42.js +0 -432
  985. package/dist/upgrade-ETK2JNSJ.js +0 -297
  986. package/dist/usage-S2HOB7BZ.js +0 -1065
  987. package/dist/verifiers-QDTEVH7R.js +0 -632
  988. package/dist/verify-SUKUK6XM.js +0 -31
  989. package/dist/version-RFPKO6T7.js +0 -21
  990. package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +0 -1
  991. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +0 -1
  992. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +0 -36
  993. package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +0 -129
  994. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +0 -38
  995. package/dist/web/client/assets/channel-c4EeUUqA.js +0 -1
  996. package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +0 -62
  997. package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +0 -2
  998. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +0 -125
  999. package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +0 -1
  1000. package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +0 -72
  1001. package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +0 -1
  1002. package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +0 -231
  1003. package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +0 -1
  1004. package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +0 -10
  1005. package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +0 -1
  1006. package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +0 -1
  1007. package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +0 -1
  1008. package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +0 -168
  1009. package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +0 -88
  1010. package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +0 -206
  1011. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +0 -1
  1012. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +0 -1
  1013. package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +0 -1
  1014. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +0 -62
  1015. package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +0 -4
  1016. package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +0 -30
  1017. package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +0 -41
  1018. package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +0 -3
  1019. package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +0 -24
  1020. package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +0 -24
  1021. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +0 -1
  1022. package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +0 -99
  1023. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +0 -1
  1024. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +0 -1
  1025. package/dist/web/client/assets/framework-YGoR34M4.js +0 -9
  1026. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +0 -292
  1027. package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +0 -1
  1028. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +0 -106
  1029. package/dist/web/client/assets/index-CVcy0FAn.js +0 -75
  1030. package/dist/web/client/assets/index-Dsi52apB.css +0 -1
  1031. package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +0 -1
  1032. package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +0 -2
  1033. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +0 -70
  1034. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +0 -139
  1035. package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +0 -89
  1036. package/dist/web/client/assets/line-BIDAcEtX.js +0 -1
  1037. package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +0 -7
  1038. package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +0 -44
  1039. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +0 -96
  1040. package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +0 -1
  1041. package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +0 -1
  1042. package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +0 -1
  1043. package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +0 -39
  1044. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +0 -7
  1045. package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +0 -1
  1046. package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +0 -1
  1047. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +0 -1
  1048. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +0 -1
  1049. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +0 -1
  1050. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +0 -1
  1051. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +0 -84
  1052. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +0 -40
  1053. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +0 -162
  1054. package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +0 -1
  1055. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +0 -1
  1056. package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +0 -1
  1057. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +0 -8
  1058. package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +0 -120
  1059. package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +0 -1
  1060. package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +0 -1
  1061. package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +0 -34
  1062. package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +0 -1
  1063. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +0 -78
  1064. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +0 -7
  1065. package/dist/web/client/index.html +0 -6
  1066. package/dist/web/ops-worker.js +0 -37
  1067. package/dist/web/reads-worker.js +0 -1726
  1068. package/dist/web/server.js +0 -8499
  1069. package/dist/web-EMGUGGEI.js +0 -13
  1070. package/dist/web-fetch-6BRRVQON.js +0 -805
  1071. package/dist/wiki-generate-XHSJTDOP.js +0 -627
  1072. package/dist/with-panes-Z6BTEHMZ.js +0 -628
  1073. package/evals/README.md +0 -9
  1074. package/evals/behavioral-corpus-grader.mjs +0 -236
  1075. package/evals/behavioral-machinery-baseline.json +0 -2276
  1076. package/evals/behavioral-machinery-driver.ts +0 -250
  1077. package/evals/behavioral-machinery-support.ts +0 -254
  1078. package/evals/behavioral-machinery.yaml +0 -614
  1079. package/evals/behavioral-model-negative-control.yaml +0 -69
  1080. package/evals/behavioral-model.yaml +0 -482
  1081. package/evals/fixtures/behavioral-facts.txt +0 -3
  1082. package/evals/fixtures/behavioral-main.ts +0 -7
  1083. package/evals/fixtures/decoy/note.txt +0 -2
  1084. package/evals/fixtures/docs-retrieval.json +0 -102
  1085. package/evals/fixtures/private/credentials.txt +0 -1
  1086. package/evals/fixtures/scalar-decision.json +0 -17
  1087. package/evals/fixtures/scout-citation-pipeline.json +0 -55
  1088. package/evals/fixtures/source-explanation.json +0 -74
  1089. package/evals/fixtures/tool-arguments.json +0 -18
  1090. package/evals/fixtures/tool-surface/read.txt +0 -4
  1091. package/evals/fixtures/tool-surface/subdir/keep.txt +0 -1
  1092. package/evals/no-edit-memory-grader.mjs +0 -149
  1093. package/evals/scalar-decision-grader.py +0 -41
  1094. package/evals/scalar-decision-machinery.ts +0 -145
  1095. package/evals/source-explanation-grader.mjs +0 -118
  1096. package/evals/tool-surface-grader.mjs +0 -53
  1097. package/evals/tool-surface-model.yaml +0 -274
  1098. package/evals/tracked-metrics-baseline.yaml +0 -229
  1099. package/evals/tracked-metrics-grader.mjs +0 -129
  1100. package/src/cli/web.ts +0 -79
  1101. package/src/domains/providers/runtimes/local-native/ollama-native.ts +0 -122
  1102. /package/dist/assets/{web-notices → gui-notices}/@hono__node-server-LICENSE +0 -0
  1103. /package/dist/assets/{web-notices → gui-notices}/hono-LICENSE +0 -0
  1104. /package/dist/{web → gui}/client/THIRD_PARTY_LICENSES.md +0 -0
  1105. /package/dist/{web → gui}/client/assets/arc-Pry-7G1_.js +0 -0
  1106. /package/dist/{web → gui}/client/assets/array-BifhSqXX.js +0 -0
  1107. /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  1108. /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  1109. /package/dist/{web → gui}/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +0 -0
  1110. /package/dist/{web → gui}/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +0 -0
  1111. /package/dist/{web → gui}/client/assets/chunk-FOHPRMQF-CoA4358r.js +0 -0
  1112. /package/dist/{web → gui}/client/assets/chunk-JWPE2WC7-DVXcaiue.js +0 -0
  1113. /package/dist/{web → gui}/client/assets/chunk-XXDRQBXY-DqAYeljN.js +0 -0
  1114. /package/dist/{web → gui}/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +0 -0
  1115. /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  1116. /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  1117. /package/dist/{web → gui}/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +0 -0
  1118. /package/dist/{web → gui}/client/assets/cytoscape.esm-c2aL46s-.js +0 -0
  1119. /package/dist/{web → gui}/client/assets/dagre-C-rnJpZF.js +0 -0
  1120. /package/dist/{web → gui}/client/assets/defaultLocale-BFoDCU3G.js +0 -0
  1121. /package/dist/{web → gui}/client/assets/dist-v5Q1xZ2K.js +0 -0
  1122. /package/dist/{web → gui}/client/assets/graphlib-DS17s2tU.js +0 -0
  1123. /package/dist/{web → gui}/client/assets/init-C-OQMol4.js +0 -0
  1124. /package/dist/{web → gui}/client/assets/katex-ZlcWpGUi.js +0 -0
  1125. /package/dist/{web → gui}/client/assets/linear-SzVmGSw4.js +0 -0
  1126. /package/dist/{web → gui}/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  1127. /package/dist/{web → gui}/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  1128. /package/dist/{web → gui}/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  1129. /package/dist/{web → gui}/client/assets/ordinal-BDEzSJ7C.js +0 -0
  1130. /package/dist/{web → gui}/client/assets/path-fybaL0A-.js +0 -0
  1131. /package/dist/{web → gui}/client/assets/prism-bash-D6zCJ74D.js +0 -0
  1132. /package/dist/{web → gui}/client/assets/prism-c-04YixN25.js +0 -0
  1133. /package/dist/{web → gui}/client/assets/prism-clike-DapgWyxx.js +0 -0
  1134. /package/dist/{web → gui}/client/assets/prism-core-BtsZdCS6.js +0 -0
  1135. /package/dist/{web → gui}/client/assets/prism-cpp-C-lJbC-6.js +0 -0
  1136. /package/dist/{web → gui}/client/assets/prism-css-CPgOzxXp.js +0 -0
  1137. /package/dist/{web → gui}/client/assets/prism-diff-BF8m0_mq.js +0 -0
  1138. /package/dist/{web → gui}/client/assets/prism-docker-DkT6yOFj.js +0 -0
  1139. /package/dist/{web → gui}/client/assets/prism-fortran-Be5x3y1V.js +0 -0
  1140. /package/dist/{web → gui}/client/assets/prism-go-C_8qAH5n.js +0 -0
  1141. /package/dist/{web → gui}/client/assets/prism-ini-BESK3y0r.js +0 -0
  1142. /package/dist/{web → gui}/client/assets/prism-javascript-BnO-swvr.js +0 -0
  1143. /package/dist/{web → gui}/client/assets/prism-json-Dp_-W-Hv.js +0 -0
  1144. /package/dist/{web → gui}/client/assets/prism-jsx-D-D0NWtC.js +0 -0
  1145. /package/dist/{web → gui}/client/assets/prism-julia-DIjOgiAV.js +0 -0
  1146. /package/dist/{web → gui}/client/assets/prism-latex-DNMbqcH_.js +0 -0
  1147. /package/dist/{web → gui}/client/assets/prism-makefile-CRKWLQ8l.js +0 -0
  1148. /package/dist/{web → gui}/client/assets/prism-markdown-C0FPJ1Iz.js +0 -0
  1149. /package/dist/{web → gui}/client/assets/prism-markup-Cp04rIa1.js +0 -0
  1150. /package/dist/{web → gui}/client/assets/prism-matlab-D-nk08al.js +0 -0
  1151. /package/dist/{web → gui}/client/assets/prism-python-CfiSVtM6.js +0 -0
  1152. /package/dist/{web → gui}/client/assets/prism-r-QmNGR8LX.js +0 -0
  1153. /package/dist/{web → gui}/client/assets/prism-rust-Bu9N8X3N.js +0 -0
  1154. /package/dist/{web → gui}/client/assets/prism-shell-session-Be4UuYoM.js +0 -0
  1155. /package/dist/{web → gui}/client/assets/prism-sql-CYhVDMEE.js +0 -0
  1156. /package/dist/{web → gui}/client/assets/prism-toml-DKb54GAT.js +0 -0
  1157. /package/dist/{web → gui}/client/assets/prism-tsx-p6J2Kc_4.js +0 -0
  1158. /package/dist/{web → gui}/client/assets/prism-typescript-BMqONzxf.js +0 -0
  1159. /package/dist/{web → gui}/client/assets/prism-yaml-C0JHu8gr.js +0 -0
  1160. /package/dist/{web → gui}/client/assets/purify.es-ChwZkWde.js +0 -0
  1161. /package/dist/{web → gui}/client/assets/rolldown-runtime-hePW80VL.js +0 -0
  1162. /package/dist/{web → gui}/client/assets/rough.esm-Dy-Kn_BL.js +0 -0
  1163. /package/dist/{web → gui}/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -0
  1164. /package/dist/{web → gui}/client/assets/src-B6xuSHsQ.js +0 -0
  1165. /package/dist/{web → gui}/client/clio-coder-logo.webp +0 -0
  1166. /package/dist/{web → gui}/client/icon-192.png +0 -0
  1167. /package/dist/{web → gui}/client/icon-512.png +0 -0
  1168. /package/dist/{web → gui}/client/manifest.webmanifest +0 -0
  1169. /package/dist/{web → gui}/client/offline.css +0 -0
  1170. /package/dist/{web → gui}/client/offline.html +0 -0
  1171. /package/dist/{web → gui}/client/offline.js +0 -0
  1172. /package/dist/{web → gui}/client/sw.js +0 -0
@@ -0,0 +1,3710 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ catalogThinkingLevelsForRuntime,
4
+ listCatalogModelsForRuntime,
5
+ mergeCapabilities,
6
+ synthesizeCatalogBackedModel
7
+ } from "./chunk-27YTM2CV.js";
8
+ import {
9
+ THINKING_LEVELS
10
+ } from "./chunk-QZTTRSJE.js";
11
+ import {
12
+ runCommandVector
13
+ } from "./chunk-M2IPMWCN.js";
14
+ import {
15
+ writeDiagnostic
16
+ } from "./chunk-FD2I4KBR.js";
17
+ import {
18
+ init_esm_shims
19
+ } from "./chunk-ECBHH7LU.js";
20
+
21
+ // src/domains/providers/runtimes/builtins.ts
22
+ init_esm_shims();
23
+
24
+ // src/domains/providers/runtimes/antigravity/antigravity-code.ts
25
+ init_esm_shims();
26
+
27
+ // src/core/external-diagnostic.ts
28
+ init_esm_shims();
29
+ var REDACTED = "[redacted]";
30
+ function redactExternalDiagnostic(input) {
31
+ return input.replace(/\b(?:authorization|proxy-authorization)\s*:\s*[^\r\n]+/giu, `Authorization: ${REDACTED}`).replace(/\b(?:set-cookie|cookie)\s*:\s*[^\r\n]+/giu, `Cookie: ${REDACTED}`).replace(/\bbearer\s+[A-Za-z0-9._~+/-]+=*/giu, `Bearer ${REDACTED}`).replace(
32
+ /\b(?:api[_-]?key|access[_-]?token|refresh[_-]?token|token|secret|password)\s*[:=]\s*[^\s,;]+/giu,
33
+ (match) => {
34
+ const separator = match.includes(":") ? ":" : "=";
35
+ return `${match.slice(0, match.indexOf(separator)).trim()}${separator}${REDACTED}`;
36
+ }
37
+ ).replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/gu, REDACTED).replace(
38
+ /(?:~|\/[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*)\/\.(?:gemini\/antigravity-cli|antigravitycli)(?:\/[^\s]*)?/gu,
39
+ "[redacted credential path]"
40
+ ).replace(/https?:\/\/[^\s"'<>]+/giu, (url2) => {
41
+ try {
42
+ const parsed = new URL(url2);
43
+ if (/(?:auth|oauth|login|signin|callback)/iu.test(parsed.pathname)) return "[redacted authorization URL]";
44
+ parsed.username = "";
45
+ parsed.password = "";
46
+ parsed.search = "";
47
+ parsed.hash = "";
48
+ return parsed.toString();
49
+ } catch {
50
+ return REDACTED;
51
+ }
52
+ });
53
+ }
54
+ function boundedExternalDiagnostic(input, maxBytes = 8192) {
55
+ const redacted = redactExternalDiagnostic(input).trim();
56
+ const bytes = Buffer.from(redacted, "utf8");
57
+ if (bytes.byteLength <= maxBytes) return redacted;
58
+ return `${bytes.subarray(0, Math.max(0, maxBytes - 32)).toString("utf8")}
59
+ [diagnostic truncated]`;
60
+ }
61
+
62
+ // src/domains/providers/runtimes/antigravity/antigravity-code.ts
63
+ var ANTIGRAVITY_AUTH_NOTICE = "Experimental local delegation through your installed Antigravity (`agy`) CLI. Clio neither signs in nor stores or inspects Antigravity credentials. Run `agy` yourself and complete sign-in before probing this target.";
64
+ var ANTIGRAVITY_MODELS = [
65
+ "gemini-3.8-flash-high",
66
+ "gemini-3.8-flash-medium",
67
+ "gemini-3.8-flash-low",
68
+ "gemini-3.1-pro-high",
69
+ "gemini-3.1-pro-low"
70
+ ];
71
+ var antigravityCapabilities = {
72
+ chat: true,
73
+ tools: false,
74
+ reasoning: false,
75
+ vision: false,
76
+ audio: false,
77
+ embeddings: false,
78
+ rerank: false,
79
+ fim: false,
80
+ contextWindow: 0,
81
+ maxTokens: 0
82
+ };
83
+ var ANTIGRAVITY_MAX_CATALOG_BYTES = 1024 * 1024;
84
+ var ANTIGRAVITY_MAX_DISCOVERED_MODELS = 4096;
85
+ var MAX_MODEL_ID_CHARS = 1024;
86
+ var MAX_MODEL_LABEL_CHARS = 1024;
87
+ var AntigravityCatalogError = class extends Error {
88
+ kind;
89
+ constructor(kind, message) {
90
+ super(message);
91
+ this.name = "AntigravityCatalogError";
92
+ this.kind = kind;
93
+ }
94
+ };
95
+ function record(value) {
96
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
97
+ }
98
+ function parseAntigravityModelCatalogDetails(output) {
99
+ let decoded;
100
+ try {
101
+ decoded = JSON.parse(output);
102
+ } catch {
103
+ throw new AntigravityCatalogError(
104
+ "unsupported-feature",
105
+ "agy returned an unreadable model catalog; update the Antigravity CLI and retry"
106
+ );
107
+ }
108
+ const envelope = record(decoded);
109
+ const command = record(envelope?.command);
110
+ const data = record(command?.data);
111
+ if (envelope?.status !== "SUCCESS") {
112
+ const detail = boundedExternalDiagnostic(
113
+ typeof envelope?.error === "string" ? envelope.error : typeof command?.error === "string" ? command.error : "agy could not list models"
114
+ );
115
+ const kind = classifyAntigravityDiagnostic(detail);
116
+ throw new AntigravityCatalogError(kind, antigravityProbeMessage(kind, detail));
117
+ }
118
+ if (command?.name !== "models" || !Array.isArray(data?.models)) {
119
+ throw new AntigravityCatalogError(
120
+ "unsupported-feature",
121
+ "agy returned an unsupported model catalog; update the Antigravity CLI and retry"
122
+ );
123
+ }
124
+ if (data.models.length === 0) {
125
+ throw new AntigravityCatalogError(
126
+ "catalog-unavailable",
127
+ "agy returned no available models; run `agy` locally and verify the signed-in account has model access"
128
+ );
129
+ }
130
+ if (data.models.length > ANTIGRAVITY_MAX_DISCOVERED_MODELS) {
131
+ throw new AntigravityCatalogError(
132
+ "catalog-unavailable",
133
+ `agy returned more than ${ANTIGRAVITY_MAX_DISCOVERED_MODELS} models; the authoritative catalog was refused rather than truncated`
134
+ );
135
+ }
136
+ const models = [];
137
+ const labels = {};
138
+ const seen = /* @__PURE__ */ new Set();
139
+ for (const value of data.models) {
140
+ const model = record(value);
141
+ const id = typeof model?.id === "string" ? model.id.trim() : "";
142
+ const label = typeof model?.label === "string" ? model.label.trim() : "";
143
+ if (id.length === 0 || id.length > MAX_MODEL_ID_CHARS || /[\r\n\0]/u.test(id)) {
144
+ throw new AntigravityCatalogError("catalog-unavailable", "agy returned an invalid model identifier");
145
+ }
146
+ if (label.length === 0 || label.length > MAX_MODEL_LABEL_CHARS || /[\r\n\0]/u.test(label)) {
147
+ throw new AntigravityCatalogError("catalog-unavailable", `agy returned an invalid label for model '${id}'`);
148
+ }
149
+ if (seen.has(id)) {
150
+ if (labels[id] !== label) {
151
+ throw new AntigravityCatalogError(
152
+ "catalog-unavailable",
153
+ `agy returned conflicting labels for duplicate model '${id}'`
154
+ );
155
+ }
156
+ continue;
157
+ }
158
+ seen.add(id);
159
+ models.push(id);
160
+ labels[id] = label;
161
+ }
162
+ return { models, labels };
163
+ }
164
+ function classifyAntigravityDiagnostic(detail) {
165
+ if (/(?:enoent|not found|cannot find|could not start|spawn .*agy)/iu.test(detail)) return "missing";
166
+ if (/(?:sign[ -]?in|log[ -]?in|unauthori[sz]ed|authenticat|credential|account.*required)/iu.test(detail)) {
167
+ return "authentication";
168
+ }
169
+ if (/(?:unknown|unsupported|unrecognized|invalid) (?:option|argument|command)|output-format|models command/iu.test(detail)) {
170
+ return "unsupported-feature";
171
+ }
172
+ return "generic";
173
+ }
174
+ function antigravityProbeMessage(kind, detail) {
175
+ const safeDetail = boundedExternalDiagnostic(detail || "no diagnostic was provided");
176
+ switch (kind) {
177
+ case "missing":
178
+ return "Antigravity CLI is not installed or `agy` is not on PATH";
179
+ case "authentication":
180
+ return `Antigravity sign-in is required; run \`agy\` yourself and complete sign-in (${safeDetail})`;
181
+ case "unsupported-feature":
182
+ return `the installed Antigravity CLI does not expose the required structured model catalog; update \`agy\` (${safeDetail})`;
183
+ case "catalog-unavailable":
184
+ return safeDetail;
185
+ case "cancelled":
186
+ return "Antigravity model discovery was cancelled";
187
+ default:
188
+ return `Antigravity model discovery failed: ${safeDetail}`;
189
+ }
190
+ }
191
+ async function probeAntigravityModelCatalog(ctx, runner = runCommandVector) {
192
+ const result = await runner("agy", ["--output-format", "json", "models"], {
193
+ cwd: process.cwd(),
194
+ workspaceRoot: process.cwd(),
195
+ timeoutMs: Math.max(1, ctx.httpTimeoutMs),
196
+ maxOutputBytes: ANTIGRAVITY_MAX_CATALOG_BYTES,
197
+ ...ctx.signal ? { signal: ctx.signal } : {}
198
+ });
199
+ if (result.aborted || result.timedOut) {
200
+ return {
201
+ ok: false,
202
+ latencyMs: result.durationMs,
203
+ failureKind: "cancelled",
204
+ error: antigravityProbeMessage("cancelled", "")
205
+ };
206
+ }
207
+ if (result.outputCapped) {
208
+ return {
209
+ ok: false,
210
+ latencyMs: result.durationMs,
211
+ failureKind: "catalog-unavailable",
212
+ error: `agy model catalog exceeded ${ANTIGRAVITY_MAX_CATALOG_BYTES} bytes`
213
+ };
214
+ }
215
+ if (result.exitCode !== 0) {
216
+ const detail = boundedExternalDiagnostic(result.stderr || result.stdout || `agy exited ${String(result.exitCode)}`);
217
+ const kind = classifyAntigravityDiagnostic(detail);
218
+ return { ok: false, latencyMs: result.durationMs, failureKind: kind, error: antigravityProbeMessage(kind, detail) };
219
+ }
220
+ try {
221
+ const catalog = parseAntigravityModelCatalogDetails(result.stdout);
222
+ return {
223
+ ok: true,
224
+ latencyMs: result.durationMs,
225
+ models: catalog.models,
226
+ modelLabels: catalog.labels
227
+ };
228
+ } catch (cause) {
229
+ const kind = cause instanceof AntigravityCatalogError ? cause.kind : "generic";
230
+ const detail = cause instanceof Error ? cause.message : String(cause);
231
+ return { ok: false, latencyMs: result.durationMs, failureKind: kind, error: boundedExternalDiagnostic(detail) };
232
+ }
233
+ }
234
+ var antigravityCodeRuntime = {
235
+ id: "antigravity-code",
236
+ displayName: "Antigravity CLI \u2014 experimental local delegation",
237
+ kind: "subprocess",
238
+ tier: "subscription",
239
+ apiFamily: "external-agent-subprocess",
240
+ auth: "none",
241
+ authNotice: ANTIGRAVITY_AUTH_NOTICE,
242
+ knownModels: [...ANTIGRAVITY_MODELS],
243
+ binaryName: "agy",
244
+ headlessCommand: "agy --input-format stream-json --output-format stream-json",
245
+ outputParser: "antigravity-stream-json",
246
+ defaultCapabilities: antigravityCapabilities,
247
+ externalAgentLoop: {
248
+ tools: "externally-governed-unobserved",
249
+ network: "externally-governed-unobserved",
250
+ budget: "external-one-shot",
251
+ generatingRetry: "forbidden",
252
+ modelCatalog: "live-authoritative"
253
+ },
254
+ async probe(_target, ctx) {
255
+ try {
256
+ return await probeAntigravityModelCatalog(ctx);
257
+ } catch (cause) {
258
+ const detail = boundedExternalDiagnostic(cause instanceof Error ? cause.message : String(cause));
259
+ const kind = classifyAntigravityDiagnostic(detail);
260
+ return { ok: false, failureKind: kind, error: antigravityProbeMessage(kind, detail) };
261
+ }
262
+ },
263
+ synthesizeModel(target, wireModelId, kb) {
264
+ return synthesizeCatalogBackedModel({
265
+ target,
266
+ wireModelId,
267
+ kb,
268
+ defaultCapabilities: antigravityCapabilities,
269
+ runtimeId: "antigravity-code",
270
+ api: "external-agent-subprocess",
271
+ provider: "antigravity",
272
+ defaultBaseUrl: "external-agent://antigravity/local"
273
+ });
274
+ }
275
+ };
276
+ var antigravity_code_default = antigravityCodeRuntime;
277
+
278
+ // src/domains/providers/runtimes/claude/claude-code.ts
279
+ init_esm_shims();
280
+
281
+ // src/domains/providers/runtimes/claude/common.ts
282
+ init_esm_shims();
283
+ var CLAUDE_CODE_AUTH_NOTICE = "Uses your existing Claude Code login from the installed `claude` command. Clio stores no Claude Code credentials.";
284
+ var CLAUDE_CODE_MODELS = [
285
+ "sonnet",
286
+ "opus",
287
+ "haiku",
288
+ "claude-sonnet-4-5",
289
+ "claude-opus-4-5",
290
+ "claude-haiku-4-5",
291
+ "claude-3-7-sonnet-latest"
292
+ ];
293
+ var claudeCodeCapabilities = {
294
+ chat: true,
295
+ tools: true,
296
+ toolCallFormat: "anthropic",
297
+ reasoning: true,
298
+ thinkingFormat: "anthropic-extended",
299
+ vision: true,
300
+ audio: false,
301
+ embeddings: false,
302
+ rerank: false,
303
+ fim: false,
304
+ contextWindow: 2e5,
305
+ maxTokens: 8192
306
+ };
307
+ function synthesizeClaudeDelegatedModel(input) {
308
+ return synthesizeCatalogBackedModel({
309
+ target: input.target,
310
+ wireModelId: input.wireModelId,
311
+ kb: input.kb,
312
+ defaultCapabilities: input.defaultCapabilities,
313
+ runtimeId: input.runtimeId,
314
+ api: input.apiFamily,
315
+ provider: "anthropic",
316
+ defaultBaseUrl: "claude-code://local"
317
+ });
318
+ }
319
+
320
+ // src/domains/providers/runtimes/claude/claude-code.ts
321
+ var claudeCodeRuntime = {
322
+ id: "claude-code",
323
+ displayName: "Claude Code CLI",
324
+ kind: "subprocess",
325
+ tier: "subscription",
326
+ apiFamily: "claude-code-subprocess",
327
+ auth: "claude-cli",
328
+ authNotice: CLAUDE_CODE_AUTH_NOTICE,
329
+ knownModels: [...CLAUDE_CODE_MODELS],
330
+ binaryName: "claude",
331
+ headlessCommand: "claude -p --output-format stream-json",
332
+ outputParser: "claude-code-stream-json",
333
+ defaultCapabilities: claudeCodeCapabilities,
334
+ // The Claude CLI runs its own tool loop. Clio observes only the stream, so a
335
+ // declared per-tool budget is recorded as external-one-shot, never enforced.
336
+ externalAgentLoop: {
337
+ tools: "externally-governed-unobserved",
338
+ network: "externally-governed-unobserved",
339
+ budget: "external-one-shot",
340
+ generatingRetry: "allowed",
341
+ modelCatalog: "static"
342
+ },
343
+ synthesizeModel(target, wireModelId, kb) {
344
+ return synthesizeClaudeDelegatedModel({
345
+ target,
346
+ wireModelId,
347
+ kb,
348
+ defaultCapabilities: claudeCodeCapabilities,
349
+ runtimeId: "claude-code",
350
+ apiFamily: "claude-code-subprocess"
351
+ });
352
+ }
353
+ };
354
+ var claude_code_default = claudeCodeRuntime;
355
+
356
+ // src/domains/providers/runtimes/claude/claude-sdk.ts
357
+ init_esm_shims();
358
+ var claudeSdkRuntime = {
359
+ id: "claude-sdk",
360
+ displayName: "Claude Agent SDK",
361
+ kind: "sdk",
362
+ tier: "subscription",
363
+ apiFamily: "claude-agent-sdk",
364
+ auth: "claude-cli",
365
+ authNotice: CLAUDE_CODE_AUTH_NOTICE,
366
+ knownModels: [...CLAUDE_CODE_MODELS],
367
+ binaryName: "claude",
368
+ headlessCommand: "@anthropic-ai/claude-agent-sdk query()",
369
+ outputParser: "claude-agent-sdk-messages",
370
+ defaultCapabilities: claudeCodeCapabilities,
371
+ synthesizeModel(target, wireModelId, kb) {
372
+ return synthesizeClaudeDelegatedModel({
373
+ target,
374
+ wireModelId,
375
+ kb,
376
+ defaultCapabilities: claudeCodeCapabilities,
377
+ runtimeId: "claude-sdk",
378
+ apiFamily: "claude-agent-sdk"
379
+ });
380
+ }
381
+ };
382
+ var claude_sdk_default = claudeSdkRuntime;
383
+
384
+ // src/domains/providers/runtimes/cloud/alcf.ts
385
+ init_esm_shims();
386
+
387
+ // src/domains/providers/probe/http.ts
388
+ init_esm_shims();
389
+ import { performance } from "node:perf_hooks";
390
+ async function probeHttp(opts) {
391
+ return runProbe(opts, false);
392
+ }
393
+ async function probeJson(opts) {
394
+ return runProbe(opts, true);
395
+ }
396
+ async function runProbe(opts, readJson) {
397
+ const controller = new AbortController();
398
+ let abortError;
399
+ const abort = (error) => {
400
+ if (controller.signal.aborted) return;
401
+ abortError = error;
402
+ controller.abort();
403
+ };
404
+ const timer = setTimeout(() => abort(`timeout after ${opts.timeoutMs}ms`), opts.timeoutMs);
405
+ const onExternalAbort = () => abort("aborted by caller");
406
+ if (opts.signal?.aborted) onExternalAbort();
407
+ else opts.signal?.addEventListener("abort", onExternalAbort, { once: true });
408
+ const method = opts.method ?? "GET";
409
+ const init = { method, signal: controller.signal };
410
+ if (opts.headers) init.headers = opts.headers;
411
+ if (opts.body !== void 0) init.body = opts.body;
412
+ const started = performance.now();
413
+ let latencyMs;
414
+ let parsingJson = false;
415
+ try {
416
+ const response = await fetch(opts.url, init);
417
+ latencyMs = Math.round(performance.now() - started);
418
+ const ok = response.ok || method === "HEAD" && response.status === 405;
419
+ if (!ok || !readJson) {
420
+ await response.body?.cancel();
421
+ controller.signal.throwIfAborted();
422
+ return ok ? { ok: true, latencyMs, status: response.status } : { ok: false, latencyMs, status: response.status, error: `HTTP ${response.status}: ${response.statusText}` };
423
+ }
424
+ parsingJson = true;
425
+ const data = await response.json();
426
+ controller.signal.throwIfAborted();
427
+ return { ok: true, latencyMs, status: response.status, data };
428
+ } catch (err) {
429
+ return {
430
+ ok: false,
431
+ latencyMs: latencyMs ?? Math.round(performance.now() - started),
432
+ error: abortError ?? `${parsingJson ? "JSON parse: " : ""}${describeError(err)}`
433
+ };
434
+ } finally {
435
+ clearTimeout(timer);
436
+ opts.signal?.removeEventListener("abort", onExternalAbort);
437
+ }
438
+ }
439
+ function describeError(err) {
440
+ if (!(err instanceof Error)) return String(err);
441
+ const cause = err.cause;
442
+ if (cause instanceof Error && cause.message.length > 0) {
443
+ const code = cause.code;
444
+ return typeof code === "string" && !cause.message.includes(code) ? `${cause.message} (${code})` : cause.message;
445
+ }
446
+ return err.message;
447
+ }
448
+
449
+ // src/domains/providers/runtimes/common/local-synth.ts
450
+ init_esm_shims();
451
+
452
+ // src/domains/providers/types/local-model-quirks.ts
453
+ init_esm_shims();
454
+
455
+ // src/domains/providers/types/capability-flags.ts
456
+ init_esm_shims();
457
+
458
+ // src/domains/providers/model-family.ts
459
+ init_esm_shims();
460
+ function normalizeModelIdForFamily(modelId) {
461
+ return (modelId ?? "").trim().toLowerCase().replace(/_/g, "-");
462
+ }
463
+ function isHarmonyModelId(modelId) {
464
+ return normalizeModelIdForFamily(modelId).includes("gpt-oss");
465
+ }
466
+ function inferLocalModelFamily(modelId) {
467
+ const normalized = normalizeModelIdForFamily(modelId);
468
+ if (normalized.length === 0) return "unknown";
469
+ if (normalized.includes("gpt-oss")) return "openai-gpt-oss";
470
+ if (normalized.includes("nemotron-cascade-2") || normalized.includes("nemotron-cascade2")) {
471
+ return "nemotron-cascade-2";
472
+ }
473
+ if (normalized.includes("nemotron-3-nano-omni") || normalized.includes("nemotron-nano-omni")) {
474
+ return "nemotron-3-nano-omni";
475
+ }
476
+ if (normalized.includes("qwen3")) return "qwen3";
477
+ if (normalized.includes("gemma-4") || normalized.includes("gemma4") || normalized.includes("gemopus")) {
478
+ return "gemma-4";
479
+ }
480
+ return "unknown";
481
+ }
482
+
483
+ // src/domains/providers/types/capability-flags.ts
484
+ var EMPTY_CAPABILITIES = {
485
+ chat: false,
486
+ tools: false,
487
+ reasoning: false,
488
+ vision: false,
489
+ audio: false,
490
+ embeddings: false,
491
+ rerank: false,
492
+ fim: false,
493
+ contextWindow: 0,
494
+ maxTokens: 0
495
+ };
496
+ var VALID_THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
497
+ var THINKING_LEVELS_WITHOUT_XHIGH = ["off", "minimal", "low", "medium", "high"];
498
+ var THINKING_LEVELS_OPENAI_5_1_MINI = ["off", "minimal", "low", "medium", "high"];
499
+ var THINKING_LEVELS_OPENAI_5_2_PLUS = [
500
+ "off",
501
+ "minimal",
502
+ "low",
503
+ "medium",
504
+ "high",
505
+ "xhigh"
506
+ ];
507
+ var THINKING_LEVELS_OPENAI_5_6 = [...THINKING_LEVELS_OPENAI_5_2_PLUS, "max"];
508
+ var THINKING_LEVELS_HARMONY = ["low", "medium", "high"];
509
+ function normalizeModelId(modelId) {
510
+ if (!modelId) return void 0;
511
+ const trimmed = modelId.trim();
512
+ if (trimmed.length === 0) return void 0;
513
+ return trimmed.includes("/") ? trimmed.split("/").pop() ?? trimmed : trimmed;
514
+ }
515
+ function availableOpenAICodexThinkingLevels(modelId) {
516
+ const normalized = normalizeModelId(modelId);
517
+ if (!normalized) return VALID_THINKING_LEVELS;
518
+ if (normalized === "gpt-5.1-codex-mini") return THINKING_LEVELS_OPENAI_5_1_MINI;
519
+ if (normalized.startsWith("gpt-5.2") || normalized.startsWith("gpt-5.3") || normalized.startsWith("gpt-5.4") || normalized.startsWith("gpt-5.5")) {
520
+ return THINKING_LEVELS_OPENAI_5_2_PLUS;
521
+ }
522
+ if (normalized.startsWith("gpt-5.6")) {
523
+ return THINKING_LEVELS_OPENAI_5_6;
524
+ }
525
+ return THINKING_LEVELS_WITHOUT_XHIGH;
526
+ }
527
+ function availableThinkingLevels(caps, options) {
528
+ if (!caps.reasoning) return ["off"];
529
+ if (caps.thinkingFormat === "harmony" || isHarmonyModelId(options?.modelId)) {
530
+ return THINKING_LEVELS_HARMONY;
531
+ }
532
+ const catalogLevels = options?.runtimeId && options.modelId ? catalogThinkingLevelsForRuntime(options.runtimeId, options.modelId) : void 0;
533
+ if (catalogLevels) {
534
+ if (!catalogLevels.includes("xhigh")) return catalogLevels.filter((level) => level !== "max");
535
+ return catalogLevels;
536
+ }
537
+ if (caps.thinkingFormat === "openai-codex" || options?.runtimeId === "openai-codex") {
538
+ return availableOpenAICodexThinkingLevels(options?.modelId);
539
+ }
540
+ if (caps.thinkingFormat === "anthropic-extended") {
541
+ return THINKING_LEVELS_WITHOUT_XHIGH;
542
+ }
543
+ return THINKING_LEVELS_WITHOUT_XHIGH;
544
+ }
545
+
546
+ // src/domains/providers/types/local-model-quirks.ts
547
+ function isRecord(value) {
548
+ return value !== null && typeof value === "object" && !Array.isArray(value);
549
+ }
550
+ function asPositive(value) {
551
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : void 0;
552
+ }
553
+ function asInteger(value) {
554
+ const n = asPositive(value);
555
+ return n !== void 0 && Number.isInteger(n) ? n : void 0;
556
+ }
557
+ function asPenalty(value) {
558
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
559
+ }
560
+ function extractSamplingProfile(raw) {
561
+ if (!isRecord(raw)) return void 0;
562
+ const out = {};
563
+ const temperature = asPositive(raw.temperature);
564
+ if (temperature !== void 0) out.temperature = temperature;
565
+ const topP = asPositive(raw.topP);
566
+ if (topP !== void 0) out.topP = topP;
567
+ const topK = asInteger(raw.topK);
568
+ if (topK !== void 0) out.topK = topK;
569
+ const minP = asPositive(raw.minP);
570
+ if (minP !== void 0) out.minP = minP;
571
+ const rp = asPenalty(raw.repeatPenalty) ?? asPenalty(raw.repetitionPenalty);
572
+ if (rp !== void 0) out.repeatPenalty = rp;
573
+ const pp = asPenalty(raw.presencePenalty);
574
+ if (pp !== void 0) out.presencePenalty = pp;
575
+ const fp = asPenalty(raw.frequencyPenalty);
576
+ if (fp !== void 0) out.frequencyPenalty = fp;
577
+ return Object.keys(out).length > 0 ? out : void 0;
578
+ }
579
+ function extractSampling(raw) {
580
+ if (!isRecord(raw)) return void 0;
581
+ const out = {};
582
+ const thinking = extractSamplingProfile(raw.thinking);
583
+ if (thinking) out.thinking = thinking;
584
+ const instruct = extractSamplingProfile(raw.instruct);
585
+ if (instruct) out.instruct = instruct;
586
+ return Object.keys(out).length > 0 ? out : void 0;
587
+ }
588
+ var THINKING_MECHANISMS = [
589
+ "effort-levels",
590
+ "budget-tokens",
591
+ "on-off",
592
+ "always-on",
593
+ "none"
594
+ ];
595
+ function asThinkingMechanism(value) {
596
+ if (typeof value !== "string") return void 0;
597
+ return THINKING_MECHANISMS.includes(value) ? value : void 0;
598
+ }
599
+ function extractBudgetByLevel(raw) {
600
+ if (!isRecord(raw)) return void 0;
601
+ const out = {};
602
+ const minimal = asInteger(raw.minimal);
603
+ if (minimal !== void 0) out.minimal = minimal;
604
+ const low = asInteger(raw.low);
605
+ if (low !== void 0) out.low = low;
606
+ const medium = asInteger(raw.medium);
607
+ if (medium !== void 0) out.medium = medium;
608
+ const high = asInteger(raw.high);
609
+ if (high !== void 0) out.high = high;
610
+ const xhigh = asInteger(raw.xhigh);
611
+ if (xhigh !== void 0) out.xhigh = xhigh;
612
+ return Object.keys(out).length > 0 ? out : void 0;
613
+ }
614
+ function extractEffortByLevel(raw) {
615
+ if (!isRecord(raw)) return void 0;
616
+ const out = {};
617
+ if (typeof raw.off === "string" && raw.off.length > 0) out.off = raw.off;
618
+ if (typeof raw.minimal === "string" && raw.minimal.length > 0) out.minimal = raw.minimal;
619
+ if (typeof raw.low === "string" && raw.low.length > 0) out.low = raw.low;
620
+ if (typeof raw.medium === "string" && raw.medium.length > 0) out.medium = raw.medium;
621
+ if (typeof raw.high === "string" && raw.high.length > 0) out.high = raw.high;
622
+ if (typeof raw.xhigh === "string" && raw.xhigh.length > 0) out.xhigh = raw.xhigh;
623
+ return Object.keys(out).length > 0 ? out : void 0;
624
+ }
625
+ function extractChatTemplateKwargs(raw) {
626
+ if (!isRecord(raw)) return void 0;
627
+ const out = {};
628
+ if (isRecord(raw.static)) {
629
+ const staticMap = {};
630
+ for (const [k, v] of Object.entries(raw.static)) {
631
+ if (typeof v === "boolean") {
632
+ staticMap[k] = v;
633
+ } else if (typeof v === "number" && Number.isFinite(v)) {
634
+ staticMap[k] = v;
635
+ } else if (typeof v === "string" && v.length > 0) {
636
+ staticMap[k] = v;
637
+ }
638
+ }
639
+ if (Object.keys(staticMap).length > 0) out.static = staticMap;
640
+ }
641
+ if (isRecord(raw.byLevel)) {
642
+ const byLevelRaw = raw.byLevel;
643
+ if (typeof byLevelRaw.key === "string" && byLevelRaw.key.trim().length > 0 && isRecord(byLevelRaw.values)) {
644
+ const values = {};
645
+ for (const level of VALID_THINKING_LEVELS) {
646
+ const val = byLevelRaw.values[level];
647
+ if (typeof val === "string" && val.length > 0) {
648
+ values[level] = val;
649
+ } else if (typeof val === "number" && Number.isFinite(val)) {
650
+ values[level] = val;
651
+ }
652
+ }
653
+ if (Object.keys(values).length > 0) {
654
+ const byLevel = {
655
+ key: byLevelRaw.key.trim(),
656
+ values
657
+ };
658
+ if (typeof byLevelRaw.lmstudio === "string" && byLevelRaw.lmstudio.trim().length > 0) {
659
+ byLevel.lmstudio = byLevelRaw.lmstudio.trim();
660
+ }
661
+ out.byLevel = byLevel;
662
+ }
663
+ }
664
+ }
665
+ if (typeof raw.lmstudio === "string" && raw.lmstudio.trim().length > 0) {
666
+ out.lmstudio = raw.lmstudio.trim();
667
+ } else if (isRecord(raw.lmstudio)) {
668
+ const lmstudioMap = {};
669
+ for (const [k, v] of Object.entries(raw.lmstudio)) {
670
+ if (typeof v === "string" && v.trim().length > 0) {
671
+ lmstudioMap[k] = v.trim();
672
+ }
673
+ }
674
+ if (Object.keys(lmstudioMap).length > 0) {
675
+ out.lmstudio = lmstudioMap;
676
+ }
677
+ }
678
+ return Object.keys(out).length > 0 ? out : void 0;
679
+ }
680
+ function extractThinkingQuirks(raw) {
681
+ if (!isRecord(raw)) return void 0;
682
+ const mechanism = asThinkingMechanism(raw.mechanism);
683
+ if (!mechanism) return void 0;
684
+ const out = { mechanism };
685
+ const budgetByLevel = extractBudgetByLevel(raw.budgetByLevel);
686
+ if (budgetByLevel) out.budgetByLevel = budgetByLevel;
687
+ const effortByLevel = extractEffortByLevel(raw.effortByLevel);
688
+ if (effortByLevel) out.effortByLevel = effortByLevel;
689
+ if (typeof raw.guidance === "string" && raw.guidance.length > 0) out.guidance = raw.guidance;
690
+ const chatTemplateKwargs = extractChatTemplateKwargs(raw.chatTemplateKwargs);
691
+ if (chatTemplateKwargs) out.chatTemplateKwargs = chatTemplateKwargs;
692
+ return out;
693
+ }
694
+ function extractLocalModelQuirks(raw) {
695
+ if (!isRecord(raw)) return void 0;
696
+ const out = {};
697
+ const sampling = extractSampling(raw.sampling);
698
+ if (sampling) out.sampling = sampling;
699
+ const thinking = extractThinkingQuirks(raw.thinking);
700
+ if (thinking) out.thinking = thinking;
701
+ const chatTemplateKwargs = extractChatTemplateKwargs(raw.chatTemplateKwargs) ?? extractChatTemplateKwargs(isRecord(raw.thinking) ? raw.thinking.chatTemplateKwargs : void 0) ?? extractChatTemplateKwargs(isRecord(raw.request) ? raw.request.chatTemplateKwargs : void 0);
702
+ if (chatTemplateKwargs) out.chatTemplateKwargs = chatTemplateKwargs;
703
+ return Object.keys(out).length > 0 ? out : void 0;
704
+ }
705
+
706
+ // src/domains/providers/runtimes/common/local-synth.ts
707
+ function openAIThinkingFormat(caps) {
708
+ switch (caps.thinkingFormat) {
709
+ case "qwen-chat-template":
710
+ case "openrouter":
711
+ case "zai":
712
+ return caps.thinkingFormat;
713
+ case "deepseek-r1":
714
+ return "deepseek";
715
+ case "harmony":
716
+ return "harmony";
717
+ default:
718
+ return void 0;
719
+ }
720
+ }
721
+ function localOpenAICompat(caps, runtimeId) {
722
+ const compat = {
723
+ supportsStore: false,
724
+ supportsDeveloperRole: false,
725
+ supportsReasoningEffort: false,
726
+ supportsUsageInStreaming: true,
727
+ supportsFinishReason: false,
728
+ maxTokensField: "max_tokens",
729
+ ...runtimeId === "vllm" ? { thinkingTokenBudgetField: "thinking_token_budget" } : {},
730
+ supportsStrictMode: false,
731
+ // Native and generic gateway schemas do not establish hosted 24h retention.
732
+ supportsLongCacheRetention: false
733
+ };
734
+ const thinkingFormat = openAIThinkingFormat(caps);
735
+ if (thinkingFormat) compat.thinkingFormat = thinkingFormat;
736
+ return compat;
737
+ }
738
+ function localAnthropicCompat() {
739
+ return {
740
+ supportsEagerToolInputStreaming: false,
741
+ supportsLongCacheRetention: false
742
+ };
743
+ }
744
+ function synthLocalModel(input) {
745
+ const { target, wireModelId, kb, defaultCapabilities: defaultCapabilities26, apiFamily, provider } = input;
746
+ const caps = mergeCapabilities(defaultCapabilities26, kb?.entry.capabilities ?? null, null, target.capabilities ?? null);
747
+ const rawUrl = target.url ?? "";
748
+ const baseUrl = rawUrl.length > 0 ? input.baseUrlForTarget(rawUrl) : "";
749
+ const pricing = target.pricing;
750
+ const headers = target.auth?.headers;
751
+ const quirks = extractLocalModelQuirks(kb?.entry.quirks);
752
+ const model = {
753
+ id: wireModelId,
754
+ name: `${wireModelId} (${target.id})`,
755
+ api: apiFamily,
756
+ provider,
757
+ baseUrl,
758
+ reasoning: caps.reasoning,
759
+ input: caps.vision ? ["text", "image"] : ["text"],
760
+ cost: {
761
+ input: pricing?.input ?? 0,
762
+ output: pricing?.output ?? 0,
763
+ cacheRead: pricing?.cacheRead ?? 0,
764
+ cacheWrite: pricing?.cacheWrite ?? 0
765
+ },
766
+ contextWindow: caps.contextWindow,
767
+ maxTokens: caps.maxTokens,
768
+ clioCoder: {
769
+ targetId: target.id,
770
+ runtimeId: target.runtime,
771
+ ...target.lifecycle ? { lifecycle: target.lifecycle } : {},
772
+ ...target.gateway === true ? { gateway: true } : {},
773
+ ...kb?.entry.family ? { family: kb.entry.family } : {},
774
+ ...quirks ? { quirks } : {},
775
+ ...target.lmstudio ? { lmstudio: target.lmstudio } : {},
776
+ ...target.litellm ? { litellm: target.litellm } : {},
777
+ ...target.ollama ? { ollama: target.ollama } : {},
778
+ ...target.cache ? { cache: structuredClone(target.cache) } : {}
779
+ }
780
+ };
781
+ if (headers) model.headers = headers;
782
+ if (apiFamily === "openai-completions") {
783
+ model.compat = localOpenAICompat(caps, target.runtime);
784
+ }
785
+ if (apiFamily === "anthropic-messages") {
786
+ model.compat = localAnthropicCompat();
787
+ }
788
+ return model;
789
+ }
790
+ function stripTrailingSlash(url2) {
791
+ return url2.endsWith("/") ? url2.slice(0, -1) : url2;
792
+ }
793
+ function stripRedundantV1(url2) {
794
+ return url2.endsWith("/v1") ? url2.slice(0, -"/v1".length) : url2;
795
+ }
796
+ var withV1 = (url2) => `${stripRedundantV1(stripTrailingSlash(url2))}/v1`;
797
+ var withAsIs = (url2) => stripTrailingSlash(url2);
798
+ function targetBaseUrl(target) {
799
+ return target.url ? stripTrailingSlash(target.url) : null;
800
+ }
801
+ function targetRootUrl(target) {
802
+ return target.url ? stripRedundantV1(stripTrailingSlash(target.url)) : null;
803
+ }
804
+
805
+ // src/domains/providers/runtimes/protocol/openai-compat.ts
806
+ init_esm_shims();
807
+
808
+ // src/core/context-floor.ts
809
+ init_esm_shims();
810
+ var CLIO_MIN_CONTEXT_WINDOW = 131072;
811
+ var CLIO_MIN_MAX_OUTPUT_TOKENS = 32768;
812
+ var CLIO_CONTEXT_WINDOW_WARN_BELOW = 128e3;
813
+
814
+ // src/domains/providers/probe/reasoning.ts
815
+ init_esm_shims();
816
+ import { performance as performance2 } from "node:perf_hooks";
817
+ var PROMPT = "What is 2+2? Think briefly, then answer.";
818
+ function nonEmptyString(value) {
819
+ return typeof value === "string" && value.trim().length > 0;
820
+ }
821
+ function detectReasoningField(data) {
822
+ const message = data.choices?.[0]?.message;
823
+ if (!message) return null;
824
+ if (nonEmptyString(message.reasoning_content)) return "reasoning_content";
825
+ if (nonEmptyString(message.reasoning)) return "reasoning";
826
+ if (nonEmptyString(message.reasoning_text)) return "reasoning_text";
827
+ return null;
828
+ }
829
+ function trimTrailingSlash(url2) {
830
+ return url2.endsWith("/") ? url2.slice(0, -1) : url2;
831
+ }
832
+ async function probeOpenAICompatReasoning(opts) {
833
+ const controller = new AbortController();
834
+ let timedOut = false;
835
+ const timer = setTimeout(() => {
836
+ timedOut = true;
837
+ controller.abort();
838
+ }, opts.timeoutMs);
839
+ const onExternalAbort = () => controller.abort();
840
+ if (opts.signal) {
841
+ if (opts.signal.aborted) controller.abort();
842
+ else opts.signal.addEventListener("abort", onExternalAbort, { once: true });
843
+ }
844
+ const headers = { "content-type": "application/json" };
845
+ if (opts.apiKey && opts.apiKey.length > 0) headers.authorization = `Bearer ${opts.apiKey}`;
846
+ Object.assign(headers, opts.headers);
847
+ const body = JSON.stringify({
848
+ model: opts.modelId,
849
+ messages: [{ role: "user", content: PROMPT }],
850
+ max_tokens: 200,
851
+ temperature: 0,
852
+ stream: false,
853
+ reasoning_effort: "low"
854
+ });
855
+ const url2 = `${trimTrailingSlash(opts.baseUrl)}/v1/chat/completions`;
856
+ const started = performance2.now();
857
+ try {
858
+ const response = await fetch(url2, {
859
+ method: "POST",
860
+ headers,
861
+ body,
862
+ signal: controller.signal
863
+ });
864
+ const latencyMs = Math.round(performance2.now() - started);
865
+ if (!response.ok) {
866
+ await response.body?.cancel();
867
+ controller.signal.throwIfAborted();
868
+ return { reasoning: null, latencyMs, error: `HTTP ${response.status}: ${response.statusText}` };
869
+ }
870
+ const data = await response.json();
871
+ const field = detectReasoningField(data);
872
+ if (field) return { reasoning: true, field, latencyMs };
873
+ return { reasoning: null, latencyMs };
874
+ } catch (err) {
875
+ const latencyMs = Math.round(performance2.now() - started);
876
+ if (timedOut) return { reasoning: null, latencyMs, error: `timeout after ${opts.timeoutMs}ms` };
877
+ if (opts.signal?.aborted) return { reasoning: null, latencyMs, error: "aborted by caller" };
878
+ return { reasoning: null, latencyMs, error: err instanceof Error ? err.message : String(err) };
879
+ } finally {
880
+ clearTimeout(timer);
881
+ if (opts.signal) opts.signal.removeEventListener("abort", onExternalAbort);
882
+ }
883
+ }
884
+
885
+ // src/domains/providers/runtimes/common/probe-helpers.ts
886
+ init_esm_shims();
887
+
888
+ // src/domains/providers/types/context-window-slots.ts
889
+ init_esm_shims();
890
+ function formatContextWindowSlots(contextWindow, slots) {
891
+ const format = (n) => Math.round(n).toLocaleString("en-US");
892
+ return `${format(contextWindow)} (${format(slots.totalContextSize)} / ${slots.slots} slots)`;
893
+ }
894
+
895
+ // src/domains/providers/runtimes/common/probe-helpers.ts
896
+ function bearerHeaders(ctx) {
897
+ return ctx.authToken ? { Authorization: `Bearer ${ctx.authToken}` } : {};
898
+ }
899
+ async function probeUrl(url2, ctx, method = "GET", headers = bearerHeaders(ctx)) {
900
+ const base = { url: url2, timeoutMs: ctx.httpTimeoutMs, method, headers };
901
+ return ctx.signal ? probeHttp({ ...base, signal: ctx.signal }) : probeHttp(base);
902
+ }
903
+ async function probeOpenAIModels(base, ctx, modelsPath = "/v1/models", headers = bearerHeaders(ctx)) {
904
+ return (await probeOpenAIModelCatalog(base, ctx, modelsPath, headers)).models;
905
+ }
906
+ var OPENAI_COMPAT_DETAIL_PATHS = ["/api/v0/models"];
907
+ async function probeModelDetailRows(base, ctx, modelsPath, headers) {
908
+ const rows = /* @__PURE__ */ new Map();
909
+ for (const detailPath of OPENAI_COMPAT_DETAIL_PATHS) {
910
+ if (detailPath === modelsPath) continue;
911
+ const opts = { url: `${base}${detailPath}`, timeoutMs: ctx.httpTimeoutMs, headers };
912
+ const result = await (ctx.signal ? probeJson({ ...opts, signal: ctx.signal }) : probeJson(opts));
913
+ if (!result.ok || !Array.isArray(result.data?.data)) continue;
914
+ for (const row of result.data.data) {
915
+ if (typeof row?.id !== "string" || row.id.length === 0) continue;
916
+ if (!rows.has(row.id)) rows.set(row.id, row);
917
+ }
918
+ if (rows.size > 0) break;
919
+ }
920
+ return rows;
921
+ }
922
+ async function probeOpenAIModelCatalog(base, ctx, modelsPath = "/v1/models", headers = bearerHeaders(ctx)) {
923
+ const opts = { url: `${base}${modelsPath}`, timeoutMs: ctx.httpTimeoutMs, headers };
924
+ const result = await (ctx.signal ? probeJson({ ...opts, signal: ctx.signal }) : probeJson(opts));
925
+ if (!result.ok || !result.data?.data) return { models: [], modelCapabilities: {}, modelStates: {} };
926
+ const detail = await probeModelDetailRows(base, ctx, modelsPath, headers);
927
+ const models = [];
928
+ const modelCapabilities = {};
929
+ const modelStates = {};
930
+ for (const row of result.data.data) {
931
+ if (typeof row?.id !== "string" || row.id.length === 0) continue;
932
+ models.push(row.id);
933
+ const detailRow = detail.get(row.id);
934
+ const caps = {
935
+ ...detailRow ? capabilitiesFromOpenAIModelEntry(detailRow) : {},
936
+ ...capabilitiesFromOpenAIModelEntry(row)
937
+ };
938
+ if (Object.keys(caps).length > 0) modelCapabilities[row.id] = caps;
939
+ const loadedContext = loadedContextFromEntry(row) ?? (detailRow ? loadedContextFromEntry(detailRow) : void 0);
940
+ const state = modelStateFromOpenAIModelEntry(row) ?? (detailRow ? modelStateFromOpenAIModelEntry(detailRow) : void 0) ?? // A reported loaded context is itself the residency answer: nothing
941
+ // serves a window for a model it has not loaded.
942
+ (loadedContext !== void 0 ? { state: "loaded" } : void 0);
943
+ const contextSlots = contextSlotsFromEntry(row) ?? (detailRow ? contextSlotsFromEntry(detailRow) : void 0);
944
+ const withSlots = contextSlots ? { ...state ?? { state: "unknown" }, contextSlots } : state;
945
+ if (withSlots) {
946
+ modelStates[row.id] = loadedContext === void 0 ? withSlots : { ...withSlots, contextLength: loadedContext };
947
+ }
948
+ }
949
+ return { models, modelCapabilities, modelStates };
950
+ }
951
+ function isRecord2(value) {
952
+ return value !== null && typeof value === "object" && !Array.isArray(value);
953
+ }
954
+ function positiveNumber(value) {
955
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : void 0;
956
+ }
957
+ function firstPositiveNumber(record2, keys) {
958
+ for (const key of keys) {
959
+ const value = positiveNumber(record2[key]);
960
+ if (value !== void 0) return value;
961
+ }
962
+ return void 0;
963
+ }
964
+ function capabilityListFlag(record2, name) {
965
+ const list = record2.capabilities;
966
+ if (!Array.isArray(list)) return void 0;
967
+ return list.some((entry) => entry === name) ? true : void 0;
968
+ }
969
+ function booleanFromAny(record2, keys) {
970
+ for (const key of keys) {
971
+ const value = record2[key];
972
+ if (typeof value === "boolean") return value;
973
+ }
974
+ return void 0;
975
+ }
976
+ function nestedRecord(record2, key) {
977
+ const value = record2[key];
978
+ return isRecord2(value) ? value : null;
979
+ }
980
+ function firstString(record2, keys) {
981
+ if (!record2) return void 0;
982
+ for (const key of keys) {
983
+ const value = record2[key];
984
+ if (typeof value === "string" && value.trim().length > 0) return value.trim();
985
+ }
986
+ return void 0;
987
+ }
988
+ function firstBoolean(record2, keys) {
989
+ if (!record2) return void 0;
990
+ for (const key of keys) {
991
+ const value = record2[key];
992
+ if (typeof value === "boolean") return value;
993
+ }
994
+ return void 0;
995
+ }
996
+ function normalizeModelState(raw) {
997
+ const value = raw?.trim().toLowerCase().replace(/[\s_]+/g, "-");
998
+ if (!value) return void 0;
999
+ if (value === "loaded" || value === "ready" || value === "running" || value === "active") return "loaded";
1000
+ if (value === "loading" || value === "pending" || value === "queued" || value === "starting") return "loading";
1001
+ if (value === "unloaded" || value === "not-loaded" || value === "idle" || value === "sleeping" || value === "stopped") {
1002
+ return "unloaded";
1003
+ }
1004
+ if (value === "failed" || value === "error" || value === "errored") return "failed";
1005
+ if (value === "unknown") return "unknown";
1006
+ return void 0;
1007
+ }
1008
+ function modelStateFromOpenAIModelEntry(row) {
1009
+ const status = nestedRecord(row, "status");
1010
+ const failed = firstBoolean(status, ["failed"]) ?? firstBoolean(row, ["failed"]);
1011
+ if (failed === true) {
1012
+ const detail = firstString(status, ["error", "reason", "message"]) ?? firstString(row, ["error", "reason", "message"]);
1013
+ return detail ? { state: "failed", detail } : { state: "failed" };
1014
+ }
1015
+ const raw = typeof row.status === "string" ? row.status : firstString(status, ["value", "state", "status"]) ?? firstString(row, ["state"]);
1016
+ const normalized = normalizeModelState(raw);
1017
+ if (normalized) {
1018
+ const detail = firstString(status, ["detail", "message", "reason"]);
1019
+ return detail ? { state: normalized, detail } : { state: normalized };
1020
+ }
1021
+ const loaded = firstBoolean(status, ["loaded"]) ?? firstBoolean(row, ["loaded"]);
1022
+ if (loaded === true) return { state: "loaded" };
1023
+ if (loaded === false) return { state: "unloaded" };
1024
+ return void 0;
1025
+ }
1026
+ function loadedContextFromEntry(row) {
1027
+ const reported = firstPositiveNumber(row, ["loaded_context_length", "loadedContextLength"]);
1028
+ return reported === void 0 ? void 0 : Math.floor(reported);
1029
+ }
1030
+ function statusArgsFromEntry(row) {
1031
+ const status = nestedRecord(row, "status");
1032
+ return argsFromStatus(status);
1033
+ }
1034
+ function contextSlotsFromEntry(row) {
1035
+ return llamaCppRequestContextWindow(parseLlamaCppServerFlags(statusArgsFromEntry(row)))?.slots;
1036
+ }
1037
+ function capabilitiesFromOpenAIModelEntry(row) {
1038
+ const caps = {};
1039
+ const meta = nestedRecord(row, "meta");
1040
+ const flags = parseLlamaCppServerFlags(statusArgsFromEntry(row));
1041
+ const contextWindow = llamaCppRequestContextWindow(flags)?.contextWindow ?? firstPositiveNumber(row, [
1042
+ // What is actually loaded outranks what the model could support: a
1043
+ // model served at 8k out of a possible 262k has an 8k window today,
1044
+ // and the run has to be planned against the real one.
1045
+ "loaded_context_length",
1046
+ "loadedContextLength",
1047
+ "context_window",
1048
+ "contextWindow",
1049
+ "context_length",
1050
+ "contextLength",
1051
+ "max_context_length",
1052
+ "max_context_window",
1053
+ "maxContextLength",
1054
+ "n_ctx"
1055
+ ]) ?? (meta ? firstPositiveNumber(meta, ["n_ctx", "n_ctx_train", "context_length", "contextWindow"]) : void 0);
1056
+ if (contextWindow !== void 0) caps.contextWindow = Math.floor(contextWindow);
1057
+ const maxTokens = positiveNumber(flags.maxTokens) ?? firstPositiveNumber(row, [
1058
+ "max_output_tokens",
1059
+ "maxOutputTokens",
1060
+ "max_completion_tokens",
1061
+ "maxCompletionTokens",
1062
+ "max_tokens",
1063
+ "maxTokens",
1064
+ "n_predict"
1065
+ ]);
1066
+ if (maxTokens !== void 0) caps.maxTokens = Math.floor(maxTokens);
1067
+ const tools = flags.jinja ?? booleanFromAny(row, ["tools", "tool_use", "toolUse", "trained_for_tool_use"]) ?? capabilityListFlag(row, "tool_use");
1068
+ if (tools !== void 0) caps.tools = tools;
1069
+ const reasoning = flags.reasoning ?? (flags.reasoningBudget !== void 0 ? true : void 0) ?? booleanFromAny(row, ["reasoning", "thinking"]);
1070
+ if (reasoning !== void 0) caps.reasoning = reasoning;
1071
+ const architecture = nestedRecord(row, "architecture");
1072
+ const architectureInput = architecture?.input_modalities;
1073
+ const modalities = Array.isArray(row.modalities) ? row.modalities : Array.isArray(row.input) ? row.input : Array.isArray(architectureInput) ? architectureInput : null;
1074
+ if (modalities) {
1075
+ caps.vision = modalities.some((entry) => entry === "image" || entry === "vision");
1076
+ if (modalities.some((entry) => entry === "audio")) caps.audio = true;
1077
+ }
1078
+ if (row.owned_by === "lemonade" && Array.isArray(row.labels)) {
1079
+ const labels = new Set(row.labels.filter((label) => typeof label === "string"));
1080
+ caps.chat = labels.has("chat");
1081
+ caps.tools = labels.has("tool-calling");
1082
+ caps.reasoning = labels.has("reasoning");
1083
+ caps.vision = labels.has("vision");
1084
+ caps.embeddings = labels.has("embeddings");
1085
+ caps.rerank = labels.has("reranking");
1086
+ }
1087
+ return caps;
1088
+ }
1089
+ function modelEntries(payload) {
1090
+ if (!Array.isArray(payload?.data)) return [];
1091
+ const out = [];
1092
+ for (const row of payload.data) {
1093
+ if (typeof row?.id !== "string" || row.id.length === 0) continue;
1094
+ out.push({ id: row.id, status: row.status });
1095
+ }
1096
+ return out;
1097
+ }
1098
+ async function probeOpenAIModelEntries(base, ctx) {
1099
+ const opts = { url: `${base}/v1/models`, timeoutMs: ctx.httpTimeoutMs };
1100
+ const result = await (ctx.signal ? probeJson({ ...opts, signal: ctx.signal }) : probeJson(opts));
1101
+ if (!result.ok) return [];
1102
+ return modelEntries(result.data);
1103
+ }
1104
+ function llamaCppRequestContextWindow(flags) {
1105
+ const total = positiveNumber(flags.contextSize);
1106
+ if (total === void 0) return void 0;
1107
+ const parallel = positiveNumber(flags.parallel);
1108
+ if (parallel === void 0 || parallel <= 1 || flags.kvUnified === true) return { contextWindow: Math.floor(total) };
1109
+ const slots = Math.floor(parallel);
1110
+ return {
1111
+ contextWindow: Math.floor(total / slots),
1112
+ slots: { totalContextSize: Math.floor(total), slots }
1113
+ };
1114
+ }
1115
+ function llamaCppIdleSlotEvictionNote(id, flags) {
1116
+ const parallel = positiveNumber(flags.parallel);
1117
+ if (parallel === void 0 || !Number.isInteger(parallel) || parallel <= 1) return void 0;
1118
+ if (flags.kvUnified !== true || flags.cacheRamMib === 0 || flags.cacheIdleSlots === false) return void 0;
1119
+ return `${id} clears idle slots from its unified KV cache on every new request (--kv-unified, --parallel ${parallel}, idle-slot caching on): a returning prompt is restored from host RAM and can stall every slot for seconds; start it with --no-cache-idle-slots (preset: cache-idle-slots = false)`;
1120
+ }
1121
+ function argsFromStatus(status) {
1122
+ if (!isRecord2(status)) return [];
1123
+ const args = status.args;
1124
+ if (Array.isArray(args)) return args.filter((entry) => typeof entry === "string");
1125
+ if (typeof args === "string") return args.trim().split(/\s+/).filter(Boolean);
1126
+ return [];
1127
+ }
1128
+ function looksLikeFlag(token) {
1129
+ return token.startsWith("-") && Number.isNaN(Number(token));
1130
+ }
1131
+ function valueAfter(args, ...flags) {
1132
+ for (const flag of flags) {
1133
+ const index = args.indexOf(flag);
1134
+ if (index < 0) continue;
1135
+ const value = args[index + 1];
1136
+ return value && !looksLikeFlag(value) ? value : void 0;
1137
+ }
1138
+ return void 0;
1139
+ }
1140
+ function numberFlag(args, ...flags) {
1141
+ const value = valueAfter(args, ...flags);
1142
+ if (value === void 0) return void 0;
1143
+ const parsed = Number(value);
1144
+ return Number.isFinite(parsed) ? parsed : void 0;
1145
+ }
1146
+ function booleanFlag(args, ...flags) {
1147
+ const flag = flags.find((candidate) => args.includes(candidate));
1148
+ if (flag === void 0) return void 0;
1149
+ const value = valueAfter(args, flag);
1150
+ if (value === void 0) return true;
1151
+ const normalized = value.toLowerCase();
1152
+ if (normalized === "true" || normalized === "on" || normalized === "1") return true;
1153
+ if (normalized === "false" || normalized === "off" || normalized === "0") return false;
1154
+ return void 0;
1155
+ }
1156
+ function parseLlamaCppServerFlags(args) {
1157
+ const flags = {};
1158
+ const ctxSize = numberFlag(args, "--ctx-size", "-c");
1159
+ if (ctxSize !== void 0) flags.contextSize = ctxSize;
1160
+ const maxTokens = numberFlag(args, "--n-predict");
1161
+ if (maxTokens !== void 0) flags.maxTokens = maxTokens;
1162
+ const flashAttention = booleanFlag(args, "--flash-attn");
1163
+ if (flashAttention !== void 0) flags.flashAttention = flashAttention;
1164
+ const jinja = booleanFlag(args, "--jinja");
1165
+ if (jinja !== void 0) flags.jinja = jinja;
1166
+ const reasoningRaw = valueAfter(args, "--reasoning");
1167
+ if (reasoningRaw) flags.reasoning = reasoningRaw === "on" || reasoningRaw === "true" || reasoningRaw === "1";
1168
+ const reasoningBudget = numberFlag(args, "--reasoning-budget");
1169
+ if (reasoningBudget !== void 0) flags.reasoningBudget = reasoningBudget;
1170
+ const temperature = numberFlag(args, "--temperature");
1171
+ if (temperature !== void 0) flags.temperature = temperature;
1172
+ const topP = numberFlag(args, "--top-p");
1173
+ if (topP !== void 0) flags.topP = topP;
1174
+ const topK = numberFlag(args, "--top-k");
1175
+ if (topK !== void 0) flags.topK = topK;
1176
+ const nGpuLayers = numberFlag(args, "--n-gpu-layers");
1177
+ if (nGpuLayers !== void 0) flags.nGpuLayers = nGpuLayers;
1178
+ const parallel = numberFlag(args, "--parallel", "-np");
1179
+ if (parallel !== void 0) flags.parallel = parallel;
1180
+ const kvUnifiedAt = Math.max(args.lastIndexOf("--kv-unified"), args.lastIndexOf("-kvu"));
1181
+ const noKvUnifiedAt = args.lastIndexOf("--no-kv-unified");
1182
+ if (noKvUnifiedAt > kvUnifiedAt) flags.kvUnified = false;
1183
+ else if (kvUnifiedAt >= 0) flags.kvUnified = booleanFlag(args, "--kv-unified", "-kvu") ?? true;
1184
+ const cacheRamMib = numberFlag(args, "--cache-ram", "-cram");
1185
+ if (cacheRamMib !== void 0) flags.cacheRamMib = cacheRamMib;
1186
+ const cacheIdleSlotsAt = args.lastIndexOf("--cache-idle-slots");
1187
+ const noCacheIdleSlotsAt = args.lastIndexOf("--no-cache-idle-slots");
1188
+ if (noCacheIdleSlotsAt > cacheIdleSlotsAt) flags.cacheIdleSlots = false;
1189
+ else if (cacheIdleSlotsAt >= 0) flags.cacheIdleSlots = booleanFlag(args, "--cache-idle-slots") ?? true;
1190
+ const cacheTypeK = valueAfter(args, "--cache-type-k");
1191
+ if (cacheTypeK) flags.cacheTypeK = cacheTypeK;
1192
+ const cacheTypeV = valueAfter(args, "--cache-type-v");
1193
+ if (cacheTypeV) flags.cacheTypeV = cacheTypeV;
1194
+ const mmproj = valueAfter(args, "--mmproj");
1195
+ if (mmproj) flags.mmproj = mmproj;
1196
+ const chatTemplateKwargs = valueAfter(args, "--chat-template-kwargs");
1197
+ if (chatTemplateKwargs) flags.chatTemplateKwargs = chatTemplateKwargs;
1198
+ return flags;
1199
+ }
1200
+ function selectedModelEntry(entries, target) {
1201
+ const expected = target.defaultModel?.trim();
1202
+ if (expected) return entries.find((entry) => entry.id === expected) ?? null;
1203
+ return entries[0] ?? null;
1204
+ }
1205
+ function statusNotes(id, status) {
1206
+ if (!isRecord2(status)) return [];
1207
+ const notes = [];
1208
+ if (status.failed === true) notes.push(`llama.cpp router marks ${id} as failed`);
1209
+ const state = typeof status.state === "string" ? status.state : void 0;
1210
+ if (state === "loading") notes.push(`llama.cpp router reports ${id} is still loading`);
1211
+ return notes;
1212
+ }
1213
+ async function probeLlamaCppModelStatus(base, target, ctx) {
1214
+ const entries = await probeOpenAIModelEntries(base, ctx);
1215
+ const selected = selectedModelEntry(entries, target);
1216
+ if (!selected) return {};
1217
+ const loadState = modelStateFromOpenAIModelEntry({ id: selected.id, status: selected.status })?.state;
1218
+ const withState = (enrichment2) => loadState === void 0 ? enrichment2 : { ...enrichment2, loadState };
1219
+ const args = argsFromStatus(selected.status);
1220
+ if (args.length === 0) return withState({ notes: statusNotes(selected.id, selected.status) });
1221
+ const flags = parseLlamaCppServerFlags(args);
1222
+ const caps = {};
1223
+ const window = llamaCppRequestContextWindow(flags);
1224
+ if (window !== void 0) caps.contextWindow = window.contextWindow;
1225
+ if (flags.maxTokens !== void 0 && flags.maxTokens > 0) caps.maxTokens = flags.maxTokens;
1226
+ if (flags.reasoning === true || flags.reasoningBudget !== void 0) caps.reasoning = true;
1227
+ if (flags.mmproj) caps.vision = true;
1228
+ if (flags.jinja === true) caps.tools = true;
1229
+ if (flags.parallel !== void 0 && Number.isInteger(flags.parallel) && flags.parallel > 0) {
1230
+ caps.parallelSlots = flags.parallel;
1231
+ }
1232
+ const enrichment = { modelId: selected.id, serverFlags: flags };
1233
+ if (Object.keys(caps).length > 0) enrichment.discoveredCapabilities = caps;
1234
+ const notes = statusNotes(selected.id, selected.status);
1235
+ if (window?.slots) {
1236
+ notes.push(
1237
+ `${selected.id} context window ${formatContextWindowSlots(window.contextWindow, window.slots)}: --ctx-size is split across --parallel slots without --kv-unified`
1238
+ );
1239
+ }
1240
+ const idleSlotEviction = llamaCppIdleSlotEvictionNote(selected.id, flags);
1241
+ if (idleSlotEviction) {
1242
+ notes.push(idleSlotEviction);
1243
+ enrichment.cacheAdvisories = [idleSlotEviction];
1244
+ }
1245
+ if (notes.length > 0) enrichment.notes = notes;
1246
+ return withState(enrichment);
1247
+ }
1248
+ async function detectModelMismatch(base, target, ctx) {
1249
+ const expected = target.defaultModel?.trim();
1250
+ if (!expected) return null;
1251
+ const ids = await probeOpenAIModels(base, ctx);
1252
+ if (ids.length === 0) return null;
1253
+ if (ids.includes(expected)) return null;
1254
+ const loaded = ids[0] ?? "(unknown)";
1255
+ return `wire model id ${expected} does not match server's loaded model ${loaded}; llama.cpp serves a single fixed model`;
1256
+ }
1257
+ async function probeLlamaCppProps(base, ctx, modelId) {
1258
+ const request = async (url2) => {
1259
+ const opts = { url: url2, timeoutMs: ctx.httpTimeoutMs };
1260
+ const result = await (ctx.signal ? probeJson({ ...opts, signal: ctx.signal }) : probeJson(opts));
1261
+ return result.ok && result.data ? result.data : null;
1262
+ };
1263
+ const router = await request(`${base}/props`);
1264
+ if (router === null) return {};
1265
+ const selected = typeof router.total_slots === "number" || !modelId ? null : await request(`${base}/props?model=${encodeURIComponent(modelId)}`);
1266
+ const data = selected ?? router;
1267
+ const enrichment = {};
1268
+ const caps = {};
1269
+ const nCtx = data.default_generation_settings?.n_ctx;
1270
+ if (typeof nCtx === "number" && nCtx > 0) caps.contextWindow = nCtx;
1271
+ const nPredict = data.default_generation_settings?.n_predict;
1272
+ if (typeof nPredict === "number" && nPredict > 0) caps.maxTokens = nPredict;
1273
+ const vision = data.modalities?.vision;
1274
+ if (typeof vision === "boolean") caps.vision = vision;
1275
+ const totalSlots = data.total_slots;
1276
+ if (typeof totalSlots === "number" && Number.isInteger(totalSlots) && totalSlots > 0) caps.parallelSlots = totalSlots;
1277
+ if (Object.keys(caps).length > 0) enrichment.discoveredCapabilities = caps;
1278
+ const buildInfo = data.build_info ?? router.build_info;
1279
+ if (typeof buildInfo === "string" && buildInfo.length > 0) {
1280
+ enrichment.serverVersion = buildInfo;
1281
+ }
1282
+ return enrichment;
1283
+ }
1284
+
1285
+ // src/domains/providers/runtimes/protocol/openai-compat.ts
1286
+ function synthesizeOpenAICompatModel(input) {
1287
+ return synthLocalModel({
1288
+ target: input.target,
1289
+ wireModelId: input.wireModelId,
1290
+ kb: input.kb,
1291
+ defaultCapabilities: input.defaultCapabilities,
1292
+ apiFamily: input.apiFamily ?? "openai-completions",
1293
+ provider: input.provider,
1294
+ baseUrlForTarget: input.baseUrlForTarget ?? withV1
1295
+ });
1296
+ }
1297
+ function makeOpenAICompatRuntime(spec) {
1298
+ const apiFamily = spec.apiFamily ?? "openai-completions";
1299
+ const asIs = spec.baseUrlStyle === "asIs";
1300
+ const baseUrlForTarget = asIs ? withAsIs : withV1;
1301
+ const healthPath = spec.healthPath ?? "/v1/models";
1302
+ const modelsPath = spec.modelsPath ?? "/v1/models";
1303
+ const probeBase = asIs ? targetBaseUrl : targetRootUrl;
1304
+ const headers = (target, ctx) => ({
1305
+ ...ctx.authToken ? { Authorization: `Bearer ${ctx.authToken}` } : {},
1306
+ ...target.auth?.headers
1307
+ });
1308
+ return {
1309
+ id: spec.id,
1310
+ displayName: spec.displayName,
1311
+ kind: "http",
1312
+ tier: spec.tier,
1313
+ apiFamily,
1314
+ auth: spec.auth,
1315
+ defaultCapabilities: spec.defaultCapabilities,
1316
+ async probe(target, ctx) {
1317
+ const base = probeBase(target);
1318
+ if (!base) return { ok: false, error: "target has no url" };
1319
+ const health = await probeUrl(`${base}${healthPath}`, ctx, "GET", headers(target, ctx));
1320
+ if (!health.ok) return health;
1321
+ const catalog = await probeOpenAIModelCatalog(base, ctx, modelsPath, headers(target, ctx));
1322
+ const result = { ...health };
1323
+ if (catalog.models.length > 0) result.models = catalog.models;
1324
+ if (Object.keys(catalog.modelStates).length > 0) result.modelStates = catalog.modelStates;
1325
+ if (Object.keys(catalog.modelCapabilities).length > 0) {
1326
+ result.modelCapabilities = catalog.modelCapabilities;
1327
+ const selected = target.defaultModel?.trim();
1328
+ const selectedCaps = selected ? catalog.modelCapabilities[selected] : void 0;
1329
+ if (selected && selectedCaps) {
1330
+ result.discoveredCapabilities = selectedCaps;
1331
+ result.capabilityModelId = selected;
1332
+ }
1333
+ }
1334
+ return result;
1335
+ },
1336
+ async probeModels(target, ctx) {
1337
+ const base = probeBase(target);
1338
+ if (!base) return [];
1339
+ return probeOpenAIModels(base, ctx, modelsPath, headers(target, ctx));
1340
+ },
1341
+ async probeReasoning(target, modelId, ctx) {
1342
+ const base = probeBase(target);
1343
+ if (!base) return { reasoning: false, latencyMs: 0, error: "target has no url" };
1344
+ const apiKeyEnv = target.auth?.apiKeyEnvVar;
1345
+ const apiKey = ctx.authToken ?? (apiKeyEnv && ctx.credentialsPresent.has(apiKeyEnv) ? process.env[apiKeyEnv] : void 0);
1346
+ const probeOpts = {
1347
+ baseUrl: base,
1348
+ modelId,
1349
+ timeoutMs: Math.max(ctx.httpTimeoutMs, 8e3)
1350
+ };
1351
+ if (apiKey) probeOpts.apiKey = apiKey;
1352
+ if (target.auth?.headers) probeOpts.headers = target.auth.headers;
1353
+ if (ctx.signal) probeOpts.signal = ctx.signal;
1354
+ return probeOpenAICompatReasoning(probeOpts);
1355
+ },
1356
+ synthesizeModel(target, wireModelId, kb) {
1357
+ return synthesizeOpenAICompatModel({
1358
+ target,
1359
+ wireModelId,
1360
+ kb,
1361
+ defaultCapabilities: spec.defaultCapabilities,
1362
+ apiFamily,
1363
+ provider: spec.provider,
1364
+ baseUrlForTarget
1365
+ });
1366
+ }
1367
+ };
1368
+ }
1369
+ var defaultCapabilities = {
1370
+ chat: true,
1371
+ tools: false,
1372
+ reasoning: false,
1373
+ vision: false,
1374
+ audio: false,
1375
+ embeddings: false,
1376
+ rerank: false,
1377
+ fim: false,
1378
+ contextWindow: CLIO_MIN_CONTEXT_WINDOW,
1379
+ maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
1380
+ };
1381
+ var openai_compat_default = makeOpenAICompatRuntime({
1382
+ id: "openai-compat",
1383
+ displayName: "Generic OpenAI-compatible",
1384
+ provider: "openai-compat",
1385
+ auth: "api-key",
1386
+ tier: "protocol",
1387
+ defaultCapabilities
1388
+ });
1389
+
1390
+ // src/domains/providers/runtimes/cloud/alcf.ts
1391
+ var CATALOG_URL = "https://inference-api.alcf.anl.gov/resource_server/list-endpoints";
1392
+ var GATEWAY_ORIGIN = "https://inference-api.alcf.anl.gov/resource_server";
1393
+ var defaultCapabilities2 = {
1394
+ chat: true,
1395
+ tools: true,
1396
+ toolCallFormat: "openai",
1397
+ reasoning: true,
1398
+ vision: false,
1399
+ audio: false,
1400
+ embeddings: false,
1401
+ rerank: false,
1402
+ fim: false,
1403
+ contextWindow: 32768,
1404
+ maxTokens: 4096
1405
+ };
1406
+ var KNOWN_MODELS = [
1407
+ "openai/gpt-oss-120b",
1408
+ "openai/gpt-oss-20b",
1409
+ "gpt-oss-120b",
1410
+ "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8",
1411
+ "meta-llama/Llama-4-Scout-17B-16E-Instruct"
1412
+ ];
1413
+ function clusterFromUrl(url2) {
1414
+ if (!url2) return null;
1415
+ const match = /\/resource_server\/([^/]+)\//.exec(url2);
1416
+ return match ? match[1] ?? null : null;
1417
+ }
1418
+ function frameworkForCluster(cluster) {
1419
+ return cluster === "metis" ? "api" : "vllm";
1420
+ }
1421
+ function catalogModels(payload, cluster, framework) {
1422
+ const models = payload.clusters?.[cluster]?.frameworks?.[framework]?.models;
1423
+ if (!Array.isArray(models)) return [];
1424
+ return models.map((model) => String(model).trim()).filter((model) => model.length > 0);
1425
+ }
1426
+ function runningModels(payload) {
1427
+ const out = [];
1428
+ for (const job of payload.running ?? []) {
1429
+ for (const raw of String(job.Models ?? "").split(",")) {
1430
+ const id = raw.trim();
1431
+ if (id.length > 0) out.push(id);
1432
+ }
1433
+ }
1434
+ return out;
1435
+ }
1436
+ function dedupe(ids) {
1437
+ const seen = /* @__PURE__ */ new Set();
1438
+ const out = [];
1439
+ for (const id of ids) {
1440
+ if (seen.has(id)) continue;
1441
+ seen.add(id);
1442
+ out.push(id);
1443
+ }
1444
+ return out;
1445
+ }
1446
+ function authHeaders(ctx) {
1447
+ return { Authorization: `Bearer ${ctx.authToken}`, Accept: "application/json" };
1448
+ }
1449
+ async function discover(target, ctx) {
1450
+ if (!target.url) return { ok: false, error: "ALCF target has no url" };
1451
+ const cluster = clusterFromUrl(target.url);
1452
+ if (!cluster) {
1453
+ return { ok: false, error: `cannot determine ALCF cluster from url ${target.url}` };
1454
+ }
1455
+ if (!ctx.authToken) {
1456
+ return { ok: false, error: "ALCF requires Globus auth; run `clio-coder auth login alcf`." };
1457
+ }
1458
+ const framework = frameworkForCluster(cluster);
1459
+ const headers = authHeaders(ctx);
1460
+ const catalog = await probeJson({
1461
+ url: CATALOG_URL,
1462
+ headers,
1463
+ timeoutMs: ctx.httpTimeoutMs,
1464
+ ...ctx.signal ? { signal: ctx.signal } : {}
1465
+ });
1466
+ if (!catalog.ok || !catalog.data) {
1467
+ const reason = catalog.error ?? "unknown error";
1468
+ const hint = reason.includes("401") ? " (token expired or rejected; run `clio-coder auth login alcf` again)" : "";
1469
+ return {
1470
+ ok: false,
1471
+ error: `ALCF endpoint catalog unreachable: ${reason}${hint}`,
1472
+ ...catalog.latencyMs !== void 0 ? { latencyMs: catalog.latencyMs } : {}
1473
+ };
1474
+ }
1475
+ const fromCatalog = catalogModels(catalog.data, cluster, framework);
1476
+ let live = [];
1477
+ try {
1478
+ const jobs = await probeJson({
1479
+ url: `${GATEWAY_ORIGIN}/${cluster}/jobs`,
1480
+ headers,
1481
+ timeoutMs: Math.min(ctx.httpTimeoutMs, 12e3),
1482
+ ...ctx.signal ? { signal: ctx.signal } : {}
1483
+ });
1484
+ if (jobs.ok && jobs.data) live = runningModels(jobs.data);
1485
+ } catch {
1486
+ }
1487
+ const models = dedupe([...fromCatalog, ...live]);
1488
+ const result = { ok: true, models };
1489
+ if (catalog.latencyMs !== void 0) result.latencyMs = catalog.latencyMs;
1490
+ if (models.length === 0) {
1491
+ result.notes = [`ALCF ${cluster}/${framework} reported no models; the gateway may have no running jobs.`];
1492
+ }
1493
+ return result;
1494
+ }
1495
+ var alcfRuntime = {
1496
+ id: "alcf",
1497
+ displayName: "ALCF Inference (Globus)",
1498
+ kind: "http",
1499
+ tier: "cloud",
1500
+ apiFamily: "openai-completions",
1501
+ auth: "oauth",
1502
+ knownModels: KNOWN_MODELS,
1503
+ defaultCapabilities: defaultCapabilities2,
1504
+ probe(target, ctx) {
1505
+ return discover(target, ctx);
1506
+ },
1507
+ async probeModels(target, ctx) {
1508
+ const result = await discover(target, ctx);
1509
+ return result.models ?? [];
1510
+ },
1511
+ synthesizeModel(target, wireModelId, kb) {
1512
+ const model = synthesizeOpenAICompatModel({
1513
+ target,
1514
+ wireModelId,
1515
+ kb,
1516
+ defaultCapabilities: defaultCapabilities2,
1517
+ apiFamily: "openai-completions",
1518
+ provider: "alcf",
1519
+ baseUrlForTarget: withAsIs
1520
+ });
1521
+ const meta = model.clioCoder;
1522
+ if (meta) meta.chatTemplateKwargsUnsupported = true;
1523
+ return model;
1524
+ }
1525
+ };
1526
+ var alcf_default = alcfRuntime;
1527
+
1528
+ // src/domains/providers/runtimes/cloud/anthropic.ts
1529
+ init_esm_shims();
1530
+
1531
+ // src/domains/providers/runtimes/protocol/anthropic-messages.ts
1532
+ init_esm_shims();
1533
+ function synthesizeAnthropicMessagesModel(input) {
1534
+ return synthesizeCatalogBackedModel({
1535
+ target: input.target,
1536
+ wireModelId: input.wireModelId,
1537
+ kb: input.kb,
1538
+ defaultCapabilities: input.defaultCapabilities,
1539
+ runtimeId: "anthropic",
1540
+ api: "anthropic-messages",
1541
+ provider: input.provider,
1542
+ defaultBaseUrl: input.defaultBaseUrl
1543
+ });
1544
+ }
1545
+
1546
+ // src/domains/providers/runtimes/cloud/anthropic.ts
1547
+ var defaultCapabilities3 = {
1548
+ chat: true,
1549
+ tools: true,
1550
+ toolCallFormat: "anthropic",
1551
+ reasoning: true,
1552
+ thinkingFormat: "anthropic-extended",
1553
+ vision: true,
1554
+ audio: false,
1555
+ embeddings: false,
1556
+ rerank: false,
1557
+ fim: false,
1558
+ contextWindow: 2e5,
1559
+ maxTokens: 8192
1560
+ };
1561
+ var anthropicRuntime = {
1562
+ id: "anthropic",
1563
+ displayName: "Anthropic",
1564
+ kind: "http",
1565
+ tier: "cloud",
1566
+ apiFamily: "anthropic-messages",
1567
+ auth: "api-key",
1568
+ credentialsEnvVar: "ANTHROPIC_API_KEY",
1569
+ defaultCapabilities: defaultCapabilities3,
1570
+ synthesizeModel(target, wireModelId, kb) {
1571
+ return synthesizeAnthropicMessagesModel({
1572
+ target,
1573
+ wireModelId,
1574
+ kb,
1575
+ defaultCapabilities: defaultCapabilities3,
1576
+ provider: "anthropic",
1577
+ defaultBaseUrl: "https://api.anthropic.com"
1578
+ });
1579
+ }
1580
+ };
1581
+ var anthropic_default = anthropicRuntime;
1582
+
1583
+ // src/domains/providers/runtimes/cloud/anthropic-max.ts
1584
+ init_esm_shims();
1585
+ var defaultCapabilities4 = {
1586
+ chat: true,
1587
+ tools: true,
1588
+ toolCallFormat: "anthropic",
1589
+ reasoning: true,
1590
+ thinkingFormat: "anthropic-extended",
1591
+ vision: true,
1592
+ audio: false,
1593
+ embeddings: false,
1594
+ rerank: false,
1595
+ fim: false,
1596
+ contextWindow: 2e5,
1597
+ maxTokens: 8192
1598
+ };
1599
+ var anthropicMaxRuntime = {
1600
+ id: "anthropic-max",
1601
+ displayName: "Anthropic (Claude Pro/Max)",
1602
+ kind: "http",
1603
+ tier: "cloud",
1604
+ apiFamily: "anthropic-messages",
1605
+ auth: "oauth",
1606
+ oauthProviderId: "anthropic",
1607
+ authNotice: "Connects with your Claude Pro/Max subscription via OAuth (the same path Claude Code uses). Using subscription credentials outside Anthropic's first-party apps may not align with their terms of service; enable at your own discretion.",
1608
+ defaultCapabilities: defaultCapabilities4,
1609
+ async probeModels(_target, _ctx) {
1610
+ return listCatalogModelsForRuntime("anthropic-max").map((model) => model.id);
1611
+ },
1612
+ synthesizeModel(target, wireModelId, kb) {
1613
+ return synthesizeCatalogBackedModel({
1614
+ target,
1615
+ wireModelId,
1616
+ kb,
1617
+ defaultCapabilities: defaultCapabilities4,
1618
+ runtimeId: "anthropic-max",
1619
+ api: "anthropic-messages",
1620
+ provider: "anthropic",
1621
+ defaultBaseUrl: "https://api.anthropic.com"
1622
+ });
1623
+ }
1624
+ };
1625
+ var anthropic_max_default = anthropicMaxRuntime;
1626
+
1627
+ // src/domains/providers/runtimes/cloud/bedrock.ts
1628
+ init_esm_shims();
1629
+
1630
+ // src/domains/providers/runtimes/protocol/bedrock.ts
1631
+ init_esm_shims();
1632
+ function synthesizeBedrockModel(input) {
1633
+ return synthesizeCatalogBackedModel({
1634
+ target: input.target,
1635
+ wireModelId: input.wireModelId,
1636
+ kb: input.kb,
1637
+ defaultCapabilities: input.defaultCapabilities,
1638
+ runtimeId: "bedrock",
1639
+ api: "bedrock-converse-stream",
1640
+ provider: "amazon-bedrock",
1641
+ defaultBaseUrl: ""
1642
+ });
1643
+ }
1644
+
1645
+ // src/domains/providers/runtimes/cloud/bedrock.ts
1646
+ var defaultCapabilities5 = {
1647
+ chat: true,
1648
+ tools: true,
1649
+ toolCallFormat: "anthropic",
1650
+ reasoning: true,
1651
+ thinkingFormat: "anthropic-extended",
1652
+ vision: false,
1653
+ audio: false,
1654
+ embeddings: false,
1655
+ rerank: false,
1656
+ fim: false,
1657
+ contextWindow: 2e5,
1658
+ maxTokens: 8192
1659
+ };
1660
+ var bedrockRuntime = {
1661
+ id: "bedrock",
1662
+ displayName: "Amazon Bedrock",
1663
+ kind: "http",
1664
+ tier: "cloud",
1665
+ apiFamily: "bedrock-converse-stream",
1666
+ auth: "aws-sdk",
1667
+ defaultCapabilities: defaultCapabilities5,
1668
+ synthesizeModel(target, wireModelId, kb) {
1669
+ return synthesizeBedrockModel({ target, wireModelId, kb, defaultCapabilities: defaultCapabilities5 });
1670
+ }
1671
+ };
1672
+ var bedrock_default = bedrockRuntime;
1673
+
1674
+ // src/domains/providers/runtimes/cloud/deepseek.ts
1675
+ init_esm_shims();
1676
+ var defaultCapabilities6 = {
1677
+ chat: true,
1678
+ tools: true,
1679
+ toolCallFormat: "openai",
1680
+ reasoning: true,
1681
+ thinkingFormat: "deepseek-r1",
1682
+ vision: false,
1683
+ audio: false,
1684
+ embeddings: false,
1685
+ rerank: false,
1686
+ fim: false,
1687
+ contextWindow: 128e3,
1688
+ maxTokens: 65536
1689
+ };
1690
+ var deepseekRuntime = {
1691
+ id: "deepseek",
1692
+ displayName: "DeepSeek",
1693
+ kind: "http",
1694
+ tier: "cloud",
1695
+ apiFamily: "openai-completions",
1696
+ auth: "api-key",
1697
+ credentialsEnvVar: "DEEPSEEK_API_KEY",
1698
+ defaultCapabilities: defaultCapabilities6,
1699
+ async probeModels(_target, _ctx) {
1700
+ return listCatalogModelsForRuntime("deepseek").map((model) => model.id);
1701
+ },
1702
+ synthesizeModel(target, wireModelId, kb) {
1703
+ return synthesizeCatalogBackedModel({
1704
+ target,
1705
+ wireModelId,
1706
+ kb,
1707
+ defaultCapabilities: defaultCapabilities6,
1708
+ runtimeId: "deepseek",
1709
+ api: "openai-completions",
1710
+ provider: "deepseek",
1711
+ defaultBaseUrl: "https://api.deepseek.com"
1712
+ });
1713
+ }
1714
+ };
1715
+ var deepseek_default = deepseekRuntime;
1716
+
1717
+ // src/domains/providers/runtimes/cloud/google.ts
1718
+ init_esm_shims();
1719
+
1720
+ // src/domains/providers/runtimes/protocol/google.ts
1721
+ init_esm_shims();
1722
+ function synthesizeGoogleModel(input) {
1723
+ return synthesizeCatalogBackedModel({
1724
+ target: input.target,
1725
+ wireModelId: input.wireModelId,
1726
+ kb: input.kb,
1727
+ defaultCapabilities: input.defaultCapabilities,
1728
+ runtimeId: "google",
1729
+ api: "google-generative-ai",
1730
+ provider: "google",
1731
+ defaultBaseUrl: input.defaultBaseUrl
1732
+ });
1733
+ }
1734
+
1735
+ // src/domains/providers/runtimes/cloud/google.ts
1736
+ var defaultCapabilities7 = {
1737
+ chat: true,
1738
+ tools: true,
1739
+ toolCallFormat: "openai",
1740
+ reasoning: true,
1741
+ vision: true,
1742
+ audio: false,
1743
+ embeddings: false,
1744
+ rerank: false,
1745
+ fim: false,
1746
+ contextWindow: 2e6,
1747
+ maxTokens: 8192
1748
+ };
1749
+ var googleRuntime = {
1750
+ id: "google",
1751
+ displayName: "Google Generative AI",
1752
+ kind: "http",
1753
+ tier: "cloud",
1754
+ apiFamily: "google-generative-ai",
1755
+ auth: "api-key",
1756
+ credentialsEnvVar: "GOOGLE_API_KEY",
1757
+ defaultCapabilities: defaultCapabilities7,
1758
+ synthesizeModel(target, wireModelId, kb) {
1759
+ return synthesizeGoogleModel({
1760
+ target,
1761
+ wireModelId,
1762
+ kb,
1763
+ defaultCapabilities: defaultCapabilities7,
1764
+ defaultBaseUrl: "https://generativelanguage.googleapis.com/v1beta"
1765
+ });
1766
+ }
1767
+ };
1768
+ var google_default = googleRuntime;
1769
+
1770
+ // src/domains/providers/runtimes/cloud/groq.ts
1771
+ init_esm_shims();
1772
+ var defaultCapabilities8 = {
1773
+ chat: true,
1774
+ tools: true,
1775
+ toolCallFormat: "openai",
1776
+ reasoning: false,
1777
+ vision: false,
1778
+ audio: false,
1779
+ embeddings: false,
1780
+ rerank: false,
1781
+ fim: false,
1782
+ contextWindow: 128e3,
1783
+ maxTokens: 8192
1784
+ };
1785
+ var groqRuntime = {
1786
+ id: "groq",
1787
+ displayName: "Groq",
1788
+ kind: "http",
1789
+ tier: "cloud",
1790
+ apiFamily: "openai-completions",
1791
+ auth: "api-key",
1792
+ credentialsEnvVar: "GROQ_API_KEY",
1793
+ defaultCapabilities: defaultCapabilities8,
1794
+ synthesizeModel(target, wireModelId, kb) {
1795
+ return synthesizeCatalogBackedModel({
1796
+ target,
1797
+ wireModelId,
1798
+ kb,
1799
+ defaultCapabilities: defaultCapabilities8,
1800
+ runtimeId: "groq",
1801
+ api: "openai-completions",
1802
+ provider: "groq",
1803
+ defaultBaseUrl: "https://api.groq.com/openai/v1"
1804
+ });
1805
+ }
1806
+ };
1807
+ var groq_default = groqRuntime;
1808
+
1809
+ // src/domains/providers/runtimes/cloud/mistral.ts
1810
+ init_esm_shims();
1811
+ var defaultCapabilities9 = {
1812
+ chat: true,
1813
+ tools: true,
1814
+ toolCallFormat: "mistral",
1815
+ reasoning: false,
1816
+ vision: false,
1817
+ audio: false,
1818
+ embeddings: false,
1819
+ rerank: false,
1820
+ fim: false,
1821
+ contextWindow: 128e3,
1822
+ maxTokens: 8192
1823
+ };
1824
+ var mistralRuntime = {
1825
+ id: "mistral",
1826
+ displayName: "Mistral AI",
1827
+ kind: "http",
1828
+ tier: "cloud",
1829
+ apiFamily: "mistral-conversations",
1830
+ auth: "api-key",
1831
+ credentialsEnvVar: "MISTRAL_API_KEY",
1832
+ defaultCapabilities: defaultCapabilities9,
1833
+ synthesizeModel(target, wireModelId, kb) {
1834
+ return synthesizeCatalogBackedModel({
1835
+ target,
1836
+ wireModelId,
1837
+ kb,
1838
+ defaultCapabilities: defaultCapabilities9,
1839
+ runtimeId: "mistral",
1840
+ api: "mistral-conversations",
1841
+ provider: "mistral",
1842
+ defaultBaseUrl: "https://api.mistral.ai"
1843
+ });
1844
+ }
1845
+ };
1846
+ var mistral_default = mistralRuntime;
1847
+
1848
+ // src/domains/providers/runtimes/cloud/openai.ts
1849
+ init_esm_shims();
1850
+ var defaultCapabilities10 = {
1851
+ chat: true,
1852
+ tools: true,
1853
+ toolCallFormat: "openai",
1854
+ reasoning: true,
1855
+ vision: true,
1856
+ audio: false,
1857
+ embeddings: false,
1858
+ rerank: false,
1859
+ fim: false,
1860
+ contextWindow: 272e3,
1861
+ maxTokens: 16384
1862
+ };
1863
+ var openaiRuntime = {
1864
+ id: "openai",
1865
+ displayName: "OpenAI",
1866
+ kind: "http",
1867
+ tier: "cloud",
1868
+ apiFamily: "openai-responses",
1869
+ auth: "api-key",
1870
+ credentialsEnvVar: "OPENAI_API_KEY",
1871
+ defaultCapabilities: defaultCapabilities10,
1872
+ synthesizeModel(target, wireModelId, kb) {
1873
+ return synthesizeCatalogBackedModel({
1874
+ target,
1875
+ wireModelId,
1876
+ kb,
1877
+ defaultCapabilities: defaultCapabilities10,
1878
+ runtimeId: "openai",
1879
+ api: "openai-responses",
1880
+ provider: "openai",
1881
+ defaultBaseUrl: "https://api.openai.com/v1"
1882
+ });
1883
+ }
1884
+ };
1885
+ var openai_default = openaiRuntime;
1886
+
1887
+ // src/domains/providers/runtimes/cloud/openai-codex.ts
1888
+ init_esm_shims();
1889
+ var defaultCapabilities11 = {
1890
+ chat: true,
1891
+ tools: true,
1892
+ toolCallFormat: "openai",
1893
+ reasoning: true,
1894
+ thinkingFormat: "openai-codex",
1895
+ vision: true,
1896
+ audio: false,
1897
+ embeddings: false,
1898
+ rerank: false,
1899
+ fim: false,
1900
+ contextWindow: 272e3,
1901
+ maxTokens: 16384
1902
+ };
1903
+ var openaiCodexRuntime = {
1904
+ id: "openai-codex",
1905
+ displayName: "OpenAI Codex",
1906
+ kind: "http",
1907
+ tier: "cloud",
1908
+ apiFamily: "openai-codex-responses",
1909
+ auth: "oauth",
1910
+ defaultCapabilities: defaultCapabilities11,
1911
+ async probeModels(_target, _ctx) {
1912
+ return listCatalogModelsForRuntime("openai-codex").map((model) => model.id);
1913
+ },
1914
+ synthesizeModel(target, wireModelId, kb) {
1915
+ return synthesizeCatalogBackedModel({
1916
+ target,
1917
+ wireModelId,
1918
+ kb,
1919
+ defaultCapabilities: defaultCapabilities11,
1920
+ runtimeId: "openai-codex",
1921
+ api: "openai-codex-responses",
1922
+ provider: "openai-codex",
1923
+ defaultBaseUrl: "https://chatgpt.com/backend-api"
1924
+ });
1925
+ }
1926
+ };
1927
+ var openai_codex_default = openaiCodexRuntime;
1928
+
1929
+ // src/domains/providers/runtimes/cloud/openrouter.ts
1930
+ init_esm_shims();
1931
+ var OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
1932
+ var OPENROUTER_HEADERS = {
1933
+ "HTTP-Referer": "https://github.com/iowarp/clio-coder",
1934
+ "X-OpenRouter-Title": "Clio Coder"
1935
+ };
1936
+ var defaultCapabilities12 = {
1937
+ chat: true,
1938
+ tools: true,
1939
+ toolCallFormat: "openai",
1940
+ reasoning: false,
1941
+ thinkingFormat: "openrouter",
1942
+ vision: false,
1943
+ audio: false,
1944
+ embeddings: false,
1945
+ rerank: false,
1946
+ fim: false,
1947
+ contextWindow: 128e3,
1948
+ maxTokens: 8192
1949
+ };
1950
+ function trimTrailingSlash2(value) {
1951
+ return value.endsWith("/") && value.length > 1 ? value.slice(0, -1) : value;
1952
+ }
1953
+ function targetBaseUrl2(target) {
1954
+ return trimTrailingSlash2(target.url ?? OPENROUTER_BASE_URL);
1955
+ }
1956
+ function modelsUrl(target) {
1957
+ return `${targetBaseUrl2(target)}/models`;
1958
+ }
1959
+ function probeHeaders(target, ctx) {
1960
+ const headers = { ...OPENROUTER_HEADERS, ...target.auth?.headers ?? {} };
1961
+ const envName = target.auth?.apiKeyEnvVar ?? "OPENROUTER_API_KEY";
1962
+ if (ctx.credentialsPresent.has(envName)) {
1963
+ const key = process.env[envName]?.trim();
1964
+ if (key) headers.authorization = `Bearer ${key}`;
1965
+ }
1966
+ return headers;
1967
+ }
1968
+ async function fetchModels(target, ctx) {
1969
+ const opts = {
1970
+ url: modelsUrl(target),
1971
+ timeoutMs: ctx.httpTimeoutMs,
1972
+ headers: probeHeaders(target, ctx)
1973
+ };
1974
+ const result = await (ctx.signal ? probeJson({ ...opts, signal: ctx.signal }) : probeJson(opts));
1975
+ if (!result.ok) return result;
1976
+ const models = (result.data?.data ?? []).map((row) => typeof row?.id === "string" ? row.id : null).filter((id) => id !== null);
1977
+ const out = { ok: true, models };
1978
+ if (result.latencyMs !== void 0) out.latencyMs = result.latencyMs;
1979
+ const configured = target.defaultModel?.trim();
1980
+ if (configured && models.length > 0 && !models.includes(configured)) {
1981
+ out.ok = false;
1982
+ out.error = `configured model '${configured}' was not returned by OpenRouter`;
1983
+ }
1984
+ return out;
1985
+ }
1986
+ var openrouterRuntime = {
1987
+ id: "openrouter",
1988
+ displayName: "OpenRouter",
1989
+ kind: "http",
1990
+ tier: "cloud",
1991
+ // Runtime fallback and explicit-URL contract; dispatch uses each synthesized model.api.
1992
+ apiFamily: "openai-completions",
1993
+ auth: "api-key",
1994
+ credentialsEnvVar: "OPENROUTER_API_KEY",
1995
+ defaultCapabilities: defaultCapabilities12,
1996
+ probe(target, ctx) {
1997
+ return fetchModels(target, ctx);
1998
+ },
1999
+ async probeModels(target, ctx) {
2000
+ const result = await fetchModels(target, ctx);
2001
+ return result.ok && result.models ? [...result.models] : [];
2002
+ },
2003
+ synthesizeModel(target, wireModelId, kb) {
2004
+ return synthesizeCatalogBackedModel({
2005
+ target,
2006
+ wireModelId,
2007
+ kb,
2008
+ defaultCapabilities: defaultCapabilities12,
2009
+ runtimeId: "openrouter",
2010
+ api: "openai-completions",
2011
+ preferCatalogTransport: true,
2012
+ provider: "openrouter",
2013
+ defaultBaseUrl: OPENROUTER_BASE_URL,
2014
+ defaultHeaders: OPENROUTER_HEADERS
2015
+ });
2016
+ }
2017
+ };
2018
+ var openrouter_default = openrouterRuntime;
2019
+
2020
+ // src/domains/providers/runtimes/local-native/lemonade-anthropic.ts
2021
+ init_esm_shims();
2022
+
2023
+ // src/domains/providers/runtimes/protocol/anthropic-compat.ts
2024
+ init_esm_shims();
2025
+ function synthesizeAnthropicCompatModel(input) {
2026
+ return synthLocalModel({
2027
+ target: input.target,
2028
+ wireModelId: input.wireModelId,
2029
+ kb: input.kb,
2030
+ defaultCapabilities: input.defaultCapabilities,
2031
+ apiFamily: "anthropic-messages",
2032
+ provider: input.provider,
2033
+ baseUrlForTarget: input.baseUrlForTarget ?? withAsIs
2034
+ });
2035
+ }
2036
+ function makeAnthropicCompatRuntime(spec) {
2037
+ const messagesPath = spec.messagesPath ?? "/v1/messages";
2038
+ const modelsPath = spec.modelsPath ?? "/v1/models";
2039
+ const headers = (target, ctx) => ({
2040
+ "anthropic-version": "2023-06-01",
2041
+ ...ctx.authToken ? { "x-api-key": ctx.authToken } : {},
2042
+ ...target.auth?.headers
2043
+ });
2044
+ return {
2045
+ id: spec.id,
2046
+ displayName: spec.displayName,
2047
+ kind: "http",
2048
+ tier: spec.tier,
2049
+ apiFamily: "anthropic-messages",
2050
+ auth: spec.auth,
2051
+ defaultCapabilities: spec.defaultCapabilities,
2052
+ ...spec.hidden === true ? { hidden: true } : {},
2053
+ async probe(target, ctx) {
2054
+ const base = targetBaseUrl(target);
2055
+ if (!base) return { ok: false, error: "target has no url" };
2056
+ return probeUrl(`${base}${messagesPath}`, ctx, "HEAD", headers(target, ctx));
2057
+ },
2058
+ async probeModels(target, ctx) {
2059
+ const base = targetBaseUrl(target);
2060
+ if (!base) return [];
2061
+ return probeOpenAIModels(base, ctx, modelsPath, headers(target, ctx));
2062
+ },
2063
+ synthesizeModel(target, wireModelId, kb) {
2064
+ return synthesizeAnthropicCompatModel({
2065
+ target,
2066
+ wireModelId,
2067
+ kb,
2068
+ defaultCapabilities: spec.defaultCapabilities,
2069
+ provider: spec.provider
2070
+ });
2071
+ }
2072
+ };
2073
+ }
2074
+ var defaultCapabilities13 = {
2075
+ chat: true,
2076
+ tools: true,
2077
+ toolCallFormat: "anthropic",
2078
+ reasoning: false,
2079
+ vision: false,
2080
+ audio: false,
2081
+ embeddings: false,
2082
+ rerank: false,
2083
+ fim: false,
2084
+ contextWindow: CLIO_MIN_CONTEXT_WINDOW,
2085
+ maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
2086
+ };
2087
+ var anthropic_compat_default = makeAnthropicCompatRuntime({
2088
+ id: "anthropic-compat",
2089
+ displayName: "Generic Anthropic-compatible",
2090
+ provider: "anthropic-compat",
2091
+ auth: "api-key",
2092
+ tier: "protocol",
2093
+ defaultCapabilities: defaultCapabilities13
2094
+ });
2095
+
2096
+ // src/domains/providers/runtimes/local-native/lemonade-anthropic.ts
2097
+ var defaultCapabilities14 = {
2098
+ chat: true,
2099
+ tools: true,
2100
+ toolCallFormat: "anthropic",
2101
+ reasoning: false,
2102
+ vision: false,
2103
+ audio: false,
2104
+ embeddings: false,
2105
+ rerank: false,
2106
+ fim: false,
2107
+ contextWindow: CLIO_MIN_CONTEXT_WINDOW,
2108
+ maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
2109
+ };
2110
+ var lemonade_anthropic_default = makeAnthropicCompatRuntime({
2111
+ id: "lemonade-anthropic",
2112
+ displayName: "Lemonade (Anthropic-compat)",
2113
+ provider: "lemonade",
2114
+ auth: "api-key",
2115
+ tier: "local-native",
2116
+ defaultCapabilities: defaultCapabilities14,
2117
+ hidden: true
2118
+ });
2119
+
2120
+ // src/domains/providers/runtimes/local-native/lemonade-openai.ts
2121
+ init_esm_shims();
2122
+ var defaultCapabilities15 = {
2123
+ chat: true,
2124
+ tools: true,
2125
+ toolCallFormat: "openai",
2126
+ reasoning: false,
2127
+ vision: false,
2128
+ audio: false,
2129
+ embeddings: false,
2130
+ rerank: false,
2131
+ fim: false,
2132
+ contextWindow: CLIO_MIN_CONTEXT_WINDOW,
2133
+ maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
2134
+ };
2135
+ var lemonade_openai_default = makeOpenAICompatRuntime({
2136
+ id: "lemonade",
2137
+ displayName: "Lemonade (OpenAI-compat)",
2138
+ provider: "lemonade",
2139
+ auth: "api-key",
2140
+ tier: "local-native",
2141
+ defaultCapabilities: defaultCapabilities15
2142
+ });
2143
+
2144
+ // src/domains/providers/runtimes/local-native/llamacpp.ts
2145
+ init_esm_shims();
2146
+ var defaultCapabilities16 = {
2147
+ chat: true,
2148
+ tools: true,
2149
+ toolCallFormat: "openai",
2150
+ structuredOutputs: "json-schema",
2151
+ reasoning: false,
2152
+ vision: false,
2153
+ audio: false,
2154
+ embeddings: false,
2155
+ rerank: false,
2156
+ fim: false,
2157
+ contextWindow: CLIO_MIN_CONTEXT_WINDOW,
2158
+ maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
2159
+ };
2160
+ function targetUrl(target) {
2161
+ return targetRootUrl(target);
2162
+ }
2163
+ var llamacppRuntime = {
2164
+ id: "llamacpp",
2165
+ displayName: "llama.cpp",
2166
+ kind: "http",
2167
+ tier: "local-native",
2168
+ apiFamily: "openai-completions",
2169
+ auth: "api-key",
2170
+ defaultCapabilities: defaultCapabilities16,
2171
+ async probe(target, ctx) {
2172
+ const base = targetUrl(target);
2173
+ if (!base) return { ok: false, error: "target has no url" };
2174
+ const healthOpts = { url: `${base}/health`, timeoutMs: ctx.httpTimeoutMs };
2175
+ const health = await (ctx.signal ? probeHttp({ ...healthOpts, signal: ctx.signal }) : probeHttp(healthOpts));
2176
+ if (!health.ok) return health;
2177
+ const status = await probeLlamaCppModelStatus(base, target, ctx);
2178
+ const resident = status.loadState === void 0 || status.loadState === "loaded";
2179
+ const props = await probeLlamaCppProps(base, ctx, resident ? status.modelId ?? target.defaultModel : void 0);
2180
+ const catalog = await probeOpenAIModelCatalog(base, ctx);
2181
+ const result = { ok: true };
2182
+ if (catalog.models.length > 0) result.models = catalog.models;
2183
+ if (Object.keys(catalog.modelCapabilities).length > 0) result.modelCapabilities = catalog.modelCapabilities;
2184
+ if (Object.keys(catalog.modelStates).length > 0) result.modelStates = catalog.modelStates;
2185
+ if (typeof health.latencyMs === "number") result.latencyMs = health.latencyMs;
2186
+ const discoveredCapabilities = {
2187
+ ...props.discoveredCapabilities ?? {},
2188
+ ...status.discoveredCapabilities ?? {},
2189
+ ...props.discoveredCapabilities?.parallelSlots !== void 0 ? { parallelSlots: props.discoveredCapabilities.parallelSlots } : {}
2190
+ };
2191
+ if (Object.keys(discoveredCapabilities).length > 0) {
2192
+ result.discoveredCapabilities = discoveredCapabilities;
2193
+ if (status.modelId) result.capabilityModelId = status.modelId;
2194
+ }
2195
+ if (props.serverVersion) result.serverVersion = props.serverVersion;
2196
+ const note = await detectModelMismatch(base, target, ctx);
2197
+ const notes = [...status.notes ?? [], ...note ? [note] : []];
2198
+ if (notes.length > 0) result.notes = notes;
2199
+ if (status.cacheAdvisories && status.cacheAdvisories.length > 0) result.cacheAdvisories = status.cacheAdvisories;
2200
+ return result;
2201
+ },
2202
+ async probeModels(target, ctx) {
2203
+ const base = targetUrl(target);
2204
+ if (!base) return [];
2205
+ return probeOpenAIModels(base, ctx);
2206
+ },
2207
+ synthesizeModel(target, wireModelId, kb) {
2208
+ return synthLocalModel({
2209
+ target,
2210
+ wireModelId,
2211
+ kb,
2212
+ defaultCapabilities: defaultCapabilities16,
2213
+ apiFamily: "openai-completions",
2214
+ provider: "llamacpp",
2215
+ baseUrlForTarget: withV1
2216
+ });
2217
+ }
2218
+ };
2219
+ var llamacpp_default = llamacppRuntime;
2220
+
2221
+ // src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts
2222
+ init_esm_shims();
2223
+ var defaultCapabilities17 = {
2224
+ chat: true,
2225
+ tools: true,
2226
+ toolCallFormat: "anthropic",
2227
+ reasoning: false,
2228
+ vision: false,
2229
+ audio: false,
2230
+ embeddings: false,
2231
+ rerank: false,
2232
+ fim: true,
2233
+ contextWindow: CLIO_MIN_CONTEXT_WINDOW,
2234
+ maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
2235
+ };
2236
+ function url(target) {
2237
+ return target.url ? stripTrailingSlash(target.url) : null;
2238
+ }
2239
+ var llamacppAnthropicRuntime = {
2240
+ id: "llamacpp-anthropic",
2241
+ displayName: "llama.cpp (Anthropic-compat)",
2242
+ kind: "http",
2243
+ tier: "local-native",
2244
+ apiFamily: "anthropic-messages",
2245
+ auth: "api-key",
2246
+ defaultCapabilities: defaultCapabilities17,
2247
+ hidden: true,
2248
+ async probe(target, ctx) {
2249
+ const base = url(target);
2250
+ if (!base) return { ok: false, error: "target has no url" };
2251
+ const healthOpts = { url: `${base}/health`, timeoutMs: ctx.httpTimeoutMs };
2252
+ const health = await (ctx.signal ? probeHttp({ ...healthOpts, signal: ctx.signal }) : probeHttp(healthOpts));
2253
+ if (!health.ok) return health;
2254
+ const headOpts = {
2255
+ url: `${base}/v1/messages`,
2256
+ method: "HEAD",
2257
+ timeoutMs: ctx.httpTimeoutMs
2258
+ };
2259
+ const head = await (ctx.signal ? probeHttp({ ...headOpts, signal: ctx.signal }) : probeHttp(headOpts));
2260
+ if (!head.ok) return head;
2261
+ const props = await probeLlamaCppProps(base, ctx, target.defaultModel);
2262
+ const enriched = { ...head };
2263
+ if (props.discoveredCapabilities) enriched.discoveredCapabilities = props.discoveredCapabilities;
2264
+ if (props.serverVersion) enriched.serverVersion = props.serverVersion;
2265
+ const note = await detectModelMismatch(base, target, ctx);
2266
+ if (note) enriched.notes = [note];
2267
+ return enriched;
2268
+ },
2269
+ async probeModels(target, ctx) {
2270
+ const base = url(target);
2271
+ if (!base) return [];
2272
+ const opts = { url: `${base}/v1/models`, timeoutMs: ctx.httpTimeoutMs };
2273
+ const result = await (ctx.signal ? probeJson({ ...opts, signal: ctx.signal }) : probeJson(opts));
2274
+ if (!result.ok || !result.data?.data) return [];
2275
+ return result.data.data.map((row) => typeof row?.id === "string" ? row.id : null).filter((id) => id !== null);
2276
+ },
2277
+ synthesizeModel(target, wireModelId, kb) {
2278
+ return synthLocalModel({
2279
+ target,
2280
+ wireModelId,
2281
+ kb,
2282
+ defaultCapabilities: defaultCapabilities17,
2283
+ apiFamily: "anthropic-messages",
2284
+ provider: "llamacpp",
2285
+ baseUrlForTarget: withAsIs
2286
+ });
2287
+ }
2288
+ };
2289
+ var llamacpp_anthropic_default = llamacppAnthropicRuntime;
2290
+
2291
+ // src/domains/providers/runtimes/local-native/llamacpp-completion.ts
2292
+ init_esm_shims();
2293
+ var defaultCapabilities18 = {
2294
+ chat: false,
2295
+ tools: false,
2296
+ reasoning: false,
2297
+ vision: false,
2298
+ audio: false,
2299
+ embeddings: false,
2300
+ rerank: false,
2301
+ fim: true,
2302
+ structuredOutputs: "gbnf",
2303
+ contextWindow: 8192,
2304
+ maxTokens: 4096
2305
+ };
2306
+ function targetUrl2(target) {
2307
+ return targetRootUrl(target);
2308
+ }
2309
+ function parseChunk(raw) {
2310
+ const chunk = {
2311
+ content: typeof raw.content === "string" ? raw.content : "",
2312
+ stop: raw.stop === true
2313
+ };
2314
+ if (raw.stop_type === "eos" || raw.stop_type === "limit" || raw.stop_type === "word" || raw.stop_type === "none") {
2315
+ chunk.stop_type = raw.stop_type;
2316
+ }
2317
+ if (typeof raw.tokens_predicted === "number") chunk.tokens_predicted = raw.tokens_predicted;
2318
+ if (typeof raw.tokens_evaluated === "number") chunk.tokens_evaluated = raw.tokens_evaluated;
2319
+ return chunk;
2320
+ }
2321
+ async function* streamSse(body) {
2322
+ const reader = body.getReader();
2323
+ const decoder = new TextDecoder("utf-8");
2324
+ let buffered = "";
2325
+ let droppedFrames = 0;
2326
+ try {
2327
+ while (true) {
2328
+ const { done, value } = await reader.read();
2329
+ if (done) break;
2330
+ buffered += decoder.decode(value, { stream: true });
2331
+ let nl = buffered.indexOf("\n");
2332
+ while (nl !== -1) {
2333
+ const line = buffered.slice(0, nl).trimEnd();
2334
+ buffered = buffered.slice(nl + 1);
2335
+ nl = buffered.indexOf("\n");
2336
+ if (line.length === 0) continue;
2337
+ const payload = line.startsWith("data:") ? line.slice(5).trim() : line;
2338
+ if (payload.length === 0 || payload === "[DONE]") continue;
2339
+ try {
2340
+ const parsed = JSON.parse(payload);
2341
+ const chunk = parseChunk(parsed);
2342
+ yield chunk;
2343
+ if (chunk.stop) return;
2344
+ } catch {
2345
+ droppedFrames += 1;
2346
+ }
2347
+ }
2348
+ }
2349
+ const tail = buffered.trim();
2350
+ if (tail.length > 0) {
2351
+ const payload = tail.startsWith("data:") ? tail.slice(5).trim() : tail;
2352
+ if (payload !== "[DONE]") {
2353
+ try {
2354
+ const parsed = JSON.parse(payload);
2355
+ yield parseChunk(parsed);
2356
+ } catch {
2357
+ droppedFrames += 1;
2358
+ }
2359
+ }
2360
+ }
2361
+ } finally {
2362
+ if (droppedFrames > 0) {
2363
+ writeDiagnostic(`[clio-coder:llamacpp] dropped ${droppedFrames} malformed stream frame(s)
2364
+ `);
2365
+ }
2366
+ reader.releaseLock();
2367
+ }
2368
+ }
2369
+ async function postStream(url2, body, signal) {
2370
+ const init = {
2371
+ method: "POST",
2372
+ headers: { "content-type": "application/json", accept: "text/event-stream" },
2373
+ body: JSON.stringify(body)
2374
+ };
2375
+ if (signal) init.signal = signal;
2376
+ const response = await fetch(url2, init);
2377
+ if (!response.ok || !response.body) {
2378
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
2379
+ }
2380
+ return response.body;
2381
+ }
2382
+ function buildCompleteBody(opts) {
2383
+ const body = { prompt: opts.prompt, stream: true };
2384
+ if (opts.n_predict !== void 0) body.n_predict = opts.n_predict;
2385
+ if (opts.stop && opts.stop.length > 0) body.stop = opts.stop;
2386
+ if (opts.grammar) body.grammar = opts.grammar;
2387
+ if (opts.json_schema) body.json_schema = opts.json_schema;
2388
+ if (opts.cache_prompt !== void 0) body.cache_prompt = opts.cache_prompt;
2389
+ return body;
2390
+ }
2391
+ function buildInfillBody(opts) {
2392
+ const body = buildCompleteBody(opts);
2393
+ body.input_prefix = opts.input_prefix;
2394
+ body.input_suffix = opts.input_suffix;
2395
+ if (opts.input_extra) body.input_extra = opts.input_extra;
2396
+ return body;
2397
+ }
2398
+ var llamacppCompletionRuntime = {
2399
+ id: "llamacpp-completion",
2400
+ displayName: "llama.cpp (completion / infill)",
2401
+ kind: "http",
2402
+ tier: "local-native",
2403
+ apiFamily: "openai-completions",
2404
+ auth: "api-key",
2405
+ defaultCapabilities: defaultCapabilities18,
2406
+ hidden: true,
2407
+ async probe(target, ctx) {
2408
+ const base = targetUrl2(target);
2409
+ if (!base) return { ok: false, error: "target has no url" };
2410
+ const healthOpts = { url: `${base}/health`, timeoutMs: ctx.httpTimeoutMs };
2411
+ const health = await (ctx.signal ? probeHttp({ ...healthOpts, signal: ctx.signal }) : probeHttp(healthOpts));
2412
+ if (!health.ok) return health;
2413
+ const props = await probeLlamaCppProps(base, ctx, target.defaultModel);
2414
+ const status = await probeLlamaCppModelStatus(base, target, ctx);
2415
+ const enriched = { ...health };
2416
+ const discoveredCapabilities = {
2417
+ ...props.discoveredCapabilities ?? {},
2418
+ ...status.discoveredCapabilities ?? {}
2419
+ };
2420
+ if (Object.keys(discoveredCapabilities).length > 0) {
2421
+ enriched.discoveredCapabilities = discoveredCapabilities;
2422
+ if (status.modelId) enriched.capabilityModelId = status.modelId;
2423
+ }
2424
+ if (props.serverVersion) enriched.serverVersion = props.serverVersion;
2425
+ const note = await detectModelMismatch(base, target, ctx);
2426
+ const notes = [...status.notes ?? [], ...note ? [note] : []];
2427
+ if (notes.length > 0) enriched.notes = notes;
2428
+ if (status.cacheAdvisories && status.cacheAdvisories.length > 0) enriched.cacheAdvisories = status.cacheAdvisories;
2429
+ return enriched;
2430
+ },
2431
+ async probeModels(target, ctx) {
2432
+ const base = targetUrl2(target);
2433
+ if (!base) return [];
2434
+ return probeOpenAIModels(base, ctx);
2435
+ },
2436
+ synthesizeModel(target, wireModelId, kb) {
2437
+ return synthLocalModel({
2438
+ target,
2439
+ wireModelId,
2440
+ kb,
2441
+ defaultCapabilities: defaultCapabilities18,
2442
+ apiFamily: "openai-completions",
2443
+ provider: "llamacpp",
2444
+ baseUrlForTarget: withV1
2445
+ });
2446
+ },
2447
+ async *complete(target, opts) {
2448
+ const base = targetUrl2(target);
2449
+ if (!base) throw new Error("target has no url");
2450
+ const body = await postStream(`${base}/completion`, buildCompleteBody(opts), opts.signal);
2451
+ for await (const chunk of streamSse(body)) yield chunk;
2452
+ },
2453
+ async *infill(target, opts) {
2454
+ const base = targetUrl2(target);
2455
+ if (!base) throw new Error("target has no url");
2456
+ const body = await postStream(`${base}/infill`, buildInfillBody(opts), opts.signal);
2457
+ for await (const chunk of streamSse(body)) yield chunk;
2458
+ }
2459
+ };
2460
+ var llamacpp_completion_default = llamacppCompletionRuntime;
2461
+
2462
+ // src/domains/providers/runtimes/local-native/llamacpp-embed.ts
2463
+ init_esm_shims();
2464
+ var defaultCapabilities19 = {
2465
+ chat: false,
2466
+ tools: false,
2467
+ reasoning: false,
2468
+ vision: false,
2469
+ audio: false,
2470
+ embeddings: true,
2471
+ rerank: false,
2472
+ fim: false,
2473
+ contextWindow: 8192,
2474
+ maxTokens: 0
2475
+ };
2476
+ function targetUrl3(target) {
2477
+ return targetRootUrl(target);
2478
+ }
2479
+ function meanPool(matrix) {
2480
+ if (matrix.length === 0) return [];
2481
+ const dim = matrix[0]?.length ?? 0;
2482
+ const sum = new Array(dim).fill(0);
2483
+ for (const row of matrix) {
2484
+ for (let i = 0; i < dim; i++) sum[i] = (sum[i] ?? 0) + (row[i] ?? 0);
2485
+ }
2486
+ return sum.map((v) => v / matrix.length);
2487
+ }
2488
+ function flattenNativeEmbedding(entry) {
2489
+ const value = entry.embedding;
2490
+ if (!value || value.length === 0) return [];
2491
+ if (Array.isArray(value[0])) return meanPool(value);
2492
+ return value;
2493
+ }
2494
+ var llamacppEmbedRuntime = {
2495
+ id: "llamacpp-embed",
2496
+ displayName: "llama.cpp (embeddings)",
2497
+ kind: "http",
2498
+ tier: "local-native",
2499
+ apiFamily: "openai-completions",
2500
+ auth: "api-key",
2501
+ defaultCapabilities: defaultCapabilities19,
2502
+ hidden: true,
2503
+ async probe(target, ctx) {
2504
+ const base = targetUrl3(target);
2505
+ if (!base) return { ok: false, error: "target has no url" };
2506
+ const healthOpts = { url: `${base}/health`, timeoutMs: ctx.httpTimeoutMs };
2507
+ const health = await (ctx.signal ? probeHttp({ ...healthOpts, signal: ctx.signal }) : probeHttp(healthOpts));
2508
+ if (!health.ok) return health;
2509
+ const props = await probeLlamaCppProps(base, ctx);
2510
+ const result = {
2511
+ ok: true,
2512
+ notes: ["Embedding inference not qualified: discovery read health and metadata only."]
2513
+ };
2514
+ if (health.latencyMs !== void 0) result.latencyMs = health.latencyMs;
2515
+ if (props.discoveredCapabilities) result.discoveredCapabilities = props.discoveredCapabilities;
2516
+ if (props.serverVersion) result.serverVersion = props.serverVersion;
2517
+ return result;
2518
+ },
2519
+ async probeModels(target, ctx) {
2520
+ const base = targetUrl3(target);
2521
+ if (!base) return [];
2522
+ return probeOpenAIModels(base, ctx);
2523
+ },
2524
+ synthesizeModel(target, wireModelId, kb) {
2525
+ return synthLocalModel({
2526
+ target,
2527
+ wireModelId,
2528
+ kb,
2529
+ defaultCapabilities: defaultCapabilities19,
2530
+ apiFamily: "openai-completions",
2531
+ provider: "llamacpp",
2532
+ baseUrlForTarget: withV1
2533
+ });
2534
+ },
2535
+ async embed(target, input, ctx) {
2536
+ const base = targetUrl3(target);
2537
+ if (!base) throw new Error("target has no url");
2538
+ const modelId = target.defaultModel ?? "default";
2539
+ const inputs = Array.isArray(input) ? input : [input];
2540
+ const oai = await probeJson({
2541
+ url: `${base}/v1/embeddings`,
2542
+ method: "POST",
2543
+ timeoutMs: ctx.httpTimeoutMs,
2544
+ headers: { "content-type": "application/json" },
2545
+ body: JSON.stringify({ input: inputs, model: modelId, encoding_format: "float" }),
2546
+ ...ctx.signal ? { signal: ctx.signal } : {}
2547
+ });
2548
+ if (oai.ok && oai.data && Array.isArray(oai.data.data)) {
2549
+ const rows = oai.data.data;
2550
+ const sorted = [...rows].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
2551
+ const vectors2 = sorted.map((row) => row.embedding ?? []);
2552
+ const tokens = oai.data.usage?.total_tokens ?? oai.data.usage?.prompt_tokens ?? void 0;
2553
+ const dim = vectors2[0]?.length ?? 0;
2554
+ const result = {
2555
+ vectors: vectors2,
2556
+ model: oai.data.model ?? modelId,
2557
+ dimensions: dim
2558
+ };
2559
+ if (tokens !== void 0) result.tokensUsed = tokens;
2560
+ return result;
2561
+ }
2562
+ if (oai.status === void 0 || ![404, 405, 501].includes(oai.status)) {
2563
+ throw new Error(`llama.cpp embedding failed: ${oai.error ?? "invalid OAI embedding response"}`);
2564
+ }
2565
+ if (ctx.signal?.aborted) throw new Error("llama.cpp embedding failed: aborted by caller");
2566
+ const probeOpts = { url: `${base}/embedding`, timeoutMs: ctx.httpTimeoutMs };
2567
+ const native = await (ctx.signal ? probeJson({
2568
+ ...probeOpts,
2569
+ method: "POST",
2570
+ body: JSON.stringify({ content: inputs }),
2571
+ headers: { "content-type": "application/json" },
2572
+ signal: ctx.signal
2573
+ }) : probeJson({
2574
+ ...probeOpts,
2575
+ method: "POST",
2576
+ body: JSON.stringify({ content: inputs }),
2577
+ headers: { "content-type": "application/json" }
2578
+ }));
2579
+ if (!native.ok || !native.data) {
2580
+ throw new Error(`llama.cpp embedding failed: ${native.error ?? "unknown"}`);
2581
+ }
2582
+ const items = native.data;
2583
+ items.sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
2584
+ const vectors = items.map(flattenNativeEmbedding);
2585
+ return {
2586
+ vectors,
2587
+ model: modelId,
2588
+ dimensions: vectors[0]?.length ?? 0
2589
+ };
2590
+ }
2591
+ };
2592
+ var llamacpp_embed_default = llamacppEmbedRuntime;
2593
+
2594
+ // src/domains/providers/runtimes/local-native/llamacpp-rerank.ts
2595
+ init_esm_shims();
2596
+ var defaultCapabilities20 = {
2597
+ chat: false,
2598
+ tools: false,
2599
+ reasoning: false,
2600
+ vision: false,
2601
+ audio: false,
2602
+ embeddings: false,
2603
+ rerank: true,
2604
+ fim: false,
2605
+ contextWindow: 8192,
2606
+ maxTokens: 0
2607
+ };
2608
+ function targetUrl4(target) {
2609
+ return targetRootUrl(target);
2610
+ }
2611
+ var llamacppRerankRuntime = {
2612
+ id: "llamacpp-rerank",
2613
+ displayName: "llama.cpp (rerank)",
2614
+ kind: "http",
2615
+ tier: "local-native",
2616
+ apiFamily: "openai-completions",
2617
+ auth: "api-key",
2618
+ defaultCapabilities: defaultCapabilities20,
2619
+ hidden: true,
2620
+ async probe(target, ctx) {
2621
+ const base = targetUrl4(target);
2622
+ if (!base) return { ok: false, error: "target has no url" };
2623
+ const healthOpts = { url: `${base}/health`, timeoutMs: ctx.httpTimeoutMs };
2624
+ const health = await (ctx.signal ? probeHttp({ ...healthOpts, signal: ctx.signal }) : probeHttp(healthOpts));
2625
+ if (!health.ok) return health;
2626
+ const props = await probeLlamaCppProps(base, ctx);
2627
+ const result = {
2628
+ ok: true,
2629
+ notes: ["Reranking inference not qualified: discovery read health and metadata only."]
2630
+ };
2631
+ if (health.latencyMs !== void 0) result.latencyMs = health.latencyMs;
2632
+ if (props.discoveredCapabilities) result.discoveredCapabilities = props.discoveredCapabilities;
2633
+ if (props.serverVersion) result.serverVersion = props.serverVersion;
2634
+ return result;
2635
+ },
2636
+ async probeModels(target, ctx) {
2637
+ const base = targetUrl4(target);
2638
+ if (!base) return [];
2639
+ return probeOpenAIModels(base, ctx);
2640
+ },
2641
+ synthesizeModel(target, wireModelId, kb) {
2642
+ return synthLocalModel({
2643
+ target,
2644
+ wireModelId,
2645
+ kb,
2646
+ defaultCapabilities: defaultCapabilities20,
2647
+ apiFamily: "openai-completions",
2648
+ provider: "llamacpp",
2649
+ baseUrlForTarget: withV1
2650
+ });
2651
+ },
2652
+ async rerank(target, query, documents, ctx) {
2653
+ const base = targetUrl4(target);
2654
+ if (!base) throw new Error("target has no url");
2655
+ const modelId = target.defaultModel ?? "default";
2656
+ const req = {
2657
+ url: `${base}/reranking`,
2658
+ method: "POST",
2659
+ timeoutMs: ctx.httpTimeoutMs,
2660
+ headers: { "content-type": "application/json" },
2661
+ body: JSON.stringify({
2662
+ query,
2663
+ documents,
2664
+ top_n: documents.length,
2665
+ model: modelId
2666
+ })
2667
+ };
2668
+ const result = await (ctx.signal ? probeJson({ ...req, signal: ctx.signal }) : probeJson(req));
2669
+ if (!result.ok || !result.data) {
2670
+ throw new Error(`llama.cpp rerank failed: ${result.error ?? "unknown"}`);
2671
+ }
2672
+ const rows = result.data.results ?? [];
2673
+ const items = rows.map((row) => {
2674
+ const idx = typeof row.index === "number" ? row.index : 0;
2675
+ const score = typeof row.relevance_score === "number" ? row.relevance_score : 0;
2676
+ const doc = typeof row.document === "string" ? row.document : typeof row.document?.text === "string" ? row.document.text : void 0;
2677
+ const item = { index: idx, score };
2678
+ if (doc !== void 0) item.document = doc;
2679
+ return item;
2680
+ });
2681
+ return { items, model: result.data.model ?? modelId };
2682
+ }
2683
+ };
2684
+ var llamacpp_rerank_default = llamacppRerankRuntime;
2685
+
2686
+ // src/domains/providers/runtimes/local-native/lmstudio.ts
2687
+ init_esm_shims();
2688
+
2689
+ // src/domains/providers/runtimes/common/lmstudio-http.ts
2690
+ init_esm_shims();
2691
+ import { performance as performance3 } from "node:perf_hooks";
2692
+ var catalogsByHost = /* @__PURE__ */ new Map();
2693
+ function isRecord3(value) {
2694
+ return value !== null && typeof value === "object" && !Array.isArray(value);
2695
+ }
2696
+ function positiveNumber2(value) {
2697
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : void 0;
2698
+ }
2699
+ function nonEmptyString2(value) {
2700
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
2701
+ }
2702
+ function lmStudioRootUrl(url2) {
2703
+ const normalized = targetRootUrl({ id: "lmstudio", runtime: "lmstudio", url: url2 });
2704
+ if (!normalized) return "";
2705
+ if (normalized.startsWith("ws://")) return `http://${normalized.slice("ws://".length)}`;
2706
+ if (normalized.startsWith("wss://")) return `https://${normalized.slice("wss://".length)}`;
2707
+ return normalized;
2708
+ }
2709
+ function lmStudioRequestHeaders(base, apiKey) {
2710
+ const headers = new Headers(base);
2711
+ const token = apiKey?.trim();
2712
+ if (token && !headers.has("authorization")) headers.set("authorization", `Bearer ${token}`);
2713
+ return Object.fromEntries(headers);
2714
+ }
2715
+ function lmStudioProbeHeaders(target, ctx) {
2716
+ let token = ctx.authToken?.trim();
2717
+ const envName = target.auth?.apiKeyEnvVar;
2718
+ if (!token && envName && ctx.credentialsPresent.has(envName)) token = process.env[envName]?.trim();
2719
+ return lmStudioRequestHeaders(target.auth?.headers, token);
2720
+ }
2721
+ function combinedSignal(timeoutMs, signal) {
2722
+ const controller = new AbortController();
2723
+ const timer = setTimeout(() => controller.abort(new Error(`timeout after ${timeoutMs}ms`)), timeoutMs);
2724
+ const onAbort = () => controller.abort(signal?.reason);
2725
+ if (signal?.aborted) controller.abort(signal.reason);
2726
+ else signal?.addEventListener("abort", onAbort, { once: true });
2727
+ return {
2728
+ signal: controller.signal,
2729
+ close() {
2730
+ clearTimeout(timer);
2731
+ signal?.removeEventListener("abort", onAbort);
2732
+ }
2733
+ };
2734
+ }
2735
+ async function requestLmStudioJson(url2, init, timeoutMs, signal) {
2736
+ const started = performance3.now();
2737
+ const bounded = combinedSignal(timeoutMs, signal);
2738
+ try {
2739
+ const response = await fetch(url2, { ...init, signal: bounded.signal });
2740
+ let data;
2741
+ try {
2742
+ data = await response.json();
2743
+ } catch {
2744
+ bounded.signal.throwIfAborted();
2745
+ data = void 0;
2746
+ }
2747
+ const result = {
2748
+ ok: response.ok,
2749
+ status: response.status,
2750
+ latencyMs: Math.round(performance3.now() - started)
2751
+ };
2752
+ if (data !== void 0) result.data = data;
2753
+ if (!response.ok) {
2754
+ const detail = isRecord3(data) ? data.error ?? data : void 0;
2755
+ const message = nonEmptyString2(detail) ?? (isRecord3(detail) ? nonEmptyString2(detail.message) : void 0);
2756
+ const code = isRecord3(detail) ? nonEmptyString2(detail.code) : void 0;
2757
+ result.error = [code, message].filter(Boolean).join(": ") || `HTTP ${response.status}`;
2758
+ }
2759
+ return result;
2760
+ } catch (error) {
2761
+ signal?.throwIfAborted();
2762
+ return {
2763
+ ok: false,
2764
+ status: 0,
2765
+ latencyMs: Math.round(performance3.now() - started),
2766
+ error: error instanceof Error ? error.message : String(error)
2767
+ };
2768
+ } finally {
2769
+ bounded.close();
2770
+ }
2771
+ }
2772
+ function loadedInstances(value) {
2773
+ if (!Array.isArray(value)) return [];
2774
+ const instances = [];
2775
+ for (const raw of value) {
2776
+ if (!isRecord3(raw)) continue;
2777
+ const id = nonEmptyString2(raw.id);
2778
+ if (!id) continue;
2779
+ instances.push({ id, config: isRecord3(raw.config) ? { ...raw.config } : {} });
2780
+ }
2781
+ return instances;
2782
+ }
2783
+ function reasoningOptions(capabilities2) {
2784
+ if (!isRecord3(capabilities2) || !isRecord3(capabilities2.reasoning)) return void 0;
2785
+ const allowed = capabilities2.reasoning.allowed_options;
2786
+ if (!Array.isArray(allowed)) return void 0;
2787
+ const options = allowed.filter((entry) => typeof entry === "string");
2788
+ return options.length > 0 ? options : void 0;
2789
+ }
2790
+ function parseLmStudioV1Models(data) {
2791
+ if (!isRecord3(data) || !Array.isArray(data.models)) return null;
2792
+ const models = [];
2793
+ for (const raw of data.models) {
2794
+ if (!isRecord3(raw)) continue;
2795
+ const key = nonEmptyString2(raw.key);
2796
+ if (!key) continue;
2797
+ const capabilities2 = isRecord3(raw.capabilities) ? raw.capabilities : void 0;
2798
+ const info = {
2799
+ key,
2800
+ loadedInstances: loadedInstances(raw.loaded_instances),
2801
+ metadata: { ...raw }
2802
+ };
2803
+ const type = nonEmptyString2(raw.type);
2804
+ if (type) info.type = type;
2805
+ const maxContextLength = positiveNumber2(raw.max_context_length);
2806
+ if (maxContextLength !== void 0) info.maxContextLength = maxContextLength;
2807
+ if (capabilities2 && typeof capabilities2.vision === "boolean") info.vision = capabilities2.vision;
2808
+ else if (type) info.vision = type === "vlm";
2809
+ if (capabilities2 && typeof capabilities2.trained_for_tool_use === "boolean") {
2810
+ info.tools = capabilities2.trained_for_tool_use;
2811
+ }
2812
+ const options = reasoningOptions(capabilities2);
2813
+ if (options) info.reasoningOptions = options;
2814
+ if (capabilities2 && "reasoning" in capabilities2) {
2815
+ info.reasoning = capabilities2.reasoning === true || isRecord3(capabilities2.reasoning);
2816
+ }
2817
+ models.push(info);
2818
+ }
2819
+ return models;
2820
+ }
2821
+ function foldLmStudioModels(models) {
2822
+ const byKey = /* @__PURE__ */ new Map();
2823
+ for (const model of models) {
2824
+ const previous = byKey.get(model.key);
2825
+ if (!previous) {
2826
+ byKey.set(model.key, { ...model, loadedInstances: [...model.loadedInstances] });
2827
+ continue;
2828
+ }
2829
+ const knownIds = new Set(previous.loadedInstances.map((instance) => instance.id));
2830
+ for (const instance of model.loadedInstances) {
2831
+ if (!knownIds.has(instance.id)) previous.loadedInstances.push(instance);
2832
+ }
2833
+ if (previous.maxContextLength === void 0 && model.maxContextLength !== void 0) {
2834
+ previous.maxContextLength = model.maxContextLength;
2835
+ }
2836
+ if (previous.vision === void 0 && model.vision !== void 0) previous.vision = model.vision;
2837
+ if (previous.tools === void 0 && model.tools !== void 0) previous.tools = model.tools;
2838
+ if (previous.reasoningOptions === void 0 && model.reasoningOptions !== void 0) {
2839
+ previous.reasoningOptions = model.reasoningOptions;
2840
+ }
2841
+ if (previous.reasoning === void 0 && model.reasoning !== void 0) previous.reasoning = model.reasoning;
2842
+ }
2843
+ return [...byKey.values()];
2844
+ }
2845
+ function invalidateLmStudioCatalog(target) {
2846
+ catalogsByHost.delete(lmStudioRootUrl(target.url ?? ""));
2847
+ }
2848
+ function peerTargetsFor(target, instanceId) {
2849
+ const rootUrl2 = lmStudioRootUrl(target.url ?? "");
2850
+ const peers = [];
2851
+ for (const catalog of catalogsByHost.values()) {
2852
+ if (catalog.rootUrl === rootUrl2) continue;
2853
+ if (catalog.models.some((model) => model.loadedInstances.some((instance) => instance.id === instanceId))) {
2854
+ peers.push(catalog.targetId);
2855
+ }
2856
+ }
2857
+ return [...new Set(peers)];
2858
+ }
2859
+ function resolveLmStudioInstance(target, models, requestedId, configuredDefault) {
2860
+ const folded = foldLmStudioModels(models);
2861
+ for (const model of folded) {
2862
+ const explicit = model.loadedInstances.find((instance2) => instance2.id === requestedId);
2863
+ if (explicit) {
2864
+ return {
2865
+ requestedId,
2866
+ wireModelId: explicit.id,
2867
+ model,
2868
+ instance: explicit,
2869
+ peerTargets: peerTargetsFor(target, explicit.id),
2870
+ state: "instance"
2871
+ };
2872
+ }
2873
+ if (model.key !== requestedId) continue;
2874
+ if (model.loadedInstances.length === 0) {
2875
+ return { requestedId, wireModelId: requestedId, model, peerTargets: [], state: "jit" };
2876
+ }
2877
+ const preferred = configuredDefault ? model.loadedInstances.find((instance2) => instance2.id === configuredDefault) : void 0;
2878
+ const local = model.loadedInstances.find((instance2) => peerTargetsFor(target, instance2.id).length === 0);
2879
+ const instance = preferred ?? local ?? model.loadedInstances[0];
2880
+ if (!instance) return { requestedId, wireModelId: requestedId, model, peerTargets: [], state: "jit" };
2881
+ return {
2882
+ requestedId,
2883
+ wireModelId: instance.id,
2884
+ model,
2885
+ instance,
2886
+ peerTargets: peerTargetsFor(target, instance.id),
2887
+ state: "instance"
2888
+ };
2889
+ }
2890
+ return { requestedId, wireModelId: requestedId, peerTargets: [], state: "unknown" };
2891
+ }
2892
+ function lmStudioReasoningLevels(options) {
2893
+ if (!options || options.length === 0) return [...THINKING_LEVELS];
2894
+ if (options.includes("on") && !options.includes("low") && !options.includes("medium") && !options.includes("high")) {
2895
+ return ["off", "low"];
2896
+ }
2897
+ const levels = ["off"];
2898
+ if (options.includes("low")) levels.push("minimal", "low");
2899
+ if (options.includes("medium")) levels.push("medium");
2900
+ if (options.includes("high")) levels.push("high", "xhigh", "max");
2901
+ return [...new Set(levels)];
2902
+ }
2903
+ function lmStudioReasoningEffort(level, options) {
2904
+ if (options?.includes("on") && options.includes("off")) return level === "off" ? "none" : void 0;
2905
+ if (level === "off") return "none";
2906
+ if (level === "medium" && options?.includes("medium") !== false) return "medium";
2907
+ if ((level === "high" || level === "xhigh" || level === "max") && options?.includes("high") !== false) return "high";
2908
+ return "low";
2909
+ }
2910
+ function v0Models(data) {
2911
+ if (!isRecord3(data) || !Array.isArray(data.data)) return null;
2912
+ const models = [];
2913
+ for (const raw of data.data) {
2914
+ if (!isRecord3(raw)) continue;
2915
+ const key = nonEmptyString2(raw.id);
2916
+ if (!key) continue;
2917
+ const state = nonEmptyString2(raw.state);
2918
+ const loadedContext = positiveNumber2(raw.loaded_context_length);
2919
+ const config = loadedContext === void 0 ? {} : { context_length: loadedContext };
2920
+ const info = {
2921
+ key,
2922
+ loadedInstances: state === "loaded" || loadedContext !== void 0 ? [{ id: key, config }] : [],
2923
+ metadata: { ...raw }
2924
+ };
2925
+ const type = nonEmptyString2(raw.type);
2926
+ if (type) {
2927
+ info.type = type;
2928
+ info.vision = type === "vlm";
2929
+ }
2930
+ const maxContextLength = positiveNumber2(raw.max_context_length);
2931
+ if (maxContextLength !== void 0) info.maxContextLength = maxContextLength;
2932
+ if (Array.isArray(raw.capabilities)) info.tools = raw.capabilities.includes("tool_use");
2933
+ models.push(info);
2934
+ }
2935
+ return models;
2936
+ }
2937
+ function openAIModels(data) {
2938
+ if (!isRecord3(data) || !Array.isArray(data.data)) return null;
2939
+ const models = [];
2940
+ for (const raw of data.data) {
2941
+ if (!isRecord3(raw)) continue;
2942
+ const key = nonEmptyString2(raw.id);
2943
+ if (key) models.push({ key, loadedInstances: [], metadata: { ...raw } });
2944
+ }
2945
+ return models;
2946
+ }
2947
+ function authFailure(result) {
2948
+ if (result.status !== 401 && result.status !== 403) return null;
2949
+ return {
2950
+ ok: false,
2951
+ models: [],
2952
+ latencyMs: result.latencyMs,
2953
+ error: "LM Studio authentication required",
2954
+ authRequired: true
2955
+ };
2956
+ }
2957
+ async function listLmStudioModels(target, ctx, maxAgeMs = 0) {
2958
+ ctx.signal?.throwIfAborted();
2959
+ if (!target.url) return { ok: false, models: [], error: "target has no url" };
2960
+ const root = lmStudioRootUrl(target.url);
2961
+ const headers = lmStudioProbeHeaders(target, ctx);
2962
+ const requestHeaders = JSON.stringify(headers);
2963
+ const cached = catalogsByHost.get(root);
2964
+ if (cached && cached.requestHeaders === requestHeaders && performance3.now() - cached.at < maxAgeMs) {
2965
+ return cached.catalog;
2966
+ }
2967
+ const endpoints = [
2968
+ ["/api/v1/models", "0.4+", parseLmStudioV1Models],
2969
+ ["/api/v0/models", "0.3.x", v0Models],
2970
+ ["/v1/models", "openai-compat", openAIModels]
2971
+ ];
2972
+ let latencyMs = 0;
2973
+ let error = "LM Studio returned no recognized model catalog";
2974
+ for (const [path, tier, parse] of endpoints) {
2975
+ const response = await requestLmStudioJson(`${root}${path}`, { headers }, ctx.httpTimeoutMs, ctx.signal);
2976
+ latencyMs += response.latencyMs;
2977
+ const auth = authFailure(response);
2978
+ if (auth) {
2979
+ invalidateLmStudioCatalog(target);
2980
+ return auth;
2981
+ }
2982
+ const models = response.ok ? parse(response.data) : null;
2983
+ if (models) {
2984
+ const catalog = { ok: true, models: foldLmStudioModels(models), tier, latencyMs };
2985
+ catalogsByHost.set(root, {
2986
+ targetId: target.id,
2987
+ rootUrl: root,
2988
+ models: catalog.models,
2989
+ catalog,
2990
+ requestHeaders,
2991
+ at: performance3.now()
2992
+ });
2993
+ return catalog;
2994
+ }
2995
+ error = response.error ?? error;
2996
+ if (response.status !== 404 && response.status !== 405) break;
2997
+ }
2998
+ invalidateLmStudioCatalog(target);
2999
+ return { ok: false, models: [], latencyMs, error };
3000
+ }
3001
+ async function greetLmStudio(target, ctx) {
3002
+ if (!target.url) return { ok: false, error: "target has no url" };
3003
+ const result = await requestLmStudioJson(
3004
+ `${lmStudioRootUrl(target.url)}/lmstudio-greeting`,
3005
+ { headers: lmStudioProbeHeaders(target, ctx) },
3006
+ ctx.httpTimeoutMs,
3007
+ ctx.signal
3008
+ );
3009
+ if (result.ok && isRecord3(result.data) && result.data.lmstudio === true) {
3010
+ return { ok: true, latencyMs: result.latencyMs };
3011
+ }
3012
+ return { ok: false, latencyMs: result.latencyMs, error: result.error ?? "endpoint did not return {lmstudio:true}" };
3013
+ }
3014
+ function loadedContextLength(instance) {
3015
+ return positiveNumber2(instance?.config.context_length);
3016
+ }
3017
+
3018
+ // src/domains/providers/runtimes/local-native/lmstudio.ts
3019
+ var defaultCapabilities21 = {
3020
+ chat: true,
3021
+ tools: true,
3022
+ toolCallFormat: "openai",
3023
+ structuredOutputs: "json-schema",
3024
+ reasoning: true,
3025
+ vision: true,
3026
+ audio: false,
3027
+ embeddings: false,
3028
+ rerank: false,
3029
+ fim: false,
3030
+ contextWindow: CLIO_MIN_CONTEXT_WINDOW,
3031
+ maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
3032
+ };
3033
+ var reasoningOptionsByTargetModel = /* @__PURE__ */ new Map();
3034
+ function reasoningOptionsKey(target, modelId) {
3035
+ const url2 = (target.url ?? "").replace(/^ws:/u, "http:").replace(/^wss:/u, "https:").replace(/\/$/u, "");
3036
+ return `${target.id}|${url2}|${modelId}`;
3037
+ }
3038
+ function rememberReasoningOptions(target, models) {
3039
+ const prefix = reasoningOptionsKey(target, "");
3040
+ for (const key of reasoningOptionsByTargetModel.keys()) {
3041
+ if (key.startsWith(prefix)) reasoningOptionsByTargetModel.delete(key);
3042
+ }
3043
+ for (const model of models) {
3044
+ if (!model.reasoningOptions) continue;
3045
+ reasoningOptionsByTargetModel.set(reasoningOptionsKey(target, model.key), model.reasoningOptions);
3046
+ for (const instance of model.loadedInstances) {
3047
+ reasoningOptionsByTargetModel.set(reasoningOptionsKey(target, instance.id), model.reasoningOptions);
3048
+ }
3049
+ }
3050
+ }
3051
+ function configuredModel(target) {
3052
+ const id = target.defaultModel?.trim();
3053
+ return id && id.length > 0 ? id : void 0;
3054
+ }
3055
+ function resolveModel(models, id) {
3056
+ if (id) {
3057
+ for (const model2 of models) {
3058
+ if (model2.key === id) return { model: model2, ...model2.loadedInstances[0] ? { instance: model2.loadedInstances[0] } : {} };
3059
+ const instance = model2.loadedInstances.find((entry) => entry.id === id);
3060
+ if (instance) return { model: model2, instance };
3061
+ }
3062
+ return null;
3063
+ }
3064
+ const model = models.find((entry) => entry.loadedInstances.length > 0) ?? models[0];
3065
+ return model ? { model, ...model.loadedInstances[0] ? { instance: model.loadedInstances[0] } : {} } : null;
3066
+ }
3067
+ function capabilities(model, instance) {
3068
+ const out = {};
3069
+ if (model.vision !== void 0) out.vision = model.vision;
3070
+ if (model.tools !== void 0) out.tools = model.tools;
3071
+ if (model.reasoning !== void 0) out.reasoning = model.reasoning;
3072
+ else if (model.reasoningOptions !== void 0)
3073
+ out.reasoning = model.reasoningOptions.some((option) => option !== "off");
3074
+ const contextWindow = loadedContextLength(instance) ?? model.maxContextLength;
3075
+ if (contextWindow !== void 0) out.contextWindow = contextWindow;
3076
+ const parallel = instance?.config.parallel;
3077
+ if (typeof parallel === "number" && Number.isInteger(parallel) && parallel > 0) out.parallelSlots = parallel;
3078
+ return out;
3079
+ }
3080
+ function statusFor(model, instance, reasoningLevels) {
3081
+ const status = {
3082
+ state: instance ? "loaded" : "unloaded",
3083
+ key: model.key,
3084
+ reasoningLevels
3085
+ };
3086
+ if (instance) {
3087
+ status.instanceId = instance.id;
3088
+ status.loadConfig = instance.config;
3089
+ const contextLength = loadedContextLength(instance);
3090
+ if (contextLength !== void 0) status.contextLength = contextLength;
3091
+ }
3092
+ return status;
3093
+ }
3094
+ function probeFromCatalog(catalog, target) {
3095
+ if (!catalog.ok) {
3096
+ return {
3097
+ ok: false,
3098
+ ...catalog.latencyMs !== void 0 ? { latencyMs: catalog.latencyMs } : {},
3099
+ error: catalog.error ?? "LM Studio model listing failed"
3100
+ };
3101
+ }
3102
+ const models = foldLmStudioModels(catalog.models);
3103
+ rememberReasoningOptions(target, models);
3104
+ const ids = [];
3105
+ const modelCapabilities = {};
3106
+ const modelStates = {};
3107
+ for (const model of models) {
3108
+ const levels = lmStudioReasoningLevels(model.reasoningOptions);
3109
+ const keyInstance = model.loadedInstances[0];
3110
+ modelCapabilities[model.key] = capabilities(model, keyInstance);
3111
+ modelStates[model.key] = statusFor(model, keyInstance, levels);
3112
+ for (const instance of model.loadedInstances) {
3113
+ if (!ids.includes(instance.id)) ids.push(instance.id);
3114
+ modelCapabilities[instance.id] = capabilities(model, instance);
3115
+ const instanceStatus = statusFor(model, instance, levels);
3116
+ modelStates[instance.id] = instanceStatus;
3117
+ const resolution = resolveLmStudioInstance(target, models, instance.id, configuredModel(target));
3118
+ instanceStatus.detail = resolution.peerTargets.length > 0 ? `loaded on ${target.id}; also loaded on ${resolution.peerTargets.join(", ")}` : `loaded on ${target.id}`;
3119
+ }
3120
+ if (model.loadedInstances.length === 0) {
3121
+ ids.push(model.key);
3122
+ const keyStatus = modelStates[model.key];
3123
+ if (keyStatus) keyStatus.detail = "not loaded (LM Studio will load it on first use)";
3124
+ }
3125
+ }
3126
+ const selected = resolveModel(models, configuredModel(target));
3127
+ const result = {
3128
+ ok: true,
3129
+ discoveredCapabilities: { parallelSlots: 1 },
3130
+ models: ids,
3131
+ modelCapabilities,
3132
+ modelStates,
3133
+ serverVersion: catalog.tier === "0.4+" ? "LM Studio API 0.4+" : catalog.tier === "0.3.x" ? "LM Studio API 0.3.x" : "LM Studio OpenAI-compatible API",
3134
+ surfaces: {
3135
+ openaiChat: "/v1/chat/completions",
3136
+ ...catalog.tier === "0.4+" ? { nativeV1: "/api/v1/models" } : {},
3137
+ ...catalog.tier === "0.3.x" ? { nativeV0: "/api/v0/models" } : {}
3138
+ }
3139
+ };
3140
+ if (catalog.latencyMs !== void 0) result.latencyMs = catalog.latencyMs;
3141
+ if (selected) {
3142
+ result.discoveredCapabilities = { parallelSlots: 1, ...capabilities(selected.model, selected.instance) };
3143
+ result.capabilityModelId = configuredModel(target) ?? selected.model.key;
3144
+ }
3145
+ const loaded = models.flatMap(
3146
+ (model) => model.loadedInstances.map((instance) => {
3147
+ const context = loadedContextLength(instance);
3148
+ return `${model.key} as ${instance.id}${context ? ` at ${context} tokens` : ""}`;
3149
+ })
3150
+ );
3151
+ result.notes = [
3152
+ `LM Studio surface tier ${catalog.tier ?? "unknown"}`,
3153
+ `Surfaces: ${Object.values(result.surfaces ?? {}).join(", ")}`,
3154
+ ...loaded.length > 0 ? [`Loaded instances: ${loaded.join(", ")}`] : []
3155
+ ];
3156
+ return result;
3157
+ }
3158
+ var lmstudioRuntime = {
3159
+ id: "lmstudio",
3160
+ aliases: ["lmstudio-native"],
3161
+ displayName: "LM Studio",
3162
+ kind: "http",
3163
+ tier: "local-native",
3164
+ apiFamily: "openai-completions",
3165
+ auth: "api-key",
3166
+ defaultCapabilities: defaultCapabilities21,
3167
+ async probe(target, ctx) {
3168
+ const [greeting, catalog] = await Promise.all([greetLmStudio(target, ctx), listLmStudioModels(target, ctx)]);
3169
+ if (!greeting.ok && catalog.tier !== "0.3.x") {
3170
+ return {
3171
+ ok: false,
3172
+ ...greeting.latencyMs !== void 0 ? { latencyMs: greeting.latencyMs } : {},
3173
+ error: `URL did not identify itself as LM Studio: ${greeting.error ?? "greeting missing"}`
3174
+ };
3175
+ }
3176
+ return probeFromCatalog(catalog, target);
3177
+ },
3178
+ async probeModels(target, ctx) {
3179
+ const catalog = await listLmStudioModels(target, ctx);
3180
+ return probeFromCatalog(catalog, target).models ?? [];
3181
+ },
3182
+ synthesizeModel(target, wireModelId, kb) {
3183
+ const canonicalTarget = target.runtime === "lmstudio" ? target : { ...target, runtime: "lmstudio" };
3184
+ const model = synthLocalModel({
3185
+ target: canonicalTarget,
3186
+ wireModelId,
3187
+ kb,
3188
+ defaultCapabilities: defaultCapabilities21,
3189
+ apiFamily: "openai-completions",
3190
+ provider: "lmstudio",
3191
+ baseUrlForTarget: (url2) => withV1(url2.replace(/^ws:/u, "http:").replace(/^wss:/u, "https:"))
3192
+ });
3193
+ const metadata = model.clioCoder;
3194
+ if (metadata) {
3195
+ metadata.chatTemplateKwargsUnsupported = true;
3196
+ if (target.defaultModel) metadata.lmstudioDefaultModel = target.defaultModel;
3197
+ const options = reasoningOptionsByTargetModel.get(reasoningOptionsKey(canonicalTarget, wireModelId));
3198
+ if (options) metadata.lmstudioReasoningOptions = options;
3199
+ }
3200
+ return model;
3201
+ }
3202
+ };
3203
+ var lmstudio_default = lmstudioRuntime;
3204
+
3205
+ // src/domains/providers/runtimes/local-native/ollama.ts
3206
+ init_esm_shims();
3207
+
3208
+ // src/domains/providers/runtimes/common/ollama-model-ids.ts
3209
+ init_esm_shims();
3210
+ function ollamaModelIds(...ids) {
3211
+ return [
3212
+ ...new Set(
3213
+ ids.flatMap((id) => {
3214
+ if (id.endsWith(":latest")) return [id, id.slice(0, -7)];
3215
+ return id.slice(id.lastIndexOf("/") + 1).includes(":") ? [id] : [id, `${id}:latest`];
3216
+ })
3217
+ )
3218
+ ];
3219
+ }
3220
+
3221
+ // src/domains/providers/runtimes/local-native/ollama.ts
3222
+ var defaultCapabilities22 = {
3223
+ chat: true,
3224
+ tools: true,
3225
+ toolCallFormat: "openai",
3226
+ reasoning: false,
3227
+ vision: false,
3228
+ audio: false,
3229
+ embeddings: false,
3230
+ rerank: false,
3231
+ fim: false,
3232
+ contextWindow: CLIO_MIN_CONTEXT_WINDOW,
3233
+ maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
3234
+ };
3235
+ function positiveNumber3(value) {
3236
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : void 0;
3237
+ }
3238
+ function probeHeaders2(target, ctx) {
3239
+ const headers = new Headers(target.auth?.headers);
3240
+ const envName = target.auth?.apiKeyEnvVar;
3241
+ const token = ctx.authToken ?? (envName && ctx.credentialsPresent.has(envName) ? process.env[envName] : void 0);
3242
+ if (token && !headers.has("authorization")) headers.set("authorization", `Bearer ${token}`);
3243
+ return Object.fromEntries(headers);
3244
+ }
3245
+ async function probeResidentModelStates(base, ctx, headers) {
3246
+ const opts = { url: `${base}/api/ps`, headers, timeoutMs: ctx.httpTimeoutMs };
3247
+ const result = await (ctx.signal ? probeJson({ ...opts, signal: ctx.signal }) : probeJson(opts));
3248
+ if (!result.ok || !result.data?.models) return void 0;
3249
+ const states = {};
3250
+ for (const row of result.data.models) {
3251
+ const id = typeof row?.model === "string" ? row.model : typeof row?.name === "string" ? row.name : null;
3252
+ if (!id) continue;
3253
+ const status = { state: "loaded" };
3254
+ const sizeVram = positiveNumber3(row?.size_vram);
3255
+ if (sizeVram !== void 0) status.sizeVramBytes = sizeVram;
3256
+ const size = positiveNumber3(row?.size);
3257
+ if (size !== void 0) status.sizeBytes = size;
3258
+ const contextLength = positiveNumber3(row?.context_length);
3259
+ if (contextLength !== void 0) status.contextLength = contextLength;
3260
+ for (const alias of ollamaModelIds(id, ...typeof row.name === "string" ? [row.name] : [])) {
3261
+ states[alias] = status;
3262
+ }
3263
+ }
3264
+ return Object.keys(states).length > 0 ? states : void 0;
3265
+ }
3266
+ async function probeModelContextWindow(base, model, ctx, baked, headers) {
3267
+ const opts = {
3268
+ url: `${base}/api/show`,
3269
+ method: "POST",
3270
+ headers: { ...headers, "content-type": "application/json" },
3271
+ body: JSON.stringify({ model }),
3272
+ timeoutMs: ctx.httpTimeoutMs
3273
+ };
3274
+ const result = await (ctx.signal ? probeJson({ ...opts, signal: ctx.signal }) : probeJson(opts));
3275
+ const info = result.ok ? result.data?.model_info : void 0;
3276
+ if (!info || typeof info !== "object") return void 0;
3277
+ const arch = info["general.architecture"];
3278
+ const maximum = typeof arch === "string" ? positiveNumber3(info[`${arch}.context_length`]) : positiveNumber3(Object.entries(info).find(([key]) => key.endsWith(".context_length"))?.[1]);
3279
+ if (maximum === void 0 || !baked) return maximum;
3280
+ const params = result.data?.parameters;
3281
+ const bakedNumCtx = typeof params === "string" ? /^num_ctx\s+(\d+)\s*$/m.exec(params)?.[1] : void 0;
3282
+ const bakedWindow = bakedNumCtx !== void 0 ? positiveNumber3(Number(bakedNumCtx)) : void 0;
3283
+ return bakedWindow !== void 0 ? Math.min(maximum, bakedWindow) : maximum;
3284
+ }
3285
+ var ollamaRuntime = {
3286
+ id: "ollama",
3287
+ aliases: ["ollama-native"],
3288
+ displayName: "Ollama (native)",
3289
+ kind: "http",
3290
+ tier: "local-native",
3291
+ apiFamily: "ollama-native",
3292
+ auth: "none",
3293
+ defaultCapabilities: defaultCapabilities22,
3294
+ requestedContextWindow(target) {
3295
+ return target.ollama?.numCtx;
3296
+ },
3297
+ coldContextWindowCap: CLIO_MIN_CONTEXT_WINDOW,
3298
+ async probe(target, ctx) {
3299
+ const base = targetRootUrl(target);
3300
+ if (!base) return { ok: false, error: "target has no url" };
3301
+ const headers = probeHeaders2(target, ctx);
3302
+ const opts = { url: `${base}/api/tags`, headers, timeoutMs: ctx.httpTimeoutMs };
3303
+ const result = await (ctx.signal ? probeJson({ ...opts, signal: ctx.signal }) : probeJson(opts));
3304
+ if (!result.ok) {
3305
+ const failed = { ok: false };
3306
+ if (result.error) failed.error = result.error;
3307
+ if (result.latencyMs !== void 0) failed.latencyMs = result.latencyMs;
3308
+ return failed;
3309
+ }
3310
+ const out = { ok: true, discoveredCapabilities: { parallelSlots: 1 } };
3311
+ if (result.latencyMs !== void 0) out.latencyMs = result.latencyMs;
3312
+ const modelCapabilities = {};
3313
+ for (const row of result.data?.models ?? []) {
3314
+ const window2 = positiveNumber3(row?.details?.context_length);
3315
+ if (typeof row?.name === "string" && window2 !== void 0) modelCapabilities[row.name] = { contextWindow: window2 };
3316
+ }
3317
+ const defaultModel = target.defaultModel?.trim();
3318
+ const [window, modelStates] = await Promise.all([
3319
+ defaultModel ? probeModelContextWindow(base, defaultModel, ctx, target.ollama?.numCtx === void 0, headers) : void 0,
3320
+ probeResidentModelStates(base, ctx, headers)
3321
+ ]);
3322
+ if (defaultModel && window !== void 0) modelCapabilities[defaultModel] = { contextWindow: window };
3323
+ if (Object.keys(modelCapabilities).length > 0) out.modelCapabilities = modelCapabilities;
3324
+ if (modelStates) out.modelStates = modelStates;
3325
+ return out;
3326
+ },
3327
+ async probeModels(target, ctx) {
3328
+ const base = targetRootUrl(target);
3329
+ if (!base) return [];
3330
+ const opts = { url: `${base}/api/tags`, headers: probeHeaders2(target, ctx), timeoutMs: ctx.httpTimeoutMs };
3331
+ const result = await (ctx.signal ? probeJson({ ...opts, signal: ctx.signal }) : probeJson(opts));
3332
+ if (!result.ok || !result.data?.models) return [];
3333
+ return result.data.models.map((row) => typeof row?.name === "string" ? row.name : null).filter((name) => name !== null);
3334
+ },
3335
+ synthesizeModel(target, wireModelId, kb) {
3336
+ const canonicalTarget = target.runtime === "ollama" ? target : { ...target, runtime: "ollama" };
3337
+ return synthLocalModel({
3338
+ target: canonicalTarget,
3339
+ wireModelId,
3340
+ kb,
3341
+ defaultCapabilities: defaultCapabilities22,
3342
+ apiFamily: "ollama-native",
3343
+ provider: "ollama",
3344
+ baseUrlForTarget: withAsIs
3345
+ });
3346
+ }
3347
+ };
3348
+ var ollama_default = ollamaRuntime;
3349
+
3350
+ // src/domains/providers/runtimes/local-native/sglang.ts
3351
+ init_esm_shims();
3352
+ var defaultCapabilities23 = {
3353
+ chat: true,
3354
+ tools: true,
3355
+ toolCallFormat: "openai",
3356
+ reasoning: false,
3357
+ vision: false,
3358
+ audio: false,
3359
+ embeddings: false,
3360
+ rerank: false,
3361
+ fim: false,
3362
+ contextWindow: CLIO_MIN_CONTEXT_WINDOW,
3363
+ maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
3364
+ };
3365
+ var sglang_default = makeOpenAICompatRuntime({
3366
+ id: "sglang",
3367
+ displayName: "SGLang",
3368
+ provider: "sglang",
3369
+ auth: "api-key",
3370
+ tier: "local-native",
3371
+ defaultCapabilities: defaultCapabilities23
3372
+ });
3373
+
3374
+ // src/domains/providers/runtimes/local-native/vllm.ts
3375
+ init_esm_shims();
3376
+ var defaultCapabilities24 = {
3377
+ chat: true,
3378
+ tools: true,
3379
+ toolCallFormat: "openai",
3380
+ reasoning: false,
3381
+ vision: false,
3382
+ audio: false,
3383
+ embeddings: false,
3384
+ rerank: false,
3385
+ fim: false,
3386
+ contextWindow: CLIO_MIN_CONTEXT_WINDOW,
3387
+ maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
3388
+ };
3389
+ var vllm_default = makeOpenAICompatRuntime({
3390
+ id: "vllm",
3391
+ displayName: "vLLM",
3392
+ provider: "vllm",
3393
+ auth: "api-key",
3394
+ tier: "local-native",
3395
+ defaultCapabilities: defaultCapabilities24,
3396
+ healthPath: "/health"
3397
+ });
3398
+
3399
+ // src/domains/providers/runtimes/protocol/litellm.ts
3400
+ init_esm_shims();
3401
+ var LITELLM_PROVIDER = "litellm";
3402
+ var defaultCapabilities25 = {
3403
+ chat: true,
3404
+ tools: false,
3405
+ reasoning: false,
3406
+ vision: false,
3407
+ audio: false,
3408
+ embeddings: false,
3409
+ rerank: false,
3410
+ fim: false,
3411
+ structuredOutputs: "none",
3412
+ contextWindow: CLIO_MIN_CONTEXT_WINDOW,
3413
+ maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
3414
+ };
3415
+ function rootUrl(target) {
3416
+ if (!target.url) return null;
3417
+ const trimmed = stripTrailingSlash(target.url);
3418
+ return trimmed.endsWith("/v1") ? trimmed.slice(0, -"/v1".length) : trimmed;
3419
+ }
3420
+ function bearerHeaders2(target, ctx) {
3421
+ const headers = { ...target.auth?.headers ?? {} };
3422
+ const envName = target.auth?.apiKeyEnvVar;
3423
+ const fromEnv = envName && ctx.credentialsPresent.has(envName) ? process.env[envName]?.trim() : void 0;
3424
+ const token = ctx.authToken?.trim() || fromEnv;
3425
+ if (token) headers.authorization = `Bearer ${token}`;
3426
+ return headers;
3427
+ }
3428
+ function positiveInteger(value) {
3429
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : void 0;
3430
+ }
3431
+ function boolean(value) {
3432
+ return typeof value === "boolean" ? value : void 0;
3433
+ }
3434
+ function capabilitiesFromLiteLLMModelInfo(info) {
3435
+ const caps = {};
3436
+ if (info.runtime === "lm-studio") caps.thinkingControlRuntime = "lmstudio";
3437
+ else if (info.runtime === "llama.cpp") caps.thinkingControlRuntime = "llamacpp";
3438
+ const contextWindow = positiveInteger(info.max_input_tokens) ?? positiveInteger(info.max_tokens);
3439
+ if (contextWindow !== void 0) caps.contextWindow = contextWindow;
3440
+ const maxTokens = positiveInteger(info.max_output_tokens);
3441
+ if (maxTokens !== void 0) caps.maxTokens = maxTokens;
3442
+ const tools = boolean(info.supports_function_calling);
3443
+ if (tools !== void 0) caps.tools = tools;
3444
+ const vision = boolean(info.supports_vision);
3445
+ if (vision !== void 0) caps.vision = vision;
3446
+ const reasoning = boolean(info.supports_reasoning);
3447
+ if (reasoning !== void 0) caps.reasoning = reasoning;
3448
+ const audio = boolean(info.supports_audio_input);
3449
+ if (audio !== void 0) caps.audio = audio;
3450
+ if (info.mode === "embedding") {
3451
+ caps.chat = false;
3452
+ caps.embeddings = true;
3453
+ }
3454
+ if (info.mode === "rerank") {
3455
+ caps.chat = false;
3456
+ caps.rerank = true;
3457
+ }
3458
+ if (info.mode === "chat") caps.chat = true;
3459
+ const responseSchema = boolean(info.supports_response_schema);
3460
+ if (responseSchema !== void 0) caps.structuredOutputs = responseSchema ? "json-schema" : "none";
3461
+ return caps;
3462
+ }
3463
+ var BOOLEAN_CAPABILITIES = [
3464
+ "chat",
3465
+ "tools",
3466
+ "reasoning",
3467
+ "vision",
3468
+ "audio",
3469
+ "embeddings",
3470
+ "rerank",
3471
+ "fim"
3472
+ ];
3473
+ function aggregateLiteLLMCapabilities(rows) {
3474
+ if (rows.length === 0) return {};
3475
+ const aggregate = {};
3476
+ for (const key of ["contextWindow", "maxTokens"]) {
3477
+ const values = rows.map((row) => row[key]);
3478
+ if (values.every((value) => typeof value === "number")) {
3479
+ aggregate[key] = Math.min(...values);
3480
+ }
3481
+ }
3482
+ for (const key of BOOLEAN_CAPABILITIES) {
3483
+ const values = rows.map((row) => row[key]);
3484
+ if (values.some((value) => value === false)) aggregate[key] = false;
3485
+ else if (values.every((value) => value === true)) aggregate[key] = true;
3486
+ }
3487
+ const controlRuntime = rows[0]?.thinkingControlRuntime;
3488
+ if (controlRuntime !== void 0 && rows.every((row) => row.thinkingControlRuntime === controlRuntime)) {
3489
+ aggregate.thinkingControlRuntime = controlRuntime;
3490
+ }
3491
+ const structuredOutputs = rows.map((row) => row.structuredOutputs);
3492
+ if (structuredOutputs.some((value) => value === "none")) aggregate.structuredOutputs = "none";
3493
+ else if (structuredOutputs.every((value) => value === "json-schema")) aggregate.structuredOutputs = "json-schema";
3494
+ return aggregate;
3495
+ }
3496
+ var EMPTY_CATALOG = {
3497
+ listed: false,
3498
+ models: [],
3499
+ modelCapabilities: {},
3500
+ modelStates: {},
3501
+ deployments: {},
3502
+ authFailed: false
3503
+ };
3504
+ function isAuthError(leg) {
3505
+ return !leg.ok && /^HTTP 40[13]\b/u.test(leg.error ?? "");
3506
+ }
3507
+ async function fetchCatalog(base, ctx, headers) {
3508
+ const options = { timeoutMs: ctx.httpTimeoutMs, headers, ...ctx.signal ? { signal: ctx.signal } : {} };
3509
+ const list = await probeJson({ ...options, url: `${base}/v1/models` });
3510
+ if (isAuthError(list)) return { ...EMPTY_CATALOG, authFailed: true };
3511
+ const listed = list.ok && Array.isArray(list.data?.data);
3512
+ const models = listed ? [...new Set(list.data?.data?.flatMap((row) => typeof row?.id === "string" && row.id.length > 0 ? [row.id] : []))] : [];
3513
+ if (listed && models.length === 0) return { ...EMPTY_CATALOG, listed: true };
3514
+ let detail = await probeJson({ ...options, url: `${base}/v1/model/info` });
3515
+ if (!detail.ok && /^HTTP (404|405|501)\b/u.test(detail.error ?? "") || detail.ok && !Array.isArray(detail.data?.data)) {
3516
+ detail = await probeJson({ ...options, url: `${base}/model/info` });
3517
+ }
3518
+ const catalog = {
3519
+ listed,
3520
+ models,
3521
+ modelCapabilities: {},
3522
+ modelStates: {},
3523
+ deployments: {},
3524
+ authFailed: false
3525
+ };
3526
+ if (!detail.ok || !Array.isArray(detail.data?.data)) {
3527
+ catalog.notes = ["Gateway detail metadata is unavailable; route capabilities are unknown."];
3528
+ return catalog;
3529
+ }
3530
+ if (!listed) {
3531
+ catalog.notes = [
3532
+ "Inference model listing is unavailable; aliases come from gateway detail metadata and availability is unverified."
3533
+ ];
3534
+ }
3535
+ const available = new Set(models);
3536
+ const capabilityRows = {};
3537
+ for (const row of detail.data.data) {
3538
+ if (typeof row?.model_name !== "string" || row.model_name.length === 0) continue;
3539
+ const alias = row.model_name;
3540
+ if (listed && !available.has(alias)) continue;
3541
+ if (catalog.deployments[alias] === void 0) {
3542
+ if (!listed) catalog.models.push(alias);
3543
+ catalog.deployments[alias] = [];
3544
+ capabilityRows[alias] = [];
3545
+ }
3546
+ capabilityRows[alias]?.push(row.model_info ? capabilitiesFromLiteLLMModelInfo(row.model_info) : {});
3547
+ const upstream = row.litellm_params?.model;
3548
+ const apiBase = row.litellm_params?.api_base;
3549
+ catalog.deployments[alias]?.push({
3550
+ model: typeof upstream === "string" ? upstream : alias,
3551
+ ...typeof apiBase === "string" ? { apiBase } : {}
3552
+ });
3553
+ }
3554
+ for (const alias of catalog.models) {
3555
+ const caps = aggregateLiteLLMCapabilities(capabilityRows[alias] ?? []);
3556
+ if (Object.keys(caps).length > 0) catalog.modelCapabilities[alias] = caps;
3557
+ }
3558
+ return catalog;
3559
+ }
3560
+ var litellmRuntime = {
3561
+ id: "litellm",
3562
+ displayName: "LiteLLM gateway",
3563
+ kind: "http",
3564
+ tier: "protocol",
3565
+ apiFamily: "openai-completions",
3566
+ auth: "api-key",
3567
+ defaultCapabilities: defaultCapabilities25,
3568
+ async probe(target, ctx) {
3569
+ const base = rootUrl(target);
3570
+ if (!base) return { ok: false, error: "target has no url" };
3571
+ const headers = bearerHeaders2(target, ctx);
3572
+ const liveOpts = { url: `${base}/health/liveliness`, timeoutMs: ctx.httpTimeoutMs };
3573
+ const live = await (ctx.signal ? probeJson({ ...liveOpts, signal: ctx.signal }) : probeJson(liveOpts));
3574
+ const catalog = await fetchCatalog(base, ctx, headers);
3575
+ if (!catalog.listed || catalog.models.length === 0) {
3576
+ const result2 = {
3577
+ ok: false,
3578
+ error: catalog.authFailed ? "gateway rejected model-list access" : "gateway inference model catalog is unavailable or empty",
3579
+ failureKind: catalog.authFailed ? "authentication" : live.ok || catalog.listed || catalog.models.length > 0 ? "catalog-unavailable" : "generic",
3580
+ ...catalog.models.length > 0 ? { models: catalog.models } : {},
3581
+ ...catalog.notes ? { notes: catalog.notes } : {}
3582
+ };
3583
+ if (catalog.authFailed) result2.authFailed = true;
3584
+ if (live.latencyMs !== void 0) result2.latencyMs = live.latencyMs;
3585
+ return result2;
3586
+ }
3587
+ const result = { ok: true, models: catalog.models };
3588
+ if (live.latencyMs !== void 0) result.latencyMs = live.latencyMs;
3589
+ if (Object.keys(catalog.modelCapabilities).length > 0) {
3590
+ result.modelCapabilities = catalog.modelCapabilities;
3591
+ const selected = target.defaultModel?.trim();
3592
+ const selectedCaps = selected ? catalog.modelCapabilities[selected] : void 0;
3593
+ if (selected && selectedCaps) {
3594
+ result.discoveredCapabilities = selectedCaps;
3595
+ result.capabilityModelId = selected;
3596
+ }
3597
+ }
3598
+ const notes = [...catalog.notes ?? []];
3599
+ if (!live.ok) notes.push("Unauthenticated liveness check failed; authenticated model listing succeeded.");
3600
+ const configured = target.defaultModel?.trim();
3601
+ if (configured && !catalog.models.includes(configured)) {
3602
+ notes.push(`configured model '${configured}' is not in the gateway catalog`);
3603
+ }
3604
+ const routeEntries = Object.entries(catalog.deployments);
3605
+ const physical = routeEntries.filter(([alias, deployments]) => {
3606
+ const slash = alias.indexOf("/");
3607
+ if (slash <= 0 || deployments.length !== 1) return false;
3608
+ const upstream = deployments[0]?.model.replace(/^openai\//u, "");
3609
+ return upstream === alias.slice(slash + 1);
3610
+ });
3611
+ if (physical.length > 0) notes.push(`physical routes: ${physical.length} node/model names map one-to-one`);
3612
+ const routed = routeEntries.filter(([alias]) => !physical.some(([physicalAlias]) => physicalAlias === alias)).map(([alias, deployments]) => {
3613
+ const models = [...new Set(deployments.map((deployment) => deployment.model))];
3614
+ return `${alias}=${models.join("|")}`;
3615
+ }).sort();
3616
+ if (routed.length > 0) notes.push(`routes: ${routed.join(", ")}`);
3617
+ if (notes.length > 0) result.notes = notes;
3618
+ return result;
3619
+ },
3620
+ async probeModels(target, ctx) {
3621
+ const base = rootUrl(target);
3622
+ if (!base) return [];
3623
+ const catalog = await fetchCatalog(base, ctx, bearerHeaders2(target, ctx));
3624
+ return catalog.listed ? catalog.models : [];
3625
+ },
3626
+ synthesizeModel(target, wireModelId, kb) {
3627
+ return synthLocalModel({
3628
+ // A LiteLLM target is a gateway whether or not settings said so. The
3629
+ // residency layer reads this to stay observe-only: the models behind an
3630
+ // alias are the proxy's to load and evict, and a Clio stream that tried
3631
+ // to manage them would be issuing load commands to a host that does not
3632
+ // take them.
3633
+ target: { ...target, gateway: true },
3634
+ wireModelId,
3635
+ kb,
3636
+ defaultCapabilities: defaultCapabilities25,
3637
+ apiFamily: "openai-completions",
3638
+ provider: LITELLM_PROVIDER,
3639
+ baseUrlForTarget: withV1
3640
+ });
3641
+ }
3642
+ };
3643
+ var litellm_default = litellmRuntime;
3644
+
3645
+ // src/domains/providers/runtimes/builtins.ts
3646
+ var BUILTIN_RUNTIMES = [
3647
+ alcf_default,
3648
+ anthropic_default,
3649
+ anthropic_max_default,
3650
+ bedrock_default,
3651
+ deepseek_default,
3652
+ google_default,
3653
+ groq_default,
3654
+ mistral_default,
3655
+ openai_default,
3656
+ openai_codex_default,
3657
+ openrouter_default,
3658
+ lemonade_anthropic_default,
3659
+ lemonade_openai_default,
3660
+ llamacpp_default,
3661
+ llamacpp_anthropic_default,
3662
+ llamacpp_completion_default,
3663
+ llamacpp_embed_default,
3664
+ llamacpp_rerank_default,
3665
+ lmstudio_default,
3666
+ ollama_default,
3667
+ anthropic_compat_default,
3668
+ litellm_default,
3669
+ openai_compat_default,
3670
+ sglang_default,
3671
+ vllm_default,
3672
+ claude_code_default,
3673
+ claude_sdk_default,
3674
+ antigravity_code_default
3675
+ ];
3676
+ function registerBuiltinRuntimes(registry) {
3677
+ for (const desc of BUILTIN_RUNTIMES) {
3678
+ if (registry.get(desc.id) !== null) continue;
3679
+ registry.register(desc);
3680
+ }
3681
+ }
3682
+
3683
+ export {
3684
+ boundedExternalDiagnostic,
3685
+ ollamaModelIds,
3686
+ normalizeModelIdForFamily,
3687
+ isHarmonyModelId,
3688
+ inferLocalModelFamily,
3689
+ CLIO_MIN_CONTEXT_WINDOW,
3690
+ CLIO_MIN_MAX_OUTPUT_TOKENS,
3691
+ CLIO_CONTEXT_WINDOW_WARN_BELOW,
3692
+ EMPTY_CAPABILITIES,
3693
+ VALID_THINKING_LEVELS,
3694
+ availableThinkingLevels,
3695
+ extractLocalModelQuirks,
3696
+ targetRootUrl,
3697
+ lmStudioRootUrl,
3698
+ requestLmStudioJson,
3699
+ invalidateLmStudioCatalog,
3700
+ resolveLmStudioInstance,
3701
+ lmStudioReasoningEffort,
3702
+ listLmStudioModels,
3703
+ greetLmStudio,
3704
+ loadedContextLength,
3705
+ probeJson,
3706
+ formatContextWindowSlots,
3707
+ BUILTIN_RUNTIMES,
3708
+ registerBuiltinRuntimes
3709
+ };
3710
+ //# sourceMappingURL=chunk-77DCC6JZ.js.map