@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +29 -0
- package/CONTRIBUTING.md +83 -74
- package/README.md +66 -45
- package/dist/{acp-W3Y3TRHD.js → acp-JWPQZM2D.js} +14 -14
- package/dist/{agents-J4ICNLQ3.js → agents-4GCDIRVX.js} +55 -54
- package/dist/assets/codewiki.json +1 -1
- package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
- package/dist/assets/web-notices/hono-LICENSE +21 -0
- package/dist/{auth-X2UJUMOC.js → auth-SYAKTDQE.js} +22 -22
- package/dist/background-OW67WMYR.js +37 -0
- package/dist/{builtins-XLXWWSRF.js → builtins-TKS63VNV.js} +4 -4
- package/dist/chunk-2JSCCEKO.js +85 -0
- package/dist/{chunk-QKWL7SYE.js → chunk-2SXGG2IV.js} +49 -38
- package/dist/{chunk-MZHXENL7.js → chunk-2U2U5POA.js} +5 -5
- package/dist/{chunk-NCCQ6DVS.js → chunk-2ZWLMA3T.js} +6 -6
- package/dist/{chunk-FQOOGXBH.js → chunk-36XSBPXL.js} +7 -7
- package/dist/{chunk-5AJPUR72.js → chunk-3IQOZRQ6.js} +7 -7
- package/dist/{chunk-4MFBBY2Z.js → chunk-44U2OUSM.js} +3 -3
- package/dist/{chunk-5ZSZEYJK.js → chunk-4P6M2TTE.js} +2 -2
- package/dist/{chunk-IZYTT3CD.js → chunk-526ABLHD.js} +6 -6
- package/dist/{chunk-BO4XV5VX.js → chunk-5C2OQHLR.js} +4 -4
- package/dist/chunk-5D2FNBMG.js +185 -0
- package/dist/{chunk-M6Z2V6YU.js → chunk-5HULHKT2.js} +5 -5
- package/dist/{chunk-PFLOULP3.js → chunk-5UG6EZI3.js} +4 -4
- package/dist/{chunk-WN552PKN.js → chunk-5W4FRA5Q.js} +280 -900
- package/dist/{chunk-KAFMW7WM.js → chunk-6R5MBXBJ.js} +1 -1
- package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
- package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
- package/dist/{chunk-GXIWHXDB.js → chunk-6X7VOCDY.js} +3 -3
- package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
- package/dist/{chunk-34XHRVKG.js → chunk-ARRUMZ7X.js} +2 -2
- package/dist/{chunk-3T4DXWP6.js → chunk-ATB3Q7YO.js} +1 -6
- package/dist/chunk-AUHVBIDW.js +19 -0
- package/dist/{chunk-L3Z5ANCV.js → chunk-BE4I3UJ2.js} +7 -7
- package/dist/chunk-BFPHMSK7.js +169 -0
- package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
- package/dist/{chunk-D2T66PDV.js → chunk-BIY22UUK.js} +35 -203
- package/dist/{chunk-VMATUZB6.js → chunk-D55WO5J7.js} +11 -11
- package/dist/{chunk-2O2LVQQK.js → chunk-E2NSPYLC.js} +4 -4
- package/dist/{chunk-IJMW64DX.js → chunk-EFXMQYI6.js} +32 -32
- package/dist/{chunk-GVZFCJHE.js → chunk-EPYATQMG.js} +18 -18
- package/dist/{chunk-MZNWZUJM.js → chunk-EXKUF426.js} +11 -11
- package/dist/{chunk-IMOD2YPV.js → chunk-F7Y6QTPL.js} +9 -19
- package/dist/{chunk-IQCNVLO6.js → chunk-FB3KTE2J.js} +10 -7
- package/dist/{chunk-3LXJOICS.js → chunk-FNVPQQYT.js} +2 -2
- package/dist/{chunk-UUQ5G6EZ.js → chunk-GEYX2NZ5.js} +2 -2
- package/dist/{chunk-CP3HIR5H.js → chunk-GJBJHJNY.js} +19 -18
- package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
- package/dist/{chunk-WT5TRMO4.js → chunk-GVU4CXPJ.js} +179 -65
- package/dist/{chunk-TZ6UVP2H.js → chunk-H5DPSUBB.js} +8 -8
- package/dist/{chunk-EUEXGXXR.js → chunk-H77XBUBM.js} +5 -5
- package/dist/{config-YXARKGTX.js → chunk-HMGAKB7E.js} +15 -259
- package/dist/{chunk-EUZRMP4Y.js → chunk-HP7KJ5O2.js} +19 -19
- package/dist/chunk-HVCAY2FH.js +67 -0
- package/dist/{chunk-CPXGJI2A.js → chunk-ICYIUNO4.js} +4 -4
- package/dist/{chunk-GI5RRMAH.js → chunk-IILXVWJY.js} +7 -7
- package/dist/{chunk-MNQN3X6Y.js → chunk-JCVIL6TY.js} +5 -5
- package/dist/chunk-JIMWEYWO.js +63 -0
- package/dist/{chunk-C3G5PNUO.js → chunk-JLBVCROW.js} +25 -25
- package/dist/chunk-JOBN2YQQ.js +176 -0
- package/dist/chunk-JOL2QRLE.js +152 -0
- package/dist/{chunk-N37QC5FV.js → chunk-JRA6OBHY.js} +5 -5
- package/dist/{chunk-C6GEXX4L.js → chunk-JV25I7ID.js} +7 -7
- package/dist/{chunk-SEDI5K5B.js → chunk-JYKUMHCQ.js} +16 -16
- package/dist/{chunk-UA6W4XFJ.js → chunk-K3W6BF5C.js} +2 -2
- package/dist/chunk-K45LHSCI.js +194 -0
- package/dist/{chunk-UA3W4FGC.js → chunk-K53E2PTW.js} +5 -5
- package/dist/{chunk-VCRVEDUC.js → chunk-K5UJD6MM.js} +5 -5
- package/dist/{chunk-65BGHOUR.js → chunk-KGP3UQGJ.js} +5 -5
- package/dist/chunk-KKRXONXG.js +43 -0
- package/dist/{chunk-LBFQMYS3.js → chunk-KWJXCL2X.js} +5 -3
- package/dist/{chunk-RTLNFZMD.js → chunk-L75H5B3B.js} +3 -3
- package/dist/{chunk-G4LGUTOE.js → chunk-LLCGGVSW.js} +6 -6
- package/dist/{chunk-HRAKUPIH.js → chunk-LZCCBLRC.js} +5 -5
- package/dist/{chunk-WURGVOZJ.js → chunk-LZDLYSUN.js} +18 -14
- package/dist/{chunk-ISNCCX42.js → chunk-MATCRH3M.js} +7 -6
- package/dist/{chunk-BAU36233.js → chunk-MEHBW2SP.js} +7 -7
- package/dist/{chunk-BQQ5MXUC.js → chunk-MUXNDNMZ.js} +3 -3
- package/dist/{chunk-NO7J45X6.js → chunk-MWMW53WW.js} +90 -51
- package/dist/chunk-MZDPF35R.js +45 -0
- package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
- package/dist/{chunk-T334FW2H.js → chunk-O2QJDRWP.js} +5 -5
- package/dist/{chunk-T7QQBNLH.js → chunk-O3HSB2YL.js} +9 -7
- package/dist/{chunk-WB7POC6M.js → chunk-OEMFEL26.js} +6 -6
- package/dist/{chunk-77CZRFTE.js → chunk-OPC4DQD6.js} +2 -2
- package/dist/{chunk-4UHVS5T7.js → chunk-ORRNGQDV.js} +8 -8
- package/dist/{chunk-TZHN5ITX.js → chunk-P4JS3MH5.js} +5 -5
- package/dist/{chunk-WBVKKTUT.js → chunk-P7GTE4FX.js} +2 -2
- package/dist/{chunk-6TAATXXH.js → chunk-PAQVETLA.js} +6 -6
- package/dist/{chunk-6CA2BHOR.js → chunk-PFZJMXIY.js} +4 -4
- package/dist/{chunk-4QKAITQT.js → chunk-PGEFOTJB.js} +70 -7
- package/dist/{chunk-MBJO5VNZ.js → chunk-PJ5H5B7A.js} +25 -25
- package/dist/{chunk-DO7M3LSX.js → chunk-PMUUAABD.js} +43 -96
- package/dist/{chunk-A67NR5AT.js → chunk-Q32C6AWI.js} +11 -8
- package/dist/{chunk-ECOMVOHP.js → chunk-QGIC5SX5.js} +2 -2
- package/dist/{chunk-5CMARGPF.js → chunk-QLAGXTTV.js} +7 -2
- package/dist/{chunk-GFQ7P2UF.js → chunk-QLKCCC2J.js} +9 -9
- package/dist/{chunk-SELG4SUR.js → chunk-QWUSS2QP.js} +7 -4
- package/dist/{chunk-P5SC4DLJ.js → chunk-QYSAZMSH.js} +2 -2
- package/dist/{fleet-decisions-S3PTZV2D.js → chunk-R5NRX5N4.js} +5 -41
- package/dist/{chunk-DLIYANB7.js → chunk-RAUOKUZV.js} +11 -11
- package/dist/{chunk-UFYNOQK4.js → chunk-RBES4TCZ.js} +7 -7
- package/dist/{chunk-T52TPHYC.js → chunk-RFULVPBX.js} +4 -4
- package/dist/{chunk-TLTGZTXI.js → chunk-RKFNU5UA.js} +3 -3
- package/dist/{chunk-T4TY5GG3.js → chunk-RM3XJX7P.js} +3 -3
- package/dist/{chunk-6YA46L5A.js → chunk-RNLAPBJL.js} +2 -2
- package/dist/chunk-RPMNIFRY.js +65 -0
- package/dist/{chunk-DACXIVVF.js → chunk-RRZFRIJP.js} +5 -5
- package/dist/{chunk-CE64C5K5.js → chunk-RXI7K4J5.js} +61 -61
- package/dist/{chunk-CULVKYTK.js → chunk-STC6CWUZ.js} +5 -5
- package/dist/{chunk-6YHPAAZR.js → chunk-TEHVMHOK.js} +3 -3
- package/dist/{chunk-VTYHHQ57.js → chunk-TOPICHGR.js} +2 -2
- package/dist/{chunk-UWD3JD5X.js → chunk-UB33F3YW.js} +10 -10
- package/dist/{chunk-TN5FW4XY.js → chunk-UDAK6GR2.js} +12 -9
- package/dist/chunk-USBBEKHW.js +177 -0
- package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
- package/dist/{chunk-6LRLOJHQ.js → chunk-W7KNI3F5.js} +11 -62
- package/dist/chunk-WFTSK7N3.js +637 -0
- package/dist/{chunk-YPRSNUTC.js → chunk-WJWNZXRM.js} +2 -2
- package/dist/chunk-WS4FOGLY.js +686 -0
- package/dist/{chunk-ZGIGW4ZG.js → chunk-WTZVSMQZ.js} +5 -5
- package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
- package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
- package/dist/chunk-XC5POIL4.js +68 -0
- package/dist/{chunk-XZ6UFQ52.js → chunk-XTLJDC2X.js} +22 -17
- package/dist/{chunk-7EEGBKV4.js → chunk-YGIV24MF.js} +8 -8
- package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
- package/dist/{chunk-4N2RZ4TO.js → chunk-YKIIWURD.js} +3 -3
- package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
- package/dist/{chunk-KS7ETA3P.js → chunk-YXANQGCX.js} +6 -6
- package/dist/{chunk-HOX4YZ2K.js → chunk-YXFKLMX2.js} +5 -5
- package/dist/chunk-ZST3FRCV.js +132 -0
- package/dist/cli/index.js +39 -37
- package/dist/{clio-L2P7S2R2.js → clio-BPBAPZGA.js} +9 -9
- package/dist/{code-nav-B5LNX4KU.js → code-nav-KBQ3RIFK.js} +33 -33
- package/dist/{components-63MMQKUT.js → components-6DKAXWFN.js} +10 -10
- package/dist/config-FWL5JK2H.js +270 -0
- package/dist/config-graph-ACDB26L2.js +156 -0
- package/dist/{configure-LMVQJ46J.js → configure-ZIZ4YV62.js} +48 -48
- package/dist/{context-7HJEWTTP.js → context-EZZPT2ZV.js} +49 -49
- package/dist/{context-YG2LZDYZ.js → context-VIL5MFRH.js} +86 -84
- package/dist/{context-XSZKKFBW.js → context-Z3GOBHDK.js} +16 -16
- package/dist/{context-clear-AC5NXHM2.js → context-clear-ZPB3L7MN.js} +72 -70
- package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
- package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
- package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-2GLBVF7L.js} +23 -22
- package/dist/{detail-H73BEF2N.js → detail-VSBWYSGZ.js} +73 -71
- package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-EEEHGKX4.js} +78 -76
- package/dist/docs-VMMWFVHL.js +101 -0
- package/dist/{doctor-EQYJOGUG.js → doctor-V5L4IQGP.js} +63 -62
- package/dist/{eval-4P7O6CCE.js → eval-VJYJ2BV3.js} +80 -65
- package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
- package/dist/evals-J2H5V6DD.js +104 -0
- package/dist/{evidence-D6GUSYJW.js → evidence-POWAEBEW.js} +72 -70
- package/dist/evidence-XCCCLS36.js +242 -0
- package/dist/{evidence-O76QF7TZ.js → evidence-Y35YSXH6.js} +80 -78
- package/dist/{evolve-H47BCETS.js → evolve-GPG72VB6.js} +74 -72
- package/dist/{extensions-NNL3ZOCU.js → extensions-YIZ7W3DA.js} +12 -11
- package/dist/fleet-2MDCQ2VK.js +264 -0
- package/dist/{fleet-KMNS6NOM.js → fleet-W2AF3TOJ.js} +127 -123
- package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-WS56G26H.js} +11 -11
- package/dist/fleet-decisions-MYGZ3JW7.js +52 -0
- package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-ELTBXBAV.js} +22 -22
- package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-45IK73L4.js} +84 -248
- package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-T5NCZKHE.js} +4 -4
- package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-VG4JBLA4.js} +26 -26
- package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-VTSABAYO.js} +72 -70
- package/dist/{fleet-view-BHJFW26B.js → fleet-view-XC7WMKSS.js} +75 -73
- package/dist/{init-XAT5N5YM.js → init-VTJNNTIP.js} +95 -92
- package/dist/install-6PIF6F6W.js +19 -0
- package/dist/{interop-FVECHFKG.js → interop-IU6BNA7C.js} +25 -25
- package/dist/{inventory-7KFQGLCV.js → inventory-QPQUTUUZ.js} +75 -73
- package/dist/{library-NY2XOT75.js → library-HUTAS57T.js} +33 -33
- package/dist/{library-QAPAO23R.js → library-LF7DLU6S.js} +13 -13
- package/dist/library-Q3NWL5CM.js +75 -0
- package/dist/{library-import-5Y6MAS3R.js → library-import-PPW4YUC5.js} +25 -25
- package/dist/{library-inventory-JT6HWITQ.js → library-inventory-DIRVFRZU.js} +19 -19
- package/dist/{library-validation-EQUH25DC.js → library-validation-XHUZ3INE.js} +17 -17
- package/dist/{memory-DYVTTCP6.js → memory-Z2LSKNV6.js} +74 -72
- package/dist/{models-MASFJ6Y2.js → models-3FTREYPY.js} +53 -52
- package/dist/{monitor-YMP4NXJJ.js → monitor-HF2MQRB3.js} +83 -80
- package/dist/{orchestrator-AFQRRTEI.js → orchestrator-UYPA6W4S.js} +498 -358
- package/dist/{panes-NICTHQCV.js → panes-736XB73K.js} +14 -14
- package/dist/{panes-D3Y2KFG5.js → panes-C4P3PIWT.js} +4 -4
- package/dist/{paths-PSFAUIGO.js → paths-JQ4QYIYB.js} +6 -6
- package/dist/{preload-5Q7VXRFJ.js → preload-XSLRYH3Y.js} +72 -70
- package/dist/{reset-7NKZK7JN.js → reset-V7QSPZYE.js} +9 -9
- package/dist/{resources-NILSIZAT.js → resources-OJGDFHYT.js} +22 -22
- package/dist/{run-BPZGEBZV.js → run-T354SMDW.js} +129 -125
- package/dist/settings-MWZXO6RV.js +72 -0
- package/dist/{share-EZ6ERBMH.js → share-Y5ZKJPND.js} +26 -26
- package/dist/{skills-BTVVNYVM.js → skills-4GLZC4LN.js} +28 -28
- package/dist/{skills-eval-UY34MNK7.js → skills-eval-L5T7GODM.js} +87 -85
- package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-LASKXEZI.js} +22 -22
- package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-OIMRU36D.js} +49 -49
- package/dist/{steer-2B3EQGFH.js → steer-KMAM2Y2C.js} +4 -4
- package/dist/{support-L2SOL3IE.js → support-AWC3XKPX.js} +8 -8
- package/dist/system-CD75NYBU.js +116 -0
- package/dist/{targets-44VKGFLN.js → targets-VSZX2J2S.js} +66 -65
- package/dist/{tasks-3KODKFU7.js → tasks-AN567LYH.js} +14 -14
- package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-6KTWNHVY.js} +3 -3
- package/dist/{tools-3UB7TEVR.js → tools-AGRK3V5J.js} +13 -13
- package/dist/{trace-TAMIU4OJ.js → trace-P4MQZD33.js} +18 -67
- package/dist/{uninstall-QYVRPEM4.js → uninstall-BRUTEPIC.js} +37 -12
- package/dist/{upgrade-7PMKM2JH.js → upgrade-SBCGHQGJ.js} +22 -21
- package/dist/{usage-6EQV7EQK.js → usage-BIDVTO6V.js} +93 -87
- package/dist/{verifiers-JLITWSHU.js → verifiers-LTGCAMXS.js} +12 -12
- package/dist/{verify-T7NAEVIG.js → verify-OZU4LLNP.js} +9 -9
- package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
- package/dist/web/client/assets/abnfDiagram-VCTEODGH-C5wfoHm3.js +1 -0
- package/dist/web/client/assets/arc-oH91sfLl.js +1 -0
- package/dist/web/client/assets/architecture-7GRP2DOG-EGozsYEO.js +1 -0
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-z9FokbJl.js +36 -0
- package/dist/web/client/assets/array-BifhSqXX.js +1 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
- package/dist/web/client/assets/blockDiagram-I7D4REHJ-wi0_CYHL.js +129 -0
- package/dist/web/client/assets/c4Diagram-7LVT6UL2-DV7NYc2W.js +38 -0
- package/dist/web/client/assets/channel-CiUWbHN9.js +1 -0
- package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/client/assets/chunk-4HAMMTFA-Bhsegh3F.js +62 -0
- package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/client/assets/chunk-75Z2AOVW-RQCckcQG.js +2 -0
- package/dist/web/client/assets/chunk-DU6HZSFF-C5USiOAy.js +125 -0
- package/dist/web/client/assets/chunk-F27PBJKO-BcNqv2x1.js +1 -0
- package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
- package/dist/web/client/assets/chunk-GMAD6QVW-Bq8JWiZT.js +72 -0
- package/dist/web/client/assets/chunk-GVQU2GXP-DbchrAeJ.js +1 -0
- package/dist/web/client/assets/chunk-IMKFNOWR-DrpvjocK.js +231 -0
- package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/client/assets/chunk-L3NEJ4N5-DHLmTnCe.js +1 -0
- package/dist/web/client/assets/chunk-OSK3NFVY-CsRbtN9n.js +10 -0
- package/dist/web/client/assets/chunk-P2QGCYS3-aqPbxoMh.js +1 -0
- package/dist/web/client/assets/chunk-POPQ4Y6H-Dl5vw0h0.js +1 -0
- package/dist/web/client/assets/chunk-PWAF6VOD-D7OBRSdO.js +1 -0
- package/dist/web/client/assets/chunk-SHT3W25Y-CdKCIwuB.js +168 -0
- package/dist/web/client/assets/chunk-SVP7TREG-B94Nu_1-.js +88 -0
- package/dist/web/client/assets/chunk-TICWLB2K-jjRQI_hk.js +206 -0
- package/dist/web/client/assets/chunk-XXDRQBXY-azkbKE37.js +1 -0
- package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/web/client/assets/classDiagram-ZZMXUADV-CMODalmo.js +1 -0
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-CMODalmo.js +1 -0
- package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
- package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-RbQL23qS.js +1 -0
- package/dist/web/client/assets/cynefin-OW5HDTMX--i9RDU5f.js +1 -0
- package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-cRcvyBdp.js +62 -0
- package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
- package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
- package/dist/web/client/assets/dagre-GXQ25YYZ-C9mZmAPe.js +4 -0
- package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/client/assets/diagram-S7CK7UJ4-Oj_zlLDY.js +30 -0
- package/dist/web/client/assets/diagram-UQ7AKVKN-BWKbbfcR.js +41 -0
- package/dist/web/client/assets/diagram-VSXAHHWV-C3N3f7DO.js +3 -0
- package/dist/web/client/assets/diagram-VX7I27RA-CtDKDAWe.js +24 -0
- package/dist/web/client/assets/diagram-Z3DM3KII-B8bkBRCz.js +24 -0
- package/dist/web/client/assets/dist-D0_q-A2b.js +1 -0
- package/dist/web/client/assets/ebnfDiagram-PWID7BFC-CskW-Whx.js +1 -0
- package/dist/web/client/assets/erDiagram-RLTQ6QDP-C-83cgCW.js +99 -0
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-DjVq8wKU.js +1 -0
- package/dist/web/client/assets/flowDiagram-HODETNUW-BUiCBGXt.js +1 -0
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-B2lb8lvF.js +292 -0
- package/dist/web/client/assets/gitGraph-4MIJSDKK-B40cQtBE.js +1 -0
- package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CH-7P7Di.js +106 -0
- package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/client/assets/index-Dsi52apB.css +1 -0
- package/dist/web/client/assets/index-FSIC94pi.js +83 -0
- package/dist/web/client/assets/info-A6RAGUB7-eCCE9D_Q.js +1 -0
- package/dist/web/client/assets/infoDiagram-27XIBGKW-DRnvqMjM.js +2 -0
- package/dist/web/client/assets/init-C-OQMol4.js +1 -0
- package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-DBA_55wp.js +70 -0
- package/dist/web/client/assets/journeyDiagram-3NMN7TZE-C-ewpNl7.js +139 -0
- package/dist/web/client/assets/kanban-definition-UXKFOSKX-B1taGsu0.js +89 -0
- package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
- package/dist/web/client/assets/line-lZ0kyxDI.js +1 -0
- package/dist/web/client/assets/linear-DIc8FgZj.js +1 -0
- package/dist/web/client/assets/mermaid-parser.core-SXolxpXw.js +7 -0
- package/dist/web/client/assets/mermaid.core-DXgQtkNg.js +44 -0
- package/dist/web/client/assets/mindmap-definition-YA3MSWOX-DXJas9K7.js +96 -0
- package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
- package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
- package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
- package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web/client/assets/packet-AYTQ26CC-OqVl_07o.js +1 -0
- package/dist/web/client/assets/path-fybaL0A-.js +1 -0
- package/dist/web/client/assets/pegDiagram-XKGWAZYB-CPE_zdfN.js +1 -0
- package/dist/web/client/assets/pie-WAS4IAKB-DAxnMBLe.js +1 -0
- package/dist/web/client/assets/pieDiagram-E7YTZNPT-Uwjpufxv.js +39 -0
- package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
- package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
- package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
- package/dist/web/client/assets/prism-core-BngLtbUd.js +1 -0
- package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
- package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
- package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
- package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
- package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
- package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
- package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
- package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
- package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
- package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
- package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
- package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
- package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
- package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
- package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
- package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
- package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
- package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
- package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
- package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
- package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
- package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
- package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
- package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
- package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
- package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
- package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-Bjs4yjgs.js +7 -0
- package/dist/web/client/assets/radar-RG4KPBEZ-CuCKjHM3.js +1 -0
- package/dist/web/client/assets/railroad-74A4TZTK-CnQK-Cc1.js +1 -0
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-BcW01NZG.js +1 -0
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-B7YCEDDd.js +1 -0
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-DjNZbSTZ.js +1 -0
- package/dist/web/client/assets/railroadDiagram-O6MQD6OU-BDDIPNLL.js +1 -0
- package/dist/web/client/assets/requirementDiagram-BXWQKSXE-B5Ydyxc1.js +84 -0
- package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-Bw2Qym75.js +40 -0
- package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-BZf36nO0.js +162 -0
- package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- package/dist/web/client/assets/src-yeptRXpt.js +1 -0
- package/dist/web/client/assets/stateDiagram-D77RDMKH-DnH6JRkp.js +1 -0
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-C7QtHeK4.js +1 -0
- package/dist/web/client/assets/swimlanes-42K2YHIH-D9PZmtZg.js +1 -0
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-CBZlPFky.js +8 -0
- package/dist/web/client/assets/timeline-definition-24CTP7MA-CrkZZBo7.js +120 -0
- package/dist/web/client/assets/treeView-Q6P3EWNA-C9zDShoC.js +1 -0
- package/dist/web/client/assets/treemap-WGGIJYW6-B-plj9yK.js +1 -0
- package/dist/web/client/assets/vennDiagram-4TSXK5OY-VeOdaphN.js +34 -0
- package/dist/web/client/assets/wardley-WFR3VGLG-Wl1P_m6L.js +1 -0
- package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-B85-R9t2.js +78 -0
- package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BrD8OW8m.js +7 -0
- package/dist/web/client/clio-coder-logo.webp +0 -0
- package/dist/web/client/icon-192.png +0 -0
- package/dist/web/client/icon-512.png +0 -0
- package/dist/web/client/index.html +4 -0
- package/dist/web/client/manifest.webmanifest +15 -0
- package/dist/web/client/offline.css +55 -0
- package/dist/web/client/offline.html +5 -0
- package/dist/web/client/offline.js +27 -0
- package/dist/web/client/sw.js +34 -0
- package/dist/web/ops-worker.js +37 -0
- package/dist/web/reads-worker.js +1726 -0
- package/dist/web/server.js +8499 -0
- package/dist/web-EU6ATJWA.js +13 -0
- package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-U22Q7HV4.js} +3 -3
- package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-LZRLFG6I.js} +98 -95
- package/dist/{with-panes-CHFC7HGI.js → with-panes-X5CZOGML.js} +9 -9
- package/dist/worker/entry.js +68 -68
- package/docs/README.md +27 -26
- package/docs/architecture/acp.md +5 -9
- package/docs/architecture/alcf-provider.md +0 -3
- package/docs/architecture/architecture.md +0 -3
- package/docs/architecture/artifact-placement.md +0 -3
- package/docs/architecture/artifact-versions.md +0 -3
- package/docs/architecture/capacity-and-scheduling.md +0 -3
- package/docs/architecture/context-engine.md +0 -3
- package/docs/architecture/context-working-set.md +0 -3
- package/docs/architecture/dispatch-architecture-rationale.md +0 -3
- package/docs/architecture/dispatch-typed-intent.md +0 -3
- package/docs/architecture/evidence-and-memory.md +0 -3
- package/docs/architecture/library.md +0 -2
- package/docs/architecture/middleware-and-components.md +0 -3
- package/docs/architecture/model-catalog.md +1 -4
- package/docs/architecture/observability.md +0 -3
- package/docs/architecture/pi-boundary.md +6 -9
- package/docs/architecture/prompt-envelope-and-tools.md +1 -4
- package/docs/architecture/provider-adapter-cookbook.md +1 -4
- package/docs/architecture/safety-model.md +0 -3
- package/docs/architecture/session-lifecycle.md +0 -3
- package/docs/architecture/time-conventions.md +0 -3
- package/docs/architecture/trace-store.md +28 -20
- package/docs/architecture/tui-design.md +1 -4
- package/docs/architecture/worker-context.md +1 -3
- package/docs/architecture/worker-dispatch-mechanics.md +1 -4
- package/docs/guide/authoring-plugins.md +1 -3
- package/docs/guide/built-in-agents.md +0 -3
- package/docs/guide/commands-and-modes.md +2 -6
- package/docs/guide/configuration-and-targets.md +197 -4
- package/docs/guide/configuration-reference.md +9 -4
- package/docs/guide/environment-variables.md +0 -3
- package/docs/guide/exit-codes-and-output.md +0 -3
- package/docs/guide/extensions-and-sharing.md +0 -3
- package/docs/guide/fleet-dispatch.md +0 -3
- package/docs/guide/glossary.md +0 -3
- package/docs/guide/harness-extensions.md +0 -2
- package/docs/guide/installation-and-lifecycle.md +1 -4
- package/docs/guide/interop.md +0 -2
- package/docs/guide/panes-and-files.md +0 -3
- package/docs/guide/plugins.md +0 -3
- package/docs/guide/proactive-memory.md +0 -3
- package/docs/guide/resource-library.md +0 -2
- package/docs/guide/skills-marketplace.md +0 -2
- package/docs/guide/tool-usage.md +0 -3
- package/docs/guide/troubleshooting.md +0 -3
- package/docs/history/config-knobs-audit.md +0 -3
- package/docs/history/release-cut-checklist.md +0 -3
- package/docs/process/development-pipeline.md +0 -3
- package/docs/process/documentation-coverage.md +3 -3
- package/docs/process/documentation-guide.md +15 -22
- package/docs/process/eval-runner.md +0 -3
- package/docs/process/evals-internal.md +0 -3
- package/docs/process/evolution.md +0 -3
- package/docs/process/fleet-demo-runbook.md +0 -3
- package/docs/process/git-commit-provenance.md +0 -3
- package/docs/process/performance-methodology.md +1 -4
- package/docs/process/release-cut-checklist.md +114 -221
- package/docs/process/scientific-validation.md +1 -4
- package/library/registry.yaml +2 -2
- package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
- package/library/skills/meta/clio-coder-test/evals.md +16 -2
- package/library/skills/meta/clio-coder-test/plugin.json +1 -1
- package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
- package/library/skills/registry.yaml +2 -2
- package/library/skills/skill-marketplace.json +1 -1
- package/package.json +13 -11
- package/src/cli/docs.ts +65 -328
- package/src/cli/index.ts +3 -1
- package/src/cli/trace.ts +4 -65
- package/src/cli/uninstall.ts +26 -0
- package/src/cli/usage.ts +3 -0
- package/src/cli/web.ts +79 -0
- package/src/core/bus-events.ts +3 -4
- package/src/core/config.ts +71 -0
- package/src/core/domain-loader.ts +37 -28
- package/src/core/termination.ts +13 -9
- package/src/domains/agents/contract.ts +1 -1
- package/src/domains/agents/extension.ts +18 -10
- package/src/domains/config/extension.ts +5 -4
- package/src/domains/dispatch/extension.ts +75 -12
- package/src/domains/dispatch/index.ts +1 -0
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-integrity.ts +3 -0
- package/src/domains/dispatch/state.ts +1 -2
- package/src/domains/dispatch/types.ts +2 -0
- package/src/domains/eval/metrics/tracked.ts +22 -2
- package/src/domains/extensions/operator-runtime.ts +3 -1
- package/src/domains/middleware/hooks.ts +2 -2
- package/src/domains/observability/background-memory-usage.ts +3 -0
- package/src/domains/observability/compaction-usage.ts +2 -0
- package/src/domains/observability/cost.ts +5 -0
- package/src/domains/observability/extension.ts +1 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -0
- package/src/domains/observability/trace-store.ts +65 -5
- package/src/domains/prompts/extension.ts +4 -17
- package/src/domains/providers/cache-deployment.ts +147 -0
- package/src/domains/providers/catalog.ts +12 -7
- package/src/domains/providers/extension.ts +27 -5
- package/src/domains/providers/index.ts +1 -0
- package/src/domains/providers/plugins.ts +3 -13
- package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
- package/src/domains/providers/types/target-descriptor.ts +17 -0
- package/src/domains/session/compaction/compact.ts +4 -1
- package/src/domains/session/entries.ts +1 -0
- package/src/domains/session/usage.ts +6 -7
- package/src/engine/acp/server.ts +11 -0
- package/src/engine/ai.ts +2 -0
- package/src/engine/apis/openai-completions.ts +9 -4
- package/src/engine/prewarm.ts +232 -0
- package/src/engine/provider-diagnostics.ts +6 -1
- package/src/entry/orchestrator.ts +20 -16
- package/src/interactive/chat-loop-messages.ts +3 -0
- package/src/interactive/chat-loop.ts +2 -8
- package/src/interactive/prewarm.ts +11 -197
- package/src/interactive/session-usage-reseed.ts +2 -0
- package/src/interactive/side-question.ts +2 -0
- package/src/interactive/turn-context.ts +1 -0
- package/src/interactive/turn-persistence.ts +3 -0
- package/src/interactive/turn-prewarm.ts +126 -19
- package/src/interactive/turn-runtime.ts +14 -0
- package/src/tools/builtin-tool-catalog.ts +8 -4
- package/src/tools/registry.ts +12 -2
- package/src/worker/spec-contract.ts +27 -0
- 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 = {
|
|
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 = {
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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(
|
|
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
|
|
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
|
|
14
|
-
*
|
|
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
|
-
*
|
|
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
|
};
|