@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
@@ -1,2120 +0,0 @@
1
- import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
- import {
3
- loadPromptTemplates,
4
- validateLibraryPackage
5
- } from "./chunk-Y3M2T5RO.js";
6
- import {
7
- fetchPluginSource,
8
- loadSkills,
9
- parseAgentRecipeSchema,
10
- parsePluginGithubSource,
11
- pluginLocalPath
12
- } from "./chunk-7FBCRWVT.js";
13
- import {
14
- normalizedSkillHash
15
- } from "./chunk-DNCE23JJ.js";
16
- import {
17
- PLUGIN_EXTENSION_KEY,
18
- PLUGIN_SCHEMA,
19
- installLibraryPackage,
20
- isPluginId,
21
- listInstalledPlugins,
22
- pluginBaseDir,
23
- readPluginInstallRecord,
24
- readPluginManifest
25
- } from "./chunk-6UJ7RDI7.js";
26
- import {
27
- isSemanticVersion
28
- } from "./chunk-XW2UZICE.js";
29
- import {
30
- readSettings,
31
- updateSettings
32
- } from "./chunk-FPS4R2RN.js";
33
- import {
34
- INTEROP_AGENT_KINDS,
35
- interopAgentKind
36
- } from "./chunk-5EQO5NWP.js";
37
- import {
38
- require_dist
39
- } from "./chunk-B5GGDIHT.js";
40
- import {
41
- runCommandVector
42
- } from "./chunk-XTQ7MEJG.js";
43
- import {
44
- withStateFileLockSync
45
- } from "./chunk-DVJL77SO.js";
46
- import {
47
- clioConfigDir,
48
- clioStateDir
49
- } from "./chunk-CTTI7G3T.js";
50
- import {
51
- safeResourceWrite
52
- } from "./chunk-ZZFWWYLX.js";
53
- import {
54
- __toESM,
55
- init_esm_shims
56
- } from "./chunk-ECBHH7LU.js";
57
-
58
- // src/domains/interop/inventory.ts
59
- init_esm_shims();
60
- var import_yaml = __toESM(require_dist(), 1);
61
- import { lstatSync, readdirSync, readFileSync } from "node:fs";
62
- import path from "node:path";
63
- import { parse as parseToml } from "smol-toml";
64
- var MAX_FILES = 4096;
65
- var MAX_BYTES = 2 * 1024 * 1024;
66
- function inventoryText(file) {
67
- const stat = lstatSync(file);
68
- if (!stat.isFile() || stat.isSymbolicLink() || stat.size > MAX_BYTES) throw new Error("not a bounded regular file");
69
- return readFileSync(file, "utf8");
70
- }
71
- function object(value) {
72
- return value !== null && typeof value === "object" && !Array.isArray(value);
73
- }
74
- function discoverInteropInventory(kind, home, cwd, env = {}) {
75
- const layout = kind.inventory;
76
- const result = { status: "known", items: [], diagnostics: [], listing: "unknown" };
77
- if (!layout) return { ...result, status: "unknown", diagnostics: ["Inventory is not extended for this host."] };
78
- const seen = /* @__PURE__ */ new Set();
79
- let visited = 0;
80
- const unknown = (message) => {
81
- result.status = "unknown";
82
- result.diagnostics.push(message);
83
- };
84
- const entries = (dir) => {
85
- try {
86
- if (lstatSync(dir).isSymbolicLink()) {
87
- unknown(`Symbolic-link root was not traversed: ${dir}`);
88
- return [];
89
- }
90
- return readdirSync(dir).sort();
91
- } catch (error) {
92
- if (error.code !== "ENOENT") unknown(`Cannot inspect ${dir}`);
93
- return [];
94
- }
95
- };
96
- const json = (file) => {
97
- try {
98
- const value = JSON.parse(inventoryText(file));
99
- if (!object(value)) throw new Error("not object");
100
- return value;
101
- } catch (error) {
102
- if (error.code !== "ENOENT") unknown(`Cannot parse ${file}`);
103
- return void 0;
104
- }
105
- };
106
- const add = (file, resourceKind, scope, plugin2, metadata = {}) => {
107
- const key = `${scope}:${resourceKind}:${file}:${metadata.name ?? ""}`;
108
- if (seen.has(key)) return;
109
- seen.add(key);
110
- let declaredName;
111
- if (["skill", "agent", "prompt"].includes(resourceKind)) {
112
- try {
113
- const raw = inventoryText(file);
114
- const frontmatter = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(raw);
115
- const data = file.endsWith(".toml") ? parseToml(raw) : frontmatter ? (0, import_yaml.parse)(frontmatter[1] ?? "") : void 0;
116
- if (object(data) && typeof data.name === "string") declaredName = data.name;
117
- } catch {
118
- unknown(`Resource metadata is unknown: ${file}`);
119
- }
120
- }
121
- result.items.push({
122
- kind: resourceKind,
123
- name: declaredName ?? (resourceKind === "skill" ? path.basename(path.dirname(file)) : path.basename(file, path.extname(file))),
124
- path: file,
125
- scope,
126
- ...plugin2 ? { plugin: plugin2 } : {},
127
- ...metadata
128
- });
129
- };
130
- const walk = (dir, visit, depth = 0) => {
131
- if (depth > 12) {
132
- unknown(`Depth limit reached: ${dir}`);
133
- return;
134
- }
135
- for (const name of entries(dir)) {
136
- if (++visited > MAX_FILES) {
137
- unknown("Inventory file limit reached.");
138
- return;
139
- }
140
- const file = path.join(dir, name);
141
- try {
142
- const stat = lstatSync(file);
143
- if (stat.isSymbolicLink()) {
144
- unknown(`Symbolic link was not traversed: ${file}`);
145
- continue;
146
- }
147
- if (stat.isDirectory()) walk(file, visit, depth + 1);
148
- else if (stat.isFile()) visit(file);
149
- } catch {
150
- unknown(`Cannot inspect ${file}`);
151
- }
152
- }
153
- };
154
- const scan = (root, scope, plugin2, declarations = layout.declarations, resourceRoots = layout.roots) => {
155
- for (const entry of resourceRoots) {
156
- walk(path.join(root, entry.path), (file) => {
157
- if (entry.kind === "skill" ? path.basename(file) === "SKILL.md" : entry.extensions.some((ext) => file.endsWith(ext)))
158
- add(file, entry.kind, scope, plugin2);
159
- });
160
- }
161
- for (const entry of declarations) {
162
- const file = path.join(root, entry.path);
163
- if (entry.path.endsWith(".toml")) {
164
- try {
165
- const data = parseToml(inventoryText(file));
166
- if (object(data.mcp_servers))
167
- for (const name of Object.keys(data.mcp_servers)) add(file, "mcp", scope, plugin2, { name });
168
- } catch (error) {
169
- if (error.code !== "ENOENT") unknown(`Cannot read ${file}`);
170
- }
171
- } else {
172
- const data = json(file);
173
- if (!data) continue;
174
- const value = entry.key ? data[entry.key] : data;
175
- if (value === void 0) continue;
176
- if (object(value))
177
- for (const name of Object.keys(value)) {
178
- const key = `${scope}:${entry.kind}:${file}:${name}`;
179
- if (!seen.has(key)) {
180
- seen.add(key);
181
- result.items.push({ kind: entry.kind, name, path: file, scope, ...plugin2 ? { plugin: plugin2 } : {} });
182
- }
183
- }
184
- else unknown(`Unsupported declaration shape in ${file}`);
185
- }
186
- }
187
- };
188
- scan(home, "user", void 0, layout.userDeclarations ?? [], []);
189
- scan(cwd, "project", void 0, layout.projectDeclarations ?? [], []);
190
- if (layout.projectModuleConfig) {
191
- const file = path.join(cwd, layout.projectModuleConfig);
192
- const data = json(file);
193
- if (Array.isArray(data?.plugin))
194
- for (const value of data.plugin) {
195
- const name = typeof value === "string" ? value : Array.isArray(value) && typeof value[0] === "string" ? value[0] : void 0;
196
- if (name)
197
- add(file, "executable", "project", void 0, {
198
- name: name.startsWith("file:") || path.isAbsolute(name) ? path.basename(name) : name
199
- });
200
- else unknown("Unsupported project executable plugin declaration.");
201
- }
202
- }
203
- const userRoot = env[layout.homeEnv ?? ""] ?? (layout.xdgConfigSubdir && env.XDG_CONFIG_HOME ? path.join(env.XDG_CONFIG_HOME, layout.xdgConfigSubdir) : path.join(home, layout.userRoot));
204
- const roots = [
205
- { root: userRoot, scope: "user" },
206
- ...(layout.additionalUserRoots ?? []).map((root) => ({ root: path.join(home, root), scope: "user" })),
207
- ...layout.projectRoots.map((root) => ({ root: path.join(cwd, root), scope: "project" }))
208
- ];
209
- const pluginRoots = /* @__PURE__ */ new Set();
210
- const plugin = (root, scope, metadata = {}) => {
211
- if (pluginRoots.has(`${scope}:${root}`)) return;
212
- pluginRoots.add(`${scope}:${root}`);
213
- let manifest;
214
- for (const manifestPath of layout.pluginManifests) {
215
- manifest = json(path.join(root, manifestPath));
216
- if (manifest) break;
217
- }
218
- add(root, "plugin", scope, void 0, {
219
- name: typeof manifest?.name === "string" ? manifest.name : path.basename(root),
220
- version: typeof manifest?.version === "string" ? manifest.version : "unknown",
221
- marketplace: "unknown",
222
- installation: "unknown",
223
- ...metadata
224
- });
225
- scan(root, scope, root);
226
- for (const directory of ["scripts", "tools"])
227
- walk(path.join(root, directory), (file) => add(file, "executable", scope, root));
228
- };
229
- for (const { root, scope } of roots) {
230
- scan(root, scope);
231
- if (layout.moduleConfig) {
232
- const data = json(path.join(root, layout.moduleConfig));
233
- if (Array.isArray(data?.plugin))
234
- for (const name of data.plugin) {
235
- const source = typeof name === "string" ? name : Array.isArray(name) && typeof name[0] === "string" ? name[0] : void 0;
236
- if (source)
237
- add(path.join(root, layout.moduleConfig), "executable", scope, void 0, {
238
- name: path.isAbsolute(source) ? path.basename(source) : source.startsWith("file:") ? path.basename(source) : source
239
- });
240
- else unknown("Unsupported executable plugin declaration.");
241
- }
242
- }
243
- if (layout.settingsRegistry === "copilot") {
244
- const settings = json(path.join(root, "settings.json"));
245
- if (object(settings?.enabledPlugins))
246
- for (const [id, enabled] of Object.entries(settings.enabledPlugins)) {
247
- const [name, market] = id.split("@");
248
- const markets = settings.extraKnownMarketplaces;
249
- const entry = object(markets) && market ? markets[market] : void 0;
250
- const source = object(entry) ? entry.source : void 0;
251
- if (!name || !object(source) || source.source !== "directory" || typeof source.path !== "string") {
252
- unknown(`Plugin source path is unknown: ${id}`);
253
- add(path.join(root, "settings.json"), "plugin", scope, void 0, {
254
- name: id,
255
- installation: "installed",
256
- marketplace: market ?? "unknown",
257
- version: "unknown"
258
- });
259
- continue;
260
- }
261
- const marketManifest = json(path.join(source.path, ".claude-plugin/marketplace.json")) ?? json(path.join(source.path, "marketplace.json"));
262
- const declaration = Array.isArray(marketManifest?.plugins) ? marketManifest.plugins.find((entry2) => object(entry2) && entry2.name === name) : void 0;
263
- if (!object(declaration) || typeof declaration.source !== "string" || !declaration.source.startsWith(".")) {
264
- unknown(`Plugin local source is unknown: ${id}`);
265
- continue;
266
- }
267
- plugin(path.resolve(source.path, declaration.source), scope, {
268
- name,
269
- marketplace: market ?? "unknown",
270
- installation: "installed",
271
- ...typeof enabled === "boolean" ? { enabled } : {}
272
- });
273
- }
274
- }
275
- if (layout.installedRegistry) {
276
- const data = json(path.join(root, layout.installedRegistry));
277
- if (object(data?.plugins)) {
278
- for (const [id, records] of Object.entries(data.plugins)) {
279
- if (!Array.isArray(records)) {
280
- unknown("Unsupported installed plugin registry record.");
281
- continue;
282
- }
283
- for (const record2 of records) {
284
- if (!object(record2) || typeof record2.installPath !== "string") {
285
- unknown("Plugin install path is unknown.");
286
- continue;
287
- }
288
- if (record2.scope !== "user" && record2.scope !== "project" && record2.scope !== "local") {
289
- unknown("Plugin scope is unknown.");
290
- continue;
291
- }
292
- if (record2.scope !== "user" && record2.projectPath !== cwd) continue;
293
- plugin(record2.installPath, record2.scope === "user" ? "user" : "project", {
294
- name: id.split("@")[0] ?? id,
295
- marketplace: id.split("@")[1] ?? "unknown",
296
- version: typeof record2.version === "string" ? record2.version : "unknown",
297
- installation: "installed"
298
- });
299
- }
300
- }
301
- }
302
- }
303
- for (const directory of layout.pluginDirs) {
304
- const search = (dir, depth) => {
305
- if (depth > 4) {
306
- unknown(`Plugin search depth reached: ${dir}`);
307
- return;
308
- }
309
- const names = entries(dir);
310
- if (layout.pluginManifests.some((name) => {
311
- try {
312
- return lstatSync(path.join(dir, name)).isFile();
313
- } catch {
314
- return false;
315
- }
316
- })) {
317
- const relative = path.relative(path.join(root, directory), dir).split(path.sep);
318
- plugin(dir, scope, layout.cacheMarketplace ? { marketplace: relative[0] ?? "unknown" } : {});
319
- return;
320
- }
321
- for (const name of names) {
322
- if (++visited > MAX_FILES) {
323
- unknown("Inventory file limit reached.");
324
- return;
325
- }
326
- try {
327
- if (lstatSync(path.join(dir, name)).isDirectory()) search(path.join(dir, name), depth + 1);
328
- } catch {
329
- unknown(`Cannot inspect ${dir}`);
330
- }
331
- }
332
- };
333
- search(path.join(root, directory), 0);
334
- }
335
- }
336
- if (layout.settingsRegistry === "codex") {
337
- try {
338
- const data = parseToml(inventoryText(path.join(userRoot, "config.toml")));
339
- if (object(data.plugins))
340
- for (const item of result.items.filter((item2) => item2.kind === "plugin" && item2.scope === "user")) {
341
- const state = data.plugins[`${item.name}@${item.marketplace}`];
342
- if (object(state) && typeof state.enabled === "boolean") {
343
- item.enabled = state.enabled;
344
- item.installation = "installed";
345
- }
346
- }
347
- } catch (error) {
348
- if (error.code !== "ENOENT") unknown("Cannot parse Codex plugin settings.");
349
- }
350
- }
351
- if (layout.settingsRegistry === "antigravity") {
352
- const manifest = json(path.join(userRoot, "import_manifest.json"));
353
- if (Array.isArray(manifest?.imports))
354
- for (const item of result.items.filter((item2) => item2.kind === "plugin")) {
355
- if (manifest.imports.some((entry) => object(entry) && entry.name === item.name)) item.installation = "installed";
356
- }
357
- }
358
- return result;
359
- }
360
-
361
- // src/domains/interop/detect.ts
362
- init_esm_shims();
363
- import { createHash } from "node:crypto";
364
- import { accessSync, constants, existsSync as existsSync2, mkdirSync, mkdtempSync, rmSync, statSync } from "node:fs";
365
- import { homedir, tmpdir } from "node:os";
366
- import path3 from "node:path";
367
-
368
- // src/domains/interop/state.ts
369
- init_esm_shims();
370
- import { existsSync, readFileSync as readFileSync2 } from "node:fs";
371
- import path2 from "node:path";
372
- var KNOWN_IDS = new Set(INTEROP_AGENT_KINDS.map((kind) => kind.id));
373
- var PRESENCES = /* @__PURE__ */ new Set(["present", "absent", "unknown"]);
374
- function interopStatePath() {
375
- return path2.join(clioStateDir(), "interop.json");
376
- }
377
- function isRecord(value) {
378
- return typeof value === "object" && value !== null && !Array.isArray(value);
379
- }
380
- function stringField(raw, key) {
381
- const value = raw[key];
382
- return typeof value === "string" && value.length > 0 ? value : void 0;
383
- }
384
- function countField(raw, key) {
385
- const value = raw[key];
386
- return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : 0;
387
- }
388
- function presenceField(raw, key) {
389
- const value = raw[key];
390
- return typeof value === "string" && PRESENCES.has(value) ? value : void 0;
391
- }
392
- function parseAgent(raw) {
393
- if (!isRecord(raw)) return null;
394
- const kind = stringField(raw, "kind");
395
- const fingerprint = stringField(raw, "fingerprint");
396
- const presence = presenceField(raw, "presence");
397
- if (kind === void 0 || !KNOWN_IDS.has(kind) || fingerprint === void 0 || presence === void 0) return null;
398
- const decision = stringField(raw, "decision");
399
- const adapter = presenceField(raw, "adapter");
400
- const binary = stringField(raw, "binary");
401
- const version = stringField(raw, "version");
402
- const installDir = stringField(raw, "installDir");
403
- const decidedAt = stringField(raw, "decidedAt");
404
- const decidedFingerprint = stringField(raw, "decidedFingerprint");
405
- const hintedFingerprint = stringField(raw, "hintedFingerprint");
406
- return {
407
- kind,
408
- presence,
409
- fingerprint,
410
- skillCount: countField(raw, "skillCount"),
411
- projectArtifacts: countField(raw, "projectArtifacts"),
412
- ...binary !== void 0 ? { binary } : {},
413
- ...version !== void 0 ? { version } : {},
414
- ...installDir !== void 0 ? { installDir } : {},
415
- ...adapter !== void 0 ? { adapter } : {},
416
- ...decision === "accepted" || decision === "declined" ? { decision } : {},
417
- ...decidedAt !== void 0 ? { decidedAt } : {},
418
- ...decidedFingerprint !== void 0 ? { decidedFingerprint } : {},
419
- ...hintedFingerprint !== void 0 ? { hintedFingerprint } : {}
420
- };
421
- }
422
- function readInteropReport() {
423
- let filePath;
424
- try {
425
- filePath = interopStatePath();
426
- } catch {
427
- return null;
428
- }
429
- if (!existsSync(filePath)) return null;
430
- try {
431
- const parsed = JSON.parse(readFileSync2(filePath, "utf8"));
432
- if (!isRecord(parsed) || parsed.version !== 1) return null;
433
- const detectedAt = stringField(parsed, "detectedAt");
434
- if (detectedAt === void 0 || !Array.isArray(parsed.agents)) return null;
435
- const agents = parsed.agents.map(parseAgent).filter((agent) => agent !== null);
436
- return { version: 1, detectedAt, agents };
437
- } catch {
438
- return null;
439
- }
440
- }
441
- function writeInteropReport(report) {
442
- safeResourceWrite(interopStatePath(), `${JSON.stringify(report, null, 2)}
443
- `, { encoding: "utf8" });
444
- }
445
-
446
- // src/domains/interop/detect.ts
447
- var VERSION_PROBE_TIMEOUT_MS = 2e3;
448
- var VERSION_PROBE_MAX_OUTPUT_BYTES = 4096;
449
- function resolveOnPath(binaryNames) {
450
- if (binaryNames.length === 0) return { presence: "absent" };
451
- const rawPath = process.env.PATH;
452
- if (rawPath === void 0 || rawPath.length === 0) return { presence: "unknown" };
453
- let unreadable = false;
454
- try {
455
- for (const dir of rawPath.split(path3.delimiter)) {
456
- if (dir.length === 0) continue;
457
- for (const name of binaryNames) {
458
- const candidate = path3.join(dir, name);
459
- try {
460
- accessSync(candidate, constants.X_OK);
461
- if (statSync(candidate).isFile()) return { presence: "present", binary: candidate };
462
- } catch (error) {
463
- if (["EACCES", "EPERM"].includes(error.code ?? "")) unreadable = true;
464
- }
465
- }
466
- }
467
- } catch {
468
- return { presence: "unknown" };
469
- }
470
- return { presence: unreadable ? "unknown" : "absent" };
471
- }
472
- function adapterPresence(kind, cwd, binaryPresence) {
473
- const recipe = kind.acp;
474
- if (recipe === void 0) return "absent";
475
- if (recipe.npmPackage === void 0) return binaryPresence;
476
- try {
477
- if (existsSync2(path3.join(cwd, "node_modules", recipe.npmPackage))) return "present";
478
- } catch {
479
- return "unknown";
480
- }
481
- if (recipe.npmPackageBin === void 0) return "absent";
482
- return resolveOnPath([recipe.npmPackageBin]).presence;
483
- }
484
- function installDirOf(kind, home) {
485
- const dir = path3.join(home, kind.userDir);
486
- try {
487
- return existsSync2(dir) ? dir : void 0;
488
- } catch {
489
- return void 0;
490
- }
491
- }
492
- function parseVersion(output) {
493
- return /\b\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?\b/.exec(output)?.[0];
494
- }
495
- async function probeVersion(binary) {
496
- let scratch;
497
- try {
498
- scratch = mkdtempSync(path3.join(tmpdir(), "clio-coder-interop-version-"));
499
- const env = { HOME: scratch, USERPROFILE: scratch };
500
- for (const key of [
501
- "XDG_CONFIG_HOME",
502
- "XDG_CACHE_HOME",
503
- "XDG_STATE_HOME",
504
- "XDG_DATA_HOME",
505
- "APPDATA",
506
- "LOCALAPPDATA",
507
- "CLAUDE_CONFIG_DIR",
508
- "CODEX_HOME",
509
- "ANTIGRAVITY_HOME",
510
- "OPENCODE_CONFIG_DIR",
511
- "COPILOT_HOME",
512
- "GEMINI_CLI_HOME"
513
- ]) {
514
- const directory = path3.join(scratch, key.toLowerCase());
515
- mkdirSync(directory);
516
- env[key] = directory;
517
- }
518
- const result = await runCommandVector(binary, ["--version"], {
519
- cwd: scratch,
520
- workspaceRoot: scratch,
521
- env,
522
- timeoutMs: VERSION_PROBE_TIMEOUT_MS,
523
- maxOutputBytes: VERSION_PROBE_MAX_OUTPUT_BYTES
524
- });
525
- if (result.timedOut || result.outputCapped || result.exitCode !== 0) return void 0;
526
- return parseVersion(`${result.stdout}
527
- ${result.stderr}`);
528
- } catch {
529
- return void 0;
530
- } finally {
531
- if (scratch) rmSync(scratch, { recursive: true, force: true });
532
- }
533
- }
534
- function interopFingerprint(kind, facts) {
535
- const recipe = kind.acp;
536
- const parts = [
537
- kind.id,
538
- facts.binary ?? "",
539
- facts.version ?? "",
540
- recipe === void 0 ? "" : `${recipe.command} ${recipe.args.join(" ")}`
541
- ];
542
- return `sha256:${createHash("sha256").update(parts.join("\0")).digest("hex")}`;
543
- }
544
- function countBy(values, match) {
545
- if (values === void 0 || match === void 0) return 0;
546
- return values.filter((value) => value === match).length;
547
- }
548
- function detected(facts) {
549
- return facts.presence === "present" || facts.installDir !== void 0 || facts.skillCount > 0 || facts.projectArtifacts > 0;
550
- }
551
- async function detectInteropAgents(input = {}, previous) {
552
- const cwd = path3.resolve(input.cwd ?? process.cwd());
553
- const home = input.home ?? homedir();
554
- const priorByKind = new Map((previous ?? readInteropReport()?.agents ?? []).map((record2) => [record2.kind, record2]));
555
- const agents = [];
556
- for (const kind of INTEROP_AGENT_KINDS) {
557
- const resolved = resolveOnPath(kind.binaryNames);
558
- const prior = priorByKind.get(kind.id);
559
- const inventoryRoot = input.inventory && kind.inventory ? (input.home === void 0 ? process.env[kind.inventory.homeEnv ?? ""] : void 0) ?? path3.join(home, kind.inventory.userRoot) : void 0;
560
- const installDir = inventoryRoot && existsSync2(inventoryRoot) ? inventoryRoot : installDirOf(kind, home);
561
- const facts = {
562
- kind: kind.id,
563
- presence: resolved.presence,
564
- ...resolved.binary !== void 0 ? { binary: resolved.binary } : {},
565
- ...installDir !== void 0 ? { installDir } : {},
566
- ...kind.acp !== void 0 ? { adapter: adapterPresence(kind, cwd, resolved.presence) } : {},
567
- skillCount: countBy(input.skillSources, kind.skillSource),
568
- projectArtifacts: countBy(input.artifactProviders, kind.adoptionProvider)
569
- };
570
- if (resolved.binary !== void 0) {
571
- const version = input.probeVersion === true ? await probeVersion(resolved.binary) : (
572
- // A run that did not probe keeps the last version seen for the same
573
- // binary, so the fingerprint does not flip between probing callers.
574
- prior?.binary === resolved.binary ? prior.version : void 0
575
- );
576
- if (version !== void 0) facts.version = version;
577
- }
578
- if (input.inventory === true && kind.inventory) {
579
- facts.inventory = discoverInteropInventory(kind, home, cwd, input.home === void 0 ? process.env : {});
580
- facts.skillCount = facts.inventory.items.filter((item) => item.kind === "skill").length;
581
- facts.projectArtifacts = facts.inventory.items.filter((item) => item.scope === "project").length;
582
- }
583
- if (!detected(facts) && !(input.inventory && kind.inventory)) continue;
584
- agents.push({
585
- ...facts,
586
- fingerprint: interopFingerprint(kind, facts),
587
- ...prior?.decision !== void 0 ? { decision: prior.decision } : {},
588
- ...prior?.decidedAt !== void 0 ? { decidedAt: prior.decidedAt } : {},
589
- ...prior?.decidedFingerprint !== void 0 ? { decidedFingerprint: prior.decidedFingerprint } : {},
590
- ...prior?.hintedFingerprint !== void 0 ? { hintedFingerprint: prior.hintedFingerprint } : {}
591
- });
592
- }
593
- return { version: 1, detectedAt: (/* @__PURE__ */ new Date()).toISOString(), agents };
594
- }
595
-
596
- // src/domains/interop/adopt.ts
597
- init_esm_shims();
598
- import { mkdirSync as mkdirSync2, mkdtempSync as mkdtempSync2, rmSync as rmSync2, writeFileSync } from "node:fs";
599
- import { tmpdir as tmpdir2 } from "node:os";
600
- import path6 from "node:path";
601
-
602
- // src/domains/interop/foreign.ts
603
- init_esm_shims();
604
- import { existsSync as existsSync3, lstatSync as lstatSync3, readdirSync as readdirSync3 } from "node:fs";
605
- import path5 from "node:path";
606
-
607
- // src/domains/interop/projection.ts
608
- init_esm_shims();
609
- var import_yaml2 = __toESM(require_dist(), 1);
610
- import { createHash as createHash2 } from "node:crypto";
611
- import { lstatSync as lstatSync2, readdirSync as readdirSync2, readFileSync as readFileSync3, readlinkSync } from "node:fs";
612
- import path4 from "node:path";
613
- import { parse as parseToml2 } from "smol-toml";
614
- var DATA_EXTENSIONS = /* @__PURE__ */ new Set([".md", ".txt", ".rst", ".csv", ".bib"]);
615
- var FORBIDDEN_PARTS = /* @__PURE__ */ new Set([
616
- "hooks",
617
- "output-styles",
618
- "scripts",
619
- "tools",
620
- "node_modules",
621
- ".git",
622
- ".claude-plugin",
623
- ".codex-plugin"
624
- ]);
625
- var HOST_SKILL_KEYS = [
626
- "audit",
627
- "installed-hash",
628
- "source-url",
629
- "installed-by",
630
- "hooks",
631
- "mcpServers",
632
- "allowed-tools",
633
- "tools",
634
- "context",
635
- "agent",
636
- "model",
637
- "effort",
638
- "user-invocable",
639
- "disable-model-invocation",
640
- "argument-hint",
641
- "paths",
642
- "when_to_use"
643
- ];
644
- var PROMPT_KEYS = /* @__PURE__ */ new Set(["description", "argument-hint", "argumentHint"]);
645
- function safeName(name) {
646
- const value = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 45).replace(/-$/u, "");
647
- if (!value) throw new Error("No safe resource identifier.");
648
- return value;
649
- }
650
- function safeData(file) {
651
- return !file.split("/").some((part) => FORBIDDEN_PARTS.has(part)) && DATA_EXTENSIONS.has(path4.extname(file));
652
- }
653
- function listFiles(root, dir, out, depth = 0) {
654
- if (depth > 12 || out.length > 4096) return;
655
- let names;
656
- try {
657
- names = readdirSync2(dir).sort();
658
- } catch {
659
- return;
660
- }
661
- for (const name of names) {
662
- const file = path4.join(dir, name);
663
- const relative = path4.relative(root, file).split(path4.sep).join("/");
664
- try {
665
- const stat = lstatSync2(file);
666
- if (stat.isDirectory()) listFiles(root, file, out, depth + 1);
667
- else out.push(relative);
668
- } catch {
669
- out.push(relative);
670
- }
671
- }
672
- }
673
- function tree(root, dataOnly = false, omitted = []) {
674
- const files = {};
675
- let bytes = 0;
676
- const visit = (dir, depth) => {
677
- if (depth > 12) throw new Error("Source tree exceeds depth limit.");
678
- if (lstatSync2(dir).isSymbolicLink()) throw new Error("Symbolic links are not adoptable.");
679
- for (const name of readdirSync2(dir).sort()) {
680
- const file = path4.join(dir, name);
681
- const relative = path4.relative(root, file).split(path4.sep).join("/");
682
- if (dataOnly && relative.split("/").some((part) => FORBIDDEN_PARTS.has(part) || part === "fleets")) {
683
- let isDirectory = false;
684
- try {
685
- isDirectory = lstatSync2(file).isDirectory();
686
- } catch {
687
- }
688
- if (isDirectory) listFiles(root, file, omitted);
689
- else omitted.push(relative);
690
- continue;
691
- }
692
- const stat = lstatSync2(file);
693
- if (stat.isSymbolicLink() || !stat.isDirectory() && !stat.isFile())
694
- throw new Error("Symbolic links and special files are not adoptable.");
695
- if (stat.isDirectory()) visit(file, depth + 1);
696
- else {
697
- if (dataOnly && relative !== "plugin.json" && (!safeData(relative) || (stat.mode & 73) !== 0)) {
698
- omitted.push(relative);
699
- continue;
700
- }
701
- if ((stat.mode & 73) !== 0) throw new Error(`Executable file is not adoptable: ${path4.relative(root, file)}`);
702
- const text = inventoryText(file);
703
- bytes += Buffer.byteLength(text);
704
- if (bytes > 16 * 1024 * 1024 || Object.keys(files).length >= 2048)
705
- throw new Error("Source tree exceeds adoption limits.");
706
- files[relative] = text;
707
- }
708
- }
709
- };
710
- visit(root, 0);
711
- return files;
712
- }
713
- function reviewFingerprint(root) {
714
- const hash = createHash2("sha256");
715
- let budget = 64 * 1024 * 1024;
716
- let count = 0;
717
- const visit = (dir, depth) => {
718
- if (depth > 12) throw new Error("Source tree exceeds depth limit.");
719
- for (const name of readdirSync2(dir).sort()) {
720
- if (++count > 8192) throw new Error("Source tree exceeds review limits.");
721
- const file = path4.join(dir, name);
722
- const relative = path4.relative(root, file).split(path4.sep).join("/");
723
- const stat = lstatSync2(file);
724
- hash.update(relative).update("\0");
725
- if (stat.isSymbolicLink()) hash.update(`symlink:${readlinkSync(file)}`);
726
- else if (stat.isDirectory()) {
727
- hash.update("dir");
728
- visit(file, depth + 1);
729
- } else if (stat.isFile()) {
730
- hash.update(`file:${stat.mode & 511}:${stat.size}:`);
731
- budget -= stat.size;
732
- if (budget < 0) throw new Error("Source tree exceeds review limits.");
733
- hash.update(readFileSync3(file));
734
- } else hash.update("special");
735
- hash.update("\0");
736
- }
737
- };
738
- visit(root, 0);
739
- return hash.digest("hex");
740
- }
741
- function digest(files) {
742
- const hash = createHash2("sha256");
743
- for (const key of Object.keys(files).sort())
744
- hash.update(key).update("\0").update(files[key] ?? "").update("\0");
745
- return hash.digest("hex");
746
- }
747
- function prose(text) {
748
- const match = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)([\s\S]*)$/.exec(text);
749
- if (!match) return { metadata: {}, body: text };
750
- const metadata = (0, import_yaml2.parse)(match[1] ?? "");
751
- if (!metadata || typeof metadata !== "object" || Array.isArray(metadata))
752
- throw new Error("Invalid resource frontmatter.");
753
- return { metadata, body: match[2] ?? "" };
754
- }
755
- function projectSkill(input) {
756
- const rawOmitted = [];
757
- const rawSource = input.lenient ? tree(input.skillDir, true, rawOmitted) : tree(input.skillDir);
758
- const foreign = (file) => input.excludeTopLevel?.has(file.split("/")[0] ?? "") === true;
759
- const source = Object.fromEntries(Object.entries(rawSource).filter(([file]) => !foreign(file)));
760
- const omittedFiles = rawOmitted.filter((file) => !foreign(file));
761
- delete source["plugin.json"];
762
- if (!input.lenient && Object.keys(source).some((file) => !safeData(file)))
763
- throw new Error("Not adoptable: skill contains executable or non-text companion files.");
764
- const raw = source["SKILL.md"];
765
- if (raw === void 0) throw new Error("Skill directory has no SKILL.md.");
766
- const skill = prose(raw);
767
- const name = typeof skill.metadata.name === "string" && skill.metadata.name.trim() ? skill.metadata.name.trim() : "";
768
- if (!input.lenient && (!name || typeof skill.metadata.description !== "string"))
769
- throw new Error("Skill requires name and description frontmatter.");
770
- if (typeof skill.metadata.description !== "string" || !skill.metadata.description.trim())
771
- throw new Error("Skill requires description frontmatter.");
772
- const actualName = name || input.fallbackName;
773
- const omittedFields = [];
774
- for (const key of ["clio-coder", "clio"]) if (key in skill.metadata) delete skill.metadata[key];
775
- for (const key of HOST_SKILL_KEYS)
776
- if (key in skill.metadata) {
777
- omittedFields.push(key);
778
- delete skill.metadata[key];
779
- }
780
- const id = safeName(actualName);
781
- const body = skill.body;
782
- const retained = [
783
- body,
784
- ...Object.entries(source).filter(([file]) => file !== "SKILL.md").map(([, text]) => text)
785
- ];
786
- const requiredOmissions = omittedFiles.filter((file) => {
787
- const base = path4.basename(file);
788
- return retained.some((text) => text.includes(file) || base.includes(".") && text.includes(base));
789
- });
790
- source["SKILL.md"] = `---
791
- ${(0, import_yaml2.stringify)({ ...skill.metadata, name: actualName, "clio-coder": { audit: "unknown" } })}---
792
- ${body}`;
793
- return {
794
- id,
795
- name: actualName,
796
- files: Object.fromEntries(Object.entries(source).map(([file, text]) => [`skills/${id}/${file}`, text])),
797
- componentPath: `skills/${id}/SKILL.md`,
798
- omittedFields,
799
- omittedFiles,
800
- requiredOmissions,
801
- bindings: []
802
- };
803
- }
804
- function projectAgent(input) {
805
- if (input.text === void 0 && (lstatSync2(input.file).mode & 73) !== 0)
806
- throw new Error("Executable files are not adoptable.");
807
- const raw = input.text ?? inventoryText(input.file);
808
- const parsed = input.file.endsWith(".toml") ? (() => {
809
- const data = parseToml2(raw);
810
- if (typeof data.developer_instructions !== "string") throw new Error("Agent developer_instructions is unknown.");
811
- return { metadata: data, body: data.developer_instructions };
812
- })() : prose(raw);
813
- if (!parsed.body.trim()) throw new Error("Empty resource body.");
814
- const name = typeof parsed.metadata.name === "string" && parsed.metadata.name.trim() ? parsed.metadata.name.trim() : input.name;
815
- const id = safeName(name);
816
- const omittedFields = Object.keys(parsed.metadata).filter(
817
- (key) => !["name", "description", "developer_instructions", ...input.bindSkills ? ["skills"] : []].includes(key)
818
- );
819
- const metadata = {
820
- description: typeof parsed.metadata.description === "string" ? parsed.metadata.description : `Adopted agent ${name}`,
821
- version: 1,
822
- name,
823
- tools: { required: ["read"], optional: ["grep", "find", "ls"] },
824
- skills: [...input.bindSkills ?? []],
825
- audience: "custom",
826
- category: "research",
827
- capabilityClass: "read-only",
828
- latencyClass: "balanced",
829
- projectContextTier: "bounded",
830
- budget: { toolCalls: 24, readReserve: 4, synthesis: true },
831
- resultContract: { kind: "artifact-report" },
832
- tags: ["interop"]
833
- };
834
- parseAgentRecipeSchema({
835
- id,
836
- source: "plugin",
837
- filepath: input.file,
838
- body: parsed.body,
839
- frontmatter: metadata
840
- });
841
- const componentPath = `agents/${id}.md`;
842
- const declaredSkills = parsed.metadata.skills;
843
- const bindings = Array.isArray(declaredSkills) ? declaredSkills.filter((skill) => typeof skill === "string") : typeof declaredSkills === "string" ? declaredSkills.split(",").map((skill) => skill.trim()).filter(Boolean) : [];
844
- return {
845
- id,
846
- name,
847
- files: { [componentPath]: `---
848
- ${(0, import_yaml2.stringify)(metadata)}---
849
- ${parsed.body}` },
850
- componentPath,
851
- omittedFields,
852
- omittedFiles: [],
853
- requiredOmissions: [],
854
- bindings
855
- };
856
- }
857
- function projectPrompt(input) {
858
- if (input.text === void 0 && (lstatSync2(input.file).mode & 73) !== 0)
859
- throw new Error("Executable files are not adoptable.");
860
- const parsed = prose(input.text ?? inventoryText(input.file));
861
- if (!parsed.body.trim()) throw new Error("Empty resource body.");
862
- const name = input.name;
863
- const id = safeName(name);
864
- const omittedFields = Object.keys(parsed.metadata).filter((key) => !PROMPT_KEYS.has(key));
865
- const metadata = {
866
- description: typeof parsed.metadata.description === "string" ? parsed.metadata.description : `Adopted prompt ${name}`
867
- };
868
- const hint = parsed.metadata["argument-hint"] ?? parsed.metadata.argumentHint;
869
- if (typeof hint === "string") metadata["argument-hint"] = hint;
870
- const componentPath = `prompts/${id}.md`;
871
- return {
872
- id,
873
- name,
874
- files: { [componentPath]: `---
875
- ${(0, import_yaml2.stringify)(metadata)}---
876
- ${parsed.body}` },
877
- componentPath,
878
- omittedFields,
879
- omittedFiles: [],
880
- requiredOmissions: [],
881
- bindings: []
882
- };
883
- }
884
-
885
- // src/domains/interop/foreign.ts
886
- var FOREIGN_MANIFESTS = [
887
- { format: "portable", path: "plugin.json" },
888
- { format: "claude-code", path: ".claude-plugin/plugin.json" },
889
- { format: "codex", path: ".codex-plugin/plugin.json" }
890
- ];
891
- function detectForeignPlugin(root, explicit) {
892
- const present = (relative) => {
893
- try {
894
- lstatSync3(path5.join(root, relative));
895
- return true;
896
- } catch {
897
- return false;
898
- }
899
- };
900
- const candidates = FOREIGN_MANIFESTS.filter(({ path: relative }) => present(relative));
901
- const diagnostics = [];
902
- const portable = candidates.find((candidate) => candidate.format === "portable");
903
- if (portable) {
904
- if (!lstatSync3(path5.join(root, "plugin.json")).isFile())
905
- diagnostics.push("Root plugin.json exists but is not a regular file; the portable manifest is invalid.");
906
- if (explicit)
907
- diagnostics.push(`Root plugin.json is portable; --format ${explicit} is ignored and no foreign fallback runs.`);
908
- for (const other of candidates.filter((candidate) => candidate.format !== "portable"))
909
- diagnostics.push(`Ignoring ${other.path}: the portable root plugin.json takes precedence.`);
910
- return { format: "portable", manifestPath: portable.path, candidates, ambiguous: false, diagnostics };
911
- }
912
- const hidden = candidates.filter((candidate) => candidate.format !== "portable");
913
- if (hidden.length === 0)
914
- return {
915
- format: "none",
916
- candidates,
917
- ambiguous: false,
918
- diagnostics: [
919
- "No plugin manifest found: expected plugin.json, .claude-plugin/plugin.json or .codex-plugin/plugin.json."
920
- ]
921
- };
922
- if (explicit) {
923
- const chosen = hidden.find((candidate) => candidate.format === explicit);
924
- if (!chosen)
925
- return {
926
- format: "none",
927
- candidates,
928
- ambiguous: false,
929
- diagnostics: [`No ${explicit} manifest present; found ${hidden.map((item) => item.path).join(", ")}.`]
930
- };
931
- return { format: chosen.format, manifestPath: chosen.path, candidates, ambiguous: false, diagnostics };
932
- }
933
- if (hidden.length > 1)
934
- return {
935
- format: "none",
936
- candidates,
937
- ambiguous: true,
938
- diagnostics: [
939
- `Both ${hidden.map((item) => item.path).join(" and ")} are present; choose --format claude or --format codex.`
940
- ]
941
- };
942
- const only = hidden[0];
943
- return { format: only.format, manifestPath: only.path, candidates, ambiguous: false, diagnostics };
944
- }
945
- function record(value) {
946
- return value !== null && typeof value === "object" && !Array.isArray(value);
947
- }
948
- function pathList(value, field, problems) {
949
- if (value === void 0) return [];
950
- const items = typeof value === "string" ? [value] : Array.isArray(value) ? value : void 0;
951
- if (!items || items.some((item) => typeof item !== "string")) {
952
- problems.push(`Manifest ${field} must be a path or list of paths; ignored.`);
953
- return [];
954
- }
955
- return items;
956
- }
957
- function contained(root, relative) {
958
- if (relative.includes("\\") || relative.includes("\0") || path5.isAbsolute(relative))
959
- throw new Error(`Manifest path is not relative: ${relative}`);
960
- const full = path5.resolve(root, relative);
961
- const rel = path5.relative(root, full);
962
- if (rel === ".." || rel.startsWith(`..${path5.sep}`)) throw new Error(`Manifest path escapes the package: ${relative}`);
963
- let cursor = root;
964
- for (const part of rel.split(path5.sep).filter(Boolean)) {
965
- cursor = path5.join(cursor, part);
966
- if (lstatSync3(cursor).isSymbolicLink()) throw new Error(`Manifest path crosses a symbolic link: ${relative}`);
967
- }
968
- return full;
969
- }
970
- function relativeTo(root, file) {
971
- return path5.relative(root, file).split(path5.sep).join("/");
972
- }
973
- function isDir(file) {
974
- try {
975
- return lstatSync3(file).isDirectory();
976
- } catch {
977
- return false;
978
- }
979
- }
980
- function isFile(file) {
981
- try {
982
- return lstatSync3(file).isFile();
983
- } catch {
984
- return false;
985
- }
986
- }
987
- function skillDirectories(root, declared) {
988
- const base = contained(root, declared);
989
- if (!isDir(base)) return [];
990
- if (isFile(path5.join(base, "SKILL.md"))) return [base];
991
- return readdirSync3(base).sort().map((name) => path5.join(base, name)).filter((dir) => !lstatSync3(dir).isSymbolicLink() && isDir(dir) && isFile(path5.join(dir, "SKILL.md")));
992
- }
993
- function markdownFiles(root, declared, extensions) {
994
- const base = contained(root, declared);
995
- if (isFile(base)) return extensions.some((ext) => base.endsWith(ext)) ? [base] : [];
996
- if (!isDir(base)) return [];
997
- const found = [];
998
- const walk = (dir, depth) => {
999
- if (depth > 6) return;
1000
- for (const name of readdirSync3(dir).sort()) {
1001
- const file = path5.join(dir, name);
1002
- const stat = lstatSync3(file);
1003
- if (stat.isSymbolicLink()) continue;
1004
- if (stat.isDirectory()) walk(file, depth + 1);
1005
- else if (extensions.some((ext) => name.endsWith(ext))) found.push(file);
1006
- }
1007
- };
1008
- walk(base, 0);
1009
- return found;
1010
- }
1011
- var CLAUDE_UNSUPPORTED_FIELDS = [
1012
- "hooks",
1013
- "mcpServers",
1014
- "lspServers",
1015
- "outputStyles",
1016
- "workflows",
1017
- "experimental",
1018
- "userConfig",
1019
- "channels",
1020
- "defaultEnabled"
1021
- ];
1022
- var CODEX_UNSUPPORTED_FIELDS = ["apps", "hooks", "mcpServers", "interface"];
1023
- var UNSUPPORTED_FILES = [
1024
- "hooks/hooks.json",
1025
- ".mcp.json",
1026
- "mcp.json",
1027
- ".lsp.json",
1028
- ".app.json",
1029
- "monitors/monitors.json",
1030
- "output-styles",
1031
- "scripts",
1032
- "tools"
1033
- ];
1034
- function projectForeignPlugin(input) {
1035
- const root = path5.resolve(input.root);
1036
- const manifestPath = input.manifestPath ?? (input.format === "claude-code" ? ".claude-plugin/plugin.json" : ".codex-plugin/plugin.json");
1037
- const manifestFile = contained(root, manifestPath);
1038
- if (!isFile(manifestFile)) throw new Error(`Missing ${manifestPath}.`);
1039
- const parsed = JSON.parse(inventoryText(manifestFile));
1040
- if (!record(parsed)) throw new Error(`${manifestPath} must be a JSON object.`);
1041
- const notes = [];
1042
- const unsupported = [];
1043
- const outcomes = [];
1044
- const rawName = typeof parsed.name === "string" && parsed.name.trim() ? parsed.name.trim() : "";
1045
- if (!rawName) throw new Error(`${manifestPath} requires a name.`);
1046
- const id = isPluginId(rawName) ? rawName : safeName(rawName);
1047
- if (id !== rawName) notes.push(`Package name "${rawName}" normalized to Clio id "${id}".`);
1048
- let version = "0.0.0";
1049
- if (parsed.version === void 0) notes.push("Vendor manifest declares no version; projected as 0.0.0.");
1050
- else if (isSemanticVersion(parsed.version)) version = parsed.version;
1051
- else throw new Error(`${manifestPath} version ${JSON.stringify(parsed.version)} is not a Semantic Version.`);
1052
- notes.push(
1053
- `Vendor identity: ${manifestPath} name ${JSON.stringify(rawName)}, version ${parsed.version === void 0 ? "absent" : JSON.stringify(parsed.version)}.`
1054
- );
1055
- const description = typeof parsed.description === "string" ? parsed.description : `Imported ${input.format === "claude-code" ? "Claude Code" : "Codex"} plugin ${rawName}`;
1056
- const fieldList = input.format === "claude-code" ? CLAUDE_UNSUPPORTED_FIELDS : CODEX_UNSUPPORTED_FIELDS;
1057
- for (const field of fieldList)
1058
- if (parsed[field] !== void 0) unsupported.push(`${manifestPath}#${field}: never activated by Clio import.`);
1059
- const requirements = [];
1060
- if (parsed.dependencies !== void 0) {
1061
- if (!Array.isArray(parsed.dependencies)) throw new Error(`${manifestPath} dependencies must be an array.`);
1062
- for (const dependency of parsed.dependencies) {
1063
- const name = typeof dependency === "string" ? dependency : record(dependency) ? dependency.name : void 0;
1064
- if (typeof name !== "string" || !name.trim())
1065
- throw new Error(`${manifestPath} declares a dependency without a name; the package cannot be imported.`);
1066
- if (record(dependency) && dependency.version !== void 0)
1067
- throw new Error(
1068
- `${manifestPath} dependency ${name} declares version constraint ${JSON.stringify(dependency.version)}; version-constrained vendor dependencies are not supported. Import ${name} first and remove the constraint in a reviewed copy, or skip this package.`
1069
- );
1070
- if (record(dependency)) {
1071
- const unknown = Object.keys(dependency).filter((key) => !["name", "version"].includes(key));
1072
- if (unknown.length)
1073
- throw new Error(
1074
- `${manifestPath} dependency ${name} declares unsupported fields ${unknown.join(", ")}; source or marketplace constrained dependencies cannot be imported.`
1075
- );
1076
- }
1077
- if (!isPluginId(name))
1078
- throw new Error(
1079
- `${manifestPath} dependency ${JSON.stringify(name)} is not a portable identifier; it cannot be matched to an imported package.`
1080
- );
1081
- requirements.push(`plugin:${name}`);
1082
- notes.push(
1083
- `Vendor dependency ${name} requires plugin:${name} imported from the same ${input.format} format; native packages with that id do not satisfy it.`
1084
- );
1085
- }
1086
- }
1087
- for (const file of UNSUPPORTED_FILES)
1088
- if (existsSync3(path5.join(root, file))) unsupported.push(`${file}: host runtime content is not imported.`);
1089
- const omittedTree = [];
1090
- const sourceFiles = tree(root, true, omittedTree);
1091
- const projected = /* @__PURE__ */ new Set();
1092
- const files = {};
1093
- const components = [];
1094
- const resources = {};
1095
- const usedIds = /* @__PURE__ */ new Map();
1096
- const claim = (resource, kind, source) => {
1097
- const key = `${kind}:${resource.id}`;
1098
- const previous = usedIds.get(key);
1099
- if (previous) {
1100
- outcomes.push({
1101
- kind,
1102
- name: resource.name,
1103
- source,
1104
- status: "unsupported",
1105
- reason: `Resource id ${resource.id} already provided by ${previous}.`
1106
- });
1107
- return false;
1108
- }
1109
- usedIds.set(key, source);
1110
- return true;
1111
- };
1112
- const declaredSkills = [];
1113
- const declaredCommands = [];
1114
- const declaredAgents = [];
1115
- const problems = [];
1116
- const skillsField = pathList(parsed.skills, "skills", problems);
1117
- if (input.format === "claude-code") {
1118
- declaredSkills.push("skills", ...skillsField);
1119
- const commands = pathList(parsed.commands, "commands", problems);
1120
- declaredCommands.push(...commands.length ? commands : ["commands"]);
1121
- if (commands.length && isDir(path5.join(root, "commands")) && !commands.some((c) => path5.resolve(root, c) === path5.join(root, "commands")))
1122
- notes.push("Manifest commands replaces the default commands/ directory; the default folder is not scanned.");
1123
- const agents = pathList(parsed.agents, "agents", problems);
1124
- declaredAgents.push(...agents.length ? agents : ["agents"]);
1125
- if (agents.length && isDir(path5.join(root, "agents")) && !agents.some((a) => path5.resolve(root, a) === path5.join(root, "agents")))
1126
- notes.push("Manifest agents replaces the default agents/ directory; the default folder is not scanned.");
1127
- } else {
1128
- declaredSkills.push(...skillsField.length ? skillsField : ["skills"]);
1129
- if (isDir(path5.join(root, "commands")) || isDir(path5.join(root, "agents")))
1130
- notes.push("commands/ and agents/ are not Codex plugin components and were not imported.");
1131
- }
1132
- notes.push(...problems);
1133
- const seenSkillDirs = /* @__PURE__ */ new Set();
1134
- const skillDirs = [];
1135
- for (const declared of declaredSkills) {
1136
- try {
1137
- for (const dir of skillDirectories(root, declared))
1138
- if (!seenSkillDirs.has(dir)) {
1139
- seenSkillDirs.add(dir);
1140
- skillDirs.push(dir);
1141
- }
1142
- } catch (error) {
1143
- unsupported.push(`skills path ${declared}: ${error instanceof Error ? error.message : String(error)}`);
1144
- }
1145
- }
1146
- if (input.format === "claude-code" && skillDirs.length === 0 && !isDir(path5.join(root, "skills")) && skillsField.length === 0 && isFile(path5.join(root, "SKILL.md"))) {
1147
- skillDirs.push(root);
1148
- notes.push("Root SKILL.md loaded as the plugin's single skill (documented Claude Code fallback).");
1149
- }
1150
- const siblingRoots = new Set(
1151
- [
1152
- ".claude-plugin",
1153
- ".codex-plugin",
1154
- "skills",
1155
- "commands",
1156
- "agents",
1157
- ...declaredCommands,
1158
- ...declaredAgents,
1159
- ...skillsField
1160
- ].map((entry) => entry.replace(/^\.\//u, "").split("/")[0] ?? "").filter((entry) => entry && entry !== ".")
1161
- );
1162
- for (const dir of skillDirs) {
1163
- const source = dir === root ? "SKILL.md" : `${relativeTo(root, dir)}/SKILL.md`;
1164
- const fallbackName = dir === root ? rawName : path5.basename(dir);
1165
- const prefix = dir === root ? "" : `${relativeTo(root, dir)}/`;
1166
- try {
1167
- const resource = projectSkill({
1168
- skillDir: dir,
1169
- fallbackName,
1170
- lenient: true,
1171
- ...dir === root ? { excludeTopLevel: siblingRoots } : {}
1172
- });
1173
- const omittedFiles = resource.omittedFiles.map((file) => `${prefix}${file}`);
1174
- if (resource.requiredOmissions.length) {
1175
- outcomes.push({
1176
- kind: "skill",
1177
- name: resource.name,
1178
- source,
1179
- status: "unsupported",
1180
- reason: `Instructions reference omitted companions: ${resource.requiredOmissions.join(", ")}.`,
1181
- omittedFields: resource.omittedFields,
1182
- omittedFiles
1183
- });
1184
- continue;
1185
- }
1186
- if (!claim(resource, "skill", source)) continue;
1187
- Object.assign(files, resource.files);
1188
- components.push({ kind: "skill", id: resource.id, path: resource.componentPath });
1189
- resources.skills = "skills";
1190
- for (const file of Object.keys(resource.files))
1191
- projected.add(`${prefix}${file.slice(`skills/${resource.id}/`.length)}`);
1192
- outcomes.push({
1193
- kind: "skill",
1194
- name: resource.name,
1195
- source,
1196
- status: "converted",
1197
- id: resource.id,
1198
- destination: resource.componentPath,
1199
- ...resource.omittedFields.length ? { omittedFields: resource.omittedFields } : {},
1200
- ...omittedFiles.length ? { omittedFiles } : {}
1201
- });
1202
- } catch (error) {
1203
- outcomes.push({
1204
- kind: "skill",
1205
- name: fallbackName,
1206
- source,
1207
- status: "unsupported",
1208
- reason: error instanceof Error ? error.message : String(error)
1209
- });
1210
- }
1211
- }
1212
- const collect = (declared, kind, extensions, convert) => {
1213
- const seen = /* @__PURE__ */ new Set();
1214
- for (const entry of declared) {
1215
- let found;
1216
- try {
1217
- found = markdownFiles(root, entry, extensions);
1218
- } catch (error) {
1219
- unsupported.push(`${kind} path ${entry}: ${error instanceof Error ? error.message : String(error)}`);
1220
- continue;
1221
- }
1222
- for (const file of found) {
1223
- if (seen.has(file)) continue;
1224
- seen.add(file);
1225
- const source = relativeTo(root, file);
1226
- const name = path5.basename(file, path5.extname(file));
1227
- try {
1228
- const resource = convert(file, name);
1229
- if (!claim(resource, kind, source)) continue;
1230
- Object.assign(files, resource.files);
1231
- components.push({ kind, id: resource.id, path: resource.componentPath });
1232
- resources[`${kind}s`] = `${kind}s`;
1233
- projected.add(source);
1234
- outcomes.push({
1235
- kind,
1236
- name: resource.name,
1237
- source,
1238
- status: "converted",
1239
- id: resource.id,
1240
- destination: resource.componentPath,
1241
- ...resource.omittedFields.length ? { omittedFields: resource.omittedFields } : {}
1242
- });
1243
- } catch (error) {
1244
- outcomes.push({
1245
- kind,
1246
- name,
1247
- source,
1248
- status: "unsupported",
1249
- reason: error instanceof Error ? error.message : String(error)
1250
- });
1251
- }
1252
- }
1253
- }
1254
- };
1255
- if (input.format === "claude-code") {
1256
- collect(declaredCommands, "prompt", [".md"], (file, name) => projectPrompt({ file, name }));
1257
- const convertedSkills = new Set(
1258
- outcomes.filter((o) => o.kind === "skill" && o.status === "converted").map((o) => o.name)
1259
- );
1260
- collect(declaredAgents, "agent", [".md"], (file, name) => {
1261
- const declared = projectAgent({ file, name }).bindings;
1262
- const bound = declared.filter((skill) => !convertedSkills.has(skill));
1263
- if (bound.length)
1264
- throw new Error(`Agent binds skills that were not converted: ${bound.join(", ")}; Clio cannot honor the binding.`);
1265
- return projectAgent({ file, name, bindSkills: declared });
1266
- });
1267
- }
1268
- const omitted = [
1269
- ...omittedTree,
1270
- ...Object.keys(sourceFiles).filter((file) => !projected.has(file) && file !== manifestPath)
1271
- ].sort();
1272
- files["plugin.json"] = `${JSON.stringify(
1273
- {
1274
- $schema: PLUGIN_SCHEMA,
1275
- name: id,
1276
- version,
1277
- description,
1278
- ...record(parsed.author) && Object.values(parsed.author).every((v) => typeof v === "string") ? {
1279
- author: Object.fromEntries(
1280
- Object.entries(parsed.author).filter(([key]) => ["name", "email", "url"].includes(key))
1281
- )
1282
- } : {},
1283
- ...typeof parsed.homepage === "string" ? { homepage: parsed.homepage } : {},
1284
- ...typeof parsed.repository === "string" ? { repository: parsed.repository } : {},
1285
- ...typeof parsed.license === "string" ? { license: parsed.license } : {},
1286
- ...Array.isArray(parsed.keywords) && parsed.keywords.every((k) => typeof k === "string") ? { keywords: parsed.keywords } : {},
1287
- extensions: {
1288
- [PLUGIN_EXTENSION_KEY]: {
1289
- manifestVersion: 1,
1290
- ...requirements.length ? { requires: requirements } : {},
1291
- resources,
1292
- components
1293
- }
1294
- }
1295
- },
1296
- null,
1297
- 2
1298
- )}
1299
- `;
1300
- return {
1301
- format: input.format,
1302
- manifestPath,
1303
- id,
1304
- version,
1305
- description,
1306
- files,
1307
- requirements,
1308
- outcomes,
1309
- unsupported: [...new Set(unsupported)],
1310
- omitted: [...new Set(omitted)],
1311
- notes
1312
- };
1313
- }
1314
-
1315
- // src/domains/interop/install.ts
1316
- init_esm_shims();
1317
- function installInteropPackage(input) {
1318
- return installLibraryPackage(input);
1319
- }
1320
-
1321
- // src/domains/interop/adopt.ts
1322
- function preparePortablePackage(root) {
1323
- const candidate = readPluginManifest(root);
1324
- if (!candidate.valid || !candidate.manifest)
1325
- throw new Error(
1326
- `Not adoptable: invalid portable root plugin.json (${candidate.diagnostics.map((d) => d.message).join("; ")}).`
1327
- );
1328
- const manifest = candidate.manifest;
1329
- const omitted = [];
1330
- const files = tree(root, true, omitted);
1331
- const raw = JSON.parse(files["plugin.json"] ?? "{}");
1332
- const resources = Object.fromEntries(
1333
- Object.entries(manifest.clio.resources).filter(([key]) => ["skills", "agents", "prompts"].includes(key))
1334
- );
1335
- const components = manifest.clio.components.filter(
1336
- (component) => ["skill", "agent", "prompt", "resource"].includes(component.kind) && files[component.path] !== void 0
1337
- );
1338
- const retained = new Set(components.map((component) => `${component.kind}:${component.id}`));
1339
- if (components.some((component) => component.requires?.some((ref) => !retained.has(ref))))
1340
- throw new Error("Not adoptable: retained resources require omitted executable components.");
1341
- const kind = manifest.clio.kind ?? "plugin";
1342
- if (!["plugin", "skill", "agent", "prompt"].includes(kind))
1343
- throw new Error(
1344
- `Not adoptable: ${kind} packages have no data-only projection; install them through the library instead.`
1345
- );
1346
- if (kind !== "plugin" && !components.some((component) => component.kind === kind))
1347
- throw new Error(`Not adoptable: the ${kind} package's public ${kind} component is not projectable.`);
1348
- const validation = validateLibraryPackage(root);
1349
- if (!validation.valid)
1350
- throw new Error(
1351
- `Not adoptable: invalid recipe content (${validation.validation.diagnostics.filter((item) => item.severity === "error").map((item) => item.message).join("; ")}).`
1352
- );
1353
- const recipes = validation.validation.resources.filter(
1354
- (resource) => ["skill", "agent", "prompt"].includes(resource.kind) && files[resource.path] !== void 0
1355
- );
1356
- if (recipes.length === 0) throw new Error("Not adoptable: the portable package has no supported data-only recipes.");
1357
- const outcomes = [];
1358
- for (const resource of recipes) {
1359
- const component = components.find((item) => item.kind === resource.kind && item.path === resource.path);
1360
- const skillDir = resource.kind === "skill" ? path6.posix.dirname(resource.path) : void 0;
1361
- const dir = skillDir === void 0 ? void 0 : skillDir === "." ? "" : `${skillDir}/`;
1362
- const texts = Object.entries(files).filter(([file]) => file !== "plugin.json" && (dir === void 0 ? file === resource.path : file.startsWith(dir))).map(([, text]) => text);
1363
- const needed = omitted.filter((file) => {
1364
- const own = dir !== void 0 && file.startsWith(dir);
1365
- const base = path6.posix.basename(file);
1366
- return texts.some((text) => text.includes(file) || own && base.includes(".") && text.includes(base));
1367
- });
1368
- if (needed.length)
1369
- throw new Error(
1370
- `Not adoptable: ${resource.kind} ${resource.name} references omitted companions (${needed.join(", ")}); the data-only import cannot claim it works. Use library install for script-bearing packages.`
1371
- );
1372
- outcomes.push({
1373
- kind: resource.kind,
1374
- name: resource.name,
1375
- source: resource.path,
1376
- status: "converted",
1377
- ...component ? { id: component.id } : {},
1378
- destination: resource.path
1379
- });
1380
- }
1381
- raw.extensions = {
1382
- [PLUGIN_EXTENSION_KEY]: {
1383
- manifestVersion: 1,
1384
- ...kind !== "plugin" ? { kind } : {},
1385
- ...manifest.clio.requires ? { requires: manifest.clio.requires } : {},
1386
- resources,
1387
- components,
1388
- ...manifest.clio.compatibility ? { compatibility: manifest.clio.compatibility } : {}
1389
- }
1390
- };
1391
- files["plugin.json"] = JSON.stringify(raw, null, 2);
1392
- return {
1393
- id: manifest.name,
1394
- version: manifest.version ?? "0.0.0",
1395
- files,
1396
- note: "Data-only portable projection; hooks, MCP, scripts, tools, fleets and host settings are skipped. References to omitted files are unavailable.",
1397
- omitted,
1398
- requirements: [...manifest.clio.requires ?? []],
1399
- format: "portable",
1400
- outcomes
1401
- };
1402
- }
1403
- function prepareForeignPackage(root, format) {
1404
- const detection = detectForeignPlugin(root, format);
1405
- if (detection.format === "portable") throw new Error("Portable root plugin.json present; use the portable route.");
1406
- if (detection.format === "none") throw new Error(`Not adoptable: ${detection.diagnostics.join(" ")}`);
1407
- const projection = projectForeignPlugin({
1408
- root,
1409
- format: detection.format,
1410
- ...detection.manifestPath ? { manifestPath: detection.manifestPath } : {}
1411
- });
1412
- if (!projection.outcomes.some((outcome) => outcome.status === "converted"))
1413
- throw new Error(
1414
- `Not adoptable: no supported recipe converted from ${detection.manifestPath}${projection.outcomes.length ? ` (${projection.outcomes.map((o) => `${o.kind} ${o.name}: ${o.reason ?? "unsupported"}`).join("; ")})` : ""}.`
1415
- );
1416
- return {
1417
- id: projection.id,
1418
- version: projection.version,
1419
- files: projection.files,
1420
- note: `${detection.format === "claude-code" ? "Claude Code" : "Codex"} plugin normalized to a portable Clio package; hooks, MCP, LSP, scripts and host settings are never activated.${projection.notes.length ? ` ${projection.notes.join(" ")}` : ""}`,
1421
- omitted: projection.omitted,
1422
- requirements: projection.requirements,
1423
- format: detection.format,
1424
- outcomes: projection.outcomes,
1425
- unsupported: projection.unsupported
1426
- };
1427
- }
1428
- function prepared(item, host) {
1429
- let value;
1430
- if (item.kind === "plugin") {
1431
- const detection = detectForeignPlugin(item.path);
1432
- value = detection.format === "portable" || detection.format === "none" ? preparePortablePackage(item.path) : prepareForeignPackage(item.path, detection.format);
1433
- } else {
1434
- const id = safeName(`${host}-${item.kind}-${item.name}`);
1435
- const plural = `${item.kind}s`;
1436
- let note = "Text only; foreign execution settings are not imported.";
1437
- const resource = item.kind === "skill" ? projectSkill({ skillDir: path6.dirname(item.path), fallbackName: item.name }) : item.kind === "agent" ? projectAgent({ file: item.path, name: item.name }) : projectPrompt({ file: item.path, name: item.name });
1438
- if (item.kind === "agent")
1439
- note = "Persona copied into a read-only Clio recipe; host tools, permissions, model, hooks and skill bindings are omitted.";
1440
- const files = { ...resource.files };
1441
- files["plugin.json"] = JSON.stringify(
1442
- {
1443
- $schema: PLUGIN_SCHEMA,
1444
- name: id,
1445
- version: "0.0.0",
1446
- description: `Adopted ${item.kind} from ${host}`,
1447
- extensions: {
1448
- [PLUGIN_EXTENSION_KEY]: {
1449
- manifestVersion: 1,
1450
- kind: item.kind,
1451
- resources: { [plural]: plural },
1452
- components: [{ kind: item.kind, id: resource.id, path: resource.componentPath }]
1453
- }
1454
- }
1455
- },
1456
- null,
1457
- 2
1458
- );
1459
- value = {
1460
- id,
1461
- version: "0.0.0",
1462
- files,
1463
- note,
1464
- omitted: [],
1465
- requirements: [],
1466
- ...resource.omittedFields.length ? {
1467
- outcomes: [
1468
- {
1469
- kind: item.kind,
1470
- name: resource.name,
1471
- source: item.path,
1472
- status: "converted",
1473
- id: resource.id,
1474
- destination: resource.componentPath,
1475
- omittedFields: resource.omittedFields
1476
- }
1477
- ]
1478
- } : {}
1479
- };
1480
- }
1481
- const manifest = JSON.parse(value.files["plugin.json"] ?? "{}");
1482
- manifest.extensions = {
1483
- ...manifest.extensions,
1484
- "ai.iowarp.clio.interop": {
1485
- host,
1486
- source: item.path,
1487
- sourceScope: item.scope,
1488
- untrusted: true,
1489
- ...value.format ? { format: value.format } : {}
1490
- }
1491
- };
1492
- value.files["plugin.json"] = `${JSON.stringify(manifest, null, 2)}
1493
- `;
1494
- return value;
1495
- }
1496
- function vendorOf(format) {
1497
- return format === "claude-code" || format === "codex" ? format : void 0;
1498
- }
1499
- function unmetRequirements(requirements, cwd, scope, vendor) {
1500
- if (requirements.length === 0) return [];
1501
- const available = new Map(
1502
- listInstalledPlugins(cwd, { all: true, ...scope === "user" ? { scope } : {} }).filter((pkg) => pkg.loadable).map((pkg) => [`${pkg.kind ?? "plugin"}:${pkg.id}`, pkg])
1503
- );
1504
- const problems = /* @__PURE__ */ new Set();
1505
- if (vendor)
1506
- for (const ref of requirements) {
1507
- const pkg = available.get(ref);
1508
- if (!pkg) continue;
1509
- const origin = readPluginInstallRecord(pkg.id, { cwd, scope: pkg.scope })?.origin;
1510
- const provenance = typeof origin === "object" && (origin.kind === "import" || origin.kind === "interop") ? origin.format : void 0;
1511
- if (provenance !== vendor)
1512
- problems.add(
1513
- `${ref} (installed package is not an imported ${vendor} plugin; a same-named native package does not satisfy a vendor dependency)`
1514
- );
1515
- }
1516
- const visiting = /* @__PURE__ */ new Set();
1517
- const checked = /* @__PURE__ */ new Set();
1518
- const visit = (ref) => {
1519
- if (visiting.has(ref)) {
1520
- problems.add(`${ref} (dependency cycle)`);
1521
- return;
1522
- }
1523
- if (checked.has(ref)) return;
1524
- const dependency = available.get(ref);
1525
- if (!dependency) {
1526
- problems.add(`${ref} (missing, inactive, or unavailable in ${scope} scope)`);
1527
- return;
1528
- }
1529
- visiting.add(ref);
1530
- for (const nested of dependency.manifest?.clio.requires ?? []) visit(nested);
1531
- visiting.delete(ref);
1532
- checked.add(ref);
1533
- };
1534
- for (const ref of requirements) visit(ref);
1535
- return [...problems];
1536
- }
1537
- function planInteropAdoption(input) {
1538
- const cwd = path6.resolve(input.cwd ?? process.cwd());
1539
- const scope = input.scope ?? "user";
1540
- const installed = listInstalledPlugins(cwd, { all: true });
1541
- const installedSkills = loadSkills({
1542
- cwd,
1543
- roots: [
1544
- { path: path6.join(clioConfigDir(), "skills"), scope: "user" },
1545
- { path: path6.join(cwd, ".clio-coder/skills"), scope: "project" },
1546
- ...installed.flatMap(
1547
- (pkg) => pkg.resources.skills ? [{ path: path6.join(pkg.rootPath, pkg.resources.skills), rootPath: pkg.rootPath, scope: "package" }] : []
1548
- )
1549
- ]
1550
- }).items;
1551
- const installedPrompts = loadPromptTemplates({
1552
- cwd,
1553
- roots: [
1554
- { path: path6.join(clioConfigDir(), "prompts"), scope: "user" },
1555
- { path: path6.join(cwd, ".clio-coder/prompts"), scope: "project" },
1556
- ...installed.flatMap(
1557
- (pkg) => pkg.resources.prompts ? [{ path: path6.join(pkg.rootPath, pkg.resources.prompts), rootPath: pkg.rootPath, scope: "package" }] : []
1558
- )
1559
- ]
1560
- }).items;
1561
- const promptBodies = new Set(
1562
- installedPrompts.flatMap((prompt) => {
1563
- try {
1564
- return [prose(inventoryText(prompt.filePath)).body];
1565
- } catch {
1566
- return [];
1567
- }
1568
- })
1569
- );
1570
- const installedContent = new Set(
1571
- installed.flatMap((pkg) => {
1572
- try {
1573
- const files = tree(pkg.rootPath);
1574
- delete files["plugin.json"];
1575
- return [digest(files)];
1576
- } catch {
1577
- return [];
1578
- }
1579
- })
1580
- );
1581
- const planned = /* @__PURE__ */ new Set();
1582
- const plan = { host: input.host, cwd, scope, entries: [] };
1583
- for (const item of input.inventory.items) {
1584
- const skip = (reason) => {
1585
- plan.entries.push({ item, action: "skip", reason });
1586
- };
1587
- if (!["skill", "agent", "prompt", "plugin"].includes(item.kind)) {
1588
- skip(`Not adoptable: ${item.kind} is executable configuration or unsupported presentation data.`);
1589
- continue;
1590
- }
1591
- if (input.kind && item.kind !== input.kind) {
1592
- skip(`Excluded by --kind ${input.kind}.`);
1593
- continue;
1594
- }
1595
- if (item.plugin && !input.kind && planned.has(item.plugin)) {
1596
- skip("Provided by an installed or planned portable plugin.");
1597
- continue;
1598
- }
1599
- try {
1600
- if (item.kind === "skill" && installedSkills.some((skill) => skill.normalizedHash === normalizedSkillHash(inventoryText(item.path)))) {
1601
- skip("Already installed: same skill content digest.");
1602
- continue;
1603
- }
1604
- if (item.kind === "prompt" && promptBodies.has(prose(inventoryText(item.path)).body)) {
1605
- skip("Already installed: same prompt content digest.");
1606
- continue;
1607
- }
1608
- const value = prepared(item, input.host);
1609
- const missing = unmetRequirements(value.requirements, cwd, scope, vendorOf(value.format));
1610
- if (missing.length) {
1611
- skip(
1612
- `Unsatisfied package requirements: ${missing.join(", ")}. Install dependencies through the library and review a new plan; no extra resources are imported.`
1613
- );
1614
- continue;
1615
- }
1616
- const hash = digest(value.files);
1617
- if (item.kind === "plugin" && installed.some((pkg) => pkg.id === value.id && pkg.version === value.version)) {
1618
- planned.add(item.path);
1619
- skip("Already installed: same package id and version.");
1620
- continue;
1621
- }
1622
- const resourceFiles = { ...value.files };
1623
- delete resourceFiles["plugin.json"];
1624
- if (Object.keys(resourceFiles).length > 0 && installedContent.has(digest(resourceFiles))) {
1625
- skip("Already installed: same content digest.");
1626
- continue;
1627
- }
1628
- if (installed.some((pkg) => pkg.id === value.id && pkg.scope === scope) || planned.has(value.id)) {
1629
- skip("Package identifier collision; existing content will not be replaced.");
1630
- continue;
1631
- }
1632
- planned.add(value.id);
1633
- if (item.kind === "plugin") planned.add(item.path);
1634
- plan.entries.push({
1635
- item,
1636
- action: "install",
1637
- id: value.id,
1638
- destination: path6.join(pluginBaseDir(scope, cwd), value.id),
1639
- files: value.files,
1640
- digest: hash,
1641
- reason: value.note,
1642
- omitted: value.omitted,
1643
- requirements: value.requirements,
1644
- ...value.format ? { format: value.format } : {},
1645
- ...value.outcomes?.length ? { outcomes: value.outcomes } : {},
1646
- ...value.unsupported?.length ? { unsupported: value.unsupported } : {}
1647
- });
1648
- } catch (error) {
1649
- skip(error instanceof Error ? error.message : String(error));
1650
- }
1651
- }
1652
- return plan;
1653
- }
1654
- function renderOutcomes(outcomes) {
1655
- return (outcomes ?? []).map((outcome) => {
1656
- const detail = [
1657
- ...outcome.omittedFields?.length ? [`omitted frontmatter: ${outcome.omittedFields.join(", ")}`] : [],
1658
- ...outcome.omittedFiles?.length ? [`omitted files: ${outcome.omittedFiles.join(", ")}`] : [],
1659
- ...outcome.reason ? [outcome.reason] : []
1660
- ];
1661
- return outcome.status === "converted" ? ` CONVERT ${outcome.kind} ${outcome.name} -> ${outcome.destination}${detail.length ? ` (${detail.join("; ")})` : ""}` : ` UNSUPPORTED ${outcome.kind} ${outcome.name} (${outcome.source}): ${detail.join("; ")}`;
1662
- });
1663
- }
1664
- function renderInteropAdoptionPlan(plan) {
1665
- return [
1666
- `Adopt resources from ${plan.host} into Clio (${plan.scope})?`,
1667
- ...plan.entries.flatMap((entry) => [
1668
- `${entry.action.toUpperCase()} ${entry.item.kind} ${entry.item.name} (${entry.item.scope})`,
1669
- ` Source: ${entry.item.path}`,
1670
- ...entry.destination ? [` Destination: ${entry.destination}`, ` SHA-256: ${entry.digest}`] : [],
1671
- ` ${entry.reason}`,
1672
- ...entry.format && entry.format !== "portable" ? [` Format: ${entry.format} (normalized to a portable Clio package)`] : [],
1673
- ...entry.requirements?.length ? [` Requires installed packages: ${entry.requirements.join(", ")}`] : [],
1674
- ...renderOutcomes(entry.outcomes),
1675
- ...(entry.unsupported ?? []).map((feature) => ` UNSUPPORTED ${feature}`),
1676
- ...(entry.omitted ?? []).map((file) => ` SKIP ${file}: executable, host-specific, or non-text data.`)
1677
- ]),
1678
- "Foreign resources remain untrusted until the project-import trust setting is enabled.",
1679
- "Host files are never changed. Approval applies only to the displayed content."
1680
- ].join("\n");
1681
- }
1682
- function interopOrigin(host, entry) {
1683
- const marketplace = entry.item.marketplace && entry.item.marketplace !== "unknown" ? entry.item.marketplace : void 0;
1684
- return {
1685
- kind: "interop",
1686
- host,
1687
- source: path6.resolve(entry.item.path),
1688
- ...entry.format ? { format: entry.format } : {},
1689
- ...marketplace ? { marketplace } : {}
1690
- };
1691
- }
1692
- function applyInteropAdoption(plan, approved) {
1693
- const result = { installed: [], diagnostics: [] };
1694
- if (!approved) {
1695
- result.diagnostics.push("Approval required; nothing installed.");
1696
- return result;
1697
- }
1698
- for (const entry of plan.entries) {
1699
- if (entry.action !== "install" || !entry.files || !entry.id) continue;
1700
- let staging;
1701
- try {
1702
- const current = prepared(entry.item, plan.host);
1703
- if (digest(entry.files) !== entry.digest || digest(current.files) !== entry.digest)
1704
- throw new Error("Source or plan changed after review; inspect a new plan.");
1705
- const missing = unmetRequirements(current.requirements, plan.cwd, plan.scope, vendorOf(current.format));
1706
- if (missing.length)
1707
- throw new Error(
1708
- `Unsatisfied package requirements after review: ${missing.join(", ")}. No extra resources are imported.`
1709
- );
1710
- staging = mkdtempSync2(path6.join(tmpdir2(), "clio-coder-interop-adopt-"));
1711
- for (const [file, text] of Object.entries(entry.files)) {
1712
- const target = path6.join(staging, file);
1713
- mkdirSync2(path6.dirname(target), { recursive: true });
1714
- writeFileSync(target, text, { mode: 420 });
1715
- }
1716
- const candidate = readPluginManifest(staging);
1717
- if (!candidate.valid || !candidate.contentDigest)
1718
- throw new Error(candidate.diagnostics.map((d) => d.message).join("; "));
1719
- const installed = installInteropPackage({
1720
- sourcePath: staging,
1721
- kind: entry.item.kind,
1722
- trust: "foreign",
1723
- cwd: plan.cwd,
1724
- scope: plan.scope,
1725
- expectedId: entry.id,
1726
- expectedDigest: candidate.contentDigest,
1727
- origin: interopOrigin(plan.host, entry)
1728
- });
1729
- if (installed.plugin) result.installed.push(installed.plugin.id);
1730
- result.diagnostics.push(...installed.diagnostics.map((d) => d.message));
1731
- } catch (error) {
1732
- result.diagnostics.push(`${entry.item.name}: ${error instanceof Error ? error.message : String(error)}`);
1733
- } finally {
1734
- if (staging) rmSync2(staging, { recursive: true, force: true });
1735
- }
1736
- }
1737
- return result;
1738
- }
1739
-
1740
- // src/domains/interop/import.ts
1741
- init_esm_shims();
1742
- import { mkdirSync as mkdirSync3, mkdtempSync as mkdtempSync3, rmSync as rmSync3, writeFileSync as writeFileSync2 } from "node:fs";
1743
- import { tmpdir as tmpdir3 } from "node:os";
1744
- import path7 from "node:path";
1745
- function prepare(root, format) {
1746
- const detection = detectForeignPlugin(root, format);
1747
- if (detection.format === "portable") return { detection, value: preparePortablePackage(root) };
1748
- if (detection.format === "none") throw new Error(detection.diagnostics.join(" "));
1749
- return { detection, value: prepareForeignPackage(root, detection.format) };
1750
- }
1751
- function planLibraryImport(input, options = {}) {
1752
- const cwd = path7.resolve(options.cwd ?? process.cwd());
1753
- const scope = options.scope ?? "user";
1754
- const remote = parsePluginGithubSource(input);
1755
- const local = pluginLocalPath(input, cwd);
1756
- const fetched = fetchPluginSource(input, cwd);
1757
- const source = remote ? { input, transport: "github", root: fetched.root, url: input } : { input, transport: "local", root: fetched.root, path: local };
1758
- const originSource = remote ? input : path7.resolve(local);
1759
- try {
1760
- const raw = reviewFingerprint(fetched.root);
1761
- let detection;
1762
- let value;
1763
- const reasons = [];
1764
- try {
1765
- ({ detection, value } = prepare(fetched.root, options.format));
1766
- } catch (error) {
1767
- detection = detectForeignPlugin(fetched.root, options.format);
1768
- reasons.push(error instanceof Error ? error.message : String(error));
1769
- }
1770
- reasons.push(...detection.diagnostics);
1771
- const format = value?.format ?? (detection.format === "none" ? void 0 : detection.format);
1772
- const origin = {
1773
- kind: "import",
1774
- source: originSource,
1775
- transport: remote ? "github" : "local",
1776
- format: format ?? "portable",
1777
- ...options.host ? { host: options.host } : {},
1778
- ...options.marketplace ? { marketplace: options.marketplace } : {}
1779
- };
1780
- const base = {
1781
- source,
1782
- detection,
1783
- ...format ? { format } : {},
1784
- scope,
1785
- cwd,
1786
- outcomes: value?.outcomes ?? [],
1787
- unsupported: value?.unsupported ?? [],
1788
- omitted: value?.omitted ?? [],
1789
- requirements: value?.requirements ?? [],
1790
- origin,
1791
- reviewFingerprint: raw,
1792
- cleanup: fetched.cleanup
1793
- };
1794
- if (!value) return { ...base, action: "blocked", reasons };
1795
- const missing = unmetRequirements(value.requirements, cwd, scope, vendorOf(value.format));
1796
- if (missing.length)
1797
- reasons.push(
1798
- `Unsatisfied package requirements: ${missing.join(", ")}. Install or import those packages first; no extra resources are imported.`
1799
- );
1800
- const installed = listInstalledPlugins(cwd, { all: true });
1801
- if (installed.some((pkg) => pkg.id === value.id && pkg.scope === scope))
1802
- reasons.push(`Package ${value.id} is already installed in ${scope} scope; remove it before importing again.`);
1803
- const blocked = missing.length > 0 || installed.some((pkg) => pkg.id === value.id && pkg.scope === scope);
1804
- return {
1805
- ...base,
1806
- action: blocked ? "blocked" : "install",
1807
- reasons: [value.note, ...reasons],
1808
- id: value.id,
1809
- version: value.version,
1810
- destination: path7.join(pluginBaseDir(scope, cwd), value.id),
1811
- digest: digest(value.files),
1812
- files: value.files
1813
- };
1814
- } catch (error) {
1815
- fetched.cleanup();
1816
- throw error;
1817
- }
1818
- }
1819
- function releaseLibraryImport(plan) {
1820
- plan.cleanup();
1821
- }
1822
- function applyLibraryImport(plan, approved, options = {}) {
1823
- const admission = {
1824
- trust: "foreign",
1825
- gate: "integrations.projectResources.trustProjectImports",
1826
- gateEnabled: options.trustProjectImports === void 0 ? "unknown" : options.trustProjectImports
1827
- };
1828
- const result = { published: false, admission, diagnostics: [] };
1829
- let staging;
1830
- try {
1831
- if (!approved) {
1832
- result.diagnostics.push("Approval required; nothing installed.");
1833
- return result;
1834
- }
1835
- if (plan.action !== "install" || !plan.files || !plan.id || !plan.digest) {
1836
- result.diagnostics.push(...plan.reasons.length ? plan.reasons : ["Plan is not installable."]);
1837
- return result;
1838
- }
1839
- if (reviewFingerprint(plan.source.root) !== plan.reviewFingerprint)
1840
- throw new Error("Source changed after review; inspect a new plan.");
1841
- const current = prepare(plan.source.root, plan.format === "portable" ? void 0 : plan.format).value;
1842
- if (digest(plan.files) !== plan.digest || digest(current.files) !== plan.digest)
1843
- throw new Error("Plan changed after review; inspect a new plan.");
1844
- const missing = unmetRequirements(current.requirements, plan.cwd, plan.scope, vendorOf(current.format));
1845
- if (missing.length)
1846
- throw new Error(
1847
- `Unsatisfied package requirements after review: ${missing.join(", ")}. No extra resources are imported.`
1848
- );
1849
- staging = mkdtempSync3(path7.join(tmpdir3(), "clio-coder-library-import-"));
1850
- for (const [file, text] of Object.entries(plan.files)) {
1851
- const target = path7.join(staging, file);
1852
- mkdirSync3(path7.dirname(target), { recursive: true });
1853
- writeFileSync2(target, text, { mode: 420 });
1854
- }
1855
- const candidate = readPluginManifest(staging);
1856
- if (!candidate.valid || !candidate.contentDigest)
1857
- throw new Error(candidate.diagnostics.map((d) => d.message).join("; "));
1858
- const installed = installInteropPackage({
1859
- sourcePath: staging,
1860
- kind: candidate.manifest?.clio.kind ?? "plugin",
1861
- trust: "foreign",
1862
- cwd: plan.cwd,
1863
- scope: plan.scope,
1864
- expectedId: plan.id,
1865
- expectedDigest: candidate.contentDigest,
1866
- origin: plan.origin
1867
- });
1868
- result.diagnostics.push(...installed.diagnostics.map((d) => d.message));
1869
- if (installed.plugin) {
1870
- result.published = true;
1871
- result.installed = installed.plugin.id;
1872
- result.destination = installed.plugin.rootPath;
1873
- result.validation = validateLibraryPackage(installed.plugin.rootPath, { cwd: plan.cwd });
1874
- }
1875
- return result;
1876
- } catch (error) {
1877
- result.diagnostics.push(error instanceof Error ? error.message : String(error));
1878
- return result;
1879
- } finally {
1880
- if (staging) rmSync3(staging, { recursive: true, force: true });
1881
- releaseLibraryImport(plan);
1882
- }
1883
- }
1884
- function libraryImportPlanSummary(plan) {
1885
- const { files: _files, cleanup: _cleanup, ...summary } = plan;
1886
- return summary;
1887
- }
1888
- function renderLibraryImportPlan(plan) {
1889
- const lines = [
1890
- `Import ${plan.source.transport === "github" ? plan.source.url : plan.source.path} into Clio (${plan.scope})?`,
1891
- ` Format: ${plan.format ?? "unknown"}${plan.detection.manifestPath ? ` (${plan.detection.manifestPath})` : ""}`,
1892
- ...plan.action === "install" ? [` Package: ${plan.id} ${plan.version}`, ` Destination: ${plan.destination}`, ` SHA-256: ${plan.digest}`] : [" BLOCKED"],
1893
- ...plan.reasons.map((reason) => ` ${reason}`),
1894
- ...plan.requirements.length ? [` Requires installed packages: ${plan.requirements.join(", ")}`] : [],
1895
- ...plan.outcomes.map((outcome) => {
1896
- const detail = [
1897
- ...outcome.omittedFields?.length ? [`omitted frontmatter: ${outcome.omittedFields.join(", ")}`] : [],
1898
- ...outcome.omittedFiles?.length ? [`omitted files: ${outcome.omittedFiles.join(", ")}`] : [],
1899
- ...outcome.reason ? [outcome.reason] : []
1900
- ];
1901
- return outcome.status === "converted" ? ` CONVERT ${outcome.kind} ${outcome.name} -> ${outcome.destination}${detail.length ? ` (${detail.join("; ")})` : ""}` : ` UNSUPPORTED ${outcome.kind} ${outcome.name} (${outcome.source}): ${detail.join("; ")}`;
1902
- }),
1903
- ...plan.unsupported.map((feature) => ` UNSUPPORTED ${feature}`),
1904
- ...plan.omitted.map((file) => ` SKIP ${file}: executable, host-specific, or non-text data.`),
1905
- "Imported resources keep foreign trust and stay behind the project-import trust setting.",
1906
- "Source files are never changed. Approval applies only to the displayed content."
1907
- ];
1908
- return lines.join("\n");
1909
- }
1910
-
1911
- // src/domains/interop/index.ts
1912
- init_esm_shims();
1913
-
1914
- // src/domains/interop/extension.ts
1915
- init_esm_shims();
1916
-
1917
- // src/domains/interop/consent.ts
1918
- init_esm_shims();
1919
- var import_yaml3 = __toESM(require_dist(), 1);
1920
- var INHERITED_PROJECT_CONTEXT = "none";
1921
- function delegationEntryForKind(kind, defaults) {
1922
- const recipe = kind.acp;
1923
- if (recipe === void 0) throw new Error(`interop kind ${kind.id} has no ACP recipe`);
1924
- return {
1925
- id: kind.id,
1926
- command: recipe.command,
1927
- args: [...recipe.args],
1928
- connectTimeoutMs: defaults.connectTimeoutMs,
1929
- turnTimeoutMs: defaults.turnTimeoutMs,
1930
- permissionTimeoutMs: defaults.permissionTimeoutMs,
1931
- toolGovernance: "clio-coder-policy"
1932
- };
1933
- }
1934
- function interopProposals(report, settings) {
1935
- const configured = new Set(settings.integrations.externalAgents.entries.map((agent) => agent.id));
1936
- const proposals = [];
1937
- for (const record2 of report.agents) {
1938
- const kind = interopAgentKind(record2.kind);
1939
- if (kind?.acp === void 0) continue;
1940
- if (record2.presence !== "present") continue;
1941
- if (configured.has(kind.id)) continue;
1942
- if (record2.decision !== void 0 && record2.decidedFingerprint === record2.fingerprint) continue;
1943
- proposals.push({
1944
- kind: kind.id,
1945
- label: kind.label,
1946
- fingerprint: record2.fingerprint,
1947
- entry: delegationEntryForKind(kind, settings.integrations.externalAgents.defaults),
1948
- needsNetworkInstall: record2.adapter !== "present"
1949
- });
1950
- }
1951
- return proposals;
1952
- }
1953
- function renderProposalEntry(proposal) {
1954
- return (0, import_yaml3.stringify)([proposal.entry]).trimEnd();
1955
- }
1956
- function withStoredDecision(stored, fresh) {
1957
- if (stored === void 0) return fresh;
1958
- return {
1959
- ...fresh,
1960
- ...stored.decision !== void 0 ? { decision: stored.decision } : {},
1961
- ...stored.decidedAt !== void 0 ? { decidedAt: stored.decidedAt } : {},
1962
- ...stored.decidedFingerprint !== void 0 ? { decidedFingerprint: stored.decidedFingerprint } : {},
1963
- ...stored.hintedFingerprint !== void 0 ? { hintedFingerprint: stored.hintedFingerprint } : {}
1964
- };
1965
- }
1966
- function updateRecords(ids, report, patch) {
1967
- const wanted = new Set(ids);
1968
- const touched = [];
1969
- withStateFileLockSync(interopStatePath(), () => {
1970
- const stored = readInteropReport();
1971
- const storedByKind = new Map(
1972
- (stored?.agents ?? []).map((record2) => [record2.kind, record2])
1973
- );
1974
- const byKind = new Map(storedByKind);
1975
- for (const record2 of report.agents) {
1976
- byKind.set(record2.kind, withStoredDecision(storedByKind.get(record2.kind), record2));
1977
- }
1978
- for (const id of wanted) {
1979
- const record2 = byKind.get(id);
1980
- if (record2 === void 0) continue;
1981
- byKind.set(id, patch(record2));
1982
- touched.push(id);
1983
- }
1984
- writeInteropReport({ version: 1, detectedAt: report.detectedAt, agents: [...byKind.values()] });
1985
- });
1986
- return touched;
1987
- }
1988
- function recordDecisions(ids, report, decision) {
1989
- const decidedAt = (/* @__PURE__ */ new Date()).toISOString();
1990
- return updateRecords(ids, report, (record2) => ({
1991
- ...record2,
1992
- decision,
1993
- decidedAt,
1994
- decidedFingerprint: record2.fingerprint
1995
- }));
1996
- }
1997
- function interopBootHint(report, settings) {
1998
- const fresh = interopProposals(report, settings).filter(
1999
- (proposal) => report.agents.find((agent) => agent.kind === proposal.kind)?.hintedFingerprint !== proposal.fingerprint
2000
- );
2001
- if (fresh.length === 0) return null;
2002
- updateRecords(
2003
- fresh.map((proposal) => proposal.kind),
2004
- report,
2005
- (record2) => ({ ...record2, hintedFingerprint: record2.fingerprint })
2006
- );
2007
- const names = fresh.map((proposal) => proposal.entry.id).join(", ");
2008
- return `clio-coder: ${names} detected on PATH and not configured. Run /interop to review.`;
2009
- }
2010
- function acceptInteropAgents(ids, report) {
2011
- const proposals = interopProposals(report, readSettings()).filter((proposal) => ids.includes(proposal.kind));
2012
- const diagnostics = [];
2013
- for (const id of ids) {
2014
- if (!proposals.some((proposal) => proposal.kind === id)) diagnostics.push(`${id} is not a pending proposal`);
2015
- }
2016
- if (proposals.length === 0) return { decided: [], wired: [], diagnostics };
2017
- const wired = [];
2018
- updateSettings((settings) => {
2019
- for (const proposal of proposals) {
2020
- if (settings.integrations.externalAgents.entries.some((agent) => agent.id === proposal.entry.id)) continue;
2021
- settings.integrations.externalAgents.entries.push({ ...proposal.entry, args: [...proposal.entry.args] });
2022
- wired.push(proposal.entry.id);
2023
- }
2024
- });
2025
- const decided = recordDecisions(
2026
- proposals.map((proposal) => proposal.kind),
2027
- report,
2028
- "accepted"
2029
- );
2030
- return { decided, wired, diagnostics };
2031
- }
2032
- function declineInteropAgents(ids, report) {
2033
- return { decided: recordDecisions(ids, report, "declined"), wired: [], diagnostics: [] };
2034
- }
2035
-
2036
- // src/domains/interop/extension.ts
2037
- var EMPTY_REPORT = { version: 1, detectedAt: (/* @__PURE__ */ new Date(0)).toISOString(), agents: [] };
2038
- function createInteropBundle(_context) {
2039
- let detected2 = null;
2040
- const extension = {
2041
- start() {
2042
- return void 0;
2043
- }
2044
- };
2045
- const contract = {
2046
- kinds() {
2047
- return INTEROP_AGENT_KINDS;
2048
- },
2049
- async detect(input = {}) {
2050
- detected2 = await detectInteropAgents(input, detected2?.agents);
2051
- return detected2;
2052
- },
2053
- // A decision is written and read back, so the report an overlay rebuilds
2054
- // from carries it: a declined row leaves the proposal list on the
2055
- // keystroke rather than on the next detection.
2056
- lastReport() {
2057
- return detected2 ?? readInteropReport();
2058
- },
2059
- proposals(report) {
2060
- return interopProposals(report, readSettings());
2061
- },
2062
- // Read here, not from the hot settings snapshot the TUI holds: that one is
2063
- // refreshed by the config watcher a tick after the write, and the overlay
2064
- // rebuilds its rows the moment accept returns. An accepted peer was gone
2065
- // from the proposals, which read the file, and not yet in the configured
2066
- // list, which read the snapshot, so it was in neither until a reopen.
2067
- configured() {
2068
- return readSettings().integrations.externalAgents.entries;
2069
- },
2070
- accept(ids) {
2071
- const result = acceptInteropAgents(ids, detected2 ?? readInteropReport() ?? EMPTY_REPORT);
2072
- detected2 = readInteropReport() ?? detected2;
2073
- return result;
2074
- },
2075
- decline(ids) {
2076
- const result = declineInteropAgents(ids, detected2 ?? readInteropReport() ?? EMPTY_REPORT);
2077
- detected2 = readInteropReport() ?? detected2;
2078
- return result;
2079
- },
2080
- bootHint(report) {
2081
- return interopBootHint(report, readSettings());
2082
- }
2083
- };
2084
- return { extension, contract };
2085
- }
2086
-
2087
- // src/domains/interop/manifest.ts
2088
- init_esm_shims();
2089
- var InteropManifest = {
2090
- name: "interop",
2091
- dependsOn: ["config"]
2092
- };
2093
-
2094
- // src/domains/interop/index.ts
2095
- var InteropDomainModule = {
2096
- manifest: InteropManifest,
2097
- createExtension: createInteropBundle
2098
- };
2099
-
2100
- export {
2101
- INHERITED_PROJECT_CONTEXT,
2102
- delegationEntryForKind,
2103
- interopProposals,
2104
- renderProposalEntry,
2105
- acceptInteropAgents,
2106
- declineInteropAgents,
2107
- discoverInteropInventory,
2108
- resolveOnPath,
2109
- detectInteropAgents,
2110
- planInteropAdoption,
2111
- renderInteropAdoptionPlan,
2112
- applyInteropAdoption,
2113
- planLibraryImport,
2114
- releaseLibraryImport,
2115
- applyLibraryImport,
2116
- libraryImportPlanSummary,
2117
- renderLibraryImportPlan,
2118
- InteropDomainModule
2119
- };
2120
- //# sourceMappingURL=chunk-AM6CEP2K.js.map