@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,178 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/compiler-dom.esm-bundler-C5a_rSi1.js","assets/shared.esm-bundler-DoSbGLUP.js","assets/TerminalView-fWmIbnZn.js","assets/styles-DZDDPlL3.js","assets/_plugin-vue_export-helper-D62Ebo7D.js","assets/UiButton-DvucBdmd.js","assets/UiButton-AkN01P3P.css","assets/styles-CCXo2OoQ.css","assets/UiPanel-DtI4DFYT.js","assets/UiPanel-BUDYIo-h.css","assets/TerminalView-C30_q784.css","assets/CodeViewer-C-C3aibO.js","assets/dist-DzoDV6Eh.js","assets/preload-helper-BLdHbfdN.js","assets/dist-23D313r2.js","assets/dist-CRLdLpSX.js","assets/editor-theme-ClBxXjSu.js","assets/CodeViewer--WUSmn5i.css","assets/IssueView-ChJFmrTW.js","assets/UiViewerPage-aHNgiSjO.js","assets/external-link-lkcxItwM.js","assets/UiViewerPage-CMFEzZ2i.css","assets/TrackerDetail-DuzfEwSZ.js","assets/github-emoji-CXJ5RSZS.js","assets/rolldown-runtime-XKyaHtl9.js","assets/ImageViewport-BT_ftU4z.js","assets/ImageViewport-JcG9P4B6.css","assets/github-emoji-D8dkjuM_.css","assets/VisualMarkdownEditor-BHx2olWh.js","assets/dist-Dqsd8MyB.js","assets/VisualMarkdownEditor-1DNSAYyq.css","assets/TrackerDetail-CBaLycQg.css","assets/PullRequestView-Cipn5P0H.js","assets/PullRequestView-CzZn9mOg.css","assets/DiscussionView-K3YyWE-E.js","assets/DiscussionView-Cd3exhWx.css","assets/ReleaseView-Cz6dH4ej.js","assets/ReleaseView-VLO9NVfI.css","assets/MarkdownViewer-Dm2MVp3X.js","assets/MarkdownViewer-C646XbYf.css","assets/SvgViewer-DkoULP8F.js","assets/SplitPanes-DNDTWIta.js","assets/SplitPanes-0-UT7ksm.css","assets/SvgViewer-DP6-1_fw.css","assets/HtmlViewer-DULKK0_6.js","assets/HtmlViewer-XHn9rACG.css","assets/EditorSettings-DlzJc8cp.js","assets/EditorSettings-jSngmpPq.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{n as e}from"./rolldown-runtime-XKyaHtl9.js";import{A as t,C as n,D as r,E as i,O as a,S as o,T as s,_ as c,a as l,b as u,c as d,d as f,f as p,g as m,h,i as g,j as _,k as v,l as y,m as b,n as x,o as S,p as C,s as w,t as T,u as ee,v as E,w as te,x as D,y as ne}from"./styles-DZDDPlL3.js";import{J as re,U as ie,V as O,W as k,a as A,o as ae,q as j}from"./shared.esm-bundler-DoSbGLUP.js";import{$ as oe,$t as se,A as M,At as ce,B as le,Bt as ue,C as de,Cn as fe,Ct as pe,D as N,Dn as me,Dt as he,E as ge,En as _e,Et as ve,F as ye,Ft as P,G as be,Gt as xe,H as Se,Ht as Ce,I as we,It as Te,J as Ee,Jt as F,K as De,Kt as Oe,L as ke,Lt as Ae,M as je,Mt as Me,N as Ne,Nt as Pe,O as I,On as Fe,Ot as Ie,P as Le,Pt as Re,Q as ze,Qt as Be,R as Ve,Rt as He,S as Ue,Sn as We,St as L,T as Ge,Tn as Ke,Tt as qe,U as Je,Ut as R,V as Ye,Vt as Xe,W as Ze,Wt as Qe,X as $e,Xt as et,Y as tt,Yt as nt,Z as rt,Zt as it,_ as z,_n as at,_t as ot,a as st,an as ct,at as lt,b as B,bn as ut,bt as dt,c as ft,cn as pt,ct as mt,d as ht,dn as gt,dt as _t,en as vt,et as yt,f as bt,fn as xt,ft as St,g as Ct,gn as wt,gt as Tt,h as Et,hn as Dt,ht as V,i as Ot,in as kt,it as At,j as jt,jt as Mt,k as Nt,kn as H,kt as Pt,l as Ft,ln as It,lt as Lt,m as Rt,mn as zt,mt as Bt,n as Vt,nn as Ht,nt as Ut,o as Wt,on as Gt,ot as Kt,p as qt,pn as U,pt as Jt,q as Yt,qt as Xt,r as Zt,rn as Qt,rt as $t,s as W,sn as en,st as tn,t as G,tn as nn,tt as rn,u as an,un as on,ut as sn,v as K,vn as cn,vt as ln,w as un,wn as dn,wt as fn,x as q,xn as pn,xt as J,y as Y,yn as X,yt as mn,z as hn,zt as gn}from"./_plugin-vue_export-helper-D62Ebo7D.js";import{C as _n,E as Z,S as vn,T as yn,_ as eee,a as bn,b as xn,c as Sn,d as Cn,f as wn,g as Tn,h as En,i as Dn,l as On,m as kn,n as An,o as jn,p as Mn,r as Nn,s as Pn,t as Q,u as Fn,v as In,w as Ln,x as Rn,y as zn}from"./UiButton-DvucBdmd.js";import{$ as Bn,A as Vn,B as Hn,C as Un,D as Wn,E as Gn,F as Kn,G as qn,H as Jn,I as Yn,J as Xn,K as Zn,L as Qn,M as $n,N as er,O as tr,P as nr,Q as rr,R as ir,S as ar,T as or,U as sr,V as cr,W as lr,X as ur,Y as tee,Z as dr,_ as nee,a as fr,at as pr,b as mr,c as hr,ct as gr,d as _r,et as vr,g as yr,h as br,i as xr,it as Sr,j as Cr,k as wr,l as Tr,m as Er,n as Dr,nt as Or,ot as kr,p as Ar,q as jr,r as Mr,rt as Nr,s as Pr,st as Fr,t as Ir,tt as Lr,u as Rr,v as zr,w as Br,x as Vr,y as Hr,z as Ur}from"./dist-DzoDV6Eh.js";import{t as Wr}from"./UiPanel-DtI4DFYT.js";import{_ as Gr,a as ree,b as Kr,c as qr,d as Jr,f as Yr,g as Xr,h as Zr,i as Qr,l as $r,m as ei,o as ti,p as ni,s as ri,u as ii,v as ai,x as oi,y as si}from"./github-emoji-CXJ5RSZS.js";import{a as ci,c as li,d as ui,i as di,l as fi,n as pi,o as mi,r as hi,s as gi,t as _i,u as vi}from"./UiViewerPage-aHNgiSjO.js";import{t as yi}from"./preload-helper-BLdHbfdN.js";import{t as bi}from"./external-link-lkcxItwM.js";import{At as xi,C as Si,Ct as Ci,Et as wi,F as Ti,Ft as Ei,L as Di,Lt as Oi,M as ki,Nt as Ai,O as ji,Ot as Mi,Pt as Ni,Q as Pi,Rt as Fi,X as Ii,Y as Li,Z as Ri,a as zi,dt as Bi,jt as Vi,kt as Hi,mt as iee,ot as Ui,q as Wi,t as Gi,zt as Ki}from"./dist-23D313r2.js";import{n as aee,t as oee}from"./ImageViewport-BT_ftU4z.js";var see=e({BaseTransition:()=>Vt,BaseTransitionPropsValidators:()=>Zt,Comment:()=>Ot,DeprecationTypes:()=>null,EffectScope:()=>se,ErrorCodes:()=>st,ErrorTypeStrings:()=>Wt,Fragment:()=>W,KeepAlive:()=>ft,ReactiveEffect:()=>vt,Static:()=>Ft,Suspense:()=>an,Teleport:()=>ht,Text:()=>bt,TrackOpTypes:()=>nn,Transition:()=>Nn,TransitionGroup:()=>Dn,TriggerOpTypes:()=>Ht,VueElement:()=>bn,assertNumber:()=>qt,callWithAsyncErrorHandling:()=>Rt,callWithErrorHandling:()=>Et,camelize:()=>A,capitalize:()=>ae,cloneVNode:()=>Ct,compatUtils:()=>null,compile:()=>qi,computed:()=>z,createApp:()=>jn,createBlock:()=>Y,createCommentVNode:()=>B,createElementBlock:()=>q,createElementVNode:()=>K,createHydrationRenderer:()=>Ue,createPropsRestProxy:()=>de,createRenderer:()=>un,createSSRApp:()=>Pn,createSlots:()=>Ge,createStaticVNode:()=>ge,createTextVNode:()=>N,createVNode:()=>I,customRef:()=>Qt,defineAsyncComponent:()=>Nt,defineComponent:()=>M,defineCustomElement:()=>Sn,defineEmits:()=>jt,defineExpose:()=>je,defineModel:()=>Ne,defineOptions:()=>Le,defineProps:()=>ye,defineSSRCustomElement:()=>On,defineSlots:()=>we,devtools:()=>ke,effect:()=>kt,effectScope:()=>ct,getCurrentInstance:()=>Ve,getCurrentScope:()=>Gt,getCurrentWatcher:()=>en,getTransitionRawChildren:()=>hn,guardReactiveProps:()=>le,h:()=>Ye,handleError:()=>Se,hasInjectionContext:()=>Je,hydrate:()=>Fn,hydrateOnIdle:()=>Ze,hydrateOnInteraction:()=>be,hydrateOnMediaQuery:()=>De,hydrateOnVisible:()=>Yt,initCustomFormatter:()=>Ee,initDirectivesForSSR:()=>Cn,inject:()=>tt,isMemoSame:()=>$e,isProxy:()=>pt,isReactive:()=>It,isReadonly:()=>on,isRef:()=>gt,isRuntimeOnly:()=>rt,isShallow:()=>xt,isVNode:()=>ze,markRaw:()=>U,mergeDefaults:()=>oe,mergeModels:()=>yt,mergeProps:()=>rn,nextTick:()=>Ut,nodeOps:()=>wn,normalizeClass:()=>O,normalizeProps:()=>ie,normalizeStyle:()=>k,onActivated:()=>$t,onBeforeMount:()=>At,onBeforeUnmount:()=>lt,onBeforeUpdate:()=>Kt,onDeactivated:()=>tn,onErrorCaptured:()=>mt,onMounted:()=>Lt,onRenderTracked:()=>sn,onRenderTriggered:()=>_t,onScopeDispose:()=>zt,onServerPrefetch:()=>St,onUnmounted:()=>Jt,onUpdated:()=>Bt,onWatcherCleanup:()=>Dt,openBlock:()=>V,patchProp:()=>Mn,popScopeId:()=>Tt,provide:()=>ot,proxyRefs:()=>wt,pushScopeId:()=>ln,queuePostFlushCb:()=>mn,reactive:()=>at,readonly:()=>cn,ref:()=>X,registerRuntimeCompiler:()=>dt,render:()=>kn,renderList:()=>J,renderSlot:()=>L,resolveComponent:()=>pe,resolveDirective:()=>fn,resolveDynamicComponent:()=>qe,resolveFilter:()=>null,resolveTransitionHooks:()=>ve,setBlockTracking:()=>he,setDevtoolsHook:()=>Ie,setTransitionHooks:()=>Pt,shallowReactive:()=>ut,shallowReadonly:()=>pn,shallowRef:()=>We,ssrContextKey:()=>ce,ssrUtils:()=>Mt,stop:()=>fe,toDisplayString:()=>j,toHandlerKey:()=>re,toHandlers:()=>Me,toRaw:()=>dn,toRef:()=>Ke,toRefs:()=>_e,toValue:()=>me,transformVNodeArgs:()=>Pe,triggerRef:()=>Fe,unref:()=>H,useAttrs:()=>Re,useCssModule:()=>En,useCssVars:()=>Tn,useHost:()=>eee,useId:()=>P,useModel:()=>Te,useSSRContext:()=>Ae,useShadowRoot:()=>In,useSlots:()=>He,useTemplateRef:()=>gn,useTransitionState:()=>ue,vModelCheckbox:()=>zn,vModelDynamic:()=>xn,vModelRadio:()=>Rn,vModelSelect:()=>vn,vModelText:()=>_n,vShow:()=>Ln,version:()=>Xe,warn:()=>Ce,watch:()=>R,watchEffect:()=>Qe,watchPostEffect:()=>xe,watchSyncEffect:()=>Oe,withAsyncContext:()=>Xt,withCtx:()=>F,withDefaults:()=>nt,withDirectives:()=>et,withKeys:()=>yn,withMemo:()=>it,withModifiers:()=>Z,withScopeId:()=>Be}),qi=()=>{},Ji=e=>e.startsWith(`/`);function Yi(e){return typeof e==`object`||`displayName`in e||`props`in e||`__vccOpts`in e}function Xi(e){return e.__esModule||e[Symbol.toStringTag]===`Module`||e.default&&Yi(e.default)}var Zi=Object.assign;function Qi(e,t){let n={};for(let r in t){let i=t[r];n[r]=ea(i)?i.map(e):e(i)}return n}var $i=()=>{},ea=Array.isArray;function ta(e,t){let n={};for(let r in e)n[r]=r in t?t[r]:e[r];return n}var na=Symbol(``);function ra(e,t){return Zi(Error(),{type:e,[na]:!0},t)}function ia(e,t){return e instanceof Error&&na in e&&(t==null||!!(e.type&t))}var aa=Symbol(``),oa=Symbol(``),sa=Symbol(``),ca=Symbol(``),la=Symbol(``);function ua(){return tt(sa)}function da(e){return tt(ca)}var fa=typeof document<`u`,pa=/#/g,ma=/&/g,ha=/\//g,ga=/=/g,_a=/\?/g,va=/\+/g,ya=/%5B/g,ba=/%5D/g,xa=/%5E/g,Sa=/%60/g,Ca=/%7B/g,wa=/%7C/g,Ta=/%7D/g,Ea=/%20/g;function Da(e){return e==null?``:encodeURI(``+e).replace(wa,`|`).replace(ya,`[`).replace(ba,`]`)}function Oa(e){return Da(e).replace(Ca,`{`).replace(Ta,`}`).replace(xa,`^`)}function ka(e){return Da(e).replace(va,`%2B`).replace(Ea,`+`).replace(pa,`%23`).replace(ma,`%26`).replace(Sa,"`").replace(Ca,`{`).replace(Ta,`}`).replace(xa,`^`)}function Aa(e){return ka(e).replace(ga,`%3D`)}function ja(e){return Da(e).replace(pa,`%23`).replace(_a,`%3F`)}function Ma(e){return ja(e).replace(ha,`%2F`)}function Na(e){if(e==null)return null;try{return decodeURIComponent(``+e)}catch{}return``+e}var Pa=/\/$/,Fa=e=>e.replace(Pa,``);function Ia(e,t,n=`/`){let r,i={},a=``,o=``,s=t.indexOf(`#`),c=t.indexOf(`?`);return c=s>=0&&c>s?-1:c,c>=0&&(r=t.slice(0,c),a=t.slice(c,s>0?s:t.length),i=e(a.slice(1))),s>=0&&(r||=t.slice(0,s),o=t.slice(s,t.length)),r=Wa(r??t,n),{fullPath:r+a+o,path:r,query:i,hash:Na(o)}}function La(e,t){let n=t.query?e(t.query):``;return t.path+(n&&`?`)+n+(t.hash||``)}function Ra(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||`/`}function za(e,t,n){let r=t.matched.length-1,i=n.matched.length-1;return r>-1&&r===i&&Ba(t.matched[r],n.matched[i])&&Va(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Ba(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Va(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Ha(e[n],t[n]))return!1;return!0}function Ha(e,t){return ea(e)?Ua(e,t):ea(t)?Ua(t,e):(e&&e.valueOf())===(t&&t.valueOf())}function Ua(e,t){return ea(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e.length===1&&e[0]===t}function Wa(e,t){if(Ji(e))return e;if(!e)return t;let n=t.split(`/`),r=e.split(`/`),i=r[r.length-1];(i===`..`||i===`.`)&&r.push(``);let a=n.length-1,o,s;for(o=0;o<r.length;o++)if(s=r[o],s!==`.`){if(s===`..`)a>1&&a--;else break}return n.slice(0,a).join(`/`)+`/`+r.slice(o).join(`/`)}var Ga={path:`/`,name:void 0,params:{},query:{},hash:``,fullPath:`/`,matched:[],meta:{},redirectedFrom:void 0};function Ka(e){if(!e){if(fa){let t=document.querySelector(`base`);e=t&&t.getAttribute(`href`)||`/`,e=e.replace(/^\w+:\/\/[^/]+/,``)}else e=`/`}return e[0]!==`/`&&e[0]!==`#`&&(e=`/`+e),Fa(e)}var qa=/^[^#]+#/;function Ja(e,t){return e.replace(qa,`#`)+t}function Ya(e,t){let n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}var Xa=()=>history.scrollRestoration===`manual`?{left:window.scrollX,top:window.scrollY}:null;function Za(e){let t;if(`el`in e){let n=e.el,r=typeof n==`string`&&n.startsWith(`#`),i=typeof n==`string`?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!i)return;t=Ya(i,e)}else t=e;`scrollBehavior`in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left==null?window.scrollX:t.left,t.top==null?window.scrollY:t.top)}function Qa(e,t){return(history.state?history.state.position-t:-1)+e}var $a=new Map;function eo(e){$a.set(e,Xa())}function to(e){let t=$a.get(e);return $a.delete(e),t}function no(e){return typeof e==`string`||e&&typeof e==`object`}function ro(e){return typeof e==`string`||typeof e==`symbol`}function io(e){let t={};if(e===``||e===`?`)return t;let n=(e[0]===`?`?e.slice(1):e).split(`&`);for(let e=0;e<n.length;++e){let r=n[e].replace(va,` `),i=r.indexOf(`=`),a=Na(i<0?r:r.slice(0,i)),o=i<0?null:Na(r.slice(i+1));if(a in t){let e=t[a];ea(e)||(e=t[a]=[e]),e.push(o)}else t[a]=o}return t}function ao(e){let t=``;for(let n in e){let r=e[n];n=Aa(n),r==null?r!==void 0&&(t+=(t.length?`&`:``)+n):(ea(r)?r.map(e=>e&&ka(e)):[r&&ka(r)]).forEach(e=>{e!==void 0&&(t+=(t.length?`&`:``)+n,e!=null&&(t+=`=`+e))})}return t}function oo(e){let t={};for(let n in e){let r=e[n];r!==void 0&&(t[n]=ea(r)?r.map(e=>e==null?null:``+e):r==null?r:``+r)}return t}function so(){let e=[];function t(t){return e.push(t),()=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function co(e,t,n){let r=e.value;if(!r)return;let i=r,a=()=>{i[t].delete(n)};Jt(a),tn(a),$t(()=>{let r=e.value;r&&(i=r),i[t].add(n)}),i[t].add(n)}function lo(e){co(tt(aa,{}),`leaveGuards`,e)}function uo(e){co(tt(aa,{}),`updateGuards`,e)}function fo(e,t,n,r,i,a=e=>e()){let o=r&&(r.enterCallbacks[i]=r.enterCallbacks[i]||[]);return()=>new Promise((s,c)=>{let l=e=>{e===!1?c(ra(4,{from:n,to:t})):e instanceof Error?c(e):no(e)?c(ra(2,{from:t,to:e})):(o&&r.enterCallbacks[i]===o&&typeof e==`function`&&o.push(e),s())},u=a(()=>e.call(r&&r.instances[i],t,n,l)),d=Promise.resolve(u);e.length<3&&(d=d.then(l)),d.catch(e=>c(e))})}function po(e,t,n,r,i=e=>e()){let a=[];for(let o of e)for(let e in o.components){let s=o.components[e];if(t===`beforeRouteEnter`||o.instances[e]){if(Yi(s)){let c=(s.__vccOpts||s)[t];c&&a.push(fo(c,n,r,o,e,i))}else{let c=s();a.push(()=>c.then(a=>{if(!a)throw Error(`Couldn't resolve component "${e}" at "${o.path}"`);let s=Xi(a)?a.default:a;o.mods[e]=a,o.components[e]=s;let c=(s.__vccOpts||s)[t];return c&&fo(c,n,r,o,e,i)()}))}}}return a}function mo(e,t){let n=[],r=[],i=[],a=Math.max(t.matched.length,e.matched.length);for(let o=0;o<a;o++){let a=t.matched[o];a&&(e.matched.find(e=>Ba(e,a))?r.push(a):n.push(a));let s=e.matched[o];s&&(t.matched.find(e=>Ba(e,s))||i.push(s))}return[n,r,i]}var ho=()=>location.protocol+`//`+location.host;function go(e,t){let{pathname:n,search:r,hash:i}=t,a=e.indexOf(`#`);if(a>-1){let t=i.includes(e.slice(a))?e.slice(a).length:1,n=i.slice(t);return n[0]!==`/`&&(n=`/`+n),Ra(n,``)}return Ra(n,e)+r+i}function _o(e,t,n,r){let i=[],a=[],o=null,s=({state:a})=>{let s=go(e,location),c=n.value,l=t.value,u=0;if(a){if(n.value=s,t.value=a,o&&o===c){o=null;return}u=l?a.position-l.position:0}else r(s);i.forEach(e=>{e(n.value,c,{delta:u,type:`pop`,direction:u?u>0?`forward`:`back`:``})})};function c(){o=n.value}function l(e){i.push(e);let t=()=>{let t=i.indexOf(e);t>-1&&i.splice(t,1)};return a.push(t),t}function u(){let{history:e}=window;e.state&&e.replaceState(Zi({},e.state,{scroll:Xa()}),``)}function d(){for(let e of a)e();a=[],window.removeEventListener(`popstate`,s),window.removeEventListener(`pagehide`,u)}return window.addEventListener(`popstate`,s),window.addEventListener(`pagehide`,u),{pauseListeners:c,listen:l,destroy:d}}function vo(e,t,n,r=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:null}}function yo(e){let{history:t,location:n}=window,r={value:go(e,n)},i={value:t.state};i.value||a(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function a(r,a,o){let s=e.indexOf(`#`),c=s>-1?(n.host&&document.querySelector(`base`)?e:e.slice(s))+r:ho()+e+r;try{t[o?`replaceState`:`pushState`](a,``,c),i.value=a}catch(e){console.error(e),n[o?`replace`:`assign`](c)}}function o(e,n){a(e,Zi({},t.state,vo(i.value.back,e,i.value.forward,!0),n,{position:i.value.position}),!0),r.value=e}function s(e,n){let o=Zi({},i.value,t.state,{forward:e,scroll:Xa()});a(o.current,o,!0),a(e,Zi({},vo(r.value,e,null),{position:o.position+1},n),!1),r.value=e}return{location:r,state:i,push:s,replace:o}}function bo(e){e=Ka(e);let t=yo(e),n=_o(e,t.state,t.location,t.replace);function r(e,t=!0){t||n.pauseListeners(),history.go(e)}let i=Zi({location:``,base:e,go:r,createHref:Ja.bind(null,e)},t,n);return Object.defineProperty(i,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(i,"state",{enumerable:!0,get:()=>t.state.value}),i}var xo={type:0,value:``},So=/[a-zA-Z0-9_]/;function Co(e){if(!e)return[[]];if(e===`/`)return[[xo]];if(!Ji(e))throw Error(`Invalid path "${e}"`);function t(e){throw Error(`ERR (${n})/"${l}": ${e}`)}let n=0,r=n,i=[],a;function o(){a&&i.push(a),a=[]}let s=0,c,l=``,u=``;function d(){l&&=(n===0?a.push({type:0,value:l}):n===1||n===2||n===3?(a.length>1&&(c===`*`||c===`+`)&&t(`A repeatable param (${l}) must be alone in its segment. eg: '/:ids+.`),a.push({type:1,value:l,regexp:u,repeatable:c===`*`||c===`+`,optional:c===`*`||c===`?`})):t(`Invalid state to consume buffer`),``)}function f(){l+=c}for(;s<e.length;)switch(c=e[s++],n){case 0:c===`\\`?(r=n,n=4):c===`/`?(l&&d(),o()):c===`:`?(d(),n=1):f();break;case 4:f(),n=r;break;case 1:c===`(`?n=2:So.test(c)?f():(d(),n=0,c!==`*`&&c!==`?`&&c!==`+`&&s--);break;case 2:c===`)`?u[u.length-1]==`\\`?u=u.slice(0,-1)+c:n=3:u+=c;break;case 3:d(),n=0,c!==`*`&&c!==`?`&&c!==`+`&&s--,u=``;break;default:t(`Unknown state`)}return n===2&&t(`Unfinished custom RegExp for param "${l}"`),d(),o(),i}var wo=`[^/]+?`,To={sensitive:!1,strict:!1,start:!0,end:!0},Eo=/[.+*?^${}()[\]/\\]/g;function Do(e,t){let n=Zi({},To,t),r=[],i=n.start?`^`:``,a=[];for(let t of e){let e=t.length?[]:[90];n.strict&&!t.length&&(i+=`/`);for(let r=0;r<t.length;r++){let o=t[r],s=40+(n.sensitive?.25:0);if(o.type===0)r||(i+=`/`),i+=o.value.replace(Eo,`\\$&`),s+=40;else if(o.type===1){let{value:e,repeatable:n,optional:c,regexp:l}=o;a.push({name:e,repeatable:n,optional:c});let u=l||wo;if(u!==wo){s+=10;try{RegExp(`(${u})`)}catch(t){throw Error(`Invalid custom RegExp for param "${e}" (${u}): `+t.message)}}let d=n?`((?:${u})(?:/(?:${u}))*)`:`(${u})`;r||(d=c&&t.length<2?`(?:/${d})`:`/`+d),c&&(d+=`?`),i+=d,s+=20,c&&(s+=-8),n&&(s+=-20),u===`.*`&&(s+=-50)}e.push(s)}r.push(e)}if(n.strict&&n.end){let e=r.length-1;r[e][r[e].length-1]+=.7000000000000001}n.strict||(i+=`/?`),n.end?i+=`$`:n.strict&&!i.endsWith(`/`)&&(i+=`(?:/|$)`);let o=new RegExp(i,n.sensitive?``:`i`);function s(e){let t=e.match(o),n={};if(!t)return null;for(let e=1;e<t.length;e++){let r=t[e]||``,i=a[e-1];n[i.name]=r&&i.repeatable?r.split(`/`):r}return n}function c(t){let n=``,r=!1;for(let i of e){r&&n.endsWith(`/`)||(n+=`/`),r=!1;for(let e of i)if(e.type===0)n+=e.value;else if(e.type===1){let{value:a,repeatable:o,optional:s}=e,c=a in t?t[a]:``;if(ea(c)&&!o)throw Error(`Provided param "${a}" is an array but it is not repeatable (* or + modifiers)`);let l=ea(c)?c.join(`/`):c;if(!l){if(s)i.length<2&&(n.endsWith(`/`)?n=n.slice(0,-1):r=!0);else throw Error(`Missing required param "${a}"`)}n+=l}}return n||`/`}return{re:o,score:r,keys:a,parse:s,stringify:c}}function Oo(e,t){let n=0;for(;n<e.length&&n<t.length;){let r=t[n]-e[n];if(r)return r;n++}return e.length<t.length?e.length===1&&e[0]===80?-1:1:e.length>t.length?t.length===1&&t[0]===80?1:-1:0}function ko(e,t){let n=0,r=e.score,i=t.score;for(;n<r.length&&n<i.length;){let e=Oo(r[n],i[n]);if(e)return e;n++}if(Math.abs(i.length-r.length)===1){if(Ao(r))return 1;if(Ao(i))return-1}return i.length-r.length}function Ao(e){let t=e[e.length-1];return e.length>0&&t[t.length-1]<0}var jo={strict:!1,end:!0,sensitive:!1};function Mo(e,t,n){let r=Zi(Do(Co(e.path),n),{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function No(e,t){let n=[],r=new Map;t=ta(jo,t);function i(e){return r.get(e)}function a(e,n,r){let i=!r,s=Fo(e);s.aliasOf=r&&r.record;let l=ta(t,e),u=[s];if(`alias`in e){let t=typeof e.alias==`string`?[e.alias]:e.alias;for(let e of t)u.push(Fo(Zi({},s,{components:r?r.record.components:s.components,path:e,aliasOf:r?r.record:s})))}let d,f;for(let t of u){let{path:u}=t;if(n&&!Ji(u)){let e=n.record.path,r=e[e.length-1]===`/`?``:`/`;t.path=n.record.path+(u&&r+u)}if(d=Mo(t,n,l),r?r.alias.push(d):(f||=d,f!==d&&f.alias.push(d),i&&e.name&&!Io(d)&&o(e.name)),Lo(d)&&c(d),s.children){let e=s.children;for(let t=0;t<e.length;t++)a(e[t],d,r&&r.children[t])}r||=d}return f?()=>{o(f)}:$i}function o(e){if(ro(e)){let t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(o),t.alias.forEach(o))}else{let t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(o),e.alias.forEach(o))}}function s(){return n}function c(e){let t=uee(e,n);n.splice(t,0,e),e.record.name&&!Io(e)&&r.set(e.record.name,e)}function l(e,t){let i,a={},o,s;if(`name`in e&&e.name){if(i=r.get(e.name),!i)throw ra(1,{location:e});s=i.record.name,a=Zi(Po(t.params,i.keys.filter(e=>!e.optional).concat(i.parent?i.parent.keys.filter(e=>e.optional):[]).map(e=>e.name)),e.params&&Po(e.params,i.keys.map(e=>e.name))),o=i.stringify(a)}else if(e.path!=null)o=e.path,i=n.find(e=>e.re.test(o)),i&&(a=i.parse(o),s=i.record.name,i.keys.forEach(e=>{e.optional&&!a[e.name]&&delete a[e.name]}));else{if(i=t.name?r.get(t.name):n.find(e=>e.re.test(t.path)),!i)throw ra(1,{location:e,currentLocation:t});s=i.record.name,a=Zi({},t.params,e.params),o=i.stringify(a)}let c=[],l=i;for(;l;)c.unshift(l.record),l=l.parent;return{name:s,path:o,params:a,matched:c,meta:lee(c)}}e.forEach(e=>a(e));function u(){n.length=0,r.clear()}return{addRoute:a,resolve:l,removeRoute:o,clearRoutes:u,getRoutes:s,getRecordMatcher:i}}function Po(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function Fo(e){let t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:cee(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:`components`in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function cee(e){let t={},n=e.props||!1;if(`component`in e)t.default=n;else for(let r in e.components)t[r]=typeof n==`object`?n[r]:n;return t}function Io(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function lee(e){return e.reduce((e,t)=>Zi(e,t.meta),{})}function uee(e,t){let n=0,r=t.length;for(;n!==r;){let i=n+r>>1;ko(e,t[i])<0?r=i:n=i+1}let i=dee(e);return i&&(r=t.lastIndexOf(i,r-1)),r}function dee(e){let t=e;for(;t=t.parent;)if(Lo(t)&&ko(e,t)===0)return t}function Lo({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Ro(e){let t=tt(sa),n=tt(ca),r=z(()=>{let n=H(e.to);return t.resolve(n)}),i=z(()=>{let{matched:e}=r.value,{length:t}=e,i=e[t-1],a=n.matched;if(!i||!a.length)return-1;let o=a.findIndex(Ba.bind(null,i));if(o>-1)return o;let s=zo(e[t-2]);return t>1&&zo(i)===s&&a[a.length-1].path!==s?a.findIndex(Ba.bind(null,e[t-2])):o}),a=z(()=>i.value>-1&&hee(n.params,r.value.params)),o=z(()=>i.value>-1&&i.value===n.matched.length-1&&Va(n.params,r.value.params));function s(n={}){if(mee(n)){let n=t[H(e.replace)?`replace`:`push`](H(e.to)).catch($i);return e.viewTransition&&typeof document<`u`&&`startViewTransition`in document&&document.startViewTransition(()=>n),n}return Promise.resolve()}return{route:r,href:z(()=>r.value.href),isActive:a,isExactActive:o,navigate:s}}function fee(e){return e.length===1?e[0]:e}var pee=M({name:`RouterLink`,compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:`page`},viewTransition:Boolean},useLink:Ro,setup(e,{slots:t}){let n=at(Ro(e)),{options:r}=tt(sa),i=z(()=>({[Bo(e.activeClass,r.linkActiveClass,`router-link-active`)]:n.isActive,[Bo(e.exactActiveClass,r.linkExactActiveClass,`router-link-exact-active`)]:n.isExactActive}));return()=>{let r=t.default&&fee(t.default(n));return e.custom?r:Ye(`a`,{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:i.value},r)}}});function mee(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&(e.button===void 0||e.button===0)){if(e.currentTarget&&e.currentTarget.getAttribute){let t=e.currentTarget.getAttribute(`target`);if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function hee(e,t){for(let n in t){let r=t[n],i=e[n];if(ea(r)){if(!ea(i)||i.length!==r.length||r.some((e,t)=>e.valueOf()!==i[t].valueOf()))return!1}else if(r!==i)return!1}return!0}function zo(e){return e?e.aliasOf?e.aliasOf.path:e.path:``}var Bo=(e,t,n)=>e??t??n,gee=M({name:`RouterView`,inheritAttrs:!1,props:{name:{type:String,default:`default`},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){let r=tt(la),i=z(()=>e.route||r.value),a=tt(oa,0),o=z(()=>{let e=H(a),{matched:t}=i.value,n;for(;(n=t[e])&&!n.components;)e++;return e}),s=z(()=>i.value.matched[o.value]);ot(oa,z(()=>o.value+1)),ot(aa,s),ot(la,i);let c=X();return R(()=>[c.value,s.value,e.name],([e,t,n],[r,i,a])=>{t&&(t.instances[n]=e,i&&i!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=i.leaveGuards),t.updateGuards.size||(t.updateGuards=i.updateGuards))),!e||!t||i&&Ba(t,i)&&r||(t.enterCallbacks[n]||[]).forEach(t=>t(e))},{flush:`post`}),()=>{let r=i.value,a=e.name,o=s.value,l=o&&o.components[a];if(!l)return Vo(n.default,{Component:l,route:r});let u=o.props[a],d=u?u===!0?r.params:typeof u==`function`?u(r):u:null,f=Ye(l,Zi({},d,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(o.instances[a]=null)},ref:c}));return Vo(n.default,{Component:f,route:r})||f}}});function Vo(e,t){if(!e)return null;let n=e(t);return n.length===1?n[0]:n}var _ee=gee;function vee(e){let t=No(e.routes,e),n=e.parseQuery||io,r=e.stringifyQuery||ao,i=e.history,a=so(),o=so(),s=so(),c=We(Ga),l=We(0),u=Ga;fa&&e.scrollBehavior&&`scrollRestoration`in history&&(history.scrollRestoration=`manual`);let d=Qi.bind(null,e=>``+e),f=Qi.bind(null,Ma),p=Qi.bind(null,Na);function m(e,n){let r,i;ro(e)?(r=t.getRecordMatcher(e),i=n):i=e;let a=t.addRoute(i,r);return l.value++,()=>{a(),l.value++}}function h(e){let n=t.getRecordMatcher(e);n&&(t.removeRoute(n),l.value++)}function g(){t.clearRoutes(),l.value++}function _(){return t.getRoutes().map(e=>e.record)}function v(e){return!!t.getRecordMatcher(e)}function y(e,a){if(l.value,typeof e==`string`){a||=e.startsWith(`/`)?Ga:c.value;let r=Ia(n,e,a.path),o=t.resolve({path:r.path},a),s=i.createHref(r.fullPath);return Zi(r,o,{params:p(o.params),redirectedFrom:void 0,href:s})}a=Zi({},a||(e.path!=null&&e.path.startsWith(`/`)&&!(`name`in e&&e.name)?Ga:c.value));let o;if(e.path!=null)o=Zi({},e,{path:Ia(n,e.path,a.path).path});else{let t=Zi({},e.params);for(let e in t)t[e]??delete t[e];o=Zi({},e,{params:f(t)}),a.params=f(a.params)}let s=t.resolve(o,a),u=e.hash||``;s.params=d(p(s.params));let m=La(r,Zi({},e,{hash:Oa(u),path:s.path})),h=i.createHref(m);return Zi({fullPath:m,hash:u,query:r===ao?oo(e.query):e.query||{}},s,{redirectedFrom:void 0,href:h})}function b(e){return typeof e==`string`?Ia(n,e,c.value.path):Zi({},e)}function x(e,t){if(u!==e)return ra(8,{from:t,to:e})}function S(e){return T(e)}function C(e){return S(Zi(b(e),{replace:!0}))}function w(e,t){let n=e.matched[e.matched.length-1];if(n&&n.redirect){let{redirect:r}=n,i=typeof r==`function`?r(e,t):r;return typeof i==`string`&&(i=i.includes(`?`)||i.includes(`#`)?i=b(i):{path:i},i.params={}),Zi({query:e.query,hash:e.hash,params:i.path==null?e.params:{}},i)}}function T(e,t){let n=u=y(e),i=c.value,a=e.state,o=e.force,s=e.replace===!0,l=w(n,i);if(l)return T(Zi(b(l),{state:typeof l==`object`?Zi({},a,l.state):a,force:o,replace:s}),t||n);let d=n;d.redirectedFrom=t;let f;return!o&&za(r,i,n)&&(f=ra(16,{to:d,from:i}),se(i,i,!0,!1)),(f?Promise.resolve(f):te(d,i)).catch(e=>ia(e)?ia(e,2)?e:oe(e):ae(e,d,i)).then(e=>{if(e){if(ia(e,2))return T(Zi({replace:s},b(e.to),{state:typeof e.to==`object`?Zi({},a,e.to.state):a,force:o}),t||d)}else e=ne(d,i,!0,s,a);return D(d,i,e),e})}function ee(e,t){let n=x(e,t);return n?Promise.reject(n):Promise.resolve()}function E(e){let t=le.values().next().value;return t&&typeof t.runWithContext==`function`?t.runWithContext(e):e()}function te(e,t){let n,[r,i,s]=mo(e,t);n=po(r.reverse(),`beforeRouteLeave`,e,t);for(let i of r)i.leaveGuards.forEach(r=>{n.push(fo(r,e,t))});let c=ee.bind(null,e,t);return n.push(c),de(n).then(()=>{n=[];for(let r of a.list())n.push(fo(r,e,t));return n.push(c),de(n)}).then(()=>{n=po(i,`beforeRouteUpdate`,e,t);for(let r of i)r.updateGuards.forEach(r=>{n.push(fo(r,e,t))});return n.push(c),de(n)}).then(()=>{n=[];for(let r of s)if(r.beforeEnter){if(ea(r.beforeEnter))for(let i of r.beforeEnter)n.push(fo(i,e,t));else n.push(fo(r.beforeEnter,e,t))}return n.push(c),de(n)}).then(()=>(e.matched.forEach(e=>e.enterCallbacks={}),n=po(s,`beforeRouteEnter`,e,t,E),n.push(c),de(n))).then(()=>{n=[];for(let r of o.list())n.push(fo(r,e,t));return n.push(c),de(n)}).catch(e=>ia(e,8)?e:Promise.reject(e))}function D(e,t,n){s.list().forEach(r=>E(()=>r(e,t,n)))}function ne(e,t,n,r,a){let o=x(e,t);if(o)return o;let s=t===Ga,l=fa?history.state:{};n&&(r||s?i.replace(e.fullPath,Zi({scroll:s&&l&&l.scroll},a)):i.push(e.fullPath,a)),c.value=e,se(e,t,n,s),oe()}let re;function ie(){re||=i.listen((e,t,n)=>{if(!ue.listening)return;let r=y(e),a=w(r,ue.currentRoute.value);if(a){T(Zi(a,{replace:!0,force:!0}),r).catch($i);return}u=r;let o=c.value;fa&&n.delta&&eo(Qa(o.fullPath,n.delta)),te(r,o).catch(e=>ia(e,12)?e:ia(e,2)?(T(Zi(b(e.to),{force:!0}),r).then(e=>{ia(e,20)&&!n.delta&&n.type===`pop`&&i.go(-1,!1)}).catch($i),Promise.reject()):(n.delta&&i.go(-n.delta,!1),ae(e,r,o))).then(e=>{e||=ne(r,o,!1),e&&(n.delta&&!ia(e,8)?i.go(-n.delta,!1):n.type===`pop`&&ia(e,20)&&i.go(-1,!1)),D(r,o,e)}).catch($i)})}let O=so(),k=so(),A;function ae(e,t,n){oe(e);let r=k.list();return r.length?r.forEach(r=>r(e,t,n)):console.error(e),Promise.reject(e)}function j(){return A&&c.value!==Ga?Promise.resolve():new Promise((e,t)=>{O.add([e,t])})}function oe(e){return A||(A=!e,ie(),O.list().forEach(([t,n])=>e?n(e):t()),O.reset()),e}function se(t,n,r,i){let{scrollBehavior:a}=e;if(!fa||!a)return Promise.resolve();let o=!r&&to(Qa(t.fullPath,0))||(i||!r)&&history.state&&history.state.scroll||null;return Ut().then(()=>a(t,n,o)).then(e=>t===c.value&&e&&Za(e)).catch(e=>t===c.value&&ae(e,t,n))}let M=e=>i.go(e),ce,le=new Set,ue={currentRoute:c,listening:!0,addRoute:m,removeRoute:h,clearRoutes:g,hasRoute:v,getRoutes:_,resolve:y,options:e,push:S,replace:C,go:M,back:()=>M(-1),forward:()=>M(1),beforeEach:a.add,beforeResolve:o.add,afterEach:s.add,onError:k.add,isReady:j,install(e){e.component(`RouterLink`,pee),e.component(`RouterView`,_ee),e.config.globalProperties.$router=ue,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>H(c)}),fa&&!ce&&c.value===Ga&&(ce=!0,S(i.location).catch(e=>{}));let t={};for(let e in Ga)Object.defineProperty(t,e,{get:()=>c.value[e],enumerable:!0});e.provide(sa,ue),e.provide(ca,ut(t)),e.provide(la,c);let n=e.unmount;le.add(e),e.unmount=function(){le.delete(e),le.size<1&&(u=Ga,re&&re(),re=null,c.value=Ga,ce=!1,A=!1),n()}}};function de(e){return e.reduce((e,t)=>e.then(()=>E(t)),Promise.resolve())}return ue}new URLSearchParams(location.search).get(`surface`)===`window`&&sessionStorage.setItem(`projector-surface`,`window`);var Ho=sessionStorage.getItem(`projector-surface`)===`window`;function Uo(e){return e===`error`?`danger`:e===`stopping`?`muted`:e===`idle`?`faint`:`success`}var Wo=G(M({__name:`UiLabel`,props:{for:{},as:{},inline:{type:Boolean},size:{},tone:{},spaceBefore:{},spaceAfter:{}},setup(e){let t=e;return(n,r)=>(V(),Y(qe(e.as??`label`),{class:`ui-label`,for:e.as===`span`?void 0:t.for,style:k({display:e.inline?`inline`:void 0,fontSize:e.size?`var(--fs-${e.size})`:void 0,color:e.tone===`muted`?`var(--muted)`:e.tone===`secondary`?`var(--text-2)`:void 0,marginTop:e.spaceBefore?`var(--sp-${e.spaceBefore})`:void 0,marginBottom:e.spaceAfter?`var(--sp-${e.spaceAfter})`:void 0})},{default:F(()=>[L(n.$slots,`default`,{},void 0,!0)]),_:3},8,[`for`,`style`]))}}),[[`__scopeId`,`data-v-78fc52d9`]]),Go={class:`choice-group`},Ko={class:`u-sr-only`},qo=G(M({__name:`UiChoiceGroup`,props:{label:{},name:{}},setup(e){let t=e,n=P(),r=z(()=>t.name??n);return(t,n)=>(V(),q(`fieldset`,Go,[K(`legend`,Ko,j(e.label),1),L(t.$slots,`default`,{groupName:r.value},void 0,!0)]))}}),[[`__scopeId`,`data-v-79e3996b`]]),Jo={class:`choice-row`},Yo={key:0},Xo=G(M({__name:`UiChoiceRow`,props:{title:{},description:{}},setup(e){return(t,n)=>(V(),q(`label`,Jo,[L(t.$slots,`default`),K(`span`,null,[K(`strong`,null,j(e.title),1),e.description?(V(),q(`small`,Yo,j(e.description),1)):B(``,!0)])]))}}),[[`__scopeId`,`data-v-d086c993`]]),Zo={class:`interface-settings`},Qo=[`value`],$o=G(M({__name:`InterfaceSettings`,setup(e){let n=P(),c=P(),l=X(`native`),d=X(`native`),f=X(`Ctrl+Alt+Space`),p=X(`Ctrl+Alt+Space`),m=X(),h=X(o()),g=X(h.value),{ready:v,busy:y,error:b,status:x,load:S,perform:C}=u(),{busy:w,error:T,status:ee,load:E,perform:ne}=u();w.value=!0;let re=z(()=>te.find(e=>e.id===h.value)?.description??``),ie=[{id:`native`,title:`Системное окно`,description:`Нативное поле поиска и список приложений. По умолчанию.`},{id:`window`,title:`Отдельное веб-окно`,description:`Интерфейс Projector без вкладок и адресной строки.`},{id:`browser`,title:`Страница в браузере`,description:`Обычная вкладка в вашем браузере.`}];async function O(e,t){let n=await fetch(`/api/launcher/settings`,{method:e,headers:{"Content-Type":`application/json`},body:t?JSON.stringify(t):void 0}),r=await n.json();if(!n.ok)throw Error(r.error);return r}Lt(()=>{A(),k()});async function k(){await S(async()=>{let e=await O(`GET`);l.value=d.value=e.mode,f.value=p.value=e.shortcut,m.value=e.hotkey},`Не удалось загрузить настройки`)}async function A(){await E(async()=>{let e=await fetch(`/api/appearance`),t=await e.json();if(!e.ok)throw Error(t.error||`Не удалось загрузить схему`);s(t.choice)&&(h.value=t.choice),g.value=h.value,D(h.value)},`Не удалось загрузить схему`)}async function ae(){let e=h.value;if(e===g.value)return;let t=g.value;D(e),await ne(async()=>{let t=await fetch(`/api/appearance`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({choice:e})}),n=await t.json();if(!t.ok)throw Error(n.error||`Не удалось сохранить схему`);g.value=e},{errorFallback:`Не удалось сохранить схему`,success:`Схема сохранена`,rollback:()=>{h.value=t,D(t)}})}async function oe(){await C(async()=>{let e=await O(`PUT`,{mode:l.value,shortcut:f.value});d.value=l.value,p.value=f.value,m.value=e.hotkey},{errorFallback:`Не удалось сохранить`,success:`Сохранено`})}async function se(){await C(async()=>{let e=await fetch(`/api/app/open`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({mode:l.value})}),t=await e.json();if(!e.ok)throw Error(t.error)},{errorFallback:`Не удалось открыть`})}return(e,o)=>(V(),q(`section`,Zo,[I(_,{as:`h2`,size:`sm`},{default:F(()=>[...o[3]||=[N(`Как открывать Projector`,-1)]]),_:1}),I(qo,{label:`Режим интерфейса`,disabled:!H(v)||H(y)},{default:F(({groupName:e})=>[(V(),q(W,null,J(ie,t=>I(Xo,{key:t.id,title:t.title,description:t.description},{default:F(()=>[I(a,{modelValue:l.value,"onUpdate:modelValue":o[0]||=e=>l.value=e,type:`radio`,name:e,value:t.id},null,8,[`modelValue`,`name`,`value`])]),_:2},1032,[`title`,`description`])),64))]),_:1},8,[`disabled`]),I(Wo,{size:`sm`,tone:`secondary`,"space-before":4,"space-after":2,for:H(n)},{default:F(()=>[...o[4]||=[N(`Горячая клавиша`,-1)]]),_:1},8,[`for`]),I(a,{as:`select`,id:H(n),modelValue:f.value,"onUpdate:modelValue":o[1]||=e=>f.value=e,disabled:!H(v)||H(y)},{default:F(()=>[...o[5]||=[K(`option`,{value:`Ctrl+Alt+Space`},`Ctrl + Alt + Space`,-1),K(`option`,{value:`Super+Space`},`Super + Space`,-1),K(`option`,{value:`Alt+Space`},`Alt + Space`,-1),K(`option`,{value:``},`Выключена`,-1)]]),_:1},8,[`id`,`modelValue`,`disabled`]),I(i,{class:`hint`,role:`status`},{default:F(()=>[f.value?m.value?.active?(V(),q(W,{key:1},[N(`Работает: `+j(m.value.shortcut)+`. Projector остаётся в трее после закрытия поиска.`,1)],64)):m.value?.supported?(V(),q(W,{key:2},[N(`Горячая клавиша пока не активна. Сохраните настройки или запустите Projector.`)],64)):(V(),q(W,{key:3},[o[6]||=N(`В этом окружении назначьте системный хоткей на команду `,-1),o[7]||=K(`code`,null,`projector toggle`,-1),o[8]||=N(`.`,-1)],64)):(V(),q(W,{key:0},[N(`Горячая клавиша выключена.`)],64))]),_:1}),I(r,{class:`actions`,align:`stretch`,wrap:``},{default:F(()=>[I(Q,{appearance:`solid`,disabled:!H(v)||H(y)||d.value===l.value&&p.value===f.value,onClick:oe},{default:F(()=>[...o[9]||=[N(` Сохранить `,-1)]]),_:1},8,[`disabled`]),I(Q,{disabled:!H(v)||H(y),onClick:se},{default:F(()=>[...o[10]||=[N(`Открыть выбранный режим`,-1)]]),_:1},8,[`disabled`])]),_:1}),K(`details`,null,[o[12]||=K(`summary`,null,`Системный хоткей и трей`,-1),I(i,{class:`hint`},{default:F(()=>[...o[11]||=[N(` Сочетание регистрируется в KDE или Windows; занятые клавиши не перехватываются. Клик по иконке в трее открывает поиск, меню даёт доступ к настройкам, перезапуску и выходу. `,-1)]]),_:1})]),H(b)||H(x)?(V(),Y(t,{key:0,role:`status`,tone:H(b)?`danger`:void 0},{default:F(()=>[N(j(H(b)||H(x)),1)]),_:1},8,[`tone`])):B(``,!0),I(_,{as:`h2`,size:`sm`,"space-before":4},{default:F(()=>[...o[13]||=[N(`Оформление`,-1)]]),_:1}),I(Wo,{for:H(c),"space-after":2},{default:F(()=>[...o[14]||=[N(`Цветовая схема`,-1)]]),_:1},8,[`for`]),I(a,{as:`select`,id:H(c),modelValue:h.value,"onUpdate:modelValue":o[2]||=e=>h.value=e,disabled:H(w),onChange:ae},{default:F(()=>[(V(!0),q(W,null,J(H(te),e=>(V(),q(`option`,{key:e.id,value:e.id},j(e.title),9,Qo))),128))]),_:1},8,[`id`,`modelValue`,`disabled`]),I(i,{class:`hint`},{default:F(()=>[N(j(re.value)+` Схема применяется сразу и сохраняется.`,1)]),_:1}),H(T)||H(ee)?(V(),Y(t,{key:1,role:`status`,tone:H(T)?`danger`:void 0},{default:F(()=>[N(j(H(T)||H(ee)),1)]),_:1},8,[`tone`])):B(``,!0)]))}}),[[`__scopeId`,`data-v-93ca9131`]]),es=[`type`],ts=G(M({__name:`UiActionRow`,props:{tone:{},type:{},separator:{},gap:{},fill:{type:Boolean,default:!0},interaction:{},padding:{},justify:{},radius:{}},setup(e){return(t,n)=>(V(),q(`button`,{class:O([`action-row`,[e.tone,e.separator,{tight:e.gap===2,intrinsic:!e.fill,selection:e.interaction===`selection`,"item-interaction":e.interaction===`item`}]]),style:k({"--action-row-padding":e.padding,"--action-row-gap":e.gap===1.5?`6px`:void 0,justifyContent:e.justify===`between`?`space-between`:void 0,borderRadius:e.radius===`none`?`0`:void 0}),type:e.type??`button`},[L(t.$slots,`default`,{},void 0,!0)],14,es))}}),[[`__scopeId`,`data-v-ad830872`]]),ns=[`aria-label`],rs={class:`panel-title`},is={key:0,"aria-hidden":`true`},as={key:0,class:`info-card`},os={class:`info-path`},ss={class:`info-state`},cs={key:0,class:`info-docker`},ls={class:`name`},us={key:0,class:`enter`,"aria-hidden":`true`},ds={key:1,class:`failure`,role:`alert`},fs={class:`failure-title`},ps={key:0},ms={key:1,class:`failure-empty`},hs=G(M({__name:`LaunchDetailPanel`,props:yt({item:{},actions:{},info:{},failure:{},loading:{type:Boolean}},{index:{required:!0},indexModifiers:{}}),emits:yt([`launch`],[`update:index`]),setup(e){let t=Te(e,`index`);return(n,r)=>(V(),q(`div`,{class:`actions-panel`,role:`listbox`,"aria-label":`Действия: ${e.item.name}`},[K(`div`,rs,[r[0]||=K(`span`,{class:`back`,"aria-hidden":`true`},`←`,-1),N(` `+j(e.item.name)+` `,1),e.loading?(V(),q(`span`,is,`⋯`)):B(``,!0)]),e.info?(V(),q(`div`,as,[K(`div`,os,j(e.info.path),1),K(`div`,ss,[I(ne,{class:`status-dot`,size:8,inline:``,shrink:``,tone:H(Uo)(e.info.state),"aria-hidden":`true`},null,8,[`tone`]),N(j(e.info.stateLabel),1),e.info.command?(V(),q(W,{key:0},[N(` · `+j(e.info.command),1)],64)):B(``,!0),e.info.url?(V(),q(W,{key:1},[N(` · `+j(e.info.url),1)],64)):B(``,!0)]),e.info.docker?(V(),q(`div`,cs,j(e.info.docker),1)):B(``,!0)])):B(``,!0),(V(!0),q(W,null,J(e.actions,(e,r)=>(V(),Y(ts,{interaction:`selection`,padding:`var(--sp-3)`,justify:`between`,key:`${e.id}:${e.arg??``}`,role:`option`,class:O([`result`,{selected:r===t.value}]),"aria-selected":r===t.value,tabindex:`-1`,onMousemove:e=>t.value=r,onClick:t=>n.$emit(`launch`,e)},{default:F(()=>[K(`span`,ls,j(e.title),1),r===t.value?(V(),q(`span`,us,`↵`)):B(``,!0)]),_:2},1032,[`class`,`aria-selected`,`onMousemove`,`onClick`]))),128)),e.failure?(V(),q(`div`,ds,[K(`div`,fs,[N(` «`+j(e.failure.command)+`» завершилась с ошибкой`,1),e.failure.exitCode===null?B(``,!0):(V(),q(W,{key:0},[N(` (код `+j(e.failure.exitCode)+`)`,1)],64))]),e.failure.output?(V(),q(`pre`,ps,j(e.failure.output),1)):(V(),q(`div`,ms,`Вывод терминала пуст.`))])):B(``,!0)],8,ns))}}),[[`__scopeId`,`data-v-db429f12`]]),gs={class:`favorite-folders`},_s={key:0},vs=[`value`],ys=G(M({__name:`FavoriteFolders`,setup(e){let t=X([]),n=X(``),r=X(``),o=X(``),{busy:s,error:c,status:l,run:d}=u();async function f(e,t=`GET`,n){let r={method:t};n&&(r.headers={"Content-Type":`application/json`},r.body=JSON.stringify(n));let i=await fetch(e,r),a=await i.json();if(!i.ok)throw Error(a.error);return a}async function p(){t.value=(await f(`/api/launcher/folders`)).folders,r.value||=t.value[0]??``}Lt(()=>d(p));async function m(e){let i=await f(`/api/launcher/folders`,`POST`,{path:e});return t.value=i.folders,r.value||=i.folders[0]??``,n.value=``,`Папка добавлена в избранные`}async function h(e){return t.value=(await f(`/api/launcher/folders`,`DELETE`,{path:e})).folders,r.value===e&&(r.value=t.value[0]??``),`Папка убрана из избранных`}async function g(e,t){let n=await f(`/api/launcher/folders/create`,`POST`,{folder:e,name:t});return o.value=``,window.location.assign(n.route),`Проект создан`}let v=E(`favorite-folders`,()=>({surface:`favorite-folders`}));return v.scope.registerCommand({id:`ide.folders.favorite.add`,title:`Добавить избранную папку`,description:`Делает папку избранной: её проекты идут в списке запуска первыми, в ней ищутся ещё не открытые папки, и в ней можно создавать новые проекты.`,arguments:{path:`абсолютный путь или ~/…`},enabled:()=>!s.value,run:e=>d(()=>m(String(b(e).path??n.value)))}),v.scope.registerCommand({id:`ide.folders.favorite.remove`,title:`Убрать избранную папку`,description:`Убирает папку из избранных; сама папка и её проекты не удаляются.`,arguments:{path:`путь избранной папки`},enabled:()=>!s.value&&t.value.length>0,run:e=>d(()=>h(String(b(e).path??``)))}),v.scope.registerCommand({id:`ide.folders.project.create`,title:`Создать проект в избранной папке`,description:`Создаёт новую пустую папку проекта внутри избранной папки, добавляет её в каталог и открывает воркспейс. Существующая папка не перезаписывается.`,arguments:{folder:`путь избранной папки`,name:`имя нового проекта`},enabled:()=>!s.value&&t.value.length>0,run:e=>{let t=b(e);return d(()=>g(String(t.folder??r.value),String(t.name??o.value)))}}),(e,u)=>(V(),q(`section`,gs,[I(_,{as:`h2`,size:`sm`},{default:F(()=>[...u[5]||=[N(`Избранные папки`,-1)]]),_:1}),I(i,{class:`hint`},{default:F(()=>[...u[6]||=[N(`Проекты из этих папок идут в списке запуска первыми, а ещё не открытые папки появляются в разделе «На диске». В поиске наберите `,-1),K(`code`,null,`new/имя`,-1),N(`, чтобы создать проект или открыть уже существующую папку.`,-1)]]),_:1}),t.value.length?(V(),q(`ul`,_s,[(V(!0),q(W,null,J(t.value,e=>(V(),q(`li`,{key:e},[K(`code`,null,j(e),1),I(Q,{disabled:H(s),onClick:t=>H(d)(()=>h(e))},{default:F(()=>[...u[7]||=[N(`Убрать`,-1)]]),_:1},8,[`disabled`,`onClick`])]))),128))])):B(``,!0),K(`form`,{class:`row`,onSubmit:u[1]||=Z(e=>H(d)(()=>m(n.value)),[`prevent`])},[I(a,{grow:``,modelValue:n.value,"onUpdate:modelValue":u[0]||=e=>n.value=e,"aria-label":`Путь к папке`,placeholder:`~/projects`,disabled:H(s)},null,8,[`modelValue`,`disabled`]),I(Q,{type:`submit`,disabled:H(s)||!n.value.trim()},{default:F(()=>[...u[8]||=[N(`Добавить`,-1)]]),_:1},8,[`disabled`])],32),t.value.length?(V(),q(`form`,{key:1,class:`row`,onSubmit:u[4]||=Z(e=>H(d)(()=>g(r.value,o.value)),[`prevent`])},[I(a,{grow:``,as:`select`,modelValue:r.value,"onUpdate:modelValue":u[2]||=e=>r.value=e,"aria-label":`Папка нового проекта`,disabled:H(s)},{default:F(()=>[(V(!0),q(W,null,J(t.value,e=>(V(),q(`option`,{key:e,value:e},j(e),9,vs))),128))]),_:1},8,[`modelValue`,`disabled`]),I(a,{grow:``,modelValue:o.value,"onUpdate:modelValue":u[3]||=e=>o.value=e,"aria-label":`Имя нового проекта`,placeholder:`новый-проект`,disabled:H(s)},null,8,[`modelValue`,`disabled`]),I(Q,{type:`submit`,appearance:`solid`,disabled:H(s)||!o.value.trim()},{default:F(()=>[...u[9]||=[N(`Создать проект`,-1)]]),_:1},8,[`disabled`])],32)):B(``,!0),H(c)||H(l)?(V(),q(`p`,{key:2,role:`status`,class:O({error:H(c)})},j(H(c)||H(l)),3)):B(``,!0)]))}}),[[`__scopeId`,`data-v-fd22e00c`]]);function bs(e,t,n={}){let r=(e,t,r,i)=>{if(n[e]===void 0)return t;let a=Number(n[e]);if(!/^\d+$/.test(n[e])||!Number.isSafeInteger(a)||a<r||a>i)throw Error(`Неверный параметр ${e}`);return a},i=r(`offset`,0,0,2**53-1),a=r(`limit`,1e3,1,1e3),o=Math.min(e.length,i+a);if(n.reveal&&i===0){let r=e.findIndex(e=>(t?`${t}/`:``)+e.name===n.reveal);r>=0&&(o=Math.min(e.length,Math.max(o,Math.ceil((r+1)/30)*30)))}return{offset:i,end:o,total:e.length,nextOffset:o<e.length?o:null}}var xs=268435456;function Ss(e,t){let n=(t/1024/1024).toLocaleString(`ru`,{maximumFractionDigits:1});return`Файл ${e.split(`/`).pop()||e} весит ${n} МБ. Редактор может открыть его медленно или подвиснуть. Открыть?`}function Cs(e){return e.slice(0,Math.max(0,e.lastIndexOf(`/`)))}function ws(e,t){if(!e||t===e||t.startsWith(`${e}/`))return;let n=e.slice(e.lastIndexOf(`/`)+1),r=t?`${t}/${n}`:n;return r===e?void 0:r}function Ts(e,t,n){return e===t||e.startsWith(`${t}/`)?n+e.slice(t.length):e}function Es(e){return!!e.trim()&&e!==`!!`}function Ds(e){let t=e.index+e.worktree;if(Es(t.replace(/ /g,``)))return t.includes(`U`)||t===`AA`||t===`DD`?`conflict`:t.includes(`?`)||t.includes(`A`)?`added`:t.includes(`D`)?`deleted`:t.includes(`R`)?`renamed`:t.includes(`C`)?`copied`:`modified`}function Os(e){let t=[];for(let n of e){let e=Ds(n);e&&t.push({path:n.path,kind:e,...n.originalPath?{originalPath:n.originalPath}:{}})}return t}function ks(e){return e===`A`?`added`:e===`D`?`deleted`:e===`R`?`renamed`:e===`C`?`copied`:e===`U`?`conflict`:`modified`}function As(e){return e.map(e=>({path:e.path,kind:ks(e.status),...e.originalPath?{originalPath:e.originalPath}:{},additions:e.additions,deletions:e.deletions,binary:e.binary}))}function js(e){if(e!==`unchanged`)return e===`removed`?`deleted`:e===`changed`?`modified`:e}function Ms(e){let t=[];for(let n of e){let e=js(n.status);e&&t.push({path:n.path,kind:e,...n.previousPath?{originalPath:n.previousPath}:{},additions:n.additions,deletions:n.deletions,...n.binary?{binary:!0}:{},...n.tooLarge?{tooLarge:!0}:{},...n.generated?{generated:!0}:{}})}return t}function Ns(e){let t=new Map,n=(e,n)=>{let r=t.get(e);t.set(e,!r||r===n?n:r===`conflict`||n===`conflict`?`conflict`:`modified`)},r=(e,t)=>{if(!e)return;let r=e.replace(/\/$/,``).split(`/`);for(let e=1;e<=r.length;e++)n(r.slice(0,e).join(`/`),t)},i=e=>e===`added`||e===`deleted`||e===`conflict`?e:`modified`;for(let t of e)r(t.path,i(t.kind)),t.kind===`renamed`&&t.originalPath&&r(t.originalPath,`deleted`);return t}function Ps(e){let t=[],n=()=>{let e=t.indexOf(null);return e===-1?t.length:e};return e.map(e=>{let r=t.flatMap((t,n)=>t===e.hash?[n]:[]),i=r[0]??n(),a=t.flatMap((t,n)=>t!==null&&t!==e.hash?[n]:[]);for(let e of r)t[e]=null;let o=[];for(e.parents.forEach((e,r)=>{let a=t.indexOf(e);if(a!==-1){o.push(a);return}let s=r===0?i:n();t[s]=e,o.push(s)});t.length&&t.at(-1)===null;)t.pop();let s=[i,...a,...r,...o];return{column:i,through:a,joins:r,forks:o,width:Math.max(...s)+1}})}function Fs(e,...t){let n=new Map;for(let e of t)for(let t of e??[])n.set(t.id,t);for(let[t,r]of n)r.requires&&!e(r.requires)&&n.delete(t);return{has:e=>n.has(e),get:e=>n.get(e),list:()=>[...n.values()]}}function Is(e,t){return{has:n=>e.has(n)||t().some(e=>e.id===n),get:n=>t().find(e=>e.id===n)??e.get(n),list:()=>[...e.list(),...t()]}}function Ls(e){let t=new Set(e.map(e=>e.id)),n=[],r=new Map;for(let i of e){if(i.group&&t.has(i.group))continue;let e=[i];n.push(e),r.set(i.id,e)}for(let i of e){if(!i.group||!t.has(i.group))continue;let e=r.get(i.group);if(e)e.push(i);else{let e=[i];n.push(e),r.set(i.id,e)}}return n}var Rs=`gitlab.com`,zs=`gl:/`,Bs=`Укажите адрес GitLab вида https://gitlab.example.com`,Vs=`Укажите group/project или ссылку на проект GitLab`,Hs=/^[A-Za-z][A-Za-z0-9+.-]*:\/\//,Us=/^[A-Za-z0-9_][A-Za-z0-9_.-]*$/;function Ws(e){if(![`http:`,`https:`].includes(e.protocol)||e.username||e.password||e.search||e.hash||e.pathname!==``&&e.pathname!==`/`)throw Error(Bs);return e.host.toLowerCase()}function Gs(e){let t=e.trim();if(!t)throw Error(Bs);let n;try{n=new URL(Hs.test(t)?t:`http://${t}`)}catch{throw Error(Bs)}return Ws(n)}function Ks(e){let t=e.split(`/`);if(t.length<2||t.some(e=>!e||e===`.`||e===`..`||!Us.test(e)||/\.(git|atom)$/i.test(e)))throw Error(Vs);return t.join(`/`)}function qs(e,t){if(![`http:`,`https:`].includes(e.protocol)||e.username||e.password)throw Error(Vs);if(t){let n;try{n=Gs(t)}catch{throw Error(Bs)}if(e.host.toLowerCase()!==n)throw Error(`Ссылка ведёт на другой инстанс GitLab. Проверьте адрес`)}return e.pathname}function Js(e,t){let n=e.trim();if(!n)throw Error(Vs);let r;if(Hs.test(n)){let e;try{e=new URL(n)}catch{throw Error(Vs)}r=qs(e,t)}else if(n.startsWith(`gl:/`)){let e=n.slice(4),i=e.indexOf(`/`);if(i<0)throw Error(Vs);let a=e.slice(0,i);if(t&&Gs(a)!==Gs(t))throw Error(`Ссылка ведёт на другой инстанс GitLab. Проверьте адрес`);r=e.slice(i+1)}else if(r=n.split(/[?#]/,1)[0]??``,t){let e=Gs(t);r.toLowerCase().startsWith(`${e}/`)&&(r=r.slice(e.length+1))}return Ks(r.replace(/\/-\/.*$/,``).replace(/^\/+|\/+$/g,``).replace(/\.git$/i,``))}function Ys(e,t){let n=Gs(e),r=Js(t,n);return`/gl/projects/${encodeURIComponent(n).replaceAll(`%3A`,`:`)}/${r.split(`/`).map(encodeURIComponent).join(`/`)}`}var Xs=`gh:/`,Zs=/^[A-Za-z0-9][A-Za-z0-9-]*\/[A-Za-z0-9_.-]+$/;function Qs(e){let t=e.trim().replace(/^https:\/\/github\.com\//,``).replace(/\/$/,``).replace(/\.git$/,``);if(!Zs.test(t)||[`.`,`..`].includes(t.split(`/`)[1]))throw Error(`Укажите owner/repository`);return t}function $s(e){if(e.startsWith(`gl:/`)){let t=e.slice(zs.length),n=t.indexOf(`/`);return n<0?{kind:`gitlab`,instance:t,path:``}:{kind:`gitlab`,instance:t.slice(0,n),path:t.slice(n+1)}}return e.startsWith(Xs)?{kind:`github`,repository:e.slice(4)}:{kind:`local`,path:e}}function ec(e){return e.kind===`github`?`${Xs}${e.repository}`:e.kind===`gitlab`?`${zs}${e.instance}/${e.path}`:e.path}var tc=/^[A-Za-z]:$/,nc=`unc:`;function rc(e){return e.startsWith(`/`)||e.startsWith(`\\\\`)||/^[A-Za-z]:[\\/]/.test(e)}function ic(e){return e.startsWith(`\\\\`)||/^[A-Za-z]:(?:[\\/]|$)/.test(e)}function ac(e){if(!ic(e))return e===`/`?[]:e.split(`/`).filter(Boolean);let t=e.replaceAll(`\\`,`/`);return t.startsWith(`//`)?[nc,...t.slice(2).split(`/`).filter(Boolean)]:t.split(`/`).filter(Boolean)}function oc(e){let t=e.flatMap(e=>e.split(`/`)).filter(Boolean),n=t.length===1&&t[0]?.includes(`\\`)?t[0].split(`\\`).filter(Boolean):t;if(t[0]===nc||t.length===1&&t[0]?.startsWith(`\\\\`))return`\\\\${(t[0]===nc?t.slice(1):n).join(`\\`)}`;if(tc.test(n[0]??``)){let[e,...t]=n;return t.length?`${e}\\${t.join(`\\`)}`:`${e}\\`}return`/${t.join(`/`)}`}function sc(e){let t=ac(e);if(t[0]===nc){let e=t.slice(1);return e.map((t,n)=>({name:t,path:`\\\\${e.slice(0,n+1).join(`\\`)}`}))}if(tc.test(t[0]??``)){let[e,...n]=t;return[{name:e,path:`${e}\\`},...n.map((t,r)=>({name:t,path:`${e}\\${n.slice(0,r+1).join(`\\`)}`}))]}return[{name:`/`,path:`/`},...t.map((e,n)=>({name:e,path:`/${t.slice(0,n+1).join(`/`)}`}))]}function cc(e){if(e.kind===`gitlab`){let t=e.path.split(`/`).filter(Boolean),n=`${zs}${e.instance}`;return[{name:zs,path:zs},...e.instance?[{name:e.instance,path:n}]:[],...t.map((e,r)=>({name:e,path:`${n}/${t.slice(0,r+1).join(`/`)}`}))]}if(e.kind===`github`){let t=e.repository.split(`/`).filter(Boolean);return[{name:Xs,path:Xs},...t.map((e,n)=>({name:e,path:`${Xs}${t.slice(0,n+1).join(`/`)}`}))]}return sc(e.path)}async function lc(e,t){let n=await fetch(e,{...t,headers:{"Content-Type":`application/json`}}),r=await n.json();if(!n.ok)throw Error(r.error||`Ошибка запроса`);return r}function uc(){return lc(`/api/projects`)}function dc(e){return lc(`/api/projects/resolve`,{method:`POST`,body:JSON.stringify({path:e})})}function fc(e,t){return lc(`/api/projects/${e}/directory`,{method:`POST`,body:JSON.stringify(t)})}function pc(e){return lc(`/api/projects/${e}`)}function mc(e){return lc(`/api/projects/${e}/github`)}function hc(e){return lc(`/api/projects/${e}/gitlab`)}function gc(e){return lc(`/api/projects`,{method:`POST`,body:JSON.stringify(e)})}function _c(e,t){return lc(`/api/projects/${e}`,{method:`PATCH`,body:JSON.stringify(t)})}function vc(e){return lc(`/api/projects/${e}`,{method:`DELETE`})}function yc(e){return lc(`/api/inspect`,{method:`POST`,body:JSON.stringify({path:e})})}function bc(){return lc(`/api/pick-folder`,{method:`POST`})}function xc(e){if(e.iconUrl)return C(e.iconUrl);let t=new URLSearchParams({path:e.path,name:e.name,icon:e.icon??``});return C(`/api/projects/${encodeURIComponent(e.id)}/icon?${t}`)}function Sc(e,t,n=``){let r=new URLSearchParams({repository:t,version:`2`});return n&&r.set(`ref`,n),C(`/api/integrations/${e}/browse/icon?${r}`)}async function Cc(e,t=!1,n){return $s(e).kind===`local`?lc(`/api/directories?${new URLSearchParams({path:e,complete:String(t)})}`,{signal:n}):{path:e,entries:[],truncated:!1}}function wc(e){return lc(`/api/inspect/commands`,{method:`POST`,body:JSON.stringify({path:e})})}async function Tc(e,t,n){let r=$s(e);return r.kind===`local`?Cc(e,t,n):r.kind===`gitlab`?lc(`/api/integrations/gitlab/browse/directories?${new URLSearchParams({path:e,complete:String(t)})}`,{signal:n}):lc(`/api/integrations/github/browse/directories?${new URLSearchParams({path:e,complete:String(t)})}`,{signal:n})}var Ec=at({projects:[],loading:!1,error:``});function Dc(e){if(!e.environment)return;let t=ir(e.id);t.id=`docker`,t.features={...t.features,docker:!1,externalFiles:!1},Hr(e.id,t)}function Oc(){let e=z(()=>Ec.projects),t=z(()=>Ec.loading),n=z(()=>Ec.error);async function r(){let e=new Set(Ec.projects.map(e=>e.id));Ec.loading=!0,Ec.error=``;try{let t=await uc();t.projects.forEach(Dc),Ec.projects=[...t.projects,...Ec.projects.filter(n=>!e.has(n.id)&&!t.projects.some(e=>e.id===n.id))]}catch(e){Ec.error=e instanceof Error?e.message:`Не удалось загрузить проекты`}finally{Ec.loading=!1}}async function i(e){let t=await gc(e);return Ec.projects.unshift(t.project),t.project}async function a(e,t){let n=await _c(e,t),r=Ec.projects.findIndex(t=>t.id===e);return r!==-1&&(Ec.projects[r]=n.project),n.project}async function o(e){await vc(e),Ec.projects=Ec.projects.filter(t=>t.id!==e)}async function s(e){return Ec.projects.find(t=>t.id===e)||(await pc(e)).project}function c(e){let t=Ec.projects.find(t=>t.id===e.projectId);t&&(t.runtime=e)}function l(e){Dc(e);let t=Ec.projects.findIndex(t=>t.id===e.id);t===-1?Ec.projects.unshift(e):Ec.projects[t]=e}async function u(e){let t=await dc(e);return l(t.project),{project:t.project,missing:t.missing===!0,created:t.created===!0}}async function d(e,t){let n=await fc(e,t);return l(n.project),n.project}return{projects:e,loading:t,error:n,load:r,add:i,save:a,remove:o,getOne:s,inspect:yc,applyRuntime:c,ingest:l,openPath:u,restoreDirectory:d}}function kc(e){return{name:e.name,path:e.path,icon:e.icon??``,url:e.url,mode:e.mode,defaultCommandId:e.defaultCommandId,commands:e.commands.map(e=>({...e}))}}function Ac(e,t){return t.filter(t=>!e.some(e=>e.name.trim()===t.name||e.cmd.trim()===t.cmd))}function jc(e,t){if(!e.name.trim()||!e.cmd.trim())return`У сценария должны быть название и команда запуска`;let n=(e.cwd??``).trim().replace(/\\/g,`/`).replace(/^\.(\/|$)/,``).replace(/\/+$/,``);if(n.startsWith(`/`)||/^[a-zA-Z]:/.test(n)||n.split(`/`).includes(`..`))return`Папка сценария должна лежать внутри проекта`;let r=(e.url??``).trim();if(r)try{if(![`http:`,`https:`].includes(new URL(r).protocol))throw Error()}catch{return`Адрес сценария должен начинаться с http:// или https://`}return(e.mode||t.mode)===`window`&&!(r||t.url.trim())?`Для открытия в окне укажите адрес сценария или проекта`:``}function Mc(e){if(!e.name.trim())return`Укажите название проекта`;if(!e.commands.length)return`Добавьте хотя бы одну команду`;let t=new Set;for(let n of e.commands){let r=jc(n,e);if(r)return r;let i=n.name.trim();if(t.has(i))return`Сценарий «${i}» уже есть: названия должны различаться`;t.add(i)}if(!e.commands.some(t=>t.id===e.defaultCommandId))return`Выберите команду по умолчанию`;if(e.url.trim())try{let t=new URL(e.url.trim());if(![`http:`,`https:`].includes(t.protocol))throw Error()}catch{return`Адрес приложения должен начинаться с http:// или https://`}return``}function Nc(e,t){let n=e.findIndex(e=>e.id===t);if(n<0)return;let r=e[n],i=new Set(e.map(e=>e.name.trim())),a=`${r.name.trim()||`сценарий`} копия`;for(let e=2;i.has(a);e++)a=`${r.name.trim()} копия ${e}`;let o={...r,id:gr(),name:a};return e.splice(n+1,0,o),o}function Pc(e){return`/gh/projects/${Qs(e).split(`/`).map(encodeURIComponent).join(`/`)}`}function Fc(e){return oc(Array.isArray(e)?e:(e??``).split(`/`))}function Ic(e){return(Array.isArray(e)?e:[e??``]).join(`/`)}function Lc(e){let[t=``,...n]=Array.isArray(e)?e:(e??``).split(`/`);return{instance:t,path:n.join(`/`)}}function Rc(e){let t=$s(e);if(t.kind===`github`)return Pc(t.repository);if(t.kind===`gitlab`)return Ys(t.instance,t.path);let n=ac(e).map(e=>encodeURIComponent(e).replaceAll(`%3A`,`:`));return`/projects/${n.length?n.join(`/`):`%2F`}`}function zc(e){let t=e.trim();if(!t)return null;try{let e=new URL(t);return[`http:`,`https:`].includes(e.protocol)?{instance:Gs(e.origin),prefix:e.pathname.replace(/^\/+|\/+$/g,``)}:null}catch{try{return{instance:Gs(t),prefix:``}}catch{return null}}}function Bc(e,t){if(!e)return!1;if(e===`gitlab.com`||e===t?.instance)return!0;if(!/[.:]/.test(e))return!1;try{return Gs(e),!0}catch{return!1}}function Vc(e,t,n){return!n||n.instance!==t||!n.prefix?e:e.startsWith(`${n.prefix}/`)?e.slice(n.prefix.length+1):e}function Hc(e,t,n){let r=e.indexOf(`/`);if(r<1)throw Error(`Укажите group/project или ссылку на проект GitLab`);let i=Gs(e.slice(0,r)),a=Js(e.slice(r+1),i);return n&&(a=Vc(a,i,t)),Ys(i,a)}function Uc(e,t=``){let n=e.trim();if(!n)throw Error(`Укажите group/project или ссылку на проект GitLab`);let r=zc(t);if(n.startsWith(`gl:/`))return Hc(n.slice(zs.length).replace(/\/+$/,``),r,!1);if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(n)){let e;try{e=new URL(n)}catch{throw Error(`Укажите group/project или ссылку на проект GitLab`)}let t=Gs(e.origin);return Ys(t,Vc(Js(n,t),t,r))}if(Bc(n.split(`/`,1)[0]??``,r))return Hc(n,r,!1);let i=r?.instance||`gitlab.com`;return Ys(i,Js(n,i))}var Wc=G(M({__name:`UiSkeleton`,props:{width:{},height:{}},setup(e){return(t,n)=>(V(),q(`span`,{class:`ui-skeleton`,style:k({width:e.width??`100%`,height:e.height??`12px`}),"aria-hidden":`true`},null,4))}}),[[`__scopeId`,`data-v-db666cba`]]),Gc={class:`opening`,role:`status`,"aria-live":`polite`},Kc={class:`rail`},qc={class:`side`},Jc={class:`label`},Yc=G(M({__name:`ProjectOpening`,setup(e){let t=[`62%`,`48%`,`70%`,`54%`,`66%`,`44%`,`58%`];return(e,n)=>(V(),q(`section`,Gc,[K(`div`,Kc,[(V(),q(W,null,J(6,e=>I(Wc,{key:e,width:`18px`,height:`18px`})),64))]),K(`div`,qc,[(V(),q(W,null,J(t,e=>I(Wc,{key:e,width:e,height:`10px`},null,8,[`width`])),64))]),n[1]||=K(`div`,{class:`editor`},null,-1),n[2]||=K(`div`,{class:`terminal`},null,-1),K(`p`,Jc,[I(An),n[0]||=N(` Открываю проект…`,-1)])]))}}),[[`__scopeId`,`data-v-30a55554`]]),Xc=[`launcher-show`,`status`,`file-changed`,`dir-changed`,`watch-error`,`terminal-started`,`agent`,`secret-show`,`ide-command-request`,`ide-command-cancel`],Zc=Symbol.for(`projector.page-events`),Qc=globalThis;function $c(e,t){let n=new EventSource(C(`/api/events?client=${e}`));for(let e of Xc)n.addEventListener(e,n=>t(e,n.data));n.addEventListener(`open`,()=>t(`open`,``))}var el=typeof SharedWorker<`u`&&new URLSearchParams(location.search).get(`eventsTransport`)!==`legacy`;function tl(e,t){let n=Qc[Zc];if(n){n.handler=t;return}let r=Qc[Zc]={handler:t};nl(e,(e,t)=>r.handler(e,t))}function nl(e,t){if(!el)return $c(e,t);let n=!1,r=!1,i=()=>{r||(r=!0,a.port.close(),$c(e,t))},a;try{a=new SharedWorker(new URL(`/assets/events.worker-C2Opu9Sc.js`,``+import.meta.url),{type:`module`,name:`projector-events-v1`+f()})}catch{return $c(e,t)}let o=setTimeout(()=>n||i(),8e3);a.onerror=()=>{clearTimeout(o),i()},a.port.onmessage=i=>{if(r)return;let s=i.data;s.type===`ready`?(n=!0,clearTimeout(o),a.port.postMessage({type:`join`,page:e,apiPrefix:f()})):s.type===`ping`?a.port.postMessage({type:`pong`}):s.type===`event`&&t(s.name,s.data)},a.port.start(),globalThis.addEventListener(`pagehide`,()=>a.port.postMessage({type:`leave`})),globalThis.addEventListener(`pageshow`,t=>{t.persisted&&!r&&a.port.postMessage({type:`join`,page:e,apiPrefix:f()})})}async function rl(e,t){let n=await fetch(e,{...t,headers:{"Content-Type":`application/json`}}),r=await n.json();if(!n.ok)throw Error(r.error||`Ошибка запроса`);return r}function il(e,t,n){return rl(`/api/projects/${e}/start`,{method:`POST`,body:JSON.stringify({commandId:t,mode:n})})}function al(e){return rl(`/api/projects/${e}/stop`,{method:`POST`})}function ol(e,t){return rl(`/api/projects/${e}/open`,{method:`POST`,body:JSON.stringify({mode:t})})}var sl=at({error:``}),cl=!1;function ll(){let e=Oc(),t=z(()=>sl.error);function n(t){e.applyRuntime(t)}function r(){cl||(cl=!0,tl(Ur,(e,t)=>{e===`launcher-show`?window.dispatchEvent(new Event(`projector:show`)):e===`status`?n(JSON.parse(t)):e===`open`?window.dispatchEvent(new Event(`projector:events-open`)):window.dispatchEvent(new CustomEvent(`projector:${e}`,{detail:JSON.parse(t)}))}))}async function i(e,t,r){sl.error=``;try{n((await il(e,t,r)).runtime)}catch(e){sl.error=e instanceof Error?e.message:`Не удалось запустить`}}async function a(e){sl.error=``;try{n((await al(e)).runtime)}catch(e){sl.error=e instanceof Error?e.message:`Не удалось остановить`}}async function o(e,t){sl.error=``;try{await ol(e,t)}catch(e){sl.error=e instanceof Error?e.message:`Не удалось открыть`}}return{error:t,connect:r,start:i,stop:a,open:o}}var ul={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function dl(e,t){return V(),q(`svg`,ul,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`m6 9l6 6l6-6`},null,-1)]])}var fl=U({name:`lucide-chevron-down`,render:dl}),pl=G(M({__name:`UiIslandHeader`,props:{anchor:{},chevron:{type:Boolean}},setup(e){return(t,n)=>(V(),q(`button`,{type:`button`,class:O([`island-header`,e.anchor??`end`])},[L(t.$slots,`default`),e.chevron?(V(),Y(H(fl),{key:0,class:`island-chevron`,"aria-hidden":`true`})):B(``,!0)],2))}}),[[`__scopeId`,`data-v-8f9cf570`]]),ml=G(M({__name:`UiStack`,props:{as:{},gap:{},flow:{},align:{}},setup(e){return(t,n)=>(V(),Y(qe(e.as??`div`),{class:O([`ui-stack`,{flex:e.flow===`flex`}]),style:k({"--stack-gap":e.gap===`none`?`normal`:`var(--sp-${e.gap??3})`,justifyItems:e.flow===`flex`?void 0:e.align,alignItems:e.flow===`flex`?e.align:void 0})},{default:F(()=>[L(t.$slots,`default`,{},void 0,!0)]),_:3},8,[`class`,`style`]))}}),[[`__scopeId`,`data-v-3f1c0cfb`]]),hl=G(M({__name:`UiBadge`,props:{tone:{},mono:{type:Boolean},shrink:{type:Boolean}},setup(e){return(t,n)=>(V(),q(`span`,{class:O([`ui-badge`,[e.tone??`neutral`,{mono:e.mono}]]),style:k({flexShrink:+!!e.shrink})},[L(t.$slots,`default`,{},void 0,!0)],6))}}),[[`__scopeId`,`data-v-b1c1a33f`]]),gl=G(M({__name:`UiActionCopy`,props:{title:{},grow:{type:Boolean,default:!0},description:{},descriptionMode:{},descriptionTone:{},mono:{type:Boolean},emphasized:{type:Boolean},truncateTitle:{type:Boolean}},setup(e){return(t,n)=>(V(),q(`span`,{class:O([`copy`,{intrinsic:!e.grow}])},[K(`span`,{class:O([`name`,{emphasized:e.emphasized,"u-truncate":e.truncateTitle}])},j(e.title),3),e.description?(V(),q(`span`,{key:0,class:O([`caption`,[e.descriptionMode===`wrap`?`wrap`:`u-truncate`,{secondary:e.descriptionTone===`secondary`,mono:e.mono}]])},j(e.description),3)):B(``,!0)],2))}}),[[`__scopeId`,`data-v-7de3626d`]]),_l=G(M({__name:`UiPopupSurface`,props:{as:{},border:{},radius:{},flow:{},surface:{}},setup(e,{expose:t}){let n=We();return t({get element(){return n.value??void 0}}),(t,r)=>(V(),Y(qe(e.as??`div`),{ref_key:`element`,ref:n,class:O([`popup-surface`,{column:e.flow===`column`}]),style:k({"--popup-border":e.border===`line`?`var(--line)`:`var(--line-strong)`,"--popup-background":e.surface===`tertiary`?`var(--bg-3)`:`var(--bg-2)`,"--popup-radius":e.radius===`md`?`var(--r-md)`:`var(--r-lg)`})},{default:F(()=>[L(t.$slots,`default`,{},void 0,!0)]),_:3},8,[`class`,`style`]))}}),[[`__scopeId`,`data-v-a2f96504`]]),vl=()=>typeof window<`u`&&window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches===!0,yl=()=>({claimed:!1,delta:0,dx:0,dy:0,velocity:0});function bl(e){let t=e.slop??8,n=e.dominance??1.15,r=e.hold??700,i,a=!1,o=!1,s,c=0,l=0,u=()=>{i=void 0,a=!1,o=!1,s=void 0,c=0,l=0},d=(t,n)=>({claimed:a,delta:e.axis===`x`?t:n,dx:t,dy:n,velocity:l});function f(e){u(),i=e,s=e}function p(u){let f=i;if(!f||o)return yl();let p=u.x-f.x,m=u.y-f.y;if(!a){if(Math.max(Math.abs(p),Math.abs(m))<t)return yl();if(u.time-f.time>r)return o=!0,yl();let i=e.axis===`x`?Math.abs(p):Math.abs(m),h=e.axis===`x`?Math.abs(m):Math.abs(p);return i>=t&&i>h*n?(a=!0,c=e.axis===`x`?p:m,l=c/Math.max(u.time-f.time,1),s=u,d(p,m)):(h>=t&&h>=i*n&&(o=!0),yl())}let h=e.axis===`x`?p:m,g=Math.max(u.time-(s?.time??f.time),1);return l=.6*((h-c)/g)+.4*l,c=h,s=u,d(p,m)}function m(e){e&&a&&p(e);let t=i,n=t?(s?.x??t.x)-t.x:0,r=t?(s?.y??t.y)-t.y:0,o=d(n,r);return u(),o}function h(){u()}return{begin:f,move:p,end:m,cancel:h}}function xl(e,t,n,r=.45){let i=Math.sign(e);return i?Math.abs(e)>=n||Math.abs(e)>=24&&Math.abs(t)>=r&&Math.sign(t)===i:!1}function Sl(e){return e instanceof Element&&!!e.closest(`input, textarea, select, option, [contenteditable]:not([contenteditable='false']), [role='textbox'], [role='slider'], [data-swipe-ignore]`)}function Cl(e,t){let n=getComputedStyle(e),r=t===`x`?n.overflowX:n.overflowY;return[`auto`,`scroll`,`overlay`].includes(r)?t===`x`?e.scrollWidth-e.clientWidth>1:e.scrollHeight-e.clientHeight>1:!1}function wl(e,t,n,r){if(!(e instanceof Element)||!n)return!1;let i=e;for(;i;){if(Cl(i,t)){if(t===`x`){let e=i.scrollWidth-i.clientWidth;if(n<0?i.scrollLeft<e-1:i.scrollLeft>1)return!0}else{let e=i.scrollHeight-i.clientHeight;if(n>0?i.scrollTop>1:i.scrollTop<e-1)return!0}}if(i===r)break;i=i.parentElement}return!1}function Tl(e,t){let n=bl(t),r=!1,i=!1,a=!1,o=(e,t)=>({x:e.clientX,y:e.clientY,time:t}),s=(e,n)=>({axis:t.axis,delta:e.delta,dx:e.dx,dy:e.dy,velocity:e.velocity,event:n}),c=(e=!1)=>{let a=i;r=!1,i=!1,n.cancel(),e&&a&&t.onCancel?.()},l=e=>{if(!a&&(t.enabled?.()??!0)){if(e.touches.length!==1)return c(!0);if(t.ignoreTarget?.(e.target)||Sl(e.target))return c();n.begin(o(e.touches[0],e.timeStamp)),r=!0,i=!1}},u=e=>{if(a||!r)return;if(e.touches.length!==1||!(t.enabled?.()??!0)||!e.cancelable)return c(!0);let l=n.move(o(e.touches[0],e.timeStamp));if(l.claimed){if(!i){if(t.canStart&&!t.canStart(e,l))return c();i=!0,t.onStart?.(s(l,e))}e.preventDefault(),t.onMove?.(s(l,e))}},d=e=>{if(!r)return;if(r=!1,!i){n.end();return}i=!1,e.cancelable&&e.preventDefault();let a=e.changedTouches[0],c=n.end(a?o(a,e.timeStamp):void 0);t.onEnd?.(s(c,e))},f=()=>c(!0);return e.addEventListener(`touchstart`,l,{passive:!0}),e.addEventListener(`touchmove`,u,{passive:!1}),e.addEventListener(`touchend`,d,{passive:!1}),e.addEventListener(`touchcancel`,f,{passive:!0}),()=>{a=!0,c(),e.removeEventListener(`touchstart`,l),e.removeEventListener(`touchmove`,u),e.removeEventListener(`touchend`,d),e.removeEventListener(`touchcancel`,f)}}var El=`cubic-bezier(.2, .8, .2, 1)`;function Dl(e){let t=X(!1),n,r,i=0;function a(e){r?.cancel(),r=void 0,e.style.transform=``,e.style.removeProperty(`--sheet-scrim`),e.style.transition=``,e.style.willChange=``,t.value=!1,i=0}function o(e,t,n){if(vl()||typeof e.animate!=`function`)return n();r?.cancel();let a=e.animate([{transform:`translate3d(0, ${i}px, 0)`},{transform:t}],{duration:180,easing:El});r=a,a.onfinish=()=>{r===a&&(r=void 0,n())}}function s(e){o(e,`translate3d(0, 0, 0)`,()=>a(e))}function c(t){o(t,`translate3d(0, 100%, 0)`,()=>{e.close(),a(t)})}function l(e){r?.cancel(),r=void 0,e.style.animation=`none`,e.style.transition=`none`,e.style.willChange=`transform`,t.value=!0}function u(e,t){i=Math.max(0,t.delta),e.style.transform=`translate3d(0, ${i}px, 0)`;let n=.6*(1-Math.min(i/320,1));e.style.setProperty(`--sheet-scrim`,`rgb(0 0 0 / ${n.toFixed(3)})`)}function d(e){t.value=!1;let n=e.getBoundingClientRect().height||0,r=Math.max(56,Math.min(n*.28,120));i>=r?c(e):s(e)}function f(){n?.(),n=void 0;let t=e.element.value;!t||!e.enabled.value?t&&a(t):n=Tl(t,{axis:`y`,enabled:()=>e.enabled.value,ignoreTarget:Sl,canStart:(e,n)=>n.delta>0&&!wl(e.target,`y`,1,t),onStart:()=>l(t),onMove:e=>u(t,e),onEnd:()=>d(t),onCancel:()=>s(t)})}return R([e.element,e.enabled],f,{flush:`post`}),lt(()=>{n?.(),n=void 0,e.element.value&&a(e.element.value)}),{dragging:t}}var Ol={key:0,class:`sheet-grabber`,"aria-hidden":`true`},kl=G(M({__name:`UiIsland`,props:{menu:{},label:{},width:{},gap:{},passive:{type:Boolean}},setup(e){let t=e;function n(e){t.menu.island.value=e?.element}let r=Dl({element:t.menu.island,enabled:z(()=>t.menu.compact.value&&!t.passive),close:()=>t.menu.close()});return(t,i)=>(V(),Y(ht,{to:`body`},[e.menu.open.value?(V(),Y(_l,{key:0,as:`section`,border:`strong`,radius:`lg`,flow:`column`,id:e.menu.id,ref:n,class:O([`island`,{"mobile-sheet":e.menu.compact.value,"sheet-dragging":H(r).dragging.value,passive:e.passive}]),role:`dialog`,"aria-label":e.label,style:k({...e.menu.style.value,"--island-width":`${e.width??340}px`,"--island-content-gap":e.gap??`var(--sp-1)`}),onKeydown:e.menu.keydown,onFocusin:e.menu.trackFocus},{default:F(()=>[e.menu.compact.value&&!e.passive?(V(),q(`span`,Ol)):B(``,!0),L(t.$slots,`default`,{},void 0,!0)]),_:3},8,[`id`,`aria-label`,`class`,`style`,`onKeydown`,`onFocusin`])):B(``,!0)]))}}),[[`__scopeId`,`data-v-86fa7e9b`]]);function Al(e,t){return Gt()?(zt(e,t),!0):!1}var jl=new WeakMap,Ml=(...e)=>{let t=e[0],n=Ve()?.proxy??Gt();if(n==null&&!Je())throw Error(`injectLocal must be called in setup`);return n&&jl.has(n)&&t in jl.get(n)?jl.get(n)[t]:tt(...e)},Nl=typeof window<`u`&&typeof document<`u`;typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope;var Pl=e=>e!=null,Fl=Object.prototype.toString,Il=e=>Fl.call(e)===`[object Object]`,Ll=()=>{},Rl=zl();function zl(){var e,t;return Nl&&!!((e=window)!=null&&(e=e.navigator)!=null&&e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window)==null||(t=t.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window?.navigator.userAgent))}function Bl(e,t){function n(...n){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,n),{fn:t,thisArg:this,args:n})).then(r).catch(i)})}return`cancel`in e&&Object.assign(n,{cancel:e.cancel,flush:e.flush,isPending:e.isPending}),n}function Vl(e,t={}){let n,r,i=Ll,a=Ll,o=We(!1),s=e=>{clearTimeout(e),i(),i=Ll},c;return Object.assign(l=>{let u=me(e),d=me(t.maxWait);return n&&s(n),u<=0||d!==void 0&&d<=0?(r&&=(s(r),void 0),o.value=!1,Promise.resolve(l())):(o.value=!0,new Promise((e,f)=>{i=t.rejectOnCancel?f:e,a=e,c=l,d&&!r&&(r=setTimeout(()=>{n&&s(n),r=void 0,o.value=!1,e(c())},d)),n=setTimeout(()=>{r&&s(r),r=void 0,o.value=!1,e(l())},u)}))},{cancel:()=>{n&&=(s(n),void 0),r&&=(s(r),void 0),o.value=!1,a=Ll},flush:()=>{if(o.value){n&&=(clearTimeout(n),void 0),r&&=(clearTimeout(r),void 0),o.value=!1;let e=a;i=Ll,a=Ll,e(c())}},isPending:pn(o)})}function Hl(e){return e.endsWith(`rem`)?Number.parseFloat(e)*16:Number.parseFloat(e)}function Ul(e){return Array.isArray(e)?e:[e]}function Wl(e){return e||Ve()}function Gl(e,t=200,n={}){return Bl(Vl(t,n),e)}function Kl(e,t=!0,n){Wl(n)?Lt(e,n):t?e():Ut(e)}function ql(e,t=1e3,n={}){let{immediate:r=!0,immediateCallback:i=!1}=n,a=null,o=We(!1);function s(){a&&=(clearInterval(a),null)}function c(){o.value=!1,s()}function l(){let n=me(t);n<=0||(o.value=!0,i&&e(),s(),o.value&&(a=setInterval(e,n)))}return r&&Nl&&l(),(gt(t)||typeof t==`function`)&&Al(R(t,()=>{o.value&&Nl&&l()})),Al(c),{isActive:pn(o),pause:c,resume:l}}function Jl(e,t,n){return R(e,t,{...n,immediate:!0})}function Yl(e,t,n){return R(e,t,{...n,once:!0})}var Xl=Nl?window:void 0;Nl&&window.document,Nl&&window.navigator,Nl&&window.location;function Zl(e){let t=me(e);return t?.$el??t}function Ql(...e){let t=(e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)),n=z(()=>{let t=Ul(me(e[0])).filter(e=>e!=null);return t.every(e=>typeof e!=`string`)?t:void 0});return Jl(()=>[n.value?.map(e=>Zl(e))??[Xl].filter(e=>e!=null),Ul(me(n.value?e[1]:e[0])),Ul(H(n.value?e[2]:e[1])),me(n.value?e[3]:e[2])],([e,n,r,i],a,o)=>{if(!e?.length||!n?.length||!r?.length)return;let s=Il(i)?{...i}:i,c=e.flatMap(e=>n.flatMap(n=>r.map(r=>t(e,n,r,s))));o(()=>{c.forEach(e=>e())})},{flush:`post`})}var $l=!1;function eu(e,t,n={}){let{window:r=Xl,ignore:i=[],capture:a=!0,detectIframe:o=!1,controls:s=!1}=n;if(!r)return s?{stop:Ll,cancel:Ll,trigger:Ll}:Ll;if(Rl&&!$l){$l=!0;let e={passive:!0};Array.from(r.document.body.children).forEach(t=>t.addEventListener(`click`,Ll,e)),r.document.documentElement.addEventListener(`click`,Ll,e)}let c=!0,l=e=>me(i).some(t=>{if(typeof t==`string`)return Array.from(r.document.querySelectorAll(t)).some(t=>t===e.target||e.composedPath().includes(t));{let n=Zl(t);return n&&(e.target===n||e.composedPath().includes(n))}});function u(e){let t=me(e);return t&&t.$.subTree.shapeFlag===16}function d(e,t){let n=me(e),r=n.$.subTree&&n.$.subTree.children;return r==null||!Array.isArray(r)?!1:r.some(e=>e.el===t.target||t.composedPath().includes(e.el))}let f=n=>{let r=Zl(e);n.target!=null&&(!(r instanceof Element)&&u(e)&&d(e,n)||r&&r!==n.target&&!n.composedPath().includes(r)&&(`detail`in n&&n.detail===0&&(c=!l(n)),c?t(n):c=!0))},p=!1,m=[Ql(r,`click`,e=>{p||(p=!0,setTimeout(()=>{p=!1},0),f(e))},{passive:!0,capture:a}),Ql(r,`pointerdown`,t=>{let n=Zl(e);c=!l(t)&&!(!n||t.composedPath().includes(n))},{passive:!0}),o&&Ql(r,`blur`,n=>{setTimeout(()=>{let i=Zl(e),a=r.document.activeElement;for(;a?.shadowRoot;)a=a.shadowRoot.activeElement;a?.tagName===`IFRAME`&&!i?.contains(r.document.activeElement)&&t(n)},0)},{passive:!0})].filter(Boolean),h=()=>m.forEach(e=>e());return s?{stop:h,cancel:()=>{c=!1},trigger:e=>{c=!0,f(e),c=!1}}:h}function tu(){let e=We(!1),t=Ve();return t&&Lt(()=>{e.value=!0},t),e}function nu(e){let t=tu();return z(()=>(t.value,!!e()))}function ru(e,t={}){let{immediate:n=!0,fpsLimit:r=null,window:i=Xl,once:a=!1}=t,o=We(!1),s=z(()=>{let e=me(r);return e?1e3/e:null}),c=0,l=null;function u(t){if(!o.value||!i)return;c||=t;let n=t-c;s.value&&n<s.value?l=i.requestAnimationFrame(u):(c=t,e({delta:n,timestamp:t}),a?(o.value=!1,l=null):l=i.requestAnimationFrame(u))}function d(){!o.value&&i&&(o.value=!0,c=0,l=i.requestAnimationFrame(u))}function f(){o.value=!1,l!=null&&i&&(i.cancelAnimationFrame(l),l=null)}return n&&d(),Al(f),{isActive:pn(o),pause:f,resume:d}}var iu=Symbol(`vueuse-ssr-width`);function au(){let e=Je()?Ml(iu,null):null;return typeof e==`number`?e:void 0}function ou(e,t={}){let{window:n=Xl,ssrWidth:r=au()}=t,i=nu(()=>n&&`matchMedia`in n&&typeof n.matchMedia==`function`),a=We(typeof r==`number`),o=We(),s=We(!1);return Qe(()=>{if(a.value){a.value=!i.value;let t=me(e).split(`,`);s.value=t.some(e=>{let t=e.includes(`not all`),n=e.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),i=e.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),a=!!(n||i);return n&&a&&(a=r>=Hl(n[1])),i&&a&&(a=r<=Hl(i[1])),t?!a:a})}else i.value&&(o.value=n.matchMedia(me(e)),s.value=o.value.matches)}),Ql(o,`change`,e=>{s.value=e.matches},{passive:!0}),z(()=>s.value)}function su(e,t,n={}){let{window:r=Xl,...i}=n,a,o=nu(()=>r&&`ResizeObserver`in r),s=()=>{a&&=(a.disconnect(),void 0)},c=z(()=>{let t=me(e);return Array.isArray(t)?t.map(e=>Zl(e)):[Zl(t)]}),l=R(c,e=>{if(s(),o.value&&r){a=new ResizeObserver(t);for(let t of e)t instanceof Element&&a.observe(t,i)}},{immediate:!0,flush:`post`}),u=()=>{s(),l()};return Al(u),{isSupported:o,stop:u}}function cu(e,t={width:0,height:0},n={}){let{window:r=Xl,box:i=`content-box`}=n,a=z(()=>{var t;return(t=Zl(e))==null||(t=t.namespaceURI)==null?void 0:t.includes(`svg`)}),o=We(t.width),s=We(t.height),{stop:c}=su(e,([t])=>{let n=i===`border-box`?t.borderBoxSize:i===`content-box`?t.contentBoxSize:t.devicePixelContentBoxSize;if(r&&a.value){let t=Zl(e);if(t){let e=t.getBoundingClientRect();o.value=e.width,s.value=e.height}}else if(n){let e=Ul(n);o.value=e.reduce((e,{inlineSize:t})=>e+t,0),s.value=e.reduce((e,{blockSize:t})=>e+t,0)}else o.value=t.contentRect.width,s.value=t.contentRect.height},n);Kl(()=>{let n=Zl(e);if(n&&`offsetWidth`in n){if(i===`content-box`&&r){let e=r.getComputedStyle(n),t=Number.parseFloat(e.paddingLeft)+Number.parseFloat(e.paddingRight),i=Number.parseFloat(e.paddingTop)+Number.parseFloat(e.paddingBottom),a=Number.parseFloat(e.borderLeftWidth)+Number.parseFloat(e.borderRightWidth),c=Number.parseFloat(e.borderTopWidth)+Number.parseFloat(e.borderBottomWidth);o.value=n.offsetWidth-t-a,s.value=n.offsetHeight-i-c}else o.value=n.offsetWidth,s.value=n.offsetHeight}else n&&(o.value=t.width,s.value=t.height)});let l=R(()=>Zl(e),e=>{o.value=e?t.width:0,s.value=e?t.height:0});function u(){c(),l()}return{width:o,height:s,stop:u}}function lu(e,t,n={}){let{root:r,rootMargin:i,threshold:a=0,window:o=Xl,immediate:s=!0}=n,c=nu(()=>o&&`IntersectionObserver`in o),l=z(()=>Ul(me(e)).map(Zl).filter(Pl)),u=Ll,d=We(s),f=c.value?R(()=>[l.value,Zl(r),me(i),d.value],([e,n,r])=>{if(u(),!d.value||!e.length)return;let i=new IntersectionObserver(t,{root:Zl(n),rootMargin:r,threshold:a});e.forEach(e=>e&&i.observe(e)),u=()=>{i.disconnect(),u=Ll}},{immediate:s,flush:`post`}):Ll,p=()=>{u(),f(),d.value=!1};return Al(p),{isSupported:c,isActive:d,pause(){u(),d.value=!1},resume(){d.value=!0},stop:p}}function uu(e,t={}){let{window:n=Xl,scrollTarget:r,threshold:i=0,rootMargin:a,once:o=!1,initialValue:s=!1}=t,c=We(s),l=lu(e,e=>{let t=c.value,n=0;for(let r of e)r.time>=n&&(n=r.time,t=r.isIntersecting);c.value=t,o&&Yl(c,()=>{l.stop()})},{root:r,window:n,threshold:i,rootMargin:a});return t.controls?{...l,isVisible:c}:c}function du(e={}){let{controls:t=!1,scheduler:n=ru}=e,r=We(new Date),i=n(()=>r.value=new Date);return t?{now:r,...i}:r}var fu=`(max-width: 700px), (max-width: 1050px) and (max-height: 500px) and (pointer: coarse)`,pu=()=>ou(fu);function mu(e){let t=X(!1),n=X(),r=X(),i=X(0),a=pu(),o=P(),s=X({}),c=z(()=>a.value?void 0:s.value),l=0,u=!1,d=()=>[...r.value?.querySelectorAll(e.items??`button`)??[]],f=()=>d().filter(e=>!e.matches(`:disabled`));function p(){let e=d().indexOf(document.activeElement);e>=0&&(i.value=e)}function m(r=!0){if(t.value&&(++l,t.value=!1,r&&!u)){let t=n.value;(t?.querySelector(e.returnFocus??`button`)??t)?.focus?.()}}async function h(o=!t.value){if(u||o===t.value)return;if(!o)return m();let c=n.value?.getBoundingClientRect();if(!c)return;let d=++l,h=Math.max(8,c.top-4),g=Math.max(8,window.innerHeight-c.bottom-4);if(s.value={[e.anchor]:`${e.anchor===`left`?c.left-4:window.innerWidth-c.right-4}px`,...e.placement===`above`?{bottom:`${g}px`,maxHeight:`calc(100dvh - ${g}px - 8px)`}:{top:`${h}px`,"--island-top":`${h}px`}},i.value=0,t.value=!0,await Ut(),!u&&t.value&&d===l){if(!a.value&&r.value){let t=r.value.getBoundingClientRect().width,n=e.anchor===`left`?c.left-4:window.innerWidth-c.right-4;s.value={...s.value,[e.anchor]:`${Math.max(8,Math.min(n,window.innerWidth-t-8))}px`}}((typeof e.initialFocus==`string`?[e.initialFocus]:e.initialFocus).map(e=>r.value?.querySelector(e)).find(e=>e&&!e.matches(`:disabled`))??f()[0]??r.value?.querySelector(`button:not(:disabled)`))?.focus(),p()}}function g(t){if(!(t.defaultPrevented||t.isComposing)){if(t.key===`Escape`)t.preventDefault(),m();else if(t.key===`Tab`&&e.closeOnTab)m();else{let n=t.key===`ArrowDown`||e.horizontalArrows&&t.key===`ArrowRight`,r=t.key===`ArrowUp`||e.horizontalArrows&&t.key===`ArrowLeft`;if(!n&&!r)return;let i=f();if(!i.length)return;t.preventDefault();let a=i.indexOf(document.activeElement);i[a<0?n?0:i.length-1:(a+(n?1:-1)+i.length)%i.length]?.focus(),p()}}}return eu(r,()=>m(!1),{ignore:[n]}),Ql(window,`resize`,()=>m()),Ql(window,`blur`,()=>m(!1)),lt(()=>{u=!0,++l,t.value=!1}),{open:t,trigger:n,island:r,active:i,compact:a,id:o,style:c,toggle:h,close:m,keydown:g,trackFocus:p}}function hu(e,t,n,r,i){let a=t.filter(e=>e.command===n),o=structuredClone(a.length?a:e.filter(e=>e.command===n)),s=o[r],c={...s,command:n,key:i??s?.key??`Unassigned`,disabled:i===null};return s?o[r]=c:o.push(c),[...t.filter(e=>e.command!==n),...o]}function gu(e){if(e.isComposing||e.repeat||[`Control`,`Meta`,`Alt`,`Shift`,`Dead`,`Unidentified`,`+`].includes(e.key))return;let t=ee(e);return[e.ctrlKey&&`Ctrl`,e.metaKey&&`Meta`,e.altKey&&`Alt`,e.shiftKey&&`Shift`,t===` `?`Space`:t.length===1?t.toUpperCase():t].filter(Boolean).join(`+`)}function _u(e,t,n,r=``){let i=new Map(t.map(e=>[e.id,e.context])),a=i.get(n),o=new Map;for(let t of e){if(t.palette===!1)continue;let e=i.get(t.scope);if(a?.projectId&&e?.projectId&&e.projectId!==a.projectId)continue;let r=e?.surface===`fileTree`?`Файлы`:e?.surface===`editor`?`Редактор`:e?.namespace===`ide.workbench.tabs`?`Вкладки`:e?.surface===`keybindings`?`Горячие клавиши`:`IDE`,s=o.get(t.id);(!s||t.scope===n||s.scope!==n&&t.enabled&&!s.enabled)&&o.set(t.id,{...t,group:r})}let s=r.trim().replace(/^>\s*/,``).toLocaleLowerCase().split(/\s+/).filter(Boolean);return[...o.values()].filter(e=>s.every(t=>`${e.title} ${e.id} ${e.group}`.toLocaleLowerCase().includes(t))).sort((e,t)=>Number(t.enabled)-Number(e.enabled)||Number(t.scope===n)-Number(e.scope===n)||e.title.localeCompare(t.title,`ru`)||e.id.localeCompare(t.id))}function vu(e,t){return async(n,r)=>{let i=e.getScopes().filter(({context:e})=>e.projectId===t||e.projectId===void 0&&[`workbench`,`keybindings`,`settings`].includes(String(e.surface))),a=new Set(i.map(({id:e})=>e));if(n.operation===`list`){let t=(n.query??``).toLocaleLowerCase();return{scopes:i,commands:e.getCommands().filter(e=>a.has(e.scope)&&`${e.id} ${e.title} ${e.description}`.toLocaleLowerCase().includes(t)).map(({id:e,title:t,scope:n,enabled:r})=>({id:e,title:t,scope:n,enabled:r}))}}if(!n.scope||!a.has(n.scope))throw Error(`Область недоступна в текущем проекте`);if(!n.command)throw Error(`Укажите ID команды`);let o=e.describeCommand(n.scope,n.command,n.args);if(!o)throw Error(`Команда не зарегистрирована`);if(n.operation===`describe`)return{...o,context:i.find(({id:e})=>e===n.scope).context};if(n.operation!==`execute`)throw Error(`Неизвестная операция`);return await e.executeCommand(n.command,n.args,{scope:n.scope,signal:r})??{completed:!0}}}function yu(e){return e.serviceWorker?!e.production||!e.secure?`unregister`:`register`:`none`}var bu=We(null),xu=X(!1),Su=X(!1),Cu=X(!1),wu=X(`unknown`),Tu=X(`unknown`),Eu=X(``),Du=!1;function Ou(){return{installed:xu,standalone:Su,fullscreen:Cu,worker:wu,mode:Tu,error:Eu,canInstall:z(()=>bu.value!==null&&!xu.value&&!Su.value)}}function yee(){if(!Du){Du=!0,Su.value=Mu(),document.addEventListener(`fullscreenchange`,Nu);for(let e of[`(display-mode: standalone)`,`(display-mode: fullscreen)`])window.matchMedia(e).addEventListener(`change`,()=>{Su.value=Mu()});window.addEventListener(`beforeinstallprompt`,e=>{e.preventDefault(),bu.value=e}),window.addEventListener(`appinstalled`,()=>{xu.value=!0,bu.value=null,Eu.value=``}),bee()}}async function bee(){let e=await xee();if(e===null){wu.value=`unknown`;return}Tu.value=e?`prod`:`dev`;let t=yu({production:e,secure:window.isSecureContext,serviceWorker:`serviceWorker`in navigator});t===`register`?await Cee():t===`unregister`?await wee():wu.value=`none`}async function xee(){try{let e=await fetch(`/api/health`,{cache:`no-store`,headers:{Accept:`application/json`}});if(!e.ok)return null;let t=await e.json();return t.mode===`prod`||t.mode!==`dev`&&null}catch{return null}}async function ku(){if(xu.value||Su.value)return`installed`;let e=bu.value;if(!e)throw Error(`Браузер пока не предлагает установку. Используйте меню браузера → «Установить приложение», а на iPhone — «Поделиться» → «На экран Домой».`);await e.prompt();let t=await e.userChoice;return bu.value=null,t.outcome===`accepted`?(xu.value=!0,`accepted`):`dismissed`}function Au(){return typeof document<`u`&&document.fullscreenEnabled===!0}async function ju(){if(!Au())throw Error(`Браузер не поддерживает полноэкранный режим. На iPhone установите Projector на экран «Домой».`);return document.fullscreenElement?(await document.exitFullscreen(),Nu(),!1):(await document.documentElement.requestFullscreen({navigationUI:`hide`}),Nu(),!0)}function Mu(){return typeof window>`u`?!1:navigator.standalone===!0||window.matchMedia(`(display-mode: standalone)`).matches||window.matchMedia(`(display-mode: fullscreen)`).matches}function See(){return typeof window<`u`&&window.isSecureContext}function Nu(){Cu.value=document.fullscreenElement!==null}async function Cee(){try{await navigator.serviceWorker.register(`/sw.js`,{scope:`/`}),wu.value=`active`,Eu.value=``}catch(e){wu.value=`none`,Eu.value=e instanceof Error?e.message:`Не удалось включить service worker`}}async function wee(){try{let e=await navigator.serviceWorker.getRegistrations();await Promise.all(e.filter(Tee).map(e=>e.unregister()));let t=await caches.keys();await Promise.all(t.filter(e=>e.startsWith(`projector-shell-`)).map(e=>caches.delete(e))),wu.value=`none`,Eu.value=``}catch(e){wu.value=`none`,Eu.value=e instanceof Error?e.message:`Не удалось очистить service worker`}}function Tee(e){return[e.active,e.installing,e.waiting].some(e=>e?.scriptURL.endsWith(`/sw.js`))}var Eee={class:`pwa-settings`},Dee=G(M({__name:`PwaSettings`,setup(e){let{canInstall:n,installed:a,standalone:o,fullscreen:s,worker:c,mode:l,error:d}=Ou(),{busy:f,status:p,perform:m}=u({error:d}),h=Au(),g=See(),v=/iPhone|iPad|iPod/i.test(navigator.userAgent);async function y(){await m(async()=>{let e=await ku();return e===`accepted`?`Установка принята: Projector появится среди приложений.`:e===`installed`?`Projector уже открыт как приложение.`:`Установка отменена.`},{errorFallback:`Не удалось установить приложение`})}async function b(){await m(async()=>await ju()?`Полноэкранный режим включён.`:`Полноэкранный режим выключен.`,{errorFallback:`Не удалось переключить режим`})}return(e,u)=>(V(),q(`section`,Eee,[I(_,{as:`h2`,size:`sm`},{default:F(()=>[...u[0]||=[N(`Установка приложения`,-1)]]),_:1}),I(i,{class:`hint`},{default:F(()=>[...u[1]||=[N(` Projector — локальный сервер: установка добавляет иконку и отдельное окно без адресной строки. Офлайн-режима нет — файлы, Git и терминалы работают только с запущенным сервером. `,-1)]]),_:1}),I(r,{class:`badges`,align:`center`,wrap:``},{default:F(()=>[I(hl,{tone:H(o)?`info`:`neutral`},{default:F(()=>[N(j(H(o)?`открыто как приложение`:`вкладка браузера`),1)]),_:1},8,[`tone`]),H(a)?(V(),Y(hl,{key:0,tone:`info`},{default:F(()=>[...u[2]||=[N(`установлено`,-1)]]),_:1})):B(``,!0),H(c)===`active`?(V(),Y(hl,{key:1,tone:`info`},{default:F(()=>[...u[3]||=[N(`service worker`,-1)]]),_:1})):H(c)===`none`?(V(),Y(hl,{key:2},{default:F(()=>[...u[4]||=[N(`без service worker`,-1)]]),_:1})):B(``,!0),H(l)===`unknown`?B(``,!0):(V(),Y(hl,{key:3},{default:F(()=>[N(j(H(l)),1)]),_:1})),I(hl,{tone:H(g)?`neutral`:`warning`},{default:F(()=>[N(j(H(g)?`localhost или HTTPS`:`HTTP в сети`),1)]),_:1},8,[`tone`])]),_:1}),H(o)?(V(),Y(i,{key:0,class:`hint`},{default:F(()=>[...u[5]||=[N(` Окно уже работает без браузерной обвязки. Полноэкранный режим скрывает и системные панели. `,-1)]]),_:1})):H(l)===`dev`?(V(),Y(i,{key:1,class:`hint`},{default:F(()=>[...u[6]||=[N(` Сервер работает в dev: service worker отключён, поэтому при выключенном сервере нет даже страницы «Projector не отвечает». Установка доступна, если браузер её предлагает; в Chrome и Edge — меню → «Установить приложение». `,-1)]]),_:1})):!H(n)&&!H(v)?(V(),Y(i,{key:2,class:`hint`},{default:F(()=>[...u[7]||=[N(` Браузер предложит установку, когда сочтёт страницу готовой. Если предложения нет, используйте меню браузера → «Установить приложение» (Chrome/Edge). `,-1)]]),_:1})):B(``,!0),H(v)?(V(),Y(i,{key:3,class:`hint`},{default:F(()=>[...u[8]||=[N(` Safari на iPhone не показывает системное предложение: откройте «Поделиться» → «На экран Домой». Полноэкранный режим там даёт только установленное приложение. `,-1)]]),_:1})):B(``,!0),H(g)?B(``,!0):(V(),Y(i,{key:4,class:`hint`},{default:F(()=>[...u[9]||=[N(` Адрес в локальной сети открыт по HTTP. Установка и service worker требуют HTTPS или localhost; для телефона нужен сертификат либо туннель с HTTPS. `,-1)]]),_:1})),I(r,{class:`actions`,align:`stretch`,wrap:``},{default:F(()=>[I(Q,{appearance:`solid`,disabled:H(f)||!H(n)||H(o),busy:H(f),onClick:y},{default:F(()=>[...u[10]||=[N(`Установить приложение`,-1)]]),_:1},8,[`disabled`,`busy`]),H(h)?(V(),Y(Q,{key:0,disabled:H(f),onClick:b},{default:F(()=>[N(j(H(s)?`Выйти из полного экрана`:`На весь экран`),1)]),_:1},8,[`disabled`])):B(``,!0)]),_:1}),H(d)?(V(),Y(t,{key:5,role:`alert`,tone:`danger`,size:`xs`,class:`message`},{default:F(()=>[N(j(H(d)),1)]),_:1})):H(p)?(V(),Y(t,{key:6,role:`status`,size:`xs`,class:`message`},{default:F(()=>[N(j(H(p)),1)]),_:1})):B(``,!0)]))}}),[[`__scopeId`,`data-v-9324760d`]]),Pu=(e,t)=>fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}),Oee=()=>{let e=Error(`Запрос IDE истёк`);return e.name=`AbortError`,e};function kee(e,t){return new Promise(n=>{if(t.aborted||e<=0)return n();let r,i=()=>{clearTimeout(r),t.removeEventListener(`abort`,i),n()};r=setTimeout(i,e),t.addEventListener(`abort`,i,{once:!0})})}function Aee(e,t){return new Promise((n,r)=>{let i=()=>r(Oee());if(t.aborted)return i();t.addEventListener(`abort`,i,{once:!0}),e.then(n,r).finally(()=>t.removeEventListener(`abort`,i))})}function jee(e){let t=new Map,n=async n=>{let r=new AbortController;t.set(n.id,r);let i=Number.isFinite(n.expiresAt)?n.expiresAt:Date.now()+6e4,a=setTimeout(()=>r.abort(),Math.max(0,i-Date.now())),o=()=>r.signal.aborted||Date.now()>=i;try{if(o()||n.owner&&n.owner!==Ur&&n.fallbackAt>Date.now()&&(await kee(n.fallbackAt-Date.now(),r.signal),o()))return;let t=await Pu(`/api/ide/command-request/claim`,{id:n.id,page:Ur});if(!(t.ok&&(await t.json()).claimed===!0)||o())return;let i=n.request;if(i.operation===`execute`&&i.command&&!S(i.command)){let t=i.scope?e.describeCommand(i.scope,i.command,i.args):void 0,n=i.args?JSON.stringify(i.args,null,2):``,r=[t?.title??i.command,i.command,n].filter(Boolean).join(`
|
|
3
|
+
`);if(!window.confirm(`Агент хочет выполнить команду Projector:\n\n${r}`))throw Error(`Пользователь отклонил действие`);if(o())return}let a=await Aee(vu(e,n.projectId)(i,r.signal),r.signal);if(o())return;await Pu(`/api/ide/command-request/result`,{id:n.id,page:Ur,output:a})}catch(e){if(o())return;await Pu(`/api/ide/command-request/result`,{id:n.id,page:Ur,error:e instanceof Error?e.message:`Не удалось выполнить команду`}).catch(()=>void 0)}finally{clearTimeout(a),t.delete(n.id)}},r=t=>{let r=t.detail;r?.id&&r.projectId&&e.getScopes().some(({context:e})=>e.projectId===r.projectId)&&n(r)},i=e=>{let n=e.detail;n?.id&&t.get(n.id)?.abort()};return window.addEventListener(`projector:ide-command-request`,r),window.addEventListener(`projector:ide-command-cancel`,i),()=>{window.removeEventListener(`projector:ide-command-request`,r),window.removeEventListener(`projector:ide-command-cancel`,i);for(let e of t.values())e.abort();t.clear()}}function Mee(e,t){let n=new BroadcastChannel(`projector:page-reload`),r=!1,i=!1,a=e=>{r=e,t()};async function o(){let e=await fetch(`/api/health`,{cache:`no-store`,signal:AbortSignal.timeout(2e3)}),t=await e.json();if(!e.ok||!t.ok||t.app!==`projector`||!Number.isInteger(t.pid))throw Error(`Сервер Projector недоступен`);return{pid:t.pid,mode:t.mode===`prod`?`prod`:`dev`,network:t.network?.mode===`lan`?`lan`:`local`}}let s=null,c=null;async function l(){try{let{mode:e,network:n}=await o();(e!==s||n!==c)&&(s=e,c=n,i||t())}catch{}}async function u(e){a(!0);try{let t=Date.now()+6e4;for(;!i&&Date.now()<t;){try{if((await o()).pid!==e){i||window.location.reload();return}}catch{}await new Promise(e=>setTimeout(e,500))}if(!i)throw Error(`Сервер не запустился за 60 секунд. Страницы не перезагружены.`)}finally{i||a(!1)}}return n.onmessage=({data:t})=>{i||r||(t?.type===`reload`&&window.location.reload(),t?.type===`restart`&&Number.isInteger(t.pid)&&u(t.pid).catch(e))},{isBusy:()=>r,canSwitchMode:e=>!r&&s!==e,canSwitchNetwork:e=>!r&&c!==e,refreshMode:l,reloadPages(){n.postMessage({type:`reload`}),window.location.reload()},async restartServer(){if(!r&&window.confirm(`Перезапустить сервер Projector и открытые страницы? Все терминалы и дочерние процессы будут завершены. Сохраните изменения перед перезапуском.`)){a(!0);try{let{pid:e}=await o(),t=await fetch(`/api/app/restart`,{method:`POST`}),r=await t.json();if(!t.ok||!r.ok)throw Error(r.error||`Не удалось перезапустить сервер Projector`);n.postMessage({type:`restart`,pid:e}),await u(e)}finally{i||a(!1)}}},async switchMode(e){if(r)return;let{pid:t,mode:s}=await o();if(s===e)throw Error(`Сервер уже работает в режиме ${e}`);if(window.confirm(`Переключить сервер Projector в режим ${e}${e===`prod`?` (сначала выполняется сборка)`:``}? Все терминалы и дочерние процессы будут завершены. Сохраните изменения перед переключением.`)){a(!0);try{let r=await fetch(`/api/app/mode`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({mode:e})}),i=await r.json();if(!r.ok||!i.ok)throw Error(i.error||`Не удалось переключить режим сервера`);n.postMessage({type:`restart`,pid:t}),await u(t)}finally{i||a(!1)}}},async switchNetwork(e){if(r)return;let{pid:t,network:s}=await o();if(s===e)throw Error(`Сервер уже работает в режиме ${e}`);if(window.confirm(`Переключить доступ Projector в режим ${e===`lan`?`локальной сети`:`только localhost`}? Сервер будет перезапущен, терминалы и дочерние процессы завершены.`)){a(!0);try{let r=await fetch(`/api/app/network`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({mode:e})}),i=await r.json();if(!r.ok||!i.ok)throw Error(i.error||`Не удалось переключить доступ по сети`);n.postMessage({type:`restart`,pid:t}),await u(t)}finally{i||a(!1)}}},dispose(){i=!0,n.close()}}}var Fu=Symbol(`ide`);function Iu(){let e=tt(Fu);if(!e)throw Error(`IDE SDK unavailable`);return e}function Nee(){return tt(Fu,void 0)}function Pee(){let e=d(w),t=X(0),n=X(``),r=X(null),i=e=>{n.value=e instanceof Error?e.message:`Не удалось выполнить команду`},a=e.createScope(`workbench`,()=>({surface:`workbench`})),{canInstall:o}=Ou(),s=Mee(i,()=>t.value++);a.registerCommand({id:`ide.workbench.pwa.install`,title:`Установить Projector как приложение`,description:`Открывает системное предложение установки: иконка в меню приложений и отдельное окно без адресной строки. Доступно, когда браузер предложил установку; в dev service worker и офлайн-кеш не включаются.`,enabled:()=>o.value,run:()=>ku()}),a.registerCommand({id:`ide.workbench.fullscreen.toggle`,title:`Полноэкранный режим`,description:`Скрывает интерфейс браузера и освобождает весь экран под рабочую область; на телефоне это заменяет установленное приложение. Выход — повторный вызов или Esc.`,enabled:()=>Au(),run:()=>ju()}),a.registerCommand({id:`ide.workbench.pages.reload`,title:`Перезагрузить открытые страницы Projector`,description:`Обновляет все открытые страницы Projector на текущем адресе. Несохранённые изменения используют обычное подтверждение страницы.`,enabled:()=>!s.isBusy(),run:()=>s.reloadPages()}),a.registerCommand({id:`ide.workbench.server.restart`,title:`Перезапустить сервер и открытые страницы`,description:`Запрашивает подтверждение, завершает терминалы и дочерние процессы, перезапускает сервер Projector и обновляет все открытые страницы после запуска нового процесса.`,enabled:()=>!s.isBusy(),run:()=>s.restartServer()}),a.registerCommand({id:`ide.workbench.server.mode.dev`,title:`Переключить сервер в режим dev (HMR)`,description:`Перезапускает Projector через vp dev с горячей заменой модулей. Запрашивает подтверждение, завершает терминалы и дочерние процессы, затем обновляет все открытые страницы.`,enabled:()=>s.canSwitchMode(`dev`),run:()=>s.switchMode(`dev`)}),a.registerCommand({id:`ide.workbench.server.mode.prod`,title:`Переключить сервер в режим prod (сборка)`,description:`Собирает фронтенд (vp build) и перезапускает Projector на собственном Node-сервере. Изменения кода после этого не применяются без повторного переключения. Запрашивает подтверждение, завершает терминалы и дочерние процессы, затем обновляет все открытые страницы.`,enabled:()=>s.canSwitchMode(`prod`),run:()=>s.switchMode(`prod`)}),a.registerCommand({id:`ide.workbench.server.network.lan`,title:`Открыть Projector для локальной сети`,description:`Переключает сервер на все сетевые интерфейсы, чтобы управлять Projector с телефона или другой машины. Пароль доступа задаётся в настройках. Перезапускает сервер и завершает терминалы.`,enabled:()=>s.canSwitchNetwork(`lan`),run:()=>s.switchNetwork(`lan`)}),a.registerCommand({id:`ide.workbench.server.network.local`,title:`Ограничить Projector только локально`,description:`Возвращает сервер на localhost и закрывает доступ из локальной сети. Перезапускает сервер и завершает терминалы.`,enabled:()=>s.canSwitchNetwork(`local`),run:()=>s.switchNetwork(`local`)}),a.registerCommand({id:`ide.workbench.commandPalette.open`,title:`Открыть командный центр`,enabled:()=>!!r.value||!document.querySelector(`dialog[open]`),run:async()=>{r.value||(await s.refreshMode(),!r.value&&(r.value={commands:_u(e.getCommands(),e.getScopes(),e.getActiveScope()),trigger:document.activeElement instanceof HTMLElement?document.activeElement:null}))}});function c(e){if(e.defaultPrevented||document.querySelector(`dialog[open]`)&&!r.value)return;let t=e.target,n=t instanceof Element&&!!t.closest(`input,textarea,select,[contenteditable="true"]`),o=a.resolveKeybinding(e,n);o&&(e.preventDefault(),e.stopPropagation(),a.executeCommand(o.command,o.args).catch(i))}let l=jee(e);Lt(()=>{window.addEventListener(`keydown`,c,!0),s.refreshMode()});let u=e.subscribe(()=>t.value++);ot(h,{revision:t,createScope:e.createScope,reportError:i});async function f(){let t=await fetch(`/api/ide/keybindings`),n=await t.json();if(!t.ok)throw Error(n.error||`Не удалось загрузить привязки клавиш`);return e.setKeybindings(n.bindings),n}async function p(t){let n=y(t),r=await fetch(`/api/ide/keybindings`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({bindings:n})}),i=await r.json();if(!r.ok)throw Error(i.error||`Не удалось сохранить привязки клавиш`);return e.setKeybindings(i.bindings),i}let m={...e,reloadKeybindings:f,saveKeybindings:p};ot(Fu,{api:m,revision:t,palette:r,reportError:i});let g=window,_=g.projector?.ide;return g.projector??={},g.projector.ide=m,f().catch(e=>{n.value=e instanceof Error?e.message:String(e)}),lt(()=>{l(),s.dispose(),u(),window.removeEventListener(`keydown`,c,!0),a.dispose(),g.projector?.ide===m&&(g.projector.ide=_)}),{error:n}}var Lu=G(M({__name:`UiScrollArea`,setup(e,{expose:t}){let n=We();return t({get element(){return n.value??void 0}}),(e,t)=>(V(),q(`div`,{ref_key:`element`,ref:n,class:`ui-scroll-area`},[L(e.$slots,`default`,{},void 0,!0)],512))}}),[[`__scopeId`,`data-v-ce7e351b`]]),Ru=G(M({__name:`UiTable`,props:{padding:{},align:{},sticky:{type:Boolean},headerTone:{},headerWeight:{},subtle:{type:Boolean},hover:{type:Boolean}},setup(e){return(t,n)=>(V(),q(`table`,{class:O([`ui-table`,{sticky:e.sticky,hover:e.hover}]),style:k({"--ui-table-padding":e.padding??`var(--sp-3) var(--sp-3)`,"--ui-table-align":e.align,"--ui-table-header-color":e.headerTone===`muted`?`var(--muted)`:void 0,"--ui-table-header-weight":e.headerWeight??500,"--ui-table-body-border":e.subtle?`color-mix(in srgb, var(--line) 50%, transparent)`:`var(--line)`})},[L(t.$slots,`default`,{},void 0,!0)],6))}}),[[`__scopeId`,`data-v-70aae808`]]);function Fee(e){return typeof e==`object`?e.key:e}function Iee(e,t){let n=e.length;return new Proxy(e,{get(e,r,i){if(typeof r==`string`){let i=r.charCodeAt(0);if(i>=48&&i<=57){let i=+r;if(Number.isInteger(i)&&i>=0&&i<n){let n=e[i];if(typeof n!=`object`){let r=t[i*2];n=e[i]={index:i,key:n,start:r,size:t[i*2+1],end:r+t[i*2+1],lane:0}}return n}}if(r===`length`)return n}return Reflect.get(e,r,i)}})}function zu(e,t,n){let r=n.initialDeps??[],i,a=!0;function o(){let o=e();return(o.length!==r.length||o.some((e,t)=>r[t]!==e))&&(r=o,i=t(...o),n?.onChange&&!(a&&n.skipInitialOnChange)&&n.onChange(i),a=!1),i}return o.updateDeps=e=>{r=e},o}function Bu(e,t){if(e===void 0)throw Error(`Unexpected undefined${t?`: ${t}`:``}`);return e}var Vu=(e,t)=>Math.abs(e-t)<1.01,Lee=(e,t,n)=>{let r;return Object.assign(function(...i){e.clearTimeout(r),r=e.setTimeout(()=>t.apply(this,i),n)},{cancel:()=>{e.clearTimeout(r)}})},Hu,Uu=()=>{if(Hu!==void 0)return Hu;if(typeof navigator>`u`)return Hu=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return Hu=!0;let e=navigator.maxTouchPoints;return Hu=navigator.platform===`MacIntel`&&e!==void 0&&e>0},Wu=e=>{let{offsetWidth:t,offsetHeight:n}=e;return{width:t,height:n}},Ree=e=>e,Gu=e=>{let t=Math.max(e.startIndex-e.overscan,0),n=Math.min(e.endIndex+e.overscan,e.count-1)-t+1,r=Array(n);for(let e=0;e<n;e++)r[e]=t+e;return r},zee=(e,t)=>{let n=e.scrollElement;if(!n)return;let r=e.targetWindow;if(!r)return;let i=e=>{let{width:n,height:r}=e;t({width:Math.round(n),height:Math.round(r)})};if(i(Wu(n)),!r.ResizeObserver)return()=>{};let a=new r.ResizeObserver(t=>{let r=()=>{let e=t[0];if(e?.borderBoxSize){let t=e.borderBoxSize[0];if(t){i({width:t.inlineSize,height:t.blockSize});return}}i(Wu(n))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(r):r()});return a.observe(n,{box:`border-box`}),()=>{a.unobserve(n)}},Ku={passive:!0},Bee=typeof window>`u`||`onscrollend`in window,Vee=(e,t,n)=>{let r=e.scrollElement;if(!r)return;let i=e.targetWindow;if(!i)return;let a=e.options.useScrollendEvent&&Bee,o=0,s=a?null:Lee(i,()=>t(n(r),!1),e.options.isScrollingResetDelay),c=e=>()=>{o=n(r),s?.(),t(o,e)},l=c(!0),u=c(!1);return r.addEventListener(`scroll`,l,Ku),a&&r.addEventListener(`scrollend`,u,Ku),()=>{r.removeEventListener(`scroll`,l),a&&r.removeEventListener(`scrollend`,u),s?.cancel()}},Hee=(e,t)=>Vee(e,t,t=>{let{horizontal:n,isRtl:r}=e.options;return n?t.scrollLeft*(r&&-1||1):t.scrollTop}),Uee=(e,t,n)=>{if(n.options.useCachedMeasurements){let t=n.indexFromElement(e),r=n.options.getItemKey(t);return n.itemSizeCache.get(r)??n.options.estimateSize(t)}if(t?.borderBoxSize){let e=t.borderBoxSize[0];if(e)return Math.round(e[n.options.horizontal?`inlineSize`:`blockSize`])}if(!t){let t=n.indexFromElement(e),r=n.options.getItemKey(t),i=n.itemSizeCache.get(r);if(i!==void 0)return i}return e[n.options.horizontal?`offsetWidth`:`offsetHeight`]},qu=(e,{adjustments:t=0,behavior:n},r)=>{var i,a;(a=(i=r.scrollElement)?.scrollTo)==null||a.call(i,{[r.options.horizontal?`left`:`top`]:e+t,behavior:n})};function Ju(e,t,n,r){if(t===0)return!1;let i=r(0),a=new Set,o=0;for(;o<e;){let e=n(o);if(e===i)break;a.add(e),o++}let s=e-o;if(s===0||s>=t)return!1;for(let e=0;e<s;e++)if(r(e)!==n(o+e))return!1;for(let e=s;e<t;e++)if(a.has(r(e)))return!1;return!0}var Yu=class{constructor(e){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this._singleLaneMeasurements=null,this.itemSizeCache=new Map,this.itemSizeCacheVersion=0,this.laneAssignments=new Map,this.pendingMin=null,this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.pendingScrollAnchor=null,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._intendedScrollOffset=null,this._clampedAdjustment=null,this.elementsCache=new Map,this.now=()=>{var e;return((e=this.targetWindow?.performance)?.now)?.call(e)??Date.now()},this.observer=(()=>{let e=null,t=()=>e||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:e=new this.targetWindow.ResizeObserver(e=>{e.forEach(e=>{let t=()=>{let t=e.target,n=this.indexFromElement(t);if(t.isConnected)this.isIndexInRange(n)&&this.shouldMeasureDuringScroll(n)&&this.resizeItem(n,this.options.measureElement(t,e,this));else{this.observer.unobserve(t);for(let[e,n]of this.elementsCache)if(n===t){this.elementsCache.delete(e);break}}};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(t):t()})}));return{disconnect:()=>{var n;(n=t())==null||n.disconnect(),e=null},observe:e=>t()?.observe(e,{box:`border-box`}),unobserve:e=>t()?.unobserve(e)}})(),this.range=null,this.setOptions=e=>{let t={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:Ree,rangeExtractor:Gu,onChange:()=>{},measureElement:Uee,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:`data-index`,initialMeasurementsCache:[],lanes:1,anchorTo:`start`,followOnAppend:!1,scrollEndThreshold:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:`estimate`,useCachedMeasurements:!1};for(let n in e){let r=e[n];r!==void 0&&(t[n]=r)}let n=this.options,r=null,i=null,a=!1;if(n!==void 0&&n.enabled&&t.enabled&&t.anchorTo===`end`&&this.scrollElement!==null){let e=n.count,o=t.count,s=this.getMeasurements(),c=this._singleLaneMeasurements?.items??s,l=e=>Fee(c[e]),u=e>0?l(0):null,d=e>0?l(e-1):null;if(o!==e||e>0&&o>0&&(t.getItemKey(0)!==u||t.getItemKey(o-1)!==d)){a=!0;let c=e>0?this.getVirtualItemForOffset(this.getScrollOffset())??s[0]:null;c&&(r=[c.key,this.getScrollOffset()-c.start]);let u=t.followOnAppend===!0?`auto`:t.followOnAppend||null;u&&o>0&&this.isAtEnd(n.scrollEndThreshold)&&(e===0||t.getItemKey(o-1)!==d)&&(o>e||Ju(e,o,l,t.getItemKey))&&(i=u)}}this.options=t,a&&(this.pendingMin=0,this.itemSizeCacheVersion++);let o=!1,s=0;if(r&&this.scrollOffset!==null){let[e,t]=r,n=this.getMeasurements(),{count:a,getItemKey:c}=this.options,l=0;for(;l<a&&c(l)!==e;)l++;if(l<a){let e=n[l];if(e){let n=Math.max(0,e.start+t);!i&&n!==this.scrollOffset&&(s=n-this.scrollOffset,this.scrollOffset=n,o=!0)}}}(o||i)&&(this.pendingScrollAnchor=[o?r[0]:null,o?r[1]:0,i,s])},this.notify=e=>{var t,n;(n=(t=this.options).onChange)==null||n.call(t,this,e)},this.maybeNotify=zu(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),e=>{this.notify(e)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(e=>e()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this.isScrolling=!1,this.scrollDirection=null,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this._clampedAdjustment=null,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{let e=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==e){if(this.cleanup(),!e){this.maybeNotify();return}if(this.scrollElement=e,this.targetWindow=this.scrollElement&&`ownerDocument`in this.scrollElement?this.scrollElement.ownerDocument.defaultView:this.scrollElement?.window??null,this.elementsCache.forEach(e=>{this.observer.observe(e)}),this.unsubs.push(this.options.observeElementRect(this,e=>{this.scrollRect=e,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(e,t)=>{if(t&&this._intendedScrollOffset===null&&e===this.scrollOffset)return;this._intendedScrollOffset!==null&&Math.abs(e-this._intendedScrollOffset)<1.5&&(e=this._intendedScrollOffset),this._intendedScrollOffset=null,this._clampedAdjustment!==null&&Math.abs(e-this._clampedAdjustment.maxAtWrite)>=1.5&&(this._clampedAdjustment=null),this.scrollAdjustments=0;let n=this.getScrollOffset();this.scrollDirection=t?n===e?this.scrollDirection:n<e?`forward`:`backward`:null,this.scrollOffset=e,this.isScrolling=t,this._flushIosDeferredIfReady(),this.scrollState&&this.scheduleScrollReconcile(),this.maybeNotify()})),`addEventListener`in this.scrollElement){let e=this.scrollElement,t=()=>{this._iosTouching=!0,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)},n=()=>{this._iosTouching=!1,Uu()&&this.targetWindow!=null&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};e.addEventListener(`touchstart`,t,Ku),e.addEventListener(`touchend`,n,Ku),this.unsubs.push(()=>{e.removeEventListener(`touchstart`,t),e.removeEventListener(`touchend`,n),this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)})}this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}let t=this.pendingScrollAnchor;if(this.pendingScrollAnchor=null,t&&this.scrollElement&&this.options.enabled){let[e,n,r,i]=t;e!==null&&!r&&(Uu()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?i!==0&&(this._iosDeferredAdjustment+=i):this.scrollState?.behavior===`smooth`&&!Vu(this.getScrollOffset()-i,this.scrollState.lastTargetOffset)||this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})),r&&this.scrollToEnd({behavior:r})}this._retryClampedAdjustment()},this._retryClampedAdjustment=()=>{if(this._clampedAdjustment===null||!this.scrollElement||!this.options.enabled)return;let{target:e,maxAtWrite:t}=this._clampedAdjustment,n=this.getMaxScrollOffset();n>t+.5&&(this._clampedAdjustment=e>n+.5?{target:e,maxAtWrite:n}:null,this._scrollToOffset(e,{adjustments:void 0,behavior:void 0}))},this._flushIosDeferredIfReady=()=>{if(this._iosDeferredAdjustment===0||this.isScrolling||this._iosTouching||this._iosJustTouchEnded)return;let e=this.getScrollOffset(),t=this.getMaxScrollOffset();if(e<0||e>t)return;if(this._iosDeferredAdjustment<0&&e>=t-1){this._iosDeferredAdjustment=0;return}let n=this._iosDeferredAdjustment;this._iosDeferredAdjustment=0,this._scrollToOffset(e,{adjustments:this.scrollAdjustments+=n,behavior:void 0})},this.rafId=null,this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?`width`:`height`]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset==`function`?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getMeasurementOptions=zu(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode,this.options.gap],(e,t,n,r,i,a,o,s)=>(this.prevLanes!==void 0&&this.prevLanes!==a&&(this.lanesChangedFlag=!0),this.prevLanes=a,this.pendingMin=null,{count:e,paddingStart:t,scrollMargin:n,getItemKey:r,enabled:i,lanes:a,laneAssignmentMode:o,gap:s}),{key:!1}),this.isIndexInRange=e=>e>=0&&e<this.options.count,this.getMeasurements=zu(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:e,paddingStart:t,scrollMargin:n,getItemKey:r,enabled:i,lanes:a,laneAssignmentMode:o,gap:s},c)=>{let l=this.itemSizeCache;if(!i)return this.measurementsCache=[],this._singleLaneMeasurements=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>e)for(let t of this.laneAssignments.keys())t>=e&&this.laneAssignments.delete(t);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this._singleLaneMeasurements=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMin=null),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(e=>{this.itemSizeCache.set(e.key,e.size)}));let u=this.lanesSettling?0:this.pendingMin??0;if(this.pendingMin=null,this.lanesSettling&&this.measurementsCache.length===e&&(this.lanesSettling=!1),a===1){let i=e*2,a=this._singleLaneMeasurements?.flat;if(!a||a.length<i){let e=new Float64Array(i);a&&u>0&&e.set(a.subarray(0,u*2)),a=e}let o=u===0?Array(e):this._singleLaneMeasurements.items.slice(),c;if(u===0)c=t+n;else{let e=u-1;c=a[e*2]+a[e*2+1]+s}for(let t=u;t<e;t++){let e=r(t);o[t]=e;let n=l.get(e),i=typeof n==`number`?n:this.options.estimateSize(t);a[t*2]=c,a[t*2+1]=i,c+=i+s}this._singleLaneMeasurements={flat:a,items:o};let d=Iee(o,a);return this.measurementsCache=d,d}let d=this.measurementsCache.slice(0,u),f=Array(a).fill(void 0),p=new Float64Array(a),m=0;for(let e=0;e<u;e++){let t=d[e];t&&(f[t.lane]===void 0&&m++,f[t.lane]=e,p[t.lane]=t.end)}for(let i=u;i<e;i++){let e=r(i),c=this.laneAssignments.get(i),u,h,g=o===`estimate`||l.has(e);if(c!==void 0&&this.options.lanes>1){u=c;let e=f[u],r=e===void 0?void 0:d[e];h=r?r.end+s:t+n}else if(m===a){let e=0,t=p[0],n=f[0];for(let r=1;r<a;r++){let i=p[r];(i<t||i===t&&f[r]<n)&&(e=r,t=i,n=f[r])}u=e,h=t+s,g&&this.laneAssignments.set(i,u)}else u=i%this.options.lanes,h=t+n,g&&this.laneAssignments.set(i,u);let _=l.get(e),v=typeof _==`number`?_:this.options.estimateSize(i),y=h+v;d[i]={index:i,start:h,size:v,end:y,key:e,lane:u},f[u]===void 0&&m++,f[u]=i,p[u]=y}return this.measurementsCache=d,d},{key:!1,debug:()=>this.options.debug}),this.calculateRange=zu(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(e,t,n,r)=>e.length===0||t===0?(this.range=null,null):(this.range=Qu(e,t,n,r,r===1&&this._singleLaneMeasurements!==null?this._singleLaneMeasurements.flat:null),this.range),{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=zu(()=>{let e=null,t=null,n=this.calculateRange();return n&&(e=n.startIndex,t=n.endIndex),this.maybeNotify.updateDeps([this.isScrolling,e,t]),[this.options.rangeExtractor,this.options.overscan,this.options.count,e,t]},(e,t,n,r,i)=>r===null||i===null?[]:e({startIndex:r,endIndex:i,overscan:t,count:n}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{let t=this.options.indexAttribute,n=e.getAttribute(t);return n?parseInt(n,10):(console.warn(`Missing attribute name '${t}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=e=>{if(!this.scrollState||this.scrollState.behavior!==`smooth`)return!0;let t=this.scrollState.index??this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)?.index;if(t!==void 0&&this.range){let n=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),r=Math.max(0,t-n),i=Math.min(this.options.count-1,t+n);return e>=r&&e<=i}return!0},this.measureElement=e=>{if(!e){this.elementsCache.forEach((e,t)=>{e.isConnected||(this.observer.unobserve(e),this.elementsCache.delete(t))});return}let t=this.indexFromElement(e);if(!this.isIndexInRange(t))return;let n=this.options.getItemKey(t),r=this.elementsCache.get(n);r!==e&&(r&&this.observer.unobserve(r),this.observer.observe(e),this.elementsCache.set(n,e)),(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(t)&&this.resizeItem(t,this.options.measureElement(e,void 0,this))},this.resizeItem=(e,t)=>{if(!this.isIndexInRange(e))return;let n,r,i,a=this._singleLaneMeasurements?.flat;if(this.options.lanes===1&&a!=null)i=this.options.getItemKey(e),r=a[e*2],n=a[e*2+1];else{let t=this.measurementsCache[e];if(!t)return;i=t.key,r=t.start,n=t.size}let o=this.itemSizeCache.get(i)??n,s=t-o;if(s!==0){let a=this.options.anchorTo===`end`&&this.scrollState?.behavior!==`smooth`&&this.getVirtualDistanceFromEnd()<=this.options.scrollEndThreshold,c=a?this.getTotalSize():0,l=this.getScrollOffset()+this.scrollAdjustments,u=this.itemSizeCache.has(i)?r+o<=l&&this.scrollDirection!==`backward`:r<l,d=this.scrollState?.behavior!==`smooth`&&(this.shouldAdjustScrollPositionOnItemSizeChange===void 0?u:this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[e]??{index:e,key:i,start:r,size:n,end:r+n,lane:0},s,this));(this.pendingMin===null||e<this.pendingMin)&&(this.pendingMin=e),this.itemSizeCache.set(i,t),this.itemSizeCacheVersion++;let f=!1;a?f=this.applyScrollAdjustment(this.getTotalSize()-c):d&&(f=this.applyScrollAdjustment(s)),this.notify(f),this._retryClampedAdjustment()}},this.getVirtualItems=zu(()=>[this.getVirtualIndexes(),this.getMeasurements()],(e,t)=>{let n=[];for(let r=0,i=e.length;r<i;r++){let i=t[e[r]];n.push(i)}return n},{key:!1,debug:()=>this.options.debug}),this.getVirtualItemForOffset=e=>{let t=this.getMeasurements();if(t.length===0)return;let n=this._singleLaneMeasurements?.flat,r=this.options.lanes===1&&n!=null;return Bu(t[Xu(0,t.length-1,r?e=>n[e*2]:e=>Bu(t[e]).start,e)])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if(`scrollHeight`in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{let e=this.scrollElement.document.documentElement;return this.options.horizontal?e.scrollWidth-this.scrollElement.innerWidth:e.scrollHeight-this.scrollElement.innerHeight}},this.getVirtualDistanceFromEnd=()=>Math.max(this.getTotalSize()-this.getSize()-this.getScrollOffset(),0),this.getDistanceFromEnd=()=>Math.max(this.getMaxScrollOffset()-this.getScrollOffset(),0),this.isAtEnd=(e=this.options.scrollEndThreshold)=>this.getDistanceFromEnd()<=e,this.getOffsetForAlignment=(e,t,n=0)=>{if(!this.scrollElement)return 0;let r=this.getSize(),i=this.getScrollOffset();t===`auto`&&(t=e>=i+r?`end`:`start`),t===`center`?e+=(n-r)/2:t===`end`&&(e-=r);let a=this.getMaxScrollOffset();return Math.max(Math.min(a,e),0)},this.getOffsetForIndex=(e,t=`auto`)=>{e=Math.max(0,Math.min(e,this.options.count-1));let n=this.getSize(),r=this.getScrollOffset(),i=this.measurementsCache[e];if(!i)return;if(t===`auto`){if(i.end>=r+n-this.options.scrollPaddingEnd)t=`end`;else if(i.start<=r+this.options.scrollPaddingStart)t=`start`;else return[r,t]}if(t===`end`&&e===this.options.count-1)return[this.getMaxScrollOffset(),t];let a=t===`end`?i.end+this.options.scrollPaddingEnd:i.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(a,t,i.size),t]},this.scrollToOffset=(e,{align:t=`start`,behavior:n=`auto`}={})=>{this._iosDeferredAdjustment=0;let r=this.getOffsetForAlignment(e,t),i=this.now();this.scrollState={index:null,align:t,behavior:n,startedAt:i,lastTargetOffset:r,stableFrames:0},this._scrollToOffset(r,{adjustments:void 0,behavior:n}),this.scheduleScrollReconcile()},this.scrollToIndex=(e,{align:t=`auto`,behavior:n=`auto`}={})=>{this._iosDeferredAdjustment=0,e=Math.max(0,Math.min(e,this.options.count-1));let r=this.getOffsetForIndex(e,t);if(!r)return;let[i,a]=r,o=this.now();this.scrollState={index:e,align:a,behavior:n,startedAt:o,lastTargetOffset:i,stableFrames:0},this._scrollToOffset(i,{adjustments:void 0,behavior:n}),this.scheduleScrollReconcile()},this.scrollBy=(e,{behavior:t=`auto`}={})=>{let n=this.getScrollOffset()+e,r=this.now();this.scrollState={index:null,align:`start`,behavior:t,startedAt:r,lastTargetOffset:n,stableFrames:0},this._scrollToOffset(n,{adjustments:void 0,behavior:t}),this.scheduleScrollReconcile()},this.scrollToEnd=({behavior:e=`auto`}={})=>{this.options.count>0?this.scrollToIndex(this.options.count-1,{align:`end`,behavior:e}):this.scrollToOffset(Math.max(this.getTotalSize()-this.getSize(),0),{behavior:e})},this.getTotalSize=()=>{let e=this.getMeasurements(),t;if(e.length===0)t=this.options.paddingStart;else if(this.options.lanes===1){let n=e.length-1,r=this._singleLaneMeasurements?.flat;t=r==null?e[n]?.end??0:r[n*2]+r[n*2+1]}else{let n=Array(this.options.lanes).fill(null),r=e.length-1;for(;r>=0&&n.some(e=>e===null);){let t=e[r];n[t.lane]===null&&(n[t.lane]=t.end),r--}t=Math.max(...n.filter(e=>e!==null))}return Math.max(t-this.options.scrollMargin+this.options.paddingEnd,0)},this.takeSnapshot=()=>{let e=[];if(this.itemSizeCache.size===0)return e;let t=this.getMeasurements();for(let n of t)n&&this.itemSizeCache.has(n.key)&&e.push({index:n.index,key:n.key,start:n.start,size:n.size,end:n.end,lane:n.lane});return e},this._scrollToOffset=(e,{adjustments:t,behavior:n})=>{this._intendedScrollOffset=e+(t??0),this.options.scrollToFn(e,{behavior:n,adjustments:t},this)},this.measure=()=>{this.pendingMin=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.itemSizeCacheVersion++,this.notify(!1)},this.setOptions(e)}applyScrollAdjustment(e,t){if(e===0)return!1;if(Uu()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded))return this._iosDeferredAdjustment+=e,!1;{let n=this.getScrollOffset()+this.scrollAdjustments+e,r=this.scrollElement,i=r!==null&&(`scrollHeight`in r||`document`in r)?this.getMaxScrollOffset():null;return this._clampedAdjustment=i!==null&&n>i+.5?{target:n,maxAtWrite:i}:null,this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=e,behavior:t}),this.scrollOffset!==null&&(this.scrollOffset+=this.scrollAdjustments,this.scrollOffset<0&&(this.scrollOffset=0),this.scrollAdjustments=0),!0}}scheduleScrollReconcile(){this.targetWindow?this.rafId??=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()}):this.scrollState=null}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}let e=this.scrollState.index==null?void 0:this.getOffsetForIndex(this.scrollState.index,this.scrollState.align),t=e?e[0]:this.scrollState.lastTargetOffset,n=t!==this.scrollState.lastTargetOffset;if(!n&&Vu(t,this.getScrollOffset())){if(this.scrollState.stableFrames++,this.scrollState.stableFrames>=1){this.getScrollOffset()!==t&&this._scrollToOffset(t,{adjustments:void 0,behavior:`auto`}),this.scrollState=null;return}}else if(this.scrollState.stableFrames=0,n){let e=this.getSize()||600,n=Math.abs(t-this.getScrollOffset()),r=this.scrollState.behavior===`smooth`&&n>e;this.scrollState.lastTargetOffset=t,r||(this.scrollState.behavior=`auto`),this._scrollToOffset(t,{adjustments:void 0,behavior:r?`smooth`:`auto`})}this.scheduleScrollReconcile()}},Xu=(e,t,n,r)=>{for(;e<=t;){let i=(e+t)/2|0,a=n(i);if(a<r)e=i+1;else if(a>r)t=i-1;else return i}return e>0?e-1:0};function Zu(e,t,n){let r=0;for(;r<=t;){let i=(r+t)/2|0,a=e[i*2];if(a<n)r=i+1;else if(a>n)t=i-1;else return i}return r>0?r-1:0}function Qu(e,t,n,r,i){let a=e.length-1;if(e.length<=r)return{startIndex:0,endIndex:a};if(r===1&&i!==null){let e=Zu(i,a,n),r=e,o=n+t;for(;r<a&&i[r*2]+i[r*2+1]<o;)r++;return{startIndex:e,endIndex:r}}let o=Xu(0,a,t=>e[t].start,n),s=o;if(r===1)for(;s<a&&e[s].end<n+t;)s++;else if(r>1){let i=Array(r).fill(0);for(;s<a&&i.some(e=>e<n+t);){let t=e[s];i[t.lane]=t.end,s++}let c=Array(r).fill(n+t);for(;o>=0&&c.some(e=>e>=n);){let t=e[o];c[t.lane]=t.start,o--}o=Math.max(0,o-o%r),s=Math.min(a,s+(r-1-s%r))}return{startIndex:o,endIndex:s}}function $u(e){let t=new Yu(H(e)),n=We(t),r=t._didMount();return R(()=>H(e).getScrollElement(),e=>{e&&t._willUpdate()},{immediate:!0}),R(()=>H(e),e=>{t.setOptions({...e,onChange:(t,r)=>{var i;Fe(n),(i=e.onChange)==null||i.call(e,t,r)}}),t._willUpdate(),Fe(n)},{immediate:!0}),zt(r),n}function ed(e){return $u(z(()=>({observeElementRect:zee,observeElementOffset:Hee,scrollToFn:qu,...H(e)})))}var td=M({__name:`UiVirtualList`,props:{items:{},itemKey:{},scrollElement:{},estimateSize:{type:[Number,Function],default:64},overscan:{default:6},scrollMargin:{default:0},resetKey:{}},setup(e,{expose:t}){let n=e,r=X(),i=ed(z(()=>{let e=r.value,t=e===void 0?-1:n.items.findIndex(t=>n.itemKey(t)===e);return{count:n.items.length,getScrollElement:()=>n.scrollElement,getItemKey:e=>n.itemKey(n.items[e]),estimateSize:e=>typeof n.estimateSize==`function`?n.estimateSize(n.items[e],e):n.estimateSize,overscan:n.overscan,useAnimationFrameWithResizeObserver:!0,scrollMargin:n.scrollMargin,rangeExtractor:e=>{let n=Gu(e);return t<0||n.includes(t)?n:[...n,t].sort((e,t)=>e-t)}}}));function a(){let e=n.scrollElement?.contains(document.activeElement)?document.activeElement?.closest(`[data-virtual-index]`):null,t=e?n.items[Number(e.dataset.virtualIndex)]:void 0;r.value=t===void 0?void 0:n.itemKey(t)}Ql(()=>n.scrollElement,`focusin`,a),Ql(()=>n.scrollElement,`focusout`,()=>queueMicrotask(a));let o=z(()=>{let e=n.scrollMargin;return{rows:i.value.getVirtualItems().map(t=>{let r=Math.max(0,t.start-e);e=t.end;let i=n.items[t.index];return{item:i,index:t.index,key:n.itemKey(i),gapBefore:r}}),paddingAfter:Math.max(0,i.value.getTotalSize()+n.scrollMargin-e)}});function s(e){(e===null||e instanceof HTMLElement)&&i.value.measureElement(e)}return R(()=>n.resetKey,()=>{i.value.scrollToOffset(0)},{flush:`post`}),R(()=>n.items.length,()=>{let e=n.scrollElement;e&&(e.scrollTop=Math.min(e.scrollTop,Math.max(0,i.value.getTotalSize()+n.scrollMargin-e.clientHeight)))},{flush:`post`}),t({scrollToIndex:e=>i.value.scrollToIndex(e,{align:`auto`}),measure:()=>i.value.measure()}),(e,t)=>L(e.$slots,`default`,{rows:o.value.rows,paddingAfter:o.value.paddingAfter,measureElement:s})}}),nd=G(M({__name:`UiEmpty`,props:{density:{},align:{}},setup(e){return(t,n)=>(V(),q(`p`,{class:O([`empty`,[e.density,e.align]])},[L(t.$slots,`default`,{},void 0,!0)],2))}}),[[`__scopeId`,`data-v-aa27e937`]]),rd={},id={class:`kbd`};function ad(e,t){return V(),q(`kbd`,id,[L(e.$slots,`default`,{},void 0,!0)])}var od=G(rd,[[`render`,ad],[`__scopeId`,`data-v-36150e03`]]),sd={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function cd(e,t){return V(),q(`svg`,sd,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497zM15 5l4 4`},null,-1)]])}var ld=U({name:`lucide-pencil`,render:cd}),ud={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function dd(e,t){return V(),q(`svg`,ud,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8`}),K(`path`,{d:`M3 3v5h5`})],-1)]])}var fd=U({name:`lucide-rotate-ccw`,render:dd}),pd={key:0,class:`virtual-spacer`,"aria-hidden":`true`},md=[`data-index`,`data-virtual-index`,`aria-rowindex`,`data-command`,`onDblclick`],hd=[`disabled`,`aria-label`,`onClick`],gd={key:1,class:`muted`},_d={class:`when`},vd={class:`actions`},yd={key:0,class:`virtual-spacer`,"aria-hidden":`true`},bd=G(M({__name:`KeybindingsTable`,props:{rows:{},busy:{type:Boolean},resetKey:{},displayKey:{type:Function},condition:{type:Function}},emits:[`action`],setup(e,{emit:t}){let n=t,r=X(),i=z(()=>r.value?.element??null),a=X(null),{height:o}=cu(a),s=X(0),c;R(o,e=>{c!==void 0&&cancelAnimationFrame(c),c=requestAnimationFrame(()=>{c=void 0,s.value=e})}),zt(()=>{c!==void 0&&cancelAnimationFrame(c)});let l=e=>`${e.command}:${e.index}`;return(t,o)=>(V(),Y(Lu,{ref_key:`scrollArea`,ref:r,class:`table-scroll`},{default:F(()=>[I(Ru,{"aria-rowcount":e.rows.length+1,"header-tone":`muted`,sticky:``,subtle:``,hover:``},{default:F(()=>[o[1]||=K(`colgroup`,null,[K(`col`,{class:`command-column`}),K(`col`,{class:`binding-column`}),K(`col`,{class:`when-column`}),K(`col`,{class:`source-column`}),K(`col`,{class:`actions-column`})],-1),K(`thead`,{ref_key:`tableHeader`,ref:a},[...o[0]||=[K(`tr`,null,[K(`th`,null,`Команда`),K(`th`,null,`Сочетание`),K(`th`,null,`Когда`),K(`th`,null,`Источник`),K(`th`,null,[K(`span`,{class:`u-sr-only`},`Действия`)])],-1)]],512),I(td,{items:e.rows,"item-key":l,"scroll-element":i.value,"scroll-margin":s.value,"reset-key":e.resetKey,"estimate-size":72},{default:F(({rows:t,paddingAfter:r,measureElement:i})=>[K(`tbody`,null,[(V(!0),q(W,null,J(t,({item:t,index:r,key:a,gapBefore:o})=>(V(),q(W,{key:a},[o?(V(),q(`tr`,pd,[K(`td`,{colspan:`5`,style:k({height:`${o}px`})},null,4)])):B(``,!0),K(`tr`,{ref_for:!0,ref:i,"data-index":r,"data-virtual-index":r,"aria-rowindex":r+2,"data-command":t.command,onDblclick:r=>!e.busy&&n(`action`,`edit`,t)},[K(`td`,null,[K(`span`,null,j(t.title),1),K(`small`,null,j(t.command),1)]),K(`td`,null,[K(`button`,{class:`binding`,disabled:e.busy,"aria-label":`Изменить сочетание: ${t.command}`,onClick:e=>n(`action`,`edit`,t)},[t.rule&&!t.rule.disabled?(V(),Y(od,{key:0},{default:F(()=>[N(j(e.displayKey(t.rule.key)),1)]),_:2},1024)):(V(),q(`span`,gd,`Не назначено`))],8,hd)]),K(`td`,_d,j(e.condition(t.rule)),1),K(`td`,null,j(t.custom?`Пользователь`:`По умолчанию`),1),K(`td`,vd,[I(Q,{shape:`icon`,size:`sm`,disabled:e.busy,"aria-label":`Изменить: ${t.command}`,title:`Изменить сочетание`,onClick:e=>n(`action`,`edit`,t)},{default:F(()=>[I(H(ld))]),_:1},8,[`disabled`,`aria-label`,`onClick`]),t.rule&&!t.rule.disabled?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,disabled:e.busy,"aria-label":`Удалить: ${t.command}`,title:`Удалить привязку`,onClick:e=>n(`action`,`remove`,t)},{default:F(()=>[I(H(oi))]),_:1},8,[`disabled`,`aria-label`,`onClick`])):B(``,!0),t.custom?(V(),Y(Q,{key:1,shape:`icon`,size:`sm`,disabled:e.busy,"aria-label":`Сбросить: ${t.command}`,title:`Восстановить стандартные привязки команды`,onClick:e=>n(`action`,`reset`,t)},{default:F(()=>[I(H(fd))]),_:1},8,[`disabled`,`aria-label`,`onClick`])):B(``,!0)])],40,md)],64))),128)),r?(V(),q(`tr`,yd,[K(`td`,{colspan:`5`,style:k({height:`${r}px`})},null,4)])):B(``,!0)])]),_:1},8,[`items`,`scroll-element`,`scroll-margin`,`reset-key`])]),_:1},8,[`aria-rowcount`]),e.rows.length?B(``,!0):(V(),Y(nd,{key:0},{default:F(()=>[...o[2]||=[N(`Команды не найдены`,-1)]]),_:1}))]),_:1},512))}}),[[`__scopeId`,`data-v-5eadaf67`]]),xd=G(M({__name:`UiDialogActions`,setup(e){return(e,t)=>(V(),Y(r,{class:`actions`,align:`normal`,justify:`flex-end`},{default:F(()=>[L(e.$slots,`default`,{},void 0,!0)]),_:3}))}}),[[`__scopeId`,`data-v-fc7edbb9`]]),Sd={key:0},Cd={key:1},wd={class:`filters`},Td={key:0,class:`message error`,role:`alert`},Ed={class:`message`,role:`status`},Dd=[`title`],Od=[`disabled`],kd={key:1},Ad={key:0,class:`error`,role:`alert`},jd=G(M({__name:`KeybindingsEditor`,props:{embedded:{type:Boolean}},setup(e){let{api:t,revision:n}=Iu(),o=X(``),s=X(!1),c=X(!1),l=X(``),u=X(``),d=X(``),f=X(),p=X(),m=X(``),h=X(),g=z(()=>{n.value;let e=new Map(t.getCommands().map(e=>[e.id,e.title])),r=t.getDefaultKeybindings(),i=t.getKeybindingOverrides();for(let t of[...r,...i])e.has(t.command)||e.set(t.command,t.command);let a=o.value.trim().toLocaleLowerCase();return[...e].flatMap(([e,t])=>{let n=i.some(t=>t.command===e),a=(n?i:r).filter(t=>t.command===e);return(a.length?a:[void 0]).map((r,i)=>({command:e,title:t,rule:r,index:i,custom:n}))}).filter(e=>(!s.value||e.custom)&&`${e.title} ${e.command} ${_(e.rule?.key)} ${v(e.rule)}`.toLocaleLowerCase().includes(a)).sort((e,t)=>e.title.localeCompare(t.title,`ru`)||e.command.localeCompare(t.command))});ui(()=>{let e=h.value;return{note:`Горячие клавиши`,text:vi(o.value?`Поиск: «${o.value}»`:``,`Только изменённые: ${s.value?`да`:`нет`}`,`Показано строк: ${g.value.length}`,`Пользовательских привязок: ${t.getKeybindingOverrides().length}`,e?`Изменить: ${e.title} (${e.command})`:``,e?`Новое сочетание: ${_(m.value)||`не задано`}`:``,c.value?`Сохранение и загрузка…`:``,u.value?`Статус: ${u.value}`:``,l.value?`Ошибка: ${l.value}`:``)}});function _(e){return e?.replace(/Mod/g,navigator.platform.includes(`Mac`)?`Meta`:`Ctrl`).replace(/ /g,`Space`)??``}function v(e){return Object.entries(e?.when??{}).map(([e,t])=>`${e} = ${t}`).join(` · `)||`В области команды`}async function y(e){if(c.value)return!1;c.value=!0,l.value=``,u.value=``;try{return await t.saveKeybindings(e),u.value=`Сохранено`,!0}catch(e){return l.value=e instanceof Error?e.message:String(e),!1}finally{c.value=!1}}function x(e){let t=b(e),n=g.value.find(e=>e.command===t.command&&e.index===t.index);if(!n)throw Error(`Привязка не найдена`);return n}let S=E(`keybindings:${P()}`,()=>({surface:`keybindings`}));for(let[e,t,n]of[[`edit`,`Изменить сочетание клавиш`,e=>w(x(e))],[`remove`,`Удалить сочетание клавиш`,e=>te(x(e))],[`reset`,`Сбросить сочетания команды`,e=>D(x(e))],[`save`,`Сохранить сочетание клавиш`,()=>ee()]])S.scope.registerCommand({id:`ide.keybindings.${e}`,palette:!1,title:t,run:n,enabled:()=>!c.value});function C(e,t){S.run(`ide.keybindings.${e}`,t&&{command:t.command,index:t.index})}async function w(e){h.value=e,m.value=``,await Ut(),f.value?.open(),p.value?.focus()}function T(e){if(e.key===`Tab`||e.key===`Escape`)return;e.preventDefault(),e.stopPropagation();let t=gu(e);t&&(m.value=t)}async function ee(){let e=h.value;e&&m.value&&await y(hu(t.getDefaultKeybindings(),t.getKeybindingOverrides(),e.command,e.index,m.value))&&f.value?.close()}async function te(e){await y(hu(t.getDefaultKeybindings(),t.getKeybindingOverrides(),e.command,e.index,null))}async function D(e){await y(t.getKeybindingOverrides().filter(t=>t.command!==e.command))}return Lt(async()=>{c.value=!0;try{d.value=(await t.reloadKeybindings()).path}catch(e){l.value=e instanceof Error?e.message:String(e)}finally{c.value=!1}}),(t,n)=>(V(),Y(Wr,{class:O([`keybindings-editor`,{embedded:e.embedded}]),"aria-label":`Настройки горячих клавиш`,"aria-busy":c.value,onFocusin:n[6]||=e=>H(S).scope.activate(),onKeydown:H(S).keydown},{default:F(()=>[K(`header`,null,[e.embedded?B(``,!0):(V(),q(`h2`,Sd,`Горячие клавиши`)),e.embedded?B(``,!0):(V(),q(`p`,Cd,`Сочетания клавиш для команд IDE`)),I(a,{modelValue:o.value,"onUpdate:modelValue":n[0]||=e=>o.value=e,type:`search`,"aria-label":`Поиск горячих клавиш`,placeholder:`Найти команду или сочетание клавиш…`},null,8,[`modelValue`]),K(`div`,wd,[I(r,{as:`label`,justify:`normal`},{default:F(()=>[I(a,{modelValue:s.value,"onUpdate:modelValue":n[1]||=e=>s.value=e,type:`checkbox`},null,8,[`modelValue`]),n[7]||=N(` Только изменённые`,-1)]),_:1}),K(`span`,null,j(g.value.length)+` команд и привязок`,1)])]),l.value?(V(),q(`p`,Td,j(l.value),1)):B(``,!0),K(`p`,Ed,j(c.value?`Сохранение и загрузка…`:u.value),1),I(bd,{rows:g.value,busy:c.value,"reset-key":`${o.value}:${s.value}`,"display-key":_,condition:v,onAction:C},null,8,[`rows`,`busy`,`reset-key`]),K(`footer`,{class:`u-truncate`,title:d.value},` Изменения применяются сразу`+j(d.value?` · ${d.value}`:``),9,Dd),I(Kr,{ref_key:`dialog`,ref:f,labelledby:`keybinding-dialog-title`,onCancel:n[4]||=e=>c.value&&e.preventDefault(),onKeydown:n[5]||=Z(()=>{},[`stop`])},{default:F(()=>[K(`form`,{onSubmit:n[3]||=Z(e=>C(`save`),[`prevent`])},[n[11]||=K(`h3`,{id:`keybinding-dialog-title`},`Новое сочетание клавиш`,-1),K(`p`,null,j(h.value?.title),1),K(`small`,null,j(h.value?.command),1),K(`button`,{ref_key:`recorder`,ref:p,type:`button`,class:`recorder`,"aria-label":`Записать сочетание клавиш`,disabled:c.value,onKeydown:T},[m.value?(V(),Y(od,{key:0},{default:F(()=>[N(j(_(m.value)),1)]),_:1})):(V(),q(`span`,kd,`Нажмите сочетание клавиш`))],40,Od),I(i,null,{default:F(()=>[...n[8]||=[N(`Tab — перейти к кнопкам · Esc — отменить`,-1)]]),_:1}),l.value?(V(),q(`p`,Ad,j(l.value),1)):B(``,!0),I(xd,null,{default:F(()=>[I(Q,{disabled:c.value,onClick:n[2]||=e=>f.value?.close()},{default:F(()=>[...n[9]||=[N(`Отмена`,-1)]]),_:1},8,[`disabled`]),I(Q,{appearance:`solid`,type:`submit`,disabled:c.value||!m.value},{default:F(()=>[...n[10]||=[N(`Сохранить`,-1)]]),_:1},8,[`disabled`])]),_:1})],32)]),_:1},512)]),_:1},8,[`class`,`aria-busy`,`onKeydown`]))}}),[[`__scopeId`,`data-v-64af4c0b`]]),Md={id:`command-palette-results`,role:`listbox`,"aria-label":`Команды IDE`},Nd=[`id`,`aria-selected`,`aria-disabled`,`data-command`,`onPointermove`],Pd={class:`description`},Fd={class:`title`},Id={key:1,class:`unavailable-label`},Ld=G(M({__name:`CommandPalette`,setup(e){let{api:t,palette:n,reportError:i}=Iu(),o=da(),s=X(),c=z(()=>s.value?.element),l=X(),u=X(``),d=X(-1),f=z(()=>{let e=u.value.trim().replace(/^>\s*/,``).toLocaleLowerCase().split(/\s+/).filter(Boolean);return(n.value?.commands??[]).filter(t=>e.every(e=>`${t.title} ${t.id} ${t.group}`.toLocaleLowerCase().includes(e)))});function p(e=!0){let t=n.value?.trigger;n.value=null,c.value?.close(),e&&t?.isConnected&&t.focus({preventScroll:!0})}async function m(){await Ut(),c.value?.querySelector(`[aria-selected="true"]`)?.scrollIntoView({block:`nearest`})}R(f,()=>{d.value=f.value.findIndex(e=>e.enabled),m()}),R(n,async e=>{e&&(u.value=``,d.value=f.value.findIndex(e=>e.enabled),await Ut(),c.value?.showModal(),l.value?.focus())}),R(()=>o.fullPath,()=>p(!1));function h(e){let t=f.value.flatMap((e,t)=>e.enabled?[t]:[]);if(!t.length)return;let n=t.indexOf(d.value);d.value=t[(n+e+t.length)%t.length],m()}async function g(e=d.value){let n=f.value[e];if(n?.enabled){p(),await Ut();try{await t.executeCommand(n.id,void 0,{scope:n.scope})}catch(e){i(e)}}}function _(e){e.target!==l.value?.element||e.isComposing||e.keyCode===229||(e.key===`ArrowDown`||e.key===`ArrowUp`?(e.preventDefault(),h(e.key===`ArrowDown`?1:-1)):e.key===`Enter`&&(e.preventDefault(),g()))}function v(e){if(e.target!==c.value)return;let t=c.value.getBoundingClientRect();(e.clientX<t.left||e.clientX>t.right||e.clientY<t.top||e.clientY>t.bottom)&&p()}return(e,t)=>(V(),Y(Kr,{ref_key:`dialogRef`,ref:s,class:`command-palette`,align:`top`,width:`660px`,label:`Командный центр`,onKeydown:_,onCancel:t[2]||=Z(e=>p(),[`prevent`]),onClose:t[3]||=e=>H(n)&&p(),onClick:v},{default:F(()=>[I(r,{class:`search`,gap:3,justify:`normal`},{default:F(()=>[t[4]||=K(`span`,{"aria-hidden":`true`},`>`,-1),I(a,{ref_key:`input`,ref:l,modelValue:u.value,"onUpdate:modelValue":t[0]||=e=>u.value=e,name:`command-query`,role:`combobox`,"aria-label":`Найти команду`,"aria-autocomplete":`list`,"aria-expanded":`true`,"aria-controls":`command-palette-results`,"aria-activedescendant":d.value>=0?`palette-option-${d.value}`:void 0,placeholder:`Введите название или ID команды…`,autocomplete:`off`},null,8,[`modelValue`,`aria-activedescendant`]),K(`button`,{"aria-label":`Закрыть командный центр`,title:`Закрыть (Esc)`,onClick:t[1]||=e=>p()},` × `)]),_:1}),K(`ul`,Md,[(V(!0),q(W,null,J(f.value,(e,t)=>(V(),q(`li`,{id:`palette-option-${t}`,key:`${e.scope}:${e.id}`,role:`option`,"aria-selected":d.value===t,"aria-disabled":!e.enabled,"data-command":e.id,class:O({selected:d.value===t,unavailable:!e.enabled}),onPointermove:n=>e.enabled&&(d.value=t)},[I(ts,{class:`palette-row`,interaction:`selection`,radius:`none`,padding:`var(--sp-2) var(--sp-3)`,disabled:!e.enabled,tabindex:`-1`,onClick:e=>g(t)},{default:F(()=>[K(`span`,Pd,[K(`span`,Fd,j(e.group)+`: `+j(e.title),1),K(`small`,null,j(e.id),1)]),e.shortcut?(V(),Y(od,{key:0},{default:F(()=>[N(j(e.shortcut),1)]),_:2},1024)):B(``,!0),e.enabled?B(``,!0):(V(),q(`span`,Id,`Недоступно`))]),_:2},1032,[`disabled`,`onClick`])],42,Nd))),128))]),f.value.length?B(``,!0):(V(),Y(nd,{key:0,role:`status`},{default:F(()=>[...t[5]||=[N(`Команды не найдены`,-1)]]),_:1})),I(r,{as:`footer`,align:`normal`,justify:`between`,gap:3},{default:F(()=>[t[6]||=K(`span`,null,`↑ ↓ выбор · Enter запуск · Esc закрыть`,-1),K(`span`,null,j(f.value.length)+` команд`,1)]),_:1})]),_:1},512))}}),[[`__scopeId`,`data-v-e11c3e4b`]]),Rd=[`aria-label`],zd={key:0,role:`separator`,class:`menu-separator`},Bd={class:`item-label`},Vd={key:0,role:`separator`,class:`menu-separator`},Hd={class:`item-label`},Ud={key:1},Wd=G(M({__name:`ContextMenu`,props:{items:{},label:{}},setup(e,{expose:t}){let n=e,r=pu(),i=mu({anchor:`left`,initialFocus:`.sheet-items button:not(:disabled)`,items:`.sheet-items button`}),a=X(),o=z(()=>a.value?.element),s=z(()=>n.label||`Действия`),c=`--context-${P().replace(/[^a-z0-9-]/gi,``)}`,l=X({x:0,y:0}),u,d=!1,f=0,p;function m(e=!0){f++,p?.(),d=e,o.value?.hidePopover(),i.close(!1),r.value&&e&&u?.isConnected&&u.focus()}function h(e){return!(e instanceof MouseEvent)||!(e.buttons!==0||r.value&&document.querySelector(`:active`))?Promise.resolve():new Promise(e=>{let t=()=>{p===t&&(window.removeEventListener(`pointerup`,t),window.removeEventListener(`pointercancel`,t),p=void 0,setTimeout(e,0))};p=t,window.addEventListener(`pointerup`,t),window.addEventListener(`pointercancel`,t)})}async function g(e,t){e.preventDefault(),e.stopPropagation(),d=!1,u=t??e.currentTarget;let n=u.getBoundingClientRect();u=u.querySelector(`[role="tab"]`)??u;let a=e instanceof MouseEvent&&(e.clientX!==0||e.clientY!==0);l.value={x:Math.max(4,Math.min(a?e.clientX:n.left+12,window.innerWidth-4)),y:Math.max(4,Math.min(a?e.clientY:n.bottom,window.innerHeight-4))};let s=++f;await h(e),await Ut(),s===f&&(r.value?(i.open.value&&i.close(!1),i.trigger.value=u,await i.toggle(!0)):(o.value?.showPopover({source:u}),await Ut(),o.value?.querySelector(`button:not(:disabled)`)?.focus()))}function _(e){e.newState===`closed`&&(d&&u?.isConnected&&u.focus(),d=!1)}function v(e){if(e.key===`Escape`||e.key===`Tab`){e.key===`Escape`&&e.preventDefault(),m();return}let t=[...o.value.querySelectorAll(`button:not(:disabled)`)],n=t.indexOf(document.activeElement),r;if(e.key===`ArrowDown`)r=(n+1)%t.length;else if(e.key===`ArrowUp`)r=(n-1+t.length)%t.length;else if(e.key===`Home`)r=0;else if(e.key===`End`)r=t.length-1;else{e.key.length===1&&!e.ctrlKey&&!e.metaKey&&[...t.slice(n+1),...t.slice(0,n+1)].find(t=>t.textContent?.trim().toLocaleLowerCase().startsWith(e.key.toLocaleLowerCase()))?.focus();return}e.preventDefault(),t[r]?.focus()}function y(e){m(!1),u?.isConnected&&u.focus(),e.run()}function b(e){r.value||e.type===`scroll`&&e.target instanceof Node&&o.value?.contains(e.target)||m(!1)}R(r,()=>m(!1)),window.addEventListener(`resize`,b),window.addEventListener(`blur`,b),window.addEventListener(`scroll`,b,!0),lt(()=>{m(!1),window.removeEventListener(`resize`,b),window.removeEventListener(`blur`,b),window.removeEventListener(`scroll`,b,!0)});function x(e){return g(new KeyboardEvent(`keydown`),e)}t({open:g,openForElement:x,close:m});function S(e){return e===`spare`?`info`:e===`hot`?`warning`:e===`over`?`danger`:`neutral`}return(t,n)=>H(r)?(V(),Y(kl,{key:0,menu:H(i),label:s.value,width:320},{default:F(()=>[I(pl,{class:`island-head`,"aria-label":`Закрыть`,onClick:n[0]||=e=>m()},{default:F(()=>[N(j(s.value),1)]),_:1}),K(`div`,{class:`sheet-items`,role:`menu`,"aria-label":s.value},[(V(!0),q(W,null,J(e.items,e=>(V(),q(W,{key:e.id},[e.separator?(V(),q(`div`,zd)):B(``,!0),I(ts,{class:`sheet-item`,role:`menuitem`,justify:`between`,disabled:e.disabled,tone:e.danger?`danger`:void 0,"data-command":e.command,onClick:t=>y(e)},{default:F(()=>[K(`span`,Bd,[e.icon?(V(),Y(qe(e.icon),{key:0,"aria-hidden":`true`})):B(``,!0),N(j(e.label),1)]),e.hint?(V(),Y(hl,{key:0,class:`hint`,mono:``,shrink:``,tone:S(e.hint.tone)},{default:F(()=>[N(j(e.hint.text),1)]),_:2},1032,[`tone`])):B(``,!0)]),_:2},1032,[`disabled`,`tone`,`data-command`,`onClick`])],64))),128))],8,Rd)]),_:1},8,[`menu`,`label`])):(V(),Y(ht,{key:1,to:`body`},[K(`span`,{class:`context-anchor`,style:k({left:`${l.value.x}px`,top:`${l.value.y}px`,anchorName:c})},null,4),I(_l,{ref_key:`surface`,ref:a,border:`strong`,radius:`md`,surface:`tertiary`,popover:`auto`,role:`menu`,class:`context-menu`,"aria-label":s.value,style:k({positionAnchor:c}),onToggle:_,onKeydown:v,onContextmenu:n[1]||=Z(()=>{},[`prevent`,`stop`])},{default:F(()=>[(V(!0),q(W,null,J(e.items,e=>(V(),q(W,{key:e.id},[e.separator?(V(),q(`div`,Vd)):B(``,!0),I(ts,{class:`menu-item`,role:`menuitem`,"data-command":e.command,disabled:e.disabled,tone:e.danger?`danger`:void 0,gap:1.5,justify:`between`,onClick:t=>y(e)},{default:F(()=>[K(`span`,Hd,[e.icon?(V(),Y(qe(e.icon),{key:0,"aria-hidden":`true`})):B(``,!0),N(j(e.label),1)]),e.hint?(V(),Y(hl,{key:0,class:`hint`,mono:``,shrink:``,tone:S(e.hint.tone)},{default:F(()=>[N(j(e.hint.text),1)]),_:2},1032,[`tone`])):B(``,!0),e.shortcut?(V(),q(`kbd`,Ud,j(e.shortcut),1)):B(``,!0)]),_:2},1032,[`data-command`,`disabled`,`tone`,`onClick`])],64))),128))]),_:1},8,[`aria-label`,`style`])]))}}),[[`__scopeId`,`data-v-0ba62b03`]]),Gd=G(M({__name:`UiIslandLabel`,props:{divided:{type:Boolean}},setup(e){return(t,n)=>(V(),q(`div`,{class:O([`island-label`,{divided:e.divided}])},[L(t.$slots,`default`,{},void 0,!0)],2))}}),[[`__scopeId`,`data-v-1223d9e0`]]),Kd=G(M({__name:`UiIslandFooter`,props:{variant:{},hideOnCompact:{type:Boolean}},setup(e){return(t,n)=>(V(),q(`footer`,{class:O([`island-footer`,[e.variant??`padded`,{"hide-compact":e.hideOnCompact}]])},[L(t.$slots,`default`,{},void 0,!0)],2))}}),[[`__scopeId`,`data-v-44d406d9`]]),qd={favorites:`Избранное`,running:`Работает`,recent:`Недавние`,projects:`Проекты`,disk:`На диске`,apps:`Приложения`};function Jd(e=``){async function t(t,n,r){let i=await fetch(e+t,{method:n===void 0?`GET`:`POST`,headers:n===void 0?void 0:{"Content-Type":`application/json`},body:n===void 0?void 0:JSON.stringify(n),signal:r??AbortSignal.timeout(15e3)}),a=await i.json();if(!i.ok)throw Error(a.error||`Ошибка запроса (${i.status})`);return a}return{search:(e,n,r)=>{let i=new URLSearchParams({q:e});return r?.disk===!1&&i.set(`disk`,`0`),t(`/api/launcher/search?${i}`,void 0,n)},launch:(e,n,r=!1,i)=>t(`/api/launcher/launch`,{id:e,action:n,inline:r,arg:i}),detail:(e,n)=>t(`/api/launcher/detail?id=${encodeURIComponent(e)}`,void 0,n),subscribe(t){let n=new AbortController;return(async()=>{for(;!n.signal.aborted;){try{let r=await fetch(`${e}/api/events`,{signal:n.signal});if(!r.ok||!r.body)throw Error(String(r.status));let i=r.body.pipeThrough(new TextDecoderStream).getReader(),a=``;for(;;){let{value:e,done:n}=await i.read();if(n)break;a+=e;let r;for(;(r=a.indexOf(`
|
|
4
|
+
|
|
5
|
+
`))>=0;){let e=a.slice(0,r);a=a.slice(r+2),/^event: status$/m.test(e)&&t()}}}catch{}n.signal.aborted||await new Promise(e=>setTimeout(e,2e3))}})(),()=>n.abort()},hide:()=>t(`/api/app/hide`,{}),open:(e=!1,n)=>t(`/api/app/open`,{toggle:e,mode:n}),quit:()=>t(`/api/app/quit`,{}),restart:()=>t(`/api/app/restart`,{})}}function Yd(e){let t={query:``,focus:null,detail:null,detailLoading:!1,detailReady:!1,items:[],selected:0,loading:!0,busy:!1,error:``,warning:``,notice:``,route:``},n=new Set,r=0,i,a,o=!1,s=()=>{if(!o)for(let e of n)e({...t})},c,l=()=>{c?.abort(),t.focus=null,t.detail=null,t.detailReady=!1,t.detailLoading=!1},u=()=>{r++,clearTimeout(i),a?.abort()};async function d(n=!1){u();let i=r;a=new AbortController,n||(t.loading=!0),t.error=``,s();try{let n=await e.search(t.query,AbortSignal.any([a.signal,AbortSignal.timeout(15e3)]));if(o||i!==r)return;t.items=n.items,t.warning=n.warning??``,t.selected=0}catch(e){!o&&i===r&&(t.items=[],t.selected=0,t.warning=``,t.error=e instanceof Error?e.message:`Не удалось выполнить поиск`)}finally{!o&&i===r&&(t.loading=!1,s())}}let f,p;async function m(){if(o||t.busy||t.loading)return;let n=t.items[t.selected]?.id,r=t.focus;await d(!0);let i=t.items.findIndex(e=>e.id===n);if(i>=0&&!o&&(t.selected=i,s()),r&&t.focus?.id===r.id)try{let n=await e.detail(r.id,AbortSignal.timeout(15e3));!o&&t.focus?.id===r.id&&(t.detail=n,t.detailReady=!0,s())}catch{}}return{get state(){return t},subscribe(e){return n.add(e),e({...t}),()=>{n.delete(e)}},search:d,refresh:m,live(t){f?.(),f=void 0,clearTimeout(p),t&&!o&&e.subscribe&&(f=e.subscribe(()=>{clearTimeout(p),p=setTimeout(()=>void m(),150)}))},setQuery(e){l(),t.query=e,t.notice=``,u(),t.loading=!0,s(),i=setTimeout(()=>{d()},80)},select(e){t.selected=Math.max(0,Math.min(t.items.length-1,e)),s()},move(e){this.select(t.selected+e)},async enter(n=t.items[t.selected]){if(!n||t.busy||o)return!1;l(),t.focus=n,t.detail={actions:n.actions??[]},t.detailLoading=!0,t.error=``,c=new AbortController;let r=c;s();try{let i=await e.detail(n.id,AbortSignal.any([r.signal,AbortSignal.timeout(15e3)]));if(o||r.signal.aborted)return!0;t.detail=i,t.detailReady=!0}catch(e){!o&&!r.signal.aborted&&(t.error=e instanceof Error?e.message:`Не удалось загрузить действия`)}finally{!o&&!r.signal.aborted&&(t.detailLoading=!1,s())}return!0},leave(){l(),s()},async launch(n=t.items[t.selected],r,i=!1){let a=typeof r==`string`?n?.actions?.find(e=>e.id===r)??{id:r,title:``}:r??n?.actions?.[0];if(!n||t.busy||t.loading||o)return!1;t.busy=!0,t.error=``,t.notice=``,t.route=``,s();try{let r=await e.launch(n.id,a?.id,i,a?.arg);return!o&&(t.route=r?.route??``,t.notice=`${n.name} — ${a?.id===`favorite`?r?.favorite?`добавлено в избранное`:`убрано из избранного`:a?.id===`folder`?r?.favorite?`папка добавлена в избранные`:`папка убрана из избранных`:a?.id===`create`?`проект создан`:a?.id===`import`?`клонировано и добавлено`:a?.id===`open`?`открыто`:a?.id===`stop`?`остановлено`:`запущено`}`,!0)}catch(e){return t.error=e instanceof Error?e.message:`Не удалось запустить`,!1}finally{t.busy=!1,s()}},reportError(e){t.error=e instanceof Error?e.message:String(e),s()},dispose(){o=!0,c?.abort(),f?.(),clearTimeout(p),u(),n.clear()}}}var Xd={projects:`Проекты`,github:`GitHub`,gitlab:`GitLab`,new:`Новый проект`},Zd=/^https?:\/\/[^/\s]*gitlab[^/\s]*(?::\d+)?(?:\/|$)/i,Qd=/^https?:\/\/(?:www\.)?github\.com(?:\/|$)/i;function $d(e){let[t=``,n=``]=e.split(/[?#]/)[0].split(`/`).filter(Boolean);return t?n?`${t}/${n.replace(/\.git$/i,``)}`:`${t}/`:``}function ef(e){let t=e.split(/[?#]/)[0].split(`/-/`)[0].split(`/`).filter(Boolean);if(!t.length)return``;let n=t.join(`/`).replace(/\.git$/i,``);return t.length>1?n:`${n}/`}function tf(e){let t=e.trimStart(),n=Qd.exec(t);if(n)return{scope:`github`,text:$d(t.slice(n[0].length))};let r=Zd.exec(t);return r?{scope:`gitlab`,text:ef(t.slice(r[0].length))}:/^gh\//i.test(t)?{scope:`github`,text:t.slice(3).trim()}:/^new\//i.test(t)?{scope:`new`,text:t.slice(4).trim()}:/^gl\//i.test(t)?{scope:`gitlab`,text:t.slice(3).trim()}:t.startsWith(`/`)?{scope:`projects`,text:t.slice(1).trim()}:{scope:`all`,text:e.trim()}}async function nf(e,t,n,r){return(r?.actions??(await e.detail(t.id)).actions).find(e=>e.id===n)}var rf={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function af(e,t){return V(),q(`svg`,rf,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`m9 18l6-6l-6-6`},null,-1)]])}var of=U({name:`lucide-chevron-right`,render:af}),sf={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function cf(e,t){return V(),q(`svg`,sf,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M12 15V3m9 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}),K(`path`,{d:`m7 10l5 5l5-5`})],-1)]])}var lf=U({name:`lucide-download`,render:cf}),uf={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function df(e,t){return V(),q(`svg`,uf,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`},null,-1)]])}var ff=U({name:`lucide-folder`,render:df}),pf={class:`dropdown-heading u-truncate`},mf={key:0,class:`notice`,role:`status`},hf={key:1,class:`notice error`,role:`alert`},gf={key:2,class:`notice`},_f=[`id`,`aria-label`],vf=[`id`,`aria-selected`,`disabled`,`title`,`onClick`],yf={class:`u-truncate`},bf={key:3,class:`notice`},xf=G(M({__name:`PathDropdown`,props:{id:{},heading:{},editing:{type:Boolean},remote:{type:Boolean},entries:{},selected:{},loading:{type:Boolean},error:{},truncated:{type:Boolean},busy:{type:Boolean}},emits:[`pick`],setup(e){return(t,n)=>(V(),Y(_l,{border:`line`,radius:`md`,class:`dropdown`},{default:F(()=>[K(`div`,pf,j(e.heading),1),e.loading?(V(),q(`p`,mf,j(e.remote?`Читаю репозитории…`:`Читаю папки…`),1)):e.error?(V(),q(`p`,hf,j(e.error),1)):e.entries.length?B(``,!0):(V(),q(`p`,gf,j(e.remote?`Подходящих репозиториев нет`:e.editing?`Подходящих папок нет`:`Нет вложенных папок`),1)),K(`div`,{id:e.id,role:`listbox`,"aria-label":e.remote?`Доступные репозитории`:`Доступные папки`,class:`options`},[(V(!0),q(W,null,J(e.entries,(r,i)=>(V(),q(`button`,{id:`${e.id}-${i}`,key:r.path,role:`option`,"aria-selected":e.selected===i,class:O({highlighted:e.selected===i}),disabled:e.busy,title:r.path,onPointerdown:n[0]||=Z(()=>{},[`prevent`]),onClick:e=>t.$emit(`pick`,r.path)},[I(H(ff),{"aria-hidden":`true`}),K(`span`,yf,j(r.name),1),I(H(of),{"aria-hidden":`true`})],42,vf))),128))],8,_f),e.truncated?(V(),q(`p`,bf,j(e.remote?`Первые 1000 репозиториев — уточните путь`:`Первые 1000 папок — уточните путь`),1)):B(``,!0)]),_:1}))}}),[[`__scopeId`,`data-v-b0a5749e`]]);function Sf(){let e=X([]),t=X(-1),n=X(!1),r=X(``),i=X(!1),a,o=0,s;function c(){clearTimeout(s),++o,a?.abort(),n.value=!1}async function l(s,l){c();let u=o;a=new AbortController,n.value=!0,e.value=[],t.value=-1,r.value=``,i.value=!1;try{let t=await Tc(s,l,a.signal);if(u!==o)return;e.value=t.entries,i.value=t.truncated}catch(e){u===o&&(r.value=e instanceof Error?e.message:`Не удалось прочитать папку`)}finally{u===o&&(n.value=!1)}}function u(i){c(),e.value=[],t.value=-1,r.value=``,n.value=!0,s=setTimeout(()=>void l(i,!0),100)}return lt(c),{entries:e,selected:t,loading:n,error:r,truncated:i,invalidate:c,load:l,schedule:u}}var Cf=[`aria-busy`],wf={key:0,class:`segments`},Tf=[`title`,`disabled`,`onClick`],Ef=[`disabled`],Df=[`aria-label`,`aria-expanded`,`aria-controls`,`disabled`,`onClick`],Of=[`disabled`],kf={key:1,class:`input-wrap`},Af={class:`completion`,"aria-hidden":`true`},jf={class:`typed`},Mf={key:2,class:`key-hint`,"aria-hidden":`true`},Nf=G(M({__name:`PathBar`,props:{path:{},navigate:{type:Function}},setup(e){let t=e,n=X(),r=X(),i=z(()=>r.value?.element),o=X(!1),s=X(``),c=X(null),l=X(!1),u=X(0),d=X(!0),f=P(),{entries:p,selected:m,loading:h,error:g,truncated:_,invalidate:v,load:y,schedule:x}=Sf(),S=!1,C=z(()=>$s(t.path)),w=z(()=>$s(s.value).kind!==`local`),T=z(()=>C.value.kind!==`local`),ee=z(()=>$s(s.value).kind),te=z(()=>C.value.kind),D=z(()=>o.value||c.value!==null),ne=E(`path-bar:${f}`,()=>({surface:`path-bar`,path:t.path}));ne.scope.registerCommand({id:`ide.project.path.suggestions`,title:`Выбрать соседний проект`,description:`Показывает папки локального пути или репозитории владельца GitHub. Повторный вызов закрывает список.`,arguments:{path:`Путь сегмента, например gh:/owner`},enabled:()=>!l.value,run:e=>{let{path:t}=b(e);if(typeof t!=`string`)throw Error(`Укажите путь сегмента`);return ue(t)}});let{api:re,reportError:ie}=Iu();function O(){let e=$s(t.path),n=e.kind===`gitlab`?`ide.gitlab.repository.clone.dialog`:`ide.github.repository.clone.dialog`,r=e.kind===`gitlab`?`gitlab-clone:${t.path}`:`github-clone:${t.path}`;re.executeCommand(n,void 0,{scope:r}).catch(ie)}let A=z(()=>{let e=$s(t.path);return e.kind===`github`?`gh:/${e.repository.split(`/`)[0]}`:``}),ae=z(()=>{let e=$s(c.value??s.value).kind;return e===`github`||e===`gitlab`}),oe=z(()=>cc($s(t.path))),se=z(()=>p.value[m.value<0?0:m.value]),M=z(()=>{if(!o.value||!d.value||!se.value)return``;let e=w.value?se.value.path.split(`/`).pop()??se.value.name:se.value.name,t=Math.max(s.value.lastIndexOf(`/`),s.value.lastIndexOf(`\\`)),n=s.value.slice(t+1),r=s.value.includes(`\\`)?`\\`:`/`;return s.value===`~`?``:(w.value?e.toLowerCase().startsWith(n.toLowerCase()):e.startsWith(n))?e.slice(n.length)+(w.value?``:r):``});async function ce(e=t.path){l.value||(c.value=null,o.value=!0,s.value=e,u.value=0,d.value=!0,await Ut(),i.value?.focus(),i.value?.setSelectionRange(e.length,e.length),y(e,!0))}function le(){l.value||(v(),o.value=!1,c.value=null,g.value=``)}async function ue(e){if(l.value)return;if(c.value===e){le();return}o.value=!1,c.value=e;let t=$s(e),n=t.kind===`github`?`gh:/${t.repository.split(`/`)[0]||A.value.slice(4)}`:e;await y(n,!1)}function de(){u.value=i.value?.scrollLeft??0,d.value=i.value?.selectionStart===s.value.length&&i.value?.selectionEnd===s.value.length}function fe(){de(),x(s.value)}async function pe(){M.value&&(s.value+=M.value,await Ut(),i.value?.setSelectionRange(s.value.length,s.value.length),de(),y(s.value,!0))}async function me(e){if(!l.value){v(),l.value=!0,g.value=``;try{let r=await Cc(e);if(S)return;await t.navigate(r.path),l.value=!1,le(),await Ut(),n.value?.querySelector(`.segment:last-of-type .segment-label`)?.focus()}catch(e){g.value=e instanceof Error?e.message:`Не удалось открыть папку`}finally{l.value=!1,o.value&&!S&&(await Ut(),i.value?.focus())}}}function he(e){e.isComposing||l.value||(e.key===`Escape`?(e.preventDefault(),le()):e.key===`ArrowDown`||e.key===`ArrowUp`?(e.preventDefault(),p.value.length&&(m.value=(m.value+(e.key===`ArrowDown`?1:m.value<0?0:-1)+p.value.length)%p.value.length,Ut(()=>document.getElementById(`${f}-${m.value}`)?.scrollIntoView({block:`nearest`})))):o.value&&(e.key===`Tab`&&!e.shiftKey||e.key===`ArrowRight`&&d.value)&&M.value?(e.preventDefault(),pe()):e.key===`Enter`&&(o.value||m.value>=0)&&(e.preventDefault(),me(m.value>=0&&se.value?se.value.path:s.value)))}async function ge(e){e.relatedTarget instanceof Node&&n.value?.contains(e.relatedTarget)||(await Ut(),!n.value?.contains(document.activeElement)&&le())}return R(()=>t.path,()=>{l.value||le()}),R(M,async()=>{await Ut(),i.value&&d.value&&(i.value.scrollLeft=i.value.scrollWidth-i.value.clientWidth),de()}),R([()=>t.path,o],async()=>{await Ut();let e=n.value?.querySelector(`.segments`);e&&(e.scrollLeft=e.scrollWidth)},{immediate:!0}),lt(()=>{S=!0}),(t,i)=>(V(),q(`div`,{ref_key:`root`,ref:n,class:`path-bar`,"aria-busy":l.value,onKeydown:he,onFocusout:ge},[I(H(ff),{class:`path-icon`,"aria-hidden":`true`}),o.value?(V(),q(`div`,kf,[K(`div`,Af,[K(`span`,{style:k({transform:`translateX(${-u.value}px)`})},[K(`span`,jf,j(s.value),1),N(j(M.value),1)],4)]),I(a,{ref_key:`inputControl`,ref:r,modelValue:s.value,"onUpdate:modelValue":i[1]||=e=>s.value=e,role:`combobox`,"aria-label":ee.value===`gitlab`?`Проект GitLab`:w.value?`Репозиторий GitHub`:`Путь к папке`,"aria-autocomplete":`both`,"aria-expanded":D.value,"aria-controls":H(f),"aria-activedescendant":H(m)>=0?`${H(f)}-${H(m)}`:void 0,disabled:l.value,style:k({paddingRight:M.value?`${Math.min(M.value.length,20)}ch`:void 0}),autocomplete:`off`,spellcheck:`false`,onInput:fe,onScroll:de,onClick:de,onKeyup:de,onSelect:de},null,8,[`modelValue`,`aria-label`,`aria-expanded`,`aria-controls`,`aria-activedescendant`,`disabled`,`style`])])):(V(),q(`div`,wf,[(V(!0),q(W,null,J(oe.value,t=>(V(),q(`span`,{key:t.path,class:`segment`},[K(`button`,{class:`segment-label`,title:t.path,disabled:l.value,onClick:e=>ce(t.path)},j(t.name),9,Tf),T.value&&t.path===e.path?(V(),q(`button`,{key:0,class:`clone-trigger`,title:`Клонировать репозиторий`,"aria-label":`Клонировать репозиторий`,"aria-haspopup":`dialog`,disabled:l.value,onClick:O},[I(H(lf),{"aria-hidden":`true`})],8,Ef)):t.path===`gl:/`?B(``,!0):(V(),q(`button`,{key:1,class:`segment-arrow`,"aria-label":te.value===`github`?`Репозитории ${A.value.slice(4)} (${t.name})`:te.value===`gitlab`?`Проект GitLab ${t.path}`:`Папки в ${t.path}`,"aria-expanded":c.value===t.path,"aria-haspopup":`listbox`,"aria-controls":H(f),disabled:l.value,onClick:e=>H(ne).run(`ide.project.path.suggestions`,{path:t.path})},[I(H(of),{"aria-hidden":`true`})],8,Df))]))),128)),K(`button`,{class:`edit-space`,"aria-label":`Ввести путь`,disabled:l.value,onClick:i[0]||=e=>ce()},null,8,Of)])),o.value?(V(),q(`span`,Mf,`Tab · Enter`)):B(``,!0),D.value?(V(),Y(xf,{key:3,id:H(f),heading:o.value?w.value?ee.value===`gitlab`?`Открыть проект GitLab`:`Открыть репозиторий`:`Перейти в папку`:te.value===`github`?`Репозитории ${A.value.slice(4)}`:te.value===`gitlab`?`Проект GitLab`:c.value??``,editing:o.value,remote:ae.value,entries:H(p),selected:H(m),loading:H(h),error:H(g),truncated:H(_),busy:l.value,onPick:me},null,8,[`id`,`heading`,`editing`,`remote`,`entries`,`selected`,`loading`,`error`,`truncated`,`busy`])):B(``,!0)],40,Cf))}}),[[`__scopeId`,`data-v-fe8e0ac9`]]),Pf={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Ff(e,t){return V(),q(`svg`,Pf,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`m21 21l-4.34-4.34`}),K(`circle`,{cx:`11`,cy:`11`,r:`8`})],-1)]])}var If=U({name:`lucide-search`,render:Ff}),Lf={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Rf(e,t){return V(),q(`svg`,Lf,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M10 11v6m4-6v6m5-11v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`},null,-1)]])}var zf=U({name:`lucide-trash-2`,render:Rf}),Bf=[`aria-expanded`,`title`],Vf=[`src`],Hf={class:`u-truncate`},Uf=[`id`],Wf=[`src`],Gf={key:0,class:`empty`},Kf={key:1,class:`empty error`,role:`alert`},qf=G(M({__name:`ProjectSwitcher`,props:{project:{},navigate:{type:Function}},setup(e){let t=e,n=ua(),i=Oc(),o=X(),s=X(),c=X(!1),l=X(``),u=P(),d=We(),f=X(),p=X(),m=X(!1),h,g,_=E(`project-switcher`,()=>({surface:`project-switcher`,project:t.project.path}));_.scope.registerCommand({id:`ide.project.switcher.toggle`,title:`Открыть или закрыть переключатель проектов`,description:`Показывает остров с путём текущего проекта, поиском других проектов и списком недавних.`,run:()=>ie()}),_.scope.registerCommand({id:`ide.project.switcher.remove`,title:`Убрать проект из Projector`,description:`После подтверждения убирает проект из каталога Projector, завершает его терминалы и процессы. Файлы на диске остаются.`,arguments:{id:`string (необязательно): id проекта`,path:`string (необязательно): абсолютный путь проекта`},enabled:()=>!m.value,run:e=>D(b(e))});let v=e=>/^(gh|gl)\//i.test(e)||/^https?:/i.test(e)?e:`/${e}`;R(l,e=>h?.setQuery(v(e.trim())));let y=z(()=>`project:${t.project.id}`),x=z(()=>(d.value?.items??[]).filter(e=>e.id!==y.value)),S=z(()=>d.value?.selected??0),w=z(()=>x.value.map((e,t)=>({item:e,index:t,heading:!l.value.trim()&&e.section&&e.section!==x.value[t-1]?.section?qd[e.section]:``}))),T=z(()=>{let e=p.value;return e?.kind===`project`&&e.id.startsWith(`project:`)?{id:e.id.slice(8),name:e.name}:void 0}),ee=z(()=>{let e=T.value;return e?[{id:`ide.project.switcher.remove`,label:`Убрать из Projector`,icon:zf,danger:!0,command:`ide.project.switcher.remove`,disabled:m.value,run:()=>_.run(`ide.project.switcher.remove`,{id:e.id})}]:[]});function te(e,t){t.kind===`project`&&(p.value=t,f.value?.open(e,e.currentTarget))}async function D(e){if(m.value)return;let n=typeof e.id==`string`?e.id:void 0,r=typeof e.path==`string`?e.path:void 0;if(!n&&!r)throw Error(`Укажите id или path проекта`);let a=i.projects.value.find(e=>n?e.id===n:e.path===r)??(n?await i.getOne(n):void 0);if(!a)throw Error(`Проект не найден`);if(a.id===t.project.id)throw Error(`Нельзя убрать открытый проект`);if(window.confirm(`Убрать «${a.name}» из Projector? Терминалы и запущенные процессы проекта будут завершены. Файлы останутся на диске.`)){m.value=!0;try{await i.remove(a.id),p.value?.id===`project:${a.id}`&&(p.value=void 0),await h?.refresh()}finally{m.value=!1}}}function ne(){let e=Jd();h=Yd({...e,search:(t,n)=>e.search(t,n,{disk:!1})}),d.value={...h.state},g=h.subscribe(e=>d.value=e),h.setQuery(`/`),h.live(!0)}function re(){f.value?.close(!1),p.value=void 0,g?.(),h?.dispose(),h=void 0,g=void 0,d.value=void 0}async function ie(e=!c.value){e!==c.value&&(c.value=e,e?(l.value=``,ne(),await Ut(),s.value?.focus()):(re(),o.value?.querySelector(`.trigger`)?.focus()))}eu(o,e=>{e.target instanceof Element&&e.target.closest(`[role="menu"]`)||c.value&&ie(!1)}),lt(re);async function k(e,t=!1){if(!h||!e||!await h.launch(e,e.actions?.[+!!t],!0))return;let r=h.state.route;await ie(!1),r&&await n.push(r)}async function A(e){await t.navigate(e),await ie(!1)}function ae(e,t){t.route&&(e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)||(e.preventDefault(),k(t))}function oe(e){e.key===`ArrowDown`||e.key===`ArrowUp`?(e.preventDefault(),h?.move(e.key===`ArrowDown`?1:-1),Ut(()=>document.getElementById(`${u}-${S.value}`)?.scrollIntoView({block:`nearest`}))):e.key===`Enter`&&(e.preventDefault(),k(x.value[S.value],e.ctrlKey||e.metaKey))}return(t,n)=>(V(),q(`div`,{ref_key:`root`,ref:o,class:`switcher`,onKeydown:n[2]||=yn(Z(e=>ie(!1),[`stop`]),[`esc`])},[K(`button`,{class:`trigger`,"aria-haspopup":`dialog`,"aria-expanded":c.value,title:`${e.project.name} — переключить проект`,onClick:n[0]||=e=>H(_).run(`ide.project.switcher.toggle`)},[K(`img`,{src:H(xc)(e.project),alt:``,width:`22`,height:`22`},null,8,Vf),K(`span`,Hf,j(e.project.name),1),I(H(fl),{"aria-hidden":`true`})],8,Bf),c.value?(V(),Y(_l,{key:0,as:`section`,flow:`column`,class:`island`,role:`dialog`,"aria-label":`Переключение проекта`},{default:F(()=>[I(Nf,{class:`island-path`,path:e.project.path,navigate:A},null,8,[`path`]),I(r,{as:`label`,class:`search`,justify:`normal`},{default:F(()=>[I(H(If),{"aria-hidden":`true`}),I(a,{ref_key:`input`,ref:s,modelValue:l.value,"onUpdate:modelValue":n[1]||=e=>l.value=e,role:`combobox`,"aria-label":`Найти проект`,placeholder:`Найти проект, gh/owner/repo…`,"aria-expanded":!0,"aria-controls":H(u),"aria-activedescendant":x.value.length?`${H(u)}-${S.value}`:void 0,autocomplete:`off`,spellcheck:`false`,onKeydown:oe},null,8,[`modelValue`,`aria-controls`,`aria-activedescendant`])]),_:1}),K(`div`,{id:H(u),class:`results`,role:`listbox`},[(V(!0),q(W,null,J(w.value,e=>(V(),q(W,{key:e.item.id},[e.heading?(V(),Y(Gd,{key:0},{default:F(()=>[N(j(e.heading),1)]),_:2},1024)):B(``,!0),(V(),Y(qe(e.item.route?`a`:`button`),{id:`${H(u)}-${e.index}`,href:e.item.route,class:O([`row`,{active:e.index===S.value}]),role:`option`,"aria-selected":e.index===S.value,disabled:e.item.route?void 0:d.value?.busy,onMousemove:t=>H(h)?.select(e.index),onClick:t=>ae(t,e.item),onContextmenu:Z(t=>te(t,e.item),[`stop`])},{default:F(()=>[e.item.icon?(V(),q(`img`,{key:0,src:H(C)(e.item.icon),alt:``,width:`28`,height:`28`},null,8,Wf)):B(``,!0),I(gl,{title:e.item.name,description:e.item.description,"truncate-title":``},null,8,[`title`,`description`]),e.item.status?(V(),Y(hl,{key:1},{default:F(()=>[N(j(e.item.status.label),1)]),_:2},1024)):B(``,!0)]),_:2},1064,[`id`,`href`,`class`,`aria-selected`,`disabled`,`onMousemove`,`onClick`,`onContextmenu`]))],64))),128)),d.value&&!d.value.loading&&!x.value.length?(V(),q(`p`,Gf,`Ничего не найдено`)):B(``,!0),d.value?.error?(V(),q(`p`,Kf,j(d.value.error),1)):B(``,!0)],8,Uf),I(Kd,{variant:`plain`},{default:F(()=>[...n[3]||=[N(`↑↓ выбрать · Enter открыть · ПКМ убрать · Esc закрыть`,-1)]]),_:1})]),_:1})):B(``,!0),I(Wd,{ref_key:`menu`,ref:f,items:ee.value,label:`Действия с проектом`},null,8,[`items`])],544))}}),[[`__scopeId`,`data-v-024e840b`]]),Jf=X(`general`),Yf=e=>`scenario:${e}`,Xf=e=>e.startsWith(`scenario:`)?e.slice(9):void 0,Zf=G(M({__name:`UiToolbar`,props:{as:{},gap:{},columnGap:{},text:{},justify:{},wrap:{type:Boolean}},setup(e){return(t,n)=>(V(),Y(qe(e.as??`div`),{class:`ui-toolbar`,style:k({"--toolbar-row-gap":`var(--sp-${e.gap??2})`,"--toolbar-column-gap":`var(--sp-${e.columnGap??e.gap??2})`,fontSize:e.text===`xs`?`var(--fs-xs)`:void 0,justifyContent:e.justify===`between`?`space-between`:void 0,flexWrap:e.wrap?`wrap`:void 0})},{default:F(()=>[L(t.$slots,`default`,{},void 0,!0)]),_:3},8,[`style`]))}}),[[`__scopeId`,`data-v-845f02a7`]]),Qf=G(M({__name:`UiControlScope`,props:{density:{}},setup(e){let t=e;return ot(v,z(()=>t.density===`compact`?{minHeight:`var(--control-h)`,paddingBlock:`var(--sp-1)`,fontSize:`var(--ui-control-font-size)`}:void 0)),(t,n)=>(V(),q(`div`,{class:O({compact:e.density===`compact`})},[L(t.$slots,`default`,{},void 0,!0)],2))}}),[[`__scopeId`,`data-v-7e20e8fa`]]),$f={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function ep(e,t){return V(),q(`svg`,$f,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M14 17H5M19 7h-9`}),K(`circle`,{cx:`17`,cy:`17`,r:`3`}),K(`circle`,{cx:`7`,cy:`7`,r:`3`})],-1)]])}var tp=U({name:`lucide-settings-2`,render:ep}),np=[`aria-label`],rp={class:`layout`},ip=[`aria-current`,`onClick`],ap=[`onDragover`,`onDrop`],op=[`data-id`,`draggable`,`onDragstart`],sp=[`aria-current`,`onClick`,`onKeydown`],cp={class:`item-title`},lp={key:0,class:`item-hint`},up={key:0,class:`no-results`,role:`status`},dp={key:0,class:`section-heading`},fp={key:1,class:`footer`},pp={key:2,class:`empty`},mp=G(M({__name:`SettingsWorkbench`,props:{sections:{},selected:{},embedded:{type:Boolean},title:{default:`Настройки`},scope:{default:`settings`},read:{}},emits:[`select`],setup(e,{emit:t}){let n=e,i=t,o=X(``),s=X(),c=X(),l=X(),u=X(new Set),d=z(()=>{let e=o.value.toLocaleLowerCase().trim().split(/\s+/).filter(Boolean);return n.sections.filter(t=>{let n=`${t.title} ${t.group} ${t.description} ${t.keywords}`.toLocaleLowerCase();return e.every(e=>n.includes(e))})}),f=z(()=>[...new Set(d.value.map(e=>e.group))]),p=z(()=>d.value.find(e=>e.id===n.selected||e.items?.some(e=>e.id===n.selected))??d.value[0]);ui(()=>n.read?.({section:p.value?.id??``,sectionTitle:p.value?.title??``,query:o.value,visible:d.value.length})),R(p,e=>{e&&u.value.add(e.id),Ut(()=>{l.value?.scrollTo({top:0});let e=c.value?.querySelector(`[aria-current="page"]`);if(!e||!c.value)return;let t=e.getBoundingClientRect(),n=c.value.getBoundingClientRect();t.right>n.right?c.value.scrollLeft+=t.right-n.right:t.left<n.left&&(c.value.scrollLeft+=t.left-n.left)})},{immediate:!0});let m=X(``),h=X(``),g=X(!1);function _(e,t){m.value=t,e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t))}function v(){m.value=``,h.value=``}function y(e,t){let n;for(let r of e.querySelectorAll(`:scope > li`)){let e=r.getBoundingClientRect(),i=r.dataset.id??``;if(t<e.top)return n??{id:i,after:!1};n={id:i,after:t>e.top+e.height/2}}return n}function x(e,t){if(!m.value||!t.reorder)return;e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`move`);let n=y(e.currentTarget,e.clientY);h.value=n&&n.id!==m.value?n.id:``,g.value=n?.after??!1}function S(e,t){if(!m.value||!t.reorder||!t.items)return;e.preventDefault();let n=y(e.currentTarget,e.clientY),r=m.value;if(v(),!n||n.id===r)return;let i=t.items.map(e=>e.id).filter(e=>e!==r),a=i.indexOf(n.id);a<0||(i.splice(a+ +!!n.after,0,r),t.reorder(i))}function C(e,t,n){if(!e.altKey||!t.reorder||!t.items)return;let r=e.key===`ArrowUp`?n-1:e.key===`ArrowDown`?n+1:-1,i=t.items.map(e=>e.id);r<0||r>=i.length||(e.preventDefault(),[i[n],i[r]]=[i[r],i[n]],t.reorder(i))}let w=E(n.scope,()=>({surface:`settings`,section:p.value?.id??``,query:o.value}));w.scope.registerCommand({id:`ide.settings.sections.list`,palette:!1,title:`Список разделов настроек`,description:`Возвращает id, название, группу, описание и ключевые слова всех разделов настроек.`,run:()=>n.sections.map(({id:e,title:t,group:n,description:r,keywords:i})=>({id:e,title:t,group:n,description:r,keywords:i}))}),w.scope.registerCommand({id:`ide.settings.section.open`,palette:!1,title:`Открыть раздел настроек`,description:`Открывает раздел настроек по id. Сохраняет незавершённые формы других разделов в текущей странице.`,arguments:{id:`string: идентификатор раздела настроек`},run:e=>{let{id:t}=b(e),r=n.sections.some(e=>e.id===t||e.items?.some(e=>e.id===t));if(typeof t!=`string`||!r)throw Error(`Неизвестный раздел настроек`);o.value=``,i(`select`,t)}}),w.scope.registerCommand({id:`ide.settings.search`,title:`Поиск настроек`,description:`Фильтрует разделы по названию, описанию и параметрам; без query фокусирует поиск.`,arguments:{query:`string: поисковый запрос, пустая строка сбрасывает фильтр`},run:e=>{let t=b(e);if(t.query!==void 0&&typeof t.query!=`string`)throw Error(`query должен быть строкой`);typeof t.query==`string`?o.value=t.query:s.value?.focus()}});function T(e){w.run(`ide.settings.search`,{query:e.target.value})}return(t,n)=>(V(),q(`section`,{class:O([`settings-workbench`,{embedded:e.embedded}]),"aria-label":e.title,onPointerdown:n[3]||=e=>H(w).scope.activate()},[I(Zf,{as:`header`,class:`toolbar`,gap:4,justify:`between`},{default:F(()=>[K(`h1`,null,[I(H(tp),{"aria-hidden":`true`}),N(j(e.title),1)]),I(r,{class:`search`,justify:`normal`},{default:F(()=>[I(H(If),{"aria-hidden":`true`}),I(a,{ref_key:`search`,ref:s,value:o.value,type:`search`,placeholder:`Поиск настроек…`,"aria-label":`Поиск настроек`,onInput:T,onKeydown:n[0]||=yn(Z(e=>H(w).run(`ide.settings.search`,{query:``}),[`prevent`]),[`esc`])},null,8,[`value`]),o.value?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,"aria-label":`Очистить поиск`,title:`Очистить поиск`,onClick:n[1]||=e=>H(w).run(`ide.settings.search`,{query:``})},{default:F(()=>[I(H(oi))]),_:1})):B(``,!0)]),_:1})]),_:1}),K(`div`,rp,[K(`nav`,{ref_key:`sidebar`,ref:c,class:`sidebar`,"aria-label":`Разделы настроек`},[(V(!0),q(W,null,J(f.value,t=>(V(),q(`div`,{key:t,class:`group`},[K(`h2`,null,j(t),1),(V(!0),q(W,null,J(d.value.filter(e=>e.group===t),t=>(V(),q(W,{key:t.id},[K(`button`,{type:`button`,"aria-current":t.id===e.selected?`page`:void 0,class:O({selected:t.id===e.selected}),onClick:e=>H(w).run(`ide.settings.section.open`,{id:t.id})},j(t.title),11,ip),t.items?.length?(V(),q(`ul`,{key:0,class:`items`,onDragover:e=>x(e,t),onDrop:e=>S(e,t)},[(V(!0),q(W,null,J(t.items,(n,r)=>(V(),q(`li`,{key:n.id,"data-id":n.id,draggable:!!t.reorder,class:O({dragging:m.value===n.id,"drop-before":h.value===n.id&&!g.value,"drop-after":h.value===n.id&&g.value}),onDragstart:e=>_(e,n.id),onDragend:v},[K(`button`,{type:`button`,"aria-current":n.id===e.selected?`page`:void 0,class:O({selected:n.id===e.selected,problem:n.problem}),onClick:e=>H(w).run(`ide.settings.section.open`,{id:n.id}),onKeydown:e=>C(e,t,r)},[K(`span`,cp,j(n.title),1),n.hint?(V(),q(`span`,lp,j(n.hint),1)):B(``,!0)],42,sp)],42,op))),128))],40,ap)):B(``,!0)],64))),128))]))),128)),d.value.length?B(``,!0):(V(),q(`p`,up,`Нет подходящих разделов`))],512),K(`div`,{ref_key:`content`,ref:l,class:`content`},[p.value?(V(),q(`header`,dp,[K(`h2`,null,j(p.value.title),1),K(`p`,null,j(p.value.description),1)])):B(``,!0),(V(!0),q(W,null,J(e.sections,e=>(V(),q(W,{key:e.id},[u.value.has(e.id)?et((V(),Y(Qf,{key:0,density:`compact`,class:`section-body`},{default:F(()=>[(V(),Y(qe(e.component),rn({ref_for:!0},e.props),null,16))]),_:2},1536)),[[Ln,e.id===p.value?.id]]):B(``,!0)],64))),128)),t.$slots.footer&&p.value?(V(),q(`div`,fp,[L(t.$slots,`footer`,{},void 0,!0)])):B(``,!0),p.value?B(``,!0):(V(),q(`div`,pp,[I(H(If),{"aria-hidden":`true`}),n[5]||=K(`p`,null,`Настройки не найдены`,-1),n[6]||=K(`span`,null,`Попробуйте другое название или параметр.`,-1),I(Q,{onClick:n[2]||=e=>H(w).run(`ide.settings.search`,{query:``})},{default:F(()=>[...n[4]||=[N(`Сбросить поиск`,-1)]]),_:1})]))],512)])],42,np))}}),[[`__scopeId`,`data-v-db431730`]]),hp=M({__name:`UiSettingsSection`,props:{activate:{type:Function},error:{}},setup(e){return(n,r)=>(V(),Y(ml,{as:`section`,gap:4,onFocusin:r[0]||=t=>e.activate?.(),onPointerdown:r[1]||=t=>e.activate?.()},{default:F(()=>[L(n.$slots,`default`),e.error?(V(),Y(t,{key:0,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(e.error),1)]),_:1})):B(``,!0)]),_:3}))}}),gp={class:`head`},_p={key:0,class:`kicker`},vp=[`value`],yp={key:0,class:`note`},bp={key:1,class:`choices`},xp={key:0,class:`note`},Sp={key:1,class:`note`},Cp={key:2,class:`choices`},wp={key:0,class:`note`},Tp={key:1,class:`note`},Ep={key:3,class:`note`},Dp=[`value`],Op={key:0,class:`control-hint`},kp={key:0,class:`note`},Ap=G(M({__name:`AgentChatRoleCard`,props:{role:{},agents:{},controlsFor:{type:Function},resourcesFor:{type:Function},busy:{type:Boolean}},emits:[`save`,`remove`],setup(e,{emit:n}){let o=e,s=n,c=at({name:``,description:``,agent:`projector`,selection:{},prompt:``,skillsMode:`all`,skills:[],mcpMode:`all`,mcp:[]}),u=X([]),d=X({skills:[],mcp:[]}),f=X(!1),p=X(!1),m=X(``);function h(e){return e===void 0?`all`:e.length?`some`:`none`}function _(e){c.name=e.name,c.description=e.description??``,c.agent=e.agent,c.selection={...e.selection},c.prompt=e.prompt??``,c.skillsMode=h(e.skills),c.skills=[...e.skills??[]],c.mcpMode=h(e.mcp),c.mcp=[...e.mcp??[]],v(e.agent)}async function v(e){f.value=!0,m.value=``;try{u.value=await o.controlsFor(e)}catch(e){u.value=[],m.value=e instanceof Error?e.message:`Не удалось получить настройки агента`}finally{f.value=!1}}async function y(){p.value=!0;try{d.value=await o.resourcesFor()}catch(e){m.value=e instanceof Error?e.message:`Не удалось получить навыки и MCP-серверы`}finally{p.value=!1}}R(()=>o.role,_,{immediate:!0}),Lt(()=>void y());function b(e){let t=e.target.value;t!==c.agent&&(c.agent=t,c.selection={},v(t))}function x(e){return c.selection[e.id]??``}function S(e,t){let n=t.target.value;if(n)c.selection={...c.selection,[e.id]:n};else{let t={...c.selection};delete t[e.id],c.selection=t}}function C(e){let t=x(e);return!t||e.options.some(e=>e.value===t)?e.options:[...e.options,{value:t,name:`${t} — недоступно`}]}function w(){let e=new Set(d.value.skills.map(e=>e.name));return[...d.value.skills,...c.skills.filter(t=>!e.has(t)).map(e=>({name:e,description:`недоступен в этом проекте`,kind:`skill`,source:`user`}))]}function T(){let e=new Set(d.value.mcp.map(e=>e.name));return[...d.value.mcp,...c.mcp.filter(t=>!e.has(t)).map(e=>({name:e,source:`user`,kind:`stdio`}))]}function ee(e,t){let n=t.target.checked;c.skills=n?[...new Set([...c.skills,e])]:c.skills.filter(t=>t!==e)}function E(e,t){let n=t.target.checked;c.mcp=n?[...new Set([...c.mcp,e])]:c.mcp.filter(t=>t!==e)}function te(e,t){if(e!==`all`)return e===`none`?[]:[...t]}function D(){if(!c.name.trim()){m.value=`Укажите название роли`;return}let e=te(c.skillsMode,c.skills),t=te(c.mcpMode,c.mcp);s(`save`,{name:c.name.trim(),description:c.description.trim(),agent:c.agent,selection:{...c.selection},prompt:c.prompt.trim(),...e===void 0?{}:{skills:e},...t===void 0?{}:{mcp:t}})}function ne(){confirm(`Удалить роль «${o.role.name}»?`)&&s(`remove`)}return(n,o)=>(V(),Y(l,{as:`section`,appearance:`frame`,class:`role`},{default:F(()=>[K(`div`,gp,[o[5]||=K(`span`,{class:`kicker`},`chat-роль`,-1),e.role.builtin?(V(),q(`span`,_p,`встроенная`)):B(``,!0)]),I(g,{label:`название`},{default:F(({control:t})=>[I(a,rn(t,{value:c.name,disabled:e.busy,onInput:o[0]||=e=>c.name=e.target.value}),null,16,[`value`,`disabled`])]),_:1}),I(g,{label:`агент`},{default:F(({control:t})=>[I(a,rn({as:`select`},t,{value:c.agent,disabled:e.busy,onChange:b}),{default:F(()=>[(V(!0),q(W,null,J(e.agents,e=>(V(),q(`option`,{key:e.backend,value:e.backend},j(e.title)+j(e.builtin?` — встроенный`:``),9,vp))),128))]),_:1},16,[`value`,`disabled`])]),_:1}),I(g,{label:`описание`},{default:F(({control:t})=>[I(a,rn(t,{value:c.description,disabled:e.busy,placeholder:`Когда выбирать эту роль`,onInput:o[1]||=e=>c.description=e.target.value}),null,16,[`value`,`disabled`])]),_:1}),I(g,{label:`промпт роли`},{default:F(({control:t})=>[I(a,rn({as:`textarea`},t,{value:c.prompt,disabled:e.busy,rows:`4`,placeholder:`Дополнительные инструкции для этого чата`,onInput:o[2]||=e=>c.prompt=e.target.value}),null,16,[`value`,`disabled`]),o[6]||=K(`span`,{class:`control-hint`},` Добавляется к системному промпту агента; пустое поле ничего не меняет. `,-1)]),_:1}),I(g,{label:`навыки`},{default:F(({control:t})=>[I(a,rn({as:`select`},t,{modelValue:c.skillsMode,"onUpdate:modelValue":o[3]||=e=>c.skillsMode=e,disabled:e.busy}),{default:F(()=>[...o[7]||=[K(`option`,{value:`all`},`Все доступные`,-1),K(`option`,{value:`some`},`Только выбранные`,-1),K(`option`,{value:`none`},`Не добавлять`,-1)]]),_:1},16,[`modelValue`,`disabled`])]),_:1}),p.value?(V(),q(`p`,yp,`Читаю навыки и MCP-серверы…`)):c.skillsMode===`some`?(V(),q(`div`,bp,[(V(!0),q(W,null,J(w(),t=>(V(),q(`label`,{key:t.name,class:`choice`},[I(a,{type:`checkbox`,checked:c.skills.includes(t.name),disabled:e.busy,"aria-label":`Навык ${t.name}`,onChange:e=>ee(t.name,e)},null,8,[`checked`,`disabled`,`aria-label`,`onChange`]),K(`span`,null,[K(`strong`,null,j(t.name),1),K(`small`,null,j(t.kind===`command`?`команда`:`навык`)+` · `+j(t.description),1)])]))),128)),w().length?(V(),q(`p`,Sp,`Ничего не выбрано — роль не получит навыков.`)):(V(),q(`p`,xp,`В этом проекте нет навыков.`))])):B(``,!0),I(g,{label:`MCP-серверы`},{default:F(({control:t})=>[I(a,rn({as:`select`},t,{modelValue:c.mcpMode,"onUpdate:modelValue":o[4]||=e=>c.mcpMode=e,disabled:e.busy}),{default:F(()=>[...o[8]||=[K(`option`,{value:`all`},`Все настроенные`,-1),K(`option`,{value:`some`},`Только выбранные`,-1),K(`option`,{value:`none`},`Не подключать`,-1)]]),_:1},16,[`modelValue`,`disabled`])]),_:1}),c.mcpMode===`some`&&!p.value?(V(),q(`div`,Cp,[(V(!0),q(W,null,J(T(),t=>(V(),q(`label`,{key:t.name,class:`choice`},[I(a,{type:`checkbox`,checked:c.mcp.includes(t.name),disabled:e.busy,"aria-label":`MCP-сервер ${t.name}`,onChange:e=>E(t.name,e)},null,8,[`checked`,`disabled`,`aria-label`,`onChange`]),K(`span`,null,[K(`strong`,null,j(t.name),1),K(`small`,null,j(t.source===`project`?`проект`:`пользователь`)+` · `+j(t.kind),1)])]))),128)),T().length?(V(),q(`p`,Tp,`Ничего не выбрано — роль не подключит MCP.`)):(V(),q(`p`,wp,`MCP-серверы не настроены.`))])):B(``,!0),f.value?(V(),q(`p`,Ep,`Читаю настройки агента…`)):(V(),q(W,{key:4},[(V(!0),q(W,null,J(u.value,t=>(V(),Y(g,{key:t.id,label:t.name},{default:F(({control:n})=>[I(a,rn({as:`select`},{ref_for:!0},n,{value:x(t),disabled:e.busy,onChange:e=>S(t,e)}),{default:F(()=>[o[9]||=K(`option`,{value:``},`По умолчанию агента`,-1),(V(!0),q(W,null,J(C(t),e=>(V(),q(`option`,{key:e.value,value:e.value},j(e.name),9,Dp))),128))]),_:2},1040,[`value`,`disabled`,`onChange`]),t.description?(V(),q(`span`,Op,j(t.description),1)):B(``,!0)]),_:2},1032,[`label`]))),128)),!u.value.length&&!m.value?(V(),q(`p`,kp,` У этого агента нет настроек для роли: чат начнётся с его умолчаний. `)):B(``,!0)],64)),I(r,null,{default:F(()=>[I(Q,{appearance:`solid`,size:`sm`,busy:e.busy,disabled:e.busy,onClick:D},{default:F(()=>[...o[10]||=[N(`Сохранить`,-1)]]),_:1},8,[`busy`,`disabled`]),I(Q,{appearance:`outline`,size:`sm`,disabled:e.busy,onClick:ne},{default:F(()=>[...o[11]||=[N(`Удалить`,-1)]]),_:1},8,[`disabled`])]),_:1}),I(i,null,{default:F(()=>[...o[12]||=[N(` Роль применяется к новому чату и сохраняется в его истории. Изменение роли не меняет уже начатые чаты; пустое значение наследует умолчание агента. Projector ограничивает навыки выбором роли; внешний агент получает выбранные навыки путями к файлам, но свои нативные навыки сохраняет. `,-1)]]),_:1}),m.value?(V(),Y(t,{key:5,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(m.value),1)]),_:1})):B(``,!0)]),_:1}))}}),[[`__scopeId`,`data-v-2719e6b6`]]);async function jp(e,t){let n=await fetch(e,{cache:`no-store`,...t,headers:t?.body?{"Content-Type":`application/json`}:void 0}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error||`Роли агентов недоступны`);return r}function Mp(){return jp(`/api/agent/roles`)}function Np(e,t){return jp(`/api/agent/roles/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify({selection:t})})}function Pp(e){return jp(`/api/agent/roles/${encodeURIComponent(e)}/reset`,{method:`POST`,body:JSON.stringify({})})}function Fp(e){return jp(`/api/agent/roles`,{method:`POST`,body:JSON.stringify({role:{...e,kind:`chat`}})})}function Ip(e,t){return jp(`/api/agent/roles/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify({role:{...t,kind:`chat`}})})}function Lp(e){return jp(`/api/agent/roles/${encodeURIComponent(e)}`,{method:`DELETE`})}async function Rp(e,t){let n=await fetch(e,{cache:`no-store`,...t,headers:t?.body?{"Content-Type":`application/json`}:void 0}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error||`Роли проекта недоступны`);return r}function zp(e){return Rp(`/api/agent/project-roles?projectId=${encodeURIComponent(e)}`)}function Bp(e,t){return Rp(`/api/agent/project-roles`,{method:`POST`,body:JSON.stringify({projectId:e,role:{...t,kind:`chat`}})})}function Vp(e,t,n){return Rp(`/api/agent/project-roles/${encodeURIComponent(t)}`,{method:`PUT`,body:JSON.stringify({projectId:e,role:{...n,kind:`chat`}})})}function Hp(e,t){return Rp(`/api/agent/project-roles/${encodeURIComponent(t)}?projectId=${encodeURIComponent(e)}`,{method:`DELETE`})}function Up(e,t){return Rp(`/api/agent/project-roles/trust`,{method:`PUT`,body:JSON.stringify({projectId:e,trusted:t})})}async function Wp(e,t){let n=await fetch(`/api/agent/controls?backend=${encodeURIComponent(e)}&projectId=${encodeURIComponent(t)}`,{cache:`no-store`}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error||`Не удалось получить настройки агента`);return Array.isArray(r.controls)?r.controls:[]}var Gp;function Kp(){return Gp??=(async()=>{let e=Oc();return e.projects.value.length||await e.load(),e.projects.value[0]?.id??``})().catch(()=>``),Gp}var qp=at({data:{roles:[],file:``},controls:[],loaded:!1,error:``}),Jp=new Map,Yp,Xp;function Zp(e){return{roles:Array.isArray(e?.roles)?e.roles:[],file:typeof e?.file==`string`?e.file:``,...e?.created?{created:e.created}:{}}}async function Qp(e=!1){return qp.loaded&&!e?qp.data:Yp||(Yp=Mp().then(e=>(qp.data=Zp(e),qp.loaded=!0,qp.error=``,qp.data)).catch(e=>{throw qp.error=e instanceof Error?e.message:`Ошибка ролей агентов`,e}).finally(()=>{Yp=void 0}),Yp)}async function $p(e=!1){return qp.controls.length&&!e?qp.controls:Xp||(Xp=Wp(`projector`,``).then(e=>(qp.controls=e,Jp.set(`projector`,e),e)).finally(()=>{Xp=void 0}),Xp)}function em(e){qp.data=Zp(e),qp.loaded=!0,qp.error=``}async function tm(e){let[t,n]=await Promise.all([Mp(),e?zp(e).catch(()=>void 0):Promise.resolve(void 0)]),r=new Map(t.roles.filter(e=>e.kind===`chat`).map(e=>[e.id,e]));for(let e of n?.trusted?n.roles:[])e.kind===`chat`&&r.set(e.id,e);return[...r.values()]}async function nm(e){if(e===`projector`)return $p();let t=Jp.get(e);if(t)return t;let n=await Wp(e,await Kp());return Jp.set(e,n),n}function rm(){let e=X(``),t=X(``),n=E(`agent-roles:${P()}`,()=>({surface:`agentRoles`,busy:e.value,roles:qp.data.roles.length})),r=z(()=>(Jp.get(`projector`)??qp.controls).find(e=>e.id===`provider`)),i=z(()=>r.value?.options??[]),a=z(()=>qp.data.roles),o=z(()=>qp.data.roles.filter(e=>e.kind===`service`)),s=z(()=>qp.data.roles.filter(e=>e.kind===`chat`)),c=z(()=>qn()),l=z(()=>qp.data.file),u=z(()=>t.value||qp.error);async function d(){t.value=``;try{let e=await Qp(!0);return await $p(!0).catch(e=>{t.value=e instanceof Error?e.message:`Не удалось получить модели провайдеров`}),e}catch(e){throw t.value=e instanceof Error?e.message:`Ошибка ролей агентов`,e}}async function f(e){t.value=``;try{return await e()}catch(e){throw t.value=e instanceof Error?e.message:`Не удалось сохранить роль`,e}}async function p(t,n){if(!qp.data.roles.find(e=>e.id===t&&e.kind===`service`))throw Error(`Неизвестная служебная роль: ${t}`);let r=n.trim()?{provider:n.trim()}:{};e.value=t;try{return await f(async()=>{let e=await Np(t,r);return em(e),e})}finally{e.value=``}}async function m(t){if(!qp.data.roles.find(e=>e.id===t&&e.kind===`service`))throw Error(`Неизвестная служебная роль: ${t}`);e.value=t;try{return await f(async()=>{let e=await Pp(t);return em(e),e})}finally{e.value=``}}async function h(){e.value=`new`;try{return await f(async()=>{let e=await Fp({name:`Новая роль`,description:``,agent:`projector`,selection:{}});em(e);let t=e.created??e.roles.findLast(e=>e.kind===`chat`);if(!t)throw Error(`Роль не создана`);return t})}finally{e.value=``}}async function g(t,n){if(!qp.data.roles.find(e=>e.id===t&&e.kind===`chat`))throw Error(`Неизвестная роль: ${t}`);e.value=t;try{return await f(async()=>{let e=await Ip(t,n);return em(e),e})}finally{e.value=``}}async function _(t){if(!qp.data.roles.find(e=>e.id===t&&e.kind===`chat`))throw Error(`Неизвестная роль: ${t}`);e.value=t;try{return await f(async()=>{let e=await Lp(t);return em(e),e})}finally{e.value=``}}return n.scope.registerCommand({id:`ide.agent.roles.list`,palette:!1,title:`Список ролей агентов`,description:`Возвращает служебные роли (Доктор, Lens, Судья) и chat-роли: id, название, агента, выбранные настройки и наследуется ли модель. Служебные роли — внутренние вызовы без инструментов; chat-роль открывает обычный чат.`,run:async()=>{let e=await Qp();return{file:e.file,roles:e.roles.map(e=>({id:e.id,name:e.name,description:e.description,kind:e.kind,agent:e.agent,selection:e.selection,prompt:e.prompt,skills:e.skills,mcp:e.mcp,inherited:e.inherited}))}}}),n.scope.registerCommand({id:`ide.agent.roles.set`,palette:!1,title:`Выбрать модель служебной роли`,description:`Задаёт модель для служебной роли Projector. provider — значение из ide.agent.roles.list, например provider:model; пустая строка возвращает роль к модели чата. Это меняет только внутренние вызовы Доктора, Lens или Судьи: промпты, отсутствие инструментов и лимиты остаются прежними.`,arguments:{role:`string: id служебной роли: doctor, lens или judge`,provider:`string: provider:model из настроек провайдеров; пустая строка — как в чате`},enabled:()=>!e.value,run:e=>{let t=b(e);if(typeof t.role!=`string`||!t.role)throw Error(`role: id служебной роли: doctor, lens или judge`);if(typeof t.provider!=`string`)throw Error(`provider: строка provider:model или пустая строка`);return p(t.role,t.provider)}}),n.scope.registerCommand({id:`ide.agent.roles.reset`,palette:!1,title:`Вернуть служебной роли модель чата`,description:`Удаляет выбранную модель роли. Доктор, Lens или Судья снова используют модель текущего чата или активного провайдера.`,arguments:{role:`string: id служебной роли: doctor, lens или judge`},enabled:()=>!e.value,run:e=>{let t=b(e);if(typeof t.role!=`string`||!t.role)throw Error(`role: id служебной роли: doctor, lens или judge`);return m(t.role)}}),n.scope.registerCommand({id:`ide.agent.roles.create`,palette:!1,title:`Создать chat-роль`,description:`Создаёт новую роль для чата с именем «Новая роль» и агентом Projector. Дальше её настройки меняет ide.agent.roles.save: название, агент и набор controls. Возвращает созданную роль.`,run:()=>h()}),n.scope.registerCommand({id:`ide.agent.roles.save`,palette:!1,title:`Сохранить chat-роль`,description:`Меняет название, описание, агента, выбранные настройки, промпт, навыки и MCP chat-роли. selection — объект control id → value; отсутствующее значение наследует умолчание агента. prompt добавляется к системному промпту; skills и mcp — имена, пустой массив выключает их. Не переданные поля сохраняются. Роль действует на новые чаты; уже начатые чаты сохраняют снимок.`,arguments:{role:`string: id chat-роли`,name:`string: название роли`,agent:`string: id агента из каталога`,description:`string: описание (необязательно)`,selection:`object: control id → value (необязательно)`,prompt:`string: дополнительные инструкции роли (необязательно)`,skills:`array: имена навыков; пустой массив выключает (необязательно)`,mcp:`array: имена MCP-серверов; пустой массив выключает (необязательно)`},enabled:()=>!e.value,run:e=>{let t=b(e);if(typeof t.role!=`string`||!t.role)throw Error(`role: id chat-роли`);if(typeof t.name!=`string`||!t.name.trim())throw Error(`name: название роли`);if(typeof t.agent!=`string`||!t.agent)throw Error(`agent: id агента`);let n=s.value.find(e=>e.id===t.role);if(!n)throw Error(`Неизвестная chat-роль: ${t.role}`);let r=t.selection&&typeof t.selection==`object`&&!Array.isArray(t.selection)?t.selection:n.selection,i=(e,t)=>Array.isArray(e)?e.filter(e=>typeof e==`string`):t;return g(t.role,{...n,name:t.name,agent:t.agent,description:typeof t.description==`string`?t.description:n.description,selection:r,prompt:typeof t.prompt==`string`?t.prompt:n.prompt,skills:i(t.skills,n.skills),mcp:i(t.mcp,n.mcp)})}}),n.scope.registerCommand({id:`ide.agent.roles.delete`,palette:!1,title:`Удалить chat-роль`,description:`Удаляет chat-роль. Уже начатые чаты продолжают работать со своим снимком; роль перестаёт появляться в меню новой сессии.`,arguments:{role:`string: id chat-роли`},enabled:()=>!e.value,run:e=>{let t=b(e);if(typeof t.role!=`string`||!t.role)throw Error(`role: id chat-роли`);return _(t.role)}}),{roles:a,serviceRoles:o,chatRoles:s,agents:c,file:l,modelOptions:i,controlsFor:nm,busy:e,error:u,load:d,setService:p,resetService:m,createChat:h,saveChat:g,removeChat:_,commands:n}}var im=new Map;async function am(e){let t=await fetch(e,{cache:`no-store`}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||`Не удалось получить ресурсы роли`);return n}async function om(e=``,t=!1){let n=e||await Kp(),r=n||`-`;if(!t){let e=im.get(r);if(e)return e}let i=Promise.all([am(`/api/agent/skills?projectId=${encodeURIComponent(n)}`),am(`/api/agent/mcp${n?`?projectId=${encodeURIComponent(n)}`:``}`)]).then(([e,t])=>({skills:Array.isArray(e.skills)?e.skills:[],mcp:Array.isArray(t.servers)?t.servers:[]}));return im.set(r,i),i.catch(()=>im.delete(r)),i}var sm={class:`summary`},cm=[`value`],lm={class:`section-head roles-head`},um={key:0,class:`empty`},dm=G(M({__name:`AgentRoleSettings`,setup(e){let{serviceRoles:t,chatRoles:n,agents:o,file:s,modelOptions:c,controlsFor:u,busy:d,error:f,load:p,setService:m,resetService:h,createChat:_,saveChat:v,removeChat:y,commands:b}=rm(),x=()=>b.scope.activate(),S=X({}),C=e=>S.value[e.id]??e.selection?.provider??``;function w(e,t){S.value={...S.value,[e.id]:t.target.value}}function T(e){let t=C(e),n=c.value;return!t||n.some(e=>e.value===t)?n:[...n,{value:t,name:`${t} — недоступна`}]}async function ee(e){await m(e.id,C(e)).catch(()=>void 0);let t={...S.value};delete t[e.id],S.value=t}async function E(e){await h(e.id).catch(()=>void 0);let t={...S.value};delete t[e.id],S.value=t}async function te(){await _().catch(()=>void 0)}async function D(e,t){await v(e.id,t).catch(()=>void 0)}async function ne(e){await y(e.id).catch(()=>void 0)}return R(t,e=>{let t={...S.value};for(let n of e)n.id in t||(t[n.id]=n.selection.provider??``);S.value=t},{immediate:!0}),Lt(()=>void p().catch(()=>void 0)),(e,c)=>(V(),Y(hp,{activate:x,error:H(f)},{default:F(()=>[c[7]||=K(`div`,{class:`section-head`},[K(`h3`,null,`Служебные роли`),K(`p`,null,` Доктор, Lens и Судья выполняют один короткий запрос без инструментов. Выбранная модель действует только на эти вызовы. `)],-1),(V(!0),q(W,null,J(H(t),e=>(V(),Y(l,{key:e.id,as:`section`,appearance:`frame`,class:`role`},{default:F(()=>[K(`h4`,null,j(e.name),1),K(`p`,sm,j(e.description),1),I(g,{label:`модель`},{default:F(({control:t})=>[I(a,rn({as:`select`},{ref_for:!0},t,{value:C(e),disabled:H(d)===e.id,onChange:t=>w(e,t)}),{default:F(()=>[c[0]||=K(`option`,{value:``},`Как в чате`,-1),(V(!0),q(W,null,J(T(e),e=>(V(),q(`option`,{key:e.value,value:e.value},j(e.name),9,cm))),128))]),_:2},1040,[`value`,`disabled`,`onChange`])]),_:2},1024),I(r,null,{default:F(()=>[I(Q,{appearance:`solid`,size:`sm`,busy:H(d)===e.id,disabled:H(d)===e.id,onClick:t=>ee(e)},{default:F(()=>[...c[1]||=[N(`Сохранить`,-1)]]),_:1},8,[`busy`,`disabled`,`onClick`]),I(Q,{appearance:`outline`,size:`sm`,disabled:H(d)===e.id||!e.selection.provider&&!S.value[e.id],onClick:t=>E(e)},{default:F(()=>[...c[2]||=[N(`Как в чате`,-1)]]),_:1},8,[`disabled`,`onClick`])]),_:2},1024),C(e)?B(``,!0):(V(),Y(i,{key:0},{default:F(()=>[...c[3]||=[N(` Модель берётся из чата, а если её там нет — у активного провайдера. `,-1)]]),_:1}))]),_:2},1024))),128)),K(`div`,lm,[c[5]||=K(`div`,null,[K(`h3`,null,`Роли чатов`),K(`p`,null,` Пресет агента, модели и его настроек. Роль открывается из меню «+» и действует на новый чат; уже начатые чаты сохраняют свой снимок. `)],-1),I(Q,{appearance:`outline`,size:`sm`,busy:H(d)===`new`,disabled:!!H(d),onClick:te},{default:F(()=>[...c[4]||=[N(`Добавить роль`,-1)]]),_:1},8,[`busy`,`disabled`])]),H(n).length?B(``,!0):(V(),q(`p`,um,` Ролей чатов пока нет. Добавьте роль, выберите агента и настройки — она появится в меню новой сессии. `)),(V(!0),q(W,null,J(H(n),e=>(V(),Y(Ap,{key:e.id,role:e,agents:H(o),"controls-for":H(u),"resources-for":H(om),busy:H(d)===e.id,onSave:t=>D(e,t),onRemove:t=>ne(e)},null,8,[`role`,`agents`,`controls-for`,`resources-for`,`busy`,`onSave`,`onRemove`]))),128)),I(i,null,{default:F(()=>[c[6]||=N(` Служебные роли не меняют модель чатов. Файл настроек: `,-1),K(`code`,null,j(H(s)),1)]),_:1})]),_:1},8,[`error`]))}}),[[`__scopeId`,`data-v-1f4f3b2e`]]);function fm(e){let t=X(),n=X(``),r=X(``),i=E(`agent-project-roles:${P()}`,()=>({surface:`agentProjectRoles`,projectId:e(),trusted:t.value?.trusted===!0,roles:t.value?.roles.length??0,busy:n.value})),a=z(()=>t.value?.roles??[]),o=z(()=>t.value?.trusted===!0),s=z(()=>t.value?.file??``),c=z(()=>t.value?.exists===!0),l=z(()=>t.value?.problem??``),u=z(()=>r.value||l.value);async function d(e){r.value=``;try{return await e()}catch(e){throw r.value=e instanceof Error?e.message:`Ошибка ролей проекта`,e}}async function f(){let n=e();if(!n)t.value=void 0;else return d(async()=>(t.value=await zp(n),t.value))}async function p(r){let i=e();n.value=`trust`;try{return await d(async()=>(t.value=await Up(i,r),t.value))}finally{n.value=``}}async function m(){let r=e();n.value=`new`;try{return await d(async()=>(t.value=await Bp(r,{name:`Новая роль проекта`,description:``,agent:`projector`,selection:{}}),t.value))}finally{n.value=``}}async function h(r,i){let a=e();n.value=r;try{return await d(async()=>(t.value=await Vp(a,r,i),t.value))}finally{n.value=``}}async function g(r){let i=e();n.value=r;try{return await d(async()=>(t.value=await Hp(i,r),t.value))}finally{n.value=``}}return i.scope.registerCommand({id:`ide.agent.projectRoles.list`,palette:!1,title:`Роли проекта`,description:`Возвращает роли из .projector/roles.json, путь к файлу, признак доверия и ошибку чтения. Недоверенные роли не открываются в чатах, заданиях и task.`,run:async()=>(await f(),t.value??{projectId:e(),path:``,file:``,exists:!1,trusted:!1,roles:[]})}),i.scope.registerCommand({id:`ide.agent.projectRoles.create`,palette:!1,title:`Создать роль проекта`,description:`Создаёт chat-роль в .projector/roles.json. После записи файл нужно доверить заново. Роль появится в меню «+» только у доверенного файла.`,run:()=>m()}),i.scope.registerCommand({id:`ide.agent.projectRoles.save`,palette:!1,title:`Сохранить роль проекта`,description:`Меняет chat-роль в .projector/roles.json: название, агента, настройки, промпт, навыки и MCP. Не переданные поля сохраняются; пустой массив skills или mcp выключает их. Любая запись меняет хеш файла и отзывает доверие.`,arguments:{role:`string: id роли проекта`,name:`string: название`,agent:`string: id агента`,description:`string: описание`,selection:`object: control id → value`,prompt:`string: дополнительные инструкции роли`,skills:`array: имена навыков`,mcp:`array: имена MCP-серверов`},enabled:()=>!n.value,run:e=>{let t=b(e);if(typeof t.role!=`string`||!t.role)throw Error(`role: id роли проекта`);if(typeof t.name!=`string`||!t.name.trim())throw Error(`name: название`);if(typeof t.agent!=`string`||!t.agent)throw Error(`agent: id агента`);let n=a.value.find(e=>e.id===t.role);if(!n)throw Error(`Неизвестная роль проекта: ${t.role}`);let r=(e,t)=>Array.isArray(e)?e.filter(e=>typeof e==`string`):t;return h(t.role,{...n,name:t.name,agent:t.agent,description:typeof t.description==`string`?t.description:n.description,selection:t.selection&&typeof t.selection==`object`&&!Array.isArray(t.selection)?t.selection:n.selection,prompt:typeof t.prompt==`string`?t.prompt:n.prompt,skills:r(t.skills,n.skills),mcp:r(t.mcp,n.mcp)})}}),i.scope.registerCommand({id:`ide.agent.projectRoles.delete`,palette:!1,title:`Удалить роль проекта`,description:`Удаляет chat-роль из .projector/roles.json и отзывает доверие к файлу.`,arguments:{role:`string: id роли проекта`},enabled:()=>!n.value,run:e=>{let t=b(e);if(typeof t.role!=`string`||!t.role)throw Error(`role: id роли проекта`);return g(t.role)}}),i.scope.registerCommand({id:`ide.agent.projectRoles.trust`,palette:!1,title:`Доверять ролям проекта`,description:`Выдаёт или отзывает доверие к текущему содержимому .projector/roles.json. Доверие привязано к хешу файла: правка файла отзывает его автоматически.`,arguments:{trusted:`boolean: доверять ли текущему файлу`},enabled:()=>!n.value,run:e=>{let t=b(e).trusted;if(typeof t!=`boolean`)throw Error(`trusted должен быть boolean`);return p(t)}}),{data:t,roles:a,trusted:o,file:s,exists:c,problem:l,busy:n,error:u,load:f,trust:p,create:m,save:h,remove:g,commands:i}}var pm={class:`head`},mm={class:`file`},hm={key:0,class:`trusted`},gm={key:1,class:`untrusted`},_m={key:2,class:`untrusted`},vm={key:2,class:`empty`},ym=G(M({__name:`AgentProjectRoles`,props:{project:{}},setup(e){let n=e,{roles:a,trusted:o,file:s,exists:c,problem:l,busy:u,error:d,load:f,trust:p,create:m,save:h,remove:g,commands:_}=fm(()=>n.project.id),v=()=>_.scope.activate(),y=qn(),b=()=>om(n.project.id);R(()=>n.project.id,()=>void f().catch(()=>void 0),{immediate:!0});async function x(){await m().catch(()=>void 0)}async function S(e,t){await h(e.id,t).catch(()=>void 0)}async function C(e){await g(e.id).catch(()=>void 0)}async function w(e){await p(e).catch(()=>void 0)}return(e,n)=>(V(),Y(hp,{activate:v,error:H(d),class:`project-roles`},{default:F(()=>[K(`div`,pm,[I(r,{wrap:``,gap:2},{default:F(()=>[K(`span`,mm,j(H(s)||`.projector/roles.json`),1),H(o)?(V(),q(`span`,hm,`доверено`)):H(c)?(V(),q(`span`,gm,`не доверено`)):(V(),q(`span`,_m,`файла ещё нет`))]),_:1}),I(r,{gap:2},{default:F(()=>[H(c)&&!H(o)?(V(),Y(Q,{key:0,appearance:`solid`,size:`sm`,busy:H(u)===`trust`,disabled:!!H(l),onClick:n[0]||=e=>w(!0)},{default:F(()=>[...n[2]||=[N(`Доверять`,-1)]]),_:1},8,[`busy`,`disabled`])):H(o)?(V(),Y(Q,{key:1,appearance:`outline`,size:`sm`,busy:H(u)===`trust`,onClick:n[1]||=e=>w(!1)},{default:F(()=>[...n[3]||=[N(`Отозвать доверие`,-1)]]),_:1},8,[`busy`])):B(``,!0),I(Q,{appearance:`outline`,size:`sm`,busy:H(u)===`new`,disabled:!!H(u),onClick:x},{default:F(()=>[...n[4]||=[N(`Добавить роль`,-1)]]),_:1},8,[`busy`,`disabled`])]),_:1})]),H(l)?(V(),Y(t,{key:0,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(H(l)),1)]),_:1})):H(c)&&!H(o)?(V(),Y(t,{key:1,tone:`muted`,variant:`note`,size:`xs`,flush:``},{default:F(()=>[...n[5]||=[N(` Роли из этого файла не открываются в чатах, заданиях и task. Проверьте файл и выдайте доверие. `,-1)]]),_:1})):B(``,!0),!H(a).length&&!H(l)?(V(),q(`p`,vm,` В файле пока нет ролей. Добавьте роль — она появится в меню «+» после доверия. `)):B(``,!0),(V(!0),q(W,null,J(H(a),e=>(V(),Y(Ap,{key:e.id,role:e,agents:H(y),"controls-for":H(nm),"resources-for":b,busy:H(u)===e.id,onSave:t=>S(e,t),onRemove:t=>C(e)},null,8,[`role`,`agents`,`controls-for`,`busy`,`onSave`,`onRemove`]))),128)),I(i,null,{default:F(()=>[...n[6]||=[N(` Роли проекта действуют только в этом проекте. Доверие привязано к хешу файла; после изменения файла его нужно выдать заново. `,-1)]]),_:1})]),_:1},8,[`error`]))}}),[[`__scopeId`,`data-v-a48ee8ff`]]),bm=`<script>`,xm=`<\/script>`;function Sm(e){let t=e.indexOf(bm);if(t<0)return{template:e,scriptOpen:!1};let n=e.indexOf(xm,t);return n<0?{template:e.slice(0,t),scriptOpen:!0}:{template:e.slice(0,t)+e.slice(n+9),script:e.slice(t+8,n),scriptOpen:!1}}var Cm=new Set([`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`link`,`meta`,`source`,`track`,`wbr`]);function wm(e,t){let n=``;for(let r=t;r<e.length;r++){let t=e[r];if(n)t===n&&(n=``);else if(t===`"`||t===`'`)n=t;else if(t===`>`)return r+1}return-1}function Tm(e){let t=[],n=e.length,r=0;scan:for(;r<e.length;){let i=e.indexOf(`<`,r),a=e.indexOf(`{{`,r);if(a>=0&&(i<0||a<i)){let t=e.indexOf(`}}`,a);if(t<0){n=a;break}r=t+2;continue}if(i<0)break;let o=e.slice(i,i+4);if(o.startsWith(`<!--`)){let t=e.indexOf(`-->`,i);if(t<0){n=i;break}r=t+3}else if(o.startsWith(`</`)){let a=e.indexOf(`>`,i);if(a<0){n=i;break}let o=/^<\/\s*([A-Za-z][\w-]*)/.exec(e.slice(i,a))?.[1],s=o?t.lastIndexOf(o):-1;s>=0&&(t.length=s),r=a+1}else if(/^<[A-Za-z]/.test(o)){let a=/^<([A-Za-z][\w-]*)/.exec(e.slice(i))[1],o=wm(e,i+1+a.length);if(o<0){n=i;break}if(a===`script`||a===`style`){let t=e.indexOf(`</${a}>`,o);if(t<0){n=i;break scan}r=t+a.length+3;continue}e[o-2]!==`/`&&!Cm.has(a.toLowerCase())&&t.push(a),r=o}else if(i===e.length-1){n=i;break}else r=i+1}return e.slice(0,n)+t.reverse().map(e=>`</${e}>`).join(``)}var Em,Dm;function Om(){return Dm??=yi(()=>import(`./compiler-dom.esm-bundler-C5a_rSi1.js`).then(e=>Em=e),__vite__mapDeps([0,1]))}var km=new Map,Am={...see,withCtx(...e){let[t,...n]=e;return F((...e)=>{he(-1);try{return t(...e)}finally{he(1)}},...n)}};function jm(e){let t=km.get(e);if(t)return t;if(!Em)throw Error(`The template compiler is not loaded yet`);let{code:n}=Em.compile(e,{mode:`function`,onError(e){throw e}}),r=Function(`Vue`,n.replaceAll(`_: 1 /* STABLE */`,`_: 2 /* DYNAMIC */`))(Am);return km.size>=200&&km.delete(km.keys().next().value),km.set(e,r),r}var Mm={ref:X,reactive:at,computed:z,watch:R,onMounted:e=>void Ut(e)},Nm=new Map;function Pm(e){let t=Nm.get(e);if(t)return t;let n=Function(...Object.keys(Mm),`reply`,`scope`,`with (scope) {\n${e}\n}`);return Nm.size>=200&&Nm.delete(Nm.keys().next().value),Nm.set(e,n),n}var Fm=Symbol(`agent-widget-reply`);function Im(e,t){let n=typeof e==`string`?e:JSON.stringify(e,null,2),r=typeof e==`string`?e:`\`\`\`json\n${n}\n\`\`\``;return t?`${t}\n\n${r}`:r}function Lm(){return typeof navigator>`u`||navigator.userActivation?.isActive!==!1}function Rm(){let e=tt(Fm,void 0);return(t,n)=>!e||!Lm()?!1:(e(Im(t,n),t,n),!0)}var zm=Symbol(`agent-message-scope`),Bm=Symbol(`agent-widget-project`);function Vm(e,t,n){let r=at({}),i=Rm(),a=new Map,o=X(0);ot(zm,{shared:r,done:t,version:o}),R(e,e=>{e.forEach((e,t)=>{if(e.type!==`script`||!e.complete)return;let s=a.get(t);if(s?.code===e.source)return;s?.scope.stop();let c=ct(!0);a.set(t,{code:e.source,scope:c});try{let t=c.run(()=>Pm(e.source)(...Object.values(Mm),i,r));Object.assign(r,t),o.value++}catch(e){n.value=[...n.value,e instanceof Error?e.message:String(e)]}})},{immediate:!0}),lt(()=>a.forEach(({scope:e})=>e.stop()))}var Hm=new Set(`Math JSON Number String Boolean Array Object Date RegExp Map Set Symbol BigInt Intl parseInt parseFloat isNaN isFinite NaN Infinity undefined console encodeURIComponent decodeURIComponent`.split(` `));function Um(e){return M({name:`AgentWidgetBody`,components:e.components,setup(){let t=Rm(),n=tt(zm,null),r=at({reply:t}),i=n?.shared??{},a=e=>e in r||e in i,o=new Proxy({},{has:(e,t)=>a(t),get:(e,t)=>t in r?r[t]:i[t],set:(e,t,n)=>{let a=t in r||!(t in i)?r:i;return a[t]=n,!0}}),s=z(()=>e.strict.value&&(n?.done.value??!0)),c=X(0),l,u;R(e.script,n=>{l?.stop(),l=ct(!0);for(let e of Object.keys(r))e!==`reply`&&delete r[e];try{n&&Object.assign(r,l.run(()=>n(...Object.values(Mm),t,o)))}catch(t){e.fail(t)}c.value++},{immediate:!0}),lt(()=>l?.stop());let d=new Proxy(o,{has:(e,t)=>a(t)||typeof t==`string`&&t[0]!==`_`&&!Hm.has(t),get:(e,t)=>a(t)?Reflect.get(e,t):void 0}),f=[];return()=>{c.value;let t=e.render.value;if(!t)return null;he(-1);try{return s.value?t(o,f):u=t(d,f)}catch(e){if(s.value)throw e;return u??null}finally{he(1)}}}})}var Wm={layout:`Раскладка`,data:`Данные`,form:`Форма и ввод`,action:`Действия`,project:`Виджеты проекта`};function Gm(e){let t=Object.entries(e.props??{}).map(([e,t])=>` ${e}: ${t.type}; ${t.required?`обязательное`:`необязательное`} — ${t.description}`);return[`${e.name} — ${e.summary}`,...e.slot?[`Содержимое: ${e.slot}`]:[],...e.model?[`v-model: ${e.model.type} — ${e.model.description}`]:[],...t.length?[`Свойства:`,...t]:[],...e.notes??[],...e.answer?[`Форма ответа: если ответ заканчивается этим блоком, композер показывает его вместо поля ввода и сохраняет отправленные значения.`]:[],`Пример Vue-разметки:`,"```vue",e.example,"```"]}var Km=[`Используй только компоненты из каталога ниже. Каждый блок начинается сразу с зарегистрированного компонента; дополнительная обёртка не нужна. Обычные HTML- и SVG-элементы разрешены внутри блока.`,`Типы и обязательность свойств описаны отдельно от примеров: эти пояснения не входят в Vue-разметку. Необязательное свойство можно просто опустить.`,`Числа передавай через привязку с десятичной точкой, без единиц и знака процента: например, :delta="3.6". Компонент сам добавляет процент к delta. Строки передавай обычным атрибутом, например value="3,6%", если нужен текст показателя.`,`В ответе пиши Vue-разметку с новой строки прямо в markdown, без кодового блока. Примеры в справке выделены кодовыми блоками только для чтения. Корневой тег должен быть закрыт или самозакрыт. Массивы и объекты передавай через привязки свойств, как в примерах ниже. Булев флаг можно включить атрибутом без значения. Внутри блока — HTML и Vue-шаблон; для жирного текста используй элемент strong.`,`Для расчётов, где значения зависят друг от друга, добавь <script>: в нём есть ref, reactive, computed, watch, onMounted и reply(данные, "подпись"); верни из него объект со всем, что нужно шаблону. Например, тело скрипта: const n = ref(1); return { n }; <script> между блоками один на весь ответ: его значения видны во всех блоках (ползунок в одном управляет графиком в другом), порядок не важен; <script> внутри блока виден только ему.`,`Данные бери из фактов, которые проверил сам; не выдумывай цифры.`];function qm(e){return e.guide?[`${e.name} — ${e.summary}`,...e.guide.split(`
|
|
6
|
+
`),`Пример Vue-разметки:`,"```vue",e.example,"```"]:Gm(e)}function Jm(e){return Object.keys(Wm).map(t=>{let n=e.filter(e=>e.group===t&&!e.special&&!e.hidden).flatMap(e=>[...qm(e),``]);return n.length?`${Wm[t]}:\n${n.join(`
|
|
7
|
+
`)}`:``}).filter(Boolean)}function Ym(e,t=`Специальные виджеты`){let n=e.filter(e=>e.special&&!e.hidden);return n.length?[`${t}:`,`Их свойства и примеры не загружены. Когда специальный виджет уместен, сначала вызови describe_widget с его именем; не угадывай свойства.`,...n.map(e=>`${e.name} — ${e.summary}`)].join(`
|
|
8
|
+
`):``}function Xm(e,t=`Специальные виджеты проекта`){return[...Jm(e),Ym(e,t)].filter(Boolean).join(`
|
|
9
|
+
`)}var Zm=e=>e;function Qm(){let e=new Map,t=()=>[...e.values()],n=(t,n=[])=>n.find(e=>e.name===t)??e.get(t);return{register:t=>void e.set(t.name,t),has:t=>e.has(t),get:t=>e.get(t),list:t,guide(){let e=Jm(t());return[Km.join(`
|
|
10
|
+
`),...e,Ym(t())].filter(Boolean).join(`
|
|
11
|
+
`)},extraGuide(e){return Xm(e)},describe(e,t=[]){let r=n(e,t);return r?Gm(r).join(`
|
|
12
|
+
`):`Нет компонента ${e}`},describeSpecial(e,t=[]){let r=n(e,t);if(!r)throw Error(`Нет компонента ${e}`);if(!r.special)throw Error(`Компонент ${e} не специальный: его описание уже есть в промпте`);return Gm(r).join(`
|
|
13
|
+
`)}}}var $m=Qm(),eh=ut({}),th=ut({}),nh=X(0);function rh(e){$m.register(e.definition),eh[e.definition.name]=e.component}function ih(e,t){e&&(th[e]=t,nh.value++)}function ah(e){e&&e in th&&(delete th[e],nh.value++)}function oh(e){return e?th[e]??{}:{}}function sh(e){let t=oh(e);if(!Object.keys(t).length)return eh;let n=Object.assign({},eh);for(let[e,r]of Object.entries(t))n[e]=r.component;return n}var ch=(e,t)=>Object.hasOwn(eh,e)||Object.hasOwn(oh(t),e);function lh(e){let t=Object.values(oh(e)).map(e=>e.definition).filter(e=>e.answer).map(e=>e.name);return[...$m.list().filter(e=>e.answer).map(e=>e.name),...t]}var uh=[`inert`],dh={key:0,class:`widget-failure`,role:`alert`},fh={key:2,class:`widget-pending`,"aria-busy":`true`},ph=G(M({__name:`AgentWidget`,props:{source:{},complete:{type:Boolean},projectId:{}},setup(e){let t=e;ot(Bm,Ke(t,`projectId`));let n=We(),r=We(),i=We(``),a=X(0),o=Um({components:sh(t.projectId),render:n,script:r,strict:Ke(t,`complete`),fail:e=>i.value=s(e)}),s=e=>e instanceof Error?e.message:String(e),c=``,l=``,u,d=0;async function f(){d=0,await Om(),t.source.startsWith(c)||a.value++,c=t.source;let e=Sm(t.source),o=t.complete?e.template:Tm(e.template);try{e.script!==u&&(u=e.script,i.value=``,r.value=e.script?Pm(e.script):void 0),o!==l&&(l=o,i.value=``,n.value=o.trim()?jm(o):void 0)}catch(e){t.complete&&(i.value=s(e))}}function p(){t.complete||typeof requestAnimationFrame>`u`?f():d||=requestAnimationFrame(()=>void f())}R(()=>[t.source,t.complete],p,{immediate:!0});let m=tt(zm,null);return R(()=>m?.version.value,()=>i.value=``),lt(()=>d&&cancelAnimationFrame(d)),mt(e=>(t.complete&&(i.value=s(e)),!1)),(t,r)=>(V(),q(`div`,{class:`widget`,inert:!e.complete},[i.value?(V(),q(`div`,dh,[K(`p`,null,j(i.value),1),K(`pre`,null,j(e.source),1)])):n.value?(V(),Y(qe(H(o)),{key:a.value})):(V(),q(`div`,fh))],8,uh))}}),[[`__scopeId`,`data-v-eb02d19e`]]),mh=/^ {0,3}<([A-Z][A-Za-z0-9]*)(?=[\s/>]|$)/,hh=/^ {0,3}<script>/,gh=/^ {0,3}(`{3,}|~{3,})/;function _h(e,t){let n=``;for(let r=t;r<e.length;r++){let t=e[r];if(n)t===n&&(n=``);else if(t===`"`||t===`'`||t==="`")n=t;else if(t===`>`)return r+1}return-1}function vh(e,t,n){let r=`<${n}`,i=`</${n}`,a=0,o=t;for(;o<e.length;){let t=e.indexOf(`<`,o);if(t<0)return-1;if(e.startsWith(i,t)&&/^\s*>/.test(e.slice(t+i.length,t+i.length+8))){let n=e.indexOf(`>`,t);if(n<0)return-1;if(--a===0)return n+1;o=n+1}else if(e.startsWith(r,t)&&/[\s/>]/.test(e[t+r.length]??``)){let n=_h(e,t+r.length);if(n<0)return-1;if(e[n-2]!==`/`)a++;else if(a===0)return n;o=n}else o=t+1}return-1}var yh=`<\/script>`;function bh(e,t={}){let n=[],r=0,i=``,a=0,o=t=>{let i=e.slice(r,t);i.trim()&&n.push({type:`markdown`,text:i})};for(;a<e.length;){let s=e.indexOf(`
|
|
14
|
+
`,a),c=s<0?e.length:s+1,l=e.slice(a,c),u=gh.exec(l)?.[1];if(i)u&&u[0]===i[0]&&u.length>=i.length&&(i=``);else if(u)i=u;else{let i=a+l.indexOf(`<`),s=mh.exec(l)?.[1];if(s&&(!t.known||t.known(s))){let c=vh(e,i,s);if(c>=0||t.streaming){if(o(a),n.push({type:`widget`,name:s,source:e.slice(i,c>=0?c:void 0),complete:c>=0}),c<0)return n;r=a=c;continue}}else if(hh.test(l)){let s=e.indexOf(yh,i);if(s>=0||t.streaming){if(o(a),n.push({type:`script`,source:e.slice(i+8,s>=0?s:void 0),complete:s>=0}),s<0)return n;r=a=s+9;continue}}}a=c}return o(e.length),n}var xh=e=>RegExp(`<${e}(?=[\\s/>])`);function Sh(e,t){let n=lh(t);if(!n.length)return;let r=bh(e,{known:e=>ch(e,t),streaming:!1}).filter(e=>e.type!==`script`&&(e.type!==`markdown`||e.text.trim())).at(-1);if(r?.type===`widget`&&r.complete)return n.some(e=>xh(e).test(r.source))?r.source:void 0}async function Ch(e,t){let n=await fetch(e,{cache:`no-store`,...t,headers:t?.body?{"Content-Type":`application/json`}:void 0}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error||`Виджеты проекта недоступны`);return r}function wh(e){return Ch(`/api/agent/project-widgets?projectId=${encodeURIComponent(e)}`)}function Th(e,t){return Ch(`/api/agent/project-widgets/trust`,{method:`PUT`,body:JSON.stringify({projectId:e,trusted:t})})}function Eh(e,t){return Ch(`/api/agent/project-widgets/data?projectId=${encodeURIComponent(e)}&widget=${encodeURIComponent(t)}`)}var Dh=new Set;function Oh(e,t){let n=2166136261;for(let r of`${e}:${t}`)n=Math.imul(n^r.charCodeAt(0),16777619);return`pw-${(n>>>0).toString(36)}`}function kh(e,t){let n=e.replace(/\/\*[\s\S]*?\*\//g,``).trim(),r=`.${t}`,i=``,a=0;for(;a<n.length;){let e=n.indexOf(`{`,a);if(e<0)break;let o=n.slice(a,e).trim();if(!o){a=e+1;continue}let s=1,c=e+1;for(;c<n.length&&s>0;)n[c]===`{`?s++:n[c]===`}`&&s--,c++;let l=n.slice(e+1,c-1);if(/^@(media|supports|container|layer)\b/i.test(o))i+=`${o}{${kh(l,t)}}`;else if(/^@(keyframes|-webkit-keyframes|font-face|property|counter-style)\b/i.test(o))i+=`${o}{${l}}`;else{let e=o.split(`,`).map(e=>e.trim()).filter(Boolean).map(e=>e.includes(`&`)?e.replaceAll(`&`,r):`${r} ${e}`);e.length&&(i+=`${e.join(`,`)}{${l}}`)}a=c}return i}function Ah(e){let t={string:String,number:Number,boolean:Boolean,array:Array,object:Object};return Object.fromEntries(Object.entries(e.props??{}).map(([e,n])=>{let r=n.type.split(`|`).map(e=>t[e.trim()]).filter(Boolean);return[e,{type:r.length===1?r[0]:r,required:n.required===!0}]}))}function jh(e,t){if(!t||Dh.has(e)||typeof document>`u`)return;Dh.add(e);let n=document.createElement(`style`);n.dataset.projectWidget=e,n.textContent=kh(t,e),document.head.append(n)}function Mh(e,t){let n=Oh(t,e.name);return M({name:`ProjectWidget${e.name}`,props:Ah(e),components:new Proxy({},{get:(e,n)=>sh(t)[String(n)],has:(e,n)=>String(n)in sh(t)}),setup(r,{slots:i}){let a=Rm(),o=We(),s=X(``),c=at({}),l=at({}),u=X(!!e.data),d=X(``),f=at({}),p=X(!e.script),m,h=!1,g=!1,_=!1,v;function y(){if(_||h)return;if(_=!0,!e.script){p.value=!0;return}let t=new Set([`props`,`data`,`dataErrors`,`dataLoading`,`dataError`]),n=new Proxy({},{has:(e,n)=>typeof n==`string`&&(t.has(n)||Object.hasOwn(f,n)),get:(e,t)=>t===`props`?r:t===`data`?c:t===`dataErrors`?l:t===`dataLoading`?u:t===`dataError`?d:typeof t==`string`?f[t]:void 0,set:(e,n,r)=>(typeof n!=`string`||t.has(n)||(f[n]=r),!0)});try{v=ct(!0);let t=v.run(()=>Pm(e.script)(...Object.values(Mm),a,n));t&&Object.assign(f,t)}catch(e){v?.stop(),v=void 0,s.value=e instanceof Error?e.message:String(e)}finally{p.value=!0}}async function b(){if(e.data&&!h&&!(g&&typeof document<`u`&&document.visibilityState===`hidden`)){u.value=!0,d.value=``;try{let n=await Eh(t,e.name);if(h)return;Object.assign(c,n.data);for(let e of Object.keys(l))delete l[e];Object.assign(l,n.errors),Object.keys(n.errors).length&&(d.value=`Не удалось прочитать: ${Object.keys(n.errors).join(`, `)}`)}catch(e){h||(d.value=e instanceof Error?e.message:`Данные проекта недоступны`)}finally{h||(g=!0,u.value=!1,y())}}}jh(n,e.styles),Om().then(()=>{h||(o.value=jm(e.template))}).catch(e=>{h||(s.value=e instanceof Error?e.message:String(e))}),Lt(()=>{e.data?b():y(),e.refresh&&(m=setInterval(b,e.refresh*1e3))}),lt(()=>{h=!0,v?.stop(),m&&clearInterval(m)});let x=new Proxy({data:c,dataErrors:l,dataLoading:u,dataError:d,$slots:i},{get(e,t){if(typeof t==`string`){if(Object.hasOwn(r,t))return r[t];if(Object.hasOwn(f,t))return H(f[t])}return H(Reflect.get(e,t))},has(e,t){return typeof t==`string`&&(Object.hasOwn(r,t)||Object.hasOwn(f,t))||t in e},set(e,t,n){return typeof t==`string`&&Object.hasOwn(r,t)?!0:typeof t==`string`&&Object.hasOwn(f,t)?(f[t]=n,!0):Reflect.set(e,t,n)}}),S=[];return()=>{if(s.value)return Ye(`div`,{class:`project-widget-failure`,role:`alert`},s.value);if(u.value)return Ye(`div`,{class:`project-widget-loading`},`Читаю данные…`);if(!p.value)return Ye(`div`,{class:`project-widget-loading`},`Запускаю скрипт…`);try{return Ye(`div`,{class:`project-widget ${n}`},[o.value?o.value(x,S):null])}catch(e){return s.value=e instanceof Error?e.message:String(e),Ye(`div`,{class:`project-widget-failure`,role:`alert`},s.value)}}}})}var Nh=new Map;function Ph(e,t=!1){if(!e)return Promise.resolve(void 0);if(!t){let t=Nh.get(e);if(t)return t}let n=wh(e).then(t=>{if(!t.trusted||!t.widgets.length)return ah(e),t;let n={};for(let r of t.widgets)n[r.name]={definition:r,component:Mh(r,e)};return ih(e,n),t}).catch(()=>{ah(e)});return Nh.set(e,n),n.catch(()=>Nh.delete(e)),n}function Fh(e){return Nh.delete(e),Ph(e,!0)}var Ih=Symbol(`agent-widget-form-preset`),Lh=Symbol(`agent-widget-form-chrome`);async function Rh(e,t,n){await Om();let r=Sm(e);if(r.scriptOpen)return`Незакрытый <script>`;if(!r.template.trim())return t;let i=[...r.template.matchAll(/<([A-Z][A-Za-z0-9]*)\b/g)].find(([,e])=>!ch(e,n));if(i)return`Неизвестный компонент ${i[1]}`;try{r.script&&Pm(r.script),jm(r.template);for(let[,e]of r.template.matchAll(/<([A-Z][A-Za-z0-9]*)\b/g)){let t=(n?oh(n)[e]:void 0)?.definition;t?.script&&Pm(t.script),t?.template&&jm(t.template)}return}catch(e){return e instanceof Error?e.message:String(e)}}function zh(e,t){return Rh(e,`Пустая форма`,t)}var Bh=/(^|\n)\s{0,3}(#{1,6}\s+\S|[-*+]\s+\S|\d+\.\s+\S)|\*\*[^*\n]+\*\*|`[^`\n]+`|(^|\n)\s*\|?\s*:?-{3,}/;function Vh(e){let{template:t}=Sm(e),n=t.replace(/<!--[\s\S]*?-->/g,``).replace(/<[^>]*>/g,`
|
|
15
|
+
`);return Bh.test(n)?`Внутри виджета остался Markdown: он показывается как сломанный исходный текст`:void 0}async function Hh(e,t){let n=bh(e,{known:e=>ch(e,t),streaming:!1});for(let e of n){if(e.type===`widget`){let n=await Rh(e.source,`Пустой виджет ${e.name}`,t)??Vh(e.source);if(n)return`${e.name}: ${n}`;continue}if(e.type!==`markdown`)continue;let n=``;for(let r of e.text.split(`
|
|
16
|
+
`)){let e=/^ {0,3}(`{3,}|~{3,})/.exec(r)?.[1];if(e){n?e[0]===n[0]&&e.length>=n.length&&(n=``):n=e;continue}let i=!n&&/^ {0,3}<([A-Z][A-Za-z0-9]*)(?=[\s/>]|$)/.exec(r)?.[1];if(i&&ch(i,t))return`Незакрытый или неверно оформленный виджет ${i}`}}}function Uh(e){return(/^```(?:markdown|md|text|vue|html)?\s*\n?([\s\S]*?)\n?```$/i.exec(e.trim())?.[1]??e).trim()||void 0}function Wh(e,t){let n=``;for(let r=t;r<e.length;r++){let t=e[r];if(n)t===n&&(n=``);else if(t===`"`||t===`'`||t==="`")n=t;else if(t===`>`)return r+1}return-1}function Gh(e){let t=/^<\s*([A-Za-z][\w-]*)/.exec(e)?.[1];if(!t)return e;let n=e.length-1,r=e.indexOf(t,1)+t.length,i=e.slice(0,r),a=new Set;for(;r<n;){let t=r;for(;r<n&&/\s/.test(e[r]);)r++;if(r>=n||e[r]===`/`){i+=e.slice(t),r=e.length;break}let o=r;for(;r<n&&!/[\s=/>]/.test(e[r]);)r++;let s=e.slice(o,r),c=r,l=r;for(;l<n&&/\s/.test(e[l]);)l++;if(e[l]===`=`){for(l++;l<n&&/\s/.test(e[l]);)l++;let t=e[l];if(t===`"`||t===`'`||t==="`"){for(l++;l<n&&e[l]!==t;)l++;l<n&&l++}else for(;l<n&&!/[\s>]/.test(e[l]);)l++;c=l}a.has(s)||(a.add(s),i+=e.slice(t,c)),r=c}return i+e.slice(r)}function Kh(e){let t=``,n=0;for(;n<e.length;){let r=e.indexOf(`<`,n);if(r<0)return t+e.slice(n);if(t+=e.slice(n,r),e.startsWith(`<!--`,r)){let i=e.indexOf(`-->`,r);if(i<0)return t+e.slice(r);t+=e.slice(r,i+3),n=i+3;continue}let i=e[r+1]??``;if(!/[A-Za-z]/.test(i)){t+=`<`,n=r+1;continue}let a=Wh(e,r+1);if(a<0)return t+e.slice(r);t+=Gh(e.slice(r,a)),n=a}return t}function qh(e){let t=Sm(e);if(t.scriptOpen)return e;let n=Tm(Kh(t.template));return t.script?`<script>${t.script}<\/script>${n}`:n}function Jh(e,t){let n=([...e.matchAll(/```(?:vue|html)?\s*([\s\S]*?)```/gi)].at(-1)?.[1]??e).trim();if(n&&bh(n,{known:e=>ch(e,t),streaming:!1}).filter(e=>e.type!==`script`&&(e.type!==`markdown`||e.text.trim())).at(-1)?.type===`widget`)return Sh(n,t)}function Yh(e){return wh(e)}async function Xh(e,t){let n=await Th(e,t);return await Fh(e),n}function Zh(e){let t=X(),n=X(``),r=X(``),i=E(`project-widgets:${P()}`,()=>({surface:`projectWidgets`,projectId:e(),trusted:t.value?.trusted===!0,widgets:t.value?.widgets.length??0,busy:n.value})),a=z(()=>t.value?.widgets??[]),o=z(()=>t.value?.trusted===!0),s=z(()=>t.value?.file??``),c=z(()=>t.value?.exists===!0),l=z(()=>t.value?.problem??``),u=z(()=>r.value||l.value);async function d(e){r.value=``;try{return await e()}catch(e){throw r.value=e instanceof Error?e.message:`Ошибка виджетов проекта`,e}}async function f(){let n=e();if(!n)t.value=void 0;else return d(async()=>(t.value=await Yh(n),t.value))}async function p(r){let i=e();n.value=`trust`;try{return await d(async()=>(t.value=await Xh(i,r),t.value))}finally{n.value=``}}return i.scope.registerCommand({id:`ide.project.widgets.list`,palette:!1,title:`Виджеты проекта`,description:`Возвращает виджеты из .projector/widgets.json, путь к файлу, признак доверия и ошибку чтения. Недоверенный файл не попадает ни в промпт, ни в ответы.`,run:async()=>{await f();let n=t.value??{projectId:e(),path:``,file:``,exists:!1,trusted:!1,widgets:[]};return{...n,widgets:n.widgets.map(({template:e,script:t,styles:n,...r})=>r)}}}),i.scope.registerCommand({id:`ide.project.widgets.trust`,palette:!1,title:`Доверять виджетам проекта`,description:`Выдаёт или отзывает доверие к текущему содержимому .projector/widgets.json. Доверие привязано к хешу файла: правка файла отзывает его автоматически.`,arguments:{trusted:`boolean: доверять ли текущему файлу`},enabled:()=>!n.value,run:e=>{let t=b(e).trusted;if(typeof t!=`boolean`)throw Error(`trusted должен быть boolean`);return p(t)}}),{data:t,widgets:a,trusted:o,file:s,exists:c,problem:l,busy:n,error:u,load:f,trust:p,commands:i}}var Qh={class:`head`},$h={class:`file`},eg={key:0,class:`trusted`},tg={key:1,class:`untrusted`},ng={key:2,class:`untrusted`},rg={key:2,class:`empty`},ig={class:`title`},ag={key:0,class:`tag`},og={key:1,class:`tag`},sg={key:2,class:`tag`},cg={class:`summary`},lg={key:0},ug={key:1},dg={key:2},fg={key:3},pg=G(M({__name:`ProjectWidgets`,props:{project:{}},setup(e){let n=e,{widgets:a,trusted:o,file:s,exists:c,problem:u,busy:d,error:f,load:p,trust:m,commands:h}=Zh(()=>n.project.id);R(()=>n.project.id,()=>void p().catch(()=>void 0),{immediate:!0});async function g(e){await m(e).catch(()=>void 0)}return(e,n)=>(V(),Y(ml,{as:`section`,gap:4,class:`project-widgets`,onFocusin:n[2]||=e=>H(h).scope.activate(),onPointerdown:n[3]||=e=>H(h).scope.activate()},{default:F(()=>[K(`div`,Qh,[I(r,{wrap:``,gap:2},{default:F(()=>[K(`span`,$h,j(H(s)||`.projector/widgets.json`),1),H(o)?(V(),q(`span`,eg,`доверено`)):H(c)?(V(),q(`span`,tg,`не доверено`)):(V(),q(`span`,ng,`файла ещё нет`))]),_:1}),I(r,{gap:2},{default:F(()=>[H(c)&&!H(o)?(V(),Y(Q,{key:0,appearance:`solid`,size:`sm`,busy:H(d)===`trust`,disabled:!!H(u),onClick:n[0]||=e=>g(!0)},{default:F(()=>[...n[4]||=[N(`Доверять`,-1)]]),_:1},8,[`busy`,`disabled`])):H(o)?(V(),Y(Q,{key:1,appearance:`outline`,size:`sm`,busy:H(d)===`trust`,onClick:n[1]||=e=>g(!1)},{default:F(()=>[...n[5]||=[N(`Отозвать доверие`,-1)]]),_:1},8,[`busy`])):B(``,!0)]),_:1})]),H(u)?(V(),Y(t,{key:0,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(H(u)),1)]),_:1})):H(c)&&!H(o)?(V(),Y(t,{key:1,tone:`muted`,variant:`note`,size:`xs`,flush:``},{default:F(()=>[...n[6]||=[N(` Виджеты из этого файла не попадают в промпт агента и не рисуются в ответах. Проверьте файл и выдайте доверие. `,-1)]]),_:1})):B(``,!0),!H(a).length&&!H(u)?(V(),q(`p`,rg,[...n[7]||=[N(` В файле пока нет виджетов. Опишите их в `,-1),K(`code`,null,`.projector/widgets.json`,-1),N(` — после доверия они появятся у агента в разделе «Виджеты проекта». `,-1)]])):B(``,!0),(V(!0),q(W,null,J(H(a),e=>(V(),Y(l,{key:e.name,as:`article`,appearance:`frame`},{default:F(()=>[K(`div`,ig,[K(`code`,null,j(e.name),1),e.special?(V(),q(`span`,ag,`по требованию`)):B(``,!0),e.answer?(V(),q(`span`,og,`форма ответа`)):B(``,!0),e.script?(V(),q(`span`,sg,`свой скрипт`)):B(``,!0)]),K(`p`,cg,j(e.summary),1),I(r,{wrap:``,gap:2,class:`meta`},{default:F(()=>[e.data?(V(),q(`span`,lg,` данные: `+j(Object.keys(e.data).join(`, `)),1)):B(``,!0),e.refresh?(V(),q(`span`,ug,`обновление: `+j(e.refresh)+` с`,1)):B(``,!0),e.styles?(V(),q(`span`,dg,`свои стили`)):B(``,!0),e.script?(V(),q(`span`,fg,`скрипт: `+j(e.script.length)+` символов`,1)):B(``,!0),K(`span`,null,j(Object.keys(e.props??{}).length)+` свойств`,1)]),_:2},1024)]),_:2},1024))),128)),I(i,null,{default:F(()=>[...n[8]||=[N(` Файл действует только после доверия. Шаблон собирается из встроенных виджетов и HTML, а отдельное поле `,-1),K(`code`,null,`script`,-1),N(` выполняется в интерфейсе после загрузки данных. Доверяйте только тому коду, который готовы запустить. Данные читаются из JSON-файлов проекта. `,-1)]]),_:1}),H(f)&&H(f)!==H(u)?(V(),Y(t,{key:3,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(H(f)),1)]),_:1})):B(``,!0)]),_:1}))}}),[[`__scopeId`,`data-v-ce8de58e`]]);function mg(e,t){let n=Oc(),r=X(kc(e())),i=X(JSON.stringify(r.value)),a=z(()=>JSON.stringify(r.value)!==i.value),o=X(!1),s=X(!1),c=X(``),l=X(``),u=X(null),d=z(()=>Ac(r.value.commands,u.value??[])),f=X([]),p=z(()=>Mc(r.value));R(a,e=>{e&&(l.value=``),t.onDirty(e)},{immediate:!0}),R(e,e=>{!a.value&&!o.value&&JSON.stringify(kc(e))!==i.value&&m(e)});function m(t=e()){r.value=kc(t),i.value=JSON.stringify(r.value),c.value=``,l.value=``,u.value=null,f.value=[]}function h(){return!o.value&&(!a.value||window.confirm(`Закрыть настройки без сохранения изменений?`))}lo(h),uo((e,t)=>e.path===t.path||h());function g(e){a.value&&(e.preventDefault(),e.returnValue=``)}window.addEventListener(`beforeunload`,g),lt(()=>window.removeEventListener(`beforeunload`,g));function _(){r.value.commands.push({id:gr(),name:``,cmd:``})}function v(e){Nc(r.value.commands,e)}function y(e){let t=new Map(r.value.commands.map(e=>[e.id,e])),n=e.map(e=>t.get(e)).filter(e=>!!e);n.length===r.value.commands.length&&(r.value.commands=n)}function b(e){r.value.defaultCommandId=e}function x(e){let t=r.value.commands.find(t=>t.id===e);return t?jc(t,r.value):``}function S(e){r.value.commands.length<=1||(r.value.commands=r.value.commands.filter(t=>t.id!==e),r.value.defaultCommandId===e&&(r.value.defaultCommandId=r.value.commands[0].id))}async function C(){s.value=!0,c.value=``;try{u.value=(await wc(e().path)).commands,f.value=d.value.map(e=>e.id)}catch(e){c.value=e instanceof Error?e.message:`Не удалось прочитать команды`}finally{s.value=!1}}function w(){r.value.commands.push(...d.value.filter(e=>f.value.includes(e.id))),u.value=null,f.value=[]}async function T(){if(!o.value&&a.value&&(c.value=p.value,!c.value)){o.value=!0;try{m(await n.save(e().id,{...r.value,name:r.value.name.trim(),url:r.value.url.trim(),icon:r.value.icon.trim(),commands:r.value.commands.map(e=>({...e,name:e.name.trim(),cmd:e.cmd.trim()}))})),l.value=`Настройки сохранены`}catch(e){c.value=e instanceof Error?e.message:`Не удалось сохранить настройки`}finally{o.value=!1}}}async function ee(){if(!o.value&&window.confirm(`Убрать «${e().name}» из Projector? Терминалы и запущенные процессы проекта будут завершены. Файлы останутся на диске.`)){o.value=!0,c.value=``;try{await n.remove(e().id),i.value=JSON.stringify(r.value),await t.afterRemove()}catch(e){c.value=e instanceof Error?e.message:`Не удалось убрать проект`}finally{o.value=!1}}}let E={project:e,draft:r,dirty:a,busy:o,discovering:s,error:c,notice:l,discovered:u,candidates:d,selected:f,validation:p,setCommandOrder:y,duplicateCommand:v,setDefaultCommand:b,problemOf:x,reset:m,canLeave:h,addCommand:_,removeCommand:S,discover:C,importCommands:w,save:T,remove:ee};return ot(hg,E),E}var hg=Symbol(`project-settings-form`);function gg(){let e=tt(hg);if(!e)throw Error(`Раздел настроек проекта вне формы`);return e}var _g={class:`project-root`},vg=G(M({__name:`ProjectGeneralSection`,setup(e){let{draft:t,project:n,busy:r}=gg();return(e,o)=>(V(),Y(ml,{as:`fieldset`,disabled:H(r)},{default:F(()=>[I(g,{layout:`plain`,label:`Название`,required:``},{default:F(({control:e})=>[I(a,rn(e,{modelValue:H(t).name,"onUpdate:modelValue":o[0]||=e=>H(t).name=e,autocomplete:`off`}),null,16,[`modelValue`])]),_:1}),I(g,{layout:`plain`,as:`div`,label:`Папка проекта`},{default:F(()=>[K(`code`,_g,j(H(n)().path),1)]),_:1}),I(g,{layout:`plain`,label:`Путь к иконке`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:H(t).icon,"onUpdate:modelValue":o[1]||=e=>H(t).icon=e,placeholder:`Автоматически`,spellcheck:`false`}),null,16,[`modelValue`])]),_:1}),I(i,null,{default:F(()=>[...o[2]||=[N(`Файл внутри проекта, например public/icon.svg. Пустое поле — автоматический выбор.`,-1)]]),_:1})]),_:1},8,[`disabled`]))}}),[[`__scopeId`,`data-v-3562fc9b`]]),yg=G(M({__name:`UiDisclosureSummary`,props:{variant:{default:`inline`},highlight:{type:Boolean,default:!0}},setup(e){return(t,n)=>(V(),q(`summary`,{class:O([`ui-disclosure-summary`,[`variant-${e.variant}`,{highlight:e.highlight}]])},[L(t.$slots,`default`,{},void 0,!0)],2))}}),[[`__scopeId`,`data-v-dd2cb86f`]]),bg={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function xg(e,t){return V(),q(`svg`,bg,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 12h14m-7-7v14`},null,-1)]])}var Sg=U({name:`lucide-plus`,render:xg}),Cg={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function wg(e,t){return V(),q(`svg`,Cg,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`}),K(`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`})],-1)]])}var Tg=U({name:`lucide-copy`,render:wg}),Eg={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Dg(e,t){return V(),q(`svg`,Eg,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.12 2.12 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.12 2.12 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.12 2.12 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.12 2.12 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.12 2.12 0 0 0 1.597-1.16z`},null,-1)]])}var Og=U({name:`lucide-star`,render:Dg}),kg={class:`defaults`},Ag={key:0,class:`script-picker`},jg={class:`summary`,"aria-live":`polite`},Mg=[`open`],Ng={class:`options`},Pg=G(M({__name:`ProjectScenariosSection`,props:{scenarioId:{}},setup(e){let n=e,o=gg(),{draft:s,busy:c,discovering:l,discovered:u,candidates:d,selected:f,dirty:p}=o,m=z(()=>s.value.commands.find(e=>e.id===n.scenarioId)),h=z(()=>s.value.commands.findIndex(e=>e.id===m.value?.id)),_=e=>e.id===s.value.defaultCommandId,v=e=>!!(e.cwd||e.url||e.mode),y=e=>e.cwd?`в папке ${e.cwd}`:`в корне проекта`,b=e=>(e.mode||s.value.mode)===`window`?`в окне приложения`:`в терминале`,x=e=>e.url||s.value.url||`не задан`;function S(e){Jf.value=e?Yf(e):`scenarios`}function C(){o.addCommand(),S(s.value.commands.at(-1)?.id)}function w(e){o.duplicateCommand(e.id),S(s.value.commands[h.value+1]?.id)}function T(e){s.value.commands.length<=1||(o.removeCommand(e.id),S(void 0))}return(e,n)=>(V(),Y(ml,{as:`fieldset`,disabled:H(c),class:`scenarios`},{default:F(()=>[m.value?(V(),q(`section`,{key:m.value.id,class:`detail`},[I(r,{class:`head`,align:`end`,justify:`normal`},{default:F(()=>[I(g,{layout:`plain`,label:`Название`,required:``,class:`grow`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:m.value.name,"onUpdate:modelValue":n[5]||=e=>m.value.name=e,class:`name-input`,"aria-label":`Название сценария ${h.value+1}`,placeholder:`dev`}),null,16,[`modelValue`,`aria-label`])]),_:1}),I(Q,{size:`sm`,appearance:_(m.value)?`solid`:`outline`,"aria-pressed":_(m.value),title:_(m.value)?`Основной сценарий`:`Сделать основным`,onClick:n[6]||=e=>H(o).setDefaultCommand(m.value.id)},{default:F(()=>[I(H(Og),{"aria-hidden":`true`}),N(j(_(m.value)?`Основной`:`Сделать основным`),1)]),_:1},8,[`appearance`,`aria-pressed`,`title`]),I(Q,{shape:`icon`,size:`sm`,"aria-label":`Дублировать сценарий`,title:`Дублировать`,onClick:n[7]||=e=>w(m.value)},{default:F(()=>[I(H(Tg),{"aria-hidden":`true`})]),_:1}),I(Q,{shape:`icon`,size:`sm`,disabled:H(s).commands.length<=1,"aria-label":`Удалить сценарий`,title:H(s).commands.length<=1?`Нужен хотя бы один сценарий`:`Удалить сценарий`,onClick:n[8]||=e=>T(m.value)},{default:F(()=>[I(H(zf),{"aria-hidden":`true`})]),_:1},8,[`disabled`,`title`])]),_:1}),I(g,{layout:`plain`,label:`Команда запуска`,required:``},{default:F(({control:e})=>[I(a,rn(e,{modelValue:m.value.cmd,"onUpdate:modelValue":n[9]||=e=>m.value.cmd=e,"aria-label":`Команда запуска ${h.value+1}`,mono:``,placeholder:`pnpm dev`,spellcheck:`false`}),null,16,[`modelValue`,`aria-label`])]),_:1}),K(`p`,jg,[N(` Запустится `+j(y(m.value))+`, `+j(b(m.value))+`, адрес `,1),K(`code`,null,j(x(m.value)),1)]),K(`details`,{class:`more`,open:v(m.value)},[I(yg,{variant:`fit`},{default:F(()=>[I(H(of),{class:`chevron`,"aria-hidden":`true`}),n[19]||=N(`Дополнительно`,-1)]),_:1}),K(`div`,Ng,[I(g,{layout:`plain`,label:`Папка`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:m.value.cwd,"onUpdate:modelValue":n[10]||=e=>m.value.cwd=e,"aria-label":`Папка сценария ${h.value+1}`,mono:``,placeholder:`корень проекта`,spellcheck:`false`}),null,16,[`modelValue`,`aria-label`])]),_:1}),I(g,{layout:`plain`,label:`Адрес`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:m.value.url,"onUpdate:modelValue":n[11]||=e=>m.value.url=e,"aria-label":`Адрес сценария ${h.value+1}`,mono:``,placeholder:H(s).url?`из проекта`:`не задан`,spellcheck:`false`}),null,16,[`modelValue`,`aria-label`,`placeholder`])]),_:1}),I(g,{layout:`plain`,label:`Запуск`},{default:F(({control:e})=>[I(a,rn(e,{"model-value":m.value.mode??``,as:`select`,"aria-label":`Режим сценария ${h.value+1}`,"onUpdate:modelValue":n[12]||=e=>m.value.mode=e||void 0}),{default:F(()=>[...n[20]||=[K(`option`,{value:``},`как у проекта`,-1),K(`option`,{value:`server`},`в терминале`,-1),K(`option`,{value:`window`},`в окне приложения`,-1)]]),_:1},16,[`model-value`,`aria-label`])]),_:1})])],8,Mg),H(o).problemOf(m.value.id)?(V(),Y(t,{key:0,tone:`danger`,size:`xs`,role:`alert`},{default:F(()=>[N(j(H(o).problemOf(m.value.id)),1)]),_:1})):B(``,!0),H(p)?(V(),Y(i,{key:1},{default:F(()=>[...n[21]||=[N(`Сохраните изменения, чтобы они применились к запуску.`,-1)]]),_:1})):B(``,!0)])):(V(),q(W,{key:0},[I(r,{gap:3,justify:`between`,wrap:``},{default:F(()=>[I(i,null,{default:F(()=>[...n[13]||=[N(` Порядок задаётся перетаскиванием пунктов в навигации слева: он виден в меню запуска. `,-1)]]),_:1}),I(r,{gap:2},{default:F(()=>[I(Q,{size:`sm`,onClick:C},{default:F(()=>[I(H(Sg),{"aria-hidden":`true`}),n[14]||=N(`Добавить`,-1)]),_:1}),I(Q,{disabled:H(l),onClick:H(o).discover},{default:F(()=>[N(j(H(l)?`читаю…`:`из package.json`),1)]),_:1},8,[`disabled`,`onClick`])]),_:1})]),_:1}),K(`div`,kg,[I(g,{layout:`plain`,label:`Адрес по умолчанию`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:H(s).url,"onUpdate:modelValue":n[0]||=e=>H(s).url=e,type:`url`,placeholder:`для сценариев без своего адреса, например http://localhost:5173`,spellcheck:`false`}),null,16,[`modelValue`])]),_:1}),I(g,{layout:`plain`,label:`Запуск по умолчанию`},{default:F(({control:e})=>[I(a,rn(e,{as:`select`,"model-value":H(s).mode,"onUpdate:modelValue":n[1]||=e=>H(s).mode=e}),{default:F(()=>[...n[15]||=[K(`option`,{value:`server`},`в терминале`,-1),K(`option`,{value:`window`},`в окне приложения`,-1)]]),_:1},16,[`model-value`])]),_:1})]),H(u)===null?B(``,!0):(V(),q(`div`,Ag,[H(d).length?(V(),q(W,{key:0},[(V(!0),q(W,null,J(H(d),e=>(V(),Y(r,{as:`label`,key:e.id,class:`script-option`,align:`baseline`,justify:`normal`},{default:F(()=>[I(a,{modelValue:H(f),"onUpdate:modelValue":n[2]||=e=>gt(f)?f.value=e:null,type:`checkbox`,value:e.id},null,8,[`modelValue`,`value`]),K(`span`,null,j(e.name),1),K(`code`,null,j(e.cmd),1)]),_:2},1024))),128)),I(r,{class:`picker-actions`,gap:3,justify:`between`,wrap:``},{default:F(()=>[I(Q,{disabled:!H(f).length,onClick:H(o).importCommands},{default:F(()=>[...n[16]||=[N(`Добавить выбранные`,-1)]]),_:1},8,[`disabled`,`onClick`]),I(Q,{onClick:n[3]||=e=>u.value=null},{default:F(()=>[...n[17]||=[N(`Отмена`,-1)]]),_:1})]),_:1})],64)):(V(),q(W,{key:1},[I(i,null,{default:F(()=>[N(j(H(u).length?`Все найденные команды уже добавлены.`:`В этой папке нет скриптов package.json. Добавьте свою команду.`),1)]),_:1}),I(Q,{onClick:n[4]||=e=>u.value=null},{default:F(()=>[...n[18]||=[N(`Закрыть`,-1)]]),_:1})],64))]))],64))]),_:1},8,[`disabled`]))}}),[[`__scopeId`,`data-v-ac84da10`]]),Fg=M({__name:`ProjectRemoveSection`,setup(e){let t=gg();return(e,n)=>(V(),Y(r,{class:`remove`,justify:`between`,wrap:``,gap:3},{default:F(()=>[I(i,null,{default:F(()=>[...n[0]||=[N(`Файлы останутся на диске. Терминалы и процессы проекта будут завершены.`,-1)]]),_:1}),I(Q,{tone:`danger`,disabled:H(t).busy.value,onClick:H(t).remove},{default:F(()=>[...n[1]||=[N(`Убрать проект`,-1)]]),_:1},8,[`disabled`,`onClick`])]),_:1}))}}),Ig={class:`save-bar`},Lg={class:`save-status`,role:`status`},Rg={key:0,class:`error`,role:`alert`},zg={key:1,class:`error`,role:`status`},Bg=G(M({__name:`ProjectSettings`,props:{project:{},afterRemove:{type:Function}},emits:[`dirty`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=mg(()=>r.project,{afterRemove:r.afterRemove,onDirty:e=>i(`dirty`,e)}),{dirty:o,busy:s,error:c,notice:l,validation:u}=a;t({canLeave:a.canLeave,save:a.save});let d=z(()=>[{id:`general`,title:`Основное`,group:`Проект`,description:`Название, папка и иконка проекта.`,keywords:`имя название иконка icon папка путь`,component:vg},{id:`scenarios`,title:`Сценарии`,group:`Запуск`,description:`Команды запуска проекта: dev, build, test и свои. Можно импортировать из package.json.`,keywords:`команды запуск scripts package.json npm pnpm dev build test сценарии`,component:Pg,props:{scenarioId:Xf(Jf.value)},reorder:e=>a.setCommandOrder(e.map(Xf).filter(e=>!!e)),items:a.draft.value.commands.map(e=>({id:Yf(e.id),title:e.name.trim()||`без названия`,hint:e.id===a.draft.value.defaultCommandId?`основной`:void 0,problem:!!a.problemOf(e.id)}))},{id:`roles`,title:`Роли проекта`,group:`Агент`,description:`Chat-роли из .projector/roles.json: агент, модель и настройки. Файл действует только после доверия.`,keywords:`роли agent roles проект чат пресет preset модель доверие trust`,component:ym,props:{project:r.project}},{id:`widgets`,title:`Виджеты проекта`,group:`Агент`,description:`Свои компоненты из .projector/widgets.json: шаблон, данные и формы. Файл действует только после доверия.`,keywords:`виджеты widgets компоненты agent проект шаблон данные доверие trust`,component:pg,props:{project:r.project}},{id:`remove`,title:`Убрать проект`,group:`Управление`,description:`Убрать проект из Projector; файлы на диске не удаляются.`,keywords:`удалить убрать delete remove`,component:Fg}]);function f(e){(e.ctrlKey||e.metaKey)&&ee(e)===`s`&&(e.preventDefault(),e.stopPropagation(),a.save())}let p=e=>{let t=a.draft.value,n=t.commands.map(e=>`${e.id===t.defaultCommandId?`• `:` `}${e.name||`(без имени)`} — ${e.cmd||`(без команды)`}`);return{note:`Настройки проекта · ${r.project.name}`,text:vi(`Проект: ${t.name||`(без имени)`}`,`Путь: ${t.path}`,`Раздел: ${e.sectionTitle||e.section||`—`}`,t.url?`Адрес: ${t.url} · режим ${t.mode}`:`Режим: ${t.mode}`,t.icon?`Иконка: ${t.icon}`:`Иконка: не задана`,`Команды:\n${n.join(`
|
|
17
|
+
`)}`,`Изменения: ${a.dirty.value?`есть несохранённые`:`нет`}`,a.error.value?`Ошибка: ${a.error.value}`:``,a.dirty.value&&a.validation.value?`Проверка: ${a.validation.value}`:``,e.query?`Поиск: «${e.query}»`:``)}};return(e,t)=>(V(),Y(Wr,{as:`form`,sizing:`flex`,class:`project-settings`,"aria-label":`Настройки проекта`,onSubmit:Z(H(a).save,[`prevent`]),onKeydownCapture:f},{default:F(()=>[I(H(mp),{embedded:``,title:`Настройки проекта`,scope:`settings:project`,sections:d.value,selected:H(Jf),read:p,onSelect:t[1]||=e=>Jf.value=e},{footer:F(()=>[K(`div`,Ig,[K(`span`,Lg,j(H(l)||(H(o)?`Есть несохранённые изменения`:`Нет изменений`)),1),I(Q,{disabled:H(s)||!H(o),onClick:t[0]||=e=>H(a).reset()},{default:F(()=>[...t[2]||=[N(`Сбросить`,-1)]]),_:1},8,[`disabled`]),I(Q,{appearance:`solid`,type:`submit`,disabled:H(s)||!H(o)},{default:F(()=>[N(j(H(s)?`сохраняю…`:`Сохранить`),1)]),_:1},8,[`disabled`])]),H(c)?(V(),q(`p`,Rg,j(H(c)),1)):H(o)&&H(u)?(V(),q(`p`,zg,j(H(u)),1)):B(``,!0)]),_:1},8,[`sections`,`selected`])]),_:1},8,[`onSubmit`]))}}),[[`__scopeId`,`data-v-b2f8816e`]]),Vg=(e,t)=>{if(typeof e!=`string`)throw Error(`${t} должен быть строкой`);return e.trim()},Hg=e=>{if(e===void 0||e===``)return``;if(e!==`server`&&e!==`window`)throw Error(`mode должен быть server или window`);return e};function Ug(e,t){t.cwd!==void 0&&(e.cwd=Vg(t.cwd,`cwd`)),t.url!==void 0&&(e.url=Vg(t.url,`url`)),t.mode!==void 0&&(e.mode=Hg(t.mode)||void 0)}var Wg={cwd:`string (необязательно): папка внутри проекта, например apps/web; пустая строка — корень проекта`,url:`string (необязательно): адрес приложения сценария http(s)://…; пустая строка — адрес проекта`,mode:`string (необязательно): server — в терминале, window — в окне приложения; пустая строка — как у проекта`};function Gg(e,t){let n=Oc(),r=!1,i=()=>{let t=e();if(!t)throw Error(`Проект не открыт`);return t},a=E(`project:settings`,()=>{let n=e();return{surface:`project`,projectId:n?.id??null,name:n?.name??null,icon:n?.icon??null,url:n?.url??null,mode:n?.mode??null,defaultCommandId:n?.defaultCommandId??null,dirty:t()}});function o(e,t){let n=t.id===void 0?void 0:Vg(t.id,`id`),r=t.name===void 0?void 0:Vg(t.name,`name`);if(!n&&!r)throw Error(`Укажите id или name команды`);let i=e.commands.find(e=>n?e.id===n:e.name===r);if(!i)throw Error(`Команда запуска не найдена`);return i}async function s(e){let a=i();if(t())throw Error(`В открытых настройках есть несохранённые изменения; сохраните или сбросьте их`);if(r)throw Error(`Настройки уже сохраняются`);let o=kc(a);e(o);let s=Mc(o);if(s)throw Error(s);r=!0;try{return c(await n.save(a.id,o))}finally{r=!1}}let c=e=>({name:e.name,path:e.path,icon:e.icon,url:e.url,mode:e.mode,defaultCommandId:e.defaultCommandId,commands:e.commands}),l=(n,i,o,s,c,l=!0)=>a.scope.registerCommand({id:n,title:i,description:o,arguments:s,enabled:()=>!!e()&&(!l||!t()&&!r),run:e=>c(b(e))});l(`ide.project.settings.get`,`Показать настройки проекта`,`Возвращает название, иконку, адрес, режим запуска, команду по умолчанию и список команд запуска (таски) с их id.`,{},()=>c(i()),!1),l(`ide.project.settings.update`,`Изменить настройки проекта`,`Меняет только переданные поля и сохраняет их на диск. Изменения запуска применяются при следующем запуске.`,{name:`string (необязательно): название проекта`,icon:`string (необязательно): путь к иконке внутри проекта, например public/icon.svg; пустая строка — автоматический выбор`,url:`string (необязательно): адрес приложения http(s)://…; пустая строка — без адреса`,mode:`string (необязательно): server — команда работает в терминале, window — открыть окно приложения после запуска (нужен url)`,defaultCommandId:`string (необязательно): id команды запуска по умолчанию`},e=>s(t=>{if(e.name!==void 0&&(t.name=Vg(e.name,`name`)),e.icon!==void 0&&(t.icon=Vg(e.icon,`icon`)),e.url!==void 0&&(t.url=Vg(e.url,`url`)),e.mode!==void 0){if(e.mode!==`server`&&e.mode!==`window`)throw Error(`mode должен быть server или window`);t.mode=e.mode}e.defaultCommandId!==void 0&&(t.defaultCommandId=Vg(e.defaultCommandId,`defaultCommandId`))})),l(`ide.project.command.add`,`Добавить сценарий запуска`,`Добавляет сценарий запуска (команду), выполняемый в терминале из папки проекта или своей папки внутри него.`,{name:`string: название сценария, например dev`,cmd:`string: команда запуска, например pnpm dev`,makeDefault:`boolean (необязательно): сделать основным`,...Wg},e=>s(t=>{let n={id:gr(),name:Vg(e.name,`name`),cmd:Vg(e.cmd,`cmd`)};if(Ug(n,e),t.commands.some(e=>e.name===n.name))throw Error(`Сценарий «${n.name}» уже существует`);t.commands.push(n),e.makeDefault===!0&&(t.defaultCommandId=n.id)})),l(`ide.project.command.update`,`Изменить сценарий запуска`,`Переименовывает сценарий или меняет его команду, папку, адрес и режим. Сценарий ищется по id или по текущему названию.`,{id:`string (необязательно): id сценария`,name:`string (необязательно): текущее название, если id не указан`,newName:`string (необязательно): новое название`,cmd:`string (необязательно): новая команда запуска`,...Wg},e=>s(t=>{let n=o({...i(),commands:t.commands},e);e.newName!==void 0&&(n.name=Vg(e.newName,`newName`)),e.cmd!==void 0&&(n.cmd=Vg(e.cmd,`cmd`)),Ug(n,e)})),l(`ide.project.command.remove`,`Удалить сценарий запуска`,`Удаляет команду запуска. Последнюю команду удалить нельзя; если удалена команда по умолчанию, выбирается первая оставшаяся.`,{id:`string (необязательно): id команды`,name:`string (необязательно): название, если id не указан`},e=>s(t=>{let n=o({...i(),commands:t.commands},e);if(t.commands.length<=1)throw Error(`Нужна хотя бы одна команда`);t.commands=t.commands.filter(e=>e.id!==n.id),t.defaultCommandId===n.id&&(t.defaultCommandId=t.commands[0].id)})),l(`ide.project.command.setDefault`,`Сделать сценарий основным`,`Назначает команду, которая запускается из палитры и списка проектов.`,{id:`string (необязательно): id команды`,name:`string (необязательно): название, если id не указан`},e=>s(t=>{t.defaultCommandId=o({...i(),commands:t.commands},e).id})),l(`ide.project.command.move`,`Переставить сценарий запуска`,`Сдвигает сценарий на одну позицию вверх или вниз; порядок виден в меню запуска.`,{id:`string (необязательно): id сценария`,name:`string (необязательно): название, если id не указан`,direction:`string: up или down`},e=>s(t=>{if(e.direction!==`up`&&e.direction!==`down`)throw Error(`direction должен быть up или down`);let n=o({...i(),commands:t.commands},e),r=t.commands.indexOf(n),a=r+(e.direction===`up`?-1:1);if(a<0||a>=t.commands.length)throw Error(`Сценарий уже у края списка`);[t.commands[r],t.commands[a]]=[t.commands[a],t.commands[r]]})),l(`ide.project.command.duplicate`,`Дублировать сценарий запуска`,`Копирует сценарий рядом с исходным под новым названием «… копия»; копия не становится основной.`,{id:`string (необязательно): id сценария`,name:`string (необязательно): название, если id не указан`},e=>s(t=>{Nc(t.commands,o({...i(),commands:t.commands},e).id)})),l(`ide.project.command.import`,`Импортировать скрипты package.json`,`Добавляет недостающие скрипты из package.json проекта как команды запуска; существующие не меняются.`,{},async()=>{let e=i(),t=Ac(e.commands,(await wc(e.path)).commands);return t.length?(await s(e=>e.commands.push(...t)),{added:t.map(({name:e,cmd:t})=>({name:e,cmd:t}))}):{added:[]}})}var Kg=[`aria-expanded`],qg=[`src`],Jg={class:`u-truncate`},Yg={key:0,class:`sheet-grabber`,"aria-hidden":`true`},Xg={class:`sheet-heading`},Zg={class:`projects`,"aria-label":`Проекты`},Qg=[`onClick`],$g=[`src`],e_={class:`u-truncate`},t_={class:`u-truncate`},n_=G(M({__name:`MobileProjectPicker`,props:{project:{}},setup(e){let t=e,n=ua(),{api:r}=Iu(),{projects:i}=Oc(),a=X(!1),o=pu(),s=X();Dl({element:s,enabled:o,close:()=>a.value=!1});let c=z(()=>[t.project,...i.value.filter(e=>e.id!==t.project.id)]),l=E(`mobile-project-picker`,()=>({surface:`workbench`}));l.scope.registerCommand({id:`ide.project.picker.toggle`,title:`Открыть или закрыть выбор проекта`,description:`Показывает мобильный выбор проекта, путь к папке и навигацию.`,run:()=>{a.value=!a.value}}),l.scope.registerCommand({id:`ide.project.picker.navigate`,title:`Открыть проект или страницу`,description:`Открывает папку проекта либо поиск, список проектов или настройки из мобильной шапки.`,arguments:{path:`Абсолютный путь к папке проекта или gh:/owner/repository`,page:`search или settings`},run:async e=>{let{path:i,page:o}=b(e);if(o===`settings`&&i===void 0){await r.executeCommand(`ide.workbench.settings.open`,void 0,{scope:`editor:${t.project.id}`}),a.value=!1;return}let s=typeof i==`string`&&(rc(i)||$s(i).kind===`github`)?Rc(i):typeof o==`string`?{search:`/`,settings:`/settings`}[o]:void 0;if(!s)throw Error(`Укажите путь проекта или страницу`);await n.push(s),a.value=!1}});let u=e=>l.scope.executeCommand(`ide.project.picker.navigate`,{path:e});return(t,n)=>(V(),q(`div`,{class:`picker`,onKeydown:n[6]||=yn(Z(e=>a.value&&H(l).run(`ide.project.picker.toggle`),[`stop`]),[`esc`])},[K(`button`,{class:`trigger`,"aria-label":`Выбрать проект`,"aria-expanded":a.value,onClick:n[0]||=e=>H(l).run(`ide.project.picker.toggle`)},[K(`img`,{src:H(xc)(e.project),alt:``,width:`22`,height:`22`},null,8,qg),K(`span`,Jg,j(e.project.name),1),I(H(fl),{"aria-hidden":`true`})],8,Kg),a.value?(V(),q(`button`,{key:0,class:`backdrop`,"aria-label":`Закрыть выбор проекта`,onClick:n[1]||=e=>H(l).run(`ide.project.picker.toggle`)})):B(``,!0),a.value?(V(),q(`div`,{key:1,ref_key:`sheetElement`,ref:s,class:`sheet mobile-sheet`,onKeydown:n[5]||=yn(Z(e=>H(l).run(`ide.project.picker.toggle`),[`stop`]),[`esc`])},[H(o)?(V(),q(`span`,Yg)):B(``,!0),K(`div`,Xg,[n[7]||=K(`span`,null,`Выбор проекта`,-1),K(`button`,{"aria-label":`Закрыть выбор проекта`,onClick:n[2]||=e=>H(l).run(`ide.project.picker.toggle`)},[I(H(oi))])]),I(Nf,{path:e.project.path,navigate:u},null,8,[`path`]),K(`div`,Zg,[(V(!0),q(W,null,J(c.value,t=>(V(),q(`button`,{key:t.id,class:O({selected:t.id===e.project.id}),onClick:e=>H(l).run(`ide.project.picker.navigate`,{path:t.path})},[K(`img`,{src:H(xc)(t),alt:``,width:`22`,height:`22`},null,8,$g),K(`span`,null,[K(`strong`,e_,j(t.name),1),K(`small`,t_,j(t.path),1)])],10,Qg))),128))]),K(`nav`,null,[K(`button`,{onClick:n[3]||=e=>H(l).run(`ide.project.picker.navigate`,{page:`search`})},` Поиск `),K(`button`,{onClick:n[4]||=e=>H(l).run(`ide.project.picker.navigate`,{page:`settings`})},` Настройки `)])],544)):B(``,!0)],32))}}),[[`__scopeId`,`data-v-ed9558fc`]]),r_={class:`lead`},i_=G(M({__name:`ProjectMissing`,props:{project:{}},emits:[`restored`,`removed`],setup(e,{emit:n}){let o=e,s=n,c=Oc(),l=X(o.project.path),u=X(!1),d=X(!1),f=X(``);async function p(e){if(d.value)throw Error(`Операция уже выполняется`);d.value=!0,f.value=``;try{return await e()}catch(e){throw f.value=e instanceof Error?e.message:`Не удалось выполнить действие`,e}finally{d.value=!1}}async function m(){let e=await p(()=>c.restoreDirectory(o.project.id,{mode:`create`}));e&&s(`restored`,e)}async function h(e=l.value,t=u.value){let n=await p(()=>c.restoreDirectory(o.project.id,{mode:`relocate`,path:e,create:t}));n&&s(`restored`,n)}async function v(){!d.value&&window.confirm(`Убрать «${o.project.name}» из Projector? Файлы на диске не затрагиваются.`)&&(await p(()=>c.remove(o.project.id)),s(`removed`))}let y=E(`project:missing`,()=>({surface:`project-missing`,projectId:o.project.id,path:o.project.path}));return y.scope.registerCommand({id:`ide.project.directory.create`,title:`Создать папку проекта заново`,description:`Создаёт отсутствующую папку проекта по сохранённому пути.`,run:()=>m()}),y.scope.registerCommand({id:`ide.project.directory.relocate`,title:`Указать новый путь проекта`,description:`Привязывает проект к другой папке; create: true создаст её, если она не существует.`,arguments:{path:`string: абсолютный путь или ~/…`,create:`boolean (необязательно): создать папку, если её нет`},run:e=>{let t=b(e);if(typeof t.path!=`string`)throw Error(`Укажите path`);return h(t.path,t.create===!0)}}),y.scope.registerCommand({id:`ide.project.missing.remove`,title:`Убрать отсутствующий проект из Projector`,description:`После подтверждения удаляет проект из каталога Projector. Файлы на диске не затрагиваются.`,enabled:()=>!d.value,run:()=>v()}),(n,o)=>{let s=pe(`router-link`);return V(),Y(ml,{as:`section`,gap:4,class:`project-missing`,"aria-label":`Папка проекта не найдена`},{default:F(()=>[I(_,{"space-after":0},{default:F(()=>[...o[5]||=[N(`Папка проекта не найдена`,-1)]]),_:1}),K(`p`,r_,[N(` Проект «`+j(e.project.name)+`» сохранён, но каталог `,1),K(`code`,null,j(e.project.path),1),o[6]||=N(` больше не существует. Создайте его заново или укажите новый путь. `,-1)]),I(ml,{gap:2,align:`start`,class:`block`},{default:F(()=>[I(Q,{appearance:`solid`,disabled:d.value,onClick:o[0]||=e=>H(y).run(`ide.project.directory.create`)},{default:F(()=>[...o[7]||=[N(`Создать папку заново`,-1)]]),_:1},8,[`disabled`]),I(i,null,{default:F(()=>[...o[8]||=[N(`Каталог будет создан пустым по прежнему пути.`,-1)]]),_:1})]),_:1}),I(ml,{as:`form`,gap:2,align:`start`,class:`block`,onSubmit:o[3]||=Z(e=>H(y).run(`ide.project.directory.relocate`,{path:l.value,create:u.value}),[`prevent`])},{default:F(()=>[I(g,{layout:`plain`,label:`Новый путь`,required:``,gap:1,class:`field`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:l.value,"onUpdate:modelValue":o[1]||=e=>l.value=e,required:``,spellcheck:`false`,autocomplete:`off`,placeholder:`/путь/к/проекту или ~/code/проект`}),null,16,[`modelValue`])]),_:1}),I(r,{as:`label`,justify:`normal`,class:`check`},{default:F(()=>[I(a,{modelValue:u.value,"onUpdate:modelValue":o[2]||=e=>u.value=e,type:`checkbox`},null,8,[`modelValue`]),o[9]||=N(` Создать папку, если её нет`,-1)]),_:1}),I(Q,{type:`submit`,disabled:d.value||!l.value.trim()},{default:F(()=>[...o[10]||=[N(`Указать путь`,-1)]]),_:1},8,[`disabled`])]),_:1}),f.value?(V(),Y(t,{key:0,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(f.value),1)]),_:1})):B(``,!0),I(r,{justify:`between`,class:`block footer`},{default:F(()=>[I(Q,{tone:`danger`,disabled:d.value,onClick:o[4]||=e=>H(y).run(`ide.project.missing.remove`)},{default:F(()=>[...o[11]||=[N(`Убрать из Projector`,-1)]]),_:1},8,[`disabled`]),I(s,{to:`/`},{default:F(()=>[...o[12]||=[N(`к поиску`,-1)]]),_:1})]),_:1})]),_:1})}}}),[[`__scopeId`,`data-v-ca63449d`]]),a_={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function o_(e,t){return V(),q(`svg`,a_,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`},null,-1)]])}var s_=U({name:`lucide-play`,render:o_}),c_={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function l_(e,t){return V(),q(`svg`,c_,[...t[0]||=[K(`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,rx:`2`},null,-1)]])}var u_=U({name:`lucide-square`,render:l_}),d_={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function f_(e,t){return V(),q(`svg`,d_,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`}),K(`path`,{d:`M3 9h18M9 21V9`})],-1)]])}var p_=U({name:`lucide-panels-top-left`,render:f_}),m_={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function h_(e,t){return V(),q(`svg`,m_,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M22 7.7c0-.6-.4-1.2-.8-1.5l-6.3-3.9a1.72 1.72 0 0 0-1.7 0l-10.3 6c-.5.2-.9.8-.9 1.4v6.6c0 .5.4 1.2.8 1.5l6.3 3.9a1.72 1.72 0 0 0 1.7 0l10.3-6c.5-.3.9-1 .9-1.5Z`}),K(`path`,{d:`M10 21.9V14L2.1 9.1M10 14l11.9-6.9M14 19.8v-8.1m4 5.8V9.4`})],-1)]])}var g_=U({name:`lucide-container`,render:h_}),__={class:`head-label`},v_=[`title`],y_={key:0,class:`empty`},b_=G(M({__name:`RunMenu`,props:{project:{}},setup(e){let t=e,n=ll(),{api:r}=Iu(),i=mu({anchor:`right`,initialFocus:[`button.main:not(:disabled)`,`button:not(:disabled)`],returnFocus:`.arrow`}),{open:a,toggle:o,close:s}=i,c=P(),l=z(()=>t.project.runtime?.status??`idle`),u=z(()=>l.value===`running`||l.value===`starting`),d=z(()=>l.value===`starting`||l.value===`stopping`),f=z(()=>t.project.commands.find(e=>e.id===t.project.defaultCommandId)??t.project.commands[0]),p=z(()=>t.project.runtime?.commandName??f.value?.name??`запуск`),m=z(()=>u.value?p.value:f.value?.name??`—`),h=z(()=>u.value?`работает`:l.value===`stopping`?`останавливается`:``),g=E(`project-run:${P()}`,()=>({surface:`project-run`,projectId:t.project.id,status:l.value}));g.scope.registerCommand({id:`ide.project.run.start`,title:`Запустить сценарий проекта`,description:`Запускает сценарий проекта (по умолчанию — основной) в сервере или в окне. Одновременно работает один сценарий.`,arguments:{command:`string?: id сценария`,mode:`server | window (по умолчанию server)`},enabled:()=>!u.value&&!d.value&&!!f.value,run:async e=>{let{command:t,mode:n}=b(e);await _(typeof t==`string`?t:void 0,n===`window`?`window`:`server`)}}),g.scope.registerCommand({id:`ide.project.run.stop`,title:`Остановить проект`,description:`Останавливает запущенный сценарий проекта.`,enabled:()=>u.value,run:()=>n.stop(t.project.id)}),g.scope.registerCommand({id:`ide.project.run.open`,title:`Открыть запущенный проект`,description:`Открывает работающий проект в браузере (server) или отдельном окне (window).`,arguments:{mode:`server | window`},enabled:()=>u.value,run:e=>{let{mode:r}=b(e);return n.open(t.project.id,r===`window`?`window`:`server`)}}),g.scope.registerCommand({id:`ide.project.run.scenarios.edit`,title:`Редактировать сценарии запуска`,description:`Открывает настройки проекта сразу на разделе «Сценарии»: названия и команды запуска, импорт из package.json.`,run:()=>y()}),g.scope.registerCommand({id:`ide.project.run.menu.toggle`,title:`Открыть или закрыть список сценариев запуска`,description:`Показывает остров со всеми сценариями проекта, статусом и настройкой.`,run:()=>o()});function _(e,r=`server`){return n.start(t.project.id,e??t.project.defaultCommandId,r)}async function v(e){s(),await e()}async function y(){s(),Jf.value=`scenarios`,await r.executeCommand(`ide.workbench.project.settings.open`,void 0,{scope:`editor:${t.project.id}`})}return(t,n)=>(V(),q(W,null,[K(`div`,{ref:H(i).trigger,class:`run`,role:`group`,"aria-label":`Запуск проекта`},[u.value?(V(),Y(Q,{key:1,size:`sm`,class:`main running`,disabled:l.value===`stopping`,title:`Остановить: ${p.value}`,"data-command":`ide.project.run.stop`,onClick:n[1]||=e=>H(g).run(`ide.project.run.stop`)},{default:F(()=>[I(ne,{class:`dot`,tone:l.value===`starting`||l.value===`stopping`?`warning`:`success`,"aria-hidden":`true`},null,8,[`tone`]),K(`span`,null,j(m.value),1),I(H(u_),{class:`stop`,"aria-hidden":`true`})]),_:1},8,[`disabled`,`title`])):(V(),Y(Q,{key:0,size:`sm`,class:`main`,disabled:!f.value||d.value,title:f.value?`Запустить: ${f.value.cmd}`:`Нет сценариев запуска`,"data-command":`ide.project.run.start`,onClick:n[0]||=e=>H(g).run(`ide.project.run.start`)},{default:F(()=>[I(H(s_),{class:`play`,"aria-hidden":`true`}),N(j(m.value),1)]),_:1},8,[`disabled`,`title`])),I(Q,{shape:`icon`,size:`sm`,class:`arrow`,title:`Сценарии запуска`,"aria-label":`Сценарии запуска`,"aria-haspopup":`dialog`,"aria-expanded":H(a),"aria-controls":H(a)?H(i).id:void 0,"data-command":`ide.project.run.menu.toggle`,onClick:n[2]||=e=>H(g).run(`ide.project.run.menu.toggle`)},{default:F(()=>[I(H(fl),{"aria-hidden":`true`})]),_:1},8,[`aria-expanded`,`aria-controls`])],512),I(kl,{menu:H(i),label:`Сценарии запуска`,width:360},{default:F(()=>[I(pl,{chevron:``,class:`island-head`,"aria-label":`Закрыть`,onClick:n[3]||=e=>H(o)(!1)},{default:F(()=>[K(`span`,__,[u.value?(V(),Y(ne,{key:0,class:`dot`,tone:l.value===`starting`||l.value===`stopping`?`warning`:`success`,"aria-hidden":`true`},null,8,[`tone`])):B(``,!0),N(j(u.value?`${p.value} · ${h.value}`:`Запуск`),1)])]),_:1}),e.project.environment?(V(),q(`div`,{key:0,class:`env`,title:`${e.project.environment.image} · сеть: ${e.project.environment.network}`},[I(H(g_),{"aria-hidden":`true`}),N(`Docker · `+j(e.project.environment.image),1)],8,v_)):B(``,!0),u.value?(V(),Y(ml,{key:1,flow:`flex`,gap:`none`,class:`group`,role:`group`,"aria-label":`Работающий проект`},{default:F(()=>[e.project.runtime?.url?(V(),Y(ts,{key:0,class:`item`,onClick:n[4]||=e=>v(()=>H(g).run(`ide.project.run.open`,{mode:`server`}))},{default:F(()=>[I(H(bi),{"aria-hidden":`true`}),I(gl,{title:`Открыть в браузере`,description:e.project.runtime.url},null,8,[`description`])]),_:1})):B(``,!0),I(ts,{class:`item`,onClick:n[5]||=e=>v(()=>H(g).run(`ide.project.run.open`,{mode:`window`}))},{default:F(()=>[I(H(p_),{"aria-hidden":`true`}),I(gl,{title:`Открыть в окне`})]),_:1}),I(ts,{class:`item`,tone:`danger`,disabled:l.value===`stopping`,onClick:n[6]||=e=>v(()=>H(g).run(`ide.project.run.stop`))},{default:F(()=>[I(H(u_),{"aria-hidden":`true`}),I(gl,{title:`Остановить`})]),_:1},8,[`disabled`])]),_:1})):B(``,!0),I(ml,{flow:`flex`,gap:`none`,id:H(c),class:`group`,role:`group`,"aria-label":`Сценарии`},{default:F(()=>[(V(!0),q(W,null,J(e.project.commands,t=>(V(),q(`div`,{key:t.id,class:`scenario`},[I(ts,{class:`item main`,disabled:u.value||d.value,"data-command":`ide.project.run.start`,onClick:e=>v(()=>H(g).run(`ide.project.run.start`,{command:t.id}))},{default:F(()=>[I(H(s_),{class:`play`,"aria-hidden":`true`}),I(gl,{title:t.name,description:t.cmd,mono:``},null,8,[`title`,`description`]),t.id===e.project.defaultCommandId?(V(),Y(hl,{key:0},{default:F(()=>[...n[8]||=[N(`основной`,-1)]]),_:1})):B(``,!0)]),_:2},1032,[`disabled`,`onClick`]),I(Q,{shape:`icon`,size:`sm`,disabled:u.value||d.value,title:`${t.name} в окне`,"aria-label":`Запустить ${t.name} в окне`,onClick:e=>v(()=>H(g).run(`ide.project.run.start`,{command:t.id,mode:`window`}))},{default:F(()=>[I(H(p_),{"aria-hidden":`true`})]),_:1},8,[`disabled`,`title`,`aria-label`,`onClick`])]))),128)),e.project.commands.length?B(``,!0):(V(),q(`p`,y_,`Сценариев пока нет`))]),_:1},8,[`id`]),I(ts,{separator:`before`,tone:`muted`,class:`item settings`,"data-command":`ide.project.run.scenarios.edit`,onClick:n[7]||=e=>H(g).run(`ide.project.run.scenarios.edit`)},{default:F(()=>[I(H(tp),{"aria-hidden":`true`}),n[9]||=N(`Настроить сценарии… `,-1)]),_:1})]),_:1},8,[`menu`])],64))}}),[[`__scopeId`,`data-v-5f9a41bc`]]),x_={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function S_(e,t){return V(),q(`svg`,x_,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M20 6L9 17l-5-5`},null,-1)]])}var C_=U({name:`lucide-check`,render:S_}),w_={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function T_(e,t){return V(),q(`svg`,w_,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`12`,cy:`12`,r:`10`}),K(`path`,{d:`M12 8v4m0 4h.01`})],-1)]])}var E_=U({name:`lucide-circle-alert`,render:T_}),D_={class:`notice-layer`,"aria-live":`polite`},O_={class:`toast-layer`,role:`region`,"aria-label":`Ошибки`},k_={class:`toast-text`},A_=[`onClick`],j_=[`onClick`],M_=8,N_=16,P_=G(M({__name:`UiNoticeHost`,setup(e){function t(e){let t=e.y<56;return{left:`${Math.min(Math.max(e.x,56),window.innerWidth-N_-40)}px`,top:`${t?e.y+e.height+M_:e.y-M_}px`,translate:t?`-50% 0`:`-50% -100%`}}return(e,n)=>(V(),Y(ht,{to:`body`},[K(`div`,D_,[(V(!0),q(W,null,J(H(Xr),e=>(V(),Y(_l,{border:`strong`,radius:`md`,surface:`tertiary`,key:e.id,class:O([`notice`,[e.kind,{below:e.y<56}]]),role:e.kind===`error`?`alert`:`status`,style:k(t(e)),onClick:t=>H(ei)(e.id)},{default:F(()=>[e.kind===`success`?(V(),Y(H(C_),{key:0,"aria-hidden":`true`})):(V(),Y(H(E_),{key:1,"aria-hidden":`true`})),K(`span`,null,j(e.text),1)]),_:2},1032,[`class`,`role`,`style`,`onClick`]))),128))]),K(`div`,O_,[(V(!0),q(W,null,J(H(si),e=>(V(),q(`div`,{key:e.id,class:`toast`,role:`alert`},[I(H(E_),{"aria-hidden":`true`}),K(`span`,k_,j(e.text),1),e.action?(V(),q(`button`,{key:0,type:`button`,class:`toast-action`,onClick:t=>{e.action.run(),H(Zr)(e.id)}},j(e.action.label),9,A_)):B(``,!0),K(`button`,{type:`button`,class:`toast-close`,"aria-label":`Закрыть`,title:`Закрыть`,onClick:t=>H(Zr)(e.id)},[I(H(oi),{"aria-hidden":`true`})],8,j_)]))),128))])]))}}),[[`__scopeId`,`data-v-33e34ce6`]]);async function F_(e){let t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||`Не удалось получить возможности агентов`);return t}async function I_(){return F_(await fetch(`/api/agent/features`))}async function L_(e,t,n){return F_(await fetch(`/api/agent/features`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({feature:e,agent:t,enabled:n})}))}var R_=at({data:{features:[],file:``},loaded:!1,error:``}),z_;async function B_(e=!1){return R_.loaded&&!e?R_.data:z_||(z_=I_().then(e=>(R_.data=e,R_.loaded=!0,R_.error=``,e)).catch(e=>{throw R_.error=e instanceof Error?e.message:`Ошибка возможностей агентов`,e}).finally(()=>{z_=void 0}),z_)}function V_(e){R_.data=e,R_.loaded=!0,R_.error=``}function H_(){return{data:z(()=>R_.data),loaded:z(()=>R_.loaded),error:z(()=>R_.error),load:B_}}var U_={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function W_(e,t){return V(),q(`svg`,U_,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594zM20 2v4m2-2h-4`}),K(`circle`,{cx:`4`,cy:`20`,r:`2`})],-1)]])}var G_=U({name:`lucide-sparkles`,render:W_}),K_=[`aria-expanded`,`aria-controls`],q_={key:0,class:`changed-dot`,"aria-hidden":`true`},J_={class:`agent`},Y_={class:`feature-title`},X_={key:0,class:`empty`},Z_={key:2,class:`footer`},Q_=G(M({__name:`AgentFeaturesIsland`,props:{backend:{},chat:{},overrides:{},disabled:{type:Boolean},showTrigger:{type:Boolean},anchor:{type:Function}},emits:[`update:overrides`],setup(e,{expose:n,emit:r}){let i=e,o=r,{data:s,error:c}=H_(),l=P(),u=z(()=>c.value),d=z(()=>new Set(s.value.features.filter(e=>e.agents.find(e=>e.id===i.backend)?.enabled).map(e=>e.id))),f=z(()=>i.overrides!==void 0),p=e=>i.overrides?i.overrides.includes(e):d.value.has(e),m=mu({anchor:`right`,initialFocus:[`input:not(:disabled)`,`button:not(:disabled)`],items:`input, button`,returnFocus:`.trigger, button`}),h=X();function g(e){h.value=e instanceof HTMLElement?e:void 0}let _=E(`agent-features:${P()}`,()=>({surface:`agentFeatures`,backend:i.backend,chat:i.chat,overridden:f.value,features:s.value.features.length}));async function v(){try{await B_(!0)}catch{}}async function y(e,t){if(i.disabled)throw Error(`Чат ещё загружается: выбор возможностей пока недоступен`);if(!(await B_()).features.find(t=>t.id===e))throw Error(`Неизвестная возможность: ${e}`);let n=i.overrides??[...d.value],r=t?[...new Set([...n,e])]:n.filter(t=>t!==e),a=r.length===d.value.size&&r.every(e=>d.value.has(e));return o(`update:overrides`,a?void 0:r),{feature:e,enabled:t,overridden:!a,overrides:a?void 0:r}}function x(){if(i.disabled)throw Error(`Чат ещё загружается: выбор возможностей пока недоступен`);o(`update:overrides`,void 0)}_.scope.registerCommand({id:`ide.agent.features.chat.list`,palette:!1,title:`Список возможностей текущего чата`,description:`Возвращает возможности выбранного агента в этом чате: id, название, описание, включена ли возможность сейчас (enabled) и включена ли она по умолчанию (default). overridden показывает, есть ли у чата собственный выбор.`,run:async()=>{let e=await B_();return{backend:i.backend,chat:i.chat,overridden:f.value,features:e.features.map(e=>({id:e.id,title:e.title,summary:e.summary,enabled:p(e.id),default:d.value.has(e.id)}))}}}),_.scope.registerCommand({id:`ide.agent.features.chat.set`,palette:!1,title:`Включить или выключить возможность в текущем чате`,description:`Переопределяет возможность (widgets — виджеты в ответах, ide — команды IDE через MCP) для этого чата, не меняя умолчание агента в настройках. Часть агентов применяет изменение со следующего сообщения, часть — в новой сессии.`,arguments:{feature:`string: id возможности: widgets или ide`,enabled:`boolean: включена ли возможность в этом чате`},run:e=>{let t=b(e);if(typeof t.feature!=`string`||!t.feature)throw Error(`feature: id возможности: widgets или ide`);if(typeof t.enabled!=`boolean`)throw Error(`enabled должен быть boolean`);return y(t.feature,t.enabled)}}),_.scope.registerCommand({id:`ide.agent.features.chat.reset`,title:`Вернуть возможности чата к умолчаниям`,description:`Убирает собственный выбор возможностей у этого чата: дальше действуют умолчания агента из глобальных настроек.`,run:()=>(x(),{overridden:!1})}),_.scope.registerCommand({id:`ide.agent.features.panel`,title:`Открыть возможности агента`,description:`Открывает или закрывает остров возможностей в табе агента: какие необязательные возможности (виджеты в ответах, команды IDE через MCP) включены в этом чате и чем они отличаются от умолчаний.`,run:()=>C()});function S(e){m.trigger.value=e??i.anchor?.()??h.value,m.open.value||v(),_.scope.activate(),m.toggle(!0)}function C(){S()}n({openAt:S});function w(e,t){let n=t.target.checked;y(e,n).catch(()=>void 0)}return Lt(()=>void B_().catch(()=>void 0)),(n,r)=>(V(),q(W,null,[K(`div`,{ref:g,class:O([`features`,{hidden:e.showTrigger===!1}])},[e.showTrigger===!1?B(``,!0):(V(),q(`button`,{key:0,type:`button`,class:O([`trigger`,{changed:f.value}]),"aria-expanded":H(m).open.value,"aria-controls":H(m).id,"aria-label":`Возможности агента`,title:`Возможности агента`,onClick:C},[I(H(G_),{"aria-hidden":`true`}),f.value?(V(),q(`span`,q_)):B(``,!0)],10,K_))],2),I(kl,{menu:H(m),label:`Возможности агента`,width:340},{default:F(()=>[I(Gd,null,{default:F(()=>[...r[0]||=[N(`Возможности агента`,-1)]]),_:1}),(V(!0),q(W,null,J(H(s).features,t=>(V(),q(`section`,{key:t.id,class:`feature`},[K(`label`,J_,[I(a,{type:`checkbox`,id:`${H(l)}-${t.id}`,name:t.id,checked:p(t.id),disabled:e.disabled,"aria-label":t.title,onChange:e=>w(t.id,e)},null,8,[`id`,`name`,`checked`,`disabled`,`aria-label`,`onChange`]),K(`span`,Y_,j(t.title),1)])]))),128)),H(s).features.length?B(``,!0):(V(),q(`p`,X_,`Возможностей пока нет.`)),u.value?(V(),Y(t,{key:1,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(u.value),1)]),_:1})):B(``,!0),f.value?(V(),q(`div`,Z_,[I(Q,{size:`sm`,disabled:e.disabled,onClick:x},{default:F(()=>[...r[1]||=[N(`Как по умолчанию`,-1)]]),_:1},8,[`disabled`])])):B(``,!0)]),_:1},8,[`menu`])],64))}}),[[`__scopeId`,`data-v-65949bad`]]),$_=()=>qn().map(e=>e.backend),ev=()=>qn().map(e=>e.title);function tv(){let{data:e,error:t,load:n}=H_(),r=X(``),i=X(``),a=z(()=>i.value||t.value),o=E(`agent-feature-defaults:${P()}`,()=>({surface:`agentFeatureDefaults`,busy:!!r.value,features:e.value.features.length}));async function s(){i.value=``;try{return await n(!0)}catch(e){throw i.value=e instanceof Error?e.message:`Ошибка возможностей агентов`,e}}async function c(t,n,a){r.value=`${t}:${n}`,i.value=``;try{return V_(await L_(t,n,a)),e.value}catch(e){throw i.value=e instanceof Error?e.message:`Не удалось сохранить умолчание`,e}finally{r.value=``}}return o.scope.registerCommand({id:`ide.agent.features.defaults.list`,palette:!1,title:`Список умолчаний возможностей агентов`,description:`Возвращает возможности чата (widgets — виджеты в ответах, ide — команды IDE через MCP) и для каждого агента (${ev().join(`, `)}) с умолчанием: включена ли она в новом чате. Это значения, которые чат может переопределить для себя; сам остров в табе агента меняет только текущий чат.`,run:()=>s()}),o.scope.registerCommand({id:`ide.agent.features.defaults.set`,palette:!1,title:`Изменить умолчание возможности агента`,description:`Включает или выключает возможность (widgets — виджеты в ответах, ide — команды IDE через MCP) для агента по умолчанию. Действует на новые чаты без своего переопределения; уже открытый чат меняет остров в табе агента. У внешних агентов ide добавляет MCP-сервер projector-ide с тремя инструментами команд.`,arguments:{feature:`string: id возможности: widgets или ide`,agent:`string: id агента каталога: ${$_().join(`, `)}`,enabled:`boolean: включена ли возможность по умолчанию`},enabled:()=>!r.value,run:e=>{let t=b(e);if(typeof t.feature!=`string`||!t.feature)throw Error(`feature: id возможности: widgets или ide`);if(typeof t.agent!=`string`||!t.agent)throw Error(`agent: id агента каталога: ${$_().join(`, `)}`);if(typeof t.enabled!=`boolean`)throw Error(`enabled должен быть boolean`);return c(t.feature,t.agent,t.enabled)}}),Lt(()=>void s().catch(()=>void 0)),{data:e,busy:r,error:a,load:s,set:c,commands:o}}var nv={class:`summary`},rv={class:`agents`},iv={key:0,class:`hint`},av=G(M({__name:`AgentFeatureDefaults`,props:{agent:{}},setup(e){let t=e,{data:n,busy:r,error:o,set:s,commands:c}=tv(),l=()=>c.scope.activate(),u=z(()=>n.value.features.map(e=>({...e,agents:t.agent?e.agents.filter(e=>e.id===t.agent):e.agents})).filter(e=>!t.agent||e.agents.length));function d(e,t,n){let r=n.target.checked;Promise.resolve(s(e,t,r)).catch(()=>void 0)}return(e,t)=>(V(),Y(hp,{activate:l,error:H(o)},{default:F(()=>[(V(!0),q(W,null,J(u.value,e=>(V(),q(`section`,{key:e.id,class:`feature`},[K(`h3`,null,j(e.title),1),K(`p`,nv,j(e.summary),1),K(`div`,rv,[(V(!0),q(W,null,J(e.agents,t=>(V(),q(`label`,{key:t.id,class:`agent`},[I(a,{type:`checkbox`,id:`feature-default-${e.id}-${t.id}`,name:e.id,checked:t.enabled,disabled:H(r)===`${e.id}:${t.id}`,"aria-label":`${e.title}: ${t.label}`,onChange:n=>d(e.id,t.id,n)},null,8,[`id`,`name`,`checked`,`disabled`,`aria-label`,`onChange`]),K(`span`,null,j(t.label),1)]))),128))])]))),128)),u.value.length?B(``,!0):(V(),q(`p`,iv,`Возможностей пока нет.`)),I(i,null,{default:F(()=>[t[0]||=N(` Это умолчания для новых чатов. В табе агента остров «возможности» переопределяет их только для текущего чата; кнопка «Как по умолчанию» возвращает к этим значениям. Файл: `,-1),K(`code`,null,j(H(n).file),1)]),_:1})]),_:1},8,[`error`]))}}),[[`__scopeId`,`data-v-ec0ac9c5`]]);async function ov(e){let t=await fetch(`/api/agent/hooks`,{...e,headers:{"Content-Type":`application/json`}}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||`Не удалось получить хуки агента`);return n}var sv=()=>ov(),cv=e=>ov({method:`PUT`,body:JSON.stringify({text:e})});async function lv(e,t){let n=await fetch(e,{cache:`no-store`,...t,headers:t?.body?{"Content-Type":`application/json`}:void 0}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error||`Судья недоступен`);return r}function uv(){return lv(`/api/agent/judge`)}function dv(e){return lv(`/api/agent/judge`,{method:`PUT`,body:JSON.stringify(e)})}async function fv(e,t=``){let n=t?`?projectId=${encodeURIComponent(t)}`:``,r=await fetch(`/api/agent/mcp${n}`,{...e,headers:{"Content-Type":`application/json`}}),i=await r.json().catch(()=>({}));if(!r.ok)throw Error(i.error||`Не удалось получить MCP-серверы агента`);return i}var pv=(e=``)=>fv(void 0,e),mv=e=>fv({method:`PUT`,body:JSON.stringify({text:e})});async function hv(e){let t=await fetch(`/api/agent/memory`,{...e,headers:{"Content-Type":`application/json`}}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||`Не удалось получить заметки агента`);return n}var gv=()=>hv(),_v=(e,t)=>hv({method:`PUT`,body:JSON.stringify({scope:t?`project`:`user`,path:t,text:e})});async function vv(e=``){let t=await fetch(`/api/agent/skills?projectId=${encodeURIComponent(e)}`),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||`Не удалось получить навыки агента`);return n}async function yv(e){let t=await fetch(`/api/agent/web`,{...e,headers:{"Content-Type":`application/json`}}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||`Не удалось получить настройки веб-поиска`);return n}var bv=()=>yv(),xv=e=>yv({method:`PUT`,body:JSON.stringify(e)});function Sv(){let e=X({text:``,hooks:[]}),t=X(),n=X(!1),r=X(``),i=E(`agent-hooks:${P()}`,()=>({surface:`agentHooks`,busy:n.value,hooks:e.value.hooks.length}));async function a(e){n.value=!0,r.value=``;try{return await e()}catch(e){throw r.value=e instanceof Error?e.message:`Ошибка хуков агента`,e}finally{n.value=!1}}async function o(){return e.value=await sv(),t.value=void 0,e.value}return i.scope.registerCommand({id:`ide.agent.hooks.get`,title:`Прочитать хуки агента`,description:`Возвращает хуки штатного агента Projector: файл пользователя (text) и действующие хуки (событие PreToolUse, PostToolUse или Stop, источник user или project, команда, matcher).`,enabled:()=>!n.value,run:()=>a(o)}),i.scope.registerCommand({id:`ide.agent.hooks.set`,title:`Записать хуки агента`,description:`Заменяет файл хуков пользователя целиком. text — JSON вида { "hooks": { "Stop": [{ "command": "notify-send Готово", "minSeconds": 30 }], "PreToolUse": [{ "matcher": "^run_command$", "command": "./check.sh" }] } }. Код выхода 2 у PreToolUse запрещает вызов; хук может ответить JSON { "decision": "block", "reason": "…" } или { "additionalContext": "…" }. Пустая строка удаляет файл. Без аргументов сохраняет текст с экрана.`,arguments:{text:`Новый JSON хуков; пустая строка — удалить`},enabled:()=>!n.value,run:n=>{let r=b(n),i=typeof r.text==`string`?r.text:t.value??e.value.text;return a(async()=>(await cv(i),o()))}}),Lt(()=>void a(o).catch(()=>void 0)),{hooks:e,draft:t,busy:n,error:r,commands:i}}var Cv={show:!0,auto:!0,maxRisk:1,confidence:`high-medium`},wv={1:`info`,2:`neutral`,3:`warning`,4:`danger`,5:`danger`};function Tv(e){return wv[e]}function Ev(e,t){return Dv(t,e)}function Dv(e,t=Cv){if(!e||typeof e!=`object`||Array.isArray(e))return{...t};let n=e;return{show:typeof n.show==`boolean`?n.show:t.show,auto:typeof n.auto==`boolean`?n.auto:t.auto,maxRisk:n.maxRisk===1||n.maxRisk===2||n.maxRisk===3?n.maxRisk:t.maxRisk,confidence:n.confidence===`high`||n.confidence===`high-medium`?n.confidence:t.confidence}}function Ov(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n={};return typeof t.show==`boolean`&&(n.show=t.show),typeof t.auto==`boolean`&&(n.auto=t.auto),(t.maxRisk===1||t.maxRisk===2||t.maxRisk===3)&&(n.maxRisk=t.maxRisk),(t.confidence===`high`||t.confidence===`high-medium`)&&(n.confidence=t.confidence),Object.keys(n).length?n:void 0}function kv(){let e=X({...Cv}),t=X(!1),n=X(``),r=E(`agent-judge:${P()}`,()=>({surface:`agentJudge`,busy:t.value,show:e.value.show,auto:e.value.auto,maxRisk:e.value.maxRisk,confidence:e.value.confidence}));async function i(e){t.value=!0,n.value=``;try{return await e()}catch(e){throw n.value=e instanceof Error?e.message:`Ошибка настроек Судьи`,e}finally{t.value=!1}}function a(t){return e.value=t,t}return r.scope.registerCommand({id:`ide.agent.judge.get`,title:`Прочитать настройки Projector Judge`,description:`Возвращает глобальные настройки Судьи: показывать ли риск в карточке подтверждения (show), разрешать ли низкий риск автоматически (auto), максимальный автоматический балл (maxRisk 1–3) и достаточную уверенность (confidence: high или high-medium).`,run:()=>i(async()=>a(await uv()))}),r.scope.registerCommand({id:`ide.agent.judge.set`,title:`Настроить Projector Judge`,description:`Меняет глобальные настройки Судьи. Без аргументов сохраняет состояние с экрана. maxRisk выше 3 запрещён: баллы 4–5 никогда не разрешаются автоматически.`,arguments:{show:`boolean: показывать оценку в карточке`,auto:`boolean: разрешать низкий риск автоматически`,maxRisk:`1, 2 или 3: максимальный автоматический балл`,confidence:`high или high-medium`},run:t=>i(async()=>{let n=b(t);return a(await dv(Dv({show:typeof n.show==`boolean`?n.show:e.value.show,auto:typeof n.auto==`boolean`?n.auto:e.value.auto,maxRisk:n.maxRisk??e.value.maxRisk,confidence:n.confidence??e.value.confidence},e.value)))})}),Lt(()=>void i(async()=>a(await uv())).catch(()=>void 0)),{settings:e,busy:t,error:n,commands:r}}function Av(){let e=X({text:``,servers:[]}),t=X(),n=X(!1),r=X(``),i=E(`agent-mcp:${P()}`,()=>({surface:`agentMcp`,busy:n.value,servers:e.value.servers.length}));async function a(e){n.value=!0,r.value=``;try{return await e()}catch(e){throw r.value=e instanceof Error?e.message:`Ошибка MCP-серверов агента`,e}finally{n.value=!1}}async function o(){return e.value=await pv(),t.value=void 0,e.value}return i.scope.registerCommand({id:`ide.agent.mcp.get`,title:`Прочитать MCP-серверы агента`,description:`Возвращает список MCP-серверов штатного агента Projector: свой файл пользователя (text) и серверы, которые он подключает (имя, источник user или project, тип stdio, http или sse).`,enabled:()=>!n.value,run:()=>a(o)}),i.scope.registerCommand({id:`ide.agent.mcp.set`,title:`Записать MCP-серверы агента`,description:`Заменяет файл MCP-серверов пользователя целиком. text — JSON вида { "mcpServers": { "имя": { "command": "npx", "args": ["…"], "env": {} } } } или { "type": "http", "url": "…", "headers": {} }; пустая строка удаляет файл. Серверы из .mcp.json проекта подключаются сами, но с вопросом. Без аргументов сохраняет текст с экрана.`,arguments:{text:`Новый JSON списка серверов; пустая строка — удалить`},enabled:()=>!n.value,run:n=>{let r=b(n),i=typeof r.text==`string`?r.text:t.value??e.value.text;return a(async()=>(await mv(i),o()))}}),Lt(()=>void a(o).catch(()=>void 0)),{mcp:e,draft:t,busy:n,error:r,commands:i}}function jv(){let e=X({user:``,projects:[]}),t=X({}),n=X(!1),r=X(``),i=E(`agent-memory:${P()}`,()=>({surface:`agentMemory`,busy:n.value,projects:e.value.projects.length}));async function a(e){n.value=!0,r.value=``;try{return await e()}catch(e){throw r.value=e instanceof Error?e.message:`Ошибка заметок агента`,e}finally{n.value=!1}}async function o(){return e.value=await gv(),t.value={},e.value}let s=n=>t.value[n]??(n===`user`?e.value.user:e.value.projects.find(e=>e.path===n)?.text)??``;return i.scope.registerCommand({id:`ide.agent.memory.get`,title:`Прочитать заметки агента`,description:`Возвращает заметки штатного агента Projector: общие (user) и по проектам (путь и текст).`,enabled:()=>!n.value,run:()=>a(o)}),i.scope.registerCommand({id:`ide.agent.memory.set`,title:`Записать заметки агента`,description:`Заменяет заметки штатного агента целиком. Без path — общие заметки, с path — заметки проекта по его пути; пустой text удаляет их. Лимит 6000 знаков. Без аргументов сохраняет общие заметки с экрана.`,arguments:{text:`Новый текст заметок; пустая строка — удалить`,path:`Путь проекта; без него — общие заметки`},enabled:()=>!n.value,run:e=>{let t=b(e),n=typeof t.path==`string`&&t.path?t.path:void 0,r=typeof t.text==`string`?t.text:s(n??`user`);return a(async()=>(await _v(r,n),o()))}}),Lt(()=>void a(o).catch(()=>void 0)),{memory:e,drafts:t,textOf:s,busy:n,error:r,commands:i}}function Mv(){let e=X({skills:[],folders:[]}),t=X(!1),n=X(``),r=E(`agent-skills:${P()}`,()=>({surface:`agentSkills`,busy:t.value,skills:e.value.skills.length}));async function i(r){t.value=!0,n.value=``;try{return e.value=await vv(r),e.value}catch(e){throw n.value=e instanceof Error?e.message:`Ошибка навыков агента`,e}finally{t.value=!1}}return r.scope.registerCommand({id:`ide.agent.skills.list`,title:`Список навыков агента`,description:`Возвращает навыки и команды-шаблоны штатного агента Projector: имя, описание, вид (skill или command), источник (user или project) и папки, где они лежат. С projectId — вместе с навыками проекта.`,arguments:{projectId:`Проект, чьи навыки добавить; без него только пользовательские`},enabled:()=>!t.value,run:e=>{let t=b(e).projectId;return i(typeof t==`string`?t:void 0)}}),Lt(()=>void i().catch(()=>void 0)),{data:e,busy:t,error:n,commands:r}}function Nv(){let e=X({provider:`brave`,url:``,hasKey:!1}),t=X(`brave`),n=X(``),r=X(``),i=X(!1),a=X(``),o=E(`agent-web:${P()}`,()=>({surface:`agentWeb`,busy:i.value,provider:e.value.provider}));async function s(e){i.value=!0,a.value=``;try{return await e()}catch(e){throw a.value=e instanceof Error?e.message:`Ошибка веб-поиска агента`,e}finally{i.value=!1}}function c(i){return e.value=i,t.value=i.provider,n.value=i.url,r.value=``,i}return o.scope.registerCommand({id:`ide.agent.web.get`,title:`Прочитать настройки веб-поиска агента`,description:`Возвращает поисковый сервис штатного агента Projector (brave или searxng), адрес SearXNG и сохранён ли ключ. Сам ключ не возвращается.`,enabled:()=>!i.value,run:()=>s(async()=>c(await bv()))}),o.scope.registerCommand({id:`ide.agent.web.set`,title:`Выбрать веб-поиск агента`,description:`Задаёт поисковый сервис штатного агента: provider brave (нужен ключ Brave Search, его вводит пользователь на экране или в запросе секрета) или searxng (url своего сервера). Без аргументов сохраняет выбор с экрана. Ключ через команду не передаётся.`,arguments:{provider:`brave или searxng`,url:`Адрес сервера SearXNG, для brave не нужен`},enabled:()=>!i.value,run:e=>{let i=b(e),a=i.provider??t.value,o=typeof i.url==`string`?i.url:n.value;return s(async()=>c(await xv({provider:a,url:o,apiKey:r.value})))}}),o.scope.registerCommand({id:`ide.agent.web.key.clear`,title:`Удалить ключ веб-поиска агента`,description:`Стирает сохранённый ключ поискового сервиса штатного агента.`,enabled:()=>!i.value&&e.value.hasKey,run:()=>s(async()=>c(await xv({provider:e.value.provider,url:e.value.url,apiKey:null})))}),Lt(()=>void s(async()=>c(await bv())).catch(()=>void 0)),{web:e,provider:t,url:n,apiKey:r,busy:i,error:a,commands:o}}var Pv=M({__name:`AgentJsonSettings`,props:{label:{},"aria-label":{},placeholder:{},text:{},draft:{},busy:{type:Boolean},error:{},activate:{type:Function}},emits:[`update:draft`,`save`],setup(e,{emit:t}){let n=e,r=t;return(t,i)=>(V(),Y(hp,{activate:e.activate,error:e.error},{default:F(()=>[I(g,{label:e.label},{default:F(({control:t})=>[I(a,rn(t,{as:`textarea`,rows:`10`,"aria-label":n[`aria-label`],spellcheck:`false`,placeholder:e.placeholder,value:e.draft??e.text,disabled:e.busy,onInput:i[0]||=e=>r(`update:draft`,e.target.value)}),null,16,[`aria-label`,`placeholder`,`value`,`disabled`])]),_:1},8,[`label`]),I(Q,{appearance:`solid`,disabled:e.busy||e.draft===void 0,onClick:i[1]||=e=>r(`save`)},{default:F(()=>[...i[2]||=[N(`Сохранить`,-1)]]),_:1},8,[`disabled`]),L(t.$slots,`summary`),L(t.$slots,`help`)]),_:3},8,[`activate`,`error`]))}}),Fv=M({__name:`AgentHooksSettings`,setup(e){let{hooks:t,draft:n,busy:r,error:a,commands:o}=Sv(),s=()=>o.scope.activate();return(e,c)=>(V(),Y(Pv,{label:`хуки пользователя (JSON)`,"aria-label":`Хуки агента`,placeholder:`{ "hooks": { "Stop": [{ "command": "notify-send Projector готов", "minSeconds": 30 }] } }`,text:H(t).text,draft:H(n),busy:H(r),error:H(a),activate:s,"onUpdate:draft":c[0]||=e=>n.value=e,onSave:c[1]||=e=>H(o).run(`ide.agent.hooks.set`)},{summary:F(()=>[H(t).hooks.length?(V(),Y(i,{key:0},{default:F(()=>[N(` Действуют: `+j(H(t).hooks.map(e=>`${e.event}${e.matcher?` /`+e.matcher+`/`:``} (${e.source===`user`?`ваш`:`проект`}): ${e.command}`).join(`; `)),1)]),_:1})):B(``,!0)]),help:F(()=>[I(i,null,{default:F(()=>[...c[2]||=[N(` События: `,-1),K(`code`,null,`PreToolUse`,-1),N(` (перед инструментом; код выхода 2 или ответ `,-1),K(`code`,null,`{"decision":"block","reason":"…"}`,-1),N(` запрещает вызов), `,-1),K(`code`,null,`PostToolUse`,-1),N(` (после; `,-1),K(`code`,null,`{"additionalContext":"…"}`,-1),N(` дописывается к результату) и `,-1),K(`code`,null,`Stop`,-1),N(` (после ответа; `,-1),K(`code`,null,`minSeconds`,-1),N(` — только для долгих ходов). `,-1),K(`code`,null,`matcher`,-1),N(` — регулярное выражение по имени инструмента. Событие приходит хуку в stdin как JSON. Хуки из `,-1),K(`code`,null,`.projector/hooks.json`,-1),N(` проекта тоже действуют, но включение подтверждаете вы. `,-1)]]),_:1})]),_:1},8,[`text`,`draft`,`busy`,`error`]))}});async function Iv(e,t,n){let r=await fetch(`/api/agent/chats/${e}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}),i=await r.json().catch(()=>({}));if(!r.ok)throw Error(i.error||n);return i}async function Lv(e){let t=await fetch(`/api/agent/chats?key=${encodeURIComponent(e)}`),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||`Не удалось получить историю чатов`);return n.chats??[]}async function Rv(e,t){let n=new URLSearchParams({projectId:e});t&&n.set(`backend`,t);let r=await fetch(`/api/agent/chats/recent?${n}`),i=await r.json().catch(()=>({}));if(!r.ok)throw Error(i.error||`Не удалось получить историю`);return i.chats??[]}var zv=e=>Iv(`archive`,{key:e},`Не удалось сохранить чат в истории`),Bv=(e,t)=>Iv(`open`,{key:e,id:t},`Не удалось открыть чат`),Vv=(e,t)=>Iv(`update`,{id:e,...t},`Не удалось изменить чат`),Hv=e=>Iv(`delete`,{id:e},`Не удалось удалить чат`),Uv=(e,t)=>Iv(`forget`,{projectId:e,chat:t},`Не удалось удалить чат`);async function Wv(e,t,n,r){let i;try{if(!n)throw Error(`Команды недоступны в этом чате`);i={output:await n(t)}}catch(e){i={error:e instanceof Error?e.message:String(e)}}if(!(await fetch(`/api/agent/tool-result`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e,...i}),signal:r})).ok)throw Error(`Не удалось передать результат команды агенту`)}var Gv=Symbol(`events unavailable`),Kv=class extends Error{status;constructor(e,t){super(e),this.status=t}};async function qv(e,t,n,r){if(typeof window>`u`)return Gv;let i=gr(),a,o=new Promise((e,t)=>{a=n=>n?t(n):e()}),s=Promise.resolve(),c=e=>{let n=e.detail;n.stream===i&&(n.event===`end`?s=s.then(()=>a()):(s=s.then(()=>t({event:n.event,data:n.data})),s.catch(a)))},l=()=>a(Error(`Соединение с событиями прервано`)),u=()=>{fetch(`/api/agent/detach`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({stream:i}),keepalive:!0}).catch(()=>{}),a(new DOMException(`Aborted`,`AbortError`))};window.addEventListener(`projector:agent`,c),window.addEventListener(`projector:events-open`,l),n?.addEventListener(`abort`,u,{once:!0});try{if(n?.aborted)throw new DOMException(`Aborted`,`AbortError`);let t=await fetch(`/api/agent`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...e,client:Ur,stream:i}),signal:n});if(t.status===409)return Gv;if(!t.ok)throw new Kv((await t.json().catch(()=>null))?.error||`Агент недоступен`,t.status);let a=await t.json().catch(()=>null);a?.run&&r?.(a.run),await o,await s}finally{window.removeEventListener(`projector:agent`,c),window.removeEventListener(`projector:events-open`,l),n?.removeEventListener(`abort`,u)}}function Jv(e){let t=[],n=e.split(`
|
|
18
|
+
|
|
19
|
+
`),r=n.pop()??``;for(let e of n){let n=``,r=[];for(let t of e.split(`
|
|
20
|
+
`))t.startsWith(`event:`)&&(n=t.slice(6).trim()),t.startsWith(`data:`)&&r.push(t.slice(5).trim());if(n)try{t.push({event:n,data:JSON.parse(r.join(`
|
|
21
|
+
`)||`{}`)})}catch{t.push({event:`error`,data:{error:`Некорректный поток`}})}}return{events:t,rest:r}}async function Yv(e){let t=await fetch(`/api/agent/form-repair`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e),signal:e.signal}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||`Form Doctor недоступен`);if(typeof n.form!=`string`||!n.form.trim())throw Error(`Form Doctor не вернул форму`);return n.form}async function Xv(e){let t=await fetch(`/api/agent/answer-repair`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e),signal:e.signal}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||`Answer Doctor недоступен`);if(typeof n.answer!=`string`||!n.answer.trim())throw Error(`Answer Doctor не вернул ответ`);return n.answer}async function Zv(e){let t=await fetch(`/api/agent/attachments?name=${encodeURIComponent(e.name)}`,{method:`POST`,headers:{"Content-Type":e.type},body:e}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(typeof n.error==`string`?n.error:`Не удалось загрузить файл`);let r=typeof n.path==`string`?n.path:``;if(!r)throw Error(`Сервер не вернул путь к файлу`);let i=typeof n.mime==`string`?n.mime:``;return i.startsWith(`image/`)&&typeof n.id==`string`?{type:`image`,id:n.id,name:typeof n.name==`string`?n.name:e.name,mime:i}:{type:`file`,path:r}}var Qv=class extends Error{};async function $v(e,t,n,r,i={}){let a=i.attach?{attach:i.attach,approvals:!0,commandBridge:!!i.commands}:{message:e,history:t,projectId:i.projectId,chat:i.chat,sessionId:i.sessionId,backend:i.backend,permissionMode:i.permissionMode,selection:i.selection,parts:i.parts,messageId:i.messageId,tail:i.tail,features:i.features,judge:i.judge,role:i.role,worktree:i.worktree,isolate:i.isolate,approvals:!0,commandBridge:!!i.commands};async function o(e){if(e.event!==`command-request`)return n(e);await Wv(e.data.id,e.data,i.commands,r)}try{if(await qv(a,o,r,i.onRun)!==Gv)return}catch(e){throw e instanceof Kv&&e.status===404?new Qv(e.message):e}let s=await fetch(`/api/agent`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(a),signal:r});if(!s.ok||!s.body){let e=(await s.json().catch(()=>null))?.error||`Агент недоступен`;throw s.status===404?new Qv(e):Error(e)}let c=s.headers.get(`X-Agent-Run`);c&&i.onRun?.(c);let l=s.body.getReader(),u=new TextDecoder,d=``;for(;;){let{done:e,value:t}=await l.read();if(e)break;d+=u.decode(t,{stream:!0});let n=Jv(d);d=n.rest;for(let e of n.events)await o(e)}if(d.trim()){let e=Jv(`${d}\n\n`);for(let t of e.events)await o(t)}}async function ey(e){await fetch(`/api/agent/cancel`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({runId:e})})}async function ty(e,t,n=!1){if(!(await fetch(`/api/agent/tool-result`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e,output:{allow:t,always:n}})})).ok)throw Error(`Запрос разрешения уже закрыт`)}async function ny(e,t){if(!(await fetch(`/api/agent/tool-result`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e,output:t?{answers:t}:{}})})).ok)throw Error(`Вопрос уже закрыт`)}async function ry(e,t){if(!(await fetch(`/api/agent/tool-result`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e,output:t?{value:t}:{}})})).ok)throw Error(`Запрос секрета уже закрыт`)}async function iy(e,t,n){let r=await fetch(e,t),i=await r.json().catch(()=>({}));if(!r.ok)throw Error(i.error||n);return i}var ay=(e,t)=>`backend=${encodeURIComponent(e)}&projectId=${encodeURIComponent(t)}`;async function oy(e,t){return await iy(`/api/agent/controls?${ay(e,t)}`,void 0,`Не удалось получить настройки агента`)}async function sy(e,t){return(await iy(`/api/agent/commands?${ay(e,t)}`,void 0,`Не удалось получить команды агента`)).commands}async function cy(){return(await iy(`/api/agent/defaults`,void 0,`Не удалось получить выбор агента`)).defaults}async function ly(e,t,n){await iy(`/api/agent/defaults`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({backend:e,id:t,value:n})},`Не удалось сохранить выбор агента`)}async function uy(e,t){return(await iy(`/api/agent/sessions?${ay(e,t)}`,void 0,`Не удалось получить сессии агента`)).sessions}async function dy(e,t,n){return(await iy(`/api/agent/sessions/load`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({backend:e,projectId:t,sessionId:n})},`Не удалось открыть сессию`)).turns}async function fy(e){return iy(`/api/agent/rewind-files`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)},`Не удалось вернуть файлы`)}async function py(e,t){return(await iy(`/api/agent/mcp?${ay(e,t)}`,void 0,`Не удалось получить MCP-серверы`)).servers}async function my(e,t){return iy(`/api/agent/worktree?projectId=${encodeURIComponent(e)}&id=${encodeURIComponent(t)}`,void 0,`Не удалось получить состояние копии`)}var hy=(e,t,n,r)=>iy(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({projectId:t,id:n})},r),gy=(e,t)=>hy(`/api/agent/worktree/merge`,e,t,`Не удалось влить изменения`),_y=(e,t)=>hy(`/api/agent/worktree/discard`,e,t,`Не удалось удалить копию`);async function vy(){let e=await fetch(`/api/agent/runs`,{cache:`no-store`});if(!e.ok)throw Error(`Не удалось получить работающие процессы агентов`);return(await e.json()).runs??[]}var yy=e=>e===`done`||e===`error`||e===`stopped`;async function by(e,t,n=`Запрос не удался`){let r=await fetch(e,{cache:`no-store`,...t,headers:t?.body?{"Content-Type":`application/json`}:void 0}),i=await r.json().catch(()=>({}));if(!r.ok)throw Error(i.error||n);return i}var xy=(e,t={},n)=>by(e,{method:`POST`,body:JSON.stringify(t)},n);async function Sy(e){return(await by(`/api/agent/jobs${e?`?projectId=${encodeURIComponent(e)}`:``}`)).jobs}function Cy(e,t=0,n=0,r){return by(`/api/agent/jobs/${e}${t?`?wait=${t}&rev=${n}`:``}`,{signal:r},`Не удалось прочитать задание`)}async function wy(e){return(await xy(`/api/agent/jobs`,e,`Не удалось запустить задание`)).job}async function Ty(e){return(await xy(`/api/agent/jobs/${e}/stop`,{},`Не удалось остановить задание`)).job}async function Ey(e,t=0){return(await by(`/api/agent/jobs/${e}/diff${t?`?limit=${encodeURIComponent(t)}`:``}`,void 0,`Не удалось прочитать изменения задания`)).diff}async function Dy(e,t){return(await xy(`/api/agent/jobs/${e}/answer`,t,`Не удалось передать ответ`)).job}async function Oy(e){return(await by(`/api/agent/jobs/${e}/worktree`,void 0,`Не удалось прочитать копию задания`)).worktree}async function ky(e){return by(`/api/agent/jobs/${e}/worktree/merge`,{method:`POST`},`Не удалось влить копию задания`)}async function Ay(e){return by(`/api/agent/jobs/${e}/worktree/discard`,{method:`POST`},`Не удалось удалить копию задания`)}async function jy(e,t,n=!1){return(await by(`/api/agent/jobs/${e}/retry`,{method:`POST`,body:JSON.stringify({task:t,append:n})},`Не удалось повторить задание`)).job}async function My(e,t){return by(`/api/agent/jobs/${e}/send`,{method:`POST`,body:JSON.stringify({text:t})},`Не удалось отправить уточнение заданию`)}async function Ny(e,t){return(await by(`/api/agent/jobs/${e}/fork`,{method:`POST`,body:JSON.stringify({task:t})},`Не удалось создать форк задания`)).job}async function Py(e,t){let n=await fetch(`/api/agent/lens`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e),signal:t}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error||`Lens недоступен`);if(typeof r.text!=`string`||!r.text.trim())throw Error(`Lens не вернул описание`);return{text:r.text.trim(),at:typeof r.at==`number`?r.at:Date.now()}}async function Fy(e,t,n,r){await iy(`/api/agent/sessions/update`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({backend:e,projectId:t,sessionId:n,...r})},`Не удалось изменить сессию`)}async function Iy(e,t,n,r){await iy(`/api/agent/sessions/delete`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({backend:e,projectId:t,sessionId:n,...r?{chat:r}:{}})},`Не удалось удалить сессию`)}async function Ly(e,t,n){return(await fetch(`/api/agent/inject`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({messageId:e,text:t,inputId:n})})).ok}function Ry(e){try{let t=new URL(e),n=decodeURIComponent(t.pathname);return t.host&&t.host!==`localhost`&&(n=`//${t.host}${n}`),/^\/[a-z]:[\\/]/i.test(n)&&(n=n.slice(1)),n||void 0}catch{return}}function zy(e){return e.startsWith(`/`)||/^[a-z]:[\\/]/i.test(e)||e.startsWith(`\\\\`)}function By(e,t){if(zy(t))return t;let n=e.replace(/[\\/]+$/,``);return n?`${n}/${t.replace(/^\.\//,``)}`:t}var Vy=/^(?:https?:|mailto:|tel:)/i,Hy=/^[a-z][a-z\d+.-]*:/i,Uy=/#L(\d+)(?:-L?(\d+))?(?:C(\d+))?$/i,Wy=/:(\d+)(?:-(\d+))?(?::(\d+))?$/;function Gy(e){try{return decodeURIComponent(e)}catch{return e}}function Ky(e){let t=Uy.exec(e);if(t)return{path:e.slice(0,t.index),line:Number(t[1]),...t[2]?{endLine:Number(t[2])}:{},...t[3]?{column:Number(t[3])}:{}};let n=Wy.exec(e);return n?{path:e.slice(0,n.index),line:Number(n[1]),...n[2]?{endLine:Number(n[2])}:{},...n[3]?{column:Number(n[3])}:{}}:{path:e}}function qy(e){let t=e.trim();if(!t)return{href:e,kind:`other`};if(t.startsWith(`#`))return{href:e,kind:`anchor`};if(Vy.test(t)||t.startsWith(`//`))return{href:e,kind:`web`};if(/^file:\/\//i.test(t)){let{path:n,...r}=Ky(t),i=Ry(n);return i?{href:e,kind:`file`,path:i,external:!0,...r}:{href:e,kind:`other`}}if(Hy.test(t)&&!zy(t))return{href:e,kind:`other`};let{path:n,...r}=Ky(t),i=(n.split(/[?#]/)[0]??``).replace(/^\.\//,``);if(!i)return{href:e,kind:`anchor`};let a=Gy(i);return{href:e,kind:`file`,path:a,external:zy(a),...r}}function Jy(e,t=80){let n=e.replace(/\s+/g,` `).trim();return n?n.length<=t?n:`${n.slice(0,t-1).trimEnd()}…`:``}function Yy(e,t,n){return e?.replace(/\s+/g,` `).trim()||Jy(t)||n}var Xy=/^[a-z][a-z0-9-]{1,39}$/,Zy={name:80,description:400,agent:40,selection:24,key:100,value:300,prompt:8e3,resources:40,resource:80};function Qy(e){if(!Array.isArray(e))return;let t=[];for(let n of e.slice(0,Zy.resources)){if(typeof n!=`string`)continue;let e=n.trim();!e||e.length>Zy.resource||t.includes(e)||t.push(e)}return t}function $y(e){return typeof e==`string`&&e.trim().slice(0,Zy.prompt)||void 0}function eb(e){let t={};if(!e||typeof e!=`object`||Array.isArray(e))return t;for(let[n,r]of Object.entries(e).slice(0,Zy.selection)){if(typeof r!=`string`)continue;let e=n.trim(),i=r.trim();!e||e.length>Zy.key||!i||i.length>Zy.value||(t[e]=i)}return t}function tb(e){return{roleId:e.id,name:e.name,selection:{...e.selection},...e.permissionMode?{permissionMode:e.permissionMode}:{},...e.prompt?{prompt:e.prompt}:{},...e.skills===void 0?{}:{skills:[...e.skills]},...e.mcp===void 0?{}:{mcp:[...e.mcp]}}}function nb(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=typeof t.roleId==`string`?t.roleId.trim():``;if(!Xy.test(n))return;let r=typeof t.name==`string`?t.name.trim().slice(0,Zy.name):``;if(!r)return;let i=t.permissionMode==="default"||t.permissionMode===`auto`||t.permissionMode===`bypassPermissions`?t.permissionMode:void 0,a=$y(t.prompt),o=Qy(t.skills),s=Qy(t.mcp);return{roleId:n,name:r,selection:eb(t.selection),...i?{permissionMode:i}:{},...a?{prompt:a}:{},...o===void 0?{}:{skills:o},...s===void 0?{}:{mcp:s}}}function rb(e){return JSON.stringify(e)}function ib(e){if(typeof e==`string`)try{return nb(JSON.parse(e))}catch{return}}function ab(e,t,n,r){for(let i of qn()){let a=i.builtin?`agent`:i.program,o=`${i.backend}:${e}:`;if(t.startsWith(o)&&t.length>o.length)return{command:`ide.workbench.${a}.open`,args:{chatId:t.slice(o.length),...n?{title:n}:{},...r?{role:rb(r)}:{}}}}}function ob(e,t){let n=e[t];if(typeof n!=`string`||!n)throw Error(`Укажите ${t}`);return n}function sb(e,t,n){if(typeof t.turnId==`string`&&t.turnId)return t.turnId;let r=e.turns().findLast(e=>e.role===n);if(!r)throw Error(`В чате ещё нет сообщений`);return r.id}function cb(e){if(e.type===`file`){let t=e.directory&&!e.path.endsWith(`/`)?`${e.path}/`:e.path,n=/\s/.test(t)?`@"${t}"`:`@${t}`;return e.range?`${n}:${e.range.from}-${e.range.to}`:n}return e.type===`command`?`/${e.name}`:`[${e.name}]`}function lb(e){return e.map(e=>e.type===`text`?e.text:cb(e)).join(``)}function ub(e){let t=[];for(let n of e)if(n.type!==`text`)t.push(n);else if(n.text){let e=t.at(-1);e?.type===`text`?t[t.length-1]={type:`text`,text:e.text+n.text}:t.push(n)}return t}var db=e=>!!e?.some(e=>e.type!==`text`),fb={file:`<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/>`,directory:`<path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"/>`,image:`<rect width="18" height="18" x="3" y="3" rx="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.09-3.09a2 2 0 0 0-2.82 0L6 21"/>`,command:`<path d="M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"/>`};function pb(e){return e.type===`image`&&/^[0-9a-f]{16}$/.test(e.id)?`<img class="chip-thumb" src="${C(`/api/agent/attachments/${e.id}`)}" alt="" width="14" height="14">`:mb(e)}function mb(e){return`<svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${fb[e.type===`file`&&e.directory?`directory`:e.type]}</svg>`}function hb(e){if(e.type===`file`){let t=e.path.replace(/[\\/]+$/,``).split(/[\\/]/).pop()||e.path;return e.range?`${t}:${e.range.from===e.range.to?`${e.range.from}`:`${e.range.from}–${e.range.to}`}`:t}return e.type===`command`?`/${e.name}`:e.name}function gb(e){if(e.type===`file`){if(!e.range)return e.path;let t=e.range.from===e.range.to?`строка ${e.range.from}`:`строки ${e.range.from}–${e.range.to}`;return`${e.path} · ${t}`}return e.type===`command`?`/${e.name}`:e.name}var _b=class extends Pi{chip;constructor(e){super(),this.chip=e}eq(e){return cb(e.chip)===cb(this.chip)}toDOM(){let e=document.createElement(`span`);e.className=`composer-chip ${this.chip.type}`,e.title=gb(this.chip),e.dataset.chip=JSON.stringify(this.chip),e.innerHTML=pb(this.chip);let t=document.createElement(`span`);return t.className=`composer-chip-label u-truncate`,t.textContent=hb(this.chip),e.append(t),e}ignoreEvent(){return!1}},vb=Oi.define(),yb=Fi.define({create:()=>Wi.none,update(e,t){let n=e.map(t.changes);n=n.update({filter:(e,t,n)=>t-e===cb(n.spec.widget.chip).length});for(let e of t.effects)e.is(vb)&&(n=n.update({add:[Wi.replace({widget:new _b(e.value.chip)}).range(e.value.from,e.value.to)]}));return n},provide:e=>[Li.decorations.from(e),Li.atomicRanges.of(t=>t.state.field(e))]});function bb(e){let t=[];return e.field(yb).between(0,e.doc.length,(e,n,r)=>{t.push({from:e,to:n,chip:r.spec.widget.chip})}),t}function xb(e){let t=[],n=0;for(let{from:r,to:i,chip:a}of bb(e))r>n&&t.push({type:`text`,text:e.doc.sliceString(n,r)}),t.push(a),n=i;return n<e.doc.length&&t.push({type:`text`,text:e.doc.sliceString(n)}),ub(t)}function Sb(e,t){let n=``,r=[];for(let e of t)if(e.type===`text`)n+=e.text;else{let t=cb(e);r.push({from:n.length,to:n.length+t.length,chip:e}),n+=t}e.dispatch({changes:{from:0,to:e.state.doc.length,insert:n},effects:r.map(e=>vb.of(e)),selection:Hi.cursor(n.length)})}function Cb(e,t,n,r){let i=cb(r);e.dispatch({changes:{from:t,to:n,insert:`${i} `},effects:vb.of({from:t,to:t+i.length,chip:r}),selection:Hi.cursor(t+i.length+1),userEvent:`input.complete`})}function wb(e){return t=>{let{main:n}=t.state.selection;if(!n.empty)return!1;let r=bb(t.state).find(t=>e?t.from===n.head:t.to===n.head);return r?(t.dispatch({changes:{from:r.from,to:r.to},userEvent:`delete`}),!0):!1}}var Tb=wb(!1),Eb=wb(!0),Db=[yb];function Ob(e){let t=Math.max(0,Math.floor(e/1e3));if(t<60)return`${t} с`;let n=Math.floor(t/60),r=t%60;return n<60?`${n}:${String(r).padStart(2,`0`)}`:`${Math.floor(n/60)}:${String(n%60).padStart(2,`0`)}:${String(r).padStart(2,`0`)}`}var kb=X(Date.now()),Ab,jb=0;function Mb(){return jb++,kb.value=Date.now(),Ab??=setInterval(()=>{kb.value=Date.now()},1e3),Gt()&&zt(()=>{jb--,!jb&&Ab!==void 0&&(clearInterval(Ab),Ab=void 0)}),kb}var Nb=`Это новый проект в Projector. Посмотри файлы в папке (package.json, Makefile, README), предложи команды запуска (dev, build, test) и адрес предпросмотра. Если папка пустая — предложи варианты инициализации. Покажи план и применяй настройки проекта командами Projector только после моего подтверждения.`;function Pb(){return typeof document<`u`&&document.visibilityState===`hidden`}function Fb(e,t,n){if(typeof Notification<`u`&&Notification.permission===`granted`&&Pb())try{new Notification(e,{body:t.slice(0,200),tag:n})}catch{}}async function Ib(){if(typeof Notification<`u`&&Notification.permission==="default")try{await Notification.requestPermission()}catch{}}function Lb(e,t){Fb(t?`Агент остановился с ошибкой`:`Агент закончил`,e.trim(),`agent-answer`)}function Rb(e){Fb(`Агент задаёт вопрос`,e,`agent-question`)}function zb(e){Fb(`Агент ждёт разрешения`,e,`agent-permission`)}function Bb(e,t,n){Fb(t,n,`agent-job:${e}`)}function Vb(e,t){if(e?.role!==`assistant`)return;let n=sr(t)?.plan;if(n)for(let t of e.tools.toReversed()){if(!t.input)continue;let e=n({name:t.name,input:t.input});if(e)return e}}function Hb(e,t){let n=e.filter(e=>e.role===`assistant`);for(let e of n.toReversed()){let r=Vb(e,t);if(r)return e===n.at(-1)||r.some(e=>e.status!==`completed`)?r:[]}return[]}function Ub(e){let t=new Map;for(let n of e)for(let e of n.tasks??[])t.set(e.id,e);return[...t.values()]}function Wb(e){let t=new Set(e.findLast(e=>e.role===`assistant`)?.tasks?.map(e=>e.id));return Ub(e).filter(e=>e.status===`running`||t.has(e.id))}function Gb(e,t){let n=Ub(e).find(e=>e.id===t);if(!n)return;let r=e.flatMap(e=>e.tools),i=n.tool?r.find(e=>e.id===n.tool):void 0;return{task:n,call:i,calls:i?r.filter(e=>e.parent===i.id):[]}}function Kb(e,t){let n=e.durationMs??0;if(e.status===`running`){let r=e.startedAt?Math.max(n,t-e.startedAt):n;return r?Ob(r):``}return n?Ob(n):e.startedAt!==void 0&&e.endedAt!==void 0?Ob(e.endedAt-e.startedAt):``}var qb={running:`Выполняется`,done:`Готово`,error:`Ошибка`,stopped:`Остановлено`};function Jb(e){return(e??``).replace(/```[\s\S]*?```/g,` `).replace(/`([^`\n]*)`/g,`$1`).replace(/\[([^\]]*)\]\([^)]*\)/g,`$1`).replace(/\*\*([^*\n]+)\*\*/g,`$1`).replace(/__([^_\n]+)__/g,`$1`).replace(/(^|[\s(])\*([^*\n]+)\*(?=[\s).,!?:;]|$)/g,`$1$2`).replace(/^#{1,6}\s+/gm,``).replace(/\s+/g,` `).trim()}function Yb(e){let{task:t,call:n,calls:r}=e;return[`${t.title||`Задача`} — ${qb[t.status]}`,t.subagent?`Субагент: ${t.subagent}`:``,n?.input?`Задание: ${n.input.slice(0,1e3)}`:``,r.length?`Вызовы: ${r.map(e=>`${e.name} — ${e.status}`).join(`; `)}`:``,t.summary?`Итог: ${t.summary}`:``].filter(Boolean).join(`
|
|
22
|
+
`)}var Xb=/\.(?:avif|bmp|gif|heic|heif|ico|jpe?g|png|svg|tiff?|webp)$/i;function Zb(e){let t=e.split(/[?#]/)[0]??``;return Xb.test(t)}function Qb(e){let t=e.split(/[\\/]/);return(t.at(-1)??``).toLowerCase()===`skill.md`?t.at(-2)??``:``}var $b=[`command`,`query`,`path`,`file_path`,`filePath`,`pattern`,`url`,`skill`,`name`];function ex(e){try{let t=JSON.parse(e);return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}catch{return}}function tx(e){return ex(e)}function nx(e){let t=ex(e);if(!t)return``;for(let e of[`file_path`,`filePath`,`path`])if(typeof t[e]==`string`&&t[e])return t[e];return``}function rx(e){let t=ex(e);if(!t)return``;for(let e of $b)if(typeof t[e]==`string`&&t[e])return t[e];return``}var ix=e=>typeof e==`string`?e.split(`
|
|
23
|
+
`):[``],ax=(e,t)=>[...ix(e).map(e=>`- ${e}`),...ix(t).map(e=>`+ ${e}`)],ox=e=>[`edit`,`multiedit`].includes(e.toLowerCase()),sx=e=>typeof e==`string`?e:JSON.stringify(e);function cx(e,t){let n=ex(t);if(!n)return t;let r=e.toLowerCase(),i=typeof n.description==`string`?n.description:``;if(typeof n.command==`string`&&r!==`execute_command`&&r!==`describe_command`&&r!==`list_commands`)return[i&&`# ${i}`,`$ ${n.command}`].filter(Boolean).join(`
|
|
24
|
+
`);let a=typeof n.file_path==`string`?n.file_path:typeof n.filePath==`string`?n.filePath:n.path;if(typeof a==`string`&&typeof n.content==`string`)return`${a}\n\n${n.content}`;let o=n.old_string??n.oldString,s=n.new_string??n.newString;if(typeof a==`string`&&typeof o==`string`)return[a,``,...ax(o,s)].join(`
|
|
25
|
+
`);if(typeof a==`string`&&Array.isArray(n.edits))return[a,``,...n.edits.flatMap((e,t)=>[...t?[`@@`]:[],...ax(e.old_string??e.oldString,e.new_string??e.newString)])].join(`
|
|
26
|
+
`);if(r===`exitplanmode`&&typeof n.plan==`string`)return n.plan;let c=Object.entries(n).filter(([,e])=>e!==void 0&&e!==``);return c.length?c.map(([e,t])=>{let n=sx(t);return n.includes(`
|
|
27
|
+
`)?`${e}:\n${n}`:`${e}: ${n}`}).join(`
|
|
28
|
+
`):``}var lx={list_commands:`Поиск команд`,describe_command:`Описание команды`,execute_command:`Вызов команды`,describe_widget:`Описание виджета`,use_skill:`Загрузка навыка`,Skill:`Загрузка навыка`,skill:`Загрузка навыка`,bash:`Команда`,shell:`Команда`,terminal:`Терминал`,run:`Команда`,run_command:`Команда`,ask_user:`Вопрос пользователю`,find_projects:`Поиск проектов`,inspect_path:`Обзор проекта`,list_directory:`Обзор папки`,add_project:`Добавление проекта`,add_projects:`Добавление проектов`,list_projects:`Список проектов`,Read:`Чтение файла`,read:`Чтение файла`,read_file:`Чтение файла`,ReadMediaFile:`Чтение изображения`,read_media_file:`Чтение изображения`,view_image:`Чтение изображения`,viewimage:`Чтение изображения`,Edit:`Правка файла`,edit:`Правка файла`,edit_file:`Правка файла`,MultiEdit:`Правка файла`,multiedit:`Правка файла`,apply_patch:`Правка файла`,Write:`Запись файла`,write:`Запись файла`,write_file:`Запись файла`,Grep:`Поиск в файлах`,grep:`Поиск в файлах`,Glob:`Поиск файлов`,glob:`Поиск файлов`,WebFetch:`Загрузка страницы`,webfetch:`Загрузка страницы`,web_fetch:`Загрузка страницы`,WebSearch:`Поиск в сети`,websearch:`Поиск в сети`,web_search:`Поиск в сети`,Task:`Субагент`,task:`Субагент`,agent:`Субагент`,subagent:`Субагент`,TodoWrite:`План задач`,todowrite:`План задач`,TodoList:`План задач`},ux=Object.fromEntries(Object.entries(lx).map(([e,t])=>[e.toLowerCase(),t])),dx=e=>/^(?:invoke|load|use)[\s_]*skill\b/i.test(e)||/^skill\b/i.test(e);function fx(e,t=``){if(!dx(e))return``;let n=/^(?:invoke|load|use)[\s_]*skill\s+(.+)$/i.exec(e)?.[1]?.trim();if(n)return n;let r=tx(t);if(!r)return``;for(let e of[`skill`,`name`,`id`]){let t=r[e];if(typeof t==`string`&&t.trim())return t.trim()}return``}var px=(e,t=``)=>{if(dx(e)){let n=fx(e,t);return n?`Загрузка навыка: ${n}`:`Загрузка навыка`}return/^reading media\b/i.test(e)?`Чтение изображения`:lx[e]||ux[e.toLowerCase()]||e},mx=new Map(Object.entries({read:[`read`,`read_file`,`readfile`,`read_file_content`,`readmediafile`,`read_media_file`,`view_image`,`viewimage`],write:[`write`,`write_file`,`writefile`,`create_file`],edit:[`edit`,`multiedit`,`edit_file`,`apply_patch`,`patch`],bash:[`bash`,`shell`,`terminal`,`run`,`run_command`,`execute`,`command`,`sh`],search:[`grep`,`glob`,`rg`,`search`,`find`,`list_directory`,`ls`,`list_files`],web:[`webfetch`,`web_fetch`,`websearch`,`web_search`,`fetch`,`fetch_url`],task:[`task`,`agent`,`subagent`,`delegate`]}).flatMap(([e,t])=>t.map(t=>[t,e]))),hx={read:`read`,edit:`edit`,delete:`write`,move:`write`,search:`search`,execute:`bash`,fetch:`web`},gx=[[/^reading media\b/i,`read`]];function _x(e,t){return mx.get(e.toLowerCase())??(t?hx[t]:void 0)??gx.find(([t])=>t.test(e))?.[1]??`other`}function vx(e,t){return!t||!e.startsWith(`${t}/`)?e:e.slice(t.length+1)}var yx=e=>e?e.split(`
|
|
29
|
+
`).length:0,bx=e=>typeof e==`string`&&e?e.split(`
|
|
30
|
+
`).length:0;function xx(e,t){let n=typeof e==`string`&&e?e.split(`
|
|
31
|
+
`):[],r=typeof t==`string`&&t?t.split(`
|
|
32
|
+
`):[],i=0;for(;i<n.length&&i<r.length&&n[i]===r[i];)i++;let a=n.length,o=r.length;for(;a>i&&o>i&&n[a-1]===r[o-1];)a--,o--;let s=n.slice(i,a),c=r.slice(i,o);if(!s.length||!c.length||s.length*c.length>4e4)return{added:c.length,removed:s.length};let l=new Uint16Array(c.length+1);for(let e=0;e<s.length;e++){let t=0;for(let n=0;n<c.length;n++){let r=l[n+1];l[n+1]=s[e]===c[n]?t+1:Math.max(r,l[n]),t=r}}let u=l[c.length];return{added:c.length-u,removed:s.length-u}}function Sx(e){if(e)try{let t=JSON.parse(e);return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}catch{return}}function Cx(e){let t=Sx(e)?.metadata,n=t&&typeof t==`object`?t.files:void 0;return Array.isArray(n)?n.flatMap(e=>{if(!e||typeof e!=`object`)return[];let{file:t,additions:n,deletions:r}=e;return typeof t!=`string`||typeof n!=`number`||typeof r!=`number`?[]:[{path:t,added:n,removed:r}]}):[]}function wx(e,t=``){let n=new Map,r=(e,r,i)=>{if(typeof e!=`string`||!e)return;let a=t&&e.startsWith(`${t}/`)?e.slice(t.length+1):e,o=n.get(a)??{path:a,added:0,removed:0};o.added+=r,o.removed+=i,n.set(a,o)};for(let t of e){if(t.status===`error`)continue;let e=Cx(t.detail);if(e.length){for(let t of e)r(t.path,t.added,t.removed);continue}let n=Sx(t.input);if(!n)continue;let i=t.name.toLowerCase(),a=n.file_path??n.filePath??n.path;if(i===`write`)r(a,bx(n.content),0);else if(i===`edit`){let{added:e,removed:t}=xx(n.old_string??n.oldString,n.new_string??n.newString);r(a,e,t)}else if(i===`multiedit`&&Array.isArray(n.edits))for(let e of n.edits){let{added:t,removed:n}=xx(e.old_string??e.oldString,e.new_string??e.newString);r(a,t,n)}}return[...n.values()]}function Tx(e){let t=(e.variants?.length??0)+1;return{count:t,position:Math.min(e.slot??t-1,t-1)}}function Ex(e,t){let n=e[t],{position:r}=Tx(n),i=n.variants??[],a=e.splice(t);return a[0].variants=void 0,a[0].slot=void 0,[...i.slice(0,r),a,...i.slice(r)]}function Dx(e,t){let n=t.slice(-20);e.variants=n,e.slot=n.length}function Ox(e,t,n){let r=e[t];if(!r||r.role!==`user`)return!1;let{count:i,position:a}=Tx(r);if(n===a||n<0||n>=i)return!1;let o=r.variants??[],s=e.splice(t);s[0].variants=void 0,s[0].slot=void 0;let c=[...o.slice(0,a),s,...o.slice(a)],l=c[n];return l[0].variants=c.filter((e,t)=>t!==n),l[0].slot=n,e.push(...l),!0}function kx(e){return JSON.parse(JSON.stringify(e))}function Ax(e,t,n){let r=e.findIndex(e=>e.id===t);if(r<0)return;let i=e[r],a=r;if(n===`before`){if(i.role!==`user`)return;a=r-1}else if(i.role===`user`){if(e[r+1]?.role!==`assistant`)return;a=r+1}let o=kx(e.slice(0,a+1));for(let e of o){e.run=void 0,e.variants=void 0,e.slot=void 0;for(let t of e.tasks??[])t.status===`running`&&(t.status=`stopped`,t.summary??=`Ветка отделена: задача осталась в исходном чате`)}return{turns:o,draft:n===`before`?{text:i.text,parts:kx(i.content??[])}:void 0}}function Wee(e,t){let{backend:n,projectId:r,ready:i,persist:a,send:o,stop:s}=t;R(()=>e.queue,a,{deep:!0,flush:`sync`});function c(){let t=e.turns.findLast(e=>e.role===`assistant`);!t||e.capabilities.branchSession&&t.tail||(t.detached=!0)}let l;async function u(t){if(await l,e.busy||!e.queue.length)return;if(t||e.error&&!e.interrupting){e.interrupting=!1;return}e.interrupting=!1;let n=e.queue.shift(),r={...n.auto?{auto:n.auto}:{},...n.autoTitle?{autoTitle:n.autoTitle}:{},...n.form?{form:n.form}:{}};Object.keys(r).length?o(n.text,n.parts,r):o(n.text,n.parts)}async function d(t){let n=e.queue.findIndex(e=>e.id===t&&!e.delivering);if(n<0)return;let[r]=e.queue.splice(n,1);if(e.queue.unshift(r),!e.busy)return u(!1);e.interrupting=!0,s()}async function f(t){if(l)return e.queue.find(e=>e.id===t)?.delivering?l:!1;let n=e.queue.find(e=>e.id===t);if(!n||!e.busy||!e.capabilities.inject||!e.activeMessage||n.parts.some(e=>e.type===`image`))return!1;let r=e.activeMessage;n.delivering=!0,l=(async()=>{try{let i=await Ly(r,n.text,n.id);return i&&(e.queue=e.queue.filter(e=>e.id!==t),a()),i}catch{return!1}finally{n.delivering=!1}})();try{return await l}finally{l=void 0}}async function p(){if(!l){for(;e.busy&&e.queue.length;)if(!await f(e.queue[0].id))return}}function m(t){e.queue=e.queue.filter(e=>e.id!==t||e.delivering)}function h(t){let n=e.turns.findIndex(e=>e.id===t&&e.role===`user`);if(n<0||e.busy)return;let r=e.turns[n],{text:i,content:o}=r;return e.stash={index:n,versions:Ex(e.turns,n)},e.error=``,c(),a(),{...r,text:i,content:o,tools:[]}}function g(t){let n=e.turns.find(e=>e.id===t&&e.role===`user`);n&&!e.busy&&(e.editing=t,e.draft=n.text,e.draftParts=n.content??[])}function _(){e.editing&&(e.editing=``,e.draft=``,e.draftParts=[])}function v(){let t=e.editing;e.editing=``;let n=e.turns.findIndex(e=>e.id===t&&e.role===`user`);n<0||(e.stash={index:n,versions:Ex(e.turns,n)},e.error=``,c())}async function y(t){let n=e.turns.findIndex(e=>e.id===t),r=e.turns.slice(0,n+1).findLast(e=>e.role===`user`);if(!r||e.busy)return;let i=h(r.id);i&&await o(i.text,i.content??[],i.form?{form:i.form}:void 0)}function b(t,n){let r=e.turns.findIndex(e=>e.id===t);e.busy||r<0||!Ox(e.turns,r,n)||(e.stash=void 0,e.editing=``,c(),a())}function x(t){let n=e.turns.findIndex(e=>e.id===t&&e.role===`user`),r=e.turns[n+1];return r?.role===`assistant`?r.session?.id:void 0}function S(t){return!!e.capabilities.rewindFiles&&!!x(t)}async function C(t,a){if(await i,!S(t))throw Error(`Файлы к этому шагу вернуть нельзя: копии нет`);if(e.busy)throw Error(`Дождитесь окончания ответа`);return fy({backend:n,projectId:r,sessionId:x(t)??``,messageId:t,dryRun:a,worktree:w()})}function w(){return e.turns.findLast(e=>e.role===`assistant`&&e.worktree)?.worktree?.id}function T(e,t){for(let n of e){n.worktree?.id===t&&(n.worktree=void 0);for(let e of n.variants??[])T(e,t)}}function ee(t){T(e.turns,t);let n=e.turns.findLast(e=>e.role===`assistant`);n&&(n.detached=!0),a()}async function E(){let e=w();return e?my(r,e):void 0}async function te(){let t=w();if(!t)throw Error(`Чат работает не в изолированной копии`);if(e.busy)throw Error(`Дождитесь окончания ответа`);let n=await gy(r,t);return ee(t),n.message??``}async function D(){let t=w();if(!t)throw Error(`Чат работает не в изолированной копии`);if(e.busy)throw Error(`Дождитесь окончания ответа`);await _y(r,t),ee(t)}return{drainQueue:u,deliverQueue:p,sendQueuedNow:d,injectQueued:f,removeQueued:m,edit:g,cancelEdit:_,applyEdit:v,retry:y,showVersion:b,canRewindFiles:S,rewindFiles:C,isolate:z({get:()=>e.isolate,set:t=>{e.isolate=t}}),worktreeId:w,worktreeInfo:E,mergeCopy:te,discardCopy:D}}function jx(e,t,n){return`${e}:${t}:${n}`}var Gee=/^\/(?:api|assets|file-icons)(?:\/|$)/i;function Mx(e,t){if(e)return Gn(e,t,!0)||void 0}function Nx(e){let t=e.split(/[?#]/)[0]??``;if(t)try{return decodeURIComponent(t)}catch{return t}}function Px(e,t){let n=e.trim();if(!n)return;if(/^https?:\/\//i.test(n)||/^data:image\//i.test(n)||/^blob:/i.test(n))return n;if(n.startsWith(`//`))return`https:${n}`;if(/^file:\/\//i.test(n)){let e=Ry(n);return e?Mx(t,e):void 0}if(/^[a-z]:[\\/]/i.test(n)){let e=Nx(n);return e?Mx(t,e):void 0}if(n.startsWith(`/`)){if(Gee.test(n))return C(n);let e=Nx(n);return e?Mx(t,e):void 0}if(/^[a-z][a-z\d+.-]*:/i.test(n)||!t||n.includes(`\\`)||n.split(`/`).includes(`..`))return;let r=Yr(n,``);if(r)return Gn(t,r)||void 0}var Fx=Symbol(`chat-project`),Ix=Symbol(`chat-link-actions`);function Lx(e,t){ot(Fx,e),t&&ot(Ix,qee(e,t))}function Kee(e,t){if(!t)return;let n=/^[a-z]:[\\/]/i.test(t)&&/^[a-z]:[\\/]/i.test(e),r=e=>{let t=e.replace(/\\/g,`/`);return n?t.toLowerCase():t};if(r(e).startsWith(`${r(t)}/`))return e.slice(t.length+1)}function qee(e,t){let n=`editor:${e}`,r;function i(){return r??=Vn(e,`root`).then(e=>e.root).catch(e=>{throw r=void 0,e}),r}function a(e,t){return e instanceof Error&&e.message?e.message:t}async function o(e,r){try{let r=e.path,a=e.external;if(a){let e=(await i().catch(()=>``)).replace(/[\\/]+$/,``),t=Kee(r,e);t!==void 0&&(r=t,a=!1)}await t.executeCommand(`ide.editor.path.open`,{path:r,...a?{external:!0}:{},...e.line?{line:e.line}:{},...e.endLine?{endLine:e.endLine}:{},...e.column?{column:e.column}:{}},{scope:n})}catch(e){Gr(r,a(e,`Не удалось открыть файл`),`error`)}}async function s(e,t){try{let n=e.external?e.path:By(await i(),e.path);await ni(t,n,`Абсолютный путь скопирован`,`Не удалось скопировать путь`)}catch(e){Gr(t,a(e,`Не удалось скопировать путь`),`error`)}}async function c(e,t){await ni(t,e.path,`Путь скопирован`,`Не удалось скопировать путь`)}async function l(e,t){await ni(t,e,`Ссылка скопирована`,`Не удалось скопировать ссылку`)}return{openFile:o,copyAbsolute:s,copyRelative:c,copyAddress:l}}var Rx=ut(new Map),zx=new Map;function Jee(e){return Rx.set(e.key,e),zx.has(e.projectId)||zx.set(e.projectId,e.key),()=>{Rx.get(e.key)===e&&Rx.delete(e.key),zx.get(e.projectId)===e.key&&zx.delete(e.projectId)}}function Bx(e){Rx.get(e.key)===e&&zx.set(e.projectId,e.key)}function Vx(e){let t=[...Rx.values()].filter(t=>t.projectId===e),n=zx.get(e),r=e=>Number(e.visible())*2+Number(e.key===n);return t.sort((e,t)=>r(t)-r(e))}function Hx(e,t,n=()=>!0){let r=Vx(e).filter(n);if(typeof t==`string`&&t){let e=r.find(e=>e.key===t);if(!e)throw Error(`Чат «${t}» не открыт; открытые даёт ide.agent.chats.list`);return e}let i=r[0];if(!i)throw Error(`Нет открытого чата агента`);return i}function Yee(){return[...Rx.values()]}async function Ux(e,t,n=3e3){let r=()=>Vx(e).find(e=>!t||e.key===t),i=Date.now();for(;;){let e=r();if(e)return await Ut(),e;if(Date.now()-i>n)throw Error(`Чат не открылся`);await new Promise(e=>setTimeout(e,20))}}var Wx=()=>at({turns:[],loading:!1,draft:``,draftParts:[],busy:!1,error:``,phase:``,lastEventAt:0,permissions:[],questions:[],secrets:[],permissionMode:`default`,controls:[],capabilities:{},commands:[],selection:{},roleSnapshot:void 0,controlsError:``,sessions:[],sessionsLoading:!1,sessionsError:``,recent:[],recentLoading:!1,recentError:``,abort:void 0,isolate:!1,featureOverrides:void 0,judgeOverride:void 0,activeMessage:``,queue:[],interrupting:!1,editing:``,stash:void 0});function Gx(e){return e.map(({delivering:e,...t})=>t)}function Xee(e){return Array.isArray(e)?e.flatMap(e=>{if(!e||typeof e!=`object`)return[];let{id:t,text:n,parts:r}=e;if(typeof t!=`string`||typeof n!=`string`||!Array.isArray(r))return[];let{delivering:i,...a}=e;return[a]}):[]}function Kx(e){if(e==null)return``;if(typeof e==`string`)return e.slice(0,8e3);try{let t=JSON.stringify(e,null,2);if(t.length<=8e3)return t;if(typeof e==`object`&&!Array.isArray(e)){let t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,typeof t==`string`&&t.length>3500?`${t.slice(0,3500)}…`:t])),n=JSON.stringify(t,null,2);if(n.length<=8e3)return n}return t.slice(0,8e3)}catch{return``}}var Zee=1500,Qee={},qx=Qee.chats??={releases:new Map,viewers:new Map,sessions:new Map,loads:new Map,saves:new Map,queued:new Set};qx.queued??=new Set;for(let e of qx.sessions.values())e.capabilities??={};var{releases:Jx,viewers:Yx,sessions:Xx,loads:Zx,saves:Qx,queued:$x}=qx;function $ee(e,t){return{attach(){Yx.set(e,(Yx.get(e)??0)+1)},release(){Yx.set(e,Math.max(0,(Yx.get(e)??1)-1)),!Yx.get(e)&&(clearTimeout(Jx.get(e)),Jx.set(e,setTimeout(()=>{Jx.delete(e),Yx.get(e)||t()},Zee)))}}}function ete(e){return e.role===`assistant`?(e.parts??[]).filter(e=>e.type===`thought`).map(e=>e.text.trim()).filter(Boolean).join(`
|
|
33
|
+
|
|
34
|
+
`):``}function eS(e,t=!1,n=!1){return e.flatMap(e=>{let t=()=>({role:e.role,text:e.text,thoughts:n?ete(e):``,tools:e.tools});if(e.role!==`assistant`||!e.parts?.some(e=>e.type===`note`))return[t()];let r=[],i=``,a=``,o=[],s=()=>{(i||a||o.length)&&r.push({role:`assistant`,text:i,thoughts:a,tools:o}),i=``,a=``,o=[]};for(let t of e.parts)if(t.type===`text`)i+=t.text;else if(t.type===`thought`&&n)a+=`${a?`
|
|
35
|
+
|
|
36
|
+
`:``}${t.text}`;else if(t.type===`tool`){let n=e.tools.find(e=>e.id===t.id);n&&o.push(n)}else t.type===`note`&&(s(),r.push({role:`user`,text:t.text,thoughts:``,tools:[]}));return s(),r}).flatMap(e=>{let n=(t?e.tools:[]).filter(e=>!e.parent&&e.status!==`running`).map(e=>({id:e.id,name:e.name,...e.input?{input:e.input}:{},output:e.detail,...e.status===`error`?{failed:!0}:{}})),r=e.thoughts.trim();return!e.text.trim()&&!r&&!n.length?[]:[{role:e.role,content:e.text,...r?{thoughts:r}:{},...n.length?{tools:n}:{}}]})}var tS=typeof BroadcastChannel>`u`?null:new BroadcastChannel(`projector:agent-chat`),nS=new Map;tS?.addEventListener(`message`,({data:e})=>{if(typeof e?.key==`string`)for(let t of nS.get(e.key)??[])t()});function tte(e){tS?.postMessage({key:e})}function nte(e,t,n){let r=!1,i=()=>{r||t()||(r=!0,n().finally(()=>{r=!1}))},a=nS.get(e)??new Set;nS.set(e,a),a.add(i);let o=()=>{document.visibilityState===`visible`&&i()};document.addEventListener(`visibilitychange`,o),Gt()&&zt(()=>{a.delete(i),document.removeEventListener(`visibilitychange`,o)})}function rte(e){return{draftParts:z({get:()=>e.draftParts,set:t=>{e.draftParts=t}}),draft:z({get:()=>e.draft,set:t=>{e.draft=t}}),busy:z(()=>e.busy),loading:z(()=>e.loading),error:z({get:()=>e.error,set:t=>{e.error=t}}),phase:z(()=>e.phase),permissions:z(()=>e.permissions),questions:z(()=>e.questions),secrets:z(()=>e.secrets)}}function ite(e,t){return{featureOverrides:z(()=>e.featureOverrides),setFeatureOverrides(n){e.featureOverrides=n,t()}}}function ate(e,t){return{judgeOverride:z(()=>e.judgeOverride),setJudgeOverride(n){e.judgeOverride=n,t()}}}var rS=new Map;function ote(e,t){rS.set(e,t)}function ste(e){let t=rS.get(e);return rS.delete(e),t}function cte(e){let t=e.trim().replace(/\r\n/g,`
|
|
37
|
+
`),n=/```json\n([\s\S]*?)\n```$/.exec(t);if(!n)return;let r;try{r=JSON.parse(n[1])}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=t.slice(0,n.index).trim()||void 0;return{values:r,...i?{summary:i}:{}}}function lte(e,t){let n=new Set([...e.matchAll(/\bname="([^"]+)"/g)].map(e=>e[1])),r=Object.keys(t);return n.size>0&&r.every(e=>n.has(e))}async function iS(e,t){await Ph(t);let n=0;for(let r=1;r<e.length;r++){let i=e[r],a=e[r-1];if(i.role!==`user`||i.form||a.role!==`assistant`)continue;let o=Sh(a.text,t);if(!o)continue;let s=cte(i.text);s&<e(o,s.values)&&(i.form={source:o,values:s.values,...s.summary?{summary:s.summary}:{}},n++)}return n}async function ute(e,t,n){await iS(e,t)>0&&n()}var aS=()=>qn().filter(e=>!e.builtin),oS=e=>`ide.workbench.${e}.open`,sS=e=>!!lr(e),dte=()=>qn().find(e=>e.builtin),cS=e=>sr(e??``)?.builtin===!0;function lS(e){return sr(e??`projector`)?.title??`Агент`}var uS=at({modes:{},disabled:[],loaded:!1,error:``}),dS;async function fS(e){let t=await fetch(`/api/agent/modes`,{...e,headers:{"Content-Type":`application/json`}}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||`Не удалось получить настройки агентов`);uS.modes=n.modes??{},uS.disabled=Array.isArray(n.disabled)?n.disabled:[],uS.loaded=!0}function pS(){dS??=fS().catch(e=>{uS.error=e.message,dS=void 0});let e=e=>sS(e)&&uS.modes[e]===`gui`?`gui`:`tui`;async function t(e,t){let n=uS.modes[e];uS.modes={...uS.modes,[e]:t};try{await fS({method:`PUT`,body:JSON.stringify({program:e,mode:t})}),uS.error=``}catch(t){uS.modes={...uS.modes,[e]:n??`tui`},uS.error=t instanceof Error?t.message:`Не удалось сохранить режим`}}let n=e=>{let t=lr(e)?.backend;return!t||!uS.disabled.includes(t)};async function r(e,t){let n=lr(e)?.backend??e,r=uS.disabled;uS.disabled=t?r.filter(e=>e!==n):[...r.filter(e=>e!==n),n];try{let e=await fetch(`/api/agent/integrations`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({backend:n,enabled:t})}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||`Не удалось сохранить интеграцию`);uS.disabled=Array.isArray(r.disabled)?r.disabled:uS.disabled,uS.error=``}catch(e){throw uS.disabled=r,uS.error=e instanceof Error?e.message:`Не удалось сохранить интеграцию`,e}}return{modeOf:e,setMode:t,isEnabled:n,setEnabled:r,loaded:z(()=>uS.loaded),error:z(()=>uS.error)}}var mS=X();function fte(e,t){mS.value={projectId:e,command:`ide.workbench.agent.job.open`,args:{job:t}}}function hS(e,t){let n=ab(e,t);return n&&(mS.value={projectId:e,command:n.command,args:n.args}),!!n}var pte=20,mte=150;function hte(e){let{api:t}=Iu(),n=0;async function r(){let i=mS.value;if(i&&i.projectId===e)try{await t.executeCommand(i.command,i.args,{scope:`editor:${e}`}),mS.value===i&&(mS.value=void 0),n=0}catch{++n<=pte&&setTimeout(()=>void r(),mte)}}R(mS,()=>void r(),{immediate:!0})}var gte,gS=()=>gte??=cy().catch(()=>({}));function _te(e,t){let{backend:n,projectId:r,ready:i,persist:a,key:o}=t,s=!cS(n),c=!1,l=!1,u=z(()=>e.controls),d=z(()=>e.selection),f=z(()=>e.sessions);function p(t){return t.map(t=>{let n=e.selection[t.id];return n&&t.options.some(e=>e.value===n)?{...t,current:n}:t})}async function m(){if(!s||r){await i,e.permissionMode!=="default"&&!e.selection[`permission-mode`]&&(e.selection[`permission-mode`]=e.permissionMode),e.selection={...(await gS())[n],...e.selection};try{let t=await oy(n,r);e.capabilities=t.capabilities,e.roleSnapshot&&(e.selection=Object.fromEntries(Object.entries(e.selection).filter(([e,n])=>{let r=t.controls.find(t=>t.id===e);return!r||!r.options.length||r.options.some(e=>e.value===n)}))),e.controls=p(t.controls),e.controlsError=``}catch(t){e.controlsError=t instanceof Error?t.message:`Не удалось получить настройки`}}}async function h(){if(!s||r)try{e.commands=await sy(n,r)}catch{}}async function g(t,r){let i=e.controls.find(e=>e.id===t);if(!i)throw Error(`Нет настройки «${t}»`);if(!i.options.some(e=>e.value===r))throw Error(`У настройки «${i.name}» нет значения «${r}»`);if(e.selection={...e.selection,[t]:r},e.controls=p(e.controls),e.roleSnapshot)e.roleSnapshot={...e.roleSnapshot,selection:{...e.roleSnapshot.selection,[t]:r}},e.turns.length&&a();else try{await ly(n,t,r);let e=await gS();e[n]={...e[n],[t]:r}}catch(t){e.error=t instanceof Error?t.message:`Не удалось сохранить выбор`}}async function _(t=!1){if(s&&!r)return[];let i=!t&&!c;i&&(e.sessionsLoading=!0);try{e.sessions=s?await uy(n,r):await Lv(o),e.sessionsError=``}catch(t){e.sessionsError=t instanceof Error?t.message:`Не удалось получить сессии`}finally{c=!0,i&&(e.sessionsLoading=!1)}return e.sessions}async function v(){if(!r)return e.recent=[],[];let t=!l;t&&(e.recentLoading=!0);try{e.recent=await Rv(r,n),e.recentError=``}catch(t){e.recentError=t instanceof Error?t.message:`Не удалось получить историю`}finally{l=!0,t&&(e.recentLoading=!1)}return e.recent}async function y(t,i){try{s?await Fy(n,r,t,i):await Vv(t,i),await _(!0)}catch(t){e.sessionsError=t instanceof Error?t.message:`Не удалось изменить сессию`}}async function b(){a(),await Qx.get(o)?.catch(()=>{})}function x(){e.queue=[],e.stash=void 0,e.editing=``,e.draft=``,e.draftParts=[]}async function S(){if(await i,!e.busy){try{s||(await b(),await zv(o))}catch(t){e.error=t instanceof Error?t.message:`Не удалось начать новый чат`;return}e.turns=[],x(),e.error=``,e.phase=``,a()}}async function C(t){if(typeof t!=`string`){let n=e.recent;e.recent=n.filter(e=>e.chat!==t.chat);try{await Uv(r,t.chat)}catch(t){throw e.recent=n,e.recentError=t instanceof Error?t.message:`Не удалось удалить чат`,t}return}let i=t,a=e.sessions,c=e.recent;a.some(e=>e.id===i)&&(e.sessions=a.filter(e=>e.id!==i)),s&&(e.recent=c.filter(e=>e.session!==i));try{s?await Iy(n,r,i,o):await Hv(i),await Promise.all([_(!0),s?v():void 0])}catch(t){throw e.sessions=a,e.recent=c,e.sessionsError=t instanceof Error?t.message:`Не удалось удалить чат`,t}}async function w(e){let t=(await vy().catch(()=>[])).find(t=>t.session===e&&t.projectId===r&&t.chat);return t?t.chat===o||hS(r,t.chat):!1}async function T(t){if(await i,e.busy)throw Error(`Дождитесь окончания ответа`);if(!(s&&await w(t))){e.error=``,e.loading=!0;try{if(s){let i=await dy(n,r,t);await iS(i,r),e.turns=i,a()}else await b(),e.turns=(await Bv(o,t)).turns,x()}catch(t){throw e.error=t instanceof Error?t.message:`Не удалось открыть сессию`,t}finally{e.loading=!1}}}return{controls:u,selection:d,sessions:f,loadControls:m,loadCommands:h,setControl:g,loadSessions:_,loadRecent:v,recent:z(()=>e.recent),recentLoading:z(()=>e.recentLoading),recentError:z(()=>e.recentError),changeSession:y,resumeSession:T,removeSession:C,clear:S}}function _S(e,t,n=!1){!t||e.roleSnapshot&&!n||(e.roleSnapshot=t,e.selection={...e.selection,...t.selection},t.permissionMode&&(e.permissionMode=t.permissionMode,e.selection[`permission-mode`]=t.permissionMode))}var vS=`Ответ прерван: страница или сервер были перезапущены. Отправьте сообщение ещё раз — разговор продолжится.`;function yS(e,t,n=!1){return n||(t.loading=!0),fetch(e).then(async e=>{if(!e.ok)throw Error(`Не удалось загрузить историю чата`);let r=await e.json(),i=Array.isArray(r.features)?r.features:void 0,a=r.judge&&typeof r.judge==`object`?r.judge:void 0,o=nb(r.role),s=Xee(r.queue),c=!!o&&(!t.roleSnapshot||t.roleSnapshot.roleId!==o.roleId);if(n&&JSON.stringify(r.turns)===JSON.stringify(t.turns)&&JSON.stringify(i??null)===JSON.stringify(t.featureOverrides??null)&&JSON.stringify(a??null)===JSON.stringify(t.judgeOverride??null)&&JSON.stringify(s)===JSON.stringify(Gx(t.queue))&&!c)return;t.turns=r.turns,t.queue=s,t.featureOverrides=i,t.judgeOverride=a,o&&(!t.roleSnapshot||t.roleSnapshot.roleId!==o.roleId)&&_S(t,o,!0);let l=t.turns.at(-1);if(l?.role!==`assistant`||l.run||l.failure||l.text.trim()||l.tools.length||(l.text=vS),!l?.run)for(let e of t.turns)for(let t of e.tasks??[])t.status===`running`&&(t.status=`stopped`,t.summary??=`Процесс агента завершился до отчёта о задаче`);for(let e of t.turns)for(let t of e.tools)t.status===`running`&&(t.status=`error`,t.detail=`Выполнение прервано`)}).catch(e=>{n||(t.error=e.message)}).finally(()=>{n||(t.loading=!1)})}function bS(e){return e?.role===`assistant`&&!e.run&&!e.tools.length&&(!e.text.trim()||e.text===`Ответ прерван: страница или сервер были перезапущены. Отправьте сообщение ещё раз — разговор продолжится.`)}var vte=`<system-reminder>`;function yte(e,t){let n=e.trim();return n.startsWith(t)||n.endsWith(t)||t.length>=40&&n.includes(t)}function bte(e,t){let n=[];for(let r of e.slice(t+1))if(r.role===`user`){if(!r.text.trim().startsWith(vte))break}else n.push(r);return n}function xte(e,t){let n=``,r=[],i=[],a=e=>{let t=i.at(-1);e.type===`text`&&t?.type===`text`?t.text+=`${t.text.endsWith(`
|
|
38
|
+
|
|
39
|
+
`)?``:`
|
|
40
|
+
|
|
41
|
+
`}${e.text}`:i.push({...e})};for(let e of t)if(e.text.trim()&&(n.trim()&&!n.endsWith(`
|
|
42
|
+
|
|
43
|
+
`)&&(n+=`
|
|
44
|
+
|
|
45
|
+
`),n+=e.text),r.push(...e.tools),e.parts?.length)for(let t of e.parts)a(t);else{e.text&&a({type:`text`,text:e.text});for(let t of e.tools)a({type:`tool`,id:t.id})}return!n.trim()&&!r.length?!1:(e.text=n,e.tools=r,e.parts=i,e.failure=void 0,!0)}function Ste(e,t){let n=e.at(-1);if(!n||n.role!==`assistant`||!bS(n))return!1;let r=e.findLast(e=>e.role===`user`)?.text.trim();if(!r)return!1;let i=t.findLastIndex(e=>e.role===`user`&&yte(e.text,r));return i<0?!1:xte(n,bte(t,i))}async function Cte(e,t,n,r){if(!t?.session?.id||!bS(t))return!1;try{if(!Ste(e,await n(t.session.id)))return!1}catch{return!1}return r(),!0}function wte(e,t,n,r){if($x.has(e))return;$x.add(e);let i=(Qx.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{$x.delete(e);let i=await fetch(t,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({turns:n.turns,queue:Gx(n.queue),features:n.featureOverrides??null,judge:n.judgeOverride??null,role:n.roleSnapshot??null,...r?{projectId:r.project,backend:r.backend}:{}})});if(!i.ok){let e=await i.json().then(e=>typeof e?.error==`string`?`: ${e.error}`:``,()=>``);throw Error(`Не удалось сохранить историю чата${e}`)}tte(e)});Qx.set(e,i),i.catch(e=>{n.error=e.message})}function Tte(e){let t=e.findLast(e=>e.role===`assistant`);return t&&!t.detached?t.session?.id:void 0}function xS(e){return e.findLast(e=>e.role===`assistant`)?.tail}function SS(e){return[...e.tools.map(e=>({type:`tool`,id:e.id})),...e.text?[{type:`text`,text:e.text}]:[]]}var CS=new WeakMap;function wS(e){let t=CS.get(e);if(t)return t;let n=new Map;return CS.set(e,n),n}var TS=new WeakMap;function ES(e){let t=TS.get(e);if(t)return t;let n=new Set;return TS.set(e,n),n}function DS(e){let t=wS(e);TS.delete(e);for(let n of e.tools)(n.startedAt!==void 0||n.endedAt!==void 0)&&t.set(n.id,{startedAt:n.startedAt,endedAt:n.endedAt});e.text=``,e.tools.splice(0),e.parts=[]}function OS(e,t){let n=e.parts??=SS({...e,text:e.text.slice(0,-t.length)}),r=n.at(-1);r?.type===`text`?r.text+=t:n.push({type:`text`,text:t})}function kS(e,t){let n=e.parts??=SS(e),r=n.at(-1);r?.type===`thought`?r.text+=t:n.push({type:`thought`,text:t})}function AS(e,t,n){let r=n instanceof Error?n.message:`Агент не ответил`;e.error=r,t.failure=r}var jS=64e3;function MS(e,t,n,r,i=Date.now()){switch(e.lastEventAt=i,n.event){case`input`:{let r=ES(t),i=n.data.inputId;return i&&(e.queue=e.queue.filter(e=>e.id!==i)),i&&r.has(i)?!1:(i&&r.add(i),(t.parts??=SS(t)).push({type:`note`,text:n.data.text}),!0)}case`status`:return e.phase=n.data.phase===`fallback`?`запасная модель · ${n.data.model}`:n.data.model?`${n.data.provider??`qwen`} · ${n.data.model}`:n.data.phase===`compacting`?`сжимаю историю`:n.data.phase===`retrying`?`провайдер не ответил, повтор ${n.data.attempt}`:n.data.phase===`background`?`ждёт фоновых агентов`:`думает`,!1;case`run`:return t.run=n.data.id,!0;case`session`:return t.session=n.data,!0;case`worktree`:return t.worktree=n.data,!0;case`checkpoint`:return t.tail=n.data.tail,!0;case`commands`:return e.commands=n.data.commands,!1;case`controls`:return e.controls=n.data.controls,e.selection={...e.selection,...Object.fromEntries(n.data.controls.map(e=>[e.id,e.current]))},!1;case`context`:return t.context=n.data,!1;case`usage`:return t.usage=n.data,!1;case`permission-request`:return e.permissions.push({id:n.data.id,tool:n.data.tool,title:n.data.title||n.data.tool,detail:n.data.detail?.trim()||cx(n.data.tool,Kx(n.data.input)),persistent:n.data.persistent===!0,...n.data.judge?{judge:n.data.judge}:{}}),!1;case`judge`:{let e=t.parts??=SS(t);return e.some(e=>e.type===`judge`&&e.tool===n.data.tool&&e.at===n.data.at)||e.push({type:`judge`,...n.data}),!1}case`question-request`:return e.questions.push(n.data),!1;case`secret-request`:return e.secrets.push(n.data),!1;case`text`:return t.text+=n.data.text,OS(t,n.data.text),!1;case`thought`:return kS(t,n.data.text),!1;case`tool`:let a=t.tools.find(e=>e.id===n.data.id);if(a)return a.status===`running`&&(a.detail=Kx(n.data.input)),a.input=Kx(n.data.input),n.data.kind&&(a.kind=n.data.kind),!1;t.text.trim()&&!t.text.endsWith(`
|
|
46
|
+
|
|
47
|
+
`)&&(t.text+=`
|
|
48
|
+
|
|
49
|
+
`);let o=t.parts??=SS(t),s=wS(t),c=s.get(n.data.id),l={id:n.data.id,name:n.data.name,status:`running`,input:Kx(n.data.input),detail:Kx(n.data.input),...n.data.kind?{kind:n.data.kind}:{},startedAt:c?.startedAt??i,...c?.endedAt===void 0?{}:{endedAt:c.endedAt},...n.data.parent?{parent:n.data.parent}:{}};return t.tools.push(l),s.set(l.id,{startedAt:l.startedAt,endedAt:l.endedAt}),o.push({type:`tool`,id:n.data.id}),!1;case`tool-output`:{let e=t.tools.find(e=>e.id===n.data.id);if(e&&e.status===`running`){let t=`${e.output??``}${n.data.chunk}`;e.output=t.length>jS?t.slice(-64e3):t}return!1}case`tool-result`:{let e=t.tools.find(e=>e.id===n.data.id);if(e){let r=wS(t),a=r.get(e.id);e.status=n.data.error?`error`:`done`,e.detail=n.data.error||Kx(n.data.output),e.endedAt=a?.endedAt??i,e.output=void 0,r.set(e.id,{startedAt:e.startedAt,endedAt:e.endedAt})}return!1}case`task`:{let r=t.tasks??=[],a=r.find(e=>e.id===n.data.id),o=a?void 0:(e.turns??[]).flatMap(e=>e.tasks??[]).findLast(e=>e.id===n.data.id),s=a??r[r.push({kind:`other`,title:``,status:`running`,background:!1,...o,...n.data})-1];a&&Object.assign(a,n.data);let c=n.data.summary||n.data.lastTool&&px(n.data.lastTool);return c&&s.log?.at(-1)!==c&&(s.log=[...s.log??[],c].slice(-100)),s.status===`running`?(s.startedAt??=i,s.endedAt=void 0):s.startedAt!==void 0&&s.endedAt===void 0&&(s.endedAt=i),!1}case`project`:return r(n.data),!1;case`error`:return e.error=n.data.error,t.failure=n.data.error,t.run=void 0,!1;case`done`:t.run=void 0,t.stopped=n.data.stopped;for(let e of t.tasks??[])e.status===`running`&&(!e.background||e.untracked)&&(e.status=`stopped`,e.endedAt=i,e.untracked&&(e.summary??=`Состояние после ответа неизвестно`));return!1;default:return!1}}function NS(e,t,n){return{id:gr(),role:`user`,text:e,at:Date.now(),tools:[],...t?{content:t}:{},...n?.form?{form:n.form}:{},...n?.auto?{auto:n.auto}:{},...n?.autoTitle?{autoTitle:n.autoTitle}:{}}}var PS=1e3,FS=60;function IS(e=``,t,n={}){let r=n.backend??`projector`,i=cS(r)&&!n.chatId,a=i?e:jx(r,e,n.chatId??`main`);if(clearTimeout(Jx.get(a)),Jx.delete(a),!Xx.has(a)){Xx.set(a,Wx());let e=ste(a),t=Xx.get(a);e&&(t.draft=e.text,t.draftParts=e.parts)}let o=Xx.get(a);_S(o,n.role);let s=`/api/agent/history/${encodeURIComponent(a||`catalog`)}`;Zx.has(a)||Zx.set(a,yS(s,o));let c=Zx.get(a),l=()=>wte(a,s,o,e?{project:e,backend:r}:void 0);i||c.then(()=>ute(o.turns,e,l));let u=t=>Cte(o.turns,t,t=>dy(r,e,t),l),d=Oc(),{draftParts:f,draft:p,busy:m,loading:h,error:g,phase:_,permissions:v,questions:y,secrets:b}=rte(o),{controls:x,selection:S,sessions:C,loadControls:w,loadCommands:T,setControl:ee,loadSessions:E,loadRecent:te,recent:D,recentLoading:ne,recentError:re,changeSession:ie,resumeSession:O,removeSession:k,clear:A}=_te(o,{backend:r,projectId:e,ready:c,persist:l,key:a});async function ae(e,t,n=!1){o.permissions=o.permissions.filter(t=>t.id!==e);try{await ty(e,t,n)}catch(e){o.error=e instanceof Error?e.message:`Не удалось передать решение`}}async function j(e,t){o.questions=o.questions.filter(t=>t.id!==e);try{await ny(e,t)}catch(e){o.error=e instanceof Error?e.message:`Не удалось передать ответ`}}async function oe(e,t){o.secrets=o.secrets.filter(t=>t.id!==e);try{await ry(e,t)}catch(e){o.error=e instanceof Error?e.message:`Не удалось передать секрет`}}let se=Wee(o,{backend:r,projectId:e,ready:c,persist:l,send:ue,stop:fe}),{drainQueue:M,worktreeId:ce}=se;async function le(e,t,n){o.busy=!0,o.phase=`думает`,o.abort=new AbortController;let{signal:r}=o.abort,i=t=>{t.event===`question-request`&&Rb(t.data.questions[0]?.question??``),t.event===`permission-request`&&zb(t.data.title||t.data.tool),t.event===`secret-request`&&Rb(t.data.label),MS(o,e,t,d.ingest)&&l(),[`status`,`controls`,`tool-result`].includes(t.event)&&se.deliverQueue()};try{let a=n;for(let n=0;;n++){a&&DS(e);try{if(await t(i,r,a),r.aborted||!e.run)break}catch(t){if(t instanceof Qv||r.aborted||!e.run||n>=FS)throw t}if(await new Promise(e=>setTimeout(e,PS)),a=e.run,r.aborted||!a)break}}catch(t){t instanceof Qv?(e.run=void 0,!await u(e)&&!e.text.trim()&&(e.text=vS)):r.aborted||AS(o,e,t)}finally{let t=r.aborted;o.abort?.abort();for(let t of e.tools)t.status===`running`&&(t.status=`error`,Object.assign(t,{detail:`Выполнение прервано`,endedAt:Date.now()}),delete t.output);o.busy=!1,o.phase=``,o.permissions=[],o.questions=[],o.secrets=[],l(),t||Lb(e.text,!!o.error),M(t&&!o.interrupting)}}async function ue(n,i,s){await c;let u=(n??o.draft).trim();if(!u)return;let d=i??(n===void 0&&lb(o.draftParts)===o.draft?o.draftParts:[]),f=db(d)?ub(d):void 0;if(n===void 0&&(o.draft=``,o.draftParts=[]),o.busy){o.queue.push({id:gr(),text:u,parts:f??[],...s?.form?{form:s.form}:{},...s?.auto?{auto:s.auto,autoTitle:s.autoTitle}:{}}),se.deliverQueue();return}n===void 0&&se.applyEdit(),o.error=``,Ib();let p=eS(o.turns,cS(r)),m=Tte(o.turns),h=xS(o.turns),g=ce(),_=o.isolate&&!g&&!m&&!cS(r);o.isolate=!1;let v=NS(u,f,s);o.stash?.index===o.turns.length&&Dx(v,o.stash.versions),o.stash=void 0,o.activeMessage=v.id;let y=at({id:gr(),role:`assistant`,text:``,at:Date.now(),tools:[]});o.turns.push(v,y),l(),await le(y,(n,i,s)=>$v(u,p,n,i,{projectId:e||void 0,chat:a,sessionId:m,commands:t,backend:r,permissionMode:o.permissionMode,selection:o.selection,parts:f,messageId:v.id,tail:h,features:o.featureOverrides,judge:o.judgeOverride,role:o.roleSnapshot,worktree:g,isolate:_,attach:s,onRun:e=>{y.run=e,l()}}))}async function de(){await c;let n=o.turns.at(-1);!o.busy&&n?.role===`assistant`&&n.run&&await le(n,(i,a,o)=>$v(``,[],i,a,{projectId:e||void 0,commands:t,backend:r,attach:o,onRun:e=>{n.run=e,l()}}),n.run)}de().then(()=>u(o.turns.at(-1))),nte(a,()=>o.busy||o.loading||$x.has(a),async()=>{await c,await yS(s,o,!0),o.busy||await de(),o.busy||await u(o.turns.at(-1))});function fe(){let e=o.turns.at(-1),t=e?.run;e&&t&&(e.run=void 0,ey(t).catch(()=>{})),o.abort?.abort()}let{attach:pe,release:N}=$ee(a,()=>o.abort?.abort());return{key:a,turns:z(()=>o.turns),persist:l,loading:h,draft:p,draftParts:f,busy:m,error:g,phase:_,lastEventAt:z(()=>o.lastEventAt),permissions:v,questions:y,secrets:b,controls:x,selection:S,roleSnapshot:z(()=>o.roleSnapshot),capabilities:z(()=>o.capabilities),controlsError:z(()=>o.controlsError),sessions:C,sessionsLoading:z(()=>o.sessionsLoading),sessionsError:z(()=>o.sessionsError),recent:D,recentLoading:ne,recentError:re,loadControls:w,loadCommands:T,commands:z(()=>o.commands),setControl:ee,loadSessions:E,loadRecent:te,changeSession:ie,resumeSession:O,removeSession:k,send:ue,queue:z(()=>o.queue),sendQueuedNow:se.sendQueuedNow,injectQueued:se.injectQueued,removeQueued:se.removeQueued,edit:se.edit,cancelEdit:se.cancelEdit,editing:z(()=>o.editing),retry:se.retry,showVersion:se.showVersion,canRewindFiles:se.canRewindFiles,rewindFiles:se.rewindFiles,isolate:se.isolate,...ite(o,()=>void c.then(l)),...ate(o,()=>void c.then(l)),worktreeId:ce,worktreeInfo:se.worktreeInfo,mergeCopy:se.mergeCopy,discardCopy:se.discardCopy,clear:A,stop:fe,attach:pe,release:N,decide:ae,answer:j,answerSecret:oe}}var LS=M({__name:`AgentIntegrationsSettings`,props:{agentId:{}},setup(e){let n=e,o=()=>n.agentId?aS().filter(e=>e.backend===n.agentId):aS(),{isEnabled:s,setEnabled:c,error:l}=pS(),u=X(``),d=()=>aS().map(e=>e.program),f=()=>aS().map(e=>e.title),p=E(`agentIntegrations:settings`,()=>({surface:`agentIntegrationsSettings`,busy:u.value}));p.scope.registerCommand({id:`ide.agent.integrations.list`,palette:!1,title:`Список интеграций агентов`,description:`Возвращает адаптеры агентов (${f().join(`, `)}) с состоянием «включён/выключен».`,run:()=>aS().map(e=>({program:e.program,backend:e.backend,title:e.title,enabled:s(e.program)}))}),p.scope.registerCommand({id:`ide.agent.integrations.set`,title:`Включить или выключить интеграцию агента`,description:`Включает или выключает адаптер агента: ${d().join(`, `)}. Отключённый агент скрывается из меню сессий и статусной строки, а его запуск отклоняется.`,arguments:{program:`string: ${d().join(`, `)}`,enabled:`boolean: включён ли агент`},enabled:()=>!u.value,run:async e=>{let{program:t,enabled:n}=b(e);if(typeof t!=`string`||!sS(t))throw Error(`program: ${d().join(`, `)}`);if(typeof n!=`boolean`)throw Error(`enabled должен быть boolean`);u.value=t;try{await c(t,n)}finally{u.value=``}return{program:t,enabled:s(t)}}});function m(e,t){let n=t.target.checked;Promise.resolve(p.run(`ide.agent.integrations.set`,{program:e,enabled:n})).catch(()=>{})}return(e,n)=>(V(),Y(ml,{as:`section`,gap:4,onPointerdown:n[0]||=e=>H(p).scope.activate()},{default:F(()=>[(V(!0),q(W,null,J(o(),e=>(V(),Y(g,{key:e.program,label:e.title},{default:F(()=>[I(r,{as:`label`,justify:`normal`},{default:F(()=>[I(a,{type:`checkbox`,checked:H(s)(e.program),disabled:u.value===e.program,"aria-label":`Интеграция ${e.title}`,onChange:t=>m(e.program,t)},null,8,[`checked`,`disabled`,`aria-label`,`onChange`]),n[1]||=N(` включён `,-1)]),_:2},1024)]),_:2},1032,[`label`]))),128)),I(i,null,{default:F(()=>[...n[2]||=[N(` Отключённый агент прячется из меню новых сессий, приветствия чата и индикаторов лимитов, а его запуск отклоняется сервером. Встроенный агент Projector отключить нельзя. `,-1)]]),_:1}),H(l)?(V(),Y(t,{key:0,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(H(l)),1)]),_:1})):B(``,!0)]),_:1}))}}),RS={class:`option`},zS={class:`option`},BS=G(M({__name:`AgentJudgeFields`,props:yt({disabled:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=Te(e,`modelValue`);function n(){t.value={...t.value}}return(r,i)=>(V(),q(W,null,[K(`label`,RS,[I(a,{type:`checkbox`,"aria-label":`Показывать оценку риска`,modelValue:t.value.show,"onUpdate:modelValue":i[0]||=e=>t.value.show=e,disabled:e.disabled,onChange:n},null,8,[`modelValue`,`disabled`]),i[4]||=K(`span`,null,`Показывать оценку риска в карточке подтверждения`,-1)]),K(`label`,zS,[I(a,{type:`checkbox`,"aria-label":`Разрешать низкий риск автоматически`,modelValue:t.value.auto,"onUpdate:modelValue":i[1]||=e=>t.value.auto=e,disabled:e.disabled,onChange:n},null,8,[`modelValue`,`disabled`]),i[5]||=K(`span`,null,`Разрешать низкий риск автоматически`,-1)]),I(g,{label:`максимальный автоматический риск`},{default:F(({control:r})=>[I(a,rn({as:`select`},r,{"aria-label":`Максимальный автоматический риск`,modelValue:t.value.maxRisk,"onUpdate:modelValue":i[2]||=e=>t.value.maxRisk=e,modelModifiers:{number:!0},disabled:e.disabled||!t.value.auto,onChange:n}),{default:F(()=>[...i[6]||=[K(`option`,{value:1},`1/5 — безопасно`,-1),K(`option`,{value:2},`2/5 — низкий`,-1),K(`option`,{value:3},`3/5 — умеренный`,-1)]]),_:1},16,[`modelValue`,`disabled`])]),_:1}),I(g,{label:`достаточная уверенность`},{default:F(({control:r})=>[I(a,rn({as:`select`},r,{"aria-label":`Достаточная уверенность Судьи`,modelValue:t.value.confidence,"onUpdate:modelValue":i[3]||=e=>t.value.confidence=e,disabled:e.disabled||!t.value.auto,onChange:n}),{default:F(()=>[...i[7]||=[K(`option`,{value:`high`},`только высокая`,-1),K(`option`,{value:`high-medium`},`высокая и средняя`,-1)]]),_:1},16,[`modelValue`,`disabled`])]),_:1})],64))}}),[[`__scopeId`,`data-v-d1bb6221`]]),VS=[`aria-expanded`,`aria-controls`],HS={key:0,class:`changed-dot`,"aria-hidden":`true`},US=G(M({__name:`AgentJudgeIsland`,props:{chat:{},override:{},disabled:{type:Boolean},showTrigger:{type:Boolean},anchor:{type:Function}},emits:[`update:override`],setup(e,{expose:n,emit:r}){let a=e,o=r,s=X({...Cv}),c=X({...Cv}),l=X(``),u=z(()=>a.override!==void 0),d=mu({anchor:`right`,initialFocus:[`input:not(:disabled)`,`select:not(:disabled)`,`button:not(:disabled)`],items:`input, select, button`,returnFocus:`.trigger, button`}),f=X();function p(e){f.value=e instanceof HTMLElement?e:void 0}let m=E(`agent-judge-chat:${P()}`,()=>({surface:`agentJudgeChat`,chat:a.chat,overridden:u.value,show:c.value.show,auto:c.value.auto,maxRisk:c.value.maxRisk,confidence:c.value.confidence}));function h(e){c.value={...e}}function g(e){c.value=e,a.disabled||o(`update:override`,{...e})}async function _(){try{s.value=await uv(),l.value=``,h(Ev(s.value,a.override))}catch(e){l.value=e instanceof Error?e.message:`Не удалось прочитать настройки`}}function v(){o(`update:override`,void 0),h(s.value)}function y(e){d.trigger.value=e??a.anchor?.()??f.value,d.open.value||_(),m.scope.activate(),d.toggle(!0)}function x(){y()}n({openAt:y});function S(e){if(a.disabled)throw Error(`Чат ещё загружается: настройки Судьи пока недоступны`);let t=Ov(e);return o(`update:override`,t),h(Ev(s.value,t)),{overridden:t!==void 0,...Ev(s.value,t)}}return m.scope.registerCommand({id:`ide.agent.judge.chat.get`,title:`Прочитать настройки Судьи текущего чата`,description:`Возвращает настройки Projector Judge для этого чата с учётом глобальных: show, auto, maxRisk, confidence и overridden — есть ли у чата собственное переопределение.`,run:async()=>(await _(),{chat:a.chat,overridden:u.value,...c.value})}),m.scope.registerCommand({id:`ide.agent.judge.chat.set`,title:`Настроить Судью для текущего чата`,description:`Переопределяет настройки Projector Judge для этого чата, не меняя глобальные. Передайте хотя бы одно поле; maxRisk выше 3 запрещён.`,arguments:{show:`boolean: показывать оценку`,auto:`boolean: разрешать низкий риск автоматически`,maxRisk:`1, 2 или 3`,confidence:`high или high-medium`},run:e=>{let t=b(e);return S({...c.value,...typeof t.show==`boolean`?{show:t.show}:{},...typeof t.auto==`boolean`?{auto:t.auto}:{},...t.maxRisk===void 0?{}:{maxRisk:t.maxRisk},...t.confidence===void 0?{}:{confidence:t.confidence}})}}),m.scope.registerCommand({id:`ide.agent.judge.chat.reset`,title:`Вернуть настройки Судьи чата к глобальным`,description:`Убирает переопределение Projector Judge у этого чата.`,run:()=>(v(),{overridden:!1,...s.value})}),m.scope.registerCommand({id:`ide.agent.judge.panel`,title:`Открыть настройки Судьи`,description:`Открывает или закрывает остров Projector Judge в табе агента: показывать ли оценку риска, разрешать ли низкий риск автоматически и до какого балла.`,run:()=>x()}),(n,r)=>(V(),q(W,null,[K(`div`,{ref:p,class:O([`judge-island`,{hidden:e.showTrigger===!1}])},[e.showTrigger===!1?B(``,!0):(V(),q(`button`,{key:0,type:`button`,class:O([`trigger`,{changed:u.value}]),"aria-expanded":H(d).open.value,"aria-controls":H(d).id,"aria-label":`Судья`,title:`Судья`,onClick:x},[r[0]||=K(`span`,{"aria-hidden":`true`},`⚖`,-1),u.value?(V(),q(`span`,HS)):B(``,!0)],10,VS))],2),I(kl,{menu:H(d),label:`Судья`,width:360},{default:F(()=>[I(Gd,null,{default:F(()=>[...r[1]||=[N(`Судья`,-1)]]),_:1}),I(ml,{gap:3},{default:F(()=>[I(BS,{"model-value":c.value,disabled:e.disabled,"onUpdate:modelValue":g},null,8,[`model-value`,`disabled`]),I(i,null,{default:F(()=>[...r[2]||=[N(` Баллы 4–5 не разрешаются автоматически. «Сбросить» возвращает чат к глобальным настройкам. `,-1)]]),_:1}),u.value?(V(),Y(Q,{key:0,disabled:e.disabled,onClick:v},{default:F(()=>[...r[3]||=[N(`Как по умолчанию`,-1)]]),_:1},8,[`disabled`])):B(``,!0),l.value?(V(),Y(t,{key:1,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(l.value),1)]),_:1})):B(``,!0)]),_:1})]),_:1},8,[`menu`])],64))}}),[[`__scopeId`,`data-v-c12a2af1`]]),WS=M({__name:`AgentJudgeSettings`,setup(e){let{settings:t,busy:n,error:a,commands:o}=kv(),s=()=>o.scope.activate();return(e,c)=>(V(),Y(hp,{activate:s,error:H(a)},{default:F(()=>[I(BS,{modelValue:H(t),"onUpdate:modelValue":c[0]||=e=>gt(t)?t.value=e:null,disabled:H(n)},null,8,[`modelValue`,`disabled`]),I(r,null,{default:F(()=>[I(Q,{appearance:`solid`,disabled:H(n),onClick:c[1]||=e=>H(o).run(`ide.agent.judge.set`)},{default:F(()=>[...c[2]||=[N(`Сохранить`,-1)]]),_:1},8,[`disabled`])]),_:1}),I(i,null,{default:F(()=>[...c[3]||=[N(` Судья оценивает действие по шкале от 1 до 5 и объясняет риск в карточке. Автоматически разрешаются только действия не выше выбранного балла и с достаточной уверенностью; баллы 4–5 не автоматизируются, а ошибка Судьи никогда не разрешает действие. Настройку можно переопределить для отдельного чата в меню «Ещё». `,-1)]]),_:1})]),_:1},8,[`error`]))}}),GS=M({__name:`AgentMcpSettings`,setup(e){let{mcp:t,draft:n,busy:r,error:a,commands:o}=Av(),s=()=>o.scope.activate();return(e,c)=>(V(),Y(Pv,{label:`серверы пользователя (JSON)`,"aria-label":`MCP-серверы агента`,placeholder:`{ "mcpServers": { "files": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/home"] } } }`,text:H(t).text,draft:H(n),busy:H(r),error:H(a),activate:s,"onUpdate:draft":c[0]||=e=>n.value=e,onSave:c[1]||=e=>H(o).run(`ide.agent.mcp.set`)},{summary:F(()=>[H(t).servers.length?(V(),Y(i,{key:0},{default:F(()=>[N(` Подключаются: `+j(H(t).servers.map(e=>`${e.name} (${e.source===`user`?`ваш`:`проект`}, ${e.kind})`).join(`, `)),1)]),_:1})):B(``,!0)]),help:F(()=>[I(i,null,{default:F(()=>[...c[2]||=[N(` Штатный агент подключает эти серверы в начале каждого ответа и получает их инструменты; серверы из `,-1),K(`code`,null,`.mcp.json`,-1),N(` проекта подключаются тоже, но запуск подтверждаете вы. Инструмент, который не только читает, перед вызовом тоже спрашивает подтверждение (в режиме «Без вопросов» — нет). Значения вида `,-1),K(`code`,null,"${NAME}",-1),N(` берутся из окружения Projector. Файл лежит в папке данных Projector и может содержать ключи. `,-1)]]),_:1})]),_:1},8,[`text`,`draft`,`busy`,`error`]))}}),KS=M({__name:`AgentMemorySettings`,setup(e){let{memory:t,drafts:n,textOf:r,busy:o,error:s,commands:c}=jv(),l=()=>c.scope.activate();function u(e,t){n.value[e]=t.target.value}return(e,d)=>(V(),Y(hp,{activate:l,error:H(s)},{default:F(()=>[I(g,{label:`общие заметки`},{default:F(({control:e})=>[I(a,rn(e,{as:`textarea`,rows:`5`,"aria-label":`Общие заметки агента`,spellcheck:`false`,placeholder:`Например: отвечай коротко, пакеты ставь через pnpm`,value:H(r)(`user`),disabled:H(o),onInput:d[0]||=e=>u(`user`,e)}),null,16,[`value`,`disabled`])]),_:1}),I(Q,{appearance:`solid`,disabled:H(o)||H(n).user===void 0,onClick:d[1]||=e=>H(c).run(`ide.agent.memory.set`)},{default:F(()=>[...d[2]||=[N(`Сохранить`,-1)]]),_:1},8,[`disabled`]),(V(!0),q(W,null,J(H(t).projects,e=>(V(),Y(g,{key:e.path,label:e.path},{default:F(({control:t})=>[I(a,rn({ref_for:!0},t,{as:`textarea`,rows:`4`,"aria-label":`Заметки проекта ${e.path}`,spellcheck:`false`,value:H(r)(e.path),disabled:H(o),onInput:t=>u(e.path,t)}),null,16,[`aria-label`,`value`,`disabled`,`onInput`]),I(Q,{disabled:H(o)||H(n)[e.path]===void 0,onClick:t=>H(c).run(`ide.agent.memory.set`,{path:e.path,text:H(r)(e.path)})},{default:F(()=>[...d[3]||=[N(`Сохранить`,-1)]]),_:1},8,[`disabled`,`onClick`]),I(Q,{disabled:H(o),onClick:t=>H(c).run(`ide.agent.memory.set`,{path:e.path,text:``})},{default:F(()=>[...d[4]||=[N(`Удалить`,-1)]]),_:1},8,[`disabled`,`onClick`])]),_:2},1032,[`label`]))),128)),I(i,null,{default:F(()=>[...d[5]||=[N(` Штатный агент попросит подтверждение и запишет сюда то, что вы просили запомнить («запомни…»). Заметки идут в каждый его запрос, поэтому держите их короткими; секреты здесь хранить не нужно. Заметки проекта привязаны к его пути. `,-1)]]),_:1})]),_:1},8,[`error`]))}}),qS=M({__name:`AgentModeSettings`,props:{agentId:{}},setup(e){let n=e,r=()=>n.agentId?aS().filter(e=>e.backend===n.agentId):aS(),{modeOf:o,setMode:s,isEnabled:c,error:l}=pS();return(e,n)=>(V(),Y(ml,{as:`section`,gap:4},{default:F(()=>[(V(!0),q(W,null,J(r(),e=>(V(),Y(g,{key:e.program,label:e.title},{default:F(({control:t})=>[I(a,rn({as:`select`},{ref_for:!0},t,{"aria-label":`Режим сессий ${e.title}`,disabled:!H(c)(e.program),value:H(o)(e.program),onChange:t=>H(s)(e.program,t.target.value)}),{default:F(()=>[...n[0]||=[K(`option`,{value:`tui`},`Терминал (TUI)`,-1),K(`option`,{value:`gui`},`Графический чат (GUI)`,-1)]]),_:1},16,[`aria-label`,`disabled`,`value`,`onChange`])]),_:2},1032,[`label`]))),128)),I(i,null,{default:F(()=>[...n[1]||=[N(` По умолчанию агенты запускаются в терминале. Графический режим — тот же агент с тем же входом и настройками, но вывод в чате, а запросы разрешений — кнопками. Режим применяется к новым сессиям; переключить его можно и в меню «+». `,-1)]]),_:1}),H(l)?(V(),Y(t,{key:0,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(H(l)),1)]),_:1})):B(``,!0)]),_:1}))}}),JS={key:1,class:`group`},YS={key:2,class:`group`},XS={class:`group`},ZS=G(M({__name:`AgentSettings`,props:{agentId:{}},emits:[`open`],setup(e,{emit:t}){let n=e,a=t,o=z(()=>qn().find(e=>e.backend===n.agentId));return(e,t)=>(V(),Y(ml,{as:`section`,gap:4},{default:F(()=>[o.value?(V(),q(W,{key:1},[I(r,{class:`agent-heading`,justify:`normal`,gap:3},{default:F(()=>[(V(),Y(qe(o.value.icon),{class:`agent-icon`,"aria-hidden":`true`})),K(`div`,null,[K(`h3`,null,j(o.value.title),1),K(`p`,null,j(o.value.caption),1)])]),_:1}),o.value.builtin?(V(),Y(i,{key:0},{default:F(()=>[...t[1]||=[N(` Встроенный агент Projector нельзя отключить, и у него нет терминального режима. Его возможности для новых чатов — ниже; остальные настройки Projector остаются отдельными разделами. `,-1)]]),_:1})):(V(),q(`section`,JS,[t[2]||=K(`h4`,null,`интеграция`,-1),I(LS,{"agent-id":o.value.backend},null,8,[`agent-id`])])),o.value.builtin?B(``,!0):(V(),q(`section`,YS,[t[3]||=K(`h4`,null,`сессии`,-1),I(qS,{"agent-id":o.value.backend},null,8,[`agent-id`])])),K(`section`,XS,[t[4]||=K(`h4`,null,`возможности`,-1),I(H(av),{agent:o.value.backend},null,8,[`agent`])])],64)):(V(),q(W,{key:0},[I(i,null,{default:F(()=>[...t[0]||=[N(` У каждого адаптера своя страница: включение, режим сессий и возможности собраны в одном месте. Выберите агента слева или кнопкой ниже. `,-1)]]),_:1}),I(r,{wrap:``,gap:2},{default:F(()=>[(V(!0),q(W,null,J(H(qn)(),e=>(V(),Y(Q,{key:e.backend,title:e.caption,onClick:t=>a(`open`,e.backend)},{default:F(()=>[N(j(e.title),1)]),_:2},1032,[`title`,`onClick`]))),128))]),_:1})],64))]),_:1}))}}),[[`__scopeId`,`data-v-d26e85c2`]]),QS={key:1,class:`skills`},$S={key:0},eC=M({__name:`AgentSkillsSettings`,setup(e){let{data:t,error:n,commands:r}=Mv(),a=()=>r.scope.activate();return(e,r)=>(V(),Y(hp,{activate:a,error:H(n)},{default:F(()=>[H(t).skills.length?(V(),q(`ul`,QS,[(V(!0),q(W,null,J(H(t).skills,e=>(V(),q(`li`,{key:`${e.kind}:${e.name}`},[K(`strong`,null,j(e.kind===`skill`?e.name:`/${e.name}`),1),e.hint?(V(),q(`span`,$S,j(e.hint),1)):B(``,!0),N(` — `+j(e.description),1)]))),128))])):(V(),Y(i,{key:0},{default:F(()=>[...r[0]||=[N(`Своих навыков и команд пока нет.`,-1)]]),_:1})),I(i,null,{default:F(()=>[r[1]||=N(` Навык — папка `,-1),r[2]||=K(`code`,null,`skills/<имя>/SKILL.md`,-1),r[3]||=N(` с описанием в шапке (`,-1),r[4]||=K(`code`,null,`description:`,-1),r[5]||=N(`): агент видит описания и сам загружает нужный. Команда — файл `,-1),r[6]||=K(`code`,null,`commands/<имя>.md`,-1),r[7]||=N(`: её набирают как `,-1),r[8]||=K(`code`,null,`/имя аргументы`,-1),r[9]||=N(`, в тексте `,-1),r[10]||=K(`code`,null,`$ARGUMENTS`,-1),r[11]||=N(` заменяется аргументами. Папка пользователя: `,-1),K(`code`,null,j(H(t).folders.find(e=>e.source===`user`)?.path),1),r[12]||=N(`; в проекте — `,-1),r[13]||=K(`code`,null,`.projector/`,-1),r[14]||=N(` с такими же подпапками; агенты со своей папкой навыков читают и её. Навык пользователя главнее одноимённого навыка проекта. `,-1)]),_:1})]),_:1},8,[`error`]))}}),tC=M({__name:`AgentWebSettings`,setup(e){let{web:t,provider:n,url:o,apiKey:s,busy:c,error:l,commands:u}=Nv(),d=()=>u.scope.activate();return(e,f)=>(V(),Y(hp,{activate:d,error:H(l)},{default:F(()=>[I(g,{label:`поисковый сервис`},{default:F(({control:e})=>[I(a,rn({as:`select`},e,{"aria-label":`Поисковый сервис агента`,modelValue:H(n),"onUpdate:modelValue":f[0]||=e=>gt(n)?n.value=e:null,disabled:H(c)}),{default:F(()=>[...f[5]||=[K(`option`,{value:`brave`},`Brave Search (нужен ключ)`,-1),K(`option`,{value:`searxng`},`SearXNG (свой сервер)`,-1)]]),_:1},16,[`modelValue`,`disabled`])]),_:1}),H(n)===`searxng`?(V(),Y(g,{key:0,label:`адрес SearXNG`},{default:F(({control:e})=>[I(a,rn(e,{"aria-label":`Адрес SearXNG`,placeholder:`https://searx.example.org`,spellcheck:`false`,modelValue:H(o),"onUpdate:modelValue":f[1]||=e=>gt(o)?o.value=e:null,disabled:H(c)}),null,16,[`modelValue`,`disabled`])]),_:1})):(V(),Y(g,{key:1,label:`ключ Brave Search`},{default:F(({control:e})=>[I(a,rn(e,{type:`password`,autocomplete:`off`,"aria-label":`Ключ Brave Search`,placeholder:H(t).hasKey?`ключ сохранён; введите новый, чтобы заменить`:`ключ`,spellcheck:`false`,modelValue:H(s),"onUpdate:modelValue":f[2]||=e=>gt(s)?s.value=e:null,disabled:H(c)}),null,16,[`placeholder`,`modelValue`,`disabled`])]),_:1})),I(r,null,{default:F(()=>[I(Q,{appearance:`solid`,disabled:H(c),onClick:f[3]||=e=>H(u).run(`ide.agent.web.set`)},{default:F(()=>[...f[6]||=[N(`Сохранить`,-1)]]),_:1},8,[`disabled`]),H(t).hasKey&&H(n)===`brave`?(V(),Y(Q,{key:0,disabled:H(c),onClick:f[4]||=e=>H(u).run(`ide.agent.web.key.clear`)},{default:F(()=>[...f[7]||=[N(`Удалить ключ`,-1)]]),_:1},8,[`disabled`])):B(``,!0)]),_:1}),I(i,null,{default:F(()=>[...f[8]||=[N(` Штатный агент ищет через `,-1),K(`code`,null,`web_search`,-1),N(` и читает страницы через `,-1),K(`code`,null,`web_fetch`,-1),N(`. Страницы из локальной сети ему недоступны, первое обращение к сайту подтверждаете вы. Всё, что приходит из интернета, агент считает чужими данными, а не указаниями. Ключ хранится в системном хранилище секретов; агент может сам попросить его отдельным закрытым полем. `,-1)]]),_:1})]),_:1},8,[`error`]))}});function nC(e,t,n,r){e.executeCommand(oS(n),void 0,{scope:`editor:${t}`}).catch(e=>r(e instanceof Error?e.message:`Не удалось открыть агента`))}function rC(e){let t=X(!1),n=()=>t.value=!1;Ql(window,`dragend`,n),Ql(window,`drop`,n,!0);let r=t=>e()?.acceptsDrag(t.dataTransfer)?(t.preventDefault(),t.stopPropagation(),!0):!1;return{over:t,dragenter(e){r(e)&&(t.value=!0)},dragover(e){r(e)&&(t.value=!0,e.dataTransfer.dropEffect=`copy`)},dragleave(e){e.currentTarget.contains(e.relatedTarget)||(t.value=!1)},drop(n){t.value=!1,r(n)&&e().dropData(n.dataTransfer)}}}function iC(e){let t=(e.draft?.text??[...e.turns].reverse().find(e=>e.role===`user`)?.text??``).replace(/\s+/g,` `).trim();return t?`Ветка · ${t.length>40?`${t.slice(0,39)}…`:t}`:`Ветка`}async function aC(e){let{backend:t,projectId:n,turns:r,turnId:i,mode:a,branchSession:o}=e;if(!n)throw Error(`Форк доступен только в проекте`);let s=Ax(r,i,a);if(!s)throw Error(`Это сообщение нельзя ответвить`);if(!cS(t)){let e=s.turns.findLast(e=>e.role===`assistant`);!e||o&&e.tail||(e.detached=!0)}let c=gr(),l=jx(t,n,c),u=iC(s),d=await fetch(`/api/agent/history/${encodeURIComponent(l)}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({turns:s.turns,projectId:n,backend:t,title:u,...e.role?{role:e.role}:{}})});if(!d.ok){let e=await d.json().catch(()=>({}));throw Error(e.error||`Не удалось сохранить ветку чата`)}return s.draft&&ote(l,s.draft),{chat:l,chatId:c,title:u}}function oC(e){let t=`editor:${e.projectId}`;async function n(n,r=`before`){let i=await aC({backend:e.backend,projectId:e.projectId,turns:e.turns(),turnId:n,mode:r,branchSession:e.capabilities().branchSession,role:e.role()}),a=ab(e.projectId,i.chat,i.title,e.role());if(!a)throw Error(`Для этой ветки нет вкладки чата`);return await e.api.executeCommand(a.command,a.args,{scope:t}),{chat:i.chat}}async function r(t,r){try{await n(t,r)}catch(t){e.fail(t instanceof Error?t.message:`Не удалось ответвить чат`)}}function i(n,r){let i=e.recent().find(e=>e.chat===n)?.role,a=ab(e.projectId,n,r,i);a&&Promise.resolve(e.api.executeCommand(a.command,a.args,{scope:t})).catch(t=>{e.fail(t instanceof Error?t.message:`Не удалось открыть чат`)})}return{fork:n,forkMessage:r,openRecent:i,recentChats:z(()=>e.recent().filter(t=>t.chat!==e.key&&!!ab(e.projectId,t.chat)))}}function sC(e){ui(()=>{let t=e.turns.value.at(-1),n=e.turns.value.findLast(e=>e.role===`assistant`)?.text.trim().slice(0,2e3),r=t?.tools.map(e=>`${e.name} — ${e.status}`).join(`; `);return{note:`Чат агента ${e.agent}`,text:vi(`Бэкенд: ${e.backend}`,e.busy.value?`Состояние: Работает (${e.phase.value})`:`Состояние: Готов`,e.error.value?`Ошибка: ${e.error.value}`:``,...e.controls.value.map(e=>`${e.name}: ${e.options.find(t=>t.value===e.current)?.name??e.current}`),`Сообщений: ${e.turns.value.length}`,n?`Последний ответ:\n${n}`:``,r?`Инструменты: ${r}`:``)}})}function cC(e){return e===`queued`||e===`running`||e===`needs-user`}function lC(e,t,n=8){return{active:e.filter(e=>cC(e.status)),recent:t?e.filter(e=>yy(e.status)&&e.origin===t).sort((e,t)=>(t.endedAt??t.createdAt)-(e.endedAt??e.createdAt)).slice(0,n):[]}}var uC={queued:`Запускается`,running:`Работает`,"needs-user":`Ждёт вас`,done:`Готово`,error:`Ошибка`,stopped:`Остановлено`};function dC(e){let t=sr(e);return t&&!t.builtin?t.program:void 0}function fC(e,t,n=Date.now()){return e?Ob((t??n)-e):``}function pC(e,t=80){let n=e.replace(/\s+/g,` `).trim();if(!n)return`Задание`;if(n.length<=t)return n;let r=n.slice(0,t),i=Math.max(r.lastIndexOf(`. `),r.lastIndexOf(`! `),r.lastIndexOf(`? `)),a=(i>=Math.min(40,t/2)?r.slice(0,i+1):r).trimEnd();return/[.!?]$/.test(a)?a:`${a}…`}function mC(e,t){return(e.sessionId?t?.get(e.sessionId)?.trim():``)||pC(e.task)}function hC(e,t){let n=[],r=e.size===0;for(let i of t){let t=e.get(i.id);if(e.set(i.id,i.status),t===i.status||t===void 0&&(r||yy(i.status)))continue;let a=lS(i.backend),o=i.task.trim().slice(0,120);if(i.status===`needs-user`){let e=i.pending[0];n.push({id:i.id,title:`${a} ждёт вашего ответа`,body:e?`${e.title}: ${o}`:o})}else yy(i.status)&&n.push({id:i.id,title:i.status===`done`?`${a} закончил задание`:i.status===`error`?`${a}: задание завершилось ошибкой`:`${a}: задание остановлено`,body:i.status===`error`&&i.error?i.error:o})}return n}function gC(e,t){for(let n of hC(e,t))Bb(n.id,n.title,n.body)}var _C=4e3;function vC(){let e=X([]);async function t(){if(document.visibilityState===`visible`)try{e.value=await vy()}catch{}}t();let n=setInterval(()=>void t(),_C);return document.addEventListener(`visibilitychange`,t),Gt()&&zt(()=>{clearInterval(n),document.removeEventListener(`visibilitychange`,t)}),e}function yC(e){return e.filter(e=>!yy(e.status)).map(e=>({chat:`job:${e.id}`,projectId:e.projectId,agent:lS(e.backend),topic:e.task.trim().slice(0,120),busy:e.status!==`needs-user`,tasks:0,startedAt:e.startedAt,job:{id:e.id,status:e.status},needsUser:e.status===`needs-user`}))}function bC(){let e=X([]),t=new Map;async function n(){try{e.value=await Sy(),gC(t,e.value)}catch{}}n();let r=setInterval(()=>void n(),_C);return Gt()&&zt(()=>clearInterval(r)),e}function xC(){let e=vC(),t=bC();return{items:z(()=>{let n=Yee().map(e=>({chat:e.key,projectId:e.projectId,agent:e.label,topic:e.turns().findLast(e=>e.role===`user`)?.text.trim().slice(0,120)??``,busy:e.busy(),tasks:e.tasks().filter(e=>e.status===`running`).length,startedAt:e.turns().findLast(e=>e.role===`assistant`)?.at})).filter(e=>e.busy||e.tasks),r=new Set(n.map(e=>e.chat)),i=e.value.filter(e=>{let t=e.chat||e.id;return!r.has(t)&&(r.add(t),!0)}).map(e=>({chat:e.chat||e.id,projectId:e.projectId,agent:lS(e.backend),topic:e.topic,busy:!0,tasks:0,startedAt:e.startedAt})),a=yC(t.value);return[...n,...i,...a]}),jobs:t}}var SC=3e4,CC=5e3,wC=6,TC=new Map,EC=new Map,DC=X(0),OC=(e,t)=>`${e}:${t}`;function kC(e,t,n=!1){let r=OC(e,t),i=TC.get(r);if(!n&&i&&Date.now()-i.at<SC)return Promise.resolve(i);let a=EC.get(r);if(a)return a;let o=uy(e,t).then(e=>{let t={at:Date.now(),titles:new Map(e.map(e=>[e.id,e.title]))};return TC.set(r,t),DC.value++,t}).catch(()=>i??{at:Date.now(),titles:new Map}).finally(()=>EC.delete(r));return EC.set(r,o),o}var AC=e=>!!e.sessionId&&!e.worktree;async function jC(e){if(!AC(e))return mC(e);let t=await kC(e.backend,e.projectId);return t.titles.get(e.sessionId)?.trim()||(t=await kC(e.backend,e.projectId,!0)),mC(e,t.titles)}function MC(e,t){let n=X(new Map),r,i=0,a=0,o=()=>t().map(e=>`${e.id}:${e.backend}:${e.sessionId??``}:${e.status}`).join(`|`);async function s(){clearTimeout(r),r=void 0;let o=t(),c=++a,l=new Map,u=e();if(u){let e=[...new Set(o.filter(AC).map(e=>e.backend))],t=await Promise.all(e.map(async e=>[e,(await kC(e,u)).titles]));if(c!==a)return;for(let[e,n]of t)l.set(e,n)}else if(c!==a)return;let d=new Map,f=!1;for(let e of o){let t=l.get(e.backend);d.set(e.id,mC(e,t)),AC(e)&&!t?.get(e.sessionId)?.trim()&&e.status===`running`&&(f=!0)}n.value=d,f&&i<wC&&(i++,r=setTimeout(()=>void s(),CC))}return R([o,DC],()=>{i=0,s()},{immediate:!0}),Gt()&&zt(()=>{a++,clearTimeout(r)}),z(()=>n.value)}function NC(e,t){let n=MC(e,()=>{let e=t();return e?[e]:[]});return z(()=>{let e=t();return e?n.value.get(e.id)??mC(e):`Задание`})}var PC=2500,FC=new Set;function IC(e,t=pC(e.task)){return[`Фоновое задание «${t}» (${e.id}, ${e.backend}) завершилось: ${e.status}.`,e.error?`Ошибка: ${e.error}`:``,`Проверь результат командами ide.agent.job.result, ide.agent.job.diff и ide.agent.job.log, сверь с заданием и скажи пользователю, что изменилось и чем это проверено.`,e.worktree?`Работа шла в изолированной копии: слияние — ide.agent.job.merge, только по просьбе пользователя.`:``].filter(Boolean).join(` `)}function LC(e,t,n=()=>!0){let r=X([]),i=X(``),a=new Map,o=!1,s;async function c(){if(!o&&n()&&(typeof document>`u`||document.visibilityState!==`hidden`))try{let n=await Sy(e);if(o)return;i.value=``;for(let e of n){let n=a.get(e.id);n?n.status!==e.status&&t?.(e,n):t?.(e)}a=new Map(n.map(e=>[e.id,e])),r.value=n}catch(e){i.value=e instanceof Error?e.message:`Не удалось прочитать задания`}}return n()&&(s=setInterval(()=>void c(),PC),c()),zt(()=>{o=!0,s&&clearInterval(s)}),{jobs:r,error:i,refresh:c}}var RC=e=>`projector:job-continued:${e}`;function zC(e){try{return localStorage.getItem(RC(e))===`1`}catch{return!1}}function BC(e){try{localStorage.setItem(RC(e),`1`)}catch{}}function VC(e,t,n,r){return e.origin!==n||!yy(e.status)||e.status===`stopped`||t&&yy(t.status)?!1:!!t||(e.endedAt??e.createdAt)>=r-5e3}function HC(e,t){let n=Iu().api,r=Date.now(),{jobs:i,refresh:a}=LC(e,(e,n)=>{t.enabled()&&VC(e,n,t.chat,r)&&(FC.has(e.id)||zC(e.id)||(FC.add(e.id),BC(e.id),o(e)))},t.enabled);async function o(e){try{let n=await jC(e);await t.send(IC(e,n),{auto:e.id,autoTitle:n})}catch{}}function s(t){n?.executeCommand(`ide.workbench.agent.job.open`,{job:t},{scope:`editor:${e}`}).catch(()=>void 0)}return{jobs:i,refresh:a,open:s}}function UC(e){let{jobs:t,refresh:n,open:r}=HC(e.projectId,{enabled:e.enabled,chat:e.chat,send:e.send}),i=z(()=>e.permissions.value.length>0||e.questions.value.length>0||e.secrets.value.length>0||e.enabled()&&t.value.some(e=>e.pending.length>0));return at({jobs:t,refresh:n,open:r,hasRequests:i})}function WC(e){return!!e.sessionId&&!e.worktree&&!!dC(e.backend)}async function GC(e,t){if(!WC(t))throw Error(`Это задание нельзя продолжить в чате`);let n=dC(t.backend);if(!n)throw Error(`Это задание нельзя продолжить в чате`);let r=new Set(Vx(t.projectId).map(e=>e.key));await e.executeCommand(`ide.workbench.${n}.open`,void 0,{scope:`editor:${t.projectId}`});let i=Date.now()+5e3;for(;Date.now()<i;){let e=Vx(t.projectId).find(e=>!r.has(e.key)&&e.backend===t.backend);if(e)return e.resumeSession(t.sessionId);await new Promise(e=>setTimeout(e,100))}throw Error(`Чат не открылся вовремя`)}function KC(e){let t=X(),n=X([]),r=X(``),i=X(``),a=X(!1),o=!0,s,c=0;function l(e){t.value=e.job,n.value=e.journal,r.value=``}async function u(){let t=++c,n=0;for(;o&&t===c;){s=new AbortController;try{let r=await Cy(e(),n?25:0,n,s.signal);if(!o||t!==c||(l(r),n=r.job.rev,yy(r.job.status)))return;await new Promise(e=>setTimeout(e,100))}catch(e){if(!o||t!==c)return;let n=e instanceof Error?e.message:`Не удалось прочитать задание`;if(/не найдено/.test(n)){a.value=!0;return}r.value=n,await new Promise(e=>setTimeout(e,3e3))}}}R(e,()=>{c++,s?.abort(),u()},{immediate:!0}),lt(()=>{o=!1,s?.abort()});async function d(t){i.value=``;try{await t(),l(await Cy(e()))}catch(e){i.value=e instanceof Error?e.message:`Не удалось выполнить действие`}}return{job:t,journal:n,error:r,actionError:i,missing:a,act:d,stop:()=>d(()=>Ty(e())),decide:(t,n,r=!1)=>d(()=>Dy(e(),{request:t,allow:n,always:r})),answer:(t,n)=>d(()=>Dy(e(),{request:t,answers:n}))}}var qC=new Set([`text`,`thought`,`tool`,`tool-output`,`tool-result`,`task`,`session`,`context`,`usage`]);function JC(e,t,n){let r=Wx(),i={id:t,role:`assistant`,text:``,at:n,tools:[],parts:[]};for(let t of e)if(qC.has(t.event))MS(r,i,{event:t.event,data:t.data},()=>{},t.at);else if(t.event===`answer`){let e=t.data;i.parts.push({type:`note`,text:e.auto?`Разрешено автоматически: ${e.title??``}`.trim():`Ответ на запрос: ${e.summary??``}`.trim()})}return i}var YC=1500,XC=`Идентификатор задания из ide.agent.jobs.list или ide.agent.job.start`;function ZC(e,t){let n=e[t];if(typeof n!=`string`||!n.trim())throw Error(`Укажите ${t}`);return n.trim()}function QC(e){let t=e.result??e.resultPreview??``;return{job:e.id,agent:e.backend,...e.role?{role:{id:e.role.roleId,name:e.role.name}}:{},status:e.status,task:e.task.slice(0,200),...e.error?{error:e.error}:{},waiting:e.pending.map(e=>({request:e.id,kind:e.kind,title:e.title,...e.detail?{detail:e.detail.slice(0,500)}:{},...e.custom?{custom:!0}:{},...e.questions?{questions:e.questions.map(e=>({id:e.id,question:e.question,...e.header?{header:e.header}:{},multiple:e.multiple,options:e.options.map(e=>({id:e.id,label:e.label}))}))}:{}})),files:e.files,...e.worktree?{copy:{branch:e.worktree.branch,folder:e.cwd}}:{},result:t,...e.result===void 0?{}:{resultLength:e.result.length}}}function $C(e){let t=typeof e.request==`string`?e.request:void 0;if(typeof e.allow==`boolean`||e.always===!0)throw Error(`Разрешение подтверждает пользователь карточкой в чате Projector`);let n=e.answers;if(n!==void 0){if(n===null)return{request:t,answers:null};if(typeof n!=`object`||Array.isArray(n))throw Error(`answers: объект { id вопроса: [id вариантов] }`);let e={};for(let[t,r]of Object.entries(n)){if(!Array.isArray(r)||r.some(e=>typeof e!=`string`))throw Error(`answers: значения — массивы идентификаторов вариантов`);e[t]=r}return{request:t,answers:e}}let r=typeof e.answer==`string`?e.answer.trim():``;if(/^(allow|always|deny)$/i.test(r))throw Error(`Разрешение подтверждает пользователь карточкой в чате Projector`);if(r)return{request:t,text:r};throw Error(`Укажите answers или текст ответа на вопрос`)}var ew=(e,t=YC)=>{if(e===void 0)return{cut:!1};let n=typeof e==`string`?e:JSON.stringify(e);return n.length>t?{text:`${n.slice(0,t)}…`,cut:!0}:{text:n,cut:!1}};function tw(e,t){let n=[],r=new Map;for(let t of e){let e=t.data;if(!e)continue;let i=typeof e.id==`string`?e.id:``;if(t.event===`tool`){let a={at:t.at,id:i,name:String(e.name??``),input:e.input};n.push(a),i&&r.set(i,a)}else if(t.event===`tool-result`&&i){let n=r.get(i);n&&(n.output=e.output,n.resultAt=t.at)}}let i=n.length>t;return{calls:n.slice(-t).map(e=>{let t=ew(e.input),n=ew(e.output);return(t.cut||n.cut)&&(i=!0),{at:e.at,...e.id?{id:e.id}:{},name:e.name,...t.text===void 0?{}:{input:t.text},...n.text===void 0?{}:{output:n.text},...e.resultAt?{resultAt:e.resultAt}:{}}}),cut:i}}function nw(e,t=10){let n=e.filter(e=>e.event===`input`).map(e=>{let t=e.data;return{at:e.at,text:typeof t?.text==`string`?t.text.slice(0,2e3):``,...t?.followUp===!0?{followUp:!0}:{}}}).filter(e=>e.text);return{followUps:n.slice(-t),followUpsCut:n.length>t}}var rw={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function iw(e,t){return V(),q(`svg`,rw,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M12 8V4H8`}),K(`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`}),K(`path`,{d:`M2 14h2m16 0h2m-7-1v2m-6-2v2`})],-1)]])}var aw=U({name:`lucide-bot`,render:iw}),ow=[`title`,`aria-label`,`aria-expanded`,`aria-controls`],sw={key:0,class:`empty`},cw={class:`name u-truncate`},lw={class:`sub u-truncate`},uw={class:`name u-truncate`},dw={key:3,class:`badge`},fw={class:`sub u-truncate`},pw=G(M({__name:`ActivityIsland`,props:{scopeId:{default:`activity`}},setup(e){let t=e,{projects:n}=Oc(),i=ll(),a=ua(),{items:o}=xC(),s=z(()=>n.value.filter(e=>e.runtime?.status===`running`)),c=z(()=>s.value.length+o.value.length),l=z(()=>`Запущено проектов: ${s.value.length}, агентов за работой: ${o.value.length}`),u=e=>n.value.find(t=>t.id===e)?.name??e,d=Mb();function f(e){return[e.busy&&e.startedAt!==void 0?`работает ${Ob(d.value-e.startedAt)}`:``,e.tasks?`в фоне: ${e.tasks}`:e.topic].filter(Boolean).join(` · `)}let p=mu({anchor:`right`,initialFocus:[`button.row`],returnFocus:`.trigger`});E(t.scopeId,()=>({surface:`activity`})).scope.registerCommand({id:`ide.activity.toggle`,title:`Показать запущенные проекты и агентов`,description:`Открывает или закрывает остров активности: запущенные проекты (с остановкой) и агенты, которые сейчас работают.`,run:()=>p.toggle()});function m(e){p.close(!1),a.push(Rc(e))}function h(e){let t=n.value.find(t=>t.id===e.projectId);e.job?fte(e.projectId,e.job.id):hS(e.projectId,e.chat),t?m(t.path):p.close(!1)}return(e,t)=>(V(),q(W,null,[K(`div`,{ref:e=>H(p).trigger.value=e,class:`activity`},[K(`button`,{type:`button`,class:O([`trigger count`,{active:c.value}]),title:l.value,"aria-label":l.value,"aria-expanded":H(p).open.value,"aria-controls":H(p).id,onClick:t[0]||=e=>H(p).toggle()},[t[1]||=K(`span`,{class:`count-dot`,"aria-hidden":`true`},null,-1),N(j(c.value),1)],10,ow)],512),I(kl,{menu:H(p),label:`Запущенные проекты и агенты`,width:320},{default:F(()=>[c.value?B(``,!0):(V(),q(`p`,sw,`Ничего не запущено`)),s.value.length?(V(),q(W,{key:1},[I(Gd,null,{default:F(()=>[...t[2]||=[N(`Проекты`,-1)]]),_:1}),(V(!0),q(W,null,J(s.value,e=>(V(),Y(r,{key:e.id,gap:1,justify:`normal`,align:`center`},{default:F(()=>[I(ts,{class:`row`,onClick:t=>m(e.path)},{default:F(()=>[t[3]||=K(`span`,{class:`dot`,"aria-hidden":`true`},null,-1),K(`span`,cw,j(e.name),1),K(`span`,lw,j(e.runtime?.commandName),1)]),_:2},1032,[`onClick`]),I(Q,{shape:`icon`,size:`sm`,title:`Остановить проект`,"aria-label":`Остановить проект`,onClick:t=>H(i).stop(e.id)},{default:F(()=>[I(H(u_),{"aria-hidden":`true`})]),_:1},8,[`onClick`])]),_:2},1024))),128))],64)):B(``,!0),H(o).length?(V(),q(W,{key:2},[I(Gd,{divided:s.value.length>0},{default:F(()=>[...t[4]||=[N(`Агенты`,-1)]]),_:1},8,[`divided`]),(V(!0),q(W,null,J(H(o),e=>(V(),Y(ts,{key:e.chat,class:`row`,title:e.topic,onClick:t=>h(e)},{default:F(()=>[e.busy?(V(),Y(An,{key:0})):e.needsUser?(V(),Y(H(E_),{key:1,class:`alert`,"aria-hidden":`true`})):(V(),Y(H(aw),{key:2,class:`bot`,"aria-hidden":`true`})),K(`span`,uw,j(e.agent)+` · `+j(u(e.projectId)),1),e.needsUser?(V(),q(`span`,dw,`ждёт вас`)):B(``,!0),K(`span`,fw,j(f(e)),1)]),_:2},1032,[`title`,`onClick`]))),128))],64)):B(``,!0)]),_:1},8,[`menu`])],64))}}),[[`__scopeId`,`data-v-ae5620b6`]]),mw={vue:`xml`,svelte:`xml`,astro:`xml`,mdx:`markdown`};function hw(e){if(!e)return``;let t=(e.split(/[\\/]/).at(-1)??e).toLowerCase(),n=t.includes(`.`)?t.split(`.`).at(-1):t,r=mw[n]??n;return Jr.getLanguage(r)?r:``}var gw=new ii({html:!0,linkify:!0,breaks:!0,highlight(e,t){if(t&&Jr.getLanguage(t))try{return Jr.highlight(e,{language:t,ignoreIllegals:!0}).value}catch{}return``}});function _w(e,t){let n={target:`_blank`,rel:`noopener noreferrer`},r=qy(e);if(r.kind===`file`&&(n[`data-chat-file`]=r.href,!t)){let e=r.line?r.endLine?`:${r.line}–${r.endLine}`:`:${r.line}${r.column?`:${r.column}`:``}`:``;n.title=e?`Открыть ${r.path}${e}`:`Открыть файл в Projector`}return n}var vw=gw.renderer.rules.fence;gw.renderer.rules.fence=(e,t,n,r,i)=>{let a=e[t];return a.info.trim().toLowerCase()===`mermaid`?`<div class="md-mermaid">${gw.utils.escapeHtml(a.content)}</div>`:vw?vw(e,t,n,r,i):i.renderToken(e,t,n)};var yw=gw.renderer.rules.link_open;gw.renderer.rules.link_open=(e,t,n,r,i)=>{let a=e[t],o=a.attrGet(`title`);for(let[e,t]of Object.entries(_w(String(a.attrGet(`href`)??``),o==null?void 0:String(o))))a.attrSet(e,t);return yw?yw(e,t,n,r,i):i.renderToken(e,t,n)},gw.renderer.rules.image=(e,t,n,r,i)=>{let a=e[t],o=i.renderInlineAsText(a.children??[],n,r),s=r?.resolveImage;if(s){let e=s(String(a.attrGet(`src`)??``));if(!e)return`<span class="md-image-text">${gw.utils.escapeHtml(o)}</span>`;a.attrSet(`src`,e)}return a.attrSet(`alt`,o),a.attrSet(`loading`,`lazy`),a.attrSet(`decoding`,`async`),a.attrSet(`referrerpolicy`,`no-referrer`),a.attrSet(`class`,`md-image`),i.renderToken(e,t,n)};function bw(e,t){for(let t of e.querySelectorAll(`a`))for(let[e,n]of Object.entries(_w(t.getAttribute(`href`)??``,t.getAttribute(`title`))))t.setAttribute(e,n);for(let n of e.querySelectorAll(`img`)){let e=n.getAttribute(`alt`)??``;if(n.removeAttribute(`srcset`),t){let r=t(n.getAttribute(`src`)??``);if(!r){let t=n.ownerDocument.createElement(`span`);t.className=`md-image-text`,t.textContent=e||`Изображение`,n.replaceWith(t);continue}n.setAttribute(`src`,r)}n.setAttribute(`alt`,e),n.setAttribute(`loading`,`lazy`),n.setAttribute(`decoding`,`async`),n.setAttribute(`referrerpolicy`,`no-referrer`),n.setAttribute(`class`,`md-image`)}for(let t of e.querySelectorAll(`source[srcset]`))t.removeAttribute(`srcset`)}var xw=(e,t={})=>gw.render(e,t),Sw=e=>gw.parse(e,{});function Cw(e,t={}){let n=$r.sanitize(xw(e,t),{USE_PROFILES:{html:!0},ADD_ATTR:[`target`,`loading`,`decoding`,`referrerpolicy`,`class`,`data-mermaid-source`],RETURN_DOM:!0});return bw(n,t.resolveImage),n.innerHTML}var ww=/^ {0,3}\[[^\]\n]+\]:\s*\S/m,Tw=new Set([`bullet_list_open`,`ordered_list_open`,`code_block`]);function Ew(e=Cw){let t=[],n=``;function r(){t=[],n=``}return{update(i){let a=!ww.test(i);a&&i.startsWith(n)||r();let o=i.slice(n.length),s=[0];for(let e=o.indexOf(`
|
|
50
|
+
`);e>=0;e=o.indexOf(`
|
|
51
|
+
`,e+1))s.push(e+1);let c=a?Sw(o).filter(e=>e.level===0&&e.map&&e.nesting>=0).map(e=>({start:e.map[0],continues:Tw.has(e.type)})):[],l=c.at(-2)?.continues?c.length-2:c.length-1;if(l>0){let r=s[c[l].start];for(let n=0;n<l;n++){let r=n===0?0:s[c[n].start],i=o.slice(r,s[c[n+1].start]);t.push({key:t.length,html:e(i)})}return n+=o.slice(0,r),[...t,{key:t.length,html:e(o.slice(r))}]}return[...t,{key:t.length,html:e(o)}]}}}function Dw(e){return e?`risk-${e.score}`:`risk-0`}function Ow(e){return e?e.score>=4?`danger`:e.score===3?`warning`:`neutral`:`warning`}function kw(e){return e.persistent&&(!e.judge||e.judge.score<4)}var Aw=300,jw=`Агент обдумывает задачу…`,Mw=1500,Nw=500;function Pw(e){let t=eS(e,!0,!0).slice(-20),n=0;for(;n<t.length&&t[n].role!==`user`;)n++;return t.slice(n)}function Fw(e,t=[]){if(t.some(e=>e.status!==`completed`))return!0;let n=e.at(-1);return n?.role===`assistant`?n.text.trim()||n.tools.some(e=>e.status===`running`&&!e.parent)?!0:(n.parts??[]).some(e=>e.type===`thought`&&e.text.trim()):!1}function Iw(e,t,n){let r=e.at(-1);if(r?.role!==`assistant`)return``;let i=(r.parts??[]).some(e=>e.type===`thought`&&e.text.trim()),a=r.tools.some(e=>e.status===`running`&&!e.parent);return[i?`thought`:``,r.text.trim()?`text`:``,a?`running`:``,t.trim(),n.map(e=>e.status).join(`,`)].join(`|`)}function Lw(e,t,n,r,i){let a=e.at(-1),o=a?.role===`assistant`?a.tools.filter(e=>e.status===`running`&&!e.parent).slice(-8).map(e=>({name:e.name,...e.input?{input:e.input.slice(0,Aw)}:{},...e.startedAt?{startedAt:e.startedAt}:{}})):[];return{busy:t,...n.trim()?{phase:n.trim()}:{},running:o,plan:i.map(e=>({content:e.content,status:e.status})),queue:r.length}}function Rw(e,t,n,r,i){return JSON.stringify({history:Pw(e),state:Lw(e,t,n,r,i)})}function zw(e){let t=at({open:!1,text:``,at:0,auto:!0,busy:!1,error:``}),n=e.intervalMs??2e4,r=0,i,a,o,s=``,c=!1;function l(){a!==void 0&&clearInterval(a),a=void 0,!t.open||!t.auto?d():a=setInterval(()=>{e.busy.value&&(typeof document<`u`&&document.hidden||m(!1))},n)}function u(){a!==void 0&&clearInterval(a),a=void 0,d()}function d(){c=!1,o!==void 0&&clearTimeout(o),o=void 0}function f(e=Mw){t.open&&t.auto&&(c=!0,o!==void 0&&clearTimeout(o),o=setTimeout(()=>{o=void 0,p()},e))}async function p(){c&&(!t.open||!t.auto||!e.busy.value?c=!1:t.busy?o=setTimeout(()=>{o=void 0,p()},Nw):(c=!1,await m(!1)))}async function m(n=!0){if(!t.open||t.busy)return t.text;if(e.busy.value&&!Fw(e.turns.value,e.plan.value))return t.error=``,t.text=jw,t.at=0,t.text;let a=Rw(e.turns.value,e.busy.value,e.phase.value,e.queue.value,e.plan.value);if(!n&&a===s)return t.text;let o=++r;i?.abort();let c=new AbortController;i=c,t.busy=!0,t.error=``;try{let n=await Py({history:Pw(e.turns.value),state:Lw(e.turns.value,e.busy.value,e.phase.value,e.queue.value,e.plan.value),selection:e.selection.value},c.signal);return o===r?(t.text=n.text,t.at=n.at,s=a,n.text):t.text}catch(e){return o===r&&!c.signal.aborted&&(t.error=e instanceof Error?e.message:`Lens не удался`),t.text}finally{o===r&&(t.busy=!1,i=void 0)}}async function h(){return t.open||(t.open=!0,t.error=``,l()),m()}function g(){t.open=!1,r++,i?.abort(),i=void 0,t.busy=!1,u()}function _(){t.open?g():h()}function v(e){t.auto=e,l()}function y(){t.text=``,t.at=0,t.error=``,s=``}function b(){g(),y(),t.auto=!0}function x(){g()}return R(e.busy,e=>{t.open&&t.auto&&(e||Date.now()-t.at>1e3)&&(d(),m())}),R(()=>Iw(e.turns.value,e.phase.value,e.plan.value),()=>{t.open&&t.auto&&e.busy.value&&f()}),R(()=>e.turns.value.length===0,e=>{e&&b()}),zt(x),{state:t,open:h,close:g,toggle:_,setAuto:v,refresh:m,clear:y,reset:b,stop:x}}function Bw(e){return{lensOpen:()=>e.state.open,openLens:()=>e.open(),closeLens:()=>e.close(),refreshLens:()=>e.refresh(),setLensAuto:t=>e.setAuto(t)}}function Vw(e){let t=X([]),n=X(``),r=X(e.auto===!0),i=e.intervalMs??3e3,a,o=0;async function s(){if(!r.value)return;clearTimeout(a),a=void 0;let c=e.backend(),l=e.projectId(),u=e.session();if(!c||!l||!u)return;let d=++o;try{let e=await dy(c,l,u);if(d!==o)return;t.value=e,n.value=``}catch(e){d===o&&(n.value=e instanceof Error?e.message:`Не удалось прочитать сессию`)}d===o&&r.value&&e.running()&&(a=setTimeout(()=>void s(),i))}async function c(){r.value=!0,await s()}function l(){r.value=!1,o++,clearTimeout(a),a=void 0}return R(()=>[e.session(),e.running()],()=>{clearTimeout(a),a=void 0,s()},{immediate:e.auto===!0}),zt(l),{turns:t,error:n,load:s,start:c,stop:l}}function Hw(e){let t=Vw({backend:e.backend,projectId:e.projectId,session:e.session,running:e.running,auto:e.auto}),n=z(()=>{if(t.turns.value.length)return t.turns.value;let n=e.fallback?.();return n?[{id:n.id,role:`user`,text:n.text,tools:[]}]:[]}),r=z(()=>{if(!e.running())return``;let t=e.lastTool();return t?`выполняет ${px(t)}`:``}),i=zw({turns:n,busy:z(()=>e.running()),phase:r,queue:X([]),plan:X([]),selection:z(()=>e.selection?.()??{})}),a=z(()=>i.state.error||i.state.text||(i.state.busy?`Смотрю, чем занят…`:``));async function o(){i.state.open?(i.close(),e.stopOnClose&&t.stop()):(e.startOnOpen?await t.start():n.value.length||await t.load(),await i.open())}return{lens:i,lensNote:a,turns:n,loadError:t.error,toggleLens:o}}function Uw(e){let t=z(()=>Wb(e.turns.value)),n=X(``),r=z(()=>n.value?Gb(e.turns.value,n.value):void 0);R(()=>!!n.value&&!r.value,e=>{e&&(n.value=``)});function i(e){n.value=n.value===e?``:e}function a(t){e.openTab(Ub(e.turns.value).find(e=>e.id===t),t)}return{tasks:t,viewing:n,viewed:r,view:i,open:a}}var Ww={key:0,class:`code highlighted`},Gw=[`innerHTML`],Kw=[`innerHTML`],qw=G(M({__name:`AgentCodeBlock`,props:{text:{},diff:{type:Boolean},path:{}},setup(e){let t=e,n=z(()=>hw(t.path));function r(e){if(!n.value)return``;try{return Jr.highlight(e,{language:n.value,ignoreIllegals:!0}).value}catch{return``}}let i=z(()=>{if(t.diff||!n.value)return``;try{return Jr.highlight(t.text,{language:n.value,ignoreIllegals:!0}).value}catch{return``}}),a=z(()=>t.text.split(`
|
|
52
|
+
`).filter((e,n)=>!(t.diff&&n===1&&!e)).map((e,n)=>{if(!t.diff)return{line:e,kind:``,html:``};if(n===0)return{line:e,kind:`path`,html:``};if(e.startsWith(`- `)){let t=e.slice(2);return{line:t,kind:`del`,html:r(t)}}if(e.startsWith(`+ `)){let t=e.slice(2);return{line:t,kind:`add`,html:r(t)}}return e===`@@`?{line:`⋯`,kind:`gap`,html:``}:{line:e,kind:``,html:r(e)}}));return(t,n)=>i.value?(V(),q(`pre`,Ww,[K(`code`,{innerHTML:i.value},null,8,Gw)])):(V(),q(`pre`,{key:1,class:O([`code`,{diff:e.diff}])},[(V(!0),q(W,null,J(a.value,(e,t)=>(V(),q(`span`,{key:t,class:O([`row`,e.kind])},[e.html?(V(),q(`span`,{key:0,innerHTML:e.html},null,8,Kw)):(V(),q(W,{key:1},[N(j(e.line||` `),1)],64))],2))),128))],2))}}),[[`__scopeId`,`data-v-818aba56`]]),Jw={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Yw(e,t){return V(),q(`svg`,Jw,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`}),K(`path`,{d:`M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3m.08 4h.01`})],-1)]])}var Xw=U({name:`lucide-shield-question`,render:Yw}),Zw=G(M({__name:`AgentStatusIcon`,props:{status:{},label:{}},setup(e){return(t,n)=>e.status===`running`||e.status===`queued`?(V(),Y(An,{key:0})):e.status===`needs-user`||e.status===`waiting`?(V(),Y(H(Xw),{key:1,class:`waiting-icon`,"aria-hidden":`true`})):e.status===`error`||e.status===`failed`?(V(),Y(H(E_),{key:2,class:`error-icon`,"aria-label":e.label,"aria-hidden":e.label?void 0:`true`},null,8,[`aria-label`,`aria-hidden`])):e.status===`stopped`||e.status===`canceled`?(V(),Y(H(u_),{key:3,class:`faint-icon`,"aria-hidden":`true`})):(V(),Y(H(C_),{key:4,class:`done-icon`,"aria-hidden":`true`}))}}),[[`__scopeId`,`data-v-ddd5f15b`]]),Qw=/^(\d+)\t/;function $w(e){let t=e.split(`
|
|
53
|
+
`);t.length>1&&t.at(-1)===``&&(t=t.slice(0,-1));let n=Qw.exec(t[0]??``);if(!n)return e;let r=Number(n[1]),i=[];for(let n of t){let t=`${r}\t`;if(!n.startsWith(t))return e;i.push(n.slice(t.length)),r++}return i.join(`
|
|
54
|
+
`)}var eT={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function tT(e,t){return V(),q(`svg`,eT,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 19h8M4 17l6-6l-6-6`},null,-1)]])}var nT=U({name:`lucide-terminal`,render:tT}),rT={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function iT(e,t){return V(),q(`svg`,rT,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`}),K(`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5M10 9H8m8 4H8m8 4H8`})],-1)]])}var aT=U({name:`lucide-file-text`,render:iT}),oT={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function sT(e,t){return V(),q(`svg`,oT,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`12`,cy:`12`,r:`10`}),K(`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20a14.5 14.5 0 0 0 0-20M2 12h20`})],-1)]])}var cT=U({name:`lucide-globe`,render:sT}),lT=[`open`],uT=[`title`],dT=[`title`],fT=[`title`],pT={key:0,class:`file-row`},mT=[`title`],hT=[`aria-label`],gT=[`src`,`alt`],_T={key:1,class:`picture-fallback`},vT={class:`io-label`},yT={key:0,class:`file-row`},bT=[`title`],xT={class:`io-label`},ST={key:0,class:`nested`},CT={class:`io-label`},wT=G(M({__name:`AgentToolCall`,props:{tool:{},root:{}},emits:[`open`],setup(e,{emit:t}){let n=e,r=t;function i(e){try{let t=JSON.parse(e.detail);return e.name===`bash`&&e.status!==`running`?{hint:t.terminated?`Прервано`:`Код ${t.exitCode??`—`}`,status:t.terminated||t.exitCode!==0?`error`:`done`,text:[t.stdout,t.stderr].filter(Boolean).join(`
|
|
55
|
+
`)||`Без вывода`}:e.name===`list_commands`&&Array.isArray(t.commands)?{hint:`${t.commands.length} найдено`,text:t.commands.map(e=>`${e.title}\n${e.id}`).join(`
|
|
56
|
+
|
|
57
|
+
`)||`Подходящих команд нет`}:e.name===`describe_command`?{hint:t.title??t.command??``,text:t.description?[t.id,t.description,...Object.entries(t.arguments??{}).map(([e,t])=>`${e}: ${t}`)].join(`
|
|
58
|
+
|
|
59
|
+
`):e.detail}:e.name===`execute_command`&&t.completed?{hint:`Выполнено`,text:`Команда выполнена в Projector.`}:{hint:``,text:e.detail}}catch{return{hint:``,text:e.detail}}}let a=z(()=>_x(n.tool.name,n.tool.kind)),o=tt(Fx,``),s=z(()=>tx(n.tool.input??``)),c=z(()=>nx(n.tool.input??``)),l=z(()=>vx(c.value,n.root)),u=z(()=>typeof s.value?.command==`string`?s.value.command:``),d=z(()=>typeof s.value?.content==`string`?s.value.content:``),f=z(()=>Qb(c.value)),p=z(()=>{if(a.value!==`read`)return``;if(Zb(c.value))return c.value;let e=/^Reading media:\s*(.+)$/i.exec(n.tool.name)?.[1]?.trim()??``;return Zb(e)?e:``}),m=z(()=>{let e=p.value;if(!e)return;let t=Px(e,o);return t?{src:t,alt:vx(e,n.root)||e}:void 0}),h=X(!1);R(m,()=>h.value=!1);let g=X(),_=z(()=>{let e=n.tool,t=i(e),r=e.input??(e.status===`running`?e.detail:``),o=a.value,s=e.status===`running`,p=!s&&o===`read`?$w(t.text):t.text,h=fx(e.name,r);return{label:f.value?`Чтение навыка`:px(e.name,r),hint:f.value||(h?``:c.value?l.value:u.value||rx(r)||t.hint),path:c.value?l.value:``,status:t.status??e.status,result:s?``:p,resultHint:s?``:t.hint,live:s?e.output??``:``,input:r?cx(e.name,r):``,diff:ox(e.name),running:s,showInput:!!r&&o!==`read`,body:o===`write`?d.value:``,badge:s?``:o===`write`?`+${yx(d.value)}`:o===`read`?m.value?``:`${yx(p)} стр.`:o===`bash`?t.hint:``}}),v=z(()=>{switch(a.value){case`bash`:return nT;case`search`:return If;case`web`:return cT;case`task`:return aw;case`read`:case`write`:case`edit`:return aT;default:return ff}}),y=X(a.value===`bash`&&n.tool.status===`running`);R(()=>n.tool.status,e=>{e===`running`&&a.value===`bash`||e===`error`||e===`done`&&a.value===`read`&&yx(_.value.result)<=80?y.value=!0:e===`done`&&a.value===`bash`&&_.value.status!==`error`&&(y.value=!1)});let b=e=>{y.value=e.target.open},x=X();R(()=>n.tool.output,async()=>{await Ut();let e=x.value?.querySelectorAll(`pre`),t=e?.[e.length-1];t&&(t.scrollTop=t.scrollHeight)});let S=Mb(),C=z(()=>{let e=n.tool;return e.startedAt===void 0?``:e.status===`running`?Ob(S.value-e.startedAt):e.endedAt===void 0?``:Ob(e.endedAt-e.startedAt)}),w=z(()=>n.tool.status===`running`?`Выполняется ${C.value}`:`Длительность: ${C.value}`);return(t,n)=>{let i=pe(`AgentToolCall`,!0);return V(),q(W,null,[K(`details`,{class:O([`tool`,[_.value.status,{streaming:_.value.running&&_.value.live}]]),open:y.value,onToggle:b},[I(yg,{variant:`padded`},{default:F(()=>[(V(),Y(qe(v.value),{class:`tool-icon`,"aria-hidden":`true`})),K(`span`,{class:`tool-name u-truncate`,title:_.value.label},j(_.value.label),9,uT),K(`span`,{class:`tool-hint u-truncate`,title:_.value.hint},j(_.value.hint),9,dT),_.value.badge?(V(),q(`span`,{key:0,class:O([`tool-badge`,{failed:_.value.status===`error`}])},j(_.value.badge),3)):B(``,!0),C.value?(V(),q(`span`,{key:1,class:`tool-time`,title:w.value},j(C.value),9,fT)):B(``,!0),e.tool.status===`running`?(V(),Y(An,{key:2,class:`state-icon`,label:`Выполняется`})):_.value.status===`error`?(V(),Y(H(E_),{key:3,class:`state-icon error-icon`,"aria-label":`Ошибка`})):B(``,!0),I(H(of),{class:`row-chevron`,"aria-hidden":`true`})]),_:1}),K(`div`,{ref_key:`body`,ref:x,class:`tool-body`},[a.value===`read`?(V(),q(W,{key:0},[_.value.path?(V(),q(`div`,pT,[n[6]||=K(`span`,{class:`io-label`},`Файл`,-1),K(`button`,{type:`button`,class:`file u-truncate`,title:`Открыть ${_.value.path}`,onClick:n[0]||=e=>r(`open`,_.value.path)},j(_.value.path),9,mT)])):B(``,!0),m.value&&_.value.status!==`error`?(V(),q(W,{key:1},[n[7]||=K(`div`,{class:`io-label`},`Изображение`,-1),h.value?(V(),q(`p`,_T,j(m.value.alt),1)):(V(),q(`button`,{key:0,type:`button`,class:`picture`,"aria-label":`Открыть изображение: ${m.value.alt}`,onClick:n[2]||=e=>g.value=m.value},[K(`img`,{src:m.value.src,alt:m.value.alt,loading:`lazy`,decoding:`async`,referrerpolicy:`no-referrer`,onError:n[1]||=e=>h.value=!0},null,40,gT)],8,hT))],64)):(V(),q(W,{key:2},[K(`div`,vT,j(_.value.status===`error`?`Ошибка`:`Содержимое`),1),I(qw,{path:c.value,text:_.value.result||(_.value.running?`Ожидание результата…`:`Файл пуст или ничего не вернул`)},null,8,[`path`,`text`])],64))],64)):a.value===`write`?(V(),q(W,{key:1},[_.value.path?(V(),q(`div`,yT,[n[8]||=K(`span`,{class:`io-label`},`Куда`,-1),K(`button`,{type:`button`,class:`file u-truncate`,title:`Открыть ${_.value.path}`,onClick:n[3]||=e=>r(`open`,_.value.path)},j(_.value.path),9,bT)])):B(``,!0),n[10]||=K(`div`,{class:`io-label`},`Содержимое`,-1),I(qw,{text:_.value.body||`Пустой файл`},null,8,[`text`]),_.value.result?(V(),q(W,{key:1},[n[9]||=K(`div`,{class:`io-label`},`Результат`,-1),I(qw,{text:_.value.result},null,8,[`text`])],64)):B(``,!0)],64)):a.value===`edit`&&_.value.diff&&_.value.showInput?(V(),q(W,{key:2},[n[12]||=K(`div`,{class:`io-label`},`Изменения`,-1),I(qw,{path:c.value,text:_.value.input,diff:!0},null,8,[`path`,`text`]),_.value.status===`error`?(V(),q(W,{key:0},[n[11]||=K(`div`,{class:`io-label`},`Ошибка`,-1),I(qw,{text:_.value.result||`Ошибка инструмента`},null,8,[`text`])],64)):B(``,!0)],64)):a.value===`bash`?(V(),q(W,{key:3},[n[13]||=K(`div`,{class:`io-label`},`Команда`,-1),I(qw,{text:_.value.input||`…`},null,8,[`text`]),K(`div`,xT,j(_.value.running?`Вывод`:`Результат`),1),I(qw,{text:_.value.live||_.value.result||(_.value.running?`Ожидание вывода…`:`Без вывода`)},null,8,[`text`])],64)):(V(),q(W,{key:4},[_.value.showInput?(V(),q(W,{key:0},[n[14]||=K(`div`,{class:`io-label`},`Вход`,-1),I(qw,{text:_.value.input,diff:_.value.diff},null,8,[`text`,`diff`])],64)):B(``,!0),n[15]||=K(`div`,{class:`io-label`},`Результат`,-1),I(qw,{text:_.value.result||(_.value.running?`Ожидание результата…`:`Без вывода`)},null,8,[`text`])],64))],512),e.tool.children?.length?(V(),q(`div`,ST,[K(`div`,CT,`Вызовы субагента: `+j(e.tool.children.length),1),(V(!0),q(W,null,J(e.tool.children,t=>(V(),Y(i,{key:t.id,tool:t,root:e.root,onOpen:n[4]||=e=>r(`open`,e)},null,8,[`tool`,`root`]))),128))])):B(``,!0)],42,lT),g.value?(V(),Y(qr,{key:0,src:g.value.src,alt:g.value.alt,onClose:n[5]||=e=>g.value=void 0},null,8,[`src`,`alt`])):B(``,!0)],64)}}}),[[`__scopeId`,`data-v-bbd5342b`]]),TT={key:0,class:`activity single`},ET=[`title`],DT=[`title`],OT=[`title`],kT={key:2,class:`count`},AT={class:`activity-list`},jT=G(M({__name:`AgentActivity`,props:{tools:{},root:{}},emits:[`open`],setup(e,{emit:t}){let n=e,r=t,i=z(()=>n.tools.findLast(e=>e.status===`running`)),a=z(()=>i.value?.output??``),o=z(()=>a.value.split(`
|
|
60
|
+
`).slice(-6).filter((e,t,n)=>e||t<n.length-1).join(`
|
|
61
|
+
`)),s=z(()=>n.tools.some(e=>e.status===`error`)),c=z(()=>{let e=i.value;if(!e)return``;let t=e.input??e.detail;return fx(e.name,t)?``:rx(t)}),l=Mb(),u=z(()=>{let e=i.value;return!e||e.startedAt===void 0?``:Ob(l.value-e.startedAt)}),d=z(()=>{if(i.value)return px(i.value.name,i.value.input??i.value.detail);let e=new Set(n.tools.map(e=>e.name)),t=n.tools[0];return e.size===1?`${px(t.name,t.input??t.detail)} ×${n.tools.length}`:`Действия`});return(t,n)=>e.tools.length===1?(V(),q(`div`,TT,[I(wT,{tool:e.tools[0],root:e.root,onOpen:n[0]||=e=>r(`open`,e)},null,8,[`tool`,`root`])])):(V(),q(`details`,{key:1,class:O([`activity`,{working:i.value,failed:s.value}])},[I(yg,{variant:`fit`,class:`activity-summary`},{default:F(()=>[I(Zw,{status:i.value?`running`:s.value?`error`:`done`},null,8,[`status`]),K(`span`,{class:`activity-title u-truncate`,title:d.value},j(d.value),9,ET),i.value?(V(),q(`span`,{key:0,class:`tool-hint u-truncate`,title:c.value},j(c.value),9,DT)):B(``,!0),u.value?(V(),q(`span`,{key:1,class:`tool-time`,title:`Выполняется ${u.value}`},j(u.value),9,OT)):B(``,!0),i.value||d.value===`Действия`?(V(),q(`span`,kT,j(e.tools.length),1)):B(``,!0),I(H(of),{class:`group-chevron`,"aria-hidden":`true`})]),_:1}),o.value?(V(),Y(qw,{key:0,text:o.value},null,8,[`text`])):B(``,!0),K(`div`,AT,[(V(!0),q(W,null,J(e.tools,t=>(V(),Y(wT,{key:t.id,tool:t,root:e.root,onOpen:n[1]||=e=>r(`open`,e)},null,8,[`tool`,`root`]))),128))])],2))}}),[[`__scopeId`,`data-v-f0eb0ddd`]]),MT={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function NT(e,t){return V(),q(`svg`,MT,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2zm3-12h6m-3 3V7M9 17h6`},null,-1)]])}var PT=U({name:`lucide-file-diff`,render:NT}),FT={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function IT(e,t){return V(),q(`svg`,FT,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M9 14L4 9l5-5`}),K(`path`,{d:`M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11`})],-1)]])}var LT=U({name:`lucide-undo-2`,render:IT}),RT={key:0,class:`changes`},zT={class:`added`},BT={class:`removed`},VT=[`title`,`onClick`],HT={class:`added`},UT={class:`removed`},WT=G(M({__name:`AgentChanges`,props:{tools:{},root:{},canRevert:{type:Boolean}},emits:[`open`,`revert`],setup(e,{emit:t}){let n=e,r=t,i=z(()=>wx(n.tools,n.root)),a=z(()=>({added:i.value.reduce((e,t)=>e+t.added,0),removed:i.value.reduce((e,t)=>e+t.removed,0)}));return(t,n)=>i.value.length?(V(),q(`details`,RT,[I(yg,null,{default:F(()=>[I(H(PT),{"aria-hidden":`true`}),K(`span`,null,`Изменено файлов: `+j(i.value.length),1),K(`span`,zT,`+`+j(a.value.added),1),K(`span`,BT,`−`+j(a.value.removed),1)]),_:1}),K(`ul`,null,[(V(!0),q(W,null,J(i.value,e=>(V(),q(`li`,{key:e.path},[K(`button`,{type:`button`,class:`file u-truncate`,title:e.path,onClick:t=>r(`open`,e.path)},j(e.path),9,VT),K(`span`,HT,`+`+j(e.added),1),K(`span`,UT,`−`+j(e.removed),1)]))),128))]),e.canRevert?(V(),Y(Q,{key:0,size:`sm`,title:`Вернуть файлы к состоянию до этого запроса`,onClick:n[0]||=e=>r(`revert`)},{default:F(()=>[I(H(LT),{"aria-hidden":`true`}),n[1]||=N(`Вернуть файлы `,-1)]),_:1})):B(``,!0)])):B(``,!0)}}),[[`__scopeId`,`data-v-5341dbbe`]]),GT=M({__name:`AgentFormPanel`,props:{source:{},values:{},readonly:{type:Boolean},composer:{type:Boolean},projectId:{}},emits:[`submit`,`submittable`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=z(()=>r.readonly===!0),o=new Set;ot(Lh,{composer:r.composer===!0,registerSubmit(e){return o.add(e),i(`submittable`,!0),()=>{o.delete(e),i(`submittable`,o.size>0)}}});function s(){for(let e of o)if(e()===!0)return!0;return!1}t({submit:s});let c=z(()=>r.values&&typeof r.values==`object`?r.values:{});return ot(Ih,{readonly:a,values:c.value}),ot(Fm,((e,t,n)=>i(`submit`,e,t,n))),(t,n)=>(V(),Y(H(ph),{source:e.source,complete:!0,"project-id":e.projectId},null,8,[`source`,`project-id`]))}}),KT={key:0,class:`edit-bar`},qT=G(M({__name:`AgentFormAnswer`,props:{source:{},values:{},busy:{type:Boolean},projectId:{}},emits:[`submit`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=X(!1),o=z(()=>!a.value||r.busy===!0);function s(){r.busy||(a.value=!0)}function c(){a.value=!1}function l(e,t,n){a.value=!1,i(`submit`,e,t,n)}return t({start:s,cancel:c}),(t,n)=>(V(),q(`div`,{class:O([`answer-form`,{editing:a.value}])},[I(GT,{source:e.source,values:e.values,readonly:o.value,"project-id":e.projectId,onSubmit:l},null,8,[`source`,`values`,`readonly`,`project-id`]),a.value?(V(),q(`div`,KT,[n[1]||=K(`span`,null,`Измените ответ и нажмите кнопку в форме.`,-1),I(Q,{size:`sm`,onClick:c},{default:F(()=>[...n[0]||=[N(`Отмена`,-1)]]),_:1})])):B(``,!0)],2))}}),[[`__scopeId`,`data-v-35550fe9`]]),JT={class:`judge-note`},YT={class:`judge-text`},XT=G(M({__name:`AgentJudgeNote`,props:{tool:{},title:{},verdict:{}},setup(e){let t=e,n=z(()=>Tv(t.verdict.score)),r=z(()=>t.title?.trim()||t.tool);return(t,i)=>(V(),q(`p`,JT,[i[0]||=K(`span`,{class:`judge-name`},`Судья`,-1),I(hl,{tone:n.value},{default:F(()=>[N(j(e.verdict.score)+`/5 · `+j(e.verdict.label),1)]),_:1},8,[`tone`]),K(`span`,YT,[K(`strong`,null,j(r.value),1),N(` — `+j(e.verdict.reason)+`. Разрешено автоматически. `,1)])]))}}),[[`__scopeId`,`data-v-a40c79da`]]),ZT={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function QT(e,t){return V(),q(`svg`,ZT,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M3 12a9 9 0 0 1 9-9a9.75 9.75 0 0 1 6.74 2.74L21 8`}),K(`path`,{d:`M21 3v5h-5m5 4a9 9 0 0 1-9 9a9.75 9.75 0 0 1-6.74-2.74L3 16`}),K(`path`,{d:`M8 16H3v5`})],-1)]])}var $T=U({name:`lucide-refresh-cw`,render:QT}),eE={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function tE(e,t){return V(),q(`svg`,eE,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M3 7V5a2 2 0 0 1 2-2h2m10 0h2a2 2 0 0 1 2 2v2m0 10v2a2 2 0 0 1-2 2h-2M7 21H5a2 2 0 0 1-2-2v-2`}),K(`circle`,{cx:`12`,cy:`12`,r:`1`}),K(`path`,{d:`M18.944 12.33a1 1 0 0 0 0-.66a7.5 7.5 0 0 0-13.888 0a1 1 0 0 0 0 .66a7.5 7.5 0 0 0 13.888 0`})],-1)]])}var nE=U({name:`lucide-scan-eye`,render:tE}),rE={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function iE(e,t){return V(),q(`svg`,rE,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M10 2h4m-2 12l3-3`}),K(`circle`,{cx:`12`,cy:`14`,r:`8`})],-1)]])}var aE=U({name:`lucide-timer`,render:iE}),oE={class:`lens`,"aria-label":`Lens: чем агент занят сейчас`},sE={class:`lens-head`},cE=[`title`],lE={key:0,class:`lens-text error`,role:`status`},uE={key:1,class:`lens-text`},dE={key:2,class:`lens-text empty`},fE=G(M({__name:`AgentLens`,props:{lens:{}},setup(e){let t=e,n=Mb(),r=z(()=>t.lens.state.at?`${Ob(n.value-t.lens.state.at)} назад`:``),i=z(()=>t.lens.state.at?new Date(t.lens.state.at).toLocaleTimeString(`ru`):``);return(t,n)=>(V(),q(`section`,oE,[K(`div`,sE,[I(H(nE),{class:`lens-icon`,"aria-hidden":`true`}),n[3]||=K(`span`,{class:`lens-title`},`Lens`,-1),e.lens.state.busy?(V(),Y(An,{key:0})):r.value?(V(),q(`time`,{key:1,class:`lens-time`,title:i.value},j(r.value),9,cE)):B(``,!0),I(Q,{shape:`icon`,size:`sm`,disabled:e.lens.state.busy,title:`Обновить описание`,"aria-label":`Обновить описание`,onClick:n[0]||=t=>e.lens.refresh()},{default:F(()=>[I(H($T),{"aria-hidden":`true`})]),_:1},8,[`disabled`]),I(Q,{shape:`icon`,size:`sm`,class:O({on:e.lens.state.auto}),"aria-pressed":e.lens.state.auto,title:`Обновлять по таймеру, пока агент работает`,"aria-label":`Автообновление Lens`,onClick:n[1]||=t=>e.lens.setAuto(!e.lens.state.auto)},{default:F(()=>[I(H(aE),{"aria-hidden":`true`})]),_:1},8,[`class`,`aria-pressed`]),I(Q,{shape:`icon`,size:`sm`,title:`Скрыть Lens`,"aria-label":`Скрыть Lens`,onClick:n[2]||=t=>e.lens.close()},{default:F(()=>[I(H(oi),{"aria-hidden":`true`})]),_:1})]),e.lens.state.error?(V(),q(`p`,lE,j(e.lens.state.error),1)):e.lens.state.text?(V(),q(`p`,uE,j(e.lens.state.text),1)):(V(),q(`p`,dE,j(e.lens.state.busy?`Смотрю, чем занят агент…`:`Обновите, чтобы узнать, чем занят агент.`),1))]))}}),[[`__scopeId`,`data-v-917c5aa6`]]);function pE(e){let t=document.createElement(`a`);t.href=e,t.target=`_blank`,t.rel=`noopener noreferrer`,document.body.append(t),t.click(),t.remove()}var mE=[`innerHTML`],hE=G(M({__name:`AgentMarkdown`,props:{text:{},streaming:{type:Boolean}},setup(e){let t=e,n=tt(Fx,``),r=tt(Ix,void 0),i=Ew(e=>Cw(e,{resolveImage:e=>Px(e,n)})),a=X(),o=We(i.update(t.text)),s=X(),c=X(),l=new Set,u=X(),d=X([]),f,p=0;function m(){clearTimeout(f),f=void 0;let e=performance.now();o.value=i.update(t.text);let n=performance.now();p=n+(n-e)*3}R(()=>[t.text,t.streaming],([,e])=>{let t=p-performance.now();!e||t<=0?m():f??=setTimeout(m,t)});function h(){for(let e of l)e.destroy();l.clear()}R(o,async()=>{h(),await Ut();for(let e of a.value?.querySelectorAll(`.md-mermaid`)??[]){let t=e.textContent??``,n=ri(t,{expand:()=>c.value=t});l.add(n),e.replaceWith(n.element)}},{flush:`post`,immediate:!0}),lt(()=>{clearTimeout(f),h()});function g(e){if(!(e.target instanceof Element))return;let t=e.target.closest(`.md img`);if(!(t instanceof HTMLImageElement)||t.closest(`a`))return;let n=t.currentSrc||t.src;n&&(e.preventDefault(),s.value={src:n,alt:t.alt})}function _(e){if(!(e.target instanceof HTMLImageElement))return;let t=e.target,n=t.currentSrc||t.src,r=document.createElement(`a`);r.className=`md-image-text`,r.textContent=t.alt||`Изображение`,n&&(r.href=n),r.target=`_blank`,r.rel=`noopener noreferrer`,t.replaceWith(r)}function v(e){if(e instanceof Element)return e.closest(`.md a[href], .md a[data-chat-file]`)??void 0}function y(e){return e.dataset.chatFile||e.getAttribute(`href`)||``}function b(e){if(e.button!==0||e.defaultPrevented)return;let t=v(e.target);if(!t)return;let n=qy(y(t));n.kind===`file`&&(e.preventDefault(),r&&r.openFile(n,t))}function x(e){g(e),b(e)}function S(e,t){if(e.kind===`web`)return[{id:`link.open`,label:`Открыть в новой вкладке`,icon:bi,run:()=>pE(e.href)},{id:`link.copyAddress`,label:`Копировать адрес ссылки`,icon:Tg,run:()=>void r?.copyAddress(e.href,t)}];if(e.kind!==`file`)return[];let n=[{id:`link.openFile`,label:`Открыть файл`,icon:aT,run:()=>void r?.openFile(e,t)},{id:`link.copyAbsolute`,label:`Копировать абсолютный путь`,icon:Tg,separator:!0,run:()=>void r?.copyAbsolute(e,t)}];return e.external||n.push({id:`link.copyRelative`,label:`Копировать относительный путь`,icon:Tg,run:()=>void r?.copyRelative(e,t)}),n}function C(e){let t=v(e.target);if(!t)return;let n=S(qy(y(t)),t);n.length&&(e.preventDefault(),d.value=n,Ut(()=>u.value?.open(e,t)))}return(e,t)=>(V(),q(W,null,[K(`div`,{ref_key:`root`,ref:a,class:`md`,onClick:x,onContextmenu:C,onErrorCapture:_},[(V(!0),q(W,null,J(o.value,e=>(V(),q(`div`,{key:e.key,class:`md-block`,innerHTML:e.html},null,8,mE))),128))],544),s.value?(V(),Y(qr,{key:0,src:s.value.src,alt:s.value.alt,onClose:t[0]||=e=>s.value=void 0},null,8,[`src`,`alt`])):B(``,!0),c.value===void 0?B(``,!0):(V(),Y(H(ti),{key:1,source:c.value,onClose:t[1]||=e=>c.value=void 0},null,8,[`source`])),d.value.length?(V(),Y(Wd,{key:2,ref_key:`linkMenu`,ref:u,items:d.value,label:`Ссылка`},null,8,[`items`])):B(``,!0)],64))}}),[[`__scopeId`,`data-v-c262cc89`]]),gE={class:`agent-message`},_E={key:0,class:`promoted-form`},vE={key:1,class:`promoted-form`},yE=G(M({__name:`AgentMessage`,props:{text:{},streaming:{type:Boolean},promoted:{},answered:{type:Boolean},projectId:{}},setup(e){let t=e;R(()=>t.projectId,e=>void Ph(e),{immediate:!0});let n=z(()=>(nh.value,bh(t.text,{known:e=>ch(e,t.projectId),streaming:t.streaming}))),r=X([]);return Vm(n,Ke(()=>!t.streaming),r),(t,i)=>(V(),q(`div`,gE,[(V(!0),q(W,null,J(n.value,(t,n)=>(V(),q(W,{key:n},[t.type===`markdown`?(V(),Y(hE,{key:0,text:t.text,streaming:e.streaming},null,8,[`text`,`streaming`])):t.type===`widget`&&t.source===e.promoted?(V(),q(W,{key:1},[e.answered&&t.name!==`IntelligentForm`?(V(),q(`p`,_E,[...i[0]||=[K(`span`,{"aria-hidden":`true`},`✓`,-1),N(` Ответ отправлен в форме. `,-1)]])):!e.answered&&t.name!==`IntelligentForm`?(V(),q(`p`,vE,[...i[1]||=[K(`span`,{"aria-hidden":`true`},`↓`,-1),N(` Форма доступна в поле ввода. `,-1)]])):B(``,!0)],64)):t.type===`widget`?(V(),Y(H(ph),{key:2,source:t.source,complete:t.complete,"project-id":e.projectId},null,8,[`source`,`complete`,`project-id`])):B(``,!0)],64))),128)),(V(!0),q(W,null,J(r.value,e=>(V(),q(`p`,{key:e,class:`script-error`,role:`alert`},j(e),1))),128))]))}}),[[`__scopeId`,`data-v-c839f116`]]),bE={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function xE(e,t){return V(),q(`svg`,bE,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`},null,-1)]])}var SE=U({name:`lucide-shield`,render:xE}),CE={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function wE(e,t){return V(),q(`svg`,CE,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1zm-8-5v4m0 4h.01`},null,-1)]])}var TE=U({name:`lucide-shield-alert`,render:wE}),EE={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function DE(e,t){return V(),q(`svg`,EE,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`}),K(`path`,{d:`m9 12l2 2l4-4`})],-1)]])}var OE=U({name:`lucide-shield-check`,render:DE}),kE={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function AE(e,t){return V(),q(`svg`,kE,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1zm-5.5-3.5l-5 5m0-5l5 5`},null,-1)]])}var jE=U({name:`lucide-shield-x`,render:AE}),ME={key:0,class:`permissions`,role:`alertdialog`,"aria-label":`Запрос разрешения`},NE={class:`head`},PE=[`aria-label`,`title`],FE={key:4,class:`risk-score`},IE={class:`head-text`},LE={class:`title-row`},RE=[`title`],zE={class:`tool`},BE={key:0,class:`judge-copy`,role:`note`},VE={key:0},HE=G(M({__name:`AgentPermissions`,props:{permissions:{}},emits:[`decide`],setup(e,{emit:t}){let n=t;return(t,i)=>e.permissions.length?(V(),q(`div`,ME,[(V(!0),q(W,null,J(e.permissions,e=>(V(),Y(l,{key:e.id,class:O([`permission`,H(Dw)(e.judge)]),tone:H(Ow)(e.judge),density:`notice`},{default:F(()=>[K(`div`,NE,[K(`div`,{class:O([`risk-box`,H(Dw)(e.judge)]),"aria-label":e.judge?`Риск ${e.judge.score} из 5: ${e.judge.label}`:`Оценка риска недоступна`,title:e.judge?`Риск ${e.judge.score}/5 · ${e.judge.label}`:void 0},[e.judge&&e.judge.score<=2?(V(),Y(H(OE),{key:0,"aria-hidden":`true`})):e.judge&&e.judge.score===3?(V(),Y(H(TE),{key:1,"aria-hidden":`true`})):e.judge?(V(),Y(H(jE),{key:2,"aria-hidden":`true`})):(V(),Y(H(SE),{key:3,"aria-hidden":`true`})),e.judge?(V(),q(`span`,FE,j(e.judge.score)+`/5`,1)):B(``,!0)],10,PE),K(`div`,IE,[K(`div`,LE,[K(`span`,{class:`title`,title:e.title},j(e.title),9,RE),K(`code`,zE,j(e.tool),1)]),e.judge?(V(),q(`div`,BE,[K(`p`,null,[i[0]||=K(`span`,{class:`judge-label`},`Почему`,-1),N(` `+j(e.judge.reason),1)]),e.judge.effect?(V(),q(`p`,VE,[i[1]||=K(`span`,{class:`judge-label`},`Что изменится`,-1),N(` `+j(e.judge.effect),1)])):B(``,!0)])):B(``,!0)])]),e.detail?(V(),Y(qw,{key:0,class:`command`,text:e.detail,diff:H(ox)(e.tool)},null,8,[`text`,`diff`])):B(``,!0),I(r,{align:`stretch`},{default:F(()=>[I(Q,{appearance:`solid`,size:`sm`,onClick:t=>n(`decide`,e.id,!0)},{default:F(()=>[...i[2]||=[N(` Разрешить `,-1)]]),_:1},8,[`onClick`]),H(kw)(e)?(V(),Y(Q,{key:0,size:`sm`,title:`Разрешить и больше не спрашивать про этот инструмент`,onClick:t=>n(`decide`,e.id,!0,!0)},{default:F(()=>[...i[3]||=[N(` Всегда разрешать `,-1)]]),_:1},8,[`onClick`])):B(``,!0),I(Q,{size:`sm`,onClick:t=>n(`decide`,e.id,!1)},{default:F(()=>[...i[4]||=[N(` Отклонить `,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1032,[`class`,`tone`]))),128))])):B(``,!0)}}),[[`__scopeId`,`data-v-f555e31d`]]),UE={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function WE(e,t){return V(),q(`svg`,UE,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092a10 10 0 1 0-4.777-4.719`}),K(`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3m.08 4h.01`})],-1)]])}var GE=U({name:`lucide-message-circle-question`,render:WE}),KE={key:0,class:`questions`,role:`dialog`,"aria-label":`Вопрос агента`},qE={class:`title`},JE={key:0,class:`header`},YE=[`type`,`name`,`checked`,`onClick`],XE={class:`label`},ZE={key:0},QE=[`onUpdate:modelValue`,`onKeydown`],$E=G(M({__name:`AgentQuestions`,props:{requests:{}},emits:[`answer`],setup(e,{emit:t}){let n=t,i=at({}),a=at({}),o=(e,t)=>`${e}\n${t}`;function s(e,t,n){let r=o(e,t.id),a=i[r]??[];t.multiple?i[r]=a.includes(n)?a.filter(e=>e!==n):[...a,n]:i[r]=a[0]===n?[]:[n]}function c(e){let t={};for(let n of e.questions){let r=o(e.id,n.id),s=(a[r]??``).trim(),c=[...i[r]??[],...s?[s]:[]];t[n.id]=!n.multiple&&s?[s]:c}return t}let u=e=>{let t=c(e);return e.questions.every(e=>e.optional||t[e.id].length>0)};function d(e){u(e)&&n(`answer`,e.id,c(e))}return(t,c)=>e.requests.length?(V(),q(`div`,KE,[(V(!0),q(W,null,J(e.requests,e=>(V(),Y(l,{key:e.id,as:`section`,tone:`warning`,density:`notice`,class:`question`},{default:F(()=>[I(r,{as:`header`,align:`center`,justify:`normal`},{default:F(()=>[I(H(GE),{"aria-hidden":`true`}),K(`span`,qE,j(e.title||`Агент спрашивает`),1)]),_:2},1024),(V(!0),q(W,null,J(e.questions,t=>(V(),q(`fieldset`,{key:t.id},[K(`legend`,null,[t.header?(V(),q(`span`,JE,j(t.header),1)):B(``,!0),N(` `+j(t.question),1)]),(V(!0),q(W,null,J(t.options,n=>(V(),q(`label`,{key:n.id,class:`option`},[K(`input`,{type:t.multiple?`checkbox`:`radio`,name:`${e.id}-${t.id}`,checked:(i[o(e.id,t.id)]??[]).includes(n.id),onClick:r=>s(e.id,t,n.id)},null,8,YE),K(`span`,XE,[N(j(n.label)+` `,1),n.description?(V(),q(`small`,ZE,j(n.description),1)):B(``,!0)])]))),128)),e.custom||t.custom?et((V(),q(`input`,{key:0,"onUpdate:modelValue":n=>a[o(e.id,t.id)]=n,class:`own`,type:`text`,placeholder:`Свой вариант`,"aria-label":`Свой вариант ответа`,onKeydown:yn(Z(t=>d(e),[`prevent`]),[`enter`])},null,40,QE)),[[_n,a[o(e.id,t.id)]]]):B(``,!0)]))),128)),I(r,{align:`stretch`},{default:F(()=>[I(Q,{appearance:`solid`,disabled:!u(e),onClick:t=>d(e)},{default:F(()=>[...c[0]||=[N(` Ответить `,-1)]]),_:1},8,[`disabled`,`onClick`]),I(Q,{onClick:t=>n(`answer`,e.id,null)},{default:F(()=>[...c[1]||=[N(` Пропустить `,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1024))),128))])):B(``,!0)}}),[[`__scopeId`,`data-v-92bd485a`]]),eD=[`aria-label`],tD={class:`head`},nD={class:`titles`},rD=[`title`],iD={class:`meta`},aD=G(M({__name:`AgentTaskFrame`,props:{title:{},hint:{default:``},meta:{},running:{type:Boolean},kind:{},label:{}},setup(e){return(t,n)=>(V(),q(`section`,{class:`task-frame`,"aria-label":e.label},[K(`header`,tD,[L(t.$slots,`leading`,{},void 0,!0),(V(),Y(qe(e.kind===`shell`?H(nT):H(aw)),{class:`kind`,"aria-hidden":`true`})),K(`div`,nD,[K(`div`,{class:`title u-truncate`,title:e.hint||e.title},j(e.title),9,rD),K(`div`,iD,[e.running?(V(),Y(An,{key:0})):B(``,!0),N(j(e.meta),1)])]),L(t.$slots,`actions`,{},void 0,!0)]),L(t.$slots,`default`,{},void 0,!0)],8,eD))}}),[[`__scopeId`,`data-v-8a9611c3`]]),oD={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function sD(e,t){return V(),q(`svg`,oD,[...t[0]||=[ge(`<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M12 18V5m3 8a4.17 4.17 0 0 1-3-4a4.17 4.17 0 0 1-3 4m8.598-6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5"></path><path d="M17.997 5.125a4 4 0 0 1 2.526 5.77"></path><path d="M18 18a4 4 0 0 0 2-7.464"></path><path d="M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517"></path><path d="M6 18a4 4 0 0 1-2-7.464"></path><path d="M6.003 5.125a4 4 0 0 0-2.526 5.77"></path></g>`,1)]])}var cD=U({name:`lucide-brain`,render:sD}),lD=[`open`],uD=G(M({__name:`AgentThought`,props:{text:{},streaming:{type:Boolean}},setup(e){let t=e,n=X();return R(()=>t.text,async()=>{t.streaming&&(await Ut(),n.value&&(n.value.scrollTop=n.value.scrollHeight))}),(t,r)=>(V(),q(`details`,{class:`thought`,open:e.streaming||void 0},[I(yg,{variant:`fit`,class:`thought-summary`},{default:F(()=>[e.streaming?(V(),Y(An,{key:0})):(V(),Y(H(cD),{key:1,class:`thought-icon`,"aria-hidden":`true`})),K(`span`,null,j(e.streaming?`Думает…`:`Рассуждения`),1),I(H(of),{class:`thought-chevron`,"aria-hidden":`true`})]),_:1}),K(`div`,{ref_key:`body`,ref:n,class:`thought-text`},j(e.text),513)],8,lD))}}),[[`__scopeId`,`data-v-97e780f6`]]),dD=M({__name:`AgentWorkBody`,props:{items:{},thinking:{type:Boolean},root:{}},emits:[`open`],setup(e,{emit:t}){let n=t;return(t,r)=>(V(!0),q(W,null,J(e.items,t=>(V(),q(W,{key:t.key},[t.type===`thought`?(V(),Y(uD,{key:0,text:t.text,streaming:e.thinking===!0&&t===e.items.at(-1)},null,8,[`text`,`streaming`])):t.type===`judge`?(V(),Y(XT,{key:1,tool:t.tool,title:t.title,verdict:t.verdict},null,8,[`tool`,`title`,`verdict`])):(V(),Y(jT,{key:2,tools:t.tools,root:e.root,onOpen:r[0]||=e=>n(`open`,e)},null,8,[`tools`,`root`]))],64))),128))}}),fD=[`data-compact`,`open`],pD=[`title`],mD=[`title`],hD={key:0,class:`work-hint`},gD={key:0,class:`work-time`},_D={key:0,class:`work-head`},vD={key:1,class:`work-body`},yD={class:`work-sheet-head`},bD={key:0,class:`work-head-step`},xD={class:`work-sheet-steps`},SD=G(M({__name:`AgentWork`,props:{items:{},busy:{type:Boolean},last:{type:Boolean},current:{type:Boolean},anyRunning:{type:Boolean},root:{},lens:{}},emits:[`open`],setup(e,{emit:t}){let n=e,r=t,i=pu(),a=mu({anchor:`left`,initialFocus:`.work-sheet-title`,items:`[data-work-nav]`,returnFocus:`.work-summary`}),o=X();function s(e){o.value=e??void 0,a.trigger.value=o.value}let c=uu(o),l=X(!1);R(c,e=>{e||a.close(!1)}),R(i,()=>{a.close(!1),l.value=!1}),Ql(window,`keydown`,e=>{e.key===`Escape`&&a.open.value&&(e.preventDefault(),a.close())});let u=e=>{let t=e.target;i.value?t.open=!1:l.value=t.open};function d(e){i.value&&(e.preventDefault(),a.toggle())}function f(e){a.close(!1),r(`open`,e)}let p=z(()=>n.items.flatMap(e=>e.type===`tools`?e.tools:[]).findLast(e=>e.status===`running`)),m=z(()=>n.busy&&n.last),h=z(()=>m.value&&n.current===!0&&!p.value&&n.anyRunning!==!0),g=z(()=>m.value&&!!(p.value||h.value)),_=z(()=>n.items.some(e=>e.type===`tools`&&e.tools.some(e=>e.status===`error`))),v=z(()=>p.value?px(p.value.name,p.value.input??p.value.detail):h.value?`Думает…`:``),y=z(()=>{let e=p.value;if(!e)return``;let t=e.input??e.detail;return fx(e.name,t)?``:rx(t)}),b=z(()=>[v.value,y.value].filter(Boolean).join(` `)),x=Mb(),S=z(()=>{let e=p.value;return!m.value||!e||e.startedAt===void 0?``:Ob(x.value-e.startedAt)});return(t,n)=>(V(),q(W,null,[K(`details`,{ref:s,class:O([`work`,{"island-open":H(i)&&H(a).open.value}]),"data-compact":H(i)?``:void 0,open:!H(i)&&l.value?!0:void 0,onToggle:u},[I(yg,{variant:`fit`,class:`work-summary`,onClick:d},{default:F(()=>[g.value?(V(),Y(An,{key:0})):_.value?(V(),Y(H(E_),{key:1,class:`work-icon error`,"aria-hidden":`true`})):(V(),Y(H(C_),{key:2,class:`work-icon`,"aria-hidden":`true`})),n[6]||=K(`span`,{class:`work-title`},`Работа`,-1),!l.value&&e.lens&&e.lens.state.open&&e.lens.state.text?(V(),q(W,{key:3},[n[5]||=K(`span`,{class:`work-lens-label`},`Lens`,-1),K(`span`,{class:`work-lens u-truncate`,title:e.lens.state.text},j(e.lens.state.text),9,pD)],64)):!l.value&&v.value?(V(),q(W,{key:4},[K(`span`,{class:`work-step u-truncate`,title:b.value},[N(j(v.value),1),y.value?(V(),q(`span`,hD,j(` `+y.value),1)):B(``,!0)],8,mD),S.value?(V(),q(`span`,gD,j(S.value),1)):B(``,!0)],64)):B(``,!0),I(H(of),{class:`work-chevron`,"aria-hidden":`true`})]),_:1}),!H(i)&&l.value&&e.lens&&e.lens.state.open?(V(),q(`div`,_D,[I(fE,{lens:e.lens},null,8,[`lens`])])):B(``,!0),!H(i)&&l.value?(V(),q(`div`,vD,[I(dD,{items:e.items,thinking:h.value,root:e.root,onOpen:n[0]||=e=>r(`open`,e)},null,8,[`items`,`thinking`,`root`])])):B(``,!0)],42,fD),H(i)?(V(),Y(kl,{key:0,menu:H(a),label:`Работа`,width:420,gap:`var(--sp-2)`},{default:F(()=>[K(`div`,yD,[I(pl,{anchor:`start`,chevron:``,class:`work-sheet-title`,"aria-label":`Закрыть работу`,onClick:n[1]||=e=>H(a).close()},{default:F(()=>[n[7]||=K(`span`,{class:`work-head-title`},`Работа`,-1),b.value?(V(),q(`span`,bD,j(b.value),1)):B(``,!0)]),_:1}),e.lens&&e.lens.state.open?(V(),Y(fE,{key:0,class:`work-head-lens`,lens:e.lens},null,8,[`lens`])):B(``,!0)]),K(`div`,xD,[I(dD,{items:e.items,thinking:h.value,root:e.root,onOpen:f},null,8,[`items`,`thinking`,`root`])])]),_:1},8,[`menu`])):B(``,!0),(V(),Y(ht,{to:`body`},[H(i)&&H(a).open.value?(V(),q(`button`,{key:0,type:`button`,class:`work-scrim`,tabindex:`-1`,"aria-label":`Закрыть работу`,onClick:n[2]||=e=>H(a).close(!1),onTouchmove:n[3]||=Z(()=>{},[`prevent`]),onWheel:n[4]||=Z(()=>{},[`prevent`])},null,32)):B(``,!0)]))],64))}}),[[`__scopeId`,`data-v-83c94c50`]]),CD=G(M({__name:`UiTooltip`,props:{delay:{}},setup(e){let t=e,n=P(),r=z(()=>`--tooltip-${n.replace(/\W/g,``)}`),i=gn(`surface`),a;function o(e){clearTimeout(a),a=setTimeout(()=>i.value?.element?.showPopover(),e)}function s(){clearTimeout(a);let e=i.value?.element;e?.matches(`:popover-open`)&&e.hidePopover()}return lt(()=>clearTimeout(a)),(e,a)=>(V(),q(`span`,{class:`tooltip-anchor`,style:k({anchorName:r.value}),onMouseenter:a[0]||=e=>o(t.delay??200),onFocusin:a[1]||=e=>o(0),onMouseleave:s,onFocusout:s,onMousedown:s,onKeydown:yn(s,[`esc`])},[L(e.$slots,`default`,{describedby:H(n)},void 0,!0),I(_l,{id:H(n),ref_key:`surface`,ref:i,popover:`manual`,class:`tooltip`,border:`strong`,radius:`md`,surface:`tertiary`,role:`tooltip`,style:k({positionAnchor:r.value})},{default:F(()=>[L(e.$slots,`content`,{},void 0,!0)]),_:3},8,[`id`,`style`])],36))}}),[[`__scopeId`,`data-v-ad707688`]]),wD={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function TD(e,t){return V(),q(`svg`,wD,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`12`,cy:`12`,r:`10`}),K(`path`,{d:`M12 16v-4m0-4h.01`})],-1)]])}var ED=U({name:`lucide-info`,render:TD}),DD={class:`usage-label`},OD={class:`usage-value`},kD={class:`usage-detail`},AD={class:`usage-detail usage-line`},jD={key:0,class:`usage-detail usage-line`},MD={key:1,class:`usage-detail usage-line`},ND=G(M({__name:`AgentUsageInfo`,props:{usage:{},chat:{}},setup(e){let t=e,n=new Intl.NumberFormat(`ru`),r=(e,t)=>t?`${Math.round(e/t*100)}%`:`—`;function i(e,t){let i=t.input+t.cacheRead+t.cacheWrite;return{label:e,value:`${r(t.cacheRead,i)} из кэша`,detail:`${n.format(t.cacheRead)} из ${n.format(i)}, записано ${n.format(t.cacheWrite)}, без кэша ${n.format(t.input)}`}}let a=e=>new Intl.NumberFormat(`ru`,{maximumFractionDigits:e<1?4:2}).format(e),o=z(()=>{let e=t.chat;if(!e)return``;let r=`Весь чат: ${n.format(e.tokens)} токенов`;return e.priced?`${r}, стоимость ${a(e.cost)}`:r}),s=z(()=>[...t.usage.first?[i(`Первый запрос`,t.usage.first)]:[],i(`Весь ответ`,t.usage)]);return(t,r)=>(V(),Y(CD,null,{default:F(({describedby:e})=>[I(Q,{shape:`icon`,size:`sm`,"aria-label":`Токены и кэш`,"aria-describedby":e},{default:F(()=>[I(H(ED),{"aria-hidden":`true`})]),_:1},8,[`aria-describedby`])]),content:F(()=>[(V(!0),q(W,null,J(s.value,e=>(V(),q(`span`,{key:e.label,class:`usage-row`},[K(`span`,DD,j(e.label),1),K(`span`,OD,j(e.value),1),K(`span`,kD,j(e.detail),1)]))),128)),K(`span`,AD,`Выведено токенов: `+j(H(n).format(e.usage.output)),1),e.usage.cost===void 0?B(``,!0):(V(),q(`span`,jD,` Стоимость ответа: `+j(a(e.usage.cost)),1)),e.chat?(V(),q(`span`,MD,j(o.value),1)):B(``,!0)]),_:1}))}}),[[`__scopeId`,`data-v-344a0e3f`]]),PD={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function FD(e,t){return V(),q(`svg`,PD,[...t[0]||=[ge(`<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="18" r="3"></circle><circle cx="6" cy="6" r="3"></circle><circle cx="18" cy="6" r="3"></circle><path d="M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9m6 3v3"></path></g>`,1)]])}var ID=U({name:`lucide-git-fork`,render:FD}),LD={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function RD(e,t){return V(),q(`svg`,LD,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`m15 18l-6-6l6-6`},null,-1)]])}var zD=U({name:`lucide-chevron-left`,render:RD}),BD={key:0,class:`user-row`},VD=[`title`,`datetime`],HD={class:`version-count`},UD={key:1,class:`user-form`},WD=[`title`],GD={key:3,class:`user-message`},KD=[`title`,`data-chip`,`onClick`,`onKeydown`],qD=[`innerHTML`],JD={key:4,class:`injected`},YD={class:`injected-text`},XD={key:1,class:`assistant-body`},ZD={key:1,class:`user-message note`},QD={key:3,class:`turn-failure`,role:`alert`},$D={class:`turn-failure-text`},eO=[`title`,`datetime`],tO=G(M({__name:`AgentTurn`,props:{turn:{},chatUsage:{},root:{},promotedForm:{},lens:{},flags:{}},emits:[`copy`,`open`,`edit`,`formSubmit`,`rewind`,`retry`,`fork`,`continue`,`version`,`openFile`,`revert`],setup(e,{emit:t}){let n=tt(Fx,``),i=e,a=t,o=z(()=>({busy:!1,last:!1,copied:!1,faded:!1,canRevert:!1,readonly:!1,formAnswered:!1,phase:``,...i.flags})),s=z(()=>Tx(i.turn)),c=X(),l=z(()=>i.turn.form?`Изменить ответ в форме`:`Править и отправить заново`);function u(){i.turn.form?c.value?.start():a(`edit`,i.turn.id)}function d(e,t,n){a(`formSubmit`,i.turn.id,e,t,n)}let f=z(()=>i.turn.at?new Date(i.turn.at):void 0),p=z(()=>f.value?.toLocaleString(`ru`,{day:`numeric`,month:`short`,hour:`2-digit`,minute:`2-digit`})),m=z(()=>f.value?.toLocaleString(`ru`,{dateStyle:`long`,timeStyle:`medium`})),h=z(()=>{let e=[],t=new Set(i.turn.tools.map(e=>e.id)),n=new Map;for(let e of i.turn.tools)e.parent&&t.has(e.parent)&&n.set(e.parent,[...n.get(e.parent)??[],e]);let r=new Map(i.turn.tools.filter(e=>!e.parent||!t.has(e.parent)).map(e=>[e.id,{...e,children:n.get(e.id)}])),a=(t,n)=>{let r=e.at(-1);r?.type===`work`?r.items.push(n):e.push({key:`w${t}`,type:`work`,items:[n]})};for(let[t,n]of(i.turn.parts??SS(i.turn)).entries()){if(n.type===`text`){n.text.trim()&&e.push({key:`t${t}`,type:`text`,text:n.text});continue}if(n.type===`note`){e.push({key:`n${t}`,type:`note`,text:n.text});continue}if(n.type===`thought`){n.text.trim()&&a(t,{key:`r${t}`,type:`thought`,text:n.text});continue}if(n.type===`judge`){a(t,{key:`j${t}`,type:`judge`,tool:n.tool,...n.title?{title:n.title}:{},verdict:n.verdict});continue}let i=r.get(n.id);if(!i)continue;let o=e.at(-1);if(o?.type===`work`){let e=o.items.at(-1);if(e?.type===`tools`){e.tools.push(i);continue}}a(t,{key:`a${t}`,type:`tools`,tools:[i]})}return e}),g=z(()=>h.value.length===0),_=z(()=>i.turn.tools.some(e=>e.status===`running`)),v=z(()=>{for(let e=h.value.length-1;e>=0;e--){let t=h.value[e];if(t.type===`text`)return``;if(t.type===`work`)return t.key}return``}),y=z(()=>h.value.findLast(e=>e.type===`work`)?.key??``);return(t,i)=>(V(),q(`article`,{class:O([`turn`,[e.turn.role,{faded:o.value.faded}]])},[e.turn.role===`user`?(V(),q(`div`,BD,[o.value.readonly?B(``,!0):(V(),Y(r,{key:0,gap:.5,justify:`normal`,class:O([`turn-actions`,{pinned:s.value.count>1}])},{default:F(()=>[p.value?(V(),q(`time`,{key:0,class:`turn-time`,title:m.value,datetime:f.value?.toISOString()},j(p.value),9,VD)):B(``,!0),s.value.count>1?(V(),Y(r,{key:1,as:`span`,gap:`none`,justify:`normal`,class:`versions`,role:`group`,"aria-label":`Версии`},{default:F(()=>[I(Q,{shape:`icon`,size:`sm`,title:`Предыдущая версия`,"aria-label":`Предыдущая версия`,disabled:o.value.busy||s.value.position===0,onClick:i[0]||=t=>a(`version`,e.turn.id,s.value.position-1)},{default:F(()=>[I(H(zD),{"aria-hidden":`true`})]),_:1},8,[`disabled`]),K(`span`,HD,j(s.value.position+1)+` / `+j(s.value.count),1),I(Q,{shape:`icon`,size:`sm`,title:`Следующая версия`,"aria-label":`Следующая версия`,disabled:o.value.busy||s.value.position===s.value.count-1,onClick:i[1]||=t=>a(`version`,e.turn.id,s.value.position+1)},{default:F(()=>[I(H(of),{"aria-hidden":`true`})]),_:1},8,[`disabled`])]),_:1})):B(``,!0),I(Q,{shape:`icon`,size:`sm`,class:`turn-action`,title:l.value,"aria-label":`Править сообщение`,disabled:o.value.busy,onClick:u},{default:F(()=>[I(H(ld),{"aria-hidden":`true`})]),_:1},8,[`title`,`disabled`]),I(Q,{shape:`icon`,size:`sm`,class:`turn-action`,title:`Откатить к этому сообщению`,"aria-label":`Откатить к этому сообщению`,disabled:o.value.busy,onClick:i[2]||=t=>a(`rewind`,e.turn.id)},{default:F(()=>[I(H(LT),{"aria-hidden":`true`})]),_:1},8,[`disabled`]),I(Q,{shape:`icon`,size:`sm`,class:`turn-action`,title:`Ответвить в новый чат: копия разговора до этого сообщения, текст останется в поле ввода`,"aria-label":`Ответвить в новый чат`,onClick:i[3]||=t=>a(`fork`,e.turn.id,`before`)},{default:F(()=>[I(H(ID),{"aria-hidden":`true`})]),_:1})]),_:1},8,[`class`])),e.turn.form?(V(),q(`div`,UD,[I(qT,{ref_key:`formAnswer`,ref:c,source:e.turn.form.source,values:e.turn.form.values,busy:o.value.busy,"project-id":H(n),onSubmit:d},null,8,[`source`,`values`,`busy`,`project-id`])])):e.turn.auto?(V(),q(`p`,{key:2,class:`user-message`,title:e.turn.auto},[i[12]||=N(` Фоновое задание`,-1),e.turn.autoTitle?(V(),q(W,{key:0},[N(` «`+j(e.turn.autoTitle)+`»`,1)],64)):B(``,!0),i[13]||=N(` завершилось. Проверь результат и скажи, что изменилось. `,-1)],8,WD)):(V(),q(`p`,GD,[e.turn.content?.length?(V(!0),q(W,{key:0},J(e.turn.content,(e,t)=>(V(),q(W,{key:t},[e.type===`text`?(V(),q(W,{key:0},[N(j(e.text),1)],64)):(V(),q(`span`,{key:1,class:O([`chip`,e.type]),title:H(gb)(e),"data-chip":JSON.stringify(e),role:`button`,tabindex:`0`,onClick:t=>a(`open`,e),onKeydown:yn(t=>a(`open`,e),[`enter`])},[K(`span`,{class:`chip-icon`,"aria-hidden":`true`,innerHTML:H(pb)(e)},null,8,qD),N(j(H(hb)(e)),1)],42,KD))],64))),128)):(V(),q(W,{key:1},[N(j(e.turn.text),1)],64))])),e.turn.injected?(V(),q(`details`,JD,[i[14]||=K(`summary`,null,`Возможности Projector`,-1),K(`pre`,YD,j(e.turn.injected),1)])):B(``,!0)])):(V(),q(`div`,XD,[(V(!0),q(W,null,J(h.value,t=>(V(),q(W,{key:t.key},[t.type===`text`?(V(),Y(yE,{key:0,text:t.text,streaming:o.value.busy&&o.value.last&&t===h.value.at(-1),promoted:e.promotedForm,answered:o.value.formAnswered,"project-id":H(n)},null,8,[`text`,`streaming`,`promoted`,`answered`,`project-id`])):t.type===`note`?(V(),q(`p`,ZD,j(t.text),1)):(V(),Y(SD,{key:2,items:t.items,busy:o.value.busy,last:o.value.last,current:t.key===v.value,"any-running":_.value,root:e.root,lens:t.key===y.value?e.lens:void 0,onOpen:i[4]||=e=>a(`openFile`,e)},null,8,[`items`,`busy`,`last`,`current`,`any-running`,`root`,`lens`]))],64))),128)),g.value&&o.value.busy&&o.value.last&&e.lens&&e.lens.state.open?(V(),Y(fE,{key:0,lens:e.lens,class:`early`},null,8,[`lens`])):B(``,!0),o.value.busy&&o.value.last&&(g.value||o.value.phase===`compacting`)?(V(),Y(r,{key:1,gap:2,justify:`normal`,class:`thinking`,role:`status`},{default:F(()=>[I(r,{as:`span`,gap:.75,align:`normal`,justify:`normal`,class:`thinking-dots`,"aria-hidden":`true`},{default:F(()=>[...i[15]||=[K(`i`,null,null,-1),K(`i`,null,null,-1),K(`i`,null,null,-1)]]),_:1}),N(` `+j(o.value.phase===`compacting`?`Сжимаю историю`:e.turn.tools.some(e=>e.status===`running`)?`Выполняет задачу`:`Думает`),1)]),_:1})):B(``,!0),!o.value.busy||!o.value.last?(V(),Y(WT,{key:2,tools:e.turn.tools,root:e.root??``,"can-revert":o.value.canRevert===!0&&!o.value.busy&&!o.value.readonly,onOpen:i[5]||=e=>a(`openFile`,e),onRevert:i[6]||=t=>a(`revert`,e.turn.id)},null,8,[`tools`,`root`,`can-revert`])):B(``,!0),e.turn.failure?(V(),q(`div`,QD,[I(H(E_),{"aria-hidden":`true`}),K(`p`,$D,j(e.turn.failure),1),o.value.last&&!o.value.busy&&!o.value.readonly?(V(),Y(Q,{key:0,size:`sm`,title:`Повторить запрос с начала; изменённые файлы не откатываются`,onClick:i[7]||=t=>a(`retry`,e.turn.id)},{default:F(()=>[...i[16]||=[N(` Повторить `,-1)]]),_:1})):B(``,!0)])):B(``,!0),e.turn.text&&!(o.value.busy&&o.value.last)&&!o.value.readonly?(V(),Y(r,{key:4,gap:.5,align:`normal`,justify:`normal`,class:`turn-footer`},{default:F(()=>[I(Q,{shape:`icon`,size:`sm`,class:`copy-button`,title:`Продолжить в новом чате: копия разговора до этого ответа`,"aria-label":`Продолжить в новом чате`,onClick:i[8]||=t=>a(`fork`,e.turn.id,`after`)},{default:F(()=>[I(H(ID),{"aria-hidden":`true`})]),_:1}),I(Q,{shape:`icon`,size:`sm`,class:O([`copy-button`,{copied:o.value.copied}]),"aria-label":o.value.copied?`Ответ скопирован`:`Копировать ответ`,title:o.value.copied?`Скопировано`:`Копировать ответ`,onClick:i[9]||=t=>a(`copy`,e.turn.id,e.turn.text)},{default:F(()=>[o.value.copied?(V(),Y(H(C_),{key:0,"aria-hidden":`true`})):(V(),Y(H(Tg),{key:1,"aria-hidden":`true`}))]),_:1},8,[`class`,`aria-label`,`title`]),o.value.last&&!e.turn.failure?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,class:`copy-button`,title:`Повторить: получить другой ответ`,"aria-label":`Повторить ответ`,disabled:o.value.busy,onClick:i[10]||=t=>a(`retry`,e.turn.id)},{default:F(()=>[I(H($T),{"aria-hidden":`true`})]),_:1},8,[`disabled`])):B(``,!0),o.value.last&&e.turn.stopped?(V(),Y(Q,{key:1,size:`sm`,title:`Ход остановлен на лимите: продолжить с того же места`,disabled:o.value.busy,onClick:i[11]||=e=>a(`continue`)},{default:F(()=>[...i[17]||=[N(` Продолжить `,-1)]]),_:1},8,[`disabled`])):B(``,!0),e.turn.usage?(V(),Y(ND,{key:2,usage:e.turn.usage,chat:e.chatUsage,class:`copy-button`},null,8,[`usage`,`chat`])):B(``,!0),p.value?(V(),q(`time`,{key:3,class:`turn-time footer-time`,title:m.value,datetime:f.value?.toISOString()},j(p.value),9,eO)):B(``,!0)]),_:1})):B(``,!0)]))],2))}}),[[`__scopeId`,`data-v-889367db`]]),nO={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function rO(e,t){return V(),q(`svg`,nO,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`m12 19l-7-7l7-7m7 7H5`},null,-1)]])}var iO=U({name:`lucide-arrow-left`,render:rO}),aO={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function oO(e,t){return V(),q(`svg`,aO,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M21 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h6m10 0l-9 9m3-9h6v6`},null,-1)]])}var sO=U({name:`lucide-square-arrow-out-up-right`,render:oO}),cO={key:0,class:`task-lens`},lO={key:1,class:`body conversation`,role:`log`,"aria-label":`Чат сабагента`},uO={key:2,class:`body`},dO={key:0,class:`note`},fO={class:`label`},pO={class:`label`},mO={class:`log`},hO={key:4,class:`note`},gO={key:6,class:`note`},_O=G(M({__name:`AgentTaskView`,props:{detail:{},embedded:{type:Boolean},projectId:{},backend:{},selection:{}},emits:[`back`,`tab`],setup(e,{emit:t}){let n=e,r=t,i=Nee();Lx(n.projectId,i?.api);let a=z(()=>n.detail.task),o=Mb(),s=z(()=>[qb[a.value.status],a.value.subagent,a.value.background?`в фоне`:``,a.value.tools?`вызовов: ${a.value.tools}`:``,Kb(a.value,o.value)].filter(Boolean).join(` · `)),c=z(()=>{if(a.value.prompt)return a.value.prompt;let e=n.detail.call?.input?.trim()??``;return e&&e!==`{}`?e:``}),l=z(()=>a.value.session??/"sessionID"\s*:\s*"([^"]+)"/.exec(n.detail.call?.detail??``)?.[1]),{lens:u,turns:d,loadError:f,toggleLens:p}=Hw({backend:()=>n.backend,projectId:()=>n.projectId,session:()=>l.value,running:()=>a.value.status===`running`,lastTool:()=>a.value.lastTool,selection:()=>n.selection,auto:!0}),m=z(()=>{let{call:e}=n.detail;return a.value.status===`running`?``:a.value.summary?a.value.summary:e&&!a.value.background?e.detail:``});return(t,n)=>(V(),Y(aD,{class:`task-view`,label:`Задача агента`,title:a.value.title||`Задача`,meta:s.value,running:a.value.status===`running`,kind:a.value.kind,onKeydown:n[2]||=yn(e=>r(`back`),[`esc`])},{leading:F(()=>[e.embedded?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,title:`Вернуться в чат (Esc)`,"aria-label":`Вернуться в чат`,onClick:n[0]||=e=>r(`back`)},{default:F(()=>[I(H(iO),{"aria-hidden":`true`})]),_:1})):B(``,!0)]),actions:F(()=>[a.value.kind===`agent`?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,active:H(u).state.open,"aria-pressed":H(u).state.open,title:H(u).state.open?`Скрыть Lens`:`Lens: чем занимается сабагент`,"aria-label":H(u).state.open?`Скрыть Lens`:`Показать Lens`,onClick:H(p)},{default:F(()=>[I(H(nE),{"aria-hidden":`true`})]),_:1},8,[`active`,`aria-pressed`,`title`,`aria-label`,`onClick`])):B(``,!0),e.embedded?(V(),Y(Q,{key:1,shape:`icon`,size:`sm`,title:`Открыть в новой вкладке`,"aria-label":`Открыть в новой вкладке`,onClick:n[1]||=e=>r(`tab`)},{default:F(()=>[I(H(sO),{"aria-hidden":`true`})]),_:1})):B(``,!0)]),default:F(()=>[H(u).state.open?(V(),q(`div`,cO,[I(fE,{lens:H(u)},null,8,[`lens`])])):B(``,!0),H(d).length?(V(),q(`div`,lO,[(V(!0),q(W,null,J(H(d),(e,t)=>(V(),Y(tO,{key:e.id,turn:e,flags:{busy:a.value.status===`running`,last:t===H(d).length-1,copied:!1,readonly:!0}},null,8,[`turn`,`flags`]))),128))])):(V(),q(`div`,uO,[H(f)?(V(),q(`p`,dO,j(H(f)),1)):B(``,!0),c.value?(V(),q(W,{key:1},[K(`div`,fO,j(a.value.kind===`shell`?`Команда`:`Задание`),1),I(qw,{text:c.value},null,8,[`text`])],64)):B(``,!0),e.detail.calls.length?(V(),q(W,{key:2},[K(`div`,pO,`Вызовы: `+j(e.detail.calls.length),1),(V(!0),q(W,null,J(e.detail.calls,e=>(V(),Y(wT,{key:e.id,tool:e},null,8,[`tool`]))),128))],64)):a.value.log?.length?(V(),q(W,{key:3},[n[3]||=K(`div`,{class:`label`},`Ход работы`,-1),K(`ol`,mO,[(V(!0),q(W,null,J(a.value.log,(e,t)=>(V(),q(`li`,{key:t},j(e),1))),128))])],64)):a.value.status===`running`?(V(),q(`p`,hO,[I(An),n[4]||=N(` Агент работает, подробностей пока нет `,-1)])):B(``,!0),m.value?(V(),q(W,{key:5},[n[5]||=K(`div`,{class:`label`},`Итог`,-1),I(qw,{text:m.value},null,8,[`text`])],64)):a.value.status===`running`?B(``,!0):(V(),q(`p`,gO,`Агент не сообщил итог`))]))]),_:1},8,[`title`,`meta`,`running`,`kind`]))}}),[[`__scopeId`,`data-v-73814f86`]]),vO={key:1,class:`gone`,role:`status`},yO=G(M({__name:`AgentTaskTab`,props:{projectId:{},chat:{},task:{}},setup(e){let t=e,n=z(()=>Vx(t.projectId).find(e=>e.key===t.chat)),r=z(()=>n.value?Gb(n.value.turns(),t.task):void 0);return ui(()=>({note:`Задача агента`,text:r.value?Yb(r.value):`Чат или задача недоступны`})),(t,i)=>r.value&&n.value?(V(),Y(_O,{key:0,detail:r.value,"project-id":e.projectId,backend:n.value.backend,selection:n.value.selection?n.value.selection():{}},null,8,[`detail`,`project-id`,`backend`,`selection`])):(V(),q(`p`,vO,` Чат этой задачи сейчас не открыт: вкладка покажет её, когда чат вернётся. `))}}),[[`__scopeId`,`data-v-8e09bf8f`]]),bO={key:0,class:`jobs`,"aria-label":`Фоновые задания`},xO=[`onClick`],SO={class:`agent`},CO=[`title`],wO={class:`end`},TO={class:`meta`},EO={class:`state`},DO={key:0,class:`finished`},OO={class:`list`},kO=[`onClick`],AO={class:`agent`},jO=[`title`],MO={class:`end`},NO={class:`meta`},PO={key:0,class:`state`},FO=G(M({__name:`AgentJobBar`,props:{projectId:{},active:{},recent:{}},emits:[`open`],setup(e,{emit:t}){let n=e,r=t,i=Mb(),a=MC(()=>n.projectId??``,()=>[...n.active,...n.recent]),o=z(()=>n.active.length>0||n.recent.length>0),s=e=>a.value.get(e.id)??pC(e.task),c=e=>e.status===`needs-user`?`ждёт ответа`:e.status===`queued`?`в очереди`:`работает`,l=e=>[fC(e.startedAt??e.createdAt,e.endedAt,i.value),e.files.length?`файлов: ${e.files.length}`:``].filter(Boolean).join(` · `),u=e=>e.status===`error`||e.status===`stopped`?uC[e.status]:``;return(t,n)=>o.value?(V(),q(`div`,bO,[(V(!0),q(W,null,J(e.active,e=>(V(),q(`button`,{key:e.id,type:`button`,class:O([`job`,e.status]),onClick:t=>r(`open`,e.id)},[I(H(Zw),{status:e.status,class:`mark`},null,8,[`status`]),K(`span`,SO,j(H(lS)(e.backend)),1),K(`span`,{class:`task`,title:e.task},j(s(e)),9,CO),K(`span`,wO,[K(`span`,TO,j(l(e)),1),K(`span`,EO,j(c(e)),1)])],10,xO))),128)),e.recent.length?(V(),q(`details`,DO,[I(yg,{variant:`fit`,class:`finished-summary`},{default:F(()=>[K(`span`,null,`Завершено: `+j(e.recent.length),1),I(H(of),{class:`chevron`,"aria-hidden":`true`})]),_:1}),K(`div`,OO,[(V(!0),q(W,null,J(e.recent,e=>(V(),q(`button`,{key:e.id,type:`button`,class:O([`job finished-row`,e.status]),onClick:t=>r(`open`,e.id)},[I(H(Zw),{status:e.status,class:`mark`},null,8,[`status`]),K(`span`,AO,j(H(lS)(e.backend)),1),K(`span`,{class:`task`,title:e.task},j(s(e)),9,jO),K(`span`,MO,[K(`span`,NO,j(l(e)),1),u(e)?(V(),q(`span`,PO,j(u(e)),1)):B(``,!0)])],10,kO))),128))])])):B(``,!0)])):B(``,!0)}}),[[`__scopeId`,`data-v-e3954271`]]),IO={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function LO(e,t){return V(),q(`svg`,IO,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 5h8m-8 7h8m-8 7h8M3 17l2 2l4-4M3 7l2 2l4-4`},null,-1)]])}var RO=U({name:`lucide-list-checks`,render:LO}),zO={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function BO(e,t){return V(),q(`svg`,zO,[...t[0]||=[K(`circle`,{cx:`12`,cy:`12`,r:`10`,fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},null,-1)]])}var VO=U({name:`lucide-circle`,render:BO}),HO=[`open`],UO={class:`plan-count`},WO={key:0,class:`plan-current u-truncate`},GO={class:`plan-bar`,"aria-hidden":`true`},KO=G(M({__name:`AgentPlan`,props:{items:{},busy:{type:Boolean},embedded:{type:Boolean}},setup(e){let t=e,n=z(()=>t.items.filter(e=>e.status===`completed`).length),r=z(()=>t.items.find(e=>e.status===`in_progress`));return(t,i)=>e.items.length?(V(),q(`details`,{key:0,class:O([`plan`,{embedded:e.embedded}]),open:e.busy},[I(yg,{highlight:!1},{default:F(()=>[I(H(RO),{"aria-hidden":`true`}),i[0]||=K(`span`,{class:`plan-title`},`План`,-1),K(`span`,UO,j(n.value)+` / `+j(e.items.length),1),r.value?(V(),q(`span`,WO,j(r.value.active??r.value.content),1)):B(``,!0),K(`span`,GO,[K(`span`,{style:k({width:`${n.value/e.items.length*100}%`})},null,4)])]),_:1}),K(`ol`,null,[(V(!0),q(W,null,J(e.items,(e,t)=>(V(),q(`li`,{key:t,class:O(e.status)},[e.status===`completed`?(V(),Y(H(C_),{key:0,"aria-hidden":`true`})):e.status===`in_progress`?(V(),Y(An,{key:1})):(V(),Y(H(VO),{key:2,"aria-hidden":`true`})),K(`span`,null,j(e.content),1)],2))),128))])],10,HO)):B(``,!0)}}),[[`__scopeId`,`data-v-995b8b30`]]),qO={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function JO(e,t){return V(),q(`svg`,qO,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`m15 10l5 5l-5 5`}),K(`path`,{d:`M4 4v7a4 4 0 0 0 4 4h12`})],-1)]])}var YO=U({name:`lucide-corner-down-right`,render:JO}),XO={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function ZO(e,t){return V(),q(`svg`,XO,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2zM12 8v6m-3-3h6`},null,-1)]])}var QO=U({name:`lucide-message-square-plus`,render:ZO}),$O={class:`label`},ek=[`title`],tk=G(M({__name:`AgentQueue`,props:{items:{},busy:{type:Boolean},canInject:{type:Boolean},embedded:{type:Boolean}},emits:[`now`,`inject`,`remove`],setup(e,{emit:t}){let n=t;return(t,r)=>e.items.length?(V(),q(`ul`,{key:0,class:O([`queue`,{embedded:e.embedded}]),"aria-label":`Сообщения в очереди`},[(V(!0),q(W,null,J(e.items,t=>(V(),q(`li`,{key:t.id},[K(`span`,$O,j(t.delivering?`Передаётся агенту`:`В очереди`),1),K(`span`,{class:`text u-truncate`,title:t.text},j(t.text),9,ek),e.busy&&e.canInject&&!t.delivering?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,title:`Добавить в ответ, который пишется сейчас: агент учтёт это, не останавливаясь`,"aria-label":`Добавить в ответ`,onClick:e=>n(`inject`,t.id)},{default:F(()=>[I(H(QO),{"aria-hidden":`true`})]),_:1},8,[`onClick`])):B(``,!0),e.busy&&!t.delivering?(V(),Y(Q,{key:1,shape:`icon`,size:`sm`,title:`Остановить ответ и отправить это сообщение сразу`,"aria-label":`Отправить сразу`,onClick:e=>n(`now`,t.id)},{default:F(()=>[I(H(YO),{"aria-hidden":`true`})]),_:1},8,[`onClick`])):B(``,!0),I(Q,{shape:`icon`,size:`sm`,disabled:t.delivering,title:`Убрать из очереди`,"aria-label":`Убрать из очереди`,onClick:e=>n(`remove`,t.id)},{default:F(()=>[I(H(oi),{"aria-hidden":`true`})]),_:1},8,[`disabled`,`onClick`])]))),128))],2)):B(``,!0)}}),[[`__scopeId`,`data-v-2fdcf077`]]),nk=[`title`,`aria-pressed`],rk={class:`name u-truncate`},ik=[`title`],ak={key:1,class:`note u-truncate`},ok=G(M({__name:`AgentTaskRow`,props:{task:{},current:{type:Boolean},projectId:{},backend:{},selection:{}},emits:[`view`,`tab`],setup(e,{emit:t}){let n=e,r=t,i=Mb(),a=z(()=>Kb(n.task,i.value));function o(){let e=n.task;return[e.subagent,e.tools?`вызовов: ${e.tools}`:``,a.value,e.status===`running`&&e.lastTool?px(e.lastTool):Jb(e.summary)].filter(Boolean).join(` · `)}let{lens:s,lensNote:c,toggleLens:l}=Hw({backend:()=>n.backend,projectId:()=>n.projectId,session:()=>n.task.session,running:()=>n.task.status===`running`,lastTool:()=>n.task.lastTool,selection:()=>n.selection,fallback:()=>{let e=n.task.prompt?.trim();return e?{id:n.task.id,text:e}:void 0},startOnOpen:!0,stopOnClose:!0});return(t,n)=>(V(),q(`li`,{class:O({current:e.current})},[K(`button`,{type:`button`,class:`row`,title:`Открыть чат: ${e.task.title}`,"aria-pressed":e.current,onClick:n[0]||=t=>r(`view`,e.task.id)},[I(H(Zw),{status:e.task.status},null,8,[`status`]),(V(),Y(qe(e.task.kind===`shell`?H(nT):H(aw)),{class:`faint-icon`,"aria-hidden":`true`})),K(`span`,rk,j(e.task.title||`Задача`),1),H(s).state.open?(V(),q(`span`,{key:0,class:O([`note u-truncate`,{error:H(s).state.error}]),title:H(c)},[n[3]||=K(`span`,{class:`lens-label`},`Lens`,-1),N(` `+j(H(c)),1)],10,ik)):(V(),q(`span`,ak,j(o()),1))],8,nk),e.task.kind===`agent`?(V(),q(W,{key:0},[I(Q,{shape:`icon`,size:`sm`,active:H(s).state.open,"aria-pressed":H(s).state.open,title:H(s).state.open?`Скрыть Lens`:`Lens: чем занимается сабагент`,"aria-label":H(s).state.open?`Скрыть Lens`:`Показать Lens`,onClick:H(l)},{default:F(()=>[I(H(nE),{"aria-hidden":`true`})]),_:1},8,[`active`,`aria-pressed`,`title`,`aria-label`,`onClick`]),H(s).state.open?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,disabled:H(s).state.busy,title:`Обновить Lens`,"aria-label":`Обновить Lens`,onClick:n[1]||=e=>H(s).refresh()},{default:F(()=>[I(H($T),{"aria-hidden":`true`})]),_:1},8,[`disabled`])):B(``,!0)],64)):B(``,!0),I(Q,{shape:`icon`,size:`sm`,title:`Открыть в новой вкладке`,"aria-label":`Открыть в новой вкладке`,onClick:n[2]||=t=>r(`tab`,e.task.id)},{default:F(()=>[I(H(sO),{"aria-hidden":`true`})]),_:1})],2))}}),[[`__scopeId`,`data-v-61e9f82c`]]),sk=[`open`],ck={class:`scroll`},lk={key:0,class:`list`},uk=[`open`],dk={class:`list`},fk=G(M({__name:`AgentTaskBar`,props:{tasks:{},viewing:{},projectId:{},backend:{},selection:{},embedded:{type:Boolean}},emits:[`view`,`tab`],setup(e,{emit:t}){let n=e,r=t,i=z(()=>n.tasks.filter(e=>e.status===`running`||e.status===`error`)),a=z(()=>n.tasks.filter(e=>!i.value.includes(e))),o=z(()=>n.tasks.filter(e=>e.status===`running`).length),s=z(()=>n.tasks.filter(e=>e.status===`error`).length),c=z(()=>[o.value?`Выполняется в фоне: ${o.value}`:`Задачи: ${n.tasks.length}`,s.value?`ошибок: ${s.value}`:``,o.value&&a.value.length?`готово: ${a.value.length}`:``].filter(Boolean).join(` · `)),l=X(),u=z(()=>l.value===void 0?o.value>0:!l.value),d=z(()=>!i.value.length);return(t,n)=>e.tasks.length?(V(),q(`details`,{key:0,class:O([`task-bar`,{embedded:e.embedded}]),open:u.value,onToggle:n[4]||=e=>l.value=!e.target.open},[I(yg,{variant:`fit`,class:`bar-summary`},{default:F(()=>[I(H(Zw),{status:o.value?`running`:s.value?`error`:`done`,label:`Есть ошибки`},null,8,[`status`]),K(`span`,null,j(c.value),1),I(H(of),{class:`chevron`,"aria-hidden":`true`})]),_:1}),K(`div`,ck,[i.value.length?(V(),q(`ul`,lk,[(V(!0),q(W,null,J(i.value,t=>(V(),Y(ok,{key:t.id,task:t,current:e.viewing===t.id,"project-id":e.projectId,backend:e.backend,selection:e.selection,onView:n[0]||=e=>r(`view`,e),onTab:n[1]||=e=>r(`tab`,e)},null,8,[`task`,`current`,`project-id`,`backend`,`selection`]))),128))])):B(``,!0),a.value.length?(V(),q(`details`,{key:1,class:`finished`,open:d.value||void 0},[I(yg,{variant:`fit`,class:`finished-summary`},{default:F(()=>[K(`span`,null,`Завершено: `+j(a.value.length),1),I(H(of),{class:`chevron`,"aria-hidden":`true`})]),_:1}),K(`ul`,dk,[(V(!0),q(W,null,J(a.value,t=>(V(),Y(ok,{key:t.id,task:t,current:e.viewing===t.id,"project-id":e.projectId,backend:e.backend,selection:e.selection,onView:n[2]||=e=>r(`view`,e),onTab:n[3]||=e=>r(`tab`,e)},null,8,[`task`,`current`,`project-id`,`backend`,`selection`]))),128))])],8,uk)):B(``,!0)])],42,sk)):B(``,!0)}}),[[`__scopeId`,`data-v-aa1a2120`]]),pk={key:0,class:`activity`,"aria-label":`Фоновая работа`},mk=[`aria-expanded`],hk=[`title`],gk={key:0,class:`body`},_k=G(M({__name:`AgentActivityDock`,props:{jobs:{},chat:{},tasks:{},plan:{},queue:{},busy:{type:Boolean},canInject:{type:Boolean},viewingTask:{},projectId:{},backend:{},selection:{}},emits:[`open`,`view`,`tab`,`now`,`inject`,`remove`],setup(e,{emit:t}){let n=e,r=t,i=X(!1),a=z(()=>lC(n.jobs,n.chat)),o=z(()=>a.value.active),s=z(()=>a.value.recent),c=z(()=>n.tasks.filter(e=>e.status===`running`).length),l=z(()=>n.tasks.filter(e=>e.status===`error`).length),u=z(()=>n.plan.filter(e=>e.status===`completed`).length),d=z(()=>n.plan.length-u.value),f=z(()=>o.value.filter(e=>e.status===`needs-user`).length),p=z(()=>o.value.length>0||s.value.length>0||n.tasks.length>0||d.value>0||n.queue.length>0),m=z(()=>o.value.length>0||c.value>0),h=z(()=>f.value>0||l.value>0),g=z(()=>{let e=[];return o.value.length&&e.push(`задания: ${o.value.length}${f.value?` · ждёт ответа: ${f.value}`:``}`),s.value.length&&e.push(`завершено: ${s.value.length}`),n.tasks.length&&e.push(`задачи: ${n.tasks.length}${c.value?` · в работе: ${c.value}`:l.value?` · ошибки: ${l.value}`:``}`),d.value&&e.push(`план: ${u.value}/${n.plan.length}`),n.queue.length&&e.push(`очередь: ${n.queue.length}`),e.join(` · `)});return(t,n)=>p.value?(V(),q(`section`,pk,[K(`button`,{type:`button`,class:`summary`,"aria-expanded":i.value,onClick:n[0]||=e=>i.value=!i.value},[m.value?(V(),Y(An,{key:0})):h.value?(V(),Y(H(E_),{key:1,class:`alert`,"aria-hidden":`true`})):(V(),Y(H(RO),{key:2,"aria-hidden":`true`})),K(`span`,{class:`text`,title:g.value},j(g.value),9,hk),I(H(of),{class:O([`chevron`,{expanded:i.value}]),"aria-hidden":`true`},null,8,[`class`])],8,mk),i.value?(V(),q(`div`,gk,[I(FO,{"project-id":e.projectId,active:o.value,recent:s.value,onOpen:n[1]||=e=>r(`open`,e)},null,8,[`project-id`,`active`,`recent`]),I(KO,{items:e.plan,busy:e.busy,embedded:``},null,8,[`items`,`busy`]),I(fk,{tasks:e.tasks,viewing:e.viewingTask,"project-id":e.projectId,backend:e.backend,selection:e.selection,embedded:``,onView:n[2]||=e=>r(`view`,e),onTab:n[3]||=e=>r(`tab`,e)},null,8,[`tasks`,`viewing`,`project-id`,`backend`,`selection`]),I(tk,{items:e.queue,busy:e.busy,"can-inject":e.canInject,embedded:``,onNow:n[4]||=e=>r(`now`,e),onInject:n[5]||=e=>r(`inject`,e),onRemove:n[6]||=e=>r(`remove`,e)},null,8,[`items`,`busy`,`can-inject`])])):B(``,!0)])):B(``,!0)}}),[[`__scopeId`,`data-v-8063daf7`]]),vk=M({__name:`AgentJobRequests`,props:{jobs:{}},emits:[`answered`],setup(e,{emit:t}){let n=e,r=t,i=z(()=>new Map(n.jobs.flatMap(e=>e.pending.map(t=>[t.id,e.id])))),a=z(()=>n.jobs.flatMap(e=>e.pending.filter(e=>e.kind===`permission`).map(t=>({id:t.id,job:e.id,tool:t.tool??``,title:`${lS(e.backend)} · ${t.title}`,detail:t.detail??``,persistent:t.persistent===!0})))),o=z(()=>n.jobs.flatMap(e=>e.pending.filter(e=>e.kind===`question`&&e.questions?.length).map(t=>({id:t.id,job:e.id,title:`${lS(e.backend)} · ${t.title||`Вопрос`}`,questions:t.questions,custom:t.custom===!0}))));async function s(e,t,n){let a=i.value.get(e);if(a){try{await Dy(a,{request:e,allow:t,always:n})}catch{}r(`answered`)}}async function c(e,t){let n=i.value.get(e);if(n){try{await Dy(n,{request:e,answers:t})}catch{}r(`answered`)}}return(e,t)=>(V(),q(W,null,[I(H(HE),{permissions:a.value,onDecide:s},null,8,[`permissions`]),I(H($E),{requests:o.value,onAnswer:c},null,8,[`requests`])],64))}}),yk={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function bk(e,t){return V(),q(`svg`,yk,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 3H4a2 2 0 0 0-2 2v16.286a.71.71 0 0 0 1.212.502l2.202-2.202A2 2 0 0 1 6.828 19H20a2 2 0 0 0 2-2v-4M16 3h6v6m-6 0l6-6`},null,-1)]])}var xk=U({name:`lucide-message-square-share`,render:bk}),Sk={key:0,class:`missing`,"aria-label":`Фоновое задание`},Ck={class:`body`,role:`log`,"aria-label":`Журнал задания`},wk={key:0,class:`assignment`},Tk={class:`task-text`},Ek={key:1,class:`note error`,role:`alert`},Dk={key:2,class:`note error`,role:`alert`},Ok={key:3,class:`note error`,role:`alert`},kk={key:4,class:`note`},Ak={key:6,class:`note`},jk={class:`label`},Mk={class:`files`},Nk=[`onClick`],Pk={key:1},Fk=G(M({__name:`AgentJobTab`,props:{projectId:{},job:{}},emits:[`openFile`,`title`],setup(e,{emit:t}){let n=e,r=t,{api:i}=Iu();Lx(n.projectId,i);let{job:a,journal:o,error:s,actionError:c,missing:l,stop:u,decide:d,answer:f}=KC(()=>n.job),p=NC(()=>n.projectId,()=>a.value);R(p,e=>{a.value&&r(`title`,e)},{immediate:!0});let m=z(()=>!!a.value&&yy(a.value.status)),h=z(()=>JC(o.value,`job-${n.job}`,a.value?.startedAt??a.value?.createdAt??0)),g=z(()=>(a.value?.pending??[]).filter(e=>e.kind===`permission`).map(e=>({id:e.id,tool:e.tool??``,title:e.title,detail:e.detail??``,persistent:e.persistent===!0}))),_=z(()=>(a.value?.pending??[]).filter(e=>e.kind===`question`).map(e=>({id:e.id,title:e.title,questions:e.questions??[],custom:e.custom===!0}))),v=z(()=>{let e=a.value?.result?.trim()??``;return m.value&&e&&e!==h.value.text.trim()?e:``}),y=Mb(),b=z(()=>[a.value?uC[a.value.status]:``,a.value?lS(a.value.backend):``,a.value?.unattended?`без вопросов`:``,a.value?.worktree?`копия ${a.value.worktree.branch}`:``,fC(a.value?.startedAt??a.value?.createdAt,a.value?.endedAt,y.value)].filter(Boolean).join(` · `)),x=async()=>{c.value=``;try{a.value&&await GC(i,a.value)}catch(e){c.value=e instanceof Error?e.message:`Не удалось открыть чат`}};return ui(()=>({note:`Фоновое задание агента`,text:a.value?vi(`Задание: ${a.value.task}`,`Состояние: ${uC[a.value.status]}`,`Агент: ${lS(a.value.backend)}`,a.value.error?`Ошибка: ${a.value.error}`:``,a.value.pending.length?`Ждёт ответа: ${a.value.pending.map(e=>e.title).join(`; `)}`:``,a.value.files.length?`Изменено файлов: ${a.value.files.length}`:``,a.value.result?`Итог:\n${a.value.result.slice(0,2e3)}`:``):`Задание загружается`})),(e,t)=>H(l)?(V(),q(`section`,Sk,[...t[0]||=[K(`p`,{class:`note`,role:`status`},`Задание не найдено: его могли убрать.`,-1)]])):(V(),Y(H(aD),{key:1,label:`Фоновое задание`,kind:`agent`,title:H(p),hint:H(a)?.task,meta:b.value,running:!!H(a)&&!m.value},{actions:F(()=>[H(a)&&!m.value?(V(),Y(Q,{key:0,size:`sm`,title:`Остановить задание`,"aria-label":`Остановить задание`,onClick:H(u)},{default:F(()=>[I(H(u_),{"aria-hidden":`true`}),t[1]||=N(` Остановить `,-1)]),_:1},8,[`onClick`])):B(``,!0),H(a)&&H(WC)(H(a))?(V(),Y(Q,{key:1,size:`sm`,title:`Открыть обычный чат агента и продолжить эту сессию`,"aria-label":`Продолжить в чате`,onClick:x},{default:F(()=>[I(H(xk),{"aria-hidden":`true`}),t[2]||=N(` Продолжить в чате `,-1)]),_:1})):B(``,!0)]),default:F(()=>[K(`div`,Ck,[H(a)?.task?(V(),q(`details`,wk,[I(yg,{variant:`fit`,class:`assignment-summary`},{default:F(()=>[t[3]||=K(`span`,{class:`label`},`Задание`,-1),I(H(of),{class:`chevron`,"aria-hidden":`true`})]),_:1}),K(`p`,Tk,j(H(a).task),1)])):B(``,!0),H(s)?(V(),q(`p`,Ek,j(H(s)),1)):B(``,!0),H(c)?(V(),q(`p`,Dk,j(H(c)),1)):B(``,!0),H(a)?.error?(V(),q(`p`,Ok,j(H(a).error),1)):B(``,!0),H(a)?.worktree&&m.value?(V(),q(`p`,kk,` Работа шла в изолированной копии (`+j(H(a).worktree.branch)+`): слить её в проект можно командой ide.agent.job.merge по просьбе пользователя. `,1)):B(``,!0),I(H(HE),{permissions:g.value,onDecide:H(d)},null,8,[`permissions`,`onDecide`]),I(H($E),{requests:_.value,onAnswer:H(f)},null,8,[`requests`,`onAnswer`]),H(o).length?(V(),Y(H(tO),{key:5,turn:h.value,root:H(a)?.cwd,flags:{busy:!!H(a)&&!m.value,last:!0,copied:!1,readonly:!0}},null,8,[`turn`,`root`,`flags`])):H(a)&&!m.value?(V(),q(`p`,Ak,[I(An),t[4]||=N(` Агент работает, событий пока нет `,-1)])):B(``,!0),v.value?(V(),q(W,{key:7},[t[5]||=K(`div`,{class:`label`},`Итог`,-1),I(H(qw),{text:v.value},null,8,[`text`])],64)):B(``,!0),H(a)?.files.length?(V(),q(W,{key:8},[K(`div`,jk,[I(H(PT),{"aria-hidden":`true`}),N(` Изменённые файлы: `+j(H(a).files.length),1)]),K(`ul`,Mk,[(V(!0),q(W,null,J(H(a).files,e=>(V(),q(`li`,{key:e},[!H(a).worktree&&!H(a).worktreeCleared?(V(),q(`button`,{key:0,type:`button`,class:`file`,onClick:t=>r(`openFile`,e)},j(e),9,Nk)):(V(),q(`span`,Pk,j(e),1))]))),128))])],64)):B(``,!0)])]),_:1},8,[`title`,`hint`,`meta`,`running`]))}}),[[`__scopeId`,`data-v-eacc32ba`]]);async function Ik(e,t,n,r){let i=await fetch(`/api/agent/side`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({question:e,history:t,projectId:n.projectId,chat:n.chat,backend:n.backend,selection:n.selection,thread:n.thread,running:n.running,plan:n.plan}),signal:n.signal});if(!i.ok||!i.body){let e=await i.json().catch(()=>null);throw Error(e?.error||`Вопрос в сторону недоступен`)}let a=i.body.getReader(),o=new TextDecoder,s=``,c=async e=>{if(e.event!==`command-request`)return r(e);await Wv(e.data.id,e.data,n.commands,n.signal)};for(;;){let{done:e,value:t}=await a.read();if(e)break;s+=o.decode(t,{stream:!0});let n=Jv(s);s=n.rest;for(let e of n.events)await c(e)}if(s.trim()){let e=Jv(`${s}\n\n`);for(let t of e.events)await c(t)}}function Lk(e){let t=/^\/btw(?:\s+([\s\S]*))?$/.exec(e.trim());return t?(t[1]??``).trim():void 0}function Rk(e,t){let n=X([]);async function r(){try{n.value=await py(e(),t)}catch{n.value=[]}}return{mcp:n,load:r}}function zk(e){let t=X(null),n=X(),r=X(``),i=X(),a=X(!1);function o(e,a=`conversation`){t.value={id:e,scope:a},n.value=void 0,r.value=``,i.value=void 0}async function s(i){let a=t.value;if(a&&(a.scope=i,!(i===`conversation`||n.value||r.value)))try{n.value=await e.rewindFiles(a.id,!0)}catch(e){r.value=e instanceof Error?e.message:`Не удалось посчитать откат`}}async function c(t,n){let r;return n!==`conversation`&&(r=await e.rewindFiles(t,!1)),n!==`files`&&(!r||r.ok)&&e.edit(t),r}async function l(r){let o=t.value;if(o&&!a.value){a.value=!0;try{let a=await c(o.id,r);a?i.value={...a,files:a.files.length?a.files:n.value?.files??[]}:t.value=null,r!==`files`&&await Ut(),e.focus()}catch(e){i.value={ok:!1,files:[],error:e instanceof Error?e.message:`Не удалось откатить`}}finally{a.value=!1}}}function u(){t.value=null,i.value=void 0}return{rewinding:t,rewindPreview:n,rewindPreviewError:r,rewindResult:i,rewindWorking:a,askRewind:o,previewRewind:s,rewindTo:c,confirmRewind:l,closeRewind:u}}var Bk=3e4;function Vk(e,t){let n=e.at(-1),r=eS(t&&n?.role===`assistant`?e.slice(0,-1):e,!0);if(t&&n?.role===`assistant`){let e=n.tools.filter(e=>!e.parent&&e.status!==`running`).map(e=>({id:e.id,name:e.name,...e.input?{input:e.input}:{},output:e.detail,...e.status===`error`?{failed:!0}:{}}));e.length&&r.push({role:`assistant`,content:``,tools:e})}let i=Math.max(0,r.length-60);for(;i<r.length&&r[i].role!==`user`;)i++;return r.slice(i)}function Hk(e){let t=at({open:!1,question:``,currentQuestion:``,current:``,busy:!1,error:``,meta:{mode:`projector`},checks:[],exchanges:[]}),n;function r(){t.open=!0}function i(){t.open=!1}function a(){t.open=!t.open}function o(){n?.abort(),t.exchanges=[],t.current=``,t.currentQuestion=``,t.question=``,t.error=``,t.checks=[]}function s(){o(),t.open=!1,t.busy=!1,t.meta={mode:`projector`}}function c(){n?.abort()}function l(e){let t=e.at(-1);return t?.role===`assistant`?t.tools.filter(e=>e.status===`running`).map(e=>({name:e.name,...e.input?{input:e.input.slice(0,500)}:{},...e.startedAt?{startedAt:e.startedAt}:{}})):[]}async function u(){let t=e.turns.value,n=t.findLast(e=>e.role===`assistant`),r=n?.at,i=Date.now(),a=e.lastEventAt.value||void 0,o=l(t).map(e=>({name:e.name,...e.input?{input:e.input}:{},...e.startedAt?{startedAt:e.startedAt}:{},...e.startedAt?{elapsedMs:i-e.startedAt}:{}})),s={permissions:e.permissions.value.map(e=>({tool:e.tool,title:e.title})),questions:e.questions.value.map(e=>({...e.title?{title:e.title}:{},count:e.questions.length})),secrets:e.secrets.value.map(e=>({label:e.label}))},c=!0,u=await vy().then(t=>t.find(t=>t.chat===e.chat)).catch(()=>{c=!1}),d=s.permissions.length>0||s.questions.length>0||s.secrets.length>0,f=e.busy.value?d?`waiting-user`:e.phase.value.includes(`фонов`)?`waiting-background`:o.length?`running-tool`:c?u?a&&i-a>=Bk?`quiet`:`active`:`broken`:`quiet`:`idle`;return{chat:e.chat,backend:e.backend,busy:e.busy.value,phase:e.phase.value,...r?{startedAt:r,elapsedMs:i-r}:{},...a?{lastEventAt:a,sinceLastEventMs:i-a}:{},currentTools:o,pending:s,queue:{count:e.queue.value.length,texts:e.queue.value.slice(0,5).map(e=>e.text.slice(0,200))},live:u?{found:!0,checked:!0,run:u.id,...u.startedAt?{startedAt:u.startedAt}:{}}:{found:!1,checked:c},health:f,...!e.busy.value&&n?.text.trim()?{lastAssistantText:n.text.trim().slice(0,1200)}:{},...n?.session?.id?{session:n.session.id}:{},...t.findLast(e=>e.context)?.context?{context:t.findLast(e=>e.context).context}:{}}}async function d(i=t.question){let a=i.trim();if(!a)return r(),``;if(t.busy)throw Error(`Дождитесь ответа на прошлый вопрос в сторону`);t.open=!0,t.question=``,t.currentQuestion=a,t.current=``,t.error=``,t.checks=[],t.meta={mode:`projector`},t.busy=!0,n=new AbortController;let o=``;try{if(await Ik(a,Vk(e.turns.value,e.busy.value),{projectId:e.projectId,chat:e.chat,backend:e.backend,selection:e.backend===`projector`?e.selection.value:{},thread:t.exchanges.slice(-20),running:l(e.turns.value),plan:Hb(e.turns.value,e.backend).map(e=>({content:e.content,status:e.status})),commands:e.commands,signal:n.signal},e=>{switch(e.event){case`meta`:t.meta={...t.meta,...e.data};return;case`status`:(e.data.provider||e.data.model)&&(t.meta={...t.meta,...e.data.provider?{provider:e.data.provider}:{},...e.data.model?{model:e.data.model}:{}});return;case`text`:t.current+=e.data.text;return;case`tool`:{let n=t.checks.find(t=>t.id===e.data.id);n?(n.name=e.data.name,n.status=`running`):t.checks.push({id:e.data.id,name:e.data.name,status:`running`});return}case`tool-result`:{let n=t.checks.find(t=>t.id===e.data.id);if(n){n.status=e.data.error?`error`:`done`;let t=e.data.error||e.data.output;t!==void 0&&(n.detail=(typeof t==`string`?t:JSON.stringify(t)).slice(0,2e3))}return}case`done`:e.data.text&&(t.current=e.data.text);return;case`error`:o=e.data.error;return;default:return}}),n.signal.aborted)return t.current.trim();if(o)throw Error(o);let r=t.current.trim();if(!r)throw Error(`Агент не ответил на вопрос в сторону`);return t.exchanges.push({question:a,answer:r}),t.current=``,t.currentQuestion=``,t.checks=[],r}catch(e){throw n.signal.aborted||(t.error=e instanceof Error?e.message:`Вопрос в сторону не удался`,t.question=a),e}finally{t.busy=!1,n=void 0}}function f(e){return Lk(e)}return{state:t,openPanel:r,close:i,toggle:a,clear:o,reset:s,stop:c,ask:d,status:u,command:f}}function Uk(e,t,n){let r=z(()=>(e.value.length,e.value.findLast(e=>e.role===`assistant`&&e.worktree)?.worktree)),i=X(),a=X(!1),o=X(``);async function s(){try{i.value=r.value?await n.worktreeInfo():void 0}catch{i.value=void 0}}R([()=>r.value?.id,t],s,{immediate:!0});async function c(e){a.value=!0;try{o.value=await e()??``}catch(e){o.value=e instanceof Error?e.message:`Не удалось выполнить`}finally{a.value=!1}}return{copy:r,copyInfo:i,copyWorking:a,copyNote:o,endCopy:c}}var Wk={key:0,class:`preview`,"aria-live":`polite`},Gk={class:`added`},Kk={class:`removed`},qk={key:0},Jk={class:`preview`,role:`status`},Yk=G(M({__name:`AgentRewind`,props:{canFiles:{type:Boolean},preview:{},previewError:{},working:{type:Boolean},result:{},root:{},initial:{}},emits:[`confirm`,`cancel`,`scope`],setup(e,{emit:t}){let n=P(),i=e,o=t,s=X(i.initial);R(s,e=>o(`scope`,e),{immediate:!0});let c=z(()=>s.value!==`conversation`),u=e=>i.root&&e.startsWith(`${i.root}/`)?e.slice(i.root.length+1):e,d=z(()=>[{value:`conversation`,name:`Только разговор`,note:`Сообщение вернётся в поле ввода; файлы останутся как есть`,files:!1},{value:`both`,name:`Разговор и файлы`,note:`И сообщения, и изменения в проекте возвращаются на этот шаг. Файлы, изменённые командами оболочки, не откатываются`,files:!0},{value:`files`,name:`Только файлы`,note:`Разговор остаётся, файлы возвращаются на этот шаг. Файлы, изменённые командами оболочки, не откатываются`,files:!0}]);return(t,i)=>(V(),Y(l,{class:`rewind`,role:`dialog`,"aria-label":`Откат к сообщению`},{default:F(()=>[I(r,{as:`header`,align:`center`,justify:`normal`},{default:F(()=>[I(H(LT),{"aria-hidden":`true`}),i[4]||=K(`span`,null,`Откатить к этому сообщению`,-1)]),_:1}),e.result?(V(),q(W,{key:1},[K(`p`,Jk,[e.result.ok?(V(),q(W,{key:0},[N(` Файлов возвращено: `+j(e.result.files.length)+`. `,1)],64)):(V(),q(W,{key:1},[N(j(e.result.error||`Не удалось вернуть файлы`),1)],64))]),I(r,{align:`stretch`},{default:F(()=>[I(Q,{size:`sm`,onClick:i[3]||=e=>o(`cancel`)},{default:F(()=>[...i[7]||=[N(`Закрыть`,-1)]]),_:1})]),_:1})],64)):(V(),q(W,{key:0},[(V(!0),q(W,null,J(d.value,t=>(V(),Y(r,{as:`label`,align:`start`,justify:`normal`,key:t.value,class:O({off:t.files&&!e.canFiles})},{default:F(()=>[I(a,{modelValue:s.value,"onUpdate:modelValue":i[0]||=e=>s.value=e,type:`radio`,name:H(n),value:t.value,disabled:t.files&&!e.canFiles},null,8,[`modelValue`,`name`,`value`,`disabled`]),K(`span`,null,[K(`b`,null,j(t.name),1),K(`small`,null,j(t.files&&!e.canFiles?`Этот агент не хранит резервные копии файлов`:t.note),1)])]),_:2},1032,[`class`]))),128)),c.value?(V(),q(`div`,Wk,[e.previewError?(V(),q(W,{key:0},[N(j(e.previewError),1)],64)):e.preview?e.preview.ok?e.preview.files.length?(V(),q(W,{key:4},[N(` Изменится файлов: `+j(e.preview.files.length)+` `,1),K(`span`,Gk,`+`+j(e.preview.insertions??0),1),K(`span`,Kk,`−`+j(e.preview.deletions??0),1),K(`ul`,null,[(V(!0),q(W,null,J(e.preview.files.slice(0,12),e=>(V(),q(`li`,{key:e},j(u(e)),1))),128)),e.preview.files.length>12?(V(),q(`li`,qk,`и ещё `+j(e.preview.files.length-12),1)):B(``,!0)])],64)):(V(),q(W,{key:3},[N(`Файлы уже такие, как на этом шаге.`)],64)):(V(),q(W,{key:2},[N(j(e.preview.error||`Вернуть файлы нельзя`),1)],64)):(V(),q(W,{key:1},[N(`Считаю, что изменится…`)],64))])):B(``,!0),I(r,{align:`stretch`},{default:F(()=>[I(Q,{appearance:`solid`,size:`sm`,disabled:e.working||c.value&&(!e.preview||!e.preview.ok),onClick:i[1]||=e=>o(`confirm`,s.value)},{default:F(()=>[...i[5]||=[N(` Откатить `,-1)]]),_:1},8,[`disabled`]),I(Q,{size:`sm`,onClick:i[2]||=e=>o(`cancel`)},{default:F(()=>[...i[6]||=[N(`Отмена`,-1)]]),_:1})]),_:1})],64))]),_:1}))}}),[[`__scopeId`,`data-v-3d079a0c`]]),Xk={class:`side`,"aria-label":`Вопрос в сторону`},Zk={class:`head`},Qk={class:`mark`,"aria-hidden":`true`},$k={class:`titles`},eA={class:`source`},tA={key:0,class:`empty`},nA={class:`question`},rA={key:1,class:`exchange current`},iA={key:0,class:`question`},aA={key:1,class:`checks`},oA={key:1,class:`dot`,"aria-hidden":`true`},sA={class:`check-name`},cA={key:2,class:`check-detail`},lA={key:3,class:`pending`},uA={key:2,class:`error`,role:`alert`},dA={class:`composer`},fA=[`disabled`],pA={class:`actions`},mA=G(M({__name:`AgentSideQuestion`,props:{side:{}},setup(e){let t=e,n=X(),r=X(),i=t.side.state,a=z(()=>{let e=[`Projector`,i.meta.provider,i.meta.model].filter(Boolean);return e.length>1?e.join(` · `):`Projector · только чтение`});function o(){Ut(()=>n.value?.focus())}function s(){i.question.trim()&&!i.busy&&(t.side.ask().catch(()=>{}),Ut(()=>{r.value?.scrollTo({top:r.value.scrollHeight})}))}function c(e){e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),s())}function l(){t.side.close()}function u(){t.side.clear(),o()}return R(()=>i.open,e=>{e&&o()}),R(()=>[i.current,i.checks.length,i.exchanges.length],()=>{Ut(()=>{let e=r.value;e&&(e.scrollTop=e.scrollHeight)})}),(e,o)=>(V(),q(`section`,Xk,[K(`header`,Zk,[K(`span`,Qk,[I(H(GE))]),K(`div`,$k,[o[2]||=K(`strong`,null,`Вопрос в сторону`,-1),K(`span`,eA,j(a.value),1)]),o[3]||=K(`span`,{class:`badge`},`не в чат`,-1),H(i).exchanges.length?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,title:`Очистить историю вопросов`,"aria-label":`Очистить историю вопросов`,onClick:u},{default:F(()=>[I(H(zf),{"aria-hidden":`true`})]),_:1})):B(``,!0),I(Q,{shape:`icon`,size:`sm`,title:`Закрыть`,"aria-label":`Закрыть вопрос в сторону`,onClick:l},{default:F(()=>[I(H(oi),{"aria-hidden":`true`})]),_:1})]),K(`div`,{ref_key:`thread`,ref:r,class:`thread`,"aria-live":`polite`},[!H(i).exchanges.length&&!H(i).currentQuestion&&!H(i).busy?(V(),q(`p`,tA,` Спросите о текущей работе, не прерывая агента. Ответ читается по видимой переписке и состоянию чата, но не попадает в историю. `)):B(``,!0),(V(!0),q(W,null,J(H(i).exchanges,(e,t)=>(V(),q(`article`,{key:t,class:`exchange`},[K(`p`,nA,j(e.question),1),I(H(hE),{text:e.answer},null,8,[`text`])]))),128)),H(i).currentQuestion||H(i).current||H(i).busy?(V(),q(`article`,rA,[H(i).currentQuestion?(V(),q(`p`,iA,j(H(i).currentQuestion),1)):B(``,!0),H(i).checks.length?(V(),q(`ul`,aA,[(V(!0),q(W,null,J(H(i).checks,e=>(V(),q(`li`,{key:e.id,class:O(e.status)},[e.status===`running`?(V(),Y(An,{key:0})):(V(),q(`span`,oA)),K(`span`,sA,j(e.name),1),e.detail?(V(),q(`span`,cA,j(e.detail),1)):B(``,!0)],2))),128))])):B(``,!0),H(i).current?(V(),Y(H(hE),{key:2,text:H(i).current,streaming:H(i).busy},null,8,[`text`,`streaming`])):H(i).busy?(V(),q(`p`,lA,[I(An),o[4]||=N(` Смотрю состояние чата…`,-1)])):B(``,!0)])):B(``,!0),H(i).error?(V(),q(`p`,uA,j(H(i).error),1)):B(``,!0)],512),K(`div`,dA,[et(K(`textarea`,{ref_key:`input`,ref:n,"onUpdate:modelValue":o[0]||=e=>H(i).question=e,name:`side-question`,rows:`2`,placeholder:`Например: завис ли процесс? какой сейчас статус?`,"aria-label":`Вопрос в сторону`,disabled:H(i).busy,onKeydown:c},null,40,fA),[[_n,H(i).question]]),K(`div`,pA,[o[7]||=K(`span`,{class:`note`},`Enter — спросить · Shift+Enter — новая строка`,-1),H(i).busy?(V(),Y(Q,{key:0,size:`sm`,onClick:o[1]||=e=>t.side.stop()},{default:F(()=>[...o[5]||=[N(`Остановить`,-1)]]),_:1})):(V(),Y(Q,{key:1,size:`sm`,disabled:!H(i).question.trim(),onClick:s},{default:F(()=>[...o[6]||=[N(` Спросить `,-1)]]),_:1},8,[`disabled`]))])])]))}}),[[`__scopeId`,`data-v-3006b375`]]),hA={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function gA(e,t){return V(),q(`svg`,hA,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M15 6a9 9 0 0 0-9 9V3`}),K(`circle`,{cx:`18`,cy:`6`,r:`3`}),K(`circle`,{cx:`6`,cy:`18`,r:`3`})],-1)]])}var _A=U({name:`lucide-git-branch`,render:gA}),vA={class:`what`},yA={key:0,class:`note`,role:`status`},bA=G(M({__name:`AgentWorktree`,props:{branch:{},info:{},working:{type:Boolean},note:{}},emits:[`merge`,`discard`],setup(e,{emit:t}){let n=t;return(t,i)=>(V(),Y(l,{density:`compact`,class:`worktree`,"aria-label":`Изолированная копия проекта`},{default:F(()=>[I(r,{as:`header`,align:`flex-start`,justify:`normal`},{default:F(()=>[I(H(_A),{"aria-hidden":`true`}),K(`span`,vA,[i[2]||=N(`Чат работает в изолированной копии, ветка `,-1),K(`code`,null,j(e.branch),1),i[3]||=N(`. Файлы проекта не затронуты`,-1),e.info?(V(),q(W,{key:0},[N(`; изменено файлов: `+j(e.info.changed),1)],64)):B(``,!0),i[4]||=N(`.`,-1)])]),_:1}),e.note?(V(),q(`p`,yA,j(e.note),1)):B(``,!0),I(r,{align:`stretch`},{default:F(()=>[I(Q,{appearance:`solid`,size:`sm`,disabled:e.working,title:`Влить изменения в ветку проекта и удалить копию`,onClick:i[0]||=e=>n(`merge`)},{default:F(()=>[...i[5]||=[N(` Влить в проект `,-1)]]),_:1},8,[`disabled`]),I(Q,{size:`sm`,disabled:e.working,title:`Удалить копию вместе со всем, что агент в ней сделал`,onClick:i[1]||=e=>n(`discard`)},{default:F(()=>[...i[6]||=[N(` Отбросить `,-1)]]),_:1},8,[`disabled`])]),_:1})]),_:1}))}}),[[`__scopeId`,`data-v-7c7ee357`]]);function xA(e){R(e.busy,n=>{let r=e.capabilities.value.compact;n||!r||e.contextShare.value<r.autoAt||e.queue.value.length||e.turns.value.findLast(e=>e.role===`user`)?.text!==r.command&&(e.error.value||t())});async function t(){await e.toBottom();let t=e.capabilities.value.compact;if(!t)throw Error(`Агент не поддерживает сжатие разговора`);await e.send(t.command)}return{compact:t}}function SA(e,t,n,r,i){let a=z(()=>{let t=e.value.at(-1);return t?.role===`assistant`&&t.failure?t:void 0}),o=z(()=>!!a.value&&!r.value&&!t.value&&n.value===a.value.failure);async function s(){let e=a.value;e&&await i(e.id)}return{retryableError:o,retryFailed:s}}function CA(e){async function t(){if(!e.draft.value.trim())return;let t=e.side.command(e.draft.value);t===void 0?(e.toBottom(),await e.send(),e.focus()):(e.draft.value=``,e.draftParts.value=[],e.side.openPanel(),t&&e.side.ask(t).catch(()=>{}))}async function n(){e.toBottom(),await e.send(`продолжай`)}async function r(t){e.draft.value=t,await Ut(),e.focus()}async function i(){e.side.reset(),await e.clear(),e.resetAway(),e.focus()}return{submit:t,continueTurn:n,suggest:r,newChat:i}}var wA=3;function TA(e){return e.slice(-16).map(e=>`${e.role===`user`?`Пользователь`:`Ассистент`}: ${e.text}`).join(`
|
|
62
|
+
|
|
63
|
+
`).slice(-2e4)}function EA(e,t){let n=new Map;for(let r=0;r<e.length-1;r++){let i=e[r],a=e[r+1];if(i.role!==`assistant`||a.role!==`user`||!a.form)continue;let o=Sh(i.text,t);o&&n.set(i.id,o)}return n}function DA(e){let t=z(()=>{if(e.busy.value)return;let t=e.turns.value.at(-1);return t?.role===`assistant`?Sh(t.text,e.projectId):void 0}),n=We(),r=We(),i=z(()=>EA(e.turns.value,e.projectId));function a(t){if(t.role!==`assistant`)return{};if(t.id===e.turns.value.at(-1)?.id)return r.value?{promotedForm:r.value}:{};let n=i.value.get(t.id);return n?{promotedForm:n,formAnswered:!0}:{}}let o=We(!1),s=We(``),c=0,l;async function u(t){let i=++c;if(l?.abort(),l=void 0,n.value=void 0,r.value=t,o.value=!1,s.value=``,!t)return;let a=qh(t),u=await zh(a,e.projectId);if(i!==c)return;if(!u){n.value=a;return}o.value=!0;let d=new AbortController;l=d;for(let t=0;t<wA&&!d.signal.aborted;t++)try{let t=await Yv({form:a,error:u,history:TA(e.turns.value),selection:e.selection?.value,signal:d.signal});if(i!==c||d.signal.aborted)return;let r=Jh(t,e.projectId);if(!r){u=`Form Doctor вернул не форму`;continue}if(a=qh(r),u=await zh(a,e.projectId),i!==c||d.signal.aborted)return;if(!u){n.value=a;return}}catch(e){if(i!==c||d.signal.aborted)return;u=e instanceof Error?e.message:String(e)}i===c&&(o.value=!1,s.value=u??`Не удалось восстановить форму`)}R(t,e=>void u(e),{immediate:!0});async function d(t,n,r,i,a){a&&e.edit(a),e.draft.value=t,e.draftParts.value=[],await Ut(),await e.send(void 0,void 0,{form:{source:i,values:n,...r?{summary:r}:{}}})}function f(e,t,n,r){return d(e,t,n,r)}function p(t,n,r,i){let a=e.turns.value.find(e=>e.id===t&&e.role===`user`);if(a?.form)return d(n,r,i,a.form.source,t)}return{pendingForm:n,originalForm:r,answeredForms:i,answerFormFor:a,repairing:o,repairError:s,submitComposerForm:f,submitTurnForm:p}}var OA=3;function kA(e){return e.slice(-16).map(e=>`${e.role===`user`?`Пользователь`:`Ассистент`}: ${e.text}`).join(`
|
|
64
|
+
|
|
65
|
+
`).slice(-2e4)}function AA(e,t){if(e.text=t,!e.parts)return;let n=!1,r=[];for(let i of e.parts)i.type===`text`?n||=(r.push({type:`text`,text:t}),!0):r.push(i);e.parts=r}function jA(e){let t=new Map,n=new Map;async function r(r){if(r.role!==`assistant`||t.get(r.id)===r.text)return;t.set(r.id,r.text),n.get(r.id)?.abort();let i=await Hh(r.text,e.projectId);if(!i||t.get(r.id)!==r.text)return;let a=r.text,o=i,s=new AbortController;n.set(r.id,s);for(let n=0;n<OA&&!s.signal.aborted;n++)try{let n=await Xv({answer:a,error:o,history:kA(e.turns.value),selection:e.selection?.value,signal:s.signal});if(s.signal.aborted||t.get(r.id)!==r.text)return;let i=Uh(n);if(!i){o=`Answer Doctor вернул пустой ответ`;continue}a=i;let c=await Hh(a,e.projectId);if(s.signal.aborted||t.get(r.id)!==r.text)return;if(!c){let t=e.turns.value.find(e=>e.id===r.id);if(t?.text!==r.text)return;AA(t,a),e.persist();return}o=c}catch(e){if(s.signal.aborted||t.get(r.id)!==r.text)return;o=e instanceof Error?e.message:String(e)}}R(()=>e.busy.value?[]:e.turns.value.filter(e=>e.role===`assistant`).map(e=>[e.id,e.text]),t=>{for(let[n]of t){let t=e.turns.value.find(e=>e.id===n);t&&r(t)}},{immediate:!0}),zt(()=>{for(let e of n.values())e.abort()})}var MA={class:`welcome`},NA={key:0,class:`role`},PA={key:1},FA={key:2,class:`suggestions`},IA={key:3,class:`coders`},LA={class:`coders-list`},RA=G(M({__name:`AgentWelcome`,props:{plain:{type:Boolean,default:!1},agentName:{default:`Агент`},roleName:{default:void 0}},emits:[`suggest`,`open`],setup(e,{emit:t}){let n=t,{isEnabled:r}=pS(),i=z(()=>aS().filter(e=>r(e.program))),a=[{title:`Разобраться в проекте`,text:`Посмотри структуру проекта и расскажи, где находятся основные части приложения.`},{title:`Посмотреть изменения в Git`,text:`Посмотри изменения в Git и кратко объясни, что изменилось. Ничего не меняй.`},{title:`Найти команду Projector`,text:`Какие команды Projector доступны для этого проекта?`}];return(t,r)=>(V(),q(`div`,MA,[K(`h1`,null,j(e.plain?e.agentName:`С чего начнём?`),1),e.roleName?(V(),q(`p`,NA,`Роль: `+j(e.roleName),1)):B(``,!0),e.plain?(V(),q(`p`,PA,`Работает в папке проекта, как в терминале.`)):(V(),q(`div`,FA,[(V(),q(W,null,J(a,e=>I(Q,{appearance:`outline`,tone:`muted`,shape:`pill`,key:e.title,type:`button`,onClick:t=>n(`suggest`,e.text)},{default:F(()=>[N(j(e.title),1)]),_:2},1032,[`onClick`])),64))])),e.plain?B(``,!0):(V(),q(`div`,IA,[r[0]||=K(`span`,{class:`coders-label`,title:`Я управляю Projector и не пишу код в файлах`},` Писать код — в агенте `,-1),K(`div`,LA,[(V(!0),q(W,null,J(i.value,e=>(V(),Y(Q,{appearance:`outline`,tone:`muted`,shape:`pill`,key:e.program,type:`button`,onClick:t=>n(`open`,e.program)},{default:F(()=>[N(j(e.title),1)]),_:2},1032,[`onClick`]))),128))])]))]))}}),[[`__scopeId`,`data-v-6824b9c4`]]);function zA(e){let t=e.replace(/\r\n?/g,`
|
|
66
|
+
`).split(`
|
|
67
|
+
`);for(;t.length&&!t[0].trim();)t.shift();for(;t.length&&!t.at(-1).trim();)t.pop();return t.map(e=>{let t=e.replace(/[ \t]+$/,``);return t?`> ${t}`:`>`}).join(`
|
|
68
|
+
`)}var BA=104,VA=28;function HA(e){let t=X(``),n=X(),r,i=!1;function a(){clearTimeout(r),r=void 0,t.value=``,n.value=void 0}function o(){let t=e.root(),n=document.getSelection();if(!t||!n||n.isCollapsed)return;let{anchorNode:r,focusNode:i}=n;if(!r||!i||!t.contains(r)||!t.contains(i))return;let a=n.toString().trim();if(!a||!n.rangeCount)return;let o=n.getRangeAt(0),s=o.getClientRects(),c=s.length?s[s.length-1]:o.getBoundingClientRect();return{text:a,position:{left:Math.min(Math.max(8,c.right+8),Math.max(8,window.innerWidth-BA-8)),top:Math.min(Math.max(8,c.bottom+8),Math.max(8,window.innerHeight-VA-8))}}}function s(){r=void 0;let e=o();e?(t.value=e.text,n.value=e.position):a()}function c(e=0){clearTimeout(r),r=setTimeout(s,e)}function l(e){e.target?.closest?.(`.quote-selection`)||(i=!0,a())}function u(){i&&(i=!1,c(30))}function d(){if(i)return;let e=document.getSelection();!e||e.isCollapsed?a():c(180)}function f(e){e.key===`Escape`?a():(e.shiftKey||e.key.startsWith(`Arrow`)||e.key===`Home`||e.key===`End`)&&c(120)}function p(){let n=zA(t.value);n&&e.quote(n),document.getSelection()?.removeAllRanges(),a()}return document.addEventListener(`pointerdown`,l,!0),document.addEventListener(`pointerup`,u,!0),document.addEventListener(`selectionchange`,d),document.addEventListener(`keyup`,f),document.addEventListener(`scroll`,a,!0),lt(()=>{clearTimeout(r),document.removeEventListener(`pointerdown`,l,!0),document.removeEventListener(`pointerup`,u,!0),document.removeEventListener(`selectionchange`,d),document.removeEventListener(`keyup`,f),document.removeEventListener(`scroll`,a,!0)}),{text:t,position:n,add:p,hide:a}}function UA(e){let t=e.trim();if(!t||t.startsWith(`#`))return null;let n=t.split(` `)[0]?.trim()??``;if(n.startsWith(`file:`))try{let e=new URL(n);return decodeURIComponent(e.pathname)}catch{return decodeURIComponent(n.replace(/^file:\/\/[^/]*/,``))}return n.startsWith(`/`)?n.replace(/\/+$/,``)||`/`:null}function WA(e,t){for(let n of e.split(/\r?\n/)){let e=UA(n);e&&!t.includes(e)&&t.push(e)}}function GA(e){return e?e.types.some(e=>e===`Files`||e===`text/uri-list`||e===`text/x-moz-url`||e.includes(`uri`)):!1}function KA(e){if(!e)return[];let t=[],n=[...e.types];for(let r of n){if(r===`Files`)continue;let n=e.getData(r);n&&WA(n,t)}t.length||(WA(e.getData(`text/uri-list`),t),WA(e.getData(`text/plain`),t));for(let n of e.files){let e=n.path;e&&!t.includes(e)&&t.push(e)}return t}var qA=e=>new Promise((t,n)=>e.readEntries(t,n)),JA=e=>new Promise((t,n)=>e.file(t,n));async function YA(e,t,n){let r=t+e.name;if(e.isFile){n.push({path:r,file:await JA(e)});return}let i=e.createReader(),a=n.length;for(let e=await qA(i);e.length;e=await qA(i))for(let t of e)await YA(t,r+`/`,n);n.length===a&&n.push({path:r})}function XA(e){let t=KA(e);if(t.length)return{kind:`paths`,paths:t};let n=[...e.items].filter(e=>e.kind===`file`).map(e=>({entry:e.webkitGetAsEntry?.()??null,file:e.getAsFile()})),r=n.length?[]:[...e.files],i=(async()=>{let e=r.map(e=>({path:e.name,file:e}));for(let{entry:t,file:r}of n)t?await YA(t,``,e):r&&e.push({path:r.name,file:r});return e})();return i.catch(()=>void 0),{kind:`files`,entries:i}}var ZA=e=>e.split(`/`)[0],QA=e=>e.replace(/\/+$/,``).split(`/`).at(-1)??``;function $A(e,t,n){let r=n;for(let n of t)Cb(e,r,r,n),r+=cb(n).length+1}function ej(e,t){$A(e,t,e.state.selection.main.head),e.focus()}function tj(e,t){let n=e.state.doc.length,r=e.state.doc.toString();r&&!/\s$/.test(r)&&(e.dispatch({changes:{from:n,insert:` `},selection:Hi.cursor(n+1)}),n+=1),$A(e,t,n),e.focus()}function nj(e,t){let n=t.trim();if(!n)return;let r=e.state.doc.toString(),i=r?r.endsWith(`
|
|
69
|
+
|
|
70
|
+
`)?``:r.endsWith(`
|
|
71
|
+
`)?`
|
|
72
|
+
`:`
|
|
73
|
+
|
|
74
|
+
`:``,a=e.state.doc.length;e.dispatch({changes:{from:a,insert:i+n},selection:Hi.cursor(a+i.length+n.length),userEvent:`input.paste`}),e.focus()}function rj(e,t){let n=t.trim();if(!n)return;let{from:r,to:i}=e.state.selection.main,a=e.state.doc.sliceString(0,r),o=e.state.doc.sliceString(i),s=a?a.endsWith(`
|
|
75
|
+
|
|
76
|
+
`)?``:a.endsWith(`
|
|
77
|
+
`)?`
|
|
78
|
+
`:`
|
|
79
|
+
|
|
80
|
+
`:``,c=o?o.startsWith(`
|
|
81
|
+
|
|
82
|
+
`)?``:o.startsWith(`
|
|
83
|
+
`)?`
|
|
84
|
+
`:`
|
|
85
|
+
|
|
86
|
+
`:`
|
|
87
|
+
|
|
88
|
+
`,l=s+n+c;e.dispatch({changes:{from:r,to:i,insert:l},selection:Hi.cursor(r+s.length+n.length+c.length),userEvent:`input.paste`}),e.focus()}async function ij(e,t){if(!t.length)throw Error(`Не удалось прочитать перетащенные файлы`);if(!Wn(e))throw Error(`Этот проект не принимает загрузку файлов`);let n=[...new Set(t.map(e=>ZA(e.path)))],{conflicts:r}=await hr(e,``,n),i=new Map(r.map(({name:e,free:t})=>[e,t])),a=e=>i.get(e)??e;for(let n of t){let[t,...r]=n.path.split(`/`);await Br(e,``,[a(t),...r].join(`/`),n.file)}return n.map(e=>{let n=a(e);return t.find(t=>t.path===e)?.file?{type:`file`,path:n}:{type:`file`,path:n,directory:!0}})}function aj(e){let t=``;async function n(){let n=e.projectId();if(n)try{t=(await Vn(n,`root`)).root}catch{t=``}}Lt(n);function r(e){return{type:`file`,path:t&&e.startsWith(`${t}/`)?e.slice(t.length+1):e}}function i(t){let n=e.projectId(),i=t.getData(`application/x-projector-tree-entry`);if(i)try{let e=JSON.parse(i);return e.projectId===n?(Array.isArray(e.paths)&&e.paths.length?e.paths:[e.path]).filter(e=>typeof e==`string`&&!!e).map(e=>({type:`file`,path:e})):[]}catch{return[]}return KA(t).map(r)}async function a(t,n){let r=e.view.value;if(!r)return;let i=n;for(let n of t)try{let e=await Zv(n),t=Math.min(i??r.state.selection.main.head,r.state.doc.length);Cb(r,t,t,e),i=t+cb(e).length+1}catch(t){e.onFail(t instanceof Error?t.message:`Не удалось загрузить файл`)}r.focus()}let o=e=>[...e?.files??[]].filter(e=>e.type.startsWith(`image/`));function s(e){let t=o(e);return t.length?(a(t),!0):!1}function c(e){return!!e&&(GA(e)||e.types.includes(`application/x-projector-tree-entry`))}async function l(t,n){let r=e.view.value,i=e.projectId();if(r){if(!i)e.onFail(`Папку можно добавить только в проект`);else try{let a=await ij(i,t.kind===`files`?await t.entries:[]);if(e.view.value!==r||i!==e.projectId()||!a.length)return;$A(r,a,Math.min(n,r.state.doc.length)),r.focus()}catch(t){e.onFail(t instanceof Error?t.message:`Не удалось добавить файлы`)}}}function u(t,n){let r=e.view.value;if(!r)return!1;let o=n??r.state.selection.main.head,s=i(t);if(s.length)return $A(r,s,o),r.focus(),!0;let c=[...t.files];return[...t.items].filter(e=>e.kind===`file`).some(e=>e.webkitGetAsEntry?.()?.isDirectory)?(l(XA(t),o),!0):c.length?(a(c,o),!0):!1}return{acceptsDrag:c,dropData:u,pasteImages:s,attachFiles:a}}function oj(e){let{main:t}=e.selection;if(!t.empty)return;let n=e.doc.lineAt(t.head),r=n.text.slice(0,t.head-n.from),i=/(?:^|\s)@([^\s@"]*)$/.exec(r);if(i){let e=i[1];return{kind:`file`,query:e,from:t.head-e.length-1,to:t.head}}let a=/^\/([^\s/]*)$/.exec(r);if(a&&n.number===1)return{kind:`command`,query:a[1],from:n.from,to:t.head}}function sj(e){let t=X([]),n=X(0),r,i;async function a(){let a=e.trigger.value;if(r?.abort(),clearTimeout(i),!a||e.dismissed.value===`${a.from}:${a.query}`){t.value=[];return}if(a.kind===`command`){let r=a.query.toLowerCase();t.value=(e.commands()??[]).map(e=>({command:e,at:e.name.toLowerCase().indexOf(r)})).filter(e=>e.at>=0).sort((e,t)=>e.at-t.at||e.command.name.localeCompare(t.command.name)).map(e=>e.command).slice(0,30).map(e=>({key:e.name,label:`/${e.name}`,detail:e.description,chip:{type:`command`,name:e.name},icon:pb({type:`command`,name:e.name})})),n.value=0;return}let o=e.projectId();if(!o)return;let s=r=new AbortController;i=setTimeout(async()=>{try{let e=await _r(o,a.query,s.signal);if(s.signal.aborted)return;t.value=e.map(e=>{let t={type:`file`,path:e.path,directory:e.directory};return{key:e.path,label:e.path.split(`/`).pop()||e.path,detail:e.path.includes(`/`)?e.path.slice(0,e.path.lastIndexOf(`/`)):``,path:!0,chip:t,icon:pb(t)}}),n.value=0}catch{s.signal.aborted||(t.value=[])}},60)}return R(e.trigger,a,{deep:!0}),R(e.commands,()=>{e.trigger.value?.kind===`command`&&a()},{deep:!0}),zt(()=>{r?.abort(),clearTimeout(i)}),{suggestions:t,active:n,refresh:a}}var cj={class:`agent-input`},lj=[`aria-selected`,`data-index`,`onMousedown`,`onMousemove`],uj=[`innerHTML`],dj={class:`label`},fj=G(M({__name:`AgentInput`,props:yt({projectId:{},commands:{}},{modelValue:{required:!0},modelModifiers:{},parts:{default:()=>[]},partsModifiers:{}}),emits:yt([`submit`,`open`,`fail`],[`update:modelValue`,`update:parts`]),setup(e,{expose:t,emit:n}){let r=Te(e,`modelValue`),i=Te(e,`parts`),a=e,o=n,s=X(),c=We(),{acceptsDrag:l,dropData:u,pasteImages:d}=aj({projectId:()=>a.projectId,view:c,onFail:e=>o(`fail`,e)}),f=X(),p=X(``),{suggestions:m,active:h}=sj({projectId:()=>a.projectId,commands:()=>a.commands,trigger:f,dismissed:p}),g=z(()=>!!f.value&&m.value.length>0);function _(e=h.value){let t=c.value,n=m.value[e],r=f.value;return!t||!n||!r||!g.value?!1:(Cb(t,r.from,r.to,n.chip),m.value=[],t.focus(),!0)}function v(e){return g.value?(h.value=(h.value+e+m.value.length)%m.value.length,s.value?.parentElement?.querySelector(`[data-index="${h.value}"]`)?.scrollIntoView({block:`nearest`}),!0):!1}function y(){return!g.value||!f.value?!1:(p.value=`${f.value.from}:${f.value.query}`,m.value=[],!0)}function b(e){let t=xb(e),n=lb(t);n!==r.value&&(r.value=n),i.value=t}function x(e){return i.value.length&&lb(i.value).trim()===e.trim()?i.value:e?[{type:`text`,text:e}]:[]}return Lt(()=>{let e=()=>(_()||o(`submit`),!0),t=new Li({parent:s.value,state:xi.create({doc:``,extensions:[xr(),Db,Li.lineWrapping,Li.contentAttributes.of({"aria-label":`Сообщение агенту`,"aria-multiline":`true`,spellcheck:`true`}),iee(`Что нужно сделать в проекте?`),Ai.highest(Bi.of([{key:`ArrowDown`,run:()=>v(1)},{key:`ArrowUp`,run:()=>v(-1)},{key:`Tab`,run:()=>_()},{key:`Escape`,run:y},{key:`Backspace`,run:Tb},{key:`Delete`,run:Eb},{key:`Enter`,run:t=>!t.composing&&e()},{key:`Shift-Enter`,run:e=>(e.dispatch(e.state.replaceSelection(`
|
|
89
|
+
`),{userEvent:`input`}),!0)}])),Bi.of([...Mr,...fr]),Li.domEventHandlers({dragover(e){return l(e.dataTransfer)?(e.preventDefault(),e.stopPropagation(),e.dataTransfer.dropEffect=`copy`,!0):!1},drop(e,t){let n=e.dataTransfer;if(!n)return!1;let r=t.posAtCoords({x:e.clientX,y:e.clientY})??t.state.selection.main.head;return u(n,r)?(e.preventDefault(),e.stopPropagation(),!0):!1},paste(e){return d(e.clipboardData)?(e.preventDefault(),!0):!1},mousedown(e){let t=e.target.closest(`.composer-chip`);return t?.dataset.chip?(e.preventDefault(),o(`open`,JSON.parse(t.dataset.chip)),!0):!1}}),Li.updateListener.of(e=>{if(e.docChanged&&b(e.state),e.docChanged||e.selectionSet){let t=oj(e.state);(t?.kind!==f.value?.kind||t?.from!==f.value?.from||t?.query!==f.value?.query)&&(f.value=t)}})]})});c.value=t,(r.value||i.value.length)&&Sb(t,x(r.value))}),lt(()=>{c.value?.destroy()}),R(r,e=>{let t=c.value,n=t?lb(xb(t.state)):``;!t||e===n||e&&e===n.trim()||Sb(t,x(e))}),t({focus:()=>c.value?.focus(),insertChips:e=>{c.value&&ej(c.value,e)},appendChips:e=>{c.value&&tj(c.value,e)},appendText:e=>{c.value&&nj(c.value,e)},insertQuote:e=>{c.value&&rj(c.value,e)},acceptsDrag:l,dropData:u,end:()=>c.value?.dispatch({selection:Hi.cursor(c.value.state.doc.length)})}),(e,t)=>(V(),q(`div`,cj,[K(`div`,{ref_key:`host`,ref:s,class:`editor`},null,512),g.value?(V(),Y(_l,{key:0,class:`suggest`,role:`listbox`,"aria-label":`Подсказки`,flow:`column`,border:`strong`,radius:`lg`},{default:F(()=>[(V(!0),q(W,null,J(H(m),(e,t)=>(V(),q(`button`,{key:e.key,type:`button`,role:`option`,class:O([`suggestion`,{active:t===H(h)}]),"aria-selected":t===H(h),"data-index":t,tabindex:`-1`,onMousedown:Z(e=>_(t),[`prevent`]),onMousemove:e=>h.value=t},[K(`span`,{class:`icon`,"aria-hidden":`true`,innerHTML:e.icon},null,8,uj),K(`span`,dj,j(e.label),1),e.detail?(V(),q(`span`,{key:0,class:O([`detail u-truncate`,{path:e.path}])},j(e.detail),3)):B(``,!0)],42,lj))),128))]),_:1})):B(``,!0)]))}}),[[`__scopeId`,`data-v-a99b7541`]]),pj=[`title`,`aria-label`],mj=G(M({__name:`AgentWorkClock`,props:{startedAt:{default:void 0},title:{default:`Агент работает над ответом`}},setup(e){let t=e,n=Mb(),r=z(()=>t.startedAt===void 0?``:Ob(n.value-t.startedAt));return(t,n)=>r.value?(V(),q(`span`,{key:0,class:`work-clock`,role:`timer`,title:`${e.title}: ${r.value}`,"aria-label":`${e.title}: ${r.value}`},[I(H(aE),{"aria-hidden":`true`}),K(`span`,null,j(r.value),1)],8,pj)):B(``,!0)}}),[[`__scopeId`,`data-v-e6cd4738`]]),hj=G(M({__name:`AgentQuote`,props:{root:{}},emits:[`quote`],setup(e,{emit:t}){let n=e,r=t,{text:i,position:a,add:o}=HA({root:()=>n.root,quote:e=>r(`quote`,e)});return(e,t)=>(V(),Y(ht,{to:`body`},[H(i)&&H(a)?(V(),q(`button`,{key:0,type:`button`,class:`quote-selection`,title:`Цитировать выделенный текст`,"aria-label":`Цитировать выделенный текст`,style:k({left:`${H(a).left}px`,top:`${H(a).top}px`}),onMousedown:t[0]||=Z(()=>{},[`prevent`]),onClick:t[1]||=(...e)=>H(o)&&H(o)(...e)},` Цитировать `,36)):B(``,!0)]))}}),[[`__scopeId`,`data-v-97f143a0`]]),gj={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function _j(e,t){return V(),q(`svg`,gj,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`m5 12l7-7l7 7m-7 7V5`},null,-1)]])}var vj=U({name:`lucide-arrow-up`,render:_j}),yj={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function bj(e,t){return V(),q(`svg`,yj,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2M9 20h6`},null,-1)]])}var xj=U({name:`lucide-type`,render:bj}),Sj={class:`composer-area`},Cj={key:0,class:`chat-error`,role:`alert`},wj={key:0,class:`composer-form`},Tj=[`title`,`aria-label`,`disabled`],Ej={class:`u-sr-only`,role:`status`},Dj=G(M({__name:`AgentComposer`,props:yt({busy:{type:Boolean},startedAt:{},error:{},copied:{type:Boolean},projectId:{},quoteRoot:{},commands:{},form:{},editing:{type:Boolean},retryable:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{},parts:{default:()=>[]},partsModifiers:{}}),emits:yt([`submit`,`stop`,`open`,`fail`,`dismiss`,`retry`,`formSubmit`],[`update:modelValue`,`update:parts`]),setup(e,{expose:t,emit:n}){let i=Te(e,`modelValue`),a=Te(e,`parts`),o=e,s=n,c=X(!1),l=z(()=>o.error.length>160||o.error.includes(`
|
|
90
|
+
`));R(()=>o.error,()=>c.value=!1);let u=X(``);R(()=>o.form,(e,t)=>{e&&e!==t&&(u.value=``)}),R(()=>o.busy,(e,t)=>{t&&!e&&(u.value=``)});let d=z(()=>!!o.form&&!o.busy&&!o.editing&&u.value!==o.form),f=z(()=>d.value?o.form:void 0);function p(){u.value=o.form??``}function m(){o.form&&(u.value=``)}function h(e,t,n){let r=o.form;r&&(u.value=r,s(`formSubmit`,e,t,n,r))}let g=X(),_=X(),v=X(!1);R(()=>d.value,e=>{e||(v.value=!1)}),R(f,()=>v.value=!1);function y(){d.value?_.value?.submit():s(`submit`)}async function b(e){p(),await Ut(),g.value?.appendChips(e)}async function x(e){p(),await Ut(),g.value?.appendText(e)}async function S(e){p(),await Ut(),g.value?.insertQuote(e)}return t({focus:()=>{d.value||g.value?.focus()},attach:b,appendText:x,quote:S,acceptsDrag:e=>!!g.value?.acceptsDrag(e),dropData:e=>!!g.value?.dropData(e),showForm:m,hideForm:p}),(t,n)=>(V(),q(`div`,Sj,[e.error?(V(),q(`div`,Cj,[I(H(E_),{"aria-hidden":`true`}),K(`p`,{class:O([`chat-error-text`,{clamped:l.value&&!c.value,open:c.value}])},j(e.error),3),l.value?(V(),q(`button`,{key:0,type:`button`,class:`chat-error-toggle`,onClick:n[0]||=e=>c.value=!c.value},j(c.value?`Свернуть`:`Развернуть`),1)):B(``,!0),e.retryable&&!e.busy?(V(),q(`button`,{key:1,type:`button`,class:`chat-error-retry`,title:`Повторить ответ`,"aria-label":`Повторить ответ`,onClick:n[1]||=e=>s(`retry`)},[I(H($T),{"aria-hidden":`true`})])):B(``,!0),K(`button`,{type:`button`,class:`chat-error-close`,title:`Скрыть`,"aria-label":`Скрыть ошибку`,onClick:n[2]||=e=>s(`dismiss`)},[I(H(oi),{"aria-hidden":`true`})])])):B(``,!0),I(hj,{root:e.quoteRoot,onQuote:S},null,8,[`root`]),K(`form`,{class:O([`composer`,{working:e.busy,"form-mode":d.value}]),onSubmit:Z(y,[`prevent`])},[f.value?(V(),q(`div`,wj,[I(H(GT),{ref_key:`formPanel`,ref:_,composer:``,source:f.value,"project-id":e.projectId,onSubmit:h,onSubmittable:n[3]||=e=>v.value=e},null,8,[`source`,`project-id`])])):B(``,!0),et(I(fj,{ref_key:`input`,ref:g,modelValue:i.value,"onUpdate:modelValue":n[4]||=e=>i.value=e,parts:a.value,"onUpdate:parts":n[5]||=e=>a.value=e,"project-id":e.projectId,commands:e.commands,onSubmit:n[6]||=e=>s(`submit`),onOpen:n[7]||=e=>s(`open`,e),onFail:n[8]||=e=>s(`fail`,e)},null,8,[`modelValue`,`parts`,`project-id`,`commands`]),[[Ln,!d.value]]),I(r,{class:`composer-footer`,justify:`normal`},{default:F(()=>[L(t.$slots,`controls`,{},void 0,!0),I(r,{class:`footer-end`,justify:`normal`},{default:F(()=>[e.form&&!e.editing?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,class:`form-toggle`,title:d.value?`Переключиться на текст`:`Открыть форму ответа`,"aria-label":d.value?`Переключиться на текст`:`Открыть форму ответа`,"aria-pressed":d.value,onClick:n[9]||=e=>d.value?p():m()},{default:F(()=>[d.value?(V(),Y(H(xj),{key:0,"aria-hidden":`true`})):(V(),Y(H(RO),{key:1,"aria-hidden":`true`}))]),_:1},8,[`title`,`aria-label`,`aria-pressed`])):B(``,!0),e.busy&&e.startedAt?(V(),Y(mj,{key:1,"started-at":e.startedAt},null,8,[`started-at`])):B(``,!0),L(t.$slots,`status`,{},void 0,!0),e.busy?(V(),q(`button`,{key:2,type:`button`,class:`send-button stop-button`,title:`Остановить`,"aria-label":`Остановить`,onClick:n[10]||=e=>s(`stop`)},[I(H(u_),{"aria-hidden":`true`})])):B(``,!0),!e.busy||i.value.trim()?(V(),q(`button`,{key:3,type:`submit`,class:`send-button`,title:d.value?v.value?`Отправить форму`:`Сначала отправьте форму`:e.busy?`В очередь: уйдёт, когда агент закончит (Enter)`:`Отправить (Enter)`,"aria-label":d.value?v.value?`Отправить форму`:`Отправка недоступна, пока открыта форма`:e.busy?`Поставить сообщение в очередь`:`Отправить сообщение`,disabled:d.value?!v.value:!i.value.trim()},[I(H(vj),{"aria-hidden":`true`})],8,Tj)):B(``,!0)]),_:3})]),_:3})],34),K(`span`,Ej,j(e.copied?`Ответ скопирован`:``),1)]))}}),[[`__scopeId`,`data-v-a2be1860`]]),Oj={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function kj(e,t){return V(),q(`svg`,Oj,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`m18 15l-6-6l-6 6`},null,-1)]])}var Aj=U({name:`lucide-chevron-up`,render:kj}),jj={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Mj(e,t){return V(),q(`svg`,jj,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M12 20v2m0-20v2m5 16v2m0-20v2M2 12h2m-2 5h2M2 7h2m16 5h2m-2 5h2M20 7h2M7 20v2M7 2v2`}),K(`rect`,{width:`16`,height:`16`,x:`4`,y:`4`,rx:`2`}),K(`rect`,{width:`8`,height:`8`,x:`8`,y:`8`,rx:`1`})],-1)]])}var Nj=U({name:`lucide-cpu`,render:Mj}),Pj={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Fj(e,t){return V(),q(`svg`,Pj,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15.914 4a1.5 1.5 0 0 0-2.474-1.561l-9 9A1.5 1.5 0 0 0 5.5 14h4.002a.5.5 0 0 1 .471.666L8.086 20a1.5 1.5 0 0 0 2.475 1.56l9-9A1.5 1.5 0 0 0 18.5 10h-3.997a.5.5 0 0 1-.472-.667z`},null,-1)]])}var Ij=U({name:`lucide-zap`,render:Fj}),Lj={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Rj(e,t){return V(),q(`svg`,Lj,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M10 5H3m9 14H3M14 3v4m2 10v4m5-9h-9m9 7h-5m5-14h-7m-6 5v4m0-2H3`},null,-1)]])}var zj=U({name:`lucide-sliders-horizontal`,render:Rj}),Bj=[`disabled`,`aria-expanded`,`aria-controls`],Vj={class:`value u-truncate`},Hj={key:0,class:`mcp`,role:`group`,"aria-label":`MCP-серверы`},Uj=[`title`],Wj={class:`mcp-name u-truncate`},Gj={class:`mcp-state`},Kj={key:0,class:`group`},qj=G(M({__name:`AgentControls`,props:{controls:{},disabled:{type:Boolean},mcp:{}},emits:[`change`,`opened`],setup(e,{expose:t,emit:n}){let i=e,a=n,o=mu({anchor:`left`,placement:`above`,initialFocus:[`button.option.current`,`button.option`],returnFocus:`.trigger`}),{open:s,toggle:c,close:l}=o,u={model:Nj,effort:cD,mode:OE,flag:Ij,other:zj};function d(e){return e.options.find(t=>t.value===e.current)?.name??e.current}let f=z(()=>i.controls.filter(e=>e.category!==`other`).map(e=>({id:e.id,category:e.category,name:e.name,value:d(e)}))),p=X(),m=z(()=>i.controls.find(e=>e.id===p.value)),h=z(()=>{let e=m.value?.options??[],t=[];for(let n of e){let e=t.at(-1);e&&e.name===n.group?e.options.push(n):t.push({name:n.group,options:[n]})}return t});R(s,e=>{e?a(`opened`):p.value=void 0});async function g(e){p.value=e,await Ut(),o.island.value?.querySelector(`button.option.current, button.option, button.row`)?.focus()}function _(e,t){t!==e.current&&a(`change`,e.id,t),l()}function v(e){m.value&&(e.preventDefault(),g())}return t({toggle:()=>o.toggle()}),(t,n)=>(V(),q(W,null,[e.controls.length?(V(),q(`div`,{key:0,ref:H(o).trigger,class:`agent-controls`},[K(`button`,{type:`button`,class:`trigger`,disabled:e.disabled,"aria-haspopup":`dialog`,"aria-expanded":H(s),"aria-controls":H(s)?H(o).id:void 0,"aria-label":`Параметры агента`,onClick:n[0]||=e=>H(c)()},[(V(!0),q(W,null,J(f.value,e=>(V(),Y(r,{as:`span`,inline:``,gap:1.25,justify:`normal`,key:e.id,class:`chip`,"data-category":e.category,title:`${e.name}: ${e.value}`},{default:F(()=>[(V(),Y(qe(u[e.category]),{"aria-hidden":`true`})),K(`span`,Vj,j(e.value),1)]),_:2},1032,[`data-category`,`title`]))),128)),f.value.length?B(``,!0):(V(),Y(H(zj),{key:0,"aria-hidden":`true`})),I(H(Aj),{class:`arrow`,"aria-hidden":`true`})],8,Bj)],512)):B(``,!0),I(kl,{menu:H(o),label:`Параметры агента`,width:300},{default:F(()=>[m.value?(V(),Y(ml,{key:1,flow:`flex`,gap:`none`,class:`options`,role:`group`,"aria-label":m.value.name,onKeydown:yn(v,[`left`])},{default:F(()=>[I(ts,{separator:`after`,tone:`neutral`,type:`button`,class:`head`,onClick:n[1]||=e=>g()},{default:F(()=>[I(H(zD),{"aria-hidden":`true`}),I(gl,{title:m.value.name,description:m.value.description,"description-mode":`wrap`},null,8,[`title`,`description`])]),_:1}),I(ml,{flow:`flex`,gap:`none`,class:`list`},{default:F(()=>[(V(!0),q(W,null,J(h.value,(e,t)=>(V(),q(W,{key:e.name??t},[e.name?(V(),q(`span`,Kj,j(e.name),1)):B(``,!0),(V(!0),q(W,null,J(e.options,e=>(V(),Y(ts,{key:e.value,type:`button`,class:O([`option`,{current:e.value===m.value.current}]),role:`menuitemradio`,"aria-checked":e.value===m.value.current,onClick:t=>_(m.value,e.value)},{default:F(()=>[I(gl,{title:e.name,description:e.description,"description-mode":`wrap`,emphasized:e.value===m.value.current},null,8,[`title`,`description`,`emphasized`]),e.value===m.value.current?(V(),Y(H(C_),{key:0,class:`check`,"aria-hidden":`true`})):B(``,!0)]),_:2},1032,[`class`,`aria-checked`,`onClick`]))),128))],64))),128))]),_:1})]),_:1},8,[`aria-label`])):(V(),Y(ml,{key:0,flow:`flex`,gap:`none`,class:`rows`,role:`group`,"aria-label":`Параметры агента`},{default:F(()=>[(V(!0),q(W,null,J(e.controls,e=>(V(),Y(ts,{key:e.id,type:`button`,class:`row`,title:e.description,onClick:t=>g(e.id)},{default:F(()=>[(V(),Y(qe(u[e.category]),{class:`lead`,"aria-hidden":`true`})),I(gl,{title:e.name,description:d(e),"description-mode":`wrap`,"description-tone":`secondary`},null,8,[`title`,`description`]),I(H(of),{class:`next`,"aria-hidden":`true`})]),_:2},1032,[`title`,`onClick`]))),128)),e.mcp?.length?(V(),q(`div`,Hj,[n[2]||=K(`span`,{class:`mcp-title`},`MCP-серверы`,-1),(V(!0),q(W,null,J(e.mcp,e=>(V(),q(`span`,{key:e.name,class:`mcp-row`,title:e.error||e.status},[I(ne,{as:`i`,size:6,radius:`circle`,tone:e.status===`connected`?`success`:e.error?`danger`:`faint`},null,8,[`tone`]),K(`span`,Wj,j(e.name),1),K(`span`,Gj,j(e.status===`connected`?`работает`:e.status)+j(e.tools?` · ${e.tools}`:``),1)],8,Uj))),128))])):B(``,!0)]),_:1}))]),_:1},8,[`menu`])],64))}}),[[`__scopeId`,`data-v-13c0705a`]]),Jj={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Yj(e,t){return V(),q(`svg`,Jj,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`}),K(`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`})],-1)]])}var Xj=U({name:`lucide-key-round`,render:Yj}),Zj={key:0,class:`secrets`,role:`dialog`,"aria-label":`Запрос секрета`},Qj={class:`title`},$j={key:0,class:`reason`},eM={key:1,class:`destination`},tM={key:0},nM={key:2,class:`destination`},rM={class:`address`},iM={key:0},aM={key:1},oM={key:3,class:`destination`},sM={key:0},cM=[`onSubmit`],lM=[`onUpdate:modelValue`],uM=G(M({__name:`AgentSecrets`,props:{requests:{}},emits:[`answer`],setup(e,{emit:t}){let n=t,i=at({});function a(e){let t=i[e]??``;t&&(delete i[e],n(`answer`,e,t))}function o(e){delete i[e],n(`answer`,e,null)}return(t,n)=>e.requests.length?(V(),q(`div`,Zj,[(V(!0),q(W,null,J(e.requests,e=>(V(),Y(l,{key:e.id,as:`section`,tone:`warning`,density:`notice`,class:`secret`},{default:F(()=>[I(r,{as:`header`,align:`center`,justify:`normal`},{default:F(()=>[I(H(Xj),{"aria-hidden":`true`}),K(`span`,Qj,j(e.label),1)]),_:2},1024),e.reason?(V(),q(`p`,$j,j(e.reason),1)):B(``,!0),e.destination.kind===`env_file`?(V(),q(`p`,eM,[n[0]||=N(` Значение запишется в `,-1),K(`code`,null,j(e.destination.file),1),n[1]||=N(` как `,-1),K(`code`,null,j(e.destination.key),1),e.destination.replaces?(V(),q(`span`,tM,`, заменит текущее`)):B(``,!0),n[2]||=N(`. Агент его не увидит. `,-1)])):e.destination.kind===`ai_provider`?(V(),q(`p`,nM,[n[4]||=N(` Ключ провайдера `,-1),K(`strong`,null,j(e.destination.name),1),n[5]||=N(`, адрес `,-1),K(`code`,rM,j(e.destination.url),1),e.destination.model?(V(),q(`span`,iM,[n[3]||=N(`, модель `,-1),K(`code`,null,j(e.destination.model),1)])):B(``,!0),n[6]||=N(`. Ключ будет отправляться только на этот адрес. Хранится в системном хранилище секретов; `,-1),e.destination.replaces?(V(),q(`span`,aM,`заменит текущий ключ. `)):B(``,!0),n[7]||=N(`Агент его не увидит. `,-1)])):(V(),q(`p`,oM,[N(` Ключ или токен `+j(e.destination.label)+`: сохраним в системном хранилище секретов`,1),e.destination.replaces?(V(),q(`span`,sM,`, заменит текущий`)):B(``,!0),n[8]||=N(`. Агент его не увидит. `,-1)])),K(`form`,{class:`entry`,onSubmit:Z(t=>a(e.id),[`prevent`])},[et(K(`input`,{"onUpdate:modelValue":t=>i[e.id]=t,class:`value`,type:`password`,name:`secret`,autocomplete:`off`,autocapitalize:`off`,autocorrect:`off`,spellcheck:`false`,placeholder:`Значение`,"aria-label":`Значение секрета`,"data-1p-ignore":``,"data-lpignore":`true`},null,8,lM),[[_n,i[e.id]]]),I(r,{align:`stretch`},{default:F(()=>[I(Q,{type:`submit`,appearance:`solid`,size:`sm`,disabled:!i[e.id]},{default:F(()=>[...n[9]||=[N(` Сохранить `,-1)]]),_:1},8,[`disabled`]),I(Q,{type:`button`,size:`sm`,onClick:t=>o(e.id)},{default:F(()=>[...n[10]||=[N(` Отказаться `,-1)]]),_:1},8,[`onClick`])]),_:2},1024)],40,cM)]),_:2},1024))),128))])):B(``,!0)}}),[[`__scopeId`,`data-v-5204b495`]]),dM={"System prompt":`Системный промпт`,"System tools":`Инструменты`,"MCP tools":`MCP-инструменты`,"Custom agents":`Агенты`,"Memory files":`Файлы памяти`,Skills:`Навыки`,Messages:`Сообщения`},fM={"System prompt":`var(--info)`,"System tools":`color-mix(in srgb, var(--info) 65%, var(--accent))`,"MCP tools":`color-mix(in srgb, var(--accent) 70%, var(--err))`,"Custom agents":`color-mix(in srgb, var(--run) 65%, var(--info))`,"Memory files":`var(--accent)`,Skills:`color-mix(in srgb, var(--warn) 70%, var(--err))`,Messages:`var(--run)`},pM=[`aria-label`,`aria-expanded`,`aria-controls`],mM={viewBox:`0 0 20 20`,"aria-hidden":`true`},hM=[`stroke-dasharray`],gM={class:`headline`},_M={class:`percent`},vM={class:`bar`,"aria-hidden":`true`},yM={class:`line`},bM={class:`note`},xM={key:0,class:`categories`},SM={class:`cat-name u-truncate`},CM={class:`cat-tokens`},wM={key:1,class:`note`},TM={key:2,class:`note`},EM={key:0},DM={key:1},OM={key:2},kM=G(M({__name:`AgentContextMeter`,props:{context:{}},setup(e){let t=e,n=mu({anchor:`right`,placement:`above`,initialFocus:`button`,returnFocus:`button`}),{open:r}=n,i=z(()=>Math.min(100,Math.max(0,t.context.used/t.context.size*100))),a=z(()=>i.value>=90?`err`:i.value>=70?`warn`:`ok`),o=z(()=>Math.max(0,t.context.size-t.context.used)),s=new Intl.NumberFormat(`ru`),c=e=>s.format(Math.round(e)),l=e=>e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}k`:String(e),u=z(()=>`Контекст заполнен на ${Math.round(i.value)}%: ${l(t.context.used)} из ${l(t.context.size)}`),d=z(()=>(t.context.categories??[]).filter(e=>e.tokens>0&&!/^free space$/i.test(e.name)).sort((e,t)=>t.tokens-e.tokens).map(e=>({name:dM[e.name]??e.name,tokens:e.tokens,color:fM[e.name]??`var(--muted)`,width:Math.min(100,e.tokens/Math.max(1,t.context.size)*100)}))),f=z(()=>{let e=t.context.cost;if(!e)return``;try{return new Intl.NumberFormat(`ru`,{style:`currency`,currency:e.currency}).format(e.amount)}catch{return`${e.amount} ${e.currency}`}}),p=()=>void n.toggle(!0),m=()=>n.close(!1);return(t,s)=>(V(),q(W,null,[K(`div`,{ref:H(n).trigger,class:`context-meter`},[K(`button`,{type:`button`,class:O([`ring-button`,a.value]),"aria-label":u.value,"aria-expanded":H(r),"aria-controls":H(r)?H(n).id:void 0,"aria-haspopup":`dialog`,onMouseenter:p,onMouseleave:m,onFocus:p,onBlur:m,onKeydown:yn(m,[`esc`])},[(V(),q(`svg`,mM,[s[0]||=K(`circle`,{class:`track`,cx:`10`,cy:`10`,r:`7.5`,pathLength:`100`},null,-1),K(`circle`,{class:`fill`,cx:`10`,cy:`10`,r:`7.5`,pathLength:`100`,"stroke-dasharray":`${i.value} 100`},null,8,hM)]))],42,pM)],512),I(kl,{menu:H(n),passive:``,label:`Контекст агента`,width:280},{default:F(()=>[K(`div`,{class:O([`details`,a.value])},[K(`div`,gM,[s[1]||=K(`span`,{class:`title`},`Контекст`,-1),K(`span`,_M,j(Math.round(i.value))+`%`,1)]),K(`div`,vM,[d.value.length?(V(!0),q(W,{key:0},J(d.value,e=>(V(),q(`span`,{key:e.name,class:`bar-segment`,style:k({width:`${e.width}%`,background:e.color})},null,4))),128)):(V(),q(`span`,{key:1,class:`bar-fill`,style:k({width:`${i.value}%`})},null,4)),e.context.compactAt?(V(),q(`span`,{key:2,class:`bar-mark`,style:k({left:`${e.context.compactAt/e.context.size*100}%`})},null,4)):B(``,!0)]),K(`p`,yM,j(c(e.context.used))+` из `+j(c(e.context.size))+` токенов`,1),K(`p`,bM,`Свободно `+j(c(o.value)),1),d.value.length?(V(),q(`ul`,xM,[(V(!0),q(W,null,J(d.value,e=>(V(),q(`li`,{key:e.name},[K(`span`,{class:`cat-dot`,style:k({background:e.color}),"aria-hidden":`true`},null,4),K(`span`,SM,j(e.name),1),K(`span`,CM,j(l(e.tokens)),1)]))),128))])):B(``,!0),e.context.compactAt?(V(),q(`p`,wM,` Автосжатие при `+j(c(e.context.compactAt))+` токенов `,1)):B(``,!0),e.context.model||f.value?(V(),q(`p`,TM,[e.context.model?(V(),q(`span`,EM,j(e.context.model),1)):B(``,!0),e.context.model&&f.value?(V(),q(`span`,DM,` · `)):B(``,!0),f.value?(V(),q(`span`,OM,j(f.value),1)):B(``,!0)])):B(``,!0)],2)]),_:1},8,[`menu`])],64))}}),[[`__scopeId`,`data-v-7fa91dbc`]]),AM=[`src`],jM=220,MM=G(M({__name:`AgentChipPreview`,props:{projectId:{},scope:{}},setup(e){let t=e,n=/\.(png|jpe?g|gif|webp|svg|bmp|avif|ico)$/i,r=X(),i=X({left:0,top:0,below:!1}),a=X(!1),o,s;function c(e){return e?e.type===`image`?C(`/api/agent/attachments/${encodeURIComponent(e.id)}`):e.type===`file`&&!e.directory&&n.test(e.path)?Gn(t.projectId,e.path,zy(e.path)):``:``}let l=z(()=>c(r.value));function u(e){return(e instanceof Element?e.closest(`[data-chip]`):null)??void 0}function d(){clearTimeout(o),s=void 0,r.value=void 0}function f(e){let t=u(e.target);if(t===s||(d(),!t?.dataset.chip))return;let n;try{n=JSON.parse(t.dataset.chip)}catch{return}c(n)&&(s=t,o=setTimeout(()=>{let e=t.getBoundingClientRect(),o=e.top<220;a.value=!1,i.value={left:Math.max(8,Math.min(e.left,window.innerWidth-280)),top:o?e.bottom+6:e.top-6,below:o},r.value=n},jM))}let p;function m(e){p?.removeEventListener(`mouseover`,f),p?.removeEventListener(`mouseleave`,d),p?.removeEventListener(`mousedown`,d),p=e,p?.addEventListener(`mouseover`,f),p?.addEventListener(`mouseleave`,d),p?.addEventListener(`mousedown`,d)}return R(()=>t.scope,m,{immediate:!0}),lt(()=>{m(void 0),clearTimeout(o)}),(e,t)=>(V(),Y(ht,{to:`body`},[r.value&&l.value&&!a.value?(V(),Y(_l,{key:0,class:O([`chip-preview`,{below:i.value.below}]),style:k({left:`${i.value.left}px`,top:`${i.value.top}px`}),role:`img`,"aria-label":r.value.type===`image`?r.value.name:r.value.type===`file`?r.value.path:``},{default:F(()=>[K(`img`,{src:l.value,alt:``,onError:t[0]||=e=>a.value=!0},null,40,AM)]),_:1},8,[`class`,`style`,`aria-label`])):B(``,!0)]))}}),[[`__scopeId`,`data-v-952cf26a`]]),NM={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function PM(e,t){return V(),q(`svg`,NM,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8`}),K(`path`,{d:`M3 3v5h5m4-1v5l4 2`})],-1)]])}var FM=U({name:`lucide-history`,render:PM}),IM={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function LM(e,t){return V(),q(`svg`,IM,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 17v5M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4a1 1 0 0 1 1 1z`},null,-1)]])}var RM=U({name:`lucide-pin`,render:LM}),zM={key:1,class:`note`},BM={key:2,class:`note error`,role:`alert`},VM={key:3,class:`note`},HM={key:4,class:`note`},UM={key:5,class:`note`},WM=[`title`,`onClick`],GM={class:`title u-truncate`},KM={key:2,class:`branch-agent`},qM={class:`age`},JM=[`title`,`aria-label`,`onClick`],YM=[`onClick`],XM=[`title`,`aria-label`,`onClick`],ZM=[`aria-expanded`,`disabled`,`title`],QM={key:0},$M={key:1},eN={key:2},tN={key:7,class:`note`},nN={key:8,class:`note error`,role:`alert`},rN=G(M({__name:`AgentSessions`,props:{native:{},disabled:{type:Boolean},active:{},editable:{type:Boolean},deletable:{type:Boolean},recent:{}},emits:[`open`,`pick`,`change`,`remove`,`openRecent`],setup(e,{emit:t}){let n=e,i=t,o=mu({anchor:`right`,initialFocus:[`input[type=search]`,`button.item`],items:`button.item, button.mini`}),{open:s}=o,c=X(``),l=X(``),u=X(``),d=X(``),f=X(),p=z(()=>{let e=n.native.sessions.map(e=>({...e,native:!0})),t=new Map(e.map(e=>[e.id,e])),r=new Set;for(let i of n.recent.items){if(i.session){let e=t.get(i.session);if(e){if(e.chat)continue;e.chat=i.chat,i.updatedAt>(e.updatedAt??``)&&(e.updatedAt=i.updatedAt);continue}if(r.has(i.session))continue;r.add(i.session)}e.push({id:i.chat,title:i.title,updatedAt:i.updatedAt,chat:i.chat,native:!1})}let i=new Set(e.filter(e=>e.native&&e.chat).map(e=>e.title));return e.filter(e=>!e.native||e.chat||e.parent?!0:!i.has(e.title)).sort((e,t)=>Number(t.pinned===!0)-Number(e.pinned===!0)||(t.updatedAt??``).localeCompare(e.updatedAt??``))}),m=X(!1),h=z(()=>p.value.filter(e=>e.parent).length),g=z(()=>c.value.trim().length>0),_=z(()=>m.value||g.value),v=z(()=>{let e=c.value.trim().toLocaleLowerCase();return e?p.value.filter(t=>t.title.toLocaleLowerCase().includes(e)):p.value}),y=z(()=>{let e=v.value.filter(e=>!e.parent);if(!_.value)return e.map(e=>({session:e,depth:0}));let t=new Map;for(let e of v.value)e.parent&&t.set(e.parent,[...t.get(e.parent)??[],e]);let n=[],r=new Set,i=(e,a)=>{if(!r.has(e.id)){r.add(e.id),n.push({session:e,depth:a});for(let n of t.get(e.id)??[])i(n,a+1)}};for(let t of e)i(t,0);for(let e of v.value)e.parent&&i(e,1);return n});function b(e){return e.parent?`${e.title} · ветка субагента${e.agent?` (${e.agent})`:``}`:e.title}let x;function S(e,t){x=t.currentTarget.closest(`.row`)??void 0,l.value=e.id,u.value=e.title,Ut(()=>o.island.value?.querySelector(`[aria-label="Название чата"]`)?.focus())}function C(e,t=!1){let r=x;x=void 0;let a=l.value;l.value=``;let o=u.value.trim();e&&a&&o&&o!==n.native.sessions.find(e=>e.id===a)?.title&&i(`change`,a,{title:o}),t&&Ut(()=>{s.value&&(r?.isConnected?r.querySelector(`.mini[aria-label="Переименовать чат"]`):f.value)?.focus()})}function w(e){d.value===e.id?(d.value=``,e.native?i(`remove`,e.id):e.chat&&i(`remove`,{chat:e.chat}),Ut(()=>{s.value&&!o.island.value?.contains(document.activeElement)&&o.island.value?.querySelector(`input[type=search], button.item`)?.focus()})):d.value=e.id}function T(e){o.close(),e.chat?i(`openRecent`,e.chat,e.title):i(`pick`,e.id)}R(s,e=>{e?(c.value=``,i(`open`)):(l.value=``,d.value=``,x=void 0)}),R(()=>n.native.loading,async e=>{!e&&s.value&&(await Ut(),s.value&&!o.island.value?.contains(document.activeElement)&&o.island.value?.querySelector(`input[type=search], button.item`)?.focus())});let ee=new Intl.RelativeTimeFormat(`ru`,{numeric:`auto`});function E(e){let t=e?Date.parse(e):NaN;if(Number.isNaN(t))return``;let n=Math.round((t-Date.now())/6e4);if(Math.abs(n)<60)return ee.format(n,`minute`);let r=Math.round(n/60);return Math.abs(r)<48?ee.format(r,`hour`):ee.format(Math.round(r/24),`day`)}return(t,n)=>(V(),q(`div`,{ref:H(o).trigger,class:`agent-sessions`},[I(Q,{shape:`icon`,size:`sm`,title:`История`,"aria-label":`История`,"aria-expanded":H(s),disabled:e.disabled,onClick:n[0]||=e=>H(o).toggle()},{default:F(()=>[I(H(FM),{"aria-hidden":`true`})]),_:1},8,[`aria-expanded`,`disabled`]),I(kl,{menu:H(o),label:`История`,width:320},{default:F(()=>[p.value.length>4?(V(),Y(a,{key:0,ref_key:`searchInput`,ref:f,modelValue:c.value,"onUpdate:modelValue":n[1]||=e=>c.value=e,class:`search`,type:`search`,placeholder:`Найти чат`,"aria-label":`Найти чат`},null,8,[`modelValue`])):B(``,!0),e.native.loading&&!p.value.length?(V(),q(`p`,zM,`Загружаю…`)):e.native.error?(V(),q(`p`,BM,j(e.native.error),1)):!p.value.length&&!e.recent.loading?(V(),q(`p`,VM,`В истории пока пусто`)):!v.value.length&&!e.recent.loading?(V(),q(`p`,HM,`Ничего не найдено`)):!y.value.length&&!e.recent.loading&&h.value&&!_.value?(V(),q(`p`,UM,` Основных чатов нет — только ветки субагентов `)):B(``,!0),(V(!0),q(W,null,J(y.value,t=>(V(),Y(r,{key:t.session.id,class:`row`,gap:.5,justify:`normal`},{default:F(()=>[l.value===t.session.id?(V(),Y(a,{key:0,modelValue:u.value,"onUpdate:modelValue":n[2]||=e=>u.value=e,class:`rename`,"aria-label":`Название чата`,onKeydown:[n[3]||=yn(Z(e=>C(!0,!0),[`prevent`]),[`enter`]),n[4]||=yn(Z(e=>C(!1,!0),[`stop`,`prevent`]),[`esc`])],onBlur:n[5]||=e=>C(!0)},null,8,[`modelValue`])):(V(),q(`button`,{key:1,type:`button`,role:`menuitem`,class:O([`item`,{active:t.session.id===e.active,branch:t.depth>0}]),style:k(t.depth?{paddingLeft:`${10+t.depth*14}px`}:void 0),title:b(t.session),onClick:e=>T(t.session)},[t.session.parent?(V(),Y(H(_A),{key:0,class:`branch-mark`,"aria-hidden":`true`})):B(``,!0),t.session.pinned?(V(),Y(H(RM),{key:1,class:`pinned`,"aria-hidden":`true`})):B(``,!0),K(`span`,GM,j(t.session.title),1),t.session.agent?(V(),q(`span`,KM,j(t.session.agent),1)):B(``,!0),K(`span`,qM,j(E(t.session.updatedAt)),1)],14,WM)),l.value!==t.session.id&&(t.session.native?e.editable||e.deletable:t.session.chat)?(V(),Y(r,{key:2,as:`span`,class:`row-actions`,gap:.5,align:`normal`,justify:`normal`},{default:F(()=>[e.editable&&t.session.native?(V(),q(`button`,{key:0,type:`button`,class:`mini`,title:t.session.pinned?`Открепить`:`Закрепить сверху`,"aria-label":t.session.pinned?`Открепить чат`:`Закрепить чат`,onClick:e=>i(`change`,t.session.id,{pinned:!t.session.pinned})},[I(H(RM),{"aria-hidden":`true`})],8,JM)):B(``,!0),e.editable&&t.session.native?(V(),q(`button`,{key:1,type:`button`,class:`mini`,title:`Переименовать`,"aria-label":`Переименовать чат`,onClick:e=>S(t.session,e)},[I(H(ld),{"aria-hidden":`true`})],8,YM)):B(``,!0),!t.session.native||e.deletable?(V(),q(`button`,{key:2,type:`button`,class:O([`mini`,{danger:d.value===t.session.id}]),title:d.value===t.session.id?`Нажмите ещё раз, чтобы удалить навсегда`:`Удалить`,"aria-label":d.value===t.session.id?`Подтвердить удаление`:`Удалить чат`,onClick:e=>w(t.session),onBlur:n[6]||=e=>d.value=``},[I(H(zf),{"aria-hidden":`true`})],42,XM)):B(``,!0)]),_:2},1024)):B(``,!0)]),_:2},1024))),128)),h.value?(V(),q(`button`,{key:6,type:`button`,class:`toggle`,"aria-expanded":_.value,disabled:g.value,title:g.value?`Ветки субагентов видны при поиске`:_.value?`Свернуть ветки субагентов`:`Развернуть ветки субагентов`,onClick:n[7]||=e=>m.value=!m.value},[I(H(_A),{"aria-hidden":`true`}),g.value?(V(),q(`span`,QM,`Ветки субагентов · `+j(h.value),1)):_.value?(V(),q(`span`,$M,`Скрыть ветки субагентов`)):(V(),q(`span`,eN,`Показать ветки субагентов · `+j(h.value),1))],8,ZM)):B(``,!0),e.recent.loading&&!p.value.length&&!e.native.loading?(V(),q(`p`,tN,` Загружаю историю… `)):e.recent.error?(V(),q(`p`,nN,j(e.recent.error),1)):B(``,!0)]),_:1},8,[`menu`])],512))}}),[[`__scopeId`,`data-v-21c1eb4a`]]),iN={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function aN(e,t){return V(),q(`svg`,iN,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`12`,cy:`12`,r:`1`}),K(`circle`,{cx:`19`,cy:`12`,r:`1`}),K(`circle`,{cx:`5`,cy:`12`,r:`1`})],-1)]])}var oN=U({name:`lucide-ellipsis`,render:aN}),sN={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function cN(e,t){return V(),q(`svg`,sN,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M12 3v18m7-13l3 8a5 5 0 0 1-6 0zV7`}),K(`path`,{d:`M3 7h1a17 17 0 0 0 8-2a17 17 0 0 0 8 2h1M5 8l3 8a5 5 0 0 1-6 0zV7m2 14h10`})],-1)]])}var lN=U({name:`lucide-scale`,render:cN}),uN={key:0,class:`dot`,"aria-hidden":`true`},dN={key:0,class:`dot`,"aria-hidden":`true`},fN=[`aria-pressed`],pN=[`aria-pressed`],mN=[`aria-pressed`],hN=G(M({__name:`AgentChatMenu`,props:{lens:{type:Boolean},side:{type:Boolean},canDownload:{type:Boolean},canIsolate:{type:Boolean},isolate:{type:Boolean},featuresChanged:{type:Boolean},judgeChanged:{type:Boolean}},emits:[`lens`,`side`,`features`,`judge`,`download`,`isolate`],setup(e,{expose:t,emit:n}){let r=n,i=mu({anchor:`right`,initialFocus:`button.item`,items:`button.item`,returnFocus:`button`});t({anchor:()=>i.trigger.value});function a(e){switch(i.close(),e){case`lens`:r(`lens`);break;case`side`:r(`side`);break;case`features`:r(`features`);break;case`judge`:r(`judge`);break;case`download`:r(`download`);break;case`isolate`:r(`isolate`)}}return(t,n)=>(V(),q(`div`,{ref:H(i).trigger,class:`chat-menu`},[I(Q,{shape:`icon`,size:`sm`,title:`Ещё`,"aria-label":`Ещё`,active:e.lens||e.side||e.isolate||e.featuresChanged||e.judgeChanged,"aria-expanded":H(i).open.value,onClick:n[0]||=e=>H(i).toggle()},{default:F(()=>[I(H(oN),{"aria-hidden":`true`})]),_:1},8,[`active`,`aria-expanded`]),I(kl,{menu:H(i),label:`Действия чата`,width:300},{default:F(()=>[I(Gd,null,{default:F(()=>[...n[7]||=[N(`Чат`,-1)]]),_:1}),K(`button`,{type:`button`,class:`item`,onClick:n[1]||=e=>a(`features`)},[I(H(G_),{"aria-hidden":`true`}),n[8]||=K(`span`,{class:`text`},[K(`span`,{class:`title`},`Возможности агента`),K(`span`,{class:`hint`},`Виджеты и команды IDE в этом чате`)],-1),e.featuresChanged?(V(),q(`span`,uN)):B(``,!0)]),K(`button`,{type:`button`,class:`item`,onClick:n[2]||=e=>a(`judge`)},[I(H(lN),{"aria-hidden":`true`}),n[9]||=K(`span`,{class:`text`},[K(`span`,{class:`title`},`Судья`),K(`span`,{class:`hint`},`Риск действия и автоматическое разрешение`)],-1),e.judgeChanged?(V(),q(`span`,dN)):B(``,!0)]),K(`button`,{type:`button`,class:`item`,"aria-pressed":e.lens,onClick:n[3]||=e=>a(`lens`)},[I(H(nE),{"aria-hidden":`true`}),n[10]||=K(`span`,{class:`text`},[K(`span`,{class:`title`},`Lens`),K(`span`,{class:`hint`},`Чем агент занят сейчас`)],-1),e.lens?(V(),Y(H(C_),{key:0,class:`state`,"aria-hidden":`true`})):B(``,!0)],8,fN),K(`button`,{type:`button`,class:`item`,"aria-pressed":e.side,onClick:n[4]||=e=>a(`side`)},[I(H(GE),{"aria-hidden":`true`}),n[11]||=K(`span`,{class:`text`},[K(`span`,{class:`title`},`Вопрос в сторону`),K(`span`,{class:`hint`},`Не прерывает агента и не попадает в чат`)],-1),e.side?(V(),Y(H(C_),{key:0,class:`state`,"aria-hidden":`true`})):B(``,!0)],8,pN),e.canDownload?(V(),q(`button`,{key:0,type:`button`,class:`item`,onClick:n[5]||=e=>a(`download`)},[I(H(lf),{"aria-hidden":`true`}),n[12]||=K(`span`,{class:`text`},[K(`span`,{class:`title`},`Скачать в Markdown`),K(`span`,{class:`hint`},`Вся переписка одним файлом`)],-1)])):B(``,!0),e.canIsolate?(V(),q(`button`,{key:1,type:`button`,class:`item`,"aria-pressed":e.isolate,onClick:n[6]||=e=>a(`isolate`)},[I(H(_A),{"aria-hidden":`true`}),n[13]||=K(`span`,{class:`text`},[K(`span`,{class:`title`},`Изолированная копия`),K(`span`,{class:`hint`},`git worktree: файлы не меняются до слияния`)],-1),e.isolate?(V(),Y(H(C_),{key:0,class:`state`,"aria-hidden":`true`})):B(``,!0)],8,mN)):B(``,!0)]),_:1},8,[`menu`])],512))}}),[[`__scopeId`,`data-v-1b7969fa`]]);function gN(e,t){e.type===`image`?t.openImage(C(`/api/agent/attachments/${encodeURIComponent(e.id)}`),e.name):e.type===`file`&&t.openFile(e.path,e.directory===!0,e.range).catch(e=>t.fail(e instanceof Error?e.message:`Не удалось открыть файл`))}function _N(e,t,n){let r=X();return{open:i=>gN(i,{openFile:(n,r,i)=>t.executeCommand(`ide.editor.path.open`,{path:n,directory:r,...r||!zy(n)?{}:{external:!0},...i?{line:i.from,endLine:i.to}:{}},{scope:`editor:${e}`}),openImage:(e,t)=>r.value={src:e,alt:t},fail:n}),image:r}}function vN(e,t){let n=[`# ${t}`];for(let r of e){if(r.role===`user`){n.push(`## Вы\n\n${r.text.trim()}`);continue}let e=new Map(r.tools.map(e=>[e.id,e])),i=[];for(let t of r.parts??SS(r)){if(t.type===`text`){t.text.trim()&&i.push(t.text.trim());continue}if(t.type===`thought`)continue;if(t.type===`note`){i.push(`**Вы добавили:** ${t.text.trim()}`);continue}if(t.type===`judge`){i.push(`> Судья: риск ${t.verdict.score}/5 · ${t.verdict.label} — ${t.verdict.reason}`);continue}let n=e.get(t.id);if(!n)continue;let r=n.input??``,a=fx(n.name,r)?``:rx(r);i.push(`> ${px(n.name,r)}${a?`: \`${a.replace(/`/g,`'`)}\``:``}`)}n.push(`## ${t.split(` · `)[0]||`Агент`}\n\n${i.join(`
|
|
91
|
+
|
|
92
|
+
`)}`)}return`${n.join(`
|
|
93
|
+
|
|
94
|
+
`)}\n`}function yN(e,t,n){let r=URL.createObjectURL(new Blob([vN(e,t)],{type:`text/markdown;charset=utf-8`}));Object.assign(document.createElement(`a`),{href:r,download:n}).click(),setTimeout(()=>URL.revokeObjectURL(r),1e3)}function bN(e,t){return vN(e,`${t} · ${new Date().toLocaleString(`ru`)}`)}function xN(e,t,n){yN(e,`${t} · ${new Date().toLocaleString(`ru`)}`,`${n}-chat.md`)}async function SN(e){try{return await navigator.clipboard.writeText(e),!0}catch{return!1}}function CN(e,t){let n=e.findIndex(e=>e.id===t);return e.slice(0,n+1).findLast(e=>e.role===`user`)?.id??``}var wN={class:`secret-value`},TN={class:`actions`},EN=G(M({__name:`UiSecretValue`,props:{value:{},label:{},hideAfter:{default:30}},setup(e){let t=e,n=X(!1),r=X(!1),i,o,s=z(()=>`•`.repeat(Math.min(Math.max(t.value.length,12),48))),c=z(()=>Math.min(Math.max(t.value.split(`
|
|
95
|
+
`).length,1),8));function l(){i!==void 0&&clearTimeout(i),i=void 0}function u(){l(),n.value=!1}function d(){if(n.value)return u();n.value=!0,l(),t.hideAfter>0&&(i=setTimeout(u,t.hideAfter*1e3))}async function f(){try{await navigator.clipboard.writeText(t.value),r.value=!0,o!==void 0&&clearTimeout(o),o=setTimeout(()=>r.value=!1,2e3)}catch{r.value=!1}}return R(()=>t.value,()=>{u(),r.value=!1}),lt(()=>{l(),o!==void 0&&clearTimeout(o)}),(t,i)=>(V(),q(`div`,wN,[I(a,{class:`control`,as:`textarea`,readonly:``,rows:c.value,value:n.value?e.value:s.value,"aria-label":e.label||`Секрет`,autocomplete:`off`,autocapitalize:`off`,autocorrect:`off`,spellcheck:`false`,"data-1p-ignore":``,"data-lpignore":`true`},null,8,[`rows`,`value`,`aria-label`]),K(`div`,TN,[I(Q,{size:`sm`,"aria-label":n.value?`Скрыть секрет`:`Показать секрет`,onClick:d},{default:F(()=>[N(j(n.value?`Скрыть`:`Показать`),1)]),_:1},8,[`aria-label`]),I(Q,{size:`sm`,"aria-label":`Скопировать секрет`,onClick:f},{default:F(()=>[N(j(r.value?`Скопировано`:`Копировать`),1)]),_:1})])]))}}),[[`__scopeId`,`data-v-f36ebee9`]]),DN={key:0,class:`secret-shows`,role:`region`,"aria-live":`polite`,"aria-label":`Секреты от агента`},ON={class:`title`},kN={key:0,class:`comment`},AN=G(M({__name:`AgentSecretShow`,props:{items:{}},emits:[`dismiss`],setup(e,{emit:t}){let n=t;return(t,i)=>e.items.length?(V(),q(`div`,DN,[(V(!0),q(W,null,J(e.items,e=>(V(),Y(l,{key:e.id,as:`section`,tone:`warning`,density:`notice`,class:`secret-show`},{default:F(()=>[I(r,{as:`header`,align:`center`,justify:`between`},{default:F(()=>[I(r,{align:`center`,justify:`normal`,class:`heading`},{default:F(()=>[I(H(Xj),{"aria-hidden":`true`}),K(`span`,ON,j(e.label||`Секрет от агента`),1)]),_:2},1024),I(Q,{shape:`icon`,size:`sm`,"aria-label":`Закрыть`,title:`Закрыть`,onClick:t=>n(`dismiss`,e.id)},{default:F(()=>[I(H(oi),{"aria-hidden":`true`})]),_:1},8,[`onClick`])]),_:2},1024),e.comment?(V(),q(`p`,kN,j(e.comment),1)):B(``,!0),I(EN,{value:e.secret,label:e.label||`Секрет`},null,8,[`value`,`label`]),i[0]||=K(`p`,{class:`note`},`Панель видна только в этом окне; агент секрет не получает.`,-1)]),_:2},1024))),128))])):B(``,!0)}}),[[`__scopeId`,`data-v-aabc9dbe`]]),jN=32768,MN=3e5;function NN(e,t){let n=X([]),r=new Map;function i(e){let t=r.get(e);t!==void 0&&clearTimeout(t),r.delete(e),n.value=n.value.filter(t=>t.id!==e)}function a(a){let o=typeof a.projectId==`string`?a.projectId:``;if(o&&o!==e||!t())return;let s=typeof a.secret==`string`?a.secret:``;if(!s||s.length>jN)return;let c=typeof a.id==`string`&&a.id?a.id:globalThis.crypto?.randomUUID?.()||String(Date.now()),l=typeof a.label==`string`?a.label.slice(0,200):``,u=typeof a.comment==`string`?a.comment.slice(0,1e3):``;r.has(c)&&i(c),n.value.push({id:c,secret:s,label:l,comment:u}),r.set(c,setTimeout(()=>i(c),MN))}let o=e=>{let t=e.detail;t&&typeof t==`object`&&a(t)};return Lt(()=>window.addEventListener(`projector:secret-show`,o)),lt(()=>{window.removeEventListener(`projector:secret-show`,o);for(let e of r.values())clearTimeout(e);r.clear()}),{shows:n,dismiss:i}}var PN=72;function FN(e){let t=X(!1),n=0,r=0,i=0,a,o;function s(){let t=e.log.value;t&&(n=t.scrollTop,r=t.scrollHeight)}function c(){let i=e.log.value;if(!i||!i.clientHeight)return;let a=i.scrollTop,o=i.scrollHeight<r;r=i.scrollHeight,i.scrollHeight-a-i.clientHeight<=PN?t.value=!1:a<n&&!o&&(t.value=!0),n=a,a<e.preloadPx&&e.topUp()}function l(){i||=requestAnimationFrame(()=>{i=0;let a=e.log.value;a&&!t.value&&(a.scrollTop=e.turns.value.length?a.scrollHeight:0,n=a.scrollTop,r=a.scrollHeight)})}async function u(){t.value=!1,await Ut(),l()}function d(){let t=e.log.value?.firstElementChild;a&&t&&t!==o&&(o&&a.unobserve(o),a.observe(t),o=t)}return R(e.watchSource,async()=>{l(),await Ut(),d(),e.topUp(!0)},{deep:!0}),Lt(()=>{a=new ResizeObserver(()=>{l(),e.onShown?.()}),e.log.value&&a.observe(e.log.value),d()}),lt(()=>{a?.disconnect(),cancelAnimationFrame(i)}),{away:t,trackScroll:c,pin:l,toBottom:u,rememberScroll:s,observeContent:d}}var IN=5,LN=400;function RN(e,t,n,r){let i=X(IN),a=z(()=>e.value.filter(e=>e.role===`user`).length),o=z(()=>{let t=0;for(let n=e.value.length-1;n>=0;n--)if(e.value[n].role===`user`&&++t===i.value)return n;return 0}),s=z(()=>o.value?e.value.slice(o.value):e.value),c=z(()=>e.value.slice(0,o.value).filter(e=>e.role===`user`).length);R(()=>e.value[0]?.id,()=>{i.value=IN}),R(a,(e,t)=>{e===t+1&&(i.value+=1)});let l=!1;async function u(){let e=t.value;if(!e||!c.value||l||r.value)return!1;l=!0;try{let t=e.scrollHeight,r=e.scrollTop;return i.value+=IN,await Ut(),e.scrollTop=r+e.scrollHeight-t,n(),!0}finally{l=!1}}async function d(e=!1){let n=t.value,r=()=>!!n&&(e?n.scrollHeight-n.clientHeight:n.scrollTop)<LN;for(;n&&c.value&&n.clientHeight&&r();)if(!await u())return}return R(r,async e=>{e||(await Ut(),d(!0))}),{PRELOAD_PX:LN,firstShown:o,shown:s,hidden:c,loadEarlier:u,topUp:d}}var zN=5e3,BN=6;function VN(e){let t=X(new Map),n,r=0,i=0;function a(n){return e.known?.().find(e=>e.id===n)?.title.trim()||t.value.get(n)?.trim()||``}async function o(s=!1){clearTimeout(n),n=void 0;let c=e.projectId(),l=e.session(),u=++i;if(!c||!l||a(l))return;let d=await kC(e.backend(),c,s);u===i&&(t.value=d.titles,!a(l)&&e.running()&&r<BN&&(r++,n=setTimeout(()=>void o(!0),zN)))}return R([()=>e.projectId(),()=>e.backend(),()=>e.session(),()=>e.running(),()=>e.known?.()],()=>{r=0,o()},{immediate:!0}),Gt()&&zt(()=>{i++,clearTimeout(n)}),z(()=>{let t=e.session();return Yy(t?a(t):``,e.firstMessage(),e.fallback())})}function HN(e,t,n,r,i,a){let o=VN({projectId:()=>t.projectId,backend:()=>t.backend??`projector`,session:()=>n.value.findLast(e=>e.role===`assistant`)?.session?.id,firstMessage:()=>n.value.find(e=>e.role===`user`&&!e.auto)?.text??``,fallback:()=>a.value,running:()=>r.value,known:()=>i.value});R(o,t=>e(`title`,t),{immediate:!0})}var UN=(e,t)=>e.tokens===t.tokens&&e.cost===t.cost&&e.priced===t.priced;function WN(e,t){let n=new Map,r={tokens:0,cost:0,priced:!1};for(let i of e){let e=i.usage;if(!e)continue;r.tokens+=e.input+e.cacheRead+e.cacheWrite+e.output,e.cost!==void 0&&(r.cost+=e.cost,r.priced=!0);let a=t?.get(i.id);n.set(i.id,a&&UN(a,r)?a:{...r})}return n}var GN={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function KN(e,t){return V(),q(`svg`,GN,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 5v14m7-7l-7 7l-7-7`},null,-1)]])}var qN=U({name:`lucide-arrow-down`,render:KN}),JN={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function YN(e,t){return V(),q(`svg`,JN,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7`}),K(`path`,{d:`M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z`})],-1)]])}var XN=U({name:`lucide-square-pen`,render:YN}),ZN={key:0,class:`chat-drop-hint`,"aria-hidden":`true`},QN={key:0,class:`chat-loading`,role:`status`},$N={key:2,class:`conversation`,role:`log`,"aria-label":`Сообщения`,"aria-live":`polite`,"aria-relevant":`additions text`},eP={class:`dock`},tP={key:0,class:`edit-hint`,role:`status`},nP={key:2,class:`requests`},rP=G(M({__name:`AgentChat`,props:{projectId:{},backend:{default:`projector`},chatId:{default:void 0},role:{default:void 0}},emits:[`title`],setup(e,{emit:t}){let n=e,i=z(()=>!cS(n.backend)),a=z(()=>lS(n.backend)),{api:o}=Iu(),s=X(),c=X(),l=X(),{key:u,turns:d,persist:f,loading:p,draft:m,draftParts:h,busy:g,error:_,phase:v,lastEventAt:y,permissions:b,questions:x,secrets:S,controls:C,selection:w,roleSnapshot:T,capabilities:ee,sessions:E,sessionsLoading:te,sessionsError:D,recent:ne,recentLoading:re,recentError:ie,loadControls:k,loadCommands:A,commands:ae,setControl:oe,loadSessions:se,loadRecent:M,changeSession:ce,resumeSession:le,removeSession:ue,send:de,queue:fe,sendQueuedNow:pe,injectQueued:me,removeQueued:he,edit:ge,cancelEdit:_e,editing:ve,retry:ye,showVersion:P,canRewindFiles:be,rewindFiles:xe,isolate:Se,featureOverrides:Ce,setFeatureOverrides:we,judgeOverride:Te,setJudgeOverride:Ee,worktreeId:De,worktreeInfo:Oe,mergeCopy:ke,discardCopy:Ae,clear:je,stop:Me,attach:Ne,release:Pe,decide:Fe,answer:Ie,answerSecret:Le}=IS(n.projectId,i.value?void 0:vu(o,n.projectId),{backend:n.backend,chatId:n.chatId,role:n.role}),Re=t,{shows:ze,dismiss:Be}=NN(n.projectId,()=>Vx(n.projectId)[0]?.key===u);HN(Re,n,d,g,E,a);let Ve=UC({projectId:n.projectId,chat:u,enabled:()=>!i.value,send:(e,t)=>de(e,void 0,t),permissions:b,questions:x,secrets:S});Lt(()=>{k(),A()});let He,Ue=z(()=>He=WN(d.value,He)),We=z(()=>d.value.findLast(e=>e.context)?.context),L=Hk({chat:u,projectId:n.projectId,backend:n.backend,turns:d,busy:g,phase:v,lastEventAt:y,permissions:b,questions:x,secrets:S,queue:fe,selection:w,commands:vu(o,n.projectId)}),Ke=z(()=>[{name:`btw`,description:`Вопрос в сторону, не прерывая агента`},...ae.value]),{fork:qe,forkMessage:Je,recentChats:R,openRecent:Ye}=oC({backend:n.backend,projectId:n.projectId,key:u,turns:()=>d.value,capabilities:()=>ee.value,recent:()=>ne.value,role:()=>T.value,api:o,fail:e=>{_.value=e}});function Xe(e){nC(o,n.projectId,e,e=>{_.value=e})}Ne();let{tasks:Ze,viewing:Qe,viewed:$e,view:tt,open:nt}=Uw({turns:d,openTab:(e,t)=>{o.executeCommand(`ide.workbench.agent.task.open`,{chat:u,task:e?.id??t,title:e?.title},{scope:`editor:${n.projectId}`}).catch(e=>{_.value=e instanceof Error?e.message:`Не удалось открыть задачу`})}});sC({backend:n.backend,agent:a.value,busy:g,phase:v,error:_,controls:C,turns:d});let rt=X(),it=X(),at=X(),st=rC(()=>at.value),ct=X(),ut=z(()=>ct.value?.element),dt=()=>{},{PRELOAD_PX:ft,firstShown:pt,shown:mt,hidden:ht,loadEarlier:_t,topUp:vt}=RN(d,rt,()=>dt(),p),yt=!1,{away:bt,trackScroll:xt,toBottom:St,rememberScroll:Ct}=FN({turns:d,log:rt,topUp:vt,preloadPx:ft,watchSource:()=>[d.value.length,d.value.at(-1)?.text,b.value.length,x.value.length,S.value.length,d.value.at(-1)?.tools.map(e=>`${e.id}:${e.status}:${e.detail}`).join(`|`)],onShown:()=>{let e=!!ut.value&&ut.value.getClientRects().length>0;e&&!yt&&at.value?.focus(),yt=e}});dt=Ct;let wt=X(``);Vn(n.projectId,`root`).then(e=>{wt.value=e.root}).catch(()=>{});let{mcp:Tt,load:Et}=Rk(()=>n.backend,n.projectId),Dt=()=>i.value?Et():Promise.resolve(),{copy:Ot,copyInfo:kt,copyWorking:At,copyNote:jt,endCopy:Mt}=Uk(d,g,{worktreeInfo:Oe,mergeCopy:ke,discardCopy:Ae}),Nt=z(()=>ve.value?d.value.findIndex(e=>e.id===ve.value):-1),{pendingForm:Pt,answerFormFor:Ft,submitComposerForm:It,submitTurnForm:Rt}=DA({turns:d,busy:g,draft:m,draftParts:h,selection:w,send:de,edit:ge,projectId:n.projectId});jA({turns:d,busy:g,selection:w,persist:f,projectId:n.projectId});let zt=z(()=>Hb(d.value,n.backend)),Bt=z(()=>We.value?We.value.used/Math.max(1,We.value.size):0),Vt=zw({turns:d,busy:g,phase:v,queue:fe,plan:zt,selection:w}),{rewinding:Ht,rewindPreview:Wt,rewindPreviewError:Gt,rewindResult:Kt,rewindWorking:qt,askRewind:U,previewRewind:Jt,rewindTo:Yt,confirmRewind:Xt,closeRewind:Zt}=zk({rewindFiles:xe,edit:ge,focus:()=>at.value?.focus()}),Qt=e=>CN(d.value,e),$t=e=>be(Qt(e));async function en(e){ge(e),await Ut(),at.value?.focus()}async function tn(e){St(),await ye(e)}async function G(){await Promise.all([se(),M()])}let{compact:nn}=xA({busy:g,capabilities:ee,contextShare:Bt,queue:fe,turns:d,error:_,send:de,toBottom:St}),rn={key:u,projectId:n.projectId,backend:n.backend,label:a.value,busy:()=>g.value,visible:()=>!!ut.value&&ut.value.getClientRects().length>0,turns:()=>d.value,tasks:()=>Ub(d.value),queue:()=>fe.value,controls:()=>C.value,selection:()=>w.value,capabilities:()=>ee.value,setControl:oe,loadSessions:se,resumeSession:le,removeSession:ue,toggleControlsMenu:()=>it.value?.toggle(),send:e=>de(e),attach:async e=>at.value?.attach(e),appendText:async e=>at.value?.appendText(e),pendingForm:()=>Pt.value,showForm:()=>at.value?.showForm(),hideForm:()=>at.value?.hideForm(),inject:async e=>{await de(e);let t=fe.value.findLast(t=>t.text===e.trim());return t?me(t.id):!1},stop:Me,edit:ge,retry:ye,fork:qe,rewind:async(e,t)=>await Yt(e,t)??{ok:!0,files:[]},showVersion:P,removeQueued:he,exportMarkdown:()=>bN(d.value,a.value),compact:nn,status:()=>L.status(),openSide:()=>L.openPanel(),askSide:e=>L.ask(e),clearSide:()=>L.clear(),...Bw(Vt),mcpServers:()=>py(n.backend,n.projectId),worktree:async()=>De()?Oe():void 0,mergeWorktree:ke,discardWorktree:Ae,setIsolate:e=>{Se.value=e}};lt(Jee(rn));let{open:an,image:on}=_N(n.projectId,o,e=>{_.value=e}),sn=X(``),cn=X(``);function ln(){_.value=``,cn.value=``}let{retryableError:un,retryFailed:dn}=SA(d,g,_,cn,tn),fn;ot(Fm,e=>{St(),de(e)}),Lx(n.projectId,o);let{submit:pn,continueTurn:mn,suggest:hn,newChat:gn}=CA({draft:m,draftParts:h,send:de,side:L,clear:je,toBottom:St,resetAway:()=>{bt.value=!1},focus:()=>at.value?.focus()});async function _n(e,t){await SN(t)?(sn.value=e,cn.value=``,clearTimeout(fn),fn=setTimeout(()=>{sn.value=``},2e3)):cn.value=`Не удалось скопировать ответ`}return lt(()=>{Pe(),clearTimeout(fn)}),(t,n)=>(V(),Y(Wr,{ref_key:`panel`,ref:ct,class:`agent-chat`,"aria-label":`Чат с агентом`,onFocusin:n[23]||=e=>H(Bx)(rn),onPointerdownCapture:n[24]||=e=>H(Bx)(rn),onDragenter:H(st).dragenter,onDragover:H(st).dragover,onDragleave:H(st).dragleave,onDrop:H(st).drop},{default:F(()=>[H(st).over.value?(V(),q(`div`,ZN,` Бросьте файлы или папки — добавим в сообщение `)):B(``,!0),I(r,{class:`chat-tools`,gap:1,align:`normal`,justify:`end`},{default:F(()=>[H(T)?(V(),Y(hl,{key:0,tone:`info`,class:`role-badge`,title:`Роль: ${H(T).name}`},{default:F(()=>[N(j(H(T).name),1)]),_:1},8,[`title`])):B(``,!0),I(rN,{native:{sessions:H(E),loading:H(te),error:H(D)},disabled:H(g),active:H(d).findLast(e=>e.role===`assistant`)?.session?.id,editable:!i.value||H(ee).editSessions,deletable:!i.value||H(ee).deleteSessions,recent:{items:H(R),loading:H(re),error:H(ie)},onOpen:G,onChange:H(ce),onRemove:n[0]||=e=>void H(ue)(e).catch(()=>{}),onPick:n[1]||=e=>void H(le)(e).catch(()=>{}),onOpenRecent:H(Ye)},null,8,[`native`,`disabled`,`active`,`editable`,`deletable`,`recent`,`onChange`,`onOpenRecent`]),H(d).length?(V(),Y(Q,{key:1,shape:`icon`,size:`sm`,title:`Новый чат`,"aria-label":`Новый чат`,disabled:H(g),onClick:H(gn)},{default:F(()=>[I(H(XN),{"aria-hidden":`true`})]),_:1},8,[`disabled`,`onClick`])):B(``,!0),I(hN,{ref_key:`chatMenu`,ref:s,lens:H(Vt).state.open,side:H(L).state.open,"can-download":H(d).length>0,"can-isolate":i.value&&!H(d).length,isolate:H(Se),"features-changed":H(Ce)!==void 0,"judge-changed":H(Te)!==void 0,onFeatures:n[2]||=e=>c.value?.openAt(s.value?.anchor()),onJudge:n[3]||=e=>l.value?.openAt(s.value?.anchor()),onLens:n[4]||=e=>H(Vt).toggle(),onSide:n[5]||=e=>H(L).toggle(),onDownload:n[6]||=t=>H(xN)(H(d),a.value,e.backend),onIsolate:n[7]||=e=>Se.value=!H(Se)},null,8,[`lens`,`side`,`can-download`,`can-isolate`,`isolate`,`features-changed`,`judge-changed`])]),_:1}),I(H(Q_),{ref_key:`featuresIsland`,ref:c,"show-trigger":!1,anchor:()=>s.value?.anchor(),backend:e.backend,chat:H(u),overrides:H(Ce),disabled:H(p),"onUpdate:overrides":H(we)},null,8,[`anchor`,`backend`,`chat`,`overrides`,`disabled`,`onUpdate:overrides`]),I(H(US),{ref_key:`judgeIsland`,ref:l,"show-trigger":!1,anchor:()=>s.value?.anchor(),chat:H(u),override:H(Te),disabled:H(p),"onUpdate:override":H(Ee)},null,8,[`anchor`,`chat`,`override`,`disabled`,`onUpdate:override`]),et(K(`div`,{ref_key:`log`,ref:rt,class:`chat-log`,onScrollPassive:n[11]||=(...e)=>H(xt)&&H(xt)(...e)},[H(p)?(V(),q(`div`,QN,[I(An),n[25]||=K(`span`,null,`Загружаю чат…`,-1)])):H(d).length?(V(),q(`div`,$N,[H(ht)?(V(),q(`button`,{key:0,type:`button`,class:`earlier`,onClick:n[8]||=(...e)=>H(_t)&&H(_t)(...e)},` Показать ранние запросы · скрыто `+j(H(ht)),1)):B(``,!0),(V(!0),q(W,null,J(H(mt),(e,t)=>(V(),Y(H(tO),{key:e.id,turn:e,"chat-usage":Ue.value.get(e.id),root:wt.value,"promoted-form":H(Ft)(e).promotedForm,lens:e.role===`assistant`&&e.id===H(d).at(-1)?.id?H(Vt):void 0,flags:{busy:H(g),last:H(pt)+t===H(d).length-1,copied:sn.value===e.id,faded:Nt.value>=0&&H(pt)+t>=Nt.value,canRevert:$t(e.id),formAnswered:H(Ft)(e).formAnswered,phase:e.role===`assistant`&&e.id===H(d).at(-1)?.id?H(v):void 0},onCopy:_n,onOpen:H(an),onEdit:en,onFormSubmit:H(Rt),onRewind:H(U),onRetry:tn,onFork:H(Je),onContinue:H(mn),onVersion:H(P),onOpenFile:n[9]||=e=>H(an)({type:`file`,path:e}),onRevert:n[10]||=e=>H(U)(Qt(e),`files`)},null,8,[`turn`,`chat-usage`,`root`,`promoted-form`,`lens`,`flags`,`onOpen`,`onFormSubmit`,`onRewind`,`onFork`,`onContinue`,`onVersion`]))),128))])):(V(),Y(RA,{key:1,plain:i.value,"agent-name":a.value,"role-name":H(T)?.name,onSuggest:H(hn),onOpen:Xe},null,8,[`plain`,`agent-name`,`role-name`,`onSuggest`]))],544),[[Ln,!H($e)]]),H($e)?(V(),Y(H(_O),{key:1,detail:H($e),"project-id":e.projectId,backend:e.backend,selection:H(w),embedded:``,onBack:n[12]||=e=>Qe.value=``,onTab:n[13]||=e=>H(nt)(H($e).task.id)},null,8,[`detail`,`project-id`,`backend`,`selection`])):B(``,!0),K(`div`,eP,[H(ve)?(V(),q(`p`,tP,[n[26]||=N(` Правка сообщения: новое заменит выделенное и всё после него, старый вариант останется версией. `,-1),K(`button`,{type:`button`,onClick:n[14]||=(...e)=>H(_e)&&H(_e)(...e)},`Отмена`)])):B(``,!0),H(bt)?(V(),q(`button`,{key:1,type:`button`,class:`latest-button`,onClick:n[15]||=(...e)=>H(St)&&H(St)(...e)},[I(H(qN),{"aria-hidden":`true`}),n[27]||=N(`К последнему сообщению `,-1)])):B(``,!0),H(Ve).hasRequests||H(ze).length?(V(),q(`div`,nP,[I(H(HE),{permissions:H(b),onDecide:H(Fe)},null,8,[`permissions`,`onDecide`]),I(H($E),{requests:H(x),onAnswer:H(Ie)},null,8,[`requests`,`onAnswer`]),I(uM,{requests:H(S),onAnswer:H(Le)},null,8,[`requests`,`onAnswer`]),I(H(AN),{items:H(ze),onDismiss:H(Be)},null,8,[`items`,`onDismiss`]),i.value?B(``,!0):(V(),Y(H(vk),{key:0,jobs:H(Ve).jobs,onAnswered:H(Ve).refresh},null,8,[`jobs`,`onAnswered`]))])):B(``,!0),H(Ht)?(V(),Y(H(Yk),{key:H(Ht).id,"can-files":H(be)(H(Ht).id),preview:H(Wt),"preview-error":H(Gt),working:H(qt),result:H(Kt),root:wt.value,initial:H(Ht).scope,onScope:H(Jt),onConfirm:H(Xt),onCancel:H(Zt)},null,8,[`can-files`,`preview`,`preview-error`,`working`,`result`,`root`,`initial`,`onScope`,`onConfirm`,`onCancel`])):B(``,!0),H(Ot)?(V(),Y(H(bA),{key:4,branch:H(Ot).branch,info:H(kt),working:H(At)||H(g),note:H(jt),onMerge:n[16]||=e=>H(Mt)(H(ke)),onDiscard:n[17]||=e=>H(Mt)(H(Ae))},null,8,[`branch`,`info`,`working`,`note`])):B(``,!0),H(L).state.open?(V(),Y(H(mA),{key:5,side:H(L)},null,8,[`side`])):B(``,!0),H(ee).compact&&Bt.value>=H(ee).compact.hintAt&&!H(g)?(V(),q(`p`,{key:6,class:O([`compact-hint`,{urgent:Bt.value>=H(ee).compact.autoAt}]),role:`status`},[Bt.value>=H(ee).compact.autoAt?(V(),q(W,{key:0},[N(`Контекст почти заполнен (`+j(Math.round(Bt.value*100))+`%): после этого ответа он сожмётся сам.`,1)],64)):(V(),q(W,{key:1},[N(`Контекст заполнен на `+j(Math.round(Bt.value*100))+`%.`,1)],64)),K(`button`,{type:`button`,onClick:n[18]||=(...e)=>H(nn)&&H(nn)(...e)},`Сжать сейчас`)],2)):B(``,!0),I(H(_k),{jobs:H(Ve).jobs,chat:H(u),tasks:H(Ze),plan:zt.value,queue:H(fe),busy:H(g),"can-inject":!!H(ee).inject,"viewing-task":H(Qe),"project-id":e.projectId,backend:e.backend,selection:H(w),onOpen:H(Ve).open,onView:H(tt),onTab:H(nt),onNow:H(pe),onInject:H(me),onRemove:H(he)},null,8,[`jobs`,`chat`,`tasks`,`plan`,`queue`,`busy`,`can-inject`,`viewing-task`,`project-id`,`backend`,`selection`,`onOpen`,`onView`,`onTab`,`onNow`,`onInject`,`onRemove`])]),et(I(H(Dj),{ref_key:`composer`,ref:at,modelValue:H(m),"onUpdate:modelValue":n[19]||=e=>gt(m)?m.value=e:null,parts:H(h),"onUpdate:parts":n[20]||=e=>gt(h)?h.value=e:null,"project-id":e.projectId,"quote-root":rt.value,commands:Ke.value,busy:H(g),"started-at":H(d).findLast(e=>e.role===`assistant`)?.at,error:H(_)||cn.value,copied:!!sn.value,form:H(Pt),editing:!!H(ve),retryable:H(un),onSubmit:H(pn),onFormSubmit:H(It),onOpen:H(an),onFail:n[21]||=e=>_.value=e,onDismiss:ln,onRetry:H(dn),onStop:H(Me)},Ge({_:2},[We.value?{name:`status`,fn:F(()=>[I(kM,{context:We.value},null,8,[`context`])]),key:`0`}:void 0,H(C).length?{name:`controls`,fn:F(()=>[I(H(qj),{ref_key:`controlsMenu`,ref:it,controls:H(C),disabled:H(g),mcp:H(Tt),onOpened:Dt,onChange:H(oe)},null,8,[`controls`,`disabled`,`mcp`,`onChange`])]),key:`1`}:void 0]),1032,[`modelValue`,`parts`,`project-id`,`quote-root`,`commands`,`busy`,`started-at`,`error`,`copied`,`form`,`editing`,`retryable`,`onSubmit`,`onFormSubmit`,`onOpen`,`onRetry`,`onStop`]),[[Ln,!H($e)]]),I(MM,{"project-id":e.projectId,scope:ut.value},null,8,[`project-id`,`scope`]),H(on)?(V(),Y(qr,{key:2,src:H(on).src,alt:H(on).alt,onClose:n[22]||=e=>on.value=void 0},null,8,[`src`,`alt`])):B(``,!0)]),_:1},8,[`onDragenter`,`onDragover`,`onDragleave`,`onDrop`]))}}),[[`__scopeId`,`data-v-f3828ae1`]]),iP=e=>`agent:${e}`,aP=e=>e.startsWith(`agent:`)?e.slice(6):void 0,oP=`Ключ чата из ide.agent.chats.list; без него — чат, с которым работали последним`;function sP(e,t){let n=e[t];if(typeof n!=`string`||!n)throw Error(`Укажите ${t}`);return n}function cP(e,t){let n=()=>Vx(t).length>0,r=e=>Hx(t,b(e).chat);e(`ide.agent.chats.recent`,`Недавние чаты проекта`,()=>Rv(t).then(e=>e.map(e=>({...e,open:ab(t,e.chat,e.title)??null}))),()=>!0,void 0,{description:`Возвращает чаты агентов проекта, сохранённые на диске, включая закрытые вкладки: ключ, агент, название, время и команда открытия (open: { command, args }; null — если вкладки у чата нет). Позволяет вернуться к ветке после закрытия её вкладки.`}),e(`ide.agent.chat.fork`,`Ответвить чат в новый`,async e=>{let t=b(e),n=r(e),i=sP(t,`turnId`),a=t.mode;if(a!==void 0&&a!==`before`&&a!==`after`)throw Error(`mode: before или after`);let o=n.turns().find(e=>e.id===i)?.role,s=a??(o===`assistant`?`after`:`before`);return n.fork(i,s)},n,void 0,{description:`Создаёт новую ветку разговора в отдельном чате, не меняя текущий. mode: before — копия разговора до сообщения пользователя, его текст остаётся в поле ввода новой ветки; after — копия включая ответ, ветка продолжает с этого места. Открывает вкладку ветки и возвращает её ключ. Файлы не откатываются, изолированная копия проекта у веток общая.`,arguments:{turnId:`Сообщение из ide.agent.turns.list`,mode:`before | after; по умолчанию before для вопроса и after для ответа`,chat:oP}})}var lP=()=>qn().filter(e=>!e.builtin),uP=()=>lP().map(e=>e.title).join(`, `),dP=()=>lP().map(e=>e.backend).join(`, `);function fP(e,t,n=Ve()?Iu().api:void 0){Ve()&&hte(t),e(`ide.agent.job.start`,`Запустить фонового агента`,async e=>{let n=b(e),r=typeof n.role==`string`?n.role.trim():``,i,a=n.isolate===!0;if(r){let e=(await tm(t)).find(e=>e.id===r);if(!e)throw Error(`Неизвестная chat-роль: ${r}`);if(i=sr(e.agent),!i||i.builtin)throw Error(`Роль «${e.name}» указывает на агента без фоновых заданий`);if(typeof n.agent==`string`&&n.agent.trim()){let t=sr(n.agent.toLowerCase())??lr(n.agent.toLowerCase());if(t&&t.backend!==e.agent)throw Error(`Роль «${e.name}» принадлежит агенту ${i.title}`)}a||=e.isolate===!0}else{let e=ZC(n,`agent`).toLowerCase();if(i=sr(e)??lr(e),!i||i.builtin)throw Error(`agent: ${dP()}`)}return QC(await wy({projectId:t,backend:i.backend,role:r||void 0,task:ZC(n,`task`),isolate:a,origin:Vx(t).find(e=>cS(e.backend))?.key}))},()=>!0,void 0,{description:`Запускает фонового агента (${uP()}) с заданием в проекте: сервер ведёт его сам, вкладка чата не нужна, прогресс виден в острове активности. Возвращает идентификатор задания. Вместо agent можно указать role — chat-роль из ide.agent.roles.chat.list: её агент, модель и режим станут снимком задания, а isolate роли включит копию. Запросы разрешений и вопросы агента приходят как состояние needs-user и ждут ответа (ide.agent.job.answer). С isolate: true агент работает в изолированной git-копии проекта (слияние только по просьбе пользователя). Код пишут фоновые агенты, не вы: поручайте им работу, потом проверяйте результат через ide.agent.job.result и git diff.`,arguments:{agent:`id агента: ${dP()}; необязателен, если указан role`,role:`id chat-роли из ide.agent.roles.chat.list (необязательно)`,task:`Полное задание агенту: цель, файлы, критерии готовности`,isolate:`true — работать в изолированной копии проекта (для независимых задач, которые идут параллельно)`}}),e(`ide.agent.jobs.list`,`Фоновые задания агентов`,async()=>(await Sy(t)).map(QC),()=>!0,void 0,{description:`Возвращает фоновые задания агентов этого проекта, новые первыми: идентификатор, агент, состояние (queued, running, needs-user, done, error, stopped), запросы, которые ждут ответа, изменённые файлы и начало итога.`}),e(`ide.agent.job.result`,`Результат фонового задания`,async e=>{let t=b(e),n=ZC(t,`job`),r=Math.min(Math.max(Number(t.wait)||0,0),45),i=await Cy(n);return r&&!yy(i.job.status)&&(i=await Cy(n,r,i.job.rev)),QC(i.job)},()=>!0,void 0,{description:`Возвращает состояние и итог фонового задания целиком, изменённые файлы, ошибку и запросы, которые ждут ответа. С wait (секунды, до 45) ждёт смены состояния, а не возвращается сразу. Результат агента сверяйте с git diff и ide.agent.job.diff, а не принимайте на веру.`,arguments:{job:XC,wait:`Сколько секунд ждать смены состояния, до 45 (необязательно)`}}),e(`ide.agent.job.diff`,`Изменения фонового задания`,async e=>{let t=b(e),n=ZC(t,`job`),r=Number(t.limit);return{job:n,...await Ey(n,Number.isFinite(r)?r:0)}},()=>!0,void 0,{description:`Возвращает, что задание изменило в своей папке: список файлов (включая новые), git --stat и unified patch. Для задания в изолированной копии diff берётся из копии. Patch ограничен (по умолчанию 60 000 символов, truncated: true — продолжение в ide.agent.job.open); limit можно увеличить. Это проверка результата, а не повод править файлы самому.`,arguments:{job:XC,limit:`Предел длины patch в символах (необязательно)`}}),e(`ide.agent.job.log`,`Вызовы инструментов фонового задания`,async e=>{let t=b(e),n=ZC(t,`job`),r=Math.min(Math.max(Math.trunc(Number(t.tail))||20,1),40),i=await Cy(n);return{job:n,status:i.job.status,...tw(i.journal,r),...nw(i.journal)}},()=>!0,void 0,{description:`Возвращает последние вызовы инструментов задания с их результатами: какие команды проверок запускались и что они ответили. Вывод и вход обрезаны до 1500 символов, cut: true — было больше. Нужен, чтобы судить о работе по фактам, а не по итоговому тексту агента.`,arguments:{job:XC,tail:`Сколько последних вызовов вернуть, до 40 (по умолчанию 20)`}}),e(`ide.agent.job.worktree`,`Копия фонового задания`,async e=>{let t=ZC(b(e),`job`);return{job:t,worktree:await Oy(t)}},()=>!0,void 0,{description:`Возвращает изолированную копию задания: ветку и число изменённых файлов; worktree: null — задание работает в папке проекта. Копия есть только у заданий с isolate: true.`,arguments:{job:XC}}),e(`ide.agent.job.merge`,`Влить копию задания в проект`,async e=>{let t=ZC(b(e),`job`),n=await ky(t);return{job:t,merged:n.merged,message:n.message}},()=>!0,void 0,{description:`Коммитит изменения задания в его изолированной копии и вливает ветку в проект (git merge), затем удаляет копию. Доступно только завершённому заданию. Меняет файлы и историю git: только по явной просьбе пользователя. При конфликте слияние отменяется, проект остаётся как был.`,arguments:{job:XC}}),e(`ide.agent.job.discard`,`Отбросить копию задания`,async e=>{let t=ZC(b(e),`job`);return await Ay(t),{job:t,discarded:!0}},()=>!0,void 0,{description:`Удаляет изолированную копию задания и всё, что агент в ней сделал. Необратимо: только по явной просьбе пользователя.`,arguments:{job:XC}}),e(`ide.agent.job.send`,`Уточнить идущее задание`,async e=>{let t=b(e),n=ZC(t,`job`),r=await My(n,ZC(t,`text`));if(!r.accepted)throw Error(`Этот агент не принимает уточнения на ходу`);return r.job?QC(r.job):{job:n,sent:!0}},()=>!0,void 0,{description:`Досылает уточнение заданию. Идущему — в текущий ход, если агент это умеет. Завершённому — новый ход в той же записи, копии и нативной сессии: то же задание продолжается, без создания нового. Для вопросов, которые ждут ответа, используйте ide.agent.job.answer.`,arguments:{job:XC,text:`Уточнение агенту: что поправить, добавить или проверить`}}),e(`ide.agent.job.retry`,`Повторить фоновое задание`,async e=>{let t=b(e),n=typeof t.task==`string`?t.task:void 0;return QC(await jy(ZC(t,`job`),n))},()=>!0,void 0,{description:`Повторяет завершившееся задание с той же формулировкой, папкой, изолированной копией и нативной сессией: новый ход в той же копии, без создания второй. С task — идёт дальше с новым заданием. Возвращает новое задание.`,arguments:{job:XC,task:`Новая формулировка вместо прежней (необязательно)`}}),e(`ide.agent.job.continue`,`Продолжить фоновое задание`,async e=>{let t=b(e),n=await My(ZC(t,`job`),ZC(t,`text`));if(!n.accepted||!n.job)throw Error(`Задание не удалось продолжить: возможно, оно ещё работает`);return QC(n.job)},()=>!0,void 0,{description:`Продолжает завершённое задание новым ходом в той же записи, копии и нативной сессии: исходная задача и результат остаются в контексте. Для идущего задания это то же, что ide.agent.job.send. Новую запись создаёт только ide.agent.job.retry.`,arguments:{job:XC,text:`Что сделать дальше`}}),e(`ide.agent.job.fork`,`Ответвить фоновое задание`,async e=>{let t=b(e),n=typeof t.task==`string`?t.task.trim():void 0;return QC(await Ny(ZC(t,`job`),n||void 0))},()=>!0,void 0,{description:`Создаёт новое задание в отдельной изолированной копии, которая начинается с текущего состояния копии исходного задания: незакоммиченная работа фиксируется на ветке исходной копии, исходное задание не меняется. Подходит, чтобы попробовать другой вариант, не мешая исходному. Работает только для задания в изолированной копии.`,arguments:{job:XC,task:`Задание форку вместо исходного (необязательно)`}}),e(`ide.agent.job.stop`,`Остановить фоновое задание`,async e=>QC(await Ty(ZC(b(e),`job`))),()=>!0,void 0,{description:`Останавливает работающее фоновое задание агента. Сделанное остаётся в файлах.`,arguments:{job:XC}}),e(`ide.agent.job.answer`,`Ответить фоновому агенту`,async e=>{let t=b(e);return QC(await Dy(ZC(t,`job`),$C(t)))},()=>!0,void 0,{description:`Отвечает на вопрос фонового задания в состоянии needs-user: answers — объект { id вопроса: [id вариантов] } по идентификаторам из waiting, null — пропустить; текст — ответ своими словами. Запросы и их идентификаторы видно в ide.agent.job.result. Разрешения эта команда не подтверждает: их выдаёт пользователь карточкой в чате Projector.`,arguments:{job:XC,answer:`Текст ответа на вопрос`,answers:`Объект { id вопроса: [id вариантов] }; null — пропустить вопросы`,request:`Идентификатор запроса из waiting (по умолчанию первый)`}}),e(`ide.agent.job.open`,`Открыть фоновое задание во вкладке`,async e=>{let r=ZC(b(e),`job`);return await n?.executeCommand(`ide.workbench.agent.job.open`,{job:r},{scope:`editor:${t}`}),{job:r}},()=>!0,void 0,{description:`Открывает вкладку фонового задания: журнал событий, итог, изменённые файлы, запросы с ответом, остановка и продолжение в чате.`,arguments:{job:XC}})}function pP(e,t,n=Ve()?Iu().api:void 0){e(`ide.agent.roles.chat.list`,`Роли агентов для чата`,async()=>({roles:(await tm(t)).map(e=>({id:e.id,name:e.name,description:e.description,agent:e.agent,selection:e.selection,prompt:e.prompt,skills:e.skills,mcp:e.mcp,inherited:e.inherited}))}),()=>!0,void 0,{description:`Возвращает chat-роли, которые можно открыть командой ide.agent.role.open: id, название, агент и выбранные настройки. Служебные роли (Доктор, Lens, Судья) сюда не входят — они не открывают чат.`}),e(`ide.agent.role.open`,`Открыть чат с ролью`,async e=>{let r=b(e).role;if(typeof r!=`string`||!r)throw Error(`role: id chat-роли`);let i=(await tm(t)).find(e=>e.id===r);if(!i)throw Error(`Неизвестная chat-роль: ${r}`);let a=sr(i.agent);if(!a)throw Error(`Агент роли не найден: ${i.agent}`);if(!n)throw Error(`Роли открываются только в рабочей области проекта`);let o=a.builtin?`agent`:a.program,s=gr(),c=`ide.workbench.${o}.open`;return await n.executeCommand(c,{chatId:s,role:rb(tb(i))},{scope:`editor:${t}`}),{role:i.id,name:i.name,agent:i.agent,chatId:s,command:c}},()=>!0,void 0,{description:`Открывает новый чат с chat-ролью: агент роли, её модель и настройки применяются к новому разговору и сохраняются в его истории. Правка роли позже не меняет уже открытый чат. Идентификаторы ролей даёт ide.agent.roles.chat.list.`,arguments:{role:`id chat-роли из ide.agent.roles.chat.list`}})}var mP=`Ключ чата из ide.agent.chats.list; без него — чат, с которым работали последним`,hP=e=>cS(e.backend)||!!e.capabilities().deleteSessions;function gP(e,t){e(`ide.agent.session.delete`,`Удалить прошлую сессию агента`,async e=>{let n=b(e),r=n.sessionId;if(typeof r!=`string`||!r)throw Error(`Укажите sessionId`);if(n.confirm!==!0)throw Error(`Удаление необратимо: передайте confirm: true`);return await Hx(t,n.chat,hP).removeSession(r),{sessionId:r}},()=>Vx(t).some(hP),void 0,{description:`Навсегда удаляет прошлую сессию (историю чата) агента открытого чата; восстановить её нельзя, поэтому нужен confirm: true. Идентификаторы даёт ide.agent.sessions.list. Не все внешние агенты умеют удалять сессии.`,arguments:{sessionId:`Идентификатор сессии`,confirm:`true — подтверждение`,chat:mP}})}var _P=`Ключ чата из ide.agent.chats.list; без него — чат, с которым работали последним`;function vP(e,t){let n=e[t];if(typeof n!=`string`||!n.trim())throw Error(`Укажите ${t}`);return n.trim()}function yP(e,t){let n=()=>Vx(t).length>0,r=e=>Hx(t,b(e).chat);e(`ide.agent.side.open`,`Открыть вопрос в сторону`,e=>r(e).openSide(),n,void 0,{description:`Открывает панель вопроса в сторону: ответ читается по контексту чата и не попадает в его историю. Не прерывает активный ход агента.`,arguments:{chat:_P}}),e(`ide.agent.side.ask`,`Спросить в сторону`,async e=>({answer:await r(e).askSide(vP(b(e),`text`))}),n,void 0,{description:`Задаёт вопрос в сторону и ждёт ответ. Работает и во время ответа агента; вопрос и ответ не записываются в чат. Ответ даёт Projector по видимой переписке и только читает состояние чата.`,arguments:{text:`Текст вопроса`,chat:_P}}),e(`ide.agent.side.clear`,`Очистить историю вопросов в сторону`,e=>r(e).clearSide(),n,void 0,{description:`Убирает из панели предыдущие вопросы в сторону этого чата. История чата и файлы не меняются.`,arguments:{chat:_P}}),e(`ide.agent.chat.status`,`Состояние чата агента`,e=>r(e).status(),n,void 0,{description:`Возвращает снимок состояния чата: занят ли агент, фаза, сколько идёт, когда было последнее событие, выполняющиеся инструменты, ожидающие разрешения и вопросы, очередь, живой процесс и сессию. Только чтение: используется вопросами в сторону, чтобы отличить ожидание пользователя от зависания.`,arguments:{chat:_P}})}var bP=`Ключ чата из ide.agent.chats.list; без него — чат, с которым работали последним`;function xP(e,t){let n=()=>Vx(t).some(e=>e.turns().length>0),r=e=>Hx(t,b(e).chat);e(`ide.agent.lens.show`,`Показать Lens: чем агент занят`,async e=>({open:!0,text:await r(e).openLens()}),n,void 0,{description:`Включает Lens в блоке работы последнего ответа и возвращает короткую сводку: чем агент занят сейчас, по видимой переписке и состоянию чата. Ничего не пишет в историю, не прерывает агента и не создаёт запуск. Дальше Lens обновляется по таймеру, пока агент работает, и по ide.agent.lens.refresh.`,arguments:{chat:bP}}),e(`ide.agent.lens.hide`,`Скрыть Lens`,e=>(r(e).closeLens(),{open:!1}),n,void 0,{description:`Выключает Lens в этом чате и отменяет запрос сводки, если он ещё идёт.`,arguments:{chat:bP}}),e(`ide.agent.lens.refresh`,`Обновить Lens`,async e=>({text:await r(e).refreshLens()}),n,void 0,{description:`Просит новую сводку о текущей работе и ждёт её. Работает и во время ответа агента; прежняя сводка остаётся, пока не придёт новая.`,arguments:{chat:bP}}),e(`ide.agent.lens.auto`,`Автообновление Lens`,e=>{let t=b(e).enabled;if(typeof t!=`boolean`)throw Error(`enabled должен быть boolean`);let n=r(e);return n.setLensAuto(t),{open:n.lensOpen(),auto:t}},n,void 0,{description:`Включает или выключает автообновление Lens по таймеру, пока агент занят. Ручной ide.agent.lens.refresh работает в любом случае.`,arguments:{enabled:`boolean: обновлять автоматически`,chat:bP}})}var SP=`Ключ чата из ide.agent.chats.list; без него — чат, с которым работали последним`;function CP(e,t){let n=()=>Vx(t).some(e=>!e.busy()&&!!e.pendingForm()),r=e=>Hx(t,b(e).chat,e=>!!e.pendingForm());e(`ide.agent.form.show`,`Показать форму ответа в поле ввода`,e=>(r(e).showForm(),{shown:!0}),n,void 0,{description:`Возвращает в поле ввода форму, которой закончился последний ответ. Форму заполняет пользователь; команда только показывает её и ничего не отправляет.`,arguments:{chat:SP}}),e(`ide.agent.form.text`,`Вернуть текстовое поле вместо формы`,e=>(r(e).hideForm(),{text:!0}),n,void 0,{description:`Убирает форму из поля ввода и возвращает обычное текстовое поле. Сама форма остаётся в ответе; ide.agent.form.show вернёт её.`,arguments:{chat:SP}})}function wP(e,t){e(`ide.agent.tasks.list`,`Задачи чата агента`,e=>{let n=Hx(t,b(e).chat);return n.tasks().map(e=>({chat:n.key,task:e.id,title:e.title,kind:e.kind,status:e.status,background:e.background,summary:e.summary}))},()=>Vx(t).length>0,void 0,{description:`Возвращает субагентов и фоновые команды открытого чата: ключ чата и идентификатор задачи (для ide.workbench.agent.task.open), название, вид, состояние и итог.`,arguments:{chat:`Ключ чата из ide.agent.chats.list; без него — чат, с которым работали последним`}})}var TP=`Ключ чата из ide.agent.chats.list; без него — чат, с которым работали последним`,EP=[`conversation`,`files`,`both`];function DP(e,t){wP(e,t),fP(e,t),pP(e,t),gP(e,t),cP(e,t),yP(e,t),xP(e,t),CP(e,t);let n=()=>Vx(t).length>0,r=()=>Vx(t).some(e=>!cS(e.backend)),i=()=>Vx(t).some(e=>!e.busy()),a=(e,n)=>Hx(t,b(e).chat,n),o=e=>!cS(e.backend);e(`ide.agent.chats.list`,`Открытые чаты агентов`,()=>Vx(t).map(e=>({chat:e.key,agent:e.label,busy:e.busy(),messages:e.turns().length})),n,void 0,{description:`Возвращает открытые чаты агентов проекта: ключ (аргумент chat других ide.agent.*), агент, занят ли он и число сообщений. Первым идёт чат, с которым работали последним.`}),e(`ide.agent.turns.list`,`Сообщения чата агента`,e=>a(e).turns().map(e=>({turnId:e.id,role:e.role,text:e.text.trim().slice(0,200),versions:(e.variants?.length??0)+ +(e.role===`user`)})),n,void 0,{description:`Возвращает сообщения открытого чата: идентификатор (turnId для edit, retry и rewind), роль, начало текста и число версий пользовательского сообщения.`,arguments:{chat:TP}}),e(`ide.agent.controls.menu.toggle`,`Открыть или закрыть параметры агента`,e=>a(e,o).toggleControlsMenu(),()=>r()&&i(),void 0,{description:`Показывает остров над полем ввода: модель, усилие, режим и разрешения с пояснениями.`,arguments:{chat:TP}}),e(`ide.agent.controls.list`,`Параметры агента: модель, усилие, режим`,e=>a(e,o).controls().map(e=>({id:e.id,name:e.name,current:e.current,options:e.options.map(e=>e.value)})),r,void 0,{description:`Возвращает настройки открытого чата внешнего агента (модель, усилие рассуждений, режим) с текущими значениями и допустимыми вариантами.`,arguments:{chat:TP}}),e(`ide.agent.control.set`,`Выбрать модель, усилие или режим агента`,async e=>{let t=b(e),n=ob(t,`id`),r=ob(t,`value`);return await a(e,o).setControl(n,r),{id:n,value:r}},()=>r()&&i(),void 0,{description:`Задаёт настройку открытого чата внешнего агента. Действует со следующего сообщения и запоминается как выбор по умолчанию для этого агента.`,arguments:{id:`Идентификатор настройки из ide.agent.controls.list (например model)`,value:`Одно из допустимых значений настройки`,chat:TP}}),e(`ide.agent.sessions.list`,`Прошлые сессии агента`,e=>a(e,o).loadSessions(),r,void 0,{description:"Возвращает прошлые сессии агента открытого чата в папке проекта, от новых к старым: идентификатор, название и время. У ветки субагента есть поле `parent` с идентификатором чата, из которого она запущена, и `agent` с именем агента ветки; ветки не смешиваются с основными чатами.",arguments:{chat:TP}}),e(`ide.agent.session.resume`,`Продолжить прошлую сессию агента`,async e=>{let t=ob(b(e),`sessionId`);return await a(e,o).resumeSession(t),{sessionId:t}},()=>r()&&i(),void 0,{description:`Заменяет содержимое открытого чата сообщениями выбранной прошлой сессии; следующее сообщение продолжит её. Идентификаторы даёт ide.agent.sessions.list.`,arguments:{sessionId:`Идентификатор сессии`,chat:TP}}),e(`ide.agent.chat.send`,`Отправить сообщение агенту`,async e=>{await a(e).send(ob(b(e),`text`))},n,void 0,{description:`Отправляет сообщение в открытый чат агента. Если агент ещё отвечает, сообщение передаётся перед следующим запросом к модели, если агент поддерживает уточнения во время работы; иначе — после ответа.`,arguments:{text:`Текст сообщения`,chat:TP}}),e(`ide.agent.chat.inject`,`Добавить сообщение в идущий ответ агента`,async e=>({added:await a(e,e=>e.busy()&&!!e.capabilities().inject).inject(ob(b(e),`text`))}),()=>Vx(t).some(e=>e.busy()&&!!e.capabilities().inject),void 0,{description:`Добавляет уточнение в ответ, который агент пишет сейчас: он учтёт его, не останавливаясь. Если ответ уже закончился, сообщение остаётся в очереди (added: false).`,arguments:{text:`Текст уточнения`,chat:TP}}),e(`ide.agent.chat.stop`,`Остановить ответ агента`,e=>a(e,e=>e.busy()).stop(),()=>Vx(t).some(e=>e.busy()),void 0,{description:`Останавливает ответ, который агент пишет сейчас. Сообщения в очереди после этого сами не уходят.`,arguments:{chat:TP}}),e(`ide.agent.chat.edit`,`Править сообщение и отправить заново`,e=>{let t=a(e,e=>!e.busy());t.edit(sb(t,b(e),`user`))},i,void 0,{description:`Возвращает отправленное сообщение в поле ввода, а разговор после него убирает в другую версию (к ней можно вернуться). Без turnId берётся последнее сообщение пользователя. Файлы не меняются.`,arguments:{turnId:`Сообщение из ide.agent.turns.list`,chat:TP}}),e(`ide.agent.chat.retry`,`Повторить ответ агента`,async e=>{let t=a(e,e=>!e.busy());await t.retry(sb(t,b(e),`assistant`))},i,void 0,{description:`Задаёт агенту тот же вопрос заново; прежний ответ остаётся другой версией сообщения. Файлы не откатываются.`,arguments:{turnId:`Сообщение или ответ из ide.agent.turns.list`,chat:TP}}),e(`ide.agent.chat.rewind`,`Откатить чат к сообщению`,async e=>{let t=b(e),n=t.scope??`conversation`;if(!EP.includes(n))throw Error(`scope: ${EP.join(`, `)}`);let r=a(e,e=>!e.busy());return r.rewind(sb(r,t,`user`),n)},i,void 0,{description:`Возвращает чат к моменту до сообщения. scope: conversation — только разговор (сообщение уходит в поле ввода), files — файлы проекта возвращаются к тому шагу (если агент хранит резервные копии), both — и то и другое. Меняет файлы на диске: используйте по просьбе пользователя.`,arguments:{turnId:`Сообщение пользователя из ide.agent.turns.list; по умолчанию последнее`,scope:`conversation | files | both`,chat:TP}}),e(`ide.agent.chat.version.show`,`Показать другую версию разговора`,e=>{let t=b(e),n=Number(t.version);if(!Number.isInteger(n)||n<1)throw Error(`version — номер от 1`);a(e,e=>!e.busy()).showVersion(ob(t,`turnId`),n-1)},i,void 0,{description:`Переключает чат на другую версию разговора с сообщения, которое правили или повторяли.`,arguments:{turnId:`Сообщение пользователя из ide.agent.turns.list`,version:`Номер версии, с 1`,chat:TP}}),e(`ide.agent.chat.queue.list`,`Сообщения в очереди агента`,e=>a(e).queue(),n,void 0,{description:`Возвращает сообщения, которые ждут конца ответа агента.`,arguments:{chat:TP}}),e(`ide.agent.chat.queue.remove`,`Убрать сообщение из очереди агента`,e=>a(e).removeQueued(ob(b(e),`id`)),n,void 0,{description:`Убирает сообщение из очереди по идентификатору из ide.agent.chat.queue.list.`,arguments:{id:`Идентификатор из очереди`,chat:TP}}),e(`ide.agent.chat.export`,`Экспортировать чат агента в Markdown`,e=>a(e).exportMarkdown(),n,void 0,{description:`Возвращает весь открытый разговор как Markdown-документ.`,arguments:{chat:TP}}),e(`ide.agent.chat.compact`,`Сжать контекст агента`,e=>a(e,e=>!!e.capabilities().compact&&!e.busy()).compact(),()=>Vx(t).some(e=>!!e.capabilities().compact&&!e.busy()),void 0,{description:`Просит агента сжать разговор, освобождая место в окне контекста. Подходит, когда в чате показано предупреждение о заполнении контекста.`,arguments:{chat:TP}}),e(`ide.agent.worktree.status`,`Изолированная копия проекта у чата`,async e=>await a(e,o).worktree()??null,r,void 0,{description:`Возвращает изолированную копию проекта (git worktree), в которой работает чат: ветку и число изменённых файлов; null, если чат работает в самом проекте.`,arguments:{chat:TP}}),e(`ide.agent.worktree.merge`,`Влить изолированную копию в проект`,e=>a(e,e=>o(e)&&!e.busy()).mergeWorktree(),i,void 0,{description:`Коммитит изменения агента в его изолированной копии и вливает ветку копии в ветку проекта (git merge), затем удаляет копию. Меняет файлы проекта и историю git: используйте по просьбе пользователя. При конфликте слияние отменяется, проект остаётся как был.`,arguments:{chat:TP}}),e(`ide.agent.worktree.discard`,`Отбросить изолированную копию проекта`,async e=>{await a(e,e=>o(e)&&!e.busy()).discardWorktree()},i,void 0,{description:`Удаляет изолированную копию чата и всё, что агент в ней сделал. Необратимо: используйте по просьбе пользователя.`,arguments:{chat:TP}}),e(`ide.agent.chat.isolate`,`Начать чат в изолированной копии проекта`,e=>{let t=b(e).on!==!1;return a(e,e=>o(e)&&!e.busy()&&e.turns().length===0).setIsolate(t),{isolate:t}},()=>Vx(t).some(e=>o(e)&&e.turns().length===0),void 0,{description:`Включает (on: true, по умолчанию) или выключает режим, при котором первое сообщение пустого чата запускает агента в отдельной копии проекта (git worktree на своей ветке). Так несколько агентов не мешают друг другу. Работает только в git-проекте и в чате без сообщений.`,arguments:{on:`true или false`,chat:TP}}),e(`ide.agent.mcp.list`,`MCP-серверы агента`,e=>a(e,o).mcpServers(),r,void 0,{description:`Возвращает MCP-серверы агента в проекте: серверы из его настроек и .mcp.json проекта (имя, состояние, число инструментов, ошибка).`,arguments:{chat:TP}})}function OP(e,t,n,r,i){return kP(e,[{type:`file`,path:t,range:n}],{chat:r,run:i})}function kP(e,t,n){return jP(e,n,e=>e.attach(t))}async function AP(e,t,n){let r=t.trim();if(!r)throw Error(`Выделите текст`);let i=n.source?.trim();return jP(e,n,e=>e.appendText(i?`${i}:\n${r}`:r))}async function jP(e,t,n){let r=Vx(e);if(t.chat){let e=r.find(e=>e.key===t.chat);if(!e)throw Error(`Чат «${t.chat}» не открыт; открытые даёт ide.agent.chats.list`);return await n(e),e}if(r.length)return await n(r[0]),r[0];if(t.open===!1)throw Error(`Нет открытого чата агента`);let i=await Rv(e).catch(()=>[]);for(let r of i){let i=ab(e,r.chat,r.title);if(!i)continue;await t.run(i.command,i.args);let a=await Ux(e,r.chat);return await n(a),a}await t.run(`ide.workbench.agent.open`);let a=await Ux(e);return await n(a),a}async function MP(e=``,t=`GET`,n){let r=await fetch(`/api/integrations${e}`,{method:t,headers:{"Content-Type":`application/json`},body:n===void 0?void 0:JSON.stringify(n)}),i=await r.json();if(!r.ok)throw Error(i.error||`Ошибка интеграции`);return i}var NP=()=>MP(),PP={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function FP(e,t){return V(),q(`svg`,PP,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 19.876 0a1 1 0 0 1 0 .696a10.75 10.75 0 0 1-19.876 0`}),K(`circle`,{cx:`12`,cy:`12`,r:`3`})],-1)]])}var IP=U({name:`lucide-eye`,render:FP}),LP={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function RP(e,t){return V(),q(`svg`,LP,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575a1 1 0 0 1 0 .696a10.8 10.8 0 0 1-1.444 2.49m-6.41-.679a3 3 0 0 1-4.242-4.242`}),K(`path`,{d:`M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 4.446-5.143M2 2l20 20`})],-1)]])}var zP=U({name:`lucide-eye-off`,render:RP}),BP={class:`secret`},VP=G(M({__name:`TokenReveal`,props:{integration:{},label:{},disabled:{type:Boolean}},emits:[`error`],setup(e,{expose:t,emit:n}){let r=e,i=n,o=X(``),s;function c(){clearTimeout(s),o.value=``}async function l(){if(o.value)return c();try{let e=await MP(`/${r.integration}/token`,`POST`);o.value=e.token,s=setTimeout(c,3e4)}catch(e){i(`error`,e instanceof Error?e.message:`Ошибка интеграции`)}}return lt(c),t({hide:c}),(t,n)=>(V(),q(`div`,BP,[n[0]||=K(`span`,{class:`muted`},`Токен`,-1),I(a,{class:`secret-value`,readonly:``,type:o.value?`text`:`password`,value:o.value||`••••••••••••••••`,"aria-label":e.label},null,8,[`type`,`value`,`aria-label`]),I(Q,{disabled:e.disabled,"aria-label":o.value?`Скрыть токен`:`Показать токен`,title:o.value?`Скрыть токен`:`Показать токен (скроется через 30 секунд)`,onClick:l},{default:F(()=>[(V(),Y(qe(o.value?H(zP):H(IP))))]),_:1},8,[`disabled`,`aria-label`,`title`])]))}}),[[`__scopeId`,`data-v-c66d9d37`]]),HP=`node:24-bookworm`,UP={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function WP(e,t){return V(),q(`svg`,UP,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`m6 14l1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2`},null,-1)]])}var GP=U({name:`lucide-folder-open`,render:WP}),KP=[`aria-busy`],qP={class:`repository`},JP={key:0,class:`destination`},YP={key:2,role:`status`},XP={key:3,role:`status`},ZP=G(M({__name:`CloneRepositoryDialog`,props:{source:{},repository:{},destinationName:{},projectId:{},navigate:{type:Function}},emits:[`cloned`],setup(e,{emit:n}){let i=e,o=n,s={github:{dialog:`Клонировать репозиторий`,dialogCommand:`Клонировать репозиторий GitHub`,dialogDescription:`Открывает выбор папки для клонирования текущего репозитория и перехода в локальный проект.`,cloneDescription:`Клонирует текущий репозиторий в папку/имя репозитория, добавляет в каталог и открывает /projects. Существующие папки не перезаписывает.`,abortDescription:`Отменяет идущее клонирование: останавливает загрузку образа и git clone, удаляет временную папку. Проект не добавляется.`,directoryDescription:`Открывает системный выбор папки для локальной копии репозитория.`,fallback:`Не удалось клонировать репозиторий`},gitlab:{dialog:`Клонировать проект`,dialogCommand:`Клонировать проект GitLab`,dialogDescription:`Открывает выбор папки для клонирования текущего проекта GitLab и перехода в локальный проект.`,cloneDescription:`Клонирует текущий проект GitLab в папку/<group>/<project>, добавляет в каталог и открывает /projects. Существующие папки не перезаписывает.`,abortDescription:`Отменяет идущее клонирование: останавливает загрузку образа и git clone, удаляет временную папку. Проект не добавляется.`,directoryDescription:`Открывает системный выбор папки для локальной копии проекта GitLab.`,fallback:`Не удалось клонировать проект`}}[i.source],c=`/${i.source}/clone-jobs`,l=`ide.${i.source}.repository.clone`,u=P(),d=X(),f=X(),p=X(``),m=X(`docker`),h=X(HP),g=X(!1),v=X(`5173`),y=X(!1),x=X(!1),S=X(``),C=X(),w=X(``),T=``;async function ee(e){T=(await MP(c,`POST`,e)).job.id;try{for(;;){let{job:e}=await MP(`${c}/${T}`);if(w.value=e.message,e.phase===`done`&&e.project)return e.project;if(e.phase===`cancelled`)throw Error(`Клонирование отменено`);if(e.phase===`error`)throw Error(e.message);await new Promise(e=>setTimeout(e,700))}}finally{T=``,w.value=``}}lt(()=>{T&&MP(`${c}/${T}`,`DELETE`).catch(()=>{})});let te=Oc(),D=E(`${i.source}-clone:${i.projectId}`,()=>({surface:`${i.source}-clone`,projectId:i.projectId}));D.scope.registerCommand({id:`${l}.dialog`,title:s.dialogCommand,description:s.dialogDescription,enabled:()=>!x.value,run:async()=>{S.value=``,C.value=void 0,p.value=``,y.value=!0,d.value?.open();try{let e=await NP();p.value=e.integrations.find(e=>e.id===i.source)?.settings.directory||`~/Projects`}catch(e){S.value=e instanceof Error?e.message:`Не удалось прочитать настройки`,p.value=`~/Projects`}finally{y.value=!1,await Ut(),d.value?.element?.open&&f.value?.focus()}}}),D.scope.registerCommand({id:l,title:`Клонировать и открыть локальный проект`,description:s.cloneDescription,arguments:{directory:`Абсолютная папка назначения или ~/папка`,environment:`local или { kind: docker, image, network: none|bridge, ports: number[] }; по умолчанию настройки диалога`},enabled:()=>!x.value&&!y.value,run:async e=>{let t=b(e),n=t.directory??p.value;if(typeof n!=`string`||!n.trim())throw Error(`Укажите папку назначения`);x.value=!0,S.value=``;try{if(!C.value){let e=await ee({repository:i.repository,directory:n.trim(),environment:t.environment??(m.value===`docker`?{kind:`docker`,image:h.value,network:g.value?`bridge`:`none`,ports:g.value?v.value.split(`,`).filter(e=>e.trim()).map(Number):[]}:`local`)});C.value=e,te.ingest(e),o(`cloned`,e)}await i.navigate(C.value.path),d.value?.close()}catch(e){S.value=e instanceof Error?e.message:s.fallback}finally{x.value=!1}}}),D.scope.registerCommand({id:`${l}.abort`,title:`Прервать клонирование`,description:s.abortDescription,enabled:()=>x.value&&!!T,run:async()=>{await MP(`${c}/${T}`,`DELETE`)}}),D.scope.registerCommand({id:`${l}.cancel`,title:`Закрыть окно клонирования`,description:`Закрывает окно клонирования и возвращает фокус в строку пути.`,palette:!1,enabled:()=>!x.value,run:()=>d.value?.close()}),D.scope.registerCommand({id:`${l}.directory`,title:`Выбрать папку клонирования`,description:s.directoryDescription,palette:!1,enabled:()=>!x.value&&!y.value&&!C.value,run:async()=>{try{let e=await bc();e.path&&(p.value=e.path)}catch(e){S.value=e instanceof Error?e.message:`Не удалось выбрать папку`}}});let ne=z(()=>{let e=p.value.trim().replace(/[\\/]+$/,``);if(!e||!i.destinationName)return``;let t=e.includes(`\\`)?`\\`:`/`;return`${e}${t}${i.destinationName.split(`/`).filter(Boolean).join(t)}`});function re(e){e.preventDefault(),x.value||D.run(`${l}.cancel`)}return(n,i)=>(V(),Y(ht,{to:`body`},[I(Kr,{ref_key:`dialog`,ref:d,labelledby:H(u),width:`520px`,onKeydown:i[9]||=Z(()=>{},[`stop`]),onCancel:re},{default:F(()=>[K(`form`,{onSubmit:i[8]||=Z(e=>H(D).run(l),[`prevent`]),"aria-busy":x.value},[I(_,{id:H(u)},{default:F(()=>[N(j(H(s).dialog),1)]),_:1},8,[`id`]),K(`p`,qP,j(e.repository),1),I(Wo,{size:`xs`,tone:`muted`,"space-after":2,for:`${H(u)}-directory`},{default:F(()=>[...i[10]||=[N(`Папка назначения`,-1)]]),_:1},8,[`for`]),I(r,{class:`directory`,align:`normal`,justify:`normal`},{default:F(()=>[I(a,{grow:``,id:`${H(u)}-directory`,ref_key:`input`,ref:f,modelValue:p.value,"onUpdate:modelValue":i[0]||=e=>p.value=e,required:``,disabled:x.value||y.value||!!C.value,autocomplete:`off`,spellcheck:`false`},null,8,[`id`,`modelValue`,`disabled`]),I(Q,{title:`Выбрать папку`,"aria-label":`Выбрать папку`,disabled:x.value||y.value||!!C.value,onClick:i[1]||=e=>H(D).run(`${l}.directory`)},{default:F(()=>[I(H(GP),{"aria-hidden":`true`})]),_:1},8,[`disabled`])]),_:1}),ne.value?(V(),q(`p`,JP,j(ne.value),1)):B(``,!0),I(Wo,{size:`xs`,tone:`muted`,"space-after":2,for:`${H(u)}-mode`},{default:F(()=>[...i[11]||=[N(`Окружение`,-1)]]),_:1},8,[`for`]),I(a,{as:`select`,id:`${H(u)}-mode`,modelValue:m.value,"onUpdate:modelValue":i[2]||=e=>m.value=e,disabled:x.value||!!C.value},{default:F(()=>[...i[12]||=[K(`option`,{value:`docker`},`Docker — изолированный запуск`,-1),K(`option`,{value:`local`},`Локально — запуск на хосте`,-1)]]),_:1},8,[`id`,`modelValue`,`disabled`]),m.value===`docker`?(V(),q(W,{key:1},[I(Wo,{size:`xs`,tone:`muted`,"space-after":2,for:`${H(u)}-image`},{default:F(()=>[...i[13]||=[N(`Образ`,-1)]]),_:1},8,[`for`]),I(a,{id:`${H(u)}-image`,modelValue:h.value,"onUpdate:modelValue":i[3]||=e=>h.value=e,disabled:x.value||!!C.value,required:``},null,8,[`id`,`modelValue`,`disabled`]),I(r,{as:`label`,class:`network`,justify:`normal`},{default:F(()=>[I(a,{modelValue:g.value,"onUpdate:modelValue":i[4]||=e=>g.value=e,type:`checkbox`,disabled:x.value||!!C.value},null,8,[`modelValue`,`disabled`]),i[14]||=N(` Разрешить сеть (интернет и локальная сеть)`,-1)]),_:1}),g.value?(V(),q(W,{key:0},[I(Wo,{size:`xs`,tone:`muted`,"space-after":2,for:`${H(u)}-ports`},{default:F(()=>[...i[15]||=[N(`Порты приложения`,-1)]]),_:1},8,[`for`]),I(a,{id:`${H(u)}-ports`,modelValue:v.value,"onUpdate:modelValue":i[5]||=e=>v.value=e,placeholder:`5173, 3000`,disabled:x.value||!!C.value},null,8,[`id`,`modelValue`,`disabled`])],64)):B(``,!0),i[16]||=K(`p`,null,` Контейнеру доступна только папка проекта. Установка зависимостей — из терминала; без сети она недоступна. `,-1)],64)):B(``,!0),y.value?(V(),q(`p`,YP,`Читаю настройки…`)):B(``,!0),x.value?(V(),q(`p`,XP,j(C.value?`Открываю проект…`:w.value||`Запускаю…`),1)):B(``,!0),S.value?(V(),Y(t,{key:4,tone:`danger`,role:`alert`},{default:F(()=>[N(j(S.value),1)]),_:1})):B(``,!0),I(xd,null,{default:F(()=>[x.value&&!C.value?(V(),Y(Q,{key:0,onClick:i[6]||=e=>H(D).run(`${l}.abort`)},{default:F(()=>[...i[17]||=[N(`Прервать`,-1)]]),_:1})):(V(),Y(Q,{key:1,onClick:i[7]||=e=>H(D).run(`${l}.cancel`)},{default:F(()=>[...i[18]||=[N(`Отмена`,-1)]]),_:1})),I(Q,{type:`submit`,appearance:`solid`,disabled:x.value||y.value||!p.value.trim()},{default:F(()=>[N(j(C.value?`Открыть проект`:`Клонировать`),1)]),_:1},8,[`disabled`])]),_:1})],40,KP)]),_:1},8,[`labelledby`])]))}}),[[`__scopeId`,`data-v-5ef65cec`]]),QP={class:`device`,role:`status`},$P=[`href`],eF=G(M({__name:`DeviceLoginPanel`,props:{host:{},device:{},commandId:{}},emits:[`cancel`],setup(e,{emit:t}){let n=t;return(t,r)=>(V(),q(`div`,QP,[K(`p`,null,[r[1]||=N(` Введите код `,-1),K(`strong`,null,j(e.device.userCode),1),N(` на странице `+j(e.host)+`. `,1)]),K(`a`,{href:e.device.verificationUri,target:`_blank`,rel:`noopener noreferrer`},`открыть `+j(e.host)+` для входа ↗`,9,$P),r[3]||=K(`p`,{class:`muted`},`Ожидаем подтверждения…`,-1),I(Q,{"data-command":e.commandId,onClick:r[0]||=e=>n(`cancel`)},{default:F(()=>[...r[2]||=[N(`отменить`,-1)]]),_:1},8,[`data-command`])]))}}),[[`__scopeId`,`data-v-e1877610`]]);function tF(e){let t=X(null),n,r=!1;function i(){clearTimeout(n),t.value=null}async function a(o){if(!(r||t.value?.id!==o.id))try{let s=await MP(e.pollEndpoint,`POST`,{id:o.id});if(r||t.value?.id!==o.id)return;if(s.pending){n=setTimeout(()=>void a(o),(s.interval||5)*1e3);return}s.integration&&e.apply(s.integration),i(),e.message.value=e.connectedMessage}catch(n){!r&&t.value?.id===o.id&&(i(),e.error.value=n instanceof Error?n.message:`Ошибка входа`)}}function o(){return e.action(async()=>{await e.save();let r=await MP(e.endpoint,`POST`);t.value=r,n=setTimeout(()=>void a(r),r.interval*1e3)})}return lt(()=>{r=!0,i()}),{device:t,start:o,cancel:i}}function nF(e){let t=X(),n=X(``),r=X(!1),i=X(!1),a=X(0),o=X(),s=new AbortController,c,l=!1,u=!1;async function d(){n.value=``;try{let n=await e.read(s.signal);if(l)return;let o=e.createProfile(n,e=>{t.value=e});c?.(),c=Hr(e.projectId,o),t.value=n,r.value=!1,u=!1,a.value++,i.value=!0}catch(o){if(l)return;e.isAuthError(o)?(c?.(),c=Hr(e.projectId,e.createConnectionProfile()),t.value=void 0,r.value=!0,u=!1,a.value++,i.value=!0):n.value=o instanceof Error?o.message:e.errorFallback}}async function f(){if(!t.value||t.value.empty)return;let n=e.initialPath();if(n)return o.value?.openFile(n);let r=(await Vn(e.projectId,`tree`)).entries.find(e=>/^readme\.(?:md|markdown)$/i.test(e.name));!l&&r&&await o.value?.openFile(r.name)}function p(t){o.value=t,o.value&&!u&&(u=!0,r.value?o.value.openTab(e.connectionTab):f().catch(t=>{n.value=t instanceof Error?t.message:e.readmeError}))}return Lt(d),lt(()=>{l=!0,s.abort()}),Jt(()=>c?.()),{metadata:t,error:n,needsConnection:r,profileReady:i,workspaceVersion:a,workspace:o,loadRepository:d,ready:p}}var rF={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function iF(e,t){return V(),q(`svg`,rF,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`12`,cy:`12`,r:`1`}),K(`circle`,{cx:`12`,cy:`12`,r:`10`})],-1)]])}var aF=U({name:`lucide-circle-dot`,render:iF}),oF={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function sF(e,t){return V(),q(`svg`,oF,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`18`,cy:`18`,r:`3`}),K(`circle`,{cx:`6`,cy:`6`,r:`3`}),K(`path`,{d:`M6 21V9a9 9 0 0 0 9 9`})],-1)]])}var cF=U({name:`lucide-git-merge`,render:sF}),lF={class:`repository-panel`},uF={key:0,class:`namespace`},dF={key:0,class:`description`},fF={key:1,class:`description muted`},pF={key:2,class:`topics`},mF={class:`stats`},hF={class:`details`},gF={key:3,class:`note-line`},_F=[`href`],vF={key:4,class:`note-line`},yF={key:0},bF={key:1},xF={key:5,class:`note-line`},SF=G(M({__name:`RepositoryOverview`,props:{repository:{}},setup(e){let t=e,n={star:Og,fork:ID,eye:IP,issue:aF,merge:cF},i=e=>e.toLocaleString(`ru-RU`),a=()=>t.repository.visibility??(t.repository.private?`приватный`:`публичный`);return ui(()=>t.repository.readout),(t,o)=>(V(),q(`div`,lF,[I(r,{as:`header`,class:`head`,align:`flex-start`,gap:3,justify:`between`,wrap:``},{default:F(()=>[I(r,{class:`identity`,wrap:``,justify:`normal`},{default:F(()=>[I(gi,{src:e.repository.avatarUrl,alt:e.repository.namespace||e.repository.fullName,size:30},null,8,[`src`,`alt`]),e.repository.namespace?(V(),q(`span`,uF,j(e.repository.namespace)+`/`,1)):B(``,!0),I(_,{as:`h2`,size:`lg`,weight:`semibold`,"space-after":0},{default:F(()=>[N(j(e.repository.name),1)]),_:1}),I(hl,{tone:e.repository.private?`warning`:`neutral`},{default:F(()=>[N(j(a()),1)]),_:1},8,[`tone`]),e.repository.archived?(V(),Y(hl,{key:1,tone:`warning`},{default:F(()=>[...o[0]||=[N(`в архиве`,-1)]]),_:1})):B(``,!0),e.repository.empty?(V(),Y(hl,{key:2},{default:F(()=>[...o[1]||=[N(`пустой`,-1)]]),_:1})):B(``,!0)]),_:1}),I(r,{as:`a`,inline:``,justify:`normal`,class:`repo-link`,href:e.repository.htmlUrl,target:`_blank`,rel:`noopener noreferrer`},{default:F(()=>[I(H(bi),{"aria-hidden":`true`}),N(`Открыть на `+j(e.repository.hostLabel),1)]),_:1},8,[`href`])]),_:1}),e.repository.description?(V(),q(`p`,dF,j(e.repository.description),1)):(V(),q(`p`,fF,`Без описания`)),e.repository.topics.length?(V(),q(`ul`,pF,[(V(!0),q(W,null,J(e.repository.topics,e=>(V(),q(`li`,{key:e},j(e),1))),128))])):B(``,!0),K(`dl`,mF,[(V(!0),q(W,null,J(e.repository.stats,e=>(V(),Y(l,{as:`div`,appearance:`frame`,key:e.key,class:`stat`},{default:F(()=>[K(`dt`,null,[(V(),Y(qe(n[e.icon]),{"aria-hidden":`true`})),N(j(e.label),1)]),K(`dd`,null,j(i(e.value)),1)]),_:2},1024))),128))]),K(`dl`,hF,[(V(!0),q(W,null,J(e.repository.details,e=>(V(),q(`div`,{key:e.key},[K(`dt`,null,j(e.label),1),K(`dd`,null,j(e.value),1)]))),128))]),e.repository.homepage?(V(),q(`p`,gF,[I(H(cT),{"aria-hidden":`true`}),K(`a`,{href:e.repository.homepage,target:`_blank`,rel:`noopener noreferrer`},j(e.repository.homepage),9,_F)])):B(``,!0),e.repository.refNote?(V(),q(`p`,vF,[I(H(_A),{"aria-hidden":`true`}),N(j(e.repository.refNote.text)+` `,1),e.repository.refNote.code?(V(),q(`code`,yF,j(e.repository.refNote.code),1)):B(``,!0),e.repository.refNote.suffix?(V(),q(`span`,bF,j(e.repository.refNote.suffix),1)):B(``,!0)])):B(``,!0),e.repository.license?(V(),q(`p`,xF,[I(H(lN),{"aria-hidden":`true`}),N(`Лицензия: `+j(e.repository.license),1)])):B(``,!0)]))}}),[[`__scopeId`,`data-v-93de72e1`]]);function CF(){let e=X(!1),t=X(``),n=X(``);async function r(r){if(!e.value){t.value=``,n.value=``,e.value=!0;try{await r()}catch(e){throw t.value=e instanceof Error?e.message:`Ошибка интеграции`,e}finally{e.value=!1}}}return{busy:e,error:t,message:n,action:r}}var wF={class:`connection`},TF=[`href`],EF=G(M({__name:`TokenConnectionForm`,props:{host:{},subjectLabel:{},subject:{},projectId:{},scopeKey:{},surface:{},placeholder:{},tokenUrl:{},commandId:{},commandDescription:{},readoutNote:{},intro:{},connect:{type:Function}},emits:[`connected`],setup(e,{emit:n}){let r=e,i=n,o=X(``),s=P(),{busy:c,error:l,action:u}=CF(),d=E(r.scopeKey,()=>({surface:r.surface,projectId:r.projectId,repository:r.subject}));return d.scope.registerCommand({id:r.commandId,title:`Подключить ${r.host}`,description:r.commandDescription,enabled:()=>!c.value&&!!o.value.trim(),run:()=>u(async()=>{await r.connect(o.value),o.value=``,i(`connected`)})}),ui(()=>({note:r.readoutNote,text:vi(`${r.subjectLabel}: ${r.subject}`,c.value?`Состояние: подключение…`:`Состояние: не подключено`,o.value.trim()?`Токен: введён`:`Токен: не введён`,l.value?`Ошибка: ${l.value}`:``)})),(n,r)=>(V(),q(`section`,wF,[I(_,null,{default:F(()=>[N(`Подключить `+j(e.host),1)]),_:1}),K(`p`,null,j(e.intro??`Установите токен, чтобы открыть ${e.subject}.`),1),L(n.$slots,`hint`,{},void 0,!0),I(ml,{as:`form`,onSubmit:r[1]||=Z(t=>H(d).run(e.commandId),[`prevent`])},{default:F(()=>[I(Wo,{for:H(s),size:`sm`},{default:F(()=>[N(`Токен `+j(e.host),1)]),_:1},8,[`for`]),I(a,{id:H(s),modelValue:o.value,"onUpdate:modelValue":r[0]||=e=>o.value=e,type:`password`,autocomplete:`off`,placeholder:e.placeholder,disabled:H(c),required:``},null,8,[`id`,`modelValue`,`placeholder`,`disabled`]),I(Q,{type:`submit`,"data-command":e.commandId,disabled:H(c)||!o.value.trim()},{default:F(()=>[N(j(H(c)?`Подключаю…`:`Подключить ${e.host}`),1)]),_:1},8,[`data-command`,`disabled`])]),_:1}),H(l)?(V(),Y(t,{key:0,tone:`danger`,role:`alert`},{default:F(()=>[N(j(H(l)),1)]),_:1})):B(``,!0),K(`a`,{href:e.tokenUrl,target:`_blank`,rel:`noopener noreferrer`},`Создать токен в `+j(e.host)+` ↗`,9,TF)]))}}),[[`__scopeId`,`data-v-b8f8db3e`]]),DF={key:0,class:`drop-hint`},OF={key:2,id:`header-tools`,class:`header-tools`},kF={class:`nav`},AF={key:1,class:`drop-error`,role:`alert`},jF=G(M({__name:`AppShell`,props:{currentProject:{}},setup(e){let{openPath:t}=Oc(),n=da(),r=ua(),i=pu(),a=E(`project:path`,()=>({surface:`project-path`}));a.scope.registerCommand({id:`ide.project.path.open`,title:`Открыть проект по пути`,description:`Открывает локальную папку, gh:/owner/repository или gl:/<instance>/<group>/<project> в readonly без клонирования.`,arguments:{path:`string: абсолютный путь, gh:/owner/repository или gl:/<instance>/<group>/<project>`},run:async e=>{let{path:t}=b(e);if(typeof t!=`string`)throw Error(`Укажите path`);await r.push(Rc(t))}}),a.scope.registerCommand({id:`ide.github.repository.open`,title:`Открыть репозиторий GitHub`,description:`Открывает репозиторий GitHub в readonly без клонирования; публичный репозиторий не требует входа.`,arguments:{repository:`string: owner/repository или ссылка GitHub`},run:async e=>{let{repository:t}=b(e);if(typeof t!=`string`)throw Error(`Укажите repository`);await r.push(Pc(t))}}),a.scope.registerCommand({id:`ide.gitlab.repository.open`,title:`Открыть проект GitLab`,description:`Открывает проект GitLab в readonly без клонирования: ссылку, gl:/<instance>/<group>/<project> или group/project настроенного инстанса. Публичные проекты gitlab.com доступны без входа.`,arguments:{repository:`string: group/project, <instance>/group/project, gl:/<instance>/group/project или ссылка GitLab`},run:async e=>{let{repository:t}=b(e);if(typeof t!=`string`)throw Error(`Укажите repository`);let n=(await NP()).integrations.find(e=>e.id===`gitlab`);await r.push(Uc(t,n?.settings.url))}}),a.scope.registerCommand({id:`ide.project.paths.open`,title:`Открыть папки как проекты`,description:`Создаёт проекты для локальных папок, которых нет в каталоге, и открывает первую из них.`,arguments:{paths:`string[]: абсолютные пути папок`},run:async e=>{let{paths:n}=b(e);if(!Array.isArray(n)||!n.length||n.some(e=>typeof e!=`string`))throw Error(`Укажите paths`);let i=[];for(let e of n)i.push((await t(e)).project);await r.push(Rc(i[0].path))}});let o=z(()=>n.name===`launcher`),s=X(!1),c=X(``),l=0;function u(e){o.value&&GA(e.dataTransfer)&&(l++,s.value=!0)}function d(){l=Math.max(0,l-1),l||(s.value=!1)}async function f(e){if(s.value=!1,l=0,!o.value||!GA(e.dataTransfer))return;let t=KA(e.dataTransfer);if(c.value=``,!t.length)c.value=`Не удалось прочитать путь. Перетащите папку из файлового менеджера.`;else try{await a.scope.executeCommand(`ide.project.paths.open`,{paths:t})}catch(e){c.value=e instanceof Error?e.message:`Не удалось открыть папку`}}let p=e=>a.scope.executeCommand(`ide.project.path.open`,{path:e});return(t,r)=>{let a=pe(`router-link`);return V(),q(`div`,{class:O([`shell`,{workspace:H(n).name===`project`||H(n).name===`github-project`||H(n).name===`gitlab-project`,settings:H(n).name===`settings`}]),onDragenter:u,onDragover:r[0]||=Z(()=>{},[`prevent`]),onDragleave:d,onDrop:Z(f,[`prevent`])},[s.value?(V(),q(`div`,DF,`Бросьте папку — откроем проект`)):B(``,!0),K(`header`,{class:O([`top`,{"has-project":e.currentProject}])},[e.currentProject?(V(),Y(H(n_),{key:e.currentProject.id,class:`mobile-picker`,project:e.currentProject},null,8,[`project`])):B(``,!0),e.currentProject?(V(),Y(H(qf),{key:e.currentProject.id,class:`project-switcher`,project:e.currentProject,navigate:p},null,8,[`project`])):B(``,!0),e.currentProject?(V(),q(`div`,OF)):(V(),Y(a,{key:3,class:`brand`,to:`/`,title:`Открыть поиск`},{default:F(()=>[...r[1]||=[K(`span`,{class:`u-truncate`},`projector`,-1)]]),_:1})),K(`nav`,kF,[I(H(T)),e.currentProject?B(``,!0):(V(),Y(a,{key:0,to:`/settings`},{default:F(()=>[...r[2]||=[N(`настройки`,-1)]]),_:1})),!e.currentProject||!H(i)?(V(),Y(H(pw),{key:1})):B(``,!0)])],2),c.value?(V(),q(`p`,AF,j(c.value),1)):B(``,!0),K(`main`,null,[L(t.$slots,`default`,{},void 0,!0)])],34)}}}),[[`__scopeId`,`data-v-061756a6`]]),MF=G(M({__name:`App`,setup(e){let{error:n}=Pee(),{load:r,projects:i}=Oc(),{connect:a}=ll(),o=da(),s=ua(),c=z(()=>typeof o.query.ref==`string`?o.query.ref:``),l=z(()=>{if(o.name===`gitlab-project`)try{let e=Lc(o.params.gitlabPath),t=Gs(e.instance);return{instance:t,path:Js(e.path,t)}}catch{return}}),u=z(()=>{if(o.name===`project`)return i.value.find(e=>e.path===Fc(o.params.projectPath));if(o.name===`github-project`){let e=Ic(o.params.githubPath),t=ec({kind:`github`,repository:e});return{id:t,path:t,name:e.split(`/`).at(-1)||`GitHub`,iconUrl:Sc(`github`,e,c.value)}}if(o.name===`gitlab-project`){let e=l.value;if(!e)return;let t=ec({kind:`gitlab`,...e});return{id:t,path:t,name:e.path.split(`/`).at(-1)||`GitLab`,iconUrl:Sc(`gitlab`,`${e.instance}/${e.path}`,c.value)}}});Qe(()=>{let e=u.value,t=o.name===`launcher`?`поиск`:o.name===`github-project`?ec({kind:`github`,repository:Ic(o.params.githubPath)}):o.name===`gitlab-project`?l.value?ec({kind:`gitlab`,...l.value}):`проект`:o.name===`settings`?`настройки`:`проект`;document.title=e?`${e.name} — Projector`:`Projector — ${t}`;let n=document.querySelector(`link[rel="icon"]`);n&&(n.removeAttribute(`type`),n.href=e?xc(e):`/favicon.svg`)});let d;function f(){clearTimeout(d)}function p(){Ho&&o.name===`launcher`&&(f(),d=setTimeout(()=>{o.name===`launcher`&&!document.hasFocus()&&fetch(`/api/app/hide`,{method:`POST`}).catch(()=>void 0)},100))}function m(){Ho&&o.name!==`launcher`&&s.push(`/`)}return Lt(()=>{a(),r(),window.addEventListener(`projector:show`,m),window.addEventListener(`blur`,p),window.addEventListener(`focus`,f)}),Jt(()=>{f(),window.removeEventListener(`projector:show`,m),window.removeEventListener(`blur`,p),window.removeEventListener(`focus`,f)}),(e,r)=>{let i=pe(`router-view`);return V(),q(W,null,[I(H(Ld)),I(P_),H(n)?(V(),Y(t,{key:0,as:`div`,tone:`danger`,size:`xs`,class:`command-error`,role:`alert`},{default:F(()=>[N(j(H(n)),1),K(`button`,{"aria-label":`Закрыть сообщение`,onClick:r[0]||=e=>n.value=``},`×`)]),_:1})):B(``,!0),H(o).name===`launcher`?(V(),Y(i,{key:1})):(V(),Y(jF,{key:2,"current-project":u.value},{default:F(()=>[I(i)]),_:1},8,[`current-project`]))],64)}}}),[[`__scopeId`,`data-v-4eac335d`]]),NF=[`aria-orientation`],PF=G(M({__name:`UiResizeHandle`,props:{orientation:{},appearance:{},dragging:{type:Boolean},labelled:{type:Boolean}},setup(e){return(t,n)=>(V(),q(`div`,{class:O([`ui-resize-handle`,[e.orientation??`horizontal`,e.appearance??`bar`,{dragging:e.dragging,labelled:e.labelled}]]),role:`separator`,"aria-orientation":e.orientation??`horizontal`,tabindex:`0`},[L(t.$slots,`default`,{},void 0,!0)],10,NF))}}),[[`__scopeId`,`data-v-a0057804`]]),FF=We(),IF=.35,LF=e=>JSON.parse(JSON.stringify(e)),RF=e=>!!e&&e!==`center`;function zF(e,t){return{type:`group`,id:e,panels:[],active:``,keepEmpty:!0,...t?{role:t}:{}}}function BF(){return{root:{type:`split`,id:`s1`,direction:`row`,children:[zF(`g1`,`editor`),zF(`g2`,`terminal`)],sizes:[.65,.35]},focused:`g1`}}function VF(e){let t=[],n=e=>e.type===`group`?t.push(e):e.children.forEach(n);return n(e.root),t}var HF=(e,t)=>VF(e).find(e=>e.id===t),UF=(e,t)=>VF(e).find(e=>e.panels.includes(t)),WF=e=>VF(e).flatMap(e=>e.panels);function GF(e){return e.type===`group`?!e.hidden:e.children.some(GF)}function KF(e,t){if(e.id===t)return{node:e,index:-1};if(e.type===`split`)for(let[n,r]of e.children.entries()){if(r.id===t)return{node:r,parent:e,index:n};let i=KF(r,t);if(i)return i}}function qF(e){let t=0,n=e=>{let r=/^[gs](\d+)$/.exec(e.id);r&&(t=Math.max(t,Number(r[1]))),e.type===`split`&&e.children.forEach(n)};return n(e.root),e=>`${e}${++t}`}function JF(e){let t=e.map(e=>Number.isFinite(e)&&e>0?e:0),n=t.reduce((e,t)=>e+t,0);return n>0?t.map(e=>e/n):t.map(()=>1/t.length)}function YF(e){if(e.type===`group`)return!e.panels.length&&!e.keepEmpty?void 0:(e.panels.includes(e.active)||(e.active=e.panels[0]??``),e);let t=[],n=[],r=JF(e.sizes.length===e.children.length?e.sizes:[]);for(let[i,a]of e.children.entries()){let o=YF(a);if(!o)continue;let s=r[i]??1/e.children.length;if(o.type===`split`&&o.direction===e.direction){let e=JF(o.sizes);o.children.forEach((r,i)=>{t.push(r),n.push(s*e[i])})}else t.push(o),n.push(s)}if(t.length)return t.length===1?t[0]:(e.children=t,e.sizes=JF(n),e)}function XF(e,t){let n=new Map,r=VF(e);for(let e of r){if(!e.role)continue;let t=n.get(e.role);(!t||!t.panels.length&&e.panels.length)&&n.set(e.role,e)}for(let e of r)e.role&&!e.panels.length&&n.get(e.role)!==e&&(e.keepEmpty&&(n.get(e.role).keepEmpty=!0),delete e.keepEmpty);e.root=YF(e.root)??zF(`g1`);let i=VF(e);t&&i.some(e=>e.id===t)&&(e.focused=t);let a=i.find(t=>t.id===e.focused);return(!a||a.hidden&&i.some(e=>!e.hidden))&&(e.focused=(i.find(e=>!e.hidden)??i[0]).id),e.maximized&&!i.some(t=>t.id===e.maximized&&!t.hidden)&&delete e.maximized,e}function ZF(e,t){return JSON.stringify(e)===JSON.stringify(t)?e:t}function QF(e,t){if(e.active===t)return;let n=(e.history??[]).filter(n=>n!==t&&n!==e.active);e.active&&e.panels.includes(e.active)&&n.push(e.active),e.history=n.slice(-50),e.active=t}function $F(e,t){let n=UF(e,t);if(!n)return;let r=n.panels.indexOf(t);n.panels.splice(r,1);let i=(n.history??[]).filter(e=>e!==t&&n.panels.includes(e)),a=n.active===t?i.pop():void 0;return i.length?n.history=i:delete n.history,n.active===t&&(n.active=a??n.panels[Math.min(r,n.panels.length-1)]??``),n}function eI(e,t,n,r,i,a){let o=r===`left`||r===`right`?`row`:`column`,s=r===`left`||r===`top`,c=KF(e.root,t.id);if(c?.parent&&c.parent.direction===o){let{parent:e,index:t}=c,r=e.sizes[t];e.sizes[t]=r*(1-a);let i=t+ +!s;e.children.splice(i,0,n),e.sizes.splice(i,0,r*a);return}let l={type:`split`,id:i(`s`),direction:o,children:s?[n,t]:[t,n],sizes:s?[a,1-a]:[1-a,a]};c?.parent?c.parent.children[c.index]=l:e.root=l}function tI(e,t,n){return{type:`group`,id:e,panels:[t],active:t,...n?.role?{role:n.role}:{},...n?.keepEmpty?{keepEmpty:!0}:{}}}function nI(e,t,n,r){let i=qF(e),a=VF(e),o=a.find(e=>e.id===n.groupId)??a.find(t=>t.id===e.focused)??a[0];if(RF(n.zone)){let s=tI(i(`g`),t,n.groupId?o:void 0),c=n.groupId&&a.some(e=>e.id===n.groupId)?o:e.root;return eI(e,c,s,n.zone,i,c===e.root?IF:.5),r&&(e.focused=s.id),s}let s=Math.max(0,Math.min(n.index??o.panels.length,o.panels.length));return o.panels.splice(s,0,t),(r||!o.active)&&QF(o,t),r&&(delete o.hidden,e.focused=o.id),o}function rI(e,t){let n=LF(e),r=UF(n,t);return r?(QF(r,t),delete r.hidden,n.focused=r.id,n.maximized&&n.maximized!==r.id&&delete n.maximized,ZF(e,XF(n))):e}function iI(e,t){let n=LF(e),r=HF(n,t);return!r||r.hidden?e:(n.focused=t,ZF(e,n))}function aI(e,t,n={},r=!0){if(UF(e,t))return r?rI(e,t):e;let i=LF(e),a=nI(i,t,n,r);return ZF(e,XF(i,r?a.id:void 0))}function oI(e,t,n){let r=UF(e,t),i=n.groupId?HF(e,n.groupId):void 0;if(!r||!i&&!RF(n.zone)||RF(n.zone)&&i===r&&r.panels.length===1)return e;let a=LF(e),o=UF(a,t),s=i?HF(a,i.id):void 0;if(RF(n.zone)){let r=qF(a);$F(a,t);let i=tI(r(`g`),t,o),c=s??a.root;return eI(a,c,i,n.zone,r,c===a.root?IF:.5),ZF(e,XF(a,i.id))}if(o===s){let r=o.panels.indexOf(t),i=n.index??o.panels.length;return o.panels.splice(r,1),o.panels.splice(Math.max(0,Math.min(i>r?i-1:i,o.panels.length)),0,t),QF(o,t),ZF(e,XF(a,o.id))}return $F(a,t),ZF(e,XF(a,nI(a,t,{groupId:s.id,zone:`center`,index:n.index},!0).id))}function sI(e,t,n){let r=LF(e),i=HF(r,t);return!i||n.length!==i.panels.length||new Set(n).size!==n.length||n.some(e=>!i.panels.includes(e))?e:(i.panels=n,ZF(e,r))}function cI(e,t,n){let r=LF(e),i=UF(r,t);return!i||UF(r,n)?e:(i.panels[i.panels.indexOf(t)]=n,i.active===t&&(i.active=n),i.history&&=i.history.map(e=>e===t?n:e).filter((e,t,n)=>n.indexOf(e)===t),ZF(e,r))}function lI(e,t,n){let r=LF(e),i=HF(r,t);return i?(i.hidden=n||void 0,ZF(e,XF(r,n?void 0:t))):e}function uI(e,t){let n=LF(e),r=HF(n,t);return!r||r.hidden?e:(n.maximized===t?delete n.maximized:n.maximized=t,n.focused=t,ZF(e,n))}function dI(e,t,n){let r=LF(e),i=KF(r.root,t);return i?.node.type!==`split`||n.length!==i.node.children.length?e:(i.node.sizes=JF(n),ZF(e,r))}function fI(e,t){let n=LF(e);for(let e of VF(n))!e.role&&e.panels.length&&t.role&&(e.role=t.role(e.active||e.panels[0]));for(let e of WF(n))t.exists(e)===!1&&$F(n,e);for(let e of t.ids)UF(n,e)||nI(n,e,t.place?.(e,n)??{},!1);return ZF(e,XF(n))}function pI(e){let t=LF(e);return delete t.maximized,t}var mI=e=>!!e&&typeof e==`object`&&!Array.isArray(e);function hI(e,t,n,r){if(t>8||!mI(e)||typeof e.id!=`string`||!e.id||e.id.length>32||n.has(e.id))return;if(n.add(e.id),e.type===`group`){if(!Array.isArray(e.panels)||e.panels.length>500)return;let t=[];for(let n of e.panels)typeof n!=`string`||!n||n.length>1024||r.has(n)||(r.add(n),t.push(n));return{type:`group`,id:e.id,panels:t,active:typeof e.active==`string`&&t.includes(e.active)?e.active:t[0]??``,...typeof e.role==`string`&&e.role.length<=20?{role:e.role}:{},...e.hidden===!0?{hidden:!0}:{},...e.keepEmpty===!0?{keepEmpty:!0}:{}}}if(e.type!==`split`||e.direction!==`row`&&e.direction!==`column`||!Array.isArray(e.children)||e.children.length>16)return;let i=[],a=[];for(let[o,s]of e.children.entries()){let c=hI(s,t+1,n,r);if(!c)continue;i.push(c);let l=Array.isArray(e.sizes)?e.sizes[o]:void 0;a.push(typeof l==`number`&&Number.isFinite(l)&&l>0?l:1)}if(i.length)return{type:`split`,id:e.id,direction:e.direction,children:i,sizes:JF(a)}}function gI(e){if(!mI(e))return;let t=hI(e.root,0,new Set,new Set);if(t)return XF({root:t,focused:typeof e.focused==`string`?e.focused:``})}var _I=Symbol(`dock`),vI=new WeakMap;function yI(e,t){let n=e.body.style,r=e=>({value:n.getPropertyValue(e),priority:n.getPropertyPriority(e)}),i=vI.get(e)??{cursor:r(`cursor`),selection:r(`user-select`),leases:[]},a={cursor:t};return i.leases.push(a),vI.set(e,i),n.setProperty(`cursor`,t),n.setProperty(`user-select`,`none`),()=>{i.leases.splice(i.leases.indexOf(a),1);let t=i.leases.at(-1);t?n.setProperty(`cursor`,t.cursor):(n.setProperty(`cursor`,i.cursor.value,i.cursor.priority),n.setProperty(`user-select`,i.selection.value,i.selection.priority),vI.delete(e))}}function bI(e){let t=X(!1),n;function r(r=`stop`,c){let l=n;if(!l)return;n=void 0,t.value=!1;let u=l.target;u.removeEventListener(`pointermove`,i),u.removeEventListener(`pointerup`,a),u.removeEventListener(`pointercancel`,o),u.removeEventListener(`lostpointercapture`,s),l.unlock?.(),u.hasPointerCapture(l.id)&&u.releasePointerCapture(l.id),e.finish?.(r,l.state,c)}let i=t=>{n?.id===t.pointerId&&e.move(t,n.state)},a=e=>{n?.id===e.pointerId&&r(`up`,e)},o=e=>{n?.id===e.pointerId&&r(`cancel`,e)},s=e=>{n?.id===e.pointerId&&r(`lostcapture`,e)};function c(r){if(r.button!==0||n)return;let c=e.start(r);if(c===void 0)return;let l=r.currentTarget;r.preventDefault(),l.focus(),l.setPointerCapture(r.pointerId),n={id:r.pointerId,target:l,state:c},e.cursor&&(n.unlock=yI(l.ownerDocument,e.cursor())),t.value=!0,l.addEventListener(`pointermove`,i),l.addEventListener(`pointerup`,a),l.addEventListener(`pointercancel`,o),l.addEventListener(`lostpointercapture`,s)}return zt(()=>r(`dispose`)),{dragging:cn(t),start:c,stop:r}}var xI=(e,t)=>`${e}.${t}`;function SI({props:e,commands:t,contextId:n,strip:r,menu:i,startRename:a}){let o=t=>xI(e.commandNamespace,t);function s(t){let r=b(t);if(r.id!==void 0&&typeof r.id!=`string`)throw Error(`id должен быть строкой`);return e.tabs.find(t=>t.id===(r.id??(n.value||e.activeId)))}let c=(n,r,i,a=()=>!0)=>t.scope.registerCommand({id:o(n),palette:n!==`reorder`,title:r,run:i,enabled:t=>!e.disabled&&a(t)}),l=e=>!!s(e);c(`select`,`Открыть вкладку`,t=>e.commandHandlers.select(s(t).id),l),c(`close`,`Закрыть`,t=>e.commandHandlers.close(s(t).id),l),c(`closeOthers`,`Закрыть остальные`,t=>e.commandHandlers.closeMany(e.tabs.filter(e=>e.id!==s(t).id).map(e=>e.id)),t=>l(t)&&e.tabs.length>1),c(`closeLeft`,`Закрыть слева`,t=>e.commandHandlers.closeMany(e.tabs.slice(0,e.tabs.indexOf(s(t))).map(e=>e.id)),t=>l(t)&&e.tabs.indexOf(s(t))>0),c(`closeRight`,`Закрыть справа`,t=>e.commandHandlers.closeMany(e.tabs.slice(e.tabs.indexOf(s(t))+1).map(e=>e.id)),t=>l(t)&&e.tabs.indexOf(s(t))<e.tabs.length-1),c(`closeAll`,`Закрыть все`,()=>e.commandHandlers.closeMany(e.tabs.map(e=>e.id)),()=>!!e.tabs.length),c(`closeSaved`,`Закрыть сохранённые`,()=>e.commandHandlers.closeMany(e.tabs.filter(e=>!e.dirty&&!e.saving).map(e=>e.id)),()=>!!e.closeSaved&&e.tabs.some(e=>!e.dirty&&!e.saving)),c(`rename`,`Переименовать…`,t=>{let n=b(t),r=s(t);if(n.label===void 0)return a(r);if(typeof n.label!=`string`||!n.label.trim())throw Error(`Укажите label вкладки`);return e.commandHandlers.rename?.(r.id,n.label.trim())},t=>l(t)&&!!(e.renameable||s(t)?.renameable)),c(`pin`,`Закрепить вкладку`,t=>e.commandHandlers.pin?.(s(t).id),e=>l(e)&&!!s(e)?.preview),c(`reorder`,`Переставить вкладки`,t=>{let{ids:n}=b(t);if(!Array.isArray(n)||n.length!==e.tabs.length||new Set(n).size!==n.length||n.some(t=>typeof t!=`string`||!e.tabs.some(e=>e.id===t)))throw Error(`Укажите все id вкладок без повторений`);return e.commandHandlers.reorder(n)});for(let t of[`next`,`previous`,`first`,`last`])c(t,`Перейти к вкладке`,n=>{let i=e.tabs.indexOf(s(n)),a=t===`first`?0:t===`last`?e.tabs.length-1:(i+(t===`next`?1:e.tabs.length-1))%e.tabs.length,o=e.tabs[a],c=e.commandHandlers.select(o.id);return r.value?.querySelectorAll(`[role="tab"]`)[a]?.focus(),c},l);return c(`contextMenu`,`Открыть меню вкладки`,t=>{let a=s(t);n.value=a.id;let o=e.tabs.indexOf(a),c=r.value?.querySelectorAll(`[role="tab"]`)[o];if(c)return i.value?.openForElement(c)},l),{findTab:s}}var CI=[`aria-label`],wI=[`draggable`,`onContextmenu`,`onDragstart`,`onDragover`,`onDrop`,`onAuxclick`],TI=[`aria-selected`,`tabindex`,`title`,`onFocus`,`onClick`,`onDblclick`,`onKeydown`],EI={class:`u-truncate`},DI=[`disabled`,`title`,`aria-label`,`onClick`],OI=[`aria-label`],kI=G(M({__name:`DockTabs`,props:{tabs:{},activeId:{},label:{},disabled:{type:Boolean},group:{},dim:{type:Boolean},actions:{type:Function},closeSaved:{type:Boolean},commandNamespace:{},projectId:{},commandHandlers:{}},setup(e){let t=e,n=X(),r=X(``);function i(e,t){r.value=t.id,o.scope.activate(),n.value?.open(e)}let o=E(`tabs:${P()}`,()=>({surface:`tabs`,namespace:t.commandNamespace,activeTab:t.activeId,tabs:JSON.stringify(t.tabs.map(({id:e,label:t})=>({id:e,label:t}))),projectId:t.projectId,busy:!!t.disabled})),s=e=>xI(t.commandNamespace,e),c=X(),{findTab:l}=SI({props:t,commands:o,contextId:r,strip:c,menu:n,startRename:_}),u=z(()=>{let e=l();if(!e)return[];let n=(t,n={})=>o.item(s(t),{id:e.id},n),r=[`close`,`closeOthers`,`closeLeft`,`closeRight`,`closeAll`].map(e=>n(e));return t.closeSaved&&r.push(n(`closeSaved`)),e.renameable&&r.push(n(`rename`,{separator:!0})),r.push(...t.actions?.(e.id)??[]),r.map(e=>({...e,disabled:t.disabled||e.disabled}))});R(()=>t.disabled,e=>{e&&n.value?.close(!1)});let d=X(``),f=X(``),p=X(``),m=z(()=>t.group??``),h=X(``),g=X(!1);async function _(e){if(!e.renameable||t.disabled)return;d.value=e.id,f.value=e.label,await Ut();let n=c.value?.querySelector(`input`);n?.focus(),n?.select()}function v(e){let n=d.value;d.value=``;let r=f.value.trim();n&&e&&r&&r!==t.tabs.find(e=>e.id===n)?.label&&o.run(s(`rename`),{id:n,label:r})}function y(e,n){e.button===1&&(e.preventDefault(),t.disabled||o.run(s(`close`),{id:n}))}function b(e,n){d.value||t.disabled||!e.dataTransfer?e.preventDefault():(p.value=n,FF.value={id:n,group:m.value},e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`application/x-projector-tab`,n),e.dataTransfer.setData(`text/plain`,t.tabs.find(e=>e.id===n)?.label??n))}function x(){let e=FF.value;return!e||t.disabled?!1:e.group===m.value||!!t.commandHandlers.move}function S(e,n){if(!x())return;e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`move`);let r=e.currentTarget.getBoundingClientRect();h.value=n??t.tabs.at(-1)?.id??``,g.value=n===void 0||e.clientX>r.left+r.width/2;let i=c.value,a=i.getBoundingClientRect();e.clientX<a.left+32?i.scrollLeft-=24:e.clientX>a.right-32&&(i.scrollLeft+=24)}function C(){p.value&&FF.value?.id===p.value&&(FF.value=void 0),p.value=``,h.value=``}function w(e,n){let r=FF.value;if(!r||!x())return;e.preventDefault();let i=n??t.tabs.at(-1)?.id,a=n===void 0||g.value?1:0;if(r.group===m.value){if(i&&i!==r.id){let e=t.tabs.map(e=>e.id).filter(e=>e!==r.id);e.splice(e.indexOf(i)+a,0,r.id),o.run(s(`reorder`),{ids:e})}}else{let e=i?t.tabs.findIndex(e=>e.id===i)+a:0;t.commandHandlers.move(r.id,e)}h.value=``,p.value=``,FF.value=void 0}function T(e,t){r.value=t,o.keydown(e)}function ee(e){r.value=e,o.scope.activate()}function te(e){e.preview?o.run(s(`pin`),{id:e.id}):e.renameable&&o.run(s(`rename`),{id:e.id})}return R(()=>t.activeId,async()=>{await Ut(),c.value?.querySelector(`[aria-selected="true"]`)?.scrollIntoView({block:`nearest`,inline:`nearest`})}),R(()=>t.tabs,()=>{t.tabs.some(e=>e.id===r.value)||n.value?.close(!1),t.tabs.some(e=>e.id===d.value)||(d.value=``),p.value&&!t.tabs.some(e=>e.id===p.value)&&C()}),(t,r)=>(V(),q(W,null,[K(`div`,{ref_key:`strip`,ref:c,class:O([`workspace-tabs`,{dim:e.dim}]),role:`tablist`,"aria-label":e.label,onDragover:r[9]||=Z(e=>S(e),[`self`,`stop`]),onDrop:r[10]||=Z(e=>w(e),[`self`,`stop`]),onDragleave:r[11]||=e=>!c.value?.contains(e.relatedTarget)&&(h.value=``)},[(V(!0),q(W,null,J(e.tabs,n=>(V(),q(`div`,{key:n.id,class:O([`workspace-tab`,{selected:n.id===e.activeId,dirty:n.dirty,saving:n.saving,error:n.error,preview:n.preview,dragging:n.id===p.value,"drop-before":n.id===h.value&&!g.value&&n.id!==p.value,"drop-after":n.id===h.value&&g.value&&n.id!==p.value}]),draggable:!e.disabled&&d.value!==n.id,onContextmenu:Z(e=>i(e,n),[`stop`]),onDragstart:Z(e=>b(e,n.id),[`stop`]),onDragover:Z(e=>S(e,n.id),[`stop`]),onDrop:Z(e=>w(e,n.id),[`stop`]),onDragend:C,onMousedown:r[8]||=e=>e.button===1&&e.preventDefault(),onAuxclick:e=>y(e,n.id)},[d.value===n.id?(V(),Y(a,{key:0,modelValue:f.value,"onUpdate:modelValue":r[0]||=e=>f.value=e,class:`tab-rename`,maxlength:`80`,"aria-label":`Название вкладки`,onKeydown:[r[1]||=yn(Z(e=>v(!0),[`prevent`]),[`enter`]),r[2]||=yn(Z(e=>v(!1),[`prevent`,`stop`]),[`esc`])],onBlur:r[3]||=e=>v(!0),onMousedown:r[4]||=Z(()=>{},[`stop`]),onClick:r[5]||=Z(()=>{},[`stop`]),onDblclick:r[6]||=Z(()=>{},[`stop`])},null,8,[`modelValue`])):(V(),q(`button`,{key:1,class:`tab-label`,role:`tab`,"aria-selected":n.id===e.activeId,tabindex:n.id===e.activeId?0:-1,title:n.title??n.label,onFocus:e=>ee(n.id),onClick:e=>H(o).run(s(`select`),{id:n.id}),onDblclick:e=>te(n),onKeydown:e=>T(e,n.id)},[L(t.$slots,`icon`,{tab:n},void 0,!0),K(`span`,EI,j(n.label),1)],40,TI)),K(`button`,{class:`tab-close`,disabled:e.disabled,title:`Закрыть ${n.label}`,"aria-label":`Закрыть ${n.label}`,onClick:Z(e=>H(o).run(s(`close`),{id:n.id}),[`stop`]),onDblclick:r[7]||=Z(()=>{},[`stop`])},[n.dirty||n.saving?(V(),q(`span`,{key:0,class:O([`tab-state`,{spinning:n.saving}]),role:`status`,"aria-label":n.saving?`Сохраняется`:n.error?`Не удалось сохранить`:`Не сохранено`},null,10,OI)):B(``,!0),I(H(oi),{class:O([`close-icon`,{"has-state":n.dirty||n.saving}]),"aria-hidden":`true`},null,8,[`class`])],40,DI)],42,wI))),128))],42,CI),I(Wd,{ref_key:`menu`,ref:n,items:u.value,label:`Действия: ${e.label}`},null,8,[`items`,`label`])],64))}}),[[`__scopeId`,`data-v-5758fb30`]]),AI=M({props:{render:{type:Function,required:!0},args:{type:Object,required:!0}},setup:e=>()=>e.render(e.args)}),jI={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function MI(e,t){return V(),q(`svg`,jI,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 3h6v6m0-6l-7 7M3 21l7-7m-1 7H3v-6`},null,-1)]])}var NI=U({name:`lucide-maximize-2`,render:MI}),PI={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function FI(e,t){return V(),q(`svg`,PI,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`m14 10l7-7m-1 7h-6V4M3 21l7-7m-6 0h6v6`},null,-1)]])}var II=U({name:`lucide-minimize-2`,render:FI}),LI={class:`dock-actions`},RI=[`data-panel`],zI={key:0,class:`dock-empty`},BI=G(M({__name:`DockGroupView`,props:{group:{}},setup(e){let t=e,n=tt(_I),r=X(),i=X(``),a=z(()=>n.layout().focused===t.group.id),o=z(()=>n.layout().maximized===t.group.id),s=z(()=>t.group.panels.map(e=>n.describe(e)));function c(e){let t=r.value.getBoundingClientRect(),n=(e.clientX-t.left)/t.width,i=(e.clientY-t.top)/t.height,a=[[`left`,n],[`right`,1-n],[`top`,i],[`bottom`,1-i]].reduce((e,t)=>t[1]<e[1]?t:e);return a[1]<.25?a[0]:`center`}function l(e){let n=FF.value;return!n||n.group!==t.group.id||e!==`center`&&t.group.panels.length>1}function u(e){if(!FF.value)return;e.preventDefault(),e.stopPropagation(),e.dataTransfer&&(e.dataTransfer.dropEffect=`move`);let t=c(e);i.value=l(t)?t:``}function d(e){let r=FF.value;if(!r)return;e.preventDefault(),e.stopPropagation();let a=c(e);i.value=``,FF.value=void 0,l(a)&&n.update(oI(n.layout(),r.id,{groupId:t.group.id,zone:a}))}function f(e){FF.value&&(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`move`))}function p(e){let r=FF.value;r&&(e.preventDefault(),e.stopPropagation(),FF.value=void 0,n.update(oI(n.layout(),r.id,{groupId:t.group.id,zone:`center`})))}function m(e){!FF.value&&n.acceptsDrop?.(e.dataTransfer)&&(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`copy`),i.value=c(e))}function h(e){if(FF.value||!n.acceptsDrop?.(e.dataTransfer))return;e.preventDefault();let r={groupId:t.group.id,zone:c(e)};i.value=``,n.drop(e,r)}let g=()=>i.value=``;R(()=>FF.value,e=>!e&&g()),Ql(window,`dragend`,g),Ql(window,`drop`,g,!0);function _(e){r.value?.contains(e.relatedTarget)||(i.value=``)}let v={select:e=>n.select(e),close:e=>n.close(e),closeMany:e=>n.closeMany(e),reorder:e=>n.update(sI(n.layout(),t.group.id,e)),rename:(e,t)=>n.rename(e,t),pin:e=>n.pin(e),move:(e,r)=>n.update(oI(n.layout(),e,{groupId:t.group.id,zone:`center`,index:r}))},y=()=>{a.value||n.update(iI(n.layout(),t.group.id))};return(t,c)=>(V(),Y(Wr,{as:`section`,sizing:`flex`,class:O([`dock-group`,{focused:a.value,maximized:o.value}]),"data-group":e.group.id,onPointerdownCapture:y,onFocusin:y},{default:F(()=>[K(`header`,{class:`dock-header`,onDragenterCapture:g,onDragoverCapture:g},[H(n).slots.leading?(V(),Y(H(AI),{key:0,render:H(n).slots.leading,args:{group:e.group}},null,8,[`render`,`args`])):B(``,!0),e.group.panels.length?(V(),Y(kI,{key:1,tabs:s.value,"active-id":e.group.active,label:`Вкладки блока`,group:e.group.id,dim:!a.value,"command-namespace":H(n).commandNamespace,"project-id":H(n).projectId,"command-handlers":v,actions:H(n).tabActions,"close-saved":``},{icon:F(({tab:e})=>[H(n).slots.icon?(V(),Y(H(AI),{key:0,render:H(n).slots.icon,args:{tab:e}},null,8,[`render`,`args`])):B(``,!0)]),_:1},8,[`tabs`,`active-id`,`group`,`dim`,`command-namespace`,`project-id`,`actions`])):(V(),q(`div`,{key:2,class:`dock-fill`,onDragover:f,onDrop:p},null,32)),K(`div`,LI,[H(n).slots.actions?(V(),Y(H(AI),{key:0,render:H(n).slots.actions,args:{group:e.group,activeId:e.group.active}},null,8,[`render`,`args`])):B(``,!0),I(Q,{shape:`icon`,size:`sm`,active:o.value,title:o.value?`Вернуть размер блока`:`Развернуть блок`,"aria-label":o.value?`Вернуть размер блока`:`Развернуть блок`,"aria-pressed":o.value,onClick:c[0]||=t=>H(n).update(H(uI)(H(n).layout(),e.group.id))},{default:F(()=>[o.value?(V(),Y(H(II),{key:0,"aria-hidden":`true`})):(V(),Y(H(NI),{key:1,"aria-hidden":`true`}))]),_:1},8,[`active`,`title`,`aria-label`,`aria-pressed`])])],32),K(`div`,{ref_key:`body`,ref:r,class:`dock-body`,onDragenterCapture:u,onDragoverCapture:u,onDropCapture:d,onDragenter:m,onDragover:m,onDrop:h,onDragleave:_},[(V(!0),q(W,null,J(e.group.panels,t=>(V(),q(W,{key:t},[t===e.group.active?(V(),q(`div`,{key:0,class:`dock-panel`,"data-panel":t},[H(n).slots.panel?(V(),Y(H(AI),{key:0,render:H(n).slots.panel,args:{id:t,group:e.group.id,focused:a.value}},null,8,[`render`,`args`])):B(``,!0)],8,RI)):B(``,!0)],64))),128)),e.group.panels.length?B(``,!0):(V(),q(`div`,zI,[H(n).slots.empty?(V(),Y(H(AI),{key:0,render:H(n).slots.empty,args:{group:e.group}},null,8,[`render`,`args`])):B(``,!0)])),i.value?(V(),q(`div`,{key:1,class:O([`dock-drop`,i.value]),"aria-hidden":`true`},null,2)):B(``,!0)],544)]),_:1},8,[`class`,`data-group`]))}}),[[`__scopeId`,`data-v-9f15a86a`]]),VI=G(M({name:`DockTree`,__name:`DockTree`,props:{node:{}},setup(e){let t=e,n=tt(_I),r=X(),i=z(()=>t.node.type===`split`?t.node:void 0),a=z(()=>i.value?.children.filter(GF)??[]),o=z(()=>i.value?.direction===`row`),s=z(()=>o.value?140:100),c=e=>i.value.sizes[i.value.children.indexOf(e)]??1/i.value.children.length,l=z(()=>a.value.reduce((e,t)=>e+c(t),0));function u(e,t,r){let o=i.value,c=a.value[e-1],l=a.value[e],u=t[0]+t[1],d=Math.max(s.value,Math.min(t[0]+r,u-s.value)),f=[...o.sizes],p=o.children.indexOf(c),m=o.children.indexOf(l),h=f[p]+f[m];f[p]=h*d/u,f[m]=h-f[p],n.update(dI(n.layout(),o.id,f))}function d(e){let t=r.value.querySelectorAll(`:scope > .dock-cell`),n=o.value?`width`:`height`;return[t[e-1].getBoundingClientRect()[n],t[e].getBoundingClientRect()[n]]}let f=0,p=bI({start:e=>({index:f,origin:o.value?e.clientX:e.clientY,start:d(f)}),move:(e,t)=>u(t.index,t.start,(o.value?e.clientX:e.clientY)-t.origin),cursor:()=>o.value?`col-resize`:`row-resize`});function m(e,t){f=t,p.start(e)}function h(e,t){let n=(o.value?[`ArrowLeft`,`ArrowRight`]:[`ArrowUp`,`ArrowDown`]).indexOf(e.key);n!==-1&&(e.preventDefault(),u(t,d(t),(n?1:-1)*24))}return(t,n)=>{let s=pe(`DockTree`,!0);return e.node.type===`group`?(V(),Y(BI,{key:0,group:e.node},null,8,[`group`])):(V(),q(`div`,{key:1,ref_key:`element`,ref:r,class:O([`dock-split`,i.value.direction])},[(V(!0),q(W,null,J(a.value,(e,t)=>(V(),q(W,{key:e.id},[t?(V(),Y(PF,{key:0,appearance:`gap`,class:O([`dock-sash`,i.value.direction]),orientation:o.value?`vertical`:`horizontal`,"aria-label":o.value?`Ширина блока`:`Высота блока`,tabindex:`0`,onPointerdown:e=>m(e,t),onKeydown:e=>h(e,t)},null,8,[`class`,`orientation`,`aria-label`,`onPointerdown`,`onKeydown`])):B(``,!0),K(`div`,{class:`dock-cell`,style:k({flex:`${c(e)/l.value} 1 0`})},[I(s,{node:e},null,8,[`node`])],4)],64))),128))],2))}}}),[[`__scopeId`,`data-v-3d9d4cee`]]);function HI(e,t,n,r={editor:[],terminal:[]}){let i=VF(e),a=i.flatMap(e=>e.panels),o=i.find(t=>t.id===e.focused)?.active;return[`editor`,`terminal`].map(e=>{let i=a.filter(n=>t(n)===(e===`terminal`)),s=[...r[e].filter(e=>i.includes(e)),...i.filter(t=>!r[e].includes(t))];return{side:e,ids:s,active:o&&s.includes(o)?o:s.includes(n[e])?n[e]:s[0]??``}})}var UI={class:`mobile-dock`},WI=[`inert`,`aria-label`],GI={key:0,class:`tabs`},KI={key:2,class:`trailing`},qI={class:`body`},JI=[`data-panel`],YI={key:0,class:`empty`},XI=G(M({__name:`MobileDock`,props:{surface:{},terminalPanel:{type:Function}},setup(e){let t=e,n=tt(_I),r=z(()=>t.surface===`terminal`),i=X(t.surface===`terminal`);R(()=>t.surface,()=>{i.value=!1});let a=X({editor:``,terminal:``}),o=X({editor:[],terminal:[]}),s=z(()=>HI(n.layout(),t.terminalPanel,a.value,o.value).map(e=>({...e,tabs:e.ids.map(n.describe)})));R(s,e=>{for(let t of e)t.active&&(a.value[t.side]=t.active)},{immediate:!0}),R(()=>t.surface,e=>{if(e===`files`)return;let t=s.value.find(t=>t.side===e);t?.active&&n.update(rI(n.layout(),t.active))},{flush:`post`});let c={select:n.select,close:n.close,closeMany:n.closeMany,rename:n.rename,pin:n.pin,reorder:e=>{let n=e[0]&&t.terminalPanel(e[0])?`terminal`:`editor`;o.value[n]=e}};return(e,a)=>(V(),q(`div`,UI,[(V(!0),q(W,null,J(s.value,e=>(V(),Y(Nn,{key:e.side,name:`mobile-right`,onAfterEnter:a[0]||=e=>i.value=r.value},{default:F(()=>[et(K(`section`,{class:O([`surface`,e.side]),inert:e.side===`editor`&&r.value,"aria-label":e.side===`editor`?`Редактор`:`Терминалы`},[e.tabs.length||e.side===`terminal`?(V(),q(`header`,GI,[H(n).slots.leading?(V(),Y(H(AI),{key:0,render:H(n).slots.leading,args:{group:{role:e.side}}},null,8,[`render`,`args`])):B(``,!0),I(kI,{tabs:e.tabs,"active-id":e.active,label:e.side===`editor`?`Файлы`:`Терминалы`,"project-id":H(n).projectId,"command-namespace":H(n).commandNamespace,"command-handlers":c,actions:H(n).tabActions,"close-saved":``},{icon:F(({tab:e})=>[H(n).slots.icon?(V(),Y(H(AI),{key:0,render:H(n).slots.icon,args:{tab:e}},null,8,[`render`,`args`])):B(``,!0)]),_:1},8,[`tabs`,`active-id`,`label`,`project-id`,`command-namespace`,`actions`]),e.side===`terminal`&&H(n).slots.actions?(V(),Y(H(AI),{key:1,render:H(n).slots.actions,args:{activeId:e.active}},null,8,[`render`,`args`])):B(``,!0),e.side===`terminal`&&H(n).slots.trailing?(V(),q(`div`,KI,[I(H(AI),{render:H(n).slots.trailing,args:{group:{role:e.side}}},null,8,[`render`,`args`])])):B(``,!0)])):B(``,!0),K(`div`,qI,[(V(!0),q(W,null,J(e.ids.filter(t=>t===e.active),r=>(V(),q(`div`,{key:r,class:`panel`,"data-panel":r},[H(n).slots.panel?(V(),Y(H(AI),{key:0,render:H(n).slots.panel,args:{id:r,focused:e.side===`terminal`?i.value:t.surface===`editor`}},null,8,[`render`,`args`])):B(``,!0)],8,JI))),128)),e.ids.length?B(``,!0):(V(),q(`div`,YI,[H(n).slots.empty?(V(),Y(H(AI),{key:0,render:H(n).slots.empty,args:{group:{role:e.side}}},null,8,[`render`,`args`])):B(``,!0)]))])],10,WI),[[Ln,e.side===`editor`||r.value]])]),_:2},1024))),128))]))}}),[[`__scopeId`,`data-v-0f01594b`]]),ZI={key:2,class:`dock-none`},QI=G(M({__name:`DockView`,props:{layout:{},mobile:{type:Boolean},mobileSurface:{},terminalPanel:{type:Function},describe:{type:Function},projectId:{},commandNamespace:{},tabActions:{type:Function},acceptsDrop:{type:Function}},emits:[`update:layout`,`select`,`close`,`closeMany`,`rename`,`pin`,`drop`],setup(e,{emit:t}){let n=e,r=t,i=He();ot(_I,{layout:()=>n.layout,slots:i,get projectId(){return n.projectId},get commandNamespace(){return n.commandNamespace},describe:e=>n.describe(e),tabActions:e=>n.tabActions?.(e)??[],acceptsDrop:e=>n.acceptsDrop?.(e)??!1,update:e=>r(`update:layout`,e),select:e=>r(`select`,e),close:e=>r(`close`,e),closeMany:e=>r(`closeMany`,e),rename:(e,t)=>r(`rename`,e,t),pin:e=>r(`pin`,e),drop:(e,t)=>r(`drop`,e,t)});let a=z(()=>GF(n.layout.root));return Ql(window,`dragend`,()=>FF.value=void 0),Ql(window,`drop`,()=>FF.value=void 0),(t,n)=>(V(),q(`div`,{class:O([`dock`,{mobile:e.mobile}])},[e.mobile&&e.terminalPanel?(V(),Y(XI,{key:0,surface:e.mobileSurface??`editor`,"terminal-panel":e.terminalPanel},null,8,[`surface`,`terminal-panel`])):a.value?(V(),Y(VI,{key:1,node:e.layout.root},null,8,[`node`])):(V(),q(`p`,ZI,`Все блоки скрыты. Включите нужный блок на панели выше.`))],2))}}),[[`__scopeId`,`data-v-d378f904`]]),$I={key:0},eL={class:`process-pid`},tL=G(M({__name:`TerminalCloseDialog`,props:{session:{},busy:{type:Boolean}},emits:[`cancel`,`confirm`],setup(e){let t=e,n=X(),r=P();return R(()=>t.session,async e=>{await Ut(),e&&n.value&&!n.value.element?.open&&n.value.open()}),(t,i)=>e.session?(V(),Y(Kr,{key:0,ref_key:`dialog`,ref:n,class:`close-dialog`,width:`440px`,labelledby:H(r),onCancel:i[2]||=Z(e=>t.$emit(`cancel`),[`prevent`])},{default:F(()=>[I(_,{id:H(r)},{default:F(()=>[...i[3]||=[N(`Прервать процессы и закрыть вкладку?`,-1)]]),_:1},8,[`id`]),K(`p`,null,j(e.session.title)+` · `+j(e.session.activity?.state===`unknown`?`Не удалось определить, простаивает ли терминал.`:`В терминале работают процессы:`),1),e.session.activity?.processes.length?(V(),q(`ul`,$I,[(V(!0),q(W,null,J(e.session.activity.processes,e=>(V(),q(`li`,{key:e.pid},[K(`span`,null,j(e.name),1),K(`span`,eL,`PID `+j(e.pid),1)]))),128))])):B(``,!0),I(xd,null,{default:F(()=>[I(Q,{autofocus:``,disabled:e.busy,onClick:i[0]||=e=>t.$emit(`cancel`)},{default:F(()=>[...i[4]||=[N(`Отмена`,-1)]]),_:1},8,[`disabled`]),I(Q,{tone:`danger`,disabled:e.busy,onClick:i[1]||=e=>t.$emit(`confirm`)},{default:F(()=>[...i[5]||=[N(`Прервать и закрыть`,-1)]]),_:1},8,[`disabled`])]),_:1})]),_:1},8,[`labelledby`])):B(``,!0)}}),[[`__scopeId`,`data-v-bb84bde7`]]),nL=null,rL=Symbol.for(`projector.native-fetch`),iL=globalThis,aL=iL[rL]??(iL[rL]=globalThis.fetch.bind(globalThis));function oL(){return nL}function sL(e){nL=e}function cL(e){try{return new URL(e,window.location.origin).origin===window.location.origin}catch{return!1}}var lL=!1,uL=null;function dL(){return uL??=new Promise(e=>{e(window.prompt(`Projector защищён паролем. Введите пароль доступа:`))}).finally(()=>{uL=null}),uL}async function fL(e,t){let n=typeof e==`string`?e:e instanceof URL?e.href:e.url,r=C(n);if(r!==n&&(e=e instanceof Request?new Request(r,e):r),!cL(typeof e==`string`?e:e instanceof URL?e.href:e.url))return aL(e,t);let i=()=>{let n=new Headers(t?.headers??(e instanceof Request?e.headers:void 0)),r=oL();return r&&n.set(`Authorization`,`Bearer ${r}`),n},a=await aL(e,{...t,headers:i()});if(a.status===401&&a.headers.get(`WWW-Authenticate`)===`Bearer realm="Projector LAN"`){let n=await dL();if(n){sL(n);let r=new Headers(t?.headers);r.set(`Authorization`,`Bearer ${n}`),a=await aL(e,{...t,headers:r})}}return p()&&!lL&&a.status===401&&a.headers.get(`WWW-Authenticate`)===`Session realm="Projector Hub"`&&(lL=!0,location.assign(`/login?next=${encodeURIComponent(location.pathname+location.search+location.hash)}`)),a}var pL,mL=new Map;function hL(){pL?.port.postMessage({type:`release`}),pL?.port.close(),pL=void 0}function gL(){if(!pL){pL=new SharedWorker(new URL(`/assets/shared.worker-DpKROrNH.js`,``+import.meta.url),{type:`module`,name:`projector-terminals-v1`+f()});let e=pL;pL.port.onmessage=t=>{if(pL!==e)return;let n=t.data;if(n.type===`ping`){pL?.port.postMessage({type:`pong`});return}let r=mL.get(n.channel);r&&(n.type===`opened`?r.opened():n.type===`message`?(pL?.port.postMessage({type:`received`,channel:n.channel,length:n.data.length}),r.onmessage?.(new MessageEvent(`message`,{data:n.data}))):n.type===`closed`&&r.ended(n.code,n.code===1006||n.code===1008))},pL.onerror=()=>{if(pL!==e)return;let t=[...mL.values()];hL();for(let e of t)e.ended(1006)},pL.port.start()}return pL.port}var _L=class{readyState=WebSocket.CONNECTING;onopen=null;onmessage=null;onclose=null;fallback;timer;wasOpened=!1;id=crypto.getRandomValues(new Uint32Array(4)).join(`-`);url;constructor(e){this.url=e,mL.set(this.id,this),this.timer=setTimeout(()=>this.ended(1006),8e3);try{gL().postMessage({type:`open`,channel:this.id,url:e.href,projectId:e.searchParams.get(`project`),sessionId:e.searchParams.get(`session`)??void 0})}catch{queueMicrotask(()=>this.ended(1006))}}opened(){this.readyState===WebSocket.CONNECTING&&(clearTimeout(this.timer),this.wasOpened=!0,this.readyState=WebSocket.OPEN,this.onopen?.(new Event(`open`)))}ended(e,t=!0){if(!(this.readyState===WebSocket.CLOSED||this.fallback)){if(clearTimeout(this.timer),this.detach(),!this.wasOpened&&t){console.warn(`Shared terminal transport unavailable; using legacy WebSocket`);let e=this.fallback=new WebSocket(this.url);e.onopen=()=>this.opened(),e.onmessage=e=>this.onmessage?.(e),e.onclose=e=>{this.readyState=WebSocket.CLOSED,this.onclose?.(e)}}else this.readyState=WebSocket.CLOSED,this.onclose?.(new CloseEvent(`close`,{code:e}))}}detach(){pL?.port.postMessage({type:`close`,channel:this.id}),mL.delete(this.id),mL.size||hL()}send(e){this.readyState===WebSocket.OPEN&&(this.fallback?this.fallback.send(e):pL?.port.postMessage({type:`send`,channel:this.id,data:e}))}close(){this.readyState!==WebSocket.CLOSED&&(clearTimeout(this.timer),this.detach(),this.readyState=WebSocket.CLOSED,this.fallback?this.fallback.close():queueMicrotask(()=>this.onclose?.(new CloseEvent(`close`,{code:1005}))))}},vL=typeof SharedWorker<`u`&&new URLSearchParams(location.search).get(`terminalTransport`)!==`legacy`;function yL(e){return e=new URL(C(e)),vL?new _L(e):new WebSocket(e)}globalThis.addEventListener?.(`pagehide`,()=>{for(let e of[...mL.values()])e.ended(1001,!1);hL()});var bL=class extends Error{session;constructor(e,t){super(e),this.session=t}},xL=class{socket;reconnect;delay=500;nextId=0;listeners=new Set;pending=new Map;connecting;cancelConnect;snapshot;projectId;constructor(e){this.projectId=e}subscribe(e){return this.listeners.add(e),this.snapshot&&e(this.snapshot),this.connect().catch(()=>{}),()=>{this.listeners.delete(e),this.release()}}release(){if(this.listeners.size||this.pending.size)return;clearTimeout(this.reconnect),this.reconnect=void 0;let e=this.socket;this.socket=void 0,this.cancelConnect?.(Error(`Подписка на терминалы закрыта`)),e?.close(),SL.get(this.projectId)===this&&SL.delete(this.projectId)}connect(){if(this.socket?.readyState===WebSocket.OPEN)return Promise.resolve();if(this.connecting)return this.connecting;clearTimeout(this.reconnect);let e=new URL(`/api/terminal/control`,location.href);e.protocol=location.protocol===`https:`?`wss:`:`ws:`,e.searchParams.set(`project`,this.projectId);let t=oL();t&&e.searchParams.set(`token`,t);let n=this.socket=yL(e);return this.connecting=new Promise((e,t)=>{let r=setTimeout(()=>{t(Error(`Терминалы не ответили`)),n.close()},1e4);this.cancelConnect=t,n.onopen=()=>{clearTimeout(r),this.delay=500,e()},n.onmessage=e=>{if(this.socket!==n)return;let t=JSON.parse(e.data);if(t.type===`sessions`){this.snapshot=t.sessions;for(let e of this.listeners)e(t.sessions)}else if(t.type===`response`){let e=this.pending.get(t.id);if(!e)return;clearTimeout(e.timer),this.pending.delete(t.id),t.data.error?e.reject(new bL(t.data.error,t.data.session)):e.resolve(t.data),this.release()}},n.onclose=e=>{if(clearTimeout(r),t(Error(`Соединение с терминалами потеряно`)),this.socket===n){this.socket=void 0,this.snapshot=void 0;for(let e of this.pending.values())clearTimeout(e.timer),e.reject(Error(`Соединение потеряно; проверьте результат операции`));this.pending.clear(),this.listeners.size&&e.code!==4404?(this.reconnect=setTimeout(()=>void this.connect().catch(()=>{}),this.delay),this.delay=Math.min(this.delay*2,1e4)):this.release()}}}).finally(()=>{this.connecting=void 0,this.cancelConnect=void 0}),this.connecting}async request(e,t){try{await this.connect()}catch(e){throw this.release(),e}let n=new URL(e||`/`,location.href),r=decodeURIComponent(n.pathname.replace(/^\//,``))||void 0,i=++this.nextId;return new Promise((e,a)=>{let o=setTimeout(()=>{this.pending.delete(i),a(Error(`Терминалы не ответили; проверьте результат операции`)),this.release()},15e3);this.pending.set(i,{resolve:t=>e(t),reject:a,timer:o}),this.socket.send(JSON.stringify({id:i,method:t?.method??`GET`,sessionId:r,body:typeof t?.body==`string`?JSON.parse(t.body):void 0,link:n.searchParams.get(`link`)??void 0}))})}},SL=new Map;function CL(e){let t=SL.get(e);return t||(t=new xL(e),SL.set(e,t)),t}var wL=(e,t)=>CL(e).subscribe(t),TL=(e,t=``,n)=>CL(e).request(t,n);function EL(e,t={}){let n=X([]),r=X(!1),i=X(!1),a=X(``),o=X(null),s=new Map,c=1,l=0,u=!1,d,f=[],p;function m(e){return s.has(e.id)||s.set(e.id,c++),e.customTitle??`${e.title} ${s.get(e.id)}`}let h=e=>e.status===`exited`&&!e.stopRequested&&e.exitCode!==0;function g(e){let t=m(e);return e.status===`exited`?`${t} · ${h(e)?`ошибка`:`завершён`} · код ${e.exitCode??`—`}`:e.stopRequested?`${t} · завершаю`:t}function _(e){if(i.value){p=e;return}for(let t of e)m(t);let t=new Map(n.value.map((e,t)=>[e.id,t]));n.value=[...e].sort((e,n)=>(t.get(e.id)??1/0)-(t.get(n.id)??1/0)),r.value=!0}function v(e){let t=n.value.findIndex(t=>t.id===e.id);t!==-1&&(n.value[t]=e)}let y=t=>!u&&t===e();async function b(){if(t.enabled===!1){r.value=!0;return}let n=++l,i=e();try{let e=await TL(i);y(i)&&n===l&&_(e.sessions)}catch(e){y(i)&&(a.value=e instanceof Error?e.message:`Не удалось загрузить терминалы`)}}async function x(r){if(t.enabled===!1)throw Error(`Терминалы недоступны для этого проекта`);i.value=!0,a.value=``;let o=e();try{let e=await TL(o,``,{method:`POST`,body:JSON.stringify({program:r,cols:80,rows:24})});return y(o)?(m(e.session),n.value.some(t=>t.id===e.session.id)||n.value.push(e.session),e.session):void 0}catch(e){a.value=e instanceof Error?e.message:`Не удалось открыть терминал`}finally{i.value=!1}}async function S(t,n){++l;let r=e();a.value=``;try{let{session:e}=await TL(r,`/${encodeURIComponent(t)}`,{method:`POST`,body:JSON.stringify({action:`rename`,title:n})});y(r)&&(++l,v(e))}catch(e){y(r)&&(a.value=e instanceof Error?e.message:`Не удалось переименовать терминал`)}}let C=(t,n)=>TL(e(),`/${encodeURIComponent(t)}`,{method:`POST`,body:JSON.stringify({action:`read`,lines:n})});async function w(r,o){let u=n.value.find(e=>e.id===r);if(!u||i.value)return;++l;let d=n.value.indexOf(u),f=e();i.value=!0,a.value=``;try{let e=await TL(f,`/${encodeURIComponent(u.id)}`,{method:`POST`,body:JSON.stringify({action:o})});if(!y(f))return;++l,o===`stop`?n.value.find(e=>e.id===u.id)?.status!==`exited`&&v(e.session):(t.restarted?.(u.id,e.session.id),n.value=n.value.filter(t=>t.id!==u.id&&t.id!==e.session.id),n.value.splice(Math.min(d,n.value.length),0,e.session),s.set(e.session.id,s.get(u.id)??c++))}catch(e){y(f)&&(a.value=e instanceof Error?e.message:`Не удалось изменить сессию`)}finally{i.value=!1}}async function T(t,r){if(i.value)return;++l,i.value=!0,a.value=``;let s=e();try{if(!r){let{session:e}=await TL(s,`/${encodeURIComponent(t)}`);if(!y(s))return;if(e.activity?.state!==`idle`){o.value=e;return}}if(await TL(s,`/${encodeURIComponent(t)}`,{method:`DELETE`,body:JSON.stringify({confirmation:r})}),!y(s))return;++l,o.value=null,n.value=n.value.filter(e=>e.id!==t)}catch(e){y(s)&&(e instanceof bL&&e.session?o.value=e.session:a.value=e instanceof Error?e.message:`Не удалось удалить сессию`)}finally{i.value=!1}}async function ee(){for(;f.length&&!u;){let e=f[0];if(n.value.some(t=>t.id===e)&&(await T(e),n.value.some(t=>t.id===e)))return;f.shift()}}async function E(e){f=[...e],await ee()}let te=e=>E([e]);function D(){i.value||(f=[],o.value=null)}async function ne(){let e=o.value;e&&(await T(e.id,e.activity?.confirmation),n.value.some(t=>t.id===e.id)||await ee())}async function re(r){let i=r.detail;i.projectId===e()&&(await b(),!u&&n.value.some(e=>e.id===i.sessionId)&&t.started?.(i.sessionId))}R(i,e=>{if(e||!p)return;let t=p;p=void 0,_(t)},{flush:`sync`});function ie(){p=void 0,f=[],o.value=null,n.value=[],r.value=!1,a.value=``,s.clear(),c=1,O()}function O(){if(d?.(),t.enabled===!1){r.value=!0;return}let n=e();d=wL(n,e=>{y(n)&&(++l,_(e))})}return R(e,ie),Lt(()=>{t.enabled===!1?r.value=!0:(window.addEventListener(`projector:terminal-started`,re),O())}),lt(()=>{u=!0,d?.(),window.removeEventListener(`projector:terminal-started`,re)}),{sessions:n,loaded:r,busy:i,error:a,pendingClose:o,nameOf:m,labelOf:g,failed:h,replace:_,update:v,refresh:b,create:x,rename:S,readText:C,stop:e=>w(e,`stop`),restart:e=>w(e,`restart`),close:te,closeMany:E,cancelClose:D,confirmClose:ne}}var DL=Nt(()=>yi(()=>import(`./TerminalView-fWmIbnZn.js`),__vite__mapDeps([2,3,1,4,5,6,7,8,9,10])));function OL(e,t,n){for(let[r,i,a]of[[`next`,`Следующая вкладка`,1],[`previous`,`Предыдущая вкладка`,-1]])e(`ide.workbench.tab.${r}`,i,()=>{let e=t.value,r=e.panels.indexOf(e.active);n(e.panels[(r+a+e.panels.length)%e.panels.length])},()=>(t.value?.panels.length??0)>1,void 0,{description:`Переключает на соседнюю вкладку в блоке с фокусом по порядку полосы вкладок, по кругу.`})}var kL=2e4,AL=1e5;function jL(e,t){return t?`terminal`:e?e.virtual?e.virtual:e.image?`image`:e.archive?`archive`:e.binary?`binary`:e.original!==void 0||e.commit?`diff`:`file`:`unknown`}function ML(e,t){if(e.virtual){let n=fi(e.key),r=t.get(e.virtual)?.read?.(e.params??{},e.content);return n||r?{text:n?.text??r?.text,note:n?.note??r?.note}:{note:`Служебная вкладка с интерфейсом: у неё нет текстового содержимого`}}if(e.image)return{note:`Изображение: текстового содержимого нет`};if(e.archive)return{text:e.archive.entries.map(e=>`${e.type}\t${e.size}\t${e.path}`).join(`
|
|
96
|
+
`),note:`Архив ${e.archive.format}${e.archive.truncated?`, список усечён`:``}`};if(e.binary)return{note:`Двоичный файл: текстового содержимого нет`};let n=e.draft??e.content;return e.original===void 0?{text:n}:{text:`--- было\n${e.original}\n--- стало\n${n}`,note:`Сравнение версий`}}function NL(e){function t(){let t=e.layout();return e.groups(t).flatMap(n=>n.panels.map(r=>{let i=e.fileOf(r),a=e.terminalOf(r);return{id:r,label:e.label(r),kind:jL(i,a),path:i&&!i.virtual?i.path:void 0,group:n.id,active:n.active===r,focused:t.focused===n.id,hidden:!!n.hidden,dirty:i?e.isDirty(i):void 0,status:a?.status,exitCode:a?.exitCode}}))}e.register(`ide.workbench.tabs.list`,`Список открытых вкладок`,()=>({tabs:t()}),()=>!0,`Только чтение. Возвращает все открытые вкладки: id, название, тип (file, diff, image, terminal, agent и т. д.), путь, блок, признаки active/focused/hidden и несохранённых изменений, статус терминала. id используйте в ide.workbench.tab.read.`),e.register(`ide.workbench.tab.read`,`Прочитать содержимое вкладки`,async n=>{let r=b(n);if(r.id!==void 0&&typeof r.id!=`string`)throw Error(`id должен быть строкой`);if(r.maxChars!==void 0&&typeof r.maxChars!=`number`)throw Error(`maxChars должен быть числом`);if(r.lines!==void 0&&typeof r.lines!=`number`)throw Error(`lines должен быть числом`);let i=e.layout(),a=r.id??e.groups(i).find(e=>e.id===i.focused)?.active,o=t().find(e=>e.id===a);if(!a||!o)throw Error(`Вкладка не найдена: посмотрите ide.workbench.tabs.list`);let s=Math.max(1,Math.min(AL,Math.floor(r.maxChars??kL))),c=e.fileOf(a),l=e.terminalOf(a),u,d,f,p=!1;if(l){let t=await e.readTerminal(l.id,r.lines);({text:u,totalLines:f}=t),p=t.truncated,d=`Текст экрана терминала без цветов; показаны последние строки`}else c&&({text:u,note:d}=ML(c,e.tabTypes));let m=p;return u!==void 0&&u.length>s&&(u=l?u.slice(-s):u.slice(0,s),m=!0),{...o,text:u,note:d,truncated:m,totalLines:f,chars:u?.length}},()=>!0,`Только чтение. Возвращает текстовое представление вкладки: содержимое файла (с несохранённым черновиком), оба варианта diff, список архива или текущий экран и прокрутку терминала (в том числе скрытого). Служебные вкладки и изображения дают только описание. Без id читается активная вкладка блока с фокусом.`,{id:`id вкладки из ide.workbench.tabs.list (необязательно)`,maxChars:`Лимит символов, по умолчанию ${kL}, максимум ${AL}`,lines:`Для терминала: сколько последних строк взять, по умолчанию 200, максимум 2000`})}var PL=[`side`,`stacked`,`editor`,`terminal`];function FL(e){return e===`full`?BF():{root:{type:`group`,id:`g1`,panels:[],active:``,role:`editor`,keepEmpty:!0},focused:`g1`}}function IL(e){let{tabs:t}=e,{capabilities:n}=e,r=()=>FL(e.layout),i=X(r()),a=X(!1),o=e=>t.value.find(t=>t.key===e),s=e=>`terminal:${e}`,c={},l=EL(()=>e.projectId(),{enabled:n.terminals,started:e=>g(s(e)),restarted:(e,t)=>{i.value=cI(i.value,s(e),s(t))}}),u=z(()=>new Map(l.sessions.value.map(e=>[s(e.id),e]))),d=e=>e.startsWith(`terminal:`)?`terminal`:`editor`;function f(t,n){if(e.pending.target){let t=e.pending.target;return e.pending.target=void 0,t}let r=d(t),i=e=>e.panels.some(e=>d(e)===r),a=VF(n),o=a.filter(e=>e.role===r),s=o.find(e=>e.id===n.focused)??o.find(e=>e.id===c[r])??o.find(i)??o[0]??a.find(e=>!e.role&&e.id===n.focused&&i(e))??a.find(e=>!e.role&&i(e));return s?{groupId:s.id,zone:`center`}:{zone:r===`terminal`?`right`:`left`}}function p(){let e=new Set(t.value.map(e=>e.key));i.value=fI(i.value,{role:d,ids:[...e,...u.value.keys()],exists:t=>e.has(t)||u.value.has(t)?!0:t.startsWith(`terminal:`)?!l.loaded.value&&void 0:a.value?void 0:!1,place:f})}R(()=>[t.value.map(e=>e.key).join(`
|
|
97
|
+
`),l.sessions.value.map(e=>e.id).join(`
|
|
98
|
+
`),a.value,l.loaded.value],p,{flush:`sync`,immediate:!0});let m=z(()=>HF(i.value,i.value.focused)),h=z({get:()=>{let e=m.value?.active??``;return o(e)?e:``},set:e=>{e&&g(e)}});function g(t){let n=e.pending.target,r=UF(i.value,t);r&&n&&(n.zone!==`center`||n.groupId!==r.id)?(e.pending.target=void 0,i.value=oI(i.value,t,n)):i.value=r?rI(i.value,t):aI(i.value,t,f(t,i.value));let a=UF(i.value,t);a&&(c[d(t)]=a.id)}async function _(e){let t=await l.create(e);t&&g(s(t.id))}function v(t){let n=o(t);if(n)return{id:t,label:n.virtual?n.path:n.path.split(`/`).at(-1),title:n.virtual?e.tabTypes.get(n.virtual)?.title(n.params??{},n.content)??n.path:n.saveError?`${n.path} · ${n.saveError}`:n.commit?`${n.path} · ${n.parent||`∅`} → ${n.commit.slice(0,7)}`:n.scope&&!pr(n.scope)?n.scope.kind===`commit`?`${n.path} · @${n.scope.rev.slice(0,7)}`:`${n.path} · ${n.scope.from.slice(0,7)} → ${n.scope.to.slice(0,7)}`:`${n.path}${n.original===void 0?``:n.staged?` · HEAD → index`:` · index → рабочий файл`}`,dirty:e.isDirty(n),saving:!!n.saving,error:!!n.saveError,preview:!!n.preview&&!e.isDirty(n)};let r=u.value.get(t);return r?{id:t,label:l.nameOf(r),title:`${l.labelOf(r)}${r.status===`running`?r.activity?.state===`idle`?` · ожидает ввода`:` · есть работающие процессы`:``} · Двойной щелчок: переименовать`,renameable:!0}:{id:t,label:t.startsWith(`terminal:`)?`Терминал…`:t}}function y(t){o(t)?e.selectTab(t):g(t)}function x(t){let n=u.value.get(t);return n?l.close(n.id):e.closeTab(t)}async function S(t){let n=t.filter(e=>o(e));await e.closeManyTabs(n),!n.some(e=>o(e))&&await l.closeMany(t.flatMap(e=>{let t=u.value.get(e);return t?[t.id]:[]}))}function C(e,t){let n=u.value.get(e);n&&l.rename(n.id,t)}let w={editor:`Редактор`,terminal:`Терминалы`};function T(e){if(!e.panels.length)return w[e.role??``]??`Блок`;let t=v(e.active).label;return e.panels.length>1?`${t} +${e.panels.length-1}`:t}let ee=z(()=>VF(i.value).map(e=>({id:e.id,role:e.role,label:T(e),hidden:!!e.hidden}))),E=z(()=>r().root.type===`split`),te=z(()=>{let e=i.value.root;if(e.type!==`split`||e.children.length!==2)return;let[t,n]=e.children;if(t?.type===`group`&&n?.type===`group`&&t.role===`editor`&&n.role===`terminal`){if(n.hidden&&!t.hidden)return`editor`;if(t.hidden&&!n.hidden)return`terminal`;if(!(t.hidden||n.hidden))return e.direction===`row`?`side`:`stacked`}});function D(e){let t=r();if(t.root.type!==`split`)return;let[n,a]=t.root.children;t.root.direction=e===`stacked`?`column`:`row`,e===`editor`&&(a.hidden=!0),e===`terminal`&&(n.hidden=!0);let o=h.value;i.value=t,p(),o&&g(o)}function ne(e){let t=HF(i.value,e);t&&(i.value=lI(i.value,e,!t.hidden))}function re(){let t=h.value;i.value=r(),e.showSidebar(),p(),t&&g(t)}function ie(e){let t=b(e);if(t.id!==void 0&&typeof t.id!=`string`)throw Error(`id должен быть строкой`);return t.id??m.value?.active??``}for(let[t,n,r]of[[`splitRight`,`Разделить вправо`,`right`],[`splitDown`,`Разделить вниз`,`bottom`]])e.register(`ide.workbench.panel.${t}`,n,e=>{let t=ie(e);i.value=oI(i.value,t,{groupId:UF(i.value,t).id,zone:r})},e=>(UF(i.value,ie(e))?.panels.length??0)>1);return OL(e.register,m,y),e.register(`ide.workbench.panel.hideGroup`,`Скрыть блок`,e=>{i.value=lI(i.value,UF(i.value,ie(e)).id,!0)},e=>!!UF(i.value,ie(e))),e.register(`ide.workbench.layout.preset`,`Выбрать раскладку блоков`,e=>{let{preset:t}=b(e);if(!PL.includes(t))throw Error(`preset: ${PL.join(`, `)}`);D(t)},()=>E.value,void 0,{description:`Перестраивает док: side — редактор и терминалы рядом, stacked — терминалы снизу, editor — только редактор, terminal — только терминалы. Вкладки сохраняются.`,arguments:{preset:`string: side | stacked | editor | terminal`}}),e.register(`ide.workbench.layout.group.toggle`,`Показать или скрыть блок`,e=>{let{group:t}=b(e),n=VF(i.value).find(e=>e.id===t||e.role===t);if(!n)throw Error(`group: id блока либо editor или terminal`);ne(n.id)},()=>!0,void 0,{description:`Показывает скрытый блок дока или скрывает видимый; вкладки блока не закрываются.`,arguments:{group:`string: id блока либо роль editor или terminal`}}),e.register(`ide.workbench.layout.reset`,`Сбросить раскладку блоков`,re,()=>!0),e.register(`ide.workbench.terminal.new`,`Новый терминал`,async e=>{let{program:t=`shell`}=b(e);if(typeof t!=`string`||!t.trim())throw Error(`program: непустая строка`);await _(t)},()=>!l.busy.value,`terminals`,{description:`Создаёт терминальную сессию в проекте и показывает её вкладку.`,arguments:{program:`string (необязательно): shell или id терминальной программы агента; по умолчанию shell`}}),NL({layout:()=>i.value,groups:VF,fileOf:o,tabTypes:e.tabTypes,terminalOf:e=>u.value.get(e),label:e=>v(e).label,isDirty:e.isDirty,readTerminal:l.readText,register:(t,n,r,i,a,o)=>e.register(t,n,r,i,void 0,{description:a,arguments:o})}),{layout:i,restoringSession:a,terminals:l,terminalPanels:u,fileOf:o,focusedGroup:m,activeKey:h,revealPanel:g,initialLayout:r,reconcileLayout:p,describePanel:v,selectPanel:y,closePanel:x,closeManyPanels:S,renamePanel:C,layoutGroups:ee,currentPreset:te,presetsAvailable:E}}var LL={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function RL(e,t){return V(),q(`svg`,LL,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`rect`,{width:`18`,height:`7`,x:`3`,y:`3`,rx:`1`}),K(`rect`,{width:`9`,height:`7`,x:`3`,y:`14`,rx:`1`}),K(`rect`,{width:`5`,height:`7`,x:`16`,y:`14`,rx:`1`})],-1)]])}var zL=U({name:`lucide-layout-template`,render:RL}),BL={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function VL(e,t){return V(),q(`svg`,BL,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`}),K(`path`,{d:`M9 3v18`})],-1)]])}var HL=U({name:`lucide-panel-left`,render:VL}),UL={key:0,class:`presets`,role:`group`,"aria-label":`Готовые раскладки`},WL=[`aria-pressed`,`onClick`],GL={class:`stage`},KL={key:0,class:`editor`},qL={key:1,class:`terminal`},JL={class:`name`},YL={class:`caption u-truncate`},XL=G(M({__name:`LayoutMenu`,props:{groups:{},preset:{},presetsAvailable:{type:Boolean},sidebarHidden:{type:Boolean}},emits:[`command`],setup(e,{emit:t}){let n=e,r=t,i={side:{title:`Рядом`,caption:`Редактор и терминалы`},stacked:{title:`Снизу`,caption:`Терминалы под редактором`},editor:{title:`Редактор`,caption:`Только файлы`},terminal:{title:`Терминалы`,caption:`Только сессии`}},a={editor:`Редактор`,terminal:`Терминалы`},o=mu({anchor:`right`,initialFocus:[`.preset.active`,`.preset`,`.block`],horizontalArrows:!0}),{open:s,toggle:c,close:l}=o,u=z(()=>n.groups.filter(e=>e.role));function d(e,t,n=!1){r(`command`,e,t),n||l()}return(t,n)=>(V(),q(W,null,[K(`span`,{ref:H(o).trigger,class:`layout-trigger`},[I(Q,{shape:`icon`,size:`sm`,title:`Раскладка`,"aria-label":`Раскладка`,"aria-haspopup":`dialog`,"aria-expanded":H(s),"aria-controls":H(s)?H(o).id:void 0,onClick:n[0]||=e=>H(c)()},{default:F(()=>[I(H(zL),{"aria-hidden":`true`})]),_:1},8,[`aria-expanded`,`aria-controls`])],512),I(kl,{menu:H(o),label:`Управление раскладкой`,gap:`var(--sp-2)`},{default:F(()=>[I(pl,{class:`island-head`,"aria-label":`Закрыть`,onClick:n[1]||=e=>H(c)(!1)},{default:F(()=>[n[4]||=K(`span`,null,`Раскладка`,-1),I(H(zL),{"aria-hidden":`true`})]),_:1}),e.presetsAvailable?(V(),q(`div`,UL,[(V(!0),q(W,null,J(H(PL),t=>(V(),q(`button`,{key:t,class:O([`preset`,{active:e.preset===t}]),"aria-pressed":e.preset===t,"data-command":`ide.workbench.layout.preset`,onClick:e=>d(`ide.workbench.layout.preset`,{preset:t})},[K(`span`,{class:O([`diagram`,`is-${t}`]),"aria-hidden":`true`},[n[5]||=K(`i`,{class:`side`},null,-1),K(`span`,GL,[t===`terminal`?B(``,!0):(V(),q(`i`,KL)),t===`editor`?B(``,!0):(V(),q(`i`,qL))])],2),K(`span`,JL,j(i[t].title),1),K(`span`,YL,j(i[t].caption),1)],10,WL))),128))])):B(``,!0),I(ml,{flow:`flex`,gap:`none`,class:`blocks`,role:`group`,"aria-label":`Блоки`},{default:F(()=>[I(ts,{fill:!1,tone:e.sidebarHidden?`muted`:void 0,class:O([`block`,{off:e.sidebarHidden}]),"aria-pressed":!e.sidebarHidden,"data-command":`ide.workbench.sidebar.toggle`,onClick:n[2]||=e=>d(`ide.workbench.sidebar.toggle`,void 0,!0)},{default:F(()=>[I(H(HL),{"aria-hidden":`true`}),I(gl,{grow:!1,title:`Боковая панель`,description:e.sidebarHidden?`скрыта`:`показана`},null,8,[`description`])]),_:1},8,[`tone`,`class`,`aria-pressed`]),(V(!0),q(W,null,J(u.value,e=>(V(),Y(ts,{fill:!1,tone:e.hidden?`muted`:void 0,key:e.id,class:O([`block`,{off:e.hidden}]),"aria-pressed":!e.hidden,"data-command":`ide.workbench.layout.group.toggle`,onClick:t=>d(`ide.workbench.layout.group.toggle`,{group:e.id},!0)},{default:F(()=>[(V(),Y(qe(e.hidden?H(zP):H(IP)),{"aria-hidden":`true`})),I(gl,{grow:!1,title:a[e.role]??e.label,description:e.hidden?`скрыт`:e.label===a[e.role]?`показан`:e.label},null,8,[`title`,`description`])]),_:2},1032,[`tone`,`class`,`aria-pressed`,`onClick`]))),128))]),_:1}),I(ts,{gap:2,fill:!1,tone:`muted`,class:`reset`,"data-command":`ide.workbench.layout.reset`,onClick:n[3]||=e=>d(`ide.workbench.layout.reset`)},{default:F(()=>[I(H(fd),{"aria-hidden":`true`}),n[6]||=N(`Сбросить раскладку `,-1)]),_:1})]),_:1},8,[`menu`])],64))}}),[[`__scopeId`,`data-v-550bbdcd`]]),ZL={class:`toolbar`,role:`toolbar`,"aria-label":`Блоки и терминалы`},QL={key:0,class:`toolbar-error u-truncate`,role:`alert`},$L=G(M({__name:`WorkbenchToolbar`,props:{capabilities:{},mobile:{type:Boolean},sidebarHidden:{type:Boolean},terminalsBusy:{type:Boolean},terminalsError:{},layoutGroups:{},preset:{},presetsAvailable:{type:Boolean}},emits:[`command`],setup(e,{emit:t}){let n=t;return(t,r)=>(V(),q(`div`,ZL,[L(t.$slots,`terminal-status`,{},void 0,!0),e.terminalsError?(V(),q(`p`,QL,j(e.terminalsError),1)):B(``,!0),r[1]||=K(`div`,{class:`toolbar-spacer`},null,-1),L(t.$slots,`terminal-actions`,{},void 0,!0),e.mobile?B(``,!0):(V(),Y(XL,{key:1,groups:e.layoutGroups,preset:e.preset,"presets-available":e.presetsAvailable,"sidebar-hidden":e.sidebarHidden,onCommand:r[0]||=(e,t)=>n(`command`,e,t)},null,8,[`groups`,`preset`,`presets-available`,`sidebar-hidden`]))]))}}),[[`__scopeId`,`data-v-24e873dd`]]),eR={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function tR(e,t){return V(),q(`svg`,eR,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Zm0 11a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1ZM3 5a2 2 0 0 0 2 2h3`}),K(`path`,{d:`M3 3v13a2 2 0 0 0 2 2h3`})],-1)]])}var nR=U({name:`lucide-folder-tree`,render:tR}),rR={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function iR(e,t){return V(),q(`svg`,rR,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`}),K(`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5m-10 4.5L8 15l2 2.5m4-5l2 2.5l-2 2.5`})],-1)]])}var aR=U({name:`lucide-file-code`,render:iR}),oR={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function sR(e,t){return V(),q(`svg`,oR,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3M3 16h3a2 2 0 0 1 2 2v3m8 0v-3a2 2 0 0 1 2-2h3`},null,-1)]])}var cR=U({name:`lucide-minimize`,render:sR}),lR={class:`mobile-surfaces`,"aria-label":`Поверхности проекта`},uR=[`aria-pressed`,`aria-label`,`onClick`],dR={key:0,class:`pill-divider`,"aria-hidden":`true`},fR=[`aria-pressed`,`aria-label`],pR=G(M({__name:`MobileSurfaces`,props:{terminals:{type:Boolean},surface:{}},emits:[`command`],setup(e){let t=e,n=Au(),{fullscreen:r}=Ou(),i=z(()=>[{id:`files`,title:`Файлы`,icon:nR},{id:`editor`,title:`Редактор`,icon:aR},...t.terminals?[{id:`terminal`,title:`Терминалы`,icon:nT}]:[]]);return(t,a)=>(V(),q(`nav`,lR,[(V(!0),q(W,null,J(i.value,n=>(V(),q(`button`,{key:n.id,class:O([`surface-tab`,{active:e.surface===n.id}]),"aria-pressed":e.surface===n.id,"aria-label":n.title,"data-command":`ide.workbench.mobile.surface.show`,onClick:e=>t.$emit(`command`,`ide.workbench.mobile.surface.show`,{surface:n.id})},[(V(),Y(qe(n.icon),{"aria-hidden":`true`})),K(`span`,null,j(n.title),1)],10,uR))),128)),H(n)?(V(),q(`span`,dR)):B(``,!0),H(n)?(V(),q(`button`,{key:1,class:O([`surface-tab action`,{active:H(r)}]),"aria-pressed":H(r),"aria-label":H(r)?`Выйти из полного экрана`:`На весь экран`,title:`Полноэкранный режим`,"data-command":`ide.workbench.fullscreen.toggle`,onClick:a[0]||=e=>t.$emit(`command`,`ide.workbench.fullscreen.toggle`)},[(V(),Y(qe(H(r)?H(cR):H(aee)),{"aria-hidden":`true`}))],10,fR)):B(``,!0)]))}}),[[`__scopeId`,`data-v-263f8191`]]);function mR(e){let{commands:t,target:n,busy:r}=e,{git:i}=e.overview,a=z(()=>i.value.changes.filter(e=>e.index!==` `&&e.index!==`?`)),o=z(()=>i.value.changes.filter(e=>e.worktree!==` `));function s(e){let t=b(e);if(t.path!==void 0&&typeof t.path!=`string`)throw Error(`path должен быть строкой`);if(t.staged!==void 0&&typeof t.staged!=`boolean`)throw Error(`staged должен быть boolean`);return{path:t.path??n.value.path,staged:t.staged??n.value.staged,confirm:t.confirm===!0,pinned:t.pinned===!0}}function c(e){return i.value.changes.find(t=>t.path===s(e).path)}function l(e,t){let{path:n}=s(e);return(t?a.value:o.value).filter(e=>!n||e.path===n||e.path.startsWith(`${n}/`))}let u=e=>e.index===`U`||e.worktree===`U`||[`AA`,`DD`].includes(e.index+e.worktree);for(let[n,i]of[[`openDiff`,`Открыть изменения`],[`openFile`,`Открыть файл`],[`stage`,`Отметить Staged`],[`unstage`,`Убрать из Staged`],[`discard`,`Откатить рабочие изменения…`]])t.scope.registerCommand({id:`ide.git.${n}`,title:i,enabled:e=>{if(r.value)return!1;if(n===`stage`||n===`unstage`||n===`discard`){let t=l(e,n===`unstage`);return!!t.length&&(n===`stage`||t.every(e=>!u(e)))}let t=c(e);return t?n===`openFile`?t.worktree!==`D`&&(t.index!==`D`||t.worktree!==` `):n===`openDiff`?!u(t)&&(s(e).staged?![` `,`?`].includes(t.index):t.worktree!==` `):t.worktree!==` `&&!u(t):!1},run:async t=>{let{path:i,staged:a,confirm:o,pinned:c}=s(t);if(n===`openFile`||n===`openDiff`)return e.open(i,n===`openDiff`?a:void 0,c);let u=l(t,n===`unstage`),d=u.map(e=>e.path);if(n!==`discard`||o||window.confirm(d.length>1?`Откатить рабочие изменения: ${d.length} файлов${i?` в ${i}`:``}? Новые файлы будут перемещены в .projector-trash, несохранённые черновики удалены.`:u[0]?.index===`?`?`Убрать новый файл ${d[0]}? Он будет перемещён в .projector-trash.`:`Откатить рабочие изменения ${d[0]} до подготовленной версии? Несохранённый черновик тоже будет удалён.`)){r.value=!0;try{await e.prepare(n,d),e.invalidate(),await e.overview.mutate(n,d),await e.applied(n,d)}finally{r.value=!1}}}});return t.scope.registerCommand({id:`ide.git.reveal`,title:`Показать в проекте`,description:`Открывает боковую панель «Файлы» и показывает в дереве проекта файл или папку из списка изменений Git, раскрывая родительские каталоги.`,arguments:{path:`Путь записи внутри проекта; без аргумента — запись из контекстного меню`},enabled:e=>!r.value&&!!s(e).path,run:t=>e.reveal(s(t).path)}),{gitChange:c,stagedChanges:a,workingChanges:o}}var hR=G(M({__name:`EntryDialog`,emits:[`submit`,`cancel`],setup(e,{expose:n,emit:r}){let o=r,s=P(),c=P(),l=X(),u=X(),d=X(``),f=X(``),p=X(``),m=X(!1),h=X(``),g=X(!1),v=null;async function y(e){v=document.activeElement,d.value=e.title,f.value=e.value??``,p.value=e.description??``,m.value=!!e.confirm,h.value=``,g.value=!1,l.value?.open(),await Ut(),u.value?.focus(),u.value?.select()}function b(){l.value?.close(),v?.isConnected&&v.focus()}function x(){g.value||!m.value&&!f.value.trim()||(g.value=!0,o(`submit`,f.value.trim()))}function S(e){h.value=e,g.value=!1}return n({open:y,close:b,fail:S}),(e,n)=>(V(),Y(ht,{to:`body`},[I(Kr,{ref_key:`dialog`,ref:l,labelledby:H(s),onCancel:n[2]||=e=>g.value?e.preventDefault():o(`cancel`)},{default:F(()=>[K(`form`,{onSubmit:Z(x,[`prevent`])},[I(_,{id:H(s)},{default:F(()=>[N(j(d.value),1)]),_:1},8,[`id`]),p.value?(V(),Y(i,{key:0,size:`xs`,"space-after":3,wrap:``},{default:F(()=>[N(j(p.value),1)]),_:1})):B(``,!0),m.value?B(``,!0):(V(),Y(a,{key:1,ref_key:`input`,ref:u,id:H(c),modelValue:f.value,"onUpdate:modelValue":n[0]||=e=>f.value=e,"aria-label":d.value,disabled:g.value,required:``,maxlength:`255`},null,8,[`id`,`modelValue`,`aria-label`,`disabled`])),h.value?(V(),Y(t,{key:2,tone:`danger`,size:`xs`,class:`error`,role:`alert`},{default:F(()=>[N(j(h.value),1)]),_:1})):B(``,!0),I(xd,null,{default:F(()=>[I(Q,{disabled:g.value,onClick:n[1]||=e=>{b(),o(`cancel`)}},{default:F(()=>[...n[3]||=[N(` Отмена `,-1)]]),_:1},8,[`disabled`]),I(Q,{type:`submit`,appearance:m.value?`outline`:`solid`,tone:m.value?`danger`:`neutral`,disabled:g.value||!m.value&&!f.value.trim()},{default:F(()=>[N(j(g.value?`Выполняется…`:m.value?`Удалить`:`Сохранить`),1)]),_:1},8,[`appearance`,`tone`,`disabled`])]),_:1})],32)]),_:1},8,[`labelledby`])]))}}),[[`__scopeId`,`data-v-7a8417f6`]]);function gR(e){let{branches:t,open:n,target:r,busy:i,ask:a}=e,{state:o}=t,s=c(e.commands.scope),l=e=>{let t=o.value.branches.find(t=>t.name===e);if(!t)throw Error(`Ветка не найдена: ${String(e)}`);return t},u=e=>l(b(e).name??r.value);async function d(n,r,a){i.value=!0;try{a&&await e.prepare(`checkout`,[]),await t.mutate(n,r),a&&await e.applied(`checkout`,[]),await e.reload()}finally{i.value=!1}}let f=()=>!i.value,p={name:`Имя ветки (для удалённой — вместе с remote, например origin/main)`};s(`ide.git.branch.toggle`,`Показать список веток`,`Открывает или закрывает выбор ветки.`,()=>{n.value=!n.value}),s(`ide.git.branch.refresh`,`Обновить список веток`,`Перечитывает локальные и удалённые ветки.`,()=>t.load()),s(`ide.git.branch.list`,`Список веток`,`Возвращает ветки с upstream, ahead/behind и последним коммитом.`,async()=>(await t.load(),o.value)),s(`ide.git.branch.checkout`,`Переключить ветку`,`Переключает рабочую папку на ветку; для удалённой создаёт локальную с отслеживанием.`,async e=>{let t=u(e);t.current||await d(`checkout`,{name:t.name},!0),n.value=!1},p,e=>f()&&(!b(e).name||!!o.value.branches.length)),s(`ide.git.branch.create`,`Создать ветку…`,`Создаёт ветку от HEAD или от указанной ветки/коммита и переключается на неё. Без name спрашивает имя.`,async t=>{let n=b(t),i=m(n,`from`)??(n.fromTarget===!0?r.value:void 0),o=e=>d(`create`,{name:e,from:i,checkout:n.checkout!==!1&&void 0},n.checkout!==!1),s=m(n,`name`);if(s)return o(s);a(`Новая ветка`,``,i?`Начало: ${i}`:`Начало: ${e.label()}`,o)},{name:`Имя новой ветки`,from:`Ветка или хеш коммита, от которого начать; по умолчанию HEAD`,checkout:`false — не переключаться на новую ветку`},f),s(`ide.git.branch.rename`,`Переименовать ветку…`,`Переименовывает локальную ветку. Без newName спрашивает имя.`,async e=>{let t=b(e),n=u(e),r=e=>d(`rename`,{name:n.name,newName:e},!1),i=m(t,`newName`);if(i)return r(i);a(`Переименовать ветку`,n.name,n.name,r)},{...p,newName:`Новое имя`},e=>f()&&(b(e).name?!0:r.value!==``)),s(`ide.git.branch.delete`,`Удалить ветку…`,`Удаляет локальную ветку. Неслитую ветку удаляет только с force: true.`,async e=>{let t=b(e),n=u(e),r=t.force===!0;if(t.confirm!==!0){let e=n.merged?`Удалить ветку ${n.name}?`:`Ветка ${n.name} не слита в текущую. Удалить вместе с её коммитами?`;if(!window.confirm(e))return;r=!n.merged}await d(`delete`,{name:n.name,force:r},!1)},{...p,force:`true — удалить неслитую ветку`,confirm:`true — без вопроса`},f)}function _R(e){let{branches:t,busy:n}=e,{state:r}=t,i=c(e.commands.scope),a=X(``),o=()=>r.value.branches.find(e=>e.current),s=()=>!n.value&&r.value.available&&!r.value.detached,l=()=>s()&&!!r.value.remotes.length&&!!o(),u={action:`Действие синхронизации: fetch, pull или push`};async function d(r){n.value=!0,a.value=r;try{r===`pull`&&await e.prepare(`checkout`,[]);let n=await t.sync(r);return r===`pull`&&await e.applied(`checkout`,[]),await e.reload(),e.notify?.(n.message),n}finally{a.value=``,n.value=!1}}return i(`ide.git.sync.fetch`,`Получить ссылки из удалённого репозитория`,`Выполняет fetch --prune для текущей ветки и обновляет список веток и историю.`,()=>d(`fetch`),u,l),i(`ide.git.sync.pull`,`Стянуть изменения (только fast-forward)`,`Забирает коммиты upstream. Если ветки разошлись, Git отказывается и ничего не сливает; открытые файлы сохраняются до операции.`,()=>d(`pull`),u,()=>{let e=o();return l()&&!!e?.upstream&&!e.gone}),i(`ide.git.sync.push`,`Отправить коммиты в upstream`,`Отправляет текущую ветку. Без upstream публикует её в origin или первый доступный remote и назначает его upstream.`,()=>d(`push`),u,l),{perform:d,syncing:a}}var vR={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function yR(e,t){return V(),q(`svg`,vR,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M12 13v8m-8-6.101A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242`}),K(`path`,{d:`m8 17l4-4l4 4`})],-1)]])}var bR=U({name:`lucide-cloud-upload`,render:yR}),xR={class:`branch-bar`,"aria-label":`Ветки Git`},SR={class:`bar`},CR=[`aria-expanded`,`title`],wR={class:`name u-truncate`},TR={key:0,class:`sync`,title:`Относительно upstream`},ER={key:0,class:`picker`},DR=[`disabled`,`title`,`onClick`,`onFocus`,`onContextmenu`,`onKeydown`],OR={key:1,class:`mark`},kR={class:`label u-truncate`},AR={key:2,class:`gone`,title:`Upstream удалён`},jR={key:3,class:`sync`},MR={class:`when`},NR=G(M({__name:`GitBranchBar`,props:yt({branches:{},commands:{},revision:{},prepare:{type:Function},applied:{type:Function},reload:{type:Function}},{open:{type:Boolean,default:!1},openModifiers:{},target:{default:``},targetModifiers:{}}),emits:[`update:open`,`update:target`],setup(e){let n=e,r=Te(e,`open`),i=Te(e,`target`),{state:o,error:s,loading:c}=n.branches;ai(()=>s.value);let l=X(``),u=X(),d=X(),f,p=X(Date.now()),m=setInterval(()=>p.value=Date.now(),6e4);lt(()=>clearInterval(m));let h=z(()=>o.value.branches.find(e=>e.current)),g=z(()=>o.value.detached?`HEAD · ${o.value.current}`:o.value.current),_=z(()=>{let e=l.value.trim().toLowerCase(),t=o.value.branches.filter(t=>t.name.toLowerCase().includes(e));return[{label:`Локальные`,rows:t.filter(e=>e.kind===`local`)},{label:`Удалённые`,rows:t.filter(e=>e.kind===`remote`)}].filter(e=>e.rows.length)});function v(e,t,n,r){f=r,d.value?.open({title:e,value:t,description:n})}async function y(e){try{await f?.(e),d.value?.close()}catch(e){d.value?.fail(e instanceof Error?e.message:`Не удалось выполнить действие`)}}let b=X(!1);gR({branches:n.branches,commands:n.commands,prepare:n.prepare,applied:n.applied,reload:n.reload,open:r,target:i,busy:b,label:()=>g.value,ask:v});let x=X(),S=X(),{syncing:C}=_R({branches:n.branches,commands:n.commands,prepare:n.prepare,applied:n.applied,reload:n.reload,busy:b,notify:e=>Gr(S.value,e)}),w=z(()=>o.value.available&&o.value.remotes.length>0),T=z(()=>w.value&&!o.value.detached&&o.value.branches.some(e=>e.current)),ee=z(()=>{let e=h.value;if(T.value&&e){if(!e.upstream||e.gone)return{action:`push`,icon:bR,title:e.gone?`Upstream удалён: опубликовать ветку заново`:`Опубликовать ветку ${e.name}`};if(!(e.ahead>0&&e.behind>0)){if(e.behind>0)return{action:`pull`,icon:qN,title:`Стянуть изменения: ↓${e.behind}`};if(e.ahead>0)return{action:`push`,icon:vj,title:`Отправить коммиты: ↑${e.ahead}`}}}}),E=z(()=>{let{item:e}=n.commands,t=h.value,r=e(`ide.git.sync.pull`),i=e(`ide.git.sync.push`);return[e(`ide.git.sync.fetch`),{...r,label:t?.behind?`Стянуть изменения`:r.label,hint:t?.behind?{text:`↓${t.behind}`}:void 0},{...i,label:t&&(!t.upstream||t.gone)?`Опубликовать ветку`:i.label,hint:t?.ahead?{text:`↑${t.ahead}`}:void 0}]});function te(e){n.commands.scope.activate(),x.value?.open(e)}function D(){let e=ee.value?.action;e&&n.commands.run(`ide.git.sync.${e}`)}let ne=z(()=>{let e=o.value.branches.find(e=>e.name===i.value),t={name:i.value},{item:r}=n.commands;return[r(`ide.git.branch.checkout`,t),r(`ide.git.branch.create`,{fromTarget:!0},{label:`Создать ветку отсюда…`}),...e?.kind===`local`&&!e.current?[r(`ide.git.branch.rename`,t,{separator:!0}),r(`ide.git.branch.delete`,t,{danger:!0})]:e?.kind===`local`?[r(`ide.git.branch.rename`,t,{separator:!0})]:[]]});function re(e,t){i.value=t,n.commands.scope.activate(),u.value?.open(e)}let ie=e=>[e.ahead?`↑${e.ahead}`:``,e.behind?`↓${e.behind}`:``].filter(Boolean).join(` `);return R(()=>n.revision,()=>void n.branches.load(),{immediate:!0}),R(r,e=>{e?n.branches.load():l.value=``}),(n,f)=>(V(),q(`section`,xR,[K(`div`,SR,[K(`button`,{class:`current`,"aria-expanded":r.value,title:H(o).detached?`HEAD отсоединён от ветки`:`Сменить ветку`,"data-command":`ide.git.branch.toggle`,onClick:f[0]||=t=>e.commands.run(`ide.git.branch.toggle`)},[I(H(_A),{class:`icon`,"aria-hidden":`true`}),K(`span`,wR,j(g.value),1),h.value&&ie(h.value)?(V(),q(`span`,TR,j(ie(h.value)),1)):B(``,!0),I(H(fl),{class:O([`chevron`,{open:r.value}]),"aria-hidden":`true`},null,8,[`class`])],8,CR),T.value?(V(),q(`div`,{key:0,ref_key:`syncAnchor`,ref:S,class:`remote-actions`,role:`group`,"aria-label":`Синхронизация с удалённым репозиторием`},[ee.value?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,busy:H(C)===ee.value.action,disabled:b.value,title:ee.value.title,"aria-label":ee.value.title,"data-command":`ide.git.sync.${ee.value.action}`,onClick:D},{default:F(()=>[(V(),Y(qe(ee.value.icon),{"aria-hidden":`true`}))]),_:1},8,[`busy`,`disabled`,`title`,`aria-label`,`data-command`])):B(``,!0),I(Q,{shape:`icon`,size:`sm`,busy:!!H(C)&&H(C)!==ee.value?.action,disabled:b.value&&!H(C),title:`Fetch, pull и push`,"aria-label":`Действия с удалённым репозиторием`,onClick:te},{default:F(()=>[I(H(oN),{"aria-hidden":`true`})]),_:1},8,[`busy`,`disabled`])],512)):B(``,!0),I(Q,{shape:`icon`,size:`sm`,title:`Новая ветка`,"aria-label":`Новая ветка`,disabled:b.value,"data-command":`ide.git.branch.create`,onClick:f[1]||=t=>e.commands.run(`ide.git.branch.create`)},{default:F(()=>[I(H(Sg),{"aria-hidden":`true`})]),_:1},8,[`disabled`])]),r.value?(V(),q(`div`,ER,[I(a,{appearance:`inset`,modelValue:l.value,"onUpdate:modelValue":f[2]||=e=>l.value=e,type:`search`,placeholder:`Найти ветку`,"aria-label":`Найти ветку`,onKeydown:f[3]||=Z(()=>{},[`stop`])},null,8,[`modelValue`]),H(c)&&!H(o).branches.length?(V(),Y(t,{key:0,class:`note`,tone:`muted`,size:`xs`,flush:``,role:`status`},{default:F(()=>[...f[4]||=[N(`загрузка…`,-1)]]),_:1})):!_.value.length&&!H(s)?(V(),Y(t,{key:1,class:`note`,tone:`muted`,size:`xs`,flush:``},{default:F(()=>[...f[5]||=[N(`Веток нет.`,-1)]]),_:1})):B(``,!0),(V(!0),q(W,null,J(_.value,t=>(V(),q(W,{key:t.label},[K(`h4`,null,j(t.label),1),K(`ul`,null,[(V(!0),q(W,null,J(t.rows,t=>(V(),q(`li`,{key:t.name},[K(`button`,{class:O([`row`,{current:t.current}]),disabled:b.value,title:`${t.name}\n${t.subject}\n${t.hash}${t.upstream?`\nupstream: ${t.upstream}${t.gone?` (удалён)`:``}`:``}`,onClick:n=>e.commands.run(`ide.git.branch.checkout`,{name:t.name}),onFocus:e=>i.value=t.name,onContextmenu:e=>re(e,t.name),onKeydown:yn(Z(e=>re(e,t.name),[`shift`,`prevent`]),[`f10`])},[t.current?(V(),Y(H(C_),{key:0,class:`mark`,"aria-label":`Текущая ветка`})):(V(),q(`span`,OR)),K(`span`,kR,j(t.name),1),t.gone?(V(),q(`span`,AR,`upstream удалён`)):B(``,!0),ie(t)?(V(),q(`span`,jR,j(ie(t)),1)):B(``,!0),K(`span`,MR,j(H(ci)(t.date,p.value)),1)],42,DR)]))),128))])],64))),128))])):B(``,!0),I(Wd,{ref_key:`menu`,ref:u,items:ne.value,label:`Действия ветки`},null,8,[`items`]),I(Wd,{ref_key:`syncMenu`,ref:x,items:E.value,label:`Синхронизация Git`},null,8,[`items`]),I(hR,{ref_key:`dialog`,ref:d,onSubmit:y},null,512)]))}}),[[`__scopeId`,`data-v-7ba3814f`]]);function PR(e,t,n){let r=e-n;if(r<72)return{height:e,collapse:!0};let i=Math.max(120,t-96);return{height:Math.min(i,Math.max(120,r))}}var FR=24,IR=M({__name:`GitSplitter`,props:{target:{},stack:{}},emits:[`resize`,`collapse`,`reset`],setup(e,{emit:t}){let n=e,r=t,i=X(0),a=X(120),o,s=()=>{i.value=n.target?.offsetHeight??0,a.value=Math.max(120,(n.stack?.offsetHeight??0)-96)};R(()=>[n.target,n.stack],s,{immediate:!0}),su(()=>[n.target,n.stack],()=>{o===void 0&&(o=requestAnimationFrame(()=>{o=void 0,s()}))}),zt(()=>{o!==void 0&&cancelAnimationFrame(o)});let c=()=>({height:n.target?.offsetHeight??0,stack:n.stack?.offsetHeight??0});function l(e,t,n){let i=PR(e,t,n);i.collapse?(u.stop(),r(`collapse`)):r(`resize`,i.height)}let u=bI({start:e=>({height:c().height,y:e.clientY}),move:(e,t)=>l(t.height,c().stack,e.clientY-t.y)}),{dragging:d,start:f}=u;function p(e){if(![`ArrowUp`,`ArrowDown`,`Home`,`End`,`Enter`].includes(e.key))return;e.preventDefault();let{height:t,stack:n}=c();e.key===`Enter`?r(`reset`):e.key===`Home`?r(`collapse`):e.key===`End`?l(t,n,-n):l(t,n,(e.shiftKey?4:1)*FR*(e.key===`ArrowUp`?-1:1))}return(e,t)=>(V(),Y(PF,{appearance:`line`,class:`splitter`,dragging:H(d),"aria-label":`Граница между изменениями и историей`,"aria-valuenow":i.value,"aria-valuemin":`0`,"aria-valuemax":a.value,"aria-valuetext":`${i.value} px`,title:`Потяните, чтобы изменить высоту истории · если сжать до минимума, она сворачивается · двойной клик возвращает размер`,tabindex:`0`,onPointerdown:H(f),onDblclick:t[0]||=e=>r(`reset`),onKeydown:p},null,8,[`dragging`,`aria-valuenow`,`aria-valuemax`,`aria-valuetext`,`onPointerdown`]))}}),LR={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function RR(e,t){return V(),q(`svg`,LR,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 12h14`},null,-1)]])}var zR=U({name:`lucide-minus`,render:RR}),BR=[`data-icon`],VR=[`data-icon`],HR=G(M({__name:`FileIcon`,props:{icon:{},size:{default:16}},setup(e){return(t,n)=>(V(),q(`span`,{class:`file-icon`,"aria-hidden":`true`,"data-icon":e.icon.id,style:k({"--icon-source":`url('${e.icon.src}')`,"--file-icon-size":`${e.size}px`,color:e.icon.color})},[n[1]||=K(`span`,{class:`symbol`},null,-1),e.icon.badge?(V(),q(`span`,{key:0,class:`badge`,"data-icon":e.icon.badge.id,style:k({"--icon-source":`url('${e.icon.badge.src}')`,color:e.icon.badge.color})},[...n[0]||=[K(`span`,{class:`badge-symbol`},null,-1)]],12,VR)):B(``,!0)],12,BR))}}),[[`__scopeId`,`data-v-1715b506`]]),UR={version:1,name:`Projector Fallback`,palette:{muted:`#a6adc8`,blue:`#89b4fa`},icons:{file:{src:`/file-icons/icons/file.svg`,color:`muted`},folder:{src:`/file-icons/icons/folder.svg`,color:`blue`},"folder-open":{src:`/file-icons/icons/folder-open.svg`,color:`blue`}},defaults:{file:`file`,directory:`folder`,expandedDirectory:`folder-open`},rules:[]};function WR(e){let t=Object.values(e).filter(e=>typeof e==`number`);return Object.entries(e).filter(([e,n])=>t.indexOf(+e)===-1).map(([e,t])=>t)}function GR(e,t=`|`){return e.map(e=>_z(e)).join(t)}function KR(e,t){return typeof t==`bigint`?t.toString():t}var qR=class{constructor(e){this._getter=e,this._value=void 0}get value(){let e=this._getter;return e!==void 0&&(this._value=e(),this._getter=void 0),this._value}};function JR(e){return new qR(e)}function YR(e){return e==null}function XR(e){let t=+!!e.startsWith(`^`),n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function ZR(e,t){let n=e/t,r=Math.round(n),i=4*2**-52*Math.max(Math.abs(n),1);return Math.abs(n-r)<i?0:n-r}function QR(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function $R(e){let t=Object.getOwnPropertyDescriptor(e,`shape`);return t?.get?t.get.raw:t?.value}function ez(e){return $R(e._zod.def)??e._zod.def.shape}function tz(e,t,n){Object.defineProperty(e,t,{get(){let e=n();return QR(this,t,e),e},enumerable:!0,configurable:!0})}function nz(e,t,n){t in e?QR(e,t,n):e[t]=n}function rz(e,t,n,r){let i=ez(t);for(let a of n){let n=Object.getOwnPropertyDescriptor(i,a);n.enumerable&&(n.get?tz(e,a,()=>{let e=t._zod.def.shape[a];return r?r(e,a):e}):nz(e,a,r?r(n.value,a):n.value))}}function iz(e,t){for(let n of Reflect.ownKeys(t)){let r=Object.getOwnPropertyDescriptor(t,n);r.enumerable&&(r.get?tz(e,n,()=>t[n]):nz(e,n,r.value))}}function az(...e){let t={};for(let n of e){let e=Object.getOwnPropertyDescriptors(n);Object.assign(t,e)}return Object.defineProperties({},t)}function oz(e){return JSON.stringify(e)}function sz(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}var cz=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function lz(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var uz=JR(()=>{if(oB.jitless||typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function dz(e){if(lz(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return lz(n)!==!1&&Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)!==!1}function fz(e){return dz(e)?{...e}:Array.isArray(e)?[...e]:e instanceof Map?new Map(e):e instanceof Set?new Set(e):e}var pz=new Set([`string`,`number`,`symbol`]);function mz(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function hz(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function gz(e){let t=e;if(!t)return{};if(typeof t==`string`)return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error==`string`?{...t,error:()=>t.error}:t}function _z(e){return typeof e==`bigint`?e.toString()+`n`:typeof e==`string`?`"${e}"`:`${e}`}function vz(e){return Object.keys(e).filter(t=>e[t]._zod.optin!==void 0&&e[t]._zod.optout===`optional`)}var yz={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]},bz={int64:[BigInt(`-9223372036854775808`),BigInt(`9223372036854775807`)],uint64:[BigInt(0),BigInt(`18446744073709551615`)]};function xz(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.pick() cannot be used on object schemas containing refinements`);let i={};return rz(i,e,Sz(e,t)),hz(e,az(n,{shape:i,checks:[]}))}function Sz(e,t){let n=ez(e),r=[];for(let e of Reflect.ownKeys(t)){if(!Object.getOwnPropertyDescriptor(n,e)?.enumerable)throw Error(`Unrecognized key: "${String(e)}"`);t[e]&&r.push(e)}return r}function Cz(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.omit() cannot be used on object schemas containing refinements`);let i=new Set(Sz(e,t)),a={};return rz(a,e,Reflect.ownKeys(ez(e)).filter(e=>!i.has(e))),hz(e,az(n,{shape:a,checks:[]}))}function wz(e,t){if(!dz(t))throw Error(`Invalid input to extend: expected a plain object`);let n=e._zod.def.checks;if(n&&n.length>0){let n=ez(e);for(let e of Reflect.ownKeys(t))if(Object.getOwnPropertyDescriptor(n,e)!==void 0)throw Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}return hz(e,az(e._zod.def,{shape:Tz(e,t)}))}function Tz(e,t){let n={};return rz(n,e,Reflect.ownKeys(ez(e))),iz(n,t),n}function Ez(e,t){if(!dz(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return hz(e,az(e._zod.def,{shape:Tz(e,t)}))}function Dz(e,t){if(!t?._zod?.def)throw Error("Invalid input to merge: expected an object schema. To merge a plain shape, use `.extend()`.");if(e._zod.def.checks?.length)throw Error(`.merge() cannot be used on object schemas containing refinements. Use .safeExtend() instead.`);let n={};return rz(n,e,Reflect.ownKeys(ez(e))),rz(n,t,Reflect.ownKeys(ez(t))),hz(e,az(e._zod.def,{shape:n,get catchall(){return t._zod.def.catchall},checks:t._zod.def.checks??[]}))}function Oz(e,t,n,r=`partial`){let i=t._zod.def.checks;if(i&&i.length>0)throw Error(`.${r}() cannot be used on object schemas containing refinements`);let a=n?new Set(Sz(t,n)):void 0,o={};return rz(o,t,Reflect.ownKeys(ez(t)),e&&((t,n)=>a&&!a.has(n)?t:new e({type:`optional`,innerType:t}))),hz(t,az(t._zod.def,{shape:o,checks:[]}))}function kz(e,t,n){let r=n?new Set(Sz(t,n)):void 0,i={};return rz(i,t,Reflect.ownKeys(ez(t)),(t,n)=>r&&!r.has(n)?t:new e({type:`nonoptional`,innerType:t})),hz(t,az(t._zod.def,{shape:i}))}function Az(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue!==!0)return!0;return!1}function jz(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue===!1)return!0;return!1}function Mz(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function Nz(e){return typeof e==`string`?e:e?.message}function Pz(e,t,n){var r;for(let i=t;i<e.length;i++)(r=e[i]).schema??(r.schema=n)}function Fz(e,t,n){var r;let i=e.inst?._zod?.traits;i?.has(`$ZodType`)&&(i.has(`$ZodCheck`)?(r=e).schema??(r.schema=e.inst):e.schema=e.inst);let a=e.schema===e.inst?void 0:e.schema?._zod.def?.error,o=e.message?e.message:Nz(e.inst?._zod.def?.error?.(e))??Nz(a?.(e))??Nz(t?.error?.(e))??Nz(n.customError?.(e))??Nz(n.localeError?.(e))??`Invalid input`,s={};for(let t of Object.keys(e))t!==`inst`&&t!==`schema`&&t!==`continue`&&t!==`input`&&t!==`__proto__`&&(s[t]=e[t]);return s.path??=[],s.message=o,t?.reportInput&&(s.input=e.input),s}var Iz=/[\uD800-\uDBFF]/;function Lz(e){let t=e.length;if(!Iz.test(e))return t;let n=t;for(let r=0;r<t-1;r++)(e.charCodeAt(r)&64512)==55296&&(e.charCodeAt(r+1)&64512)==56320&&(n--,r++);return n}function Rz(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function zz(e){let t=typeof e;switch(t){case`number`:return Number.isNaN(e)?`nan`:`number`;case`object`:{if(e===null)return`null`;if(Array.isArray(e))return`array`;let t=e;if(t&&Object.getPrototypeOf(t)!==Object.prototype&&`constructor`in t&&t.constructor)return t.constructor.name}}return t}function Bz(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}function Vz(e,t){for(let n in t){let r=Object.getOwnPropertyDescriptor(t,n);r.get?Object.defineProperty(e,n,{...r,enumerable:!1}):Gz(e,n,r.value)}}function Hz(e,t,n,r=!0){return Object.defineProperty(e,t,{configurable:!0,writable:!0,enumerable:r,value:n}),n}function Uz(e,t,n){return Hz(e,t,n,!1)}function Wz(e,t){for(let n in e){let r=e[n];Object.defineProperty(t,n,{configurable:!0,enumerable:!0,get(){return Hz(this,n,r(this))},set(e){Hz(this,n,e)}})}return t}function Gz(e,t,n){Object.defineProperty(e,t,{configurable:!0,get(){return this==null?n:Hz(this,t,n.bind(this))},set(e){Hz(this,t,e)}})}function Kz(e,t){let n=Object.getPrototypeOf(e);return t in n?void 0:n}var qz,Jz=!1,Yz={configurable:!0,get(){Jz=!0}};function Xz(e,t,n){let r=Object.getPrototypeOf(e._zod);t in r&&qz!==e._zod?qz=void 0:(qz=e._zod,Object.defineProperty(r,t,{configurable:!0,get(){Object.defineProperty(this,t,Yz);let e=Jz;Jz=!1;try{let r=n(this);return Jz?delete this[t]:Object.defineProperty(this,t,{configurable:!0,writable:!0,value:r}),Jz||=e,r}catch(n){throw delete this[t],Jz||=e,n}},set(e){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:e})}}))}function Zz(e,t,n,r){let i=Kz(e,t);i&&Object.defineProperty(i,t,{configurable:!0,get(){let e={configurable:!0,writable:!0,enumerable:r,value:void 0};return Object.defineProperty(this,t,e),e.value=n(this),Object.defineProperty(this,t,e),e.value},set(e){Object.defineProperty(this,t,{configurable:!0,writable:!0,enumerable:r,value:e})}})}var Qz=`~constantCatch`;function $z(e){let t=()=>e;return t[Qz]=!0,t}var eB,tB={value:void 0,enumerable:!1},nB=`captureStackTrace`in Error?Error:null;function rB(e){let t=nB;if(t){let n=t.stackTraceLimit;if(typeof n==`number`){try{t.stackTraceLimit=0}catch{return nB=null,new e}try{return new e}finally{t.stackTraceLimit=n}}}return new e}function $(e,t,n,r){let i={};function a(e){this.def=e,this.constr=d,this.traits=new Set}a.prototype=i;let o=n,s=o&&new WeakSet;function c(n,r){if(!n._zod){tB.value=new a(r);try{Object.defineProperty(n,"_zod",tB)}finally{tB.value=void 0}}else if(n._zod.traits.has(e))return;if(n._zod.traits.add(e),t(n,r),s){let e=Object.getPrototypeOf(n),t=n._zod.constr.prototype,r=e;for(;r&&r!==t;)r=Object.getPrototypeOf(r);let i=r??e;s.has(i)||(s.add(i),Vz(i,o))}let i=d.prototype;for(let e in i)Object.prototype.hasOwnProperty.call(i,e)&&(e in n||(n[e]=i[e].bind(n)))}let l=r?.Parent??Object;class u extends l{}Object.defineProperty(u,"name",{value:e});function d(e){let t=r?.Parent?rB(u):this;c(t,e);let n=t._zod.deferred;if(n){for(let e of n)e();t._zod.deferred=void 0}let i=globalThis.__zod_globalConfig?.postProcessor;return i&&i(t),t}return Object.defineProperty(d,"init",{value:c}),Object.defineProperty(d,Symbol.hasInstance,{value:t=>r?.Parent&&t instanceof r.Parent?!0:t?._zod?.traits?.has(e)}),Object.defineProperty(d,"name",{value:e}),d}var iB=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},aB=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};(eB=globalThis).__zod_globalConfig??(eB.__zod_globalConfig={});var oB=globalThis.__zod_globalConfig;function sB(e){return e&&Object.assign(oB,e),oB}function cB(){let e=this._zod;return e.message??=JSON.stringify(e.def,KR,2),e.message}function lB(e){this._zod.message=e}var uB={get:cB,set:lB,enumerable:!0,configurable:!0},dB={value:void 0,enumerable:!1},fB=new WeakSet([Object.prototype,Error.prototype]),pB=$(`$ZodError`,(e,t)=>{e.name=`$ZodError`,dB.value=t,Object.defineProperty(e,"issues",dB),dB.value=void 0,Object.defineProperty(e,"message",uB);let n=Object.getPrototypeOf(e);fB.has(n)||(fB.add(n),Object.defineProperty(n,"toString",{configurable:!0,enumerable:!1,get(){let e=()=>this.message;return Object.defineProperty(this,"toString",{value:e,configurable:!0,writable:!0}),e},set(e){Object.defineProperty(this,"toString",{value:e,configurable:!0,writable:!0})}}))});function mB(e,t,n){return Object.prototype.hasOwnProperty.call(e,t)||(t===`__proto__`?Object.defineProperty(e,t,{value:n(),writable:!0,enumerable:!0,configurable:!0}):e[t]=n()),e[t]}function hB(e,t=e=>e.message){let n={},r=[];for(let i of e.issues)i.path.length>0?mB(n,i.path[0],()=>[]).push(t(i)):r.push(t(i));return{formErrors:r,fieldErrors:n}}function gB(e,t=e=>e.message){let n={_errors:[]},r=(e,i=[])=>{for(let a of e.issues)if(a.code===`invalid_union`&&a.errors.length)a.errors.map(e=>r({issues:e},[...i,...a.path]));else if(a.code===`invalid_key`)r({issues:a.issues},[...i,...a.path]);else if(a.code===`invalid_element`)r({issues:a.issues},[...i,...a.path]);else{let e=[...i,...a.path];if(e.length===0)n._errors.push(t(a));else{let r=n,i=0;for(;i<e.length;){let n=e[i],o=i===e.length-1;if(n===`_errors`){o&&r._errors.push(t(a)),i++;continue}Object.prototype.hasOwnProperty.call(r,n)||Object.defineProperty(r,n,{value:{_errors:[]},enumerable:!0,writable:!0,configurable:!0});let s=r[n];o&&s._errors.push(t(a)),r=s,i++}}}};return r(e),n}function _B(e,t){return{callee:t?.callee??e,Err:t?.Err}}var vB=e=>{let t=(n,r,i,a)=>{let o=i?{...i,async:!1}:{async:!1},s=n._zod.run({value:r,issues:[]},o);if(s instanceof Promise)throw new iB;if(s.issues.length){let n=new((a?.Err)??e)(s.issues.map(e=>Fz(e,o,sB())));throw cz(n,a?.callee??t),n}return s.value};return t},yB=e=>{let t=async(n,r,i,a)=>{let o=i?{...i,async:!0}:{async:!0},s=n._zod.run({value:r,issues:[]},o);if(s instanceof Promise&&(s=await s),s.issues.length){let n=new((a?.Err)??e)(s.issues.map(e=>Fz(e,o,sB())));throw cz(n,a?.callee??t),n}return s.value};return t},bB=e=>(t,n,r)=>{let i=r?{...r,async:!1}:{async:!1},a=t._zod.run({value:n,issues:[]},i);if(a instanceof Promise)throw new iB;return a.issues.length?xB(e,a.issues,i):{success:!0,data:a.value}};function xB(e,t,n){let r;return{success:!1,get error(){return r||(r=new e(t.map(e=>Fz(e,n,sB()))),t=void 0,n=void 0),r},set error(e){r=e,t=void 0,n=void 0}}}var SB=e=>async(t,n,r)=>{let i=r?{...r,async:!0}:{async:!0},a=t._zod.run({value:n,issues:[]},i);return a instanceof Promise&&(a=await a),a.issues.length?xB(e,a.issues,i):{success:!0,data:a.value}},CB=Symbol.for(`zod.compile.invalid`),wB=Symbol.for(`zod.compile.fallback`),TB=((e,t,n)=>{let r=e._zod.bag.validator;if(r!==void 0){if(r(t)!==CB)return!0;if(r.definite===!0&&n===void 0)return!1}return EB(e,t,n)});function EB(e,t,n){let r=n?{...n,async:!1,abortEarly:!0}:{async:!1,abortEarly:!0},i=e._zod.bag.fallbackRun,a;if(i?(r[wB]=!0,a=i({value:t,issues:[]},r)):a=e._zod.run({value:t,issues:[]},r),a instanceof Promise)throw new iB;return a.issues.length===0}var DB=async(e,t,n)=>{let r=n?{...n,async:!0,abortEarly:!0}:{async:!0,abortEarly:!0},i=e._zod.run({value:t,issues:[]},r);return i instanceof Promise&&(i=await i),i.issues.length===0},OB=e=>{let t=vB(e),n=(e,r,i,a)=>{let o=i?{...i,direction:`backward`}:{direction:`backward`};return t(e,r,o,_B(n,a))};return n},kB=e=>{let t=vB(e),n=(e,r,i,a)=>t(e,r,i,_B(n,a));return n},AB=e=>{let t=yB(e),n=async(e,r,i,a)=>{let o=i?{...i,direction:`backward`}:{direction:`backward`};return await t(e,r,o,_B(n,a))};return n},jB=e=>{let t=yB(e),n=async(e,r,i,a)=>await t(e,r,i,_B(n,a));return n},MB=e=>(t,n,r)=>{let i=r?{...r,direction:`backward`}:{direction:`backward`};return bB(e)(t,n,i)},NB=e=>(t,n,r)=>bB(e)(t,n,r),PB=e=>async(t,n,r)=>{let i=r?{...r,direction:`backward`}:{direction:`backward`};return SB(e)(t,n,i)},FB=e=>async(t,n,r)=>SB(e)(t,n,r),IB=/^[cC][0-9a-z]{6,}$/,LB=/^[0-9a-z]+$/,RB=/^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$/,zB=/^[0-9a-vA-V]{20}$/,BB=/^[A-Za-z0-9]{27}$/,VB=/^[a-zA-Z0-9_-]{21}$/;function HB(e){return RegExp(`^[a-zA-Z0-9_-]{${e}}$`)}var UB=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,WB=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,GB=e=>e?RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,KB=/^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/,qB=`^(?=[\\s\\S]*[\\p{Extended_Pictographic}\\p{Regional_Indicator}\\u20E3])[\\p{Extended_Pictographic}\\p{Emoji_Component}]+$`;function JB(){return new RegExp(qB,`u`)}var YB=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,XB=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,ZB=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,QB=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,$B=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,eV=/^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2,3})?$/,tV=/^https?$/,nV=/^\+[1-9]\d{6,14}$/,rV=`(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`;function iV(e){return RegExp(`^${e}$`)}var aV=iV(rV);function oV(e){let t=`(?:[01]\\d|2[0-3]):[0-5]\\d`;return typeof e.precision==`number`?e.precision===-1?`${t}`:e.precision===0?`${t}:[0-5]\\d`:`${t}:[0-5]\\d\\.\\d{${e.precision}}`:e.seconds?`${t}:[0-5]\\d(?:\\.\\d+)?`:`${t}(?::[0-5]\\d(?:\\.\\d+)?)?`}function sV(e){return RegExp(`^${oV(e)}$`)}function cV(e){let t=[`Z`];e.offset&&t.push(`([+-](?:[01]\\d|2[0-3]):[0-5]\\d)`);let n=`${oV({precision:e.precision,seconds:!0})}(?:${t.join(`|`)})`,r=e.local?`${n}|${oV({precision:e.precision})}`:n;return RegExp(`^${rV}T(?:${r})$`)}var lV=/^[\s\S]{0,}$/,uV=/^-?\d+$/,dV=/^-?\d+(?:\.\d+)?$/,fV=/^(?:true|false)$/i,pV=/^[^A-Z]*$/,mV=/^[^a-z]*$/,hV=$(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),gV=e=>{let t=e.value;return!YR(t)&&t.length!==void 0},_V={number:`number`,bigint:`bigint`,object:`date`},vV=$(`$ZodCheckLessThan`,(e,t)=>{hV.init(e,t);let n=_V[typeof t.value];e._zod.check=r=>{(t.inclusive?r.value<=t.value:r.value<t.value)||r.issues.push({origin:_V[typeof r.value]??n,code:`too_big`,maximum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),yV=$(`$ZodCheckGreaterThan`,(e,t)=>{hV.init(e,t);let n=_V[typeof t.value];e._zod.check=r=>{(t.inclusive?r.value>=t.value:r.value>t.value)||r.issues.push({origin:_V[typeof r.value]??n,code:`too_small`,minimum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),bV=$(`$ZodCheckMultipleOf`,(e,t)=>{hV.init(e,t),e._zod.check=n=>{if(typeof n.value!=typeof t.value)throw Error(`Cannot mix number and bigint in multiple_of check.`);(typeof n.value==`bigint`?t.value!==BigInt(0)&&n.value%t.value===BigInt(0):ZR(n.value,t.value)===0)||n.issues.push({origin:typeof n.value,code:`not_multiple_of`,divisor:t.value,input:n.value,inst:e,continue:!t.abort})}}),xV=$(`$ZodCheckNumberFormat`,(e,t)=>{hV.init(e,t),t.format=t.format||`float64`;let n=t.format?.includes(`int`),r=n?`int`:`number`,[i,a]=yz[t.format];e._zod.check=o=>{let s=o.value;if(n){if(!Number.isInteger(s)){o.issues.push({expected:r,format:t.format,code:`invalid_type`,continue:!1,input:s,inst:e});return}if(!Number.isSafeInteger(s)){s>0?o.issues.push({input:s,code:`too_big`,maximum:2**53-1,note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort}):o.issues.push({input:s,code:`too_small`,minimum:-(2**53-1),note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort});return}}s<i&&o.issues.push({origin:`number`,input:s,code:`too_small`,minimum:i,inclusive:!0,inst:e,continue:!t.abort}),s>a&&o.issues.push({origin:`number`,input:s,code:`too_big`,maximum:a,inclusive:!0,inst:e,continue:!t.abort})}}),SV=$(`$ZodCheckMaxLength`,(e,t)=>{var n;hV.init(e,t),(n=e._zod.def).when??(n.when=gV),e._zod.check=n=>{let r=n.value,i=r.length;if((typeof r==`string`&&i>t.maximum?Lz(r):i)<=t.maximum)return;let a=Rz(r);n.issues.push({origin:a,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),CV=$(`$ZodCheckMinLength`,(e,t)=>{var n;hV.init(e,t),(n=e._zod.def).when??(n.when=gV),e._zod.check=n=>{let r=n.value,i=r.length;if((typeof r==`string`&&i>=t.minimum&&i<t.minimum*2?Lz(r):i)>=t.minimum)return;let a=Rz(r);n.issues.push({origin:a,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),wV=$(`$ZodCheckLengthEquals`,(e,t)=>{var n;hV.init(e,t),(n=e._zod.def).when??(n.when=gV),e._zod.check=n=>{let r=n.value,i=r.length,a=typeof r==`string`&&i>=t.length&&i<=t.length*2?Lz(r):i;if(a===t.length)return;let o=Rz(r),s=a>t.length;n.issues.push({origin:o,...s?{code:`too_big`,maximum:t.length}:{code:`too_small`,minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),TV=$(`$ZodCheckStringFormat`,(e,t)=>{var n,r;hV.init(e,t),t.pattern?(n=e._zod).check??(n.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:t.format,input:n.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(r=e._zod).check??(r.check=()=>{})}),EV=$(`$ZodCheckRegex`,(e,t)=>{TV.init(e,t),e._zod.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:`regex`,input:n.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),DV=$(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=pV,TV.init(e,t)}),OV=$(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=mV,TV.init(e,t)}),kV=$(`$ZodCheckIncludes`,(e,t)=>{hV.init(e,t);let n=mz(t.includes);t.pattern=new RegExp(typeof t.position==`number`?`^.{${t.position},}${n}`:n),e._zod.check=n=>{n.value.includes(t.includes,t.position)||n.issues.push({origin:`string`,code:`invalid_format`,format:`includes`,includes:t.includes,input:n.value,inst:e,continue:!t.abort})}}),AV=$(`$ZodCheckStartsWith`,(e,t)=>{hV.init(e,t);let n=RegExp(`^${mz(t.prefix)}.*`);t.pattern??=n,e._zod.check=n=>{n.value.startsWith(t.prefix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`starts_with`,prefix:t.prefix,input:n.value,inst:e,continue:!t.abort})}}),jV=$(`$ZodCheckEndsWith`,(e,t)=>{hV.init(e,t);let n=RegExp(`.*${mz(t.suffix)}$`);t.pattern??=n,e._zod.check=n=>{n.value.endsWith(t.suffix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`ends_with`,suffix:t.suffix,input:n.value,inst:e,continue:!t.abort})}}),MV=$(`$ZodCheckOverwrite`,(e,t)=>{hV.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}}),NV=class{constructor(e=[],t={}){this.content=[],this.indent=0,this.args=e,this.closed=t}indented(e){this.indent+=1;try{e(this)}finally{--this.indent}}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
|
|
99
|
+
`).filter(e=>e),n=Math.min(...t.map(e=>e.length-e.trimStart().length)),r=t.map(e=>e.slice(n)).map(e=>` `.repeat(this.indent*2)+e);for(let e of r)this.content.push(e)}compile(){let e=Function,t=this?.content??[``];return new e(...Object.keys(this.closed),`return function (${this.args.join(`, `)}) {\n${t.join(`
|
|
100
|
+
`)}\n};`)(...Object.values(this.closed))}},PV={major:4,minor:6,patch:5},FV=$(`$ZodType`,(e,t)=>{var n;e??={},e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=PV;let r=e._zod.def.checks,i=e._zod.traits.has(`$ZodCheck`)?[e,...r??[]]:r?.length?[...r]:[];for(let t of i)for(let n of t._zod.onattach)n(e);if(i.length===0)(n=e._zod).deferred??(n.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{let t=(t,n,r)=>{if(t.memo)return t;let i=Az(t),a;for(let o of n){if(o._zod.def.when){if(jz(t)||!o._zod.def.when(t))continue}else if(i)continue;let n=t.issues.length,s=o._zod.check(t);if(s instanceof Promise&&r?.async===!1)throw new iB;if(a||s instanceof Promise)a=(a??Promise.resolve()).then(async()=>{await s,t.issues.length!==n&&(Pz(t.issues,n,e),i||=Az(t,n))});else{if(t.issues.length===n)continue;Pz(t.issues,n,e),i||=Az(t,n)}}return a?a.then(()=>t):t},n=(n,r,a)=>{if(Az(n))return n.aborted=!0,n;let o=t(r,i,a);if(o instanceof Promise){if(a.async===!1)throw new iB;return o.then(t=>e._zod.parse(t,a))}return e._zod.parse(o,a)};e._zod.run=(r,a)=>{if(a.skipChecks)return e._zod.parse(r,a);if(a.direction===`backward`){let t=e._zod.parse({value:r.value,issues:[]},{...a,skipChecks:!0});return t instanceof Promise?t.then(e=>n(e,r,a)):n(t,r,a)}let o=e._zod.parse(r,a);if(o instanceof Promise){if(a.async===!1)throw new iB;return o.then(e=>t(e,i,a))}return t(o,i,a)}}},{get"~standard"(){return Uz(this,`~standard`,RV(this))},set"~standard"(e){Hz(this,`~standard`,e)}}),IV=(e,t)=>e.issues.length?{issues:e.issues.map(e=>Fz(e,t,sB()))}:{value:e.value};async function LV(e,t){let n={async:!0};return IV(await e._zod.run({value:t,issues:[]},n),n)}function RV(e){return{validate:t=>{let n={async:!1};try{let r=e._zod.run({value:t,issues:[]},n);if(!(r instanceof Promise))return IV(r,n)}catch{}return LV(e,t)},vendor:`zod`,version:1}}var zV=$(`$ZodString`,(e,t)=>{FV.init(e,t),e._zod.pattern=t.pattern??lV,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=String(n.value)}catch{}return typeof n.value==`string`||n.issues.push({expected:`string`,code:`invalid_type`,input:n.value,inst:e}),n}}),BV=$(`$ZodStringFormat`,(e,t)=>{TV.init(e,t),zV.init(e,t)}),VV=$(`$ZodGUID`,(e,t)=>{t.pattern??=WB,BV.init(e,t)}),HV=$(`$ZodUUID`,(e,t)=>{if(t.version){let e={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[t.version];if(e===void 0)throw Error(`Invalid UUID version: "${t.version}"`);t.pattern??=GB(e)}else t.pattern??=GB();BV.init(e,t)}),UV=$(`$ZodEmail`,(e,t)=>{t.pattern??=KB,BV.init(e,t)});function WV(e){try{return typeof URL<`u`&&typeof URL.canParse==`function`?URL.canParse(e):(new URL(e),!0)}catch{return!1}}function GV(e,t){return!(`normalize`in t)&&!(`hostname`in t)&&!(`protocol`in t)?WV(e)||2:KV(e,t)}function KV(e,t){if(!t.normalize&&t.protocol?.source===tV.source&&!/^https?:\/\//i.test(e))return 1;try{if(typeof URL<`u`){let t=URL;if(typeof t.parse==`function`)return t.parse(e)??2}return new URL(e)}catch{return 2}}var qV=/[\t\n\r]/g;function JV(e){return e.replace(qV,``)}function YV(e,t){return t.lastIndex=0,t.test(e.hostname)}function XV(e,t){return t.lastIndex=0,t.test(e.protocol.endsWith(`:`)?e.protocol.slice(0,-1):e.protocol)}var ZV=$(`$ZodURL`,(e,t)=>{BV.init(e,t),e._zod.check=n=>{try{let r=n.value.trim(),i=GV(r,t);if(i===1){n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid URL format`,input:n.value,inst:e,continue:!t.abort});return}if(i===2){n.issues.push({code:`invalid_format`,format:`url`,input:n.value,inst:e,continue:!t.abort});return}if(i===!0){n.value=JV(r);return}t.hostname&&!YV(i,t.hostname)&&n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid hostname`,pattern:t.hostname.source,input:n.value,inst:e,continue:!t.abort}),t.protocol&&!XV(i,t.protocol)&&n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid protocol`,pattern:t.protocol.source,input:n.value,inst:e,continue:!t.abort}),n.value=t.normalize?i.href:JV(r);return}catch{n.issues.push({code:`invalid_format`,format:`url`,input:n.value,inst:e,continue:!t.abort})}}}),QV=$(`$ZodEmoji`,(e,t)=>{t.pattern??=JB(),BV.init(e,t)}),$V=$(`$ZodNanoID`,(e,t)=>{if(t.length!==void 0&&(!Number.isInteger(t.length)||t.length<1))throw Error(`Invalid nanoid length: ${t.length}`);t.pattern??=t.length===void 0?VB:HB(t.length),BV.init(e,t)}),eH=$(`$ZodCUID`,(e,t)=>{t.pattern??=IB,BV.init(e,t)}),tH=$(`$ZodCUID2`,(e,t)=>{t.pattern??=LB,BV.init(e,t)}),nH=$(`$ZodULID`,(e,t)=>{t.pattern??=RB,BV.init(e,t)}),rH=$(`$ZodXID`,(e,t)=>{t.pattern??=zB,BV.init(e,t)}),iH=$(`$ZodKSUID`,(e,t)=>{t.pattern??=BB,BV.init(e,t)}),aH=$(`$ZodISODateTime`,(e,t)=>{t.pattern??=cV(t),BV.init(e,t)}),oH=$(`$ZodISODate`,(e,t)=>{t.pattern??=aV,BV.init(e,t)}),sH=$(`$ZodISOTime`,(e,t)=>{t.pattern??=sV(t),BV.init(e,t)}),cH=$(`$ZodISODuration`,(e,t)=>{t.pattern??=UB,BV.init(e,t)}),lH=$(`$ZodIPv4`,(e,t)=>{t.pattern??=YB,BV.init(e,t)}),uH=/^[0-9a-fA-F:.]+$/;function dH(e){return uH.test(e)?WV(`http://[${e}]`):!1}var fH=$(`$ZodIPv6`,(e,t)=>{t.pattern??=XB,BV.init(e,t),e._zod.check=n=>{dH(n.value)||n.issues.push({code:`invalid_format`,format:`ipv6`,input:n.value,inst:e,continue:!t.abort})}}),pH=$(`$ZodCIDRv4`,(e,t)=>{t.pattern??=ZB,BV.init(e,t)});function mH(e){let t=e.split(`/`);if(t.length!==2)return!1;let[n,r]=t;if(!r)return!1;let i=Number(r);return`${i}`!==r||i<0||i>128?!1:dH(n)}var hH=$(`$ZodCIDRv6`,(e,t)=>{t.pattern??=QB,BV.init(e,t),e._zod.check=n=>{mH(n.value)||n.issues.push({code:`invalid_format`,format:`cidrv6`,input:n.value,inst:e,continue:!t.abort})}});function gH(e){if(e===``)return!0;if(/\s/.test(e)||e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}var _H=/^[0-9a-zA-Z+/]*={0,2}$/,vH=$(`$ZodBase64`,(e,t)=>{t.pattern??=_H,BV.init(e,t),e._zod.check=n=>{gH(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}}),yH=/^[A-Za-z0-9_-]*$/;function bH(e){if(!yH.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return gH(t.padEnd(Math.ceil(t.length/4)*4,`=`))}var xH=$(`$ZodBase64URL`,(e,t)=>{t.pattern??=yH,BV.init(e,t),e._zod.check=n=>{bH(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),SH=$(`$ZodE164`,(e,t)=>{t.pattern??=nV,BV.init(e,t)});function CH(e,t=null){try{let n=e.split(`.`);if(n.length!==3)return!1;let[r]=n;if(!r)return!1;let i=JSON.parse(atob(r));return!(`typ`in i&&i?.typ!==`JWT`||!i.alg||t&&(!(`alg`in i)||i.alg!==t))}catch{return!1}}var wH=$(`$ZodJWT`,(e,t)=>{BV.init(e,t),e._zod.check=n=>{CH(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),TH=$(`$ZodNumber`,(e,t)=>{FV.init(e,t),e._zod.pattern=dV,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=Number(n.value)}catch{}let i=n.value;if(typeof i==`number`&&!Number.isNaN(i)&&Number.isFinite(i))return n;let a=typeof i==`number`?Number.isNaN(i)?`NaN`:Number.isFinite(i)?void 0:String(i):void 0;return n.issues.push({expected:`number`,code:`invalid_type`,input:i,inst:e,...a?{received:a}:{}}),n}}),EH=$(`$ZodNumberFormat`,(e,t)=>{xV.init(e,t),TH.init(e,t)}),DH=$(`$ZodBoolean`,(e,t)=>{FV.init(e,t),e._zod.pattern=fV,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=!!n.value}catch{}let i=n.value;return typeof i==`boolean`||n.issues.push({expected:`boolean`,code:`invalid_type`,input:i,inst:e}),n}}),OH=$(`$ZodUnknown`,(e,t)=>{FV.init(e,t),e._zod.parse=e=>e}),kH=$(`$ZodNever`,(e,t)=>{FV.init(e,t),e._zod.parse=(t,n)=>(t.issues.push({expected:`never`,code:`invalid_type`,input:t.value,inst:e}),t)});function AH(e,t,n){e.issues.length&&t.issues.push(...Mz(n,e.issues)),t.value[n]=e.value}var jH=$(`$ZodArray`,(e,t)=>{FV.init(e,t);let n=oB.memoizer;n?.attach(e),e._zod.parse=(r,i)=>{let a=r.value;if(!Array.isArray(a))return r.issues.push({expected:`array`,code:`invalid_type`,input:a,inst:e}),r;r.value=n?n.alloc(e,r,Array(a.length),i):Array(a.length);let o=[],s=i?.abortEarly;for(let e=0;e<a.length;e++){let n=a[e],c=t.element._zod.run({value:n,issues:[]},i);if(c instanceof Promise)o.push(c.then(t=>AH(t,r,e)));else if(AH(c,r,e),s&&c.issues.length!==0&&Az(c))break}return o.length?Promise.all(o).then(()=>r):r}});function MH(e,t,n,r,i,a){let o=n in r,s=a===`optional`;if(o||!s||i!==`optional`){if(e.issues.length){if(i!==void 0&&s&&!o)return;t.issues.push(...Mz(n,e.issues))}!o&&i===void 0?e.issues.length||t.issues.push({code:`invalid_type`,expected:`nonoptional`,input:void 0,path:[n]}):e.value===void 0?(o||i===`defaulted`&&!s)&&(t.value[n]=void 0):t.value[n]=e.value}}var NH=[];function PH(e){let t=Object.keys(e.shape),n=Object.getOwnPropertySymbols(e.shape),r=n.length?n:NH,i=r.length?[...t,...r]:t;for(let t of i)if(!e.shape?.[t]?._zod?.traits?.has(`$ZodType`))throw Error(`Invalid element at key "${String(t)}": expected a Zod schema`);let a=vz(e.shape);return{...e,allKeys:i,symbolKeys:r,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(a)}}function FH(e,t,n,r,i,a,o){let s=[],c=i.keySet,l=i.catchall._zod,u=l.def.type,d=l.optin,f=l.optout,p=0;for(let i in t){if(o&&n.issues.length!==p){if(Az(n,p))break;p=n.issues.length}if(c.has(i))continue;if(i===`__proto__`){u===`never`&&s.push(i);continue}if(u===`never`){s.push(i);continue}let a=l.run({value:t[i],issues:[]},r);a instanceof Promise?e.push(a.then(e=>MH(e,n,i,t,d,f))):MH(a,n,i,t,d,f)}return s.length&&n.issues.push({code:`unrecognized_keys`,keys:s,input:t,inst:a,continue:!0}),e.length?Promise.all(e).then(()=>n):n}var IH=$(`$ZodObject`,(e,t)=>{FV.init(e,t);let n=Object.getOwnPropertyDescriptor(t,`shape`),r=n?.get?n.get.raw:t.shape??{};if(r){let e=()=>{let n={...r};return Object.defineProperty(t,"shape",{value:n}),e.raw=n,n};e.raw=r,Object.defineProperty(t,"shape",{get:e})}let i=JR(()=>PH(t));Xz(e,`propValues`,e=>{let t=e.def.shape,n={};for(let e in t){let r=t[e]._zod;if(r.values){Object.prototype.hasOwnProperty.call(n,e)||QR(n,e,new Set);for(let t of r.values)n[e].add(t);r.optin!==void 0&&n[e].add(void 0)}}return n});let a=lz,o=t.catchall,s,c=oB.memoizer;c?.attach(e),e._zod.parse=(t,n)=>{s??=i.value;let r=t.value;if(!a(r))return t.issues.push({expected:`object`,code:`invalid_type`,input:r,inst:e}),t;t.value=c?c.alloc(e,t,{},n):{};let l=[],u=s.shape,d=n?.abortEarly,f=t.issues.length;for(let e of s.allKeys){if(d&&t.issues.length!==f){if(Az(t,f))break;f=t.issues.length}if(e===`__proto__`)continue;let i=u[e],a=i._zod.optin,o=i._zod.optout,s=i._zod.run({value:r[e],issues:[]},n);s instanceof Promise?l.push(s.then(n=>MH(n,t,e,r,a,o))):MH(s,t,e,r,a,o)}return o?FH(l,r,t,n,i.value,e,d===!0):l.length?Promise.all(l).then(()=>t):t}}),LH=$(`$ZodObjectJIT`,(e,t)=>{IH.init(e,t);let n=e._zod.parse,r=JR(()=>PH(t)),i=oB.memoizer,a=t=>{let n=r.value,a=n.symbolKeys,o=new NV([`payload`,`ctx`],{shape:t,inst:e,memo:i,syms:a}),s=e=>`shape[${e}]._zod.run({ value: input[${e}], issues: [] }, ctx)`,c=(e,t)=>`
|
|
101
|
+
let ${e}_ab = false;
|
|
102
|
+
for (let i = 0; i < ${e}.issues.length; i++) {
|
|
103
|
+
const iss = ${e}.issues[i];
|
|
104
|
+
iss.path = iss.path ? [${t}, ...iss.path] : [${t}];
|
|
105
|
+
payload.issues.push(iss);
|
|
106
|
+
if (iss.continue !== true) ${e}_ab = true;
|
|
107
|
+
}
|
|
108
|
+
if (${e}_ab && ctx && ctx.abortEarly) {
|
|
109
|
+
payload.value = newResult;
|
|
110
|
+
return payload;
|
|
111
|
+
}`;o.write(`const input = payload.value;`);let l=Object.create(null),u=0;for(let e of n.allKeys)l[e]=`key_${u++}`;o.write(i?`const newResult = memo.alloc(inst, payload, {}, ctx);`:`const newResult = {};`);for(let e of n.allKeys){if(e===`__proto__`)continue;let n=l[e],r=typeof e==`symbol`?`syms[${a.indexOf(e)}]`:oz(e),i=`${r} in input`,u=t[e],d=u?._zod?.optin,f=d!==void 0,p=u?._zod?.optout===`optional`;if(o.write(`const ${n} = ${s(r)};`),f&&p){let e=d===`optional`?`${n}_present`:`${n}.value !== undefined || ${n}_present`;o.write(`
|
|
112
|
+
const ${n}_present = ${i};
|
|
113
|
+
if (!${n}.issues.length || ${n}_present) {
|
|
114
|
+
if (${n}.issues.length) {${c(n,r)}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (${e}) {
|
|
118
|
+
newResult[${r}] = ${n}.value;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
`)}else f?(o.write(`
|
|
123
|
+
if (${n}.issues.length) {${c(n,r)}
|
|
124
|
+
}
|
|
125
|
+
`),d===`defaulted`?o.write(`newResult[${r}] = ${n}.value;`):o.write(`
|
|
126
|
+
if (${n}.value !== undefined || ${i}) {
|
|
127
|
+
newResult[${r}] = ${n}.value;
|
|
128
|
+
}
|
|
129
|
+
`)):o.write(`
|
|
130
|
+
const ${n}_present = ${i};
|
|
131
|
+
if (${n}.issues.length) {${c(n,r)}
|
|
132
|
+
}
|
|
133
|
+
if (!${n}_present && !${n}.issues.length) {
|
|
134
|
+
payload.issues.push({
|
|
135
|
+
code: "invalid_type",
|
|
136
|
+
expected: "nonoptional",
|
|
137
|
+
input: undefined,
|
|
138
|
+
path: [${r}]
|
|
139
|
+
});
|
|
140
|
+
if (ctx && ctx.abortEarly) {
|
|
141
|
+
payload.value = newResult;
|
|
142
|
+
return payload;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (${n}_present) {
|
|
147
|
+
newResult[${r}] = ${n}.value;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
`)}return o.write(`payload.value = newResult;`),o.write(`return payload;`),o.compile()},o,s=lz,c=!oB.jitless,l=c&&uz.value,u=t.catchall,d;e._zod.parse=(i,f)=>{d??=r.value;let p=i.value;return s(p)?c&&l&&f?.async===!1&&f.jitless!==!0?(o||=a(t.shape),i=o(i,f),u?FH([],p,i,f,d,e,f?.abortEarly===!0):i):n(i,f):(i.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),i)}});function RH(e,t,n,r){for(let n of e)if(n.issues.length===0)return t.value=n.value,t;let i=e.filter(e=>!Az(e));return i.length===1?(t.value=i[0].value,i[0]):(t.issues.push({code:`invalid_union`,input:t.value,inst:n,errors:e.map(e=>e.issues.map(e=>Fz(e,r,sB())))}),t)}var zH=$(`$ZodUnion`,(e,t)=>{FV.init(e,t),Xz(e,`optin`,e=>e.def.options.some(e=>e._zod.optin===`defaulted`)?`defaulted`:e.def.options.some(e=>e._zod.optin!==void 0)?`optional`:void 0),Xz(e,`optout`,e=>e.def.options.some(e=>e._zod.optout===`optional`)?`optional`:void 0),Xz(e,`values`,e=>{if(e.def.options.every(e=>e._zod.values))return new Set(e.def.options.flatMap(e=>Array.from(e._zod.values)))}),Xz(e,`pattern`,e=>{if(e.def.options.every(e=>e._zod.pattern)){let t=e.def.options.map(e=>e._zod.pattern);return RegExp(`^(${t.map(e=>XR(e.source)).join(`|`)})$`)}});let n=t.options.length===1?t.options[0]._zod.run:null;e._zod.parse=(r,i)=>{if(n)return n(r,i);let a=!1,o=[];for(let e of t.options){let t=e._zod.run({value:r.value,issues:[]},i);if(t instanceof Promise)o.push(t),a=!0;else{if(t.issues.length===0)return t;o.push(t)}}return a?Promise.all(o).then(t=>RH(t,r,e,i)):RH(o,r,e,i)}});function BH(e){let t=new Map;for(let n of e.options){let r=n._zod.propValues?.[e.discriminator];if(!r||r.size===0)throw Error(`Invalid discriminated union option at index "${e.options.indexOf(n)}"`);for(let e of r)if(t.has(e)){if(e!==void 0)throw Error(`Duplicate discriminator value "${String(e)}"`);t.set(e,null)}else t.set(e,n)}return t}var VH=$(`$ZodDiscriminatedUnion`,(e,t)=>{t.inclusive=!1,zH.init(e,t);let n=e._zod.parse;Xz(e,`propValues`,e=>{let t={},n=0;for(let r of e.def.options){let i=r._zod.propValues;if(!i||Object.keys(i).length===0)throw Error(`Invalid discriminated union option at index "${e.def.options.indexOf(r)}"`);i[e.def.discriminator]?.has(void 0)&&n++;for(let[e,n]of Object.entries(i)){Object.prototype.hasOwnProperty.call(t,e)||QR(t,e,new Set);for(let r of n)t[e].add(r)}}return!e.def.unionFallback&&n>1&&t[e.def.discriminator]?.delete(void 0),t}),t.options.forEach((e,n)=>{let r=$R(e._zod.def);if(r&&!Object.prototype.hasOwnProperty.call(r,t.discriminator))throw Error(`Invalid discriminated union option at index "${n}"`)});let r=JR(()=>BH(t));e._zod.parse=(i,a)=>{let o=i.value;if(!lz(o))return i.issues.push({code:`invalid_type`,expected:`object`,input:o,inst:e}),i;let s=o?.[t.discriminator],c=r.value.get(s);return c&&(s!==void 0||a.direction!==`backward`)?c._zod.run(i,a):t.unionFallback||a.direction===`backward`?n(i,a):(i.issues.push({code:`invalid_union`,errors:[],note:`No matching discriminator`,discriminator:t.discriminator,options:Array.from(r.value.keys()).filter(e=>r.value.get(e)!==null),input:o,path:[t.discriminator],inst:e}),i)}}),HH=$(`$ZodIntersection`,(e,t)=>{FV.init(e,t),e._zod.parse=(e,n)=>{let r=e.value,i=t.left._zod.run({value:r,issues:[]},n),a=t.right._zod.run({value:r,issues:[]},n);return i instanceof Promise||a instanceof Promise?Promise.all([i,a]).then(([t,n])=>WH(e,t,n)):WH(e,i,a)}});function UH(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(dz(e)&&dz(t)){let n=Object.keys(t),r=Object.keys(e).filter(e=>n.indexOf(e)!==-1),i={...e,...t};Object.prototype.hasOwnProperty.call(i,`__proto__`)&&delete i.__proto__;for(let n of r){if(n===`__proto__`)continue;let r=UH(e[n],t[n]);if(!r.valid)return{valid:!1,mergeErrorPath:[n,...r.mergeErrorPath]};i[n]=r.data}return{valid:!0,data:i}}if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return{valid:!1,mergeErrorPath:[]};let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=t[r],o=UH(i,a);if(!o.valid)return{valid:!1,mergeErrorPath:[r,...o.mergeErrorPath]};n.push(o.data)}return{valid:!0,data:n}}return{valid:!1,mergeErrorPath:[]}}function WH(e,t,n){let r=new Map,i,a=new Map,o=(e,t)=>{let n;if(e.code===`unrecognized_keys`&&!e.path?.length)i??=e,n=e.keys;else if(e.code===`invalid_key`&&e.origin===`record`&&e.path?.length===1){let t=String(e.path[0]);a.has(t)||a.set(t,e),n=[t]}else return!1;for(let e of n)r.has(e)||r.set(e,{}),r.get(e)[t]=!0;return!0};for(let n of t.issues)o(n,`l`)||e.issues.push(n);for(let t of n.issues)o(t,`r`)||e.issues.push(t);let s=[...r].filter(([,e])=>e.l&&e.r).map(([e])=>e);if(s.length){let t=i?s.filter(e=>i.keys.includes(e)):[];t.length&&e.issues.push({...i,keys:t});for(let n of s)!t.includes(n)&&a.has(n)&&e.issues.push(a.get(n))}let c=UH(t.value,n.value);if(!c.valid){if(Az(e))return e;throw Error(`Unmergable intersection. Error path: ${JSON.stringify(c.mergeErrorPath)}`)}return e.value=c.data,e}var GH=$(`$ZodRecord`,(e,t)=>{FV.init(e,t);let n=oB.memoizer;n?.attach(e),e._zod.parse=(r,i)=>{let a=r.value;if(!dz(a))return r.issues.push({expected:`record`,code:`invalid_type`,input:a,inst:e}),r;let o=[],s=t.keyType._zod.values;if(s&&!t.partial){r.value=n?n.alloc(e,r,{},i):{};let c=new Set;for(let n of s)if(typeof n==`string`||typeof n==`number`||typeof n==`symbol`){if(c.add(typeof n==`number`?n.toString():n),n===`__proto__`)continue;let s=t.keyType._zod.run({value:n,issues:[]},i);if(s instanceof Promise)throw Error(`Async schemas not supported in object keys currently`);if(s.issues.length){r.issues.push({code:`invalid_key`,origin:`record`,issues:s.issues.map(e=>Fz(e,i,sB())),input:n,path:[n],inst:e});continue}let l=s.value;if(l===`__proto__`)continue;let u=t.valueType._zod.run({value:a[n],issues:[]},i);u instanceof Promise?o.push(u.then(e=>{e.issues.length&&r.issues.push(...Mz(n,e.issues)),r.value[l]=e.value})):(u.issues.length&&r.issues.push(...Mz(n,u.issues)),r.value[l]=u.value)}let l;for(let e in a)if(!c.has(e)){if(t.mode===`loose`){if(e===`__proto__`)continue;r.value[e]=a[e]}else l??=[],l.push(e)}l&&l.length>0&&r.issues.push({code:`unrecognized_keys`,input:a,inst:e,keys:l,continue:!0})}else{r.value=n?n.alloc(e,r,{},i):{};let c;for(let n of Reflect.ownKeys(a)){if(n===`__proto__`||!Object.prototype.propertyIsEnumerable.call(a,n))continue;let l=t.keyType._zod.run({value:n,issues:[]},i);if(l instanceof Promise)throw Error(`Async schemas not supported in object keys currently`);if(typeof n==`string`&&dV.test(n)&&l.issues.length){let e=t.keyType._zod.run({value:Number(n),issues:[]},i);if(e instanceof Promise)throw Error(`Async schemas not supported in object keys currently`);e.issues.length===0&&(l=e)}if(l.issues.length){t.mode===`loose`?r.value[n]=a[n]:s?(c??=[],c.push(n)):r.issues.push({code:`invalid_key`,origin:`record`,issues:l.issues.map(e=>Fz(e,i,sB())),input:n,path:[n],inst:e});continue}let u=l.value;if(u===`__proto__`)continue;let d=t.valueType._zod.run({value:a[n],issues:[]},i);d instanceof Promise?o.push(d.then(e=>{e.issues.length&&r.issues.push(...Mz(n,e.issues)),r.value[u]=e.value})):(d.issues.length&&r.issues.push(...Mz(n,d.issues)),r.value[u]=d.value)}c&&c.length>0&&r.issues.push({code:`unrecognized_keys`,input:a,inst:e,keys:c,continue:!0})}return o.length?Promise.all(o).then(()=>r):r}}),KH=$(`$ZodEnum`,(e,t)=>{FV.init(e,t);let n=WR(t.entries),r=new Set(n);e._zod.values=r,Xz(e,`pattern`,e=>{let t=WR(e.def.entries).filter(e=>pz.has(typeof e));return RegExp(t.length?`^(${t.map(e=>mz(e.toString())).join(`|`)})$`:`^[^\\s\\S]$`)}),e._zod.parse=(t,i)=>{let a=t.value;return r.has(a)||t.issues.push({code:`invalid_value`,values:n,input:a,inst:e}),t}}),qH=$(`$ZodLiteral`,(e,t)=>{FV.init(e,t);let n=new Set(t.values);e._zod.values=n,Xz(e,`pattern`,e=>{let t=e.def.values;return RegExp(t.length?`^(${t.map(e=>typeof e==`string`?mz(e):e?mz(e.toString()):String(e)).join(`|`)})$`:`^[^\\s\\S]$`)}),e._zod.parse=(r,i)=>{let a=r.value;return n.has(a)||r.issues.push({code:`invalid_value`,values:t.values,input:a,inst:e}),r}}),JH=$(`$ZodTransform`,(e,t)=>{FV.init(e,t),e._zod.optin=`optional`,oB.memoizer?.guard(e),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new aB(e.constructor.name);let i=t.transform(n.value,n);if(r.async)return(i instanceof Promise?i:Promise.resolve(i)).then(e=>(n.value=e,n));if(i instanceof Promise)throw new iB;return n.value=i,n}});function YH(e,t){return e.value=t.issues.length?void 0:t.value,e}var XH=$(`$ZodOptional`,(e,t)=>{FV.init(e,t),Xz(e,`optin`,e=>e.def.innerType._zod.optin===`defaulted`?`defaulted`:`optional`),e._zod.optout=`optional`,Xz(e,`values`,e=>{let t=e.def.innerType._zod.values;return t?new Set([...t,void 0]):void 0}),Xz(e,`pattern`,e=>{let t=e.def.innerType._zod.pattern;return t?RegExp(`^(${XR(t.source)})?$`):void 0}),e._zod.parse=(e,n)=>{if(e.value===void 0){if(t.innerType._zod.optin!==`defaulted`)return e;let r=t.innerType._zod.run({value:e.value,issues:[]},n);return r instanceof Promise?r.then(t=>YH(e,t)):YH(e,r)}return t.innerType._zod.run(e,n)}}),ZH=$(`$ZodExactOptional`,(e,t)=>{XH.init(e,t),Xz(e,`values`,e=>e.def.innerType._zod.values),Xz(e,`pattern`,e=>e.def.innerType._zod.pattern),e._zod.parse=(e,n)=>t.innerType._zod.run(e,n)}),QH=$(`$ZodNullable`,(e,t)=>{FV.init(e,t),Xz(e,`optin`,e=>e.def.innerType._zod.optin),Xz(e,`optout`,e=>e.def.innerType._zod.optout),Xz(e,`pattern`,e=>{let t=e.def.innerType._zod.pattern;return t?RegExp(`^(${XR(t.source)}|null)$`):void 0}),Xz(e,`values`,e=>e.def.innerType._zod.values?new Set([...e.def.innerType._zod.values,null]):void 0),e._zod.parse=(e,n)=>e.value===null?e:t.innerType._zod.run(e,n)}),$H=$(`$ZodDefault`,(e,t)=>{FV.init(e,t),e._zod.optin=`defaulted`,Xz(e,`values`,e=>e.def.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);if(e.value===void 0)return e.value=t.defaultValue,e;let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(e=>eU(e,t)):eU(r,t)}});function eU(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}var tU=$(`$ZodPrefault`,(e,t)=>{FV.init(e,t),e._zod.optin=`defaulted`,Xz(e,`values`,e=>e.def.innerType._zod.values),e._zod.parse=(e,n)=>(n.direction===`backward`||e.value===void 0&&(e.value=t.defaultValue),t.innerType._zod.run(e,n))}),nU=$(`$ZodNonOptional`,(e,t)=>{FV.init(e,t),Xz(e,`values`,e=>{let t=e.def.innerType._zod.values;return t?new Set([...t].filter(e=>e!==void 0)):void 0}),e._zod.parse=(n,r)=>{let i=t.innerType._zod.run(n,r);return i instanceof Promise?i.then(t=>rU(t,e)):rU(i,e)}});function rU(e,t){return!e.issues.length&&e.value===void 0&&e.issues.push({code:`invalid_type`,expected:`nonoptional`,input:e.value,inst:t}),e}function iU(e,t,n,r){return t.issues.length?(e.value=n.catchValue({...t,value:e.value,error:{issues:t.issues.map(e=>Fz(e,r,sB()))},input:e.value}),e):(e.value=t.value,t.memo&&(e.memo=!0),e)}var aU=$(`$ZodCatch`,(e,t)=>{FV.init(e,t),Xz(e,`optin`,e=>e.def.innerType._zod.optin===`defaulted`?`defaulted`:`optional`),Xz(e,`optout`,e=>e.def.innerType._zod.optout),Xz(e,`values`,e=>e.def.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run({value:e.value,issues:[]},n);return r instanceof Promise?r.then(r=>iU(e,r,t,n)):iU(e,r,t,n)}}),oU=$(`$ZodPipe`,(e,t)=>{FV.init(e,t),Xz(e,`values`,e=>e.def.in._zod.values),Xz(e,`optin`,e=>e.def.in._zod.optin),Xz(e,`optout`,e=>e.def.out._zod.optout),Xz(e,`propValues`,e=>e.def.in._zod.propValues),e._zod.parse=(e,n)=>{if(n.direction===`backward`){let r=t.out._zod.run(e,n);return r instanceof Promise?r.then(e=>sU(e,t.in,n)):sU(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>sU(e,t.out,n)):sU(r,t.out,n)}});function sU(e,t,n){return e.issues.some(e=>e.code!==`unrecognized_keys`)?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}var cU=$(`$ZodReadonly`,(e,t)=>{FV.init(e,t),Xz(e,`propValues`,e=>e.def.innerType._zod.propValues),Xz(e,`values`,e=>e.def.innerType._zod.values),Xz(e,`optin`,e=>e.def.innerType?._zod?.optin),Xz(e,`optout`,e=>e.def.innerType?._zod?.optout),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(lU):lU(r)}});function lU(e){return e.memo||(e.value=Object.freeze(e.value)),e}var uU=$(`$ZodCustom`,(e,t)=>{hV.init(e,t),FV.init(e,t),e._zod.parse=(e,t)=>e,e._zod.check=n=>{let r=n.value,i=t.fn(r);if(i instanceof Promise)return i.then(t=>dU(t,n,r,e));dU(i,n,r,e)}});function dU(e,t,n,r){if(!e){let e={code:`custom`,input:n,inst:r,path:[...r._zod.def.path??[]],continue:!r._zod.def.abort};r._zod.def.params&&(e.params=r._zod.def.params),t.issues.push(Bz(e))}}var fU=class extends Error{constructor(){super(`Cannot parse a reference cycle that closes through a transform`),this.name=`ZodCyclicError`}},pU=`~memo`,mU=[];function hU(e){return typeof e==`object`&&!!e}function gU(e){return e.map(e=>e.path?{...e,path:e.path.slice()}:{...e})}var _U=new WeakMap,vU=0,yU=1,bU=2;function xU(e,t,n){let r=_U.get(e);if(r!==void 0)return r?bU:vU;if(t.has(e))return bU;t.add(e);let i=vU,a=e=>{if(i!==bU&&e?._zod){let r=xU(e,t,n);r>i&&(i=r)}},o=(e,r)=>{let i=vU;for(let a of Reflect.ownKeys(e)){let o=Object.getOwnPropertyDescriptor(e,a);if(r&&!o.enumerable)continue;let s=o.get?yU:o.value?._zod?xU(o.value,t,n):vU;s>i&&(i=s)}return i},s=e=>{e>i&&(i=e)},c=e._zod.def;switch(c.type){case`object`:{let e=$R(c);s(e?o(e,!0):yU),a(c.catchall);break}case`array`:a(c.element);break;case`tuple`:for(let e of c.items)a(e);a(c.rest);break;case`record`:case`map`:a(c.keyType),a(c.valueType);break;case`set`:a(c.valueType);break;case`union`:for(let e of c.options)a(e);break;case`intersection`:a(c.left),a(c.right);break;case`optional`:case`nullable`:case`default`:case`prefault`:case`catch`:case`readonly`:case`nonoptional`:case`promise`:case`success`:a(c.innerType);break;case`pipe`:a(c.in),a(c.out);break;case`function`:a(c.input),a(c.output);break;case`lazy`:{let r=c._cachedInner??(n?e._zod.innerType:void 0);s(r?xU(r,t,!1):yU);break}case`template_literal`:case`string`:case`number`:case`int`:case`boolean`:case`bigint`:case`symbol`:case`undefined`:case`null`:case`void`:case`never`:case`any`:case`unknown`:case`date`:case`nan`:case`enum`:case`literal`:case`file`:case`transform`:case`custom`:break;default:for(let e in c){let t=Object.getOwnPropertyDescriptor(c,e);if(!t||t.get)continue;let n=t.value;if(n&&typeof n==`object`){if(n._zod)a(n);else if(Array.isArray(n))for(let e of n)a(e)}}}return t.delete(e),SU(e,i)}function SU(e,t){return t!==yU&&_U.set(e,t===bU),t}function CU(e,t){let n=e.buckets.get(t);return n||(n=new WeakMap,e.buckets.set(t,n)),n}var wU,TU=[],EU={alloc(e,t,n){let r=wU;if(!r)return n;wU=void 0;let i={value:n,issues:null};return r.set(t.value,i),TU.push(i),n},guard(e){var t;(t=e._zod).deferred??(t.deferred=[]),e._zod.deferred.push(()=>{let t=e._zod.parse,n=(e,n)=>{if(n.direction!==`backward`&&OU(n,e.value))throw new fU;return t(e,n)};e._zod.parse=n,e._zod.run===t&&(e._zod.run=n)})},attach(e){var t;let n,r=!1,i,a;(t=e._zod).deferred??(t.deferred=[]),e._zod.deferred.push(()=>{let t=e._zod.parse,o=(s,c)=>{if(n===void 0){let i=xU(e,new Set,!1);if(i===vU)return e._zod.parse=t,e._zod.run===o&&(e._zod.run=t),t(s,c);i===bU||r?n=!0:r=!0}let l=s.value;if(!hU(l))return t(s,c);let u=c[pU];u||(u={buckets:new WeakMap,backEdges:void 0},c[pU]=u);let d;i===c?d=a:(d=CU(u,e),i=c,a=d);let f=d.get(l);if(f)return s.value=f.value,f.issues?f.issues.length&&s.issues.push(...gU(f.issues)):(s.memo=!0,u.backEdges??(u.backEdges=new WeakSet),u.backEdges.add(f.value)),s;wU=d;let p=TU.length,m=t(s,c);wU=void 0;let h=TU.length>p?TU.pop():void 0;return m instanceof Promise?m.then(e=>(h&&(h.issues=e.issues.length?gU(e.issues):mU),e)):(h&&(h.issues=m.issues.length?gU(m.issues):mU),m)};e._zod.parse=o,e._zod.run===t&&(e._zod.run=o)})}};function DU(){return EU}function OU(e,t){let n=e[pU]?.backEdges;return n!==void 0&&hU(t)&&n.has(t)}var kU=()=>{let e={string:{unit:`characters`,verb:`to have`},file:{unit:`bytes`,verb:`to have`},array:{unit:`items`,verb:`to have`},set:{unit:`items`,verb:`to have`},map:{unit:`entries`,verb:`to have`}};function t(t){return e[t]??null}let n={regex:`input`,email:`email address`,url:`URL`,emoji:`emoji`,uuid:`UUID`,uuidv4:`UUIDv4`,uuidv6:`UUIDv6`,nanoid:`nanoid`,guid:`GUID`,cuid:`cuid`,cuid2:`cuid2`,ulid:`ULID`,xid:`XID`,ksuid:`KSUID`,datetime:`ISO datetime`,date:`ISO date`,time:`ISO time`,duration:`ISO duration`,ipv4:`IPv4 address`,ipv6:`IPv6 address`,mac:`MAC address`,cidrv4:`IPv4 range`,cidrv6:`IPv6 range`,base64:`base64-encoded string`,base64url:`base64url-encoded string`,json_string:`JSON string`,e164:`E.164 number`,currency_code:`currency code`,credit_card:`credit card number`,iban:`IBAN`,jwt:`JWT`,template_literal:`input`},r={nan:`NaN`};function i(e,t){return e===`number`&&typeof t==`number`&&!Number.isFinite(t)?String(t):r[e]??e}return e=>{switch(e.code){case`invalid_type`:return`Invalid input: expected ${i(e.expected)}, received ${i(zz(e.input),e.input)}`;case`invalid_value`:return e.values.length===1?`Invalid input: expected ${_z(e.values[0])}`:`Invalid option: expected one of ${GR(e.values,`|`)}`;case`too_big`:{let n=e.exact?`exactly `:e.inclusive?`<=`:`<`,r=t(e.origin);return r?`Too big: expected ${e.origin??`value`} to have ${n}${e.maximum.toString()} ${r.unit??`elements`}`:`Too big: expected ${e.origin??`value`} to be ${n}${e.maximum.toString()}`}case`too_small`:{let n=e.exact?`exactly `:e.inclusive?`>=`:`>`,r=t(e.origin);return r?`Too small: expected ${e.origin} to have ${n}${e.minimum.toString()} ${r.unit}`:`Too small: expected ${e.origin} to be ${n}${e.minimum.toString()}`}case`invalid_format`:{let t=e;return t.format===`starts_with`?`Invalid string: must start with "${t.prefix}"`:t.format===`ends_with`?`Invalid string: must end with "${t.suffix}"`:t.format===`includes`?`Invalid string: must include "${t.includes}"`:t.format===`regex`?`Invalid string: must match pattern ${t.pattern}`:`Invalid ${n[t.format]??e.format}`}case`not_multiple_of`:return`Invalid number: must be a multiple of ${e.divisor}`;case`unrecognized_keys`:return`Unrecognized key${e.keys.length>1?`s`:``}: ${GR(e.keys,`, `)}`;case`invalid_key`:return`Invalid key in ${e.origin}`;case`invalid_union`:return e.options&&Array.isArray(e.options)&&e.options.length>0?`Invalid discriminator value. Expected ${e.options.map(e=>`'${e}'`).join(` | `)}`:e.inclusive===!1?`Invalid input: more than one option matched`:`Invalid input`;case`invalid_element`:return`Invalid value in ${e.origin}`;default:return`Invalid input`}}};function AU(){return{localeError:kU()}}var jU,MU=class{constructor(){this._map=new WeakMap,this._idmap=new Map}add(e,...t){let n=t[0];return this._map.set(e,n),n&&typeof n==`object`&&`id`in n&&this._idmap.set(n.id,e),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(e){let t=this._map.get(e);return t&&typeof t==`object`&&`id`in t&&this._idmap.delete(t.id),this._map.delete(e),this}get(e){let t=e._zod.parent;if(t){let n={...this.get(t)??{}};delete n.id;let r={...n,...this._map.get(e)};return Object.keys(r).length?r:void 0}return this._map.get(e)}has(e){return this._map.has(e)}};function NU(){return new MU}(jU=globalThis).__zod_globalRegistry??(jU.__zod_globalRegistry=NU());var PU=globalThis.__zod_globalRegistry;function FU(e){return e.checks&&=[...e.checks],e}function IU(e,t){return new e(FU({type:`string`,...gz(t)}))}function LU(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...gz(t)})}function RU(e,t){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...gz(t)})}function zU(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...gz(t)})}function BU(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...gz(t)})}function VU(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...gz(t)})}function HU(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...gz(t)})}function UU(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...gz(t)})}function WU(e,t){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...gz(t)})}function GU(e,t){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...gz(t)})}function KU(e,t){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...gz(t)})}function qU(e,t){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...gz(t)})}function JU(e,t){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...gz(t)})}function YU(e,t){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...gz(t)})}function XU(e,t){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...gz(t)})}function ZU(e,t){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...gz(t)})}function QU(e,t){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...gz(t)})}function $U(e,t){return new e({type:`string`,format:`cidrv4`,check:`string_format`,abort:!1,...gz(t)})}function eW(e,t){return new e({type:`string`,format:`cidrv6`,check:`string_format`,abort:!1,...gz(t)})}function tW(e,t){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...gz(t)})}function nW(e,t){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...gz(t)})}function rW(e,t){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...gz(t)})}function iW(e,t){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...gz(t)})}function aW(e,t){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...gz(t)})}function oW(e,t){return new e({type:`string`,format:`date`,check:`string_format`,...gz(t)})}function sW(e,t){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...gz(t)})}function cW(e,t){return new e({type:`string`,format:`duration`,check:`string_format`,...gz(t)})}function lW(e,t){return new e(FU({type:`number`,checks:[],...gz(t)}))}function uW(e,t){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...gz(t)})}function dW(e,t){return new e({type:`boolean`,...gz(t)})}function fW(e){return new e({type:`unknown`})}function pW(e,t){return new e({type:`never`,...gz(t)})}function mW(e,t){return new vV({check:`less_than`,...gz(t),value:e,inclusive:!1})}function hW(e,t){return new vV({check:`less_than`,...gz(t),value:e,inclusive:!0})}function gW(e,t){return new yV({check:`greater_than`,...gz(t),value:e,inclusive:!1})}function _W(e,t){return new yV({check:`greater_than`,...gz(t),value:e,inclusive:!0})}function vW(e,t){return new bV({check:`multiple_of`,...gz(t),value:e})}function yW(e,t){return new SV({check:`max_length`,...gz(t),maximum:e})}function bW(e,t){return new CV({check:`min_length`,...gz(t),minimum:e})}function xW(e,t){return new wV({check:`length_equals`,...gz(t),length:e})}function SW(e,t){return new EV({check:`string_format`,format:`regex`,...gz(t),pattern:e})}function CW(e){return new DV({check:`string_format`,format:`lowercase`,...gz(e)})}function wW(e){return new OV({check:`string_format`,format:`uppercase`,...gz(e)})}function TW(e,t){return new kV({check:`string_format`,format:`includes`,...gz(t),includes:e})}function EW(e,t){return new AV({check:`string_format`,format:`starts_with`,...gz(t),prefix:e})}function DW(e,t){return new jV({check:`string_format`,format:`ends_with`,...gz(t),suffix:e})}function OW(e){return new MV({check:`overwrite`,tx:e})}function kW(e){return OW(t=>t.normalize(e))}function AW(){return OW(e=>e.trim())}function jW(){return OW(e=>e.toLowerCase())}function MW(){return OW(e=>e.toUpperCase())}function NW(){return OW(e=>sz(e))}function PW(e,t,n){return new e({type:`array`,element:t,...gz(n)})}function FW(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...gz(n)})}function IW(e,t){let n=LW(t=>(t.addIssue=e=>{if(typeof e==`string`)t.issues.push(Bz(e,t.value,n._zod.def));else{let r=e;r.fatal&&(r.continue=!1),r.code??=`custom`,`input`in r||(r.input=t.value),r.inst??=n,r.continue??=!n._zod.def.abort,t.issues.push(Bz(r))}},e(t.value,t)),t);return n}function LW(e,t){let n=new hV({check:`custom`,...gz(t)});return n._zod.check=e,n}function RW(e,...t){for(let n of t)for(let t of Reflect.ownKeys(n))Object.prototype.propertyIsEnumerable.call(n,t)&&QR(e,t,n[t]);return e}function zW(e){let t=e?.target??`draft-2020-12`;return t===`draft-4`&&(t=`draft-04`),t===`draft-7`&&(t=`draft-07`),{processors:e.processors??{},metadataRegistry:e?.metadata??PU,target:t,unrepresentable:e?.unrepresentable??`throw`,override:e?.override??(()=>{}),io:e?.io??`output`,counter:0,seen:new Map,sharedDefsExtractedFor:void 0,sharedEmitDoneFor:void 0,cycles:e?.cycles??`ref`,reused:e?.reused??`inline`,intersections:[],deferred:[],external:e?.external??void 0}}function BW(e,t,n,r,i){let a=typeof t.unrepresentable==`function`?t.unrepresentable({zodSchema:e,path:r.path,message:i}):t.unrepresentable;if(a===`any`)return!1;if(a===void 0||a===`throw`)throw Error(i);return Object.assign(n,a),!0}function VW(e,t,n={path:[],schemaPath:[]}){var r;let i=e._zod.def,a=t.seen.get(e);if(a)return a.count++,n.schemaPath.includes(e)&&(a.cycle=n.path),a.schema;let o={schema:{},count:1,cycle:void 0,path:n.path};t.seen.set(e,o),t.sharedDefsExtractedFor=void 0,t.sharedEmitDoneFor=void 0;let s=e._zod.toJSONSchema?.();if(s)o.schema=s;else{let r={...n,schemaPath:[...n.schemaPath,e],path:n.path};if(e._zod.processJSONSchema)e._zod.processJSONSchema(t,o.schema,r);else{let n=o.schema,a=t.processors[i.type];if(!a)throw Error(`[toJSONSchema]: Non-representable type encountered: ${i.type}`);a(e,t,n,r)}let a=e._zod.parent;a&&(o.ref||=a,VW(a,t,r),t.seen.get(a).isParent=!0)}let c=t.metadataRegistry.get(e);return c&&RW(o.schema,c),t.io===`input`&&ZW(e)&&(delete o.schema.examples,delete o.schema.default),t.io===`input`&&`_prefault`in o.schema&&((r=o.schema).default??(r.default=o.schema._prefault)),delete o.schema._prefault,t.seen.get(e).schema}function HW(e){return e.replace(/~/g,`~0`).replace(/\//g,`~1`)}function UW(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);if(e.external&&e.sharedDefsExtractedFor===e.external)return;let r=new Map;for(let t of e.seen.entries()){let n=e.metadataRegistry.get(t[0])?.id;if(n){let e=r.get(n);if(e&&e!==t[0])throw Error(`Duplicate schema id "${n}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);r.set(n,t[0])}}let i=t=>{let r=e.target===`draft-2020-12`?`$defs`:`definitions`;if(e.external){let n=e.external.registry.get(t[0])?.id,i=e.external.uri??(e=>e);if(n)return{ref:i(n)};let a=t[1].defId??t[1].schema.id??`schema${e.counter++}`;return t[1].defId=a,{defId:a,ref:`${i(`__shared`)}#/${r}/${HW(a)}`}}let i=`#/${r}/`;if(t[1]===n&&!t[1].schema.id)return{ref:`#`};let a=t[1].schema.id??`__schema${e.counter++}`;return{defId:a,ref:i+HW(a)}},a=e=>{if(e[1].schema.$ref)return;let t=e[1],{ref:n,defId:r}=i(e);t.def={...t.schema},r&&(t.defId=r);let a=t.schema;for(let e in a)delete a[e];a.$ref=n};if(e.cycles===`throw`)for(let t of e.seen.entries()){let e=t[1];if(e.cycle)throw Error(`Cycle detected: #/${e.cycle?.join(`/`)}/<root>
|
|
151
|
+
|
|
152
|
+
Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0])a(n);else{if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}(e.metadataRegistry.get(n[0])?.id||r.cycle||r.count>1&&e.reused===`ref`)&&a(n)}}e.external&&(e.sharedDefsExtractedFor=e.external)}function WW(e){let t=e.anyOf;if(!Array.isArray(t)||t.length===0||e.type!==void 0)return;let n=[];for(let e of t){if(!e||typeof e!=`object`)return;WW(e);let t=Object.keys(e);if(t.length!==1||t[0]!==`type`)return;let r=e.type;for(let e of Array.isArray(r)?r:[r]){if(typeof e!=`string`)return;n.includes(e)||n.push(e)}}delete e.anyOf,e.type=n.length===1?n[0]:n}var GW=new Set([`type`,`properties`,`required`,`additionalProperties`]),KW=[`oneOf`,`anyOf`];function qW(e){let t=e.additionalProperties;return t===void 0||t===!1||typeof t!=`object`||!t?null:Object.keys(t).length?t:null}function JW(e){let t=[];for(let n of e){if(typeof n!=`object`||n.type!==`object`)return null;for(let e in n)if(!GW.has(e))return null;t.push(n)}let n={},r=new Set;for(let e of t){for(let r in e.properties){if(Object.prototype.hasOwnProperty.call(n,r))continue;let e=[];for(let n of t){let t=n.properties?.[r]??qW(n);t!=null&&(e.some(e=>JSON.stringify(e)===JSON.stringify(t))||e.push(t))}QR(n,r,e.length===1?e[0]:JW(e)??{allOf:e})}for(let t of e.required??[])r.add(t)}let i={type:`object`,properties:n};if(r.size&&(i.required=[...r]),t.every(e=>e.additionalProperties===!1))i.additionalProperties=!1;else{let e=[];for(let n of t){let t=qW(n);t&&!e.some(e=>JSON.stringify(e)===JSON.stringify(t))&&e.push(t)}e.length===1?i.additionalProperties=e[0]:e.length>1&&(i.additionalProperties={allOf:e})}return i}function YW(e){let t=e.allOf;if(!Array.isArray(t)||t.length<2)return;for(let t of GW)if(t in e)return;let n=t.filter(e=>KW.some(t=>Array.isArray(e[t]))),r=null;if(!n.length)r=JW(t);else{let e=n[0],i=KW.find(t=>Array.isArray(e[t]));if(Object.keys(e).length!==1)return;let a=t.filter(t=>t!==e),o=e[i].map(e=>JW([...a,e]));if(o.some(e=>!e))return;r={[i]:o}}r&&(delete e.allOf,RW(e,r))}function XW(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):RW(i,s),RW(i,a),t._zod.parent===o)for(let e in i)e!==`$ref`&&e!==`allOf`&&(e in a||delete i[e]);if(s.$ref&&n.def)for(let e in i)e!==`$ref`&&e!==`allOf`&&e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e!==`$ref`&&e!==`allOf`&&e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};if(!e.external||e.sharedEmitDoneFor!==e.external){for(let t of[...e.seen.entries()].reverse())r(t[0]);if(e.target!==`openapi-3.0`)for(let t of e.seen.entries())WW(t[1].def??t[1].schema);for(let t of e.deferred)t();if(e.intersections.length){let t=new Map;for(let n of e.seen.values())for(let e of[n.schema,n.def]){let n=e?.allOf;if(!Array.isArray(n))continue;let r=t.get(n);r?r.push(e):t.set(n,[e])}for(let n of e.intersections)for(let e of t.get(n)??[])YW(e)}}let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}RW(i,n.defId?n.schema:n.def??n.schema);let a=e.metadataRegistry.get(t)?.id;a!==void 0&&i.id===a&&delete i.id;let o=e.external?.defs??{};if(!e.external||e.sharedEmitDoneFor!==e.external)for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(e.def.id===e.defId&&delete e.def.id,QR(o,e.defId,e.def))}e.external&&(e.sharedEmitDoneFor=e.external),e.external||Object.keys(o).length>0&&(e.target===`draft-2020-12`?i.$defs=o:i.definitions=o);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,"~standard",{value:{...t[`~standard`],jsonSchema:{input:$W(t,`input`,e.processors),output:$W(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function ZW(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return ZW(r.element,n);if(r.type===`set`)return ZW(r.valueType,n);if(r.type===`lazy`)return ZW(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type==="default"||r.type===`prefault`||r.type===`catch`)return ZW(r.innerType,n);if(r.type===`intersection`)return ZW(r.left,n)||ZW(r.right,n);if(r.type===`record`||r.type===`map`)return ZW(r.keyType,n)||ZW(r.valueType,n);if(r.type===`pipe`)return e._zod.traits.has(`$ZodCodec`)?!0:ZW(r.in,n)||ZW(r.out,n);if(r.type===`object`){for(let e in r.shape)if(ZW(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(ZW(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(ZW(e,n))return!0;return!!(r.rest&&ZW(r.rest,n))}return!1}var QW=(e,t={})=>n=>{let r=zW({...n,processors:t});return VW(e,r),UW(r,e),XW(r,e)},$W=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=zW({...i??{},target:a,io:t,processors:n});return VW(e,o),UW(o,e),XW(o,e)},eG=(e,t,n)=>{(e[t]===void 0||n>e[t])&&(e[t]=n)},tG=(e,t,n)=>{(e[t]===void 0||n<e[t])&&(e[t]=n)},nG=(e,t)=>{eG(e,`minimum`,t),tG(e,`maximum`,t)},rG=(e,t)=>{e.multipleOf??=[],e.multipleOf.includes(t)||e.multipleOf.push(t)},iG=(e,t)=>{e.patterns??=new Set,e.patterns.add(t)},aG=(e,t)=>{e.mime=e.mime?e.mime.filter(e=>t.includes(e)):[...t]},oG=(e,t)=>{e.format=t,t.includes(`int`)&&(e.isInt=!0)},sG=(e,t)=>eG(e,`minimum`,t.minimum),cG=(e,t)=>tG(e,`maximum`,t.maximum),lG=e=>(t,n)=>{oG(t,n.format);let[r,i]=e[n.format];eG(t,`minimum`,r),tG(t,`maximum`,i)},uG={greater_than:(e,t)=>eG(e,t.inclusive?`minimum`:`exclusiveMinimum`,t.value),less_than:(e,t)=>tG(e,t.inclusive?`maximum`:`exclusiveMaximum`,t.value),multiple_of:(e,t)=>rG(e,t.value),number_format:lG(yz),bigint_format:lG(bz),min_length:sG,max_length:cG,length_equals:(e,t)=>nG(e,t.length),min_size:sG,max_size:cG,size_equals:(e,t)=>nG(e,t.size),string_format:(e,t)=>{oG(e,t.format),t.pattern&&iG(e,t.pattern),(t.format===`base64`||t.format===`base64url`)&&(e.contentEncoding=t.format),(t.local||t.precision===-1)&&(e.laxFormat=!0)},mime_type:(e,t)=>aG(e,t.mime)};function dG(e){let t={},n=e._zod.def,r=e._zod.traits.has(`$ZodCheck`)?[e,...n.checks??[]]:n.checks??[];for(let e of r)uG[e._zod.def.check]?.(t,e._zod.def);let i=e._zod.bag;i.minimum!==void 0&&eG(t,`minimum`,i.minimum),i.exclusiveMinimum!==void 0&&eG(t,`exclusiveMinimum`,i.exclusiveMinimum),i.maximum!==void 0&&tG(t,`maximum`,i.maximum),i.exclusiveMaximum!==void 0&&tG(t,`exclusiveMaximum`,i.exclusiveMaximum),i.multipleOf!==void 0&&rG(t,i.multipleOf),i.format!==void 0&&(t.format??=i.format,i.format.includes(`int`)&&(t.isInt=!0)),i.mime&&aG(t,i.mime);for(let e of i.patterns??[])iG(t,e);return t}var fG={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},pG=new Map([[_H,$B],[yH,eV]]),mG=e=>pG.get(e)??e,hG=(e,t,n,r)=>{let i=n;i.type=`string`;let{minimum:a,maximum:o,format:s,patterns:c,contentEncoding:l,laxFormat:u}=dG(e);if(typeof a==`number`&&(i.minLength=a),typeof o==`number`&&(i.maxLength=o),s&&(i.format=fG[s]??s,i.format===``&&delete i.format,(s===`time`||u)&&delete i.format),l&&(i.contentEncoding=l),c&&c.size>0){let e=[...c].map(mG);e.length===1?i.pattern=e[0].source:e.length>1&&(i.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},gG=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,multipleOf:s,exclusiveMaximum:c,exclusiveMinimum:l,isInt:u}=dG(e);i.type=u?`integer`:`number`;let d=typeof l==`number`&&l>=(a??-1/0),f=typeof c==`number`&&c<=(o??1/0),p=t.target===`draft-04`||t.target===`openapi-3.0`;if(d?p?(i.minimum=l,i.exclusiveMinimum=!0):i.exclusiveMinimum=l:typeof a==`number`&&(i.minimum=a),f?p?(i.maximum=c,i.exclusiveMaximum=!0):i.exclusiveMaximum=c:typeof o==`number`&&(i.maximum=o),s){let n=new Set;for(let a of s)Number.isFinite(a)&&a!==0?n.add(Math.abs(a)):BW(e,t,i,r,`A multipleOf divisor of ${a} cannot be represented in JSON Schema`);let[a,...o]=n;a!==void 0&&(i.multipleOf=a),o.length&&(i.allOf=[...i.allOf??[],...o.map(e=>({multipleOf:e}))])}},_G=(e,t,n,r)=>{n.type=`boolean`},vG=(e,t,n,r)=>{n.not={}},yG=(e,t,n,r)=>{let i=e._zod.def,a=WR(i.entries);a.length===0?n.not={}:(a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a)},bG=(e,t,n,r)=>{let i=e._zod.def;if(i.values.length===0){n.not={};return}let a=[];for(let o of i.values)if(o===void 0){if(BW(e,t,n,r,"Literal `undefined` cannot be represented in JSON Schema"))return}else if(typeof o==`bigint`){if(BW(e,t,n,r,`BigInt literals cannot be represented in JSON Schema`))return;a.push(Number(o))}else a.push(o);if(a.length!==0){if(a.length===1){let e=a[0];n.type=e===null?`null`:typeof e,t.target===`draft-04`||t.target===`openapi-3.0`?n.enum=[e]:n.const=e}else a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),a.every(e=>typeof e==`boolean`)&&(n.type=`boolean`),a.every(e=>e===null)&&(n.type=`null`),n.enum=a}},xG=(e,t,n,r)=>{BW(e,t,n,r,`Custom types cannot be represented in JSON Schema`)},SG=(e,t,n,r)=>{BW(e,t,n,r,`Transforms cannot be represented in JSON Schema`)},CG=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=dG(e);typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=VW(a.element,t,{...r,path:[...r.path,`items`]})};function wG(e){let t=e._zod.def;return t.type===`pipe`&&t.in._zod.traits.has(`$ZodTransform`)?wG(t.out):t.type===`catch`?wG(t.innerType):e._zod.optin}var TG=(e,t,n,r)=>{let i=n,a=e._zod.def,o=a.shape;if(Object.getOwnPropertySymbols(o).length&&BW(e,t,i,r,`Symbol keys cannot be represented in JSON Schema`))return;i.type=`object`,i.properties={};for(let e in o)QR(i.properties,e,VW(o[e],t,{...r,path:[...r.path,`properties`,e]}));let s=[];for(let e of Object.keys(o)){let n=a.shape[e];(t.io===`input`?wG(n)===void 0:n._zod.optout===void 0)&&s.push(e)}s.length>0&&(i.required=s),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=VW(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},EG=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>VW(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},DG=(e,t,n,r)=>{let i=e._zod.def,a=VW(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=VW(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1,c=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]];n.allOf=c,t.intersections.push(c)};function OG(e,t,n){if(t.$ref){if(n.has(t))return t;n.add(t);let r=e.get(t)?.def;if(!r)return t;let i=OG(e,r,n);return i===r?t:i}for(let r of[`anyOf`,`oneOf`]){let i=t[r];if(!Array.isArray(i))continue;let a=i.map(t=>OG(e,t,n));a.some((e,t)=>e!==i[t])&&(t={...t,[r]:a})}let r=Array.isArray(t.type)?t.type:[t.type],i=!r.includes(`string`)&&r.some(e=>e===`number`||e===`integer`),a=t.enum??(t.const===void 0?void 0:[t.const]);if(!i&&!a?.some(e=>typeof e==`number`))return t;let{minimum:o,maximum:s,exclusiveMinimum:c,exclusiveMaximum:l,multipleOf:u,format:d,id:f,...p}=t;return p.enum?p.enum=p.enum.map(e=>typeof e==`number`?String(e):e):typeof p.const==`number`&&(p.const=String(p.const)),i&&(p.type=`string`,a||(p.pattern=(r.includes(`number`)?dV:uV).source)),p}var kG=new WeakMap;function AG(e){let t=new Map;for(let n of e.seen.values())n.def&&!t.has(n.schema)&&t.set(n.schema,n);let n=new Map;for(let r of kG.get(e)??[]){let i=e.seen.get(r),a=(i?.def??i?.schema)?.propertyNames;if(!a||a===!0||n.has(a))continue;let o=OG(t,a,new Set);o!==a&&n.set(a,o)}if(n.size)for(let t of e.seen.values())for(let e of[t.schema,t.def]){let t=e&&n.get(e.propertyNames);t&&(e.propertyNames=t)}}var jG=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`;let o=a.keyType,s=dG(o).patterns;if(a.mode===`loose`&&s&&s.size>0){let e=VW(a.valueType,t,{...r,path:[...r.path,`patternProperties`,`*`]});i.patternProperties={};for(let t of s)QR(i.patternProperties,mG(t).source,e)}else{if(t.target===`draft-07`||t.target===`draft-2020-12`){i.propertyNames=VW(a.keyType,t,{...r,path:[...r.path,`propertyNames`]});let n=kG.get(t);n||(n=[],kG.set(t,n),t.deferred.push(()=>AG(t))),n.push(e)}i.additionalProperties=VW(a.valueType,t,{...r,path:[...r.path,`additionalProperties`]})}let c=o._zod.values,l=t.io===`input`&&wG(a.valueType)!==void 0;if(c&&!a.partial&&!l){let e=[...c].filter(e=>typeof e==`string`||typeof e==`number`);e.length>0&&(i.required=e.map(String))}},MG=(e,t,n,r)=>{let i=e._zod.def,a=VW(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},NG=(e,t,n,r)=>{let i=e._zod.def;VW(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},PG=Symbol();function FG(e,t,n,r,i){let a=!1,o=JSON.stringify(e,(e,t)=>typeof t==`bigint`?(a=!0,null):t);return a?(BW(t,n,r,i,`BigInt defaults cannot be represented in JSON Schema`),PG):JSON.parse(o)}var IG=(e,t,n,r)=>{let i=e._zod.def;VW(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o=FG(i.defaultValue,e,t,n,r);o!==PG&&(n.default=o)},LG=(e,t,n,r)=>{let i=e._zod.def;VW(i.innerType,t,r);let a=t.seen.get(e);if(a.ref=i.innerType,t.io!==`input`)return;let o=FG(i.defaultValue,e,t,n,r);o!==PG&&(n._prefault=o)},RG=(e,t,n,r)=>{let i=e._zod.def;VW(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{BW(e,t,n,r,`Dynamic catch values are not supported in JSON Schema`);return}n.default=o},zG=(e,t,n,r)=>{let i=e._zod.def,a=i.in._zod.traits.has(`$ZodTransform`),o=t.io===`input`?a?i.out:i.in:i.out;VW(o,t,r);let s=t.seen.get(e);s.ref=o},BG=(e,t,n,r)=>{let i=e._zod.def;VW(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},VG=(e,t,n,r)=>{let i=e._zod.def;VW(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},HG=new WeakSet([Object.prototype,Error.prototype]);function UG(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!1,get(){let e=n(this);return Object.defineProperty(this,t,{value:e,configurable:!0,writable:!0}),e},set(e){Object.defineProperty(this,t,{value:e,configurable:!0,writable:!0})}})}var WG=$(`ZodError`,(e,t)=>{pB.init(e,t),e.name=`ZodError`;let n=Object.getPrototypeOf(e);HG.has(n)||(HG.add(n),UG(n,`format`,e=>t=>gB(e,t)),UG(n,`flatten`,e=>t=>hB(e,t)),UG(n,`addIssue`,e=>t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,KR,2)}),UG(n,`addIssues`,e=>t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,KR,2)}),Object.defineProperty(n,"isEmpty",{configurable:!0,enumerable:!1,get(){return this.issues.length===0}}))},void 0,{Parent:Error}),GG=vB(WG),KG=yB(WG),qG=bB(WG),JG=SB(WG),YG=OB(WG),XG=kB(WG),ZG=AB(WG),QG=jB(WG),$G=MB(WG),eK=NB(WG),tK=PB(WG),nK=FB(WG);function rK(){oB.localeError||sB(AU())}function iK(){oB.memoizer||sB({memoizer:DU()})}var aK=$(`ZodType`,(e,t)=>(rK(),FV.init(e,t),e.def=t,e.type=t.type,e),{check(...e){let t=this.def;return this.clone(az(t,{checks:[...t.checks??[],...e.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0})},with(...e){return this.check(...e)},clone(e,t){return hz(this,e,t)},brand(){return this},register(e,t){return e.add(this,t),this},refine(e,t){return this.check(Dq(e,t))},superRefine(e,t){return this.check(Oq(e,t))},overwrite(e){return this.check(OW(e))},optional(){return lq(this)},exactOptional(){return dq(this)},nullable(){return pq(this)},nullish(){return lq(pq(this))},nonoptional(e){return yq(this,e)},array(){return WK(this)},or(e){return YK([this,e])},and(e){return $K(this,e)},transform(e){return Cq(this,sq(e))},default(e){return hq(this,e)},prefault(e){return _q(this,e)},catch(e){return xq(this,e)},pipe(e){return Cq(this,e)},readonly(){return Tq(this)},describe(e){let t=this.clone();return PU.add(t,{description:e}),t},meta(...e){if(e.length===0)return PU.get(this);let t=this.clone();return PU.add(t,e[0]),t},isOptional(){return this.safeParse(void 0).success},isNullable(){return this.safeParse(null).success},apply(e,...t){return t.length===0?e(this):e(this,...t)},get"~standard"(){return Uz(this,`~standard`,{...RV(this),jsonSchema:{input:$W(this,`input`),output:$W(this,`output`)}})},set"~standard"(e){Hz(this,`~standard`,e)},parse:function e(t,n){return GG(this,t,n,{callee:e})},parseAsync:async function e(t,n){return await KG(this,t,n,{callee:e})},safeParse(e,t){return qG(this,e,t)},async safeParseAsync(e,t){return JG(this,e,t)},get spa(){return this?.safeParseAsync},set spa(e){Hz(this,`spa`,e)},validate(e,t){return TB(this,e,t)},validateAsync(e,t){return DB(this,e,t)},encode:function e(t,n){return YG(this,t,n,{callee:e})},decode:function e(t,n){return XG(this,t,n,{callee:e})},encodeAsync:async function e(t,n){return await ZG(this,t,n,{callee:e})},decodeAsync:async function e(t,n){return await QG(this,t,n,{callee:e})},safeEncode(e,t){return $G(this,e,t)},safeDecode(e,t){return eK(this,e,t)},async safeEncodeAsync(e,t){return tK(this,e,t)},async safeDecodeAsync(e,t){return nK(this,e,t)},toJSONSchema(e){return QW(this,{})(e)},get description(){return PU.get(this)?.description},get _def(){return this._zod.def}}),oK=$(`_ZodString`,(e,t)=>{zV.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>hG(e,t,n,r)},Wz({format:e=>dG(e).format??null,minLength:e=>dG(e).minimum??null,maxLength:e=>dG(e).maximum??null},{regex(...e){return this.check(SW(...e))},includes(...e){return this.check(TW(...e))},startsWith(...e){return this.check(EW(...e))},endsWith(...e){return this.check(DW(...e))},min(...e){return this.check(bW(...e))},max(...e){return this.check(yW(...e))},length(...e){return this.check(xW(...e))},nonempty(...e){return this.check(bW(1,...e))},lowercase(e){return this.check(CW(e))},uppercase(e){return this.check(wW(e))},trim(){return this.check(AW())},normalize(...e){return this.check(kW(...e))},toLowerCase(){return this.check(jW())},toUpperCase(){return this.check(MW())},slugify(){return this.check(NW())}})),sK=$(`ZodString`,(e,t)=>{zV.init(e,t),oK.init(e,t)},{email(e){return this.check(LU(mK,e))},url(e){return this.check(UU(_K,e))},jwt(e){return this.check(iW(MK,e))},emoji(e){return this.check(WU(vK,e))},guid(e){return this.check(RU(hK,e))},uuid(e){return this.check(zU(gK,e))},uuidv4(e){return this.check(BU(gK,e))},uuidv6(e){return this.check(VU(gK,e))},uuidv7(e){return this.check(HU(gK,e))},nanoid(e){return this.check(GU(yK,e))},cuid(e){return this.check(KU(bK,e))},cuid2(e){return this.check(qU(xK,e))},ulid(e){return this.check(JU(SK,e))},base64(e){return this.check(tW(kK,e))},base64url(e){return this.check(nW(AK,e))},xid(e){return this.check(YU(CK,e))},ksuid(e){return this.check(XU(wK,e))},ipv4(e){return this.check(ZU(TK,e))},ipv6(e){return this.check(QU(EK,e))},cidrv4(e){return this.check($U(DK,e))},cidrv6(e){return this.check(eW(OK,e))},e164(e){return this.check(rW(jK,e))},datetime(e){return this.check(aW(uK,e))},date(e){return this.check(oW(dK,e))},time(e){return this.check(sW(fK,e))},duration(e){return this.check(cW(pK,e))}});function cK(e){return IU(sK,e)}var lK=$(`ZodStringFormat`,(e,t)=>{BV.init(e,t),oK.init(e,t)}),uK=$(`ZodISODateTime`,(e,t)=>{aH.init(e,t),lK.init(e,t)}),dK=$(`ZodISODate`,(e,t)=>{oH.init(e,t),lK.init(e,t)}),fK=$(`ZodISOTime`,(e,t)=>{sH.init(e,t),lK.init(e,t)}),pK=$(`ZodISODuration`,(e,t)=>{cH.init(e,t),lK.init(e,t)}),mK=$(`ZodEmail`,(e,t)=>{UV.init(e,t),lK.init(e,t)}),hK=$(`ZodGUID`,(e,t)=>{VV.init(e,t),lK.init(e,t)}),gK=$(`ZodUUID`,(e,t)=>{HV.init(e,t),lK.init(e,t)}),_K=$(`ZodURL`,(e,t)=>{ZV.init(e,t),lK.init(e,t)}),vK=$(`ZodEmoji`,(e,t)=>{QV.init(e,t),lK.init(e,t)}),yK=$(`ZodNanoID`,(e,t)=>{$V.init(e,t),lK.init(e,t)}),bK=$(`ZodCUID`,(e,t)=>{eH.init(e,t),lK.init(e,t)}),xK=$(`ZodCUID2`,(e,t)=>{tH.init(e,t),lK.init(e,t)}),SK=$(`ZodULID`,(e,t)=>{nH.init(e,t),lK.init(e,t)}),CK=$(`ZodXID`,(e,t)=>{rH.init(e,t),lK.init(e,t)}),wK=$(`ZodKSUID`,(e,t)=>{iH.init(e,t),lK.init(e,t)}),TK=$(`ZodIPv4`,(e,t)=>{lH.init(e,t),lK.init(e,t)}),EK=$(`ZodIPv6`,(e,t)=>{fH.init(e,t),lK.init(e,t)}),DK=$(`ZodCIDRv4`,(e,t)=>{pH.init(e,t),lK.init(e,t)}),OK=$(`ZodCIDRv6`,(e,t)=>{hH.init(e,t),lK.init(e,t)}),kK=$(`ZodBase64`,(e,t)=>{vH.init(e,t),lK.init(e,t)}),AK=$(`ZodBase64URL`,(e,t)=>{xH.init(e,t),lK.init(e,t)}),jK=$(`ZodE164`,(e,t)=>{SH.init(e,t),lK.init(e,t)}),MK=$(`ZodJWT`,(e,t)=>{wH.init(e,t),lK.init(e,t)}),NK=$(`ZodNumber`,(e,t)=>{TH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>gG(e,t,n,r),e.isFinite=!0},Wz({minValue:e=>{let{minimum:t,exclusiveMinimum:n}=dG(e);return Math.max(t??-1/0,n??-1/0)},maxValue:e=>{let{maximum:t,exclusiveMaximum:n}=dG(e);return Math.min(t??1/0,n??1/0)},isInt:e=>{let{isInt:t,multipleOf:n}=dG(e);return!!t||!!n?.some(Number.isSafeInteger)},format:e=>dG(e).format??null},{gt(e,t){return this.check(gW(e,t))},gte(e,t){return this.check(_W(e,t))},min(e,t){return this.check(_W(e,t))},lt(e,t){return this.check(mW(e,t))},lte(e,t){return this.check(hW(e,t))},max(e,t){return this.check(hW(e,t))},int(e){return this.check(IK(e))},safe(e){return this.check(IK(e))},positive(e){return this.check(gW(0,e))},nonnegative(e){return this.check(_W(0,e))},negative(e){return this.check(mW(0,e))},nonpositive(e){return this.check(hW(0,e))},multipleOf(e,t){return this.check(vW(e,t))},step(e,t){return this.check(vW(e,t))},finite(){return this}}));function PK(e){return lW(NK,e)}var FK=$(`ZodNumberFormat`,(e,t)=>{EH.init(e,t),NK.init(e,t)});function IK(e){return uW(FK,e)}var LK=$(`ZodBoolean`,(e,t)=>{DH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>_G(e,t,n,r)});function RK(e){return dW(LK,e)}var zK=$(`ZodUnknown`,(e,t)=>{OH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function BK(){return fW(zK)}var VK=$(`ZodNever`,(e,t)=>{kH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>vG(e,t,n,r)});function HK(e){return pW(VK,e)}var UK=$(`ZodArray`,(e,t)=>{iK(),jH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>CG(e,t,n,r),e.element=t.element},{min(e,t){return this.check(bW(e,t))},nonempty(e){return this.check(bW(1,e))},max(e,t){return this.check(yW(e,t))},length(e,t){return this.check(xW(e,t))},unwrap(){return this.element}});function WK(e,t){return PW(UK,e,t)}var GK=$(`ZodObject`,(e,t)=>{iK(),LH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>TG(e,t,n,r),Zz(e,`shape`,e=>e._zod.def.shape,!1)},{keyof(){return rq(Object.keys(this._zod.def.shape))},catchall(e){return this.clone(az(this._zod.def,{catchall:e}))},passthrough(){return this.clone(az(this._zod.def,{catchall:BK()}))},loose(){return this.clone(az(this._zod.def,{catchall:BK()}))},strict(){return this.clone(az(this._zod.def,{catchall:HK()}))},strip(){return this.clone(az(this._zod.def,{catchall:void 0}))},extend(e){return wz(this,e)},safeExtend(e){return Ez(this,e)},merge(e){return Dz(this,e)},pick(e){return xz(this,e)},omit(e){return Cz(this,e)},partial(...e){return Oz(cq,this,e[0])},exactPartial(...e){return Oz(uq,this,e[0],`exactPartial`)},required(...e){return kz(vq,this,e[0])}});function KK(e,t){return new GK({type:`object`,shape:e??{},...gz(t)})}function qK(e,t){return new GK({type:`object`,shape:e,catchall:HK(),...gz(t)})}var JK=$(`ZodUnion`,(e,t)=>{zH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>EG(e,t,n,r),e.options=t.options});function YK(e,t){return new JK({type:`union`,options:e,...gz(t)})}var XK=$(`ZodDiscriminatedUnion`,(e,t)=>{JK.init(e,t),VH.init(e,t)});function ZK(e,t,n){return new XK({type:`union`,options:t,discriminator:e,...gz(n)})}var QK=$(`ZodIntersection`,(e,t)=>{HH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>DG(e,t,n,r)});function $K(e,t){return new QK({type:`intersection`,left:e,right:t})}var eq=$(`ZodRecord`,(e,t)=>{iK(),GH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>jG(e,t,n,r),e.keyType=t.keyType,e.valueType=t.valueType});function tq(e,t,n){return!t||!t._zod?new eq({type:`record`,keyType:cK(),valueType:e,...gz(t)}):new eq({type:`record`,keyType:e,valueType:t,...gz(n)})}var nq=$(`ZodEnum`,(e,t)=>{KH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>yG(e,t,n,r),e.enum=t.entries,e.options=[...e._zod.values];let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new nq({...t,checks:[],...gz(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new nq({...t,checks:[],...gz(r),entries:i})}});function rq(e,t){return new nq({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...gz(t)})}var iq=$(`ZodLiteral`,(e,t)=>{qH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>bG(e,t,n,r),e.values=new Set(t.values),Object.defineProperty(e,"value",{get(){if(t.values.length>1)throw Error("This schema contains multiple valid literal values. Use `.values` instead.");return t.values[0]}})});function aq(e,t){return new iq({type:`literal`,values:Array.isArray(e)?e:[e],...gz(t)})}var oq=$(`ZodTransform`,(e,t)=>{iK(),JH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>SG(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new aB(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(Bz(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,`input`in t||(t.input=n.value),t.inst??=e,n.issues.push(Bz(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function sq(e){return new oq({type:`transform`,transform:e})}var cq=$(`ZodOptional`,(e,t)=>{XH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>VG(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function lq(e){return new cq({type:`optional`,innerType:e})}var uq=$(`ZodExactOptional`,(e,t)=>{ZH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>VG(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function dq(e){return new uq({type:`optional`,innerType:e})}var fq=$(`ZodNullable`,(e,t)=>{QH.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>MG(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function pq(e){return new fq({type:`nullable`,innerType:e})}var mq=$(`ZodDefault`,(e,t)=>{$H.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>IG(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function hq(e,t){return new mq({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():fz(t)}})}var gq=$(`ZodPrefault`,(e,t)=>{tU.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>LG(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function _q(e,t){return new gq({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():fz(t)}})}var vq=$(`ZodNonOptional`,(e,t)=>{nU.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>NG(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function yq(e,t){return new vq({type:`nonoptional`,innerType:e,...gz(t)})}var bq=$(`ZodCatch`,(e,t)=>{aU.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>RG(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function xq(e,t){return new bq({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:$z(t)})}var Sq=$(`ZodPipe`,(e,t)=>{oU.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>zG(e,t,n,r),e.in=t.in,e.out=t.out});function Cq(e,t){return new Sq({type:`pipe`,in:e,out:t})}var wq=$(`ZodReadonly`,(e,t)=>{cU.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>BG(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Tq(e){return new wq({type:`readonly`,innerType:e})}var Eq=$(`ZodCustom`,(e,t)=>{uU.init(e,t),aK.init(e,t),e._zod.processJSONSchema=(t,n,r)=>xG(e,t,n,r)});function Dq(e,t={}){return FW(Eq,e,t)}function Oq(e,t){return IW(e,t)}var kq=WK(cK().min(1).max(256)).min(1),Aq=cK().min(1),jq=/^#[\da-f]{6}$/i,Mq=qK({id:cK().min(1),kind:rq([`file`,`directory`]),names:kq.optional(),extensions:kq.optional(),patterns:kq.optional(),paths:kq.optional(),caseSensitive:RK().optional(),executable:RK().optional(),icon:Aq,expandedIcon:Aq.optional()}).refine(e=>!!(e.names||e.extensions||e.patterns||e.paths||e.executable!==void 0),{message:`A rule needs names, extensions, patterns, paths or executable`}),Nq=qK({$schema:cK().optional(),version:aq(1),name:cK().min(1),palette:tq(cK(),cK().regex(jq)),icons:tq(cK(),qK({src:cK().regex(/^\/file-icons\/(?:[\w-]+\/)*[\w.-]+\.svg$/).refine(e=>!e.includes(`..`)),color:cK().min(1)})),defaults:qK({file:Aq,directory:Aq,expandedDirectory:Aq}),rules:WK(Mq)}).superRefine((e,t)=>{let n=(n,r)=>{Object.hasOwn(e.icons,n)||t.addIssue({code:`custom`,path:r,message:`Unknown icon: ${n}`})};for(let[t,r]of Object.entries(e.defaults))n(r,[`defaults`,t]);for(let[n,r]of Object.entries(e.icons))!jq.test(r.color)&&!Object.hasOwn(e.palette,r.color)&&t.addIssue({code:`custom`,path:[`icons`,n,`color`],message:`Unknown color: ${r.color}`});let r=new Set;e.rules.forEach((e,i)=>{r.has(e.id)&&t.addIssue({code:`custom`,path:[`rules`,i,`id`],message:`Duplicate rule: ${e.id}`}),r.add(e.id),n(e.icon,[`rules`,i,`icon`]),e.expandedIcon&&n(e.expandedIcon,[`rules`,i,`expandedIcon`]),e.kind===`directory`&&e.extensions&&t.addIssue({code:`custom`,path:[`rules`,i,`extensions`],message:`Extensions only apply to files`}),e.kind===`directory`&&e.executable!==void 0&&t.addIssue({code:`custom`,path:[`rules`,i,`executable`],message:`Executable only applies to files`})})});function Pq(e,t){let n=``;for(let t=0;t<e.length;t++){let r=e[t];r===`*`&&e[t+1]===`*`?(t++,e[t+1]===`/`?(n+=`(?:.*/)?`,t++):n+=`.*`):n+=r===`*`?`[^/]*`:r===`?`?`[^/]`:r.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}return RegExp(`^${n}$`,t?``:`i`)}function Fq(e){let t=Nq.parse(e),n=t.rules.map(e=>{let t=t=>e.caseSensitive?t:t.toLowerCase(),n=new Set(e.names?.map(t)),r=e.extensions?.map(e=>t(e.replace(/^\./,``))),i=e.patterns?.map(t=>Pq(t,!!e.caseSensitive)),a=e.paths?.map(t=>Pq(t,!!e.caseSensitive));return{rule:e,matches(o){if(o.directory!==(e.kind===`directory`)||e.executable!==void 0&&e.executable!==!!o.executable)return!1;let s=t(o.name),c=o.path.replaceAll(`\\`,`/`).replace(/^\.\//,``);return e.executable!==void 0&&!e.names&&!e.extensions&&!e.patterns&&!e.paths||n.has(s)||r?.some(e=>s.length>e.length+1&&s.endsWith(`.${e}`))||i?.some(e=>e.test(o.name))||a?.some(e=>e.test(c))}}});return{name:t.name,resolve(e,r=!1){let i=n.find(t=>t.matches(e))?.rule;if(e.directory){let e=r?t.defaults.expandedDirectory:t.defaults.directory,n=r?i?.expandedIcon??i?.icon:i?.icon,a=n&&n!==e&&n!==t.defaults.directory&&n!==t.defaults.expandedDirectory?t.icons[n]:void 0,o=t.icons[e],s=a?.color??o.color;return{id:e,src:o.src,color:t.palette[s]??s,ruleId:i?.id,...a&&n?{badge:{id:n,src:a.src,color:t.palette[a.color]??a.color}}:{}}}let a=i?.icon??t.defaults.file,o=t.icons[a];return{id:a,src:o.src,color:t.palette[o.color]??o.color,ruleId:i?.id}}}}var Iq=We(Fq(UR)),Lq=X(``),Rq;function zq(){return Rq||(Rq=(async()=>{try{let e=await fetch(`/file-icons/theme.json`,{cache:`no-store`});if(!e.ok)throw Error(`HTTP ${e.status}`);Iq.value=Fq(await e.json()),Lq.value=``}catch(e){Lq.value=`Не удалось загрузить тему иконок. Используется предыдущая тема.`,console.warn(`File icon theme:`,e)}finally{Rq=void 0}})(),Rq)}var Bq=!1;function Vq(){return Bq||(Bq=!0,zq()),{resolver:cn(Iq),error:cn(Lq)}}var Hq=[`aria-label`],Uq=[`data-git-status`,`onContextmenu`,`onKeydown`],Wq={class:`glyph`,"aria-hidden":`true`},Gq={class:`name u-truncate`},Kq={key:0,class:`u-sr-only`},qq={key:1,class:`count`},Jq=[`disabled`,`title`,`aria-label`,`data-command`,`onFocus`,`onClick`],Yq=G(M({__name:`GitChangesTree`,props:{changes:{},staged:{type:Boolean},selected:{},path:{default:``},depth:{default:0},disabled:{type:Boolean},canToggle:{},readonly:{type:Boolean},label:{}},emits:[`open`,`target`,`change`,`context`],setup(e,{emit:t}){let n=e,r=t,i=X(new Set),{resolver:a}=Vq(),o={added:`новый файл`,deleted:`удалён`};function s(e){let t=e=>n.staged?e.index:e.worktree;if(e.every(e=>[`A`,`?`].includes(t(e))))return`added`;if(e.every(e=>t(e)===`D`))return`deleted`}function c(e,t,n){let r=t?`${t} → ${e}`:e;return n?`${r} · ${o[n]}`:r}let l=z(()=>{let e=new Map,t=n.path?`${n.path}/`:``;for(let r of n.changes){let n=r.path.slice(t.length),i=n.split(`/`)[0],a=`${t}${i}`,o=e.get(a);o||(o={name:i,path:a,directory:n.includes(`/`),changes:[]},e.set(a,o)),o.changes.push(r)}return[...e.values()].map(e=>{if(!e.directory)return e;for(;;){let t=e.changes.map(t=>t.path.slice(e.path.length+1)),n=t[0].split(`/`)[0];if(!t.every(e=>e.startsWith(`${n}/`)))break;e={...e,name:`${e.name}/${n}`,path:`${e.path}/${n}`}}return e}).sort((e,t)=>Number(t.directory)-Number(e.directory)||e.name.localeCompare(t.name)).map(e=>({...e,icon:a.value.resolve({...e,name:e.name.split(`/`).at(-1),executable:!e.directory&&e.changes[0].executable},!i.value.has(e.path)),change:e.changes[0],tint:s(e.changes)}))});function u(e){i.value.has(e)?i.value.delete(e):i.value.add(e)}return(t,n)=>{let a=pe(`GitChangesTree`,!0);return V(),q(`ul`,{class:`git-tree`,"aria-label":e.path||e.label||(e.staged?`Подготовленные изменения`:`Рабочие изменения`)},[(V(!0),q(W,null,J(l.value,t=>(V(),q(`li`,{key:t.path},[K(`div`,{class:O([`git-row`,{selected:!t.directory&&e.selected===t.path}]),"data-git-status":t.tint,onContextmenu:e=>r(`context`,e,t.path),onKeydown:yn(Z(e=>r(`context`,e,t.path),[`shift`,`prevent`]),[`f10`])},[I(ts,{interaction:`item`,radius:`none`,tone:`muted`,gap:1.5,fill:!1,padding:`5px 10px`,class:O([`entry`,{selected:!t.directory&&e.selected===t.path}]),disabled:e.disabled,style:k({paddingLeft:`${12+e.depth*14}px`}),"data-path":t.path,title:c(t.path,t.directory?void 0:t.change.originalPath,t.tint),"aria-expanded":t.directory?!i.value.has(t.path):void 0,"aria-current":!t.directory&&e.selected===t.path?`true`:void 0,onFocus:e=>r(`target`,t.path),onClick:e=>t.directory?u(t.path):r(`open`,t.path,e.detail>=2)},{default:F(()=>[K(`span`,Wq,[t.directory?(V(),Y(H(of),{key:0,class:O({expanded:!i.value.has(t.path)})},null,8,[`class`])):B(``,!0)]),I(H(HR),{icon:t.icon},null,8,[`icon`]),K(`span`,Gq,j(t.name),1),t.tint?(V(),q(`span`,Kq,`, `+j(o[t.tint]),1)):B(``,!0),t.directory?(V(),q(`span`,qq,j(t.changes.length),1)):B(``,!0)]),_:2},1032,[`disabled`,`class`,`style`,`data-path`,`title`,`aria-expanded`,`aria-current`,`onFocus`,`onClick`]),e.readonly?B(``,!0):(V(),q(`button`,{key:0,class:`git-action`,disabled:e.disabled||!e.canToggle?.(t.path),title:e.staged?`Убрать из Staged`:`Отметить Staged`,"aria-label":`${e.staged?`Убрать из Staged`:`Отметить Staged`}: ${t.path}`,"data-command":e.staged?`ide.git.unstage`:`ide.git.stage`,onFocus:e=>r(`target`,t.path),onClick:Z(e=>r(`change`,t.path),[`stop`])},[e.staged?(V(),Y(H(zR),{key:0,"aria-hidden":`true`})):(V(),Y(H(Sg),{key:1,"aria-hidden":`true`}))],40,Jq))],42,Uq),t.directory?et((V(),Y(a,{key:0,changes:t.changes,path:t.path,depth:e.depth+1,staged:e.staged,disabled:e.disabled,"can-toggle":e.canToggle,readonly:e.readonly,selected:e.selected,onChange:n[0]||=e=>r(`change`,e),onOpen:n[1]||=(e,t)=>r(`open`,e,t),onTarget:n[2]||=e=>r(`target`,e),onContext:n[3]||=(e,t)=>r(`context`,e,t)},null,8,[`changes`,`path`,`depth`,`staged`,`disabled`,`can-toggle`,`readonly`,`selected`])),[[Ln,!i.value.has(t.path)]]):B(``,!0)]))),128))],8,Hq)}}}),[[`__scopeId`,`data-v-c561984c`]]),Xq=[`width`,`height`,`viewBox`],Zq=[`d`,`stroke`],Qq=[`d`,`stroke`],$q=[`d`,`stroke`],eJ=[`cx`,`cy`,`r`,`stroke`,`fill`],tJ=10,nJ=7,rJ=G(M({__name:`GitGraphCell`,props:{row:{},columns:{},height:{},hollow:{type:Boolean},merge:{type:Boolean}},setup(e){let t=e,n=[`var(--accent)`,`var(--run)`,`var(--warn)`,`var(--err)`,`var(--muted)`],r=e=>nJ+Math.min(e,t.columns-1)*tJ,i=e=>n[e%n.length],a=z(()=>t.height/2),o=z(()=>14+(t.columns-1)*tJ);function s(e,n,i){let o=i?a.value:0,s=i?t.height:a.value;if(e===n)return`M${r(e)} ${o}V${s}`;let c=(o+s)/2;return`M${r(e)} ${o}C${r(e)} ${c} ${r(n)} ${c} ${r(n)} ${s}`}return(t,n)=>(V(),q(`svg`,{class:`graph`,width:o.value,height:e.height,viewBox:`0 0 ${o.value} ${e.height}`,"aria-hidden":`true`},[(V(!0),q(W,null,J(e.row.through,t=>(V(),q(`path`,{key:`t${t}`,d:`M${r(t)} 0V${e.height}`,stroke:i(t)},null,8,Zq))),128)),(V(!0),q(W,null,J(e.row.joins,t=>(V(),q(`path`,{key:`j${t}`,d:s(t,e.row.column,!1),stroke:i(t)},null,8,Qq))),128)),(V(!0),q(W,null,J(e.row.forks,t=>(V(),q(`path`,{key:`f${t}`,d:s(e.row.column,t,!0),stroke:i(t)},null,8,$q))),128)),K(`circle`,{cx:r(e.row.column),cy:a.value,r:e.merge?3:3.5,stroke:i(e.row.column),fill:e.hollow?`var(--bg)`:i(e.row.column),class:O({merge:e.merge})},null,10,eJ)],8,Xq))}}),[[`__scopeId`,`data-v-949fd468`]]),iJ=[`data-hash`],aJ={class:`head`},oJ=[`aria-expanded`,`title`],sJ={class:`text`},cJ={class:`line`},lJ={class:`subject u-truncate`},uJ={class:`meta`},dJ={key:0,class:`author u-truncate`},fJ={key:1,class:`flag`,title:`Ещё не отправлен в upstream`},pJ={key:2,class:`flag`},mJ={key:0,class:`note`,role:`status`},hJ={key:1,class:`note error`,role:`alert`},gJ={key:0,class:`body`},_J={class:`summary`},vJ={class:`add`},yJ={class:`del`},bJ={key:1,class:`note`},xJ=40,SJ=10,CJ=G(M({__name:`GitCommitRow`,props:{commit:{},row:{},columns:{},expanded:{type:Boolean},state:{},me:{},now:{}},emits:[`toggle`,`open`,`copy`,`openDiff`,`context`,`target`],setup(e,{emit:t}){let n=e,r=t,i=z(()=>({width:`${14+(n.columns-1)*SJ}px`})),a=z(()=>[...new Set([...n.row.through,...n.row.forks])].map(e=>({column:e,left:`${6.25+Math.min(e,n.columns-1)*SJ}px`}))),o=z(()=>n.state?.detail?.files.map(e=>({path:e.path,originalPath:e.originalPath,index:e.status,worktree:` `}))??[]),s=z(()=>n.commit.parents.length>1),c=z(()=>!!n.me&&n.commit.email===n.me),l=z(()=>n.commit.refs.filter(e=>e.name!==`HEAD`||n.commit.refs.length===1));return(t,n)=>(V(),q(`li`,{class:O([`commit`,{expanded:e.expanded}]),"data-hash":e.commit.hash},[K(`div`,aJ,[K(`button`,{class:`row`,style:k({height:`${xJ}px`}),"aria-expanded":e.expanded,title:`${e.commit.subject}\n${e.commit.author} <${e.commit.email}>\n${H(di)(e.commit.date)}\n${e.commit.hash}`,onClick:n[0]||=e=>r(`toggle`),onFocus:n[1]||=e=>r(`target`,``),onContextmenu:n[2]||=e=>r(`context`,e,``),onKeydown:n[3]||=yn(Z(e=>r(`context`,e,``),[`shift`,`prevent`]),[`f10`])},[I(rJ,{row:e.row,columns:e.columns,height:xJ,hollow:e.commit.unpushed,merge:s.value},null,8,[`row`,`columns`,`hollow`,`merge`]),K(`span`,sJ,[K(`span`,cJ,[K(`span`,lJ,j(e.commit.subject||`(без описания)`),1),(V(!0),q(W,null,J(l.value,e=>(V(),q(`span`,{key:e.kind+e.name,class:O([`ref u-truncate`,e.kind])},j(e.name),3))),128))]),K(`span`,uJ,[c.value?B(``,!0):(V(),q(`span`,dJ,j(e.commit.author),1)),K(`span`,null,j(H(ci)(e.commit.date,e.now)),1),K(`code`,null,j(H(mi)(e.commit.hash)),1),e.commit.unpushed?(V(),q(`span`,fJ,`↑`)):B(``,!0),s.value?(V(),q(`span`,pJ,`merge`)):B(``,!0)])]),I(H(of),{class:O([`chevron`,{open:e.expanded}]),"aria-hidden":`true`},null,8,[`class`])],44,oJ),I(Q,{shape:`icon`,size:`sm`,class:`open`,title:`Открыть обзор коммита`,"aria-label":`Открыть обзор коммита`,"data-command":`ide.git.commit.open`,onClick:n[4]||=e=>r(`open`)},{default:F(()=>[I(H(bi),{"aria-hidden":`true`})]),_:1})]),e.expanded?(V(),q(`div`,{key:0,class:`details`,style:k({paddingLeft:i.value.width})},[(V(!0),q(W,null,J(a.value,e=>(V(),q(`i`,{key:e.column,class:`lane`,style:k({left:e.left})},null,4))),128)),e.state?.loading&&!e.state.detail?(V(),q(`p`,mJ,`загрузка…`)):e.state?.error?(V(),q(`p`,hJ,j(e.state.error),1)):e.state?.detail?(V(),q(W,{key:2},[e.state.detail.body?(V(),q(`pre`,gJ,j(e.state.detail.body),1)):B(``,!0),K(`div`,_J,[K(`span`,null,[N(j(e.state.detail.files.length)+` файл. `,1),K(`b`,vJ,`+`+j(e.state.detail.additions),1),K(`b`,yJ,`−`+j(e.state.detail.deletions),1)]),I(Q,{shape:`icon`,size:`sm`,title:`Копировать хеш`,"aria-label":`Копировать хеш`,"data-command":`ide.git.commit.copyHash`,onClick:n[5]||=e=>r(`copy`)},{default:F(()=>[I(H(Tg),{"aria-hidden":`true`})]),_:1})]),o.value.length?(V(),Y(Yq,{key:2,changes:o.value,staged:``,readonly:``,label:`Изменения коммита ${H(mi)(e.commit.hash)}`,selected:``,onOpen:n[6]||=(e,t)=>r(`openDiff`,e,t),onTarget:n[7]||=e=>r(`target`,e),onContext:n[8]||=(e,t)=>r(`context`,e,t)},null,8,[`changes`,`label`])):(V(),q(`p`,bJ,`В этой папке коммит ничего не менял.`))],64)):B(``,!0)],4)):B(``,!0)],10,iJ))}}),[[`__scopeId`,`data-v-8f21478f`]]),wJ={class:`history`,"aria-label":`История Git`},TJ={class:`head`},EJ=[`aria-expanded`],DJ={key:0,class:`sync`,title:`Не отправлено в upstream`},OJ={key:1,class:`sync`,title:`Есть в upstream, нет локально`},kJ={key:3,class:`commits`},AJ={key:4,class:`more`},jJ=6,MJ=G(M({__name:`GitHistory`,props:yt({history:{},allBranches:{type:Boolean},snapshots:{type:Boolean},commands:{},revision:{}},{target:{default:()=>({hash:``,path:``})},targetModifiers:{},open:{type:Boolean,default:!1},openModifiers:{}}),emits:yt([`openCommit`,`openDiff`,`openFile`,`openTree`],[`update:target`,`update:open`]),setup(e,{emit:n}){let i=e,o=n,s=Te(e,`target`),l=Te(e,`open`),{log:u,commits:d,query:f,all:p,loading:m,loadingMore:h,error:g,details:_}=i.history;ai(()=>g.value);let v=X(new Set),y=X(f.value),x=X(),S=X(Date.now()),C=setInterval(()=>S.value=Date.now(),6e4);lt(()=>clearInterval(C));let w=z(()=>Ps(d.value)),T=z(()=>Math.min(jJ,Math.max(1,...w.value.map(e=>e.width)))),ee=e=>{if(typeof e!=`string`||!e)throw Error(`Укажите хеш коммита`);return d.value.find(t=>t.hash.startsWith(e))?.hash??e},E=e=>ee(b(e).hash??s.value.hash);function te(e){let t=b(e).path??s.value.path;if(typeof t!=`string`||!t)throw Error(`Укажите путь файла`);return t}async function D(e,t){t?(v.value.add(e),await i.history.detail(e)):v.value.delete(e)}async function ne(e){await ni(null,e,`Хеш скопирован`)}let re=c(i.commands.scope),ie={hash:`Хеш коммита (можно сокращённый); без него — коммит под курсором`},k={path:`Путь файла относительно папки проекта`};re(`ide.git.history.toggle`,`Показать или скрыть историю Git`,`Сворачивает блок History.`,()=>{l.value=!l.value}),re(`ide.git.history.refresh`,`Обновить историю Git`,`Перечитывает загруженную историю.`,()=>(l.value=!0,i.history.load())),re(`ide.git.history.filter`,`Фильтр истории Git`,`Ищет коммиты по сообщению; с «@» — по автору. Можно включить все ветки.`,async e=>{let t=b(e);if(t.query!==void 0&&typeof t.query!=`string`)throw Error(`query должен быть строкой`);if(t.all!==void 0&&typeof t.all!=`boolean`)throw Error(`all должен быть boolean`);if(t.all===!0&&i.allBranches===!1)throw Error(`Этот источник поддерживает историю текущей ветки`);l.value=!0,y.value=t.query??y.value,await i.history.filter({query:y.value,all:t.all})},{query:`Строка поиска; пустая сбрасывает фильтр`,all:`true — показать все ветки`}),re(`ide.git.history.more`,`Показать ещё коммиты`,`Подгружает следующую страницу.`,()=>i.history.more()),re(`ide.git.commit.toggle`,`Раскрыть или свернуть коммит`,`Показывает изменения именно этого коммита.`,async e=>{let t=E(e);l.value=!0,await D(t,!v.value.has(t))},ie),re(`ide.git.commit.open`,`Открыть обзор коммита`,`Открывает вкладку с подробным обзором коммита.`,e=>o(`openCommit`,E(e)),ie),re(`ide.git.commit.openTree`,`Файлы коммита`,`Показывает дерево файлов на момент коммита в боковой панели рядом с Git.`,e=>o(`openTree`,E(e)),ie,()=>!!i.snapshots),re(`ide.git.commit.openDiff`,`Открыть изменения файла в коммите`,`Открывает diff файла: родитель коммита → коммит.`,e=>o(`openDiff`,E(e),te(e),b(e).pinned===!0),{...ie,...k}),re(`ide.git.commit.openFile`,`Открыть текущий файл коммита`,`Открывает файл проекта в редакторе.`,e=>o(`openFile`,te(e)),k),re(`ide.git.commit.copyHash`,`Копировать хеш коммита`,`Копирует полный хеш в буфер обмена.`,e=>ne(E(e)),ie);let A=z(()=>{let e={...s.value},{item:t}=i.commands;return e.path?[t(`ide.git.commit.openDiff`,e),t(`ide.git.commit.openFile`,e),...i.snapshots?[t(`ide.git.commit.openTree`,e)]:[]]:[t(`ide.git.commit.toggle`,e),t(`ide.git.commit.open`,e),...i.snapshots?[t(`ide.git.commit.openTree`,e)]:[],t(`ide.git.commit.copyHash`,e,{separator:!0})]});function ae(e,t,n){s.value={hash:t,path:n},i.commands.scope.activate(),x.value?.open(e)}let oe=Gl(()=>i.history.filter({query:y.value}),300);return R(y,e=>{e!==f.value&&oe()}),R(l,e=>{e&&!d.value.length&&!m.value&&i.history.load()}),R(()=>i.revision,()=>{l.value&&i.history.load()}),R(d,e=>{let t=new Set(e.map(e=>e.hash));for(let e of[...v.value])t.has(e)||v.value.delete(e)}),(n,i)=>(V(),q(`section`,wJ,[K(`div`,TJ,[K(`button`,{class:`toggle`,"aria-expanded":l.value,"data-command":`ide.git.history.toggle`,onClick:i[0]||=t=>e.commands.run(`ide.git.history.toggle`)},[I(H(of),{class:O([`chevron`,{open:l.value}]),"aria-hidden":`true`},null,8,[`class`]),i[6]||=K(`h3`,null,`History`,-1),H(u).ahead?(V(),q(`span`,DJ,`↑`+j(H(u).ahead),1)):B(``,!0),H(u).behind?(V(),q(`span`,OJ,` ↓`+j(H(u).behind),1)):B(``,!0)],8,EJ),l.value?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,disabled:H(m),title:`Обновить историю`,"aria-label":`Обновить историю`,"data-command":`ide.git.history.refresh`,onClick:i[1]||=t=>e.commands.run(`ide.git.history.refresh`)},{default:F(()=>[I(H($T),{"aria-hidden":`true`})]),_:1},8,[`disabled`])):B(``,!0)]),l.value?(V(),q(W,{key:0},[I(r,{class:`filter`,gap:1.5,align:`normal`,justify:`normal`},{default:F(()=>[I(a,{grow:``,appearance:`inset`,modelValue:y.value,"onUpdate:modelValue":i[2]||=e=>y.value=e,type:`search`,placeholder:`Сообщение или @автор`,"aria-label":`Поиск по истории`,onKeydown:i[3]||=Z(()=>{},[`stop`])},null,8,[`modelValue`]),e.allBranches===!1?B(``,!0):(V(),Y(Q,{key:0,size:`sm`,"aria-pressed":H(p),title:`Показать коммиты всех веток`,"data-command":`ide.git.history.filter`,onClick:i[4]||=t=>e.commands.run(`ide.git.history.filter`,{all:!H(p)})},{default:F(()=>[N(j(H(p)?`Все ветки`:`Текущая`),1)]),_:1},8,[`aria-pressed`]))]),_:1}),H(u).upstream?(V(),Y(t,{key:0,class:`note`,tone:`muted`,size:`xs`,flush:``},{default:F(()=>[N(j(H(u).upstream),1),!H(u).ahead&&!H(u).behind?(V(),q(W,{key:0},[N(` · синхронизировано`)],64)):B(``,!0)]),_:1})):B(``,!0),H(m)&&!H(d).length?(V(),Y(t,{key:1,class:`note`,tone:`muted`,size:`xs`,flush:``,role:`status`},{default:F(()=>[...i[7]||=[N(`загрузка истории…`,-1)]]),_:1})):H(u).available&&!H(d).length?(V(),Y(t,{key:2,class:`note`,tone:`muted`,size:`xs`,flush:``},{default:F(()=>[N(j(H(f)?H(u).next===null?`Ничего не найдено.`:`В этой части истории совпадений нет.`:`Коммитов пока нет.`),1)]),_:1})):B(``,!0),H(d).length?(V(),q(`ul`,kJ,[(V(!0),q(W,null,J(H(d),(t,n)=>(V(),Y(CJ,{key:t.hash,commit:t,row:w.value[n],columns:T.value,expanded:v.value.has(t.hash),state:H(_)[t.hash],me:H(u).me,now:S.value,onToggle:n=>e.commands.run(`ide.git.commit.toggle`,{hash:t.hash}),onOpen:n=>e.commands.run(`ide.git.commit.open`,{hash:t.hash}),onCopy:n=>e.commands.run(`ide.git.commit.copyHash`,{hash:t.hash}),onOpenDiff:(n,r)=>e.commands.run(`ide.git.commit.openDiff`,{hash:t.hash,path:n,pinned:r}),onTarget:e=>s.value={hash:t.hash,path:e},onContext:(e,n)=>ae(e,t.hash,n)},null,8,[`commit`,`row`,`columns`,`expanded`,`state`,`me`,`now`,`onToggle`,`onOpen`,`onCopy`,`onOpenDiff`,`onTarget`,`onContext`]))),128))])):B(``,!0),H(u).next===null?B(``,!0):(V(),q(`div`,AJ,[I(Q,{size:`sm`,disabled:H(h),"data-command":`ide.git.history.more`,onClick:i[5]||=t=>e.commands.run(`ide.git.history.more`)},{default:F(()=>[N(j(H(h)?`Загрузка…`:`Показать ещё`),1)]),_:1},8,[`disabled`])]))],64)):B(``,!0),I(Wd,{ref_key:`menu`,ref:x,items:A.value,label:`Действия коммита`},null,8,[`items`])]))}}),[[`__scopeId`,`data-v-55c5a63c`]]),NJ={key:1,class:`notice`,role:`status`},PJ={key:2,class:`notice`},FJ={key:3,class:`notice`},IJ={key:0,class:`changes-zone`},LJ={key:0,class:`git-group`},RJ=[`aria-expanded`,`onClick`],zJ={key:0},BJ=G(M({__name:`GitPanel`,props:{projectId:{},overview:{},history:{},branches:{},selected:{},prepare:{type:Function},invalidate:{type:Function},applied:{type:Function},reveal:{type:Function}},emits:[`open`,`openCommit`,`openCommitTree`,`openCommitDiff`],setup(e,{expose:t,emit:n}){let r=e,i=n,{git:a,error:o,loading:s,load:c}=r.overview;ai(()=>o.value,{label:`Обновить`,run:()=>void c()});let l=X(!1),u=X(new Set),d=X(),f=X({path:``,staged:!1}),p=wr(r.projectId).providers.git,m=!!p?.write,h=tr(r.projectId).snapshots,g=X(!m),_=X(),v=X(),y=X(),x=z(()=>m?g.value?_.value?{flex:`0 0 ${_.value}px`}:{flex:`0 1 auto`}:{flex:`0 0 auto`}:{flex:`1 1 0`,maxHeight:`none`}),S=X(!1),C=X(``),w=X({hash:``,path:``}),T=E(`git:${r.projectId}`,()=>({surface:`git`,projectId:r.projectId,path:f.value.path,staged:f.value.staged,busy:l.value,commit:w.value.hash,commitPath:w.value.path,historyOpen:g.value,branch:C.value,branchesOpen:S.value})),{gitChange:ee,stagedChanges:te,workingChanges:D}=mR({commands:T,overview:r.overview,target:f,busy:l,prepare:r.prepare,invalidate:r.invalidate,applied:r.applied,open:(e,t,n)=>i(`open`,e,t,n),reveal:e=>r.reveal(e)});T.scope.registerCommand({id:`ide.git.group.toggle`,enabled:()=>m,title:`Свернуть или развернуть блок изменений`,description:`Сворачивает блок Staged или Changed в панели Git.`,arguments:{staged:`true — блок Staged, false — блок Changed`},run:e=>{let t=b(e);if(typeof t.staged!=`boolean`)throw Error(`staged должен быть boolean`);let n=t.staged?`staged`:`changed`;u.value.has(n)?u.value.delete(n):u.value.add(n)}}),T.scope.registerCommand({id:`ide.git.history.resize`,enabled:()=>m,title:`Изменить высоту истории Git`,description:`Задаёт высоту блока History в пикселях; без height возвращает размер по содержимому.`,arguments:{height:`Высота в пикселях; не меньше 120`},run:e=>{let{height:t}=b(e);if(t!==void 0&&(typeof t!=`number`||!(t>=120)))throw Error(`height должен быть числом не меньше 120`);_.value=t,t!==void 0&&(g.value=!0)}}),T.scope.registerCommand({id:`ide.git.refresh`,title:`Обновить Git`,run:c,enabled:()=>!l.value});let ne=z(()=>{let e=f.value;return[...ee(e)?[T.item(`ide.git.openDiff`,e),T.item(`ide.git.openFile`,e)]:[],T.item(`ide.git.reveal`,e),T.item(e.staged?`ide.git.unstage`:`ide.git.stage`,e,{separator:!0}),...e.staged?[]:[T.item(`ide.git.discard`,e,{danger:!0})]]});function re(e,t,n){f.value={path:t,staged:n},T.scope.activate(),d.value?.open(e)}return t({refresh:()=>l.value?void 0:c()}),(t,n)=>(V(),Y(Lu,{class:`side-content git-panel`,onFocusin:n[11]||=e=>H(T).scope.activate(),onKeydown:n[12]||=e=>H(T).keydown(e)},{default:F(()=>[H(a).available&&m?(V(),Y(NR,{key:0,open:S.value,"onUpdate:open":n[0]||=e=>S.value=e,target:C.value,"onUpdate:target":n[1]||=e=>C.value=e,branches:e.branches,commands:H(T),revision:e.overview.gutterRevision.value,prepare:e.prepare,applied:e.applied,reload:H(c)},null,8,[`open`,`target`,`branches`,`commands`,`revision`,`prepare`,`applied`,`reload`])):B(``,!0),H(s)?(V(),q(`p`,NJ,`загрузка Git…`)):B(``,!0),!H(s)&&!H(o)&&!H(a).available?(V(),q(`p`,PJ,` В этой папке нет Git-репозитория. `)):m&&!H(s)&&!H(o)&&!H(a).changes.length?(V(),q(`p`,FJ,` Нет изменений. `)):B(``,!0),H(a).available?(V(),q(`div`,{key:4,ref_key:`stack`,ref:v,class:`git-stack`},[m?(V(),q(`div`,IJ,[(V(!0),q(W,null,J([{label:`Staged`,rows:H(te),staged:!0},{label:`Changed`,rows:H(D),staged:!1}],t=>(V(),q(W,{key:t.label},[H(a).available?(V(),q(`div`,LJ,[K(`button`,{class:`group-toggle`,"aria-expanded":!u.value.has(t.staged?`staged`:`changed`),"data-command":`ide.git.group.toggle`,onClick:e=>H(T).run(`ide.git.group.toggle`,{staged:t.staged})},[I(H(of),{class:O([`chevron`,{open:!u.value.has(t.staged?`staged`:`changed`)}]),"aria-hidden":`true`},null,8,[`class`]),K(`h3`,null,[N(j(t.label)+` `,1),t.rows.length?(V(),q(`span`,zJ,j(t.rows.length),1)):B(``,!0)])],8,RJ),t.rows.length?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,disabled:!H(T).scope.describe(t.staged?`ide.git.unstage`:`ide.git.stage`,{path:``})?.enabled,title:t.staged?`Убрать всё из Staged`:`Отметить всё Staged`,"aria-label":t.staged?`Убрать всё из Staged`:`Отметить всё Staged`,"data-command":t.staged?`ide.git.unstage`:`ide.git.stage`,onClick:e=>H(T).run(t.staged?`ide.git.unstage`:`ide.git.stage`,{path:``,staged:t.staged})},{default:F(()=>[t.staged?(V(),Y(H(zR),{key:0,"aria-hidden":`true`})):(V(),Y(H(Sg),{key:1,"aria-hidden":`true`}))]),_:2},1032,[`disabled`,`title`,`aria-label`,`data-command`,`onClick`])):B(``,!0)])):B(``,!0),t.rows.length?et((V(),Y(Yq,{key:`${e.projectId}:${t.staged}`,changes:t.rows,staged:t.staged,disabled:l.value,"can-toggle":e=>!!H(T).scope.describe(t.staged?`ide.git.unstage`:`ide.git.stage`,{path:e})?.enabled,selected:e.selected?.staged===t.staged?e.selected.path:``,onChange:e=>H(T).run(t.staged?`ide.git.unstage`:`ide.git.stage`,{path:e,staged:t.staged}),onTarget:e=>f.value={path:e,staged:t.staged},onOpen:(e,n)=>H(T).run(`ide.git.openDiff`,{path:e,staged:t.staged,pinned:n}),onContext:(e,n)=>re(e,n,t.staged)},null,8,[`changes`,`staged`,`disabled`,`can-toggle`,`selected`,`onChange`,`onTarget`,`onOpen`,`onContext`])),[[Ln,!u.value.has(t.staged?`staged`:`changed`)]]):B(``,!0)],64))),128))])):B(``,!0),g.value&&m?(V(),Y(IR,{key:1,target:y.value,stack:v.value,onResize:n[2]||=e=>_.value=e,onCollapse:n[3]||=e=>g.value=!1,onReset:n[4]||=e=>H(T).run(`ide.git.history.resize`)},null,8,[`target`,`stack`])):B(``,!0),K(`div`,{ref_key:`historyZone`,ref:y,class:`history-zone`,style:k(x.value)},[I(MJ,{open:g.value,"onUpdate:open":n[5]||=e=>g.value=e,target:w.value,"onUpdate:target":n[6]||=e=>w.value=e,history:e.history,"all-branches":H(p)?.allBranches!==!1,snapshots:H(h),commands:H(T),revision:e.overview.gutterRevision.value,onOpenCommit:n[7]||=e=>i(`openCommit`,e),onOpenTree:n[8]||=e=>i(`openCommitTree`,e),onOpenDiff:n[9]||=(e,t,n)=>i(`openCommitDiff`,e,t,n),onOpenFile:n[10]||=e=>i(`open`,e)},null,8,[`open`,`target`,`history`,`all-branches`,`snapshots`,`commands`,`revision`])],4)],512)):B(``,!0),I(Wd,{ref_key:`gitMenu`,ref:d,items:ne.value,label:`Действия Git`},null,8,[`items`])]),_:1}))}}),[[`__scopeId`,`data-v-72b3c094`]]),VJ=()=>({available:!1,branch:``,changes:[]});function HJ(e){let t=X(VJ()),n=X(``),r=X(!1),i=X(0),a=0;async function o(){let o=++a;i.value++,r.value=!0,n.value=``;try{let n=await Vn(e(),`git`);o===a&&(t.value=n)}catch(e){o===a&&(n.value=e instanceof Error?e.message:`Ошибка Git`)}finally{o===a&&(r.value=!1)}}async function s(i,o){++a,r.value=!1,t.value=await yr(e(),i,o),n.value=``}function c(){++a,t.value=VJ()}function l(){++a}return{git:t,error:n,loading:r,gutterRevision:i,load:o,mutate:s,reset:c,cancel:l}}var UJ=50,WJ=()=>({available:!1,head:``,upstream:``,ahead:0,behind:0,me:``,commits:[],next:null});function GJ(e){let t=X(WJ()),n=X([]),r=X(``),i=X(!1),a=X(!1),o=X(!1),s=X(``),c=X({}),l=0,u=e=>({q:r.value,all:String(i.value),...e});async function d(){let r=++l;a.value=!0,o.value=!1,s.value=``;try{let i=Math.min(200,Math.max(UJ,n.value.length)),a=await Vn(e(),`log`,u({limit:String(i)}));if(r!==l)return;t.value=a,n.value=a.commits}catch(e){r===l&&(s.value=e instanceof Error?e.message:`Ошибка Git`)}finally{r===l&&(a.value=!1)}}async function f(){if(t.value.next===null||a.value||o.value)return;let r=l;o.value=!0;try{let i=await Vn(e(),`log`,u({skip:String(t.value.next),limit:String(UJ)}));if(r!==l)return;let a=new Set(n.value.map(e=>e.hash));n.value=[...n.value,...i.commits.filter(e=>!a.has(e.hash))],t.value={...t.value,next:i.next}}catch(e){r===l&&(s.value=e instanceof Error?e.message:`Ошибка Git`)}finally{r===l&&(o.value=!1)}}function p(e){return e.query!==void 0&&(r.value=e.query),e.all!==void 0&&(i.value=e.all),n.value=[],d()}async function m(t,n=!1){let r=c.value[t];if(r&&(r.detail||r.loading)&&!n)return r;let i=e();c.value[t]={loading:!0,error:``};try{let n=await Vn(i,`commit`,{hash:t});i===e()&&(c.value[t]={loading:!1,error:``,detail:n})}catch(n){i===e()&&(c.value[t]={loading:!1,error:n instanceof Error?n.message:`Ошибка Git`})}return c.value[t]}function h(){++l,t.value=WJ(),n.value=[],c.value={},r.value=``,i.value=!1,a.value=!1,o.value=!1,s.value=``}return{log:t,commits:n,query:r,all:i,loading:a,loadingMore:o,error:s,details:c,load:d,more:f,filter:p,detail:m,reset:h}}var KJ=()=>({available:!1,current:``,detached:!1,remotes:[],branches:[]});function qJ(e){let t=X(KJ()),n=X(``),r=X(!1),i=0;async function a(){let a=++i;r.value=!0,n.value=``;try{let n=await Vn(e(),`branches`);a===i&&(t.value=n)}catch(e){a===i&&(n.value=e instanceof Error?e.message:`Ошибка Git`)}finally{a===i&&(r.value=!1)}}async function o(a,o){++i,r.value=!1,t.value=await Er(e(),a,o),n.value=``}async function s(a){++i,r.value=!1;let o=await nee(e(),a);return t.value=o.branches,n.value=``,o}function c(){++i,t.value=KJ(),n.value=``,r.value=!1}return{state:t,error:n,loading:r,load:a,mutate:o,sync:s,reset:c}}var JJ={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function YJ(e,t){return V(),q(`svg`,JJ,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`},null,-1)]])}var XJ=U({name:`lucide-message-square`,render:YJ});function ZJ(e,t,n,r){let i=X(`open`),a=X([]),o=X(null),s=X(!1),c=X(!1),l=X(``),u=0,d=n=>Vn(e(),t,{state:i.value,page:String(n)}),f=e=>e instanceof Error?e.message:r;async function p(){let e=++u;s.value=!0,c.value=!1,l.value=``;try{let t=await d(1);if(e!==u)return;a.value=t[n],o.value=t.next}catch(t){e===u&&(l.value=f(t))}finally{e===u&&(s.value=!1)}}async function m(){if(o.value===null||s.value||c.value)return;let e=u;c.value=!0;try{let t=await d(o.value);if(e!==u)return;let r=new Set(a.value.map(e=>e.number));a.value=[...a.value,...t[n].filter(e=>!r.has(e.number))],o.value=t.next}catch(t){e===u&&(l.value=f(t))}finally{e===u&&(c.value=!1)}}function h(e){return i.value=e,a.value=[],o.value=null,p()}function g(){++u,i.value=`open`,a.value=[],o.value=null,s.value=!1,c.value=!1,l.value=``}return{state:i,items:a,next:o,loading:s,loadingMore:c,error:l,load:p,more:m,filter:h,reset:g}}var Ete=e=>ZJ(e,`issues`,`issues`,`Не удалось прочитать issues`);function QJ(e){let{kind:t,plural:n,singular:r,list:i}=e,a=e.host??`GitHub`,o=X(!0),s=E(`${t}:${e.projectId()}`,()=>({surface:t,projectId:e.projectId()})),l=c(s.scope);l(`ide.${t}.block.toggle`,`Свернуть или развернуть блок ${n}`,`Показывает или скрывает список ${n} в сайдбаре.`,()=>{o.value=!o.value}),l(`ide.${t}.refresh`,`Обновить список ${n}`,`Перечитывает первую страницу ${n} ${a} с текущим фильтром состояния.`,()=>i.load()),l(`ide.${t}.filter`,`Отфильтровать ${n} по состоянию`,`Переключает state и перечитывает список.`,e=>{let{state:n}=b(e),r=[`open`,`closed`,`all`,...t===`mergeRequests`?[`merged`]:[]];if(!r.includes(String(n)))throw Error(`Укажите state: ${r.join(`, `)}`);return i.filter(n)},{state:`string: ${t===`mergeRequests`?`open, closed, merged или all`:`open, closed или all`}`}),l(`ide.${t}.more`,`Показать следующую страницу ${n}`,`Догружает следующую страницу ${n} текущего фильтра (по 30).`,()=>i.more()),l(`ide.${t}.open`,`Открыть ${r}`,`Открывает вкладку выбранного ${r}: ${e.opens}.`,t=>{let{number:n,title:i,pinned:a}=b(t);if(typeof n!=`number`)throw Error(`Укажите номер ${r}`);e.open({number:n,title:typeof i==`string`?i:``},a===!0)},{number:`number: номер ${r}`,title:`string (необязательно): заголовок вкладки`,pinned:`boolean (необязательно): true — постоянная вкладка вместо временной`});let u=!1;return R(e.active,e=>{e&&!u&&(u=!0,i.load())},{immediate:!0}),R(e.projectId,()=>{u=!1,i.reset()}),{commands:s,open:o}}var $J=[`aria-expanded`,`data-command`],eY={key:0,class:`count`},tY=[`aria-label`],nY=[`aria-pressed`,`onClick`],rY={key:4,class:`list`},iY=[`disabled`],aY=G(M({__name:`UiListSection`,props:{title:{},count:{},open:{type:Boolean},filters:{},current:{},loading:{type:Boolean},loadingMore:{type:Boolean},error:{},hasMore:{type:Boolean},noun:{},filterLabel:{},toggleCommand:{}},emits:[`toggle`,`filter`,`more`],setup(e,{emit:n}){let r=n;return(n,i)=>(V(),Y(Lu,{class:`side-content list-section`},{default:F(()=>[K(`button`,{class:`block-toggle`,type:`button`,"aria-expanded":e.open,"data-command":e.toggleCommand,onClick:i[0]||=e=>r(`toggle`)},[I(H(of),{class:O([`chevron`,{open:e.open}]),"aria-hidden":`true`},null,8,[`class`]),K(`h3`,null,[N(j(e.title)+` `,1),e.count?(V(),q(`span`,eY,j(e.count),1)):B(``,!0)])],8,$J),et(I(Lu,{class:`block-body`},{default:F(()=>[e.filters?.length?(V(),q(`div`,{key:0,class:`state-filter`,role:`group`,"aria-label":`${e.filterLabel??`Состояние`}: ${e.noun}`},[(V(!0),q(W,null,J(e.filters,t=>(V(),q(`button`,{key:t.value,type:`button`,class:O({active:e.current===t.value}),"aria-pressed":e.current===t.value,onClick:e=>r(`filter`,t.value)},j(t.label),11,nY))),128))],8,tY)):B(``,!0),e.loading?(V(),Y(t,{key:1,variant:`note`,tone:`muted`,role:`status`},{default:F(()=>[N(`загрузка: `+j(e.noun)+`…`,1)]),_:1})):e.error?(V(),Y(t,{key:2,variant:`note`,tone:`danger`,role:`alert`},{default:F(()=>[N(j(e.error),1)]),_:1})):e.count?(V(),q(`ul`,rY,[L(n.$slots,`default`,{},void 0,!0)])):(V(),Y(nd,{key:3,density:`compact`,align:`start`},{default:F(()=>[N(`Нет: `+j(e.noun),1)]),_:1})),e.hasMore&&!e.loading?(V(),q(`button`,{key:5,type:`button`,class:`more`,disabled:e.loadingMore,onClick:i[1]||=e=>r(`more`)},j(e.loadingMore?`загрузка…`:`Показать ещё`),9,iY)):B(``,!0)]),_:3},512),[[Ln,e.open]])]),_:3}))}}),[[`__scopeId`,`data-v-1edcff66`]]),oY=M({__name:`TrackerPanel`,props:{title:{},prefix:{},open:{type:Boolean},count:{},state:{},loading:{type:Boolean},loadingMore:{type:Boolean},error:{},hasMore:{type:Boolean},noun:{},states:{}},emits:[`toggle`,`filter`,`more`],setup(e,{emit:t}){let n=e,r=t,i=[{value:`open`,label:`открытые`},{value:`closed`,label:`закрытые`},{value:`all`,label:`все`}],a=z(()=>n.states??i);return(t,n)=>(V(),Y(aY,{class:`tracker-panel`,title:e.title,count:e.count,open:e.open,filters:a.value,current:e.state,loading:e.loading,"loading-more":e.loadingMore,error:e.error,"has-more":e.hasMore,noun:e.noun,"toggle-command":`${e.prefix}.block.toggle`,onToggle:n[0]||=e=>r(`toggle`),onFilter:n[1]||=e=>r(`filter`,e),onMore:n[2]||=e=>r(`more`)},{default:F(()=>[L(t.$slots,`default`)]),_:3},8,[`title`,`count`,`open`,`filters`,`current`,`loading`,`loading-more`,`error`,`has-more`,`noun`,`toggle-command`]))}}),sY=[`title`],cY=G(M({__name:`UiListRow`,props:{label:{}},setup(e){return(t,n)=>(V(),q(`button`,{type:`button`,class:`list-row`,title:e.label},[I(r,{as:`span`,class:`title`,gap:1,align:`normal`,justify:`normal`},{default:F(()=>[L(t.$slots,`title`,{},void 0,!0)]),_:3}),I(r,{as:`span`,class:`meta`,wrap:``,justify:`normal`},{default:F(()=>[L(t.$slots,`meta`,{},void 0,!0)]),_:3})],8,sY))}}),[[`__scopeId`,`data-v-bd674218`]]),lY=[`src`,`alt`,`title`],uY=M({__name:`EmojiText`,props:{text:{}},setup(e){let t=e,n=ree(),r=z(()=>Qr(t.text,n.value));return(e,t)=>(V(!0),q(W,null,J(r.value,(e,t)=>(V(),q(W,{key:t},[typeof e==`string`?(V(),q(W,{key:1},[N(j(e),1)],64)):(V(),q(`img`,{key:0,class:`github-emoji`,src:e.url,alt:`:${e.name}:`,title:`:${e.name}:`,loading:`lazy`},null,8,lY))],64))),128))}}),dY={class:`number`},fY=G(M({__name:`TrackerRow`,props:{number:{},title:{},labels:{},author:{}},setup(e){let t=e=>e.color?`#${e.color}`:`transparent`;return(n,i)=>(V(),Y(cY,null,{title:F(()=>[L(n.$slots,`icon`,{},void 0,!0),K(`span`,null,[I(uY,{text:e.title},null,8,[`text`])])]),meta:F(()=>[K(`span`,dY,`#`+j(e.number),1),(V(!0),q(W,null,J(e.labels.slice(0,3),e=>(V(),Y(r,{as:`span`,inline:``,gap:1,justify:`normal`,key:e.name,class:`label`},{default:F(()=>[I(ne,{class:`dot`,shrink:``,style:k({background:t(e)})},null,8,[`style`]),I(uY,{text:e.name},null,8,[`text`])]),_:2},1024))),128)),I(r,{as:`span`,inline:``,gap:1,justify:`normal`,class:`author`},{default:F(()=>[I(gi,{src:e.author.avatarUrl,alt:e.author.login,size:14},null,8,[`src`,`alt`]),N(` `+j(e.author.login),1)]),_:1}),L(n.$slots,`meta`,{},void 0,!0)]),_:3}))}}),[[`__scopeId`,`data-v-8b02c197`]]),pY=G(M({__name:`IssuesPanel`,props:{projectId:{},active:{type:Boolean},host:{default:`GitHub`}},emits:[`open`],setup(e,{expose:t,emit:n}){let i=e,a=n,o=Ete(()=>i.projectId),{commands:s,open:c}=QJ({kind:`issues`,plural:`issues`,singular:`issue`,host:i.host,opens:`обсуждение`,projectId:()=>i.projectId,active:()=>i.active,list:o,open:(e,t)=>a(`open`,e,t)});return t({refresh:()=>o.load()}),(e,t)=>(V(),Y(oY,{title:`Issues`,noun:`issues`,prefix:`ide.issues`,open:H(c),count:H(o).items.value.length,state:H(o).state.value,loading:H(o).loading.value,"loading-more":H(o).loadingMore.value,error:H(o).error.value,"has-more":H(o).next.value!==null,onToggle:t[0]||=e=>H(s).run(`ide.issues.block.toggle`),onFilter:t[1]||=e=>H(s).run(`ide.issues.filter`,{state:e}),onMore:t[2]||=e=>H(s).run(`ide.issues.more`)},{default:F(()=>[(V(!0),q(W,null,J(H(o).items.value,e=>(V(),q(`li`,{key:e.number},[I(fY,{number:e.number,title:e.title,labels:e.labels,author:e.author,onClick:t=>H(s).run(`ide.issues.open`,{number:e.number,title:e.title}),onDblclick:t=>H(s).run(`ide.issues.open`,{number:e.number,title:e.title,pinned:!0})},{meta:F(()=>[e.comments?(V(),Y(r,{key:0,as:`span`,inline:``,gap:.75,justify:`normal`,class:`comments`,title:`${e.comments} комментариев`},{default:F(()=>[I(H(XJ),{"aria-hidden":`true`}),N(j(e.comments),1)]),_:2},1032,[`title`])):B(``,!0)]),_:2},1032,[`number`,`title`,`labels`,`author`,`onClick`,`onDblclick`])]))),128))]),_:1},8,[`open`,`count`,`state`,`loading`,`loading-more`,`error`,`has-more`]))}}),[[`__scopeId`,`data-v-affea123`]]),mY={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function hY(e,t){return V(),q(`svg`,mY,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`18`,cy:`18`,r:`3`}),K(`circle`,{cx:`6`,cy:`6`,r:`3`}),K(`path`,{d:`M13 6h3a2 2 0 0 1 2 2v7M6 9v12`})],-1)]])}var gY=U({name:`lucide-git-pull-request`,render:hY}),_Y={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function vY(e,t){return V(),q(`svg`,_Y,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`18`,cy:`18`,r:`3`}),K(`circle`,{cx:`6`,cy:`6`,r:`3`}),K(`path`,{d:`M18 6V5m0 6v-1M6 9v12`})],-1)]])}var yY=U({name:`lucide-git-pull-request-draft`,render:vY}),bY={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function xY(e,t){return V(),q(`svg`,bY,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`m15.5 3.5l5 5m-5 0l5-5M18 11.62V15M6 9v12`}),K(`circle`,{cx:`18`,cy:`18`,r:`3`}),K(`circle`,{cx:`6`,cy:`6`,r:`3`})],-1)]])}var SY=U({name:`lucide-git-pull-request-closed`,render:xY}),CY=[`title`],wY=[`title`],TY={key:1,class:`conflict`,title:`Есть конфликты`},EY=[`title`],DY=G(M({__name:`PullsPanel`,props:{projectId:{},active:{type:Boolean},title:{default:`Pull requests`},noun:{default:`pull requests`},singular:{default:`pull request`},kind:{default:`pulls`},host:{default:`GitHub`},action:{default:`pulls`}},emits:[`open`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=ZJ(()=>r.projectId,r.action,`pulls`,`Не удалось прочитать ${r.noun}`),{commands:o,open:s}=QJ({kind:r.kind,plural:r.noun,singular:r.singular,host:r.host,opens:`описание, ревью, обсуждение и изменённые файлы`,projectId:()=>r.projectId,active:()=>r.active,list:a,open:(e,t)=>i(`open`,e,t)}),c=(e,t)=>o.run(`ide.${r.kind}.${e}`,t),l=e=>e.state===`merged`?cF:e.state===`closed`?SY:e.draft?yY:gY,u=e=>e.draft&&e.state===`open`?`draft`:e.state,d=z(()=>r.kind===`mergeRequests`?[{value:`open`,label:`открытые`},{value:`closed`,label:`закрытые`},{value:`merged`,label:`влитые`},{value:`all`,label:`все`}]:void 0);return t({refresh:()=>a.load()}),(t,n)=>(V(),Y(oY,{title:e.title,noun:e.noun,prefix:`ide.${e.kind}`,open:H(s),count:H(a).items.value.length,state:H(a).state.value,loading:H(a).loading.value,"loading-more":H(a).loadingMore.value,error:H(a).error.value,"has-more":H(a).next.value!==null,states:d.value,onToggle:n[0]||=e=>c(`block.toggle`),onFilter:n[1]||=e=>c(`filter`,{state:e}),onMore:n[2]||=e=>c(`more`)},{default:F(()=>[(V(!0),q(W,null,J(H(a).items.value,e=>(V(),q(`li`,{key:e.number},[I(fY,{number:e.number,title:e.title,labels:e.labels,author:e.author,onClick:t=>c(`open`,{number:e.number,title:e.title}),onDblclick:t=>c(`open`,{number:e.number,title:e.title,pinned:!0})},{icon:F(()=>[(V(),Y(qe(l(e)),{class:O([`state`,u(e)]),"aria-hidden":`true`},null,8,[`class`]))]),meta:F(()=>[K(`span`,{class:`branches u-truncate`,title:`${e.head} → ${e.base}`},j(e.head)+` → `+j(e.base),9,CY),e.pipeline?(V(),q(`span`,{key:0,class:`ci`,title:`Pipeline #${e.pipeline.id}: ${H(ur)[e.pipeline.status]}`},[I(ne,{tone:H(dr)[e.pipeline.status],shrink:``},null,8,[`tone`])],8,wY)):B(``,!0),e.hasConflicts?(V(),q(`span`,TY,`конфликт`)):B(``,!0),e.comments?(V(),q(`span`,{key:2,class:`comments`,title:`${e.comments} комментариев`},[I(H(XJ),{"aria-hidden":`true`}),N(j(e.comments),1)],8,EY)):B(``,!0)]),_:2},1032,[`number`,`title`,`labels`,`author`,`onClick`,`onDblclick`])]))),128))]),_:1},8,[`title`,`noun`,`prefix`,`open`,`count`,`state`,`loading`,`loading-more`,`error`,`has-more`,`states`]))}}),[[`__scopeId`,`data-v-af1053be`]]),OY={class:`loadable-panel`},kY=G(M({__name:`UiLoadablePanel`,props:{loading:{type:Boolean},error:{},loadingText:{}},setup(e){return(t,n)=>(V(),q(`div`,OY,[e.loading?(V(),Y(i,{key:0,size:`xs`,leading:`inherit`,class:`note`,role:`status`},{default:F(()=>[N(j(e.loadingText??`загрузка…`),1)]),_:1})):e.error?(V(),Y(i,{key:1,size:`xs`,leading:`inherit`,class:`note error`,role:`alert`},{default:F(()=>[N(j(e.error),1)]),_:1})):L(t.$slots,`default`,{},void 0,!0,2)]))}}),[[`__scopeId`,`data-v-fa3fc9f4`]]);function AY(e){let t=X(),n=X(!1),r=X(``),i=0;async function a(){if(e.enabled&&!e.enabled()){i++,t.value=void 0,n.value=!1,r.value=e.disabledError??``;return}let a=++i;t.value=void 0,n.value=!0,r.value=``;try{let n=await e.load();a===i&&(t.value=n)}catch(t){a===i&&(r.value=t instanceof Error?t.message:e.errorFallback)}finally{a===i&&(n.value=!1)}}return R(e.keys,a,{immediate:!0}),{data:t,loading:n,error:r,reload:a}}var jY=[`title`],MY=G(M({__name:`MiddleTruncate`,props:{text:{}},setup(e){let t=e,n=X(),r=X(t.text),i,a=0,o;function s(){return o||(o=document.createElement(`span`),o.setAttribute(`aria-hidden`,`true`),o.style.cssText=`position:fixed;left:-10000px;top:0;visibility:hidden;pointer-events:none;white-space:pre;width:max-content;max-width:none;`,document.body.appendChild(o),o)}function c(e){let t=n.value;if(!t)return 0;let r=s(),i=getComputedStyle(t);return r.style.font=i.font||`${i.fontSize} ${i.fontFamily}`,r.style.fontWeight=i.fontWeight,r.style.fontStyle=i.fontStyle,r.style.letterSpacing=i.letterSpacing,r.textContent=e,r.getBoundingClientRect().width}function l(e){let n=t.text.length;if(e>=n)return t.text;if(e<=1)return`…`;let r=Math.ceil(e/2),i=e-r;return`${t.text.slice(0,r)}…${t.text.slice(n-i)}`}function u(){let e=n.value;if(!e)return;let i=e.clientWidth;if(!i)return;if(c(t.text)<=i){r.value=t.text;return}let a=1,o=t.text.length,s=`…`;for(;a<=o;){let e=Math.floor((a+o)/2),t=l(e);c(t)<=i?(s=t,a=e+1):o=e-1}r.value=s}function d(){cancelAnimationFrame(a),a=requestAnimationFrame(u)}return Lt(()=>{let e=n.value;e&&(typeof ResizeObserver<`u`&&(i=new ResizeObserver(d),i.observe(e)),document.fonts?.ready.then(d),d())}),R(()=>t.text,d),lt(()=>{cancelAnimationFrame(a),i?.disconnect()}),(t,i)=>(V(),q(`span`,{ref_key:`host`,ref:n,class:`middle-truncate`,title:e.text},j(r.value),9,jY))}}),[[`__scopeId`,`data-v-2b4979c4`]]),NY={added:`A`,deleted:`D`,modified:`M`,renamed:`R`,copied:`C`,conflict:`U`};function PY(e){let t={name:``,path:``,directories:[],files:[]},n=new Map([[``,t]]),r=e=>{if(n.has(e))return n.get(e);let r=e.split(`/`),i=t,a=``;for(let e of r){a=a?`${a}/${e}`:e;let t=n.get(a);t||(t={name:e,path:a,directories:[],files:[]},n.set(a,t),i.directories.push(t)),i=t}return i};for(let t of e){let e=t.path.lastIndexOf(`/`);r(e<0?``:t.path.slice(0,e)).files.push(t)}return t}function FY(e,t){let n=e.name,r=e.path,i=e;if(!t)for(;i.directories.length===1&&i.files.length===0;){let e=i.directories[0];n=n?`${n}/${e.name}`:e.name,r=e.path,i=e}return{name:n,path:r,node:i}}function IY(e){let t=0,n=0,r=0,i=e=>{for(let i of e.files)t++,n+=i.additions??0,r+=i.deletions??0;for(let t of e.directories)i(t)};return i(e),{files:t,additions:n,deletions:r}}function LY(e,t){return{kind:`file`,name:e.path.split(`/`).pop()||e.path,path:e.path,depth:t,file:e}}function RY(e,t,n,r,i){let a=[],o=[...e.directories].sort((e,t)=>e.name.localeCompare(t.name,void 0,{sensitivity:`base`}));for(let e of o){let o=FY(e,n),s=IY(o.node);a.push({kind:`directory`,name:o.name,path:o.path,depth:t,...s}),(r||i.has(o.path))&&a.push(...RY(o.node,t+1,!1,r,i))}let s=[...e.files].sort((e,t)=>e.path.localeCompare(t.path,void 0,{sensitivity:`base`}));for(let e of s)a.push(LY(e,t));return a}function zY(e){let t=new Set,n=(e,r)=>{for(let i of e.directories){let e=FY(i,r);t.add(e.path),n(e.node,!1)}};return n(PY(e),!0),t}var BY={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function VY(e,t){return V(),q(`svg`,BY,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`m7 20l5-5l5 5M7 4l5 5l5-5`},null,-1)]])}var HY=U({name:`lucide-chevrons-down-up`,render:VY}),UY={class:`changes-tree`},WY={class:`head`},GY={class:`totals`},KY={class:`add`},qY={class:`del`},JY=[`title`,`aria-label`],YY={class:`search`},XY=[`id`,`name`],ZY={key:1,class:`tree`,role:`tree`,"aria-label":`Изменённые файлы`},QY={class:`glyph`,"aria-hidden":`true`},$Y={class:`count`},eX={class:`add`},tX={class:`del`},nX={key:0,class:`mark binary`,title:`Бинарный файл`},rX={key:1,class:`mark large`,title:`Файл слишком большой`},iX=[`title`],aX={class:`add`},oX={class:`del`},sX=G(M({__name:`ChangesTree`,props:{changes:{},selected:{default:``},totals:{},emptyText:{default:`Файлов нет`}},emits:[`open`],setup(e,{expose:t,emit:n}){let r=e,a=n,o=X(``),s=X(new Set),c=X(r.selected),l=P(),{resolver:u}=Vq(),d=z(()=>{let e=o.value.trim().toLowerCase();return e?r.changes.filter(t=>t.path.toLowerCase().includes(e)):r.changes}),f=z(()=>o.value.trim().length>0),p=z(()=>RY(PY(d.value),0,!0,f.value,s.value)),m=z(()=>r.totals?r.totals:{files:r.changes.length,additions:r.changes.reduce((e,t)=>e+(t.additions??0),0),deletions:r.changes.reduce((e,t)=>e+(t.deletions??0),0)});function h(e){s.value.has(e)?s.value.delete(e):s.value.add(e)}function g(){s.value=s.value.size?new Set:zY(d.value)}function _(e,t){e.kind===`directory`?h(e.path):(c.value=e.path,a(`open`,e.path,(t?.detail??1)>=2,e.file?.originalPath))}function v(e){c.value=e;let t=e.split(`/`),n=new Set(s.value);for(let e=1;e<t.length;e++)n.add(t.slice(0,e).join(`/`));s.value=n}return R(()=>r.changes,e=>{s.value=zY(e)},{immediate:!0}),R(()=>r.selected,e=>{c.value=e}),t({reveal:v}),(t,n)=>(V(),q(`div`,UY,[K(`div`,WY,[K(`span`,GY,[N(j(m.value.files)+j(m.value.capped?`+`:``)+` файлов `,1),K(`b`,KY,`+`+j(m.value.additions),1),K(`b`,qY,`−`+j(m.value.deletions),1)]),K(`button`,{type:`button`,class:`expand`,title:s.value.size?`Свернуть дерево`:`Развернуть дерево`,"aria-label":s.value.size?`Свернуть дерево`:`Развернуть дерево`,onClick:g},[I(H(HY),{"aria-hidden":`true`})],8,JY)]),K(`label`,YY,[n[1]||=K(`span`,{class:`u-sr-only`},`Фильтр изменённых файлов`,-1),et(K(`input`,{id:H(l),name:H(l),"onUpdate:modelValue":n[0]||=e=>o.value=e,type:`search`,placeholder:`Фильтр по пути`,autocomplete:`off`,spellcheck:`false`},null,8,XY),[[_n,o.value]])]),I(Lu,{class:`body`},{default:F(()=>[p.value.length?(V(),q(`ul`,ZY,[(V(!0),q(W,null,J(p.value,e=>(V(),q(`li`,{key:`${e.kind}:${e.path}`,role:`none`},[e.kind===`directory`?(V(),Y(ts,{key:0,interaction:`item`,radius:`none`,tone:`muted`,gap:1.5,padding:`5px 10px`,class:`directory`,role:`treeitem`,"aria-level":e.depth+1,"aria-expanded":s.value.has(e.path)||f.value,title:e.path,style:k({paddingLeft:`${12+e.depth*14}px`}),onClick:t=>_(e)},{default:F(()=>[K(`span`,QY,[I(H(of),{class:O([`chevron`,{expanded:s.value.has(e.path)||f.value}])},null,8,[`class`])]),I(MY,{class:`name`,text:e.name},null,8,[`text`]),K(`span`,$Y,j(e.files),1),K(`span`,eX,`+`+j(e.additions),1),K(`span`,tX,`−`+j(e.deletions),1)]),_:2},1032,[`aria-level`,`aria-expanded`,`title`,`style`,`onClick`])):(V(),Y(ts,{key:1,interaction:`item`,radius:`none`,tone:`muted`,gap:1.5,padding:`5px 10px`,class:O([`file`,{selected:c.value===e.path,lifted:e.file?.generated}]),role:`treeitem`,"aria-level":e.depth+1,"aria-selected":c.value===e.path,disabled:e.file?.binary||e.file?.tooLarge,title:e.file?.binary?`Бинарный файл`:e.file?.tooLarge?`Файл слишком большой для diff`:e.path,style:k({paddingLeft:`${12+e.depth*14}px`}),onClick:t=>_(e,t)},{default:F(()=>[n[2]||=K(`span`,{class:`glyph`,"aria-hidden":`true`},null,-1),I(H(HR),{icon:H(u).resolve({name:e.name,path:e.path,directory:!1},!1)},null,8,[`icon`]),I(MY,{class:`name`,text:e.name},null,8,[`text`]),e.file?.binary?(V(),q(`span`,nX,`bin`)):e.file?.tooLarge?(V(),q(`span`,rX,`!`)):B(``,!0),e.file?.kind&&e.file.kind!==`modified`?(V(),q(`span`,{key:2,class:O([`mark`,e.file.kind]),title:e.file.kind},j(H(NY)[e.file.kind]),11,iX)):B(``,!0),K(`span`,aX,`+`+j(e.file?.additions??0),1),K(`span`,oX,`−`+j(e.file?.deletions??0),1)]),_:2},1032,[`aria-level`,`aria-selected`,`class`,`disabled`,`title`,`style`,`onClick`]))]))),128))])):(V(),Y(i,{key:0,size:`xs`,leading:`inherit`,class:`note`},{default:F(()=>[N(j(f.value?`Ничего не найдено`:e.emptyText),1)]),_:1})),m.value.truncated?(V(),Y(i,{key:2,size:`xs`,leading:`inherit`,class:`note truncation`},{default:F(()=>[...n[3]||=[N(` Показаны не все файлы: источник ограничивает diff. `,-1)]]),_:1})):B(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-46f096ff`]]),cX=M({__name:`PullRequestFilesSection`,props:{projectId:{},number:{},head:{},snapshot:{},onOpen:{type:Function}},setup(e,{expose:t}){let n=e,{data:r,loading:i,error:a,reload:o}=AY({load:()=>Vn(n.projectId,`pull-files`,{number:String(n.number)}),keys:()=>[n.projectId,n.number,n.head,n.snapshot],enabled:()=>!n.snapshot,errorFallback:`Не удалось прочитать изменения`}),s=z(()=>r.value??n.snapshot),c=z(()=>Ms(s.value?.files??[])),l=z(()=>{let e=s.value?.files??[];return{files:s.value?.changedFiles??e.length,additions:e.reduce((e,t)=>e+t.additions,0),deletions:e.reduce((e,t)=>e+t.deletions,0),capped:s.value?.changedFilesCapped===!0,truncated:s.value?.filesTruncated===!0}}),u=z(()=>s.value?.diffRefs?.headSha??n.head??``),d=X();return t({reveal:e=>d.value?.reveal(e),refresh:o}),(t,n)=>(V(),Y(kY,{loading:H(i),error:H(a),"loading-text":`загрузка: изменения…`},{default:F(()=>[I(sX,{ref_key:`tree`,ref:d,changes:c.value,totals:l.value,"empty-text":`Файлов нет`,onOpen:n[0]||=(t,n)=>e.onOpen?.(t,n,u.value)},null,8,[`changes`,`totals`])]),_:1},8,[`loading`,`error`]))}}),lX={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function uX(e,t){return V(),q(`svg`,lX,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`12`,cy:`12`,r:`10`}),K(`path`,{d:`m16 9l-5.5 5.5L8 12`})],-1)]])}var dX=U({name:`lucide-circle-check`,render:uX}),fX={key:0,class:`category`},pX=G(M({__name:`DiscussionsPanel`,props:{projectId:{},active:{type:Boolean}},emits:[`open`],setup(e,{expose:t,emit:n}){let i=e,a=n,o=ZJ(()=>i.projectId,`discussions`,`discussions`,`Не удалось прочитать discussions`),{commands:s,open:c}=QJ({kind:`discussions`,plural:`discussions`,singular:`discussion`,opens:`описание, комментарии и ответы`,projectId:()=>i.projectId,active:()=>i.active,list:o,open:(e,t)=>a(`open`,e,t)});return t({refresh:()=>o.load()}),(e,t)=>(V(),Y(oY,{title:`Discussions`,noun:`discussions`,prefix:`ide.discussions`,open:H(c),count:H(o).items.value.length,state:H(o).state.value,loading:H(o).loading.value,"loading-more":H(o).loadingMore.value,error:H(o).error.value,"has-more":H(o).next.value!==null,onToggle:t[0]||=e=>H(s).run(`ide.discussions.block.toggle`),onFilter:t[1]||=e=>H(s).run(`ide.discussions.filter`,{state:e}),onMore:t[2]||=e=>H(s).run(`ide.discussions.more`)},{default:F(()=>[(V(!0),q(W,null,J(H(o).items.value,e=>(V(),q(`li`,{key:e.number},[I(fY,{number:e.number,title:e.title,labels:e.labels,author:e.author,onClick:t=>H(s).run(`ide.discussions.open`,{number:e.number,title:e.title}),onDblclick:t=>H(s).run(`ide.discussions.open`,{number:e.number,title:e.title,pinned:!0})},{icon:F(()=>[e.answered?(V(),Y(H(dX),{key:0,class:`answered`,title:`Есть ответ`,"aria-hidden":`true`})):B(``,!0)]),meta:F(()=>[e.category.name?(V(),q(`span`,fX,[I(uY,{text:e.category.emoji},null,8,[`text`]),N(` `+j(e.category.name),1)])):B(``,!0),e.comments?(V(),Y(r,{key:1,as:`span`,inline:``,gap:.75,justify:`normal`,class:`comments`,title:`${e.comments} комментариев`},{default:F(()=>[I(H(XJ),{"aria-hidden":`true`}),N(j(e.comments),1)]),_:2},1032,[`title`])):B(``,!0)]),_:2},1032,[`number`,`title`,`labels`,`author`,`onClick`,`onDblclick`])]))),128))]),_:1},8,[`open`,`count`,`state`,`loading`,`loading-more`,`error`,`has-more`]))}}),[[`__scopeId`,`data-v-ddaa3928`]]),mX=[{value:`all`,label:`все`},{value:`running`,label:`идут`},{value:`failed`,label:`ошибки`},{value:`success`,label:`успех`}];function hX(e){let t=X(`all`),n=X([]),r=X(null),i=X(!1),a=X(!1),o=X(``),s=0,c=n=>Vn(e(),`pipelines`,{status:t.value,page:String(n)}),l=e=>e instanceof Error?e.message:`Не удалось прочитать pipelines`;async function u(){let e=++s;i.value=!0,a.value=!1,o.value=``;try{let t=await c(1);if(e!==s)return;n.value=t.pipelines,r.value=t.next}catch(t){e===s&&(o.value=l(t))}finally{e===s&&(i.value=!1)}}async function d(){if(r.value===null||i.value||a.value)return;let e=s;a.value=!0;try{let t=await c(r.value);if(e!==s)return;let i=new Set(n.value.map(e=>e.id));n.value=[...n.value,...t.pipelines.filter(e=>!i.has(e.id))],r.value=t.next}catch(t){e===s&&(o.value=l(t))}finally{e===s&&(a.value=!1)}}function f(e){return t.value=e,n.value=[],r.value=null,u()}function p(){++s,t.value=`all`,n.value=[],r.value=null,i.value=!1,a.value=!1,o.value=``}return{status:t,items:n,next:r,loading:i,loadingMore:a,error:o,load:u,more:d,filter:f,reset:p}}function gX(e){let{list:t}=e,n=X(!0),r=E(`pipelines:${e.projectId()}`,()=>({surface:`pipelines`,projectId:e.projectId()})),i=c(r.scope);i(`ide.pipelines.block.toggle`,`Свернуть или развернуть блок pipelines`,`Показывает или скрывает список pipelines в сайдбаре.`,()=>{n.value=!n.value}),i(`ide.pipelines.refresh`,`Обновить список pipelines`,`Перечитывает первую страницу pipelines с текущим фильтром статуса.`,()=>t.load()),i(`ide.pipelines.filter`,`Отфильтровать pipelines по статусу`,`Переключает статус и перечитывает список.`,e=>{let{status:n}=b(e);if(!mX.some(e=>e.value===n)&&n!==`canceled`)throw Error(`Укажите status: all, running, success, failed или canceled`);return t.filter(n)},{status:`string: all, running, success, failed или canceled`}),i(`ide.pipelines.more`,`Показать следующую страницу pipelines`,`Догружает следующую страницу pipelines текущего фильтра (по 30).`,()=>t.more()),i(`ide.pipelines.open`,`Открыть pipeline`,`Открывает вкладку выбранного pipeline: статус, ветка, коммит и джобы.`,t=>{let{id:n,title:r,pinned:i}=b(t);if(typeof n!=`number`)throw Error(`Укажите номер pipeline`);e.open({id:n,title:typeof r==`string`?r:``},i===!0)},{id:`number: номер pipeline`,title:`string (необязательно): заголовок вкладки`,pinned:`boolean (необязательно): true — постоянная вкладка вместо временной`});let a=!1;return R(e.active,e=>{e&&!a&&(a=!0,t.load())},{immediate:!0}),R(e.projectId,()=>{a=!1,t.reset()}),{commands:r,open:n}}var _X={class:`name`},vX={class:`number`},yX={key:0},bX={key:1,class:`mono`},xX={key:2},SX=[`title`],CX=G(M({__name:`PipelineRow`,props:{pipeline:{}},setup(e){return(t,n)=>(V(),Y(cY,{label:e.pipeline.name||e.pipeline.ref},{title:F(()=>[I(ne,{tone:H(dr)[e.pipeline.status],title:H(ur)[e.pipeline.status],shrink:``},null,8,[`tone`,`title`]),K(`span`,_X,j(H(Bn)(e.pipeline.ref)||e.pipeline.name||`Pipeline`),1),K(`span`,vX,`#`+j(e.pipeline.id),1)]),meta:F(()=>[K(`span`,null,j(H(ur)[e.pipeline.status]),1),e.pipeline.source?(V(),q(`span`,yX,j(H(vr)(e.pipeline.source)),1)):B(``,!0),e.pipeline.sha?(V(),q(`span`,bX,j(H(mi)(e.pipeline.sha)),1)):B(``,!0),H(rr)(e.pipeline.duration)?(V(),q(`span`,xX,j(H(rr)(e.pipeline.duration)),1)):B(``,!0),e.pipeline.createdAt?(V(),q(`span`,{key:3,title:e.pipeline.createdAt},j(H(ci)(e.pipeline.createdAt)),9,SX)):B(``,!0)]),_:1},8,[`label`]))}}),[[`__scopeId`,`data-v-242dd679`]]),wX=M({__name:`PipelinesPanel`,props:{projectId:{},active:{type:Boolean}},emits:[`open`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=hX(()=>r.projectId),{commands:o,open:s}=gX({projectId:()=>r.projectId,active:()=>r.active,list:a,open:(e,t)=>i(`open`,e,t)}),c=(e,t)=>o.run(`ide.pipelines.${e}`,t),l=(e,t=!1)=>c(`open`,{id:e.id,title:e.name||e.ref,pinned:t});return t({refresh:()=>a.load()}),(e,t)=>(V(),Y(aY,{class:`pipeline-panel`,title:`Pipelines`,count:H(a).items.value.length,open:H(s),filters:H(mX),current:H(a).status.value,loading:H(a).loading.value,"loading-more":H(a).loadingMore.value,error:H(a).error.value,"has-more":H(a).next.value!==null,noun:`pipelines`,"filter-label":`Статус`,"toggle-command":`ide.pipelines.block.toggle`,onToggle:t[0]||=e=>c(`block.toggle`),onFilter:t[1]||=e=>c(`filter`,{status:e}),onMore:t[2]||=e=>c(`more`)},{default:F(()=>[(V(!0),q(W,null,J(H(a).items.value,e=>(V(),q(`li`,{key:e.id},[I(CX,{pipeline:e,onClick:t=>l(e),onDblclick:t=>l(e,!0)},null,8,[`pipeline`,`onClick`,`onDblclick`])]))),128))]),_:1},8,[`count`,`open`,`filters`,`current`,`loading`,`loading-more`,`error`,`has-more`]))}});function TX(e,t,n,r,i){let a=We(),o=X(!1),s=X(``),c=X(0);return R(()=>[e(),t(),c.value],async([e,t],l,u)=>{let d=new AbortController,f=!0,p;u(()=>{f=!1,clearTimeout(p),d.abort()}),o.value=!a.value,s.value=``;try{let r=await Vn(e,n,{id:String(t)},d.signal);if(!f)return;a.value=r,i?.(r)&&(p=setTimeout(()=>c.value++,1e4))}catch(e){f&&(s.value=e instanceof Error?e.message:r)}finally{f&&(o.value=!1)}},{immediate:!0}),{detail:a,loading:o,error:s,reload:()=>c.value++}}var EX=new Set([`queued`,`running`]);function DX(e,t){return TX(e,t,`pipeline`,`Не удалось открыть pipeline`,e=>EX.has(e.pipeline.status))}function OX(e,t){return TX(e,t,`job`,`Не удалось открыть джоб`,e=>EX.has(e.job.status))}var kX={key:0,class:`mono`},AX={key:1},jX={key:2,class:`mono`},MX=[`title`],NX={key:4},PX={class:`jobs-head`},FX={class:`jobs-count`},IX={key:0,class:`job-filter`,role:`group`,"aria-label":`Фильтр джобов`},LX=[`aria-pressed`],RX=[`aria-pressed`],zX=[`open`],BX={class:`stage-name`},VX={class:`stage-count`},HX={class:`stage-summary`},UX={class:`job-list`},WX=[`title`,`onClick`],GX={class:`job-name`},KX={class:`job-status`},qX={key:0,class:`job-time`},JX={class:`job-number`},YX=G(M({__name:`PipelineView`,props:{projectId:{},id:{},host:{default:`GitLab`}},emits:[`openJob`],setup(e,{emit:t}){let n=e,r=t,{detail:a,loading:o,error:s,reload:l}=DX(()=>n.projectId,()=>n.id),u=X(!1),d=z(()=>Yn(a.value?.jobs??[],{problemsOnly:u.value})),f=z(()=>(a.value?.jobs??[]).filter(e=>Kn.has(e.status)).length),p=z(()=>{let e=a.value?dr[a.value.pipeline.status]:`muted`;return e===`warning`||e===`success`||e===`danger`?e:`neutral`}),m=E(`pipeline:${n.projectId}:${n.id}`,()=>({surface:`pipeline`,projectId:n.projectId,pipelineId:n.id})),h=c(m.scope),g=(e,t=!1)=>m.run(`ide.pipeline.job.open`,{id:e.id,title:e.name,pinned:t});return h(`ide.pipeline.refresh`,`Обновить pipeline`,`Перечитывает статус pipeline и список его джобов.`,()=>l()),h(`ide.pipeline.job.open`,`Открыть джоб`,`Открывает вкладку джоба: статус, стадия и readonly-лог.`,e=>{let{id:t,title:n,pinned:i}=b(e);if(typeof t!=`number`)throw Error(`Укажите номер джоба`);r(`openJob`,{id:t,title:typeof n==`string`?n:``},i===!0)},{id:`number: номер джоба`,title:`string (необязательно): заголовок вкладки`,pinned:`boolean (необязательно): true — постоянная вкладка`}),ui(()=>{let e=`Pipeline #${n.id}`;if(s.value)return{note:e,text:`Ошибка: ${s.value}`};let t=a.value;if(!t)return{note:e,text:`Загрузка…`};let r=t.pipeline,i=t.jobs.map(e=>`${ur[e.status]}: ${e.stage?`${e.stage} / `:``}${e.name} (#${e.id})`).slice(0,100);return{note:e,text:vi(`Состояние: ${ur[r.status]}`,`Ветка: ${Bn(r.ref)||`нет`}, коммит: ${r.sha||`нет`}`,`Источник: ${vr(r.source)||`нет`}`,`Создан: ${r.createdAt}`,r.duration===null?``:`Длительность: ${rr(r.duration)}`,`Джобов: ${t.jobs.length}`,i.length?`Джобы:\n${i.join(`
|
|
153
|
+
`)}`:`Джобов нет`,t.jobsTruncated?`Показано ${t.jobs.length} джобов, остальные — на ${n.host}.`:``)}}),(t,n)=>(V(),Y(_i,null,{default:F(()=>[H(o)?(V(),Y(i,{key:0,size:`xs`,leading:`inherit`,class:`note`,role:`status`},{default:F(()=>[...n[2]||=[N(`загрузка: pipeline…`,-1)]]),_:1})):H(s)?(V(),Y(i,{key:1,size:`xs`,leading:`inherit`,class:`note error`,role:`alert`},{default:F(()=>[N(j(H(s)),1)]),_:1})):H(a)?(V(),Y(hi,{key:2},{default:F(()=>[I(pi,{state:H(ur)[H(a).pipeline.status],tone:p.value,title:`Pipeline`,number:H(a).pipeline.id,subtitle:H(a).pipeline.name,"external-href":H(a).pipeline.webUrl,host:e.host},{meta:F(()=>[H(a).pipeline.ref?(V(),q(`span`,kX,j(H(Bn)(H(a).pipeline.ref)),1)):B(``,!0),H(a).pipeline.source?(V(),q(`span`,AX,j(H(vr)(H(a).pipeline.source)),1)):B(``,!0),H(a).pipeline.sha?(V(),q(`span`,jX,j(H(mi)(H(a).pipeline.sha)),1)):B(``,!0),H(a).pipeline.createdAt?(V(),q(`span`,{key:3,title:H(a).pipeline.createdAt},`создан `+j(H(ci)(H(a).pipeline.createdAt)),9,MX)):B(``,!0),H(rr)(H(a).pipeline.duration)?(V(),q(`span`,NX,`за `+j(H(rr)(H(a).pipeline.duration)),1)):B(``,!0)]),_:1},8,[`state`,`tone`,`number`,`subtitle`,`external-href`,`host`]),K(`div`,PX,[I(_,{as:`h3`,size:`sm`,tone:`secondary`,"space-before":4,"space-after":0},{default:F(()=>[...n[3]||=[N(`Джобы`,-1)]]),_:1}),K(`span`,FX,j(H(Qn)(H(a).jobs.length,`джоб`,`джоба`,`джобов`)),1),f.value?(V(),q(`div`,IX,[K(`button`,{type:`button`,class:O({active:!u.value}),"aria-pressed":!u.value,onClick:n[0]||=e=>u.value=!1},` все `,10,LX),K(`button`,{type:`button`,class:O({active:u.value}),"aria-pressed":u.value,onClick:n[1]||=e=>u.value=!0},` проблемы (`+j(f.value)+`) `,11,RX)])):B(``,!0)]),H(a).jobs.length?d.value.length?B(``,!0):(V(),Y(i,{key:1,size:`xs`,leading:`inherit`,class:`note`},{default:F(()=>[...n[5]||=[N(`Проблемных джобов нет`,-1)]]),_:1})):(V(),Y(i,{key:0,size:`xs`,leading:`inherit`,class:`note`},{default:F(()=>[...n[4]||=[N(`Джобов нет`,-1)]]),_:1})),(V(!0),q(W,null,J(d.value,e=>(V(),q(`div`,{key:e.stage,class:`stage`},[K(`details`,{open:e.jobs.length<=20||e.jobs.some(e=>H(Kn).has(e.status))},[K(`summary`,null,[I(ne,{tone:e.tone,shrink:``},null,8,[`tone`]),K(`span`,BX,j(e.stage),1),K(`span`,VX,j(e.count),1),K(`span`,HX,j(e.summary.join(` · `)),1)]),K(`ul`,UX,[(V(!0),q(W,null,J(e.jobs,e=>(V(),q(`li`,{key:e.id},[K(`button`,{type:`button`,class:`job`,title:e.failureReason||`Открыть джоб #${e.id}`,onClick:t=>g(e)},[I(ne,{tone:H(dr)[e.status],shrink:``},null,8,[`tone`]),K(`span`,GX,j(e.name||`Job #${e.id}`),1),K(`span`,KX,j(H(ur)[e.status]),1),H(rr)(e.duration)?(V(),q(`span`,qX,j(H(rr)(e.duration)),1)):B(``,!0),K(`span`,JX,`#`+j(e.id),1)],8,WX)]))),128))])],8,zX)]))),128)),H(a).jobsTruncated?(V(),Y(i,{key:2,size:`xs`,leading:`inherit`,"space-before":2,class:`note`},{default:F(()=>[N(` Показано `+j(H(a).jobs.length)+` джобов. Остальные — на `+j(e.host)+`. `,1)]),_:1})):B(``,!0)]),_:1})):B(``,!0)]),_:1}))}}),[[`__scopeId`,`data-v-b527e29c`]]),XX={key:0},ZX={key:1,class:`mono`},QX=[`title`],$X={key:3},eZ={key:4},tZ={key:2,class:`trace`},nZ=G(M({__name:`JobView`,props:{projectId:{},id:{},host:{default:`GitLab`}},setup(e){let t=e,{detail:n,loading:r,error:a,reload:o}=OX(()=>t.projectId,()=>t.id),s=z(()=>{let e=n.value?.job.status;if(!e)return`neutral`;let t=dr[e];return t===`warning`||t===`success`||t===`danger`?t:`neutral`}),l=E(`job:${t.projectId}:${t.id}`,()=>({surface:`job`,projectId:t.projectId,jobId:t.id}));return c(l.scope)(`ide.job.refresh`,`Обновить джоб`,`Перечитывает статус джоба и его readonly-лог.`,()=>o()),ui(()=>{let e=`Job #${t.id}`;if(a.value)return{note:e,text:`Ошибка: ${a.value}`};let r=n.value;if(!r)return{note:e,text:`Загрузка…`};let i=r.job,o=r.log.length>2e4?`${r.log.slice(0,2e4)}…`:r.log;return{note:e,text:vi(`Состояние: ${ur[i.status]}`,`${i.name||`Job #${i.id}`}${i.stage?` (${i.stage})`:``}`,`Ветка: ${i.ref||`нет`}`,`Создан: ${i.createdAt}`,i.duration===null?``:`Длительность: ${rr(i.duration)}`,i.failureReason?`Причина: ${i.failureReason}`:``,i.allowFailure?`Разрешено падение`:``,r.logTruncated?`Лог показан не полностью.`:``,o?`Лог:\n${o}`:`Лог пуст`)}}),(t,o)=>(V(),Y(_i,null,{default:F(()=>[H(r)?(V(),Y(i,{key:0,size:`xs`,leading:`inherit`,class:`note`,role:`status`},{default:F(()=>[...o[0]||=[N(`загрузка: джоб…`,-1)]]),_:1})):H(a)?(V(),Y(i,{key:1,size:`xs`,leading:`inherit`,class:`note error`,role:`alert`},{default:F(()=>[N(j(H(a)),1)]),_:1})):H(n)?(V(),Y(hi,{key:2,width:1100},{default:F(()=>[I(pi,{state:H(ur)[H(n).job.status],tone:s.value,title:H(n).job.name||`Job`,number:H(n).job.id,"external-href":H(n).job.webUrl,host:e.host},{meta:F(()=>[H(n).job.stage?(V(),q(`span`,XX,j(H(n).job.stage),1)):B(``,!0),H(n).job.ref?(V(),q(`span`,ZX,j(H(Bn)(H(n).job.ref)),1)):B(``,!0),H(n).job.createdAt?(V(),q(`span`,{key:2,title:H(n).job.createdAt},`создан `+j(H(ci)(H(n).job.createdAt)),9,QX)):B(``,!0),H(rr)(H(n).job.duration)?(V(),q(`span`,$X,`за `+j(H(rr)(H(n).job.duration)),1)):B(``,!0),H(n).job.allowFailure?(V(),q(`span`,eZ,`падение разрешено`)):B(``,!0)]),_:1},8,[`state`,`tone`,`title`,`number`,`external-href`,`host`]),H(n).job.failureReason?(V(),Y(i,{key:0,size:`xs`,leading:`inherit`,"space-before":2,class:`note`},{default:F(()=>[N(`Причина: `+j(H(n).job.failureReason),1)]),_:1})):B(``,!0),I(_,{as:`h3`,size:`sm`,tone:`secondary`,"space-before":4,"space-after":2},{default:F(()=>[...o[1]||=[N(`Лог`,-1)]]),_:1}),H(n).log?(V(),q(`pre`,tZ,j(H(n).log),1)):(V(),Y(i,{key:1,size:`xs`,leading:`inherit`,class:`note`},{default:F(()=>[...o[2]||=[N(`Лог пуст или недоступен`,-1)]]),_:1})),H(n).logTruncated?(V(),Y(i,{key:3,size:`xs`,leading:`inherit`,"space-before":2,class:`note`},{default:F(()=>[N(` Показаны первые 2 MiB лога. Полный лог — на `+j(e.host)+`. `,1)]),_:1})):B(``,!0)]),_:1})):B(``,!0)]),_:1}))}}),[[`__scopeId`,`data-v-72bb1cb8`]]);function rZ(e){let t=X([]),n=X(null),r=X(``),i=X(!1),a=X(!1),o=X(``),s=0,c=t=>Vn(e(),`releases`,{page:String(t)}),l=e=>e instanceof Error?e.message:`Не удалось прочитать релизы`;async function u(){let e=++s;i.value=!0,a.value=!1,o.value=``;try{let i=await c(1);if(e!==s)return;t.value=i.releases,n.value=i.next,r.value=i.latestTag}catch(t){e===s&&(o.value=l(t))}finally{e===s&&(i.value=!1)}}async function d(){if(n.value===null||i.value||a.value)return;let e=s;a.value=!0;try{let i=await c(n.value);if(e!==s)return;let a=new Set(t.value.map(e=>e.id));t.value=[...t.value,...i.releases.filter(e=>!a.has(e.id))],n.value=i.next,i.latestTag&&(r.value=i.latestTag)}catch(t){e===s&&(o.value=l(t))}finally{e===s&&(a.value=!1)}}function f(){++s,t.value=[],n.value=null,r.value=``,i.value=!1,a.value=!1,o.value=``}return{items:t,next:n,latestTag:r,loading:i,loadingMore:a,error:o,load:u,more:d,reset:f}}function iZ(e){let{list:t}=e,n=X(!0),r=E(`releases:${e.projectId()}`,()=>({surface:`releases`,projectId:e.projectId()})),i=c(r.scope);i(`ide.releases.block.toggle`,`Свернуть или развернуть блок releases`,`Показывает или скрывает список релизов в сайдбаре.`,()=>{n.value=!n.value}),i(`ide.releases.refresh`,`Обновить список релизов`,`Перечитывает первую страницу релизов.`,()=>t.load()),i(`ide.releases.more`,`Показать следующую страницу релизов`,`Догружает следующую страницу релизов (по 30).`,()=>t.more()),i(`ide.releases.open`,`Открыть релиз`,`Открывает вкладку релиза: описание, ссылки и скачиваемые файлы.`,t=>{let{tag:n,title:r,pinned:i}=b(t);if(typeof n!=`string`||!n.trim())throw Error(`Укажите тег релиза`);e.open({tag:n.trim(),title:typeof r==`string`?r:``},i===!0)},{tag:`string: тег релиза`,title:`string (необязательно): заголовок вкладки`,pinned:`boolean (необязательно): true — постоянная вкладка вместо временной`});let a=!1;return R(e.active,e=>{e&&!a&&(a=!0,t.load())},{immediate:!0}),R(e.projectId,()=>{a=!1,t.reset()}),{commands:r,open:n}}function aZ(e){return e===null||!Number.isFinite(e)||e<0?``:e<1024?`${Math.round(e)} Б`:e<1048576?`${(e/1024).toLocaleString(`ru-RU`,{maximumFractionDigits:1})} КБ`:e<1073741824?`${(e/1024/1024).toLocaleString(`ru-RU`,{maximumFractionDigits:1})} МБ`:`${(e/1024/1024/1024).toLocaleString(`ru-RU`,{maximumFractionDigits:1})} ГБ`}function oZ(e){return e===null?``:Qn(e,`скачивание`,`скачивания`,`скачиваний`)}var sZ={class:`tag mono`},cZ={key:0,class:`name`},lZ=[`title`],uZ={key:2},dZ={key:3},fZ=G(M({__name:`ReleaseRow`,props:{release:{},latest:{type:Boolean}},setup(e){return(t,n)=>(V(),Y(cY,{label:e.release.name||e.release.tag},{title:F(()=>[K(`span`,sZ,j(e.release.tag||`release`),1),e.latest?(V(),Y(hl,{key:0,tone:`info`,shrink:``},{default:F(()=>[...n[0]||=[N(`последний`,-1)]]),_:1})):B(``,!0),e.release.prerelease?(V(),Y(hl,{key:1,tone:`warning`,shrink:``},{default:F(()=>[...n[1]||=[N(`пререлиз`,-1)]]),_:1})):B(``,!0),e.release.draft?(V(),Y(hl,{key:2,shrink:``},{default:F(()=>[...n[2]||=[N(`черновик`,-1)]]),_:1})):B(``,!0),e.release.upcoming?(V(),Y(hl,{key:3,tone:`warning`,shrink:``},{default:F(()=>[...n[3]||=[N(`скоро`,-1)]]),_:1})):B(``,!0)]),meta:F(()=>[e.release.name&&e.release.name!==e.release.tag?(V(),q(`span`,cZ,j(e.release.name),1)):B(``,!0),e.release.releasedAt?(V(),q(`span`,{key:1,title:e.release.releasedAt},j(H(ci)(e.release.releasedAt)),9,lZ)):B(``,!0),e.release.assetCount?(V(),q(`span`,uZ,j(H(Qn)(e.release.assetCount,`файл`,`файла`,`файлов`)),1)):B(``,!0),e.release.downloads?(V(),q(`span`,dZ,j(H(oZ)(e.release.downloads)),1)):B(``,!0)]),_:1},8,[`label`]))}}),[[`__scopeId`,`data-v-f008ea32`]]),pZ=M({__name:`ReleasesPanel`,props:{projectId:{},active:{type:Boolean}},emits:[`open`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=rZ(()=>r.projectId),{commands:o,open:s}=iZ({projectId:()=>r.projectId,active:()=>r.active,list:a,open:(e,t)=>i(`open`,e,t)}),c=(e,t)=>o.run(`ide.releases.${e}`,t),l=(e,t=!1)=>c(`open`,{tag:e.tag,title:e.name||e.tag,pinned:t});return t({refresh:()=>a.load()}),(e,t)=>(V(),Y(aY,{class:`release-panel`,title:`Releases`,count:H(a).items.value.length,open:H(s),loading:H(a).loading.value,"loading-more":H(a).loadingMore.value,error:H(a).error.value,"has-more":H(a).next.value!==null,noun:`релизы`,"toggle-command":`ide.releases.block.toggle`,onToggle:t[0]||=e=>c(`block.toggle`),onMore:t[1]||=e=>c(`more`)},{default:F(()=>[(V(!0),q(W,null,J(H(a).items.value,e=>(V(),q(`li`,{key:e.id},[I(fZ,{release:e,latest:e.tag===H(a).latestTag.value,onClick:t=>l(e),onDblclick:t=>l(e,!0)},null,8,[`release`,`latest`,`onClick`,`onDblclick`])]))),128))]),_:1},8,[`count`,`open`,`loading`,`loading-more`,`error`,`has-more`]))}});async function mZ(e=``,t,n=`GET`,r,i={}){let a=new URLSearchParams(i);t&&a.set(`projectId`,t);let o=await fetch(`/api/docker${e}?${a}`,{method:n,headers:{"Content-Type":`application/json`},body:r===void 0?void 0:JSON.stringify(r)}),s=await o.json();if(!o.ok)throw Error(s.error||`Ошибка Docker`);return s}function hZ(e,t){let n=X(),r=X(``),i=X(!1),a=X(!1),o=X(!1),s=X(``),c=X(``),l=E(`docker:${e}`,()=>({surface:`docker`,projectId:e,context:n.value?.context??``,busy:i.value})),u=!1,d=!1,f=0,p,m=z(()=>{let e=n.value,t=e?.binding;return!e||!t||t.context!==e.context?[]:e.containers.filter(e=>e.project===t.name)}),h=z(()=>o.value?n.value?.containers??[]:m.value),g=z(()=>h.value.find(e=>e.id===s.value));async function _(){if(d)return n.value;d=!0;let t=++f;try{let i=await mZ(``,e,`GET`,void 0,c.value?{context:c.value}:{});return!u&&t===f&&(n.value=i,r.value=``),i}catch(e){throw!u&&t===f&&(r.value=e instanceof Error?e.message:`Docker недоступен`,n.value&&={...n.value,connected:!1,containers:[]}),e}finally{d=!1}}let v=()=>!!n.value?.connected&&!i.value;async function y(e){if(i.value)throw Error(`Дождитесь текущего Docker-действия`);i.value=!0;try{for(;d;)await new Promise(e=>setTimeout(e,25));return await e()}finally{i.value=!1}}let x=(e,n,r,i,a=()=>!0,o)=>{l.scope.registerCommand({id:`ide.docker.${e}`,title:n,description:r,arguments:o,enabled:e=>t.enabled!==!1&&a(b(e)),run:e=>i(b(e))})};x(`open`,`Открыть Docker`,`Открывает Docker во вкладке проекта; all=true показывает все контейнеры выбранного context.`,e=>{o.value=e.all===!0,typeof e.containerId==`string`&&(s.value=e.containerId),t.open()},()=>!0,{all:`true — все контейнеры машины`,containerId:`Выбрать контейнер`}),x(`status`,`Получить состояние Docker`,`Возвращает daemon, contexts, Compose-привязку, контейнеры, health и опубликованные порты.`,_),x(`daemon.start`,`Запустить Docker daemon`,`Если Docker daemon не запущен, поднимает его способом, принятым в этой ОС (systemd, Docker Desktop, OrbStack, Colima), и ждёт ответа до 90 секунд. Может запросить пароль администратора.`,()=>y(async()=>{a.value=!0;try{await mZ(`/daemon/start`,e,`POST`,{context:n.value?.context})}finally{a.value=!1,await _().catch(()=>{})}return n.value}),()=>!i.value&&!!n.value?.enabled&&!!n.value.daemon?.start.auto),x(`sidebar.open`,`Показать Docker в боковой панели`,`Открывает сервисы текущего проекта в боковой панели.`,t.sidebar),x(`refresh`,`Обновить Docker`,`Перечитывает состояние выбранного Docker context.`,_,()=>!d),x(`context.select`,`Выбрать Docker context`,`Меняет окружение просмотра внутри Projector, не меняя глобальный context Docker CLI.`,async e=>{if(typeof e.context!=`string`||!n.value?.contexts.some(t=>t.name===e.context&&t.local))throw Error(`Выберите локальный context`);for(c.value=e.context,s.value=``,n.value=void 0,++f;d;)await new Promise(e=>setTimeout(e,25));return _()},()=>!i.value,{context:`Имя локального Docker context`}),x(`container.select`,`Показать контейнер`,`Выбирает контейнер и показывает порты, образ, health и mounts.`,e=>{if(typeof e.containerId!=`string`||!n.value?.containers.some(t=>t.id===e.containerId))throw Error(`Контейнер не найден`);s.value=e.containerId},v,{containerId:`Полный ID контейнера`}),x(`binding.save`,`Привязать Compose к проекту`,`Сохраняет context, name, files, profiles, envFiles на диске. Ничего не запускает. binding=null удаляет привязку.`,t=>y(async()=>{let n=await mZ(`/binding`,e,`PUT`,t);return c.value=n.binding?.context??``,await _(),n}),()=>!i.value&&!!n.value?.enabled,{context:`Docker context`,name:`Compose project name`,files:`Упорядоченный список Compose-файлов относительно проекта`,profiles:`Список profiles`,envFiles:`Список env-файлов`,binding:`null — отвязать`}),x(`logs.read`,`Прочитать логи контейнера`,`Возвращает последние 200 строк логов; не открывает терминал.`,t=>{let r=t.containerId??s.value;if(typeof r!=`string`||!n.value?.containers.some(e=>e.id===r))throw Error(`Выберите контейнер`);return mZ(`/logs`,e,`GET`,void 0,{context:n.value.context,containerId:r})},v,{containerId:`Полный ID контейнера`});for(let[r,i,a]of[[`start`,`Запустить контейнер`,`Запускает существующий контейнер.`],[`stop`,`Остановить контейнер`,`Останавливает контейнер с таймаутом 10 секунд.`],[`restart`,`Перезапустить контейнер`,`Прерывает текущие процессы контейнера и запускает его снова.`],[`remove`,`Удалить контейнер`,`Удаляет остановленный контейнер; volumes сохраняются. confirm=true подтверждает удаление.`],[`logs`,`Открыть логи контейнера`,`Открывает поток docker logs в терминальной вкладке; закрытие вкладки оставляет контейнер работать.`],[`shell`,`Открыть shell контейнера`,`Открывает docker exec -it с sh или bash в настоящем PTY. Закрытие клиента не гарантирует завершение запущенных внутри задач.`],[`up`,`Поднять Compose`,`Создаёт и запускает окружение из сохранённой привязки; может собирать и скачивать образы.`],[`composeStop`,`Остановить Compose`,`Останавливает сервисы, сохраняя контейнеры и данные.`],[`composeRestart`,`Перезапустить Compose`,`Перезапускает сервисы и прерывает их текущие процессы.`],[`down`,`Удалить Compose-окружение`,`Останавливает и удаляет контейнеры и сети. Volumes сохраняются. confirm=true подтверждает удаление.`],[`build`,`Собрать Compose`,`Собирает образы; прогресс и код завершения показаны в терминале.`],[`pull`,`Скачать образы Compose`,`Скачивает образы сервисов; прогресс показан в терминале.`]]){let o=[`up`,`composeStop`,`composeRestart`,`down`,`build`,`pull`].includes(r);x(r,i,a,a=>y(async()=>{let c=a.containerId??s.value;if(!o&&!n.value?.containers.some(e=>e.id===c))throw Error(`Выберите контейнер`);if((r===`remove`||r===`down`)&&a.confirm!==!0&&!window.confirm(`${i}? Контекст: ${n.value.context}. Объект: ${o?n.value.binding?.name:n.value.containers.find(e=>e.id===c)?.name}. Volumes сохраняются.`))return;let l=await mZ(`/action`,e,`POST`,{...a,action:r,containerId:o?void 0:c,context:n.value.context,confirm:r===`remove`||r===`down`||void 0});return await t.terminal(l.session),await _(),l}),e=>{if(!v())return!1;if(o)return!!n.value?.composeVersion&&n.value.binding?.context===n.value.context;let t=n.value?.containers.find(t=>t.id===(e.containerId??s.value));return!!t&&(r===`shell`||r===`stop`?t.state===`running`:r===`remove`||r===`start`?t.state!==`running`:!0)},{containerId:`Полный ID; без аргумента используется выбранный контейнер`,service:`Имя Compose service; без аргумента — всё окружение`,shell:`sh (по умолчанию) или bash`,confirm:`true — явное подтверждение удаления`})}x(`port.open`,`Открыть опубликованный порт`,`Открывает опубликованный TCP-порт в браузере как HTTP или HTTPS. Не определяет протокол приложения автоматически.`,e=>{let t=(n.value?.containers.find(t=>t.id===(e.containerId??s.value)))?.ports.find(t=>t.publicPort===e.port&&t.url);if(!t?.url||e.scheme!==void 0&&e.scheme!==`http`&&e.scheme!==`https`)throw Error(`Выберите TCP-порт и http/https`);pE(e.scheme===`https`?t.url.replace(/^http:/,`https:`):t.url)},v,{containerId:`ID контейнера`,port:`Опубликованный порт (число)`,scheme:`http или https`});async function S(){if(!u&&!document.hidden&&!i.value)try{await _()}catch{}u||(p=setTimeout(S,n.value?.enabled?5e3:15e3))}Lt(()=>{t.enabled!==!1&&S()}),lt(()=>{u=!0,++f,clearTimeout(p)});let C={snapshot:n,error:r,busy:i,starting:a,all:o,selected:s,projectContainers:m,containers:h,current:g,commands:l};return ot(gZ,C),C}var gZ=Symbol(`docker`);function _Z(){let e=tt(gZ);if(!e)throw Error(`Docker host is not installed`);return e}var vZ={class:`notice`},yZ={key:0,class:`offer`},bZ={class:`how`},xZ={key:1,class:`how`},SZ=G(M({__name:`DockerDaemonNotice`,props:{message:{},daemon:{},starting:{type:Boolean},size:{}},emits:[`start`],setup(e){return(n,r)=>(V(),q(`div`,vZ,[I(t,{tone:`danger`,role:`alert`,variant:`padded`,size:e.size??`xs`,flush:``,wrap:``},{default:F(()=>[N(j(e.daemon?.state===`stopped`?`Docker daemon не запущен.`:e.message),1)]),_:1},8,[`size`]),e.daemon?(V(),q(`div`,yZ,[e.daemon.start.auto?(V(),q(W,{key:0},[I(Q,{size:`sm`,disabled:e.starting,onClick:r[0]||=e=>n.$emit(`start`)},{default:F(()=>[e.starting?(V(),Y(An,{key:0})):B(``,!0),N(` `+j(e.starting?`Запускаю…`:`Запустить Docker`),1)]),_:1},8,[`disabled`]),K(`span`,bZ,j(e.daemon.start.label),1)],64)):(V(),q(`span`,xZ,j(e.daemon.start.manual),1))])):B(``,!0)]))}}),[[`__scopeId`,`data-v-9f5d27f2`]]),CZ=G(M({__name:`UiFormGrid`,props:{layout:{}},setup(e){return(t,n)=>(V(),q(`div`,{class:O([`form-grid`,e.layout??`equal`])},[L(t.$slots,`default`,{},void 0,!0)],2))}}),[[`__scopeId`,`data-v-1c756e97`]]),wZ=[`open`],TZ=[`open`],EZ=G(M({__name:`DockerBinding`,setup(e){let{snapshot:t,busy:n,commands:i}=_Z(),o=X(``),s=X(``),l=X(``),u=X(``),d=X(``),f=X(!1),p=X(!1),m=e=>e.split(`
|
|
154
|
+
`).map(e=>e.trim()).filter(Boolean),h=c(i.scope);return h(`ide.docker.binding.edit`,`Настроить Compose-привязку`,`Раскрывает или сворачивает параметры Compose текущего проекта.`,()=>{f.value=!f.value}),h(`ide.docker.binding.options`,`Показать дополнительные параметры Compose`,`Раскрывает дополнительные Compose-файлы, profiles и env-файлы.`,()=>{p.value=!p.value}),R(()=>JSON.stringify([t.value?.binding,t.value?.detectedFiles]),()=>{let e=t.value?.binding,n=e?.files??t.value?.detectedFiles.slice(0,1)??[];o.value=e?.name??``,s.value=n[0]??``,l.value=n.slice(1).join(`
|
|
155
|
+
`),u.value=e?.profiles.join(`, `)??``,d.value=e?.envFiles.join(`
|
|
156
|
+
`)??``},{immediate:!0}),(e,c)=>(V(),q(`details`,{open:f.value||!H(t)?.binding,class:`binding`},[K(`summary`,{onClick:c[0]||=Z(e=>H(i).run(`ide.docker.binding.edit`),[`prevent`])},j(H(t)?.binding?`Compose · ${H(t).binding.name}`:`Подключить Compose`),1),K(`form`,{onSubmit:c[8]||=Z(e=>H(i).run(`ide.docker.binding.save`,{context:H(t).context,name:o.value,files:[s.value.trim(),...m(l.value)],profiles:u.value.split(`,`).map(e=>e.trim()).filter(Boolean),envFiles:m(d.value)}),[`prevent`])},[I(CZ,{layout:`wide-end`},{default:F(()=>[I(g,{label:`Имя окружения`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:o.value,"onUpdate:modelValue":c[1]||=e=>o.value=e,"aria-label":`Имя окружения`,required:``,pattern:`[a-z0-9][a-z0-9_\\-]*`,disabled:H(n),placeholder:`my-project`,spellcheck:`false`}),null,16,[`modelValue`,`disabled`])]),_:1}),I(g,{label:`Compose-файл`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:s.value,"onUpdate:modelValue":c[2]||=e=>s.value=e,"aria-label":`Compose-файл`,required:``,disabled:H(n),placeholder:`compose.yaml`,spellcheck:`false`}),null,16,[`modelValue`,`disabled`])]),_:1})]),_:1}),K(`details`,{open:p.value,class:`advanced`},[K(`summary`,{onClick:c[3]||=Z(e=>H(i).run(`ide.docker.binding.options`),[`prevent`])},`Дополнительно`),I(CZ,{class:`advanced-fields`},{default:F(()=>[I(g,{label:`Дополнительные Compose-файлы`},{default:F(({control:e})=>[I(a,rn({as:`textarea`},e,{modelValue:l.value,"onUpdate:modelValue":c[4]||=e=>l.value=e,"aria-label":`Дополнительные Compose-файлы`,disabled:H(n),placeholder:`compose.override.yaml`,rows:`2`,spellcheck:`false`}),null,16,[`modelValue`,`disabled`])]),_:1}),I(g,{label:`Env-файлы`},{default:F(({control:e})=>[I(a,rn({as:`textarea`},e,{modelValue:d.value,"onUpdate:modelValue":c[5]||=e=>d.value=e,"aria-label":`Env-файлы`,disabled:H(n),placeholder:`.env.local`,rows:`2`,spellcheck:`false`}),null,16,[`modelValue`,`disabled`])]),_:1}),I(g,{label:`Profiles`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:u.value,"onUpdate:modelValue":c[6]||=e=>u.value=e,"aria-label":`Profiles`,disabled:H(n),placeholder:`dev, debug`,spellcheck:`false`}),null,16,[`modelValue`,`disabled`])]),_:1})]),_:1})],8,TZ),I(r,{class:`actions`,align:`stretch`},{default:F(()=>[I(Q,{type:`submit`,disabled:H(n)},{default:F(()=>[...c[9]||=[N(`Сохранить`,-1)]]),_:1},8,[`disabled`]),H(t)?.binding?(V(),Y(Q,{key:0,disabled:H(n),onClick:c[7]||=e=>H(i).run(`ide.docker.binding.save`,{binding:null})},{default:F(()=>[...c[10]||=[N(`Отвязать`,-1)]]),_:1},8,[`disabled`])):B(``,!0)]),_:1})],32)],8,wZ))}}),[[`__scopeId`,`data-v-b5e3cf22`]]),DZ=[`value`,`disabled`],OZ={class:`muted`},kZ={key:3,class:`table-wrap`},AZ=[`onClick`],jZ={key:4,class:`details`},MZ={class:`muted`},NZ={key:0,class:`ports`},PZ={key:1},FZ=G(M({__name:`DockerPanel`,setup(e){let{snapshot:n,containers:i,current:o,selected:s,all:c,busy:l,starting:u,error:d,commands:f}=_Z(),p=X(`sh`),m=e=>e.ports.map(e=>`${e.publicPort}→${e.privatePort}/${e.protocol}`).join(`, `)||`—`;ui(()=>{let e=n.value,t=e?.binding,r=i.value,a=o.value,s=d.value||e?.error||``;return{note:`Docker`,text:vi(e?.connected?`Подключение: Docker ${e.version}`:`Подключение: нет`,e?`Контекст: ${e.context}`:void 0,e?.contexts.length?`Контексты: ${e.contexts.map(e=>e.name).join(`, `)}`:void 0,e&&!e.enabled?`Docker выключен`:void 0,c.value?`Показаны: все контейнеры`:`Показаны: контейнеры проекта`,t?`Привязка: ${t.name}${t.files.length?` · ${t.files.join(`, `)}`:``}${t.profiles.length?` · profiles ${t.profiles.join(`, `)}`:``}`:void 0,s?`Ошибка: ${s}`:void 0,l.value?`Выполняется действие…`:void 0,r.length?`Контейнеры:\n${r.map(e=>`${e.service||e.name} — ${e.state}${e.state===`exited`?` (${e.exitCode})`:``}, health ${e.health||`—`}, ${e.image}, ports ${m(e)}`).join(`
|
|
157
|
+
`)}`:`Контейнеры: нет`,a?vi(`Выбран: ${a.name} (${a.id.slice(0,12)}) · ${a.image} · ${di(a.startedAt)}`,`Порты: ${m(a)}`,a.mounts.length?`Монтирования:\n${a.mounts.map(e=>`${e.target} · ${e.type} · ${e.writable?`rw`:`ro`} ← ${e.source}`).join(`
|
|
158
|
+
`)}`:void 0):void 0)}});let h=[{id:`up`,title:`Поднять`},{id:`composeStop`,title:`Остановить`},{id:`composeRestart`,title:`Перезапустить`},{id:`build`,title:`Собрать`},{id:`pull`,title:`Скачать образы`},{id:`down`,title:`Удалить окружение`}];return(e,m)=>{let g=pe(`router-link`);return V(),q(`section`,{class:`docker-panel`,onPointerdown:m[12]||=e=>H(f).scope.activate(),onKeydown:m[13]||=(...e)=>H(f).keydown&&H(f).keydown(...e)},[I(r,{as:`header`,wrap:``,justify:`normal`},{default:F(()=>[I(r,{as:`label`,justify:`normal`},{default:F(()=>[m[14]||=N(`Окружение `,-1),I(a,{as:`select`,appearance:`filled`,value:H(n)?.context,disabled:H(l)||!H(n),onChange:m[0]||=e=>H(f).run(`ide.docker.context.select`,{context:e.target.value})},{default:F(()=>[(V(!0),q(W,null,J(H(n)?.contexts,e=>(V(),q(`option`,{key:e.name,value:e.name,disabled:!e.local},j(e.name)+j(e.local?``:` · удалённый`),9,DZ))),128))]),_:1},8,[`value`,`disabled`])]),_:1}),I(Q,{active:!H(c),onClick:m[1]||=e=>H(f).run(`ide.docker.open`)},{default:F(()=>[...m[15]||=[N(`Проект`,-1)]]),_:1},8,[`active`]),I(Q,{active:H(c),onClick:m[2]||=e=>H(f).run(`ide.docker.open`,{all:!0})},{default:F(()=>[...m[16]||=[N(`Все контейнеры`,-1)]]),_:1},8,[`active`]),I(Q,{disabled:H(l),onClick:m[3]||=e=>H(f).run(`ide.docker.refresh`)},{default:F(()=>[...m[17]||=[N(`Обновить`,-1)]]),_:1},8,[`disabled`]),K(`span`,OZ,j(H(n)?.connected?`Docker ${H(n).version}`:`нет подключения`),1)]),_:1}),H(d)||H(n)?.error?(V(),Y(SZ,{key:0,message:H(d)||H(n)?.error||``,daemon:H(n)?.daemon,starting:H(u),size:`sm`,onStart:m[4]||=e=>H(f).run(`ide.docker.daemon.start`)},null,8,[`message`,`daemon`,`starting`])):B(``,!0),!H(n)&&!H(d)?(V(),Y(nd,{key:1},{default:F(()=>[...m[18]||=[N(`Подключение…`,-1)]]),_:1})):H(n)&&!H(n).enabled?(V(),Y(nd,{key:2},{default:F(()=>[m[20]||=N(`Docker выключен. `,-1),I(g,{to:`/settings`},{default:F(()=>[...m[19]||=[N(`Открыть настройки интеграций`,-1)]]),_:1})]),_:1})):B(``,!0),H(n)?.enabled?(V(),q(W,{key:3},[H(c)?B(``,!0):(V(),Y(EZ,{key:0})),!H(c)&&H(n).binding?(V(),Y(r,{key:1,class:`actions compose-actions`,wrap:``,justify:`normal`},{default:F(()=>[(V(),q(W,null,J(h,e=>I(Q,{key:e.id,size:`sm`,disabled:!H(f).scope.describe(`ide.docker.${e.id}`)?.enabled,onClick:t=>H(f).run(`ide.docker.${e.id}`)},{default:F(()=>[N(j(e.title),1)]),_:2},1032,[`disabled`,`onClick`])),64)),H(n).connected&&!H(n).composeVersion?(V(),Y(t,{key:0,as:`span`,tone:`danger`,variant:`padded`,flush:``,wrap:``},{default:F(()=>[...m[21]||=[N(`Docker Compose не установлен`,-1)]]),_:1})):B(``,!0)]),_:1})):B(``,!0),H(n).connected&&!H(i).length?(V(),Y(nd,{key:2},{default:F(()=>[N(j(!H(c)&&!H(n).binding?`Сохраните привязку или откройте все контейнеры.`:`Контейнеров нет.`),1)]),_:1})):B(``,!0),H(i).length?(V(),q(`div`,kZ,[I(Ru,{padding:`var(--sp-2) var(--sp-3)`,"header-tone":`muted`,"header-weight":400},{default:F(()=>[m[22]||=K(`thead`,null,[K(`tr`,null,[K(`th`,null,`Контейнер / сервис`),K(`th`,null,`Состояние`),K(`th`,null,`Health`),K(`th`,null,`Образ`),K(`th`,null,`Порты`)])],-1),K(`tbody`,null,[(V(!0),q(W,null,J(H(i),e=>(V(),q(`tr`,{key:e.id,class:O({selected:H(s)===e.id})},[K(`td`,null,[K(`button`,{class:`select-container`,onClick:t=>H(f).run(`ide.docker.container.select`,{containerId:e.id})},j(e.service||e.name),9,AZ),K(`small`,null,j(e.project||`отдельный контейнер`)+` · `+j(e.name),1)]),K(`td`,{class:O({failed:e.state===`exited`&&e.exitCode!==0})},j(e.state)+j(e.state===`exited`?` · ${e.exitCode}`:``),3),K(`td`,{class:O({failed:e.health===`unhealthy`})},j(e.health||`не задан`),3),K(`td`,null,j(e.image),1),K(`td`,null,j(e.ports.map(e=>`${e.publicPort} → ${e.privatePort}/${e.protocol}`).join(`, `)||`—`),1)],2))),128))])]),_:1})])):B(``,!0),H(o)?(V(),q(`article`,jZ,[K(`h3`,null,j(H(o).name),1),K(`p`,MZ,j(H(o).id.slice(0,12))+` · `+j(H(o).image)+` · `+j(H(di)(H(o).startedAt)),1),I(r,{class:`actions`,wrap:``,justify:`normal`},{default:F(()=>[H(o).state===`running`?B(``,!0):(V(),Y(Q,{key:0,disabled:H(l)||!H(n).connected,onClick:m[5]||=e=>H(f).run(`ide.docker.start`)},{default:F(()=>[...m[23]||=[N(`Запустить`,-1)]]),_:1},8,[`disabled`])),H(o).state===`running`?(V(),Y(Q,{key:1,disabled:H(l)||!H(n).connected,onClick:m[6]||=e=>H(f).run(`ide.docker.stop`)},{default:F(()=>[...m[24]||=[N(`Остановить`,-1)]]),_:1},8,[`disabled`])):B(``,!0),I(Q,{disabled:H(l)||!H(n).connected,onClick:m[7]||=e=>H(f).run(`ide.docker.restart`)},{default:F(()=>[...m[25]||=[N(`Перезапустить`,-1)]]),_:1},8,[`disabled`]),I(Q,{disabled:H(l)||!H(n).connected,onClick:m[8]||=e=>H(f).run(`ide.docker.logs`)},{default:F(()=>[...m[26]||=[N(`Логи`,-1)]]),_:1},8,[`disabled`]),I(a,{as:`select`,appearance:`filled`,modelValue:p.value,"onUpdate:modelValue":m[9]||=e=>p.value=e,"aria-label":`Оболочка контейнера`},{default:F(()=>[...m[27]||=[K(`option`,null,`sh`,-1),K(`option`,null,`bash`,-1)]]),_:1},8,[`modelValue`]),I(Q,{disabled:H(l)||H(o).state!==`running`||!H(n).connected,onClick:m[10]||=e=>H(f).run(`ide.docker.shell`,{shell:p.value})},{default:F(()=>[...m[28]||=[N(`Shell`,-1)]]),_:1},8,[`disabled`]),I(Q,{disabled:H(l)||H(o).state===`running`||!H(n).connected,onClick:m[11]||=e=>H(f).run(`ide.docker.remove`)},{default:F(()=>[...m[29]||=[N(`Удалить`,-1)]]),_:1},8,[`disabled`])]),_:1}),H(o).ports.length?(V(),q(`div`,NZ,[(V(!0),q(W,null,J(H(o).ports,e=>(V(),q(`div`,{key:`${e.address}:${e.publicPort}/${e.protocol}`},[K(`code`,null,j(e.address)+`:`+j(e.publicPort)+` → `+j(e.privatePort)+`/`+j(e.protocol),1),e.url?(V(),q(W,{key:0},[I(Q,{size:`sm`,onClick:t=>H(f).run(`ide.docker.port.open`,{port:e.publicPort})},{default:F(()=>[...m[30]||=[N(`HTTP ↗`,-1)]]),_:1},8,[`onClick`]),I(Q,{size:`sm`,onClick:t=>H(f).run(`ide.docker.port.open`,{port:e.publicPort,scheme:`https`})},{default:F(()=>[...m[31]||=[N(`HTTPS ↗`,-1)]]),_:1},8,[`onClick`])],64)):B(``,!0)]))),128))])):B(``,!0),H(o).mounts.length?(V(),q(`dl`,PZ,[(V(!0),q(W,null,J(H(o).mounts,e=>(V(),q(W,{key:e.target},[K(`dt`,null,j(e.target)+` · `+j(e.type)+` · `+j(e.writable?`rw`:`ro`),1),K(`dd`,null,j(e.source),1)],64))),128))])):B(``,!0)])):B(``,!0)],64)):B(``,!0)],32)}}}),[[`__scopeId`,`data-v-cc03bda6`]]),IZ=[`onClick`],LZ={class:`name`},RZ={class:`status`},zZ=G(M({__name:`DockerSidebar`,setup(e){let{snapshot:t,error:n,starting:r,commands:i,projectContainers:a}=_Z();return(e,o)=>(V(),Y(Lu,{class:`docker-sidebar`,onPointerdown:o[2]||=e=>H(i).scope.activate()},{default:F(()=>[I(Zf,{as:`header`,justify:`between`,text:`xs`},{default:F(()=>[K(`span`,null,j(H(t)?.binding?.name||`Docker`),1),I(Q,{size:`sm`,onClick:o[0]||=e=>H(i).run(`ide.docker.open`)},{default:F(()=>[...o[3]||=[N(`открыть`,-1)]]),_:1})]),_:1}),H(n)||H(t)?.error?(V(),Y(SZ,{key:0,message:H(n)||H(t)?.error||``,daemon:H(t)?.daemon,starting:H(r),onStart:o[1]||=e=>H(i).run(`ide.docker.daemon.start`)},null,8,[`message`,`daemon`,`starting`])):H(t)?H(t).enabled?H(t).binding?H(a).length?B(``,!0):(V(),Y(nd,{key:4},{default:F(()=>[...o[7]||=[N(`Контейнеры ещё не созданы.`,-1)]]),_:1})):(V(),Y(nd,{key:3},{default:F(()=>[...o[6]||=[N(`Откройте Docker и привяжите Compose к проекту.`,-1)]]),_:1})):(V(),Y(nd,{key:2},{default:F(()=>[...o[5]||=[N(`Включите Docker в настройках интеграций.`,-1)]]),_:1})):(V(),Y(nd,{key:1},{default:F(()=>[...o[4]||=[N(`Подключение…`,-1)]]),_:1})),(V(!0),q(W,null,J(H(a),e=>(V(),q(`button`,{key:e.id,class:`row`,onClick:t=>H(i).run(`ide.docker.open`,{containerId:e.id})},[K(`span`,{class:O([`dot`,{running:e.state===`running`,failed:e.health===`unhealthy`||e.state===`exited`&&e.exitCode!==0}])},`●`,2),K(`span`,LZ,j(e.service||e.name),1),K(`span`,RZ,j(e.health||e.state)+j(e.state===`exited`?` · ${e.exitCode}`:``),1)],8,IZ))),128))]),_:1}))}}),[[`__scopeId`,`data-v-eaeded87`]]),BZ=[`value`,`disabled`],VZ={key:0,class:`muted`},HZ=G(M({__name:`DockerSettings`,setup(e){let t=X(),n=X(!1),i=X(`default`),o=X(!1),s=X(``),c=E(`docker:settings`,()=>({surface:`dockerSettings`,busy:o.value}));async function l(){let e=await mZ();return t.value=e,n.value=e.enabled,i.value=e.context,e}return c.scope.registerCommand({id:`ide.docker.settings.status`,title:`Проверить подключение Docker`,description:`Возвращает настройки, локальные contexts, доступность daemon и Compose.`,run:l}),c.scope.registerCommand({id:`ide.docker.settings.save`,title:`Сохранить интеграцию Docker`,description:`Сохраняет enabled и context на диске; Docker и контейнеры не запускает.`,arguments:{enabled:`boolean`,context:`Локальный Docker context`},enabled:()=>!o.value,run:async e=>{let t=b(e);o.value=!0,s.value=``;try{return await mZ(`/settings`,void 0,`PUT`,{enabled:t.enabled??n.value,context:t.context??i.value}),await l()}catch(e){throw s.value=e instanceof Error?e.message:`Ошибка Docker`,e}finally{o.value=!1}}}),c.scope.registerCommand({id:`ide.docker.settings.daemonStart`,title:`Запустить Docker daemon`,description:`Если daemon не запущен, поднимает его способом, принятым в этой ОС, и ждёт ответа до 90 секунд. Может запросить пароль администратора.`,enabled:()=>!o.value&&!!t.value?.enabled&&!!t.value.daemon?.start.auto,run:async()=>{o.value=!0,s.value=``;try{return await mZ(`/daemon/start`,void 0,`POST`,{context:i.value}),await l()}catch(e){throw s.value=e instanceof Error?e.message:`Ошибка Docker`,e}finally{o.value=!1}}}),Lt(()=>void l().catch(e=>{s.value=e.message})),(e,l)=>(V(),q(`section`,{class:`docker-settings`,onPointerdown:l[5]||=e=>H(c).scope.activate()},[I(r,{as:`header`,gap:3,justify:`between`,wrap:``},{default:F(()=>[I(_,{as:`h3`,size:`sm`},{default:F(()=>[...l[6]||=[N(`Подключение`,-1)]]),_:1}),K(`span`,null,j(t.value?.connected?`подключён · ${t.value.version}`:`не подключён`),1)]),_:1}),I(ml,{as:`form`,flow:`flex`,onSubmit:l[3]||=Z(e=>H(c).run(`ide.docker.settings.save`),[`prevent`])},{default:F(()=>[I(r,{as:`label`,justify:`normal`},{default:F(()=>[I(a,{modelValue:n.value,"onUpdate:modelValue":l[0]||=e=>n.value=e,type:`checkbox`,disabled:o.value},null,8,[`modelValue`,`disabled`]),l[7]||=N(` включить интеграцию`,-1)]),_:1}),I(r,{as:`label`,justify:`normal`},{default:F(()=>[l[8]||=N(`Окружение `,-1),I(a,{as:`select`,appearance:`filled`,modelValue:i.value,"onUpdate:modelValue":l[1]||=e=>i.value=e,disabled:o.value},{default:F(()=>[(V(!0),q(W,null,J(t.value?.contexts,e=>(V(),q(`option`,{key:e.name,value:e.name,disabled:!e.local},j(e.name)+` · `+j(e.endpoint),9,BZ))),128))]),_:1},8,[`modelValue`,`disabled`])]),_:1}),I(r,{class:`actions`,gap:3,wrap:``},{default:F(()=>[I(Q,{type:`submit`,disabled:o.value||n.value&&!t.value?.contexts.some(e=>e.name===i.value&&e.local)},{default:F(()=>[...l[9]||=[N(`Сохранить`,-1)]]),_:1},8,[`disabled`]),I(Q,{disabled:o.value,onClick:l[2]||=e=>H(c).run(`ide.docker.settings.status`)},{default:F(()=>[...l[10]||=[N(`Проверить подключение`,-1)]]),_:1},8,[`disabled`])]),_:1})]),_:1}),t.value?.composeVersion?(V(),q(`p`,VZ,`Compose `+j(t.value.composeVersion),1)):B(``,!0),s.value||t.value?.error?(V(),Y(SZ,{key:1,message:s.value||t.value?.error||``,daemon:t.value?.daemon,starting:o.value,onStart:l[4]||=e=>H(c).run(`ide.docker.settings.daemonStart`)},null,8,[`message`,`daemon`,`starting`])):B(``,!0)],32))}}),[[`__scopeId`,`data-v-4f0bebc5`]]),UZ={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function WZ(e,t){return V(),q(`svg`,UZ,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`m2 16l4.039-9.69a.5.5 0 0 1 .923 0L11 16m11-7v7M3.304 13h6.392`}),K(`circle`,{cx:`18.5`,cy:`12.5`,r:`3.5`})],-1)]])}var GZ=U({name:`lucide-case-sensitive`,render:WZ}),KZ={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function qZ(e,t){return V(),q(`svg`,KZ,[...t[0]||=[ge(`<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="7" cy="12" r="3"></circle><path d="M10 9v6"></path><circle cx="17" cy="12" r="3"></circle><path d="M14 7v8m8 2v1c0 .5-.5 1-1 1H3c-.5 0-1-.5-1-1v-1"></path></g>`,1)]])}var JZ=U({name:`lucide-whole-word`,render:qZ}),YZ={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function XZ(e,t){return V(),q(`svg`,YZ,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17 3v10m-4.33-7.5l8.66 5m-8.66 0l8.66-5M9 17a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2z`},null,-1)]])}var ZZ=U({name:`lucide-regex`,render:XZ}),QZ={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function $Z(e,t){return V(),q(`svg`,QZ,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`}),K(`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`})],-1)]])}var eQ=U({name:`lucide-file`,render:$Z}),tQ=[`aria-expanded`,`title`,`onClick`],nQ={class:`result-file u-truncate`},rQ={key:2,class:`result-dir u-truncate`},iQ={class:`result-count`},aQ=[`title`,`onClick`],oQ={class:`result-line`},sQ={class:`snippet u-truncate`},cQ={key:0},lQ=G(M({__name:`SearchPanel`,props:{projectId:{},scope:{}},emits:[`open`],setup(e,{expose:n,emit:i}){let o=e,s=i,c=X(``),l=X(!1),u=X(!1),d=X(!1),f=X([]),p=X(``),m=X(!1),h=X(!1),g=X(!1),_=X(new Set),v=0,y,b;async function x(){let e=++v;if(b?.abort(),h.value=!1,f.value=[],p.value=``,g.value=!1,!c.value.trim())m.value=!1;else{m.value=!0,b=new AbortController;try{let t=await ar(o.projectId,c.value,{caseSensitive:l.value,wholeWord:u.value,regex:d.value},b.signal,o.scope);if(e!==v)return;f.value=t.hits,g.value=t.truncated,h.value=!0}catch(t){e===v&&!b.signal.aborted&&(p.value=t instanceof Error?t.message:`Ошибка поиска`)}finally{e===v&&(m.value=!1)}}}R(c,()=>{clearTimeout(y),++v,b?.abort(),f.value=[],_.value=new Set,h.value=!1,m.value=!!c.value.trim(),y=setTimeout(()=>void x(),300)}),R([l,u,d],()=>{clearTimeout(y),c.value.trim()&&x()});let S=z(()=>{let e=new Map;for(let t of f.value){let n=e.get(t.path)??[];n.push(t),e.set(t.path,n)}return[...e.entries()].map(([e,t])=>{let n=e.split(`/`);return{path:e,name:n.at(-1)??e,directory:n.slice(0,-1).join(`/`),hits:t}})});function C(e){let t=new Set(_.value);t.has(e)?t.delete(e):t.add(e),_.value=t}function w(e){let t=[],n=0;for(let r of e.matches??[]){let i=Math.max(r.start,n);if(i>=e.text.length)break;i>n&&t.push({text:e.text.slice(n,i),match:!1}),t.push({text:e.text.slice(i,r.end),match:!0}),n=Math.max(n,r.end)}return n<e.text.length&&t.push({text:e.text.slice(n),match:!1}),t}function T(){c.value.trim()&&x()}function ee(){++v,b?.abort(),clearTimeout(y)}function E(){ee(),c.value=``,f.value=[],_.value=new Set}return R(()=>o.projectId,E),lt(ee),n({search:x,refresh:T}),(e,n)=>(V(),Y(Lu,{class:`side-content search-panel`},{default:F(()=>[K(`form`,{class:`search-form`,onSubmit:Z(x,[`prevent`])},[I(r,{class:`search-box`,gap:.5,justify:`normal`},{default:F(()=>[I(a,{grow:``,modelValue:c.value,"onUpdate:modelValue":n[0]||=e=>c.value=e,type:`search`,name:`workspace-search`,placeholder:`Найти в проекте…`,"aria-label":`Поиск по содержимому`,maxlength:`200`},null,8,[`modelValue`]),I(r,{gap:.5,align:`normal`,justify:`normal`,class:`search-options`,role:`group`,"aria-label":`Параметры поиска`},{default:F(()=>[I(Q,{shape:`icon`,size:`sm`,active:l.value,"aria-pressed":l.value,title:`Учитывать регистр`,"aria-label":`Учитывать регистр`,onClick:n[1]||=e=>l.value=!l.value},{default:F(()=>[I(H(GZ),{"aria-hidden":`true`})]),_:1},8,[`active`,`aria-pressed`]),I(Q,{shape:`icon`,size:`sm`,active:u.value,"aria-pressed":u.value,title:`Только слово целиком`,"aria-label":`Только слово целиком`,onClick:n[2]||=e=>u.value=!u.value},{default:F(()=>[I(H(JZ),{"aria-hidden":`true`})]),_:1},8,[`active`,`aria-pressed`]),I(Q,{shape:`icon`,size:`sm`,active:d.value,"aria-pressed":d.value,title:`Использовать регулярное выражение`,"aria-label":`Использовать регулярное выражение`,onClick:n[3]||=e=>d.value=!d.value},{default:F(()=>[I(H(ZZ),{"aria-hidden":`true`})]),_:1},8,[`active`,`aria-pressed`])]),_:1})]),_:1})],32),m.value?(V(),Y(t,{key:0,class:`notice`,tone:`muted`,size:`xs`,role:`status`},{default:F(()=>[...n[4]||=[N(`поиск…`,-1)]]),_:1})):B(``,!0),p.value?(V(),Y(t,{key:1,class:`notice`,tone:`danger`,size:`xs`,role:`alert`},{default:F(()=>[N(j(p.value),1)]),_:1})):B(``,!0),h.value?(V(),Y(t,{key:2,class:`notice`,tone:`muted`,size:`xs`},{default:F(()=>[N(j(f.value.length?`${f.value.length} совпадений в ${S.value.length} файлах${g.value?` · показаны первые 200`:``}`:`Совпадений нет`),1)]),_:1})):B(``,!0),(V(!0),q(W,null,J(S.value,e=>(V(),q(`div`,{key:e.path,class:`result-group`},[K(`button`,{class:`result-group-header`,type:`button`,"aria-expanded":!_.value.has(e.path),title:e.path,onClick:t=>C(e.path)},[_.value.has(e.path)?(V(),Y(H(of),{key:1,"aria-hidden":`true`})):(V(),Y(H(fl),{key:0,"aria-hidden":`true`})),I(H(eQ),{class:`result-file-icon`,"aria-hidden":`true`}),K(`span`,nQ,j(e.name),1),e.directory?(V(),q(`span`,rQ,j(e.directory),1)):B(``,!0),K(`span`,iQ,j(e.hits.length),1)],8,tQ),_.value.has(e.path)?B(``,!0):(V(!0),q(W,{key:0},J(e.hits,e=>(V(),q(`button`,{key:`${e.path}:${e.line}:${e.column}`,class:`result`,title:`${e.path}:${e.line}`,onClick:t=>s(`open`,e.path,e.line,e.column)},[K(`span`,oQ,j(e.line),1),K(`span`,sQ,[(V(!0),q(W,null,J(w(e),(e,t)=>(V(),q(W,{key:t},[e.match?(V(),q(`mark`,cQ,j(e.text),1)):(V(),q(W,{key:1},[N(j(e.text),1)],64))],64))),128))])],8,aQ))),128))]))),128))]),_:1}))}}),[[`__scopeId`,`data-v-010aeb30`]]);function uQ(e,t,n,r=()=>!0){let i=e(),a=!1;function o(){if(a&&r()){a=!1;try{let e=JSON.stringify(t());sessionStorage.getItem(i)!==e&&sessionStorage.setItem(i,e)}catch{}}}let s=Gl(o,600,{maxWait:2500});R(e,e=>{o(),a=!1,i=e},{flush:`sync`}),R(()=>[t(),r()],()=>{r()&&(a=!0,s())},{flush:`sync`}),Ql(window,`pagehide`,o),Ql(window,`beforeunload`,o),Ql(document,`visibilitychange`,()=>{document.visibilityState===`hidden`&&o()}),zt(o);function c(){try{let e=sessionStorage.getItem(i);if(e===null)return;let t=n.safeParse(JSON.parse(e));return t.success?t.data:void 0}catch{return}}return{read:c,flush:o}}var dQ=new Map,fQ=new Map;function pQ(e){clearTimeout(fQ.get(e)),fQ.set(e,setTimeout(()=>{fQ.delete(e),or(e,{directories:[...dQ.get(e)?.keys()??[]]})},150))}function mQ(e,t){let n=dQ.get(e)??new Map;return n.set(t,(n.get(t)??0)+1),dQ.set(e,n),pQ(e),()=>{let r=(n.get(t)??1)-1;r>0?n.set(t,r):n.delete(t),n.size||dQ.delete(e),pQ(e)}}var hQ=!1,gQ=5e3;function _Q(e,t){let n,r,i=0;function a(n){n===e.path&&t()}function o(){Date.now()-i<gQ||(i=Date.now(),t())}function s(){pQ(e.projectId),t()}function c(e){hQ||(hQ=!0,Gr(null,e,`error`,1e4))}Lt(()=>{(!e.scope||pr(e.scope))&&(nr(e.projectId)&&(n=mQ(e.projectId,e.path),r=Un(e.projectId,{directory:a,reconnect:s,error:c})),window.addEventListener(`focus`,o))}),lt(()=>{n?.(),r?.(),window.removeEventListener(`focus`,o)})}function vQ(){return{revealPath:X(``),directories:new Map}}var yQ=Symbol(`tree-paging`);function bQ(e,t,n){let r=X([]),i=X(0),a=X(null),o=X(!1),s=X(``),c=0,l,u=``;function d(){let n=t.revealPath.value,r=e.path?`${e.path}/`:``;if(!n||!n.startsWith(r))return``;let i=n.slice(r.length).split(`/`)[0];return i?r+i:``}async function f(t=!1){if(t&&(o.value||a.value===null))return;let f=++c;l?.abort(),l=new AbortController,o.value=!0,s.value=``;let p=`${e.projectId}\0${Lr(e.scope)}\0${e.path}`;u!==p&&(r.value=[],i.value=0,a.value=null,u=p);let m=r.value,h=t?a.value:0,g=t?30:Math.max(30,m.length),_=t?``:d()||m.at(-1)?.path||``;try{let o=await $n(e.projectId,e.scope,`tree`,{path:e.path,offset:String(h),limit:String(Math.min(g,1e3)),..._?{reveal:_}:{}},l.signal);if(f!==c)return;let s=t?[...m,...o.entries]:o.entries;if(r.value=[...new Map(s.map(e=>[e.path,e])).values()],i.value=o.total??r.value.length,a.value=o.nextOffset??null,!t){let e=new Set(r.value.map(e=>e.path));for(let t of m)e.has(t.path)||n(t.path)}return t?o.entries[0]?.path:void 0}catch(e){f===c&&(s.value=e instanceof Error?e.message:`Ошибка`)}finally{f===c&&(o.value=!1)}}let p={more:()=>f(!0),available:()=>!o.value&&a.value!==null};return R(()=>e.path,(e,n)=>{n!==void 0&&t.directories.get(n)===p&&t.directories.delete(n),t.directories.set(e,p)},{immediate:!0}),R(()=>[e.projectId,Lr(e.scope),e.path,e.revision,d()],()=>void f(),{immediate:!0}),_Q(e,()=>void f()),lt(()=>{++c,l?.abort(),t.directories.get(e.path)===p&&t.directories.delete(e.path)}),{entries:r,total:i,nextOffset:a,loading:o,error:s}}function xQ(e,t,n,r,i){let a=e=>{let t=b(e).path;if(t!==void 0&&typeof t!=`string`)throw Error(`path должен быть строкой`);return t??i()};e.registerCommand({id:`ide.fileTree.directory.loadMore`,title:`Показать следующую порцию файлов`,description:`Загружает следующие 30 дочерних элементов раскрытой папки дерева. Пустой path означает корень проекта.`,arguments:{path:`string (необязательно): путь раскрытой папки относительно проекта`},enabled:e=>!r.value&&!!t.directories.get(a(e))?.available(),run:async e=>{let r=await t.directories.get(a(e))?.more();if(!r)return;await Ut();let i=n.value?.querySelector(`button[data-path="${CSS.escape(r)}"]`);i?.focus(),i?.scrollIntoView({block:`nearest`})}})}var SQ=WK(cK());function CQ({entry:e,expanded:t,item:n,allowed:r}){let i=[];return e&&!e.directory&&i.push(n(`file.open`)),i.push(n(`entry.reveal`)),(!e||e.directory)&&i.push(n(`file.create`),n(`directory.create`)),e&&i.push(n(`${e.directory?`directory`:`file`}.rename`,{separator:!0}),n(`entry.cut`),n(`entry.copy`),n(`entry.duplicate`)),i.push(n(`entry.paste`),n(`entry.copyRelativePath`,{separator:!0}),n(`entry.copyPath`)),e?.directory&&i.push(n(`directory.toggle`,{label:t.has(e.path)?`Свернуть папку`:`Развернуть папку`})),e||i.push(n(`collapseAll`)),i.push(n(`refresh`)),e&&i.push(n(`entry.delete`,{danger:!0,separator:!0})),i.filter(e=>r(e.id))}function wQ(e,t,n,r){let i=tr(t.projectId),a=()=>i.reveal&&pr(t.scope)&&!n.busy.value;async function o(e){try{return await mr(t.projectId,r(e)?.path??``)}catch(e){throw n.error.value=e instanceof Error?e.message:`Не удалось показать в проводнике`,e}}return e.registerCommand({id:`ide.fileTree.entry.reveal`,title:`Показать в проводнике`,description:`Открывает файл или папку выделенными в системном файловом менеджере. Доступно только для локального проекта на компьютере с сервером Projector.`,arguments:{path:`Путь записи внутри проекта; пустая строка — корень проекта; без аргумента — запись из контекстного меню`},run:o,enabled:a}),a}function TQ(e,t,n,r,i={}){let a=i.ctrlKey||i.metaKey,o=r.indexOf(t),s=r.indexOf(n);if(i.shiftKey&&o>=0&&s>=0){let n=a?new Set(e):new Set;for(let e of r.slice(Math.min(o,s),Math.max(o,s)+1))n.add(e);return{paths:n,anchor:t}}let c=a?new Set(e):new Set;return a&&c.has(n)?c.delete(n):c.add(n),{paths:c,anchor:n}}function EQ(e){let t=[...e];return t.filter(e=>!t.some(t=>e.startsWith(t+`/`)))}function DQ(){let e=X(new Set),t=X(``),n=X([]);function r(n=``){e.value=new Set(n?[n]:[]),t.value=n}function i(n,r){let i=e=>e===n||e.startsWith(n+`/`)?r===void 0?``:r+e.slice(n.length):e;e.value=new Set([...e.value].map(i).filter(Boolean)),t.value=i(t.value)}return{paths:e,anchor:t,dragged:n,replace:r,relocate:i}}var OQ=Symbol(`tree-selection`);function kQ({props:e,emit:t,selection:n,drag:r,tree:i,menu:a,dialog:o,toggle:s,paging:c}){let{busy:l,expanded:u,error:d,message:f}=r,p=X(),m=X(),h=X(),g=E(`fileTree:${P()}`,()=>({surface:`fileTree`,projectId:e.projectId,scope:Lr(e.scope),entryKind:p.value?p.value.directory?`directory`:`file`:`root`,busy:r.busy.value,clipboard:!!m.value}));function _(e){let t=b(e);if(t.path===void 0)return p.value;if(typeof t.path!=`string`)throw Error(`path должен быть строкой`);if(t.path)return{path:t.path,name:t.path.split(`/`).at(-1),directory:t.kind===`directory`}}function v(e){if(b(e).path!==void 0){let t=_(e);return t?[t.path]:[]}return EQ(n.paths.value)}async function y(t,n=``,r){let i=b(r),a=_(r);if(i.directory!==void 0&&typeof i.directory!=`string`)throw Error(`directory должен быть строкой`);let s=typeof i.directory==`string`?i.directory:a?.directory?a.path:Cs(a?.path??``),c={action:t,path:a?.path??``,directory:s,projectId:e.projectId,paths:t===`delete`?v(r):void 0};if(i.name!==void 0&&typeof i.name!=`string`)throw Error(`name должен быть строкой`);if(i.confirm!==void 0&&typeof i.confirm!=`boolean`)throw Error(`confirm должен быть boolean`);if(t!==`delete`&&typeof i.name==`string`||t===`delete`&&i.confirm===!0)return x(typeof i.name==`string`?i.name:``,c,!1);h.value=c;let l={"create-file":`Новый файл`,"create-directory":`Новая папка`,rename:`Переименовать`,copy:`Дублировать`,delete:`Удалить запись?`};Ut(()=>o.value?.open({title:l[t],value:n,confirm:t===`delete`,description:t===`delete`?`${c.paths?.join(`, `)}. Записи будут перемещены в .projector-trash в корне проекта.`:void 0}))}async function x(r,i=h.value,a=!0){if(i){l.value=!0,d.value=``,f.value=``;try{let s=i.paths??[i.path];if([`rename`,`delete`].includes(i.action)&&e.beforeChange){for(let t of s)if(!await e.beforeChange(t))throw Error(`Сначала сохраните изменения открытых файлов`)}let c={};for(let a of s){if(c=await br(i.projectId,i.action,a,i.action===`copy`?Cs(a):i.directory,r),i.projectId!==e.projectId)return;i.action===`delete`&&(n.relocate(a),u.value=new Set([...u.value].filter(e=>e!==a&&!e.startsWith(a+`/`))),m.value&&(m.value.paths=m.value.paths.filter(e=>e!==a&&!e.startsWith(a+`/`)),m.value.paths.length||(m.value=void 0)),i.paths&&=i.paths.filter(e=>e!==a),t(`deleted`,a))}return a&&o.value?.close(),i.projectId===e.projectId?(i.action===`rename`?(u.value=new Set([...u.value].map(e=>Ts(e,i.path,c.destination))),n.relocate(i.path,c.destination),m.value&&(m.value.paths=m.value.paths.map(e=>Ts(e,i.path,c.destination))),t(`moved`,i.path,c.destination)):i.action!==`delete`&&(i.directory&&u.value.add(i.directory),t(`changed`),i.action===`create-file`&&t(`open`,c.destination,!0)),f.value=`Готово`,c):void 0}catch(e){if(!a)throw e;o.value?.fail(e instanceof Error?e.message:`Не удалось выполнить действие`)}finally{l.value=!1}}}async function S(r){let i=b(r);if(i.directory!==void 0&&typeof i.directory!=`string`)throw Error(`directory должен быть строкой`);let a=m.value;if(!a)return;let o=typeof i.directory==`string`?i.directory:p.value?.directory?p.value.path:Cs(p.value?.path??``);l.value=!0,d.value=``;let s=e.projectId;try{if(a.cut&&e.beforeChange){for(let t of a.paths)if(!await e.beforeChange(t))throw Error(`Сначала сохраните изменения открытых файлов`)}let r;for(let i of[...a.paths]){if(r=a.cut?await Ar(s,i,o):await br(s,`copy`,i,o,i.split(`/`).at(-1)),s!==e.projectId)return;o&&u.value.add(o),a.cut?(u.value=new Set([...u.value].map(e=>Ts(e,i,r.destination))),n.relocate(i,r.destination),a.paths=a.paths.filter(e=>e!==i),a.paths.length||(m.value=void 0),t(`moved`,i,r.destination)):t(`changed`)}return f.value=`Готово`,r}catch(e){throw d.value=e instanceof Error?e.message:`Не удалось вставить`,e}finally{l.value=!1}}async function C(t,n){try{let r=v(n);if(r.length||r.push(``),t)await navigator.clipboard.writeText(r.map(e=>e||`.`).join(`
|
|
159
|
+
`));else{let t=await Vn(e.projectId,`root`);await navigator.clipboard.writeText(r.map(e=>t.root+(e?`/`+e:``)).join(`
|
|
160
|
+
`))}}catch(e){throw d.value=`Не удалось скопировать путь в буфер обмена`,e}}let w=tr(e.projectId),T=()=>w.write&&pr(e.scope),ee=new Map,te=(e,t,n,i=()=>!0,a)=>(a&&ee.set(`ide.fileTree.${e}`,a),g.scope.registerCommand({id:`ide.fileTree.${e}`,title:t,run:n,enabled:e=>(!a||(a===`write`?T():w[a]))&&!r.busy.value&&i(e)})),D=(e,t,n,r)=>te(e,t,n,r,`write`),ne=e=>!!_(e)&&v(e).length>0,re=e=>ne(e)&&v(e).length===1&&(b(e).path!==void 0||n.paths.value.size<=1);te(`file.open`,`Открыть`,e=>t(`open`,_(e).path,b(e).pinned===!0),e=>!!_(e)&&!_(e).directory);let ie=wQ(g.scope,e,r,_);D(`file.create`,`Новый файл…`,e=>y(`create-file`,``,e)),D(`directory.create`,`Новая папка…`,e=>y(`create-directory`,``,e));for(let e of[`file`,`directory`])D(`${e}.rename`,`Переименовать…`,e=>y(`rename`,_(e).name,e),re);return D(`entry.cut`,`Вырезать`,e=>{m.value={paths:v(e),cut:!0}},ne),D(`entry.copy`,`Копировать`,e=>{m.value={paths:v(e),cut:!1}},ne),D(`entry.duplicate`,`Дублировать…`,e=>y(`copy`,_(e).name.replace(/(\.[^.]*)?$/,` copy$1`),e),re),D(`entry.paste`,`Вставить`,S,()=>!!m.value),te(`entry.copyRelativePath`,`Копировать относительный путь`,e=>C(!0,e)),te(`entry.copyPath`,`Копировать полный путь`,e=>C(!1,e)),te(`directory.toggle`,`Развернуть / свернуть папку`,e=>s(_(e).path),e=>!!_(e)?.directory),te(`collapseAll`,`Свернуть все папки`,()=>u.value.clear()),xQ(g.scope,c,i,r.busy,()=>p.value?.directory?p.value.path:e.path),te(`refresh`,`Обновить`,()=>t(`changed`)),D(`entry.delete`,`Удалить…`,e=>y(`delete`,``,e),ne),te(`contextMenu`,`Открыть меню`,()=>{let e=i.value?.querySelector(p.value?`button[data-path="${CSS.escape(p.value.path)}"]`:`.root-label`);if(e)return a.value?.openForElement(e)}),{contextEntry:p,clipboard:m,treeCommands:g,menuItems:z(()=>CQ({entry:p.value,expanded:u.value,item:(e,t)=>g.item(`ide.fileTree.${e}`,void 0,t),allowed:e=>{if(e===`entry.reveal`)return ie();let t=ee.get(e);return!t||(t===`write`?T():w[t])}})),runOperation:x}}function AQ({tree:e,selection:t,expanded:n,busy:r,contextEntry:i,treeCommands:a,toggle:o}){function s(){return[...e.value?.querySelectorAll(`button[data-path]`)??[]]}function c(e,n){let r=TQ(t.paths.value,t.anchor.value,n.path,s().map(e=>e.dataset.path),e);t.paths.value=r.paths,t.anchor.value=r.anchor}function l(l,u){if(i.value=u,a.scope.activate(),r.value){l.preventDefault();return}let d=l.ctrlKey||l.metaKey;if(d&&ee(l)===`a`){l.preventDefault();let e=s();t.paths.value=new Set(e.map(e=>e.dataset.path)),t.anchor.value||(t.anchor.value=u?.path??e[0]?.dataset.path??``);return}if(l.key===`Escape`){l.preventDefault(),t.replace();return}let f=l.target instanceof Element&&!!l.target.closest(`button[data-tree-more]`);if((u||f)&&[`ArrowUp`,`ArrowDown`,`Home`,`End`,`ArrowLeft`,`ArrowRight`,` `].includes(l.key)){if(l.preventDefault(),l.key===` `){u?c(l,u):l.target.click();return}let t=[...e.value?.querySelectorAll(`button[data-path],button[data-tree-more]`)??[]],r=t.findIndex(e=>u?e.dataset.path===u.path:e===l.target),i=r;if(l.key===`ArrowDown`&&(i=Math.min(t.length-1,r+1)),l.key===`ArrowUp`&&(i=Math.max(0,r-1)),l.key===`Home`&&(i=0),l.key===`End`&&(i=t.length-1),l.key===`ArrowRight`){if(!u?.directory)return;if(!n.value.has(u.path)){o(u.path);return}t[r+1]?.dataset.path?.startsWith(u.path+`/`)&&(i=r+1)}if(l.key===`ArrowLeft`){if(u?.directory&&n.value.has(u.path)){o(u.path);return}let e=u?Cs(u.path):l.target.dataset.treeMore;i=t.findIndex(t=>t.dataset.path===e)}let s=t[i];s&&(s.dataset.path!==void 0&&(!d||l.shiftKey)&&c(l,{path:s.dataset.path,name:``,directory:s.getAttribute(`aria-expanded`)!==null}),s.focus(),s.scrollIntoView({block:`nearest`}),s!==l.target&&s.dataset.path&&s.getAttribute(`aria-expanded`)===null&&a.run(`ide.fileTree.file.open`,{path:s.dataset.path}))}else a.keydown(l)}return{visibleRows:s,selectEntry:c,entryKey:l}}function jQ(){let e=X(``),t=X(),n=X(!1),r=X(``),i=X(``),a=X(new Set),o=X(``),s=X(),c;function l(e,n=!1){t.value!==e&&(clearTimeout(c),t.value=e,n&&e!==void 0&&(c=setTimeout(()=>a.value.add(e),650)))}function u(){o.value=``,l(),clearTimeout(c),e.value=``}return{source:e,target:t,busy:n,error:r,message:i,expanded:a,hint:o,progress:s,hover:l,clear:u}}var MQ=Symbol(`tree-drag`),NQ=`application/x-projector-tree-entry`;function PQ(e){for(let t=e;t;t=t.parentElement){let e=getComputedStyle(t).overflowY;if((e===`auto`||e===`scroll`)&&t.scrollHeight>t.clientHeight)return t}}var FQ=36;function IQ(e){let t=PQ(e.currentTarget);if(!t)return;let n=t.getBoundingClientRect(),r=FQ-(e.clientY-n.top),i=FQ-(n.bottom-e.clientY);r>0?t.scrollTop-=Math.ceil(r/3):i>0&&(t.scrollTop+=Math.ceil(i/3))}function LQ({props:e,emit:t,selection:n,drag:r},i){let{source:a,busy:o,expanded:s,error:c,message:l}=r,u=()=>tr(e.projectId).write&&pr(e.scope);function d(t,r){o.value||!u()||!t.dataTransfer?t.preventDefault():(n.paths.value.has(r.path)||n.replace(r.path),n.dragged.value=EQ(n.paths.value),a.value=r.path,t.dataTransfer.effectAllowed=u()?`copyMove`:`copy`,t.dataTransfer.setData(NQ,JSON.stringify({projectId:e.projectId,path:r.path,paths:n.dragged.value})))}function f(t){return t?t.directory?t.path:Cs(t.path):e.path}function p(e,t,n,i=!0){IQ(e);let a=f(t);r.hint.value=i?`${n} в «${a||`корень проекта`}»`:``,r.hover(i?a:void 0,i&&!!t?.directory)}function m(e,t){if(!u())return;if(!a.value&&!o.value&&i.accepts(e.dataTransfer)){e.preventDefault(),e.dataTransfer.dropEffect=`copy`,p(e,t,`Копировать`);return}if(!a.value||o.value||!e.dataTransfer?.types.includes(`application/x-projector-tree-entry`))return;e.preventDefault();let r=f(t),s=n.dragged.value.every(e=>!!ws(e,r));e.dataTransfer.dropEffect=s?`move`:`none`,p(e,t,`Перенести`,s)}function h(e){e.currentTarget.contains(e.relatedTarget)||(r.hint.value=``,r.hover())}async function g(d,p){if(!u()){r.clear();return}if(!a.value&&!o.value&&i.accepts(d.dataTransfer)){d.preventDefault();let e=f(p),t=XA(d.dataTransfer);r.clear(),await i.importInto(e,t,`ask`);return}if(!a.value||o.value||!d.dataTransfer?.types.includes(`application/x-projector-tree-entry`))return;d.preventDefault();let m=f(p),h=[...n.dragged.value];if(!h.length||h.some(e=>!ws(e,m))){r.clear();return}let g=e.projectId;c.value=``,l.value=``,o.value=!0,r.clear();try{if(e.beforeChange){for(let t of h)if(!await e.beforeChange(t))throw Error(`Сначала сохраните изменения открытых файлов`)}for(let r of h){let i=await Ar(g,r,m);if(g!==e.projectId)return;s.value=new Set([...s.value].map(e=>Ts(e,i.source,i.destination))),n.relocate(i.source,i.destination),m&&s.value.add(m),t(`moved`,i.source,i.destination)}l.value=`Перенесено записей: ${h.length}`}catch(t){g===e.projectId&&(c.value=t instanceof Error?t.message:`Не удалось перенести запись`)}finally{o.value=!1}}return{startDrag:d,dragOver:m,dragLeave:h,drop:g}}var RQ=[`ask`,`fail`,`replace`,`keep`,`prefix`],zQ=e=>`«${e||`корень проекта`}»`;function BQ(e){let t=e%10,n=e%100>=11&&e%100<=14;return`${e} ${!n&&t===1?`запись`:!n&&t>=2&&t<=4?`записи`:`записей`}`}function VQ({props:e,emit:t,drag:n},r){let{busy:i,expanded:a,error:o,message:s}=n,c=()=>tr(e.projectId).write&&pr(e.scope);function l(t){let n=tr(e.projectId);return c()&&n.externalFiles&&GA(t)&&!t?.types.includes(`application/x-projector-tree-entry`)}async function u(e,t,n,r,i){let a=n.map(({name:e})=>i+e),o=a.find(e=>r.includes(e));if(o)return`«${o}» совпадёт с другим файлом из этого набора — смените префикс`;let{conflicts:s}=await hr(e,t,a);return s.length?`${s.length===1?`«${s[0].name}» тоже занято`:`Заняты ${s.map(e=>`«${e.name}»`).join(`, `)}`} — смените префикс`:``}async function d(e,t,n,i){let a=[...new Set(n)],{conflicts:o}=await hr(e,t,a),s=new Map;if(!o.length)return{rename:s,clear:[]};let c;if(i===`ask`){if(!r.dialog.value)throw Error(`Диалог конфликтов недоступен`);c=await r.dialog.value.ask({directory:t,conflicts:o,validatePrefix:n=>u(e,t,o,a,n)})}else if(i===`fail`)throw Error(`В папке ${zQ(t)} уже есть: ${o.map(({name:e})=>e).join(`, `)}`);else c=i===`replace`||i===`keep`?{kind:i}:{kind:`prefix`,prefix:i.prefix};if(!c)return;if(c.kind===`replace`)return{rename:s,clear:o.map(({name:e})=>e)};if(c.kind===`keep`){for(let{name:e,free:t}of o)s.set(e,t);return{rename:s,clear:[]}}let l=await u(e,t,o,a,c.prefix);if(l)throw Error(l);for(let{name:e}of o)s.set(e,c.prefix+e);return{rename:s,clear:[]}}async function f(t,r,i,a){let o=i.kind===`files`?await i.entries:[];if(i.kind===`files`){if(!o.length)throw Error(`Не удалось прочитать перетащенные файлы`);if(!Wn(t))throw Error(`Этот проект не принимает загрузку файлов`)}let s=i.kind===`paths`?i.paths.map(QA):o.map(e=>ZA(e.path));if(s.some(e=>!e))throw Error(`Не удалось определить имя файла`);let c=await d(t,r,s,a);if(!c)return;let l=e=>c.rename.get(e)??e,u=e=>r?`${r}/${e}`:e;for(let t of c.clear)if(e.beforeChange&&!await e.beforeChange(u(t)))throw Error(`Сначала сохраните изменения открытых файлов`);if(c.clear.length&&await Tr(t,r,c.clear),i.kind===`paths`){let e=i.paths.map(e=>({source:e,name:l(QA(e))}));return(await Rr(t,r,e)).copied}let f=new AbortController;n.progress.value={done:0,total:o.length,cancel:()=>f.abort()};try{for(let e of o){let[i,...a]=e.path.split(`/`);await Br(t,r,[l(i),...a].join(`/`),e.file,f.signal),n.progress.value={...n.progress.value,done:n.progress.value.done+1}}}catch(e){throw f.signal.aborted?Error(`Загрузка отменена: загружено ${n.progress.value.done} из ${o.length}`):e}finally{n.progress.value=void 0}return[...new Set(o.map(e=>u(l(ZA(e.path)))))]}async function p(n,c,l,u={}){let d=e.projectId;o.value=``,s.value=``,i.value=!0;try{let i=await f(d,n,c,l);return d===e.projectId?i?(n&&a.value.add(n),t(`changed`),r.reveal(i[0]),s.value=`Скопировано в ${zQ(n)}: ${BQ(i.length)}`,i):(s.value=`Импорт отменён`,i):i}catch(n){if(d===e.projectId&&(o.value=n instanceof Error?n.message:`Не удалось скопировать файлы`,t(`changed`)),u.rethrow)throw n}finally{i.value=!1}}return r.commands.scope.registerCommand({id:`ide.fileTree.entry.import`,title:`Скопировать файлы с диска в папку проекта`,description:`Копирует файлы и папки по абсолютным путям на диске в папку проекта; источник не меняется. Аргументы: paths (массив абсолютных путей), directory (папка проекта относительно корня, по умолчанию корень), conflict — что делать, если имя занято: fail (по умолчанию, ошибка без изменений), replace (старая запись уходит в .projector-trash), keep (новая получает имя «имя (2).ext»), prefix (к занятым именам добавляется prefix), ask (диалог выбора). Возвращает список созданных путей.`,arguments:{paths:`string[] — абсолютные пути файлов и папок на диске`,directory:`string — папка назначения в проекте, '' — корень`,conflict:`fail | replace | keep | prefix | ask`,prefix:`string — префикс для conflict=prefix`},enabled:()=>{let t=tr(e.projectId);return c()&&t.externalFiles&&!n.busy.value},run:async t=>{if(!pr(e.scope))throw Error(`Историческое дерево доступно только для чтения`);let n=b(t);if(!Array.isArray(n.paths)||!n.paths.length||!n.paths.every(e=>typeof e==`string`))throw Error(`paths должен быть непустым массивом строк`);if(n.directory!==void 0&&typeof n.directory!=`string`)throw Error(`directory должен быть строкой`);let r=n.conflict??`fail`;if(!RQ.includes(r))throw Error(`conflict должен быть fail, replace, keep, prefix или ask`);if(r===`prefix`&&(typeof n.prefix!=`string`||!n.prefix))throw Error(`Для conflict=prefix укажите prefix`);return{copied:await p(n.directory??``,{kind:`paths`,paths:n.paths},r===`prefix`?{prefix:n.prefix}:r,{rethrow:!0})??[]}}}),{accepts:l,importInto:p}}var HQ={key:0},UQ={key:0},WQ=G(M({__name:`ImportConflictDialog`,setup(e,{expose:n}){let r=P(),o=X(),s=X(),c=X(``),l=X([]),u=X(`copy-`),d=X(``),f=X(!1),p,m,h=null,v=z(()=>l.value.length===1),y=z(()=>l.value.slice(0,6));function b(e){return p?.(void 0),h=document.activeElement,c.value=e.directory,l.value=e.conflicts,m=e.validatePrefix,d.value=``,f.value=!1,o.value?.open(),Ut(()=>s.value?.select()),new Promise(e=>{p=e})}function x(e){let t=p;p=void 0,o.value?.close(),h?.isConnected&&h.focus(),t?.(e)}async function S(){let e=u.value.trim();if(e&&!f.value){f.value=!0;try{d.value=await m(e)}catch(e){d.value=e instanceof Error?e.message:`Не удалось проверить префикс`}f.value=!1,d.value||x({kind:`prefix`,prefix:e})}}return n({ask:b}),(e,n)=>(V(),Y(ht,{to:`body`},[I(Kr,{ref_key:`dialog`,ref:o,labelledby:H(r),onCancel:n[5]||=e=>f.value?e.preventDefault():x()},{default:F(()=>[K(`form`,{onSubmit:n[4]||=Z(e=>v.value?void 0:S(),[`prevent`])},[I(_,{id:H(r),class:`title`},{default:F(()=>[N(j(v.value?`«${l.value[0].name}» уже существует`:`Имена уже заняты`),1)]),_:1},8,[`id`]),I(i,{size:`xs`,"space-after":3,wrap:``},{default:F(()=>[N(` В папке «`+j(c.value||`корень проекта`)+`» `+j(v.value?`уже есть запись с таким именем.`:`занято записей: ${l.value.length}:`),1)]),_:1}),v.value?B(``,!0):(V(),q(`ul`,HQ,[(V(!0),q(W,null,J(y.value,e=>(V(),q(`li`,{key:e.name},j(e.name),1))),128)),l.value.length>y.value.length?(V(),q(`li`,UQ,` и ещё `+j(l.value.length-y.value.length),1)):B(``,!0)])),v.value?B(``,!0):(V(),q(W,{key:1},[I(g,{layout:`plain`,label:`Добавить префикс ко всем занятым именам`,class:`prefix`,required:``},{default:F(({control:e})=>[I(a,rn(e,{ref_key:`input`,ref:s,modelValue:u.value,"onUpdate:modelValue":n[0]||=e=>u.value=e,maxlength:`64`,disabled:f.value}),null,16,[`modelValue`,`disabled`])]),_:1}),d.value?(V(),Y(t,{key:0,class:`error`,tone:`danger`,size:`xs`,role:`alert`},{default:F(()=>[N(j(d.value),1)]),_:1})):B(``,!0)],64)),I(xd,null,{default:F(()=>[I(Q,{disabled:f.value,onClick:n[1]||=e=>x()},{default:F(()=>[...n[6]||=[N(`Отмена`,-1)]]),_:1},8,[`disabled`]),v.value?(V(),q(W,{key:0},[I(Q,{onClick:n[2]||=e=>x({kind:`keep`})},{default:F(()=>[N(` Оставить оба (`+j(l.value[0].free)+`) `,1)]),_:1}),I(Q,{tone:`danger`,onClick:n[3]||=e=>x({kind:`replace`})},{default:F(()=>[...n[7]||=[N(`Заменить`,-1)]]),_:1})],64)):(V(),Y(Q,{key:1,type:`submit`,appearance:`solid`,disabled:f.value||!u.value.trim()},{default:F(()=>[N(j(f.value?`Проверка…`:`Добавить префикс`),1)]),_:1},8,[`disabled`]))]),_:1})],32)]),_:1},8,[`labelledby`])]))}}),[[`__scopeId`,`data-v-89689767`]]),GQ=[`role`,`aria-multiselectable`,`aria-label`,`aria-busy`],KQ={key:0,class:`skeleton`,"aria-hidden":`true`},qQ={key:1,class:`notice`,role:`status`},JQ={key:2,class:`notice`,role:`status`},YQ={key:3,class:`notice`,role:`status`},XQ={class:`glyph`,"aria-hidden":`true`},ZQ={class:`name u-truncate`},QQ={key:4,role:`none`},$Q={class:`remaining`},e$={key:5,class:`drop-hint`,role:`status`},t$=G(M({__name:`FileTree`,props:{projectId:{},path:{default:``},selected:{},depth:{default:0},revision:{},scope:{default:()=>({kind:`live`})},decorations:{default:()=>new Map},beforeChange:{}},emits:[`open`,`moved`,`changed`,`deleted`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=r.depth===0?vQ():tt(yQ);r.depth===0&&ot(yQ,a);let o=r.depth===0?z(()=>r.decorations??new Map):tt(`workspace-tree-decorations`);r.depth===0&&ot(`workspace-tree-decorations`,o);let s={added:`Новые записи Git`,modified:`Есть изменения Git`,deleted:`Удалённые записи Git`,conflict:`Конфликт Git`},c=r.depth===0?jQ():tt(MQ);r.depth===0&&ot(MQ,c);let l=r.depth===0?DQ():tt(OQ);r.depth===0&&ot(OQ,l);let u=X(),d=X(),f=X(),p=r.depth===0?(e,t)=>{c.busy.value?e.preventDefault():(t&&!l.paths.value.has(t.path)&&l.replace(t.path),t||l.replace(),fe.value=t,he.scope.activate(),u.value?.open(e))}:tt(`workspace-context`);r.depth===0&&ot(`workspace-context`,p);function m(e,t){r.depth===0?S.value||(_(t),ye.selectEntry(e,t),!(e.shiftKey||e.ctrlKey||e.metaKey)&&(t.directory?he.run(`ide.fileTree.directory.toggle`):he.run(`ide.fileTree.file.open`,{pinned:e.detail>=2}))):h(e,t)}let h=r.depth?tt(`workspace-entry-click`):void 0;r.depth===0&&ot(`workspace-entry-click`,m);function g(e,t){r.depth===0?ye.entryKey(e,t):v?.(e,t)}function _(e){r.depth===0?(fe.value=e,he.scope.activate()):y?.(e)}let v=r.depth?tt(`workspace-entry-key`):void 0,y=r.depth?tt(`workspace-entry-focus`):void 0;r.depth===0&&(ot(`workspace-entry-key`,g),ot(`workspace-entry-focus`,_));let{source:b,target:x,busy:S,expanded:C,error:w,message:T,hint:ee,progress:E}=c;if(r.depth===0){let e=tr(r.projectId).persist?uQ(()=>`projector:tree:v1:${r.projectId}${pr(r.scope)?``:`:${Lr(r.scope)}`}`,()=>[...C.value],SQ):{read:()=>void 0};C.value=new Set(e.read()??[]),R(()=>[r.projectId,pr(r.scope)?`live`:Lr(r.scope)],()=>{u.value?.close(!1),d.value?.close(),me.value=void 0,l.replace(),l.dragged.value=[],c.clear(),a.revealPath.value=``,C.value=new Set(e.read()??[]),w.value=``,T.value=``}),R(()=>r.selected,e=>{e&&!l.paths.value.has(e)&&l.replace(e)},{immediate:!0}),lt(()=>c.clear())}let{entries:te,total:D,nextOffset:ne,loading:re,error:ie}=bQ(r,a,e=>l.relocate(e)),{resolver:A,error:ae}=Vq();ai(()=>r.depth===0?w.value:``),ai(()=>ie.value),ai(()=>r.depth===0?ae.value:``);let oe=z(()=>te.value.map(e=>({entry:e,decoration:o.value.get(e.path),icon:A.value.resolve(e,C.value.has(e.path))})));function se(e){C.value.has(e)?C.value.delete(e):C.value.add(e)}let M,ce;function le(e){a.revealPath.value=e,l.replace(e);let t=e.split(`/`);for(let e=1;e<t.length;e++)C.value.add(t.slice(0,e).join(`/`));M?.disconnect(),clearTimeout(ce);let n=()=>{let t=ue.value?.querySelector(`button[data-path="${CSS.escape(e)}"]`);t&&(t.scrollIntoView({block:`nearest`}),t.focus(),M?.disconnect(),clearTimeout(ce))};Ut(()=>{ue.value&&(M=new MutationObserver(n),M.observe(ue.value,{childList:!0,subtree:!0}),ce=setTimeout(()=>M?.disconnect(),5e3),n())})}let ue=X(),de={props:r,emit:i,selection:l,drag:c,tree:ue,menu:u,dialog:d,toggle:se,paging:a},{contextEntry:fe,clipboard:me,treeCommands:he,menuItems:ge,runOperation:_e}=r.depth===0?kQ(de):{};r.depth===0&&ot(`workspace-tree-commands`,he);let ve=r.depth===0?he:tt(`workspace-tree-commands`),ye=r.depth===0?AQ({tree:ue,selection:l,expanded:C,busy:S,contextEntry:fe,treeCommands:he,toggle:se}):void 0,P=r.depth===0?VQ(de,{commands:he,dialog:f,reveal:le}):tt(`workspace-tree-import`);r.depth===0&&ot(`workspace-tree-import`,P);let{startDrag:be,dragOver:xe,dragLeave:Se,drop:Ce}=LQ(de,P);return lt(()=>{M?.disconnect(),clearTimeout(ce)}),t({reveal:le}),(t,n)=>{let r=pe(`FileTree`,!0);return V(),q(W,null,[K(`ul`,{ref_key:`tree`,ref:ue,class:O([`tree`,{"tree-root":e.depth===0,"root-target":e.depth===0&&H(x)===``,"drop-zone":e.depth>0&&H(x)===e.path}]),role:e.depth===0?`tree`:`group`,"aria-multiselectable":e.depth===0||void 0,"aria-label":e.path||`Файлы проекта`,"aria-busy":H(S)||H(re),onDragover:n[11]||=Z(e=>H(xe)(e),[`stop`]),onDrop:n[12]||=Z(e=>H(Ce)(e),[`stop`]),onContextmenu:n[13]||=Z(e=>H(p)(e),[`self`]),onDragleave:n[14]||=(...e)=>H(Se)&&H(Se)(...e)},[e.depth===0&&H(re)&&!H(te).length?(V(),q(`li`,KQ,[(V(),q(W,null,J([`58%`,`72%`,`46%`,`64%`,`52%`,`68%`],e=>I(Wc,{key:e,width:e,height:`10px`},null,8,[`width`])),64))])):B(``,!0),e.depth===0&&H(S)?(V(),q(`li`,qQ,`выполняется…`)):B(``,!0),e.depth===0&&H(E)?(V(),q(`li`,JQ,[N(` Загрузка: `+j(H(E).done)+` из `+j(H(E).total)+` `,1),I(ts,{class:`cancel`,interaction:`item`,radius:`none`,gap:1.5,fill:!1,padding:`0 var(--sp-2)`,onClick:n[0]||=e=>H(E).cancel()},{default:F(()=>[...n[16]||=[N(`Отменить`,-1)]]),_:1})])):B(``,!0),e.depth===0&&H(T)?(V(),q(`li`,YQ,j(H(T)),1)):B(``,!0),(V(!0),q(W,null,J(oe.value,({entry:t,icon:a,decoration:u})=>(V(),q(`li`,{key:t.path,role:`none`},[I(ts,{interaction:`item`,radius:`none`,tone:`muted`,gap:1.5,padding:`5px 10px`,class:O({"git-changed":!!u,"git-ignored":t.ignored,selected:H(l).paths.value.has(t.path),dragging:H(l).dragged.value.includes(t.path)&&!!H(b),"drop-target":t.directory&&H(x)===t.path}),disabled:H(S)||t.disabled,draggable:!H(S)&&!t.disabled,"data-path":t.path,"data-git-status":u,style:k({paddingLeft:`${12+e.depth*14}px`}),title:u?`${t.path} · ${s[u]}`:t.path,"aria-selected":H(l).paths.value.has(t.path),role:`treeitem`,"aria-level":e.depth+1,"aria-expanded":t.directory?H(C).has(t.path):void 0,onContextmenu:Z(e=>H(p)(e,t),[`stop`]),onKeydown:Z(e=>g(e,t),[`stop`]),onFocus:e=>_(t),onClick:e=>m(e,t),onDragstart:Z(e=>H(be)(e,t),[`stop`]),onDragend:n[1]||=Z(e=>H(c).clear(),[`stop`]),onDragover:Z(e=>H(xe)(e,t),[`stop`]),onDrop:Z(e=>H(Ce)(e,t),[`stop`])},{default:F(()=>[K(`span`,XQ,[t.directory?(V(),Y(H(of),{key:0,class:O({expanded:H(C).has(t.path)})},null,8,[`class`])):B(``,!0)]),I(H(HR),{icon:a},null,8,[`icon`]),K(`span`,ZQ,j(t.name),1)]),_:2},1032,[`class`,`disabled`,`draggable`,`data-path`,`data-git-status`,`style`,`title`,`aria-selected`,`aria-level`,`aria-expanded`,`onContextmenu`,`onKeydown`,`onFocus`,`onClick`,`onDragstart`,`onDragover`,`onDrop`]),t.directory&&H(C).has(t.path)?(V(),Y(r,{key:0,"project-id":e.projectId,path:t.path,selected:e.selected,depth:e.depth+1,revision:e.revision,scope:e.scope,decorations:H(o),"before-change":e.beforeChange,onChanged:n[2]||=e=>i(`changed`),onDeleted:n[3]||=e=>i(`deleted`,e),onOpen:n[4]||=(e,t)=>i(`open`,e,t),onMoved:n[5]||=(e,t)=>i(`moved`,e,t)},null,8,[`project-id`,`path`,`selected`,`depth`,`revision`,`scope`,`decorations`,`before-change`])):B(``,!0)]))),128)),H(ne)===null?B(``,!0):(V(),q(`li`,QQ,[I(ts,{interaction:`item`,radius:`none`,tone:`muted`,gap:1.5,padding:`5px 10px`,class:`load-more`,style:k({paddingLeft:`${12+e.depth*14}px`}),disabled:H(S)||H(re),"data-tree-more":e.path,role:`treeitem`,"aria-level":e.depth+1,"aria-label":`Показать ещё ${Math.min(H(30),H(D)-H(te).length)} в ${e.path||`корне проекта`}`,onFocus:n[6]||=e=>_(),onKeydown:n[7]||=Z(e=>g(e),[`stop`]),onClick:n[8]||=t=>H(ve).run(`ide.fileTree.directory.loadMore`,{path:e.path})},{default:F(()=>[N(j(H(re)?`загрузка…`:`Показать ещё ${Math.min(H(30),H(D)-H(te).length)}`)+` `,1),K(`span`,$Q,j(H(D)-H(te).length)+` осталось`,1)]),_:1},8,[`style`,`disabled`,`data-tree-more`,`aria-level`,`aria-label`])])),e.depth===0&&H(ee)?(V(),q(`li`,e$,j(H(ee)),1)):B(``,!0),e.depth===0?(V(),q(`li`,{key:6,class:`root-space`,onClick:n[9]||=e=>H(l).replace(),onContextmenu:n[10]||=Z(e=>H(p)(e),[`stop`])},null,32)):B(``,!0)],42,GQ),e.depth===0?(V(),Y(Wd,{key:0,ref_key:`menu`,ref:u,items:H(ge),label:`Действия с файлами`},null,8,[`items`])):B(``,!0),e.depth===0?(V(),Y(hR,{key:1,ref_key:`dialog`,ref:d,onSubmit:n[15]||=e=>H(_e)(e)},null,512)):B(``,!0),e.depth===0?(V(),Y(WQ,{key:2,ref_key:`conflictDialog`,ref:f},null,512)):B(``,!0)],64)}}}),[[`__scopeId`,`data-v-9bf42633`]]),n$={class:`scope-tree`},r$={key:0,class:`tree-actions`},i$={key:1,class:`note`,role:`alert`},a$=G(M({__name:`ScopeTreeSection`,props:{projectId:{},scope:{},revision:{},selected:{},onSearch:{type:Function},onOpen:{type:Function}},setup(e,{expose:t}){let n=e,r=X(),i=X(),a=X(``),o=0;async function s(){if(n.scope.kind!==`commit`){r.value=void 0,a.value=`Этот источник пока не умеет показывать файлы`;return}let e=++o;a.value=``;try{let t=await Vn(n.projectId,`commit`,{hash:n.scope.rev});e===o&&(r.value=t)}catch(t){e===o&&(a.value=t instanceof Error?t.message:`Ошибка Git`)}}R(()=>[n.projectId,Lr(n.scope),n.revision],s,{immediate:!0});let c=z(()=>Ns(As(r.value?.files??[])));return t({reveal:e=>i.value?.reveal(e)}),(t,n)=>(V(),q(`div`,n$,[e.onSearch?(V(),q(`div`,r$,[I(Q,{size:`sm`,onClick:n[0]||=t=>e.onSearch(e.scope)},{default:F(()=>[...n[2]||=[N(`Поиск в снимке`,-1)]]),_:1})])):B(``,!0),a.value?(V(),q(`p`,i$,j(a.value),1)):B(``,!0),a.value?B(``,!0):(V(),Y(Lu,{key:2,class:`side-content`},{default:F(()=>[I(t$,{ref_key:`tree`,ref:i,"project-id":e.projectId,scope:e.scope,selected:e.selected??``,revision:e.revision??0,decorations:c.value,onOpen:n[1]||=(t,n)=>e.onOpen?.(t,n)},null,8,[`project-id`,`scope`,`selected`,`revision`,`decorations`])]),_:1}))]))}}),[[`__scopeId`,`data-v-d61c68e1`]]),o$=[`aria-busy`],s$={class:`items`},c$={key:0,class:`empty`},l$=[`for`],u$={key:0,class:`error`,role:`status`},d$=G(M({__name:`UiStringList`,props:{items:{},disabled:{type:Boolean},placeholder:{},addLabel:{default:`Добавить`},emptyText:{default:`Список пуст`},inputLabel:{default:`Новое значение`},mono:{type:Boolean},unique:{type:Boolean,default:!0},normalize:{},validate:{}},emits:[`add`,`remove`],setup(e,{emit:t}){let n=e,r=t,i=X(``),o=X(``),s=P();function c(){o.value=``;let e=i.value.trim();if(!e)return;let t=n.normalize?.(e)??e,a=n.validate?.(t)??``;a?o.value=a:n.unique&&n.items.includes(t)?o.value=`Уже в списке`:(i.value=``,r(`add`,t))}function l(e){o.value=``,r(`remove`,e)}return(t,n)=>(V(),q(`div`,{class:`string-list`,"aria-busy":e.disabled},[K(`ul`,s$,[(V(!0),q(W,null,J(e.items,t=>(V(),q(`li`,{key:t},[K(`span`,{class:O([`value`,{mono:e.mono}])},j(t),3),I(Q,{shape:`icon`,size:`sm`,disabled:e.disabled,"aria-label":`Удалить ${t}`,title:`Удалить`,onClick:e=>l(t)},{default:F(()=>[I(H(oi))]),_:1},8,[`disabled`,`aria-label`,`onClick`])]))),128)),e.items.length?B(``,!0):(V(),q(`li`,c$,j(e.emptyText),1))]),K(`form`,{class:`add`,onSubmit:Z(c,[`prevent`])},[K(`label`,{class:`u-sr-only`,for:H(s)},j(e.inputLabel),9,l$),I(a,{id:H(s),modelValue:i.value,"onUpdate:modelValue":n[0]||=e=>i.value=e,type:`text`,class:O({mono:e.mono}),placeholder:e.placeholder,disabled:e.disabled,"aria-invalid":o.value?!0:void 0,autocomplete:`off`,spellcheck:`false`},null,8,[`id`,`modelValue`,`class`,`placeholder`,`disabled`,`aria-invalid`]),I(Q,{type:`submit`,disabled:e.disabled||!i.value.trim()},{default:F(()=>[N(j(e.addLabel),1)]),_:1},8,[`disabled`]),L(t.$slots,`actions`,{},void 0,!0)],32),o.value?(V(),q(`p`,u$,j(o.value),1)):B(``,!0)],8,o$))}}),[[`__scopeId`,`data-v-e5deea27`]]),f$=X(0);function p$(){f$.value++}function m$(e){return Object.entries(e).filter(([,e])=>e).map(([e])=>e).sort((e,t)=>e.localeCompare(t))}var h$=[`aria-labelledby`],g$=G(M({__name:`FilesExcludeSettings`,props:{embedded:{type:Boolean}},setup(e){let t=P(),n=X(jr()),{ready:r,busy:a,error:o,status:s,load:c,perform:l}=u(),d=z(()=>m$(n.value));async function f(e,t){let n=await fetch(`/api/ide/files-exclude`,{method:e,headers:{"Content-Type":`application/json`},body:t?JSON.stringify(t):void 0}),r=await n.json();if(!n.ok)throw Error(r.error||`Не удалось сохранить исключения`);return r}function p(){return c(async()=>{n.value=(await f(`GET`)).exclude},`Не удалось загрузить исключения`)}async function m(e){let t=n.value;n.value=e,await l(async()=>{n.value=(await f(`PUT`,{exclude:e})).exclude,p$()},{errorFallback:`Не удалось сохранить исключения`,success:`Сохранено`,rollback:()=>{n.value=t}})}function h(e){return Xn(e)?``:`Укажите glob-паттерн вроде **/node_modules или *.log`}function g(e){m({...n.value,[e]:!0})}function v(e){let t={...n.value};delete t[e],m(t)}function y(){m(jr())}return Lt(p),(n,c)=>(V(),q(`section`,{class:`files-exclude`,"aria-labelledby":H(t)},[I(_,{id:H(t),size:`sm`,class:O({"u-sr-only":e.embedded})},{default:F(()=>[...c[0]||=[N(`Исключения файлов`,-1)]]),_:1},8,[`id`,`class`]),I(i,null,{default:F(()=>[...c[1]||=[N(` Glob-паттерны как в VS Code `,-1),K(`code`,null,`files.exclude`,-1),N(`: скрывают совпадения из дерева, поиска и операций с путями. Примеры: `,-1),K(`code`,null,`**/node_modules`,-1),N(`, `,-1),K(`code`,null,`**/.git`,-1),N(`, `,-1),K(`code`,null,`*.log`,-1),N(`. `,-1)]]),_:1}),I(d$,{class:`list`,items:d.value,disabled:!H(r)||H(a),mono:``,placeholder:`**/node_modules`,"empty-text":`Нет активных паттернов`,"input-label":`Новый glob-паттерн`,normalize:H(tee),validate:h,onAdd:g,onRemove:v},{actions:F(()=>[I(Q,{type:`button`,disabled:!H(r)||H(a),onClick:y},{default:F(()=>[...c[2]||=[N(`По умолчанию`,-1)]]),_:1},8,[`disabled`])]),_:1},8,[`items`,`disabled`,`normalize`]),H(o)||H(s)?(V(),q(`p`,{key:0,role:`status`,class:O({error:H(o)})},j(H(o)||H(s)),3)):B(``,!0),!H(r)&&H(o)?(V(),Y(Q,{key:1,onClick:p},{default:F(()=>[...c[3]||=[N(`Повторить загрузку`,-1)]]),_:1})):B(``,!0)],8,h$))}}),[[`__scopeId`,`data-v-2efb3dfe`]]),_$=M({inheritAttrs:!1,__name:`FilesSection`,setup(e,{expose:t}){let n=X(),r=Re();return t({reveal:e=>n.value?.reveal(e)}),(e,t)=>(V(),Y(Lu,{class:`side-content`},{default:F(()=>[I(H(t$),rn({ref_key:`tree`,ref:n},H(r)),null,16)]),_:1}))}}),v$=M({__name:`CompareTreeSection`,props:{projectId:{},scope:{},revision:{},selected:{},onOpen:{type:Function}},setup(e,{expose:t}){let n=e,{data:r,loading:i,error:a,reload:o}=AY({load:()=>$n(n.projectId,n.scope,`changes`),keys:()=>[n.projectId,Lr(n.scope),n.revision],enabled:()=>n.scope.kind===`compare`,disabledError:`Раздел ждёт сравнение двух снимков`,errorFallback:`Не удалось сравнить снимки`}),s=X(),c=z(()=>r.value?.changes??[]),l=z(()=>{let e=c.value;return{files:e.length,additions:e.reduce((e,t)=>e+(t.additions??0),0),deletions:e.reduce((e,t)=>e+(t.deletions??0),0),truncated:r.value?.truncated===!0}});return t({reveal:e=>s.value?.reveal(e),refresh:o}),(t,n)=>(V(),Y(kY,{loading:H(i),error:H(a),"loading-text":`загрузка: изменения…`},{default:F(()=>[I(H(sX),{ref_key:`tree`,ref:s,changes:c.value,totals:l.value,selected:e.selected,"empty-text":`Изменений нет`,onOpen:n[0]||=(t,n,r)=>e.onOpen?.(t,n,r)},null,8,[`changes`,`totals`,`selected`])]),_:1},8,[`loading`,`error`]))}}),y$={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function b$(e,t){return V(),q(`svg`,y$,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M15 2h-4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V8`}),K(`path`,{d:`M16.706 2.706A2.4 2.4 0 0 0 15 2v5a1 1 0 0 0 1 1h5a2.4 2.4 0 0 0-.706-1.706zM5 7a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 1.732-1`})],-1)]])}var x$=U({name:`lucide-files`,render:b$}),S$={viewBox:`0 0 128 128`,width:`1.2em`,height:`1.2em`};function C$(e,t){return V(),q(`svg`,S$,[...t[0]||=[K(`path`,{fill:`#f34f29`,d:`M124.737 58.378L69.621 3.264c-3.172-3.174-8.32-3.174-11.497 0L46.68 14.71l14.518 14.518c3.375-1.139 7.243-.375 9.932 2.314c2.703 2.706 3.461 6.607 2.294 9.993l13.992 13.993c3.385-1.167 7.292-.413 9.994 2.295c3.78 3.777 3.78 9.9 0 13.679a9.673 9.673 0 0 1-13.683 0a9.68 9.68 0 0 1-2.105-10.521L68.574 47.933l-.002 34.341a9.7 9.7 0 0 1 2.559 1.828c3.778 3.777 3.778 9.898 0 13.683c-3.779 3.777-9.904 3.777-13.679 0c-3.778-3.784-3.778-9.905 0-13.683a9.7 9.7 0 0 1 3.167-2.11V47.333a9.6 9.6 0 0 1-3.167-2.111c-2.862-2.86-3.551-7.06-2.083-10.576L41.056 20.333L3.264 58.123a8.133 8.133 0 0 0 0 11.5l55.117 55.114c3.174 3.174 8.32 3.174 11.499 0l54.858-54.858a8.135 8.135 0 0 0-.001-11.501`},null,-1)]])}var w$=U({name:`devicon-git`,render:C$}),T$={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function E$(e,t){return V(),q(`svg`,T$,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2zm4-1a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1`},null,-1)]])}var D$=U({name:`lucide-messages-square`,render:E$}),O$={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function k$(e,t){return V(),q(`svg`,O$,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`rect`,{width:`8`,height:`8`,x:`3`,y:`3`,rx:`2`}),K(`path`,{d:`M7 11v4a2 2 0 0 0 2 2h4`}),K(`rect`,{width:`8`,height:`8`,x:`13`,y:`13`,rx:`2`})],-1)]])}var A$=U({name:`lucide-workflow`,render:k$}),j$={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function M$(e,t){return V(),q(`svg`,j$,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z`}),K(`circle`,{cx:`7.5`,cy:`7.5`,r:`.5`,fill:`currentColor`})],-1)]])}var N$=U({name:`lucide-tag`,render:M$}),P$=[{id:`files`,title:`Файлы`},{id:`search`,title:`Поиск`,requires:`search`},{id:`git`,title:`Git`,requires:`git`}],F$=(e,t)=>Fs(e=>t[e],P$,e.sidebar),I$={files:{icon:x$,component:_$,props:e=>({projectId:e.projectId,beforeChange:e.files.prepareEntryChange,selected:e.active?.path??``,revision:e.revision,decorations:Ns(Os(e.overview.git.value.changes)),onChanged:e.changed,onDeleted:e.deleted,onOpen:(t,n)=>e.openFile(t,void 0,void 0,void 0,{preview:!n}),onMoved:e.moved})},search:{icon:If,component:lQ,props:e=>({projectId:e.projectId,onOpen:e.openFile})},"search-scope":{icon:If,component:lQ,props:(e,t,n)=>{let r=n?.params?.scope;if(!r)throw Error(`У поиска нет источника`);return{projectId:e.projectId,scope:r,onOpen:(t,n,i)=>e.openFile(t,n,i,void 0,{scope:r,preview:!1})}},refresh:(e,t)=>t?.refresh?.()},git:{icon:w$,component:BJ,props:e=>({projectId:e.projectId,overview:e.overview,history:e.history,branches:e.branches,selected:e.active?{path:e.active.path,staged:e.active.staged}:void 0,prepare:e.gitSync.prepare,invalidate:e.files.invalidate,applied:e.gitSync.applied,onOpen:(t,n,r)=>e.openFile(t,void 0,void 0,n,{preview:!r}),reveal:t=>e.command(`ide.workbench.tree.reveal`,{path:t}),onOpenCommit:e.files.openCommit,onOpenCommitTree:e.openCommitTree,onOpenCommitDiff:(t,n,r)=>e.files.openCommitFile(t,n,!r)}),badge:e=>e.overview.git.value.changes.length,activate:e=>void e.overview.load(),refresh:(e,t)=>t?.refresh?.()},tree:{icon:x$,component:a$,props:(e,t,n)=>{let r=n?.params?.scope;if(!r)throw Error(`У раздела дерева нет источника`);return{projectId:e.projectId,scope:r,revision:e.revision,selected:e.active?.scope&&Lr(e.active.scope)===Lr(r)?e.active.path:``,onSearch:tr(e.projectId).search?e.openSearch:void 0,onOpen:(t,n)=>e.openFile(t,void 0,void 0,void 0,{scope:r,preview:!n})}}},changes:{icon:x$,component:v$,props:(e,t,n)=>{let r=n?.params?.scope;if(!r)throw Error(`У раздела сравнения нет источника`);return{projectId:e.projectId,scope:r,revision:e.revision,selected:e.active?.scope&&Lr(e.active.scope)===Lr(r)?e.active.path:``,onOpen:(t,n,i)=>e.openFile(t,void 0,void 0,void 0,{scope:r,originalPath:i,preview:!n})}},refresh:(e,t)=>t?.refresh?.()},issues:{icon:aF,component:pY,props:(e,t)=>({projectId:e.projectId,active:t,onOpen:(t,n)=>e.openTab(`issue`,t,{preview:!n})}),refresh:(e,t)=>t?.refresh?.()},pulls:{icon:gY,component:DY,props:(e,t)=>({projectId:e.projectId,active:t,onOpen:(t,n)=>e.openTab(`pull`,t,{preview:!n})}),refresh:(e,t)=>t?.refresh?.()},"merge-requests":{icon:cF,component:DY,props:(e,t)=>({projectId:e.projectId,active:t,onOpen:(t,n)=>e.openTab(`pull`,t,{preview:!n}),title:`Merge requests`,noun:`merge requests`,singular:`merge request`,kind:`mergeRequests`,host:`GitLab`,action:`pulls`}),refresh:(e,t)=>t?.refresh?.()},"merge-request-files":{icon:x$,component:cX,props:(e,t,n)=>{let r=Number(n?.params?.number),i=typeof n?.params?.head==`string`?n.params.head:``;return{projectId:e.projectId,number:r,head:i,snapshot:n?.params?.snapshot,onOpen:(t,n,a)=>e.openPullFile(r,t,a||i,n)}},refresh:(e,t)=>t?.refresh?.()},pipelines:{icon:A$,component:wX,props:(e,t)=>({projectId:e.projectId,active:t,onOpen:(t,n)=>e.openTab(`pipeline`,t,{preview:!n})}),refresh:(e,t)=>t?.refresh?.()},releases:{icon:N$,component:pZ,props:(e,t)=>({projectId:e.projectId,active:t,onOpen:(t,n)=>e.openTab(`release`,t,{preview:!n})}),refresh:(e,t)=>t?.refresh?.()},discussions:{icon:D$,component:pX,props:(e,t)=>({projectId:e.projectId,active:t,onOpen:(t,n)=>e.openTab(`discussion`,t,{preview:!n})}),refresh:(e,t)=>t?.refresh?.()},docker:{icon:g_,component:zZ,props:()=>({}),refresh:e=>e.command(`ide.docker.refresh`)}},L$={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function R$(e,t){return V(),q(`svg`,L$,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`}),K(`path`,{d:`M21 3v5h-5`})],-1)]])}var z$=U({name:`lucide-rotate-cw`,render:R$}),B$={key:0,class:`side-tabs picker-bar`,"aria-label":`Разделы проекта`},V$=[`aria-expanded`,`aria-controls`],H$={class:`name`},U$={key:1,class:`count`,"aria-hidden":`true`},W$={class:`side-actions`},G$=[`aria-current`,`onClick`],K$={class:`label`},q$={key:0,class:`count`,"aria-hidden":`true`},J$={key:2,class:`side-tabs vertical`,"aria-label":`Разделы проекта`},Y$={key:0,class:`side-separator`,"aria-hidden":`true`},X$=[`aria-pressed`,`title`,`aria-label`,`aria-haspopup`,`onClick`,`onContextmenu`],Z$={key:0,"aria-hidden":`true`},Q$={class:`side-actions`},$$=G(M({__name:`SidebarTabs`,props:{section:{},items:{},vertical:{type:Boolean},collapsed:{type:Boolean}},emits:[`update:section`,`command`],setup(e,{emit:t}){let n=e,r=t,i=mu({anchor:`left`,initialFocus:[`.section-item.selected`,`.section-item`],items:`.section-item`}),a=z(()=>Ls(n.items)),o=z(()=>a.value.flat()),s=z(()=>o.value.find(e=>e.id===n.section)),c=z(()=>o.value.some(e=>e.id!==n.section&&e.badge)),l=E(`sidebar-sections`,()=>({surface:`workbench`}));l.scope.registerCommand({id:`ide.workbench.section.picker.toggle`,title:`Открыть или закрыть выбор раздела`,description:`Показывает список разделов проекта (файлы, поиск, Git и другие) в мобильной боковой панели.`,enabled:()=>!n.vertical,run:()=>void i.toggle()});let u=X(),d=X(),f=z(()=>{let e=d.value;return e?[{id:`section.close`,label:`Закрыть «${e.title}»`,icon:oi,command:`ide.workbench.section.close`,args:{section:e.id},run:()=>r(`command`,`ide.workbench.section.close`,{section:e.id})}]:[]});function p(e,t){n.vertical&&t.closable&&(e.preventDefault(),e.stopPropagation(),d.value=t,u.value?.open(e,e.currentTarget))}function m(e){i.close(),e.command?r(`command`,e.command):r(`update:section`,e.id)}return(t,n)=>(V(),q(W,null,[e.vertical?B(``,!0):(V(),q(`nav`,B$,[K(`span`,{ref:H(i).trigger,class:`picker`},[K(`button`,{class:`current`,"aria-haspopup":`dialog`,"aria-expanded":H(i).open.value,"aria-controls":H(i).open.value?H(i).id:void 0,"data-command":`ide.workbench.section.picker.toggle`,onClick:n[0]||=e=>H(l).run(`ide.workbench.section.picker.toggle`)},[s.value?(V(),Y(qe(s.value?.icon),{key:0,"aria-hidden":`true`})):B(``,!0),K(`span`,H$,j(s.value?.title??`Разделы`),1),s.value?.badge?(V(),q(`span`,U$,j(s.value.badge),1)):c.value?(V(),Y(ne,{key:2,as:`i`,class:`dot`,radius:`circle`,shrink:``,tone:`success`,"aria-hidden":`true`})):B(``,!0),I(H(fl),{class:`chevron`,"aria-hidden":`true`})],8,V$)],512),K(`div`,W$,[I(Q,{shape:`icon`,size:`sm`,title:`Обновить раздел`,"aria-label":`Обновить раздел`,"data-command":`ide.workbench.sidebar.refresh`,onClick:n[1]||=e=>r(`command`,`ide.workbench.sidebar.refresh`)},{default:F(()=>[I(H(z$),{"aria-hidden":`true`})]),_:1})])])),e.vertical?(V(),q(`nav`,J$,[(V(!0),q(W,null,J(a.value,t=>(V(),q(`div`,{key:t[0]?.id,class:O([`side-group`,{grouped:t.length>1}])},[(V(!0),q(W,null,J(t,(t,n)=>(V(),q(W,{key:t.id},[n?(V(),q(`i`,Y$)):B(``,!0),K(`button`,{class:O({selected:e.section===t.id&&!e.collapsed}),"aria-pressed":e.section===t.id&&!e.collapsed,title:t.closable?`${t.title} · ПКМ: закрыть`:t.title,"aria-label":t.badge?`${t.title}: ${t.badge}`:t.title,"aria-haspopup":t.closable?`menu`:void 0,onClick:e=>t.command?r(`command`,t.command):r(`update:section`,t.id),onContextmenu:e=>p(e,t)},[(V(),Y(qe(t.icon),{class:O({"git-logo":t.id===`git`}),"aria-hidden":`true`},null,8,[`class`])),t.badge?(V(),q(`span`,Z$,j(t.badge),1)):B(``,!0)],42,X$)],64))),128))],2))),128)),K(`div`,Q$,[I(Q,{shape:`icon`,size:`sm`,title:`Настройки Projector`,"aria-label":`Настройки Projector`,"data-command":`ide.workbench.settings.open`,onClick:n[3]||=e=>r(`command`,`ide.workbench.settings.open`)},{default:F(()=>[I(H(tp),{"aria-hidden":`true`})]),_:1})])])):(V(),Y(kl,{key:1,menu:H(i),label:`Разделы проекта`,width:260},{default:F(()=>[(V(!0),q(W,null,J(o.value,t=>(V(),q(`button`,{key:t.id,class:O([`section-item`,{selected:e.section===t.id,subgroup:!!t.group}]),"aria-current":e.section===t.id?`true`:void 0,onClick:e=>m(t)},[(V(),Y(qe(t.icon),{class:O({"git-logo":t.id===`git`}),"aria-hidden":`true`},null,8,[`class`])),K(`span`,K$,j(t.title),1),t.badge?(V(),q(`span`,q$,j(t.badge),1)):B(``,!0),e.section===t.id?(V(),Y(H(C_),{key:1,class:`check`,"aria-hidden":`true`})):B(``,!0)],10,G$))),128)),K(`button`,{class:`section-item`,"data-command":`ide.workbench.settings.open`,onClick:n[2]||=e=>{H(i).close(),r(`command`,`ide.workbench.settings.open`)}},[I(H(tp),{"aria-hidden":`true`}),n[4]||=K(`span`,{class:`label`},`Настройки Projector`,-1)])]),_:1},8,[`menu`])),I(Wd,{ref_key:`sectionMenu`,ref:u,items:f.value,label:`Действия раздела`},null,8,[`items`])],64))}}),[[`__scopeId`,`data-v-8fe950ae`]]),e1={class:`panel`},t1={key:0,class:`panel-head`},n1={class:`panel-head-text`},r1={key:0,class:`panel-head-title`},i1={key:1,class:`panel-head-source`},a1=[`title`,`aria-label`],o1=G(M({__name:`WorkspaceSidebar`,props:yt({projectId:{},capabilities:{},sections:{},hidden:{type:Boolean},active:{},revision:{},overview:{},history:{},branches:{},files:{},gitSync:{},views:{},rail:{type:Boolean}},{section:{required:!0},sectionModifiers:{}}),emits:yt([`command`,`refresh`,`navigate`,`changed`,`deleted`,`moved`,`openCommitTree`,`openSearch`],[`update:section`]),setup(e,{expose:t,emit:n}){let r=e,i=Te(e,`section`),a=n,o={...I$,...r.views},s=new Map,c={get projectId(){return r.projectId},get active(){return r.active},get revision(){return r.revision},get overview(){return r.overview},get history(){return r.history},get branches(){return r.branches},get files(){return r.files},get gitSync(){return r.gitSync},openFile(...e){let t=r.files.openFile(...e);return a(`navigate`),t},openTab(e,t,n){r.files.openTab(e,t,n),a(`navigate`)},openCommitTree:e=>a(`openCommitTree`,e),openSearch:e=>a(`openSearch`,e),openPullFile:(e,t,n,i)=>r.files.openPullFile(e,t,n,!i),command:(e,t)=>a(`command`,e,t),refreshWorkspace:()=>a(`refresh`),changed:()=>a(`changed`),deleted:e=>a(`deleted`,e),moved:(e,t)=>a(`moved`,e,t)},l=z(()=>{let e=[];for(let t of r.sections.list()){let n=t.kind??t.id,i=o[n];i&&e.push({id:t.id,title:t.title,icon:i.icon,command:t.command,badge:i.badge?.(c)??0,group:t.group&&r.sections.has(t.group)?t.group:void 0,kind:n,closable:t.closable})}return e}),u=e=>{let t=r.sections.get(e);return o[t?.kind??e]},d=z(()=>r.sections.get(i.value)),f=z(()=>{let e=d.value;return e?o[e.kind??e.id]:void 0}),p=(e,t)=>t?s.set(e,t):s.delete(e);function m(){let e=u(i.value);e?.refresh?e.refresh(c,s.get(i.value)):a(`refresh`)}R(i,e=>u(e)?.activate?.(c));function h(e){r.rail&&(r.hidden||i.value===e)&&a(`command`,`ide.workbench.sidebar.toggle`),i.value=e}return t({refreshSection:m,reveal:(e,t=`files`)=>s.get(t)?.reveal?.(e),refreshSearch:()=>s.get(`search`)?.refresh?.(),search:()=>s.get(`search`)?.search?.()}),(t,n)=>et((V(),q(`aside`,{class:O([`sidebar`,{"with-rail":e.rail}]),"aria-label":`Обзор проекта`},[I($$,{section:i.value,items:l.value,vertical:e.rail,collapsed:e.rail&&e.hidden,"onUpdate:section":h,onCommand:n[0]||=(e,t)=>a(`command`,e,t)},null,8,[`section`,`items`,`vertical`,`collapsed`]),et(K(`div`,e1,[d.value?.closable?(V(),q(`div`,t1,[f.value?(V(),Y(qe(f.value?.icon),{key:0,class:`panel-head-icon`,"aria-hidden":`true`})):B(``,!0),K(`span`,n1,[e.rail||!d.value.source?(V(),q(`span`,r1,j(d.value.title),1)):B(``,!0),d.value.source?(V(),q(`span`,i1,j(d.value.source),1)):B(``,!0)]),e.rail?B(``,!0):(V(),q(`button`,{key:1,class:`panel-head-close`,title:`Закрыть «${d.value.title}»`,"aria-label":`Закрыть «${d.value.title}»`,"data-command":`ide.workbench.section.close`,onClick:n[1]||=e=>a(`command`,`ide.workbench.section.close`,{section:i.value})},[I(H(oi),{"aria-hidden":`true`})],8,a1))])):B(``,!0),e.rail&&d.value?.closable?(V(),q(`button`,{key:1,class:`panel-close`,title:`Закрыть раздел`,"aria-label":`Закрыть раздел`,"data-command":`ide.workbench.section.close`,onClick:n[2]||=e=>a(`command`,`ide.workbench.section.close`,{section:i.value})},[I(H(oi),{"aria-hidden":`true`})])):B(``,!0),e.rail?(V(),q(`button`,{key:2,class:`panel-refresh`,title:`Обновить раздел`,"aria-label":`Обновить раздел`,"data-command":`ide.workbench.sidebar.refresh`,onClick:n[3]||=e=>a(`command`,`ide.workbench.sidebar.refresh`)},[I(H(z$),{"aria-hidden":`true`})])):B(``,!0),(V(!0),q(W,null,J(l.value,e=>et((V(),Y(qe(o[e.kind].component),rn({key:e.id,ref_for:!0,ref:t=>p(e.id,t)},{ref_for:!0},o[e.kind].props(c,i.value===e.id,r.sections.get(e.id))),null,16)),[[Ln,i.value===e.id]])),128))],512),[[Ln,!e.rail||!e.hidden]])],2)),[[Ln,e.rail||!e.hidden]])}}),[[`__scopeId`,`data-v-7f04fe30`]]),s1=e=>!e.scope||pr(e.scope);function c1(e,t={}){let n=t.scope;return n&&!pr(n)?`${e}:${n.kind===`commit`?`rev:${n.rev}`:Lr(n)}`:`${t.external?`external:`:``}${e}:${t.staged===void 0?`file`:t.staged?`index`:`working`}`}var l1=e=>!e.readonly&&s1(e)&&!e.binary&&!e.virtual&&!e.external&&!e.image&&!e.archive&&(e.original===void 0||e.staged===!1),u1=e=>(!e.scope||e.scope.kind!==`compare`)&&!e.virtual&&!e.binary&&!e.image&&e.original===void 0&&/\.(?:md|markdown)$/i.test(e.path),d1=e=>s1(e)&&!e.virtual&&!e.binary&&!e.image&&!e.external&&e.original===void 0&&/\.html?$/i.test(e.path);function f1(e){let t=()=>e.tabs.value.filter(e=>!e.virtual&&!e.commit&&s1(e)&&!e.external&&!e.localFile);async function n(n,r){if(n===`checkout`){for(let n of t())if(!await e.files.saveFile(n))throw Error(`Не удалось сохранить файл`)}else if(n!==`discard`){for(let t of r)if(!await e.files.prepareEntryChange(t))throw Error(`Не удалось сохранить файл`)}else if(!await e.files.settle(r[0]))throw Error(`Не удалось завершить сохранение файла`)}async function r(){e.files.invalidate();let n=e.active()?.key;for(let n of t())await e.files.openFile(n.path,n.line,n.column,n.staged,{reload:!0}),e.files.fileError.value&&(e.files.fileError.value=``,e.tabs.value=e.tabs.value.filter(e=>e!==n));n&&e.tabs.value.some(e=>e.key===n)&&e.files.selectTab(n),e.bumpRevision(),e.refreshSearch()}async function i(t,n){if(t===`checkout`)return r();let i=n[0];e.bumpRevision();let a=e.active();e.tabs.value=e.tabs.value.filter(e=>e.commit||!s1(e)||!n.includes(e.path)||e.original===void 0&&t!==`discard`),a?.path===i&&t===`discard`&&await Vn(e.projectId(),`file`,{path:i}).then(()=>!0,()=>!1)&&await e.files.openFile(i,void 0,void 0,void 0,{preview:!1}),e.refreshSearch()}return{prepare:n,applied:i}}var p1=160,m1=300,h1=1050,g1=(e,t)=>Math.max(p1,Math.min(e,t-m1));function _1(e){let t=X(),n=z(()=>({"--tree-width":t.value?`${t.value}px`:void 0})),r;Lt(()=>{r=new ResizeObserver(()=>{let n=e.value;!n||window.innerWidth<=h1||t.value===void 0||(t.value=g1(t.value,n.clientWidth))}),e.value&&r.observe(e.value)}),lt(()=>{r?.disconnect()});let i=bI({start:()=>{let t=e.value;if(!(!t||window.innerWidth<=h1))return t.getBoundingClientRect()},move:(e,n)=>{t.value=g1(e.clientX-n.left,n.width)},cursor:()=>`col-resize`}).start;function a(n){if(![`ArrowLeft`,`ArrowRight`].includes(n.key)||!e.value)return;n.preventDefault();let r=e.value,i=n.key===`ArrowRight`?20:-20;t.value=g1((t.value??r.querySelector(`.sidebar`).clientWidth)+i,r.clientWidth)}return{treeWidth:t,sizes:n,resizeTree:i,resizeTreeKey:a}}function v1(e,t){let n=e.replace(/\/+$/,``)+`/`;return t.startsWith(n)?t.slice(n.length):void 0}async function y1(e){let t=/\.(?:png|jpe?g|gif|webp|avif)$/i.test(e.name);if(t&&e.size>8388608)throw Error(`Файл больше 8 МБ`);if(!t&&e.size>268435456)throw Error(`Файл больше ${xs/1024/1024} МБ: редактор не сможет его открыть`);if(t)return{path:e.name,content:``,image:URL.createObjectURL(e)};let n=await e.text();if(n.includes(`\0`))throw Error(`Бинарный файл — просмотр текста недоступен`);return{path:e.name,content:n}}function b1(e,t){return e&&(!t||!!t.preview)}function x1(e,t,n,r){for(let i of[...e])i.preview&&i.key!==t&&(n(i)||i.saving?i.preview=!1:(r(i),e.splice(e.indexOf(i),1)))}function S1(e){async function t(t,n,r=!0){let i=`${n}:commit:${t}`,a=e.tabs.value.find(e=>e.key===i);if(a)return r||(a.preview=!1),e.selectTab(i),e.generation();let o=e.begin();try{let a=await Vn(e.projectId(),`commit-diff`,{hash:t,path:n});return o===e.generation()?(r&&e.dropPreview(i),e.tabs.value.push({key:i,path:n,content:a.modified,original:a.original,commit:a.hash,parent:a.parent,preview:r}),e.selectTab(i),o):void 0}catch(t){return e.fail(o,t instanceof Error?t.message:`Не удалось открыть изменения`)}finally{e.finish(o)}}async function n(t,n,r=``,i=!0){let a=e.tabs.value.find(e=>e.virtual===`pull`&&Number(e.params?.number)===t);a&&(a.preview=!1);let o=`${n}:pull:${t}${r?`:${r}`:``}`,s=e.tabs.value.find(e=>e.key===o);if(s)return i||(s.preview=!1),e.selectTab(o),e.generation();let c=e.begin();try{let r=await Vn(e.projectId(),`pull-diff`,{number:String(t),path:n});if(c!==e.generation())return;if(r.binary)throw Error(`Бинарный файл нельзя сравнить как текст`);if(r.tooLarge)throw Error(`Файл слишком большой для просмотра изменений`);return i&&e.dropPreview(o),e.tabs.value.push({key:o,path:n,content:r.modified,original:r.original,commit:r.hash,parent:r.parent,pull:t,preview:i}),e.selectTab(o),c}catch(t){return e.fail(c,t instanceof Error?t.message:`Не удалось открыть изменения`)}finally{e.finish(c)}}return{openCommitFile:t,openPullFile:n}}function C1(e,t,n,r={},i=!1){let a=t.get(n);if(!a)return;let o=a.key(r),s=e.value.find(e=>e.key===o),c=b1(i&&!!a.preview,s);return s?s.preview=c:e.value.push({key:o,path:a.path(r),virtual:n,content:a.hint?.(r)??``,params:r,preview:c}),o}function w1(e){async function t(){return(await Promise.all(e.tabs.value.map(t=>e.saveFile(t)))).every(Boolean)?!0:window.confirm(`Не удалось сохранить изменения файлов. Уйти без сохранения?`)}function n(){for(let t of e.tabs.value)e.saveFile(t)}function r(t){e.tabs.value.some(t=>e.isDirty(t)||t.saving)&&(t.preventDefault(),t.returnValue=``)}lo(t),uo((e,n)=>e.path===n.path||t()),Lt(()=>{window.addEventListener(`beforeunload`,r),window.addEventListener(`blur`,n)}),lt(()=>{window.removeEventListener(`beforeunload`,r),window.removeEventListener(`blur`,n)})}var T1=e=>!e.virtual&&!e.external&&!e.commit&&s1(e)&&!e.localFile&&!e.binary&&!e.image&&!e.archive&&e.staged!==!0;function E1(e){let t=()=>nr(e.projectId()),n=()=>e.tabs.value.filter(T1);async function r(t){if(!T1(t)||t.saving)return;let n=e.projectId(),r;try{r=(await Vn(n,`file`,{path:t.path})).content}catch(r){if(n!==e.projectId()||!e.tabs.value.includes(t))return;t.conflict={error:r instanceof Error?r.message:`Файл недоступен`};return}n===e.projectId()&&e.tabs.value.includes(t)&&!t.saving&&(r===t.content?t.conflict=void 0:!e.isDirty(t)||t.draft===r?(t.content=r,t.draft=void 0,t.conflict=void 0,t.saveError=``,e.changed()):t.conflict={disk:r})}let i=e=>Promise.all(n().filter(t=>t.path===e).map(r));async function a(e){e.draft=void 0,e.conflict=void 0,e.saveError=``,await r(e)}function o(e){let t=e.conflict?.disk;t!==void 0&&(e.content=t,e.conflict=void 0,e.saveError=``)}let s=``,c;function l(r=!1){if(!t())return;let i=[...new Set(n().map(e=>e.path))].sort(),a=`${e.projectId()}\0${i.join(`\0`)}`;(a!==s||r)&&(s=a,or(e.projectId(),{paths:i}).then(e=>{e||(s=``)}))}R(()=>[e.projectId(),...n().map(e=>e.path)].join(`\0`),()=>{clearTimeout(c),c=setTimeout(()=>l(),150)},{flush:`post`});function u(){l(!0);for(let e of n())r(e)}let d;return Lt(()=>{d=R(e.projectId,(e,t,n)=>{t&&or(t,{paths:[]}),n(Un(e,{file:e=>{i(e)},reconnect:u})),l(!0)},{immediate:!0})}),lt(()=>{clearTimeout(c),d?.(),or(e.projectId(),{paths:[]},!0)}),{check:r,reloadFromDisk:a,keepMine:o}}async function D1(e,t,n,r,i,a){let o=r=>Vn(e,n?`external`:`file`,{path:t,...r?{ask:`1`}:{},...a?Nr(a):{}}),s=await o(r);if(s.large===void 0)return s;if(i()&&window.confirm(Ss(t,s.large)))return o(!1)}async function O1(e,t,n){return n.scope?.kind===`compare`?$n(e,n.scope,`compare-file`,{path:t,...n.originalPath?{originalPath:n.originalPath}:{}}):n.scope&&!pr(n.scope)?D1(e,t,!1,n.ask,n.wanted,n.scope):n.staged===void 0?D1(e,t,n.external,n.ask,n.wanted):Vn(e,`diff`,{path:t,staged:String(n.staged)})}function k1(e){return e.size<10485760||/\.(?:png|jpe?g|gif|webp|avif)$/i.test(e.name)||window.confirm(Ss(e.name,e.size))}function A1(e){let{tabs:t}=e,n=X(``);ai(()=>n.value);let r=X(!1),i=E1({projectId:e.projectId,tabs:t,isDirty:e.isDirty,changed:e.saved}),a=0,o=0;async function s(i,o,s,c,{reload:l=!1,external:u=!1,preview:d=!0,scope:f,originalPath:m,quiet:h=!1,endLine:g}={}){if(u&&!tr(e.projectId()).externalFiles)throw Error(`Внешние файлы недоступны для этого источника`);let _=c1(i,{external:u,staged:c,scope:f}),v=t.value.find(e=>e.key===_),b=b1(d,v);if(v&&(!l||e.isDirty(v)||v.saving))return v.preview=b,y(_),v.line=o,v.endLine=g,v.column=s,o&&u1(v)&&(v.markdownMode=`source`),a;let x=++a;r.value=!0,n.value=``;try{let n=await O1(e.projectId(),i,{external:u,staged:c,scope:f,originalPath:m,ask:!v,wanted:()=>x===a});if(!n||x!==a)return;b&&p(_);let r={...n,readonly:!!f&&!pr(f)||!tr(e.projectId()).write,external:u,image:`image`in n&&n.image?!f||pr(f)?Gn(e.projectId(),i,u):f.kind===`commit`?Cr(e.projectId(),f,i):void 0:void 0,path:i,content:`modified`in n?n.modified:n.content,archive:`archive`in n?n.archive:void 0,original:`original`in n?n.original:void 0,staged:c,scope:f,originalPath:m,line:o,endLine:g,column:s,key:_,markdownMode:o?`source`:v?.markdownMode??`document`,preview:b},l=t.value.findIndex(e=>e.key===_);return l===-1?t.value.push(r):t.value[l]=r,y(_),a}catch(e){if(x===a)return h||(n.value=e instanceof Error?e.message:`Не удалось открыть файл`),x}finally{x===a&&(r.value=!1)}}let{openCommitFile:c,openPullFile:l}=S1({projectId:e.projectId,tabs:t,selectTab:y,dropPreview:e=>p(e),generation:()=>a,begin:()=>(a++,r.value=!0,n.value=``,a),finish:e=>{e===a&&(r.value=!1)},fail:(e,t)=>{if(e===a)return n.value=t,e}}),u=(e,t=``)=>d(`commit`,{hash:e,subject:t});function d(n,r,{preview:i=!0}={}){let a=C1(t,e.tabTypes,n,r,i);if(!a)throw Error(`Вкладка «${n}» недоступна в этом проекте`);t.value.find(e=>e.key===a)?.preview&&p(a),y(a)}function f(e){e.image?.startsWith(`blob:`)&&URL.revokeObjectURL(e.image)}let p=n=>x1(t.value,n,e.isDirty,f);function m(e){let n=t.value.find(t=>t.key===e);n&&(n.preview=!1)}async function h(e,i=!1){let o=`browser:${e.name}:${e.size}:${e.lastModified}`;if(!i&&t.value.some(e=>e.key===o)){y(o);return}let s=++a;r.value=!0,n.value=``;try{if(!k1(e))return;let n=await y1(e);if(s!==a){n.image&&URL.revokeObjectURL(n.image);return}let r={...n,key:o,external:!0,localFile:e},i=t.value.findIndex(e=>e.key===o);i===-1?t.value.push(r):(f(t.value[i]),t.value[i]=r),y(o)}catch(e){s===a&&(n.value=e instanceof Error?e.message:`Не удалось открыть файл`)}finally{s===a&&(r.value=!1)}}let g=t=>tr(e.projectId()).externalFiles&&GA(t)||!!t?.types.includes(`application/x-projector-tree-entry`);async function _(t,r){t.preventDefault();let i=t.dataTransfer;if(!i||!GA(i)&&!i.types.includes(`application/x-projector-tree-entry`))return;let a=++o,c=e.projectId(),l=KA(i),u=[...i.files],d=[...i.items].some(e=>e.webkitGetAsEntry?.()?.isDirectory),f=i.getData(NQ),p=()=>a===o&&c===e.projectId();n.value=``,e.pending.target=r;try{if(f){let e=JSON.parse(f);if(e.projectId===c){await s(e.path,void 0,void 0,void 0,{preview:!1});return}let t=await fetch(`/api/projects/${encodeURIComponent(e.projectId)}`),n=await t.json();if(!t.ok)throw Error(n.error||`Не удалось прочитать проект`);l.push(`${n.project.path.replace(/\/+$/,``)}/${e.path}`)}if(l.length){let{root:e}=await Vn(c,`root`);for(let t of l){if(!p())return;let n=v1(e,t);await s(n??t,void 0,void 0,void 0,{external:n===void 0,preview:!1})}}else{if(d)throw Error(`Бросьте файл, чтобы открыть его в редакторе`);for(let e of u){if(!p())return;await h(e)}if(!u.length)throw Error(`Не удалось прочитать перетащенный файл`)}}catch(e){p()&&(n.value=e instanceof Error?e.message:`Не удалось открыть файл`)}finally{e.pending.target=void 0}}async function v(n){let r=t.value.find(e=>e.key===n);if(!r||e.tabTypes.behaviorOf(r.virtual)?.beforeClose?.()===!1||!await x(r)&&(e.reveal(r.key),!window.confirm(`Не удалось сохранить ${r.path}. Закрыть без сохранения изменений?`)))return;let i=t.value.indexOf(r);i!==-1&&(f(r),t.value.splice(i,1))}function y(t){t!==e.activeKey()&&x(),++a,r.value=!1,n.value=``,e.reveal(t)}let b=new Map;function x(t=e.active()){if(!t||!l1(t))return Promise.resolve(!0);if(t.conflict&&e.isDirty(t))return t.saveError=`Файл изменён на диске: выберите версию, чтобы продолжить`,Promise.resolve(!1);let n=b.get(t);if(n)return n;if(!e.isDirty(t))return Promise.resolve(!0);t.saving=!0,t.saveError=``;let r=e.projectId(),a=(async()=>{try{for(;e.isDirty(t);){let e=t.draft;await Vr(r,t.path,e,t.content),t.content=e}return e.saved(),!0}catch(e){return t.saveError=e instanceof Error?e.message:`Не удалось сохранить файл`,i.check(t),!1}finally{t.saving=!1,b.delete(t)}})();return b.set(t,a),a}w1({tabs:t,saveFile:x,isDirty:e.isDirty});async function S(e){let n=t.value.filter(t=>!t.virtual&&(t.path===e||t.path.startsWith(e+`/`)));return(await Promise.all(n.map(e=>x(e)))).every(Boolean)}async function C(e){for(let n of e)if(await v(n),t.value.some(e=>e.key===n))break}function w(){++a,r.value=!1}async function T(e){for(let n of t.value.filter(t=>t.path===e))if(b.has(n)&&!await b.get(n))return!1;return!0}function ee(){let t=e.active();t&&u1(t)&&(t.markdownMode=t.markdownMode===`source`?`document`:`source`)}function E(){++a,++o,e.pending.target=void 0,t.value.forEach(f),t.value=[],n.value=``,r.value=!1}return lt(()=>{++o,t.value.forEach(f),++a}),{fileError:n,loading:r,generation:()=>a,invalidate:w,settle:T,reset:E,openFile:s,openCommit:u,openCommitFile:c,openPullFile:l,openTab:d,openBrowserFile:h,acceptsFileDrop:g,dropFiles:_,closeTab:v,closeManyTabs:C,selectTab:y,saveFile:x,prepareEntryChange:S,toggleMarkdownSource:ee,pinPreview:m,reloadFromDisk:i.reloadFromDisk,keepMine:i.keepMine}}var j1=`proxy.localhost`,M1=new Set([`localhost`,`127.0.0.1`,`[::1]`,`0.0.0.0`]),N1=/^(?:10\.|192\.168\.|172\.(?:1[6-9]|2\d|3[01])\.|169\.254\.)|\.(?:localhost|local)$/;function P1(e){let t=e.trim();return t?/^https?:\/\//i.test(t)?new URL(t).href:/^(?:localhost|127\.0\.0\.1|\[::1\])(?::\d+)?(?:[/?#]|$)/i.test(t)?new URL(`http://${t}`).href:/^:\d{2,5}(?:[/?#]|$)/.test(t)?new URL(`http://localhost${t}`).href:!/\s/.test(t)&&/^[^\s/]+\.[a-z]{2,}(?::\d+)?(?:[/?#]|$)/i.test(t)?new URL(`https://${t}`).href:`https://duckduckgo.com/?q=${encodeURIComponent(t)}`:``}function F1(e){try{let t=new URL(e).hostname.toLowerCase();return M1.has(t)||N1.test(t)}catch{return!1}}function I1(e){return e===`localhost`||e===`127.0.0.1`||e===`[::1]`}function L1(e,t=``){return`${e}.${j1}${t?`:${t}`:``}`}function R1(e,t){let n;try{n=new URL(e)}catch{return}if(n.protocol!==`http:`&&n.protocol!==`https:`||n.hostname.includes(`:`))return;let r=(n.protocol===`https:`?`s`:`h`)+n.port,i=`${n.hostname}.${r}.${t}`;if(!(i.length>253))return`http://${i}${n.pathname}${n.search}${n.hash}`}function z1(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw Error(`${t}: нужно целое число от 1`);return e}}function B1(e){let{projectId:t,register:n,run:r}=e;n(`ide.editor.selection.toChat`,`Добавить выделение в чат`,async n=>{let i=b(n);if(i.chat!==void 0&&typeof i.chat!=`string`)throw Error(`chat должен быть строкой`);if(i.text!==void 0){if(typeof i.text!=`string`)throw Error(`text должен быть строкой`);if(i.source!==void 0&&typeof i.source!=`string`)throw Error(`source должен быть строкой`);return await AP(t,i.text,{chat:i.chat,source:i.source,run:r}),{text:i.text}}let a=e.current();if(!i.path&&i.from===void 0&&a?.text)return await AP(t,a.text,{chat:i.chat,source:`Выделение из ${a.path}`,run:r}),{path:a.path,text:a.text};let o=typeof i.path==`string`?i.path:void 0,s=z1(i.from,`from`);if(o&&!s)throw Error(`Укажите from для выбранного файла`);let c=o??a?.path,l=s??a?.from,u=z1(i.to,`to`)??(s?l:a?.to);if(!c||!l||!u)throw Error(`Выделите строки в файле`);if(u<l)throw Error(`to: конец диапазона раньше начала`);return await OP(t,c,{from:l,to:u},i.chat,r),{path:c,from:l,to:u}},t=>{let n=b(t);return typeof n.text==`string`?!!n.text.trim():typeof n.path==`string`&&typeof n.from==`number`||!!e.current()},`agent`,{description:`Добавляет чип с выбранными строками файла в поле ввода открытого чата агента, не отправляя сообщение. Без выделения берётся строка под курсором. Целевой чат — видимый, иначе последний, с которым работали; если чатов нет, открывается самый свежий сохранённый или новый чат Projector. Текст выделения не передаётся: агент видит @path:12-34 и читает файл сам. Для визуального редактора Markdown и терминала передайте text: в поле ввода попадёт сам выделенный текст, а source подпишет его источник.`,arguments:{path:`Путь относительно корня проекта; без него — файл активного редактора`,from:`Первая строка диапазона (с 1); без него — строка под курсором`,to:`Последняя строка диапазона; по умолчанию совпадает с from`,text:`Выделенный текст вместо диапазона строк (визуальный редактор Markdown, терминал)`,source:`Подпись источника для text: путь к файлу или название терминала`,chat:`Ключ чата из ide.agent.chats.list; без него — чат в использовании`}}),n(`ide.terminal.selection.toChat`,`Добавить выделение терминала в чат`,async e=>{let n=b(e);if(typeof n.text!=`string`||!n.text.trim())throw Error(`Выделите текст в терминале`);if(n.chat!==void 0&&typeof n.chat!=`string`)throw Error(`chat должен быть строкой`);if(n.source!==void 0&&typeof n.source!=`string`)throw Error(`source должен быть строкой`);return await AP(t,n.text,{chat:n.chat,source:n.source,run:r}),{text:n.text}},e=>{let t=b(e);return typeof t.text==`string`&&!!t.text.trim()},`agent`,{description:`Добавляет выделенный текст терминала в поле ввода открытого чата агента, не отправляя сообщение. Выделение в терминале не связано с файлом, поэтому в поле ввода попадает сам текст; source подписывает, из какого терминала он взят. Целевой чат — видимый, иначе последний, с которым работали; если чатов нет, открывается самый свежий сохранённый или новый чат Projector.`,arguments:{text:`Выделенный текст терминала`,source:`Подпись источника, например «Терминал «zsh»»`,chat:`Ключ чата из ide.agent.chats.list; без него — чат в использовании`}})}function V1(e){let t=We();return{current:t,report(e){t.value={...e}},clear(e){t.value?.path===e&&(t.value=void 0)},add(){t.value&&e?.()}}}var H1=Symbol.for(`projector.editor-selection`);function U1(e=V1()){return ot(H1,e),e}function W1(e){let{editorCommands:t,register:n,tabs:r,active:i,activeKey:a,fileOf:o,saveFile:s,openTab:c}=e,{openFile:l,toggleMarkdownSource:u}=e,d=U1(V1(()=>t.run(`ide.editor.selection.toChat`)));function f(e){let t=b(e);if(t.id!==void 0&&typeof t.id!=`string`)throw Error(`id должен быть строкой`);return r.value.find(e=>!e.virtual&&e.key===(t.id??a()))}function p(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isInteger(e)||e<1)throw Error(`${t}: нужно целое число от 1`);return e}}n(`ide.editor.path.open`,`Открыть файл или папку проекта по пути`,t=>{let n=b(t);if(typeof n.path!=`string`||!n.path)throw Error(`Укажите путь`);if(n.external!==void 0&&typeof n.external!=`boolean`)throw Error(`external должен быть boolean`);let r=p(n.line,`line`),i=p(n.endLine,`endLine`);if(i&&!r)throw Error(`endLine требует line`);if(n.directory===!0){if(n.external===!0)throw Error(`Внешнюю папку нельзя показать в дереве проекта`);e.revealInTree(n.path)}else return e.openFileAt(n.path,r,i,p(n.column,`column`),{external:n.external===!0})},()=>!0,void 0,{description:`Открывает файл проекта во вкладке редактора (или показывает папку в дереве) по пути, относительному корню проекта. Так открываются ссылки на файлы из чата; line и endLine показывают строку или выделяют диапазон. С external: true открывается файл на диске вне проекта.`,arguments:{path:`Путь относительно корня проекта или абсолютный путь при external`,external:`true, если путь — файл на диске вне проекта`,directory:`true, если путь — папка: она будет показана в дереве`,line:`Строка, на которую поставить курсор (с 1)`,endLine:`Последняя строка диапазона: файл откроется с выделением line..endLine`,column:`Столбец курсора (с 1); действует без endLine`}}),B1({projectId:e.projectId,run:(t,n)=>e.editorCommands.scope.executeCommand(t,n),current:()=>d.current.value,register:n}),n(`ide.editor.file.save`,`Сохранить`,async e=>{let t=f(e);if(!await s(t))throw Error(t.saveError||`Не удалось сохранить файл`)},e=>!!f(e)&&l1(f(e)),`write`),n(`ide.editor.file.reloadFromDisk`,`Загрузить файл с диска`,async t=>{await e.reloadFromDisk(f(t))},e=>!!f(e)&&!f(e).readonly,void 0,{description:`Перечитывает файл с диска и отбрасывает несохранённые правки во вкладке. Разрешает конфликт, когда файл изменили снаружи (например, агент), пока он был открыт с правками.`,arguments:{id:`Ключ вкладки; по умолчанию активная вкладка`}}),n(`ide.editor.file.keepMine`,`Оставить мою версию файла`,t=>{e.keepMine(f(t))},e=>f(e)?.conflict?.disk!==void 0,`write`,{description:`При конфликте с изменением на диске оставляет правки во вкладке: следующее сохранение перезапишет версию на диске. Доступна только пока конфликт есть.`,arguments:{id:`Ключ вкладки; по умолчанию активная вкладка`}}),n(`ide.editor.file.reveal`,`Показать в дереве файлов`,t=>{e.revealInTree(f(t).path,f(t).scope)},e=>!!f(e)&&!f(e).external),n(`ide.workbench.tree.reveal`,`Показать в проекте`,t=>{let{path:n}=b(t);if(typeof n!=`string`||!n.trim())throw Error(`Укажите path`);e.revealInTree(n)},()=>!0,void 0,{description:`Открывает боковую панель «Файлы» и показывает в дереве проекта файл или папку по пути относительно корня проекта, раскрывая родительские каталоги.`,arguments:{path:`Путь относительно корня проекта`}}),n(`ide.editor.file.copyRelativePath`,`Копировать относительный путь`,async e=>{await ni(null,f(e).path,`Путь скопирован`)},e=>!!f(e)),n(`ide.editor.markdown.toggleSource`,`Переключить исходник Markdown`,()=>u(),()=>{let e=i();return!!e&&u1(e)});let m=t=>{let n=f(t);return n&&d1(n)&&er(e.projectId,n.path)?n:void 0};n(`ide.editor.html.reload`,`Перезагрузить HTML-страницу`,e=>{let t=m(e);t.htmlReload=(t.htmlReload??0)+1},e=>!!m(e),void 0,{description:`Заново загружает страницу открытого HTML-файла вместе со стилями, скриптами и картинками. Страница читает файлы с диска, поэтому несохранённые правки не видны.`,arguments:{id:`Ключ вкладки; по умолчанию активная вкладка`}}),n(`ide.editor.html.openInBrowser`,`Открыть HTML-страницу в браузере`,t=>{let n=m(t);window.open(er(e.projectId,n.path),`_blank`,`noopener`)},e=>!!m(e),void 0,{description:`Открывает HTML-файл как страницу в новой вкладке браузера: относительные пути разрешаются от его каталога в проекте.`,arguments:{id:`Ключ вкладки; по умолчанию активная вкладка`}});let h=e=>{let t=b(e).id;return r.value.find(e=>e.virtual===`browser`&&e.key===(t??a()))},g=e=>{let t=b(e).url;if(typeof t!=`string`||!t.trim())throw Error(`Укажите адрес страницы`);return P1(t)};n(`ide.workbench.browser.navigate`,`Открыть адрес в браузере`,t=>{let n=g(t),r=h(t);r?(r.params={...r.params,url:n},e.selectTab(r.key)):c(`browser`,{...e.tabTypes.get(`browser`).create(),url:n},{preview:!1}),e.onOpenTab?.()},()=>e.tabTypes.has(`browser`),void 0,{description:`Открывает адрес во вкладке-псевдобраузере: в активной, если она браузерная (или в вкладке с указанным id), иначе в новой. Принимает полный URL, localhost:порт, домен или поисковый запрос. Страницы из интернета загружаются через прокси Projector, localhost и локальная сеть — напрямую.`,arguments:{url:`URL, localhost:порт, домен или поисковый запрос`,id:`Ключ браузерной вкладки; по умолчанию активная браузерная, иначе новая`}}),n(`ide.editor.html.openInBrowserTab`,`Открыть HTML-страницу во вкладке браузера`,t=>{let n=m(t),r=new URL(er(e.projectId,n.path),location.origin).href;c(`browser`,{...e.tabTypes.get(`browser`).create(),url:r,title:n.path},{preview:!1}),e.onOpenTab?.()},t=>!!m(t)&&e.tabTypes.has(`browser`),void 0,{description:`Открывает HTML-файл проекта как страницу во вкладке-псевдобраузере (с адресной строкой и историей) вместо просмотра рядом с кодом.`,arguments:{id:`Ключ вкладки; по умолчанию активная вкладка`}}),n(`ide.editor.file.open`,`Открыть файл`,e=>l(f(e).path),e=>!!f(e)&&f(e).original!==void 0);function _(e){let n=o(e),r=[t.item(`ide.workbench.panel.splitRight`,{id:e},{separator:!0}),t.item(`ide.workbench.panel.splitDown`,{id:e}),t.item(`ide.workbench.panel.hideGroup`,{id:e})];return!n||n.virtual?r:[...n.original===void 0?[]:[t.item(`ide.editor.file.open`,{id:e})],...d1(n)?[t.item(`ide.editor.html.openInBrowserTab`,{id:e},{separator:!0}),t.item(`ide.editor.html.openInBrowser`,{id:e})]:[],t.item(`ide.editor.file.save`,{id:e},{separator:!0}),t.item(`ide.editor.file.reveal`,{id:e}),t.item(`ide.editor.file.copyRelativePath`,{id:e}),...r]}for(let{id:t,command:r,create:i}of e.tabTypes.list())r&&n(r.id,r.title,n=>{let a;if(r.arguments){let e=b(n);a={};for(let t of Object.keys(r.arguments)){let n=e[t];if(typeof n!=`string`||!n)return;a[t]=n}}else{a=i?.();let e=b(n);for(let t of Object.keys(r.optional??{})){let n=e[t];typeof n==`string`&&n&&(a={...a,[t]:n})}}c(t,a),e.onOpenTab?.()},()=>!0,r.requires,{description:r.description,arguments:r.arguments??r.optional});function v(n){let r=e.tabTypes.behaviorOf(i()?.virtual)?.save;r&&(n.ctrlKey||n.metaKey)&&ee(n)===`s`?(n.preventDefault(),n.stopPropagation(),r()):n.target.closest(`[data-own-keys], .terminal-view`)||t.keydown(n)}function y(e){e.target?.closest(`.workspace-tabs, .keybindings-editor, .terminal-view, .network-panel`)||t.scope.activate()}return{tabActions:_,editorKeydown:v,editorFocus:y}}var G1=ZK(`kind`,[KK({kind:aq(`live`)}),KK({kind:aq(`commit`),rev:cK()}),KK({kind:aq(`compare`),from:cK(),to:cK()})]),K1=KK({id:cK(),title:cK(),source:cK().optional(),group:cK().optional(),kind:cK().optional(),params:tq(cK(),BK()).optional(),closable:RK().optional()}),q1=KK({tabs:WK(KK({key:cK(),path:cK(),virtual:cK().optional(),params:tq(cK(),BK()).optional(),commit:cK().optional(),pull:PK().int().positive().optional(),rev:cK().optional(),scope:G1.optional(),originalPath:cK().optional(),external:RK().optional(),staged:RK().optional(),markdownMode:rq([`document`,`source`]).optional()})),sections:WK(K1).optional(),activeKey:cK(),section:cK(),mobileSurface:rq([`editor`,`files`,`terminal`]).optional(),treeWidth:PK().finite().positive().optional(),agentWidth:PK().finite().positive().optional(),sidebarHidden:RK().optional(),layout:BK().optional()});function J1(e){let t=e=>new Set(e.flatMap(e=>{let t=e.params?.scope;return t?[Lr(t)]:[]})),n=uQ(()=>`projector:workspace:v1:${e.projectId()}`,()=>{let n=e.extraSections?.value??[],r=t(n);return{sections:n,tabs:e.tabs.value.filter(e=>!e.localFile&&(s1(e)||!!e.scope&&!pr(e.scope)&&r.has(Lr(e.scope)))).map(e=>({key:e.key,path:e.path,virtual:e.virtual,params:e.params,commit:e.commit,pull:e.pull,scope:e.scope,originalPath:e.originalPath,external:e.external,staged:e.staged,markdownMode:e.markdownMode})),activeKey:e.activeKey.value,section:e.section.value,mobileSurface:e.mobileSurface.value,treeWidth:e.treeWidth.value,sidebarHidden:e.sidebarHidden.value,layout:pI(e.layout.value)}},q1,()=>e.persist&&!e.restoringSession.value),r=0;async function i(t,n){try{for(let i of t?.tabs??[]){if(n!==r)return;if(i.virtual){e.ensureTab(i.virtual,i.params??(i.commit?{hash:i.commit}:void 0));continue}let t=i.pull?await e.openPullFile(i.pull,i.path,i.commit??``,!1):i.commit?await e.openCommitFile(i.commit,i.path,!1):await e.openFile(i.path,void 0,void 0,i.staged,{external:i.external,scope:i.scope??(i.rev?{kind:`commit`,rev:i.rev}:void 0),originalPath:i.originalPath,preview:!1,quiet:!0});if(n!==r||t===void 0||t!==e.fileGeneration())return;let a=e.tabs.value.find(e=>e.key===i.key);a&&(a.markdownMode=i.markdownMode)}n===r&&!gI(t?.layout)&&e.tabs.value.some(e=>e.key===t?.activeKey)&&(e.activeKey.value=t.activeKey)}finally{n===r&&(e.restoringSession.value=!1,await Ut(),n===r&&e.mobile.value&&t?.mobileSurface&&(e.mobileSurface.value=t.mobileSurface===`terminal`&&!e.terminals?`editor`:t.mobileSurface))}}R(()=>e.projectId(),()=>{let t=e.persist?n.read():void 0,a=++r;e.restoringSession.value=!0,e.resetFiles(),e.resetGit(),e.layout.value=gI(t?.layout)??e.initialLayout(),e.restoreSections?.(t?.sections??[]);let o=t=>e.sectionExists?e.sectionExists(t):e.sections.has(t);e.section.value=o(t?.section??``)?t.section:`files`,e.treeWidth.value=t?.treeWidth,e.sidebarHidden.value=!!t?.sidebarHidden,e.reloadGit(),i(t,a)},{immediate:!0}),lt(()=>{++r})}var Y1={},X1={viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`};function Z1(e,t){return V(),q(`svg`,X1,[...t[0]||=[K(`path`,{d:`M5 21V3h14v10H5`},null,-1),K(`path`,{fill:`currentColor`,stroke:`none`,d:`M5 3h4.67v5H5zm9.33 0H19v5h-4.67zM9.67 8h4.66v5H9.67z`},null,-1)]])}var Q1=G(Y1,[[`render`,Z1]]),$1=e=>{try{return e?new URL(e).host:``}catch{return``}},e0=[Jn(`settings`,`settings:app`,`Настройки`,`Настройки Projector`,{subtitle:`настройки Projector`,command:{id:`ide.workbench.settings.open`,title:`Открыть настройки Projector`,description:`Открывает общие настройки Projector во вкладке текущего воркспейса. Повторный вызов фокусирует существующую вкладку; формы сохраняют черновики до её закрытия.`}}),Jn(`keybindings`,`settings:keybindings`,`Горячие клавиши`,`Настройки горячих клавиш`,{subtitle:`настройки IDE`,command:{id:`ide.workbench.keybindings.open`,title:`Открыть горячие клавиши`}}),Jn(`network`,`network:info`,`Локальная сеть`,`Доступ по локальной сети`,{subtitle:`доступ по сети`,command:{id:`ide.workbench.server.network.open`,title:`Показать доступ по локальной сети`}}),cr({id:`browser`,key:({id:e})=>`browser:${e}`,path:({title:e,url:t})=>e||$1(t)||`Браузер`,title:({url:e})=>e||`Браузер`,subtitle:`псевдобраузер`,create:()=>({id:Math.random().toString(36).slice(2,10)}),read:({url:e,title:t})=>({text:`${t?`${t}\n`:``}${e??``}`,note:`Браузер`}),command:{id:`ide.workbench.browser.open`,title:`Открыть браузер`,description:`Открывает новую вкладку-псевдобраузер: адресная строка, история, страницы из интернета (через прокси Projector) и dev-серверы проекта. Для перехода по адресу используйте ide.workbench.browser.navigate.`}}),cr({id:`commit`,key:({hash:e})=>`commit:${e}`,path:({hash:e})=>`Коммит ${e.slice(0,7)}`,title:({hash:e},t)=>`${t?`${t} · `:``}${e}`,hint:({subject:e})=>e??``,read:({hash:e},t)=>({text:t,note:`Обзор коммита ${e}`})})];function t0(e){return e===`local`||e===`lan`}async function n0(e){let t=await fetch(`/api/app/network`,{cache:`no-store`,signal:e}),n=await t.json();if(!t.ok)throw Error(n.error||`Не удалось загрузить доступ по сети`);return n}async function r0(e,t,n){let r=await fetch(`/api/app/network`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({mode:e,password:t}),signal:n}),i=await r.json();if(!r.ok)throw Error(i.error||`Не удалось сохранить доступ по сети`);return i}async function i0(e){try{let t=await fetch(`/api/health`,{cache:`no-store`,signal:AbortSignal.any([e,AbortSignal.timeout(2e3)])}),n=await t.json();return t.ok&&Number.isInteger(n.pid)?n.pid:null}catch{return e.throwIfAborted(),null}}async function a0(e,t){let n=Date.now()+6e4;for(;Date.now()<n;){t.throwIfAborted();let n=await i0(t);if(n!==null&&n!==e)return;await new Promise(e=>setTimeout(e,500))}throw Error(`Сервер не перезапустился за 60 секунд`)}function o0(e){let t=We(null),n=X(`local`),r=X(``),i=X(!1),a=X(``),o=X(``),s=z(()=>t.value!==null),c=z(()=>t.value?.passwordRequired??!1),l=z(()=>t.value?.lanUrl??null),u=!1,d,f=E(`network:${e}:${P()}`,()=>({surface:`network`,view:e,mode:t.value?.mode??``,ready:s.value,busy:i.value,passwordRequired:c.value}));async function p(e){let r=await n0(e);return e.throwIfAborted(),t.value=r,n.value=r.mode,r}async function h(e){if(u||i.value)throw Error(`Операция доступа по сети недоступна`);i.value=!0,a.value=``,o.value=``,d=new AbortController;try{return await e(d.signal)}catch(e){if(u)return;throw a.value=e instanceof Error?e.message:`Не удалось сохранить доступ по сети`,o.value=``,e}finally{d=void 0,u||(i.value=!1)}}async function g(e,n){return h(async i=>{let a=await i0(i);if(i.throwIfAborted(),e!==t.value?.mode&&a===null)throw Error(`Не удалось определить PID сервера перед сменой режима`);let s=await r0(e,n,i);if(i.throwIfAborted(),s.restarted){if(o.value=`Сервер перезапускается…`,a===null)throw Error(`Не удалось определить PID перезапускаемого сервера`);await a0(a,i),i.throwIfAborted(),r.value=``,window.location.reload()}else await p(i),r.value=``,o.value=`Сохранено`;return s})}let _=()=>s.value&&!i.value;return f.scope.registerCommand({id:`ide.network.refresh`,title:`Обновить настройки доступа по сети`,description:`Перечитывает режим, наличие пароля и LAN-адреса; сбрасывает черновик режима.`,enabled:()=>!i.value,run:()=>h(p)}),f.scope.registerCommand({id:`ide.network.save`,title:`Сохранить доступ по сети`,description:`Сохраняет режим local/lan и новый пароль. Без аргументов использует поля текущего экрана; пустое поле сохраняет прежний пароль. Явный password='' удаляет пароль. Смена режима перезапускает сервер и завершает терминалы и дочерние процессы; пароль меняется без рестарта.`,arguments:{mode:`local или lan; без аргумента — режим из текущего экрана`,password:`Новый пароль; без аргумента — непустое поле экрана; пустая строка — убрать пароль`},enabled:_,run:e=>{let t=b(e),i=t.mode??n.value;if(!t0(i))throw Error(`Режим: local или lan`);return g(i,m(t,`password`)??(r.value||void 0))}}),f.scope.registerCommand({id:`ide.network.password.clear`,title:`Убрать пароль доступа по сети`,description:`Удаляет пароль доступа. Сохраняет режим из текущего экрана; если режим изменён, перезапускает сервер и завершает терминалы и дочерние процессы.`,enabled:()=>_()&&c.value,run:()=>g(n.value,``)}),Lt(()=>{h(p).catch(()=>{})}),lt(()=>{u=!0,d?.abort()}),{state:t,mode:n,password:r,busy:i,error:a,status:o,ready:s,passwordRequired:c,lanUrl:l,commands:f}}var s0=G(M({__name:`NetworkSettings`,setup(e){let{mode:n,passwordRequired:o,lanUrl:s,password:c,busy:l,error:u,status:d,ready:f,commands:p}=o0(`settings`),m=P();return(e,h)=>(V(),q(`section`,{class:`network-settings`,onFocusin:h[5]||=e=>H(p).scope.activate(),onPointerdown:h[6]||=e=>H(p).scope.activate(),onKeydown:h[7]||=(...e)=>H(p).keydown&&H(p).keydown(...e)},[I(_,{as:`h2`,size:`sm`},{default:F(()=>[...h[8]||=[N(`Доступ по локальной сети`,-1)]]),_:1}),I(qo,{label:`Режим доступа`,disabled:!H(f)||H(l)},{default:F(({groupName:e})=>[I(Xo,{title:`Только локально`,description:`Сервер слушает localhost и недоступен другим устройствам.`},{default:F(()=>[I(a,{modelValue:H(n),"onUpdate:modelValue":h[0]||=e=>gt(n)?n.value=e:null,type:`radio`,name:e,value:`local`},null,8,[`modelValue`,`name`])]),_:2},1024),I(Xo,{title:`Локальная сеть`,description:`Открывает интерфейс для телефона и других устройств в вашей сети.`},{default:F(()=>[I(a,{modelValue:H(n),"onUpdate:modelValue":h[1]||=e=>gt(n)?n.value=e:null,type:`radio`,name:e,value:`lan`},null,8,[`modelValue`,`name`])]),_:2},1024)]),_:1},8,[`disabled`]),H(n)===`lan`?(V(),q(W,{key:0},[I(Wo,{size:`sm`,tone:`secondary`,"space-before":4,"space-after":2,for:H(m)},{default:F(()=>[...h[9]||=[N(`Пароль доступа (необязательно)`,-1)]]),_:1},8,[`for`]),I(a,{id:H(m),modelValue:H(c),"onUpdate:modelValue":h[2]||=e=>gt(c)?c.value=e:null,type:`password`,autocomplete:`new-password`,placeholder:`Оставьте пустым, чтобы не менять пароль`,disabled:!H(f)||H(l)},null,8,[`id`,`modelValue`,`disabled`]),I(i,{class:`hint`},{default:F(()=>[H(o)?(V(),q(W,{key:0},[N(`Пароль уже задан. Введите новый, чтобы заменить его, или очистите защиту вручную.`)],64)):(V(),q(W,{key:1},[N(`Без пароля любой в локальной сети сможет управлять Projector, включая терминалы.`)],64))]),_:1}),H(s)?(V(),Y(i,{key:0,class:`hint`},{default:F(()=>[h[10]||=N(` Адрес для другого устройства: `,-1),K(`code`,null,j(H(s)),1)]),_:1})):B(``,!0)],64)):B(``,!0),I(r,{class:`actions`,align:`stretch`,wrap:``},{default:F(()=>[I(Q,{appearance:`solid`,disabled:!H(f)||H(l),onClick:h[3]||=e=>H(p).run(`ide.network.save`)},{default:F(()=>[...h[11]||=[N(`Сохранить и перезапустить`,-1)]]),_:1},8,[`disabled`]),H(o)?(V(),Y(Q,{key:0,disabled:!H(f)||H(l),onClick:h[4]||=e=>H(p).run(`ide.network.password.clear`)},{default:F(()=>[...h[12]||=[N(`Убрать пароль`,-1)]]),_:1},8,[`disabled`])):B(``,!0)]),_:1}),H(u)||H(d)?(V(),Y(t,{key:1,role:`status`,tone:H(u)?`danger`:void 0},{default:F(()=>[N(j(H(u)||H(d)),1)]),_:1},8,[`tone`])):B(``,!0)],32))}}),[[`__scopeId`,`data-v-7bfae3bc`]]),c0={class:`summary`},l0=[`disabled`,`onClick`],u0=G(M({__name:`LanInfoPanel`,setup(e){let{state:n,password:o,busy:s,status:c,error:u,commands:d}=o0(`panel`);ui(()=>{let e=`Локальная сеть`,t=n.value;return t?{note:e,text:vi(`Режим: ${t.mode===`lan`?`Локальная сеть`:`Только localhost`}`,`Пароль: ${t.passwordRequired?`задан`:`не задан`}`,t.mode===`lan`?t.lanUrls.length?`Адреса: ${t.lanUrls.join(`, `)}`:`Адреса: нет`:`Сервер доступен только на этой машине`,s.value&&`Состояние: выполняется…`,c.value&&`Состояние: ${c.value}`,u.value&&`Ошибка: ${u.value}`)}:{note:e,text:vi(`Загрузка…`,s.value&&`Состояние: выполняется…`,u.value&&`Ошибка: ${u.value}`)}});let f=P();async function p(e){u.value=``,c.value=``;try{await navigator.clipboard.writeText(e),c.value=`Адрес скопирован`}catch{throw u.value=`Не удалось скопировать адрес`,Error(u.value)}}return d.scope.registerCommand({id:`ide.network.address.copy`,title:`Скопировать LAN-адрес Projector`,description:`Копирует один из текущих LAN-адресов в буфер обмена. Без address использует первый адрес.`,arguments:{address:`Один из LAN-адресов текущего сервера`},enabled:()=>!s.value&&n.value?.mode===`lan`&&!!n.value.lanUrls.length,run:e=>{let{address:t=n.value?.lanUrls[0]}=b(e);if(typeof t!=`string`||!n.value?.lanUrls.includes(t))throw Error(`Выберите LAN-адрес сервера`);return p(t)}}),(e,p)=>(V(),q(`div`,{class:`network-panel`,onFocusin:p[3]||=e=>H(d).scope.activate(),onPointerdown:p[4]||=e=>H(d).scope.activate(),onKeydown:p[5]||=(...e)=>H(d).keydown&&H(d).keydown(...e)},[H(n)?(V(),q(W,{key:1},[K(`dl`,c0,[I(l,{as:`div`,appearance:`frame`},{default:F(()=>[p[7]||=K(`dt`,null,`Режим`,-1),K(`dd`,null,j(H(n).mode===`lan`?`Локальная сеть`:`Только localhost`),1)]),_:1}),I(l,{as:`div`,appearance:`frame`},{default:F(()=>[p[8]||=K(`dt`,null,`Пароль`,-1),K(`dd`,null,j(H(n).passwordRequired?`Задан`:`Не задан`),1)]),_:1})]),I(_,{as:`h3`,size:`sm`,"space-after":2,class:`section-heading`},{default:F(()=>[...p[9]||=[N(`Адреса`,-1)]]),_:1}),H(n).mode===`lan`&&H(n).lanUrls.length?(V(),Y(ml,{key:0,as:`ul`,flow:`flex`,gap:2,class:`addresses`},{default:F(()=>[(V(!0),q(W,null,J(H(n).lanUrls,e=>(V(),Y(r,{as:`li`,gap:3,justify:`between`,key:e},{default:F(()=>[K(`code`,null,j(e),1),K(`button`,{disabled:H(s),onClick:t=>H(d).run(`ide.network.address.copy`,{address:e})},` копировать `,8,l0)]),_:2},1024))),128))]),_:1})):(V(),Y(t,{key:1,tone:`muted`,size:`sm`,class:`muted`},{default:F(()=>[N(j(H(n).mode===`lan`?`Адреса сети не найдены`:`Сервер доступен только на этой машине`),1)]),_:1})),I(_,{as:`h3`,size:`sm`,"space-after":2,class:`section-heading`},{default:F(()=>[I(Wo,{inline:``,for:H(f)},{default:F(()=>[...p[10]||=[N(`Пароль доступа`,-1)]]),_:1},8,[`for`])]),_:1}),I(r,{class:`password-row`,align:`normal`,justify:`normal`},{default:F(()=>[I(a,{grow:``,id:H(f),modelValue:H(o),"onUpdate:modelValue":p[0]||=e=>gt(o)?o.value=e:null,type:`password`,autocomplete:`new-password`,placeholder:`Новый пароль`,disabled:H(s)},null,8,[`id`,`modelValue`,`disabled`]),I(Q,{appearance:`solid`,disabled:H(s)||!H(o),onClick:p[1]||=e=>H(d).run(`ide.network.save`)},{default:F(()=>[...p[11]||=[N(`Сохранить`,-1)]]),_:1},8,[`disabled`]),H(n).passwordRequired?(V(),Y(Q,{key:0,disabled:H(s),onClick:p[2]||=e=>H(d).run(`ide.network.password.clear`)},{default:F(()=>[...p[12]||=[N(`Убрать`,-1)]]),_:1},8,[`disabled`])):B(``,!0)]),_:1}),H(n).passwordRequired?(V(),Y(i,{key:2,class:`hint`},{default:F(()=>[...p[13]||=[N(`Пароль задан. Введите новый, чтобы заменить, или нажмите «Убрать».`,-1)]]),_:1})):(V(),Y(i,{key:3,class:`hint`},{default:F(()=>[...p[14]||=[N(`Без пароля любой в локальной сети сможет управлять Projector, включая терминалы.`,-1)]]),_:1}))],64)):(V(),Y(t,{key:0,tone:`muted`,size:`sm`,class:`muted`},{default:F(()=>[...p[6]||=[N(`Загрузка…`,-1)]]),_:1})),H(u)||H(c)?(V(),Y(t,{key:2,role:`status`,size:`xs`,class:`network-message`,tone:H(u)?`danger`:void 0},{default:F(()=>[N(j(H(u)||H(c)),1)]),_:1},8,[`tone`])):B(``,!0)],32))}}),[[`__scopeId`,`data-v-3ce5bf90`]]);async function d0(e){let t=await fetch(`/api/openai`,{cache:`no-store`,signal:e}),n=await t.json();if(!t.ok)throw Error(n.error||`Не удалось загрузить настройки OpenAI API`);return n}async function f0(e,t){let n=await fetch(`/api/openai`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e),signal:t}),r=await n.json();if(!n.ok)throw Error(r.error||`Не удалось сохранить настройки OpenAI API`);return r}function p0(){let e=We(null),t=X(``),n=X(``),r=X(!1),i=X(``),a=z(()=>e.value!==null),o=z(()=>e.value?.enabled??!1),s=z(()=>e.value?.hasKey??!1),c=z(()=>e.value?.origins??[]),l=z(()=>e.value?`${window.location.origin}${e.value.baseUrl}`:``),u=!1,d,f=E(`openai-gateway:${P()}`,()=>({surface:`openaiGateway`,ready:a.value,busy:r.value,enabled:o.value,hasKey:s.value,origins:c.value.length})),p=e=>e.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean),h=e=>e.filter(e=>!e.startsWith(`@`)),g=()=>c.value.filter(e=>e.startsWith(`@`)),_=e=>c.value.includes(e),v=()=>n.value.trim()!==h(c.value).join(`
|
|
161
|
+
`),y=z(()=>v());async function x(a){if(u||r.value)throw Error(`Операция OpenAI API недоступна`);r.value=!0,i.value=``,d=new AbortController;try{let r=await a(d.signal);return u||(e.value=r,t.value=``,n.value=h(r.origins).join(`
|
|
162
|
+
`)),r}catch(e){throw u||(i.value=e instanceof Error?e.message:`Ошибка OpenAI API`),e}finally{d=void 0,u||(r.value=!1)}}f.scope.registerCommand({id:`ide.openai.gateway.refresh`,title:`Обновить настройки OpenAI-совместимого API`,description:`Перечитывает состояние API, которым другие приложения на машине пользуются провайдерами Projector.`,enabled:()=>!r.value,run:()=>x(d0)}),f.scope.registerCommand({id:`ide.openai.gateway.set`,title:`Настроить OpenAI-совместимый API`,description:`Включает или выключает OpenAI-совместимый API Projector и задаёт ключ доступа (Bearer). Включённый API тратит квоту провайдеров; страницы других сайтов он принимает только из белого списка origins (по умолчанию пуст), без ключа — любому локальному процессу. Без аргументов сохраняет поле ключа экрана, а при пустом поле переключает состояние.`,arguments:{enabled:`true — включить, false — выключить; без аргумента состояние не меняется`,apiKey:`Новый ключ; пустая строка — убрать ключ; без аргумента ключ не меняется`,origins:`Массив origin страниц, которым разрешено вызывать API из браузера, например ["https://app.example.com"]; [] — очистить; без аргумента список не меняется`},enabled:()=>a.value&&!r.value,run:e=>{let r=b(e);if(r.enabled!==void 0&&typeof r.enabled!=`boolean`)throw Error(`enabled: boolean`);let i={};r.enabled!==void 0&&(i.enabled=r.enabled);let a=Object.keys(r).length===0&&t.value.trim()||void 0;Object.keys(r).length===0&&v()&&(i.origins=[...g(),...p(n.value)]);let s=m(r,`apiKey`)??a;if(s!==void 0&&(i.apiKey=s),r.origins!==void 0){if(!Array.isArray(r.origins)||r.origins.some(e=>typeof e!=`string`))throw Error(`origins: массив строк`);i.origins=r.origins}return Object.keys(i).length===0&&(i.enabled=!o.value),x(e=>f0(i,e))}}),Lt(()=>{x(d0).catch(()=>{})}),lt(()=>{u=!0,d?.abort()});let S=()=>[...g(),...p(n.value)];function C(e,t){let n=c.value.filter(t=>t!==e);return f.run(`ide.openai.gateway.set`,{origins:t?[...n,e]:n})}return{enabled:o,hasKey:s,apiKey:t,originsDraft:n,originsDirty:y,draftOrigins:S,hasTemplate:_,toggleTemplate:C,url:l,busy:r,error:i,ready:a,commands:f}}var m0=G(M({__name:`OpenAiGatewaySettings`,setup(e){let{enabled:n,hasKey:o,apiKey:s,originsDraft:c,originsDirty:l,draftOrigins:u,hasTemplate:d,toggleTemplate:f,url:p,busy:m,error:h,ready:g,commands:v}=p0(),y=P(),b=P();return(e,x)=>(V(),q(`section`,{class:`gateway-settings`,onFocusin:x[8]||=e=>H(v).scope.activate(),onPointerdown:x[9]||=e=>H(v).scope.activate()},[I(_,{as:`h2`,size:`sm`},{default:F(()=>[...x[10]||=[N(`OpenAI-совместимый API`,-1)]]),_:1}),I(qo,{label:`Состояние`,disabled:!H(g)||H(m)},{default:F(()=>[I(Xo,{title:`Разрешить другим приложениям`,description:`Приложения на этой машине смогут обращаться к провайдерам Projector как к обычному OpenAI API.`},{default:F(()=>[I(a,{type:`checkbox`,"model-value":H(n),"onUpdate:modelValue":x[0]||=e=>H(v).run(`ide.openai.gateway.set`,{enabled:e})},null,8,[`model-value`])]),_:1})]),_:1},8,[`disabled`]),H(n)?(V(),q(W,{key:0},[I(i,{class:`hint`},{default:F(()=>[x[11]||=N(` Базовый адрес: `,-1),K(`code`,null,j(H(p)),1),x[12]||=N(`. Запросы тратят квоту провайдеров; страницы других сайтов он не принимает, если их origin не в списке ниже. `,-1)]),_:1}),I(Wo,{size:`sm`,tone:`secondary`,"space-before":4,"space-after":2,for:H(y)},{default:F(()=>[...x[13]||=[N(`Ключ доступа (необязательно)`,-1)]]),_:1},8,[`for`]),I(a,{id:H(y),modelValue:H(s),"onUpdate:modelValue":x[1]||=e=>gt(s)?s.value=e:null,type:`password`,autocomplete:`new-password`,placeholder:H(o)?`Ключ задан; введите новый, чтобы заменить`:`Без ключа`,disabled:!H(g)||H(m)},null,8,[`id`,`modelValue`,`placeholder`,`disabled`]),I(i,{class:`hint`},{default:F(()=>[...x[14]||=[N(` Клиент передаёт его как `,-1),K(`code`,null,`Authorization: Bearer …`,-1),N(` (в поле API key). Без ключа API открыт любому локальному процессу. `,-1)]]),_:1}),I(qo,{label:`Страницы в браузере`,disabled:!H(g)||H(m)},{default:F(()=>[I(Xo,{title:`Любая страница этой машины`,description:`localhost, 127.0.0.1, ::1 на любом порту: локальные dev-серверы и приложения.`},{default:F(()=>[I(a,{type:`checkbox`,"model-value":H(d)(`@localhost`),"onUpdate:modelValue":x[2]||=e=>H(f)(`@localhost`,e)},null,8,[`model-value`])]),_:1}),I(Xo,{title:`Любая страница локальной сети`,description:`Адреса 10.x, 172.16–31.x, 192.168.x, link-local и имена *.local.`},{default:F(()=>[I(a,{type:`checkbox`,"model-value":H(d)(`@lan`),"onUpdate:modelValue":x[3]||=e=>H(f)(`@lan`,e)},null,8,[`model-value`])]),_:1})]),_:1},8,[`disabled`]),I(Wo,{size:`sm`,tone:`secondary`,"space-before":4,"space-after":2,for:H(b)},{default:F(()=>[...x[15]||=[N(`Другие разрешённые origin (по одному в строке)`,-1)]]),_:1},8,[`for`]),I(a,{id:H(b),modelValue:H(c),"onUpdate:modelValue":x[4]||=e=>gt(c)?c.value=e:null,as:`textarea`,rows:`3`,spellcheck:`false`,placeholder:`https://app.example.com`,disabled:!H(g)||H(m)},null,8,[`id`,`modelValue`,`disabled`]),I(i,{class:`hint`},{default:F(()=>[...x[16]||=[N(` Только сайты, которым вы доверяете: их страницы смогут тратить квоту провайдеров из вашего браузера. Пустой список — ни один сайт. `,-1)]]),_:1}),I(r,{class:`actions`,align:`stretch`,wrap:``},{default:F(()=>[I(Q,{appearance:`solid`,disabled:!H(g)||H(m)||!H(s).trim(),onClick:x[5]||=e=>H(v).run(`ide.openai.gateway.set`)},{default:F(()=>[...x[17]||=[N(`Сохранить ключ`,-1)]]),_:1},8,[`disabled`]),I(Q,{disabled:!H(g)||H(m)||!H(l),onClick:x[6]||=e=>H(v).run(`ide.openai.gateway.set`,{origins:H(u)()})},{default:F(()=>[...x[18]||=[N(`Сохранить origin`,-1)]]),_:1},8,[`disabled`]),H(o)?(V(),Y(Q,{key:0,disabled:!H(g)||H(m),onClick:x[7]||=e=>H(v).run(`ide.openai.gateway.set`,{apiKey:``})},{default:F(()=>[...x[19]||=[N(`Убрать ключ`,-1)]]),_:1},8,[`disabled`])):B(``,!0)]),_:1})],64)):B(``,!0),H(h)?(V(),Y(t,{key:1,role:`status`,tone:`danger`},{default:F(()=>[N(j(H(h)),1)]),_:1})):B(``,!0)],32))}}),[[`__scopeId`,`data-v-703bed86`]]),h0;function g0(){return h0??=fetch(`/api/browser/session`,{cache:`no-store`}).then(async e=>{let t=await e.json();if(!e.ok||typeof t.key!=`string`)throw Error(t.error||`Прокси браузера недоступен`);return t.key}).catch(e=>{throw h0=void 0,e}),h0}var _0={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function v0(e,t){return V(),q(`svg`,_0,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 12h14m-7-7l7 7l-7 7`},null,-1)]])}var y0=U({name:`lucide-arrow-right`,render:v0}),b0={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function x0(e,t){return V(),q(`svg`,b0,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`}),K(`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`}),K(`path`,{d:`M6 6h.01M6 18h.01`})],-1)]])}var S0=U({name:`lucide-server`,render:x0}),C0={key:0,class:`note error`,role:`alert`},w0={key:1,class:`note error`,role:`alert`},T0={key:2,class:`note`},E0={key:3,class:`note`},D0={class:`stage`},O0=[`src`,`title`,`sandbox`],k0={key:1,class:`start`},A0=G(M({__name:`BrowserPanel`,props:{projectId:{},url:{}},emits:[`navigate`],setup(e,{emit:t}){let n=e,r=t,i=X(n.url?[n.url]:[]),o=X(n.url?0:-1),s=z(()=>i.value[o.value]??``),c=X(s.value),l=X(``),u=X(`auto`),d=X(0),f=X(),p=X(``),{projects:m}=Oc(),h=z(()=>m.value.find(e=>e.id===n.projectId)?.runtime?.url??``),g=z(()=>u.value===`auto`?!F1(s.value):u.value===`on`),_=I1(location.hostname),v=z(()=>g.value&&_),y=X(``),b=X(``);Lt(()=>{_&&g0().then(e=>y.value=e,e=>b.value=e.message)});let x=z(()=>s.value?v.value?y.value?R1(s.value,L1(y.value,location.port))??s.value:`about:blank`:s.value:`about:blank`),S=z(()=>{let e=`allow-scripts allow-forms allow-popups allow-modals`;if(v.value)return`${e} allow-same-origin`;try{return new URL(s.value).origin===location.origin?e:`${e} allow-same-origin`}catch{return e}});function C(e,t=!1){p.value=``;let n;try{n=P1(e)}catch{p.value=`Некорректный адрес`;return}n&&(n===s.value?d.value++:(t&&o.value>=0?i.value[o.value]=n:(i.value=[...i.value.slice(0,o.value+1),n],o.value=i.value.length-1),c.value=n,l.value=``,r(`navigate`,n,``)))}function w(e){let t=o.value+e;t<0||t>=i.value.length||(o.value=t,c.value=s.value,l.value=``,r(`navigate`,s.value,``))}Ql(window,`message`,e=>{if(e.source!==f.value?.contentWindow)return;let t=e.data;if(!t?.projectorBrowser||typeof t.url!=`string`)return;t.url!==s.value&&(i.value=[...i.value.slice(0,o.value+1),t.url],o.value=i.value.length-1,c.value=t.url);let n=typeof t.title==`string`?t.title.slice(0,200):``;n!==l.value&&(l.value=n,r(`navigate`,t.url,n))}),R(()=>n.url,e=>{e&&e!==s.value&&C(e)});function T(){s.value&&window.open(s.value,`_blank`,`noopener`)}ui(()=>({note:`Браузер`,text:vi(s.value?`Адрес: ${s.value}`:`Адрес не задан`,l.value&&`Заголовок: ${l.value}`,s.value&&`Режим: ${v.value?`через прокси Projector`:`напрямую`}`,b.value&&`Ошибка прокси: ${b.value}`,h.value&&`Dev-сервер проекта: ${h.value}`)}));let ee=z(()=>{try{return new URL(s.value).host}catch{return``}});return(e,t)=>(V(),Y(Wr,{class:`browser`,"aria-label":`Браузер`},{default:F(()=>[I(Zf,{as:`form`,class:`bar`,onSubmit:t[7]||=Z(e=>C(c.value),[`prevent`])},{default:F(()=>[I(Q,{shape:`icon`,size:`sm`,type:`button`,"aria-label":`Назад`,title:`Назад`,disabled:o.value<=0,onClick:t[0]||=e=>w(-1)},{default:F(()=>[I(H(iO),{"aria-hidden":`true`})]),_:1},8,[`disabled`]),I(Q,{shape:`icon`,size:`sm`,type:`button`,"aria-label":`Вперёд`,title:`Вперёд`,disabled:o.value>=i.value.length-1,onClick:t[1]||=e=>w(1)},{default:F(()=>[I(H(y0),{"aria-hidden":`true`})]),_:1},8,[`disabled`]),I(Q,{shape:`icon`,size:`sm`,type:`button`,"aria-label":`Перезагрузить страницу`,title:`Перезагрузить страницу`,disabled:!s.value,onClick:t[2]||=e=>d.value++},{default:F(()=>[I(H($T),{"aria-hidden":`true`})]),_:1},8,[`disabled`]),I(a,{modelValue:c.value,"onUpdate:modelValue":t[3]||=e=>c.value=e,class:`address`,type:`text`,spellcheck:`false`,autocomplete:`off`,"aria-label":`Адрес страницы`,placeholder:`Адрес, localhost:3000 или поисковый запрос`,onFocus:t[4]||=e=>e.target.select()},null,8,[`modelValue`]),h.value?(V(),Y(Q,{key:0,size:`sm`,type:`button`,title:`Открыть dev-сервер проекта`,onClick:t[5]||=e=>C(h.value)},{default:F(()=>[I(H(S0),{"aria-hidden":`true`}),t[9]||=N(` Dev-сервер `,-1)]),_:1})):B(``,!0),I(a,{as:`select`,modelValue:u.value,"onUpdate:modelValue":t[6]||=e=>u.value=e,"aria-label":`Режим загрузки`,title:`Как загружать страницу`},{default:F(()=>[...t[10]||=[K(`option`,{value:`auto`},`Авто`,-1),K(`option`,{value:`on`},`Через прокси`,-1),K(`option`,{value:`off`},`Напрямую`,-1)]]),_:1},8,[`modelValue`]),I(Q,{shape:`icon`,size:`sm`,type:`button`,"aria-label":`Открыть во внешнем браузере`,title:`Открыть во внешнем браузере`,disabled:!s.value,onClick:T},{default:F(()=>[I(H(bi),{"aria-hidden":`true`})]),_:1},8,[`disabled`])]),_:1}),p.value?(V(),q(`p`,C0,j(p.value),1)):b.value?(V(),q(`p`,w0,j(b.value),1)):s.value&&g.value&&!H(_)?(V(),q(`p`,T0,` Прокси работает, только когда Projector открыт на этом компьютере (localhost). Страница загружается напрямую и откроется, если сайт разрешает встраивание. `)):s.value&&u.value===`off`&&!H(F1)(s.value)?(V(),q(`p`,E0,` Напрямую страница откроется, только если сайт разрешает встраивание. Иначе выберите «Авто». `)):B(``,!0),K(`div`,D0,[s.value?(V(),q(`iframe`,{key:`${d.value}:${x.value}:${S.value}`,ref_key:`frame`,ref:f,class:`page`,src:x.value,title:l.value||ee.value,sandbox:S.value,referrerpolicy:`no-referrer`},null,8,O0)):(V(),q(`div`,k0,[t[11]||=K(`p`,null,`Введите адрес сайта или dev-сервера проекта.`,-1),h.value?(V(),Y(Q,{key:0,size:`sm`,onClick:t[8]||=e=>C(h.value)},{default:F(()=>[I(H(S0),{"aria-hidden":`true`}),N(` `+j(h.value),1)]),_:1})):B(``,!0)]))])]),_:1}))}}),[[`__scopeId`,`data-v-e15f9a23`]]),j0={class:`archive-summary`},M0={class:`entry-path`},N0={key:0},P0={class:`entry-size`},F0=G(M({__name:`ArchiveViewer`,props:{archive:{}},setup(e){let n=e,r=X(``),i=z(()=>{let e=r.value.trim().toLocaleLowerCase();return n.archive.entries.filter(t=>t.path.toLocaleLowerCase().includes(e))}),o=z(()=>n.archive.entries.reduce((e,t)=>e+t.size,0)),s={file:`Файл`,directory:`Папка`,symlink:`Символическая ссылка`,hardlink:`Жёсткая ссылка`,other:`Другая запись`};function c(e){if(!e)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?`—`:t.toLocaleString(`ru-RU`)}return(n,l)=>(V(),Y(ml,{as:`section`,flow:`flex`,class:`archive-viewer`,"aria-label":`Содержимое архива`},{default:F(()=>[K(`div`,j0,[K(`strong`,null,j(e.archive.format),1),K(`span`,null,`Архив: `+j(H(aZ)(e.archive.size)),1),K(`span`,null,j(e.archive.entries.length)+j(e.archive.truncated?`+`:``)+` записей`,1),K(`span`,null,j(e.archive.truncated?`Размер показанных записей`:`Размер содержимого`)+`: `+j(H(aZ)(o.value)),1)]),I(a,{modelValue:r.value,"onUpdate:modelValue":l[0]||=e=>r.value=e,type:`search`,placeholder:`Фильтр по пути…`,"aria-label":`Фильтр содержимого архива`},null,8,[`modelValue`]),e.archive.truncated?(V(),Y(t,{key:0,tone:`muted`,size:`xs`,flush:``,role:`status`},{default:F(()=>[...l[1]||=[N(` Показана часть содержимого: достигнут лимит 5000 записей или 256 МБ чтения. `,-1)]]),_:1})):B(``,!0),I(Lu,{class:`archive-list`},{default:F(()=>[i.value.length?(V(),Y(Ru,{key:0,padding:`10px`,align:`top`,sticky:``},{default:F(()=>[l[2]||=K(`thead`,null,[K(`tr`,null,[K(`th`,{scope:`col`},`Путь`),K(`th`,{scope:`col`},`Тип`),K(`th`,{scope:`col`},`Размер`),K(`th`,{scope:`col`},`Изменён`)])],-1),K(`tbody`,null,[(V(!0),q(W,null,J(i.value,(e,t)=>(V(),q(`tr`,{key:t},[K(`td`,M0,[K(`span`,null,j(e.path),1),e.link?(V(),q(`small`,N0,`→ `+j(e.link),1)):B(``,!0)]),K(`td`,null,j(s[e.type]),1),K(`td`,P0,j(e.type===`file`?H(aZ)(e.size):`—`),1),K(`td`,null,j(c(e.modified)),1)]))),128))])]),_:1})):(V(),Y(nd,{key:1,density:`compact`,align:`start`},{default:F(()=>[N(j(e.archive.entries.length?`Совпадений нет`:e.archive.truncated?`Записи недоступны в пределах лимита просмотра`:`Архив пуст`),1)]),_:1}))]),_:1})]),_:1}))}}),[[`__scopeId`,`data-v-4d47ef66`]]),I0={key:0,class:`note`},L0=[`id`],R0=100,z0=60,B0=G(M({__name:`CommitFileDiff`,props:{comparison:{},path:{},height:{}},emits:[`resize`,`collapse`],setup(e,{emit:t}){let n=Nt(()=>yi(()=>import(`./CodeViewer-C-C3aibO.js`),__vite__mapDeps([11,1,4,12,3,5,6,7,13,14,8,9,15,16,17]))),r=e,i=t,a=()=>Math.round(window.innerHeight*.85),o=()=>{let{original:e,modified:t}=r.comparison,n=Math.max(e.split(`
|
|
163
|
+
`).length,t.split(`
|
|
164
|
+
`).length);return Math.min(420,Math.max(110,n*20+76))},s=X(r.height??o()),c=0,l=z(()=>r.comparison.original===r.comparison.modified);function u(e){return e<z0?(i(`resize`,s.value),i(`collapse`),d.stop(),!1):(s.value=Math.min(a(),Math.max(R0,e)),i(`resize`,s.value),!0)}let d=bI({start:e=>(c=s.value,{height:s.value,y:e.clientY}),move:(e,t)=>u(t.height+e.clientY-t.y),finish:(e,t)=>{e===`cancel`&&(s.value=t.height,i(`resize`,t.height))}}),{dragging:f,start:p}=d;function m(e){[`ArrowUp`,`ArrowDown`,`Home`,`End`,`Escape`].includes(e.key)&&(e.preventDefault(),e.key===`Escape`?(f.value&&(s.value=c,i(`resize`,c)),d.stop()):e.key===`Home`?u(0):e.key===`End`?u(a()):u(s.value+(e.shiftKey?96:24)*(e.key===`ArrowDown`?1:-1)))}function h(){s.value=o(),i(`resize`,s.value)}return(t,r)=>l.value?(V(),q(`p`,I0,`Содержимое не изменилось.`)):(V(),q(`div`,{key:1,class:O([`file-diff`,{dragging:H(f)}])},[K(`div`,{id:`diff-${e.path}`,class:`viewer`,style:k({height:`${s.value}px`})},[I(H(n),{path:e.path,content:e.comparison.modified,original:e.comparison.original,"original-label":e.comparison.parent||`∅`,"modified-label":H(mi)(e.comparison.hash)},null,8,[`path`,`content`,`original`,`original-label`,`modified-label`])],12,L0),I(PF,{class:`resize`,"aria-label":`Высота кода: ${e.path}`,"aria-valuenow":s.value,"aria-valuemin":R0,"aria-valuemax":a(),"aria-valuetext":`${s.value} px`,"aria-controls":`diff-${e.path}`,title:`Высота кода · если сжать до минимума, файл сворачивается · двойной клик возвращает размер`,tabindex:`0`,onPointerdown:H(p),onDblclick:h,onKeydown:m},null,8,[`aria-label`,`aria-valuenow`,`aria-valuemax`,`aria-valuetext`,`aria-controls`,`onPointerdown`])],2))}}),[[`__scopeId`,`data-v-d881ea9c`]]),V0={class:`file-row`},H0=[`disabled`,`aria-expanded`,`title`,`data-command`],U0={class:`glyph`,"aria-hidden":`true`},W0={class:`name`},G0={class:`dir u-truncate`},K0={key:0,class:`muted`},q0={key:1,class:`muted`},J0={key:2,class:`muted`},Y0={key:0,class:`bar`,"aria-hidden":`true`},X0={class:`add`},Z0={class:`del`},Q0={key:0,class:`inline`},$0=G(M({__name:`ChangedFileRow`,props:{file:{},expanded:{type:Boolean},diff:{},height:{},toggleCommand:{},openCommand:{},host:{}},emits:[`toggle`,`open`,`resize`],setup(e,{emit:t}){let n=e,r=t,a=z(()=>{let e=n.diff?.data;return e?e.tooLarge?`Файл слишком большой для diff. Откройте его на ${n.host??`хостинге`}.`:e.binary?`Бинарный файл: diff не показывается.`:``:``});return(t,n)=>(V(),q(`li`,null,[K(`div`,V0,[K(`button`,{type:`button`,class:`file`,disabled:!e.file.expandable,"aria-expanded":e.file.expandable?e.expanded:void 0,title:e.file.disabledTitle,"data-command":e.toggleCommand,onClick:n[0]||=e=>r(`toggle`)},[K(`span`,U0,[e.file.expandable?(V(),Y(H(of),{key:0,class:O({open:e.expanded})},null,8,[`class`])):B(``,!0)]),K(`b`,{class:O([`status`,e.file.mark])},j(e.file.mark),3),I(H(HR),{icon:e.file.icon},null,8,[`icon`]),K(`span`,W0,j(e.file.name),1),K(`span`,G0,[e.file.previousPath?(V(),q(W,{key:0},[N(j(e.file.previousPath)+` → `,1)],64)):B(``,!0),N(j(e.file.directory),1)]),e.file.binary?(V(),q(`span`,K0,`бинарный`)):e.file.tooLarge?(V(),q(`span`,q0,`большой`)):e.file.generated?(V(),q(`span`,J0,`сгенерирован`)):(V(),q(W,{key:3},[e.file.additions+e.file.deletions?(V(),q(`span`,Y0,[K(`i`,{style:k({width:`${e.file.share*100}%`})},null,4)])):B(``,!0),K(`span`,X0,`+`+j(e.file.additions),1),K(`span`,Z0,`−`+j(e.file.deletions),1)],64))],8,H0),e.file.openable?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,title:`Открыть изменения во вкладке`,"aria-label":`Открыть изменения во вкладке: ${e.file.path}`,"data-command":e.openCommand,onClick:n[1]||=e=>r(`open`)},{default:F(()=>[I(H(bi),{"aria-hidden":`true`})]),_:1},8,[`aria-label`,`data-command`])):B(``,!0)]),e.expanded?(V(),q(`div`,Q0,[e.diff?.loading?(V(),Y(i,{key:0,size:`xs`,leading:`inherit`,class:`note`,role:`status`},{default:F(()=>[...n[4]||=[N(`загрузка…`,-1)]]),_:1})):e.diff?.error?(V(),Y(i,{key:1,size:`xs`,leading:`inherit`,class:`note error`,role:`alert`},{default:F(()=>[N(j(e.diff.error),1)]),_:1})):a.value?(V(),Y(i,{key:2,size:`xs`,leading:`inherit`,class:`note`},{default:F(()=>[N(j(a.value),1)]),_:1})):e.diff?.data?(V(),Y(B0,{key:3,comparison:e.diff.data,path:e.file.path,height:e.height,onResize:n[2]||=e=>r(`resize`,e),onCollapse:n[3]||=e=>r(`toggle`,!1)},null,8,[`comparison`,`path`,`height`])):B(``,!0)])):B(``,!0)]))}}),[[`__scopeId`,`data-v-667dac5f`]]),e2={class:`add`},t2={class:`del`},n2={key:2,class:`files`},r2=G(M({__name:`CommitFiles`,props:{detail:{},expanded:{},heights:{},diffs:{}},emits:[`toggle`,`toggleAll`,`openDiff`,`resize`],setup(e,{emit:t}){let n=e,r=t,{resolver:a}=Vq(),o=z(()=>n.detail.files.filter(e=>!e.binary)),s=z(()=>n.detail.files.map(e=>{let t=e.path.split(`/`).at(-1);return{path:e.path,name:t,directory:e.path.split(`/`).slice(0,-1).join(`/`),icon:a.value.resolve({name:t,path:e.path,directory:!1},!1),previousPath:e.originalPath,mark:e.status,additions:e.additions,deletions:e.deletions,binary:e.binary,expandable:!e.binary,openable:!e.binary,disabledTitle:e.binary?`Бинарный файл`:`Показать код`,share:e.additions+e.deletions?e.additions/(e.additions+e.deletions):0}}));return(t,n)=>(V(),q(`div`,null,[K(`h3`,null,[n[1]||=N(` Файлы `,-1),K(`span`,null,j(s.value.length),1),K(`b`,e2,`+`+j(e.detail.additions),1),K(`b`,t2,`−`+j(e.detail.deletions),1),o.value.length?(V(),Y(Q,{key:0,size:`sm`,class:`all`,"data-command":`ide.git.commit.files.toggleAll`,onClick:n[0]||=e=>r(`toggleAll`)},{default:F(()=>[N(j(e.expanded.size?`Свернуть всё`:`Развернуть всё`),1)]),_:1})):B(``,!0)]),e.detail.parents.length>1?(V(),Y(i,{key:0,size:`xs`,leading:`inherit`,"space-after":2,class:`note`},{default:F(()=>[...n[2]||=[N(` Слияние: показаны изменения относительно первого родителя. `,-1)]]),_:1})):B(``,!0),s.value.length?(V(),q(`ul`,n2,[(V(!0),q(W,null,J(s.value,t=>(V(),Y($0,{key:t.path,file:t,expanded:e.expanded.has(t.path),diff:e.diffs[t.path],height:e.heights[t.path],"toggle-command":`ide.git.commit.file.toggle`,"open-command":`ide.git.commit.openDiff`,onToggle:e=>r(`toggle`,t.path,e),onOpen:e=>r(`openDiff`,t.path),onResize:e=>r(`resize`,t.path,e)},null,8,[`file`,`expanded`,`diff`,`height`,`onToggle`,`onOpen`,`onResize`]))),128))])):(V(),Y(i,{key:1,size:`xs`,leading:`inherit`,"space-after":2,class:`note`},{default:F(()=>[...n[3]||=[N(`В этой папке коммит ничего не менял.`,-1)]]),_:1}))]))}}),[[`__scopeId`,`data-v-15ecf118`]]),i2={key:0,class:`refs`},a2={key:1,class:`body`},o2={class:`muted`},s2={class:`muted`},c2={class:`muted`},l2={key:0,class:`muted`},u2=[`onClick`],d2=G(M({__name:`CommitMeta`,props:{detail:{}},emits:[`openCommit`],setup(e,{emit:t}){let n=e,r=t,i=z(()=>n.detail.committer===n.detail.author);async function a(e){await ni(e.currentTarget,n.detail.hash,`Хеш скопирован`)}return(t,n)=>(V(),q(`div`,null,[I(_,{size:`lg`,weight:`semibold`,"space-after":2,class:`subject`},{default:F(()=>[N(j(e.detail.subject||`(без описания)`),1)]),_:1}),e.detail.refs.length?(V(),q(`p`,i2,[(V(!0),q(W,null,J(e.detail.refs,e=>(V(),q(`span`,{key:e.kind+e.name,class:O([`ref`,e.kind])},j(e.name),3))),128))])):B(``,!0),e.detail.body?(V(),q(`pre`,a2,j(e.detail.body),1)):B(``,!0),K(`dl`,null,[n[1]||=K(`dt`,null,`Хеш`,-1),K(`dd`,null,[K(`code`,null,j(e.detail.hash),1),I(Q,{shape:`icon`,size:`sm`,title:`Копировать хеш`,"aria-label":`Копировать хеш`,"data-command":`ide.git.commit.copyHash`,onClick:a},{default:F(()=>[I(H(Tg),{"aria-hidden":`true`})]),_:1})]),n[2]||=K(`dt`,null,`Автор`,-1),K(`dd`,null,[N(j(e.detail.author)+` `,1),K(`span`,o2,`<`+j(e.detail.email)+`>`,1)]),n[3]||=K(`dt`,null,`Дата`,-1),K(`dd`,null,[N(j(H(di)(e.detail.date))+` `,1),K(`span`,s2,`· `+j(H(ci)(e.detail.date)),1)]),i.value?B(``,!0):(V(),q(W,{key:0},[n[0]||=K(`dt`,null,`Коммит`,-1),K(`dd`,null,[N(j(e.detail.committer)+` `,1),K(`span`,c2,`· `+j(H(di)(e.detail.committerDate)),1)])],64)),K(`dt`,null,j(e.detail.parents.length>1?`Родители`:`Родитель`),1),K(`dd`,null,[e.detail.parents.length?B(``,!0):(V(),q(`span`,l2,`корневой коммит`)),(V(!0),q(W,null,J(e.detail.parents,e=>(V(),q(`button`,{key:e,class:`link`,"data-command":`ide.git.commit.open`,onClick:t=>r(`openCommit`,e)},j(H(mi)(e)),9,u2))),128))])])]))}}),[[`__scopeId`,`data-v-2dd5b75a`]]);function f2(e){let t=X(new Set),n=X({}),r=X({}),i=0;async function a(t){if(r.value[t])return;let n=i;r.value[t]={loading:!0,error:``};try{let a=await Vn(e.projectId(),e.action,{...e.params(),path:t});n===i&&(r.value[t]={loading:!1,error:``,data:a})}catch(a){n===i&&(r.value[t]={loading:!1,error:a instanceof Error?a.message:e.errorFallback})}}async function o(e,n){n??!t.value.has(e)?(t.value.add(e),await a(e)):t.value.delete(e)}function s(){i++,t.value.clear(),n.value={},r.value={}}return e.resetOn&&R(e.resetOn,s),{expanded:t,heights:n,diffs:r,toggle:o,reset:s}}function p2(e,t){return f2({projectId:e,action:`commit-diff`,params:()=>({hash:t()}),errorFallback:`Ошибка Git`})}var m2={key:0,class:`commit-actions`},h2=G(M({__name:`CommitOverview`,props:{projectId:{},hash:{},onOpenTree:{type:Function},onOpenCompare:{type:Function}},emits:[`openCommit`,`openDiff`,`subject`],setup(e,{emit:t}){let n=e,r=t,a=X(),o=z(()=>tr(n.projectId).snapshots),s=z(()=>tr(n.projectId).compare&&!!a.value?.parents[0]),c=X(``),l=X(!1),u=0,{expanded:d,heights:f,diffs:p,toggle:m,reset:h}=p2(()=>n.projectId,()=>n.hash),g=E(`commit:${n.projectId}:${n.hash}`,()=>({surface:`commit`,projectId:n.projectId,hash:n.hash})),_=z(()=>(a.value?.files??[]).filter(e=>!e.binary));g.scope.registerCommand({id:`ide.git.commit.openChanges`,title:`Изменения коммита`,description:`Показывает изменённые файлы коммита относительно первого родителя в боковой панели; строки открывают diff.`,enabled:()=>s.value,run:()=>{let e=a.value?.parents[0];e&&n.onOpenCompare?.(e,n.hash)}}),g.scope.registerCommand({id:`ide.git.commit.openTree`,title:`Файлы коммита`,description:`Показывает дерево файлов на момент коммита в боковой панели рядом с Git; дерево доступно только для чтения.`,enabled:()=>o.value,run:()=>n.onOpenTree?.(n.hash)}),ui(()=>{if(c.value)return{note:`Обзор коммита ${n.hash.slice(0,7)}`,text:`Ошибка Git: ${c.value}`};let e=a.value;if(!e)return{note:`Обзор коммита ${n.hash.slice(0,7)}`,text:`Загрузка коммита…`};let t=e.files.map(e=>`${e.status}\t+${e.additions} -${e.deletions}\t${e.path}`);return{note:`Обзор коммита ${e.hash.slice(0,7)}`,text:vi(`Коммит ${e.hash}`,e.subject,e.body,`Автор: ${e.author} <${e.email}>, ${e.date}`,e.refs.length?`Refs: ${e.refs.map(e=>e.name).join(`, `)}`:``,e.parents.length?`Родители: ${e.parents.join(`, `)}`:``,`Итого: +${e.additions} -${e.deletions}, файлов: ${e.files.length}`,t.length?`Файлы:\n${t.join(`
|
|
165
|
+
`)}`:`Файлы: нет`,d.value.size?`Раскрыты: ${[...d.value].join(`, `)}`:``)}}),g.scope.registerCommand({id:`ide.git.commit.file.toggle`,title:`Показать или скрыть код файла коммита`,description:`Раскрывает изменения файла прямо в обзоре коммита.`,arguments:{path:`Путь файла относительно папки проекта`,open:`true/false — задать явно`},run:async e=>{let t=b(e);if(typeof t.path!=`string`||!_.value.some(e=>e.path===t.path))throw Error(`Укажите путь текстового файла этого коммита`);if(t.open!==void 0&&typeof t.open!=`boolean`)throw Error(`open должен быть boolean`);await m(t.path,t.open)}}),g.scope.registerCommand({id:`ide.git.commit.files.toggleAll`,title:`Раскрыть или свернуть все файлы коммита`,description:`Раскрывает код всех текстовых файлов коммита или сворачивает их.`,arguments:{open:`true — раскрыть всё, false — свернуть; по умолчанию переключает`},run:async e=>{let t=b(e);if(!(typeof t.open==`boolean`?t.open:d.value.size===0))return d.value.clear();await Promise.all(_.value.map(e=>m(e.path,!0)))}});async function v(){let e=++u;l.value=!0,c.value=``,a.value=void 0,h();try{let t=await Vn(n.projectId,`commit`,{hash:n.hash});if(e!==u)return;a.value=t,r(`subject`,t.subject)}catch(t){e===u&&(c.value=t instanceof Error?t.message:`Ошибка Git`)}finally{e===u&&(l.value=!1)}}return R(()=>[n.projectId,n.hash],v,{immediate:!0}),(e,t)=>(V(),Y(_i,null,{default:F(()=>[l.value?(V(),Y(i,{key:0,size:`xs`,leading:`inherit`,"space-after":2,class:`note`,role:`status`},{default:F(()=>[...t[7]||=[N(`загрузка коммита…`,-1)]]),_:1})):c.value?(V(),Y(i,{key:1,size:`xs`,leading:`inherit`,"space-after":2,class:`note error`,role:`alert`},{default:F(()=>[N(j(c.value),1)]),_:1})):a.value?(V(),Y(hi,{key:2},{default:F(()=>[I(d2,{detail:a.value,onOpenCommit:t[0]||=e=>r(`openCommit`,e)},null,8,[`detail`]),o.value||s.value?(V(),q(`div`,m2,[s.value?(V(),Y(Q,{key:0,size:`sm`,"data-command":`ide.git.commit.openChanges`,onClick:t[1]||=e=>H(g).run(`ide.git.commit.openChanges`)},{default:F(()=>[...t[8]||=[N(` Изменения коммита `,-1)]]),_:1})):B(``,!0),o.value?(V(),Y(Q,{key:1,size:`sm`,"data-command":`ide.git.commit.openTree`,onClick:t[2]||=e=>H(g).run(`ide.git.commit.openTree`)},{default:F(()=>[...t[9]||=[N(` Файлы коммита `,-1)]]),_:1})):B(``,!0)])):B(``,!0),I(r2,{detail:a.value,expanded:H(d),heights:H(f),diffs:H(p),onToggle:t[3]||=(e,t)=>H(g).run(`ide.git.commit.file.toggle`,{path:e,open:t}),onToggleAll:t[4]||=e=>H(g).run(`ide.git.commit.files.toggleAll`),onOpenDiff:t[5]||=e=>r(`openDiff`,a.value.hash,e),onResize:t[6]||=(e,t)=>H(f)[e]=t},null,8,[`detail`,`expanded`,`heights`,`diffs`])]),_:1})):B(``,!0)]),_:1}))}}),[[`__scopeId`,`data-v-74735485`]]),g2={active:!1,line:1,column:1,selectedChars:0,selectedLines:0};function _2(){let e=at({...g2}),t=0,n=0;return{status:e,acquire:()=>++t,release(t){n===t&&(n=0,Object.assign(e,g2))},activate(t,r){n=t,Object.assign(e,r,{active:!0})},update(t,r){n===t&&Object.assign(e,r,{active:!0})}}}var v2=Symbol(`editor-status`);function y2(){let e=_2();return ot(v2,e),e}var b2;function x2(){return tt(v2,null)??(b2??=_2())}function S2(e){let t=e.indexOf(`
|
|
166
|
+
`);return t>0&&e[t-1]===`\r`?`CRLF`:`LF`}var C2=class e{constructor(e,t,n,r){this.fromA=e,this.toA=t,this.fromB=n,this.toB=r}offset(t,n=t){return new e(this.fromA+t,this.toA+t,this.fromB+n,this.toB+n)}};function w2(e,t,n,r,i,a){if(e==r)return[];let o=P2(e,t,n,r,i,a),s=F2(e,t+o,n,r,i+o,a);t+=o,n-=s,i+=o,a-=s;let c=n-t,l=a-i;if(!c||!l)return[new C2(t,n,i,a)];if(c>l){let o=e.slice(t,n).indexOf(r.slice(i,a));if(o>-1)return[new C2(t,t+o,i,i),new C2(t+o+l,n,a,a)]}else if(l>c){let o=r.slice(i,a).indexOf(e.slice(t,n));if(o>-1)return[new C2(t,t,i,i+o),new C2(n,n,i+o+c,a)]}if(c==1||l==1)return[new C2(t,n,i,a)];let u=L2(e,t,n,r,i,a);if(u){let[o,s,c]=u;return w2(e,t,o,r,i,s).concat(w2(e,o+c,n,r,s+c,a))}return O2(e,t,n,r,i,a)}var T2=1e9,E2=0,D2=!1;function O2(e,t,n,r,i,a){let o=n-t,s=a-i;if(T2<1e9&&Math.min(o,s)>T2*16||E2>0&&Date.now()>E2)return Math.min(o,s)>T2*64?[new C2(t,n,i,a)]:R2(e,t,n,r,i,a);let c=Math.ceil((o+s)/2);A2.reset(c),j2.reset(c);let l=(n,a)=>e.charCodeAt(t+n)==r.charCodeAt(i+a),u=(t,i)=>e.charCodeAt(n-t-1)==r.charCodeAt(a-i-1),d=(o-s)%2==0?null:j2,f=d?null:A2;for(let p=0;p<c;p++){if(p>T2||E2>0&&!(p&63)&&Date.now()>E2)return R2(e,t,n,r,i,a);let m=A2.advance(p,o,s,c,d,!1,l)||j2.advance(p,o,s,c,f,!0,u);if(m)return M2(e,t,n,t+m[0],r,i,a,i+m[1])}return[new C2(t,n,i,a)]}var k2=class{constructor(){this.vec=[]}reset(e){this.len=e<<1;for(let e=0;e<this.len;e++)this.vec[e]=-1;this.vec[e+1]=0,this.start=this.end=0}advance(e,t,n,r,i,a,o){for(let s=-e+this.start;s<=e-this.end;s+=2){let c=r+s,l=s==-e||s!=e&&this.vec[c-1]<this.vec[c+1]?this.vec[c+1]:this.vec[c-1]+1,u=l-s;for(;l<t&&u<n&&o(l,u);)l++,u++;if(this.vec[c]=l,l>t)this.end+=2;else if(u>n)this.start+=2;else if(i){let e=r+(t-n)-s;if(e>=0&&e<this.len&&i.vec[e]!=-1){if(a){let n=i.vec[e];if(n>=t-l)return[n,r+n-e]}else{let n=t-i.vec[e];if(l>=n)return[l,u]}}}}return null}},A2=new k2,j2=new k2;function M2(e,t,n,r,i,a,o,s){let c=!1;return!$2(e,r)&&++r==n&&(c=!0),!$2(i,s)&&++s==o&&(c=!0),c?[new C2(t,n,a,o)]:w2(e,t,r,i,a,s).concat(w2(e,r,n,i,s,o))}function N2(e,t){let n=1,r=Math.min(e,t);for(;n<r;)n<<=1;return n}function P2(e,t,n,r,i,a){if(t==n||t==a||e.charCodeAt(t)!=r.charCodeAt(i))return 0;let o=N2(n-t,a-i);for(let s=t,c=i;;){let i=s+o,l=c+o;if(i>n||l>a||e.slice(s,i)!=r.slice(c,l)){if(o==1)return s-t-+!$2(e,s);o>>=1}else if(i==n||l==a)return i-t;else s=i,c=l}}function F2(e,t,n,r,i,a){if(t==n||i==a||e.charCodeAt(n-1)!=r.charCodeAt(a-1))return 0;let o=N2(n-t,a-i);for(let s=n,c=a;;){let a=s-o,l=c-o;if(a<t||l<i||e.slice(a,s)!=r.slice(l,c)){if(o==1)return n-s-+!$2(e,s);o>>=1}else if(a==t||l==i)return n-a;else s=a,c=l}}function I2(e,t,n,r,i,a,o,s){let c=r.slice(i,a),l=null;for(;;){if(l||o<s)return l;for(let s=t+o;;){$2(e,s)||s++;let u=s+o;if($2(e,u)||(u+=u==s+1?1:-1),u>=n)break;let d=e.slice(s,u),f=-1;for(;(f=c.indexOf(d,f+1))!=-1;){let o=P2(e,u,n,r,i+f+d.length,a),c=F2(e,t,s,r,i,i+f),p=d.length+o+c;(!l||l[2]<p)&&(l=[s-c,i+f-c,p])}s=u}if(s<0)return l;o>>=1}}function L2(e,t,n,r,i,a){let o=n-t,s=a-i;if(o<s){let o=L2(r,i,a,e,t,n);return o&&[o[1],o[0],o[2]]}return o<4||s*2<o?null:I2(e,t,n,r,i,a,Math.floor(o/4),-1)}function R2(e,t,n,r,i,a){D2=!0;let o=n-t,s=a-i,c;if(o<s){let s=I2(r,i,a,e,t,n,Math.floor(o/6),50);c=s&&[s[1],s[0],s[2]]}else c=I2(e,t,n,r,i,a,Math.floor(s/6),50);if(!c)return[new C2(t,n,i,a)];let[l,u,d]=c;return w2(e,t,l,r,i,u).concat(w2(e,l+d,n,r,u+d,a))}function z2(e,t){for(let n=1;n<e.length;n++){let r=e[n-1],i=e[n];r.toA>i.fromA-t&&r.toB>i.fromB-t&&(e[n-1]=new C2(r.fromA,i.toA,r.fromB,i.toB),e.splice(n--,1))}}function B2(e,t,n){for(;;){z2(n,1);let r=!1;for(let i=0;i<n.length;i++){let a=n[i],o,s;(o=P2(e,a.fromA,a.toA,t,a.fromB,a.toB))&&(a=n[i]=new C2(a.fromA+o,a.toA,a.fromB+o,a.toB)),(s=F2(e,a.fromA,a.toA,t,a.fromB,a.toB))&&(a=n[i]=new C2(a.fromA,a.toA-s,a.fromB,a.toB-s));let c=a.toA-a.fromA,l=a.toB-a.fromB;if(c&&l)continue;let u=a.fromA-(i?n[i-1].toA:0),d=(i<n.length-1?n[i+1].fromA:e.length)-a.toA;if(!u||!d)continue;let f=c?e.slice(a.fromA,a.toA):t.slice(a.fromB,a.toB);u<=f.length&&e.slice(a.fromA-u,a.fromA)==f.slice(f.length-u)?(n[i]=new C2(a.fromA-u,a.toA-u,a.fromB-u,a.toB-u),r=!0):d<=f.length&&e.slice(a.toA,a.toA+d)==f.slice(0,d)&&(n[i]=new C2(a.fromA+d,a.toA+d,a.fromB+d,a.toB+d),r=!0)}if(!r)break}return n}function V2(e,t,n){for(let r=0,i=0;i<e.length;i++){let a=e[i],o=a.toA-a.fromA,s=a.toB-a.fromB;if(o&&s||o>3||s>3){let c=i==e.length-1?t.length:e[i+1].fromA,l=a.fromA-r,u=c-a.toA,d=J2(t,a.fromA,l),f=q2(t,a.toA,u),p=a.fromA-d,m=f-a.toA;if((!o||!s)&&p&&m){let l=Math.max(o,s),[u,h,g]=o?[t,a.fromA,a.toA]:[n,a.fromB,a.toB];l>p&&t.slice(d,a.fromA)==u.slice(g-p,g)?(a=e[i]=new C2(d,d+o,a.fromB-p,a.toB-p),d=a.fromA,f=q2(t,a.toA,c-a.toA)):l>m&&t.slice(a.toA,f)==u.slice(h,h+m)&&(a=e[i]=new C2(f-o,f,a.fromB+m,a.toB+m),f=a.toA,d=J2(t,a.fromA,a.fromA-r)),p=a.fromA-d,m=f-a.toA}if(p||m)a=e[i]=new C2(a.fromA-p,a.toA+m,a.fromB-p,a.toB+m);else if(!o){let t=X2(n,a.fromB,a.toB),r,o=t<0?-1:Y2(n,a.toB,a.fromB);t>-1&&(r=t-a.fromB)<=u&&n.slice(a.fromB,t)==n.slice(a.toB,a.toB+r)?a=e[i]=a.offset(r):o>-1&&(r=a.toB-o)<=l&&n.slice(a.fromB-r,a.fromB)==n.slice(o,a.toB)&&(a=e[i]=a.offset(-r))}else if(!s){let n=X2(t,a.fromA,a.toA),r,o=n<0?-1:Y2(t,a.toA,a.fromA);n>-1&&(r=n-a.fromA)<=u&&t.slice(a.fromA,n)==t.slice(a.toA,a.toA+r)?a=e[i]=a.offset(r):o>-1&&(r=a.toA-o)<=l&&t.slice(a.fromA-r,a.fromA)==t.slice(o,a.toA)&&(a=e[i]=a.offset(-r))}}r=a.toA}return z2(e,3),e}var H2;try{H2=RegExp(`[\\p{Alphabetic}\\p{Number}]`,`u`)}catch{}function U2(e){return e>48&&e<58||e>64&&e<91||e>96&&e<123}function W2(e,t){if(t==e.length)return 0;let n=e.charCodeAt(t);return n<192?+!!U2(n):H2?!Z2(n)||t==e.length-1?+!!H2.test(String.fromCharCode(n)):H2.test(e.slice(t,t+2))?2:0:0}function G2(e,t){if(!t)return 0;let n=e.charCodeAt(t-1);return n<192?+!!U2(n):H2?!Q2(n)||t==1?+!!H2.test(String.fromCharCode(n)):H2.test(e.slice(t-2,t))?2:0:0}var K2=8;function q2(e,t,n){if(t==e.length||!G2(e,t))return t;for(let r=t,i=t+n,a=0;a<K2;a++){let t=W2(e,r);if(!t||r+t>i)return r;r+=t}return t}function J2(e,t,n){if(!t||!W2(e,t))return t;for(let r=t,i=t-n,a=0;a<K2;a++){let t=G2(e,r);if(!t||r-t<i)return r;r-=t}return t}function Y2(e,t,n){for(;t!=n;t--)if(e.charCodeAt(t-1)==10)return t;return-1}function X2(e,t,n){for(;t!=n;t++)if(e.charCodeAt(t)==10)return t;return-1}var Z2=e=>e>=55296&&e<=56319,Q2=e=>e>=56320&&e<=57343;function $2(e,t){return!t||t==e.length||!Z2(e.charCodeAt(t-1))||!Q2(e.charCodeAt(t))}function e4(e,t,n){let r=n?.override;return r?r(e,t):(T2=(n?.scanLimit??1e9)>>1,E2=n?.timeout?Date.now()+n.timeout:0,D2=!1,B2(e,t,w2(e,0,e.length,t,0,t.length)))}function t4(){return!D2}function n4(e,t,n){return V2(e4(e,t,n),e,t)}var r4=Vi.define({combine:e=>e[0]}),i4=Oi.define(),a4=Vi.define(),o4=Fi.define({create(e){return null},update(e,t){for(let n of t.effects)n.is(i4)&&(e=n.value);for(let n of t.state.facet(a4))e=n(e,t);return e}}),s4=class e{constructor(e,t,n,r,i,a=!0){this.changes=e,this.fromA=t,this.toA=n,this.fromB=r,this.toB=i,this.precise=a}offset(t,n){return t||n?new e(this.changes,this.fromA+t,this.toA+t,this.fromB+n,this.toB+n,this.precise):this}get endA(){return Math.max(this.fromA,this.toA-1)}get endB(){return Math.max(this.fromB,this.toB-1)}static build(e,t,n){return u4(n4(e.toString(),t.toString(),n),e,t,0,0,t4())}static updateA(e,t,n,r,i){return m4(p4(e,r,!0,n.length),e,t,n,i)}static updateB(e,t,n,r,i){return m4(p4(e,r,!1,t.length),e,t,n,i)}};function c4(e,t,n,r){let i=n.lineAt(e),a=r.lineAt(t);return i.to==e&&a.to==t&&e<n.length&&t<r.length?[e+1,t+1]:[i.from,a.from]}function l4(e,t,n,r){let i=n.lineAt(e),a=r.lineAt(t);return i.from==e&&a.from==t?[e,t]:[i.to+1,a.to+1]}function u4(e,t,n,r,i,a){let o=[];for(let s=0;s<e.length;s++){let c=e[s],[l,u]=c4(c.fromA+r,c.fromB+i,t,n),[d,f]=l4(c.toA+r,c.toB+i,t,n),p=[c.offset(-l+r,-u+i)];for(;s<e.length-1;){let a=e[s+1],[o,c]=c4(a.fromA+r,a.fromB+i,t,n);if(o>d+1&&c>f+1)break;p.push(a.offset(-l+r,-u+i)),[d,f]=l4(a.toA+r,a.toB+i,t,n),s++}o.push(new s4(p,l,Math.max(l,d),u,Math.max(u,f),a))}return o}var d4=1e3;function f4(e,t,n,r){let i=0,a=e.length;for(;;){if(i==a){let r=0,a=0;i&&({toA:r,toB:a}=e[i-1]);let o=t-(n?r:a);return[r+o,a+o]}let o=i+a>>1,s=e[o],[c,l]=n?[s.fromA,s.toA]:[s.fromB,s.toB];if(c>t)a=o;else if(l<=t)i=o+1;else return r?[s.fromA,s.fromB]:[s.toA,s.toB]}}function p4(e,t,n,r){let i=[];return t.iterChangedRanges((a,o,s,c)=>{let l=0,u=n?t.length:r,d=0,f=n?r:t.length;a>d4&&([l,d]=f4(e,a-d4,n,!0)),o<t.length-d4&&([u,f]=f4(e,o+d4,n,!1));let p=c-s-(o-a),m,[h,g]=n?[p,0]:[0,p];i.length&&(m=i[i.length-1]).toA>=l?i[i.length-1]={fromA:m.fromA,fromB:m.fromB,toA:u,toB:f,diffA:m.diffA+h,diffB:m.diffB+g}:i.push({fromA:l,toA:u,fromB:d,toB:f,diffA:h,diffB:g})}),i}function m4(e,t,n,r,i){if(!e.length)return t;let a=[];for(let o=0,s=0,c=0,l=0;;o++){let u=o==e.length?null:e[o],d=u?u.fromA+s:n.length,f=u?u.fromB+c:r.length;for(;l<t.length;){let e=t[l];if(u&&(e.toA+s>d||e.toB+c>f))break;a.push(e.offset(s,c)),l++}if(!u)break;let p=u.toA+s+u.diffA,m=u.toB+c+u.diffB,h=n4(n.sliceString(d,p),r.sliceString(f,m),i);for(let e of u4(h,n,r,d,f,t4()))a.push(e);for(s+=u.diffA,c+=u.diffB;l<t.length;){let e=t[l];if(e.fromA+s>p&&e.fromB+c>m)break;l++}}return a}var h4={scanLimit:500},g4=Ri.fromClass(class{constructor(e){({deco:this.deco,gutter:this.gutter}=E4(e))}update(e){(e.docChanged||e.viewportChanged||v4(e.startState,e.state)||y4(e.startState,e.state))&&({deco:this.deco,gutter:this.gutter}=E4(e.view))}},{decorations:e=>e.deco}),_4=Ai.low(Ui({class:`cm-changeGutter`,markers:e=>e.plugin(g4)?.gutter||Ni.empty}));function v4(e,t){return e.field(o4,!1)!=t.field(o4,!1)}function y4(e,t){return e.facet(r4)!=t.facet(r4)}var b4=Wi.line({class:`cm-changedLine`}),x4=Wi.mark({class:`cm-changedText`}),S4=Wi.mark({tagName:`ins`,class:`cm-insertedLine`}),C4=Wi.mark({tagName:`del`,class:`cm-deletedLine`}),w4=new class extends Ii{constructor(){super(...arguments),this.elementClass=`cm-changedLineGutter`}};function T4(e,t,n,r,i,a){let o=n?e.fromA:e.fromB,s=n?e.toA:e.toB,c=0;if(o!=s){i.add(o,o,b4),i.add(o,s,n?C4:S4),a&&a.add(o,o,w4);for(let l=t.iterRange(o,s-1),u=o;!l.next().done;){if(l.lineBreak){u++,i.add(u,u,b4),a&&a.add(u,u,w4);continue}let t=u+l.value.length;if(r)for(;c<e.changes.length;){let r=e.changes[c],a=o+(n?r.fromA:r.fromB),s=o+(n?r.toA:r.toB),l=Math.max(u,a),d=Math.min(t,s);if(l<d&&i.add(l,d,x4),s<t)c++;else break}u=t}}}function E4(e){let t=e.state.field(o4),{side:n,highlightChanges:r,markGutter:i,overrideChunk:a}=e.state.facet(r4),o=n==`a`,s=new Ei,c=i?new Ei:null,{from:l,to:u}=e.viewport;for(let n of t){if((o?n.fromA:n.fromB)>=u)break;(o?n.toA:n.toB)>l&&(a&&a(e.state,n,s,c)||T4(n,e.state.doc,o,r,s,c))}return{deco:s.finish(),gutter:c&&c.finish()}}var D4=class extends Pi{constructor(e){super(),this.height=e}eq(e){return this.height==e.height}toDOM(){let e=document.createElement(`div`);return e.className=`cm-mergeSpacer`,e.style.height=this.height+`px`,e}updateDOM(e){return e.style.height=this.height+`px`,!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}},O4=Oi.define({map:(e,t)=>e.map(t)}),k4=Fi.define({create:()=>Wi.none,update:(e,t)=>{for(let e of t.effects)if(e.is(O4))return e.value;return e.map(t.changes)},provide:e=>Li.decorations.from(e)}),A4=.01;function j4(e,t){if(e.size!=t.size)return!1;let n=e.iter(),r=t.iter();for(;n.value;){if(n.from!=r.from||Math.abs(n.value.spec.widget.height-r.value.spec.widget.height)>1)return!1;n.next(),r.next()}return!0}function M4(e,t,n){let r=new Ei,i=new Ei,a=e.state.field(k4).iter(),o=t.state.field(k4).iter(),s=0,c=0,l=0,u=0,d=e.viewport,f=t.viewport;for(let p=0;;p++){let m=p<n.length?n[p]:null,h=m?m.fromA:e.state.doc.length,g=m?m.fromB:t.state.doc.length;if(s<h){let n=e.lineBlockAt(s).top+l-(t.lineBlockAt(c).top+u);n<-.01?(l-=n,r.add(s,s,Wi.widget({widget:new D4(-n),block:!0,side:-1}))):n>A4&&(u+=n,i.add(c,c,Wi.widget({widget:new D4(n),block:!0,side:-1})))}if(h>s+1e3&&s<d.from&&h>d.from&&c<f.from&&g>f.from){let e=Math.min(d.from-s,f.from-c);s+=e,c+=e,p--}else if(m)s=m.toA,c=m.toB;else break;for(;a.value&&a.from<s;)l-=a.value.spec.widget.height,a.next();for(;o.value&&o.from<c;)u-=o.value.spec.widget.height,o.next()}for(;a.value;)l-=a.value.spec.widget.height,a.next();for(;o.value;)u-=o.value.spec.widget.height,o.next();let p=e.contentHeight+l-(t.contentHeight+u);p<A4?r.add(e.state.doc.length,e.state.doc.length,Wi.widget({widget:new D4(-p),block:!0,side:1})):p>A4&&i.add(t.state.doc.length,t.state.doc.length,Wi.widget({widget:new D4(p),block:!0,side:1}));let m=r.finish(),h=i.finish();j4(m,e.state.field(k4))||e.dispatch({effects:O4.of(m)}),j4(h,t.state.field(k4))||t.dispatch({effects:O4.of(h)})}var N4=Oi.define({map:(e,t)=>t.mapPos(e)}),P4=class extends Pi{constructor(e){super(),this.lines=e}eq(e){return this.lines==e.lines}toDOM(e){let t=document.createElement(`div`);return t.className=`cm-collapsedLines`,t.textContent=e.state.phrase(`$ unchanged lines`,this.lines),t.addEventListener(`click`,t=>{let n=e.posAtDOM(t.target);e.dispatch({effects:N4.of(n)});let{side:r,sibling:i}=e.state.facet(r4);i&&i().dispatch({effects:N4.of(F4(n,e.state.field(o4),r==`a`))})}),t}ignoreEvent(e){return e instanceof MouseEvent}get estimatedHeight(){return 27}get type(){return`collapsed-unchanged-code`}};function F4(e,t,n){let r=0,i=0;for(let a=0;;a++){let o=a<t.length?t[a]:null;if(!o||(n?o.fromA:o.fromB)>=e)return i+(e-r);[r,i]=n?[o.toA,o.toB]:[o.toB,o.toA]}}var I4=Fi.define({create(e){return Wi.none},update(e,t){e=e.map(t.changes);for(let n of t.effects)n.is(N4)&&(e=e.update({filter:e=>e!=n.value}));if(e.size&&t.state.field(o4)!=t.startState.field(o4,!1)){let n=t.state.facet(r4).side==`a`,r=[];for(let i of t.state.field(o4))e.between(n?i.fromA:i.fromB,n?i.toA:i.toB,e=>{r.push(e)});r.length&&(e=e.update({filter:e=>r.indexOf(e)<0}))}return e},provide:e=>Li.decorations.from(e)});function L4({margin:e=3,minSize:t=4}){return I4.init(n=>R4(n,e,t))}function R4(e,t,n){let r=new Ei,i=e.facet(r4).side==`a`,a=e.field(o4),o=1;for(let s=0;;s++){let c=s<a.length?a[s]:null,l=s?o+t:1,u=c?e.doc.lineAt(i?c.fromA:c.fromB).number-1-t:e.doc.lines,d=u-l+1;if(d>=n&&r.add(e.doc.line(l).from,e.doc.line(u).to,Wi.replace({widget:new P4(d),block:!0})),!c)break;o=e.doc.lineAt(Math.min(e.doc.length,i?c.toA:c.toB)).number}return r.finish()}var z4=Li.styleModule.of(new Ci({".cm-mergeView":{overflowY:`auto`},".cm-mergeViewEditors":{display:`flex`,alignItems:`stretch`},".cm-mergeViewEditor":{flexGrow:1,flexBasis:0,overflow:`hidden`},".cm-merge-revert":{width:`1.6em`,flexGrow:0,flexShrink:0,position:`relative`},".cm-merge-revert button":{position:`absolute`,display:`block`,width:`100%`,boxSizing:`border-box`,textAlign:`center`,background:`none`,border:`none`,font:`inherit`,cursor:`pointer`}})),B4=Li.baseTheme({".cm-mergeView & .cm-scroller, .cm-mergeView &":{height:`auto !important`,overflowY:`visible !important`},"&.cm-merge-a .cm-changedLine, .cm-deletedChunk":{backgroundColor:`rgba(160, 128, 100, .08)`},"&.cm-merge-b .cm-changedLine, .cm-inlineChangedLine":{backgroundColor:`rgba(100, 160, 128, .08)`},"&light.cm-merge-a .cm-changedText, &light .cm-deletedChunk .cm-deletedText":{background:`linear-gradient(#ee443366, #ee443366) bottom/100% 2px no-repeat`},"&dark.cm-merge-a .cm-changedText, &dark .cm-deletedChunk .cm-deletedText":{background:`linear-gradient(#ffaa9966, #ffaa9966) bottom/100% 2px no-repeat`},"&light.cm-merge-b .cm-changedText":{background:`linear-gradient(#22bb22aa, #22bb22aa) bottom/100% 2px no-repeat`},"&dark.cm-merge-b .cm-changedText":{background:`linear-gradient(#88ff88aa, #88ff88aa) bottom/100% 2px no-repeat`},"&.cm-merge-b .cm-deletedText":{background:`#ff000033`},".cm-insertedLine, .cm-deletedLine, .cm-deletedLine del":{textDecoration:`none`},".cm-deletedChunk":{paddingLeft:`6px`,"& .cm-chunkButtons":{position:`absolute`,insetInlineEnd:`5px`},"& button":{border:`none`,cursor:`pointer`,color:`white`,margin:`0 2px`,borderRadius:`3px`,"&[name=accept]":{background:`#2a2`},"&[name=reject]":{background:`#d43`}}},".cm-collapsedLines":{padding:`5px 5px 5px 10px`,cursor:`pointer`,"&:before":{content:`"⦚"`,marginInlineEnd:`7px`},"&:after":{content:`"⦚"`,marginInlineStart:`7px`}},"&light .cm-collapsedLines":{color:`#444`,background:`linear-gradient(to bottom, transparent 0, #f3f3f3 30%, #f3f3f3 70%, transparent 100%)`},"&dark .cm-collapsedLines":{color:`#ddd`,background:`linear-gradient(to bottom, transparent 0, #222 30%, #222 70%, transparent 100%)`},".cm-changeGutter":{width:`3px`,paddingLeft:`1px`},"&light.cm-merge-a .cm-changedLineGutter, &light .cm-deletedLineGutter":{background:`#e43`},"&dark.cm-merge-a .cm-changedLineGutter, &dark .cm-deletedLineGutter":{background:`#fa9`},"&light.cm-merge-b .cm-changedLineGutter":{background:`#2b2`},"&dark.cm-merge-b .cm-changedLineGutter":{background:`#8f8`},".cm-inlineChangedLineGutter":{background:`#75d`}}),V4=new Mi,H4=new Mi,U4=class{constructor(e){this.revertDOM=null,this.revertToA=!1,this.revertToLeft=!1,this.measuring=-1,this.diffConf=e.diffConfig||h4;let t=[Ai.low(g4),B4,z4,k4,Li.updateListener.of(e=>{this.measuring<0&&(e.heightChanged||e.viewportChanged)&&!e.transactions.some(e=>e.effects.some(e=>e.is(O4)))&&this.measure()})],n=[r4.of({side:`a`,sibling:()=>this.b,highlightChanges:e.highlightChanges!==!1,markGutter:e.gutter!==!1})];e.gutter!==!1&&n.push(_4);let r=xi.create({doc:e.a.doc,selection:e.a.selection,extensions:[e.a.extensions||[],Li.editorAttributes.of({class:`cm-merge-a`}),H4.of(n),t]}),i=[r4.of({side:`b`,sibling:()=>this.a,highlightChanges:e.highlightChanges!==!1,markGutter:e.gutter!==!1})];e.gutter!==!1&&i.push(_4);let a=xi.create({doc:e.b.doc,selection:e.b.selection,extensions:[e.b.extensions||[],Li.editorAttributes.of({class:`cm-merge-b`}),H4.of(i),t]});this.chunks=s4.build(r.doc,a.doc,this.diffConf);let o=[o4.init(()=>this.chunks),V4.of(e.collapseUnchanged?L4(e.collapseUnchanged):[])];r=r.update({effects:Oi.appendConfig.of(o)}).state,a=a.update({effects:Oi.appendConfig.of(o)}).state,this.dom=document.createElement(`div`),this.dom.className=`cm-mergeView`,this.editorDOM=this.dom.appendChild(document.createElement(`div`)),this.editorDOM.className=`cm-mergeViewEditors`;let s=e.orientation||`a-b`,c=document.createElement(`div`);c.className=`cm-mergeViewEditor`;let l=document.createElement(`div`);l.className=`cm-mergeViewEditor`,this.editorDOM.appendChild(s==`a-b`?c:l),this.editorDOM.appendChild(s==`a-b`?l:c),this.a=new Li({state:r,parent:c,root:e.root,dispatchTransactions:e=>this.dispatch(e,this.a)}),this.b=new Li({state:a,parent:l,root:e.root,dispatchTransactions:e=>this.dispatch(e,this.b)}),this.setupRevertControls(!!e.revertControls,e.revertControls==`b-to-a`,e.renderRevertControl),e.parent&&e.parent.appendChild(this.dom),this.scheduleMeasure()}dispatch(e,t){if(e.some(e=>e.docChanged)){let n=e[e.length-1],r=e.reduce((e,t)=>e.compose(t.changes),wi.empty(e[0].startState.doc.length));this.chunks=t==this.a?s4.updateA(this.chunks,n.newDoc,this.b.state.doc,r,this.diffConf):s4.updateB(this.chunks,this.a.state.doc,n.newDoc,r,this.diffConf),t.update([...e,n.state.update({effects:i4.of(this.chunks)})]);let i=t==this.a?this.b:this.a;i.update([i.state.update({effects:i4.of(this.chunks)})]),this.scheduleMeasure()}else t.update(e)}reconfigure(e){if(`diffConfig`in e&&(this.diffConf=e.diffConfig),`orientation`in e){let t=e.orientation!=`b-a`;if(t!=(this.editorDOM.firstChild==this.a.dom.parentNode)){let e=this.a.dom.parentNode,n=this.b.dom.parentNode;e.remove(),n.remove(),this.editorDOM.insertBefore(t?e:n,this.editorDOM.firstChild),this.editorDOM.appendChild(t?n:e),this.revertToLeft=!this.revertToLeft,this.revertDOM&&(this.revertDOM.textContent=``)}}if(`revertControls`in e||`renderRevertControl`in e){let t=!!this.revertDOM,n=this.revertToA,r=this.renderRevert;`revertControls`in e&&(t=!!e.revertControls,n=e.revertControls==`b-to-a`),`renderRevertControl`in e&&(r=e.renderRevertControl),this.setupRevertControls(t,n,r)}let t=`highlightChanges`in e,n=`gutter`in e,r=`collapseUnchanged`in e;if(t||n||r){let i=[],a=[];if(t||n){let r=this.a.state.facet(r4),o=n?e.gutter!==!1:r.markGutter,s=t?e.highlightChanges!==!1:r.highlightChanges;i.push(H4.reconfigure([r4.of({side:`a`,sibling:()=>this.b,highlightChanges:s,markGutter:o}),o?_4:[]])),a.push(H4.reconfigure([r4.of({side:`b`,sibling:()=>this.a,highlightChanges:s,markGutter:o}),o?_4:[]]))}if(r){let t=V4.reconfigure(e.collapseUnchanged?L4(e.collapseUnchanged):[]);i.push(t),a.push(t)}this.a.dispatch({effects:i}),this.b.dispatch({effects:a})}this.scheduleMeasure()}setupRevertControls(e,t,n){this.revertToA=t,this.revertToLeft=this.revertToA==(this.editorDOM.firstChild==this.a.dom.parentNode),this.renderRevert=n,!e&&this.revertDOM?(this.revertDOM.remove(),this.revertDOM=null):e&&!this.revertDOM?(this.revertDOM=this.editorDOM.insertBefore(document.createElement(`div`),this.editorDOM.firstChild.nextSibling),this.revertDOM.addEventListener(`mousedown`,e=>this.revertClicked(e)),this.revertDOM.className=`cm-merge-revert`):this.revertDOM&&(this.revertDOM.textContent=``)}scheduleMeasure(){if(this.measuring<0){let e=this.dom.ownerDocument.defaultView||window;this.measuring=e.requestAnimationFrame(()=>{this.measuring=-1,this.measure()})}}measure(){M4(this.a,this.b,this.chunks),this.revertDOM&&this.updateRevertButtons()}updateRevertButtons(){let e=this.revertDOM,t=e.firstChild,n=this.a.viewport,r=this.b.viewport;for(let i=0;i<this.chunks.length;i++){let a=this.chunks[i];if(a.fromA>n.to||a.fromB>r.to)break;if(a.fromA<n.from||a.fromB<r.from)continue;let o=this.a.lineBlockAt(a.fromA).top+`px`;for(;t&&+t.dataset.chunk<i;)t=W4(t);t&&t.dataset.chunk==String(i)?(t.style.top!=o&&(t.style.top=o),t=t.nextSibling):e.insertBefore(this.renderRevertButton(o,i),t)}for(;t;)t=W4(t)}renderRevertButton(e,t){let n;if(this.renderRevert)n=this.renderRevert();else{n=document.createElement(`button`);let e=this.a.state.phrase(`Revert this chunk`);n.setAttribute(`aria-label`,e),n.setAttribute(`title`,e),n.textContent=this.revertToLeft?`⇜`:`⇝`}return n.style.top=e,n.setAttribute(`data-chunk`,String(t)),n}revertClicked(e){let t=e.target,n;for(;t&&t.parentNode!=this.revertDOM;)t=t.parentNode;if(t&&(n=this.chunks[t.dataset.chunk])){let[t,r,i,a,o,s]=this.revertToA?[this.b,this.a,n.fromB,n.toB,n.fromA,n.toA]:[this.a,this.b,n.fromA,n.toA,n.fromB,n.toB],c=t.state.sliceDoc(i,Math.max(i,a-1));i!=a&&s<=r.state.doc.length&&(c+=t.state.lineBreak),r.dispatch({changes:{from:o,to:Math.min(r.state.doc.length,s),insert:c},userEvent:`revert`}),e.preventDefault()}}destroy(){this.a.destroy(),this.b.destroy(),this.measuring>-1&&(this.dom.ownerDocument.defaultView||window).cancelAnimationFrame(this.measuring),this.dom.remove()}};function W4(e){let t=e.nextSibling;return e.remove(),t}var G4=new class extends Ii{constructor(){super(...arguments),this.elementClass=`cm-deletedLineGutter`}},K4=Ai.low(Ui({class:`cm-changeGutter`,markers:e=>e.plugin(g4)?.gutter||Ni.empty,widgetMarker:(e,t)=>t instanceof Z4?G4:null}));function q4(e){let t=typeof e.original==`string`?Ki.of(e.original.split(/\r?\n/)):e.original,n=e.diffConfig||h4;return[Ai.low(g4),n3,B4,Li.editorAttributes.of({class:`cm-merge-b`}),a4.of((e,t)=>{let r=t.effects.find(e=>e.is(J4));return r&&(e=s4.updateA(e,r.value.doc,t.startState.doc,r.value.changes,n)),t.docChanged&&(e=s4.updateB(e,t.state.field(Y4),t.newDoc,t.changes,n)),e}),r4.of({highlightChanges:e.highlightChanges!==!1,markGutter:e.gutter!==!1,syntaxHighlightDeletions:e.syntaxHighlightDeletions!==!1,syntaxHighlightDeletionsMaxLength:3e3,mergeControls:e.mergeControls??!0,overrideChunk:e.allowInlineDiffs?c3:void 0,side:`b`}),Y4.init(()=>t),e.gutter===!1?[]:K4,e.collapseUnchanged?L4(e.collapseUnchanged):[],o4.init(e=>s4.build(t,e.doc,n))]}var J4=Oi.define(),Y4=Fi.define({create:()=>Ki.empty,update(e,t){for(let n of t.effects)n.is(J4)&&(e=n.value.doc);return e}}),X4=new WeakMap,Z4=class extends Pi{constructor(e){super(),this.buildDOM=e,this.dom=null}eq(e){return this.dom==e.dom}toDOM(e){return this.dom||=this.buildDOM(e)}};function Q4(e,t,n){let r=X4.get(t.changes);if(r)return r;let i=Wi.widget({block:!0,side:-1,widget:new Z4(r=>{let{highlightChanges:i,syntaxHighlightDeletions:a,syntaxHighlightDeletionsMaxLength:o,mergeControls:s}=e.facet(r4),c=document.createElement(`div`);if(c.className=`cm-deletedChunk`,s){let t=c.appendChild(document.createElement(`div`));t.className=`cm-chunkButtons`;let n=e=>{e.preventDefault(),$4(r,r.posAtDOM(c))},i=e=>{e.preventDefault(),e3(r,r.posAtDOM(c))};if(typeof s==`function`)t.appendChild(s(`accept`,n)),t.appendChild(s(`reject`,i));else{let r=t.appendChild(document.createElement(`button`));r.name=`accept`,r.textContent=e.phrase(`Accept`),r.onmousedown=n;let a=t.appendChild(document.createElement(`button`));a.name=`reject`,a.textContent=e.phrase(`Reject`),a.onmousedown=i}}if(n||t.fromA>=t.toA)return c;let l=r.state.field(Y4).sliceString(t.fromA,t.endA),u=a&&e.facet(ji),d=h(),f=t.changes,p=0,m=!1;function h(){let e=c.appendChild(document.createElement(`div`));return e.className=`cm-deletedLine`,e.appendChild(document.createElement(`del`))}function g(e,t,n){for(let r=e;r<t;){if(l.charAt(r)==`
|
|
167
|
+
`){d.firstChild||d.appendChild(document.createElement(`br`)),d=h(),r++;continue}let e=t,a=n+(m?` cm-deletedText`:``),o=!1,s=l.indexOf(`
|
|
168
|
+
`,r);if(s>-1&&s<t&&(e=s),i&&p<f.length){let t=Math.max(0,m?f[p].toA:f[p].fromA);t<=e&&(e=t,m&&p++,o=!0)}if(e>r){let t=document.createTextNode(l.slice(r,e));if(a){let e=d.appendChild(document.createElement(`span`));e.className=a,e.appendChild(t)}else d.appendChild(t);r=e}o&&(m=!m)}}if(u&&t.toA-t.fromA<=o){let t=u.parser.parse(l),n=0;Ti(t,{style:t=>Si(e,t)},(e,t,r)=>{e>n&&g(n,e,``),g(e,t,r),n=t}),g(n,l.length,``)}else g(0,l.length,``);return d.firstChild||d.appendChild(document.createElement(`br`)),c})});return X4.set(t.changes,i),i}function $4(e,t){let{state:n}=e,r=t??n.selection.main.head,i=e.state.field(o4).find(e=>e.fromB<=r&&e.endB>=r);if(!i)return!1;let a=e.state.sliceDoc(i.fromB,Math.max(i.fromB,i.toB-1)),o=e.state.field(Y4);i.fromB!=i.toB&&i.toA<=o.length&&(a+=e.state.lineBreak);let s=wi.of({from:i.fromA,to:Math.min(o.length,i.toA),insert:a},o.length);return e.dispatch({effects:J4.of({doc:s.apply(o),changes:s}),userEvent:`accept`}),!0}function e3(e,t){let{state:n}=e,r=t??n.selection.main.head,i=n.field(o4).find(e=>e.fromB<=r&&e.endB>=r);if(!i)return!1;let a=n.field(Y4).sliceString(i.fromA,Math.max(i.fromA,i.toA-1));return i.fromA!=i.toA&&i.toB<=n.doc.length&&(a+=n.lineBreak),e.dispatch({changes:{from:i.fromB,to:Math.min(n.doc.length,i.toB),insert:a},userEvent:`revert`}),!0}function t3(e){let t=new Ei;for(let n of e.field(o4)){let r=e.facet(r4).overrideChunk&&i3(e,n);t.add(n.fromB,n.fromB,Q4(e,n,!!r))}return t.finish()}var n3=Fi.define({create:e=>t3(e),update(e,t){return t.state.field(o4,!1)==t.startState.field(o4,!1)?e:t3(t.state)},provide:e=>Li.decorations.from(e)}),r3=new WeakMap;function i3(e,t){let n=r3.get(t);if(n!==void 0)return n;n=null;let r=e.field(Y4),i=e.doc,a=r.lineAt(t.endA).number-r.lineAt(t.fromA).number+1,o=i.lineAt(t.endB).number-i.lineAt(t.fromB).number+1;abort:if(a==o&&a<10){let e=[],i=0,o=t.fromA,s=t.fromB;for(let n of t.changes){if(n.fromA<n.toA){i+=n.toA-n.fromA;let t=r.sliceString(o+n.fromA,o+n.toA);if(/\n/.test(t))break abort;e.push(Wi.widget({widget:new a3(t),side:-1}).range(s+n.fromB))}n.fromB<n.toB&&e.push(x4.range(s+n.fromB,s+n.toB))}i<t.endA-t.fromA-a*2&&(n=e)}return r3.set(t,n),n}var a3=class extends Pi{constructor(e){super(),this.text=e}eq(e){return this.text==e.text}toDOM(e){let t=document.createElement(`del`);return t.className=`cm-deletedText`,t.textContent=this.text,t}},o3=new class extends Ii{constructor(){super(...arguments),this.elementClass=`cm-inlineChangedLineGutter`}},s3=Wi.line({class:`cm-inlineChangedLine`});function c3(e,t,n,r){let i=i3(e,t),a=0;if(!i)return!1;for(let o=e.doc.lineAt(t.fromB);;){for(r&&r.add(o.from,o.from,o3),n.add(o.from,o.from,s3);a<i.length&&i[a].to<=o.to;){let e=i[a++];n.add(e.from,e.to,e.value)}if(o.to>=t.endB)break;o=e.doc.lineAt(o.to+1)}return!0}var l3={bg:`#10100f`,fg:`#d8d2c4`,line:`#171716`,border:`#2c2c28`,selection:`#3a3934`,gutter:`#73736b`};function u3(e){let t=Li.theme({"&":{backgroundColor:l3.bg,color:l3.fg,height:`100%`},".cm-content":{caretColor:l3.fg,padding:`16px 0`},".cm-cursor":{borderLeftColor:l3.fg},".cm-activeLine":{backgroundColor:`#ffffff08`},".cm-activeLineGutter":{backgroundColor:l3.line,color:l3.fg},".cm-gutters":{backgroundColor:l3.bg,color:l3.gutter,border:`none`},"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, ::selection":{backgroundColor:l3.selection},".cm-panels":{backgroundColor:l3.line,color:l3.fg},".cm-searchMatch":{backgroundColor:`#61533b70`},".cm-searchMatch-selected":{backgroundColor:`#61533b`},"&.cm-focused":{outline:`none`},".cm-scroller":{fontFamily:`"Noto Sans Mono", monospace`,fontSize:`13px`}},{dark:!0});return e?[t,ki(f3)]:[t,ki(d3)]}var d3=Gi.define([{tag:[Di.keyword,Di.operatorKeyword],color:`#c678dd`},{tag:[Di.string,Di.regexp],color:`#98c379`},{tag:[Di.number,Di.bool,Di.null],color:`#d19a66`},{tag:Di.comment,color:`#7d8799`,fontStyle:`italic`},{tag:[Di.typeName,Di.className],color:`#e5c07b`},{tag:[Di.function(Di.variableName),Di.propertyName],color:`#61afef`},{tag:[Di.tagName,Di.angleBracket],color:`#e06c75`},{tag:Di.attributeName,color:`#d19a66`}]),f3=Gi.define([{tag:Di.comment,color:`#8c8c84`},{tag:[Di.keyword,Di.operatorKeyword,Di.modifier,Di.controlKeyword],color:`#d8a18f`},{tag:[Di.operator,Di.punctuation],color:`#aba79b`},{tag:[Di.string,Di.attributeValue],color:`#a9b985`},{tag:Di.escape,color:`#d8b580`},{tag:[Di.number,Di.bool,Di.null,Di.atom],color:`#c5a5b8`},{tag:Di.regexp,color:`#b5b991`},{tag:[Di.typeName,Di.className,Di.namespace],color:`#d8b580`},{tag:[Di.tagName,Di.angleBracket],color:`#d8a18f`},{tag:[Di.attributeName,Di.propertyName],color:`#a0b7aa`},{tag:Di.meta,color:`#aba79b`},{tag:Di.heading,color:`#d8b580`,fontWeight:`bold`},{tag:Di.link,color:`#a0b7aa`,textDecoration:`underline`}]);function p3(e){return e===`projector-soft`?u3(!0):e===`projector`?u3(!1):Ir}var m3=new Mi,h3=new Mi,g3=e=>zi.matchFilename(Dr,e.split(`/`).at(-1)??e);function _3(e){return g3(e)?.name??null}async function v3(e){let t=g3(e);return t?await t.load():[]}var y3=class extends Ii{kind;top;constructor(e,t){super(),this.kind=e,this.top=t}eq(e){return e.kind===this.kind&&e.top===this.top}toDOM(){let e=document.createElement(`div`);return e.className=`git-gutter-${this.kind}${this.top?` git-gutter-deleted-top`:``}`,e}},b3=Oi.define(),x3=Fi.define({create:()=>null,update(e,t){for(let e of t.effects)if(e.is(b3))return e.value;return e}}),S3=Fi.define({create:()=>[],update(e,t){let n=t.state.field(x3);return!t.effects.some(e=>e.is(b3))&&!t.docChanged?e:n===null?[]:s4.build(xi.create({doc:n}).doc,t.state.doc)}});function C3(e){return e.fromA===e.toA?`added`:e.fromB===e.toB?`deleted`:`modified`}var w3=Oi.define(),T3=Oi.define(),E3=Fi.define({create:()=>null,update(e,t){for(let e of t.effects){if(e.is(w3))return e.value;if(e.is(T3))return null}return t.docChanged||t.effects.some(e=>e.is(b3))?null:e}}),D3=(e,t)=>e.field(S3).find(e=>t.from>=e.fromB&&t.from<=Math.max(e.fromB,e.endB-1)),O3=(e,t)=>e.doc.lineAt(Math.max(t.fromB,Math.min(t.endB-1,e.doc.length))).to;function k3(e,t,n){let r=document.createElement(`button`);return r.type=`button`,r.className=`dirty-diff-button`,r.textContent=e,r.title=t,r.addEventListener(`mousedown`,e=>e.preventDefault()),r.addEventListener(`click`,e=>{e.stopPropagation(),n()}),r}function A3(e,t,n){n.textContent=t;let r=e.facet(ji)?.parser;if(!r||!t)return;n.textContent=``;let i=0,a=(e,r)=>{let a=document.createTextNode(t.slice(i,e));if(!r)n.append(a);else{let e=document.createElement(`span`);e.className=r,e.append(a),n.append(e)}i=e};Ti(r.parse(t),{style:t=>Si(e,t)},(e,t,n)=>{e>i&&a(e,``),a(t,n)}),i<t.length&&a(t.length,``)}var j3=class extends Pi{chunk;text;index;total;constructor(e,t,n,r){super(),this.chunk=e,this.text=t,this.index=n,this.total=r}eq(e){return e.chunk.fromA===this.chunk.fromA&&e.chunk.fromB===this.chunk.fromB&&e.text===this.text&&e.index===this.index&&e.total===this.total}get estimatedHeight(){return(this.text.split(`
|
|
169
|
+
`).length+1)*20}toDOM(e){let t=C3(this.chunk),n=document.createElement(`div`);n.className=`dirty-diff-peek dirty-diff-peek-${t}`;let r=document.createElement(`div`);r.className=`dirty-diff-bar`;let i=document.createElement(`span`);if(i.className=`dirty-diff-title`,i.textContent=`Изменение ${this.index+1} из ${this.total}`,r.append(i,k3(`↑`,`Предыдущее изменение (Shift+Alt+F3)`,()=>I3(-1)(e)),k3(`↓`,`Следующее изменение (Alt+F3)`,()=>I3(1)(e)),k3(`↶`,`Откатить изменение`,()=>F3(e,this.chunk)),k3(`×`,`Закрыть (Esc)`,()=>e.dispatch({effects:T3.of(null)}))),n.append(r),t!==`added`){let t=document.createElement(`div`);t.className=`dirty-diff-body`,A3(e.state,this.text.replace(/\n$/,``),t),n.append(t)}return n}ignoreEvent(){return!0}},M3=Li.decorations.compute([E3,S3],e=>{let t=e.field(E3);if(t===null)return Wi.none;let n=e.field(S3),r=n.findIndex(e=>e.fromB===t),i=n[r],a=e.field(x3);if(!i||a===null)return Wi.none;let o=new j3(i,a.slice(i.fromA,i.toA),r,n.length),s=C3(i)===`deleted`?N3(e,i):O3(e,i);return Wi.set(Wi.widget({widget:o,block:!0,side:1}).range(s))});function N3(e,t){return t.fromB===0?0:e.doc.lineAt(Math.min(t.fromB,e.doc.length)).to}var P3=Ui({class:`cm-dirty-gutter`,markers(e){let t=e.state.doc,n=[];for(let r of e.state.field(S3)){let e=C3(r);if(e===`deleted`){let i=r.fromB===0,a=t.lineAt(Math.min(r.fromB,t.length));n.push(new y3(e,i).range(i?0:a.from));continue}let i=t.lineAt(r.fromB).number,a=t.lineAt(Math.max(r.fromB,r.endB-1)).number;for(let r=i;r<=a;r++)n.push(new y3(e,!1).range(t.line(r).from))}return Ni.of(n,!0)},lineMarkerChange:e=>e.docChanged||e.transactions.some(e=>e.effects.some(e=>e.is(b3))),initialSpacer:()=>new y3(`added`,!1),domEventHandlers:{mousedown(e,t){let n=e.state.doc,r=D3(e.state,t)??e.state.field(S3).find(e=>C3(e)===`deleted`&&n.lineAt(Math.min(e.fromB,n.length)).from===t.from);if(!r)return!1;let i=e.state.field(E3)===r.fromB;return e.dispatch({effects:i?T3.of(null):w3.of(r.fromB)}),!0}}});function F3(e,t){let n=e.state.field(x3);if(n===null)return;let r=n.slice(t.fromA,t.toA);e.dispatch({changes:{from:t.fromB,to:t.toB,insert:r}})}function I3(e){return t=>{let n=t.state.field(S3);if(!n.length)return!1;let r=t.state.field(E3)??t.state.selection.main.head,i=e===1?n.find(e=>e.fromB>r)??n[0]:n.findLast(e=>e.fromB<r)??n.at(-1),a=Math.min(i.fromB,t.state.doc.length);return t.dispatch({selection:{anchor:a},effects:[w3.of(i.fromB),Li.scrollIntoView(a,{y:`center`})]}),!0}}var L3=[x3,S3,E3,M3,P3,Ai.high(Bi.of([{key:`Alt-F3`,run:I3(1)},{key:`Shift-Alt-F3`,run:I3(-1)},{key:`Escape`,run:e=>e.state.field(E3)!==null&&(e.dispatch({effects:T3.of(null)}),!0)}]))],R3={key:0,class:`item u-truncate`,title:`Позиция каретки`},z3={key:1,class:`item u-truncate`},B3={class:`item u-truncate`,title:`Язык подсветки синтаксиса`},V3=[`title`],H3=G(M({__name:`EditorStatusLine`,props:{path:{},content:{}},setup(e){let t=e,n=x2().status,i=z(()=>S2(t.content)),a=z(()=>_3(t.path)??`Текст`),o=z(()=>{if(!n.selectedChars)return``;let e=n.selectedLines>1?` · ${n.selectedLines} строк`:``;return`выделено ${n.selectedChars} симв.${e}`});return(e,t)=>(V(),Y(r,{as:`footer`,gap:3,justify:`normal`,class:`editor-status-line`},{default:F(()=>[H(n).active?(V(),q(`span`,R3,` Строка `+j(H(n).line)+`, столбец `+j(H(n).column),1)):B(``,!0),o.value?(V(),q(`span`,z3,j(o.value),1)):B(``,!0),t[0]||=K(`span`,{class:`spacer`},null,-1),K(`span`,B3,j(a.value),1),K(`span`,{class:`item u-truncate`,title:`Перевод строк документа: ${i.value}`},j(i.value),9,V3)]),_:1}))}}),[[`__scopeId`,`data-v-60601347`]]),U3=Symbol(`editor-topbar`);function W3(){let e=We(null);return ot(U3,e),e}function G3(){return tt(U3,null)}var K3=Nt(()=>yi(()=>import(`./IssueView-ChJFmrTW.js`),__vite__mapDeps([18,3,1,4,5,6,7,19,20,21,22,12,13,14,23,24,25,8,9,26,27,28,29,15,30,31]))),q3=Nt(()=>yi(()=>import(`./PullRequestView-Cipn5P0H.js`),__vite__mapDeps([32,3,1,4,5,6,7,12,13,14,19,20,21,22,23,24,25,8,9,26,27,28,29,15,30,31,33]))),J3=Nt(()=>yi(()=>import(`./DiscussionView-K3YyWE-E.js`),__vite__mapDeps([34,3,1,4,5,6,7,19,20,21,22,12,13,14,23,24,25,8,9,26,27,28,29,15,30,31,35]))),Y3=Nt(()=>yi(()=>import(`./ReleaseView-Cz6dH4ej.js`),__vite__mapDeps([36,3,1,4,5,6,7,12,13,14,19,20,21,28,24,23,25,8,9,26,27,29,15,30,37]))),X3=Nt(()=>yi(()=>import(`./CodeViewer-C-C3aibO.js`),__vite__mapDeps([11,1,4,12,3,5,6,7,13,14,8,9,15,16,17]))),Z3=Nt(()=>yi(()=>import(`./MarkdownViewer-Dm2MVp3X.js`),__vite__mapDeps([38,1,4,5,6,8,9,13,28,24,12,3,7,14,23,25,26,27,29,15,30,39]))),Q3=Nt(()=>yi(()=>import(`./SvgViewer-DkoULP8F.js`),__vite__mapDeps([40,3,1,4,5,6,7,8,9,13,25,26,41,42,43]))),$3=Nt(()=>yi(()=>import(`./HtmlViewer-DULKK0_6.js`),__vite__mapDeps([44,3,1,4,5,6,7,8,9,13,20,41,42,45]))),e6=Nt(()=>yi(()=>import(`./EditorSettings-DlzJc8cp.js`),__vite__mapDeps([46,3,1,4,5,6,7,13,16,47]))),t6=e=>e.params?.title?{}:{onTitle:t=>e.path=t},n6=e=>({component:rP,keepAlive:!0,props:(t,n)=>({projectId:n.projectId,backend:e,chatId:t.params?.chatId,role:ib(t.params?.role),...t6(t)})});function r6(){return{keybindings:{component:jd,ownKeys:!0,keepAlive:!0},network:{component:u0,ownKeys:!0,keepAlive:!0},docker:{component:FZ,keepAlive:!0},browser:{component:A0,keepAlive:!0,ownKeys:!0,props:(e,t)=>({projectId:t.projectId,url:e.params?.url,onNavigate:(t,n)=>{e.params={...e.params,url:t,title:n},n&&(e.path=n)}})},agent:{component:rP,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,chatId:e.params?.chatId,role:ib(e.params?.role),...t6(e)})},"agent-task":{component:yO,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,chat:e.params?.chat,task:e.params?.task})},"agent-job":{component:Fk,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,job:e.params?.job,onOpenFile:t.openFile,onTitle:t=>{e.path=t}})},...Object.fromEntries(qn().filter(e=>!e.builtin).map(e=>[e.program,n6(e.backend)])),issue:{component:K3,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,number:e.params?.number,onOpen:t.openFile})},pull:{component:q3,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,number:e.params?.number,onOpen:t.openFile,onOpenSection:t.openSection,onOpenPullFile:t.openPullFile,onOpenJob:e=>t.openTab(`job`,e,{preview:!1}),onOpenPipeline:e=>t.openTab(`pipeline`,e,{preview:!1})})},discussion:{component:J3,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,number:e.params?.number,onOpen:t.openFile})},release:{component:Y3,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,tag:typeof e.params?.tag==`string`?e.params.tag:``})},commit:{component:h2,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,hash:e.params?.hash,onOpenCommit:e=>t.openTab(`commit`,{hash:e}),onOpenDiff:t.openCommitDiff,onOpenTree:t.openCommitTree,onOpenCompare:t.openCompareTree,onSubject:t=>e.content=t})}}}var i6=Symbol.for(`projector.workspace-tabs`);function a6(e,t={},n={}){let r=Hn(e0,e.tabs);ot(i6,{types:r,views:{...r6(),...t}});let i=Object.entries(n).map(([e,t])=>r.behave(e,t));return lt(()=>i.forEach(e=>e())),r}function o6(){let e=tt(i6);if(!e)throw Error(`Workspace tabs are not provided`);return e}var s6=Symbol.for(`projector.tab-host`),c6=e=>ot(s6,e);function l6(){let e=tt(s6);if(!e)throw Error(`Tab host is not provided`);return e}var u6=M({__name:`TabReadoutScope`,props:{tabKey:{}},setup(e){let t=e;return li(()=>t.tabKey),(e,t)=>L(e.$slots,`default`)}}),d6={class:`topbar`},f6={class:`topbar-path u-truncate`},p6={key:0,class:`topbar-note`},m6={key:1,class:`topbar-note`},h6={key:0,class:`file-note`},g6={key:1,class:`file-error`,role:`alert`},_6=[`data-own-keys`],v6={key:1,class:`file-error`},y6=G(M({__name:`FilePanel`,props:{file:{},projectId:{},revision:{}},emits:[`change`,`save`,`mode`,`open`,`reload`,`keep`],setup(e,{emit:t}){let n=e,r=t,i=o6(),a=l6();y2();let o=W3(),s=e=>{o.value=e},c=z(()=>s1(n.file)?er(n.projectId,n.file.path):``),l=z(()=>s1(n.file)||n.file.virtual||n.file.image?``:/\.html?$/i.test(n.file.path)?`HTML из снимка открыт как код: встроенный просмотр страницы доступен только для рабочей копии`:/\.(?:tar|tgz|gz|gzip|bz2|tbz2?|xz|txz|zip)$/i.test(n.file.path)?`Архив из снимка не распаковывается: показано только содержимое файла`:``),u=z(()=>n.file.virtual?i.views[n.file.virtual]:void 0),d=z(()=>n.file.virtual?i.types.get(n.file.virtual)?.subtitle:void 0),f=z(()=>!n.file.virtual&&!n.file.binary&&!n.file.image&&!n.file.archive);return(t,n)=>(V(),Y(Wr,{as:`div`,sizing:`flex`,class:`file-panel`},{default:F(()=>[K(`div`,d6,[K(`span`,f6,j(e.file.path),1),d.value?(V(),q(`span`,p6,j(d.value),1)):B(``,!0),e.file.external||e.file.readonly?(V(),q(`span`,m6,`только просмотр`)):B(``,!0),K(`div`,{ref:s,class:`topbar-actions`},null,512)]),l.value?(V(),q(`p`,h6,j(l.value),1)):B(``,!0),e.file.saveError&&!H(u1)(e.file)?(V(),q(`p`,g6,j(e.file.saveError),1)):B(``,!0),e.file.conflict?(V(),Y(Zf,{key:2,class:`file-conflict`,role:`alert`,wrap:``,text:`xs`},{default:F(()=>[K(`span`,null,j(e.file.conflict.error?`Файл недоступен на диске: ${e.file.conflict.error}`:`Файл изменён на диске, а во вкладке есть несохранённые правки`),1),K(`button`,{type:`button`,onClick:n[0]||=e=>r(`reload`)},j(e.file.conflict.error?`Проверить снова`:`Загрузить с диска`),1),e.file.conflict.disk===void 0?B(``,!0):(V(),q(`button`,{key:0,type:`button`,onClick:n[1]||=e=>r(`keep`)},` Оставить мою версию `))]),_:1})):B(``,!0),K(`div`,{class:`panel-body`,"data-own-keys":u.value?.ownKeys||void 0},[u.value?(V(),Y(u6,{key:0,"tab-key":e.file.key},{default:F(()=>[(V(),Y(qe(u.value.component),ie(le(u.value.props?.(e.file,H(a)))),null,16))]),_:1},8,[`tab-key`])):e.file.binary&&!e.file.image?(V(),q(`p`,v6,` Бинарный файл · `+j(e.file.size)+` байт `,1)):e.file.image?(V(),Y(H(oee),{key:2,src:e.file.image,alt:e.file.path},null,8,[`src`,`alt`])):e.file.archive?(V(),Y(H(F0),{key:3,archive:e.file.archive},null,8,[`archive`])):/\.svg$/i.test(e.file.path)&&e.file.original===void 0&&(!e.file.scope||e.file.scope.kind!==`compare`)?(V(),Y(H(Q3),{key:4,path:e.file.path,"project-id":H(s1)(e.file)?e.projectId:``,content:e.file.draft??e.file.content,editable:H(l1)(e.file),line:e.file.line,"end-line":e.file.endLine,column:e.file.column,onChange:n[2]||=e=>r(`change`,e),onSave:n[3]||=e=>r(`save`)},null,8,[`path`,`project-id`,`content`,`editable`,`line`,`end-line`,`column`])):H(d1)(e.file)&&c.value?(V(),Y(H($3),{key:5,path:e.file.path,"project-id":H(s1)(e.file)?e.projectId:``,content:e.file.draft??e.file.content,saved:e.file.content,"site-url":c.value,reload:e.file.htmlReload,editable:H(l1)(e.file),line:e.file.line,"end-line":e.file.endLine,column:e.file.column,onChange:n[4]||=e=>r(`change`,e),onSave:n[5]||=e=>r(`save`),onCommand:n[6]||=(e,t)=>H(a).run(e,t)},null,8,[`path`,`project-id`,`content`,`saved`,`site-url`,`reload`,`editable`,`line`,`end-line`,`column`])):H(u1)(e.file)?(V(),Y(H(Z3),{key:e.file.readonly?e.revision:void 0,"project-id":e.projectId,scope:e.file.scope,editable:H(l1)(e.file),path:e.file.path,content:e.file.draft??e.file.content,mode:e.file.markdownMode??`document`,error:e.file.saveError,line:e.file.line,"end-line":e.file.endLine,column:e.file.column,onChange:n[7]||=e=>r(`change`,e),onMode:n[8]||=e=>r(`mode`,e),onCommand:n[9]||=(e,t)=>H(a).run(e,t),onSave:n[10]||=e=>r(`save`),onOpen:n[11]||=e=>r(`open`,e)},null,8,[`project-id`,`scope`,`editable`,`path`,`content`,`mode`,`error`,`line`,`end-line`,`column`])):e.file.virtual?B(``,!0):(V(),Y(H(X3),{key:7,path:e.file.path,"project-id":H(s1)(e.file)?e.projectId:``,revision:e.revision,content:e.file.draft??e.file.content,editable:H(l1)(e.file),original:e.file.original,"original-label":e.file.commit?e.file.parent||`∅`:e.file.scope?.kind===`compare`?H(kr)(e.file.scope.from):e.file.staged?`HEAD`:`Индекс`,"modified-label":e.file.commit?e.file.commit.slice(0,7):e.file.scope?.kind===`compare`?H(kr)(e.file.scope.to):e.file.staged?`Индекс`:`Рабочий файл`,line:e.file.line,"end-line":e.file.endLine,column:e.file.column,onChange:n[12]||=e=>r(`change`,e),onSave:n[13]||=e=>r(`save`)},null,8,[`path`,`project-id`,`revision`,`content`,`editable`,`original`,`original-label`,`modified-label`,`line`,`end-line`,`column`]))],8,_6),f.value?(V(),Y(H(H3),{key:3,path:e.file.path,content:e.file.draft??e.file.content},null,8,[`path`,`content`])):B(``,!0)]),_:1}))}}),[[`__scopeId`,`data-v-ea9597bd`]]),b6=[`role`,`aria-valuemin`,`aria-valuemax`,`aria-valuenow`,`aria-label`],x6={class:`quota-label`},S6={key:0,class:`quota-time`},C6=G(M({__name:`UsageMeter`,props:{remaining:{},ariaLabel:{},prefix:{},valueText:{},countdown:{},ticks:{},exhausted:{type:Boolean},compact:{type:Boolean},tone:{}},setup(e){return(t,n)=>(V(),q(`span`,{class:O([`quota-bar`,[e.tone?`tone-${e.tone}`:void 0,{unavailable:e.remaining===null&&e.valueText===void 0,exhausted:e.exhausted,compact:e.compact,"tooltip-bar":e.countdown!==void 0}]]),role:e.ariaLabel&&e.remaining!==null?`meter`:void 0,"aria-valuemin":e.ariaLabel&&e.remaining!==null?0:void 0,"aria-valuemax":e.ariaLabel&&e.remaining!==null?100:void 0,"aria-valuenow":e.ariaLabel?e.remaining??void 0:void 0,"aria-label":e.ariaLabel},[e.remaining===null?B(``,!0):(V(),q(`span`,{key:0,class:`quota-fill`,style:k({width:`${e.remaining}%`})},null,4)),(V(!0),q(W,null,J(e.ticks,e=>(V(),q(`span`,{key:e,class:`quota-tick`,style:k({left:`${e}%`}),"aria-hidden":`true`},null,4))),128)),K(`span`,x6,[K(`span`,null,j(e.prefix?`${e.prefix} · `:``)+j(e.valueText??(e.remaining===null?`—`:`${e.remaining}%`)),1),e.countdown===void 0?B(``,!0):(V(),q(`span`,S6,j(e.countdown),1))])],10,b6))}}),[[`__scopeId`,`data-v-515ab77d`]]),w6={class:`usage-icon`,"aria-hidden":`true`},T6=[`id`],E6={class:`tooltip-heading`},D6={key:0,class:`tooltip-hint`},O6=G(M({__name:`UsageIndicator`,props:{title:{},tooltip:{},remaining:{},tone:{},meterLabel:{},rows:{},prefix:{},valueText:{},compact:{type:Boolean},interactive:{type:Boolean}},emits:[`cycle`],setup(e,{emit:t}){let n=t,i=P();return(t,a)=>(V(),Y(r,{as:e.interactive?`button`:`span`,inline:``,gap:1.5,justify:`normal`,type:e.interactive?`button`:void 0,tabindex:e.interactive?void 0:0,class:O([`usage-indicator`,[e.tone?`tone-${e.tone}`:void 0,{interactive:e.interactive}]]),"aria-label":e.tooltip,"aria-describedby":H(i),onClick:a[0]||=t=>e.interactive&&n(`cycle`)},{default:F(()=>[K(`span`,w6,[L(t.$slots,`icon`,{},void 0,!0)]),I(C6,{remaining:e.remaining,prefix:e.prefix,"value-text":e.valueText,compact:e.compact,tone:e.tone,"aria-label":e.meterLabel},null,8,[`remaining`,`prefix`,`value-text`,`compact`,`tone`,`aria-label`]),K(`span`,{id:H(i),class:`quota-tooltip`,role:`tooltip`},[e.rows.length?(V(),q(W,{key:0},[K(`span`,E6,j(e.title)+` · сброс через`,1),(V(!0),q(W,null,J(e.rows,e=>(V(),q(`span`,{key:e.name,class:`quota-row`},[K(`span`,null,j(e.label),1),I(C6,{remaining:e.remaining,countdown:e.countdown,exhausted:e.limited,ticks:e.ticks,tone:e.tone},null,8,[`remaining`,`countdown`,`exhausted`,`ticks`,`tone`])]))),128)),e.interactive?(V(),q(`span`,D6,`Клик — сменить лимит`)):B(``,!0)],64)):(V(),q(W,{key:1},[N(j(e.tooltip),1)],64))],8,T6)]),_:3},8,[`as`,`type`,`tabindex`,`class`,`aria-label`,`aria-describedby`]))}}),[[`__scopeId`,`data-v-1086ae12`]]),k6=at({}),A6=at({text:null,tone:null});function j6(e,t){Qe(()=>{A6.text=e.value,A6.tone=t.value}),lt(()=>{A6.text=null,A6.tone=null})}function M6(e,t,n){Qe(()=>{k6[e]={remaining:t.value,tone:n.value}}),lt(()=>delete k6[e])}function N6(e,t={}){let n=We(null),r=X(!1),i=t.intervalMs??6e4,a,o,s=!1;async function c(){if(!(s||o||document.hidden)){clearTimeout(a),o=new AbortController;try{let t=await fetch(typeof e==`function`?e():e,{signal:o.signal});if(!t.ok)throw Error(`Usage unavailable`);let i=await t.json();s||(n.value=i,r.value=!1)}catch{s||(r.value=!0)}finally{if(o=void 0,!s){let e=n.value&&t.nextCheckAt?.(n.value);a=setTimeout(c,Math.max(i,(e??0)-Date.now()))}}}}function l(){document.hidden||c()}return Lt(()=>{c(),document.addEventListener(`visibilitychange`,l)}),lt(()=>{s=!0,clearTimeout(a),o?.abort(),document.removeEventListener(`visibilitychange`,l)}),{usage:n,failed:r,refresh:c}}var P6={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function F6(e,t){return V(),q(`svg`,P6,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1`}),K(`path`,{d:`M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4`})],-1)]])}var I6=U({name:`lucide-wallet`,render:F6});async function L6(e,t){let n=await fetch(e,{...t,headers:{"Content-Type":`application/json`}}),r=await n.json();if(!n.ok)throw Error(r.error||`Ошибка запроса`);return r}function R6(){return L6(`/api/providers`)}function z6(e){return L6(`/api/providers`,{method:`PUT`,body:JSON.stringify(e)})}function B6(e){return L6(`/api/providers/active`,{method:`PATCH`,body:JSON.stringify({id:e})})}function V6(e){return L6(`/api/providers/balance${e?`?id=${encodeURIComponent(e)}`:``}`)}async function H6(e){let{models:t}=await L6(`/api/providers/models`,{method:`POST`,body:JSON.stringify(e)});return t}var U6={deepseek:{thinking:`deepseek`,label:`DeepSeek`,name:`DeepSeek`,url:`https://api.deepseek.com`,model:`deepseek-chat`,keyPlaceholder:`sk-… с platform.deepseek.com`,hint:`Баланс аккаунта показывается в статусной строке и обновляется раз в минуту.`},qwencloud:{thinking:`qwen`,label:`Qwen Cloud`,name:`Qwen / DashScope`,url:`https://dashscope-intl.aliyuncs.com/compatible-mode/v1`,model:`qwen3.8-flash`,keyPlaceholder:`DASHSCOPE / QWENCLOUD`,hint:`Qwen Cloud не отдаёт баланс по ключу API: остаток смотрите в консоли QwenCloud.`},local:{thinking:`ollama`,label:`Локальный (Ollama, LM Studio…)`,name:`Локальный`,url:`http://localhost:11434/v1`,model:``,keyPlaceholder:`обычно не нужен`,hint:`Локальному провайдеру баланс не нужен, ключ обычно не требуется.`},custom:{thinking:`none`,label:`Другой OpenAI-compatible`,name:`Провайдер`,url:``,model:``,keyPlaceholder:`API key`,hint:`Для этого провайдера баланс недоступен.`}},W6=Object.keys(U6),G6=[{value:`none`,label:`Не передавать`},{value:`qwen`,label:`Qwen / DashScope (enable_thinking)`},{value:`vllm`,label:`vLLM, llama.cpp (chat_template_kwargs)`},{value:`deepseek`,label:`DeepSeek (thinking + reasoning_effort)`},{value:`ollama`,label:`Ollama, LM Studio (reasoning_effort, можно выключить)`},{value:`openai`,label:`OpenAI (reasoning_effort)`},{value:`openrouter`,label:`OpenRouter (reasoning)`}],K6=at({providers:[],activeProviderId:null,keyDrafts:{},balances:{},remoteModels:{},fetchingModels:{},modelsError:{},revision:0,loading:!1,saving:!1,error:``});function q6(){let e=z(()=>K6.providers),t=z(()=>K6.activeProviderId),n=z(()=>K6.providers.find(e=>e.id===K6.activeProviderId)??K6.providers[0]??null),r=z(()=>K6.loading),i=z(()=>K6.saving),a=z(()=>K6.error),o=z(()=>!!n.value?.url);function s(e){K6.providers=e.providers,K6.activeProviderId=e.activeProviderId,K6.keyDrafts={},K6.revision++}async function c(e){try{K6.balances[e]=await V6(e)}catch{K6.balances[e]=void 0}}function l(){return Promise.all(K6.providers.filter(e=>e.kind===`deepseek`).map(e=>c(e.id)))}async function u(){K6.loading=!0,K6.error=``;try{s(await R6())}catch(e){K6.error=e instanceof Error?e.message:`Не удалось загрузить провайдеров`}finally{K6.loading=!1}}async function d(){K6.saving=!0,K6.error=``;try{s(await z6({activeProviderId:K6.activeProviderId,providers:K6.providers.map(e=>({...e,apiKey:K6.keyDrafts[e.id]}))}))}catch(e){K6.error=e instanceof Error?e.message:`Не удалось сохранить`}finally{K6.saving=!1}}async function f(e){K6.activeProviderId=e;try{s(await B6(e))}catch(e){K6.error=e instanceof Error?e.message:`Не удалось выбрать провайдера`}}function p(e=`custom`){let t=`p${gr().slice(0,8)}`,n=U6[e];return K6.providers.push({id:t,kind:e,thinkingStyle:n.thinking,name:e===`custom`?`Провайдер ${K6.providers.length+1}`:n.name,url:n.url,enabled:!0,models:n.model?[{id:n.model,alias:n.model}]:[],hasApiKey:!1}),K6.activeProviderId||=t,t}function m(e){K6.providers=K6.providers.filter(t=>t.id!==e),delete K6.keyDrafts[e],K6.activeProviderId===e&&(K6.activeProviderId=K6.providers[0]?.id??null),d()}function h(e,t){K6.keyDrafts[e]=t}function g(e,t){let n=K6.providers.find(t=>t.id===e);n&&Object.assign(n,t)}async function _(e){let t=K6.providers.find(t=>t.id===e);if(t){K6.fetchingModels[e]=!0,K6.modelsError[e]=void 0;try{K6.remoteModels[e]=await H6({id:e,url:t.url,apiKey:K6.keyDrafts[e]})}catch(t){K6.modelsError[e]=t instanceof Error?t.message:`Не удалось получить список`}finally{K6.fetchingModels[e]=!1}}}function v(e,t,n=``){let r=K6.providers.find(t=>t.id===e),i=t.trim();if(!r||!i)return;let a=new Set(r.models.map(e=>e.alias)),o=n.trim()||i;for(let e=2;a.has(o);e++)o=`${n.trim()||i}-${e}`;r.models.push({id:i,alias:o})}function y(e,t){let n=K6.providers.find(t=>t.id===e);n&&(n.models=n.models.filter(e=>e.id!==t))}function b(e,t,n){let r=K6.providers.find(t=>t.id===e)?.models.find(e=>e.id===t);r&&(r.alias=n)}function x(e,t,n){let r=K6.providers.find(t=>t.id===e)?.models.find(e=>e.id===t);r&&(r.contextTokens=n)}function S(e,t,n,r){let i=K6.providers.find(t=>t.id===e)?.models.find(e=>e.id===t);i&&(i.price={...i.price,[n]:r})}function C(e,t,n){let r=K6.providers.find(t=>t.id===e)?.models.find(e=>e.id===t);r&&(r.thinking=n?void 0:!1)}return{fetchModels:_,setModelThinking:C,setModelContext:x,setModelPrice:S,registerModel:v,unregisterModel:y,renameModel:b,remoteModels:z(()=>K6.remoteModels),fetchingModels:z(()=>K6.fetchingModels),modelsError:z(()=>K6.modelsError),providers:e,activeProviderId:t,activeProvider:n,loading:r,saving:i,error:a,ready:o,revision:z(()=>K6.revision),balances:z(()=>K6.balances),loadBalance:c,loadBalances:l,keyDrafts:z(()=>K6.keyDrafts),load:u,save:d,setActive:f,addProvider:p,removeProvider:m,setKeyDraft:h,patchProvider:g}}var J6={CNY:`¥`,USD:`$`};function Y6(e){return e.map(({currency:e,total:t})=>J6[e]?`${J6[e]}${t}`:`${t} ${e}`).join(` · `)}function X6(e,t){return Y6([{currency:e,total:t,granted:``,toppedUp:``}])}var Z6=e=>`provider:${e}`,Q6=e=>e.startsWith(`provider:`)?e.slice(9):void 0,$6=[`value`],e8=[`value`],t8=[`value`],n8={class:`kicker`},r8={class:`mid`},i8={key:3,class:`price`},a8={class:`price-label`},o8={class:`meta`},s8={class:`switch`},c8=G(M({__name:`ProviderPanel`,props:{providerId:{}},emits:[`open`],setup(e,{emit:n}){let o=e,s=n,{providers:c,activeProviderId:l,error:u,saving:d,keyDrafts:f,save:p,setActive:m,addProvider:h,removeProvider:_,setKeyDraft:v,patchProvider:y,balances:x,loadBalance:S,fetchModels:C,registerModel:w,unregisterModel:T,renameModel:ee,setModelContext:te,setModelPrice:D,setModelThinking:ne,remoteModels:re,fetchingModels:ie,modelsError:k}=q6(),A=z(()=>c.value.find(e=>e.id===o.providerId)),ae=z(()=>c.value.filter(e=>e.enabled).length),oe=z(()=>c.value.reduce((e,t)=>e+(t.enabled?t.models.length:0),0)),se=z(()=>U6[A.value?.kind??`custom`]),M=z(()=>A.value?x.value[A.value.id]:void 0),ce=z(()=>A.value?.kind===`deepseek`),le=[[`input`,`вход`],[`output`,`выход`],[`cacheRead`,`из кэша`]],ue=X(``),de=z(()=>{let e=A.value;if(!e)return[];let t=e.models.map(e=>({...e,on:!0})),n=new Set(e.models.map(e=>e.id)),r=(re.value[e.id]??[]).filter(e=>!n.has(e)).map(e=>({id:e,alias:e,on:!1})),i=ue.value.trim().toLowerCase();return[...t,...r].filter(e=>!i||e.id.toLowerCase().includes(i)||e.alias.toLowerCase().includes(i))}),fe=z(()=>!!(A.value&&ie.value[A.value.id])),pe=z(()=>{let e=new Set;return(A.value?.models??[]).some(t=>{let n=t.alias.trim()||t.id;return e.size===e.add(n).size})}),me=z(()=>{let e=A.value;if(!e)return 0;let t=new Set(e.models.map(e=>e.id));return e.models.length+(re.value[e.id]??[]).filter(e=>!t.has(e)).length}),he=X(``);function ge(e,t,n){if(!A.value)return;let r=n.trim()===``?void 0:Number(n);D(A.value.id,e,t,Number.isFinite(r)?r:void 0)}function _e(e,t){A.value&&te(A.value.id,e,Number(t)||void 0)}function ve(e){A.value&&y(A.value.id,{kind:e,thinkingStyle:U6[e].thinking})}function ye(e,t){A.value&&(t?w(A.value.id,e.id):T(A.value.id,e.id))}function P(){A.value&&w(A.value.id,he.value),he.value=``}function be(e){let t=h(e);return s(`open`,t),t}function xe(e){_(e),s(`open`,void 0)}let Se=E(`provider-settings`,()=>({surface:`settings`,provider:o.providerId??null}));Se.scope.registerCommand({id:`ide.providers.add`,title:`Добавить провайдера`,description:`Добавляет провайдера из пресета: deepseek, qwencloud, local или custom (по умолчанию custom). Подставляет адрес и модель; ключ вводится в форме, затем «сохранить».`,arguments:{kind:`deepseek | qwencloud | local | custom`},run:e=>{let t=b(e).kind??`custom`;if(!W6.includes(t))throw Error(`Неизвестный тип провайдера`);return be(t)}}),Se.scope.registerCommand({id:`ide.providers.models.refresh`,title:`Загрузить список моделей провайдера`,description:`Запрашивает у выбранного провайдера список моделей (GET /models по схеме OpenAI) и показывает их в карточке; затем модели регистрируются командой ide.providers.models.register.`,enabled:()=>!!A.value?.url,run:async()=>{A.value&&await C(A.value.id)}}),Se.scope.registerCommand({id:`ide.providers.models.register`,title:`Зарегистрировать модель провайдера`,description:`Добавляет модель выбранного провайдера: model — id у провайдера, alias — имя, под которым её увидят агент и шлюз (по умолчанию тот же id). Затем «сохранить».`,arguments:{model:`id модели у провайдера`,alias:`имя (необязательно)`},enabled:()=>!!A.value,run:e=>{let{model:t,alias:n}=b(e);if(!A.value||typeof t!=`string`||!t.trim())throw Error(`Укажите model`);w(A.value.id,t,typeof n==`string`?n:``)}}),Se.scope.registerCommand({id:`ide.providers.enabled.set`,title:`Включить или выключить провайдера`,description:`Включённый провайдер предлагает свои зарегистрированные модели агенту и шлюзу; включённых может быть сколько угодно. enabled: true | false. Затем «сохранить».`,arguments:{enabled:`true | false`},enabled:()=>!!A.value,run:e=>{A.value&&y(A.value.id,{enabled:String(b(e).enabled)!==`false`})}}),Se.scope.registerCommand({id:`ide.providers.balance.refresh`,title:`Обновить баланс провайдера`,description:`Запрашивает баланс выбранного провайдера (сейчас только DeepSeek; у Qwen Cloud и локальных баланса по ключу нет).`,enabled:()=>ce.value,run:async()=>{A.value&&await S(A.value.id)}});function Ce(){return A.value?f.value[A.value.id]??``:``}return(e,n)=>(V(),Y(ml,{as:`section`,gap:4},{default:F(()=>[H(u)?(V(),Y(t,{key:0,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(H(u)),1)]),_:1})):B(``,!0),A.value?(V(),Y(ml,{key:2,class:`form`,gap:3},{default:F(()=>[I(CZ,{layout:`wide-end`},{default:F(()=>[I(g,{label:`имя`},{default:F(({control:e})=>[I(a,rn(e,{"aria-label":`Имя провайдера`,value:A.value.name,onInput:n[0]||=e=>H(y)(A.value.id,{name:e.target.value})}),null,16,[`value`])]),_:1}),I(g,{label:`тип`},{default:F(({control:e})=>[I(a,rn({as:`select`},e,{"aria-label":`Тип провайдера`,value:A.value.kind,onChange:n[1]||=e=>ve(e.target.value)}),{default:F(()=>[(V(!0),q(W,null,J(H(W6),e=>(V(),q(`option`,{key:e,value:e},j(H(U6)[e].label),9,$6))),128))]),_:1},16,[`value`])]),_:1})]),_:1}),I(g,{label:`размышление`},{default:F(({control:e})=>[I(a,rn({as:`select`},e,{"aria-label":`Способ включать размышление модели`,value:A.value.thinkingStyle,onChange:n[2]||=e=>H(y)(A.value.id,{thinkingStyle:e.target.value})}),{default:F(()=>[(V(!0),q(W,null,J(H(G6),e=>(V(),q(`option`,{key:e.value,value:e.value},j(e.label),9,e8))),128))]),_:1},16,[`value`])]),_:1}),I(g,{label:`запасная модель`},{default:F(({control:e})=>[I(a,rn({as:`select`},e,{"aria-label":`Запасная модель при сбоях провайдера`,value:A.value.fallbackModel??``,onChange:n[3]||=e=>H(y)(A.value.id,{fallbackModel:e.target.value})}),{default:F(()=>[n[15]||=K(`option`,{value:``},`Нет`,-1),(V(!0),q(W,null,J(A.value.models,e=>(V(),q(`option`,{key:e.id,value:e.alias},j(e.alias),9,t8))),128))]),_:1},16,[`value`])]),_:1}),I(CZ,{layout:`wide-end`},{default:F(()=>[I(g,{label:`url`},{default:F(({control:e})=>[I(a,rn(e,{"aria-label":`URL API`,value:A.value.url,spellcheck:`false`,placeholder:`https://dashscope-intl.aliyuncs.com/compatible-mode/v1`,onInput:n[4]||=e=>H(y)(A.value.id,{url:e.target.value})}),null,16,[`value`])]),_:1}),I(g,{label:`api key`},{default:F(({control:e})=>[I(a,rn(e,{"aria-label":`API key`,value:Ce(),type:`password`,autocomplete:`off`,placeholder:A.value.hasApiKey?`сохранён — введите новый`:se.value.keyPlaceholder,onInput:n[5]||=e=>H(v)(A.value.id,e.target.value)}),null,16,[`value`,`placeholder`])]),_:1})]),_:1}),I(i,null,{default:F(()=>[N(j(se.value.hint),1)]),_:1}),I(ml,{class:`models`,gap:2},{default:F(()=>[I(r,{wrap:``,justify:`between`},{default:F(()=>[K(`span`,n8,[N(` модели · `+j(A.value.models.length)+` `,1),H(re)[A.value.id]?(V(),q(W,{key:0},[N(` из `+j(me.value),1)],64)):B(``,!0)]),I(Q,{appearance:`outline`,tone:`muted`,shape:`chip`,disabled:fe.value||!A.value.url,onClick:n[6]||=e=>H(Se).run(`ide.providers.models.refresh`)},{default:F(()=>[N(j(fe.value?`загрузка…`:`загрузить список`),1)]),_:1},8,[`disabled`])]),_:1}),H(k)[A.value.id]?(V(),Y(t,{key:0,tone:`danger`,size:`xs`,flush:``,role:`alert`},{default:F(()=>[N(j(H(k)[A.value.id]),1)]),_:1})):B(``,!0),pe.value?(V(),Y(t,{key:1,tone:`danger`,size:`xs`,flush:``},{default:F(()=>[...n[16]||=[N(` Имена моделей должны различаться: повторное имя при сохранении отбросится. `,-1)]]),_:1})):B(``,!0),de.value.length>8||ue.value?(V(),Y(a,{key:2,modelValue:ue.value,"onUpdate:modelValue":n[7]||=e=>ue.value=e,"aria-label":`Фильтр моделей`,placeholder:`фильтр`,spellcheck:`false`},null,8,[`modelValue`])):B(``,!0),de.value.length?(V(),Y(Lu,{key:3,class:`list`},{default:F(()=>[(V(!0),q(W,null,J(de.value,e=>(V(),q(`label`,{key:e.id,class:O([`row`,{off:!e.on}])},[I(a,{type:`checkbox`,"aria-label":`Зарегистрировать ${e.id}`,"model-value":e.on,"onUpdate:modelValue":t=>ye(e,!!t)},null,8,[`aria-label`,`model-value`,`onUpdate:modelValue`]),K(`span`,r8,j(e.id),1),e.on?(V(),Y(a,{key:0,class:`alias`,mono:``,"aria-label":`Имя модели ${e.id}`,value:e.alias,placeholder:e.id,spellcheck:`false`,onInput:t=>H(ee)(A.value.id,e.id,t.target.value)},null,8,[`aria-label`,`value`,`placeholder`,`onInput`])):B(``,!0),e.on?(V(),Y(a,{key:1,class:`ctx`,mono:``,type:`number`,min:`1000`,step:`1000`,"aria-label":`Окно контекста ${e.id}, токенов`,value:e.contextTokens,placeholder:`окно, токенов`,onInput:t=>_e(e.id,t.target.value)},null,8,[`aria-label`,`value`,`onInput`])):B(``,!0),e.on?(V(),Y(a,{key:2,class:`think`,type:`checkbox`,title:`Модель умеет размышлять: над строкой ввода агента появится переключатель`,"aria-label":`Размышление ${e.id}`,"model-value":e.thinking!==!1,"onUpdate:modelValue":t=>H(ne)(A.value.id,e.id,!!t)},null,8,[`aria-label`,`model-value`,`onUpdate:modelValue`])):B(``,!0),e.on?(V(),q(`span`,i8,[(V(),q(W,null,J(le,([t,n])=>K(`span`,{key:t,class:`price-field`},[K(`span`,a8,j(n),1),I(a,{mono:``,type:`number`,min:`0`,step:`any`,"aria-label":`Цена ${n} ${e.id}, за 1 млн токенов`,value:e.price?.[t],placeholder:`—`,onInput:n=>ge(e.id,t,n.target.value)},null,8,[`aria-label`,`value`,`onInput`])])),64))])):B(``,!0)],2))),128))]),_:1})):A.value.models.length?B(``,!0):(V(),Y(i,{key:4},{default:F(()=>[...n[17]||=[N(` Моделей нет: загрузите список у провайдера или добавьте id вручную. `,-1)]]),_:1})),I(r,{gap:2},{default:F(()=>[I(a,{modelValue:he.value,"onUpdate:modelValue":n[8]||=e=>he.value=e,grow:``,"aria-label":`Id модели`,placeholder:`добавить id вручную`,spellcheck:`false`,onKeydown:yn(Z(P,[`prevent`]),[`enter`])},null,8,[`modelValue`,`onKeydown`]),I(Q,{disabled:!he.value.trim(),onClick:P},{default:F(()=>[...n[18]||=[N(`+`,-1)]]),_:1},8,[`disabled`])]),_:1}),I(i,null,{default:F(()=>[...n[19]||=[N(` Имя — под которым модель видна агенту и шлюзу; по умолчанию совпадает с id. Окно контекста нужно кольцу заполнения в чате агента; без него берётся 128000. Цена — за 1 млн токенов в валюте тарифа (вход и выход обязательны, «из кэша» по умолчанию равна входу): с ней под ответом агента видна его стоимость и стоимость всего чата. `,-1)]]),_:1})]),_:1}),ce.value?(V(),Y(ml,{key:0,class:`balance`,gap:1},{default:F(()=>[I(r,{wrap:``,justify:`between`},{default:F(()=>[n[21]||=K(`span`,{class:`kicker`},`баланс`,-1),I(Q,{appearance:`outline`,tone:`muted`,shape:`chip`,onClick:n[9]||=e=>H(Se).run(`ide.providers.balance.refresh`)},{default:F(()=>[...n[20]||=[N(` обновить `,-1)]]),_:1})]),_:1}),M.value?.status===`ready`?(V(),q(W,{key:0},[(V(!0),q(W,null,J(M.value.entries,e=>(V(),Y(r,{key:e.currency,wrap:``,gap:3},{default:F(()=>[K(`strong`,null,j(H(X6)(e.currency,e.total)),1),K(`span`,o8,` пополнено `+j(H(X6)(e.currency,e.toppedUp))+` · подарочные `+j(H(X6)(e.currency,e.granted)),1)]),_:2},1024))),128)),M.value.available===!1?(V(),Y(t,{key:0,tone:`danger`,size:`xs`,flush:``},{default:F(()=>[...n[22]||=[N(` Провайдер сообщает, что средств для вызовов недостаточно. `,-1)]]),_:1})):B(``,!0)],64)):(V(),Y(i,{key:1},{default:F(()=>[N(j(M.value?.message??(A.value.hasApiKey?`загрузка…`:`Сохраните ключ, чтобы увидеть баланс.`)),1)]),_:1}))]),_:1})):B(``,!0),I(r,{wrap:``,justify:`between`},{default:F(()=>[I(r,{wrap:``,gap:2},{default:F(()=>[K(`label`,s8,[I(a,{type:`checkbox`,"model-value":A.value.enabled,"onUpdate:modelValue":n[10]||=e=>H(Se).run(`ide.providers.enabled.set`,{enabled:!!e})},null,8,[`model-value`]),n[23]||=N(` включён `,-1)]),I(Q,{appearance:`outline`,tone:`muted`,shape:`chip`,title:`Провайдер по умолчанию: его баланс в статусной строке и модель, если выбранной нет`,disabled:A.value.id===H(l),onClick:n[11]||=e=>H(m)(A.value.id)},{default:F(()=>[...n[24]||=[N(` по умолчанию `,-1)]]),_:1},8,[`disabled`])]),_:1}),I(r,{wrap:``,gap:2},{default:F(()=>[I(Q,{tone:`danger`,onClick:n[12]||=e=>xe(A.value.id)},{default:F(()=>[...n[25]||=[N(`удалить`,-1)]]),_:1}),I(Q,{appearance:`solid`,disabled:H(d),onClick:H(p)},{default:F(()=>[N(j(H(d)?`…`:`сохранить`),1)]),_:1},8,[`disabled`,`onClick`])]),_:1})]),_:1})]),_:1})):(V(),q(W,{key:1},[I(i,null,{default:F(()=>[...n[13]||=[N(` Провайдеры OpenAI-compatible API перечислены слева: у каждого своя страница. Включённых может быть сколько угодно, агент выбирает любую их модель. `,-1)]]),_:1}),I(r,{wrap:``,gap:2},{default:F(()=>[(V(!0),q(W,null,J(H(W6),e=>(V(),Y(Q,{key:e,title:H(U6)[e].label,onClick:t=>H(Se).run(`ide.providers.add`,{kind:e})},{default:F(()=>[N(` + `+j(e===`custom`?`другой`:H(U6)[e].name.split(` `)[0]),1)]),_:2},1032,[`title`,`onClick`]))),128))]),_:1}),H(c).length?(V(),Y(i,{key:0},{default:F(()=>[N(` Включено `+j(ae.value)+` из `+j(H(c).length)+` · моделей `+j(oe.value),1)]),_:1})):(V(),Y(i,{key:1},{default:F(()=>[...n[14]||=[N(`Провайдеров нет: добавьте первого кнопкой выше.`,-1)]]),_:1}))],64))]),_:1}))}}),[[`__scopeId`,`data-v-8f0b9af6`]]),l8=M({__name:`ProviderBalanceIndicator`,setup(e){let{activeProviderId:t,revision:n}=q6(),{usage:r,failed:i,refresh:a}=N6(`/api/providers/balance`,{nextCheckAt:e=>e.checkedAt+6e4});R([t,n],()=>void a());let o=z(()=>r.value&&r.value.status!==`unsupported`),s=z(()=>r.value?.status===`ready`),c=z(()=>r.value&&s.value?Y6(r.value.entries)||`0`:`—`),l=z(()=>r.value?.available===!1?`over`:`normal`),u=z(()=>{let e=r.value;if(!e||!s.value)return e?.message??(i.value?`Баланс провайдера недоступен`:`Баланс провайдера`);let t=e.entries.map(e=>`${e.currency}: ${e.total} (пополнено ${e.toppedUp}, подарочные ${e.granted})`);return e.available===!1&&t.push(`Средств недостаточно для вызовов`),[`Баланс провайдера`,...t].join(`
|
|
170
|
+
`)});j6(z(()=>s.value&&r.value?c.value:null),l);let d=E(`providerBalance:${P()}`,()=>({surface:`statusBar`}));return d.scope.registerCommand({id:`ide.providers.balance.show`,title:`Обновить баланс активного провайдера`,description:`Заново запрашивает баланс активного провайдера для индикатора в статусной строке (сейчас только DeepSeek).`,run:a}),(e,t)=>o.value||H(i)?(V(),Y(O6,{key:0,class:`provider-balance`,title:`Баланс`,tooltip:u.value,remaining:null,"value-text":c.value,tone:l.value,"meter-label":`Баланс активного провайдера`,rows:[],interactive:``,onCycle:t[0]||=e=>H(d).run(`ide.providers.balance.show`)},{icon:F(()=>[I(H(I6))]),_:1},8,[`tooltip`,`value-text`,`tone`])):B(``,!0)}}),u8=M({__name:`AgentUsageIndicators`,props:{enabled:{type:Function}},setup(e){let t=e,n=z(()=>qn().flatMap(e=>e.usage&&(t.enabled?.(e.program)??!0)?[{...e,usage:e.usage}]:[]));return(e,t)=>(V(),q(W,null,[(V(!0),q(W,null,J(n.value,e=>(V(),Y(qe(e.usage),{key:e.backend}))),128)),I(H(l8))],64))}}),d8={key:0,hidden:``},f8=[`aria-pressed`,`aria-label`,`title`,`onClick`],p8=G(M({__name:`NewSessionMenu`,props:{busy:{type:Boolean},agent:{type:Boolean},projectId:{}},emits:[`command`],setup(e,{emit:t}){let n=e,r=t,{modeOf:i,setMode:a,isEnabled:o}=pS(),s=X([]),c=z(()=>s.value.flatMap(e=>{if(e.kind!==`chat`)return[];let t=sr(e.agent);return!t||!o(t.program)?[]:[{role:e,agent:t,title:e.name,caption:`${t.title} · роль`}]}));async function l(){try{s.value=await tm(n.projectId)}catch{s.value=[]}}let u=z(()=>[{program:`shell`,title:`Shell`,caption:`Пустой терминал в папке проекта`,icon:nT},...aS().map(e=>({program:e.program,title:e.title,caption:e.caption,icon:e.icon}))]),d=dte(),f=mu({anchor:`left`,initialFocus:`.row:not(:disabled)`,items:`.row`,closeOnTab:!0}),{open:p,toggle:m,close:h,active:g}=f;R(p,e=>{e&&l()});let _=P(),v=z(()=>u.value.filter(e=>e.program===`shell`||o(e.program)).map(e=>{let t=k6[e.program];return{...e,usage:t?.remaining==null?void 0:t}})),y=pu(),b=e=>n.agent&&sS(e),x=e=>a(e,i(e)===`gui`?`tui`:`gui`);function S(){h(),r(`command`,`ide.workbench.agent.open`)}function C(e){n.busy||(h(),r(`command`,`ide.agent.role.open`,{role:e}))}function w(e){n.busy||(h(),b(e)&&i(e)===`gui`?r(`command`,oS(e)):r(`command`,`ide.workbench.terminal.new`,{program:e}))}function T(e){return e===`spare`?`info`:e===`hot`?`warning`:e===`over`?`danger`:`neutral`}return(t,n)=>(V(),q(W,null,[H(y)&&H(p)?(V(),q(`span`,d8,[I(H(u8),{enabled:H(o)},null,8,[`enabled`])])):B(``,!0),K(`span`,{ref:H(f).trigger,class:`new-session`},[I(Q,{shape:`icon`,size:`sm`,title:`Новая сессия`,"aria-label":`Новая сессия`,"aria-haspopup":`dialog`,"aria-expanded":H(p),"aria-controls":H(p)?H(f).id:void 0,onClick:n[0]||=e=>H(m)()},{default:F(()=>[I(H(Sg),{"aria-hidden":`true`})]),_:1},8,[`aria-expanded`,`aria-controls`])],512),I(kl,{menu:H(f),label:`Новая сессия`},{default:F(()=>[I(pl,{anchor:`start`,class:`island-head`,"aria-label":`Закрыть`,onClick:n[1]||=e=>H(m)(!1)},{default:F(()=>[I(H(Sg),{"aria-hidden":`true`}),n[3]||=K(`span`,null,`Новая сессия`,-1)]),_:1}),c.value.length?(V(),q(W,{key:0},[I(Gd,{divided:``},{default:F(()=>[...n[4]||=[N(`Роли`,-1)]]),_:1}),I(ml,{flow:`flex`,gap:`none`,class:`list`,role:`menu`,"aria-label":`Роли агентов`},{default:F(()=>[(V(!0),q(W,null,J(c.value,(t,n)=>(V(),q(`div`,{key:t.role.id,class:`entry`},[I(ts,{class:`row`,role:`menuitem`,disabled:e.busy,tabindex:n===H(g)?0:-1,"data-command":`ide.agent.role.open`,onMousemove:e=>g.value=n,onClick:e=>C(t.role.id)},{default:F(()=>[(V(),Y(qe(t.agent.icon),{class:`row-icon`,"aria-hidden":`true`})),I(gl,{title:t.title,description:t.caption},null,8,[`title`,`description`])]),_:2},1032,[`disabled`,`tabindex`,`onMousemove`,`onClick`])]))),128))]),_:1}),I(Gd,null,{default:F(()=>[...n[5]||=[N(`Агенты`,-1)]]),_:1})],64)):B(``,!0),I(ml,{flow:`flex`,gap:`none`,id:H(_),class:`list`,role:`menu`},{default:F(()=>[(V(!0),q(W,null,J(v.value,(t,n)=>(V(),q(`div`,{key:t.program,class:`entry`},[I(ts,{class:`row`,role:`menuitem`,disabled:e.busy,tabindex:c.value.length+n===H(g)?0:-1,"data-command":b(t.program)&&H(i)(t.program)===`gui`?H(oS)(t.program):`ide.workbench.terminal.new`,onMousemove:e=>g.value=c.value.length+n,onClick:e=>w(t.program)},{default:F(()=>[(V(),Y(qe(t.icon),{class:`row-icon`,"aria-hidden":`true`})),I(gl,{title:t.title,description:b(t.program)&&H(i)(t.program)===`gui`?`Графический чат вместо терминала`:t.caption},null,8,[`title`,`description`]),t.usage?(V(),Y(hl,{key:0,class:`hint`,mono:``,tone:T(t.usage.tone)},{default:F(()=>[N(j(t.usage.remaining)+`%`,1)]),_:2},1032,[`tone`])):B(``,!0)]),_:2},1032,[`disabled`,`tabindex`,`data-command`,`onMousemove`,`onClick`]),b(t.program)?(V(),q(`button`,{key:0,type:`button`,class:`mode`,"aria-pressed":H(i)(t.program)===`gui`,"aria-label":`${t.title}: ${H(i)(t.program)===`gui`?`графический чат`:`терминал`}. Переключить режим`,title:H(i)(t.program)===`gui`?`Графический чат — нажмите, чтобы вернуть терминал`:`Терминал — нажмите, чтобы открывать графический чат`,onClick:e=>x(t.program)},[H(i)(t.program)===`gui`?(V(),Y(H(XJ),{key:0,"aria-hidden":`true`})):(V(),Y(H(nT),{key:1,"aria-hidden":`true`}))],8,f8)):B(``,!0)]))),128))]),_:1},8,[`id`]),e.agent&&H(d)?(V(),q(W,{key:1},[I(Gd,{divided:``},{default:F(()=>[N(j(H(d).title),1)]),_:1}),I(ts,{class:`row`,role:`menuitem`,"data-command":`ide.workbench.agent.open`,tabindex:H(g)===c.value.length+v.value.length?0:-1,onMousemove:n[2]||=e=>g.value=c.value.length+v.value.length,onClick:S},{default:F(()=>[(V(),Y(qe(H(d).icon),{class:`row-icon`,"aria-hidden":`true`})),I(gl,{title:H(d).title,description:H(d).caption},null,8,[`title`,`description`]),H(A6).text?(V(),Y(hl,{key:0,class:`hint`,mono:``,tone:T(H(A6).tone)},{default:F(()=>[N(j(H(A6).text),1)]),_:1},8,[`tone`])):B(``,!0)]),_:1},8,[`tabindex`])],64)):B(``,!0),I(Kd,{"hide-on-compact":``},{default:F(()=>[...n[6]||=[N(`↑↓ выбрать · Enter запустить сессию в папке проекта`,-1)]]),_:1})]),_:1},8,[`menu`])],64))}}),[[`__scopeId`,`data-v-c5c478b0`]]),m8=M({__name:`PanelHost`,props:{id:{},registry:{}},setup(e){let t=e,n=X(),r=z(()=>n.value?.element);return Lt(()=>t.registry.register(t.id,r.value)),lt(()=>t.registry.unregister(t.id,r.value)),(e,t)=>(V(),Y(Wr,{as:`div`,sizing:`flex`,ref_key:`panel`,ref:n,class:`panel-host`},null,512))}}),h8={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function g8(e,t){return V(),q(`svg`,h8,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`12`,cy:`12`,r:`10`}),K(`path`,{d:`m9 15l6-6`})],-1)]])}var _8=U({name:`lucide-circle-slash`,render:g8}),v8={class:`keep-alive`,hidden:``},y8=G(M({__name:`WorkbenchDock`,props:{projectId:{},mobile:{type:Boolean},mobileSurface:{},workbench:{},files:{},tabActions:{type:Function},panelHosts:{},gutterRevision:{},tabs:{},terminalsBusy:{type:Boolean},agent:{type:Boolean}},emits:[`command`],setup(e,{emit:t}){let n=e,r=t,{fileOf:i,terminals:a,terminalPanels:o}=n.workbench,s=o6(),c=l6(),l=e=>e.virtual?s.views[e.virtual]:void 0,u=z(()=>n.tabs.filter(e=>l(e)?.keepAlive)),d=e=>u.value.some(t=>t.key===e),f=e=>n.panelHosts.hosts[e]??null;return(t,n)=>(V(),q(W,null,[I(H(QI),{layout:e.workbench.layout.value,"onUpdate:layout":n[2]||=t=>e.workbench.layout.value=t,mobile:e.mobile,"mobile-surface":e.mobileSurface,"terminal-panel":e=>H(o).has(e)||e.startsWith(`terminal:`),describe:e.workbench.describePanel,"project-id":e.projectId,"command-namespace":`ide.workbench.tabs`,"tab-actions":e.tabActions,"accepts-drop":e.files.acceptsFileDrop,onSelect:e.workbench.selectPanel,onClose:e.workbench.closePanel,onCloseMany:e.workbench.closeManyPanels,onRename:e.workbench.renamePanel,onPin:e.files.pinPreview,onDrop:e.files.dropFiles},{panel:F(({id:t,focused:s})=>[d(t)?(V(),Y(m8,{key:0,id:t,registry:e.panelHosts},null,8,[`id`,`registry`])):H(i)(t)?(V(),Y(y6,{key:1,file:H(i)(t),"project-id":e.projectId,revision:e.gutterRevision,onChange:e=>H(i)(t).draft=e,onSave:n=>e.files.saveFile(H(i)(t)),onMode:e=>H(i)(t).markdownMode=e,onOpen:n=>e.files.openFile(n,void 0,void 0,void 0,{scope:H(i)(t)?.scope}),onReload:n=>e.files.reloadFromDisk(H(i)(t)),onKeep:n=>e.files.keepMine(H(i)(t))},null,8,[`file`,`project-id`,`revision`,`onChange`,`onSave`,`onMode`,`onOpen`,`onReload`,`onKeep`])):H(o).get(t)?(V(),Y(H(DL),{key:2,"project-id":e.projectId,session:H(o).get(t),focused:s,onOpen:n[0]||=(t,n,r,i)=>e.files.openFile(t,n,r,void 0,{external:i}),onStatus:H(a).update,onSessions:H(a).replace,onEnded:H(a).refresh,onCommand:(e,t)=>r(`command`,e,t)},null,8,[`project-id`,`session`,`focused`,`onStatus`,`onSessions`,`onEnded`,`onCommand`])):B(``,!0)]),leading:F(({group:t})=>[t.role===`terminal`?(V(),Y(p8,{key:0,busy:e.terminalsBusy,agent:e.agent,"project-id":e.projectId,onCommand:n[1]||=(e,t)=>r(`command`,e,t)},null,8,[`busy`,`agent`,`project-id`])):B(``,!0)]),icon:F(({tab:e})=>[H(i)(e.id)?.original!==void 0&&H(i)(e.id)?(V(),Y(H(PT),{key:0,class:`diff-tab-icon`,"aria-label":`Изменения`})):H(o).get(e.id)?(V(),q(W,{key:1},[H(a).failed(H(o).get(e.id))?(V(),Y(H(_8),{key:0,class:`session-state failed`,"aria-hidden":`true`})):H(o).get(e.id).status===`exited`?(V(),Y(Q1,{key:1,class:`session-state`,"aria-hidden":`true`})):B(``,!0)],64)):B(``,!0)]),actions:F(({activeId:e})=>[H(o).get(e)?(V(),q(W,{key:0},[H(o).get(e).status===`running`?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,disabled:H(a).busy.value||H(o).get(e).stopRequested,title:`Завершить сессию`,"aria-label":`Завершить сессию`,onClick:t=>H(a).stop(H(o).get(e).id)},{default:F(()=>[I(Q1,{"aria-hidden":`true`})]),_:1},8,[`disabled`,`onClick`])):!H(o).get(e).docker||H(o).get(e).docker?.kind===`environment`?(V(),Y(Q,{key:1,shape:`icon`,size:`sm`,disabled:H(a).busy.value,title:`Перезапустить сессию`,"aria-label":`Перезапустить сессию`,onClick:t=>H(a).restart(H(o).get(e).id)},{default:F(()=>[I(H(fd),{"aria-hidden":`true`})]),_:1},8,[`disabled`,`onClick`])):B(``,!0)],64)):B(``,!0)]),trailing:F(()=>[I(H(pw),{"scope-id":`activity:mobile`})]),empty:F(({group:e})=>[e.role===`editor`?(V(),Y(nd,{key:0},{default:F(()=>[...n[3]||=[N(` Откройте файл из дерева или перетащите его сюда `,-1)]]),_:1})):e.role===`terminal`&&!H(a).loaded.value?(V(),Y(nd,{key:1},{default:F(()=>[I(An),n[4]||=N(` Загружаю сессии… `,-1)]),_:1})):e.role===`terminal`?(V(),Y(nd,{key:2},{default:F(()=>[...n[5]||=[N(` Нет терминалов. Создайте сессию кнопками на панели выше `,-1)]]),_:1})):(V(),Y(nd,{key:3},{default:F(()=>[...n[6]||=[N(`Перетащите сюда вкладку`,-1)]]),_:1}))]),_:1},8,[`layout`,`mobile`,`mobile-surface`,`terminal-panel`,`describe`,`project-id`,`tab-actions`,`accepts-drop`,`onSelect`,`onClose`,`onCloseMany`,`onRename`,`onPin`,`onDrop`]),K(`div`,v8,[(V(!0),q(W,null,J(u.value,e=>(V(),Y(ht,{key:e.key,to:f(e.key),disabled:!f(e.key)},[(V(),Y(qe(l(e)?.scroll?`div`:Wr),rn({ref_for:!0},l(e)?.scroll?{}:{as:`div`,sizing:`flex`},{class:l(e)?.scroll?`kept-scroll`:`kept-panel`,"data-own-keys":l(e)?.ownKeys||void 0}),{default:F(()=>[I(u6,{"tab-key":e.key},{default:F(()=>[(V(),Y(qe(l(e).component),rn({ref_for:!0},l(e).props?.(e,H(c))),null,16))]),_:2},1032,[`tab-key`])]),_:2},1040,[`class`,`data-own-keys`]))],8,[`to`,`disabled`]))),128))])],64))}}),[[`__scopeId`,`data-v-2bd0bc54`]]),b8={class:`status-bar`},x8=G(M({__name:`StatusBar`,setup(e){let{isEnabled:t}=pS();return(e,n)=>(V(),q(`footer`,b8,[n[0]||=K(`span`,{class:`status-spacer`},null,-1),I(H(u8),{enabled:H(t)},null,8,[`enabled`])]))}}),[[`__scopeId`,`data-v-c4fbfa76`]]);function S8(){let e=ut({});return{hosts:e,register(t,n){e[t]=n},unregister(t,n){e[t]===n&&delete e[t]}}}function C8(e){R(f$,()=>{e.revision.value++});let{tabs:t,files:n}=e,{openFile:r,openBrowserFile:i,closeTab:a,selectTab:o}=n;async function s(){if(await zr(e.projectId()),e.revision.value++,await e.loadGit(),e.section.value===`search`&&await e.searchPanel()?.search(),!e.capabilities.write){let n=e.activeKey();for(let e of[...t.value])!e.virtual&&!e.commit&&s1(e)&&!e.localFile&&await r(e.path,e.line,e.column,void 0,{reload:!0,preview:!!e.preview});n&&t.value.some(e=>e.key===n)&&o(n);return}let n=e.active();n&&!n.virtual&&!n.commit&&s1(n)&&(n.localFile?i(n.localFile,!0):r(n.path,n.line,n.column,n.staged,{reload:!0,external:!!n.external}))}function c(r,i){n.invalidate();for(let n of[...t.value]){if(n.virtual||n.commit||!s1(n))continue;let t=Ts(n.path,r,i);if(t===n.path)continue;if(n.staged!==void 0){a(n.key);continue}let o=`${t}:file`;e.layout.value=cI(e.layout.value,n.key,o),n.path=t,n.key=o}e.revision.value++,e.loadGit(),e.searchPanel()?.refreshSearch()}return{refresh:s,entryMoved:c}}function w8(e){let t=pu(),n=X(`editor`),r=z({get:()=>n.value===`files`,set:e=>{n.value=e?`files`:`editor`}}),i=z(()=>t.value?!r.value:e.value);function a(){t.value?r.value=!0:e.value=!1}return{mobile:t,mobileSurface:n,mobileSidebarOpen:r,sidebarInvisible:i,showSidebar:a}}function T8(e){let{editorCommands:t,capabilities:n,surface:r,mobile:i}=e;t.scope.registerCommand({id:`ide.workbench.mobile.surface.show`,title:`Открыть мобильную поверхность`,description:`Переключает мобильный интерфейс между редактором, файлами слева и терминалами справа, сохраняя сессии.`,arguments:{surface:`editor, files или terminal`},enabled:()=>i.value,run:e=>{let{surface:t}=b(e);if(t===`terminal`&&!n.terminals||t!==`editor`&&t!==`files`&&t!==`terminal`)throw Error(`surface: editor, files или terminal`);r.value=t}}),t.scope.registerCommand({id:`ide.workbench.fullscreen.toggle`,title:`Полноэкранный режим`,description:`Скрывает интерфейс браузера и освобождает весь экран под рабочую область; на телефоне это заменяет установленное приложение. Выход — повторный вызов или Esc.`,enabled:()=>Au(),run:()=>ju()}),R(e.activeKey,e=>{e&&(r.value=`editor`)}),R(e.focusedPanel,t=>{i.value&&!e.restoringSession.value&&t?.startsWith(`terminal:`)&&(r.value=`terminal`)}),R(i,()=>{r.value=`editor`})}var E8=`cubic-bezier(.2, .8, .2, 1)`;function D8(e){let t,n,r,i=()=>[`files`,`editor`,...e.terminals()?[`terminal`]:[]],a=t=>{let n=i();return n[n.indexOf(e.surface.value)+t]},o=()=>{let t=e.workspace.value;if(t)return(e.surface.value===`files`?t.querySelector(`.sidebar`):t.querySelector(`.dock-pane`))??void 0},s=()=>Math.min(112,Math.max(48,(e.workspace.value?.clientWidth??360)*.2)),c=e=>{r?.cancel(),r=void 0,e.style.transform=``,e.style.transition=``,e.style.willChange=``},l=(e,t)=>{if(e){if(!t||vl()||typeof e.animate!=`function`)return c(e);r?.cancel(),r=e.animate([{transform:t},{transform:`translate3d(0, 0, 0)`}],{duration:180,easing:E8}),r.onfinish=()=>{r=void 0,c(e)}}},u=()=>{r?.cancel(),r=void 0,n=o(),n&&(n.style.transform=``,n.style.transition=`none`,n.style.willChange=`transform`)},d=t=>{if(!n)return;let r=a(t.delta<0?1:-1)?.58:.16,i=e.workspace.value?.clientWidth??360,o=Math.min(120,Math.max(48,i*.3)),s=Math.max(-o,Math.min(o,t.delta*r));n.style.transform=`translate3d(${s}px, 0, 0)`},f=t=>{let r=n;if(n=void 0,!r)return;let i=t.delta<0?1:-1,o=a(i);xl(t.delta,t.velocity,s())&&o?(c(r),e.show(o)):l(r,r.style.transform)},p=()=>{let e=n;n=void 0,e&&l(e,e.style.transform)};R(e.workspace,()=>{t?.(),t=void 0,n=void 0;let r=e.workspace.value;r&&(t=Tl(r,{axis:`x`,enabled:()=>e.mobile.value,canStart:(e,t)=>!!o()&&!wl(e.target,`x`,Math.sign(t.delta),r),onStart:u,onMove:d,onEnd:f,onCancel:p}))},{immediate:!0,flush:`post`}),R(e.mobile,e=>{e||(r?.cancel(),r=void 0,n&&c(n),n=void 0)});let m=()=>{t?.(),t=void 0,r?.cancel(),r=void 0,n&&c(n),n=void 0};return zt(m),m}var O8=[`data-surface`],k8={class:`toolbar-host`},A8=[`inert`],j8={key:0,class:`loading`,role:`status`},M8=G(M({__name:`ProjectWorkspace`,props:{projectId:{},projectSettingsDirty:{type:Boolean},beforeCloseProjectSettings:{type:Function},saveProjectSettings:{type:Function},tabViews:{}},setup(e,{expose:t}){let n=e,r=wr(n.projectId),i=Fr(r),a=a6(r,n.tabViews,{project:{dirty:()=>!!n.projectSettingsDirty,beforeClose:()=>n.beforeCloseProjectSettings?.(),save:()=>n.saveProjectSettings?.()}}),o=X(),s=X(!1),{mobile:c,mobileSurface:l,mobileSidebarOpen:u,sidebarInvisible:d,showSidebar:f}=w8(s),{treeWidth:p,sizes:m,resizeTree:h,resizeTreeKey:g}=_1(o),_=X(),v=E(`editor:${n.projectId}`,()=>({surface:`editor`,projectId:n.projectId}));D8({workspace:o,mobile:c,surface:l,terminals:()=>i.terminals,show:e=>v.run(`ide.workbench.mobile.surface.show`,{surface:e})});let y=(e,t,n,r,a,o)=>v.scope.registerCommand({id:e,title:t,...o,run:n,enabled:e=>(!a||i[a])&&r(e)});DP(y,n.projectId);function x(){M.value++,te()}function S(e){P.invalidate(),le.value=le.value.filter(t=>t.virtual||t.commit||t.scope&&!pr(t.scope)||t.path!==e&&!t.path.startsWith(e+`/`)),M.value++,te(),_.value?.refreshSearch()}let C=HJ(()=>n.projectId),w=GJ(()=>n.projectId),T=qJ(()=>n.projectId),{gutterRevision:ee}=C,te=()=>i.git?C.load():Promise.resolve(),D=X(`files`),ne=X([]),re=z(()=>Is(F$(r,i),()=>ne.value));function ie(e){if(!i.snapshots)throw Error(`Источник не умеет показывать файлы снимка`);let t=`tree:${Lr(e)}`;ne.value.some(e=>e.id===t)||ne.value.push({id:t,title:Sr(e),source:Or(e),group:i.git?`git`:void 0,kind:e.kind===`compare`?`changes`:`tree`,params:{scope:e},closable:!0}),D.value=t,f()}function A(e){ie({kind:`commit`,rev:e})}function ae(e){if(e.kind!==`commit`)throw Error(`Поиск доступен только для коммита`);if(!i.search)throw Error(`Источник не умеет искать по снимку`);let t=`search:${Lr(e)}`;ne.value.some(e=>e.id===t)||ne.value.push({id:t,title:`Поиск по снимку`,source:Or(e),group:i.git?`git`:void 0,kind:`search-scope`,params:{scope:e},closable:!0}),D.value=t,f()}function j(e){ne.value=e.flatMap(e=>{let t=e.params?.scope;if(!t||typeof t!=`object`)return[];let n=t,r=n.kind===`commit`&&typeof n.rev==`string`?{kind:`commit`,rev:n.rev}:n.kind===`compare`&&typeof n.from==`string`&&typeof n.to==`string`?{kind:`compare`,from:n.from,to:n.to}:void 0;if(!r||(r.kind===`compare`?!i.compare:!i.snapshots))return[];let a=e.kind===`search-scope`;return a&&(r.kind!==`commit`||!i.search)?[]:[{id:a?`search:${Lr(r)}`:`tree:${Lr(r)}`,title:a?`Поиск по снимку`:Sr(r),source:Or(r),group:i.git?`git`:void 0,kind:a?`search-scope`:r.kind===`compare`?`changes`:`tree`,params:{scope:r},closable:!0}]})}function oe(e){let t=ne.value.findIndex(t=>t.id===e);if(t<0)return;let[n]=ne.value.splice(t,1);D.value===e&&(D.value=n?.group&&re.value.has(n.group)?n.group:i.git?`git`:`files`)}function se(e){let t=ne.value.findIndex(t=>t.id===e.id);t>=0?ne.value.splice(t,1,e):ne.value.push(e),D.value=e.id,f()}let M=X(0),ce=e=>e.virtual?!!a.behaviorOf(e.virtual)?.dirty?.():e.draft!==void 0&&e.draft!==e.content,le=X([]),ue={},de=IL({projectId:()=>n.projectId,capabilities:i,layout:r.layout,tabs:le,pending:ue,isDirty:ce,tabTypes:a,selectTab:e=>P.selectTab(e),closeTab:e=>P.closeTab(e),closeManyTabs:e=>P.closeManyTabs(e),showSidebar:f,register:y}),{layout:fe,restoringSession:pe,terminals:N,fileOf:me,activeKey:he,revealPanel:ge,layoutGroups:_e,currentPreset:ve,presetsAvailable:ye}=de,P=A1({projectId:()=>n.projectId,tabs:le,active:()=>Ae.value,activeKey:()=>he.value,reveal:e=>ge(e),isDirty:ce,saved:()=>void te(),pending:ue,tabTypes:a}),{loading:be,openFile:xe,openTab:Se,saveFile:Ce,toggleMarkdownSource:we}=P;c6({projectId:n.projectId,openFile:e=>void xe(e),openTab:Se,openCommitDiff:(e,t)=>void P.openCommitFile(e,t),openCommitTree:A,openCompareTree:(e,t)=>ie({kind:`compare`,from:e,to:t}),openPullFile:(e,t,n,r)=>{let i=le.value.find(t=>t.virtual===`pull`&&Number(t.params?.number)===e);i&&(i.preview=!1),P.openPullFile(e,t,n,!r)},openSection:se,run:(e,t)=>v.run(e,t)});let{tabActions:Te,editorKeydown:Ee,editorFocus:De}=W1({projectId:n.projectId,editorCommands:v,register:y,tabs:le,active:()=>Ae.value,activeKey:()=>he.value,fileOf:me,saveFile:Ce,reloadFromDisk:P.reloadFromDisk,keepMine:P.keepMine,openFile:xe,openFileAt:(e,t,n,r,i)=>xe(e,t,r,void 0,{endLine:n,...i}),openTab:Se,selectTab:e=>ge(e),onOpenTab:()=>u.value=!1,toggleMarkdownSource:we,revealInTree:(e,t)=>{if(t&&!pr(t)){let n=`tree:${Lr(t)}`;re.value.has(n)&&(D.value=n,f(),_.value?.reveal(e,n))}else D.value=`files`,f(),_.value?.reveal(e)},tabTypes:a}),Oe=hZ(n.projectId,{enabled:i.docker,sidebar:()=>{D.value=`docker`,f()},open:()=>Se(`docker`),terminal:async e=>{await N.refresh(),ge(`terminal:${e.id}`)}}),ke=S8();y(`ide.workbench.sidebar.refresh`,`Обновить раздел боковой панели`,()=>_.value?.refreshSection(),()=>!0),y(`ide.workbench.section.show`,`Открыть раздел боковой панели`,e=>{let t=b(e).section;if(typeof t!=`string`||!re.value.has(t))throw Error(`section: ${re.value.list().map(e=>e.id).join(`, `)}`);D.value=t,f()},()=>!0,void 0,{description:`Переключает боковую панель на раздел проекта (файлы, поиск, Git и другие, если они есть у проекта) и показывает её.`,arguments:{section:`Идентификатор раздела: files, search, git, docker, issues и т. д.`}}),y(`ide.workbench.tree.search`,`Искать в снимке`,async e=>{let t=b(e);if(typeof t.rev!=`string`||!t.rev)throw Error(`Укажите rev`);if(typeof t.q!=`string`||!t.q.trim())throw Error(`Укажите q`);for(let e of[`case`,`word`,`regex`])if(t[e]!==void 0&&typeof t[e]!=`boolean`)throw Error(`${e} должен быть boolean`);return ar(n.projectId,t.q,{caseSensitive:t.case===!0,wholeWord:t.word===!0,regex:t.regex===!0},void 0,{kind:`commit`,rev:t.rev})},()=>i.search&&i.snapshots,void 0,{description:`Ищет текст в файлах коммита и возвращает совпадения с путями и позициями. Локальный снимок читается через git grep, GitLab — через поиск по blobs с ref; GitHub не поддерживает поиск по произвольному коммиту. Найденные файлы открываются в том же коммите.`,arguments:{rev:`Хеш коммита`,q:`Строка поиска`,case:`true — учитывать регистр`,word:`true — искать целое слово`,regex:`true — регулярное выражение`}}),y(`ide.workbench.tree.open`,`Открыть дерево файлов снимка`,e=>{let t=b(e),n=e=>{let n=t[e];if(n!==void 0&&typeof n!=`string`)throw Error(`${e} должен быть строкой`);return n},r=n(`rev`),i=n(`from`),a=n(`to`);if(r)ie({kind:`commit`,rev:r});else if(i&&a)ie({kind:`compare`,from:i,to:a});else throw Error(`Укажите rev или пару from/to`)},()=>i.snapshots||i.compare,void 0,{description:`Открывает в боковой панели read-only дерево файлов коммита или список изменений двух коммитов. Для коммита передайте rev; для сравнения — from и to. Хеши должны быть полными или однозначно разрешаться Git провайдера.`,arguments:{rev:`Хеш коммита для дерева файлов`,from:`Начальный хеш сравнения`,to:`Конечный хеш сравнения`}}),y(`ide.workbench.section.close`,`Закрыть временный раздел боковой панели`,e=>{let t=b(e).section;if(typeof t!=`string`||!t)throw Error(`Укажите section`);oe(t)},e=>{let t=b(e).section;return typeof t==`string`&&ne.value.some(e=>e.id===t)},void 0,{description:`Закрывает временный раздел боковой панели, например файлы коммита.`,arguments:{section:`Идентификатор временного раздела`}}),y(`ide.workbench.sidebar.toggle`,`Показать или скрыть боковую панель`,()=>{c.value?u.value=!u.value:s.value=!s.value},()=>!0),J1({persist:i.persist,initialLayout:de.initialLayout,projectId:()=>n.projectId,tabs:le,layout:fe,restoringSession:pe,activeKey:he,section:D,sections:re.value,sectionExists:e=>re.value.has(e),extraSections:ne,restoreSections:j,treeWidth:p,sidebarHidden:s,mobile:c,mobileSurface:l,terminals:i.terminals,ensureTab:(e,t)=>C1(le,a,e,t),openFile:xe,fileGeneration:P.generation,resetFiles:P.reset,openCommitFile:P.openCommitFile,openPullFile:P.openPullFile,resetGit:()=>{C.reset(),w.reset(),T.reset()},reloadGit:()=>void te()}),T8({editorCommands:v,capabilities:i,surface:l,mobile:c,activeKey:he,focusedPanel:()=>de.focusedGroup.value?.active,restoringSession:pe});let Ae=z(()=>le.value.find(e=>e.key===he.value)),je=f1({projectId:()=>n.projectId,tabs:le,active:()=>Ae.value,files:P,bumpRevision:()=>M.value++,refreshSearch:()=>_.value?.refreshSearch()}),{refresh:Me,entryMoved:Ne}=C8({projectId:()=>n.projectId,capabilities:i,tabs:le,layout:fe,files:P,active:()=>Ae.value,activeKey:()=>he.value,revision:M,section:D,searchPanel:()=>_.value,loadGit:te});return t({openFile:xe,refresh:Me,openTab:Se,openSection:se}),lt(()=>C.cancel()),(t,n)=>(V(),q(`div`,{ref_key:`workspaceElement`,ref:o,class:O([`workspace`,{"sidebar-hidden":H(d)}]),"data-surface":H(c)?H(l):void 0,style:k(H(m))},[K(`div`,k8,[(V(),Y(ht,{to:`#header-tools`,defer:``},[I($L,{capabilities:H(i),mobile:H(c),"sidebar-hidden":H(d),"terminals-busy":H(N).busy.value,"terminals-error":H(N).error.value,"layout-groups":H(_e),preset:H(ve),"presets-available":H(ye),onCommand:n[0]||=(e,t)=>H(v).run(e,t)},{"terminal-actions":F(()=>[L(t.$slots,`terminal-actions`,{},void 0,!0)]),"terminal-status":F(()=>[L(t.$slots,`terminal-status`,{},void 0,!0)]),_:3},8,[`capabilities`,`mobile`,`sidebar-hidden`,`terminals-busy`,`terminals-error`,`layout-groups`,`preset`,`presets-available`])]))]),I(Nn,{name:`mobile-left`},{default:F(()=>[I(o1,{ref_key:`sidebar`,ref:_,section:D.value,"onUpdate:section":n[1]||=e=>D.value=e,"project-id":e.projectId,capabilities:H(i),sections:re.value,hidden:H(d),rail:!H(c),active:Ae.value,revision:M.value,overview:H(C),history:H(w),branches:H(T),files:H(P),"git-sync":H(je),onCommand:n[2]||=(e,t)=>(e.startsWith(`ide.docker.`)?H(Oe).commands:H(v)).run(e,t),onNavigate:n[3]||=e=>u.value=!1,onOpenCommitTree:A,onOpenSearch:ae,onRefresh:H(Me),onChanged:x,onDeleted:S,onMoved:H(Ne)},null,8,[`section`,`project-id`,`capabilities`,`sections`,`hidden`,`rail`,`active`,`revision`,`overview`,`history`,`branches`,`files`,`git-sync`,`onRefresh`,`onMoved`])]),_:1}),et(I(PF,{appearance:`gap`,orientation:`vertical`,class:`resize-handle tree-resize`,"aria-label":`Ширина дерева файлов`,tabindex:`0`,onPointerdown:H(h),onKeydown:H(g)},null,8,[`onPointerdown`,`onKeydown`]),[[Ln,!H(d)]]),H(c)&&H(u)?(V(),q(`button`,{key:0,class:`sidebar-backdrop`,"aria-label":`Закрыть боковую панель`,"data-command":`ide.workbench.sidebar.toggle`,onClick:n[4]||=e=>H(v).run(`ide.workbench.sidebar.toggle`)})):B(``,!0),K(`section`,{class:`dock-pane`,inert:H(c)&&H(u),"aria-label":`Блоки редактора и терминалов`,onFocusin:n[6]||=(...e)=>H(De)&&H(De)(...e),onKeydownCapture:n[7]||=(...e)=>H(Ee)&&H(Ee)(...e)},[H(be)?(V(),q(`p`,j8,`читаю файл…`)):B(``,!0),I(y8,{"project-id":e.projectId,workbench:H(de),mobile:H(c),"mobile-surface":H(l),files:H(P),"tab-actions":H(Te),"panel-hosts":H(ke),"gutter-revision":H(ee),tabs:le.value,"terminals-busy":H(N).busy.value,agent:H(i).agent,onCommand:n[5]||=(e,t)=>H(v).run(e,t)},null,8,[`project-id`,`workbench`,`mobile`,`mobile-surface`,`files`,`tab-actions`,`panel-hosts`,`gutter-revision`,`tabs`,`terminals-busy`,`agent`])],40,A8),H(c)?(V(),Y(pR,{key:1,terminals:H(i).terminals,surface:H(l),onCommand:n[8]||=(e,t)=>H(v).run(e,t)},null,8,[`terminals`,`surface`])):B(``,!0),I(H(tL),{session:H(N).pendingClose.value,busy:H(N).busy.value,onCancel:H(N).cancelClose,onConfirm:H(N).confirmClose},null,8,[`session`,`busy`,`onCancel`,`onConfirm`]),H(c)?B(``,!0):(V(),Y(x8,{key:2,class:`workspace-status`}))],14,O8))}}),[[`__scopeId`,`data-v-00da75e8`]]);async function N8(e,t,n){let r=e.trim();if(!r)throw Error(`Укажите токен GitHub`);if(t){let e=await MP(`/github`,`PUT`,{...t,enabled:!0});n?.(e)}else{let e=(await NP()).integrations.find(e=>e.id===`github`);e?.enabled||await MP(`/github`,`PUT`,{...e?.settings,enabled:!0})}return MP(`/github/auth`,`POST`,{token:r})}var P8={class:`integrations`},F8={key:0,class:`plugin`},I8={class:`status`},L8={class:`storage`},R8={class:`muted`},z8={key:2,class:`muted`,role:`status`},B8=G(M({__name:`GithubSettings`,setup(e){let n=X(null),i=X(``),o=X({backend:`file`,reason:`unavailable`}),s=X(!1),c=X(``),l=X(``),u=X(``),{error:d,message:f,busy:p,action:m}=CF(),h=X(null);function v(e){n.value=e,e.connected||h.value?.hide(),s.value=e.enabled,c.value=e.settings.clientId,l.value=e.settings.directory}Lt(()=>m(async()=>{let e=await NP();i.value=e.file,o.value=e.secretStorage;let t=e.integrations.find(e=>e.id===`github`);t&&v(t)}).catch(()=>{}));let{device:y,start:b,cancel:x}=tF({endpoint:`/github/device`,pollEndpoint:`/github/device/poll`,connectedMessage:`GitHub подключён`,save:()=>S(),apply:v,error:d,message:f,action:m});async function S(e=s.value){x(),v(await MP(`/github`,`PUT`,{enabled:e,clientId:c.value,directory:l.value}))}function C(){if(!p.value&&u.value.trim())return m(async()=>{x(),v(await N8(u.value,{clientId:c.value,directory:l.value},v)),u.value=``,f.value=`GitHub подключён`})}function w(){return m(async()=>{x(),v(await MP(`/github/auth`,`DELETE`)),u.value=``,f.value=`GitHub отключён`})}let T=E(`github-settings`,()=>({surface:`settings`,integration:`github`}));return T.scope.registerCommand({id:`ide.github.integration.save`,title:`Сохранить настройки GitHub`,description:`Сохраняет Client ID, папку импорта и состояние интеграции GitHub.`,enabled:()=>!p.value&&!!n.value,run:()=>m(async()=>{await S(),f.value=`Настройки сохранены`})}),T.scope.registerCommand({id:`ide.github.integration.connect`,title:`Подключить GitHub`,description:`Включает интеграцию и подключает GitHub с токеном, введённым в форме.`,enabled:()=>!p.value&&!!u.value.trim()&&!!n.value,run:C}),T.scope.registerCommand({id:`ide.github.integration.disconnect`,title:`Отключить GitHub`,description:`Удаляет сохранённый токен GitHub из Projector.`,enabled:()=>!p.value&&!!n.value?.connected,run:w}),T.scope.registerCommand({id:`ide.github.integration.device.start`,title:`Войти в GitHub через браузер`,description:`Сохраняет настройки и получает код GitHub Device Flow для подтверждения в браузере.`,enabled:()=>!p.value&&s.value&&!!c.value.trim()&&!y.value,run:b}),T.scope.registerCommand({id:`ide.github.integration.device.cancel`,title:`Отменить вход в GitHub`,description:`Прекращает ожидание подтверждения текущего входа GitHub Device Flow.`,enabled:()=>!!y.value,run:x}),(e,m)=>(V(),q(`section`,P8,[n.value?(V(),q(`article`,F8,[I(r,{as:`header`,gap:3,justify:`between`,wrap:``},{default:F(()=>[I(_,{as:`h3`,"space-after":0},{default:F(()=>[...m[9]||=[N(`Подключение`,-1)]]),_:1}),K(`span`,I8,j(n.value.connected?`подключён · ${n.value.account}`:`не подключён`),1)]),_:1}),I(ml,{as:`form`,align:`start`,onSubmit:m[3]||=Z(e=>H(T).run(`ide.github.integration.save`),[`prevent`])},{default:F(()=>[I(r,{as:`label`,class:`toggle`,justify:`normal`},{default:F(()=>[I(a,{modelValue:s.value,"onUpdate:modelValue":m[0]||=e=>s.value=e,type:`checkbox`,disabled:H(p)},null,8,[`modelValue`,`disabled`]),m[10]||=N(` включить интеграцию`,-1)]),_:1}),I(g,{layout:`plain`,label:`Папка для импорта`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:l.value,"onUpdate:modelValue":m[1]||=e=>l.value=e,disabled:H(p),placeholder:`~/Projects`,required:``}),null,16,[`modelValue`,`disabled`])]),_:1}),I(g,{layout:`plain`,label:`Client ID для входа через браузер`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:c.value,"onUpdate:modelValue":m[2]||=e=>c.value=e,disabled:H(p),placeholder:`Client ID вашей GitHub OAuth App`,autocomplete:`off`}),null,16,[`modelValue`,`disabled`])]),_:1}),m[12]||=K(`p`,{class:`muted help`},[N(` Для входа по коду создайте `),K(`a`,{href:`https://github.com/settings/developers`,target:`_blank`,rel:`noopener noreferrer`},`OAuth App`),N(` и включите Device Flow. Client secret не нужен. Можно также подключиться токеном ниже. `)],-1),I(Q,{type:`submit`,"data-command":`ide.github.integration.save`,disabled:H(p)},{default:F(()=>[...m[11]||=[N(`сохранить настройки`,-1)]]),_:1},8,[`disabled`])]),_:1}),n.value.connected&&o.value.backend===`keyring`?(V(),Y(H(VP),{key:0,ref_key:`tokenView`,ref:h,integration:`github`,label:`Токен GitHub`,disabled:H(p),onError:m[4]||=e=>d.value=e},null,8,[`disabled`])):B(``,!0),I(r,{class:`actions`,gap:3,wrap:``},{default:F(()=>[I(Q,{disabled:H(p)||!s.value||!c.value.trim()||!!H(y),"data-command":`ide.github.integration.device.start`,onClick:m[5]||=e=>H(T).run(`ide.github.integration.device.start`)},{default:F(()=>[...m[13]||=[N(`войти через GitHub`,-1)]]),_:1},8,[`disabled`]),n.value.connected?(V(),Y(Q,{key:0,disabled:H(p),"data-command":`ide.github.integration.disconnect`,onClick:m[6]||=e=>H(T).run(`ide.github.integration.disconnect`)},{default:F(()=>[...m[14]||=[N(`выйти`,-1)]]),_:1},8,[`disabled`])):B(``,!0)]),_:1}),H(y)?(V(),Y(H(eF),{key:1,host:`GitHub`,device:H(y),"command-id":`ide.github.integration.device.cancel`,onCancel:H(x)},null,8,[`device`,`onCancel`])):B(``,!0),K(`details`,null,[m[18]||=K(`summary`,null,`Войти с Personal Access Token`,-1),I(ml,{as:`form`,align:`start`,onSubmit:m[8]||=Z(e=>H(T).run(`ide.github.integration.connect`),[`prevent`])},{default:F(()=>[m[16]||=K(`p`,{class:`muted help`},` Fine-grained token: доступ к нужным репозиториям и Contents: read. Для classic token и приватных репозиториев — scope repo. `,-1),m[17]||=K(`p`,{class:`muted help`},`Подключение токеном автоматически включит интеграцию.`,-1),I(g,{layout:`plain`,label:`Токен GitHub`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:u.value,"onUpdate:modelValue":m[7]||=e=>u.value=e,type:`password`,autocomplete:`off`,disabled:H(p),placeholder:`github_pat_…`,required:``}),null,16,[`modelValue`,`disabled`])]),_:1}),I(Q,{type:`submit`,"data-command":`ide.github.integration.connect`,disabled:H(p)||!u.value.trim()},{default:F(()=>[...m[15]||=[N(`подключить GitHub`,-1)]]),_:1},8,[`disabled`])]),_:1})])])):B(``,!0),K(`details`,L8,[m[24]||=K(`summary`,null,`Хранение настроек и авторизации`,-1),K(`p`,R8,[m[22]||=N(` Настройки и авторизация хранятся в файле `,-1),K(`code`,null,j(i.value||`integrations.json`),1),m[23]||=N(`. `,-1),o.value.backend===`keyring`?(V(),q(W,{key:0},[N(` Токены и ключи — в системном хранилище секретов (Secret Service), в файле их нет. `)],64)):o.value.reason===`disabled`?(V(),q(W,{key:1},[m[19]||=N(` Хранилище секретов отключено (`,-1),m[20]||=K(`code`,null,`PROJECTOR_SECRET_STORE=file`,-1),m[21]||=N(`): токены лежат в этом файле. `,-1)],64)):(V(),q(W,{key:2},[N(` Системное хранилище секретов недоступно: токены лежат в этом файле с правами 0600. `)],64))])]),H(d)?(V(),Y(t,{key:1,tone:`danger`,role:`alert`},{default:F(()=>[N(j(H(d)),1)]),_:1})):B(``,!0),H(f)?(V(),q(`p`,z8,j(H(f)),1)):B(``,!0)]))}}),[[`__scopeId`,`data-v-ae27d061`]]),V8=M({__name:`GithubClone`,props:{repository:{},navigate:{type:Function}},setup(e){let t=e,n=z(()=>`gh:/${t.repository}`),r=z(()=>t.repository.split(`/`).pop()??``);return(t,i)=>(V(),Y(H(ZP),{source:`github`,repository:e.repository,"destination-name":r.value,"project-id":n.value,navigate:e.navigate},null,8,[`repository`,`destination-name`,`project-id`,`navigate`]))}}),H8=M({__name:`GithubConnection`,props:{repository:{}},emits:[`connected`],setup(e,{emit:t}){let n=e,r=t,i=z(()=>ec({kind:`github`,repository:n.repository}));async function a(e){await N8(e)}return(t,n)=>(V(),Y(H(EF),{host:`GitHub`,"subject-label":`Репозиторий`,subject:e.repository,"project-id":i.value,"scope-key":`github-connection:${e.repository}`,surface:`github-integration`,placeholder:`github_pat_…`,"token-url":`https://github.com/settings/tokens`,"command-id":`ide.github.integration.connect`,"command-description":`Подключает GitHub с токеном, введённым в форме интеграции, и открывает репозиторий.`,"readout-note":`Подключение к GitHub`,connect:a,onConnected:n[0]||=e=>r(`connected`)},null,8,[`subject`,`project-id`,`scope-key`]))}}),U8={class:`integrations`},W8={key:0,class:`plugin`},G8={class:`status`},K8={class:`muted help`},q8=[`href`],J8={class:`muted help`},Y8={key:2,class:`muted`,role:`status`},X8=G(M({__name:`GitlabSettings`,setup(e){let n=X(null),i=X({backend:`file`,reason:`unavailable`}),o=X(!1),s=X(``),c=X(``),l=X(``),u=X(``),d=z(()=>(s.value??``).trim().length>0),f=X(``),{error:p,message:m,busy:h,action:v}=CF(),y=X(null);function x(e){n.value=e,e.connected||y.value?.hide(),o.value=e.enabled,s.value=e.settings.clientId??``,c.value=e.settings.url??``,l.value=e.settings.directory}Lt(()=>v(async()=>{let e=await NP();i.value=e.secretStorage;let t=e.integrations.find(e=>e.id===`gitlab`);t&&x(t)}).catch(()=>{}));let{device:S,start:C,cancel:w}=tF({endpoint:`/gitlab/device`,pollEndpoint:`/gitlab/device/poll`,connectedMessage:`GitLab подключён`,save:()=>T(),apply:x,error:p,message:m,action:v});async function T(e=o.value){w(),x(await MP(`/gitlab`,`PUT`,{enabled:e,clientId:s.value,url:c.value,directory:l.value}))}function ee(){if(!h.value&&u.value.trim())return v(async()=>{w(),await T(!0),x(await MP(`/gitlab/auth`,`POST`,{token:u.value.trim()})),u.value=``,m.value=`GitLab подключён`})}function te(){return v(async()=>{w(),x(await MP(`/gitlab/auth`,`DELETE`)),m.value=`GitLab отключён`})}let D=E(`gitlab-settings`,()=>({surface:`settings`,integration:`gitlab`}));return D.scope.registerCommand({id:`ide.gitlab.integration.save`,title:`Сохранить настройки GitLab`,description:`Сохраняет адрес GitLab, Client ID OAuth-приложения, папку импорта и состояние интеграции.`,enabled:()=>!h.value&&!!n.value,run:()=>v(async()=>{await T(),m.value=`Настройки сохранены`})}),D.scope.registerCommand({id:`ide.gitlab.integration.connect`,title:`Подключить GitLab`,description:`Подключает GitLab по Personal Access Token (scope read_api и read_repository), введённому в форме.`,enabled:()=>!h.value&&!!u.value.trim(),run:ee}),D.scope.registerCommand({id:`ide.gitlab.integration.disconnect`,title:`Отключить GitLab`,description:`Удаляет сохранённый токен GitLab из Projector.`,enabled:()=>!h.value&&!!n.value?.connected,run:te}),D.scope.registerCommand({id:`ide.gitlab.integration.device.start`,title:`Войти в GitLab через браузер`,description:`Сохраняет настройки и получает код GitLab Device Flow для подтверждения в браузере (GitLab 17.1+).`,enabled:()=>!h.value&&o.value&&d.value&&!S.value,run:C}),D.scope.registerCommand({id:`ide.gitlab.integration.device.cancel`,title:`Отменить вход в GitLab`,description:`Прекращает ожидание подтверждения текущего входа GitLab Device Flow.`,enabled:()=>!!S.value,run:w}),D.scope.registerCommand({id:`ide.gitlab.repository.import`,title:`Клонировать проект GitLab`,description:`Клонирует проект GitLab (group/project или ссылка) в папку импорта и добавляет его в каталог проектов.`,arguments:{repository:`group/project или ссылка на проект GitLab`},enabled:()=>!h.value&&!!n.value?.connected,run:e=>v(async()=>{let t=String(b(e).repository??f.value).trim();if(!t)throw Error(`Укажите проект GitLab`);let n=await MP(`/gitlab/import`,`POST`,{repository:t});f.value=``,m.value=`Проект ${n.project.name} клонирован и добавлен`})}),(e,v)=>(V(),q(`section`,U8,[n.value?(V(),q(`article`,W8,[I(r,{as:`header`,gap:3,justify:`between`,wrap:``},{default:F(()=>[I(_,{as:`h3`,"space-after":0},{default:F(()=>[...v[12]||=[N(`Подключение`,-1)]]),_:1}),K(`span`,G8,j(n.value.connected?`подключён${n.value.auth===`oauth`?` · OAuth`:` · PAT`} · ${n.value.account}`:`не подключён`),1)]),_:1}),I(ml,{as:`form`,align:`start`,onSubmit:v[4]||=Z(e=>H(D).run(`ide.gitlab.integration.save`),[`prevent`])},{default:F(()=>[I(r,{as:`label`,class:`toggle`,justify:`normal`},{default:F(()=>[I(a,{modelValue:o.value,"onUpdate:modelValue":v[0]||=e=>o.value=e,type:`checkbox`,disabled:H(h)},null,8,[`modelValue`,`disabled`]),v[13]||=N(` включить интеграцию`,-1)]),_:1}),I(g,{layout:`plain`,label:`Адрес GitLab`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:c.value,"onUpdate:modelValue":v[1]||=e=>c.value=e,disabled:H(h),placeholder:`https://gitlab.com`,autocomplete:`off`,required:``}),null,16,[`modelValue`,`disabled`])]),_:1}),I(g,{layout:`plain`,label:`Client ID для входа через браузер`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:s.value,"onUpdate:modelValue":v[2]||=e=>s.value=e,disabled:H(h),placeholder:`Client ID OAuth-приложения GitLab`,autocomplete:`off`}),null,16,[`modelValue`,`disabled`])]),_:1}),I(g,{layout:`plain`,label:`Папка для импорта`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:l.value,"onUpdate:modelValue":v[3]||=e=>l.value=e,disabled:H(h),placeholder:`~/Projects`,required:``}),null,16,[`modelValue`,`disabled`])]),_:1}),K(`p`,K8,[v[14]||=N(` Для self-hosted укажите адрес вашего сервера. Смена адреса сбрасывает сохранённый токен. Для входа через браузер создайте `,-1),K(`a`,{href:`${c.value||`https://gitlab.com`}/-/user_settings/applications`,target:`_blank`,rel:`noopener noreferrer`},`OAuth Application`,8,q8),v[15]||=N(` на своём инстансе, включите Device Flow (GitLab 17.1+) и права `,-1),v[16]||=K(`code`,null,`read_api`,-1),v[17]||=N(`, `,-1),v[18]||=K(`code`,null,`read_repository`,-1),v[19]||=N(`, `,-1),v[20]||=K(`code`,null,`read_user`,-1),v[21]||=N(`. Client secret не нужен. Можно также подключиться токеном ниже. `,-1)]),I(Q,{type:`submit`,"data-command":`ide.gitlab.integration.save`,disabled:H(h)},{default:F(()=>[...v[22]||=[N(`сохранить настройки`,-1)]]),_:1},8,[`disabled`])]),_:1}),n.value.connected&&i.value.backend===`keyring`?(V(),Y(H(VP),{key:0,ref_key:`tokenView`,ref:y,integration:`gitlab`,label:`Токен GitLab`,disabled:H(h),onError:v[5]||=e=>p.value=e},null,8,[`disabled`])):B(``,!0),I(r,{class:`actions`,gap:3,wrap:``},{default:F(()=>[I(Q,{disabled:H(h)||!o.value||!d.value||!!H(S),"data-command":`ide.gitlab.integration.device.start`,onClick:v[6]||=e=>H(D).run(`ide.gitlab.integration.device.start`)},{default:F(()=>[...v[23]||=[N(`войти через GitLab`,-1)]]),_:1},8,[`disabled`])]),_:1}),H(S)?(V(),Y(H(eF),{key:1,host:`GitLab`,device:H(S),"command-id":`ide.gitlab.integration.device.cancel`,onCancel:H(w)},null,8,[`device`,`onCancel`])):B(``,!0),I(ml,{as:`form`,align:`start`,class:`block`,onSubmit:v[9]||=Z(e=>H(D).run(`ide.gitlab.integration.connect`),[`prevent`])},{default:F(()=>[K(`p`,J8,[v[24]||=N(` Personal Access Token со scope `,-1),v[25]||=K(`code`,null,`read_api`,-1),v[26]||=N(` и `,-1),v[27]||=K(`code`,null,`read_repository`,-1),v[28]||=N(` (`,-1),K(`code`,null,j(c.value||`https://gitlab.com`)+`/-/user_settings/personal_access_tokens`,1),v[29]||=N(`). Подключение токеном автоматически включит интеграцию. `,-1)]),I(g,{layout:`plain`,label:`Токен GitLab`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:u.value,"onUpdate:modelValue":v[7]||=e=>u.value=e,type:`password`,autocomplete:`off`,disabled:H(h),placeholder:`glpat-…`,required:``}),null,16,[`modelValue`,`disabled`])]),_:1}),I(r,{class:`actions`,gap:3,wrap:``},{default:F(()=>[I(Q,{type:`submit`,"data-command":`ide.gitlab.integration.connect`,disabled:H(h)||!u.value.trim()},{default:F(()=>[...v[30]||=[N(`подключить GitLab`,-1)]]),_:1},8,[`disabled`]),n.value.connected?(V(),Y(Q,{key:0,"data-command":`ide.gitlab.integration.disconnect`,disabled:H(h),onClick:v[8]||=e=>H(D).run(`ide.gitlab.integration.disconnect`)},{default:F(()=>[...v[31]||=[N(`выйти`,-1)]]),_:1},8,[`disabled`])):B(``,!0)]),_:1})]),_:1}),n.value.connected?(V(),Y(ml,{key:2,as:`form`,align:`start`,class:`block`,onSubmit:v[11]||=Z(e=>H(D).run(`ide.gitlab.repository.import`),[`prevent`])},{default:F(()=>[I(g,{layout:`plain`,label:`Клонировать проект`},{default:F(({control:e})=>[I(a,rn(e,{modelValue:f.value,"onUpdate:modelValue":v[10]||=e=>f.value=e,disabled:H(h),placeholder:`group/project или ссылка`,autocomplete:`off`}),null,16,[`modelValue`,`disabled`])]),_:1}),v[33]||=K(`p`,{class:`muted help`},[N(` Также доступно в палитре: введите `),K(`code`,null,`gl/`),N(` и название проекта. `)],-1),I(Q,{type:`submit`,"data-command":`ide.gitlab.repository.import`,disabled:H(h)||!f.value.trim()},{default:F(()=>[...v[32]||=[N(`клонировать`,-1)]]),_:1},8,[`disabled`])]),_:1})):B(``,!0)])):B(``,!0),H(p)?(V(),Y(t,{key:1,tone:`danger`,role:`alert`},{default:F(()=>[N(j(H(p)),1)]),_:1})):B(``,!0),H(m)?(V(),q(`p`,Y8,j(H(m)),1)):B(``,!0)]))}}),[[`__scopeId`,`data-v-715a89ef`]]),Z8=[7,30,90],Q8={hours5:18e3,week:604800,month:2592e3,rolling:18e3,weekly:604800,monthly:2592e3};function $8(e,t,n,r=Date.now(),i=!1){if(!Number.isFinite(e)||e<0||!Number.isFinite(n)||(n??0)<=0)return null;if(i||e>=100)return`over`;if(!t||!Number.isFinite(t))return null;let a=Math.max(0,t-r/1e3),o=e-(1-Math.min(1,a/n))*100;return o<=-15?`spare`:o<=8?`normal`:o<=22?`hot`:`over`}async function e5(e){let t=await fetch(`/api/analytics?days=${encodeURIComponent(String(e))}`,{cache:`no-store`});if(!t.ok)throw Error(`Аналитика недоступна: HTTP ${t.status}`);return await t.json()}var t5=new Intl.NumberFormat(`ru`);function n5(e){return!Number.isFinite(e)||e<=0?`0`:e<1e3?t5.format(Math.round(e)):e<1e6?`${r5(e/1e3)} тыс.`:e<1e9?`${r5(e/1e6)} млн`:`${r5(e/1e9)} млрд`}function r5(e){let t=e>=100?Math.round(e):Math.round(e*10)/10;return t5.format(t)}function i5(e){return!Number.isFinite(e)||e<=0?`0`:new Intl.NumberFormat(`ru`,{maximumFractionDigits:e<1?4:2}).format(e)}function a5(e,t){if(!Number.isFinite(e))return`—`;try{return new Intl.NumberFormat(`ru`,{style:`currency`,currency:t,maximumFractionDigits:e<1?4:2}).format(e)}catch{return`${i5(e)} ${t}`}}function o5(e){return e==null||!Number.isFinite(e)?`—`:`${Math.round(e)}%`}function s5(e){let[,t,n]=e.split(`-`);return t&&n?`${n}.${t}`:e}function c5(e){let t=new Date(e);return`${String(t.getDate()).padStart(2,`0`)}.${String(t.getMonth()+1).padStart(2,`0`)}`}function l5(e){let t=new Date(e);return`${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`}function u5(e){let t=e%10,n=e%100;return`${e} ${n>=11&&n<=14?`дней`:t===1?`день`:t>=2&&t<=4?`дня`:`дней`}`}function d5(e){switch(e){case`rolling`:return`5 часов`;case`weekly`:return`Неделя`;case`monthly`:return`Месяц`;case`total`:return`Всего`;case`auto`:return`Авто-модели`;case`api`:return`API-модели`;default:return e}}var f5=6;function p5(e){return qn().find(t=>t.backend===e||t.program===e)?.title??(e===`неизвестный`?`Без агента`:e)}function m5(e){switch(e){case`chat`:return`Чат Projector`;case`lens`:return`Lens`;case`judge`:return`Судья`;case`doctor-form`:return`Доктор форм`;case`doctor-answer`:return`Доктор ответов`;case`compaction`:return`Сжатие истории`;case`review`:return`Проверка команд`;case`task`:return`Task · исследование`;default:return e.startsWith(`agent:`)?`${e===`agent:unknown`?`Без агента`:p5(e.slice(6))} · чат`:e}}function h5(e,t,n){let r=e.map(e=>({label:n(e.key),value:e.tokens,share:t?e.tokens/t:0}));if(r.length<=f5)return r;let i=r.slice(0,f5),a=r.slice(f5).reduce((e,t)=>e+t.value,0);return a&&i.push({label:`Другие`,value:a,share:t?a/t:0}),i}var g5=e=>d5(e);function _5(){let e=X(30),t=We(null),n=X(!1),r=X(!1),i=X(``),a=0,o=du({scheduler:e=>ql(e,3e4)}),{isEnabled:s,loaded:c}=pS();async function l(){let r=++a;n.value=!0;try{let n=await e5(e.value);r===a&&(t.value=n,i.value=``)}catch(e){r===a&&(i.value=e instanceof Error?e.message:`Не удалось загрузить аналитику`)}finally{r===a&&(n.value=!1)}}async function u(){let e=[...new Set(qn().flatMap(e=>e.usageUrl?[e.usageUrl]:[]))];r.value=!0;try{await Promise.allSettled([...e,`/api/providers/balance`].map(e=>fetch(e,{cache:`no-store`})))}finally{r.value=!1}}async function d(){await u(),await l()}function f(t){let n=Z8.find(e=>e===t);n&&n!==e.value&&(e.value=n,l())}Lt(()=>{l(),c.value&&u().then(l)}),R(c,e=>{e&&u().then(l)},{once:!0});let p=E(`analytics-settings`,()=>({surface:`settings`,days:e.value}));p.scope.registerCommand({id:`ide.analytics.refresh`,title:`Обновить аналитику расхода`,description:`Заново запрашивает лимиты агентов и перечитывает расход токенов по сохранённым ответам за выбранный период.`,run:d}),p.scope.registerCommand({id:`ide.analytics.range.set`,title:`Выбрать период аналитики`,description:`Переключает графики расхода на 7, 30 или 90 дней.`,arguments:{days:`7 | 30 | 90`},run:t=>(f(Number(b(t).days)),{days:e.value})}),p.scope.registerCommand({id:`ide.analytics.tasks.mode.set`,title:`Показать распределение по задачам`,description:`Переключает карточку «Куда ушли деньги» между токенами и стоимостью. Стоимость доступна, когда у моделей задана цена.`,arguments:{mode:`tokens | cost`},run:e=>{let t=b(e).mode;if(t!==`tokens`&&t!==`cost`)throw Error(`Неизвестный режим`);return T.value=t,{mode:T.value}}});let m=z(()=>t.value?.totals),h=z(()=>(t.value?.daily??[]).map(e=>({label:s5(e.day),values:{input:e.input,output:e.output,cacheRead:e.cacheRead,cacheWrite:e.cacheWrite}}))),g=z(()=>(t.value?.daily??[]).map(e=>({label:s5(e.day),value:e.cost}))),_=z(()=>{let e=t.value;return e?h5(e.byAgent,e.totals.tokens,p5):[]}),v=z(()=>{let e=t.value;return e?h5(e.byModel,e.totals.tokens,e=>e):[]}),y=z(()=>{let e=t.value;return e?h5(e.byProject,e.totals.tokens,e=>e):[]}),x=z(()=>{let e=t.value;if(!e)return[];let n=e.byTask.reduce((e,t)=>e+t.tokens,0)||1,r=e.byTask.reduce((e,t)=>e+t.cost,0)||1;return e.byTask.map(e=>({key:e.key,label:m5(e.key),tokens:e.tokens,cost:e.cost,calls:e.answers,shareTokens:e.tokens/n,shareCost:e.cost/r}))}),S=z(()=>(t.value?.byTask??[]).reduce((e,t)=>e+t.tokens,0)),C=z(()=>(t.value?.byTask??[]).reduce((e,t)=>e+t.cost,0)),w=z(()=>C.value>0),T=X(`tokens`);R(w,e=>{T.value=e?`cost`:`tokens`}),R(()=>t.value,()=>{w.value&&(T.value=`cost`)});let ee=z(()=>x.value.map(e=>({label:e.label,value:T.value===`cost`?e.cost:e.tokens,share:T.value===`cost`?e.shareCost:e.shareTokens}))),te=z(()=>t.value?.service),D=z(()=>t.value?.serviceCalls??0),ne=z(()=>(t.value?.limits??[]).filter(e=>!c.value||s(e.agent)).map(e=>({series:e,title:p5(e.agent),label:g5(e.window),tone:$8(e.usedPercent??0,e.resetsAt,e.periodSeconds,o.value.getTime(),e.limited)})).sort((e,t)=>{let n=e=>e===`over`?0:e===`hot`?1:e===`normal`?2:3;return n(e.tone)-n(t.tone)||(t.series.usedPercent??0)-(e.series.usedPercent??0)})),re=z(()=>t.value?.daily.at(-1)),ie=z(()=>t.value?.providers??[]),O=z(()=>ie.value.find(e=>e.currency===`USD`)??ie.value[0]??null),k=z(()=>t.value?t.value.totals.tokens/Math.max(1,t.value.days):0),A=z(()=>{let e=m.value;return!e||!e.tokens?0:e.cacheRead/e.tokens}),ae=z(()=>(m.value?.pricedAnswers??0)>0),j=z(()=>(m.value?.answers??0)>0),oe=z(()=>u5(e.value));return{ranges:Z8,days:e,data:t,loading:n,probing:r,error:i,now:o,commands:p,totals:m,dailyPoints:h,costPoints:g,agentRows:_,modelRows:v,projectRows:y,taskRows:x,taskItems:ee,taskTotalTokens:S,taskTotalCost:C,taskPriced:w,taskMode:T,service:te,serviceCalls:D,limitCards:ne,providerRows:ie,primaryProvider:O,today:re,todayLabel:z(()=>n5(re.value?.tokens??0)),averageTokens:k,cacheShare:A,priced:ae,hasUsage:j,rangeLabel:oe,formatTokens:n5,refresh:d,setDays:f}}var v5=[`aria-valuenow`,`aria-label`],y5=G(M({__name:`UiMeter`,props:{value:{default:0},tone:{default:`neutral`},height:{default:6},soft:{type:Boolean,default:!1},segments:{},ariaLabel:{}},setup(e){let t=e,n=e=>`${Math.max(0,Math.min(100,e))}%`,r=z(()=>t.segments?.length?t.segments.map(e=>({...e,width:n(e.value)})):[{tone:t.tone,soft:t.soft,width:n(t.value)}]);return(t,n)=>(V(),q(`div`,{class:`meter`,style:k({height:`${e.height}px`}),role:`meter`,"aria-valuemin":`0`,"aria-valuemax":`100`,"aria-valuenow":e.value,"aria-label":e.ariaLabel},[(V(!0),q(W,null,J(r.value,(e,t)=>(V(),q(`i`,{key:t,class:O([e.tone,{soft:e.soft}]),style:k({width:e.width})},null,6))),128))],12,v5))}}),[[`__scopeId`,`data-v-d6d881f8`]]);function b5(e,t=Date.now()){if(!e||!Number.isFinite(e))return`—`;let n=e-t/1e3;if(n<=0)return`сейчас`;if(n<60)return`<1м`;let r=Math.floor(n/60),i=Math.floor(r/60),a=Math.floor(i/24);return a?`${a}д${i%24?` ${i%24}ч`:``}`:i?`${i}ч${r%60?` ${r%60}м`:``}`:`${r}м`}function x5(e){return!e||!Number.isFinite(e)?`—`:new Date(e*1e3).toLocaleString(void 0,{day:`2-digit`,month:`2-digit`,hour:`2-digit`,minute:`2-digit`})}var S5={class:`window`},C5={class:`figures`},w5={class:`remaining`},T5=[`title`],E5={class:`meta`},D5={class:`hint`},O5={key:0,class:`spark`,viewBox:`0 0 100 30`,preserveAspectRatio:`none`,"aria-hidden":`true`},k5=[`points`],A5={key:1,class:`hint`},j5=G(M({__name:`LimitCard`,props:{series:{},title:{},label:{},tone:{},now:{}},setup(e){let t=e,n=z(()=>t.series.usedPercent),r=z(()=>n.value===null?null:Math.max(0,100-n.value)),i=z(()=>b5(t.series.resetsAt,t.now)),a=z(()=>x5(t.series.resetsAt)),o=z(()=>t.series.expectedPercent),s=z(()=>t.series.projectedPercent),c=z(()=>t.series.limited||(n.value??0)>=100),l=z(()=>t.tone===`spare`?`info`:t.tone===`hot`?`warning`:t.tone===`over`?`danger`:`neutral`),u=z(()=>{if(c.value)return{text:`Лимит исчерпан`,hint:``};if(o.value===null)return{text:`Темп без оценки`,hint:`окно не сообщает длину цикла`};let e=(n.value??0)-o.value;return e<=-15?{text:`Ниже темпа`,hint:`по времени ожидалось ${o5(o.value)}`}:e<=8?{text:`В пределах темпа`,hint:`по времени ожидалось ${o5(o.value)}`}:e<=22?{text:`Выше темпа`,hint:`по времени ожидалось ${o5(o.value)}`}:{text:`Быстрее окна`,hint:`по времени ожидалось ${o5(o.value)}`}}),d=z(()=>s.value===null?``:`к сбросу ≈ ${o5(s.value)}${s.value>=100?` · исчерпание`:``}`),f=z(()=>{let e=t.series.points;if(e.length<2)return``;let n=e[0],r=e.at(-1),i=Math.max(1,r.at-n.at),a=e.map(e=>e.used),o=Math.min(...a),s=Math.max(...a),c=s-o<.5,l=Math.max(1,s-o);return e.map(e=>{let t=(e.at-n.at)/i*100,r=c?15:26-(e.used-o)/l*22;return`${t.toFixed(2)},${r.toFixed(2)}`}).join(` `)});return(t,o)=>(V(),q(`article`,{class:O([`limit`,e.tone?`tone-${e.tone}`:void 0])},[K(`header`,null,[K(`strong`,null,j(e.title),1),K(`span`,S5,j(e.label),1)]),K(`div`,C5,[K(`span`,w5,j(r.value===null?`—`:H(o5)(r.value)),1),o[0]||=K(`span`,{class:`caption`},`осталось`,-1),o[1]||=K(`span`,{class:`spacer`},null,-1),K(`span`,{class:`countdown`,title:a.value},`сброс через `+j(i.value),9,T5)]),I(y5,{value:n.value??0,height:6,tone:l.value,"aria-label":`Лимит ${e.title}, ${e.label}: израсходовано ${H(o5)(n.value)}`},null,8,[`value`,`tone`,`aria-label`]),K(`div`,E5,[K(`span`,null,`израсходовано `+j(H(o5)(n.value)),1),K(`span`,null,j(u.value.text),1)]),K(`p`,D5,[N(j(u.value.hint),1),d.value?(V(),q(W,{key:0},[N(` · `+j(d.value),1)],64)):B(``,!0)]),f.value?(V(),q(`svg`,O5,[K(`polyline`,{points:f.value,"vector-effect":`non-scaling-stroke`},null,8,k5)])):(V(),q(`p`,A5,`история появится после нескольких проверок`))],2))}}),[[`__scopeId`,`data-v-db9c0a0c`]]);function M5(e){if(!Number.isFinite(e)||e<=0)return 1;let t=10**Math.floor(Math.log10(e)),n=e/t;return(n<=1?1:n<=2?2:n<=5?5:10)*t}function N5(e,t=6){if(e<=12)return Array.from({length:e},(e,t)=>t);let n=new Set([0,e-1]),r=Math.ceil(e/t);for(let t=r;t<e-1;t+=r)n.add(t);return[...n].sort((e,t)=>e-t)}function P5(e){let t=X(560),n=e.host,r;Lt(()=>{n.value&&typeof ResizeObserver<`u`&&(r=new ResizeObserver(([e])=>{let n=Math.round(e?.contentRect.width??0);n>160&&(t.value=n)}),r.observe(n.value))}),lt(()=>r?.disconnect());let i=z(()=>e.height()),a=z(()=>({l:42,r:e.right??12,t:12,b:20})),o=z(()=>Math.max(20,t.value-a.value.l-a.value.r)),s=z(()=>Math.max(20,i.value-a.value.t-a.value.b)),c=z(()=>M5(e.maxValue()));return{host:n,width:t,height:i,pad:a,innerWidth:o,innerHeight:s,max:c,ticks:z(()=>[0,.5,1].map(e=>e*c.value)),labelIndexes:z(()=>N5(e.labelsCount())),y:e=>a.value.t+s.value-e/c.value*s.value}}var F5=[`viewBox`,`aria-label`],I5={class:`grid`},L5=[`x1`,`x2`,`y1`,`y2`],R5={class:`y-labels`},z5=[`x`,`y`],B5=[`points`,`fill`],V5=[`points`,`stroke`],H5=[`cx`,`cy`,`fill`],U5={class:`x-labels`},W5=[`x`,`y`],G5={key:0,class:`empty`},K5=G(M({__name:`UsageLine`,props:{points:{},height:{default:160},format:{},color:{default:`var(--info)`},ariaLabel:{}},setup(e){let t=e,n=e=>t.format?.(e)??String(Math.round(e)),r=X(),{width:i,height:a,pad:o,innerWidth:s,innerHeight:c,ticks:l,labelIndexes:u,y:d}=P5({host:r,height:()=>t.height,maxValue:()=>Math.max(0,...t.points.map(e=>e.value)),labelsCount:()=>t.points.length}),f=e=>o.value.l+(t.points.length<=1?s.value/2:e/(t.points.length-1)*s.value),p=z(()=>t.points.map((e,t)=>`${f(t)},${d(e.value)}`).join(` `)),m=z(()=>{if(!t.points.length)return``;let e=f(0),n=f(t.points.length-1),r=o.value.t+c.value;return`${e},${r} ${p.value} ${n},${r}`}),h=z(()=>t.points.every(e=>!e.value));return(t,s)=>(V(),q(`div`,{ref_key:`host`,ref:r,class:`chart`},[K(`div`,{class:`plot`,style:k({height:`${H(a)}px`})},[(V(),q(`svg`,{viewBox:`0 0 ${H(i)} ${H(a)}`,"aria-label":e.ariaLabel,role:`img`,preserveAspectRatio:`none`},[K(`g`,I5,[(V(!0),q(W,null,J(H(l),e=>(V(),q(`line`,{key:e,x1:H(o).l,x2:H(i)-H(o).r,y1:H(d)(e),y2:H(d)(e)},null,8,L5))),128))]),K(`g`,R5,[(V(!0),q(W,null,J(H(l),e=>(V(),q(`text`,{key:e,x:H(o).l-6,y:H(d)(e)+3,"text-anchor":`end`},j(n(e)),9,z5))),128))]),h.value?B(``,!0):(V(),q(`polygon`,{key:0,points:m.value,fill:e.color,opacity:`0.12`},null,8,B5)),h.value?B(``,!0):(V(),q(`polyline`,{key:1,points:p.value,stroke:e.color,class:`line`},null,8,V5)),(V(!0),q(W,null,J(e.points,(t,r)=>et((V(),q(`circle`,{key:`${t.label}-${r}`,cx:f(r),cy:H(d)(t.value),r:`2.5`,fill:e.color},[K(`title`,null,j(t.label)+`: `+j(n(t.value)),1)],8,H5)),[[Ln,!h.value]])),128)),K(`g`,U5,[(V(!0),q(W,null,J(H(u),t=>(V(),q(`text`,{key:t,x:f(t),y:H(a)-5,"text-anchor":`middle`},j(e.points[t]?.label??``),9,W5))),128))])],8,F5)),h.value?(V(),q(`p`,G5,`Значения появятся, когда у ответов будет цена`)):B(``,!0)],4)],512))}}),[[`__scopeId`,`data-v-9f38af82`]]),q5={class:`provider`},J5={class:`currency`},Y5={class:`figures`},X5={class:`balance`},Z5={class:`movement`},Q5={key:0,class:`movement topped`},$5={key:2,class:`hint`},e7={class:`hint`},t7=G(M({__name:`ProviderBalanceCard`,props:{entry:{}},setup(e){let t=e,n=z(()=>{let e=t.entry.points[0]?.at??0;return(t.entry.points.at(-1)?.at??0)-e}),r=e=>n.value<1296e5?l5(e):c5(e),i=z(()=>t.entry.points.map(e=>({label:r(e.at),value:e.total}))),a=e=>a5(e,t.entry.currency),o=z(()=>{let e=t.entry.checkedAt;return e?`последняя проверка ${c5(e)}`:`баланс ещё не проверялся`});return(t,n)=>(V(),q(`article`,q5,[K(`header`,null,[K(`strong`,null,j(e.entry.label),1),K(`span`,J5,j(e.entry.currency),1)]),K(`div`,Y5,[K(`span`,X5,j(e.entry.total===null?`—`:a(e.entry.total)),1),n[0]||=K(`span`,{class:`caption`},`остаток`,-1)]),K(`div`,Z5,[n[1]||=K(`span`,null,`Потрачено за период`,-1),K(`strong`,null,j(a(e.entry.spent)),1)]),e.entry.toppedUp>0?(V(),q(`div`,Q5,[n[2]||=K(`span`,null,`Пополнено`,-1),K(`strong`,null,j(a(e.entry.toppedUp)),1)])):B(``,!0),i.value.length>1?(V(),Y(K5,{key:1,points:i.value,format:a,height:132,color:`var(--run)`,"aria-label":`Баланс ${e.entry.label} в ${e.entry.currency}`},null,8,[`points`,`aria-label`])):(V(),q(`p`,$5,`История появится после нескольких проверок баланса.`)),K(`p`,e7,j(o.value)+` · обновляется со статусной строкой и кнопкой «Обновить».`,1)]))}}),[[`__scopeId`,`data-v-9bfd39c4`]]),n7=[`viewBox`,`aria-label`],r7={class:`grid`},i7=[`x1`,`x2`,`y1`,`y2`],a7={class:`y-labels`},o7=[`x`,`y`],s7={class:`bars`},c7=[`x`,`y`,`width`,`height`,`fill`],l7={class:`x-labels`},u7=[`x`,`y`],d7={key:0,class:`empty`},f7={class:`legend`},p7=G(M({__name:`UsageBarChart`,props:{points:{},series:{},height:{default:180},format:{},ariaLabel:{}},setup(e){let t=e,n=e=>t.format?.(e)??String(Math.round(e)),r=z(()=>t.points.map(e=>t.series.reduce((t,n)=>t+Math.max(0,e.values[n.key]??0),0))),i=X(),{width:a,height:o,pad:s,innerWidth:c,innerHeight:l,max:u,ticks:d,labelIndexes:f,y:p}=P5({host:i,height:()=>t.height,maxValue:()=>Math.max(0,...r.value),labelsCount:()=>t.points.length,right:10}),m=z(()=>c.value/Math.max(1,t.points.length)),h=z(()=>Math.max(2,Math.min(28,m.value*.68))),g=z(()=>t.points.map((e,i)=>{let a=s.value.l+m.value*(i+.5),o=0;return{center:a,segments:t.series.flatMap(t=>{let r=Math.max(0,e.values[t.key]??0);if(!r)return[];let c=r/u.value*l.value,d={key:`${t.key}-${i}`,x:a-h.value/2,y:s.value.t+l.value-o-c,height:Math.max(.5,c),color:t.color,title:`${e.label} · ${t.label}: ${n(r)}`};return o+=c,[d]}),total:r.value[i]??0}})),_=e=>t.points[e]?.label??``,v=z(()=>r.value.every(e=>e===0));return(t,r)=>(V(),q(`div`,{ref_key:`host`,ref:i,class:`chart`},[K(`div`,{class:`plot`,style:k({height:`${H(o)}px`})},[(V(),q(`svg`,{viewBox:`0 0 ${H(a)} ${H(o)}`,"aria-label":e.ariaLabel,role:`img`,preserveAspectRatio:`none`},[K(`g`,r7,[(V(!0),q(W,null,J(H(d),e=>(V(),q(`line`,{key:e,x1:H(s).l,x2:H(a)-H(s).r,y1:H(p)(e),y2:H(p)(e)},null,8,i7))),128))]),K(`g`,a7,[(V(!0),q(W,null,J(H(d),e=>(V(),q(`text`,{key:e,x:H(s).l-6,y:H(p)(e)+3,"text-anchor":`end`},j(n(e)),9,o7))),128))]),K(`g`,s7,[(V(!0),q(W,null,J(g.value,e=>(V(),q(`g`,{key:e.center},[(V(!0),q(W,null,J(e.segments,e=>(V(),q(`rect`,{key:e.key,x:e.x,y:e.y,width:h.value,height:e.height,fill:e.color,rx:`1`},[K(`title`,null,j(e.title),1)],8,c7))),128))]))),128))]),K(`g`,l7,[(V(!0),q(W,null,J(H(f),e=>(V(),q(`text`,{key:e,x:g.value[e]?.center??0,y:H(o)-5,"text-anchor":`middle`},j(_(e)),9,u7))),128))])],8,n7)),v.value?(V(),q(`p`,d7,`Нет ответов с токенами за этот период`)):B(``,!0)],4),K(`ul`,f7,[(V(!0),q(W,null,J(e.series,e=>(V(),q(`li`,{key:e.key},[K(`i`,{style:k({background:e.color})},null,4),N(j(e.label),1)]))),128))])],512))}}),[[`__scopeId`,`data-v-ea932e94`]]),m7=[`aria-label`],h7={class:`head`},g7={class:`label`},_7={class:`value`},v7=G(M({__name:`UsageBreakdown`,props:{items:{},format:{type:Function},ariaLabel:{}},setup(e){let t=e,n=e=>t.format?.(e)??String(e);return(t,r)=>(V(),q(`ul`,{class:`breakdown`,"aria-label":e.ariaLabel},[(V(!0),q(W,null,J(e.items,e=>(V(),q(`li`,{key:e.label},[K(`div`,h7,[K(`span`,g7,j(e.label),1),K(`span`,_7,j(n(e.value)),1)]),I(y5,{value:Math.max(1,Math.min(100,e.share*100)),height:5,tone:`info`,soft:``},null,8,[`value`])]))),128))],8,m7))}}),[[`__scopeId`,`data-v-8ea01a52`]]),y7={class:`donut`},b7={class:`ring`},x7=[`aria-label`],S7=[`stroke`,`stroke-dasharray`,`stroke-dashoffset`],C7={x:`50`,y:`54`,"text-anchor":`middle`,class:`center`},w7={class:`label`},T7={key:0,class:`value`},E7={class:`share`},D7=42,O7=G(M({__name:`UiDonut`,props:{items:{},center:{},format:{type:Function},showValues:{type:Boolean},ariaLabel:{}},setup(e){let t=e,n=[`var(--info)`,`var(--run)`,`var(--warn)`,`var(--err)`,`var(--faint)`,`var(--muted)`],r=2*Math.PI*D7,i=z(()=>t.items.reduce((e,t)=>e+t.value,0)||1),a=z(()=>{let e=0;return t.items.map((t,a)=>{let o=t.value/i.value*r,s={...t,color:n[a%n.length],dash:`${o} ${r-o}`,offset:-e,share:Math.round(t.value/i.value*100)};return e+=o,s})}),o=e=>t.format?.(e)??String(e);return(t,n)=>(V(),q(`div`,y7,[K(`div`,b7,[(V(),q(`svg`,{viewBox:`0 0 100 100`,role:`img`,"aria-label":e.ariaLabel},[(V(!0),q(W,null,J(a.value,e=>(V(),q(`circle`,{key:e.label,cx:`50`,cy:`50`,r:D7,fill:`none`,stroke:e.color,"stroke-width":`13`,"stroke-dasharray":e.dash,"stroke-dashoffset":e.offset,transform:`rotate(-90 50 50)`},[K(`title`,null,j(e.label)+`: `+j(e.share)+`%`,1)],8,S7))),128)),K(`text`,C7,j(e.center??o(i.value)),1)],8,x7))]),K(`ul`,null,[(V(!0),q(W,null,J(a.value,t=>(V(),q(`li`,{key:t.label},[K(`i`,{style:k({background:t.color})},null,4),K(`span`,w7,j(t.label),1),e.showValues?(V(),q(`span`,T7,j(o(t.value)),1)):B(``,!0),K(`span`,E7,j(t.share)+`%`,1)]))),128))])]))}}),[[`__scopeId`,`data-v-b8969122`]]),Dte=M({__name:`UsageDonut`,props:{items:{},center:{},format:{type:Function}},setup(e){return(t,n)=>(V(),Y(O7,{items:e.items,center:e.center,format:e.format,"show-values":``,"aria-label":`Доля токенов по агентам`},null,8,[`items`,`center`,`format`]))}}),Ote={class:`stats`},kte={class:`stat-label`},Ate={class:`stat-hint`},jte={class:`grid`},Mte={class:`card-head`},Nte={class:`providers`},Pte={class:`card-head`},Fte={key:0,class:`task-total`},Ite={class:`task-note`},Lte={class:`card-head`},Rte={key:0,class:`limits`},zte=[{id:`interface`,title:`Интерфейс`,group:`Среда`,description:`Режим запуска, системная горячая клавиша и цветовая схема.`,keywords:`окно браузер GTK трей хоткей shortcut запуск цвет тема схема светлая тёмная appearance`,component:$o},{id:`pwa`,title:`Приложение`,group:`Среда`,description:`Установка на домашний экран, отдельное окно и полноэкранный режим.`,keywords:`pwa установка приложение иконка домашний экран ярлык fullscreen полный экран standalone service worker кеш офлайн`,component:Dee},{id:`folders`,title:`Избранные папки`,group:`Среда`,description:`Папки с проектами: их проекты идут первыми, на диске ищутся ещё не открытые, внутри создаются новые.`,keywords:`избранное папки проекты создать новый проект каталог на диске favorite folder`,component:ys},{id:`editor`,title:`Редактор`,group:`Среда`,description:`Тема кода и сравнения изменений во всех проектах.`,keywords:`цвет тема подсветка код diff`,component:e6,props:{embedded:!0}},{id:`files`,title:`Файлы`,group:`Среда`,description:`Исключения дерева проекта и поиска через glob-паттерны files.exclude.`,keywords:`exclude files.exclude glob скрыть дерево node_modules dist .git vendor coverage поиск файлы`,component:g$,props:{embedded:!0}},{id:`keybindings`,title:`Горячие клавиши`,group:`Среда`,description:`Сочетания клавиш для команд Projector.`,keywords:`keyboard shortcut хоткей команды сочетания`,component:jd,props:{embedded:!0}},{id:`network`,title:`Сеть`,group:`Подключения`,description:`Доступ с других устройств и пароль локальной сети.`,keywords:`LAN localhost телефон пароль доступ сервер`,component:s0},{id:`hub`,title:`Hub`,group:`Подключения`,description:`Подключение этой машины к общему веб-интерфейсу Projector.`,keywords:`hub устройства удалённый доступ туннель токен сервер`,component:x},{id:`openai-api`,title:`OpenAI API`,group:`Подключения`,description:`OpenAI-совместимый API Projector для других приложений на машине.`,keywords:`OpenAI API шлюз gateway proxy v1 chat completions провайдер ключ AI LLM`,component:m0},{id:`github`,title:`GitHub`,group:`Подключения`,description:`Авторизация и папка для импорта репозиториев.`,keywords:`интеграции OAuth Client ID token токен PAT импорт папка репозиторий`,component:B8},{id:`gitlab`,title:`GitLab`,group:`Подключения`,description:`Токен, адрес сервера и папка для импорта проектов GitLab.`,keywords:`интеграции gitlab self-hosted token токен PAT импорт папка проект клонирование`,component:X8},{id:`docker`,title:`Docker`,group:`Подключения`,description:`Локальное окружение Docker и состояние подключения.`,keywords:`интеграции контейнер context daemon compose окружение`,component:HZ},{id:`analytics`,title:`Аналитика расхода`,group:`Агент`,description:`Токены и стоимость по ответам агентов, доли моделей и проектов, остаток и темп лимитов подписок. Считается локально по истории чатов.`,keywords:`аналитика расход токены стоимость цена лимиты квоты графики период день модели проекты кэш остаток темп usage analytics charts`,component:G(M({__name:`AnalyticsSettings`,setup(e){let{ranges:n,days:i,data:a,loading:o,probing:s,error:c,now:u,commands:d,totals:f,dailyPoints:p,costPoints:m,agentRows:h,modelRows:g,projectRows:_,taskItems:v,taskTotalTokens:y,taskTotalCost:b,taskPriced:x,taskMode:S,service:C,serviceCalls:w,limitCards:T,providerRows:ee,primaryProvider:E,today:te,todayLabel:D,averageTokens:ne,cacheShare:re,priced:ie,rangeLabel:O,formatTokens:k}=_5(),A=[{key:`cacheRead`,label:`Из кэша`,color:`var(--info)`},{key:`input`,label:`Без кэша`,color:`var(--run)`},{key:`cacheWrite`,label:`Запись в кэш`,color:`var(--warn)`},{key:`output`,label:`Ответ`,color:`var(--err)`}],ae=z(()=>{let e=f.value;return e?[{label:`Токены`,value:k(e.tokens),hint:Qn(e.answers,`ответ`,`ответа`,`ответов`)},{label:`Сегодня`,value:D.value,hint:Qn(te.value?.answers??0,`ответ`,`ответа`,`ответов`)},{label:`В среднем в день`,value:k(ne.value),hint:O.value},{label:`Из кэша`,value:o5(re.value*100),hint:`${k(e.cacheRead)} токенов`},{label:`Стоимость Projector`,value:ie.value?i5(e.cost):`—`,hint:ie.value?`${Qn(e.pricedAnswers,`ответ`,`ответа`,`ответов`)} с ценой`:E.value?`цена не задана · ниже баланс`:`цена моделей не задана`},...E.value?[{label:`${E.value.label} · расход`,value:a5(E.value.spent,E.value.currency),hint:E.value.total===null?`баланс неизвестен`:`остаток ${a5(E.value.total,E.value.currency)}`}]:[],...w.value>0?[{label:`Служебные вызовы`,value:k(C.value?.tokens??0),hint:`${Qn(w.value,`вызов`,`вызова`,`вызовов`)} · Lens, Судья, Доктор`}]:[]]:[]});return(e,C)=>(V(),Y(ml,{as:`section`,gap:4,onFocusin:C[3]||=e=>H(d).scope.activate(),onPointerdown:C[4]||=e=>H(d).scope.activate()},{default:F(()=>[I(r,{gap:2,justify:`between`,wrap:``},{default:F(()=>[I(r,{gap:1,wrap:``,"aria-label":`Период аналитики`},{default:F(()=>[(V(!0),q(W,null,J(H(n),e=>(V(),Y(Q,{key:e,size:`sm`,active:H(i)===e,onClick:t=>H(d).run(`ide.analytics.range.set`,{days:e})},{default:F(()=>[N(j(H(u5)(e)),1)]),_:2},1032,[`active`,`onClick`]))),128))]),_:1}),I(Q,{size:`sm`,appearance:`outline`,busy:H(o)||H(s),onClick:C[0]||=e=>H(d).run(`ide.analytics.refresh`)},{default:F(()=>[...C[5]||=[N(`Обновить`,-1)]]),_:1},8,[`busy`])]),_:1}),H(c)?(V(),Y(t,{key:0,tone:`danger`,size:`xs`},{default:F(()=>[N(j(H(c)),1)]),_:1})):B(``,!0),!H(a)&&H(o)?(V(),Y(nd,{key:1,density:`compact`},{default:F(()=>[...C[6]||=[N(`Считаю расход…`,-1)]]),_:1})):B(``,!0),H(a)?(V(),q(W,{key:2},[K(`div`,Ote,[(V(!0),q(W,null,J(ae.value,e=>(V(),Y(l,{key:e.label,appearance:`frame`,density:`compact`,class:`stat`},{default:F(()=>[K(`span`,kte,j(e.label),1),K(`strong`,null,j(e.value),1),K(`span`,Ate,j(e.hint),1)]),_:2},1024))),128))]),K(`div`,jte,[I(l,{appearance:`frame`,class:`wide`,as:`section`},{default:F(()=>[K(`header`,Mte,[C[7]||=K(`h4`,null,`Токены по дням`,-1),K(`span`,null,j(H(O)),1)]),I(p7,{points:H(p),series:A,format:H(k),height:190,"aria-label":`Токены по дням, разделённые по кэшу`},null,8,[`points`,`format`])]),_:1}),H(ie)?(V(),Y(l,{key:0,appearance:`frame`,class:`wide`,as:`section`},{default:F(()=>[C[8]||=K(`header`,{class:`card-head`},[K(`h4`,null,`Стоимость по дням`),K(`span`,null,`в валюте тарифа модели`)],-1),I(K5,{points:H(m),format:H(i5),height:170,"aria-label":`Стоимость ответов по дням`},null,8,[`points`,`format`])]),_:1})):B(``,!0),H(ee).length?(V(),Y(l,{key:1,appearance:`frame`,class:`wide`,as:`section`},{default:F(()=>[C[9]||=K(`header`,{class:`card-head`},[K(`h4`,null,`Баланс провайдера`),K(`span`,null,`расход по деньгам, а не по токенам`)],-1),K(`div`,Nte,[(V(!0),q(W,null,J(H(ee),e=>(V(),Y(t7,{key:`${e.provider}:${e.currency}`,entry:e},null,8,[`entry`]))),128))])]),_:1})):B(``,!0),I(l,{appearance:`frame`,class:`wide`,as:`section`},{default:F(()=>[K(`header`,Pte,[C[12]||=K(`h4`,null,`Куда ушли деньги`,-1),I(r,{gap:1,wrap:``},{default:F(()=>[H(x)?(V(),q(`span`,Fte,j(H(S)===`cost`?H(i5)(H(b)):H(k)(H(y))),1)):B(``,!0),H(x)?(V(),Y(Q,{key:1,size:`sm`,active:H(S)===`tokens`,onClick:C[1]||=e=>H(d).run(`ide.analytics.tasks.mode.set`,{mode:`tokens`})},{default:F(()=>[...C[10]||=[N(`Токены`,-1)]]),_:1},8,[`active`])):B(``,!0),H(x)?(V(),Y(Q,{key:2,size:`sm`,active:H(S)===`cost`,onClick:C[2]||=e=>H(d).run(`ide.analytics.tasks.mode.set`,{mode:`cost`})},{default:F(()=>[...C[11]||=[N(`Деньги`,-1)]]),_:1},8,[`active`])):B(``,!0)]),_:1})]),H(v).length?(V(),Y(v7,{key:0,items:H(v),format:H(S)===`cost`?H(i5):H(k),"aria-label":`Распределение расхода по задачам`},null,8,[`items`,`format`])):(V(),Y(nd,{key:1,density:`compact`,align:`start`},{default:F(()=>[...C[13]||=[N(`Нет данных за период`,-1)]]),_:1})),K(`p`,Ite,j(H(x)?`Доля стоимости по задачам: ответы чата и короткие вызовы Projector.`:`Цена моделей не задана — показана доля токенов; суммы появятся после настройки цен. Lens, Судья и Доктор добавляются после первого вызова.`),1)]),_:1}),I(l,{appearance:`frame`,as:`section`},{default:F(()=>[K(`header`,Lte,[C[14]||=K(`h4`,null,`Агенты`,-1),K(`span`,null,j(H(Qn)(H(f)?.answers??0,`ответ`,`ответа`,`ответов`)),1)]),H(h).length?(V(),Y(Dte,{key:0,items:H(h),center:H(k)(H(f)?.tokens??0),format:H(k)},null,8,[`items`,`center`,`format`])):(V(),Y(nd,{key:1,density:`compact`,align:`start`},{default:F(()=>[...C[15]||=[N(`Нет данных за период`,-1)]]),_:1}))]),_:1}),I(l,{appearance:`frame`,as:`section`},{default:F(()=>[C[17]||=K(`header`,{class:`card-head`},[K(`h4`,null,`Модели`),K(`span`,null,`доля токенов`)],-1),H(g).length?(V(),Y(v7,{key:0,items:H(g),format:H(k),"aria-label":`Токены по моделям`},null,8,[`items`,`format`])):(V(),Y(nd,{key:1,density:`compact`,align:`start`},{default:F(()=>[...C[16]||=[N(`Нет данных за период`,-1)]]),_:1}))]),_:1}),I(l,{appearance:`frame`,as:`section`},{default:F(()=>[C[19]||=K(`header`,{class:`card-head`},[K(`h4`,null,`Проекты`),K(`span`,null,`доля токенов`)],-1),H(_).length?(V(),Y(v7,{key:0,items:H(_),format:H(k),"aria-label":`Токены по проектам`},null,8,[`items`,`format`])):(V(),Y(nd,{key:1,density:`compact`,align:`start`},{default:F(()=>[...C[18]||=[N(`Нет данных за период`,-1)]]),_:1}))]),_:1})]),I(l,{appearance:`frame`,as:`section`},{default:F(()=>[C[22]||=K(`header`,{class:`card-head`},[K(`h4`,null,`Лимиты подписок`),K(`span`,null,`остаток и темп расхода окна`)],-1),H(T).length?(V(),q(`div`,Rte,[(V(!0),q(W,null,J(H(T),e=>(V(),Y(j5,{key:`${e.series.agent}:${e.series.window}`,series:e.series,title:e.title,label:e.label,tone:e.tone,now:H(u).getTime()},null,8,[`series`,`title`,`label`,`tone`,`now`]))),128))])):(V(),Y(nd,{key:1,density:`compact`,align:`start`},{default:F(()=>[...C[20]||=[N(` Лимиты ещё не проверялись. Нажмите «Обновить» — Projector спросит их у настроенных агентов. `,-1)]]),_:1})),H(s)?(V(),Y(t,{key:2,tone:`muted`,size:`xs`},{default:F(()=>[...C[21]||=[N(` Запрашиваю лимиты у агентов… `,-1)]]),_:1})):B(``,!0)]),_:1}),H(ie)?B(``,!0):(V(),Y(t,{key:0,tone:`muted`,size:`xs`,variant:`note`},{default:F(()=>[...C[23]||=[N(` Стоимость Projector по токенам не считается: у моделей не задана цена. Её можно указать в разделе «Модели и провайдеры»; фактические деньги видны по балансу провайдера. `,-1)]]),_:1}))],64)):B(``,!0)]),_:1}))}}),[[`__scopeId`,`data-v-f17e6479`]])},{id:`providers`,title:`Модели и провайдеры`,group:`Агент`,description:`Провайдеры OpenAI-compatible API для агента Projector.`,keywords:`Qwen OpenAI API key ключ URL модель AI LLM`,component:c8},{id:`agents`,title:`Агенты`,group:`Агент`,description:`Включение, режим сессий и возможности каждого адаптера — на одной странице у агента.`,keywords:`интеграции адаптеры кодовые агенты включить отключить выключить сессия терминал GUI TUI графический чат режим вывод возможности умения фичи виджеты widgets графики формы команды IDE MCP`,component:ZS},{id:`agent-roles`,title:`Роли агентов`,group:`Агент`,description:`Служебные роли и пресеты чатов: агент, модель и настройки.`,keywords:`роли agent roles doctor lens judge доктор линза судья модель служебные внутренние вызовы chat роль чата пресет preset`,component:dm},{id:`agent-judge`,title:`Судья Projector`,group:`Агент`,description:`Оценка риска действий и автоматическое разрешение безопасных запросов.`,keywords:`судья judge риск безопасность подтверждение разрешение авто threshold`,component:WS},{id:`agent-memory`,title:`Память агента`,group:`Агент`,description:`Заметки, которые штатный агент помнит между разговорами.`,keywords:`память заметки запомни memory агент Projector инструкции предпочтения`,component:KS},{id:`agent-mcp`,title:`MCP-серверы агента`,group:`Агент`,description:`Внешние серверы с инструментами для штатного агента.`,keywords:`mcp сервер инструменты model context protocol агент Projector stdio http sse`,component:GS},{id:`agent-hooks`,title:`Хуки агента`,group:`Агент`,description:`Команды до и после инструментов агента и после его ответа.`,keywords:`хуки hooks уведомление PreToolUse PostToolUse Stop команда агент Projector`,component:Fv},{id:`agent-web`,title:`Веб-поиск агента`,group:`Агент`,description:`Поисковый сервис, через который штатный агент ищет в интернете.`,keywords:`веб поиск интернет search brave searxng агент Projector ключ`,component:tC},{id:`agent-skills`,title:`Навыки и команды агента`,group:`Агент`,description:`Навыки и слэш-команды, которые находит штатный агент.`,keywords:`навыки skills слэш команды slash prompt SKILL.md агент Projector`,component:eC}],k7=M({__name:`SettingsPanel`,props:{selected:{},embedded:{type:Boolean}},emits:[`select`],setup(e,{emit:t}){let n=e,r=t,i=X(`interface`),a={"agent-integrations":`agents`,"agent-sessions":`agents`,"agent-features":`agents`},o=z(()=>{let e=n.selected??i.value;return a[e]??e});function s(e){i.value=e,r(`select`,e)}let{providers:c,activeProviderId:l,balances:u,revision:d,load:f,loadBalances:p}=q6(),{isEnabled:m,modeOf:h}=pS();Lt(()=>void f()),R(d,()=>void p());let g=z(()=>zte.map(e=>{if(e.id===`providers`)return{...e,props:{providerId:Q6(o.value),onOpen:e=>s(e?Z6(e):`providers`)},items:c.value.map(e=>{let t=u.value[e.id];return{id:Z6(e.id),title:e.name.trim()||`без названия`,hint:e.enabled?t?.status===`ready`?Y6(t.entries):e.id===l.value?`по умолчанию`:void 0:`выкл`,problem:!e.url.trim()||e.enabled&&e.models.length===0}})};if(e.id!==`agents`)return e;let t=qn();return{...e,keywords:`${e.keywords} ${t.map(e=>`${e.title} ${e.backend} ${e.program}`).join(` `)}`,props:{agentId:aP(o.value),onOpen:e=>s(e?iP(e):`agents`)},items:t.map(e=>({id:iP(e.backend),title:e.title,hint:e.builtin?`встроенный`:m(e.program)?h(e.program)===`gui`?`чат`:void 0:`выкл`}))}})),_=e=>({note:`Настройки Projector`,text:vi(`Раздел: ${e.sectionTitle||e.section||`—`}`,e.query?`Поиск: «${e.query}»`:``,`Видимых разделов: ${e.visible}`)});return(t,n)=>(V(),Y(H(mp),{sections:g.value,selected:o.value,embedded:e.embedded,read:_,onSelect:s},null,8,[`sections`,`selected`,`embedded`]))}}),A7={settings:{component:k7,keepAlive:!0,ownKeys:!0,props:()=>({embedded:!0})}},Bte={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Vte(e,t){return V(),q(`svg`,Bte,[...t[0]||=[K(`path`,{fill:`currentColor`,d:`M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12`},null,-1)]])}var j7=U({name:`simple-icons-github`,render:Vte}),M7=class extends Error{status;constructor(e,t){super(e),this.status=t}};async function N7(e,t,n){let r=await fetch(`/api/integrations/github/browse/${e}?${new URLSearchParams(t)}`,{signal:n}),i=await r.json();if(!r.ok)throw new M7(i.error||`Не удалось прочитать GitHub`,r.status);return i}var P7=(e,t=``,n)=>N7(`repository`,{repository:e,ref:t},n),Hte=(e,t,n)=>N7(`tree`,{repository:e,sha:t},n),Ute=(e,t,n,r)=>N7(`file`,{repository:e,sha:t,path:n},r),F7=(e,t,n)=>N7(`issues`,{repository:e,...t},n),I7=(e,t,n)=>N7(`issue`,{repository:e,number:String(t)},n),L7=(e,t,n)=>N7(`pulls`,{repository:e,...t},n),R7=(e,t,n)=>N7(`pull`,{repository:e,number:String(t)},n),z7=(e,t,n)=>N7(`discussions`,{repository:e,...t},n),B7=(e,t,n)=>N7(`discussion`,{repository:e,number:String(t)},n),V7=(e,t,n)=>N7(`pipelines`,{repository:e,...t},n),H7=(e,t,n)=>N7(`pipeline`,{repository:e,id:String(t)},n),U7=(e,t,n)=>N7(`job`,{repository:e,id:String(t)},n),W7=(e,t,n)=>N7(`releases`,{repository:e,...t},n),G7=(e,t,n)=>N7(`release`,{repository:e,tag:t},n),Wte=`Действие недоступно для этого источника workspace`;function K7(e,t={}){return{read(n,r,i){if(n===`pipelines`)return(t.readPipelines??V7)(e,r,i);if(n!==`pipeline`&&n!==`job`)throw Error(Wte);let a=Number(r.id);if(!Number.isSafeInteger(a)||a<=0)throw Error(`Укажите номер записи CI`);return n===`pipeline`?(t.readPipeline??H7)(e,a,i):(t.readJob??U7)(e,a,i)}}}var Gte=`Действие недоступно для этого источника workspace`;function q7(e,t={}){return{read(n,r,i){if(n===`releases`)return(t.readReleases??W7)(e,r,i);if(n!==`release`)throw Error(Gte);let a=(r.tag||``).trim();if(!a)throw Error(`Укажите тег релиза`);return(t.readRelease??G7)(e,a,i)}}}var J7=(e,t)=>cr({id:e,key:({number:t})=>`${e}:${t}`,path:({number:e})=>`${t} #${e}`,title:({number:e,title:n})=>`${n?`${n} · `:``}${t} #${e}`,hint:({title:e})=>e??``,preview:!0}),Y7=J7(`issue`,`Issue`),X7=J7(`pull`,`PR`),Z7=J7(`discussion`,`Discussion`),Q7=J7(`pipeline`,`Pipeline`),$7=J7(`job`,`Job`),e9=cr({id:`release`,key:({tag:e})=>`release:${e}`,path:({tag:e})=>`Release ${e}`,title:({tag:e,title:t})=>`${t?`${t} · `:``}Release ${e}`,hint:({title:e})=>e??``,preview:!0}),t9=Jn(`github-integration`,`github:integration`,`GitHub`,`Подключение к GitHub`);function Kte(e){return{id:`github-connection`,layout:`editor`,tabs:[t9],features:{terminals:!1,docker:!1,agent:!1,settings:!1,persist:!1,externalFiles:!1},providers:{files:{assetUrl:()=>``,async read(t){if(t===`root`)return{root:ec({kind:`github`,repository:e})};if(t===`tree`)return{entries:[],truncated:!1};throw Error(`Подключите GitHub, чтобы открыть файлы`)}}}}}var n9=`Действие недоступно для этого источника workspace`;function r9(e,t,n,r,i,a){return{read(o,s,c){if(o===e)return i(r,s,c);if(o===t){let e=Number(s.number);if(!Number.isInteger(e)||e<=0)throw Error(`Укажите номер ${n}`);return a(r,e,c)}throw Error(n9)}}}function qte(e,t){let n=ir(e),r=r9(`issues`,`issue`,`issue`,t,F7,I7),i=r9(`pulls`,`pull`,`pull request`,t,L7,R7),a=r9(`discussions`,`discussion`,`обсуждения`,t,z7,B7);return{...n,id:`local-github`,sidebar:[...n.sidebar??[],{id:`issues`,title:`Issues`},{id:`pulls`,title:`Pull requests`},{id:`discussions`,title:`Discussions`},{id:`pipelines`,title:`Pipelines`,requires:`pipelines`},{id:`releases`,title:`Releases`,requires:`releases`}],tabs:[...n.tabs??[],Jn(`repository`,`github:repository`,`О репозитории`,`Информация о репозитории GitHub`),Y7,X7,Z7,Q7,$7,e9],providers:{...n.providers,issues:r,pulls:i,discussions:a,pipelines:K7(t),releases:q7(t)}}}function Jte(e,t,n,r,i={readRepository:P7,readTree:Hte,readFile:Ute,readGit:N7,readIssues:F7,readIssue:I7,readPulls:L7,readPull:R7,readDiscussions:z7,readDiscussion:B7,readPipelines:V7,readPipeline:H7,readJob:U7,readReleases:W7,readRelease:G7}){let a=t,o=new Map,s=new Map;function c(t){let n=s.get(t);return n||(n=i.readRepository(e,t),s.set(t,n),n.catch(()=>s.delete(t))),n}async function l(t,n,r){if(t.empty)return[];if(n&&n.split(`/`).some(e=>!e||e===`.`||e===`..`))throw Error(`Неверный путь папки`);let a=`${t.tree}:${n}`,s=o.get(a);if(s)return s;let c=(async()=>{let a=t.tree;if(n){let e=n.split(`/`),i=(await l(t,e.slice(0,-1).join(`/`),r)).find(t=>t.name===e.at(-1));if(i?.type!==`tree`)throw Error(`Папка не найдена`);a=i.sha}let o=await i.readTree(e,a,r);if(o.truncated)throw Error(`GitHub вернул неполный список этой папки`);return o.entries})();o.set(a,c);try{return await c}catch(e){throw o.delete(a),e}}let u={allBranches:!1,async read(t,n,r){let o=a;if(t===`git`)return{available:!0,branch:o.branch,changes:[]};if(t===`gutter`)return{available:!1,original:``};if(![`log`,`commit`,`commit-diff`].includes(t))throw Error(n9);return(i.readGit??N7)(t,{...n,repository:e,sha:o.commit},r)}},d={snapshots:!0,compare:!0,async refresh(){let t=await i.readRepository(e,n);o.clear(),a=t,r(t)},assetUrl(t){return C(`/api/integrations/github/browse/asset?${new URLSearchParams({repository:e,sha:a.tree,path:t})}`)},scopeAssetUrl(t,n){return t.kind===`commit`?C(`/api/integrations/github/browse/asset?${new URLSearchParams({repository:e,commit:t.rev,path:n})}`):``},async read(t,n,r){let o=n.rev?await c(n.rev):a,s=n.path||``;if(t===`root`)return{root:ec({kind:`github`,repository:o.fullName})};if(t===`changes`||t===`compare-file`){let a=t===`changes`?`compare-changes`:`compare-file`;return(i.readGit??N7)(a,{...n,repository:e},r)}if(t===`tree`){let e=(await l(o,s,r)).map(e=>({name:e.name,path:s?`${s}/${e.name}`:e.name,directory:e.type===`tree`,executable:e.mode===`100755`,disabled:e.type===`commit`})),t=bs(e,s,n);return{entries:e.slice(t.offset,t.end),truncated:t.nextOffset!==null,total:t.total,nextOffset:t.nextOffset}}if(t!==`file`)throw Error(n9);if(!s||s.includes(`\\`)||s.includes(`\0`)||s.split(`/`).some(e=>!e||e===`.`||e===`..`))throw Error(`Неверный путь файла`);let u=s.split(`/`),d=(await l(o,u.slice(0,-1).join(`/`),r)).find(e=>e.name===u.at(-1));if(d?.type!==`blob`)throw Error(`Файл не найден`);if(d.size>5242880)throw Error(`Просмотр файлов больше 5 MiB пока недоступен`);let f=await i.readFile(e,d.sha,s,r);return{path:s,content:f.content,binary:f.binary,size:f.size,readonly:!0,image:!!f.image&&!/\.svg$/i.test(s)}}},f=r9(`issues`,`issue`,`issue`,e,i.readIssues??F7,i.readIssue??I7),p=r9(`pulls`,`pull`,`pull request`,e,i.readPulls??L7,i.readPull??R7),m=r9(`discussions`,`discussion`,`обсуждения`,e,i.readDiscussions??z7,i.readDiscussion??B7);return{id:`github`,layout:`editor`,sidebar:[{id:`issues`,title:`Issues`},{id:`pulls`,title:`Pull requests`},{id:`discussions`,title:`Discussions`},{id:`pipelines`,title:`Pipelines`,requires:`pipelines`},{id:`releases`,title:`Releases`,requires:`releases`}],tabs:[t9,Jn(`repository`,`github:repository`,`О репозитории`,`Информация о репозитории GitHub`),Y7,X7,Z7,Q7,$7,e9],features:{terminals:!1,docker:!1,agent:!1,settings:!1,persist:!1,externalFiles:!1},providers:{files:d,git:u,issues:f,pulls:p,discussions:m,pipelines:K7(e,i),releases:q7(e,i)}}}var i9=M({__name:`GithubRepositoryInfo`,props:{repository:{},snapshot:{type:Boolean,default:!0}},setup(e){let t=e,n=z(()=>{let e=t.repository;return{name:e.fullName.split(`/`).at(-1)??e.fullName,namespace:e.owner||e.fullName.split(`/`)[0],fullName:e.fullName,avatarUrl:e.avatarUrl,description:e.description,private:e.private,htmlUrl:e.htmlUrl,hostLabel:`GitHub`,topics:e.topics,stats:[{key:`stars`,label:`Звёзды`,value:e.stars,icon:`star`},{key:`forks`,label:`Форки`,value:e.forks,icon:`fork`},{key:`watchers`,label:`Наблюдатели`,value:e.watchers,icon:`eye`},{key:`issues`,label:`Открытые issues`,value:e.openIssues,icon:`issue`}],details:[{key:`language`,label:`Язык`,value:e.language||`—`},{key:`license`,label:`Лицензия`,value:e.license||`—`},{key:`defaultBranch`,label:`Ветка по умолчанию`,value:e.defaultBranch||`—`},{key:`ref`,label:`Открытый ref`,value:e.empty?`пустой репозиторий`:`${e.branch}${e.commit?` · ${e.commit.slice(0,7)}`:``}`},{key:`created`,label:`Создан`,value:di(e.createdAt)||`—`},{key:`updated`,label:`Обновлён`,value:di(e.updatedAt)||`—`}],homepage:e.homepage||void 0,license:e.license||void 0,refNote:t.snapshot&&!e.empty?{text:`Дерево и история привязаны к снимку`,code:e.tree.slice(0,7)}:void 0,readout:{note:`О репозитории`,text:vi(`Репозиторий ${e.fullName}`,e.description?`Описание: ${e.description}`:`Без описания`,e.language?`Язык: ${e.language}`:``,e.private?`Приватный`:`Публичный`,`Звёзды: ${e.stars}, форки: ${e.forks}, наблюдатели: ${e.watchers}, открытые issues: ${e.openIssues}`,`Ветка по умолчанию: ${e.defaultBranch||`—`}`,e.license?`Лицензия: ${e.license}`:``,e.topics.length?`Темы: ${e.topics.join(`, `)}`:``,`URL: ${e.htmlUrl}`)}}});return(e,t)=>(V(),Y(H(SF),{repository:n.value},null,8,[`repository`]))}}),Yte={key:0,role:`alert`},Xte=M({__name:`GithubWorkspace`,props:{repository:{}},setup(e){let n=e,r=da(),i=ua(),a=e=>i.push(Rc(e)).then(()=>void 0),o=ec({kind:`github`,repository:n.repository}),s=()=>typeof r.query.ref==`string`?r.query.ref:``,{metadata:c,error:l,needsConnection:u,profileReady:d,workspaceVersion:f,workspace:p,loadRepository:m,ready:h}=nF({projectId:o,read:e=>P7(n.repository,s(),e),createProfile:(e,t)=>Jte(n.repository,e,s(),t),createConnectionProfile:()=>Kte(n.repository),isAuthError:e=>e instanceof M7&&e.status===401,errorFallback:`Не удалось открыть репозиторий`,readmeError:`Не удалось прочитать README`,connectionTab:`github-integration`,initialPath:()=>typeof r.query.path==`string`?r.query.path:``}),g=E(`github:${o}`,()=>({surface:`github`,projectId:o,repository:n.repository,readonly:!0,commit:c.value?.commit||null}));g.scope.registerCommand({id:`ide.github.repository.refresh`,title:`Обновить репозиторий GitHub`,description:`Перечитывает GitHub и обновляет общий workspace без клонирования.`,enabled:()=>!!p.value,run:()=>u.value?m():p.value?.refresh()}),g.scope.registerCommand({id:`ide.github.repository.info`,title:`Информация о репозитории GitHub`,description:`Открывает вкладку с описанием, статистикой и метаданными репозитория.`,enabled:()=>!!c.value&&!!p.value,run:()=>p.value?.openTab(`repository`)}),g.scope.registerCommand({id:`ide.github.integration.open`,title:`Настроить подключение GitHub`,description:`Открывает вкладку интеграции GitHub для установки токена.`,enabled:()=>!!p.value,run:()=>p.value?.openTab(`github-integration`)});let _={...A7,"github-integration":{component:H8,ownKeys:!0,keepAlive:!0,props:()=>({repository:n.repository,onConnected:m})},repository:{component:i9,keepAlive:!0,props:()=>({repository:c.value})},pipeline:{component:YX,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,id:e.params?.id,host:`GitHub`,onOpenJob:e=>t.openTab(`job`,e,{preview:!1})})},job:{component:nZ,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,id:e.params?.id,host:`GitHub`})},release:{component:Y3,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,tag:typeof e.params?.tag==`string`?e.params.tag:``,host:`GitHub`})}};return(e,r)=>(V(),q(W,null,[I(H(V8),{repository:n.repository,navigate:a},null,8,[`repository`]),H(d)?(V(),Y(H(M8),{key:H(f),ref:H(h),"project-id":H(o),"tab-views":_},{"terminal-actions":F(()=>[I(Q,{shape:`icon`,size:`sm`,title:H(u)?`Подключить GitHub`:`Информация о репозитории`,"aria-label":H(u)?`Подключить GitHub`:`Информация о репозитории`,"data-command":H(u)?`ide.github.integration.open`:`ide.github.repository.info`,onClick:r[0]||=e=>H(g).run(H(u)?`ide.github.integration.open`:`ide.github.repository.info`)},{default:F(()=>[I(H(j7),{"aria-hidden":`true`})]),_:1},8,[`title`,`aria-label`,`data-command`])]),"terminal-status":F(()=>[H(l)?(V(),q(`span`,Yte,j(H(l)),1)):B(``,!0),H(c)?(V(),Y(t,{key:1,as:`span`,tone:`muted`,size:`xs`,class:`github-status`,title:H(c).commit},{default:F(()=>[N(j(H(c).branch)+` · `+j(H(c).commit.slice(0,7))+` · только чтение`,1)]),_:1},8,[`title`])):B(``,!0)]),_:1},8,[`project-id`])):(V(),Y(t,{key:1,size:`xs`,variant:`padded`,tone:H(l)?`danger`:`muted`,class:`msg`,role:H(l)?`alert`:`status`},{default:F(()=>[N(j(H(l)||`открываю репозиторий…`),1)]),_:1},8,[`tone`,`role`]))],64))}}),a9=M({__name:`UiAsyncContent`,props:{load:{type:Function},watchKeys:{type:Function},errorText:{},loadingText:{}},setup(e){let n=e,r=We(),i=We(``),a=0;async function o(){let e=++a;r.value=void 0,i.value=``;try{let t=await n.load();e===a&&(r.value=t)}catch(t){e===a&&(i.value=t instanceof Error?t.message:n.errorText)}}return R(()=>n.watchKeys(),o,{immediate:!0}),(n,a)=>r.value===void 0?(V(),Y(t,{key:1,size:`xs`,variant:`padded`,tone:i.value?`danger`:`muted`,padding:4,role:i.value?`alert`:`status`},{default:F(()=>[N(j(i.value||e.loadingText),1)]),_:1},8,[`tone`,`role`])):L(n.$slots,`default`,{data:r.value},void 0,void 0,0)}}),Zte=M({__name:`GithubRepositoryInfoLoader`,props:{repository:{},gitRef:{}},setup(e){let t=e,n=async()=>{if(!t.repository)throw Error(`origin проекта не указывает на GitHub`);return P7(t.repository,t.gitRef??``)},r=()=>[t.repository,t.gitRef];return(e,t)=>(V(),Y(a9,{load:n,"watch-keys":r,"error-text":`Не удалось прочитать репозиторий`,"loading-text":`загружаю репозиторий…`},{default:F(({data:e})=>[I(i9,{repository:e,snapshot:!1},null,8,[`repository`])]),_:1}))}});Pr({match:e=>$s(e).kind===`github`,create:()=>{throw Error(`Репозиторий GitHub не открыт`)}});var Qte={class:`project-page`},$te=M({__name:`[...githubPath]`,setup(e){let t=da(),n=z(()=>Ic(t.params.githubPath));return(e,t)=>(V(),q(`section`,Qte,[(V(),Y(H(Xte),{key:n.value,repository:n.value},null,8,[`repository`]))]))}});Pr({match:e=>$s(e).kind===`gitlab`,create:()=>{throw Error(`Проект GitLab не открыт`)}});var ene={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function tne(e,t){return V(),q(`svg`,ene,[...t[0]||=[K(`path`,{fill:`currentColor`,d:`m23.6 9.593l-.033-.086L20.3.98a.85.85 0 0 0-.336-.405a.875.875 0 0 0-1 .054a.9.9 0 0 0-.29.44L16.47 7.818H7.537L5.333 1.07a.86.86 0 0 0-.29-.441a.875.875 0 0 0-1-.054a.86.86 0 0 0-.336.405L.433 9.502l-.032.086a6.066 6.066 0 0 0 2.012 7.01l.01.009l.03.021l4.977 3.727l2.462 1.863l1.5 1.132a1.01 1.01 0 0 0 1.22 0l1.499-1.132l2.461-1.863l5.006-3.75l.013-.01a6.07 6.07 0 0 0 2.01-7.002`},null,-1)]])}var o9=U({name:`simple-icons-gitlab`,render:tne}),s9=class extends Error{status;constructor(e,t){super(e),this.status=t}};async function c9(e,t,n){let r=await fetch(`/api/integrations/gitlab/browse/${e}?${new URLSearchParams(t)}`,{signal:n}),i=await r.json();if(!r.ok)throw new s9(i.error||`Не удалось прочитать GitLab`,r.status);return i}var l9=(e,t=``,n)=>c9(`repository`,{repository:e,ref:t},n),nne=(e,t,n=``,r)=>c9(`tree`,{repository:e,sha:t,path:n},r),rne=(e,t,n,r)=>c9(`file`,{repository:e,sha:t,path:n},r),u9=(e,t,n)=>c9(`search`,{repository:e,...t},n);function d9(e,t,n){return c9(e,t,n)}var f9=(e,t,n)=>c9(`issues`,{repository:e,...t},n),p9=(e,t,n)=>c9(`issue`,{repository:e,number:String(t)},n),m9=(e,t,n)=>c9(`merge-requests`,{repository:e,...t},n),h9=(e,t,n)=>c9(`merge-request`,{repository:e,number:String(t)},n),g9=(e,t,n)=>c9(`merge-request-files`,{repository:e,number:String(t)},n),_9=(e,t,n,r)=>c9(`merge-request-diff`,{repository:e,number:String(t),path:n},r),v9=(e,t,n)=>c9(`pipelines`,{repository:e,...t},n),y9=(e,t,n)=>c9(`pipeline`,{repository:e,id:String(t)},n),b9=(e,t,n)=>c9(`job`,{repository:e,id:String(t)},n),x9=(e,t,n)=>c9(`releases`,{repository:e,...t},n),S9=(e,t,n)=>c9(`release`,{repository:e,tag:t},n),ine=`Действие недоступно для этого источника workspace`;function C9(e,t={}){return{read(n,r,i){if(n===`releases`)return(t.readReleases??x9)(e,r,i);if(n!==`release`)throw Error(ine);let a=(r.tag||``).trim();if(!a)throw Error(`Укажите тег релиза`);return(t.readRelease??S9)(e,a,i)}}}var w9=(e,t)=>cr({id:e,key:({number:t})=>`${e}:${t}`,path:({number:e})=>`${t} #${e}`,title:({number:e,title:n})=>`${n?`${n} · `:``}${t} #${e}`,hint:({title:e})=>e??``,preview:!0}),T9=(e,t)=>cr({id:e,key:({id:t})=>`${e}:${t}`,path:({id:e})=>`${t} #${e}`,title:({id:e,title:n})=>`${n?`${n} · `:``}${t} #${e}`,hint:({title:e})=>e??``,preview:!0}),E9=w9(`issue`,`Issue`),D9=w9(`pull`,`MR`),O9=T9(`pipeline`,`Pipeline`),k9=T9(`job`,`Job`),A9=cr({id:`release`,key:({tag:e})=>`release:${e}`,path:({tag:e})=>`Release ${e}`,title:({tag:e,title:t})=>`${t?`${t} · `:``}Release ${e}`,hint:({title:e})=>e??``,preview:!0}),j9=Jn(`gitlab-integration`,`gitlab:integration`,`GitLab`,`Подключение к GitLab`);function ane(e,t){return{id:`gitlab-connection`,layout:`editor`,tabs:[j9],features:{terminals:!1,docker:!1,agent:!1,settings:!1,persist:!1,externalFiles:!1},providers:{files:{assetUrl:()=>``,async read(n){if(n===`root`)return{root:ec({kind:`gitlab`,instance:e,path:t})};if(n===`tree`)return{entries:[],truncated:!1};throw Error(`Подключите GitLab, чтобы открыть файлы`)}}}}}var M9=`Действие недоступно для этого источника workspace`,N9=Jn(`repository`,`gitlab:repository`,`О проекте`,`Информация о проекте GitLab`);function P9(e,t,n,r,i,a){return{read(o,s,c){if(o===e)return i(r,s,c);if(o===t){let e=Number(s.number);if(!Number.isInteger(e)||e<=0)throw Error(`Укажите номер ${n}`);return a(r,e,c)}throw Error(M9)}}}function F9(e,t=I9){let n=P9(`pulls`,`pull`,`merge request`,e,t.readMergeRequests??m9,t.readMergeRequest??h9);return{read(r,i,a){if(r!==`pull-files`&&r!==`pull-diff`)return n.read(r,i,a);let o=Number(i.number);if(!Number.isInteger(o)||o<=0)throw Error(`Укажите номер merge request`);if(r===`pull-files`)return(t.readMergeRequestFiles??g9)(e,o,a);let s=i.path||``;if(!s)throw Error(`Укажите путь файла merge request`);return(t.readMergeRequestDiff??_9)(e,o,s,a)}}}var I9={readRepository:l9,readTree:nne,readFile:rne,readGit:d9,readIssues:f9,readIssue:p9,readMergeRequests:m9,readMergeRequest:h9,readMergeRequestFiles:g9,readMergeRequestDiff:_9,readPipelines:v9,readPipeline:y9,readJob:b9,readReleases:x9,readRelease:S9,searchSnapshots:u9};function L9(e,t=I9){return{read(n,r,i){if(n===`pipelines`)return(t.readPipelines??v9)(e,r,i);if(n!==`pipeline`&&n!==`job`)throw Error(M9);let a=Number(r.id);if(!Number.isSafeInteger(a)||a<=0)throw Error(`Укажите номер записи CI`);return n===`pipeline`?(t.readPipeline??y9)(e,a,i):(t.readJob??b9)(e,a,i)}}}function one(e,t,n){let r=`${t}/${n}`,i=ir(e),a=P9(`issues`,`issue`,`issue`,r,f9,p9),o=F9(r);return{...i,id:`local-gitlab`,sidebar:[...i.sidebar??[],{id:`issues`,title:`Issues`},{id:`merge-requests`,title:`Merge requests`},{id:`pipelines`,title:`Pipelines`,requires:`pipelines`},{id:`releases`,title:`Releases`,requires:`releases`}],tabs:[...i.tabs??[],N9,E9,D9,O9,k9,A9],providers:{...i.providers,issues:a,pulls:o,pipelines:L9(r),releases:C9(r)}}}function sne(e,t,n,r,i,a,o=I9){let s=r,c=new Map;async function l(t,n,r){if(!t)return[];if(n&&n.split(`/`).some(e=>!e||e===`.`||e===`..`))throw Error(`Неверный путь папки`);let i=`${t}:${n}`,a=c.get(i);if(a)return a;let s=(async()=>{let i=await o.readTree(e,t,n,r);if(i.truncated)throw Error(`GitLab вернул неполный список этой папки`);return i.entries})();c.set(i,s);try{return await s}catch(e){throw c.delete(i),e}}let u={allBranches:!1,async read(t,n,r){let i=s;if(t===`git`)return{available:!0,branch:i.branch,changes:[]};if(t===`gutter`)return{available:!1,original:``};if(![`log`,`commit`,`commit-diff`].includes(t))throw Error(M9);return(o.readGit??d9)(t,{...n,repository:e,sha:i.commit},r)}},d={snapshots:!0,compare:!0,async refresh(){let t=await o.readRepository(e,i);c.clear(),s=t,a(t)},assetUrl(t){return C(`/api/integrations/gitlab/browse/asset?${new URLSearchParams({repository:e,sha:s.commit,path:t})}`)},scopeAssetUrl(t,n){return t.kind===`commit`?C(`/api/integrations/gitlab/browse/asset?${new URLSearchParams({repository:e,sha:t.rev,path:n})}`):``},async read(r,i,a){let c=s,u=i.rev||c.commit,d=i.path||``;if(r===`root`)return{root:ec({kind:`gitlab`,instance:t,path:n})};if(r===`changes`||r===`compare-file`){let t=r===`changes`?`compare-changes`:`compare-file`;return(o.readGit??d9)(t,{...i,repository:e},a)}if(r===`tree`){let e=(await l(u,d,a)).map(e=>({name:e.name,path:d?`${d}/${e.name}`:e.name,directory:e.type===`tree`,executable:e.mode===`100755`,disabled:e.type===`commit`})),t=bs(e,d,i);return{entries:e.slice(t.offset,t.end),truncated:t.nextOffset!==null,total:t.total,nextOffset:t.nextOffset}}if(r!==`file`)throw Error(M9);if(!d||d.includes(`\\`)||d.includes(`\0`)||d.split(`/`).some(e=>!e||e===`.`||e===`..`))throw Error(`Неверный путь файла`);let f=await o.readFile(e,u,d,a);return{path:d,content:f.content,binary:f.binary,size:f.size,readonly:!0,image:!!f.image&&!/\.svg$/i.test(d)}}},f=P9(`issues`,`issue`,`issue`,e,o.readIssues??f9,o.readIssue??p9),p=F9(e,o);return{id:`gitlab`,layout:`editor`,sidebar:[{id:`issues`,title:`Issues`},{id:`merge-requests`,title:`Merge requests`},{id:`pipelines`,title:`Pipelines`,requires:`pipelines`},{id:`releases`,title:`Releases`,requires:`releases`}],tabs:[j9,N9,E9,D9,O9,k9,A9],features:{terminals:!1,docker:!1,agent:!1,settings:!1,persist:!1,externalFiles:!1},providers:{files:d,git:u,search:{read(t,n,r){if(t!==`search`)throw Error(M9);return(o.searchSnapshots??u9)(e,n,r)}},issues:f,pulls:p,pipelines:L9(e,o),releases:C9(e,o)}}}var cne=M({__name:`GitlabClone`,props:{repository:{},path:{},navigate:{type:Function}},setup(e){let t=e,n=z(()=>t.repository.endsWith(`/${t.path}`)?t.repository.slice(0,t.repository.length-t.path.length-1):t.repository),r=z(()=>ec({kind:`gitlab`,instance:n.value,path:t.path}));return(t,n)=>(V(),Y(H(ZP),{source:`gitlab`,repository:e.repository,"destination-name":e.path,"project-id":r.value,navigate:e.navigate},null,8,[`repository`,`destination-name`,`project-id`,`navigate`]))}}),lne=G(M({__name:`GitlabConnection`,props:{instance:{},path:{}},emits:[`connected`],setup(e,{emit:t}){let n=e,r=t,i=z(()=>ec({kind:`gitlab`,instance:n.instance,path:n.path})),a=z(()=>`https://${n.instance}/-/user_settings/personal_access_tokens`);async function o(e){let t=e.trim();if(!t)throw Error(`Укажите токен GitLab`);let n=(await NP()).integrations.find(e=>e.id===`gitlab`);if(!n)throw Error(`Интеграция GitLab не найдена`);n.enabled||await MP(`/gitlab`,`PUT`,{...n.settings,enabled:!0}),await MP(`/gitlab/auth`,`POST`,{token:t})}return(t,n)=>(V(),Y(H(EF),{host:`GitLab`,"subject-label":`Проект`,subject:`${e.instance}/${e.path}`,"project-id":i.value,"scope-key":`gitlab-connection:${i.value}`,surface:`gitlab-integration`,placeholder:`glpat-…`,"token-url":a.value,"command-id":`ide.gitlab.integration.connect`,"command-description":`Подключает GitLab по Personal Access Token (scope read_api и read_repository), введённому в форме, и открывает проект.`,"readout-note":`Подключение к GitLab`,intro:`Установите Personal Access Token, чтобы открыть проект.`,connect:o,onConnected:n[0]||=e=>r(`connected`)},{hint:F(()=>[...n[1]||=[K(`p`,{class:`scopes`},[N(` Нужны права `),K(`code`,null,`read_api`),N(` и `),K(`code`,null,`read_repository`),N(`. Токен хранится только в настройках Projector на этой машине. `)],-1)]]),_:1},8,[`subject`,`project-id`,`scope-key`,`token-url`]))}}),[[`__scopeId`,`data-v-d0d4add8`]]),R9=M({__name:`GitlabRepositoryInfo`,props:{repository:{}},setup(e){let t=e,n=z(()=>Object.entries(t.repository.languages??{}).sort(([,e],[,t])=>(t??0)-(e??0)).map(([e])=>e)),r=z(()=>{let e=t.repository,r=e.fullName.split(`/`).at(-1)??e.fullName,i=e.empty?`Проект без коммитов`:e.branch||`ветка не выбрана`;return{name:r,namespace:e.fullName.split(`/`).slice(0,-1).join(`/`),fullName:e.fullName,avatarUrl:e.avatarUrl,description:e.description,private:e.private,visibility:e.visibility||(e.private?`приватный`:`публичный`),archived:e.archived,empty:e.empty,htmlUrl:e.webUrl,hostLabel:`GitLab`,topics:e.topics,stats:[{key:`stars`,label:`Звёзды`,value:e.stars,icon:`star`},{key:`forks`,label:`Форки`,value:e.forks,icon:`fork`},{key:`issues`,label:`Открытые issues`,value:e.openIssues,icon:`issue`},{key:`mergeRequests`,label:`Открытые MR`,value:e.openMergeRequests,icon:`merge`}],details:[{key:`languages`,label:`Языки`,value:n.value.length?n.value.slice(0,4).join(`, `):`—`},{key:`license`,label:`Лицензия`,value:e.license||`—`},{key:`defaultBranch`,label:`Ветка по умолчанию`,value:e.defaultBranch||`—`},{key:`ref`,label:`Открытая ветка`,value:e.empty?`пустой проект`:`${e.branch}${e.commit?` · ${e.commit.slice(0,7)}`:``}`},{key:`created`,label:`Создан`,value:di(e.createdAt)||`—`},{key:`updated`,label:`Обновлён`,value:di(e.updatedAt)||`—`}],license:e.license||void 0,refNote:e.empty?{text:`${i}.`}:{text:`Дерево и история привязаны к снимку`,code:e.commit.slice(0,7),suffix:`, ветка ${i}.`},readout:{note:`О проекте`,text:vi(`Проект ${e.fullName}`,e.description?`Описание: ${e.description}`:`Без описания`,n.value.length?`Языки: ${n.value.join(`, `)}`:``,e.visibility?`Видимость: ${e.visibility}`:``,`Звёзды: ${e.stars}, форки: ${e.forks}, открытые issues: ${e.openIssues}, открытые MR: ${e.openMergeRequests}`,`Ветка по умолчанию: ${e.defaultBranch||`—`}`,e.license?`Лицензия: ${e.license}`:``,e.topics.length?`Темы: ${e.topics.join(`, `)}`:``,`URL: ${e.webUrl}`)}}});return(e,t)=>(V(),Y(H(SF),{repository:r.value},null,8,[`repository`]))}}),une={key:0,role:`alert`},dne=M({__name:`GitlabWorkspace`,props:{instance:{},path:{}},setup(e){let n=e,r=da(),i=ua(),a=e=>i.push(Rc(e)).then(()=>void 0),o=`${n.instance}/${n.path}`,s=ec({kind:`gitlab`,instance:n.instance,path:n.path}),c=()=>typeof r.query.ref==`string`?r.query.ref:``,{metadata:l,error:u,needsConnection:d,profileReady:f,workspaceVersion:p,workspace:m,loadRepository:h,ready:g}=nF({projectId:s,read:e=>l9(o,c(),e),createProfile:(e,t)=>sne(o,n.instance,n.path,e,c(),t),createConnectionProfile:()=>ane(n.instance,n.path),isAuthError:e=>e instanceof s9&&(e.status===401||e.status===403),errorFallback:`Не удалось открыть проект GitLab`,readmeError:`Не удалось прочитать README`,connectionTab:`gitlab-integration`,initialPath:()=>typeof r.query.path==`string`?r.query.path:``}),_=E(`gitlab:${s}`,()=>({surface:`gitlab`,projectId:s,repository:o,readonly:!0,commit:l.value?.commit||null}));_.scope.registerCommand({id:`ide.gitlab.repository.refresh`,title:`Обновить проект GitLab`,description:`Перечитывает GitLab и обновляет общий workspace без клонирования.`,enabled:()=>!!m.value,run:()=>d.value?h():m.value?.refresh()}),_.scope.registerCommand({id:`ide.gitlab.repository.info`,title:`Информация о проекте GitLab`,description:`Открывает вкладку с описанием, статистикой и метаданными проекта GitLab.`,enabled:()=>!!l.value&&!!m.value,run:()=>m.value?.openTab(`repository`)}),_.scope.registerCommand({id:`ide.gitlab.integration.open`,title:`Настроить подключение GitLab`,description:`Открывает вкладку интеграции GitLab для установки токена.`,enabled:()=>!!m.value,run:()=>m.value?.openTab(`gitlab-integration`)});let v={...A7,"gitlab-integration":{component:lne,ownKeys:!0,keepAlive:!0,props:()=>({instance:n.instance,path:n.path,onConnected:h})},repository:{component:R9,keepAlive:!0,props:()=>({repository:l.value})},issue:{component:K3,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,number:e.params?.number,host:`GitLab`,onOpen:t.openFile})},pull:{component:q3,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,number:e.params?.number,host:`GitLab`,short:`MR`,noun:`merge request`,onOpen:t.openFile,onOpenSection:t.openSection,onOpenPullFile:t.openPullFile,onOpenJob:e=>t.openTab(`job`,e,{preview:!1}),onOpenPipeline:e=>t.openTab(`pipeline`,e,{preview:!1})})},pipeline:{component:YX,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,id:e.params?.id,host:`GitLab`,onOpenJob:e=>t.openTab(`job`,e,{preview:!1})})},job:{component:nZ,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,id:e.params?.id,host:`GitLab`})},release:{component:Y3,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,tag:typeof e.params?.tag==`string`?e.params.tag:``,host:`GitLab`})}};return(e,r)=>(V(),q(W,null,[I(cne,{repository:o,path:n.path,navigate:a},null,8,[`path`]),H(f)?(V(),Y(H(M8),{key:H(p),ref:H(g),"project-id":H(s),"tab-views":v},{"terminal-actions":F(()=>[I(Q,{shape:`icon`,size:`sm`,title:H(d)?`Подключить GitLab`:`Информация о проекте`,"aria-label":H(d)?`Подключить GitLab`:`Информация о проекте`,"data-command":H(d)?`ide.gitlab.integration.open`:`ide.gitlab.repository.info`,onClick:r[0]||=e=>H(_).run(H(d)?`ide.gitlab.integration.open`:`ide.gitlab.repository.info`)},{default:F(()=>[I(H(o9),{"aria-hidden":`true`})]),_:1},8,[`title`,`aria-label`,`data-command`])]),"terminal-status":F(()=>[H(u)?(V(),q(`span`,une,j(H(u)),1)):B(``,!0),H(l)?(V(),Y(t,{key:1,as:`span`,tone:`muted`,size:`xs`,class:`gitlab-status`,title:H(l).commit},{default:F(()=>[N(j(H(l).branch)+` · `+j(H(l).commit.slice(0,7))+` · только чтение`,1)]),_:1},8,[`title`])):B(``,!0)]),_:1},8,[`project-id`])):(V(),Y(t,{key:1,size:`xs`,variant:`padded`,tone:H(u)?`danger`:`muted`,class:`msg`,role:H(u)?`alert`:`status`},{default:F(()=>[N(j(H(u)||`открываю проект…`),1)]),_:1},8,[`tone`,`role`]))],64))}}),fne={key:0,class:`project-page`},pne={key:1,class:`project-page gitlab-page`},mne={class:`reference`},hne={class:`status`},gne={class:`status-text`},_ne=G(M({__name:`GitlabWorkspaceGate`,props:{rawPath:{}},emits:[`settings`],setup(e,{emit:n}){let r=e,i=n,a=z(()=>Lc(r.rawPath)),o=z(()=>{try{let e=Gs(a.value.instance);return{instance:e,path:Js(a.value.path,e),error:``}}catch(e){return{instance:a.value.instance,path:a.value.path,error:e instanceof Error?e.message:`Некорректная ссылка GitLab`}}}),s=z(()=>`gl:/${o.value.instance}/${o.value.path}`),c=X(null),u=X(!0),d=X(``);function f(e){if(!e)return``;try{let t=new URL(e);return![`http:`,`https:`].includes(t.protocol)||t.username||t.password||t.search||t.hash?``:t.host.toLowerCase()}catch{try{return Gs(e)}catch{return``}}}let p=z(()=>f(c.value?.settings.url)),m=z(()=>!o.value.error&&(o.value.instance===`gitlab.com`||!!p.value&&o.value.instance===p.value)),h=z(()=>!o.value.error&&(o.value.instance===`gitlab.com`||!u.value&&!d.value&&m.value)),g=z(()=>`${o.value.instance}/${o.value.path}`),v=z(()=>u.value?{tone:`neutral`,label:`проверка`,text:`Проверяем настройки интеграции GitLab…`}:d.value?{tone:`danger`,label:`ошибка`,text:d.value}:c.value?c.value.enabled?c.value.connected?{tone:`info`,label:`подключено`,text:c.value.account?`Вход выполнен как ${c.value.account}.`:`Токен GitLab сохранён.`}:{tone:`neutral`,label:`без входа`,text:`Публичные проекты gitlab.com доступны без входа; для приватных проектов подключите GitLab.`}:{tone:`warning`,label:`отключён`,text:`Интеграция GitLab отключена в настройках.`}:{tone:`warning`,label:`не настроен`,text:`GitLab не настроен. Публичные проекты gitlab.com доступны без входа.`});async function y(){u.value=!0,d.value=``;try{let e=await NP();c.value=e.integrations.find(e=>e.id===`gitlab`)??null}catch(e){c.value=null,d.value=e instanceof Error?e.message:`Не удалось прочитать интеграции`}finally{u.value=!1}}return R(()=>r.rawPath,y,{immediate:!0}),(e,n)=>h.value?(V(),q(`section`,fne,[(V(),Y(dne,{key:g.value,instance:o.value.instance,path:o.value.path},null,8,[`instance`,`path`]))])):(V(),q(`section`,pne,[I(l,{class:`gitlab-card`},{default:F(()=>[I(ml,{gap:3,align:`start`},{default:F(()=>[I(ml,{gap:1,align:`start`},{default:F(()=>[I(_,{as:`h1`,"space-after":0},{default:F(()=>[...n[1]||=[N(`Проект GitLab`,-1)]]),_:1}),K(`code`,mne,j(s.value),1)]),_:1}),o.value.error?(V(),Y(t,{key:0,tone:`danger`,variant:`padded`,flush:``,role:`alert`},{default:F(()=>[N(j(o.value.error),1)]),_:1})):(V(),q(W,{key:1},[K(`div`,hne,[I(hl,{tone:v.value.tone},{default:F(()=>[N(j(v.value.label),1)]),_:1},8,[`tone`]),K(`span`,gne,j(v.value.text),1)]),m.value?B(``,!0):(V(),Y(t,{key:0,tone:`danger`,variant:`padded`,flush:``,role:`alert`},{default:F(()=>[N(` Инстанс `+j(o.value.instance)+` не разрешён. Укажите его адрес в настройках GitLab или откройте проект на `+j(H(Rs))+`. `,1)]),_:1}))],64)),I(Q,{size:`sm`,onClick:n[0]||=e=>i(`settings`)},{default:F(()=>[...n[2]||=[N(`Настроить GitLab`,-1)]]),_:1})]),_:1})]),_:1})]))}}),[[`__scopeId`,`data-v-70985646`]]),vne=M({__name:`GitlabRepositoryInfoLoader`,props:{instance:{},path:{},gitRef:{}},setup(e){let t=e,n=async()=>{if(!t.instance||!t.path)throw Error(`origin проекта не указывает на GitLab`);return l9(`${t.instance}/${t.path}`,t.gitRef??``)},r=()=>[t.instance,t.path,t.gitRef];return(e,t)=>(V(),Y(a9,{load:n,"watch-keys":r,"error-text":`Не удалось прочитать проект`,"loading-text":`загружаю проект…`},{default:F(({data:e})=>[I(R9,{repository:e},null,8,[`repository`])]),_:1}))}}),yne=M({__name:`[...gitlabPath]`,setup(e){let t=da(),n=ua(),r=()=>void n.push({path:`/settings`,query:{section:`gitlab`}});return(e,n)=>(V(),Y(H(_ne),{"raw-path":H(t).params.gitlabPath,onSettings:r},null,8,[`raw-path`]))}});async function z9(e,t,n){let r=await fetch(`/api/projects/${encodeURIComponent(e)}/devcontainer`,{method:t,headers:{"Content-Type":`application/json`},body:n===void 0?void 0:JSON.stringify(n)}),i=await r.json();if(!r.ok)throw Error(i.error||`Ошибка Dev Container`);return i}var bne=e=>z9(e,`GET`),xne=(e,t,n)=>z9(e,`POST`,{decision:t,hash:n});async function Sne(e){let t=await fetch(`/api/projects/${encodeURIComponent(e)}/devcontainer-stop`,{method:`POST`}),n=await t.json();if(!t.ok)throw Error(n.error||`Не удалось остановить Dev Container`);return n}function Cne(e){let t=X(),n=X(``),r=X(!1),i=X(!1),a=!1,o=E(`devcontainer:${e}`,()=>({surface:`devcontainer`,projectId:e,found:t.value?.found??!1,decision:t.value?.decision??null}));async function s(){try{let r=await bne(e);return a||(t.value=r,n.value=``),r}catch(e){throw a||(n.value=e instanceof Error?e.message:`Ошибка Dev Container`),e}}async function c(a){if(!r.value){r.value=!0;try{t.value=await xne(e,a,t.value?.hash),n.value=``,i.value=!1}catch(e){n.value=e instanceof Error?e.message:`Ошибка Dev Container`,await s().catch(()=>void 0)}finally{r.value=!1}}}return o.scope.registerCommand({id:`ide.devcontainer.status`,title:`Состояние Dev Container`,description:`Возвращает найденный devcontainer.json, запрашиваемые им полномочия (findings), решение о доверии и признак устаревшего решения. Доверие может выдать только пользователь в окне.`,run:s}),o.scope.registerCommand({id:`ide.devcontainer.review`,title:`Проверить доверие к Dev Container`,description:`Открывает окно с полномочиями из devcontainer.json, где пользователь сам решает, доверять ли репозиторию. Решение не принимается автоматически.`,enabled:()=>!!t.value?.found,run:async()=>{await s(),i.value=!0}}),o.scope.registerCommand({id:`ide.devcontainer.stop`,title:`Остановить и удалить Dev Container`,description:`Удаляет контейнер проекта: завершаются его терминалы и процессы внутри. Файлы проекта сохраняются, следующий терминал соберёт контейнер заново. confirm=true подтверждает удаление.`,arguments:{confirm:`true — явное подтверждение удаления`},enabled:()=>t.value?.active===!0,run:async t=>{if(t?.confirm===!0||window.confirm(`Удалить Dev Container? Его терминалы завершатся.`))return Sne(e)}}),Lt(async()=>{(await s().catch(()=>void 0))?.needsDecision&&(i.value=!0)}),lt(()=>{a=!0}),{state:t,error:n,busy:r,open:i,decide:c,refresh:s,visible:z(()=>i.value&&!!t.value?.found)}}var wne={key:1},Tne={class:`findings`},Ene={class:`risk`},Dne=G(M({__name:`DevcontainerTrust`,props:{projectId:{}},setup(e){let n=Cne(e.projectId),i=X(),a=P(),o={host:`на вашем компьютере`,root:`от root при сборке`,container:`в контейнере`};return R(()=>n.visible.value,async e=>{await Ut(),e&&i.value&&!i.value.element?.open&&i.value.open(),e||i.value?.close()},{immediate:!0}),(e,s)=>H(n).visible.value&&H(n).state.value?(V(),Y(Kr,{key:0,ref_key:`dialog`,ref:i,class:`trust`,width:`560px`,labelledby:H(a),onCancel:s[2]||=Z(e=>H(n).open.value=!1,[`prevent`]),onClose:s[3]||=e=>H(n).open.value=!1},{default:F(()=>[I(_,{id:H(a)},{default:F(()=>[...s[4]||=[N(`Доверять этому репозиторию?`,-1)]]),_:1},8,[`id`]),K(`p`,null,[s[5]||=N(` Проект содержит `,-1),K(`code`,null,j(H(n).state.value.configPath),1),H(n).state.value.name?(V(),q(W,{key:0},[N(` (`+j(H(n).state.value.name)+`)`,1)],64)):B(``,!0),s[6]||=N(`. Он просит возможности, которых нет в изолированном режиме Projector. `,-1),H(n).state.value.stale?(V(),q(`strong`,wne,`Конфигурация изменилась после вашего прошлого решения.`)):B(``,!0)]),K(`ul`,Tne,[(V(!0),q(W,null,J(H(n).state.value.findings,e=>(V(),q(`li`,{key:e.id,class:O(e.risk)},[I(r,{class:`head`,align:`normal`,justify:`between`,gap:3},{default:F(()=>[K(`strong`,null,j(e.title),1),K(`span`,Ene,j(o[e.risk]),1)]),_:2},1024),K(`p`,null,j(e.detail),1),K(`code`,null,j(e.keys.join(`, `)),1)],2))),128))]),s[9]||=K(`p`,{class:`muted`},[K(`strong`,null,`Не доверять`),N(` — проект продолжит работать в нашей модели (ограниченный Docker или хост). `),K(`strong`,null,`Доверять`),N(` — терминалы откроются в Dev Container по этому конфигу, со всеми перечисленными правами. Если файлы конфигурации изменятся, решение сбросится. Уже открытые терминалы не переключаются. `)],-1),H(n).error.value?(V(),Y(t,{key:0,tone:`danger`,role:`alert`},{default:F(()=>[N(j(H(n).error.value),1)]),_:1})):B(``,!0),I(xd,null,{default:F(()=>[I(Q,{autofocus:``,disabled:H(n).busy.value,onClick:s[0]||=e=>H(n).decide(`declined`)},{default:F(()=>[...s[7]||=[N(`Не доверять`,-1)]]),_:1},8,[`disabled`]),I(Q,{tone:`danger`,disabled:H(n).busy.value,onClick:s[1]||=e=>H(n).decide(`trusted`)},{default:F(()=>[...s[8]||=[N(`Доверять и использовать Dev Container`,-1)]]),_:1},8,[`disabled`])]),_:1})]),_:1},8,[`labelledby`])):B(``,!0)}}),[[`__scopeId`,`data-v-1a9dc24e`]]),One={key:0,class:`project-page`},kne={key:1,class:`project-page`},Ane={key:2,class:`project-page`},jne={key:3,class:`not-found project-page`},Mne=G(M({__name:`[...projectPath]`,setup(e){let n=da(),r=ua(),{projects:i,openPath:a}=Oc(),{error:o}=ll(),{api:s}=Iu(),c=X(),l=X(!1),u=X(null),d=X(null),f=z(()=>{let e=d.value,t=u.value;return{...A7,...e?{pull:{component:q3,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,number:e.params?.number,host:`GitLab`,short:`MR`,noun:`merge request`,onOpen:t.openFile,onOpenSection:t.openSection,onOpenPullFile:t.openPullFile,onOpenJob:e=>t.openTab(`job`,e,{preview:!1}),onOpenPipeline:e=>t.openTab(`pipeline`,e,{preview:!1})})},pipeline:{component:YX,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,id:e.params?.id,host:`GitLab`,onOpenJob:(e,n)=>t.openTab(`job`,e,{preview:!n})})},job:{component:nZ,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,id:e.params?.id,host:`GitLab`})}}:t?{pipeline:{component:YX,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,id:e.params?.id,host:`GitHub`,onOpenJob:(e,n)=>t.openTab(`job`,e,{preview:!n})})},job:{component:nZ,keepAlive:!0,props:(e,t)=>({projectId:t.projectId,id:e.params?.id,host:`GitHub`})}}:{},repository:e?{component:vne,keepAlive:!0,props:()=>({instance:e.instance,path:e.path})}:{component:Zte,keepAlive:!0,props:()=>({repository:t??``})},project:{keepAlive:!0,ownKeys:!0,component:()=>S.value&&Ye(Bg,{ref:c,project:S.value,onDirty:e=>l.value=e,afterRemove:()=>r.push(`/`)})}}}),p=X(``),m=X(),h=E(`project:github`,()=>({surface:`project`,projectId:p.value||null,repository:u.value??null}));h.scope.registerCommand({id:`ide.github.repository.info`,title:`Информация о репозитории GitHub`,description:`Открывает вкладку с описанием, статистикой и метаданными репозитория GitHub проекта.`,enabled:()=>!!u.value&&!!m.value,run:()=>m.value?.openTab(`repository`)});let g=E(`project:gitlab`,()=>({surface:`project`,projectId:p.value||null,instance:d.value?.instance??null,path:d.value?.path??null}));g.scope.registerCommand({id:`ide.gitlab.repository.info`,title:`Информация о проекте GitLab`,description:`Открывает вкладку с описанием, статистикой и метаданными проекта GitLab локального проекта.`,enabled:()=>!!d.value&&!!m.value,run:()=>m.value?.openTab(`repository`)});let _=``;function v(e){if(m.value=e,!m.value||!_||_!==p.value)return;let t=_;_=``;let n=IS(t);!n.draft.value.trim()&&!n.turns.value.length&&(n.draft.value=Nb),m.value.openTab(`agent`)}let y=X(!1),b=X(!1),x=X(``),S=z(()=>i.value.find(e=>e.id===p.value));Gg(()=>S.value,()=>l.value);let C=X(0);function w(e){let t=Rc(e.path);n.path===t?C.value++:r.replace(t)}return R(()=>[Fc(n.params.projectPath),C.value],async([e],t,i)=>{let o=!0,s;i(()=>{o=!1,s?.()}),p.value=``,u.value=null,d.value=null,y.value=!1,x.value=``,b.value=!0;try{let{project:t,missing:i,created:c}=await a(e),[l,f]=i||t.environment?[null,null]:await Promise.all([mc(t.id).then(e=>e.repository,()=>null),hc(t.id).then(e=>e.repository,()=>null)]);if(o){u.value=l,d.value=f,s=f?Hr(t.id,one(t.id,f.instance,f.path)):l?Hr(t.id,qte(t.id,l)):void 0,p.value=t.id,_=c&&!i?t.id:``,y.value=i;let e=Rc(t.path);n.path!==e&&await r.replace(e)}}catch(e){o&&(x.value=e instanceof Error?e.message:`Не удалось открыть проект`)}finally{o&&(b.value=!1)}},{immediate:!0}),(e,n)=>S.value&&y.value?(V(),q(`section`,One,[(V(),Y(H(i_),{key:S.value.id,project:S.value,onRestored:w,onRemoved:n[0]||=e=>H(r).push(`/`)},null,8,[`project`]))])):S.value?(V(),q(`section`,kne,[(V(),Y(H(Dne),{key:`${S.value.id}:${S.value.path}`,"project-id":S.value.id},null,8,[`project-id`])),(V(),Y(H(M8),{ref:v,key:`${S.value.id}:${S.value.path}`,"project-id":S.value.id,"project-settings-dirty":l.value,"before-close-project-settings":()=>c.value?.canLeave()??!0,"save-project-settings":()=>c.value?.save(),"tab-views":f.value},{"terminal-actions":F(()=>[I(H(b_),{project:S.value},null,8,[`project`]),I(Q,{shape:`icon`,size:`sm`,title:`Настройки проекта`,"aria-label":`Настройки проекта`,"data-command":`ide.workbench.project.settings.open`,onClick:n[1]||=e=>H(s).executeCommand(`ide.workbench.project.settings.open`,void 0,{scope:`editor:${S.value.id}`})},{default:F(()=>[I(H(zj),{"aria-hidden":`true`})]),_:1}),d.value?(V(),Y(Q,{key:0,shape:`icon`,size:`sm`,title:`Информация о проекте GitLab`,"aria-label":`Информация о проекте GitLab`,"data-command":`ide.gitlab.repository.info`,onClick:n[2]||=e=>H(g).run(`ide.gitlab.repository.info`)},{default:F(()=>[I(H(o9),{"aria-hidden":`true`})]),_:1})):u.value?(V(),Y(Q,{key:1,shape:`icon`,size:`sm`,title:`Информация о репозитории`,"aria-label":`Информация о репозитории`,"data-command":`ide.github.repository.info`,onClick:n[3]||=e=>H(h).run(`ide.github.repository.info`)},{default:F(()=>[I(H(j7),{"aria-hidden":`true`})]),_:1})):B(``,!0)]),"terminal-status":F(()=>[H(o)?(V(),Y(t,{key:0,size:`xs`,variant:`padded`,tone:`danger`,flush:``,class:`msg`,role:`alert`},{default:F(()=>[N(j(H(o)),1)]),_:1})):B(``,!0)]),_:1},8,[`project-id`,`project-settings-dirty`,`before-close-project-settings`,`save-project-settings`,`tab-views`]))])):b.value?(V(),q(`section`,Ane,[I(H(Yc))])):(V(),q(`section`,jne,[I(t,{size:`xs`,variant:`padded`,tone:`danger`,flush:``,class:`msg`,role:x.value?`alert`:void 0},{default:F(()=>[N(j(x.value||`проект не найден`),1)]),_:1},8,[`role`]),I(Q,{size:`sm`,onClick:n[4]||=e=>H(r).push(`/`)},{default:F(()=>[...n[5]||=[N(`К списку проектов`,-1)]]),_:1})]))}}),[[`__scopeId`,`data-v-8d1539ac`]]),Nne=M({__name:`settings`,setup(e){let t=da(),n=ua(),r=z(()=>typeof t.query.section==`string`?t.query.section:`interface`);function i(e){return n.push({query:{...t.query,section:e}})}return(e,t)=>(V(),Y(H(k7),{selected:r.value,onSelect:i},null,8,[`selected`]))}}),Pne={class:`launcher-heading`},Fne={key:0,class:`scope-chip`},Ine={key:1,class:`activity`,"aria-hidden":`true`},Lne=[`aria-busy`],Rne={key:0,class:`section-title`,role:`presentation`},zne=[`src`],Bne={class:`result-copy`},Vne={class:`name`},Hne={key:0,class:`star`,title:`В избранном`,"aria-hidden":`true`},Une={class:`description u-truncate`},Wne={key:1,class:`enter`,"aria-hidden":`true`},Gne={key:1,class:`empty`},Kne={key:0},qne={key:1},Jne=G(M({__name:`index`,setup(e){let t=ua(),n=Jd(),i=Yd(n),o=We({...i.state}),s=i.subscribe(e=>{o.value=e}),c=z({get:()=>o.value.query,set:e=>i.setQuery(e)}),l=z(()=>o.value.items),u=z({get:()=>o.value.selected,set:e=>i.select(e)}),d=z(()=>o.value.loading),f=z(()=>o.value.busy),p=z(()=>o.value.error),m=z(()=>o.value.warning),h=z(()=>o.value.notice),g=X(),_=z(()=>g.value?.element),v=Ho,y=z(()=>l.value.length?`launch-option-${u.value}`:void 0);async function b(){v?await n.hide():(i.setQuery(``),_.value?.focus())}let x=z(()=>o.value.focus),S=z(()=>o.value.detail?.actions??[]),w=z(()=>o.value.detail?.failure),ee=z(()=>o.value.detail?.info),E=X(0),te=z(()=>tf(o.value.query).scope);R(x,()=>E.value=0);async function D(){await i.enter()&&await Ut()}async function re(e=l.value[u.value],n){let r=n??e?.actions?.[0];if(!e||!r)return;let a=await i.launch(e,r,!v);if(r.id===`favorite`||r.id===`folder`)a&&await i.refresh(),await Ut(),_.value?.focus();else if(a&&i.leave(),a&&!v&&o.value.route)await t.push(o.value.route);else{if(a&&v)try{await b()}catch(e){i.reportError(e)}await Ut(),_.value?.focus()}}let ie=!1;async function k(e=x.value??l.value[u.value]){if(!(!e||ie||o.value.busy||o.value.loading)){ie=!0;try{let t=await nf(n,e,`favorite`,x.value?.id===e.id&&o.value.detailReady?o.value.detail:null);t&&await re(e,t)}catch(e){i.reportError(e)}finally{ie=!1}}}function A(e){if(e.isComposing||e.keyCode===229)return;if((e.ctrlKey||e.metaKey)&&e.key.toLowerCase()===`d`){e.preventDefault(),k();return}if(x.value){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=S.value.length;t&&(E.value=(E.value+(e.key===`ArrowDown`?1:-1)+t)%t)}else e.key===`Enter`?(e.preventDefault(),re(x.value,S.value[E.value])):[`Escape`,`ArrowLeft`,`Tab`].includes(e.key)&&(e.preventDefault(),i.leave());return}let t=_.value?.selectionStart===_.value?.value.length;if(e.key===`Tab`||e.key===`ArrowRight`&&t&&!e.shiftKey||e.key===`k`&&(e.ctrlKey||e.metaKey)){if(!l.value.length)return;e.preventDefault(),D()}else if(e.key===`ArrowDown`||e.key===`ArrowUp`)e.preventDefault(),i.move(e.key===`ArrowDown`?1:-1),Ut(()=>document.getElementById(`launch-option-${u.value}`)?.scrollIntoView({block:`nearest`}));else if(e.key===`Enter`){e.preventDefault();let t=l.value[u.value];re(t,t?.actions?.[e.ctrlKey||e.metaKey?1:0])}else e.key===`Escape`&&(e.preventDefault(),b().catch(e=>i.reportError(e)))}function ae(){_.value?.focus(),f.value||i.search(l.value.length>0&&!d.value)}function oe(){v&&(i.setQuery(``),ae())}return Lt(()=>{ae(),i.live(!0),window.addEventListener(`focus`,ae),window.addEventListener(`projector:show`,oe)}),Jt(()=>{s(),i.dispose(),window.removeEventListener(`focus`,ae),window.removeEventListener(`projector:show`,oe)}),(e,t)=>{let n=pe(`router-link`);return V(),q(`main`,{class:O([`launcher`,{"in-window":H(v)}])},[K(`div`,Pne,[I(n,{to:`/`},{default:F(()=>[...t[3]||=[N(`projector`,-1)]]),_:1}),I(H(T))]),I(_l,{as:`section`,border:`line`,radius:`lg`,class:`palette`,"aria-label":`Запуск приложений`},{default:F(()=>[I(r,{class:`search-line`,gap:4,justify:`normal`},{default:F(()=>[t[4]||=K(`svg`,{width:`23`,height:`23`,viewBox:`0 0 24 24`,fill:`none`,"aria-hidden":`true`},[K(`circle`,{cx:`10.5`,cy:`10.5`,r:`6.5`,stroke:`currentColor`,"stroke-width":`1.5`}),K(`path`,{d:`m16 16 5 5`,stroke:`currentColor`,"stroke-width":`1.5`})],-1),te.value===`all`?B(``,!0):(V(),q(`span`,Fne,j(H(Xd)[te.value]),1)),I(a,{ref_key:`inputControl`,ref:g,modelValue:c.value,"onUpdate:modelValue":t[0]||=e=>c.value=e,role:`combobox`,"aria-label":`Поиск приложений и проектов`,"aria-autocomplete":`list`,"aria-controls":`launch-results`,"aria-expanded":l.value.length>0,"aria-activedescendant":y.value,autocomplete:`off`,spellcheck:`false`,placeholder:`Поиск приложений и проектов… (/ проекты, gh/ GitHub)`,disabled:f.value,onKeydown:A},null,8,[`modelValue`,`aria-expanded`,`aria-activedescendant`,`disabled`]),d.value||f.value?(V(),q(`span`,Ine,`⋯`)):B(``,!0)]),_:1}),et(K(`div`,{id:`launch-results`,class:`results`,role:`listbox`,"aria-label":`Результаты`,"aria-busy":d.value},[(V(!0),q(W,null,J(l.value,(e,t)=>(V(),q(W,{key:e.id},[e.section&&e.section!==l.value[t-1]?.section?(V(),q(`div`,Rne,j(H(qd)[e.section]),1)):B(``,!0),I(ts,{interaction:`selection`,padding:`var(--sp-3)`,id:`launch-option-${t}`,role:`option`,"aria-selected":t===u.value,class:O([`result`,{selected:t===u.value}]),disabled:f.value||d.value,tabindex:`-1`,onMousemove:e=>u.value=t,onClick:t=>re(e)},{default:F(()=>[e.icon?(V(),q(`img`,{key:0,src:H(C)(e.icon),alt:``,width:`36`,height:`36`},null,8,zne)):B(``,!0),K(`span`,Bne,[K(`span`,Vne,[e.favorite?(V(),q(`span`,Hne,`★`)):B(``,!0),e.status?(V(),Y(ne,{key:1,class:`status-dot`,size:8,inline:``,shrink:``,tone:H(Uo)(e.status.state),title:e.status.label,"aria-hidden":`true`},null,8,[`tone`,`title`])):B(``,!0),N(j(e.name),1)]),K(`span`,Une,j(e.description),1)]),t===u.value?(V(),q(`span`,Wne,[N(`↵ `+j(e.actions?.[0]?.title),1),e.actions?.[1]?(V(),q(W,{key:0},[N(` · Ctrl+↵ `+j(e.actions[1].title),1)],64)):B(``,!0)])):B(``,!0)]),_:2},1032,[`id`,`aria-selected`,`class`,`disabled`,`onMousemove`,`onClick`])],64))),128))],8,Lne),[[Ln,!x.value]]),x.value?(V(),Y(H(hs),{key:0,index:E.value,"onUpdate:index":t[1]||=e=>E.value=e,item:x.value,actions:S.value,info:ee.value,failure:w.value,loading:o.value.detailLoading,onLaunch:t[2]||=e=>re(x.value,e)},null,8,[`index`,`item`,`actions`,`info`,`failure`,`loading`])):B(``,!0),!d.value&&!l.value.length&&!p.value?(V(),q(`p`,Gne,`Ничего не найдено`)):B(``,!0),p.value||m.value||h.value?(V(),q(`p`,{key:2,class:O([`message`,{error:p.value}]),role:`status`},j(p.value||m.value||h.value),3)):B(``,!0),I(r,{as:`footer`,class:`palette-footer`,align:`normal`,justify:`between`,gap:3,wrap:``},{default:F(()=>[x.value?(V(),q(`span`,Kne,[...t[5]||=[N(`↑↓ выбрать `,-1),K(`span`,{class:`separator`},`·`,-1),N(` Enter выполнить `,-1),K(`span`,{class:`separator`},`·`,-1),N(` ← назад`,-1)]])):(V(),q(`span`,qne,[t[6]||=N(`↑↓ выбрать `,-1),t[7]||=K(`span`,{class:`separator`},`·`,-1),t[8]||=N(` Enter основное `,-1),t[9]||=K(`span`,{class:`separator`},`·`,-1),t[10]||=N(` Ctrl+Enter второе `,-1),t[11]||=K(`span`,{class:`separator`},`·`,-1),t[12]||=N(` → действия `,-1),t[13]||=K(`span`,{class:`separator`},`·`,-1),t[14]||=N(` Ctrl+D ★ `,-1),t[15]||=K(`span`,{class:`separator`},`·`,-1),N(` Esc `+j(H(v)?`закрыть`:`очистить`),1)]))]),_:1})]),_:1})],2)}}}),[[`__scopeId`,`data-v-c0d7dd70`]]),Yne=vee({history:bo(p()||`/`),routes:[{path:`/`,name:`launcher`,component:Jne},{path:`/projects`,redirect:`/`},{path:`/projects/:projectPath(.*)+`,name:`project`,component:Mne},{path:`/gh/projects/:githubPath(.*)+`,name:`github-project`,component:$te},{path:`/gl/projects/:gitlabPath(.*)+`,name:`gitlab-project`,component:yne},{path:`/settings`,name:`settings`,component:Nne}]}),Xne=Zm({name:`Bars`,group:`data`,summary:`горизонтальные столбцы`,props:{items:{type:`array`,description:`[{label, value}]`,required:!0},unit:{type:`string`,description:`единица после значения`}},example:`<Bars unit=" ₽" :items="[{label:'A',value:120},{label:'B',value:80}]" />`}),Zne={class:`bars`},Qne={class:`label`},$ne={class:`value`},ere={definition:Xne,component:G(M({__name:`Bars`,props:{items:{},unit:{}},setup(e){let t=e,n=z(()=>Math.max(1,...t.items.map(e=>e.value)));return(t,r)=>(V(),q(`ul`,Zne,[(V(!0),q(W,null,J(e.items,t=>(V(),q(`li`,{key:t.label},[K(`span`,Qne,j(t.label),1),I(y5,{value:t.value/n.value*100,height:8,tone:`info`},null,8,[`value`]),K(`span`,$ne,j(t.value)+j(e.unit??``),1)]))),128))]))}}),[[`__scopeId`,`data-v-74114788`]])},tre=Zm({name:`Button`,group:`action`,summary:`кнопка; отправляет данные агенту только по клику пользователя`,props:{submit:{type:`boolean`,description:`отправить значения окружающей <Form>`},reset:{type:`boolean`,description:`вернуть поля формы к исходным`},preset:{type:`object`,description:`задать поля формы по имени: {поле: значение}`},send:{type:`string | object`,description:`отправить это агенту как есть (вне формы)`},summary:{type:`string`,description:`строка перед данными в сообщении`},sentLabel:{type:`string`,description:`подпись после отправки, по умолчанию «Отправлено»`}},slot:`подпись кнопки`,notes:[`После отправки кнопка и форма блокируются. Без submit/send/preset/reset это обычная кнопка с @click.`],example:`<Button send="Да, продолжай" summary="Ответ">Продолжить</Button>`}),B9=Symbol(`agent-widget-form`),V9=e=>e===void 0?e:JSON.parse(JSON.stringify(e));function H9(e){let t=new Map,n=at({}),r=()=>{for(let e of Object.keys(n))delete n[e]};return{sent:X(!1),errors:n,register(r,i,a,o){let s={value:i,initial:V9(a),validate:o},c=e?.values?.[r];return c!==void 0&&(i.value=V9(c)),t.set(r,s),()=>{t.get(r)===s&&(t.delete(r),delete n[r])}},values:()=>Object.fromEntries([...t].map(([e,t])=>[e,V9(t.value.value)])),reset(){for(let e of t.values())e.value.value=V9(e.initial);r()},set(e){for(let[n,r]of Object.entries(e))t.has(n)&&(t.get(n).value.value=V9(r));r()},validate(){r();for(let[e,r]of t){let t=r.validate?.(r.value.value);t&&(n[e]=t)}return Object.keys(n).length===0}}}function U9(e,t,n,r){t.value===void 0&&(t.value=V9(n));let i=tt(B9,null);i&&e&<(i.register(e,t,t.value,r?e=>r(e):void 0))}function W9(e){return(e??[]).map(e=>typeof e==`string`?{value:e}:{...e,value:String(e.value)})}var nre={definition:tre,component:M({__name:`Button`,props:{submit:{type:Boolean},reset:{type:Boolean},preset:{},send:{},summary:{},sentLabel:{}},setup(e){let t=e,n=tt(B9,null),r=tt(Ih,null),i=Rm(),a=X(!1),o=z(()=>t.submit?!!n?.sent.value:a.value),s=z(()=>H(r?.readonly)===!0),c=z(()=>o.value||!!n?.sent.value||s.value);function l(){c.value||(t.reset&&n?.reset(),t.preset&&n?.set(t.preset),t.submit&&n&&n.validate()&&i(n.values(),t.summary)?n.sent.value=!0:!t.submit&&t.send!==void 0&&i(t.send,t.summary)&&(a.value=!0))}return(t,n)=>(V(),Y(Q,{disabled:c.value,onClick:l},{default:F(()=>[o.value?(V(),q(W,{key:0},[N(j(e.sentLabel??`Отправлено`),1)],64)):L(t.$slots,`default`,{},void 0,void 0,1)]),_:3},8,[`disabled`]))}})},rre=Zm({name:`Card`,group:`layout`,summary:`рамка с заголовком для группы`,props:{title:{type:`string`,description:`заголовок`},hint:{type:`string`,description:`подпись под заголовком`},tone:{type:`'neutral' | 'warning'`,description:`цвет рамки`}},slot:`содержимое рамки`,example:`<Card title="Итоги" hint="за квартал">Выручка выросла на 12%.</Card>`}),ire={key:0,class:`head`},are={key:0,class:`title`},ore={key:1,class:`hint`},sre={definition:rre,component:G(M({__name:`Card`,props:{title:{},hint:{},tone:{}},setup(e){return(t,n)=>(V(),Y(l,{tone:e.tone},{default:F(()=>[e.title||e.hint?(V(),q(`header`,ire,[e.title?(V(),q(`strong`,are,j(e.title),1)):B(``,!0),e.hint?(V(),q(`span`,ore,j(e.hint),1)):B(``,!0)])):B(``,!0),L(t.$slots,`default`,{},void 0,!0)]),_:3},8,[`tone`]))}}),[[`__scopeId`,`data-v-141497cd`]])},cre=Zm({name:`Checks`,group:`form`,summary:`выбор из списка: несколько (флажки) или один (single)`,hidden:!0,props:{options:{type:`array`,description:`массив строк или объектов: value обязателен, label и hint необязательны`,required:!0},single:{type:`boolean`,description:`один вариант вместо нескольких`},name:{type:`string`,description:`имя поля в <Form>`},initial:{type:`array`,description:`начально выбранные value`}},model:{type:`array`,description:`выбранные value`},example:`<Checks name="scripts" :initial="['test']" :options="[{value:'start',hint:'dev-сервер'},'test']" />`}),lre={class:`checks`},ure=[`type`,`name`,`checked`,`onChange`],dre={class:`text`},fre={key:0},pre={definition:cre,component:G(M({__name:`Checks`,props:yt({options:{},single:{type:Boolean},name:{},initial:{}},{modelValue:{},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=e,n=Te(e,`modelValue`);U9(t.name,n,t.initial??[]);let r=z(()=>W9(t.options)),i=z(()=>n.value??[]);function a(e,t){t?n.value=[e]:n.value=i.value.includes(e)?i.value.filter(t=>t!==e):[...i.value,e]}return(t,n)=>(V(),q(`ul`,lre,[(V(!0),q(W,null,J(r.value,t=>(V(),q(`li`,{key:t.value},[K(`label`,null,[K(`input`,{type:e.single?`radio`:`checkbox`,name:e.name,checked:i.value.includes(t.value),onChange:n=>a(t.value,e.single)},null,40,ure),K(`span`,dre,[K(`span`,null,j(t.label??t.value),1),t.hint?(V(),q(`small`,fre,j(t.hint),1)):B(``,!0)])])]))),128))]))}}),[[`__scopeId`,`data-v-5d774662`]])},mre=Zm({name:`Chips`,group:`data`,summary:`набор цветных меток: теги, статусы, технологии`,props:{items:{type:`string | {label, tone?, icon?}[]`,description:`метки; tone — neutral, info, success, warning, danger или accent; icon — имя из InlineIcon. Без tone цвета чередуются автоматически`,required:!0},mono:{type:`boolean`,description:`моноширинный шрифт для кода, хешей и версий`}},example:`<Chips :items="['TypeScript',{label:'готово',tone:'success',icon:'circle-check'},{label:'риск',tone:'warning',icon:'alert'}]" />`}),hre={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function gre(e,t){return V(),q(`svg`,hre,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`12`,cy:`12`,r:`10`}),K(`path`,{d:`M12 6v6l4 2`})],-1)]])}var _re=U({name:`lucide-clock`,render:gre}),vre={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function yre(e,t){return V(),q(`svg`,vre,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9`},null,-1)]])}var bre=U({name:`lucide-cloud`,render:yre}),xre={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Sre(e,t){return V(),q(`svg`,xre,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`m16 18l6-6l-6-6M8 6l-6 6l6 6`},null,-1)]])}var Cre=U({name:`lucide-code`,render:Sre}),wre={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Tre(e,t){return V(),q(`svg`,wre,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`}),K(`path`,{d:`M3 5v14a9 3 0 0 0 18 0V5`}),K(`path`,{d:`M3 12a9 3 0 0 0 18 0`})],-1)]])}var Ere=U({name:`lucide-database`,render:Tre}),Dre={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Ore(e,t){return V(),q(`svg`,Dre,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`circle`,{cx:`12`,cy:`12`,r:`3`}),K(`path`,{d:`M3 12h6m6 0h6`})],-1)]])}var kre=U({name:`lucide-git-commit`,render:Ore}),Are={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function jre(e,t){return V(),q(`svg`,Are,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`rect`,{width:`18`,height:`11`,x:`3`,y:`11`,rx:`2`,ry:`2`}),K(`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`})],-1)]])}var Mre=U({name:`lucide-lock`,render:jre}),Nre={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Pre(e,t){return V(),q(`svg`,Nre,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73zm1 .27V12`}),K(`path`,{d:`M3.29 7L12 12l8.71-5M7.5 4.27l9 5.15`})],-1)]])}var Fre=U({name:`lucide-package`,render:Pre}),Ire={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Lre(e,t){return V(),q(`svg`,Ire,[...t[0]||=[K(`g`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`},[K(`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0a2.34 2.34 0 0 0 3.319 1.915a2.34 2.34 0 0 1 2.33 4.033a2.34 2.34 0 0 0 0 3.831a2.34 2.34 0 0 1-2.33 4.033a2.34 2.34 0 0 0-3.319 1.915a2.34 2.34 0 0 1-4.659 0a2.34 2.34 0 0 0-3.32-1.915a2.34 2.34 0 0 1-2.33-4.033a2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`}),K(`circle`,{cx:`12`,cy:`12`,r:`3`})],-1)]])}var Rre=U({name:`lucide-settings`,render:Lre}),zre={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Bre(e,t){return V(),q(`svg`,zre,[...t[0]||=[K(`path`,{fill:`none`,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M14.5 2v17.5c0 1.4-1.1 2.5-2.5 2.5s-2.5-1.1-2.5-2.5V2m-1 0h7m-1 14h-5`},null,-1)]])}var Vre=U({name:`lucide-test-tube`,render:Bre}),G9={alert:E_,"arrow-right":y0,check:C_,"chevron-right":of,"circle-check":dX,clock:_re,cloud:bre,code:Cre,database:Ere,"external-link":bi,file:eQ,folder:ff,"git-branch":_A,"git-commit":kre,info:ED,lock:Mre,package:Fre,play:s_,search:If,settings:Rre,sparkles:G_,terminal:nT,"test-tube":Vre,x:oi},Hre={class:`chips`},Ure={key:1,class:`dot`,"aria-hidden":`true`},Wre={definition:mre,component:G(M({__name:`Chips`,props:{items:{},mono:{type:Boolean}},setup(e){let t=e,n=[`info`,`accent`,`success`,`warning`],r=z(()=>t.items.map((e,t)=>{let r=typeof e==`string`?{label:e}:e;return{...r,tone:r.tone??n[t%n.length],icon:r.icon?G9[r.icon]:void 0}}));return(t,n)=>(V(),q(`div`,Hre,[(V(!0),q(W,null,J(r.value,(t,n)=>(V(),q(`span`,{key:`${n}:${t.label}`,class:O([`chip`,[t.tone,{mono:e.mono}]])},[t.icon?(V(),Y(qe(t.icon),{key:0,class:`icon`,"aria-hidden":`true`})):(V(),q(`span`,Ure)),N(` `+j(t.label),1)],2))),128))]))}}),[[`__scopeId`,`data-v-3c9f5ab2`]])},Gre=Zm({name:`Columns`,group:`layout`,summary:`колонки; на узкой ширине встают в столбик`,props:{cols:{type:`number`,description:`число колонок, по умолчанию 2`},gap:{type:`number`,description:`отступ в пикселях`}},slot:`элементы по колонкам`,example:`<Columns :cols="2"><Stat label="A" value="10" /><Stat label="B" value="20" /></Columns>`}),Kre={class:`columns`},qre={definition:Gre,component:G(M({__name:`Columns`,props:{cols:{},gap:{}},setup(e){return(t,n)=>(V(),q(`div`,Kre,[K(`div`,{class:`grid`,style:k({"--cols":e.cols??2,...e.gap===void 0?{}:{gap:`${e.gap}px`}})},[L(t.$slots,`default`,{},void 0,!0)],4)]))}}),[[`__scopeId`,`data-v-31c0dcb3`]])},Jre={definition:Zm({name:`Donut`,group:`data`,summary:`кольцо с долями и легендой`,props:{items:{type:`array`,description:`[{label, value}]`,required:!0},center:{type:`string`,description:`текст в центре`}},example:`<Donut center="100%" :items="[{label:'A',value:60},{label:'B',value:40}]" />`}),component:M({__name:`Donut`,props:{items:{},center:{}},setup(e){return(t,n)=>(V(),Y(O7,{items:e.items,center:e.center},null,8,[`items`,`center`]))}})},Yre=Zm({name:`Field`,group:`form`,summary:`поле формы; type задаёт вид контроля`,props:{type:{type:`string`,description:`text, textarea, number, slider, select, radio, checks, switch, date, time или segmented; по умолчанию text`},name:{type:`string`,description:`имя поля в Form`},label:{type:`string`,description:`подпись поля`},hint:{type:`string`,description:`пояснение под полем`},initial:{type:`string | number | boolean | array`,description:`начальное значение; для checks — массив, для switch — boolean`},placeholder:{type:`string`,description:`подсказка в пустом text, textarea или number`},required:{type:`boolean`,description:`обязательное поле`},disabled:{type:`boolean`,description:`заблокировать поле`},options:{type:`array`,description:`для select, radio и checks: строки или {value, label, hint}`},min:{type:`number`,description:`минимум для number и slider`},max:{type:`number`,description:`максимум для number и slider`},step:{type:`number`,description:`шаг для number и slider`},unit:{type:`string`,description:`единица рядом со значением number и slider`},rows:{type:`number`,description:`высота textarea в строках`}},model:{type:`string | number | boolean | array`,description:`значение поля`},guide:`type: text | textarea | number | slider | select | radio | checks | switch | date | time | segmented.
|
|
171
|
+
Общие: name, label, hint, initial, placeholder, required, disabled.
|
|
172
|
+
options — для select/radio/checks; min/max/step/unit — для number/slider; rows — для textarea.
|
|
173
|
+
checks отдаёт array, switch — boolean, number/slider — number, остальные — string.`,example:`<Field type="select" name="mode" label="Режим" :options="['server','window']" />
|
|
174
|
+
<Field type="slider" name="port" label="Порт" :min="3000" :max="9000" :initial="4177" />`}),Xre={key:0,class:`field choices-field`},Zre={key:0,class:`label`},Qre={key:0,class:`required`,"aria-hidden":`true`},$re=[`aria-required`,`aria-describedby`],eie=[`type`,`name`,`value`,`checked`,`disabled`,`onChange`],tie={class:`choice-text`},nie={key:0},rie={key:2,class:`error`,role:`alert`},iie={class:`switch-row`},aie=[`name`,`disabled`,`aria-required`,`aria-describedby`],oie={key:0,class:`label`},sie={key:0,class:`required`,"aria-hidden":`true`},cie={key:1,class:`error`,role:`alert`},lie={key:2,class:`field`},uie={key:0,class:`label`},die={key:0,class:`required`,"aria-hidden":`true`},fie=[`aria-required`],pie=[`aria-pressed`,`disabled`,`onClick`],mie={key:2,class:`error`,role:`alert`},hie={key:0,class:`label`},gie={key:0,class:`required`,"aria-hidden":`true`},_ie={key:1,class:`number-row`},vie=[`name`,`placeholder`,`min`,`max`,`step`,`required`,`disabled`,`aria-describedby`],yie=[`name`,`min`,`max`,`step`,`disabled`,`aria-describedby`],bie={key:2,class:`unit`},xie=[`name`,`rows`,`placeholder`,`required`,`disabled`,`aria-describedby`],Sie=[`name`,`required`,`disabled`,`aria-describedby`],Cie=[`value`],wie=[`type`,`name`,`placeholder`,`required`,`disabled`,`aria-describedby`],Tie={key:6,class:`error`,role:`alert`},Eie={definition:Yre,component:G(M({__name:`Field`,props:{modelValue:{},type:{},name:{},label:{},hint:{},initial:{},placeholder:{},required:{type:Boolean},disabled:{type:Boolean},options:{},min:{},max:{},step:{},unit:{},rows:{}},emits:[`update:modelValue`],setup(e,{emit:t}){let n=e,r=t,i=X();R(()=>n.modelValue,e=>{e!==void 0&&(i.value=e)},{immediate:!0});let a=z({get:()=>i.value,set:e=>{i.value=e,r(`update:modelValue`,e)}}),o=z({get:()=>typeof a.value==`string`?a.value:a.value==null?``:String(a.value),set:e=>a.value=e}),s=z({get:()=>typeof a.value==`number`?a.value:Number(a.value)||0,set:e=>a.value=e}),c=z({get:()=>a.value===!0,set:e=>a.value=e}),l=z(()=>n.type??`text`),u=z(()=>W9(n.options)),d=z(()=>n.initial===void 0?l.value===`checks`?[]:l.value===`switch`?!1:l.value===`number`||l.value===`slider`?n.min??0:l.value===`select`||l.value===`radio`||l.value===`segmented`?u.value[0]?.value??``:``:l.value===`checks`?Array.isArray(n.initial)?n.initial.map(String):[]:l.value===`switch`?n.initial===!0:l.value===`number`||l.value===`slider`?typeof n.initial==`number`?n.initial:Number(n.initial)||n.min||0:typeof n.initial==`string`?n.initial:String(n.initial)),f=z(()=>Array.isArray(a.value)?a.value.map(String):[]),p=tt(B9,null),m=z(()=>n.name&&p?p.errors[n.name]??``:``);function h(e){if(n.required)return l.value===`checks`?f.value.length?void 0:`Выберите хотя бы один вариант`:l.value===`switch`?e===!0?void 0:`Включите переключатель`:l.value===`number`||l.value===`slider`?typeof e==`number`&&Number.isFinite(e)?void 0:`Укажите число`:o.value.trim()?void 0:`Заполните поле`}U9(n.name,a,d.value,h);let g=P(),_=`${g}-control`,v=`${g}-hint`;function y(e){let t=f.value;a.value=t.includes(e)?t.filter(t=>t!==e):[...t,e]}return(t,n)=>l.value===`checks`||l.value===`radio`?(V(),q(`fieldset`,Xre,[e.label?(V(),q(`legend`,Zre,[N(j(e.label),1),e.required?(V(),q(`span`,Qre,`*`)):B(``,!0)])):B(``,!0),K(`div`,{class:`choices`,"aria-required":e.required||void 0,"aria-describedby":e.hint?v:void 0},[(V(!0),q(W,null,J(u.value,t=>(V(),q(`label`,{key:t.value,class:`choice`},[K(`input`,{type:l.value===`checks`?`checkbox`:`radio`,name:e.name,value:t.value,checked:f.value.includes(t.value),disabled:e.disabled,onChange:e=>l.value===`checks`?y(t.value):a.value=t.value},null,40,eie),K(`span`,tie,[K(`span`,null,j(t.label??t.value),1),t.hint?(V(),q(`small`,nie,j(t.hint),1)):B(``,!0)])]))),128))],8,$re),e.hint?(V(),q(`small`,{key:1,id:v,class:`hint`},j(e.hint),1)):B(``,!0),m.value?(V(),q(`small`,rie,j(m.value),1)):B(``,!0)])):l.value===`switch`?(V(),q(`label`,{key:1,class:`field switch-field`,for:_},[K(`span`,iie,[et(K(`input`,{id:_,"onUpdate:modelValue":n[0]||=e=>c.value=e,type:`checkbox`,role:`switch`,name:e.name,disabled:e.disabled,"aria-required":e.required||void 0,"aria-describedby":e.hint?v:void 0},null,8,aie),[[zn,c.value]]),e.label?(V(),q(`span`,oie,[N(j(e.label),1),e.required?(V(),q(`span`,sie,`*`)):B(``,!0)])):B(``,!0)]),e.hint?(V(),q(`small`,{key:0,id:v,class:`hint`},j(e.hint),1)):B(``,!0),m.value?(V(),q(`small`,cie,j(m.value),1)):B(``,!0)])):l.value===`segmented`?(V(),q(`label`,lie,[e.label?(V(),q(`span`,uie,[N(j(e.label),1),e.required?(V(),q(`span`,die,`*`)):B(``,!0)])):B(``,!0),K(`span`,{class:`segmented`,role:`group`,"aria-required":e.required||void 0},[(V(!0),q(W,null,J(u.value,t=>(V(),q(`button`,{key:t.value,type:`button`,"aria-pressed":a.value===t.value,disabled:e.disabled,onClick:e=>a.value=t.value},j(t.label??t.value),9,pie))),128))],8,fie),e.hint?(V(),q(`small`,{key:1,id:v,class:`hint`},j(e.hint),1)):B(``,!0),m.value?(V(),q(`small`,mie,j(m.value),1)):B(``,!0)])):(V(),q(`label`,{key:3,class:`field`,for:_},[e.label?(V(),q(`span`,hie,[N(j(e.label),1),e.required?(V(),q(`span`,gie,`*`)):B(``,!0)])):B(``,!0),l.value===`number`||l.value===`slider`?(V(),q(`span`,_ie,[l.value===`number`?et((V(),q(`input`,{key:0,id:_,"onUpdate:modelValue":n[1]||=e=>s.value=e,type:`number`,name:e.name,placeholder:e.placeholder,min:e.min,max:e.max,step:e.step,required:e.required,disabled:e.disabled,"aria-describedby":e.hint?v:void 0},null,8,vie)),[[_n,s.value,void 0,{number:!0}]]):et((V(),q(`input`,{key:1,id:_,"onUpdate:modelValue":n[2]||=e=>s.value=e,type:`range`,name:e.name,min:e.min??0,max:e.max??100,step:e.step??1,disabled:e.disabled,"aria-describedby":e.hint?v:void 0},null,8,yie)),[[_n,s.value,void 0,{number:!0}]]),e.unit?(V(),q(`span`,bie,j(e.unit),1)):B(``,!0)])):l.value===`textarea`?et((V(),q(`textarea`,{key:2,id:_,"onUpdate:modelValue":n[3]||=e=>o.value=e,name:e.name,rows:e.rows??3,placeholder:e.placeholder,required:e.required,disabled:e.disabled,"aria-describedby":e.hint?v:void 0},null,8,xie)),[[_n,o.value]]):l.value===`select`?et((V(),q(`select`,{key:3,id:_,"onUpdate:modelValue":n[4]||=e=>o.value=e,name:e.name,required:e.required,disabled:e.disabled,"aria-describedby":e.hint?v:void 0},[(V(!0),q(W,null,J(u.value,e=>(V(),q(`option`,{key:e.value,value:e.value},j(e.label??e.value),9,Cie))),128))],8,Sie)),[[vn,o.value]]):et((V(),q(`input`,{key:4,id:_,"onUpdate:modelValue":n[5]||=e=>o.value=e,type:l.value,name:e.name,placeholder:e.placeholder,required:e.required,disabled:e.disabled,"aria-describedby":e.hint?v:void 0},null,8,wie)),[[xn,o.value]]),e.hint?(V(),q(`small`,{key:5,id:v,class:`hint`},j(e.hint),1)):B(``,!0),m.value?(V(),q(`small`,Tie,j(m.value),1)):B(``,!0)]))}}),[[`__scopeId`,`data-v-aef9431f`]])},Die=Zm({name:`Form`,group:`form`,summary:`форма без скрипта: собирает именованные поля внутри`,answer:!0,slot:`поля Field с name и кнопки`,notes:[`Поля внутри — Field с name; начальное значение задаётся initial. У Button флаг submit отправляет значения полей тебе и блокирует форму, summary задаёт подпись ответа, reset возвращает исходные значения, а preset принимает объект с новыми значениями полей.`,`Когда нужен выбор или настройки пользователя: покажи форму с submit-кнопкой и остановись; действуй после его ответа и только по выбранному.`,`Форма последним блоком ответа становится полем ввода чата: пользователь заполнит её на месте текстового поля, а его сообщение сохранит ту же форму с выбранными значениями. Не пиши текст после такой формы.`],guide:`Поля — Field с name; Button submit отправляет JSON, reset/preset меняют значения.
|
|
175
|
+
Форма последним блоком ответа становится полем ввода; не пиши текст после неё.`,example:`<Form><Field type="checks" name="scripts" :options="['start','test']" /><Button submit summary="Выбор">Применить</Button></Form>`}),Oie=[`disabled`],kie={definition:Die,component:G(M({__name:`Form`,setup(e){let t=tt(Ih,null),n=H9(t),r=z(()=>H(t?.readonly)===!0);return R(r,e=>{e||(n.sent.value=!1)}),ot(B9,n),(e,t)=>(V(),q(`fieldset`,{class:`form`,disabled:H(n).sent.value||r.value},[L(e.$slots,`default`,{},void 0,!0)],8,Oie))}}),[[`__scopeId`,`data-v-38c7a037`]])},Aie=Zm({name:`GitInfo`,group:`data`,summary:`состояние и история git: ветка, изменения, diff, коммиты — когда ответ опирается на репозиторий`,props:{branch:{type:`string`,description:`текущая ветка`},upstream:{type:`string`,description:`upstream-ветка, например origin/main`},ahead:{type:`number`,description:`коммитов впереди upstream`},behind:{type:`number`,description:`коммитов позади upstream`},clean:{type:`boolean`,description:`рабочее дерево чистое`},staged:{type:`number`,description:`изменений в индексе`},unstaged:{type:`number`,description:`неиндексированных изменений`},untracked:{type:`number`,description:`неотслеживаемых файлов`},conflicted:{type:`number`,description:`конфликтующих файлов`},additions:{type:`number`,description:`добавленных строк в diff`},deletions:{type:`number`,description:`удалённых строк в diff`},commits:{type:`[{hash, subject, author?, when?}]`,description:`последние коммиты; when — готовая подпись времени`},files:{type:`[{path, status?, additions?, deletions?}]`,description:`изменённые файлы; status — M, A, D, R и т. п.`}},special:!0,example:`<GitInfo branch="main" upstream="origin/main" :ahead="2" :staged="3" :unstaged="1" :untracked="2" :additions="48" :deletions="12" :commits="[{hash:'a1b2c3d',subject:'Добавить GitInfo',author:'Ада',when:'2 ч назад'}]" :files="[{path:'core/modules/agent-widgets/git-info/index.ts',status:'A',additions:48,deletions:0}]" />`}),jie={class:`git-info`},Mie={key:0,class:`muted`},Nie={key:0},Pie={key:0,class:`branch`},Fie={key:1,class:`upstream`},Iie={key:1,class:`metrics`},Lie={key:2,class:`diff`},Rie={class:`add`},zie={class:`del`},Bie={key:3,class:`commits`},Vie={class:`subject`},Hie={key:0,class:`meta`},Uie={key:4,class:`files`},Wie={class:`path`},Gie={key:1,class:`add`},Kie={key:2,class:`del`},qie={definition:Aie,component:G(M({__name:`GitInfo`,props:{branch:{},upstream:{},ahead:{},behind:{},clean:{type:Boolean},staged:{},unstaged:{},untracked:{},conflicted:{},additions:{},deletions:{},commits:{},files:{}},setup(e){let t=e,n=z(()=>[{label:`в индексе`,value:t.staged},{label:`не в индексе`,value:t.unstaged},{label:`неотслеживаемых`,value:t.untracked},{label:`конфликтов`,value:t.conflicted}].filter(e=>e.value!==void 0)),r=z(()=>n.value.reduce((e,t)=>e+t.value,0)),i=z(()=>n.value.length>0),a=z(()=>(t.additions??0)+(t.deletions??0)),o=z(()=>t.additions!==void 0||t.deletions!==void 0),s=z(()=>[{value:a.value?(t.additions??0)/a.value*100:0,tone:`success`},{value:a.value?(t.deletions??0)/a.value*100:0,tone:`danger`}]),c=z(()=>!t.branch&&!t.upstream&&!i.value&&!o.value&&!t.commits?.length&&!t.files?.length&&t.clean===void 0),l=e=>e.slice(0,7);return(t,a)=>(V(),q(`section`,jie,[c.value?(V(),q(`p`,Mie,`Нет данных git.`)):(V(),q(W,{key:1},[e.branch||e.upstream||e.ahead!==void 0||e.behind!==void 0||e.clean!==void 0?(V(),q(`header`,Nie,[e.branch?(V(),q(`span`,Pie,[I(H(_A),{"aria-hidden":`true`}),K(`strong`,null,j(e.branch),1)])):B(``,!0),e.upstream?(V(),q(`span`,Fie,j(e.upstream),1)):B(``,!0),e.ahead?(V(),Y(hl,{key:2,tone:`info`},{default:F(()=>[N(`↑`+j(e.ahead),1)]),_:1})):B(``,!0),e.behind?(V(),Y(hl,{key:3,tone:`warning`},{default:F(()=>[N(`↓`+j(e.behind),1)]),_:1})):B(``,!0),e.clean===!0||e.clean!==!1&&i.value&&r.value===0?(V(),Y(hl,{key:4,tone:`info`},{default:F(()=>[...a[0]||=[N(` чисто `,-1)]]),_:1})):e.conflicted?(V(),Y(hl,{key:5,tone:`danger`},{default:F(()=>[N(j(e.conflicted)+` конфл.`,1)]),_:1})):i.value?(V(),Y(hl,{key:6,tone:`warning`},{default:F(()=>[N(j(r.value)+` изм.`,1)]),_:1})):B(``,!0)])):B(``,!0),n.value.length?(V(),q(`dl`,Iie,[(V(!0),q(W,null,J(n.value,e=>(V(),q(`div`,{key:e.label},[K(`dt`,null,j(e.label),1),K(`dd`,null,j(e.value),1)]))),128))])):B(``,!0),o.value?(V(),q(`div`,Lie,[K(`span`,Rie,`+`+j(e.additions??0),1),K(`span`,zie,`−`+j(e.deletions??0),1),I(y5,{height:6,segments:s.value,"aria-hidden":`true`},null,8,[`segments`])])):B(``,!0),e.commits?.length?(V(),q(`ol`,Bie,[(V(!0),q(W,null,J(e.commits,e=>(V(),q(`li`,{key:e.hash},[K(`code`,null,j(l(e.hash)),1),K(`span`,Vie,j(e.subject),1),e.author||e.when?(V(),q(`span`,Hie,j([e.author,e.when].filter(Boolean).join(` · `)),1)):B(``,!0)]))),128))])):B(``,!0),e.files?.length?(V(),q(`ul`,Uie,[(V(!0),q(W,null,J(e.files,e=>(V(),q(`li`,{key:e.path},[e.status?(V(),Y(hl,{key:0,tone:e.status===`D`?`danger`:`neutral`,mono:``},{default:F(()=>[N(j(e.status),1)]),_:2},1032,[`tone`])):B(``,!0),K(`code`,Wie,j(e.path),1),e.additions===void 0?B(``,!0):(V(),q(`span`,Gie,`+`+j(e.additions),1)),e.deletions===void 0?B(``,!0):(V(),q(`span`,Kie,`−`+j(e.deletions),1))]))),128))])):B(``,!0)],64))]))}}),[[`__scopeId`,`data-v-f5af0da4`]])},Jie=Zm({name:`Image`,group:`data`,summary:`изображение с подписью`,props:{src:{type:`string`,description:`адрес изображения: URL, data: URI, путь файла проекта или абсолютный путь на диске (/tmp/…, file://, C:\\…)`,required:!0},alt:{type:`string`,description:`текстовое описание для доступности`,required:!0},caption:{type:`string`,description:`подпись под изображением`},fit:{type:`"contain" | "cover"`,description:`вписывание в рамку, по умолчанию contain`},height:{type:`number`,description:`высота в пикселях, по умолчанию 240`}},notes:["Путь разрешается так же, как у markdown-картинки ``: файл проекта читается из проекта, абсолютный путь — с диска.",`Клик открывает просмотр с масштабом, как у markdown-картинки; битая загрузка заменяется ссылкой с alt.`],example:`<Image src="https://example.com/chart.png" alt="График продаж" caption="Продажи за квартал" fit="contain" :height="240" />`}),Yie={class:`image`},Xie=[`aria-label`],Zie=[`src`,`alt`],Qie=[`href`],$ie={key:2,class:`image-text`},eae={key:3},tae={definition:Jie,component:G(M({__name:`Image`,props:{src:{},alt:{},caption:{},fit:{},height:{}},setup(e){let t=e,n=tt(Fx,``),r=z(()=>Px(t.src,n)),i=z(()=>({height:`${Math.max(80,Math.min(1200,t.height??240))}px`,objectFit:t.fit??`contain`})),a=X(!1),o=X();return R(r,()=>{a.value=!1,o.value=void 0}),(t,n)=>(V(),q(W,null,[K(`figure`,Yie,[r.value&&!a.value?(V(),q(`button`,{key:0,type:`button`,class:`preview`,"aria-label":e.alt?`Открыть изображение: ${e.alt}`:`Открыть изображение`,onClick:n[1]||=e=>o.value=r.value},[K(`img`,{src:r.value,alt:e.alt,style:k(i.value),loading:`lazy`,decoding:`async`,referrerpolicy:`no-referrer`,onError:n[0]||=e=>a.value=!0},null,44,Zie)],8,Xie)):r.value?(V(),q(`a`,{key:1,class:`image-text`,href:r.value,target:`_blank`,rel:`noopener noreferrer`},j(e.alt||`Изображение`),9,Qie)):(V(),q(`span`,$ie,j(e.alt||`Изображение`),1)),e.caption?(V(),q(`figcaption`,eae,j(e.caption),1)):B(``,!0)]),o.value?(V(),Y(qr,{key:0,src:o.value,alt:e.alt,onClose:n[2]||=e=>o.value=void 0},null,8,[`src`,`alt`])):B(``,!0)],64))}}),[[`__scopeId`,`data-v-a3b32743`]])},nae=Zm({name:`InlineIcon`,group:`data`,summary:`небольшая иконка внутри строки или рядом с подписью`,props:{name:{type:`string`,description:`одно из имён: alert, arrow-right, check, chevron-right, circle-check, clock, cloud, code, database, external-link, file, folder, git-branch, git-commit, info, lock, package, play, search, settings, sparkles, terminal, test-tube, x`,required:!0},label:{type:`string`,description:`доступное название; без него иконка декоративная`}},example:`<InlineIcon name="git-branch" label="Ветка" />`}),rae=[`aria-label`,`aria-hidden`],iae=[`title`],aae={definition:nae,component:G(M({__name:`InlineIcon`,props:{name:{},label:{}},setup(e){let t=e,n=z(()=>G9[t.name]);return(t,r)=>n.value?(V(),q(`span`,{key:0,class:`inline-icon`,role:`img`,"aria-label":e.label,"aria-hidden":!e.label},[(V(),Y(qe(n.value)))],8,rae)):(V(),q(`span`,{key:1,class:`inline-icon missing`,title:`Нет иконки ${e.name}`,"aria-hidden":`true`},`•`,8,iae))}}),[[`__scopeId`,`data-v-7a5e6a6b`]])},oae=Zm({name:`Input`,group:`form`,summary:`строка или многострочный текст`,hidden:!0,props:{label:{type:`string`,description:`подпись`},placeholder:{type:`string`,description:`подсказка в пустом поле`},multiline:{type:`boolean`,description:`несколько строк`},name:{type:`string`,description:`имя поля в <Form>`},initial:{type:`string`,description:`начальный текст`}},model:{type:`string`,description:`введённый текст`},example:`<Input name="note" label="Комментарий" multiline />`}),sae={class:`field`},cae={key:0},lae=[`name`,`placeholder`],uae=[`name`,`placeholder`],dae={definition:oae,component:G(M({__name:`Input`,props:yt({label:{},placeholder:{},multiline:{type:Boolean},name:{},initial:{}},{modelValue:{},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=e,n=Te(e,`modelValue`);return U9(t.name,n,t.initial??``),(t,r)=>(V(),q(`label`,sae,[e.label?(V(),q(`span`,cae,j(e.label),1)):B(``,!0),e.multiline?et((V(),q(`textarea`,{key:1,"onUpdate:modelValue":r[0]||=e=>n.value=e,rows:`3`,name:e.name,placeholder:e.placeholder},null,8,lae)),[[_n,n.value]]):et((V(),q(`input`,{key:2,"onUpdate:modelValue":r[1]||=e=>n.value=e,type:`text`,name:e.name,placeholder:e.placeholder},null,8,uae)),[[_n,n.value]])]))}}),[[`__scopeId`,`data-v-4804663c`]])},fae=Zm({name:`IntelligentForm`,group:`form`,summary:`форма ответа: поля управления; в поле ввода отправляется общей кнопкой`,answer:!0,props:{submit:{type:`string`,description:`подпись кнопки в сообщении или снимке, по умолчанию «Отправить»`},summary:{type:`string`,description:`строка перед данными в сообщении агенту`},sentLabel:{type:`string`,description:`подпись кнопки после отправки, по умолчанию «Отправлено»`}},slot:`поля Field с name`,notes:[`Когда нужно собрать два параметра или больше либо настройки пользователя, закончи ответ одной IntelligentForm и не пиши текст после неё; не разделяй их на несколько ask_user. Для одного вопроса или одного варианта остаётся ask_user.`,`Внутрь положи Field с name. Не оборачивай форму в Card или Form и не добавляй Button submit: в поле ввода отправляет общая кнопка, а в сообщении и снимке — кнопка самой формы.`,`Пока форма открыта в поле ввода, её блок не показывается в ответе; не дублируй его текстом.`],guide:`Внутрь — Field с name; общая кнопка композера отправляет JSON.
|
|
176
|
+
Не оборачивай в Card/Form и не добавляй Button submit; не пиши текст после формы.`,example:`<IntelligentForm summary="Настройки проекта" submit="Применить"><Field type="radio" name="mode" :options="['server','window']" /><Field type="number" name="port" label="Порт" :initial="4177" /></IntelligentForm>`}),pae=[`disabled`],mae={key:0,class:`actions`},hae={definition:fae,component:G(M({__name:`IntelligentForm`,props:{submit:{},summary:{},sentLabel:{}},setup(e){let t=e,n=tt(Ih,null),r=tt(Lh,null),i=H9(n),a=Rm(),o=z(()=>H(n?.readonly)===!0),s=z(()=>i.sent.value||o.value),c=r?.composer!==!0;R(o,e=>{e||(i.sent.value=!1)}),ot(B9,i);let l=r?.registerSubmit?.(u);lt(()=>l?.());function u(){return s.value||!i.validate()||!a(i.values(),t.summary)?!1:(i.sent.value=!0,!0)}return(t,n)=>(V(),q(`fieldset`,{class:`intelligent-form`,disabled:s.value},[L(t.$slots,`default`,{},void 0,!0),c?(V(),q(`div`,mae,[I(Q,{disabled:s.value,onClick:u},{default:F(()=>[N(j(s.value?e.sentLabel??`Отправлено`:e.submit??`Отправить`),1)]),_:1},8,[`disabled`])])):B(``,!0)],8,pae))}}),[[`__scopeId`,`data-v-afc5ff0f`]])},gae=Zm({name:`Line`,group:`data`,summary:`линейный график по меткам оси`,props:{labels:{type:`array`,description:`подписи оси X: ['янв','фев']`,required:!0},series:{type:`array`,description:`[{name, data:[числа]}] по числу меток`,required:!0},height:{type:`number`,description:`высота, по умолчанию 160`}},example:`<Line :labels="['янв','фев']" :series="[{name:'Выручка',data:[10,14]}]" />`}),_ae={class:`toolbar`},vae=[`viewBox`],yae=[`x1`,`x2`,`y1`,`y2`],bae=[`x`,`y`],xae=[`x`,`y`],Sae=[`points`,`stroke`],Cae=[`fill`],wae=[`cx`,`cy`,`r`,`opacity`],Tae=[`x1`,`x2`,`y1`,`y2`],Eae=[`x`,`y`,`width`,`height`],Dae=[`viewBox`],Oae=[`points`,`stroke`],kae=[`x`,`width`,`height`],Aae={class:`tt-label`},jae=44,Mae={definition:gae,component:G(M({__name:`Line`,props:{labels:{},series:{},height:{}},setup(e){let t=e,n=[`var(--info)`,`var(--run)`,`var(--warn)`,`var(--err)`],r=X(),i=X(),a=X(480),o;Lt(()=>{r.value&&typeof ResizeObserver<`u`&&(o=new ResizeObserver(([e])=>{let t=Math.round(e?.contentRect.width??0);t>120&&requestAnimationFrame(()=>a.value=t)}),o.observe(r.value))}),lt(()=>o?.disconnect());let s=z(()=>t.height??160),c=z(()=>Math.max(1,t.labels?.length??1)),l=z(()=>{let e=t.series?.flatMap(e=>e?.data??[])??[];return Math.max(1,...e)}),u=z(()=>({l:12+String(Math.round(l.value)).length*5.5,r:18,t:10,b:22})),d=X(0),f=X(Math.max(1,(t.labels?.length??1)-1)),p=()=>{d.value=0,f.value=Math.max(1,(t.labels?.length??1)-1)};R(()=>t.labels?.length,()=>p());let m=z(()=>Math.max(1e-6,f.value-d.value)),h=e=>u.value.l+(e-d.value)/m.value*(a.value-u.value.l-u.value.r),g=e=>u.value.t+(1-e/l.value)*(s.value-u.value.t-u.value.b),_=z(()=>(t.series??[]).map((e,t)=>({name:e.name,color:n[t%n.length],points:(e.data??[]).map((e,t)=>`${h(t)},${g(e)}`).join(` `),dots:(e.data??[]).map((e,t)=>({cx:h(t),cy:g(e)}))}))),v=z(()=>[0,.5,1].map(e=>Math.round(l.value*e))),y=z(()=>{let e=b(d.value),t=b(f.value);return{x:e,width:Math.max(2,t-e)}}),b=e=>{let n=a.value-u.value.l-u.value.r,r=Math.max(1,(t.labels?.length??1)-1);return u.value.l+e/r*n},x=X(null),S=X(!1),C=X(!1),w=X(0),T=X(0),ee=X(!1),E=X(null);function te(e,t=i.value??null){let n=t?.getBoundingClientRect();return!n||n.width===0?0:(e.clientX-n.left)*(a.value/n.width)}function D(e){let t=a.value-u.value.l-u.value.r,n=(e-u.value.l)/(t||1),r=d.value+n*m.value;return Math.min(c.value-1,Math.max(0,Math.round(r)))}function ne(e){let t=a.value-u.value.l-u.value.r,n=(e-u.value.l)/(t||1);return Math.min(c.value-1,Math.max(0,Math.round(n*(c.value-1))))}function re(e){let t=te(e);C.value?T.value=t:x.value=D(t)}function ie(){C.value||(x.value=null)}function A(e){if(c.value<=1)return;let t=te(e);C.value=!0,w.value=t,T.value=t,e.currentTarget?.setPointerCapture?.(e.pointerId)}function ae(){if(!C.value)return;let e=Math.min(w.value,T.value),t=Math.max(w.value,T.value);if(t-e>8){let n=D(e),r=D(t),i=Math.min(n,r),a=Math.max(n,r);a-i>=1&&(d.value=i,f.value=a)}C.value=!1}function oe(){C.value=!1,x.value=null}function se(e){if(c.value<=1)return;let t=D(te(e)),n=m.value,r=e.deltaY>0?1.25:.8,i=Math.min(c.value-1,Math.max(1,n*r)),a=t-(t-d.value)/n*i,o=a+i;a<0&&(a=0,o=i),o>c.value-1&&(o=c.value-1,a=o-i),d.value=Math.max(0,a),f.value=Math.min(c.value-1,Math.max(d.value+1e-6,o))}function M(e){if(c.value<=1)return;let t=e.currentTarget,n=te(e,t),r=b(d.value),i=b(f.value);if(n>=r&&n<=i)ee.value=!0,E.value={x:n,lo:d.value,hi:f.value},t.setPointerCapture?.(e.pointerId);else{let e=ne(n),t=f.value-d.value,r=e-t/2,i=e+t/2;r<0&&(r=0,i=t),i>c.value-1&&(i=c.value-1,r=i-t),d.value=Math.max(0,r),f.value=Math.min(c.value-1,Math.max(d.value+1e-6,i))}}function ce(e){if(!ee.value||!E.value)return;let t=te(e,e.currentTarget),n=a.value-u.value.l-u.value.r,r=(t-E.value.x)/(n||1)*(c.value-1),i=E.value.hi-E.value.lo,o=E.value.lo+r,s=o+i;o<0&&(o=0,s=i),s>c.value-1&&(s=c.value-1,o=s-i),d.value=Math.max(0,o),f.value=Math.min(c.value-1,Math.max(d.value+1e-6,s))}function le(){ee.value=!1,E.value=null}let ue=z(()=>(t.series??[]).map((e,t)=>({name:e.name,color:n[t%n.length],points:(e.data??[]).map((e,t)=>`${b(t)},${4+(1-e/l.value)*36}`).join(` `)}))),de=z(()=>{if(x.value===null)return null;let e=x.value,r=t.labels??[],i=t.series??[];return e<0||e>=r.length?null:{index:e,label:r[e],values:i.map((t,r)=>({name:t.name,value:t.data?.[e],color:n[r%n.length]})),x:h(e),y:g(i[0]?.data?.[e]??0)}}),fe=z(()=>{if(!de.value)return{};let e=de.value,t=Math.min(82,e.x/a.value*100),n=Math.max(0,e.y/s.value*100-12);return{left:`${t}%`,top:`${n}%`}});return(t,n)=>(V(),q(`figure`,{ref_key:`host`,ref:r,class:`line`,"data-swipe-ignore":``},[K(`div`,_ae,[K(`button`,{type:`button`,class:O([`tool`,{active:S.value}]),title:`Миникарта`,onClick:n[0]||=e=>S.value=!S.value},` Карта `,2),K(`button`,{type:`button`,class:`tool`,title:`Сбросить масштаб`,onClick:n[1]||=e=>p()},`↺`)]),(V(),q(`svg`,{ref_key:`svgEl`,ref:i,viewBox:`0 0 ${a.value} ${s.value}`,role:`img`,onPointermove:re,onPointerdown:A,onPointerup:ae,onPointercancel:oe,onPointerleave:ie,onWheel:Z(se,[`prevent`])},[(V(!0),q(W,null,J(v.value,e=>(V(),q(`g`,{key:e},[K(`line`,{x1:u.value.l,x2:a.value-u.value.r,y1:g(e),y2:g(e),class:`grid`},null,8,yae),K(`text`,{x:u.value.l-6,y:g(e)+3,class:`axis`,"text-anchor":`end`},j(e),9,bae)]))),128)),(V(!0),q(W,null,J(e.labels,(e,t)=>(V(),q(`text`,{key:e,x:h(t),y:s.value-6,class:`axis`,"text-anchor":`middle`},j(e),9,xae))),128)),(V(!0),q(W,null,J(_.value,e=>(V(),q(`polyline`,{key:e.name,points:e.points,stroke:e.color,fill:`none`,"stroke-width":`2`,"stroke-linejoin":`round`},null,8,Sae))),128)),(V(!0),q(W,null,J(_.value,e=>(V(),q(`g`,{key:`${e.name}-dots`,fill:e.color},[(V(!0),q(W,null,J(e.dots,(e,t)=>(V(),q(`circle`,{key:t,cx:e.cx,cy:e.cy,r:x.value===t?4.5:2.5,opacity:x.value===null||x.value===t?1:.35},null,8,wae))),128))],8,Cae))),128)),de.value?(V(),q(`line`,{key:0,x1:de.value.x,x2:de.value.x,y1:u.value.t,y2:s.value-u.value.b,class:`guide`},null,8,Tae)):B(``,!0),C.value?(V(),q(`rect`,{key:1,x:Math.min(w.value,T.value),y:u.value.t,width:Math.abs(T.value-w.value),height:s.value-u.value.t-u.value.b,class:`brush`},null,8,Eae)):B(``,!0)],40,vae)),S.value?(V(),q(`svg`,{key:0,class:`minimap`,viewBox:`0 0 ${a.value} ${jae}`,role:`img`,onPointerdown:M,onPointermove:ce,onPointerup:le,onPointercancel:le,onPointerleave:le},[(V(!0),q(W,null,J(ue.value,e=>(V(),q(`polyline`,{key:e.name,points:e.points,stroke:e.color,fill:`none`,"stroke-width":`1.5`,"stroke-linejoin":`round`,opacity:`0.6`},null,8,Oae))),128)),K(`rect`,{x:y.value.x,y:`2`,width:y.value.width,height:40,class:`mini-viewport`},null,8,kae)],40,Dae)):B(``,!0),de.value?(V(),q(`div`,{key:1,class:`tooltip`,style:k(fe.value)},[K(`div`,Aae,j(de.value.label),1),(V(!0),q(W,null,J(de.value.values,e=>(V(),q(`div`,{key:e.name,class:`tt-row`},[K(`i`,{style:k({background:e.color})},null,4),N(j(e.name)+`: `,1),K(`strong`,null,j(e.value),1)]))),128))],4)):B(``,!0),K(`figcaption`,null,[(V(!0),q(W,null,J(_.value,e=>(V(),q(`span`,{key:e.name},[K(`i`,{style:k({background:e.color})},null,4),N(j(e.name),1)]))),128))])],512))}}),[[`__scopeId`,`data-v-8e51f92e`]])},Nae={definition:Zm({name:`Row`,group:`layout`,summary:`ряд с переносом по ширине (показатели кладут в него)`,props:{gap:{type:`number`,description:`отступ в пикселях`}},slot:`элементы ряда`,example:`<Row><Stat label="A" value="1" /><Stat label="B" value="2" /></Row>`}),component:G(M({__name:`Row`,props:{gap:{}},setup(e){return(t,n)=>(V(),q(`div`,{class:`row`,style:k(e.gap===void 0?void 0:{gap:`${e.gap}px`})},[L(t.$slots,`default`,{},void 0,!0)],4))}}),[[`__scopeId`,`data-v-449aa2ae`]])},Pae=Zm({name:`SafeSecretShow`,group:`data`,summary:`секрет от агента: показывает пользователю значение, которое вернёт скрипт, не попадая ни в чат, ни к агенту`,props:{script:{type:`string`,description:`shell-команда, чей stdout — секрет; выполняется на машине пользователя`,required:!0},label:{type:`string`,description:`название секрета в панели`},comment:{type:`string`,description:`комментарий агента пользователю`}},special:!0,notes:[`Секрет не попадает в ответ, историю чата и контекст агента: скрипт выполняется на сервере, а значение показывается только в браузере пользователя.`,`Скрипт запускается только по нажатию «Показать секрет»; команда видна под кнопкой. Значение хранится лишь в открытом окне.`],example:`<SafeSecretShow script="cat ~/.ssh/id_ed25519" label="Приватный ключ SSH" comment="Скопируйте ключ в сервис." />`}),Fae={class:`title`},Iae={key:0,class:`comment`},Lae={key:0,class:`error`,role:`alert`},Rae={key:1,class:`detail`},zae={class:`command`},Bae={definition:Pae,component:G(M({__name:`SafeSecretShow`,props:{script:{},label:{},comment:{}},setup(e){let t=e,n=tt(Bm,void 0),i=X(``),a=X(``),o=X(``),s=X(!1);async function c(){if(!s.value){s.value=!0,a.value=``,o.value=``;try{let e=await fetch(`/api/agent/secret-show/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({script:t.script,...t.label?{label:t.label}:{},...t.comment?{comment:t.comment}:{},...n?.value?{projectId:n.value}:{}})}),r=await e.json().catch(()=>({}));if(!e.ok)throw o.value=typeof r.detail==`string`?r.detail:``,Error(typeof r.error==`string`?r.error:`Секрет недоступен`);if(typeof r.secret!=`string`||!r.secret)throw Error(`Сервер не вернул секрет`);i.value=r.secret}catch(e){a.value=e instanceof Error?e.message:`Не удалось получить секрет`}finally{s.value=!1}}}return(t,n)=>(V(),Y(l,{as:`section`,tone:`warning`,density:`notice`,class:`secret-widget`},{default:F(()=>[I(r,{as:`header`,align:`center`,justify:`normal`},{default:F(()=>[I(H(Xj),{"aria-hidden":`true`}),K(`span`,Fae,j(e.label||`Секрет`),1)]),_:1}),e.comment?(V(),q(`p`,Iae,j(e.comment),1)):B(``,!0),n[1]||=K(`p`,{class:`note`},`Секрет не попадает в чат и к агенту.`,-1),i.value?(V(),Y(EN,{key:1,value:i.value,label:e.label||`Секрет`},null,8,[`value`,`label`])):(V(),q(W,{key:2},[a.value?(V(),q(`p`,Lae,j(a.value),1)):B(``,!0),o.value?(V(),q(`pre`,Rae,j(o.value),1)):B(``,!0),K(`details`,zae,[n[0]||=K(`summary`,null,`Команда`,-1),K(`pre`,null,j(e.script),1)]),I(Q,{type:`button`,size:`sm`,appearance:`solid`,busy:s.value,disabled:!e.script.trim(),onClick:c},{default:F(()=>[N(j(a.value?`Повторить`:`Показать секрет`),1)]),_:1},8,[`busy`,`disabled`])],64))]),_:1}))}}),[[`__scopeId`,`data-v-c2c8e120`]])},Vae=Zm({name:`Slider`,group:`form`,summary:`число на шкале`,hidden:!0,props:{label:{type:`string`,description:`подпись`},min:{type:`number`,description:`минимум, по умолчанию 0`},max:{type:`number`,description:`максимум, по умолчанию 100`},step:{type:`number`,description:`шаг`},unit:{type:`string`,description:`единица рядом со значением`},name:{type:`string`,description:`имя поля в <Form>`},initial:{type:`number`,description:`начальное значение, по умолчанию min`}},model:{type:`number`,description:`текущее значение`},example:`<Slider name="port" label="Порт" :min="3000" :max="9000" unit="" :initial="4000" />`}),Hae={class:`slider`},Uae={class:`head`},Wae=[`name`,`min`,`max`,`step`],Gae={definition:Vae,component:G(M({__name:`Slider`,props:yt({label:{},min:{},max:{},step:{},unit:{},name:{},initial:{}},{modelValue:{},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=e,n=Te(e,`modelValue`);return U9(t.name,n,t.initial??t.min??0),(t,r)=>(V(),q(`label`,Hae,[K(`span`,Uae,[K(`span`,null,j(e.label),1),K(`output`,null,j(n.value)+j(e.unit??``),1)]),et(K(`input`,{"onUpdate:modelValue":r[0]||=e=>n.value=e,type:`range`,name:e.name,min:e.min??0,max:e.max??100,step:e.step??1},null,8,Wae),[[_n,n.value,void 0,{number:!0}]])]))}}),[[`__scopeId`,`data-v-a1dacb9a`]])},Kae=Zm({name:`Stat`,group:`data`,summary:`показатель: подпись, значение, изменение`,props:{label:{type:`string`,description:`подпись`,required:!0},value:{type:`string | number`,description:`значение`,required:!0},delta:{type:`number`,description:`изменение в процентах: число без знака %, например 3.6, знак задаёт цвет`},hint:{type:`string`,description:`пояснение мелким шрифтом`}},example:`<Stat label="Выручка" value="4,2 млн" :delta="12" hint="к прошлому кварталу" />`}),qae={class:`stat`},Jae={class:`label`},Yae={class:`value`},Xae={key:1,class:`hint`},Zae={definition:Kae,component:G(M({__name:`Stat`,props:{label:{},value:{},delta:{},hint:{}},setup(e){return(t,n)=>(V(),q(`div`,qae,[K(`span`,Jae,j(e.label),1),K(`strong`,Yae,j(e.value),1),e.delta===void 0?B(``,!0):(V(),q(`span`,{key:0,class:O([`delta`,e.delta>=0?`up`:`down`])},j(e.delta>=0?`▲`:`▼`)+` `+j(Math.abs(e.delta))+`% `,3)),e.hint?(V(),q(`span`,Xae,j(e.hint),1)):B(``,!0)]))}}),[[`__scopeId`,`data-v-336138f7`]])},Qae=Zm({name:`Steps`,group:`data`,summary:`этапы с отметкой готовности`,props:{items:{type:`array`,description:`массив объектов: title обязателен, text и done необязательны`,required:!0}},example:`<Steps :items="[{title:'Собрать',done:true},{title:'Проверить'}]" />`}),$ae={class:`steps`},eoe={class:`dot`},toe={key:0},noe={definition:Qae,component:G(M({__name:`Steps`,props:{items:{}},setup(e){return(t,n)=>(V(),q(`ol`,$ae,[(V(!0),q(W,null,J(e.items,(e,t)=>(V(),q(`li`,{key:e.title,class:O({done:e.done})},[K(`span`,eoe,j(e.done?`✓`:t+1),1),K(`div`,null,[K(`strong`,null,j(e.title),1),e.text?(V(),q(`p`,toe,j(e.text),1)):B(``,!0)])],2))),128))]))}}),[[`__scopeId`,`data-v-c4ae2960`]])},roe=Zm({name:`Tab`,group:`layout`,summary:`одна вкладка внутри <Tabs>`,props:{title:{type:`string`,description:`название вкладки`,required:!0},hint:{type:`string`,description:`подсказка при наведении`}},slot:`содержимое вкладки`,example:`<Tab title="Данные">Значения за месяц</Tab>`}),K9=Symbol(`agent-widget-tabs`),ioe={class:`panel`,role:`tabpanel`},aoe={definition:roe,component:G(M({__name:`Tab`,props:{title:{},hint:{}},setup(e){let t=e,n=tt(K9,null);n&<(n.register(t.title,t.hint));let r=z(()=>!n||n.active.value===t.title);return(e,t)=>et((V(),q(`div`,ioe,[L(e.$slots,`default`,{},void 0,!0)],512)),[[Ln,r.value]])}}),[[`__scopeId`,`data-v-b169aab5`]])},ooe=Zm({name:`Tabs`,group:`layout`,summary:`вкладки с содержимым в компонентах Tab`,props:{options:{type:`array`,description:`массив строк или объектов: value обязателен, label и hint необязательны; без дочерних Tab это устаревший переключатель`},name:{type:`string`,description:`имя поля в <Form> (устаревший переключатель)`},initial:{type:`string`,description:`начальное значение (устаревший переключатель)`}},model:{type:`string`,description:`выбранная вкладка или значение`},slot:`дочерний компонент Tab с названием title и содержимым для каждой вкладки`,notes:[`Скрытая вкладка сохраняет введённое. Для переключателя значения используй Field с type=segmented или radio.`],guide:`Дочерние Tab с title; скрытая вкладка сохраняет введённое.
|
|
177
|
+
Для выбора значения используй Field type=segmented или radio.`,example:`<Tabs><Tab title="Данные">Значения за месяц</Tab><Tab title="Итоги">Всего 100</Tab></Tabs>`}),soe={class:`tabs-host`},coe={class:`tabs`,role:`tablist`},loe=[`aria-selected`,`title`,`onClick`],uoe={definition:ooe,component:G(M({__name:`Tabs`,props:yt({options:{},name:{},initial:{}},{modelValue:{},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=e,n=Te(e,`modelValue`),r=t.options!==void 0,i=z(()=>W9(t.options)),a=X([]);r&&U9(t.name,n,t.initial??i.value[0]?.value??``);let o=z(()=>r?i.value:a.value),s=z(()=>n.value??t.initial??o.value[0]?.value);return ot(K9,{active:s,register(e,t){let n={value:e,hint:t};return a.value=[...a.value,n],()=>a.value=a.value.filter(e=>e!==n)}}),(e,t)=>(V(),q(`div`,soe,[K(`div`,coe,[(V(!0),q(W,null,J(o.value,e=>(V(),q(`button`,{key:e.value,type:`button`,role:`tab`,"aria-selected":s.value===e.value,class:O({on:s.value===e.value}),title:e.hint,onClick:t=>n.value=e.value},j(e.label??e.value),11,loe))),128))]),L(e.$slots,`default`,{},void 0,!0)]))}}),[[`__scopeId`,`data-v-aae120c4`]])};function doe(){for(let e of[ere,nre,sre,pre,Wre,qre,Jre,Eie,kie,qie,tae,aae,dae,hae,Mae,Nae,Bae,Gae,Zae,noe,aoe,uoe])rh(e)}var foe={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function poe(e,t){return V(),q(`svg`,foe,[...t[0]||=[K(`path`,{fill:`currentColor`,d:`m4.714 15.956l4.718-2.648l.079-.23l-.08-.128h-.23l-.79-.048l-2.695-.073l-2.337-.097l-2.265-.122l-.57-.121l-.535-.704l.055-.353l.48-.321l.685.06l1.518.104l2.277.157l1.651.098l2.447.255h.389l.054-.158l-.133-.097l-.103-.098l-2.356-1.596l-2.55-1.688l-1.336-.972l-.722-.491L2 6.223l-.158-1.008l.656-.722l.88.06l.224.061l.893.686l1.906 1.476l2.49 1.833l.364.304l.146-.104l.018-.072l-.164-.274l-1.354-2.446l-1.445-2.49l-.644-1.032l-.17-.619a3 3 0 0 1-.103-.729L6.287.133L6.7 0l.995.134l.42.364l.619 1.415L9.735 4.14l1.555 3.03l.455.898l.243.832l.09.255h.159V9.01l.127-1.706l.237-2.095l.23-2.695l.08-.76l.376-.91l.747-.492l.583.28l.48.685l-.067.444l-.286 1.851l-.558 2.903l-.365 1.942h.213l.243-.242l.983-1.306l1.652-2.064l.728-.82l.85-.904l.547-.431h1.032l.759 1.129l-.34 1.166l-1.063 1.347l-.88 1.142l-1.263 1.7l-.79 1.36l.074.11l.188-.02l2.853-.606l1.542-.28l1.84-.315l.832.388l.09.395l-.327.807l-1.967.486l-2.307.462l-3.436.813l-.043.03l.049.061l1.548.146l.662.036h1.62l3.018.225l.79.522l.473.638l-.08.485l-1.213.62l-1.64-.389l-3.825-.91l-1.31-.329h-.183v.11l1.093 1.068l2.003 1.81l2.508 2.33l.127.578l-.321.455l-.34-.049l-2.204-1.657l-.85-.747l-1.925-1.62h-.127v.17l.443.649l2.343 3.521l.122 1.08l-.17.353l-.607.213l-.668-.122l-1.372-1.924l-1.415-2.168l-1.141-1.943l-.14.08l-.674 7.254l-.316.37l-.728.28l-.607-.461l-.322-.747l.322-1.476l.388-1.924l.316-1.53l.285-1.9l.17-.632l-.012-.042l-.14.018l-1.432 1.967l-2.18 2.945l-1.724 1.845l-.413.164l-.716-.37l.066-.662l.401-.589l2.386-3.036l1.439-1.882l.929-1.086l-.006-.158h-.055L4.138 18.56l-1.13.146l-.485-.456l.06-.746l.231-.243l1.907-1.312Z`},null,-1)]])}var q9=U({name:`simple-icons-claude`,render:poe}),moe={pending:`pending`,in_progress:`in_progress`,completed:`completed`};function hoe(e){if(e.name!==`TodoWrite`||!e.input)return;let t;try{t=JSON.parse(e.input)}catch{return}let n=t.todos;if(Array.isArray(n))return n.flatMap(e=>{if(!e||typeof e!=`object`)return[];let{content:t,status:n,activeForm:r}=e,i=typeof n==`string`?moe[n]:void 0;return typeof t!=`string`||!t.trim()||!i?[]:[{content:t,status:i,...typeof r==`string`?{active:r}:{}}]})}function J9(e,t,n){return{name:e.name,label:e.shortLabel,remaining:Math.round(100-t.usedPercent),countdown:b5(t.resetsAt,n),limited:t.limited??!1,ticks:e.ticks,tone:$8(t.usedPercent,t.resetsAt,e.periodSeconds,n,t.limited)}}function goe(e){let t=We(e.initial),n=z(()=>!e.failed()&&e.usage()?.status===`ready`?e.windows():void 0),r=z(()=>e.definitions.flatMap(t=>{let r=n.value?.[t.name];return r?[J9(t,r,e.now())]:[]})),i=z(()=>r.value.find(e=>e.name===t.value)??r.value[0]),a=z(()=>i.value?.name??t.value),o=z(()=>e.definitions.find(e=>e.name===a.value)??e.definitions[0]),s=z(()=>i.value?.remaining??null),c=z(()=>i.value?.tone??null),l=z(()=>{let t=`${e.title} · ${o.value.label}`;if(e.failed())return`${t}\nНе удалось обновить лимиты`;let i=e.usage();return i?n.value?[`${t} · остаток`,...r.value.map(t=>{let r=e.definitions.find(e=>e.name===t.name),i=n.value?.[r.name];return`${r.label}: ${t.remaining}%${t.limited?` · исчерпан`:``} · ${t.countdown} (${x5(i?.resetsAt)})`}),`Клик — сменить лимит`].join(`
|
|
178
|
+
`):`${t}\n${i.message??`Лимиты недоступны`}`:`${t}\nЗагрузка лимитов…`});function u(){let n=new Set(r.value.map(e=>e.name)),i=e.cycleOrder.filter(e=>n.has(e)),o=a.value,s=i.length?i:e.cycleOrder,c=s.indexOf(o);return t.value=s[(c+1)%s.length],{window:t.value}}return{selectedWindow:t,selected:o,remaining:s,tone:c,tooltipRows:r,tooltip:l,cycle:u}}function Y9(e){let{usage:t,failed:n}=N6(e.endpoint,e.polling),r=du({scheduler:e=>ql(e,1e3)}),i=goe({title:e.title,definitions:e.definitions,cycleOrder:e.cycleOrder,initial:e.initial,usage:()=>e.usage(t.value),windows:()=>e.windows(t.value),failed:()=>n.value,now:()=>r.value.getTime()}),a=E(`${e.agent}Usage:${P()}`,()=>({surface:`statusBar`,window:i.selectedWindow.value}));return a.scope.registerCommand({...e.command,run:i.cycle}),M6(e.agent,i.remaining,i.tone),{usage:t,failed:n,commands:a,...i}}var _oe={backend:`claude-code`,program:`claude`,title:`Claude Code`,caption:`Запустит агента Anthropic`,icon:q9,usage:M({__name:`ClaudeUsageIndicator`,setup(e){let t=Array.from({length:6},(e,t)=>(t+1)/7*100),{selected:n,remaining:r,tone:i,tooltipRows:a,tooltip:o,commands:s}=Y9({agent:`claude`,title:`Claude Code`,endpoint:`/api/claude/usage`,polling:{intervalMs:3e5,nextCheckAt:e=>e.nextCheckAt},definitions:[{name:`rolling`,label:`5 часов`,shortLabel:`5ч`,periodSeconds:Q8.hours5,ticks:[20,40,60,80]},{name:`weekly`,label:`Неделя`,shortLabel:`нед`,periodSeconds:Q8.week,ticks:t}],cycleOrder:[`rolling`,`weekly`],initial:`weekly`,usage:e=>e,windows:e=>e?.windows,command:{id:`ide.claude.usage.window.cycle`,title:`Переключить отображаемый лимит Claude Code`,description:`Меняет окно индикатора Claude Code в статусной строке: 5 часов → неделя. Не запрашивает лимиты заново.`}});return(e,t)=>(V(),Y(O6,{class:`claude-usage`,title:`Claude Code`,tooltip:H(o),remaining:H(r),tone:H(i),prefix:H(n).shortLabel,"meter-label":`Остаток лимита Claude Code: ${H(n).label}`,rows:H(a),interactive:``,onCycle:t[0]||=e=>H(s).run(`ide.claude.usage.window.cycle`)},{icon:F(()=>[I(H(q9))]),_:1},8,[`tooltip`,`remaining`,`tone`,`prefix`,`meter-label`,`rows`]))}}),usageUrl:`/api/claude/usage`,plan:hoe},voe={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function yoe(e,t){return V(),q(`svg`,voe,[...t[0]||=[K(`path`,{fill:`currentColor`,d:`M22.282 9.821a6 6 0 0 0-.516-4.91a6.05 6.05 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a6 6 0 0 0-3.998 2.9a6.05 6.05 0 0 0 .743 7.097a5.98 5.98 0 0 0 .51 4.911a6.05 6.05 0 0 0 6.515 2.9A6 6 0 0 0 13.26 24a6.06 6.06 0 0 0 5.772-4.206a6 6 0 0 0 3.997-2.9a6.06 6.06 0 0 0-.747-7.073M13.26 22.43a4.48 4.48 0 0 1-2.876-1.04l.141-.081l4.779-2.758a.8.8 0 0 0 .392-.681v-6.737l2.02 1.168a.07.07 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494M3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085l4.783 2.759a.77.77 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646M2.34 7.896a4.5 4.5 0 0 1 2.366-1.973V11.6a.77.77 0 0 0 .388.677l5.815 3.354l-2.02 1.168a.08.08 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.08.08 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667m2.01-3.023l-.141-.085l-4.774-2.782a.78.78 0 0 0-.785 0L9.409 9.23V6.897a.07.07 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.8.8 0 0 0-.393.681zm1.097-2.365l2.602-1.5l2.607 1.5v2.999l-2.597 1.5l-2.607-1.5Z`},null,-1)]])}var X9=U({name:`simple-icons-openai`,render:yoe}),boe={backend:`codex`,program:`codex`,title:`Codex`,caption:`Запустит агента OpenAI Codex`,icon:X9,usage:M({__name:`CodexUsageIndicator`,setup(e){let{usage:t,failed:n}=N6(`/api/codex/usage`),r=du({scheduler:e=>ql(e,1e3)}),i=z(()=>t.value?.weekly??null),a=z(()=>{let e=i.value?.windowDurationMins;return typeof e==`number`&&Number.isFinite(e)&&e>0?e*60:Q8.week}),o=z(()=>n.value||t.value?.status!==`ready`||!i.value?null:J9({name:`weekly`,label:`Неделя`,shortLabel:`нед`,periodSeconds:a.value,ticks:Array.from({length:6},(e,t)=>(t+1)/7*100)},i.value,r.value.getTime())),s=z(()=>o.value?.remaining??null),c=z(()=>o.value?.tone??null),l=z(()=>o.value?[o.value]:[]);M6(`codex`,s,c);let u=z(()=>{if(n.value)return`Codex: не удалось обновить недельный лимит`;if(!t.value)return`Codex: загрузка недельного лимита…`;if(s.value===null)return`Codex: ${t.value.message??`лимит недоступен`}`;let e=i.value?.resetsAt;return`Codex · неделя · осталось ${s.value}%\nСброс через ${o.value?.countdown} · ${x5(e)}`});return(e,t)=>(V(),Y(O6,{class:`codex-usage`,title:`Codex`,tooltip:u.value,remaining:s.value,tone:c.value,"meter-label":`Остаток недельного лимита Codex`,rows:l.value,compact:``},{icon:F(()=>[I(H(X9))]),_:1},8,[`tooltip`,`remaining`,`tone`,`rows`]))}}),usageUrl:`/api/codex/usage`},xoe={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Soe(e,t){return V(),q(`svg`,xoe,[...t[0]||=[K(`path`,{fill:`currentColor`,d:`M22 24H2V0h20zM17 4.8H7v14.4h10z`},null,-1)]])}var Z9=U({name:`simple-icons-opencode`,render:Soe}),Coe={backend:`opencode`,program:`opencode`,title:`OpenCode`,caption:`Запустит агента OpenCode`,icon:Z9,usage:M({__name:`OpenCodeUsageIndicator`,setup(e){let t=Array.from({length:6},(e,t)=>(t+1)/7*100),n=[7,14,21,28].map(e=>e/30*100),{selected:r,remaining:i,tone:a,tooltipRows:o,tooltip:s,commands:c}=Y9({agent:`opencode`,title:`OpenCode Go`,endpoint:`/api/opencode/usage`,definitions:[{name:`rolling`,label:`5 часов`,shortLabel:`5ч`,periodSeconds:Q8.hours5,ticks:[20,40,60,80]},{name:`weekly`,label:`Неделя`,shortLabel:`нед`,periodSeconds:Q8.week,ticks:t},{name:`monthly`,label:`Месяц`,shortLabel:`мес`,periodSeconds:Q8.month,ticks:n}],cycleOrder:[`monthly`,`rolling`,`weekly`],initial:`weekly`,usage:e=>e,windows:e=>e?.windows,command:{id:`ide.opencode.usage.window.cycle`,title:`Переключить отображаемый лимит OpenCode Go`,description:`Меняет окно индикатора Go в статусной строке: месяц → 5 часов → неделя. Не запрашивает лимиты заново.`}});return(e,t)=>(V(),Y(O6,{class:`opencode-usage`,title:`OpenCode Go`,tooltip:H(s),remaining:H(i),tone:H(a),prefix:H(r).shortLabel,"meter-label":`Остаток лимита OpenCode Go: ${H(r).label}`,rows:H(o),interactive:``,onCycle:t[0]||=e=>H(c).run(`ide.opencode.usage.window.cycle`)},{icon:F(()=>[I(H(Z9))]),_:1},8,[`tooltip`,`remaining`,`tone`,`prefix`,`meter-label`,`rows`]))}}),usageUrl:`/api/opencode/usage`},woe={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function Toe(e,t){return V(),q(`svg`,woe,[...t[0]||=[K(`path`,{fill:`currentColor`,d:`M11.503.131L1.891 5.678a.84.84 0 0 0-.42.726v11.188c0 .3.162.575.42.724l9.609 5.55a1 1 0 0 0 .998 0l9.61-5.55a.84.84 0 0 0 .42-.724V6.404a.84.84 0 0 0-.42-.726L12.497.131a1.01 1.01 0 0 0-.996 0M2.657 6.338h18.55c.263 0 .43.287.297.515L12.23 22.918c-.062.107-.229.064-.229-.06V12.335a.59.59 0 0 0-.295-.51l-9.11-5.257c-.109-.063-.064-.23.061-.23`},null,-1)]])}var Q9=U({name:`simple-icons-cursor`,render:Toe}),Eoe={pending:`pending`,in_progress:`in_progress`,completed:`completed`},Doe=new Set([`create_plan`,`update_todos`]);function Ooe(e){if(!Doe.has(e.name)||!e.input)return;let t;try{t=JSON.parse(e.input)}catch{return}let n=t.todos;if(Array.isArray(n))return n.flatMap(e=>{if(!e||typeof e!=`object`)return[];let{content:t,status:n}=e,r=typeof n==`string`?Eoe[n]:void 0;return typeof t!=`string`||!t.trim()||!r?[]:[{content:t,status:r}]})}var koe={backend:`cursor`,program:`cursor`,title:`Cursor`,caption:`Запустит агента Cursor`,icon:Q9,usage:M({__name:`CursorUsageIndicator`,setup(e){let t=[7,14,21,28].map(e=>e/30*100),{selected:n,remaining:r,tone:i,tooltipRows:a,tooltip:o,commands:s}=Y9({agent:`cursor`,title:`Cursor`,endpoint:`/api/cursor/usage`,definitions:[{name:`total`,label:`Всего`,shortLabel:`вс`,periodSeconds:Q8.month,ticks:t},{name:`auto`,label:`Авто`,shortLabel:`авт`,periodSeconds:Q8.month,ticks:t},{name:`api`,label:`API`,shortLabel:`API`,periodSeconds:Q8.month,ticks:t}],cycleOrder:[`total`,`auto`,`api`],initial:`total`,usage:e=>e,windows:e=>e?.windows,command:{id:`ide.cursor.usage.window.cycle`,title:`Переключить отображаемый лимит Cursor`,description:`Меняет окно индикатора Cursor в статусной строке: всего → авто → API. Не запрашивает лимиты заново.`}});return(e,t)=>(V(),Y(O6,{class:`cursor-usage`,title:`Cursor`,tooltip:H(o),remaining:H(r),tone:H(i),prefix:H(n).shortLabel,"meter-label":`Остаток лимита Cursor: ${H(n).label}`,rows:H(a),interactive:``,onCycle:t[0]||=e=>H(s).run(`ide.cursor.usage.window.cycle`)},{icon:F(()=>[I(H(Q9))]),_:1},8,[`tooltip`,`remaining`,`tone`,`prefix`,`meter-label`,`rows`]))}}),usageUrl:`/api/cursor/usage`,plan:Ooe},Aoe={viewBox:`0 0 24 24`,width:`1.2em`,height:`1.2em`};function joe(e,t){return V(),q(`svg`,Aoe,[...t[0]||=[K(`path`,{fill:`currentColor`,d:`M21.765.351C22.998.351 24 1.353 24 2.586S22.998 4.82 21.765 4.82h-1.974c-.15 0-.26-.12-.26-.26V2.586A2.237 2.237 0 0 1 21.765.35M9.41 13.388l8.447-8.377c.16-.16.07-.471-.14-.471h-4.55s-.1.02-.14.06l-9.099 9.029c-.14.14-.35.02-.35-.21V4.81c0-.15-.1-.27-.221-.27H.22c-.12 0-.22.12-.22.27v18.57c0 .15.1.27.22.27h3.137c.12 0 .22-.12.22-.27v-3.79c0-.08.03-.16.08-.21l2.826-2.796c.07-.07.16-.08.241-.03l7.546 5.551a8.9 8.9 0 0 0 4.018 1.493c.12.01.23-.11.23-.27V19.76c0-.14-.08-.25-.19-.26a5.8 5.8 0 0 1-2.355-.942l-6.533-4.73c-.14-.09-.15-.32-.03-.441`},null,-1)]])}var $9=U({name:`simple-icons-kimi`,render:joe}),Moe={pending:`pending`,in_progress:`in_progress`,done:`completed`};function Noe(e){if(e.name!==`TodoList`||!e.input)return;let t;try{t=JSON.parse(e.input)}catch{return}let n=t.todos;if(Array.isArray(n))return n.flatMap(e=>{if(!e||typeof e!=`object`)return[];let{title:t,status:n}=e,r=typeof n==`string`?Moe[n]:void 0;return typeof t!=`string`||!t.trim()||!r?[]:[{content:t,status:r}]})}var Poe={backend:`kimi`,program:`kimi`,title:`Kimi`,caption:`Запустит агента Kimi Code`,icon:$9,usage:M({__name:`KimiUsageIndicator`,setup(e){let t=Array.from({length:6},(e,t)=>(t+1)/7*100),n=[7,14,21,28].map(e=>e/30*100),{selected:r,remaining:i,tone:a,tooltipRows:o,tooltip:s,commands:c}=Y9({agent:`kimi`,title:`Kimi`,endpoint:`/api/kimi/usage`,definitions:[{name:`rolling`,label:`5 часов`,shortLabel:`5ч`,periodSeconds:Q8.hours5,ticks:[20,40,60,80]},{name:`weekly`,label:`Неделя`,shortLabel:`нед`,periodSeconds:Q8.week,ticks:t},{name:`monthly`,label:`Месяц`,shortLabel:`мес`,periodSeconds:Q8.month,ticks:n}],cycleOrder:[`rolling`,`weekly`,`monthly`],initial:`rolling`,usage:e=>e,windows:e=>e?.windows,command:{id:`ide.kimi.usage.window.cycle`,title:`Переключить отображаемый лимит Kimi`,description:`Меняет окно индикатора Kimi в статусной строке: 5 часов → неделя → месяц, пропуская окна, которых нет на тарифе. Не запрашивает лимиты заново.`}});return(e,t)=>(V(),Y(O6,{class:`kimi-usage`,title:`Kimi`,tooltip:H(s),remaining:H(i),tone:H(a),prefix:H(r).shortLabel,"meter-label":`Остаток лимита Kimi: ${H(r).label}`,rows:H(o),interactive:``,onCycle:t[0]||=e=>H(c).run(`ide.kimi.usage.window.cycle`)},{icon:F(()=>[I(H($9))]),_:1},8,[`tooltip`,`remaining`,`tone`,`prefix`,`meter-label`,`rows`]))}}),usageUrl:`/api/kimi/usage`,plan:Noe},Foe={pending:`pending`,in_progress:`in_progress`,completed:`completed`};function Ioe(e){if(e.name!==`TodoWrite`||!e.input)return;let t;try{t=JSON.parse(e.input)}catch{return}let n=t.todos;if(Array.isArray(n))return n.flatMap(e=>{if(!e||typeof e!=`object`)return[];let{content:t,status:n,activeForm:r}=e,i=typeof n==`string`?Foe[n]:void 0;return typeof t!=`string`||!t.trim()||!i?[]:[{content:t,status:i,...typeof r==`string`?{active:r}:{}}]})}var Loe={backend:`projector`,program:`projector`,title:`Projector`,caption:`Встроенный агент Projector, история разговоров`,icon:aw,builtin:!0,plan:Ioe};function Roe(){for(let e of[Loe,_oe,boe,Coe,koe,Poe])Zn(e)}window.fetch=fL,n(),doe(),Roe(),yee(),jn(MF).use(Yne).mount(`#app`);export{Zf as A,PF as C,pE as D,KA as E,Ql as F,kl as I,Wo as L,fd as M,mu as N,$T as O,pu as P,bI as S,GA as T,TL as _,b3 as a,II as b,U4 as c,f2 as d,$0 as f,Vq as g,uY as h,v3 as i,of as j,aT as k,q4 as l,aZ as m,L3 as n,m3 as o,oZ as p,h3 as r,p3 as s,G3 as t,x2 as u,yL as v,zj as w,NI as x,oL as y};
|