@iowarp/clio-coder 0.4.9 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1172) hide show
  1. package/.claude-plugin/marketplace.json +11 -3
  2. package/CHANGELOG.md +153 -0
  3. package/CODE_OF_CONDUCT.md +10 -0
  4. package/CONTRIBUTING.md +208 -382
  5. package/NOTICE +8 -2
  6. package/README.md +199 -418
  7. package/ROADMAP.md +82 -0
  8. package/SECURITY.md +14 -11
  9. package/dist/acp-KS7ARGV6.js +132 -0
  10. package/dist/agents-YOGJ2YEJ.js +163 -0
  11. package/dist/assets/codewiki.json +1 -1
  12. package/dist/auth-CEDCO6O6.js +557 -0
  13. package/dist/background-YWTBPSQU.js +39 -0
  14. package/dist/builtins-GDYO4RTR.js +23 -0
  15. package/dist/chunk-27YTM2CV.js +175 -0
  16. package/dist/chunk-2AF6YC7Q.js +75 -0
  17. package/dist/chunk-2DTIWSAW.js +381 -0
  18. package/dist/chunk-2EMLKSCX.js +262 -0
  19. package/dist/chunk-2OJ3YZQP.js +665 -0
  20. package/dist/chunk-2VLYHHFT.js +35 -0
  21. package/dist/chunk-2WVPJF3Z.js +204 -0
  22. package/dist/chunk-33OASOS6.js +176 -0
  23. package/dist/chunk-3BD2LXYJ.js +19 -0
  24. package/dist/chunk-3JHUFKG7.js +30 -0
  25. package/dist/chunk-3JLTRPN7.js +711 -0
  26. package/dist/chunk-3LT34CAM.js +2796 -0
  27. package/dist/chunk-3O5JWP4L.js +1670 -0
  28. package/dist/chunk-3UW3KU4A.js +21 -0
  29. package/dist/chunk-4A6YRGV4.js +569 -0
  30. package/dist/chunk-4D2BRCZ3.js +67 -0
  31. package/dist/chunk-4SYHGVDE.js +668 -0
  32. package/dist/chunk-4VDHLCF5.js +66 -0
  33. package/dist/chunk-4WOOTKFD.js +637 -0
  34. package/dist/chunk-4WV4PI66.js +80 -0
  35. package/dist/chunk-53OXPRI6.js +195 -0
  36. package/dist/chunk-55RMDDFM.js +1347 -0
  37. package/dist/chunk-56XP4FJU.js +2025 -0
  38. package/dist/chunk-5B3RTYAK.js +123 -0
  39. package/dist/chunk-5CD243WE.js +45 -0
  40. package/dist/chunk-5JQR5B4D.js +709 -0
  41. package/dist/chunk-5KQEUIWM.js +597 -0
  42. package/dist/chunk-5LP5FNNR.js +915 -0
  43. package/dist/chunk-62UK7AGW.js +9344 -0
  44. package/dist/chunk-6CTHLZFB.js +563 -0
  45. package/dist/chunk-6EJYVCTN.js +23 -0
  46. package/dist/chunk-6OWUM2NC.js +12289 -0
  47. package/dist/chunk-6RJMYYIE.js +1023 -0
  48. package/dist/chunk-6W75D37F.js +643 -0
  49. package/dist/chunk-733ZBT5P.js +1721 -0
  50. package/dist/chunk-77DCC6JZ.js +3710 -0
  51. package/dist/chunk-7QXCO3AF.js +156 -0
  52. package/dist/chunk-7RET77VB.js +481 -0
  53. package/dist/chunk-A4MVRV4C.js +65 -0
  54. package/dist/chunk-ALJWT6O6.js +93 -0
  55. package/dist/chunk-AVSR2HKI.js +232 -0
  56. package/dist/chunk-B7GY6QER.js +42 -0
  57. package/dist/chunk-BFOSV5EZ.js +178 -0
  58. package/dist/chunk-BGOIM7NB.js +103 -0
  59. package/dist/chunk-BJH6WFIB.js +372 -0
  60. package/dist/chunk-BOBCCDJ6.js +1533 -0
  61. package/dist/chunk-BRCOSE7O.js +117 -0
  62. package/dist/chunk-BYFHHCFV.js +601 -0
  63. package/dist/chunk-C2CPOIH2.js +83 -0
  64. package/dist/chunk-C7AQTPCE.js +694 -0
  65. package/dist/chunk-CBAQPTDU.js +165 -0
  66. package/dist/chunk-CDQ2UC6W.js +125 -0
  67. package/dist/chunk-CN6SW5DC.js +177 -0
  68. package/dist/chunk-CRHPCPZP.js +132 -0
  69. package/dist/chunk-CTFPFW3H.js +44 -0
  70. package/dist/chunk-D3KWFOUT.js +103 -0
  71. package/dist/chunk-D65E25JG.js +185 -0
  72. package/dist/chunk-DCGHJQ2U.js +236 -0
  73. package/dist/chunk-DE2LU267.js +106 -0
  74. package/dist/chunk-DF6PI6GN.js +97 -0
  75. package/dist/chunk-DGC6X6XR.js +53 -0
  76. package/dist/chunk-DOUISWEE.js +526 -0
  77. package/dist/chunk-DR3TAEUA.js +188 -0
  78. package/dist/chunk-DVTBERFY.js +33 -0
  79. package/dist/chunk-DXSETN72.js +1051 -0
  80. package/dist/chunk-DZLR4UEH.js +128 -0
  81. package/dist/chunk-E6IPKW2E.js +77 -0
  82. package/dist/chunk-EG4ARXPC.js +139 -0
  83. package/dist/chunk-EKV4UBCM.js +652 -0
  84. package/dist/chunk-EOJPDNUP.js +1325 -0
  85. package/dist/chunk-EX57VVWW.js +4157 -0
  86. package/dist/chunk-EYTLV3W3.js +5937 -0
  87. package/dist/chunk-EZD2BXGP.js +475 -0
  88. package/dist/chunk-EZDCA34W.js +314 -0
  89. package/dist/chunk-FD2I4KBR.js +33 -0
  90. package/dist/chunk-FD3IAHQM.js +27 -0
  91. package/dist/chunk-FFYTC2KQ.js +416 -0
  92. package/dist/chunk-FGSQHUCK.js +110 -0
  93. package/dist/chunk-GCQFN7YI.js +32 -0
  94. package/dist/chunk-GGPF6LLE.js +38 -0
  95. package/dist/chunk-GGWI3OVM.js +215 -0
  96. package/dist/chunk-GLIQT7SU.js +172 -0
  97. package/dist/chunk-GN7QBEEI.js +95 -0
  98. package/dist/chunk-GRHOXDKB.js +1104 -0
  99. package/dist/chunk-HMN2C6YL.js +54 -0
  100. package/dist/chunk-HOEDA42N.js +310 -0
  101. package/dist/chunk-HOYZUKG7.js +192 -0
  102. package/dist/chunk-HQVN7G4F.js +1021 -0
  103. package/dist/chunk-HSQQFDB3.js +519 -0
  104. package/dist/chunk-I4ELN5BX.js +47 -0
  105. package/dist/chunk-I4Y4WKZR.js +386 -0
  106. package/dist/chunk-IFPDAD7R.js +797 -0
  107. package/dist/chunk-IN7DGBVS.js +582 -0
  108. package/dist/chunk-ISHUS7HC.js +396 -0
  109. package/dist/chunk-JPXLJSGR.js +191 -0
  110. package/dist/chunk-JQCLXSFI.js +69 -0
  111. package/dist/chunk-KBUTSJSR.js +61 -0
  112. package/dist/chunk-KW5HXKLJ.js +56 -0
  113. package/dist/chunk-L4APUGCT.js +139 -0
  114. package/dist/chunk-L7G7K4I2.js +505 -0
  115. package/dist/chunk-LAR7DX5E.js +1840 -0
  116. package/dist/chunk-LAVUQX3B.js +462 -0
  117. package/dist/chunk-LJRBX7QR.js +116 -0
  118. package/dist/chunk-LNOXCGN2.js +1864 -0
  119. package/dist/chunk-LTWH2ACR.js +23002 -0
  120. package/dist/chunk-LYJJ6546.js +661 -0
  121. package/dist/chunk-M2IPMWCN.js +457 -0
  122. package/dist/chunk-MGLRTOCK.js +101 -0
  123. package/dist/chunk-MZF5IKZT.js +160 -0
  124. package/dist/chunk-N24R6KWS.js +386 -0
  125. package/dist/chunk-NASYVWDB.js +604 -0
  126. package/dist/chunk-NBXFPI7U.js +195 -0
  127. package/dist/chunk-NDPF2N2L.js +400 -0
  128. package/dist/chunk-NFSK2VNU.js +446 -0
  129. package/dist/chunk-NG3QQSXY.js +43 -0
  130. package/dist/chunk-NOCSM22Y.js +63 -0
  131. package/dist/chunk-NVPXXW2H.js +1143 -0
  132. package/dist/chunk-O63U2I6I.js +30 -0
  133. package/dist/chunk-OJXOA6YU.js +98 -0
  134. package/dist/chunk-OPD7GL6F.js +1196 -0
  135. package/dist/chunk-OQ2EOAHA.js +14399 -0
  136. package/dist/chunk-OV62D6KO.js +688 -0
  137. package/dist/chunk-OZ76TLGU.js +740 -0
  138. package/dist/chunk-P4GNZPXO.js +1156 -0
  139. package/dist/chunk-PS6JAWJZ.js +78 -0
  140. package/dist/chunk-PXRCXGLK.js +1865 -0
  141. package/dist/chunk-QDUUOZ3S.js +108 -0
  142. package/dist/chunk-QG6I2T5E.js +1416 -0
  143. package/dist/chunk-QHSBROEW.js +308 -0
  144. package/dist/chunk-QNUQ7K7D.js +46 -0
  145. package/dist/chunk-QZTTRSJE.js +333 -0
  146. package/dist/chunk-R2UUNSNQ.js +1605 -0
  147. package/dist/chunk-R7FGRZNF.js +1794 -0
  148. package/dist/chunk-RNDCROSG.js +199 -0
  149. package/dist/chunk-S36CXHO2.js +302 -0
  150. package/dist/chunk-SJGS3GDI.js +575 -0
  151. package/dist/chunk-SQZHXUB3.js +510 -0
  152. package/dist/chunk-SUTLW6ND.js +686 -0
  153. package/dist/chunk-SYF7FVBL.js +179 -0
  154. package/dist/chunk-T2MDZES3.js +1577 -0
  155. package/dist/chunk-T33IYTZM.js +1146 -0
  156. package/dist/chunk-TDGYTWM6.js +49 -0
  157. package/dist/chunk-TGL5FZVD.js +132 -0
  158. package/dist/chunk-TGWZXJ7L.js +1205 -0
  159. package/dist/chunk-TKDRT2DF.js +114 -0
  160. package/dist/chunk-TV2EBCSQ.js +152 -0
  161. package/dist/chunk-U26XXPJS.js +367 -0
  162. package/dist/chunk-U5QU5ZOD.js +419 -0
  163. package/dist/chunk-U6YTUVOX.js +1011 -0
  164. package/dist/chunk-UCINIRHW.js +188 -0
  165. package/dist/chunk-UJD5MPP6.js +52 -0
  166. package/dist/chunk-URCXX7WJ.js +146 -0
  167. package/dist/chunk-UX2L5CUD.js +898 -0
  168. package/dist/chunk-UZVYEF57.js +114 -0
  169. package/dist/chunk-V35KZDUZ.js +218 -0
  170. package/dist/chunk-VESL6DQY.js +1058 -0
  171. package/dist/chunk-VKHLUZNO.js +986 -0
  172. package/dist/chunk-VOYUCAQF.js +584 -0
  173. package/dist/chunk-VYRQHORQ.js +414 -0
  174. package/dist/chunk-W53XSRQE.js +245 -0
  175. package/dist/chunk-X4CEFOSG.js +226 -0
  176. package/dist/chunk-XDHUDE5K.js +380 -0
  177. package/dist/chunk-XISLDHEL.js +1290 -0
  178. package/dist/chunk-XM34YQ2Y.js +169 -0
  179. package/dist/chunk-XMDBTYCH.js +661 -0
  180. package/dist/chunk-XS2QPZJE.js +449 -0
  181. package/dist/chunk-YBUECLAF.js +618 -0
  182. package/dist/chunk-YQ6XEFVK.js +332 -0
  183. package/dist/chunk-YYLCPDCC.js +990 -0
  184. package/dist/chunk-Z4GLJ6J4.js +1035 -0
  185. package/dist/chunk-ZARZ4POR.js +210 -0
  186. package/dist/chunk-ZJPORZTC.js +119 -0
  187. package/dist/chunk-ZNUZ3EXD.js +243 -0
  188. package/dist/chunk-ZPST2KQO.js +49 -0
  189. package/dist/chunk-ZR5YA6ZF.js +512 -0
  190. package/dist/chunk-ZU4JPCPR.js +319 -0
  191. package/dist/chunk-ZUKUCZYZ.js +39 -0
  192. package/dist/cli/index.js +56 -45
  193. package/dist/clio-K2PBVCEM.js +27 -0
  194. package/dist/clio-context-tools-GR4OHFSO.js +145 -0
  195. package/dist/code-nav-4X3OI6DK.js +715 -0
  196. package/dist/codewiki/build-worker.js +4 -4
  197. package/dist/compile-cache-YRB6QRO7.js +18 -0
  198. package/dist/components-RQOJ6NUR.js +675 -0
  199. package/dist/config-Q5J7UBAB.js +291 -0
  200. package/dist/config-XE7XYZLU.js +38 -0
  201. package/dist/config-graph-P3555574.js +175 -0
  202. package/dist/configure-KIJ32ZO6.js +104 -0
  203. package/dist/context-LFBQOSXT.js +344 -0
  204. package/dist/context-NNLBES2Y.js +82 -0
  205. package/dist/context-WBH3KSVR.js +302 -0
  206. package/dist/context-clear-YOHMQ6SQ.js +208 -0
  207. package/dist/context-index-X2N5UAIF.js +120 -0
  208. package/dist/context-map-HOSMGUG2.js +555 -0
  209. package/dist/context-working-set-MRAEVDNV.js +1564 -0
  210. package/dist/data-tool-JJPBGMQJ.js +2986 -0
  211. package/dist/detail-RHJOTGN4.js +139 -0
  212. package/dist/dispatch-runner-NC7PYNIO.js +2477 -0
  213. package/dist/docs-K4GBWRUX.js +342 -0
  214. package/dist/doctor-S5KZ2GTN.js +1138 -0
  215. package/dist/doctor-deep-2EJQSHIZ.js +130 -0
  216. package/dist/domain-loader-MB34FDPD.js +13 -0
  217. package/dist/eval-3D6M36N7.js +5220 -0
  218. package/dist/eval-inventory-SM3HNM47.js +260 -0
  219. package/dist/evals-FO6JEUCN.js +104 -0
  220. package/dist/evidence-6IYN52ET.js +262 -0
  221. package/dist/evidence-JVECPI3F.js +250 -0
  222. package/dist/evidence-XNVPPLVK.js +410 -0
  223. package/dist/evolve-TLPUDJDM.js +634 -0
  224. package/dist/extensions-ROZJ5X3J.js +311 -0
  225. package/dist/fleet-6RJWIOEO.js +284 -0
  226. package/dist/fleet-WKVBF5SZ.js +942 -0
  227. package/dist/fleet-commands-L6WFT7KZ.js +76 -0
  228. package/dist/fleet-decisions-BTQMWU5A.js +55 -0
  229. package/dist/fleet-graph-553DZ67Q.js +141 -0
  230. package/dist/fleet-inspect-236FZPRB.js +329 -0
  231. package/dist/fleet-new-CKUXP3CO.js +48 -0
  232. package/dist/fleet-preflight-NZQHABWO.js +95 -0
  233. package/dist/fleet-validate-7NLAE26R.js +96 -0
  234. package/dist/fleet-verify-E3RO6A5W.js +226 -0
  235. package/dist/fleet-view-KMZQY7YJ.js +144 -0
  236. package/dist/gui/client/assets/abnfDiagram-VCTEODGH-DPBWQwNn.js +1 -0
  237. package/dist/gui/client/assets/architecture-7GRP2DOG-D1w8FrFW.js +1 -0
  238. package/dist/gui/client/assets/architectureDiagram-5GKGNRK7-CVPgKd1-.js +36 -0
  239. package/dist/gui/client/assets/blockDiagram-I7D4REHJ-BLmnqkK5.js +129 -0
  240. package/dist/gui/client/assets/c4Diagram-7LVT6UL2-4AU9cfM7.js +38 -0
  241. package/dist/gui/client/assets/channel-DwFZ0m8S.js +1 -0
  242. package/dist/gui/client/assets/chunk-4HAMMTFA-EOWkKCav.js +62 -0
  243. package/dist/gui/client/assets/chunk-75Z2AOVW-CygeoIMl.js +2 -0
  244. package/dist/gui/client/assets/chunk-DU6HZSFF-s27fViLb.js +125 -0
  245. package/dist/gui/client/assets/chunk-F27PBJKO-BrHvwLsZ.js +1 -0
  246. package/dist/gui/client/assets/chunk-GMAD6QVW-DzPh-7jt.js +72 -0
  247. package/dist/gui/client/assets/chunk-GVQU2GXP-pIaQkIzm.js +1 -0
  248. package/dist/gui/client/assets/chunk-IMKFNOWR-BGJVE_Br.js +231 -0
  249. package/dist/gui/client/assets/chunk-L3NEJ4N5-B3YLuhww.js +1 -0
  250. package/dist/gui/client/assets/chunk-OSK3NFVY-BRj61HHU.js +10 -0
  251. package/dist/gui/client/assets/chunk-P2QGCYS3-Sno90KxP.js +1 -0
  252. package/dist/gui/client/assets/chunk-POPQ4Y6H-Cw8NTbxr.js +1 -0
  253. package/dist/gui/client/assets/chunk-PWAF6VOD-BIhHgz37.js +1 -0
  254. package/dist/gui/client/assets/chunk-SHT3W25Y-Cqv7npBj.js +168 -0
  255. package/dist/gui/client/assets/chunk-SVP7TREG-Hxzl6Dee.js +88 -0
  256. package/dist/gui/client/assets/chunk-TICWLB2K-CIFVyVP2.js +206 -0
  257. package/dist/gui/client/assets/classDiagram-ZZMXUADV-BJbAiI_w.js +1 -0
  258. package/dist/gui/client/assets/classDiagram-v2-VYDZK3BY-BJbAiI_w.js +1 -0
  259. package/dist/gui/client/assets/cynefin-OW5HDTMX-DecLWZ-y.js +1 -0
  260. package/dist/gui/client/assets/cynefinDiagram-5FMLGOSQ-CK-T2N-D.js +62 -0
  261. package/dist/gui/client/assets/dagre-GXQ25YYZ-C0dfg-OS.js +4 -0
  262. package/dist/gui/client/assets/diagram-S7CK7UJ4-EaJukVh-.js +30 -0
  263. package/dist/gui/client/assets/diagram-UQ7AKVKN-xcOucEtP.js +41 -0
  264. package/dist/gui/client/assets/diagram-VSXAHHWV-3AUJACMf.js +3 -0
  265. package/dist/gui/client/assets/diagram-VX7I27RA-TPknLqam.js +24 -0
  266. package/dist/gui/client/assets/diagram-Z3DM3KII-wa1q3YMF.js +24 -0
  267. package/dist/gui/client/assets/ebnfDiagram-PWID7BFC-JBCF2-s7.js +1 -0
  268. package/dist/gui/client/assets/erDiagram-RLTQ6QDP-CmXjXPc4.js +99 -0
  269. package/dist/gui/client/assets/eventmodeling-NTZA5JFV-D_1aJWYl.js +1 -0
  270. package/dist/gui/client/assets/flowDiagram-HODETNUW-BQtZlael.js +1 -0
  271. package/dist/gui/client/assets/framework-Bq-znqwW.js +9 -0
  272. package/dist/gui/client/assets/ganttDiagram-EL5Y4UJY-IPaL_kaa.js +292 -0
  273. package/dist/gui/client/assets/gitGraph-4MIJSDKK-Oy0Q3hoc.js +1 -0
  274. package/dist/gui/client/assets/gitGraphDiagram-WWUBYQGX-jtAuBmbc.js +106 -0
  275. package/dist/gui/client/assets/index-CuFuBEdL.css +1 -0
  276. package/dist/gui/client/assets/index-hMbEIsX0.js +87 -0
  277. package/dist/gui/client/assets/info-A6RAGUB7-UtEs1tv7.js +1 -0
  278. package/dist/gui/client/assets/infoDiagram-27XIBGKW-hlwR1pBW.js +2 -0
  279. package/dist/gui/client/assets/ishikawaDiagram-5VMMS53U-C6vMtfsd.js +70 -0
  280. package/dist/gui/client/assets/journeyDiagram-3NMN7TZE-EAwAl_PS.js +139 -0
  281. package/dist/gui/client/assets/kanban-definition-UXKFOSKX-CQOhRKHW.js +89 -0
  282. package/dist/gui/client/assets/line-DbcwGZTW.js +1 -0
  283. package/dist/gui/client/assets/mermaid-parser.core-C2QfVcHd.js +7 -0
  284. package/dist/gui/client/assets/mermaid.core-N9qUTre1.js +44 -0
  285. package/dist/gui/client/assets/mindmap-definition-YA3MSWOX-BR_FL9gK.js +96 -0
  286. package/dist/gui/client/assets/packet-AYTQ26CC-CbBJ2oAa.js +1 -0
  287. package/dist/gui/client/assets/pegDiagram-XKGWAZYB-BruU0IHM.js +1 -0
  288. package/dist/gui/client/assets/pie-WAS4IAKB-BWdSng4H.js +1 -0
  289. package/dist/gui/client/assets/pieDiagram-E7YTZNPT-CR3ljgdU.js +39 -0
  290. package/dist/gui/client/assets/quadrantDiagram-AXDQQJYC-C-boKslr.js +7 -0
  291. package/dist/gui/client/assets/radar-RG4KPBEZ-CGlOnAKG.js +1 -0
  292. package/dist/gui/client/assets/railroad-74A4TZTK-CDvuAlyC.js +1 -0
  293. package/dist/gui/client/assets/railroad-abnf-HS5TGJTU-CQUA9crC.js +1 -0
  294. package/dist/gui/client/assets/railroad-ebnf-LZEXJU2U-CD857gxq.js +1 -0
  295. package/dist/gui/client/assets/railroad-peg-WCYAUIDC-DUV4k35E.js +1 -0
  296. package/dist/gui/client/assets/railroadDiagram-O6MQD6OU-DMR4LXmA.js +1 -0
  297. package/dist/gui/client/assets/requirementDiagram-BXWQKSXE-DVltaF6c.js +84 -0
  298. package/dist/gui/client/assets/sankeyDiagram-P5KCCOFB-CHdNz472.js +40 -0
  299. package/dist/gui/client/assets/sequenceDiagram-WJ2MYXX4-DaMafIty.js +162 -0
  300. package/dist/gui/client/assets/stateDiagram-D77RDMKH-CEbBHqn3.js +1 -0
  301. package/dist/gui/client/assets/stateDiagram-v2-MP3YSRHH-B3JgDdFg.js +1 -0
  302. package/dist/gui/client/assets/swimlanes-42K2YHIH-BlPHndnJ.js +1 -0
  303. package/dist/gui/client/assets/swimlanesDiagram-VR7AAH4N-BPabHwsZ.js +8 -0
  304. package/dist/gui/client/assets/timeline-definition-24CTP7MA-E4Y1lPBI.js +120 -0
  305. package/dist/gui/client/assets/treeView-Q6P3EWNA-DrY0uhTN.js +1 -0
  306. package/dist/gui/client/assets/treemap-WGGIJYW6-CVotnLHf.js +1 -0
  307. package/dist/gui/client/assets/vennDiagram-4TSXK5OY-DJNrLIOF.js +34 -0
  308. package/dist/gui/client/assets/wardley-WFR3VGLG-ClOpAp5S.js +1 -0
  309. package/dist/gui/client/assets/wardleyDiagram-VM6X3IG4-qhMoKOXc.js +78 -0
  310. package/dist/gui/client/assets/xychartDiagram-S5SC5T6Z-CTuXoo9R.js +7 -0
  311. package/dist/gui/client/index.html +6 -0
  312. package/dist/gui/ops-worker.js +167 -0
  313. package/dist/gui/reads-worker.js +473 -0
  314. package/dist/gui/server.js +9780 -0
  315. package/dist/gui-QJS7XQMV.js +16 -0
  316. package/dist/init-DV5B6HQG.js +354 -0
  317. package/dist/install-6C45YXFP.js +19 -0
  318. package/dist/install-O7NSRU2W.js +13 -0
  319. package/dist/interactive-OXGYZYAS.js +22381 -0
  320. package/dist/interop-J7UOBOSF.js +254 -0
  321. package/dist/inventory-OEGIL6PY.js +144 -0
  322. package/dist/library-B3UPGY4V.js +83 -0
  323. package/dist/library-MXQA5DLT.js +309 -0
  324. package/dist/library-ROZAMUIL.js +496 -0
  325. package/dist/library-import-2LTWOVBD.js +190 -0
  326. package/dist/library-inventory-LJ3XHLWO.js +60 -0
  327. package/dist/library-validation-DARHHUNW.js +46 -0
  328. package/dist/mcp-2GSPYQ54.js +28 -0
  329. package/dist/memory-J3STUUIK.js +537 -0
  330. package/dist/models-Y3GMFJ2V.js +314 -0
  331. package/dist/monitor-LHNH577J.js +811 -0
  332. package/dist/orchestrator-DTAPXULA.js +12117 -0
  333. package/dist/panes-A743ONZ5.js +103 -0
  334. package/dist/panes-CTNO57ZY.js +76 -0
  335. package/dist/paths-3SBYJQDP.js +68 -0
  336. package/dist/preload-OJBMAIXF.js +140 -0
  337. package/dist/providers-CMETPZNS.js +232 -0
  338. package/dist/registry-37T4U6X2.js +15 -0
  339. package/dist/reset-O7EUCYWO.js +346 -0
  340. package/dist/resources-FY6XYFN2.js +189 -0
  341. package/dist/run-H64MEVTA.js +1067 -0
  342. package/dist/run-script-PQ5NRU3X.js +42 -0
  343. package/dist/settings-SNIQNXCW.js +73 -0
  344. package/dist/settings-controls-X6GMCPVG.js +202 -0
  345. package/dist/share-CAFMMQLM.js +299 -0
  346. package/dist/skills-ERKQUC7L.js +114 -0
  347. package/dist/skills-eval-CQ23MYQK.js +1099 -0
  348. package/dist/skills-inventory-TVUYJDVN.js +142 -0
  349. package/dist/slash-commands-ROG3KIFJ.js +107 -0
  350. package/dist/startup-background-KDWCQMWT.js +247 -0
  351. package/dist/steer-KKYXJSH4.js +77 -0
  352. package/dist/support-M3RCUUEL.js +40 -0
  353. package/dist/system-ZDW44ZGX.js +142 -0
  354. package/dist/target-runtimes-PWA22WVW.js +73 -0
  355. package/dist/targets-AJWA6E7Z.js +1207 -0
  356. package/dist/tasks-6L2JJRC5.js +39 -0
  357. package/dist/terminal-lease-YFUSDPAD.js +432 -0
  358. package/dist/tools-5XJUABRD.js +30 -0
  359. package/dist/trace-LA5MVR4Y.js +527 -0
  360. package/dist/tree-sitter-TQW3Y52T.js +4673 -0
  361. package/dist/tui-primitives-IUCVWLH5.js +19 -0
  362. package/dist/uninstall-SAWGGXAB.js +448 -0
  363. package/dist/upgrade-HSNSVTZG.js +300 -0
  364. package/dist/usage-XSILDHKF.js +1083 -0
  365. package/dist/verifiers-ECA5GIHL.js +633 -0
  366. package/dist/verify-R6QQCCEB.js +31 -0
  367. package/dist/version-PLZYB5KW.js +22 -0
  368. package/dist/web-fetch-PVZNMBOB.js +803 -0
  369. package/dist/wiki-generate-RP22WP5K.js +647 -0
  370. package/dist/with-panes-W3PAZPRF.js +629 -0
  371. package/dist/worker/entry.js +324 -284
  372. package/dist/workspace-check-3764ZKC2.js +83 -0
  373. package/docs/README.md +26 -10
  374. package/docs/architecture/acp.md +179 -12
  375. package/docs/architecture/artifact-placement.md +1 -1
  376. package/docs/architecture/capacity-and-scheduling.md +7 -8
  377. package/docs/architecture/context-engine.md +350 -95
  378. package/docs/architecture/model-catalog.md +18 -11
  379. package/docs/architecture/observability.md +1 -1
  380. package/docs/architecture/pi-boundary.md +59 -6
  381. package/docs/architecture/prompt-envelope-and-tools.md +147 -39
  382. package/docs/architecture/provider-adapter-cookbook.md +2 -2
  383. package/docs/architecture/safety-model.md +18 -4
  384. package/docs/architecture/trace-store.md +2 -2
  385. package/docs/architecture/tui-design.md +41 -81
  386. package/docs/architecture/worker-dispatch-mechanics.md +9 -1
  387. package/docs/gui/README.md +69 -0
  388. package/docs/gui/boundary-doctrine.md +104 -0
  389. package/docs/gui/chat-rendering-spec.md +1440 -0
  390. package/docs/gui/cli-surface-routing.md +148 -0
  391. package/docs/gui/delivery-order.md +53 -0
  392. package/docs/gui/event-bus-coverage.md +103 -0
  393. package/docs/gui/inspector-presentation.md +71 -0
  394. package/docs/gui/parity/01-cli-surface.md +74 -0
  395. package/docs/gui/parity/02-slash-and-surfaces.md +110 -0
  396. package/docs/gui/parity/03-domains-and-plan.md +69 -0
  397. package/docs/gui/performance-baseline.md +76 -0
  398. package/docs/gui/settings-write-surface.md +267 -0
  399. package/docs/gui/workflow-coverage.md +64 -0
  400. package/docs/guide/built-in-agents.md +1 -1
  401. package/docs/guide/commands-and-modes.md +256 -99
  402. package/docs/guide/configuration-and-targets.md +485 -124
  403. package/docs/guide/configuration-reference.md +165 -82
  404. package/docs/guide/doctor.md +127 -0
  405. package/docs/guide/environment-variables.md +1 -1
  406. package/docs/guide/exit-codes-and-output.md +3 -1
  407. package/docs/guide/extensions-and-sharing.md +3 -14
  408. package/docs/guide/fleet-dispatch.md +231 -45
  409. package/docs/guide/glossary.md +1 -1
  410. package/docs/guide/installation-and-lifecycle.md +27 -16
  411. package/docs/guide/interop.md +2 -2
  412. package/docs/guide/proactive-memory.md +154 -68
  413. package/docs/guide/resource-library.md +4 -0
  414. package/docs/guide/skills-marketplace.md +8 -4
  415. package/docs/guide/slurm.md +88 -0
  416. package/docs/guide/tool-usage.md +134 -11
  417. package/docs/guide/troubleshooting.md +4 -2
  418. package/docs/process/battletest-2026-09-20-fixes.md +161 -0
  419. package/docs/process/configure-tree-proposal.md +637 -0
  420. package/docs/process/documentation-coverage.md +8 -0
  421. package/docs/process/documentation-guide.md +18 -1
  422. package/docs/process/eval-runner.md +58 -14
  423. package/docs/process/performance-methodology.md +11 -3
  424. package/docs/process/release-cut-checklist.md +29 -3
  425. package/docs/process/tool-audit-v0.4.9.md +3 -0
  426. package/examples/extensions/README.md +1 -3
  427. package/examples/extensions/lab-status/clio-coder-extension.json +1 -1
  428. package/examples/extensions/measurements/clio-coder-extension.json +1 -1
  429. package/library/registry.yaml +30 -5
  430. package/library/skills/git/fix-issue/SKILL.md +2 -1
  431. package/library/skills/git/fix-issue/plugin.json +1 -1
  432. package/library/skills/git/ship/SKILL.md +2 -1
  433. package/library/skills/git/ship/plugin.json +1 -1
  434. package/library/skills/meta/clio-coder-test/SKILL.md +5 -6
  435. package/library/skills/meta/clio-coder-test/evals.md +2 -2
  436. package/library/skills/meta/clio-coder-test/references/test-map.md +2 -2
  437. package/library/skills/registry.yaml +9 -5
  438. package/library/skills/research/slurm-jobs/SKILL.md +110 -0
  439. package/library/skills/research/slurm-jobs/evals.md +39 -0
  440. package/library/skills/research/slurm-jobs/plugin.json +23 -0
  441. package/library/skills/skill-marketplace.json +18 -2
  442. package/package.json +15 -10
  443. package/src/cli/args.ts +59 -0
  444. package/src/cli/argv.ts +7 -0
  445. package/src/cli/clio.ts +9 -1
  446. package/src/cli/configure-controls.ts +136 -0
  447. package/src/cli/configure-onboarding.ts +24 -7
  448. package/src/cli/configure-quick.ts +32 -7
  449. package/src/cli/configure-target.ts +11 -1
  450. package/src/cli/configure.ts +253 -256
  451. package/src/cli/docs-server.ts +290 -0
  452. package/src/cli/docs.ts +60 -15
  453. package/src/cli/doctor-deep.ts +126 -0
  454. package/src/cli/doctor-hpc.ts +122 -0
  455. package/src/cli/doctor-slurm.ts +130 -0
  456. package/src/cli/doctor-task-worktrees.ts +88 -0
  457. package/src/cli/doctor.ts +165 -16
  458. package/src/cli/fleet-verify.ts +3 -2
  459. package/src/cli/gui.ts +111 -0
  460. package/src/cli/index.ts +14 -4
  461. package/src/cli/library.ts +2 -7
  462. package/src/cli/modes/json-stream.ts +4 -2
  463. package/src/cli/modes/print.ts +252 -25
  464. package/src/cli/run.ts +199 -71
  465. package/src/cli/skills.ts +25 -7
  466. package/src/cli/targets.ts +87 -9
  467. package/src/cli/uninstall.ts +28 -8
  468. package/src/cli/usage.ts +2 -1
  469. package/src/cli/workspace-check.ts +71 -0
  470. package/src/core/bash-exec.ts +8 -2
  471. package/src/core/bus-events.ts +32 -3
  472. package/src/core/cache-telemetry.ts +3 -2
  473. package/src/core/compile-cache.ts +11 -1
  474. package/src/core/config.ts +59 -6
  475. package/src/core/defaults.ts +27 -5
  476. package/src/core/diagnostics.ts +25 -0
  477. package/src/core/event-bus.ts +2 -1
  478. package/src/core/gateway-routing.ts +10 -3
  479. package/src/core/git-commit-attribution.ts +2 -1
  480. package/src/core/naming-compat.ts +6 -4
  481. package/src/core/package-root.ts +0 -9
  482. package/src/core/path-canonical.ts +143 -24
  483. package/src/core/residency-target-key.ts +2 -6
  484. package/src/core/run-overrides.ts +1 -1
  485. package/src/core/settings-awareness.ts +108 -0
  486. package/src/core/settings-controls.ts +673 -0
  487. package/src/core/settings-navigation.ts +116 -0
  488. package/src/core/theme-token-hex.ts +19 -9
  489. package/src/core/turn-constraints.ts +52 -0
  490. package/src/domains/agents/builtins/scout.md +7 -17
  491. package/src/domains/agents/catalog.ts +5 -1
  492. package/src/domains/agents/extension.ts +2 -1
  493. package/src/domains/agents/registry.ts +4 -3
  494. package/src/domains/agents/result-contract.ts +132 -1
  495. package/src/domains/config/classify.ts +11 -7
  496. package/src/domains/config/extension.ts +5 -1
  497. package/src/domains/config/keybindings.ts +2 -2
  498. package/src/domains/context/codewiki/coordinator.ts +10 -0
  499. package/src/domains/context/worker/snapshot.ts +6 -3
  500. package/src/domains/dispatch/active-route-planner.ts +2 -0
  501. package/src/domains/dispatch/agent-candidates.ts +5 -1
  502. package/src/domains/dispatch/capability-match.ts +1 -1
  503. package/src/domains/dispatch/contract.ts +28 -0
  504. package/src/domains/dispatch/event-pump.ts +37 -3
  505. package/src/domains/dispatch/extension.ts +391 -48
  506. package/src/domains/dispatch/failure-classification.ts +37 -2
  507. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  508. package/src/domains/dispatch/run-identity.ts +10 -3
  509. package/src/domains/dispatch/target-breaker.ts +163 -0
  510. package/src/domains/dispatch/types.ts +29 -2
  511. package/src/domains/dispatch/worker-model-loads.ts +66 -0
  512. package/src/domains/dispatch/worker-protocol.ts +20 -1
  513. package/src/domains/dispatch/worker-spawn.ts +28 -2
  514. package/src/domains/eval/artifacts/redact.ts +9 -0
  515. package/src/domains/eval/metrics/noop.ts +61 -0
  516. package/src/domains/eval/reports/junit.ts +5 -1
  517. package/src/domains/eval/reports/text.ts +7 -0
  518. package/src/domains/eval/runners/clio-run.ts +19 -8
  519. package/src/domains/eval/runners/external-command.ts +29 -4
  520. package/src/domains/eval/schema/adapter.ts +6 -2
  521. package/src/domains/eval/schema/suite.ts +2 -0
  522. package/src/domains/eval/schema/validate.ts +3 -0
  523. package/src/domains/eval/suites/run.ts +167 -26
  524. package/src/domains/evidence/detail.ts +3 -2
  525. package/src/domains/extensions/operator-runtime.ts +11 -4
  526. package/src/domains/gateway/mcp/client.ts +1 -1
  527. package/src/domains/lifecycle/doctor.ts +42 -26
  528. package/src/domains/lifecycle/migrations/2026-09-18-ollama-runtime-id.ts +38 -0
  529. package/src/domains/lifecycle/migrations/index.ts +2 -0
  530. package/src/domains/middleware/demo-guidance.ts +36 -0
  531. package/src/domains/middleware/dispatch-nudge.ts +1 -1
  532. package/src/domains/middleware/memory-intervention.ts +51 -4
  533. package/src/domains/middleware/runtime.ts +5 -4
  534. package/src/domains/middleware/skills-reminder.ts +29 -52
  535. package/src/domains/middleware/task-nudge.ts +1 -0
  536. package/src/domains/middleware/watchdog.ts +4 -0
  537. package/src/domains/observability/extension.ts +2 -1
  538. package/src/domains/observability/out-of-turn-usage.ts +3 -2
  539. package/src/domains/observability/projection.ts +3 -2
  540. package/src/domains/observability/worker-progress.ts +48 -0
  541. package/src/domains/prompts/compiler.ts +148 -52
  542. package/src/domains/prompts/contract.ts +3 -3
  543. package/src/domains/prompts/demo-guidance.ts +8 -0
  544. package/src/domains/prompts/extension.ts +12 -7
  545. package/src/domains/prompts/fragments/identity/clio.md +2 -1
  546. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -0
  547. package/src/domains/prompts/fragments/identity/self-awareness.md +4 -0
  548. package/src/domains/prompts/fragments/operating/contract.md +16 -7
  549. package/src/domains/prompts/fragments/operating/delegation.md +29 -13
  550. package/src/domains/prompts/fragments/operating/skills.md +18 -10
  551. package/src/domains/prompts/fragments/operating/worker.md +2 -0
  552. package/src/domains/providers/cache-deployment.ts +45 -2
  553. package/src/domains/providers/contract.ts +52 -11
  554. package/src/domains/providers/extension.ts +230 -53
  555. package/src/domains/providers/model-discovery.ts +22 -8
  556. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +5 -7
  557. package/src/domains/providers/plugins.ts +3 -4
  558. package/src/domains/providers/probe/fingerprint.ts +2 -2
  559. package/src/domains/providers/probe/reasoning.ts +9 -16
  560. package/src/domains/providers/probe/tool-call.ts +236 -0
  561. package/src/domains/providers/registry.ts +51 -8
  562. package/src/domains/providers/runtime-resolution.ts +60 -12
  563. package/src/domains/providers/runtimes/boot-manifest.ts +1 -1
  564. package/src/domains/providers/runtimes/builtins.ts +2 -2
  565. package/src/domains/providers/runtimes/common/lmstudio-http.ts +57 -41
  566. package/src/domains/providers/runtimes/common/local-synth.ts +3 -1
  567. package/src/domains/providers/runtimes/common/ollama-model-ids.ts +11 -0
  568. package/src/domains/providers/runtimes/common/probe-helpers.ts +53 -0
  569. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +3 -1
  570. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +7 -13
  571. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +7 -17
  572. package/src/domains/providers/runtimes/local-native/llamacpp.ts +1 -0
  573. package/src/domains/providers/runtimes/local-native/ollama.ts +211 -0
  574. package/src/domains/providers/runtimes/protocol/litellm.ts +77 -65
  575. package/src/domains/providers/support.ts +1 -1
  576. package/src/domains/providers/types/local-model-quirks.ts +2 -3
  577. package/src/domains/providers/types/runtime-descriptor.ts +23 -3
  578. package/src/domains/providers/types/target-descriptor.ts +15 -3
  579. package/src/domains/resources/collision.ts +7 -2
  580. package/src/domains/resources/index.ts +1 -0
  581. package/src/domains/resources/library-actions.ts +4 -2
  582. package/src/domains/resources/library-inventory.ts +6 -2
  583. package/src/domains/resources/prompts/loader.ts +20 -7
  584. package/src/domains/resources/skills/availability.ts +56 -0
  585. package/src/domains/resources/skills/loader.ts +20 -9
  586. package/src/domains/safety/action-classifier.ts +282 -31
  587. package/src/domains/safety/audit.ts +2 -1
  588. package/src/domains/safety/autonomy.ts +54 -11
  589. package/src/domains/safety/decision-presentation.ts +17 -4
  590. package/src/domains/safety/finish-contract-registration.ts +25 -1
  591. package/src/domains/safety/finish-contract.ts +20 -5
  592. package/src/domains/safety/path-policy.ts +6 -2
  593. package/src/domains/safety/policy-engine.ts +168 -48
  594. package/src/domains/safety/protected-artifacts.ts +527 -16
  595. package/src/domains/safety/read-scope.ts +120 -0
  596. package/src/domains/safety/skill-authority.ts +52 -16
  597. package/src/domains/scheduling/cluster.ts +14 -3
  598. package/src/domains/scheduling/contract.ts +7 -0
  599. package/src/domains/scheduling/extension.ts +20 -9
  600. package/src/domains/scheduling/local-capacity.ts +160 -0
  601. package/src/domains/session/context-accounting.ts +44 -31
  602. package/src/domains/session/context-ledger.ts +10 -3
  603. package/src/domains/session/entries.ts +4 -0
  604. package/src/domains/session/history.ts +1 -1
  605. package/src/domains/session/prompt-cache.ts +1 -0
  606. package/src/domains/session/prompt-manifest.ts +3 -1
  607. package/src/domains/session/retry.ts +4 -6
  608. package/src/domains/session/task-board.ts +19 -4
  609. package/src/domains/session/tree/preview.ts +3 -2
  610. package/src/engine/acp/commands.ts +653 -0
  611. package/src/engine/acp/server.ts +639 -20
  612. package/src/engine/acp/tool-mediator.ts +30 -7
  613. package/src/engine/acp/types.ts +58 -0
  614. package/src/engine/agent.ts +55 -10
  615. package/src/engine/ai.ts +11 -2
  616. package/src/engine/api-registry.ts +5 -4
  617. package/src/engine/apis/degraded-inference.ts +243 -0
  618. package/src/engine/apis/llamacpp-residency.ts +50 -6
  619. package/src/engine/apis/lmstudio-residency.ts +3 -5
  620. package/src/engine/apis/lmstudio.ts +137 -31
  621. package/src/engine/apis/ollama-http.ts +118 -0
  622. package/src/engine/apis/ollama-native.ts +216 -97
  623. package/src/engine/apis/openai-completions.ts +191 -189
  624. package/src/engine/apis/output-budget.ts +3 -1
  625. package/src/engine/apis/residency-lock.ts +2 -1
  626. package/src/engine/apis/residency.ts +339 -89
  627. package/src/engine/apis/sampling-overrides.ts +23 -2
  628. package/src/engine/apis/types.ts +1 -2
  629. package/src/engine/claude/tool-safety.ts +30 -5
  630. package/src/engine/context.ts +13 -0
  631. package/src/engine/env-api-keys.ts +2 -1
  632. package/src/engine/gemma-channel-filter.ts +3 -2
  633. package/src/engine/instrumented-tui.ts +25 -0
  634. package/src/engine/loop-guard.ts +172 -6
  635. package/src/engine/pi-mono-names.ts +16 -0
  636. package/src/engine/prewarm.ts +44 -15
  637. package/src/engine/provider-payload.ts +52 -14
  638. package/src/engine/session.ts +4 -2
  639. package/src/engine/worker-events.ts +9 -1
  640. package/src/engine/worker-runtime.ts +269 -42
  641. package/src/engine/worker-tools.ts +8 -3
  642. package/src/entry/boot-options.ts +23 -0
  643. package/src/entry/orchestrator.ts +207 -36
  644. package/src/interactive/assistant-generation-timing.ts +52 -0
  645. package/src/interactive/chat-loop-messages.ts +4 -1
  646. package/src/interactive/chat-loop.ts +59 -9
  647. package/src/interactive/chat-panel.ts +10 -1
  648. package/src/interactive/clio-editor.ts +51 -79
  649. package/src/interactive/context-meter.ts +1 -0
  650. package/src/interactive/context-overlay.ts +21 -8
  651. package/src/interactive/cost-overlay.ts +1 -1
  652. package/src/interactive/dispatch-board.ts +39 -8
  653. package/src/interactive/editor-bash.ts +0 -34
  654. package/src/interactive/editor-rails.ts +43 -0
  655. package/src/interactive/editor-submit.ts +34 -2
  656. package/src/interactive/footer/dashboard.ts +67 -38
  657. package/src/interactive/footer/demo-hints.ts +40 -0
  658. package/src/interactive/footer/key-hints.ts +21 -0
  659. package/src/interactive/footer/notifications.ts +1 -1
  660. package/src/interactive/footer/pages.ts +486 -0
  661. package/src/interactive/footer/system-metrics.ts +147 -0
  662. package/src/interactive/footer/widgets.ts +158 -63
  663. package/src/interactive/footer-panel.ts +29 -7
  664. package/src/interactive/interactive-application.ts +109 -21
  665. package/src/interactive/interactive-event-projection.ts +6 -2
  666. package/src/interactive/interactive-presentation.ts +25 -29
  667. package/src/interactive/interactive-slash-runtime.ts +32 -18
  668. package/src/interactive/interactive-subscriptions.ts +25 -5
  669. package/src/interactive/interactive-tickers.ts +21 -5
  670. package/src/interactive/keybinding-manager.ts +9 -0
  671. package/src/interactive/overlay-frame.ts +29 -7
  672. package/src/interactive/overlay-lifecycle.ts +5 -3
  673. package/src/interactive/overlay-model-selectors.ts +4 -0
  674. package/src/interactive/overlay-permission-lifecycle.ts +6 -5
  675. package/src/interactive/overlays/ask-user.ts +103 -110
  676. package/src/interactive/overlays/help-reference.ts +1 -0
  677. package/src/interactive/overlays/message-picker.ts +3 -29
  678. package/src/interactive/overlays/session-selector.ts +3 -2
  679. package/src/interactive/overlays/settings-sections.ts +2 -30
  680. package/src/interactive/overlays/settings.ts +310 -607
  681. package/src/interactive/permission-hint.ts +3 -3
  682. package/src/interactive/permission-overlay.ts +45 -27
  683. package/src/interactive/renderers/doctor-report.ts +43 -0
  684. package/src/interactive/renderers/tool-execution.ts +87 -62
  685. package/src/interactive/renderers/worker-entry.ts +76 -3
  686. package/src/interactive/side-question.ts +3 -1
  687. package/src/interactive/slash-commands.ts +78 -23
  688. package/src/interactive/startup-background.ts +131 -0
  689. package/src/interactive/startup-diagnostics.ts +16 -0
  690. package/src/interactive/status/state-machine.ts +16 -3
  691. package/src/interactive/status/types.ts +2 -0
  692. package/src/interactive/status/verbs.ts +1 -1
  693. package/src/interactive/terminal-lease.ts +26 -22
  694. package/src/interactive/theme/components.ts +1 -1
  695. package/src/interactive/theme/rules.ts +1 -1
  696. package/src/interactive/theme/tokens.ts +16 -10
  697. package/src/interactive/transcript-detail.ts +4 -0
  698. package/src/interactive/turn-context.ts +56 -20
  699. package/src/interactive/turn-middleware.ts +57 -9
  700. package/src/interactive/turn-prewarm.ts +121 -18
  701. package/src/interactive/turn-recovery.ts +10 -8
  702. package/src/interactive/turn-runtime.ts +74 -29
  703. package/src/interactive/turn-state.ts +3 -0
  704. package/src/interactive/welcome-art.ts +36 -0
  705. package/src/interactive/welcome-dashboard.ts +209 -49
  706. package/src/interactive/worker-replay.ts +4 -0
  707. package/src/interactive/worker-stream.ts +17 -2
  708. package/src/tools/agent-tools.ts +22 -1
  709. package/src/tools/builtin-tool-catalog.ts +2 -2
  710. package/src/tools/codewiki/code-nav.ts +1 -1
  711. package/src/tools/codewiki/shared.ts +39 -1
  712. package/src/tools/compete-worktrees.ts +8 -91
  713. package/src/tools/context/docs-engine.ts +44 -12
  714. package/src/tools/context/index.ts +126 -22
  715. package/src/tools/context/library.ts +1 -1
  716. package/src/tools/context/surface.ts +12 -7
  717. package/src/tools/core-bootstrap.ts +3 -0
  718. package/src/tools/dispatch-runner.ts +18 -0
  719. package/src/tools/dispatch-schema.ts +187 -206
  720. package/src/tools/edit.ts +46 -42
  721. package/src/tools/file-mutation-queue.ts +25 -26
  722. package/src/tools/gateway/clio-context-surface.ts +1 -1
  723. package/src/tools/gateway/index.ts +7 -3
  724. package/src/tools/gateway/mcp-capabilities.ts +5 -3
  725. package/src/tools/grep.ts +14 -2
  726. package/src/tools/ls.ts +1 -4
  727. package/src/tools/monitor.ts +14 -1
  728. package/src/tools/observation.ts +1 -3
  729. package/src/tools/path-utils.ts +51 -18
  730. package/src/tools/process-lease.ts +99 -0
  731. package/src/tools/read.ts +1 -1
  732. package/src/tools/registry.ts +71 -9
  733. package/src/tools/task-worktree.ts +296 -17
  734. package/src/tools/tasks.ts +29 -7
  735. package/src/tools/worker-evidence.ts +60 -1
  736. package/src/tools/worktree-root.ts +252 -0
  737. package/src/tools/write.ts +34 -30
  738. package/src/worker/entry.ts +18 -1
  739. package/src/worker/protocol.ts +54 -1
  740. package/src/worker/spec-contract.ts +22 -2
  741. package/dist/acp-ZWZCPS2A.js +0 -130
  742. package/dist/agents-LYSOWZUE.js +0 -150
  743. package/dist/auth-WBQGKWQ5.js +0 -551
  744. package/dist/background-BUMOBAQN.js +0 -37
  745. package/dist/builtins-ODRJOEDI.js +0 -22
  746. package/dist/chunk-2DRRZ57Q.js +0 -571
  747. package/dist/chunk-2JBZYUPY.js +0 -105
  748. package/dist/chunk-2VBWFXYE.js +0 -198
  749. package/dist/chunk-2X2R3UTH.js +0 -1018
  750. package/dist/chunk-32KJPXAM.js +0 -75
  751. package/dist/chunk-37LW32LZ.js +0 -32
  752. package/dist/chunk-3A3CUMKA.js +0 -54
  753. package/dist/chunk-3AND2EFU.js +0 -215
  754. package/dist/chunk-3RDHGNU7.js +0 -647
  755. package/dist/chunk-3SUDBGEI.js +0 -1323
  756. package/dist/chunk-3TQN67I2.js +0 -396
  757. package/dist/chunk-3U4BL2EV.js +0 -103
  758. package/dist/chunk-3UQADNG2.js +0 -302
  759. package/dist/chunk-434LRQ6Z.js +0 -13441
  760. package/dist/chunk-4ATBOFRP.js +0 -7802
  761. package/dist/chunk-4DNL43EZ.js +0 -139
  762. package/dist/chunk-4HFJKRGZ.js +0 -5250
  763. package/dist/chunk-555E2WVV.js +0 -322
  764. package/dist/chunk-5GZICIYO.js +0 -462
  765. package/dist/chunk-5PHVPU4G.js +0 -160
  766. package/dist/chunk-5RTEFNBP.js +0 -197
  767. package/dist/chunk-64XJW7NT.js +0 -380
  768. package/dist/chunk-6TKOFFGE.js +0 -1058
  769. package/dist/chunk-6UJ7RDI7.js +0 -1143
  770. package/dist/chunk-7FBCRWVT.js +0 -1801
  771. package/dist/chunk-7JSOSVLP.js +0 -283
  772. package/dist/chunk-7N3OLLSL.js +0 -637
  773. package/dist/chunk-7QQRPB2E.js +0 -915
  774. package/dist/chunk-A6DULIMH.js +0 -986
  775. package/dist/chunk-AB3QXXBC.js +0 -123
  776. package/dist/chunk-ACCECAH4.js +0 -49
  777. package/dist/chunk-AM6CEP2K.js +0 -2120
  778. package/dist/chunk-AUHVBIDW.js +0 -19
  779. package/dist/chunk-AY4XE6GN.js +0 -665
  780. package/dist/chunk-BBA2TAWV.js +0 -667
  781. package/dist/chunk-BFPHMSK7.js +0 -169
  782. package/dist/chunk-BMNVVKEW.js +0 -604
  783. package/dist/chunk-CKK25WN3.js +0 -72
  784. package/dist/chunk-CTGZCEI6.js +0 -33
  785. package/dist/chunk-DIAJYJYG.js +0 -446
  786. package/dist/chunk-DVNAPPXU.js +0 -27
  787. package/dist/chunk-DXVMLM3Z.js +0 -92
  788. package/dist/chunk-E3LEPLQ2.js +0 -68
  789. package/dist/chunk-EHZRAB4U.js +0 -63
  790. package/dist/chunk-EM2DIQAJ.js +0 -179
  791. package/dist/chunk-EM2WNQS2.js +0 -93
  792. package/dist/chunk-ETF4ROKH.js +0 -595
  793. package/dist/chunk-F2YM3JY4.js +0 -22513
  794. package/dist/chunk-FEBQWHJT.js +0 -1023
  795. package/dist/chunk-FPS4R2RN.js +0 -1975
  796. package/dist/chunk-GD55RTIW.js +0 -33
  797. package/dist/chunk-GJDRMBDI.js +0 -573
  798. package/dist/chunk-GREYLTZ5.js +0 -658
  799. package/dist/chunk-H2WSCZZT.js +0 -238
  800. package/dist/chunk-H6IUCY6Q.js +0 -117
  801. package/dist/chunk-H72DCH3E.js +0 -563
  802. package/dist/chunk-H7TXJR23.js +0 -705
  803. package/dist/chunk-HBJQQTKM.js +0 -40
  804. package/dist/chunk-HCVKSGNZ.js +0 -990
  805. package/dist/chunk-HVCAY2FH.js +0 -67
  806. package/dist/chunk-I47EJPYL.js +0 -1377
  807. package/dist/chunk-IALGWTLO.js +0 -36
  808. package/dist/chunk-IALZJE37.js +0 -1710
  809. package/dist/chunk-IC7JXLOM.js +0 -1577
  810. package/dist/chunk-IOSVTTCD.js +0 -108
  811. package/dist/chunk-IPTPMLA6.js +0 -475
  812. package/dist/chunk-IZZI3SKQ.js +0 -128
  813. package/dist/chunk-JABWPKFY.js +0 -27
  814. package/dist/chunk-JIYWMQZ5.js +0 -175
  815. package/dist/chunk-JKU34ACI.js +0 -693
  816. package/dist/chunk-JOBN2YQQ.js +0 -176
  817. package/dist/chunk-JOL2QRLE.js +0 -152
  818. package/dist/chunk-JTR3VSV3.js +0 -44
  819. package/dist/chunk-JU6MAMRJ.js +0 -362
  820. package/dist/chunk-JURMQWVJ.js +0 -15
  821. package/dist/chunk-K2BLQC5E.js +0 -262
  822. package/dist/chunk-K3XN4LZ4.js +0 -402
  823. package/dist/chunk-KIVFXGBM.js +0 -688
  824. package/dist/chunk-KKRXONXG.js +0 -43
  825. package/dist/chunk-KOAHT3N2.js +0 -395
  826. package/dist/chunk-KP5BPXR3.js +0 -73
  827. package/dist/chunk-KQ6IDQIB.js +0 -39
  828. package/dist/chunk-KRJQG47M.js +0 -1289
  829. package/dist/chunk-KW6OJ7IY.js +0 -221
  830. package/dist/chunk-L3NBWLSN.js +0 -314
  831. package/dist/chunk-L4RUTLRL.js +0 -59
  832. package/dist/chunk-LGTVWPRN.js +0 -47
  833. package/dist/chunk-LSQW6KZO.js +0 -200
  834. package/dist/chunk-LTR5QCLS.js +0 -446
  835. package/dist/chunk-LWJYOHT3.js +0 -165
  836. package/dist/chunk-M6YLF66Z.js +0 -2687
  837. package/dist/chunk-MJ4QEJVT.js +0 -185
  838. package/dist/chunk-MO65K5CH.js +0 -1148
  839. package/dist/chunk-MTOZEQHL.js +0 -637
  840. package/dist/chunk-MZDPF35R.js +0 -45
  841. package/dist/chunk-MZKYVIWW.js +0 -188
  842. package/dist/chunk-NBPA5QM6.js +0 -386
  843. package/dist/chunk-NMBEW4PP.js +0 -688
  844. package/dist/chunk-NPLLK3HO.js +0 -3610
  845. package/dist/chunk-NSYGPIVW.js +0 -39
  846. package/dist/chunk-NXTV5OI5.js +0 -1020
  847. package/dist/chunk-NYDG4QP4.js +0 -689
  848. package/dist/chunk-OA2GDACN.js +0 -146
  849. package/dist/chunk-PJI57EC6.js +0 -236
  850. package/dist/chunk-PJJBUGMR.js +0 -4484
  851. package/dist/chunk-PNJE7JPS.js +0 -50
  852. package/dist/chunk-PP23PZEV.js +0 -1347
  853. package/dist/chunk-PPIFDSBK.js +0 -409
  854. package/dist/chunk-PTFISXQO.js +0 -319
  855. package/dist/chunk-QB33Z5S7.js +0 -1865
  856. package/dist/chunk-QGNII5VC.js +0 -110
  857. package/dist/chunk-QH3ZTUOA.js +0 -113
  858. package/dist/chunk-QI72X67S.js +0 -481
  859. package/dist/chunk-QJMRYTCX.js +0 -56
  860. package/dist/chunk-QKHZZFKH.js +0 -98
  861. package/dist/chunk-RDKX2PME.js +0 -66
  862. package/dist/chunk-RL7LJYN4.js +0 -66
  863. package/dist/chunk-RPMNIFRY.js +0 -65
  864. package/dist/chunk-RQROVOV3.js +0 -670
  865. package/dist/chunk-S34A7BSP.js +0 -97
  866. package/dist/chunk-SJETVJHX.js +0 -119
  867. package/dist/chunk-SJMNU4ZS.js +0 -634
  868. package/dist/chunk-SL2RDHKO.js +0 -19
  869. package/dist/chunk-SLLG2G44.js +0 -85
  870. package/dist/chunk-SQAZN2V3.js +0 -2744
  871. package/dist/chunk-SQBT46OF.js +0 -814
  872. package/dist/chunk-SRCEQKQS.js +0 -165
  873. package/dist/chunk-TCUOGIL2.js +0 -52
  874. package/dist/chunk-TIWPKCVO.js +0 -42
  875. package/dist/chunk-U44YYLVV.js +0 -1529
  876. package/dist/chunk-UIU7MGZ3.js +0 -486
  877. package/dist/chunk-USBBEKHW.js +0 -177
  878. package/dist/chunk-VHKTOLEW.js +0 -1416
  879. package/dist/chunk-VPWGADBG.js +0 -3151
  880. package/dist/chunk-VQD7NH7Z.js +0 -356
  881. package/dist/chunk-VWFCAK34.js +0 -697
  882. package/dist/chunk-W5RM7YAH.js +0 -78
  883. package/dist/chunk-W72LLZAV.js +0 -243
  884. package/dist/chunk-WGRDABW7.js +0 -207
  885. package/dist/chunk-WWRV5RJI.js +0 -165
  886. package/dist/chunk-XCUDZQLX.js +0 -195
  887. package/dist/chunk-XFLSL7BT.js +0 -386
  888. package/dist/chunk-XJZEDCNT.js +0 -391
  889. package/dist/chunk-XLLEL3K7.js +0 -709
  890. package/dist/chunk-XNZWWDC3.js +0 -686
  891. package/dist/chunk-XRECG65F.js +0 -308
  892. package/dist/chunk-XTQ7MEJG.js +0 -457
  893. package/dist/chunk-XW2UZICE.js +0 -372
  894. package/dist/chunk-Y3M2T5RO.js +0 -891
  895. package/dist/chunk-YGDMBK7O.js +0 -567
  896. package/dist/chunk-YJCCMYYT.js +0 -125
  897. package/dist/chunk-YPQOPFP7.js +0 -797
  898. package/dist/chunk-YQYINEJI.js +0 -132
  899. package/dist/chunk-ZF6CV4WZ.js +0 -5614
  900. package/dist/chunk-ZKJU55MX.js +0 -326
  901. package/dist/chunk-ZKQ63XZ5.js +0 -1196
  902. package/dist/chunk-ZKVMDNAN.js +0 -962
  903. package/dist/chunk-ZST3FRCV.js +0 -132
  904. package/dist/clio-JUDCLNHC.js +0 -26
  905. package/dist/clio-context-tools-FT672MNZ.js +0 -136
  906. package/dist/code-nav-7OVCTP2Z.js +0 -688
  907. package/dist/compile-cache-WJEPUZEJ.js +0 -16
  908. package/dist/components-OZXZMDWU.js +0 -674
  909. package/dist/config-P3ZQVF63.js +0 -275
  910. package/dist/config-graph-GKAOBAS5.js +0 -160
  911. package/dist/configure-25LRYZJG.js +0 -86
  912. package/dist/context-72VQV7JX.js +0 -73
  913. package/dist/context-COWRWXP3.js +0 -286
  914. package/dist/context-WB3D474G.js +0 -344
  915. package/dist/context-clear-Y4LYMWC6.js +0 -192
  916. package/dist/context-index-W6A4V7OC.js +0 -120
  917. package/dist/context-map-DKL3QT6D.js +0 -555
  918. package/dist/context-working-set-TMZYVC7A.js +0 -1560
  919. package/dist/data-tool-KMBWKKWR.js +0 -2987
  920. package/dist/detail-4GLROGY5.js +0 -123
  921. package/dist/dispatch-runner-TR3LBP5P.js +0 -2446
  922. package/dist/docs-ZK777W2G.js +0 -101
  923. package/dist/doctor-WC4OV2OB.js +0 -814
  924. package/dist/eval-FUNWJNUJ.js +0 -5050
  925. package/dist/eval-inventory-CX24K2JT.js +0 -260
  926. package/dist/evals-L73EBHSU.js +0 -104
  927. package/dist/evidence-AVJ2RTHX.js +0 -392
  928. package/dist/evidence-P4NZOAK7.js +0 -233
  929. package/dist/evidence-Y55WKYHH.js +0 -246
  930. package/dist/evolve-MAWKRYWF.js +0 -617
  931. package/dist/extensions-PYQH3H47.js +0 -308
  932. package/dist/fleet-M4H2QBWT.js +0 -268
  933. package/dist/fleet-ULBXXRDR.js +0 -923
  934. package/dist/fleet-commands-7NNC4JZU.js +0 -76
  935. package/dist/fleet-decisions-EHEY7KPU.js +0 -52
  936. package/dist/fleet-graph-LQ2AHZT3.js +0 -136
  937. package/dist/fleet-inspect-5IGBIIYZ.js +0 -312
  938. package/dist/fleet-new-RCKGSRDV.js +0 -48
  939. package/dist/fleet-preflight-UTTNOKMG.js +0 -27
  940. package/dist/fleet-validate-YGILJKA6.js +0 -91
  941. package/dist/fleet-verify-AUWTCDKR.js +0 -210
  942. package/dist/fleet-view-TGUFCY5A.js +0 -127
  943. package/dist/init-GFN2Z7NF.js +0 -333
  944. package/dist/install-3RZDDP23.js +0 -13
  945. package/dist/install-6PIF6F6W.js +0 -19
  946. package/dist/interop-EF5JUWWK.js +0 -246
  947. package/dist/inventory-I6VJDDYF.js +0 -127
  948. package/dist/library-3J5IO2OJ.js +0 -75
  949. package/dist/library-IJTOFTDS.js +0 -307
  950. package/dist/library-Z3KZSHPE.js +0 -492
  951. package/dist/library-import-IMKFLDHX.js +0 -183
  952. package/dist/library-inventory-CQP5D6GU.js +0 -56
  953. package/dist/library-validation-33UTX7AI.js +0 -42
  954. package/dist/mcp-5FWZKUS6.js +0 -26
  955. package/dist/memory-36CWN67Y.js +0 -520
  956. package/dist/models-KQ6PQJJQ.js +0 -302
  957. package/dist/monitor-XX6ZD6KC.js +0 -785
  958. package/dist/orchestrator-SK6HDAOP.js +0 -42067
  959. package/dist/panes-L27QRXUH.js +0 -74
  960. package/dist/panes-LXZIWNOZ.js +0 -103
  961. package/dist/paths-7DJDU4P4.js +0 -67
  962. package/dist/preload-K2TDYI4Y.js +0 -124
  963. package/dist/registry-DESGAXWK.js +0 -11
  964. package/dist/reset-73VU3XNT.js +0 -345
  965. package/dist/resources-3BYJYVYL.js +0 -181
  966. package/dist/run-AR7PY6GW.js +0 -896
  967. package/dist/run-script-H2KUDIII.js +0 -41
  968. package/dist/settings-3VMBMWID.js +0 -72
  969. package/dist/share-HVWH4FPF.js +0 -293
  970. package/dist/skills-5TYEY75Q.js +0 -100
  971. package/dist/skills-eval-CK3MD63Z.js +0 -1083
  972. package/dist/skills-inventory-KSFYG3I6.js +0 -138
  973. package/dist/slash-commands-DMVHML7P.js +0 -98
  974. package/dist/steer-XCD6V3EW.js +0 -77
  975. package/dist/support-JAZL6VBR.js +0 -38
  976. package/dist/system-3TDQRMZZ.js +0 -116
  977. package/dist/targets-EZKHAYRN.js +0 -1117
  978. package/dist/tasks-SNEFHWYW.js +0 -36
  979. package/dist/terminal-lease-BNLFA4OF.js +0 -419
  980. package/dist/tools-7IM6BDCE.js +0 -28
  981. package/dist/trace-C3MBGD4S.js +0 -524
  982. package/dist/tree-sitter-AQUUOSYM.js +0 -4673
  983. package/dist/tui-primitives-36BY2774.js +0 -18
  984. package/dist/uninstall-WWLOSZ42.js +0 -432
  985. package/dist/upgrade-ETK2JNSJ.js +0 -297
  986. package/dist/usage-S2HOB7BZ.js +0 -1065
  987. package/dist/verifiers-QDTEVH7R.js +0 -632
  988. package/dist/verify-SUKUK6XM.js +0 -31
  989. package/dist/version-RFPKO6T7.js +0 -21
  990. package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +0 -1
  991. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +0 -1
  992. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +0 -36
  993. package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +0 -129
  994. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +0 -38
  995. package/dist/web/client/assets/channel-c4EeUUqA.js +0 -1
  996. package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +0 -62
  997. package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +0 -2
  998. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +0 -125
  999. package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +0 -1
  1000. package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +0 -72
  1001. package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +0 -1
  1002. package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +0 -231
  1003. package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +0 -1
  1004. package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +0 -10
  1005. package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +0 -1
  1006. package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +0 -1
  1007. package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +0 -1
  1008. package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +0 -168
  1009. package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +0 -88
  1010. package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +0 -206
  1011. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +0 -1
  1012. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +0 -1
  1013. package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +0 -1
  1014. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +0 -62
  1015. package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +0 -4
  1016. package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +0 -30
  1017. package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +0 -41
  1018. package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +0 -3
  1019. package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +0 -24
  1020. package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +0 -24
  1021. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +0 -1
  1022. package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +0 -99
  1023. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +0 -1
  1024. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +0 -1
  1025. package/dist/web/client/assets/framework-YGoR34M4.js +0 -9
  1026. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +0 -292
  1027. package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +0 -1
  1028. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +0 -106
  1029. package/dist/web/client/assets/index-CVcy0FAn.js +0 -75
  1030. package/dist/web/client/assets/index-Dsi52apB.css +0 -1
  1031. package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +0 -1
  1032. package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +0 -2
  1033. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +0 -70
  1034. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +0 -139
  1035. package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +0 -89
  1036. package/dist/web/client/assets/line-BIDAcEtX.js +0 -1
  1037. package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +0 -7
  1038. package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +0 -44
  1039. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +0 -96
  1040. package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +0 -1
  1041. package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +0 -1
  1042. package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +0 -1
  1043. package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +0 -39
  1044. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +0 -7
  1045. package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +0 -1
  1046. package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +0 -1
  1047. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +0 -1
  1048. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +0 -1
  1049. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +0 -1
  1050. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +0 -1
  1051. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +0 -84
  1052. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +0 -40
  1053. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +0 -162
  1054. package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +0 -1
  1055. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +0 -1
  1056. package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +0 -1
  1057. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +0 -8
  1058. package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +0 -120
  1059. package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +0 -1
  1060. package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +0 -1
  1061. package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +0 -34
  1062. package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +0 -1
  1063. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +0 -78
  1064. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +0 -7
  1065. package/dist/web/client/index.html +0 -6
  1066. package/dist/web/ops-worker.js +0 -37
  1067. package/dist/web/reads-worker.js +0 -1726
  1068. package/dist/web/server.js +0 -8499
  1069. package/dist/web-EMGUGGEI.js +0 -13
  1070. package/dist/web-fetch-6BRRVQON.js +0 -805
  1071. package/dist/wiki-generate-XHSJTDOP.js +0 -627
  1072. package/dist/with-panes-Z6BTEHMZ.js +0 -628
  1073. package/evals/README.md +0 -9
  1074. package/evals/behavioral-corpus-grader.mjs +0 -236
  1075. package/evals/behavioral-machinery-baseline.json +0 -2276
  1076. package/evals/behavioral-machinery-driver.ts +0 -250
  1077. package/evals/behavioral-machinery-support.ts +0 -254
  1078. package/evals/behavioral-machinery.yaml +0 -614
  1079. package/evals/behavioral-model-negative-control.yaml +0 -69
  1080. package/evals/behavioral-model.yaml +0 -482
  1081. package/evals/fixtures/behavioral-facts.txt +0 -3
  1082. package/evals/fixtures/behavioral-main.ts +0 -7
  1083. package/evals/fixtures/decoy/note.txt +0 -2
  1084. package/evals/fixtures/docs-retrieval.json +0 -102
  1085. package/evals/fixtures/private/credentials.txt +0 -1
  1086. package/evals/fixtures/scalar-decision.json +0 -17
  1087. package/evals/fixtures/scout-citation-pipeline.json +0 -55
  1088. package/evals/fixtures/source-explanation.json +0 -74
  1089. package/evals/fixtures/tool-arguments.json +0 -18
  1090. package/evals/fixtures/tool-surface/read.txt +0 -4
  1091. package/evals/fixtures/tool-surface/subdir/keep.txt +0 -1
  1092. package/evals/no-edit-memory-grader.mjs +0 -149
  1093. package/evals/scalar-decision-grader.py +0 -41
  1094. package/evals/scalar-decision-machinery.ts +0 -145
  1095. package/evals/source-explanation-grader.mjs +0 -118
  1096. package/evals/tool-surface-grader.mjs +0 -53
  1097. package/evals/tool-surface-model.yaml +0 -274
  1098. package/evals/tracked-metrics-baseline.yaml +0 -229
  1099. package/evals/tracked-metrics-grader.mjs +0 -129
  1100. package/src/cli/web.ts +0 -79
  1101. package/src/domains/providers/runtimes/local-native/ollama-native.ts +0 -122
  1102. /package/dist/assets/{web-notices → gui-notices}/@hono__node-server-LICENSE +0 -0
  1103. /package/dist/assets/{web-notices → gui-notices}/hono-LICENSE +0 -0
  1104. /package/dist/{web → gui}/client/THIRD_PARTY_LICENSES.md +0 -0
  1105. /package/dist/{web → gui}/client/assets/arc-Pry-7G1_.js +0 -0
  1106. /package/dist/{web → gui}/client/assets/array-BifhSqXX.js +0 -0
  1107. /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  1108. /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  1109. /package/dist/{web → gui}/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +0 -0
  1110. /package/dist/{web → gui}/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +0 -0
  1111. /package/dist/{web → gui}/client/assets/chunk-FOHPRMQF-CoA4358r.js +0 -0
  1112. /package/dist/{web → gui}/client/assets/chunk-JWPE2WC7-DVXcaiue.js +0 -0
  1113. /package/dist/{web → gui}/client/assets/chunk-XXDRQBXY-DqAYeljN.js +0 -0
  1114. /package/dist/{web → gui}/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +0 -0
  1115. /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  1116. /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  1117. /package/dist/{web → gui}/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +0 -0
  1118. /package/dist/{web → gui}/client/assets/cytoscape.esm-c2aL46s-.js +0 -0
  1119. /package/dist/{web → gui}/client/assets/dagre-C-rnJpZF.js +0 -0
  1120. /package/dist/{web → gui}/client/assets/defaultLocale-BFoDCU3G.js +0 -0
  1121. /package/dist/{web → gui}/client/assets/dist-v5Q1xZ2K.js +0 -0
  1122. /package/dist/{web → gui}/client/assets/graphlib-DS17s2tU.js +0 -0
  1123. /package/dist/{web → gui}/client/assets/init-C-OQMol4.js +0 -0
  1124. /package/dist/{web → gui}/client/assets/katex-ZlcWpGUi.js +0 -0
  1125. /package/dist/{web → gui}/client/assets/linear-SzVmGSw4.js +0 -0
  1126. /package/dist/{web → gui}/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  1127. /package/dist/{web → gui}/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  1128. /package/dist/{web → gui}/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  1129. /package/dist/{web → gui}/client/assets/ordinal-BDEzSJ7C.js +0 -0
  1130. /package/dist/{web → gui}/client/assets/path-fybaL0A-.js +0 -0
  1131. /package/dist/{web → gui}/client/assets/prism-bash-D6zCJ74D.js +0 -0
  1132. /package/dist/{web → gui}/client/assets/prism-c-04YixN25.js +0 -0
  1133. /package/dist/{web → gui}/client/assets/prism-clike-DapgWyxx.js +0 -0
  1134. /package/dist/{web → gui}/client/assets/prism-core-BtsZdCS6.js +0 -0
  1135. /package/dist/{web → gui}/client/assets/prism-cpp-C-lJbC-6.js +0 -0
  1136. /package/dist/{web → gui}/client/assets/prism-css-CPgOzxXp.js +0 -0
  1137. /package/dist/{web → gui}/client/assets/prism-diff-BF8m0_mq.js +0 -0
  1138. /package/dist/{web → gui}/client/assets/prism-docker-DkT6yOFj.js +0 -0
  1139. /package/dist/{web → gui}/client/assets/prism-fortran-Be5x3y1V.js +0 -0
  1140. /package/dist/{web → gui}/client/assets/prism-go-C_8qAH5n.js +0 -0
  1141. /package/dist/{web → gui}/client/assets/prism-ini-BESK3y0r.js +0 -0
  1142. /package/dist/{web → gui}/client/assets/prism-javascript-BnO-swvr.js +0 -0
  1143. /package/dist/{web → gui}/client/assets/prism-json-Dp_-W-Hv.js +0 -0
  1144. /package/dist/{web → gui}/client/assets/prism-jsx-D-D0NWtC.js +0 -0
  1145. /package/dist/{web → gui}/client/assets/prism-julia-DIjOgiAV.js +0 -0
  1146. /package/dist/{web → gui}/client/assets/prism-latex-DNMbqcH_.js +0 -0
  1147. /package/dist/{web → gui}/client/assets/prism-makefile-CRKWLQ8l.js +0 -0
  1148. /package/dist/{web → gui}/client/assets/prism-markdown-C0FPJ1Iz.js +0 -0
  1149. /package/dist/{web → gui}/client/assets/prism-markup-Cp04rIa1.js +0 -0
  1150. /package/dist/{web → gui}/client/assets/prism-matlab-D-nk08al.js +0 -0
  1151. /package/dist/{web → gui}/client/assets/prism-python-CfiSVtM6.js +0 -0
  1152. /package/dist/{web → gui}/client/assets/prism-r-QmNGR8LX.js +0 -0
  1153. /package/dist/{web → gui}/client/assets/prism-rust-Bu9N8X3N.js +0 -0
  1154. /package/dist/{web → gui}/client/assets/prism-shell-session-Be4UuYoM.js +0 -0
  1155. /package/dist/{web → gui}/client/assets/prism-sql-CYhVDMEE.js +0 -0
  1156. /package/dist/{web → gui}/client/assets/prism-toml-DKb54GAT.js +0 -0
  1157. /package/dist/{web → gui}/client/assets/prism-tsx-p6J2Kc_4.js +0 -0
  1158. /package/dist/{web → gui}/client/assets/prism-typescript-BMqONzxf.js +0 -0
  1159. /package/dist/{web → gui}/client/assets/prism-yaml-C0JHu8gr.js +0 -0
  1160. /package/dist/{web → gui}/client/assets/purify.es-ChwZkWde.js +0 -0
  1161. /package/dist/{web → gui}/client/assets/rolldown-runtime-hePW80VL.js +0 -0
  1162. /package/dist/{web → gui}/client/assets/rough.esm-Dy-Kn_BL.js +0 -0
  1163. /package/dist/{web → gui}/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -0
  1164. /package/dist/{web → gui}/client/assets/src-B6xuSHsQ.js +0 -0
  1165. /package/dist/{web → gui}/client/clio-coder-logo.webp +0 -0
  1166. /package/dist/{web → gui}/client/icon-192.png +0 -0
  1167. /package/dist/{web → gui}/client/icon-512.png +0 -0
  1168. /package/dist/{web → gui}/client/manifest.webmanifest +0 -0
  1169. /package/dist/{web → gui}/client/offline.css +0 -0
  1170. /package/dist/{web → gui}/client/offline.html +0 -0
  1171. /package/dist/{web → gui}/client/offline.js +0 -0
  1172. /package/dist/{web → gui}/client/sw.js +0 -0
@@ -0,0 +1,1721 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ loadProjectVerifierCatalog
4
+ } from "./chunk-6CTHLZFB.js";
5
+ import {
6
+ projectSurfaceTrust,
7
+ safetySurfaceTrustHash,
8
+ workspaceTrustDirectory
9
+ } from "./chunk-X6FLVUM5.js";
10
+ import {
11
+ INTEROP_AGENT_KINDS,
12
+ foreignAgentDirs
13
+ } from "./chunk-5EQO5NWP.js";
14
+ import {
15
+ classify,
16
+ normalizeCallPaths
17
+ } from "./chunk-VYRQHORQ.js";
18
+ import {
19
+ commandArgumentSegments,
20
+ extractCommandCdTargets,
21
+ extractCommandDeleteTargets,
22
+ extractCommandWriteTargets,
23
+ inlineShellScript,
24
+ invokesClioSkillMutation,
25
+ scanShellLike,
26
+ scanShellLikeDeep
27
+ } from "./chunk-P4GNZPXO.js";
28
+ import {
29
+ pathBoundaryCovers,
30
+ resolvePathBoundary
31
+ } from "./chunk-R2P2U3ZS.js";
32
+ import {
33
+ artifactDefaultPath
34
+ } from "./chunk-NTTS3O53.js";
35
+ import {
36
+ expandPath,
37
+ readPathVariants
38
+ } from "./chunk-C2CPOIH2.js";
39
+ import {
40
+ canonicalizeExistingPath,
41
+ canonicalizePath,
42
+ canonicalizeRawPath,
43
+ createPathWalkMemo
44
+ } from "./chunk-MGLRTOCK.js";
45
+ import {
46
+ ToolNames
47
+ } from "./chunk-V4XJWDHR.js";
48
+ import {
49
+ require_dist
50
+ } from "./chunk-B5GGDIHT.js";
51
+ import {
52
+ clioConfigDir,
53
+ clioStateDir
54
+ } from "./chunk-CTTI7G3T.js";
55
+ import {
56
+ resolvePackageRoot
57
+ } from "./chunk-ZPST2KQO.js";
58
+ import {
59
+ __toESM,
60
+ init_esm_shims
61
+ } from "./chunk-ECBHH7LU.js";
62
+
63
+ // src/domains/safety/policy-engine.ts
64
+ init_esm_shims();
65
+ import { createHash as createHash2 } from "node:crypto";
66
+ import { readFileSync as readFileSync3 } from "node:fs";
67
+ import path5 from "node:path";
68
+
69
+ // src/domains/safety/default-path-policy.ts
70
+ init_esm_shims();
71
+ var DEFAULT_DAMAGE_CONTROL_PATH_POLICY = {
72
+ zeroAccessPaths: [
73
+ ".env",
74
+ ".env.local",
75
+ ".env.development",
76
+ ".env.production",
77
+ ".env.staging",
78
+ ".env.test",
79
+ ".env.*.local",
80
+ "*.env",
81
+ "~/.ssh/",
82
+ "~/.gnupg/",
83
+ "~/.aws/",
84
+ "~/.config/gcloud/",
85
+ "*-credentials.json",
86
+ "*serviceAccount*.json",
87
+ "*service-account*.json",
88
+ "~/.azure/",
89
+ "~/.kube/",
90
+ "kubeconfig",
91
+ "*-secret.yaml",
92
+ "secrets.yaml",
93
+ "~/.docker/",
94
+ "*.pem",
95
+ "*.key",
96
+ "*.p12",
97
+ "*.pfx",
98
+ "*.tfstate",
99
+ "*.tfstate.backup",
100
+ ".terraform/",
101
+ ".vercel/",
102
+ ".netlify/",
103
+ "firebase-adminsdk*.json",
104
+ "serviceAccountKey.json",
105
+ ".supabase/",
106
+ "~/.netrc",
107
+ "~/.npmrc",
108
+ "~/.pypirc",
109
+ "~/.git-credentials",
110
+ ".git-credentials",
111
+ // Remote URLs in the repo git config can embed access tokens, and .git
112
+ // is hidden from grep/find but not from direct reads without this entry.
113
+ ".git/config",
114
+ // Clio's own provider secret store. The literal covers a repo-level file
115
+ // of the same name on purpose; the expanded clioConfigDir() form is
116
+ // appended at policy construction (policy-engine.ts), since this static
117
+ // list cannot call config helpers.
118
+ "credentials.yaml",
119
+ "dump.sql",
120
+ "backup.sql",
121
+ "*.dump"
122
+ ],
123
+ readOnlyPaths: [
124
+ // Clio's own operator-authority files in the project. `safety.yaml` is the
125
+ // policy that gates the model's tools, and `verifiers.yaml` is an argv
126
+ // catalog that verify() executes; a model that can author either one can
127
+ // widen its own permissions in two tool calls. Both are authored by the
128
+ // operator through the CLI (`clio-coder verifiers author` lands nothing
129
+ // before `--yes`), so model-side writes and deletes are refused.
130
+ // Skills also refuse model-side writes and deletes; installs go through `clio-coder library install`.
131
+ ".clio-coder/safety.yaml",
132
+ ".clio-coder/verifiers.yaml",
133
+ ".clio-coder/skills/",
134
+ ".clio-coder/plugins/",
135
+ ".clio-coder/extensions/",
136
+ "/etc/",
137
+ "/usr/",
138
+ "/bin/",
139
+ "/sbin/",
140
+ "/boot/",
141
+ "/root/",
142
+ "~/.bash_history",
143
+ "~/.zsh_history",
144
+ "~/.node_repl_history",
145
+ "~/.bashrc",
146
+ "~/.zshrc",
147
+ "~/.profile",
148
+ "~/.bash_profile",
149
+ "*.min.js",
150
+ "*.min.css",
151
+ "*.bundle.js",
152
+ "*.chunk.js",
153
+ "dist/",
154
+ "build/",
155
+ ".next/",
156
+ ".nuxt/",
157
+ ".output/",
158
+ "node_modules/",
159
+ "__pycache__/",
160
+ ".venv/",
161
+ "venv/",
162
+ "target/"
163
+ ],
164
+ // Another agent's own configuration. Clio reads these roots for skills,
165
+ // prompts, and rule prose and has no reason to author them, so the guard is
166
+ // on writes and not only on deletes.
167
+ noWritePaths: [...foreignAgentDirs()],
168
+ noDeletePaths: [
169
+ "~/.claude/",
170
+ "CLAUDE.md",
171
+ "LICENSE",
172
+ "LICENSE.*",
173
+ "COPYING",
174
+ "COPYING.*",
175
+ "NOTICE",
176
+ "PATENTS",
177
+ "README.md",
178
+ "README.*"
179
+ ]
180
+ };
181
+ function mergePathPolicyInputs(base, override) {
182
+ return {
183
+ zeroAccessPaths: [...base.zeroAccessPaths ?? [], ...override.zeroAccessPaths ?? []],
184
+ readOnlyPaths: [...base.readOnlyPaths ?? [], ...override.readOnlyPaths ?? []],
185
+ noWritePaths: [...base.noWritePaths ?? [], ...override.noWritePaths ?? []],
186
+ noDeletePaths: [...base.noDeletePaths ?? [], ...override.noDeletePaths ?? []]
187
+ };
188
+ }
189
+ var OPERATOR_PATH_POLICY = {
190
+ zeroAccessPaths: DEFAULT_DAMAGE_CONTROL_PATH_POLICY.zeroAccessPaths?.filter((entry) => entry.startsWith("~/")) ?? [],
191
+ readOnlyPaths: DEFAULT_DAMAGE_CONTROL_PATH_POLICY.readOnlyPaths?.filter(
192
+ (entry) => entry.startsWith("~/") || entry.startsWith("/") || entry.startsWith(".clio-coder/")
193
+ ) ?? [],
194
+ noWritePaths: DEFAULT_DAMAGE_CONTROL_PATH_POLICY.noWritePaths ?? [],
195
+ noDeletePaths: DEFAULT_DAMAGE_CONTROL_PATH_POLICY.noDeletePaths?.filter((entry) => entry.startsWith("~/")) ?? []
196
+ };
197
+
198
+ // src/domains/safety/path-policy.ts
199
+ init_esm_shims();
200
+ import { homedir } from "node:os";
201
+ import path from "node:path";
202
+ var ORDERED_KINDS = ["zeroAccessPaths", "readOnlyPaths", "noWritePaths", "noDeletePaths"];
203
+ function isSameOrDescendant(candidatePath, policyPath) {
204
+ const candidate = path.resolve(candidatePath);
205
+ const policy = path.resolve(policyPath);
206
+ const relative = path.relative(policy, candidate);
207
+ return relative === "" || relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
208
+ }
209
+ function expandTilde(rawPath) {
210
+ if (rawPath === "~") return homedir();
211
+ if (rawPath.startsWith("~/")) return path.join(homedir(), rawPath.slice(2));
212
+ return rawPath;
213
+ }
214
+ function normalizePolicyEntry(rawPath, root) {
215
+ const expanded = expandTilde(rawPath.trim());
216
+ const resolved = path.isAbsolute(expanded) ? path.resolve(expanded) : path.resolve(root, expanded);
217
+ return canonicalizeExistingPath(resolved);
218
+ }
219
+ function blocksOperation(kind, operation) {
220
+ if (kind === "zeroAccessPaths") return true;
221
+ if (kind === "readOnlyPaths" || kind === "noWritePaths") return operation === "write" || operation === "delete";
222
+ return operation === "delete";
223
+ }
224
+ function compilePathPolicy(input, root = process.cwd()) {
225
+ const resolvedRoot = canonicalizeExistingPath(path.resolve(root));
226
+ const entries = [];
227
+ const diagnostics = [];
228
+ for (const kind of ORDERED_KINDS) {
229
+ for (const rawPath of input[kind] ?? []) {
230
+ const trimmed = rawPath.trim();
231
+ if (trimmed.length === 0) {
232
+ diagnostics.push(`${kind}: path must not be empty`);
233
+ continue;
234
+ }
235
+ const entry = { kind, path: normalizePolicyEntry(trimmed, resolvedRoot), source: trimmed };
236
+ const pattern = compilePathPattern(trimmed, resolvedRoot);
237
+ if (pattern !== null) entry.pattern = pattern;
238
+ entries.push(entry);
239
+ }
240
+ }
241
+ return {
242
+ root: resolvedRoot,
243
+ entries: entries.sort((a, b) => a.kind.localeCompare(b.kind) || a.path.localeCompare(b.path)),
244
+ diagnostics
245
+ };
246
+ }
247
+ function evaluatePathPolicy(policy, operation, targetPath, cwd = policy.root, memo) {
248
+ const expanded = expandTilde(targetPath);
249
+ const lexicalTarget = path.isAbsolute(expanded) ? path.resolve(expanded) : path.resolve(cwd, expanded);
250
+ const resolvedTarget = canonicalizeRawPath(expanded, cwd, memo) ?? canonicalizeExistingPath(lexicalTarget, memo);
251
+ const normalizedResolvedTarget = normalizeSeparators(resolvedTarget);
252
+ const normalizedRelativeTarget = normalizeSeparators(path.relative(policy.root, resolvedTarget));
253
+ const normalizedRawTarget = normalizeSeparators(targetPath);
254
+ for (const entry of policy.entries) {
255
+ if (!blocksOperation(entry.kind, operation)) continue;
256
+ if (!matchesEntry(entry, resolvedTarget, normalizedResolvedTarget, normalizedRelativeTarget, normalizedRawTarget))
257
+ continue;
258
+ return {
259
+ kind: "block",
260
+ reasonCode: `path-policy:${entry.kind}`,
261
+ reason: `${operation} denied by ${entry.kind} entry ${entry.source}`,
262
+ matchedPath: entry.path,
263
+ policyKind: entry.kind
264
+ };
265
+ }
266
+ return { kind: "allow" };
267
+ }
268
+ function matchesEntry(entry, resolvedTarget, normalizedResolvedTarget, normalizedRelativeTarget, normalizedRawTarget) {
269
+ if (isSameOrDescendant(resolvedTarget, entry.path)) return true;
270
+ if (entry.pattern === void 0) return false;
271
+ return entry.pattern.test(normalizedResolvedTarget) || entry.pattern.test(normalizedRelativeTarget) || entry.pattern.test(normalizedRawTarget);
272
+ }
273
+ function compilePathPattern(rawPath, root) {
274
+ if (!rawPath.includes("*")) return null;
275
+ const expanded = expandTilde(rawPath.trim());
276
+ const source = path.isAbsolute(expanded) ? expanded : path.join(root, expanded);
277
+ const normalized = normalizeSeparators(canonicalizePatternSource(source));
278
+ const relative = normalizeSeparators(path.isAbsolute(expanded) ? expanded : expanded);
279
+ const absolutePattern = segmentPattern(normalized);
280
+ const relativePattern = segmentPattern(relative);
281
+ return new RegExp(`(?:${absolutePattern})|(?:${relativePattern})`);
282
+ }
283
+ function canonicalizePatternSource(patternPath) {
284
+ const wildcardIndex = patternPath.indexOf("*");
285
+ if (wildcardIndex === -1) return canonicalizeExistingPath(patternPath);
286
+ const fixedPrefix = patternPath.slice(0, wildcardIndex);
287
+ const separatorIndex = fixedPrefix.lastIndexOf(path.sep);
288
+ if (separatorIndex === -1) return patternPath;
289
+ const prefix = patternPath.slice(0, separatorIndex + 1);
290
+ const suffix = patternPath.slice(separatorIndex + 1);
291
+ return path.join(canonicalizeExistingPath(prefix), suffix);
292
+ }
293
+ function segmentPattern(rawPath) {
294
+ const escaped = rawPath.split("*").map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("[^/]*");
295
+ return `(?:^|/)${escaped}(?:$|/)`;
296
+ }
297
+ function normalizeSeparators(value) {
298
+ return value.split(path.sep).join("/");
299
+ }
300
+
301
+ // src/domains/safety/project-policy.ts
302
+ init_esm_shims();
303
+ var import_yaml = __toESM(require_dist(), 1);
304
+ import { createHash } from "node:crypto";
305
+ import { existsSync, readFileSync, realpathSync } from "node:fs";
306
+ import path2 from "node:path";
307
+ var POLICY_RELATIVE_PATH = path2.join(".clio-coder", "safety.yaml");
308
+ var ACTION_CLASSES = /* @__PURE__ */ new Set([
309
+ "read",
310
+ "write",
311
+ "execute",
312
+ "dispatch",
313
+ "system_modify",
314
+ "git_destructive",
315
+ "unknown"
316
+ ]);
317
+ var PATH_POLICY_KEYS = ["zeroAccessPaths", "readOnlyPaths", "noWritePaths", "noDeletePaths"];
318
+ var ROOT_KEYS = /* @__PURE__ */ new Set(["version", "commands", "tasks", "disableDefaultPathPolicy", ...PATH_POLICY_KEYS]);
319
+ var COMMAND_KEYS = /* @__PURE__ */ new Set([
320
+ "id",
321
+ "command",
322
+ "cwd",
323
+ "timeoutMs",
324
+ "maxOutputBytes",
325
+ "actionClass",
326
+ "shellOperators",
327
+ "env",
328
+ "requireConfirmation",
329
+ "rationale",
330
+ "owner",
331
+ "comment"
332
+ ]);
333
+ var ENV_KEYS = /* @__PURE__ */ new Set(["mode", "allow"]);
334
+ var ID_RE = /^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/;
335
+ function projectSafetyPolicyPath(cwd = process.cwd()) {
336
+ let cursor = path2.resolve(cwd);
337
+ while (true) {
338
+ const candidate = path2.join(cursor, POLICY_RELATIVE_PATH);
339
+ if (existsSync(candidate)) return candidate;
340
+ const parent = path2.dirname(cursor);
341
+ if (parent === cursor) return null;
342
+ cursor = parent;
343
+ }
344
+ }
345
+ function loadProjectSafetyPolicy(cwd = process.cwd()) {
346
+ let policyPath = projectSafetyPolicyPath(cwd);
347
+ if (policyPath === null) {
348
+ return {
349
+ path: null,
350
+ hash: null,
351
+ valid: true,
352
+ errors: [],
353
+ commands: [],
354
+ pathPolicy: {},
355
+ disableDefaultPathPolicy: false
356
+ };
357
+ }
358
+ let raw;
359
+ try {
360
+ policyPath = realpathSync(policyPath);
361
+ raw = readFileSync(policyPath, "utf8");
362
+ } catch (err) {
363
+ return {
364
+ path: policyPath,
365
+ hash: null,
366
+ valid: false,
367
+ errors: [`cannot read project safety policy: ${err instanceof Error ? err.message : String(err)}`],
368
+ commands: [],
369
+ pathPolicy: {},
370
+ disableDefaultPathPolicy: false
371
+ };
372
+ }
373
+ const hash = sha256(raw);
374
+ try {
375
+ const parsed = (0, import_yaml.parse)(raw);
376
+ return validateProjectSafetyPolicy(parsed, policyPath, hash);
377
+ } catch (err) {
378
+ return {
379
+ path: policyPath,
380
+ hash,
381
+ valid: false,
382
+ errors: [`cannot parse project safety policy: ${err instanceof Error ? err.message : String(err)}`],
383
+ commands: [],
384
+ pathPolicy: {},
385
+ disableDefaultPathPolicy: false
386
+ };
387
+ }
388
+ }
389
+ function validateProjectSafetyPolicy(value, policyPath, hash) {
390
+ const errors = [];
391
+ const commands = [];
392
+ if (!isPlainRecord(value)) {
393
+ return {
394
+ path: policyPath,
395
+ hash,
396
+ valid: false,
397
+ errors: ["policy root must be a mapping"],
398
+ commands: [],
399
+ pathPolicy: {},
400
+ disableDefaultPathPolicy: false
401
+ };
402
+ }
403
+ for (const key of Object.keys(value)) {
404
+ if (!ROOT_KEYS.has(key)) errors.push(`unknown root key '${key}'`);
405
+ }
406
+ if (value.version !== 1) errors.push("version must be 1");
407
+ appendCommandPolicies(commands, errors, value.commands, "commands");
408
+ appendCommandPolicies(commands, errors, value.tasks, "tasks");
409
+ const pathPolicy = parsePathPolicy(value, errors);
410
+ const disableDefaultPathPolicy = value.disableDefaultPathPolicy === void 0 ? false : booleanField(value, "disableDefaultPathPolicy", "policy", errors);
411
+ const ids = /* @__PURE__ */ new Set();
412
+ for (const command of commands) {
413
+ if (ids.has(command.id)) errors.push(`duplicate command id '${command.id}'`);
414
+ ids.add(command.id);
415
+ }
416
+ return {
417
+ path: policyPath,
418
+ hash,
419
+ valid: errors.length === 0,
420
+ errors,
421
+ commands: errors.length === 0 ? commands : [],
422
+ pathPolicy: errors.length === 0 ? pathPolicy : {},
423
+ disableDefaultPathPolicy: errors.length === 0 ? disableDefaultPathPolicy : false
424
+ };
425
+ }
426
+ function parsePathPolicy(value, errors) {
427
+ const out = {};
428
+ for (const key of PATH_POLICY_KEYS) {
429
+ const parsed = parsePathList(value[key], key, errors);
430
+ if (parsed !== void 0) out[key] = parsed;
431
+ }
432
+ return out;
433
+ }
434
+ function parsePathList(value, key, errors) {
435
+ if (value === void 0) return void 0;
436
+ if (!Array.isArray(value)) {
437
+ errors.push(`${key} must be an array`);
438
+ return void 0;
439
+ }
440
+ const out = [];
441
+ for (let index = 0; index < value.length; index += 1) {
442
+ const item = value[index];
443
+ const label = `${key}[${index}]`;
444
+ if (typeof item !== "string" || item.trim().length === 0) {
445
+ errors.push(`${label} must be a non-empty string`);
446
+ continue;
447
+ }
448
+ const trimmed = item.trim();
449
+ if (path2.isAbsolute(trimmed)) {
450
+ errors.push(`${label} must be relative to the policy root`);
451
+ continue;
452
+ }
453
+ const normalized = path2.normalize(trimmed);
454
+ const segments = normalized.split(path2.sep).filter((segment) => segment.length > 0);
455
+ if (segments.some((segment) => segment === "..")) {
456
+ errors.push(`${label} must not escape the policy root with '..'`);
457
+ continue;
458
+ }
459
+ out.push(trimmed);
460
+ }
461
+ return out;
462
+ }
463
+ function appendCommandPolicies(out, errors, value, field) {
464
+ if (value === void 0) return;
465
+ if (!Array.isArray(value)) {
466
+ errors.push(`${field} must be an array`);
467
+ return;
468
+ }
469
+ for (let index = 0; index < value.length; index += 1) {
470
+ const parsed = parseCommandPolicy(value[index], `${field}[${index}]`);
471
+ if (parsed.errors.length > 0) {
472
+ errors.push(...parsed.errors);
473
+ continue;
474
+ }
475
+ if (parsed.command !== void 0) out.push(parsed.command);
476
+ }
477
+ }
478
+ function parseCommandPolicy(value, label) {
479
+ const errors = [];
480
+ if (!isPlainRecord(value)) return { errors: [`${label} must be a mapping`] };
481
+ for (const key of Object.keys(value)) {
482
+ if (!COMMAND_KEYS.has(key)) errors.push(`${label}: unknown key '${key}'`);
483
+ }
484
+ const id = stringField(value, "id", label, errors);
485
+ const command = stringField(value, "command", label, errors);
486
+ const cwd = optionalStringField(value, "cwd", label, errors);
487
+ const timeoutMs = optionalPositiveInt(value, "timeoutMs", label, errors);
488
+ const maxOutputBytes = optionalPositiveInt(value, "maxOutputBytes", label, errors);
489
+ const actionClass = parseActionClass(value.actionClass, label, errors);
490
+ const shellOperators = parseShellOperators(value.shellOperators, label, errors);
491
+ const env = parseEnvPolicy(value.env, label, errors);
492
+ const requireConfirmation = value.requireConfirmation === void 0 ? false : booleanField(value, "requireConfirmation", label, errors);
493
+ const rationale = optionalStringField(value, "rationale", label, errors);
494
+ const owner = optionalStringField(value, "owner", label, errors);
495
+ const comment = optionalStringField(value, "comment", label, errors);
496
+ if (id && !ID_RE.test(id)) errors.push(`${label}.id must match ${ID_RE}`);
497
+ if (command && command.trim().length === 0) errors.push(`${label}.command must not be empty`);
498
+ if (cwd !== void 0) {
499
+ if (path2.isAbsolute(cwd)) {
500
+ errors.push(`${label}.cwd must be relative to the policy root`);
501
+ } else {
502
+ const normalized = path2.normalize(cwd);
503
+ const segments = normalized.split(path2.sep).filter((segment) => segment.length > 0);
504
+ if (segments.some((segment) => segment === "..")) {
505
+ errors.push(`${label}.cwd must not escape the policy root with '..'`);
506
+ }
507
+ }
508
+ }
509
+ if (errors.length > 0 || id === void 0 || command === void 0 || actionClass === void 0 || env === void 0) {
510
+ return { errors };
511
+ }
512
+ const parsed = {
513
+ id,
514
+ command,
515
+ actionClass,
516
+ shellOperators,
517
+ env,
518
+ requireConfirmation
519
+ };
520
+ if (cwd !== void 0) parsed.cwd = cwd;
521
+ if (timeoutMs !== void 0) parsed.timeoutMs = timeoutMs;
522
+ if (maxOutputBytes !== void 0) parsed.maxOutputBytes = maxOutputBytes;
523
+ if (rationale !== void 0) parsed.rationale = rationale;
524
+ if (owner !== void 0) parsed.owner = owner;
525
+ if (comment !== void 0) parsed.comment = comment;
526
+ return { command: parsed, errors: [] };
527
+ }
528
+ function parseActionClass(value, label, errors) {
529
+ if (typeof value !== "string") {
530
+ errors.push(`${label}.actionClass must be a string`);
531
+ return void 0;
532
+ }
533
+ if (!ACTION_CLASSES.has(value)) {
534
+ errors.push(`${label}.actionClass is not supported: ${value}`);
535
+ return void 0;
536
+ }
537
+ return value;
538
+ }
539
+ function parseShellOperators(value, label, errors) {
540
+ if (value === void 0) return "deny";
541
+ if (value === "deny" || value === "allow") return value;
542
+ errors.push(`${label}.shellOperators must be 'deny' or 'allow'`);
543
+ return "deny";
544
+ }
545
+ function parseEnvPolicy(value, label, errors) {
546
+ if (value === void 0) return { mode: "none", allow: [] };
547
+ if (!isPlainRecord(value)) {
548
+ errors.push(`${label}.env must be a mapping`);
549
+ return void 0;
550
+ }
551
+ for (const key of Object.keys(value)) {
552
+ if (!ENV_KEYS.has(key)) errors.push(`${label}.env: unknown key '${key}'`);
553
+ }
554
+ const mode = value.mode;
555
+ if (mode !== "none" && mode !== "allowlist") {
556
+ errors.push(`${label}.env.mode must be 'none' or 'allowlist'`);
557
+ return void 0;
558
+ }
559
+ const allow = value.allow;
560
+ if (allow === void 0) return { mode, allow: [] };
561
+ if (!Array.isArray(allow) || allow.some((entry) => typeof entry !== "string" || entry.length === 0)) {
562
+ errors.push(`${label}.env.allow must be an array of non-empty strings`);
563
+ return void 0;
564
+ }
565
+ if (mode === "none" && allow.length > 0) {
566
+ errors.push(`${label}.env.allow requires env.mode='allowlist'`);
567
+ return void 0;
568
+ }
569
+ return { mode, allow: [...allow] };
570
+ }
571
+ function stringField(record, key, label, errors) {
572
+ const value = record[key];
573
+ if (typeof value !== "string" || value.length === 0) {
574
+ errors.push(`${label}.${key} must be a non-empty string`);
575
+ return void 0;
576
+ }
577
+ return value;
578
+ }
579
+ function optionalStringField(record, key, label, errors) {
580
+ const value = record[key];
581
+ if (value === void 0) return void 0;
582
+ if (typeof value !== "string" || value.length === 0) {
583
+ errors.push(`${label}.${key} must be a non-empty string when present`);
584
+ return void 0;
585
+ }
586
+ return value;
587
+ }
588
+ function optionalPositiveInt(record, key, label, errors) {
589
+ const value = record[key];
590
+ if (value === void 0) return void 0;
591
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value <= 0) {
592
+ errors.push(`${label}.${key} must be a positive integer`);
593
+ return void 0;
594
+ }
595
+ return value;
596
+ }
597
+ function booleanField(record, key, label, errors) {
598
+ const value = record[key];
599
+ if (typeof value === "boolean") return value;
600
+ errors.push(`${label}.${key} must be a boolean`);
601
+ return false;
602
+ }
603
+ function isPlainRecord(value) {
604
+ return typeof value === "object" && value !== null && !Array.isArray(value);
605
+ }
606
+ function sha256(raw) {
607
+ return createHash("sha256").update(raw, "utf8").digest("hex");
608
+ }
609
+
610
+ // src/domains/safety/read-scope.ts
611
+ init_esm_shims();
612
+ import { homedir as homedir2 } from "node:os";
613
+ import path3 from "node:path";
614
+ var READ_SCOPE_TOOLS = /* @__PURE__ */ new Set([ToolNames.Read, ToolNames.Ls, ToolNames.Grep, ToolNames.Find]);
615
+ function isReadScopeTool(tool) {
616
+ return READ_SCOPE_TOOLS.has(tool);
617
+ }
618
+ function readScopeExemptRoots() {
619
+ const roots = [];
620
+ try {
621
+ const config = clioConfigDir();
622
+ for (const kind of ["skills", "plugins", "extensions"]) {
623
+ roots.push({ path: path3.join(config, kind), operatorOwned: true });
624
+ }
625
+ const state = clioStateDir();
626
+ roots.push({ path: path3.join(state, "scratch"), operatorOwned: false });
627
+ roots.push({ path: path3.join(state, "receipts"), operatorOwned: false });
628
+ } catch {
629
+ }
630
+ const home = homedir2();
631
+ for (const kind of INTEROP_AGENT_KINDS) {
632
+ if (kind.userSkillRoot !== void 0) {
633
+ roots.push({ path: path3.join(home, kind.userSkillRoot), operatorOwned: true });
634
+ }
635
+ }
636
+ return roots;
637
+ }
638
+ function readScopeSpellings(rawPath, callCwd) {
639
+ const expanded = expandPath(rawPath);
640
+ const resolved = canonicalizeRawPath(expanded, callCwd) ?? path3.resolve(callCwd, expanded);
641
+ return [expanded, ...readPathVariants(resolved)];
642
+ }
643
+ function hasParentSegment(rawPath) {
644
+ return rawPath.split(/[\\/]/u).includes("..");
645
+ }
646
+ function readScopeEscape(rawPath, callCwd, workspace, exemptRoots, memo) {
647
+ for (const spelling of readScopeSpellings(rawPath, callCwd)) {
648
+ const escaped = spellingEscape(spelling, callCwd, workspace, exemptRoots, memo);
649
+ if (escaped !== null) return escaped;
650
+ }
651
+ return null;
652
+ }
653
+ function spellingEscape(expanded, callCwd, workspace, exemptRoots, memo) {
654
+ const physical = canonicalizeRawPath(expanded, callCwd, memo);
655
+ if (physical !== null && isSameOrDescendant(physical, workspace)) return null;
656
+ const lexical = path3.resolve(callCwd, expanded);
657
+ const lexicalEligible = !hasParentSegment(expanded);
658
+ for (const root of exemptRoots) {
659
+ if (root.operatorOwned && lexicalEligible && isSameOrDescendant(lexical, root.path)) return null;
660
+ if (physical === null) continue;
661
+ const realRoot = canonicalizePath(root.path, memo);
662
+ if (realRoot !== null && isSameOrDescendant(physical, realRoot)) return null;
663
+ }
664
+ return physical ?? lexical;
665
+ }
666
+
667
+ // src/domains/safety/rejection-feedback.ts
668
+ init_esm_shims();
669
+ var HARD_BLOCK_CLASSES = ["git_destructive"];
670
+ function buildShort(ctx) {
671
+ const postureSuffix = ctx.posture ? ` in ${ctx.posture}` : "";
672
+ return `${ctx.tool} blocked: ${ctx.actionClass}${postureSuffix}`;
673
+ }
674
+ function buildDetail(ctx) {
675
+ const lines = [`Clio refused to run ${ctx.tool}.`];
676
+ for (const reason of ctx.reasons) {
677
+ lines.push(`- ${reason}`);
678
+ }
679
+ if (ctx.ruleId) {
680
+ lines.push(`rule: ${ctx.ruleId}`);
681
+ }
682
+ return lines.join("\n");
683
+ }
684
+ function buildHints(ctx) {
685
+ const hints = [];
686
+ const hardBlock = HARD_BLOCK_CLASSES.includes(ctx.actionClass) || ctx.ruleId !== void 0;
687
+ if (hardBlock) {
688
+ hints.push("This is a hard block; confirmation cannot override it.");
689
+ return hints;
690
+ }
691
+ if (ctx.actionClass === "system_modify") {
692
+ hints.push("Operator confirmation is required for this action.");
693
+ }
694
+ return hints;
695
+ }
696
+ function formatRejection(ctx) {
697
+ return {
698
+ short: buildShort(ctx),
699
+ detail: buildDetail(ctx),
700
+ hints: buildHints(ctx)
701
+ };
702
+ }
703
+ var MODEL_REJECTION_PIVOT = "Do not retry this action through another tool unless a hint above names one; pivot or report the blocker.";
704
+ var MODEL_REJECTION_MAX_LINES = 16;
705
+ var MODEL_REJECTION_MAX_LINE_CHARS = 300;
706
+ function formatModelRejection(reason, rejection) {
707
+ const lines = [];
708
+ const seen = /* @__PURE__ */ new Set();
709
+ const push = (line) => {
710
+ const bounded = line.length > MODEL_REJECTION_MAX_LINE_CHARS ? `${line.slice(0, MODEL_REJECTION_MAX_LINE_CHARS)}\u2026` : line;
711
+ const trimmed = bounded.trim();
712
+ if (trimmed.length === 0) return;
713
+ const normalized = trimmed.replace(/^-\s+/, "");
714
+ if (seen.has(normalized) || normalized === MODEL_REJECTION_PIVOT) return;
715
+ seen.add(normalized);
716
+ lines.push(trimmed);
717
+ };
718
+ for (const line of reason.split("\n")) push(line);
719
+ if (rejection) {
720
+ for (const line of rejection.detail.split("\n")) push(line);
721
+ for (const hint of rejection.hints) push(hint);
722
+ }
723
+ const bodyBudget = MODEL_REJECTION_MAX_LINES - 1;
724
+ const body = lines.length > bodyBudget ? [...lines.slice(0, bodyBudget - 1), "(further detail elided)"] : lines;
725
+ return [...body, MODEL_REJECTION_PIVOT].join("\n");
726
+ }
727
+
728
+ // src/domains/safety/rule-pack-loader.ts
729
+ init_esm_shims();
730
+ var import_yaml2 = __toESM(require_dist(), 1);
731
+ import { readFileSync as readFileSync2 } from "node:fs";
732
+ import { join } from "node:path";
733
+
734
+ // src/domains/safety/rule-compiler.ts
735
+ init_esm_shims();
736
+ function asString(value, ruleId, field) {
737
+ if (typeof value !== "string" || value.length === 0) {
738
+ throw new Error(`damage-control rule '${ruleId}': expected string for ${field}`);
739
+ }
740
+ return value;
741
+ }
742
+ function compileDamageControlRule(raw, index) {
743
+ if (typeof raw.id !== "string" || raw.id.length === 0) {
744
+ throw new Error(`damage-control rule at index ${index}: missing or non-string 'id'`);
745
+ }
746
+ const id = raw.id;
747
+ const description = asString(raw.description, id, "description");
748
+ const patternString = asString(raw.pattern, id, "pattern");
749
+ const klass = asString(raw.class, id, "class");
750
+ if (typeof raw.block !== "boolean") {
751
+ throw new Error(`damage-control rule '${id}': expected boolean for block`);
752
+ }
753
+ if (raw.ask !== void 0 && typeof raw.ask !== "boolean") {
754
+ throw new Error(`damage-control rule '${id}': expected boolean for ask`);
755
+ }
756
+ let pattern;
757
+ try {
758
+ pattern = new RegExp(patternString, "i");
759
+ } catch (err) {
760
+ const msg = err instanceof Error ? err.message : String(err);
761
+ throw new Error(`damage-control rule '${id}': invalid pattern: ${msg}`);
762
+ }
763
+ return {
764
+ id,
765
+ description,
766
+ pattern,
767
+ class: klass,
768
+ block: raw.block,
769
+ ...raw.ask !== void 0 ? { ask: raw.ask } : {}
770
+ };
771
+ }
772
+
773
+ // src/domains/safety/rule-pack-loader.ts
774
+ function compilePackRules(rawRules, packId) {
775
+ if (rawRules === void 0 || rawRules === null) return [];
776
+ if (!Array.isArray(rawRules)) {
777
+ throw new Error(`damage-control pack '${packId}': expected array at 'rules'`);
778
+ }
779
+ return rawRules.map((rule, index) => compileDamageControlRule(rule, index));
780
+ }
781
+ function emptyRuleset(version) {
782
+ return { version, rules: [] };
783
+ }
784
+ function loadRulePacks(yamlPath) {
785
+ const raw = readFileSync2(yamlPath, "utf8");
786
+ const parsed = (0, import_yaml2.parse)(raw);
787
+ if (!parsed || typeof parsed !== "object") {
788
+ throw new Error(`damage-control rules at ${yamlPath}: expected mapping at document root`);
789
+ }
790
+ const version = typeof parsed.version === "number" ? parsed.version : 0;
791
+ if (version === 1) {
792
+ const baseRules = compilePackRules(parsed.rules, "base");
793
+ return {
794
+ base: { version: 1, rules: baseRules }
795
+ };
796
+ }
797
+ if (version !== 2) {
798
+ throw new Error(`damage-control rules at ${yamlPath}: unsupported version ${String(parsed.version)}`);
799
+ }
800
+ if (!Array.isArray(parsed.packs)) {
801
+ throw new Error(`damage-control rules at ${yamlPath}: expected array at 'packs'`);
802
+ }
803
+ const out = {
804
+ base: emptyRuleset(2)
805
+ };
806
+ for (const rawPack of parsed.packs) {
807
+ const packId = rawPack.id;
808
+ if (packId !== "base") {
809
+ throw new Error(`damage-control rules at ${yamlPath}: unknown pack id ${String(packId)}`);
810
+ }
811
+ const rules = compilePackRules(rawPack.rules, packId);
812
+ out[packId] = { version: 2, rules };
813
+ }
814
+ return out;
815
+ }
816
+ function loadDefaultRulePacks() {
817
+ return loadRulePacks(join(resolvePackageRoot(), "damage-control-rules.yaml"));
818
+ }
819
+ var cachedPacks = null;
820
+ function getCachedDefaultRulePacks() {
821
+ if (cachedPacks === null) cachedPacks = loadDefaultRulePacks();
822
+ return cachedPacks;
823
+ }
824
+
825
+ // src/domains/safety/skill-authority.ts
826
+ init_esm_shims();
827
+ import { homedir as homedir3 } from "node:os";
828
+ import path4 from "node:path";
829
+ function activeClioSkillRoots(cwd) {
830
+ return ["skills", "plugins", "extensions"].flatMap((kind) => [
831
+ path4.join(cwd, ".clio-coder", kind),
832
+ path4.join(clioConfigDir(), kind)
833
+ ]);
834
+ }
835
+ function mutationCandidates(targets, cwd, command, memo) {
836
+ const workingDirs = [cwd];
837
+ if (command !== null) {
838
+ let logical = cwd;
839
+ let physical = cwd;
840
+ for (const destination of extractCommandCdTargets(command)) {
841
+ const next = expandHome(destination);
842
+ logical = path4.resolve(logical, next);
843
+ physical = canonicalizeRawPath(next, physical, memo) ?? path4.resolve(physical, next);
844
+ workingDirs.push(logical);
845
+ if (physical !== logical) workingDirs.push(physical);
846
+ }
847
+ }
848
+ const candidates = [];
849
+ for (const target of targets) {
850
+ if (target.operation === "read") continue;
851
+ for (const directory of workingDirs) {
852
+ const raw = expandHome(target.path);
853
+ const lexical = path4.resolve(directory, raw);
854
+ const resolved = canonicalizeRawPath(raw, directory, memo) ?? canonicalizeExistingPath(lexical, memo);
855
+ candidates.push({ operation: target.operation, lexical, resolved });
856
+ }
857
+ }
858
+ return candidates;
859
+ }
860
+ function skillMutationReason(roots, candidates, memo) {
861
+ const boundaries = [];
862
+ for (const candidate of candidates) {
863
+ for (const [index, root] of roots.entries()) {
864
+ boundaries[index] ??= [root, canonicalizeExistingPath(root, memo)];
865
+ for (const boundary of boundaries[index]) {
866
+ for (const location of [candidate.lexical, candidate.resolved]) {
867
+ if (isSameOrDescendant(location, boundary) || candidate.operation === "delete" && isSameOrDescendant(boundary, location)) {
868
+ return `active resource tree ${root} is operator-owned; draft changes outside installed resource roots and use the operator install or update interface`;
869
+ }
870
+ }
871
+ }
872
+ }
873
+ }
874
+ return null;
875
+ }
876
+ function expandHome(value) {
877
+ return value === "~" ? homedir3() : value.startsWith("~/") ? path4.join(homedir3(), value.slice(2)) : value;
878
+ }
879
+
880
+ // src/domains/safety/workspace-trust.ts
881
+ init_esm_shims();
882
+ function gateProjectSafetyPolicy(workspaceRoot, policy) {
883
+ if (policy.path === null) return policy;
884
+ const trustVerdict = policy.hash === null ? "untrusted" : projectSurfaceTrust(workspaceRoot, "safety", safetySurfaceTrustHash(policy.path, policy.hash));
885
+ if (trustVerdict === "trusted") return { ...policy, trustVerdict };
886
+ return {
887
+ ...policy,
888
+ trustVerdict,
889
+ // This is the admitted empty policy, whose execution defaults are valid.
890
+ // Unapproved parse failures retain diagnostics below but cannot acquire the
891
+ // authority to block execution. An approved malformed policy stays invalid.
892
+ valid: true,
893
+ commands: [],
894
+ pathPolicy: {},
895
+ disableDefaultPathPolicy: false,
896
+ errors: [
897
+ ...policy.errors,
898
+ `${policy.path} is ${trustVerdict}; project safety ignored. Review with clio-coder config trust safety.`
899
+ ]
900
+ };
901
+ }
902
+
903
+ // src/domains/safety/policy-engine.ts
904
+ var BUILTIN_ALLOWLIST = [
905
+ { id: "builtin:pwd", re: /^pwd$/ },
906
+ { id: "builtin:ls", re: /^ls(?:\s+(-[A-Za-z0-9]+|\.[/\w.-]*|[/\w.-]+))*$/ },
907
+ { id: "builtin:git-status", re: /^git\s+status(?:\s+--short|\s+--branch|\s+-sb)*$/ },
908
+ { id: "builtin:git-diff", re: /^git\s+diff(?:\s+--cached|\s+--stat|\s+--name-only|\s+--\s+[\w./-]+)*$/ },
909
+ { id: "builtin:git-log", re: /^git\s+log\s+--oneline(?:\s+-n\s+[1-9]\d{0,2})?(?:\s+--\s+[\w./-]+)?$/ }
910
+ ];
911
+ var TEST_RUNNER_COMMANDS = [
912
+ { id: "builtin:npm-test", re: /^npm\s+(?:test|run\s+test)(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
913
+ { id: "builtin:node-test", re: /^node\s+--test(?:\s+[\w=./:-]+)*$/ },
914
+ { id: "builtin:pytest", re: /^pytest(?:\s+[\w=./:-]+)*$/ },
915
+ { id: "builtin:python-pytest", re: /^python(?:3(?:\.\d+)?)?\s+-m\s+pytest(?:\s+[\w=./:-]+)*$/ },
916
+ { id: "builtin:python-unittest", re: /^python(?:3(?:\.\d+)?)?\s+-m\s+unittest(?:\s+[\w=./:-]+)*$/ },
917
+ { id: "builtin:cargo-test", re: /^cargo\s+test(?:\s+[\w=./:-]+)*$/ },
918
+ { id: "builtin:go-test", re: /^go\s+test(?:\s+[\w=./:-]+)*$/ },
919
+ { id: "builtin:ctest", re: /^ctest(?:\s+[\w=./:-]+)*$/ },
920
+ { id: "builtin:make-test", re: /^make\s+test(?:\s+[\w=./:-]+)*$/ },
921
+ { id: "builtin:make-check", re: /^make\s+check(?:\s+[\w=./:-]+)*$/ },
922
+ { id: "builtin:ninja-test", re: /^ninja\s+test(?:\s+[\w=./:-]+)*$/ },
923
+ { id: "builtin:meson-test", re: /^meson\s+test(?:\s+[\w=./:-]+)*$/ },
924
+ { id: "builtin:mvn-test", re: /^mvn\s+test(?:\s+[\w=./:-]+)*$/ },
925
+ { id: "builtin:gradle-test", re: /^(?:gradle|(?:\.\/)?gradlew)\s+test(?:\s+[\w=./:-]+)*$/ }
926
+ ];
927
+ var PROJECT_SCRIPT_COMMANDS = [
928
+ { id: "builtin:npm-lint", re: /^npm\s+run\s+lint(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
929
+ { id: "builtin:npm-build", re: /^npm\s+run\s+build(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
930
+ { id: "builtin:npm-typecheck", re: /^npm\s+run\s+typecheck(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
931
+ { id: "builtin:npm-ci-script", re: /^npm\s+run\s+ci(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ }
932
+ ];
933
+ function matchesRepositoryCommand(command) {
934
+ return [...TEST_RUNNER_COMMANDS, ...PROJECT_SCRIPT_COMMANDS].some((entry) => entry.re.test(command));
935
+ }
936
+ var BASH_RECOGNIZED_FORM_HINT = "Recognized forms run without asking: one command per bash call, or a && chain whose every step is recognized, with cwd passed as the cwd argument instead of a leading cd.";
937
+ var EXECUTION_TOOLS = /* @__PURE__ */ new Set([ToolNames.Bash, ToolNames.Verify]);
938
+ var WRITE_ROOT_REFUSED_TOOLS = /* @__PURE__ */ new Set([
939
+ ToolNames.Bash,
940
+ ToolNames.Verify,
941
+ ToolNames.RunScript,
942
+ ToolNames.Dispatch
943
+ ]);
944
+ var WRITE_ROOT_TOOLS = /* @__PURE__ */ new Set([ToolNames.Write, ToolNames.Edit, ToolNames.Artifact]);
945
+ function writeRootTargetPath(call) {
946
+ if (!WRITE_ROOT_TOOLS.has(call.tool)) return null;
947
+ const target = pathArg(call.args);
948
+ if (target !== null) return target;
949
+ if (call.tool === ToolNames.Artifact) return artifactDefaultPath(call.args?.kind);
950
+ return null;
951
+ }
952
+ function isWriteConfinementEscape(call, actionClass) {
953
+ if (WRITE_ROOT_REFUSED_TOOLS.has(call.tool)) return true;
954
+ return actionClass === "execute" || actionClass === "dispatch";
955
+ }
956
+ function evaluateWriteRoots(roots, writeRootCwd, call) {
957
+ if (roots.length === 0) return null;
958
+ const target = writeRootTargetPath(call);
959
+ if (target === null) return null;
960
+ const resolved = path5.resolve(writeRootCwd, target);
961
+ if (pathBoundaryCovers(roots, resolved)) return null;
962
+ return `write target '${target}' resolves to '${resolved}', which is outside the permitted write roots for this run: ${roots.join(", ")}`;
963
+ }
964
+ function createSafetyPolicyEngine(options = {}) {
965
+ const cwd = canonicalizeExistingPath(path5.resolve(options.cwd ?? process.cwd()));
966
+ const writeRootCwd = path5.resolve(options.cwd ?? process.cwd());
967
+ const writeRoots = (options.writeRoots ?? []).map((root) => resolvePathBoundary(writeRootCwd, root));
968
+ const skillRoots = activeClioSkillRoots(cwd);
969
+ const readExemptRoots = readScopeExemptRoots();
970
+ const packs = options.rulePacks ?? getCachedDefaultRulePacks();
971
+ const projectPolicy = options.projectPolicy ?? gateProjectSafetyPolicy(cwd, loadProjectSafetyPolicy(cwd));
972
+ const projectPolicyRoot = projectPolicy.path === null ? cwd : path5.dirname(path5.dirname(path5.resolve(projectPolicy.path)));
973
+ const pathPolicyInput = projectPolicy.disableDefaultPathPolicy ? projectPolicy.pathPolicy : mergePathPolicyInputs(DEFAULT_DAMAGE_CONTROL_PATH_POLICY, projectPolicy.pathPolicy);
974
+ const expandedDefaults = mergePathPolicyInputs(mergePathPolicyInputs(pathPolicyInput, OPERATOR_PATH_POLICY), {
975
+ zeroAccessPaths: clioCredentialStorePaths(),
976
+ readOnlyPaths: [...clioSkillsRootPaths(), path5.join(clioConfigDir(), "settings.yaml"), workspaceTrustDirectory()]
977
+ });
978
+ const pathPolicy = compilePathPolicy(expandedDefaults, projectPolicyRoot);
979
+ const zeroAccessPolicy = {
980
+ root: pathPolicy.root,
981
+ entries: pathPolicy.entries.filter((entry) => entry.kind === "zeroAccessPaths"),
982
+ diagnostics: []
983
+ };
984
+ const sourcedRules = packs.base.rules.map((rule) => ({ rule, source: "damage-control:base" }));
985
+ return {
986
+ evaluate(rawCall, posture) {
987
+ const call = normalizeCallPaths(rawCall);
988
+ const rawClassification = classify(call);
989
+ const command = commandArg(call.args);
990
+ const callCwd = cwdArg(call.args, cwd);
991
+ const catalogCheck = resolveVerifyCatalogCheck(call, cwd);
992
+ const catalogCommand = catalogCheck === null ? null : catalogCheck.command.join(" ");
993
+ const scan = catalogCommand ?? damageControlScan(call);
994
+ const hit = scan ? matchSourcedRule(scan, sourcedRules) : null;
995
+ const classification = effectiveClassification(rawClassification, hit?.match);
996
+ const base = baseDecision(call, classification, callCwd, posture, command);
997
+ const writeRootReason = evaluateWriteRoots(writeRoots, writeRootCwd, call);
998
+ if (writeRootReason !== null) {
999
+ return blockDecision(base, {
1000
+ ruleId: "write-root",
1001
+ reasonCode: "write-root",
1002
+ reasons: [writeRootReason],
1003
+ policySource: "builtin-classifier"
1004
+ });
1005
+ }
1006
+ if (writeRoots.length > 0 && isWriteConfinementEscape(call, classification.actionClass)) {
1007
+ return blockDecision(base, {
1008
+ ruleId: "write-root",
1009
+ reasonCode: "write-root",
1010
+ reasons: [
1011
+ `tool '${call.tool}' (${classification.actionClass}) can mutate the filesystem outside the permitted write roots and is blocked under write-root confinement`
1012
+ ],
1013
+ policySource: "builtin-classifier"
1014
+ });
1015
+ }
1016
+ const askRule = hit?.match.ask === true && hit.match.block !== true;
1017
+ if (!askRule && (classification.actionClass === "git_destructive" || hit?.match.actionClass === "git_destructive" || hit?.match.block === true)) {
1018
+ const blockInput = {
1019
+ reasonCode: hit ? `damage-control:${hit.match.ruleId}` : "classification:git_destructive",
1020
+ reasons: [...classification.reasons, ...hit ? [hit.match.reason] : []],
1021
+ policySource: hit?.source ?? "damage-control:base"
1022
+ };
1023
+ if (hit?.match.ruleId !== void 0) blockInput.ruleId = hit.match.ruleId;
1024
+ if (hit?.match !== void 0) blockInput.match = hit.match;
1025
+ return blockDecision(base, blockInput);
1026
+ }
1027
+ if (!projectPolicy.valid && EXECUTION_TOOLS.has(call.tool)) {
1028
+ const blockInput = {
1029
+ ruleId: "project-policy-invalid",
1030
+ reasonCode: "project-policy-invalid",
1031
+ reasons: [`project safety policy is invalid and execution fails closed: ${projectPolicy.errors.join("; ")}`],
1032
+ policySource: "project-policy-invalid"
1033
+ };
1034
+ if (projectPolicy.hash !== null) blockInput.policyHash = projectPolicy.hash;
1035
+ if (projectPolicy.path !== null) blockInput.projectPolicyPath = projectPolicy.path;
1036
+ return blockDecision(base, blockInput);
1037
+ }
1038
+ const mutationCommand = call.tool === ToolNames.Bash ? command : catalogCommand;
1039
+ if (mutationCommand !== null && invokesTrustMutation(mutationCommand)) {
1040
+ return blockDecision(base, {
1041
+ reasonCode: "trust-authority",
1042
+ ruleId: "trust-authority",
1043
+ reasons: ["workspace trust grants require the operator CLI"],
1044
+ policySource: "builtin-classifier"
1045
+ });
1046
+ }
1047
+ const walkMemo = createPathWalkMemo();
1048
+ const candidates = mutationCandidates(
1049
+ pathPolicyTargets(
1050
+ catalogCommand === null ? call : { tool: ToolNames.Bash, args: { command: catalogCommand } },
1051
+ callCwd
1052
+ ),
1053
+ callCwd,
1054
+ mutationCommand,
1055
+ walkMemo
1056
+ );
1057
+ if (skillMutationReason(
1058
+ [path5.join(clioConfigDir(), "settings.yaml"), workspaceTrustDirectory()],
1059
+ candidates,
1060
+ walkMemo
1061
+ ) !== null) {
1062
+ return blockDecision(base, {
1063
+ reasonCode: "path-policy:readOnlyPaths",
1064
+ ruleId: "path-policy:readOnlyPaths",
1065
+ reasons: ["Clio settings and workspace trust records are operator-owned and cannot be mutated by tools"],
1066
+ policySource: "builtin-classifier"
1067
+ });
1068
+ }
1069
+ const skillReason = mutationCommand !== null && invokesClioSkillMutation(mutationCommand, true) ? "resource installation and lifecycle changes require the operator CLI or an explicit operator install choice; draft outside installed resource roots" : skillMutationReason(skillRoots, candidates, walkMemo);
1070
+ if (skillReason !== null) {
1071
+ return blockDecision(base, {
1072
+ ruleId: "skill-authority",
1073
+ reasonCode: "skill-authority",
1074
+ reasons: [skillReason],
1075
+ policySource: "builtin-classifier"
1076
+ });
1077
+ }
1078
+ const pathBlock = evaluateProjectPathPolicy(pathPolicy, call, callCwd, walkMemo);
1079
+ if (pathBlock !== null) {
1080
+ const blockInput = {
1081
+ ruleId: pathBlock.reasonCode,
1082
+ reasonCode: pathBlock.reasonCode,
1083
+ reasons: [pathBlock.reason],
1084
+ policySource: "project-policy"
1085
+ };
1086
+ if (projectPolicy.hash !== null) blockInput.policyHash = projectPolicy.hash;
1087
+ if (projectPolicy.path !== null) blockInput.projectPolicyPath = projectPolicy.path;
1088
+ return blockDecision(base, blockInput);
1089
+ }
1090
+ const scannedCommand = call.tool === ToolNames.Bash ? command : catalogCommand;
1091
+ if (scannedCommand !== null) {
1092
+ const secretRead = evaluateBashZeroAccessRead(zeroAccessPolicy, scannedCommand, callCwd);
1093
+ if (secretRead !== null) {
1094
+ const blockInput = {
1095
+ ruleId: "secret_path_bash",
1096
+ reasonCode: "secret_path_bash",
1097
+ reasons: [
1098
+ `bash read of zero-access path blocked: '${secretRead.token}' matches ${secretRead.entrySource}. Check presence with exit codes only (grep -sq "^NAME=" <file>); have the user supply values through their own terminal (read -s), never through chat or command output.`
1099
+ ],
1100
+ policySource: "project-policy"
1101
+ };
1102
+ if (projectPolicy.hash !== null) blockInput.policyHash = projectPolicy.hash;
1103
+ if (projectPolicy.path !== null) blockInput.projectPolicyPath = projectPolicy.path;
1104
+ return blockDecision(base, blockInput);
1105
+ }
1106
+ }
1107
+ if (mutationCommand !== null && invokesClioSkillMutation(mutationCommand)) {
1108
+ const input = {
1109
+ ruleId: "library-confirm",
1110
+ reasonCode: "library-confirm",
1111
+ reasons: ["Library changes require one-shot operator confirmation"],
1112
+ policySource: "builtin-classifier"
1113
+ };
1114
+ return posture === "confirmed" ? allowDecision(base, input) : askDecision(base, input);
1115
+ }
1116
+ if (askRule && hit !== null && posture !== "confirmed") {
1117
+ return askDecision(base, {
1118
+ ruleId: hit.match.ruleId,
1119
+ reasonCode: `damage-control:${hit.match.ruleId}`,
1120
+ reasons: [...classification.reasons, hit.match.reason, "damage-control rule requires confirmation"],
1121
+ policySource: hit.source,
1122
+ match: hit.match
1123
+ });
1124
+ }
1125
+ if (askRule && hit !== null && posture === "confirmed") {
1126
+ return allowDecision(base, {
1127
+ ruleId: hit.match.ruleId,
1128
+ reasonCode: `damage-control:${hit.match.ruleId}`,
1129
+ reasons: [...classification.reasons, hit.match.reason, "damage-control rule confirmed by operator"],
1130
+ policySource: hit.source,
1131
+ match: hit.match
1132
+ });
1133
+ }
1134
+ if (classification.actionClass === "system_modify") {
1135
+ const input = {
1136
+ ruleId: "system-modify-confirm",
1137
+ reasonCode: "system-modify-confirm",
1138
+ reasons: [...classification.reasons, "system-level changes require one-shot confirmation at every autonomy level"],
1139
+ policySource: "builtin-classifier"
1140
+ };
1141
+ return posture === "confirmed" ? allowDecision(base, input) : askDecision(base, input);
1142
+ }
1143
+ const packageCommand = call.tool === ToolNames.Verify && catalogCheck === null && typeof call.args?.check === "string" && call.args.check !== "frontend" ? `npm run ${call.args.check}` : null;
1144
+ if ((call.tool === ToolNames.Bash || catalogCheck !== null || packageCommand !== null) && classification.actionClass === "execute") {
1145
+ const bash = evaluateBashPolicy(
1146
+ catalogCheck?.command ?? packageCommand ?? command ?? "",
1147
+ catalogCheck === null ? callCwd : path5.resolve(cwd, catalogCheck.cwd),
1148
+ cwd,
1149
+ posture,
1150
+ projectPolicy
1151
+ );
1152
+ if ((catalogCheck !== null || packageCommand !== null) && bash.kind === "allow" && bash.execRecognition !== "recognized" && posture !== "confirmed") {
1153
+ return askDecision(base, {
1154
+ ...bash,
1155
+ reasonCode: "project-verifier-confirm",
1156
+ reasons: [
1157
+ ...bash.reasons,
1158
+ `Repository verifier requires confirmation or an approved safety declaration: ${catalogCommand ?? packageCommand}`
1159
+ ]
1160
+ });
1161
+ }
1162
+ if (bash.kind === "block") return blockDecision(base, bash);
1163
+ if (bash.kind === "ask") return askDecision(base, bash);
1164
+ return allowDecision(base, bash);
1165
+ }
1166
+ const allowInput = {
1167
+ reasonCode: "allowed",
1168
+ reasons: classification.reasons,
1169
+ policySource: hit?.source ?? "none"
1170
+ };
1171
+ if (hit?.match.ruleId !== void 0) allowInput.ruleId = hit.match.ruleId;
1172
+ if (hit?.match !== void 0) allowInput.match = hit.match;
1173
+ if (classification.actionClass === "execute") allowInput.execRecognition = "recognized";
1174
+ if (isReadScopeTool(call.tool) && posture !== "confirmed") {
1175
+ const escaped = readScopeEscape(pathArg(call.args) ?? ".", callCwd, cwd, readExemptRoots, walkMemo);
1176
+ if (escaped !== null) {
1177
+ allowInput.readScope = "outside-workspace";
1178
+ allowInput.reasons = [...allowInput.reasons, `read-path-outside-workspace: ${escaped}`];
1179
+ }
1180
+ }
1181
+ return allowDecision(base, allowInput);
1182
+ },
1183
+ readablePath(target) {
1184
+ return evaluatePathPolicy(zeroAccessPolicy, "read", target, cwd).kind === "allow";
1185
+ },
1186
+ metadata() {
1187
+ return {
1188
+ version: 1,
1189
+ rulePackHash: rulePackHash(packs),
1190
+ rulePackVersion: packs.base.version,
1191
+ activeRuleIds: sourcedRules.map((entry) => entry.rule.id),
1192
+ projectPolicyPath: projectPolicy.path,
1193
+ projectPolicyHash: projectPolicy.hash,
1194
+ projectPolicyValid: projectPolicy.valid,
1195
+ projectPolicyErrors: [...projectPolicy.errors, ...pathPolicy.diagnostics],
1196
+ disableDefaultPathPolicy: projectPolicy.disableDefaultPathPolicy,
1197
+ workspaceTrustVerdict: projectPolicy.trustVerdict ?? "trusted",
1198
+ cwd
1199
+ };
1200
+ }
1201
+ };
1202
+ }
1203
+ function clioCredentialStorePaths() {
1204
+ try {
1205
+ return [path5.join(clioConfigDir(), "credentials.yaml")];
1206
+ } catch {
1207
+ return [];
1208
+ }
1209
+ }
1210
+ function clioSkillsRootPaths() {
1211
+ try {
1212
+ return [path5.join(clioConfigDir(), "skills")];
1213
+ } catch {
1214
+ return [];
1215
+ }
1216
+ }
1217
+ var SAFE_PRESENCE_RE = /^\s*grep\s+(?:-(?:q|sq|qs)\s+)('[^']*'|"[^"]*"|\S+)\s+\S+\s*$/;
1218
+ function isSafePresenceCheck(command) {
1219
+ const match = SAFE_PRESENCE_RE.exec(command);
1220
+ if (!match || match[1] === void 0) return false;
1221
+ const pattern = stripQuotes(match[1]);
1222
+ return /^\^[A-Za-z_][A-Za-z0-9_]*=/.test(pattern);
1223
+ }
1224
+ function stripQuotes(token) {
1225
+ if (token.length >= 2) {
1226
+ const first = token[0];
1227
+ const last = token[token.length - 1];
1228
+ if (first === '"' && last === '"' || first === "'" && last === "'") return token.slice(1, -1);
1229
+ }
1230
+ return token;
1231
+ }
1232
+ function bashPathTokenCandidates(command) {
1233
+ const candidates = [];
1234
+ for (const scanned of scanShellLikeDeep(command)) {
1235
+ if (scanned.operator) continue;
1236
+ const token = scanned.value;
1237
+ if (token.length === 0) continue;
1238
+ if (/\s/.test(token)) continue;
1239
+ if (token.startsWith("-") && !token.includes("/") && !token.includes("=")) continue;
1240
+ candidates.push(token);
1241
+ const eq = token.indexOf("=");
1242
+ if (eq > 0 && eq < token.length - 1) candidates.push(token.slice(eq + 1));
1243
+ }
1244
+ return candidates;
1245
+ }
1246
+ function evaluateBashZeroAccessRead(zeroAccessPolicy, command, callCwd) {
1247
+ if (zeroAccessPolicy.entries.length === 0) return null;
1248
+ if (isSafePresenceCheck(command)) return null;
1249
+ for (const token of bashPathTokenCandidates(command)) {
1250
+ const decision = evaluatePathPolicy(zeroAccessPolicy, "read", token, callCwd);
1251
+ if (decision.kind === "block") {
1252
+ return { token, entrySource: `zeroAccessPaths entry ${decision.matchedPath}` };
1253
+ }
1254
+ }
1255
+ return null;
1256
+ }
1257
+ function evaluateProjectPathPolicy(policy, call, callCwd, memo) {
1258
+ if (policy.entries.length === 0) return null;
1259
+ for (const target of pathPolicyTargets(call, callCwd)) {
1260
+ const decision = evaluatePathPolicy(policy, target.operation, target.path, callCwd, memo);
1261
+ if (decision.kind === "block") return decision;
1262
+ }
1263
+ return null;
1264
+ }
1265
+ function pathPolicyTargets(call, callCwd) {
1266
+ const args = call.args;
1267
+ switch (call.tool) {
1268
+ case ToolNames.Read:
1269
+ case ToolNames.Ls:
1270
+ case ToolNames.Grep:
1271
+ case ToolNames.Find: {
1272
+ const target = pathArg(args) ?? ".";
1273
+ return readScopeSpellings(target, callCwd).map((spelling) => ({ operation: "read", path: spelling }));
1274
+ }
1275
+ case ToolNames.Data: {
1276
+ const target = pathArg(args);
1277
+ return target === null ? [] : [{ operation: "read", path: target }];
1278
+ }
1279
+ case ToolNames.Write:
1280
+ case ToolNames.Edit: {
1281
+ const target = pathArg(args);
1282
+ return target === null ? [] : [{ operation: "write", path: target }];
1283
+ }
1284
+ case ToolNames.Artifact:
1285
+ return [{ operation: "write", path: pathArg(args) ?? artifactDefaultPath(args?.kind) }];
1286
+ case ToolNames.CredentialPresent:
1287
+ return [];
1288
+ case ToolNames.Bash: {
1289
+ const command = commandArg(args);
1290
+ if (command === null) return [];
1291
+ return [
1292
+ ...extractCommandWriteTargets(command).map((target) => ({ operation: "write", path: target })),
1293
+ ...extractCommandDeleteTargets(command).map((target) => ({ operation: "delete", path: target }))
1294
+ ];
1295
+ }
1296
+ default:
1297
+ return [];
1298
+ }
1299
+ }
1300
+ function evaluateBashPolicy(input, callCwd, workspaceRoot, posture, policy) {
1301
+ if (typeof input !== "string" && !input.every((arg) => /^[\w=./:-]+$/u.test(arg))) {
1302
+ return {
1303
+ kind: posture === "confirmed" ? "allow" : "ask",
1304
+ ruleId: "verify-unrecognized-argv",
1305
+ reasonCode: "verify-unrecognized-argv",
1306
+ reasons: ["project verifier argv is outside the bare-word no-prompt command set"],
1307
+ policySource: "builtin-command-allowlist",
1308
+ execRecognition: "unrecognized"
1309
+ };
1310
+ }
1311
+ const command = typeof input === "string" ? input : input.join(" ");
1312
+ if (command.trim().length === 0) {
1313
+ return {
1314
+ kind: "block",
1315
+ ruleId: "bash-empty-command",
1316
+ reasonCode: "bash-empty-command",
1317
+ reasons: ["bash command must not be empty"],
1318
+ policySource: "builtin-command-allowlist"
1319
+ };
1320
+ }
1321
+ if (typeof input === "string" && (/\$(?:[A-Za-z_{0-9@*#?!-])/.test(command) || /(?:^|[\s;&|])(?:python[\d.]*|node|ruby|perl|php|lua)\s+(?:[^\n]*?\s)?-[ce]\b/.test(command)) && posture !== "confirmed") {
1322
+ return {
1323
+ kind: "ask",
1324
+ reasonCode: "bash-hidden-content",
1325
+ ruleId: "bash-hidden-content",
1326
+ reasons: ["shell variables or interpreter source hide paths from the safety scan and require one-shot confirmation"],
1327
+ policySource: "builtin-command-allowlist",
1328
+ execRecognition: "unrecognized"
1329
+ };
1330
+ }
1331
+ const projectMatch = matchingProjectCommand(policy, command, callCwd);
1332
+ if (projectMatch) {
1333
+ const base = {
1334
+ ruleId: projectMatch.id,
1335
+ reasonCode: `project-policy:${projectMatch.id}`,
1336
+ reasons: [`allowed by project safety policy command '${projectMatch.id}'`],
1337
+ policySource: "project-policy",
1338
+ execRecognition: "recognized"
1339
+ };
1340
+ if (policy.hash !== null) base.policyHash = policy.hash;
1341
+ if (policy.path !== null) base.projectPolicyPath = policy.path;
1342
+ if (projectMatch.requireConfirmation && posture !== "confirmed") {
1343
+ return {
1344
+ ...base,
1345
+ kind: "ask",
1346
+ reasons: [...base.reasons, "project policy requires confirmation"]
1347
+ };
1348
+ }
1349
+ return { ...base, kind: "allow" };
1350
+ }
1351
+ if (!isUnderOrSame(callCwd, workspaceRoot)) {
1352
+ return {
1353
+ kind: "block",
1354
+ ruleId: "bash-cwd-escape",
1355
+ reasonCode: "bash-cwd-escape",
1356
+ reasons: [
1357
+ `bash cwd '${callCwd}' escapes workspace root '${workspaceRoot}'; use a typed tool or a project policy entry with explicit cwd`
1358
+ ],
1359
+ policySource: "builtin-command-allowlist"
1360
+ };
1361
+ }
1362
+ const recognitionCommand = inlineShellScript(command) ?? command;
1363
+ if (hasCommandSubstitution(recognitionCommand) && posture !== "confirmed") {
1364
+ return {
1365
+ kind: "ask",
1366
+ ruleId: "bash-command-substitution",
1367
+ reasonCode: "bash-command-substitution",
1368
+ reasons: ["command substitution hides the executed content from the safety net and requires one-shot confirmation"],
1369
+ policySource: "builtin-command-allowlist",
1370
+ execRecognition: "unrecognized"
1371
+ };
1372
+ }
1373
+ const testRunner = TEST_RUNNER_COMMANDS.find((entry) => entry.re.test(recognitionCommand));
1374
+ if (testRunner !== void 0) {
1375
+ return {
1376
+ kind: "allow",
1377
+ ruleId: testRunner.id,
1378
+ reasonCode: testRunner.id,
1379
+ reasons: [`matched built-in test runner '${testRunner.id}'`, projectScriptPreview(recognitionCommand, callCwd)],
1380
+ policySource: "builtin-command-allowlist",
1381
+ execRecognition: "recognized"
1382
+ };
1383
+ }
1384
+ if (PROJECT_SCRIPT_COMMANDS.some((entry) => entry.re.test(recognitionCommand))) {
1385
+ return {
1386
+ kind: posture === "confirmed" ? "allow" : "ask",
1387
+ reasonCode: "project-script-confirm",
1388
+ ruleId: "project-script-confirm",
1389
+ reasons: [
1390
+ "Repository-authored code requires one-shot confirmation or an operator-approved safety command declaration.",
1391
+ projectScriptPreview(recognitionCommand, callCwd)
1392
+ ],
1393
+ policySource: "builtin-command-allowlist",
1394
+ execRecognition: "unrecognized"
1395
+ };
1396
+ }
1397
+ const chain = recognizeCommandChain(recognitionCommand, callCwd, workspaceRoot, policy);
1398
+ if (chain !== null) {
1399
+ const chainReasons = [
1400
+ `every step of the && chain is recognized: ${chain.ruleIds.join(", ")}`,
1401
+ ...chain.requiresConfirmation ? chain.scriptPreviews : []
1402
+ ];
1403
+ if (chain.requiresConfirmation && posture !== "confirmed") {
1404
+ return {
1405
+ kind: "ask",
1406
+ ruleId: "bash-recognized-chain",
1407
+ reasonCode: "bash-recognized-chain",
1408
+ reasons: [...chainReasons, "repository code or project policy requires confirmation for one step"],
1409
+ policySource: "builtin-command-allowlist",
1410
+ execRecognition: "recognized"
1411
+ };
1412
+ }
1413
+ return {
1414
+ kind: "allow",
1415
+ ruleId: "bash-recognized-chain",
1416
+ reasonCode: "bash-recognized-chain",
1417
+ reasons: chainReasons,
1418
+ policySource: "builtin-command-allowlist",
1419
+ execRecognition: "recognized"
1420
+ };
1421
+ }
1422
+ if (hasSequencingOperators(command)) {
1423
+ const scriptSegments = commandArgumentSegments(recognitionCommand).map((args) => args.join(" ")).filter((part) => matchesRepositoryCommand(part));
1424
+ if (scriptSegments.length > 0 && posture !== "confirmed") {
1425
+ return {
1426
+ kind: "ask",
1427
+ ruleId: "project-script-confirm",
1428
+ reasonCode: "project-script-confirm",
1429
+ reasons: [
1430
+ "Repository scripts in compound commands require one-shot confirmation",
1431
+ ...scriptSegments.map((part) => projectScriptPreview(part, callCwd))
1432
+ ],
1433
+ policySource: "builtin-command-allowlist",
1434
+ execRecognition: "unrecognized"
1435
+ };
1436
+ }
1437
+ return {
1438
+ kind: "allow",
1439
+ ruleId: "bash-shell-operators",
1440
+ reasonCode: "bash-shell-operators",
1441
+ reasons: [
1442
+ "shell operators defeat per-command recognition; the autonomy level decides admission",
1443
+ BASH_RECOGNIZED_FORM_HINT
1444
+ ],
1445
+ policySource: "builtin-command-allowlist",
1446
+ execRecognition: "unrecognized"
1447
+ };
1448
+ }
1449
+ for (const entry of BUILTIN_ALLOWLIST) {
1450
+ if (entry.re.test(recognitionCommand)) {
1451
+ return {
1452
+ kind: "allow",
1453
+ ruleId: entry.id,
1454
+ reasonCode: entry.id,
1455
+ reasons: [`matched built-in no-prompt command allowlist '${entry.id}'`],
1456
+ policySource: "builtin-command-allowlist",
1457
+ execRecognition: "recognized"
1458
+ };
1459
+ }
1460
+ }
1461
+ return {
1462
+ kind: "allow",
1463
+ ruleId: "bash-unrecognized",
1464
+ reasonCode: "bash-unrecognized",
1465
+ reasons: [
1466
+ "bash command is outside the no-prompt set; the autonomy level decides admission",
1467
+ BASH_RECOGNIZED_FORM_HINT
1468
+ ],
1469
+ policySource: "builtin-command-allowlist",
1470
+ execRecognition: "unrecognized"
1471
+ };
1472
+ }
1473
+ function baseDecision(call, classification, cwd, posture, command) {
1474
+ const out = {
1475
+ classification,
1476
+ tool: call.tool,
1477
+ actionClass: classification.actionClass,
1478
+ cwd
1479
+ };
1480
+ if (posture !== void 0) out.posture = posture;
1481
+ if (command !== null) out.command = command;
1482
+ return out;
1483
+ }
1484
+ function allowDecision(base, input) {
1485
+ return { ...base, ...input, kind: "allow" };
1486
+ }
1487
+ function askDecision(base, input) {
1488
+ const rejectionInput = {
1489
+ tool: base.tool,
1490
+ actionClass: base.classification.actionClass,
1491
+ reasons: input.reasons
1492
+ };
1493
+ if (base.posture !== void 0) rejectionInput.posture = base.posture;
1494
+ if (input.ruleId !== void 0) rejectionInput.ruleId = input.ruleId;
1495
+ const rejection = formatRejection(rejectionInput);
1496
+ return { ...base, ...input, kind: "ask", rejection };
1497
+ }
1498
+ function blockDecision(base, input) {
1499
+ const rejectionInput = {
1500
+ tool: base.tool,
1501
+ actionClass: base.classification.actionClass,
1502
+ reasons: input.reasons
1503
+ };
1504
+ if (base.posture !== void 0) rejectionInput.posture = base.posture;
1505
+ if (input.ruleId !== void 0) rejectionInput.ruleId = input.ruleId;
1506
+ const rejection = formatRejection(rejectionInput);
1507
+ return { ...base, ...input, kind: "block", rejection };
1508
+ }
1509
+ function matchSourcedRule(commandString, rules) {
1510
+ for (const entry of rules) {
1511
+ if (entry.rule.pattern.test(commandString)) {
1512
+ const match = {
1513
+ ruleId: entry.rule.id,
1514
+ reason: `matched ${entry.rule.id}: ${entry.rule.description}`,
1515
+ actionClass: entry.rule.class,
1516
+ block: entry.rule.block
1517
+ };
1518
+ if (entry.rule.ask !== void 0) match.ask = entry.rule.ask;
1519
+ return { match, source: entry.source };
1520
+ }
1521
+ }
1522
+ return null;
1523
+ }
1524
+ var ACTION_CLASSES2 = /* @__PURE__ */ new Set([
1525
+ "read",
1526
+ "write",
1527
+ "execute",
1528
+ "system_modify",
1529
+ "git_destructive",
1530
+ "dispatch"
1531
+ ]);
1532
+ function effectiveClassification(classification, match) {
1533
+ if (!match || !ACTION_CLASSES2.has(match.actionClass)) return classification;
1534
+ const actionClass = match.actionClass;
1535
+ if (actionClass === classification.actionClass) return classification;
1536
+ return {
1537
+ actionClass,
1538
+ reasons: [...classification.reasons, `damage-control:${match.ruleId}`]
1539
+ };
1540
+ }
1541
+ function matchingProjectCommand(policy, command, cwd) {
1542
+ if (!policy.valid || policy.path === null) return null;
1543
+ const policyRoot = path5.dirname(path5.dirname(policy.path));
1544
+ for (const entry of policy.commands) {
1545
+ if (entry.command !== command) continue;
1546
+ if (entry.shellOperators === "deny" && hasShellOperators(command)) continue;
1547
+ const allowedCwd = entry.cwd !== void 0 ? path5.resolve(policyRoot, entry.cwd) : policyRoot;
1548
+ if (!isUnderOrSame(cwd, allowedCwd)) continue;
1549
+ return entry;
1550
+ }
1551
+ return null;
1552
+ }
1553
+ var CHAIN_MAX_SEGMENTS = 6;
1554
+ function recognizeCommandChain(command, callCwd, workspaceRoot, policy) {
1555
+ const segments = [];
1556
+ let current = [];
1557
+ for (const token of scanShellLike(command)) {
1558
+ if (token.operator && token.value === "&&") {
1559
+ segments.push(current);
1560
+ current = [];
1561
+ continue;
1562
+ }
1563
+ if (token.operator) return null;
1564
+ current.push(token.value);
1565
+ }
1566
+ segments.push(current);
1567
+ if (segments.length < 2 || segments.length > CHAIN_MAX_SEGMENTS) return null;
1568
+ const ruleIds = [];
1569
+ let requiresConfirmation = false;
1570
+ let chainCwd = callCwd;
1571
+ const scriptPreviews = [];
1572
+ for (const segment of segments) {
1573
+ if (segment.length === 0) return null;
1574
+ if (segment[0] === "cd") {
1575
+ if (segment.length !== 2) return null;
1576
+ const target = segment[1] ?? "";
1577
+ const nextCwd = path5.resolve(chainCwd, target);
1578
+ if (target.startsWith("~") || !isUnderOrSame(nextCwd, workspaceRoot)) return null;
1579
+ const physical = canonicalizeRawPath(target, chainCwd);
1580
+ if (physical === null || !isUnderOrSame(physical, workspaceRoot)) return null;
1581
+ chainCwd = nextCwd;
1582
+ ruleIds.push("builtin:cd-workspace");
1583
+ continue;
1584
+ }
1585
+ const rendered = segment.join(" ");
1586
+ const projectScript = PROJECT_SCRIPT_COMMANDS.some((entry) => entry.re.test(rendered));
1587
+ if (projectScript) scriptPreviews.push(projectScriptPreview(rendered, chainCwd));
1588
+ const projectMatch = matchingProjectCommand(policy, rendered, chainCwd);
1589
+ if (projectMatch) {
1590
+ ruleIds.push(projectMatch.id);
1591
+ if (projectMatch.requireConfirmation) requiresConfirmation = true;
1592
+ continue;
1593
+ }
1594
+ const testRunner = TEST_RUNNER_COMMANDS.find((entry) => entry.re.test(rendered));
1595
+ if (testRunner !== void 0) {
1596
+ ruleIds.push(testRunner.id);
1597
+ continue;
1598
+ }
1599
+ if (projectScript) {
1600
+ ruleIds.push("project-script-confirm");
1601
+ requiresConfirmation = true;
1602
+ continue;
1603
+ }
1604
+ const builtin = BUILTIN_ALLOWLIST.find((entry) => entry.re.test(rendered));
1605
+ if (builtin === void 0) return null;
1606
+ ruleIds.push(builtin.id);
1607
+ }
1608
+ return { ruleIds, requiresConfirmation, scriptPreviews };
1609
+ }
1610
+ function hasSequencingOperators(command) {
1611
+ return /(\|\||&&|;|\||>>?|<|\n|\r)/.test(command);
1612
+ }
1613
+ function hasCommandSubstitution(command) {
1614
+ return /(`|\$\()/.test(command);
1615
+ }
1616
+ function hasShellOperators(command) {
1617
+ return hasSequencingOperators(command) || hasCommandSubstitution(command);
1618
+ }
1619
+ function isUnderOrSame(child, parent) {
1620
+ const canonicalParent = canonicalizePath(path5.resolve(parent));
1621
+ const canonicalChild = canonicalizePath(path5.resolve(child));
1622
+ if (canonicalParent === null || canonicalChild === null) return false;
1623
+ const rel = path5.relative(canonicalParent, canonicalChild);
1624
+ return rel === "" || !rel.startsWith("..") && !path5.isAbsolute(rel);
1625
+ }
1626
+ function commandArg(args) {
1627
+ return typeof args?.command === "string" ? args.command : null;
1628
+ }
1629
+ function pathArg(args) {
1630
+ if (!args) return null;
1631
+ const candidate = args.path ?? args.file_path ?? args.filePath;
1632
+ return typeof candidate === "string" && candidate.length > 0 ? candidate : null;
1633
+ }
1634
+ function cwdArg(args, fallback) {
1635
+ const resolved = typeof args?.cwd === "string" && args.cwd.length > 0 ? path5.resolve(fallback, args.cwd) : fallback;
1636
+ return canonicalizeExistingPath(resolved);
1637
+ }
1638
+ var CONTENT_BEARING_TOOLS = /* @__PURE__ */ new Set([
1639
+ ToolNames.Write,
1640
+ ToolNames.Edit,
1641
+ ToolNames.Artifact,
1642
+ ToolNames.Dispatch,
1643
+ ToolNames.Tasks
1644
+ ]);
1645
+ function damageControlScan(call) {
1646
+ if (!CONTENT_BEARING_TOOLS.has(call.tool)) return serializeArgs(call.args);
1647
+ const pathArg2 = call.args?.path;
1648
+ return typeof pathArg2 === "string" ? pathArg2 : "";
1649
+ }
1650
+ function resolveVerifyCatalogCheck(call, workspaceRoot) {
1651
+ if (call.tool !== ToolNames.Verify) return null;
1652
+ const check = call.args?.check;
1653
+ if (typeof check !== "string") return null;
1654
+ const id = check.trim();
1655
+ if (id.length === 0 || id === "frontend") return null;
1656
+ try {
1657
+ const catalog = loadProjectVerifierCatalog(workspaceRoot);
1658
+ if (!catalog.ok || catalog.source === null) return null;
1659
+ return catalog.source.checks.find((candidate) => candidate.id === id) ?? null;
1660
+ } catch {
1661
+ return null;
1662
+ }
1663
+ }
1664
+ function serializeArgs(args) {
1665
+ if (!args) return "";
1666
+ const parts = [];
1667
+ for (const v of Object.values(args)) {
1668
+ if (v == null) continue;
1669
+ if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") parts.push(String(v));
1670
+ else {
1671
+ try {
1672
+ parts.push(JSON.stringify(v));
1673
+ } catch {
1674
+ }
1675
+ }
1676
+ }
1677
+ return parts.join(" ");
1678
+ }
1679
+ function rulePackHash(packs) {
1680
+ const payload = {
1681
+ base: packPayload(packs.base.rules)
1682
+ };
1683
+ return createHash2("sha256").update(JSON.stringify(payload), "utf8").digest("hex");
1684
+ }
1685
+ function packPayload(rules) {
1686
+ return rules.map((rule) => ({
1687
+ id: rule.id,
1688
+ description: rule.description,
1689
+ pattern: rule.pattern.source,
1690
+ class: rule.class,
1691
+ block: rule.block,
1692
+ ...rule.ask !== void 0 ? { ask: rule.ask } : {}
1693
+ }));
1694
+ }
1695
+ function invokesTrustMutation(command) {
1696
+ const words = scanShellLikeDeep(command).filter((token) => !token.operator).map((token) => token.value);
1697
+ return words.some((word, index) => word === "config" && words[index + 1] === "trust") || /\bconfig\s+trust\b/.test(inlineShellScript(command) ?? "");
1698
+ }
1699
+ function projectScriptPreview(command, cwd) {
1700
+ const match = /^npm\s+(?:run\s+)?([\w:-]+)/.exec(command);
1701
+ if (match) {
1702
+ try {
1703
+ const manifest = JSON.parse(readFileSync3(path5.join(cwd, "package.json"), "utf8"));
1704
+ const name = match[1] ?? "test";
1705
+ const scripts = [`pre${name}`, name, `post${name}`].flatMap(
1706
+ (key) => typeof manifest.scripts?.[key] === "string" ? [`${key}: ${manifest.scripts[key]}`] : []
1707
+ );
1708
+ return `package.json scripts (repository data): ${scripts.join("; ") || "no script resolved"}`;
1709
+ } catch {
1710
+ return "package.json script body could not be resolved; repository code will execute.";
1711
+ }
1712
+ }
1713
+ return `Repository command: ${command}. Its test/build files and dependencies execute with the child process permissions.`;
1714
+ }
1715
+
1716
+ export {
1717
+ formatModelRejection,
1718
+ WRITE_ROOT_REFUSED_TOOLS,
1719
+ createSafetyPolicyEngine
1720
+ };
1721
+ //# sourceMappingURL=chunk-733ZBT5P.js.map