@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
@@ -46,6 +46,7 @@ import { WORKER_RUNTIME_MEDIATES_CLIO_DISPATCH } from "../../engine/worker-runti
46
46
  import { toolPromptHintsForNames } from "../../tools/builtin-tool-catalog.js";
47
47
  import { networkToolsDisabled } from "../../tools/network-policy.js";
48
48
  import { applyToolProfile, assertToolProfileEnforceable, type ToolProfileName } from "../../tools/profiles.js";
49
+ import { withGatewayForCapabilities } from "../../tools/surface.js";
49
50
  import {
50
51
  applyTaskWorktree,
51
52
  cleanupTaskWorktree,
@@ -1692,12 +1693,19 @@ function effectiveToolNames(
1692
1693
  (tool): tool is ToolName =>
1693
1694
  (isBuiltinToolName(tool) || harnessTools.has(tool)) &&
1694
1695
  tool !== ToolNames.AskUser &&
1695
- !(networkStripped && tool === ToolNames.WebFetch) &&
1696
+ !(networkStripped && (tool === ToolNames.WebFetch || tool === ToolNames.WebRead)) &&
1696
1697
  !denied.has(tool) &&
1697
1698
  !(writeConfined && WRITE_ROOT_REFUSED_TOOLS.has(tool)) &&
1698
1699
  (target.runtime.id !== "claude-sdk" || isClaudeCanonicalTool(tool)),
1699
1700
  );
1700
- return [...new Set(names)].sort();
1701
+ // A native worker reaches a gateway-placed capability (git, web_fetch, an
1702
+ // extension command) through the attached `gateway` tool, so the admitted
1703
+ // list gains `gateway` whenever it names one. The worker's own narrowing
1704
+ // (tools/agent-tools.ts effectiveToolNames) applies the same rule, which is
1705
+ // what keeps the approved tool signature equal to the attested one.
1706
+ const mediated = target.runtime.kind === "http" && target.runtime.id !== "claude-sdk";
1707
+ const surface = mediated ? withGatewayForCapabilities(names) : [...new Set(names)];
1708
+ return surface.sort();
1701
1709
  }
1702
1710
 
1703
1711
  /**
@@ -1716,13 +1724,23 @@ function assertPostRuntimeToolCompatibility(
1716
1724
  spec: ReturnType<typeof normalizeAgentSpec>,
1717
1725
  effectiveTools: ReadonlyArray<ToolName>,
1718
1726
  target: ResolvedTarget,
1727
+ writeConfined: boolean,
1719
1728
  ): void {
1720
1729
  const compatibility = resolveAgentToolCompatibility(spec, effectiveTools, {
1721
1730
  mediatesDispatch: WORKER_RUNTIME_MEDIATES_CLIO_DISPATCH,
1722
1731
  });
1723
1732
  if (compatibility.compatible) return;
1733
+ // Name the narrowing that removed the tool: blaming the runtime sends the
1734
+ // caller to another model when its own write roots caused the refusal.
1735
+ const confined = writeConfined
1736
+ ? compatibility.missingRequired.filter((tool) => WRITE_ROOT_REFUSED_TOOLS.has(tool))
1737
+ : [];
1738
+ const cause =
1739
+ confined.length > 0
1740
+ ? `; declared write roots remove ${confined.join(", ")}, so omit write roots (use autonomy: "read-only" or worktree: true) for this agent`
1741
+ : "";
1724
1742
  throw new Error(
1725
- `dispatch: admission denied: agent '${agentId}' is incompatible with runtime '${target.runtime.id}' after tool narrowing; missing required tools: ${compatibility.missingRequired.join(", ")}`,
1743
+ `dispatch: admission denied: agent '${agentId}' is incompatible with runtime '${target.runtime.id}' after tool narrowing; missing required tools: ${compatibility.missingRequired.join(", ")}${cause}`,
1726
1744
  );
1727
1745
  }
1728
1746
 
@@ -2875,11 +2893,30 @@ export function createDispatchBundle(
2875
2893
  rootRunId: string;
2876
2894
  terminalCandidate: RunReceipt;
2877
2895
  timer: ReturnType<typeof setTimeout>;
2896
+ settleCanceled: () => void;
2878
2897
  }
2879
2898
  const retryQueue = new Map<string, RetryQueueEntry>();
2880
2899
  const retryBackoff = new Map<string, BackoffState>();
2881
2900
  const retryReasons = new Map<string, string>();
2882
2901
  const assignmentRootsByAttempt = new Map<string, string>();
2902
+ // Fleet lineage is shared ancestry, not control ownership. Keep each
2903
+ // member's retry chain distinct without changing persisted lineage.
2904
+ const controlRootsByAttempt = new Map<string, string>();
2905
+ const controlAttempts = new Map<string, { lineage: RunLineage; reservation: DispatchRequest["reservation"] }>();
2906
+ const canceledControlRoots = new Set<string>();
2907
+ const memberWork = new Map<string, Set<Promise<unknown>>>();
2908
+ function trackMemberWork(runId: string, operation: Promise<unknown>): void {
2909
+ const root = controlRootsByAttempt.get(runId) ?? runId;
2910
+ const work = memberWork.get(root) ?? new Set<Promise<unknown>>();
2911
+ memberWork.set(root, work);
2912
+ work.add(operation);
2913
+ const settled = (): void => {
2914
+ work.delete(operation);
2915
+ if (work.size === 0) memberWork.delete(root);
2916
+ };
2917
+ operation.then(settled, settled);
2918
+ }
2919
+
2883
2920
  const assignments = new AssignmentRegistry({
2884
2921
  onStreamError: (error) => reportDispatchDiagnostic("assignment event stream", error),
2885
2922
  });
@@ -2911,6 +2948,20 @@ export function createDispatchBundle(
2911
2948
  function lineageFor(req: DispatchRequest, runId: string): RunLineage {
2912
2949
  const lineage = req.lineage ? { ...req.lineage } : { parentRunId: null, rootRunId: runId, attempt: 0, depth: 0 };
2913
2950
  assignmentRootsByAttempt.set(runId, lineage.rootRunId);
2951
+ const parent = lineage.parentRunId === null ? undefined : controlAttempts.get(lineage.parentRunId);
2952
+ // Repair ordinals and fleet ancestry do not establish a retry. Only a
2953
+ // known consecutive attempt of the same reservation member can do so.
2954
+ const continuesParent =
2955
+ parent !== undefined &&
2956
+ parent.lineage.rootRunId === lineage.rootRunId &&
2957
+ parent.lineage.depth === lineage.depth &&
2958
+ parent.lineage.attempt + 1 === lineage.attempt &&
2959
+ parent.reservation?.ownerId === req.reservation?.ownerId &&
2960
+ parent.reservation?.memberId === req.reservation?.memberId;
2961
+ const priorControl =
2962
+ continuesParent && lineage.parentRunId !== null ? controlRootsByAttempt.get(lineage.parentRunId) : undefined;
2963
+ controlRootsByAttempt.set(runId, priorControl ?? runId);
2964
+ controlAttempts.set(runId, { lineage, reservation: req.reservation });
2914
2965
  return lineage;
2915
2966
  }
2916
2967
 
@@ -2977,7 +3028,8 @@ export function createDispatchBundle(
2977
3028
 
2978
3029
  /** A reserved plan member owns its retry chain independently of the shared fleet root assignment. */
2979
3030
  function retryChainIsLive(run: ActiveRun): boolean {
2980
- if (run.aborted) return false;
3031
+ if (run.aborted || canceledControlRoots.has(controlRootsByAttempt.get(run.runId) ?? run.lineage.rootRunId))
3032
+ return false;
2981
3033
  const reservation = run.req.reservation;
2982
3034
  if (reservation === undefined) return assignments.get(run.lineage.rootRunId)?.status === "running";
2983
3035
  try {
@@ -3061,9 +3113,18 @@ export function createDispatchBundle(
3061
3113
  const attempt = run.lineage.attempt + 1;
3062
3114
  const reason = detail !== null ? `${outcome}: ${detail}` : outcome;
3063
3115
  const dueAt = now() + delayMs;
3116
+ let settleCanceled!: () => void;
3117
+ let rejectContinuation!: (error: unknown) => void;
3118
+ const continuation = new Promise<void>((resolve, reject) => {
3119
+ settleCanceled = resolve;
3120
+ rejectContinuation = reject;
3121
+ });
3122
+ trackMemberWork(run.runId, continuation);
3064
3123
  const timer = setTimeout(() => {
3065
3124
  retryQueue.delete(run.runId);
3066
- void executeRetry(run, attempt, reason, decision);
3125
+ // Ownership starts at scheduling, covering admission before a handle
3126
+ // exists and terminal receipt work after the handle arrives.
3127
+ executeRetry(run, attempt, reason, decision).then(settleCanceled, rejectContinuation);
3067
3128
  }, delayMs);
3068
3129
  retryQueue.set(run.runId, {
3069
3130
  runId: run.runId,
@@ -3076,6 +3137,7 @@ export function createDispatchBundle(
3076
3137
  rootRunId,
3077
3138
  terminalCandidate: receipt,
3078
3139
  timer,
3140
+ settleCanceled,
3079
3141
  });
3080
3142
  context.bus.emit(BusChannels.DispatchProgress, {
3081
3143
  runId: run.runId,
@@ -3176,6 +3238,7 @@ export function createDispatchBundle(
3176
3238
  // the worktree it created). A retry shares the assignment lineage but
3177
3239
  // must receive its own ledger/run identity.
3178
3240
  delete retryReq.runIdHint;
3241
+ let terminal: Promise<RunReceipt> | undefined;
3179
3242
  const reasonKey = retryReasonKey(run.lineage.rootRunId, attempt);
3180
3243
  retryReasons.set(reasonKey, reason);
3181
3244
  try {
@@ -3241,6 +3304,10 @@ export function createDispatchBundle(
3241
3304
  if (decision.excludedRouteParts.includes("runtime")) delete retryReq.workerRuntime;
3242
3305
  }
3243
3306
  const handle = await dispatch(retryReq, undefined, run.hostRun === undefined ? undefined : { hostRun: run.hostRun });
3307
+ // Cancellation can arrive while retry admission is awaiting a handle.
3308
+ if (canceledControlRoots.has(controlRootsByAttempt.get(run.runId) ?? run.lineage.rootRunId)) {
3309
+ contract.abort(handle.runId);
3310
+ }
3244
3311
  // The assignment folds every attempt into one stream with a reset marker.
3245
3312
  const marker: AssignmentAttemptStartEvent = {
3246
3313
  type: "attempt_start",
@@ -3262,6 +3329,7 @@ export function createDispatchBundle(
3262
3329
  runtimeKind: run.runtimeKind,
3263
3330
  event: marker,
3264
3331
  });
3332
+ terminal = handle.finalPromise;
3265
3333
  handle.finalPromise.catch((error) => {
3266
3334
  assignments.reject(asAssignmentId(run.lineage.rootRunId), error);
3267
3335
  reportDispatchDiagnostic(`finalize retry run ${handle.runId}`, error);
@@ -3294,6 +3362,7 @@ export function createDispatchBundle(
3294
3362
  outcomeDetail: denial,
3295
3363
  });
3296
3364
  }
3365
+ await terminal;
3297
3366
  }
3298
3367
 
3299
3368
  function requireLedger(): Ledger {
@@ -3684,7 +3753,7 @@ export function createDispatchBundle(
3684
3753
  ),
3685
3754
  req,
3686
3755
  );
3687
- assertPostRuntimeToolCompatibility(req.agentId, spec, effectiveTools, target);
3756
+ assertPostRuntimeToolCompatibility(req.agentId, spec, effectiveTools, target, pathScope.writeBoundaries.length > 0);
3688
3757
  const effectiveAdmission: DispatchAdmissionStage = {
3689
3758
  ...admission,
3690
3759
  allowedTools: effectiveTools,
@@ -5824,6 +5893,7 @@ export function createDispatchBundle(
5824
5893
  cwd: lifecycle.cwd,
5825
5894
  networkAllowed:
5826
5895
  lifecycle.admission.allowedTools.includes(ToolNames.WebFetch) ||
5896
+ lifecycle.admission.allowedTools.includes(ToolNames.WebRead) ||
5827
5897
  lifecycle.target.runtime.externalAgentLoop?.network === "externally-governed-unobserved",
5828
5898
  observedRunEffects,
5829
5899
  filesystem: nodeResultContractFilesystem(),
@@ -6168,7 +6238,11 @@ export function createDispatchBundle(
6168
6238
  }
6169
6239
  // Requests carrying lineage are internal attempts (retry or nested
6170
6240
  // orchestration) and retain the per-attempt handle contract.
6171
- if (req.lineage) return { ...handle, finalPromise: handle.finalPromise.finally(() => writerLease?.release()) };
6241
+ if (req.lineage) {
6242
+ const finalPromise = handle.finalPromise.finally(() => writerLease?.release());
6243
+ trackMemberWork(handle.runId, finalPromise);
6244
+ return { ...handle, finalPromise };
6245
+ }
6172
6246
 
6173
6247
  const assignment = assignments.open(handle.runId, assignmentPolicyFor(handle.effectiveRequest));
6174
6248
  persistAssignment(registerAssignment(assignment.id), `${assignment.id}:open`);
@@ -6270,7 +6344,13 @@ export function createDispatchBundle(
6270
6344
  ),
6271
6345
  req,
6272
6346
  );
6273
- assertPostRuntimeToolCompatibility(req.agentId, agentSpec, effectiveTools, target);
6347
+ assertPostRuntimeToolCompatibility(
6348
+ req.agentId,
6349
+ agentSpec,
6350
+ effectiveTools,
6351
+ target,
6352
+ pathScope.writeBoundaries.length > 0,
6353
+ );
6274
6354
  assertRuntimeCanHonorWorkerPermissionMode(target.runtime, settings?.fleet.permissions.mode ?? "deny");
6275
6355
  assertResponseSchemaEnforceable(target.runtime, target.modelCapabilities, req.responseSchema, effectiveTools.length);
6276
6356
  assertWriteRootsEnforceable(target.runtime, pathScope.writeBoundaries);
@@ -6927,6 +7007,7 @@ export function createDispatchBundle(
6927
7007
  function settleQueuedAssignmentsForShutdown(): void {
6928
7008
  for (const [finishedRunId, entry] of retryQueue) {
6929
7009
  clearTimeout(entry.timer);
7010
+ entry.settleCanceled();
6930
7011
  if (assignments.get(entry.rootRunId)?.status === "running") {
6931
7012
  settleAssignmentDurably(asAssignmentId(entry.rootRunId), entry.terminalCandidate, "canceled");
6932
7013
  }
@@ -6972,11 +7053,28 @@ export function createDispatchBundle(
6972
7053
  return stored?.assignmentId ?? ledger?.get(id)?.lineage?.rootRunId ?? id;
6973
7054
  }
6974
7055
 
7056
+ function controlRootFor(id: string): string {
7057
+ const exact = controlRootsByAttempt.get(id);
7058
+ if (exact !== undefined) return exact;
7059
+ const roots = new Set<string>();
7060
+ for (const [attempt, root] of assignmentRootsByAttempt) {
7061
+ if (root === id) roots.add(controlRootsByAttempt.get(attempt) ?? root);
7062
+ }
7063
+ if (roots.size > 1) {
7064
+ throw new Error(`dispatch: '${id}' names multiple fleet members; use a concrete member or assignment id`);
7065
+ }
7066
+ return roots.values().next().value ?? assignmentRootFor(id);
7067
+ }
7068
+
6975
7069
  function currentAssignmentRun(id: string): ActiveRun | null {
6976
- const rootRunId = assignmentRootFor(id);
7070
+ // An exact live attempt is authoritative even if a sibling has a higher
7071
+ // attempt ordinal. Completed IDs may follow only their own retry chain.
7072
+ const exact = active.get(id);
7073
+ if (exact !== undefined) return exact;
7074
+ const rootRunId = controlRootFor(id);
6977
7075
  let current: ActiveRun | null = null;
6978
7076
  for (const run of active.values()) {
6979
- if (run.lineage.rootRunId !== rootRunId) continue;
7077
+ if ((controlRootsByAttempt.get(run.runId) ?? run.lineage.rootRunId) !== rootRunId) continue;
6980
7078
  if (current === null || run.lineage.attempt > current.lineage.attempt) current = run;
6981
7079
  }
6982
7080
  return current;
@@ -7030,8 +7128,25 @@ export function createDispatchBundle(
7030
7128
  await Promise.allSettled([...assignmentWrites]);
7031
7129
  },
7032
7130
  },
7131
+ async drainMember(runId) {
7132
+ const root = controlRootFor(runId);
7133
+ const errors: unknown[] = [];
7134
+ while (true) {
7135
+ const pending = [...(memberWork.get(root) ?? [])];
7136
+ const live = currentAssignmentRun(runId);
7137
+ if (live !== null) pending.push(live.finalPromise);
7138
+ if (pending.length === 0) break;
7139
+ for (const result of await Promise.allSettled(pending)) {
7140
+ if (result.status === "rejected" && !errors.includes(result.reason)) errors.push(result.reason);
7141
+ }
7142
+ }
7143
+ if (errors.length === 1) throw errors[0];
7144
+ if (errors.length > 1) throw new AggregateError(errors, "dispatch member drain failed", { cause: errors[0] });
7145
+ },
7033
7146
  abort(runId, reason) {
7034
- const rootRunId = assignmentRootFor(runId);
7147
+ const rootRunId = controlRootFor(runId);
7148
+ const run = currentAssignmentRun(runId);
7149
+ canceledControlRoots.add(rootRunId);
7035
7150
  const queued = pendingCapacity.get(rootRunId);
7036
7151
  if (queued !== undefined && capacityAdmission.cancel(rootRunId)) {
7037
7152
  persistAssignment(cancelStoredAssignment(rootRunId), `${rootRunId}:cancel-queued`);
@@ -7049,10 +7164,13 @@ export function createDispatchBundle(
7049
7164
  persistAssignment(cancelStoredAssignment(rootRunId), `${rootRunId}:cancel`);
7050
7165
  }
7051
7166
  for (const [finishedRunId, retry] of retryQueue) {
7052
- if (retry.rootRunId !== rootRunId) continue;
7167
+ if ((controlRootsByAttempt.get(finishedRunId) ?? retry.rootRunId) !== rootRunId) continue;
7053
7168
  clearTimeout(retry.timer);
7169
+ retry.settleCanceled();
7054
7170
  retryQueue.delete(finishedRunId);
7055
- settleAssignmentDurably(asAssignmentId(rootRunId), retry.terminalCandidate, "canceled");
7171
+ if (retry.rootRunId === rootRunId) {
7172
+ settleAssignmentDurably(asAssignmentId(rootRunId), retry.terminalCandidate, "canceled");
7173
+ }
7056
7174
  context.bus.emit(BusChannels.RunAborted, {
7057
7175
  source: "dispatch_abort",
7058
7176
  runId: finishedRunId,
@@ -7067,7 +7185,6 @@ export function createDispatchBundle(
7067
7185
  event: { type: "retry_canceled", attempt: retry.attempt },
7068
7186
  });
7069
7187
  }
7070
- const run = currentAssignmentRun(rootRunId);
7071
7188
  if (!run) return;
7072
7189
  emitRunAborted(run, "dispatch_abort");
7073
7190
  run.aborted = true;
@@ -18,6 +18,7 @@ import { performance } from "node:perf_hooks";
18
18
  import { readClioVersion } from "../../core/package-root.js";
19
19
  import { shellQuote } from "../../core/shell-quote.js";
20
20
  import { clioStateDir } from "../../core/xdg.js";
21
+ import { atomicWrite } from "../../engine/session.js";
21
22
  import {
22
23
  evaluateRouteFacts,
23
24
  type FactState,
@@ -91,6 +92,20 @@ export function readFleetPreflightRecords(): FleetPreflightRecord[] {
91
92
  }
92
93
  }
93
94
 
95
+ /**
96
+ * Upsert records keyed by (nodeId, projectRoot). Only `clio-coder doctor --fix`
97
+ * writes: plain doctor stays observation-only, and dispatch admission fails
98
+ * closed on a node that has no stored passing record.
99
+ */
100
+ export function recordFleetPreflight(records: ReadonlyArray<FleetPreflightRecord>): void {
101
+ const merged = new Map<string, FleetPreflightRecord>();
102
+ for (const record of [...readFleetPreflightRecords(), ...records]) {
103
+ merged.set(`${record.nodeId}\0${record.projectRoot}`, record);
104
+ }
105
+ const file: FleetPreflightStoreFile = { version: 2, records: [...merged.values()] };
106
+ atomicWrite(storePath(), JSON.stringify(file, null, 2));
107
+ }
108
+
94
109
  export interface FleetPreflightVerdict {
95
110
  ok: boolean;
96
111
  reason: string | null;
@@ -110,19 +125,19 @@ export function fleetPreflightVerdict(
110
125
  if (!record) {
111
126
  return {
112
127
  ok: false,
113
- reason: `node '${node.id}' has not passed the fleet preflight for ${projectRoot}; run 'clio-coder doctor'`,
128
+ reason: `node '${node.id}' has not passed the fleet preflight for ${projectRoot}; run 'clio-coder doctor --fix'`,
114
129
  };
115
130
  }
116
131
  if (record.host !== node.host) {
117
132
  return {
118
133
  ok: false,
119
- reason: `node '${node.id}' preflight was recorded for host '${record.host}' but the node now points at '${node.host}'; run 'clio-coder doctor'`,
134
+ reason: `node '${node.id}' preflight was recorded for host '${record.host}' but the node now points at '${node.host}'; run 'clio-coder doctor --fix'`,
120
135
  };
121
136
  }
122
137
  if (record.localVersion !== readClioVersion()) {
123
138
  return {
124
139
  ok: false,
125
- reason: `node '${node.id}' preflight predates a local clio-coder upgrade (${record.localVersion} -> ${readClioVersion()}); run 'clio-coder doctor'`,
140
+ reason: `node '${node.id}' preflight predates a local clio-coder upgrade (${record.localVersion} -> ${readClioVersion()}); run 'clio-coder doctor --fix'`,
126
141
  };
127
142
  }
128
143
  if (!record.ok) {
@@ -788,6 +788,7 @@ export async function executeFleetRun(input: ExecuteFleetRunInput): Promise<Flee
788
788
  beginWriteBoundary: (window, stepIds) => boundaryEnforcer.begin(window, stepIds),
789
789
  verifyWriteBoundary: (window, stepIds) => boundaryEnforcer.verify(window, stepIds),
790
790
  cancel: (assignmentId) => dispatch.abort(assignmentId),
791
+ drainMember: (assignmentId) => dispatch.drainMember?.(assignmentId) ?? Promise.resolve(),
791
792
  release: (ownerId) => {
792
793
  if (ownerId === NO_WORKER_RESERVATION) return;
793
794
  dispatch.reservations?.release(ownerId);
@@ -75,7 +75,7 @@ export interface GateDecisionArtifact {
75
75
  * prose line. Two schemas exist because the two topologies ask different
76
76
  * questions:
77
77
  *
78
- * - Review asks "does this work pass?", which is exactly the Slice 2
78
+ * - Review asks "does this work pass?", which is exactly the
79
79
  * `verifier-report` contract. There is deliberately no `revise` verdict:
80
80
  * whether a failure is worth another cycle is the coordinator's bounded
81
81
  * continuation policy, not a decision the reviewed model gets to author.
@@ -96,7 +96,7 @@ export interface CompeteGateResult {
96
96
 
97
97
  export type GateResultParse<T> = { ok: true; result: T } | { ok: false; reason: string };
98
98
 
99
- /** Parse a reviewer answer under the Slice 2 Verifier contract. */
99
+ /** Parse a reviewer answer under the verifier-report contract. */
100
100
  function parseReviewGateResult(output: string): GateResultParse<ReviewGateResult> {
101
101
  const result = parseVerifierResult(output);
102
102
  return result === null
@@ -128,7 +128,7 @@ export interface ReviewGateDecision {
128
128
  /**
129
129
  * Apply the coordinator's review policy to one reviewer answer.
130
130
  *
131
- * The reviewer answers pass or fail under its Slice 2 contract and nothing
131
+ * The reviewer answers pass or fail under its verifier-report contract and nothing
132
132
  * else. `revise` is this function's bounded continuation decision: a failure
133
133
  * with cycles left earns another builder attempt, the same failure at the bound
134
134
  * is simply the terminal fail, and an answer that does not satisfy the contract
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Pure heartbeat watchdog classifier (Phase 6 slice 3).
2
+ * Pure heartbeat watchdog classifier.
3
3
  *
4
4
  * Maps a last-seen monotonic stamp to one of three states. The dispatch domain
5
5
  * drives this on each scheduler tick; the orchestrator uses `stale` to surface
@@ -5,15 +5,15 @@ import { dirname, join, resolve } from "node:path";
5
5
  import { PATH_BOUNDARY_MAX_ENTRIES, pathBoundaryCovers, resolvePathBoundary } from "../../core/path-boundary.js";
6
6
  import { withStateFileLockSync } from "../../core/state-file-lock.js";
7
7
  import { clioStateDir } from "../../core/xdg.js";
8
- import { judgeNumericTexts, judgePerfTexts } from "../../tools/verify/scripts.js";
8
+ import { JUDGED_CHECK_MAX_OUTPUT_BYTES, judgeNumericTexts, judgePerfTexts } from "../../tools/verify/scripts.js";
9
9
  import { FLEET_COMMAND_BASE_ENV, type FleetCommand } from "../agents/fleet-commands.js";
10
- import { runCodeStep } from "./code-step.js";
10
+ import { CODE_STEP_CAPTURE_MAX_BYTES, runCodeStep } from "./code-step.js";
11
11
  import type { DispatchRequest } from "./contract.js";
12
12
  import type { RunHostVerification, RunHostVerificationAttribution, RunHostVerificationCheck } from "./types.js";
13
13
  import { captureWorkspaceSnapshot } from "./write-boundary.js";
14
14
 
15
15
  const OUTPUT_TAIL_BYTES = 2_048;
16
- const MEMO_VERSION = 2;
16
+ const MEMO_VERSION = 3;
17
17
 
18
18
  type ResolvedCheck = NonNullable<DispatchRequest["resolvedVerification"]>[number];
19
19
 
@@ -164,6 +164,7 @@ function judgeResolvedCheck(
164
164
  referenceText,
165
165
  resolvedCheck.numeric.tolerance,
166
166
  `reference '${resolvedCheck.numeric.reference}'`,
167
+ resolvedCheck.numeric.reference,
167
168
  );
168
169
  if (report instanceof Error) return { exitCode: 1, outputTail: `numeric-compare: ${report.message}` };
169
170
  return { exitCode: report.passed ? 0 : 1, report, outputTail: outputTail(report.summary) };
@@ -214,20 +215,25 @@ async function runResolvedCheck(input: {
214
215
  outputExcerpt: "",
215
216
  };
216
217
  }
218
+ const judged = resolvedCheck.kind === "numeric-compare" || resolvedCheck.kind === "perf-budget";
219
+ const captureMaxBytes = judged ? JUDGED_CHECK_MAX_OUTPUT_BYTES : CODE_STEP_CAPTURE_MAX_BYTES;
217
220
  const outcome = await runCodeStep({
218
221
  stepId: `verification-${input.index + 1}-${resolvedCheck.check.replace(/[^a-z0-9._-]/giu, "_")}`,
219
222
  command,
220
223
  workspaceRoot: resolvedCheck.cwd,
221
224
  artifactDir: join(input.stateDir, "artifacts", input.runId, "verification"),
222
225
  env: input.env,
226
+ maxOutputBytes: captureMaxBytes,
223
227
  });
224
228
  const artifactPath = outcome.record.artifactPaths[0];
225
- const judgement = judgeResolvedCheck(
226
- resolvedCheck,
227
- outcome.record.exitCode,
228
- outcome.record.durationMs,
229
- outcome.stdout,
230
- );
229
+ // outputTruncated also covers the report excerpt; only capture loss prevents judgement.
230
+ const judgement =
231
+ judged && outcome.record.outputTruncated && outcome.record.outputBytes > captureMaxBytes
232
+ ? {
233
+ exitCode: 1,
234
+ outputTail: `verify: ${resolvedCheck.kind} command output exceeded ${captureMaxBytes} bytes before judgement; captured output was truncated`,
235
+ }
236
+ : judgeResolvedCheck(resolvedCheck, outcome.record.exitCode, outcome.record.durationMs, outcome.stdout);
231
237
  const check: RunHostVerificationCheck = {
232
238
  check: resolvedCheck.check,
233
239
  argv: [...outcome.record.argv],
@@ -307,11 +313,7 @@ function checkDedupeKey(resolvedCheck: ResolvedCheck): string {
307
313
  : {
308
314
  reference: numeric.reference,
309
315
  referenceDigest: sha256(JSON.stringify(readSealedFile(numeric.reference) ?? null)),
310
- tolerance: {
311
- absolute: numeric.tolerance.absolute,
312
- relative: numeric.tolerance.relative,
313
- ulp: numeric.tolerance.ulp,
314
- },
316
+ tolerance: numeric.tolerance,
315
317
  },
316
318
  perf:
317
319
  perf === undefined
@@ -1,8 +1,7 @@
1
1
  /**
2
- * Cheap, pure findings classifier for the durable receipt summary (v0.2.7
3
- * Slice 3). It maps the signals already present on a receipt draft and its
4
- * ledger envelope -- outcome, outcomeDetail, exitCode, toolStats, toolActivity
5
- * -- to a conservative subset of the canonical EvidenceTag taxonomy.
2
+ * Cheap, pure findings classifier for the durable receipt summary. It maps
3
+ * outcome, outcomeDetail, exitCode, toolStats, and toolActivity from the receipt
4
+ * draft and ledger envelope to a conservative subset of the EvidenceTag taxonomy.
6
5
  *
7
6
  * This is deliberately NOT buildEvidence. The forensic aggregator reads the
8
7
  * persisted receipt, so calling it at record time would create a cycle. This
@@ -36,9 +36,9 @@ export type ReservationMemberStatus = "held" | "consumed" | "released";
36
36
  export type ReservationStatus = "active" | "released" | "rolled_back" | "expired";
37
37
 
38
38
  /**
39
- * A reservation holds four scarce things and nothing else: a global
40
- * concurrency slot, a per-node slot, an inference-endpoint slot, and a budget
41
- * upper bound. Node and endpoint identity matter only because slots bind on
39
+ * A reservation holds global, per-node, and inference-endpoint concurrency
40
+ * slots and records an advisory cost upper bound. Node and endpoint identity
41
+ * matter only because slots bind on
42
42
  * those dimensions. Agent, target, model, and runtime
43
43
  * identity are route identity, which the failover envelope owns
44
44
  * (`assertRouteWithinApprovedEnvelope`); pinning them here made a
@@ -330,12 +330,10 @@ export function transferDispatchReservationToLease(input: {
330
330
  }
331
331
 
332
332
  /**
333
- * Move a member's held capacity to the node a retry actually resolved, and
334
- * re-check the aggregate budget against the retry's own estimate. The durable
335
- * lease moves the capacity slot on a retry, but nothing else re-checks money, so
336
- * a retry that resolves a costlier route would otherwise run outside what the
337
- * plan reserved. Atomic under
338
- * the state-file lock: the old node's slot is released and the new one acquired
333
+ * Move a member's held capacity to the node a retry actually resolved and
334
+ * record the retry's own cost estimate. Allocation rechecks capacity while
335
+ * retaining cost as advisory accounting. Atomic under the state-file lock:
336
+ * the old node's slot is released and the new one acquired
339
337
  * in a single write, so a concurrent plan can never observe both held. Fails
340
338
  * closed with a named reason, which the caller surfaces as an admission denial
341
339
  * rather than letting the attempt escape its reservation.
@@ -102,7 +102,7 @@ export function evaluateRouteFacts(
102
102
  if (requirement.mode === "shadow") return { ok: true, unknowns };
103
103
  return {
104
104
  ok: false,
105
- reason: `no probe fact for target '${requirement.targetId}' on node '${requirement.nodeId}'; run 'clio-coder doctor'`,
105
+ reason: `no probe fact for target '${requirement.targetId}' on node '${requirement.nodeId}'; run 'clio-coder doctor --fix'`,
106
106
  unknowns,
107
107
  };
108
108
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Dispatch run ledger with atomic writes (Phase 6 slice 2).
2
+ * Dispatch run ledger with atomic writes.
3
3
  *
4
4
  * On-disk layout under `clioStateDir()`:
5
5
  * runs.json JSON array of RunEnvelope, newest first
@@ -9,8 +9,8 @@
9
9
  * mutate memory only; `persist()` writes the settings-bounded ring (default
10
10
  * 1000) atomically via engine.atomicWrite.
11
11
  *
12
- * No worker spawning, no domain wire-up, no SafeEventBus emission yet. Those
13
- * land in P6S3 and P6S5. This slice is a pure persistence primitive.
12
+ * This module owns persistence. The dispatch extension wires worker spawning,
13
+ * cross-domain coordination, and event emission around this ledger.
14
14
  *
15
15
  * A crash between recordReceipt and persist leaves the receipt JSON on disk
16
16
  * without a ledger entry. The dispatch extension closes that gap at startup by
@@ -1,6 +1,6 @@
1
1
  import type { WorkerContextProvenance } from "../context/worker/contract.js";
2
2
  /**
3
- * Shared run + receipt types for the dispatch domain (Phase 6 slice 2).
3
+ * Shared run + receipt types for the dispatch domain.
4
4
  *
5
5
  * RunEnvelope is the live record kept in the ledger (runs.json). RunReceipt is
6
6
  * the per-run artifact written under receipts/<runId>.json on completion. Both
@@ -2,6 +2,7 @@ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { rawDurationMs } from "../../core/timers.js";
4
4
  import { isProjectVerifierCheckId, isVerificationScriptName } from "../../core/verification-scripts.js";
5
+ import { effectiveToolCall } from "../../tools/surface.js";
5
6
  import type {
6
7
  RunEnvelope,
7
8
  RunKind,
@@ -573,7 +574,12 @@ function validationToolCallCandidate(
573
574
  runSources: ReadonlyArray<EvidenceRunSource>,
574
575
  ): ValidationToolCallCandidate | null {
575
576
  const call = extractSessionToolCall(entry, linked);
576
- if (validationToolCallSummary(call.tool, call.args) === null) return null;
577
+ // The capability a gateway call reached is what ran; a validation command
578
+ // is recognized under that name, never under `gateway`.
579
+ const effective = effectiveToolCall(call.tool, call.args);
580
+ if (validationToolCallSummary(effective.toolName, effective.viaGateway ? effective.args : call.args) === null) {
581
+ return null;
582
+ }
577
583
  return {
578
584
  toolCallId: call.id,
579
585
  runId: validationRunIdFor(linked, runSources),
@@ -1025,7 +1031,15 @@ function extractSessionToolCall(entry: MessageEntry, linked: LinkedSessionEntry)
1025
1031
  block?.arguments ??
1026
1032
  block?.args ??
1027
1033
  undefined;
1028
- return { id, tool, args, timestamp: entry.timestamp, link: linked.link, sessionId: linked.sessionId };
1034
+ const effective = effectiveToolCall(tool, args);
1035
+ return {
1036
+ id,
1037
+ tool: effective.toolName,
1038
+ args: effective.args ?? args,
1039
+ timestamp: entry.timestamp,
1040
+ link: linked.link,
1041
+ sessionId: linked.sessionId,
1042
+ };
1029
1043
  }
1030
1044
 
1031
1045
  function extractSessionToolResult(entry: MessageEntry, linked: LinkedSessionEntry): SessionToolResult {
@@ -1047,10 +1061,18 @@ function extractSessionToolResult(entry: MessageEntry, linked: LinkedSessionEntr
1047
1061
  payload?.out ??
1048
1062
  payload?.content ??
1049
1063
  (contentText.length > 0 ? contentText : entry.payload);
1064
+ const effective = effectiveToolCall(tool, undefined, payloadObject(result)?.details ?? payload?.details);
1065
+ const resultObject = payloadObject(result);
1066
+ const details = payloadObject(resultObject?.details);
1067
+ let projectedResult = result;
1068
+ if (effective.viaGateway && resultObject && details) {
1069
+ const { capability: _capability, ...innerDetails } = details;
1070
+ projectedResult = { ...resultObject, details: innerDetails };
1071
+ }
1050
1072
  return {
1051
1073
  id,
1052
- tool,
1053
- result,
1074
+ tool: effective.toolName,
1075
+ result: projectedResult,
1054
1076
  isError: payload?.isError === true || payload?.error === true,
1055
1077
  timestamp: entry.timestamp,
1056
1078
  link: linked.link,
@@ -1351,8 +1373,13 @@ function renderTranscript(
1351
1373
  }
1352
1374
  if (sessionLinks.entries.length > 0) {
1353
1375
  lines.push("", "## Linked Session Transcript");
1376
+ const calls = new Map<string, string>();
1354
1377
  for (const linked of sessionLinks.entries) {
1355
- lines.push(...renderSessionTranscriptEntry(linked));
1378
+ if (linked.entry.kind === "message" && linked.entry.role === "tool_call") {
1379
+ const call = extractSessionToolCall(linked.entry, linked);
1380
+ calls.set(call.id, call.tool);
1381
+ }
1382
+ lines.push(...renderSessionTranscriptEntry(linked, calls));
1356
1383
  }
1357
1384
  }
1358
1385
  lines.push("");
@@ -1379,7 +1406,7 @@ function transcriptRunLink(link: SessionRunLink): string {
1379
1406
  return "";
1380
1407
  }
1381
1408
 
1382
- function renderSessionTranscriptEntry(linked: LinkedSessionEntry): string[] {
1409
+ function renderSessionTranscriptEntry(linked: LinkedSessionEntry, calls: ReadonlyMap<string, string>): string[] {
1383
1410
  const entry = linked.entry;
1384
1411
  const prefix = `- ${entry.timestamp} session=${linked.sessionId}${transcriptRunLink(linked.link)}`;
1385
1412
  if (entry.kind === "message") {
@@ -1391,7 +1418,8 @@ function renderSessionTranscriptEntry(linked: LinkedSessionEntry): string[] {
1391
1418
  const result = extractSessionToolResult(entry, linked);
1392
1419
  const id = result.id === null ? "" : ` id=${result.id}`;
1393
1420
  const error = result.isError ? " error=true" : "";
1394
- return [`${prefix} tool_result ${result.tool}${id}${error}: ${previewUnknown(result.result)}`];
1421
+ const tool = result.id === null ? result.tool : (calls.get(result.id) ?? result.tool);
1422
+ return [`${prefix} tool_result ${tool}${id}${error}: ${previewUnknown(result.result)}`];
1395
1423
  }
1396
1424
  const text = collapseWhitespace(extractTextFromPayload(entry.payload));
1397
1425
  const rendered = text.length > 0 ? truncateText(text, TRANSCRIPT_TEXT_MAX_CHARS) : previewUnknown(entry.payload);