@iowarp/clio-coder 0.4.8 → 0.4.9
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/CHANGELOG.md +82 -0
- package/README.md +7 -6
- package/dist/{acp-JWPQZM2D.js → acp-ZWZCPS2A.js} +13 -13
- package/dist/{agents-4GCDIRVX.js → agents-LYSOWZUE.js} +53 -52
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-SYAKTDQE.js → auth-WBQGKWQ5.js} +27 -27
- package/dist/{background-OW67WMYR.js → background-BUMOBAQN.js} +4 -4
- package/dist/{builtins-TKS63VNV.js → builtins-ODRJOEDI.js} +7 -7
- package/dist/{chunk-JLBVCROW.js → chunk-2DRRZ57Q.js} +33 -24
- package/dist/chunk-2JBZYUPY.js +105 -0
- package/dist/chunk-2KUBKL63.js +336 -0
- package/dist/{chunk-K45LHSCI.js → chunk-2VBWFXYE.js} +7 -3
- package/dist/{chunk-XTLJDC2X.js → chunk-2X2R3UTH.js} +23 -18
- package/dist/{chunk-5HULHKT2.js → chunk-37LW32LZ.js} +5 -5
- package/dist/{chunk-W7KNI3F5.js → chunk-3AND2EFU.js} +5 -5
- package/dist/{chunk-36XSBPXL.js → chunk-3RDHGNU7.js} +95 -27
- package/dist/{chunk-BIY22UUK.js → chunk-3SUDBGEI.js} +11 -10
- package/dist/{chunk-3IQOZRQ6.js → chunk-3TQN67I2.js} +7 -7
- package/dist/{chunk-KWJXCL2X.js → chunk-3U4BL2EV.js} +3 -3
- package/dist/{chunk-RBES4TCZ.js → chunk-3UQADNG2.js} +3 -3
- package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
- package/dist/{chunk-MWMW53WW.js → chunk-4ATBOFRP.js} +649 -193
- package/dist/{chunk-QGIC5SX5.js → chunk-4DNL43EZ.js} +3 -3
- package/dist/{chunk-GVU4CXPJ.js → chunk-4HFJKRGZ.js} +113 -54
- package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
- package/dist/{chunk-LZDLYSUN.js → chunk-5RTEFNBP.js} +3 -3
- package/dist/{chunk-HMGAKB7E.js → chunk-64XJW7NT.js} +15 -15
- package/dist/{chunk-EXKUF426.js → chunk-7FBCRWVT.js} +280 -280
- package/dist/{chunk-K3W6BF5C.js → chunk-7JSOSVLP.js} +2 -2
- package/dist/{chunk-WFTSK7N3.js → chunk-7N3OLLSL.js} +4 -4
- package/dist/{chunk-JRA6OBHY.js → chunk-A6DULIMH.js} +17 -5
- package/dist/{chunk-R5NRX5N4.js → chunk-AB3QXXBC.js} +2 -2
- package/dist/chunk-ACCECAH4.js +49 -0
- package/dist/{chunk-GJBJHJNY.js → chunk-AM6CEP2K.js} +5 -5
- package/dist/{chunk-MUXNDNMZ.js → chunk-AY4XE6GN.js} +19 -13
- package/dist/{chunk-MATCRH3M.js → chunk-BBA2TAWV.js} +9 -9
- package/dist/{chunk-PMUUAABD.js → chunk-BMNVVKEW.js} +9 -9
- package/dist/{chunk-TOPICHGR.js → chunk-CTGZCEI6.js} +2 -2
- package/dist/{chunk-L75H5B3B.js → chunk-DIAJYJYG.js} +2 -2
- package/dist/{chunk-JIMWEYWO.js → chunk-EHZRAB4U.js} +2 -2
- package/dist/{chunk-YXANQGCX.js → chunk-EM2DIQAJ.js} +6 -6
- package/dist/{chunk-JCVIL6TY.js → chunk-ETF4ROKH.js} +4 -4
- package/dist/{chunk-5W4FRA5Q.js → chunk-F2YM3JY4.js} +483 -253
- package/dist/{chunk-YGIV24MF.js → chunk-FEBQWHJT.js} +21 -16
- package/dist/{chunk-PGEFOTJB.js → chunk-FPS4R2RN.js} +5 -4
- package/dist/{chunk-XC5POIL4.js → chunk-G5R53COU.js} +1 -1
- package/dist/chunk-GHXGMFQ5.js +40 -0
- package/dist/{chunk-QLKCCC2J.js → chunk-GJDRMBDI.js} +14 -14
- package/dist/{chunk-2ZWLMA3T.js → chunk-GREYLTZ5.js} +7 -7
- package/dist/{chunk-YXFKLMX2.js → chunk-H2WSCZZT.js} +22 -6
- package/dist/{chunk-FNVPQQYT.js → chunk-H6IUCY6Q.js} +2 -2
- package/dist/{chunk-5C2OQHLR.js → chunk-H72DCH3E.js} +92 -203
- package/dist/{chunk-JYKUMHCQ.js → chunk-H7TXJR23.js} +21 -21
- package/dist/chunk-HBJQQTKM.js +40 -0
- package/dist/chunk-HCVKSGNZ.js +990 -0
- package/dist/{chunk-ARRUMZ7X.js → chunk-I47EJPYL.js} +3 -3
- package/dist/{chunk-YKIIWURD.js → chunk-IALGWTLO.js} +3 -3
- package/dist/{chunk-FB3KTE2J.js → chunk-IALZJE37.js} +4 -4
- package/dist/{chunk-RAUOKUZV.js → chunk-IC7JXLOM.js} +15 -10
- package/dist/{chunk-LLCGGVSW.js → chunk-IOSVTTCD.js} +7 -7
- package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
- package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
- package/dist/{chunk-UDAK6GR2.js → chunk-JIYWMQZ5.js} +2 -2
- package/dist/{chunk-O3HSB2YL.js → chunk-JKU34ACI.js} +2 -2
- package/dist/{chunk-6X7VOCDY.js → chunk-JTR3VSV3.js} +3 -3
- package/dist/{chunk-O2QJDRWP.js → chunk-JU6MAMRJ.js} +4 -4
- package/dist/chunk-JURMQWVJ.js +15 -0
- package/dist/{chunk-STC6CWUZ.js → chunk-K3XN4LZ4.js} +5 -5
- package/dist/{chunk-ATB3Q7YO.js → chunk-KIVFXGBM.js} +27 -2
- package/dist/{chunk-WJWNZXRM.js → chunk-KOAHT3N2.js} +2 -2
- package/dist/chunk-KP5BPXR3.js +73 -0
- package/dist/{chunk-K53E2PTW.js → chunk-KRJQG47M.js} +3 -3
- package/dist/{chunk-IILXVWJY.js → chunk-KW6OJ7IY.js} +19 -21
- package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
- package/dist/{chunk-2U2U5POA.js → chunk-L4RUTLRL.js} +5 -5
- package/dist/{chunk-QYSAZMSH.js → chunk-LGTVWPRN.js} +2 -2
- package/dist/{chunk-KGP3UQGJ.js → chunk-LSQW6KZO.js} +5 -5
- package/dist/{chunk-P4JS3MH5.js → chunk-LWJYOHT3.js} +8 -8
- package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
- package/dist/{chunk-5D2FNBMG.js → chunk-MJ4QEJVT.js} +2 -2
- package/dist/{chunk-RM3XJX7P.js → chunk-MO65K5CH.js} +5 -5
- package/dist/{chunk-H5DPSUBB.js → chunk-MTOZEQHL.js} +3 -3
- package/dist/{chunk-6R5MBXBJ.js → chunk-NBPA5QM6.js} +2 -2
- package/dist/{chunk-H77XBUBM.js → chunk-NMBEW4PP.js} +3 -3
- package/dist/{chunk-QWUSS2QP.js → chunk-NPLLK3HO.js} +67 -87
- package/dist/{chunk-K5UJD6MM.js → chunk-NSYGPIVW.js} +5 -5
- package/dist/{context-EZZPT2ZV.js → chunk-NXTV5OI5.js} +30 -84
- package/dist/{chunk-F7Y6QTPL.js → chunk-NYDG4QP4.js} +4 -4
- package/dist/{chunk-PFZJMXIY.js → chunk-OA2GDACN.js} +2 -2
- package/dist/{chunk-Q32C6AWI.js → chunk-PJI57EC6.js} +4 -4
- package/dist/{chunk-EFXMQYI6.js → chunk-PJJBUGMR.js} +52 -52
- package/dist/{chunk-ICYIUNO4.js → chunk-PNJE7JPS.js} +18 -3
- package/dist/chunk-PP23PZEV.js +1347 -0
- package/dist/chunk-PPIFDSBK.js +409 -0
- package/dist/{chunk-RFULVPBX.js → chunk-PTFISXQO.js} +6 -5
- package/dist/{chunk-JV25I7ID.js → chunk-QB33Z5S7.js} +5 -5
- package/dist/{chunk-D55WO5J7.js → chunk-QGNII5VC.js} +8 -8
- package/dist/{chunk-RKFNU5UA.js → chunk-QI72X67S.js} +104 -27
- package/dist/chunk-QKHZZFKH.js +98 -0
- package/dist/{chunk-5UG6EZI3.js → chunk-RDKX2PME.js} +4 -4
- package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
- package/dist/{chunk-BE4I3UJ2.js → chunk-RQROVOV3.js} +15 -13
- package/dist/{chunk-TEHVMHOK.js → chunk-S34A7BSP.js} +3 -3
- package/dist/{chunk-4P6M2TTE.js → chunk-SJETVJHX.js} +2 -2
- package/dist/{chunk-OPC4DQD6.js → chunk-SJMNU4ZS.js} +2 -2
- package/dist/{chunk-2JSCCEKO.js → chunk-SLLG2G44.js} +2 -2
- package/dist/{chunk-EPYATQMG.js → chunk-SQAZN2V3.js} +42 -16
- package/dist/{chunk-E2NSPYLC.js → chunk-SQBT46OF.js} +5 -5
- package/dist/{chunk-WTZVSMQZ.js → chunk-TCUOGIL2.js} +5 -5
- package/dist/{chunk-RRZFRIJP.js → chunk-TIWPKCVO.js} +5 -5
- package/dist/{chunk-QLAGXTTV.js → chunk-UIU7MGZ3.js} +5 -1
- package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
- package/dist/{chunk-PJ5H5B7A.js → chunk-VPWGADBG.js} +18 -18
- package/dist/{chunk-GEYX2NZ5.js → chunk-VWFCAK34.js} +6 -6
- package/dist/{chunk-44U2OUSM.js → chunk-W72LLZAV.js} +2 -2
- package/dist/{chunk-ORRNGQDV.js → chunk-WGRDABW7.js} +4 -4
- package/dist/{chunk-RNLAPBJL.js → chunk-XFLSL7BT.js} +2 -2
- package/dist/{chunk-2SXGG2IV.js → chunk-XJZEDCNT.js} +6 -6
- package/dist/{chunk-UB33F3YW.js → chunk-XLLEL3K7.js} +5 -5
- package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
- package/dist/{chunk-WS4FOGLY.js → chunk-XNZWWDC3.js} +2 -2
- package/dist/{chunk-P7GTE4FX.js → chunk-XRECG65F.js} +2 -2
- package/dist/chunk-XTQ7MEJG.js +457 -0
- package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
- package/dist/{chunk-OEMFEL26.js → chunk-Y3M2T5RO.js} +3 -3
- package/dist/{chunk-HP7KJ5O2.js → chunk-YPQOPFP7.js} +6 -6
- package/dist/{chunk-MEHBW2SP.js → chunk-YQYINEJI.js} +6 -6
- package/dist/{chunk-RXI7K4J5.js → chunk-ZF6CV4WZ.js} +1338 -217
- package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
- package/dist/{chunk-526ABLHD.js → chunk-ZKQ63XZ5.js} +12 -35
- package/dist/{chunk-PAQVETLA.js → chunk-ZKVMDNAN.js} +5 -5
- package/dist/cli/index.js +47 -37
- package/dist/{clio-BPBAPZGA.js → clio-JUDCLNHC.js} +7 -7
- package/dist/clio-context-tools-FT672MNZ.js +136 -0
- package/dist/{code-nav-KBQ3RIFK.js → code-nav-7OVCTP2Z.js} +28 -26
- package/dist/{components-6DKAXWFN.js → components-OZXZMDWU.js} +5 -5
- package/dist/{config-FWL5JK2H.js → config-P3ZQVF63.js} +80 -75
- package/dist/{config-graph-ACDB26L2.js → config-graph-GKAOBAS5.js} +74 -70
- package/dist/{configure-ZIZ4YV62.js → configure-25LRYZJG.js} +45 -44
- package/dist/context-72VQV7JX.js +73 -0
- package/dist/{context-VIL5MFRH.js → context-COWRWXP3.js} +74 -70
- package/dist/{context-Z3GOBHDK.js → context-WB3D474G.js} +12 -12
- package/dist/{context-clear-ZPB3L7MN.js → context-clear-Y4LYMWC6.js} +70 -66
- package/dist/{context-working-set-2GLBVF7L.js → context-working-set-TMZYVC7A.js} +15 -14
- package/dist/data-tool-KMBWKKWR.js +2987 -0
- package/dist/{detail-VSBWYSGZ.js → detail-4GLROGY5.js} +71 -67
- package/dist/{dispatch-runner-EEEHGKX4.js → dispatch-runner-TR3LBP5P.js} +92 -88
- package/dist/{docs-VMMWFVHL.js → docs-ZK777W2G.js} +3 -3
- package/dist/{doctor-V5L4IQGP.js → doctor-WC4OV2OB.js} +61 -59
- package/dist/{eval-VJYJ2BV3.js → eval-FUNWJNUJ.js} +45 -45
- package/dist/{evals-J2H5V6DD.js → evals-L73EBHSU.js} +4 -4
- package/dist/{evidence-Y35YSXH6.js → evidence-AVJ2RTHX.js} +80 -76
- package/dist/{evidence-POWAEBEW.js → evidence-P4NZOAK7.js} +70 -66
- package/dist/{evidence-XCCCLS36.js → evidence-Y55WKYHH.js} +79 -75
- package/dist/{evolve-GPG72VB6.js → evolve-MAWKRYWF.js} +75 -71
- package/dist/{extensions-YIZ7W3DA.js → extensions-PYQH3H47.js} +8 -8
- package/dist/{fleet-2MDCQ2VK.js → fleet-M4H2QBWT.js} +84 -80
- package/dist/{fleet-W2AF3TOJ.js → fleet-ULBXXRDR.js} +123 -119
- package/dist/{fleet-commands-WS56G26H.js → fleet-commands-7NNC4JZU.js} +17 -16
- package/dist/{fleet-decisions-MYGZ3JW7.js → fleet-decisions-EHEY7KPU.js} +9 -9
- package/dist/{fleet-graph-ELTBXBAV.js → fleet-graph-LQ2AHZT3.js} +15 -15
- package/dist/{fleet-inspect-45IK73L4.js → fleet-inspect-5IGBIIYZ.js} +76 -72
- package/dist/{fleet-preflight-T5NCZKHE.js → fleet-preflight-UTTNOKMG.js} +7 -2
- package/dist/{fleet-validate-VG4JBLA4.js → fleet-validate-YGILJKA6.js} +20 -20
- package/dist/{fleet-verify-VTSABAYO.js → fleet-verify-AUWTCDKR.js} +70 -66
- package/dist/{fleet-view-XC7WMKSS.js → fleet-view-TGUFCY5A.js} +73 -69
- package/dist/{init-VTJNNTIP.js → init-GFN2Z7NF.js} +94 -90
- package/dist/{interop-IU6BNA7C.js → interop-EF5JUWWK.js} +21 -21
- package/dist/{inventory-QPQUTUUZ.js → inventory-I6VJDDYF.js} +73 -69
- package/dist/{library-Q3NWL5CM.js → library-3J5IO2OJ.js} +13 -13
- package/dist/{library-LF7DLU6S.js → library-IJTOFTDS.js} +16 -15
- package/dist/{library-HUTAS57T.js → library-Z3KZSHPE.js} +27 -27
- package/dist/{library-import-PPW4YUC5.js → library-import-IMKFLDHX.js} +21 -21
- package/dist/{library-inventory-DIRVFRZU.js → library-inventory-CQP5D6GU.js} +13 -13
- package/dist/{library-validation-XHUZ3INE.js → library-validation-33UTX7AI.js} +11 -11
- package/dist/mcp-5FWZKUS6.js +26 -0
- package/dist/{memory-Z2LSKNV6.js → memory-36CWN67Y.js} +75 -71
- package/dist/{models-3FTREYPY.js → models-KQ6PQJJQ.js} +49 -49
- package/dist/{monitor-HF2MQRB3.js → monitor-XX6ZD6KC.js} +83 -79
- package/dist/{orchestrator-UYPA6W4S.js → orchestrator-SK6HDAOP.js} +1337 -772
- package/dist/{panes-736XB73K.js → panes-L27QRXUH.js} +12 -12
- package/dist/{panes-C4P3PIWT.js → panes-LXZIWNOZ.js} +4 -4
- package/dist/{paths-JQ4QYIYB.js → paths-7DJDU4P4.js} +5 -5
- package/dist/{preload-XSLRYH3Y.js → preload-K2TDYI4Y.js} +70 -66
- package/dist/{reset-V7QSPZYE.js → reset-73VU3XNT.js} +10 -10
- package/dist/{resources-OJGDFHYT.js → resources-3BYJYVYL.js} +16 -16
- package/dist/{run-T354SMDW.js → run-AR7PY6GW.js} +132 -128
- package/dist/run-script-H2KUDIII.js +41 -0
- package/dist/{settings-MWZXO6RV.js → settings-3VMBMWID.js} +4 -4
- package/dist/{share-Y5ZKJPND.js → share-HVWH4FPF.js} +21 -21
- package/dist/{skills-4GLZC4LN.js → skills-5TYEY75Q.js} +22 -22
- package/dist/{skills-eval-L5T7GODM.js → skills-eval-CK3MD63Z.js} +96 -87
- package/dist/{skills-inventory-LASKXEZI.js → skills-inventory-KSFYG3I6.js} +16 -16
- package/dist/{slash-commands-OIMRU36D.js → slash-commands-DMVHML7P.js} +47 -44
- package/dist/{steer-KMAM2Y2C.js → steer-XCD6V3EW.js} +4 -4
- package/dist/{support-AWC3XKPX.js → support-JAZL6VBR.js} +7 -7
- package/dist/{system-CD75NYBU.js → system-3TDQRMZZ.js} +26 -26
- package/dist/{targets-VSZX2J2S.js → targets-EZKHAYRN.js} +66 -65
- package/dist/{tasks-AN567LYH.js → tasks-SNEFHWYW.js} +12 -12
- package/dist/{terminal-lease-6KTWNHVY.js → terminal-lease-BNLFA4OF.js} +8 -7
- package/dist/{tools-AGRK3V5J.js → tools-7IM6BDCE.js} +12 -12
- package/dist/{trace-P4MQZD33.js → trace-C3MBGD4S.js} +8 -8
- package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
- package/dist/{uninstall-BRUTEPIC.js → uninstall-WWLOSZ42.js} +10 -10
- package/dist/{upgrade-SBCGHQGJ.js → upgrade-ETK2JNSJ.js} +37 -47
- package/dist/{usage-BIDVTO6V.js → usage-S2HOB7BZ.js} +93 -89
- package/dist/{verifiers-LTGCAMXS.js → verifiers-QDTEVH7R.js} +24 -22
- package/dist/{verify-OZU4LLNP.js → verify-SUKUK6XM.js} +15 -14
- package/dist/web/client/assets/{abnfDiagram-VCTEODGH-C5wfoHm3.js → abnfDiagram-VCTEODGH-BznNOe_I.js} +1 -1
- package/dist/web/client/assets/{arc-oH91sfLl.js → arc-Pry-7G1_.js} +1 -1
- package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
- package/dist/web/client/assets/{blockDiagram-I7D4REHJ-wi0_CYHL.js → blockDiagram-I7D4REHJ-prINbpbM.js} +1 -1
- package/dist/web/client/assets/{c4Diagram-7LVT6UL2-DV7NYc2W.js → c4Diagram-7LVT6UL2-DkVRKtyU.js} +1 -1
- package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
- package/dist/web/client/assets/{chunk-4HAMMTFA-Bhsegh3F.js → chunk-4HAMMTFA-CV0Z1ApC.js} +1 -1
- package/dist/web/client/assets/{chunk-75Z2AOVW-RQCckcQG.js → chunk-75Z2AOVW-D34Nohxq.js} +1 -1
- package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
- package/dist/web/client/assets/{chunk-F27PBJKO-BcNqv2x1.js → chunk-F27PBJKO-CmRojxkG.js} +1 -1
- package/dist/web/client/assets/{chunk-GMAD6QVW-Bq8JWiZT.js → chunk-GMAD6QVW-ClYZmc73.js} +1 -1
- package/dist/web/client/assets/{chunk-GVQU2GXP-DbchrAeJ.js → chunk-GVQU2GXP-B2BiHFt-.js} +1 -1
- package/dist/web/client/assets/{chunk-IMKFNOWR-DrpvjocK.js → chunk-IMKFNOWR-BGApZ8nP.js} +1 -1
- package/dist/web/client/assets/{chunk-L3NEJ4N5-DHLmTnCe.js → chunk-L3NEJ4N5-DIzCgpkY.js} +1 -1
- package/dist/web/client/assets/{chunk-OSK3NFVY-CsRbtN9n.js → chunk-OSK3NFVY-BPT-yePv.js} +1 -1
- package/dist/web/client/assets/{chunk-P2QGCYS3-aqPbxoMh.js → chunk-P2QGCYS3-BC1WTc2t.js} +1 -1
- package/dist/web/client/assets/{chunk-POPQ4Y6H-Dl5vw0h0.js → chunk-POPQ4Y6H-BSjzBmZU.js} +1 -1
- package/dist/web/client/assets/{chunk-PWAF6VOD-D7OBRSdO.js → chunk-PWAF6VOD-BIjLs86Z.js} +1 -1
- package/dist/web/client/assets/{chunk-SHT3W25Y-CdKCIwuB.js → chunk-SHT3W25Y-CduDz2cm.js} +1 -1
- package/dist/web/client/assets/{chunk-SVP7TREG-B94Nu_1-.js → chunk-SVP7TREG-XUn4pPAP.js} +1 -1
- package/dist/web/client/assets/{chunk-TICWLB2K-jjRQI_hk.js → chunk-TICWLB2K-DcBy2DKy.js} +1 -1
- package/dist/web/client/assets/{chunk-XXDRQBXY-azkbKE37.js → chunk-XXDRQBXY-DqAYeljN.js} +1 -1
- package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
- package/dist/web/client/assets/{cynefin-OW5HDTMX--i9RDU5f.js → cynefin-OW5HDTMX-BecPbyM6.js} +1 -1
- package/dist/web/client/assets/{cynefinDiagram-5FMLGOSQ-cRcvyBdp.js → cynefinDiagram-5FMLGOSQ-BzMzFwyT.js} +1 -1
- package/dist/web/client/assets/{dagre-GXQ25YYZ-C9mZmAPe.js → dagre-GXQ25YYZ-CAWJmRMG.js} +1 -1
- package/dist/web/client/assets/{diagram-S7CK7UJ4-Oj_zlLDY.js → diagram-S7CK7UJ4--lp0ALmn.js} +1 -1
- package/dist/web/client/assets/{diagram-UQ7AKVKN-BWKbbfcR.js → diagram-UQ7AKVKN-gKUnsjcj.js} +1 -1
- package/dist/web/client/assets/{diagram-VSXAHHWV-C3N3f7DO.js → diagram-VSXAHHWV-BoN5D1Gh.js} +1 -1
- package/dist/web/client/assets/{diagram-VX7I27RA-CtDKDAWe.js → diagram-VX7I27RA-BMtuswQ6.js} +1 -1
- package/dist/web/client/assets/{diagram-Z3DM3KII-B8bkBRCz.js → diagram-Z3DM3KII-DtU8LXrA.js} +1 -1
- package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/web/client/assets/{ebnfDiagram-PWID7BFC-CskW-Whx.js → ebnfDiagram-PWID7BFC-DDcnv9BH.js} +1 -1
- package/dist/web/client/assets/{erDiagram-RLTQ6QDP-C-83cgCW.js → erDiagram-RLTQ6QDP-DvRb4iDL.js} +1 -1
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
- package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
- package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
- package/dist/web/client/assets/{gitGraph-4MIJSDKK-B40cQtBE.js → gitGraph-4MIJSDKK-DjD_AAMj.js} +1 -1
- package/dist/web/client/assets/{gitGraphDiagram-WWUBYQGX-CH-7P7Di.js → gitGraphDiagram-WWUBYQGX-CDyN9n2u.js} +1 -1
- package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
- package/dist/web/client/assets/{info-A6RAGUB7-eCCE9D_Q.js → info-A6RAGUB7-C_XK8Hq0.js} +1 -1
- package/dist/web/client/assets/{infoDiagram-27XIBGKW-DRnvqMjM.js → infoDiagram-27XIBGKW-DIe4tJ1i.js} +1 -1
- package/dist/web/client/assets/{ishikawaDiagram-5VMMS53U-DBA_55wp.js → ishikawaDiagram-5VMMS53U-CVl5unKI.js} +1 -1
- package/dist/web/client/assets/{journeyDiagram-3NMN7TZE-C-ewpNl7.js → journeyDiagram-3NMN7TZE-CPEB1Vt8.js} +1 -1
- package/dist/web/client/assets/{kanban-definition-UXKFOSKX-B1taGsu0.js → kanban-definition-UXKFOSKX-j-9WXjYQ.js} +1 -1
- package/dist/web/client/assets/{line-lZ0kyxDI.js → line-BIDAcEtX.js} +1 -1
- package/dist/web/client/assets/{linear-DIc8FgZj.js → linear-SzVmGSw4.js} +1 -1
- package/dist/web/client/assets/{mermaid-parser.core-SXolxpXw.js → mermaid-parser.core-Ux4vssh0.js} +3 -3
- package/dist/web/client/assets/{mermaid.core-DXgQtkNg.js → mermaid.core-CDuwVKeh.js} +4 -4
- package/dist/web/client/assets/{mindmap-definition-YA3MSWOX-DXJas9K7.js → mindmap-definition-YA3MSWOX-5MlQEeQ6.js} +1 -1
- package/dist/web/client/assets/{packet-AYTQ26CC-OqVl_07o.js → packet-AYTQ26CC-DRO66c9Q.js} +1 -1
- package/dist/web/client/assets/{pegDiagram-XKGWAZYB-CPE_zdfN.js → pegDiagram-XKGWAZYB-BakZnSjM.js} +1 -1
- package/dist/web/client/assets/{pie-WAS4IAKB-DAxnMBLe.js → pie-WAS4IAKB-BEzcmhz8.js} +1 -1
- package/dist/web/client/assets/{pieDiagram-E7YTZNPT-Uwjpufxv.js → pieDiagram-E7YTZNPT-DpmqgoPt.js} +1 -1
- package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
- package/dist/web/client/assets/{quadrantDiagram-AXDQQJYC-Bjs4yjgs.js → quadrantDiagram-AXDQQJYC-DuMPwwV2.js} +1 -1
- package/dist/web/client/assets/{radar-RG4KPBEZ-CuCKjHM3.js → radar-RG4KPBEZ-Djm3oXl5.js} +1 -1
- package/dist/web/client/assets/{railroad-74A4TZTK-CnQK-Cc1.js → railroad-74A4TZTK-Cpvkwsao.js} +1 -1
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
- package/dist/web/client/assets/{railroadDiagram-O6MQD6OU-BDDIPNLL.js → railroadDiagram-O6MQD6OU-CgMS4B6R.js} +1 -1
- package/dist/web/client/assets/{requirementDiagram-BXWQKSXE-B5Ydyxc1.js → requirementDiagram-BXWQKSXE-CX5eoNdN.js} +1 -1
- package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/web/client/assets/{sankeyDiagram-P5KCCOFB-Bw2Qym75.js → sankeyDiagram-P5KCCOFB-CODBX2N3.js} +1 -1
- package/dist/web/client/assets/{sequenceDiagram-WJ2MYXX4-BZf36nO0.js → sequenceDiagram-WJ2MYXX4-eUhhF8OR.js} +1 -1
- package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
- package/dist/web/client/assets/{stateDiagram-D77RDMKH-DnH6JRkp.js → stateDiagram-D77RDMKH-vR6l0NC2.js} +1 -1
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
- package/dist/web/client/assets/{swimlanes-42K2YHIH-D9PZmtZg.js → swimlanes-42K2YHIH-v9Tw_zX7.js} +1 -1
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
- package/dist/web/client/assets/{timeline-definition-24CTP7MA-CrkZZBo7.js → timeline-definition-24CTP7MA-DxianbhU.js} +1 -1
- package/dist/web/client/assets/{treeView-Q6P3EWNA-C9zDShoC.js → treeView-Q6P3EWNA-DLxnZb9R.js} +1 -1
- package/dist/web/client/assets/{treemap-WGGIJYW6-B-plj9yK.js → treemap-WGGIJYW6-I7UnZ6xJ.js} +1 -1
- package/dist/web/client/assets/{vennDiagram-4TSXK5OY-VeOdaphN.js → vennDiagram-4TSXK5OY-Ar7M8Mrj.js} +1 -1
- package/dist/web/client/assets/{wardley-WFR3VGLG-Wl1P_m6L.js → wardley-WFR3VGLG-B8ZSHeDu.js} +1 -1
- package/dist/web/client/assets/{wardleyDiagram-VM6X3IG4-B85-R9t2.js → wardleyDiagram-VM6X3IG4-Qks2FmIn.js} +1 -1
- package/dist/web/client/assets/{xychartDiagram-S5SC5T6Z-BrD8OW8m.js → xychartDiagram-S5SC5T6Z-BBBjRtiE.js} +1 -1
- package/dist/web/client/index.html +3 -1
- package/dist/web/reads-worker.js +17 -17
- package/dist/web/server.js +25 -25
- package/dist/{web-EU6ATJWA.js → web-EMGUGGEI.js} +3 -3
- package/dist/{web-fetch-U22Q7HV4.js → web-fetch-6BRRVQON.js} +22 -5
- package/dist/{wiki-generate-LZRLFG6I.js → wiki-generate-XHSJTDOP.js} +104 -100
- package/dist/{with-panes-X5CZOGML.js → with-panes-Z6BTEHMZ.js} +11 -11
- package/dist/worker/entry.js +101 -87
- package/docs/README.md +1 -1
- package/docs/architecture/artifact-placement.md +12 -1
- package/docs/architecture/library.md +1 -1
- package/docs/architecture/prompt-envelope-and-tools.md +37 -27
- package/docs/architecture/safety-model.md +19 -6
- package/docs/architecture/session-lifecycle.md +10 -4
- package/docs/architecture/tui-design.md +37 -14
- package/docs/guide/commands-and-modes.md +39 -19
- package/docs/guide/configuration-and-targets.md +7 -5
- package/docs/guide/configuration-reference.md +116 -13
- package/docs/guide/environment-variables.md +2 -5
- package/docs/guide/fleet-dispatch.md +3 -2
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/installation-and-lifecycle.md +2 -2
- package/docs/guide/resource-library.md +1 -1
- package/docs/guide/tool-usage.md +166 -64
- package/docs/guide/troubleshooting.md +1 -1
- package/docs/process/documentation-guide.md +1 -0
- package/docs/process/fleet-demo-runbook.md +6 -6
- package/docs/process/scientific-validation.md +22 -2
- package/docs/process/tool-audit-v0.4.9.md +357 -0
- package/package.json +1 -1
- package/src/cli/argv.ts +31 -0
- package/src/cli/clio.ts +17 -13
- package/src/cli/config.ts +4 -0
- package/src/cli/doctor-panes.ts +1 -1
- package/src/cli/doctor.ts +3 -1
- package/src/cli/index.ts +14 -1
- package/src/cli/mcp.ts +106 -0
- package/src/cli/skills-eval.ts +8 -2
- package/src/cli/upgrade.ts +34 -38
- package/src/cli/verifiers.ts +1 -1
- package/src/core/bash-exec.ts +27 -4
- package/src/core/config.ts +2 -1
- package/src/core/defaults.ts +10 -1
- package/src/core/event-bus.ts +1 -1
- package/src/core/run-records.ts +438 -0
- package/src/core/safe-exec.ts +506 -56
- package/src/core/skill-activation.ts +5 -3
- package/src/core/termination.ts +3 -3
- package/src/core/tool-names.ts +33 -12
- package/src/domains/context/clio-md.ts +1 -1
- package/src/domains/context/worker/pressure.ts +6 -2
- package/src/domains/context/working-set/path-index.ts +7 -2
- package/src/domains/dispatch/code-step.ts +7 -2
- package/src/domains/dispatch/contract.ts +7 -0
- package/src/domains/dispatch/execution-role.ts +3 -3
- package/src/domains/dispatch/execution-scheduler.ts +204 -79
- package/src/domains/dispatch/extension.ts +131 -14
- package/src/domains/dispatch/fleet-preflight.ts +18 -3
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/gate-decisions.ts +3 -3
- package/src/domains/dispatch/heartbeat.ts +1 -1
- package/src/domains/dispatch/host-verification.ts +16 -14
- package/src/domains/dispatch/receipt-findings.ts +3 -4
- package/src/domains/dispatch/reservation-store.ts +7 -9
- package/src/domains/dispatch/route-facts.ts +1 -1
- package/src/domains/dispatch/state.ts +3 -3
- package/src/domains/dispatch/types.ts +1 -1
- package/src/domains/evidence/build.ts +35 -7
- package/src/domains/gateway/mcp/client.ts +923 -0
- package/src/domains/gateway/mcp/config.ts +456 -0
- package/src/domains/gateway/mcp/index.ts +88 -0
- package/src/domains/gateway/mcp/protocol.ts +273 -0
- package/src/domains/gateway/mcp/trust.ts +263 -0
- package/src/domains/lifecycle/doctor.ts +17 -3
- package/src/domains/mux/contract.ts +5 -9
- package/src/domains/mux/detect.ts +1 -1
- package/src/domains/mux/extension.ts +1 -1
- package/src/domains/mux/protocol.ts +5 -7
- package/src/domains/mux/socket-client.ts +3 -3
- package/src/domains/observability/accountability.ts +2 -2
- package/src/domains/observability/contract.ts +7 -3
- package/src/domains/observability/evidence-index.ts +2 -2
- package/src/domains/observability/projection.ts +10 -0
- package/src/domains/prompts/compiler.ts +41 -23
- package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
- package/src/domains/prompts/fragments/operating/skills.md +12 -10
- package/src/domains/providers/index.ts +5 -1
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
- package/src/domains/providers/probe/http.ts +44 -59
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
- package/src/domains/safety/action-classifier.ts +17 -1
- package/src/domains/safety/call-target.ts +14 -0
- package/src/domains/safety/contract.ts +1 -1
- package/src/domains/safety/finish-contract.ts +9 -3
- package/src/domains/safety/loop-detector.ts +1 -1
- package/src/domains/safety/policy-engine.ts +7 -0
- package/src/domains/safety/protected-artifacts.ts +3 -4
- package/src/domains/safety/rejection-feedback.ts +1 -1
- package/src/domains/safety/scope.ts +2 -3
- package/src/domains/safety/validation-contract.ts +3 -2
- package/src/domains/scheduling/budget.ts +5 -3
- package/src/domains/scheduling/contract.ts +2 -1
- package/src/domains/scheduling/extension.ts +3 -3
- package/src/domains/session/compaction/branch-summary.ts +1 -1
- package/src/domains/session/compaction/compact.ts +25 -2
- package/src/domains/session/compaction/cut-point.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +5 -10
- package/src/domains/session/contract.ts +1 -1
- package/src/domains/session/cwd-fallback.ts +2 -2
- package/src/domains/session/handoff.ts +5 -1
- package/src/domains/session/history.ts +6 -0
- package/src/domains/session/manager.ts +14 -7
- package/src/domains/session/retry.ts +2 -1
- package/src/domains/session/session-artifacts.ts +12 -7
- package/src/domains/session/task-board.ts +2 -3
- package/src/engine/apis/openai-completions.ts +8 -0
- package/src/engine/loop-guard.ts +7 -0
- package/src/engine/provider-error-body.ts +65 -0
- package/src/engine/session.ts +118 -29
- package/src/engine/worker-runtime.ts +3 -0
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +18 -2
- package/src/interactive/chat-loop-policy.ts +1 -0
- package/src/interactive/chat-loop.ts +8 -4
- package/src/interactive/chat-panel.ts +23 -9
- package/src/interactive/chat-renderer.ts +33 -11
- package/src/interactive/clio-editor.ts +13 -5
- package/src/interactive/dispatch-board.ts +70 -30
- package/src/interactive/editor-submit.ts +30 -25
- package/src/interactive/footer/widgets.ts +12 -9
- package/src/interactive/interactive-presentation.ts +2 -3
- package/src/interactive/mux-bridge.ts +3 -7
- package/src/interactive/overlay-general-openers.ts +14 -7
- package/src/interactive/overlays/cwd-fallback.ts +1 -1
- package/src/interactive/overlays/library-model.ts +114 -35
- package/src/interactive/overlays/library.ts +52 -5
- package/src/interactive/overlays/list-overlay.ts +4 -1
- package/src/interactive/overlays/session-selector.ts +28 -23
- package/src/interactive/overlays/settings.ts +20 -1
- package/src/interactive/overlays/tree-selector.ts +47 -10
- package/src/interactive/panes-runtime.ts +1 -1
- package/src/interactive/renderers/compaction-summary.ts +1 -1
- package/src/interactive/renderers/provider-error.ts +118 -0
- package/src/interactive/renderers/retry-status.ts +59 -23
- package/src/interactive/renderers/tool-execution.ts +67 -7
- package/src/interactive/renderers/worker-answer.ts +198 -0
- package/src/interactive/renderers/worker-entry.ts +57 -163
- package/src/interactive/slash-commands.ts +26 -1
- package/src/interactive/slash-spec.ts +2 -2
- package/src/interactive/theme/labels.ts +66 -30
- package/src/interactive/turn-persistence.ts +6 -1
- package/src/interactive/turn-recovery.ts +2 -1
- package/src/interactive/turn-runtime.ts +22 -5
- package/src/interactive/view/artifacts.ts +3 -2
- package/src/interactive/view/view-overlay.ts +96 -20
- package/src/tools/agent-tools.ts +21 -7
- package/src/tools/artifact.ts +16 -8
- package/src/tools/bash.ts +90 -11
- package/src/tools/bootstrap.ts +42 -4
- package/src/tools/builtin-tool-catalog.ts +72 -7
- package/src/tools/context/index.ts +27 -31
- package/src/tools/context/library.ts +3 -1
- package/src/tools/context/surface.ts +12 -26
- package/src/tools/core-bootstrap.ts +72 -1
- package/src/tools/data/csv.ts +1189 -0
- package/src/tools/data/index.ts +308 -0
- package/src/tools/data/json.ts +1799 -0
- package/src/tools/data/jsonl.ts +561 -0
- package/src/tools/data/shared.ts +452 -0
- package/src/tools/edit-diff.ts +0 -7
- package/src/tools/edit.ts +115 -18
- package/src/tools/file-mutation-queue.ts +114 -4
- package/src/tools/find.ts +108 -29
- package/src/tools/gateway/caps.ts +11 -0
- package/src/tools/gateway/clio-context-surface.ts +41 -0
- package/src/tools/gateway/clio-context-tools.ts +77 -0
- package/src/tools/gateway/data-surface.ts +138 -0
- package/src/tools/gateway/data-tool.ts +201 -0
- package/src/tools/gateway/index.ts +342 -0
- package/src/tools/gateway/mcp-capabilities.ts +469 -0
- package/src/tools/grep.ts +88 -33
- package/src/tools/harness-extensions.ts +3 -0
- package/src/tools/ignore-policy.ts +7 -5
- package/src/tools/ls.ts +111 -20
- package/src/tools/policy.ts +35 -13
- package/src/tools/presentation.ts +6 -0
- package/src/tools/read.ts +634 -156
- package/src/tools/registry.ts +94 -6
- package/src/tools/run-script.ts +997 -0
- package/src/tools/spawn-hygiene.ts +157 -5
- package/src/tools/surface.ts +163 -0
- package/src/tools/verify/authoring.ts +8 -3
- package/src/tools/verify/catalog.ts +14 -1
- package/src/tools/verify/numeric.ts +367 -59
- package/src/tools/verify/perf.ts +171 -9
- package/src/tools/verify/scripts.ts +178 -26
- package/src/tools/web-fetch-surface.ts +22 -0
- package/src/tools/web-fetch.ts +26 -1
- package/src/tools/write.ts +45 -19
- package/dist/chunk-B6UM3OZC.js +0 -15
- package/dist/chunk-GJ24ODAX.js +0 -196
- package/dist/chunk-LZCCBLRC.js +0 -57
- package/dist/web/client/assets/architecture-7GRP2DOG-EGozsYEO.js +0 -1
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-z9FokbJl.js +0 -36
- package/dist/web/client/assets/channel-CiUWbHN9.js +0 -1
- package/dist/web/client/assets/chunk-DU6HZSFF-C5USiOAy.js +0 -125
- package/dist/web/client/assets/classDiagram-ZZMXUADV-CMODalmo.js +0 -1
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-CMODalmo.js +0 -1
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-RbQL23qS.js +0 -1
- package/dist/web/client/assets/dist-D0_q-A2b.js +0 -1
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-DjVq8wKU.js +0 -1
- package/dist/web/client/assets/flowDiagram-HODETNUW-BUiCBGXt.js +0 -1
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-B2lb8lvF.js +0 -292
- package/dist/web/client/assets/index-FSIC94pi.js +0 -83
- package/dist/web/client/assets/prism-core-BngLtbUd.js +0 -1
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-BcW01NZG.js +0 -1
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-B7YCEDDd.js +0 -1
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-DjNZbSTZ.js +0 -1
- package/dist/web/client/assets/src-yeptRXpt.js +0 -1
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-C7QtHeK4.js +0 -1
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-CBZlPFky.js +0 -8
|
@@ -76,6 +76,8 @@ export interface ObservabilityRunSummary {
|
|
|
76
76
|
contextWindow?: number;
|
|
77
77
|
lastContextTokens?: number;
|
|
78
78
|
progress?: WorkerProgressSnapshot;
|
|
79
|
+
/** Existing validator identity/conformance, admitted with the verified receipt answer. */
|
|
80
|
+
resultContract?: { kind: string; conformance: string };
|
|
79
81
|
receiptId?: string;
|
|
80
82
|
retry?: { attempt: number; dueAtMs: number; reason: string };
|
|
81
83
|
steerAcknowledgement?: { receivedAtMs: number; chars: number };
|
|
@@ -132,7 +134,9 @@ export interface ObservabilitySnapshot {
|
|
|
132
134
|
/** Runtime readers supplied after dispatch is composed, avoiding a domain dependency cycle. */
|
|
133
135
|
export interface ObservabilityRunReaders {
|
|
134
136
|
dispatchSnapshot?: () => DispatchSnapshot;
|
|
135
|
-
readReceipt?: (
|
|
137
|
+
readReceipt?: (
|
|
138
|
+
runId: string,
|
|
139
|
+
) => { text?: string; trust?: CanonicalTrustStatus; contractKind?: string; contract?: string } | null;
|
|
136
140
|
}
|
|
137
141
|
|
|
138
142
|
/** Run projection controls shared by the contract and the in-memory projection. */
|
|
@@ -160,8 +164,8 @@ export interface ObservabilityContract extends ObservabilityRunProjection {
|
|
|
160
164
|
/**
|
|
161
165
|
* Rolling first-pass-success rate, unverified successes, ungrounded claims,
|
|
162
166
|
* and failure-cause histogram, aggregated
|
|
163
|
-
* from the sidecar evidence index on call.
|
|
164
|
-
*
|
|
167
|
+
* from the sidecar evidence index on call. It folds rows written at dispatch
|
|
168
|
+
* completion and recomputes no evidence.
|
|
165
169
|
*/
|
|
166
170
|
accountability(): AccountabilitySummary;
|
|
167
171
|
/** Latest completed assistant stream throughput for compact footer display. */
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Sidecar evidence index. A compact, append/merge-by-runId ledger written
|
|
3
3
|
* under `<stateDir>/evidence-index.json` whenever a dispatch run completes and
|
|
4
|
-
* the forensic evidence bundle is built (see extension.ts).
|
|
5
|
-
* to surface a rolling first-pass-success rate and a failure-cause histogram in
|
|
4
|
+
* the forensic evidence bundle is built (see extension.ts). The accountability
|
|
5
|
+
* read model uses this to surface a rolling first-pass-success rate and a failure-cause histogram in
|
|
6
6
|
* observability without re-running the heavy `buildEvidence` aggregator.
|
|
7
7
|
*
|
|
8
8
|
* The file is a JSON array kept as a bounded ring (newest rows win, capped at
|
|
@@ -401,6 +401,7 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
|
|
|
401
401
|
function applyIdentity(summary: RunEntry, id: Partial<DispatchRunIdentity>): void {
|
|
402
402
|
// A lifecycle update must earn its trust again from the current receipt.
|
|
403
403
|
delete summary.trust;
|
|
404
|
+
delete summary.resultContract;
|
|
404
405
|
if (typeof id.agentId === "string" && id.agentId.length > 0) summary.agentId = id.agentId;
|
|
405
406
|
if (typeof id.targetId === "string" && id.targetId.length > 0) summary.targetId = id.targetId;
|
|
406
407
|
if (typeof id.wireModelId === "string" && id.wireModelId.length > 0) summary.modelId = id.wireModelId;
|
|
@@ -459,11 +460,20 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
|
|
|
459
460
|
}
|
|
460
461
|
|
|
461
462
|
function settleFromReceipt(summary: RunEntry): void {
|
|
463
|
+
delete summary.resultContract;
|
|
462
464
|
try {
|
|
463
465
|
const facts = runReaders.readReceipt?.(summary.runId);
|
|
464
466
|
// A failed or retired seal cannot supply the board's terminal answer.
|
|
465
467
|
const text = facts?.trust?.artifactIntegrity.state === "verified" ? facts.text : undefined;
|
|
466
468
|
summary.progressFold.settle(typeof text === "string" && text.trim().length > 0 ? text : undefined);
|
|
469
|
+
if (
|
|
470
|
+
typeof text === "string" &&
|
|
471
|
+
text.trim().length > 0 &&
|
|
472
|
+
typeof facts?.contractKind === "string" &&
|
|
473
|
+
typeof facts.contract === "string"
|
|
474
|
+
) {
|
|
475
|
+
summary.resultContract = { kind: facts.contractKind, conformance: facts.contract };
|
|
476
|
+
}
|
|
467
477
|
if (facts?.trust !== undefined) summary.trust = summarizeTrustStatus(facts.trust);
|
|
468
478
|
} catch {
|
|
469
479
|
summary.progressFold.settle();
|
|
@@ -4,7 +4,8 @@ import { normalizePromptHint } from "../../core/prompt-hint.js";
|
|
|
4
4
|
import type { ToolName } from "../../core/tool-names.js";
|
|
5
5
|
import { TOOL_RESULT_TRUST_CONTRACT } from "../../core/untrusted-content.js";
|
|
6
6
|
import { resolveClioDirs } from "../../core/xdg.js";
|
|
7
|
-
import
|
|
7
|
+
import { directSurfaceNames } from "../../tools/surface.js";
|
|
8
|
+
import { type AutonomyLevel, isAutonomyLevel, modelMayActivateSkills } from "../safety/autonomy.js";
|
|
8
9
|
import { ceilChars } from "../session/context-accounting.js";
|
|
9
10
|
import type { FragmentTable, LoadedFragment } from "./fragment-loader.js";
|
|
10
11
|
import { sha256 } from "./hash.js";
|
|
@@ -235,10 +236,9 @@ function sessionCanDispatch(inputs: SessionPromptInputs): boolean {
|
|
|
235
236
|
}
|
|
236
237
|
|
|
237
238
|
/**
|
|
238
|
-
* Whether `context` is on the session's surface. The Skills passage
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
* `context` is there to be called.
|
|
239
|
+
* Whether `context` is on the session's surface. The Skills passage and the
|
|
240
|
+
* Tool Contract's skills clause follow the same rule as dispatch: text that
|
|
241
|
+
* teaches a call to `context` renders only when `context` is there to be called.
|
|
242
242
|
*/
|
|
243
243
|
function sessionHasContext(inputs: SessionPromptInputs): boolean {
|
|
244
244
|
if (inputs.providerSupportsTools === false) return false;
|
|
@@ -290,15 +290,20 @@ function renderToolContractBlock(inputs: SessionPromptInputs): string {
|
|
|
290
290
|
"This target cannot call tools; answer from the visible user request and compact context only.",
|
|
291
291
|
].join("\n");
|
|
292
292
|
}
|
|
293
|
-
const
|
|
293
|
+
const capabilityNames = [
|
|
294
294
|
...new Set((inputs.toolNames ?? []).map((name) => name.trim()).filter((name) => name.length > 0)),
|
|
295
295
|
].sort();
|
|
296
|
+
// A worker's admitted list names capabilities behind the gateway (git,
|
|
297
|
+
// web_fetch, an extension command); the attached schemas are their direct
|
|
298
|
+
// projection, with `gateway` standing in for every capability it reaches.
|
|
299
|
+
const names = directSurfaceNames(capabilityNames).sort();
|
|
296
300
|
const canDispatch = sessionCanDispatch(inputs);
|
|
297
301
|
const canListSkills = sessionHasContext(inputs);
|
|
298
302
|
// Asked twice in one session which tools it had, a live model gave two
|
|
299
303
|
// different answers and invented `web_find`. The authoritative list is one
|
|
300
304
|
// line above; pointing at it beats letting the model recall the schemas.
|
|
301
305
|
const admitted = new Set(names);
|
|
306
|
+
const hasGateway = admitted.has("gateway");
|
|
302
307
|
const inventoryGuidance = [
|
|
303
308
|
"When asked what tools you have, copy the Direct tools line verbatim and call nothing",
|
|
304
309
|
...(canDispatch
|
|
@@ -306,15 +311,23 @@ function renderToolContractBlock(inputs: SessionPromptInputs): string {
|
|
|
306
311
|
"dispatch(list:true) answers a question about agents, the fleet, or which target and model run this session and its workers",
|
|
307
312
|
]
|
|
308
313
|
: []),
|
|
309
|
-
...(canListSkills ? ['context(scope="skills")
|
|
314
|
+
...(canListSkills ? ['context(scope="skills") lists skills for discovery or skill questions'] : []),
|
|
315
|
+
...(hasGateway ? ['gateway(op="find") answers a question about secondary capabilities'] : []),
|
|
310
316
|
].join("; ");
|
|
311
317
|
const capabilityKinds = [
|
|
312
318
|
"direct tools are attached schemas",
|
|
319
|
+
...(hasGateway ? ["secondary capabilities are reached through gateway find, describe, and call"] : []),
|
|
313
320
|
...(canDispatch ? ["fleet agents are workers behind dispatch"] : []),
|
|
314
|
-
...(canListSkills ? ["skills are
|
|
321
|
+
...(canListSkills ? ["skills are workflows reached through context"] : []),
|
|
315
322
|
];
|
|
316
323
|
const orientationTools = ["context", "code_nav", "grep", "read"].filter((name) => admitted.has(name));
|
|
317
|
-
|
|
324
|
+
// git sits behind the gateway, so it validates through gateway(call git)
|
|
325
|
+
// whenever the gateway is attached; a registry that placed it direct still
|
|
326
|
+
// names it plainly.
|
|
327
|
+
const validationTools = [
|
|
328
|
+
...(admitted.has("verify") ? ["verify"] : []),
|
|
329
|
+
...(admitted.has("git") ? ["git diff"] : hasGateway ? ['gateway(op="call", capability="git") diff'] : []),
|
|
330
|
+
];
|
|
318
331
|
const lines = [
|
|
319
332
|
"# Tool Contract",
|
|
320
333
|
TOOL_RESULT_TRUST_CONTRACT,
|
|
@@ -333,17 +346,15 @@ function renderToolContractBlock(inputs: SessionPromptInputs): string {
|
|
|
333
346
|
`For narrow file or symbol orientation, prefer ${orientationTools.join(", ")} instead of assuming source-tree details were preloaded.`,
|
|
334
347
|
]
|
|
335
348
|
: []),
|
|
336
|
-
...(validationTools.length > 0
|
|
337
|
-
|
|
338
|
-
`Validate with ${validationTools.map((name) => (name === "git" ? "git diff" : name)).join(" or ")} before final claims.`,
|
|
339
|
-
]
|
|
340
|
-
: []),
|
|
341
|
-
`When a tool call fails or is rejected, do not retry the same shape blindly: re-read the schema and adjust the arguments${canListSkills ? ', or query context(scope="docs") for that tool\'s usage' : ""}.`,
|
|
349
|
+
...(validationTools.length > 0 ? [`Validate with ${validationTools.join(" or ")} before final claims.`] : []),
|
|
350
|
+
`When a tool call fails or is rejected, do not retry the same shape blindly: re-read the schema and adjust the arguments${hasGateway ? ', or read that tool\'s usage with gateway(op="call", capability="clio_docs", args={query})' : ""}.`,
|
|
342
351
|
];
|
|
343
352
|
// One hint per tool, sorted by tool name: deterministic bytes regardless
|
|
344
353
|
// of surface or registration order, and removing a tool from the surface
|
|
345
|
-
// removes its hint with no compiler edit.
|
|
346
|
-
|
|
354
|
+
// removes its hint with no compiler edit. A capability reached through the
|
|
355
|
+
// gateway keeps its hint: the guidance is about the capability, not the
|
|
356
|
+
// schema that carries it.
|
|
357
|
+
const hints = canonicalToolPromptHints(inputs.toolPromptHints ?? [], new Set([...capabilityNames, ...names]));
|
|
347
358
|
for (const entry of hints) {
|
|
348
359
|
lines.push(entry.hint);
|
|
349
360
|
}
|
|
@@ -411,7 +422,7 @@ function renderWorkerToolContractBlock(inputs: WorkerPromptInputs): string {
|
|
|
411
422
|
TOOL_RESULT_TRUST_CONTRACT,
|
|
412
423
|
"The attached schemas are this worker's complete canonical tool surface; follow each schema exactly.",
|
|
413
424
|
`Admitted canonical tools: ${names.map((name) => `\`${name}\``).join(", ")}.`,
|
|
414
|
-
"This worker surface is distinct from the parent session's tools, fleet agents, and
|
|
425
|
+
"This worker surface is distinct from the parent session's tools, fleet agents, and skills.",
|
|
415
426
|
"Tool authority is limited to this list. Persona and bound-skill instructions never add tools.",
|
|
416
427
|
"Call tools only for concrete inspection or changes the assigned task requires. If the task requests an exact or tool-free response, answer without calling tools.",
|
|
417
428
|
];
|
|
@@ -578,10 +589,13 @@ export function compile(table: FragmentTable, inputs: CompileInputs): CompiledSe
|
|
|
578
589
|
|
|
579
590
|
let identityBody = identity.body;
|
|
580
591
|
const selfAwareness = identity.id === "identity.clio" ? table.byId.get("identity.self-awareness") : undefined;
|
|
581
|
-
// The routing directive teaches a call
|
|
582
|
-
//
|
|
583
|
-
// the code-outranks-docs rule name no tool and stay unconditional.
|
|
584
|
-
const docsRouting =
|
|
592
|
+
// The routing directive teaches a gateway call, so it renders only when
|
|
593
|
+
// gateway is on the surface and the provider supports tool calls. The paths
|
|
594
|
+
// and the code-outranks-docs rule name no tool and stay unconditional.
|
|
595
|
+
const docsRouting =
|
|
596
|
+
selfAwareness && session.providerSupportsTools !== false && toolSurfaceHasTool(session.toolNames, "gateway")
|
|
597
|
+
? table.byId.get("identity.docs-routing")
|
|
598
|
+
: undefined;
|
|
585
599
|
if (selfAwareness) {
|
|
586
600
|
const packageRoot = resolvePackageRoot();
|
|
587
601
|
// The live home, not the XDG default: an isolated CLIO_CODER_HOME or a
|
|
@@ -602,13 +616,17 @@ export function compile(table: FragmentTable, inputs: CompileInputs): CompiledSe
|
|
|
602
616
|
// about a tool renders only when the tool is there to be called.
|
|
603
617
|
const delegation = sessionCanDispatch(session) ? table.byId.get("operating.delegation") : undefined;
|
|
604
618
|
const skills = sessionHasContext(session) ? table.byId.get("operating.skills") : undefined;
|
|
619
|
+
const skillActivation =
|
|
620
|
+
isAutonomyLevel(autonomyLevel) && modelMayActivateSkills(autonomyLevel)
|
|
621
|
+
? 'Load matching installed skills with context(scope="skills", name="<name>") and continue the task; skill restrictions still apply.'
|
|
622
|
+
: "Suggest matching skills as /skill <name> (in order when several compose), then continue without them; only the operator activates skills.";
|
|
605
623
|
|
|
606
624
|
const legacy = inputs.sectionOrder === "legacy-0.3.8";
|
|
607
625
|
const rendered = new Map<string, string>([
|
|
608
626
|
["identity", identityBody],
|
|
609
627
|
["operating-contract", operatingContract.body],
|
|
610
628
|
["delegation", delegation?.body ?? ""],
|
|
611
|
-
["skills", skills?.body ?? ""],
|
|
629
|
+
["skills", skills?.body.replace("{SKILL_ACTIVATION_POLICY}", skillActivation) ?? ""],
|
|
612
630
|
["safety", renderSafetySection(safety, autonomyLevel)],
|
|
613
631
|
["runtime", renderRuntimeBlock(session)],
|
|
614
632
|
["tool-contract", renderToolContractBlock(session)],
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
id: identity.docs-routing
|
|
3
3
|
version: 1
|
|
4
|
-
description:
|
|
4
|
+
description: Questions about Clio herself go through gateway(op="call", capability="clio_docs"); this directive renders only when gateway is on the surface and provider tool calls are available.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Clio documentation routing
|
|
8
8
|
|
|
9
|
-
For a question about Clio herself, call
|
|
9
|
+
For a question about Clio herself, call gateway(op="call", capability="clio_docs", args={query: <the question>}) before answering and before any workspace search, then read the document it names from the installed documentation path above.
|
|
@@ -6,14 +6,16 @@ description: Coordinator skill suggestion discipline; rendered only when context
|
|
|
6
6
|
|
|
7
7
|
# Skills
|
|
8
8
|
|
|
9
|
-
Skills are
|
|
10
|
-
|
|
9
|
+
Skills are workflows for git delivery, planning, coding practice,
|
|
10
|
+
context priming/handoff, research, and plan stress-testing.
|
|
11
11
|
context (scope="skills") lists installed and marketplace skills; never
|
|
12
|
-
guess
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
guess a skill or search the repository for one.
|
|
13
|
+
{SKILL_ACTIVATION_POLICY}
|
|
14
|
+
Only the operator installs marketplace skills; a [Marketplace] reminder
|
|
15
|
+
states its own offer options. When the operator names a skill or asks
|
|
16
|
+
how it works, answer from it. If nothing fits, suggest none.
|
|
17
|
+
|
|
18
|
+
If gateway is on the attached direct-tool surface, use
|
|
19
|
+
gateway(op="call", capability="clio_library", args={}) to read the catalog
|
|
20
|
+
of recipes and installable packages; it activates and installs nothing.
|
|
21
|
+
Without gateway, this catalog route is unavailable.
|
|
@@ -55,7 +55,11 @@ export {
|
|
|
55
55
|
} from "./endpoint-slots-store.js";
|
|
56
56
|
export { ProvidersManifest } from "./manifest.js";
|
|
57
57
|
export type { ModelCapabilityPatchTarget } from "./model-capabilities.js";
|
|
58
|
-
export {
|
|
58
|
+
export {
|
|
59
|
+
applyModelCapabilityPatch,
|
|
60
|
+
probeCapabilitiesForModel,
|
|
61
|
+
resolveModelCapabilities,
|
|
62
|
+
} from "./model-capabilities.js";
|
|
59
63
|
export {
|
|
60
64
|
canonicalizeWireModelId,
|
|
61
65
|
contextSlotsForModel,
|
|
@@ -636,6 +636,37 @@
|
|
|
636
636
|
turns when the workflow is iterative; the budget caps runaway chains.
|
|
637
637
|
serving: "Official Qwen card recommends max output 32768 tokens for standard queries (81920 only for math/code competitions). Coding sampler is the precise variant; preserve thinking blocks across turns for iterative workflows."
|
|
638
638
|
|
|
639
|
+
- family: qwopus3.8-27b-dense
|
|
640
|
+
matchPatterns:
|
|
641
|
+
- mini/qwopus3.8-27b-dense
|
|
642
|
+
capabilities:
|
|
643
|
+
reasoning: true
|
|
644
|
+
quirks:
|
|
645
|
+
measuredUnder:
|
|
646
|
+
runtime: "LiteLLM route mini/qwopus3.8-27b-dense-q6; model_info.runtime llama.cpp"
|
|
647
|
+
date: "2026-09-16"
|
|
648
|
+
source: "Operator report and current-source request to blade-gateway, reproduced during v0.4.9 closeout"
|
|
649
|
+
note: |
|
|
650
|
+
The exact route rejected an omitted effort with Jinja's diagnostic
|
|
651
|
+
Unexpected reasoning effort high. Supported types are xhigh
|
|
652
|
+
(default), medium, and low. Clio's captured request carried only
|
|
653
|
+
enable_thinking true. The upstream behavior is consistent with an
|
|
654
|
+
incompatible deployment default; its precise cause was not inspected.
|
|
655
|
+
These effort levels come from that server diagnostic, not from
|
|
656
|
+
Qwen or Qwopus name similarity. Other capabilities remain supplied
|
|
657
|
+
by the route probe; no sampler, hardware, or context size is inherited.
|
|
658
|
+
thinking:
|
|
659
|
+
mechanism: effort-levels
|
|
660
|
+
effortByLevel:
|
|
661
|
+
low: low
|
|
662
|
+
medium: medium
|
|
663
|
+
xhigh: xhigh
|
|
664
|
+
guidance: |
|
|
665
|
+
The measured mini/qwopus3.8-27b-dense-q6 route accepts low, medium,
|
|
666
|
+
and xhigh, and rejects high. Clio maps high and max to xhigh and
|
|
667
|
+
explicitly forwards that supported effort through LiteLLM. Omitting
|
|
668
|
+
active effort can expose an incompatible deployment default.
|
|
669
|
+
|
|
639
670
|
- family: qwen3.8-27b
|
|
640
671
|
matchPatterns:
|
|
641
672
|
- qwen3.8-27b
|
|
@@ -829,23 +860,23 @@
|
|
|
829
860
|
leakageNote: |
|
|
830
861
|
LM Studio's gemma4 chat template emits chain-of-thought as plain text
|
|
831
862
|
bracketed by literal '<|channel>thought\n' and '<channel|>' markers
|
|
832
|
-
rather than structured reasoning fragments.
|
|
833
|
-
|
|
834
|
-
|
|
863
|
+
rather than structured reasoning fragments. Clio splits those regions into
|
|
864
|
+
thinking content on the OpenAI-compatible stream, including LM Studio,
|
|
865
|
+
and removes the channel markers from the visible answer.
|
|
835
866
|
gpuTiers:
|
|
836
867
|
"48gb": "Fits at f16 KV when parallel=1 and ctx=122880; drop to q8_0 KV at parallel=4."
|
|
837
868
|
"80gb": "Comfortable at f16 KV with parallel=1 and ctx=122880."
|
|
838
869
|
runtimePreference:
|
|
839
870
|
lmstudio: "Pin parallel=1 in the LM Studio per-model preset to give a single agent the full 122880 context."
|
|
840
|
-
openaiCompat: "LM Studio chat uses this surface;
|
|
871
|
+
openaiCompat: "LM Studio chat uses this surface; Clio separates inline thought regions and removes their channel markers."
|
|
841
872
|
thinking:
|
|
842
873
|
mechanism: on-off
|
|
843
874
|
guidance: |
|
|
844
875
|
Gemma 4 chat template exposes thinking only as on or off; intermediate
|
|
845
876
|
levels coerce to on. NVFP4 quantization can corrupt JSON tool-call
|
|
846
877
|
output under aggressive sampling, so the instruct profile pins
|
|
847
|
-
temperature at 0.7. LM Studio's
|
|
848
|
-
|
|
878
|
+
temperature at 0.7. Clio classifies inline channel markers on LM Studio's
|
|
879
|
+
OpenAI-compatible stream when the server leaves them in content.
|
|
849
880
|
serving: "LilaRest publishes no per-model sampler; values inherit the gemma family default per the official Google Gemma 4 31B card. KV cache budget at f16, ctx=122880 is roughly 57 GB on top of ~21 GB of NVFP4 weights."
|
|
850
881
|
|
|
851
882
|
# The qat/UD-Q4_K_XL/MTP build is the long-context llama.cpp gemma profile and is a
|
|
@@ -928,7 +959,7 @@
|
|
|
928
959
|
"32gb": "32 GB Vulkan llama.cpp profile with UD-Q4_K_XL weights, ctx=262144, q8 KV, flash attention, parallel=1, F16 gemma4v mmproj (vision), and MTP draft (spec-type draft-mtp, n_max 4) both active."
|
|
929
960
|
runtimePreference:
|
|
930
961
|
llamaCpp: "OpenAI-compatible chat completions with --jinja and --reasoning off. Recommended local profile serves at ctx=262144, q8 KV, flash attention, parallel=1, batch=1024, ubatch=256, with F16 mmproj vision and draft-mtp speculative decoding; sampler temperature 0.8, top_p 0.95, top_k 64, repeat_penalty 1.05."
|
|
931
|
-
openaiCompat: "Fallback when a gateway fronts the same llama.cpp chat-completions surface;
|
|
962
|
+
openaiCompat: "Fallback when a gateway fronts the same llama.cpp chat-completions surface; Clio separates inline thought regions with the shared channel-marker filter."
|
|
932
963
|
llamaCpp:
|
|
933
964
|
ctxSize: 262144
|
|
934
965
|
cacheTypeK: q8_0
|
|
@@ -1008,15 +1039,16 @@
|
|
|
1008
1039
|
"48gb": "Fits at f16 KV with parallel=1; q8_0 KV recommended at parallel=4."
|
|
1009
1040
|
"80gb": "Comfortable at f16 KV with parallel=1 and ctx=122880."
|
|
1010
1041
|
runtimePreference:
|
|
1011
|
-
lmstudio: "LM Studio
|
|
1042
|
+
lmstudio: "LM Studio may stream inline channel markers; Clio separates the thought region and removes the markers from the answer."
|
|
1012
1043
|
openaiCompat: "Fallback; reasoning_content is absent from the openai-compat reasoning probe for this family."
|
|
1013
1044
|
thinking:
|
|
1014
1045
|
mechanism: always-on
|
|
1015
1046
|
guidance: |
|
|
1016
1047
|
Distilled traces emit unconditionally. The thinking level setting is
|
|
1017
1048
|
ignored at the API surface; chain-of-thought arrives whether or not
|
|
1018
|
-
Clio asks for it.
|
|
1019
|
-
OpenAI-compatible LM Studio path
|
|
1049
|
+
Clio asks for it. The shared channel-marker filter splits inline thought
|
|
1050
|
+
regions into thinking content on the OpenAI-compatible LM Studio path
|
|
1051
|
+
and removes the markers from the visible answer.
|
|
1020
1052
|
serving: "Distilled from Claude 4.6 Opus reasoning traces onto Google Gemma 4 31B; sampler matches the gemopus card values."
|
|
1021
1053
|
|
|
1022
1054
|
- family: qwopus3.6-27b-v1-preview
|
|
@@ -13,84 +13,69 @@ export interface HttpProbeOptions {
|
|
|
13
13
|
|
|
14
14
|
export type JsonProbeOptions = HttpProbeOptions;
|
|
15
15
|
|
|
16
|
-
export interface
|
|
17
|
-
|
|
16
|
+
export interface HttpProbeResult extends ProbeResult {
|
|
17
|
+
/** Status of a completed HTTP response; absent when body/transport work fails. */
|
|
18
|
+
status?: number;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
export
|
|
21
|
-
|
|
22
|
-
if (response === null) return { ok: false, error: error ?? "unknown transport error", latencyMs };
|
|
23
|
-
const method = opts.method ?? "GET";
|
|
24
|
-
if (response.ok) return { ok: true, latencyMs };
|
|
25
|
-
// Some servers reject HEAD with 405 even though the endpoint is reachable.
|
|
26
|
-
if (method === "HEAD" && response.status === 405) return { ok: true, latencyMs };
|
|
27
|
-
return {
|
|
28
|
-
ok: false,
|
|
29
|
-
latencyMs,
|
|
30
|
-
error: `HTTP ${response.status}: ${response.statusText}`,
|
|
31
|
-
};
|
|
21
|
+
export interface JsonProbeResult<T = unknown> extends HttpProbeResult {
|
|
22
|
+
data?: T;
|
|
32
23
|
}
|
|
33
24
|
|
|
34
|
-
export async function
|
|
35
|
-
|
|
36
|
-
if (response === null) return { ok: false, error: error ?? "unknown transport error", latencyMs };
|
|
37
|
-
const method = opts.method ?? "GET";
|
|
38
|
-
if (!response.ok && !(method === "HEAD" && response.status === 405)) {
|
|
39
|
-
return {
|
|
40
|
-
ok: false,
|
|
41
|
-
latencyMs,
|
|
42
|
-
error: `HTTP ${response.status}: ${response.statusText}`,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
let data: T;
|
|
46
|
-
try {
|
|
47
|
-
data = (await response.json()) as T;
|
|
48
|
-
} catch (err) {
|
|
49
|
-
return { ok: false, latencyMs, error: `JSON parse: ${describeError(err)}` };
|
|
50
|
-
}
|
|
51
|
-
return { ok: true, latencyMs, data };
|
|
25
|
+
export async function probeHttp(opts: HttpProbeOptions): Promise<HttpProbeResult> {
|
|
26
|
+
return runProbe(opts, false);
|
|
52
27
|
}
|
|
53
28
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
latencyMs: number;
|
|
57
|
-
error?: string;
|
|
29
|
+
export async function probeJson<T = unknown>(opts: JsonProbeOptions): Promise<JsonProbeResult<T>> {
|
|
30
|
+
return runProbe<T>(opts, true);
|
|
58
31
|
}
|
|
59
32
|
|
|
60
|
-
|
|
33
|
+
/** Own the request until its body has been consumed or cancelled. */
|
|
34
|
+
async function runProbe<T>(opts: HttpProbeOptions, readJson: boolean): Promise<JsonProbeResult<T>> {
|
|
61
35
|
const controller = new AbortController();
|
|
62
|
-
let
|
|
63
|
-
const
|
|
64
|
-
|
|
36
|
+
let abortError: string | undefined;
|
|
37
|
+
const abort = (error: string): void => {
|
|
38
|
+
if (controller.signal.aborted) return;
|
|
39
|
+
abortError = error;
|
|
65
40
|
controller.abort();
|
|
66
|
-
}, opts.timeoutMs);
|
|
67
|
-
const onExternalAbort = () => controller.abort();
|
|
68
|
-
if (opts.signal) {
|
|
69
|
-
if (opts.signal.aborted) controller.abort();
|
|
70
|
-
else opts.signal.addEventListener("abort", onExternalAbort, { once: true });
|
|
71
|
-
}
|
|
72
|
-
const init: RequestInit = {
|
|
73
|
-
method: opts.method ?? "GET",
|
|
74
|
-
signal: controller.signal,
|
|
75
41
|
};
|
|
42
|
+
const timer = setTimeout(() => abort(`timeout after ${opts.timeoutMs}ms`), opts.timeoutMs);
|
|
43
|
+
const onExternalAbort = () => abort("aborted by caller");
|
|
44
|
+
if (opts.signal?.aborted) onExternalAbort();
|
|
45
|
+
else opts.signal?.addEventListener("abort", onExternalAbort, { once: true });
|
|
46
|
+
const method = opts.method ?? "GET";
|
|
47
|
+
const init: RequestInit = { method, signal: controller.signal };
|
|
76
48
|
if (opts.headers) init.headers = opts.headers;
|
|
77
49
|
if (opts.body !== undefined) init.body = opts.body;
|
|
78
50
|
const started = performance.now();
|
|
51
|
+
let latencyMs: number | undefined;
|
|
52
|
+
let parsingJson = false;
|
|
79
53
|
try {
|
|
80
54
|
const response = await fetch(opts.url, init);
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
55
|
+
// Preserve the existing network latency measurement at response headers.
|
|
56
|
+
latencyMs = Math.round(performance.now() - started);
|
|
57
|
+
// HEAD 405 demonstrates reachability, but does not supply JSON data.
|
|
58
|
+
const ok = response.ok || (method === "HEAD" && response.status === 405);
|
|
59
|
+
if (!ok || !readJson) {
|
|
60
|
+
await response.body?.cancel();
|
|
61
|
+
controller.signal.throwIfAborted();
|
|
62
|
+
return ok
|
|
63
|
+
? { ok: true, latencyMs, status: response.status }
|
|
64
|
+
: { ok: false, latencyMs, status: response.status, error: `HTTP ${response.status}: ${response.statusText}` };
|
|
86
65
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
return {
|
|
66
|
+
parsingJson = true;
|
|
67
|
+
const data = (await response.json()) as T;
|
|
68
|
+
controller.signal.throwIfAborted();
|
|
69
|
+
return { ok: true, latencyMs, status: response.status, data };
|
|
70
|
+
} catch (err) {
|
|
71
|
+
return {
|
|
72
|
+
ok: false,
|
|
73
|
+
latencyMs: latencyMs ?? Math.round(performance.now() - started),
|
|
74
|
+
error: abortError ?? `${parsingJson ? "JSON parse: " : ""}${describeError(err)}`,
|
|
75
|
+
};
|
|
91
76
|
} finally {
|
|
92
77
|
clearTimeout(timer);
|
|
93
|
-
|
|
78
|
+
opts.signal?.removeEventListener("abort", onExternalAbort);
|
|
94
79
|
}
|
|
95
80
|
}
|
|
96
81
|
|
|
@@ -95,6 +95,8 @@ export async function probeOpenAICompatReasoning(opts: ProbeReasoningOptions): P
|
|
|
95
95
|
});
|
|
96
96
|
const latencyMs = Math.round(performance.now() - started);
|
|
97
97
|
if (!response.ok) {
|
|
98
|
+
await response.body?.cancel();
|
|
99
|
+
controller.signal.throwIfAborted();
|
|
98
100
|
return { reasoning: false, latencyMs, error: `HTTP ${response.status}: ${response.statusText}` };
|
|
99
101
|
}
|
|
100
102
|
const data = (await response.json()) as ChatCompletionResponse;
|
|
@@ -54,27 +54,6 @@ function flattenNativeEmbedding(entry: NativeEmbeddingItem): number[] {
|
|
|
54
54
|
return value as number[];
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
async function postJson<T>(
|
|
58
|
-
url: string,
|
|
59
|
-
body: unknown,
|
|
60
|
-
signal: AbortSignal | undefined,
|
|
61
|
-
): Promise<{ status: number; data: T | null }> {
|
|
62
|
-
const init: RequestInit = {
|
|
63
|
-
method: "POST",
|
|
64
|
-
headers: { "content-type": "application/json" },
|
|
65
|
-
body: JSON.stringify(body),
|
|
66
|
-
};
|
|
67
|
-
if (signal) init.signal = signal;
|
|
68
|
-
const response = await fetch(url, init);
|
|
69
|
-
if (!response.ok) return { status: response.status, data: null };
|
|
70
|
-
try {
|
|
71
|
-
const data = (await response.json()) as T;
|
|
72
|
-
return { status: response.status, data };
|
|
73
|
-
} catch {
|
|
74
|
-
return { status: response.status, data: null };
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
57
|
const llamacppEmbedRuntime: RuntimeDescriptor = {
|
|
79
58
|
id: "llamacpp-embed",
|
|
80
59
|
displayName: "llama.cpp (embeddings)",
|
|
@@ -90,16 +69,16 @@ const llamacppEmbedRuntime: RuntimeDescriptor = {
|
|
|
90
69
|
const healthOpts = { url: `${base}/health`, timeoutMs: ctx.httpTimeoutMs } as const;
|
|
91
70
|
const health = await (ctx.signal ? probeHttp({ ...healthOpts, signal: ctx.signal }) : probeHttp(healthOpts));
|
|
92
71
|
if (!health.ok) return health;
|
|
93
|
-
const probeResponse = await
|
|
72
|
+
const probeResponse = await probeHttp({
|
|
73
|
+
url: `${base}/embedding`,
|
|
94
74
|
method: "POST",
|
|
75
|
+
timeoutMs: ctx.httpTimeoutMs,
|
|
95
76
|
headers: { "content-type": "application/json" },
|
|
96
77
|
body: JSON.stringify({ content: "probe" }),
|
|
97
78
|
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
98
|
-
}).catch((err) => {
|
|
99
|
-
return new Response(null, { status: 599, statusText: String(err) });
|
|
100
79
|
});
|
|
101
80
|
if (!probeResponse.ok) {
|
|
102
|
-
return { ok: false, error: `/embedding not available:
|
|
81
|
+
return { ok: false, error: `/embedding not available: ${probeResponse.error}` };
|
|
103
82
|
}
|
|
104
83
|
const props = await probeLlamaCppProps(base, ctx, target.defaultModel);
|
|
105
84
|
const result: ProbeResult = { ok: true };
|
|
@@ -129,12 +108,15 @@ const llamacppEmbedRuntime: RuntimeDescriptor = {
|
|
|
129
108
|
if (!base) throw new Error("target has no url");
|
|
130
109
|
const modelId = target.defaultModel ?? "default";
|
|
131
110
|
const inputs = Array.isArray(input) ? input : [input];
|
|
132
|
-
const oai = await
|
|
133
|
-
`${base}/v1/embeddings`,
|
|
134
|
-
|
|
135
|
-
ctx.
|
|
136
|
-
|
|
137
|
-
|
|
111
|
+
const oai = await probeJson<OaiEmbeddingResponse>({
|
|
112
|
+
url: `${base}/v1/embeddings`,
|
|
113
|
+
method: "POST",
|
|
114
|
+
timeoutMs: ctx.httpTimeoutMs,
|
|
115
|
+
headers: { "content-type": "application/json" },
|
|
116
|
+
body: JSON.stringify({ input: inputs, model: modelId, encoding_format: "float" }),
|
|
117
|
+
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
118
|
+
});
|
|
119
|
+
if (oai.ok && oai.data && Array.isArray(oai.data.data)) {
|
|
138
120
|
const rows = oai.data.data;
|
|
139
121
|
const sorted = [...rows].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
|
|
140
122
|
const vectors = sorted.map((row) => row.embedding ?? []);
|
|
@@ -148,6 +130,13 @@ const llamacppEmbedRuntime: RuntimeDescriptor = {
|
|
|
148
130
|
if (tokens !== undefined) result.tokensUsed = tokens;
|
|
149
131
|
return result;
|
|
150
132
|
}
|
|
133
|
+
// Only endpoint-unavailable responses permit trying the native route.
|
|
134
|
+
// Cancellation, transport failures and malformed successes must not
|
|
135
|
+
// submit a second inference request.
|
|
136
|
+
if (oai.status === undefined || ![404, 405, 501].includes(oai.status)) {
|
|
137
|
+
throw new Error(`llama.cpp embedding failed: ${oai.error ?? "invalid OAI embedding response"}`);
|
|
138
|
+
}
|
|
139
|
+
if (ctx.signal?.aborted) throw new Error("llama.cpp embedding failed: aborted by caller");
|
|
151
140
|
const probeOpts = { url: `${base}/embedding`, timeoutMs: ctx.httpTimeoutMs } as const;
|
|
152
141
|
const native = await (ctx.signal
|
|
153
142
|
? probeJson<NativeEmbeddingItem[]>({
|
|
@@ -51,14 +51,19 @@ const llamacppRerankRuntime: RuntimeDescriptor = {
|
|
|
51
51
|
const health = await (ctx.signal ? probeHttp({ ...healthOpts, signal: ctx.signal }) : probeHttp(healthOpts));
|
|
52
52
|
if (!health.ok) return health;
|
|
53
53
|
const modelId = target.defaultModel ?? "default";
|
|
54
|
-
const probeResponse = await
|
|
54
|
+
const probeResponse = await probeHttp({
|
|
55
|
+
url: `${base}/reranking`,
|
|
55
56
|
method: "POST",
|
|
57
|
+
timeoutMs: ctx.httpTimeoutMs,
|
|
56
58
|
headers: { "content-type": "application/json" },
|
|
57
59
|
body: JSON.stringify({ query: "probe", documents: ["a"], model: modelId }),
|
|
58
60
|
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
59
|
-
})
|
|
60
|
-
if (!(probeResponse.status === 200 || probeResponse.status === 202)) {
|
|
61
|
-
return {
|
|
61
|
+
});
|
|
62
|
+
if (!probeResponse.ok || !(probeResponse.status === 200 || probeResponse.status === 202)) {
|
|
63
|
+
return {
|
|
64
|
+
ok: false,
|
|
65
|
+
error: `/reranking not available: ${probeResponse.error ?? `HTTP ${probeResponse.status}`}`,
|
|
66
|
+
};
|
|
62
67
|
}
|
|
63
68
|
const props = await probeLlamaCppProps(base, ctx, target.defaultModel);
|
|
64
69
|
const result: ProbeResult = { ok: true };
|