@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
@@ -1,3 +1,4 @@
1
+ import { resolve } from "node:path";
1
2
  import type { SessionContract } from "../../domains/session/contract.js";
2
3
  import type { TreeSnapshot, TreeSnapshotNode } from "../../domains/session/tree/navigator.js";
3
4
  import {
@@ -21,17 +22,19 @@ const VISIBLE_ROWS = 16;
21
22
  * /tree navigator overlay. Behaviors:
22
23
  * - One row per node, indented two spaces per branch level (not per message)
23
24
  * - Shift+T toggles operator-local timestamps on/off
25
+ * - `p` filters to nodes whose session cwd matches the current cwd
26
+ * - `s` cycles between tree order and most recent first
24
27
  * - `e` enters label edit submode (Enter commits, Esc cancels)
25
28
  * - Enter on a row switches the active append point to that turn id
26
29
  * - Esc closes the overlay
27
30
  *
28
- * Cwd-toggle (`p`) and sort-order (`s`) are not implemented.
29
- *
30
31
  * The overlay queries `session.tree()` on open and after any mutation so
31
32
  * label edits are reflected without a close/reopen cycle.
32
33
  */
33
34
  export interface OpenTreeOverlayDeps {
34
- session: SessionContract;
35
+ session: Pick<SessionContract, "tree" | "editLabel">;
36
+ /** The current workspace directory. Defaults to the process cwd. */
37
+ cwd?: string;
35
38
  onSwitchTurn: (turnId: string) => void;
36
39
  onClose: () => void;
37
40
  }
@@ -204,6 +207,8 @@ export class TreeOverlayView implements Component {
204
207
  private highlight = 0;
205
208
  private scrollTop = 0;
206
209
  private showTimestamps = false;
210
+ private currentCwdOnly = false;
211
+ private sortOrder: "tree" | "recent" = "tree";
207
212
  private submode: Submode = "browse";
208
213
  private labelBuffer = "";
209
214
  private readonly labelInput = new Input();
@@ -221,7 +226,8 @@ export class TreeOverlayView implements Component {
221
226
  initial: TreeSnapshot | null,
222
227
  ) {
223
228
  this.snapshot = initial;
224
- this.rows = initial ? flattenTreeSnapshot(initial) : [];
229
+ this.rows = [];
230
+ this.rebuildRows();
225
231
  }
226
232
 
227
233
  private invalidateLayout(): void {
@@ -242,15 +248,27 @@ export class TreeOverlayView implements Component {
242
248
  return this.rows[this.highlight] ?? null;
243
249
  }
244
250
 
251
+ private rebuildRows(): void {
252
+ const selectedId = this.currentRow()?.node.id;
253
+ const snapshot = this.snapshot;
254
+ const matchesCwd = snapshot?.meta.cwd && resolve(snapshot.meta.cwd) === resolve(this.deps.cwd ?? process.cwd());
255
+ this.rows = snapshot && (!this.currentCwdOnly || matchesCwd) ? flattenTreeSnapshot(snapshot) : [];
256
+ if (this.sortOrder === "recent") {
257
+ this.rows.sort((a, b) => Date.parse(b.node.at) - Date.parse(a.node.at));
258
+ this.rows = this.rows.map((row) => ({ ...row, depth: 0 }));
259
+ }
260
+ const selectedIndex = this.rows.findIndex((row) => row.node.id === selectedId);
261
+ this.highlight = selectedIndex < 0 ? 0 : selectedIndex;
262
+ this.invalidateLayout();
263
+ }
264
+
245
265
  private refresh(): void {
246
266
  try {
247
267
  this.snapshot = this.deps.session.tree();
248
- this.rows = flattenTreeSnapshot(this.snapshot);
249
268
  } catch {
250
269
  this.snapshot = null;
251
- this.rows = [];
252
270
  }
253
- this.invalidateLayout();
271
+ this.rebuildRows();
254
272
  }
255
273
 
256
274
  render(width: number): string[] {
@@ -262,7 +280,14 @@ export class TreeOverlayView implements Component {
262
280
  if (this.rows.length === 0) {
263
281
  // The overlay navigates the CURRENT session's turn tree; an empty
264
282
  // tree means no turns yet, not a missing session list.
265
- lines.push(theme.fg("muted", "(no turns in this session yet)"));
283
+ lines.push(
284
+ theme.fg(
285
+ "muted",
286
+ this.currentCwdOnly && this.snapshot && Object.keys(this.snapshot.nodesById).length > 0
287
+ ? "(no turns match the current cwd; press p to show all)"
288
+ : "(no turns in this session yet)",
289
+ ),
290
+ );
266
291
  } else {
267
292
  const end = Math.min(this.rows.length, this.scrollTop + VISIBLE_ROWS);
268
293
  for (let i = this.scrollTop; i < end; i++) {
@@ -303,6 +328,8 @@ export class TreeOverlayView implements Component {
303
328
  { key: "↑↓", verb: "move" },
304
329
  { key: "Enter", verb: "switch" },
305
330
  { key: "e", verb: "label" },
331
+ { key: "p", verb: `cwd:${this.currentCwdOnly ? "current" : "all"}` },
332
+ { key: "s", verb: this.sortOrder },
306
333
  { key: "Shift+T", verb: `ts:${tsLabel}` },
307
334
  ]);
308
335
  }
@@ -328,7 +355,17 @@ export class TreeOverlayView implements Component {
328
355
  this.deps.onClose();
329
356
  return;
330
357
  }
331
- // Empty snapshot: only Esc is meaningful; swallow everything else.
358
+ if (data === "p") {
359
+ this.currentCwdOnly = !this.currentCwdOnly;
360
+ this.rebuildRows();
361
+ return;
362
+ }
363
+ if (data === "s") {
364
+ this.sortOrder = this.sortOrder === "tree" ? "recent" : "tree";
365
+ this.rebuildRows();
366
+ return;
367
+ }
368
+ // Filtering and sorting remain available when the visible list is empty.
332
369
  if (this.rows.length === 0) return;
333
370
  // Arrows: CSI A/B for up/down.
334
371
  if (matchesKey(data, "up")) {
@@ -406,7 +443,7 @@ export class TreeOverlayView implements Component {
406
443
  }
407
444
  }
408
445
 
409
- function loadInitialSnapshot(session: SessionContract): TreeSnapshot | null {
446
+ function loadInitialSnapshot(session: OpenTreeOverlayDeps["session"]): TreeSnapshot | null {
410
447
  try {
411
448
  return session.tree();
412
449
  } catch {
@@ -6,7 +6,7 @@
6
6
  * ladder *before* the pane is split: `openUtilityPane` delivers its command by
7
7
  * sending `exec <argv>` into the pane's shell, so a binary that is not there
8
8
  * kills the pane the instant it appears, and the operator sees a flicker
9
- * instead of an install hint (phase 1 report, open question 3). And every
9
+ * instead of an install hint. Every
10
10
  * mutation is scoped to panes Clio created, because the contract's registry
11
11
  * refuses anything else.
12
12
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Renderers for CompactionSummary session entries (Phase 12 slice 12c).
2
+ * Renderers for CompactionSummary session entries.
3
3
  *
4
4
  * Two output shapes live here:
5
5
  * 1. `renderCompactionSummaryLine` is the inline one-liner chat-loop
@@ -0,0 +1,118 @@
1
+ import { stripVTControlCharacters } from "node:util";
2
+ import { redactSecretsText } from "../../domains/evidence/redact.js";
3
+ import { redactSecretString } from "../../domains/safety/redaction.js";
4
+
5
+ const SCAN_LIMIT = 8_192;
6
+ const DISPLAY_LIMIT = 600;
7
+ const ROUTE_ADVICE_TAIL = 1_024;
8
+
9
+ /** Discard incomplete control sequences at the scan boundary, including their payload. */
10
+ function terminalSafePrefix(value: string, limit: number): string {
11
+ const end = Math.min(value.length, limit);
12
+ const parts: string[] = [];
13
+ let start = 0;
14
+ let i = 0;
15
+ while (i < end) {
16
+ const code = value.charCodeAt(i);
17
+ if (code !== 27 && !(code >= 0x80 && code <= 0x9f)) {
18
+ i++;
19
+ continue;
20
+ }
21
+ parts.push(value.slice(start, i));
22
+ const introducer = code === 27 ? value.charCodeAt(++i) : code;
23
+ i++;
24
+ if (introducer === 91 || introducer === 0x9b) {
25
+ while (i < end) {
26
+ const next = value.charCodeAt(i++);
27
+ if (next >= 0x40 && next <= 0x7e) break;
28
+ }
29
+ } else if ([93, 80, 88, 94, 95, 0x9d, 0x90, 0x98, 0x9e, 0x9f].includes(introducer)) {
30
+ while (i < end) {
31
+ const next = value.charCodeAt(i++);
32
+ if (next === 7 || next === 0x9c) break;
33
+ if (next === 27 && i < end && value.charCodeAt(i) === 92) {
34
+ i++;
35
+ break;
36
+ }
37
+ }
38
+ }
39
+ start = i;
40
+ }
41
+ parts.push(value.slice(start, end));
42
+ return stripVTControlCharacters(parts.join(""));
43
+ }
44
+
45
+ /** Available evidence is sanitized and redacted only when explicitly inspected. */
46
+ export function providerErrorEvidence(value: string, scanLimit = value.length): string {
47
+ return redactSecretsText(
48
+ redactSecretString(terminalSafePrefix(value, scanLimit)).replace(
49
+ /(\b(?:authorization["']?\s*[:=]\s*["']?\s*)?(?:Bearer|Basic)\s+)[^\s"'<>]+/gi,
50
+ "$1[redacted]",
51
+ ),
52
+ { count: 0 },
53
+ ).replace(/[\p{Cc}\p{Cf}]/gu, (char) => (char === "\n" || char === "\t" ? char : " "));
54
+ }
55
+
56
+ /** A bounded projection; never use this to replace a persisted diagnostic. */
57
+ export function presentProviderError(value: string): string {
58
+ const available = providerErrorEvidence(value, SCAN_LIMIT);
59
+ // Preserve the actual Clio wrapper suffix; never infer a retry policy from
60
+ // provider error codes. A restored body can push this advice past the scan
61
+ // window, so a long diagnostic is matched on its bounded tail instead.
62
+ const beyondScan = value.length > SCAN_LIMIT;
63
+ const routeParts = (beyondScan ? providerErrorEvidence(value.slice(-ROUTE_ADVICE_TAIL)) : available).match(
64
+ /\n\n((LiteLLM route [^\n]+ failed\.) (Clio did not retry or substitute another model); (select a different route with \/model, then resend\.))$/,
65
+ );
66
+ const routeAdvice = routeParts?.[1];
67
+ const sample =
68
+ routeAdvice && !beyondScan ? available.slice(0, available.length - routeAdvice.length).trimEnd() : available;
69
+ let summary = sample;
70
+ const jsonStart = sample.indexOf("{");
71
+ const html = /<!doctype\s+html|<html\b/i.test(sample);
72
+ if (html) {
73
+ const title = sample.match(/<title[^>]*>([^<]*)<\/title>/i)?.[1];
74
+ const prefix = sample.slice(0, sample.indexOf("<")).trim();
75
+ summary = [
76
+ prefix,
77
+ title,
78
+ routeAdvice ? "" : "Provider returned an HTML error page. Check the provider or gateway endpoint.",
79
+ ]
80
+ .filter(Boolean)
81
+ .join("; ");
82
+ } else if (jsonStart >= 0) {
83
+ // Decode only quoted diagnostic strings, never parse and round numeric
84
+ // source facts. The scan and every allocation are bounded by SCAN_LIMIT.
85
+ const fields = [...sample.matchAll(/"(?:message|detail|type|code)"\s*:\s*"((?:[^"\\]|\\.)*)/g)].map((match) => {
86
+ const quoted = match[1];
87
+ if (quoted === undefined) return "";
88
+ try {
89
+ // A bounded prefix of an unfinished quoted field is still useful
90
+ // prose. The matcher excludes a dangling escape at the boundary.
91
+ const decoded: unknown = JSON.parse(`"${quoted}"`);
92
+ return typeof decoded === "string" ? providerErrorEvidence(decoded) : "";
93
+ } catch {
94
+ return "";
95
+ }
96
+ });
97
+ if (fields.some(Boolean))
98
+ summary = [sample.slice(0, jsonStart).trim(), ...new Set(fields)].filter(Boolean).join("; ");
99
+ }
100
+ const status =
101
+ sample.match(/\b(?:HTTP(?:\/\d(?:\.\d)?)?\s*|status(?:_code)?["']?\s*[:=]\s*)([45]\d\d)\b/i)?.[1] ??
102
+ sample.match(/"(?:status|status_?code)"\s*:\s*([45]\d{2})(?=\s*[,}])/i)?.[1] ??
103
+ sample.match(/"error"\s*:\s*\{[^{}]*?"code"\s*:\s*([45]\d{2})(?=\s*[,}])/i)?.[1];
104
+ if (status && !summary.includes(status)) summary = `HTTP ${status}; ${summary}`;
105
+ summary = summary.replace(/\s+/g, " ").trim();
106
+ if (routeAdvice) {
107
+ // Keep route recovery ahead of long body detail so row clipping cannot
108
+ // spend the entire primary preview on the provider payload.
109
+ const prefix = summary.slice(0, 60);
110
+ const identity = routeParts?.[2];
111
+ const policy = routeParts?.[3];
112
+ const remedy = routeParts?.[4];
113
+ const advice = identity && policy && remedy ? `${remedy} ${policy}. ${identity}` : routeAdvice;
114
+ summary = `${prefix}${summary.length > 60 ? " ..." : ""}; ${advice}`;
115
+ }
116
+ const shortened = summary.length > DISPLAY_LIMIT || value.length > SCAN_LIMIT || summary !== sample.trim();
117
+ return `${summary.slice(0, DISPLAY_LIMIT)}${shortened ? " ... [available diagnostic: /view transcript]" : ""}`;
118
+ }
@@ -1,32 +1,30 @@
1
+ import { truncateToWidth, wrapTextWithAnsi } from "../../engine/tui.js";
1
2
  import type { RetryStatusPayload } from "../chat-loop.js";
3
+ import { clioTheme } from "../theme/index.js";
4
+ import type { TranscriptDetailPolicy } from "../transcript-detail.js";
2
5
  import { styleTaggedNotice } from "./notice.js";
6
+ import { previewBudget, previewRows } from "./preview.js";
7
+ import { presentProviderError, providerErrorEvidence } from "./provider-error.js";
3
8
 
4
- const RETRY_ERROR_MAX_CHARS = 2_000;
5
- const RETRY_ERROR_TRUNCATION_MARKER = " [retry error truncated]";
6
-
7
- function boundedRetryError(value: string): string {
8
- const characters = Array.from(value);
9
- if (characters.length <= RETRY_ERROR_MAX_CHARS) return value;
10
- return `${characters.slice(0, RETRY_ERROR_MAX_CHARS).join("").trimEnd()}${RETRY_ERROR_TRUNCATION_MARKER}`;
11
- }
12
-
13
- function rawRetryStatus(status: RetryStatusPayload): string {
14
- // Both live and replay renderers wrap this notice to their terminal width, so
15
- // ordinary errors keep their complete remedy. Raw provider failures can also
16
- // be an HTML proxy page, though; keep a generous ceiling so one retry does not
17
- // turn that page into hundreds of transcript rows.
18
- const suffix = status.errorMessage ? `: ${boundedRetryError(status.errorMessage)}` : "";
9
+ function rawRetryStatus(status: RetryStatusPayload, unbounded: boolean): string {
10
+ const showError = unbounded || (status.phase !== "waiting" && status.phase !== "retrying");
11
+ const suffix =
12
+ showError && status.errorMessage
13
+ ? `: ${unbounded ? providerErrorEvidence(status.errorMessage) : presentProviderError(status.errorMessage)}`
14
+ : "";
19
15
  if (status.phase === "waiting") {
20
- return `[retry] attempt ${status.attempt}/${status.maxAttempts} in ${status.seconds ?? 0}s${suffix}`;
16
+ return `[retry] provider retry ${status.attempt}/${status.maxAttempts} in ${status.seconds ?? 0}s${suffix}`;
21
17
  }
22
18
  if (status.phase === "scheduled") {
23
19
  const seconds = Math.ceil((status.delayMs ?? 0) / 1000);
24
- return `[retry] attempt ${status.attempt}/${status.maxAttempts} scheduled in ${seconds}s${suffix}`;
20
+ return `[retry] provider retry ${status.attempt}/${status.maxAttempts} scheduled in ${seconds}s${suffix}`;
25
21
  }
26
- if (status.phase === "retrying") return `[retry] attempt ${status.attempt}/${status.maxAttempts} running${suffix}`;
27
- if (status.phase === "cancelled") return `[retry] cancelled attempt ${status.attempt}/${status.maxAttempts}${suffix}`;
28
- if (status.phase === "exhausted") return `[retry] exhausted after ${status.attempt} attempt(s)${suffix}`;
29
- return `[retry] recovered after ${status.attempt} attempt(s)`;
22
+ if (status.phase === "retrying")
23
+ return `[retry] provider retry ${status.attempt}/${status.maxAttempts} running${suffix}`;
24
+ if (status.phase === "cancelled")
25
+ return `[retry] provider retry cancelled (${status.attempt}/${status.maxAttempts})${suffix}`;
26
+ if (status.phase === "exhausted") return `[retry] provider retry exhausted (${status.attempt})${suffix}`;
27
+ return `[retry] provider retry recovered after ${status.attempt} attempt(s)`;
30
28
  }
31
29
 
32
30
  /**
@@ -34,6 +32,44 @@ function rawRetryStatus(status: RetryStatusPayload): string {
34
32
  * renders in warning and the body in muted via the shared notice styler, so the
35
33
  * live retry line and the replayed one read identically.
36
34
  */
37
- export function formatRetryStatus(status: RetryStatusPayload): string {
38
- return styleTaggedNotice(rawRetryStatus(status));
35
+ export function formatRetryStatus(status: RetryStatusPayload, unbounded = false): string {
36
+ return styleTaggedNotice(rawRetryStatus(status, unbounded));
37
+ }
38
+
39
+ /** Reserve diagnosis space even when a short terminal permits only two rows. */
40
+ export function renderRetryStatus(
41
+ status: RetryStatusPayload,
42
+ width: number,
43
+ detail: TranscriptDetailPolicy,
44
+ unbounded = false,
45
+ terminalRows = 40,
46
+ ): string[] {
47
+ if (unbounded) return wrapTextWithAnsi(formatRetryStatus(status, true), width);
48
+ const limit = previewBudget(detail.errorRows, terminalRows);
49
+ const { errorMessage, ...heading } = status;
50
+ if (!errorMessage || status.phase === "waiting" || status.phase === "retrying" || status.phase === "recovered") {
51
+ return previewRows(wrapTextWithAnsi(formatRetryStatus(heading), width), limit, width);
52
+ }
53
+ // One heading row leaves room for the failure itself, not just a View hint.
54
+ const headingRow = truncateToWidth(formatRetryStatus(heading), width);
55
+ const diagnosis = presentProviderError(errorMessage);
56
+ const rows = wrapTextWithAnsi(diagnosis, width);
57
+ if (limit === 2 && rows.length > 1) {
58
+ const hint = " /view";
59
+ return [
60
+ headingRow,
61
+ clioTheme().fg(
62
+ "muted",
63
+ truncateToWidth(`${truncateToWidth(diagnosis, Math.max(1, width - hint.length))}${hint}`, width),
64
+ ),
65
+ ];
66
+ }
67
+ return [
68
+ headingRow,
69
+ ...previewRows(
70
+ rows.map((row) => clioTheme().fg("muted", row)),
71
+ limit - 1,
72
+ width,
73
+ ),
74
+ ];
39
75
  }
@@ -16,12 +16,13 @@ import { previewBudget, previewRows } from "./preview.js";
16
16
  */
17
17
 
18
18
  import { trustStateWord } from "../../domains/evidence/trust-projection.js";
19
- import { sanitizeCallTargetText } from "../../domains/safety/call-target.js";
19
+ import { sanitizeCallTargetText, sanitizeMultilineDisplayText } from "../../domains/safety/call-target.js";
20
20
  import { redactSecretString, redactToolArgs } from "../../domains/safety/redaction.js";
21
21
  import { formatSize } from "../../engine/truncate.js";
22
22
  import { visibleWidth, wrapTextWithAnsi } from "../../engine/tui.js";
23
23
  import { classifyResourceRead, toolPresentationPolicy } from "../../tools/presentation.js";
24
24
  import { toolResultPresentationPolicy, toolResultPresentationText } from "../../tools/result-disposition.js";
25
+ import { effectiveToolCall } from "../../tools/surface.js";
25
26
  import { mutationFactsLine } from "../mutation-preview.js";
26
27
  import type { ApprovalRequestView } from "../permission-overlay.js";
27
28
  import { clioTheme, formatCompactMs, GLYPH } from "../theme/index.js";
@@ -214,11 +215,16 @@ const PRIMARY_ARG_FIELD: Record<string, string> = {
214
215
  bash: "command",
215
216
  grep: "pattern",
216
217
  find: "pattern",
218
+ web_read: "url",
217
219
  web_fetch: "url",
218
220
  git: "op",
219
221
  verify: "check",
222
+ run_script: "script",
220
223
  code_nav: "query",
221
224
  context: "scope",
225
+ clio_docs: "query",
226
+ clio_library: "query",
227
+ data: "path",
222
228
  artifact: "kind",
223
229
  monitor: "run_id",
224
230
  steer: "run_id",
@@ -252,10 +258,31 @@ function summarizeWebFetchArgs(args: unknown): string {
252
258
  return truncate(jsonStringifySafe(Object.keys(compact).length > 0 ? compact : args), WEB_FETCH_ARG_PREVIEW_LIMIT);
253
259
  }
254
260
 
261
+ /**
262
+ * A gateway call reads as the capability it reached: `find` and `describe`
263
+ * name what was asked, `call` renders the capability's own summary so a row
264
+ * says `git status` rather than an opaque gateway argument dump.
265
+ */
266
+ function summarizeGatewayArgs(args: unknown): string {
267
+ if (!isPlainObject(args)) return truncate(jsonStringifySafe(redactToolArgs(args)), ARG_PREVIEW_LIMIT);
268
+ const op = typeof args.op === "string" ? args.op : "";
269
+ if (op === "find") {
270
+ const query = readStringField(args, "query");
271
+ return truncate(query === null || query.length === 0 ? "find" : `find ${query}`, ARG_PREVIEW_LIMIT);
272
+ }
273
+ const capability = readStringField(args, "capability") ?? "";
274
+ if (op === "describe") return truncate(`describe ${capability}`.trim(), ARG_PREVIEW_LIMIT);
275
+ const effective = effectiveToolCall("gateway", args);
276
+ if (!effective.viaGateway) return truncate(jsonStringifySafe(redactToolArgs(args)), ARG_PREVIEW_LIMIT);
277
+ const inner = summarizeArgs(effective.toolName, effective.args);
278
+ return truncate(inner.length > 0 ? `${effective.toolName} ${inner}` : effective.toolName, ARG_PREVIEW_LIMIT);
279
+ }
280
+
255
281
  function summarizeArgs(toolName: string, args: unknown): string {
256
282
  if (isEmptyArgs(args)) return "";
257
283
  const safeArgs = redactToolArgs(args);
258
- if (toolName === "web_fetch") return summarizeWebFetchArgs(safeArgs);
284
+ if (toolName === "web_fetch" || toolName === "web_read") return summarizeWebFetchArgs(safeArgs);
285
+ if (toolName === "gateway") return summarizeGatewayArgs(args);
259
286
  const primary = capturedPrimaryArg(toolName, args);
260
287
  if (primary !== null) return truncate(displayArg(toolName, primary), ARG_PREVIEW_LIMIT);
261
288
  return truncate(jsonStringifySafe(safeArgs), ARG_PREVIEW_LIMIT);
@@ -589,7 +616,12 @@ function buildFieldSublineBody(
589
616
  ): string | null {
590
617
  const value = readStringField(args, key);
591
618
  if (value === null) return null;
592
- const preview = truncate(key === "command" ? stripShellWrapperForDisplay(value) : value, ARG_PREVIEW_LIMIT);
619
+ // One array element is one terminal row to the diff renderer. A multi-line
620
+ // command or an escape sequence inside this row shifted every row below it.
621
+ const preview = truncate(
622
+ sanitizeCallTargetText(key === "command" ? stripShellWrapperForDisplay(value) : value),
623
+ ARG_PREVIEW_LIMIT,
624
+ );
593
625
  if (options.wrapInBackticks) return `${lead}\`${preview}\``;
594
626
  return `${lead}${preview}`;
595
627
  }
@@ -635,9 +667,32 @@ const SUBLINE_BODY_BUILDERS: Readonly<Record<string, (args: unknown) => string |
635
667
  bash: (args) => buildFieldSublineBody(args, "command", "running ", { wrapInBackticks: true }),
636
668
  grep: (args) => buildFieldSublineBody(args, "pattern", "searching for ", { wrapInBackticks: true }),
637
669
  find: (args) => buildFieldSublineBody(args, "pattern", "finding ", { wrapInBackticks: true }),
670
+ web_read: (args) => buildFieldSublineBody(args, "url", "reading "),
638
671
  web_fetch: (args) => buildFieldSublineBody(args, "url", "fetching "),
639
672
  git: (args) => buildFieldSublineBody(args, "op", "git "),
640
673
  verify: (args) => buildFieldSublineBody(args, "check", "verifying "),
674
+ run_script: (args) => buildFieldSublineBody(args, "script", "running ", { wrapInBackticks: true }),
675
+ data: (args) => {
676
+ const op = readStringField(args, "op") ?? "inspecting";
677
+ const path = readStringField(args, "path");
678
+ return path === null ? op : `${op} ${path}`;
679
+ },
680
+ gateway: (args) => {
681
+ if (!isPlainObject(args)) return null;
682
+ const op = typeof args.op === "string" ? args.op : "";
683
+ if (op === "find") {
684
+ const query = readStringField(args, "query");
685
+ return query === null || query.length === 0 ? "finding capabilities" : `finding capabilities \`${query}\``;
686
+ }
687
+ if (op === "describe") {
688
+ const capability = readStringField(args, "capability");
689
+ return capability === null ? "describing a capability" : `describing ${capability}`;
690
+ }
691
+ const effective = effectiveToolCall("gateway", args);
692
+ if (!effective.viaGateway) return null;
693
+ const inner = SUBLINE_BODY_BUILDERS[effective.toolName]?.(effective.args);
694
+ return inner !== null && inner !== undefined ? `${inner} (via gateway)` : `calling ${effective.toolName}`;
695
+ },
641
696
  code_nav: (args) => {
642
697
  const mode = readStringField(args, "mode");
643
698
  const query = readStringField(args, "query")?.trim() ?? "";
@@ -715,9 +770,9 @@ function buildSublineBody(
715
770
  }
716
771
  return SUBLINE_BODY_BUILDERS[toolName]?.(args) ?? buildGenericToolBody(toolName, args);
717
772
  }
718
- if (toolName === "web_fetch") {
773
+ if (toolName === "web_fetch" || toolName === "web_read") {
719
774
  const meta = status === undefined ? null : webFetchMeta(result);
720
- const body = SUBLINE_BODY_BUILDERS.web_fetch?.(args) ?? buildGenericToolBody(toolName, args);
775
+ const body = SUBLINE_BODY_BUILDERS[toolName]?.(args) ?? buildGenericToolBody(toolName, args);
721
776
  return `${body}${meta ? dim(` · ${meta}`) : ""}`;
722
777
  }
723
778
  if (toolName === "bash") {
@@ -909,9 +964,14 @@ function isEmptyResult(result: unknown): boolean {
909
964
  return false;
910
965
  }
911
966
 
967
+ /**
968
+ * Tool output is untrusted terminal input. Cursor movement, backspaces and
969
+ * carriage returns inside a row break the diff renderer's one-row-per-line
970
+ * accounting, so everything but the line structure is neutralized here.
971
+ */
912
972
  function resultText(result: unknown, limit = FULL_RESULT_PREVIEW_LIMIT): string {
913
- if (typeof result === "string") return truncate(result, limit);
914
- return truncate(jsonStringifySafe(result), limit);
973
+ const text = typeof result === "string" ? result : jsonStringifySafe(result);
974
+ return truncate(sanitizeMultilineDisplayText(text).text, limit);
915
975
  }
916
976
 
917
977
  function truncateRowsMiddle(rows: ReadonlyArray<string>, rowLimit: number, isError: boolean): string[] {