@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
@@ -0,0 +1,198 @@
1
+ import { sanitizeMultilineDisplayText } from "../../domains/safety/call-target.js";
2
+ import { redactSecretString } from "../../domains/safety/redaction.js";
3
+ import { GLYPH } from "../theme/index.js";
4
+
5
+ /** Sanitize complete source text before splitting, so OSC payloads cannot cross rows. */
6
+ export function safeWorkerAnswerText(text: string): string {
7
+ const normalized = text
8
+ .replaceAll(String.fromCharCode(0x9d), "\u001b]")
9
+ .replaceAll(String.fromCharCode(0x9b), "\u001b[")
10
+ .replaceAll(String.fromCharCode(0x9c), "\u001b\\");
11
+ return redactSecretString(sanitizeMultilineDisplayText(normalized).text).replace(/[\p{Cf}\u0080-\u009f]/gu, "");
12
+ }
13
+
14
+ const isStringArray = (value: unknown): value is string[] =>
15
+ Array.isArray(value) && value.every((entry) => typeof entry === "string");
16
+
17
+ function reportString(value: unknown): string | null {
18
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
19
+ }
20
+
21
+ export interface PresentedContractAnswer {
22
+ lines: string[];
23
+ footer?: string;
24
+ }
25
+
26
+ function debuggerReport(value: Record<string, unknown>): PresentedContractAnswer | null {
27
+ const diagnosis = reportString(value.diagnosis);
28
+ const reproduction = value.reproduction;
29
+ if (
30
+ diagnosis === null ||
31
+ (reproduction !== "reproduced" && reproduction !== "not-reproduced" && reproduction !== "unknown") ||
32
+ !isStringArray(value.evidence)
33
+ ) {
34
+ return null;
35
+ }
36
+ return {
37
+ lines: [
38
+ diagnosis,
39
+ ...(value.evidence.length === 0 ? ["Evidence: none"] : ["Evidence:", ...value.evidence.map((item) => `- ${item}`)]),
40
+ ],
41
+ footer: `reproduction ${reproduction}`,
42
+ };
43
+ }
44
+
45
+ function verifierReport(value: Record<string, unknown>): PresentedContractAnswer | null {
46
+ if ((value.verdict !== "pass" && value.verdict !== "fail") || !Array.isArray(value.checks)) return null;
47
+ const lines: string[] = [];
48
+ for (const raw of value.checks) {
49
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
50
+ const check = raw as Record<string, unknown>;
51
+ const name = reportString(check.name);
52
+ const evidence = reportString(check.evidence);
53
+ if (name === null || evidence === null || typeof check.passed !== "boolean") return null;
54
+ lines.push(`${check.passed ? GLYPH.ok : GLYPH.error} ${name}: ${evidence}`);
55
+ }
56
+ return { lines: lines.length === 0 ? ["No checks reported."] : lines, footer: `verdict ${value.verdict}` };
57
+ }
58
+
59
+ function researchReport(value: Record<string, unknown>): PresentedContractAnswer | null {
60
+ if ((value.source !== "local" && value.source !== "external") || !Array.isArray(value.findings)) return null;
61
+ const lines: string[] = [];
62
+ for (const raw of value.findings) {
63
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
64
+ const finding = raw as Record<string, unknown>;
65
+ const claim = reportString(finding.claim);
66
+ const evidence = reportString(finding.evidence);
67
+ if (claim === null || evidence === null) return null;
68
+ lines.push(`- ${claim}`, ` citation: ${evidence}`);
69
+ }
70
+ return { lines: lines.length === 0 ? ["No findings reported."] : lines, footer: `source ${value.source}` };
71
+ }
72
+
73
+ function worldKnowledgeReport(value: Record<string, unknown>): PresentedContractAnswer | null {
74
+ if (
75
+ (value.discovery !== "performed" &&
76
+ value.discovery !== "caller-supplied-only" &&
77
+ value.discovery !== "unavailable") ||
78
+ !Array.isArray(value.facts) ||
79
+ !isStringArray(value.synthesis) ||
80
+ !isStringArray(value.uncertainties) ||
81
+ !isStringArray(value.followUpVerification)
82
+ ) {
83
+ return null;
84
+ }
85
+ const lines: string[] = [];
86
+ for (const raw of value.facts) {
87
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
88
+ const fact = raw as Record<string, unknown>;
89
+ const claim = reportString(fact.claim);
90
+ const evidence = reportString(fact.evidence);
91
+ if (claim === null || evidence === null || !isStringArray(fact.sources)) return null;
92
+ lines.push(`- ${claim}`, ` support: ${evidence}`);
93
+ if (fact.sources.length > 0) lines.push(` sources: ${fact.sources.join(", ")}`);
94
+ }
95
+ if (value.synthesis.length > 0) lines.push("Synthesis:", ...value.synthesis.map((item) => `- ${item}`));
96
+ if (value.uncertainties.length > 0) lines.push("Uncertainties:", ...value.uncertainties.map((item) => `- ${item}`));
97
+ if (value.followUpVerification.length > 0) {
98
+ lines.push("Verify next:", ...value.followUpVerification.map((item) => `- ${item}`));
99
+ }
100
+ return {
101
+ lines: lines.length === 0 ? ["No findings reported."] : lines,
102
+ footer: `discovery ${value.discovery}; uncertainties ${value.uncertainties.length}; follow-up ${value.followUpVerification.length}`,
103
+ };
104
+ }
105
+
106
+ function scoutReport(value: Record<string, unknown>): PresentedContractAnswer | null {
107
+ if (!Array.isArray(value.findings) || typeof value.needsSplit !== "boolean") return null;
108
+ const lines: string[] = [];
109
+ for (const raw of value.findings) {
110
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
111
+ const finding = raw as Record<string, unknown>;
112
+ const claim = reportString(finding.claim);
113
+ if (claim === null) return null;
114
+ const path = reportString(finding.path);
115
+ const line = typeof finding.line === "number" && Number.isSafeInteger(finding.line) ? finding.line : null;
116
+ lines.push(path !== null && line !== null ? `- ${claim} — ${path}:${line}` : `- ${claim} (ungrounded lead)`);
117
+ }
118
+ if (value.needsSplit) {
119
+ if (!Array.isArray(value.proposedSubtasks)) return null;
120
+ lines.push("Split recommended:");
121
+ for (const raw of value.proposedSubtasks) {
122
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
123
+ const subtask = raw as Record<string, unknown>;
124
+ const task = reportString(subtask.task);
125
+ const id = reportString(subtask.id);
126
+ if (task === null || id === null) return null;
127
+ lines.push(`- ${id}: ${task}`);
128
+ }
129
+ }
130
+ return {
131
+ lines: lines.length === 0 ? ["No findings reported."] : lines,
132
+ footer: value.needsSplit ? "split needed" : "no split needed",
133
+ };
134
+ }
135
+
136
+ function isObject(value: unknown): value is Record<string, unknown> {
137
+ return typeof value === "object" && value !== null && !Array.isArray(value);
138
+ }
139
+
140
+ /** Only a whole object, optionally enclosed by one whole code fence, is a preview payload. */
141
+ export function exactWorkerAnswerObject(text: string): Record<string, unknown> | null {
142
+ const trimmed = text.trim();
143
+ const fenced = /^```[A-Za-z0-9_-]*[^\S\r\n]*\r?\n([\s\S]*?)\r?\n```$/u.exec(trimmed);
144
+ const source = fenced?.[1] ?? trimmed;
145
+ try {
146
+ const value: unknown = JSON.parse(source);
147
+ return isObject(value) ? value : null;
148
+ } catch {
149
+ return null;
150
+ }
151
+ }
152
+
153
+ /** Receipt identity and conformance are facts supplied by the caller, never inferred here. */
154
+ export function presentWorkerContractAnswer(
155
+ text: string,
156
+ contract: { kind: string; conformance: string } | undefined,
157
+ complete: boolean,
158
+ settled: boolean,
159
+ ): PresentedContractAnswer | null {
160
+ if (!settled || !complete || contract?.conformance !== "pass") return null;
161
+ const value = exactWorkerAnswerObject(text);
162
+ if (value === null) return null;
163
+ // Match complete JSON strings before numbers, so escaped property names
164
+ // and digits inside strings cannot bypass or confuse the token check.
165
+ // Conservatively keep raw Scout source if any number cannot round-trip.
166
+ if (contract.kind === "scout-report") {
167
+ for (const match of text.matchAll(/"(?:[^"\\]|\\[\s\S])*"|-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/gu)) {
168
+ const token = match[0];
169
+ if (token.startsWith('"')) continue;
170
+ if (!Number.isSafeInteger(Number(token)) || String(Number(token)) !== token) return null;
171
+ }
172
+ }
173
+ let answer: PresentedContractAnswer | null;
174
+ switch (contract.kind) {
175
+ case "debugger-report":
176
+ answer = debuggerReport(value);
177
+ break;
178
+ case "verifier-report":
179
+ answer = verifierReport(value);
180
+ break;
181
+ case "research-report":
182
+ answer = researchReport(value);
183
+ break;
184
+ case "world-knowledge-report":
185
+ answer = worldKnowledgeReport(value);
186
+ break;
187
+ case "scout-report":
188
+ answer = scoutReport(value);
189
+ break;
190
+ default:
191
+ return null;
192
+ }
193
+ if (answer === null) return null;
194
+ return {
195
+ lines: answer.lines.map(safeWorkerAnswerText),
196
+ ...(answer.footer ? { footer: safeWorkerAnswerText(answer.footer) } : {}),
197
+ };
198
+ }
@@ -2,19 +2,21 @@ import { redactSecretString } from "../../domains/safety/redaction.js";
2
2
  import type { TranscriptDetailPolicy } from "../transcript-detail.js";
3
3
  import { transcriptDetail } from "../transcript-detail.js";
4
4
  import { previewBudget, previewRows } from "./preview.js";
5
+ import {
6
+ exactWorkerAnswerObject,
7
+ type PresentedContractAnswer,
8
+ presentWorkerContractAnswer,
9
+ safeWorkerAnswerText,
10
+ } from "./worker-answer.js";
11
+
5
12
  /** Bounded worker summaries share the main transcript's output style. */
6
13
 
7
- import { parseJsonObjectPayload } from "../../core/json-payload.js";
8
14
  import { trustStateWord } from "../../domains/evidence/trust-projection.js";
15
+ import { retiredIntegrityVersionOf } from "../../domains/evidence/trust-status.js";
9
16
  import { truncateToWidth, visibleWidth, wrapTextWithAnsi } from "../../engine/tui.js";
10
17
  import { formatFooterTokens } from "../footer-panel.js";
11
18
  import { type ClioToken, clioTheme, fitUnits, formatCompactMs, GLYPH } from "../theme/index.js";
12
- import {
13
- type WorkerEntryState,
14
- type WorkerPresentedResultContract,
15
- type WorkerReceiptSummary,
16
- workerAskedByModel,
17
- } from "../worker-stream.js";
19
+ import { type WorkerEntryState, type WorkerReceiptSummary, workerAskedByModel } from "../worker-stream.js";
18
20
 
19
21
  const theme = clioTheme();
20
22
  const dim = (text: string): string => theme.fg("dim", text);
@@ -88,7 +90,11 @@ const CHECKPOINT_PREFIX = /^\s*(?:needs_input\b|task_blocked\b|##\s*CHECKPOINT R
88
90
  const CHECKPOINT_PREVIEW_ROWS = 16;
89
91
 
90
92
  export function workerNeedsInput(entry: Pick<WorkerEntryState, "text" | "receipt">): boolean {
91
- return entry.receipt !== undefined && entry.receipt.stillRunning !== true && CHECKPOINT_PREFIX.test(entry.text);
93
+ return (
94
+ entry.receipt !== undefined &&
95
+ entry.receipt.stillRunning !== true &&
96
+ CHECKPOINT_PREFIX.test(entry.text.trim().replace(/^```[A-Za-z0-9_-]*[^\S\r\n]*\r?\n/u, ""))
97
+ );
92
98
  }
93
99
 
94
100
  function needsInputUnit(): string {
@@ -144,152 +150,21 @@ function railLines(text: string, token: ClioToken, width: number): string[] {
144
150
  return wrapTextWithAnsi(text, contentWidth).map((row) => `${dim(RAIL)}${theme.fg(token, row)}`);
145
151
  }
146
152
 
147
- /** A worker's terminal JSON payload, using the same tolerant reader as its result contract. */
148
- function structuredAnswer(text: string): Record<string, unknown> | null {
149
- const parsed = parseJsonObjectPayload(text);
150
- return parsed.ok ? parsed.value : null;
153
+ function presentedContractAnswer(entry: WorkerEntryState): PresentedContractAnswer | null {
154
+ if (entry.receipt?.trust?.artifactIntegrity.state !== "verified") return null;
155
+ const kind = entry.receipt?.contractKind;
156
+ const conformance = entry.receipt?.contract;
157
+ return presentWorkerContractAnswer(
158
+ entry.text,
159
+ kind && conformance ? { kind, conformance } : undefined,
160
+ entry.droppedLines === 0 && (entry.progress?.droppedBytes ?? 0) === 0,
161
+ !entry.pending && !isPending(entry),
162
+ );
151
163
  }
152
164
 
153
165
  const isStringArray = (value: unknown): value is string[] =>
154
166
  Array.isArray(value) && value.every((entry) => typeof entry === "string");
155
167
 
156
- function reportString(value: unknown): string | null {
157
- return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
158
- }
159
-
160
- interface PresentedContractAnswer {
161
- lines: string[];
162
- footer?: string;
163
- }
164
-
165
- function debuggerReport(value: Record<string, unknown>): PresentedContractAnswer | null {
166
- const diagnosis = reportString(value.diagnosis);
167
- const reproduction = value.reproduction;
168
- if (
169
- diagnosis === null ||
170
- (reproduction !== "reproduced" && reproduction !== "not-reproduced" && reproduction !== "unknown") ||
171
- !isStringArray(value.evidence)
172
- ) {
173
- return null;
174
- }
175
- return {
176
- lines: [
177
- diagnosis,
178
- ...(value.evidence.length === 0 ? ["Evidence: none"] : ["Evidence:", ...value.evidence.map((item) => `- ${item}`)]),
179
- ],
180
- footer: `reproduction ${reproduction}`,
181
- };
182
- }
183
-
184
- function verifierReport(value: Record<string, unknown>): PresentedContractAnswer | null {
185
- if ((value.verdict !== "pass" && value.verdict !== "fail") || !Array.isArray(value.checks)) return null;
186
- const lines: string[] = [];
187
- for (const raw of value.checks) {
188
- if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
189
- const check = raw as Record<string, unknown>;
190
- const name = reportString(check.name);
191
- const evidence = reportString(check.evidence);
192
- if (name === null || evidence === null || typeof check.passed !== "boolean") return null;
193
- lines.push(`${check.passed ? GLYPH.ok : GLYPH.error} ${name}: ${evidence}`);
194
- }
195
- return { lines: lines.length === 0 ? ["No checks reported."] : lines, footer: `verdict ${value.verdict}` };
196
- }
197
-
198
- function researchReport(value: Record<string, unknown>): PresentedContractAnswer | null {
199
- if ((value.source !== "local" && value.source !== "external") || !Array.isArray(value.findings)) return null;
200
- const lines: string[] = [];
201
- for (const raw of value.findings) {
202
- if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
203
- const finding = raw as Record<string, unknown>;
204
- const claim = reportString(finding.claim);
205
- const evidence = reportString(finding.evidence);
206
- if (claim === null || evidence === null) return null;
207
- lines.push(`- ${claim}`, ` citation: ${evidence}`);
208
- }
209
- return { lines: lines.length === 0 ? ["No findings reported."] : lines, footer: `source ${value.source}` };
210
- }
211
-
212
- function worldKnowledgeReport(value: Record<string, unknown>): PresentedContractAnswer | null {
213
- if (
214
- (value.discovery !== "performed" &&
215
- value.discovery !== "caller-supplied-only" &&
216
- value.discovery !== "unavailable") ||
217
- !Array.isArray(value.facts) ||
218
- !isStringArray(value.synthesis) ||
219
- !isStringArray(value.uncertainties) ||
220
- !isStringArray(value.followUpVerification)
221
- ) {
222
- return null;
223
- }
224
- const lines: string[] = [];
225
- for (const raw of value.facts) {
226
- if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
227
- const fact = raw as Record<string, unknown>;
228
- const claim = reportString(fact.claim);
229
- const evidence = reportString(fact.evidence);
230
- if (claim === null || evidence === null || !isStringArray(fact.sources)) return null;
231
- lines.push(`- ${claim}`, ` support: ${evidence}`);
232
- if (fact.sources.length > 0) lines.push(` sources: ${fact.sources.join(", ")}`);
233
- }
234
- if (value.synthesis.length > 0) lines.push("Synthesis:", ...value.synthesis.map((item) => `- ${item}`));
235
- if (value.uncertainties.length > 0) lines.push("Uncertainties:", ...value.uncertainties.map((item) => `- ${item}`));
236
- if (value.followUpVerification.length > 0) {
237
- lines.push("Verify next:", ...value.followUpVerification.map((item) => `- ${item}`));
238
- }
239
- return { lines: lines.length === 0 ? ["No findings reported."] : lines, footer: `discovery ${value.discovery}` };
240
- }
241
-
242
- function scoutReport(value: Record<string, unknown>): PresentedContractAnswer | null {
243
- if (!Array.isArray(value.findings) || typeof value.needsSplit !== "boolean") return null;
244
- const lines: string[] = [];
245
- for (const raw of value.findings) {
246
- if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
247
- const finding = raw as Record<string, unknown>;
248
- const claim = reportString(finding.claim);
249
- if (claim === null) return null;
250
- const path = reportString(finding.path);
251
- const line = typeof finding.line === "number" && Number.isSafeInteger(finding.line) ? finding.line : null;
252
- lines.push(path !== null && line !== null ? `- ${claim} — ${path}:${line}` : `- ${claim} (ungrounded lead)`);
253
- }
254
- if (value.needsSplit) {
255
- if (!Array.isArray(value.proposedSubtasks)) return null;
256
- lines.push("Split recommended:");
257
- for (const raw of value.proposedSubtasks) {
258
- if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
259
- const subtask = raw as Record<string, unknown>;
260
- const task = reportString(subtask.task);
261
- const id = reportString(subtask.id);
262
- if (task === null || id === null) return null;
263
- lines.push(`- ${id}: ${task}`);
264
- }
265
- }
266
- return {
267
- lines: lines.length === 0 ? ["No findings reported."] : lines,
268
- footer: value.needsSplit ? "split needed" : "no split needed",
269
- };
270
- }
271
-
272
- function presentedContractAnswer(entry: WorkerEntryState): PresentedContractAnswer | null {
273
- if (entry.receipt?.contract !== "pass" || entry.receipt.contractKind === undefined || entry.droppedLines !== 0) {
274
- return null;
275
- }
276
- const value = structuredAnswer(entry.text);
277
- if (value === null) return null;
278
- const kind: WorkerPresentedResultContract = entry.receipt.contractKind;
279
- switch (kind) {
280
- case "debugger-report":
281
- return debuggerReport(value);
282
- case "verifier-report":
283
- return verifierReport(value);
284
- case "research-report":
285
- return researchReport(value);
286
- case "world-knowledge-report":
287
- return worldKnowledgeReport(value);
288
- case "scout-report":
289
- return scoutReport(value);
290
- }
291
- }
292
-
293
168
  /**
294
169
  * A mutation report as prose: the paths it changed, each validation with its
295
170
  * verdict and evidence, then the summary and commit line. Null when the object
@@ -317,16 +192,23 @@ function mutationReportLines(value: Record<string, unknown>): string[] | null {
317
192
 
318
193
  /**
319
194
  * The body's source lines. A structured answer (a result-contract JSON object)
320
- * never reaches the rail raw: a mutation report reads as prose, and any other
321
- * object is pretty-printed so its keys line up instead of wrapping mid-string.
195
+ * uses its receipt identity for a readable preview. Unknown objects retain
196
+ * their original numeric source tokens instead of being parsed and reserialized.
322
197
  * Truncated text is not one object and passes through as the prose it is.
323
198
  */
324
199
  function bodySourceLines(entry: WorkerEntryState): string[] {
325
- const structured = entry.droppedLines === 0 ? structuredAnswer(entry.text) : null;
326
- if (structured === null) return entry.text.split("\n");
200
+ if (
201
+ entry.pending ||
202
+ entry.receipt?.trust?.artifactIntegrity.state !== "verified" ||
203
+ entry.droppedLines !== 0 ||
204
+ (entry.progress?.droppedBytes ?? 0) !== 0
205
+ )
206
+ return safeWorkerAnswerText(entry.text).split("\n");
207
+ const structured = entry.droppedLines === 0 ? exactWorkerAnswerObject(entry.text) : null;
208
+ if (structured === null) return safeWorkerAnswerText(entry.text).split("\n");
327
209
  const presented = presentedContractAnswer(entry);
328
210
  if (presented !== null) return presented.lines;
329
- return mutationReportLines(structured) ?? JSON.stringify(structured, null, 2).split("\n");
211
+ return mutationReportLines(structured)?.map(safeWorkerAnswerText) ?? safeWorkerAnswerText(entry.text).split("\n");
330
212
  }
331
213
 
332
214
  function bodyLines(entry: WorkerEntryState, width: number, unbounded: boolean): string[] {
@@ -334,7 +216,7 @@ function bodyLines(entry: WorkerEntryState, width: number, unbounded: boolean):
334
216
  // its first token) gets no rail at all rather than one blank rail row.
335
217
  if (entry.text.length === 0) return [];
336
218
  const contentWidth = Math.max(1, width - RAIL_WIDTH);
337
- const source = bodySourceLines(entry);
219
+ const source = unbounded ? safeWorkerAnswerText(entry.text).split("\n") : bodySourceLines(entry);
338
220
  const capped = unbounded || source.length <= BODY_LINE_LIMIT ? source : source.slice(0, BODY_LINE_LIMIT);
339
221
  const hiddenLines = entry.droppedLines + (source.length - capped.length);
340
222
  const out: string[] = [];
@@ -417,6 +299,15 @@ export function renderWorkerEntryLines(
417
299
  options: WorkerEntryRenderOptions,
418
300
  ): string[] {
419
301
  const safeWidth = Math.max(1, Math.floor(width));
302
+ const integrity = entry.receipt?.trust;
303
+ const provenance =
304
+ isPending(entry) || integrity?.artifactIntegrity.state === "verified"
305
+ ? []
306
+ : railLines(
307
+ `receipt: ${integrity ? (retiredIntegrityVersionOf(integrity.artifactIntegrity) !== null ? "seal retired" : trustStateWord("artifactIntegrity", integrity.artifactIntegrity.state)) : "integrity unavailable"}; raw output, not admitted as evidence`,
308
+ "warning",
309
+ safeWidth,
310
+ );
420
311
  const quality = isPending(entry)
421
312
  ? []
422
313
  : railLines(
@@ -434,6 +325,7 @@ export function renderWorkerEntryLines(
434
325
  ...(tools ? [tools] : []),
435
326
  ...failureLines(entry, safeWidth),
436
327
  footerLine(entry, safeWidth),
328
+ ...provenance,
437
329
  ...quality,
438
330
  ].map(redactSecretString);
439
331
  }
@@ -446,14 +338,15 @@ export function renderWorkerEntryLines(
446
338
  const summary = bodySourceLines(entry).flatMap((line) =>
447
339
  railLines(redactSecretString(line), needsInput ? "warning" : "muted", safeWidth),
448
340
  );
449
- const actions = entry.progress
450
- ? [...entry.progress.recentActions]
451
- .reverse()
452
- .concat(entry.progress.currentAction ? [entry.progress.currentAction] : [])
453
- : [];
454
- const trail = actions.flatMap((action) =>
341
+ // Current work leads the bounded preview; completed calls remain explicitly historical.
342
+ const current = isPending(entry) ? entry.progress?.currentAction : null;
343
+ const actions = [
344
+ ...(current ? [{ action: current, label: "now" }] : []),
345
+ ...(entry.progress?.recentActions ?? []).map((action) => ({ action, label: "last" })),
346
+ ];
347
+ const trail = actions.flatMap(({ action, label }) =>
455
348
  railLines(
456
- `${GLYPH.phaseTool} ${action.descriptor ? `${action.descriptor.verb} ${action.descriptor.object}` : action.tool}`,
349
+ `${GLYPH.phaseTool} ${label}: ${action.descriptor ? `${action.descriptor.verb} ${action.descriptor.object}` : action.tool}`,
457
350
  "muted",
458
351
  safeWidth,
459
352
  ),
@@ -466,7 +359,7 @@ export function renderWorkerEntryLines(
466
359
  ...(detail.workerRows > 0 || needsInput ? previewRows(summary, summaryRows, safeWidth, entry.pending) : []),
467
360
  ...previewRows(attemptLines(entry, safeWidth), budget(detail.errorRows), safeWidth, true),
468
361
  ...(tools ? [tools] : []),
469
- ...(detail.workerActivity ? previewRows(trail, budget(4), safeWidth, true) : []),
362
+ ...(detail.workerActivity ? previewRows(trail, budget(4), safeWidth) : []),
470
363
  ...failure,
471
364
  ...(presented ? railLines(presented, "muted", safeWidth) : []),
472
365
  ...(entry.receipt?.abandonedDetail ? railLines(entry.receipt.abandonedDetail, "warning", safeWidth) : []),
@@ -478,6 +371,7 @@ export function renderWorkerEntryLines(
478
371
  safeWidth,
479
372
  )
480
373
  : []),
374
+ ...provenance,
481
375
  ...quality,
482
376
  ].map(redactSecretString);
483
377
  }
@@ -1,3 +1,4 @@
1
+ import { mcpCommandOutput } from "../cli/mcp.js";
1
2
  import { acceptanceFromTaskFlags } from "../cli/tasks.js";
2
3
  import { BusChannels } from "../core/bus-events.js";
3
4
  import { THINKING_LEVELS } from "../core/defaults.js";
@@ -135,6 +136,7 @@ export interface LibraryBrowseRequest {
135
136
  }
136
137
 
137
138
  type SlashCommandVariant =
139
+ | { kind: "mcp"; argv: string[] }
138
140
  | { kind: "quit" }
139
141
  | { kind: "help"; query?: string }
140
142
  | { kind: "init"; options: InitCommandOptions }
@@ -872,7 +874,7 @@ export interface BuiltinSlashCommand {
872
874
  match?(trimmed: string): SlashCommand | null;
873
875
  fromArgs?(parsed: ParsedArgs, trimmed: string): SlashCommand;
874
876
  /** Execute `command` against `ctx`. Called only for kinds declared in `kinds`. */
875
- handle(command: SlashCommand, ctx: SlashCommandContext): void | "rejected";
877
+ handle(command: SlashCommand, ctx: SlashCommandContext): undefined | "rejected";
876
878
  }
877
879
 
878
880
  const RUN_THINKING_LEVELS: ReadonlyArray<JobThinkingLevel> = THINKING_LEVELS;
@@ -1227,6 +1229,29 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1227
1229
  ctx.openSkillsHub?.({ tab: "prompt" });
1228
1230
  },
1229
1231
  },
1232
+ {
1233
+ name: "mcp",
1234
+ description: "List MCP servers or manage explicit trust with trust <id> [class] and untrust <id>",
1235
+ group: "Inspect",
1236
+ kinds: ["mcp"],
1237
+ args: {
1238
+ positionals: [
1239
+ { name: "action", required: false, values: ["list", "trust", "untrust"] },
1240
+ { name: "id", required: false },
1241
+ { name: "class", required: false },
1242
+ ],
1243
+ },
1244
+ fromArgs(parsed) {
1245
+ if (parsed.error) return { kind: "usage-error", command: "mcp", reason: parsed.error };
1246
+ const [action = "list", id, actionClass] = parsed.positionals;
1247
+ return { kind: "mcp", argv: [action, ...(id ? [id] : []), ...(actionClass ? ["--action-class", actionClass] : [])] };
1248
+ },
1249
+ handle(command, ctx) {
1250
+ if (command.kind !== "mcp") return;
1251
+ const result = mcpCommandOutput(command.argv);
1252
+ ctx.notice(result.code ? "error" : "info", result.text);
1253
+ },
1254
+ },
1230
1255
  {
1231
1256
  name: "extensions",
1232
1257
  description: "Inspect harness extensions or reload their commands, hooks and operator UI",
@@ -27,8 +27,8 @@ export interface CommandPositionalSpec {
27
27
  }
28
28
 
29
29
  /**
30
- * Stable grammar/provider seam. Slice 10 names every dynamic noun; slice 11
31
- * supplies read-only implementations for these slots.
30
+ * Stable names for dynamic completion sources. The presentation layer supplies
31
+ * read-only catalogs for available slots; unsupplied slots return no values.
32
32
  */
33
33
  export const COMPLETION_SLOT_NAMES = [
34
34
  "agents",