@iowarp/clio-coder 0.4.7 → 0.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +111 -0
- package/CONTRIBUTING.md +83 -74
- package/README.md +69 -47
- package/dist/{acp-W3Y3TRHD.js → acp-ZWZCPS2A.js} +15 -15
- package/dist/{agents-J4ICNLQ3.js → agents-LYSOWZUE.js} +61 -59
- package/dist/assets/codewiki.json +1 -1
- package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
- package/dist/assets/web-notices/hono-LICENSE +21 -0
- package/dist/{auth-X2UJUMOC.js → auth-WBQGKWQ5.js} +27 -27
- package/dist/background-BUMOBAQN.js +37 -0
- package/dist/{builtins-XLXWWSRF.js → builtins-ODRJOEDI.js} +7 -7
- package/dist/{chunk-C3G5PNUO.js → chunk-2DRRZ57Q.js} +36 -27
- package/dist/chunk-2JBZYUPY.js +105 -0
- package/dist/chunk-2KUBKL63.js +336 -0
- package/dist/chunk-2VBWFXYE.js +198 -0
- package/dist/{chunk-XZ6UFQ52.js → chunk-2X2R3UTH.js} +25 -15
- package/dist/{chunk-M6Z2V6YU.js → chunk-37LW32LZ.js} +5 -5
- package/dist/{chunk-6LRLOJHQ.js → chunk-3AND2EFU.js} +11 -62
- package/dist/{chunk-FQOOGXBH.js → chunk-3RDHGNU7.js} +101 -33
- package/dist/{chunk-D2T66PDV.js → chunk-3SUDBGEI.js} +41 -208
- package/dist/{chunk-5AJPUR72.js → chunk-3TQN67I2.js} +9 -9
- package/dist/{chunk-LBFQMYS3.js → chunk-3U4BL2EV.js} +5 -3
- package/dist/{chunk-UFYNOQK4.js → chunk-3UQADNG2.js} +7 -7
- package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
- package/dist/{chunk-NO7J45X6.js → chunk-4ATBOFRP.js} +713 -218
- package/dist/{chunk-ECOMVOHP.js → chunk-4DNL43EZ.js} +3 -3
- package/dist/{chunk-WT5TRMO4.js → chunk-4HFJKRGZ.js} +255 -82
- package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
- package/dist/{chunk-WURGVOZJ.js → chunk-5RTEFNBP.js} +18 -14
- package/dist/{config-YXARKGTX.js → chunk-64XJW7NT.js} +24 -268
- package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
- package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
- package/dist/{chunk-MZNWZUJM.js → chunk-7FBCRWVT.js} +288 -288
- package/dist/{chunk-UA6W4XFJ.js → chunk-7JSOSVLP.js} +2 -2
- package/dist/chunk-7N3OLLSL.js +637 -0
- package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
- package/dist/{chunk-N37QC5FV.js → chunk-A6DULIMH.js} +21 -9
- package/dist/{fleet-decisions-S3PTZV2D.js → chunk-AB3QXXBC.js} +5 -41
- package/dist/chunk-ACCECAH4.js +49 -0
- package/dist/{chunk-CP3HIR5H.js → chunk-AM6CEP2K.js} +20 -19
- package/dist/chunk-AUHVBIDW.js +19 -0
- package/dist/{chunk-BQQ5MXUC.js → chunk-AY4XE6GN.js} +19 -13
- package/dist/{chunk-ISNCCX42.js → chunk-BBA2TAWV.js} +10 -9
- package/dist/chunk-BFPHMSK7.js +169 -0
- package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
- package/dist/{chunk-DO7M3LSX.js → chunk-BMNVVKEW.js} +40 -93
- package/dist/{chunk-VTYHHQ57.js → chunk-CTGZCEI6.js} +2 -2
- package/dist/{chunk-RTLNFZMD.js → chunk-DIAJYJYG.js} +3 -3
- package/dist/chunk-EHZRAB4U.js +63 -0
- package/dist/{chunk-KS7ETA3P.js → chunk-EM2DIQAJ.js} +3 -3
- package/dist/{chunk-MNQN3X6Y.js → chunk-ETF4ROKH.js} +5 -5
- package/dist/{chunk-WN552PKN.js → chunk-F2YM3JY4.js} +744 -1134
- package/dist/{chunk-7EEGBKV4.js → chunk-FEBQWHJT.js} +24 -19
- package/dist/{chunk-4QKAITQT.js → chunk-FPS4R2RN.js} +74 -10
- package/dist/chunk-G5R53COU.js +68 -0
- package/dist/chunk-GHXGMFQ5.js +40 -0
- package/dist/{chunk-GFQ7P2UF.js → chunk-GJDRMBDI.js} +10 -10
- package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
- package/dist/{chunk-NCCQ6DVS.js → chunk-GREYLTZ5.js} +8 -8
- package/dist/{chunk-HOX4YZ2K.js → chunk-H2WSCZZT.js} +19 -3
- package/dist/{chunk-3LXJOICS.js → chunk-H6IUCY6Q.js} +2 -2
- package/dist/{chunk-BO4XV5VX.js → chunk-H72DCH3E.js} +95 -206
- package/dist/{chunk-SEDI5K5B.js → chunk-H7TXJR23.js} +20 -20
- package/dist/chunk-HBJQQTKM.js +40 -0
- package/dist/chunk-HCVKSGNZ.js +990 -0
- package/dist/chunk-HVCAY2FH.js +67 -0
- package/dist/{chunk-34XHRVKG.js → chunk-I47EJPYL.js} +3 -3
- package/dist/{chunk-4N2RZ4TO.js → chunk-IALGWTLO.js} +3 -3
- package/dist/{chunk-IQCNVLO6.js → chunk-IALZJE37.js} +10 -7
- package/dist/{chunk-DLIYANB7.js → chunk-IC7JXLOM.js} +16 -11
- package/dist/{chunk-G4LGUTOE.js → chunk-IOSVTTCD.js} +5 -5
- package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
- package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
- package/dist/{chunk-TN5FW4XY.js → chunk-JIYWMQZ5.js} +12 -9
- package/dist/{chunk-T7QQBNLH.js → chunk-JKU34ACI.js} +10 -8
- package/dist/chunk-JOBN2YQQ.js +176 -0
- package/dist/chunk-JOL2QRLE.js +152 -0
- package/dist/{chunk-GXIWHXDB.js → chunk-JTR3VSV3.js} +3 -3
- package/dist/{chunk-T334FW2H.js → chunk-JU6MAMRJ.js} +7 -7
- package/dist/chunk-JURMQWVJ.js +15 -0
- package/dist/{chunk-CULVKYTK.js → chunk-K3XN4LZ4.js} +5 -5
- package/dist/{chunk-3T4DXWP6.js → chunk-KIVFXGBM.js} +27 -7
- package/dist/chunk-KKRXONXG.js +43 -0
- package/dist/{chunk-YPRSNUTC.js → chunk-KOAHT3N2.js} +2 -2
- package/dist/chunk-KP5BPXR3.js +73 -0
- package/dist/{chunk-UA3W4FGC.js → chunk-KRJQG47M.js} +6 -6
- package/dist/{chunk-GI5RRMAH.js → chunk-KW6OJ7IY.js} +19 -21
- package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
- package/dist/{chunk-MZHXENL7.js → chunk-L4RUTLRL.js} +8 -8
- package/dist/{chunk-P5SC4DLJ.js → chunk-LGTVWPRN.js} +2 -2
- package/dist/{chunk-65BGHOUR.js → chunk-LSQW6KZO.js} +5 -5
- package/dist/{chunk-TZHN5ITX.js → chunk-LWJYOHT3.js} +8 -8
- package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
- package/dist/chunk-MJ4QEJVT.js +185 -0
- package/dist/{chunk-T4TY5GG3.js → chunk-MO65K5CH.js} +5 -5
- package/dist/{chunk-TZ6UVP2H.js → chunk-MTOZEQHL.js} +8 -8
- package/dist/chunk-MZDPF35R.js +45 -0
- package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
- package/dist/{chunk-KAFMW7WM.js → chunk-NBPA5QM6.js} +2 -2
- package/dist/{chunk-EUEXGXXR.js → chunk-NMBEW4PP.js} +5 -5
- package/dist/{chunk-SELG4SUR.js → chunk-NPLLK3HO.js} +72 -89
- package/dist/{chunk-VCRVEDUC.js → chunk-NSYGPIVW.js} +5 -5
- package/dist/{context-7HJEWTTP.js → chunk-NXTV5OI5.js} +36 -90
- package/dist/{chunk-IMOD2YPV.js → chunk-NYDG4QP4.js} +9 -19
- package/dist/{chunk-6CA2BHOR.js → chunk-OA2GDACN.js} +5 -5
- package/dist/{chunk-A67NR5AT.js → chunk-PJI57EC6.js} +14 -11
- package/dist/{chunk-IJMW64DX.js → chunk-PJJBUGMR.js} +50 -50
- package/dist/{chunk-CPXGJI2A.js → chunk-PNJE7JPS.js} +20 -5
- package/dist/chunk-PP23PZEV.js +1347 -0
- package/dist/chunk-PPIFDSBK.js +409 -0
- package/dist/{chunk-T52TPHYC.js → chunk-PTFISXQO.js} +8 -7
- package/dist/{chunk-C6GEXX4L.js → chunk-QB33Z5S7.js} +5 -5
- package/dist/{chunk-VMATUZB6.js → chunk-QGNII5VC.js} +10 -10
- package/dist/{chunk-TLTGZTXI.js → chunk-QI72X67S.js} +104 -27
- package/dist/chunk-QKHZZFKH.js +98 -0
- package/dist/{chunk-PFLOULP3.js → chunk-RDKX2PME.js} +4 -4
- package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
- package/dist/chunk-RPMNIFRY.js +65 -0
- package/dist/{chunk-L3Z5ANCV.js → chunk-RQROVOV3.js} +13 -11
- package/dist/{chunk-6YHPAAZR.js → chunk-S34A7BSP.js} +3 -3
- package/dist/{chunk-5ZSZEYJK.js → chunk-SJETVJHX.js} +2 -2
- package/dist/{chunk-77CZRFTE.js → chunk-SJMNU4ZS.js} +2 -2
- package/dist/chunk-SLLG2G44.js +85 -0
- package/dist/{chunk-GVZFCJHE.js → chunk-SQAZN2V3.js} +48 -22
- package/dist/{chunk-2O2LVQQK.js → chunk-SQBT46OF.js} +2 -2
- package/dist/{chunk-ZGIGW4ZG.js → chunk-TCUOGIL2.js} +5 -5
- package/dist/{chunk-DACXIVVF.js → chunk-TIWPKCVO.js} +5 -5
- package/dist/{chunk-5CMARGPF.js → chunk-UIU7MGZ3.js} +11 -2
- package/dist/chunk-USBBEKHW.js +177 -0
- package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
- package/dist/{chunk-MBJO5VNZ.js → chunk-VPWGADBG.js} +33 -33
- package/dist/{chunk-UUQ5G6EZ.js → chunk-VWFCAK34.js} +6 -6
- package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
- package/dist/{chunk-4MFBBY2Z.js → chunk-W72LLZAV.js} +3 -3
- package/dist/{chunk-4UHVS5T7.js → chunk-WGRDABW7.js} +8 -8
- package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
- package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
- package/dist/{chunk-6YA46L5A.js → chunk-XFLSL7BT.js} +2 -2
- package/dist/{chunk-QKWL7SYE.js → chunk-XJZEDCNT.js} +50 -39
- package/dist/{chunk-UWD3JD5X.js → chunk-XLLEL3K7.js} +10 -10
- package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
- package/dist/chunk-XNZWWDC3.js +686 -0
- package/dist/{chunk-WBVKKTUT.js → chunk-XRECG65F.js} +2 -2
- package/dist/chunk-XTQ7MEJG.js +457 -0
- package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
- package/dist/{chunk-WB7POC6M.js → chunk-Y3M2T5RO.js} +6 -6
- package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
- package/dist/{chunk-EUZRMP4Y.js → chunk-YPQOPFP7.js} +20 -20
- package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
- package/dist/{chunk-BAU36233.js → chunk-YQYINEJI.js} +9 -9
- package/dist/{chunk-CE64C5K5.js → chunk-ZF6CV4WZ.js} +1356 -235
- package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
- package/dist/{chunk-IZYTT3CD.js → chunk-ZKQ63XZ5.js} +16 -39
- package/dist/{chunk-6TAATXXH.js → chunk-ZKVMDNAN.js} +7 -7
- package/dist/chunk-ZST3FRCV.js +132 -0
- package/dist/cli/index.js +50 -38
- package/dist/{clio-L2P7S2R2.js → clio-JUDCLNHC.js} +11 -11
- package/dist/clio-context-tools-FT672MNZ.js +136 -0
- package/dist/{code-nav-B5LNX4KU.js → code-nav-7OVCTP2Z.js} +39 -37
- package/dist/{components-63MMQKUT.js → components-OZXZMDWU.js} +11 -11
- package/dist/config-P3ZQVF63.js +275 -0
- package/dist/config-graph-GKAOBAS5.js +160 -0
- package/dist/{configure-LMVQJ46J.js → configure-25LRYZJG.js} +56 -55
- package/dist/context-72VQV7JX.js +73 -0
- package/dist/{context-YG2LZDYZ.js → context-COWRWXP3.js} +89 -83
- package/dist/{context-XSZKKFBW.js → context-WB3D474G.js} +16 -16
- package/dist/{context-clear-AC5NXHM2.js → context-clear-Y4LYMWC6.js} +88 -82
- package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
- package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
- package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-TMZYVC7A.js} +27 -25
- package/dist/data-tool-KMBWKKWR.js +2987 -0
- package/dist/{detail-H73BEF2N.js → detail-4GLROGY5.js} +89 -83
- package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-TR3LBP5P.js} +113 -107
- package/dist/docs-ZK777W2G.js +101 -0
- package/dist/{doctor-EQYJOGUG.js → doctor-WC4OV2OB.js} +76 -73
- package/dist/{eval-4P7O6CCE.js → eval-FUNWJNUJ.js} +88 -73
- package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
- package/dist/evals-L73EBHSU.js +104 -0
- package/dist/{evidence-O76QF7TZ.js → evidence-AVJ2RTHX.js} +99 -93
- package/dist/{evidence-D6GUSYJW.js → evidence-P4NZOAK7.js} +88 -82
- package/dist/evidence-Y55WKYHH.js +246 -0
- package/dist/{evolve-H47BCETS.js → evolve-MAWKRYWF.js} +93 -87
- package/dist/{extensions-NNL3ZOCU.js → extensions-PYQH3H47.js} +14 -13
- package/dist/fleet-M4H2QBWT.js +268 -0
- package/dist/{fleet-KMNS6NOM.js → fleet-ULBXXRDR.js} +146 -138
- package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-7NNC4JZU.js} +18 -17
- package/dist/fleet-decisions-EHEY7KPU.js +52 -0
- package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-LQ2AHZT3.js} +24 -24
- package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-5IGBIIYZ.js} +98 -258
- package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-UTTNOKMG.js} +9 -4
- package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-YGILJKA6.js} +29 -29
- package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-AUWTCDKR.js} +88 -82
- package/dist/{fleet-view-BHJFW26B.js → fleet-view-TGUFCY5A.js} +90 -84
- package/dist/{init-XAT5N5YM.js → init-GFN2Z7NF.js} +111 -104
- package/dist/install-6PIF6F6W.js +19 -0
- package/dist/{interop-FVECHFKG.js → interop-EF5JUWWK.js} +29 -29
- package/dist/{inventory-7KFQGLCV.js → inventory-I6VJDDYF.js} +90 -84
- package/dist/library-3J5IO2OJ.js +75 -0
- package/dist/{library-QAPAO23R.js → library-IJTOFTDS.js} +20 -19
- package/dist/{library-NY2XOT75.js → library-Z3KZSHPE.js} +35 -35
- package/dist/{library-import-5Y6MAS3R.js → library-import-IMKFLDHX.js} +29 -29
- package/dist/{library-inventory-JT6HWITQ.js → library-inventory-CQP5D6GU.js} +21 -21
- package/dist/{library-validation-EQUH25DC.js → library-validation-33UTX7AI.js} +19 -19
- package/dist/mcp-5FWZKUS6.js +26 -0
- package/dist/{memory-DYVTTCP6.js → memory-36CWN67Y.js} +93 -87
- package/dist/{models-MASFJ6Y2.js → models-KQ6PQJJQ.js} +57 -56
- package/dist/{monitor-YMP4NXJJ.js → monitor-XX6ZD6KC.js} +98 -91
- package/dist/{orchestrator-AFQRRTEI.js → orchestrator-SK6HDAOP.js} +1537 -832
- package/dist/{panes-NICTHQCV.js → panes-L27QRXUH.js} +14 -14
- package/dist/{panes-D3Y2KFG5.js → panes-LXZIWNOZ.js} +4 -4
- package/dist/{paths-PSFAUIGO.js → paths-7DJDU4P4.js} +6 -6
- package/dist/{preload-5Q7VXRFJ.js → preload-K2TDYI4Y.js} +88 -82
- package/dist/{reset-7NKZK7JN.js → reset-73VU3XNT.js} +13 -13
- package/dist/{resources-NILSIZAT.js → resources-3BYJYVYL.js} +24 -24
- package/dist/{run-BPZGEBZV.js → run-AR7PY6GW.js} +144 -136
- package/dist/run-script-H2KUDIII.js +41 -0
- package/dist/settings-3VMBMWID.js +72 -0
- package/dist/{share-EZ6ERBMH.js → share-HVWH4FPF.js} +30 -30
- package/dist/{skills-BTVVNYVM.js → skills-5TYEY75Q.js} +30 -30
- package/dist/{skills-eval-UY34MNK7.js → skills-eval-CK3MD63Z.js} +114 -103
- package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-KSFYG3I6.js} +24 -24
- package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-DMVHML7P.js} +60 -57
- package/dist/{steer-2B3EQGFH.js → steer-XCD6V3EW.js} +4 -4
- package/dist/{support-L2SOL3IE.js → support-JAZL6VBR.js} +7 -7
- package/dist/system-3TDQRMZZ.js +116 -0
- package/dist/{targets-44VKGFLN.js → targets-EZKHAYRN.js} +74 -72
- package/dist/{tasks-3KODKFU7.js → tasks-SNEFHWYW.js} +18 -18
- package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-BNLFA4OF.js} +8 -7
- package/dist/{tools-3UB7TEVR.js → tools-7IM6BDCE.js} +12 -12
- package/dist/{trace-TAMIU4OJ.js → trace-C3MBGD4S.js} +16 -65
- package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
- package/dist/{uninstall-QYVRPEM4.js → uninstall-WWLOSZ42.js} +35 -10
- package/dist/{upgrade-7PMKM2JH.js → upgrade-ETK2JNSJ.js} +42 -51
- package/dist/{usage-6EQV7EQK.js → usage-S2HOB7BZ.js} +112 -102
- package/dist/{verifiers-JLITWSHU.js → verifiers-QDTEVH7R.js} +26 -24
- package/dist/{verify-T7NAEVIG.js → verify-SUKUK6XM.js} +16 -15
- package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
- package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +1 -0
- package/dist/web/client/assets/arc-Pry-7G1_.js +1 -0
- package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
- package/dist/web/client/assets/array-BifhSqXX.js +1 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
- package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +129 -0
- package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +38 -0
- package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
- package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +62 -0
- package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +2 -0
- package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
- package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +1 -0
- package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
- package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +72 -0
- package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +1 -0
- package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +231 -0
- package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +1 -0
- package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +10 -0
- package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +1 -0
- package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +1 -0
- package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +1 -0
- package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +168 -0
- package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +88 -0
- package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +206 -0
- package/dist/web/client/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
- package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
- package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +1 -0
- package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +62 -0
- package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
- package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
- package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +4 -0
- package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +30 -0
- package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +41 -0
- package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +3 -0
- package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +24 -0
- package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +24 -0
- package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +1 -0
- package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +99 -0
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
- package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
- package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
- package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +1 -0
- package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +106 -0
- package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
- package/dist/web/client/assets/index-Dsi52apB.css +1 -0
- package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +1 -0
- package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +2 -0
- package/dist/web/client/assets/init-C-OQMol4.js +1 -0
- package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +70 -0
- package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +139 -0
- package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +89 -0
- package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
- package/dist/web/client/assets/line-BIDAcEtX.js +1 -0
- package/dist/web/client/assets/linear-SzVmGSw4.js +1 -0
- package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +7 -0
- package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +44 -0
- package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +96 -0
- package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
- package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
- package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
- package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +1 -0
- package/dist/web/client/assets/path-fybaL0A-.js +1 -0
- package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +1 -0
- package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +1 -0
- package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +39 -0
- package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
- package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
- package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
- package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
- package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
- package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
- package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
- package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
- package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
- package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
- package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
- package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
- package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
- package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
- package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
- package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
- package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
- package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
- package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
- package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
- package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
- package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
- package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
- package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
- package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
- package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
- package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
- package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
- package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
- package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
- package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +7 -0
- package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +1 -0
- package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +1 -0
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
- package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +1 -0
- package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +84 -0
- package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +40 -0
- package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +162 -0
- package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
- package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +1 -0
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
- package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +1 -0
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
- package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +120 -0
- package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +1 -0
- package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +1 -0
- package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +34 -0
- package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +1 -0
- package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +78 -0
- package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +7 -0
- package/dist/web/client/clio-coder-logo.webp +0 -0
- package/dist/web/client/icon-192.png +0 -0
- package/dist/web/client/icon-512.png +0 -0
- package/dist/web/client/index.html +6 -0
- package/dist/web/client/manifest.webmanifest +15 -0
- package/dist/web/client/offline.css +55 -0
- package/dist/web/client/offline.html +5 -0
- package/dist/web/client/offline.js +27 -0
- package/dist/web/client/sw.js +34 -0
- package/dist/web/ops-worker.js +37 -0
- package/dist/web/reads-worker.js +1726 -0
- package/dist/web/server.js +8499 -0
- package/dist/web-EMGUGGEI.js +13 -0
- package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-6BRRVQON.js} +22 -5
- package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-XHSJTDOP.js} +120 -113
- package/dist/{with-panes-CHFC7HGI.js → with-panes-Z6BTEHMZ.js} +12 -12
- package/dist/worker/entry.js +113 -99
- package/docs/README.md +28 -27
- package/docs/architecture/acp.md +5 -9
- package/docs/architecture/alcf-provider.md +0 -3
- package/docs/architecture/architecture.md +0 -3
- package/docs/architecture/artifact-placement.md +12 -4
- package/docs/architecture/artifact-versions.md +0 -3
- package/docs/architecture/capacity-and-scheduling.md +0 -3
- package/docs/architecture/context-engine.md +0 -3
- package/docs/architecture/context-working-set.md +0 -3
- package/docs/architecture/dispatch-architecture-rationale.md +0 -3
- package/docs/architecture/dispatch-typed-intent.md +0 -3
- package/docs/architecture/evidence-and-memory.md +0 -3
- package/docs/architecture/library.md +1 -3
- package/docs/architecture/middleware-and-components.md +0 -3
- package/docs/architecture/model-catalog.md +1 -4
- package/docs/architecture/observability.md +0 -3
- package/docs/architecture/pi-boundary.md +6 -9
- package/docs/architecture/prompt-envelope-and-tools.md +37 -30
- package/docs/architecture/provider-adapter-cookbook.md +1 -4
- package/docs/architecture/safety-model.md +19 -9
- package/docs/architecture/session-lifecycle.md +10 -7
- package/docs/architecture/time-conventions.md +0 -3
- package/docs/architecture/trace-store.md +28 -20
- package/docs/architecture/tui-design.md +38 -18
- package/docs/architecture/worker-context.md +1 -3
- package/docs/architecture/worker-dispatch-mechanics.md +1 -4
- package/docs/guide/authoring-plugins.md +1 -3
- package/docs/guide/built-in-agents.md +0 -3
- package/docs/guide/commands-and-modes.md +41 -25
- package/docs/guide/configuration-and-targets.md +204 -9
- package/docs/guide/configuration-reference.md +125 -17
- package/docs/guide/environment-variables.md +2 -8
- package/docs/guide/exit-codes-and-output.md +0 -3
- package/docs/guide/extensions-and-sharing.md +0 -3
- package/docs/guide/fleet-dispatch.md +3 -5
- package/docs/guide/glossary.md +1 -4
- package/docs/guide/harness-extensions.md +0 -2
- package/docs/guide/installation-and-lifecycle.md +3 -6
- package/docs/guide/interop.md +0 -2
- package/docs/guide/panes-and-files.md +0 -3
- package/docs/guide/plugins.md +0 -3
- package/docs/guide/proactive-memory.md +0 -3
- package/docs/guide/resource-library.md +1 -3
- package/docs/guide/skills-marketplace.md +0 -2
- package/docs/guide/tool-usage.md +166 -67
- package/docs/guide/troubleshooting.md +1 -4
- package/docs/history/config-knobs-audit.md +0 -3
- package/docs/history/release-cut-checklist.md +0 -3
- package/docs/process/development-pipeline.md +0 -3
- package/docs/process/documentation-coverage.md +3 -3
- package/docs/process/documentation-guide.md +16 -22
- package/docs/process/eval-runner.md +0 -3
- package/docs/process/evals-internal.md +0 -3
- package/docs/process/evolution.md +0 -3
- package/docs/process/fleet-demo-runbook.md +6 -9
- package/docs/process/git-commit-provenance.md +0 -3
- package/docs/process/performance-methodology.md +1 -4
- package/docs/process/release-cut-checklist.md +114 -221
- package/docs/process/scientific-validation.md +23 -6
- package/docs/process/tool-audit-v0.4.9.md +357 -0
- package/library/registry.yaml +2 -2
- package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
- package/library/skills/meta/clio-coder-test/evals.md +16 -2
- package/library/skills/meta/clio-coder-test/plugin.json +1 -1
- package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
- package/library/skills/registry.yaml +2 -2
- package/library/skills/skill-marketplace.json +1 -1
- package/package.json +13 -11
- package/src/cli/argv.ts +31 -0
- package/src/cli/clio.ts +17 -13
- package/src/cli/config.ts +4 -0
- package/src/cli/docs.ts +65 -328
- package/src/cli/doctor-panes.ts +1 -1
- package/src/cli/doctor.ts +3 -1
- package/src/cli/index.ts +17 -2
- package/src/cli/mcp.ts +106 -0
- package/src/cli/skills-eval.ts +8 -2
- package/src/cli/trace.ts +4 -65
- package/src/cli/uninstall.ts +26 -0
- package/src/cli/upgrade.ts +34 -38
- package/src/cli/usage.ts +3 -0
- package/src/cli/verifiers.ts +1 -1
- package/src/cli/web.ts +79 -0
- package/src/core/bash-exec.ts +27 -4
- package/src/core/bus-events.ts +3 -4
- package/src/core/config.ts +73 -1
- package/src/core/defaults.ts +10 -1
- package/src/core/domain-loader.ts +37 -28
- package/src/core/event-bus.ts +1 -1
- package/src/core/run-records.ts +438 -0
- package/src/core/safe-exec.ts +506 -56
- package/src/core/skill-activation.ts +5 -3
- package/src/core/termination.ts +16 -12
- package/src/core/tool-names.ts +33 -12
- package/src/domains/agents/contract.ts +1 -1
- package/src/domains/agents/extension.ts +18 -10
- package/src/domains/config/extension.ts +5 -4
- package/src/domains/context/clio-md.ts +1 -1
- package/src/domains/context/worker/pressure.ts +6 -2
- package/src/domains/context/working-set/path-index.ts +7 -2
- package/src/domains/dispatch/code-step.ts +7 -2
- package/src/domains/dispatch/contract.ts +7 -0
- package/src/domains/dispatch/execution-role.ts +3 -3
- package/src/domains/dispatch/execution-scheduler.ts +204 -79
- package/src/domains/dispatch/extension.ts +206 -26
- package/src/domains/dispatch/fleet-preflight.ts +18 -3
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/gate-decisions.ts +3 -3
- package/src/domains/dispatch/heartbeat.ts +1 -1
- package/src/domains/dispatch/host-verification.ts +16 -14
- package/src/domains/dispatch/index.ts +1 -0
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-findings.ts +3 -4
- package/src/domains/dispatch/receipt-integrity.ts +3 -0
- package/src/domains/dispatch/reservation-store.ts +7 -9
- package/src/domains/dispatch/route-facts.ts +1 -1
- package/src/domains/dispatch/state.ts +4 -5
- package/src/domains/dispatch/types.ts +3 -1
- package/src/domains/eval/metrics/tracked.ts +22 -2
- package/src/domains/evidence/build.ts +35 -7
- package/src/domains/extensions/operator-runtime.ts +3 -1
- package/src/domains/gateway/mcp/client.ts +923 -0
- package/src/domains/gateway/mcp/config.ts +456 -0
- package/src/domains/gateway/mcp/index.ts +88 -0
- package/src/domains/gateway/mcp/protocol.ts +273 -0
- package/src/domains/gateway/mcp/trust.ts +263 -0
- package/src/domains/lifecycle/doctor.ts +17 -3
- package/src/domains/middleware/hooks.ts +2 -2
- package/src/domains/mux/contract.ts +5 -9
- package/src/domains/mux/detect.ts +1 -1
- package/src/domains/mux/extension.ts +1 -1
- package/src/domains/mux/protocol.ts +5 -7
- package/src/domains/mux/socket-client.ts +3 -3
- package/src/domains/observability/accountability.ts +2 -2
- package/src/domains/observability/background-memory-usage.ts +3 -0
- package/src/domains/observability/compaction-usage.ts +2 -0
- package/src/domains/observability/contract.ts +7 -3
- package/src/domains/observability/cost.ts +5 -0
- package/src/domains/observability/evidence-index.ts +2 -2
- package/src/domains/observability/extension.ts +1 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -0
- package/src/domains/observability/projection.ts +10 -0
- package/src/domains/observability/trace-store.ts +65 -5
- package/src/domains/prompts/compiler.ts +41 -23
- package/src/domains/prompts/extension.ts +4 -17
- package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
- package/src/domains/prompts/fragments/operating/skills.md +12 -10
- package/src/domains/providers/cache-deployment.ts +147 -0
- package/src/domains/providers/catalog.ts +12 -7
- package/src/domains/providers/extension.ts +27 -5
- package/src/domains/providers/index.ts +6 -1
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
- package/src/domains/providers/plugins.ts +3 -13
- package/src/domains/providers/probe/http.ts +44 -59
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
- package/src/domains/providers/types/target-descriptor.ts +17 -0
- package/src/domains/safety/action-classifier.ts +17 -1
- package/src/domains/safety/call-target.ts +14 -0
- package/src/domains/safety/contract.ts +1 -1
- package/src/domains/safety/finish-contract.ts +9 -3
- package/src/domains/safety/loop-detector.ts +1 -1
- package/src/domains/safety/policy-engine.ts +7 -0
- package/src/domains/safety/protected-artifacts.ts +3 -4
- package/src/domains/safety/rejection-feedback.ts +1 -1
- package/src/domains/safety/scope.ts +2 -3
- package/src/domains/safety/validation-contract.ts +3 -2
- package/src/domains/scheduling/budget.ts +5 -3
- package/src/domains/scheduling/contract.ts +2 -1
- package/src/domains/scheduling/extension.ts +3 -3
- package/src/domains/session/compaction/branch-summary.ts +1 -1
- package/src/domains/session/compaction/compact.ts +29 -3
- package/src/domains/session/compaction/cut-point.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +5 -10
- package/src/domains/session/contract.ts +1 -1
- package/src/domains/session/cwd-fallback.ts +2 -2
- package/src/domains/session/entries.ts +1 -0
- package/src/domains/session/handoff.ts +5 -1
- package/src/domains/session/history.ts +6 -0
- package/src/domains/session/manager.ts +14 -7
- package/src/domains/session/retry.ts +2 -1
- package/src/domains/session/session-artifacts.ts +12 -7
- package/src/domains/session/task-board.ts +2 -3
- package/src/domains/session/usage.ts +6 -7
- package/src/engine/acp/server.ts +11 -0
- package/src/engine/ai.ts +2 -0
- package/src/engine/apis/openai-completions.ts +17 -4
- package/src/engine/loop-guard.ts +7 -0
- package/src/engine/prewarm.ts +232 -0
- package/src/engine/provider-diagnostics.ts +6 -1
- package/src/engine/provider-error-body.ts +65 -0
- package/src/engine/session.ts +118 -29
- package/src/engine/worker-runtime.ts +3 -0
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +38 -18
- package/src/interactive/chat-loop-messages.ts +3 -0
- package/src/interactive/chat-loop-policy.ts +1 -0
- package/src/interactive/chat-loop.ts +10 -12
- package/src/interactive/chat-panel.ts +23 -9
- package/src/interactive/chat-renderer.ts +33 -11
- package/src/interactive/clio-editor.ts +13 -5
- package/src/interactive/dispatch-board.ts +70 -30
- package/src/interactive/editor-submit.ts +30 -25
- package/src/interactive/footer/widgets.ts +12 -9
- package/src/interactive/interactive-presentation.ts +2 -3
- package/src/interactive/mux-bridge.ts +3 -7
- package/src/interactive/overlay-general-openers.ts +14 -7
- package/src/interactive/overlays/cwd-fallback.ts +1 -1
- package/src/interactive/overlays/library-model.ts +114 -35
- package/src/interactive/overlays/library.ts +52 -5
- package/src/interactive/overlays/list-overlay.ts +4 -1
- package/src/interactive/overlays/session-selector.ts +28 -23
- package/src/interactive/overlays/settings.ts +20 -1
- package/src/interactive/overlays/tree-selector.ts +47 -10
- package/src/interactive/panes-runtime.ts +1 -1
- package/src/interactive/prewarm.ts +11 -197
- package/src/interactive/renderers/compaction-summary.ts +1 -1
- package/src/interactive/renderers/provider-error.ts +118 -0
- package/src/interactive/renderers/retry-status.ts +59 -23
- package/src/interactive/renderers/tool-execution.ts +67 -7
- package/src/interactive/renderers/worker-answer.ts +198 -0
- package/src/interactive/renderers/worker-entry.ts +57 -163
- package/src/interactive/session-usage-reseed.ts +2 -0
- package/src/interactive/side-question.ts +2 -0
- package/src/interactive/slash-commands.ts +26 -1
- package/src/interactive/slash-spec.ts +2 -2
- package/src/interactive/theme/labels.ts +66 -30
- package/src/interactive/turn-context.ts +1 -0
- package/src/interactive/turn-persistence.ts +9 -1
- package/src/interactive/turn-prewarm.ts +126 -19
- package/src/interactive/turn-recovery.ts +2 -1
- package/src/interactive/turn-runtime.ts +36 -5
- package/src/interactive/view/artifacts.ts +3 -2
- package/src/interactive/view/view-overlay.ts +96 -20
- package/src/tools/agent-tools.ts +21 -7
- package/src/tools/artifact.ts +16 -8
- package/src/tools/bash.ts +90 -11
- package/src/tools/bootstrap.ts +42 -4
- package/src/tools/builtin-tool-catalog.ts +80 -11
- package/src/tools/context/index.ts +27 -31
- package/src/tools/context/library.ts +3 -1
- package/src/tools/context/surface.ts +12 -26
- package/src/tools/core-bootstrap.ts +72 -1
- package/src/tools/data/csv.ts +1189 -0
- package/src/tools/data/index.ts +308 -0
- package/src/tools/data/json.ts +1799 -0
- package/src/tools/data/jsonl.ts +561 -0
- package/src/tools/data/shared.ts +452 -0
- package/src/tools/edit-diff.ts +0 -7
- package/src/tools/edit.ts +115 -18
- package/src/tools/file-mutation-queue.ts +114 -4
- package/src/tools/find.ts +108 -29
- package/src/tools/gateway/caps.ts +11 -0
- package/src/tools/gateway/clio-context-surface.ts +41 -0
- package/src/tools/gateway/clio-context-tools.ts +77 -0
- package/src/tools/gateway/data-surface.ts +138 -0
- package/src/tools/gateway/data-tool.ts +201 -0
- package/src/tools/gateway/index.ts +342 -0
- package/src/tools/gateway/mcp-capabilities.ts +469 -0
- package/src/tools/grep.ts +88 -33
- package/src/tools/harness-extensions.ts +3 -0
- package/src/tools/ignore-policy.ts +7 -5
- package/src/tools/ls.ts +111 -20
- package/src/tools/policy.ts +35 -13
- package/src/tools/presentation.ts +6 -0
- package/src/tools/read.ts +634 -156
- package/src/tools/registry.ts +106 -8
- package/src/tools/run-script.ts +997 -0
- package/src/tools/spawn-hygiene.ts +157 -5
- package/src/tools/surface.ts +163 -0
- package/src/tools/verify/authoring.ts +8 -3
- package/src/tools/verify/catalog.ts +14 -1
- package/src/tools/verify/numeric.ts +367 -59
- package/src/tools/verify/perf.ts +171 -9
- package/src/tools/verify/scripts.ts +178 -26
- package/src/tools/web-fetch-surface.ts +22 -0
- package/src/tools/web-fetch.ts +26 -1
- package/src/tools/write.ts +45 -19
- package/src/worker/spec-contract.ts +27 -0
- package/dist/chunk-B6UM3OZC.js +0 -15
- package/dist/chunk-GJ24ODAX.js +0 -196
- package/dist/chunk-HRAKUPIH.js +0 -57
- package/dist/docs-BL7ROUFN.js +0 -292
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { sanitizeCallTargetText } from "../../domains/safety/call-target.js";
|
|
1
2
|
import {
|
|
2
3
|
type Component,
|
|
3
|
-
fuzzyFilter,
|
|
4
4
|
Input,
|
|
5
5
|
Markdown,
|
|
6
6
|
matchesKey,
|
|
@@ -168,10 +168,6 @@ function isNonEmptySearchValue(value: string | undefined): value is string {
|
|
|
168
168
|
return typeof value === "string" && value.trim().length > 0;
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
-
function broadFilterText(artifact: ViewArtifact): string {
|
|
172
|
-
return `${artifact.id} ${artifact.category} ${artifact.title}`;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
171
|
function artifactSearchValues(artifact: ViewArtifact): string[] {
|
|
176
172
|
return [
|
|
177
173
|
artifact.id,
|
|
@@ -188,8 +184,12 @@ function artifactSearchValues(artifact: ViewArtifact): string[] {
|
|
|
188
184
|
].filter(isNonEmptySearchValue);
|
|
189
185
|
}
|
|
190
186
|
|
|
191
|
-
function
|
|
192
|
-
|
|
187
|
+
function matchesFilterText(artifact: ViewArtifact, query: string): boolean {
|
|
188
|
+
const values = artifactSearchValues(artifact).map((value) => value.toLocaleLowerCase());
|
|
189
|
+
return query
|
|
190
|
+
.toLocaleLowerCase()
|
|
191
|
+
.split(/\s+/u)
|
|
192
|
+
.every((token) => values.some((value) => value.includes(token)));
|
|
193
193
|
}
|
|
194
194
|
|
|
195
195
|
function matchesExactArtifactValue(artifact: ViewArtifact, value: string): boolean {
|
|
@@ -225,10 +225,10 @@ function filterViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>, query: stri
|
|
|
225
225
|
if (parsed.kind === "category") {
|
|
226
226
|
const categoryArtifacts = artifacts.filter((artifact) => artifact.category === parsed.category);
|
|
227
227
|
if (parsed.value.length === 0) return categoryArtifacts;
|
|
228
|
-
return
|
|
228
|
+
return categoryArtifacts.filter((artifact) => matchesFilterText(artifact, parsed.value));
|
|
229
229
|
}
|
|
230
230
|
if (parsed.text.length === 0) return [...artifacts];
|
|
231
|
-
return
|
|
231
|
+
return artifacts.filter((artifact) => matchesFilterText(artifact, parsed.text));
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
function artifactsInCategoryOrder(artifacts: ReadonlyArray<ViewArtifact>): ViewArtifact[] {
|
|
@@ -418,6 +418,7 @@ function viewFooterHint(focus: ViewPaneFocus, canVerify: boolean, innerWidth?: n
|
|
|
418
418
|
{ key: "PgUp/PgDn", verb: "page" },
|
|
419
419
|
{ key: "g/G", verb: "top/bottom" },
|
|
420
420
|
...(canVerify ? [{ key: "v", verb: "verify" }] : []),
|
|
421
|
+
{ key: "i", verb: "info" },
|
|
421
422
|
{ key: "o", verb: "path" },
|
|
422
423
|
],
|
|
423
424
|
"back",
|
|
@@ -446,31 +447,44 @@ export class ViewOverlayView implements Component {
|
|
|
446
447
|
private artifactError: string | null = null;
|
|
447
448
|
private content: LoadedContent | null = null;
|
|
448
449
|
private loadToken = 0;
|
|
450
|
+
private refreshToken = 0;
|
|
451
|
+
private showProvenance = false;
|
|
449
452
|
private lastContentWidth = 80;
|
|
450
453
|
private lastContentBodyHeight = 1;
|
|
451
454
|
private readonly verifications = new Map<string, ViewVerificationState>();
|
|
452
455
|
|
|
453
456
|
constructor(private readonly options: ViewOverlayOptions) {
|
|
454
457
|
this.filterText = options.initialFilter ?? "";
|
|
455
|
-
this.filterInput.
|
|
458
|
+
this.filterInput.handleInput(`\x1b[200~${this.filterText}\x1b[201~`);
|
|
456
459
|
}
|
|
457
460
|
|
|
458
461
|
refresh(): void {
|
|
462
|
+
const refreshToken = ++this.refreshToken;
|
|
463
|
+
const selected = this.selectedArtifact();
|
|
464
|
+
this.loadToken += 1;
|
|
459
465
|
this.loadingArtifacts = true;
|
|
460
466
|
this.artifactError = null;
|
|
461
467
|
this.options.requestRender?.();
|
|
462
468
|
void (async () => {
|
|
463
469
|
try {
|
|
464
|
-
|
|
465
|
-
|
|
470
|
+
const artifacts = await listViewArtifacts(this.options.providers);
|
|
471
|
+
if (refreshToken !== this.refreshToken) return;
|
|
472
|
+
this.artifacts = artifacts;
|
|
473
|
+
const retainedIndex = selected
|
|
474
|
+
? this.filteredArtifacts().findIndex((artifact) => artifactKey(artifact) === artifactKey(selected))
|
|
475
|
+
: -1;
|
|
476
|
+
this.selectedIndex = retainedIndex >= 0 ? retainedIndex : initialViewSelection(this.artifacts, this.filterText);
|
|
466
477
|
this.contentScrollOffset = 0;
|
|
467
478
|
this.content = null;
|
|
468
479
|
} catch (err) {
|
|
480
|
+
if (refreshToken !== this.refreshToken) return;
|
|
469
481
|
this.artifactError = err instanceof Error ? err.message : String(err);
|
|
470
482
|
this.artifacts = [];
|
|
471
483
|
} finally {
|
|
472
|
-
this.
|
|
473
|
-
|
|
484
|
+
if (refreshToken === this.refreshToken) {
|
|
485
|
+
this.loadingArtifacts = false;
|
|
486
|
+
this.options.requestRender?.();
|
|
487
|
+
}
|
|
474
488
|
}
|
|
475
489
|
})();
|
|
476
490
|
}
|
|
@@ -490,6 +504,8 @@ export class ViewOverlayView implements Component {
|
|
|
490
504
|
}
|
|
491
505
|
|
|
492
506
|
private selectIndex(next: number): void {
|
|
507
|
+
this.loadToken += 1;
|
|
508
|
+
this.showProvenance = false;
|
|
493
509
|
const filtered = this.filteredArtifacts();
|
|
494
510
|
if (filtered.length === 0) {
|
|
495
511
|
this.selectedIndex = 0;
|
|
@@ -513,14 +529,17 @@ export class ViewOverlayView implements Component {
|
|
|
513
529
|
}
|
|
514
530
|
|
|
515
531
|
private ensureContentLoaded(artifact: ViewArtifact | undefined): void {
|
|
516
|
-
if (!artifact)
|
|
532
|
+
if (!artifact) {
|
|
533
|
+
this.content = null;
|
|
534
|
+
return;
|
|
535
|
+
}
|
|
517
536
|
const key = artifactKey(artifact);
|
|
518
537
|
if (this.content?.key === key) return;
|
|
519
538
|
const token = ++this.loadToken;
|
|
520
539
|
this.content = { key, status: "loading", lines: [clioTheme().fg("dim", "loading artifact…")], format: "text" };
|
|
521
540
|
void (async () => {
|
|
522
541
|
try {
|
|
523
|
-
const loaded = await artifact.load();
|
|
542
|
+
const loaded = await Promise.resolve().then(() => artifact.load());
|
|
524
543
|
if (token !== this.loadToken) return;
|
|
525
544
|
this.content = { key, status: "loaded", lines: loaded.lines, format: loaded.format };
|
|
526
545
|
} catch (err) {
|
|
@@ -540,6 +559,20 @@ export class ViewOverlayView implements Component {
|
|
|
540
559
|
}
|
|
541
560
|
|
|
542
561
|
private renderedContentLines(width: number): string[] {
|
|
562
|
+
if (this.showProvenance) {
|
|
563
|
+
const artifact = this.selectedArtifact();
|
|
564
|
+
if (!artifact) return [];
|
|
565
|
+
return [
|
|
566
|
+
`Title: ${artifact.title}`,
|
|
567
|
+
`Category: ${artifact.category}`,
|
|
568
|
+
`ID: ${artifact.id}`,
|
|
569
|
+
`Path: ${artifact.path ?? "No backing path"}`,
|
|
570
|
+
...(artifact.sessionId ? [`Session: ${artifact.sessionId}`] : []),
|
|
571
|
+
...(artifact.runId ? [`Run: ${artifact.runId}`] : []),
|
|
572
|
+
...(artifact.correlationId ? [`Correlation: ${artifact.correlationId}`] : []),
|
|
573
|
+
...(artifact.description ? [`Details: ${artifact.description}`] : []),
|
|
574
|
+
].flatMap((line) => wrapTextWithAnsi(sanitizeCallTargetText(line), Math.max(1, width)));
|
|
575
|
+
}
|
|
543
576
|
const content = this.content;
|
|
544
577
|
if (!content) return [];
|
|
545
578
|
if (content.status === "error") return content.lines.flatMap((line) => wrapTextWithAnsi(line, Math.max(1, width)));
|
|
@@ -572,10 +605,30 @@ export class ViewOverlayView implements Component {
|
|
|
572
605
|
}
|
|
573
606
|
|
|
574
607
|
const filtered = this.filteredArtifacts();
|
|
575
|
-
|
|
608
|
+
lines.push(
|
|
609
|
+
padAnsi(
|
|
610
|
+
theme.fg(
|
|
611
|
+
this.focus === "list" ? "accent" : "dim",
|
|
612
|
+
`List · ${filtered.length}/${this.artifacts.length} · ←→ category`,
|
|
613
|
+
),
|
|
614
|
+
width,
|
|
615
|
+
ELLIPSIS,
|
|
616
|
+
),
|
|
617
|
+
);
|
|
618
|
+
if (filtered.length === 0)
|
|
619
|
+
return this.fixedLines(
|
|
620
|
+
[
|
|
621
|
+
...lines,
|
|
622
|
+
theme.fg("dim", "No matching details."),
|
|
623
|
+
theme.fg("muted", "Ctrl+U clears the filter."),
|
|
624
|
+
theme.fg("dim", "Try workspace: or receipt:"),
|
|
625
|
+
],
|
|
626
|
+
width,
|
|
627
|
+
height,
|
|
628
|
+
);
|
|
576
629
|
const rows = groupedViewRows(filtered);
|
|
577
630
|
const selectedRow = rows.findIndex((row) => row.type === "item" && row.itemIndex === this.selectedIndex);
|
|
578
|
-
const rowHeight = Math.max(1, height -
|
|
631
|
+
const rowHeight = Math.max(1, height - lines.length);
|
|
579
632
|
if (selectedRow >= 0) {
|
|
580
633
|
if (selectedRow < this.listScrollOffset) this.listScrollOffset = selectedRow;
|
|
581
634
|
if (selectedRow >= this.listScrollOffset + rowHeight) this.listScrollOffset = selectedRow - rowHeight + 1;
|
|
@@ -614,7 +667,21 @@ export class ViewOverlayView implements Component {
|
|
|
614
667
|
this.ensureContentLoaded(artifact);
|
|
615
668
|
this.lastContentWidth = width;
|
|
616
669
|
const verification = artifact ? this.verifications.get(artifactKey(artifact)) : undefined;
|
|
617
|
-
const header =
|
|
670
|
+
const header = [
|
|
671
|
+
padAnsi(
|
|
672
|
+
clioTheme().fg(
|
|
673
|
+
this.focus === "content" ? "accent" : "dim",
|
|
674
|
+
this.showProvenance
|
|
675
|
+
? "Provenance · i preview · Esc list"
|
|
676
|
+
: this.focus === "content"
|
|
677
|
+
? "Preview · i info · Esc list"
|
|
678
|
+
: "Preview · Enter/Tab focus",
|
|
679
|
+
),
|
|
680
|
+
width,
|
|
681
|
+
ELLIPSIS,
|
|
682
|
+
),
|
|
683
|
+
...buildArtifactHeaderLines(artifact, verification, width),
|
|
684
|
+
];
|
|
618
685
|
const bodyHeight = Math.max(0, height - header.length);
|
|
619
686
|
this.lastContentBodyHeight = Math.max(1, bodyHeight);
|
|
620
687
|
const body = this.renderedContentLines(width);
|
|
@@ -657,6 +724,7 @@ export class ViewOverlayView implements Component {
|
|
|
657
724
|
matchesKey(data, "shift+tab") ||
|
|
658
725
|
(this.focus === "list" && matchesKey(data, "enter"))
|
|
659
726
|
) {
|
|
727
|
+
if (this.focus === "list" && !this.selectedArtifact()) return;
|
|
660
728
|
this.focus = this.focus === "list" ? "content" : "list";
|
|
661
729
|
this.options.requestRender?.();
|
|
662
730
|
return;
|
|
@@ -669,6 +737,12 @@ export class ViewOverlayView implements Component {
|
|
|
669
737
|
this.selectCategory(1);
|
|
670
738
|
return;
|
|
671
739
|
}
|
|
740
|
+
if (this.focus === "content" && data === "i") {
|
|
741
|
+
this.showProvenance = !this.showProvenance;
|
|
742
|
+
this.contentScrollOffset = 0;
|
|
743
|
+
this.options.requestRender?.();
|
|
744
|
+
return;
|
|
745
|
+
}
|
|
672
746
|
if (this.focus === "content" && data === "v") {
|
|
673
747
|
this.verifySelected();
|
|
674
748
|
return;
|
|
@@ -704,7 +778,9 @@ export class ViewOverlayView implements Component {
|
|
|
704
778
|
return true;
|
|
705
779
|
}
|
|
706
780
|
const previous = this.filterText;
|
|
707
|
-
|
|
781
|
+
if (matchesKey(data, "ctrl+u")) {
|
|
782
|
+
this.filterInput.applyEdit("clear");
|
|
783
|
+
} else this.filterInput.handleInput(data);
|
|
708
784
|
this.filterText = this.filterInput.getValue();
|
|
709
785
|
if (previous !== this.filterText) {
|
|
710
786
|
this.selectInitialFilterMatch();
|
package/src/tools/agent-tools.ts
CHANGED
|
@@ -30,6 +30,7 @@ import type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from "../eng
|
|
|
30
30
|
import { applyToolProfile, type ToolProfileName } from "./profiles.js";
|
|
31
31
|
import type { ToolInvokeOptions, ToolRegistry, ToolResult, ToolSpec } from "./registry.js";
|
|
32
32
|
import { isDispositionedToolResultError, toolResultContextText } from "./result-disposition.js";
|
|
33
|
+
import { toolSpecPlacement, withGatewayForCapabilities } from "./surface.js";
|
|
33
34
|
|
|
34
35
|
/**
|
|
35
36
|
* Lightweight per-call observability hook. Default no-op so unused
|
|
@@ -308,9 +309,10 @@ function errorMessage(err: unknown): string {
|
|
|
308
309
|
* (`Value.Check` answers identically with and without), so the copy handed
|
|
309
310
|
* to the agent loop drops every `~`-prefixed key. Symbol keys are copied
|
|
310
311
|
* through untouched because pi-ai picks its coercion path by the TypeBox
|
|
311
|
-
* kind symbol on the root schema.
|
|
312
|
+
* kind symbol on the root schema. Exported for the gateway's describe, which
|
|
313
|
+
* hands a capability's schema to the model through a result the same way.
|
|
312
314
|
*/
|
|
313
|
-
function wireParameterSchema<T>(schema: T): T {
|
|
315
|
+
export function wireParameterSchema<T>(schema: T): T {
|
|
314
316
|
if (Array.isArray(schema)) return schema.map((entry) => wireParameterSchema(entry)) as T;
|
|
315
317
|
if (typeof schema !== "object" || schema === null) return schema;
|
|
316
318
|
const source = schema as Record<PropertyKey, unknown>;
|
|
@@ -374,30 +376,41 @@ function toAgentTool(
|
|
|
374
376
|
* 1. tools registered on the supplied registry
|
|
375
377
|
* 2. tools whose id appears in `allowedTools`
|
|
376
378
|
*
|
|
377
|
-
*
|
|
379
|
+
* projected onto the direct surface: a gateway-placed capability on the
|
|
380
|
+
* effective list is reachable through the attached `gateway` tool, never as
|
|
381
|
+
* a schema of its own. When `allowedTools` is undefined, step 2 is skipped.
|
|
378
382
|
*/
|
|
379
383
|
export function resolveAgentTools(input: ResolveAgentToolsInput): AgentTool[] {
|
|
380
384
|
const specs: ToolSpec[] = [];
|
|
381
385
|
for (const name of effectiveToolNames(input)) {
|
|
382
386
|
const spec = input.registry.get(name);
|
|
383
|
-
if (spec) specs.push(spec);
|
|
387
|
+
if (spec && toolSpecPlacement(spec) === "direct") specs.push(spec);
|
|
384
388
|
}
|
|
385
389
|
specs.sort((a, b) => a.name.localeCompare(b.name));
|
|
386
390
|
return specs.map((spec) => toAgentTool(spec, input.registry, input.telemetry, input.invokeOptions));
|
|
387
391
|
}
|
|
388
392
|
|
|
389
393
|
/**
|
|
390
|
-
* The effective
|
|
394
|
+
* The effective capability surface for one run, as names. This is the single
|
|
391
395
|
* narrowing used both to build the executable tool set and to compute the
|
|
392
396
|
* signature the worker attests, so an attested identity can never describe a
|
|
393
397
|
* different surface than the one the agent actually gets.
|
|
398
|
+
*
|
|
399
|
+
* The list names capabilities, whatever their placement: a recipe that admits
|
|
400
|
+
* `git` keeps `git` here, and because `git` sits behind the gateway the list
|
|
401
|
+
* gains `gateway` as well (the same rule dispatch admission applies to the
|
|
402
|
+
* list it approves, so the two signatures agree). `resolveAgentTools` then
|
|
403
|
+
* attaches only the direct-placed names, and the gateway enforces this list
|
|
404
|
+
* on every call it makes on the run's behalf.
|
|
394
405
|
*/
|
|
395
406
|
export function effectiveToolNames(input: Omit<ResolveAgentToolsInput, "telemetry" | "invokeOptions">): ToolName[] {
|
|
396
407
|
const profileContext = {
|
|
397
408
|
...(input.agentId !== undefined ? { agentId: input.agentId } : {}),
|
|
398
409
|
...(input.task !== undefined ? { task: input.task } : {}),
|
|
399
410
|
};
|
|
400
|
-
const
|
|
411
|
+
const gatewayNames = input.registry.listGateway().map((spec) => spec.name);
|
|
412
|
+
const registered = [...input.registry.listRegistered(), ...gatewayNames];
|
|
413
|
+
const toolIds = applyToolProfile(registered, input.toolProfile, profileContext);
|
|
401
414
|
const allowed = input.allowedTools ? new Set<string>(input.allowedTools) : null;
|
|
402
415
|
const includeInteractiveTools = input.includeInteractiveTools !== false;
|
|
403
416
|
const names: ToolName[] = [];
|
|
@@ -408,7 +421,8 @@ export function effectiveToolNames(input: Omit<ResolveAgentToolsInput, "telemetr
|
|
|
408
421
|
if (allowed && !allowed.has(name)) continue;
|
|
409
422
|
names.push(name);
|
|
410
423
|
}
|
|
411
|
-
return names;
|
|
424
|
+
if (input.registry.get(ToolNames.Gateway) === undefined) return names;
|
|
425
|
+
return withGatewayForCapabilities(names);
|
|
412
426
|
}
|
|
413
427
|
|
|
414
428
|
/**
|
package/src/tools/artifact.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
1
|
import path from "node:path";
|
|
3
2
|
import { Type } from "typebox";
|
|
4
3
|
import { artifactDefaultPath, CLIO_ARTIFACT_DIR } from "../core/artifact-paths.js";
|
|
5
4
|
import { ToolNames } from "../core/tool-names.js";
|
|
6
5
|
import { StringEnum } from "../engine/ai.js";
|
|
7
|
-
import { withFileMutationQueue } from "./file-mutation-queue.js";
|
|
6
|
+
import { type AtomicPublishResult, publishFileAtomically, withFileMutationQueue } from "./file-mutation-queue.js";
|
|
8
7
|
import { resolveToCwd } from "./path-utils.js";
|
|
9
8
|
import type { ToolResult, ToolSpec } from "./registry.js";
|
|
10
9
|
|
|
@@ -14,6 +13,12 @@ import type { ToolResult, ToolSpec } from "./registry.js";
|
|
|
14
13
|
* answer, so pi-agent-core skips the follow-up LLM call that would only
|
|
15
14
|
* summarize it.
|
|
16
15
|
*
|
|
16
|
+
* Placement: gateway. The terminal contract survives the indirection because
|
|
17
|
+
* the gateway propagates `terminate`, `details.kind`, and `details.paths`
|
|
18
|
+
* from this result unchanged, so the turn still ends and `/view` still lists
|
|
19
|
+
* the document. The write is an atomic publish (temp file, fsync, rename) so
|
|
20
|
+
* a failed write never leaves a half-written artifact behind.
|
|
21
|
+
*
|
|
17
22
|
* A pathless call lands under `.clio-coder/artifacts/`, not in the repo working
|
|
18
23
|
* tree. A turn nobody asked for a file from used to drop REPORT.md into the
|
|
19
24
|
* project root, which the operator then had to notice and delete; the working
|
|
@@ -58,11 +63,9 @@ async function writeTerminalArtifact(
|
|
|
58
63
|
}
|
|
59
64
|
const title = typeof args.title === "string" ? args.title.trim() : "";
|
|
60
65
|
const body = title.length > 0 && !content.trimStart().startsWith("#") ? `# ${title}\n\n${content}` : content;
|
|
66
|
+
let published: AtomicPublishResult;
|
|
61
67
|
try {
|
|
62
|
-
await withFileMutationQueue(target,
|
|
63
|
-
mkdirSync(path.dirname(target), { recursive: true });
|
|
64
|
-
writeFileSync(target, body, "utf8");
|
|
65
|
-
});
|
|
68
|
+
published = await withFileMutationQueue(target, () => publishFileAtomically(target, body));
|
|
66
69
|
} catch (err) {
|
|
67
70
|
return { kind: "error", message: `artifact: ${err instanceof Error ? err.message : String(err)}` };
|
|
68
71
|
}
|
|
@@ -70,10 +73,15 @@ async function writeTerminalArtifact(
|
|
|
70
73
|
const bytes = Buffer.byteLength(body, "utf8");
|
|
71
74
|
return {
|
|
72
75
|
kind: "ok",
|
|
73
|
-
output: `wrote ${kind} artifact (${bytes}B) to ${rel}`,
|
|
76
|
+
output: `wrote ${kind} artifact (${bytes}B) to ${rel}${published.durabilityWarning ? `\n${published.durabilityWarning}` : ""}`,
|
|
74
77
|
// shownBytes is the artifact's real size; the ledger otherwise measures
|
|
75
78
|
// this confirmation sentence (a 4753B plan rendered as "60B", #76).
|
|
76
|
-
details: {
|
|
79
|
+
details: {
|
|
80
|
+
kind,
|
|
81
|
+
paths: [target],
|
|
82
|
+
observation: { shownBytes: bytes },
|
|
83
|
+
file: { before: published.before, after: published.after },
|
|
84
|
+
},
|
|
77
85
|
// Writing the artifact is the whole turn; terminate skips the follow-up
|
|
78
86
|
// LLM call that would only restate what was just written.
|
|
79
87
|
terminate: true,
|
package/src/tools/bash.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Type } from "typebox";
|
|
2
|
-
import { BASH_HARD_CAP_BYTES, combineBashOutput, runBashCommand } from "../core/bash-exec.js";
|
|
2
|
+
import { BASH_HARD_CAP_BYTES, type BashCommandResult, combineBashOutput, runBashCommand } from "../core/bash-exec.js";
|
|
3
3
|
import { resolveSafeCwd } from "../core/safe-exec.js";
|
|
4
4
|
import { ToolNames } from "../core/tool-names.js";
|
|
5
5
|
import { expandPath } from "./path-utils.js";
|
|
@@ -11,8 +11,9 @@ import {
|
|
|
11
11
|
type ToolResultContextDisposition,
|
|
12
12
|
type ToolResultDisposition,
|
|
13
13
|
} from "./result-disposition.js";
|
|
14
|
+
import { writeToolOffload } from "./result-shaping.js";
|
|
14
15
|
import { DEFAULT_MAX_LINES, truncateTail } from "./truncate.js";
|
|
15
|
-
import { byteLength } from "./truncate-utf8.js";
|
|
16
|
+
import { byteLength, truncateUtf8 } from "./truncate-utf8.js";
|
|
16
17
|
|
|
17
18
|
// The registry's bounded model projection and operator presentation share this
|
|
18
19
|
// cap. Both are tail-biased for Bash because diagnostics usually land last.
|
|
@@ -120,6 +121,91 @@ function bashResultDetails(
|
|
|
120
121
|
retainedBytes: byteLength(rawOutput),
|
|
121
122
|
stdoutBytes: byteLength(result.stdout),
|
|
122
123
|
stderrBytes: byteLength(result.stderr),
|
|
124
|
+
observedStdoutBytes: result.observedStdoutBytes,
|
|
125
|
+
observedStderrBytes: result.observedStderrBytes,
|
|
126
|
+
retainedStdoutBytes: result.retainedStdoutBytes,
|
|
127
|
+
retainedStderrBytes: result.retainedStderrBytes,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Finalize cap retention before projection so every policy carries the actual outcome. */
|
|
132
|
+
export function bashOutputCapResult(
|
|
133
|
+
result: BashCommandResult,
|
|
134
|
+
policy: BashOutputPolicy,
|
|
135
|
+
context?: { sessionId?: string; toolResultMaxBytes?: number },
|
|
136
|
+
): ToolResult {
|
|
137
|
+
const raw = combineBashOutput(result);
|
|
138
|
+
const bytes = byteLength(raw);
|
|
139
|
+
const cap = Math.min(BASH_DISPLAY_MAX_BYTES, context?.toolResultMaxBytes ?? BASH_DISPLAY_MAX_BYTES);
|
|
140
|
+
const bodyBudget = Math.max(0, cap - 2048);
|
|
141
|
+
const showBody = policy === "full" || policy === "bounded";
|
|
142
|
+
const inline = showBody && bytes <= bodyBudget;
|
|
143
|
+
const preview = inline
|
|
144
|
+
? raw
|
|
145
|
+
: showBody
|
|
146
|
+
? truncateTail(raw, { maxBytes: Math.max(1, bodyBudget), maxLines: DEFAULT_MAX_LINES }).content
|
|
147
|
+
: "";
|
|
148
|
+
let offloadPath: string | null = null;
|
|
149
|
+
let savedBytes = 0;
|
|
150
|
+
let discardedBytes = 0;
|
|
151
|
+
let retention: string;
|
|
152
|
+
if (inline) {
|
|
153
|
+
retention = `Partial output shown inline (${bytes} decoded output bytes).`;
|
|
154
|
+
} else {
|
|
155
|
+
const saved = truncateUtf8(raw, BASH_HARD_CAP_BYTES, "");
|
|
156
|
+
offloadPath = writeToolOffload(saved, context, BASH_HARD_CAP_BYTES);
|
|
157
|
+
if (offloadPath !== null) {
|
|
158
|
+
savedBytes = byteLength(saved);
|
|
159
|
+
discardedBytes = bytes - savedBytes;
|
|
160
|
+
retention = `Partial output offloaded to ${offloadPath} (${savedBytes} decoded output bytes saved).`;
|
|
161
|
+
if (discardedBytes > 0)
|
|
162
|
+
retention += ` Retention truncated by the ${BASH_HARD_CAP_BYTES}-byte (16 MiB) offload ceiling; ${discardedBytes} decoded output bytes discarded from the offload.`;
|
|
163
|
+
} else {
|
|
164
|
+
discardedBytes = bytes - byteLength(preview);
|
|
165
|
+
retention = `Partial-output retention failed; no offload was written. ${byteLength(preview)} decoded output bytes shown inline; ${discardedBytes} decoded output bytes discarded.`;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const status = `bash: command output exceeded the ${BASH_HARD_CAP_BYTES}-byte (16 MiB) hard cap and was stopped. Observed stdout: ${result.observedStdoutBytes ?? "unavailable"} bytes, stderr: ${result.observedStderrBytes ?? "unavailable"} bytes; retained stream stdout: ${result.retainedStdoutBytes ?? "unavailable"} bytes, stderr: ${result.retainedStderrBytes ?? "unavailable"} bytes. ${retention} Use run_script to stream unbounded output to .clio-coder/runs/<runId>/ instead.`;
|
|
169
|
+
const message = preview.length > 0 ? `${preview}\n\n${status}` : status;
|
|
170
|
+
const disposition = normalizedBashDisposition(policy);
|
|
171
|
+
return {
|
|
172
|
+
kind: "error",
|
|
173
|
+
message,
|
|
174
|
+
modelContext: message,
|
|
175
|
+
details: {
|
|
176
|
+
...bashResultDetails(result, raw, "output-cap"),
|
|
177
|
+
retention: {
|
|
178
|
+
status: inline ? "inline" : offloadPath === null ? "failed" : discardedBytes > 0 ? "truncated" : "offloaded",
|
|
179
|
+
savedBytes,
|
|
180
|
+
discardedBytes,
|
|
181
|
+
...(offloadPath === null ? {} : { offloadPath }),
|
|
182
|
+
},
|
|
183
|
+
resultSize: {
|
|
184
|
+
bytes,
|
|
185
|
+
shownBytes: byteLength(message),
|
|
186
|
+
maxBytes: cap,
|
|
187
|
+
truncated: !inline,
|
|
188
|
+
policy,
|
|
189
|
+
...(offloadPath === null ? {} : { offloadPath }),
|
|
190
|
+
},
|
|
191
|
+
resultDisposition: {
|
|
192
|
+
version: 1,
|
|
193
|
+
applications: 1,
|
|
194
|
+
presentation: { ...disposition.presentation, content: message },
|
|
195
|
+
context: {
|
|
196
|
+
requestedMode: policy === "metadata-only" ? "metadata-only" : disposition.context.mode,
|
|
197
|
+
appliedMode: disposition.context.mode,
|
|
198
|
+
maxBytes: cap,
|
|
199
|
+
},
|
|
200
|
+
capturedBytes: bytes,
|
|
201
|
+
displayedBytes: byteLength(message),
|
|
202
|
+
contextBytes: byteLength(message),
|
|
203
|
+
presentationTruncated: !inline,
|
|
204
|
+
contextTruncated: !inline,
|
|
205
|
+
retrieval: retention,
|
|
206
|
+
...(offloadPath === null ? {} : { offloadPath }),
|
|
207
|
+
},
|
|
208
|
+
},
|
|
123
209
|
};
|
|
124
210
|
}
|
|
125
211
|
|
|
@@ -157,7 +243,7 @@ function observeToolsNudge(command: string, sessionId: string | undefined): stri
|
|
|
157
243
|
export const bashTool: ToolSpec = {
|
|
158
244
|
name: ToolNames.Bash,
|
|
159
245
|
description:
|
|
160
|
-
"Execute a bash command in a fresh child at the workspace root (or explicit cwd); shell state does not persist across calls. The default timeout is 300s; use panes for long-lived processes or an explicit timeout_ms, and use output_policy for bounded diagnostic tail (default), summary, metadata-only, or budget-limited full output. Network reachability follows the host environment and OS isolation; disabling web_fetch does not isolate bash networking.",
|
|
246
|
+
"Execute a bash command in a fresh child at the workspace root (or explicit cwd); shell state does not persist across calls. Combined stdout and stderr have a 16 MiB hard cap that stops the child; use run_script to stream unbounded output to .clio-coder/runs/<runId>/. The default timeout is 300s; use panes for long-lived processes or an explicit timeout_ms, and use output_policy for bounded diagnostic tail (default), summary, metadata-only, or budget-limited full output. Network reachability follows the host environment and OS isolation; disabling web_fetch does not isolate bash networking.",
|
|
161
247
|
parameters: Type.Object({
|
|
162
248
|
command: Type.String({ description: "Bash command to execute." }),
|
|
163
249
|
cwd: Type.Optional(
|
|
@@ -238,14 +324,7 @@ export const bashTool: ToolSpec = {
|
|
|
238
324
|
details: bashResultDetails(result, rawOutput, "timeout"),
|
|
239
325
|
};
|
|
240
326
|
}
|
|
241
|
-
if (outputCapped)
|
|
242
|
-
const status = `bash: command output exceeded ${BASH_HARD_CAP_BYTES} bytes and was stopped`;
|
|
243
|
-
return {
|
|
244
|
-
kind: "error",
|
|
245
|
-
message: output.length > 0 ? `${output}\n\n${status}` : status,
|
|
246
|
-
details: bashResultDetails(result, rawOutput, "output-cap"),
|
|
247
|
-
};
|
|
248
|
-
}
|
|
327
|
+
if (outputCapped) return bashOutputCapResult(result, outputPolicy, options);
|
|
249
328
|
if (error) {
|
|
250
329
|
const code = typeof error.code === "number" ? error.code : (error as { code?: string }).code;
|
|
251
330
|
const status = `bash: command failed (exit ${code ?? "?"})`;
|
package/src/tools/bootstrap.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { BusChannels } from "../core/bus-events.js";
|
|
2
2
|
import type { WorkerRosters } from "../core/defaults.js";
|
|
3
3
|
import type { SafeEventBus } from "../core/event-bus.js";
|
|
4
|
+
import type { getTerminationCoordinator } from "../core/termination.js";
|
|
4
5
|
import type { AgentSpec } from "../domains/agents/spec.js";
|
|
5
6
|
import type { WorkerContextSnapshot } from "../domains/context/worker/contract.js";
|
|
6
7
|
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
7
8
|
import type { AgentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
|
|
9
|
+
import { DEFAULT_KILL_GRACE_MS, DEFAULT_TEARDOWN_BOUND_MS } from "../domains/gateway/mcp/index.js";
|
|
8
10
|
import type { PanesOperations } from "../domains/mux/operations.js";
|
|
9
11
|
import type { AutonomyLevel } from "../domains/safety/autonomy.js";
|
|
10
12
|
import type { DecisionLedgerEntry } from "../domains/session/entries.js";
|
|
@@ -14,6 +16,7 @@ import { assertRegisteredBuiltinTools, type CoreToolBootstrapDeps, registerCoreT
|
|
|
14
16
|
import { createDispatchRunEventRegistry, createDispatchTool } from "./dispatch.js";
|
|
15
17
|
import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
|
|
16
18
|
import type { DispatchSchemaComposition } from "./dispatch-schema.js";
|
|
19
|
+
import { createMcpCapabilitySource, type McpCapabilitySource } from "./gateway/index.js";
|
|
17
20
|
import { registerHarnessExtensionTools } from "./harness-extensions.js";
|
|
18
21
|
import { lazyTool } from "./lazy-tool.js";
|
|
19
22
|
import { monitorToolSurface } from "./monitor-surface.js";
|
|
@@ -23,10 +26,11 @@ import { steerToolSurface } from "./steer-surface.js";
|
|
|
23
26
|
|
|
24
27
|
export { toolPromptHintsForNames };
|
|
25
28
|
|
|
26
|
-
export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
|
|
29
|
+
export interface ToolBootstrapDeps extends Omit<CoreToolBootstrapDeps, "mcpCapabilities"> {
|
|
27
30
|
captureWorkerContext?: () => WorkerContextSnapshot | null;
|
|
28
31
|
dispatch?: DispatchContract;
|
|
29
32
|
bus?: SafeEventBus;
|
|
33
|
+
termination?: Pick<ReturnType<typeof getTerminationCoordinator>, "onTerminate">;
|
|
30
34
|
getAgentCatalog?: () => string;
|
|
31
35
|
getAgentSpecs?: () => ReadonlyArray<AgentSpec>;
|
|
32
36
|
getAgentRoleFacts?: AgentRoleFactsResolver;
|
|
@@ -45,6 +49,19 @@ export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
|
|
|
45
49
|
* is what keeps the `panes` tool out of the prompt on a machine with none.
|
|
46
50
|
*/
|
|
47
51
|
panes?: PanesOperations;
|
|
52
|
+
/**
|
|
53
|
+
* Local MCP servers for the gateway. Absent means one is built for the
|
|
54
|
+
* session cwd; `false` registers none (a registry that must never launch a
|
|
55
|
+
* child process, such as a test's).
|
|
56
|
+
*/
|
|
57
|
+
mcpCapabilities?: McpCapabilitySource | false;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface ToolBootstrapHandle {
|
|
61
|
+
/** The MCP capability source the gateway launches servers through, when one was registered. */
|
|
62
|
+
mcpCapabilities: McpCapabilitySource | null;
|
|
63
|
+
/** Close every launched MCP client. Idempotent; also bound to session end and shutdown on the bus. */
|
|
64
|
+
close(): Promise<void>;
|
|
48
65
|
}
|
|
49
66
|
|
|
50
67
|
/**
|
|
@@ -52,8 +69,14 @@ export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
|
|
|
52
69
|
* controls in their canonical order. Worker registries call registerCoreTools
|
|
53
70
|
* directly so their boot graph never evaluates dispatch implementations.
|
|
54
71
|
*/
|
|
55
|
-
export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps = {}):
|
|
56
|
-
const
|
|
72
|
+
export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps = {}): ToolBootstrapHandle {
|
|
73
|
+
const cwd = deps.session?.current()?.cwd ?? process.cwd();
|
|
74
|
+
const { mcpCapabilities: requestedMcp, ...coreDeps } = deps;
|
|
75
|
+
const mcpCapabilities = requestedMcp === false ? null : (requestedMcp ?? createMcpCapabilitySource({ cwd, registry }));
|
|
76
|
+
const registration = registerCoreTools(registry, {
|
|
77
|
+
...coreDeps,
|
|
78
|
+
...(mcpCapabilities ? { mcpCapabilities } : {}),
|
|
79
|
+
});
|
|
57
80
|
if (deps.dispatch) {
|
|
58
81
|
const dispatch = deps.dispatch;
|
|
59
82
|
// Display tail only. In a composed process the dispatch domain writes the
|
|
@@ -114,7 +137,22 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
114
137
|
});
|
|
115
138
|
}
|
|
116
139
|
assertRegisteredBuiltinTools(registry, registration, Boolean(deps.dispatch), Boolean(deps.panes));
|
|
117
|
-
for (const diagnostic of registerHarnessExtensionTools(registry,
|
|
140
|
+
for (const diagnostic of registerHarnessExtensionTools(registry, cwd)) {
|
|
118
141
|
deps.bus?.emit(BusChannels.ExtensionsLoadIssue, { message: diagnostic.message });
|
|
119
142
|
}
|
|
143
|
+
// Every MCP client the gateway launched closes with the session: a
|
|
144
|
+
// detached server must not outlive the process that trusted it.
|
|
145
|
+
let closePromise: Promise<void> | undefined;
|
|
146
|
+
const close = (): Promise<void> => {
|
|
147
|
+
closePromise ??= Promise.resolve(mcpCapabilities?.close()).then(() => undefined);
|
|
148
|
+
return closePromise;
|
|
149
|
+
};
|
|
150
|
+
if (mcpCapabilities) {
|
|
151
|
+
deps.termination?.onTerminate(close, { timeoutMs: DEFAULT_KILL_GRACE_MS + DEFAULT_TEARDOWN_BOUND_MS + 1_000 });
|
|
152
|
+
}
|
|
153
|
+
if (mcpCapabilities && deps.bus) {
|
|
154
|
+
deps.bus.on(BusChannels.SessionEnd, () => void close());
|
|
155
|
+
deps.bus.on(BusChannels.ShutdownRequested, () => void close());
|
|
156
|
+
}
|
|
157
|
+
return { mcpCapabilities, close };
|
|
120
158
|
}
|