@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
|
@@ -46,6 +46,7 @@ import { WORKER_RUNTIME_MEDIATES_CLIO_DISPATCH } from "../../engine/worker-runti
|
|
|
46
46
|
import { toolPromptHintsForNames } from "../../tools/builtin-tool-catalog.js";
|
|
47
47
|
import { networkToolsDisabled } from "../../tools/network-policy.js";
|
|
48
48
|
import { applyToolProfile, assertToolProfileEnforceable, type ToolProfileName } from "../../tools/profiles.js";
|
|
49
|
+
import { withGatewayForCapabilities } from "../../tools/surface.js";
|
|
49
50
|
import {
|
|
50
51
|
applyTaskWorktree,
|
|
51
52
|
cleanupTaskWorktree,
|
|
@@ -1692,12 +1693,19 @@ function effectiveToolNames(
|
|
|
1692
1693
|
(tool): tool is ToolName =>
|
|
1693
1694
|
(isBuiltinToolName(tool) || harnessTools.has(tool)) &&
|
|
1694
1695
|
tool !== ToolNames.AskUser &&
|
|
1695
|
-
!(networkStripped && tool === ToolNames.WebFetch) &&
|
|
1696
|
+
!(networkStripped && (tool === ToolNames.WebFetch || tool === ToolNames.WebRead)) &&
|
|
1696
1697
|
!denied.has(tool) &&
|
|
1697
1698
|
!(writeConfined && WRITE_ROOT_REFUSED_TOOLS.has(tool)) &&
|
|
1698
1699
|
(target.runtime.id !== "claude-sdk" || isClaudeCanonicalTool(tool)),
|
|
1699
1700
|
);
|
|
1700
|
-
|
|
1701
|
+
// A native worker reaches a gateway-placed capability (git, web_fetch, an
|
|
1702
|
+
// extension command) through the attached `gateway` tool, so the admitted
|
|
1703
|
+
// list gains `gateway` whenever it names one. The worker's own narrowing
|
|
1704
|
+
// (tools/agent-tools.ts effectiveToolNames) applies the same rule, which is
|
|
1705
|
+
// what keeps the approved tool signature equal to the attested one.
|
|
1706
|
+
const mediated = target.runtime.kind === "http" && target.runtime.id !== "claude-sdk";
|
|
1707
|
+
const surface = mediated ? withGatewayForCapabilities(names) : [...new Set(names)];
|
|
1708
|
+
return surface.sort();
|
|
1701
1709
|
}
|
|
1702
1710
|
|
|
1703
1711
|
/**
|
|
@@ -1716,13 +1724,23 @@ function assertPostRuntimeToolCompatibility(
|
|
|
1716
1724
|
spec: ReturnType<typeof normalizeAgentSpec>,
|
|
1717
1725
|
effectiveTools: ReadonlyArray<ToolName>,
|
|
1718
1726
|
target: ResolvedTarget,
|
|
1727
|
+
writeConfined: boolean,
|
|
1719
1728
|
): void {
|
|
1720
1729
|
const compatibility = resolveAgentToolCompatibility(spec, effectiveTools, {
|
|
1721
1730
|
mediatesDispatch: WORKER_RUNTIME_MEDIATES_CLIO_DISPATCH,
|
|
1722
1731
|
});
|
|
1723
1732
|
if (compatibility.compatible) return;
|
|
1733
|
+
// Name the narrowing that removed the tool: blaming the runtime sends the
|
|
1734
|
+
// caller to another model when its own write roots caused the refusal.
|
|
1735
|
+
const confined = writeConfined
|
|
1736
|
+
? compatibility.missingRequired.filter((tool) => WRITE_ROOT_REFUSED_TOOLS.has(tool))
|
|
1737
|
+
: [];
|
|
1738
|
+
const cause =
|
|
1739
|
+
confined.length > 0
|
|
1740
|
+
? `; declared write roots remove ${confined.join(", ")}, so omit write roots (use autonomy: "read-only" or worktree: true) for this agent`
|
|
1741
|
+
: "";
|
|
1724
1742
|
throw new Error(
|
|
1725
|
-
`dispatch: admission denied: agent '${agentId}' is incompatible with runtime '${target.runtime.id}' after tool narrowing; missing required tools: ${compatibility.missingRequired.join(", ")}`,
|
|
1743
|
+
`dispatch: admission denied: agent '${agentId}' is incompatible with runtime '${target.runtime.id}' after tool narrowing; missing required tools: ${compatibility.missingRequired.join(", ")}${cause}`,
|
|
1726
1744
|
);
|
|
1727
1745
|
}
|
|
1728
1746
|
|
|
@@ -2875,11 +2893,30 @@ export function createDispatchBundle(
|
|
|
2875
2893
|
rootRunId: string;
|
|
2876
2894
|
terminalCandidate: RunReceipt;
|
|
2877
2895
|
timer: ReturnType<typeof setTimeout>;
|
|
2896
|
+
settleCanceled: () => void;
|
|
2878
2897
|
}
|
|
2879
2898
|
const retryQueue = new Map<string, RetryQueueEntry>();
|
|
2880
2899
|
const retryBackoff = new Map<string, BackoffState>();
|
|
2881
2900
|
const retryReasons = new Map<string, string>();
|
|
2882
2901
|
const assignmentRootsByAttempt = new Map<string, string>();
|
|
2902
|
+
// Fleet lineage is shared ancestry, not control ownership. Keep each
|
|
2903
|
+
// member's retry chain distinct without changing persisted lineage.
|
|
2904
|
+
const controlRootsByAttempt = new Map<string, string>();
|
|
2905
|
+
const controlAttempts = new Map<string, { lineage: RunLineage; reservation: DispatchRequest["reservation"] }>();
|
|
2906
|
+
const canceledControlRoots = new Set<string>();
|
|
2907
|
+
const memberWork = new Map<string, Set<Promise<unknown>>>();
|
|
2908
|
+
function trackMemberWork(runId: string, operation: Promise<unknown>): void {
|
|
2909
|
+
const root = controlRootsByAttempt.get(runId) ?? runId;
|
|
2910
|
+
const work = memberWork.get(root) ?? new Set<Promise<unknown>>();
|
|
2911
|
+
memberWork.set(root, work);
|
|
2912
|
+
work.add(operation);
|
|
2913
|
+
const settled = (): void => {
|
|
2914
|
+
work.delete(operation);
|
|
2915
|
+
if (work.size === 0) memberWork.delete(root);
|
|
2916
|
+
};
|
|
2917
|
+
operation.then(settled, settled);
|
|
2918
|
+
}
|
|
2919
|
+
|
|
2883
2920
|
const assignments = new AssignmentRegistry({
|
|
2884
2921
|
onStreamError: (error) => reportDispatchDiagnostic("assignment event stream", error),
|
|
2885
2922
|
});
|
|
@@ -2911,6 +2948,20 @@ export function createDispatchBundle(
|
|
|
2911
2948
|
function lineageFor(req: DispatchRequest, runId: string): RunLineage {
|
|
2912
2949
|
const lineage = req.lineage ? { ...req.lineage } : { parentRunId: null, rootRunId: runId, attempt: 0, depth: 0 };
|
|
2913
2950
|
assignmentRootsByAttempt.set(runId, lineage.rootRunId);
|
|
2951
|
+
const parent = lineage.parentRunId === null ? undefined : controlAttempts.get(lineage.parentRunId);
|
|
2952
|
+
// Repair ordinals and fleet ancestry do not establish a retry. Only a
|
|
2953
|
+
// known consecutive attempt of the same reservation member can do so.
|
|
2954
|
+
const continuesParent =
|
|
2955
|
+
parent !== undefined &&
|
|
2956
|
+
parent.lineage.rootRunId === lineage.rootRunId &&
|
|
2957
|
+
parent.lineage.depth === lineage.depth &&
|
|
2958
|
+
parent.lineage.attempt + 1 === lineage.attempt &&
|
|
2959
|
+
parent.reservation?.ownerId === req.reservation?.ownerId &&
|
|
2960
|
+
parent.reservation?.memberId === req.reservation?.memberId;
|
|
2961
|
+
const priorControl =
|
|
2962
|
+
continuesParent && lineage.parentRunId !== null ? controlRootsByAttempt.get(lineage.parentRunId) : undefined;
|
|
2963
|
+
controlRootsByAttempt.set(runId, priorControl ?? runId);
|
|
2964
|
+
controlAttempts.set(runId, { lineage, reservation: req.reservation });
|
|
2914
2965
|
return lineage;
|
|
2915
2966
|
}
|
|
2916
2967
|
|
|
@@ -2977,7 +3028,8 @@ export function createDispatchBundle(
|
|
|
2977
3028
|
|
|
2978
3029
|
/** A reserved plan member owns its retry chain independently of the shared fleet root assignment. */
|
|
2979
3030
|
function retryChainIsLive(run: ActiveRun): boolean {
|
|
2980
|
-
if (run.aborted)
|
|
3031
|
+
if (run.aborted || canceledControlRoots.has(controlRootsByAttempt.get(run.runId) ?? run.lineage.rootRunId))
|
|
3032
|
+
return false;
|
|
2981
3033
|
const reservation = run.req.reservation;
|
|
2982
3034
|
if (reservation === undefined) return assignments.get(run.lineage.rootRunId)?.status === "running";
|
|
2983
3035
|
try {
|
|
@@ -3061,9 +3113,18 @@ export function createDispatchBundle(
|
|
|
3061
3113
|
const attempt = run.lineage.attempt + 1;
|
|
3062
3114
|
const reason = detail !== null ? `${outcome}: ${detail}` : outcome;
|
|
3063
3115
|
const dueAt = now() + delayMs;
|
|
3116
|
+
let settleCanceled!: () => void;
|
|
3117
|
+
let rejectContinuation!: (error: unknown) => void;
|
|
3118
|
+
const continuation = new Promise<void>((resolve, reject) => {
|
|
3119
|
+
settleCanceled = resolve;
|
|
3120
|
+
rejectContinuation = reject;
|
|
3121
|
+
});
|
|
3122
|
+
trackMemberWork(run.runId, continuation);
|
|
3064
3123
|
const timer = setTimeout(() => {
|
|
3065
3124
|
retryQueue.delete(run.runId);
|
|
3066
|
-
|
|
3125
|
+
// Ownership starts at scheduling, covering admission before a handle
|
|
3126
|
+
// exists and terminal receipt work after the handle arrives.
|
|
3127
|
+
executeRetry(run, attempt, reason, decision).then(settleCanceled, rejectContinuation);
|
|
3067
3128
|
}, delayMs);
|
|
3068
3129
|
retryQueue.set(run.runId, {
|
|
3069
3130
|
runId: run.runId,
|
|
@@ -3076,6 +3137,7 @@ export function createDispatchBundle(
|
|
|
3076
3137
|
rootRunId,
|
|
3077
3138
|
terminalCandidate: receipt,
|
|
3078
3139
|
timer,
|
|
3140
|
+
settleCanceled,
|
|
3079
3141
|
});
|
|
3080
3142
|
context.bus.emit(BusChannels.DispatchProgress, {
|
|
3081
3143
|
runId: run.runId,
|
|
@@ -3176,6 +3238,7 @@ export function createDispatchBundle(
|
|
|
3176
3238
|
// the worktree it created). A retry shares the assignment lineage but
|
|
3177
3239
|
// must receive its own ledger/run identity.
|
|
3178
3240
|
delete retryReq.runIdHint;
|
|
3241
|
+
let terminal: Promise<RunReceipt> | undefined;
|
|
3179
3242
|
const reasonKey = retryReasonKey(run.lineage.rootRunId, attempt);
|
|
3180
3243
|
retryReasons.set(reasonKey, reason);
|
|
3181
3244
|
try {
|
|
@@ -3241,6 +3304,10 @@ export function createDispatchBundle(
|
|
|
3241
3304
|
if (decision.excludedRouteParts.includes("runtime")) delete retryReq.workerRuntime;
|
|
3242
3305
|
}
|
|
3243
3306
|
const handle = await dispatch(retryReq, undefined, run.hostRun === undefined ? undefined : { hostRun: run.hostRun });
|
|
3307
|
+
// Cancellation can arrive while retry admission is awaiting a handle.
|
|
3308
|
+
if (canceledControlRoots.has(controlRootsByAttempt.get(run.runId) ?? run.lineage.rootRunId)) {
|
|
3309
|
+
contract.abort(handle.runId);
|
|
3310
|
+
}
|
|
3244
3311
|
// The assignment folds every attempt into one stream with a reset marker.
|
|
3245
3312
|
const marker: AssignmentAttemptStartEvent = {
|
|
3246
3313
|
type: "attempt_start",
|
|
@@ -3262,6 +3329,7 @@ export function createDispatchBundle(
|
|
|
3262
3329
|
runtimeKind: run.runtimeKind,
|
|
3263
3330
|
event: marker,
|
|
3264
3331
|
});
|
|
3332
|
+
terminal = handle.finalPromise;
|
|
3265
3333
|
handle.finalPromise.catch((error) => {
|
|
3266
3334
|
assignments.reject(asAssignmentId(run.lineage.rootRunId), error);
|
|
3267
3335
|
reportDispatchDiagnostic(`finalize retry run ${handle.runId}`, error);
|
|
@@ -3294,6 +3362,7 @@ export function createDispatchBundle(
|
|
|
3294
3362
|
outcomeDetail: denial,
|
|
3295
3363
|
});
|
|
3296
3364
|
}
|
|
3365
|
+
await terminal;
|
|
3297
3366
|
}
|
|
3298
3367
|
|
|
3299
3368
|
function requireLedger(): Ledger {
|
|
@@ -3684,7 +3753,7 @@ export function createDispatchBundle(
|
|
|
3684
3753
|
),
|
|
3685
3754
|
req,
|
|
3686
3755
|
);
|
|
3687
|
-
assertPostRuntimeToolCompatibility(req.agentId, spec, effectiveTools, target);
|
|
3756
|
+
assertPostRuntimeToolCompatibility(req.agentId, spec, effectiveTools, target, pathScope.writeBoundaries.length > 0);
|
|
3688
3757
|
const effectiveAdmission: DispatchAdmissionStage = {
|
|
3689
3758
|
...admission,
|
|
3690
3759
|
allowedTools: effectiveTools,
|
|
@@ -5824,6 +5893,7 @@ export function createDispatchBundle(
|
|
|
5824
5893
|
cwd: lifecycle.cwd,
|
|
5825
5894
|
networkAllowed:
|
|
5826
5895
|
lifecycle.admission.allowedTools.includes(ToolNames.WebFetch) ||
|
|
5896
|
+
lifecycle.admission.allowedTools.includes(ToolNames.WebRead) ||
|
|
5827
5897
|
lifecycle.target.runtime.externalAgentLoop?.network === "externally-governed-unobserved",
|
|
5828
5898
|
observedRunEffects,
|
|
5829
5899
|
filesystem: nodeResultContractFilesystem(),
|
|
@@ -6168,7 +6238,11 @@ export function createDispatchBundle(
|
|
|
6168
6238
|
}
|
|
6169
6239
|
// Requests carrying lineage are internal attempts (retry or nested
|
|
6170
6240
|
// orchestration) and retain the per-attempt handle contract.
|
|
6171
|
-
if (req.lineage)
|
|
6241
|
+
if (req.lineage) {
|
|
6242
|
+
const finalPromise = handle.finalPromise.finally(() => writerLease?.release());
|
|
6243
|
+
trackMemberWork(handle.runId, finalPromise);
|
|
6244
|
+
return { ...handle, finalPromise };
|
|
6245
|
+
}
|
|
6172
6246
|
|
|
6173
6247
|
const assignment = assignments.open(handle.runId, assignmentPolicyFor(handle.effectiveRequest));
|
|
6174
6248
|
persistAssignment(registerAssignment(assignment.id), `${assignment.id}:open`);
|
|
@@ -6270,7 +6344,13 @@ export function createDispatchBundle(
|
|
|
6270
6344
|
),
|
|
6271
6345
|
req,
|
|
6272
6346
|
);
|
|
6273
|
-
assertPostRuntimeToolCompatibility(
|
|
6347
|
+
assertPostRuntimeToolCompatibility(
|
|
6348
|
+
req.agentId,
|
|
6349
|
+
agentSpec,
|
|
6350
|
+
effectiveTools,
|
|
6351
|
+
target,
|
|
6352
|
+
pathScope.writeBoundaries.length > 0,
|
|
6353
|
+
);
|
|
6274
6354
|
assertRuntimeCanHonorWorkerPermissionMode(target.runtime, settings?.fleet.permissions.mode ?? "deny");
|
|
6275
6355
|
assertResponseSchemaEnforceable(target.runtime, target.modelCapabilities, req.responseSchema, effectiveTools.length);
|
|
6276
6356
|
assertWriteRootsEnforceable(target.runtime, pathScope.writeBoundaries);
|
|
@@ -6927,6 +7007,7 @@ export function createDispatchBundle(
|
|
|
6927
7007
|
function settleQueuedAssignmentsForShutdown(): void {
|
|
6928
7008
|
for (const [finishedRunId, entry] of retryQueue) {
|
|
6929
7009
|
clearTimeout(entry.timer);
|
|
7010
|
+
entry.settleCanceled();
|
|
6930
7011
|
if (assignments.get(entry.rootRunId)?.status === "running") {
|
|
6931
7012
|
settleAssignmentDurably(asAssignmentId(entry.rootRunId), entry.terminalCandidate, "canceled");
|
|
6932
7013
|
}
|
|
@@ -6972,11 +7053,28 @@ export function createDispatchBundle(
|
|
|
6972
7053
|
return stored?.assignmentId ?? ledger?.get(id)?.lineage?.rootRunId ?? id;
|
|
6973
7054
|
}
|
|
6974
7055
|
|
|
7056
|
+
function controlRootFor(id: string): string {
|
|
7057
|
+
const exact = controlRootsByAttempt.get(id);
|
|
7058
|
+
if (exact !== undefined) return exact;
|
|
7059
|
+
const roots = new Set<string>();
|
|
7060
|
+
for (const [attempt, root] of assignmentRootsByAttempt) {
|
|
7061
|
+
if (root === id) roots.add(controlRootsByAttempt.get(attempt) ?? root);
|
|
7062
|
+
}
|
|
7063
|
+
if (roots.size > 1) {
|
|
7064
|
+
throw new Error(`dispatch: '${id}' names multiple fleet members; use a concrete member or assignment id`);
|
|
7065
|
+
}
|
|
7066
|
+
return roots.values().next().value ?? assignmentRootFor(id);
|
|
7067
|
+
}
|
|
7068
|
+
|
|
6975
7069
|
function currentAssignmentRun(id: string): ActiveRun | null {
|
|
6976
|
-
|
|
7070
|
+
// An exact live attempt is authoritative even if a sibling has a higher
|
|
7071
|
+
// attempt ordinal. Completed IDs may follow only their own retry chain.
|
|
7072
|
+
const exact = active.get(id);
|
|
7073
|
+
if (exact !== undefined) return exact;
|
|
7074
|
+
const rootRunId = controlRootFor(id);
|
|
6977
7075
|
let current: ActiveRun | null = null;
|
|
6978
7076
|
for (const run of active.values()) {
|
|
6979
|
-
if (run.lineage.rootRunId !== rootRunId) continue;
|
|
7077
|
+
if ((controlRootsByAttempt.get(run.runId) ?? run.lineage.rootRunId) !== rootRunId) continue;
|
|
6980
7078
|
if (current === null || run.lineage.attempt > current.lineage.attempt) current = run;
|
|
6981
7079
|
}
|
|
6982
7080
|
return current;
|
|
@@ -7030,8 +7128,25 @@ export function createDispatchBundle(
|
|
|
7030
7128
|
await Promise.allSettled([...assignmentWrites]);
|
|
7031
7129
|
},
|
|
7032
7130
|
},
|
|
7131
|
+
async drainMember(runId) {
|
|
7132
|
+
const root = controlRootFor(runId);
|
|
7133
|
+
const errors: unknown[] = [];
|
|
7134
|
+
while (true) {
|
|
7135
|
+
const pending = [...(memberWork.get(root) ?? [])];
|
|
7136
|
+
const live = currentAssignmentRun(runId);
|
|
7137
|
+
if (live !== null) pending.push(live.finalPromise);
|
|
7138
|
+
if (pending.length === 0) break;
|
|
7139
|
+
for (const result of await Promise.allSettled(pending)) {
|
|
7140
|
+
if (result.status === "rejected" && !errors.includes(result.reason)) errors.push(result.reason);
|
|
7141
|
+
}
|
|
7142
|
+
}
|
|
7143
|
+
if (errors.length === 1) throw errors[0];
|
|
7144
|
+
if (errors.length > 1) throw new AggregateError(errors, "dispatch member drain failed", { cause: errors[0] });
|
|
7145
|
+
},
|
|
7033
7146
|
abort(runId, reason) {
|
|
7034
|
-
const rootRunId =
|
|
7147
|
+
const rootRunId = controlRootFor(runId);
|
|
7148
|
+
const run = currentAssignmentRun(runId);
|
|
7149
|
+
canceledControlRoots.add(rootRunId);
|
|
7035
7150
|
const queued = pendingCapacity.get(rootRunId);
|
|
7036
7151
|
if (queued !== undefined && capacityAdmission.cancel(rootRunId)) {
|
|
7037
7152
|
persistAssignment(cancelStoredAssignment(rootRunId), `${rootRunId}:cancel-queued`);
|
|
@@ -7049,10 +7164,13 @@ export function createDispatchBundle(
|
|
|
7049
7164
|
persistAssignment(cancelStoredAssignment(rootRunId), `${rootRunId}:cancel`);
|
|
7050
7165
|
}
|
|
7051
7166
|
for (const [finishedRunId, retry] of retryQueue) {
|
|
7052
|
-
if (retry.rootRunId !== rootRunId) continue;
|
|
7167
|
+
if ((controlRootsByAttempt.get(finishedRunId) ?? retry.rootRunId) !== rootRunId) continue;
|
|
7053
7168
|
clearTimeout(retry.timer);
|
|
7169
|
+
retry.settleCanceled();
|
|
7054
7170
|
retryQueue.delete(finishedRunId);
|
|
7055
|
-
|
|
7171
|
+
if (retry.rootRunId === rootRunId) {
|
|
7172
|
+
settleAssignmentDurably(asAssignmentId(rootRunId), retry.terminalCandidate, "canceled");
|
|
7173
|
+
}
|
|
7056
7174
|
context.bus.emit(BusChannels.RunAborted, {
|
|
7057
7175
|
source: "dispatch_abort",
|
|
7058
7176
|
runId: finishedRunId,
|
|
@@ -7067,7 +7185,6 @@ export function createDispatchBundle(
|
|
|
7067
7185
|
event: { type: "retry_canceled", attempt: retry.attempt },
|
|
7068
7186
|
});
|
|
7069
7187
|
}
|
|
7070
|
-
const run = currentAssignmentRun(rootRunId);
|
|
7071
7188
|
if (!run) return;
|
|
7072
7189
|
emitRunAborted(run, "dispatch_abort");
|
|
7073
7190
|
run.aborted = true;
|
|
@@ -18,6 +18,7 @@ import { performance } from "node:perf_hooks";
|
|
|
18
18
|
import { readClioVersion } from "../../core/package-root.js";
|
|
19
19
|
import { shellQuote } from "../../core/shell-quote.js";
|
|
20
20
|
import { clioStateDir } from "../../core/xdg.js";
|
|
21
|
+
import { atomicWrite } from "../../engine/session.js";
|
|
21
22
|
import {
|
|
22
23
|
evaluateRouteFacts,
|
|
23
24
|
type FactState,
|
|
@@ -91,6 +92,20 @@ export function readFleetPreflightRecords(): FleetPreflightRecord[] {
|
|
|
91
92
|
}
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Upsert records keyed by (nodeId, projectRoot). Only `clio-coder doctor --fix`
|
|
97
|
+
* writes: plain doctor stays observation-only, and dispatch admission fails
|
|
98
|
+
* closed on a node that has no stored passing record.
|
|
99
|
+
*/
|
|
100
|
+
export function recordFleetPreflight(records: ReadonlyArray<FleetPreflightRecord>): void {
|
|
101
|
+
const merged = new Map<string, FleetPreflightRecord>();
|
|
102
|
+
for (const record of [...readFleetPreflightRecords(), ...records]) {
|
|
103
|
+
merged.set(`${record.nodeId}\0${record.projectRoot}`, record);
|
|
104
|
+
}
|
|
105
|
+
const file: FleetPreflightStoreFile = { version: 2, records: [...merged.values()] };
|
|
106
|
+
atomicWrite(storePath(), JSON.stringify(file, null, 2));
|
|
107
|
+
}
|
|
108
|
+
|
|
94
109
|
export interface FleetPreflightVerdict {
|
|
95
110
|
ok: boolean;
|
|
96
111
|
reason: string | null;
|
|
@@ -110,19 +125,19 @@ export function fleetPreflightVerdict(
|
|
|
110
125
|
if (!record) {
|
|
111
126
|
return {
|
|
112
127
|
ok: false,
|
|
113
|
-
reason: `node '${node.id}' has not passed the fleet preflight for ${projectRoot}; run 'clio-coder doctor'`,
|
|
128
|
+
reason: `node '${node.id}' has not passed the fleet preflight for ${projectRoot}; run 'clio-coder doctor --fix'`,
|
|
114
129
|
};
|
|
115
130
|
}
|
|
116
131
|
if (record.host !== node.host) {
|
|
117
132
|
return {
|
|
118
133
|
ok: false,
|
|
119
|
-
reason: `node '${node.id}' preflight was recorded for host '${record.host}' but the node now points at '${node.host}'; run 'clio-coder doctor'`,
|
|
134
|
+
reason: `node '${node.id}' preflight was recorded for host '${record.host}' but the node now points at '${node.host}'; run 'clio-coder doctor --fix'`,
|
|
120
135
|
};
|
|
121
136
|
}
|
|
122
137
|
if (record.localVersion !== readClioVersion()) {
|
|
123
138
|
return {
|
|
124
139
|
ok: false,
|
|
125
|
-
reason: `node '${node.id}' preflight predates a local clio-coder upgrade (${record.localVersion} -> ${readClioVersion()}); run 'clio-coder doctor'`,
|
|
140
|
+
reason: `node '${node.id}' preflight predates a local clio-coder upgrade (${record.localVersion} -> ${readClioVersion()}); run 'clio-coder doctor --fix'`,
|
|
126
141
|
};
|
|
127
142
|
}
|
|
128
143
|
if (!record.ok) {
|
|
@@ -788,6 +788,7 @@ export async function executeFleetRun(input: ExecuteFleetRunInput): Promise<Flee
|
|
|
788
788
|
beginWriteBoundary: (window, stepIds) => boundaryEnforcer.begin(window, stepIds),
|
|
789
789
|
verifyWriteBoundary: (window, stepIds) => boundaryEnforcer.verify(window, stepIds),
|
|
790
790
|
cancel: (assignmentId) => dispatch.abort(assignmentId),
|
|
791
|
+
drainMember: (assignmentId) => dispatch.drainMember?.(assignmentId) ?? Promise.resolve(),
|
|
791
792
|
release: (ownerId) => {
|
|
792
793
|
if (ownerId === NO_WORKER_RESERVATION) return;
|
|
793
794
|
dispatch.reservations?.release(ownerId);
|
|
@@ -75,7 +75,7 @@ export interface GateDecisionArtifact {
|
|
|
75
75
|
* prose line. Two schemas exist because the two topologies ask different
|
|
76
76
|
* questions:
|
|
77
77
|
*
|
|
78
|
-
* - Review asks "does this work pass?", which is exactly the
|
|
78
|
+
* - Review asks "does this work pass?", which is exactly the
|
|
79
79
|
* `verifier-report` contract. There is deliberately no `revise` verdict:
|
|
80
80
|
* whether a failure is worth another cycle is the coordinator's bounded
|
|
81
81
|
* continuation policy, not a decision the reviewed model gets to author.
|
|
@@ -96,7 +96,7 @@ export interface CompeteGateResult {
|
|
|
96
96
|
|
|
97
97
|
export type GateResultParse<T> = { ok: true; result: T } | { ok: false; reason: string };
|
|
98
98
|
|
|
99
|
-
/** Parse a reviewer answer under the
|
|
99
|
+
/** Parse a reviewer answer under the verifier-report contract. */
|
|
100
100
|
function parseReviewGateResult(output: string): GateResultParse<ReviewGateResult> {
|
|
101
101
|
const result = parseVerifierResult(output);
|
|
102
102
|
return result === null
|
|
@@ -128,7 +128,7 @@ export interface ReviewGateDecision {
|
|
|
128
128
|
/**
|
|
129
129
|
* Apply the coordinator's review policy to one reviewer answer.
|
|
130
130
|
*
|
|
131
|
-
* The reviewer answers pass or fail under its
|
|
131
|
+
* The reviewer answers pass or fail under its verifier-report contract and nothing
|
|
132
132
|
* else. `revise` is this function's bounded continuation decision: a failure
|
|
133
133
|
* with cycles left earns another builder attempt, the same failure at the bound
|
|
134
134
|
* is simply the terminal fail, and an answer that does not satisfy the contract
|
|
@@ -5,15 +5,15 @@ import { dirname, join, resolve } from "node:path";
|
|
|
5
5
|
import { PATH_BOUNDARY_MAX_ENTRIES, pathBoundaryCovers, resolvePathBoundary } from "../../core/path-boundary.js";
|
|
6
6
|
import { withStateFileLockSync } from "../../core/state-file-lock.js";
|
|
7
7
|
import { clioStateDir } from "../../core/xdg.js";
|
|
8
|
-
import { judgeNumericTexts, judgePerfTexts } from "../../tools/verify/scripts.js";
|
|
8
|
+
import { JUDGED_CHECK_MAX_OUTPUT_BYTES, judgeNumericTexts, judgePerfTexts } from "../../tools/verify/scripts.js";
|
|
9
9
|
import { FLEET_COMMAND_BASE_ENV, type FleetCommand } from "../agents/fleet-commands.js";
|
|
10
|
-
import { runCodeStep } from "./code-step.js";
|
|
10
|
+
import { CODE_STEP_CAPTURE_MAX_BYTES, runCodeStep } from "./code-step.js";
|
|
11
11
|
import type { DispatchRequest } from "./contract.js";
|
|
12
12
|
import type { RunHostVerification, RunHostVerificationAttribution, RunHostVerificationCheck } from "./types.js";
|
|
13
13
|
import { captureWorkspaceSnapshot } from "./write-boundary.js";
|
|
14
14
|
|
|
15
15
|
const OUTPUT_TAIL_BYTES = 2_048;
|
|
16
|
-
const MEMO_VERSION =
|
|
16
|
+
const MEMO_VERSION = 3;
|
|
17
17
|
|
|
18
18
|
type ResolvedCheck = NonNullable<DispatchRequest["resolvedVerification"]>[number];
|
|
19
19
|
|
|
@@ -164,6 +164,7 @@ function judgeResolvedCheck(
|
|
|
164
164
|
referenceText,
|
|
165
165
|
resolvedCheck.numeric.tolerance,
|
|
166
166
|
`reference '${resolvedCheck.numeric.reference}'`,
|
|
167
|
+
resolvedCheck.numeric.reference,
|
|
167
168
|
);
|
|
168
169
|
if (report instanceof Error) return { exitCode: 1, outputTail: `numeric-compare: ${report.message}` };
|
|
169
170
|
return { exitCode: report.passed ? 0 : 1, report, outputTail: outputTail(report.summary) };
|
|
@@ -214,20 +215,25 @@ async function runResolvedCheck(input: {
|
|
|
214
215
|
outputExcerpt: "",
|
|
215
216
|
};
|
|
216
217
|
}
|
|
218
|
+
const judged = resolvedCheck.kind === "numeric-compare" || resolvedCheck.kind === "perf-budget";
|
|
219
|
+
const captureMaxBytes = judged ? JUDGED_CHECK_MAX_OUTPUT_BYTES : CODE_STEP_CAPTURE_MAX_BYTES;
|
|
217
220
|
const outcome = await runCodeStep({
|
|
218
221
|
stepId: `verification-${input.index + 1}-${resolvedCheck.check.replace(/[^a-z0-9._-]/giu, "_")}`,
|
|
219
222
|
command,
|
|
220
223
|
workspaceRoot: resolvedCheck.cwd,
|
|
221
224
|
artifactDir: join(input.stateDir, "artifacts", input.runId, "verification"),
|
|
222
225
|
env: input.env,
|
|
226
|
+
maxOutputBytes: captureMaxBytes,
|
|
223
227
|
});
|
|
224
228
|
const artifactPath = outcome.record.artifactPaths[0];
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
outcome.record.
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
229
|
+
// outputTruncated also covers the report excerpt; only capture loss prevents judgement.
|
|
230
|
+
const judgement =
|
|
231
|
+
judged && outcome.record.outputTruncated && outcome.record.outputBytes > captureMaxBytes
|
|
232
|
+
? {
|
|
233
|
+
exitCode: 1,
|
|
234
|
+
outputTail: `verify: ${resolvedCheck.kind} command output exceeded ${captureMaxBytes} bytes before judgement; captured output was truncated`,
|
|
235
|
+
}
|
|
236
|
+
: judgeResolvedCheck(resolvedCheck, outcome.record.exitCode, outcome.record.durationMs, outcome.stdout);
|
|
231
237
|
const check: RunHostVerificationCheck = {
|
|
232
238
|
check: resolvedCheck.check,
|
|
233
239
|
argv: [...outcome.record.argv],
|
|
@@ -307,11 +313,7 @@ function checkDedupeKey(resolvedCheck: ResolvedCheck): string {
|
|
|
307
313
|
: {
|
|
308
314
|
reference: numeric.reference,
|
|
309
315
|
referenceDigest: sha256(JSON.stringify(readSealedFile(numeric.reference) ?? null)),
|
|
310
|
-
tolerance:
|
|
311
|
-
absolute: numeric.tolerance.absolute,
|
|
312
|
-
relative: numeric.tolerance.relative,
|
|
313
|
-
ulp: numeric.tolerance.ulp,
|
|
314
|
-
},
|
|
316
|
+
tolerance: numeric.tolerance,
|
|
315
317
|
},
|
|
316
318
|
perf:
|
|
317
319
|
perf === undefined
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cheap, pure findings classifier for the durable receipt summary
|
|
3
|
-
*
|
|
4
|
-
* ledger envelope
|
|
5
|
-
* -- to a conservative subset of the canonical EvidenceTag taxonomy.
|
|
2
|
+
* Cheap, pure findings classifier for the durable receipt summary. It maps
|
|
3
|
+
* outcome, outcomeDetail, exitCode, toolStats, and toolActivity from the receipt
|
|
4
|
+
* draft and ledger envelope to a conservative subset of the EvidenceTag taxonomy.
|
|
6
5
|
*
|
|
7
6
|
* This is deliberately NOT buildEvidence. The forensic aggregator reads the
|
|
8
7
|
* persisted receipt, so calling it at record time would create a cycle. This
|
|
@@ -36,9 +36,9 @@ export type ReservationMemberStatus = "held" | "consumed" | "released";
|
|
|
36
36
|
export type ReservationStatus = "active" | "released" | "rolled_back" | "expired";
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
|
-
* A reservation holds
|
|
40
|
-
*
|
|
41
|
-
*
|
|
39
|
+
* A reservation holds global, per-node, and inference-endpoint concurrency
|
|
40
|
+
* slots and records an advisory cost upper bound. Node and endpoint identity
|
|
41
|
+
* matter only because slots bind on
|
|
42
42
|
* those dimensions. Agent, target, model, and runtime
|
|
43
43
|
* identity are route identity, which the failover envelope owns
|
|
44
44
|
* (`assertRouteWithinApprovedEnvelope`); pinning them here made a
|
|
@@ -330,12 +330,10 @@ export function transferDispatchReservationToLease(input: {
|
|
|
330
330
|
}
|
|
331
331
|
|
|
332
332
|
/**
|
|
333
|
-
* Move a member's held capacity to the node a retry actually resolved
|
|
334
|
-
*
|
|
335
|
-
*
|
|
336
|
-
*
|
|
337
|
-
* plan reserved. Atomic under
|
|
338
|
-
* the state-file lock: the old node's slot is released and the new one acquired
|
|
333
|
+
* Move a member's held capacity to the node a retry actually resolved and
|
|
334
|
+
* record the retry's own cost estimate. Allocation rechecks capacity while
|
|
335
|
+
* retaining cost as advisory accounting. Atomic under the state-file lock:
|
|
336
|
+
* the old node's slot is released and the new one acquired
|
|
339
337
|
* in a single write, so a concurrent plan can never observe both held. Fails
|
|
340
338
|
* closed with a named reason, which the caller surfaces as an admission denial
|
|
341
339
|
* rather than letting the attempt escape its reservation.
|
|
@@ -102,7 +102,7 @@ export function evaluateRouteFacts(
|
|
|
102
102
|
if (requirement.mode === "shadow") return { ok: true, unknowns };
|
|
103
103
|
return {
|
|
104
104
|
ok: false,
|
|
105
|
-
reason: `no probe fact for target '${requirement.targetId}' on node '${requirement.nodeId}'; run 'clio-coder doctor'`,
|
|
105
|
+
reason: `no probe fact for target '${requirement.targetId}' on node '${requirement.nodeId}'; run 'clio-coder doctor --fix'`,
|
|
106
106
|
unknowns,
|
|
107
107
|
};
|
|
108
108
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dispatch run ledger with atomic writes
|
|
2
|
+
* Dispatch run ledger with atomic writes.
|
|
3
3
|
*
|
|
4
4
|
* On-disk layout under `clioStateDir()`:
|
|
5
5
|
* runs.json JSON array of RunEnvelope, newest first
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
* mutate memory only; `persist()` writes the settings-bounded ring (default
|
|
10
10
|
* 1000) atomically via engine.atomicWrite.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* This module owns persistence. The dispatch extension wires worker spawning,
|
|
13
|
+
* cross-domain coordination, and event emission around this ledger.
|
|
14
14
|
*
|
|
15
15
|
* A crash between recordReceipt and persist leaves the receipt JSON on disk
|
|
16
16
|
* without a ledger entry. The dispatch extension closes that gap at startup by
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { WorkerContextProvenance } from "../context/worker/contract.js";
|
|
2
2
|
/**
|
|
3
|
-
* Shared run + receipt types for the dispatch domain
|
|
3
|
+
* Shared run + receipt types for the dispatch domain.
|
|
4
4
|
*
|
|
5
5
|
* RunEnvelope is the live record kept in the ledger (runs.json). RunReceipt is
|
|
6
6
|
* the per-run artifact written under receipts/<runId>.json on completion. Both
|
|
@@ -2,6 +2,7 @@ import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { rawDurationMs } from "../../core/timers.js";
|
|
4
4
|
import { isProjectVerifierCheckId, isVerificationScriptName } from "../../core/verification-scripts.js";
|
|
5
|
+
import { effectiveToolCall } from "../../tools/surface.js";
|
|
5
6
|
import type {
|
|
6
7
|
RunEnvelope,
|
|
7
8
|
RunKind,
|
|
@@ -573,7 +574,12 @@ function validationToolCallCandidate(
|
|
|
573
574
|
runSources: ReadonlyArray<EvidenceRunSource>,
|
|
574
575
|
): ValidationToolCallCandidate | null {
|
|
575
576
|
const call = extractSessionToolCall(entry, linked);
|
|
576
|
-
|
|
577
|
+
// The capability a gateway call reached is what ran; a validation command
|
|
578
|
+
// is recognized under that name, never under `gateway`.
|
|
579
|
+
const effective = effectiveToolCall(call.tool, call.args);
|
|
580
|
+
if (validationToolCallSummary(effective.toolName, effective.viaGateway ? effective.args : call.args) === null) {
|
|
581
|
+
return null;
|
|
582
|
+
}
|
|
577
583
|
return {
|
|
578
584
|
toolCallId: call.id,
|
|
579
585
|
runId: validationRunIdFor(linked, runSources),
|
|
@@ -1025,7 +1031,15 @@ function extractSessionToolCall(entry: MessageEntry, linked: LinkedSessionEntry)
|
|
|
1025
1031
|
block?.arguments ??
|
|
1026
1032
|
block?.args ??
|
|
1027
1033
|
undefined;
|
|
1028
|
-
|
|
1034
|
+
const effective = effectiveToolCall(tool, args);
|
|
1035
|
+
return {
|
|
1036
|
+
id,
|
|
1037
|
+
tool: effective.toolName,
|
|
1038
|
+
args: effective.args ?? args,
|
|
1039
|
+
timestamp: entry.timestamp,
|
|
1040
|
+
link: linked.link,
|
|
1041
|
+
sessionId: linked.sessionId,
|
|
1042
|
+
};
|
|
1029
1043
|
}
|
|
1030
1044
|
|
|
1031
1045
|
function extractSessionToolResult(entry: MessageEntry, linked: LinkedSessionEntry): SessionToolResult {
|
|
@@ -1047,10 +1061,18 @@ function extractSessionToolResult(entry: MessageEntry, linked: LinkedSessionEntr
|
|
|
1047
1061
|
payload?.out ??
|
|
1048
1062
|
payload?.content ??
|
|
1049
1063
|
(contentText.length > 0 ? contentText : entry.payload);
|
|
1064
|
+
const effective = effectiveToolCall(tool, undefined, payloadObject(result)?.details ?? payload?.details);
|
|
1065
|
+
const resultObject = payloadObject(result);
|
|
1066
|
+
const details = payloadObject(resultObject?.details);
|
|
1067
|
+
let projectedResult = result;
|
|
1068
|
+
if (effective.viaGateway && resultObject && details) {
|
|
1069
|
+
const { capability: _capability, ...innerDetails } = details;
|
|
1070
|
+
projectedResult = { ...resultObject, details: innerDetails };
|
|
1071
|
+
}
|
|
1050
1072
|
return {
|
|
1051
1073
|
id,
|
|
1052
|
-
tool,
|
|
1053
|
-
result,
|
|
1074
|
+
tool: effective.toolName,
|
|
1075
|
+
result: projectedResult,
|
|
1054
1076
|
isError: payload?.isError === true || payload?.error === true,
|
|
1055
1077
|
timestamp: entry.timestamp,
|
|
1056
1078
|
link: linked.link,
|
|
@@ -1351,8 +1373,13 @@ function renderTranscript(
|
|
|
1351
1373
|
}
|
|
1352
1374
|
if (sessionLinks.entries.length > 0) {
|
|
1353
1375
|
lines.push("", "## Linked Session Transcript");
|
|
1376
|
+
const calls = new Map<string, string>();
|
|
1354
1377
|
for (const linked of sessionLinks.entries) {
|
|
1355
|
-
|
|
1378
|
+
if (linked.entry.kind === "message" && linked.entry.role === "tool_call") {
|
|
1379
|
+
const call = extractSessionToolCall(linked.entry, linked);
|
|
1380
|
+
calls.set(call.id, call.tool);
|
|
1381
|
+
}
|
|
1382
|
+
lines.push(...renderSessionTranscriptEntry(linked, calls));
|
|
1356
1383
|
}
|
|
1357
1384
|
}
|
|
1358
1385
|
lines.push("");
|
|
@@ -1379,7 +1406,7 @@ function transcriptRunLink(link: SessionRunLink): string {
|
|
|
1379
1406
|
return "";
|
|
1380
1407
|
}
|
|
1381
1408
|
|
|
1382
|
-
function renderSessionTranscriptEntry(linked: LinkedSessionEntry): string[] {
|
|
1409
|
+
function renderSessionTranscriptEntry(linked: LinkedSessionEntry, calls: ReadonlyMap<string, string>): string[] {
|
|
1383
1410
|
const entry = linked.entry;
|
|
1384
1411
|
const prefix = `- ${entry.timestamp} session=${linked.sessionId}${transcriptRunLink(linked.link)}`;
|
|
1385
1412
|
if (entry.kind === "message") {
|
|
@@ -1391,7 +1418,8 @@ function renderSessionTranscriptEntry(linked: LinkedSessionEntry): string[] {
|
|
|
1391
1418
|
const result = extractSessionToolResult(entry, linked);
|
|
1392
1419
|
const id = result.id === null ? "" : ` id=${result.id}`;
|
|
1393
1420
|
const error = result.isError ? " error=true" : "";
|
|
1394
|
-
|
|
1421
|
+
const tool = result.id === null ? result.tool : (calls.get(result.id) ?? result.tool);
|
|
1422
|
+
return [`${prefix} tool_result ${tool}${id}${error}: ${previewUnknown(result.result)}`];
|
|
1395
1423
|
}
|
|
1396
1424
|
const text = collapseWhitespace(extractTextFromPayload(entry.payload));
|
|
1397
1425
|
const rendered = text.length > 0 ? truncateText(text, TRANSCRIPT_TEXT_MAX_CHARS) : previewUnknown(entry.payload);
|