@iowarp/clio-coder 0.4.7 → 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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +111 -0
- package/CONTRIBUTING.md +83 -74
- package/README.md +69 -47
- package/dist/{acp-W3Y3TRHD.js → acp-ZWZCPS2A.js} +15 -15
- package/dist/{agents-J4ICNLQ3.js → agents-LYSOWZUE.js} +61 -59
- 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-WBQGKWQ5.js} +27 -27
- package/dist/background-BUMOBAQN.js +37 -0
- package/dist/{builtins-XLXWWSRF.js → builtins-ODRJOEDI.js} +7 -7
- package/dist/{chunk-C3G5PNUO.js → chunk-2DRRZ57Q.js} +36 -27
- package/dist/chunk-2JBZYUPY.js +105 -0
- package/dist/chunk-2KUBKL63.js +336 -0
- package/dist/chunk-2VBWFXYE.js +198 -0
- package/dist/{chunk-XZ6UFQ52.js → chunk-2X2R3UTH.js} +25 -15
- package/dist/{chunk-M6Z2V6YU.js → chunk-37LW32LZ.js} +5 -5
- package/dist/{chunk-6LRLOJHQ.js → chunk-3AND2EFU.js} +11 -62
- package/dist/{chunk-FQOOGXBH.js → chunk-3RDHGNU7.js} +101 -33
- package/dist/{chunk-D2T66PDV.js → chunk-3SUDBGEI.js} +41 -208
- package/dist/{chunk-5AJPUR72.js → chunk-3TQN67I2.js} +9 -9
- package/dist/{chunk-LBFQMYS3.js → chunk-3U4BL2EV.js} +5 -3
- package/dist/{chunk-UFYNOQK4.js → chunk-3UQADNG2.js} +7 -7
- package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
- package/dist/{chunk-NO7J45X6.js → chunk-4ATBOFRP.js} +713 -218
- package/dist/{chunk-ECOMVOHP.js → chunk-4DNL43EZ.js} +3 -3
- package/dist/{chunk-WT5TRMO4.js → chunk-4HFJKRGZ.js} +255 -82
- package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
- package/dist/{chunk-WURGVOZJ.js → chunk-5RTEFNBP.js} +18 -14
- package/dist/{config-YXARKGTX.js → chunk-64XJW7NT.js} +24 -268
- package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
- package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
- package/dist/{chunk-MZNWZUJM.js → chunk-7FBCRWVT.js} +288 -288
- package/dist/{chunk-UA6W4XFJ.js → chunk-7JSOSVLP.js} +2 -2
- package/dist/chunk-7N3OLLSL.js +637 -0
- package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
- package/dist/{chunk-N37QC5FV.js → chunk-A6DULIMH.js} +21 -9
- package/dist/{fleet-decisions-S3PTZV2D.js → chunk-AB3QXXBC.js} +5 -41
- package/dist/chunk-ACCECAH4.js +49 -0
- package/dist/{chunk-CP3HIR5H.js → chunk-AM6CEP2K.js} +20 -19
- package/dist/chunk-AUHVBIDW.js +19 -0
- package/dist/{chunk-BQQ5MXUC.js → chunk-AY4XE6GN.js} +19 -13
- package/dist/{chunk-ISNCCX42.js → chunk-BBA2TAWV.js} +10 -9
- package/dist/chunk-BFPHMSK7.js +169 -0
- package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
- package/dist/{chunk-DO7M3LSX.js → chunk-BMNVVKEW.js} +40 -93
- package/dist/{chunk-VTYHHQ57.js → chunk-CTGZCEI6.js} +2 -2
- package/dist/{chunk-RTLNFZMD.js → chunk-DIAJYJYG.js} +3 -3
- package/dist/chunk-EHZRAB4U.js +63 -0
- package/dist/{chunk-KS7ETA3P.js → chunk-EM2DIQAJ.js} +3 -3
- package/dist/{chunk-MNQN3X6Y.js → chunk-ETF4ROKH.js} +5 -5
- package/dist/{chunk-WN552PKN.js → chunk-F2YM3JY4.js} +744 -1134
- package/dist/{chunk-7EEGBKV4.js → chunk-FEBQWHJT.js} +24 -19
- package/dist/{chunk-4QKAITQT.js → chunk-FPS4R2RN.js} +74 -10
- package/dist/chunk-G5R53COU.js +68 -0
- package/dist/chunk-GHXGMFQ5.js +40 -0
- package/dist/{chunk-GFQ7P2UF.js → chunk-GJDRMBDI.js} +10 -10
- package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
- package/dist/{chunk-NCCQ6DVS.js → chunk-GREYLTZ5.js} +8 -8
- package/dist/{chunk-HOX4YZ2K.js → chunk-H2WSCZZT.js} +19 -3
- package/dist/{chunk-3LXJOICS.js → chunk-H6IUCY6Q.js} +2 -2
- package/dist/{chunk-BO4XV5VX.js → chunk-H72DCH3E.js} +95 -206
- package/dist/{chunk-SEDI5K5B.js → chunk-H7TXJR23.js} +20 -20
- package/dist/chunk-HBJQQTKM.js +40 -0
- package/dist/chunk-HCVKSGNZ.js +990 -0
- package/dist/chunk-HVCAY2FH.js +67 -0
- package/dist/{chunk-34XHRVKG.js → chunk-I47EJPYL.js} +3 -3
- package/dist/{chunk-4N2RZ4TO.js → chunk-IALGWTLO.js} +3 -3
- package/dist/{chunk-IQCNVLO6.js → chunk-IALZJE37.js} +10 -7
- package/dist/{chunk-DLIYANB7.js → chunk-IC7JXLOM.js} +16 -11
- package/dist/{chunk-G4LGUTOE.js → chunk-IOSVTTCD.js} +5 -5
- package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
- package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
- package/dist/{chunk-TN5FW4XY.js → chunk-JIYWMQZ5.js} +12 -9
- package/dist/{chunk-T7QQBNLH.js → chunk-JKU34ACI.js} +10 -8
- package/dist/chunk-JOBN2YQQ.js +176 -0
- package/dist/chunk-JOL2QRLE.js +152 -0
- package/dist/{chunk-GXIWHXDB.js → chunk-JTR3VSV3.js} +3 -3
- package/dist/{chunk-T334FW2H.js → chunk-JU6MAMRJ.js} +7 -7
- package/dist/chunk-JURMQWVJ.js +15 -0
- package/dist/{chunk-CULVKYTK.js → chunk-K3XN4LZ4.js} +5 -5
- package/dist/{chunk-3T4DXWP6.js → chunk-KIVFXGBM.js} +27 -7
- package/dist/chunk-KKRXONXG.js +43 -0
- package/dist/{chunk-YPRSNUTC.js → chunk-KOAHT3N2.js} +2 -2
- package/dist/chunk-KP5BPXR3.js +73 -0
- package/dist/{chunk-UA3W4FGC.js → chunk-KRJQG47M.js} +6 -6
- package/dist/{chunk-GI5RRMAH.js → chunk-KW6OJ7IY.js} +19 -21
- package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
- package/dist/{chunk-MZHXENL7.js → chunk-L4RUTLRL.js} +8 -8
- package/dist/{chunk-P5SC4DLJ.js → chunk-LGTVWPRN.js} +2 -2
- package/dist/{chunk-65BGHOUR.js → chunk-LSQW6KZO.js} +5 -5
- package/dist/{chunk-TZHN5ITX.js → chunk-LWJYOHT3.js} +8 -8
- package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
- package/dist/chunk-MJ4QEJVT.js +185 -0
- package/dist/{chunk-T4TY5GG3.js → chunk-MO65K5CH.js} +5 -5
- package/dist/{chunk-TZ6UVP2H.js → chunk-MTOZEQHL.js} +8 -8
- package/dist/chunk-MZDPF35R.js +45 -0
- package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
- package/dist/{chunk-KAFMW7WM.js → chunk-NBPA5QM6.js} +2 -2
- package/dist/{chunk-EUEXGXXR.js → chunk-NMBEW4PP.js} +5 -5
- package/dist/{chunk-SELG4SUR.js → chunk-NPLLK3HO.js} +72 -89
- package/dist/{chunk-VCRVEDUC.js → chunk-NSYGPIVW.js} +5 -5
- package/dist/{context-7HJEWTTP.js → chunk-NXTV5OI5.js} +36 -90
- package/dist/{chunk-IMOD2YPV.js → chunk-NYDG4QP4.js} +9 -19
- package/dist/{chunk-6CA2BHOR.js → chunk-OA2GDACN.js} +5 -5
- package/dist/{chunk-A67NR5AT.js → chunk-PJI57EC6.js} +14 -11
- package/dist/{chunk-IJMW64DX.js → chunk-PJJBUGMR.js} +50 -50
- package/dist/{chunk-CPXGJI2A.js → chunk-PNJE7JPS.js} +20 -5
- package/dist/chunk-PP23PZEV.js +1347 -0
- package/dist/chunk-PPIFDSBK.js +409 -0
- package/dist/{chunk-T52TPHYC.js → chunk-PTFISXQO.js} +8 -7
- package/dist/{chunk-C6GEXX4L.js → chunk-QB33Z5S7.js} +5 -5
- package/dist/{chunk-VMATUZB6.js → chunk-QGNII5VC.js} +10 -10
- package/dist/{chunk-TLTGZTXI.js → chunk-QI72X67S.js} +104 -27
- package/dist/chunk-QKHZZFKH.js +98 -0
- package/dist/{chunk-PFLOULP3.js → chunk-RDKX2PME.js} +4 -4
- package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
- package/dist/chunk-RPMNIFRY.js +65 -0
- package/dist/{chunk-L3Z5ANCV.js → chunk-RQROVOV3.js} +13 -11
- package/dist/{chunk-6YHPAAZR.js → chunk-S34A7BSP.js} +3 -3
- package/dist/{chunk-5ZSZEYJK.js → chunk-SJETVJHX.js} +2 -2
- package/dist/{chunk-77CZRFTE.js → chunk-SJMNU4ZS.js} +2 -2
- package/dist/chunk-SLLG2G44.js +85 -0
- package/dist/{chunk-GVZFCJHE.js → chunk-SQAZN2V3.js} +48 -22
- package/dist/{chunk-2O2LVQQK.js → chunk-SQBT46OF.js} +2 -2
- package/dist/{chunk-ZGIGW4ZG.js → chunk-TCUOGIL2.js} +5 -5
- package/dist/{chunk-DACXIVVF.js → chunk-TIWPKCVO.js} +5 -5
- package/dist/{chunk-5CMARGPF.js → chunk-UIU7MGZ3.js} +11 -2
- package/dist/chunk-USBBEKHW.js +177 -0
- package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
- package/dist/{chunk-MBJO5VNZ.js → chunk-VPWGADBG.js} +33 -33
- package/dist/{chunk-UUQ5G6EZ.js → chunk-VWFCAK34.js} +6 -6
- package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
- package/dist/{chunk-4MFBBY2Z.js → chunk-W72LLZAV.js} +3 -3
- package/dist/{chunk-4UHVS5T7.js → chunk-WGRDABW7.js} +8 -8
- package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
- package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
- package/dist/{chunk-6YA46L5A.js → chunk-XFLSL7BT.js} +2 -2
- package/dist/{chunk-QKWL7SYE.js → chunk-XJZEDCNT.js} +50 -39
- package/dist/{chunk-UWD3JD5X.js → chunk-XLLEL3K7.js} +10 -10
- package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
- package/dist/chunk-XNZWWDC3.js +686 -0
- package/dist/{chunk-WBVKKTUT.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-WB7POC6M.js → chunk-Y3M2T5RO.js} +6 -6
- package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
- package/dist/{chunk-EUZRMP4Y.js → chunk-YPQOPFP7.js} +20 -20
- package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
- package/dist/{chunk-BAU36233.js → chunk-YQYINEJI.js} +9 -9
- package/dist/{chunk-CE64C5K5.js → chunk-ZF6CV4WZ.js} +1356 -235
- package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
- package/dist/{chunk-IZYTT3CD.js → chunk-ZKQ63XZ5.js} +16 -39
- package/dist/{chunk-6TAATXXH.js → chunk-ZKVMDNAN.js} +7 -7
- package/dist/chunk-ZST3FRCV.js +132 -0
- package/dist/cli/index.js +50 -38
- package/dist/{clio-L2P7S2R2.js → clio-JUDCLNHC.js} +11 -11
- package/dist/clio-context-tools-FT672MNZ.js +136 -0
- package/dist/{code-nav-B5LNX4KU.js → code-nav-7OVCTP2Z.js} +39 -37
- package/dist/{components-63MMQKUT.js → components-OZXZMDWU.js} +11 -11
- package/dist/config-P3ZQVF63.js +275 -0
- package/dist/config-graph-GKAOBAS5.js +160 -0
- package/dist/{configure-LMVQJ46J.js → configure-25LRYZJG.js} +56 -55
- package/dist/context-72VQV7JX.js +73 -0
- package/dist/{context-YG2LZDYZ.js → context-COWRWXP3.js} +89 -83
- package/dist/{context-XSZKKFBW.js → context-WB3D474G.js} +16 -16
- package/dist/{context-clear-AC5NXHM2.js → context-clear-Y4LYMWC6.js} +88 -82
- 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-TMZYVC7A.js} +27 -25
- package/dist/data-tool-KMBWKKWR.js +2987 -0
- package/dist/{detail-H73BEF2N.js → detail-4GLROGY5.js} +89 -83
- package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-TR3LBP5P.js} +113 -107
- package/dist/docs-ZK777W2G.js +101 -0
- package/dist/{doctor-EQYJOGUG.js → doctor-WC4OV2OB.js} +76 -73
- package/dist/{eval-4P7O6CCE.js → eval-FUNWJNUJ.js} +88 -73
- package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
- package/dist/evals-L73EBHSU.js +104 -0
- package/dist/{evidence-O76QF7TZ.js → evidence-AVJ2RTHX.js} +99 -93
- package/dist/{evidence-D6GUSYJW.js → evidence-P4NZOAK7.js} +88 -82
- package/dist/evidence-Y55WKYHH.js +246 -0
- package/dist/{evolve-H47BCETS.js → evolve-MAWKRYWF.js} +93 -87
- package/dist/{extensions-NNL3ZOCU.js → extensions-PYQH3H47.js} +14 -13
- package/dist/fleet-M4H2QBWT.js +268 -0
- package/dist/{fleet-KMNS6NOM.js → fleet-ULBXXRDR.js} +146 -138
- package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-7NNC4JZU.js} +18 -17
- package/dist/fleet-decisions-EHEY7KPU.js +52 -0
- package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-LQ2AHZT3.js} +24 -24
- package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-5IGBIIYZ.js} +98 -258
- package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-UTTNOKMG.js} +9 -4
- package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-YGILJKA6.js} +29 -29
- package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-AUWTCDKR.js} +88 -82
- package/dist/{fleet-view-BHJFW26B.js → fleet-view-TGUFCY5A.js} +90 -84
- package/dist/{init-XAT5N5YM.js → init-GFN2Z7NF.js} +111 -104
- package/dist/install-6PIF6F6W.js +19 -0
- package/dist/{interop-FVECHFKG.js → interop-EF5JUWWK.js} +29 -29
- package/dist/{inventory-7KFQGLCV.js → inventory-I6VJDDYF.js} +90 -84
- package/dist/library-3J5IO2OJ.js +75 -0
- package/dist/{library-QAPAO23R.js → library-IJTOFTDS.js} +20 -19
- package/dist/{library-NY2XOT75.js → library-Z3KZSHPE.js} +35 -35
- package/dist/{library-import-5Y6MAS3R.js → library-import-IMKFLDHX.js} +29 -29
- package/dist/{library-inventory-JT6HWITQ.js → library-inventory-CQP5D6GU.js} +21 -21
- package/dist/{library-validation-EQUH25DC.js → library-validation-33UTX7AI.js} +19 -19
- package/dist/mcp-5FWZKUS6.js +26 -0
- package/dist/{memory-DYVTTCP6.js → memory-36CWN67Y.js} +93 -87
- package/dist/{models-MASFJ6Y2.js → models-KQ6PQJJQ.js} +57 -56
- package/dist/{monitor-YMP4NXJJ.js → monitor-XX6ZD6KC.js} +98 -91
- package/dist/{orchestrator-AFQRRTEI.js → orchestrator-SK6HDAOP.js} +1537 -832
- package/dist/{panes-NICTHQCV.js → panes-L27QRXUH.js} +14 -14
- package/dist/{panes-D3Y2KFG5.js → panes-LXZIWNOZ.js} +4 -4
- package/dist/{paths-PSFAUIGO.js → paths-7DJDU4P4.js} +6 -6
- package/dist/{preload-5Q7VXRFJ.js → preload-K2TDYI4Y.js} +88 -82
- package/dist/{reset-7NKZK7JN.js → reset-73VU3XNT.js} +13 -13
- package/dist/{resources-NILSIZAT.js → resources-3BYJYVYL.js} +24 -24
- package/dist/{run-BPZGEBZV.js → run-AR7PY6GW.js} +144 -136
- package/dist/run-script-H2KUDIII.js +41 -0
- package/dist/settings-3VMBMWID.js +72 -0
- package/dist/{share-EZ6ERBMH.js → share-HVWH4FPF.js} +30 -30
- package/dist/{skills-BTVVNYVM.js → skills-5TYEY75Q.js} +30 -30
- package/dist/{skills-eval-UY34MNK7.js → skills-eval-CK3MD63Z.js} +114 -103
- package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-KSFYG3I6.js} +24 -24
- package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-DMVHML7P.js} +60 -57
- package/dist/{steer-2B3EQGFH.js → steer-XCD6V3EW.js} +4 -4
- package/dist/{support-L2SOL3IE.js → support-JAZL6VBR.js} +7 -7
- package/dist/system-3TDQRMZZ.js +116 -0
- package/dist/{targets-44VKGFLN.js → targets-EZKHAYRN.js} +74 -72
- package/dist/{tasks-3KODKFU7.js → tasks-SNEFHWYW.js} +18 -18
- package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-BNLFA4OF.js} +8 -7
- package/dist/{tools-3UB7TEVR.js → tools-7IM6BDCE.js} +12 -12
- package/dist/{trace-TAMIU4OJ.js → trace-C3MBGD4S.js} +16 -65
- package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
- package/dist/{uninstall-QYVRPEM4.js → uninstall-WWLOSZ42.js} +35 -10
- package/dist/{upgrade-7PMKM2JH.js → upgrade-ETK2JNSJ.js} +42 -51
- package/dist/{usage-6EQV7EQK.js → usage-S2HOB7BZ.js} +112 -102
- package/dist/{verifiers-JLITWSHU.js → verifiers-QDTEVH7R.js} +26 -24
- package/dist/{verify-T7NAEVIG.js → verify-SUKUK6XM.js} +16 -15
- package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
- package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +1 -0
- package/dist/web/client/assets/arc-Pry-7G1_.js +1 -0
- 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/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-prINbpbM.js +129 -0
- package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +38 -0
- package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
- package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +62 -0
- package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +2 -0
- package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
- package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +1 -0
- package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
- package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +72 -0
- package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +1 -0
- package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +231 -0
- package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +1 -0
- package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +10 -0
- package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +1 -0
- package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +1 -0
- package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +1 -0
- package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +168 -0
- package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +88 -0
- package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +206 -0
- package/dist/web/client/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- 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/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-CVh1icwb.js +1 -0
- package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +1 -0
- package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.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-CAWJmRMG.js +4 -0
- package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +30 -0
- package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +41 -0
- package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +3 -0
- package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +24 -0
- package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +24 -0
- package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +1 -0
- package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +99 -0
- 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-DjD_AAMj.js +1 -0
- package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +106 -0
- package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
- package/dist/web/client/assets/index-Dsi52apB.css +1 -0
- package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +1 -0
- package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +2 -0
- package/dist/web/client/assets/init-C-OQMol4.js +1 -0
- package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +70 -0
- package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +139 -0
- package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +89 -0
- package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
- package/dist/web/client/assets/line-BIDAcEtX.js +1 -0
- package/dist/web/client/assets/linear-SzVmGSw4.js +1 -0
- package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +7 -0
- package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +44 -0
- package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.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-DRO66c9Q.js +1 -0
- package/dist/web/client/assets/path-fybaL0A-.js +1 -0
- package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +1 -0
- package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +1 -0
- package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.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-BtsZdCS6.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-DuMPwwV2.js +7 -0
- package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +1 -0
- package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +1 -0
- 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-CgMS4B6R.js +1 -0
- package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +84 -0
- package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +40 -0
- package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +162 -0
- package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
- package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +1 -0
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
- package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +1 -0
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
- package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +120 -0
- package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +1 -0
- package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +1 -0
- package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +34 -0
- package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +1 -0
- package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +78 -0
- package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.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 +6 -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-EMGUGGEI.js +13 -0
- package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-6BRRVQON.js} +22 -5
- package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-XHSJTDOP.js} +120 -113
- package/dist/{with-panes-CHFC7HGI.js → with-panes-Z6BTEHMZ.js} +12 -12
- package/dist/worker/entry.js +113 -99
- package/docs/README.md +28 -27
- 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 +12 -4
- 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 +1 -3
- 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 +37 -30
- package/docs/architecture/provider-adapter-cookbook.md +1 -4
- package/docs/architecture/safety-model.md +19 -9
- package/docs/architecture/session-lifecycle.md +10 -7
- package/docs/architecture/time-conventions.md +0 -3
- package/docs/architecture/trace-store.md +28 -20
- package/docs/architecture/tui-design.md +38 -18
- 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 +41 -25
- package/docs/guide/configuration-and-targets.md +204 -9
- package/docs/guide/configuration-reference.md +125 -17
- package/docs/guide/environment-variables.md +2 -8
- 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 +3 -5
- package/docs/guide/glossary.md +1 -4
- package/docs/guide/harness-extensions.md +0 -2
- package/docs/guide/installation-and-lifecycle.md +3 -6
- 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 +1 -3
- package/docs/guide/skills-marketplace.md +0 -2
- package/docs/guide/tool-usage.md +166 -67
- package/docs/guide/troubleshooting.md +1 -4
- 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 +16 -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 +6 -9
- 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 +23 -6
- package/docs/process/tool-audit-v0.4.9.md +357 -0
- 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/argv.ts +31 -0
- package/src/cli/clio.ts +17 -13
- package/src/cli/config.ts +4 -0
- package/src/cli/docs.ts +65 -328
- package/src/cli/doctor-panes.ts +1 -1
- package/src/cli/doctor.ts +3 -1
- package/src/cli/index.ts +17 -2
- package/src/cli/mcp.ts +106 -0
- package/src/cli/skills-eval.ts +8 -2
- package/src/cli/trace.ts +4 -65
- package/src/cli/uninstall.ts +26 -0
- package/src/cli/upgrade.ts +34 -38
- package/src/cli/usage.ts +3 -0
- package/src/cli/verifiers.ts +1 -1
- package/src/cli/web.ts +79 -0
- package/src/core/bash-exec.ts +27 -4
- package/src/core/bus-events.ts +3 -4
- package/src/core/config.ts +73 -1
- package/src/core/defaults.ts +10 -1
- package/src/core/domain-loader.ts +37 -28
- 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 +16 -12
- package/src/core/tool-names.ts +33 -12
- 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/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 +206 -26
- 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/index.ts +1 -0
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-findings.ts +3 -4
- package/src/domains/dispatch/receipt-integrity.ts +3 -0
- package/src/domains/dispatch/reservation-store.ts +7 -9
- package/src/domains/dispatch/route-facts.ts +1 -1
- package/src/domains/dispatch/state.ts +4 -5
- package/src/domains/dispatch/types.ts +3 -1
- package/src/domains/eval/metrics/tracked.ts +22 -2
- package/src/domains/evidence/build.ts +35 -7
- package/src/domains/extensions/operator-runtime.ts +3 -1
- 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/middleware/hooks.ts +2 -2
- 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/background-memory-usage.ts +3 -0
- package/src/domains/observability/compaction-usage.ts +2 -0
- package/src/domains/observability/contract.ts +7 -3
- package/src/domains/observability/cost.ts +5 -0
- package/src/domains/observability/evidence-index.ts +2 -2
- package/src/domains/observability/extension.ts +1 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -0
- package/src/domains/observability/projection.ts +10 -0
- package/src/domains/observability/trace-store.ts +65 -5
- package/src/domains/prompts/compiler.ts +41 -23
- package/src/domains/prompts/extension.ts +4 -17
- 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/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 +6 -1
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
- package/src/domains/providers/plugins.ts +3 -13
- package/src/domains/providers/probe/http.ts +44 -59
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +4 -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/providers/types/target-descriptor.ts +17 -0
- 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 +29 -3
- 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/entries.ts +1 -0
- 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/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 +17 -4
- package/src/engine/loop-guard.ts +7 -0
- package/src/engine/prewarm.ts +232 -0
- package/src/engine/provider-diagnostics.ts +6 -1
- 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 +38 -18
- package/src/interactive/chat-loop-messages.ts +3 -0
- package/src/interactive/chat-loop-policy.ts +1 -0
- package/src/interactive/chat-loop.ts +10 -12
- 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/prewarm.ts +11 -197
- 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/session-usage-reseed.ts +2 -0
- package/src/interactive/side-question.ts +2 -0
- 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-context.ts +1 -0
- package/src/interactive/turn-persistence.ts +9 -1
- package/src/interactive/turn-prewarm.ts +126 -19
- package/src/interactive/turn-recovery.ts +2 -1
- package/src/interactive/turn-runtime.ts +36 -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 +80 -11
- 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 +106 -8
- 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/src/worker/spec-contract.ts +27 -0
- package/dist/chunk-B6UM3OZC.js +0 -15
- package/dist/chunk-GJ24ODAX.js +0 -196
- package/dist/chunk-HRAKUPIH.js +0 -57
- package/dist/docs-BL7ROUFN.js +0 -292
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { mcpCommandOutput } from "../cli/mcp.js";
|
|
1
2
|
import { acceptanceFromTaskFlags } from "../cli/tasks.js";
|
|
2
3
|
import { BusChannels } from "../core/bus-events.js";
|
|
3
4
|
import { THINKING_LEVELS } from "../core/defaults.js";
|
|
@@ -135,6 +136,7 @@ export interface LibraryBrowseRequest {
|
|
|
135
136
|
}
|
|
136
137
|
|
|
137
138
|
type SlashCommandVariant =
|
|
139
|
+
| { kind: "mcp"; argv: string[] }
|
|
138
140
|
| { kind: "quit" }
|
|
139
141
|
| { kind: "help"; query?: string }
|
|
140
142
|
| { kind: "init"; options: InitCommandOptions }
|
|
@@ -872,7 +874,7 @@ export interface BuiltinSlashCommand {
|
|
|
872
874
|
match?(trimmed: string): SlashCommand | null;
|
|
873
875
|
fromArgs?(parsed: ParsedArgs, trimmed: string): SlashCommand;
|
|
874
876
|
/** Execute `command` against `ctx`. Called only for kinds declared in `kinds`. */
|
|
875
|
-
handle(command: SlashCommand, ctx: SlashCommandContext):
|
|
877
|
+
handle(command: SlashCommand, ctx: SlashCommandContext): undefined | "rejected";
|
|
876
878
|
}
|
|
877
879
|
|
|
878
880
|
const RUN_THINKING_LEVELS: ReadonlyArray<JobThinkingLevel> = THINKING_LEVELS;
|
|
@@ -1227,6 +1229,29 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1227
1229
|
ctx.openSkillsHub?.({ tab: "prompt" });
|
|
1228
1230
|
},
|
|
1229
1231
|
},
|
|
1232
|
+
{
|
|
1233
|
+
name: "mcp",
|
|
1234
|
+
description: "List MCP servers or manage explicit trust with trust <id> [class] and untrust <id>",
|
|
1235
|
+
group: "Inspect",
|
|
1236
|
+
kinds: ["mcp"],
|
|
1237
|
+
args: {
|
|
1238
|
+
positionals: [
|
|
1239
|
+
{ name: "action", required: false, values: ["list", "trust", "untrust"] },
|
|
1240
|
+
{ name: "id", required: false },
|
|
1241
|
+
{ name: "class", required: false },
|
|
1242
|
+
],
|
|
1243
|
+
},
|
|
1244
|
+
fromArgs(parsed) {
|
|
1245
|
+
if (parsed.error) return { kind: "usage-error", command: "mcp", reason: parsed.error };
|
|
1246
|
+
const [action = "list", id, actionClass] = parsed.positionals;
|
|
1247
|
+
return { kind: "mcp", argv: [action, ...(id ? [id] : []), ...(actionClass ? ["--action-class", actionClass] : [])] };
|
|
1248
|
+
},
|
|
1249
|
+
handle(command, ctx) {
|
|
1250
|
+
if (command.kind !== "mcp") return;
|
|
1251
|
+
const result = mcpCommandOutput(command.argv);
|
|
1252
|
+
ctx.notice(result.code ? "error" : "info", result.text);
|
|
1253
|
+
},
|
|
1254
|
+
},
|
|
1230
1255
|
{
|
|
1231
1256
|
name: "extensions",
|
|
1232
1257
|
description: "Inspect harness extensions or reload their commands, hooks and operator UI",
|
|
@@ -27,8 +27,8 @@ export interface CommandPositionalSpec {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
|
-
* Stable
|
|
31
|
-
*
|
|
30
|
+
* Stable names for dynamic completion sources. The presentation layer supplies
|
|
31
|
+
* read-only catalogs for available slots; unsupplied slots return no values.
|
|
32
32
|
*/
|
|
33
33
|
export const COMPLETION_SLOT_NAMES = [
|
|
34
34
|
"agents",
|
|
@@ -1,29 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*/
|
|
7
|
-
export function
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
if (
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const joined = kept.join("-");
|
|
24
|
-
leaf = joined.length > maxLeaf ? joined.slice(0, maxLeaf) : joined;
|
|
1
|
+
import { sanitizeCallTargetText } from "../../domains/safety/call-target.js";
|
|
2
|
+
import { stripTerminalSequences, truncateToWidth, visibleWidth } from "../../engine/tui.js";
|
|
3
|
+
|
|
4
|
+
const identitySegments = new Intl.Segmenter(undefined, { granularity: "grapheme" });
|
|
5
|
+
|
|
6
|
+
/** Keep both placement and the distinguishing suffix when an identity must fit. */
|
|
7
|
+
export function fitIdentityLabel(value: string, width: number): string {
|
|
8
|
+
value = sanitizeCallTargetText(value);
|
|
9
|
+
const room = Math.max(0, Math.floor(width));
|
|
10
|
+
if (visibleWidth(value) <= room) return value;
|
|
11
|
+
if (room <= 1) return room === 1 ? "…" : "";
|
|
12
|
+
const tailBudget = Math.ceil((room - 1) / 2);
|
|
13
|
+
let tail = "";
|
|
14
|
+
for (const { segment } of [...identitySegments.segment(value)].reverse()) {
|
|
15
|
+
if (visibleWidth(segment + tail) > tailBudget) break;
|
|
16
|
+
tail = segment + tail;
|
|
17
|
+
}
|
|
18
|
+
const headBudget = room - 1 - visibleWidth(tail);
|
|
19
|
+
let head = "";
|
|
20
|
+
for (const { segment } of identitySegments.segment(value)) {
|
|
21
|
+
if (visibleWidth(head + segment) > headBudget) break;
|
|
22
|
+
head += segment;
|
|
25
23
|
}
|
|
26
|
-
return
|
|
24
|
+
return `${head}…${tail}`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Compact wire identity with explicit omission and its version/quantization suffix. */
|
|
28
|
+
export function abbreviateModelId(modelId: string | null | undefined): string {
|
|
29
|
+
const value = sanitizeCallTargetText(modelId ?? "");
|
|
30
|
+
if (value.length === 0) return "model";
|
|
31
|
+
if (visibleWidth(value) <= 24) return value;
|
|
32
|
+
const slash = value.lastIndexOf("/");
|
|
33
|
+
if (slash < 0) return fitIdentityLabel(value, 24);
|
|
34
|
+
const placement = value.slice(0, slash);
|
|
35
|
+
const model = value.slice(slash + 1);
|
|
36
|
+
const modelBudget = Math.min(18, visibleWidth(model));
|
|
37
|
+
return `${fitIdentityPrefix(placement, 23 - modelBudget)}/${fitIdentityLabel(model, modelBudget)}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Raw route fields stay separate until the surface knows its terminal-cell budget. */
|
|
41
|
+
export interface TargetIdentity {
|
|
42
|
+
targetId: string | null | undefined;
|
|
43
|
+
modelId: string | null | undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function fitIdentityPrefix(value: string, width: number): string {
|
|
47
|
+
return stripTerminalSequences(truncateToWidth(value, Math.max(0, width), "…", false));
|
|
27
48
|
}
|
|
28
49
|
|
|
29
50
|
export interface TargetLabelOptions {
|
|
@@ -31,6 +52,8 @@ export interface TargetLabelOptions {
|
|
|
31
52
|
separator?: string;
|
|
32
53
|
/** Off for surfaces with room for the whole wire id. */
|
|
33
54
|
abbreviate?: boolean;
|
|
55
|
+
/** Fit raw target/model fields once, preserving family and suffix before placement. */
|
|
56
|
+
width?: number;
|
|
34
57
|
}
|
|
35
58
|
|
|
36
59
|
/**
|
|
@@ -53,12 +76,25 @@ export function formatTargetLabel(
|
|
|
53
76
|
modelId: string | null | undefined,
|
|
54
77
|
options: TargetLabelOptions = {},
|
|
55
78
|
): string {
|
|
56
|
-
const target = (targetId ?? "")
|
|
57
|
-
const model = (modelId ?? "")
|
|
58
|
-
|
|
79
|
+
const target = sanitizeCallTargetText(targetId ?? "");
|
|
80
|
+
const model = sanitizeCallTargetText(modelId ?? "");
|
|
81
|
+
const fit = (label: string): string => (options.width === undefined ? label : fitIdentityLabel(label, options.width));
|
|
82
|
+
if (target.length === 0 && model.length === 0) return fit("not configured");
|
|
83
|
+
if (options.width !== undefined && target.length > 0 && model.length > 0) {
|
|
84
|
+
const width = Math.max(0, Math.floor(options.width));
|
|
85
|
+
const separator = options.separator ?? " · ";
|
|
86
|
+
const full = `${target}${separator}${model}`;
|
|
87
|
+
if (visibleWidth(full) <= width) return full;
|
|
88
|
+
const leaf = model.slice(model.lastIndexOf("/") + 1);
|
|
89
|
+
const available = width - visibleWidth(separator);
|
|
90
|
+
if (available < 9) return fitIdentityLabel(leaf, width);
|
|
91
|
+
const modelBudget = Math.min(visibleWidth(leaf), Math.max(8, Math.ceil(available * 0.7)));
|
|
92
|
+
const targetBudget = Math.min(visibleWidth(target), available - modelBudget);
|
|
93
|
+
return `${fitIdentityPrefix(target, targetBudget)}${separator}${fitIdentityLabel(leaf, available - targetBudget)}`;
|
|
94
|
+
}
|
|
59
95
|
const shown = options.abbreviate === false ? model : abbreviateModelId(model);
|
|
60
|
-
if (target.length === 0) return `no target · ${shown}
|
|
61
|
-
if (model.length === 0) return `${target} · no model
|
|
96
|
+
if (target.length === 0) return fit(`no target · ${shown}`);
|
|
97
|
+
if (model.length === 0) return fit(`${target} · no model`);
|
|
62
98
|
return `${target}${options.separator ?? " · "}${shown}`;
|
|
63
99
|
}
|
|
64
100
|
|
|
@@ -705,6 +705,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
705
705
|
output: usage.output,
|
|
706
706
|
cacheRead: usage.cacheRead,
|
|
707
707
|
cacheWrite: usage.cacheWrite,
|
|
708
|
+
...(usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: usage.cacheWrite1h }),
|
|
708
709
|
reasoningTokens: usage.reasoning,
|
|
709
710
|
totalTokens: usage.totalTokens,
|
|
710
711
|
apiCalls: Math.max(1, Math.round(usage.apiCalls)),
|
|
@@ -78,6 +78,9 @@ export interface TurnPersistence {
|
|
|
78
78
|
* (reminder block, skill preamble, handoff, then the operator's words);
|
|
79
79
|
* `operatorText`, when it differs, is what the operator actually typed and
|
|
80
80
|
* is what a transcript replay renders under the operator marker.
|
|
81
|
+
* `displayText` is the literal editor input when an expansion (a prompt
|
|
82
|
+
* template or command) replaced it; the session picker and replay show it,
|
|
83
|
+
* while compaction keeps reasserting the expanded `operatorText`.
|
|
81
84
|
*/
|
|
82
85
|
appendSubmittedUserTurn(
|
|
83
86
|
agentRuntime: AgentRuntime,
|
|
@@ -85,6 +88,7 @@ export interface TurnPersistence {
|
|
|
85
88
|
images: ReadonlyArray<unknown> | undefined,
|
|
86
89
|
synthetic: boolean,
|
|
87
90
|
operatorText?: string,
|
|
91
|
+
displayText?: string,
|
|
88
92
|
): string | null;
|
|
89
93
|
appendRetryStatus(status: RetryStatusPayload): void;
|
|
90
94
|
appendModelChangeEntry(target: ChatLoopTarget): void;
|
|
@@ -213,6 +217,9 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
|
|
|
213
217
|
outputTokens: total.outputTokens + summary.output,
|
|
214
218
|
cacheReadTokens: total.cacheReadTokens + summary.cacheRead,
|
|
215
219
|
cacheWriteTokens: total.cacheWriteTokens + summary.cacheWrite,
|
|
220
|
+
...(total.cacheWrite1hTokens === undefined && summary.cacheWrite1h === undefined
|
|
221
|
+
? {}
|
|
222
|
+
: { cacheWrite1hTokens: (total.cacheWrite1hTokens ?? 0) + (summary.cacheWrite1h ?? 0) }),
|
|
216
223
|
reasoningTokens: total.reasoningTokens + summary.reasoning,
|
|
217
224
|
totalTokens: total.totalTokens + summary.tokens,
|
|
218
225
|
costUsd: (total.costUsd ?? 0) + summary.costUsd,
|
|
@@ -401,7 +408,7 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
|
|
|
401
408
|
finishTracedTurn("success", null);
|
|
402
409
|
},
|
|
403
410
|
|
|
404
|
-
appendSubmittedUserTurn(agentRuntime, text, images, synthetic, operatorText): string | null {
|
|
411
|
+
appendSubmittedUserTurn(agentRuntime, text, images, synthetic, operatorText, displayText): string | null {
|
|
405
412
|
if (!deps.session) return null;
|
|
406
413
|
if (!deps.session.current()) {
|
|
407
414
|
deps.session.create({
|
|
@@ -412,6 +419,7 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
|
|
|
412
419
|
}
|
|
413
420
|
const payload: Record<string, unknown> = images ? { content: [{ type: "text", text }, ...images] } : { text };
|
|
414
421
|
if (operatorText !== undefined && operatorText !== text) payload.operatorText = operatorText;
|
|
422
|
+
if (displayText !== undefined && displayText !== (operatorText ?? text)) payload.displayText = displayText;
|
|
415
423
|
if (synthetic) {
|
|
416
424
|
payload.synthetic = true;
|
|
417
425
|
payload.source = "middleware_request_continuation";
|
|
@@ -10,10 +10,16 @@
|
|
|
10
10
|
* nobody watching.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
import { createHash } from "node:crypto";
|
|
13
14
|
import { BusChannels } from "../core/bus-events.js";
|
|
14
15
|
import type { ClioSettings } from "../core/config.js";
|
|
15
16
|
import type { SafeEventBus } from "../core/event-bus.js";
|
|
16
|
-
import
|
|
17
|
+
import { endpointCapacityUsage } from "../domains/dispatch/index.js";
|
|
18
|
+
import {
|
|
19
|
+
type CacheDeploymentObservation,
|
|
20
|
+
observeCacheDeployment,
|
|
21
|
+
type ProvidersContract,
|
|
22
|
+
} from "../domains/providers/index.js";
|
|
17
23
|
import type { SessionContract } from "../domains/session/contract.js";
|
|
18
24
|
import type { Usage } from "../engine/types.js";
|
|
19
25
|
import { type PrewarmTrigger, prewarmPromptTokens, runPrewarmRound } from "./prewarm.js";
|
|
@@ -28,9 +34,14 @@ export type PrewarmSkipReason =
|
|
|
28
34
|
| "dispatch-active"
|
|
29
35
|
| "tier"
|
|
30
36
|
| "unresolved"
|
|
37
|
+
| "deployment"
|
|
38
|
+
| "cooldown"
|
|
39
|
+
| "expired"
|
|
31
40
|
| "superseded";
|
|
32
41
|
|
|
33
|
-
export type PrewarmOutcome =
|
|
42
|
+
export type PrewarmOutcome =
|
|
43
|
+
| { ran: true; trigger: PrewarmTrigger }
|
|
44
|
+
| { ran: false; reason: PrewarmSkipReason; detail?: string };
|
|
34
45
|
|
|
35
46
|
export interface TurnPrewarmDeps {
|
|
36
47
|
state: ChatTurnState;
|
|
@@ -78,6 +89,7 @@ export interface TurnPrewarmDeps {
|
|
|
78
89
|
registerEndpointSlot?: (runtime: AgentRuntime) => (() => void) | null;
|
|
79
90
|
/** Test seam. Production uses the real provider round. */
|
|
80
91
|
runPrewarm?: typeof runPrewarmRound;
|
|
92
|
+
observeDeployment?: typeof observeCacheDeployment;
|
|
81
93
|
/**
|
|
82
94
|
* Whether a submit aborts the round's request. Defaults to the measured
|
|
83
95
|
* backend behavior; see {@link ABORT_ROUND_ON_SUBMIT}.
|
|
@@ -127,6 +139,13 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
|
|
|
127
139
|
let pendingTrigger: PrewarmTrigger | null = null;
|
|
128
140
|
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
129
141
|
let active: AbortController | null = null;
|
|
142
|
+
// Ownership outlives detachment: one request and at most one newer trigger.
|
|
143
|
+
let running: AbortController | null = null;
|
|
144
|
+
let disposed = false;
|
|
145
|
+
let pendingSince = 0;
|
|
146
|
+
let lastFinished = 0;
|
|
147
|
+
let lastPrefix: string | null = null;
|
|
148
|
+
let lastSkip: string | null = null;
|
|
130
149
|
// Rounds a submit or a session switch let go of. Their result is still
|
|
131
150
|
// recorded, but it no longer describes the prefix the next turn will send, so
|
|
132
151
|
// it never reaches the `/context` line.
|
|
@@ -167,13 +186,33 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
|
|
|
167
186
|
// notice from either.
|
|
168
187
|
const targetId = deps.getSettings().chat?.target?.trim();
|
|
169
188
|
const runtimeId = targetId ? deps.providers.getTarget(targetId)?.runtime : undefined;
|
|
170
|
-
if (
|
|
189
|
+
if (
|
|
190
|
+
runtimeId === undefined ||
|
|
191
|
+
(deps.providers.getRuntime(runtimeId)?.tier !== "local-native" &&
|
|
192
|
+
!(runtimeId === "litellm" && targetId && deps.providers.getTarget(targetId)?.cache?.deployment))
|
|
193
|
+
)
|
|
194
|
+
return "tier";
|
|
171
195
|
return null;
|
|
172
196
|
};
|
|
173
197
|
|
|
174
198
|
const runOnce = async (trigger: PrewarmTrigger, controller: AbortController): Promise<PrewarmOutcome> => {
|
|
175
199
|
const refusal = admissionRefusal();
|
|
176
200
|
if (refusal) return { ran: false, reason: refusal };
|
|
201
|
+
const targetId = deps.getSettings().chat.target;
|
|
202
|
+
const target = targetId ? deps.providers.getTarget(targetId) : null;
|
|
203
|
+
if (!target) return { ran: false, reason: "unresolved" };
|
|
204
|
+
const targetSettings = JSON.stringify(target);
|
|
205
|
+
const started = Date.now();
|
|
206
|
+
if (target.cache?.retention === "none") return { ran: false, reason: "disabled" };
|
|
207
|
+
if (target.pricing && Object.values(target.pricing).some((rate) => rate > 0))
|
|
208
|
+
return { ran: false, reason: "deployment", detail: "paid-warming-disabled" };
|
|
209
|
+
const cooldown = Math.max(1000, target.cache?.warm?.cooldownMs ?? 60000);
|
|
210
|
+
if (Date.now() - lastFinished < cooldown) return { ran: false, reason: "cooldown" };
|
|
211
|
+
const observe = deps.observeDeployment ?? observeCacheDeployment;
|
|
212
|
+
let deployment: CacheDeploymentObservation = await observe(target, deps.getSettings().chat.model ?? "", {
|
|
213
|
+
signal: controller.signal,
|
|
214
|
+
});
|
|
215
|
+
if (deployment.warm !== "bounded") return { ran: false, reason: "deployment", detail: deployment.reason };
|
|
177
216
|
|
|
178
217
|
const prepared = await deps.prepareRuntime(controller.signal);
|
|
179
218
|
if (!prepared.ok) return { ran: false, reason: "unresolved" };
|
|
@@ -194,15 +233,48 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
|
|
|
194
233
|
const lateRefusal = admissionRefusal();
|
|
195
234
|
if (lateRefusal) return { ran: false, reason: lateRefusal };
|
|
196
235
|
if (detached.has(controller) || controller.signal.aborted) return { ran: false, reason: "superseded" };
|
|
236
|
+
// Binding/residency can change during preparation. Discovery itself never
|
|
237
|
+
// loads models and missing evidence leaves ordinary inference untouched.
|
|
238
|
+
deployment = await observe(target, runtime.wireModelId, { signal: controller.signal });
|
|
239
|
+
if (deployment.warm !== "bounded") return { ran: false, reason: "deployment", detail: deployment.reason };
|
|
240
|
+
const finalRefusal = admissionRefusal();
|
|
241
|
+
if (finalRefusal) return { ran: false, reason: finalRefusal };
|
|
242
|
+
if (
|
|
243
|
+
detached.has(controller) ||
|
|
244
|
+
controller.signal.aborted ||
|
|
245
|
+
JSON.stringify(deps.providers.getTarget(target.id)) !== targetSettings
|
|
246
|
+
)
|
|
247
|
+
return { ran: false, reason: "superseded" };
|
|
248
|
+
if (Date.now() - started > 30000) return { ran: false, reason: "expired" };
|
|
249
|
+
// This includes shared dispatch leases/reservations and this process's
|
|
250
|
+
// foreground streams. It is a fresh check, not an atomic global warm lease;
|
|
251
|
+
// server slot observations above also include unrelated active traffic.
|
|
252
|
+
if (deployment.endpoint && (endpointCapacityUsage()[deployment.endpoint] ?? 0) > 0)
|
|
253
|
+
return { ran: false, reason: "dispatch-active" };
|
|
254
|
+
const prefix = createHash("sha256")
|
|
255
|
+
.update(
|
|
256
|
+
JSON.stringify({
|
|
257
|
+
model: runtime.agent.state.model,
|
|
258
|
+
system: runtime.agent.state.systemPrompt,
|
|
259
|
+
messages: runtime.agent.state.messages,
|
|
260
|
+
tools: runtime.agent.state.tools,
|
|
261
|
+
thinking: runtime.agent.state.thinkingLevel,
|
|
262
|
+
}),
|
|
263
|
+
)
|
|
264
|
+
.digest("hex");
|
|
265
|
+
if (prefix === lastPrefix && Date.now() - lastFinished < Math.max(cooldown, 60000))
|
|
266
|
+
return { ran: false, reason: "cooldown" };
|
|
197
267
|
|
|
198
268
|
// The claim is taken before the request goes out and released in the
|
|
199
269
|
// finally, including on the detach path, because the request the server is
|
|
200
270
|
// still finishing is the one occupying the slot.
|
|
201
271
|
const releaseEndpointSlot = deps.registerEndpointSlot?.(runtime) ?? null;
|
|
202
272
|
let result: Awaited<ReturnType<typeof round>>;
|
|
273
|
+
const deadline = setTimeout(() => controller.abort(), Math.min(target.cache?.warm?.maxDurationMs ?? 30000, 120000));
|
|
203
274
|
try {
|
|
204
275
|
result = await round({
|
|
205
276
|
model: runtime.agent.state.model,
|
|
277
|
+
agent: runtime.agent,
|
|
206
278
|
state: {
|
|
207
279
|
systemPrompt: runtime.agent.state.systemPrompt,
|
|
208
280
|
messages: runtime.agent.state.messages,
|
|
@@ -211,10 +283,14 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
|
|
|
211
283
|
},
|
|
212
284
|
...(prepared.apiKey !== undefined ? { apiKey: prepared.apiKey } : {}),
|
|
213
285
|
signal: controller.signal,
|
|
286
|
+
maxInputTokens: target.cache?.warm?.maxInputTokens ?? 8192,
|
|
214
287
|
});
|
|
215
288
|
} finally {
|
|
289
|
+
clearTimeout(deadline);
|
|
290
|
+
lastFinished = Date.now();
|
|
216
291
|
releaseEndpointSlot?.();
|
|
217
292
|
}
|
|
293
|
+
lastPrefix = result.aborted || result.errorMessage ? null : prefix;
|
|
218
294
|
|
|
219
295
|
// The prefill the server did is spend whatever the operator did next, so a
|
|
220
296
|
// let-go round is recorded exactly like a completed one. Only the
|
|
@@ -223,7 +299,7 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
|
|
|
223
299
|
// prefix.
|
|
224
300
|
const wasDetached = detached.has(controller) || controller.signal.aborted;
|
|
225
301
|
const promptTokens = prewarmPromptTokens(result);
|
|
226
|
-
if (!wasDetached) {
|
|
302
|
+
if (!wasDetached && !result.errorMessage) {
|
|
227
303
|
deps.context.notePrewarm({
|
|
228
304
|
tokens: promptTokens,
|
|
229
305
|
ms: result.timing.apiMs,
|
|
@@ -242,6 +318,7 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
|
|
|
242
318
|
parentTurnId: deps.state.lastTurnId,
|
|
243
319
|
data: {
|
|
244
320
|
trigger,
|
|
321
|
+
deployment,
|
|
245
322
|
target: runtime.targetId,
|
|
246
323
|
model: runtime.wireModelId,
|
|
247
324
|
promptTokens,
|
|
@@ -249,9 +326,10 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
|
|
|
249
326
|
detached: wasDetached,
|
|
250
327
|
timing: result.timing,
|
|
251
328
|
promptCache: {
|
|
252
|
-
input: result.usage?.input ??
|
|
253
|
-
cacheRead: result.usage?.cacheRead ??
|
|
254
|
-
cacheWrite: result.usage?.cacheWrite ??
|
|
329
|
+
input: result.usage?.input ?? null,
|
|
330
|
+
cacheRead: result.usage?.cacheRead ?? null,
|
|
331
|
+
cacheWrite: result.usage?.cacheWrite ?? null,
|
|
332
|
+
...(result.usage?.cacheWrite1h === undefined ? {} : { cacheWrite1h: result.usage.cacheWrite1h }),
|
|
255
333
|
...(result.backend ? { backend: { ...result.backend } } : {}),
|
|
256
334
|
},
|
|
257
335
|
...(result.errorMessage ? { error: result.errorMessage } : {}),
|
|
@@ -279,28 +357,55 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
|
|
|
279
357
|
|
|
280
358
|
const fire = (): void => {
|
|
281
359
|
timer = null;
|
|
360
|
+
if (disposed || running !== null) return;
|
|
282
361
|
const trigger = pendingTrigger;
|
|
283
362
|
pendingTrigger = null;
|
|
284
363
|
if (trigger === null) return;
|
|
285
364
|
const controller = new AbortController();
|
|
286
365
|
active = controller;
|
|
287
|
-
|
|
288
|
-
inFlight =
|
|
289
|
-
.
|
|
290
|
-
|
|
366
|
+
running = controller;
|
|
367
|
+
inFlight = (
|
|
368
|
+
Date.now() - pendingSince > 30000
|
|
369
|
+
? Promise.resolve<PrewarmOutcome>({ ran: false, reason: "expired" })
|
|
370
|
+
: runOnce(trigger, controller)
|
|
371
|
+
)
|
|
372
|
+
.then((outcome) => {
|
|
373
|
+
if (!outcome.ran && deps.getSettings().chat.prewarm && outcome.reason !== "surface") {
|
|
374
|
+
const key = `${outcome.reason}:${outcome.detail ?? ""}`;
|
|
375
|
+
if (lastSkip !== key) {
|
|
376
|
+
lastSkip = key;
|
|
377
|
+
try {
|
|
378
|
+
deps.session?.appendEntry({
|
|
379
|
+
kind: "custom",
|
|
380
|
+
customType: "prewarmSkipped",
|
|
381
|
+
display: false,
|
|
382
|
+
parentTurnId: deps.state.lastTurnId,
|
|
383
|
+
data: { trigger, ...outcome },
|
|
384
|
+
});
|
|
385
|
+
} catch {
|
|
386
|
+
/* Optional diagnostics. */
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
} else if (outcome.ran) lastSkip = null;
|
|
390
|
+
return outcome;
|
|
391
|
+
})
|
|
291
392
|
.catch(() => null)
|
|
292
393
|
.finally(() => {
|
|
293
394
|
if (active === controller) active = null;
|
|
395
|
+
running = null;
|
|
396
|
+
if (!disposed && pendingTrigger !== null && timer === null) timer = setTimeout(fire, 0);
|
|
294
397
|
});
|
|
295
398
|
};
|
|
296
399
|
|
|
297
400
|
return {
|
|
298
401
|
schedule(trigger: PrewarmTrigger): void {
|
|
402
|
+
if (disposed) return;
|
|
299
403
|
// A newer trigger describes a newer prefix; the older round is no longer
|
|
300
404
|
// warming history this session has.
|
|
301
405
|
releaseActiveRound();
|
|
302
406
|
pendingTrigger = trigger;
|
|
303
|
-
|
|
407
|
+
pendingSince = Date.now();
|
|
408
|
+
if (timer !== null || running !== null) return;
|
|
304
409
|
// Ref'd on purpose, same reasoning as `settled()` below: the timer is due
|
|
305
410
|
// in 0 ms, so it holds the event loop for one tick at most, and a Node 22
|
|
306
411
|
// loop that drains past a due unref'd timer would otherwise never start
|
|
@@ -317,7 +422,7 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
|
|
|
317
422
|
releaseActiveRound();
|
|
318
423
|
},
|
|
319
424
|
|
|
320
|
-
settled(): Promise<PrewarmOutcome | null> {
|
|
425
|
+
async settled(): Promise<PrewarmOutcome | null> {
|
|
321
426
|
// One hop past the scheduling tick so a caller that just scheduled a
|
|
322
427
|
// round waits for that round rather than for the previous one. The timer
|
|
323
428
|
// is deliberately ref'd, unlike the scheduling timer above: the caller is
|
|
@@ -327,14 +432,16 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
|
|
|
327
432
|
// pending forever and cancelled every later test in the lane; Node 24
|
|
328
433
|
// happens to fire the due timer first, which is why the hang never
|
|
329
434
|
// reproduced on a 24.x development machine.
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
});
|
|
435
|
+
let outcome: PrewarmOutcome | null;
|
|
436
|
+
do {
|
|
437
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 0));
|
|
438
|
+
outcome = await inFlight;
|
|
439
|
+
} while (timer !== null || running !== null || pendingTrigger !== null);
|
|
440
|
+
return outcome;
|
|
335
441
|
},
|
|
336
442
|
|
|
337
443
|
dispose(): void {
|
|
444
|
+
disposed = true;
|
|
338
445
|
for (const unsubscribe of unsubscribeDispatch) unsubscribe?.();
|
|
339
446
|
pendingTrigger = null;
|
|
340
447
|
if (timer !== null) {
|
|
@@ -343,7 +450,7 @@ export function createTurnPrewarm(deps: TurnPrewarmDeps): TurnPrewarm {
|
|
|
343
450
|
}
|
|
344
451
|
// Shutdown always aborts: the process is going away, and a socket held
|
|
345
452
|
// open for a round nobody will read is not a latency question.
|
|
346
|
-
|
|
453
|
+
running?.abort();
|
|
347
454
|
active = null;
|
|
348
455
|
},
|
|
349
456
|
};
|
|
@@ -275,7 +275,8 @@ export function createTurnRecovery(deps: TurnRecoveryDeps): TurnRecovery {
|
|
|
275
275
|
maxAttempts: settings.maxRetries,
|
|
276
276
|
errorMessage: message,
|
|
277
277
|
});
|
|
278
|
-
|
|
278
|
+
// The exhausted status already exposes this failure and retains its full
|
|
279
|
+
// diagnostic. A second raw notice bypasses bounded error presentation.
|
|
279
280
|
pruneFailedAssistantFromContext(agentRuntime.agent);
|
|
280
281
|
return true;
|
|
281
282
|
}
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
import type { RetrySettings } from "../domains/session/retry.js";
|
|
26
26
|
import type { createEngineAgent } from "../engine/agent.js";
|
|
27
27
|
import { cleanupEngineSessionResources } from "../engine/ai.js";
|
|
28
|
+
import { setGlobalDefaultMaxOutputTokens } from "../engine/apis/index.js";
|
|
28
29
|
import { sanitizeLockedSynthesisMessage } from "../engine/loop-guard.js";
|
|
29
30
|
import {
|
|
30
31
|
patchProviderThinkingPayload,
|
|
@@ -380,9 +381,17 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
380
381
|
);
|
|
381
382
|
};
|
|
382
383
|
|
|
384
|
+
// A target id/model names the selection, not its current URL, auth, pricing
|
|
385
|
+
// or cache policy. Keep the constructed descriptor identity across calls.
|
|
386
|
+
let runtimeTargetSettings: string | null = null;
|
|
383
387
|
const ensureRuntime = (): AgentRuntime | null => {
|
|
384
388
|
const target = readTarget();
|
|
385
389
|
if (!target) return null;
|
|
390
|
+
const targetSettings = JSON.stringify(target.target);
|
|
391
|
+
const sameTargetSettings = runtimeTargetSettings === targetSettings;
|
|
392
|
+
// Preflight and the wire budget share the session's effective settings,
|
|
393
|
+
// including overrides that never reach the saved providers snapshot.
|
|
394
|
+
setGlobalDefaultMaxOutputTokens(deps.getSettings().chat.maxOutputTokens);
|
|
386
395
|
context.emitContextWindowWarningTransition(target.runtimeResolution?.contextWindowDetails?.warning ?? null);
|
|
387
396
|
if (!deps.knownTargets().has(target.target.id)) {
|
|
388
397
|
throw new TurnAdmissionError(
|
|
@@ -394,6 +403,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
394
403
|
state.runtime &&
|
|
395
404
|
state.runtime.targetId === target.target.id &&
|
|
396
405
|
state.runtime.runtimeId === target.runtime.id &&
|
|
406
|
+
sameTargetSettings &&
|
|
397
407
|
state.runtime.wireModelId === target.wireModelId
|
|
398
408
|
) {
|
|
399
409
|
// Same target+runtime+model. Settings may still have moved
|
|
@@ -427,6 +437,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
427
437
|
state.runtime &&
|
|
428
438
|
state.runtime.targetId === target.target.id &&
|
|
429
439
|
state.runtime.runtimeId === target.runtime.id &&
|
|
440
|
+
sameTargetSettings &&
|
|
430
441
|
state.runtime.wireModelId !== target.wireModelId
|
|
431
442
|
) {
|
|
432
443
|
const nextModel = synthesizeModel(target);
|
|
@@ -472,6 +483,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
472
483
|
maxRetryDelayMs: deps.retrySettings().maxDelayMs,
|
|
473
484
|
...(gatewaySessionId ? { sessionId: gatewaySessionId } : {}),
|
|
474
485
|
onStreamInvocation: () => {
|
|
486
|
+
setGlobalDefaultMaxOutputTokens(deps.getSettings().chat.maxOutputTokens);
|
|
475
487
|
apiCallStartedAt = performance.now();
|
|
476
488
|
apiCallFirstDeltaAt = null;
|
|
477
489
|
},
|
|
@@ -559,20 +571,30 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
559
571
|
stallTimer = setTimeout(
|
|
560
572
|
() => {
|
|
561
573
|
stallTimer = null;
|
|
562
|
-
const
|
|
574
|
+
const retry = deps.retrySettings();
|
|
563
575
|
// Zero disables the escalation; an operator who wants a stream to
|
|
564
576
|
// hang forever keeps that by setting `retry.streamStallMs: 0`.
|
|
565
|
-
if (
|
|
577
|
+
if (retry.streamStallMs <= 0) return;
|
|
566
578
|
if (stallSuspendDepth > 0 || toolsInFlight > 0) {
|
|
567
|
-
armStallTimer(
|
|
579
|
+
armStallTimer(retry.streamStallMs);
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
// Silence before a call's first delta is not silence mid-stream. A
|
|
583
|
+
// local server that slept reloads the model and prefills cold before
|
|
584
|
+
// it can emit anything, which is minutes of healthy quiet; a stream
|
|
585
|
+
// that already produced output and stops is a wedged slot.
|
|
586
|
+
const awaitingFirstToken = apiCallStartedAt !== null && apiCallFirstDeltaAt === null;
|
|
587
|
+
if (awaitingFirstToken && retry.firstTokenStallMs <= 0) {
|
|
588
|
+
armStallTimer(retry.streamStallMs);
|
|
568
589
|
return;
|
|
569
590
|
}
|
|
591
|
+
const stallMs = awaitingFirstToken ? Math.max(retry.firstTokenStallMs, retry.streamStallMs) : retry.streamStallMs;
|
|
570
592
|
const idleMs = performance.now() - lastActivityAt;
|
|
571
593
|
if (idleMs < stallMs) {
|
|
572
594
|
armStallTimer(stallMs - idleMs);
|
|
573
595
|
return;
|
|
574
596
|
}
|
|
575
|
-
state.streamStallReason = `stream stalled: no output from ${localRuntime.targetId} for ${Math.round(idleMs / 1000)}s, aborting (stream timeout)`;
|
|
597
|
+
state.streamStallReason = `stream stalled: no ${awaitingFirstToken ? "first token" : "output"} from ${localRuntime.targetId} for ${Math.round(idleMs / 1000)}s, aborting (stream timeout)`;
|
|
576
598
|
localRuntime.agent.abort();
|
|
577
599
|
},
|
|
578
600
|
Math.max(1, delayMs),
|
|
@@ -755,7 +777,14 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
755
777
|
typeof assistantEvent.delta === "string" &&
|
|
756
778
|
assistantEvent.delta.length > 0);
|
|
757
779
|
if (hasDelta && firstAssistantDeltaAt === null) firstAssistantDeltaAt = eventClock;
|
|
758
|
-
if (hasDelta && apiCallFirstDeltaAt === null)
|
|
780
|
+
if (hasDelta && apiCallFirstDeltaAt === null) {
|
|
781
|
+
apiCallFirstDeltaAt = eventClock;
|
|
782
|
+
// The timer may be armed for the longer first-token window; the
|
|
783
|
+
// stream is live now, so the mid-stream window applies from here.
|
|
784
|
+
const stallMs = deps.retrySettings().streamStallMs;
|
|
785
|
+
clearStallTimer();
|
|
786
|
+
if (stallMs > 0) armStallTimer(stallMs);
|
|
787
|
+
}
|
|
759
788
|
}
|
|
760
789
|
if (enrichedEvent.type === "agent_end") {
|
|
761
790
|
context.noteRunCacheSummary(enrichedEvent.messages, runFirstCallVerdict);
|
|
@@ -777,6 +806,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
777
806
|
output: summary.output,
|
|
778
807
|
cacheRead: summary.cacheRead,
|
|
779
808
|
cacheWrite: summary.cacheWrite,
|
|
809
|
+
...(summary.cacheWrite1h === undefined ? {} : { cacheWrite1h: summary.cacheWrite1h }),
|
|
780
810
|
reasoningTokens: summary.reasoning,
|
|
781
811
|
totalTokens: summary.tokens,
|
|
782
812
|
apiCalls: summary.apiCalls,
|
|
@@ -911,6 +941,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
911
941
|
});
|
|
912
942
|
|
|
913
943
|
state.runtime = localRuntime;
|
|
944
|
+
runtimeTargetSettings = targetSettings;
|
|
914
945
|
// Append a modelChange marker only when this rebuild replaces a prior
|
|
915
946
|
// runtime, which is the cross-target swap case (mid-session change of
|
|
916
947
|
// target or runtime id). On the initial build, the session header's
|
|
@@ -1125,11 +1125,12 @@ export class WorkspaceArtifactProvider implements ArtifactProvider {
|
|
|
1125
1125
|
{
|
|
1126
1126
|
id: `workspace:${path}`,
|
|
1127
1127
|
category: this.category,
|
|
1128
|
-
title: safeTitle(`${
|
|
1128
|
+
title: safeTitle(`${basename(path)} · ${relative(workspace, path)} · ${artifact.tool}${kind}`, basename(path)),
|
|
1129
1129
|
timestamp: parseTime(artifact.timestamp),
|
|
1130
1130
|
sizeBytes: maybeSizeBytes(path),
|
|
1131
1131
|
path,
|
|
1132
|
-
description: `${artifact.tool}${kind} · ${overwriteLabel}`,
|
|
1132
|
+
description: `${artifact.tool}${kind} · ${overwriteLabel} · Workspace: ${workspace} · Turn: ${artifact.turnId}`,
|
|
1133
|
+
...(this.deps.sessionMeta ? { sessionId: this.deps.sessionMeta.id } : {}),
|
|
1133
1134
|
toolName: artifact.tool,
|
|
1134
1135
|
searchText: [
|
|
1135
1136
|
artifact.path,
|