@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
|
@@ -6,7 +6,7 @@ import { extractCommandCdTargets, extractCommandWriteTargets } from "./protected
|
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Deterministic action classifier for tool calls. Pure function, no I/O, no
|
|
9
|
-
* state.
|
|
9
|
+
* state. Dispatch admission and tool audit consume it. This module only
|
|
10
10
|
* owns the mapping from (tool, args) to an ActionClass.
|
|
11
11
|
*/
|
|
12
12
|
|
|
@@ -89,10 +89,22 @@ function baseClassify(tool: string): ActionClass | null {
|
|
|
89
89
|
case ToolNames.Grep:
|
|
90
90
|
case ToolNames.Find:
|
|
91
91
|
case ToolNames.Ls:
|
|
92
|
+
// web_read is the GET-only half of the web split: no method, headers,
|
|
93
|
+
// or body can make it outward, so it is read class unconditionally.
|
|
94
|
+
case ToolNames.WebRead:
|
|
92
95
|
case ToolNames.WebFetch:
|
|
93
96
|
case ToolNames.Git:
|
|
94
97
|
case ToolNames.CodeNav:
|
|
95
98
|
case ToolNames.Context:
|
|
99
|
+
// clio_docs and clio_library read Clio's bundled documentation and the
|
|
100
|
+
// recipe catalog; data streams structured files. None writes.
|
|
101
|
+
case ToolNames.ClioDocs:
|
|
102
|
+
case ToolNames.ClioLibrary:
|
|
103
|
+
case ToolNames.Data:
|
|
104
|
+
// gateway lists and describes capabilities on its own; a call carries
|
|
105
|
+
// the capability's own class through a nested admission, so the outer
|
|
106
|
+
// call stays read class.
|
|
107
|
+
case ToolNames.Gateway:
|
|
96
108
|
case ToolNames.Monitor:
|
|
97
109
|
case ToolNames.AskUser:
|
|
98
110
|
case ToolNames.CredentialPresent:
|
|
@@ -124,6 +136,10 @@ function baseClassify(tool: string): ActionClass | null {
|
|
|
124
136
|
return "write";
|
|
125
137
|
case ToolNames.Bash:
|
|
126
138
|
case ToolNames.Verify:
|
|
139
|
+
// run_script runs an interpreter over a workspace script; its
|
|
140
|
+
// safetyCall projects the exact argv to a bash command so the policy
|
|
141
|
+
// engine applies the shell rules to it.
|
|
142
|
+
case ToolNames.RunScript:
|
|
127
143
|
return "execute";
|
|
128
144
|
case ToolNames.Dispatch:
|
|
129
145
|
case ToolNames.Steer:
|
|
@@ -130,12 +130,20 @@ const CALL_ACTION_VOCABULARY: Readonly<Record<string, { verb: string; field: str
|
|
|
130
130
|
bash: { verb: "running", field: "command" },
|
|
131
131
|
grep: { verb: "searching", field: "pattern" },
|
|
132
132
|
find: { verb: "finding", field: "pattern" },
|
|
133
|
+
web_read: { verb: "reading", field: "url" },
|
|
133
134
|
web_fetch: { verb: "fetching", field: "url" },
|
|
134
135
|
git: { verb: "git", field: "op" },
|
|
135
136
|
verify: { verb: "verifying", field: "check" },
|
|
137
|
+
run_script: { verb: "running", field: "script" },
|
|
136
138
|
code_nav: { verb: "navigating", field: "query" },
|
|
137
139
|
context: { verb: "context", field: "scope" },
|
|
140
|
+
clio_docs: { verb: "searching", field: "query" },
|
|
141
|
+
clio_library: { verb: "searching", field: "query" },
|
|
142
|
+
data: { verb: "inspecting", field: "path" },
|
|
138
143
|
artifact: { verb: "writing", field: "kind" },
|
|
144
|
+
// The gateway's descriptor names the capability it reaches, so worker
|
|
145
|
+
// telemetry and receipts read "gateway git" rather than an opaque call.
|
|
146
|
+
gateway: { verb: "gateway", field: "capability" },
|
|
139
147
|
monitor: { verb: "monitoring", field: "run_id" },
|
|
140
148
|
steer: { verb: "steering", field: "run_id" },
|
|
141
149
|
tasks: { verb: "tasks", field: "action" },
|
|
@@ -193,9 +201,15 @@ const CALL_TARGET_FIELDS: Readonly<Record<string, ReadonlyArray<string>>> = {
|
|
|
193
201
|
steer: ["run_id", "action"],
|
|
194
202
|
tasks: ["action", "id"],
|
|
195
203
|
ledger: ["action", "kind", "path", "line", "target", "passed", "since"],
|
|
204
|
+
web_read: ["url", "timeout_ms", "max_bytes", "format"],
|
|
196
205
|
web_fetch: ["url", "method", "timeout_ms", "max_bytes", "format"],
|
|
206
|
+
run_script: ["interpreter", "script", "args", "interpreter_args", "cwd", "timeout_ms", "inputs", "outputs"],
|
|
207
|
+
clio_docs: ["query", "limit"],
|
|
208
|
+
clio_library: ["query", "kind", "ref", "limit", "offset"],
|
|
209
|
+
data: ["op", "path", "format", "offset", "limit", "columns", "pointer", "sample_rows", "max_rows"],
|
|
197
210
|
ask_user: ["action", "mode", "max_rounds", "exposure"],
|
|
198
211
|
artifact: ["kind", "path", "title"],
|
|
212
|
+
gateway: ["op", "capability", "query"],
|
|
199
213
|
// ACP tool kinds use only fields whose meaning the protocol defines.
|
|
200
214
|
execute: ["command", "cwd"],
|
|
201
215
|
search: ["query", "path"],
|
|
@@ -45,7 +45,7 @@ export interface SafetyContract {
|
|
|
45
45
|
readonly confirmed: ScopeSpec;
|
|
46
46
|
};
|
|
47
47
|
|
|
48
|
-
/** Subset check used by dispatch admission
|
|
48
|
+
/** Subset check used by dispatch admission. */
|
|
49
49
|
isSubset(worker: ScopeSpec, orchestrator: ScopeSpec): boolean;
|
|
50
50
|
|
|
51
51
|
/** Immutable safety policy metadata for receipts, audit, and replay. */
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { resolve } from "node:path";
|
|
2
2
|
import { ToolNames } from "../../core/tool-names.js";
|
|
3
3
|
import { isProjectVerifierCheckId, isVerificationScriptName } from "../../core/verification-scripts.js";
|
|
4
|
+
import { effectiveToolCall } from "../../tools/surface.js";
|
|
4
5
|
import { type DeclaredCheckSourceRef, PROJECT_VERIFIER_CATALOG_RELATIVE_PATH } from "../../tools/verify/catalog.js";
|
|
5
6
|
import type { UserTaskAcceptance } from "../user-tasks/acceptance.js";
|
|
6
7
|
import {
|
|
@@ -295,9 +296,14 @@ function mutatingToolCall(entry: unknown): MutationCandidate | null {
|
|
|
295
296
|
if (record?.kind !== "message" || record.role !== "tool_call") return null;
|
|
296
297
|
const payload = asRecord(record.payload);
|
|
297
298
|
if (payload === null) return null;
|
|
298
|
-
const
|
|
299
|
-
if (
|
|
300
|
-
|
|
299
|
+
const recordedTool = stringFromFirst(payload, ["name", "toolName", "tool"]);
|
|
300
|
+
if (recordedTool === null) return null;
|
|
301
|
+
// An artifact written through the gateway mutates the same path a direct
|
|
302
|
+
// artifact call would, so the call unwraps to the capability first.
|
|
303
|
+
const { toolName, args } = effectiveToolCall(
|
|
304
|
+
recordedTool,
|
|
305
|
+
asRecord(payload.args ?? payload.arguments ?? payload.input) ?? undefined,
|
|
306
|
+
);
|
|
301
307
|
const paths = mutationPathsForTool(toolName, args);
|
|
302
308
|
if (paths.length === 0) return null;
|
|
303
309
|
const toolCallId = stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]) ?? turnIdOf(entry);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Simple sliding-window loop detector. Pure logic; the caller owns state
|
|
3
|
-
* storage.
|
|
3
|
+
* storage. Callers provide an identity key composed of tool name + canonical
|
|
4
4
|
* arg hash and a `Date.now()` reading so runaway workers can be caught before
|
|
5
5
|
* their audit trail floods disk. `hashToolCall` builds that identity key and
|
|
6
6
|
* lives here, beside the detector, so every observer (the registry's hook
|
|
@@ -162,6 +162,7 @@ const EXECUTION_TOOLS = new Set<string>([ToolNames.Bash, ToolNames.Verify]);
|
|
|
162
162
|
export const WRITE_ROOT_REFUSED_TOOLS: ReadonlySet<string> = new Set<string>([
|
|
163
163
|
ToolNames.Bash,
|
|
164
164
|
ToolNames.Verify,
|
|
165
|
+
ToolNames.RunScript,
|
|
165
166
|
ToolNames.Dispatch,
|
|
166
167
|
]);
|
|
167
168
|
|
|
@@ -634,6 +635,12 @@ function pathPolicyTargets(call: ClassifierCall): Array<{ operation: PathPolicyO
|
|
|
634
635
|
const target = pathArg(args) ?? ".";
|
|
635
636
|
return [{ operation: "read", path: target }];
|
|
636
637
|
}
|
|
638
|
+
case ToolNames.Data: {
|
|
639
|
+
// data streams one named file; a zero-access path is refused here,
|
|
640
|
+
// before the reader opens it, exactly as a read of the same path.
|
|
641
|
+
const target = pathArg(args);
|
|
642
|
+
return target === null ? [] : [{ operation: "read", path: target }];
|
|
643
|
+
}
|
|
637
644
|
case ToolNames.Write:
|
|
638
645
|
case ToolNames.Edit: {
|
|
639
646
|
const target = pathArg(args);
|
|
@@ -62,10 +62,9 @@ export type ValidationCommandDetection = { kind: "validation"; matched: string }
|
|
|
62
62
|
* `npx vitest`, `tsc --noEmit`). Its consumer, dispatch validation grounding,
|
|
63
63
|
* spends a match on nothing. An unmatched claim there is reported and never
|
|
64
64
|
* downgrades a quality label, so the cost of a miss is noise in the receipt
|
|
65
|
-
* rather than a gate opening.
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* cannot name.
|
|
65
|
+
* rather than a gate opening. Commands such as `git diff` and
|
|
66
|
+
* `node -e "import(...)"` can ground inspection claims even when they do not
|
|
67
|
+
* satisfy the strict validation vocabulary.
|
|
69
68
|
*/
|
|
70
69
|
export type ValidationCommandScope = "finish-contract" | "grounding";
|
|
71
70
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Human-readable rejection messages for blocked tool calls. The registry
|
|
3
|
-
*
|
|
3
|
+
* renders `short` in the UI footer, attaches `detail` to the audit
|
|
4
4
|
* record, and surfaces `hints` to the worker so the next turn can recover
|
|
5
5
|
* without another round-trip.
|
|
6
6
|
*/
|
|
@@ -3,9 +3,8 @@ import { asDirectoryPathBoundary, pathBoundaryEntryCovers, resolvePathBoundary }
|
|
|
3
3
|
import type { ActionClass } from "./action-classifier.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* Scope rules for worker-vs-orchestrator privilege checks.
|
|
7
|
-
*
|
|
8
|
-
* admission so a worker scope never escalates past the orchestrator.
|
|
6
|
+
* Scope rules for worker-vs-orchestrator privilege checks. Dispatch admission
|
|
7
|
+
* consumes isSubset so a worker scope never escalates past the orchestrator.
|
|
9
8
|
*/
|
|
10
9
|
|
|
11
10
|
export interface ScopeSpec {
|
|
@@ -3,6 +3,7 @@ import path from "node:path";
|
|
|
3
3
|
import { parseDocument } from "yaml";
|
|
4
4
|
import { resolveSafeCwd } from "../../core/safe-exec.js";
|
|
5
5
|
import { byteLength } from "../../tools/truncate-utf8.js";
|
|
6
|
+
import { MAX_ULP_TOLERANCE } from "../../tools/verify/numeric.js";
|
|
6
7
|
import { compareCodepoints } from "../evidence/ordering.js";
|
|
7
8
|
|
|
8
9
|
/**
|
|
@@ -215,8 +216,8 @@ function validateTolerances(value: unknown, location: string): ValidationNumeric
|
|
|
215
216
|
}
|
|
216
217
|
if (Object.hasOwn(value, "ulp")) {
|
|
217
218
|
const ulp = value.ulp;
|
|
218
|
-
if (typeof ulp !== "number" || !Number.isInteger(ulp) || ulp < 0) {
|
|
219
|
-
return new Error(`${location}.ulp must be a non-negative integer`);
|
|
219
|
+
if (typeof ulp !== "number" || !Number.isInteger(ulp) || ulp < 0 || ulp > MAX_ULP_TOLERANCE) {
|
|
220
|
+
return new Error(`${location}.ulp must be a non-negative integer no greater than ${MAX_ULP_TOLERANCE}`);
|
|
220
221
|
}
|
|
221
222
|
tolerances.ulp = ulp;
|
|
222
223
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Session budget state. checkCeiling reports whether
|
|
3
|
-
* or
|
|
4
|
-
*
|
|
2
|
+
* Session budget state. checkCeiling reports whether current spend is under,
|
|
3
|
+
* at, or over the ceiling. Scheduling preflight exposes that spend and ceiling
|
|
4
|
+
* to dispatch reservations for accounting; the allocator does not enforce this
|
|
5
|
+
* session ceiling. Dispatch separately enforces an explicit per-request intent
|
|
6
|
+
* cost ceiling against the route estimate.
|
|
5
7
|
*/
|
|
6
8
|
|
|
7
9
|
export type BudgetVerdict = "under" | "at" | "over";
|
|
@@ -15,7 +15,8 @@ export interface SchedulingContract {
|
|
|
15
15
|
* Evaluate the running session cost against the ceiling. Scheduling owns the
|
|
16
16
|
* observability lookup so callers (notably dispatch) don't need to import it.
|
|
17
17
|
* Verdict is "under" when spend is below the ceiling, "at" when equal, "over"
|
|
18
|
-
* when above. Dispatch
|
|
18
|
+
* when above. Dispatch records this session budget without denying reservations
|
|
19
|
+
* from the verdict; explicit request cost ceilings have a separate route check.
|
|
19
20
|
*/
|
|
20
21
|
preflight(): BudgetPreflight;
|
|
21
22
|
/** Configured global worker capacity; durable leases own active usage. */
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Scheduling domain wire-up. Seeds budget + concurrency state from settings and
|
|
3
3
|
* listens to dispatch.enqueued so it can fire budget.alert events when session
|
|
4
|
-
* spend meets or crosses the ceiling. Dispatch
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* spend meets or crosses the ceiling. Dispatch preflight reads this state for
|
|
5
|
+
* accounting. Session-cost alerts are advisory; explicit per-request intent
|
|
6
|
+
* cost ceilings are enforced separately by dispatch route admission.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { type BudgetAlertPayload, BusChannels } from "../../core/bus-events.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Compaction orchestration
|
|
2
|
+
* Compaction orchestration.
|
|
3
3
|
*
|
|
4
4
|
* Given a list of session entries, finds the cut point, summarizes the
|
|
5
5
|
* history portion via the supplied model, and returns the trimmed entry
|
|
@@ -252,6 +252,29 @@ function findTurnStartForProtection(
|
|
|
252
252
|
return -1;
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
+
/**
|
|
256
|
+
* The ledger chains entries linearly, so a result's parent is its own call only
|
|
257
|
+
* when that call was alone in its batch. In a parallel batch the parent chain
|
|
258
|
+
* runs back through sibling calls, results and activation receipts. The load is
|
|
259
|
+
* still verifiable when that chain reaches the call without crossing another
|
|
260
|
+
* assistant or user message, which would make it a different exchange.
|
|
261
|
+
*/
|
|
262
|
+
function resultFollowsCallInBatch(
|
|
263
|
+
turn: ReadonlyArray<SessionEntry>,
|
|
264
|
+
resultEntry: SessionEntry,
|
|
265
|
+
call: SessionEntry,
|
|
266
|
+
): boolean {
|
|
267
|
+
let parent = resultEntry.parentTurnId;
|
|
268
|
+
for (let hops = 0; hops < turn.length && parent; hops++) {
|
|
269
|
+
if (parent === call.turnId) return true;
|
|
270
|
+
const link = turn.find((candidate) => candidate.turnId === parent);
|
|
271
|
+
if (!link) return false;
|
|
272
|
+
if (link.kind === "message" && link.role !== "tool_call" && link.role !== "tool_result") return false;
|
|
273
|
+
parent = link.parentTurnId;
|
|
274
|
+
}
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
|
|
255
278
|
/** Recover only complete, uniquely paired historical main-agent loads. Never consult current disk. */
|
|
256
279
|
export function captureSkillContext(
|
|
257
280
|
entries: ReadonlyArray<SessionEntry>,
|
|
@@ -337,7 +360,7 @@ export function captureSkillContext(
|
|
|
337
360
|
results.length !== 1 ||
|
|
338
361
|
resultEntry?.kind !== "message" ||
|
|
339
362
|
!turn.includes(resultEntry) ||
|
|
340
|
-
resultEntry
|
|
363
|
+
!resultFollowsCallInBatch(turn, resultEntry, call) ||
|
|
341
364
|
entry.parentTurnId !== request.turnId
|
|
342
365
|
)
|
|
343
366
|
return undefined;
|
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Token estimation for session entries
|
|
2
|
+
* Token estimation for session entries.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Uses shared context-accounting estimates for messages and character-based
|
|
5
|
+
* estimates for other context-bearing entries. Provider usage anchors measured
|
|
6
|
+
* prefixes when available. These estimates are approximate, not token ceilings.
|
|
7
|
+
* Pure functions, no I/O.
|
|
7
8
|
*
|
|
8
|
-
* Rationale for the heuristic (plan §3):
|
|
9
|
-
* - Conservative by design: over-estimating trips compaction earlier,
|
|
10
|
-
* never later. Missing a trigger and hitting provider overflow is
|
|
11
|
-
* expensive; running a compaction on 80k when actual was 95k is cheap.
|
|
12
|
-
* - pi-coding-agent ships it at scale, so we adopt the
|
|
13
|
-
* known ceiling rather than introduce a new numeric contract.
|
|
14
9
|
* - Exact per-provider counts (Anthropic /count_tokens, tiktoken) are
|
|
15
10
|
* parked. The `TokenEstimator` interface below keeps them a drop-in
|
|
16
11
|
* swap for a later phase.
|
|
@@ -92,7 +92,7 @@ export interface SessionContract {
|
|
|
92
92
|
append(turn: TurnInput): ClioTurnRecord;
|
|
93
93
|
/**
|
|
94
94
|
* Append a rich SessionEntry to the current session. Complements
|
|
95
|
-
* `append(turn)` for
|
|
95
|
+
* `append(turn)` for structured entry kinds (compactionSummary,
|
|
96
96
|
* branchSummary, modelChange, etc.). Old callers keep using `append`.
|
|
97
97
|
*/
|
|
98
98
|
appendEntry(entry: SessionEntryInput): SessionEntry;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Session cwd fallback resolver
|
|
2
|
+
* Session cwd fallback resolver.
|
|
3
3
|
*
|
|
4
4
|
* Pure guard used by the interactive layer when a session is resumed.
|
|
5
5
|
* `meta.cwd` is captured at session creation time; by the time the user
|
|
@@ -37,7 +37,7 @@ export const defaultFsProbe: FsProbe = {
|
|
|
37
37
|
/**
|
|
38
38
|
* Discriminated result the overlay layer branches on.
|
|
39
39
|
* - `no-cwd`: the meta record has no cwd field or it is blank after
|
|
40
|
-
* trimming.
|
|
40
|
+
* trimming. Incomplete legacy metadata can produce this result.
|
|
41
41
|
* - `missing`: cwd string is set but the directory does not exist on
|
|
42
42
|
* disk (fsProbe.exists returned false).
|
|
43
43
|
* - `not-a-directory`: the path exists but resolves to a file or a
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import { isAbsolute, normalize, relative, resolve } from "node:path";
|
|
25
|
+
import { effectiveToolCall } from "../../tools/surface.js";
|
|
25
26
|
import { decisionRationale } from "./decision-board.js";
|
|
26
27
|
import type { DecisionLedgerEntry, SessionEntry } from "./entries.js";
|
|
27
28
|
import { filterEntriesToActivePath } from "./tree/active-path.js";
|
|
@@ -369,7 +370,10 @@ function stringField(record: Record<string, unknown> | null, ...keys: string[]):
|
|
|
369
370
|
return null;
|
|
370
371
|
}
|
|
371
372
|
|
|
372
|
-
function pathFromCall(
|
|
373
|
+
function pathFromCall(recordedTool: string, recordedArgs: unknown, cwd: string | null, into: Set<string>): void {
|
|
374
|
+
// A gateway call is the capability it reached: an artifact written through
|
|
375
|
+
// the gateway touched the same path a direct artifact call would have.
|
|
376
|
+
const { toolName, args } = effectiveToolCall(recordedTool, recordedArgs);
|
|
373
377
|
if (!READ_LEDGER_TOOLS.has(toolName)) return;
|
|
374
378
|
const record = isRecord(args) ? args : null;
|
|
375
379
|
const named = stringField(record, "path", "file_path", "filePath");
|
|
@@ -95,6 +95,12 @@ function extractMessageText(payload: unknown): string | null {
|
|
|
95
95
|
* operator-authored remains, so the caller moves on to the next turn.
|
|
96
96
|
*/
|
|
97
97
|
function operatorTextOfUserPayload(payload: unknown): string | null {
|
|
98
|
+
// An expansion (prompt template, command) replaced the typed input. The
|
|
99
|
+
// typed input is the title; the expansion starts with generated scaffolding.
|
|
100
|
+
if (payload && typeof payload === "object" && typeof (payload as { displayText?: unknown }).displayText === "string") {
|
|
101
|
+
const typed = collapseWhitespace((payload as { displayText: string }).displayText);
|
|
102
|
+
if (typed.length > 0) return typed;
|
|
103
|
+
}
|
|
98
104
|
if (
|
|
99
105
|
payload &&
|
|
100
106
|
typeof payload === "object" &&
|
|
@@ -6,10 +6,12 @@ import {
|
|
|
6
6
|
type ClioTurnRecord,
|
|
7
7
|
createSession as engineCreateSession,
|
|
8
8
|
resumeSession as engineResumeSession,
|
|
9
|
+
openSession,
|
|
9
10
|
readSessionMeta,
|
|
10
11
|
type SessionTreeNode,
|
|
11
12
|
sessionPaths,
|
|
12
13
|
} from "../../engine/session.js";
|
|
14
|
+
import { collectSessionEntries } from "./compaction/session-entries.js";
|
|
13
15
|
import type { SessionEntryInput, SessionMeta, TurnInput } from "./contract.js";
|
|
14
16
|
import { isSessionEntry, type SessionEntry } from "./entries.js";
|
|
15
17
|
import { runMigrations } from "./migrations/index.js";
|
|
@@ -71,14 +73,19 @@ export function resumeSessionState(sessionId: string): {
|
|
|
71
73
|
const persistedMeta = readSessionMeta(sessionId) as SessionMeta;
|
|
72
74
|
const paths = sessionPaths(persistedMeta);
|
|
73
75
|
const migration = runMigrations(persistedMeta, paths.meta);
|
|
74
|
-
const
|
|
76
|
+
const candidate = openSession(sessionId);
|
|
77
|
+
// Use the replay schema before engineResumeSession clears endedAt or
|
|
78
|
+
// the domain caller parks its current writer. The engine reader retains
|
|
79
|
+
// its established tolerance for interrupted JSONL fragments.
|
|
80
|
+
collectSessionEntries(candidate.turns(), paths.current);
|
|
81
|
+
// The ledger needed no transformation; only the stamp moves, so the next
|
|
82
|
+
// reader does not re-run the same no-op. It lands in the same metadata
|
|
83
|
+
// publication that reopens the session.
|
|
84
|
+
const { meta, writer, tree } = engineResumeSession(
|
|
85
|
+
sessionId,
|
|
86
|
+
migration.migrated ? { sessionFormatVersion: migration.to } : {},
|
|
87
|
+
);
|
|
75
88
|
const state: SessionManagerState = { meta: meta as SessionMeta, writer };
|
|
76
|
-
if (migration.migrated) {
|
|
77
|
-
// The ledger needed no transformation; only the stamp moves, so the next
|
|
78
|
-
// reader does not re-run the same no-op.
|
|
79
|
-
state.meta.sessionFormatVersion = migration.to;
|
|
80
|
-
persistSessionMeta(state);
|
|
81
|
-
}
|
|
82
89
|
return { state, nodes: tree };
|
|
83
90
|
}
|
|
84
91
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Retry settings and countdown helper
|
|
2
|
+
* Retry settings and countdown helper.
|
|
3
3
|
*
|
|
4
4
|
* pi-agent-core surfaces provider failures as a terminal assistant message
|
|
5
5
|
* with `stopReason: "error"` + `errorMessage: <provider text>`. It does not
|
|
@@ -42,6 +42,7 @@ export const DEFAULT_RETRY_SETTINGS: RetrySettings = {
|
|
|
42
42
|
baseDelayMs: 2000,
|
|
43
43
|
maxDelayMs: 60000,
|
|
44
44
|
streamStallMs: 180000,
|
|
45
|
+
firstTokenStallMs: 600000,
|
|
45
46
|
};
|
|
46
47
|
|
|
47
48
|
/**
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isAbsolute, relative, resolve } from "node:path";
|
|
2
|
+
import { effectiveToolCall } from "../../tools/surface.js";
|
|
2
3
|
|
|
3
4
|
export type SessionArtifactTool = "artifact" | "write" | "edit";
|
|
4
5
|
export type SessionArtifactKind = "plan" | "review" | "report";
|
|
@@ -61,7 +62,13 @@ export function foldSessionArtifacts(
|
|
|
61
62
|
if (!isRecord(raw) || raw.kind !== "message" || raw.role !== "tool_result") continue;
|
|
62
63
|
if (typeof raw.turnId !== "string" || typeof raw.timestamp !== "string") continue;
|
|
63
64
|
const payload = raw.payload;
|
|
64
|
-
if (!isRecord(payload) ||
|
|
65
|
+
if (!isRecord(payload) || typeof payload.toolName !== "string") continue;
|
|
66
|
+
const result = payload.result;
|
|
67
|
+
const details = isRecord(result) && isRecord(result.details) ? result.details : null;
|
|
68
|
+
// An artifact written through the gateway is recorded under `gateway`
|
|
69
|
+
// with the capability stamped on its details; it is the same write.
|
|
70
|
+
const toolName = effectiveToolCall(payload.toolName, undefined, details ?? undefined).toolName;
|
|
71
|
+
if (!isSessionArtifactTool(toolName)) continue;
|
|
65
72
|
if (
|
|
66
73
|
payload.isError === true ||
|
|
67
74
|
payload.outcome === "error" ||
|
|
@@ -71,12 +78,10 @@ export function foldSessionArtifacts(
|
|
|
71
78
|
) {
|
|
72
79
|
continue;
|
|
73
80
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const artifactKind =
|
|
77
|
-
payload.toolName === "artifact" && isSessionArtifactKind(result.details.kind) ? result.details.kind : undefined;
|
|
81
|
+
if (!isRecord(result) || details === null || !Array.isArray(details.paths)) continue;
|
|
82
|
+
const artifactKind = toolName === "artifact" && isSessionArtifactKind(details.kind) ? details.kind : undefined;
|
|
78
83
|
const pathsSeenInResult = new Set<string>();
|
|
79
|
-
for (const recordedPath of
|
|
84
|
+
for (const recordedPath of details.paths) {
|
|
80
85
|
if (typeof recordedPath !== "string" || recordedPath.trim().length === 0) continue;
|
|
81
86
|
const normalized = normalizedWorkspacePath(recordedPath, workspace);
|
|
82
87
|
if (normalized === null || pathsSeenInResult.has(normalized)) continue;
|
|
@@ -86,7 +91,7 @@ export function foldSessionArtifacts(
|
|
|
86
91
|
writeIndex += 1;
|
|
87
92
|
lastByPath.set(normalized, {
|
|
88
93
|
path: recordedPath,
|
|
89
|
-
tool:
|
|
94
|
+
tool: toolName,
|
|
90
95
|
...(artifactKind ? { artifactKind } : {}),
|
|
91
96
|
turnId: raw.turnId,
|
|
92
97
|
timestamp: raw.timestamp,
|
|
@@ -9,9 +9,8 @@ import {
|
|
|
9
9
|
/**
|
|
10
10
|
* The session task board: the live state behind the `tasks` tool, the footer
|
|
11
11
|
* tasks row, and the /tasks overlay. Every mutation persists a full-snapshot
|
|
12
|
-
* `taskLedger` entry
|
|
13
|
-
*
|
|
14
|
-
* resume/fork without any side-car state.
|
|
12
|
+
* `taskLedger` entry, so the board is replayable from the JSONL alone and
|
|
13
|
+
* survives resume/fork without any side-car state.
|
|
15
14
|
*
|
|
16
15
|
* Shape mapping onto TaskLedgerEntry:
|
|
17
16
|
* - the board title is the single top-level goal
|
|
@@ -35,6 +35,7 @@ import type { LocalModelQuirks, SamplingProfile } from "../../domains/providers/
|
|
|
35
35
|
import type { LiteLLMTargetSettings, LmStudioTargetSettings } from "../../domains/providers/types/target-descriptor.js";
|
|
36
36
|
import { filterGemmaChannelStream, usesGemmaChannelMarkers } from "../gemma-channel-filter.js";
|
|
37
37
|
import { HarmonyResponseParser } from "../harmony-response.js";
|
|
38
|
+
import { captureErrorBody, restoreTruncatedErrorBody } from "../provider-error-body.js";
|
|
38
39
|
import { createSentinelStripper, stripTokenizerSentinels } from "../strip-tokenizer-sentinels.js";
|
|
39
40
|
import { ensureLlamaCppResidency } from "./llamacpp-residency.js";
|
|
40
41
|
import { ensureLmStudioResidency } from "./lmstudio.js";
|
|
@@ -110,6 +111,8 @@ interface ResponseModelIdCapture {
|
|
|
110
111
|
backendTimings: BackendCompletionTimings | null;
|
|
111
112
|
backendTimingsSource: BackendTimingsSource | null;
|
|
112
113
|
gatewayRouting: GatewayRoutingObservation | null;
|
|
114
|
+
/** Latest non-2xx body, read from a clone before the SDK truncates its copy. */
|
|
115
|
+
errorBody: Promise<string | null> | null;
|
|
113
116
|
buffer: string;
|
|
114
117
|
decoder: TextDecoder | null;
|
|
115
118
|
}
|
|
@@ -212,6 +215,7 @@ function captureResponseModelId(response: Response, capture: ResponseModelIdCapt
|
|
|
212
215
|
if (runtimeMetadata(model)?.runtimeId === "litellm") {
|
|
213
216
|
capture.gatewayRouting = liteLLMGatewayRoutingFromHeaders(response.headers);
|
|
214
217
|
}
|
|
218
|
+
if (!response.ok) capture.errorBody = captureErrorBody(response);
|
|
215
219
|
if (!response.body || !response.headers.get("content-type")?.toLowerCase().includes("text/event-stream")) {
|
|
216
220
|
return response;
|
|
217
221
|
}
|
|
@@ -247,6 +251,7 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
|
|
|
247
251
|
backendTimings: null,
|
|
248
252
|
backendTimingsSource: backendTimingsSourceForModel(model),
|
|
249
253
|
gatewayRouting: null,
|
|
254
|
+
errorBody: null,
|
|
250
255
|
buffer: "",
|
|
251
256
|
decoder: new TextDecoder(),
|
|
252
257
|
};
|
|
@@ -271,6 +276,9 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
|
|
|
271
276
|
if (capture.gatewayRouting !== null) event.message.gatewayRouting = capture.gatewayRouting;
|
|
272
277
|
if (capture.backendTimings !== null) event.message.backendTimings = capture.backendTimings;
|
|
273
278
|
} else if (event.type === "error") {
|
|
279
|
+
if (event.error.errorMessage !== undefined && capture.errorBody !== null) {
|
|
280
|
+
event.error.errorMessage = restoreTruncatedErrorBody(event.error.errorMessage, await capture.errorBody);
|
|
281
|
+
}
|
|
274
282
|
event.error.responseModelIdObservation = observation;
|
|
275
283
|
if (capture.gatewayRouting !== null) event.error.gatewayRouting = capture.gatewayRouting;
|
|
276
284
|
if (capture.backendTimings !== null) event.error.backendTimings = capture.backendTimings;
|
package/src/engine/loop-guard.ts
CHANGED
|
@@ -949,6 +949,13 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
949
949
|
return true;
|
|
950
950
|
},
|
|
951
951
|
evaluate(input): ReadonlyArray<MiddlewareEffect> {
|
|
952
|
+
// A nested invocation (the gateway calling the capability the model
|
|
953
|
+
// asked for) is the same model call the outer gateway occurrence
|
|
954
|
+
// already counted and fingerprinted. Counting it again would spend
|
|
955
|
+
// the worker cap and the turn budget twice per gateway call, and its
|
|
956
|
+
// inner fingerprint would never repeat across a model's retries the
|
|
957
|
+
// outer one does not already show.
|
|
958
|
+
if (input.metadata?.nested === true) return [];
|
|
952
959
|
if (input.hook === "after_tool") {
|
|
953
960
|
recordSuccessfulResult(input);
|
|
954
961
|
recordResultForStagnation(input);
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi-ai formats an HTTP error from the parsed JSON body and keeps only its first
|
|
3
|
+
* 4000 characters. Clio's fetch wrapper sees the same response first, so the
|
|
4
|
+
* discarded tail can be restored when the captured body provably is the one the
|
|
5
|
+
* SDK truncated. Anything else leaves the SDK diagnostic unchanged.
|
|
6
|
+
*/
|
|
7
|
+
const SDK_BODY_CHARS = 4000;
|
|
8
|
+
const SDK_MARKER = /\.\.\. \[truncated (\d+) chars\]/u;
|
|
9
|
+
/** Bounds both the capture read and the restored diagnostic kept in the ledger. */
|
|
10
|
+
export const MAX_RESTORED_ERROR_BODY_CHARS = 65_536;
|
|
11
|
+
const MAX_CAPTURE_BYTES = 4 * 1024 * 1024;
|
|
12
|
+
|
|
13
|
+
/** Read a clone so the SDK still owns the original body. Never throws. */
|
|
14
|
+
export async function captureErrorBody(response: Response): Promise<string | null> {
|
|
15
|
+
if (response.ok || response.body === null) return null;
|
|
16
|
+
try {
|
|
17
|
+
const reader = response.clone().body?.getReader();
|
|
18
|
+
if (reader === undefined) return null;
|
|
19
|
+
const decoder = new TextDecoder();
|
|
20
|
+
let text = "";
|
|
21
|
+
let bytes = 0;
|
|
22
|
+
for (;;) {
|
|
23
|
+
const { done, value } = await reader.read();
|
|
24
|
+
if (done) break;
|
|
25
|
+
bytes += value.byteLength;
|
|
26
|
+
// A body too large to hold cannot be compared exactly; keep the SDK text.
|
|
27
|
+
if (bytes > MAX_CAPTURE_BYTES) {
|
|
28
|
+
await reader.cancel().catch(() => {});
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
text += decoder.decode(value, { stream: true });
|
|
32
|
+
}
|
|
33
|
+
return text + decoder.decode();
|
|
34
|
+
} catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function restoreTruncatedErrorBody(message: string, capturedBody: string | null): string {
|
|
40
|
+
if (capturedBody === null) return message;
|
|
41
|
+
const marker = SDK_MARKER.exec(message);
|
|
42
|
+
if (marker === null || marker.index < SDK_BODY_CHARS) return message;
|
|
43
|
+
let parsed: unknown;
|
|
44
|
+
try {
|
|
45
|
+
parsed = JSON.parse(capturedBody);
|
|
46
|
+
} catch {
|
|
47
|
+
return message;
|
|
48
|
+
}
|
|
49
|
+
const start = marker.index - SDK_BODY_CHARS;
|
|
50
|
+
const kept = message.slice(start, marker.index);
|
|
51
|
+
const dropped = Number(marker[1]);
|
|
52
|
+
// The openai SDK exposes the body's `error` member when present, else the body.
|
|
53
|
+
const nested = typeof parsed === "object" && parsed !== null ? (parsed as { error?: unknown }).error : undefined;
|
|
54
|
+
for (const candidate of [nested, parsed]) {
|
|
55
|
+
if (typeof candidate !== "object" || candidate === null) continue;
|
|
56
|
+
const full = JSON.stringify(candidate).trim();
|
|
57
|
+
if (full.length - SDK_BODY_CHARS !== dropped || !full.startsWith(kept)) continue;
|
|
58
|
+
const restored =
|
|
59
|
+
full.length > MAX_RESTORED_ERROR_BODY_CHARS
|
|
60
|
+
? `${full.slice(0, MAX_RESTORED_ERROR_BODY_CHARS)}... [truncated ${full.length - MAX_RESTORED_ERROR_BODY_CHARS} chars]`
|
|
61
|
+
: full;
|
|
62
|
+
return `${message.slice(0, start)}${restored}${message.slice(marker.index + marker[0].length)}`;
|
|
63
|
+
}
|
|
64
|
+
return message;
|
|
65
|
+
}
|