@iowarp/clio-coder 0.4.7 → 0.4.8

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 (485) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +29 -0
  3. package/CONTRIBUTING.md +83 -74
  4. package/README.md +66 -45
  5. package/dist/{acp-W3Y3TRHD.js → acp-JWPQZM2D.js} +14 -14
  6. package/dist/{agents-J4ICNLQ3.js → agents-4GCDIRVX.js} +55 -54
  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-SYAKTDQE.js} +22 -22
  11. package/dist/background-OW67WMYR.js +37 -0
  12. package/dist/{builtins-XLXWWSRF.js → builtins-TKS63VNV.js} +4 -4
  13. package/dist/chunk-2JSCCEKO.js +85 -0
  14. package/dist/{chunk-QKWL7SYE.js → chunk-2SXGG2IV.js} +49 -38
  15. package/dist/{chunk-MZHXENL7.js → chunk-2U2U5POA.js} +5 -5
  16. package/dist/{chunk-NCCQ6DVS.js → chunk-2ZWLMA3T.js} +6 -6
  17. package/dist/{chunk-FQOOGXBH.js → chunk-36XSBPXL.js} +7 -7
  18. package/dist/{chunk-5AJPUR72.js → chunk-3IQOZRQ6.js} +7 -7
  19. package/dist/{chunk-4MFBBY2Z.js → chunk-44U2OUSM.js} +3 -3
  20. package/dist/{chunk-5ZSZEYJK.js → chunk-4P6M2TTE.js} +2 -2
  21. package/dist/{chunk-IZYTT3CD.js → chunk-526ABLHD.js} +6 -6
  22. package/dist/{chunk-BO4XV5VX.js → chunk-5C2OQHLR.js} +4 -4
  23. package/dist/chunk-5D2FNBMG.js +185 -0
  24. package/dist/{chunk-M6Z2V6YU.js → chunk-5HULHKT2.js} +5 -5
  25. package/dist/{chunk-PFLOULP3.js → chunk-5UG6EZI3.js} +4 -4
  26. package/dist/{chunk-WN552PKN.js → chunk-5W4FRA5Q.js} +280 -900
  27. package/dist/{chunk-KAFMW7WM.js → chunk-6R5MBXBJ.js} +1 -1
  28. package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
  29. package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
  30. package/dist/{chunk-GXIWHXDB.js → chunk-6X7VOCDY.js} +3 -3
  31. package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
  32. package/dist/{chunk-34XHRVKG.js → chunk-ARRUMZ7X.js} +2 -2
  33. package/dist/{chunk-3T4DXWP6.js → chunk-ATB3Q7YO.js} +1 -6
  34. package/dist/chunk-AUHVBIDW.js +19 -0
  35. package/dist/{chunk-L3Z5ANCV.js → chunk-BE4I3UJ2.js} +7 -7
  36. package/dist/chunk-BFPHMSK7.js +169 -0
  37. package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
  38. package/dist/{chunk-D2T66PDV.js → chunk-BIY22UUK.js} +35 -203
  39. package/dist/{chunk-VMATUZB6.js → chunk-D55WO5J7.js} +11 -11
  40. package/dist/{chunk-2O2LVQQK.js → chunk-E2NSPYLC.js} +4 -4
  41. package/dist/{chunk-IJMW64DX.js → chunk-EFXMQYI6.js} +32 -32
  42. package/dist/{chunk-GVZFCJHE.js → chunk-EPYATQMG.js} +18 -18
  43. package/dist/{chunk-MZNWZUJM.js → chunk-EXKUF426.js} +11 -11
  44. package/dist/{chunk-IMOD2YPV.js → chunk-F7Y6QTPL.js} +9 -19
  45. package/dist/{chunk-IQCNVLO6.js → chunk-FB3KTE2J.js} +10 -7
  46. package/dist/{chunk-3LXJOICS.js → chunk-FNVPQQYT.js} +2 -2
  47. package/dist/{chunk-UUQ5G6EZ.js → chunk-GEYX2NZ5.js} +2 -2
  48. package/dist/{chunk-CP3HIR5H.js → chunk-GJBJHJNY.js} +19 -18
  49. package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
  50. package/dist/{chunk-WT5TRMO4.js → chunk-GVU4CXPJ.js} +179 -65
  51. package/dist/{chunk-TZ6UVP2H.js → chunk-H5DPSUBB.js} +8 -8
  52. package/dist/{chunk-EUEXGXXR.js → chunk-H77XBUBM.js} +5 -5
  53. package/dist/{config-YXARKGTX.js → chunk-HMGAKB7E.js} +15 -259
  54. package/dist/{chunk-EUZRMP4Y.js → chunk-HP7KJ5O2.js} +19 -19
  55. package/dist/chunk-HVCAY2FH.js +67 -0
  56. package/dist/{chunk-CPXGJI2A.js → chunk-ICYIUNO4.js} +4 -4
  57. package/dist/{chunk-GI5RRMAH.js → chunk-IILXVWJY.js} +7 -7
  58. package/dist/{chunk-MNQN3X6Y.js → chunk-JCVIL6TY.js} +5 -5
  59. package/dist/chunk-JIMWEYWO.js +63 -0
  60. package/dist/{chunk-C3G5PNUO.js → chunk-JLBVCROW.js} +25 -25
  61. package/dist/chunk-JOBN2YQQ.js +176 -0
  62. package/dist/chunk-JOL2QRLE.js +152 -0
  63. package/dist/{chunk-N37QC5FV.js → chunk-JRA6OBHY.js} +5 -5
  64. package/dist/{chunk-C6GEXX4L.js → chunk-JV25I7ID.js} +7 -7
  65. package/dist/{chunk-SEDI5K5B.js → chunk-JYKUMHCQ.js} +16 -16
  66. package/dist/{chunk-UA6W4XFJ.js → chunk-K3W6BF5C.js} +2 -2
  67. package/dist/chunk-K45LHSCI.js +194 -0
  68. package/dist/{chunk-UA3W4FGC.js → chunk-K53E2PTW.js} +5 -5
  69. package/dist/{chunk-VCRVEDUC.js → chunk-K5UJD6MM.js} +5 -5
  70. package/dist/{chunk-65BGHOUR.js → chunk-KGP3UQGJ.js} +5 -5
  71. package/dist/chunk-KKRXONXG.js +43 -0
  72. package/dist/{chunk-LBFQMYS3.js → chunk-KWJXCL2X.js} +5 -3
  73. package/dist/{chunk-RTLNFZMD.js → chunk-L75H5B3B.js} +3 -3
  74. package/dist/{chunk-G4LGUTOE.js → chunk-LLCGGVSW.js} +6 -6
  75. package/dist/{chunk-HRAKUPIH.js → chunk-LZCCBLRC.js} +5 -5
  76. package/dist/{chunk-WURGVOZJ.js → chunk-LZDLYSUN.js} +18 -14
  77. package/dist/{chunk-ISNCCX42.js → chunk-MATCRH3M.js} +7 -6
  78. package/dist/{chunk-BAU36233.js → chunk-MEHBW2SP.js} +7 -7
  79. package/dist/{chunk-BQQ5MXUC.js → chunk-MUXNDNMZ.js} +3 -3
  80. package/dist/{chunk-NO7J45X6.js → chunk-MWMW53WW.js} +90 -51
  81. package/dist/chunk-MZDPF35R.js +45 -0
  82. package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
  83. package/dist/{chunk-T334FW2H.js → chunk-O2QJDRWP.js} +5 -5
  84. package/dist/{chunk-T7QQBNLH.js → chunk-O3HSB2YL.js} +9 -7
  85. package/dist/{chunk-WB7POC6M.js → chunk-OEMFEL26.js} +6 -6
  86. package/dist/{chunk-77CZRFTE.js → chunk-OPC4DQD6.js} +2 -2
  87. package/dist/{chunk-4UHVS5T7.js → chunk-ORRNGQDV.js} +8 -8
  88. package/dist/{chunk-TZHN5ITX.js → chunk-P4JS3MH5.js} +5 -5
  89. package/dist/{chunk-WBVKKTUT.js → chunk-P7GTE4FX.js} +2 -2
  90. package/dist/{chunk-6TAATXXH.js → chunk-PAQVETLA.js} +6 -6
  91. package/dist/{chunk-6CA2BHOR.js → chunk-PFZJMXIY.js} +4 -4
  92. package/dist/{chunk-4QKAITQT.js → chunk-PGEFOTJB.js} +70 -7
  93. package/dist/{chunk-MBJO5VNZ.js → chunk-PJ5H5B7A.js} +25 -25
  94. package/dist/{chunk-DO7M3LSX.js → chunk-PMUUAABD.js} +43 -96
  95. package/dist/{chunk-A67NR5AT.js → chunk-Q32C6AWI.js} +11 -8
  96. package/dist/{chunk-ECOMVOHP.js → chunk-QGIC5SX5.js} +2 -2
  97. package/dist/{chunk-5CMARGPF.js → chunk-QLAGXTTV.js} +7 -2
  98. package/dist/{chunk-GFQ7P2UF.js → chunk-QLKCCC2J.js} +9 -9
  99. package/dist/{chunk-SELG4SUR.js → chunk-QWUSS2QP.js} +7 -4
  100. package/dist/{chunk-P5SC4DLJ.js → chunk-QYSAZMSH.js} +2 -2
  101. package/dist/{fleet-decisions-S3PTZV2D.js → chunk-R5NRX5N4.js} +5 -41
  102. package/dist/{chunk-DLIYANB7.js → chunk-RAUOKUZV.js} +11 -11
  103. package/dist/{chunk-UFYNOQK4.js → chunk-RBES4TCZ.js} +7 -7
  104. package/dist/{chunk-T52TPHYC.js → chunk-RFULVPBX.js} +4 -4
  105. package/dist/{chunk-TLTGZTXI.js → chunk-RKFNU5UA.js} +3 -3
  106. package/dist/{chunk-T4TY5GG3.js → chunk-RM3XJX7P.js} +3 -3
  107. package/dist/{chunk-6YA46L5A.js → chunk-RNLAPBJL.js} +2 -2
  108. package/dist/chunk-RPMNIFRY.js +65 -0
  109. package/dist/{chunk-DACXIVVF.js → chunk-RRZFRIJP.js} +5 -5
  110. package/dist/{chunk-CE64C5K5.js → chunk-RXI7K4J5.js} +61 -61
  111. package/dist/{chunk-CULVKYTK.js → chunk-STC6CWUZ.js} +5 -5
  112. package/dist/{chunk-6YHPAAZR.js → chunk-TEHVMHOK.js} +3 -3
  113. package/dist/{chunk-VTYHHQ57.js → chunk-TOPICHGR.js} +2 -2
  114. package/dist/{chunk-UWD3JD5X.js → chunk-UB33F3YW.js} +10 -10
  115. package/dist/{chunk-TN5FW4XY.js → chunk-UDAK6GR2.js} +12 -9
  116. package/dist/chunk-USBBEKHW.js +177 -0
  117. package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
  118. package/dist/{chunk-6LRLOJHQ.js → chunk-W7KNI3F5.js} +11 -62
  119. package/dist/chunk-WFTSK7N3.js +637 -0
  120. package/dist/{chunk-YPRSNUTC.js → chunk-WJWNZXRM.js} +2 -2
  121. package/dist/chunk-WS4FOGLY.js +686 -0
  122. package/dist/{chunk-ZGIGW4ZG.js → chunk-WTZVSMQZ.js} +5 -5
  123. package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
  124. package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
  125. package/dist/chunk-XC5POIL4.js +68 -0
  126. package/dist/{chunk-XZ6UFQ52.js → chunk-XTLJDC2X.js} +22 -17
  127. package/dist/{chunk-7EEGBKV4.js → chunk-YGIV24MF.js} +8 -8
  128. package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
  129. package/dist/{chunk-4N2RZ4TO.js → chunk-YKIIWURD.js} +3 -3
  130. package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
  131. package/dist/{chunk-KS7ETA3P.js → chunk-YXANQGCX.js} +6 -6
  132. package/dist/{chunk-HOX4YZ2K.js → chunk-YXFKLMX2.js} +5 -5
  133. package/dist/chunk-ZST3FRCV.js +132 -0
  134. package/dist/cli/index.js +39 -37
  135. package/dist/{clio-L2P7S2R2.js → clio-BPBAPZGA.js} +9 -9
  136. package/dist/{code-nav-B5LNX4KU.js → code-nav-KBQ3RIFK.js} +33 -33
  137. package/dist/{components-63MMQKUT.js → components-6DKAXWFN.js} +10 -10
  138. package/dist/config-FWL5JK2H.js +270 -0
  139. package/dist/config-graph-ACDB26L2.js +156 -0
  140. package/dist/{configure-LMVQJ46J.js → configure-ZIZ4YV62.js} +48 -48
  141. package/dist/{context-7HJEWTTP.js → context-EZZPT2ZV.js} +49 -49
  142. package/dist/{context-YG2LZDYZ.js → context-VIL5MFRH.js} +86 -84
  143. package/dist/{context-XSZKKFBW.js → context-Z3GOBHDK.js} +16 -16
  144. package/dist/{context-clear-AC5NXHM2.js → context-clear-ZPB3L7MN.js} +72 -70
  145. package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
  146. package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
  147. package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-2GLBVF7L.js} +23 -22
  148. package/dist/{detail-H73BEF2N.js → detail-VSBWYSGZ.js} +73 -71
  149. package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-EEEHGKX4.js} +78 -76
  150. package/dist/docs-VMMWFVHL.js +101 -0
  151. package/dist/{doctor-EQYJOGUG.js → doctor-V5L4IQGP.js} +63 -62
  152. package/dist/{eval-4P7O6CCE.js → eval-VJYJ2BV3.js} +80 -65
  153. package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
  154. package/dist/evals-J2H5V6DD.js +104 -0
  155. package/dist/{evidence-D6GUSYJW.js → evidence-POWAEBEW.js} +72 -70
  156. package/dist/evidence-XCCCLS36.js +242 -0
  157. package/dist/{evidence-O76QF7TZ.js → evidence-Y35YSXH6.js} +80 -78
  158. package/dist/{evolve-H47BCETS.js → evolve-GPG72VB6.js} +74 -72
  159. package/dist/{extensions-NNL3ZOCU.js → extensions-YIZ7W3DA.js} +12 -11
  160. package/dist/fleet-2MDCQ2VK.js +264 -0
  161. package/dist/{fleet-KMNS6NOM.js → fleet-W2AF3TOJ.js} +127 -123
  162. package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-WS56G26H.js} +11 -11
  163. package/dist/fleet-decisions-MYGZ3JW7.js +52 -0
  164. package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-ELTBXBAV.js} +22 -22
  165. package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-45IK73L4.js} +84 -248
  166. package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-T5NCZKHE.js} +4 -4
  167. package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-VG4JBLA4.js} +26 -26
  168. package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-VTSABAYO.js} +72 -70
  169. package/dist/{fleet-view-BHJFW26B.js → fleet-view-XC7WMKSS.js} +75 -73
  170. package/dist/{init-XAT5N5YM.js → init-VTJNNTIP.js} +95 -92
  171. package/dist/install-6PIF6F6W.js +19 -0
  172. package/dist/{interop-FVECHFKG.js → interop-IU6BNA7C.js} +25 -25
  173. package/dist/{inventory-7KFQGLCV.js → inventory-QPQUTUUZ.js} +75 -73
  174. package/dist/{library-NY2XOT75.js → library-HUTAS57T.js} +33 -33
  175. package/dist/{library-QAPAO23R.js → library-LF7DLU6S.js} +13 -13
  176. package/dist/library-Q3NWL5CM.js +75 -0
  177. package/dist/{library-import-5Y6MAS3R.js → library-import-PPW4YUC5.js} +25 -25
  178. package/dist/{library-inventory-JT6HWITQ.js → library-inventory-DIRVFRZU.js} +19 -19
  179. package/dist/{library-validation-EQUH25DC.js → library-validation-XHUZ3INE.js} +17 -17
  180. package/dist/{memory-DYVTTCP6.js → memory-Z2LSKNV6.js} +74 -72
  181. package/dist/{models-MASFJ6Y2.js → models-3FTREYPY.js} +53 -52
  182. package/dist/{monitor-YMP4NXJJ.js → monitor-HF2MQRB3.js} +83 -80
  183. package/dist/{orchestrator-AFQRRTEI.js → orchestrator-UYPA6W4S.js} +498 -358
  184. package/dist/{panes-NICTHQCV.js → panes-736XB73K.js} +14 -14
  185. package/dist/{panes-D3Y2KFG5.js → panes-C4P3PIWT.js} +4 -4
  186. package/dist/{paths-PSFAUIGO.js → paths-JQ4QYIYB.js} +6 -6
  187. package/dist/{preload-5Q7VXRFJ.js → preload-XSLRYH3Y.js} +72 -70
  188. package/dist/{reset-7NKZK7JN.js → reset-V7QSPZYE.js} +9 -9
  189. package/dist/{resources-NILSIZAT.js → resources-OJGDFHYT.js} +22 -22
  190. package/dist/{run-BPZGEBZV.js → run-T354SMDW.js} +129 -125
  191. package/dist/settings-MWZXO6RV.js +72 -0
  192. package/dist/{share-EZ6ERBMH.js → share-Y5ZKJPND.js} +26 -26
  193. package/dist/{skills-BTVVNYVM.js → skills-4GLZC4LN.js} +28 -28
  194. package/dist/{skills-eval-UY34MNK7.js → skills-eval-L5T7GODM.js} +87 -85
  195. package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-LASKXEZI.js} +22 -22
  196. package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-OIMRU36D.js} +49 -49
  197. package/dist/{steer-2B3EQGFH.js → steer-KMAM2Y2C.js} +4 -4
  198. package/dist/{support-L2SOL3IE.js → support-AWC3XKPX.js} +8 -8
  199. package/dist/system-CD75NYBU.js +116 -0
  200. package/dist/{targets-44VKGFLN.js → targets-VSZX2J2S.js} +66 -65
  201. package/dist/{tasks-3KODKFU7.js → tasks-AN567LYH.js} +14 -14
  202. package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-6KTWNHVY.js} +3 -3
  203. package/dist/{tools-3UB7TEVR.js → tools-AGRK3V5J.js} +13 -13
  204. package/dist/{trace-TAMIU4OJ.js → trace-P4MQZD33.js} +18 -67
  205. package/dist/{uninstall-QYVRPEM4.js → uninstall-BRUTEPIC.js} +37 -12
  206. package/dist/{upgrade-7PMKM2JH.js → upgrade-SBCGHQGJ.js} +22 -21
  207. package/dist/{usage-6EQV7EQK.js → usage-BIDVTO6V.js} +93 -87
  208. package/dist/{verifiers-JLITWSHU.js → verifiers-LTGCAMXS.js} +12 -12
  209. package/dist/{verify-T7NAEVIG.js → verify-OZU4LLNP.js} +9 -9
  210. package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
  211. package/dist/web/client/assets/abnfDiagram-VCTEODGH-C5wfoHm3.js +1 -0
  212. package/dist/web/client/assets/arc-oH91sfLl.js +1 -0
  213. package/dist/web/client/assets/architecture-7GRP2DOG-EGozsYEO.js +1 -0
  214. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-z9FokbJl.js +36 -0
  215. package/dist/web/client/assets/array-BifhSqXX.js +1 -0
  216. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  217. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  218. package/dist/web/client/assets/blockDiagram-I7D4REHJ-wi0_CYHL.js +129 -0
  219. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DV7NYc2W.js +38 -0
  220. package/dist/web/client/assets/channel-CiUWbHN9.js +1 -0
  221. package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  222. package/dist/web/client/assets/chunk-4HAMMTFA-Bhsegh3F.js +62 -0
  223. package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  224. package/dist/web/client/assets/chunk-75Z2AOVW-RQCckcQG.js +2 -0
  225. package/dist/web/client/assets/chunk-DU6HZSFF-C5USiOAy.js +125 -0
  226. package/dist/web/client/assets/chunk-F27PBJKO-BcNqv2x1.js +1 -0
  227. package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
  228. package/dist/web/client/assets/chunk-GMAD6QVW-Bq8JWiZT.js +72 -0
  229. package/dist/web/client/assets/chunk-GVQU2GXP-DbchrAeJ.js +1 -0
  230. package/dist/web/client/assets/chunk-IMKFNOWR-DrpvjocK.js +231 -0
  231. package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  232. package/dist/web/client/assets/chunk-L3NEJ4N5-DHLmTnCe.js +1 -0
  233. package/dist/web/client/assets/chunk-OSK3NFVY-CsRbtN9n.js +10 -0
  234. package/dist/web/client/assets/chunk-P2QGCYS3-aqPbxoMh.js +1 -0
  235. package/dist/web/client/assets/chunk-POPQ4Y6H-Dl5vw0h0.js +1 -0
  236. package/dist/web/client/assets/chunk-PWAF6VOD-D7OBRSdO.js +1 -0
  237. package/dist/web/client/assets/chunk-SHT3W25Y-CdKCIwuB.js +168 -0
  238. package/dist/web/client/assets/chunk-SVP7TREG-B94Nu_1-.js +88 -0
  239. package/dist/web/client/assets/chunk-TICWLB2K-jjRQI_hk.js +206 -0
  240. package/dist/web/client/assets/chunk-XXDRQBXY-azkbKE37.js +1 -0
  241. package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  242. package/dist/web/client/assets/classDiagram-ZZMXUADV-CMODalmo.js +1 -0
  243. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-CMODalmo.js +1 -0
  244. package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  245. package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  246. package/dist/web/client/assets/cose-bilkent-JH36ORCC-RbQL23qS.js +1 -0
  247. package/dist/web/client/assets/cynefin-OW5HDTMX--i9RDU5f.js +1 -0
  248. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-cRcvyBdp.js +62 -0
  249. package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
  250. package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
  251. package/dist/web/client/assets/dagre-GXQ25YYZ-C9mZmAPe.js +4 -0
  252. package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
  253. package/dist/web/client/assets/diagram-S7CK7UJ4-Oj_zlLDY.js +30 -0
  254. package/dist/web/client/assets/diagram-UQ7AKVKN-BWKbbfcR.js +41 -0
  255. package/dist/web/client/assets/diagram-VSXAHHWV-C3N3f7DO.js +3 -0
  256. package/dist/web/client/assets/diagram-VX7I27RA-CtDKDAWe.js +24 -0
  257. package/dist/web/client/assets/diagram-Z3DM3KII-B8bkBRCz.js +24 -0
  258. package/dist/web/client/assets/dist-D0_q-A2b.js +1 -0
  259. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-CskW-Whx.js +1 -0
  260. package/dist/web/client/assets/erDiagram-RLTQ6QDP-C-83cgCW.js +99 -0
  261. package/dist/web/client/assets/eventmodeling-NTZA5JFV-DjVq8wKU.js +1 -0
  262. package/dist/web/client/assets/flowDiagram-HODETNUW-BUiCBGXt.js +1 -0
  263. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-B2lb8lvF.js +292 -0
  264. package/dist/web/client/assets/gitGraph-4MIJSDKK-B40cQtBE.js +1 -0
  265. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CH-7P7Di.js +106 -0
  266. package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
  267. package/dist/web/client/assets/index-Dsi52apB.css +1 -0
  268. package/dist/web/client/assets/index-FSIC94pi.js +83 -0
  269. package/dist/web/client/assets/info-A6RAGUB7-eCCE9D_Q.js +1 -0
  270. package/dist/web/client/assets/infoDiagram-27XIBGKW-DRnvqMjM.js +2 -0
  271. package/dist/web/client/assets/init-C-OQMol4.js +1 -0
  272. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-DBA_55wp.js +70 -0
  273. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-C-ewpNl7.js +139 -0
  274. package/dist/web/client/assets/kanban-definition-UXKFOSKX-B1taGsu0.js +89 -0
  275. package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
  276. package/dist/web/client/assets/line-lZ0kyxDI.js +1 -0
  277. package/dist/web/client/assets/linear-DIc8FgZj.js +1 -0
  278. package/dist/web/client/assets/mermaid-parser.core-SXolxpXw.js +7 -0
  279. package/dist/web/client/assets/mermaid.core-DXgQtkNg.js +44 -0
  280. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-DXJas9K7.js +96 -0
  281. package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  282. package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  283. package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  284. package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
  285. package/dist/web/client/assets/packet-AYTQ26CC-OqVl_07o.js +1 -0
  286. package/dist/web/client/assets/path-fybaL0A-.js +1 -0
  287. package/dist/web/client/assets/pegDiagram-XKGWAZYB-CPE_zdfN.js +1 -0
  288. package/dist/web/client/assets/pie-WAS4IAKB-DAxnMBLe.js +1 -0
  289. package/dist/web/client/assets/pieDiagram-E7YTZNPT-Uwjpufxv.js +39 -0
  290. package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
  291. package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
  292. package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
  293. package/dist/web/client/assets/prism-core-BngLtbUd.js +1 -0
  294. package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
  295. package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
  296. package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
  297. package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
  298. package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
  299. package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
  300. package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
  301. package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
  302. package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
  303. package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
  304. package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
  305. package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
  306. package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
  307. package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
  308. package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
  309. package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
  310. package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
  311. package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
  312. package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
  313. package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
  314. package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
  315. package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
  316. package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
  317. package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
  318. package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
  319. package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
  320. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-Bjs4yjgs.js +7 -0
  321. package/dist/web/client/assets/radar-RG4KPBEZ-CuCKjHM3.js +1 -0
  322. package/dist/web/client/assets/railroad-74A4TZTK-CnQK-Cc1.js +1 -0
  323. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-BcW01NZG.js +1 -0
  324. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-B7YCEDDd.js +1 -0
  325. package/dist/web/client/assets/railroad-peg-WCYAUIDC-DjNZbSTZ.js +1 -0
  326. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-BDDIPNLL.js +1 -0
  327. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-B5Ydyxc1.js +84 -0
  328. package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
  329. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-Bw2Qym75.js +40 -0
  330. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-BZf36nO0.js +162 -0
  331. package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  332. package/dist/web/client/assets/src-yeptRXpt.js +1 -0
  333. package/dist/web/client/assets/stateDiagram-D77RDMKH-DnH6JRkp.js +1 -0
  334. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-C7QtHeK4.js +1 -0
  335. package/dist/web/client/assets/swimlanes-42K2YHIH-D9PZmtZg.js +1 -0
  336. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-CBZlPFky.js +8 -0
  337. package/dist/web/client/assets/timeline-definition-24CTP7MA-CrkZZBo7.js +120 -0
  338. package/dist/web/client/assets/treeView-Q6P3EWNA-C9zDShoC.js +1 -0
  339. package/dist/web/client/assets/treemap-WGGIJYW6-B-plj9yK.js +1 -0
  340. package/dist/web/client/assets/vennDiagram-4TSXK5OY-VeOdaphN.js +34 -0
  341. package/dist/web/client/assets/wardley-WFR3VGLG-Wl1P_m6L.js +1 -0
  342. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-B85-R9t2.js +78 -0
  343. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BrD8OW8m.js +7 -0
  344. package/dist/web/client/clio-coder-logo.webp +0 -0
  345. package/dist/web/client/icon-192.png +0 -0
  346. package/dist/web/client/icon-512.png +0 -0
  347. package/dist/web/client/index.html +4 -0
  348. package/dist/web/client/manifest.webmanifest +15 -0
  349. package/dist/web/client/offline.css +55 -0
  350. package/dist/web/client/offline.html +5 -0
  351. package/dist/web/client/offline.js +27 -0
  352. package/dist/web/client/sw.js +34 -0
  353. package/dist/web/ops-worker.js +37 -0
  354. package/dist/web/reads-worker.js +1726 -0
  355. package/dist/web/server.js +8499 -0
  356. package/dist/web-EU6ATJWA.js +13 -0
  357. package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-U22Q7HV4.js} +3 -3
  358. package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-LZRLFG6I.js} +98 -95
  359. package/dist/{with-panes-CHFC7HGI.js → with-panes-X5CZOGML.js} +9 -9
  360. package/dist/worker/entry.js +68 -68
  361. package/docs/README.md +27 -26
  362. package/docs/architecture/acp.md +5 -9
  363. package/docs/architecture/alcf-provider.md +0 -3
  364. package/docs/architecture/architecture.md +0 -3
  365. package/docs/architecture/artifact-placement.md +0 -3
  366. package/docs/architecture/artifact-versions.md +0 -3
  367. package/docs/architecture/capacity-and-scheduling.md +0 -3
  368. package/docs/architecture/context-engine.md +0 -3
  369. package/docs/architecture/context-working-set.md +0 -3
  370. package/docs/architecture/dispatch-architecture-rationale.md +0 -3
  371. package/docs/architecture/dispatch-typed-intent.md +0 -3
  372. package/docs/architecture/evidence-and-memory.md +0 -3
  373. package/docs/architecture/library.md +0 -2
  374. package/docs/architecture/middleware-and-components.md +0 -3
  375. package/docs/architecture/model-catalog.md +1 -4
  376. package/docs/architecture/observability.md +0 -3
  377. package/docs/architecture/pi-boundary.md +6 -9
  378. package/docs/architecture/prompt-envelope-and-tools.md +1 -4
  379. package/docs/architecture/provider-adapter-cookbook.md +1 -4
  380. package/docs/architecture/safety-model.md +0 -3
  381. package/docs/architecture/session-lifecycle.md +0 -3
  382. package/docs/architecture/time-conventions.md +0 -3
  383. package/docs/architecture/trace-store.md +28 -20
  384. package/docs/architecture/tui-design.md +1 -4
  385. package/docs/architecture/worker-context.md +1 -3
  386. package/docs/architecture/worker-dispatch-mechanics.md +1 -4
  387. package/docs/guide/authoring-plugins.md +1 -3
  388. package/docs/guide/built-in-agents.md +0 -3
  389. package/docs/guide/commands-and-modes.md +2 -6
  390. package/docs/guide/configuration-and-targets.md +197 -4
  391. package/docs/guide/configuration-reference.md +9 -4
  392. package/docs/guide/environment-variables.md +0 -3
  393. package/docs/guide/exit-codes-and-output.md +0 -3
  394. package/docs/guide/extensions-and-sharing.md +0 -3
  395. package/docs/guide/fleet-dispatch.md +0 -3
  396. package/docs/guide/glossary.md +0 -3
  397. package/docs/guide/harness-extensions.md +0 -2
  398. package/docs/guide/installation-and-lifecycle.md +1 -4
  399. package/docs/guide/interop.md +0 -2
  400. package/docs/guide/panes-and-files.md +0 -3
  401. package/docs/guide/plugins.md +0 -3
  402. package/docs/guide/proactive-memory.md +0 -3
  403. package/docs/guide/resource-library.md +0 -2
  404. package/docs/guide/skills-marketplace.md +0 -2
  405. package/docs/guide/tool-usage.md +0 -3
  406. package/docs/guide/troubleshooting.md +0 -3
  407. package/docs/history/config-knobs-audit.md +0 -3
  408. package/docs/history/release-cut-checklist.md +0 -3
  409. package/docs/process/development-pipeline.md +0 -3
  410. package/docs/process/documentation-coverage.md +3 -3
  411. package/docs/process/documentation-guide.md +15 -22
  412. package/docs/process/eval-runner.md +0 -3
  413. package/docs/process/evals-internal.md +0 -3
  414. package/docs/process/evolution.md +0 -3
  415. package/docs/process/fleet-demo-runbook.md +0 -3
  416. package/docs/process/git-commit-provenance.md +0 -3
  417. package/docs/process/performance-methodology.md +1 -4
  418. package/docs/process/release-cut-checklist.md +114 -221
  419. package/docs/process/scientific-validation.md +1 -4
  420. package/library/registry.yaml +2 -2
  421. package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
  422. package/library/skills/meta/clio-coder-test/evals.md +16 -2
  423. package/library/skills/meta/clio-coder-test/plugin.json +1 -1
  424. package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
  425. package/library/skills/registry.yaml +2 -2
  426. package/library/skills/skill-marketplace.json +1 -1
  427. package/package.json +13 -11
  428. package/src/cli/docs.ts +65 -328
  429. package/src/cli/index.ts +3 -1
  430. package/src/cli/trace.ts +4 -65
  431. package/src/cli/uninstall.ts +26 -0
  432. package/src/cli/usage.ts +3 -0
  433. package/src/cli/web.ts +79 -0
  434. package/src/core/bus-events.ts +3 -4
  435. package/src/core/config.ts +71 -0
  436. package/src/core/domain-loader.ts +37 -28
  437. package/src/core/termination.ts +13 -9
  438. package/src/domains/agents/contract.ts +1 -1
  439. package/src/domains/agents/extension.ts +18 -10
  440. package/src/domains/config/extension.ts +5 -4
  441. package/src/domains/dispatch/extension.ts +75 -12
  442. package/src/domains/dispatch/index.ts +1 -0
  443. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  444. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  445. package/src/domains/dispatch/state.ts +1 -2
  446. package/src/domains/dispatch/types.ts +2 -0
  447. package/src/domains/eval/metrics/tracked.ts +22 -2
  448. package/src/domains/extensions/operator-runtime.ts +3 -1
  449. package/src/domains/middleware/hooks.ts +2 -2
  450. package/src/domains/observability/background-memory-usage.ts +3 -0
  451. package/src/domains/observability/compaction-usage.ts +2 -0
  452. package/src/domains/observability/cost.ts +5 -0
  453. package/src/domains/observability/extension.ts +1 -0
  454. package/src/domains/observability/out-of-turn-usage.ts +2 -0
  455. package/src/domains/observability/trace-store.ts +65 -5
  456. package/src/domains/prompts/extension.ts +4 -17
  457. package/src/domains/providers/cache-deployment.ts +147 -0
  458. package/src/domains/providers/catalog.ts +12 -7
  459. package/src/domains/providers/extension.ts +27 -5
  460. package/src/domains/providers/index.ts +1 -0
  461. package/src/domains/providers/plugins.ts +3 -13
  462. package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
  463. package/src/domains/providers/types/target-descriptor.ts +17 -0
  464. package/src/domains/session/compaction/compact.ts +4 -1
  465. package/src/domains/session/entries.ts +1 -0
  466. package/src/domains/session/usage.ts +6 -7
  467. package/src/engine/acp/server.ts +11 -0
  468. package/src/engine/ai.ts +2 -0
  469. package/src/engine/apis/openai-completions.ts +9 -4
  470. package/src/engine/prewarm.ts +232 -0
  471. package/src/engine/provider-diagnostics.ts +6 -1
  472. package/src/entry/orchestrator.ts +20 -16
  473. package/src/interactive/chat-loop-messages.ts +3 -0
  474. package/src/interactive/chat-loop.ts +2 -8
  475. package/src/interactive/prewarm.ts +11 -197
  476. package/src/interactive/session-usage-reseed.ts +2 -0
  477. package/src/interactive/side-question.ts +2 -0
  478. package/src/interactive/turn-context.ts +1 -0
  479. package/src/interactive/turn-persistence.ts +3 -0
  480. package/src/interactive/turn-prewarm.ts +126 -19
  481. package/src/interactive/turn-runtime.ts +14 -0
  482. package/src/tools/builtin-tool-catalog.ts +8 -4
  483. package/src/tools/registry.ts +12 -2
  484. package/src/worker/spec-contract.ts +27 -0
  485. package/dist/docs-BL7ROUFN.js +0 -292
@@ -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
  };
@@ -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
  },
@@ -777,6 +789,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
777
789
  output: summary.output,
778
790
  cacheRead: summary.cacheRead,
779
791
  cacheWrite: summary.cacheWrite,
792
+ ...(summary.cacheWrite1h === undefined ? {} : { cacheWrite1h: summary.cacheWrite1h }),
780
793
  reasoningTokens: summary.reasoning,
781
794
  totalTokens: summary.tokens,
782
795
  apiCalls: summary.apiCalls,
@@ -911,6 +924,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
911
924
  });
912
925
 
913
926
  state.runtime = localRuntime;
927
+ runtimeTargetSettings = targetSettings;
914
928
  // Append a modelChange marker only when this rebuild replaces a prior
915
929
  // runtime, which is the cross-target swap case (mid-session change of
916
930
  // target or runtime id). On the initial build, the session header's
@@ -346,12 +346,16 @@ function withBuiltinMetadata<T extends ToolSpec>(spec: T): T {
346
346
  if (!metadata) return spec;
347
347
  // The read cap is a guardrail (`safety.limits.readBytesPerCall`) installed
348
348
  // from settings after this module loads, so the table's import-time value
349
- // is the default, not the operator's. Recompute the policy cap when the tool
350
- // is registered; the drift check in policy.ts compares against the live cap
351
- // and a settings file raising the read cap used to fail boot.
349
+ // is the default, not the operator's. Resolve the policy cap when consumed
350
+ // so registration checks and result shaping follow later settings changes.
352
351
  const resultSizePolicy =
353
352
  spec.name === ToolNames.Read
354
- ? observePolicy(readMaxBytes(), metadata.resultSizePolicy?.followUpHint ?? "")
353
+ ? {
354
+ ...metadata.resultSizePolicy,
355
+ get maxBytes() {
356
+ return policyCap(readMaxBytes());
357
+ },
358
+ }
355
359
  : metadata.resultSizePolicy;
356
360
  return withMetadata(spec, {
357
361
  ...metadata,
@@ -486,7 +486,12 @@ export function createRegistry(deps: RegistryDeps): ToolRegistry {
486
486
  });
487
487
  const digest = toolResultDigestFor(spec, result, resultDisposition, options);
488
488
  const afterEffects = runToolHook("after_tool", spec, call, decision, options, result, digest);
489
- const finalResult = shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options, resultDisposition);
489
+ const finalResult = shapeToolResult(
490
+ spec,
491
+ applyToolResultEffects(result, [...beforeEffects, ...afterEffects]),
492
+ options,
493
+ resultDisposition,
494
+ );
490
495
  return { kind: "ok", result: finalResult, decision };
491
496
  } catch (err) {
492
497
  const message = err instanceof Error ? err.message : String(err);
@@ -495,7 +500,12 @@ export function createRegistry(deps: RegistryDeps): ToolRegistry {
495
500
  const afterEffects = runToolHook("after_tool", spec, call, decision, options, result, digest);
496
501
  return {
497
502
  kind: "ok",
498
- result: shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options, resultDisposition),
503
+ result: shapeToolResult(
504
+ spec,
505
+ applyToolResultEffects(result, [...beforeEffects, ...afterEffects]),
506
+ options,
507
+ resultDisposition,
508
+ ),
499
509
  decision,
500
510
  };
501
511
  }
@@ -381,6 +381,33 @@ function validateTarget(value: unknown, runtimeId: string, runtimeAliases: Reado
381
381
  readOptionalEnum(target, "lifecycle", "WorkerSpec.target", TARGET_LIFECYCLES);
382
382
  if (target.auth !== undefined) validateTargetAuth(target.auth);
383
383
  if (target.pricing !== undefined) validateTargetPricing(target.pricing);
384
+ if (target.cache !== undefined) {
385
+ const cache = readRecord(target.cache, "WorkerSpec.target.cache");
386
+ readOptionalEnum(cache, "retention", "WorkerSpec.target.cache", ["none", "short", "long"] as const);
387
+ if (cache.deployment !== undefined) {
388
+ const binding = readRecord(cache.deployment, "WorkerSpec.target.cache.deployment");
389
+ readString(binding.backend, "WorkerSpec.target.cache.deployment.backend");
390
+ readOptionalEnum(binding, "backend", "WorkerSpec.target.cache.deployment", ["llamacpp", "vllm"] as const);
391
+ for (const key of ["controlUrl", "model", "build"])
392
+ readString(binding[key], `WorkerSpec.target.cache.deployment.${key}`);
393
+ readOptionalString(binding, "gatewayDeploymentId", "WorkerSpec.target.cache.deployment");
394
+ const url = new URL(readString(binding.controlUrl, "WorkerSpec.target.cache.deployment.controlUrl"));
395
+ if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.search || url.hash)
396
+ throw new Error(
397
+ "WorkerSpec.target.cache.deployment.controlUrl must be HTTP(S) without credentials, query, or fragment",
398
+ );
399
+ }
400
+ if (cache.warm !== undefined) {
401
+ const warm = readRecord(cache.warm, "WorkerSpec.target.cache.warm");
402
+ for (const key of ["maxInputTokens", "maxDurationMs", "cooldownMs"]) {
403
+ if (
404
+ warm[key] !== undefined &&
405
+ (typeof warm[key] !== "number" || !Number.isSafeInteger(warm[key]) || (warm[key] as number) < 1)
406
+ )
407
+ throw new Error(`WorkerSpec.target.cache.warm.${key} must be a positive safe integer`);
408
+ }
409
+ }
410
+ }
384
411
  if (target.capabilities !== undefined) validateCapabilityPatch(target.capabilities, "WorkerSpec.target.capabilities");
385
412
  }
386
413