@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
@@ -205,7 +205,7 @@ export function createPromptsBundle(
205
205
 
206
206
  let unsubscribeContextSources: (() => void) | null = null;
207
207
  let unsubscribeHotReload: (() => void) | null = null;
208
- let unsubscribeExtensionsReload: (() => void) | null = null;
208
+ let unsubscribePluginsReload: (() => void) | null = null;
209
209
  const extension: DomainExtension = {
210
210
  async start() {
211
211
  try {
@@ -226,28 +226,15 @@ export function createPromptsBundle(
226
226
  if (!diffTouchesFragments(paths)) return;
227
227
  reload();
228
228
  });
229
- // Extension prompt and skill roots feed fragments through the
230
- // resources domain; a committed generation with new content means
231
- // the table must be rebuilt from the new roots.
232
- const onResourceReload = (payload: unknown) => {
233
- if ((payload as { changed?: unknown } | undefined)?.changed !== true) return;
234
- reload();
235
- };
236
- const unsubscribe = [
237
- context.bus.on(BusChannels.ExtensionsReloaded, onResourceReload),
238
- context.bus.on(BusChannels.PluginsReloaded, () => reload()),
239
- ];
240
- unsubscribeExtensionsReload = () => {
241
- for (const stop of unsubscribe) stop();
242
- };
229
+ unsubscribePluginsReload = context.bus.on(BusChannels.PluginsReloaded, () => reload());
243
230
  },
244
231
  async stop() {
245
232
  unsubscribeContextSources?.();
246
233
  unsubscribeContextSources = null;
247
234
  unsubscribeHotReload?.();
248
235
  unsubscribeHotReload = null;
249
- unsubscribeExtensionsReload?.();
250
- unsubscribeExtensionsReload = null;
236
+ unsubscribePluginsReload?.();
237
+ unsubscribePluginsReload = null;
251
238
  sessionSourceSnapshots.clear();
252
239
  },
253
240
  };
@@ -0,0 +1,147 @@
1
+ import { canonicalEndpointUrl } from "../../core/endpoint-key.js";
2
+ import type { TargetDescriptor } from "./types/target-descriptor.js";
3
+
4
+ /** Fresh observations, not a persisted cache handle or permission to administer a server. */
5
+ export interface CacheDeploymentObservation {
6
+ observedAt: number;
7
+ backend: "llamacpp" | "vllm" | "unknown";
8
+ model: string;
9
+ build: string | null;
10
+ /** Absent server epoch stays unknown; Clio never invents one from a build number. */
11
+ epoch: string | null;
12
+ endpoint: string | null;
13
+ requestControls: ReadonlyArray<"cache_prompt">;
14
+ warm: "bounded" | "unsupported";
15
+ administration: "unsupported";
16
+ reason: string;
17
+ }
18
+
19
+ function record(value: unknown): Record<string, unknown> {
20
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? (value as Record<string, unknown>) : {};
21
+ }
22
+
23
+ /**
24
+ * Read-only admission evidence. Every invocation probes again, so an old route,
25
+ * build, resident state or process epoch is never reused to authorize a warm.
26
+ * Control-plane credentials are deliberately independent: this initial reader
27
+ * sends none. An authenticated/unknown control plane remains passive.
28
+ */
29
+ export async function observeCacheDeployment(
30
+ target: TargetDescriptor,
31
+ wireModelId: string,
32
+ options: { signal?: AbortSignal; gatewayApiKey?: string; fetchImpl?: typeof fetch } = {},
33
+ ): Promise<CacheDeploymentObservation> {
34
+ const binding = target.cache?.deployment;
35
+ const observation: CacheDeploymentObservation = {
36
+ observedAt: Date.now(),
37
+ backend: binding?.backend ?? "unknown",
38
+ model: binding?.model ?? wireModelId,
39
+ build: null,
40
+ epoch: null,
41
+ endpoint: null,
42
+ requestControls: [],
43
+ warm: "unsupported",
44
+ administration: "unsupported",
45
+ reason: "deployment-unbound",
46
+ };
47
+ if (!binding) return observation;
48
+ try {
49
+ const control = new URL(binding.controlUrl);
50
+ if (
51
+ !["http:", "https:"].includes(control.protocol) ||
52
+ control.username ||
53
+ control.password ||
54
+ control.search ||
55
+ control.hash
56
+ ) {
57
+ return { ...observation, reason: "deployment-invalid" };
58
+ }
59
+ const root = control.href.replace(/\/$/, "").replace(/\/v1$/, "");
60
+ observation.endpoint = canonicalEndpointUrl(root);
61
+ const signal = AbortSignal.any([AbortSignal.timeout(2000), ...(options.signal ? [options.signal] : [])]);
62
+ const get = async (url: string, headers?: Record<string, string>) => {
63
+ const response = await (options.fetchImpl ?? fetch)(url, {
64
+ method: "GET",
65
+ signal,
66
+ redirect: "error",
67
+ credentials: "omit",
68
+ ...(headers ? { headers } : {}),
69
+ });
70
+ if (!response.ok) throw new Error("discovery unavailable");
71
+ return (await response.json()) as unknown;
72
+ };
73
+ const gateway = target.runtime === "litellm";
74
+ if (gateway) {
75
+ if (!binding.gatewayDeploymentId || !target.url) return { ...observation, reason: "gateway-unbound" };
76
+ const gatewayRoot = target.url.replace(/\/$/, "").replace(/\/v1$/, "");
77
+ const info = record(
78
+ await get(`${gatewayRoot}/v1/model/info`, {
79
+ ...target.auth?.headers,
80
+ ...(options.gatewayApiKey ? { authorization: `Bearer ${options.gatewayApiKey}` } : {}),
81
+ }),
82
+ );
83
+ const rows = Array.isArray(info.data) ? info.data.map(record).filter((row) => row.model_name === wireModelId) : [];
84
+ // Multiple replicas/fallback routes do not establish a single physical
85
+ // cache. A deployment response header arrives too late for admission.
86
+ const row = rows.length === 1 ? rows[0] : undefined;
87
+ const params = record(row?.litellm_params);
88
+ const modelInfo = record(row?.model_info);
89
+ if (
90
+ !row ||
91
+ modelInfo.id !== binding.gatewayDeploymentId ||
92
+ (params.model !== binding.model && params.model !== `openai/${binding.model}`) ||
93
+ canonicalEndpointUrl(typeof params.api_base === "string" ? params.api_base : undefined) !== observation.endpoint
94
+ ) {
95
+ return { ...observation, reason: "gateway-route-mismatch" };
96
+ }
97
+ } else if (
98
+ target.runtime !== binding.backend ||
99
+ wireModelId !== binding.model ||
100
+ canonicalEndpointUrl(target.url) !== observation.endpoint
101
+ ) {
102
+ return { ...observation, reason: "deployment-mismatch" };
103
+ }
104
+ if (binding.backend === "vllm") {
105
+ const version = record(await get(`${root}/version`));
106
+ observation.build = typeof version.version === "string" ? version.version : null;
107
+ // APC and queue/memory metrics vary by deployment. A version and an
108
+ // OpenAI schema alone establish neither APC nor safe speculative load.
109
+ return {
110
+ ...observation,
111
+ reason: observation.build === binding.build ? "vllm-scheduler-unverified" : "deployment-build-mismatch",
112
+ };
113
+ }
114
+ let props = record(await get(`${root}/props`));
115
+ const router = props.role === "router";
116
+ if (router) {
117
+ const models = record(await get(`${root}/models`));
118
+ const selected = Array.isArray(models.data)
119
+ ? models.data.map(record).find((row) => row.id === binding.model)
120
+ : undefined;
121
+ if (record(selected?.status).value !== "loaded") return { ...observation, reason: "model-not-loaded" };
122
+ // Never wake sleeping models or load an absent worker during discovery.
123
+ props = record(await get(`${root}/props?model=${encodeURIComponent(binding.model)}&autoload=false`));
124
+ }
125
+ observation.build = typeof props.build_info === "string" ? props.build_info : null;
126
+ if (observation.build !== binding.build) return { ...observation, reason: "deployment-build-mismatch" };
127
+ if (!observation.build.endsWith("-c841aee"))
128
+ return { ...observation, reason: "deployment-cache-protocol-unverified" };
129
+ if (props.is_sleeping !== false) return { ...observation, reason: "model-not-loaded" };
130
+ if (typeof props.model_alias === "string" && props.model_alias !== binding.model)
131
+ return { ...observation, reason: "deployment-model-mismatch" };
132
+ if (!router) {
133
+ const models = record(await get(`${root}/v1/models`));
134
+ if (!Array.isArray(models.data) || models.data.length !== 1 || record(models.data[0]).id !== binding.model)
135
+ return { ...observation, reason: "deployment-model-mismatch" };
136
+ }
137
+ if (typeof props.start_time === "string") observation.epoch = props.start_time;
138
+ const slots = await get(`${root}/slots?model=${encodeURIComponent(binding.model)}&autoload=false`);
139
+ if (!Array.isArray(slots) || slots.length === 0 || slots.some((slot) => record(slot).is_processing !== false)) {
140
+ return { ...observation, reason: "endpoint-busy-or-unknown" };
141
+ }
142
+ if (gateway) return { ...observation, reason: "gateway-cache-transport-unverified" };
143
+ return { ...observation, requestControls: ["cache_prompt"], warm: "bounded", reason: "loaded-idle-deployment" };
144
+ } catch {
145
+ return { ...observation, reason: options.signal?.aborted ? "superseded" : "deployment-unavailable" };
146
+ }
147
+ }
@@ -148,7 +148,7 @@ export function synthesizeCatalogBackedModel(input: CatalogBackedSynthesisInput)
148
148
  }
149
149
  const pricing = input.target.pricing;
150
150
  const targetHeaders = input.target.auth?.headers;
151
- const model: Model<Api> = {
151
+ const model: Model<Api> & { clioCoder?: { cache: NonNullable<TargetDescriptor["cache"]> } } = {
152
152
  ...catalogFields,
153
153
  id: input.wireModelId,
154
154
  name: `${input.wireModelId} (${input.target.id})`,
@@ -160,14 +160,19 @@ export function synthesizeCatalogBackedModel(input: CatalogBackedSynthesisInput)
160
160
  input.defaultBaseUrl,
161
161
  reasoning: caps.reasoning,
162
162
  input: caps.vision ? (builtin?.input.includes("image") ? builtin.input : ["text", "image"]) : ["text"],
163
- cost: {
164
- input: pricing?.input ?? builtin?.cost.input ?? 0,
165
- output: pricing?.output ?? builtin?.cost.output ?? 0,
166
- cacheRead: pricing?.cacheRead ?? builtin?.cost.cacheRead ?? 0,
167
- cacheWrite: pricing?.cacheWrite ?? builtin?.cost.cacheWrite ?? 0,
168
- },
163
+ // Catalog tiers belong to the catalog rates. An explicit target price
164
+ // replaces that schedule, using the same defaults as resolveEffectivePricing.
165
+ cost: pricing
166
+ ? {
167
+ input: pricing.input,
168
+ output: pricing.output,
169
+ cacheRead: pricing.cacheRead ?? 0,
170
+ cacheWrite: pricing.cacheWrite ?? 0,
171
+ }
172
+ : structuredClone(builtin?.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }),
169
173
  contextWindow: caps.contextWindow,
170
174
  maxTokens: caps.maxTokens,
175
+ ...(input.target.cache === undefined ? {} : { clioCoder: { cache: structuredClone(input.target.cache) } }),
171
176
  };
172
177
  const headers = { ...(input.defaultHeaders ?? {}), ...(builtin?.headers ?? {}), ...(targetHeaders ?? {}) };
173
178
  if (Object.keys(headers).length > 0) {
@@ -257,6 +257,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
257
257
  const statuses = new Map<string, TargetStatus>();
258
258
  const reasoningCache = new Map<string, boolean>();
259
259
  const unsubscribeConfigListeners: Array<() => void> = [];
260
+ let stopped = false;
260
261
 
261
262
  function reasoningCacheKey(targetId: string, modelId: string): string {
262
263
  return `${targetId}:${modelId}`;
@@ -268,6 +269,11 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
268
269
  return readSettings();
269
270
  }
270
271
 
272
+ function currentProbeTarget(probed: TargetDescriptor): TargetDescriptor | undefined {
273
+ if (stopped) return undefined;
274
+ return readConfig().targets.find((target) => sameProbeIdentity(probed, target));
275
+ }
276
+
271
277
  async function buildProbeContextForTarget(
272
278
  target: TargetDescriptor,
273
279
  desc: RuntimeDescriptor,
@@ -323,6 +329,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
323
329
  probe: ProbeResult | null,
324
330
  previous?: TargetStatus,
325
331
  ): TargetStatus {
332
+ if (previous && !sameProbeIdentity(previous.target, target)) previous = undefined;
326
333
  if (!desc) {
327
334
  const out: TargetStatus = {
328
335
  target,
@@ -385,8 +392,11 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
385
392
  target: TargetDescriptor,
386
393
  live: boolean,
387
394
  options?: { reasoning?: boolean; signal?: AbortSignal },
388
- ): Promise<TargetStatus> {
395
+ ): Promise<TargetStatus | null> {
389
396
  options?.signal?.throwIfAborted();
397
+ if (stopped) return null;
398
+ // A probe owns the descriptor it started with across asynchronous I/O.
399
+ target = structuredClone(target);
390
400
  const previous = statuses.get(target.id);
391
401
  const desc = registry.get(target.runtime);
392
402
  if (!desc) {
@@ -402,6 +412,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
402
412
  }
403
413
  const probeCtx = await buildProbeContextForTarget(target, desc, options?.signal);
404
414
  options?.signal?.throwIfAborted();
415
+ if (!currentProbeTarget(target)) return null;
405
416
  let probeResult: ProbeResult;
406
417
  try {
407
418
  probeResult = await desc.probe(target, probeCtx);
@@ -409,6 +420,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
409
420
  probeResult = { ok: false, error: err instanceof Error ? err.message : String(err) };
410
421
  }
411
422
  options?.signal?.throwIfAborted();
423
+ if (!currentProbeTarget(target)) return null;
412
424
  if (probeResult.ok && typeof desc.probeModels === "function" && !probeResult.models) {
413
425
  try {
414
426
  const ids = await desc.probeModels(target, probeCtx);
@@ -418,6 +430,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
418
430
  }
419
431
  }
420
432
  options?.signal?.throwIfAborted();
433
+ if (!currentProbeTarget(target)) return null;
421
434
  if (probeResult.ok && options?.reasoning !== false && typeof desc.probeReasoning === "function") {
422
435
  const settings = readConfig();
423
436
  const orchestratorTarget = settings.chat.target === target.id ? settings.chat.model : null;
@@ -426,6 +439,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
426
439
  try {
427
440
  const result = await desc.probeReasoning(target, candidateModelId, probeCtx);
428
441
  options?.signal?.throwIfAborted();
442
+ if (!currentProbeTarget(target)) return null;
429
443
  reasoningCache.set(reasoningCacheKey(target.id, candidateModelId), result.reasoning);
430
444
  const capabilityModelId = probeResult.capabilityModelId ?? null;
431
445
  if (capabilityModelId === null || capabilityModelId === candidateModelId) {
@@ -447,9 +461,11 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
447
461
  }
448
462
  }
449
463
  }
450
- // A cancelled role preparation must not publish failed/stale target state.
464
+ // Cancellation, target edits/removal, and shutdown revoke publication.
451
465
  options?.signal?.throwIfAborted();
452
- const status = buildStatus(target, desc, probeResult, previous);
466
+ const current = currentProbeTarget(target);
467
+ if (!current) return null;
468
+ const status = buildStatus(current, desc, probeResult, previous);
453
469
  statuses.set(target.id, status);
454
470
  if (probeResult.ok && probeResult.models !== undefined) {
455
471
  recordTargetModelSnapshot(
@@ -467,14 +483,18 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
467
483
  }
468
484
 
469
485
  async function probeReasoningForModelInternal(targetId: string, modelId: string): Promise<boolean | null> {
486
+ if (stopped) return null;
470
487
  const settings = readConfig();
471
- const target = settings.targets.find((ep) => ep.id === targetId);
472
- if (!target) return null;
488
+ const configuredTarget = settings.targets.find((ep) => ep.id === targetId);
489
+ if (!configuredTarget) return null;
490
+ const target = structuredClone(configuredTarget);
473
491
  const desc = registry.get(target.runtime);
474
492
  if (!desc || typeof desc.probeReasoning !== "function") return null;
475
493
  const probeCtx = await buildProbeContextForTarget(target, desc);
494
+ if (!currentProbeTarget(target)) return null;
476
495
  try {
477
496
  const result = await desc.probeReasoning(target, modelId, probeCtx);
497
+ if (!currentProbeTarget(target)) return null;
478
498
  reasoningCache.set(reasoningCacheKey(targetId, modelId), result.reasoning);
479
499
  return result.reasoning;
480
500
  } catch {
@@ -508,6 +528,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
508
528
 
509
529
  const extension: DomainExtension = {
510
530
  async start() {
531
+ stopped = false;
511
532
  ensurePiAiRegistered();
512
533
  registerClioApiProviders();
513
534
  registerClioOAuthProviders();
@@ -528,6 +549,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
528
549
  }
529
550
  },
530
551
  async stop() {
552
+ stopped = true;
531
553
  for (const unsubscribe of unsubscribeConfigListeners.splice(0)) unsubscribe();
532
554
  },
533
555
  };
@@ -24,6 +24,7 @@ export {
24
24
  resolveRuntimeAuthTarget,
25
25
  targetRequiresAuth,
26
26
  } from "./auth/index.js";
27
+ export { type CacheDeploymentObservation, observeCacheDeployment } from "./cache-deployment.js";
27
28
  export { AGENT_ROLE_TOOLS_REQUIRED_REASON, mergeCapabilities, supportsAgentRoleTools } from "./capabilities.js";
28
29
  export type { ProvidersContract, TargetHealth, TargetStatus } from "./contract.js";
29
30
  export { isDispatchEligibleRuntime, isOrchestratorEligibleRuntime, isTargetEligibleRuntime } from "./eligibility.js";
@@ -14,29 +14,19 @@
14
14
 
15
15
  import { join } from "node:path";
16
16
 
17
+ import type { ClioSettings } from "../../core/config.js";
17
18
  import { clioConfigDir } from "../../core/xdg.js";
18
19
  import { activateExternalPluginApiBridge } from "../../engine/api-registry.js";
19
20
  import type { RuntimeRegistry } from "./registry.js";
20
21
 
21
- interface PluginSettings {
22
- runtimePlugins?: unknown;
23
- }
24
-
25
- function extractPluginPackages(settings: unknown): string[] {
26
- if (!settings || typeof settings !== "object") return [];
27
- const raw = (settings as PluginSettings).runtimePlugins;
28
- if (!Array.isArray(raw)) return [];
29
- return raw.filter((entry): entry is string => typeof entry === "string" && entry.length > 0);
30
- }
31
-
32
22
  export async function loadPluginRuntimes(
33
23
  registry: RuntimeRegistry,
34
- settings?: unknown,
24
+ settings?: Pick<ClioSettings, "integrations">,
35
25
  ): Promise<ReadonlyArray<string>> {
36
26
  const loaded: string[] = [];
37
27
 
38
28
  const pluginDir = join(clioConfigDir(), "runtimes");
39
- const packages = extractPluginPackages(settings);
29
+ const packages = settings?.integrations.runtimePlugins ?? [];
40
30
  try {
41
31
  const ids = await registry.loadFromDir(pluginDir, activateExternalPluginApiBridge);
42
32
  loaded.push(...ids);
@@ -25,6 +25,7 @@ export interface ClioLocalModelMetadata {
25
25
  chatTemplateKwargsUnsupported?: boolean;
26
26
  lmstudio?: TargetDescriptor["lmstudio"];
27
27
  litellm?: TargetDescriptor["litellm"];
28
+ cache?: TargetDescriptor["cache"];
28
29
  };
29
30
  }
30
31
 
@@ -65,6 +66,8 @@ function localOpenAICompat(caps: CapabilityFlags, runtimeId: string): OpenAIComp
65
66
  maxTokensField: "max_tokens",
66
67
  supportsThinkingTokenBudget: runtimeId === "vllm",
67
68
  supportsStrictMode: false,
69
+ // Native and generic gateway schemas do not establish hosted 24h retention.
70
+ supportsLongCacheRetention: false,
68
71
  };
69
72
  const thinkingFormat = openAIThinkingFormat(caps);
70
73
  if (thinkingFormat) (compat as unknown as { thinkingFormat?: string }).thinkingFormat = thinkingFormat;
@@ -111,6 +114,7 @@ export function synthLocalModel(input: LocalSynthesisInput): Model<Api> {
111
114
  ...(quirks ? { quirks } : {}),
112
115
  ...(target.lmstudio ? { lmstudio: target.lmstudio } : {}),
113
116
  ...(target.litellm ? { litellm: target.litellm } : {}),
117
+ ...(target.cache ? { cache: structuredClone(target.cache) } : {}),
114
118
  },
115
119
  };
116
120
  if (headers) model.headers = headers;
@@ -14,6 +14,22 @@ export interface TargetPricing {
14
14
  cacheWrite?: number;
15
15
  }
16
16
 
17
+ /** Request policy interpreted by the selected Pi API; it does not authorize cache administration or paid warming. */
18
+ export interface TargetCacheSettings {
19
+ retention?: "none" | "short" | "long";
20
+ /** Explicit read-only deployment binding; never grants administrative authority. */
21
+ deployment?: {
22
+ backend: "llamacpp" | "vllm";
23
+ controlUrl: string;
24
+ model: string;
25
+ build: string;
26
+ /** Required for a gateway binding; compared with its current route inventory. */
27
+ gatewayDeploymentId?: string;
28
+ };
29
+ /** Local warm bounds. Paid routes remain ineligible. */
30
+ warm?: { maxInputTokens?: number; maxDurationMs?: number; cooldownMs?: number };
31
+ }
32
+
17
33
  // Canonical persisted lifecycle name. Readers temporarily normalize the
18
34
  // released `clio-managed` spelling at the settings boundary.
19
35
  export type TargetLifecycle = "user-managed" | "clio-coder-managed";
@@ -74,6 +90,7 @@ export interface TargetDescriptor {
74
90
  lifecycle?: TargetLifecycle;
75
91
  gateway?: boolean;
76
92
  pricing?: TargetPricing;
93
+ cache?: TargetCacheSettings;
77
94
  lmstudio?: LmStudioTargetSettings;
78
95
  litellm?: LiteLLMTargetSettings;
79
96
  /** Explicit request-slot limit for this inference endpoint. It overrides live discovery. */
@@ -593,6 +593,9 @@ function addCompactionUsage(total: CompactionUsage | undefined, raw: unknown): C
593
593
  output: base.output + output,
594
594
  cacheRead: base.cacheRead + cacheRead,
595
595
  cacheWrite: base.cacheWrite + cacheWrite,
596
+ ...(base.cacheWrite1h === undefined && usage.cacheWrite1h === undefined
597
+ ? {}
598
+ : { cacheWrite1h: (base.cacheWrite1h ?? 0) + numberOrZero(usage.cacheWrite1h) }),
596
599
  reasoning: base.reasoning + numberOrZero(usage.reasoning),
597
600
  totalTokens: base.totalTokens + totalTokens,
598
601
  cost: { total: base.cost.total + numberOrZero(usage.cost?.total) },
@@ -605,7 +608,7 @@ function retainReportedUsage(previous: Record<string, unknown>, raw: unknown): R
605
608
  if (!raw || typeof raw !== "object" || Array.isArray(raw)) return previous;
606
609
  const usage = raw as Record<string, unknown>;
607
610
  const known = { ...previous };
608
- for (const field of ["input", "output", "cacheRead", "cacheWrite", "totalTokens"]) {
611
+ for (const field of ["input", "output", "cacheRead", "cacheWrite", "cacheWrite1h", "totalTokens"]) {
609
612
  const value = numberOrZero(usage[field]);
610
613
  if (value > 0) known[field] = value;
611
614
  }
@@ -114,6 +114,7 @@ export interface CompactionUsage {
114
114
  output: number;
115
115
  cacheRead: number;
116
116
  cacheWrite: number;
117
+ cacheWrite1h?: number;
117
118
  reasoning: number;
118
119
  totalTokens: number;
119
120
  cost: { total: number };
@@ -13,10 +13,8 @@
13
13
  * every surface's accounting, which is the same thing the tools/interactive
14
14
  * boundary rule exists to prevent.
15
15
  *
16
- * Assistant turns marked aborted or error are skipped for the same reason the
17
- * context estimator skips them: their usage is not a completed call. A
18
- * cancelled partial persists a fully populated all-zero usage object, so
19
- * counting it would add an API call worth nothing.
16
+ * Failed/aborted calls with reported usage still consumed resources. Skip
17
+ * only all-zero SDK placeholders, whose accounting was never observed.
20
18
  */
21
19
 
22
20
  import {
@@ -39,6 +37,7 @@ export interface LedgerUsageCall {
39
37
  output: number;
40
38
  cacheRead: number;
41
39
  cacheWrite: number;
40
+ cacheWrite1h?: number;
42
41
  reasoningTokens: number;
43
42
  totalTokens: number;
44
43
  costUsd: number;
@@ -58,7 +57,7 @@ function numberAt(source: Record<string, unknown>, key: string): number {
58
57
  }
59
58
 
60
59
  function reasoningTokensOf(usage: Record<string, unknown>): number {
61
- const direct = numberAt(usage, "reasoningTokens");
60
+ const direct = numberAt(usage, "reasoning") || numberAt(usage, "reasoningTokens");
62
61
  if (direct > 0) return direct;
63
62
  const details = usage.outputTokensDetails ?? usage.completionTokensDetails;
64
63
  if (details && typeof details === "object") return numberAt(details as Record<string, unknown>, "reasoningTokens");
@@ -109,6 +108,7 @@ export function ledgerUsageCalls(
109
108
  output: usage.output,
110
109
  cacheRead: usage.cacheRead,
111
110
  cacheWrite: usage.cacheWrite,
111
+ ...(usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: usage.cacheWrite1h }),
112
112
  reasoningTokens: usage.reasoning,
113
113
  totalTokens: usage.totalTokens,
114
114
  costUsd: usage.cost.total,
@@ -129,8 +129,6 @@ export function ledgerUsageCalls(
129
129
  const payload = entry.payload;
130
130
  if (!payload || typeof payload !== "object" || Array.isArray(payload)) continue;
131
131
  const record = payload as Record<string, unknown>;
132
- const stopReason = record.stopReason;
133
- if (stopReason === "aborted" || stopReason === "error") continue;
134
132
  const rawUsage = record.usage;
135
133
  if (!rawUsage || typeof rawUsage !== "object" || Array.isArray(rawUsage)) continue;
136
134
  const usage = rawUsage as Record<string, unknown>;
@@ -156,6 +154,7 @@ export function ledgerUsageCalls(
156
154
  output,
157
155
  cacheRead,
158
156
  cacheWrite,
157
+ ...(typeof usage.cacheWrite1h === "number" ? { cacheWrite1h: numberAt(usage, "cacheWrite1h") } : {}),
159
158
  reasoningTokens: reasoningTokensOf(usage),
160
159
  totalTokens,
161
160
  costUsd,
@@ -2559,6 +2559,17 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2559
2559
  }
2560
2560
  const text = promptText(params);
2561
2561
  if (text.length === 0) throw new AcpRequestError(-32602, "prompt text is required", { code: "invalid_params" });
2562
+ // Check the same credential authority as the runtime, without resolving or
2563
+ // echoing a secret. Desktop services do not inherit a terminal's API keys.
2564
+ const targetId = routingSnapshot().target;
2565
+ const target = targetId ? options.providers?.getTarget(targetId) : undefined;
2566
+ const runtime = target ? options.providers?.getRuntime(target.runtime) : undefined;
2567
+ if (target && runtime && options.providers && !options.providers.auth.statusForTarget(target, runtime).available) {
2568
+ throw new AcpRequestError(-32000, "credentials for the selected target are unavailable", {
2569
+ code: "prompt_not_admitted",
2570
+ reason: "authentication-required",
2571
+ });
2572
+ }
2562
2573
  if (options.session?.current()?.id !== session.id && options.session) options.session.resume(session.id);
2563
2574
  const active = createActivePromptState();
2564
2575
  session.activePrompt = active;
package/src/engine/ai.ts CHANGED
@@ -76,6 +76,7 @@ export interface EngineTextCompletionResult {
76
76
  output: number;
77
77
  cacheRead: number;
78
78
  cacheWrite: number;
79
+ cacheWrite1h?: number;
79
80
  reasoning: number;
80
81
  totalTokens: number;
81
82
  costUsd: number;
@@ -110,6 +111,7 @@ export async function completeEngineText(input: EngineTextCompletionInput): Prom
110
111
  output: response.usage.output,
111
112
  cacheRead: response.usage.cacheRead,
112
113
  cacheWrite: response.usage.cacheWrite,
114
+ ...(response.usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: response.usage.cacheWrite1h }),
113
115
  reasoning: response.usage.reasoning ?? 0,
114
116
  totalTokens: response.usage.totalTokens,
115
117
  costUsd: response.usage.cost.total,
@@ -546,11 +546,15 @@ function applyLmStudioPayload(
546
546
  return next;
547
547
  }
548
548
 
549
- function applyLlamaCppPromptCachePayload(payload: Record<string, unknown>, model: Model<Api>): Record<string, unknown> {
549
+ function applyLlamaCppPromptCachePayload(
550
+ payload: Record<string, unknown>,
551
+ model: Model<Api>,
552
+ retention: StreamOptions["cacheRetention"],
553
+ ): Record<string, unknown> {
550
554
  const metadata = runtimeMetadata(model);
551
555
  if (model.provider !== "llamacpp" || metadata?.runtimeId !== "llamacpp") return payload;
552
556
  if (payload.cache_prompt !== undefined) return payload;
553
- return { ...payload, cache_prompt: true };
557
+ return { ...payload, cache_prompt: retention !== "none" };
554
558
  }
555
559
 
556
560
  function shouldApplyLlamaCppPromptCache(model: Model<"openai-completions">): boolean {
@@ -562,13 +566,14 @@ function shouldApplyLlamaCppPromptCache(model: Model<"openai-completions">): boo
562
566
  function composeThinkingOnPayload(
563
567
  resolved: ResolvedModelRuntimeCapabilities,
564
568
  base: AnyOnPayload | undefined,
569
+ retention: StreamOptions["cacheRetention"],
565
570
  ): AnyOnPayload {
566
571
  return async (payload, model) => {
567
572
  if (!isPlainRecord(payload)) {
568
573
  return base ? await base(payload, model) : undefined;
569
574
  }
570
575
  const next = applyLmStudioPayload(
571
- applyThinkingPayload(applyLlamaCppPromptCachePayload(payload, model), resolved.thinking, resolved, model),
576
+ applyThinkingPayload(applyLlamaCppPromptCachePayload(payload, model, retention), resolved.thinking, resolved, model),
572
577
  model,
573
578
  resolved,
574
579
  );
@@ -625,7 +630,7 @@ function withSamplingOverrides<TOptions extends StreamOptions>(
625
630
  applied.mechanism === "on-off" ||
626
631
  applied.mechanism === "none"
627
632
  ) {
628
- merged.onPayload = composeThinkingOnPayload(resolved, options?.onPayload);
633
+ merged.onPayload = composeThinkingOnPayload(resolved, options?.onPayload, options?.cacheRetention);
629
634
  }
630
635
  return merged as TOptions;
631
636
  }