@iowarp/clio-coder 0.4.7 → 0.4.9

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 (675) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +111 -0
  3. package/CONTRIBUTING.md +83 -74
  4. package/README.md +69 -47
  5. package/dist/{acp-W3Y3TRHD.js → acp-ZWZCPS2A.js} +15 -15
  6. package/dist/{agents-J4ICNLQ3.js → agents-LYSOWZUE.js} +61 -59
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
  9. package/dist/assets/web-notices/hono-LICENSE +21 -0
  10. package/dist/{auth-X2UJUMOC.js → auth-WBQGKWQ5.js} +27 -27
  11. package/dist/background-BUMOBAQN.js +37 -0
  12. package/dist/{builtins-XLXWWSRF.js → builtins-ODRJOEDI.js} +7 -7
  13. package/dist/{chunk-C3G5PNUO.js → chunk-2DRRZ57Q.js} +36 -27
  14. package/dist/chunk-2JBZYUPY.js +105 -0
  15. package/dist/chunk-2KUBKL63.js +336 -0
  16. package/dist/chunk-2VBWFXYE.js +198 -0
  17. package/dist/{chunk-XZ6UFQ52.js → chunk-2X2R3UTH.js} +25 -15
  18. package/dist/{chunk-M6Z2V6YU.js → chunk-37LW32LZ.js} +5 -5
  19. package/dist/{chunk-6LRLOJHQ.js → chunk-3AND2EFU.js} +11 -62
  20. package/dist/{chunk-FQOOGXBH.js → chunk-3RDHGNU7.js} +101 -33
  21. package/dist/{chunk-D2T66PDV.js → chunk-3SUDBGEI.js} +41 -208
  22. package/dist/{chunk-5AJPUR72.js → chunk-3TQN67I2.js} +9 -9
  23. package/dist/{chunk-LBFQMYS3.js → chunk-3U4BL2EV.js} +5 -3
  24. package/dist/{chunk-UFYNOQK4.js → chunk-3UQADNG2.js} +7 -7
  25. package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
  26. package/dist/{chunk-NO7J45X6.js → chunk-4ATBOFRP.js} +713 -218
  27. package/dist/{chunk-ECOMVOHP.js → chunk-4DNL43EZ.js} +3 -3
  28. package/dist/{chunk-WT5TRMO4.js → chunk-4HFJKRGZ.js} +255 -82
  29. package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
  30. package/dist/{chunk-WURGVOZJ.js → chunk-5RTEFNBP.js} +18 -14
  31. package/dist/{config-YXARKGTX.js → chunk-64XJW7NT.js} +24 -268
  32. package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
  33. package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
  34. package/dist/{chunk-MZNWZUJM.js → chunk-7FBCRWVT.js} +288 -288
  35. package/dist/{chunk-UA6W4XFJ.js → chunk-7JSOSVLP.js} +2 -2
  36. package/dist/chunk-7N3OLLSL.js +637 -0
  37. package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
  38. package/dist/{chunk-N37QC5FV.js → chunk-A6DULIMH.js} +21 -9
  39. package/dist/{fleet-decisions-S3PTZV2D.js → chunk-AB3QXXBC.js} +5 -41
  40. package/dist/chunk-ACCECAH4.js +49 -0
  41. package/dist/{chunk-CP3HIR5H.js → chunk-AM6CEP2K.js} +20 -19
  42. package/dist/chunk-AUHVBIDW.js +19 -0
  43. package/dist/{chunk-BQQ5MXUC.js → chunk-AY4XE6GN.js} +19 -13
  44. package/dist/{chunk-ISNCCX42.js → chunk-BBA2TAWV.js} +10 -9
  45. package/dist/chunk-BFPHMSK7.js +169 -0
  46. package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
  47. package/dist/{chunk-DO7M3LSX.js → chunk-BMNVVKEW.js} +40 -93
  48. package/dist/{chunk-VTYHHQ57.js → chunk-CTGZCEI6.js} +2 -2
  49. package/dist/{chunk-RTLNFZMD.js → chunk-DIAJYJYG.js} +3 -3
  50. package/dist/chunk-EHZRAB4U.js +63 -0
  51. package/dist/{chunk-KS7ETA3P.js → chunk-EM2DIQAJ.js} +3 -3
  52. package/dist/{chunk-MNQN3X6Y.js → chunk-ETF4ROKH.js} +5 -5
  53. package/dist/{chunk-WN552PKN.js → chunk-F2YM3JY4.js} +744 -1134
  54. package/dist/{chunk-7EEGBKV4.js → chunk-FEBQWHJT.js} +24 -19
  55. package/dist/{chunk-4QKAITQT.js → chunk-FPS4R2RN.js} +74 -10
  56. package/dist/chunk-G5R53COU.js +68 -0
  57. package/dist/chunk-GHXGMFQ5.js +40 -0
  58. package/dist/{chunk-GFQ7P2UF.js → chunk-GJDRMBDI.js} +10 -10
  59. package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
  60. package/dist/{chunk-NCCQ6DVS.js → chunk-GREYLTZ5.js} +8 -8
  61. package/dist/{chunk-HOX4YZ2K.js → chunk-H2WSCZZT.js} +19 -3
  62. package/dist/{chunk-3LXJOICS.js → chunk-H6IUCY6Q.js} +2 -2
  63. package/dist/{chunk-BO4XV5VX.js → chunk-H72DCH3E.js} +95 -206
  64. package/dist/{chunk-SEDI5K5B.js → chunk-H7TXJR23.js} +20 -20
  65. package/dist/chunk-HBJQQTKM.js +40 -0
  66. package/dist/chunk-HCVKSGNZ.js +990 -0
  67. package/dist/chunk-HVCAY2FH.js +67 -0
  68. package/dist/{chunk-34XHRVKG.js → chunk-I47EJPYL.js} +3 -3
  69. package/dist/{chunk-4N2RZ4TO.js → chunk-IALGWTLO.js} +3 -3
  70. package/dist/{chunk-IQCNVLO6.js → chunk-IALZJE37.js} +10 -7
  71. package/dist/{chunk-DLIYANB7.js → chunk-IC7JXLOM.js} +16 -11
  72. package/dist/{chunk-G4LGUTOE.js → chunk-IOSVTTCD.js} +5 -5
  73. package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
  74. package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
  75. package/dist/{chunk-TN5FW4XY.js → chunk-JIYWMQZ5.js} +12 -9
  76. package/dist/{chunk-T7QQBNLH.js → chunk-JKU34ACI.js} +10 -8
  77. package/dist/chunk-JOBN2YQQ.js +176 -0
  78. package/dist/chunk-JOL2QRLE.js +152 -0
  79. package/dist/{chunk-GXIWHXDB.js → chunk-JTR3VSV3.js} +3 -3
  80. package/dist/{chunk-T334FW2H.js → chunk-JU6MAMRJ.js} +7 -7
  81. package/dist/chunk-JURMQWVJ.js +15 -0
  82. package/dist/{chunk-CULVKYTK.js → chunk-K3XN4LZ4.js} +5 -5
  83. package/dist/{chunk-3T4DXWP6.js → chunk-KIVFXGBM.js} +27 -7
  84. package/dist/chunk-KKRXONXG.js +43 -0
  85. package/dist/{chunk-YPRSNUTC.js → chunk-KOAHT3N2.js} +2 -2
  86. package/dist/chunk-KP5BPXR3.js +73 -0
  87. package/dist/{chunk-UA3W4FGC.js → chunk-KRJQG47M.js} +6 -6
  88. package/dist/{chunk-GI5RRMAH.js → chunk-KW6OJ7IY.js} +19 -21
  89. package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
  90. package/dist/{chunk-MZHXENL7.js → chunk-L4RUTLRL.js} +8 -8
  91. package/dist/{chunk-P5SC4DLJ.js → chunk-LGTVWPRN.js} +2 -2
  92. package/dist/{chunk-65BGHOUR.js → chunk-LSQW6KZO.js} +5 -5
  93. package/dist/{chunk-TZHN5ITX.js → chunk-LWJYOHT3.js} +8 -8
  94. package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
  95. package/dist/chunk-MJ4QEJVT.js +185 -0
  96. package/dist/{chunk-T4TY5GG3.js → chunk-MO65K5CH.js} +5 -5
  97. package/dist/{chunk-TZ6UVP2H.js → chunk-MTOZEQHL.js} +8 -8
  98. package/dist/chunk-MZDPF35R.js +45 -0
  99. package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
  100. package/dist/{chunk-KAFMW7WM.js → chunk-NBPA5QM6.js} +2 -2
  101. package/dist/{chunk-EUEXGXXR.js → chunk-NMBEW4PP.js} +5 -5
  102. package/dist/{chunk-SELG4SUR.js → chunk-NPLLK3HO.js} +72 -89
  103. package/dist/{chunk-VCRVEDUC.js → chunk-NSYGPIVW.js} +5 -5
  104. package/dist/{context-7HJEWTTP.js → chunk-NXTV5OI5.js} +36 -90
  105. package/dist/{chunk-IMOD2YPV.js → chunk-NYDG4QP4.js} +9 -19
  106. package/dist/{chunk-6CA2BHOR.js → chunk-OA2GDACN.js} +5 -5
  107. package/dist/{chunk-A67NR5AT.js → chunk-PJI57EC6.js} +14 -11
  108. package/dist/{chunk-IJMW64DX.js → chunk-PJJBUGMR.js} +50 -50
  109. package/dist/{chunk-CPXGJI2A.js → chunk-PNJE7JPS.js} +20 -5
  110. package/dist/chunk-PP23PZEV.js +1347 -0
  111. package/dist/chunk-PPIFDSBK.js +409 -0
  112. package/dist/{chunk-T52TPHYC.js → chunk-PTFISXQO.js} +8 -7
  113. package/dist/{chunk-C6GEXX4L.js → chunk-QB33Z5S7.js} +5 -5
  114. package/dist/{chunk-VMATUZB6.js → chunk-QGNII5VC.js} +10 -10
  115. package/dist/{chunk-TLTGZTXI.js → chunk-QI72X67S.js} +104 -27
  116. package/dist/chunk-QKHZZFKH.js +98 -0
  117. package/dist/{chunk-PFLOULP3.js → chunk-RDKX2PME.js} +4 -4
  118. package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
  119. package/dist/chunk-RPMNIFRY.js +65 -0
  120. package/dist/{chunk-L3Z5ANCV.js → chunk-RQROVOV3.js} +13 -11
  121. package/dist/{chunk-6YHPAAZR.js → chunk-S34A7BSP.js} +3 -3
  122. package/dist/{chunk-5ZSZEYJK.js → chunk-SJETVJHX.js} +2 -2
  123. package/dist/{chunk-77CZRFTE.js → chunk-SJMNU4ZS.js} +2 -2
  124. package/dist/chunk-SLLG2G44.js +85 -0
  125. package/dist/{chunk-GVZFCJHE.js → chunk-SQAZN2V3.js} +48 -22
  126. package/dist/{chunk-2O2LVQQK.js → chunk-SQBT46OF.js} +2 -2
  127. package/dist/{chunk-ZGIGW4ZG.js → chunk-TCUOGIL2.js} +5 -5
  128. package/dist/{chunk-DACXIVVF.js → chunk-TIWPKCVO.js} +5 -5
  129. package/dist/{chunk-5CMARGPF.js → chunk-UIU7MGZ3.js} +11 -2
  130. package/dist/chunk-USBBEKHW.js +177 -0
  131. package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
  132. package/dist/{chunk-MBJO5VNZ.js → chunk-VPWGADBG.js} +33 -33
  133. package/dist/{chunk-UUQ5G6EZ.js → chunk-VWFCAK34.js} +6 -6
  134. package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
  135. package/dist/{chunk-4MFBBY2Z.js → chunk-W72LLZAV.js} +3 -3
  136. package/dist/{chunk-4UHVS5T7.js → chunk-WGRDABW7.js} +8 -8
  137. package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
  138. package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
  139. package/dist/{chunk-6YA46L5A.js → chunk-XFLSL7BT.js} +2 -2
  140. package/dist/{chunk-QKWL7SYE.js → chunk-XJZEDCNT.js} +50 -39
  141. package/dist/{chunk-UWD3JD5X.js → chunk-XLLEL3K7.js} +10 -10
  142. package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
  143. package/dist/chunk-XNZWWDC3.js +686 -0
  144. package/dist/{chunk-WBVKKTUT.js → chunk-XRECG65F.js} +2 -2
  145. package/dist/chunk-XTQ7MEJG.js +457 -0
  146. package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
  147. package/dist/{chunk-WB7POC6M.js → chunk-Y3M2T5RO.js} +6 -6
  148. package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
  149. package/dist/{chunk-EUZRMP4Y.js → chunk-YPQOPFP7.js} +20 -20
  150. package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
  151. package/dist/{chunk-BAU36233.js → chunk-YQYINEJI.js} +9 -9
  152. package/dist/{chunk-CE64C5K5.js → chunk-ZF6CV4WZ.js} +1356 -235
  153. package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
  154. package/dist/{chunk-IZYTT3CD.js → chunk-ZKQ63XZ5.js} +16 -39
  155. package/dist/{chunk-6TAATXXH.js → chunk-ZKVMDNAN.js} +7 -7
  156. package/dist/chunk-ZST3FRCV.js +132 -0
  157. package/dist/cli/index.js +50 -38
  158. package/dist/{clio-L2P7S2R2.js → clio-JUDCLNHC.js} +11 -11
  159. package/dist/clio-context-tools-FT672MNZ.js +136 -0
  160. package/dist/{code-nav-B5LNX4KU.js → code-nav-7OVCTP2Z.js} +39 -37
  161. package/dist/{components-63MMQKUT.js → components-OZXZMDWU.js} +11 -11
  162. package/dist/config-P3ZQVF63.js +275 -0
  163. package/dist/config-graph-GKAOBAS5.js +160 -0
  164. package/dist/{configure-LMVQJ46J.js → configure-25LRYZJG.js} +56 -55
  165. package/dist/context-72VQV7JX.js +73 -0
  166. package/dist/{context-YG2LZDYZ.js → context-COWRWXP3.js} +89 -83
  167. package/dist/{context-XSZKKFBW.js → context-WB3D474G.js} +16 -16
  168. package/dist/{context-clear-AC5NXHM2.js → context-clear-Y4LYMWC6.js} +88 -82
  169. package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
  170. package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
  171. package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-TMZYVC7A.js} +27 -25
  172. package/dist/data-tool-KMBWKKWR.js +2987 -0
  173. package/dist/{detail-H73BEF2N.js → detail-4GLROGY5.js} +89 -83
  174. package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-TR3LBP5P.js} +113 -107
  175. package/dist/docs-ZK777W2G.js +101 -0
  176. package/dist/{doctor-EQYJOGUG.js → doctor-WC4OV2OB.js} +76 -73
  177. package/dist/{eval-4P7O6CCE.js → eval-FUNWJNUJ.js} +88 -73
  178. package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
  179. package/dist/evals-L73EBHSU.js +104 -0
  180. package/dist/{evidence-O76QF7TZ.js → evidence-AVJ2RTHX.js} +99 -93
  181. package/dist/{evidence-D6GUSYJW.js → evidence-P4NZOAK7.js} +88 -82
  182. package/dist/evidence-Y55WKYHH.js +246 -0
  183. package/dist/{evolve-H47BCETS.js → evolve-MAWKRYWF.js} +93 -87
  184. package/dist/{extensions-NNL3ZOCU.js → extensions-PYQH3H47.js} +14 -13
  185. package/dist/fleet-M4H2QBWT.js +268 -0
  186. package/dist/{fleet-KMNS6NOM.js → fleet-ULBXXRDR.js} +146 -138
  187. package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-7NNC4JZU.js} +18 -17
  188. package/dist/fleet-decisions-EHEY7KPU.js +52 -0
  189. package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-LQ2AHZT3.js} +24 -24
  190. package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-5IGBIIYZ.js} +98 -258
  191. package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-UTTNOKMG.js} +9 -4
  192. package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-YGILJKA6.js} +29 -29
  193. package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-AUWTCDKR.js} +88 -82
  194. package/dist/{fleet-view-BHJFW26B.js → fleet-view-TGUFCY5A.js} +90 -84
  195. package/dist/{init-XAT5N5YM.js → init-GFN2Z7NF.js} +111 -104
  196. package/dist/install-6PIF6F6W.js +19 -0
  197. package/dist/{interop-FVECHFKG.js → interop-EF5JUWWK.js} +29 -29
  198. package/dist/{inventory-7KFQGLCV.js → inventory-I6VJDDYF.js} +90 -84
  199. package/dist/library-3J5IO2OJ.js +75 -0
  200. package/dist/{library-QAPAO23R.js → library-IJTOFTDS.js} +20 -19
  201. package/dist/{library-NY2XOT75.js → library-Z3KZSHPE.js} +35 -35
  202. package/dist/{library-import-5Y6MAS3R.js → library-import-IMKFLDHX.js} +29 -29
  203. package/dist/{library-inventory-JT6HWITQ.js → library-inventory-CQP5D6GU.js} +21 -21
  204. package/dist/{library-validation-EQUH25DC.js → library-validation-33UTX7AI.js} +19 -19
  205. package/dist/mcp-5FWZKUS6.js +26 -0
  206. package/dist/{memory-DYVTTCP6.js → memory-36CWN67Y.js} +93 -87
  207. package/dist/{models-MASFJ6Y2.js → models-KQ6PQJJQ.js} +57 -56
  208. package/dist/{monitor-YMP4NXJJ.js → monitor-XX6ZD6KC.js} +98 -91
  209. package/dist/{orchestrator-AFQRRTEI.js → orchestrator-SK6HDAOP.js} +1537 -832
  210. package/dist/{panes-NICTHQCV.js → panes-L27QRXUH.js} +14 -14
  211. package/dist/{panes-D3Y2KFG5.js → panes-LXZIWNOZ.js} +4 -4
  212. package/dist/{paths-PSFAUIGO.js → paths-7DJDU4P4.js} +6 -6
  213. package/dist/{preload-5Q7VXRFJ.js → preload-K2TDYI4Y.js} +88 -82
  214. package/dist/{reset-7NKZK7JN.js → reset-73VU3XNT.js} +13 -13
  215. package/dist/{resources-NILSIZAT.js → resources-3BYJYVYL.js} +24 -24
  216. package/dist/{run-BPZGEBZV.js → run-AR7PY6GW.js} +144 -136
  217. package/dist/run-script-H2KUDIII.js +41 -0
  218. package/dist/settings-3VMBMWID.js +72 -0
  219. package/dist/{share-EZ6ERBMH.js → share-HVWH4FPF.js} +30 -30
  220. package/dist/{skills-BTVVNYVM.js → skills-5TYEY75Q.js} +30 -30
  221. package/dist/{skills-eval-UY34MNK7.js → skills-eval-CK3MD63Z.js} +114 -103
  222. package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-KSFYG3I6.js} +24 -24
  223. package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-DMVHML7P.js} +60 -57
  224. package/dist/{steer-2B3EQGFH.js → steer-XCD6V3EW.js} +4 -4
  225. package/dist/{support-L2SOL3IE.js → support-JAZL6VBR.js} +7 -7
  226. package/dist/system-3TDQRMZZ.js +116 -0
  227. package/dist/{targets-44VKGFLN.js → targets-EZKHAYRN.js} +74 -72
  228. package/dist/{tasks-3KODKFU7.js → tasks-SNEFHWYW.js} +18 -18
  229. package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-BNLFA4OF.js} +8 -7
  230. package/dist/{tools-3UB7TEVR.js → tools-7IM6BDCE.js} +12 -12
  231. package/dist/{trace-TAMIU4OJ.js → trace-C3MBGD4S.js} +16 -65
  232. package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
  233. package/dist/{uninstall-QYVRPEM4.js → uninstall-WWLOSZ42.js} +35 -10
  234. package/dist/{upgrade-7PMKM2JH.js → upgrade-ETK2JNSJ.js} +42 -51
  235. package/dist/{usage-6EQV7EQK.js → usage-S2HOB7BZ.js} +112 -102
  236. package/dist/{verifiers-JLITWSHU.js → verifiers-QDTEVH7R.js} +26 -24
  237. package/dist/{verify-T7NAEVIG.js → verify-SUKUK6XM.js} +16 -15
  238. package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
  239. package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +1 -0
  240. package/dist/web/client/assets/arc-Pry-7G1_.js +1 -0
  241. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
  242. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
  243. package/dist/web/client/assets/array-BifhSqXX.js +1 -0
  244. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  245. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  246. package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +129 -0
  247. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +38 -0
  248. package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
  249. package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  250. package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +62 -0
  251. package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  252. package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +2 -0
  253. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
  254. package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +1 -0
  255. package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
  256. package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +72 -0
  257. package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +1 -0
  258. package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +231 -0
  259. package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  260. package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +1 -0
  261. package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +10 -0
  262. package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +1 -0
  263. package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +1 -0
  264. package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +1 -0
  265. package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +168 -0
  266. package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +88 -0
  267. package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +206 -0
  268. package/dist/web/client/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  269. package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  270. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
  271. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
  272. package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  273. package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  274. package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
  275. package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +1 -0
  276. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +62 -0
  277. package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
  278. package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
  279. package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +4 -0
  280. package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
  281. package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +30 -0
  282. package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +41 -0
  283. package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +3 -0
  284. package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +24 -0
  285. package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +24 -0
  286. package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
  287. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +1 -0
  288. package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +99 -0
  289. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
  290. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
  291. package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
  292. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
  293. package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +1 -0
  294. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +106 -0
  295. package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
  296. package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
  297. package/dist/web/client/assets/index-Dsi52apB.css +1 -0
  298. package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +1 -0
  299. package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +2 -0
  300. package/dist/web/client/assets/init-C-OQMol4.js +1 -0
  301. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +70 -0
  302. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +139 -0
  303. package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +89 -0
  304. package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
  305. package/dist/web/client/assets/line-BIDAcEtX.js +1 -0
  306. package/dist/web/client/assets/linear-SzVmGSw4.js +1 -0
  307. package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +7 -0
  308. package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +44 -0
  309. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +96 -0
  310. package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  311. package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  312. package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  313. package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
  314. package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +1 -0
  315. package/dist/web/client/assets/path-fybaL0A-.js +1 -0
  316. package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +1 -0
  317. package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +1 -0
  318. package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +39 -0
  319. package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
  320. package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
  321. package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
  322. package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
  323. package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
  324. package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
  325. package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
  326. package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
  327. package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
  328. package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
  329. package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
  330. package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
  331. package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
  332. package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
  333. package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
  334. package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
  335. package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
  336. package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
  337. package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
  338. package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
  339. package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
  340. package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
  341. package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
  342. package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
  343. package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
  344. package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
  345. package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
  346. package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
  347. package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
  348. package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
  349. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +7 -0
  350. package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +1 -0
  351. package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +1 -0
  352. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
  353. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
  354. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
  355. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +1 -0
  356. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +84 -0
  357. package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
  358. package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
  359. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +40 -0
  360. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +162 -0
  361. package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  362. package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
  363. package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +1 -0
  364. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
  365. package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +1 -0
  366. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
  367. package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +120 -0
  368. package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +1 -0
  369. package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +1 -0
  370. package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +34 -0
  371. package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +1 -0
  372. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +78 -0
  373. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +7 -0
  374. package/dist/web/client/clio-coder-logo.webp +0 -0
  375. package/dist/web/client/icon-192.png +0 -0
  376. package/dist/web/client/icon-512.png +0 -0
  377. package/dist/web/client/index.html +6 -0
  378. package/dist/web/client/manifest.webmanifest +15 -0
  379. package/dist/web/client/offline.css +55 -0
  380. package/dist/web/client/offline.html +5 -0
  381. package/dist/web/client/offline.js +27 -0
  382. package/dist/web/client/sw.js +34 -0
  383. package/dist/web/ops-worker.js +37 -0
  384. package/dist/web/reads-worker.js +1726 -0
  385. package/dist/web/server.js +8499 -0
  386. package/dist/web-EMGUGGEI.js +13 -0
  387. package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-6BRRVQON.js} +22 -5
  388. package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-XHSJTDOP.js} +120 -113
  389. package/dist/{with-panes-CHFC7HGI.js → with-panes-Z6BTEHMZ.js} +12 -12
  390. package/dist/worker/entry.js +113 -99
  391. package/docs/README.md +28 -27
  392. package/docs/architecture/acp.md +5 -9
  393. package/docs/architecture/alcf-provider.md +0 -3
  394. package/docs/architecture/architecture.md +0 -3
  395. package/docs/architecture/artifact-placement.md +12 -4
  396. package/docs/architecture/artifact-versions.md +0 -3
  397. package/docs/architecture/capacity-and-scheduling.md +0 -3
  398. package/docs/architecture/context-engine.md +0 -3
  399. package/docs/architecture/context-working-set.md +0 -3
  400. package/docs/architecture/dispatch-architecture-rationale.md +0 -3
  401. package/docs/architecture/dispatch-typed-intent.md +0 -3
  402. package/docs/architecture/evidence-and-memory.md +0 -3
  403. package/docs/architecture/library.md +1 -3
  404. package/docs/architecture/middleware-and-components.md +0 -3
  405. package/docs/architecture/model-catalog.md +1 -4
  406. package/docs/architecture/observability.md +0 -3
  407. package/docs/architecture/pi-boundary.md +6 -9
  408. package/docs/architecture/prompt-envelope-and-tools.md +37 -30
  409. package/docs/architecture/provider-adapter-cookbook.md +1 -4
  410. package/docs/architecture/safety-model.md +19 -9
  411. package/docs/architecture/session-lifecycle.md +10 -7
  412. package/docs/architecture/time-conventions.md +0 -3
  413. package/docs/architecture/trace-store.md +28 -20
  414. package/docs/architecture/tui-design.md +38 -18
  415. package/docs/architecture/worker-context.md +1 -3
  416. package/docs/architecture/worker-dispatch-mechanics.md +1 -4
  417. package/docs/guide/authoring-plugins.md +1 -3
  418. package/docs/guide/built-in-agents.md +0 -3
  419. package/docs/guide/commands-and-modes.md +41 -25
  420. package/docs/guide/configuration-and-targets.md +204 -9
  421. package/docs/guide/configuration-reference.md +125 -17
  422. package/docs/guide/environment-variables.md +2 -8
  423. package/docs/guide/exit-codes-and-output.md +0 -3
  424. package/docs/guide/extensions-and-sharing.md +0 -3
  425. package/docs/guide/fleet-dispatch.md +3 -5
  426. package/docs/guide/glossary.md +1 -4
  427. package/docs/guide/harness-extensions.md +0 -2
  428. package/docs/guide/installation-and-lifecycle.md +3 -6
  429. package/docs/guide/interop.md +0 -2
  430. package/docs/guide/panes-and-files.md +0 -3
  431. package/docs/guide/plugins.md +0 -3
  432. package/docs/guide/proactive-memory.md +0 -3
  433. package/docs/guide/resource-library.md +1 -3
  434. package/docs/guide/skills-marketplace.md +0 -2
  435. package/docs/guide/tool-usage.md +166 -67
  436. package/docs/guide/troubleshooting.md +1 -4
  437. package/docs/history/config-knobs-audit.md +0 -3
  438. package/docs/history/release-cut-checklist.md +0 -3
  439. package/docs/process/development-pipeline.md +0 -3
  440. package/docs/process/documentation-coverage.md +3 -3
  441. package/docs/process/documentation-guide.md +16 -22
  442. package/docs/process/eval-runner.md +0 -3
  443. package/docs/process/evals-internal.md +0 -3
  444. package/docs/process/evolution.md +0 -3
  445. package/docs/process/fleet-demo-runbook.md +6 -9
  446. package/docs/process/git-commit-provenance.md +0 -3
  447. package/docs/process/performance-methodology.md +1 -4
  448. package/docs/process/release-cut-checklist.md +114 -221
  449. package/docs/process/scientific-validation.md +23 -6
  450. package/docs/process/tool-audit-v0.4.9.md +357 -0
  451. package/library/registry.yaml +2 -2
  452. package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
  453. package/library/skills/meta/clio-coder-test/evals.md +16 -2
  454. package/library/skills/meta/clio-coder-test/plugin.json +1 -1
  455. package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
  456. package/library/skills/registry.yaml +2 -2
  457. package/library/skills/skill-marketplace.json +1 -1
  458. package/package.json +13 -11
  459. package/src/cli/argv.ts +31 -0
  460. package/src/cli/clio.ts +17 -13
  461. package/src/cli/config.ts +4 -0
  462. package/src/cli/docs.ts +65 -328
  463. package/src/cli/doctor-panes.ts +1 -1
  464. package/src/cli/doctor.ts +3 -1
  465. package/src/cli/index.ts +17 -2
  466. package/src/cli/mcp.ts +106 -0
  467. package/src/cli/skills-eval.ts +8 -2
  468. package/src/cli/trace.ts +4 -65
  469. package/src/cli/uninstall.ts +26 -0
  470. package/src/cli/upgrade.ts +34 -38
  471. package/src/cli/usage.ts +3 -0
  472. package/src/cli/verifiers.ts +1 -1
  473. package/src/cli/web.ts +79 -0
  474. package/src/core/bash-exec.ts +27 -4
  475. package/src/core/bus-events.ts +3 -4
  476. package/src/core/config.ts +73 -1
  477. package/src/core/defaults.ts +10 -1
  478. package/src/core/domain-loader.ts +37 -28
  479. package/src/core/event-bus.ts +1 -1
  480. package/src/core/run-records.ts +438 -0
  481. package/src/core/safe-exec.ts +506 -56
  482. package/src/core/skill-activation.ts +5 -3
  483. package/src/core/termination.ts +16 -12
  484. package/src/core/tool-names.ts +33 -12
  485. package/src/domains/agents/contract.ts +1 -1
  486. package/src/domains/agents/extension.ts +18 -10
  487. package/src/domains/config/extension.ts +5 -4
  488. package/src/domains/context/clio-md.ts +1 -1
  489. package/src/domains/context/worker/pressure.ts +6 -2
  490. package/src/domains/context/working-set/path-index.ts +7 -2
  491. package/src/domains/dispatch/code-step.ts +7 -2
  492. package/src/domains/dispatch/contract.ts +7 -0
  493. package/src/domains/dispatch/execution-role.ts +3 -3
  494. package/src/domains/dispatch/execution-scheduler.ts +204 -79
  495. package/src/domains/dispatch/extension.ts +206 -26
  496. package/src/domains/dispatch/fleet-preflight.ts +18 -3
  497. package/src/domains/dispatch/fleet-run.ts +1 -0
  498. package/src/domains/dispatch/gate-decisions.ts +3 -3
  499. package/src/domains/dispatch/heartbeat.ts +1 -1
  500. package/src/domains/dispatch/host-verification.ts +16 -14
  501. package/src/domains/dispatch/index.ts +1 -0
  502. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  503. package/src/domains/dispatch/receipt-findings.ts +3 -4
  504. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  505. package/src/domains/dispatch/reservation-store.ts +7 -9
  506. package/src/domains/dispatch/route-facts.ts +1 -1
  507. package/src/domains/dispatch/state.ts +4 -5
  508. package/src/domains/dispatch/types.ts +3 -1
  509. package/src/domains/eval/metrics/tracked.ts +22 -2
  510. package/src/domains/evidence/build.ts +35 -7
  511. package/src/domains/extensions/operator-runtime.ts +3 -1
  512. package/src/domains/gateway/mcp/client.ts +923 -0
  513. package/src/domains/gateway/mcp/config.ts +456 -0
  514. package/src/domains/gateway/mcp/index.ts +88 -0
  515. package/src/domains/gateway/mcp/protocol.ts +273 -0
  516. package/src/domains/gateway/mcp/trust.ts +263 -0
  517. package/src/domains/lifecycle/doctor.ts +17 -3
  518. package/src/domains/middleware/hooks.ts +2 -2
  519. package/src/domains/mux/contract.ts +5 -9
  520. package/src/domains/mux/detect.ts +1 -1
  521. package/src/domains/mux/extension.ts +1 -1
  522. package/src/domains/mux/protocol.ts +5 -7
  523. package/src/domains/mux/socket-client.ts +3 -3
  524. package/src/domains/observability/accountability.ts +2 -2
  525. package/src/domains/observability/background-memory-usage.ts +3 -0
  526. package/src/domains/observability/compaction-usage.ts +2 -0
  527. package/src/domains/observability/contract.ts +7 -3
  528. package/src/domains/observability/cost.ts +5 -0
  529. package/src/domains/observability/evidence-index.ts +2 -2
  530. package/src/domains/observability/extension.ts +1 -0
  531. package/src/domains/observability/out-of-turn-usage.ts +2 -0
  532. package/src/domains/observability/projection.ts +10 -0
  533. package/src/domains/observability/trace-store.ts +65 -5
  534. package/src/domains/prompts/compiler.ts +41 -23
  535. package/src/domains/prompts/extension.ts +4 -17
  536. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
  537. package/src/domains/prompts/fragments/operating/skills.md +12 -10
  538. package/src/domains/providers/cache-deployment.ts +147 -0
  539. package/src/domains/providers/catalog.ts +12 -7
  540. package/src/domains/providers/extension.ts +27 -5
  541. package/src/domains/providers/index.ts +6 -1
  542. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
  543. package/src/domains/providers/plugins.ts +3 -13
  544. package/src/domains/providers/probe/http.ts +44 -59
  545. package/src/domains/providers/probe/reasoning.ts +2 -0
  546. package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
  547. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
  548. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
  549. package/src/domains/providers/types/target-descriptor.ts +17 -0
  550. package/src/domains/safety/action-classifier.ts +17 -1
  551. package/src/domains/safety/call-target.ts +14 -0
  552. package/src/domains/safety/contract.ts +1 -1
  553. package/src/domains/safety/finish-contract.ts +9 -3
  554. package/src/domains/safety/loop-detector.ts +1 -1
  555. package/src/domains/safety/policy-engine.ts +7 -0
  556. package/src/domains/safety/protected-artifacts.ts +3 -4
  557. package/src/domains/safety/rejection-feedback.ts +1 -1
  558. package/src/domains/safety/scope.ts +2 -3
  559. package/src/domains/safety/validation-contract.ts +3 -2
  560. package/src/domains/scheduling/budget.ts +5 -3
  561. package/src/domains/scheduling/contract.ts +2 -1
  562. package/src/domains/scheduling/extension.ts +3 -3
  563. package/src/domains/session/compaction/branch-summary.ts +1 -1
  564. package/src/domains/session/compaction/compact.ts +29 -3
  565. package/src/domains/session/compaction/cut-point.ts +1 -1
  566. package/src/domains/session/compaction/tokens.ts +5 -10
  567. package/src/domains/session/contract.ts +1 -1
  568. package/src/domains/session/cwd-fallback.ts +2 -2
  569. package/src/domains/session/entries.ts +1 -0
  570. package/src/domains/session/handoff.ts +5 -1
  571. package/src/domains/session/history.ts +6 -0
  572. package/src/domains/session/manager.ts +14 -7
  573. package/src/domains/session/retry.ts +2 -1
  574. package/src/domains/session/session-artifacts.ts +12 -7
  575. package/src/domains/session/task-board.ts +2 -3
  576. package/src/domains/session/usage.ts +6 -7
  577. package/src/engine/acp/server.ts +11 -0
  578. package/src/engine/ai.ts +2 -0
  579. package/src/engine/apis/openai-completions.ts +17 -4
  580. package/src/engine/loop-guard.ts +7 -0
  581. package/src/engine/prewarm.ts +232 -0
  582. package/src/engine/provider-diagnostics.ts +6 -1
  583. package/src/engine/provider-error-body.ts +65 -0
  584. package/src/engine/session.ts +118 -29
  585. package/src/engine/worker-runtime.ts +3 -0
  586. package/src/entry/boot-options.ts +2 -0
  587. package/src/entry/orchestrator.ts +38 -18
  588. package/src/interactive/chat-loop-messages.ts +3 -0
  589. package/src/interactive/chat-loop-policy.ts +1 -0
  590. package/src/interactive/chat-loop.ts +10 -12
  591. package/src/interactive/chat-panel.ts +23 -9
  592. package/src/interactive/chat-renderer.ts +33 -11
  593. package/src/interactive/clio-editor.ts +13 -5
  594. package/src/interactive/dispatch-board.ts +70 -30
  595. package/src/interactive/editor-submit.ts +30 -25
  596. package/src/interactive/footer/widgets.ts +12 -9
  597. package/src/interactive/interactive-presentation.ts +2 -3
  598. package/src/interactive/mux-bridge.ts +3 -7
  599. package/src/interactive/overlay-general-openers.ts +14 -7
  600. package/src/interactive/overlays/cwd-fallback.ts +1 -1
  601. package/src/interactive/overlays/library-model.ts +114 -35
  602. package/src/interactive/overlays/library.ts +52 -5
  603. package/src/interactive/overlays/list-overlay.ts +4 -1
  604. package/src/interactive/overlays/session-selector.ts +28 -23
  605. package/src/interactive/overlays/settings.ts +20 -1
  606. package/src/interactive/overlays/tree-selector.ts +47 -10
  607. package/src/interactive/panes-runtime.ts +1 -1
  608. package/src/interactive/prewarm.ts +11 -197
  609. package/src/interactive/renderers/compaction-summary.ts +1 -1
  610. package/src/interactive/renderers/provider-error.ts +118 -0
  611. package/src/interactive/renderers/retry-status.ts +59 -23
  612. package/src/interactive/renderers/tool-execution.ts +67 -7
  613. package/src/interactive/renderers/worker-answer.ts +198 -0
  614. package/src/interactive/renderers/worker-entry.ts +57 -163
  615. package/src/interactive/session-usage-reseed.ts +2 -0
  616. package/src/interactive/side-question.ts +2 -0
  617. package/src/interactive/slash-commands.ts +26 -1
  618. package/src/interactive/slash-spec.ts +2 -2
  619. package/src/interactive/theme/labels.ts +66 -30
  620. package/src/interactive/turn-context.ts +1 -0
  621. package/src/interactive/turn-persistence.ts +9 -1
  622. package/src/interactive/turn-prewarm.ts +126 -19
  623. package/src/interactive/turn-recovery.ts +2 -1
  624. package/src/interactive/turn-runtime.ts +36 -5
  625. package/src/interactive/view/artifacts.ts +3 -2
  626. package/src/interactive/view/view-overlay.ts +96 -20
  627. package/src/tools/agent-tools.ts +21 -7
  628. package/src/tools/artifact.ts +16 -8
  629. package/src/tools/bash.ts +90 -11
  630. package/src/tools/bootstrap.ts +42 -4
  631. package/src/tools/builtin-tool-catalog.ts +80 -11
  632. package/src/tools/context/index.ts +27 -31
  633. package/src/tools/context/library.ts +3 -1
  634. package/src/tools/context/surface.ts +12 -26
  635. package/src/tools/core-bootstrap.ts +72 -1
  636. package/src/tools/data/csv.ts +1189 -0
  637. package/src/tools/data/index.ts +308 -0
  638. package/src/tools/data/json.ts +1799 -0
  639. package/src/tools/data/jsonl.ts +561 -0
  640. package/src/tools/data/shared.ts +452 -0
  641. package/src/tools/edit-diff.ts +0 -7
  642. package/src/tools/edit.ts +115 -18
  643. package/src/tools/file-mutation-queue.ts +114 -4
  644. package/src/tools/find.ts +108 -29
  645. package/src/tools/gateway/caps.ts +11 -0
  646. package/src/tools/gateway/clio-context-surface.ts +41 -0
  647. package/src/tools/gateway/clio-context-tools.ts +77 -0
  648. package/src/tools/gateway/data-surface.ts +138 -0
  649. package/src/tools/gateway/data-tool.ts +201 -0
  650. package/src/tools/gateway/index.ts +342 -0
  651. package/src/tools/gateway/mcp-capabilities.ts +469 -0
  652. package/src/tools/grep.ts +88 -33
  653. package/src/tools/harness-extensions.ts +3 -0
  654. package/src/tools/ignore-policy.ts +7 -5
  655. package/src/tools/ls.ts +111 -20
  656. package/src/tools/policy.ts +35 -13
  657. package/src/tools/presentation.ts +6 -0
  658. package/src/tools/read.ts +634 -156
  659. package/src/tools/registry.ts +106 -8
  660. package/src/tools/run-script.ts +997 -0
  661. package/src/tools/spawn-hygiene.ts +157 -5
  662. package/src/tools/surface.ts +163 -0
  663. package/src/tools/verify/authoring.ts +8 -3
  664. package/src/tools/verify/catalog.ts +14 -1
  665. package/src/tools/verify/numeric.ts +367 -59
  666. package/src/tools/verify/perf.ts +171 -9
  667. package/src/tools/verify/scripts.ts +178 -26
  668. package/src/tools/web-fetch-surface.ts +22 -0
  669. package/src/tools/web-fetch.ts +26 -1
  670. package/src/tools/write.ts +45 -19
  671. package/src/worker/spec-contract.ts +27 -0
  672. package/dist/chunk-B6UM3OZC.js +0 -15
  673. package/dist/chunk-GJ24ODAX.js +0 -196
  674. package/dist/chunk-HRAKUPIH.js +0 -57
  675. package/dist/docs-BL7ROUFN.js +0 -292
@@ -42,23 +42,340 @@ export interface SafeCommandResult {
42
42
  file: string;
43
43
  args: string[];
44
44
  cwd: string;
45
+ /**
46
+ * Captured stdout. Without an output sink this is every byte up to the
47
+ * cap; with one it is the bounded head-and-tail rendering, and
48
+ * `stdoutRetained` says whether anything was omitted between them.
49
+ */
45
50
  stdout: string;
46
51
  stderr: string;
52
+ /** Effective exit code; incomplete group cleanup or pipe draining converts leader exit 0 to 1. */
47
53
  exitCode: number | null;
54
+ /** Actual leader outcome, or null if it had not exited at settlement. */
55
+ leaderExit?: { code: number | null; signal: NodeJS.Signals | null } | null;
48
56
  signal: NodeJS.Signals | null;
49
57
  aborted: boolean;
50
58
  timedOut: boolean;
51
59
  outputCapped: boolean;
52
60
  durationMs: number;
61
+ /** Wall-clock instant the child was spawned. Optional only so hand-built test doubles stay valid. */
62
+ startedAt?: number;
63
+ /** Exact bytes the child wrote to stdout, whether or not they were all retained. */
64
+ stdoutBytes?: number;
65
+ stderrBytes?: number;
66
+ /** True when `stdout` holds every byte the child wrote to it. */
67
+ stdoutRetained?: boolean;
68
+ stderrRetained?: boolean;
69
+ /** The output sink threw; forwarding stopped there and the child was terminated. */
70
+ sinkError?: string;
71
+ /** Members of the child's process group outlived the leader and the runner had to signal them. */
72
+ descendantsCleaned?: boolean;
73
+ /** Group members were still present when the post-SIGKILL bound passed; the runner stopped waiting for them. */
74
+ cleanupIncomplete?: boolean;
75
+ /** Owned output pipes did not drain before the post-exit deadline or cancellation. */
76
+ pipeDrainIncomplete?: boolean;
77
+ /** Diagnostic for incomplete cleanup; the effective exit code also reports failure to existing callers. */
78
+ failure?: string | null;
53
79
  }
54
80
 
81
+ /**
82
+ * Where a command's complete output goes when it must not live in memory. The
83
+ * runner forwards every chunk synchronously in arrival order and keeps only a
84
+ * bounded head and tail of each stream for the result. With a sink present
85
+ * the output cap does not apply: the sink is the unbounded destination and
86
+ * the retained windows are the memory bound.
87
+ */
88
+ export interface SafeCommandOutputSink {
89
+ onStdout?(chunk: Buffer): void;
90
+ onStderr?(chunk: Buffer): void;
91
+ /** Leading bytes of each stream kept on the result (default 4096). */
92
+ retainHeadBytes?: number;
93
+ /** Trailing bytes of each stream kept on the result (default 16384). */
94
+ retainTailBytes?: number;
95
+ }
96
+
97
+ export const SAFE_EXEC_DEFAULT_RETAIN_HEAD_BYTES = 4096;
98
+ export const SAFE_EXEC_DEFAULT_RETAIN_TAIL_BYTES = 16 * 1024;
99
+ /** Time the process group gets after SIGTERM before SIGKILL follows. */
100
+ export const SAFE_EXEC_DEFAULT_KILL_GRACE_MS = 3000;
101
+ /** After SIGKILL, how long the runner waits for the group to disappear before it gives up and says so. */
102
+ export const SAFE_EXEC_GROUP_TEARDOWN_BOUND_MS = 1000;
103
+ /** Maximum time to drain inherited output pipes after leader exit. */
104
+ export const SAFE_EXEC_PIPE_DRAIN_BOUND_MS = 1000;
105
+ const GROUP_POLL_INTERVAL_MS = 25;
106
+
55
107
  export interface RunCommandVectorOptions {
56
108
  cwd?: string;
57
109
  workspaceRoot?: string;
58
110
  timeoutMs?: number;
111
+ /** Combined stdout+stderr ceiling when no sink is given; crossing it kills the child. Ignored with a sink. */
59
112
  maxOutputBytes?: number;
60
113
  signal?: AbortSignal;
61
114
  env?: Record<string, string>;
115
+ output?: SafeCommandOutputSink;
116
+ /**
117
+ * Milliseconds between SIGTERM and SIGKILL when the runner stops the
118
+ * process group (default 3000). Zero sends both at once.
119
+ */
120
+ killGraceMs?: number;
121
+ }
122
+
123
+ /** Drop a trailing incomplete UTF-8 sequence so the bytes decode without a replacement character. */
124
+ function trimIncompleteUtf8Suffix(bytes: Buffer): Buffer {
125
+ const length = bytes.byteLength;
126
+ for (let back = 1; back <= 3 && back <= length; back += 1) {
127
+ const byte = bytes[length - back] as number;
128
+ if ((byte & 0xc0) === 0x80) continue;
129
+ const expected = byte >= 0xf0 ? 4 : byte >= 0xe0 ? 3 : byte >= 0xc0 ? 2 : 1;
130
+ return expected > back ? bytes.subarray(0, length - back) : bytes;
131
+ }
132
+ return bytes;
133
+ }
134
+
135
+ /** Drop leading continuation bytes so a window that starts mid-character decodes cleanly. */
136
+ function trimLeadingUtf8Continuation(bytes: Buffer): Buffer {
137
+ let start = 0;
138
+ while (start < bytes.byteLength && start < 4 && ((bytes[start] as number) & 0xc0) === 0x80) start += 1;
139
+ return start === 0 ? bytes : bytes.subarray(start);
140
+ }
141
+
142
+ export interface RetainedStreamRendering {
143
+ text: string;
144
+ /** True when the text carries every byte the stream produced. */
145
+ retained: boolean;
146
+ totalBytes: number;
147
+ omittedBytes: number;
148
+ }
149
+
150
+ /**
151
+ * Bounded head-and-tail window over a byte stream. Memory stays at
152
+ * head + tail + one chunk whatever the stream's length, and the rendering
153
+ * names exactly how many bytes fell between the two windows.
154
+ */
155
+ export interface RetainedStreamWindow {
156
+ append(chunk: Buffer): void;
157
+ readonly totalBytes: number;
158
+ render(): RetainedStreamRendering;
159
+ }
160
+
161
+ export function createRetainedStreamWindow(headCapBytes: number, tailCapBytes: number): RetainedStreamWindow {
162
+ const headCap = Math.max(0, Math.floor(headCapBytes));
163
+ const tailCap = Math.max(0, Math.floor(tailCapBytes));
164
+ const head: Buffer[] = [];
165
+ let headBytes = 0;
166
+ const tail: Buffer[] = [];
167
+ let tailBytes = 0;
168
+ let total = 0;
169
+ return {
170
+ get totalBytes() {
171
+ return total;
172
+ },
173
+ append(chunk) {
174
+ total += chunk.byteLength;
175
+ let rest = chunk;
176
+ if (headBytes < headCap) {
177
+ const take = Math.min(rest.byteLength, headCap - headBytes);
178
+ head.push(rest.subarray(0, take));
179
+ headBytes += take;
180
+ if (take === rest.byteLength) return;
181
+ rest = rest.subarray(take);
182
+ }
183
+ if (tailCap === 0) return;
184
+ tail.push(rest);
185
+ tailBytes += rest.byteLength;
186
+ while (tailBytes > tailCap && tail.length > 0) {
187
+ const first = tail[0] as Buffer;
188
+ const excess = tailBytes - tailCap;
189
+ if (first.byteLength <= excess) {
190
+ tail.shift();
191
+ tailBytes -= first.byteLength;
192
+ } else {
193
+ tail[0] = first.subarray(excess);
194
+ tailBytes -= excess;
195
+ }
196
+ }
197
+ },
198
+ render() {
199
+ if (total - headBytes - tailBytes <= 0) {
200
+ const text = Buffer.concat([...head, ...tail]).toString("utf8");
201
+ return { text, retained: true, totalBytes: total, omittedBytes: 0 };
202
+ }
203
+ // Bytes trimmed at a character boundary are absent from the text too,
204
+ // so the marker counts them with the span between the windows.
205
+ const headShown = trimIncompleteUtf8Suffix(Buffer.concat(head));
206
+ const tailShown = trimLeadingUtf8Continuation(Buffer.concat(tail));
207
+ const omitted = total - headShown.byteLength - tailShown.byteLength;
208
+ const headText = headShown.toString("utf8");
209
+ const tailText = tailShown.toString("utf8");
210
+ const marker = `[... ${omitted} bytes omitted ...]`;
211
+ const text = headText.length > 0 ? `${headText}\n${marker}\n${tailText}` : `${marker}\n${tailText}`;
212
+ return { text, retained: false, totalBytes: total, omittedBytes: omitted };
213
+ },
214
+ };
215
+ }
216
+
217
+ export interface ProcessGroupCleanupStatus {
218
+ /** The group still had members after the leader was reaped, and the runner signalled them. */
219
+ descendantsCleaned: boolean;
220
+ /** The teardown bound passed after SIGKILL with members still present; the runner stopped waiting. */
221
+ incomplete: boolean;
222
+ }
223
+
224
+ export interface ProcessGroupCleanupScheduler {
225
+ setTimeout(callback: () => void, delayMs: number): unknown;
226
+ clearTimeout(handle: unknown): void;
227
+ }
228
+
229
+ export interface ProcessGroupCleanupHooks {
230
+ /** Existence probe (`kill(-pgid, 0)`): true while any member remains, false only on ESRCH. */
231
+ probe(): boolean;
232
+ /**
233
+ * Deliver one signal to the group. Called only right after a probe that
234
+ * reported members. Returns false when the group was already gone (ESRCH),
235
+ * which closes the window exactly as a probe reporting ESRCH would.
236
+ */
237
+ signal(signalName: NodeJS.Signals): boolean;
238
+ /** Called exactly once, when the window closes; nothing is probed or signalled afterwards. */
239
+ onDone(status: ProcessGroupCleanupStatus): void;
240
+ /** Milliseconds between SIGTERM and SIGKILL; zero sends both in one step. */
241
+ graceMs: number;
242
+ /** Milliseconds to wait for members after SIGKILL before giving up (default 1000). */
243
+ teardownBoundMs?: number | undefined;
244
+ pollIntervalMs?: number | undefined;
245
+ scheduler?: ProcessGroupCleanupScheduler | undefined;
246
+ }
247
+
248
+ export interface ProcessGroupCleanup {
249
+ readonly done: boolean;
250
+ readonly status: ProcessGroupCleanupStatus | null;
251
+ /** A kill was requested (timeout, cancellation, cap, sink failure): open the window with SIGTERM now. */
252
+ kill(): void;
253
+ /** The leader was reaped: if members remain they are cleaned up on the same schedule until none are left. */
254
+ leaderExited(): void;
255
+ /** Stop without signalling and without `onDone`; for a child that never started. */
256
+ dispose(): void;
257
+ }
258
+
259
+ const SYSTEM_CLEANUP_SCHEDULER: ProcessGroupCleanupScheduler = {
260
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
261
+ clearTimeout: (handle) => clearTimeout(handle as ReturnType<typeof setTimeout>),
262
+ };
263
+
264
+ /**
265
+ * Bounded cleanup of one process group. The window opens at kill time or at
266
+ * leader exit, whichever comes first, and runs SIGTERM, grace, SIGKILL, then
267
+ * a bounded wait for the group to disappear. Every signal follows an
268
+ * existence probe in the same synchronous step, the first observation that
269
+ * the group is gone (ESRCH from a probe or from a signal) closes the window
270
+ * for good, and no path that runs after the window closed probes or signals
271
+ * again.
272
+ *
273
+ * Residual hazard, accepted: Linux keeps a PGID reserved while any member of
274
+ * the group lives, so a signal can only reach an unrelated group if every
275
+ * member dies between the probe and the signal that immediately follows it.
276
+ * `bash-exec.ts` and the ACP transport share this window; the gateway MCP
277
+ * client follows the same rules.
278
+ */
279
+ export function createProcessGroupCleanup(hooks: ProcessGroupCleanupHooks): ProcessGroupCleanup {
280
+ const scheduler = hooks.scheduler ?? SYSTEM_CLEANUP_SCHEDULER;
281
+ const graceMs = Math.max(0, hooks.graceMs);
282
+ const teardownBoundMs = Math.max(0, hooks.teardownBoundMs ?? SAFE_EXEC_GROUP_TEARDOWN_BOUND_MS);
283
+ const pollIntervalMs = Math.max(1, hooks.pollIntervalMs ?? GROUP_POLL_INTERVAL_MS);
284
+ let phase: "idle" | "terminating" | "killing" | "done" = "idle";
285
+ let leaderGone = false;
286
+ let descendantsCleaned = false;
287
+ let status: ProcessGroupCleanupStatus | null = null;
288
+ let graceTimer: unknown = null;
289
+ let boundTimer: unknown = null;
290
+ let pollTimer: unknown = null;
291
+
292
+ const isDone = (): boolean => phase === "done";
293
+
294
+ const clearTimers = (): void => {
295
+ for (const handle of [graceTimer, boundTimer, pollTimer]) if (handle !== null) scheduler.clearTimeout(handle);
296
+ graceTimer = null;
297
+ boundTimer = null;
298
+ pollTimer = null;
299
+ };
300
+
301
+ const complete = (incomplete: boolean): void => {
302
+ if (phase === "done") return;
303
+ phase = "done";
304
+ clearTimers();
305
+ status = { descendantsCleaned, incomplete };
306
+ hooks.onDone(status);
307
+ };
308
+
309
+ /** One probe. A group that is gone closes the window here; nothing is sent after this returns false. */
310
+ const membersRemain = (): boolean => {
311
+ if (hooks.probe()) return true;
312
+ complete(false);
313
+ return false;
314
+ };
315
+
316
+ /** One signal. ESRCH at delivery is the same observation as ESRCH from a probe and closes the window too. */
317
+ const deliver = (signalName: NodeJS.Signals): boolean => {
318
+ if (hooks.signal(signalName)) return true;
319
+ complete(false);
320
+ return false;
321
+ };
322
+
323
+ const escalate = (): void => {
324
+ graceTimer = null;
325
+ if (phase === "done" || !membersRemain()) return;
326
+ phase = "killing";
327
+ if (!deliver("SIGKILL")) return;
328
+ boundTimer = scheduler.setTimeout(() => {
329
+ boundTimer = null;
330
+ if (phase === "done") return;
331
+ if (membersRemain()) complete(true);
332
+ }, teardownBoundMs);
333
+ };
334
+
335
+ /** Open with SIGTERM. `probed` says the caller already saw members in this same synchronous step. */
336
+ const openWindow = (probed: boolean): void => {
337
+ if (phase !== "idle") return;
338
+ if (!probed && !membersRemain()) return;
339
+ phase = "terminating";
340
+ if (!deliver("SIGTERM")) return;
341
+ if (graceMs > 0) graceTimer = scheduler.setTimeout(escalate, graceMs);
342
+ else escalate();
343
+ };
344
+
345
+ const poll = (): void => {
346
+ pollTimer = scheduler.setTimeout(() => {
347
+ pollTimer = null;
348
+ if (phase === "done") return;
349
+ if (membersRemain()) poll();
350
+ }, pollIntervalMs);
351
+ };
352
+
353
+ return {
354
+ get done() {
355
+ return phase === "done";
356
+ },
357
+ get status() {
358
+ return status;
359
+ },
360
+ kill() {
361
+ if (phase === "done") return;
362
+ openWindow(false);
363
+ },
364
+ leaderExited() {
365
+ if (phase === "done" || leaderGone) return;
366
+ leaderGone = true;
367
+ if (!membersRemain()) return;
368
+ // Only descendants can be left now: the leader was reaped before this call.
369
+ descendantsCleaned = true;
370
+ openWindow(true);
371
+ if (!isDone()) poll();
372
+ },
373
+ dispose() {
374
+ if (phase === "done") return;
375
+ phase = "done";
376
+ clearTimers();
377
+ },
378
+ };
62
379
  }
63
380
 
64
381
  export function buildSafeToolEnv(
@@ -92,10 +409,30 @@ export function runCommandVector(
92
409
  options: RunCommandVectorOptions = {},
93
410
  ): Promise<SafeCommandResult> {
94
411
  return new Promise((resolve) => {
95
- const startedAt = performance.now();
412
+ const startedAtClock = performance.now();
413
+ const startedAt = Date.now();
96
414
  const cwd = resolveSafeCwd(options.cwd, options.workspaceRoot);
97
415
  const timeoutMs = clampTimerDelayMs(options.timeoutMs ?? SAFE_EXEC_DEFAULT_TIMEOUT_MS);
416
+ const killGraceMs = clampTimerDelayMs(options.killGraceMs ?? SAFE_EXEC_DEFAULT_KILL_GRACE_MS);
98
417
  const maxOutputBytes = options.maxOutputBytes ?? SAFE_EXEC_DEFAULT_MAX_OUTPUT_BYTES;
418
+ const sink = options.output;
419
+ const stdoutWindow =
420
+ sink === undefined
421
+ ? null
422
+ : createRetainedStreamWindow(
423
+ sink.retainHeadBytes ?? SAFE_EXEC_DEFAULT_RETAIN_HEAD_BYTES,
424
+ sink.retainTailBytes ?? SAFE_EXEC_DEFAULT_RETAIN_TAIL_BYTES,
425
+ );
426
+ const stderrWindow =
427
+ sink === undefined
428
+ ? null
429
+ : createRetainedStreamWindow(
430
+ sink.retainHeadBytes ?? SAFE_EXEC_DEFAULT_RETAIN_HEAD_BYTES,
431
+ sink.retainTailBytes ?? SAFE_EXEC_DEFAULT_RETAIN_TAIL_BYTES,
432
+ );
433
+ let stdoutBytes = 0;
434
+ let stderrBytes = 0;
435
+ let sinkError: string | null = null;
99
436
  const attribution = withManagedGitCommitAttributionEnvironment(buildSafeToolEnv(options.env), {
100
437
  cwd,
101
438
  enabled: gitCommitAttributionEnabled(process.env),
@@ -108,9 +445,38 @@ export function runCommandVector(
108
445
  let stdout = "";
109
446
  let stderr = "";
110
447
  let settled = false;
111
- let killSent = false;
448
+ const captured = (): Pick<
449
+ SafeCommandResult,
450
+ "stdout" | "stderr" | "stdoutBytes" | "stderrBytes" | "stdoutRetained" | "stderrRetained" | "sinkError"
451
+ > => {
452
+ if (stdoutWindow === null || stderrWindow === null) {
453
+ return {
454
+ stdout,
455
+ stderr,
456
+ stdoutBytes,
457
+ stderrBytes,
458
+ stdoutRetained: !outputCapped,
459
+ stderrRetained: !outputCapped,
460
+ ...(sinkError === null ? {} : { sinkError }),
461
+ };
462
+ }
463
+ const out = stdoutWindow.render();
464
+ const err = stderrWindow.render();
465
+ return {
466
+ stdout: out.text,
467
+ stderr: err.text,
468
+ stdoutBytes,
469
+ stderrBytes,
470
+ stdoutRetained: out.retained,
471
+ stderrRetained: err.retained,
472
+ ...(sinkError === null ? {} : { sinkError }),
473
+ };
474
+ };
112
475
  let timeoutId: ReturnType<typeof setTimeout> | null = null;
113
- let killGraceTimer: ReturnType<typeof setTimeout> | null = null;
476
+ let leaderExit: { code: number | null; signal: NodeJS.Signals | null } | null = null;
477
+ let closed = false;
478
+ let pipeDrainIncomplete = false;
479
+ let drainTimer: ReturnType<typeof setTimeout> | null = null;
114
480
 
115
481
  const child = spawn(file, [...args], {
116
482
  cwd,
@@ -119,36 +485,123 @@ export function runCommandVector(
119
485
  stdio: ["ignore", "pipe", "pipe"],
120
486
  });
121
487
 
122
- const clearKillGraceTimer = (): void => {
123
- if (killGraceTimer) clearTimeout(killGraceTimer);
124
- killGraceTimer = null;
488
+ const onAbort = (): void => {
489
+ aborted = true;
490
+ killChild();
491
+ if (leaderExit !== null) stopDraining();
492
+ };
493
+
494
+ // Where process groups exist the child leads its own, and the probe and
495
+ // the signals address the whole group. Elsewhere only the direct child
496
+ // is reachable, and "members remain" means the leader is still running.
497
+ const groupProbe = (): boolean => {
498
+ const pid = child.pid;
499
+ if (!pid) return false;
500
+ if (process.platform === "win32") return child.exitCode === null && child.signalCode === null;
501
+ try {
502
+ process.kill(-pid, 0);
503
+ return true;
504
+ } catch (error) {
505
+ // ESRCH means no member is left. EPERM means one exists that this
506
+ // process may not signal; it still counts as present.
507
+ return (error as NodeJS.ErrnoException).code !== "ESRCH";
508
+ }
125
509
  };
126
510
 
127
- const sendSignal = (signalName: NodeJS.Signals): void => {
511
+ const groupSignal = (signalName: NodeJS.Signals): boolean => {
128
512
  const pid = child.pid;
129
513
  if (pid && process.platform !== "win32") {
130
514
  try {
131
515
  process.kill(-pid, signalName);
132
- return;
133
- } catch {
134
- // Fall through to killing the direct child.
516
+ return true;
517
+ } catch (error) {
518
+ // ESRCH: the group vanished between the probe and this signal, so
519
+ // the window closes here. Anything else (EPERM) leaves members the
520
+ // runner cannot reach; retain the bounded cleanup window so its
521
+ // final probe reports what remains. Direct-child absence does not
522
+ // establish group absence.
523
+ if ((error as NodeJS.ErrnoException).code === "ESRCH") return false;
524
+ return true;
135
525
  }
136
526
  }
137
- child.kill(signalName);
527
+ // Without a group only the direct child is addressable; once it has
528
+ // exited there is nothing left to clean.
529
+ return child.kill(signalName);
138
530
  };
139
531
 
140
- const killChild = (): void => {
141
- if (killSent) return;
142
- killSent = true;
143
- sendSignal("SIGTERM");
144
- killGraceTimer = setTimeout(() => sendSignal("SIGKILL"), 3000);
532
+ const cleanup = createProcessGroupCleanup({
533
+ graceMs: killGraceMs,
534
+ probe: groupProbe,
535
+ signal: groupSignal,
536
+ onDone: () => tryFinish(),
537
+ });
538
+
539
+ const killChild = (): void => cleanup.kill();
540
+
541
+ const finish = (exitCode: number | null, signalName: NodeJS.Signals | null, spawnError?: Error): void => {
542
+ if (settled) return;
543
+ settled = true;
544
+ if (drainTimer) clearTimeout(drainTimer);
545
+ drainTimer = null;
546
+ if (timeoutId) clearTimeout(timeoutId);
547
+ timeoutId = null;
548
+ cleanup.dispose();
549
+ options.signal?.removeEventListener("abort", onAbort);
550
+ // Descendants may retain the write ends indefinitely. Release our read
551
+ // ends and process handle even when settlement bypasses close.
552
+ child.stdout?.destroy();
553
+ child.stderr?.destroy();
554
+ child.unref();
555
+ const output = captured();
556
+ resolve({
557
+ file,
558
+ args: [...args],
559
+ cwd,
560
+ ...output,
561
+ ...(pipeDrainIncomplete ? { stdoutRetained: false, stderrRetained: false } : {}),
562
+ stderr: output.stderr.length === 0 && spawnError !== undefined ? spawnError.message : output.stderr,
563
+ exitCode: (cleanup.status?.incomplete === true || pipeDrainIncomplete) && exitCode === 0 ? 1 : exitCode,
564
+ leaderExit,
565
+ signal: signalName,
566
+ aborted,
567
+ timedOut,
568
+ outputCapped,
569
+ durationMs: Math.round(performance.now() - startedAtClock),
570
+ startedAt,
571
+ descendantsCleaned: cleanup.status?.descendantsCleaned ?? false,
572
+ cleanupIncomplete: cleanup.status?.incomplete ?? false,
573
+ pipeDrainIncomplete,
574
+ failure:
575
+ cleanup.status?.incomplete === true
576
+ ? `process group cleanup incomplete: members were still present ${SAFE_EXEC_GROUP_TEARDOWN_BOUND_MS}ms after SIGKILL`
577
+ : pipeDrainIncomplete
578
+ ? "output pipe draining incomplete after leader exit; logs may be incomplete and escaped processes are not contained"
579
+ : null,
580
+ });
145
581
  };
146
582
 
147
- const onAbort = (): void => {
148
- aborted = true;
149
- killChild();
583
+ const stopDraining = (): void => {
584
+ if (settled) return;
585
+ if (!child.stdout?.readableEnded || !child.stderr?.readableEnded) {
586
+ pipeDrainIncomplete = true;
587
+ child.stdout?.destroy();
588
+ child.stderr?.destroy();
589
+ }
590
+ tryFinish();
150
591
  };
151
592
 
593
+ /**
594
+ * Settlement normally waits for both closed streams and group cleanup.
595
+ * An incomplete group teardown or pipe-drain deadline permits bounded
596
+ * settlement with the bytes received so far and an unsuccessful result.
597
+ * Neither path reopens group access after ESRCH.
598
+ */
599
+ function tryFinish(): void {
600
+ if (settled || !cleanup.done) return;
601
+ if (!closed && cleanup.status?.incomplete !== true && !pipeDrainIncomplete) return;
602
+ finish(leaderExit?.code ?? null, leaderExit?.signal ?? null);
603
+ }
604
+
152
605
  if (timeoutMs > 0) {
153
606
  timeoutId = setTimeout(() => {
154
607
  timedOut = true;
@@ -159,6 +612,26 @@ export function runCommandVector(
159
612
  else options.signal?.addEventListener("abort", onAbort, { once: true });
160
613
 
161
614
  const appendChunk = (target: "stdout" | "stderr", chunk: Buffer): void => {
615
+ if (settled) return;
616
+ // Every byte the child wrote counts, whatever happens to it next: the
617
+ // counters say what was received, the retained flags say what was kept.
618
+ if (target === "stdout") stdoutBytes += chunk.byteLength;
619
+ else stderrBytes += chunk.byteLength;
620
+ if (sink !== undefined && stdoutWindow !== null && stderrWindow !== null) {
621
+ // The bounded window keeps observing so the result's tail and the
622
+ // retained flag stay honest; a failed sink receives nothing more.
623
+ (target === "stdout" ? stdoutWindow : stderrWindow).append(chunk);
624
+ if (sinkError !== null) return;
625
+ try {
626
+ if (target === "stdout") sink.onStdout?.(chunk);
627
+ else sink.onStderr?.(chunk);
628
+ } catch (error) {
629
+ sinkError = error instanceof Error ? error.message : String(error);
630
+ killChild();
631
+ }
632
+ return;
633
+ }
634
+ if (outputCapped) return;
162
635
  outputBytes += chunk.byteLength;
163
636
  if (outputBytes > maxOutputBytes) {
164
637
  outputCapped = true;
@@ -171,45 +644,22 @@ export function runCommandVector(
171
644
 
172
645
  child.stdout?.on("data", (chunk: Buffer) => appendChunk("stdout", chunk));
173
646
  child.stderr?.on("data", (chunk: Buffer) => appendChunk("stderr", chunk));
174
- child.on("error", (error) => {
175
- if (settled) return;
176
- settled = true;
647
+ child.on("error", (error) => finish(null, null, error));
648
+ child.on("exit", (code, signalName) => {
649
+ if (settled || leaderExit !== null) return;
650
+ leaderExit = { code, signal: signalName };
651
+ // Execution timeout ends here, but cancellation remains active through
652
+ // settlement. Escaped descendants can retain pipes after group ESRCH.
177
653
  if (timeoutId) clearTimeout(timeoutId);
178
- clearKillGraceTimer();
179
- options.signal?.removeEventListener("abort", onAbort);
180
- resolve({
181
- file,
182
- args: [...args],
183
- cwd,
184
- stdout,
185
- stderr: stderr.length > 0 ? stderr : error.message,
186
- exitCode: null,
187
- signal: null,
188
- aborted,
189
- timedOut,
190
- outputCapped,
191
- durationMs: Math.round(performance.now() - startedAt),
192
- });
654
+ timeoutId = null;
655
+ drainTimer = setTimeout(stopDraining, SAFE_EXEC_PIPE_DRAIN_BOUND_MS);
656
+ cleanup.leaderExited();
657
+ if (aborted) stopDraining();
193
658
  });
194
- child.on("close", (code, signalName) => {
195
- if (settled) return;
196
- settled = true;
197
- if (timeoutId) clearTimeout(timeoutId);
198
- clearKillGraceTimer();
199
- options.signal?.removeEventListener("abort", onAbort);
200
- resolve({
201
- file,
202
- args: [...args],
203
- cwd,
204
- stdout,
205
- stderr,
206
- exitCode: code,
207
- signal: signalName,
208
- aborted,
209
- timedOut,
210
- outputCapped,
211
- durationMs: Math.round(performance.now() - startedAt),
212
- });
659
+ child.on("close", () => {
660
+ if (settled || closed) return;
661
+ closed = true;
662
+ tryFinish();
213
663
  });
214
664
  });
215
665
  }
@@ -146,11 +146,13 @@ export function withModelSkillActivation(
146
146
 
147
147
  /**
148
148
  * Tools admitted regardless of any active skill narrowing: context so the
149
- * remaining requested skills of the same turn can still load, and ask_user as
149
+ * remaining requested skills of the same turn can still load, ask_user as
150
150
  * the escape hatch the block message points at when a workflow genuinely
151
- * needs a tool its skill did not declare.
151
+ * needs a tool its skill did not declare, and gateway because find and
152
+ * describe are harmless and a gateway call is checked again, under the
153
+ * capability's own name, by the nested admission it makes.
152
154
  */
153
- const SKILL_SURFACE_EXEMPT_TOOLS: ReadonlySet<string> = new Set(["context", "ask_user"]);
155
+ const SKILL_SURFACE_EXEMPT_TOOLS: ReadonlySet<string> = new Set(["context", "ask_user", "gateway"]);
154
156
 
155
157
  export interface SkillToolSurfaceViolation {
156
158
  /** Every loaded skill that contributed a declaration to the merged surface. */