@iowarp/clio-coder 0.4.9 → 0.5.0
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 +11 -3
- package/CHANGELOG.md +153 -0
- package/CODE_OF_CONDUCT.md +10 -0
- package/CONTRIBUTING.md +208 -382
- package/NOTICE +8 -2
- package/README.md +199 -418
- package/ROADMAP.md +82 -0
- package/SECURITY.md +14 -11
- package/dist/acp-KS7ARGV6.js +132 -0
- package/dist/agents-YOGJ2YEJ.js +163 -0
- package/dist/assets/codewiki.json +1 -1
- package/dist/auth-CEDCO6O6.js +557 -0
- package/dist/background-YWTBPSQU.js +39 -0
- package/dist/builtins-GDYO4RTR.js +23 -0
- package/dist/chunk-27YTM2CV.js +175 -0
- package/dist/chunk-2AF6YC7Q.js +75 -0
- package/dist/chunk-2DTIWSAW.js +381 -0
- package/dist/chunk-2EMLKSCX.js +262 -0
- package/dist/chunk-2OJ3YZQP.js +665 -0
- package/dist/chunk-2VLYHHFT.js +35 -0
- package/dist/chunk-2WVPJF3Z.js +204 -0
- package/dist/chunk-33OASOS6.js +176 -0
- package/dist/chunk-3BD2LXYJ.js +19 -0
- package/dist/chunk-3JHUFKG7.js +30 -0
- package/dist/chunk-3JLTRPN7.js +711 -0
- package/dist/chunk-3LT34CAM.js +2796 -0
- package/dist/chunk-3O5JWP4L.js +1670 -0
- package/dist/chunk-3UW3KU4A.js +21 -0
- package/dist/chunk-4A6YRGV4.js +569 -0
- package/dist/chunk-4D2BRCZ3.js +67 -0
- package/dist/chunk-4SYHGVDE.js +668 -0
- package/dist/chunk-4VDHLCF5.js +66 -0
- package/dist/chunk-4WOOTKFD.js +637 -0
- package/dist/chunk-4WV4PI66.js +80 -0
- package/dist/chunk-53OXPRI6.js +195 -0
- package/dist/chunk-55RMDDFM.js +1347 -0
- package/dist/chunk-56XP4FJU.js +2025 -0
- package/dist/chunk-5B3RTYAK.js +123 -0
- package/dist/chunk-5CD243WE.js +45 -0
- package/dist/chunk-5JQR5B4D.js +709 -0
- package/dist/chunk-5KQEUIWM.js +597 -0
- package/dist/chunk-5LP5FNNR.js +915 -0
- package/dist/chunk-62UK7AGW.js +9344 -0
- package/dist/chunk-6CTHLZFB.js +563 -0
- package/dist/chunk-6EJYVCTN.js +23 -0
- package/dist/chunk-6OWUM2NC.js +12289 -0
- package/dist/chunk-6RJMYYIE.js +1023 -0
- package/dist/chunk-6W75D37F.js +643 -0
- package/dist/chunk-733ZBT5P.js +1721 -0
- package/dist/chunk-77DCC6JZ.js +3710 -0
- package/dist/chunk-7QXCO3AF.js +156 -0
- package/dist/chunk-7RET77VB.js +481 -0
- package/dist/chunk-A4MVRV4C.js +65 -0
- package/dist/chunk-ALJWT6O6.js +93 -0
- package/dist/chunk-AVSR2HKI.js +232 -0
- package/dist/chunk-B7GY6QER.js +42 -0
- package/dist/chunk-BFOSV5EZ.js +178 -0
- package/dist/chunk-BGOIM7NB.js +103 -0
- package/dist/chunk-BJH6WFIB.js +372 -0
- package/dist/chunk-BOBCCDJ6.js +1533 -0
- package/dist/chunk-BRCOSE7O.js +117 -0
- package/dist/chunk-BYFHHCFV.js +601 -0
- package/dist/chunk-C2CPOIH2.js +83 -0
- package/dist/chunk-C7AQTPCE.js +694 -0
- package/dist/chunk-CBAQPTDU.js +165 -0
- package/dist/chunk-CDQ2UC6W.js +125 -0
- package/dist/chunk-CN6SW5DC.js +177 -0
- package/dist/chunk-CRHPCPZP.js +132 -0
- package/dist/chunk-CTFPFW3H.js +44 -0
- package/dist/chunk-D3KWFOUT.js +103 -0
- package/dist/chunk-D65E25JG.js +185 -0
- package/dist/chunk-DCGHJQ2U.js +236 -0
- package/dist/chunk-DE2LU267.js +106 -0
- package/dist/chunk-DF6PI6GN.js +97 -0
- package/dist/chunk-DGC6X6XR.js +53 -0
- package/dist/chunk-DOUISWEE.js +526 -0
- package/dist/chunk-DR3TAEUA.js +188 -0
- package/dist/chunk-DVTBERFY.js +33 -0
- package/dist/chunk-DXSETN72.js +1051 -0
- package/dist/chunk-DZLR4UEH.js +128 -0
- package/dist/chunk-E6IPKW2E.js +77 -0
- package/dist/chunk-EG4ARXPC.js +139 -0
- package/dist/chunk-EKV4UBCM.js +652 -0
- package/dist/chunk-EOJPDNUP.js +1325 -0
- package/dist/chunk-EX57VVWW.js +4157 -0
- package/dist/chunk-EYTLV3W3.js +5937 -0
- package/dist/chunk-EZD2BXGP.js +475 -0
- package/dist/chunk-EZDCA34W.js +314 -0
- package/dist/chunk-FD2I4KBR.js +33 -0
- package/dist/chunk-FD3IAHQM.js +27 -0
- package/dist/chunk-FFYTC2KQ.js +416 -0
- package/dist/chunk-FGSQHUCK.js +110 -0
- package/dist/chunk-GCQFN7YI.js +32 -0
- package/dist/chunk-GGPF6LLE.js +38 -0
- package/dist/chunk-GGWI3OVM.js +215 -0
- package/dist/chunk-GLIQT7SU.js +172 -0
- package/dist/chunk-GN7QBEEI.js +95 -0
- package/dist/chunk-GRHOXDKB.js +1104 -0
- package/dist/chunk-HMN2C6YL.js +54 -0
- package/dist/chunk-HOEDA42N.js +310 -0
- package/dist/chunk-HOYZUKG7.js +192 -0
- package/dist/chunk-HQVN7G4F.js +1021 -0
- package/dist/chunk-HSQQFDB3.js +519 -0
- package/dist/chunk-I4ELN5BX.js +47 -0
- package/dist/chunk-I4Y4WKZR.js +386 -0
- package/dist/chunk-IFPDAD7R.js +797 -0
- package/dist/chunk-IN7DGBVS.js +582 -0
- package/dist/chunk-ISHUS7HC.js +396 -0
- package/dist/chunk-JPXLJSGR.js +191 -0
- package/dist/chunk-JQCLXSFI.js +69 -0
- package/dist/chunk-KBUTSJSR.js +61 -0
- package/dist/chunk-KW5HXKLJ.js +56 -0
- package/dist/chunk-L4APUGCT.js +139 -0
- package/dist/chunk-L7G7K4I2.js +505 -0
- package/dist/chunk-LAR7DX5E.js +1840 -0
- package/dist/chunk-LAVUQX3B.js +462 -0
- package/dist/chunk-LJRBX7QR.js +116 -0
- package/dist/chunk-LNOXCGN2.js +1864 -0
- package/dist/chunk-LTWH2ACR.js +23002 -0
- package/dist/chunk-LYJJ6546.js +661 -0
- package/dist/chunk-M2IPMWCN.js +457 -0
- package/dist/chunk-MGLRTOCK.js +101 -0
- package/dist/chunk-MZF5IKZT.js +160 -0
- package/dist/chunk-N24R6KWS.js +386 -0
- package/dist/chunk-NASYVWDB.js +604 -0
- package/dist/chunk-NBXFPI7U.js +195 -0
- package/dist/chunk-NDPF2N2L.js +400 -0
- package/dist/chunk-NFSK2VNU.js +446 -0
- package/dist/chunk-NG3QQSXY.js +43 -0
- package/dist/chunk-NOCSM22Y.js +63 -0
- package/dist/chunk-NVPXXW2H.js +1143 -0
- package/dist/chunk-O63U2I6I.js +30 -0
- package/dist/chunk-OJXOA6YU.js +98 -0
- package/dist/chunk-OPD7GL6F.js +1196 -0
- package/dist/chunk-OQ2EOAHA.js +14399 -0
- package/dist/chunk-OV62D6KO.js +688 -0
- package/dist/chunk-OZ76TLGU.js +740 -0
- package/dist/chunk-P4GNZPXO.js +1156 -0
- package/dist/chunk-PS6JAWJZ.js +78 -0
- package/dist/chunk-PXRCXGLK.js +1865 -0
- package/dist/chunk-QDUUOZ3S.js +108 -0
- package/dist/chunk-QG6I2T5E.js +1416 -0
- package/dist/chunk-QHSBROEW.js +308 -0
- package/dist/chunk-QNUQ7K7D.js +46 -0
- package/dist/chunk-QZTTRSJE.js +333 -0
- package/dist/chunk-R2UUNSNQ.js +1605 -0
- package/dist/chunk-R7FGRZNF.js +1794 -0
- package/dist/chunk-RNDCROSG.js +199 -0
- package/dist/chunk-S36CXHO2.js +302 -0
- package/dist/chunk-SJGS3GDI.js +575 -0
- package/dist/chunk-SQZHXUB3.js +510 -0
- package/dist/chunk-SUTLW6ND.js +686 -0
- package/dist/chunk-SYF7FVBL.js +179 -0
- package/dist/chunk-T2MDZES3.js +1577 -0
- package/dist/chunk-T33IYTZM.js +1146 -0
- package/dist/chunk-TDGYTWM6.js +49 -0
- package/dist/chunk-TGL5FZVD.js +132 -0
- package/dist/chunk-TGWZXJ7L.js +1205 -0
- package/dist/chunk-TKDRT2DF.js +114 -0
- package/dist/chunk-TV2EBCSQ.js +152 -0
- package/dist/chunk-U26XXPJS.js +367 -0
- package/dist/chunk-U5QU5ZOD.js +419 -0
- package/dist/chunk-U6YTUVOX.js +1011 -0
- package/dist/chunk-UCINIRHW.js +188 -0
- package/dist/chunk-UJD5MPP6.js +52 -0
- package/dist/chunk-URCXX7WJ.js +146 -0
- package/dist/chunk-UX2L5CUD.js +898 -0
- package/dist/chunk-UZVYEF57.js +114 -0
- package/dist/chunk-V35KZDUZ.js +218 -0
- package/dist/chunk-VESL6DQY.js +1058 -0
- package/dist/chunk-VKHLUZNO.js +986 -0
- package/dist/chunk-VOYUCAQF.js +584 -0
- package/dist/chunk-VYRQHORQ.js +414 -0
- package/dist/chunk-W53XSRQE.js +245 -0
- package/dist/chunk-X4CEFOSG.js +226 -0
- package/dist/chunk-XDHUDE5K.js +380 -0
- package/dist/chunk-XISLDHEL.js +1290 -0
- package/dist/chunk-XM34YQ2Y.js +169 -0
- package/dist/chunk-XMDBTYCH.js +661 -0
- package/dist/chunk-XS2QPZJE.js +449 -0
- package/dist/chunk-YBUECLAF.js +618 -0
- package/dist/chunk-YQ6XEFVK.js +332 -0
- package/dist/chunk-YYLCPDCC.js +990 -0
- package/dist/chunk-Z4GLJ6J4.js +1035 -0
- package/dist/chunk-ZARZ4POR.js +210 -0
- package/dist/chunk-ZJPORZTC.js +119 -0
- package/dist/chunk-ZNUZ3EXD.js +243 -0
- package/dist/chunk-ZPST2KQO.js +49 -0
- package/dist/chunk-ZR5YA6ZF.js +512 -0
- package/dist/chunk-ZU4JPCPR.js +319 -0
- package/dist/chunk-ZUKUCZYZ.js +39 -0
- package/dist/cli/index.js +56 -45
- package/dist/clio-K2PBVCEM.js +27 -0
- package/dist/clio-context-tools-GR4OHFSO.js +145 -0
- package/dist/code-nav-4X3OI6DK.js +715 -0
- package/dist/codewiki/build-worker.js +4 -4
- package/dist/compile-cache-YRB6QRO7.js +18 -0
- package/dist/components-RQOJ6NUR.js +675 -0
- package/dist/config-Q5J7UBAB.js +291 -0
- package/dist/config-XE7XYZLU.js +38 -0
- package/dist/config-graph-P3555574.js +175 -0
- package/dist/configure-KIJ32ZO6.js +104 -0
- package/dist/context-LFBQOSXT.js +344 -0
- package/dist/context-NNLBES2Y.js +82 -0
- package/dist/context-WBH3KSVR.js +302 -0
- package/dist/context-clear-YOHMQ6SQ.js +208 -0
- package/dist/context-index-X2N5UAIF.js +120 -0
- package/dist/context-map-HOSMGUG2.js +555 -0
- package/dist/context-working-set-MRAEVDNV.js +1564 -0
- package/dist/data-tool-JJPBGMQJ.js +2986 -0
- package/dist/detail-RHJOTGN4.js +139 -0
- package/dist/dispatch-runner-NC7PYNIO.js +2477 -0
- package/dist/docs-K4GBWRUX.js +342 -0
- package/dist/doctor-S5KZ2GTN.js +1138 -0
- package/dist/doctor-deep-2EJQSHIZ.js +130 -0
- package/dist/domain-loader-MB34FDPD.js +13 -0
- package/dist/eval-3D6M36N7.js +5220 -0
- package/dist/eval-inventory-SM3HNM47.js +260 -0
- package/dist/evals-FO6JEUCN.js +104 -0
- package/dist/evidence-6IYN52ET.js +262 -0
- package/dist/evidence-JVECPI3F.js +250 -0
- package/dist/evidence-XNVPPLVK.js +410 -0
- package/dist/evolve-TLPUDJDM.js +634 -0
- package/dist/extensions-ROZJ5X3J.js +311 -0
- package/dist/fleet-6RJWIOEO.js +284 -0
- package/dist/fleet-WKVBF5SZ.js +942 -0
- package/dist/fleet-commands-L6WFT7KZ.js +76 -0
- package/dist/fleet-decisions-BTQMWU5A.js +55 -0
- package/dist/fleet-graph-553DZ67Q.js +141 -0
- package/dist/fleet-inspect-236FZPRB.js +329 -0
- package/dist/fleet-new-CKUXP3CO.js +48 -0
- package/dist/fleet-preflight-NZQHABWO.js +95 -0
- package/dist/fleet-validate-7NLAE26R.js +96 -0
- package/dist/fleet-verify-E3RO6A5W.js +226 -0
- package/dist/fleet-view-KMZQY7YJ.js +144 -0
- package/dist/gui/client/assets/abnfDiagram-VCTEODGH-DPBWQwNn.js +1 -0
- package/dist/gui/client/assets/architecture-7GRP2DOG-D1w8FrFW.js +1 -0
- package/dist/gui/client/assets/architectureDiagram-5GKGNRK7-CVPgKd1-.js +36 -0
- package/dist/gui/client/assets/blockDiagram-I7D4REHJ-BLmnqkK5.js +129 -0
- package/dist/gui/client/assets/c4Diagram-7LVT6UL2-4AU9cfM7.js +38 -0
- package/dist/gui/client/assets/channel-DwFZ0m8S.js +1 -0
- package/dist/gui/client/assets/chunk-4HAMMTFA-EOWkKCav.js +62 -0
- package/dist/gui/client/assets/chunk-75Z2AOVW-CygeoIMl.js +2 -0
- package/dist/gui/client/assets/chunk-DU6HZSFF-s27fViLb.js +125 -0
- package/dist/gui/client/assets/chunk-F27PBJKO-BrHvwLsZ.js +1 -0
- package/dist/gui/client/assets/chunk-GMAD6QVW-DzPh-7jt.js +72 -0
- package/dist/gui/client/assets/chunk-GVQU2GXP-pIaQkIzm.js +1 -0
- package/dist/gui/client/assets/chunk-IMKFNOWR-BGJVE_Br.js +231 -0
- package/dist/gui/client/assets/chunk-L3NEJ4N5-B3YLuhww.js +1 -0
- package/dist/gui/client/assets/chunk-OSK3NFVY-BRj61HHU.js +10 -0
- package/dist/gui/client/assets/chunk-P2QGCYS3-Sno90KxP.js +1 -0
- package/dist/gui/client/assets/chunk-POPQ4Y6H-Cw8NTbxr.js +1 -0
- package/dist/gui/client/assets/chunk-PWAF6VOD-BIhHgz37.js +1 -0
- package/dist/gui/client/assets/chunk-SHT3W25Y-Cqv7npBj.js +168 -0
- package/dist/gui/client/assets/chunk-SVP7TREG-Hxzl6Dee.js +88 -0
- package/dist/gui/client/assets/chunk-TICWLB2K-CIFVyVP2.js +206 -0
- package/dist/gui/client/assets/classDiagram-ZZMXUADV-BJbAiI_w.js +1 -0
- package/dist/gui/client/assets/classDiagram-v2-VYDZK3BY-BJbAiI_w.js +1 -0
- package/dist/gui/client/assets/cynefin-OW5HDTMX-DecLWZ-y.js +1 -0
- package/dist/gui/client/assets/cynefinDiagram-5FMLGOSQ-CK-T2N-D.js +62 -0
- package/dist/gui/client/assets/dagre-GXQ25YYZ-C0dfg-OS.js +4 -0
- package/dist/gui/client/assets/diagram-S7CK7UJ4-EaJukVh-.js +30 -0
- package/dist/gui/client/assets/diagram-UQ7AKVKN-xcOucEtP.js +41 -0
- package/dist/gui/client/assets/diagram-VSXAHHWV-3AUJACMf.js +3 -0
- package/dist/gui/client/assets/diagram-VX7I27RA-TPknLqam.js +24 -0
- package/dist/gui/client/assets/diagram-Z3DM3KII-wa1q3YMF.js +24 -0
- package/dist/gui/client/assets/ebnfDiagram-PWID7BFC-JBCF2-s7.js +1 -0
- package/dist/gui/client/assets/erDiagram-RLTQ6QDP-CmXjXPc4.js +99 -0
- package/dist/gui/client/assets/eventmodeling-NTZA5JFV-D_1aJWYl.js +1 -0
- package/dist/gui/client/assets/flowDiagram-HODETNUW-BQtZlael.js +1 -0
- package/dist/gui/client/assets/framework-Bq-znqwW.js +9 -0
- package/dist/gui/client/assets/ganttDiagram-EL5Y4UJY-IPaL_kaa.js +292 -0
- package/dist/gui/client/assets/gitGraph-4MIJSDKK-Oy0Q3hoc.js +1 -0
- package/dist/gui/client/assets/gitGraphDiagram-WWUBYQGX-jtAuBmbc.js +106 -0
- package/dist/gui/client/assets/index-CuFuBEdL.css +1 -0
- package/dist/gui/client/assets/index-hMbEIsX0.js +87 -0
- package/dist/gui/client/assets/info-A6RAGUB7-UtEs1tv7.js +1 -0
- package/dist/gui/client/assets/infoDiagram-27XIBGKW-hlwR1pBW.js +2 -0
- package/dist/gui/client/assets/ishikawaDiagram-5VMMS53U-C6vMtfsd.js +70 -0
- package/dist/gui/client/assets/journeyDiagram-3NMN7TZE-EAwAl_PS.js +139 -0
- package/dist/gui/client/assets/kanban-definition-UXKFOSKX-CQOhRKHW.js +89 -0
- package/dist/gui/client/assets/line-DbcwGZTW.js +1 -0
- package/dist/gui/client/assets/mermaid-parser.core-C2QfVcHd.js +7 -0
- package/dist/gui/client/assets/mermaid.core-N9qUTre1.js +44 -0
- package/dist/gui/client/assets/mindmap-definition-YA3MSWOX-BR_FL9gK.js +96 -0
- package/dist/gui/client/assets/packet-AYTQ26CC-CbBJ2oAa.js +1 -0
- package/dist/gui/client/assets/pegDiagram-XKGWAZYB-BruU0IHM.js +1 -0
- package/dist/gui/client/assets/pie-WAS4IAKB-BWdSng4H.js +1 -0
- package/dist/gui/client/assets/pieDiagram-E7YTZNPT-CR3ljgdU.js +39 -0
- package/dist/gui/client/assets/quadrantDiagram-AXDQQJYC-C-boKslr.js +7 -0
- package/dist/gui/client/assets/radar-RG4KPBEZ-CGlOnAKG.js +1 -0
- package/dist/gui/client/assets/railroad-74A4TZTK-CDvuAlyC.js +1 -0
- package/dist/gui/client/assets/railroad-abnf-HS5TGJTU-CQUA9crC.js +1 -0
- package/dist/gui/client/assets/railroad-ebnf-LZEXJU2U-CD857gxq.js +1 -0
- package/dist/gui/client/assets/railroad-peg-WCYAUIDC-DUV4k35E.js +1 -0
- package/dist/gui/client/assets/railroadDiagram-O6MQD6OU-DMR4LXmA.js +1 -0
- package/dist/gui/client/assets/requirementDiagram-BXWQKSXE-DVltaF6c.js +84 -0
- package/dist/gui/client/assets/sankeyDiagram-P5KCCOFB-CHdNz472.js +40 -0
- package/dist/gui/client/assets/sequenceDiagram-WJ2MYXX4-DaMafIty.js +162 -0
- package/dist/gui/client/assets/stateDiagram-D77RDMKH-CEbBHqn3.js +1 -0
- package/dist/gui/client/assets/stateDiagram-v2-MP3YSRHH-B3JgDdFg.js +1 -0
- package/dist/gui/client/assets/swimlanes-42K2YHIH-BlPHndnJ.js +1 -0
- package/dist/gui/client/assets/swimlanesDiagram-VR7AAH4N-BPabHwsZ.js +8 -0
- package/dist/gui/client/assets/timeline-definition-24CTP7MA-E4Y1lPBI.js +120 -0
- package/dist/gui/client/assets/treeView-Q6P3EWNA-DrY0uhTN.js +1 -0
- package/dist/gui/client/assets/treemap-WGGIJYW6-CVotnLHf.js +1 -0
- package/dist/gui/client/assets/vennDiagram-4TSXK5OY-DJNrLIOF.js +34 -0
- package/dist/gui/client/assets/wardley-WFR3VGLG-ClOpAp5S.js +1 -0
- package/dist/gui/client/assets/wardleyDiagram-VM6X3IG4-qhMoKOXc.js +78 -0
- package/dist/gui/client/assets/xychartDiagram-S5SC5T6Z-CTuXoo9R.js +7 -0
- package/dist/gui/client/index.html +6 -0
- package/dist/gui/ops-worker.js +167 -0
- package/dist/gui/reads-worker.js +473 -0
- package/dist/gui/server.js +9780 -0
- package/dist/gui-QJS7XQMV.js +16 -0
- package/dist/init-DV5B6HQG.js +354 -0
- package/dist/install-6C45YXFP.js +19 -0
- package/dist/install-O7NSRU2W.js +13 -0
- package/dist/interactive-OXGYZYAS.js +22381 -0
- package/dist/interop-J7UOBOSF.js +254 -0
- package/dist/inventory-OEGIL6PY.js +144 -0
- package/dist/library-B3UPGY4V.js +83 -0
- package/dist/library-MXQA5DLT.js +309 -0
- package/dist/library-ROZAMUIL.js +496 -0
- package/dist/library-import-2LTWOVBD.js +190 -0
- package/dist/library-inventory-LJ3XHLWO.js +60 -0
- package/dist/library-validation-DARHHUNW.js +46 -0
- package/dist/mcp-2GSPYQ54.js +28 -0
- package/dist/memory-J3STUUIK.js +537 -0
- package/dist/models-Y3GMFJ2V.js +314 -0
- package/dist/monitor-LHNH577J.js +811 -0
- package/dist/orchestrator-DTAPXULA.js +12117 -0
- package/dist/panes-A743ONZ5.js +103 -0
- package/dist/panes-CTNO57ZY.js +76 -0
- package/dist/paths-3SBYJQDP.js +68 -0
- package/dist/preload-OJBMAIXF.js +140 -0
- package/dist/providers-CMETPZNS.js +232 -0
- package/dist/registry-37T4U6X2.js +15 -0
- package/dist/reset-O7EUCYWO.js +346 -0
- package/dist/resources-FY6XYFN2.js +189 -0
- package/dist/run-H64MEVTA.js +1067 -0
- package/dist/run-script-PQ5NRU3X.js +42 -0
- package/dist/settings-SNIQNXCW.js +73 -0
- package/dist/settings-controls-X6GMCPVG.js +202 -0
- package/dist/share-CAFMMQLM.js +299 -0
- package/dist/skills-ERKQUC7L.js +114 -0
- package/dist/skills-eval-CQ23MYQK.js +1099 -0
- package/dist/skills-inventory-TVUYJDVN.js +142 -0
- package/dist/slash-commands-ROG3KIFJ.js +107 -0
- package/dist/startup-background-KDWCQMWT.js +247 -0
- package/dist/steer-KKYXJSH4.js +77 -0
- package/dist/support-M3RCUUEL.js +40 -0
- package/dist/system-ZDW44ZGX.js +142 -0
- package/dist/target-runtimes-PWA22WVW.js +73 -0
- package/dist/targets-AJWA6E7Z.js +1207 -0
- package/dist/tasks-6L2JJRC5.js +39 -0
- package/dist/terminal-lease-YFUSDPAD.js +432 -0
- package/dist/tools-5XJUABRD.js +30 -0
- package/dist/trace-LA5MVR4Y.js +527 -0
- package/dist/tree-sitter-TQW3Y52T.js +4673 -0
- package/dist/tui-primitives-IUCVWLH5.js +19 -0
- package/dist/uninstall-SAWGGXAB.js +448 -0
- package/dist/upgrade-HSNSVTZG.js +300 -0
- package/dist/usage-XSILDHKF.js +1083 -0
- package/dist/verifiers-ECA5GIHL.js +633 -0
- package/dist/verify-R6QQCCEB.js +31 -0
- package/dist/version-PLZYB5KW.js +22 -0
- package/dist/web-fetch-PVZNMBOB.js +803 -0
- package/dist/wiki-generate-RP22WP5K.js +647 -0
- package/dist/with-panes-W3PAZPRF.js +629 -0
- package/dist/worker/entry.js +324 -284
- package/dist/workspace-check-3764ZKC2.js +83 -0
- package/docs/README.md +26 -10
- package/docs/architecture/acp.md +179 -12
- package/docs/architecture/artifact-placement.md +1 -1
- package/docs/architecture/capacity-and-scheduling.md +7 -8
- package/docs/architecture/context-engine.md +350 -95
- package/docs/architecture/model-catalog.md +18 -11
- package/docs/architecture/observability.md +1 -1
- package/docs/architecture/pi-boundary.md +59 -6
- package/docs/architecture/prompt-envelope-and-tools.md +147 -39
- package/docs/architecture/provider-adapter-cookbook.md +2 -2
- package/docs/architecture/safety-model.md +18 -4
- package/docs/architecture/trace-store.md +2 -2
- package/docs/architecture/tui-design.md +41 -81
- package/docs/architecture/worker-dispatch-mechanics.md +9 -1
- package/docs/gui/README.md +69 -0
- package/docs/gui/boundary-doctrine.md +104 -0
- package/docs/gui/chat-rendering-spec.md +1440 -0
- package/docs/gui/cli-surface-routing.md +148 -0
- package/docs/gui/delivery-order.md +53 -0
- package/docs/gui/event-bus-coverage.md +103 -0
- package/docs/gui/inspector-presentation.md +71 -0
- package/docs/gui/parity/01-cli-surface.md +74 -0
- package/docs/gui/parity/02-slash-and-surfaces.md +110 -0
- package/docs/gui/parity/03-domains-and-plan.md +69 -0
- package/docs/gui/performance-baseline.md +76 -0
- package/docs/gui/settings-write-surface.md +267 -0
- package/docs/gui/workflow-coverage.md +64 -0
- package/docs/guide/built-in-agents.md +1 -1
- package/docs/guide/commands-and-modes.md +256 -99
- package/docs/guide/configuration-and-targets.md +485 -124
- package/docs/guide/configuration-reference.md +165 -82
- package/docs/guide/doctor.md +127 -0
- package/docs/guide/environment-variables.md +1 -1
- package/docs/guide/exit-codes-and-output.md +3 -1
- package/docs/guide/extensions-and-sharing.md +3 -14
- package/docs/guide/fleet-dispatch.md +231 -45
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/installation-and-lifecycle.md +27 -16
- package/docs/guide/interop.md +2 -2
- package/docs/guide/proactive-memory.md +154 -68
- package/docs/guide/resource-library.md +4 -0
- package/docs/guide/skills-marketplace.md +8 -4
- package/docs/guide/slurm.md +88 -0
- package/docs/guide/tool-usage.md +134 -11
- package/docs/guide/troubleshooting.md +4 -2
- package/docs/process/battletest-2026-09-20-fixes.md +161 -0
- package/docs/process/configure-tree-proposal.md +637 -0
- package/docs/process/documentation-coverage.md +8 -0
- package/docs/process/documentation-guide.md +18 -1
- package/docs/process/eval-runner.md +58 -14
- package/docs/process/performance-methodology.md +11 -3
- package/docs/process/release-cut-checklist.md +29 -3
- package/docs/process/tool-audit-v0.4.9.md +3 -0
- package/examples/extensions/README.md +1 -3
- package/examples/extensions/lab-status/clio-coder-extension.json +1 -1
- package/examples/extensions/measurements/clio-coder-extension.json +1 -1
- package/library/registry.yaml +30 -5
- package/library/skills/git/fix-issue/SKILL.md +2 -1
- package/library/skills/git/fix-issue/plugin.json +1 -1
- package/library/skills/git/ship/SKILL.md +2 -1
- package/library/skills/git/ship/plugin.json +1 -1
- package/library/skills/meta/clio-coder-test/SKILL.md +5 -6
- package/library/skills/meta/clio-coder-test/evals.md +2 -2
- package/library/skills/meta/clio-coder-test/references/test-map.md +2 -2
- package/library/skills/registry.yaml +9 -5
- package/library/skills/research/slurm-jobs/SKILL.md +110 -0
- package/library/skills/research/slurm-jobs/evals.md +39 -0
- package/library/skills/research/slurm-jobs/plugin.json +23 -0
- package/library/skills/skill-marketplace.json +18 -2
- package/package.json +15 -10
- package/src/cli/args.ts +59 -0
- package/src/cli/argv.ts +7 -0
- package/src/cli/clio.ts +9 -1
- package/src/cli/configure-controls.ts +136 -0
- package/src/cli/configure-onboarding.ts +24 -7
- package/src/cli/configure-quick.ts +32 -7
- package/src/cli/configure-target.ts +11 -1
- package/src/cli/configure.ts +253 -256
- package/src/cli/docs-server.ts +290 -0
- package/src/cli/docs.ts +60 -15
- package/src/cli/doctor-deep.ts +126 -0
- package/src/cli/doctor-hpc.ts +122 -0
- package/src/cli/doctor-slurm.ts +130 -0
- package/src/cli/doctor-task-worktrees.ts +88 -0
- package/src/cli/doctor.ts +165 -16
- package/src/cli/fleet-verify.ts +3 -2
- package/src/cli/gui.ts +111 -0
- package/src/cli/index.ts +14 -4
- package/src/cli/library.ts +2 -7
- package/src/cli/modes/json-stream.ts +4 -2
- package/src/cli/modes/print.ts +252 -25
- package/src/cli/run.ts +199 -71
- package/src/cli/skills.ts +25 -7
- package/src/cli/targets.ts +87 -9
- package/src/cli/uninstall.ts +28 -8
- package/src/cli/usage.ts +2 -1
- package/src/cli/workspace-check.ts +71 -0
- package/src/core/bash-exec.ts +8 -2
- package/src/core/bus-events.ts +32 -3
- package/src/core/cache-telemetry.ts +3 -2
- package/src/core/compile-cache.ts +11 -1
- package/src/core/config.ts +59 -6
- package/src/core/defaults.ts +27 -5
- package/src/core/diagnostics.ts +25 -0
- package/src/core/event-bus.ts +2 -1
- package/src/core/gateway-routing.ts +10 -3
- package/src/core/git-commit-attribution.ts +2 -1
- package/src/core/naming-compat.ts +6 -4
- package/src/core/package-root.ts +0 -9
- package/src/core/path-canonical.ts +143 -24
- package/src/core/residency-target-key.ts +2 -6
- package/src/core/run-overrides.ts +1 -1
- package/src/core/settings-awareness.ts +108 -0
- package/src/core/settings-controls.ts +673 -0
- package/src/core/settings-navigation.ts +116 -0
- package/src/core/theme-token-hex.ts +19 -9
- package/src/core/turn-constraints.ts +52 -0
- package/src/domains/agents/builtins/scout.md +7 -17
- package/src/domains/agents/catalog.ts +5 -1
- package/src/domains/agents/extension.ts +2 -1
- package/src/domains/agents/registry.ts +4 -3
- package/src/domains/agents/result-contract.ts +132 -1
- package/src/domains/config/classify.ts +11 -7
- package/src/domains/config/extension.ts +5 -1
- package/src/domains/config/keybindings.ts +2 -2
- package/src/domains/context/codewiki/coordinator.ts +10 -0
- package/src/domains/context/worker/snapshot.ts +6 -3
- package/src/domains/dispatch/active-route-planner.ts +2 -0
- package/src/domains/dispatch/agent-candidates.ts +5 -1
- package/src/domains/dispatch/capability-match.ts +1 -1
- package/src/domains/dispatch/contract.ts +28 -0
- package/src/domains/dispatch/event-pump.ts +37 -3
- package/src/domains/dispatch/extension.ts +391 -48
- package/src/domains/dispatch/failure-classification.ts +37 -2
- package/src/domains/dispatch/receipt-integrity.ts +3 -0
- package/src/domains/dispatch/run-identity.ts +10 -3
- package/src/domains/dispatch/target-breaker.ts +163 -0
- package/src/domains/dispatch/types.ts +29 -2
- package/src/domains/dispatch/worker-model-loads.ts +66 -0
- package/src/domains/dispatch/worker-protocol.ts +20 -1
- package/src/domains/dispatch/worker-spawn.ts +28 -2
- package/src/domains/eval/artifacts/redact.ts +9 -0
- package/src/domains/eval/metrics/noop.ts +61 -0
- package/src/domains/eval/reports/junit.ts +5 -1
- package/src/domains/eval/reports/text.ts +7 -0
- package/src/domains/eval/runners/clio-run.ts +19 -8
- package/src/domains/eval/runners/external-command.ts +29 -4
- package/src/domains/eval/schema/adapter.ts +6 -2
- package/src/domains/eval/schema/suite.ts +2 -0
- package/src/domains/eval/schema/validate.ts +3 -0
- package/src/domains/eval/suites/run.ts +167 -26
- package/src/domains/evidence/detail.ts +3 -2
- package/src/domains/extensions/operator-runtime.ts +11 -4
- package/src/domains/gateway/mcp/client.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +42 -26
- package/src/domains/lifecycle/migrations/2026-09-18-ollama-runtime-id.ts +38 -0
- package/src/domains/lifecycle/migrations/index.ts +2 -0
- package/src/domains/middleware/demo-guidance.ts +36 -0
- package/src/domains/middleware/dispatch-nudge.ts +1 -1
- package/src/domains/middleware/memory-intervention.ts +51 -4
- package/src/domains/middleware/runtime.ts +5 -4
- package/src/domains/middleware/skills-reminder.ts +29 -52
- package/src/domains/middleware/task-nudge.ts +1 -0
- package/src/domains/middleware/watchdog.ts +4 -0
- package/src/domains/observability/extension.ts +2 -1
- package/src/domains/observability/out-of-turn-usage.ts +3 -2
- package/src/domains/observability/projection.ts +3 -2
- package/src/domains/observability/worker-progress.ts +48 -0
- package/src/domains/prompts/compiler.ts +148 -52
- package/src/domains/prompts/contract.ts +3 -3
- package/src/domains/prompts/demo-guidance.ts +8 -0
- package/src/domains/prompts/extension.ts +12 -7
- package/src/domains/prompts/fragments/identity/clio.md +2 -1
- package/src/domains/prompts/fragments/identity/docs-routing.md +2 -0
- package/src/domains/prompts/fragments/identity/self-awareness.md +4 -0
- package/src/domains/prompts/fragments/operating/contract.md +16 -7
- package/src/domains/prompts/fragments/operating/delegation.md +29 -13
- package/src/domains/prompts/fragments/operating/skills.md +18 -10
- package/src/domains/prompts/fragments/operating/worker.md +2 -0
- package/src/domains/providers/cache-deployment.ts +45 -2
- package/src/domains/providers/contract.ts +52 -11
- package/src/domains/providers/extension.ts +230 -53
- package/src/domains/providers/model-discovery.ts +22 -8
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +5 -7
- package/src/domains/providers/plugins.ts +3 -4
- package/src/domains/providers/probe/fingerprint.ts +2 -2
- package/src/domains/providers/probe/reasoning.ts +9 -16
- package/src/domains/providers/probe/tool-call.ts +236 -0
- package/src/domains/providers/registry.ts +51 -8
- package/src/domains/providers/runtime-resolution.ts +60 -12
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -1
- package/src/domains/providers/runtimes/builtins.ts +2 -2
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +57 -41
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -1
- package/src/domains/providers/runtimes/common/ollama-model-ids.ts +11 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +53 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +3 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +7 -13
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +7 -17
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +1 -0
- package/src/domains/providers/runtimes/local-native/ollama.ts +211 -0
- package/src/domains/providers/runtimes/protocol/litellm.ts +77 -65
- package/src/domains/providers/support.ts +1 -1
- package/src/domains/providers/types/local-model-quirks.ts +2 -3
- package/src/domains/providers/types/runtime-descriptor.ts +23 -3
- package/src/domains/providers/types/target-descriptor.ts +15 -3
- package/src/domains/resources/collision.ts +7 -2
- package/src/domains/resources/index.ts +1 -0
- package/src/domains/resources/library-actions.ts +4 -2
- package/src/domains/resources/library-inventory.ts +6 -2
- package/src/domains/resources/prompts/loader.ts +20 -7
- package/src/domains/resources/skills/availability.ts +56 -0
- package/src/domains/resources/skills/loader.ts +20 -9
- package/src/domains/safety/action-classifier.ts +282 -31
- package/src/domains/safety/audit.ts +2 -1
- package/src/domains/safety/autonomy.ts +54 -11
- package/src/domains/safety/decision-presentation.ts +17 -4
- package/src/domains/safety/finish-contract-registration.ts +25 -1
- package/src/domains/safety/finish-contract.ts +20 -5
- package/src/domains/safety/path-policy.ts +6 -2
- package/src/domains/safety/policy-engine.ts +168 -48
- package/src/domains/safety/protected-artifacts.ts +527 -16
- package/src/domains/safety/read-scope.ts +120 -0
- package/src/domains/safety/skill-authority.ts +52 -16
- package/src/domains/scheduling/cluster.ts +14 -3
- package/src/domains/scheduling/contract.ts +7 -0
- package/src/domains/scheduling/extension.ts +20 -9
- package/src/domains/scheduling/local-capacity.ts +160 -0
- package/src/domains/session/context-accounting.ts +44 -31
- package/src/domains/session/context-ledger.ts +10 -3
- package/src/domains/session/entries.ts +4 -0
- package/src/domains/session/history.ts +1 -1
- package/src/domains/session/prompt-cache.ts +1 -0
- package/src/domains/session/prompt-manifest.ts +3 -1
- package/src/domains/session/retry.ts +4 -6
- package/src/domains/session/task-board.ts +19 -4
- package/src/domains/session/tree/preview.ts +3 -2
- package/src/engine/acp/commands.ts +653 -0
- package/src/engine/acp/server.ts +639 -20
- package/src/engine/acp/tool-mediator.ts +30 -7
- package/src/engine/acp/types.ts +58 -0
- package/src/engine/agent.ts +55 -10
- package/src/engine/ai.ts +11 -2
- package/src/engine/api-registry.ts +5 -4
- package/src/engine/apis/degraded-inference.ts +243 -0
- package/src/engine/apis/llamacpp-residency.ts +50 -6
- package/src/engine/apis/lmstudio-residency.ts +3 -5
- package/src/engine/apis/lmstudio.ts +137 -31
- package/src/engine/apis/ollama-http.ts +118 -0
- package/src/engine/apis/ollama-native.ts +216 -97
- package/src/engine/apis/openai-completions.ts +191 -189
- package/src/engine/apis/output-budget.ts +3 -1
- package/src/engine/apis/residency-lock.ts +2 -1
- package/src/engine/apis/residency.ts +339 -89
- package/src/engine/apis/sampling-overrides.ts +23 -2
- package/src/engine/apis/types.ts +1 -2
- package/src/engine/claude/tool-safety.ts +30 -5
- package/src/engine/context.ts +13 -0
- package/src/engine/env-api-keys.ts +2 -1
- package/src/engine/gemma-channel-filter.ts +3 -2
- package/src/engine/instrumented-tui.ts +25 -0
- package/src/engine/loop-guard.ts +172 -6
- package/src/engine/pi-mono-names.ts +16 -0
- package/src/engine/prewarm.ts +44 -15
- package/src/engine/provider-payload.ts +52 -14
- package/src/engine/session.ts +4 -2
- package/src/engine/worker-events.ts +9 -1
- package/src/engine/worker-runtime.ts +269 -42
- package/src/engine/worker-tools.ts +8 -3
- package/src/entry/boot-options.ts +23 -0
- package/src/entry/orchestrator.ts +207 -36
- package/src/interactive/assistant-generation-timing.ts +52 -0
- package/src/interactive/chat-loop-messages.ts +4 -1
- package/src/interactive/chat-loop.ts +59 -9
- package/src/interactive/chat-panel.ts +10 -1
- package/src/interactive/clio-editor.ts +51 -79
- package/src/interactive/context-meter.ts +1 -0
- package/src/interactive/context-overlay.ts +21 -8
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/dispatch-board.ts +39 -8
- package/src/interactive/editor-bash.ts +0 -34
- package/src/interactive/editor-rails.ts +43 -0
- package/src/interactive/editor-submit.ts +34 -2
- package/src/interactive/footer/dashboard.ts +67 -38
- package/src/interactive/footer/demo-hints.ts +40 -0
- package/src/interactive/footer/key-hints.ts +21 -0
- package/src/interactive/footer/notifications.ts +1 -1
- package/src/interactive/footer/pages.ts +486 -0
- package/src/interactive/footer/system-metrics.ts +147 -0
- package/src/interactive/footer/widgets.ts +158 -63
- package/src/interactive/footer-panel.ts +29 -7
- package/src/interactive/interactive-application.ts +109 -21
- package/src/interactive/interactive-event-projection.ts +6 -2
- package/src/interactive/interactive-presentation.ts +25 -29
- package/src/interactive/interactive-slash-runtime.ts +32 -18
- package/src/interactive/interactive-subscriptions.ts +25 -5
- package/src/interactive/interactive-tickers.ts +21 -5
- package/src/interactive/keybinding-manager.ts +9 -0
- package/src/interactive/overlay-frame.ts +29 -7
- package/src/interactive/overlay-lifecycle.ts +5 -3
- package/src/interactive/overlay-model-selectors.ts +4 -0
- package/src/interactive/overlay-permission-lifecycle.ts +6 -5
- package/src/interactive/overlays/ask-user.ts +103 -110
- package/src/interactive/overlays/help-reference.ts +1 -0
- package/src/interactive/overlays/message-picker.ts +3 -29
- package/src/interactive/overlays/session-selector.ts +3 -2
- package/src/interactive/overlays/settings-sections.ts +2 -30
- package/src/interactive/overlays/settings.ts +310 -607
- package/src/interactive/permission-hint.ts +3 -3
- package/src/interactive/permission-overlay.ts +45 -27
- package/src/interactive/renderers/doctor-report.ts +43 -0
- package/src/interactive/renderers/tool-execution.ts +87 -62
- package/src/interactive/renderers/worker-entry.ts +76 -3
- package/src/interactive/side-question.ts +3 -1
- package/src/interactive/slash-commands.ts +78 -23
- package/src/interactive/startup-background.ts +131 -0
- package/src/interactive/startup-diagnostics.ts +16 -0
- package/src/interactive/status/state-machine.ts +16 -3
- package/src/interactive/status/types.ts +2 -0
- package/src/interactive/status/verbs.ts +1 -1
- package/src/interactive/terminal-lease.ts +26 -22
- package/src/interactive/theme/components.ts +1 -1
- package/src/interactive/theme/rules.ts +1 -1
- package/src/interactive/theme/tokens.ts +16 -10
- package/src/interactive/transcript-detail.ts +4 -0
- package/src/interactive/turn-context.ts +56 -20
- package/src/interactive/turn-middleware.ts +57 -9
- package/src/interactive/turn-prewarm.ts +121 -18
- package/src/interactive/turn-recovery.ts +10 -8
- package/src/interactive/turn-runtime.ts +74 -29
- package/src/interactive/turn-state.ts +3 -0
- package/src/interactive/welcome-art.ts +36 -0
- package/src/interactive/welcome-dashboard.ts +209 -49
- package/src/interactive/worker-replay.ts +4 -0
- package/src/interactive/worker-stream.ts +17 -2
- package/src/tools/agent-tools.ts +22 -1
- package/src/tools/builtin-tool-catalog.ts +2 -2
- package/src/tools/codewiki/code-nav.ts +1 -1
- package/src/tools/codewiki/shared.ts +39 -1
- package/src/tools/compete-worktrees.ts +8 -91
- package/src/tools/context/docs-engine.ts +44 -12
- package/src/tools/context/index.ts +126 -22
- package/src/tools/context/library.ts +1 -1
- package/src/tools/context/surface.ts +12 -7
- package/src/tools/core-bootstrap.ts +3 -0
- package/src/tools/dispatch-runner.ts +18 -0
- package/src/tools/dispatch-schema.ts +187 -206
- package/src/tools/edit.ts +46 -42
- package/src/tools/file-mutation-queue.ts +25 -26
- package/src/tools/gateway/clio-context-surface.ts +1 -1
- package/src/tools/gateway/index.ts +7 -3
- package/src/tools/gateway/mcp-capabilities.ts +5 -3
- package/src/tools/grep.ts +14 -2
- package/src/tools/ls.ts +1 -4
- package/src/tools/monitor.ts +14 -1
- package/src/tools/observation.ts +1 -3
- package/src/tools/path-utils.ts +51 -18
- package/src/tools/process-lease.ts +99 -0
- package/src/tools/read.ts +1 -1
- package/src/tools/registry.ts +71 -9
- package/src/tools/task-worktree.ts +296 -17
- package/src/tools/tasks.ts +29 -7
- package/src/tools/worker-evidence.ts +60 -1
- package/src/tools/worktree-root.ts +252 -0
- package/src/tools/write.ts +34 -30
- package/src/worker/entry.ts +18 -1
- package/src/worker/protocol.ts +54 -1
- package/src/worker/spec-contract.ts +22 -2
- package/dist/acp-ZWZCPS2A.js +0 -130
- package/dist/agents-LYSOWZUE.js +0 -150
- package/dist/auth-WBQGKWQ5.js +0 -551
- package/dist/background-BUMOBAQN.js +0 -37
- package/dist/builtins-ODRJOEDI.js +0 -22
- package/dist/chunk-2DRRZ57Q.js +0 -571
- package/dist/chunk-2JBZYUPY.js +0 -105
- package/dist/chunk-2VBWFXYE.js +0 -198
- package/dist/chunk-2X2R3UTH.js +0 -1018
- package/dist/chunk-32KJPXAM.js +0 -75
- package/dist/chunk-37LW32LZ.js +0 -32
- package/dist/chunk-3A3CUMKA.js +0 -54
- package/dist/chunk-3AND2EFU.js +0 -215
- package/dist/chunk-3RDHGNU7.js +0 -647
- package/dist/chunk-3SUDBGEI.js +0 -1323
- package/dist/chunk-3TQN67I2.js +0 -396
- package/dist/chunk-3U4BL2EV.js +0 -103
- package/dist/chunk-3UQADNG2.js +0 -302
- package/dist/chunk-434LRQ6Z.js +0 -13441
- package/dist/chunk-4ATBOFRP.js +0 -7802
- package/dist/chunk-4DNL43EZ.js +0 -139
- package/dist/chunk-4HFJKRGZ.js +0 -5250
- package/dist/chunk-555E2WVV.js +0 -322
- package/dist/chunk-5GZICIYO.js +0 -462
- package/dist/chunk-5PHVPU4G.js +0 -160
- package/dist/chunk-5RTEFNBP.js +0 -197
- package/dist/chunk-64XJW7NT.js +0 -380
- package/dist/chunk-6TKOFFGE.js +0 -1058
- package/dist/chunk-6UJ7RDI7.js +0 -1143
- package/dist/chunk-7FBCRWVT.js +0 -1801
- package/dist/chunk-7JSOSVLP.js +0 -283
- package/dist/chunk-7N3OLLSL.js +0 -637
- package/dist/chunk-7QQRPB2E.js +0 -915
- package/dist/chunk-A6DULIMH.js +0 -986
- package/dist/chunk-AB3QXXBC.js +0 -123
- package/dist/chunk-ACCECAH4.js +0 -49
- package/dist/chunk-AM6CEP2K.js +0 -2120
- package/dist/chunk-AUHVBIDW.js +0 -19
- package/dist/chunk-AY4XE6GN.js +0 -665
- package/dist/chunk-BBA2TAWV.js +0 -667
- package/dist/chunk-BFPHMSK7.js +0 -169
- package/dist/chunk-BMNVVKEW.js +0 -604
- package/dist/chunk-CKK25WN3.js +0 -72
- package/dist/chunk-CTGZCEI6.js +0 -33
- package/dist/chunk-DIAJYJYG.js +0 -446
- package/dist/chunk-DVNAPPXU.js +0 -27
- package/dist/chunk-DXVMLM3Z.js +0 -92
- package/dist/chunk-E3LEPLQ2.js +0 -68
- package/dist/chunk-EHZRAB4U.js +0 -63
- package/dist/chunk-EM2DIQAJ.js +0 -179
- package/dist/chunk-EM2WNQS2.js +0 -93
- package/dist/chunk-ETF4ROKH.js +0 -595
- package/dist/chunk-F2YM3JY4.js +0 -22513
- package/dist/chunk-FEBQWHJT.js +0 -1023
- package/dist/chunk-FPS4R2RN.js +0 -1975
- package/dist/chunk-GD55RTIW.js +0 -33
- package/dist/chunk-GJDRMBDI.js +0 -573
- package/dist/chunk-GREYLTZ5.js +0 -658
- package/dist/chunk-H2WSCZZT.js +0 -238
- package/dist/chunk-H6IUCY6Q.js +0 -117
- package/dist/chunk-H72DCH3E.js +0 -563
- package/dist/chunk-H7TXJR23.js +0 -705
- package/dist/chunk-HBJQQTKM.js +0 -40
- package/dist/chunk-HCVKSGNZ.js +0 -990
- package/dist/chunk-HVCAY2FH.js +0 -67
- package/dist/chunk-I47EJPYL.js +0 -1377
- package/dist/chunk-IALGWTLO.js +0 -36
- package/dist/chunk-IALZJE37.js +0 -1710
- package/dist/chunk-IC7JXLOM.js +0 -1577
- package/dist/chunk-IOSVTTCD.js +0 -108
- package/dist/chunk-IPTPMLA6.js +0 -475
- package/dist/chunk-IZZI3SKQ.js +0 -128
- package/dist/chunk-JABWPKFY.js +0 -27
- package/dist/chunk-JIYWMQZ5.js +0 -175
- package/dist/chunk-JKU34ACI.js +0 -693
- package/dist/chunk-JOBN2YQQ.js +0 -176
- package/dist/chunk-JOL2QRLE.js +0 -152
- package/dist/chunk-JTR3VSV3.js +0 -44
- package/dist/chunk-JU6MAMRJ.js +0 -362
- package/dist/chunk-JURMQWVJ.js +0 -15
- package/dist/chunk-K2BLQC5E.js +0 -262
- package/dist/chunk-K3XN4LZ4.js +0 -402
- package/dist/chunk-KIVFXGBM.js +0 -688
- package/dist/chunk-KKRXONXG.js +0 -43
- package/dist/chunk-KOAHT3N2.js +0 -395
- package/dist/chunk-KP5BPXR3.js +0 -73
- package/dist/chunk-KQ6IDQIB.js +0 -39
- package/dist/chunk-KRJQG47M.js +0 -1289
- package/dist/chunk-KW6OJ7IY.js +0 -221
- package/dist/chunk-L3NBWLSN.js +0 -314
- package/dist/chunk-L4RUTLRL.js +0 -59
- package/dist/chunk-LGTVWPRN.js +0 -47
- package/dist/chunk-LSQW6KZO.js +0 -200
- package/dist/chunk-LTR5QCLS.js +0 -446
- package/dist/chunk-LWJYOHT3.js +0 -165
- package/dist/chunk-M6YLF66Z.js +0 -2687
- package/dist/chunk-MJ4QEJVT.js +0 -185
- package/dist/chunk-MO65K5CH.js +0 -1148
- package/dist/chunk-MTOZEQHL.js +0 -637
- package/dist/chunk-MZDPF35R.js +0 -45
- package/dist/chunk-MZKYVIWW.js +0 -188
- package/dist/chunk-NBPA5QM6.js +0 -386
- package/dist/chunk-NMBEW4PP.js +0 -688
- package/dist/chunk-NPLLK3HO.js +0 -3610
- package/dist/chunk-NSYGPIVW.js +0 -39
- package/dist/chunk-NXTV5OI5.js +0 -1020
- package/dist/chunk-NYDG4QP4.js +0 -689
- package/dist/chunk-OA2GDACN.js +0 -146
- package/dist/chunk-PJI57EC6.js +0 -236
- package/dist/chunk-PJJBUGMR.js +0 -4484
- package/dist/chunk-PNJE7JPS.js +0 -50
- package/dist/chunk-PP23PZEV.js +0 -1347
- package/dist/chunk-PPIFDSBK.js +0 -409
- package/dist/chunk-PTFISXQO.js +0 -319
- package/dist/chunk-QB33Z5S7.js +0 -1865
- package/dist/chunk-QGNII5VC.js +0 -110
- package/dist/chunk-QH3ZTUOA.js +0 -113
- package/dist/chunk-QI72X67S.js +0 -481
- package/dist/chunk-QJMRYTCX.js +0 -56
- package/dist/chunk-QKHZZFKH.js +0 -98
- package/dist/chunk-RDKX2PME.js +0 -66
- package/dist/chunk-RL7LJYN4.js +0 -66
- package/dist/chunk-RPMNIFRY.js +0 -65
- package/dist/chunk-RQROVOV3.js +0 -670
- package/dist/chunk-S34A7BSP.js +0 -97
- package/dist/chunk-SJETVJHX.js +0 -119
- package/dist/chunk-SJMNU4ZS.js +0 -634
- package/dist/chunk-SL2RDHKO.js +0 -19
- package/dist/chunk-SLLG2G44.js +0 -85
- package/dist/chunk-SQAZN2V3.js +0 -2744
- package/dist/chunk-SQBT46OF.js +0 -814
- package/dist/chunk-SRCEQKQS.js +0 -165
- package/dist/chunk-TCUOGIL2.js +0 -52
- package/dist/chunk-TIWPKCVO.js +0 -42
- package/dist/chunk-U44YYLVV.js +0 -1529
- package/dist/chunk-UIU7MGZ3.js +0 -486
- package/dist/chunk-USBBEKHW.js +0 -177
- package/dist/chunk-VHKTOLEW.js +0 -1416
- package/dist/chunk-VPWGADBG.js +0 -3151
- package/dist/chunk-VQD7NH7Z.js +0 -356
- package/dist/chunk-VWFCAK34.js +0 -697
- package/dist/chunk-W5RM7YAH.js +0 -78
- package/dist/chunk-W72LLZAV.js +0 -243
- package/dist/chunk-WGRDABW7.js +0 -207
- package/dist/chunk-WWRV5RJI.js +0 -165
- package/dist/chunk-XCUDZQLX.js +0 -195
- package/dist/chunk-XFLSL7BT.js +0 -386
- package/dist/chunk-XJZEDCNT.js +0 -391
- package/dist/chunk-XLLEL3K7.js +0 -709
- package/dist/chunk-XNZWWDC3.js +0 -686
- package/dist/chunk-XRECG65F.js +0 -308
- package/dist/chunk-XTQ7MEJG.js +0 -457
- package/dist/chunk-XW2UZICE.js +0 -372
- package/dist/chunk-Y3M2T5RO.js +0 -891
- package/dist/chunk-YGDMBK7O.js +0 -567
- package/dist/chunk-YJCCMYYT.js +0 -125
- package/dist/chunk-YPQOPFP7.js +0 -797
- package/dist/chunk-YQYINEJI.js +0 -132
- package/dist/chunk-ZF6CV4WZ.js +0 -5614
- package/dist/chunk-ZKJU55MX.js +0 -326
- package/dist/chunk-ZKQ63XZ5.js +0 -1196
- package/dist/chunk-ZKVMDNAN.js +0 -962
- package/dist/chunk-ZST3FRCV.js +0 -132
- package/dist/clio-JUDCLNHC.js +0 -26
- package/dist/clio-context-tools-FT672MNZ.js +0 -136
- package/dist/code-nav-7OVCTP2Z.js +0 -688
- package/dist/compile-cache-WJEPUZEJ.js +0 -16
- package/dist/components-OZXZMDWU.js +0 -674
- package/dist/config-P3ZQVF63.js +0 -275
- package/dist/config-graph-GKAOBAS5.js +0 -160
- package/dist/configure-25LRYZJG.js +0 -86
- package/dist/context-72VQV7JX.js +0 -73
- package/dist/context-COWRWXP3.js +0 -286
- package/dist/context-WB3D474G.js +0 -344
- package/dist/context-clear-Y4LYMWC6.js +0 -192
- package/dist/context-index-W6A4V7OC.js +0 -120
- package/dist/context-map-DKL3QT6D.js +0 -555
- package/dist/context-working-set-TMZYVC7A.js +0 -1560
- package/dist/data-tool-KMBWKKWR.js +0 -2987
- package/dist/detail-4GLROGY5.js +0 -123
- package/dist/dispatch-runner-TR3LBP5P.js +0 -2446
- package/dist/docs-ZK777W2G.js +0 -101
- package/dist/doctor-WC4OV2OB.js +0 -814
- package/dist/eval-FUNWJNUJ.js +0 -5050
- package/dist/eval-inventory-CX24K2JT.js +0 -260
- package/dist/evals-L73EBHSU.js +0 -104
- package/dist/evidence-AVJ2RTHX.js +0 -392
- package/dist/evidence-P4NZOAK7.js +0 -233
- package/dist/evidence-Y55WKYHH.js +0 -246
- package/dist/evolve-MAWKRYWF.js +0 -617
- package/dist/extensions-PYQH3H47.js +0 -308
- package/dist/fleet-M4H2QBWT.js +0 -268
- package/dist/fleet-ULBXXRDR.js +0 -923
- package/dist/fleet-commands-7NNC4JZU.js +0 -76
- package/dist/fleet-decisions-EHEY7KPU.js +0 -52
- package/dist/fleet-graph-LQ2AHZT3.js +0 -136
- package/dist/fleet-inspect-5IGBIIYZ.js +0 -312
- package/dist/fleet-new-RCKGSRDV.js +0 -48
- package/dist/fleet-preflight-UTTNOKMG.js +0 -27
- package/dist/fleet-validate-YGILJKA6.js +0 -91
- package/dist/fleet-verify-AUWTCDKR.js +0 -210
- package/dist/fleet-view-TGUFCY5A.js +0 -127
- package/dist/init-GFN2Z7NF.js +0 -333
- package/dist/install-3RZDDP23.js +0 -13
- package/dist/install-6PIF6F6W.js +0 -19
- package/dist/interop-EF5JUWWK.js +0 -246
- package/dist/inventory-I6VJDDYF.js +0 -127
- package/dist/library-3J5IO2OJ.js +0 -75
- package/dist/library-IJTOFTDS.js +0 -307
- package/dist/library-Z3KZSHPE.js +0 -492
- package/dist/library-import-IMKFLDHX.js +0 -183
- package/dist/library-inventory-CQP5D6GU.js +0 -56
- package/dist/library-validation-33UTX7AI.js +0 -42
- package/dist/mcp-5FWZKUS6.js +0 -26
- package/dist/memory-36CWN67Y.js +0 -520
- package/dist/models-KQ6PQJJQ.js +0 -302
- package/dist/monitor-XX6ZD6KC.js +0 -785
- package/dist/orchestrator-SK6HDAOP.js +0 -42067
- package/dist/panes-L27QRXUH.js +0 -74
- package/dist/panes-LXZIWNOZ.js +0 -103
- package/dist/paths-7DJDU4P4.js +0 -67
- package/dist/preload-K2TDYI4Y.js +0 -124
- package/dist/registry-DESGAXWK.js +0 -11
- package/dist/reset-73VU3XNT.js +0 -345
- package/dist/resources-3BYJYVYL.js +0 -181
- package/dist/run-AR7PY6GW.js +0 -896
- package/dist/run-script-H2KUDIII.js +0 -41
- package/dist/settings-3VMBMWID.js +0 -72
- package/dist/share-HVWH4FPF.js +0 -293
- package/dist/skills-5TYEY75Q.js +0 -100
- package/dist/skills-eval-CK3MD63Z.js +0 -1083
- package/dist/skills-inventory-KSFYG3I6.js +0 -138
- package/dist/slash-commands-DMVHML7P.js +0 -98
- package/dist/steer-XCD6V3EW.js +0 -77
- package/dist/support-JAZL6VBR.js +0 -38
- package/dist/system-3TDQRMZZ.js +0 -116
- package/dist/targets-EZKHAYRN.js +0 -1117
- package/dist/tasks-SNEFHWYW.js +0 -36
- package/dist/terminal-lease-BNLFA4OF.js +0 -419
- package/dist/tools-7IM6BDCE.js +0 -28
- package/dist/trace-C3MBGD4S.js +0 -524
- package/dist/tree-sitter-AQUUOSYM.js +0 -4673
- package/dist/tui-primitives-36BY2774.js +0 -18
- package/dist/uninstall-WWLOSZ42.js +0 -432
- package/dist/upgrade-ETK2JNSJ.js +0 -297
- package/dist/usage-S2HOB7BZ.js +0 -1065
- package/dist/verifiers-QDTEVH7R.js +0 -632
- package/dist/verify-SUKUK6XM.js +0 -31
- package/dist/version-RFPKO6T7.js +0 -21
- package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +0 -1
- package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +0 -1
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +0 -36
- package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +0 -129
- package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +0 -38
- package/dist/web/client/assets/channel-c4EeUUqA.js +0 -1
- package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +0 -62
- package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +0 -2
- package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +0 -125
- package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +0 -1
- package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +0 -72
- package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +0 -1
- package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +0 -231
- package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +0 -1
- package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +0 -10
- package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +0 -1
- package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +0 -1
- package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +0 -1
- package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +0 -168
- package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +0 -88
- package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +0 -206
- package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +0 -1
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +0 -1
- package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +0 -1
- package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +0 -62
- package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +0 -4
- package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +0 -30
- package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +0 -41
- package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +0 -3
- package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +0 -24
- package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +0 -24
- package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +0 -1
- package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +0 -99
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +0 -1
- package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +0 -1
- package/dist/web/client/assets/framework-YGoR34M4.js +0 -9
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +0 -292
- package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +0 -1
- package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +0 -106
- package/dist/web/client/assets/index-CVcy0FAn.js +0 -75
- package/dist/web/client/assets/index-Dsi52apB.css +0 -1
- package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +0 -1
- package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +0 -2
- package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +0 -70
- package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +0 -139
- package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +0 -89
- package/dist/web/client/assets/line-BIDAcEtX.js +0 -1
- package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +0 -7
- package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +0 -44
- package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +0 -96
- package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +0 -1
- package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +0 -1
- package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +0 -1
- package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +0 -39
- package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +0 -7
- package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +0 -1
- package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +0 -1
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +0 -1
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +0 -1
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +0 -1
- package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +0 -1
- package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +0 -84
- package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +0 -40
- package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +0 -162
- package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +0 -1
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +0 -1
- package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +0 -1
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +0 -8
- package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +0 -120
- package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +0 -1
- package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +0 -1
- package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +0 -34
- package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +0 -1
- package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +0 -78
- package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +0 -7
- package/dist/web/client/index.html +0 -6
- package/dist/web/ops-worker.js +0 -37
- package/dist/web/reads-worker.js +0 -1726
- package/dist/web/server.js +0 -8499
- package/dist/web-EMGUGGEI.js +0 -13
- package/dist/web-fetch-6BRRVQON.js +0 -805
- package/dist/wiki-generate-XHSJTDOP.js +0 -627
- package/dist/with-panes-Z6BTEHMZ.js +0 -628
- package/evals/README.md +0 -9
- package/evals/behavioral-corpus-grader.mjs +0 -236
- package/evals/behavioral-machinery-baseline.json +0 -2276
- package/evals/behavioral-machinery-driver.ts +0 -250
- package/evals/behavioral-machinery-support.ts +0 -254
- package/evals/behavioral-machinery.yaml +0 -614
- package/evals/behavioral-model-negative-control.yaml +0 -69
- package/evals/behavioral-model.yaml +0 -482
- package/evals/fixtures/behavioral-facts.txt +0 -3
- package/evals/fixtures/behavioral-main.ts +0 -7
- package/evals/fixtures/decoy/note.txt +0 -2
- package/evals/fixtures/docs-retrieval.json +0 -102
- package/evals/fixtures/private/credentials.txt +0 -1
- package/evals/fixtures/scalar-decision.json +0 -17
- package/evals/fixtures/scout-citation-pipeline.json +0 -55
- package/evals/fixtures/source-explanation.json +0 -74
- package/evals/fixtures/tool-arguments.json +0 -18
- package/evals/fixtures/tool-surface/read.txt +0 -4
- package/evals/fixtures/tool-surface/subdir/keep.txt +0 -1
- package/evals/no-edit-memory-grader.mjs +0 -149
- package/evals/scalar-decision-grader.py +0 -41
- package/evals/scalar-decision-machinery.ts +0 -145
- package/evals/source-explanation-grader.mjs +0 -118
- package/evals/tool-surface-grader.mjs +0 -53
- package/evals/tool-surface-model.yaml +0 -274
- package/evals/tracked-metrics-baseline.yaml +0 -229
- package/evals/tracked-metrics-grader.mjs +0 -129
- package/src/cli/web.ts +0 -79
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +0 -122
- /package/dist/assets/{web-notices → gui-notices}/@hono__node-server-LICENSE +0 -0
- /package/dist/assets/{web-notices → gui-notices}/hono-LICENSE +0 -0
- /package/dist/{web → gui}/client/THIRD_PARTY_LICENSES.md +0 -0
- /package/dist/{web → gui}/client/assets/arc-Pry-7G1_.js +0 -0
- /package/dist/{web → gui}/client/assets/array-BifhSqXX.js +0 -0
- /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +0 -0
- /package/dist/{web → gui}/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +0 -0
- /package/dist/{web → gui}/client/assets/chunk-FOHPRMQF-CoA4358r.js +0 -0
- /package/dist/{web → gui}/client/assets/chunk-JWPE2WC7-DVXcaiue.js +0 -0
- /package/dist/{web → gui}/client/assets/chunk-XXDRQBXY-DqAYeljN.js +0 -0
- /package/dist/{web → gui}/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +0 -0
- /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
- /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +0 -0
- /package/dist/{web → gui}/client/assets/cytoscape.esm-c2aL46s-.js +0 -0
- /package/dist/{web → gui}/client/assets/dagre-C-rnJpZF.js +0 -0
- /package/dist/{web → gui}/client/assets/defaultLocale-BFoDCU3G.js +0 -0
- /package/dist/{web → gui}/client/assets/dist-v5Q1xZ2K.js +0 -0
- /package/dist/{web → gui}/client/assets/graphlib-DS17s2tU.js +0 -0
- /package/dist/{web → gui}/client/assets/init-C-OQMol4.js +0 -0
- /package/dist/{web → gui}/client/assets/katex-ZlcWpGUi.js +0 -0
- /package/dist/{web → gui}/client/assets/linear-SzVmGSw4.js +0 -0
- /package/dist/{web → gui}/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
- /package/dist/{web → gui}/client/assets/ordinal-BDEzSJ7C.js +0 -0
- /package/dist/{web → gui}/client/assets/path-fybaL0A-.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-bash-D6zCJ74D.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-c-04YixN25.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-clike-DapgWyxx.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-core-BtsZdCS6.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-cpp-C-lJbC-6.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-css-CPgOzxXp.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-diff-BF8m0_mq.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-docker-DkT6yOFj.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-fortran-Be5x3y1V.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-go-C_8qAH5n.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-ini-BESK3y0r.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-javascript-BnO-swvr.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-json-Dp_-W-Hv.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-jsx-D-D0NWtC.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-julia-DIjOgiAV.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-latex-DNMbqcH_.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-makefile-CRKWLQ8l.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-markdown-C0FPJ1Iz.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-markup-Cp04rIa1.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-matlab-D-nk08al.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-python-CfiSVtM6.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-r-QmNGR8LX.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-rust-Bu9N8X3N.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-shell-session-Be4UuYoM.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-sql-CYhVDMEE.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-toml-DKb54GAT.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-tsx-p6J2Kc_4.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-typescript-BMqONzxf.js +0 -0
- /package/dist/{web → gui}/client/assets/prism-yaml-C0JHu8gr.js +0 -0
- /package/dist/{web → gui}/client/assets/purify.es-ChwZkWde.js +0 -0
- /package/dist/{web → gui}/client/assets/rolldown-runtime-hePW80VL.js +0 -0
- /package/dist/{web → gui}/client/assets/rough.esm-Dy-Kn_BL.js +0 -0
- /package/dist/{web → gui}/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -0
- /package/dist/{web → gui}/client/assets/src-B6xuSHsQ.js +0 -0
- /package/dist/{web → gui}/client/clio-coder-logo.webp +0 -0
- /package/dist/{web → gui}/client/icon-192.png +0 -0
- /package/dist/{web → gui}/client/icon-512.png +0 -0
- /package/dist/{web → gui}/client/manifest.webmanifest +0 -0
- /package/dist/{web → gui}/client/offline.css +0 -0
- /package/dist/{web → gui}/client/offline.html +0 -0
- /package/dist/{web → gui}/client/offline.js +0 -0
- /package/dist/{web → gui}/client/sw.js +0 -0
|
@@ -0,0 +1,1347 @@
|
|
|
1
|
+
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
require_dist
|
|
4
|
+
} from "./chunk-B5GGDIHT.js";
|
|
5
|
+
import {
|
|
6
|
+
buildSafeToolEnv,
|
|
7
|
+
resolveSafeCwd
|
|
8
|
+
} from "./chunk-M2IPMWCN.js";
|
|
9
|
+
import {
|
|
10
|
+
clampTimerDelayMs,
|
|
11
|
+
sleep
|
|
12
|
+
} from "./chunk-6EXUUOSN.js";
|
|
13
|
+
import {
|
|
14
|
+
clioConfigDir
|
|
15
|
+
} from "./chunk-CTTI7G3T.js";
|
|
16
|
+
import {
|
|
17
|
+
safeResourceWrite
|
|
18
|
+
} from "./chunk-ZZFWWYLX.js";
|
|
19
|
+
import {
|
|
20
|
+
__toESM,
|
|
21
|
+
init_esm_shims
|
|
22
|
+
} from "./chunk-ECBHH7LU.js";
|
|
23
|
+
|
|
24
|
+
// src/domains/gateway/mcp/trust.ts
|
|
25
|
+
init_esm_shims();
|
|
26
|
+
import { realpathSync as realpathSync2 } from "node:fs";
|
|
27
|
+
import path2 from "node:path";
|
|
28
|
+
|
|
29
|
+
// src/domains/gateway/mcp/config.ts
|
|
30
|
+
init_esm_shims();
|
|
31
|
+
var import_yaml = __toESM(require_dist(), 1);
|
|
32
|
+
import { createHash } from "node:crypto";
|
|
33
|
+
import { closeSync, constants as fsConstants, fstatSync, openSync, readSync, realpathSync, statSync } from "node:fs";
|
|
34
|
+
import path from "node:path";
|
|
35
|
+
var MCP_CONFIG_VERSION = 1;
|
|
36
|
+
var MCP_USER_CONFIG_FILENAME = "mcp.yaml";
|
|
37
|
+
var MCP_PROJECT_CONFIG_RELATIVE_PATH = ".clio-coder/mcp.yaml";
|
|
38
|
+
var MCP_CONFIG_CAPS = Object.freeze({
|
|
39
|
+
fileBytes: 256 * 1024,
|
|
40
|
+
servers: 32,
|
|
41
|
+
idChars: 32,
|
|
42
|
+
commandBytes: 512,
|
|
43
|
+
args: 64,
|
|
44
|
+
argBytes: 4096,
|
|
45
|
+
envEntries: 64,
|
|
46
|
+
envValueBytes: 4096,
|
|
47
|
+
cwdBytes: 512,
|
|
48
|
+
timeoutMs: 9e5
|
|
49
|
+
});
|
|
50
|
+
var ID_PATTERN = /^[a-z0-9][a-z0-9_-]*$/;
|
|
51
|
+
var ENV_KEY_PATTERN = /^[A-Z_][A-Z0-9_]*$/;
|
|
52
|
+
var ROOT_FIELDS = /* @__PURE__ */ new Set(["version", "servers"]);
|
|
53
|
+
var SERVER_FIELDS = /* @__PURE__ */ new Set(["id", "command", "args", "cwd", "env", "timeoutMs"]);
|
|
54
|
+
var SHELL_EXECUTABLES = /* @__PURE__ */ new Set([
|
|
55
|
+
"bash",
|
|
56
|
+
"cmd",
|
|
57
|
+
"command.com",
|
|
58
|
+
"dash",
|
|
59
|
+
"fish",
|
|
60
|
+
"ksh",
|
|
61
|
+
"powershell",
|
|
62
|
+
"pwsh",
|
|
63
|
+
"sh",
|
|
64
|
+
"tcsh",
|
|
65
|
+
"zsh"
|
|
66
|
+
]);
|
|
67
|
+
function isRecord(value) {
|
|
68
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
69
|
+
}
|
|
70
|
+
function utf8Bytes(value) {
|
|
71
|
+
return Buffer.byteLength(value, "utf8");
|
|
72
|
+
}
|
|
73
|
+
function unknownFields(record, allowed) {
|
|
74
|
+
return Object.keys(record).filter((key) => !allowed.has(key)).sort();
|
|
75
|
+
}
|
|
76
|
+
function mcpServerDigest(fields) {
|
|
77
|
+
const canonical = JSON.stringify({
|
|
78
|
+
id: fields.id,
|
|
79
|
+
command: fields.command,
|
|
80
|
+
args: [...fields.args],
|
|
81
|
+
cwd: fields.cwd,
|
|
82
|
+
env: Object.fromEntries(
|
|
83
|
+
Object.keys(fields.env).sort().map((key) => [key, fields.env[key]])
|
|
84
|
+
),
|
|
85
|
+
timeoutMs: fields.timeoutMs
|
|
86
|
+
});
|
|
87
|
+
return createHash("sha256").update(canonical).digest("hex");
|
|
88
|
+
}
|
|
89
|
+
function mcpConfigPaths(options) {
|
|
90
|
+
return {
|
|
91
|
+
user: path.join(options.configDir ?? clioConfigDir(), MCP_USER_CONFIG_FILENAME),
|
|
92
|
+
project: path.join(path.resolve(options.cwd), MCP_PROJECT_CONFIG_RELATIVE_PATH)
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function validateId(value, location) {
|
|
96
|
+
if (typeof value !== "string" || value.length === 0) return new Error(`${location} must be a non-empty string`);
|
|
97
|
+
if (value.length > MCP_CONFIG_CAPS.idChars) {
|
|
98
|
+
return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.idChars}-character cap`);
|
|
99
|
+
}
|
|
100
|
+
if (!ID_PATTERN.test(value)) return new Error(`${location} must match /^[a-z0-9][a-z0-9_-]*$/`);
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
function validateCommand(value, location) {
|
|
104
|
+
if (typeof value !== "string" || value.length === 0) return new Error(`${location} must be a non-empty string`);
|
|
105
|
+
if (value.includes("\0")) return new Error(`${location} must not contain a NUL byte`);
|
|
106
|
+
if (/\s/u.test(value)) return new Error(`${location} must be one executable token, not a shell command string`);
|
|
107
|
+
if (utf8Bytes(value) > MCP_CONFIG_CAPS.commandBytes) {
|
|
108
|
+
return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.commandBytes}-byte cap`);
|
|
109
|
+
}
|
|
110
|
+
const hasSeparator = value.includes("/") || value.includes("\\");
|
|
111
|
+
if (hasSeparator && !(path.isAbsolute(value) || path.win32.isAbsolute(value))) {
|
|
112
|
+
return new Error(
|
|
113
|
+
`${location} must be an executable name resolved on PATH or an absolute path; relative path '${value}' is not allowed`
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
const executable = path.basename(value).toLowerCase().replace(/\.exe$/u, "");
|
|
117
|
+
if (SHELL_EXECUTABLES.has(executable)) {
|
|
118
|
+
return new Error(`${location} may not invoke shell executable '${value}'`);
|
|
119
|
+
}
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
function validateArgs(value, location) {
|
|
123
|
+
if (value === void 0) return [];
|
|
124
|
+
if (!Array.isArray(value)) return new Error(`${location} must be an array of strings`);
|
|
125
|
+
if (value.length > MCP_CONFIG_CAPS.args) return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.args}-entry cap`);
|
|
126
|
+
const args = [];
|
|
127
|
+
for (const [index, entry] of value.entries()) {
|
|
128
|
+
const entryLocation = `${location}[${index}]`;
|
|
129
|
+
if (typeof entry !== "string") return new Error(`${entryLocation} must be a string`);
|
|
130
|
+
if (entry.includes("\0")) return new Error(`${entryLocation} must not contain a NUL byte`);
|
|
131
|
+
if (utf8Bytes(entry) > MCP_CONFIG_CAPS.argBytes) {
|
|
132
|
+
return new Error(`${entryLocation} exceeds the ${MCP_CONFIG_CAPS.argBytes}-byte cap`);
|
|
133
|
+
}
|
|
134
|
+
args.push(entry);
|
|
135
|
+
}
|
|
136
|
+
return args;
|
|
137
|
+
}
|
|
138
|
+
function validateEnv(value, location) {
|
|
139
|
+
if (value === void 0) return {};
|
|
140
|
+
if (!isRecord(value)) return new Error(`${location} must be an object of string values`);
|
|
141
|
+
const keys = Object.keys(value);
|
|
142
|
+
if (keys.length > MCP_CONFIG_CAPS.envEntries) {
|
|
143
|
+
return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.envEntries}-entry cap`);
|
|
144
|
+
}
|
|
145
|
+
const env = {};
|
|
146
|
+
for (const key of keys.sort()) {
|
|
147
|
+
if (!ENV_KEY_PATTERN.test(key)) return new Error(`${location}.${key} is not a valid environment variable name`);
|
|
148
|
+
const entry = value[key];
|
|
149
|
+
if (typeof entry !== "string") return new Error(`${location}.${key} must be a string`);
|
|
150
|
+
if (entry.includes("\0")) return new Error(`${location}.${key} must not contain a NUL byte`);
|
|
151
|
+
if (utf8Bytes(entry) > MCP_CONFIG_CAPS.envValueBytes) {
|
|
152
|
+
return new Error(`${location}.${key} exceeds the ${MCP_CONFIG_CAPS.envValueBytes}-byte cap`);
|
|
153
|
+
}
|
|
154
|
+
env[key] = entry;
|
|
155
|
+
}
|
|
156
|
+
return env;
|
|
157
|
+
}
|
|
158
|
+
function validateTimeout(value, location) {
|
|
159
|
+
if (value === void 0) return null;
|
|
160
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) {
|
|
161
|
+
return new Error(`${location} must be a positive integer number of milliseconds`);
|
|
162
|
+
}
|
|
163
|
+
if (value > MCP_CONFIG_CAPS.timeoutMs) return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.timeoutMs}ms cap`);
|
|
164
|
+
return value;
|
|
165
|
+
}
|
|
166
|
+
function realDirectory(candidate, location) {
|
|
167
|
+
try {
|
|
168
|
+
if (!statSync(candidate).isDirectory()) return new Error(`${location} is not a directory: '${candidate}'`);
|
|
169
|
+
return realpathSync(candidate);
|
|
170
|
+
} catch (error) {
|
|
171
|
+
return new Error(
|
|
172
|
+
`${location} cannot be resolved as a directory: '${candidate}' (${error instanceof Error ? error.message : String(error)})`
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function resolveCwd(raw, scope, root, location) {
|
|
177
|
+
if (raw !== null) {
|
|
178
|
+
if (raw.length === 0) return new Error(`${location} must be a non-empty path when given`);
|
|
179
|
+
if (raw.includes("\0")) return new Error(`${location} must not contain a NUL byte`);
|
|
180
|
+
if (utf8Bytes(raw) > MCP_CONFIG_CAPS.cwdBytes) {
|
|
181
|
+
return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.cwdBytes}-byte cap`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const absolute = raw !== null && (path.isAbsolute(raw) || path.win32.isAbsolute(raw));
|
|
185
|
+
if (scope === "project" && absolute) {
|
|
186
|
+
return new Error(`${location} must be repository-relative; absolute cwd '${raw}' is not allowed`);
|
|
187
|
+
}
|
|
188
|
+
const realRoot = realDirectory(root, `${location} root`);
|
|
189
|
+
if (realRoot instanceof Error) return realRoot;
|
|
190
|
+
if (scope === "user" && absolute && raw !== null) {
|
|
191
|
+
const real2 = realDirectory(raw, location);
|
|
192
|
+
if (real2 instanceof Error) return real2;
|
|
193
|
+
return { cwd: real2, cwdRoot: real2 };
|
|
194
|
+
}
|
|
195
|
+
let resolved;
|
|
196
|
+
try {
|
|
197
|
+
resolved = resolveSafeCwd(raw ?? void 0, realRoot);
|
|
198
|
+
} catch {
|
|
199
|
+
return new Error(`${location} escapes its root: '${raw}'`);
|
|
200
|
+
}
|
|
201
|
+
const real = realDirectory(resolved, location);
|
|
202
|
+
if (real instanceof Error) return real;
|
|
203
|
+
try {
|
|
204
|
+
resolveSafeCwd(real, realRoot);
|
|
205
|
+
} catch {
|
|
206
|
+
return new Error(`${location} escapes its root through a symbolic link: '${raw}'`);
|
|
207
|
+
}
|
|
208
|
+
return { cwd: real, cwdRoot: realRoot };
|
|
209
|
+
}
|
|
210
|
+
function validateServer(value, location) {
|
|
211
|
+
if (!isRecord(value)) return new Error(`${location} must be an object`);
|
|
212
|
+
const unknown = unknownFields(value, SERVER_FIELDS);
|
|
213
|
+
if (unknown.length > 0) return new Error(`${location} has unknown field(s): ${unknown.join(", ")}`);
|
|
214
|
+
for (const field of ["id", "command"]) {
|
|
215
|
+
if (!Object.hasOwn(value, field)) return new Error(`${location}.${field} is required`);
|
|
216
|
+
}
|
|
217
|
+
const id = validateId(value.id, `${location}.id`);
|
|
218
|
+
if (id instanceof Error) return id;
|
|
219
|
+
const command = validateCommand(value.command, `${location}.command`);
|
|
220
|
+
if (command instanceof Error) return command;
|
|
221
|
+
const args = validateArgs(value.args, `${location}.args`);
|
|
222
|
+
if (args instanceof Error) return args;
|
|
223
|
+
const env = validateEnv(value.env, `${location}.env`);
|
|
224
|
+
if (env instanceof Error) return env;
|
|
225
|
+
const timeoutMs = validateTimeout(value.timeoutMs, `${location}.timeoutMs`);
|
|
226
|
+
if (timeoutMs instanceof Error) return timeoutMs;
|
|
227
|
+
let declaredCwd = null;
|
|
228
|
+
if (value.cwd !== void 0) {
|
|
229
|
+
if (typeof value.cwd !== "string") return new Error(`${location}.cwd must be a string`);
|
|
230
|
+
declaredCwd = value.cwd;
|
|
231
|
+
}
|
|
232
|
+
return { fields: { id, command, args, cwd: declaredCwd, env, timeoutMs }, declaredCwd };
|
|
233
|
+
}
|
|
234
|
+
function parseMcpConfigText(text, input) {
|
|
235
|
+
const diagnostic = (message) => ({
|
|
236
|
+
servers: [],
|
|
237
|
+
diagnostics: [{ scope: input.scope, path: input.path, message }]
|
|
238
|
+
});
|
|
239
|
+
if (utf8Bytes(text) > MCP_CONFIG_CAPS.fileBytes) {
|
|
240
|
+
return diagnostic(`file exceeds the ${MCP_CONFIG_CAPS.fileBytes}-byte cap`);
|
|
241
|
+
}
|
|
242
|
+
const document = (0, import_yaml.parseDocument)(text, { prettyErrors: false, strict: true, uniqueKeys: true });
|
|
243
|
+
if (document.errors.length > 0) {
|
|
244
|
+
return diagnostic(`invalid YAML: ${document.errors.map((error) => error.message).join("; ")}`);
|
|
245
|
+
}
|
|
246
|
+
let parsed;
|
|
247
|
+
try {
|
|
248
|
+
parsed = document.toJS({ maxAliasCount: 0 });
|
|
249
|
+
} catch (error) {
|
|
250
|
+
return diagnostic(`invalid YAML: ${error instanceof Error ? error.message : String(error)}`);
|
|
251
|
+
}
|
|
252
|
+
if (!isRecord(parsed)) return diagnostic("root must be an object with version and servers fields");
|
|
253
|
+
const rootUnknown = unknownFields(parsed, ROOT_FIELDS);
|
|
254
|
+
if (rootUnknown.length > 0) return diagnostic(`root has unknown field(s): ${rootUnknown.join(", ")}`);
|
|
255
|
+
if (!Object.hasOwn(parsed, "version")) return diagnostic("root.version is required");
|
|
256
|
+
if (parsed.version !== MCP_CONFIG_VERSION) {
|
|
257
|
+
return diagnostic(
|
|
258
|
+
`unsupported version ${JSON.stringify(parsed.version)}; supported version is ${MCP_CONFIG_VERSION}`
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
if (!Object.hasOwn(parsed, "servers")) return diagnostic("root.servers is required");
|
|
262
|
+
if (!Array.isArray(parsed.servers)) return diagnostic("root.servers must be an array");
|
|
263
|
+
if (parsed.servers.length > MCP_CONFIG_CAPS.servers) {
|
|
264
|
+
return diagnostic(`root.servers exceeds the ${MCP_CONFIG_CAPS.servers}-server cap`);
|
|
265
|
+
}
|
|
266
|
+
const servers = [];
|
|
267
|
+
const ids = /* @__PURE__ */ new Map();
|
|
268
|
+
for (const [index, value] of parsed.servers.entries()) {
|
|
269
|
+
const location = `servers[${index}]`;
|
|
270
|
+
const validated = validateServer(value, location);
|
|
271
|
+
if (validated instanceof Error) return diagnostic(validated.message);
|
|
272
|
+
const { fields, declaredCwd } = validated;
|
|
273
|
+
const duplicateIndex = ids.get(fields.id);
|
|
274
|
+
if (duplicateIndex !== void 0) {
|
|
275
|
+
return diagnostic(`${location}.id duplicates '${fields.id}' from servers[${duplicateIndex}].id`);
|
|
276
|
+
}
|
|
277
|
+
const resolved = resolveCwd(declaredCwd, input.scope, input.root, `${location}.cwd`);
|
|
278
|
+
if (resolved instanceof Error) return diagnostic(resolved.message);
|
|
279
|
+
ids.set(fields.id, index);
|
|
280
|
+
servers.push({
|
|
281
|
+
id: fields.id,
|
|
282
|
+
scope: input.scope,
|
|
283
|
+
path: input.path,
|
|
284
|
+
command: fields.command,
|
|
285
|
+
args: fields.args,
|
|
286
|
+
cwd: resolved.cwd,
|
|
287
|
+
cwdRoot: resolved.cwdRoot,
|
|
288
|
+
env: fields.env,
|
|
289
|
+
timeoutMs: fields.timeoutMs,
|
|
290
|
+
digest: mcpServerDigest(fields)
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
return { servers, diagnostics: [] };
|
|
294
|
+
}
|
|
295
|
+
function readBoundedFileText(filePath, maxBytes) {
|
|
296
|
+
const describe = (error) => error instanceof Error ? error.message : String(error);
|
|
297
|
+
let fd;
|
|
298
|
+
try {
|
|
299
|
+
fd = openSync(filePath, fsConstants.O_RDONLY | (fsConstants.O_NONBLOCK ?? 0));
|
|
300
|
+
} catch (error) {
|
|
301
|
+
if (error.code === "ENOENT") {
|
|
302
|
+
return { ok: false, reason: "missing", message: "file does not exist" };
|
|
303
|
+
}
|
|
304
|
+
return { ok: false, reason: "unreadable", message: `cannot read (${describe(error)})` };
|
|
305
|
+
}
|
|
306
|
+
try {
|
|
307
|
+
const stats = fstatSync(fd);
|
|
308
|
+
if (!stats.isFile()) return { ok: false, reason: "unreadable", message: "path must be a regular file" };
|
|
309
|
+
let buffer = Buffer.allocUnsafe(Math.min(Math.max(stats.size, 0), maxBytes) + 1);
|
|
310
|
+
let total = 0;
|
|
311
|
+
for (; ; ) {
|
|
312
|
+
if (total === buffer.length) {
|
|
313
|
+
if (total > maxBytes) break;
|
|
314
|
+
buffer = Buffer.concat([buffer], maxBytes + 1);
|
|
315
|
+
}
|
|
316
|
+
const read = readSync(fd, buffer, total, buffer.length - total, null);
|
|
317
|
+
if (read === 0) break;
|
|
318
|
+
total += read;
|
|
319
|
+
}
|
|
320
|
+
if (total > maxBytes) return { ok: false, reason: "oversized", message: `file exceeds the ${maxBytes}-byte cap` };
|
|
321
|
+
return { ok: true, text: buffer.toString("utf8", 0, total) };
|
|
322
|
+
} catch (error) {
|
|
323
|
+
return { ok: false, reason: "unreadable", message: `cannot read (${describe(error)})` };
|
|
324
|
+
} finally {
|
|
325
|
+
closeSync(fd);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
function loadFile(filePath, scope, root) {
|
|
329
|
+
const read = readBoundedFileText(filePath, MCP_CONFIG_CAPS.fileBytes);
|
|
330
|
+
if (!read.ok) {
|
|
331
|
+
if (read.reason === "missing") return { servers: [], diagnostics: [] };
|
|
332
|
+
return { servers: [], diagnostics: [{ scope, path: filePath, message: read.message }] };
|
|
333
|
+
}
|
|
334
|
+
return parseMcpConfigText(read.text, { scope, path: filePath, root });
|
|
335
|
+
}
|
|
336
|
+
function loadMcpServerConfig(options) {
|
|
337
|
+
const paths = mcpConfigPaths(options);
|
|
338
|
+
const configDir = options.configDir ?? clioConfigDir();
|
|
339
|
+
const user = loadFile(paths.user, "user", configDir);
|
|
340
|
+
const project = loadFile(paths.project, "project", path.resolve(options.cwd));
|
|
341
|
+
const servers = [...user.servers];
|
|
342
|
+
const diagnostics = [...user.diagnostics, ...project.diagnostics];
|
|
343
|
+
const userIds = new Set(user.servers.map((server) => server.id));
|
|
344
|
+
for (const server of project.servers) {
|
|
345
|
+
if (userIds.has(server.id)) {
|
|
346
|
+
diagnostics.push({
|
|
347
|
+
scope: "project",
|
|
348
|
+
path: server.path,
|
|
349
|
+
message: `server '${server.id}' is shadowed by the user declaration in ${paths.user}`
|
|
350
|
+
});
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
servers.push(server);
|
|
354
|
+
}
|
|
355
|
+
return { servers, diagnostics };
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// src/domains/gateway/mcp/trust.ts
|
|
359
|
+
var MCP_TRUST_FILENAME = "mcp-trust.json";
|
|
360
|
+
var MCP_TRUST_VERSION = 1;
|
|
361
|
+
var MCP_TRUST_CAPS = Object.freeze({
|
|
362
|
+
fileBytes: 1024 * 1024,
|
|
363
|
+
records: 256
|
|
364
|
+
});
|
|
365
|
+
var MCP_TRUST_ACTION_CLASSES = ["read", "execute", "unknown"];
|
|
366
|
+
function isRecord2(value) {
|
|
367
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
368
|
+
}
|
|
369
|
+
function isActionClass(value) {
|
|
370
|
+
return typeof value === "string" && MCP_TRUST_ACTION_CLASSES.includes(value);
|
|
371
|
+
}
|
|
372
|
+
function mcpTrustPath(configDir) {
|
|
373
|
+
return path2.join(configDir ?? clioConfigDir(), MCP_TRUST_FILENAME);
|
|
374
|
+
}
|
|
375
|
+
function canonicalProjectRoot(cwd) {
|
|
376
|
+
const resolved = path2.resolve(cwd);
|
|
377
|
+
try {
|
|
378
|
+
return realpathSync2(resolved);
|
|
379
|
+
} catch {
|
|
380
|
+
return resolved;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
function parseTrustState(text) {
|
|
384
|
+
let parsed;
|
|
385
|
+
try {
|
|
386
|
+
parsed = JSON.parse(text);
|
|
387
|
+
} catch (error) {
|
|
388
|
+
return new Error(`invalid JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
389
|
+
}
|
|
390
|
+
if (!isRecord2(parsed) || parsed.version !== MCP_TRUST_VERSION) {
|
|
391
|
+
return new Error(`trust state must be a version ${MCP_TRUST_VERSION} object`);
|
|
392
|
+
}
|
|
393
|
+
if (!Array.isArray(parsed.records)) return new Error("trust state records must be an array");
|
|
394
|
+
if (parsed.records.length > MCP_TRUST_CAPS.records) {
|
|
395
|
+
return new Error(`trust state exceeds the ${MCP_TRUST_CAPS.records}-record cap`);
|
|
396
|
+
}
|
|
397
|
+
const records = [];
|
|
398
|
+
for (const [index, raw] of parsed.records.entries()) {
|
|
399
|
+
if (!isRecord2(raw)) return new Error(`records[${index}] must be an object`);
|
|
400
|
+
for (const field of ["projectRoot", "id", "digest", "trustedAt"]) {
|
|
401
|
+
if (typeof raw[field] !== "string" || raw[field].length === 0) {
|
|
402
|
+
return new Error(`records[${index}].${field} must be a non-empty string`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
if (!isActionClass(raw.actionClass)) {
|
|
406
|
+
return new Error(`records[${index}].actionClass must be one of ${MCP_TRUST_ACTION_CLASSES.join(", ")}`);
|
|
407
|
+
}
|
|
408
|
+
records.push({
|
|
409
|
+
projectRoot: raw.projectRoot,
|
|
410
|
+
id: raw.id,
|
|
411
|
+
digest: raw.digest,
|
|
412
|
+
actionClass: raw.actionClass,
|
|
413
|
+
trustedAt: raw.trustedAt
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
return { version: MCP_TRUST_VERSION, records };
|
|
417
|
+
}
|
|
418
|
+
function readMcpTrustState(configDir) {
|
|
419
|
+
const filePath = mcpTrustPath(configDir);
|
|
420
|
+
const empty = { version: MCP_TRUST_VERSION, records: [] };
|
|
421
|
+
const read = readBoundedFileText(filePath, MCP_TRUST_CAPS.fileBytes);
|
|
422
|
+
if (!read.ok) {
|
|
423
|
+
if (read.reason === "missing") return { state: empty, diagnostics: [] };
|
|
424
|
+
return { state: empty, diagnostics: [`${filePath}: ${read.message}`] };
|
|
425
|
+
}
|
|
426
|
+
const parsed = parseTrustState(read.text);
|
|
427
|
+
if (parsed instanceof Error) return { state: empty, diagnostics: [`${filePath}: ${parsed.message}`] };
|
|
428
|
+
return { state: parsed, diagnostics: [] };
|
|
429
|
+
}
|
|
430
|
+
function writeTrustState(records, configDir) {
|
|
431
|
+
if (records.length > MCP_TRUST_CAPS.records) {
|
|
432
|
+
return `trust state would exceed the ${MCP_TRUST_CAPS.records}-record cap; untrust servers you no longer use first`;
|
|
433
|
+
}
|
|
434
|
+
const sorted = [...records].sort(
|
|
435
|
+
(left, right) => left.projectRoot.localeCompare(right.projectRoot) || left.id.localeCompare(right.id)
|
|
436
|
+
);
|
|
437
|
+
const text = `${JSON.stringify({ version: MCP_TRUST_VERSION, records: sorted }, null, 2)}
|
|
438
|
+
`;
|
|
439
|
+
if (Buffer.byteLength(text, "utf8") > MCP_TRUST_CAPS.fileBytes) {
|
|
440
|
+
return `trust state would exceed the ${MCP_TRUST_CAPS.fileBytes}-byte cap; untrust servers you no longer use first`;
|
|
441
|
+
}
|
|
442
|
+
safeResourceWrite(mcpTrustPath(configDir), text, { mode: 384 });
|
|
443
|
+
return null;
|
|
444
|
+
}
|
|
445
|
+
function trustStatusFor(server, projectRoot, state) {
|
|
446
|
+
if (server.scope === "user") return { status: "trusted", actionClass: "unknown" };
|
|
447
|
+
const record = state.records.find((entry) => entry.projectRoot === projectRoot && entry.id === server.id);
|
|
448
|
+
if (record === void 0) {
|
|
449
|
+
return {
|
|
450
|
+
status: "untrusted",
|
|
451
|
+
actionClass: "unknown",
|
|
452
|
+
reason: `project-scope server '${server.id}' requires explicit trust: clio-coder mcp trust ${server.id}`
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
if (record.digest !== server.digest) {
|
|
456
|
+
return {
|
|
457
|
+
status: "stale",
|
|
458
|
+
actionClass: "unknown",
|
|
459
|
+
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`
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
return { status: "trusted", actionClass: record.actionClass };
|
|
463
|
+
}
|
|
464
|
+
function resolveMcpServers(options) {
|
|
465
|
+
const loaded = loadMcpServerConfig(options);
|
|
466
|
+
const trust = readMcpTrustState(options.configDir);
|
|
467
|
+
const projectRoot = canonicalProjectRoot(options.cwd);
|
|
468
|
+
return {
|
|
469
|
+
servers: loaded.servers.map((server) => ({ ...server, trust: trustStatusFor(server, projectRoot, trust.state) })),
|
|
470
|
+
diagnostics: loaded.diagnostics,
|
|
471
|
+
trustDiagnostics: trust.diagnostics
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
function trustMcpServer(options) {
|
|
475
|
+
const actionClass = options.actionClass ?? "unknown";
|
|
476
|
+
if (!isActionClass(actionClass)) {
|
|
477
|
+
return { ok: false, message: `actionClass must be one of ${MCP_TRUST_ACTION_CLASSES.join(", ")}` };
|
|
478
|
+
}
|
|
479
|
+
const loaded = loadMcpServerConfig(options);
|
|
480
|
+
const server = loaded.servers.find((entry) => entry.id === options.id);
|
|
481
|
+
if (server === void 0) {
|
|
482
|
+
const problems = loaded.diagnostics.map((entry) => `${entry.path}: ${entry.message}`);
|
|
483
|
+
return {
|
|
484
|
+
ok: false,
|
|
485
|
+
message: `no declared MCP server with id '${options.id}'` + (problems.length > 0 ? `; config diagnostics: ${problems.join("; ")}` : "")
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
if (server.scope !== "project") {
|
|
489
|
+
return { ok: false, message: `server '${options.id}' is a user-scope declaration; it is trusted by authorship` };
|
|
490
|
+
}
|
|
491
|
+
const trust = readMcpTrustState(options.configDir);
|
|
492
|
+
if (trust.diagnostics.length > 0) {
|
|
493
|
+
return { ok: false, message: `trust state is unusable; repair or remove it first: ${trust.diagnostics.join("; ")}` };
|
|
494
|
+
}
|
|
495
|
+
const projectRoot = canonicalProjectRoot(options.cwd);
|
|
496
|
+
const record = {
|
|
497
|
+
projectRoot,
|
|
498
|
+
id: server.id,
|
|
499
|
+
digest: server.digest,
|
|
500
|
+
actionClass,
|
|
501
|
+
trustedAt: (options.now?.() ?? /* @__PURE__ */ new Date()).toISOString()
|
|
502
|
+
};
|
|
503
|
+
const records = trust.state.records.filter((entry) => !(entry.projectRoot === projectRoot && entry.id === server.id));
|
|
504
|
+
records.push(record);
|
|
505
|
+
const refused = writeTrustState(records, options.configDir);
|
|
506
|
+
if (refused !== null) return { ok: false, message: refused };
|
|
507
|
+
return { ok: true, record };
|
|
508
|
+
}
|
|
509
|
+
function untrustMcpServer(options) {
|
|
510
|
+
const trust = readMcpTrustState(options.configDir);
|
|
511
|
+
if (trust.diagnostics.length > 0) {
|
|
512
|
+
return { ok: false, message: `trust state is unusable; repair or remove it first: ${trust.diagnostics.join("; ")}` };
|
|
513
|
+
}
|
|
514
|
+
const projectRoot = canonicalProjectRoot(options.cwd);
|
|
515
|
+
const records = trust.state.records.filter((entry) => !(entry.projectRoot === projectRoot && entry.id === options.id));
|
|
516
|
+
const removed = records.length !== trust.state.records.length;
|
|
517
|
+
if (removed) {
|
|
518
|
+
const refused = writeTrustState(records, options.configDir);
|
|
519
|
+
if (refused !== null) return { ok: false, message: refused };
|
|
520
|
+
}
|
|
521
|
+
return { ok: true, removed };
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// src/domains/gateway/mcp/index.ts
|
|
525
|
+
init_esm_shims();
|
|
526
|
+
|
|
527
|
+
// src/domains/gateway/mcp/client.ts
|
|
528
|
+
init_esm_shims();
|
|
529
|
+
import { spawn } from "node:child_process";
|
|
530
|
+
import { realpathSync as realpathSync3, statSync as statSync2 } from "node:fs";
|
|
531
|
+
import path3 from "node:path";
|
|
532
|
+
import { performance } from "node:perf_hooks";
|
|
533
|
+
|
|
534
|
+
// src/domains/gateway/mcp/protocol.ts
|
|
535
|
+
init_esm_shims();
|
|
536
|
+
var MCP_PROTOCOL_VERSION = "2025-06-18";
|
|
537
|
+
var DEFAULT_MAX_LINE_BYTES = 4 * 1024 * 1024;
|
|
538
|
+
var JSON_RPC_METHOD_NOT_FOUND = -32601;
|
|
539
|
+
var McpError = class extends Error {
|
|
540
|
+
name = "McpError";
|
|
541
|
+
code;
|
|
542
|
+
data;
|
|
543
|
+
constructor(code, message, data) {
|
|
544
|
+
super(message);
|
|
545
|
+
this.code = code;
|
|
546
|
+
this.data = data;
|
|
547
|
+
}
|
|
548
|
+
};
|
|
549
|
+
function isRecord3(value) {
|
|
550
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
551
|
+
}
|
|
552
|
+
function isJsonRpcId(value) {
|
|
553
|
+
return typeof value === "string" || typeof value === "number" && Number.isFinite(value);
|
|
554
|
+
}
|
|
555
|
+
var structuredJson = /* @__PURE__ */ new WeakMap();
|
|
556
|
+
function structuredContentJson(result) {
|
|
557
|
+
return structuredJson.get(result);
|
|
558
|
+
}
|
|
559
|
+
function classifyJsonRpcMessage(value) {
|
|
560
|
+
if (!isRecord3(value)) return new McpError("protocol", "message is not a JSON object");
|
|
561
|
+
if (value.jsonrpc !== "2.0") return new McpError("protocol", 'message lacks jsonrpc: "2.0"');
|
|
562
|
+
if (typeof value.method === "string") {
|
|
563
|
+
if (value.id === void 0 || value.id === null) {
|
|
564
|
+
const notification = { jsonrpc: "2.0", method: value.method };
|
|
565
|
+
if (value.params !== void 0) notification.params = value.params;
|
|
566
|
+
return { kind: "notification", message: notification };
|
|
567
|
+
}
|
|
568
|
+
if (!isJsonRpcId(value.id)) return new McpError("protocol", "request id must be a string or a finite number");
|
|
569
|
+
const request = { jsonrpc: "2.0", id: value.id, method: value.method };
|
|
570
|
+
if (value.params !== void 0) request.params = value.params;
|
|
571
|
+
return { kind: "request", message: request };
|
|
572
|
+
}
|
|
573
|
+
const hasResult = Object.hasOwn(value, "result");
|
|
574
|
+
const hasError = Object.hasOwn(value, "error");
|
|
575
|
+
if (!hasResult && !hasError) return new McpError("protocol", "message has neither method, result, nor error");
|
|
576
|
+
if (hasResult && hasError) return new McpError("protocol", "response carries both result and error");
|
|
577
|
+
if (value.id !== null && !isJsonRpcId(value.id)) {
|
|
578
|
+
return new McpError("protocol", "response id must be a string, a finite number, or null");
|
|
579
|
+
}
|
|
580
|
+
const response = {
|
|
581
|
+
jsonrpc: "2.0",
|
|
582
|
+
id: value.id === void 0 ? null : value.id
|
|
583
|
+
};
|
|
584
|
+
if (hasResult) response.result = value.result;
|
|
585
|
+
if (hasError) {
|
|
586
|
+
const error = value.error;
|
|
587
|
+
if (!isRecord3(error) || typeof error.code !== "number" || typeof error.message !== "string") {
|
|
588
|
+
return new McpError("protocol", "response error must carry a numeric code and a message");
|
|
589
|
+
}
|
|
590
|
+
const errorObject = { code: error.code, message: error.message };
|
|
591
|
+
if (error.data !== void 0) errorObject.data = error.data;
|
|
592
|
+
response.error = errorObject;
|
|
593
|
+
}
|
|
594
|
+
return { kind: "response", message: response };
|
|
595
|
+
}
|
|
596
|
+
function parseJsonRpcLine(line) {
|
|
597
|
+
let text;
|
|
598
|
+
try {
|
|
599
|
+
text = new TextDecoder("utf-8", { fatal: true }).decode(line);
|
|
600
|
+
} catch {
|
|
601
|
+
return new McpError("protocol", "message line is not valid UTF-8");
|
|
602
|
+
}
|
|
603
|
+
let parsed;
|
|
604
|
+
try {
|
|
605
|
+
const sources = /* @__PURE__ */ new WeakMap();
|
|
606
|
+
parsed = JSON.parse(text, function(key, value, context) {
|
|
607
|
+
if (typeof value === "number") {
|
|
608
|
+
if (context?.source === void 0) throw new Error("JSON numeric source tokens are unavailable");
|
|
609
|
+
let entries = sources.get(this);
|
|
610
|
+
if (entries === void 0) {
|
|
611
|
+
entries = /* @__PURE__ */ new Map();
|
|
612
|
+
sources.set(this, entries);
|
|
613
|
+
}
|
|
614
|
+
entries.set(key, context.source);
|
|
615
|
+
}
|
|
616
|
+
return value;
|
|
617
|
+
});
|
|
618
|
+
if (isRecord3(parsed) && isRecord3(parsed.result) && isRecord3(parsed.result.structuredContent)) {
|
|
619
|
+
const content = parsed.result.structuredContent;
|
|
620
|
+
const rawJSON = JSON.rawJSON;
|
|
621
|
+
const exact = JSON.stringify(content, function(key, value) {
|
|
622
|
+
const source = sources.get(this)?.get(key);
|
|
623
|
+
return source === void 0 ? value : rawJSON(source);
|
|
624
|
+
});
|
|
625
|
+
parsed.result.structuredContent = JSON.parse(
|
|
626
|
+
JSON.stringify(content, function(key, value) {
|
|
627
|
+
const source = sources.get(this)?.get(key);
|
|
628
|
+
return source !== void 0 && JSON.stringify(value) !== source ? { $literal: source } : value;
|
|
629
|
+
})
|
|
630
|
+
);
|
|
631
|
+
structuredJson.set(parsed.result, exact);
|
|
632
|
+
}
|
|
633
|
+
} catch (error) {
|
|
634
|
+
return new McpError(
|
|
635
|
+
"protocol",
|
|
636
|
+
`message line is not valid JSON: ${error instanceof Error ? error.message : String(error)}`
|
|
637
|
+
);
|
|
638
|
+
}
|
|
639
|
+
return classifyJsonRpcMessage(parsed);
|
|
640
|
+
}
|
|
641
|
+
function encodeJsonRpcMessage(message) {
|
|
642
|
+
return Buffer.from(`${JSON.stringify(message)}
|
|
643
|
+
`, "utf8");
|
|
644
|
+
}
|
|
645
|
+
function createLineFramer(maxLineBytes = DEFAULT_MAX_LINE_BYTES) {
|
|
646
|
+
const pending = [];
|
|
647
|
+
let pendingBytes = 0;
|
|
648
|
+
let failed = false;
|
|
649
|
+
const fail = (message) => {
|
|
650
|
+
failed = true;
|
|
651
|
+
pending.length = 0;
|
|
652
|
+
pendingBytes = 0;
|
|
653
|
+
return [{ kind: "error", error: new McpError("protocol", message) }];
|
|
654
|
+
};
|
|
655
|
+
const frameLine = (line) => {
|
|
656
|
+
const trimmed = line.length > 0 && line[line.length - 1] === 13 ? line.subarray(0, line.length - 1) : line;
|
|
657
|
+
if (trimmed.length === 0) return null;
|
|
658
|
+
const decoded = parseJsonRpcLine(trimmed);
|
|
659
|
+
if (decoded instanceof McpError) return { kind: "error", error: decoded };
|
|
660
|
+
return { kind: "message", message: decoded };
|
|
661
|
+
};
|
|
662
|
+
return {
|
|
663
|
+
get pendingBytes() {
|
|
664
|
+
return pendingBytes;
|
|
665
|
+
},
|
|
666
|
+
get failed() {
|
|
667
|
+
return failed;
|
|
668
|
+
},
|
|
669
|
+
push(chunk) {
|
|
670
|
+
if (failed) return [];
|
|
671
|
+
const frames = [];
|
|
672
|
+
let start = 0;
|
|
673
|
+
for (; ; ) {
|
|
674
|
+
const newline = chunk.indexOf(10, start);
|
|
675
|
+
if (newline === -1) break;
|
|
676
|
+
const tail = chunk.subarray(start, newline);
|
|
677
|
+
const lineBytes = pendingBytes + tail.length;
|
|
678
|
+
if (lineBytes > maxLineBytes) return fail(`message line exceeds ${maxLineBytes} bytes`);
|
|
679
|
+
const line = pending.length === 0 ? tail : Buffer.concat([...pending, tail], lineBytes);
|
|
680
|
+
pending.length = 0;
|
|
681
|
+
pendingBytes = 0;
|
|
682
|
+
const frame = frameLine(line);
|
|
683
|
+
if (frame !== null) {
|
|
684
|
+
frames.push(frame);
|
|
685
|
+
if (frame.kind === "error") {
|
|
686
|
+
failed = true;
|
|
687
|
+
return frames;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
start = newline + 1;
|
|
691
|
+
}
|
|
692
|
+
if (start < chunk.length) {
|
|
693
|
+
const rest = chunk.subarray(start);
|
|
694
|
+
if (pendingBytes + rest.length > maxLineBytes) {
|
|
695
|
+
frames.push(...fail(`message line exceeds ${maxLineBytes} bytes`));
|
|
696
|
+
return frames;
|
|
697
|
+
}
|
|
698
|
+
pending.push(Buffer.from(rest));
|
|
699
|
+
pendingBytes += rest.length;
|
|
700
|
+
}
|
|
701
|
+
return frames;
|
|
702
|
+
},
|
|
703
|
+
flush() {
|
|
704
|
+
if (failed || pendingBytes === 0) return [];
|
|
705
|
+
const line = Buffer.concat(pending, pendingBytes);
|
|
706
|
+
pending.length = 0;
|
|
707
|
+
pendingBytes = 0;
|
|
708
|
+
const frame = frameLine(line);
|
|
709
|
+
if (frame === null) return [];
|
|
710
|
+
if (frame.kind === "error") failed = true;
|
|
711
|
+
return [frame];
|
|
712
|
+
}
|
|
713
|
+
};
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
// src/domains/gateway/mcp/client.ts
|
|
717
|
+
var MCP_CLIENT_NAME = "clio-coder";
|
|
718
|
+
var DEFAULT_MCP_CLIENT_VERSION = "0.5.0";
|
|
719
|
+
var DEFAULT_INITIALIZE_TIMEOUT_MS = 15e3;
|
|
720
|
+
var DEFAULT_REQUEST_TIMEOUT_MS = 6e4;
|
|
721
|
+
var DEFAULT_STDERR_TAIL_BYTES = 16 * 1024;
|
|
722
|
+
var DEFAULT_RESULT_TEXT_BYTES = 1024 * 1024;
|
|
723
|
+
var DEFAULT_KILL_GRACE_MS = 3e3;
|
|
724
|
+
var DEFAULT_MAX_OUTBOUND_BYTES = 4 * 1024 * 1024;
|
|
725
|
+
var MCP_TOOL_LIST_CAP = 500;
|
|
726
|
+
var MCP_TOOL_LIST_PAGE_CAP = 100;
|
|
727
|
+
var MIN_OUTBOUND_BYTES = 4096;
|
|
728
|
+
var DEFAULT_TEARDOWN_BOUND_MS = 2e3;
|
|
729
|
+
function isRecord4(value) {
|
|
730
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
731
|
+
}
|
|
732
|
+
function errorMessage(error) {
|
|
733
|
+
return error instanceof Error ? error.message : String(error);
|
|
734
|
+
}
|
|
735
|
+
function cutUtf8(text, maxBytes) {
|
|
736
|
+
if (Buffer.byteLength(text, "utf8") <= maxBytes) return text;
|
|
737
|
+
const bytes = Buffer.from(text, "utf8");
|
|
738
|
+
let cut = Math.max(0, maxBytes);
|
|
739
|
+
while (cut > 0) {
|
|
740
|
+
const byte = bytes[cut];
|
|
741
|
+
if (byte === void 0 || (byte & 192) !== 128) break;
|
|
742
|
+
cut -= 1;
|
|
743
|
+
}
|
|
744
|
+
return bytes.subarray(0, cut).toString("utf8");
|
|
745
|
+
}
|
|
746
|
+
function containedCwd(spec, workspaceRoot) {
|
|
747
|
+
let lexical;
|
|
748
|
+
try {
|
|
749
|
+
lexical = resolveSafeCwd(spec.cwd, workspaceRoot);
|
|
750
|
+
} catch (error) {
|
|
751
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
752
|
+
}
|
|
753
|
+
let realRoot;
|
|
754
|
+
let real;
|
|
755
|
+
try {
|
|
756
|
+
realRoot = realpathSync3(path3.resolve(workspaceRoot));
|
|
757
|
+
real = realpathSync3(lexical);
|
|
758
|
+
if (!statSync2(real).isDirectory()) return new Error(`cwd is not a directory: ${lexical}`);
|
|
759
|
+
} catch (error) {
|
|
760
|
+
return new Error(`cwd cannot be resolved: ${lexical} (${errorMessage(error)})`);
|
|
761
|
+
}
|
|
762
|
+
try {
|
|
763
|
+
resolveSafeCwd(real, realRoot);
|
|
764
|
+
} catch {
|
|
765
|
+
return new Error(`cwd escapes workspace root through a symbolic link: ${lexical} -> ${real}`);
|
|
766
|
+
}
|
|
767
|
+
return real;
|
|
768
|
+
}
|
|
769
|
+
function parseServerInfo(value) {
|
|
770
|
+
if (!isRecord4(value)) return new McpError("protocol", "initialize result is not an object");
|
|
771
|
+
if (typeof value.protocolVersion !== "string" || value.protocolVersion.length === 0) {
|
|
772
|
+
return new McpError("protocol", "initialize result lacks a protocolVersion string");
|
|
773
|
+
}
|
|
774
|
+
const capabilities = isRecord4(value.capabilities) ? value.capabilities : {};
|
|
775
|
+
let serverInfo = null;
|
|
776
|
+
if (isRecord4(value.serverInfo)) {
|
|
777
|
+
serverInfo = {
|
|
778
|
+
name: typeof value.serverInfo.name === "string" ? value.serverInfo.name : "",
|
|
779
|
+
version: typeof value.serverInfo.version === "string" ? value.serverInfo.version : ""
|
|
780
|
+
};
|
|
781
|
+
}
|
|
782
|
+
return {
|
|
783
|
+
protocolVersion: value.protocolVersion,
|
|
784
|
+
serverInfo,
|
|
785
|
+
capabilities,
|
|
786
|
+
instructions: typeof value.instructions === "string" ? value.instructions : null
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
function parseToolDescriptor(value) {
|
|
790
|
+
if (!isRecord4(value)) return new McpError("protocol", "tools/list entry is not an object");
|
|
791
|
+
if (typeof value.name !== "string" || value.name.length === 0) {
|
|
792
|
+
return new McpError("protocol", "tools/list entry lacks a name");
|
|
793
|
+
}
|
|
794
|
+
const inputSchema = isRecord4(value.inputSchema) ? value.inputSchema : { type: "object" };
|
|
795
|
+
return {
|
|
796
|
+
name: value.name,
|
|
797
|
+
title: typeof value.title === "string" ? value.title : null,
|
|
798
|
+
description: typeof value.description === "string" ? value.description : "",
|
|
799
|
+
inputSchema,
|
|
800
|
+
annotations: isRecord4(value.annotations) ? value.annotations : null
|
|
801
|
+
};
|
|
802
|
+
}
|
|
803
|
+
function normalizeContentBlock(value) {
|
|
804
|
+
if (!isRecord4(value) || typeof value.type !== "string") return { type: "other", raw: value };
|
|
805
|
+
switch (value.type) {
|
|
806
|
+
case "text":
|
|
807
|
+
return typeof value.text === "string" ? { type: "text", text: value.text } : { type: "other", raw: value };
|
|
808
|
+
case "image":
|
|
809
|
+
case "audio":
|
|
810
|
+
if (typeof value.data === "string" && typeof value.mimeType === "string") {
|
|
811
|
+
return { type: value.type, mimeType: value.mimeType, data: value.data };
|
|
812
|
+
}
|
|
813
|
+
return { type: "other", raw: value };
|
|
814
|
+
case "resource": {
|
|
815
|
+
const resource = value.resource;
|
|
816
|
+
if (!isRecord4(resource) || typeof resource.uri !== "string") return { type: "other", raw: value };
|
|
817
|
+
return {
|
|
818
|
+
type: "resource",
|
|
819
|
+
uri: resource.uri,
|
|
820
|
+
...typeof resource.text === "string" ? { text: resource.text } : {},
|
|
821
|
+
...typeof resource.mimeType === "string" ? { mimeType: resource.mimeType } : {}
|
|
822
|
+
};
|
|
823
|
+
}
|
|
824
|
+
case "resource_link":
|
|
825
|
+
if (typeof value.uri !== "string") return { type: "other", raw: value };
|
|
826
|
+
return {
|
|
827
|
+
type: "resource",
|
|
828
|
+
uri: value.uri,
|
|
829
|
+
...typeof value.mimeType === "string" ? { mimeType: value.mimeType } : {}
|
|
830
|
+
};
|
|
831
|
+
default:
|
|
832
|
+
return { type: "other", raw: value };
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
function renderContentBlock(block) {
|
|
836
|
+
switch (block.type) {
|
|
837
|
+
case "text":
|
|
838
|
+
return block.text;
|
|
839
|
+
case "image":
|
|
840
|
+
case "audio":
|
|
841
|
+
return `[${block.type} ${block.mimeType}, ${Buffer.byteLength(block.data, "base64")} bytes]`;
|
|
842
|
+
case "resource":
|
|
843
|
+
return block.text === void 0 ? `[resource ${block.uri}]` : `[resource ${block.uri}]
|
|
844
|
+
${block.text}`;
|
|
845
|
+
case "other": {
|
|
846
|
+
const type = isRecord4(block.raw) && typeof block.raw.type === "string" ? block.raw.type : "unknown";
|
|
847
|
+
return `[unsupported content type ${type}]`;
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
function renderMcpContent(blocks, maxBytes = DEFAULT_RESULT_TEXT_BYTES) {
|
|
852
|
+
const joined = blocks.map(renderContentBlock).join("\n");
|
|
853
|
+
if (Buffer.byteLength(joined, "utf8") <= maxBytes) return { text: joined, truncated: false };
|
|
854
|
+
const marker = `
|
|
855
|
+
[mcp result text truncated at ${maxBytes} bytes]`;
|
|
856
|
+
const budget = Math.max(0, maxBytes - Buffer.byteLength(marker, "utf8"));
|
|
857
|
+
return { text: `${cutUtf8(joined, budget)}${marker}`, truncated: true };
|
|
858
|
+
}
|
|
859
|
+
function parseToolCallResult(value, maxTextBytes) {
|
|
860
|
+
if (!isRecord4(value)) return new McpError("protocol", "tools/call result is not an object");
|
|
861
|
+
if (!Array.isArray(value.content)) return new McpError("protocol", "tools/call result.content must be an array");
|
|
862
|
+
if (value.isError !== void 0 && typeof value.isError !== "boolean") {
|
|
863
|
+
return new McpError("protocol", "tools/call result.isError must be a boolean");
|
|
864
|
+
}
|
|
865
|
+
if (value.structuredContent !== void 0 && !isRecord4(value.structuredContent)) {
|
|
866
|
+
return new McpError("protocol", "tools/call result.structuredContent must be an object");
|
|
867
|
+
}
|
|
868
|
+
const content = value.content.map(normalizeContentBlock);
|
|
869
|
+
const structuredText = structuredContentJson(value);
|
|
870
|
+
const rendered = renderMcpContent(
|
|
871
|
+
content.length === 0 && value.structuredContent !== void 0 ? [{ type: "text", text: structuredText ?? JSON.stringify(value.structuredContent) }] : content,
|
|
872
|
+
maxTextBytes
|
|
873
|
+
);
|
|
874
|
+
const result = {
|
|
875
|
+
content,
|
|
876
|
+
isError: value.isError === true,
|
|
877
|
+
text: rendered.text,
|
|
878
|
+
textTruncated: rendered.truncated
|
|
879
|
+
};
|
|
880
|
+
if (value.structuredContent !== void 0) result.structuredContent = value.structuredContent;
|
|
881
|
+
if (structuredText !== void 0) result.structuredContentJson = structuredText;
|
|
882
|
+
return result;
|
|
883
|
+
}
|
|
884
|
+
function createMcpStdioClient(spec, options) {
|
|
885
|
+
const initialCwd = containedCwd(spec, options.workspaceRoot);
|
|
886
|
+
if (initialCwd instanceof Error) throw new McpError("spawn", `mcp server ${spec.id}: ${initialCwd.message}`);
|
|
887
|
+
const initializeTimeoutMs = clampTimerDelayMs(options.initializeTimeoutMs ?? DEFAULT_INITIALIZE_TIMEOUT_MS);
|
|
888
|
+
const requestTimeoutMs = clampTimerDelayMs(options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS);
|
|
889
|
+
const stderrTailBytes = Math.max(0, options.stderrTailBytes ?? DEFAULT_STDERR_TAIL_BYTES);
|
|
890
|
+
const maxResultTextBytes = Math.max(64, options.maxResultTextBytes ?? DEFAULT_RESULT_TEXT_BYTES);
|
|
891
|
+
const maxOutboundBytes = Math.max(MIN_OUTBOUND_BYTES, options.maxOutboundBytes ?? DEFAULT_MAX_OUTBOUND_BYTES);
|
|
892
|
+
const killGraceMs = clampTimerDelayMs(options.killGraceMs ?? DEFAULT_KILL_GRACE_MS);
|
|
893
|
+
const teardownBoundMs = clampTimerDelayMs(options.teardownBoundMs ?? DEFAULT_TEARDOWN_BOUND_MS);
|
|
894
|
+
const clientVersion = options.clientVersion ?? DEFAULT_MCP_CLIENT_VERSION;
|
|
895
|
+
const framer = createLineFramer(options.maxLineBytes ?? DEFAULT_MAX_LINE_BYTES);
|
|
896
|
+
let status = "idle";
|
|
897
|
+
let failure = null;
|
|
898
|
+
let child = null;
|
|
899
|
+
let spawned = null;
|
|
900
|
+
let exited = null;
|
|
901
|
+
let leaderExited = false;
|
|
902
|
+
let groupPhase = "unspawned";
|
|
903
|
+
let groupCleanup = null;
|
|
904
|
+
let teardown = null;
|
|
905
|
+
let closing = false;
|
|
906
|
+
let initializePromise = null;
|
|
907
|
+
let closePromise = null;
|
|
908
|
+
let info = null;
|
|
909
|
+
let nextId = 1;
|
|
910
|
+
const pending = /* @__PURE__ */ new Map();
|
|
911
|
+
const outbound = [];
|
|
912
|
+
let outboundQueuedBytes = 0;
|
|
913
|
+
let awaitingDrain = false;
|
|
914
|
+
let notifications = 0;
|
|
915
|
+
let toolsChangedFlag = false;
|
|
916
|
+
let stderrTailBuffer = Buffer.alloc(0);
|
|
917
|
+
const isAlive = () => child !== null && child.exitCode === null && child.signalCode === null;
|
|
918
|
+
const closedError = () => failure ?? new McpError("closed", `mcp server ${spec.id} is closed`);
|
|
919
|
+
const rejectAllPending = (error) => {
|
|
920
|
+
for (const entry of [...pending.values()]) entry.reject(error);
|
|
921
|
+
};
|
|
922
|
+
const fail = (error) => {
|
|
923
|
+
if (status === "closed" || status === "failed") return;
|
|
924
|
+
status = "failed";
|
|
925
|
+
failure = error;
|
|
926
|
+
rejectAllPending(error);
|
|
927
|
+
};
|
|
928
|
+
const groupOwned = () => groupPhase === "live" || groupPhase === "cleaning";
|
|
929
|
+
const signalGroup = (signalName) => {
|
|
930
|
+
const pid = child?.pid;
|
|
931
|
+
if (pid !== void 0 && process.platform !== "win32" && groupOwned()) {
|
|
932
|
+
try {
|
|
933
|
+
process.kill(-pid, signalName);
|
|
934
|
+
return;
|
|
935
|
+
} catch (error) {
|
|
936
|
+
if (error.code === "ESRCH") groupPhase = "released";
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
try {
|
|
940
|
+
child?.kill(signalName);
|
|
941
|
+
} catch {
|
|
942
|
+
}
|
|
943
|
+
};
|
|
944
|
+
const groupAlive = () => {
|
|
945
|
+
const pid = child?.pid;
|
|
946
|
+
if (pid === void 0 || !groupOwned()) return false;
|
|
947
|
+
if (process.platform !== "win32") {
|
|
948
|
+
try {
|
|
949
|
+
process.kill(-pid, 0);
|
|
950
|
+
return true;
|
|
951
|
+
} catch (error) {
|
|
952
|
+
if (error.code !== "ESRCH") return true;
|
|
953
|
+
groupPhase = "released";
|
|
954
|
+
return false;
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
return isAlive();
|
|
958
|
+
};
|
|
959
|
+
const terminationObserved = () => leaderExited && !groupAlive();
|
|
960
|
+
const waitForTermination = async (timeoutMs) => {
|
|
961
|
+
const deadline = performance.now() + timeoutMs;
|
|
962
|
+
while (!terminationObserved()) {
|
|
963
|
+
const remaining = deadline - performance.now();
|
|
964
|
+
if (remaining <= 0) return terminationObserved();
|
|
965
|
+
const nap = sleep(Math.min(10, remaining));
|
|
966
|
+
await (leaderExited || exited === null ? nap : Promise.race([exited, nap]));
|
|
967
|
+
}
|
|
968
|
+
return true;
|
|
969
|
+
};
|
|
970
|
+
const destroyStdio = () => {
|
|
971
|
+
for (const stream of [child?.stdin, child?.stdout, child?.stderr]) stream?.destroy();
|
|
972
|
+
};
|
|
973
|
+
const cleanupGroup = () => {
|
|
974
|
+
if (groupCleanup !== null) return groupCleanup;
|
|
975
|
+
groupCleanup = (async () => {
|
|
976
|
+
let terminated = true;
|
|
977
|
+
const pgid = child?.pid;
|
|
978
|
+
if (groupPhase === "live" && pgid !== void 0) {
|
|
979
|
+
groupPhase = "cleaning";
|
|
980
|
+
if (groupAlive()) signalGroup("SIGTERM");
|
|
981
|
+
terminated = await waitForTermination(killGraceMs);
|
|
982
|
+
if (!terminated) {
|
|
983
|
+
if (groupAlive()) signalGroup("SIGKILL");
|
|
984
|
+
terminated = await waitForTermination(teardownBoundMs);
|
|
985
|
+
}
|
|
986
|
+
} else {
|
|
987
|
+
await (exited ?? Promise.resolve());
|
|
988
|
+
}
|
|
989
|
+
groupPhase = "released";
|
|
990
|
+
const outcome = terminated || pgid === void 0 ? { complete: true } : { complete: false, reason: "group-survived-sigkill", pgid, boundMs: killGraceMs + teardownBoundMs };
|
|
991
|
+
teardown = outcome;
|
|
992
|
+
if (!outcome.complete) destroyStdio();
|
|
993
|
+
return outcome;
|
|
994
|
+
})();
|
|
995
|
+
return groupCleanup;
|
|
996
|
+
};
|
|
997
|
+
const pendingOutboundBytes = () => outboundQueuedBytes + (child?.stdin?.writableLength ?? 0);
|
|
998
|
+
const flushOutbound = () => {
|
|
999
|
+
while (!awaitingDrain) {
|
|
1000
|
+
const entry = outbound.shift();
|
|
1001
|
+
if (entry === void 0) return;
|
|
1002
|
+
outboundQueuedBytes -= entry.payload.length;
|
|
1003
|
+
const stdin = child?.stdin;
|
|
1004
|
+
if (!stdin || stdin.destroyed || !stdin.writable) {
|
|
1005
|
+
entry.onError?.(new Error("server stdin is not writable"));
|
|
1006
|
+
continue;
|
|
1007
|
+
}
|
|
1008
|
+
const accepted = stdin.write(entry.payload, (error) => {
|
|
1009
|
+
if (error) entry.onError?.(error);
|
|
1010
|
+
});
|
|
1011
|
+
if (!accepted) {
|
|
1012
|
+
awaitingDrain = true;
|
|
1013
|
+
stdin.once("drain", () => {
|
|
1014
|
+
awaitingDrain = false;
|
|
1015
|
+
flushOutbound();
|
|
1016
|
+
});
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
};
|
|
1020
|
+
const enqueueOutbound = (message, requestId, onError) => {
|
|
1021
|
+
const payload = encodeJsonRpcMessage(message);
|
|
1022
|
+
if (payload.length > maxOutboundBytes) return { kind: "oversized", bytes: payload.length };
|
|
1023
|
+
const queued = pendingOutboundBytes();
|
|
1024
|
+
if (queued + payload.length > maxOutboundBytes) {
|
|
1025
|
+
fail(
|
|
1026
|
+
new McpError(
|
|
1027
|
+
"overload",
|
|
1028
|
+
`mcp server ${spec.id} stopped reading its stdin: ${queued} bytes are queued for it and the outbound cap is ${maxOutboundBytes} bytes`
|
|
1029
|
+
)
|
|
1030
|
+
);
|
|
1031
|
+
void close();
|
|
1032
|
+
return { kind: "overloaded" };
|
|
1033
|
+
}
|
|
1034
|
+
outbound.push({ payload, requestId, onError });
|
|
1035
|
+
outboundQueuedBytes += payload.length;
|
|
1036
|
+
flushOutbound();
|
|
1037
|
+
return { kind: "queued" };
|
|
1038
|
+
};
|
|
1039
|
+
const withdrawOutbound = (requestId) => {
|
|
1040
|
+
const index = outbound.findIndex((entry2) => entry2.requestId === requestId);
|
|
1041
|
+
if (index === -1) return;
|
|
1042
|
+
const [entry] = outbound.splice(index, 1);
|
|
1043
|
+
if (entry !== void 0) outboundQueuedBytes -= entry.payload.length;
|
|
1044
|
+
};
|
|
1045
|
+
const dispatch = (frame) => {
|
|
1046
|
+
if (frame.kind === "response") {
|
|
1047
|
+
const id = frame.message.id;
|
|
1048
|
+
if (typeof id !== "number") return;
|
|
1049
|
+
const entry = pending.get(id);
|
|
1050
|
+
if (entry === void 0) return;
|
|
1051
|
+
if (frame.message.error !== void 0) {
|
|
1052
|
+
const error = frame.message.error;
|
|
1053
|
+
entry.reject(new McpError("server", `${entry.method}: ${error.message} (code ${error.code})`, error));
|
|
1054
|
+
return;
|
|
1055
|
+
}
|
|
1056
|
+
entry.resolve(frame.message.result);
|
|
1057
|
+
return;
|
|
1058
|
+
}
|
|
1059
|
+
if (frame.kind === "request") {
|
|
1060
|
+
const request2 = frame.message;
|
|
1061
|
+
const outcome = enqueueOutbound(
|
|
1062
|
+
{
|
|
1063
|
+
jsonrpc: "2.0",
|
|
1064
|
+
id: request2.id,
|
|
1065
|
+
error: { code: JSON_RPC_METHOD_NOT_FOUND, message: `method not found: ${request2.method}` }
|
|
1066
|
+
},
|
|
1067
|
+
null
|
|
1068
|
+
);
|
|
1069
|
+
if (outcome.kind === "oversized") {
|
|
1070
|
+
fail(
|
|
1071
|
+
new McpError(
|
|
1072
|
+
"overload",
|
|
1073
|
+
`mcp server ${spec.id} sent a request whose ${outcome.bytes}-byte reply exceeds the ${maxOutboundBytes}-byte outbound cap`
|
|
1074
|
+
)
|
|
1075
|
+
);
|
|
1076
|
+
void close();
|
|
1077
|
+
}
|
|
1078
|
+
return;
|
|
1079
|
+
}
|
|
1080
|
+
notifications += 1;
|
|
1081
|
+
if (frame.message.method === "notifications/tools/list_changed") toolsChangedFlag = true;
|
|
1082
|
+
};
|
|
1083
|
+
const consumeFrames = (frames) => {
|
|
1084
|
+
for (const frame of frames) {
|
|
1085
|
+
if (status === "closed" || status === "failed") return;
|
|
1086
|
+
if (frame.kind === "message") {
|
|
1087
|
+
dispatch(frame.message);
|
|
1088
|
+
continue;
|
|
1089
|
+
}
|
|
1090
|
+
fail(new McpError("protocol", `protocol error from mcp server ${spec.id}: ${frame.error.message}`));
|
|
1091
|
+
void close();
|
|
1092
|
+
return;
|
|
1093
|
+
}
|
|
1094
|
+
};
|
|
1095
|
+
const spawnChild = () => {
|
|
1096
|
+
const cwd = containedCwd(spec, options.workspaceRoot);
|
|
1097
|
+
if (cwd instanceof Error) {
|
|
1098
|
+
fail(new McpError("spawn", `mcp server ${spec.id} failed to start: ${cwd.message}`));
|
|
1099
|
+
return false;
|
|
1100
|
+
}
|
|
1101
|
+
let proc;
|
|
1102
|
+
try {
|
|
1103
|
+
proc = spawn(spec.command, [...spec.args ?? []], {
|
|
1104
|
+
cwd,
|
|
1105
|
+
env: buildSafeToolEnv({ ...spec.env ?? {} }),
|
|
1106
|
+
detached: process.platform !== "win32",
|
|
1107
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
1108
|
+
});
|
|
1109
|
+
} catch (error) {
|
|
1110
|
+
fail(new McpError("spawn", `mcp server ${spec.id} failed to start: ${errorMessage(error)}`));
|
|
1111
|
+
return false;
|
|
1112
|
+
}
|
|
1113
|
+
child = proc;
|
|
1114
|
+
if (proc.pid !== void 0) groupPhase = "live";
|
|
1115
|
+
spawned = new Promise((resolve) => {
|
|
1116
|
+
proc.once("spawn", () => resolve(true));
|
|
1117
|
+
proc.once("error", (error) => {
|
|
1118
|
+
fail(new McpError("spawn", `mcp server ${spec.id} failed to start: ${error.message}`));
|
|
1119
|
+
resolve(false);
|
|
1120
|
+
});
|
|
1121
|
+
});
|
|
1122
|
+
exited = new Promise((resolve) => {
|
|
1123
|
+
proc.once("exit", (code, signal) => {
|
|
1124
|
+
leaderExited = true;
|
|
1125
|
+
if (!closing && status !== "failed") {
|
|
1126
|
+
fail(
|
|
1127
|
+
new McpError(
|
|
1128
|
+
"closed",
|
|
1129
|
+
`mcp server ${spec.id} exited with ${signal !== null ? `signal ${signal}` : `code ${code ?? "?"}`} before the client closed it`
|
|
1130
|
+
)
|
|
1131
|
+
);
|
|
1132
|
+
} else {
|
|
1133
|
+
rejectAllPending(closedError());
|
|
1134
|
+
}
|
|
1135
|
+
resolve();
|
|
1136
|
+
void cleanupGroup();
|
|
1137
|
+
});
|
|
1138
|
+
proc.once("error", () => {
|
|
1139
|
+
if (proc.pid === void 0) {
|
|
1140
|
+
leaderExited = true;
|
|
1141
|
+
resolve();
|
|
1142
|
+
}
|
|
1143
|
+
});
|
|
1144
|
+
});
|
|
1145
|
+
proc.stdin?.on("error", () => {
|
|
1146
|
+
});
|
|
1147
|
+
proc.stdout?.on("data", (chunk) => consumeFrames(framer.push(chunk)));
|
|
1148
|
+
proc.stdout?.on("end", () => consumeFrames(framer.flush()));
|
|
1149
|
+
proc.stderr?.on("data", (chunk) => {
|
|
1150
|
+
if (stderrTailBytes === 0) return;
|
|
1151
|
+
const joined = Buffer.concat([stderrTailBuffer, chunk]);
|
|
1152
|
+
stderrTailBuffer = joined.length > stderrTailBytes ? Buffer.from(joined.subarray(joined.length - stderrTailBytes)) : joined;
|
|
1153
|
+
});
|
|
1154
|
+
return true;
|
|
1155
|
+
};
|
|
1156
|
+
const request = (method, params, timeoutMs, signal) => new Promise((resolve, reject) => {
|
|
1157
|
+
if (signal?.aborted) {
|
|
1158
|
+
reject(new McpError("aborted", `${method} aborted before it was sent`));
|
|
1159
|
+
return;
|
|
1160
|
+
}
|
|
1161
|
+
if (child === null || status === "closed" || status === "failed") {
|
|
1162
|
+
reject(closedError());
|
|
1163
|
+
return;
|
|
1164
|
+
}
|
|
1165
|
+
const id = nextId++;
|
|
1166
|
+
let timer = null;
|
|
1167
|
+
const settle = (finish) => {
|
|
1168
|
+
if (!pending.has(id)) return;
|
|
1169
|
+
pending.delete(id);
|
|
1170
|
+
withdrawOutbound(id);
|
|
1171
|
+
if (timer !== null) clearTimeout(timer);
|
|
1172
|
+
signal?.removeEventListener("abort", onAbort);
|
|
1173
|
+
finish();
|
|
1174
|
+
};
|
|
1175
|
+
const onAbort = () => settle(() => reject(new McpError("aborted", `${method} aborted`)));
|
|
1176
|
+
pending.set(id, {
|
|
1177
|
+
method,
|
|
1178
|
+
resolve: (value) => settle(() => resolve(value)),
|
|
1179
|
+
reject: (error) => settle(() => reject(error))
|
|
1180
|
+
});
|
|
1181
|
+
if (timeoutMs > 0) {
|
|
1182
|
+
timer = setTimeout(
|
|
1183
|
+
() => settle(() => reject(new McpError("timeout", `${method} timed out after ${timeoutMs}ms`))),
|
|
1184
|
+
timeoutMs
|
|
1185
|
+
);
|
|
1186
|
+
}
|
|
1187
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
1188
|
+
const outcome = enqueueOutbound(
|
|
1189
|
+
{ jsonrpc: "2.0", id, method, ...params === void 0 ? {} : { params } },
|
|
1190
|
+
id,
|
|
1191
|
+
(error) => {
|
|
1192
|
+
settle(() => reject(failure ?? new McpError("closed", `write to mcp server ${spec.id} failed: ${error.message}`)));
|
|
1193
|
+
}
|
|
1194
|
+
);
|
|
1195
|
+
if (outcome.kind === "oversized") {
|
|
1196
|
+
settle(
|
|
1197
|
+
() => reject(
|
|
1198
|
+
new McpError(
|
|
1199
|
+
"overload",
|
|
1200
|
+
`${method} request of ${outcome.bytes} bytes exceeds the ${maxOutboundBytes}-byte outbound cap`
|
|
1201
|
+
)
|
|
1202
|
+
)
|
|
1203
|
+
);
|
|
1204
|
+
}
|
|
1205
|
+
});
|
|
1206
|
+
const initialize = () => {
|
|
1207
|
+
if (status === "closed" || status === "failed") return Promise.reject(closedError());
|
|
1208
|
+
if (initializePromise !== null) return initializePromise;
|
|
1209
|
+
initializePromise = (async () => {
|
|
1210
|
+
status = "starting";
|
|
1211
|
+
if (!spawnChild()) {
|
|
1212
|
+
await close();
|
|
1213
|
+
throw closedError();
|
|
1214
|
+
}
|
|
1215
|
+
const started = await (spawned ?? Promise.resolve(false));
|
|
1216
|
+
if (!started) {
|
|
1217
|
+
await close();
|
|
1218
|
+
throw closedError();
|
|
1219
|
+
}
|
|
1220
|
+
let result;
|
|
1221
|
+
try {
|
|
1222
|
+
result = await request(
|
|
1223
|
+
"initialize",
|
|
1224
|
+
{
|
|
1225
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
1226
|
+
capabilities: {},
|
|
1227
|
+
clientInfo: { name: MCP_CLIENT_NAME, version: clientVersion }
|
|
1228
|
+
},
|
|
1229
|
+
initializeTimeoutMs
|
|
1230
|
+
);
|
|
1231
|
+
} catch (error) {
|
|
1232
|
+
const cause = error instanceof McpError ? error : new McpError("protocol", errorMessage(error));
|
|
1233
|
+
fail(new McpError(cause.code, `initialize failed: ${cause.message}`, cause.data));
|
|
1234
|
+
await close();
|
|
1235
|
+
throw closedError();
|
|
1236
|
+
}
|
|
1237
|
+
const parsed = parseServerInfo(result);
|
|
1238
|
+
if (parsed instanceof McpError) {
|
|
1239
|
+
fail(new McpError("protocol", `initialize failed: ${parsed.message}`));
|
|
1240
|
+
await close();
|
|
1241
|
+
throw closedError();
|
|
1242
|
+
}
|
|
1243
|
+
info = parsed;
|
|
1244
|
+
enqueueOutbound({ jsonrpc: "2.0", method: "notifications/initialized" }, null);
|
|
1245
|
+
if (status === "starting") status = "ready";
|
|
1246
|
+
return parsed;
|
|
1247
|
+
})();
|
|
1248
|
+
return initializePromise;
|
|
1249
|
+
};
|
|
1250
|
+
const ensureReady = async () => {
|
|
1251
|
+
if (status === "ready") return;
|
|
1252
|
+
await initialize();
|
|
1253
|
+
};
|
|
1254
|
+
const listTools = async () => {
|
|
1255
|
+
await ensureReady();
|
|
1256
|
+
const tools = [];
|
|
1257
|
+
let cursor;
|
|
1258
|
+
let pages = 0;
|
|
1259
|
+
for (; ; ) {
|
|
1260
|
+
pages += 1;
|
|
1261
|
+
const result = await request("tools/list", cursor === void 0 ? {} : { cursor }, requestTimeoutMs);
|
|
1262
|
+
if (!isRecord4(result) || !Array.isArray(result.tools)) {
|
|
1263
|
+
throw new McpError("protocol", "tools/list result lacks a tools array");
|
|
1264
|
+
}
|
|
1265
|
+
for (const entry of result.tools) {
|
|
1266
|
+
if (tools.length >= MCP_TOOL_LIST_CAP) return { tools, truncated: true };
|
|
1267
|
+
const descriptor = parseToolDescriptor(entry);
|
|
1268
|
+
if (descriptor instanceof McpError) throw descriptor;
|
|
1269
|
+
tools.push(descriptor);
|
|
1270
|
+
}
|
|
1271
|
+
const next = typeof result.nextCursor === "string" && result.nextCursor.length > 0 ? result.nextCursor : void 0;
|
|
1272
|
+
if (next === void 0) return { tools, truncated: false };
|
|
1273
|
+
if (tools.length >= MCP_TOOL_LIST_CAP || pages >= MCP_TOOL_LIST_PAGE_CAP) return { tools, truncated: true };
|
|
1274
|
+
cursor = next;
|
|
1275
|
+
}
|
|
1276
|
+
};
|
|
1277
|
+
const callTool = async (name, args, callOptions = {}) => {
|
|
1278
|
+
await ensureReady();
|
|
1279
|
+
const timeoutMs = clampTimerDelayMs(callOptions.timeoutMs ?? requestTimeoutMs);
|
|
1280
|
+
const result = await request("tools/call", { name, arguments: args }, timeoutMs, callOptions.signal);
|
|
1281
|
+
const parsed = parseToolCallResult(result, maxResultTextBytes);
|
|
1282
|
+
if (parsed instanceof McpError) throw parsed;
|
|
1283
|
+
return parsed;
|
|
1284
|
+
};
|
|
1285
|
+
const close = () => {
|
|
1286
|
+
if (closePromise !== null) return closePromise;
|
|
1287
|
+
closePromise = (async () => {
|
|
1288
|
+
closing = true;
|
|
1289
|
+
if (status !== "failed") status = "closed";
|
|
1290
|
+
rejectAllPending(closedError());
|
|
1291
|
+
outbound.length = 0;
|
|
1292
|
+
outboundQueuedBytes = 0;
|
|
1293
|
+
if (child === null) {
|
|
1294
|
+
teardown ??= { complete: true };
|
|
1295
|
+
return teardown;
|
|
1296
|
+
}
|
|
1297
|
+
try {
|
|
1298
|
+
child.stdin?.end();
|
|
1299
|
+
} catch {
|
|
1300
|
+
}
|
|
1301
|
+
const outcome = await cleanupGroup();
|
|
1302
|
+
destroyStdio();
|
|
1303
|
+
return outcome;
|
|
1304
|
+
})();
|
|
1305
|
+
return closePromise;
|
|
1306
|
+
};
|
|
1307
|
+
if (options.signal !== void 0) {
|
|
1308
|
+
if (options.signal.aborted) void close();
|
|
1309
|
+
else options.signal.addEventListener("abort", () => void close(), { once: true });
|
|
1310
|
+
}
|
|
1311
|
+
return {
|
|
1312
|
+
id: spec.id,
|
|
1313
|
+
get pid() {
|
|
1314
|
+
return child?.pid;
|
|
1315
|
+
},
|
|
1316
|
+
initialize,
|
|
1317
|
+
listTools,
|
|
1318
|
+
callTool,
|
|
1319
|
+
close,
|
|
1320
|
+
killOwnedOnExit: () => {
|
|
1321
|
+
if (groupOwned()) signalGroup("SIGKILL");
|
|
1322
|
+
},
|
|
1323
|
+
state: () => {
|
|
1324
|
+
const cleanup = { cleanupIncomplete: teardown?.complete === false, teardown };
|
|
1325
|
+
return status === "failed" ? { status, reason: failure?.message ?? `mcp server ${spec.id} failed`, ...cleanup } : { status, ...cleanup };
|
|
1326
|
+
},
|
|
1327
|
+
serverInfo: () => info,
|
|
1328
|
+
toolsChanged: () => toolsChangedFlag,
|
|
1329
|
+
acknowledgeToolsChanged: () => {
|
|
1330
|
+
toolsChangedFlag = false;
|
|
1331
|
+
},
|
|
1332
|
+
notificationCount: () => notifications,
|
|
1333
|
+
stderrTail: () => stderrTailBuffer.toString("utf8")
|
|
1334
|
+
};
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
export {
|
|
1338
|
+
McpError,
|
|
1339
|
+
DEFAULT_KILL_GRACE_MS,
|
|
1340
|
+
DEFAULT_TEARDOWN_BOUND_MS,
|
|
1341
|
+
createMcpStdioClient,
|
|
1342
|
+
MCP_TRUST_ACTION_CLASSES,
|
|
1343
|
+
resolveMcpServers,
|
|
1344
|
+
trustMcpServer,
|
|
1345
|
+
untrustMcpServer
|
|
1346
|
+
};
|
|
1347
|
+
//# sourceMappingURL=chunk-55RMDDFM.js.map
|