@iowarp/clio-coder 0.4.8 → 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 (513) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/README.md +7 -6
  3. package/dist/{acp-JWPQZM2D.js → acp-ZWZCPS2A.js} +13 -13
  4. package/dist/{agents-4GCDIRVX.js → agents-LYSOWZUE.js} +53 -52
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-SYAKTDQE.js → auth-WBQGKWQ5.js} +27 -27
  7. package/dist/{background-OW67WMYR.js → background-BUMOBAQN.js} +4 -4
  8. package/dist/{builtins-TKS63VNV.js → builtins-ODRJOEDI.js} +7 -7
  9. package/dist/{chunk-JLBVCROW.js → chunk-2DRRZ57Q.js} +33 -24
  10. package/dist/chunk-2JBZYUPY.js +105 -0
  11. package/dist/chunk-2KUBKL63.js +336 -0
  12. package/dist/{chunk-K45LHSCI.js → chunk-2VBWFXYE.js} +7 -3
  13. package/dist/{chunk-XTLJDC2X.js → chunk-2X2R3UTH.js} +23 -18
  14. package/dist/{chunk-5HULHKT2.js → chunk-37LW32LZ.js} +5 -5
  15. package/dist/{chunk-W7KNI3F5.js → chunk-3AND2EFU.js} +5 -5
  16. package/dist/{chunk-36XSBPXL.js → chunk-3RDHGNU7.js} +95 -27
  17. package/dist/{chunk-BIY22UUK.js → chunk-3SUDBGEI.js} +11 -10
  18. package/dist/{chunk-3IQOZRQ6.js → chunk-3TQN67I2.js} +7 -7
  19. package/dist/{chunk-KWJXCL2X.js → chunk-3U4BL2EV.js} +3 -3
  20. package/dist/{chunk-RBES4TCZ.js → chunk-3UQADNG2.js} +3 -3
  21. package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
  22. package/dist/{chunk-MWMW53WW.js → chunk-4ATBOFRP.js} +649 -193
  23. package/dist/{chunk-QGIC5SX5.js → chunk-4DNL43EZ.js} +3 -3
  24. package/dist/{chunk-GVU4CXPJ.js → chunk-4HFJKRGZ.js} +113 -54
  25. package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
  26. package/dist/{chunk-LZDLYSUN.js → chunk-5RTEFNBP.js} +3 -3
  27. package/dist/{chunk-HMGAKB7E.js → chunk-64XJW7NT.js} +15 -15
  28. package/dist/{chunk-EXKUF426.js → chunk-7FBCRWVT.js} +280 -280
  29. package/dist/{chunk-K3W6BF5C.js → chunk-7JSOSVLP.js} +2 -2
  30. package/dist/{chunk-WFTSK7N3.js → chunk-7N3OLLSL.js} +4 -4
  31. package/dist/{chunk-JRA6OBHY.js → chunk-A6DULIMH.js} +17 -5
  32. package/dist/{chunk-R5NRX5N4.js → chunk-AB3QXXBC.js} +2 -2
  33. package/dist/chunk-ACCECAH4.js +49 -0
  34. package/dist/{chunk-GJBJHJNY.js → chunk-AM6CEP2K.js} +5 -5
  35. package/dist/{chunk-MUXNDNMZ.js → chunk-AY4XE6GN.js} +19 -13
  36. package/dist/{chunk-MATCRH3M.js → chunk-BBA2TAWV.js} +9 -9
  37. package/dist/{chunk-PMUUAABD.js → chunk-BMNVVKEW.js} +9 -9
  38. package/dist/{chunk-TOPICHGR.js → chunk-CTGZCEI6.js} +2 -2
  39. package/dist/{chunk-L75H5B3B.js → chunk-DIAJYJYG.js} +2 -2
  40. package/dist/{chunk-JIMWEYWO.js → chunk-EHZRAB4U.js} +2 -2
  41. package/dist/{chunk-YXANQGCX.js → chunk-EM2DIQAJ.js} +6 -6
  42. package/dist/{chunk-JCVIL6TY.js → chunk-ETF4ROKH.js} +4 -4
  43. package/dist/{chunk-5W4FRA5Q.js → chunk-F2YM3JY4.js} +483 -253
  44. package/dist/{chunk-YGIV24MF.js → chunk-FEBQWHJT.js} +21 -16
  45. package/dist/{chunk-PGEFOTJB.js → chunk-FPS4R2RN.js} +5 -4
  46. package/dist/{chunk-XC5POIL4.js → chunk-G5R53COU.js} +1 -1
  47. package/dist/chunk-GHXGMFQ5.js +40 -0
  48. package/dist/{chunk-QLKCCC2J.js → chunk-GJDRMBDI.js} +14 -14
  49. package/dist/{chunk-2ZWLMA3T.js → chunk-GREYLTZ5.js} +7 -7
  50. package/dist/{chunk-YXFKLMX2.js → chunk-H2WSCZZT.js} +22 -6
  51. package/dist/{chunk-FNVPQQYT.js → chunk-H6IUCY6Q.js} +2 -2
  52. package/dist/{chunk-5C2OQHLR.js → chunk-H72DCH3E.js} +92 -203
  53. package/dist/{chunk-JYKUMHCQ.js → chunk-H7TXJR23.js} +21 -21
  54. package/dist/chunk-HBJQQTKM.js +40 -0
  55. package/dist/chunk-HCVKSGNZ.js +990 -0
  56. package/dist/{chunk-ARRUMZ7X.js → chunk-I47EJPYL.js} +3 -3
  57. package/dist/{chunk-YKIIWURD.js → chunk-IALGWTLO.js} +3 -3
  58. package/dist/{chunk-FB3KTE2J.js → chunk-IALZJE37.js} +4 -4
  59. package/dist/{chunk-RAUOKUZV.js → chunk-IC7JXLOM.js} +15 -10
  60. package/dist/{chunk-LLCGGVSW.js → chunk-IOSVTTCD.js} +7 -7
  61. package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
  62. package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
  63. package/dist/{chunk-UDAK6GR2.js → chunk-JIYWMQZ5.js} +2 -2
  64. package/dist/{chunk-O3HSB2YL.js → chunk-JKU34ACI.js} +2 -2
  65. package/dist/{chunk-6X7VOCDY.js → chunk-JTR3VSV3.js} +3 -3
  66. package/dist/{chunk-O2QJDRWP.js → chunk-JU6MAMRJ.js} +4 -4
  67. package/dist/chunk-JURMQWVJ.js +15 -0
  68. package/dist/{chunk-STC6CWUZ.js → chunk-K3XN4LZ4.js} +5 -5
  69. package/dist/{chunk-ATB3Q7YO.js → chunk-KIVFXGBM.js} +27 -2
  70. package/dist/{chunk-WJWNZXRM.js → chunk-KOAHT3N2.js} +2 -2
  71. package/dist/chunk-KP5BPXR3.js +73 -0
  72. package/dist/{chunk-K53E2PTW.js → chunk-KRJQG47M.js} +3 -3
  73. package/dist/{chunk-IILXVWJY.js → chunk-KW6OJ7IY.js} +19 -21
  74. package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
  75. package/dist/{chunk-2U2U5POA.js → chunk-L4RUTLRL.js} +5 -5
  76. package/dist/{chunk-QYSAZMSH.js → chunk-LGTVWPRN.js} +2 -2
  77. package/dist/{chunk-KGP3UQGJ.js → chunk-LSQW6KZO.js} +5 -5
  78. package/dist/{chunk-P4JS3MH5.js → chunk-LWJYOHT3.js} +8 -8
  79. package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
  80. package/dist/{chunk-5D2FNBMG.js → chunk-MJ4QEJVT.js} +2 -2
  81. package/dist/{chunk-RM3XJX7P.js → chunk-MO65K5CH.js} +5 -5
  82. package/dist/{chunk-H5DPSUBB.js → chunk-MTOZEQHL.js} +3 -3
  83. package/dist/{chunk-6R5MBXBJ.js → chunk-NBPA5QM6.js} +2 -2
  84. package/dist/{chunk-H77XBUBM.js → chunk-NMBEW4PP.js} +3 -3
  85. package/dist/{chunk-QWUSS2QP.js → chunk-NPLLK3HO.js} +67 -87
  86. package/dist/{chunk-K5UJD6MM.js → chunk-NSYGPIVW.js} +5 -5
  87. package/dist/{context-EZZPT2ZV.js → chunk-NXTV5OI5.js} +30 -84
  88. package/dist/{chunk-F7Y6QTPL.js → chunk-NYDG4QP4.js} +4 -4
  89. package/dist/{chunk-PFZJMXIY.js → chunk-OA2GDACN.js} +2 -2
  90. package/dist/{chunk-Q32C6AWI.js → chunk-PJI57EC6.js} +4 -4
  91. package/dist/{chunk-EFXMQYI6.js → chunk-PJJBUGMR.js} +52 -52
  92. package/dist/{chunk-ICYIUNO4.js → chunk-PNJE7JPS.js} +18 -3
  93. package/dist/chunk-PP23PZEV.js +1347 -0
  94. package/dist/chunk-PPIFDSBK.js +409 -0
  95. package/dist/{chunk-RFULVPBX.js → chunk-PTFISXQO.js} +6 -5
  96. package/dist/{chunk-JV25I7ID.js → chunk-QB33Z5S7.js} +5 -5
  97. package/dist/{chunk-D55WO5J7.js → chunk-QGNII5VC.js} +8 -8
  98. package/dist/{chunk-RKFNU5UA.js → chunk-QI72X67S.js} +104 -27
  99. package/dist/chunk-QKHZZFKH.js +98 -0
  100. package/dist/{chunk-5UG6EZI3.js → chunk-RDKX2PME.js} +4 -4
  101. package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
  102. package/dist/{chunk-BE4I3UJ2.js → chunk-RQROVOV3.js} +15 -13
  103. package/dist/{chunk-TEHVMHOK.js → chunk-S34A7BSP.js} +3 -3
  104. package/dist/{chunk-4P6M2TTE.js → chunk-SJETVJHX.js} +2 -2
  105. package/dist/{chunk-OPC4DQD6.js → chunk-SJMNU4ZS.js} +2 -2
  106. package/dist/{chunk-2JSCCEKO.js → chunk-SLLG2G44.js} +2 -2
  107. package/dist/{chunk-EPYATQMG.js → chunk-SQAZN2V3.js} +42 -16
  108. package/dist/{chunk-E2NSPYLC.js → chunk-SQBT46OF.js} +5 -5
  109. package/dist/{chunk-WTZVSMQZ.js → chunk-TCUOGIL2.js} +5 -5
  110. package/dist/{chunk-RRZFRIJP.js → chunk-TIWPKCVO.js} +5 -5
  111. package/dist/{chunk-QLAGXTTV.js → chunk-UIU7MGZ3.js} +5 -1
  112. package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
  113. package/dist/{chunk-PJ5H5B7A.js → chunk-VPWGADBG.js} +18 -18
  114. package/dist/{chunk-GEYX2NZ5.js → chunk-VWFCAK34.js} +6 -6
  115. package/dist/{chunk-44U2OUSM.js → chunk-W72LLZAV.js} +2 -2
  116. package/dist/{chunk-ORRNGQDV.js → chunk-WGRDABW7.js} +4 -4
  117. package/dist/{chunk-RNLAPBJL.js → chunk-XFLSL7BT.js} +2 -2
  118. package/dist/{chunk-2SXGG2IV.js → chunk-XJZEDCNT.js} +6 -6
  119. package/dist/{chunk-UB33F3YW.js → chunk-XLLEL3K7.js} +5 -5
  120. package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
  121. package/dist/{chunk-WS4FOGLY.js → chunk-XNZWWDC3.js} +2 -2
  122. package/dist/{chunk-P7GTE4FX.js → chunk-XRECG65F.js} +2 -2
  123. package/dist/chunk-XTQ7MEJG.js +457 -0
  124. package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
  125. package/dist/{chunk-OEMFEL26.js → chunk-Y3M2T5RO.js} +3 -3
  126. package/dist/{chunk-HP7KJ5O2.js → chunk-YPQOPFP7.js} +6 -6
  127. package/dist/{chunk-MEHBW2SP.js → chunk-YQYINEJI.js} +6 -6
  128. package/dist/{chunk-RXI7K4J5.js → chunk-ZF6CV4WZ.js} +1338 -217
  129. package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
  130. package/dist/{chunk-526ABLHD.js → chunk-ZKQ63XZ5.js} +12 -35
  131. package/dist/{chunk-PAQVETLA.js → chunk-ZKVMDNAN.js} +5 -5
  132. package/dist/cli/index.js +47 -37
  133. package/dist/{clio-BPBAPZGA.js → clio-JUDCLNHC.js} +7 -7
  134. package/dist/clio-context-tools-FT672MNZ.js +136 -0
  135. package/dist/{code-nav-KBQ3RIFK.js → code-nav-7OVCTP2Z.js} +28 -26
  136. package/dist/{components-6DKAXWFN.js → components-OZXZMDWU.js} +5 -5
  137. package/dist/{config-FWL5JK2H.js → config-P3ZQVF63.js} +80 -75
  138. package/dist/{config-graph-ACDB26L2.js → config-graph-GKAOBAS5.js} +74 -70
  139. package/dist/{configure-ZIZ4YV62.js → configure-25LRYZJG.js} +45 -44
  140. package/dist/context-72VQV7JX.js +73 -0
  141. package/dist/{context-VIL5MFRH.js → context-COWRWXP3.js} +74 -70
  142. package/dist/{context-Z3GOBHDK.js → context-WB3D474G.js} +12 -12
  143. package/dist/{context-clear-ZPB3L7MN.js → context-clear-Y4LYMWC6.js} +70 -66
  144. package/dist/{context-working-set-2GLBVF7L.js → context-working-set-TMZYVC7A.js} +15 -14
  145. package/dist/data-tool-KMBWKKWR.js +2987 -0
  146. package/dist/{detail-VSBWYSGZ.js → detail-4GLROGY5.js} +71 -67
  147. package/dist/{dispatch-runner-EEEHGKX4.js → dispatch-runner-TR3LBP5P.js} +92 -88
  148. package/dist/{docs-VMMWFVHL.js → docs-ZK777W2G.js} +3 -3
  149. package/dist/{doctor-V5L4IQGP.js → doctor-WC4OV2OB.js} +61 -59
  150. package/dist/{eval-VJYJ2BV3.js → eval-FUNWJNUJ.js} +45 -45
  151. package/dist/{evals-J2H5V6DD.js → evals-L73EBHSU.js} +4 -4
  152. package/dist/{evidence-Y35YSXH6.js → evidence-AVJ2RTHX.js} +80 -76
  153. package/dist/{evidence-POWAEBEW.js → evidence-P4NZOAK7.js} +70 -66
  154. package/dist/{evidence-XCCCLS36.js → evidence-Y55WKYHH.js} +79 -75
  155. package/dist/{evolve-GPG72VB6.js → evolve-MAWKRYWF.js} +75 -71
  156. package/dist/{extensions-YIZ7W3DA.js → extensions-PYQH3H47.js} +8 -8
  157. package/dist/{fleet-2MDCQ2VK.js → fleet-M4H2QBWT.js} +84 -80
  158. package/dist/{fleet-W2AF3TOJ.js → fleet-ULBXXRDR.js} +123 -119
  159. package/dist/{fleet-commands-WS56G26H.js → fleet-commands-7NNC4JZU.js} +17 -16
  160. package/dist/{fleet-decisions-MYGZ3JW7.js → fleet-decisions-EHEY7KPU.js} +9 -9
  161. package/dist/{fleet-graph-ELTBXBAV.js → fleet-graph-LQ2AHZT3.js} +15 -15
  162. package/dist/{fleet-inspect-45IK73L4.js → fleet-inspect-5IGBIIYZ.js} +76 -72
  163. package/dist/{fleet-preflight-T5NCZKHE.js → fleet-preflight-UTTNOKMG.js} +7 -2
  164. package/dist/{fleet-validate-VG4JBLA4.js → fleet-validate-YGILJKA6.js} +20 -20
  165. package/dist/{fleet-verify-VTSABAYO.js → fleet-verify-AUWTCDKR.js} +70 -66
  166. package/dist/{fleet-view-XC7WMKSS.js → fleet-view-TGUFCY5A.js} +73 -69
  167. package/dist/{init-VTJNNTIP.js → init-GFN2Z7NF.js} +94 -90
  168. package/dist/{interop-IU6BNA7C.js → interop-EF5JUWWK.js} +21 -21
  169. package/dist/{inventory-QPQUTUUZ.js → inventory-I6VJDDYF.js} +73 -69
  170. package/dist/{library-Q3NWL5CM.js → library-3J5IO2OJ.js} +13 -13
  171. package/dist/{library-LF7DLU6S.js → library-IJTOFTDS.js} +16 -15
  172. package/dist/{library-HUTAS57T.js → library-Z3KZSHPE.js} +27 -27
  173. package/dist/{library-import-PPW4YUC5.js → library-import-IMKFLDHX.js} +21 -21
  174. package/dist/{library-inventory-DIRVFRZU.js → library-inventory-CQP5D6GU.js} +13 -13
  175. package/dist/{library-validation-XHUZ3INE.js → library-validation-33UTX7AI.js} +11 -11
  176. package/dist/mcp-5FWZKUS6.js +26 -0
  177. package/dist/{memory-Z2LSKNV6.js → memory-36CWN67Y.js} +75 -71
  178. package/dist/{models-3FTREYPY.js → models-KQ6PQJJQ.js} +49 -49
  179. package/dist/{monitor-HF2MQRB3.js → monitor-XX6ZD6KC.js} +83 -79
  180. package/dist/{orchestrator-UYPA6W4S.js → orchestrator-SK6HDAOP.js} +1337 -772
  181. package/dist/{panes-736XB73K.js → panes-L27QRXUH.js} +12 -12
  182. package/dist/{panes-C4P3PIWT.js → panes-LXZIWNOZ.js} +4 -4
  183. package/dist/{paths-JQ4QYIYB.js → paths-7DJDU4P4.js} +5 -5
  184. package/dist/{preload-XSLRYH3Y.js → preload-K2TDYI4Y.js} +70 -66
  185. package/dist/{reset-V7QSPZYE.js → reset-73VU3XNT.js} +10 -10
  186. package/dist/{resources-OJGDFHYT.js → resources-3BYJYVYL.js} +16 -16
  187. package/dist/{run-T354SMDW.js → run-AR7PY6GW.js} +132 -128
  188. package/dist/run-script-H2KUDIII.js +41 -0
  189. package/dist/{settings-MWZXO6RV.js → settings-3VMBMWID.js} +4 -4
  190. package/dist/{share-Y5ZKJPND.js → share-HVWH4FPF.js} +21 -21
  191. package/dist/{skills-4GLZC4LN.js → skills-5TYEY75Q.js} +22 -22
  192. package/dist/{skills-eval-L5T7GODM.js → skills-eval-CK3MD63Z.js} +96 -87
  193. package/dist/{skills-inventory-LASKXEZI.js → skills-inventory-KSFYG3I6.js} +16 -16
  194. package/dist/{slash-commands-OIMRU36D.js → slash-commands-DMVHML7P.js} +47 -44
  195. package/dist/{steer-KMAM2Y2C.js → steer-XCD6V3EW.js} +4 -4
  196. package/dist/{support-AWC3XKPX.js → support-JAZL6VBR.js} +7 -7
  197. package/dist/{system-CD75NYBU.js → system-3TDQRMZZ.js} +26 -26
  198. package/dist/{targets-VSZX2J2S.js → targets-EZKHAYRN.js} +66 -65
  199. package/dist/{tasks-AN567LYH.js → tasks-SNEFHWYW.js} +12 -12
  200. package/dist/{terminal-lease-6KTWNHVY.js → terminal-lease-BNLFA4OF.js} +8 -7
  201. package/dist/{tools-AGRK3V5J.js → tools-7IM6BDCE.js} +12 -12
  202. package/dist/{trace-P4MQZD33.js → trace-C3MBGD4S.js} +8 -8
  203. package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
  204. package/dist/{uninstall-BRUTEPIC.js → uninstall-WWLOSZ42.js} +10 -10
  205. package/dist/{upgrade-SBCGHQGJ.js → upgrade-ETK2JNSJ.js} +37 -47
  206. package/dist/{usage-BIDVTO6V.js → usage-S2HOB7BZ.js} +93 -89
  207. package/dist/{verifiers-LTGCAMXS.js → verifiers-QDTEVH7R.js} +24 -22
  208. package/dist/{verify-OZU4LLNP.js → verify-SUKUK6XM.js} +15 -14
  209. package/dist/web/client/assets/{abnfDiagram-VCTEODGH-C5wfoHm3.js → abnfDiagram-VCTEODGH-BznNOe_I.js} +1 -1
  210. package/dist/web/client/assets/{arc-oH91sfLl.js → arc-Pry-7G1_.js} +1 -1
  211. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
  212. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
  213. package/dist/web/client/assets/{blockDiagram-I7D4REHJ-wi0_CYHL.js → blockDiagram-I7D4REHJ-prINbpbM.js} +1 -1
  214. package/dist/web/client/assets/{c4Diagram-7LVT6UL2-DV7NYc2W.js → c4Diagram-7LVT6UL2-DkVRKtyU.js} +1 -1
  215. package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
  216. package/dist/web/client/assets/{chunk-4HAMMTFA-Bhsegh3F.js → chunk-4HAMMTFA-CV0Z1ApC.js} +1 -1
  217. package/dist/web/client/assets/{chunk-75Z2AOVW-RQCckcQG.js → chunk-75Z2AOVW-D34Nohxq.js} +1 -1
  218. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
  219. package/dist/web/client/assets/{chunk-F27PBJKO-BcNqv2x1.js → chunk-F27PBJKO-CmRojxkG.js} +1 -1
  220. package/dist/web/client/assets/{chunk-GMAD6QVW-Bq8JWiZT.js → chunk-GMAD6QVW-ClYZmc73.js} +1 -1
  221. package/dist/web/client/assets/{chunk-GVQU2GXP-DbchrAeJ.js → chunk-GVQU2GXP-B2BiHFt-.js} +1 -1
  222. package/dist/web/client/assets/{chunk-IMKFNOWR-DrpvjocK.js → chunk-IMKFNOWR-BGApZ8nP.js} +1 -1
  223. package/dist/web/client/assets/{chunk-L3NEJ4N5-DHLmTnCe.js → chunk-L3NEJ4N5-DIzCgpkY.js} +1 -1
  224. package/dist/web/client/assets/{chunk-OSK3NFVY-CsRbtN9n.js → chunk-OSK3NFVY-BPT-yePv.js} +1 -1
  225. package/dist/web/client/assets/{chunk-P2QGCYS3-aqPbxoMh.js → chunk-P2QGCYS3-BC1WTc2t.js} +1 -1
  226. package/dist/web/client/assets/{chunk-POPQ4Y6H-Dl5vw0h0.js → chunk-POPQ4Y6H-BSjzBmZU.js} +1 -1
  227. package/dist/web/client/assets/{chunk-PWAF6VOD-D7OBRSdO.js → chunk-PWAF6VOD-BIjLs86Z.js} +1 -1
  228. package/dist/web/client/assets/{chunk-SHT3W25Y-CdKCIwuB.js → chunk-SHT3W25Y-CduDz2cm.js} +1 -1
  229. package/dist/web/client/assets/{chunk-SVP7TREG-B94Nu_1-.js → chunk-SVP7TREG-XUn4pPAP.js} +1 -1
  230. package/dist/web/client/assets/{chunk-TICWLB2K-jjRQI_hk.js → chunk-TICWLB2K-DcBy2DKy.js} +1 -1
  231. package/dist/web/client/assets/{chunk-XXDRQBXY-azkbKE37.js → chunk-XXDRQBXY-DqAYeljN.js} +1 -1
  232. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
  233. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
  234. package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
  235. package/dist/web/client/assets/{cynefin-OW5HDTMX--i9RDU5f.js → cynefin-OW5HDTMX-BecPbyM6.js} +1 -1
  236. package/dist/web/client/assets/{cynefinDiagram-5FMLGOSQ-cRcvyBdp.js → cynefinDiagram-5FMLGOSQ-BzMzFwyT.js} +1 -1
  237. package/dist/web/client/assets/{dagre-GXQ25YYZ-C9mZmAPe.js → dagre-GXQ25YYZ-CAWJmRMG.js} +1 -1
  238. package/dist/web/client/assets/{diagram-S7CK7UJ4-Oj_zlLDY.js → diagram-S7CK7UJ4--lp0ALmn.js} +1 -1
  239. package/dist/web/client/assets/{diagram-UQ7AKVKN-BWKbbfcR.js → diagram-UQ7AKVKN-gKUnsjcj.js} +1 -1
  240. package/dist/web/client/assets/{diagram-VSXAHHWV-C3N3f7DO.js → diagram-VSXAHHWV-BoN5D1Gh.js} +1 -1
  241. package/dist/web/client/assets/{diagram-VX7I27RA-CtDKDAWe.js → diagram-VX7I27RA-BMtuswQ6.js} +1 -1
  242. package/dist/web/client/assets/{diagram-Z3DM3KII-B8bkBRCz.js → diagram-Z3DM3KII-DtU8LXrA.js} +1 -1
  243. package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
  244. package/dist/web/client/assets/{ebnfDiagram-PWID7BFC-CskW-Whx.js → ebnfDiagram-PWID7BFC-DDcnv9BH.js} +1 -1
  245. package/dist/web/client/assets/{erDiagram-RLTQ6QDP-C-83cgCW.js → erDiagram-RLTQ6QDP-DvRb4iDL.js} +1 -1
  246. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
  247. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
  248. package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
  249. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
  250. package/dist/web/client/assets/{gitGraph-4MIJSDKK-B40cQtBE.js → gitGraph-4MIJSDKK-DjD_AAMj.js} +1 -1
  251. package/dist/web/client/assets/{gitGraphDiagram-WWUBYQGX-CH-7P7Di.js → gitGraphDiagram-WWUBYQGX-CDyN9n2u.js} +1 -1
  252. package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
  253. package/dist/web/client/assets/{info-A6RAGUB7-eCCE9D_Q.js → info-A6RAGUB7-C_XK8Hq0.js} +1 -1
  254. package/dist/web/client/assets/{infoDiagram-27XIBGKW-DRnvqMjM.js → infoDiagram-27XIBGKW-DIe4tJ1i.js} +1 -1
  255. package/dist/web/client/assets/{ishikawaDiagram-5VMMS53U-DBA_55wp.js → ishikawaDiagram-5VMMS53U-CVl5unKI.js} +1 -1
  256. package/dist/web/client/assets/{journeyDiagram-3NMN7TZE-C-ewpNl7.js → journeyDiagram-3NMN7TZE-CPEB1Vt8.js} +1 -1
  257. package/dist/web/client/assets/{kanban-definition-UXKFOSKX-B1taGsu0.js → kanban-definition-UXKFOSKX-j-9WXjYQ.js} +1 -1
  258. package/dist/web/client/assets/{line-lZ0kyxDI.js → line-BIDAcEtX.js} +1 -1
  259. package/dist/web/client/assets/{linear-DIc8FgZj.js → linear-SzVmGSw4.js} +1 -1
  260. package/dist/web/client/assets/{mermaid-parser.core-SXolxpXw.js → mermaid-parser.core-Ux4vssh0.js} +3 -3
  261. package/dist/web/client/assets/{mermaid.core-DXgQtkNg.js → mermaid.core-CDuwVKeh.js} +4 -4
  262. package/dist/web/client/assets/{mindmap-definition-YA3MSWOX-DXJas9K7.js → mindmap-definition-YA3MSWOX-5MlQEeQ6.js} +1 -1
  263. package/dist/web/client/assets/{packet-AYTQ26CC-OqVl_07o.js → packet-AYTQ26CC-DRO66c9Q.js} +1 -1
  264. package/dist/web/client/assets/{pegDiagram-XKGWAZYB-CPE_zdfN.js → pegDiagram-XKGWAZYB-BakZnSjM.js} +1 -1
  265. package/dist/web/client/assets/{pie-WAS4IAKB-DAxnMBLe.js → pie-WAS4IAKB-BEzcmhz8.js} +1 -1
  266. package/dist/web/client/assets/{pieDiagram-E7YTZNPT-Uwjpufxv.js → pieDiagram-E7YTZNPT-DpmqgoPt.js} +1 -1
  267. package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
  268. package/dist/web/client/assets/{quadrantDiagram-AXDQQJYC-Bjs4yjgs.js → quadrantDiagram-AXDQQJYC-DuMPwwV2.js} +1 -1
  269. package/dist/web/client/assets/{radar-RG4KPBEZ-CuCKjHM3.js → radar-RG4KPBEZ-Djm3oXl5.js} +1 -1
  270. package/dist/web/client/assets/{railroad-74A4TZTK-CnQK-Cc1.js → railroad-74A4TZTK-Cpvkwsao.js} +1 -1
  271. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
  272. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
  273. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
  274. package/dist/web/client/assets/{railroadDiagram-O6MQD6OU-BDDIPNLL.js → railroadDiagram-O6MQD6OU-CgMS4B6R.js} +1 -1
  275. package/dist/web/client/assets/{requirementDiagram-BXWQKSXE-B5Ydyxc1.js → requirementDiagram-BXWQKSXE-CX5eoNdN.js} +1 -1
  276. package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
  277. package/dist/web/client/assets/{sankeyDiagram-P5KCCOFB-Bw2Qym75.js → sankeyDiagram-P5KCCOFB-CODBX2N3.js} +1 -1
  278. package/dist/web/client/assets/{sequenceDiagram-WJ2MYXX4-BZf36nO0.js → sequenceDiagram-WJ2MYXX4-eUhhF8OR.js} +1 -1
  279. package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
  280. package/dist/web/client/assets/{stateDiagram-D77RDMKH-DnH6JRkp.js → stateDiagram-D77RDMKH-vR6l0NC2.js} +1 -1
  281. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
  282. package/dist/web/client/assets/{swimlanes-42K2YHIH-D9PZmtZg.js → swimlanes-42K2YHIH-v9Tw_zX7.js} +1 -1
  283. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
  284. package/dist/web/client/assets/{timeline-definition-24CTP7MA-CrkZZBo7.js → timeline-definition-24CTP7MA-DxianbhU.js} +1 -1
  285. package/dist/web/client/assets/{treeView-Q6P3EWNA-C9zDShoC.js → treeView-Q6P3EWNA-DLxnZb9R.js} +1 -1
  286. package/dist/web/client/assets/{treemap-WGGIJYW6-B-plj9yK.js → treemap-WGGIJYW6-I7UnZ6xJ.js} +1 -1
  287. package/dist/web/client/assets/{vennDiagram-4TSXK5OY-VeOdaphN.js → vennDiagram-4TSXK5OY-Ar7M8Mrj.js} +1 -1
  288. package/dist/web/client/assets/{wardley-WFR3VGLG-Wl1P_m6L.js → wardley-WFR3VGLG-B8ZSHeDu.js} +1 -1
  289. package/dist/web/client/assets/{wardleyDiagram-VM6X3IG4-B85-R9t2.js → wardleyDiagram-VM6X3IG4-Qks2FmIn.js} +1 -1
  290. package/dist/web/client/assets/{xychartDiagram-S5SC5T6Z-BrD8OW8m.js → xychartDiagram-S5SC5T6Z-BBBjRtiE.js} +1 -1
  291. package/dist/web/client/index.html +3 -1
  292. package/dist/web/reads-worker.js +17 -17
  293. package/dist/web/server.js +25 -25
  294. package/dist/{web-EU6ATJWA.js → web-EMGUGGEI.js} +3 -3
  295. package/dist/{web-fetch-U22Q7HV4.js → web-fetch-6BRRVQON.js} +22 -5
  296. package/dist/{wiki-generate-LZRLFG6I.js → wiki-generate-XHSJTDOP.js} +104 -100
  297. package/dist/{with-panes-X5CZOGML.js → with-panes-Z6BTEHMZ.js} +11 -11
  298. package/dist/worker/entry.js +101 -87
  299. package/docs/README.md +1 -1
  300. package/docs/architecture/artifact-placement.md +12 -1
  301. package/docs/architecture/library.md +1 -1
  302. package/docs/architecture/prompt-envelope-and-tools.md +37 -27
  303. package/docs/architecture/safety-model.md +19 -6
  304. package/docs/architecture/session-lifecycle.md +10 -4
  305. package/docs/architecture/tui-design.md +37 -14
  306. package/docs/guide/commands-and-modes.md +39 -19
  307. package/docs/guide/configuration-and-targets.md +7 -5
  308. package/docs/guide/configuration-reference.md +116 -13
  309. package/docs/guide/environment-variables.md +2 -5
  310. package/docs/guide/fleet-dispatch.md +3 -2
  311. package/docs/guide/glossary.md +1 -1
  312. package/docs/guide/installation-and-lifecycle.md +2 -2
  313. package/docs/guide/resource-library.md +1 -1
  314. package/docs/guide/tool-usage.md +166 -64
  315. package/docs/guide/troubleshooting.md +1 -1
  316. package/docs/process/documentation-guide.md +1 -0
  317. package/docs/process/fleet-demo-runbook.md +6 -6
  318. package/docs/process/scientific-validation.md +22 -2
  319. package/docs/process/tool-audit-v0.4.9.md +357 -0
  320. package/package.json +1 -1
  321. package/src/cli/argv.ts +31 -0
  322. package/src/cli/clio.ts +17 -13
  323. package/src/cli/config.ts +4 -0
  324. package/src/cli/doctor-panes.ts +1 -1
  325. package/src/cli/doctor.ts +3 -1
  326. package/src/cli/index.ts +14 -1
  327. package/src/cli/mcp.ts +106 -0
  328. package/src/cli/skills-eval.ts +8 -2
  329. package/src/cli/upgrade.ts +34 -38
  330. package/src/cli/verifiers.ts +1 -1
  331. package/src/core/bash-exec.ts +27 -4
  332. package/src/core/config.ts +2 -1
  333. package/src/core/defaults.ts +10 -1
  334. package/src/core/event-bus.ts +1 -1
  335. package/src/core/run-records.ts +438 -0
  336. package/src/core/safe-exec.ts +506 -56
  337. package/src/core/skill-activation.ts +5 -3
  338. package/src/core/termination.ts +3 -3
  339. package/src/core/tool-names.ts +33 -12
  340. package/src/domains/context/clio-md.ts +1 -1
  341. package/src/domains/context/worker/pressure.ts +6 -2
  342. package/src/domains/context/working-set/path-index.ts +7 -2
  343. package/src/domains/dispatch/code-step.ts +7 -2
  344. package/src/domains/dispatch/contract.ts +7 -0
  345. package/src/domains/dispatch/execution-role.ts +3 -3
  346. package/src/domains/dispatch/execution-scheduler.ts +204 -79
  347. package/src/domains/dispatch/extension.ts +131 -14
  348. package/src/domains/dispatch/fleet-preflight.ts +18 -3
  349. package/src/domains/dispatch/fleet-run.ts +1 -0
  350. package/src/domains/dispatch/gate-decisions.ts +3 -3
  351. package/src/domains/dispatch/heartbeat.ts +1 -1
  352. package/src/domains/dispatch/host-verification.ts +16 -14
  353. package/src/domains/dispatch/receipt-findings.ts +3 -4
  354. package/src/domains/dispatch/reservation-store.ts +7 -9
  355. package/src/domains/dispatch/route-facts.ts +1 -1
  356. package/src/domains/dispatch/state.ts +3 -3
  357. package/src/domains/dispatch/types.ts +1 -1
  358. package/src/domains/evidence/build.ts +35 -7
  359. package/src/domains/gateway/mcp/client.ts +923 -0
  360. package/src/domains/gateway/mcp/config.ts +456 -0
  361. package/src/domains/gateway/mcp/index.ts +88 -0
  362. package/src/domains/gateway/mcp/protocol.ts +273 -0
  363. package/src/domains/gateway/mcp/trust.ts +263 -0
  364. package/src/domains/lifecycle/doctor.ts +17 -3
  365. package/src/domains/mux/contract.ts +5 -9
  366. package/src/domains/mux/detect.ts +1 -1
  367. package/src/domains/mux/extension.ts +1 -1
  368. package/src/domains/mux/protocol.ts +5 -7
  369. package/src/domains/mux/socket-client.ts +3 -3
  370. package/src/domains/observability/accountability.ts +2 -2
  371. package/src/domains/observability/contract.ts +7 -3
  372. package/src/domains/observability/evidence-index.ts +2 -2
  373. package/src/domains/observability/projection.ts +10 -0
  374. package/src/domains/prompts/compiler.ts +41 -23
  375. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
  376. package/src/domains/prompts/fragments/operating/skills.md +12 -10
  377. package/src/domains/providers/index.ts +5 -1
  378. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
  379. package/src/domains/providers/probe/http.ts +44 -59
  380. package/src/domains/providers/probe/reasoning.ts +2 -0
  381. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
  382. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
  383. package/src/domains/safety/action-classifier.ts +17 -1
  384. package/src/domains/safety/call-target.ts +14 -0
  385. package/src/domains/safety/contract.ts +1 -1
  386. package/src/domains/safety/finish-contract.ts +9 -3
  387. package/src/domains/safety/loop-detector.ts +1 -1
  388. package/src/domains/safety/policy-engine.ts +7 -0
  389. package/src/domains/safety/protected-artifacts.ts +3 -4
  390. package/src/domains/safety/rejection-feedback.ts +1 -1
  391. package/src/domains/safety/scope.ts +2 -3
  392. package/src/domains/safety/validation-contract.ts +3 -2
  393. package/src/domains/scheduling/budget.ts +5 -3
  394. package/src/domains/scheduling/contract.ts +2 -1
  395. package/src/domains/scheduling/extension.ts +3 -3
  396. package/src/domains/session/compaction/branch-summary.ts +1 -1
  397. package/src/domains/session/compaction/compact.ts +25 -2
  398. package/src/domains/session/compaction/cut-point.ts +1 -1
  399. package/src/domains/session/compaction/tokens.ts +5 -10
  400. package/src/domains/session/contract.ts +1 -1
  401. package/src/domains/session/cwd-fallback.ts +2 -2
  402. package/src/domains/session/handoff.ts +5 -1
  403. package/src/domains/session/history.ts +6 -0
  404. package/src/domains/session/manager.ts +14 -7
  405. package/src/domains/session/retry.ts +2 -1
  406. package/src/domains/session/session-artifacts.ts +12 -7
  407. package/src/domains/session/task-board.ts +2 -3
  408. package/src/engine/apis/openai-completions.ts +8 -0
  409. package/src/engine/loop-guard.ts +7 -0
  410. package/src/engine/provider-error-body.ts +65 -0
  411. package/src/engine/session.ts +118 -29
  412. package/src/engine/worker-runtime.ts +3 -0
  413. package/src/entry/boot-options.ts +2 -0
  414. package/src/entry/orchestrator.ts +18 -2
  415. package/src/interactive/chat-loop-policy.ts +1 -0
  416. package/src/interactive/chat-loop.ts +8 -4
  417. package/src/interactive/chat-panel.ts +23 -9
  418. package/src/interactive/chat-renderer.ts +33 -11
  419. package/src/interactive/clio-editor.ts +13 -5
  420. package/src/interactive/dispatch-board.ts +70 -30
  421. package/src/interactive/editor-submit.ts +30 -25
  422. package/src/interactive/footer/widgets.ts +12 -9
  423. package/src/interactive/interactive-presentation.ts +2 -3
  424. package/src/interactive/mux-bridge.ts +3 -7
  425. package/src/interactive/overlay-general-openers.ts +14 -7
  426. package/src/interactive/overlays/cwd-fallback.ts +1 -1
  427. package/src/interactive/overlays/library-model.ts +114 -35
  428. package/src/interactive/overlays/library.ts +52 -5
  429. package/src/interactive/overlays/list-overlay.ts +4 -1
  430. package/src/interactive/overlays/session-selector.ts +28 -23
  431. package/src/interactive/overlays/settings.ts +20 -1
  432. package/src/interactive/overlays/tree-selector.ts +47 -10
  433. package/src/interactive/panes-runtime.ts +1 -1
  434. package/src/interactive/renderers/compaction-summary.ts +1 -1
  435. package/src/interactive/renderers/provider-error.ts +118 -0
  436. package/src/interactive/renderers/retry-status.ts +59 -23
  437. package/src/interactive/renderers/tool-execution.ts +67 -7
  438. package/src/interactive/renderers/worker-answer.ts +198 -0
  439. package/src/interactive/renderers/worker-entry.ts +57 -163
  440. package/src/interactive/slash-commands.ts +26 -1
  441. package/src/interactive/slash-spec.ts +2 -2
  442. package/src/interactive/theme/labels.ts +66 -30
  443. package/src/interactive/turn-persistence.ts +6 -1
  444. package/src/interactive/turn-recovery.ts +2 -1
  445. package/src/interactive/turn-runtime.ts +22 -5
  446. package/src/interactive/view/artifacts.ts +3 -2
  447. package/src/interactive/view/view-overlay.ts +96 -20
  448. package/src/tools/agent-tools.ts +21 -7
  449. package/src/tools/artifact.ts +16 -8
  450. package/src/tools/bash.ts +90 -11
  451. package/src/tools/bootstrap.ts +42 -4
  452. package/src/tools/builtin-tool-catalog.ts +72 -7
  453. package/src/tools/context/index.ts +27 -31
  454. package/src/tools/context/library.ts +3 -1
  455. package/src/tools/context/surface.ts +12 -26
  456. package/src/tools/core-bootstrap.ts +72 -1
  457. package/src/tools/data/csv.ts +1189 -0
  458. package/src/tools/data/index.ts +308 -0
  459. package/src/tools/data/json.ts +1799 -0
  460. package/src/tools/data/jsonl.ts +561 -0
  461. package/src/tools/data/shared.ts +452 -0
  462. package/src/tools/edit-diff.ts +0 -7
  463. package/src/tools/edit.ts +115 -18
  464. package/src/tools/file-mutation-queue.ts +114 -4
  465. package/src/tools/find.ts +108 -29
  466. package/src/tools/gateway/caps.ts +11 -0
  467. package/src/tools/gateway/clio-context-surface.ts +41 -0
  468. package/src/tools/gateway/clio-context-tools.ts +77 -0
  469. package/src/tools/gateway/data-surface.ts +138 -0
  470. package/src/tools/gateway/data-tool.ts +201 -0
  471. package/src/tools/gateway/index.ts +342 -0
  472. package/src/tools/gateway/mcp-capabilities.ts +469 -0
  473. package/src/tools/grep.ts +88 -33
  474. package/src/tools/harness-extensions.ts +3 -0
  475. package/src/tools/ignore-policy.ts +7 -5
  476. package/src/tools/ls.ts +111 -20
  477. package/src/tools/policy.ts +35 -13
  478. package/src/tools/presentation.ts +6 -0
  479. package/src/tools/read.ts +634 -156
  480. package/src/tools/registry.ts +94 -6
  481. package/src/tools/run-script.ts +997 -0
  482. package/src/tools/spawn-hygiene.ts +157 -5
  483. package/src/tools/surface.ts +163 -0
  484. package/src/tools/verify/authoring.ts +8 -3
  485. package/src/tools/verify/catalog.ts +14 -1
  486. package/src/tools/verify/numeric.ts +367 -59
  487. package/src/tools/verify/perf.ts +171 -9
  488. package/src/tools/verify/scripts.ts +178 -26
  489. package/src/tools/web-fetch-surface.ts +22 -0
  490. package/src/tools/web-fetch.ts +26 -1
  491. package/src/tools/write.ts +45 -19
  492. package/dist/chunk-B6UM3OZC.js +0 -15
  493. package/dist/chunk-GJ24ODAX.js +0 -196
  494. package/dist/chunk-LZCCBLRC.js +0 -57
  495. package/dist/web/client/assets/architecture-7GRP2DOG-EGozsYEO.js +0 -1
  496. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-z9FokbJl.js +0 -36
  497. package/dist/web/client/assets/channel-CiUWbHN9.js +0 -1
  498. package/dist/web/client/assets/chunk-DU6HZSFF-C5USiOAy.js +0 -125
  499. package/dist/web/client/assets/classDiagram-ZZMXUADV-CMODalmo.js +0 -1
  500. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-CMODalmo.js +0 -1
  501. package/dist/web/client/assets/cose-bilkent-JH36ORCC-RbQL23qS.js +0 -1
  502. package/dist/web/client/assets/dist-D0_q-A2b.js +0 -1
  503. package/dist/web/client/assets/eventmodeling-NTZA5JFV-DjVq8wKU.js +0 -1
  504. package/dist/web/client/assets/flowDiagram-HODETNUW-BUiCBGXt.js +0 -1
  505. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-B2lb8lvF.js +0 -292
  506. package/dist/web/client/assets/index-FSIC94pi.js +0 -83
  507. package/dist/web/client/assets/prism-core-BngLtbUd.js +0 -1
  508. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-BcW01NZG.js +0 -1
  509. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-B7YCEDDd.js +0 -1
  510. package/dist/web/client/assets/railroad-peg-WCYAUIDC-DjNZbSTZ.js +0 -1
  511. package/dist/web/client/assets/src-yeptRXpt.js +0 -1
  512. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-C7QtHeK4.js +0 -1
  513. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-CBZlPFky.js +0 -8
@@ -2,15 +2,19 @@
2
2
  * Canonical tool names. Everything that dispatches a tool call references these constants
3
3
  * so mode matrices, safety classifiers, and audit filters never diverge on spelling.
4
4
  *
5
- * The surface is organized in seven planes; each plane is one policy unit
5
+ * The surface is organized in eight planes; each plane is one policy unit
6
6
  * (action class, size posture, details schema, concurrency rule):
7
- * OBSERVE evidence, read, grep, find, ls, code_nav, context, credential_present
7
+ * OBSERVE evidence, read, grep, find, ls, code_nav, context, credential_present, clio_docs, clio_library, data
8
8
  * MUTATE write, edit
9
- * EXECUTE bash, git, verify
9
+ * EXECUTE bash, git, verify, run_script
10
10
  * ORCHESTRATE dispatch, monitor, steer, tasks, ledger, panes, limitation, decide
11
- * RETRIEVE web_fetch
11
+ * RETRIEVE web_read, web_fetch
12
12
  * INTERACT ask_user
13
13
  * ARTIFACT artifact
14
+ * GATEWAY gateway
15
+ *
16
+ * Placement (which names carry an attached schema and which are reached
17
+ * through the gateway) is a separate axis, declared in src/tools/surface.ts.
14
18
  */
15
19
 
16
20
  export const ToolNames = {
@@ -23,6 +27,9 @@ export const ToolNames = {
23
27
  CodeNav: "code_nav",
24
28
  Context: "context",
25
29
  CredentialPresent: "credential_present",
30
+ ClioDocs: "clio_docs",
31
+ ClioLibrary: "clio_library",
32
+ Data: "data",
26
33
  // MUTATE
27
34
  Write: "write",
28
35
  Edit: "edit",
@@ -30,6 +37,7 @@ export const ToolNames = {
30
37
  Bash: "bash",
31
38
  Git: "git",
32
39
  Verify: "verify",
40
+ RunScript: "run_script",
33
41
  // ORCHESTRATE
34
42
  Dispatch: "dispatch",
35
43
  Monitor: "monitor",
@@ -40,19 +48,16 @@ export const ToolNames = {
40
48
  Limitation: "limitation",
41
49
  Decide: "decide",
42
50
  // RETRIEVE
51
+ WebRead: "web_read",
43
52
  WebFetch: "web_fetch",
44
53
  // INTERACT
45
54
  AskUser: "ask_user",
46
55
  // ARTIFACT
47
56
  Artifact: "artifact",
48
- // DESIGN-RESERVED, not implemented: gateway, the MCP/DB proxy. One fixed
49
- // schema; external capabilities are surfaced through find/describe/call
50
- // RESULTS, never as per-capability schemas in the prompt prefix. Contract
51
- // sketch: gateway(op: "find" | "describe" | "call", capability?, args?)
52
- // -> JSON capability listings / schemas / call results, network action
53
- // class, sequential. Reserving the name here keeps classifiers and
54
- // profiles from ever assigning "gateway" to a dynamic tool.
55
- // Gateway: "gateway",
57
+ // GATEWAY: one fixed schema; secondary capabilities are surfaced through
58
+ // find/describe/call RESULTS, never as per-capability schemas in the
59
+ // prompt prefix.
60
+ Gateway: "gateway",
56
61
  } as const;
57
62
 
58
63
  export type BuiltinToolName = (typeof ToolNames)[keyof typeof ToolNames];
@@ -72,3 +77,19 @@ export function isBuiltinToolName(name: ToolName): name is BuiltinToolName {
72
77
  export function isHarnessExtensionToolName(name: string): name is DynamicToolName {
73
78
  return name.length <= 64 && /^extension_[a-z0-9][a-z0-9_-]*__[a-z][a-z0-9_]*$/.test(name);
74
79
  }
80
+
81
+ /**
82
+ * Reserved MCP capability namespace: `mcp_<serverId>__<tool>`. The server id
83
+ * follows the mcp.yaml id charset; the tool segment keeps the server's own
84
+ * spelling (letters, digits, `_`, `-`, `.`). Syntax conveys origin, never trust
85
+ * or availability: the gateway launches only trusted servers.
86
+ */
87
+ export function isMcpToolName(name: string): name is DynamicToolName {
88
+ return name.length <= 96 && /^mcp_[a-z0-9][a-z0-9_-]*__[A-Za-z0-9][A-Za-z0-9_.-]*$/.test(name);
89
+ }
90
+
91
+ /** Compose the registry name of one MCP server tool; null when the tool's name cannot be carried. */
92
+ export function mcpToolName(serverId: string, tool: string): DynamicToolName | null {
93
+ const composed = `mcp_${serverId}__${tool}`;
94
+ return isMcpToolName(composed) ? composed : null;
95
+ }
@@ -130,7 +130,7 @@ function normalizeNestedMarkdown(value: string): string {
130
130
  let cursor = 0;
131
131
  for (const match of mask.matchAll(/^(#{1,2})(\s+)/gm)) {
132
132
  if (match.index === undefined) continue;
133
- out += body.slice(cursor, match.index) + "###" + (match[2] ?? "");
133
+ out += `${body.slice(cursor, match.index)}###${match[2] ?? ""}`;
134
134
  cursor = match.index + match[0].length;
135
135
  }
136
136
  return out + body.slice(cursor);
@@ -1,4 +1,5 @@
1
1
  import type { AgentMessage } from "../../../engine/types.js";
2
+ import { effectiveToolCall } from "../../../tools/surface.js";
2
3
  import { estimateAgentContextBreakdown, estimateAgentMessageTokens } from "../../session/context-accounting.js";
3
4
  import { contextHash, messageToolCalls } from "./snapshot.js";
4
5
 
@@ -93,9 +94,12 @@ export function createWorkerContextGuard(archive: (ref: string, message: AgentMe
93
94
  const projected = { ...message, content };
94
95
  replace(index, message, projected);
95
96
  } else if (message.role === "toolResult" && !message.isError) {
96
- const name = toolCalls.get(message.toolCallId)?.name;
97
+ const call = toolCalls.get(message.toolCallId);
98
+ // A gateway call carries its capability's read semantics: a page
99
+ // fetched through the gateway is as evictable as a direct fetch.
100
+ const name = call ? effectiveToolCall(call.name, call.arguments).toolName : undefined;
97
101
  // Only observations with known read semantics. Preserve mutations and opaque tools.
98
- if (!name || !["read", "grep", "find", "ls", "code_nav", "web_fetch"].includes(name)) continue;
102
+ if (!name || !["read", "grep", "find", "ls", "code_nav", "web_read", "web_fetch"].includes(name)) continue;
99
103
  if (JSON.stringify(message.content).length < 1000) continue;
100
104
  const ref = key(message);
101
105
  const file = archive(ref, structuredClone(message));
@@ -25,6 +25,7 @@
25
25
  */
26
26
 
27
27
  import { basename, isAbsolute, join, normalize, resolve } from "node:path";
28
+ import { effectiveToolCall } from "../../../tools/surface.js";
28
29
  import type { MessageEntry, SessionEntry } from "../../session/entries.js";
29
30
  import type { WorkingSetRef } from "./contract.js";
30
31
  import { isTurnStart } from "./horizon.js";
@@ -175,8 +176,12 @@ interface ToolCallFacts {
175
176
  argsKey: string;
176
177
  }
177
178
 
178
- function callFacts(toolName: string, args: unknown): ToolCallFacts {
179
- return { toolName, args, argsKey: args === undefined ? "" : stableStringify(args) };
179
+ function callFacts(recordedTool: string, recordedArgs: unknown): ToolCallFacts {
180
+ // A gateway call indexes as the capability it reached (git reads the cwd,
181
+ // artifact writes its path), never as an opaque `gateway` observation.
182
+ const effective = effectiveToolCall(recordedTool, recordedArgs);
183
+ const args = effective.viaGateway ? effective.args : recordedArgs;
184
+ return { toolName: effective.toolName, args, argsKey: args === undefined ? "" : stableStringify(args) };
180
185
  }
181
186
 
182
187
  function stringField(record: Record<string, unknown> | null, ...keys: string[]): string | null {
@@ -53,6 +53,8 @@ export interface CodeStepRunInput {
53
53
  workspaceRoot: string;
54
54
  /** Absolute directory the command log is written to; omitted means no artifact. */
55
55
  artifactDir?: string;
56
+ /** Shared stdout/stderr capture ceiling; defaults to CODE_STEP_CAPTURE_MAX_BYTES. */
57
+ maxOutputBytes?: number;
56
58
  /** Full process environment the allowlist is drawn from. Defaults to the orchestrator's. */
57
59
  env?: NodeJS.ProcessEnv;
58
60
  /**
@@ -221,6 +223,9 @@ interface SpawnOutcome {
221
223
 
222
224
  async function spawnCommand(input: CodeStepRunInput, cwd: string, argv: ReadonlyArray<string>): Promise<SpawnOutcome> {
223
225
  const command = input.command;
226
+ const captureMaxBytes = input.maxOutputBytes ?? CODE_STEP_CAPTURE_MAX_BYTES;
227
+ if (!Number.isSafeInteger(captureMaxBytes) || captureMaxBytes <= 0)
228
+ throw new Error("code step: maxOutputBytes must be a positive safe integer");
224
229
  const [executable, ...args] = argv;
225
230
  if (executable === undefined) throw new Error(`code step: command '${command.id}' has no executable`);
226
231
  return await new Promise<SpawnOutcome>((resolvePromise) => {
@@ -247,8 +252,8 @@ async function spawnCommand(input: CodeStepRunInput, cwd: string, argv: Readonly
247
252
  });
248
253
  const collect = (chunk: Buffer, stdout: boolean): void => {
249
254
  outputBytes += chunk.length;
250
- if (captured >= CODE_STEP_CAPTURE_MAX_BYTES) return;
251
- const room = CODE_STEP_CAPTURE_MAX_BYTES - captured;
255
+ if (captured >= captureMaxBytes) return;
256
+ const room = captureMaxBytes - captured;
252
257
  const slice = chunk.length <= room ? chunk : chunk.subarray(0, room);
253
258
  chunks.push(slice);
254
259
  if (stdout) stdoutChunks.push(slice);
@@ -348,6 +348,13 @@ export interface DispatchContract {
348
348
  */
349
349
  abort(runId: string, reason?: AbortReason): void;
350
350
 
351
+ /**
352
+ * Wait for one member's attempts, queued retries and retry admissions to
353
+ * settle. Does not cancel work; fleet owners call synchronous abort first
354
+ * when stopping. Other members and the global drain lifecycle are untouched.
355
+ */
356
+ drainMember?(runId: string): Promise<void>;
357
+
351
358
  /**
352
359
  * Queue operator guidance on a running HTTP or SDK worker. A logical
353
360
  * assignment id addresses its current attempt. The text is sent as a JSON
@@ -51,7 +51,7 @@ export type GateTopologyRole = "builder" | "reviewer" | "candidate" | "judge" |
51
51
 
52
52
  /**
53
53
  * Facts the role is derived from. `capabilityClass` and `resultContractKind`
54
- * both come from the strict Slice 2 recipe schema, so a role can never be read
54
+ * both come from the strict recipe schema, so a role can never be read
55
55
  * off free-form prose or a display-only field.
56
56
  */
57
57
  export interface ExecutionRoleInput {
@@ -79,7 +79,7 @@ export interface ExecutionRoleInput {
79
79
  * 3. Outside a gate, the recipe's own typed contract decides. A declared
80
80
  * `verifier-report` is the only contract that makes a direct run a
81
81
  * verifier; a Debugger's `debugger-report` deliberately does not, because
82
- * Slice 2 forbids it from masquerading as a gate verdict.
82
+ * the result schema distinguishes diagnosis from a gate verdict.
83
83
  * 4. A read-only recipe with no verifier contract is reconnaissance.
84
84
  */
85
85
  export function deriveExecutionRole(input: ExecutionRoleInput): ExecutionRole {
@@ -151,7 +151,7 @@ export function withAttemptRole(requestRole: ExecutionRole, attempt: number): Ex
151
151
  * Defaulting a reviewer or judge to the builder agent makes the gate a
152
152
  * self-review: the same recipe, the same prompt surface, and usually the same
153
153
  * model family grading its own output. That verdict is correlated by
154
- * construction and Slice 1 already refuses to treat it as a quality label, so
154
+ * construction and cannot count as an independent quality label, so
155
155
  * the default has to be an agent whose entire contract is independent typed
156
156
  * validation.
157
157
  */
@@ -141,6 +141,8 @@ export interface ExecutionSchedulerAdapter {
141
141
  */
142
142
  verifyWriteBoundary?(window: string, stepIds: ReadonlyArray<string>): Promise<ExecutionWriteBoundaryOutcome>;
143
143
  cancel(assignmentId: string): void;
144
+ /** Wait for owned continuations, including retry admission, before release. */
145
+ drainMember?(assignmentId: string): Promise<void>;
144
146
  release(ownerId: string): void;
145
147
  releaseUnconsumed(ownerId: string): void;
146
148
  /** Persist a settled result after boundary enforcement and before a dependent starts. */
@@ -230,7 +232,6 @@ export async function executePlan(
230
232
  // A plan with a single agent step has no peers, so it gets no board.
231
233
  const ledgerId = agentSteps.length >= 2 ? `ledger-plan-${plan.hash.slice(0, 12)}-${Date.now().toString(36)}` : null;
232
234
  const ledger = ledgerId === null ? undefined : { id: ledgerId, sequence: 0 };
233
- if (ledgerId !== null) await openAgentLedger(ledgerId);
234
235
  const admissions = agentSteps.map((step) => adapter.preflight(step));
235
236
  const reservation = adapter.reserve(plan, admissions);
236
237
  const reservationOwners = new Set([reservation.ownerId]);
@@ -239,7 +240,10 @@ export async function executePlan(
239
240
  const skipped = new Set<string>();
240
241
  const unneeded = new Set<string>();
241
242
  const needsDecision: string[] = [];
242
- const running = new Map<string, { assignmentId: string | null }>();
243
+ const running = new Map<string, { assignmentId: string | null; canceled: boolean }>();
244
+ const cleanupErrors: unknown[] = [];
245
+ const memberIds = new Set<string>();
246
+ const canceledSteps = new Set<string>();
243
247
  /** Per-check verdict, so a loop's resolution is recomputed from live results. */
244
248
  const checkPassed = new Map<string, boolean>();
245
249
  /** Findings a failed agent verification threaded to its repair attempt. */
@@ -258,11 +262,19 @@ export async function executePlan(
258
262
  // aborted through this signal, which the runner turns into a process-group
259
263
  // kill on the whole command tree.
260
264
  const codeAbort = new AbortController();
265
+ const cancelOne = (owned: { assignmentId: string | null; canceled: boolean }): void => {
266
+ if (owned.assignmentId === null || owned.canceled) return;
267
+ owned.canceled = true;
268
+ try {
269
+ adapter.cancel(owned.assignmentId);
270
+ } catch (error) {
271
+ cleanupErrors.push(error);
272
+ }
273
+ };
261
274
  const cancelOwned = (): void => {
262
275
  stopped = true;
263
- for (const owned of running.values()) if (owned.assignmentId !== null) adapter.cancel(owned.assignmentId);
264
276
  codeAbort.abort();
265
- for (const ownerId of reservationOwners) adapter.releaseUnconsumed(ownerId);
277
+ for (const owned of running.values()) cancelOne(owned);
266
278
  };
267
279
  signal?.addEventListener("abort", cancelOwned, { once: true });
268
280
 
@@ -277,42 +289,44 @@ export async function executePlan(
277
289
  results.set(step.id, result);
278
290
  if (isWorkspaceMutator(step)) lastMutationSeq = sequence;
279
291
  };
280
- for (const step of plan.steps) {
281
- const result = replayed.get(step.id);
282
- if (result === undefined) continue;
283
- if (!result.succeeded || !result.integrityValid) {
284
- throw new Error(`execution plan: replayed step '${step.id}' is not a completed successful step`);
285
- }
286
- recordCompletion(step, result);
287
- if (step.loop?.role === "check" && step.kind === "code") {
288
- checkPassed.set(step.id, result.succeeded);
289
- attemptsRun.set(step.loop.loopId, (attemptsRun.get(step.loop.loopId) ?? 0) + 1);
290
- }
291
- if (step.loop?.role === "check" && step.kind === "agent") {
292
- const loop = loopsById.get(step.loop.loopId);
293
- const decide = adapter.decideLoop;
294
- if (loop === undefined || decide === undefined) {
295
- throw new Error(`execution plan: replayed loop check '${step.id}' has no decider`);
292
+ const replayPrefix = async (): Promise<void> => {
293
+ for (const step of plan.steps) {
294
+ const result = replayed.get(step.id);
295
+ if (result === undefined) continue;
296
+ if (!result.succeeded || !result.integrityValid) {
297
+ throw new Error(`execution plan: replayed step '${step.id}' is not a completed successful step`);
296
298
  }
297
- const decision = await decide({
298
- loop,
299
- step,
300
- attempt: step.loop.attempt,
301
- terminalAttempt: step.loop.attempt >= loop.maxAttempts,
302
- result,
303
- priorResults: results,
304
- });
305
- checkPassed.set(step.id, decision.resolved);
306
- attemptsRun.set(step.loop.loopId, (attemptsRun.get(step.loop.loopId) ?? 0) + 1);
307
- if (decision.findings !== null) loopFindings.set(`${loop.id}:${step.loop.attempt}`, decision.findings);
308
- if (decision.needsDecision !== undefined && decision.needsDecision !== null) {
309
- needsDecision.push(decision.needsDecision);
299
+ recordCompletion(step, result);
300
+ if (step.loop?.role === "check" && step.kind === "code") {
301
+ checkPassed.set(step.id, result.succeeded);
302
+ attemptsRun.set(step.loop.loopId, (attemptsRun.get(step.loop.loopId) ?? 0) + 1);
303
+ }
304
+ if (step.loop?.role === "check" && step.kind === "agent") {
305
+ const loop = loopsById.get(step.loop.loopId);
306
+ const decide = adapter.decideLoop;
307
+ if (loop === undefined || decide === undefined) {
308
+ throw new Error(`execution plan: replayed loop check '${step.id}' has no decider`);
309
+ }
310
+ const decision = await decide({
311
+ loop,
312
+ step,
313
+ attempt: step.loop.attempt,
314
+ terminalAttempt: step.loop.attempt >= loop.maxAttempts,
315
+ result,
316
+ priorResults: results,
317
+ });
318
+ checkPassed.set(step.id, decision.resolved);
319
+ attemptsRun.set(step.loop.loopId, (attemptsRun.get(step.loop.loopId) ?? 0) + 1);
320
+ if (decision.findings !== null) loopFindings.set(`${loop.id}:${step.loop.attempt}`, decision.findings);
321
+ if (decision.needsDecision !== undefined && decision.needsDecision !== null) {
322
+ needsDecision.push(decision.needsDecision);
323
+ }
324
+ }
325
+ if (step.loop?.role === "repair") {
326
+ repairsRun.set(step.loop.loopId, (repairsRun.get(step.loop.loopId) ?? 0) + 1);
310
327
  }
311
328
  }
312
- if (step.loop?.role === "repair") {
313
- repairsRun.set(step.loop.loopId, (repairsRun.get(step.loop.loopId) ?? 0) + 1);
314
- }
315
- }
329
+ };
316
330
 
317
331
  /**
318
332
  * A failed predecessor normally disqualifies its dependents. Two deliberate
@@ -422,7 +436,10 @@ export async function executePlan(
422
436
  ): Promise<ExecutionStepResult> => {
423
437
  const runCode = adapter.runCode;
424
438
  if (runCode === undefined) throw new Error(`execution plan: no runner for code step '${step.id}'`);
425
- return await runCode(step, handoffs, codeAbort.signal, results);
439
+ const result = await runCode(step, handoffs, codeAbort.signal, results);
440
+ if (!codeAbort.signal.aborted) return result;
441
+ canceledSteps.add(step.id);
442
+ return { ...result, succeeded: false, failureReason: result.failureReason ?? "execution plan canceled this step" };
426
443
  };
427
444
 
428
445
  /**
@@ -447,6 +464,7 @@ export async function executePlan(
447
464
  }
448
465
  let halt = false;
449
466
  for (const id of [...candidates].sort()) {
467
+ if (stopped || signal?.aborted) return true;
450
468
  const step = stepsById.get(id);
451
469
  if (step?.kind !== "code") continue;
452
470
  const spent = revalidations.get(id) ?? 0;
@@ -474,7 +492,7 @@ export async function executePlan(
474
492
  if (plan.onFailure === "stop") {
475
493
  stopped = true;
476
494
  codeAbort.abort();
477
- for (const ownerId of reservationOwners) adapter.releaseUnconsumed(ownerId);
495
+
478
496
  halt = true;
479
497
  }
480
498
  }
@@ -544,7 +562,12 @@ export async function executePlan(
544
562
  return { loopId: loop.id, resolved: false, attempts, repairs, reason };
545
563
  });
546
564
 
565
+ let outcome: ExecutionPlanResult | undefined;
566
+ let primaryError: unknown;
567
+ let failed = false;
547
568
  try {
569
+ if (ledgerId !== null) await openAgentLedger(ledgerId);
570
+ await replayPrefix();
548
571
  let waveIndex = 0;
549
572
  while (waveIndex < plan.waves.length) {
550
573
  const wave = plan.waves[waveIndex];
@@ -588,56 +611,119 @@ export async function executePlan(
588
611
  boundaryWindow,
589
612
  group.map((entry) => entry.step),
590
613
  );
591
- const started = await Promise.all(
592
- launch.map(async ({ step, handoffs }) => ({
593
- step,
594
- handle: await adapter.run(
595
- step,
596
- handoffs,
597
- { ownerId: reservationByStep.get(step.id) ?? reservation.ownerId, memberId: step.id },
598
- ledger,
599
- ),
600
- })),
601
- );
602
- for (const { step, handle } of started) running.set(step.id, { assignmentId: handle.assignmentId });
614
+ const failures: unknown[] = [];
615
+ const fail = (error: unknown): void => {
616
+ failures.push(error);
617
+ cancelOwned();
618
+ };
603
619
  const onSettled = (step: ExecutionPlanStep, result: ExecutionStepResult): void => {
604
- if (isPlanFailure(step, result) && plan.onFailure === "stop") {
605
- stopped = true;
606
- for (const [runningStepId, owned] of running) {
607
- if (runningStepId !== step.id && owned.assignmentId !== null) adapter.cancel(owned.assignmentId);
608
- }
609
- codeAbort.abort();
610
- for (const ownerId of reservationOwners) adapter.releaseUnconsumed(ownerId);
611
- }
620
+ if (isPlanFailure(step, result) && plan.onFailure === "stop") cancelOwned();
612
621
  };
613
- const ran = await Promise.all([
614
- ...started.map(async ({ step, handle }) => {
615
- const result = await handle.result;
616
- onSettled(step, result);
617
- return { step: step as ExecutionPlanStep, result };
618
- }),
619
- ...codeWork.map(async ({ step, handoffs }) => {
620
- const result = await runCodeStepNode(step, handoffs);
621
- onSettled(step, result);
622
- return { step: step as ExecutionPlanStep, result };
622
+ const terminals: Array<Promise<PromiseSettledResult<{ step: ExecutionPlanStep; result: ExecutionStepResult }>[]>> =
623
+ [];
624
+ // Own each launch independently and observe its terminal promise as
625
+ // soon as it arrives, even while a sibling is still starting.
626
+ await Promise.allSettled(
627
+ launch.map(async ({ step, handoffs }) => {
628
+ if (stopped || signal?.aborted) return;
629
+ const owned = { assignmentId: null as string | null, canceled: false };
630
+ running.set(step.id, owned);
631
+ try {
632
+ const handle = await adapter.run(
633
+ step,
634
+ handoffs,
635
+ { ownerId: reservationByStep.get(step.id) ?? reservation.ownerId, memberId: step.id },
636
+ ledger,
637
+ );
638
+ owned.assignmentId = handle.assignmentId;
639
+ memberIds.add(handle.assignmentId);
640
+ const terminal = handle.result.then(
641
+ (result) => {
642
+ // Preserve receipt references and output; this overlay records
643
+ // scheduler cancellation, not a fabricated worker receipt.
644
+ if (owned.canceled) canceledSteps.add(step.id);
645
+ const settled = owned.canceled
646
+ ? { ...result, succeeded: false, failureReason: result.failureReason ?? "execution plan canceled this step" }
647
+ : result;
648
+ onSettled(step, settled);
649
+ if (settled.succeeded) running.delete(step.id);
650
+ return { step: step as ExecutionPlanStep, result: settled };
651
+ },
652
+ (error: unknown) => {
653
+ fail(error);
654
+ throw error;
655
+ },
656
+ );
657
+ terminals.push(Promise.allSettled([terminal]));
658
+ if (stopped || signal?.aborted) cancelOne(owned);
659
+ } catch (error) {
660
+ running.delete(step.id);
661
+ fail(error);
662
+ }
663
+ return;
623
664
  }),
624
- ]);
665
+ );
666
+ // Code work retains the startup barrier and shares cancellation with
667
+ // agents, but has no assignment handle to release.
668
+ const codeTerminals =
669
+ stopped || signal?.aborted
670
+ ? []
671
+ : codeWork.map(async ({ step, handoffs }) => {
672
+ try {
673
+ const result = await runCodeStepNode(step, handoffs);
674
+ onSettled(step, result);
675
+ return { step: step as ExecutionPlanStep, result };
676
+ } catch (error) {
677
+ fail(error);
678
+ throw error;
679
+ }
680
+ });
681
+ const outcomes = (await Promise.all([...terminals, Promise.allSettled(codeTerminals)])).flat();
682
+ for (const id of memberIds) {
683
+ try {
684
+ await adapter.drainMember?.(id);
685
+ memberIds.delete(id);
686
+ } catch (error) {
687
+ fail(error);
688
+ }
689
+ }
690
+ const ran = outcomes.flatMap((outcome) => (outcome.status === "fulfilled" ? [outcome.value] : []));
691
+ const settlementOrder = [...launch, ...codeWork].map(({ step }) => step.id);
692
+ ran.sort((a, b) => settlementOrder.indexOf(a.step.id) - settlementOrder.indexOf(b.step.id));
693
+
625
694
  // The boundary is settled before anything is recorded or handed on, so
626
695
  // a rolled-back step never appears upstream of the work it would have
627
696
  // contaminated.
628
- const settled = await closeBoundary(boundaryWindow, enforced, ran);
697
+ let settled: typeof ran;
698
+ try {
699
+ settled = await closeBoundary(boundaryWindow, enforced, ran);
700
+ } catch (error) {
701
+ if (failures.length === 0) throw error;
702
+ throw new AggregateError([...failures, error], "execution plan failure and boundary verification failed", {
703
+ cause: failures[0],
704
+ });
705
+ }
629
706
  for (const { step, result } of settled) {
630
- running.set(step.id, { assignmentId: result.assignmentId });
631
707
  recordCompletion(step, result);
632
- await adapter.onStepSettled?.(step, result);
708
+ try {
709
+ await adapter.onStepSettled?.(step, result);
710
+ } catch (error) {
711
+ failures.push(error);
712
+ cancelOwned();
713
+ }
633
714
  if (step.loop?.role === "repair") {
634
715
  repairsRun.set(step.loop.loopId, (repairsRun.get(step.loop.loopId) ?? 0) + 1);
635
716
  }
636
717
  running.delete(step.id);
637
718
  }
719
+ if (failures.length === 1) throw failures[0];
720
+ if (failures.length > 1)
721
+ throw new AggregateError(failures, "execution plan launch or result failed", { cause: failures[0] });
638
722
  // Loop continuation is decided after the wave settles, so a gate's
639
723
  // verdict is read from a sealed result rather than from a live stream.
640
- for (const { step, result } of settled) await settleCheck(step, result);
724
+ for (const { step, result } of settled) {
725
+ if (!signal?.aborted && !canceledSteps.has(step.id)) await settleCheck(step, result);
726
+ }
641
727
  // A loop that spent its last attempt without converging ends the run
642
728
  // under a stop policy, whether the verdict came from an exit code or
643
729
  // from a gate that answered "no" perfectly well.
@@ -647,7 +733,6 @@ export async function executePlan(
647
733
  });
648
734
  if ((exhausted || settled.some(({ step, result }) => isPlanFailure(step, result))) && plan.onFailure === "stop") {
649
735
  stopped = true;
650
- for (const ownerId of reservationOwners) adapter.releaseUnconsumed(ownerId);
651
736
  }
652
737
  }
653
738
  if (!stopped && adapter.spliceAfter !== undefined) {
@@ -682,7 +767,7 @@ export async function executePlan(
682
767
  }
683
768
  waveIndex += 1;
684
769
  }
685
- return {
770
+ outcome = {
686
771
  planHash: plan.hash,
687
772
  results,
688
773
  skipped: [...skipped],
@@ -693,11 +778,51 @@ export async function executePlan(
693
778
  writeBoundaries: [...writeBoundaries],
694
779
  };
695
780
  } catch (error) {
781
+ failed = true;
782
+ primaryError = error;
696
783
  cancelOwned();
697
- throw error;
698
784
  } finally {
699
785
  signal?.removeEventListener("abort", cancelOwned);
700
- for (const ownerId of reservationOwners) adapter.release(ownerId);
701
- if (ledgerId !== null) await closeAgentLedger(ledgerId);
786
+ for (const id of memberIds) {
787
+ try {
788
+ await adapter.drainMember?.(id);
789
+ } catch (error) {
790
+ cleanupErrors.push(error);
791
+ }
792
+ }
793
+
794
+ // Every started launch and terminal is settled before capacity or the
795
+ // shared ledger is released, including late handles after cancellation.
796
+ for (const ownerId of reservationOwners) {
797
+ if (stopped || signal?.aborted) {
798
+ try {
799
+ adapter.releaseUnconsumed(ownerId);
800
+ } catch (error) {
801
+ cleanupErrors.push(error);
802
+ }
803
+ }
804
+ try {
805
+ adapter.release(ownerId);
806
+ } catch (error) {
807
+ cleanupErrors.push(error);
808
+ }
809
+ }
810
+ if (ledgerId !== null) {
811
+ try {
812
+ await closeAgentLedger(ledgerId);
813
+ } catch (error) {
814
+ cleanupErrors.push(error);
815
+ }
816
+ }
817
+ }
818
+ if (cleanupErrors.length > 0) {
819
+ throw new AggregateError(
820
+ failed ? [primaryError, ...cleanupErrors] : cleanupErrors,
821
+ "execution plan cleanup failed",
822
+ failed ? { cause: primaryError } : undefined,
823
+ );
702
824
  }
825
+ if (failed) throw primaryError;
826
+ if (outcome === undefined) throw new Error("execution plan did not produce an outcome");
827
+ return outcome;
703
828
  }