@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
@@ -21,7 +21,7 @@ import { BusChannels, type DispatchCompletedPayload, type DispatchRunIdentity }
21
21
  import { DEFAULT_SETTINGS, type DelegationToolGovernance } from "../../core/defaults.js";
22
22
  import type { DomainBundle, DomainContext, DomainExtension } from "../../core/domain-loader.js";
23
23
  import { gatewayRoutingObservationFromRecord } from "../../core/gateway-routing.js";
24
- import { GUARDRAIL_DEFAULTS } from "../../core/guardrails.js";
24
+ import { GUARDRAIL_DEFAULTS, resolveGuardrail } from "../../core/guardrails.js";
25
25
  import { readClioVersion, readPiMonoVersion } from "../../core/package-root.js";
26
26
  import { canonicalizeExistingPath } from "../../core/path-canonical.js";
27
27
  import { protectedResidencyModels } from "../../core/residency-protection.js";
@@ -325,7 +325,10 @@ interface RunTokenMeter {
325
325
  outputTokens: number;
326
326
  cacheReadTokens: number;
327
327
  cacheWriteTokens: number;
328
+ cacheWrite1hTokens?: number;
328
329
  reasoningTokens: number;
330
+ /** Native calls are priced individually by the SDK, including cache TTLs and context tiers. */
331
+ costUsd?: number;
329
332
  }
330
333
 
331
334
  interface ActiveRun {
@@ -458,6 +461,7 @@ function sealRouteDecision(draft: RunReceiptDraft, decision: RouteDecisionV1): R
458
461
  export const UNKNOWN_PRICING_ADMISSION_ESTIMATE_USD = 1;
459
462
 
460
463
  function calculateUsageCostUsd(meter: RunTokenMeter, pricing: EffectivePricing["rates"]): number {
464
+ if (meter.costUsd !== undefined) return meter.costUsd;
461
465
  if (pricing === null) return 0;
462
466
  return (
463
467
  (meter.inputTokens * pricing.input +
@@ -468,6 +472,39 @@ function calculateUsageCostUsd(meter: RunTokenMeter, pricing: EffectivePricing["
468
472
  );
469
473
  }
470
474
 
475
+ function accumulateNativeUsage(
476
+ meter: RunTokenMeter,
477
+ usage: Record<string, unknown>,
478
+ pricing: EffectivePricing["rates"],
479
+ ): void {
480
+ const count = (value: unknown): number =>
481
+ typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
482
+ const call: RunTokenMeter = {
483
+ inputTokens: count(usage.input),
484
+ outputTokens: count(usage.output),
485
+ cacheReadTokens: count(usage.cacheRead),
486
+ cacheWriteTokens: count(usage.cacheWrite),
487
+ reasoningTokens: extractReasoningTokenCount(usage),
488
+ };
489
+ const reported = isRecord(usage.cost) ? usage.cost.total : undefined;
490
+ // An SDK total is already priced with per-call tiers, service tier
491
+ // and cache-write lifetime. Never reprice it from an aggregate token count.
492
+ // Retain the target-rate fallback only for workers that omit calculated
493
+ // cost. Zero remains zero; its provenance still comes from the target.
494
+ const callCost =
495
+ typeof reported === "number" && Number.isFinite(reported) && reported >= 0
496
+ ? reported
497
+ : calculateUsageCostUsd(call, pricing);
498
+ meter.costUsd = (meter.costUsd ?? 0) + callCost;
499
+ meter.inputTokens += call.inputTokens;
500
+ meter.outputTokens += call.outputTokens;
501
+ meter.cacheReadTokens += call.cacheReadTokens;
502
+ meter.cacheWriteTokens += call.cacheWriteTokens;
503
+ if (typeof usage.cacheWrite1h === "number" && usage.cacheWrite1h >= 0 && usage.cacheWrite1h <= call.cacheWriteTokens)
504
+ meter.cacheWrite1hTokens = (meter.cacheWrite1hTokens ?? 0) + usage.cacheWrite1h;
505
+ meter.reasoningTokens += call.reasoningTokens;
506
+ }
507
+
471
508
  /**
472
509
  * Output-token figure the admission estimate prices a route against. Settings
473
510
  * always carry `defaults.maxTokens`; the fallback covers the callers that
@@ -3952,7 +3989,13 @@ export function createDispatchBundle(
3952
3989
  }
3953
3990
  timing.workerSpawnedAt = new Date(now()).toISOString();
3954
3991
 
3955
- const tokenMeter = { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0, reasoningTokens: 0 };
3992
+ const tokenMeter: RunTokenMeter = {
3993
+ inputTokens: 0,
3994
+ outputTokens: 0,
3995
+ cacheReadTokens: 0,
3996
+ cacheWriteTokens: 0,
3997
+ reasoningTokens: 0,
3998
+ };
3956
3999
  const safetyDecisionCounts = { allowed: 0, blocked: 0, permissionRequested: 0 };
3957
4000
  const blockedAttempts: SafetyBlockedAttempt[] = [];
3958
4001
  const toolStats = new Map<string, ToolCallStat>();
@@ -4341,6 +4384,7 @@ export function createDispatchBundle(
4341
4384
  outputTokenCount: tokenMeter.outputTokens,
4342
4385
  cacheReadTokenCount: tokenMeter.cacheReadTokens,
4343
4386
  cacheWriteTokenCount: tokenMeter.cacheWriteTokens,
4387
+ ...(tokenMeter.cacheWrite1hTokens === undefined ? {} : { cacheWrite1hTokenCount: tokenMeter.cacheWrite1hTokens }),
4344
4388
  reasoningTokenCount: tokenMeter.reasoningTokens,
4345
4389
  ...(upstreamResponses.length > 0 ? { upstreamResponses: [...upstreamResponses] } : {}),
4346
4390
  ...(capturedOutput !== undefined ? { output: capturedOutput } : {}),
@@ -4427,6 +4471,7 @@ export function createDispatchBundle(
4427
4471
  outputTokenCount: receipt.outputTokenCount ?? 0,
4428
4472
  cacheReadTokenCount: receipt.cacheReadTokenCount ?? 0,
4429
4473
  cacheWriteTokenCount: receipt.cacheWriteTokenCount ?? 0,
4474
+ ...(receipt.cacheWrite1hTokenCount === undefined ? {} : { cacheWrite1hTokenCount: receipt.cacheWrite1hTokenCount }),
4430
4475
  reasoningTokenCount: receipt.reasoningTokenCount ?? 0,
4431
4476
  staticShellHash: receipt.staticShellHash ?? null,
4432
4477
  sessionShellHash: receipt.sessionShellHash ?? null,
@@ -4552,6 +4597,9 @@ export function createDispatchBundle(
4552
4597
  dynamicHash: receiptDraft.dynamicHash ?? null,
4553
4598
  cacheReadTokenCount: receiptDraft.cacheReadTokenCount ?? 0,
4554
4599
  cacheWriteTokenCount: receiptDraft.cacheWriteTokenCount ?? 0,
4600
+ ...(receiptDraft.cacheWrite1hTokenCount === undefined
4601
+ ? {}
4602
+ : { cacheWrite1hTokenCount: receiptDraft.cacheWrite1hTokenCount }),
4555
4603
  reasoningTokenCount: receiptDraft.reasoningTokenCount ?? 0,
4556
4604
  heartbeatAt: heartbeatIso(acp.heartbeatAt),
4557
4605
  };
@@ -4838,7 +4886,13 @@ export function createDispatchBundle(
4838
4886
  throw error;
4839
4887
  }
4840
4888
  })();
4841
- const tokenMeter = { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0, reasoningTokens: 0 };
4889
+ const tokenMeter: RunTokenMeter = {
4890
+ inputTokens: 0,
4891
+ outputTokens: 0,
4892
+ cacheReadTokens: 0,
4893
+ cacheWriteTokens: 0,
4894
+ reasoningTokens: 0,
4895
+ };
4842
4896
  const safetyDecisionCounts = { allowed: 0, blocked: 0, permissionRequested: 0 };
4843
4897
  const escalationCounts = { requested: 0, approved: 0, denied: 0, timedOut: 0 };
4844
4898
  const blockedAttempts: SafetyBlockedAttempt[] = [];
@@ -5118,11 +5172,7 @@ export function createDispatchBundle(
5118
5172
  }
5119
5173
  if (event.type === "message_end" && event.message?.role === "assistant" && isRecord(event.message.usage)) {
5120
5174
  const u = event.message.usage;
5121
- tokenMeter.inputTokens += typeof u.input === "number" ? u.input : 0;
5122
- tokenMeter.outputTokens += typeof u.output === "number" ? u.output : 0;
5123
- tokenMeter.cacheReadTokens += typeof u.cacheRead === "number" ? u.cacheRead : 0;
5124
- tokenMeter.cacheWriteTokens += typeof u.cacheWrite === "number" ? u.cacheWrite : 0;
5125
- tokenMeter.reasoningTokens += extractReasoningTokenCount(u);
5175
+ accumulateNativeUsage(tokenMeter, u, lifecycle.target.effectivePricing.rates);
5126
5176
  const requestedModelId = readStringOrNull(event.message.model);
5127
5177
  const responseModelIdObservation = responseModelIdObservationFromRecord(event.message, "not-observed");
5128
5178
  const differingResponseModelId = readStringOrNull(event.message.responseModel);
@@ -5552,11 +5602,15 @@ export function createDispatchBundle(
5552
5602
  outputTokenCount: tokenMeter.outputTokens,
5553
5603
  cacheReadTokenCount: tokenMeter.cacheReadTokens,
5554
5604
  cacheWriteTokenCount: tokenMeter.cacheWriteTokens,
5605
+ ...(tokenMeter.cacheWrite1hTokens === undefined ? {} : { cacheWrite1hTokenCount: tokenMeter.cacheWrite1hTokens }),
5555
5606
  reasoningTokenCount: tokenMeter.reasoningTokens,
5556
5607
  ...(upstreamResponses.length > 0 ? { upstreamResponses: [...upstreamResponses] } : {}),
5557
5608
  ...(capturedOutput !== undefined ? { output: capturedOutput } : {}),
5558
5609
  costUsd,
5559
- costProvenance: lifecycle.target.effectivePricing.provenance,
5610
+ costProvenance:
5611
+ lifecycle.target.effectivePricing.provenance === "unknown" && costUsd > 0
5612
+ ? "estimated"
5613
+ : lifecycle.target.effectivePricing.provenance,
5560
5614
  compiledPromptHash: lifecycle.compiledPromptHash,
5561
5615
  staticCompositionHash: lifecycle.staticCompositionHash,
5562
5616
  staticShellHash: lifecycle.staticCompositionHash,
@@ -5646,6 +5700,7 @@ export function createDispatchBundle(
5646
5700
  outputTokenCount: receipt.outputTokenCount ?? 0,
5647
5701
  cacheReadTokenCount: receipt.cacheReadTokenCount ?? 0,
5648
5702
  cacheWriteTokenCount: receipt.cacheWriteTokenCount ?? 0,
5703
+ ...(receipt.cacheWrite1hTokenCount === undefined ? {} : { cacheWrite1hTokenCount: receipt.cacheWrite1hTokenCount }),
5649
5704
  reasoningTokenCount: receipt.reasoningTokenCount ?? 0,
5650
5705
  staticShellHash: receipt.staticShellHash ?? null,
5651
5706
  sessionShellHash: receipt.sessionShellHash ?? null,
@@ -5891,6 +5946,9 @@ export function createDispatchBundle(
5891
5946
  ...(receiptDraft.cacheReadTokenCount !== undefined
5892
5947
  ? { cacheReadTokenCount: receiptDraft.cacheReadTokenCount }
5893
5948
  : {}),
5949
+ ...(receiptDraft.cacheWrite1hTokenCount === undefined
5950
+ ? {}
5951
+ : { cacheWrite1hTokenCount: receiptDraft.cacheWrite1hTokenCount }),
5894
5952
  ...(receiptDraft.cacheWriteTokenCount !== undefined
5895
5953
  ? { cacheWriteTokenCount: receiptDraft.cacheWriteTokenCount }
5896
5954
  : {}),
@@ -6672,7 +6730,11 @@ export function createDispatchBundle(
6672
6730
  // No in-memory executor survives a process restart, so every active
6673
6731
  // side-store lease from an earlier bundle is orphaned and must expire.
6674
6732
  cleanupDispatchReservations({ startup: true, nowMs: now() });
6675
- ledger = openLedger();
6733
+ ledger = openLedger({
6734
+ get maxRuns() {
6735
+ return getEffectiveSettings()?.fleet?.history?.maxRuns ?? resolveGuardrail("maxDispatchRuns");
6736
+ },
6737
+ });
6676
6738
  // Symphony P10: restart recovery from durable artifacts. Adopt
6677
6739
  // receipts whose ledger rows were lost to a crash between
6678
6740
  // recordReceipt() and persist(); quarantine tampered ones.
@@ -6802,6 +6864,7 @@ export function createDispatchBundle(
6802
6864
  const meter = run.meter;
6803
6865
  const totalTokens = meter.inputTokens + meter.outputTokens + meter.cacheReadTokens + meter.cacheWriteTokens;
6804
6866
  const costUsd = calculateUsageCostUsd(meter, run.pricing);
6867
+ const costProvenance = run.costProvenance === "unknown" && costUsd > 0 ? "estimated" : run.costProvenance;
6805
6868
  const startedMs = Date.parse(run.startedAt);
6806
6869
  const elapsedMs = Number.isFinite(startedMs) ? Math.max(0, tickNow - startedMs) : 0;
6807
6870
  const timing = deriveRunPhaseDurations(run.timing, run.startedAt, new Date(tickNow).toISOString());
@@ -6819,14 +6882,14 @@ export function createDispatchBundle(
6819
6882
  timing,
6820
6883
  tokens: { input: meter.inputTokens, output: meter.outputTokens, total: totalTokens },
6821
6884
  costUsd,
6822
- costProvenance: run.costProvenance,
6885
+ costProvenance,
6823
6886
  node: run.node !== null ? { ...run.node } : null,
6824
6887
  });
6825
6888
  totals.inputTokens += meter.inputTokens;
6826
6889
  totals.outputTokens += meter.outputTokens;
6827
6890
  totals.totalTokens += totalTokens;
6828
6891
  totals.costUsd += costUsd;
6829
- costAmounts.push({ usd: costUsd, provenance: run.costProvenance });
6892
+ costAmounts.push({ usd: costUsd, provenance: costProvenance });
6830
6893
  totals.runtimeSeconds += elapsedMs / 1000;
6831
6894
  }
6832
6895
  const retrying = [...retryQueue.values()].map((entry) => ({
@@ -22,6 +22,7 @@ export type {
22
22
  DispatchAssignment,
23
23
  } from "./assignment.js";
24
24
  export type { AssignmentVerdictOwner, DurableAssignmentRecord } from "./assignment-store.js";
25
+ export { endpointCapacityUsage } from "./capacity-lease.js";
25
26
  export type { CodeStepOutcome, CodeStepRecord, CodeStepRunInput } from "./code-step.js";
26
27
  export {
27
28
  canonicalCodeReport,
@@ -78,6 +78,7 @@ function envelopeFromReceipt(receipt: RunReceipt, status: RunStatus, receiptPath
78
78
  };
79
79
  if (receipt.cacheReadTokenCount !== undefined) envelope.cacheReadTokenCount = receipt.cacheReadTokenCount;
80
80
  if (receipt.cacheWriteTokenCount !== undefined) envelope.cacheWriteTokenCount = receipt.cacheWriteTokenCount;
81
+ if (receipt.cacheWrite1hTokenCount !== undefined) envelope.cacheWrite1hTokenCount = receipt.cacheWrite1hTokenCount;
81
82
  if (receipt.reasoningTokenCount !== undefined) envelope.reasoningTokenCount = receipt.reasoningTokenCount;
82
83
  if (receipt.inputTokenCount !== undefined) envelope.inputTokenCount = receipt.inputTokenCount;
83
84
  if (receipt.outputTokenCount !== undefined) envelope.outputTokenCount = receipt.outputTokenCount;
@@ -114,6 +114,7 @@ export const RECEIPT_INTEGRITY_FIELD_COVERAGE = {
114
114
  outputTokenCount: true,
115
115
  cacheReadTokenCount: true,
116
116
  cacheWriteTokenCount: true,
117
+ cacheWrite1hTokenCount: true,
117
118
  reasoningTokenCount: true,
118
119
  upstreamResponses: true,
119
120
  output: true,
@@ -211,6 +212,7 @@ function ledgerDigestFields(envelope: RunEnvelope): Record<string, unknown> {
211
212
  tokenCount: envelope.tokenCount,
212
213
  cacheReadTokenCount: envelope.cacheReadTokenCount,
213
214
  cacheWriteTokenCount: envelope.cacheWriteTokenCount,
215
+ cacheWrite1hTokenCount: envelope.cacheWrite1hTokenCount,
214
216
  reasoningTokenCount: envelope.reasoningTokenCount,
215
217
  staticShellHash: envelope.staticShellHash,
216
218
  sessionShellHash: envelope.sessionShellHash,
@@ -366,6 +368,7 @@ function firstLedgerMismatch(receipt: RunReceipt, envelope: RunEnvelope): string
366
368
  ["tokenCount", receipt.tokenCount, envelope.tokenCount],
367
369
  ["cacheReadTokenCount", receipt.cacheReadTokenCount ?? 0, envelope.cacheReadTokenCount ?? 0],
368
370
  ["cacheWriteTokenCount", receipt.cacheWriteTokenCount ?? 0, envelope.cacheWriteTokenCount ?? 0],
371
+ ["cacheWrite1hTokenCount", receipt.cacheWrite1hTokenCount ?? 0, envelope.cacheWrite1hTokenCount ?? 0],
369
372
  ["reasoningTokenCount", receipt.reasoningTokenCount ?? 0, envelope.reasoningTokenCount ?? 0],
370
373
  ["staticShellHash", receipt.staticShellHash ?? null, envelope.staticShellHash ?? null],
371
374
  ["sessionShellHash", receipt.sessionShellHash ?? null, envelope.sessionShellHash ?? null],
@@ -239,7 +239,6 @@ function capRuns(all: RunEnvelope[], maxRuns: number): RunEnvelope[] {
239
239
  }
240
240
 
241
241
  export function openLedger(opts?: LedgerOptions): Ledger {
242
- const maxRuns = resolveMaxRuns(opts?.maxRuns);
243
242
  let runs: RunEnvelope[] = readRuns();
244
243
  // Ids this process has written since the last successful persist. See
245
244
  // mergeRunsById: this is what separates our writes from a sibling's rows we
@@ -369,7 +368,7 @@ export function openLedger(opts?: LedgerOptions): Ledger {
369
368
  if (stateRootRemoved()) return;
370
369
  const diskRuns = readRuns();
371
370
  const merged = mergeRunsById(diskRuns, runs, dirty);
372
- const capped = capRuns(merged, maxRuns);
371
+ const capped = capRuns(merged, resolveMaxRuns(opts?.maxRuns));
373
372
  runs = capped;
374
373
  atomicWrite(target, JSON.stringify(capped, null, 2));
375
374
  // A run that left the ring has no ledger row to view any more, so its
@@ -504,6 +504,7 @@ export interface RunEnvelope {
504
504
  reasoningTokenCount?: number;
505
505
  cacheReadTokenCount?: number;
506
506
  cacheWriteTokenCount?: number;
507
+ cacheWrite1hTokenCount?: number;
507
508
  staticShellHash?: string | null;
508
509
  sessionShellHash?: string | null;
509
510
  dynamicHash?: string | null;
@@ -872,6 +873,7 @@ export interface RunReceipt {
872
873
  outputTokenCount?: number;
873
874
  cacheReadTokenCount?: number;
874
875
  cacheWriteTokenCount?: number;
876
+ cacheWrite1hTokenCount?: number;
875
877
  reasoningTokenCount?: number;
876
878
  upstreamResponses?: RunReceiptUpstreamResponse[];
877
879
  /** Bounded final/partial assistant output; absent when none was captured. */
@@ -42,6 +42,7 @@ export interface BuildEvalTrackedMetricsInput {
42
42
  }
43
43
 
44
44
  interface AssistantCall {
45
+ turnId: string;
45
46
  timestamp: string | null;
46
47
  payload: Record<string, unknown>;
47
48
  promptCache: Record<string, unknown> | null;
@@ -175,7 +176,7 @@ export function buildEvalTrackedMetrics(input: BuildEvalTrackedMetricsInput): Ev
175
176
  receiptToolErrors === undefined
176
177
  ? { value: ledgerToolErrors, source: "ledger" }
177
178
  : { value: receiptToolErrors, source: "receipt" },
178
- ttftMsFirstCall: firstCallTtft(calls),
179
+ ttftMsFirstCall: firstCallTtft(calls, input.ledgerEntries),
179
180
  wallClockMs: wallClockMetric(input.receipt, input.fallbackWallClockMs),
180
181
  contextTokensAtEnd: contextTokensAtEnd(calls, compactionEntries),
181
182
  compactions: { value: compactionEntries.length, source: "ledger" },
@@ -210,6 +211,7 @@ function assistantCalls(entries: ReadonlyArray<SessionEntry>): AssistantCall[] {
210
211
  if (promptCache === null && timing === null && usage === null) return [];
211
212
  return [
212
213
  {
214
+ turnId: entry.turnId,
213
215
  timestamp: entry.payload.timestampEstimated === true ? null : entry.timestamp,
214
216
  payload: entry.payload,
215
217
  promptCache,
@@ -279,7 +281,24 @@ function reasoningMetric(
279
281
  return measured ? { value: total, source: "ledger" } : { value: null, source: "estimated" };
280
282
  }
281
283
 
282
- function firstCallTtft(calls: ReadonlyArray<AssistantCall>): EvalSourcedNullableNumber {
284
+ function firstCallTtft(
285
+ calls: ReadonlyArray<AssistantCall>,
286
+ entries: ReadonlyArray<SessionEntry>,
287
+ ): EvalSourcedNullableNumber {
288
+ // Parent links are causal evidence; wall-clock corrections must not promote
289
+ // a later call in the same session. Compare timestamps only across roots.
290
+ const parents = new Map(entries.map((entry) => [entry.turnId, entry.parentTurnId]));
291
+ const callIds = new Set(calls.map((call) => call.turnId));
292
+ const hasEarlierCall = (call: AssistantCall): boolean => {
293
+ const visited = new Set<string>([call.turnId]);
294
+ let parent = parents.get(call.turnId);
295
+ while (parent != null && !visited.has(parent)) {
296
+ if (callIds.has(parent)) return true;
297
+ visited.add(parent);
298
+ parent = parents.get(parent);
299
+ }
300
+ return false;
301
+ };
283
302
  // Session directories are read by name, not by call time. Select without
284
303
  // reordering the evidence or borrowing a later call's available timing.
285
304
  let first: AssistantCall | undefined;
@@ -288,6 +307,7 @@ function firstCallTtft(calls: ReadonlyArray<AssistantCall>): EvalSourcedNullable
288
307
  if (call.timestamp === null) return { value: null, source: "estimated" };
289
308
  const at = Date.parse(call.timestamp);
290
309
  if (!Number.isFinite(at)) return { value: null, source: "estimated" };
310
+ if (hasEarlierCall(call)) continue;
291
311
  if (at < firstAt) {
292
312
  first = call;
293
313
  firstAt = at;
@@ -297,7 +297,9 @@ export class OperatorExtensionRuntime {
297
297
  message: `operator generation ${next}: ${ready} ready, ${degraded} degraded; tool schemas remain frozen${hooks ? `; hooks/snapshot generation ${hooks.generation}` : ""}`,
298
298
  };
299
299
  } catch (error) {
300
- for (const process of staged.values()) this.retire(process, "reload-rejected");
300
+ for (const process of new Set([...this.processes.values(), ...staged.values()])) {
301
+ this.retire(process, "reload-rejected");
302
+ }
301
303
  this.processes.clear();
302
304
  result = {
303
305
  status: this.generation === next ? "committed" : "rejected",
@@ -10,8 +10,8 @@
10
10
  *
11
11
  * There is no arbitrary script execution: `command` takes an argv array and is
12
12
  * run without a shell, so there is no string to inject into. Hooks never
13
- * replace the safety policy. They register after the guard hooks and can only
14
- * add effects (including requesting `block_tool`); the durable safety contract
13
+ * replace the safety policy. They can only add effects (including requesting
14
+ * `block_tool`); the durable safety contract
15
15
  * still classifies every tool call independently and a hook cannot grant a
16
16
  * permission safety would deny.
17
17
  *
@@ -27,6 +27,7 @@ export interface BackgroundMemoryStepUsage {
27
27
  output: number;
28
28
  cacheRead: number;
29
29
  cacheWrite: number;
30
+ cacheWrite1h?: number;
30
31
  reasoning: number;
31
32
  totalTokens: number;
32
33
  costUsd: number;
@@ -83,6 +84,7 @@ export function backgroundMemoryUsageRow(
83
84
  output: usage.output,
84
85
  cacheRead: usage.cacheRead,
85
86
  cacheWrite: usage.cacheWrite,
87
+ ...(usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: usage.cacheWrite1h }),
86
88
  reasoning: usage.reasoning,
87
89
  totalTokens: usage.totalTokens,
88
90
  costUsd: usage.costUsd,
@@ -122,6 +124,7 @@ export function recordBackgroundMemoryStep(input: RecordBackgroundMemoryStepInpu
122
124
  output: input.usage.output,
123
125
  cacheRead: input.usage.cacheRead,
124
126
  cacheWrite: input.usage.cacheWrite,
127
+ ...(input.usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: input.usage.cacheWrite1h }),
125
128
  reasoningTokens: input.usage.reasoning,
126
129
  totalTokens: input.usage.totalTokens,
127
130
  apiCalls: 1,
@@ -29,6 +29,7 @@ function observedUsage(call: CompactionCallObservation): OutOfTurnUsage {
29
29
  output: reading(raw.output),
30
30
  cacheRead: reading(raw.cacheRead),
31
31
  cacheWrite: reading(raw.cacheWrite),
32
+ ...(raw.cacheWrite1h === undefined ? {} : { cacheWrite1h: reading(raw.cacheWrite1h) }),
32
33
  reasoning: reasoning !== null && reasoning > 0 ? reasoning : null,
33
34
  totalTokens: reading(raw.totalTokens),
34
35
  costUsd,
@@ -72,6 +73,7 @@ export function recordFailedCompactionCalls(
72
73
  output: usage.output ?? 0,
73
74
  cacheRead: usage.cacheRead ?? 0,
74
75
  cacheWrite: usage.cacheWrite ?? 0,
76
+ ...(typeof usage.cacheWrite1h === "number" ? { cacheWrite1h: usage.cacheWrite1h } : {}),
75
77
  reasoningTokens: usage.reasoning ?? 0,
76
78
  totalTokens: usage.totalTokens ?? 0,
77
79
  apiCalls: 1,
@@ -127,6 +127,7 @@ export interface UsageBreakdown {
127
127
  output: number;
128
128
  cacheRead: number;
129
129
  cacheWrite: number;
130
+ cacheWrite1h?: number;
130
131
  reasoningTokens: number;
131
132
  totalTokens: number;
132
133
  apiCalls?: number;
@@ -151,6 +152,7 @@ export interface CostEntry {
151
152
  output: number;
152
153
  cacheRead: number;
153
154
  cacheWrite: number;
155
+ cacheWrite1h?: number;
154
156
  reasoningTokens: number;
155
157
  apiCalls?: number;
156
158
  /** Absent on an ordinary turn's call. */
@@ -215,6 +217,7 @@ export function createCostTracker(): CostTracker {
215
217
  output,
216
218
  cacheRead,
217
219
  cacheWrite,
220
+ ...(breakdown?.cacheWrite1h === undefined ? {} : { cacheWrite1h: breakdown.cacheWrite1h }),
218
221
  reasoningTokens,
219
222
  ...(apiCalls !== undefined ? { apiCalls } : {}),
220
223
  ...(label !== undefined ? { label } : {}),
@@ -224,6 +227,7 @@ export function createCostTracker(): CostTracker {
224
227
  totals.output += output;
225
228
  totals.cacheRead += cacheRead;
226
229
  totals.cacheWrite += cacheWrite;
230
+ if (breakdown?.cacheWrite1h !== undefined) totals.cacheWrite1h = (totals.cacheWrite1h ?? 0) + breakdown.cacheWrite1h;
227
231
  totals.reasoningTokens += reasoningTokens;
228
232
  totals.totalTokens += tokens;
229
233
  return resolvedUsd;
@@ -247,6 +251,7 @@ export function createCostTracker(): CostTracker {
247
251
  totals.output = 0;
248
252
  totals.cacheRead = 0;
249
253
  totals.cacheWrite = 0;
254
+ delete totals.cacheWrite1h;
250
255
  totals.reasoningTokens = 0;
251
256
  totals.totalTokens = 0;
252
257
  },
@@ -64,6 +64,7 @@ function recordDispatchCost(
64
64
  output: payload.outputTokenCount ?? 0,
65
65
  cacheRead: payload.cacheReadTokenCount ?? 0,
66
66
  cacheWrite: payload.cacheWriteTokenCount ?? 0,
67
+ ...(payload.cacheWrite1hTokenCount === undefined ? {} : { cacheWrite1h: payload.cacheWrite1hTokenCount }),
67
68
  reasoningTokens: payload.reasoningTokenCount ?? 0,
68
69
  totalTokens: payload.tokenCount,
69
70
  },
@@ -78,6 +78,7 @@ export interface OutOfTurnUsage {
78
78
  output: number | null;
79
79
  cacheRead: number | null;
80
80
  cacheWrite: number | null;
81
+ cacheWrite1h?: number | null;
81
82
  reasoning: number | null;
82
83
  totalTokens: number | null;
83
84
  costUsd: number | null;
@@ -253,6 +254,7 @@ function asOutOfTurnUsageRow(value: unknown): OutOfTurnUsageRow | null {
253
254
  output: reading(usage.output),
254
255
  cacheRead: reading(usage.cacheRead),
255
256
  cacheWrite: reading(usage.cacheWrite),
257
+ ...(usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: nullableNumber(usage.cacheWrite1h) }),
256
258
  reasoning: reading(usage.reasoning),
257
259
  totalTokens: reading(usage.totalTokens),
258
260
  costUsd: reading(usage.costUsd),
@@ -202,6 +202,7 @@ export interface TraceSpendInput {
202
202
  outputTokens: number;
203
203
  cacheReadTokens: number;
204
204
  cacheWriteTokens: number;
205
+ cacheWrite1hTokens?: number;
205
206
  reasoningTokens: number;
206
207
  totalTokens: number;
207
208
  inputCostUsd?: number | null;
@@ -234,6 +235,7 @@ export interface SessionTurnUsage {
234
235
  outputTokens: number;
235
236
  cacheReadTokens: number;
236
237
  cacheWriteTokens: number;
238
+ cacheWrite1hTokens?: number;
237
239
  reasoningTokens: number;
238
240
  totalTokens: number;
239
241
  costUsd?: number | null;
@@ -363,6 +365,7 @@ export interface TracePhaseRow {
363
365
  output_tokens: number | null;
364
366
  cache_read_tokens: number | null;
365
367
  cache_write_tokens: number | null;
368
+ cache_write_1h_tokens?: number | null;
366
369
  reasoning_tokens: number | null;
367
370
  total_tokens: number | null;
368
371
  input_cost_usd: number | null;
@@ -443,7 +446,7 @@ CREATE TABLE phases (
443
446
  error TEXT,
444
447
  started_at TEXT,
445
448
  ended_at TEXT,
446
- input_tokens INTEGER, output_tokens INTEGER, cache_read_tokens INTEGER, cache_write_tokens INTEGER,
449
+ input_tokens INTEGER, output_tokens INTEGER, cache_read_tokens INTEGER, cache_write_tokens INTEGER, cache_write_1h_tokens INTEGER,
447
450
  reasoning_tokens INTEGER, total_tokens INTEGER,
448
451
  input_cost_usd REAL, output_cost_usd REAL, cache_read_cost_usd REAL, cache_write_cost_usd REAL,
449
452
  total_cost_usd REAL,
@@ -544,6 +547,13 @@ function ensureRunSourceColumn(db: DatabaseSync): void {
544
547
  db.prepare("UPDATE runs SET source = 'session' WHERE assignment_id = ?").run(SESSION_TRACE_ASSIGNMENT_ID);
545
548
  }
546
549
 
550
+ /** Missing lifetime detail stays NULL in older traces; it cannot be reconstructed. */
551
+ function ensureCacheWriteLifetimeColumn(db: DatabaseSync): void {
552
+ const columns = db.prepare("PRAGMA table_info(phases)").all() as { name: string }[];
553
+ if (!columns.some((column) => column.name === "cache_write_1h_tokens"))
554
+ db.exec("ALTER TABLE phases ADD COLUMN cache_write_1h_tokens INTEGER;");
555
+ }
556
+
547
557
  /**
548
558
  * Finalize `running` rows whose recorded owner is on this host and provably
549
559
  * dead (pid gone, or alive under a different birth token, i.e. reused). Rows
@@ -591,6 +601,7 @@ export class TraceStore {
591
601
  this.transaction(() => {
592
602
  ensureProcessOwnerColumns(this.db);
593
603
  ensureRunSourceColumn(this.db);
604
+ ensureCacheWriteLifetimeColumn(this.db);
594
605
  reconcileAbandonedRuns(this.db);
595
606
  });
596
607
  }
@@ -799,7 +810,7 @@ export class TraceStore {
799
810
  recordSpend(input: TraceSpendInput): void {
800
811
  this.transaction(() => {
801
812
  this.db
802
- .prepare(`UPDATE phases SET input_tokens=?, output_tokens=?, cache_read_tokens=?, cache_write_tokens=?,
813
+ .prepare(`UPDATE phases SET input_tokens=?, output_tokens=?, cache_read_tokens=?, cache_write_tokens=?, cache_write_1h_tokens=?,
803
814
  reasoning_tokens=?, total_tokens=?, input_cost_usd=?, output_cost_usd=?, cache_read_cost_usd=?,
804
815
  cache_write_cost_usd=?, total_cost_usd=?, context_tokens=?, context_window=? WHERE phase_id=? AND run_id=?`)
805
816
  .run(
@@ -807,6 +818,7 @@ export class TraceStore {
807
818
  input.outputTokens,
808
819
  input.cacheReadTokens,
809
820
  input.cacheWriteTokens,
821
+ input.cacheWrite1hTokens ?? null,
810
822
  input.reasoningTokens,
811
823
  input.totalTokens,
812
824
  input.inputCostUsd ?? null,
@@ -982,7 +994,7 @@ export class TraceStore {
982
994
  );
983
995
  this.db
984
996
  .prepare(`UPDATE phases SET status=?, attempt=?, retries=?, ended_at=?, error=?, input_tokens=?, output_tokens=?,
985
- cache_read_tokens=?, cache_write_tokens=?, reasoning_tokens=?, total_tokens=?, total_cost_usd=?
997
+ cache_read_tokens=?, cache_write_tokens=?, cache_write_1h_tokens=?, reasoning_tokens=?, total_tokens=?, total_cost_usd=?
986
998
  WHERE phase_id=?`)
987
999
  .run(
988
1000
  success ? "success" : "fail",
@@ -994,6 +1006,7 @@ export class TraceStore {
994
1006
  input.outputTokenCount ?? null,
995
1007
  input.cacheReadTokenCount ?? null,
996
1008
  input.cacheWriteTokenCount ?? null,
1009
+ input.cacheWrite1hTokenCount ?? null,
997
1010
  input.reasoningTokenCount ?? null,
998
1011
  input.tokenCount ?? null,
999
1012
  input.costUsd ?? null,
@@ -1113,7 +1126,7 @@ export class TraceStore {
1113
1126
  .run(input.status, input.at, usage?.totalTokens ?? null, usage?.costUsd ?? null, input.runId);
1114
1127
  this.db
1115
1128
  .prepare(`UPDATE phases SET status=?, ended_at=?, error=?, input_tokens=?, output_tokens=?,
1116
- cache_read_tokens=?, cache_write_tokens=?, reasoning_tokens=?, total_tokens=?, total_cost_usd=?
1129
+ cache_read_tokens=?, cache_write_tokens=?, cache_write_1h_tokens=?, reasoning_tokens=?, total_tokens=?, total_cost_usd=?
1117
1130
  WHERE phase_id=?`)
1118
1131
  .run(
1119
1132
  input.status,
@@ -1123,6 +1136,7 @@ export class TraceStore {
1123
1136
  usage?.outputTokens ?? null,
1124
1137
  usage?.cacheReadTokens ?? null,
1125
1138
  usage?.cacheWriteTokens ?? null,
1139
+ usage?.cacheWrite1hTokens ?? null,
1126
1140
  usage?.reasoningTokens ?? null,
1127
1141
  usage?.totalTokens ?? null,
1128
1142
  usage?.costUsd ?? null,
@@ -1186,13 +1200,24 @@ function traceDatabaseFootprintBytes(path: string): number {
1186
1200
  return total;
1187
1201
  }
1188
1202
 
1203
+ export interface TraceRunCursor {
1204
+ startedAt: string;
1205
+ runId: string;
1206
+ }
1207
+
1208
+ export interface TraceRunsPageOptions {
1209
+ before?: TraceRunCursor;
1210
+ limit?: number;
1211
+ filter?: { source?: TraceRunRow["source"]; status?: TraceRunRow["status"]; q?: string };
1212
+ }
1213
+
1189
1214
  export class TraceReader {
1190
1215
  readonly db: DatabaseSync;
1191
1216
  /**
1192
1217
  * `runs.source` is an additive column (see ensureRunSourceColumn) a
1193
1218
  * TraceStore writer backfills in place. A read-only reader can open a
1194
1219
  * database no writer has touched since before the column existed — the
1195
- * trace viewer opening a dormant install's trace.sqlite fresh is the
1220
+ * web application opening a dormant install's trace.sqlite fresh is the
1196
1221
  * realistic case — and cannot ALTER TABLE to fix that itself, so it
1197
1222
  * derives the same value the migration would have written instead.
1198
1223
  */
@@ -1223,6 +1248,40 @@ export class TraceReader {
1223
1248
  .all(clampInt(limit, 1, 500)) as unknown as TraceRunRow[];
1224
1249
  }
1225
1250
 
1251
+ /** Stable keyset pagination, including read-only databases predating runs.source. */
1252
+ runsPage({ before, limit = 50, filter = {} }: TraceRunsPageOptions = {}): {
1253
+ runs: TraceRunRow[];
1254
+ nextBefore: TraceRunCursor | null;
1255
+ } {
1256
+ const size = clampInt(limit, 1, 500);
1257
+ const where: string[] = [],
1258
+ args: SQLInputValue[] = [];
1259
+ if (before) {
1260
+ where.push("(started_at < ? OR (started_at = ? AND run_id < ?))");
1261
+ args.push(before.startedAt, before.startedAt, before.runId);
1262
+ }
1263
+ if (filter.source) {
1264
+ where.push("source = ?");
1265
+ args.push(filter.source);
1266
+ }
1267
+ if (filter.status) {
1268
+ where.push("status = ?");
1269
+ args.push(filter.status);
1270
+ }
1271
+ if (filter.q) {
1272
+ where.push("(run_id LIKE ? OR agent LIKE ? OR model LIKE ? OR status LIKE ? OR request LIKE ?)");
1273
+ args.push(...Array<string>(5).fill(`%${filter.q}%`));
1274
+ }
1275
+ const rows = this.db
1276
+ .prepare(
1277
+ `SELECT * FROM (SELECT ${this.runsSourceExpr} FROM runs) ${where.length ? `WHERE ${where.join(" AND ")}` : ""} ORDER BY started_at DESC, run_id DESC LIMIT ?`,
1278
+ )
1279
+ .all(...args, size + 1) as unknown as TraceRunRow[];
1280
+ const runs = rows.slice(0, size),
1281
+ last = runs.at(-1);
1282
+ return { runs, nextBefore: rows.length > size && last ? { startedAt: last.started_at, runId: last.run_id } : null };
1283
+ }
1284
+
1226
1285
  run(runId: string): TraceRunRow | null {
1227
1286
  return (
1228
1287
  (this.db.prepare(`SELECT ${this.runsSourceExpr} FROM runs WHERE run_id=?`).get(runId) as unknown as
@@ -1567,6 +1626,7 @@ function terminalUsage(input: DispatchCompletedPayload | DispatchFailedPayload):
1567
1626
  output: input.outputTokenCount ?? 0,
1568
1627
  cache_read: input.cacheReadTokenCount ?? 0,
1569
1628
  cache_write: input.cacheWriteTokenCount ?? 0,
1629
+ ...(input.cacheWrite1hTokenCount === undefined ? {} : { cache_write_1h: input.cacheWrite1hTokenCount }),
1570
1630
  reasoning_tokens: input.reasoningTokenCount ?? 0,
1571
1631
  total_tokens: input.tokenCount,
1572
1632
  };