@ai-projector/ide 0.0.0-stage → 0.11.1
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/LICENSE +21 -0
- package/README.md +35 -2
- package/bin/install-desktop +17 -0
- package/bin/install-desktop.cmd +11 -0
- package/bin/projector +22 -0
- package/bin/projector.cmd +11 -0
- package/dist/assets/CodeViewer--WUSmn5i.css +1 -0
- package/dist/assets/CodeViewer-C-C3aibO.js +1 -0
- package/dist/assets/DiscussionView-Cd3exhWx.css +1 -0
- package/dist/assets/DiscussionView-K3YyWE-E.js +2 -0
- package/dist/assets/EditorSettings-DlzJc8cp.js +13 -0
- package/dist/assets/EditorSettings-jSngmpPq.css +1 -0
- package/dist/assets/HtmlViewer-DULKK0_6.js +2 -0
- package/dist/assets/HtmlViewer-XHn9rACG.css +1 -0
- package/dist/assets/ImageViewport-BT_ftU4z.js +1 -0
- package/dist/assets/ImageViewport-JcG9P4B6.css +1 -0
- package/dist/assets/IssueView-ChJFmrTW.js +1 -0
- package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/assets/MarkdownViewer-C646XbYf.css +1 -0
- package/dist/assets/MarkdownViewer-Dm2MVp3X.js +2 -0
- package/dist/assets/PullRequestView-Cipn5P0H.js +3 -0
- package/dist/assets/PullRequestView-CzZn9mOg.css +1 -0
- package/dist/assets/ReleaseView-Cz6dH4ej.js +2 -0
- package/dist/assets/ReleaseView-VLO9NVfI.css +1 -0
- package/dist/assets/SplitPanes-0-UT7ksm.css +1 -0
- package/dist/assets/SplitPanes-DNDTWIta.js +1 -0
- package/dist/assets/SvgViewer-DP6-1_fw.css +1 -0
- package/dist/assets/SvgViewer-DkoULP8F.js +2 -0
- package/dist/assets/TerminalView-C30_q784.css +1 -0
- package/dist/assets/TerminalView-fWmIbnZn.js +16 -0
- package/dist/assets/TrackerDetail-CBaLycQg.css +1 -0
- package/dist/assets/TrackerDetail-DuzfEwSZ.js +1 -0
- package/dist/assets/UiButton-AkN01P3P.css +1 -0
- package/dist/assets/UiButton-DvucBdmd.js +2 -0
- package/dist/assets/UiPanel-BUDYIo-h.css +1 -0
- package/dist/assets/UiPanel-DtI4DFYT.js +1 -0
- package/dist/assets/UiViewerPage-CMFEzZ2i.css +1 -0
- package/dist/assets/UiViewerPage-aHNgiSjO.js +2 -0
- package/dist/assets/VisualMarkdownEditor-1DNSAYyq.css +1 -0
- package/dist/assets/VisualMarkdownEditor-BHx2olWh.js +1070 -0
- package/dist/assets/_plugin-vue_export-helper-D62Ebo7D.js +3 -0
- package/dist/assets/apl-gfMMiTNf.js +1 -0
- package/dist/assets/asciiarmor-C_eisQCp.js +1 -0
- package/dist/assets/asn1-DCl_8MCW.js +1 -0
- package/dist/assets/asterisk-BEn0Cwpx.js +1 -0
- package/dist/assets/brainfuck-D5EjA2JK.js +1 -0
- package/dist/assets/clike-xvONpD0Z.js +1 -0
- package/dist/assets/clojure-BflJGmDX.js +1 -0
- package/dist/assets/cmake-84nbDH0I.js +1 -0
- package/dist/assets/cobol-DHLQUbN7.js +1 -0
- package/dist/assets/coffeescript-De_zI4J0.js +1 -0
- package/dist/assets/commonlisp-DgAKBe0r.js +1 -0
- package/dist/assets/compiler-dom.esm-bundler-C5a_rSi1.js +9 -0
- package/dist/assets/crystal-Bl6YKCG_.js +1 -0
- package/dist/assets/css-CnaYoQib.js +1 -0
- package/dist/assets/cypher-p9eYesGn.js +1 -0
- package/dist/assets/d-DWkQyNnU.js +1 -0
- package/dist/assets/diff-ChtP43wD.js +1 -0
- package/dist/assets/dist-23D313r2.js +13 -0
- package/dist/assets/dist-9YLT-RM-.js +11 -0
- package/dist/assets/dist-9guQ6tUS.js +1 -0
- package/dist/assets/dist-BA_HKdx1.js +2 -0
- package/dist/assets/dist-BMX-4S0G.js +1 -0
- package/dist/assets/dist-BQmIGtmd.js +6 -0
- package/dist/assets/dist-BVEl6uFx.js +1 -0
- package/dist/assets/dist-BuiJgwGF.js +9 -0
- package/dist/assets/dist-Bzl1vuDO.js +1 -0
- package/dist/assets/dist-C1mn-4rn.js +1 -0
- package/dist/assets/dist-CG79NjMk.js +1 -0
- package/dist/assets/dist-CRLdLpSX.js +2 -0
- package/dist/assets/dist-Coak6JQD.js +1 -0
- package/dist/assets/dist-CpgyHBvu.js +1 -0
- package/dist/assets/dist-CrRIwgTS.js +1 -0
- package/dist/assets/dist-Cu_4z-jQ.js +1 -0
- package/dist/assets/dist-CxoUUhWx.js +1 -0
- package/dist/assets/dist-CzOhSFRQ.js +1 -0
- package/dist/assets/dist-DN5Y0OA5.js +1 -0
- package/dist/assets/dist-Dqsd8MyB.js +1 -0
- package/dist/assets/dist-Dvv0YQ-H.js +23 -0
- package/dist/assets/dist-DzoDV6Eh.js +2 -0
- package/dist/assets/dist-NMUsQt1c.js +1 -0
- package/dist/assets/dist-ZRLBgDFY.js +1 -0
- package/dist/assets/dist-cLGxPfRN.js +1 -0
- package/dist/assets/dist-p1Xy77w3.js +1 -0
- package/dist/assets/dockerfile-DJkHQgkl.js +1 -0
- package/dist/assets/dtd-DTF72YNO.js +1 -0
- package/dist/assets/dylan-S7ucR4pR.js +1 -0
- package/dist/assets/ebnf-D4c0_ac3.js +1 -0
- package/dist/assets/ecl-BVIeWmwY.js +1 -0
- package/dist/assets/editor-theme-ClBxXjSu.js +1 -0
- package/dist/assets/eiffel-BEjRio4Q.js +1 -0
- package/dist/assets/elm-Cshzl8qu.js +1 -0
- package/dist/assets/erlang-BV0c4Hdn.js +1 -0
- package/dist/assets/events.worker-C2Opu9Sc.js +1 -0
- package/dist/assets/external-link-lkcxItwM.js +1 -0
- package/dist/assets/factor-LKH5gN8L.js +1 -0
- package/dist/assets/fcl-ClOhbFR7.js +1 -0
- package/dist/assets/forth-D6RzAl64.js +1 -0
- package/dist/assets/fortran-Bt6PBEDR.js +1 -0
- package/dist/assets/gas-BHEdbvp9.js +1 -0
- package/dist/assets/gherkin-oBAE_ms0.js +1 -0
- package/dist/assets/github-emoji-CXJ5RSZS.js +169 -0
- package/dist/assets/github-emoji-D8dkjuM_.css +1 -0
- package/dist/assets/groovy-CUrWKPia.js +1 -0
- package/dist/assets/haskell-BRsoo5mP.js +1 -0
- package/dist/assets/haxe-DjVOVvNP.js +1 -0
- package/dist/assets/http-CLVgA2GD.js +1 -0
- package/dist/assets/hub-DfPcTPCC.js +1 -0
- package/dist/assets/idl-BUZw3wgd.js +1 -0
- package/dist/assets/javascript-lS2r2ifg.js +1 -0
- package/dist/assets/julia-CQfgDRfP.js +1 -0
- package/dist/assets/livescript-BXxG0Yva.js +1 -0
- package/dist/assets/lua-DPCEkfD_.js +1 -0
- package/dist/assets/main-JoBAi6ol.css +1 -0
- package/dist/assets/main-iz4ud0jC.js +178 -0
- package/dist/assets/mathematica-u8YMmbU0.js +1 -0
- package/dist/assets/mbox-BEMVcqjs.js +1 -0
- package/dist/assets/mirc-C9zpzAZU.js +1 -0
- package/dist/assets/mllike-B45xgp2S.js +1 -0
- package/dist/assets/modelica-CqHI_q-D.js +1 -0
- package/dist/assets/mscgen-qgSLujhx.js +1 -0
- package/dist/assets/mumps-BSzj6Xyz.js +1 -0
- package/dist/assets/nginx-C-ORUuei.js +1 -0
- package/dist/assets/nsis-viPvXFiq.js +1 -0
- package/dist/assets/ntriples-CzMBulkp.js +1 -0
- package/dist/assets/octave-D2Q8cUp1.js +1 -0
- package/dist/assets/oz-BwTct_5T.js +1 -0
- package/dist/assets/pascal-Dp_KdFgX.js +1 -0
- package/dist/assets/perl-BkSkiI9m.js +1 -0
- package/dist/assets/pig-AF4Hwhju.js +1 -0
- package/dist/assets/powershell-D8WpQPaX.js +1 -0
- package/dist/assets/preload-helper-BLdHbfdN.js +1 -0
- package/dist/assets/properties-C357ku5U.js +1 -0
- package/dist/assets/protobuf-D1ij_kNL.js +1 -0
- package/dist/assets/pug-BqCHZ5xT.js +1 -0
- package/dist/assets/puppet-BZyAS7I4.js +1 -0
- package/dist/assets/python-B_1Jd8HM.js +1 -0
- package/dist/assets/q-B9NhS7L_.js +1 -0
- package/dist/assets/r-CxDmU1I4.js +1 -0
- package/dist/assets/rolldown-runtime-XKyaHtl9.js +1 -0
- package/dist/assets/rpm-gpDK5sbt.js +1 -0
- package/dist/assets/ruby-ChfNwlCY.js +1 -0
- package/dist/assets/sas-C2OyD2Y6.js +1 -0
- package/dist/assets/scheme-D9qYN0V5.js +1 -0
- package/dist/assets/shared.esm-bundler-DoSbGLUP.js +2 -0
- package/dist/assets/shared.worker-DpKROrNH.js +1 -0
- package/dist/assets/shell-DwuoZtxw.js +1 -0
- package/dist/assets/sieve-tLWDfEkZ.js +1 -0
- package/dist/assets/simple-mode-DXiLM1-G.js +1 -0
- package/dist/assets/smalltalk-BLp5-jwC.js +1 -0
- package/dist/assets/solr-B78wSQJQ.js +1 -0
- package/dist/assets/sparql-Dz-mlCAC.js +1 -0
- package/dist/assets/spreadsheet-CTIncYxj.js +1 -0
- package/dist/assets/sql-DuQMFDvy.js +1 -0
- package/dist/assets/stex-DNzd62Q_.js +1 -0
- package/dist/assets/styles-CCXo2OoQ.css +1 -0
- package/dist/assets/styles-DZDDPlL3.js +1 -0
- package/dist/assets/stylus-BOVgKnng.js +1 -0
- package/dist/assets/swift-DKB6_1j6.js +1 -0
- package/dist/assets/tcl-BGfruO1u.js +1 -0
- package/dist/assets/textile-C4jVoHG1.js +1 -0
- package/dist/assets/tiddlywiki-VlUiK86J.js +1 -0
- package/dist/assets/tiki-CvUEFusT.js +1 -0
- package/dist/assets/toml-BPTmHmyx.js +1 -0
- package/dist/assets/troff-C2dAgh7P.js +1 -0
- package/dist/assets/ttcn-PPSTk1ow.js +1 -0
- package/dist/assets/ttcn-cfg-2b4Gb5sE.js +1 -0
- package/dist/assets/turtle-Cx3rYX2g.js +1 -0
- package/dist/assets/vb-BthdM_4N.js +1 -0
- package/dist/assets/vbscript-D9f6rSsU.js +1 -0
- package/dist/assets/velocity-CqftRsjg.js +1 -0
- package/dist/assets/verilog-CjI9Y6RI.js +1 -0
- package/dist/assets/vhdl-kS471soi.js +1 -0
- package/dist/assets/webidl-D5jiJvOU.js +1 -0
- package/dist/assets/xquery-BKJx4mf9.js +1 -0
- package/dist/assets/yacas-CXXgtw0p.js +1 -0
- package/dist/assets/z80-Co3PbHdE.js +1 -0
- package/dist/favicon.svg +5 -0
- package/dist/file-icons/LICENSE-lucide.txt +43 -0
- package/dist/file-icons/NOTICE.md +8 -0
- package/dist/file-icons/icons/archive.svg +1 -0
- package/dist/file-icons/icons/assets.svg +1 -0
- package/dist/file-icons/icons/audio.svg +1 -0
- package/dist/file-icons/icons/c.svg +1 -0
- package/dist/file-icons/icons/components.svg +1 -0
- package/dist/file-icons/icons/config.svg +1 -0
- package/dist/file-icons/icons/cpp.svg +1 -0
- package/dist/file-icons/icons/css.svg +1 -0
- package/dist/file-icons/icons/database.svg +1 -0
- package/dist/file-icons/icons/docker.svg +1 -0
- package/dist/file-icons/icons/env.svg +1 -0
- package/dist/file-icons/icons/executable.svg +1 -0
- package/dist/file-icons/icons/file.svg +1 -0
- package/dist/file-icons/icons/folder-open.svg +1 -0
- package/dist/file-icons/icons/folder.svg +1 -0
- package/dist/file-icons/icons/font.svg +1 -0
- package/dist/file-icons/icons/git.svg +1 -0
- package/dist/file-icons/icons/go.svg +1 -0
- package/dist/file-icons/icons/graphql.svg +1 -0
- package/dist/file-icons/icons/html.svg +1 -0
- package/dist/file-icons/icons/ignore.svg +1 -0
- package/dist/file-icons/icons/image.svg +1 -0
- package/dist/file-icons/icons/java.svg +1 -0
- package/dist/file-icons/icons/javascript.svg +1 -0
- package/dist/file-icons/icons/json.svg +1 -0
- package/dist/file-icons/icons/kotlin.svg +1 -0
- package/dist/file-icons/icons/license.svg +1 -0
- package/dist/file-icons/icons/lock.svg +1 -0
- package/dist/file-icons/icons/markdown.svg +1 -0
- package/dist/file-icons/icons/package.svg +1 -0
- package/dist/file-icons/icons/php.svg +1 -0
- package/dist/file-icons/icons/python.svg +1 -0
- package/dist/file-icons/icons/react.svg +1 -0
- package/dist/file-icons/icons/ruby.svg +1 -0
- package/dist/file-icons/icons/rust.svg +1 -0
- package/dist/file-icons/icons/sass.svg +1 -0
- package/dist/file-icons/icons/shell.svg +1 -0
- package/dist/file-icons/icons/source.svg +1 -0
- package/dist/file-icons/icons/svelte.svg +1 -0
- package/dist/file-icons/icons/swift.svg +1 -0
- package/dist/file-icons/icons/tests.svg +1 -0
- package/dist/file-icons/icons/toml.svg +1 -0
- package/dist/file-icons/icons/typescript.svg +1 -0
- package/dist/file-icons/icons/video.svg +1 -0
- package/dist/file-icons/icons/vite.svg +1 -0
- package/dist/file-icons/icons/vue.svg +1 -0
- package/dist/file-icons/icons/yaml.svg +1 -0
- package/dist/file-icons/theme.json +572 -0
- package/dist/file-icons/theme.schema.json +137 -0
- package/dist/github.svg +1 -0
- package/dist/gitlab.svg +1 -0
- package/dist/hub.html +21 -0
- package/dist/icons/apple-touch-icon.png +0 -0
- package/dist/icons/icon-192.png +0 -0
- package/dist/icons/icon-512.png +0 -0
- package/dist/icons/maskable-512.png +0 -0
- package/dist/index.html +42 -0
- package/dist/manifest.webmanifest +37 -0
- package/dist/sw.js +81 -0
- package/package.json +62 -4
- package/packages/cli/app/agent-host.js +163 -0
- package/packages/cli/app/desktop.js +77 -0
- package/packages/cli/app/fix-node-pty.js +52 -0
- package/packages/cli/app/import-companion-key.js +57 -0
- package/packages/cli/app/install-desktop.js +4 -0
- package/packages/cli/app/launch.js +134 -0
- package/packages/cli/app/restart.js +32 -0
- package/packages/cli/commands/logs.js +10 -0
- package/packages/cli/commands/open.js +49 -0
- package/packages/cli/commands/projects.js +18 -0
- package/packages/cli/commands/run.js +39 -0
- package/packages/cli/commands/search.js +19 -0
- package/packages/cli/commands/server.js +32 -0
- package/packages/cli/commands/status.js +42 -0
- package/packages/cli/common/output.js +13 -0
- package/packages/cli/modules/api/index.js +60 -0
- package/packages/cli/modules/arguments/index.js +188 -0
- package/packages/cli/modules/command-runtime/index.js +24 -0
- package/packages/cli/modules/projects/index.js +118 -0
- package/packages/cli/modules/server/index.js +226 -0
- package/packages/cli/modules/server-process/index.js +204 -0
- package/packages/core/modules/agent-features/index.js +8 -0
- package/packages/core/modules/agent-judge/index.js +73 -0
- package/packages/core/modules/agent-read/index.js +25 -0
- package/packages/core/modules/agent-role/index.js +187 -0
- package/packages/core/modules/agent-task/contract.js +34 -0
- package/packages/core/modules/agent-task/index.js +1 -0
- package/packages/core/modules/agent-widgets/bars/index.js +11 -0
- package/packages/core/modules/agent-widgets/button/index.js +19 -0
- package/packages/core/modules/agent-widgets/card/index.js +13 -0
- package/packages/core/modules/agent-widgets/checks/index.js +19 -0
- package/packages/core/modules/agent-widgets/chips/index.js +15 -0
- package/packages/core/modules/agent-widgets/columns/index.js +12 -0
- package/packages/core/modules/agent-widgets/donut/index.js +11 -0
- package/packages/core/modules/agent-widgets/field/index.js +39 -0
- package/packages/core/modules/agent-widgets/form/index.js +18 -0
- package/packages/core/modules/agent-widgets/git-info/index.js +29 -0
- package/packages/core/modules/agent-widgets/image/index.js +22 -0
- package/packages/core/modules/agent-widgets/inline-icon/index.js +45 -0
- package/packages/core/modules/agent-widgets/input/index.js +16 -0
- package/packages/core/modules/agent-widgets/intelligent-form/index.js +32 -0
- package/packages/core/modules/agent-widgets/line/index.js +12 -0
- package/packages/core/modules/agent-widgets/row/index.js +11 -0
- package/packages/core/modules/agent-widgets/safe-secret-show/index.js +21 -0
- package/packages/core/modules/agent-widgets/slider/index.js +18 -0
- package/packages/core/modules/agent-widgets/stat/index.js +16 -0
- package/packages/core/modules/agent-widgets/steps/index.js +14 -0
- package/packages/core/modules/agent-widgets/tab/index.js +12 -0
- package/packages/core/modules/agent-widgets/tabs/index.js +24 -0
- package/packages/core/modules/agents-integration/claude/index.js +1 -0
- package/packages/core/modules/agents-integration/codex/index.js +1 -0
- package/packages/core/modules/agents-integration/cursor/index.js +1 -0
- package/packages/core/modules/agents-integration/kimi/index.js +1 -0
- package/packages/core/modules/agents-integration/opencode/index.js +1 -0
- package/packages/core/modules/app-paths/index.js +14 -0
- package/packages/core/modules/app-paths/logs.js +194 -0
- package/packages/core/modules/app-paths/network-mode.js +24 -0
- package/packages/core/modules/app-paths/paths.js +40 -0
- package/packages/core/modules/app-paths/server-mode.js +18 -0
- package/packages/core/modules/appearance/index.js +35 -0
- package/packages/core/modules/browser/index.js +86 -0
- package/packages/core/modules/devcontainer/classify.js +101 -0
- package/packages/core/modules/devcontainer/contract.js +1 -0
- package/packages/core/modules/devcontainer/index.js +1 -0
- package/packages/core/modules/directories/contract.js +1 -0
- package/packages/core/modules/directories/index.js +1 -0
- package/packages/core/modules/docker/contract.js +1 -0
- package/packages/core/modules/docker/index.js +1 -0
- package/packages/core/modules/editor-themes/index.js +17 -0
- package/packages/core/modules/environment/index.js +1 -0
- package/packages/core/modules/file-icons/contract.js +177 -0
- package/packages/core/modules/file-icons/index.js +1 -0
- package/packages/core/modules/github/index.js +23 -0
- package/packages/core/modules/gitlab/index.js +164 -0
- package/packages/core/modules/hub/index.js +1 -0
- package/packages/core/modules/hub/protocol.js +19 -0
- package/packages/core/modules/ide/agent-command.js +48 -0
- package/packages/core/modules/ide/command-help.js +73 -0
- package/packages/core/modules/ide/commands.js +191 -0
- package/packages/core/modules/ide/index.js +6 -0
- package/packages/core/modules/ide/keybinding-editor.js +34 -0
- package/packages/core/modules/ide/keybindings.js +45 -0
- package/packages/core/modules/ide/palette.js +33 -0
- package/packages/core/modules/ide/safety.js +10 -0
- package/packages/core/modules/launcher/actions.js +5 -0
- package/packages/core/modules/launcher/index.js +5 -0
- package/packages/core/modules/launcher/launcher-model.js +236 -0
- package/packages/core/modules/launcher/launcher.js +76 -0
- package/packages/core/modules/launcher/query.js +42 -0
- package/packages/core/modules/network-mode/index.js +3 -0
- package/packages/core/modules/network-mode/network-mode.js +8 -0
- package/packages/core/modules/os/bash.js +11 -0
- package/packages/core/modules/os/contract.js +1 -0
- package/packages/core/modules/os/index.js +3 -0
- package/packages/core/modules/os/modules/darwin/catalog.js +108 -0
- package/packages/core/modules/os/modules/darwin/directories.js +40 -0
- package/packages/core/modules/os/modules/darwin/docker.js +15 -0
- package/packages/core/modules/os/modules/darwin/gtk.js +6 -0
- package/packages/core/modules/os/modules/darwin/helper.swift +172 -0
- package/packages/core/modules/os/modules/darwin/index.js +12 -0
- package/packages/core/modules/os/modules/darwin/install-desktop.js +135 -0
- package/packages/core/modules/os/modules/darwin/processes.js +97 -0
- package/packages/core/modules/os/modules/darwin/resident.js +235 -0
- package/packages/core/modules/os/modules/darwin/secrets.js +53 -0
- package/packages/core/modules/os/modules/darwin/shell.js +105 -0
- package/packages/core/modules/os/modules/darwin/shortcut.js +61 -0
- package/packages/core/modules/os/modules/darwin/tools.js +52 -0
- package/packages/core/modules/os/modules/darwin/windows.js +135 -0
- package/packages/core/modules/os/modules/linux/bus.js +48 -0
- package/packages/core/modules/os/modules/linux/catalog.js +47 -0
- package/packages/core/modules/os/modules/linux/directories.js +49 -0
- package/packages/core/modules/os/modules/linux/docker.js +48 -0
- package/packages/core/modules/os/modules/linux/index.js +53 -0
- package/packages/core/modules/os/modules/linux/install-desktop.js +66 -0
- package/packages/core/modules/os/modules/linux/processes.js +85 -0
- package/packages/core/modules/os/modules/linux/resident.js +139 -0
- package/packages/core/modules/os/modules/linux/secrets.js +118 -0
- package/packages/core/modules/os/modules/linux/shortcut.js +124 -0
- package/packages/core/modules/os/modules/linux/tools.js +14 -0
- package/packages/core/modules/os/modules/linux/tray.js +190 -0
- package/packages/core/modules/os/modules/linux/windows.js +187 -0
- package/packages/core/modules/os/modules/windows/agent-process.js +60 -0
- package/packages/core/modules/os/modules/windows/alert.js +20 -0
- package/packages/core/modules/os/modules/windows/catalog.js +91 -0
- package/packages/core/modules/os/modules/windows/color-scheme.js +26 -0
- package/packages/core/modules/os/modules/windows/directories.js +101 -0
- package/packages/core/modules/os/modules/windows/docker.js +17 -0
- package/packages/core/modules/os/modules/windows/git.js +42 -0
- package/packages/core/modules/os/modules/windows/hwnd.js +275 -0
- package/packages/core/modules/os/modules/windows/index.js +28 -0
- package/packages/core/modules/os/modules/windows/install-desktop.js +140 -0
- package/packages/core/modules/os/modules/windows/kill-tree.js +26 -0
- package/packages/core/modules/os/modules/windows/processes.js +300 -0
- package/packages/core/modules/os/modules/windows/ps.js +73 -0
- package/packages/core/modules/os/modules/windows/resident-pipe.js +206 -0
- package/packages/core/modules/os/modules/windows/resident.js +286 -0
- package/packages/core/modules/os/modules/windows/secrets.js +110 -0
- package/packages/core/modules/os/modules/windows/shell.js +288 -0
- package/packages/core/modules/os/modules/windows/shortcut.js +82 -0
- package/packages/core/modules/os/modules/windows/tools.js +273 -0
- package/packages/core/modules/os/modules/windows/windows.js +133 -0
- package/packages/core/modules/os/os.js +175 -0
- package/packages/core/modules/os/session-env.js +11 -0
- package/packages/core/modules/os-posix/agent-process.js +105 -0
- package/packages/core/modules/os-posix/contract.js +1 -0
- package/packages/core/modules/os-posix/git.js +26 -0
- package/packages/core/modules/os-posix/index.js +4 -0
- package/packages/core/modules/os-posix/tools.js +258 -0
- package/packages/core/modules/os-posix/xdg.js +8 -0
- package/packages/core/modules/project/contract.js +1 -0
- package/packages/core/modules/project/index.js +1 -0
- package/packages/core/modules/project/ref.js +126 -0
- package/packages/core/modules/server-mode/index.js +3 -0
- package/packages/core/modules/server-mode/server-mode.js +13 -0
- package/packages/core/modules/terminal/contract.js +1 -0
- package/packages/core/modules/terminal/index.js +1 -0
- package/packages/core/modules/usage-analytics/index.js +80 -0
- package/packages/core/modules/widget-catalog/guide.js +76 -0
- package/packages/core/modules/widget-catalog/index.js +219 -0
- package/packages/core/modules/workspace/changes.js +114 -0
- package/packages/core/modules/workspace/contract.js +1 -0
- package/packages/core/modules/workspace/file-size.js +12 -0
- package/packages/core/modules/workspace/files-exclude.js +119 -0
- package/packages/core/modules/workspace/git-decorations.js +4 -0
- package/packages/core/modules/workspace/git-graph.js +35 -0
- package/packages/core/modules/workspace/index.js +11 -0
- package/packages/core/modules/workspace/paths.js +16 -0
- package/packages/core/modules/workspace/pipeline-status.js +86 -0
- package/packages/core/modules/workspace/pull-requests.js +1 -0
- package/packages/core/modules/workspace/pull-status.js +56 -0
- package/packages/core/modules/workspace/scope.js +34 -0
- package/packages/core/modules/workspace/search.js +28 -0
- package/packages/core/modules/workspace/tree-page.js +25 -0
- package/packages/server/app/agents.js +30 -0
- package/packages/server/app/api.js +159 -0
- package/packages/server/app/claude-runner.js +17 -0
- package/packages/server/app/dev-plugin.js +76 -0
- package/packages/server/app/dev-runtime.js +119 -0
- package/packages/server/app/features.js +35 -0
- package/packages/server/app/plugin.js +140 -0
- package/packages/server/app/projector-runner.js +15 -0
- package/packages/server/app/runtime-contract.js +1 -0
- package/packages/server/app/standalone.js +42 -0
- package/packages/server/app/static.js +57 -0
- package/packages/server/app/widgets-mcp.js +36 -0
- package/packages/server/app/widgets.js +54 -0
- package/packages/server/middlewares/local-origin.js +4 -0
- package/packages/server/modules/access/access.js +118 -0
- package/packages/server/modules/access/connections.js +36 -0
- package/packages/server/modules/access/http.js +93 -0
- package/packages/server/modules/access/hub.js +19 -0
- package/packages/server/modules/access/index.js +6 -0
- package/packages/server/modules/access/lan-url.js +21 -0
- package/packages/server/modules/access/password.js +68 -0
- package/packages/server/modules/access/session.js +38 -0
- package/packages/server/modules/agent/agent-host.js +46 -0
- package/packages/server/modules/agent/agent-runs.js +162 -0
- package/packages/server/modules/agent/attachments.js +88 -0
- package/packages/server/modules/agent/backend.js +1 -0
- package/packages/server/modules/agent/chat-archive.js +67 -0
- package/packages/server/modules/agent/command-bridge.js +94 -0
- package/packages/server/modules/agent/controls.js +10 -0
- package/packages/server/modules/agent/event-streams.js +40 -0
- package/packages/server/modules/agent/history-store.js +320 -0
- package/packages/server/modules/agent/history.js +160 -0
- package/packages/server/modules/agent/hosted-process.js +279 -0
- package/packages/server/modules/agent/hosted-run.js +85 -0
- package/packages/server/modules/agent/hosted-runner.js +126 -0
- package/packages/server/modules/agent/index.js +35 -0
- package/packages/server/modules/agent/injection.js +14 -0
- package/packages/server/modules/agent/jobs-diff.js +114 -0
- package/packages/server/modules/agent/jobs-files.js +65 -0
- package/packages/server/modules/agent/jobs-followup.js +66 -0
- package/packages/server/modules/agent/jobs-live.js +180 -0
- package/packages/server/modules/agent/jobs-store.js +59 -0
- package/packages/server/modules/agent/jobs-worktree.js +161 -0
- package/packages/server/modules/agent/jobs.js +316 -0
- package/packages/server/modules/agent/judge-store.js +21 -0
- package/packages/server/modules/agent/lens-request.js +34 -0
- package/packages/server/modules/agent/queue-store.js +21 -0
- package/packages/server/modules/agent/recent-chats.js +63 -0
- package/packages/server/modules/agent/registry.js +108 -0
- package/packages/server/modules/agent/replay.js +84 -0
- package/packages/server/modules/agent/request.js +132 -0
- package/packages/server/modules/agent/role-store.js +21 -0
- package/packages/server/modules/agent/run-hub.js +105 -0
- package/packages/server/modules/agent/run-request.js +208 -0
- package/packages/server/modules/agent/secret-show.js +108 -0
- package/packages/server/modules/agent/side-request.js +142 -0
- package/packages/server/modules/agent/usage-history.js +62 -0
- package/packages/server/modules/agent/worktrees.js +136 -0
- package/packages/server/modules/agent-features/catalog.js +18 -0
- package/packages/server/modules/agent-features/index.js +2 -0
- package/packages/server/modules/agent-features/store.js +172 -0
- package/packages/server/modules/agent-mcp/index.js +106 -0
- package/packages/server/modules/agent-roles/index.js +3 -0
- package/packages/server/modules/agent-roles/project.js +231 -0
- package/packages/server/modules/agent-roles/runtime.js +68 -0
- package/packages/server/modules/agent-roles/store.js +190 -0
- package/packages/server/modules/agents/acp/acp-backend.js +320 -0
- package/packages/server/modules/agents/acp/acp-client.js +153 -0
- package/packages/server/modules/agents/acp/acp-controls.js +179 -0
- package/packages/server/modules/agents/acp/acp-dialect.js +82 -0
- package/packages/server/modules/agents/acp/acp-elicitation.js +135 -0
- package/packages/server/modules/agents/acp/acp-events.js +340 -0
- package/packages/server/modules/agents/acp/acp-process.js +78 -0
- package/packages/server/modules/agents/acp/acp-programs.js +11 -0
- package/packages/server/modules/agents/acp/acp-tools.js +208 -0
- package/packages/server/modules/agents/acp/index.js +4 -0
- package/packages/server/modules/agents/acp/mcp-config.js +100 -0
- package/packages/server/modules/agents/claude-code/claude-code-backend.js +342 -0
- package/packages/server/modules/agents/claude-code/claude-code-checkpoints.js +97 -0
- package/packages/server/modules/agents/claude-code/claude-code-env.js +46 -0
- package/packages/server/modules/agents/claude-code/claude-code-events.js +299 -0
- package/packages/server/modules/agents/claude-code/claude-code-input.js +97 -0
- package/packages/server/modules/agents/claude-code/claude-code-replay.js +71 -0
- package/packages/server/modules/agents/claude-code/claude-code-sessions.js +207 -0
- package/packages/server/modules/agents/claude-code/claude-code-times.js +42 -0
- package/packages/server/modules/agents/claude-code/index.js +2 -0
- package/packages/server/modules/agents/claude-code/questions.js +51 -0
- package/packages/server/modules/agents/codex/dialect.js +130 -0
- package/packages/server/modules/agents/codex/forms.js +24 -0
- package/packages/server/modules/agents/codex/index.js +17 -0
- package/packages/server/modules/agents/cursor/dialect.js +66 -0
- package/packages/server/modules/agents/cursor/images.js +12 -0
- package/packages/server/modules/agents/cursor/index.js +30 -0
- package/packages/server/modules/agents/cursor/plan.js +44 -0
- package/packages/server/modules/agents/cursor/questions.js +37 -0
- package/packages/server/modules/agents/cursor/selection.js +29 -0
- package/packages/server/modules/agents/cursor/task.js +32 -0
- package/packages/server/modules/agents/cursor/todos.js +69 -0
- package/packages/server/modules/agents/ide-mcp/config.js +40 -0
- package/packages/server/modules/agents/ide-mcp/index.js +1 -0
- package/packages/server/modules/agents/ide-mcp/server.js +154 -0
- package/packages/server/modules/agents/kimi/dialect.js +18 -0
- package/packages/server/modules/agents/kimi/index.js +11 -0
- package/packages/server/modules/agents/opencode/dialect.js +232 -0
- package/packages/server/modules/agents/opencode/index.js +21 -0
- package/packages/server/modules/agents/opencode/read.js +46 -0
- package/packages/server/modules/agents/opencode/sessions.js +69 -0
- package/packages/server/modules/agents/projector/agent-lens.js +110 -0
- package/packages/server/modules/agents/projector/agent-tools.js +290 -0
- package/packages/server/modules/agents/projector/answer-doctor.js +32 -0
- package/packages/server/modules/agents/projector/form-doctor.js +33 -0
- package/packages/server/modules/agents/projector/index.js +12 -0
- package/packages/server/modules/agents/projector/project-instructions.js +34 -0
- package/packages/server/modules/agents/projector/projector-backend.js +350 -0
- package/packages/server/modules/agents/projector/projector-budget.js +70 -0
- package/packages/server/modules/agents/projector/projector-compaction.js +128 -0
- package/packages/server/modules/agents/projector/projector-controls.js +70 -0
- package/packages/server/modules/agents/projector/projector-guard.js +196 -0
- package/packages/server/modules/agents/projector/projector-history.js +87 -0
- package/packages/server/modules/agents/projector/projector-hooks.js +201 -0
- package/packages/server/modules/agents/projector/projector-input.js +40 -0
- package/packages/server/modules/agents/projector/projector-mcp-config.js +1 -0
- package/packages/server/modules/agents/projector/projector-mcp.js +119 -0
- package/packages/server/modules/agents/projector/projector-memory.js +92 -0
- package/packages/server/modules/agents/projector/projector-retry.js +52 -0
- package/packages/server/modules/agents/projector/projector-review.js +40 -0
- package/packages/server/modules/agents/projector/projector-side.js +56 -0
- package/packages/server/modules/agents/projector/projector-skills.js +143 -0
- package/packages/server/modules/agents/projector/projector-task.js +235 -0
- package/packages/server/modules/agents/projector/projector-usage.js +19 -0
- package/packages/server/modules/agents/projector/projector-web-search.js +76 -0
- package/packages/server/modules/agents/projector/projector-web.js +172 -0
- package/packages/server/modules/agents/projector/prompts.js +46 -0
- package/packages/server/modules/agents/projector/secrets/secret-destination.js +226 -0
- package/packages/server/modules/agents/projector/secrets/secret-show.js +23 -0
- package/packages/server/modules/agents/projector/secrets/secret-tools.js +124 -0
- package/packages/server/modules/agents/projector/tool-spec.js +4 -0
- package/packages/server/modules/agents/projector/tool-specs.js +167 -0
- package/packages/server/modules/agents/projector/widgets.js +4 -0
- package/packages/server/modules/agents/widgets-mcp/config.js +34 -0
- package/packages/server/modules/agents/widgets-mcp/index.js +1 -0
- package/packages/server/modules/agents-integration/_/usage-cache.js +19 -0
- package/packages/server/modules/agents-integration/claude/client.js +33 -0
- package/packages/server/modules/agents-integration/claude/index.js +1 -0
- package/packages/server/modules/agents-integration/claude/usage.js +49 -0
- package/packages/server/modules/agents-integration/codex/cli.js +86 -0
- package/packages/server/modules/agents-integration/codex/index.js +1 -0
- package/packages/server/modules/agents-integration/codex/usage.js +45 -0
- package/packages/server/modules/agents-integration/cursor/client.js +40 -0
- package/packages/server/modules/agents-integration/cursor/credentials.js +34 -0
- package/packages/server/modules/agents-integration/cursor/index.js +1 -0
- package/packages/server/modules/agents-integration/cursor/usage.js +59 -0
- package/packages/server/modules/agents-integration/kimi/client.js +48 -0
- package/packages/server/modules/agents-integration/kimi/credential-config.js +167 -0
- package/packages/server/modules/agents-integration/kimi/credentials.js +261 -0
- package/packages/server/modules/agents-integration/kimi/index.js +1 -0
- package/packages/server/modules/agents-integration/kimi/usage.js +149 -0
- package/packages/server/modules/agents-integration/opencode/client.js +30 -0
- package/packages/server/modules/agents-integration/opencode/credentials.js +36 -0
- package/packages/server/modules/agents-integration/opencode/index.js +1 -0
- package/packages/server/modules/agents-integration/opencode/usage.js +47 -0
- package/packages/server/modules/appearance/index.js +38 -0
- package/packages/server/modules/browser/cookies.js +112 -0
- package/packages/server/modules/browser/guard.js +55 -0
- package/packages/server/modules/browser/index.js +2 -0
- package/packages/server/modules/browser/key.js +34 -0
- package/packages/server/modules/browser/proxy.js +255 -0
- package/packages/server/modules/browser/rewrite.js +82 -0
- package/packages/server/modules/devcontainer/discovery.js +85 -0
- package/packages/server/modules/devcontainer/exec.js +81 -0
- package/packages/server/modules/devcontainer/index.js +4 -0
- package/packages/server/modules/devcontainer/launch.js +51 -0
- package/packages/server/modules/devcontainer/state.js +68 -0
- package/packages/server/modules/devcontainer/trust.js +41 -0
- package/packages/server/modules/directories/directories.js +34 -0
- package/packages/server/modules/directories/index.js +1 -0
- package/packages/server/modules/docker/actions.js +121 -0
- package/packages/server/modules/docker/daemon.js +72 -0
- package/packages/server/modules/docker/index.js +4 -0
- package/packages/server/modules/docker/settings.js +127 -0
- package/packages/server/modules/docker/snapshot.js +105 -0
- package/packages/server/modules/environments/execution.js +125 -0
- package/packages/server/modules/environments/index.js +3 -0
- package/packages/server/modules/environments/reconcile.js +62 -0
- package/packages/server/modules/environments/settings.js +58 -0
- package/packages/server/modules/events/implementation.js +85 -0
- package/packages/server/modules/events/index.js +1 -0
- package/packages/server/modules/folder-picker/index.js +1 -0
- package/packages/server/modules/folder-picker/pick-folder.js +2 -0
- package/packages/server/modules/git-import/clone.js +47 -0
- package/packages/server/modules/git-import/container.js +57 -0
- package/packages/server/modules/git-import/import.js +82 -0
- package/packages/server/modules/git-import/index.js +4 -0
- package/packages/server/modules/git-import/jobs.js +68 -0
- package/packages/server/modules/github/api.js +260 -0
- package/packages/server/modules/github/browser.js +185 -0
- package/packages/server/modules/github/clone.js +55 -0
- package/packages/server/modules/github/container.js +15 -0
- package/packages/server/modules/github/discussions.js +141 -0
- package/packages/server/modules/github/emojis.js +14 -0
- package/packages/server/modules/github/history.js +205 -0
- package/packages/server/modules/github/index.js +11 -0
- package/packages/server/modules/github/issues.js +81 -0
- package/packages/server/modules/github/navigation.js +35 -0
- package/packages/server/modules/github/pipelines.js +266 -0
- package/packages/server/modules/github/pulls.js +111 -0
- package/packages/server/modules/github/releases.js +241 -0
- package/packages/server/modules/gitlab/api.js +257 -0
- package/packages/server/modules/gitlab/base.js +24 -0
- package/packages/server/modules/gitlab/blob-search.js +110 -0
- package/packages/server/modules/gitlab/browser.js +296 -0
- package/packages/server/modules/gitlab/clone.js +78 -0
- package/packages/server/modules/gitlab/compare.js +68 -0
- package/packages/server/modules/gitlab/connection.js +55 -0
- package/packages/server/modules/gitlab/container.js +15 -0
- package/packages/server/modules/gitlab/history.js +127 -0
- package/packages/server/modules/gitlab/icon.js +67 -0
- package/packages/server/modules/gitlab/index.js +14 -0
- package/packages/server/modules/gitlab/issues.js +61 -0
- package/packages/server/modules/gitlab/merge-requests.js +287 -0
- package/packages/server/modules/gitlab/navigation.js +187 -0
- package/packages/server/modules/gitlab/oauth.js +250 -0
- package/packages/server/modules/gitlab/pipelines.js +240 -0
- package/packages/server/modules/gitlab/releases.js +226 -0
- package/packages/server/modules/gitlab/search.js +75 -0
- package/packages/server/modules/gitlab/trackers.js +96 -0
- package/packages/server/modules/http/download.js +50 -0
- package/packages/server/modules/http/http.js +8 -0
- package/packages/server/modules/http/index.js +2 -0
- package/packages/server/modules/hub/connector.js +114 -0
- package/packages/server/modules/hub/hub.js +142 -0
- package/packages/server/modules/hub/index.js +1 -0
- package/packages/server/modules/ide/editor-settings.js +37 -0
- package/packages/server/modules/ide/index.js +3 -0
- package/packages/server/modules/ide/keybindings.js +37 -0
- package/packages/server/modules/ide/mcp-bridge.js +150 -0
- package/packages/server/modules/instance/index.js +2 -0
- package/packages/server/modules/instance/instance.js +50 -0
- package/packages/server/modules/integration-store/index.js +2 -0
- package/packages/server/modules/integration-store/list.js +12 -0
- package/packages/server/modules/integration-store/store.js +141 -0
- package/packages/server/modules/judge/approval.js +35 -0
- package/packages/server/modules/judge/index.js +3 -0
- package/packages/server/modules/judge/settings.js +35 -0
- package/packages/server/modules/judge/verdict.js +141 -0
- package/packages/server/modules/launcher/browse.js +29 -0
- package/packages/server/modules/launcher/folders.js +138 -0
- package/packages/server/modules/launcher/hosted-search.js +43 -0
- package/packages/server/modules/launcher/index.js +12 -0
- package/packages/server/modules/launcher/launcher.js +352 -0
- package/packages/server/modules/launcher/potential.js +70 -0
- package/packages/server/modules/launcher/project-entries.js +165 -0
- package/packages/server/modules/network/eu-context.js +29 -0
- package/packages/server/modules/network/index.js +1 -0
- package/packages/server/modules/openai-gateway/config.js +125 -0
- package/packages/server/modules/openai-gateway/gateway.js +178 -0
- package/packages/server/modules/openai-gateway/index.js +7 -0
- package/packages/server/modules/preferences/index.js +7 -0
- package/packages/server/modules/preferences/preferences.js +142 -0
- package/packages/server/modules/processes/index.js +6 -0
- package/packages/server/modules/processes/processes.js +174 -0
- package/packages/server/modules/project-presentation/implementation.js +130 -0
- package/packages/server/modules/project-presentation/index.js +1 -0
- package/packages/server/modules/project-widgets/index.js +210 -0
- package/packages/server/modules/projects/discovery.js +179 -0
- package/packages/server/modules/projects/favicon.js +180 -0
- package/packages/server/modules/projects/index.js +11 -0
- package/packages/server/modules/projects/inspect.js +148 -0
- package/packages/server/modules/projects/remote-icon.js +39 -0
- package/packages/server/modules/projects/store.js +41 -0
- package/packages/server/modules/projects/types.js +1 -0
- package/packages/server/modules/providers/atomic-file.js +29 -0
- package/packages/server/modules/providers/balance.js +125 -0
- package/packages/server/modules/providers/index.js +15 -0
- package/packages/server/modules/providers/kinds.js +24 -0
- package/packages/server/modules/providers/model-list.js +16 -0
- package/packages/server/modules/providers/models.js +124 -0
- package/packages/server/modules/providers/openai-client.js +40 -0
- package/packages/server/modules/providers/provider-seeds.js +39 -0
- package/packages/server/modules/providers/provider-store.js +317 -0
- package/packages/server/modules/providers/quiet-model.js +36 -0
- package/packages/server/modules/providers/secret-obfuscation.js +48 -0
- package/packages/server/modules/providers/thinking.js +105 -0
- package/packages/server/modules/providers/types.js +1 -0
- package/packages/server/modules/restart/index.js +1 -0
- package/packages/server/modules/restart/restart.js +56 -0
- package/packages/server/modules/secrets/index.js +1 -0
- package/packages/server/modules/secrets/vault.js +51 -0
- package/packages/server/modules/spend/index.js +2 -0
- package/packages/server/modules/spend/ledger.js +82 -0
- package/packages/server/modules/spend/store.js +92 -0
- package/packages/server/modules/terminal/drop-files.js +42 -0
- package/packages/server/modules/terminal/index.js +15 -0
- package/packages/server/modules/terminal/link-files.js +44 -0
- package/packages/server/modules/terminal/scenario-folder.js +20 -0
- package/packages/server/modules/terminal/session-state.js +85 -0
- package/packages/server/modules/terminal/socket.js +159 -0
- package/packages/server/modules/terminal/terminal-activity.js +56 -0
- package/packages/server/modules/terminal/terminal-file.js +32 -0
- package/packages/server/modules/terminal/terminal-mouse.js +29 -0
- package/packages/server/modules/terminal/terminal.js +308 -0
- package/packages/server/modules/terminal/terminate.js +68 -0
- package/packages/server/modules/terminal-control/control.js +75 -0
- package/packages/server/modules/terminal-control/handlers.js +10 -0
- package/packages/server/modules/terminal-control/index.js +3 -0
- package/packages/server/modules/terminal-control/shared-socket.js +319 -0
- package/packages/server/modules/terminal-control/socket.js +153 -0
- package/packages/server/modules/transport/implementation.js +24 -0
- package/packages/server/modules/transport/index.js +2 -0
- package/packages/server/modules/transport/router.js +16 -0
- package/packages/server/modules/transport/types.js +1 -0
- package/packages/server/modules/usage-analytics/index.js +4 -0
- package/packages/server/modules/usage-analytics/limits.js +144 -0
- package/packages/server/modules/usage-analytics/overview.js +117 -0
- package/packages/server/modules/usage-analytics/providers.js +120 -0
- package/packages/server/modules/usage-analytics/store.js +152 -0
- package/packages/server/modules/window/desktop.js +24 -0
- package/packages/server/modules/window/index.js +8 -0
- package/packages/server/modules/window/window.js +86 -0
- package/packages/server/modules/workspace/archive.py +109 -0
- package/packages/server/modules/workspace/external-files.js +22 -0
- package/packages/server/modules/workspace/files-exclude.js +73 -0
- package/packages/server/modules/workspace/files.js +332 -0
- package/packages/server/modules/workspace/find-paths.js +92 -0
- package/packages/server/modules/workspace/git-branches.js +159 -0
- package/packages/server/modules/workspace/git-compare.js +121 -0
- package/packages/server/modules/workspace/git-history.js +182 -0
- package/packages/server/modules/workspace/git-sync.js +245 -0
- package/packages/server/modules/workspace/git-tree.js +126 -0
- package/packages/server/modules/workspace/git.js +276 -0
- package/packages/server/modules/workspace/ignored.js +23 -0
- package/packages/server/modules/workspace/import.js +190 -0
- package/packages/server/modules/workspace/index.js +15 -0
- package/packages/server/modules/workspace/paths.js +38 -0
- package/packages/server/modules/workspace/reveal.js +14 -0
- package/packages/server/modules/workspace/search.js +136 -0
- package/packages/server/modules/workspace/site.js +62 -0
- package/packages/server/modules/workspace/watcher.js +176 -0
- package/packages/server/routes/api/agent-answer-repair.js +35 -0
- package/packages/server/routes/api/agent-chats.js +77 -0
- package/packages/server/routes/api/agent-features.js +36 -0
- package/packages/server/routes/api/agent-form-repair.js +35 -0
- package/packages/server/routes/api/agent-hooks.js +35 -0
- package/packages/server/routes/api/agent-jobs.js +322 -0
- package/packages/server/routes/api/agent-judge.js +33 -0
- package/packages/server/routes/api/agent-lens.js +27 -0
- package/packages/server/routes/api/agent-mcp.js +41 -0
- package/packages/server/routes/api/agent-memory.js +33 -0
- package/packages/server/routes/api/agent-project-roles.js +112 -0
- package/packages/server/routes/api/agent-project-widgets.js +67 -0
- package/packages/server/routes/api/agent-roles.js +106 -0
- package/packages/server/routes/api/agent-secret-show.js +87 -0
- package/packages/server/routes/api/agent-side.js +70 -0
- package/packages/server/routes/api/agent-skills.js +31 -0
- package/packages/server/routes/api/agent-web.js +27 -0
- package/packages/server/routes/api/agent-worktrees.js +49 -0
- package/packages/server/routes/api/agent.js +269 -0
- package/packages/server/routes/api/analytics.js +21 -0
- package/packages/server/routes/api/app/hide.js +12 -0
- package/packages/server/routes/api/app/mode.js +49 -0
- package/packages/server/routes/api/app/network.js +54 -0
- package/packages/server/routes/api/app/open.js +33 -0
- package/packages/server/routes/api/app/quit.js +14 -0
- package/packages/server/routes/api/app/restart.js +18 -0
- package/packages/server/routes/api/appearance.js +70 -0
- package/packages/server/routes/api/browser.js +27 -0
- package/packages/server/routes/api/claude.js +15 -0
- package/packages/server/routes/api/codex.js +15 -0
- package/packages/server/routes/api/cursor.js +15 -0
- package/packages/server/routes/api/directories.js +16 -0
- package/packages/server/routes/api/docker.js +74 -0
- package/packages/server/routes/api/events.js +25 -0
- package/packages/server/routes/api/health.js +20 -0
- package/packages/server/routes/api/hub.js +26 -0
- package/packages/server/routes/api/ide/commands.js +72 -0
- package/packages/server/routes/api/ide/editor.js +37 -0
- package/packages/server/routes/api/ide/files-exclude.js +37 -0
- package/packages/server/routes/api/ide/keybindings.js +37 -0
- package/packages/server/routes/api/inspect.js +21 -0
- package/packages/server/routes/api/integrations/[...action].js +201 -0
- package/packages/server/routes/api/integrations/github-browse.js +190 -0
- package/packages/server/routes/api/kimi.js +15 -0
- package/packages/server/routes/api/launcher/icon.js +16 -0
- package/packages/server/routes/api/launcher/launch.js +27 -0
- package/packages/server/routes/api/launcher/search.js +20 -0
- package/packages/server/routes/api/launcher/settings.js +68 -0
- package/packages/server/routes/api/openai.js +94 -0
- package/packages/server/routes/api/opencode.js +15 -0
- package/packages/server/routes/api/pick-folder.js +12 -0
- package/packages/server/routes/api/preview-icon.js +21 -0
- package/packages/server/routes/api/projects/[id]/index.js +240 -0
- package/packages/server/routes/api/projects/[id]/site.js +59 -0
- package/packages/server/routes/api/projects/[id]/terminals.js +38 -0
- package/packages/server/routes/api/projects/[id]/workspace-read.js +126 -0
- package/packages/server/routes/api/projects/[id]/workspace.js +147 -0
- package/packages/server/routes/api/projects/index.js +62 -0
- package/packages/server/routes/api/providers/active.js +12 -0
- package/packages/server/routes/api/providers/balance.js +15 -0
- package/packages/server/routes/api/providers/models.js +19 -0
- package/packages/server/routes/api/providers.js +23 -0
- package/packages/server/routes/api/status.js +11 -0
- package/resources/icons/128.png +0 -0
- package/resources/icons/16.png +0 -0
- package/resources/icons/256.png +0 -0
- package/resources/icons/32.png +0 -0
- package/resources/icons/48.png +0 -0
- package/resources/icons/512.png +0 -0
- package/resources/icons/64.png +0 -0
- package/resources/icons/projector.svg +5 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { SESSION_LIST_LIMIT, } from "../../agent/index.js";
|
|
2
|
+
import { controlsFromSession } from "./acp-controls.js";
|
|
3
|
+
import { availableCommands, createAcpReplayCollector } from "./acp-events.js";
|
|
4
|
+
import { initializeAcp, startAcp } from "./acp-process.js";
|
|
5
|
+
import { acpProgram } from "./acp-programs.js";
|
|
6
|
+
/** How long an agent's controls are reused: spawning an agent just to list models is not free. */
|
|
7
|
+
const CONTROLS_TTL_MS = 5 * 60_000;
|
|
8
|
+
const controlsCache = new Map();
|
|
9
|
+
/**
|
|
10
|
+
* Runs `work` against a short-lived agent process that is not tied to a chat turn. Permission
|
|
11
|
+
* requests are refused: nothing here may run tools.
|
|
12
|
+
*/
|
|
13
|
+
async function withAgent(id, cwd, work, onUpdate) {
|
|
14
|
+
const connection = await startAcp(id, cwd, {
|
|
15
|
+
onNotification(method, params) {
|
|
16
|
+
if (method === "session/update")
|
|
17
|
+
onUpdate?.((params.update ?? {}));
|
|
18
|
+
},
|
|
19
|
+
onRequest() {
|
|
20
|
+
return { outcome: { outcome: "cancelled" } };
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
try {
|
|
24
|
+
return await work(connection, await initializeAcp(connection, id));
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
await connection.close();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Drops the throwaway session so probing does not fill the agent's own history. */
|
|
31
|
+
async function discard(connection, sessionId) {
|
|
32
|
+
for (const method of ["session/delete", "session/close"]) {
|
|
33
|
+
try {
|
|
34
|
+
await connection.request(method, { sessionId }, 10_000);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
/* The agent may not implement this method; try the next one. */
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Models, effort levels and modes the agent offers in `cwd`, cached for a few minutes. */
|
|
43
|
+
export function acpControls(id, cwd) {
|
|
44
|
+
const key = `${id}\n${cwd}`;
|
|
45
|
+
const cached = controlsCache.get(key);
|
|
46
|
+
if (cached && Date.now() - cached.at < CONTROLS_TTL_MS)
|
|
47
|
+
return cached.controls;
|
|
48
|
+
const controls = withAgent(id, cwd, async (connection) => {
|
|
49
|
+
const created = (await connection.request("session/new", { cwd, mcpServers: [] }));
|
|
50
|
+
await discard(connection, created.sessionId);
|
|
51
|
+
return controlsFromSession(created);
|
|
52
|
+
});
|
|
53
|
+
controlsCache.set(key, { at: Date.now(), controls });
|
|
54
|
+
// A failure must not stick for the whole TTL.
|
|
55
|
+
controls.catch(() => controlsCache.delete(key));
|
|
56
|
+
return controls;
|
|
57
|
+
}
|
|
58
|
+
/** How long the slash commands are reused: they follow the project's files, not every call. */
|
|
59
|
+
const COMMANDS_TTL_MS = 60_000;
|
|
60
|
+
/** How long to wait for `available_commands_update` after `session/new`. */
|
|
61
|
+
const COMMANDS_WAIT_MS = 5_000;
|
|
62
|
+
const commandsCache = new Map();
|
|
63
|
+
/** Resolves with an empty list after `ms`: a chat must not wait for commands forever. */
|
|
64
|
+
function waitForCommands(commands, ms) {
|
|
65
|
+
return Promise.race([
|
|
66
|
+
commands,
|
|
67
|
+
new Promise((resolve) => {
|
|
68
|
+
const timer = setTimeout(() => resolve([]), ms);
|
|
69
|
+
timer.unref?.();
|
|
70
|
+
}),
|
|
71
|
+
]);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The slash commands the agent offers in `cwd`. ACP has no request for them: the agent sends
|
|
75
|
+
* `available_commands_update` after `session/new`. A throwaway session is created for that list
|
|
76
|
+
* and closed again — no prompt, no model call. The notification may arrive before the response
|
|
77
|
+
* (the protocol allows it), so it is collected from the first message.
|
|
78
|
+
*/
|
|
79
|
+
export function acpCommands(id, cwd, waitMs = COMMANDS_WAIT_MS) {
|
|
80
|
+
const key = `${id}\n${cwd}`;
|
|
81
|
+
const cached = commandsCache.get(key);
|
|
82
|
+
if (cached && Date.now() - cached.at < COMMANDS_TTL_MS)
|
|
83
|
+
return cached.commands;
|
|
84
|
+
let resolveAnnounced;
|
|
85
|
+
const announced = new Promise((resolve) => (resolveAnnounced = resolve));
|
|
86
|
+
let collected;
|
|
87
|
+
let decided = false;
|
|
88
|
+
const take = (list) => {
|
|
89
|
+
collected = availableCommands(list);
|
|
90
|
+
// An empty first snapshot is not final: some agents load commands from project files.
|
|
91
|
+
if (collected.length) {
|
|
92
|
+
decided = true;
|
|
93
|
+
resolveAnnounced?.(collected);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const commands = withAgent(id, cwd, async (connection) => {
|
|
97
|
+
const created = (await connection.request("session/new", { cwd, mcpServers: [] }));
|
|
98
|
+
// The response is authoritative for v2 agents, even when the list is empty.
|
|
99
|
+
if (created.availableCommands !== undefined) {
|
|
100
|
+
take(created.availableCommands);
|
|
101
|
+
decided = true;
|
|
102
|
+
}
|
|
103
|
+
if (!decided)
|
|
104
|
+
await waitForCommands(announced, waitMs);
|
|
105
|
+
await discard(connection, created.sessionId);
|
|
106
|
+
return collected ?? [];
|
|
107
|
+
}, (update) => {
|
|
108
|
+
if (update.sessionUpdate === "available_commands_update")
|
|
109
|
+
take(update.availableCommands);
|
|
110
|
+
});
|
|
111
|
+
commandsCache.set(key, { at: Date.now(), commands });
|
|
112
|
+
// A failure must not stick for the whole TTL.
|
|
113
|
+
commands.catch(() => commandsCache.delete(key));
|
|
114
|
+
return commands;
|
|
115
|
+
}
|
|
116
|
+
const EMPTY_TITLE = /^(New session - \d{4}-\d\d-\d\dT|untitled|new session)$/i;
|
|
117
|
+
/** The session a raw one was started from, as far as the agent tells it. */
|
|
118
|
+
function parentOf(session) {
|
|
119
|
+
const meta = session._meta ?? {};
|
|
120
|
+
for (const value of [
|
|
121
|
+
session.parentId,
|
|
122
|
+
session.parentSessionId,
|
|
123
|
+
meta.parentId,
|
|
124
|
+
meta.parentSessionId,
|
|
125
|
+
meta["opencode/parent-session"],
|
|
126
|
+
])
|
|
127
|
+
if (typeof value === "string" && value.trim())
|
|
128
|
+
return value;
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
/** The agent a branch runs as, when the listing names it. */
|
|
132
|
+
function agentOf(session) {
|
|
133
|
+
const meta = session._meta ?? {};
|
|
134
|
+
for (const value of [session.agent, meta.agent, meta["opencode/agent"]])
|
|
135
|
+
if (typeof value === "string" && value.trim())
|
|
136
|
+
return value;
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
const newestFirst = (a, b) => (b.updatedAt ?? "").localeCompare(a.updatedAt ?? "");
|
|
140
|
+
/**
|
|
141
|
+
* Branches of subagents are not chats of their own: they must not push real chats out of the
|
|
142
|
+
* limited list. Their parents are kept in full, and branches follow those that remain.
|
|
143
|
+
*/
|
|
144
|
+
function capSessions(list) {
|
|
145
|
+
const mains = list.filter((session) => !session.parent);
|
|
146
|
+
if (!mains.length)
|
|
147
|
+
return list.sort(newestFirst).slice(0, SESSION_LIST_LIMIT);
|
|
148
|
+
const children = new Map();
|
|
149
|
+
for (const session of list)
|
|
150
|
+
if (session.parent)
|
|
151
|
+
children.set(session.parent, [...(children.get(session.parent) ?? []), session]);
|
|
152
|
+
const kept = new Set(mains.slice(0, SESSION_LIST_LIMIT).map((session) => session.id));
|
|
153
|
+
const include = (id) => {
|
|
154
|
+
for (const child of children.get(id) ?? [])
|
|
155
|
+
if (!kept.has(child.id)) {
|
|
156
|
+
kept.add(child.id);
|
|
157
|
+
include(child.id);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
for (const id of [...kept])
|
|
161
|
+
include(id);
|
|
162
|
+
return list.filter((session) => kept.has(session.id)).sort(newestFirst);
|
|
163
|
+
}
|
|
164
|
+
/** The agent's own past sessions in `cwd`, newest first; empty when it cannot list them. */
|
|
165
|
+
export function acpSessions(id, cwd, decorate) {
|
|
166
|
+
return withAgent(id, cwd, async (connection, init) => {
|
|
167
|
+
if (!init.agentCapabilities?.sessionCapabilities?.list)
|
|
168
|
+
return [];
|
|
169
|
+
const answer = (await connection.request("session/list", { cwd }));
|
|
170
|
+
const list = (answer.sessions ?? []).flatMap((session) => {
|
|
171
|
+
const title = session.title?.trim();
|
|
172
|
+
// A session that never received a prompt has no title (or a placeholder like OpenCode's).
|
|
173
|
+
if (!session.sessionId || !title || EMPTY_TITLE.test(title))
|
|
174
|
+
return [];
|
|
175
|
+
const parent = parentOf(session);
|
|
176
|
+
// Only a branch is named by its agent: the same field on a chat is the mode it runs in.
|
|
177
|
+
const agent = parent ? agentOf(session) : undefined;
|
|
178
|
+
return [
|
|
179
|
+
{
|
|
180
|
+
id: session.sessionId,
|
|
181
|
+
title,
|
|
182
|
+
...(session.updatedAt ? { updatedAt: session.updatedAt } : {}),
|
|
183
|
+
...(parent ? { parent } : {}),
|
|
184
|
+
...(agent ? { agent } : {}),
|
|
185
|
+
},
|
|
186
|
+
];
|
|
187
|
+
});
|
|
188
|
+
return capSessions(decorate ? await decorate(list) : list);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/** Removes a past session through `session/delete`, for agents that offer it. */
|
|
192
|
+
export function acpDeleteSession(id, cwd, sessionId) {
|
|
193
|
+
return withAgent(id, cwd, async (connection, init) => {
|
|
194
|
+
if (!init.agentCapabilities?.sessionCapabilities?.delete)
|
|
195
|
+
throw new Error("Агент не умеет удалять сессии");
|
|
196
|
+
await connection.request("session/delete", { sessionId });
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/** The messages of a past session, replayed by the agent through `session/load`. */
|
|
200
|
+
export function acpLoadSession(id, cwd, sessionId) {
|
|
201
|
+
const collector = createAcpReplayCollector(id, sessionId, acpProgram(id).dialect?.());
|
|
202
|
+
return withAgent(id, cwd, async (connection, init) => {
|
|
203
|
+
if (!init.agentCapabilities?.loadSession)
|
|
204
|
+
throw new Error("Агент не умеет восстанавливать прошлые сессии");
|
|
205
|
+
await connection.request("session/load", { sessionId, cwd, mcpServers: [] });
|
|
206
|
+
return collector.turns;
|
|
207
|
+
}, (update) => collector.handleUpdate(update));
|
|
208
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createAcpBackend } from "./acp-backend.js";
|
|
2
|
+
export { acpSessions } from "./acp-tools.js";
|
|
3
|
+
export { registerAcpProgram, } from "./acp-programs.js";
|
|
4
|
+
export { createPlainDialect, extendPlainDialect, inputOf, isCompactCommand, isOver, readCompaction, shorten, uuidV7Time, } from "./acp-dialect.js";
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { mcpServerConfigs } from "../../agent-mcp/index.js";
|
|
4
|
+
/** `${NAME}` and `${NAME:-fallback}` in a config value, as Claude Code's own `.mcp.json` allows. */
|
|
5
|
+
function expand(value) {
|
|
6
|
+
return value.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g, (_, name, fallback) => process.env[name] ?? fallback ?? "");
|
|
7
|
+
}
|
|
8
|
+
async function readConfig(cwd) {
|
|
9
|
+
try {
|
|
10
|
+
const data = JSON.parse(await readFile(join(cwd, ".mcp.json"), "utf8"));
|
|
11
|
+
return data.mcpServers && typeof data.mcpServers === "object" ? data.mcpServers : {};
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const isStdio = (entry) => typeof entry.command === "string" && !!entry.command && (!entry.type || entry.type === "stdio");
|
|
18
|
+
const remoteKind = (entry) => (entry.type === "http" || entry.type === "sse") && typeof entry.url === "string" && entry.url
|
|
19
|
+
? entry.type
|
|
20
|
+
: undefined;
|
|
21
|
+
const pairs = (value) => (value && typeof value === "object" ? Object.entries(value) : []).map(([name, item]) => ({
|
|
22
|
+
name,
|
|
23
|
+
value: expand(String(item)),
|
|
24
|
+
}));
|
|
25
|
+
/** The project's `.mcp.json` servers this agent can be given: stdio ones, and remote ones it supports. */
|
|
26
|
+
export async function projectMcpServers(cwd, support = {}) {
|
|
27
|
+
if (!cwd)
|
|
28
|
+
return [];
|
|
29
|
+
return Object.entries(await readConfig(cwd)).flatMap(([name, entry]) => {
|
|
30
|
+
if (isStdio(entry))
|
|
31
|
+
return [
|
|
32
|
+
{
|
|
33
|
+
name,
|
|
34
|
+
command: expand(String(entry.command)),
|
|
35
|
+
args: Array.isArray(entry.args) ? entry.args.map((item) => expand(String(item))) : [],
|
|
36
|
+
env: pairs(entry.env),
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
const kind = remoteKind(entry);
|
|
40
|
+
if (!kind || !support[kind])
|
|
41
|
+
return [];
|
|
42
|
+
return [{ type: kind, name, url: expand(String(entry.url)), headers: pairs(entry.headers) }];
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** A parsed config in the shape ACP takes; a remote kind the agent lacks is left out. */
|
|
46
|
+
function acpServer(config, support) {
|
|
47
|
+
if ("command" in config)
|
|
48
|
+
return [
|
|
49
|
+
{
|
|
50
|
+
name: config.name,
|
|
51
|
+
command: config.command,
|
|
52
|
+
args: config.args,
|
|
53
|
+
env: Object.entries(config.env).map(([name, value]) => ({ name, value })),
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
if (config.sse ? !support.sse : !support.http)
|
|
57
|
+
return [];
|
|
58
|
+
return [
|
|
59
|
+
{
|
|
60
|
+
type: config.sse ? "sse" : "http",
|
|
61
|
+
name: config.name,
|
|
62
|
+
url: config.url,
|
|
63
|
+
headers: Object.entries(config.headers).map(([name, value]) => ({ name, value })),
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
/** The user's own servers a role names; the project's are passed separately from `.mcp.json`. */
|
|
68
|
+
export async function userMcpServers(cwd, names, support = {}) {
|
|
69
|
+
if (!names.length)
|
|
70
|
+
return [];
|
|
71
|
+
return (await mcpServerConfigs(cwd))
|
|
72
|
+
.filter((config) => config.source === "user" && names.includes(config.name))
|
|
73
|
+
.flatMap((config) => acpServer(config, support));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The MCP servers of a session: the project's own, plus the built-in IDE and widget servers when
|
|
77
|
+
* their features are on. Only those additions may hide a same-named project server; with the
|
|
78
|
+
* feature off the user's `projector-ide` or `projector-widgets` from `.mcp.json` is passed as is.
|
|
79
|
+
*/
|
|
80
|
+
export async function sessionMcpServers(cwd, support, extra, only) {
|
|
81
|
+
const project = only
|
|
82
|
+
? (await projectMcpServers(cwd, support)).filter((server) => only.includes(server.name))
|
|
83
|
+
: await projectMcpServers(cwd, support);
|
|
84
|
+
if (!extra.length)
|
|
85
|
+
return project;
|
|
86
|
+
const names = new Set(extra.map((server) => server.name));
|
|
87
|
+
return [...project.filter((server) => !names.has(server.name)), ...extra];
|
|
88
|
+
}
|
|
89
|
+
/** What the chat shows for an ACP agent: which servers of the project it is given. */
|
|
90
|
+
export async function configuredMcpServers(cwd) {
|
|
91
|
+
return Object.entries(await readConfig(cwd)).map(([name, entry]) => ({
|
|
92
|
+
name,
|
|
93
|
+
status: isStdio(entry)
|
|
94
|
+
? "передан агенту"
|
|
95
|
+
: remoteKind(entry)
|
|
96
|
+
? "передан, если агент поддерживает " + remoteKind(entry)
|
|
97
|
+
: "не передан: неизвестный тип сервера",
|
|
98
|
+
tools: 0,
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import { agentEnv, assertHostProject, attachedImages, promptWithHistory, registerInjector, runHostedAgent, } from "../../agent/index.js";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
4
|
+
import { featureEnabled, featurePrompt } from "../../agent-features/index.js";
|
|
5
|
+
import { claudeIdeMcpServer, IDE_MCP_SERVER } from "../ide-mcp/index.js";
|
|
6
|
+
import { claudeWidgetsMcpServer, WIDGETS_MCP_SERVER } from "../widgets-mcp/index.js";
|
|
7
|
+
import { mcpConfigsForNames, mcpServerConfigs, processMcpConfig } from "../../agent-mcp/index.js";
|
|
8
|
+
import { roleContext } from "../../agent-roles/index.js";
|
|
9
|
+
import { trustedProjectWidgets } from "../../project-widgets/index.js";
|
|
10
|
+
import { renderWidgetGuide } from "../../../../core/modules/widget-catalog/index.js";
|
|
11
|
+
import { createInput } from "./claude-code-input.js";
|
|
12
|
+
import { CLAUDE_LABEL, createClaudeEventMapper } from "./claude-code-events.js";
|
|
13
|
+
import { chainTail, claudeMcpServers, isUuid, rewindClaudeFiles, sessionAt, } from "./claude-code-checkpoints.js";
|
|
14
|
+
import { CLAUDE_CONTROLS, claudeLoadSession, claudeSessions, claudeDeleteSession, claudeUpdateSession, } from "./claude-code-sessions.js";
|
|
15
|
+
import { askClaudeQuestions } from "./questions.js";
|
|
16
|
+
import { claudeEnv } from "./claude-code-env.js";
|
|
17
|
+
/** Claude Code takes the choice natively; `default` leaves the model and effort to its settings. */
|
|
18
|
+
function chosen(options) {
|
|
19
|
+
const pick = (id) => {
|
|
20
|
+
const value = options.selection?.[id];
|
|
21
|
+
return value && value !== "default" ? value : undefined;
|
|
22
|
+
};
|
|
23
|
+
const number = (id) => {
|
|
24
|
+
const value = Number(pick(id));
|
|
25
|
+
return Number.isFinite(value) && value > 0 ? value : undefined;
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
model: pick("model"),
|
|
29
|
+
effort: pick("effort"),
|
|
30
|
+
budget: number("budget"),
|
|
31
|
+
steps: number("steps"),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** The runner process of a hosted answer (see `server/app/claude-runner.ts`). */
|
|
35
|
+
const RUNNER = fileURLToPath(new URL("../../../app/claude-runner.js", import.meta.url));
|
|
36
|
+
/** The answer of a hosted run: followed through its runner (see `server/app/claude-runner.ts`). */
|
|
37
|
+
async function runHosted(options, handle) {
|
|
38
|
+
if (!options.cwd)
|
|
39
|
+
throw new Error("Claude Code работает внутри проекта: откройте чат в проекте");
|
|
40
|
+
await assertHostProject(options.cwd, CLAUDE_LABEL);
|
|
41
|
+
await runHostedAgent(options, handle, { runner: RUNNER, cwd: options.cwd, env: agentEnv() }, isUuid(options.messageId) ? options.messageId : undefined);
|
|
42
|
+
}
|
|
43
|
+
/** The run: held by its own process when the route gave it one, otherwise in this process. */
|
|
44
|
+
async function run(options) {
|
|
45
|
+
if (options.run)
|
|
46
|
+
return runHosted(options, options.run);
|
|
47
|
+
return runClaudeCode(options);
|
|
48
|
+
}
|
|
49
|
+
/** The prompt of a Claude Code session: its own preset plus the abilities and role switched on for the chat. */
|
|
50
|
+
export async function claudeSystemPrompt(features, role = "", projectWidgets = "") {
|
|
51
|
+
const text = [role.trim(), await featurePrompt("claude-code", features), projectWidgets.trim()]
|
|
52
|
+
.filter(Boolean)
|
|
53
|
+
.join("\n\n");
|
|
54
|
+
return {
|
|
55
|
+
type: "preset",
|
|
56
|
+
preset: "claude_code",
|
|
57
|
+
...(text ? { append: text } : {}),
|
|
58
|
+
// The host changes the append when the user flips a feature: render the prompt fresh on every
|
|
59
|
+
// request, otherwise a resumed session keeps the prompt recorded at its first request.
|
|
60
|
+
snapshot: false,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Plain Claude Code behind a chat UI instead of the TUI: its own prompt, tools, login, `CLAUDE.md`
|
|
65
|
+
* and settings. Nothing about Projector is added to the model's context except the abilities the
|
|
66
|
+
* user switched on. Runs in the runner process (`server/app/claude-runner.ts`) for a hosted answer,
|
|
67
|
+
* and in the server process otherwise.
|
|
68
|
+
*/
|
|
69
|
+
export async function runClaudeCode(options) {
|
|
70
|
+
if (!options.cwd)
|
|
71
|
+
throw new Error("Claude Code работает внутри проекта: откройте чат в проекте");
|
|
72
|
+
const requestedMode = options.selection?.["permission-mode"] ?? options.permissionMode ?? "default";
|
|
73
|
+
const mode = PERMISSION_MODES.find((value) => value === requestedMode);
|
|
74
|
+
if (!mode)
|
|
75
|
+
throw new Error("Неизвестный режим разрешений агента");
|
|
76
|
+
const cwd = options.cwd;
|
|
77
|
+
await assertHostProject(cwd, CLAUDE_LABEL);
|
|
78
|
+
const abortController = new AbortController();
|
|
79
|
+
const forwardAbort = () => abortController.abort();
|
|
80
|
+
if (options.abort?.aborted)
|
|
81
|
+
abortController.abort();
|
|
82
|
+
else
|
|
83
|
+
options.abort?.addEventListener("abort", forwardAbort, { once: true });
|
|
84
|
+
const selected = chosen(options);
|
|
85
|
+
const [ideEnabled, widgetsEnabled, roleText] = await Promise.all([
|
|
86
|
+
featureEnabled("claude-code", "ide", options.features),
|
|
87
|
+
featureEnabled("claude-code", "widgets", options.features),
|
|
88
|
+
roleContext(options.role, cwd),
|
|
89
|
+
]);
|
|
90
|
+
const projectWidgets = widgetsEnabled ? await trustedProjectWidgets(options.projectId) : [];
|
|
91
|
+
const extraMcp = {
|
|
92
|
+
...(options.projectId && ideEnabled
|
|
93
|
+
? { [IDE_MCP_SERVER]: claudeIdeMcpServer(options.projectId) }
|
|
94
|
+
: {}),
|
|
95
|
+
...(widgetsEnabled ? { [WIDGETS_MCP_SERVER]: claudeWidgetsMcpServer(options.projectId) } : {}),
|
|
96
|
+
};
|
|
97
|
+
// A role with its own MCP list gets exactly those servers: Claude Code must not add the rest.
|
|
98
|
+
const namedMcp = options.role?.mcp
|
|
99
|
+
? Object.fromEntries(mcpConfigsForNames(await mcpServerConfigs(cwd), options.role.mcp)
|
|
100
|
+
.filter((config) => !(config.name in extraMcp))
|
|
101
|
+
.map((config) => [config.name, processMcpConfig(config)]))
|
|
102
|
+
: {};
|
|
103
|
+
const mcpServers = { ...namedMcp, ...extraMcp };
|
|
104
|
+
const base = {
|
|
105
|
+
cwd,
|
|
106
|
+
abortController,
|
|
107
|
+
env: claudeEnv(),
|
|
108
|
+
...(Object.keys(mcpServers).length ? { mcpServers } : {}),
|
|
109
|
+
...(options.role?.mcp ? { strictMcpConfig: true } : {}),
|
|
110
|
+
includePartialMessages: true,
|
|
111
|
+
// A background subagent streams no calls of its own: its progress arrives as these summaries.
|
|
112
|
+
agentProgressSummaries: true,
|
|
113
|
+
settingSources: ["user", "project", "local"],
|
|
114
|
+
systemPrompt: await claudeSystemPrompt(options.features, roleText, projectWidgets.length ? renderWidgetGuide(projectWidgets) : ""),
|
|
115
|
+
...(widgetsEnabled ? { allowedTools: [`mcp__${WIDGETS_MCP_SERVER}__describe_widget`] } : {}),
|
|
116
|
+
permissionMode: mode,
|
|
117
|
+
// Files are backed up before the agent changes them, so a step can be taken back later.
|
|
118
|
+
enableFileCheckpointing: true,
|
|
119
|
+
...(selected.model ? { model: selected.model } : {}),
|
|
120
|
+
...(selected.effort ? { effort: selected.effort } : {}),
|
|
121
|
+
...(selected.budget ? { maxBudgetUsd: selected.budget } : {}),
|
|
122
|
+
...(selected.steps ? { maxTurns: selected.steps } : {}),
|
|
123
|
+
...(mode === "bypassPermissions" ? { allowDangerouslySkipPermissions: true } : {}),
|
|
124
|
+
canUseTool: async (toolName, input, context) => {
|
|
125
|
+
if (toolName === "AskUserQuestion")
|
|
126
|
+
return askClaudeQuestions(options, input);
|
|
127
|
+
if (!options.approve)
|
|
128
|
+
return { behavior: "deny", message: "Клиент не может показать запрос разрешения" };
|
|
129
|
+
const suggestions = context.suggestions ?? [];
|
|
130
|
+
const answer = await options
|
|
131
|
+
.approve({
|
|
132
|
+
tool: toolName,
|
|
133
|
+
input,
|
|
134
|
+
title: context.title ?? context.displayName,
|
|
135
|
+
persistent: suggestions.length > 0,
|
|
136
|
+
})
|
|
137
|
+
.catch(() => false);
|
|
138
|
+
if (!answer)
|
|
139
|
+
return { behavior: "deny", message: "Пользователь отклонил действие" };
|
|
140
|
+
// "Always" turns the rule Claude Code itself suggests into a saved permission.
|
|
141
|
+
return {
|
|
142
|
+
behavior: "allow",
|
|
143
|
+
updatedInput: input,
|
|
144
|
+
...(answer === "always" && suggestions.length
|
|
145
|
+
? {
|
|
146
|
+
// Kept in the user's own settings, so it holds in every project and for the terminal too.
|
|
147
|
+
updatedPermissions: suggestions.map((rule) => ({
|
|
148
|
+
...rule,
|
|
149
|
+
destination: "userSettings",
|
|
150
|
+
})),
|
|
151
|
+
}
|
|
152
|
+
: {}),
|
|
153
|
+
};
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
const attempt = async (resume) => {
|
|
157
|
+
// A failed resume is retried silently, so its error is held back until we know it is final.
|
|
158
|
+
let heldError;
|
|
159
|
+
const emit = (event, data) => {
|
|
160
|
+
if (resume && event === "error")
|
|
161
|
+
heldError = data;
|
|
162
|
+
else
|
|
163
|
+
options.emit(event, data);
|
|
164
|
+
};
|
|
165
|
+
const mapper = createClaudeEventMapper(emit);
|
|
166
|
+
const prompt = resume
|
|
167
|
+
? options.message
|
|
168
|
+
: promptWithHistory(options.message, options.history ?? []);
|
|
169
|
+
const images = await attachedImages(options.parts);
|
|
170
|
+
const messageId = isUuid(options.messageId) ? options.messageId : undefined;
|
|
171
|
+
const input = createInput(userMessage(prompt, images, messageId));
|
|
172
|
+
const unregister = messageId
|
|
173
|
+
? registerInjector(messageId, (text, inputId) => {
|
|
174
|
+
const accepted = input.push(text);
|
|
175
|
+
if (accepted)
|
|
176
|
+
emit("input", { text, ...(inputId ? { inputId } : {}) });
|
|
177
|
+
return accepted;
|
|
178
|
+
})
|
|
179
|
+
: undefined;
|
|
180
|
+
const conversation = query({
|
|
181
|
+
prompt: input.stream,
|
|
182
|
+
options: { ...base, ...(resume ? { resume } : {}) },
|
|
183
|
+
});
|
|
184
|
+
// The ring follows the answer: asked again after tool results, but not more often than this.
|
|
185
|
+
let contextAt = 0;
|
|
186
|
+
try {
|
|
187
|
+
for await (const message of conversation) {
|
|
188
|
+
mapper.handle(message);
|
|
189
|
+
input.follow(message, mapper.working);
|
|
190
|
+
if (message.type === "user" && Date.now() - contextAt > CONTEXT_REFRESH_MS) {
|
|
191
|
+
contextAt = Date.now();
|
|
192
|
+
void emitContext(conversation, emit);
|
|
193
|
+
}
|
|
194
|
+
if (message.type === "result") {
|
|
195
|
+
await emitContext(conversation, emit);
|
|
196
|
+
input.settled();
|
|
197
|
+
}
|
|
198
|
+
else if (message.type === "assistant" || message.type === "stream_event")
|
|
199
|
+
input.busy();
|
|
200
|
+
}
|
|
201
|
+
mapper.finish();
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
unregister?.();
|
|
205
|
+
input.close();
|
|
206
|
+
conversation.close();
|
|
207
|
+
}
|
|
208
|
+
// Where this answer ends in the transcript: the next message can branch off here.
|
|
209
|
+
if (!mapper.failed && mapper.sessionId) {
|
|
210
|
+
const tail = await chainTail(cwd, mapper.sessionId);
|
|
211
|
+
if (tail)
|
|
212
|
+
options.emit("checkpoint", { tail });
|
|
213
|
+
}
|
|
214
|
+
// The session may be gone (project moved, transcript pruned): start over from the history.
|
|
215
|
+
if (resume && mapper.failed && !mapper.started && !abortController.signal.aborted)
|
|
216
|
+
return attempt(undefined);
|
|
217
|
+
if (heldError)
|
|
218
|
+
options.emit("error", heldError);
|
|
219
|
+
};
|
|
220
|
+
try {
|
|
221
|
+
options.emit("controls", { controls: claudeControls(options.selection ?? {}) });
|
|
222
|
+
options.emit("status", { phase: "thinking", provider: CLAUDE_LABEL, model: "" });
|
|
223
|
+
const resume = options.sessionId
|
|
224
|
+
? await sessionAt(cwd, options.sessionId, options.tail)
|
|
225
|
+
: undefined;
|
|
226
|
+
await attempt(resume);
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
options.abort?.removeEventListener("abort", forwardAbort);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* The prompt as one streamed user message: text and images as content blocks, and an ID of our own
|
|
234
|
+
* that the transcript keeps, which is what a later rewind of the files refers to.
|
|
235
|
+
*/
|
|
236
|
+
function userMessage(text, images, uuid) {
|
|
237
|
+
return {
|
|
238
|
+
type: "user",
|
|
239
|
+
...(uuid ? { uuid: uuid } : {}),
|
|
240
|
+
parent_tool_use_id: null,
|
|
241
|
+
message: {
|
|
242
|
+
role: "user",
|
|
243
|
+
content: [
|
|
244
|
+
{ type: "text", text },
|
|
245
|
+
...images.map((image) => ({
|
|
246
|
+
type: "image",
|
|
247
|
+
source: {
|
|
248
|
+
type: "base64",
|
|
249
|
+
media_type: image.mime,
|
|
250
|
+
data: image.data,
|
|
251
|
+
},
|
|
252
|
+
})),
|
|
253
|
+
],
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/** The least time between two readings of how full the context is during one answer. */
|
|
258
|
+
const CONTEXT_REFRESH_MS = 4000;
|
|
259
|
+
const COMMANDS_TTL_MS = 60_000;
|
|
260
|
+
const commandCache = new Map();
|
|
261
|
+
/**
|
|
262
|
+
* The slash commands (built in, user's, project's, plugins', skills') Claude Code offers in a
|
|
263
|
+
* folder. They are only known to a running session, so one is started without a prompt, asked and
|
|
264
|
+
* closed; the answer is kept for a minute.
|
|
265
|
+
*/
|
|
266
|
+
function claudeCommands(cwd) {
|
|
267
|
+
const cached = commandCache.get(cwd);
|
|
268
|
+
if (cached && Date.now() - cached.at < COMMANDS_TTL_MS)
|
|
269
|
+
return cached.commands;
|
|
270
|
+
const commands = (async () => {
|
|
271
|
+
const idle = (async function* () {
|
|
272
|
+
await new Promise(() => { });
|
|
273
|
+
})();
|
|
274
|
+
const session = query({
|
|
275
|
+
prompt: idle,
|
|
276
|
+
options: { cwd, env: claudeEnv(), settingSources: ["user", "project", "local"] },
|
|
277
|
+
});
|
|
278
|
+
try {
|
|
279
|
+
return (await session.supportedCommands()).map((item) => ({
|
|
280
|
+
name: item.name,
|
|
281
|
+
description: item.description || undefined,
|
|
282
|
+
hint: item.argumentHint || undefined,
|
|
283
|
+
}));
|
|
284
|
+
}
|
|
285
|
+
finally {
|
|
286
|
+
session.close();
|
|
287
|
+
}
|
|
288
|
+
})();
|
|
289
|
+
commandCache.set(cwd, { at: Date.now(), commands });
|
|
290
|
+
commands.catch(() => commandCache.delete(cwd));
|
|
291
|
+
return commands;
|
|
292
|
+
}
|
|
293
|
+
/** How full the context window is after the turn; a failure only means no indicator. */
|
|
294
|
+
async function emitContext(conversation, emit) {
|
|
295
|
+
try {
|
|
296
|
+
const usage = await conversation.getContextUsage({ detail: "summary" });
|
|
297
|
+
emit("context", {
|
|
298
|
+
used: usage.totalTokens,
|
|
299
|
+
size: usage.maxTokens,
|
|
300
|
+
model: usage.model,
|
|
301
|
+
compactAt: usage.isAutoCompactEnabled ? usage.autoCompactThreshold : undefined,
|
|
302
|
+
categories: usage.categories
|
|
303
|
+
.filter((item) => item.kind === "used" && item.tokens > 0)
|
|
304
|
+
.map((item) => ({ name: item.name, tokens: item.tokens })),
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
// The answer is already complete; the indicator just keeps its previous value.
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/** The static list with the user's current choice marked. */
|
|
312
|
+
function claudeControls(selection) {
|
|
313
|
+
return CLAUDE_CONTROLS.map((control) => {
|
|
314
|
+
const value = selection[control.id];
|
|
315
|
+
return value && control.options.some((option) => option.value === value)
|
|
316
|
+
? { ...control, current: value }
|
|
317
|
+
: control;
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
/** Claude Code's permission policy: `default` asks in the chat before edits and shell commands. */
|
|
321
|
+
const PERMISSION_MODES = ["default", "plan", "acceptEdits", "auto", "bypassPermissions"];
|
|
322
|
+
export const claudeCodeBackend = {
|
|
323
|
+
id: "claude-code",
|
|
324
|
+
label: CLAUDE_LABEL,
|
|
325
|
+
program: "claude",
|
|
326
|
+
terminal: { program: "claude", executable: "claude", title: CLAUDE_LABEL },
|
|
327
|
+
capabilities: {
|
|
328
|
+
hosted: true,
|
|
329
|
+
inject: true,
|
|
330
|
+
branchSession: true,
|
|
331
|
+
compact: { command: "/compact", hintAt: 0.8, autoAt: 0.9 },
|
|
332
|
+
},
|
|
333
|
+
run,
|
|
334
|
+
controls: async () => CLAUDE_CONTROLS,
|
|
335
|
+
commands: claudeCommands,
|
|
336
|
+
sessions: claudeSessions,
|
|
337
|
+
loadSession: claudeLoadSession,
|
|
338
|
+
updateSession: claudeUpdateSession,
|
|
339
|
+
deleteSession: claudeDeleteSession,
|
|
340
|
+
rewindFiles: (cwd, sessionId, messageId, dryRun) => rewindClaudeFiles(cwd, sessionId, messageId, dryRun),
|
|
341
|
+
mcpServers: claudeMcpServers,
|
|
342
|
+
};
|