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