@iowarp/clio-coder 0.4.7 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (675) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +111 -0
  3. package/CONTRIBUTING.md +83 -74
  4. package/README.md +69 -47
  5. package/dist/{acp-W3Y3TRHD.js → acp-ZWZCPS2A.js} +15 -15
  6. package/dist/{agents-J4ICNLQ3.js → agents-LYSOWZUE.js} +61 -59
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
  9. package/dist/assets/web-notices/hono-LICENSE +21 -0
  10. package/dist/{auth-X2UJUMOC.js → auth-WBQGKWQ5.js} +27 -27
  11. package/dist/background-BUMOBAQN.js +37 -0
  12. package/dist/{builtins-XLXWWSRF.js → builtins-ODRJOEDI.js} +7 -7
  13. package/dist/{chunk-C3G5PNUO.js → chunk-2DRRZ57Q.js} +36 -27
  14. package/dist/chunk-2JBZYUPY.js +105 -0
  15. package/dist/chunk-2KUBKL63.js +336 -0
  16. package/dist/chunk-2VBWFXYE.js +198 -0
  17. package/dist/{chunk-XZ6UFQ52.js → chunk-2X2R3UTH.js} +25 -15
  18. package/dist/{chunk-M6Z2V6YU.js → chunk-37LW32LZ.js} +5 -5
  19. package/dist/{chunk-6LRLOJHQ.js → chunk-3AND2EFU.js} +11 -62
  20. package/dist/{chunk-FQOOGXBH.js → chunk-3RDHGNU7.js} +101 -33
  21. package/dist/{chunk-D2T66PDV.js → chunk-3SUDBGEI.js} +41 -208
  22. package/dist/{chunk-5AJPUR72.js → chunk-3TQN67I2.js} +9 -9
  23. package/dist/{chunk-LBFQMYS3.js → chunk-3U4BL2EV.js} +5 -3
  24. package/dist/{chunk-UFYNOQK4.js → chunk-3UQADNG2.js} +7 -7
  25. package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
  26. package/dist/{chunk-NO7J45X6.js → chunk-4ATBOFRP.js} +713 -218
  27. package/dist/{chunk-ECOMVOHP.js → chunk-4DNL43EZ.js} +3 -3
  28. package/dist/{chunk-WT5TRMO4.js → chunk-4HFJKRGZ.js} +255 -82
  29. package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
  30. package/dist/{chunk-WURGVOZJ.js → chunk-5RTEFNBP.js} +18 -14
  31. package/dist/{config-YXARKGTX.js → chunk-64XJW7NT.js} +24 -268
  32. package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
  33. package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
  34. package/dist/{chunk-MZNWZUJM.js → chunk-7FBCRWVT.js} +288 -288
  35. package/dist/{chunk-UA6W4XFJ.js → chunk-7JSOSVLP.js} +2 -2
  36. package/dist/chunk-7N3OLLSL.js +637 -0
  37. package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
  38. package/dist/{chunk-N37QC5FV.js → chunk-A6DULIMH.js} +21 -9
  39. package/dist/{fleet-decisions-S3PTZV2D.js → chunk-AB3QXXBC.js} +5 -41
  40. package/dist/chunk-ACCECAH4.js +49 -0
  41. package/dist/{chunk-CP3HIR5H.js → chunk-AM6CEP2K.js} +20 -19
  42. package/dist/chunk-AUHVBIDW.js +19 -0
  43. package/dist/{chunk-BQQ5MXUC.js → chunk-AY4XE6GN.js} +19 -13
  44. package/dist/{chunk-ISNCCX42.js → chunk-BBA2TAWV.js} +10 -9
  45. package/dist/chunk-BFPHMSK7.js +169 -0
  46. package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
  47. package/dist/{chunk-DO7M3LSX.js → chunk-BMNVVKEW.js} +40 -93
  48. package/dist/{chunk-VTYHHQ57.js → chunk-CTGZCEI6.js} +2 -2
  49. package/dist/{chunk-RTLNFZMD.js → chunk-DIAJYJYG.js} +3 -3
  50. package/dist/chunk-EHZRAB4U.js +63 -0
  51. package/dist/{chunk-KS7ETA3P.js → chunk-EM2DIQAJ.js} +3 -3
  52. package/dist/{chunk-MNQN3X6Y.js → chunk-ETF4ROKH.js} +5 -5
  53. package/dist/{chunk-WN552PKN.js → chunk-F2YM3JY4.js} +744 -1134
  54. package/dist/{chunk-7EEGBKV4.js → chunk-FEBQWHJT.js} +24 -19
  55. package/dist/{chunk-4QKAITQT.js → chunk-FPS4R2RN.js} +74 -10
  56. package/dist/chunk-G5R53COU.js +68 -0
  57. package/dist/chunk-GHXGMFQ5.js +40 -0
  58. package/dist/{chunk-GFQ7P2UF.js → chunk-GJDRMBDI.js} +10 -10
  59. package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
  60. package/dist/{chunk-NCCQ6DVS.js → chunk-GREYLTZ5.js} +8 -8
  61. package/dist/{chunk-HOX4YZ2K.js → chunk-H2WSCZZT.js} +19 -3
  62. package/dist/{chunk-3LXJOICS.js → chunk-H6IUCY6Q.js} +2 -2
  63. package/dist/{chunk-BO4XV5VX.js → chunk-H72DCH3E.js} +95 -206
  64. package/dist/{chunk-SEDI5K5B.js → chunk-H7TXJR23.js} +20 -20
  65. package/dist/chunk-HBJQQTKM.js +40 -0
  66. package/dist/chunk-HCVKSGNZ.js +990 -0
  67. package/dist/chunk-HVCAY2FH.js +67 -0
  68. package/dist/{chunk-34XHRVKG.js → chunk-I47EJPYL.js} +3 -3
  69. package/dist/{chunk-4N2RZ4TO.js → chunk-IALGWTLO.js} +3 -3
  70. package/dist/{chunk-IQCNVLO6.js → chunk-IALZJE37.js} +10 -7
  71. package/dist/{chunk-DLIYANB7.js → chunk-IC7JXLOM.js} +16 -11
  72. package/dist/{chunk-G4LGUTOE.js → chunk-IOSVTTCD.js} +5 -5
  73. package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
  74. package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
  75. package/dist/{chunk-TN5FW4XY.js → chunk-JIYWMQZ5.js} +12 -9
  76. package/dist/{chunk-T7QQBNLH.js → chunk-JKU34ACI.js} +10 -8
  77. package/dist/chunk-JOBN2YQQ.js +176 -0
  78. package/dist/chunk-JOL2QRLE.js +152 -0
  79. package/dist/{chunk-GXIWHXDB.js → chunk-JTR3VSV3.js} +3 -3
  80. package/dist/{chunk-T334FW2H.js → chunk-JU6MAMRJ.js} +7 -7
  81. package/dist/chunk-JURMQWVJ.js +15 -0
  82. package/dist/{chunk-CULVKYTK.js → chunk-K3XN4LZ4.js} +5 -5
  83. package/dist/{chunk-3T4DXWP6.js → chunk-KIVFXGBM.js} +27 -7
  84. package/dist/chunk-KKRXONXG.js +43 -0
  85. package/dist/{chunk-YPRSNUTC.js → chunk-KOAHT3N2.js} +2 -2
  86. package/dist/chunk-KP5BPXR3.js +73 -0
  87. package/dist/{chunk-UA3W4FGC.js → chunk-KRJQG47M.js} +6 -6
  88. package/dist/{chunk-GI5RRMAH.js → chunk-KW6OJ7IY.js} +19 -21
  89. package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
  90. package/dist/{chunk-MZHXENL7.js → chunk-L4RUTLRL.js} +8 -8
  91. package/dist/{chunk-P5SC4DLJ.js → chunk-LGTVWPRN.js} +2 -2
  92. package/dist/{chunk-65BGHOUR.js → chunk-LSQW6KZO.js} +5 -5
  93. package/dist/{chunk-TZHN5ITX.js → chunk-LWJYOHT3.js} +8 -8
  94. package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
  95. package/dist/chunk-MJ4QEJVT.js +185 -0
  96. package/dist/{chunk-T4TY5GG3.js → chunk-MO65K5CH.js} +5 -5
  97. package/dist/{chunk-TZ6UVP2H.js → chunk-MTOZEQHL.js} +8 -8
  98. package/dist/chunk-MZDPF35R.js +45 -0
  99. package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
  100. package/dist/{chunk-KAFMW7WM.js → chunk-NBPA5QM6.js} +2 -2
  101. package/dist/{chunk-EUEXGXXR.js → chunk-NMBEW4PP.js} +5 -5
  102. package/dist/{chunk-SELG4SUR.js → chunk-NPLLK3HO.js} +72 -89
  103. package/dist/{chunk-VCRVEDUC.js → chunk-NSYGPIVW.js} +5 -5
  104. package/dist/{context-7HJEWTTP.js → chunk-NXTV5OI5.js} +36 -90
  105. package/dist/{chunk-IMOD2YPV.js → chunk-NYDG4QP4.js} +9 -19
  106. package/dist/{chunk-6CA2BHOR.js → chunk-OA2GDACN.js} +5 -5
  107. package/dist/{chunk-A67NR5AT.js → chunk-PJI57EC6.js} +14 -11
  108. package/dist/{chunk-IJMW64DX.js → chunk-PJJBUGMR.js} +50 -50
  109. package/dist/{chunk-CPXGJI2A.js → chunk-PNJE7JPS.js} +20 -5
  110. package/dist/chunk-PP23PZEV.js +1347 -0
  111. package/dist/chunk-PPIFDSBK.js +409 -0
  112. package/dist/{chunk-T52TPHYC.js → chunk-PTFISXQO.js} +8 -7
  113. package/dist/{chunk-C6GEXX4L.js → chunk-QB33Z5S7.js} +5 -5
  114. package/dist/{chunk-VMATUZB6.js → chunk-QGNII5VC.js} +10 -10
  115. package/dist/{chunk-TLTGZTXI.js → chunk-QI72X67S.js} +104 -27
  116. package/dist/chunk-QKHZZFKH.js +98 -0
  117. package/dist/{chunk-PFLOULP3.js → chunk-RDKX2PME.js} +4 -4
  118. package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
  119. package/dist/chunk-RPMNIFRY.js +65 -0
  120. package/dist/{chunk-L3Z5ANCV.js → chunk-RQROVOV3.js} +13 -11
  121. package/dist/{chunk-6YHPAAZR.js → chunk-S34A7BSP.js} +3 -3
  122. package/dist/{chunk-5ZSZEYJK.js → chunk-SJETVJHX.js} +2 -2
  123. package/dist/{chunk-77CZRFTE.js → chunk-SJMNU4ZS.js} +2 -2
  124. package/dist/chunk-SLLG2G44.js +85 -0
  125. package/dist/{chunk-GVZFCJHE.js → chunk-SQAZN2V3.js} +48 -22
  126. package/dist/{chunk-2O2LVQQK.js → chunk-SQBT46OF.js} +2 -2
  127. package/dist/{chunk-ZGIGW4ZG.js → chunk-TCUOGIL2.js} +5 -5
  128. package/dist/{chunk-DACXIVVF.js → chunk-TIWPKCVO.js} +5 -5
  129. package/dist/{chunk-5CMARGPF.js → chunk-UIU7MGZ3.js} +11 -2
  130. package/dist/chunk-USBBEKHW.js +177 -0
  131. package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
  132. package/dist/{chunk-MBJO5VNZ.js → chunk-VPWGADBG.js} +33 -33
  133. package/dist/{chunk-UUQ5G6EZ.js → chunk-VWFCAK34.js} +6 -6
  134. package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
  135. package/dist/{chunk-4MFBBY2Z.js → chunk-W72LLZAV.js} +3 -3
  136. package/dist/{chunk-4UHVS5T7.js → chunk-WGRDABW7.js} +8 -8
  137. package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
  138. package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
  139. package/dist/{chunk-6YA46L5A.js → chunk-XFLSL7BT.js} +2 -2
  140. package/dist/{chunk-QKWL7SYE.js → chunk-XJZEDCNT.js} +50 -39
  141. package/dist/{chunk-UWD3JD5X.js → chunk-XLLEL3K7.js} +10 -10
  142. package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
  143. package/dist/chunk-XNZWWDC3.js +686 -0
  144. package/dist/{chunk-WBVKKTUT.js → chunk-XRECG65F.js} +2 -2
  145. package/dist/chunk-XTQ7MEJG.js +457 -0
  146. package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
  147. package/dist/{chunk-WB7POC6M.js → chunk-Y3M2T5RO.js} +6 -6
  148. package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
  149. package/dist/{chunk-EUZRMP4Y.js → chunk-YPQOPFP7.js} +20 -20
  150. package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
  151. package/dist/{chunk-BAU36233.js → chunk-YQYINEJI.js} +9 -9
  152. package/dist/{chunk-CE64C5K5.js → chunk-ZF6CV4WZ.js} +1356 -235
  153. package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
  154. package/dist/{chunk-IZYTT3CD.js → chunk-ZKQ63XZ5.js} +16 -39
  155. package/dist/{chunk-6TAATXXH.js → chunk-ZKVMDNAN.js} +7 -7
  156. package/dist/chunk-ZST3FRCV.js +132 -0
  157. package/dist/cli/index.js +50 -38
  158. package/dist/{clio-L2P7S2R2.js → clio-JUDCLNHC.js} +11 -11
  159. package/dist/clio-context-tools-FT672MNZ.js +136 -0
  160. package/dist/{code-nav-B5LNX4KU.js → code-nav-7OVCTP2Z.js} +39 -37
  161. package/dist/{components-63MMQKUT.js → components-OZXZMDWU.js} +11 -11
  162. package/dist/config-P3ZQVF63.js +275 -0
  163. package/dist/config-graph-GKAOBAS5.js +160 -0
  164. package/dist/{configure-LMVQJ46J.js → configure-25LRYZJG.js} +56 -55
  165. package/dist/context-72VQV7JX.js +73 -0
  166. package/dist/{context-YG2LZDYZ.js → context-COWRWXP3.js} +89 -83
  167. package/dist/{context-XSZKKFBW.js → context-WB3D474G.js} +16 -16
  168. package/dist/{context-clear-AC5NXHM2.js → context-clear-Y4LYMWC6.js} +88 -82
  169. package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
  170. package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
  171. package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-TMZYVC7A.js} +27 -25
  172. package/dist/data-tool-KMBWKKWR.js +2987 -0
  173. package/dist/{detail-H73BEF2N.js → detail-4GLROGY5.js} +89 -83
  174. package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-TR3LBP5P.js} +113 -107
  175. package/dist/docs-ZK777W2G.js +101 -0
  176. package/dist/{doctor-EQYJOGUG.js → doctor-WC4OV2OB.js} +76 -73
  177. package/dist/{eval-4P7O6CCE.js → eval-FUNWJNUJ.js} +88 -73
  178. package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
  179. package/dist/evals-L73EBHSU.js +104 -0
  180. package/dist/{evidence-O76QF7TZ.js → evidence-AVJ2RTHX.js} +99 -93
  181. package/dist/{evidence-D6GUSYJW.js → evidence-P4NZOAK7.js} +88 -82
  182. package/dist/evidence-Y55WKYHH.js +246 -0
  183. package/dist/{evolve-H47BCETS.js → evolve-MAWKRYWF.js} +93 -87
  184. package/dist/{extensions-NNL3ZOCU.js → extensions-PYQH3H47.js} +14 -13
  185. package/dist/fleet-M4H2QBWT.js +268 -0
  186. package/dist/{fleet-KMNS6NOM.js → fleet-ULBXXRDR.js} +146 -138
  187. package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-7NNC4JZU.js} +18 -17
  188. package/dist/fleet-decisions-EHEY7KPU.js +52 -0
  189. package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-LQ2AHZT3.js} +24 -24
  190. package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-5IGBIIYZ.js} +98 -258
  191. package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-UTTNOKMG.js} +9 -4
  192. package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-YGILJKA6.js} +29 -29
  193. package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-AUWTCDKR.js} +88 -82
  194. package/dist/{fleet-view-BHJFW26B.js → fleet-view-TGUFCY5A.js} +90 -84
  195. package/dist/{init-XAT5N5YM.js → init-GFN2Z7NF.js} +111 -104
  196. package/dist/install-6PIF6F6W.js +19 -0
  197. package/dist/{interop-FVECHFKG.js → interop-EF5JUWWK.js} +29 -29
  198. package/dist/{inventory-7KFQGLCV.js → inventory-I6VJDDYF.js} +90 -84
  199. package/dist/library-3J5IO2OJ.js +75 -0
  200. package/dist/{library-QAPAO23R.js → library-IJTOFTDS.js} +20 -19
  201. package/dist/{library-NY2XOT75.js → library-Z3KZSHPE.js} +35 -35
  202. package/dist/{library-import-5Y6MAS3R.js → library-import-IMKFLDHX.js} +29 -29
  203. package/dist/{library-inventory-JT6HWITQ.js → library-inventory-CQP5D6GU.js} +21 -21
  204. package/dist/{library-validation-EQUH25DC.js → library-validation-33UTX7AI.js} +19 -19
  205. package/dist/mcp-5FWZKUS6.js +26 -0
  206. package/dist/{memory-DYVTTCP6.js → memory-36CWN67Y.js} +93 -87
  207. package/dist/{models-MASFJ6Y2.js → models-KQ6PQJJQ.js} +57 -56
  208. package/dist/{monitor-YMP4NXJJ.js → monitor-XX6ZD6KC.js} +98 -91
  209. package/dist/{orchestrator-AFQRRTEI.js → orchestrator-SK6HDAOP.js} +1537 -832
  210. package/dist/{panes-NICTHQCV.js → panes-L27QRXUH.js} +14 -14
  211. package/dist/{panes-D3Y2KFG5.js → panes-LXZIWNOZ.js} +4 -4
  212. package/dist/{paths-PSFAUIGO.js → paths-7DJDU4P4.js} +6 -6
  213. package/dist/{preload-5Q7VXRFJ.js → preload-K2TDYI4Y.js} +88 -82
  214. package/dist/{reset-7NKZK7JN.js → reset-73VU3XNT.js} +13 -13
  215. package/dist/{resources-NILSIZAT.js → resources-3BYJYVYL.js} +24 -24
  216. package/dist/{run-BPZGEBZV.js → run-AR7PY6GW.js} +144 -136
  217. package/dist/run-script-H2KUDIII.js +41 -0
  218. package/dist/settings-3VMBMWID.js +72 -0
  219. package/dist/{share-EZ6ERBMH.js → share-HVWH4FPF.js} +30 -30
  220. package/dist/{skills-BTVVNYVM.js → skills-5TYEY75Q.js} +30 -30
  221. package/dist/{skills-eval-UY34MNK7.js → skills-eval-CK3MD63Z.js} +114 -103
  222. package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-KSFYG3I6.js} +24 -24
  223. package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-DMVHML7P.js} +60 -57
  224. package/dist/{steer-2B3EQGFH.js → steer-XCD6V3EW.js} +4 -4
  225. package/dist/{support-L2SOL3IE.js → support-JAZL6VBR.js} +7 -7
  226. package/dist/system-3TDQRMZZ.js +116 -0
  227. package/dist/{targets-44VKGFLN.js → targets-EZKHAYRN.js} +74 -72
  228. package/dist/{tasks-3KODKFU7.js → tasks-SNEFHWYW.js} +18 -18
  229. package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-BNLFA4OF.js} +8 -7
  230. package/dist/{tools-3UB7TEVR.js → tools-7IM6BDCE.js} +12 -12
  231. package/dist/{trace-TAMIU4OJ.js → trace-C3MBGD4S.js} +16 -65
  232. package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
  233. package/dist/{uninstall-QYVRPEM4.js → uninstall-WWLOSZ42.js} +35 -10
  234. package/dist/{upgrade-7PMKM2JH.js → upgrade-ETK2JNSJ.js} +42 -51
  235. package/dist/{usage-6EQV7EQK.js → usage-S2HOB7BZ.js} +112 -102
  236. package/dist/{verifiers-JLITWSHU.js → verifiers-QDTEVH7R.js} +26 -24
  237. package/dist/{verify-T7NAEVIG.js → verify-SUKUK6XM.js} +16 -15
  238. package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
  239. package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +1 -0
  240. package/dist/web/client/assets/arc-Pry-7G1_.js +1 -0
  241. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
  242. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
  243. package/dist/web/client/assets/array-BifhSqXX.js +1 -0
  244. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  245. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  246. package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +129 -0
  247. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +38 -0
  248. package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
  249. package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  250. package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +62 -0
  251. package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  252. package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +2 -0
  253. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
  254. package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +1 -0
  255. package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
  256. package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +72 -0
  257. package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +1 -0
  258. package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +231 -0
  259. package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  260. package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +1 -0
  261. package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +10 -0
  262. package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +1 -0
  263. package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +1 -0
  264. package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +1 -0
  265. package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +168 -0
  266. package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +88 -0
  267. package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +206 -0
  268. package/dist/web/client/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  269. package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  270. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
  271. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
  272. package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  273. package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  274. package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
  275. package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +1 -0
  276. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +62 -0
  277. package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
  278. package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
  279. package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +4 -0
  280. package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
  281. package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +30 -0
  282. package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +41 -0
  283. package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +3 -0
  284. package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +24 -0
  285. package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +24 -0
  286. package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
  287. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +1 -0
  288. package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +99 -0
  289. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
  290. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
  291. package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
  292. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
  293. package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +1 -0
  294. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +106 -0
  295. package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
  296. package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
  297. package/dist/web/client/assets/index-Dsi52apB.css +1 -0
  298. package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +1 -0
  299. package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +2 -0
  300. package/dist/web/client/assets/init-C-OQMol4.js +1 -0
  301. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +70 -0
  302. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +139 -0
  303. package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +89 -0
  304. package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
  305. package/dist/web/client/assets/line-BIDAcEtX.js +1 -0
  306. package/dist/web/client/assets/linear-SzVmGSw4.js +1 -0
  307. package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +7 -0
  308. package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +44 -0
  309. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +96 -0
  310. package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  311. package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  312. package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  313. package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
  314. package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +1 -0
  315. package/dist/web/client/assets/path-fybaL0A-.js +1 -0
  316. package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +1 -0
  317. package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +1 -0
  318. package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +39 -0
  319. package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
  320. package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
  321. package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
  322. package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
  323. package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
  324. package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
  325. package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
  326. package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
  327. package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
  328. package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
  329. package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
  330. package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
  331. package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
  332. package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
  333. package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
  334. package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
  335. package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
  336. package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
  337. package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
  338. package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
  339. package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
  340. package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
  341. package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
  342. package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
  343. package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
  344. package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
  345. package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
  346. package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
  347. package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
  348. package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
  349. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +7 -0
  350. package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +1 -0
  351. package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +1 -0
  352. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
  353. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
  354. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
  355. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +1 -0
  356. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +84 -0
  357. package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
  358. package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
  359. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +40 -0
  360. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +162 -0
  361. package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  362. package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
  363. package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +1 -0
  364. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
  365. package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +1 -0
  366. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
  367. package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +120 -0
  368. package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +1 -0
  369. package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +1 -0
  370. package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +34 -0
  371. package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +1 -0
  372. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +78 -0
  373. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +7 -0
  374. package/dist/web/client/clio-coder-logo.webp +0 -0
  375. package/dist/web/client/icon-192.png +0 -0
  376. package/dist/web/client/icon-512.png +0 -0
  377. package/dist/web/client/index.html +6 -0
  378. package/dist/web/client/manifest.webmanifest +15 -0
  379. package/dist/web/client/offline.css +55 -0
  380. package/dist/web/client/offline.html +5 -0
  381. package/dist/web/client/offline.js +27 -0
  382. package/dist/web/client/sw.js +34 -0
  383. package/dist/web/ops-worker.js +37 -0
  384. package/dist/web/reads-worker.js +1726 -0
  385. package/dist/web/server.js +8499 -0
  386. package/dist/web-EMGUGGEI.js +13 -0
  387. package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-6BRRVQON.js} +22 -5
  388. package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-XHSJTDOP.js} +120 -113
  389. package/dist/{with-panes-CHFC7HGI.js → with-panes-Z6BTEHMZ.js} +12 -12
  390. package/dist/worker/entry.js +113 -99
  391. package/docs/README.md +28 -27
  392. package/docs/architecture/acp.md +5 -9
  393. package/docs/architecture/alcf-provider.md +0 -3
  394. package/docs/architecture/architecture.md +0 -3
  395. package/docs/architecture/artifact-placement.md +12 -4
  396. package/docs/architecture/artifact-versions.md +0 -3
  397. package/docs/architecture/capacity-and-scheduling.md +0 -3
  398. package/docs/architecture/context-engine.md +0 -3
  399. package/docs/architecture/context-working-set.md +0 -3
  400. package/docs/architecture/dispatch-architecture-rationale.md +0 -3
  401. package/docs/architecture/dispatch-typed-intent.md +0 -3
  402. package/docs/architecture/evidence-and-memory.md +0 -3
  403. package/docs/architecture/library.md +1 -3
  404. package/docs/architecture/middleware-and-components.md +0 -3
  405. package/docs/architecture/model-catalog.md +1 -4
  406. package/docs/architecture/observability.md +0 -3
  407. package/docs/architecture/pi-boundary.md +6 -9
  408. package/docs/architecture/prompt-envelope-and-tools.md +37 -30
  409. package/docs/architecture/provider-adapter-cookbook.md +1 -4
  410. package/docs/architecture/safety-model.md +19 -9
  411. package/docs/architecture/session-lifecycle.md +10 -7
  412. package/docs/architecture/time-conventions.md +0 -3
  413. package/docs/architecture/trace-store.md +28 -20
  414. package/docs/architecture/tui-design.md +38 -18
  415. package/docs/architecture/worker-context.md +1 -3
  416. package/docs/architecture/worker-dispatch-mechanics.md +1 -4
  417. package/docs/guide/authoring-plugins.md +1 -3
  418. package/docs/guide/built-in-agents.md +0 -3
  419. package/docs/guide/commands-and-modes.md +41 -25
  420. package/docs/guide/configuration-and-targets.md +204 -9
  421. package/docs/guide/configuration-reference.md +125 -17
  422. package/docs/guide/environment-variables.md +2 -8
  423. package/docs/guide/exit-codes-and-output.md +0 -3
  424. package/docs/guide/extensions-and-sharing.md +0 -3
  425. package/docs/guide/fleet-dispatch.md +3 -5
  426. package/docs/guide/glossary.md +1 -4
  427. package/docs/guide/harness-extensions.md +0 -2
  428. package/docs/guide/installation-and-lifecycle.md +3 -6
  429. package/docs/guide/interop.md +0 -2
  430. package/docs/guide/panes-and-files.md +0 -3
  431. package/docs/guide/plugins.md +0 -3
  432. package/docs/guide/proactive-memory.md +0 -3
  433. package/docs/guide/resource-library.md +1 -3
  434. package/docs/guide/skills-marketplace.md +0 -2
  435. package/docs/guide/tool-usage.md +166 -67
  436. package/docs/guide/troubleshooting.md +1 -4
  437. package/docs/history/config-knobs-audit.md +0 -3
  438. package/docs/history/release-cut-checklist.md +0 -3
  439. package/docs/process/development-pipeline.md +0 -3
  440. package/docs/process/documentation-coverage.md +3 -3
  441. package/docs/process/documentation-guide.md +16 -22
  442. package/docs/process/eval-runner.md +0 -3
  443. package/docs/process/evals-internal.md +0 -3
  444. package/docs/process/evolution.md +0 -3
  445. package/docs/process/fleet-demo-runbook.md +6 -9
  446. package/docs/process/git-commit-provenance.md +0 -3
  447. package/docs/process/performance-methodology.md +1 -4
  448. package/docs/process/release-cut-checklist.md +114 -221
  449. package/docs/process/scientific-validation.md +23 -6
  450. package/docs/process/tool-audit-v0.4.9.md +357 -0
  451. package/library/registry.yaml +2 -2
  452. package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
  453. package/library/skills/meta/clio-coder-test/evals.md +16 -2
  454. package/library/skills/meta/clio-coder-test/plugin.json +1 -1
  455. package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
  456. package/library/skills/registry.yaml +2 -2
  457. package/library/skills/skill-marketplace.json +1 -1
  458. package/package.json +13 -11
  459. package/src/cli/argv.ts +31 -0
  460. package/src/cli/clio.ts +17 -13
  461. package/src/cli/config.ts +4 -0
  462. package/src/cli/docs.ts +65 -328
  463. package/src/cli/doctor-panes.ts +1 -1
  464. package/src/cli/doctor.ts +3 -1
  465. package/src/cli/index.ts +17 -2
  466. package/src/cli/mcp.ts +106 -0
  467. package/src/cli/skills-eval.ts +8 -2
  468. package/src/cli/trace.ts +4 -65
  469. package/src/cli/uninstall.ts +26 -0
  470. package/src/cli/upgrade.ts +34 -38
  471. package/src/cli/usage.ts +3 -0
  472. package/src/cli/verifiers.ts +1 -1
  473. package/src/cli/web.ts +79 -0
  474. package/src/core/bash-exec.ts +27 -4
  475. package/src/core/bus-events.ts +3 -4
  476. package/src/core/config.ts +73 -1
  477. package/src/core/defaults.ts +10 -1
  478. package/src/core/domain-loader.ts +37 -28
  479. package/src/core/event-bus.ts +1 -1
  480. package/src/core/run-records.ts +438 -0
  481. package/src/core/safe-exec.ts +506 -56
  482. package/src/core/skill-activation.ts +5 -3
  483. package/src/core/termination.ts +16 -12
  484. package/src/core/tool-names.ts +33 -12
  485. package/src/domains/agents/contract.ts +1 -1
  486. package/src/domains/agents/extension.ts +18 -10
  487. package/src/domains/config/extension.ts +5 -4
  488. package/src/domains/context/clio-md.ts +1 -1
  489. package/src/domains/context/worker/pressure.ts +6 -2
  490. package/src/domains/context/working-set/path-index.ts +7 -2
  491. package/src/domains/dispatch/code-step.ts +7 -2
  492. package/src/domains/dispatch/contract.ts +7 -0
  493. package/src/domains/dispatch/execution-role.ts +3 -3
  494. package/src/domains/dispatch/execution-scheduler.ts +204 -79
  495. package/src/domains/dispatch/extension.ts +206 -26
  496. package/src/domains/dispatch/fleet-preflight.ts +18 -3
  497. package/src/domains/dispatch/fleet-run.ts +1 -0
  498. package/src/domains/dispatch/gate-decisions.ts +3 -3
  499. package/src/domains/dispatch/heartbeat.ts +1 -1
  500. package/src/domains/dispatch/host-verification.ts +16 -14
  501. package/src/domains/dispatch/index.ts +1 -0
  502. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  503. package/src/domains/dispatch/receipt-findings.ts +3 -4
  504. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  505. package/src/domains/dispatch/reservation-store.ts +7 -9
  506. package/src/domains/dispatch/route-facts.ts +1 -1
  507. package/src/domains/dispatch/state.ts +4 -5
  508. package/src/domains/dispatch/types.ts +3 -1
  509. package/src/domains/eval/metrics/tracked.ts +22 -2
  510. package/src/domains/evidence/build.ts +35 -7
  511. package/src/domains/extensions/operator-runtime.ts +3 -1
  512. package/src/domains/gateway/mcp/client.ts +923 -0
  513. package/src/domains/gateway/mcp/config.ts +456 -0
  514. package/src/domains/gateway/mcp/index.ts +88 -0
  515. package/src/domains/gateway/mcp/protocol.ts +273 -0
  516. package/src/domains/gateway/mcp/trust.ts +263 -0
  517. package/src/domains/lifecycle/doctor.ts +17 -3
  518. package/src/domains/middleware/hooks.ts +2 -2
  519. package/src/domains/mux/contract.ts +5 -9
  520. package/src/domains/mux/detect.ts +1 -1
  521. package/src/domains/mux/extension.ts +1 -1
  522. package/src/domains/mux/protocol.ts +5 -7
  523. package/src/domains/mux/socket-client.ts +3 -3
  524. package/src/domains/observability/accountability.ts +2 -2
  525. package/src/domains/observability/background-memory-usage.ts +3 -0
  526. package/src/domains/observability/compaction-usage.ts +2 -0
  527. package/src/domains/observability/contract.ts +7 -3
  528. package/src/domains/observability/cost.ts +5 -0
  529. package/src/domains/observability/evidence-index.ts +2 -2
  530. package/src/domains/observability/extension.ts +1 -0
  531. package/src/domains/observability/out-of-turn-usage.ts +2 -0
  532. package/src/domains/observability/projection.ts +10 -0
  533. package/src/domains/observability/trace-store.ts +65 -5
  534. package/src/domains/prompts/compiler.ts +41 -23
  535. package/src/domains/prompts/extension.ts +4 -17
  536. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
  537. package/src/domains/prompts/fragments/operating/skills.md +12 -10
  538. package/src/domains/providers/cache-deployment.ts +147 -0
  539. package/src/domains/providers/catalog.ts +12 -7
  540. package/src/domains/providers/extension.ts +27 -5
  541. package/src/domains/providers/index.ts +6 -1
  542. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
  543. package/src/domains/providers/plugins.ts +3 -13
  544. package/src/domains/providers/probe/http.ts +44 -59
  545. package/src/domains/providers/probe/reasoning.ts +2 -0
  546. package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
  547. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
  548. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
  549. package/src/domains/providers/types/target-descriptor.ts +17 -0
  550. package/src/domains/safety/action-classifier.ts +17 -1
  551. package/src/domains/safety/call-target.ts +14 -0
  552. package/src/domains/safety/contract.ts +1 -1
  553. package/src/domains/safety/finish-contract.ts +9 -3
  554. package/src/domains/safety/loop-detector.ts +1 -1
  555. package/src/domains/safety/policy-engine.ts +7 -0
  556. package/src/domains/safety/protected-artifacts.ts +3 -4
  557. package/src/domains/safety/rejection-feedback.ts +1 -1
  558. package/src/domains/safety/scope.ts +2 -3
  559. package/src/domains/safety/validation-contract.ts +3 -2
  560. package/src/domains/scheduling/budget.ts +5 -3
  561. package/src/domains/scheduling/contract.ts +2 -1
  562. package/src/domains/scheduling/extension.ts +3 -3
  563. package/src/domains/session/compaction/branch-summary.ts +1 -1
  564. package/src/domains/session/compaction/compact.ts +29 -3
  565. package/src/domains/session/compaction/cut-point.ts +1 -1
  566. package/src/domains/session/compaction/tokens.ts +5 -10
  567. package/src/domains/session/contract.ts +1 -1
  568. package/src/domains/session/cwd-fallback.ts +2 -2
  569. package/src/domains/session/entries.ts +1 -0
  570. package/src/domains/session/handoff.ts +5 -1
  571. package/src/domains/session/history.ts +6 -0
  572. package/src/domains/session/manager.ts +14 -7
  573. package/src/domains/session/retry.ts +2 -1
  574. package/src/domains/session/session-artifacts.ts +12 -7
  575. package/src/domains/session/task-board.ts +2 -3
  576. package/src/domains/session/usage.ts +6 -7
  577. package/src/engine/acp/server.ts +11 -0
  578. package/src/engine/ai.ts +2 -0
  579. package/src/engine/apis/openai-completions.ts +17 -4
  580. package/src/engine/loop-guard.ts +7 -0
  581. package/src/engine/prewarm.ts +232 -0
  582. package/src/engine/provider-diagnostics.ts +6 -1
  583. package/src/engine/provider-error-body.ts +65 -0
  584. package/src/engine/session.ts +118 -29
  585. package/src/engine/worker-runtime.ts +3 -0
  586. package/src/entry/boot-options.ts +2 -0
  587. package/src/entry/orchestrator.ts +38 -18
  588. package/src/interactive/chat-loop-messages.ts +3 -0
  589. package/src/interactive/chat-loop-policy.ts +1 -0
  590. package/src/interactive/chat-loop.ts +10 -12
  591. package/src/interactive/chat-panel.ts +23 -9
  592. package/src/interactive/chat-renderer.ts +33 -11
  593. package/src/interactive/clio-editor.ts +13 -5
  594. package/src/interactive/dispatch-board.ts +70 -30
  595. package/src/interactive/editor-submit.ts +30 -25
  596. package/src/interactive/footer/widgets.ts +12 -9
  597. package/src/interactive/interactive-presentation.ts +2 -3
  598. package/src/interactive/mux-bridge.ts +3 -7
  599. package/src/interactive/overlay-general-openers.ts +14 -7
  600. package/src/interactive/overlays/cwd-fallback.ts +1 -1
  601. package/src/interactive/overlays/library-model.ts +114 -35
  602. package/src/interactive/overlays/library.ts +52 -5
  603. package/src/interactive/overlays/list-overlay.ts +4 -1
  604. package/src/interactive/overlays/session-selector.ts +28 -23
  605. package/src/interactive/overlays/settings.ts +20 -1
  606. package/src/interactive/overlays/tree-selector.ts +47 -10
  607. package/src/interactive/panes-runtime.ts +1 -1
  608. package/src/interactive/prewarm.ts +11 -197
  609. package/src/interactive/renderers/compaction-summary.ts +1 -1
  610. package/src/interactive/renderers/provider-error.ts +118 -0
  611. package/src/interactive/renderers/retry-status.ts +59 -23
  612. package/src/interactive/renderers/tool-execution.ts +67 -7
  613. package/src/interactive/renderers/worker-answer.ts +198 -0
  614. package/src/interactive/renderers/worker-entry.ts +57 -163
  615. package/src/interactive/session-usage-reseed.ts +2 -0
  616. package/src/interactive/side-question.ts +2 -0
  617. package/src/interactive/slash-commands.ts +26 -1
  618. package/src/interactive/slash-spec.ts +2 -2
  619. package/src/interactive/theme/labels.ts +66 -30
  620. package/src/interactive/turn-context.ts +1 -0
  621. package/src/interactive/turn-persistence.ts +9 -1
  622. package/src/interactive/turn-prewarm.ts +126 -19
  623. package/src/interactive/turn-recovery.ts +2 -1
  624. package/src/interactive/turn-runtime.ts +36 -5
  625. package/src/interactive/view/artifacts.ts +3 -2
  626. package/src/interactive/view/view-overlay.ts +96 -20
  627. package/src/tools/agent-tools.ts +21 -7
  628. package/src/tools/artifact.ts +16 -8
  629. package/src/tools/bash.ts +90 -11
  630. package/src/tools/bootstrap.ts +42 -4
  631. package/src/tools/builtin-tool-catalog.ts +80 -11
  632. package/src/tools/context/index.ts +27 -31
  633. package/src/tools/context/library.ts +3 -1
  634. package/src/tools/context/surface.ts +12 -26
  635. package/src/tools/core-bootstrap.ts +72 -1
  636. package/src/tools/data/csv.ts +1189 -0
  637. package/src/tools/data/index.ts +308 -0
  638. package/src/tools/data/json.ts +1799 -0
  639. package/src/tools/data/jsonl.ts +561 -0
  640. package/src/tools/data/shared.ts +452 -0
  641. package/src/tools/edit-diff.ts +0 -7
  642. package/src/tools/edit.ts +115 -18
  643. package/src/tools/file-mutation-queue.ts +114 -4
  644. package/src/tools/find.ts +108 -29
  645. package/src/tools/gateway/caps.ts +11 -0
  646. package/src/tools/gateway/clio-context-surface.ts +41 -0
  647. package/src/tools/gateway/clio-context-tools.ts +77 -0
  648. package/src/tools/gateway/data-surface.ts +138 -0
  649. package/src/tools/gateway/data-tool.ts +201 -0
  650. package/src/tools/gateway/index.ts +342 -0
  651. package/src/tools/gateway/mcp-capabilities.ts +469 -0
  652. package/src/tools/grep.ts +88 -33
  653. package/src/tools/harness-extensions.ts +3 -0
  654. package/src/tools/ignore-policy.ts +7 -5
  655. package/src/tools/ls.ts +111 -20
  656. package/src/tools/policy.ts +35 -13
  657. package/src/tools/presentation.ts +6 -0
  658. package/src/tools/read.ts +634 -156
  659. package/src/tools/registry.ts +106 -8
  660. package/src/tools/run-script.ts +997 -0
  661. package/src/tools/spawn-hygiene.ts +157 -5
  662. package/src/tools/surface.ts +163 -0
  663. package/src/tools/verify/authoring.ts +8 -3
  664. package/src/tools/verify/catalog.ts +14 -1
  665. package/src/tools/verify/numeric.ts +367 -59
  666. package/src/tools/verify/perf.ts +171 -9
  667. package/src/tools/verify/scripts.ts +178 -26
  668. package/src/tools/web-fetch-surface.ts +22 -0
  669. package/src/tools/web-fetch.ts +26 -1
  670. package/src/tools/write.ts +45 -19
  671. package/src/worker/spec-contract.ts +27 -0
  672. package/dist/chunk-B6UM3OZC.js +0 -15
  673. package/dist/chunk-GJ24ODAX.js +0 -196
  674. package/dist/chunk-HRAKUPIH.js +0 -57
  675. package/dist/docs-BL7ROUFN.js +0 -292
@@ -1,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",
@@ -1,29 +1,50 @@
1
- /**
2
- * Abbreviate a wire model id for chips and dashboards without amputating a
3
- * meaningful placement prefix or version suffix. `dynamo/qwen3.8-27b` remains
4
- * visible as selected; only the leaf is shortened when the complete route is
5
- * wider than 24 characters.
6
- */
7
- export function abbreviateModelId(modelId: string | null | undefined): string {
8
- const segments = (modelId ?? "").trim().split("/").filter(Boolean);
9
- const base = segments.pop() ?? "";
10
- if (base.length === 0) return "model";
11
- const prefix = segments[0];
12
- const maxLeaf = prefix ? Math.max(8, 24 - prefix.length - 1) : 18;
13
- const parts = base.split("-").filter((part) => part.length > 0);
14
- let leaf: string;
15
- if (parts.length <= 1) leaf = base.length > maxLeaf ? base.slice(0, maxLeaf) : base;
16
- else {
17
- const kept: string[] = [];
18
- for (const part of parts) {
19
- const next = [...kept, part].join("-");
20
- if (kept.length > 0 && next.length > maxLeaf) break;
21
- kept.push(part);
22
- }
23
- const joined = kept.join("-");
24
- leaf = joined.length > maxLeaf ? joined.slice(0, maxLeaf) : joined;
1
+ import { sanitizeCallTargetText } from "../../domains/safety/call-target.js";
2
+ import { stripTerminalSequences, truncateToWidth, visibleWidth } from "../../engine/tui.js";
3
+
4
+ const identitySegments = new Intl.Segmenter(undefined, { granularity: "grapheme" });
5
+
6
+ /** Keep both placement and the distinguishing suffix when an identity must fit. */
7
+ export function fitIdentityLabel(value: string, width: number): string {
8
+ value = sanitizeCallTargetText(value);
9
+ const room = Math.max(0, Math.floor(width));
10
+ if (visibleWidth(value) <= room) return value;
11
+ if (room <= 1) return room === 1 ? "…" : "";
12
+ const tailBudget = Math.ceil((room - 1) / 2);
13
+ let tail = "";
14
+ for (const { segment } of [...identitySegments.segment(value)].reverse()) {
15
+ if (visibleWidth(segment + tail) > tailBudget) break;
16
+ tail = segment + tail;
17
+ }
18
+ const headBudget = room - 1 - visibleWidth(tail);
19
+ let head = "";
20
+ for (const { segment } of identitySegments.segment(value)) {
21
+ if (visibleWidth(head + segment) > headBudget) break;
22
+ head += segment;
25
23
  }
26
- return prefix ? `${prefix}/${leaf}` : leaf;
24
+ return `${head}…${tail}`;
25
+ }
26
+
27
+ /** Compact wire identity with explicit omission and its version/quantization suffix. */
28
+ export function abbreviateModelId(modelId: string | null | undefined): string {
29
+ const value = sanitizeCallTargetText(modelId ?? "");
30
+ if (value.length === 0) return "model";
31
+ if (visibleWidth(value) <= 24) return value;
32
+ const slash = value.lastIndexOf("/");
33
+ if (slash < 0) return fitIdentityLabel(value, 24);
34
+ const placement = value.slice(0, slash);
35
+ const model = value.slice(slash + 1);
36
+ const modelBudget = Math.min(18, visibleWidth(model));
37
+ return `${fitIdentityPrefix(placement, 23 - modelBudget)}/${fitIdentityLabel(model, modelBudget)}`;
38
+ }
39
+
40
+ /** Raw route fields stay separate until the surface knows its terminal-cell budget. */
41
+ export interface TargetIdentity {
42
+ targetId: string | null | undefined;
43
+ modelId: string | null | undefined;
44
+ }
45
+
46
+ function fitIdentityPrefix(value: string, width: number): string {
47
+ return stripTerminalSequences(truncateToWidth(value, Math.max(0, width), "…", false));
27
48
  }
28
49
 
29
50
  export interface TargetLabelOptions {
@@ -31,6 +52,8 @@ export interface TargetLabelOptions {
31
52
  separator?: string;
32
53
  /** Off for surfaces with room for the whole wire id. */
33
54
  abbreviate?: boolean;
55
+ /** Fit raw target/model fields once, preserving family and suffix before placement. */
56
+ width?: number;
34
57
  }
35
58
 
36
59
  /**
@@ -53,12 +76,25 @@ export function formatTargetLabel(
53
76
  modelId: string | null | undefined,
54
77
  options: TargetLabelOptions = {},
55
78
  ): string {
56
- const target = (targetId ?? "").trim();
57
- const model = (modelId ?? "").trim();
58
- if (target.length === 0 && model.length === 0) return "not configured";
79
+ const target = sanitizeCallTargetText(targetId ?? "");
80
+ const model = sanitizeCallTargetText(modelId ?? "");
81
+ const fit = (label: string): string => (options.width === undefined ? label : fitIdentityLabel(label, options.width));
82
+ if (target.length === 0 && model.length === 0) return fit("not configured");
83
+ if (options.width !== undefined && target.length > 0 && model.length > 0) {
84
+ const width = Math.max(0, Math.floor(options.width));
85
+ const separator = options.separator ?? " · ";
86
+ const full = `${target}${separator}${model}`;
87
+ if (visibleWidth(full) <= width) return full;
88
+ const leaf = model.slice(model.lastIndexOf("/") + 1);
89
+ const available = width - visibleWidth(separator);
90
+ if (available < 9) return fitIdentityLabel(leaf, width);
91
+ const modelBudget = Math.min(visibleWidth(leaf), Math.max(8, Math.ceil(available * 0.7)));
92
+ const targetBudget = Math.min(visibleWidth(target), available - modelBudget);
93
+ return `${fitIdentityPrefix(target, targetBudget)}${separator}${fitIdentityLabel(leaf, available - targetBudget)}`;
94
+ }
59
95
  const shown = options.abbreviate === false ? model : abbreviateModelId(model);
60
- if (target.length === 0) return `no target · ${shown}`;
61
- if (model.length === 0) return `${target} · no model`;
96
+ if (target.length === 0) return fit(`no target · ${shown}`);
97
+ if (model.length === 0) return fit(`${target} · no model`);
62
98
  return `${target}${options.separator ?? " · "}${shown}`;
63
99
  }
64
100
 
@@ -705,6 +705,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
705
705
  output: usage.output,
706
706
  cacheRead: usage.cacheRead,
707
707
  cacheWrite: usage.cacheWrite,
708
+ ...(usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: usage.cacheWrite1h }),
708
709
  reasoningTokens: usage.reasoning,
709
710
  totalTokens: usage.totalTokens,
710
711
  apiCalls: Math.max(1, Math.round(usage.apiCalls)),
@@ -78,6 +78,9 @@ export interface TurnPersistence {
78
78
  * (reminder block, skill preamble, handoff, then the operator's words);
79
79
  * `operatorText`, when it differs, is what the operator actually typed and
80
80
  * is what a transcript replay renders under the operator marker.
81
+ * `displayText` is the literal editor input when an expansion (a prompt
82
+ * template or command) replaced it; the session picker and replay show it,
83
+ * while compaction keeps reasserting the expanded `operatorText`.
81
84
  */
82
85
  appendSubmittedUserTurn(
83
86
  agentRuntime: AgentRuntime,
@@ -85,6 +88,7 @@ export interface TurnPersistence {
85
88
  images: ReadonlyArray<unknown> | undefined,
86
89
  synthetic: boolean,
87
90
  operatorText?: string,
91
+ displayText?: string,
88
92
  ): string | null;
89
93
  appendRetryStatus(status: RetryStatusPayload): void;
90
94
  appendModelChangeEntry(target: ChatLoopTarget): void;
@@ -213,6 +217,9 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
213
217
  outputTokens: total.outputTokens + summary.output,
214
218
  cacheReadTokens: total.cacheReadTokens + summary.cacheRead,
215
219
  cacheWriteTokens: total.cacheWriteTokens + summary.cacheWrite,
220
+ ...(total.cacheWrite1hTokens === undefined && summary.cacheWrite1h === undefined
221
+ ? {}
222
+ : { cacheWrite1hTokens: (total.cacheWrite1hTokens ?? 0) + (summary.cacheWrite1h ?? 0) }),
216
223
  reasoningTokens: total.reasoningTokens + summary.reasoning,
217
224
  totalTokens: total.totalTokens + summary.tokens,
218
225
  costUsd: (total.costUsd ?? 0) + summary.costUsd,
@@ -401,7 +408,7 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
401
408
  finishTracedTurn("success", null);
402
409
  },
403
410
 
404
- appendSubmittedUserTurn(agentRuntime, text, images, synthetic, operatorText): string | null {
411
+ appendSubmittedUserTurn(agentRuntime, text, images, synthetic, operatorText, displayText): string | null {
405
412
  if (!deps.session) return null;
406
413
  if (!deps.session.current()) {
407
414
  deps.session.create({
@@ -412,6 +419,7 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
412
419
  }
413
420
  const payload: Record<string, unknown> = images ? { content: [{ type: "text", text }, ...images] } : { text };
414
421
  if (operatorText !== undefined && operatorText !== text) payload.operatorText = operatorText;
422
+ if (displayText !== undefined && displayText !== (operatorText ?? text)) payload.displayText = displayText;
415
423
  if (synthetic) {
416
424
  payload.synthetic = true;
417
425
  payload.source = "middleware_request_continuation";
@@ -10,10 +10,16 @@
10
10
  * nobody watching.
11
11
  */
12
12
 
13
+ import { createHash } from "node:crypto";
13
14
  import { BusChannels } from "../core/bus-events.js";
14
15
  import type { ClioSettings } from "../core/config.js";
15
16
  import type { SafeEventBus } from "../core/event-bus.js";
16
- import type { ProvidersContract } from "../domains/providers/index.js";
17
+ import { endpointCapacityUsage } from "../domains/dispatch/index.js";
18
+ import {
19
+ type CacheDeploymentObservation,
20
+ observeCacheDeployment,
21
+ type ProvidersContract,
22
+ } from "../domains/providers/index.js";
17
23
  import type { SessionContract } from "../domains/session/contract.js";
18
24
  import type { Usage } from "../engine/types.js";
19
25
  import { type PrewarmTrigger, prewarmPromptTokens, runPrewarmRound } from "./prewarm.js";
@@ -28,9 +34,14 @@ export type PrewarmSkipReason =
28
34
  | "dispatch-active"
29
35
  | "tier"
30
36
  | "unresolved"
37
+ | "deployment"
38
+ | "cooldown"
39
+ | "expired"
31
40
  | "superseded";
32
41
 
33
- export type PrewarmOutcome = { ran: true; trigger: PrewarmTrigger } | { ran: false; reason: PrewarmSkipReason };
42
+ export type PrewarmOutcome =
43
+ | { ran: true; trigger: PrewarmTrigger }
44
+ | { ran: false; reason: PrewarmSkipReason; detail?: string };
34
45
 
35
46
  export interface TurnPrewarmDeps {
36
47
  state: ChatTurnState;
@@ -78,6 +89,7 @@ export interface TurnPrewarmDeps {
78
89
  registerEndpointSlot?: (runtime: AgentRuntime) => (() => void) | null;
79
90
  /** Test seam. Production uses the real provider round. */
80
91
  runPrewarm?: typeof runPrewarmRound;
92
+ observeDeployment?: typeof observeCacheDeployment;
81
93
  /**
82
94
  * Whether a submit aborts the round's request. Defaults to the measured
83
95
  * backend behavior; see {@link ABORT_ROUND_ON_SUBMIT}.
@@ -127,6 +139,13 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
127
139
  let pendingTrigger: PrewarmTrigger | null = null;
128
140
  let timer: ReturnType<typeof setTimeout> | null = null;
129
141
  let active: AbortController | null = null;
142
+ // Ownership outlives detachment: one request and at most one newer trigger.
143
+ let running: AbortController | null = null;
144
+ let disposed = false;
145
+ let pendingSince = 0;
146
+ let lastFinished = 0;
147
+ let lastPrefix: string | null = null;
148
+ let lastSkip: string | null = null;
130
149
  // Rounds a submit or a session switch let go of. Their result is still
131
150
  // recorded, but it no longer describes the prefix the next turn will send, so
132
151
  // it never reaches the `/context` line.
@@ -167,13 +186,33 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
167
186
  // notice from either.
168
187
  const targetId = deps.getSettings().chat?.target?.trim();
169
188
  const runtimeId = targetId ? deps.providers.getTarget(targetId)?.runtime : undefined;
170
- if (runtimeId === undefined || deps.providers.getRuntime(runtimeId)?.tier !== "local-native") return "tier";
189
+ if (
190
+ runtimeId === undefined ||
191
+ (deps.providers.getRuntime(runtimeId)?.tier !== "local-native" &&
192
+ !(runtimeId === "litellm" && targetId && deps.providers.getTarget(targetId)?.cache?.deployment))
193
+ )
194
+ return "tier";
171
195
  return null;
172
196
  };
173
197
 
174
198
  const runOnce = async (trigger: PrewarmTrigger, controller: AbortController): Promise<PrewarmOutcome> => {
175
199
  const refusal = admissionRefusal();
176
200
  if (refusal) return { ran: false, reason: refusal };
201
+ const targetId = deps.getSettings().chat.target;
202
+ const target = targetId ? deps.providers.getTarget(targetId) : null;
203
+ if (!target) return { ran: false, reason: "unresolved" };
204
+ const targetSettings = JSON.stringify(target);
205
+ const started = Date.now();
206
+ if (target.cache?.retention === "none") return { ran: false, reason: "disabled" };
207
+ if (target.pricing && Object.values(target.pricing).some((rate) => rate > 0))
208
+ return { ran: false, reason: "deployment", detail: "paid-warming-disabled" };
209
+ const cooldown = Math.max(1000, target.cache?.warm?.cooldownMs ?? 60000);
210
+ if (Date.now() - lastFinished < cooldown) return { ran: false, reason: "cooldown" };
211
+ const observe = deps.observeDeployment ?? observeCacheDeployment;
212
+ let deployment: CacheDeploymentObservation = await observe(target, deps.getSettings().chat.model ?? "", {
213
+ signal: controller.signal,
214
+ });
215
+ if (deployment.warm !== "bounded") return { ran: false, reason: "deployment", detail: deployment.reason };
177
216
 
178
217
  const prepared = await deps.prepareRuntime(controller.signal);
179
218
  if (!prepared.ok) return { ran: false, reason: "unresolved" };
@@ -194,15 +233,48 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
194
233
  const lateRefusal = admissionRefusal();
195
234
  if (lateRefusal) return { ran: false, reason: lateRefusal };
196
235
  if (detached.has(controller) || controller.signal.aborted) return { ran: false, reason: "superseded" };
236
+ // Binding/residency can change during preparation. Discovery itself never
237
+ // loads models and missing evidence leaves ordinary inference untouched.
238
+ deployment = await observe(target, runtime.wireModelId, { signal: controller.signal });
239
+ if (deployment.warm !== "bounded") return { ran: false, reason: "deployment", detail: deployment.reason };
240
+ const finalRefusal = admissionRefusal();
241
+ if (finalRefusal) return { ran: false, reason: finalRefusal };
242
+ if (
243
+ detached.has(controller) ||
244
+ controller.signal.aborted ||
245
+ JSON.stringify(deps.providers.getTarget(target.id)) !== targetSettings
246
+ )
247
+ return { ran: false, reason: "superseded" };
248
+ if (Date.now() - started > 30000) return { ran: false, reason: "expired" };
249
+ // This includes shared dispatch leases/reservations and this process's
250
+ // foreground streams. It is a fresh check, not an atomic global warm lease;
251
+ // server slot observations above also include unrelated active traffic.
252
+ if (deployment.endpoint && (endpointCapacityUsage()[deployment.endpoint] ?? 0) > 0)
253
+ return { ran: false, reason: "dispatch-active" };
254
+ const prefix = createHash("sha256")
255
+ .update(
256
+ JSON.stringify({
257
+ model: runtime.agent.state.model,
258
+ system: runtime.agent.state.systemPrompt,
259
+ messages: runtime.agent.state.messages,
260
+ tools: runtime.agent.state.tools,
261
+ thinking: runtime.agent.state.thinkingLevel,
262
+ }),
263
+ )
264
+ .digest("hex");
265
+ if (prefix === lastPrefix && Date.now() - lastFinished < Math.max(cooldown, 60000))
266
+ return { ran: false, reason: "cooldown" };
197
267
 
198
268
  // The claim is taken before the request goes out and released in the
199
269
  // finally, including on the detach path, because the request the server is
200
270
  // still finishing is the one occupying the slot.
201
271
  const releaseEndpointSlot = deps.registerEndpointSlot?.(runtime) ?? null;
202
272
  let result: Awaited<ReturnType<typeof round>>;
273
+ const deadline = setTimeout(() => controller.abort(), Math.min(target.cache?.warm?.maxDurationMs ?? 30000, 120000));
203
274
  try {
204
275
  result = await round({
205
276
  model: runtime.agent.state.model,
277
+ agent: runtime.agent,
206
278
  state: {
207
279
  systemPrompt: runtime.agent.state.systemPrompt,
208
280
  messages: runtime.agent.state.messages,
@@ -211,10 +283,14 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
211
283
  },
212
284
  ...(prepared.apiKey !== undefined ? { apiKey: prepared.apiKey } : {}),
213
285
  signal: controller.signal,
286
+ maxInputTokens: target.cache?.warm?.maxInputTokens ?? 8192,
214
287
  });
215
288
  } finally {
289
+ clearTimeout(deadline);
290
+ lastFinished = Date.now();
216
291
  releaseEndpointSlot?.();
217
292
  }
293
+ lastPrefix = result.aborted || result.errorMessage ? null : prefix;
218
294
 
219
295
  // The prefill the server did is spend whatever the operator did next, so a
220
296
  // let-go round is recorded exactly like a completed one. Only the
@@ -223,7 +299,7 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
223
299
  // prefix.
224
300
  const wasDetached = detached.has(controller) || controller.signal.aborted;
225
301
  const promptTokens = prewarmPromptTokens(result);
226
- if (!wasDetached) {
302
+ if (!wasDetached && !result.errorMessage) {
227
303
  deps.context.notePrewarm({
228
304
  tokens: promptTokens,
229
305
  ms: result.timing.apiMs,
@@ -242,6 +318,7 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
242
318
  parentTurnId: deps.state.lastTurnId,
243
319
  data: {
244
320
  trigger,
321
+ deployment,
245
322
  target: runtime.targetId,
246
323
  model: runtime.wireModelId,
247
324
  promptTokens,
@@ -249,9 +326,10 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
249
326
  detached: wasDetached,
250
327
  timing: result.timing,
251
328
  promptCache: {
252
- input: result.usage?.input ?? 0,
253
- cacheRead: result.usage?.cacheRead ?? 0,
254
- cacheWrite: result.usage?.cacheWrite ?? 0,
329
+ input: result.usage?.input ?? null,
330
+ cacheRead: result.usage?.cacheRead ?? null,
331
+ cacheWrite: result.usage?.cacheWrite ?? null,
332
+ ...(result.usage?.cacheWrite1h === undefined ? {} : { cacheWrite1h: result.usage.cacheWrite1h }),
255
333
  ...(result.backend ? { backend: { ...result.backend } } : {}),
256
334
  },
257
335
  ...(result.errorMessage ? { error: result.errorMessage } : {}),
@@ -279,28 +357,55 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
279
357
 
280
358
  const fire = (): void => {
281
359
  timer = null;
360
+ if (disposed || running !== null) return;
282
361
  const trigger = pendingTrigger;
283
362
  pendingTrigger = null;
284
363
  if (trigger === null) return;
285
364
  const controller = new AbortController();
286
365
  active = controller;
287
- const previous = inFlight;
288
- inFlight = previous
289
- .catch(() => null)
290
- .then(() => runOnce(trigger, controller))
366
+ running = controller;
367
+ inFlight = (
368
+ Date.now() - pendingSince > 30000
369
+ ? Promise.resolve<PrewarmOutcome>({ ran: false, reason: "expired" })
370
+ : runOnce(trigger, controller)
371
+ )
372
+ .then((outcome) => {
373
+ if (!outcome.ran && deps.getSettings().chat.prewarm && outcome.reason !== "surface") {
374
+ const key = `${outcome.reason}:${outcome.detail ?? ""}`;
375
+ if (lastSkip !== key) {
376
+ lastSkip = key;
377
+ try {
378
+ deps.session?.appendEntry({
379
+ kind: "custom",
380
+ customType: "prewarmSkipped",
381
+ display: false,
382
+ parentTurnId: deps.state.lastTurnId,
383
+ data: { trigger, ...outcome },
384
+ });
385
+ } catch {
386
+ /* Optional diagnostics. */
387
+ }
388
+ }
389
+ } else if (outcome.ran) lastSkip = null;
390
+ return outcome;
391
+ })
291
392
  .catch(() => null)
292
393
  .finally(() => {
293
394
  if (active === controller) active = null;
395
+ running = null;
396
+ if (!disposed && pendingTrigger !== null && timer === null) timer = setTimeout(fire, 0);
294
397
  });
295
398
  };
296
399
 
297
400
  return {
298
401
  schedule(trigger: PrewarmTrigger): void {
402
+ if (disposed) return;
299
403
  // A newer trigger describes a newer prefix; the older round is no longer
300
404
  // warming history this session has.
301
405
  releaseActiveRound();
302
406
  pendingTrigger = trigger;
303
- if (timer !== null) return;
407
+ pendingSince = Date.now();
408
+ if (timer !== null || running !== null) return;
304
409
  // Ref'd on purpose, same reasoning as `settled()` below: the timer is due
305
410
  // in 0 ms, so it holds the event loop for one tick at most, and a Node 22
306
411
  // loop that drains past a due unref'd timer would otherwise never start
@@ -317,7 +422,7 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
317
422
  releaseActiveRound();
318
423
  },
319
424
 
320
- settled(): Promise<PrewarmOutcome | null> {
425
+ async settled(): Promise<PrewarmOutcome | null> {
321
426
  // One hop past the scheduling tick so a caller that just scheduled a
322
427
  // round waits for that round rather than for the previous one. The timer
323
428
  // is deliberately ref'd, unlike the scheduling timer above: the caller is
@@ -327,14 +432,16 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
327
432
  // pending forever and cancelled every later test in the lane; Node 24
328
433
  // happens to fire the due timer first, which is why the hang never
329
434
  // reproduced on a 24.x development machine.
330
- return new Promise((resolve) => {
331
- setTimeout(() => {
332
- resolve(inFlight.catch(() => null));
333
- }, 0);
334
- });
435
+ let outcome: PrewarmOutcome | null;
436
+ do {
437
+ await new Promise<void>((resolve) => setTimeout(resolve, 0));
438
+ outcome = await inFlight;
439
+ } while (timer !== null || running !== null || pendingTrigger !== null);
440
+ return outcome;
335
441
  },
336
442
 
337
443
  dispose(): void {
444
+ disposed = true;
338
445
  for (const unsubscribe of unsubscribeDispatch) unsubscribe?.();
339
446
  pendingTrigger = null;
340
447
  if (timer !== null) {
@@ -343,7 +450,7 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
343
450
  }
344
451
  // Shutdown always aborts: the process is going away, and a socket held
345
452
  // open for a round nobody will read is not a latency question.
346
- active?.abort();
453
+ running?.abort();
347
454
  active = null;
348
455
  },
349
456
  };
@@ -275,7 +275,8 @@ export function createTurnRecovery(deps: TurnRecoveryDeps): TurnRecovery {
275
275
  maxAttempts: settings.maxRetries,
276
276
  errorMessage: message,
277
277
  });
278
- deps.emitNotice(message);
278
+ // The exhausted status already exposes this failure and retains its full
279
+ // diagnostic. A second raw notice bypasses bounded error presentation.
279
280
  pruneFailedAssistantFromContext(agentRuntime.agent);
280
281
  return true;
281
282
  }
@@ -25,6 +25,7 @@ import {
25
25
  import type { RetrySettings } from "../domains/session/retry.js";
26
26
  import type { createEngineAgent } from "../engine/agent.js";
27
27
  import { cleanupEngineSessionResources } from "../engine/ai.js";
28
+ import { setGlobalDefaultMaxOutputTokens } from "../engine/apis/index.js";
28
29
  import { sanitizeLockedSynthesisMessage } from "../engine/loop-guard.js";
29
30
  import {
30
31
  patchProviderThinkingPayload,
@@ -380,9 +381,17 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
380
381
  );
381
382
  };
382
383
 
384
+ // A target id/model names the selection, not its current URL, auth, pricing
385
+ // or cache policy. Keep the constructed descriptor identity across calls.
386
+ let runtimeTargetSettings: string | null = null;
383
387
  const ensureRuntime = (): AgentRuntime | null => {
384
388
  const target = readTarget();
385
389
  if (!target) return null;
390
+ const targetSettings = JSON.stringify(target.target);
391
+ const sameTargetSettings = runtimeTargetSettings === targetSettings;
392
+ // Preflight and the wire budget share the session's effective settings,
393
+ // including overrides that never reach the saved providers snapshot.
394
+ setGlobalDefaultMaxOutputTokens(deps.getSettings().chat.maxOutputTokens);
386
395
  context.emitContextWindowWarningTransition(target.runtimeResolution?.contextWindowDetails?.warning ?? null);
387
396
  if (!deps.knownTargets().has(target.target.id)) {
388
397
  throw new TurnAdmissionError(
@@ -394,6 +403,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
394
403
  state.runtime &&
395
404
  state.runtime.targetId === target.target.id &&
396
405
  state.runtime.runtimeId === target.runtime.id &&
406
+ sameTargetSettings &&
397
407
  state.runtime.wireModelId === target.wireModelId
398
408
  ) {
399
409
  // Same target+runtime+model. Settings may still have moved
@@ -427,6 +437,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
427
437
  state.runtime &&
428
438
  state.runtime.targetId === target.target.id &&
429
439
  state.runtime.runtimeId === target.runtime.id &&
440
+ sameTargetSettings &&
430
441
  state.runtime.wireModelId !== target.wireModelId
431
442
  ) {
432
443
  const nextModel = synthesizeModel(target);
@@ -472,6 +483,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
472
483
  maxRetryDelayMs: deps.retrySettings().maxDelayMs,
473
484
  ...(gatewaySessionId ? { sessionId: gatewaySessionId } : {}),
474
485
  onStreamInvocation: () => {
486
+ setGlobalDefaultMaxOutputTokens(deps.getSettings().chat.maxOutputTokens);
475
487
  apiCallStartedAt = performance.now();
476
488
  apiCallFirstDeltaAt = null;
477
489
  },
@@ -559,20 +571,30 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
559
571
  stallTimer = setTimeout(
560
572
  () => {
561
573
  stallTimer = null;
562
- const stallMs = deps.retrySettings().streamStallMs;
574
+ const retry = deps.retrySettings();
563
575
  // Zero disables the escalation; an operator who wants a stream to
564
576
  // hang forever keeps that by setting `retry.streamStallMs: 0`.
565
- if (stallMs <= 0) return;
577
+ if (retry.streamStallMs <= 0) return;
566
578
  if (stallSuspendDepth > 0 || toolsInFlight > 0) {
567
- armStallTimer(stallMs);
579
+ armStallTimer(retry.streamStallMs);
580
+ return;
581
+ }
582
+ // Silence before a call's first delta is not silence mid-stream. A
583
+ // local server that slept reloads the model and prefills cold before
584
+ // it can emit anything, which is minutes of healthy quiet; a stream
585
+ // that already produced output and stops is a wedged slot.
586
+ const awaitingFirstToken = apiCallStartedAt !== null && apiCallFirstDeltaAt === null;
587
+ if (awaitingFirstToken && retry.firstTokenStallMs <= 0) {
588
+ armStallTimer(retry.streamStallMs);
568
589
  return;
569
590
  }
591
+ const stallMs = awaitingFirstToken ? Math.max(retry.firstTokenStallMs, retry.streamStallMs) : retry.streamStallMs;
570
592
  const idleMs = performance.now() - lastActivityAt;
571
593
  if (idleMs < stallMs) {
572
594
  armStallTimer(stallMs - idleMs);
573
595
  return;
574
596
  }
575
- state.streamStallReason = `stream stalled: no output from ${localRuntime.targetId} for ${Math.round(idleMs / 1000)}s, aborting (stream timeout)`;
597
+ state.streamStallReason = `stream stalled: no ${awaitingFirstToken ? "first token" : "output"} from ${localRuntime.targetId} for ${Math.round(idleMs / 1000)}s, aborting (stream timeout)`;
576
598
  localRuntime.agent.abort();
577
599
  },
578
600
  Math.max(1, delayMs),
@@ -755,7 +777,14 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
755
777
  typeof assistantEvent.delta === "string" &&
756
778
  assistantEvent.delta.length > 0);
757
779
  if (hasDelta && firstAssistantDeltaAt === null) firstAssistantDeltaAt = eventClock;
758
- if (hasDelta && apiCallFirstDeltaAt === null) apiCallFirstDeltaAt = eventClock;
780
+ if (hasDelta && apiCallFirstDeltaAt === null) {
781
+ apiCallFirstDeltaAt = eventClock;
782
+ // The timer may be armed for the longer first-token window; the
783
+ // stream is live now, so the mid-stream window applies from here.
784
+ const stallMs = deps.retrySettings().streamStallMs;
785
+ clearStallTimer();
786
+ if (stallMs > 0) armStallTimer(stallMs);
787
+ }
759
788
  }
760
789
  if (enrichedEvent.type === "agent_end") {
761
790
  context.noteRunCacheSummary(enrichedEvent.messages, runFirstCallVerdict);
@@ -777,6 +806,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
777
806
  output: summary.output,
778
807
  cacheRead: summary.cacheRead,
779
808
  cacheWrite: summary.cacheWrite,
809
+ ...(summary.cacheWrite1h === undefined ? {} : { cacheWrite1h: summary.cacheWrite1h }),
780
810
  reasoningTokens: summary.reasoning,
781
811
  totalTokens: summary.tokens,
782
812
  apiCalls: summary.apiCalls,
@@ -911,6 +941,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
911
941
  });
912
942
 
913
943
  state.runtime = localRuntime;
944
+ runtimeTargetSettings = targetSettings;
914
945
  // Append a modelChange marker only when this rebuild replaces a prior
915
946
  // runtime, which is the cross-target swap case (mid-session change of
916
947
  // target or runtime id). On the initial build, the session header's
@@ -1125,11 +1125,12 @@ export class WorkspaceArtifactProvider implements ArtifactProvider {
1125
1125
  {
1126
1126
  id: `workspace:${path}`,
1127
1127
  category: this.category,
1128
- title: safeTitle(`${artifact.path} · ${artifact.tool}${kind}`, artifact.path),
1128
+ title: safeTitle(`${basename(path)} · ${relative(workspace, path)} · ${artifact.tool}${kind}`, basename(path)),
1129
1129
  timestamp: parseTime(artifact.timestamp),
1130
1130
  sizeBytes: maybeSizeBytes(path),
1131
1131
  path,
1132
- description: `${artifact.tool}${kind} · ${overwriteLabel}`,
1132
+ description: `${artifact.tool}${kind} · ${overwriteLabel} · Workspace: ${workspace} · Turn: ${artifact.turnId}`,
1133
+ ...(this.deps.sessionMeta ? { sessionId: this.deps.sessionMeta.id } : {}),
1133
1134
  toolName: artifact.tool,
1134
1135
  searchText: [
1135
1136
  artifact.path,