@iowarp/clio-coder 0.4.7 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (675) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +111 -0
  3. package/CONTRIBUTING.md +83 -74
  4. package/README.md +69 -47
  5. package/dist/{acp-W3Y3TRHD.js → acp-ZWZCPS2A.js} +15 -15
  6. package/dist/{agents-J4ICNLQ3.js → agents-LYSOWZUE.js} +61 -59
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
  9. package/dist/assets/web-notices/hono-LICENSE +21 -0
  10. package/dist/{auth-X2UJUMOC.js → auth-WBQGKWQ5.js} +27 -27
  11. package/dist/background-BUMOBAQN.js +37 -0
  12. package/dist/{builtins-XLXWWSRF.js → builtins-ODRJOEDI.js} +7 -7
  13. package/dist/{chunk-C3G5PNUO.js → chunk-2DRRZ57Q.js} +36 -27
  14. package/dist/chunk-2JBZYUPY.js +105 -0
  15. package/dist/chunk-2KUBKL63.js +336 -0
  16. package/dist/chunk-2VBWFXYE.js +198 -0
  17. package/dist/{chunk-XZ6UFQ52.js → chunk-2X2R3UTH.js} +25 -15
  18. package/dist/{chunk-M6Z2V6YU.js → chunk-37LW32LZ.js} +5 -5
  19. package/dist/{chunk-6LRLOJHQ.js → chunk-3AND2EFU.js} +11 -62
  20. package/dist/{chunk-FQOOGXBH.js → chunk-3RDHGNU7.js} +101 -33
  21. package/dist/{chunk-D2T66PDV.js → chunk-3SUDBGEI.js} +41 -208
  22. package/dist/{chunk-5AJPUR72.js → chunk-3TQN67I2.js} +9 -9
  23. package/dist/{chunk-LBFQMYS3.js → chunk-3U4BL2EV.js} +5 -3
  24. package/dist/{chunk-UFYNOQK4.js → chunk-3UQADNG2.js} +7 -7
  25. package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
  26. package/dist/{chunk-NO7J45X6.js → chunk-4ATBOFRP.js} +713 -218
  27. package/dist/{chunk-ECOMVOHP.js → chunk-4DNL43EZ.js} +3 -3
  28. package/dist/{chunk-WT5TRMO4.js → chunk-4HFJKRGZ.js} +255 -82
  29. package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
  30. package/dist/{chunk-WURGVOZJ.js → chunk-5RTEFNBP.js} +18 -14
  31. package/dist/{config-YXARKGTX.js → chunk-64XJW7NT.js} +24 -268
  32. package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
  33. package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
  34. package/dist/{chunk-MZNWZUJM.js → chunk-7FBCRWVT.js} +288 -288
  35. package/dist/{chunk-UA6W4XFJ.js → chunk-7JSOSVLP.js} +2 -2
  36. package/dist/chunk-7N3OLLSL.js +637 -0
  37. package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
  38. package/dist/{chunk-N37QC5FV.js → chunk-A6DULIMH.js} +21 -9
  39. package/dist/{fleet-decisions-S3PTZV2D.js → chunk-AB3QXXBC.js} +5 -41
  40. package/dist/chunk-ACCECAH4.js +49 -0
  41. package/dist/{chunk-CP3HIR5H.js → chunk-AM6CEP2K.js} +20 -19
  42. package/dist/chunk-AUHVBIDW.js +19 -0
  43. package/dist/{chunk-BQQ5MXUC.js → chunk-AY4XE6GN.js} +19 -13
  44. package/dist/{chunk-ISNCCX42.js → chunk-BBA2TAWV.js} +10 -9
  45. package/dist/chunk-BFPHMSK7.js +169 -0
  46. package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
  47. package/dist/{chunk-DO7M3LSX.js → chunk-BMNVVKEW.js} +40 -93
  48. package/dist/{chunk-VTYHHQ57.js → chunk-CTGZCEI6.js} +2 -2
  49. package/dist/{chunk-RTLNFZMD.js → chunk-DIAJYJYG.js} +3 -3
  50. package/dist/chunk-EHZRAB4U.js +63 -0
  51. package/dist/{chunk-KS7ETA3P.js → chunk-EM2DIQAJ.js} +3 -3
  52. package/dist/{chunk-MNQN3X6Y.js → chunk-ETF4ROKH.js} +5 -5
  53. package/dist/{chunk-WN552PKN.js → chunk-F2YM3JY4.js} +744 -1134
  54. package/dist/{chunk-7EEGBKV4.js → chunk-FEBQWHJT.js} +24 -19
  55. package/dist/{chunk-4QKAITQT.js → chunk-FPS4R2RN.js} +74 -10
  56. package/dist/chunk-G5R53COU.js +68 -0
  57. package/dist/chunk-GHXGMFQ5.js +40 -0
  58. package/dist/{chunk-GFQ7P2UF.js → chunk-GJDRMBDI.js} +10 -10
  59. package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
  60. package/dist/{chunk-NCCQ6DVS.js → chunk-GREYLTZ5.js} +8 -8
  61. package/dist/{chunk-HOX4YZ2K.js → chunk-H2WSCZZT.js} +19 -3
  62. package/dist/{chunk-3LXJOICS.js → chunk-H6IUCY6Q.js} +2 -2
  63. package/dist/{chunk-BO4XV5VX.js → chunk-H72DCH3E.js} +95 -206
  64. package/dist/{chunk-SEDI5K5B.js → chunk-H7TXJR23.js} +20 -20
  65. package/dist/chunk-HBJQQTKM.js +40 -0
  66. package/dist/chunk-HCVKSGNZ.js +990 -0
  67. package/dist/chunk-HVCAY2FH.js +67 -0
  68. package/dist/{chunk-34XHRVKG.js → chunk-I47EJPYL.js} +3 -3
  69. package/dist/{chunk-4N2RZ4TO.js → chunk-IALGWTLO.js} +3 -3
  70. package/dist/{chunk-IQCNVLO6.js → chunk-IALZJE37.js} +10 -7
  71. package/dist/{chunk-DLIYANB7.js → chunk-IC7JXLOM.js} +16 -11
  72. package/dist/{chunk-G4LGUTOE.js → chunk-IOSVTTCD.js} +5 -5
  73. package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
  74. package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
  75. package/dist/{chunk-TN5FW4XY.js → chunk-JIYWMQZ5.js} +12 -9
  76. package/dist/{chunk-T7QQBNLH.js → chunk-JKU34ACI.js} +10 -8
  77. package/dist/chunk-JOBN2YQQ.js +176 -0
  78. package/dist/chunk-JOL2QRLE.js +152 -0
  79. package/dist/{chunk-GXIWHXDB.js → chunk-JTR3VSV3.js} +3 -3
  80. package/dist/{chunk-T334FW2H.js → chunk-JU6MAMRJ.js} +7 -7
  81. package/dist/chunk-JURMQWVJ.js +15 -0
  82. package/dist/{chunk-CULVKYTK.js → chunk-K3XN4LZ4.js} +5 -5
  83. package/dist/{chunk-3T4DXWP6.js → chunk-KIVFXGBM.js} +27 -7
  84. package/dist/chunk-KKRXONXG.js +43 -0
  85. package/dist/{chunk-YPRSNUTC.js → chunk-KOAHT3N2.js} +2 -2
  86. package/dist/chunk-KP5BPXR3.js +73 -0
  87. package/dist/{chunk-UA3W4FGC.js → chunk-KRJQG47M.js} +6 -6
  88. package/dist/{chunk-GI5RRMAH.js → chunk-KW6OJ7IY.js} +19 -21
  89. package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
  90. package/dist/{chunk-MZHXENL7.js → chunk-L4RUTLRL.js} +8 -8
  91. package/dist/{chunk-P5SC4DLJ.js → chunk-LGTVWPRN.js} +2 -2
  92. package/dist/{chunk-65BGHOUR.js → chunk-LSQW6KZO.js} +5 -5
  93. package/dist/{chunk-TZHN5ITX.js → chunk-LWJYOHT3.js} +8 -8
  94. package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
  95. package/dist/chunk-MJ4QEJVT.js +185 -0
  96. package/dist/{chunk-T4TY5GG3.js → chunk-MO65K5CH.js} +5 -5
  97. package/dist/{chunk-TZ6UVP2H.js → chunk-MTOZEQHL.js} +8 -8
  98. package/dist/chunk-MZDPF35R.js +45 -0
  99. package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
  100. package/dist/{chunk-KAFMW7WM.js → chunk-NBPA5QM6.js} +2 -2
  101. package/dist/{chunk-EUEXGXXR.js → chunk-NMBEW4PP.js} +5 -5
  102. package/dist/{chunk-SELG4SUR.js → chunk-NPLLK3HO.js} +72 -89
  103. package/dist/{chunk-VCRVEDUC.js → chunk-NSYGPIVW.js} +5 -5
  104. package/dist/{context-7HJEWTTP.js → chunk-NXTV5OI5.js} +36 -90
  105. package/dist/{chunk-IMOD2YPV.js → chunk-NYDG4QP4.js} +9 -19
  106. package/dist/{chunk-6CA2BHOR.js → chunk-OA2GDACN.js} +5 -5
  107. package/dist/{chunk-A67NR5AT.js → chunk-PJI57EC6.js} +14 -11
  108. package/dist/{chunk-IJMW64DX.js → chunk-PJJBUGMR.js} +50 -50
  109. package/dist/{chunk-CPXGJI2A.js → chunk-PNJE7JPS.js} +20 -5
  110. package/dist/chunk-PP23PZEV.js +1347 -0
  111. package/dist/chunk-PPIFDSBK.js +409 -0
  112. package/dist/{chunk-T52TPHYC.js → chunk-PTFISXQO.js} +8 -7
  113. package/dist/{chunk-C6GEXX4L.js → chunk-QB33Z5S7.js} +5 -5
  114. package/dist/{chunk-VMATUZB6.js → chunk-QGNII5VC.js} +10 -10
  115. package/dist/{chunk-TLTGZTXI.js → chunk-QI72X67S.js} +104 -27
  116. package/dist/chunk-QKHZZFKH.js +98 -0
  117. package/dist/{chunk-PFLOULP3.js → chunk-RDKX2PME.js} +4 -4
  118. package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
  119. package/dist/chunk-RPMNIFRY.js +65 -0
  120. package/dist/{chunk-L3Z5ANCV.js → chunk-RQROVOV3.js} +13 -11
  121. package/dist/{chunk-6YHPAAZR.js → chunk-S34A7BSP.js} +3 -3
  122. package/dist/{chunk-5ZSZEYJK.js → chunk-SJETVJHX.js} +2 -2
  123. package/dist/{chunk-77CZRFTE.js → chunk-SJMNU4ZS.js} +2 -2
  124. package/dist/chunk-SLLG2G44.js +85 -0
  125. package/dist/{chunk-GVZFCJHE.js → chunk-SQAZN2V3.js} +48 -22
  126. package/dist/{chunk-2O2LVQQK.js → chunk-SQBT46OF.js} +2 -2
  127. package/dist/{chunk-ZGIGW4ZG.js → chunk-TCUOGIL2.js} +5 -5
  128. package/dist/{chunk-DACXIVVF.js → chunk-TIWPKCVO.js} +5 -5
  129. package/dist/{chunk-5CMARGPF.js → chunk-UIU7MGZ3.js} +11 -2
  130. package/dist/chunk-USBBEKHW.js +177 -0
  131. package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
  132. package/dist/{chunk-MBJO5VNZ.js → chunk-VPWGADBG.js} +33 -33
  133. package/dist/{chunk-UUQ5G6EZ.js → chunk-VWFCAK34.js} +6 -6
  134. package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
  135. package/dist/{chunk-4MFBBY2Z.js → chunk-W72LLZAV.js} +3 -3
  136. package/dist/{chunk-4UHVS5T7.js → chunk-WGRDABW7.js} +8 -8
  137. package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
  138. package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
  139. package/dist/{chunk-6YA46L5A.js → chunk-XFLSL7BT.js} +2 -2
  140. package/dist/{chunk-QKWL7SYE.js → chunk-XJZEDCNT.js} +50 -39
  141. package/dist/{chunk-UWD3JD5X.js → chunk-XLLEL3K7.js} +10 -10
  142. package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
  143. package/dist/chunk-XNZWWDC3.js +686 -0
  144. package/dist/{chunk-WBVKKTUT.js → chunk-XRECG65F.js} +2 -2
  145. package/dist/chunk-XTQ7MEJG.js +457 -0
  146. package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
  147. package/dist/{chunk-WB7POC6M.js → chunk-Y3M2T5RO.js} +6 -6
  148. package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
  149. package/dist/{chunk-EUZRMP4Y.js → chunk-YPQOPFP7.js} +20 -20
  150. package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
  151. package/dist/{chunk-BAU36233.js → chunk-YQYINEJI.js} +9 -9
  152. package/dist/{chunk-CE64C5K5.js → chunk-ZF6CV4WZ.js} +1356 -235
  153. package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
  154. package/dist/{chunk-IZYTT3CD.js → chunk-ZKQ63XZ5.js} +16 -39
  155. package/dist/{chunk-6TAATXXH.js → chunk-ZKVMDNAN.js} +7 -7
  156. package/dist/chunk-ZST3FRCV.js +132 -0
  157. package/dist/cli/index.js +50 -38
  158. package/dist/{clio-L2P7S2R2.js → clio-JUDCLNHC.js} +11 -11
  159. package/dist/clio-context-tools-FT672MNZ.js +136 -0
  160. package/dist/{code-nav-B5LNX4KU.js → code-nav-7OVCTP2Z.js} +39 -37
  161. package/dist/{components-63MMQKUT.js → components-OZXZMDWU.js} +11 -11
  162. package/dist/config-P3ZQVF63.js +275 -0
  163. package/dist/config-graph-GKAOBAS5.js +160 -0
  164. package/dist/{configure-LMVQJ46J.js → configure-25LRYZJG.js} +56 -55
  165. package/dist/context-72VQV7JX.js +73 -0
  166. package/dist/{context-YG2LZDYZ.js → context-COWRWXP3.js} +89 -83
  167. package/dist/{context-XSZKKFBW.js → context-WB3D474G.js} +16 -16
  168. package/dist/{context-clear-AC5NXHM2.js → context-clear-Y4LYMWC6.js} +88 -82
  169. package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
  170. package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
  171. package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-TMZYVC7A.js} +27 -25
  172. package/dist/data-tool-KMBWKKWR.js +2987 -0
  173. package/dist/{detail-H73BEF2N.js → detail-4GLROGY5.js} +89 -83
  174. package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-TR3LBP5P.js} +113 -107
  175. package/dist/docs-ZK777W2G.js +101 -0
  176. package/dist/{doctor-EQYJOGUG.js → doctor-WC4OV2OB.js} +76 -73
  177. package/dist/{eval-4P7O6CCE.js → eval-FUNWJNUJ.js} +88 -73
  178. package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
  179. package/dist/evals-L73EBHSU.js +104 -0
  180. package/dist/{evidence-O76QF7TZ.js → evidence-AVJ2RTHX.js} +99 -93
  181. package/dist/{evidence-D6GUSYJW.js → evidence-P4NZOAK7.js} +88 -82
  182. package/dist/evidence-Y55WKYHH.js +246 -0
  183. package/dist/{evolve-H47BCETS.js → evolve-MAWKRYWF.js} +93 -87
  184. package/dist/{extensions-NNL3ZOCU.js → extensions-PYQH3H47.js} +14 -13
  185. package/dist/fleet-M4H2QBWT.js +268 -0
  186. package/dist/{fleet-KMNS6NOM.js → fleet-ULBXXRDR.js} +146 -138
  187. package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-7NNC4JZU.js} +18 -17
  188. package/dist/fleet-decisions-EHEY7KPU.js +52 -0
  189. package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-LQ2AHZT3.js} +24 -24
  190. package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-5IGBIIYZ.js} +98 -258
  191. package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-UTTNOKMG.js} +9 -4
  192. package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-YGILJKA6.js} +29 -29
  193. package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-AUWTCDKR.js} +88 -82
  194. package/dist/{fleet-view-BHJFW26B.js → fleet-view-TGUFCY5A.js} +90 -84
  195. package/dist/{init-XAT5N5YM.js → init-GFN2Z7NF.js} +111 -104
  196. package/dist/install-6PIF6F6W.js +19 -0
  197. package/dist/{interop-FVECHFKG.js → interop-EF5JUWWK.js} +29 -29
  198. package/dist/{inventory-7KFQGLCV.js → inventory-I6VJDDYF.js} +90 -84
  199. package/dist/library-3J5IO2OJ.js +75 -0
  200. package/dist/{library-QAPAO23R.js → library-IJTOFTDS.js} +20 -19
  201. package/dist/{library-NY2XOT75.js → library-Z3KZSHPE.js} +35 -35
  202. package/dist/{library-import-5Y6MAS3R.js → library-import-IMKFLDHX.js} +29 -29
  203. package/dist/{library-inventory-JT6HWITQ.js → library-inventory-CQP5D6GU.js} +21 -21
  204. package/dist/{library-validation-EQUH25DC.js → library-validation-33UTX7AI.js} +19 -19
  205. package/dist/mcp-5FWZKUS6.js +26 -0
  206. package/dist/{memory-DYVTTCP6.js → memory-36CWN67Y.js} +93 -87
  207. package/dist/{models-MASFJ6Y2.js → models-KQ6PQJJQ.js} +57 -56
  208. package/dist/{monitor-YMP4NXJJ.js → monitor-XX6ZD6KC.js} +98 -91
  209. package/dist/{orchestrator-AFQRRTEI.js → orchestrator-SK6HDAOP.js} +1537 -832
  210. package/dist/{panes-NICTHQCV.js → panes-L27QRXUH.js} +14 -14
  211. package/dist/{panes-D3Y2KFG5.js → panes-LXZIWNOZ.js} +4 -4
  212. package/dist/{paths-PSFAUIGO.js → paths-7DJDU4P4.js} +6 -6
  213. package/dist/{preload-5Q7VXRFJ.js → preload-K2TDYI4Y.js} +88 -82
  214. package/dist/{reset-7NKZK7JN.js → reset-73VU3XNT.js} +13 -13
  215. package/dist/{resources-NILSIZAT.js → resources-3BYJYVYL.js} +24 -24
  216. package/dist/{run-BPZGEBZV.js → run-AR7PY6GW.js} +144 -136
  217. package/dist/run-script-H2KUDIII.js +41 -0
  218. package/dist/settings-3VMBMWID.js +72 -0
  219. package/dist/{share-EZ6ERBMH.js → share-HVWH4FPF.js} +30 -30
  220. package/dist/{skills-BTVVNYVM.js → skills-5TYEY75Q.js} +30 -30
  221. package/dist/{skills-eval-UY34MNK7.js → skills-eval-CK3MD63Z.js} +114 -103
  222. package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-KSFYG3I6.js} +24 -24
  223. package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-DMVHML7P.js} +60 -57
  224. package/dist/{steer-2B3EQGFH.js → steer-XCD6V3EW.js} +4 -4
  225. package/dist/{support-L2SOL3IE.js → support-JAZL6VBR.js} +7 -7
  226. package/dist/system-3TDQRMZZ.js +116 -0
  227. package/dist/{targets-44VKGFLN.js → targets-EZKHAYRN.js} +74 -72
  228. package/dist/{tasks-3KODKFU7.js → tasks-SNEFHWYW.js} +18 -18
  229. package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-BNLFA4OF.js} +8 -7
  230. package/dist/{tools-3UB7TEVR.js → tools-7IM6BDCE.js} +12 -12
  231. package/dist/{trace-TAMIU4OJ.js → trace-C3MBGD4S.js} +16 -65
  232. package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
  233. package/dist/{uninstall-QYVRPEM4.js → uninstall-WWLOSZ42.js} +35 -10
  234. package/dist/{upgrade-7PMKM2JH.js → upgrade-ETK2JNSJ.js} +42 -51
  235. package/dist/{usage-6EQV7EQK.js → usage-S2HOB7BZ.js} +112 -102
  236. package/dist/{verifiers-JLITWSHU.js → verifiers-QDTEVH7R.js} +26 -24
  237. package/dist/{verify-T7NAEVIG.js → verify-SUKUK6XM.js} +16 -15
  238. package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
  239. package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +1 -0
  240. package/dist/web/client/assets/arc-Pry-7G1_.js +1 -0
  241. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
  242. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
  243. package/dist/web/client/assets/array-BifhSqXX.js +1 -0
  244. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  245. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  246. package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +129 -0
  247. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +38 -0
  248. package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
  249. package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  250. package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +62 -0
  251. package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  252. package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +2 -0
  253. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
  254. package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +1 -0
  255. package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
  256. package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +72 -0
  257. package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +1 -0
  258. package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +231 -0
  259. package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  260. package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +1 -0
  261. package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +10 -0
  262. package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +1 -0
  263. package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +1 -0
  264. package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +1 -0
  265. package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +168 -0
  266. package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +88 -0
  267. package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +206 -0
  268. package/dist/web/client/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  269. package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  270. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
  271. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
  272. package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  273. package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  274. package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
  275. package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +1 -0
  276. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +62 -0
  277. package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
  278. package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
  279. package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +4 -0
  280. package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
  281. package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +30 -0
  282. package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +41 -0
  283. package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +3 -0
  284. package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +24 -0
  285. package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +24 -0
  286. package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
  287. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +1 -0
  288. package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +99 -0
  289. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
  290. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
  291. package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
  292. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
  293. package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +1 -0
  294. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +106 -0
  295. package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
  296. package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
  297. package/dist/web/client/assets/index-Dsi52apB.css +1 -0
  298. package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +1 -0
  299. package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +2 -0
  300. package/dist/web/client/assets/init-C-OQMol4.js +1 -0
  301. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +70 -0
  302. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +139 -0
  303. package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +89 -0
  304. package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
  305. package/dist/web/client/assets/line-BIDAcEtX.js +1 -0
  306. package/dist/web/client/assets/linear-SzVmGSw4.js +1 -0
  307. package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +7 -0
  308. package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +44 -0
  309. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +96 -0
  310. package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  311. package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  312. package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  313. package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
  314. package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +1 -0
  315. package/dist/web/client/assets/path-fybaL0A-.js +1 -0
  316. package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +1 -0
  317. package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +1 -0
  318. package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +39 -0
  319. package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
  320. package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
  321. package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
  322. package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
  323. package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
  324. package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
  325. package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
  326. package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
  327. package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
  328. package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
  329. package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
  330. package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
  331. package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
  332. package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
  333. package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
  334. package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
  335. package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
  336. package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
  337. package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
  338. package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
  339. package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
  340. package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
  341. package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
  342. package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
  343. package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
  344. package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
  345. package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
  346. package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
  347. package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
  348. package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
  349. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +7 -0
  350. package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +1 -0
  351. package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +1 -0
  352. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
  353. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
  354. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
  355. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +1 -0
  356. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +84 -0
  357. package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
  358. package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
  359. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +40 -0
  360. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +162 -0
  361. package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  362. package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
  363. package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +1 -0
  364. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
  365. package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +1 -0
  366. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
  367. package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +120 -0
  368. package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +1 -0
  369. package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +1 -0
  370. package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +34 -0
  371. package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +1 -0
  372. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +78 -0
  373. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +7 -0
  374. package/dist/web/client/clio-coder-logo.webp +0 -0
  375. package/dist/web/client/icon-192.png +0 -0
  376. package/dist/web/client/icon-512.png +0 -0
  377. package/dist/web/client/index.html +6 -0
  378. package/dist/web/client/manifest.webmanifest +15 -0
  379. package/dist/web/client/offline.css +55 -0
  380. package/dist/web/client/offline.html +5 -0
  381. package/dist/web/client/offline.js +27 -0
  382. package/dist/web/client/sw.js +34 -0
  383. package/dist/web/ops-worker.js +37 -0
  384. package/dist/web/reads-worker.js +1726 -0
  385. package/dist/web/server.js +8499 -0
  386. package/dist/web-EMGUGGEI.js +13 -0
  387. package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-6BRRVQON.js} +22 -5
  388. package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-XHSJTDOP.js} +120 -113
  389. package/dist/{with-panes-CHFC7HGI.js → with-panes-Z6BTEHMZ.js} +12 -12
  390. package/dist/worker/entry.js +113 -99
  391. package/docs/README.md +28 -27
  392. package/docs/architecture/acp.md +5 -9
  393. package/docs/architecture/alcf-provider.md +0 -3
  394. package/docs/architecture/architecture.md +0 -3
  395. package/docs/architecture/artifact-placement.md +12 -4
  396. package/docs/architecture/artifact-versions.md +0 -3
  397. package/docs/architecture/capacity-and-scheduling.md +0 -3
  398. package/docs/architecture/context-engine.md +0 -3
  399. package/docs/architecture/context-working-set.md +0 -3
  400. package/docs/architecture/dispatch-architecture-rationale.md +0 -3
  401. package/docs/architecture/dispatch-typed-intent.md +0 -3
  402. package/docs/architecture/evidence-and-memory.md +0 -3
  403. package/docs/architecture/library.md +1 -3
  404. package/docs/architecture/middleware-and-components.md +0 -3
  405. package/docs/architecture/model-catalog.md +1 -4
  406. package/docs/architecture/observability.md +0 -3
  407. package/docs/architecture/pi-boundary.md +6 -9
  408. package/docs/architecture/prompt-envelope-and-tools.md +37 -30
  409. package/docs/architecture/provider-adapter-cookbook.md +1 -4
  410. package/docs/architecture/safety-model.md +19 -9
  411. package/docs/architecture/session-lifecycle.md +10 -7
  412. package/docs/architecture/time-conventions.md +0 -3
  413. package/docs/architecture/trace-store.md +28 -20
  414. package/docs/architecture/tui-design.md +38 -18
  415. package/docs/architecture/worker-context.md +1 -3
  416. package/docs/architecture/worker-dispatch-mechanics.md +1 -4
  417. package/docs/guide/authoring-plugins.md +1 -3
  418. package/docs/guide/built-in-agents.md +0 -3
  419. package/docs/guide/commands-and-modes.md +41 -25
  420. package/docs/guide/configuration-and-targets.md +204 -9
  421. package/docs/guide/configuration-reference.md +125 -17
  422. package/docs/guide/environment-variables.md +2 -8
  423. package/docs/guide/exit-codes-and-output.md +0 -3
  424. package/docs/guide/extensions-and-sharing.md +0 -3
  425. package/docs/guide/fleet-dispatch.md +3 -5
  426. package/docs/guide/glossary.md +1 -4
  427. package/docs/guide/harness-extensions.md +0 -2
  428. package/docs/guide/installation-and-lifecycle.md +3 -6
  429. package/docs/guide/interop.md +0 -2
  430. package/docs/guide/panes-and-files.md +0 -3
  431. package/docs/guide/plugins.md +0 -3
  432. package/docs/guide/proactive-memory.md +0 -3
  433. package/docs/guide/resource-library.md +1 -3
  434. package/docs/guide/skills-marketplace.md +0 -2
  435. package/docs/guide/tool-usage.md +166 -67
  436. package/docs/guide/troubleshooting.md +1 -4
  437. package/docs/history/config-knobs-audit.md +0 -3
  438. package/docs/history/release-cut-checklist.md +0 -3
  439. package/docs/process/development-pipeline.md +0 -3
  440. package/docs/process/documentation-coverage.md +3 -3
  441. package/docs/process/documentation-guide.md +16 -22
  442. package/docs/process/eval-runner.md +0 -3
  443. package/docs/process/evals-internal.md +0 -3
  444. package/docs/process/evolution.md +0 -3
  445. package/docs/process/fleet-demo-runbook.md +6 -9
  446. package/docs/process/git-commit-provenance.md +0 -3
  447. package/docs/process/performance-methodology.md +1 -4
  448. package/docs/process/release-cut-checklist.md +114 -221
  449. package/docs/process/scientific-validation.md +23 -6
  450. package/docs/process/tool-audit-v0.4.9.md +357 -0
  451. package/library/registry.yaml +2 -2
  452. package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
  453. package/library/skills/meta/clio-coder-test/evals.md +16 -2
  454. package/library/skills/meta/clio-coder-test/plugin.json +1 -1
  455. package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
  456. package/library/skills/registry.yaml +2 -2
  457. package/library/skills/skill-marketplace.json +1 -1
  458. package/package.json +13 -11
  459. package/src/cli/argv.ts +31 -0
  460. package/src/cli/clio.ts +17 -13
  461. package/src/cli/config.ts +4 -0
  462. package/src/cli/docs.ts +65 -328
  463. package/src/cli/doctor-panes.ts +1 -1
  464. package/src/cli/doctor.ts +3 -1
  465. package/src/cli/index.ts +17 -2
  466. package/src/cli/mcp.ts +106 -0
  467. package/src/cli/skills-eval.ts +8 -2
  468. package/src/cli/trace.ts +4 -65
  469. package/src/cli/uninstall.ts +26 -0
  470. package/src/cli/upgrade.ts +34 -38
  471. package/src/cli/usage.ts +3 -0
  472. package/src/cli/verifiers.ts +1 -1
  473. package/src/cli/web.ts +79 -0
  474. package/src/core/bash-exec.ts +27 -4
  475. package/src/core/bus-events.ts +3 -4
  476. package/src/core/config.ts +73 -1
  477. package/src/core/defaults.ts +10 -1
  478. package/src/core/domain-loader.ts +37 -28
  479. package/src/core/event-bus.ts +1 -1
  480. package/src/core/run-records.ts +438 -0
  481. package/src/core/safe-exec.ts +506 -56
  482. package/src/core/skill-activation.ts +5 -3
  483. package/src/core/termination.ts +16 -12
  484. package/src/core/tool-names.ts +33 -12
  485. package/src/domains/agents/contract.ts +1 -1
  486. package/src/domains/agents/extension.ts +18 -10
  487. package/src/domains/config/extension.ts +5 -4
  488. package/src/domains/context/clio-md.ts +1 -1
  489. package/src/domains/context/worker/pressure.ts +6 -2
  490. package/src/domains/context/working-set/path-index.ts +7 -2
  491. package/src/domains/dispatch/code-step.ts +7 -2
  492. package/src/domains/dispatch/contract.ts +7 -0
  493. package/src/domains/dispatch/execution-role.ts +3 -3
  494. package/src/domains/dispatch/execution-scheduler.ts +204 -79
  495. package/src/domains/dispatch/extension.ts +206 -26
  496. package/src/domains/dispatch/fleet-preflight.ts +18 -3
  497. package/src/domains/dispatch/fleet-run.ts +1 -0
  498. package/src/domains/dispatch/gate-decisions.ts +3 -3
  499. package/src/domains/dispatch/heartbeat.ts +1 -1
  500. package/src/domains/dispatch/host-verification.ts +16 -14
  501. package/src/domains/dispatch/index.ts +1 -0
  502. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  503. package/src/domains/dispatch/receipt-findings.ts +3 -4
  504. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  505. package/src/domains/dispatch/reservation-store.ts +7 -9
  506. package/src/domains/dispatch/route-facts.ts +1 -1
  507. package/src/domains/dispatch/state.ts +4 -5
  508. package/src/domains/dispatch/types.ts +3 -1
  509. package/src/domains/eval/metrics/tracked.ts +22 -2
  510. package/src/domains/evidence/build.ts +35 -7
  511. package/src/domains/extensions/operator-runtime.ts +3 -1
  512. package/src/domains/gateway/mcp/client.ts +923 -0
  513. package/src/domains/gateway/mcp/config.ts +456 -0
  514. package/src/domains/gateway/mcp/index.ts +88 -0
  515. package/src/domains/gateway/mcp/protocol.ts +273 -0
  516. package/src/domains/gateway/mcp/trust.ts +263 -0
  517. package/src/domains/lifecycle/doctor.ts +17 -3
  518. package/src/domains/middleware/hooks.ts +2 -2
  519. package/src/domains/mux/contract.ts +5 -9
  520. package/src/domains/mux/detect.ts +1 -1
  521. package/src/domains/mux/extension.ts +1 -1
  522. package/src/domains/mux/protocol.ts +5 -7
  523. package/src/domains/mux/socket-client.ts +3 -3
  524. package/src/domains/observability/accountability.ts +2 -2
  525. package/src/domains/observability/background-memory-usage.ts +3 -0
  526. package/src/domains/observability/compaction-usage.ts +2 -0
  527. package/src/domains/observability/contract.ts +7 -3
  528. package/src/domains/observability/cost.ts +5 -0
  529. package/src/domains/observability/evidence-index.ts +2 -2
  530. package/src/domains/observability/extension.ts +1 -0
  531. package/src/domains/observability/out-of-turn-usage.ts +2 -0
  532. package/src/domains/observability/projection.ts +10 -0
  533. package/src/domains/observability/trace-store.ts +65 -5
  534. package/src/domains/prompts/compiler.ts +41 -23
  535. package/src/domains/prompts/extension.ts +4 -17
  536. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
  537. package/src/domains/prompts/fragments/operating/skills.md +12 -10
  538. package/src/domains/providers/cache-deployment.ts +147 -0
  539. package/src/domains/providers/catalog.ts +12 -7
  540. package/src/domains/providers/extension.ts +27 -5
  541. package/src/domains/providers/index.ts +6 -1
  542. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
  543. package/src/domains/providers/plugins.ts +3 -13
  544. package/src/domains/providers/probe/http.ts +44 -59
  545. package/src/domains/providers/probe/reasoning.ts +2 -0
  546. package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
  547. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
  548. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
  549. package/src/domains/providers/types/target-descriptor.ts +17 -0
  550. package/src/domains/safety/action-classifier.ts +17 -1
  551. package/src/domains/safety/call-target.ts +14 -0
  552. package/src/domains/safety/contract.ts +1 -1
  553. package/src/domains/safety/finish-contract.ts +9 -3
  554. package/src/domains/safety/loop-detector.ts +1 -1
  555. package/src/domains/safety/policy-engine.ts +7 -0
  556. package/src/domains/safety/protected-artifacts.ts +3 -4
  557. package/src/domains/safety/rejection-feedback.ts +1 -1
  558. package/src/domains/safety/scope.ts +2 -3
  559. package/src/domains/safety/validation-contract.ts +3 -2
  560. package/src/domains/scheduling/budget.ts +5 -3
  561. package/src/domains/scheduling/contract.ts +2 -1
  562. package/src/domains/scheduling/extension.ts +3 -3
  563. package/src/domains/session/compaction/branch-summary.ts +1 -1
  564. package/src/domains/session/compaction/compact.ts +29 -3
  565. package/src/domains/session/compaction/cut-point.ts +1 -1
  566. package/src/domains/session/compaction/tokens.ts +5 -10
  567. package/src/domains/session/contract.ts +1 -1
  568. package/src/domains/session/cwd-fallback.ts +2 -2
  569. package/src/domains/session/entries.ts +1 -0
  570. package/src/domains/session/handoff.ts +5 -1
  571. package/src/domains/session/history.ts +6 -0
  572. package/src/domains/session/manager.ts +14 -7
  573. package/src/domains/session/retry.ts +2 -1
  574. package/src/domains/session/session-artifacts.ts +12 -7
  575. package/src/domains/session/task-board.ts +2 -3
  576. package/src/domains/session/usage.ts +6 -7
  577. package/src/engine/acp/server.ts +11 -0
  578. package/src/engine/ai.ts +2 -0
  579. package/src/engine/apis/openai-completions.ts +17 -4
  580. package/src/engine/loop-guard.ts +7 -0
  581. package/src/engine/prewarm.ts +232 -0
  582. package/src/engine/provider-diagnostics.ts +6 -1
  583. package/src/engine/provider-error-body.ts +65 -0
  584. package/src/engine/session.ts +118 -29
  585. package/src/engine/worker-runtime.ts +3 -0
  586. package/src/entry/boot-options.ts +2 -0
  587. package/src/entry/orchestrator.ts +38 -18
  588. package/src/interactive/chat-loop-messages.ts +3 -0
  589. package/src/interactive/chat-loop-policy.ts +1 -0
  590. package/src/interactive/chat-loop.ts +10 -12
  591. package/src/interactive/chat-panel.ts +23 -9
  592. package/src/interactive/chat-renderer.ts +33 -11
  593. package/src/interactive/clio-editor.ts +13 -5
  594. package/src/interactive/dispatch-board.ts +70 -30
  595. package/src/interactive/editor-submit.ts +30 -25
  596. package/src/interactive/footer/widgets.ts +12 -9
  597. package/src/interactive/interactive-presentation.ts +2 -3
  598. package/src/interactive/mux-bridge.ts +3 -7
  599. package/src/interactive/overlay-general-openers.ts +14 -7
  600. package/src/interactive/overlays/cwd-fallback.ts +1 -1
  601. package/src/interactive/overlays/library-model.ts +114 -35
  602. package/src/interactive/overlays/library.ts +52 -5
  603. package/src/interactive/overlays/list-overlay.ts +4 -1
  604. package/src/interactive/overlays/session-selector.ts +28 -23
  605. package/src/interactive/overlays/settings.ts +20 -1
  606. package/src/interactive/overlays/tree-selector.ts +47 -10
  607. package/src/interactive/panes-runtime.ts +1 -1
  608. package/src/interactive/prewarm.ts +11 -197
  609. package/src/interactive/renderers/compaction-summary.ts +1 -1
  610. package/src/interactive/renderers/provider-error.ts +118 -0
  611. package/src/interactive/renderers/retry-status.ts +59 -23
  612. package/src/interactive/renderers/tool-execution.ts +67 -7
  613. package/src/interactive/renderers/worker-answer.ts +198 -0
  614. package/src/interactive/renderers/worker-entry.ts +57 -163
  615. package/src/interactive/session-usage-reseed.ts +2 -0
  616. package/src/interactive/side-question.ts +2 -0
  617. package/src/interactive/slash-commands.ts +26 -1
  618. package/src/interactive/slash-spec.ts +2 -2
  619. package/src/interactive/theme/labels.ts +66 -30
  620. package/src/interactive/turn-context.ts +1 -0
  621. package/src/interactive/turn-persistence.ts +9 -1
  622. package/src/interactive/turn-prewarm.ts +126 -19
  623. package/src/interactive/turn-recovery.ts +2 -1
  624. package/src/interactive/turn-runtime.ts +36 -5
  625. package/src/interactive/view/artifacts.ts +3 -2
  626. package/src/interactive/view/view-overlay.ts +96 -20
  627. package/src/tools/agent-tools.ts +21 -7
  628. package/src/tools/artifact.ts +16 -8
  629. package/src/tools/bash.ts +90 -11
  630. package/src/tools/bootstrap.ts +42 -4
  631. package/src/tools/builtin-tool-catalog.ts +80 -11
  632. package/src/tools/context/index.ts +27 -31
  633. package/src/tools/context/library.ts +3 -1
  634. package/src/tools/context/surface.ts +12 -26
  635. package/src/tools/core-bootstrap.ts +72 -1
  636. package/src/tools/data/csv.ts +1189 -0
  637. package/src/tools/data/index.ts +308 -0
  638. package/src/tools/data/json.ts +1799 -0
  639. package/src/tools/data/jsonl.ts +561 -0
  640. package/src/tools/data/shared.ts +452 -0
  641. package/src/tools/edit-diff.ts +0 -7
  642. package/src/tools/edit.ts +115 -18
  643. package/src/tools/file-mutation-queue.ts +114 -4
  644. package/src/tools/find.ts +108 -29
  645. package/src/tools/gateway/caps.ts +11 -0
  646. package/src/tools/gateway/clio-context-surface.ts +41 -0
  647. package/src/tools/gateway/clio-context-tools.ts +77 -0
  648. package/src/tools/gateway/data-surface.ts +138 -0
  649. package/src/tools/gateway/data-tool.ts +201 -0
  650. package/src/tools/gateway/index.ts +342 -0
  651. package/src/tools/gateway/mcp-capabilities.ts +469 -0
  652. package/src/tools/grep.ts +88 -33
  653. package/src/tools/harness-extensions.ts +3 -0
  654. package/src/tools/ignore-policy.ts +7 -5
  655. package/src/tools/ls.ts +111 -20
  656. package/src/tools/policy.ts +35 -13
  657. package/src/tools/presentation.ts +6 -0
  658. package/src/tools/read.ts +634 -156
  659. package/src/tools/registry.ts +106 -8
  660. package/src/tools/run-script.ts +997 -0
  661. package/src/tools/spawn-hygiene.ts +157 -5
  662. package/src/tools/surface.ts +163 -0
  663. package/src/tools/verify/authoring.ts +8 -3
  664. package/src/tools/verify/catalog.ts +14 -1
  665. package/src/tools/verify/numeric.ts +367 -59
  666. package/src/tools/verify/perf.ts +171 -9
  667. package/src/tools/verify/scripts.ts +178 -26
  668. package/src/tools/web-fetch-surface.ts +22 -0
  669. package/src/tools/web-fetch.ts +26 -1
  670. package/src/tools/write.ts +45 -19
  671. package/src/worker/spec-contract.ts +27 -0
  672. package/dist/chunk-B6UM3OZC.js +0 -15
  673. package/dist/chunk-GJ24ODAX.js +0 -196
  674. package/dist/chunk-HRAKUPIH.js +0 -57
  675. package/dist/docs-BL7ROUFN.js +0 -292
@@ -1,6 +1,6 @@
1
+ import { sanitizeCallTargetText } from "../../domains/safety/call-target.js";
1
2
  import {
2
3
  type Component,
3
- fuzzyFilter,
4
4
  Input,
5
5
  Markdown,
6
6
  matchesKey,
@@ -168,10 +168,6 @@ function isNonEmptySearchValue(value: string | undefined): value is string {
168
168
  return typeof value === "string" && value.trim().length > 0;
169
169
  }
170
170
 
171
- function broadFilterText(artifact: ViewArtifact): string {
172
- return `${artifact.id} ${artifact.category} ${artifact.title}`;
173
- }
174
-
175
171
  function artifactSearchValues(artifact: ViewArtifact): string[] {
176
172
  return [
177
173
  artifact.id,
@@ -188,8 +184,12 @@ function artifactSearchValues(artifact: ViewArtifact): string[] {
188
184
  ].filter(isNonEmptySearchValue);
189
185
  }
190
186
 
191
- function categoryFilterText(artifact: ViewArtifact): string {
192
- return artifactSearchValues(artifact).join(" ");
187
+ function matchesFilterText(artifact: ViewArtifact, query: string): boolean {
188
+ const values = artifactSearchValues(artifact).map((value) => value.toLocaleLowerCase());
189
+ return query
190
+ .toLocaleLowerCase()
191
+ .split(/\s+/u)
192
+ .every((token) => values.some((value) => value.includes(token)));
193
193
  }
194
194
 
195
195
  function matchesExactArtifactValue(artifact: ViewArtifact, value: string): boolean {
@@ -225,10 +225,10 @@ function filterViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>, query: stri
225
225
  if (parsed.kind === "category") {
226
226
  const categoryArtifacts = artifacts.filter((artifact) => artifact.category === parsed.category);
227
227
  if (parsed.value.length === 0) return categoryArtifacts;
228
- return fuzzyFilter(categoryArtifacts, parsed.value, categoryFilterText);
228
+ return categoryArtifacts.filter((artifact) => matchesFilterText(artifact, parsed.value));
229
229
  }
230
230
  if (parsed.text.length === 0) return [...artifacts];
231
- return fuzzyFilter([...artifacts], parsed.text, broadFilterText);
231
+ return artifacts.filter((artifact) => matchesFilterText(artifact, parsed.text));
232
232
  }
233
233
 
234
234
  function artifactsInCategoryOrder(artifacts: ReadonlyArray<ViewArtifact>): ViewArtifact[] {
@@ -418,6 +418,7 @@ function viewFooterHint(focus: ViewPaneFocus, canVerify: boolean, innerWidth?: n
418
418
  { key: "PgUp/PgDn", verb: "page" },
419
419
  { key: "g/G", verb: "top/bottom" },
420
420
  ...(canVerify ? [{ key: "v", verb: "verify" }] : []),
421
+ { key: "i", verb: "info" },
421
422
  { key: "o", verb: "path" },
422
423
  ],
423
424
  "back",
@@ -446,31 +447,44 @@ export class ViewOverlayView implements Component {
446
447
  private artifactError: string | null = null;
447
448
  private content: LoadedContent | null = null;
448
449
  private loadToken = 0;
450
+ private refreshToken = 0;
451
+ private showProvenance = false;
449
452
  private lastContentWidth = 80;
450
453
  private lastContentBodyHeight = 1;
451
454
  private readonly verifications = new Map<string, ViewVerificationState>();
452
455
 
453
456
  constructor(private readonly options: ViewOverlayOptions) {
454
457
  this.filterText = options.initialFilter ?? "";
455
- this.filterInput.setValue(this.filterText);
458
+ this.filterInput.handleInput(`\x1b[200~${this.filterText}\x1b[201~`);
456
459
  }
457
460
 
458
461
  refresh(): void {
462
+ const refreshToken = ++this.refreshToken;
463
+ const selected = this.selectedArtifact();
464
+ this.loadToken += 1;
459
465
  this.loadingArtifacts = true;
460
466
  this.artifactError = null;
461
467
  this.options.requestRender?.();
462
468
  void (async () => {
463
469
  try {
464
- this.artifacts = await listViewArtifacts(this.options.providers);
465
- this.selectedIndex = initialViewSelection(this.artifacts, this.filterText);
470
+ const artifacts = await listViewArtifacts(this.options.providers);
471
+ if (refreshToken !== this.refreshToken) return;
472
+ this.artifacts = artifacts;
473
+ const retainedIndex = selected
474
+ ? this.filteredArtifacts().findIndex((artifact) => artifactKey(artifact) === artifactKey(selected))
475
+ : -1;
476
+ this.selectedIndex = retainedIndex >= 0 ? retainedIndex : initialViewSelection(this.artifacts, this.filterText);
466
477
  this.contentScrollOffset = 0;
467
478
  this.content = null;
468
479
  } catch (err) {
480
+ if (refreshToken !== this.refreshToken) return;
469
481
  this.artifactError = err instanceof Error ? err.message : String(err);
470
482
  this.artifacts = [];
471
483
  } finally {
472
- this.loadingArtifacts = false;
473
- this.options.requestRender?.();
484
+ if (refreshToken === this.refreshToken) {
485
+ this.loadingArtifacts = false;
486
+ this.options.requestRender?.();
487
+ }
474
488
  }
475
489
  })();
476
490
  }
@@ -490,6 +504,8 @@ export class ViewOverlayView implements Component {
490
504
  }
491
505
 
492
506
  private selectIndex(next: number): void {
507
+ this.loadToken += 1;
508
+ this.showProvenance = false;
493
509
  const filtered = this.filteredArtifacts();
494
510
  if (filtered.length === 0) {
495
511
  this.selectedIndex = 0;
@@ -513,14 +529,17 @@ export class ViewOverlayView implements Component {
513
529
  }
514
530
 
515
531
  private ensureContentLoaded(artifact: ViewArtifact | undefined): void {
516
- if (!artifact) return;
532
+ if (!artifact) {
533
+ this.content = null;
534
+ return;
535
+ }
517
536
  const key = artifactKey(artifact);
518
537
  if (this.content?.key === key) return;
519
538
  const token = ++this.loadToken;
520
539
  this.content = { key, status: "loading", lines: [clioTheme().fg("dim", "loading artifact…")], format: "text" };
521
540
  void (async () => {
522
541
  try {
523
- const loaded = await artifact.load();
542
+ const loaded = await Promise.resolve().then(() => artifact.load());
524
543
  if (token !== this.loadToken) return;
525
544
  this.content = { key, status: "loaded", lines: loaded.lines, format: loaded.format };
526
545
  } catch (err) {
@@ -540,6 +559,20 @@ export class ViewOverlayView implements Component {
540
559
  }
541
560
 
542
561
  private renderedContentLines(width: number): string[] {
562
+ if (this.showProvenance) {
563
+ const artifact = this.selectedArtifact();
564
+ if (!artifact) return [];
565
+ return [
566
+ `Title: ${artifact.title}`,
567
+ `Category: ${artifact.category}`,
568
+ `ID: ${artifact.id}`,
569
+ `Path: ${artifact.path ?? "No backing path"}`,
570
+ ...(artifact.sessionId ? [`Session: ${artifact.sessionId}`] : []),
571
+ ...(artifact.runId ? [`Run: ${artifact.runId}`] : []),
572
+ ...(artifact.correlationId ? [`Correlation: ${artifact.correlationId}`] : []),
573
+ ...(artifact.description ? [`Details: ${artifact.description}`] : []),
574
+ ].flatMap((line) => wrapTextWithAnsi(sanitizeCallTargetText(line), Math.max(1, width)));
575
+ }
543
576
  const content = this.content;
544
577
  if (!content) return [];
545
578
  if (content.status === "error") return content.lines.flatMap((line) => wrapTextWithAnsi(line, Math.max(1, width)));
@@ -572,10 +605,30 @@ export class ViewOverlayView implements Component {
572
605
  }
573
606
 
574
607
  const filtered = this.filteredArtifacts();
575
- if (filtered.length === 0) return this.fixedLines([...lines, theme.fg("dim", "No matching details.")], width, height);
608
+ lines.push(
609
+ padAnsi(
610
+ theme.fg(
611
+ this.focus === "list" ? "accent" : "dim",
612
+ `List · ${filtered.length}/${this.artifacts.length} · ←→ category`,
613
+ ),
614
+ width,
615
+ ELLIPSIS,
616
+ ),
617
+ );
618
+ if (filtered.length === 0)
619
+ return this.fixedLines(
620
+ [
621
+ ...lines,
622
+ theme.fg("dim", "No matching details."),
623
+ theme.fg("muted", "Ctrl+U clears the filter."),
624
+ theme.fg("dim", "Try workspace: or receipt:"),
625
+ ],
626
+ width,
627
+ height,
628
+ );
576
629
  const rows = groupedViewRows(filtered);
577
630
  const selectedRow = rows.findIndex((row) => row.type === "item" && row.itemIndex === this.selectedIndex);
578
- const rowHeight = Math.max(1, height - 1);
631
+ const rowHeight = Math.max(1, height - lines.length);
579
632
  if (selectedRow >= 0) {
580
633
  if (selectedRow < this.listScrollOffset) this.listScrollOffset = selectedRow;
581
634
  if (selectedRow >= this.listScrollOffset + rowHeight) this.listScrollOffset = selectedRow - rowHeight + 1;
@@ -614,7 +667,21 @@ export class ViewOverlayView implements Component {
614
667
  this.ensureContentLoaded(artifact);
615
668
  this.lastContentWidth = width;
616
669
  const verification = artifact ? this.verifications.get(artifactKey(artifact)) : undefined;
617
- const header = buildArtifactHeaderLines(artifact, verification, width);
670
+ const header = [
671
+ padAnsi(
672
+ clioTheme().fg(
673
+ this.focus === "content" ? "accent" : "dim",
674
+ this.showProvenance
675
+ ? "Provenance · i preview · Esc list"
676
+ : this.focus === "content"
677
+ ? "Preview · i info · Esc list"
678
+ : "Preview · Enter/Tab focus",
679
+ ),
680
+ width,
681
+ ELLIPSIS,
682
+ ),
683
+ ...buildArtifactHeaderLines(artifact, verification, width),
684
+ ];
618
685
  const bodyHeight = Math.max(0, height - header.length);
619
686
  this.lastContentBodyHeight = Math.max(1, bodyHeight);
620
687
  const body = this.renderedContentLines(width);
@@ -657,6 +724,7 @@ export class ViewOverlayView implements Component {
657
724
  matchesKey(data, "shift+tab") ||
658
725
  (this.focus === "list" && matchesKey(data, "enter"))
659
726
  ) {
727
+ if (this.focus === "list" && !this.selectedArtifact()) return;
660
728
  this.focus = this.focus === "list" ? "content" : "list";
661
729
  this.options.requestRender?.();
662
730
  return;
@@ -669,6 +737,12 @@ export class ViewOverlayView implements Component {
669
737
  this.selectCategory(1);
670
738
  return;
671
739
  }
740
+ if (this.focus === "content" && data === "i") {
741
+ this.showProvenance = !this.showProvenance;
742
+ this.contentScrollOffset = 0;
743
+ this.options.requestRender?.();
744
+ return;
745
+ }
672
746
  if (this.focus === "content" && data === "v") {
673
747
  this.verifySelected();
674
748
  return;
@@ -704,7 +778,9 @@ export class ViewOverlayView implements Component {
704
778
  return true;
705
779
  }
706
780
  const previous = this.filterText;
707
- this.filterInput.handleInput(data);
781
+ if (matchesKey(data, "ctrl+u")) {
782
+ this.filterInput.applyEdit("clear");
783
+ } else this.filterInput.handleInput(data);
708
784
  this.filterText = this.filterInput.getValue();
709
785
  if (previous !== this.filterText) {
710
786
  this.selectInitialFilterMatch();
@@ -30,6 +30,7 @@ import type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from "../eng
30
30
  import { applyToolProfile, type ToolProfileName } from "./profiles.js";
31
31
  import type { ToolInvokeOptions, ToolRegistry, ToolResult, ToolSpec } from "./registry.js";
32
32
  import { isDispositionedToolResultError, toolResultContextText } from "./result-disposition.js";
33
+ import { toolSpecPlacement, withGatewayForCapabilities } from "./surface.js";
33
34
 
34
35
  /**
35
36
  * Lightweight per-call observability hook. Default no-op so unused
@@ -308,9 +309,10 @@ function errorMessage(err: unknown): string {
308
309
  * (`Value.Check` answers identically with and without), so the copy handed
309
310
  * to the agent loop drops every `~`-prefixed key. Symbol keys are copied
310
311
  * through untouched because pi-ai picks its coercion path by the TypeBox
311
- * kind symbol on the root schema.
312
+ * kind symbol on the root schema. Exported for the gateway's describe, which
313
+ * hands a capability's schema to the model through a result the same way.
312
314
  */
313
- function wireParameterSchema<T>(schema: T): T {
315
+ export function wireParameterSchema<T>(schema: T): T {
314
316
  if (Array.isArray(schema)) return schema.map((entry) => wireParameterSchema(entry)) as T;
315
317
  if (typeof schema !== "object" || schema === null) return schema;
316
318
  const source = schema as Record<PropertyKey, unknown>;
@@ -374,30 +376,41 @@ function toAgentTool(
374
376
  * 1. tools registered on the supplied registry
375
377
  * 2. tools whose id appears in `allowedTools`
376
378
  *
377
- * When `allowedTools` is undefined, step 3 is skipped.
379
+ * projected onto the direct surface: a gateway-placed capability on the
380
+ * effective list is reachable through the attached `gateway` tool, never as
381
+ * a schema of its own. When `allowedTools` is undefined, step 2 is skipped.
378
382
  */
379
383
  export function resolveAgentTools(input: ResolveAgentToolsInput): AgentTool[] {
380
384
  const specs: ToolSpec[] = [];
381
385
  for (const name of effectiveToolNames(input)) {
382
386
  const spec = input.registry.get(name);
383
- if (spec) specs.push(spec);
387
+ if (spec && toolSpecPlacement(spec) === "direct") specs.push(spec);
384
388
  }
385
389
  specs.sort((a, b) => a.name.localeCompare(b.name));
386
390
  return specs.map((spec) => toAgentTool(spec, input.registry, input.telemetry, input.invokeOptions));
387
391
  }
388
392
 
389
393
  /**
390
- * The effective tool surface for one worker run, as names. This is the single
394
+ * The effective capability surface for one run, as names. This is the single
391
395
  * narrowing used both to build the executable tool set and to compute the
392
396
  * signature the worker attests, so an attested identity can never describe a
393
397
  * different surface than the one the agent actually gets.
398
+ *
399
+ * The list names capabilities, whatever their placement: a recipe that admits
400
+ * `git` keeps `git` here, and because `git` sits behind the gateway the list
401
+ * gains `gateway` as well (the same rule dispatch admission applies to the
402
+ * list it approves, so the two signatures agree). `resolveAgentTools` then
403
+ * attaches only the direct-placed names, and the gateway enforces this list
404
+ * on every call it makes on the run's behalf.
394
405
  */
395
406
  export function effectiveToolNames(input: Omit<ResolveAgentToolsInput, "telemetry" | "invokeOptions">): ToolName[] {
396
407
  const profileContext = {
397
408
  ...(input.agentId !== undefined ? { agentId: input.agentId } : {}),
398
409
  ...(input.task !== undefined ? { task: input.task } : {}),
399
410
  };
400
- const toolIds = applyToolProfile(input.registry.listRegistered(), input.toolProfile, profileContext);
411
+ const gatewayNames = input.registry.listGateway().map((spec) => spec.name);
412
+ const registered = [...input.registry.listRegistered(), ...gatewayNames];
413
+ const toolIds = applyToolProfile(registered, input.toolProfile, profileContext);
401
414
  const allowed = input.allowedTools ? new Set<string>(input.allowedTools) : null;
402
415
  const includeInteractiveTools = input.includeInteractiveTools !== false;
403
416
  const names: ToolName[] = [];
@@ -408,7 +421,8 @@ export function effectiveToolNames(input: Omit<ResolveAgentToolsInput, "telemetr
408
421
  if (allowed && !allowed.has(name)) continue;
409
422
  names.push(name);
410
423
  }
411
- return names;
424
+ if (input.registry.get(ToolNames.Gateway) === undefined) return names;
425
+ return withGatewayForCapabilities(names);
412
426
  }
413
427
 
414
428
  /**
@@ -1,10 +1,9 @@
1
- import { mkdirSync, writeFileSync } from "node:fs";
2
1
  import path from "node:path";
3
2
  import { Type } from "typebox";
4
3
  import { artifactDefaultPath, CLIO_ARTIFACT_DIR } from "../core/artifact-paths.js";
5
4
  import { ToolNames } from "../core/tool-names.js";
6
5
  import { StringEnum } from "../engine/ai.js";
7
- import { withFileMutationQueue } from "./file-mutation-queue.js";
6
+ import { type AtomicPublishResult, publishFileAtomically, withFileMutationQueue } from "./file-mutation-queue.js";
8
7
  import { resolveToCwd } from "./path-utils.js";
9
8
  import type { ToolResult, ToolSpec } from "./registry.js";
10
9
 
@@ -14,6 +13,12 @@ import type { ToolResult, ToolSpec } from "./registry.js";
14
13
  * answer, so pi-agent-core skips the follow-up LLM call that would only
15
14
  * summarize it.
16
15
  *
16
+ * Placement: gateway. The terminal contract survives the indirection because
17
+ * the gateway propagates `terminate`, `details.kind`, and `details.paths`
18
+ * from this result unchanged, so the turn still ends and `/view` still lists
19
+ * the document. The write is an atomic publish (temp file, fsync, rename) so
20
+ * a failed write never leaves a half-written artifact behind.
21
+ *
17
22
  * A pathless call lands under `.clio-coder/artifacts/`, not in the repo working
18
23
  * tree. A turn nobody asked for a file from used to drop REPORT.md into the
19
24
  * project root, which the operator then had to notice and delete; the working
@@ -58,11 +63,9 @@ async function writeTerminalArtifact(
58
63
  }
59
64
  const title = typeof args.title === "string" ? args.title.trim() : "";
60
65
  const body = title.length > 0 && !content.trimStart().startsWith("#") ? `# ${title}\n\n${content}` : content;
66
+ let published: AtomicPublishResult;
61
67
  try {
62
- await withFileMutationQueue(target, async () => {
63
- mkdirSync(path.dirname(target), { recursive: true });
64
- writeFileSync(target, body, "utf8");
65
- });
68
+ published = await withFileMutationQueue(target, () => publishFileAtomically(target, body));
66
69
  } catch (err) {
67
70
  return { kind: "error", message: `artifact: ${err instanceof Error ? err.message : String(err)}` };
68
71
  }
@@ -70,10 +73,15 @@ async function writeTerminalArtifact(
70
73
  const bytes = Buffer.byteLength(body, "utf8");
71
74
  return {
72
75
  kind: "ok",
73
- output: `wrote ${kind} artifact (${bytes}B) to ${rel}`,
76
+ output: `wrote ${kind} artifact (${bytes}B) to ${rel}${published.durabilityWarning ? `\n${published.durabilityWarning}` : ""}`,
74
77
  // shownBytes is the artifact's real size; the ledger otherwise measures
75
78
  // this confirmation sentence (a 4753B plan rendered as "60B", #76).
76
- details: { kind, paths: [target], observation: { shownBytes: bytes } },
79
+ details: {
80
+ kind,
81
+ paths: [target],
82
+ observation: { shownBytes: bytes },
83
+ file: { before: published.before, after: published.after },
84
+ },
77
85
  // Writing the artifact is the whole turn; terminate skips the follow-up
78
86
  // LLM call that would only restate what was just written.
79
87
  terminate: true,
package/src/tools/bash.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Type } from "typebox";
2
- import { BASH_HARD_CAP_BYTES, combineBashOutput, runBashCommand } from "../core/bash-exec.js";
2
+ import { BASH_HARD_CAP_BYTES, type BashCommandResult, combineBashOutput, runBashCommand } from "../core/bash-exec.js";
3
3
  import { resolveSafeCwd } from "../core/safe-exec.js";
4
4
  import { ToolNames } from "../core/tool-names.js";
5
5
  import { expandPath } from "./path-utils.js";
@@ -11,8 +11,9 @@ import {
11
11
  type ToolResultContextDisposition,
12
12
  type ToolResultDisposition,
13
13
  } from "./result-disposition.js";
14
+ import { writeToolOffload } from "./result-shaping.js";
14
15
  import { DEFAULT_MAX_LINES, truncateTail } from "./truncate.js";
15
- import { byteLength } from "./truncate-utf8.js";
16
+ import { byteLength, truncateUtf8 } from "./truncate-utf8.js";
16
17
 
17
18
  // The registry's bounded model projection and operator presentation share this
18
19
  // cap. Both are tail-biased for Bash because diagnostics usually land last.
@@ -120,6 +121,91 @@ function bashResultDetails(
120
121
  retainedBytes: byteLength(rawOutput),
121
122
  stdoutBytes: byteLength(result.stdout),
122
123
  stderrBytes: byteLength(result.stderr),
124
+ observedStdoutBytes: result.observedStdoutBytes,
125
+ observedStderrBytes: result.observedStderrBytes,
126
+ retainedStdoutBytes: result.retainedStdoutBytes,
127
+ retainedStderrBytes: result.retainedStderrBytes,
128
+ };
129
+ }
130
+
131
+ /** Finalize cap retention before projection so every policy carries the actual outcome. */
132
+ export function bashOutputCapResult(
133
+ result: BashCommandResult,
134
+ policy: BashOutputPolicy,
135
+ context?: { sessionId?: string; toolResultMaxBytes?: number },
136
+ ): ToolResult {
137
+ const raw = combineBashOutput(result);
138
+ const bytes = byteLength(raw);
139
+ const cap = Math.min(BASH_DISPLAY_MAX_BYTES, context?.toolResultMaxBytes ?? BASH_DISPLAY_MAX_BYTES);
140
+ const bodyBudget = Math.max(0, cap - 2048);
141
+ const showBody = policy === "full" || policy === "bounded";
142
+ const inline = showBody && bytes <= bodyBudget;
143
+ const preview = inline
144
+ ? raw
145
+ : showBody
146
+ ? truncateTail(raw, { maxBytes: Math.max(1, bodyBudget), maxLines: DEFAULT_MAX_LINES }).content
147
+ : "";
148
+ let offloadPath: string | null = null;
149
+ let savedBytes = 0;
150
+ let discardedBytes = 0;
151
+ let retention: string;
152
+ if (inline) {
153
+ retention = `Partial output shown inline (${bytes} decoded output bytes).`;
154
+ } else {
155
+ const saved = truncateUtf8(raw, BASH_HARD_CAP_BYTES, "");
156
+ offloadPath = writeToolOffload(saved, context, BASH_HARD_CAP_BYTES);
157
+ if (offloadPath !== null) {
158
+ savedBytes = byteLength(saved);
159
+ discardedBytes = bytes - savedBytes;
160
+ retention = `Partial output offloaded to ${offloadPath} (${savedBytes} decoded output bytes saved).`;
161
+ if (discardedBytes > 0)
162
+ retention += ` Retention truncated by the ${BASH_HARD_CAP_BYTES}-byte (16 MiB) offload ceiling; ${discardedBytes} decoded output bytes discarded from the offload.`;
163
+ } else {
164
+ discardedBytes = bytes - byteLength(preview);
165
+ retention = `Partial-output retention failed; no offload was written. ${byteLength(preview)} decoded output bytes shown inline; ${discardedBytes} decoded output bytes discarded.`;
166
+ }
167
+ }
168
+ const status = `bash: command output exceeded the ${BASH_HARD_CAP_BYTES}-byte (16 MiB) hard cap and was stopped. Observed stdout: ${result.observedStdoutBytes ?? "unavailable"} bytes, stderr: ${result.observedStderrBytes ?? "unavailable"} bytes; retained stream stdout: ${result.retainedStdoutBytes ?? "unavailable"} bytes, stderr: ${result.retainedStderrBytes ?? "unavailable"} bytes. ${retention} Use run_script to stream unbounded output to .clio-coder/runs/<runId>/ instead.`;
169
+ const message = preview.length > 0 ? `${preview}\n\n${status}` : status;
170
+ const disposition = normalizedBashDisposition(policy);
171
+ return {
172
+ kind: "error",
173
+ message,
174
+ modelContext: message,
175
+ details: {
176
+ ...bashResultDetails(result, raw, "output-cap"),
177
+ retention: {
178
+ status: inline ? "inline" : offloadPath === null ? "failed" : discardedBytes > 0 ? "truncated" : "offloaded",
179
+ savedBytes,
180
+ discardedBytes,
181
+ ...(offloadPath === null ? {} : { offloadPath }),
182
+ },
183
+ resultSize: {
184
+ bytes,
185
+ shownBytes: byteLength(message),
186
+ maxBytes: cap,
187
+ truncated: !inline,
188
+ policy,
189
+ ...(offloadPath === null ? {} : { offloadPath }),
190
+ },
191
+ resultDisposition: {
192
+ version: 1,
193
+ applications: 1,
194
+ presentation: { ...disposition.presentation, content: message },
195
+ context: {
196
+ requestedMode: policy === "metadata-only" ? "metadata-only" : disposition.context.mode,
197
+ appliedMode: disposition.context.mode,
198
+ maxBytes: cap,
199
+ },
200
+ capturedBytes: bytes,
201
+ displayedBytes: byteLength(message),
202
+ contextBytes: byteLength(message),
203
+ presentationTruncated: !inline,
204
+ contextTruncated: !inline,
205
+ retrieval: retention,
206
+ ...(offloadPath === null ? {} : { offloadPath }),
207
+ },
208
+ },
123
209
  };
124
210
  }
125
211
 
@@ -157,7 +243,7 @@ function observeToolsNudge(command: string, sessionId: string | undefined): stri
157
243
  export const bashTool: ToolSpec = {
158
244
  name: ToolNames.Bash,
159
245
  description:
160
- "Execute a bash command in a fresh child at the workspace root (or explicit cwd); shell state does not persist across calls. The default timeout is 300s; use panes for long-lived processes or an explicit timeout_ms, and use output_policy for bounded diagnostic tail (default), summary, metadata-only, or budget-limited full output. Network reachability follows the host environment and OS isolation; disabling web_fetch does not isolate bash networking.",
246
+ "Execute a bash command in a fresh child at the workspace root (or explicit cwd); shell state does not persist across calls. Combined stdout and stderr have a 16 MiB hard cap that stops the child; use run_script to stream unbounded output to .clio-coder/runs/<runId>/. The default timeout is 300s; use panes for long-lived processes or an explicit timeout_ms, and use output_policy for bounded diagnostic tail (default), summary, metadata-only, or budget-limited full output. Network reachability follows the host environment and OS isolation; disabling web_fetch does not isolate bash networking.",
161
247
  parameters: Type.Object({
162
248
  command: Type.String({ description: "Bash command to execute." }),
163
249
  cwd: Type.Optional(
@@ -238,14 +324,7 @@ export const bashTool: ToolSpec = {
238
324
  details: bashResultDetails(result, rawOutput, "timeout"),
239
325
  };
240
326
  }
241
- if (outputCapped) {
242
- const status = `bash: command output exceeded ${BASH_HARD_CAP_BYTES} bytes and was stopped`;
243
- return {
244
- kind: "error",
245
- message: output.length > 0 ? `${output}\n\n${status}` : status,
246
- details: bashResultDetails(result, rawOutput, "output-cap"),
247
- };
248
- }
327
+ if (outputCapped) return bashOutputCapResult(result, outputPolicy, options);
249
328
  if (error) {
250
329
  const code = typeof error.code === "number" ? error.code : (error as { code?: string }).code;
251
330
  const status = `bash: command failed (exit ${code ?? "?"})`;
@@ -1,10 +1,12 @@
1
1
  import { BusChannels } from "../core/bus-events.js";
2
2
  import type { WorkerRosters } from "../core/defaults.js";
3
3
  import type { SafeEventBus } from "../core/event-bus.js";
4
+ import type { getTerminationCoordinator } from "../core/termination.js";
4
5
  import type { AgentSpec } from "../domains/agents/spec.js";
5
6
  import type { WorkerContextSnapshot } from "../domains/context/worker/contract.js";
6
7
  import type { DispatchContract } from "../domains/dispatch/contract.js";
7
8
  import type { AgentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
9
+ import { DEFAULT_KILL_GRACE_MS, DEFAULT_TEARDOWN_BOUND_MS } from "../domains/gateway/mcp/index.js";
8
10
  import type { PanesOperations } from "../domains/mux/operations.js";
9
11
  import type { AutonomyLevel } from "../domains/safety/autonomy.js";
10
12
  import type { DecisionLedgerEntry } from "../domains/session/entries.js";
@@ -14,6 +16,7 @@ import { assertRegisteredBuiltinTools, type CoreToolBootstrapDeps, registerCoreT
14
16
  import { createDispatchRunEventRegistry, createDispatchTool } from "./dispatch.js";
15
17
  import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
16
18
  import type { DispatchSchemaComposition } from "./dispatch-schema.js";
19
+ import { createMcpCapabilitySource, type McpCapabilitySource } from "./gateway/index.js";
17
20
  import { registerHarnessExtensionTools } from "./harness-extensions.js";
18
21
  import { lazyTool } from "./lazy-tool.js";
19
22
  import { monitorToolSurface } from "./monitor-surface.js";
@@ -23,10 +26,11 @@ import { steerToolSurface } from "./steer-surface.js";
23
26
 
24
27
  export { toolPromptHintsForNames };
25
28
 
26
- export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
29
+ export interface ToolBootstrapDeps extends Omit<CoreToolBootstrapDeps, "mcpCapabilities"> {
27
30
  captureWorkerContext?: () => WorkerContextSnapshot | null;
28
31
  dispatch?: DispatchContract;
29
32
  bus?: SafeEventBus;
33
+ termination?: Pick<ReturnType<typeof getTerminationCoordinator>, "onTerminate">;
30
34
  getAgentCatalog?: () => string;
31
35
  getAgentSpecs?: () => ReadonlyArray<AgentSpec>;
32
36
  getAgentRoleFacts?: AgentRoleFactsResolver;
@@ -45,6 +49,19 @@ export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
45
49
  * is what keeps the `panes` tool out of the prompt on a machine with none.
46
50
  */
47
51
  panes?: PanesOperations;
52
+ /**
53
+ * Local MCP servers for the gateway. Absent means one is built for the
54
+ * session cwd; `false` registers none (a registry that must never launch a
55
+ * child process, such as a test's).
56
+ */
57
+ mcpCapabilities?: McpCapabilitySource | false;
58
+ }
59
+
60
+ export interface ToolBootstrapHandle {
61
+ /** The MCP capability source the gateway launches servers through, when one was registered. */
62
+ mcpCapabilities: McpCapabilitySource | null;
63
+ /** Close every launched MCP client. Idempotent; also bound to session end and shutdown on the bus. */
64
+ close(): Promise<void>;
48
65
  }
49
66
 
50
67
  /**
@@ -52,8 +69,14 @@ export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
52
69
  * controls in their canonical order. Worker registries call registerCoreTools
53
70
  * directly so their boot graph never evaluates dispatch implementations.
54
71
  */
55
- export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps = {}): void {
56
- const registration = registerCoreTools(registry, deps);
72
+ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps = {}): ToolBootstrapHandle {
73
+ const cwd = deps.session?.current()?.cwd ?? process.cwd();
74
+ const { mcpCapabilities: requestedMcp, ...coreDeps } = deps;
75
+ const mcpCapabilities = requestedMcp === false ? null : (requestedMcp ?? createMcpCapabilitySource({ cwd, registry }));
76
+ const registration = registerCoreTools(registry, {
77
+ ...coreDeps,
78
+ ...(mcpCapabilities ? { mcpCapabilities } : {}),
79
+ });
57
80
  if (deps.dispatch) {
58
81
  const dispatch = deps.dispatch;
59
82
  // Display tail only. In a composed process the dispatch domain writes the
@@ -114,7 +137,22 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
114
137
  });
115
138
  }
116
139
  assertRegisteredBuiltinTools(registry, registration, Boolean(deps.dispatch), Boolean(deps.panes));
117
- for (const diagnostic of registerHarnessExtensionTools(registry, deps.session?.current()?.cwd ?? process.cwd())) {
140
+ for (const diagnostic of registerHarnessExtensionTools(registry, cwd)) {
118
141
  deps.bus?.emit(BusChannels.ExtensionsLoadIssue, { message: diagnostic.message });
119
142
  }
143
+ // Every MCP client the gateway launched closes with the session: a
144
+ // detached server must not outlive the process that trusted it.
145
+ let closePromise: Promise<void> | undefined;
146
+ const close = (): Promise<void> => {
147
+ closePromise ??= Promise.resolve(mcpCapabilities?.close()).then(() => undefined);
148
+ return closePromise;
149
+ };
150
+ if (mcpCapabilities) {
151
+ deps.termination?.onTerminate(close, { timeoutMs: DEFAULT_KILL_GRACE_MS + DEFAULT_TEARDOWN_BOUND_MS + 1_000 });
152
+ }
153
+ if (mcpCapabilities && deps.bus) {
154
+ deps.bus.on(BusChannels.SessionEnd, () => void close());
155
+ deps.bus.on(BusChannels.ShutdownRequested, () => void close());
156
+ }
157
+ return { mcpCapabilities, close };
120
158
  }