@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
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON-RPC 2.0 framing for the MCP stdio transport.
|
|
3
|
+
*
|
|
4
|
+
* The transport carries one JSON message per line: UTF-8 text, newline
|
|
5
|
+
* terminated, with no embedded newline. Everything here is pure: the framer
|
|
6
|
+
* accepts byte chunks and yields typed messages or one typed protocol error,
|
|
7
|
+
* and the client decides what to do with either. Invalid UTF-8 is a protocol
|
|
8
|
+
* error rather than a U+FFFD substitution, because a tool result that reached
|
|
9
|
+
* the model with silently replaced bytes would misreport what the server said.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export const MCP_PROTOCOL_VERSION = "2025-06-18";
|
|
13
|
+
export const DEFAULT_MAX_LINE_BYTES = 4 * 1024 * 1024;
|
|
14
|
+
export const JSON_RPC_METHOD_NOT_FOUND = -32601;
|
|
15
|
+
|
|
16
|
+
export type McpErrorCode = "timeout" | "closed" | "protocol" | "server" | "spawn" | "aborted" | "overload";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Every failure the client reports carries one of the codes above. `overload`
|
|
20
|
+
* names an outbound line the client refused to queue: on its own because it
|
|
21
|
+
* exceeds the cap, or fatally because the server stopped reading its stdin.
|
|
22
|
+
*/
|
|
23
|
+
export class McpError extends Error {
|
|
24
|
+
override readonly name = "McpError";
|
|
25
|
+
readonly code: McpErrorCode;
|
|
26
|
+
readonly data: unknown;
|
|
27
|
+
|
|
28
|
+
constructor(code: McpErrorCode, message: string, data?: unknown) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.code = code;
|
|
31
|
+
this.data = data;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export type JsonRpcId = number | string;
|
|
36
|
+
|
|
37
|
+
export interface JsonRpcRequest {
|
|
38
|
+
jsonrpc: "2.0";
|
|
39
|
+
id: JsonRpcId;
|
|
40
|
+
method: string;
|
|
41
|
+
params?: unknown;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface JsonRpcNotification {
|
|
45
|
+
jsonrpc: "2.0";
|
|
46
|
+
method: string;
|
|
47
|
+
params?: unknown;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface JsonRpcErrorObject {
|
|
51
|
+
code: number;
|
|
52
|
+
message: string;
|
|
53
|
+
data?: unknown;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface JsonRpcResponse {
|
|
57
|
+
jsonrpc: "2.0";
|
|
58
|
+
id: JsonRpcId | null;
|
|
59
|
+
result?: unknown;
|
|
60
|
+
error?: JsonRpcErrorObject;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export type JsonRpcMessage =
|
|
64
|
+
| { kind: "request"; message: JsonRpcRequest }
|
|
65
|
+
| { kind: "notification"; message: JsonRpcNotification }
|
|
66
|
+
| { kind: "response"; message: JsonRpcResponse };
|
|
67
|
+
|
|
68
|
+
export type ProtocolFrame = { kind: "message"; message: JsonRpcMessage } | { kind: "error"; error: McpError };
|
|
69
|
+
|
|
70
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
71
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function isJsonRpcId(value: unknown): value is JsonRpcId {
|
|
75
|
+
return typeof value === "string" || (typeof value === "number" && Number.isFinite(value));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Transport-only metadata cannot be supplied by a server field. The result
|
|
79
|
+
// object remains the key until its pending request reaches the tool decoder.
|
|
80
|
+
const structuredJson = new WeakMap<object, string>();
|
|
81
|
+
|
|
82
|
+
export function structuredContentJson(result: object): string | undefined {
|
|
83
|
+
return structuredJson.get(result);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Classify one decoded JSON value as a request, notification, or response, or name why it is none of them. */
|
|
87
|
+
export function classifyJsonRpcMessage(value: unknown): JsonRpcMessage | McpError {
|
|
88
|
+
if (!isRecord(value)) return new McpError("protocol", "message is not a JSON object");
|
|
89
|
+
if (value.jsonrpc !== "2.0") return new McpError("protocol", 'message lacks jsonrpc: "2.0"');
|
|
90
|
+
if (typeof value.method === "string") {
|
|
91
|
+
if (value.id === undefined || value.id === null) {
|
|
92
|
+
const notification: JsonRpcNotification = { jsonrpc: "2.0", method: value.method };
|
|
93
|
+
if (value.params !== undefined) notification.params = value.params;
|
|
94
|
+
return { kind: "notification", message: notification };
|
|
95
|
+
}
|
|
96
|
+
if (!isJsonRpcId(value.id)) return new McpError("protocol", "request id must be a string or a finite number");
|
|
97
|
+
const request: JsonRpcRequest = { jsonrpc: "2.0", id: value.id, method: value.method };
|
|
98
|
+
if (value.params !== undefined) request.params = value.params;
|
|
99
|
+
return { kind: "request", message: request };
|
|
100
|
+
}
|
|
101
|
+
const hasResult = Object.hasOwn(value, "result");
|
|
102
|
+
const hasError = Object.hasOwn(value, "error");
|
|
103
|
+
if (!hasResult && !hasError) return new McpError("protocol", "message has neither method, result, nor error");
|
|
104
|
+
if (hasResult && hasError) return new McpError("protocol", "response carries both result and error");
|
|
105
|
+
if (value.id !== null && !isJsonRpcId(value.id)) {
|
|
106
|
+
return new McpError("protocol", "response id must be a string, a finite number, or null");
|
|
107
|
+
}
|
|
108
|
+
const response: JsonRpcResponse = {
|
|
109
|
+
jsonrpc: "2.0",
|
|
110
|
+
id: value.id === undefined ? null : (value.id as JsonRpcId | null),
|
|
111
|
+
};
|
|
112
|
+
if (hasResult) response.result = value.result;
|
|
113
|
+
if (hasError) {
|
|
114
|
+
const error = value.error;
|
|
115
|
+
if (!isRecord(error) || typeof error.code !== "number" || typeof error.message !== "string") {
|
|
116
|
+
return new McpError("protocol", "response error must carry a numeric code and a message");
|
|
117
|
+
}
|
|
118
|
+
const errorObject: JsonRpcErrorObject = { code: error.code, message: error.message };
|
|
119
|
+
if (error.data !== undefined) errorObject.data = error.data;
|
|
120
|
+
response.error = errorObject;
|
|
121
|
+
}
|
|
122
|
+
return { kind: "response", message: response };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Decode one complete line (without its terminator) into a message or a protocol error. */
|
|
126
|
+
export function parseJsonRpcLine(line: Buffer): JsonRpcMessage | McpError {
|
|
127
|
+
let text: string;
|
|
128
|
+
try {
|
|
129
|
+
text = new TextDecoder("utf-8", { fatal: true }).decode(line);
|
|
130
|
+
} catch {
|
|
131
|
+
return new McpError("protocol", "message line is not valid UTF-8");
|
|
132
|
+
}
|
|
133
|
+
let parsed: unknown;
|
|
134
|
+
try {
|
|
135
|
+
// Node >=22.19 supports source-aware revivers and rawJSON. Keep numeric
|
|
136
|
+
// source tokens without changing protocol IDs, schemas, or other fields.
|
|
137
|
+
const sources = new WeakMap<object, Map<string, string>>();
|
|
138
|
+
parsed = JSON.parse(text, function (this: object, key: string, value: unknown, context?: { source: string }) {
|
|
139
|
+
if (typeof value === "number") {
|
|
140
|
+
if (context?.source === undefined) throw new Error("JSON numeric source tokens are unavailable");
|
|
141
|
+
let entries = sources.get(this);
|
|
142
|
+
if (entries === undefined) {
|
|
143
|
+
entries = new Map();
|
|
144
|
+
sources.set(this, entries);
|
|
145
|
+
}
|
|
146
|
+
entries.set(key, context.source);
|
|
147
|
+
}
|
|
148
|
+
return value;
|
|
149
|
+
}) as unknown;
|
|
150
|
+
if (isRecord(parsed) && isRecord(parsed.result) && isRecord(parsed.result.structuredContent)) {
|
|
151
|
+
const content = parsed.result.structuredContent;
|
|
152
|
+
// ES2022 typings predate this supported Node runtime API. No custom
|
|
153
|
+
// tokenizer is needed, and the existing incoming-line cap bounds it.
|
|
154
|
+
const rawJSON = (JSON as JSON & { rawJSON(source: string): unknown }).rawJSON;
|
|
155
|
+
const exact = JSON.stringify(content, function (this: object, key: string, value: unknown) {
|
|
156
|
+
const source = sources.get(this)?.get(key);
|
|
157
|
+
return source === undefined ? value : rawJSON(source);
|
|
158
|
+
});
|
|
159
|
+
// Plain JSON evidence must survive cloning and serialization as well.
|
|
160
|
+
// Tag tokens that Number cannot round-trip instead of retaining rounded
|
|
161
|
+
// numbers, Infinity (which serializes to null), or a signless zero.
|
|
162
|
+
parsed.result.structuredContent = JSON.parse(
|
|
163
|
+
JSON.stringify(content, function (this: object, key: string, value: unknown) {
|
|
164
|
+
const source = sources.get(this)?.get(key);
|
|
165
|
+
return source !== undefined && JSON.stringify(value) !== source ? { $literal: source } : value;
|
|
166
|
+
}),
|
|
167
|
+
) as unknown;
|
|
168
|
+
structuredJson.set(parsed.result, exact);
|
|
169
|
+
}
|
|
170
|
+
} catch (error) {
|
|
171
|
+
return new McpError(
|
|
172
|
+
"protocol",
|
|
173
|
+
`message line is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
return classifyJsonRpcMessage(parsed);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** Serialize one outbound message as a newline-terminated line. JSON.stringify escapes every newline inside strings. */
|
|
180
|
+
export function encodeJsonRpcMessage(message: JsonRpcRequest | JsonRpcNotification | JsonRpcResponse): Buffer {
|
|
181
|
+
return Buffer.from(`${JSON.stringify(message)}\n`, "utf8");
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export interface LineFramer {
|
|
185
|
+
/** Accept one chunk and return every frame it completed. After an error frame the framer yields nothing more. */
|
|
186
|
+
push(chunk: Buffer): ProtocolFrame[];
|
|
187
|
+
/** Flush a final unterminated line at end of stream. */
|
|
188
|
+
flush(): ProtocolFrame[];
|
|
189
|
+
/** Bytes held for the line still being assembled. */
|
|
190
|
+
readonly pendingBytes: number;
|
|
191
|
+
/** True once an error frame has been produced. */
|
|
192
|
+
readonly failed: boolean;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Split a byte stream into newline-delimited messages. A line longer than the
|
|
197
|
+
* cap is refused as soon as its bytes exceed it, before any newline arrives,
|
|
198
|
+
* so an unterminated flood cannot grow the buffer without bound. Blank lines
|
|
199
|
+
* are skipped; a trailing carriage return is tolerated.
|
|
200
|
+
*/
|
|
201
|
+
export function createLineFramer(maxLineBytes: number = DEFAULT_MAX_LINE_BYTES): LineFramer {
|
|
202
|
+
const pending: Buffer[] = [];
|
|
203
|
+
let pendingBytes = 0;
|
|
204
|
+
let failed = false;
|
|
205
|
+
|
|
206
|
+
const fail = (message: string): ProtocolFrame[] => {
|
|
207
|
+
failed = true;
|
|
208
|
+
pending.length = 0;
|
|
209
|
+
pendingBytes = 0;
|
|
210
|
+
return [{ kind: "error", error: new McpError("protocol", message) }];
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
const frameLine = (line: Buffer): ProtocolFrame | null => {
|
|
214
|
+
const trimmed = line.length > 0 && line[line.length - 1] === 0x0d ? line.subarray(0, line.length - 1) : line;
|
|
215
|
+
if (trimmed.length === 0) return null;
|
|
216
|
+
const decoded = parseJsonRpcLine(trimmed);
|
|
217
|
+
if (decoded instanceof McpError) return { kind: "error", error: decoded };
|
|
218
|
+
return { kind: "message", message: decoded };
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
get pendingBytes() {
|
|
223
|
+
return pendingBytes;
|
|
224
|
+
},
|
|
225
|
+
get failed() {
|
|
226
|
+
return failed;
|
|
227
|
+
},
|
|
228
|
+
push(chunk) {
|
|
229
|
+
if (failed) return [];
|
|
230
|
+
const frames: ProtocolFrame[] = [];
|
|
231
|
+
let start = 0;
|
|
232
|
+
for (;;) {
|
|
233
|
+
const newline = chunk.indexOf(0x0a, start);
|
|
234
|
+
if (newline === -1) break;
|
|
235
|
+
const tail = chunk.subarray(start, newline);
|
|
236
|
+
const lineBytes = pendingBytes + tail.length;
|
|
237
|
+
if (lineBytes > maxLineBytes) return fail(`message line exceeds ${maxLineBytes} bytes`);
|
|
238
|
+
const line = pending.length === 0 ? tail : Buffer.concat([...pending, tail], lineBytes);
|
|
239
|
+
pending.length = 0;
|
|
240
|
+
pendingBytes = 0;
|
|
241
|
+
const frame = frameLine(line);
|
|
242
|
+
if (frame !== null) {
|
|
243
|
+
frames.push(frame);
|
|
244
|
+
if (frame.kind === "error") {
|
|
245
|
+
failed = true;
|
|
246
|
+
return frames;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
start = newline + 1;
|
|
250
|
+
}
|
|
251
|
+
if (start < chunk.length) {
|
|
252
|
+
const rest = chunk.subarray(start);
|
|
253
|
+
if (pendingBytes + rest.length > maxLineBytes) {
|
|
254
|
+
frames.push(...fail(`message line exceeds ${maxLineBytes} bytes`));
|
|
255
|
+
return frames;
|
|
256
|
+
}
|
|
257
|
+
pending.push(Buffer.from(rest));
|
|
258
|
+
pendingBytes += rest.length;
|
|
259
|
+
}
|
|
260
|
+
return frames;
|
|
261
|
+
},
|
|
262
|
+
flush() {
|
|
263
|
+
if (failed || pendingBytes === 0) return [];
|
|
264
|
+
const line = Buffer.concat(pending, pendingBytes);
|
|
265
|
+
pending.length = 0;
|
|
266
|
+
pendingBytes = 0;
|
|
267
|
+
const frame = frameLine(line);
|
|
268
|
+
if (frame === null) return [];
|
|
269
|
+
if (frame.kind === "error") failed = true;
|
|
270
|
+
return [frame];
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Explicit trust for project-declared MCP servers. A repository can ship
|
|
3
|
+
* `.clio-coder/mcp.yaml`, and cloning a repository must not launch anything,
|
|
4
|
+
* so a project server runs only once the operator records a trust decision
|
|
5
|
+
* for that exact declaration. The record binds the project root, the server
|
|
6
|
+
* id, and the declaration digest: change the command, arguments, environment,
|
|
7
|
+
* cwd, or timeout and the record is stale until the operator re-trusts it.
|
|
8
|
+
* User-scope declarations are trusted by authorship; they carry no record.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { realpathSync } from "node:fs";
|
|
12
|
+
import path from "node:path";
|
|
13
|
+
import { safeResourceWrite } from "../../../core/safe-resource-write.js";
|
|
14
|
+
import { clioConfigDir } from "../../../core/xdg.js";
|
|
15
|
+
import {
|
|
16
|
+
loadMcpServerConfig,
|
|
17
|
+
type McpConfigDiagnostic,
|
|
18
|
+
type McpServerDeclaration,
|
|
19
|
+
readBoundedFileText,
|
|
20
|
+
} from "./config.js";
|
|
21
|
+
|
|
22
|
+
export const MCP_TRUST_FILENAME = "mcp-trust.json";
|
|
23
|
+
export const MCP_TRUST_VERSION = 1;
|
|
24
|
+
|
|
25
|
+
/** Bounds on the trust file, read on every resolve; a file past either is unusable until repaired. */
|
|
26
|
+
export const MCP_TRUST_CAPS = Object.freeze({
|
|
27
|
+
fileBytes: 1024 * 1024,
|
|
28
|
+
records: 256,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export type McpTrustActionClass = "read" | "execute" | "unknown";
|
|
32
|
+
export const MCP_TRUST_ACTION_CLASSES: ReadonlyArray<McpTrustActionClass> = ["read", "execute", "unknown"];
|
|
33
|
+
|
|
34
|
+
export interface McpTrustRecord {
|
|
35
|
+
/** Canonical (realpath) project root the record applies to. */
|
|
36
|
+
projectRoot: string;
|
|
37
|
+
id: string;
|
|
38
|
+
digest: string;
|
|
39
|
+
/** The action class the gateway gives this server's tools. */
|
|
40
|
+
actionClass: McpTrustActionClass;
|
|
41
|
+
trustedAt: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface McpTrustState {
|
|
45
|
+
version: typeof MCP_TRUST_VERSION;
|
|
46
|
+
records: McpTrustRecord[];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export type McpTrustStatus =
|
|
50
|
+
| { status: "trusted"; actionClass: McpTrustActionClass }
|
|
51
|
+
| { status: "untrusted"; actionClass: "unknown"; reason: string }
|
|
52
|
+
| { status: "stale"; actionClass: "unknown"; reason: string };
|
|
53
|
+
|
|
54
|
+
export interface ResolvedMcpServer extends McpServerDeclaration {
|
|
55
|
+
trust: McpTrustStatus;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface McpTrustOptions {
|
|
59
|
+
cwd: string;
|
|
60
|
+
/** Override for the user config directory; defaults to clioConfigDir(). */
|
|
61
|
+
configDir?: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface McpTrustReadResult {
|
|
65
|
+
state: McpTrustState;
|
|
66
|
+
/** Non-empty when the file exists but could not be used; the state is then empty. */
|
|
67
|
+
diagnostics: string[];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
71
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function isActionClass(value: unknown): value is McpTrustActionClass {
|
|
75
|
+
return typeof value === "string" && (MCP_TRUST_ACTION_CLASSES as ReadonlyArray<string>).includes(value);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function mcpTrustPath(configDir?: string): string {
|
|
79
|
+
return path.join(configDir ?? clioConfigDir(), MCP_TRUST_FILENAME);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function canonicalProjectRoot(cwd: string): string {
|
|
83
|
+
const resolved = path.resolve(cwd);
|
|
84
|
+
try {
|
|
85
|
+
return realpathSync(resolved);
|
|
86
|
+
} catch {
|
|
87
|
+
return resolved;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function parseTrustState(text: string): McpTrustState | Error {
|
|
92
|
+
let parsed: unknown;
|
|
93
|
+
try {
|
|
94
|
+
parsed = JSON.parse(text) as unknown;
|
|
95
|
+
} catch (error) {
|
|
96
|
+
return new Error(`invalid JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
97
|
+
}
|
|
98
|
+
if (!isRecord(parsed) || parsed.version !== MCP_TRUST_VERSION) {
|
|
99
|
+
return new Error(`trust state must be a version ${MCP_TRUST_VERSION} object`);
|
|
100
|
+
}
|
|
101
|
+
if (!Array.isArray(parsed.records)) return new Error("trust state records must be an array");
|
|
102
|
+
if (parsed.records.length > MCP_TRUST_CAPS.records) {
|
|
103
|
+
return new Error(`trust state exceeds the ${MCP_TRUST_CAPS.records}-record cap`);
|
|
104
|
+
}
|
|
105
|
+
const records: McpTrustRecord[] = [];
|
|
106
|
+
for (const [index, raw] of parsed.records.entries()) {
|
|
107
|
+
if (!isRecord(raw)) return new Error(`records[${index}] must be an object`);
|
|
108
|
+
for (const field of ["projectRoot", "id", "digest", "trustedAt"] as const) {
|
|
109
|
+
if (typeof raw[field] !== "string" || raw[field].length === 0) {
|
|
110
|
+
return new Error(`records[${index}].${field} must be a non-empty string`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (!isActionClass(raw.actionClass)) {
|
|
114
|
+
return new Error(`records[${index}].actionClass must be one of ${MCP_TRUST_ACTION_CLASSES.join(", ")}`);
|
|
115
|
+
}
|
|
116
|
+
records.push({
|
|
117
|
+
projectRoot: raw.projectRoot as string,
|
|
118
|
+
id: raw.id as string,
|
|
119
|
+
digest: raw.digest as string,
|
|
120
|
+
actionClass: raw.actionClass,
|
|
121
|
+
trustedAt: raw.trustedAt as string,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return { version: MCP_TRUST_VERSION, records };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Read the trust file through a bounded read. A missing file is an empty
|
|
129
|
+
* state; an oversized, over-populated, or corrupt one is empty with a
|
|
130
|
+
* diagnostic, and nothing here ever rewrites it.
|
|
131
|
+
*/
|
|
132
|
+
export function readMcpTrustState(configDir?: string): McpTrustReadResult {
|
|
133
|
+
const filePath = mcpTrustPath(configDir);
|
|
134
|
+
const empty: McpTrustState = { version: MCP_TRUST_VERSION, records: [] };
|
|
135
|
+
const read = readBoundedFileText(filePath, MCP_TRUST_CAPS.fileBytes);
|
|
136
|
+
if (!read.ok) {
|
|
137
|
+
if (read.reason === "missing") return { state: empty, diagnostics: [] };
|
|
138
|
+
return { state: empty, diagnostics: [`${filePath}: ${read.message}`] };
|
|
139
|
+
}
|
|
140
|
+
const parsed = parseTrustState(read.text);
|
|
141
|
+
if (parsed instanceof Error) return { state: empty, diagnostics: [`${filePath}: ${parsed.message}`] };
|
|
142
|
+
return { state: parsed, diagnostics: [] };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Persist the state, or name why it would not be readable again under the caps. */
|
|
146
|
+
function writeTrustState(records: ReadonlyArray<McpTrustRecord>, configDir?: string): string | null {
|
|
147
|
+
if (records.length > MCP_TRUST_CAPS.records) {
|
|
148
|
+
return `trust state would exceed the ${MCP_TRUST_CAPS.records}-record cap; untrust servers you no longer use first`;
|
|
149
|
+
}
|
|
150
|
+
const sorted = [...records].sort(
|
|
151
|
+
(left, right) => left.projectRoot.localeCompare(right.projectRoot) || left.id.localeCompare(right.id),
|
|
152
|
+
);
|
|
153
|
+
const text = `${JSON.stringify({ version: MCP_TRUST_VERSION, records: sorted }, null, 2)}\n`;
|
|
154
|
+
if (Buffer.byteLength(text, "utf8") > MCP_TRUST_CAPS.fileBytes) {
|
|
155
|
+
return `trust state would exceed the ${MCP_TRUST_CAPS.fileBytes}-byte cap; untrust servers you no longer use first`;
|
|
156
|
+
}
|
|
157
|
+
safeResourceWrite(mcpTrustPath(configDir), text, { mode: 0o600 });
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function trustStatusFor(server: McpServerDeclaration, projectRoot: string, state: McpTrustState): McpTrustStatus {
|
|
162
|
+
if (server.scope === "user") return { status: "trusted", actionClass: "unknown" };
|
|
163
|
+
const record = state.records.find((entry) => entry.projectRoot === projectRoot && entry.id === server.id);
|
|
164
|
+
if (record === undefined) {
|
|
165
|
+
return {
|
|
166
|
+
status: "untrusted",
|
|
167
|
+
actionClass: "unknown",
|
|
168
|
+
reason: `project-scope server '${server.id}' requires explicit trust: clio-coder mcp trust ${server.id}`,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
if (record.digest !== server.digest) {
|
|
172
|
+
return {
|
|
173
|
+
status: "stale",
|
|
174
|
+
actionClass: "unknown",
|
|
175
|
+
reason: `declaration of '${server.id}' changed (command, args, env, cwd, or timeout) since it was trusted; review it and run clio-coder mcp trust ${server.id} again`,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return { status: "trusted", actionClass: record.actionClass };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export interface ResolvedMcpServers {
|
|
182
|
+
servers: ResolvedMcpServer[];
|
|
183
|
+
diagnostics: McpConfigDiagnostic[];
|
|
184
|
+
/** Trust-file problems, separate from config diagnostics. */
|
|
185
|
+
trustDiagnostics: string[];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** Every declared server with its trust status; the gateway launches only `trusted` entries. */
|
|
189
|
+
export function resolveMcpServers(options: McpTrustOptions): ResolvedMcpServers {
|
|
190
|
+
const loaded = loadMcpServerConfig(options);
|
|
191
|
+
const trust = readMcpTrustState(options.configDir);
|
|
192
|
+
const projectRoot = canonicalProjectRoot(options.cwd);
|
|
193
|
+
return {
|
|
194
|
+
servers: loaded.servers.map((server) => ({ ...server, trust: trustStatusFor(server, projectRoot, trust.state) })),
|
|
195
|
+
diagnostics: loaded.diagnostics,
|
|
196
|
+
trustDiagnostics: trust.diagnostics,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export interface TrustMcpServerOptions extends McpTrustOptions {
|
|
201
|
+
id: string;
|
|
202
|
+
actionClass?: McpTrustActionClass;
|
|
203
|
+
now?: () => Date;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export type TrustMcpServerResult = { ok: true; record: McpTrustRecord } | { ok: false; message: string };
|
|
207
|
+
|
|
208
|
+
/** Record trust for one project-declared server at its current digest. */
|
|
209
|
+
export function trustMcpServer(options: TrustMcpServerOptions): TrustMcpServerResult {
|
|
210
|
+
const actionClass = options.actionClass ?? "unknown";
|
|
211
|
+
if (!isActionClass(actionClass)) {
|
|
212
|
+
return { ok: false, message: `actionClass must be one of ${MCP_TRUST_ACTION_CLASSES.join(", ")}` };
|
|
213
|
+
}
|
|
214
|
+
const loaded = loadMcpServerConfig(options);
|
|
215
|
+
const server = loaded.servers.find((entry) => entry.id === options.id);
|
|
216
|
+
if (server === undefined) {
|
|
217
|
+
const problems = loaded.diagnostics.map((entry) => `${entry.path}: ${entry.message}`);
|
|
218
|
+
return {
|
|
219
|
+
ok: false,
|
|
220
|
+
message:
|
|
221
|
+
`no declared MCP server with id '${options.id}'` +
|
|
222
|
+
(problems.length > 0 ? `; config diagnostics: ${problems.join("; ")}` : ""),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
if (server.scope !== "project") {
|
|
226
|
+
return { ok: false, message: `server '${options.id}' is a user-scope declaration; it is trusted by authorship` };
|
|
227
|
+
}
|
|
228
|
+
const trust = readMcpTrustState(options.configDir);
|
|
229
|
+
if (trust.diagnostics.length > 0) {
|
|
230
|
+
return { ok: false, message: `trust state is unusable; repair or remove it first: ${trust.diagnostics.join("; ")}` };
|
|
231
|
+
}
|
|
232
|
+
const projectRoot = canonicalProjectRoot(options.cwd);
|
|
233
|
+
const record: McpTrustRecord = {
|
|
234
|
+
projectRoot,
|
|
235
|
+
id: server.id,
|
|
236
|
+
digest: server.digest,
|
|
237
|
+
actionClass,
|
|
238
|
+
trustedAt: (options.now?.() ?? new Date()).toISOString(),
|
|
239
|
+
};
|
|
240
|
+
const records = trust.state.records.filter((entry) => !(entry.projectRoot === projectRoot && entry.id === server.id));
|
|
241
|
+
records.push(record);
|
|
242
|
+
const refused = writeTrustState(records, options.configDir);
|
|
243
|
+
if (refused !== null) return { ok: false, message: refused };
|
|
244
|
+
return { ok: true, record };
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export type UntrustMcpServerResult = { ok: true; removed: boolean } | { ok: false; message: string };
|
|
248
|
+
|
|
249
|
+
/** Remove the trust record for one server in this project, whether or not it is still declared. */
|
|
250
|
+
export function untrustMcpServer(options: McpTrustOptions & { id: string }): UntrustMcpServerResult {
|
|
251
|
+
const trust = readMcpTrustState(options.configDir);
|
|
252
|
+
if (trust.diagnostics.length > 0) {
|
|
253
|
+
return { ok: false, message: `trust state is unusable; repair or remove it first: ${trust.diagnostics.join("; ")}` };
|
|
254
|
+
}
|
|
255
|
+
const projectRoot = canonicalProjectRoot(options.cwd);
|
|
256
|
+
const records = trust.state.records.filter((entry) => !(entry.projectRoot === projectRoot && entry.id === options.id));
|
|
257
|
+
const removed = records.length !== trust.state.records.length;
|
|
258
|
+
if (removed) {
|
|
259
|
+
const refused = writeTrustState(records, options.configDir);
|
|
260
|
+
if (refused !== null) return { ok: false, message: refused };
|
|
261
|
+
}
|
|
262
|
+
return { ok: true, removed };
|
|
263
|
+
}
|
|
@@ -482,7 +482,10 @@ export function formatDoctorReport(findings: DoctorFinding[]): string {
|
|
|
482
482
|
* to the durable preflight store that dispatch placement consults. A failing
|
|
483
483
|
* node is a WARN (ineligible for placement), never fatal.
|
|
484
484
|
*/
|
|
485
|
-
export async function runDoctorFleetChecks(
|
|
485
|
+
export async function runDoctorFleetChecks(
|
|
486
|
+
projectRoot: string = process.cwd(),
|
|
487
|
+
options: { fix?: boolean } = {},
|
|
488
|
+
): Promise<DoctorFinding[]> {
|
|
486
489
|
let settings: ReturnType<typeof readSettings>;
|
|
487
490
|
try {
|
|
488
491
|
settings = readSettings();
|
|
@@ -491,7 +494,7 @@ export async function runDoctorFleetChecks(projectRoot: string = process.cwd()):
|
|
|
491
494
|
}
|
|
492
495
|
const nodes = settings.fleet?.nodes ?? [];
|
|
493
496
|
if (nodes.length === 0) return [];
|
|
494
|
-
const { runFleetNodePreflight } = await import("../dispatch/fleet-preflight.js");
|
|
497
|
+
const { recordFleetPreflight, runFleetNodePreflight } = await import("../dispatch/fleet-preflight.js");
|
|
495
498
|
// Endpoint facts are per node. Every configured target is probed from every
|
|
496
499
|
// node, because a `localhost` URL names a different machine on each one and
|
|
497
500
|
// an orchestrator-side probe would describe none of them.
|
|
@@ -502,12 +505,23 @@ export async function runDoctorFleetChecks(projectRoot: string = process.cwd()):
|
|
|
502
505
|
...(target.defaultModel !== undefined ? { wireModelId: target.defaultModel } : {}),
|
|
503
506
|
}));
|
|
504
507
|
const records = await Promise.all(nodes.map((node) => runFleetNodePreflight(node, projectRoot, { targets })));
|
|
508
|
+
// Placement admits a node only from a stored record. Plain doctor observes;
|
|
509
|
+
// --fix is the run that may write state, so it is the one that records.
|
|
510
|
+
let recorded = options.fix === true;
|
|
511
|
+
if (recorded) {
|
|
512
|
+
try {
|
|
513
|
+
recordFleetPreflight(records);
|
|
514
|
+
} catch {
|
|
515
|
+
recorded = false;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
const admission = recorded ? "recorded for dispatch" : "not recorded, run doctor --fix to admit this node";
|
|
505
519
|
return records.map((record) => ({
|
|
506
520
|
ok: true,
|
|
507
521
|
level: record.ok ? "ok" : "warn",
|
|
508
522
|
name: `fleet node ${record.nodeId}`,
|
|
509
523
|
detail: record.ok
|
|
510
|
-
? `eligible: ${record.host} clio ${record.remoteVersion ?? "(custom entry)"}, path parity for ${record.projectRoot}, ${
|
|
524
|
+
? `eligible (${admission}): ${record.host} clio ${record.remoteVersion ?? "(custom entry)"}, path parity for ${record.projectRoot}, ${
|
|
511
525
|
record.targets.filter((fact) => fact.reachable === "true").length
|
|
512
526
|
}/${record.targets.length} targets reachable from the node`
|
|
513
527
|
: `ineligible: ${record.detail ?? "preflight failed"}`,
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
*
|
|
11
11
|
* There is no arbitrary script execution: `command` takes an argv array and is
|
|
12
12
|
* run without a shell, so there is no string to inject into. Hooks never
|
|
13
|
-
* replace the safety policy. They
|
|
14
|
-
*
|
|
13
|
+
* replace the safety policy. They can only add effects (including requesting
|
|
14
|
+
* `block_tool`); the durable safety contract
|
|
15
15
|
* still classifies every tool call independently and a hook cannot grant a
|
|
16
16
|
* permission safety would deny.
|
|
17
17
|
*
|
|
@@ -11,16 +11,12 @@
|
|
|
11
11
|
* created, tracked in `pane-registry.ts` and tagged with the `clio_coder_owner`
|
|
12
12
|
* metadata token so `clio-coder doctor` can find orphans. The one documented
|
|
13
13
|
* exception is Clio's own hosting pane in guest mode, which `reportSelf`
|
|
14
|
-
* writes to
|
|
14
|
+
* writes to without requiring Clio ownership.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* nobody had asked for. The one run-viewing surface is now the workers-view
|
|
21
|
-
* watch pane (src/interactive/watch-pane.ts): a single utility pane following
|
|
22
|
-
* a selection file, opened on operator demand and retargeted by file writes
|
|
23
|
-
* that never touch this socket.
|
|
16
|
+
* Runs are viewed through the workers-view watch pane
|
|
17
|
+
* (src/interactive/watch-pane.ts). This single utility pane follows a selection
|
|
18
|
+
* file, opens on operator demand, and is retargeted by file writes that never
|
|
19
|
+
* touch this socket. Dispatch does not create per-run viewer panes.
|
|
24
20
|
*/
|
|
25
21
|
|
|
26
22
|
import type { DomainContract } from "../../core/domain-loader.js";
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* contract test pins that by making `net.connect` throw for the duration of the
|
|
9
9
|
* call.
|
|
10
10
|
*
|
|
11
|
-
* Embedded
|
|
11
|
+
* Embedded pane hosting is not implemented, so it resolves to `none`.
|
|
12
12
|
* Asking for it is not an error, but it is a refusal rather than a quiet
|
|
13
13
|
* degrade: the detection carries `refused: true`, the boot prints the reason on
|
|
14
14
|
* stderr, and doctor's mode row warns. A session that asked for panes and got
|
|
@@ -14,7 +14,7 @@ import { detectMux, type MuxEnablement } from "./detect.js";
|
|
|
14
14
|
import type { MuxLog } from "./types.js";
|
|
15
15
|
|
|
16
16
|
export interface MuxDomainOptions {
|
|
17
|
-
/** `off` skips detection
|
|
17
|
+
/** `off` skips detection; unsupported `embedded` hosting is refused as `none`. */
|
|
18
18
|
enabled?: MuxEnablement;
|
|
19
19
|
env?: NodeJS.ProcessEnv;
|
|
20
20
|
log?: MuxLog;
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Protocol floors for the wire methods that are not universal.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* enough to predate them answers `invalid_request`, and the honest response is
|
|
9
|
-
* to take the documented fallback rather than to log a failure per call.
|
|
4
|
+
* The `ping` handshake records the server protocol and version. Notification,
|
|
5
|
+
* pane-control, layout, and worktree methods require the protocol floors below.
|
|
6
|
+
* Older servers answer `invalid_request`, so callers check support and take
|
|
7
|
+
* the documented fallback before making those calls.
|
|
10
8
|
*
|
|
11
9
|
* The floors are protocol introductions checked against herdr's changelog and
|
|
12
10
|
* then re-verified with `herdr api schema --json` on the released artifacts
|
|
@@ -24,7 +22,7 @@
|
|
|
24
22
|
|
|
25
23
|
import type { MuxServerInfo } from "./types.js";
|
|
26
24
|
|
|
27
|
-
/** Wire methods
|
|
25
|
+
/** Wire methods with explicit protocol floors. Basic discovery methods are unconditional. */
|
|
28
26
|
export type MuxGatedMethod =
|
|
29
27
|
| "notification.show"
|
|
30
28
|
| "pane.rename"
|
|
@@ -175,9 +175,9 @@ export interface MuxWorktreeRemovedResult {
|
|
|
175
175
|
}
|
|
176
176
|
|
|
177
177
|
/**
|
|
178
|
-
* The domain-facing surface
|
|
179
|
-
*
|
|
180
|
-
*
|
|
178
|
+
* The domain-facing wire surface covers discovery, workspace and pane control,
|
|
179
|
+
* notifications, layouts, worktrees, and agent metadata. Individual methods
|
|
180
|
+
* document their protocol requirements and behavior below.
|
|
181
181
|
*/
|
|
182
182
|
export interface MuxClient {
|
|
183
183
|
readonly socketPath: string;
|