zen-gitsync 2.17.38 → 2.17.39

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.
Files changed (42) hide show
  1. package/README.md +34 -2
  2. package/package.json +3 -1
  3. package/src/ui/public/assets/{AgentEngineSelector-BMJAsMx_.js → AgentEngineSelector-Ca7h-OVv.js} +1 -1
  4. package/src/ui/public/assets/{AgentView-BH5Ec4j1.js → AgentView-KzzF7_Sv.js} +1 -1
  5. package/src/ui/public/assets/{AppVersionBadge-DNG70v26.js → AppVersionBadge-B8VigVla.js} +2 -2
  6. package/src/ui/public/assets/{BranchSelector-DBI8ieGq.js → BranchSelector-DgEH8i2U.js} +1 -1
  7. package/src/ui/public/assets/{CommitForm-BHwc5sEG.js → CommitForm-24MRGz_j.js} +1 -1
  8. package/src/ui/public/assets/{CommonDialog-DuI8Bsg7.js → CommonDialog-C3ruJAse.js} +1 -1
  9. package/src/ui/public/assets/{EditorView-B3EO-mxZ.js → EditorView-BtlRxw4L.js} +1 -1
  10. package/src/ui/public/assets/{FileDiffViewer-DtGtQGLR.js → FileDiffViewer-B5cXoziJ.js} +1 -1
  11. package/src/ui/public/assets/{FlowExecutionViewer-sM9EwU3Q.js → FlowExecutionViewer-DtFInmRe.js} +1 -1
  12. package/src/ui/public/assets/{FlowOrchestrationWorkspace-0Kh0IoGP.js → FlowOrchestrationWorkspace-BC5nzN88.js} +1 -1
  13. package/src/ui/public/assets/{IconButton-C07zojvw.js → IconButton-CmaM18jB.js} +1 -1
  14. package/src/ui/public/assets/{LogList-BatjYplm.js → LogList-DiMQ_7yP.js} +1 -1
  15. package/src/ui/public/assets/{MindmapView-CTHfsYTC.js → MindmapView-CqOAPpFu.js} +1 -1
  16. package/src/ui/public/assets/{MonitorView-BblFdPFM.js → MonitorView-POiXYq_a.js} +1 -1
  17. package/src/ui/public/assets/{ProjectStartupButton-CFQKlRoA.js → ProjectStartupButton-DnxiVsCj.js} +1 -1
  18. package/src/ui/public/assets/{RecentDirectoriesChat-BVgA8lLY.js → RecentDirectoriesChat-BTJsk605.js} +1 -1
  19. package/src/ui/public/assets/{RemoteManagerDialog-BxD0m5c-.js → RemoteManagerDialog-BgEilA7I.js} +1 -1
  20. package/src/ui/public/assets/{RemoteRepoCard-kOIERvah.js → RemoteRepoCard-CcZ04i_i.js} +1 -1
  21. package/src/ui/public/assets/{SourceMapView-Bs3DYqDP.js → SourceMapView-BkijspIL.js} +1 -1
  22. package/src/ui/public/assets/{SvgIcon-YQZtv72i.js → SvgIcon-CBqXx2qp.js} +1 -1
  23. package/src/ui/public/assets/{TemplateManager-zSKmah02.js → TemplateManager-Bd9A3dXY.js} +1 -1
  24. package/src/ui/public/assets/{UserInputNode-DMCLoOUw.js → UserInputNode-DYXVDPO-.js} +1 -1
  25. package/src/ui/public/assets/WorkbenchView-CIhuba2j.js +232 -0
  26. package/src/ui/public/assets/{_plugin-vue_export-helper-DcQKU19k.js → _plugin-vue_export-helper-DqKDIY1f.js} +2 -2
  27. package/src/ui/public/assets/{agentConversations-D_TsndCC.js → agentConversations-CVTMnWX1.js} +1 -1
  28. package/src/ui/public/assets/{configStore-u3FUM08v.js → configStore-CqbN-y1x.js} +1 -1
  29. package/src/ui/public/assets/{gitStore-ZjHYEyKS.js → gitStore-BrDeYGjs.js} +1 -1
  30. package/src/ui/public/assets/index-DTR0zSQP.css +1 -0
  31. package/src/ui/public/assets/{index-DorcTBZN.js → index-DkTmqIha.js} +65 -60
  32. package/src/ui/public/assets/{previewSandbox-KLKRAhm4.js → previewSandbox-DAqiCX7e.js} +1 -1
  33. package/src/ui/public/assets/{toolsStore-CfyhqJeq.js → toolsStore-DVWI6-BS.js} +1 -1
  34. package/src/ui/public/index.html +12 -12
  35. package/src/ui/server/index.js +9 -0
  36. package/src/ui/server/routes/projectStartupAi.js +521 -0
  37. package/src/ui/server/routes/projectStartupAi.test.js +378 -0
  38. package/src/ui/server/routes/workbench/orchestratorStore.js +5 -5
  39. package/src/ui/server/routes/workbench/orchestratorStore.progressReport.test.js +27 -0
  40. package/src/ui/server/routes/workbench/progressReport.js +15 -0
  41. package/src/ui/public/assets/WorkbenchView-nHzg7gau.js +0 -231
  42. package/src/ui/public/assets/index-BaV4YcQ6.css +0 -1
package/README.md CHANGED
@@ -20,6 +20,7 @@ A Git automation platform with interactive commits, scheduled sync, custom comma
20
20
  - [Custom Commands](#custom-commands)
21
21
  - [Flow Orchestration](#flow-orchestration-visual-workflow-designer)
22
22
  - [NPM Scripts Panel](#npm-scripts-panel)
23
+ - [AI Startup Suggestions](#ai-startup-suggestions)
23
24
  - [Console Panel](#console-panel)
24
25
  - [Project Startup](#project-startup)
25
26
  - [Views at a glance](#views-at-a-glance)
@@ -54,6 +55,7 @@ npm install -g zen-gitsync
54
55
  - **Merge support** — Detect and complete in-progress merges
55
56
  - **Flow orchestration** — Drag-and-drop visual workflow designer
56
57
  - **NPM scripts panel** — Discover and run npm scripts from `package.json`
58
+ - **AI startup suggestions** — A collapsible panel (expanded by default) above the NPM scripts panel: your configured model reads the scanned scripts, marker files and README, then lists the ways this project can be started, in startup order — one click runs any of them in a new terminal
57
59
  - **Built-in terminal** — Run commands with real-time streaming output
58
60
  - **Custom commands** — Save, parameterize, and reuse shell commands
59
61
  - **Project startup** — Auto-run commands or workflows when a project opens
@@ -198,7 +200,7 @@ In either mode, click **AI Generate** to fill in the fields automatically based
198
200
 
199
201
  The header row beside the directory name carries its own quick actions: open in the file manager, open in a terminal, copy the folder name (last path segment only), open with `g ai`, and one button per detected editor / AI tool — VS Code, Codex, OpenCode, Kimi Code, ZCode, DeepSeek Harness and Claude Code (right-click the Claude button for the default / fully-approved menu, or right-click any tool button to update it to the latest version). Tools that are not installed are collected into a **more** menu, where clicking one opens the install guide.
200
202
 
201
- When the GUI is opened on a directory that is not a Git repository, the right pane shows the **Recent projects** list instead — every recent directory with its Git badges (behind / ahead / uncommitted) and one-click "open in a new tab". Each page load runs a `git fetch` pass over all of them automatically, so the ahead/behind badges show the real state rather than the snapshot from the last fetch; the **刷新全部** button does the same thing on demand. The switcher dialog shows the same list as **常用目录** and carries the very same **刷新全部** button at the right end of its heading — the automatic pass stays panel-only (opening a dialog should not fetch a dozen repositories behind your back), but the manual one is identical in both places, right down to the progress readout.
203
+ When the GUI is opened on a directory that is not a Git repository, the right pane shows the **Recent projects** list instead — every recent directory with its Git badges (behind / ahead / uncommitted) and one-click "open in a new tab". Each page load runs a `git fetch` pass over all of them automatically, so the ahead/behind badges show the real state rather than the snapshot from the last fetch; the **刷新全部** button does the same thing on demand. The switcher dialog shows the same list as **常用目录** and carries the very same **刷新全部** button at the right end of its heading — the automatic pass stays panel-only (opening a dialog should not fetch a dozen repositories behind your back), but the manual one is identical in both places, right down to the progress readout. Both places also have a search box above the cards: type any fragment of a path to filter the list (the AI status summary below keeps describing the whole set, not the filtered view).
202
204
 
203
205
  The same list carries a short note underneath the cards — in the **full-screen** directory switcher dialog the path field and the **常用目录** cards take the left side, and that note lives in a right-hand column beside them. With an AI model configured it is an **AI status summary** — one paragraph written by the model from the freshly fetched states, naming the projects that need a pull, have unpushed commits or uncommitted changes, and saying so when everything is in sync. It is generated once per distinct state right after the **刷新全部** pass finishes (never mid-refresh), cached for the page, and there is a regenerate button on the right; the summary is shared between the panel and the dialog, so opening the switcher never triggers a second call. Without a model configured it falls back to a static note explaining what the badges mean.
204
206
 
@@ -307,6 +309,20 @@ Build automated pipelines with a drag-and-drop canvas:
307
309
 
308
310
  ---
309
311
 
312
+ ### AI Startup Suggestions
313
+
314
+ ![AI startup suggestions panel — above the NPM scripts panel, expanded by default](https://raw.githubusercontent.com/xz333221/zen-gitsync/main/public/images/startup-ai-panel.png)
315
+
316
+ > A collapsible panel right **above** the NPM scripts panel, expanded by default. Once an AI model is configured (Settings → AI Models), it scans the project the same way the NPM panel does — every `package.json` script, plus marker files (`Dockerfile`, `docker-compose.yml`, `Makefile`, `go.mod`, `requirements.txt`, …) and the README — and asks your default model to pick the ways this project can actually be started, in startup order. Each suggestion has a **Start** button that runs it in a new terminal.
317
+
318
+ - One list answers "how do I start this project?" — no digging through dozens of scripts in a monorepo
319
+ - Suggestions are validated server-side before they reach you: a script name that does not exist in `package.json`, or a working directory that was not scanned, is dropped (the model cannot invent a button that fails)
320
+ - `npm` suggestions run straight away; raw shell suggestions (e.g. `docker compose up -d`) show a confirmation with the exact command first
321
+ - Results are cached per project + language + model, so reopening the view does not call the model again; the refresh button in the panel header forces a fresh analysis
322
+ - No model configured → the panel just tells you to add one, and sends no request at all
323
+
324
+ ---
325
+
310
326
  ### Console Panel
311
327
 
312
328
  ![Console panel — saved commands on the left, execution terminal on the right](https://raw.githubusercontent.com/xz333221/zen-gitsync/main/public/images/console-panel.png)
@@ -683,6 +699,7 @@ $ g --check-lock=config.json
683
699
  - [自定义命令](#自定义命令)
684
700
  - [可视化流程编排](#可视化流程编排)
685
701
  - [NPM 脚本面板](#npm-脚本面板)
702
+ - [AI 启动建议](#ai-启动建议)
686
703
  - [控制台面板](#控制台面板)
687
704
  - [项目启动](#项目启动)
688
705
  - [视图一览](#视图一览)
@@ -717,6 +734,7 @@ npm install -g zen-gitsync
717
734
  - **合并支持** — 自动检测并引导完成进行中的合并
718
735
  - **可视化流程编排** — 拖拽式工作流设计器
719
736
  - **NPM 脚本面板** — 发现并运行 `package.json` 中的脚本
737
+ - **AI 启动建议** — NPM 脚本面板**上方**一块默认展开的折叠面板:配好模型后,让它读一遍扫描到的脚本、标志文件与 README,按启动顺序列出这个项目可以怎么起,点一下就在新终端里跑起来
720
738
  - **内置终端** — 实时流式输出的命令执行终端
721
739
  - **自定义命令** — 保存、参数化并复用 Shell 命令
722
740
  - **项目启动** — 打开项目时自动运行命令或工作流
@@ -892,7 +910,7 @@ $ ZEN_ALLOWED_ORIGINS="https://zen.example.com,http://10.0.0.5:8080" g ui
892
910
 
893
911
  目录名旁边的顶部条自带一排快捷操作:在资源管理器中打开、在终端中打开、复制文件夹名称(只复制最后一级目录名)、用 `g ai` 打开,以及每个已检测到的编辑器 / AI 工具各一个按钮 —— VS Code、Codex、OpenCode、Kimi Code、ZCode、DeepSeek Harness 与 Claude Code(右键 Claude 按钮可选默认 / 完全批准,右键任意工具按钮可升级到最新版本)。没安装的工具会收进 **更多** 菜单,点一下弹出安装引导。
894
912
 
895
- 当 GUI 打开在一个**不是 Git 仓库**的目录上时,右侧会改为显示「最近项目」列表 —— 每个最近目录一张卡片,带 Git 徽标(落后 / 领先 / 未提交)与「在新标签页打开」。每次打开界面时会自动对所有项目跑一遍 `git fetch`,让「领先/落后」显示真实状态而不是上次 fetch 时的快照;**刷新全部** 按钮可以随时手动再刷一遍。切换目录弹窗里是同一份列表(叫 **常用目录**),标题行右端摆着同一个 **刷新全部** 按钮 —— 自动刷新仍然只发生在常驻面板上(打开一个选目录的弹窗不该顺手联网刷十几个仓库),但手动刷新两处完全一致,连进度读数都是同一个。
913
+ 当 GUI 打开在一个**不是 Git 仓库**的目录上时,右侧会改为显示「最近项目」列表 —— 每个最近目录一张卡片,带 Git 徽标(落后 / 领先 / 未提交)与「在新标签页打开」。每次打开界面时会自动对所有项目跑一遍 `git fetch`,让「领先/落后」显示真实状态而不是上次 fetch 时的快照;**刷新全部** 按钮可以随时手动再刷一遍。切换目录弹窗里是同一份列表(叫 **常用目录**),标题行右端摆着同一个 **刷新全部** 按钮 —— 自动刷新仍然只发生在常驻面板上(打开一个选目录的弹窗不该顺手联网刷十几个仓库),但手动刷新两处完全一致,连进度读数都是同一个。两处的卡片上方还各有一个搜索框:敲路径里的任意一段就能筛出对应的卡片(底下的 AI 状态解读始终按全量那批目录来讲,不跟着筛选变)。
896
914
 
897
915
  这份列表(以及切换目录弹窗里的 **常用目录**)在卡片下方还有一段说明;切换目录弹窗是**全屏**的,左栏放路径输入框与 **常用目录** 卡片,这段说明则落在右侧一列。配置了 AI 模型时,它是模型根据刚刷新的状态写成的 **AI 项目状态解读**:一段话说清哪些项目该 pull、哪些有未推送的提交、哪些只是工作区脏了,全都同步干净时也会明确说明。它在「刷新全部」跑完的那一刻按状态生成一次(刷新途中不会生成),整页缓存复用,右侧带重新生成按钮;面板与弹窗共用同一份解读,打开弹窗不会多问一次模型。没配模型时退回一段静态说明,讲清徽标里的数字各是什么意思。
898
916
 
@@ -1001,6 +1019,20 @@ $ ZEN_ALLOWED_ORIGINS="https://zen.example.com,http://10.0.0.5:8080" g ui
1001
1019
 
1002
1020
  ---
1003
1021
 
1022
+ ### AI 启动建议
1023
+
1024
+ ![AI 启动建议面板 — 挂在 NPM 脚本面板上方,默认展开](https://raw.githubusercontent.com/xz333221/zen-gitsync/main/public/images/startup-ai-panel.png)
1025
+
1026
+ > 一块挂在 NPM 脚本面板**上方**的折叠面板,**默认展开**。配好模型(设置 → AI 模型配置)后,它按和 NPM 面板同一套规则扫项目 —— 所有 `package.json` 脚本、加上标志文件(`Dockerfile`、`docker-compose.yml`、`Makefile`、`go.mod`、`requirements.txt` …)与 README —— 再让默认模型挑出这个项目**真能怎么起**,按启动顺序列出来。每条右边一个「启动」按钮,点了就在新终端里跑。
1027
+
1028
+ - 一个列表回答"这项目到底怎么启动"—— monorepo 里几十条脚本不用再自己认
1029
+ - 建议在服务端过一道校验才送到界面:脚本名在 `package.json` 里不存在、或执行目录不在扫描结果里的,一律丢掉(模型编不出一个点了就报错的按钮)
1030
+ - `npm` 类建议直接跑;模型给的原始命令(如 `docker compose up -d`)会先弹确认框,把完整命令摆给你看过再执行
1031
+ - 结果按 项目 + 语言 + 模型 缓存,重开视图不会重复问模型;面板头部的刷新按钮才是强制重新分析的入口
1032
+ - 没配模型时只提示去添加模型,一个请求都不发
1033
+
1034
+ ---
1035
+
1004
1036
  ### 控制台面板
1005
1037
 
1006
1038
  ![控制台面板 — 左侧保存的命令,右侧执行终端](https://raw.githubusercontent.com/xz333221/zen-gitsync/main/public/images/console-panel.png)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zen-gitsync",
3
- "version": "2.17.38",
3
+ "version": "2.17.39",
4
4
  "description": "Auto commit, scheduled sync, and visual GUI for Git. Run `g` in any repo for one-key commit & push, AI commit messages, scheduled background sync, and a drag-and-drop workflow builder.",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -80,6 +80,8 @@
80
80
  "verify:wb-open-with-permission": "node scripts/verify-open-with-permission-menus.cjs",
81
81
  "verify:open-with-permission": "node --test test/open-with-permission.test.mjs",
82
82
  "verify:repo-list": "node scripts/verify-repo-list.cjs",
83
+ "verify:startup-ai-panel": "node scripts/verify-startup-ai-panel.cjs",
84
+ "verify:startup-ai-panel:reverse": "node scripts/verify-startup-ai-panel.cjs --reverse",
83
85
  "e2e": "cd src/ui/client && npx playwright test",
84
86
  "e2e:headed": "cd src/ui/client && npx playwright test --headed",
85
87
  "e2e:install": "cd src/ui/client && npx playwright install chromium",
@@ -1,2 +1,2 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,C as n,Dn as r,En as i,Fr as a,In as o,J as s,Jr as c,On as l,Pn as u,S as d,Tn as f,Wn as p,Y as m,Yn as h,Zn as g,br as _,cr as v,ei as y,kn as b,pr as x,qn as S,tt as C,w,xn as T}from"./element-plus-Buzx8xRf.js";import{n as E,t as D}from"./_plugin-vue_export-helper-DcQKU19k.js";import{t as O}from"./SvgIcon-YQZtv72i.js";import{t as k}from"./toolsStore-CfyhqJeq.js";import{s as A,v as j}from"./index-DorcTBZN.js";import{c as M,d as N,l as P,u as F}from"./agentConversations-D_TsndCC.js";t(),x();function I(e,t=680){let n=_(0),r=null;function i(){let t=e.value;return t?(n.value=t.clientWidth,typeof ResizeObserver>`u`||(r=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(n.value=t)}),r.observe(t),!0)):!1}return h(()=>{i()||p(()=>i())}),S(()=>{r?.disconnect(),r=null}),{width:n,narrow:f(()=>n.value>0&&n.value<t)}}t(),x();var L=o({__name:`AgentEngineSelector`,props:{engine:{type:String,required:!0},locked:{type:Boolean,required:!1}},emits:[`select`],setup(e,{expose:t,emit:r}){t();let i=e,a=r,o=k(),c=f(()=>F(i.engine)),l=f(()=>({gai:!0,claude:o.claudeAvailable,opencode:o.opencodeAvailable,codex:o.codexAvailable})),u=_(!1),p=_(null);function h(e){if(!i.locked){if(!l.value[e]){if(!N(e))return;p.value=e,u.value=!0;return}a(`select`,e)}}let g={props:i,emit:a,toolsStore:o,engineName:c,engineAvailability:l,installDialogVisible:u,installTool:p,onCommand:h,get $t(){return E},get ElIcon(){return s},get ElDropdown(){return d},get ElDropdownMenu(){return w},get ElDropdownItem(){return n},get ArrowDown(){return m},get Check(){return C},get AGENT_ENGINE_OPTIONS(){return M},get BUILTIN_ENGINE_ICON(){return P},get isExternalAgentEngine(){return N},SvgIcon:O,TaskExecutorIcon:A,ToolInstallDialog:j};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}});t(),a();var R={class:`agent-engine`},z=[`disabled`,`title`,`aria-label`],B={class:`agent-engine__name`},V={class:`agent-engine__item`},H={class:`agent-engine__item-name`},U={key:3,class:`agent-engine__item-missing`};function W(t,n,a,o,s,d){return g(),b(T,null,[l(` 单根包一层:父级传下来的 class(Tab 行的 margin-left:auto、面板的 flex:none)
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,C as n,Dn as r,En as i,Fr as a,In as o,J as s,Jr as c,On as l,Pn as u,S as d,Tn as f,Wn as p,Y as m,Yn as h,Zn as g,br as _,cr as v,ei as y,kn as b,pr as x,qn as S,tt as C,w,xn as T}from"./element-plus-Buzx8xRf.js";import{n as E,t as D}from"./_plugin-vue_export-helper-DqKDIY1f.js";import{t as O}from"./SvgIcon-CBqXx2qp.js";import{t as k}from"./toolsStore-DVWI6-BS.js";import{s as A,v as j}from"./index-DkTmqIha.js";import{c as M,d as N,l as P,u as F}from"./agentConversations-CVTMnWX1.js";t(),x();function I(e,t=680){let n=_(0),r=null;function i(){let t=e.value;return t?(n.value=t.clientWidth,typeof ResizeObserver>`u`||(r=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(n.value=t)}),r.observe(t),!0)):!1}return h(()=>{i()||p(()=>i())}),S(()=>{r?.disconnect(),r=null}),{width:n,narrow:f(()=>n.value>0&&n.value<t)}}t(),x();var L=o({__name:`AgentEngineSelector`,props:{engine:{type:String,required:!0},locked:{type:Boolean,required:!1}},emits:[`select`],setup(e,{expose:t,emit:r}){t();let i=e,a=r,o=k(),c=f(()=>F(i.engine)),l=f(()=>({gai:!0,claude:o.claudeAvailable,opencode:o.opencodeAvailable,codex:o.codexAvailable})),u=_(!1),p=_(null);function h(e){if(!i.locked){if(!l.value[e]){if(!N(e))return;p.value=e,u.value=!0;return}a(`select`,e)}}let g={props:i,emit:a,toolsStore:o,engineName:c,engineAvailability:l,installDialogVisible:u,installTool:p,onCommand:h,get $t(){return E},get ElIcon(){return s},get ElDropdown(){return d},get ElDropdownMenu(){return w},get ElDropdownItem(){return n},get ArrowDown(){return m},get Check(){return C},get AGENT_ENGINE_OPTIONS(){return M},get BUILTIN_ENGINE_ICON(){return P},get isExternalAgentEngine(){return N},SvgIcon:O,TaskExecutorIcon:A,ToolInstallDialog:j};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}});t(),a();var R={class:`agent-engine`},z=[`disabled`,`title`,`aria-label`],B={class:`agent-engine__name`},V={class:`agent-engine__item`},H={class:`agent-engine__item-name`},U={key:3,class:`agent-engine__item-missing`};function W(t,n,a,o,s,d){return g(),b(T,null,[l(` 单根包一层:父级传下来的 class(Tab 行的 margin-left:auto、面板的 flex:none)
2
2
  才能可靠落到这里 —— 多根组件会丢掉 fallthrough class。 `),i(`div`,R,[u(o.ElDropdown,{trigger:`click`,onCommand:o.onCommand},{dropdown:v(()=>[u(o.ElDropdownMenu,null,{default:v(()=>[(g(!0),b(T,null,e(o.AGENT_ENGINE_OPTIONS,e=>(g(),r(o.ElDropdownItem,{key:e.id,command:e.id},{default:v(()=>[i(`span`,V,[o.isExternalAgentEngine(e.id)?(g(),r(o.TaskExecutorIcon,{key:0,executor:e.id,class:`agent-engine__item-icon`},null,8,[`executor`])):(g(),r(o.SvgIcon,{key:1,"icon-class":o.BUILTIN_ENGINE_ICON,class:`agent-engine__item-icon`},null,8,[`icon-class`])),i(`span`,H,y(e.name),1),a.engine===e.id?(g(),r(o.ElIcon,{key:2,class:`agent-engine__item-check`},{default:v(()=>[u(o.Check)]),_:1})):o.engineAvailability[e.id]?l(`v-if`,!0):(g(),b(`span`,U,y(o.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`]))),128))]),_:1})]),default:v(()=>[i(`button`,{type:`button`,class:c([`agent-engine__btn`,{"is-locked":a.locked}]),disabled:a.locked,title:a.locked?o.$t(`@AGENT:本会话的引擎已锁定;要换引擎请新建会话`):o.$t(`@AGENT:新建会话使用的引擎`),"aria-label":o.$t(`@AGENT:智能体引擎`)},[o.isExternalAgentEngine(a.engine)?(g(),r(o.TaskExecutorIcon,{key:0,executor:a.engine,class:`agent-engine__icon`},null,8,[`executor`])):(g(),r(o.SvgIcon,{key:1,"icon-class":o.BUILTIN_ENGINE_ICON,class:`agent-engine__icon`},null,8,[`icon-class`])),i(`span`,B,y(o.engineName),1),u(o.ElIcon,{class:`agent-engine__caret`},{default:v(()=>[u(o.ArrowDown)]),_:1})],10,z)]),_:1}),u(o.ToolInstallDialog,{modelValue:o.installDialogVisible,"onUpdate:modelValue":n[0]||=e=>o.installDialogVisible=e,tool:o.installTool},null,8,[`modelValue`,`tool`])])],2112)}var G=D(L,[[`render`,W],[`__scopeId`,`data-v-c67a4d14`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/AgentEngineSelector.vue`]]);export{I as n,G as t};
@@ -1,4 +1,4 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,At as t,Bn as n,Ct as r,Dn as i,En as a,Fr as o,Gt as s,Ht as ee,In as c,J as l,Jr as u,M as d,Nn as f,On as p,Pn as m,Tn as h,Tt as g,W as _,Wn as v,Xr as y,Yt as b,Zn as x,_n as S,a as C,an as w,br as T,cr as E,dn as D,ei as O,et as k,i as A,j,kn as M,kt as N,lr as P,lt as F,mt as I,nr as L,o as R,or as z,pr as B,st as V,tt as H,vr as U,xn as W}from"./element-plus-Buzx8xRf.js";import{a as G,t as K}from"./vendor-wERX2bc3.js";import{n as q,t as J}from"./_plugin-vue_export-helper-DcQKU19k.js";import{t as te}from"./configStore-u3FUM08v.js";import{t as ne}from"./CommonDialog-DuI8Bsg7.js";import{a as re,i as ie,n as ae,o as oe,r as se,s as ce,t as le}from"./agentConversations-D_TsndCC.js";import{n as ue,t as de}from"./AgentEngineSelector-BMJAsMx_.js";n(),B();var fe=c({__name:`MarketplacePanel`,props:{type:{type:String,required:!0}},setup(e,{expose:t}){t();let n=e,i=te(),a=T([]),o=T([]),c=T(!1),l=T(``),u=T(``),d=T([]),f=T(`project`),p=T(new Set),m=T(new Set),g=T(new Set),_=h(()=>i.currentDirectory||``),v=null;async function y(){if(!c.value){c.value=!0;try{let e=new URLSearchParams({type:n.type,cwd:_.value});u.value&&e.set(`q`,u.value),d.value.length&&e.set(`sources`,d.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();t?.success?(a.value=t.groups||[],o.value=t.installed||[]):C.error(t?.error||q(`@MKT:加载失败`))}catch{C.error(q(`@MKT:加载失败`))}finally{c.value=!1}}}z(l,e=>{v&&clearTimeout(v),v=setTimeout(()=>{u.value=e.trim(),y()},400)}),z(d,()=>y()),z(()=>n.type,()=>{d.value=[],u.value=``,l.value=``,y()}),z(_,()=>y()),y();let x=h(()=>{let e=_.value?_.value.split(/[\\/]/).filter(Boolean).pop():``;return f.value===`project`?e||q(`@MKT:当前项目`):q(`@MKT:g ai 智能体`)});function S(e){return e.stars?`${E(e.stars)} ★`:e.downloads?`${E(e.downloads)} ${q(`@MKT:周下载`)}`:e.uses?`${E(e.uses)} ${q(`@MKT:次使用`)}`:``}function E(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function D(e){return`${e.id}`}function O(e){return p.value.has(D(e))}let k=h(()=>{let e={project:[],global:[]};for(let t of o.value)(e[t.target]||=[]).push(t);return e}),j=U({visible:!1,item:null,env:{},args:``});function M(e){return n.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function P(e){j.item=e,j.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),j.args=(e.args||[]).join(` `),j.visible=!0}function L(){let e=j.item;if(j.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(j.env).filter(([,e])=>e.trim()!==``)),n=j.args.trim()?j.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;B(e,{env:t,...n?{args:n}:{}})}async function R(e){if(!e.installed||await V(e)){if(M(e)){P(e);return}await B(e,{})}}async function B(e,t){let r=D(e);p.value.add(r);try{let r=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:f.value,cwd:_.value,item:{...e,...t}})}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){C.error(i?.error||q(`@MKT:安装失败`));return}i.item?.warning&&C.warning(i.item.warning),i.item?.envKeys?.length?C.warning(`${q(`@MKT:还缺环境变量`)}: ${i.item.envKeys.join(`, `)}`):C.success(q(`@MKT:安装成功`)),await y()}catch{C.error(q(`@MKT:安装失败`))}finally{p.value.delete(r)}}async function V(e){try{return await A.confirm(`${e.name} ${q(`@MKT:已安装,要重新安装吗?`)}`,q(`@MKT:重新安装`),{confirmButtonText:q(`@MKT:重装`),cancelButtonText:q(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function W(e){let t=`${e.target}:${e.id}`;g.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:e.target,cwd:_.value,id:e.id})}),r=await t.json().catch(()=>null);(!t.ok||!r?.success)&&C.error(r?.error||q(`@MKT:打开失败`))}catch{C.error(q(`@MKT:打开失败`))}finally{g.value.delete(t)}}async function G(e){try{await A.confirm(`${q(`@MKT:确定卸载`)} ${e.name}?`,q(`@MKT:卸载`),{confirmButtonText:q(`@MKT:卸载`),cancelButtonText:q(`@MKT:取消`),type:`warning`})}catch{return}let t=`${e.target}:${e.id}`;m.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:_.value}),r=await fetch(`/api/agent/marketplace/item/${n.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){C.error(i?.error||q(`@MKT:卸载失败`));return}C.success(q(`@MKT:已卸载`)),await y()}catch{C.error(q(`@MKT:卸载失败`))}finally{m.value.delete(t)}}let K={props:n,configStore:i,groups:a,installed:o,loading:c,searchInput:l,query:u,selectedSources:d,installTarget:f,installing:p,removing:m,revealing:g,cwd:_,get searchTimer(){return v},set searchTimer(e){v=e},loadCatalog:y,targetLabel:x,metricText:S,formatCount:E,cardKey:D,isBusy:O,installedByTarget:k,configDialog:j,needsConfig:M,openConfigDialog:P,confirmConfig:L,onInstall:R,doInstall:B,confirmReinstall:V,onReveal:W,onRemove:G,get $t(){return q},get Search(){return s},get Refresh(){return ee},get Delete(){return F},get Link(){return N},get Check(){return H},get Star(){return b},get Download(){return I},get Warning(){return w},get FolderOpened(){return r},CommonDialog:ne};return Object.defineProperty(K,"__isScriptSetup",{enumerable:!1,value:!0}),K}});n(),D(),o();var pe={class:`marketplace-panel`},Y={class:`mp-toolbar`},X={class:`mp-search`},me=[`placeholder`],he={class:`mp-toolbar-sub`},Z={class:`mp-target-hint`},Q={class:`mp-source-filter`},ge=[`onClick`],$={class:`mp-body`},_e={class:`mp-group-header`},ve={class:`mp-group-title`},ye={key:0,class:`mp-group-count`},be={key:1,class:`mp-group-error`},xe=[`href`,`title`],Se={key:0,class:`mp-grid`},Ce={class:`mp-card-head`},we=[`title`],Te={key:0,class:`mp-card-metric`},Ee=[`title`],De={class:`mp-card-meta`},Oe=[`title`],ke=[`title`],Ae={key:2,class:`mp-tag remote`},je={class:`mp-card-foot`},Me=[`href`],Ne={key:1,class:`mp-installed-chip`},Pe=[`disabled`,`onClick`],Fe={key:3,class:`mp-not-installable`},Ie={key:1,class:`mp-empty`},Le={key:0,class:`mp-group installed`},Re={class:`mp-group-header`},ze={class:`mp-group-title`},Be={class:`mp-group-count`},Ve={key:0,class:`mp-installed-block`},He={class:`mp-installed-target`},Ue={class:`mp-installed-list`},We=[`title`],Ge=[`title`],Ke={key:1,class:`mp-meta-pkg`},qe={key:2,class:`mp-tag warn`},Je=[`disabled`,`title`,`onClick`],Ye=[`disabled`,`onClick`],Xe={key:1,class:`mp-empty all`},Ze={key:0,class:`mkt-form`},Qe={class:`mkt-form-name`},$e=[`onUpdate:modelValue`,`placeholder`],et={key:0,class:`mkt-field`},tt={class:`mkt-hint`};function nt(t,n,r,o,s,ee){let c=l,h=j,g=d,v=_,y=R;return x(),M(`div`,pe,[p(` ── 工具栏 ───────────────────────────────── `),a(`div`,Y,[a(`div`,X,[m(c,{class:`mp-search-icon`},{default:E(()=>[m(o.Search)]),_:1}),P(a(`input`,{"onUpdate:modelValue":n[0]||=e=>o.searchInput=e,class:`mp-search-input`,type:`text`,placeholder:r.type===`skill`?o.$t(`@MKT:搜索 Skill...`):o.$t(`@MKT:搜索 MCP 服务...`)},null,8,me),[[S,o.searchInput]])]),m(g,{modelValue:o.installTarget,"onUpdate:modelValue":n[1]||=e=>o.installTarget=e,size:`small`,class:`mp-target`},{default:E(()=>[m(h,{value:`project`},{default:E(()=>[f(O(o.$t(`@MKT:当前项目`)),1)]),_:1}),m(h,{value:`global`},{default:E(()=>[f(O(o.$t(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),m(v,{content:o.$t(`@MKT:刷新`),placement:`top`,"show-after":300},{default:E(()=>[a(`button`,{class:u([`mp-refresh`,{spinning:o.loading}]),onClick:o.loadCatalog},[m(c,null,{default:E(()=>[m(o.Refresh)]),_:1})],2)]),_:1},8,[`content`])]),a(`div`,he,[a(`span`,Z,[f(O(o.$t(`@MKT:安装到`))+` `,1),a(`b`,null,O(o.targetLabel),1)]),a(`div`,Q,[(x(!0),M(W,null,e(o.groups,e=>(x(),M(`button`,{key:e.id,class:u([`mp-chip`,{active:o.selectedSources.includes(e.id)}]),onClick:()=>{let t=o.selectedSources.indexOf(e.id);t>=0?o.selectedSources.splice(t,1):o.selectedSources.push(e.id)}},O(e.label),11,ge))),128)),o.selectedSources.length?(x(),M(`button`,{key:0,class:`mp-chip clear`,onClick:n[2]||=e=>o.selectedSources=[]},O(o.$t(`@MKT:全部来源`)),1)):p(`v-if`,!0)])]),p(` ── 内容 ─────────────────────────────────── `),P((x(),M(`div`,$,[(x(!0),M(W,null,e(o.groups,t=>(x(),M(`section`,{key:t.id,class:`mp-group`},[a(`header`,_e,[a(`h3`,ve,O(t.label),1),t.status===`ok`?(x(),M(`span`,ye,O(t.items.length),1)):(x(),M(`span`,be,[m(c,null,{default:E(()=>[m(o.Warning)]),_:1}),f(` `+O(t.error||o.$t(`@MKT:来源不可用`)),1)])),t.homepage?(x(),M(`a`,{key:2,class:`mp-group-link`,href:t.homepage,target:`_blank`,rel:`noopener noreferrer`,title:t.homepage},[m(c,null,{default:E(()=>[m(o.Link)]),_:1})],8,xe)):p(`v-if`,!0)]),t.status===`ok`&&t.items.length?(x(),M(`div`,Se,[(x(!0),M(W,null,e(t.items,t=>(x(),M(`article`,{key:o.cardKey(t),class:`mp-card`},[a(`div`,Ce,[a(`span`,{class:`mp-card-name`,title:t.name},O(t.name),9,we),o.metricText(t)?(x(),M(`span`,Te,[m(c,null,{default:E(()=>[t.stars?(x(),i(o.Star,{key:0})):(x(),i(o.Download,{key:1}))]),_:2},1024),f(` `+O(o.metricText(t)),1)])):p(`v-if`,!0)]),a(`p`,{class:`mp-card-desc`,title:t.description},O(t.description||o.$t(`@MKT:暂无描述`)),9,Ee),a(`div`,De,[t.package?(x(),M(`code`,{key:0,class:`mp-meta-pkg`,title:t.package},O(t.package),9,Oe)):t.repository?(x(),M(`span`,{key:1,class:`mp-meta-repo`,title:t.repository+(t.subpath?` · `+t.subpath:``)},[f(O(t.repository),1),t.subpath?(x(),M(W,{key:0},[f(` · `+O(t.subpath),1)],64)):p(`v-if`,!0)],8,ke)):p(`v-if`,!0),t.transport===`remote`?(x(),M(`span`,Ae,O(o.$t(`@MKT:远程服务`)),1)):p(`v-if`,!0),(x(!0),M(W,null,e((t.tags||[]).slice(0,2),e=>(x(),M(`span`,{key:e,class:`mp-tag`},O(e),1))),128))]),a(`div`,je,[t.upstream?(x(),M(`a`,{key:0,class:`mp-card-link`,href:t.upstream,target:`_blank`,rel:`noopener noreferrer`},O(o.$t(`@MKT:查看来源`)),9,Me)):p(`v-if`,!0),n[6]||=a(`span`,{class:`mp-foot-spacer`},null,-1),t.installed?(x(),M(`span`,Ne,[m(c,null,{default:E(()=>[m(o.Check)]),_:1}),f(O(o.$t(`@MKT:已安装`)),1)])):t.installable===!1?(x(),M(`span`,Fe,O(o.$t(`@MKT:暂不支持一键安装`)),1)):(x(),M(`button`,{key:2,class:`mp-install-btn`,disabled:o.isBusy(t),onClick:e=>o.onInstall(t)},O(o.isBusy(t)?o.$t(`@MKT:安装中...`):o.$t(`@MKT:安装`)),9,Pe))])]))),128))])):t.status===`ok`?(x(),M(`div`,Ie,O(o.$t(`@MKT:该来源暂无结果`)),1)):p(`v-if`,!0)]))),128)),p(` ── 已安装 ─────────────────────────────── `),o.installed.length?(x(),M(`section`,Le,[a(`header`,Re,[a(`h3`,ze,O(o.$t(`@MKT:已安装`)),1),a(`span`,Be,O(o.installed.length),1)]),(x(),M(W,null,e([`project`,`global`],t=>a(`div`,{key:t},[o.installedByTarget[t]?.length?(x(),M(`div`,Ve,[a(`div`,He,O(t===`project`?o.$t(`@MKT:当前项目`):o.$t(`@MKT:g ai 智能体`)),1),a(`div`,Ue,[(x(!0),M(W,null,e(o.installedByTarget[t],e=>(x(),M(`div`,{key:t+e.id,class:`mp-installed-row`},[a(`span`,{class:`mp-installed-name`,title:e.name},O(e.name),9,We),p(` 实际落盘的标识:SKILL.md 里的 name 常与仓库名不同(如仓库 taste-skill
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,At as t,Bn as n,Ct as r,Dn as i,En as a,Fr as o,Gt as s,Ht as ee,In as c,J as l,Jr as u,M as d,Nn as f,On as p,Pn as m,Tn as h,Tt as g,W as _,Wn as v,Xr as y,Yt as b,Zn as x,_n as S,a as C,an as w,br as T,cr as E,dn as D,ei as O,et as k,i as A,j,kn as M,kt as N,lr as P,lt as F,mt as I,nr as L,o as R,or as z,pr as B,st as V,tt as H,vr as U,xn as W}from"./element-plus-Buzx8xRf.js";import{a as G,t as K}from"./vendor-wERX2bc3.js";import{n as q,t as J}from"./_plugin-vue_export-helper-DqKDIY1f.js";import{t as te}from"./configStore-CqbN-y1x.js";import{t as ne}from"./CommonDialog-C3ruJAse.js";import{a as re,i as ie,n as ae,o as oe,r as se,s as ce,t as le}from"./agentConversations-CVTMnWX1.js";import{n as ue,t as de}from"./AgentEngineSelector-Ca7h-OVv.js";n(),B();var fe=c({__name:`MarketplacePanel`,props:{type:{type:String,required:!0}},setup(e,{expose:t}){t();let n=e,i=te(),a=T([]),o=T([]),c=T(!1),l=T(``),u=T(``),d=T([]),f=T(`project`),p=T(new Set),m=T(new Set),g=T(new Set),_=h(()=>i.currentDirectory||``),v=null;async function y(){if(!c.value){c.value=!0;try{let e=new URLSearchParams({type:n.type,cwd:_.value});u.value&&e.set(`q`,u.value),d.value.length&&e.set(`sources`,d.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();t?.success?(a.value=t.groups||[],o.value=t.installed||[]):C.error(t?.error||q(`@MKT:加载失败`))}catch{C.error(q(`@MKT:加载失败`))}finally{c.value=!1}}}z(l,e=>{v&&clearTimeout(v),v=setTimeout(()=>{u.value=e.trim(),y()},400)}),z(d,()=>y()),z(()=>n.type,()=>{d.value=[],u.value=``,l.value=``,y()}),z(_,()=>y()),y();let x=h(()=>{let e=_.value?_.value.split(/[\\/]/).filter(Boolean).pop():``;return f.value===`project`?e||q(`@MKT:当前项目`):q(`@MKT:g ai 智能体`)});function S(e){return e.stars?`${E(e.stars)} ★`:e.downloads?`${E(e.downloads)} ${q(`@MKT:周下载`)}`:e.uses?`${E(e.uses)} ${q(`@MKT:次使用`)}`:``}function E(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function D(e){return`${e.id}`}function O(e){return p.value.has(D(e))}let k=h(()=>{let e={project:[],global:[]};for(let t of o.value)(e[t.target]||=[]).push(t);return e}),j=U({visible:!1,item:null,env:{},args:``});function M(e){return n.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function P(e){j.item=e,j.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),j.args=(e.args||[]).join(` `),j.visible=!0}function L(){let e=j.item;if(j.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(j.env).filter(([,e])=>e.trim()!==``)),n=j.args.trim()?j.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;B(e,{env:t,...n?{args:n}:{}})}async function R(e){if(!e.installed||await V(e)){if(M(e)){P(e);return}await B(e,{})}}async function B(e,t){let r=D(e);p.value.add(r);try{let r=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:f.value,cwd:_.value,item:{...e,...t}})}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){C.error(i?.error||q(`@MKT:安装失败`));return}i.item?.warning&&C.warning(i.item.warning),i.item?.envKeys?.length?C.warning(`${q(`@MKT:还缺环境变量`)}: ${i.item.envKeys.join(`, `)}`):C.success(q(`@MKT:安装成功`)),await y()}catch{C.error(q(`@MKT:安装失败`))}finally{p.value.delete(r)}}async function V(e){try{return await A.confirm(`${e.name} ${q(`@MKT:已安装,要重新安装吗?`)}`,q(`@MKT:重新安装`),{confirmButtonText:q(`@MKT:重装`),cancelButtonText:q(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function W(e){let t=`${e.target}:${e.id}`;g.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:e.target,cwd:_.value,id:e.id})}),r=await t.json().catch(()=>null);(!t.ok||!r?.success)&&C.error(r?.error||q(`@MKT:打开失败`))}catch{C.error(q(`@MKT:打开失败`))}finally{g.value.delete(t)}}async function G(e){try{await A.confirm(`${q(`@MKT:确定卸载`)} ${e.name}?`,q(`@MKT:卸载`),{confirmButtonText:q(`@MKT:卸载`),cancelButtonText:q(`@MKT:取消`),type:`warning`})}catch{return}let t=`${e.target}:${e.id}`;m.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:_.value}),r=await fetch(`/api/agent/marketplace/item/${n.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){C.error(i?.error||q(`@MKT:卸载失败`));return}C.success(q(`@MKT:已卸载`)),await y()}catch{C.error(q(`@MKT:卸载失败`))}finally{m.value.delete(t)}}let K={props:n,configStore:i,groups:a,installed:o,loading:c,searchInput:l,query:u,selectedSources:d,installTarget:f,installing:p,removing:m,revealing:g,cwd:_,get searchTimer(){return v},set searchTimer(e){v=e},loadCatalog:y,targetLabel:x,metricText:S,formatCount:E,cardKey:D,isBusy:O,installedByTarget:k,configDialog:j,needsConfig:M,openConfigDialog:P,confirmConfig:L,onInstall:R,doInstall:B,confirmReinstall:V,onReveal:W,onRemove:G,get $t(){return q},get Search(){return s},get Refresh(){return ee},get Delete(){return F},get Link(){return N},get Check(){return H},get Star(){return b},get Download(){return I},get Warning(){return w},get FolderOpened(){return r},CommonDialog:ne};return Object.defineProperty(K,"__isScriptSetup",{enumerable:!1,value:!0}),K}});n(),D(),o();var pe={class:`marketplace-panel`},Y={class:`mp-toolbar`},X={class:`mp-search`},me=[`placeholder`],he={class:`mp-toolbar-sub`},Z={class:`mp-target-hint`},Q={class:`mp-source-filter`},ge=[`onClick`],$={class:`mp-body`},_e={class:`mp-group-header`},ve={class:`mp-group-title`},ye={key:0,class:`mp-group-count`},be={key:1,class:`mp-group-error`},xe=[`href`,`title`],Se={key:0,class:`mp-grid`},Ce={class:`mp-card-head`},we=[`title`],Te={key:0,class:`mp-card-metric`},Ee=[`title`],De={class:`mp-card-meta`},Oe=[`title`],ke=[`title`],Ae={key:2,class:`mp-tag remote`},je={class:`mp-card-foot`},Me=[`href`],Ne={key:1,class:`mp-installed-chip`},Pe=[`disabled`,`onClick`],Fe={key:3,class:`mp-not-installable`},Ie={key:1,class:`mp-empty`},Le={key:0,class:`mp-group installed`},Re={class:`mp-group-header`},ze={class:`mp-group-title`},Be={class:`mp-group-count`},Ve={key:0,class:`mp-installed-block`},He={class:`mp-installed-target`},Ue={class:`mp-installed-list`},We=[`title`],Ge=[`title`],Ke={key:1,class:`mp-meta-pkg`},qe={key:2,class:`mp-tag warn`},Je=[`disabled`,`title`,`onClick`],Ye=[`disabled`,`onClick`],Xe={key:1,class:`mp-empty all`},Ze={key:0,class:`mkt-form`},Qe={class:`mkt-form-name`},$e=[`onUpdate:modelValue`,`placeholder`],et={key:0,class:`mkt-field`},tt={class:`mkt-hint`};function nt(t,n,r,o,s,ee){let c=l,h=j,g=d,v=_,y=R;return x(),M(`div`,pe,[p(` ── 工具栏 ───────────────────────────────── `),a(`div`,Y,[a(`div`,X,[m(c,{class:`mp-search-icon`},{default:E(()=>[m(o.Search)]),_:1}),P(a(`input`,{"onUpdate:modelValue":n[0]||=e=>o.searchInput=e,class:`mp-search-input`,type:`text`,placeholder:r.type===`skill`?o.$t(`@MKT:搜索 Skill...`):o.$t(`@MKT:搜索 MCP 服务...`)},null,8,me),[[S,o.searchInput]])]),m(g,{modelValue:o.installTarget,"onUpdate:modelValue":n[1]||=e=>o.installTarget=e,size:`small`,class:`mp-target`},{default:E(()=>[m(h,{value:`project`},{default:E(()=>[f(O(o.$t(`@MKT:当前项目`)),1)]),_:1}),m(h,{value:`global`},{default:E(()=>[f(O(o.$t(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),m(v,{content:o.$t(`@MKT:刷新`),placement:`top`,"show-after":300},{default:E(()=>[a(`button`,{class:u([`mp-refresh`,{spinning:o.loading}]),onClick:o.loadCatalog},[m(c,null,{default:E(()=>[m(o.Refresh)]),_:1})],2)]),_:1},8,[`content`])]),a(`div`,he,[a(`span`,Z,[f(O(o.$t(`@MKT:安装到`))+` `,1),a(`b`,null,O(o.targetLabel),1)]),a(`div`,Q,[(x(!0),M(W,null,e(o.groups,e=>(x(),M(`button`,{key:e.id,class:u([`mp-chip`,{active:o.selectedSources.includes(e.id)}]),onClick:()=>{let t=o.selectedSources.indexOf(e.id);t>=0?o.selectedSources.splice(t,1):o.selectedSources.push(e.id)}},O(e.label),11,ge))),128)),o.selectedSources.length?(x(),M(`button`,{key:0,class:`mp-chip clear`,onClick:n[2]||=e=>o.selectedSources=[]},O(o.$t(`@MKT:全部来源`)),1)):p(`v-if`,!0)])]),p(` ── 内容 ─────────────────────────────────── `),P((x(),M(`div`,$,[(x(!0),M(W,null,e(o.groups,t=>(x(),M(`section`,{key:t.id,class:`mp-group`},[a(`header`,_e,[a(`h3`,ve,O(t.label),1),t.status===`ok`?(x(),M(`span`,ye,O(t.items.length),1)):(x(),M(`span`,be,[m(c,null,{default:E(()=>[m(o.Warning)]),_:1}),f(` `+O(t.error||o.$t(`@MKT:来源不可用`)),1)])),t.homepage?(x(),M(`a`,{key:2,class:`mp-group-link`,href:t.homepage,target:`_blank`,rel:`noopener noreferrer`,title:t.homepage},[m(c,null,{default:E(()=>[m(o.Link)]),_:1})],8,xe)):p(`v-if`,!0)]),t.status===`ok`&&t.items.length?(x(),M(`div`,Se,[(x(!0),M(W,null,e(t.items,t=>(x(),M(`article`,{key:o.cardKey(t),class:`mp-card`},[a(`div`,Ce,[a(`span`,{class:`mp-card-name`,title:t.name},O(t.name),9,we),o.metricText(t)?(x(),M(`span`,Te,[m(c,null,{default:E(()=>[t.stars?(x(),i(o.Star,{key:0})):(x(),i(o.Download,{key:1}))]),_:2},1024),f(` `+O(o.metricText(t)),1)])):p(`v-if`,!0)]),a(`p`,{class:`mp-card-desc`,title:t.description},O(t.description||o.$t(`@MKT:暂无描述`)),9,Ee),a(`div`,De,[t.package?(x(),M(`code`,{key:0,class:`mp-meta-pkg`,title:t.package},O(t.package),9,Oe)):t.repository?(x(),M(`span`,{key:1,class:`mp-meta-repo`,title:t.repository+(t.subpath?` · `+t.subpath:``)},[f(O(t.repository),1),t.subpath?(x(),M(W,{key:0},[f(` · `+O(t.subpath),1)],64)):p(`v-if`,!0)],8,ke)):p(`v-if`,!0),t.transport===`remote`?(x(),M(`span`,Ae,O(o.$t(`@MKT:远程服务`)),1)):p(`v-if`,!0),(x(!0),M(W,null,e((t.tags||[]).slice(0,2),e=>(x(),M(`span`,{key:e,class:`mp-tag`},O(e),1))),128))]),a(`div`,je,[t.upstream?(x(),M(`a`,{key:0,class:`mp-card-link`,href:t.upstream,target:`_blank`,rel:`noopener noreferrer`},O(o.$t(`@MKT:查看来源`)),9,Me)):p(`v-if`,!0),n[6]||=a(`span`,{class:`mp-foot-spacer`},null,-1),t.installed?(x(),M(`span`,Ne,[m(c,null,{default:E(()=>[m(o.Check)]),_:1}),f(O(o.$t(`@MKT:已安装`)),1)])):t.installable===!1?(x(),M(`span`,Fe,O(o.$t(`@MKT:暂不支持一键安装`)),1)):(x(),M(`button`,{key:2,class:`mp-install-btn`,disabled:o.isBusy(t),onClick:e=>o.onInstall(t)},O(o.isBusy(t)?o.$t(`@MKT:安装中...`):o.$t(`@MKT:安装`)),9,Pe))])]))),128))])):t.status===`ok`?(x(),M(`div`,Ie,O(o.$t(`@MKT:该来源暂无结果`)),1)):p(`v-if`,!0)]))),128)),p(` ── 已安装 ─────────────────────────────── `),o.installed.length?(x(),M(`section`,Le,[a(`header`,Re,[a(`h3`,ze,O(o.$t(`@MKT:已安装`)),1),a(`span`,Be,O(o.installed.length),1)]),(x(),M(W,null,e([`project`,`global`],t=>a(`div`,{key:t},[o.installedByTarget[t]?.length?(x(),M(`div`,Ve,[a(`div`,He,O(t===`project`?o.$t(`@MKT:当前项目`):o.$t(`@MKT:g ai 智能体`)),1),a(`div`,Ue,[(x(!0),M(W,null,e(o.installedByTarget[t],e=>(x(),M(`div`,{key:t+e.id,class:`mp-installed-row`},[a(`span`,{class:`mp-installed-name`,title:e.name},O(e.name),9,We),p(` 实际落盘的标识:SKILL.md 里的 name 常与仓库名不同(如仓库 taste-skill
2
2
  里的 skill 自称 brandkit),不显示这个用户就对不上广场卡片上的名字 `),e.id&&e.id!==e.name?(x(),M(`code`,{key:0,class:`mp-installed-id`,title:e.dir||e.file||e.id},O(e.id),9,Ge)):p(`v-if`,!0),e.package?(x(),M(`code`,Ke,O(e.package),1)):p(`v-if`,!0),e.requiredEnv?.length?(x(),M(`span`,qe,O(o.$t(`@MKT:待配置`))+`: `+O(e.requiredEnv.join(`, `)),1)):p(`v-if`,!0),n[7]||=a(`span`,{class:`mp-foot-spacer`},null,-1),a(`button`,{class:`mp-reveal-btn`,disabled:o.revealing.has(t+e.id),title:e.dir||e.file||``,onClick:t=>o.onReveal(e)},[m(c,null,{default:E(()=>[m(o.FolderOpened)]),_:1}),f(` `+O(o.$t(`@MKT:打开文件夹`)),1)],8,Je),a(`button`,{class:`mp-remove-btn`,disabled:o.removing.has(t+e.id),onClick:t=>o.onRemove(e)},[m(c,null,{default:E(()=>[m(o.Delete)]),_:1}),f(` `+O(o.removing.has(t+e.id)?o.$t(`@MKT:卸载中...`):o.$t(`@MKT:卸载`)),1)],8,Ye)]))),128))])])):p(`v-if`,!0)])),64))])):p(`v-if`,!0),!o.loading&&!o.groups.length?(x(),M(`div`,Xe,O(o.$t(`@MKT:加载失败`)),1)):p(`v-if`,!0)])),[[y,o.loading]]),p(` ── MCP 安装前配置 ───────────────────────── `),m(o.CommonDialog,{modelValue:o.configDialog.visible,"onUpdate:modelValue":n[5]||=e=>o.configDialog.visible=e,title:o.$t(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:E(()=>[a(`button`,{class:`mkt-cancel`,onClick:n[4]||=e=>o.configDialog.visible=!1},O(o.$t(`@MKT:取消`)),1),a(`button`,{class:`mkt-confirm`,onClick:o.confirmConfig},O(o.$t(`@MKT:安装`)),1)]),default:E(()=>[o.configDialog.item?(x(),M(`div`,Ze,[a(`p`,Qe,O(o.configDialog.item.name),1),(x(!0),M(W,null,e(Object.keys(o.configDialog.env),e=>(x(),M(`div`,{key:e,class:`mkt-field`},[a(`label`,null,O(e),1),P(a(`input`,{"onUpdate:modelValue":t=>o.configDialog.env[e]=t,type:`text`,autocomplete:`off`,placeholder:o.$t(`@MKT:环境变量值`),spellcheck:`false`},null,8,$e),[[S,o.configDialog.env[e]]])]))),128)),o.configDialog.item.args?.length?(x(),M(`div`,et,[a(`label`,null,O(o.$t(`@MKT:启动参数`)),1),P(a(`input`,{"onUpdate:modelValue":n[3]||=e=>o.configDialog.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[S,o.configDialog.args]]),a(`p`,tt,O(o.$t(`@MKT:参数提示`)),1)])):p(`v-if`,!0)])):p(`v-if`,!0)]),_:1},8,[`modelValue`,`title`])])}var rt=J(fe,[[`render`,nt],[`__scopeId`,`data-v-e9f9e851`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/MarketplacePanel.vue`]]);n(),B();var it=c({__name:`AgentView`,setup(e,{expose:n}){n();let r=te(),i=T(null),{narrow:a}=ue(i),o=T(`chat`),s=T(`chat`),ee=h(()=>s.value===`mcp`?`mcp`:`skill`),c=h(()=>[{id:`chat`,label:q(`@AGENT:对话`),icon:k},{id:`skill`,label:q(`@AGENT:Skill 广场`),icon:g},{id:`mcp`,label:q(`@AGENT:MCP 广场`),icon:V}]),{sessions:u,sessionsLoading:d,currentSessionId:f,messages:p,isStreaming:m,sessionLoading:_,loadSessions:y,loadSession:b,deleteSession:x,renameSession:S,newSession:C,sendMessage:w,pendingQuestion:E,answeringQuestion:D,answerQuestion:O,isSessionGenerating:A,currentEngine:j,pendingEngine:M,isEngineLocked:N,pickEngine:P,stop:F}=ce(),I=h(()=>N.value?j.value:M.value);function L(e){N.value||P(e)}let R=h(()=>{let e=r.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),B=h(()=>re(u.value,A)),H=se(),U=h(()=>B.value.find(e=>e.id===f.value)?.title||q(`@AGENT:对话`)),W={"--welcome-avatar":`url("${le}")`},J=h(()=>[{id:`p1`,label:q(`@AGENT:查看项目结构`),prompt:q(`@AGENT:prompt_p1`)},{id:`p2`,label:q(`@AGENT:分析代码质量`),prompt:q(`@AGENT:prompt_p2`)},{id:`p3`,label:q(`@AGENT:帮我写测试`),prompt:q(`@AGENT:prompt_p3`)},{id:`p4`,label:q(`@AGENT:Git 状态检查`),prompt:q(`@AGENT:prompt_p4`)},{id:`p5`,label:q(`@AGENT:帮我启动项目`),prompt:q(`@AGENT:prompt_p5`)}]);async function ne(e){await w(e.text,e.files),await v(),X()}async function fe(e){await w(e.prompt),await v(),X()}let pe=ie(),Y=T(null);function X(e=!0){Y.value?.scrollToBottom(e)}z(()=>p.value.length,()=>{v(()=>X(!1))});function me(e){b(e),o.value=`chat`}function he(){C(),o.value=`chat`}let Z=T(280),Q=T(!1);function ge(e){Q.value=!0;let t=e.clientX,n=Z.value,r=e=>{let r=e.clientX-t,i=Math.max(200,Math.min(500,n+r));Z.value=i},i=()=>{Q.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}z(a,e=>{e||(o.value=`chat`)}),z(()=>[r.currentDirectory,m.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await y(),f.value&&!m.value&&!u.value.some(e=>e.sessionId===f.value)&&C()},{immediate:!0});let $={configStore:r,rootRef:i,narrow:a,chatPage:o,activeTab:s,marketplaceType:ee,tabs:c,sessions:u,sessionsLoading:d,currentSessionId:f,messages:p,isStreaming:m,sessionLoading:_,loadSessions:y,loadSession:b,deleteSession:x,renameSession:S,newSession:C,sendMessage:w,pendingQuestion:E,answeringQuestion:D,answerQuestion:O,isSessionGenerating:A,currentEngine:j,pendingEngine:M,isEngineLocked:N,pickEngine:P,stop:F,displayEngine:I,handleEngineSelect:L,chatTheme:R,conversationItems:B,conversationLabels:H,currentSessionTitle:U,welcomeAvatarStyle:W,presetQuestions:J,onSend:ne,onSelectPreset:fe,questionLabels:pe,chatContainerRef:Y,scrollToBottom:X,selectSession:me,handleNewSession:he,sidebarWidth:Z,isResizing:Q,startResize:ge,get $t(){return q},get ElIcon(){return l},get Loading(){return t},get ChatContainer(){return G},get ConversationList(){return K},get AGENT_UPLOAD_ACCEPT(){return oe},get AGENT_ASSISTANT_NAME(){return ae},get AGENT_ASSISTANT_AVATAR(){return le},MarketplacePanel:rt,AgentEngineSelector:de};return Object.defineProperty($,"__isScriptSetup",{enumerable:!1,value:!0}),$}});n(),o();var at={ref:`rootRef`,class:`agent-view`},ot={class:`agent-chat-area`},st={class:`agent-tabs`,role:`tablist`},ct=[`aria-selected`,`onClick`],lt={class:`agent-tab-body`},ut={key:0,class:`agent-chat-pane`},dt={key:0,class:`agent-list-page`},ft={key:0,class:`agent-page-bar`},pt=[`title`,`aria-label`],mt={class:`agent-page-title`},ht={key:0,class:`chat-loading`};function gt(t,n,r,o,s,ee){return x(),M(`div`,at,[p(` ═══ 宽屏:左侧会话列表(只在「对话」Tab 显示)═══
3
3
  窄屏时这一整块不渲染,会话列表改成 body 里的一个整页(见 .agent-list-page) `),o.activeTab===`chat`&&!o.narrow?(x(),M(W,{key:0},[a(`aside`,{class:`agent-sidebar`,style:y({width:o.sidebarWidth+`px`})},[p(` 会话列表:UI 与交互都在组件库的 ConversationList 里 `),m(o.ConversationList,{class:`agent-conversations`,items:o.conversationItems,"active-id":o.currentSessionId,loading:o.sessionsLoading,labels:o.conversationLabels,onSelect:o.selectSession,onNew:o.handleNewSession,onRename:o.renameSession,onDelete:o.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])],4),p(` 拖拽分隔条 `),a(`div`,{class:u([`sidebar-resizer`,{active:o.isResizing}]),onMousedown:o.startResize},null,34)],64)):p(`v-if`,!0),p(` ═══ 右侧:Tab 栏 + 内容区 ═══ `),a(`main`,ot,[a(`nav`,st,[(x(!0),M(W,null,e(o.tabs,e=>(x(),M(`button`,{key:e.id,type:`button`,class:u([`agent-tab`,{active:o.activeTab===e.id}]),role:`tab`,"aria-selected":o.activeTab===e.id,onClick:t=>o.activeTab=e.id},[m(o.ElIcon,null,{default:E(()=>[(x(),i(L(e.icon)))]),_:2},1024),a(`span`,null,O(e.label),1)],10,ct))),128)),p(` ═══ 引擎选择器 ═══
4
4
  与工作台执行器下拉同一套交互(点击展开、未安装标出来、点了直接开安装弹窗)。
@@ -1,2 +1,2 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{At as e,Bn as t,Dn as n,En as r,Fr as i,In as a,J as o,Jr as s,Nn as c,On as l,Pn as u,Tn as d,W as f,Wn as p,Yn as m,Zn as h,a as g,br as _,cr as v,ei as y,i as b,kn as x,nt as S,or as C,pr as w,qn as T,rt as E,z as D}from"./element-plus-Buzx8xRf.js";import{n as O,t as k}from"./_plugin-vue_export-helper-DcQKU19k.js";import{t as A}from"./CommonDialog-DuI8Bsg7.js";async function j(e,t){let n=e.body.getReader(),r=new TextDecoder(`utf-8`),i=``;for(;;){let{done:e,value:a}=await n.read();if(e)break;i+=r.decode(a,{stream:!0});let o=i.split(`
2
- `);i=o.pop()??``;for(let e of o)e.trim()&&t(e)}i.trim()&&t(i)}async function M(){let e=await fetch(`/api/app-version`);return e.ok?e.json():{success:!1,current:``,latest:null,hasUpdate:!1,error:`HTTP ${e.status}`}}async function ee(e){let t=await fetch(`/api/app-upgrade`,{method:`POST`});if(!t.ok){let n=`HTTP ${t.status}`;try{let e=await t.json();e?.error&&(n=e.error)}catch{}e({type:`error`,message:n}),e({type:`done`,code:t.status});return}if(!t.body){e({type:`error`,message:`响应无 body`}),e({type:`done`,code:-1});return}await j(t,t=>{try{e(JSON.parse(t))}catch{}})}async function N(){let e=await fetch(`/api/app-restart`,{method:`POST`});if(!e.ok){let t=`HTTP ${e.status}`;try{let n=await e.json();n?.error&&(t=n.error)}catch{}throw Error(t)}if(!e.body)throw Error(`响应无 body`);return new Promise((t,n)=>{let r=!1,i=e=>{r||(r=!0,e())};j(e,e=>{try{let r=JSON.parse(e);r.type===`ready`&&typeof r.port==`number`&&r.port>0?i(()=>t(r.port)):r.type===`timeout`?i(()=>n(Error(`restart.timeout`))):r.type===`error`&&i(()=>n(Error(r.message||`restart.failed`)))}catch{}}).then(()=>{i(()=>n(Error(`restart.stream-closed`)))}).catch(()=>{})})}t(),w();var P=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,F=a({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean,required:!0},logs:{type:String,required:!0},status:{type:String,required:!0},countdown:{type:Number,required:!1,default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(t,{expose:n,emit:r}){n();let i=t,a=r,o=_(null);C(()=>i.logs,async()=>{await p(),o.value&&(o.value.scrollTop=o.value.scrollHeight)});function s(){i.status!==`running`&&(i.status===`success`&&i.countdown>0&&a(`cancel`),a(`update:modelValue`,!1))}function c(){a(`retry`)}function l(){a(`restart`)}function u(){a(`cancel`),a(`update:modelValue`,!1)}async function d(){try{await navigator.clipboard.writeText(P),g.success(O(`@F13B4:已复制升级命令`))}catch{g.warning(O(`@F13B4:复制失败,请手动复制`))}}let f={MANUAL_COMMAND:P,props:i,emit:a,logEl:o,close:s,onRetry:c,onRestart:l,onLater:u,onCopyCommand:d,get Loading(){return e},get CircleCheck(){return S},get CircleClose(){return E},get $t(){return O},CommonDialog:A};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}});t(),i();var I={key:3},L={key:4},R={key:5},z={key:0,class:`upgrade-hint`},B={key:0,class:`upgrade-countdown`},V={key:1,class:`upgrade-manual`},H={class:`upgrade-manual__label`};function U(e,t,i,a,d,f){let p=o,m=D;return h(),n(a.CommonDialog,{"model-value":i.modelValue,"onUpdate:modelValue":t[0]||=e=>a.emit(`update:modelValue`,e),title:a.$t(`@F13B4:升级`),width:`680px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":i.status!==`running`,"append-to-body":``,onClose:a.close},{footer:v(()=>[i.status===`failed`?(h(),n(m,{key:0,type:`primary`,onClick:a.onRetry},{default:v(()=>[c(y(a.$t(`@F13B4:重试`)),1)]),_:1})):l(`v-if`,!0),i.status===`failed`?(h(),n(m,{key:1,onClick:a.onCopyCommand},{default:v(()=>[c(y(a.$t(`@F13B4:复制升级命令`)),1)]),_:1})):l(`v-if`,!0),i.status===`success`?(h(),n(m,{key:2,type:`primary`,onClick:a.onRestart},{default:v(()=>[c(y(a.$t(`@F13B4:立即重启并刷新`)),1)]),_:1})):l(`v-if`,!0),i.status===`success`?(h(),n(m,{key:3,onClick:a.onLater},{default:v(()=>[c(y(a.$t(`@F13B4:稍后手动重启`)),1)]),_:1})):l(`v-if`,!0),i.status===`running`?(h(),n(m,{key:4,disabled:``},{default:v(()=>[c(y(a.$t(`@F13B4:升级中`))+`... `,1)]),_:1})):l(`v-if`,!0)]),default:v(()=>[r(`div`,{class:s([`upgrade-status`,`is-${i.status}`])},[i.status===`running`?(h(),n(p,{key:0,class:`is-loading`},{default:v(()=>[u(a.Loading)]),_:1})):i.status===`success`?(h(),n(p,{key:1,color:`var(--color-success)`},{default:v(()=>[u(a.CircleCheck)]),_:1})):(h(),n(p,{key:2,color:`var(--color-danger)`},{default:v(()=>[u(a.CircleClose)]),_:1})),i.status===`running`?(h(),x(`span`,I,y(a.$t(`@F13B4:升级中`)),1)):i.status===`success`?(h(),x(`span`,L,y(a.$t(`@F13B4:升级完成`)),1)):(h(),x(`span`,R,y(a.$t(`@F13B4:升级失败`)),1))],2),i.status===`success`?(h(),x(`p`,z,[c(y(a.$t(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),i.countdown>0?(h(),x(`span`,B,y(a.$t(`@F13B4:{seconds} 秒后自动刷新`,{seconds:i.countdown})),1)):l(`v-if`,!0)])):l(`v-if`,!0),i.status===`failed`?(h(),x(`p`,V,[r(`span`,H,y(a.$t(`@F13B4:手动升级命令`)),1),r(`code`,{class:`upgrade-manual__cmd`},y(a.MANUAL_COMMAND))])):l(`v-if`,!0),r(`pre`,{ref:`logEl`,class:`upgrade-log`},y(i.logs||a.$t(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}var W=k(F,[[`render`,U],[`__scopeId`,`data-v-bc566bba`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/UpgradeDialog.vue`]]);t(),w();var G=`https://github.com/xz333221/zen-gitsync/releases`,K=5,q=`app-version-check`,J=36e5,Y=a({__name:`AppVersionBadge`,setup(e,{expose:t}){t();let n=`2.17.38`,r=_(n),i=d(()=>r.value||n),a=_(null),o=_(!1),s=_(``),c=_(`running`),l=_(0),u=null,f=_(!1);function p(){try{let e=sessionStorage.getItem(q);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>J?null:n}catch{return null}}function h(e){try{sessionStorage.setItem(q,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function v(e=!1){let t=p();t&&(a.value=t);try{let t=await M();a.value=t,h(t),t.current&&(r.value=t.current),!e&&t.success&&t.hasUpdate&&g({type:`success`,message:O(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||g({type:`warning`,message:O(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function y(){if(a.value?.hasUpdate){try{await b.confirm(O(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:a.value.current,latest:a.value.latest}),O(`@F13B4:升级`),{confirmButtonText:O(`@F13B4:确定升级`),cancelButtonText:O(`@F13B4:取消`),type:`info`})}catch{return}s.value=``,c.value=`running`,o.value=!0,await ee(e=>{if(e.type===`done`){if(c.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(q)}catch{}a.value?.latest&&(r.value=a.value.latest),x()}}else e.message&&(s.value+=e.message)})}}function x(){S(),l.value=K,u=setInterval(()=>{--l.value,l.value<=0&&(u&&=(clearInterval(u),null),w())},1e3)}function S(){u&&=(clearInterval(u),null),l.value=0}function C(){S()}async function w(){if(S(),!f.value){f.value=!0;try{let e=await N(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];g({type:`warning`,message:n?O(n):O(`@F13B4:重启失败 {error}`,{error:t})}),f.value=!1}}}T(()=>{S()}),m(()=>{v(!0)});let E={buildVersion:n,releasesUrl:G,runtimeVersion:r,displayVersion:i,latestInfo:a,upgradeDialogVisible:o,upgradeLogs:s,upgradeStatus:c,AUTO_REFRESH_SECONDS:K,countdown:l,get countdownTimer(){return u},set countdownTimer(e){u=e},restartInFlight:f,CACHE_KEY:q,CACHE_TTL_MS:J,readCache:p,writeCache:h,checkUpdate:v,handleUpgrade:y,startAutoRefreshCountdown:x,cancelAutoRefreshCountdown:S,handleCancelAutoRefresh:C,handleRestart:w,get $t(){return O},UpgradeDialog:W};return Object.defineProperty(E,"__isScriptSetup",{enumerable:!1,value:!0}),E}});t(),i();var X={class:`app-version-badge`},Z=[`aria-label`],Q=[`aria-label`],$=[`title`,`aria-label`],te={class:`upgrade-btn__label`},ne={class:`upgrade-btn__version`};function re(e,t,n,i,a,o){let s=f;return h(),x(`div`,X,[l(` GitHub 链接 `),u(s,{content:i.$t(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:v(()=>[r(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i.$t(`@F13B4:在 GitHub 上查看源码`)},[...t[1]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z`})],-1)]],8,Z)]),_:1},8,[`content`]),l(` NPM 链接 `),u(s,{content:i.$t(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:v(()=>[r(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i.$t(`@F13B4:在 npm 上查看包`)},[...t[2]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,Q)]),_:1},8,[`content`]),l(` 版本号 `),u(s,{content:i.$t(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:v(()=>[r(`a`,{href:i.releasesUrl,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+y(i.displayVersion),1)]),_:1},8,[`content`]),i.latestInfo?.hasUpdate?(h(),x(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),"aria-label":i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),onClick:i.handleUpgrade},[t[3]||=r(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),r(`span`,te,y(i.$t(`@F13B4:升级`)),1),r(`span`,ne,`v`+y(i.latestInfo.latest),1)],8,$)):l(`v-if`,!0),u(i.UpgradeDialog,{modelValue:i.upgradeDialogVisible,"onUpdate:modelValue":t[0]||=e=>i.upgradeDialogVisible=e,logs:i.upgradeLogs,status:i.upgradeStatus,countdown:i.countdown,onRetry:i.handleUpgrade,onRestart:i.handleRestart,onCancel:i.handleCancelAutoRefresh},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}var ie=k(Y,[[`render`,re],[`__scopeId`,`data-v-7e0300ec`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/AppVersionBadge.vue`]]);export{ie as default};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{At as e,Bn as t,Dn as n,En as r,Fr as i,In as a,J as o,Jr as s,Nn as c,On as l,Pn as u,Tn as d,W as f,Wn as p,Yn as m,Zn as h,a as g,br as _,cr as v,ei as y,i as b,kn as x,nt as S,or as C,pr as w,qn as T,rt as E,z as D}from"./element-plus-Buzx8xRf.js";import{n as O,t as k}from"./_plugin-vue_export-helper-DqKDIY1f.js";import{t as A}from"./CommonDialog-C3ruJAse.js";async function j(e,t){let n=e.body.getReader(),r=new TextDecoder(`utf-8`),i=``;for(;;){let{done:e,value:a}=await n.read();if(e)break;i+=r.decode(a,{stream:!0});let o=i.split(`
2
+ `);i=o.pop()??``;for(let e of o)e.trim()&&t(e)}i.trim()&&t(i)}async function M(){let e=await fetch(`/api/app-version`);return e.ok?e.json():{success:!1,current:``,latest:null,hasUpdate:!1,error:`HTTP ${e.status}`}}async function ee(e){let t=await fetch(`/api/app-upgrade`,{method:`POST`});if(!t.ok){let n=`HTTP ${t.status}`;try{let e=await t.json();e?.error&&(n=e.error)}catch{}e({type:`error`,message:n}),e({type:`done`,code:t.status});return}if(!t.body){e({type:`error`,message:`响应无 body`}),e({type:`done`,code:-1});return}await j(t,t=>{try{e(JSON.parse(t))}catch{}})}async function N(){let e=await fetch(`/api/app-restart`,{method:`POST`});if(!e.ok){let t=`HTTP ${e.status}`;try{let n=await e.json();n?.error&&(t=n.error)}catch{}throw Error(t)}if(!e.body)throw Error(`响应无 body`);return new Promise((t,n)=>{let r=!1,i=e=>{r||(r=!0,e())};j(e,e=>{try{let r=JSON.parse(e);r.type===`ready`&&typeof r.port==`number`&&r.port>0?i(()=>t(r.port)):r.type===`timeout`?i(()=>n(Error(`restart.timeout`))):r.type===`error`&&i(()=>n(Error(r.message||`restart.failed`)))}catch{}}).then(()=>{i(()=>n(Error(`restart.stream-closed`)))}).catch(()=>{})})}t(),w();var P=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,F=a({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean,required:!0},logs:{type:String,required:!0},status:{type:String,required:!0},countdown:{type:Number,required:!1,default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(t,{expose:n,emit:r}){n();let i=t,a=r,o=_(null);C(()=>i.logs,async()=>{await p(),o.value&&(o.value.scrollTop=o.value.scrollHeight)});function s(){i.status!==`running`&&(i.status===`success`&&i.countdown>0&&a(`cancel`),a(`update:modelValue`,!1))}function c(){a(`retry`)}function l(){a(`restart`)}function u(){a(`cancel`),a(`update:modelValue`,!1)}async function d(){try{await navigator.clipboard.writeText(P),g.success(O(`@F13B4:已复制升级命令`))}catch{g.warning(O(`@F13B4:复制失败,请手动复制`))}}let f={MANUAL_COMMAND:P,props:i,emit:a,logEl:o,close:s,onRetry:c,onRestart:l,onLater:u,onCopyCommand:d,get Loading(){return e},get CircleCheck(){return S},get CircleClose(){return E},get $t(){return O},CommonDialog:A};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}});t(),i();var I={key:3},L={key:4},R={key:5},z={key:0,class:`upgrade-hint`},B={key:0,class:`upgrade-countdown`},V={key:1,class:`upgrade-manual`},H={class:`upgrade-manual__label`};function U(e,t,i,a,d,f){let p=o,m=D;return h(),n(a.CommonDialog,{"model-value":i.modelValue,"onUpdate:modelValue":t[0]||=e=>a.emit(`update:modelValue`,e),title:a.$t(`@F13B4:升级`),width:`680px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":i.status!==`running`,"append-to-body":``,onClose:a.close},{footer:v(()=>[i.status===`failed`?(h(),n(m,{key:0,type:`primary`,onClick:a.onRetry},{default:v(()=>[c(y(a.$t(`@F13B4:重试`)),1)]),_:1})):l(`v-if`,!0),i.status===`failed`?(h(),n(m,{key:1,onClick:a.onCopyCommand},{default:v(()=>[c(y(a.$t(`@F13B4:复制升级命令`)),1)]),_:1})):l(`v-if`,!0),i.status===`success`?(h(),n(m,{key:2,type:`primary`,onClick:a.onRestart},{default:v(()=>[c(y(a.$t(`@F13B4:立即重启并刷新`)),1)]),_:1})):l(`v-if`,!0),i.status===`success`?(h(),n(m,{key:3,onClick:a.onLater},{default:v(()=>[c(y(a.$t(`@F13B4:稍后手动重启`)),1)]),_:1})):l(`v-if`,!0),i.status===`running`?(h(),n(m,{key:4,disabled:``},{default:v(()=>[c(y(a.$t(`@F13B4:升级中`))+`... `,1)]),_:1})):l(`v-if`,!0)]),default:v(()=>[r(`div`,{class:s([`upgrade-status`,`is-${i.status}`])},[i.status===`running`?(h(),n(p,{key:0,class:`is-loading`},{default:v(()=>[u(a.Loading)]),_:1})):i.status===`success`?(h(),n(p,{key:1,color:`var(--color-success)`},{default:v(()=>[u(a.CircleCheck)]),_:1})):(h(),n(p,{key:2,color:`var(--color-danger)`},{default:v(()=>[u(a.CircleClose)]),_:1})),i.status===`running`?(h(),x(`span`,I,y(a.$t(`@F13B4:升级中`)),1)):i.status===`success`?(h(),x(`span`,L,y(a.$t(`@F13B4:升级完成`)),1)):(h(),x(`span`,R,y(a.$t(`@F13B4:升级失败`)),1))],2),i.status===`success`?(h(),x(`p`,z,[c(y(a.$t(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),i.countdown>0?(h(),x(`span`,B,y(a.$t(`@F13B4:{seconds} 秒后自动刷新`,{seconds:i.countdown})),1)):l(`v-if`,!0)])):l(`v-if`,!0),i.status===`failed`?(h(),x(`p`,V,[r(`span`,H,y(a.$t(`@F13B4:手动升级命令`)),1),r(`code`,{class:`upgrade-manual__cmd`},y(a.MANUAL_COMMAND))])):l(`v-if`,!0),r(`pre`,{ref:`logEl`,class:`upgrade-log`},y(i.logs||a.$t(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}var W=k(F,[[`render`,U],[`__scopeId`,`data-v-bc566bba`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/UpgradeDialog.vue`]]);t(),w();var G=`https://github.com/xz333221/zen-gitsync/releases`,K=5,q=`app-version-check`,J=36e5,Y=a({__name:`AppVersionBadge`,setup(e,{expose:t}){t();let n=`2.17.39`,r=_(n),i=d(()=>r.value||n),a=_(null),o=_(!1),s=_(``),c=_(`running`),l=_(0),u=null,f=_(!1);function p(){try{let e=sessionStorage.getItem(q);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>J?null:n}catch{return null}}function h(e){try{sessionStorage.setItem(q,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function v(e=!1){let t=p();t&&(a.value=t);try{let t=await M();a.value=t,h(t),t.current&&(r.value=t.current),!e&&t.success&&t.hasUpdate&&g({type:`success`,message:O(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||g({type:`warning`,message:O(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function y(){if(a.value?.hasUpdate){try{await b.confirm(O(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:a.value.current,latest:a.value.latest}),O(`@F13B4:升级`),{confirmButtonText:O(`@F13B4:确定升级`),cancelButtonText:O(`@F13B4:取消`),type:`info`})}catch{return}s.value=``,c.value=`running`,o.value=!0,await ee(e=>{if(e.type===`done`){if(c.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(q)}catch{}a.value?.latest&&(r.value=a.value.latest),x()}}else e.message&&(s.value+=e.message)})}}function x(){S(),l.value=K,u=setInterval(()=>{--l.value,l.value<=0&&(u&&=(clearInterval(u),null),w())},1e3)}function S(){u&&=(clearInterval(u),null),l.value=0}function C(){S()}async function w(){if(S(),!f.value){f.value=!0;try{let e=await N(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];g({type:`warning`,message:n?O(n):O(`@F13B4:重启失败 {error}`,{error:t})}),f.value=!1}}}T(()=>{S()}),m(()=>{v(!0)});let E={buildVersion:n,releasesUrl:G,runtimeVersion:r,displayVersion:i,latestInfo:a,upgradeDialogVisible:o,upgradeLogs:s,upgradeStatus:c,AUTO_REFRESH_SECONDS:K,countdown:l,get countdownTimer(){return u},set countdownTimer(e){u=e},restartInFlight:f,CACHE_KEY:q,CACHE_TTL_MS:J,readCache:p,writeCache:h,checkUpdate:v,handleUpgrade:y,startAutoRefreshCountdown:x,cancelAutoRefreshCountdown:S,handleCancelAutoRefresh:C,handleRestart:w,get $t(){return O},UpgradeDialog:W};return Object.defineProperty(E,"__isScriptSetup",{enumerable:!1,value:!0}),E}});t(),i();var X={class:`app-version-badge`},Z=[`aria-label`],Q=[`aria-label`],$=[`title`,`aria-label`],te={class:`upgrade-btn__label`},ne={class:`upgrade-btn__version`};function re(e,t,n,i,a,o){let s=f;return h(),x(`div`,X,[l(` GitHub 链接 `),u(s,{content:i.$t(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:v(()=>[r(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i.$t(`@F13B4:在 GitHub 上查看源码`)},[...t[1]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z`})],-1)]],8,Z)]),_:1},8,[`content`]),l(` NPM 链接 `),u(s,{content:i.$t(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:v(()=>[r(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i.$t(`@F13B4:在 npm 上查看包`)},[...t[2]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,Q)]),_:1},8,[`content`]),l(` 版本号 `),u(s,{content:i.$t(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:v(()=>[r(`a`,{href:i.releasesUrl,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+y(i.displayVersion),1)]),_:1},8,[`content`]),i.latestInfo?.hasUpdate?(h(),x(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),"aria-label":i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),onClick:i.handleUpgrade},[t[3]||=r(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),r(`span`,te,y(i.$t(`@F13B4:升级`)),1),r(`span`,ne,`v`+y(i.latestInfo.latest),1)],8,$)):l(`v-if`,!0),u(i.UpgradeDialog,{modelValue:i.upgradeDialogVisible,"onUpdate:modelValue":t[0]||=e=>i.upgradeDialogVisible=e,logs:i.upgradeLogs,status:i.upgradeStatus,countdown:i.countdown,onRetry:i.handleUpgrade,onRestart:i.handleRestart,onCancel:i.handleCancelAutoRefresh},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}var ie=k(Y,[[`render`,re],[`__scopeId`,`data-v-7e0300ec`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/AppVersionBadge.vue`]]);export{ie as default};
@@ -1 +1 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,Dn as n,En as r,F as i,Fr as a,G as o,Ht as s,I as c,In as l,J as u,Jr as d,K as f,Nt as p,On as m,Pn as h,Tn as g,U as _,Zn as v,br as y,cr as b,dn as x,ei as S,kn as C,pr as w,r as T,tt as E,xn as D,yn as O,zt as k}from"./element-plus-Buzx8xRf.js";import{n as A,t as j}from"./_plugin-vue_export-helper-DcQKU19k.js";import{t as M}from"./SvgIcon-YQZtv72i.js";import{t as N}from"./IconButton-C07zojvw.js";import{r as P}from"./gitStore-ZjHYEyKS.js";import{t as F}from"./CommonDialog-DuI8Bsg7.js";t(),w();var I=l({__name:`BranchSelector`,emits:[`branchChanged`],setup(e,{expose:t,emit:n}){t();let r=P(),i=n,a=y(!1),o=y(``),c=g(()=>{let e=o.value.trim().toLowerCase();return e?r.allBranches.filter(t=>t.toLowerCase().includes(e)):r.allBranches});async function l(e){if(e===r.currentBranch){a.value=!1;return}a.value=!1,await r.changeBranch(e)&&(i(`branchChanged`),r.refreshLog())}let u=y(!1),d=y(``),f=y(``);function m(){a.value=!1,f.value=r.currentBranch,u.value=!0}async function h(){await r.createBranch(d.value,f.value)&&(u.value=!1,d.value=``,i(`branchChanged`))}let _=y(!1);async function v(){if(!_.value){_.value=!0;try{await Promise.all([r.getCurrentBranch(!0),r.getBranchStatus(!0),r.getAllBranches()]),i(`branchChanged`),r.refreshLog()}finally{_.value=!1}}}let b={gitStore:r,emit:i,branchPopoverVisible:a,branchFilter:o,filteredBranches:c,selectBranch:l,createBranchDialogVisible:u,newBranchName:d,selectedBaseBranch:f,openCreateBranchDialog:m,createNewBranch:h,isRefreshingBranch:_,refreshCurrentBranch:v,get $t(){return A},get Plus(){return k},get Menu(){return p},get Check(){return E},get Refresh(){return s},CommonDialog:F,IconButton:N,SvgIcon:M};return Object.defineProperty(b,"__isScriptSetup",{enumerable:!1,value:!0}),b}});t(),a(),x();var L={key:0,class:`branch-info`},R={class:`branch-wrapper`},z={class:`branch-btn`},B={class:`branch-btn-name`},V={class:`branch-btn-caret`},H={class:`branch-popover-inner`},U={class:`branch-search`},W={class:`branch-list`},G=[`onClick`],K={key:1,class:`branch-item-check-placeholder`},q={class:`branch-item-name`},J={key:0,class:`branch-empty`},Y={class:`branch-popover-footer`},X={class:`create-branch-content`},Z={class:`form-label`},Q={class:`form-label`},$={class:`dialog-footer`},ee={class:`footer-actions`},te=[`disabled`];function ne(t,a,s,l,p,g){let y=u,x=_,w=T,E=f,k=i,A=c,j=o;return l.gitStore.currentBranch?(v(),C(`div`,L,[r(`div`,R,[m(` VSCode 风格分支按钮 + 弹出列表 `),h(w,{visible:l.branchPopoverVisible,"onUpdate:visible":a[1]||=e=>l.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:a[2]||=e=>l.branchFilter=``},{reference:b(()=>[r(`button`,z,[h(l.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),r(`span`,B,S(l.gitStore.currentBranch),1),r(`span`,V,[h(y,null,{default:b(()=>[...a[7]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.776a29.12 29.12 0 0 0 0-41.6 30.592 30.592 0 0 0-42.752 0z`})],-1)]]),_:1})])])]),default:b(()=>[r(`div`,H,[m(` 搜索框 `),r(`div`,U,[h(x,{modelValue:l.branchFilter,"onUpdate:modelValue":a[0]||=e=>l.branchFilter=e,placeholder:l.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),m(` 分支列表 `),r(`div`,W,[(v(!0),C(D,null,e(l.filteredBranches,e=>(v(),C(`div`,{key:e,class:d([`branch-item`,{"is-active":e===l.gitStore.currentBranch}]),onClick:t=>l.selectBranch(e)},[e===l.gitStore.currentBranch?(v(),n(y,{key:0,class:`branch-item-check`},{default:b(()=>[h(l.Check)]),_:1})):(v(),C(`span`,K)),h(l.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),r(`span`,q,S(e),1)],10,G))),128)),l.filteredBranches.length===0?(v(),C(`div`,J,S(l.$t(`@F13B4:没有匹配的分支`)),1)):m(`v-if`,!0)]),m(` 底部:创建新分支 `),r(`div`,Y,[r(`button`,{class:`branch-create-btn`,onClick:l.openCreateBranchDialog},[h(y,null,{default:b(()=>[h(l.Plus)]),_:1}),r(`span`,null,S(l.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),m(` 刷新按钮 `),h(l.IconButton,{tooltip:l.$t(`@CMDCON:刷新`),onClick:l.refreshCurrentBranch},{default:b(()=>[h(y,{class:d({"is-loading":l.isRefreshingBranch})},{default:b(()=>[h(l.Refresh)]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),m(` 创建分支对话框 `),h(l.CommonDialog,{modelValue:l.createBranchDialogVisible,"onUpdate:modelValue":a[6]||=e=>l.createBranchDialogVisible=e,title:l.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:b(()=>[r(`div`,$,[r(`div`,ee,[r(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:a[5]||=e=>l.createBranchDialogVisible=!1},S(l.$t(`@F13B4:取消`)),1),r(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:l.createNewBranch,disabled:l.gitStore.isCreatingBranch},[l.gitStore.isCreatingBranch?(v(),n(y,{key:1,class:`is-loading`},{default:b(()=>[...a[8]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z`})],-1)]]),_:1})):(v(),n(y,{key:0},{default:b(()=>[h(l.Check)]),_:1})),r(`span`,null,S(l.$t(`@F13B4:创建`)),1)],8,te)])])]),default:b(()=>[r(`div`,X,[h(j,{model:{newBranchName:l.newBranchName,selectedBaseBranch:l.selectedBaseBranch},"label-position":`top`},{default:b(()=>[h(E,null,{label:b(()=>[r(`div`,Z,[h(y,{class:`label-icon`},{default:b(()=>[h(l.Plus)]),_:1}),r(`span`,null,S(l.$t(`@F13B4:新分支名称`)),1)])]),default:b(()=>[h(x,{modelValue:l.newBranchName,"onUpdate:modelValue":a[3]||=e=>l.newBranchName=e,placeholder:l.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:O(l.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),h(E,null,{label:b(()=>[r(`div`,Q,[h(y,{class:`label-icon`},{default:b(()=>[h(l.Menu)]),_:1}),r(`span`,null,S(l.$t(`@F13B4:基于分支`)),1)])]),default:b(()=>[h(A,{modelValue:l.selectedBaseBranch,"onUpdate:modelValue":a[4]||=e=>l.selectedBaseBranch=e,placeholder:l.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:b(()=>[(v(!0),C(D,null,e(l.gitStore.allBranches,e=>(v(),n(k,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):m(`v-if`,!0)}var re=j(I,[[`render`,ne],[`__scopeId`,`data-v-9548a76f`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{re as default};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,Dn as n,En as r,F as i,Fr as a,G as o,Ht as s,I as c,In as l,J as u,Jr as d,K as f,Nt as p,On as m,Pn as h,Tn as g,U as _,Zn as v,br as y,cr as b,dn as x,ei as S,kn as C,pr as w,r as T,tt as E,xn as D,yn as O,zt as k}from"./element-plus-Buzx8xRf.js";import{n as A,t as j}from"./_plugin-vue_export-helper-DqKDIY1f.js";import{t as M}from"./SvgIcon-CBqXx2qp.js";import{t as N}from"./IconButton-CmaM18jB.js";import{r as P}from"./gitStore-BrDeYGjs.js";import{t as F}from"./CommonDialog-C3ruJAse.js";t(),w();var I=l({__name:`BranchSelector`,emits:[`branchChanged`],setup(e,{expose:t,emit:n}){t();let r=P(),i=n,a=y(!1),o=y(``),c=g(()=>{let e=o.value.trim().toLowerCase();return e?r.allBranches.filter(t=>t.toLowerCase().includes(e)):r.allBranches});async function l(e){if(e===r.currentBranch){a.value=!1;return}a.value=!1,await r.changeBranch(e)&&(i(`branchChanged`),r.refreshLog())}let u=y(!1),d=y(``),f=y(``);function m(){a.value=!1,f.value=r.currentBranch,u.value=!0}async function h(){await r.createBranch(d.value,f.value)&&(u.value=!1,d.value=``,i(`branchChanged`))}let _=y(!1);async function v(){if(!_.value){_.value=!0;try{await Promise.all([r.getCurrentBranch(!0),r.getBranchStatus(!0),r.getAllBranches()]),i(`branchChanged`),r.refreshLog()}finally{_.value=!1}}}let b={gitStore:r,emit:i,branchPopoverVisible:a,branchFilter:o,filteredBranches:c,selectBranch:l,createBranchDialogVisible:u,newBranchName:d,selectedBaseBranch:f,openCreateBranchDialog:m,createNewBranch:h,isRefreshingBranch:_,refreshCurrentBranch:v,get $t(){return A},get Plus(){return k},get Menu(){return p},get Check(){return E},get Refresh(){return s},CommonDialog:F,IconButton:N,SvgIcon:M};return Object.defineProperty(b,"__isScriptSetup",{enumerable:!1,value:!0}),b}});t(),a(),x();var L={key:0,class:`branch-info`},R={class:`branch-wrapper`},z={class:`branch-btn`},B={class:`branch-btn-name`},V={class:`branch-btn-caret`},H={class:`branch-popover-inner`},U={class:`branch-search`},W={class:`branch-list`},G=[`onClick`],K={key:1,class:`branch-item-check-placeholder`},q={class:`branch-item-name`},J={key:0,class:`branch-empty`},Y={class:`branch-popover-footer`},X={class:`create-branch-content`},Z={class:`form-label`},Q={class:`form-label`},$={class:`dialog-footer`},ee={class:`footer-actions`},te=[`disabled`];function ne(t,a,s,l,p,g){let y=u,x=_,w=T,E=f,k=i,A=c,j=o;return l.gitStore.currentBranch?(v(),C(`div`,L,[r(`div`,R,[m(` VSCode 风格分支按钮 + 弹出列表 `),h(w,{visible:l.branchPopoverVisible,"onUpdate:visible":a[1]||=e=>l.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:a[2]||=e=>l.branchFilter=``},{reference:b(()=>[r(`button`,z,[h(l.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),r(`span`,B,S(l.gitStore.currentBranch),1),r(`span`,V,[h(y,null,{default:b(()=>[...a[7]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.776a29.12 29.12 0 0 0 0-41.6 30.592 30.592 0 0 0-42.752 0z`})],-1)]]),_:1})])])]),default:b(()=>[r(`div`,H,[m(` 搜索框 `),r(`div`,U,[h(x,{modelValue:l.branchFilter,"onUpdate:modelValue":a[0]||=e=>l.branchFilter=e,placeholder:l.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),m(` 分支列表 `),r(`div`,W,[(v(!0),C(D,null,e(l.filteredBranches,e=>(v(),C(`div`,{key:e,class:d([`branch-item`,{"is-active":e===l.gitStore.currentBranch}]),onClick:t=>l.selectBranch(e)},[e===l.gitStore.currentBranch?(v(),n(y,{key:0,class:`branch-item-check`},{default:b(()=>[h(l.Check)]),_:1})):(v(),C(`span`,K)),h(l.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),r(`span`,q,S(e),1)],10,G))),128)),l.filteredBranches.length===0?(v(),C(`div`,J,S(l.$t(`@F13B4:没有匹配的分支`)),1)):m(`v-if`,!0)]),m(` 底部:创建新分支 `),r(`div`,Y,[r(`button`,{class:`branch-create-btn`,onClick:l.openCreateBranchDialog},[h(y,null,{default:b(()=>[h(l.Plus)]),_:1}),r(`span`,null,S(l.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),m(` 刷新按钮 `),h(l.IconButton,{tooltip:l.$t(`@CMDCON:刷新`),onClick:l.refreshCurrentBranch},{default:b(()=>[h(y,{class:d({"is-loading":l.isRefreshingBranch})},{default:b(()=>[h(l.Refresh)]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),m(` 创建分支对话框 `),h(l.CommonDialog,{modelValue:l.createBranchDialogVisible,"onUpdate:modelValue":a[6]||=e=>l.createBranchDialogVisible=e,title:l.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:b(()=>[r(`div`,$,[r(`div`,ee,[r(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:a[5]||=e=>l.createBranchDialogVisible=!1},S(l.$t(`@F13B4:取消`)),1),r(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:l.createNewBranch,disabled:l.gitStore.isCreatingBranch},[l.gitStore.isCreatingBranch?(v(),n(y,{key:1,class:`is-loading`},{default:b(()=>[...a[8]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z`})],-1)]]),_:1})):(v(),n(y,{key:0},{default:b(()=>[h(l.Check)]),_:1})),r(`span`,null,S(l.$t(`@F13B4:创建`)),1)],8,te)])])]),default:b(()=>[r(`div`,X,[h(j,{model:{newBranchName:l.newBranchName,selectedBaseBranch:l.selectedBaseBranch},"label-position":`top`},{default:b(()=>[h(E,null,{label:b(()=>[r(`div`,Z,[h(y,{class:`label-icon`},{default:b(()=>[h(l.Plus)]),_:1}),r(`span`,null,S(l.$t(`@F13B4:新分支名称`)),1)])]),default:b(()=>[h(x,{modelValue:l.newBranchName,"onUpdate:modelValue":a[3]||=e=>l.newBranchName=e,placeholder:l.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:O(l.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),h(E,null,{label:b(()=>[r(`div`,Q,[h(y,{class:`label-icon`},{default:b(()=>[h(l.Menu)]),_:1}),r(`span`,null,S(l.$t(`@F13B4:基于分支`)),1)])]),default:b(()=>[h(A,{modelValue:l.selectedBaseBranch,"onUpdate:modelValue":a[4]||=e=>l.selectedBaseBranch=e,placeholder:l.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:b(()=>[(v(!0),C(D,null,e(l.gitStore.allBranches,e=>(v(),n(k,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):m(`v-if`,!0)}var re=j(I,[[`render`,ne],[`__scopeId`,`data-v-9548a76f`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{re as default};
@@ -1,4 +1,4 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,At as t,Bn as n,Bt as r,C as i,Cn as a,Dn as o,Dt as s,En as c,F as l,Fr as u,G as d,Gt as f,Ht as p,I as m,In as h,J as g,Jr as _,K as v,L as y,M as b,Nn as x,Nt as S,On as C,Pn as w,Q as T,S as E,T as D,Tn as O,U as k,V as A,W as j,Wn as ee,Wt as M,Xn as te,Xr as N,Y as ne,Yn as re,Zn as P,_ as ie,a as F,at as I,bn as L,br as R,cr as z,ct as ae,dn as B,ei as V,ht as oe,i as se,j as ce,kn as H,ln as U,lr as le,lt as ue,mt as de,nn as fe,nt as pe,o as me,or as W,ot as he,pr as G,q as ge,qt as _e,st as ve,tt as ye,vn as be,vr as xe,w as Se,x as Ce,xn as K,z as q,zt as we}from"./element-plus-Buzx8xRf.js";import{b as Te}from"./vendor-wERX2bc3.js";import{n as J,t as Y}from"./_plugin-vue_export-helper-DcQKU19k.js";import{t as Ee}from"./SvgIcon-YQZtv72i.js";import{t as De}from"./IconButton-C07zojvw.js";import{r as Oe,t as X}from"./configStore-u3FUM08v.js";import{i as ke,r as Z}from"./gitStore-ZjHYEyKS.js";import{t as Ae}from"./CommonDialog-DuI8Bsg7.js";import{t as je}from"./TemplateManager-zSKmah02.js";import{C as Me,S as Ne,T as Q,b as Pe,w as Fe,x as Ie,y as Le}from"./index-DorcTBZN.js";n();var Re=h({__name:`StageButton`,props:{from:{type:String,required:!1,default:`form`}},emits:[`click`],setup(e,{expose:t,emit:n}){t();let r=n,i=Z(),a=X();function o(e){let t=e.replace(/\\/g,`/`);return a.lockedFiles.some(e=>{let n=e.replace(/\\/g,`/`);return t===n})}function s(){return a.lockedFiles.length!==0&&i.fileList.some(e=>[`modified`,`deleted`,`untracked`].includes(e.type)?o(e.path):!1)}let c=O(()=>i.fileList.filter(e=>[`modified`,`deleted`,`untracked`].includes(e.type)&&!o(e.path)).length),l=O(()=>i.fileList.some(e=>[`modified`,`deleted`,`untracked`].includes(e.type)&&!o(e.path))),u=O(()=>i.isSelectionMode&&i.hasSelectableFiles),d=O(()=>i.selectedUnstagedPaths.length),f=O(()=>i.isSelectionMode?d.value===0:!l.value),p=O(()=>u.value?`${J(`@29974:暂存所选 `)}${d.value}${J(`@29974: 个文件`)}`:l.value?s()?`${J(`@29974:暂存`)}${c.value}${J(`@29974:个未暂存文件(逐个添加)`)}`:`${J(`@29974:暂存所有更改(git add .)`)}`:J(`@29974:没有需要暂存的更改`));async function m(){r(`click`);try{if(u.value){await i.stageFiles(i.selectedUnstagedPaths);return}if(i.isSelectionMode)return;s()?await i.addToStage():await i.addAllToStage()}catch(e){console.error(`添加文件失败:`,e)}}let h={emit:r,gitStore:i,configStore:a,isFileLocked:o,hasLockedFileMatches:s,unstagedFilesCount:c,hasUnstagedChanges:l,isSelectiveStage:u,selectedStageCount:d,isDisabled:f,tooltipText:p,handleClick:m,get $t(){return J},get Plus(){return we}};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}});u(),n();var ze={key:0},Be={key:1};function Ve(e,t,n,r,i,a){let s=q,c=j;return P(),o(c,{content:r.tooltipText,placement:`top`},{default:z(()=>[w(s,{type:`primary`,icon:r.Plus,onClick:r.handleClick,loading:r.gitStore.isAddingFiles,disabled:r.isDisabled,class:_([`stage-button`,`from-${n.from}`,{"is-selective":r.isSelectiveStage}])},{default:z(()=>[x(V(r.isSelectiveStage?r.$t(`@29974:暂存所选`):r.$t(`@29974:暂存`))+` `,1),r.isSelectiveStage?(P(),H(`span`,ze,`(`+V(r.selectedStageCount)+`)`,1)):r.unstagedFilesCount>0?(P(),H(`span`,Be,`(`+V(r.unstagedFilesCount)+`)`,1)):C(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`class`])]),_:1},8,[`content`])}var He=Y(Re,[[`render`,Ve],[`__scopeId`,`data-v-d99cab92`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/StageButton.vue`]]);n();var Ue=h({__name:`CommitButton`,props:{from:{type:String,required:!1,default:`form`},hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1}},emits:[`click`,`beforeCommit`,`afterCommit`],setup(e,{expose:n,emit:r}){n();let i=e,a=r,o=Z(),s=X(),c=O(()=>o.fileList.filter(e=>e.type===`added`&&!Q(e.path,s.lockedFiles)).length),l=O(()=>c.value>0),u=O(()=>o.hasConflictedFiles||o.isCommiting?!0:o.isMergeInProgress?!i.hasUserCommitMessage:!l.value||!i.hasUserCommitMessage),d=O(()=>o.isCommiting?J(`@76A11:正在提交中…`):o.hasConflictedFiles?J(`@76A11:存在冲突文件,请先解决冲突`):o.isMergeInProgress?i.hasUserCommitMessage?J(`@76A11:提交并完成合并`):J(`@76A11:请输入提交信息`):l.value?i.hasUserCommitMessage?`${J(`@76A11:提交`)}${c.value}${J(`@76A11:个已暂存文件`)}`:J(`@76A11:请输入提交信息`):J(`@76A11:没有已暂存的更改`)),f=O(()=>o.isCommiting?J(`@76A11:提交中…`):J(`@76A11:提交`));async function p(){if(i.finalCommitMessage.trim()){a(`beforeCommit`),a(`click`);try{let e=await o.commitChanges(i.finalCommitMessage,i.skipHooks);a(`afterCommit`,e)}catch(e){console.error(`提交失败:`,e),a(`afterCommit`,!1)}}}let m={props:i,emit:a,gitStore:o,configStore:s,stagedFilesCount:c,hasStagedChanges:l,isDisabled:u,tooltipText:d,buttonLabel:f,handleClick:p,get $t(){return J},get Check(){return ye},get Loading(){return t}};return Object.defineProperty(m,"__isScriptSetup",{enumerable:!1,value:!0}),m}});u(),n();var We={key:0};function Ge(e,t,n,r,i,a){let s=q,c=j;return P(),o(c,{content:r.tooltipText,placement:`top`,disabled:r.gitStore.isCommiting},{default:z(()=>[w(s,{type:`primary`,onClick:r.handleClick,icon:r.gitStore.isCommiting?r.Loading:r.Check,loading:r.gitStore.isCommiting,disabled:r.isDisabled,"aria-busy":r.gitStore.isCommiting?`true`:void 0,"aria-label":r.gitStore.isCommiting?r.$t(`@76A11:正在提交中…`):void 0,class:_([`commit-button`,`from-${n.from}`,{"is-committing":r.gitStore.isCommiting}])},{default:z(()=>[x(V(r.buttonLabel)+` `,1),r.stagedFilesCount>0&&!r.gitStore.isCommiting?(P(),H(`span`,We,`(`+V(r.stagedFilesCount)+`)`,1)):C(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`aria-busy`,`aria-label`,`class`])]),_:1},8,[`content`,`disabled`])}var Ke=Y(Ue,[[`render`,Ge],[`__scopeId`,`data-v-100f6d49`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/CommitButton.vue`]]);n(),G();var qe=h({__name:`PushProgressModal`,props:{modelValue:{type:Boolean,required:!0}},emits:[`update:modelValue`,`complete`,`pull-requested`],setup(e,{expose:n,emit:r}){let{t:i}=Te(),a=e,o=r,s=X(),c=Z(),l=R(`progress`),u=R([]),d=R(``),f=R(!1),p=O(()=>d.value.includes(`non-fast-forward`)||d.value.includes(`rejected`)&&d.value.includes(`fetch first`)),m=R(!1);async function h(){m.value=!0;try{(await c.gitPull()).success&&(b.value=!1,o(`pull-requested`))}finally{m.value=!1}}let _=xe([{name:`counting`,label:i(`@PUSH:计数对象`),status:`wait`,percent:0},{name:`compressing`,label:i(`@PUSH:压缩对象`),status:`wait`,percent:0},{name:`writing`,label:i(`@PUSH:写入对象`),status:`wait`,percent:0},{name:`resolving`,label:i(`@PUSH:解析增量`),status:`wait`,percent:0}]),v=R(0),y=R(null),b=O({get:()=>a.modelValue,set:e=>o(`update:modelValue`,e)}),x=O(()=>{if(f.value)return i(`@PUSH:正在拉取远程更新`);switch(l.value){case`progress`:return i(`@PUSH:正在推送`);case`success`:return i(`@PUSH:推送成功`);case`error`:return i(`@PUSH:推送失败`);default:return``}});function S(e){switch(e.type){case`progress`:e.message&&(u.value.push(e.message),setTimeout(()=>{y.value&&(y.value.scrollTop=y.value.scrollHeight)},0));break;case`stage-progress`:if(e.stage&&typeof e.percent==`number`){let t=_.findIndex(t=>t.name===e.stage);t!==-1&&(_[t].percent=e.percent,_[t].status=e.percent===100?`finish`:`process`,v.value=t,e.percent===100&&t<_.length-1&&(_[t+1].status=`wait`))}break;case`complete`:e.success?(l.value=`success`,_.forEach(e=>{(e.status===`process`||e.status===`wait`)&&(e.status=`finish`,e.percent=100)}),v.value=-1,s.autoClosePushModal?setTimeout(()=>{b.value=!1,o(`complete`,!0)},2e3):o(`complete`,!0)):(l.value=`error`,d.value=ke(e),v.value<_.length&&(_[v.value].status=`error`),v.value=-1,o(`complete`,!1))}}function C(){l.value=`progress`,u.value=[],d.value=``,v.value=0,f.value=!1,_.forEach(e=>{e.status=`wait`,e.percent=0})}function w(e){f.value=e}n({handleProgress:S,reset:C,setPulling:w});let T={t:i,props:a,emit:o,configStore:s,gitStore:c,status:l,messages:u,errorMessage:d,isPullingRemote:f,isNonFastForwardError:p,isPulling:m,handlePullAndRetry:h,stages:_,activeStep:v,messagesContainerRef:y,visible:b,statusText:x,handleProgress:S,reset:C,setPulling:w,get ElProgress(){return ie},get ElIcon(){return g},get Close(){return he},get Loading(){return t},get CircleCheck(){return pe},get Download(){return de},CommonDialog:Ae};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}});n(),u();var Je={class:`push-progress-container`},Ye={key:0,class:`pulling-section`},Xe={class:`pulling-text-wrap`},Ze={class:`pulling-title`},Qe={class:`pulling-sub`},$e={class:`stage-header`},et={class:`stage-icon`},tt={class:`stage-info`},nt={class:`stage-label`},rt={key:0,class:`stage-percent`},it={key:0,class:`stage-progress`},at={key:2,class:`error-section`},ot={class:`error-header`},st={class:`error-title`},ct={class:`error-content`},lt={key:0,class:`error-suggestion`},ut={key:3,class:`messages-section`},dt={class:`messages-title`},ft={ref:`messagesContainerRef`,class:`progress-messages`};function pt(t,n,r,i,a,s){let l=q;return P(),o(i.CommonDialog,{modelValue:i.visible,"onUpdate:modelValue":n[0]||=e=>i.visible=e,title:i.statusText,width:`650px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":i.status!==`progress`,"append-to-body":!0,"lock-scroll":!1,"destroy-on-close":``,"custom-class":`push-progress-dialog status-${i.status}`},{default:z(()=>[c(`div`,Je,[C(` 拉取中提示 `),i.isPullingRemote?(P(),H(`div`,Ye,[n[1]||=c(`div`,{class:`pulling-icon-wrap`},[c(`svg`,{class:`pulling-spinner`,viewBox:`0 0 50 50`},[c(`circle`,{class:`pulling-spinner-track`,cx:`25`,cy:`25`,r:`20`,fill:`none`,"stroke-width":`4`}),c(`circle`,{class:`pulling-spinner-arc`,cx:`25`,cy:`25`,r:`20`,fill:`none`,"stroke-width":`4`})])],-1),c(`div`,Xe,[c(`div`,Ze,V(i.t(`@PUSH:正在拉取远程更新`)),1),c(`div`,Qe,V(i.t(`@PUSH:拉取完成后自动继续推送`)),1)])])):(P(),H(K,{key:1},[C(` 推送阶段(2x2网格) `),c(`div`,{class:_([`stages-section`,{"is-loading":i.status===`progress`,"is-success":i.status===`success`}])},[(P(!0),H(K,null,e(i.stages,(e,t)=>(P(),H(`div`,{key:e.name,class:_([`stage-item`,{active:i.activeStep===t,finished:e.status===`finish`,error:e.status===`error`}])},[c(`div`,$e,[c(`div`,et,[e.status===`finish`?(P(),o(i.ElIcon,{key:0,class:`icon-finish`},{default:z(()=>[w(i.CircleCheck)]),_:1})):e.status===`error`?(P(),o(i.ElIcon,{key:1,class:`icon-error`},{default:z(()=>[w(i.Close)]),_:1})):e.status===`process`?(P(),o(i.ElIcon,{key:2,class:`icon-process rotating`},{default:z(()=>[w(i.Loading)]),_:1})):(P(),o(i.ElIcon,{key:3,class:`icon-wait`},{default:z(()=>[w(i.Loading)]),_:1}))]),c(`div`,tt,[c(`div`,nt,V(e.label),1),e.status===`process`||e.status===`finish`?(P(),H(`div`,rt,V(e.percent)+`% `,1)):C(`v-if`,!0)])]),e.status===`process`||e.status===`finish`?(P(),H(`div`,it,[w(i.ElProgress,{percentage:e.percent,"stroke-width":6,"show-text":!1,color:e.status===`finish`?`var(--color-success)`:`var(--color-primary)`},null,8,[`percentage`,`color`])])):C(`v-if`,!0)],2))),128))],2)],2112)),C(` 错误信息 `),i.status===`error`&&i.errorMessage?(P(),H(`div`,at,[c(`div`,ot,[c(`div`,st,V(i.t(`@PUSH:错误详情`))+`:`,1),i.isNonFastForwardError?(P(),o(l,{key:0,type:`primary`,size:`small`,loading:i.isPulling,onClick:i.handlePullAndRetry,class:`pull-button`},{default:z(()=>[w(i.ElIcon,null,{default:z(()=>[w(i.Download)]),_:1}),x(` `+V(i.t(`@PUSH:先拉取更新`)),1)]),_:1},8,[`loading`])):C(`v-if`,!0)]),c(`div`,ct,V(i.errorMessage),1),i.isNonFastForwardError?(P(),H(`div`,lt,V(i.t(`@PUSH:检测到远程有新提交,请先拉取更新后再推送。`)),1)):C(`v-if`,!0)])):C(`v-if`,!0),C(` 进度消息 `),i.messages.length>0?(P(),H(`div`,ut,[c(`div`,dt,V(i.t(`@PUSH:详细信息`))+`:`,1),c(`div`,ft,[(P(!0),H(K,null,e(i.messages,(e,t)=>(P(),H(`div`,{key:t,class:`message-item`},V(e),1))),128))],512)])):C(`v-if`,!0)])]),_:1},8,[`modelValue`,`title`,`show-close`,`custom-class`])}var mt=Y(qe,[[`render`,pt],[`__scopeId`,`data-v-0e0be0c3`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/PushProgressModal.vue`]]);n(),G();var ht=h({__name:`PushButton`,props:{from:{type:String,required:!1,default:`form`}},emits:[`click`,`beforePush`,`afterPush`],setup(e,{expose:t,emit:n}){t();let r=n,i=Z(),a=R(!1),o=R(null),s=O(()=>i.branchAhead>0),c=O(()=>i.fileList.some(e=>e.type===`added`)),l=O(()=>!i.hasConflictedFiles&&i.hasUpstream&&s.value&&!c.value),u=O(()=>!l.value),d=O(()=>i.hasConflictedFiles?J(`@F4137:存在冲突文件,请先解决冲突`):i.hasUpstream?s.value?c.value?J(`@F4137:有未提交的暂存更改,请先提交`):`${J(`@F4137:推送`)}${i.branchAhead}${J(`@F4137:个本地提交`)}`:J(`@F4137:没有需要推送的提交`):J(`@F4137:当前分支没有上游分支`)),f=O(()=>l.value?{backgroundColor:`var(--tint-success-14)`,borderColor:`var(--color-success)`,color:`var(--text-primary)`}:{});async function p(){r(`beforePush`),r(`click`);try{a.value=!0,o.value&&o.value.reset();let e=await i.pushToRemoteWithProgress(e=>{o.value&&o.value.handleProgress(e)});e&&await new Promise(e=>setTimeout(e,200)),r(`afterPush`,e)}catch(e){console.error(`推送失败:`,e),r(`afterPush`,!1)}}function m(e){}let h=O(()=>[...i.remotes].sort((e,t)=>e.isUpstream===t.isUpstream?e.name.localeCompare(t.name):e.isUpstream?-1:1));async function g(e){if(e===`manage`){i.isRemoteManagerVisible=!0;return}if(e===`push-all`){await i.pushAllRemotes();return}if(!e.startsWith(`push:`))return;let t=e.slice(5);r(`beforePush`);try{a.value=!0,o.value?.reset();let e=await i.pushToRemoteWithProgress(e=>{o.value?.handleProgress(e)},t);r(`afterPush`,e)}catch(e){console.error(`推送失败:`,e),r(`afterPush`,!1)}}let _={emit:r,gitStore:i,progressModalVisible:a,progressModalRef:o,needsPush:s,hasStagedChanges:c,canPush:l,isDisabled:u,tooltipText:d,buttonStyle:f,handleClick:p,handleProgressComplete:m,sortedRemotes:h,handleDropdownCommand:g,get $t(){return J},get Upload(){return fe},get ArrowDown(){return ne},PushProgressModal:mt};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}});u(),n();var gt={class:`push-button-group`},_t={key:0},vt={class:`push-remote-item`};function yt(t,n,r,a,s,l){let u=q,d=j,f=y,p=i,m=Se,h=E;return P(),H(`div`,null,[c(`div`,gt,[w(d,{content:a.tooltipText,placement:`top`},{default:z(()=>[w(u,{type:`primary`,icon:a.Upload,onClick:a.handleClick,loading:a.gitStore.isPushing,disabled:a.isDisabled,style:N(a.buttonStyle),class:_([`push-button`,`from-${r.from}`])},{default:z(()=>[x(V(a.$t(`@F4137:推送`))+` `,1),a.needsPush?(P(),H(`span`,_t,`(`+V(a.gitStore.branchAhead)+`)`,1)):C(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`style`,`class`])]),_:1},8,[`content`]),C(` 多远程下拉:仅在配置了多个远程时出现,单远程外观与历史完全一致 `),a.gitStore.hasMultipleRemotes?(P(),o(h,{key:0,trigger:`click`,placement:`top-end`,onCommand:a.handleDropdownCommand},{dropdown:z(()=>[w(m,null,{default:z(()=>[(P(!0),H(K,null,e(a.sortedRemotes,e=>(P(),o(p,{key:e.name,command:`push:${e.name}`},{default:z(()=>[c(`span`,vt,[c(`span`,null,V(a.$t(`@F4137:推送到`))+` `+V(e.name),1),e.isUpstream?(P(),o(f,{key:0,size:`small`,type:`success`,effect:`plain`},{default:z(()=>[x(V(a.$t(`@F4137:上游`)),1)]),_:1})):C(`v-if`,!0)])]),_:2},1032,[`command`]))),128)),w(p,{divided:``,command:`push-all`},{default:z(()=>[x(V(a.$t(`@F4137:推送到全部远程`)),1)]),_:1}),w(p,{divided:``,command:`manage`},{default:z(()=>[x(V(a.$t(`@F4137:管理远程…`)),1)]),_:1})]),_:1})]),default:z(()=>[w(u,{type:`primary`,icon:a.ArrowDown,style:N(a.buttonStyle),class:_([`push-button__caret`,`from-${r.from}`]),"aria-label":a.$t(`@F4137:更多推送选项`)},null,8,[`icon`,`style`,`class`,`aria-label`])]),_:1})):C(`v-if`,!0)]),C(` 推送进度弹窗 `),w(a.PushProgressModal,{ref:`progressModalRef`,modelValue:a.progressModalVisible,"onUpdate:modelValue":n[0]||=e=>a.progressModalVisible=e,onComplete:a.handleProgressComplete},null,8,[`modelValue`])])}var bt=Y(ht,[[`render`,yt],[`__scopeId`,`data-v-bcb696bd`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/PushButton.vue`]]);n(),G();var xt=h({__name:`QuickPushButton`,props:{from:{type:String,required:!1,default:`form`},hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1}},emits:[`beforePush`,`pushStart`,`afterPush`,`clearFields`],setup(e,{expose:t,emit:n}){let i=Z(),a=X(),o=R(!1),s=R(null),c=e,l=n,u=O(()=>i.fileList.some(e=>!Q(e.path,a.lockedFiles))),d=O(()=>i.isSelectionMode&&i.selectedFiles.size>0&&i.selectedUnstagedPaths.length>0),f=O(()=>!i.isSelectionMode&&!u.value&&i.branchAhead>0),p=O(()=>i.hasConflictedFiles||!i.hasUpstream?!0:i.isSelectionMode?!d.value||!c.hasUserCommitMessage:f.value?!1:!u.value||!c.hasUserCommitMessage),m=O(()=>i.isAddingFiles||i.isCommiting||i.isPushing),h=O(()=>i.hasConflictedFiles?J(`@2E184:存在冲突文件,请先解决冲突`):i.hasUpstream?i.isSelectionMode?i.selectedFiles.size===0?J(`@2E184:请先勾选要推送的文件`):i.selectedUnstagedPaths.length===0?J(`@2E184:所选文件无需暂存或被锁定`):c.hasUserCommitMessage?J(`@2E184:一键完成:仅暂存所选文件 → 提交 → 推送到远程仓库`):J(`@2E184:请输入提交信息`):!u.value&&i.branchAhead===0?J(`@2E184:没有需要提交或推送的更改`):f.value?J(`@2E184:本地已提交,一键推送到远程仓库`):c.hasUserCommitMessage?J(`@2E184:一键完成:暂存所有更改 → 提交 → 推送到远程仓库`):J(`@2E184:请输入提交信息`):J(`@2E184:当前分支没有上游分支`)),g=O(()=>i.isSelectionMode&&d.value?J(`@2E184:一键推送所选`):J(`@2E184:一键推送所有`)),_=O(()=>c.from===`form`?f.value?J(`@2E184:推送到远程仓库`):i.isSelectionMode&&d.value?J(`@2E184:暂存所选 + 提交 + 推送`):J(`@2E184:暂存 + 提交 + 推送`):``);async function v(){l(`beforePush`);try{let e=i.isSelectionMode&&d.value;if((e||u.value)&&!(e?await i.stageSelectedAndCommit(c.finalCommitMessage,c.skipHooks):await i.addAndCommit(c.finalCommitMessage,c.skipHooks))){l(`afterPush`,!1);return}if(l(`pushStart`),o.value=!0,a.pullBeforePush){s.value?.setPulling(!0);let e=await i.gitPull();if(s.value?.setPulling(!1),!e.success){F.error(J(`@2E184:拉取远程更新失败,已停止推送`)),o.value=!1,i.fetchStatus(),i.getBranchStatus(!0),l(`afterPush`,!1);return}}s.value&&s.value.reset();let t=await i.pushToRemoteWithProgress(e=>{s.value&&s.value.handleProgress(e)});if(t){try{window.dispatchEvent(new CustomEvent(`zen-gitsync:after-quick-push-success`))}catch{}l(`clearFields`)}l(`afterPush`,t)}catch(e){console.error(`一键推送失败:`,e),l(`afterPush`,!1)}}t({triggerQuickPush:v});function y(e){}let b={gitStore:i,configStore:a,progressModalVisible:o,progressModalRef:s,props:c,emit:l,hasAnyChanges:u,hasSelectedToStage:d,isPushOnly:f,isDisabled:p,isLoading:m,tooltipText:h,buttonTitle:g,buttonDesc:_,handleQuickPush:v,handleProgressComplete:y,get ElTooltip(){return j},get Position(){return r},PushProgressModal:mt};return Object.defineProperty(b,"__isScriptSetup",{enumerable:!1,value:!0}),b}});n(),u();var St={class:`one-push-content`},Ct={class:`one-push-text`},wt={class:`one-push-title`},Tt={key:0,class:`one-push-desc`};function Et(e,t,n,r,i,a){let o=g,s=q;return P(),H(`div`,null,[w(r.ElTooltip,{content:r.tooltipText,placement:`top`,"show-after":200},{default:z(()=>[w(s,{type:`primary`,onClick:r.handleQuickPush,loading:r.isLoading,disabled:r.isDisabled,class:_([n.from,`one-push-button`])},{default:z(()=>[c(`div`,St,[w(o,{class:`one-push-icon`},{default:z(()=>[w(r.Position)]),_:1}),c(`div`,Ct,[c(`span`,wt,V(r.buttonTitle),1),n.from===`form`?(P(),H(`span`,Tt,V(r.buttonDesc),1)):C(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`]),C(` 推送进度弹窗 `),w(r.PushProgressModal,{ref:`progressModalRef`,modelValue:r.progressModalVisible,"onUpdate:modelValue":t[0]||=e=>r.progressModalVisible=e,onComplete:r.handleProgressComplete,onPullRequested:r.handleQuickPush},null,8,[`modelValue`])])}var Dt=Y(xt,[[`render`,Et],[`__scopeId`,`data-v-1a7fa402`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/QuickPushButton.vue`]]);n(),G();var Ot=h({__name:`CreateTagButton`,props:{variant:{type:String,required:!1,default:`icon`}},setup(e,{expose:t}){t();let n=e,r=Z(),i=R(!1),a=R(``),o=R(``),c=R(`lightweight`),l=R(``),u=R(!1);function d(){a.value=``,o.value=``,c.value=`lightweight`,l.value=``,i.value=!0}async function f(){if(!a.value.trim()){F.warning(J(`@TAG01:请输入标签名称`));return}if(!/^[a-zA-Z0-9._\/-]+$/.test(a.value)){F.warning(J(`@TAG01:标签名称只能包含字母、数字、点、下划线、斜杠和连字符`));return}try{u.value=!0;let e=await(await fetch(`/api/create-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:a.value.trim(),message:o.value.trim(),type:c.value,commit:l.value.trim()})})).json();e.success?(F.success(J(`@TAG01:标签创建成功`)),i.value=!1):F.error(e.error||J(`@TAG01:创建标签失败`))}catch(e){console.error(`创建标签失败:`,e),F.error(J(`@TAG01:创建标签失败`))}finally{u.value=!1}}let p={props:n,gitStore:r,isTagDialogVisible:i,tagName:a,tagMessage:o,tagType:c,targetCommit:l,isCreating:u,openTagDialog:d,createTag:f,tagTypeDescription:O(()=>c.value===`lightweight`?J(`@TAG01:轻量标签是指向提交对象的引用,不包含额外信息`):J(`@TAG01:附注标签是完整的Git对象,包含标签信息、日期、标签者和可选的签名`)),get $t(){return J},get Sell(){return _e},get InfoFilled(){return s},CommonDialog:Ae};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}});n(),u();var kt={class:`create-tag-button`},At={class:`tag-dialog-content`},jt={class:`tag-info-card`},Mt={class:`info-icon`},Nt={class:`info-content`},Pt={class:`form-tip`},Ft={class:`form-tip`},It={class:`form-tip`};function Lt(e,t,n,r,i,a){let s=g,l=q,u=j,f=k,p=v,m=ce,h=b,y=d;return P(),H(`div`,kt,[C(` 创建标签按钮 `),w(u,{content:r.$t(`@TAG01:为当前提交创建标签`),placement:`top`,"show-after":200,disabled:r.props.variant===`text`},{default:z(()=>[w(l,{type:`success`,onClick:r.openTagDialog,disabled:!r.gitStore.isGitRepo,circle:r.props.variant===`icon`,size:r.props.variant===`icon`?`small`:`default`,class:_(r.props.variant===`text`?`action-button`:``)},{default:z(()=>[r.props.variant===`icon`?(P(),o(s,{key:0},{default:z(()=>[w(r.Sell)]),_:1})):(P(),H(K,{key:1},[x(V(r.$t(`@TAG01:创建标签`)),1)],64))]),_:1},8,[`disabled`,`circle`,`size`,`class`])]),_:1},8,[`content`,`disabled`]),C(` 创建标签弹窗 `),w(r.CommonDialog,{modelValue:r.isTagDialogVisible,"onUpdate:modelValue":t[4]||=e=>r.isTagDialogVisible=e,title:r.$t(`@TAG01:创建 Git 标签`),size:`medium`,"close-on-click-modal":!1,"show-footer":``,"confirm-text":r.$t(`@TAG01:创建`),"cancel-text":r.$t(`@TAG01:取消`),"confirm-loading":r.isCreating,"custom-class":`tag-dialog`,onConfirm:r.createTag},{default:z(()=>[c(`div`,At,[C(` 功能说明卡片 `),c(`div`,jt,[c(`div`,Mt,[w(s,null,{default:z(()=>[w(r.Sell)]),_:1})]),c(`div`,Nt,[c(`h4`,null,V(r.$t(`@TAG01:Git 标签`)),1),c(`p`,null,V(r.$t(`@TAG01:标签用于标记项目的重要版本点,如发布版本 v1.0.0`)),1)])]),w(y,{"label-position":`top`,class:`tag-form`},{default:z(()=>[C(` 标签名称 `),w(p,{label:r.$t(`@TAG01:标签名称`),required:``},{default:z(()=>[w(f,{modelValue:r.tagName,"onUpdate:modelValue":t[0]||=e=>r.tagName=e,placeholder:r.$t(`@TAG01:例如: v1.0.0 或 release-2024`),clearable:``,maxlength:`100`},{prefix:z(()=>[w(s,null,{default:z(()=>[w(r.Sell)]),_:1})]),_:1},8,[`modelValue`,`placeholder`]),c(`div`,Pt,[w(s,null,{default:z(()=>[w(r.InfoFilled)]),_:1}),c(`span`,null,V(r.$t(`@TAG01:建议使用语义化版本号,如 v1.0.0`)),1)])]),_:1},8,[`label`]),C(` 标签类型 `),w(p,{label:r.$t(`@TAG01:标签类型`)},{default:z(()=>[w(h,{modelValue:r.tagType,"onUpdate:modelValue":t[1]||=e=>r.tagType=e,size:`default`},{default:z(()=>[w(m,{value:`lightweight`},{default:z(()=>[x(V(r.$t(`@TAG01:轻量标签`)),1)]),_:1}),w(m,{value:`annotated`},{default:z(()=>[x(V(r.$t(`@TAG01:附注标签`)),1)]),_:1})]),_:1},8,[`modelValue`]),c(`div`,Ft,[w(s,null,{default:z(()=>[w(r.InfoFilled)]),_:1}),c(`span`,null,V(r.tagTypeDescription),1)])]),_:1},8,[`label`]),C(` 标签说明(仅附注标签) `),r.tagType===`annotated`?(P(),o(p,{key:0,label:r.$t(`@TAG01:标签说明`),required:r.tagType===`annotated`},{default:z(()=>[w(f,{modelValue:r.tagMessage,"onUpdate:modelValue":t[2]||=e=>r.tagMessage=e,placeholder:r.$t(`@TAG01:为此标签添加说明信息`),clearable:``,rows:3,type:`textarea`,resize:`none`,maxlength:`500`,"show-word-limit":``},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`,`required`])):C(`v-if`,!0),C(` 目标提交(可选) `),w(p,{label:r.$t(`@TAG01:目标提交(可选)`)},{default:z(()=>[w(f,{modelValue:r.targetCommit,"onUpdate:modelValue":t[3]||=e=>r.targetCommit=e,placeholder:r.$t(`@TAG01:留空则为当前HEAD,或输入commit SHA`),clearable:``,maxlength:`40`},{prefix:z(()=>[...t[5]||=[c(`span`,{class:`commit-prefix`},`commit:`,-1)]]),_:1},8,[`modelValue`,`placeholder`]),c(`div`,It,[w(s,null,{default:z(()=>[w(r.InfoFilled)]),_:1}),c(`span`,null,V(r.$t(`@TAG01:默认为当前HEAD提交,也可以指定历史提交`)),1)])]),_:1},8,[`label`])]),_:1})])]),_:1},8,[`modelValue`,`title`,`confirm-text`,`cancel-text`,`confirm-loading`])])}var Rt=Y(Ot,[[`render`,Lt],[`__scopeId`,`data-v-fd2d5a18`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/CreateTagButton.vue`]]);n(),G();var zt=h({__name:`TagListButton`,props:{variant:{type:String,required:!1,default:`icon`}},setup(e,{expose:t}){t();let n=e,r=Z(),i=R(!1),a=R([]),o=R(!1),c=R(!1),l=R(!1),u=R(!1),d=R(null);async function f(){i.value=!0,await m()}async function m(){try{o.value=!0;let e=await(await fetch(`/api/list-tags`)).json();e.success?a.value=e.tags||[]:F.error(e.error||J(`@TAG01:获取标签列表失败`))}catch(e){console.error(`获取标签列表失败:`,e),F.error(J(`@TAG01:获取标签列表失败`))}finally{o.value=!1}}function h(e){d.value=e,u.value=!0}async function g(e){se.confirm(J(`@TAG01:确定要推送此标签到远程仓库吗?`),J(`@TAG01:推送标签`),{confirmButtonText:J(`@TAG01:推送`),cancelButtonText:J(`@TAG01:取消`),type:`info`}).then(async()=>{try{l.value=!0;let t=await(await fetch(`/api/push-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:e})})).json();t.success?F.success(J(`@TAG01:标签推送成功`)):F.error(t.error||J(`@TAG01:推送标签失败`))}catch(e){console.error(`推送标签失败:`,e),F.error(J(`@TAG01:推送标签失败`))}finally{l.value=!1}}).catch(()=>{})}async function _(){se.confirm(J(`@TAG01:确定要推送所有标签到远程仓库吗?`),J(`@TAG01:推送所有标签`),{confirmButtonText:J(`@TAG01:推送`),cancelButtonText:J(`@TAG01:取消`),type:`info`}).then(async()=>{try{l.value=!0;let e=await(await fetch(`/api/push-all-tags`,{method:`POST`})).json();e.success?F.success(J(`@TAG01:所有标签推送成功`)):F.error(e.error||J(`@TAG01:推送标签失败`))}catch(e){console.error(`推送标签失败:`,e),F.error(J(`@TAG01:推送标签失败`))}finally{l.value=!1}}).catch(()=>{})}async function v(e){se.confirm(J(`@TAG01:确定要删除此标签吗?此操作不可恢复。`),J(`@TAG01:删除标签`),{confirmButtonText:J(`@TAG01:删除`),cancelButtonText:J(`@TAG01:取消`),type:`warning`}).then(async()=>{await y(e)}).catch(()=>{})}async function y(e){try{c.value=!0;let t=await(await fetch(`/api/delete-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:e})})).json();t.success?(F.success(J(`@TAG01:标签删除成功`)),await m()):F.error(t.error||J(`@TAG01:删除标签失败`))}catch(e){console.error(`删除标签失败:`,e),F.error(J(`@TAG01:删除标签失败`))}finally{c.value=!1}}function b(e){if(!e)return`-`;try{return new Date(e).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}catch{return e}}let x={props:n,gitStore:r,isTagListDialogVisible:i,tags:a,isLoadingTags:o,isDeletingTag:c,isPushingTag:l,tagDetailVisible:u,selectedTag:d,openTagListDialog:f,loadTags:m,viewTagDetail:h,pushTag:g,pushAllTags:_,confirmDeleteTag:v,deleteTag:y,formatDate:b,get $t(){return J},get Sell(){return _e},get Delete(){return ue},get Upload(){return fe},get InfoFilled(){return s},get Refresh(){return p},CommonDialog:Ae};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}});n(),u();var Bt={class:`tag-list-button`},Vt={class:`tag-list-content`},Ht={key:0,class:`tag-header`},Ut={class:`tag-stats`},Wt={class:`stat-item`},Gt={class:`stat-number`},Kt={class:`stat-label`},qt={class:`tag-actions-header`},Jt={class:`tag-list-container`},Yt={key:0,class:`empty-state`},Xt={class:`empty-text`},Zt={class:`empty-hint`},Qt={key:1,class:`tag-cards`},$t={class:`tag-card-content`},en={class:`tag-info`},tn={class:`tag-main-info`},nn={class:`tag-name-badge`},rn={class:`tag-name-text`},an={class:`tag-meta`},on={class:`tag-commit`},sn={class:`tag-date`},cn={key:0,class:`tag-message`},ln={class:`tag-card-actions`},un={key:0,class:`tag-detail-content`},dn={class:`detail-row`},fn={class:`detail-label`},pn={class:`detail-value`},mn={class:`detail-row`},hn={class:`detail-label`},gn={class:`detail-value`},_n={class:`detail-row`},vn={class:`detail-label`},yn={class:`detail-value`},bn={class:`detail-row`},xn={class:`detail-label`},Sn={key:0,class:`detail-row detail-message`},Cn={class:`detail-label`},wn={class:`message-content`};function Tn(t,n,r,i,a,s){let l=g,u=q,d=j,f=Ce,p=y,m=me;return P(),H(`div`,Bt,[C(` 标签列表按钮 `),w(d,{content:i.$t(`@TAG01:查看和管理所有标签`),placement:`top`,"show-after":200,disabled:i.props.variant===`text`},{default:z(()=>[w(u,{type:`info`,onClick:i.openTagListDialog,disabled:!i.gitStore.isGitRepo,circle:i.props.variant===`icon`,size:i.props.variant===`icon`?`small`:`default`,class:_(i.props.variant===`text`?`action-button`:``)},{default:z(()=>[i.props.variant===`icon`?(P(),o(l,{key:0},{default:z(()=>[w(i.Sell)]),_:1})):(P(),H(K,{key:1},[x(V(i.$t(`@TAG01:标签列表`)),1)],64))]),_:1},8,[`disabled`,`circle`,`size`,`class`])]),_:1},8,[`content`,`disabled`]),C(` 标签列表弹窗 `),w(i.CommonDialog,{modelValue:i.isTagListDialogVisible,"onUpdate:modelValue":n[0]||=e=>i.isTagListDialogVisible=e,title:i.$t(`@TAG01:Git 标签列表`),size:`large`,"show-footer":!1,"custom-class":`tag-list-dialog`},{default:z(()=>[c(`div`,Vt,[C(` 头部统计信息 `),i.isLoadingTags?C(`v-if`,!0):(P(),H(`div`,Ht,[c(`div`,Ut,[c(`div`,Wt,[w(l,{class:`stat-icon`},{default:z(()=>[w(i.Sell)]),_:1}),c(`span`,Gt,V(i.tags.length),1),c(`span`,Kt,V(i.$t(`@TAG01:个标签`)),1)])]),c(`div`,qt,[w(u,{type:`primary`,size:`small`,icon:i.Refresh,onClick:i.loadTags,loading:i.isLoadingTags,class:`refresh-btn`},{default:z(()=>[x(V(i.$t(`@TAG01:刷新`)),1)]),_:1},8,[`icon`,`loading`]),i.tags.length>0?(P(),o(u,{key:0,type:`success`,size:`small`,icon:i.Upload,onClick:i.pushAllTags,loading:i.isPushingTag,class:`push-all-btn`},{default:z(()=>[x(V(i.$t(`@TAG01:推送所有标签`)),1)]),_:1},8,[`icon`,`loading`])):C(`v-if`,!0)])])),C(` 标签列表 `),le((P(),H(`div`,Jt,[i.tags.length===0&&!i.isLoadingTags?(P(),H(`div`,Yt,[w(f,{description:i.$t(`@TAG01:暂无标签`),"image-size":120},{image:z(()=>[w(l,{class:`empty-icon`},{default:z(()=>[w(i.Sell)]),_:1})]),description:z(()=>[c(`p`,Xt,V(i.$t(`@TAG01:还没有创建任何标签`)),1),c(`p`,Zt,V(i.$t(`@TAG01:使用创建标签功能为项目添加版本标记`)),1)]),_:1},8,[`description`])])):(P(),H(`div`,Qt,[(P(!0),H(K,null,e(i.tags,e=>(P(),H(`div`,{key:e.name,class:`tag-card`},[c(`div`,$t,[c(`div`,en,[c(`div`,tn,[c(`div`,nn,[w(l,{class:`badge-icon`},{default:z(()=>[w(i.Sell)]),_:1}),c(`span`,rn,V(e.name),1),w(p,{size:`small`,type:e.type===`annotated`?`warning`:`info`,class:`type-tag`},{default:z(()=>[x(V(e.type===`annotated`?i.$t(`@TAG01:附注`):i.$t(`@TAG01:轻量`)),1)]),_:2},1032,[`type`])]),c(`div`,an,[c(`span`,on,[w(l,null,{default:z(()=>[w(i.InfoFilled)]),_:1}),x(` `+V(e.commit.substring(0,8)),1)]),c(`span`,sn,V(i.formatDate(e.date)),1)]),e.message?(P(),H(`div`,cn,V(e.message),1)):C(`v-if`,!0)])]),c(`div`,ln,[e.message?(P(),o(u,{key:0,size:`small`,type:`info`,onClick:t=>i.viewTagDetail(e),class:`action-btn view-btn`},{default:z(()=>[x(V(i.$t(`@TAG01:查看`)),1)]),_:1},8,[`onClick`])):C(`v-if`,!0),w(u,{size:`small`,type:`success`,icon:i.Upload,onClick:t=>i.pushTag(e.name),loading:i.isPushingTag,class:`action-btn push-btn`},{default:z(()=>[x(V(i.$t(`@TAG01:推送`)),1)]),_:1},8,[`icon`,`onClick`,`loading`]),w(u,{size:`small`,type:`danger`,icon:i.Delete,onClick:t=>i.confirmDeleteTag(e.name),loading:i.isDeletingTag,class:`action-btn delete-btn`},{default:z(()=>[x(V(i.$t(`@TAG01:删除`)),1)]),_:1},8,[`icon`,`onClick`,`loading`])])])]))),128))]))])),[[m,i.isLoadingTags]])])]),_:1},8,[`modelValue`,`title`]),C(` 标签详情弹窗 `),w(i.CommonDialog,{modelValue:i.tagDetailVisible,"onUpdate:modelValue":n[1]||=e=>i.tagDetailVisible=e,title:i.$t(`@TAG01:标签详情`),size:`medium`,"show-footer":!1,"custom-class":`tag-detail-dialog`},{default:z(()=>[i.selectedTag?(P(),H(`div`,un,[c(`div`,dn,[c(`span`,fn,V(i.$t(`@TAG01:标签名称:`)),1),c(`code`,pn,V(i.selectedTag.name),1)]),c(`div`,mn,[c(`span`,hn,V(i.$t(`@TAG01:提交SHA:`)),1),c(`code`,gn,V(i.selectedTag.commit),1)]),c(`div`,_n,[c(`span`,vn,V(i.$t(`@TAG01:创建时间:`)),1),c(`span`,yn,V(i.formatDate(i.selectedTag.date)),1)]),c(`div`,bn,[c(`span`,xn,V(i.$t(`@TAG01:类型:`)),1),w(p,{type:i.selectedTag.type===`annotated`?`warning`:`info`,size:`small`},{default:z(()=>[x(V(i.selectedTag.type===`annotated`?i.$t(`@TAG01:附注标签`):i.$t(`@TAG01:轻量标签`)),1)]),_:1},8,[`type`])]),i.selectedTag.message?(P(),H(`div`,Sn,[c(`span`,Cn,V(i.$t(`@TAG01:标签说明:`)),1),c(`div`,wn,V(i.selectedTag.message),1)])):C(`v-if`,!0)])):C(`v-if`,!0)]),_:1},8,[`modelValue`,`title`])])}var En=Y(zt,[[`render`,Tn],[`__scopeId`,`data-v-8d9468ec`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/TagListButton.vue`]]);n(),G();var Dn=h({__name:`GitOperationsButton`,props:{variant:{type:String,required:!1,default:`icon`},hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1}},emits:[`afterCommit`,`afterPush`,`beforePush`,`clearFields`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=Z(),o=R(!1),c=R(!1),l=R({needsMerge:!1,error:``,fullError:``,pullOutput:``});function u(){o.value=!0}let d=O(()=>a.fileList.filter(e=>e.type===`added`).length),f=O(()=>a.branchBehind>0),p=O(()=>a.fileList.some(e=>[`modified`,`deleted`,`untracked`,`intent-to-add`].includes(e.type)));async function m(){try{let e=await a.gitPull();e.success?(await a.fetchStatus(),await a.fetchLog(!1)):(l.value={needsMerge:e.needsMerge,error:e.error,fullError:e.fullError,pullOutput:e.pullOutput},c.value=!0)}catch(e){console.error(`拉取失败:`,e)}}async function h(){try{await a.gitFetchAll(),await a.fetchStatus(),await a.fetchLog(!1)}catch(e){console.error(`获取远程分支失败:`,e)}}async function g(){if(r.hasUserCommitMessage)try{await a.addAndCommit(r.finalCommitMessage,r.skipHooks),a.fetchStatus(),a.fetchLog(),i(`afterCommit`,!0),i(`clearFields`)}catch(e){console.error(`暂存并提交失败:`,e)}}function _(){i(`beforePush`)}function v(e){i(`afterPush`,e)}function y(){i(`clearFields`)}t({openGitOperationsDrawer:u});let b={props:r,emit:i,gitStore:a,gitOperationsDrawerVisible:o,pullErrorDialogVisible:c,pullErrorInfo:l,openGitOperationsDrawer:u,stagedFilesCount:d,needsPull:f,hasUnstagedChanges:p,handleGitPull:m,handleGitFetchAll:h,addAndCommit:g,handleQuickPushBefore:_,handleQuickPushAfter:v,handleClearFields:y,get $t(){return J},get Menu(){return S},get RefreshRight(){return M},get Download(){return de},get Connection(){return ve},get Edit(){return oe},get InfoFilled(){return s},IconButton:De,StageButton:He,UnstageAllButton:Pe,CommitButton:Ke,PushButton:bt,QuickPushButton:Dt,MergeBranchButton:Ie,StashChangesButton:Fe,StashListButton:Me,CreateTagButton:Rt,TagListButton:En,ResetToRemoteButton:Le,CommonDialog:Ae};return Object.defineProperty(b,"__isScriptSetup",{enumerable:!1,value:!0}),b}});n(),u();var On={class:`git-operations-button`},kn={class:`actions-section`},An={class:`action-groups`},jn={class:`action-group`},Mn={class:`group-title`},Nn={class:`group-buttons`},Pn={key:0},Fn={class:`action-group`},In={class:`group-title`},Ln={class:`group-buttons`},Rn={class:`action-group`},zn={class:`group-title`},Bn={class:`group-buttons`},Vn={key:0},Hn={class:`action-group`},Un={class:`group-title`},Wn={class:`group-buttons`},Gn={class:`action-group`},Kn={class:`group-title`},qn={class:`group-buttons`},Jn={class:`action-group`},Yn={class:`group-title`},Xn={class:`group-buttons`},Zn={class:`pull-error-content`},Qn={key:0},$n={key:1},er={class:`pull-error-detail`},tr={class:`pull-error-label`},nr={class:`pull-error-pre`};function rr(e,t,n,r,i,a){let s=g,l=q,u=j,d=D;return P(),H(`div`,On,[C(` Git操作按钮 `),r.props.variant===`icon`?(P(),o(r.IconButton,{key:0,tooltip:r.$t(`@F13B4:Git 操作`),size:`large`,"custom-class":`btn-rotate-on-hover`,onClick:r.openGitOperationsDrawer},{default:z(()=>[w(s,null,{default:z(()=>[w(r.Menu)]),_:1})]),_:1},8,[`tooltip`])):(P(),o(l,{key:1,type:`primary`,class:`action-button`,onClick:r.openGitOperationsDrawer},{default:z(()=>[x(V(r.$t(`@F13B4:Git 操作`)),1)]),_:1})),C(` Git操作抽屉 `),w(d,{modelValue:r.gitOperationsDrawerVisible,"onUpdate:modelValue":t[2]||=e=>r.gitOperationsDrawerVisible=e,title:r.$t(`@76872:Git 操作`),direction:`rtl`,size:`362px`,"with-header":!0,"show-close":!0,"destroy-on-close":!1,"append-to-body":!0,class:`git-operations-drawer`},{default:z(()=>[c(`div`,kn,[c(`div`,An,[C(` 基础操作 `),c(`div`,jn,[c(`div`,Mn,V(r.$t(`@76872:基础操作`)),1),c(`div`,Nn,[w(r.StageButton,{onClick:()=>{},from:`drawer`}),w(r.UnstageAllButton,{onClick:()=>{},from:`drawer`}),w(r.CommitButton,{"has-user-commit-message":n.hasUserCommitMessage,"final-commit-message":n.finalCommitMessage,"skip-hooks":n.skipHooks,onBeforeCommit:()=>{},onAfterCommit:t[0]||=e=>r.emit(`afterCommit`,e),onClick:()=>{},from:`drawer`},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),w(r.PushButton,{onBeforePush:()=>{},onAfterPush:t[1]||=e=>r.emit(`afterPush`,e),onClick:()=>{},from:`drawer`}),w(u,{content:r.gitStore.hasConflictedFiles?r.$t(`@76872:存在冲突文件,请先解决冲突`):r.needsPull?`${r.$t(`@76872:拉取`)}${r.gitStore.branchBehind}${r.$t(`@76872:个远程提交`)}`:`git pull`,placement:`top`},{default:z(()=>[w(l,{type:`primary`,icon:r.Download,onClick:r.handleGitPull,loading:r.gitStore.isGitPulling,disabled:!r.gitStore.hasUpstream||r.gitStore.hasConflictedFiles,class:`action-button`,style:N(r.gitStore.hasUpstream&&!r.gitStore.hasConflictedFiles?{color:`white`,backgroundColor:`var(--color-primary)`,borderColor:`var(--color-primary)`}:{})},{default:z(()=>[x(V(r.$t(`@76872:拉取`))+` `,1),r.needsPull?(P(),H(`span`,Pn,`(`+V(r.gitStore.branchBehind)+`)`,1)):C(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`style`])]),_:1},8,[`content`]),w(u,{content:`git fetch --all`,placement:`top`},{default:z(()=>[w(l,{type:`info`,icon:r.Connection,onClick:r.handleGitFetchAll,loading:r.gitStore.isGitFetching,class:`action-button`,style:{color:`white`,"background-color":`var(--color-primary)`,"border-color":`var(--color-primary)`}},{default:z(()=>[x(V(r.$t(`@76872:获取所有远程分支`)),1)]),_:1},8,[`icon`,`loading`])]),_:1})])]),C(` 组合操作 `),c(`div`,Fn,[c(`div`,In,V(r.$t(`@76872:组合操作`)),1),c(`div`,Ln,[w(u,{content:r.gitStore.hasConflictedFiles?r.$t(`@76872:存在冲突文件,请先解决冲突`):`git add + git commit`,placement:`top`},{default:z(()=>[w(l,{type:`primary`,icon:r.Edit,onClick:r.addAndCommit,loading:r.gitStore.isAddingFiles||r.gitStore.isCommiting,disabled:!r.hasUnstagedChanges||!n.hasUserCommitMessage||r.gitStore.hasConflictedFiles,class:`action-button`},{default:z(()=>[x(V(r.$t(`@76872:暂存并提交`)),1)]),_:1},8,[`icon`,`loading`,`disabled`])]),_:1},8,[`content`]),w(r.QuickPushButton,{from:`drawer`,"has-user-commit-message":n.hasUserCommitMessage,"final-commit-message":n.finalCommitMessage,"skip-hooks":n.skipHooks,onBeforePush:r.handleQuickPushBefore,onAfterPush:r.handleQuickPushAfter,onClearFields:r.handleClearFields},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`])])]),C(` 重置操作 `),c(`div`,Rn,[c(`div`,zn,V(r.$t(`@76872:重置操作`)),1),c(`div`,Bn,[w(u,{content:r.stagedFilesCount>0?`${r.$t(`@76872:撤销`)}${r.stagedFilesCount}${r.$t(`@76872:个已暂存文件`)}`:`git reset HEAD`,placement:`top`},{default:z(()=>[w(l,{type:`warning`,icon:r.RefreshRight,onClick:r.gitStore.resetHead,loading:r.gitStore.isResetting,disabled:r.stagedFilesCount===0||r.gitStore.hasConflictedFiles,class:`action-button reset-button`},{default:z(()=>[x(V(r.$t(`@76872:重置暂存区`))+` `,1),r.stagedFilesCount>0?(P(),H(`span`,Vn,`(`+V(r.stagedFilesCount)+`)`,1)):C(`v-if`,!0)]),_:1},8,[`icon`,`onClick`,`loading`,`disabled`])]),_:1},8,[`content`]),w(r.ResetToRemoteButton,{variant:`text`})])]),C(` 分支操作 `),c(`div`,Hn,[c(`div`,Un,V(r.$t(`@76872:分支操作`)),1),c(`div`,Wn,[w(r.MergeBranchButton,{variant:`text`})])]),C(` 储藏操作 `),c(`div`,Gn,[c(`div`,Kn,V(r.$t(`@76872:储藏操作`)),1),c(`div`,qn,[w(r.StashChangesButton,{variant:`text`}),w(r.StashListButton,{variant:`text`})])]),C(` 标签操作 `),c(`div`,Jn,[c(`div`,Yn,V(r.$t(`@TAG01:标签操作`)),1),c(`div`,Xn,[w(r.CreateTagButton,{variant:`text`}),w(r.TagListButton,{variant:`text`})])])])])]),_:1},8,[`modelValue`,`title`]),C(` Pull 失败错误详情弹窗 `),w(r.CommonDialog,{modelValue:r.pullErrorDialogVisible,"onUpdate:modelValue":t[3]||=e=>r.pullErrorDialogVisible=e,title:r.pullErrorInfo.needsMerge?r.$t(`@76872:需要合并更改`):r.$t(`@76872:拉取失败`),size:`medium`,"show-footer":!0,"show-cancel":!1,"confirm-text":r.$t(`@76872:我知道了`),"append-to-body":!0,onConfirm:t[4]||=e=>r.pullErrorDialogVisible=!1},{default:z(()=>[c(`div`,Zn,[c(`div`,{class:_([`pull-error-type`,r.pullErrorInfo.needsMerge?`is-warning`:`is-error`])},[w(s,{class:`pull-error-icon`},{default:z(()=>[w(r.InfoFilled)]),_:1}),r.pullErrorInfo.needsMerge?(P(),H(`span`,Qn,V(r.$t(`@76872:本地存在未提交的更改,与远程内容冲突,请先处理本地更改后再拉取。`)),1)):(P(),H(`span`,$n,V(r.$t(`@76872:执行 git pull 时发生错误,请查看详细信息。`)),1))],2),c(`div`,er,[c(`div`,tr,V(r.$t(`@76872:错误详情`))+`:`,1),c(`pre`,nr,V(r.pullErrorInfo.fullError||r.pullErrorInfo.error),1)])])]),_:1},8,[`modelValue`,`title`,`confirm-text`])])}var ir=Y(Dn,[[`render`,rr],[`__scopeId`,`data-v-3357e454`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/GitOperationsButton.vue`]]);n();var ar=h({__name:`GlobalLoading`,props:{visible:{type:Boolean,required:!1,default:!1},text:{type:String,required:!1,default:J(`@2AEBA:加载中...`)},showProgress:{type:Boolean,required:!1,default:!1},progress:{type:Number,required:!1,default:0},mock:{type:Boolean,required:!1,default:!1}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});n(),u(),B();var or={class:`loading-container`},sr={class:`loading-text`},cr={key:0,class:`loading-progress`};function lr(e,t,n,r,i,s){return P(),o(a,{to:`body`},[w(U,{name:`loading-fade`},{default:z(()=>[n.visible||n.mock?(P(),H(`div`,{key:0,class:`global-loading-overlay`,onClick:t[0]||=L(()=>{},[`stop`])},[c(`div`,or,[C(` 主加载器 `),t[1]||=c(`div`,{class:`loading-spinner`},[c(`div`,{class:`spinner-ring`}),c(`div`,{class:`spinner-ring`}),c(`div`,{class:`spinner-ring`})],-1),C(` 加载文字 `),c(`div`,sr,V(n.text),1),C(` 进度条(可选/Mock) `),n.showProgress||n.mock?(P(),H(`div`,cr,[c(`div`,{class:_([`progress-bar`,{"is-mock":n.mock&&!n.showProgress}]),style:N(n.showProgress?{width:n.progress+`%`}:void 0)},null,6)])):C(`v-if`,!0)])])):C(`v-if`,!0)]),_:1})])}var ur=Y(ar,[[`render`,lr],[`__scopeId`,`data-v-77e24a5f`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/GlobalLoading.vue`]]);n();var dr=h({__name:`SuccessModal`,props:{visible:{type:Boolean,required:!1,default:!1},text:{type:String,required:!1,default:J(`@71545:操作成功!`)},description:{type:String,required:!1,default:``}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});n(),u(),B();var fr={class:`success-container`},pr={class:`success-text`},mr={key:0,class:`success-description`};function hr(e,t,n,r,i,s){return P(),o(a,{to:`body`},[w(U,{name:`success-fade`},{default:z(()=>[n.visible?(P(),H(`div`,{key:0,class:`success-overlay`,onClick:t[0]||=L(()=>{},[`stop`])},[c(`div`,fr,[C(` 成功图标 `),t[1]||=c(`div`,{class:`success-icon`},[c(`svg`,{viewBox:`0 0 52 52`,class:`success-svg`},[c(`circle`,{class:`success-circle`,cx:`26`,cy:`26`,r:`25`,fill:`none`}),c(`path`,{class:`success-check`,fill:`none`,d:`m14.1 27.2l7.1 7.2 16.7-16.8`})])],-1),C(` 成功文字 `),c(`div`,pr,V(n.text),1),C(` 描述文字 `),n.description?(P(),H(`div`,mr,V(n.description),1)):C(`v-if`,!0)])])):C(`v-if`,!0)]),_:1})])}var gr=Y(dr,[[`render`,hr],[`__scopeId`,`data-v-30ab4535`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/SuccessModal.vue`]]);G();var $=xe({visible:!1,text:J(`@F2A3A:加载中...`),showProgress:!1,progress:0});function _r(){return{loadingState:$,show:e=>{$.visible=!0,$.text=e?.text||J(`@F2A3A:加载中...`),$.showProgress=e?.showProgress||!1,$.progress=e?.progress||0},hide:()=>{$.visible=!1},updateProgress:e=>{$.progress=Math.max(0,Math.min(100,e))},updateText:e=>{$.text=e},setText:e=>{$.visible&&($.text=e)}}}G();var vr=xe({visible:!1,text:J(`@B8591:操作成功!`),description:``});function yr(){let e=e=>{vr.visible=!0,vr.text=e?.text||J(`@B8591:操作成功!`),vr.description=e?.description||``;let n=e?.duration||2e3;setTimeout(()=>{t()},n)},t=()=>{vr.visible=!1};return{successState:vr,show:e,hide:t}}n();var br=h({__name:`QuickCommitButton`,props:{from:{type:String,required:!1,default:`form`},hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1}},emits:[`beforeCommit`,`afterCommit`,`clearFields`],setup(e,{expose:t,emit:n}){let r=Z(),i=X(),a=e,o=n,s=O(()=>r.fileList.some(e=>!Q(e.path,i.lockedFiles))),c=O(()=>r.isSelectionMode&&r.selectedFiles.size>0&&r.selectedUnstagedPaths.length>0),l=O(()=>r.hasConflictedFiles?!0:r.isSelectionMode?!c.value||!a.hasUserCommitMessage:!s.value||!a.hasUserCommitMessage),u=O(()=>r.isAddingFiles||r.isCommiting),d=O(()=>r.hasConflictedFiles?J(`@2E184:存在冲突文件,请先解决冲突`):r.isSelectionMode?r.selectedFiles.size===0?J(`@2E184:请先勾选要提交的文件`):r.selectedUnstagedPaths.length===0?J(`@2E184:所选文件无需暂存或被锁定`):a.hasUserCommitMessage?J(`@2E184:一键完成:仅暂存所选文件 → 提交`):J(`@2E184:请输入提交信息`):s.value?a.hasUserCommitMessage?J(`@2E184:一键完成:暂存所有更改 → 提交`):J(`@2E184:请输入提交信息`):J(`@2E184:没有需要提交的更改`)),f=O(()=>r.isSelectionMode&&c.value?J(`@2E184:一键提交所选`):J(`@2E184:一键提交`)),p=O(()=>a.from===`form`?r.isSelectionMode&&c.value?J(`@2E184:暂存所选 + 提交`):J(`@2E184:暂存 + 提交`):``);async function m(){o(`beforeCommit`);try{let e=await r.stageSelectedAndCommit(a.finalCommitMessage,a.skipHooks);e&&o(`clearFields`),o(`afterCommit`,e)}catch(e){console.error(`一键提交失败:`,e),o(`afterCommit`,!1)}}t({triggerQuickCommit:m});let h={gitStore:r,configStore:i,props:a,emit:o,hasAnyChanges:s,hasSelectedToStage:c,isDisabled:l,isLoading:u,tooltipText:d,buttonTitle:f,buttonDesc:p,handleQuickCommit:m,get ElTooltip(){return j},get Edit(){return oe}};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}});n(),u();var xr={class:`one-commit-content`},Sr={class:`one-commit-text`},Cr={class:`one-commit-title`},wr={key:0,class:`one-commit-desc`};function Tr(e,t,n,r,i,a){let o=g,s=q;return P(),H(`div`,null,[w(r.ElTooltip,{content:r.tooltipText,placement:`top`,"show-after":200},{default:z(()=>[w(s,{type:`primary`,onClick:r.handleQuickCommit,loading:r.isLoading,disabled:r.isDisabled,class:_([n.from,`one-commit-button`])},{default:z(()=>[c(`div`,xr,[w(o,{class:`one-commit-icon`},{default:z(()=>[w(r.Edit)]),_:1}),c(`div`,Sr,[c(`span`,Cr,V(r.buttonTitle),1),n.from===`form`?(P(),H(`span`,wr,V(r.buttonDesc),1)):C(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}var Er=Y(br,[[`render`,Tr],[`__scopeId`,`data-v-0c962829`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/QuickCommitButton.vue`]]);n();var Dr=h({__name:`AiQuickPushButton`,props:{from:{type:String,required:!1,default:`form`},generating:{type:Boolean,required:!1,default:!1}},emits:[`trigger`],setup(e,{expose:t,emit:n}){t();let r=Z(),i=X(),a=e,o=n,s=O(()=>r.fileList.some(e=>!Q(e.path,i.lockedFiles))),c=O(()=>r.isSelectionMode&&r.selectedFiles.size>0&&r.selectedUnstagedPaths.length>0),l=O(()=>!r.isSelectionMode&&!s.value&&r.branchAhead>0),u=O(()=>r.hasConflictedFiles||!r.hasUpstream?!0:r.isSelectionMode?!c.value:!s.value&&r.branchAhead===0),d=O(()=>a.generating||r.isAddingFiles||r.isCommiting||r.isPushing),f=O(()=>r.hasConflictedFiles?J(`@2E184:存在冲突文件,请先解决冲突`):r.hasUpstream?a.generating?J(`@2E184:AI 正在生成提交信息…`):r.isSelectionMode?c.value?J(`@2E184:一键完成:AI 生成提交信息 → 仅暂存所选文件 → 提交 → 推送`):J(`@2E184:请先勾选要推送的文件`):!s.value&&r.branchAhead===0?J(`@2E184:没有需要提交或推送的更改`):s.value?J(`@2E184:一键完成:AI 生成提交信息 → 暂存所有更改 → 提交 → 推送`):J(`@2E184:本地已提交,AI 将直接推送到远程仓库`):J(`@2E184:当前分支没有上游分支`)),p=O(()=>r.isSelectionMode&&c.value?J(`@2E184:AI 提交并推送所选`):J(`@2E184:AI 提交并推送`)),m=O(()=>a.from===`form`?l.value?J(`@2E184:本地已提交,直接推送`):J(`@2E184:AI 生成信息 + 推送`):``);function h(){u.value||d.value||o(`trigger`)}let g={gitStore:r,configStore:i,props:a,emit:o,hasAnyChanges:s,hasSelectedToStage:c,isPushOnly:l,isDisabled:u,isLoading:d,tooltipText:f,buttonTitle:p,buttonDesc:m,handleClick:h,get ElTooltip(){return j},SvgIcon:Ee};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}});n(),u();var Or={class:`one-ai-push`},kr={class:`one-ai-push-content`},Ar={class:`one-ai-push-text`},jr={class:`one-ai-push-title`},Mr={key:0,class:`one-ai-push-desc`};function Nr(e,t,n,r,i,a){let o=q;return P(),H(`div`,Or,[w(r.ElTooltip,{content:r.tooltipText,placement:`top`,"show-after":200},{default:z(()=>[w(o,{type:`primary`,onClick:r.handleClick,loading:r.isLoading,disabled:r.isDisabled,class:_([n.from,`one-ai-push-button`])},{default:z(()=>[c(`div`,kr,[w(r.SvgIcon,{class:`one-ai-push-icon`,"icon-class":`ai-commit`,style:{color:`#fff`}}),c(`div`,Ar,[c(`span`,jr,V(r.buttonTitle),1),n.from===`form`?(P(),H(`span`,Mr,V(r.buttonDesc),1)):C(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}var Pr=Y(Dr,[[`render`,Nr],[`__scopeId`,`data-v-0a8120f6`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/AiQuickPushButton.vue`]]);n(),G();var Fr=h({__name:`GitActionButtons`,props:{hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1},from:{type:String,required:!1,default:`form`},aiGenerating:{type:Boolean,required:!1,default:!1}},emits:[`afterCommit`,`afterPush`,`beforePush`,`pushStart`,`clearFields`,`aiQuickPush`],setup(e,{expose:t,emit:n}){let r=n,i=R(null);function a(e){r(`afterCommit`,e)}function o(e){r(`afterPush`,e)}function s(){r(`beforePush`)}function c(){r(`pushStart`)}function l(){r(`clearFields`)}function u(){r(`aiQuickPush`)}async function d(){return i.value?.triggerQuickPush()}t({triggerQuickPush:d});let f={emit:r,quickPushRef:i,handleAfterCommit:a,handleAfterPush:o,handleBeforePush:s,handlePushStart:c,handleClearFields:l,handleAiQuickPush:u,triggerQuickPush:d,StageButton:He,CommitButton:Ke,PushButton:bt,QuickPushButton:Dt,QuickCommitButton:Er,AiQuickPushButton:Pr};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}});n();var Ir={class:`form-bottom-actions`},Lr={class:`actions-flex-container`},Rr={class:`left-actions`},zr={class:`button-grid`},Br={class:`right-actions`};function Vr(e,t,n,r,i,a){return P(),H(`div`,Ir,[c(`div`,Lr,[c(`div`,Rr,[c(`div`,zr,[w(r.StageButton,{onClick:()=>{},from:n.from},null,8,[`from`]),w(r.CommitButton,{"has-user-commit-message":n.hasUserCommitMessage,"final-commit-message":n.finalCommitMessage,"skip-hooks":n.skipHooks,onBeforeCommit:()=>{},onAfterCommit:r.handleAfterCommit,onClick:()=>{},from:n.from},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`,`from`]),w(r.PushButton,{onBeforePush:()=>{},onAfterPush:r.handleAfterPush,onClick:()=>{},from:n.from},null,8,[`from`])])]),c(`div`,Br,[w(r.QuickCommitButton,{from:n.from,"has-user-commit-message":n.hasUserCommitMessage,"final-commit-message":n.finalCommitMessage,"skip-hooks":n.skipHooks,onAfterCommit:r.handleAfterCommit,onClearFields:r.handleClearFields},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),w(r.QuickPushButton,{ref:`quickPushRef`,from:n.from,"has-user-commit-message":n.hasUserCommitMessage,"final-commit-message":n.finalCommitMessage,"skip-hooks":n.skipHooks,onBeforePush:r.handleBeforePush,onPushStart:r.handlePushStart,onAfterPush:r.handleAfterPush,onClearFields:r.handleClearFields},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),w(r.AiQuickPushButton,{from:n.from,generating:n.aiGenerating,onTrigger:r.handleAiQuickPush},null,8,[`from`,`generating`])])])])}var Hr=Y(Fr,[[`render`,Vr],[`__scopeId`,`data-v-12b4dc63`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/GitActionButtons.vue`]]);n(),G();var Ur=h({__name:`CommandHistory`,setup(e,{expose:n}){n();let r=Z(),i=R([]),a=R(!1);function o(e){return Array.isArray(e)?e.join(` `):e==null?``:String(e)}let s=R(!1),c=R(!1),l=R(!1),u=R(new Set),d=R(!1),p=R(!1),m=R(`all`),h=R(`all`),g=R(``),_=O(()=>{let e=i.value;if(m.value!==`all`&&(e=e.filter(e=>m.value===`success`?e.success:!e.success)),h.value!==`all`&&(e=e.filter(e=>{let t=o(e.command).startsWith(`git `);return h.value===`git`?t:!t})),g.value.trim()){let t=g.value.toLowerCase();e=e.filter(e=>o(e.command).toLowerCase().includes(t)||e.stdout&&e.stdout.toLowerCase().includes(t)||e.stderr&&e.stderr.toLowerCase().includes(t)||e.error&&e.error.toLowerCase().includes(t))}return e}),v=O(()=>i.value.filter(e=>e.success).length),y=O(()=>i.value.filter(e=>!e.success).length),b=O(()=>i.value.filter(e=>o(e.command).startsWith(`git `)).length),x=O(()=>i.value.filter(e=>!o(e.command).startsWith(`git `)).length);function S(){p.value=!0,i.value.length===0&&C()}async function C(){try{if(a.value=!0,r.socket&&r.socket.connected)r.socket.emit(`request_full_history`);else{let e=await(await fetch(`/api/command-history`)).json();e.success?i.value=e.history:F.error(`${J(`@81F0F:加载命令历史失败: `)}${e.error}`)}}catch(e){F.error(`${J(`@81F0F:加载命令历史失败: `)}${e.message}`)}finally{a.value=!1}}async function w(){if(_.value.length===0){F.warning(J(`@81F0F:没有可复制的命令历史`));return}try{c.value=!0;let e=_.value.map(e=>{let t=`# ${k(e.timestamp)}${J(`@81F0F: (耗时: `)}${A(e.executionTime)}) - ${e.success?J(`@81F0F:成功`):J(`@81F0F:失败`)}\n`;if(t+=`${o(e.command)}\n`,e.stdout&&(t+=`\n# 输出:\n${e.stdout}\n`),e.stderr){let n=P(e.command)?J(`@81F0F:输出信息`):J(`@81F0F:错误输出`);t+=`\n# ${n}:\n${e.stderr}\n`}return e.error&&(t+=`\n# 错误信息:\n${e.error}\n`),t}).join(`
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,At as t,Bn as n,Bt as r,C as i,Cn as a,Dn as o,Dt as s,En as c,F as l,Fr as u,G as d,Gt as f,Ht as p,I as m,In as h,J as g,Jr as _,K as v,L as y,M as b,Nn as x,Nt as S,On as C,Pn as w,Q as T,S as E,T as D,Tn as O,U as k,V as A,W as j,Wn as ee,Wt as M,Xn as te,Xr as N,Y as ne,Yn as re,Zn as P,_ as ie,a as F,at as I,bn as L,br as R,cr as z,ct as ae,dn as B,ei as V,ht as oe,i as se,j as ce,kn as H,ln as U,lr as le,lt as ue,mt as de,nn as fe,nt as pe,o as me,or as W,ot as he,pr as G,q as ge,qt as _e,st as ve,tt as ye,vn as be,vr as xe,w as Se,x as Ce,xn as K,z as q,zt as we}from"./element-plus-Buzx8xRf.js";import{b as Te}from"./vendor-wERX2bc3.js";import{n as J,t as Y}from"./_plugin-vue_export-helper-DqKDIY1f.js";import{t as Ee}from"./SvgIcon-CBqXx2qp.js";import{t as De}from"./IconButton-CmaM18jB.js";import{r as Oe,t as X}from"./configStore-CqbN-y1x.js";import{i as ke,r as Z}from"./gitStore-BrDeYGjs.js";import{t as Ae}from"./CommonDialog-C3ruJAse.js";import{t as je}from"./TemplateManager-Bd9A3dXY.js";import{C as Me,S as Ne,T as Q,b as Pe,w as Fe,x as Ie,y as Le}from"./index-DkTmqIha.js";n();var Re=h({__name:`StageButton`,props:{from:{type:String,required:!1,default:`form`}},emits:[`click`],setup(e,{expose:t,emit:n}){t();let r=n,i=Z(),a=X();function o(e){let t=e.replace(/\\/g,`/`);return a.lockedFiles.some(e=>{let n=e.replace(/\\/g,`/`);return t===n})}function s(){return a.lockedFiles.length!==0&&i.fileList.some(e=>[`modified`,`deleted`,`untracked`].includes(e.type)?o(e.path):!1)}let c=O(()=>i.fileList.filter(e=>[`modified`,`deleted`,`untracked`].includes(e.type)&&!o(e.path)).length),l=O(()=>i.fileList.some(e=>[`modified`,`deleted`,`untracked`].includes(e.type)&&!o(e.path))),u=O(()=>i.isSelectionMode&&i.hasSelectableFiles),d=O(()=>i.selectedUnstagedPaths.length),f=O(()=>i.isSelectionMode?d.value===0:!l.value),p=O(()=>u.value?`${J(`@29974:暂存所选 `)}${d.value}${J(`@29974: 个文件`)}`:l.value?s()?`${J(`@29974:暂存`)}${c.value}${J(`@29974:个未暂存文件(逐个添加)`)}`:`${J(`@29974:暂存所有更改(git add .)`)}`:J(`@29974:没有需要暂存的更改`));async function m(){r(`click`);try{if(u.value){await i.stageFiles(i.selectedUnstagedPaths);return}if(i.isSelectionMode)return;s()?await i.addToStage():await i.addAllToStage()}catch(e){console.error(`添加文件失败:`,e)}}let h={emit:r,gitStore:i,configStore:a,isFileLocked:o,hasLockedFileMatches:s,unstagedFilesCount:c,hasUnstagedChanges:l,isSelectiveStage:u,selectedStageCount:d,isDisabled:f,tooltipText:p,handleClick:m,get $t(){return J},get Plus(){return we}};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}});u(),n();var ze={key:0},Be={key:1};function Ve(e,t,n,r,i,a){let s=q,c=j;return P(),o(c,{content:r.tooltipText,placement:`top`},{default:z(()=>[w(s,{type:`primary`,icon:r.Plus,onClick:r.handleClick,loading:r.gitStore.isAddingFiles,disabled:r.isDisabled,class:_([`stage-button`,`from-${n.from}`,{"is-selective":r.isSelectiveStage}])},{default:z(()=>[x(V(r.isSelectiveStage?r.$t(`@29974:暂存所选`):r.$t(`@29974:暂存`))+` `,1),r.isSelectiveStage?(P(),H(`span`,ze,`(`+V(r.selectedStageCount)+`)`,1)):r.unstagedFilesCount>0?(P(),H(`span`,Be,`(`+V(r.unstagedFilesCount)+`)`,1)):C(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`class`])]),_:1},8,[`content`])}var He=Y(Re,[[`render`,Ve],[`__scopeId`,`data-v-d99cab92`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/StageButton.vue`]]);n();var Ue=h({__name:`CommitButton`,props:{from:{type:String,required:!1,default:`form`},hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1}},emits:[`click`,`beforeCommit`,`afterCommit`],setup(e,{expose:n,emit:r}){n();let i=e,a=r,o=Z(),s=X(),c=O(()=>o.fileList.filter(e=>e.type===`added`&&!Q(e.path,s.lockedFiles)).length),l=O(()=>c.value>0),u=O(()=>o.hasConflictedFiles||o.isCommiting?!0:o.isMergeInProgress?!i.hasUserCommitMessage:!l.value||!i.hasUserCommitMessage),d=O(()=>o.isCommiting?J(`@76A11:正在提交中…`):o.hasConflictedFiles?J(`@76A11:存在冲突文件,请先解决冲突`):o.isMergeInProgress?i.hasUserCommitMessage?J(`@76A11:提交并完成合并`):J(`@76A11:请输入提交信息`):l.value?i.hasUserCommitMessage?`${J(`@76A11:提交`)}${c.value}${J(`@76A11:个已暂存文件`)}`:J(`@76A11:请输入提交信息`):J(`@76A11:没有已暂存的更改`)),f=O(()=>o.isCommiting?J(`@76A11:提交中…`):J(`@76A11:提交`));async function p(){if(i.finalCommitMessage.trim()){a(`beforeCommit`),a(`click`);try{let e=await o.commitChanges(i.finalCommitMessage,i.skipHooks);a(`afterCommit`,e)}catch(e){console.error(`提交失败:`,e),a(`afterCommit`,!1)}}}let m={props:i,emit:a,gitStore:o,configStore:s,stagedFilesCount:c,hasStagedChanges:l,isDisabled:u,tooltipText:d,buttonLabel:f,handleClick:p,get $t(){return J},get Check(){return ye},get Loading(){return t}};return Object.defineProperty(m,"__isScriptSetup",{enumerable:!1,value:!0}),m}});u(),n();var We={key:0};function Ge(e,t,n,r,i,a){let s=q,c=j;return P(),o(c,{content:r.tooltipText,placement:`top`,disabled:r.gitStore.isCommiting},{default:z(()=>[w(s,{type:`primary`,onClick:r.handleClick,icon:r.gitStore.isCommiting?r.Loading:r.Check,loading:r.gitStore.isCommiting,disabled:r.isDisabled,"aria-busy":r.gitStore.isCommiting?`true`:void 0,"aria-label":r.gitStore.isCommiting?r.$t(`@76A11:正在提交中…`):void 0,class:_([`commit-button`,`from-${n.from}`,{"is-committing":r.gitStore.isCommiting}])},{default:z(()=>[x(V(r.buttonLabel)+` `,1),r.stagedFilesCount>0&&!r.gitStore.isCommiting?(P(),H(`span`,We,`(`+V(r.stagedFilesCount)+`)`,1)):C(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`aria-busy`,`aria-label`,`class`])]),_:1},8,[`content`,`disabled`])}var Ke=Y(Ue,[[`render`,Ge],[`__scopeId`,`data-v-100f6d49`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/CommitButton.vue`]]);n(),G();var qe=h({__name:`PushProgressModal`,props:{modelValue:{type:Boolean,required:!0}},emits:[`update:modelValue`,`complete`,`pull-requested`],setup(e,{expose:n,emit:r}){let{t:i}=Te(),a=e,o=r,s=X(),c=Z(),l=R(`progress`),u=R([]),d=R(``),f=R(!1),p=O(()=>d.value.includes(`non-fast-forward`)||d.value.includes(`rejected`)&&d.value.includes(`fetch first`)),m=R(!1);async function h(){m.value=!0;try{(await c.gitPull()).success&&(b.value=!1,o(`pull-requested`))}finally{m.value=!1}}let _=xe([{name:`counting`,label:i(`@PUSH:计数对象`),status:`wait`,percent:0},{name:`compressing`,label:i(`@PUSH:压缩对象`),status:`wait`,percent:0},{name:`writing`,label:i(`@PUSH:写入对象`),status:`wait`,percent:0},{name:`resolving`,label:i(`@PUSH:解析增量`),status:`wait`,percent:0}]),v=R(0),y=R(null),b=O({get:()=>a.modelValue,set:e=>o(`update:modelValue`,e)}),x=O(()=>{if(f.value)return i(`@PUSH:正在拉取远程更新`);switch(l.value){case`progress`:return i(`@PUSH:正在推送`);case`success`:return i(`@PUSH:推送成功`);case`error`:return i(`@PUSH:推送失败`);default:return``}});function S(e){switch(e.type){case`progress`:e.message&&(u.value.push(e.message),setTimeout(()=>{y.value&&(y.value.scrollTop=y.value.scrollHeight)},0));break;case`stage-progress`:if(e.stage&&typeof e.percent==`number`){let t=_.findIndex(t=>t.name===e.stage);t!==-1&&(_[t].percent=e.percent,_[t].status=e.percent===100?`finish`:`process`,v.value=t,e.percent===100&&t<_.length-1&&(_[t+1].status=`wait`))}break;case`complete`:e.success?(l.value=`success`,_.forEach(e=>{(e.status===`process`||e.status===`wait`)&&(e.status=`finish`,e.percent=100)}),v.value=-1,s.autoClosePushModal?setTimeout(()=>{b.value=!1,o(`complete`,!0)},2e3):o(`complete`,!0)):(l.value=`error`,d.value=ke(e),v.value<_.length&&(_[v.value].status=`error`),v.value=-1,o(`complete`,!1))}}function C(){l.value=`progress`,u.value=[],d.value=``,v.value=0,f.value=!1,_.forEach(e=>{e.status=`wait`,e.percent=0})}function w(e){f.value=e}n({handleProgress:S,reset:C,setPulling:w});let T={t:i,props:a,emit:o,configStore:s,gitStore:c,status:l,messages:u,errorMessage:d,isPullingRemote:f,isNonFastForwardError:p,isPulling:m,handlePullAndRetry:h,stages:_,activeStep:v,messagesContainerRef:y,visible:b,statusText:x,handleProgress:S,reset:C,setPulling:w,get ElProgress(){return ie},get ElIcon(){return g},get Close(){return he},get Loading(){return t},get CircleCheck(){return pe},get Download(){return de},CommonDialog:Ae};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}});n(),u();var Je={class:`push-progress-container`},Ye={key:0,class:`pulling-section`},Xe={class:`pulling-text-wrap`},Ze={class:`pulling-title`},Qe={class:`pulling-sub`},$e={class:`stage-header`},et={class:`stage-icon`},tt={class:`stage-info`},nt={class:`stage-label`},rt={key:0,class:`stage-percent`},it={key:0,class:`stage-progress`},at={key:2,class:`error-section`},ot={class:`error-header`},st={class:`error-title`},ct={class:`error-content`},lt={key:0,class:`error-suggestion`},ut={key:3,class:`messages-section`},dt={class:`messages-title`},ft={ref:`messagesContainerRef`,class:`progress-messages`};function pt(t,n,r,i,a,s){let l=q;return P(),o(i.CommonDialog,{modelValue:i.visible,"onUpdate:modelValue":n[0]||=e=>i.visible=e,title:i.statusText,width:`650px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":i.status!==`progress`,"append-to-body":!0,"lock-scroll":!1,"destroy-on-close":``,"custom-class":`push-progress-dialog status-${i.status}`},{default:z(()=>[c(`div`,Je,[C(` 拉取中提示 `),i.isPullingRemote?(P(),H(`div`,Ye,[n[1]||=c(`div`,{class:`pulling-icon-wrap`},[c(`svg`,{class:`pulling-spinner`,viewBox:`0 0 50 50`},[c(`circle`,{class:`pulling-spinner-track`,cx:`25`,cy:`25`,r:`20`,fill:`none`,"stroke-width":`4`}),c(`circle`,{class:`pulling-spinner-arc`,cx:`25`,cy:`25`,r:`20`,fill:`none`,"stroke-width":`4`})])],-1),c(`div`,Xe,[c(`div`,Ze,V(i.t(`@PUSH:正在拉取远程更新`)),1),c(`div`,Qe,V(i.t(`@PUSH:拉取完成后自动继续推送`)),1)])])):(P(),H(K,{key:1},[C(` 推送阶段(2x2网格) `),c(`div`,{class:_([`stages-section`,{"is-loading":i.status===`progress`,"is-success":i.status===`success`}])},[(P(!0),H(K,null,e(i.stages,(e,t)=>(P(),H(`div`,{key:e.name,class:_([`stage-item`,{active:i.activeStep===t,finished:e.status===`finish`,error:e.status===`error`}])},[c(`div`,$e,[c(`div`,et,[e.status===`finish`?(P(),o(i.ElIcon,{key:0,class:`icon-finish`},{default:z(()=>[w(i.CircleCheck)]),_:1})):e.status===`error`?(P(),o(i.ElIcon,{key:1,class:`icon-error`},{default:z(()=>[w(i.Close)]),_:1})):e.status===`process`?(P(),o(i.ElIcon,{key:2,class:`icon-process rotating`},{default:z(()=>[w(i.Loading)]),_:1})):(P(),o(i.ElIcon,{key:3,class:`icon-wait`},{default:z(()=>[w(i.Loading)]),_:1}))]),c(`div`,tt,[c(`div`,nt,V(e.label),1),e.status===`process`||e.status===`finish`?(P(),H(`div`,rt,V(e.percent)+`% `,1)):C(`v-if`,!0)])]),e.status===`process`||e.status===`finish`?(P(),H(`div`,it,[w(i.ElProgress,{percentage:e.percent,"stroke-width":6,"show-text":!1,color:e.status===`finish`?`var(--color-success)`:`var(--color-primary)`},null,8,[`percentage`,`color`])])):C(`v-if`,!0)],2))),128))],2)],2112)),C(` 错误信息 `),i.status===`error`&&i.errorMessage?(P(),H(`div`,at,[c(`div`,ot,[c(`div`,st,V(i.t(`@PUSH:错误详情`))+`:`,1),i.isNonFastForwardError?(P(),o(l,{key:0,type:`primary`,size:`small`,loading:i.isPulling,onClick:i.handlePullAndRetry,class:`pull-button`},{default:z(()=>[w(i.ElIcon,null,{default:z(()=>[w(i.Download)]),_:1}),x(` `+V(i.t(`@PUSH:先拉取更新`)),1)]),_:1},8,[`loading`])):C(`v-if`,!0)]),c(`div`,ct,V(i.errorMessage),1),i.isNonFastForwardError?(P(),H(`div`,lt,V(i.t(`@PUSH:检测到远程有新提交,请先拉取更新后再推送。`)),1)):C(`v-if`,!0)])):C(`v-if`,!0),C(` 进度消息 `),i.messages.length>0?(P(),H(`div`,ut,[c(`div`,dt,V(i.t(`@PUSH:详细信息`))+`:`,1),c(`div`,ft,[(P(!0),H(K,null,e(i.messages,(e,t)=>(P(),H(`div`,{key:t,class:`message-item`},V(e),1))),128))],512)])):C(`v-if`,!0)])]),_:1},8,[`modelValue`,`title`,`show-close`,`custom-class`])}var mt=Y(qe,[[`render`,pt],[`__scopeId`,`data-v-0e0be0c3`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/PushProgressModal.vue`]]);n(),G();var ht=h({__name:`PushButton`,props:{from:{type:String,required:!1,default:`form`}},emits:[`click`,`beforePush`,`afterPush`],setup(e,{expose:t,emit:n}){t();let r=n,i=Z(),a=R(!1),o=R(null),s=O(()=>i.branchAhead>0),c=O(()=>i.fileList.some(e=>e.type===`added`)),l=O(()=>!i.hasConflictedFiles&&i.hasUpstream&&s.value&&!c.value),u=O(()=>!l.value),d=O(()=>i.hasConflictedFiles?J(`@F4137:存在冲突文件,请先解决冲突`):i.hasUpstream?s.value?c.value?J(`@F4137:有未提交的暂存更改,请先提交`):`${J(`@F4137:推送`)}${i.branchAhead}${J(`@F4137:个本地提交`)}`:J(`@F4137:没有需要推送的提交`):J(`@F4137:当前分支没有上游分支`)),f=O(()=>l.value?{backgroundColor:`var(--tint-success-14)`,borderColor:`var(--color-success)`,color:`var(--text-primary)`}:{});async function p(){r(`beforePush`),r(`click`);try{a.value=!0,o.value&&o.value.reset();let e=await i.pushToRemoteWithProgress(e=>{o.value&&o.value.handleProgress(e)});e&&await new Promise(e=>setTimeout(e,200)),r(`afterPush`,e)}catch(e){console.error(`推送失败:`,e),r(`afterPush`,!1)}}function m(e){}let h=O(()=>[...i.remotes].sort((e,t)=>e.isUpstream===t.isUpstream?e.name.localeCompare(t.name):e.isUpstream?-1:1));async function g(e){if(e===`manage`){i.isRemoteManagerVisible=!0;return}if(e===`push-all`){await i.pushAllRemotes();return}if(!e.startsWith(`push:`))return;let t=e.slice(5);r(`beforePush`);try{a.value=!0,o.value?.reset();let e=await i.pushToRemoteWithProgress(e=>{o.value?.handleProgress(e)},t);r(`afterPush`,e)}catch(e){console.error(`推送失败:`,e),r(`afterPush`,!1)}}let _={emit:r,gitStore:i,progressModalVisible:a,progressModalRef:o,needsPush:s,hasStagedChanges:c,canPush:l,isDisabled:u,tooltipText:d,buttonStyle:f,handleClick:p,handleProgressComplete:m,sortedRemotes:h,handleDropdownCommand:g,get $t(){return J},get Upload(){return fe},get ArrowDown(){return ne},PushProgressModal:mt};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}});u(),n();var gt={class:`push-button-group`},_t={key:0},vt={class:`push-remote-item`};function yt(t,n,r,a,s,l){let u=q,d=j,f=y,p=i,m=Se,h=E;return P(),H(`div`,null,[c(`div`,gt,[w(d,{content:a.tooltipText,placement:`top`},{default:z(()=>[w(u,{type:`primary`,icon:a.Upload,onClick:a.handleClick,loading:a.gitStore.isPushing,disabled:a.isDisabled,style:N(a.buttonStyle),class:_([`push-button`,`from-${r.from}`])},{default:z(()=>[x(V(a.$t(`@F4137:推送`))+` `,1),a.needsPush?(P(),H(`span`,_t,`(`+V(a.gitStore.branchAhead)+`)`,1)):C(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`style`,`class`])]),_:1},8,[`content`]),C(` 多远程下拉:仅在配置了多个远程时出现,单远程外观与历史完全一致 `),a.gitStore.hasMultipleRemotes?(P(),o(h,{key:0,trigger:`click`,placement:`top-end`,onCommand:a.handleDropdownCommand},{dropdown:z(()=>[w(m,null,{default:z(()=>[(P(!0),H(K,null,e(a.sortedRemotes,e=>(P(),o(p,{key:e.name,command:`push:${e.name}`},{default:z(()=>[c(`span`,vt,[c(`span`,null,V(a.$t(`@F4137:推送到`))+` `+V(e.name),1),e.isUpstream?(P(),o(f,{key:0,size:`small`,type:`success`,effect:`plain`},{default:z(()=>[x(V(a.$t(`@F4137:上游`)),1)]),_:1})):C(`v-if`,!0)])]),_:2},1032,[`command`]))),128)),w(p,{divided:``,command:`push-all`},{default:z(()=>[x(V(a.$t(`@F4137:推送到全部远程`)),1)]),_:1}),w(p,{divided:``,command:`manage`},{default:z(()=>[x(V(a.$t(`@F4137:管理远程…`)),1)]),_:1})]),_:1})]),default:z(()=>[w(u,{type:`primary`,icon:a.ArrowDown,style:N(a.buttonStyle),class:_([`push-button__caret`,`from-${r.from}`]),"aria-label":a.$t(`@F4137:更多推送选项`)},null,8,[`icon`,`style`,`class`,`aria-label`])]),_:1})):C(`v-if`,!0)]),C(` 推送进度弹窗 `),w(a.PushProgressModal,{ref:`progressModalRef`,modelValue:a.progressModalVisible,"onUpdate:modelValue":n[0]||=e=>a.progressModalVisible=e,onComplete:a.handleProgressComplete},null,8,[`modelValue`])])}var bt=Y(ht,[[`render`,yt],[`__scopeId`,`data-v-bcb696bd`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/PushButton.vue`]]);n(),G();var xt=h({__name:`QuickPushButton`,props:{from:{type:String,required:!1,default:`form`},hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1}},emits:[`beforePush`,`pushStart`,`afterPush`,`clearFields`],setup(e,{expose:t,emit:n}){let i=Z(),a=X(),o=R(!1),s=R(null),c=e,l=n,u=O(()=>i.fileList.some(e=>!Q(e.path,a.lockedFiles))),d=O(()=>i.isSelectionMode&&i.selectedFiles.size>0&&i.selectedUnstagedPaths.length>0),f=O(()=>!i.isSelectionMode&&!u.value&&i.branchAhead>0),p=O(()=>i.hasConflictedFiles||!i.hasUpstream?!0:i.isSelectionMode?!d.value||!c.hasUserCommitMessage:f.value?!1:!u.value||!c.hasUserCommitMessage),m=O(()=>i.isAddingFiles||i.isCommiting||i.isPushing),h=O(()=>i.hasConflictedFiles?J(`@2E184:存在冲突文件,请先解决冲突`):i.hasUpstream?i.isSelectionMode?i.selectedFiles.size===0?J(`@2E184:请先勾选要推送的文件`):i.selectedUnstagedPaths.length===0?J(`@2E184:所选文件无需暂存或被锁定`):c.hasUserCommitMessage?J(`@2E184:一键完成:仅暂存所选文件 → 提交 → 推送到远程仓库`):J(`@2E184:请输入提交信息`):!u.value&&i.branchAhead===0?J(`@2E184:没有需要提交或推送的更改`):f.value?J(`@2E184:本地已提交,一键推送到远程仓库`):c.hasUserCommitMessage?J(`@2E184:一键完成:暂存所有更改 → 提交 → 推送到远程仓库`):J(`@2E184:请输入提交信息`):J(`@2E184:当前分支没有上游分支`)),g=O(()=>i.isSelectionMode&&d.value?J(`@2E184:一键推送所选`):J(`@2E184:一键推送所有`)),_=O(()=>c.from===`form`?f.value?J(`@2E184:推送到远程仓库`):i.isSelectionMode&&d.value?J(`@2E184:暂存所选 + 提交 + 推送`):J(`@2E184:暂存 + 提交 + 推送`):``);async function v(){l(`beforePush`);try{let e=i.isSelectionMode&&d.value;if((e||u.value)&&!(e?await i.stageSelectedAndCommit(c.finalCommitMessage,c.skipHooks):await i.addAndCommit(c.finalCommitMessage,c.skipHooks))){l(`afterPush`,!1);return}if(l(`pushStart`),o.value=!0,a.pullBeforePush){s.value?.setPulling(!0);let e=await i.gitPull();if(s.value?.setPulling(!1),!e.success){F.error(J(`@2E184:拉取远程更新失败,已停止推送`)),o.value=!1,i.fetchStatus(),i.getBranchStatus(!0),l(`afterPush`,!1);return}}s.value&&s.value.reset();let t=await i.pushToRemoteWithProgress(e=>{s.value&&s.value.handleProgress(e)});if(t){try{window.dispatchEvent(new CustomEvent(`zen-gitsync:after-quick-push-success`))}catch{}l(`clearFields`)}l(`afterPush`,t)}catch(e){console.error(`一键推送失败:`,e),l(`afterPush`,!1)}}t({triggerQuickPush:v});function y(e){}let b={gitStore:i,configStore:a,progressModalVisible:o,progressModalRef:s,props:c,emit:l,hasAnyChanges:u,hasSelectedToStage:d,isPushOnly:f,isDisabled:p,isLoading:m,tooltipText:h,buttonTitle:g,buttonDesc:_,handleQuickPush:v,handleProgressComplete:y,get ElTooltip(){return j},get Position(){return r},PushProgressModal:mt};return Object.defineProperty(b,"__isScriptSetup",{enumerable:!1,value:!0}),b}});n(),u();var St={class:`one-push-content`},Ct={class:`one-push-text`},wt={class:`one-push-title`},Tt={key:0,class:`one-push-desc`};function Et(e,t,n,r,i,a){let o=g,s=q;return P(),H(`div`,null,[w(r.ElTooltip,{content:r.tooltipText,placement:`top`,"show-after":200},{default:z(()=>[w(s,{type:`primary`,onClick:r.handleQuickPush,loading:r.isLoading,disabled:r.isDisabled,class:_([n.from,`one-push-button`])},{default:z(()=>[c(`div`,St,[w(o,{class:`one-push-icon`},{default:z(()=>[w(r.Position)]),_:1}),c(`div`,Ct,[c(`span`,wt,V(r.buttonTitle),1),n.from===`form`?(P(),H(`span`,Tt,V(r.buttonDesc),1)):C(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`]),C(` 推送进度弹窗 `),w(r.PushProgressModal,{ref:`progressModalRef`,modelValue:r.progressModalVisible,"onUpdate:modelValue":t[0]||=e=>r.progressModalVisible=e,onComplete:r.handleProgressComplete,onPullRequested:r.handleQuickPush},null,8,[`modelValue`])])}var Dt=Y(xt,[[`render`,Et],[`__scopeId`,`data-v-1a7fa402`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/QuickPushButton.vue`]]);n(),G();var Ot=h({__name:`CreateTagButton`,props:{variant:{type:String,required:!1,default:`icon`}},setup(e,{expose:t}){t();let n=e,r=Z(),i=R(!1),a=R(``),o=R(``),c=R(`lightweight`),l=R(``),u=R(!1);function d(){a.value=``,o.value=``,c.value=`lightweight`,l.value=``,i.value=!0}async function f(){if(!a.value.trim()){F.warning(J(`@TAG01:请输入标签名称`));return}if(!/^[a-zA-Z0-9._\/-]+$/.test(a.value)){F.warning(J(`@TAG01:标签名称只能包含字母、数字、点、下划线、斜杠和连字符`));return}try{u.value=!0;let e=await(await fetch(`/api/create-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:a.value.trim(),message:o.value.trim(),type:c.value,commit:l.value.trim()})})).json();e.success?(F.success(J(`@TAG01:标签创建成功`)),i.value=!1):F.error(e.error||J(`@TAG01:创建标签失败`))}catch(e){console.error(`创建标签失败:`,e),F.error(J(`@TAG01:创建标签失败`))}finally{u.value=!1}}let p={props:n,gitStore:r,isTagDialogVisible:i,tagName:a,tagMessage:o,tagType:c,targetCommit:l,isCreating:u,openTagDialog:d,createTag:f,tagTypeDescription:O(()=>c.value===`lightweight`?J(`@TAG01:轻量标签是指向提交对象的引用,不包含额外信息`):J(`@TAG01:附注标签是完整的Git对象,包含标签信息、日期、标签者和可选的签名`)),get $t(){return J},get Sell(){return _e},get InfoFilled(){return s},CommonDialog:Ae};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}});n(),u();var kt={class:`create-tag-button`},At={class:`tag-dialog-content`},jt={class:`tag-info-card`},Mt={class:`info-icon`},Nt={class:`info-content`},Pt={class:`form-tip`},Ft={class:`form-tip`},It={class:`form-tip`};function Lt(e,t,n,r,i,a){let s=g,l=q,u=j,f=k,p=v,m=ce,h=b,y=d;return P(),H(`div`,kt,[C(` 创建标签按钮 `),w(u,{content:r.$t(`@TAG01:为当前提交创建标签`),placement:`top`,"show-after":200,disabled:r.props.variant===`text`},{default:z(()=>[w(l,{type:`success`,onClick:r.openTagDialog,disabled:!r.gitStore.isGitRepo,circle:r.props.variant===`icon`,size:r.props.variant===`icon`?`small`:`default`,class:_(r.props.variant===`text`?`action-button`:``)},{default:z(()=>[r.props.variant===`icon`?(P(),o(s,{key:0},{default:z(()=>[w(r.Sell)]),_:1})):(P(),H(K,{key:1},[x(V(r.$t(`@TAG01:创建标签`)),1)],64))]),_:1},8,[`disabled`,`circle`,`size`,`class`])]),_:1},8,[`content`,`disabled`]),C(` 创建标签弹窗 `),w(r.CommonDialog,{modelValue:r.isTagDialogVisible,"onUpdate:modelValue":t[4]||=e=>r.isTagDialogVisible=e,title:r.$t(`@TAG01:创建 Git 标签`),size:`medium`,"close-on-click-modal":!1,"show-footer":``,"confirm-text":r.$t(`@TAG01:创建`),"cancel-text":r.$t(`@TAG01:取消`),"confirm-loading":r.isCreating,"custom-class":`tag-dialog`,onConfirm:r.createTag},{default:z(()=>[c(`div`,At,[C(` 功能说明卡片 `),c(`div`,jt,[c(`div`,Mt,[w(s,null,{default:z(()=>[w(r.Sell)]),_:1})]),c(`div`,Nt,[c(`h4`,null,V(r.$t(`@TAG01:Git 标签`)),1),c(`p`,null,V(r.$t(`@TAG01:标签用于标记项目的重要版本点,如发布版本 v1.0.0`)),1)])]),w(y,{"label-position":`top`,class:`tag-form`},{default:z(()=>[C(` 标签名称 `),w(p,{label:r.$t(`@TAG01:标签名称`),required:``},{default:z(()=>[w(f,{modelValue:r.tagName,"onUpdate:modelValue":t[0]||=e=>r.tagName=e,placeholder:r.$t(`@TAG01:例如: v1.0.0 或 release-2024`),clearable:``,maxlength:`100`},{prefix:z(()=>[w(s,null,{default:z(()=>[w(r.Sell)]),_:1})]),_:1},8,[`modelValue`,`placeholder`]),c(`div`,Pt,[w(s,null,{default:z(()=>[w(r.InfoFilled)]),_:1}),c(`span`,null,V(r.$t(`@TAG01:建议使用语义化版本号,如 v1.0.0`)),1)])]),_:1},8,[`label`]),C(` 标签类型 `),w(p,{label:r.$t(`@TAG01:标签类型`)},{default:z(()=>[w(h,{modelValue:r.tagType,"onUpdate:modelValue":t[1]||=e=>r.tagType=e,size:`default`},{default:z(()=>[w(m,{value:`lightweight`},{default:z(()=>[x(V(r.$t(`@TAG01:轻量标签`)),1)]),_:1}),w(m,{value:`annotated`},{default:z(()=>[x(V(r.$t(`@TAG01:附注标签`)),1)]),_:1})]),_:1},8,[`modelValue`]),c(`div`,Ft,[w(s,null,{default:z(()=>[w(r.InfoFilled)]),_:1}),c(`span`,null,V(r.tagTypeDescription),1)])]),_:1},8,[`label`]),C(` 标签说明(仅附注标签) `),r.tagType===`annotated`?(P(),o(p,{key:0,label:r.$t(`@TAG01:标签说明`),required:r.tagType===`annotated`},{default:z(()=>[w(f,{modelValue:r.tagMessage,"onUpdate:modelValue":t[2]||=e=>r.tagMessage=e,placeholder:r.$t(`@TAG01:为此标签添加说明信息`),clearable:``,rows:3,type:`textarea`,resize:`none`,maxlength:`500`,"show-word-limit":``},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`,`required`])):C(`v-if`,!0),C(` 目标提交(可选) `),w(p,{label:r.$t(`@TAG01:目标提交(可选)`)},{default:z(()=>[w(f,{modelValue:r.targetCommit,"onUpdate:modelValue":t[3]||=e=>r.targetCommit=e,placeholder:r.$t(`@TAG01:留空则为当前HEAD,或输入commit SHA`),clearable:``,maxlength:`40`},{prefix:z(()=>[...t[5]||=[c(`span`,{class:`commit-prefix`},`commit:`,-1)]]),_:1},8,[`modelValue`,`placeholder`]),c(`div`,It,[w(s,null,{default:z(()=>[w(r.InfoFilled)]),_:1}),c(`span`,null,V(r.$t(`@TAG01:默认为当前HEAD提交,也可以指定历史提交`)),1)])]),_:1},8,[`label`])]),_:1})])]),_:1},8,[`modelValue`,`title`,`confirm-text`,`cancel-text`,`confirm-loading`])])}var Rt=Y(Ot,[[`render`,Lt],[`__scopeId`,`data-v-fd2d5a18`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/CreateTagButton.vue`]]);n(),G();var zt=h({__name:`TagListButton`,props:{variant:{type:String,required:!1,default:`icon`}},setup(e,{expose:t}){t();let n=e,r=Z(),i=R(!1),a=R([]),o=R(!1),c=R(!1),l=R(!1),u=R(!1),d=R(null);async function f(){i.value=!0,await m()}async function m(){try{o.value=!0;let e=await(await fetch(`/api/list-tags`)).json();e.success?a.value=e.tags||[]:F.error(e.error||J(`@TAG01:获取标签列表失败`))}catch(e){console.error(`获取标签列表失败:`,e),F.error(J(`@TAG01:获取标签列表失败`))}finally{o.value=!1}}function h(e){d.value=e,u.value=!0}async function g(e){se.confirm(J(`@TAG01:确定要推送此标签到远程仓库吗?`),J(`@TAG01:推送标签`),{confirmButtonText:J(`@TAG01:推送`),cancelButtonText:J(`@TAG01:取消`),type:`info`}).then(async()=>{try{l.value=!0;let t=await(await fetch(`/api/push-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:e})})).json();t.success?F.success(J(`@TAG01:标签推送成功`)):F.error(t.error||J(`@TAG01:推送标签失败`))}catch(e){console.error(`推送标签失败:`,e),F.error(J(`@TAG01:推送标签失败`))}finally{l.value=!1}}).catch(()=>{})}async function _(){se.confirm(J(`@TAG01:确定要推送所有标签到远程仓库吗?`),J(`@TAG01:推送所有标签`),{confirmButtonText:J(`@TAG01:推送`),cancelButtonText:J(`@TAG01:取消`),type:`info`}).then(async()=>{try{l.value=!0;let e=await(await fetch(`/api/push-all-tags`,{method:`POST`})).json();e.success?F.success(J(`@TAG01:所有标签推送成功`)):F.error(e.error||J(`@TAG01:推送标签失败`))}catch(e){console.error(`推送标签失败:`,e),F.error(J(`@TAG01:推送标签失败`))}finally{l.value=!1}}).catch(()=>{})}async function v(e){se.confirm(J(`@TAG01:确定要删除此标签吗?此操作不可恢复。`),J(`@TAG01:删除标签`),{confirmButtonText:J(`@TAG01:删除`),cancelButtonText:J(`@TAG01:取消`),type:`warning`}).then(async()=>{await y(e)}).catch(()=>{})}async function y(e){try{c.value=!0;let t=await(await fetch(`/api/delete-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:e})})).json();t.success?(F.success(J(`@TAG01:标签删除成功`)),await m()):F.error(t.error||J(`@TAG01:删除标签失败`))}catch(e){console.error(`删除标签失败:`,e),F.error(J(`@TAG01:删除标签失败`))}finally{c.value=!1}}function b(e){if(!e)return`-`;try{return new Date(e).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}catch{return e}}let x={props:n,gitStore:r,isTagListDialogVisible:i,tags:a,isLoadingTags:o,isDeletingTag:c,isPushingTag:l,tagDetailVisible:u,selectedTag:d,openTagListDialog:f,loadTags:m,viewTagDetail:h,pushTag:g,pushAllTags:_,confirmDeleteTag:v,deleteTag:y,formatDate:b,get $t(){return J},get Sell(){return _e},get Delete(){return ue},get Upload(){return fe},get InfoFilled(){return s},get Refresh(){return p},CommonDialog:Ae};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}});n(),u();var Bt={class:`tag-list-button`},Vt={class:`tag-list-content`},Ht={key:0,class:`tag-header`},Ut={class:`tag-stats`},Wt={class:`stat-item`},Gt={class:`stat-number`},Kt={class:`stat-label`},qt={class:`tag-actions-header`},Jt={class:`tag-list-container`},Yt={key:0,class:`empty-state`},Xt={class:`empty-text`},Zt={class:`empty-hint`},Qt={key:1,class:`tag-cards`},$t={class:`tag-card-content`},en={class:`tag-info`},tn={class:`tag-main-info`},nn={class:`tag-name-badge`},rn={class:`tag-name-text`},an={class:`tag-meta`},on={class:`tag-commit`},sn={class:`tag-date`},cn={key:0,class:`tag-message`},ln={class:`tag-card-actions`},un={key:0,class:`tag-detail-content`},dn={class:`detail-row`},fn={class:`detail-label`},pn={class:`detail-value`},mn={class:`detail-row`},hn={class:`detail-label`},gn={class:`detail-value`},_n={class:`detail-row`},vn={class:`detail-label`},yn={class:`detail-value`},bn={class:`detail-row`},xn={class:`detail-label`},Sn={key:0,class:`detail-row detail-message`},Cn={class:`detail-label`},wn={class:`message-content`};function Tn(t,n,r,i,a,s){let l=g,u=q,d=j,f=Ce,p=y,m=me;return P(),H(`div`,Bt,[C(` 标签列表按钮 `),w(d,{content:i.$t(`@TAG01:查看和管理所有标签`),placement:`top`,"show-after":200,disabled:i.props.variant===`text`},{default:z(()=>[w(u,{type:`info`,onClick:i.openTagListDialog,disabled:!i.gitStore.isGitRepo,circle:i.props.variant===`icon`,size:i.props.variant===`icon`?`small`:`default`,class:_(i.props.variant===`text`?`action-button`:``)},{default:z(()=>[i.props.variant===`icon`?(P(),o(l,{key:0},{default:z(()=>[w(i.Sell)]),_:1})):(P(),H(K,{key:1},[x(V(i.$t(`@TAG01:标签列表`)),1)],64))]),_:1},8,[`disabled`,`circle`,`size`,`class`])]),_:1},8,[`content`,`disabled`]),C(` 标签列表弹窗 `),w(i.CommonDialog,{modelValue:i.isTagListDialogVisible,"onUpdate:modelValue":n[0]||=e=>i.isTagListDialogVisible=e,title:i.$t(`@TAG01:Git 标签列表`),size:`large`,"show-footer":!1,"custom-class":`tag-list-dialog`},{default:z(()=>[c(`div`,Vt,[C(` 头部统计信息 `),i.isLoadingTags?C(`v-if`,!0):(P(),H(`div`,Ht,[c(`div`,Ut,[c(`div`,Wt,[w(l,{class:`stat-icon`},{default:z(()=>[w(i.Sell)]),_:1}),c(`span`,Gt,V(i.tags.length),1),c(`span`,Kt,V(i.$t(`@TAG01:个标签`)),1)])]),c(`div`,qt,[w(u,{type:`primary`,size:`small`,icon:i.Refresh,onClick:i.loadTags,loading:i.isLoadingTags,class:`refresh-btn`},{default:z(()=>[x(V(i.$t(`@TAG01:刷新`)),1)]),_:1},8,[`icon`,`loading`]),i.tags.length>0?(P(),o(u,{key:0,type:`success`,size:`small`,icon:i.Upload,onClick:i.pushAllTags,loading:i.isPushingTag,class:`push-all-btn`},{default:z(()=>[x(V(i.$t(`@TAG01:推送所有标签`)),1)]),_:1},8,[`icon`,`loading`])):C(`v-if`,!0)])])),C(` 标签列表 `),le((P(),H(`div`,Jt,[i.tags.length===0&&!i.isLoadingTags?(P(),H(`div`,Yt,[w(f,{description:i.$t(`@TAG01:暂无标签`),"image-size":120},{image:z(()=>[w(l,{class:`empty-icon`},{default:z(()=>[w(i.Sell)]),_:1})]),description:z(()=>[c(`p`,Xt,V(i.$t(`@TAG01:还没有创建任何标签`)),1),c(`p`,Zt,V(i.$t(`@TAG01:使用创建标签功能为项目添加版本标记`)),1)]),_:1},8,[`description`])])):(P(),H(`div`,Qt,[(P(!0),H(K,null,e(i.tags,e=>(P(),H(`div`,{key:e.name,class:`tag-card`},[c(`div`,$t,[c(`div`,en,[c(`div`,tn,[c(`div`,nn,[w(l,{class:`badge-icon`},{default:z(()=>[w(i.Sell)]),_:1}),c(`span`,rn,V(e.name),1),w(p,{size:`small`,type:e.type===`annotated`?`warning`:`info`,class:`type-tag`},{default:z(()=>[x(V(e.type===`annotated`?i.$t(`@TAG01:附注`):i.$t(`@TAG01:轻量`)),1)]),_:2},1032,[`type`])]),c(`div`,an,[c(`span`,on,[w(l,null,{default:z(()=>[w(i.InfoFilled)]),_:1}),x(` `+V(e.commit.substring(0,8)),1)]),c(`span`,sn,V(i.formatDate(e.date)),1)]),e.message?(P(),H(`div`,cn,V(e.message),1)):C(`v-if`,!0)])]),c(`div`,ln,[e.message?(P(),o(u,{key:0,size:`small`,type:`info`,onClick:t=>i.viewTagDetail(e),class:`action-btn view-btn`},{default:z(()=>[x(V(i.$t(`@TAG01:查看`)),1)]),_:1},8,[`onClick`])):C(`v-if`,!0),w(u,{size:`small`,type:`success`,icon:i.Upload,onClick:t=>i.pushTag(e.name),loading:i.isPushingTag,class:`action-btn push-btn`},{default:z(()=>[x(V(i.$t(`@TAG01:推送`)),1)]),_:1},8,[`icon`,`onClick`,`loading`]),w(u,{size:`small`,type:`danger`,icon:i.Delete,onClick:t=>i.confirmDeleteTag(e.name),loading:i.isDeletingTag,class:`action-btn delete-btn`},{default:z(()=>[x(V(i.$t(`@TAG01:删除`)),1)]),_:1},8,[`icon`,`onClick`,`loading`])])])]))),128))]))])),[[m,i.isLoadingTags]])])]),_:1},8,[`modelValue`,`title`]),C(` 标签详情弹窗 `),w(i.CommonDialog,{modelValue:i.tagDetailVisible,"onUpdate:modelValue":n[1]||=e=>i.tagDetailVisible=e,title:i.$t(`@TAG01:标签详情`),size:`medium`,"show-footer":!1,"custom-class":`tag-detail-dialog`},{default:z(()=>[i.selectedTag?(P(),H(`div`,un,[c(`div`,dn,[c(`span`,fn,V(i.$t(`@TAG01:标签名称:`)),1),c(`code`,pn,V(i.selectedTag.name),1)]),c(`div`,mn,[c(`span`,hn,V(i.$t(`@TAG01:提交SHA:`)),1),c(`code`,gn,V(i.selectedTag.commit),1)]),c(`div`,_n,[c(`span`,vn,V(i.$t(`@TAG01:创建时间:`)),1),c(`span`,yn,V(i.formatDate(i.selectedTag.date)),1)]),c(`div`,bn,[c(`span`,xn,V(i.$t(`@TAG01:类型:`)),1),w(p,{type:i.selectedTag.type===`annotated`?`warning`:`info`,size:`small`},{default:z(()=>[x(V(i.selectedTag.type===`annotated`?i.$t(`@TAG01:附注标签`):i.$t(`@TAG01:轻量标签`)),1)]),_:1},8,[`type`])]),i.selectedTag.message?(P(),H(`div`,Sn,[c(`span`,Cn,V(i.$t(`@TAG01:标签说明:`)),1),c(`div`,wn,V(i.selectedTag.message),1)])):C(`v-if`,!0)])):C(`v-if`,!0)]),_:1},8,[`modelValue`,`title`])])}var En=Y(zt,[[`render`,Tn],[`__scopeId`,`data-v-8d9468ec`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/TagListButton.vue`]]);n(),G();var Dn=h({__name:`GitOperationsButton`,props:{variant:{type:String,required:!1,default:`icon`},hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1}},emits:[`afterCommit`,`afterPush`,`beforePush`,`clearFields`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=Z(),o=R(!1),c=R(!1),l=R({needsMerge:!1,error:``,fullError:``,pullOutput:``});function u(){o.value=!0}let d=O(()=>a.fileList.filter(e=>e.type===`added`).length),f=O(()=>a.branchBehind>0),p=O(()=>a.fileList.some(e=>[`modified`,`deleted`,`untracked`,`intent-to-add`].includes(e.type)));async function m(){try{let e=await a.gitPull();e.success?(await a.fetchStatus(),await a.fetchLog(!1)):(l.value={needsMerge:e.needsMerge,error:e.error,fullError:e.fullError,pullOutput:e.pullOutput},c.value=!0)}catch(e){console.error(`拉取失败:`,e)}}async function h(){try{await a.gitFetchAll(),await a.fetchStatus(),await a.fetchLog(!1)}catch(e){console.error(`获取远程分支失败:`,e)}}async function g(){if(r.hasUserCommitMessage)try{await a.addAndCommit(r.finalCommitMessage,r.skipHooks),a.fetchStatus(),a.fetchLog(),i(`afterCommit`,!0),i(`clearFields`)}catch(e){console.error(`暂存并提交失败:`,e)}}function _(){i(`beforePush`)}function v(e){i(`afterPush`,e)}function y(){i(`clearFields`)}t({openGitOperationsDrawer:u});let b={props:r,emit:i,gitStore:a,gitOperationsDrawerVisible:o,pullErrorDialogVisible:c,pullErrorInfo:l,openGitOperationsDrawer:u,stagedFilesCount:d,needsPull:f,hasUnstagedChanges:p,handleGitPull:m,handleGitFetchAll:h,addAndCommit:g,handleQuickPushBefore:_,handleQuickPushAfter:v,handleClearFields:y,get $t(){return J},get Menu(){return S},get RefreshRight(){return M},get Download(){return de},get Connection(){return ve},get Edit(){return oe},get InfoFilled(){return s},IconButton:De,StageButton:He,UnstageAllButton:Pe,CommitButton:Ke,PushButton:bt,QuickPushButton:Dt,MergeBranchButton:Ie,StashChangesButton:Fe,StashListButton:Me,CreateTagButton:Rt,TagListButton:En,ResetToRemoteButton:Le,CommonDialog:Ae};return Object.defineProperty(b,"__isScriptSetup",{enumerable:!1,value:!0}),b}});n(),u();var On={class:`git-operations-button`},kn={class:`actions-section`},An={class:`action-groups`},jn={class:`action-group`},Mn={class:`group-title`},Nn={class:`group-buttons`},Pn={key:0},Fn={class:`action-group`},In={class:`group-title`},Ln={class:`group-buttons`},Rn={class:`action-group`},zn={class:`group-title`},Bn={class:`group-buttons`},Vn={key:0},Hn={class:`action-group`},Un={class:`group-title`},Wn={class:`group-buttons`},Gn={class:`action-group`},Kn={class:`group-title`},qn={class:`group-buttons`},Jn={class:`action-group`},Yn={class:`group-title`},Xn={class:`group-buttons`},Zn={class:`pull-error-content`},Qn={key:0},$n={key:1},er={class:`pull-error-detail`},tr={class:`pull-error-label`},nr={class:`pull-error-pre`};function rr(e,t,n,r,i,a){let s=g,l=q,u=j,d=D;return P(),H(`div`,On,[C(` Git操作按钮 `),r.props.variant===`icon`?(P(),o(r.IconButton,{key:0,tooltip:r.$t(`@F13B4:Git 操作`),size:`large`,"custom-class":`btn-rotate-on-hover`,onClick:r.openGitOperationsDrawer},{default:z(()=>[w(s,null,{default:z(()=>[w(r.Menu)]),_:1})]),_:1},8,[`tooltip`])):(P(),o(l,{key:1,type:`primary`,class:`action-button`,onClick:r.openGitOperationsDrawer},{default:z(()=>[x(V(r.$t(`@F13B4:Git 操作`)),1)]),_:1})),C(` Git操作抽屉 `),w(d,{modelValue:r.gitOperationsDrawerVisible,"onUpdate:modelValue":t[2]||=e=>r.gitOperationsDrawerVisible=e,title:r.$t(`@76872:Git 操作`),direction:`rtl`,size:`362px`,"with-header":!0,"show-close":!0,"destroy-on-close":!1,"append-to-body":!0,class:`git-operations-drawer`},{default:z(()=>[c(`div`,kn,[c(`div`,An,[C(` 基础操作 `),c(`div`,jn,[c(`div`,Mn,V(r.$t(`@76872:基础操作`)),1),c(`div`,Nn,[w(r.StageButton,{onClick:()=>{},from:`drawer`}),w(r.UnstageAllButton,{onClick:()=>{},from:`drawer`}),w(r.CommitButton,{"has-user-commit-message":n.hasUserCommitMessage,"final-commit-message":n.finalCommitMessage,"skip-hooks":n.skipHooks,onBeforeCommit:()=>{},onAfterCommit:t[0]||=e=>r.emit(`afterCommit`,e),onClick:()=>{},from:`drawer`},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),w(r.PushButton,{onBeforePush:()=>{},onAfterPush:t[1]||=e=>r.emit(`afterPush`,e),onClick:()=>{},from:`drawer`}),w(u,{content:r.gitStore.hasConflictedFiles?r.$t(`@76872:存在冲突文件,请先解决冲突`):r.needsPull?`${r.$t(`@76872:拉取`)}${r.gitStore.branchBehind}${r.$t(`@76872:个远程提交`)}`:`git pull`,placement:`top`},{default:z(()=>[w(l,{type:`primary`,icon:r.Download,onClick:r.handleGitPull,loading:r.gitStore.isGitPulling,disabled:!r.gitStore.hasUpstream||r.gitStore.hasConflictedFiles,class:`action-button`,style:N(r.gitStore.hasUpstream&&!r.gitStore.hasConflictedFiles?{color:`white`,backgroundColor:`var(--color-primary)`,borderColor:`var(--color-primary)`}:{})},{default:z(()=>[x(V(r.$t(`@76872:拉取`))+` `,1),r.needsPull?(P(),H(`span`,Pn,`(`+V(r.gitStore.branchBehind)+`)`,1)):C(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`style`])]),_:1},8,[`content`]),w(u,{content:`git fetch --all`,placement:`top`},{default:z(()=>[w(l,{type:`info`,icon:r.Connection,onClick:r.handleGitFetchAll,loading:r.gitStore.isGitFetching,class:`action-button`,style:{color:`white`,"background-color":`var(--color-primary)`,"border-color":`var(--color-primary)`}},{default:z(()=>[x(V(r.$t(`@76872:获取所有远程分支`)),1)]),_:1},8,[`icon`,`loading`])]),_:1})])]),C(` 组合操作 `),c(`div`,Fn,[c(`div`,In,V(r.$t(`@76872:组合操作`)),1),c(`div`,Ln,[w(u,{content:r.gitStore.hasConflictedFiles?r.$t(`@76872:存在冲突文件,请先解决冲突`):`git add + git commit`,placement:`top`},{default:z(()=>[w(l,{type:`primary`,icon:r.Edit,onClick:r.addAndCommit,loading:r.gitStore.isAddingFiles||r.gitStore.isCommiting,disabled:!r.hasUnstagedChanges||!n.hasUserCommitMessage||r.gitStore.hasConflictedFiles,class:`action-button`},{default:z(()=>[x(V(r.$t(`@76872:暂存并提交`)),1)]),_:1},8,[`icon`,`loading`,`disabled`])]),_:1},8,[`content`]),w(r.QuickPushButton,{from:`drawer`,"has-user-commit-message":n.hasUserCommitMessage,"final-commit-message":n.finalCommitMessage,"skip-hooks":n.skipHooks,onBeforePush:r.handleQuickPushBefore,onAfterPush:r.handleQuickPushAfter,onClearFields:r.handleClearFields},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`])])]),C(` 重置操作 `),c(`div`,Rn,[c(`div`,zn,V(r.$t(`@76872:重置操作`)),1),c(`div`,Bn,[w(u,{content:r.stagedFilesCount>0?`${r.$t(`@76872:撤销`)}${r.stagedFilesCount}${r.$t(`@76872:个已暂存文件`)}`:`git reset HEAD`,placement:`top`},{default:z(()=>[w(l,{type:`warning`,icon:r.RefreshRight,onClick:r.gitStore.resetHead,loading:r.gitStore.isResetting,disabled:r.stagedFilesCount===0||r.gitStore.hasConflictedFiles,class:`action-button reset-button`},{default:z(()=>[x(V(r.$t(`@76872:重置暂存区`))+` `,1),r.stagedFilesCount>0?(P(),H(`span`,Vn,`(`+V(r.stagedFilesCount)+`)`,1)):C(`v-if`,!0)]),_:1},8,[`icon`,`onClick`,`loading`,`disabled`])]),_:1},8,[`content`]),w(r.ResetToRemoteButton,{variant:`text`})])]),C(` 分支操作 `),c(`div`,Hn,[c(`div`,Un,V(r.$t(`@76872:分支操作`)),1),c(`div`,Wn,[w(r.MergeBranchButton,{variant:`text`})])]),C(` 储藏操作 `),c(`div`,Gn,[c(`div`,Kn,V(r.$t(`@76872:储藏操作`)),1),c(`div`,qn,[w(r.StashChangesButton,{variant:`text`}),w(r.StashListButton,{variant:`text`})])]),C(` 标签操作 `),c(`div`,Jn,[c(`div`,Yn,V(r.$t(`@TAG01:标签操作`)),1),c(`div`,Xn,[w(r.CreateTagButton,{variant:`text`}),w(r.TagListButton,{variant:`text`})])])])])]),_:1},8,[`modelValue`,`title`]),C(` Pull 失败错误详情弹窗 `),w(r.CommonDialog,{modelValue:r.pullErrorDialogVisible,"onUpdate:modelValue":t[3]||=e=>r.pullErrorDialogVisible=e,title:r.pullErrorInfo.needsMerge?r.$t(`@76872:需要合并更改`):r.$t(`@76872:拉取失败`),size:`medium`,"show-footer":!0,"show-cancel":!1,"confirm-text":r.$t(`@76872:我知道了`),"append-to-body":!0,onConfirm:t[4]||=e=>r.pullErrorDialogVisible=!1},{default:z(()=>[c(`div`,Zn,[c(`div`,{class:_([`pull-error-type`,r.pullErrorInfo.needsMerge?`is-warning`:`is-error`])},[w(s,{class:`pull-error-icon`},{default:z(()=>[w(r.InfoFilled)]),_:1}),r.pullErrorInfo.needsMerge?(P(),H(`span`,Qn,V(r.$t(`@76872:本地存在未提交的更改,与远程内容冲突,请先处理本地更改后再拉取。`)),1)):(P(),H(`span`,$n,V(r.$t(`@76872:执行 git pull 时发生错误,请查看详细信息。`)),1))],2),c(`div`,er,[c(`div`,tr,V(r.$t(`@76872:错误详情`))+`:`,1),c(`pre`,nr,V(r.pullErrorInfo.fullError||r.pullErrorInfo.error),1)])])]),_:1},8,[`modelValue`,`title`,`confirm-text`])])}var ir=Y(Dn,[[`render`,rr],[`__scopeId`,`data-v-3357e454`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/GitOperationsButton.vue`]]);n();var ar=h({__name:`GlobalLoading`,props:{visible:{type:Boolean,required:!1,default:!1},text:{type:String,required:!1,default:J(`@2AEBA:加载中...`)},showProgress:{type:Boolean,required:!1,default:!1},progress:{type:Number,required:!1,default:0},mock:{type:Boolean,required:!1,default:!1}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});n(),u(),B();var or={class:`loading-container`},sr={class:`loading-text`},cr={key:0,class:`loading-progress`};function lr(e,t,n,r,i,s){return P(),o(a,{to:`body`},[w(U,{name:`loading-fade`},{default:z(()=>[n.visible||n.mock?(P(),H(`div`,{key:0,class:`global-loading-overlay`,onClick:t[0]||=L(()=>{},[`stop`])},[c(`div`,or,[C(` 主加载器 `),t[1]||=c(`div`,{class:`loading-spinner`},[c(`div`,{class:`spinner-ring`}),c(`div`,{class:`spinner-ring`}),c(`div`,{class:`spinner-ring`})],-1),C(` 加载文字 `),c(`div`,sr,V(n.text),1),C(` 进度条(可选/Mock) `),n.showProgress||n.mock?(P(),H(`div`,cr,[c(`div`,{class:_([`progress-bar`,{"is-mock":n.mock&&!n.showProgress}]),style:N(n.showProgress?{width:n.progress+`%`}:void 0)},null,6)])):C(`v-if`,!0)])])):C(`v-if`,!0)]),_:1})])}var ur=Y(ar,[[`render`,lr],[`__scopeId`,`data-v-77e24a5f`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/GlobalLoading.vue`]]);n();var dr=h({__name:`SuccessModal`,props:{visible:{type:Boolean,required:!1,default:!1},text:{type:String,required:!1,default:J(`@71545:操作成功!`)},description:{type:String,required:!1,default:``}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});n(),u(),B();var fr={class:`success-container`},pr={class:`success-text`},mr={key:0,class:`success-description`};function hr(e,t,n,r,i,s){return P(),o(a,{to:`body`},[w(U,{name:`success-fade`},{default:z(()=>[n.visible?(P(),H(`div`,{key:0,class:`success-overlay`,onClick:t[0]||=L(()=>{},[`stop`])},[c(`div`,fr,[C(` 成功图标 `),t[1]||=c(`div`,{class:`success-icon`},[c(`svg`,{viewBox:`0 0 52 52`,class:`success-svg`},[c(`circle`,{class:`success-circle`,cx:`26`,cy:`26`,r:`25`,fill:`none`}),c(`path`,{class:`success-check`,fill:`none`,d:`m14.1 27.2l7.1 7.2 16.7-16.8`})])],-1),C(` 成功文字 `),c(`div`,pr,V(n.text),1),C(` 描述文字 `),n.description?(P(),H(`div`,mr,V(n.description),1)):C(`v-if`,!0)])])):C(`v-if`,!0)]),_:1})])}var gr=Y(dr,[[`render`,hr],[`__scopeId`,`data-v-30ab4535`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/SuccessModal.vue`]]);G();var $=xe({visible:!1,text:J(`@F2A3A:加载中...`),showProgress:!1,progress:0});function _r(){return{loadingState:$,show:e=>{$.visible=!0,$.text=e?.text||J(`@F2A3A:加载中...`),$.showProgress=e?.showProgress||!1,$.progress=e?.progress||0},hide:()=>{$.visible=!1},updateProgress:e=>{$.progress=Math.max(0,Math.min(100,e))},updateText:e=>{$.text=e},setText:e=>{$.visible&&($.text=e)}}}G();var vr=xe({visible:!1,text:J(`@B8591:操作成功!`),description:``});function yr(){let e=e=>{vr.visible=!0,vr.text=e?.text||J(`@B8591:操作成功!`),vr.description=e?.description||``;let n=e?.duration||2e3;setTimeout(()=>{t()},n)},t=()=>{vr.visible=!1};return{successState:vr,show:e,hide:t}}n();var br=h({__name:`QuickCommitButton`,props:{from:{type:String,required:!1,default:`form`},hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1}},emits:[`beforeCommit`,`afterCommit`,`clearFields`],setup(e,{expose:t,emit:n}){let r=Z(),i=X(),a=e,o=n,s=O(()=>r.fileList.some(e=>!Q(e.path,i.lockedFiles))),c=O(()=>r.isSelectionMode&&r.selectedFiles.size>0&&r.selectedUnstagedPaths.length>0),l=O(()=>r.hasConflictedFiles?!0:r.isSelectionMode?!c.value||!a.hasUserCommitMessage:!s.value||!a.hasUserCommitMessage),u=O(()=>r.isAddingFiles||r.isCommiting),d=O(()=>r.hasConflictedFiles?J(`@2E184:存在冲突文件,请先解决冲突`):r.isSelectionMode?r.selectedFiles.size===0?J(`@2E184:请先勾选要提交的文件`):r.selectedUnstagedPaths.length===0?J(`@2E184:所选文件无需暂存或被锁定`):a.hasUserCommitMessage?J(`@2E184:一键完成:仅暂存所选文件 → 提交`):J(`@2E184:请输入提交信息`):s.value?a.hasUserCommitMessage?J(`@2E184:一键完成:暂存所有更改 → 提交`):J(`@2E184:请输入提交信息`):J(`@2E184:没有需要提交的更改`)),f=O(()=>r.isSelectionMode&&c.value?J(`@2E184:一键提交所选`):J(`@2E184:一键提交`)),p=O(()=>a.from===`form`?r.isSelectionMode&&c.value?J(`@2E184:暂存所选 + 提交`):J(`@2E184:暂存 + 提交`):``);async function m(){o(`beforeCommit`);try{let e=await r.stageSelectedAndCommit(a.finalCommitMessage,a.skipHooks);e&&o(`clearFields`),o(`afterCommit`,e)}catch(e){console.error(`一键提交失败:`,e),o(`afterCommit`,!1)}}t({triggerQuickCommit:m});let h={gitStore:r,configStore:i,props:a,emit:o,hasAnyChanges:s,hasSelectedToStage:c,isDisabled:l,isLoading:u,tooltipText:d,buttonTitle:f,buttonDesc:p,handleQuickCommit:m,get ElTooltip(){return j},get Edit(){return oe}};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}});n(),u();var xr={class:`one-commit-content`},Sr={class:`one-commit-text`},Cr={class:`one-commit-title`},wr={key:0,class:`one-commit-desc`};function Tr(e,t,n,r,i,a){let o=g,s=q;return P(),H(`div`,null,[w(r.ElTooltip,{content:r.tooltipText,placement:`top`,"show-after":200},{default:z(()=>[w(s,{type:`primary`,onClick:r.handleQuickCommit,loading:r.isLoading,disabled:r.isDisabled,class:_([n.from,`one-commit-button`])},{default:z(()=>[c(`div`,xr,[w(o,{class:`one-commit-icon`},{default:z(()=>[w(r.Edit)]),_:1}),c(`div`,Sr,[c(`span`,Cr,V(r.buttonTitle),1),n.from===`form`?(P(),H(`span`,wr,V(r.buttonDesc),1)):C(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}var Er=Y(br,[[`render`,Tr],[`__scopeId`,`data-v-0c962829`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/QuickCommitButton.vue`]]);n();var Dr=h({__name:`AiQuickPushButton`,props:{from:{type:String,required:!1,default:`form`},generating:{type:Boolean,required:!1,default:!1}},emits:[`trigger`],setup(e,{expose:t,emit:n}){t();let r=Z(),i=X(),a=e,o=n,s=O(()=>r.fileList.some(e=>!Q(e.path,i.lockedFiles))),c=O(()=>r.isSelectionMode&&r.selectedFiles.size>0&&r.selectedUnstagedPaths.length>0),l=O(()=>!r.isSelectionMode&&!s.value&&r.branchAhead>0),u=O(()=>r.hasConflictedFiles||!r.hasUpstream?!0:r.isSelectionMode?!c.value:!s.value&&r.branchAhead===0),d=O(()=>a.generating||r.isAddingFiles||r.isCommiting||r.isPushing),f=O(()=>r.hasConflictedFiles?J(`@2E184:存在冲突文件,请先解决冲突`):r.hasUpstream?a.generating?J(`@2E184:AI 正在生成提交信息…`):r.isSelectionMode?c.value?J(`@2E184:一键完成:AI 生成提交信息 → 仅暂存所选文件 → 提交 → 推送`):J(`@2E184:请先勾选要推送的文件`):!s.value&&r.branchAhead===0?J(`@2E184:没有需要提交或推送的更改`):s.value?J(`@2E184:一键完成:AI 生成提交信息 → 暂存所有更改 → 提交 → 推送`):J(`@2E184:本地已提交,AI 将直接推送到远程仓库`):J(`@2E184:当前分支没有上游分支`)),p=O(()=>r.isSelectionMode&&c.value?J(`@2E184:AI 提交并推送所选`):J(`@2E184:AI 提交并推送`)),m=O(()=>a.from===`form`?l.value?J(`@2E184:本地已提交,直接推送`):J(`@2E184:AI 生成信息 + 推送`):``);function h(){u.value||d.value||o(`trigger`)}let g={gitStore:r,configStore:i,props:a,emit:o,hasAnyChanges:s,hasSelectedToStage:c,isPushOnly:l,isDisabled:u,isLoading:d,tooltipText:f,buttonTitle:p,buttonDesc:m,handleClick:h,get ElTooltip(){return j},SvgIcon:Ee};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}});n(),u();var Or={class:`one-ai-push`},kr={class:`one-ai-push-content`},Ar={class:`one-ai-push-text`},jr={class:`one-ai-push-title`},Mr={key:0,class:`one-ai-push-desc`};function Nr(e,t,n,r,i,a){let o=q;return P(),H(`div`,Or,[w(r.ElTooltip,{content:r.tooltipText,placement:`top`,"show-after":200},{default:z(()=>[w(o,{type:`primary`,onClick:r.handleClick,loading:r.isLoading,disabled:r.isDisabled,class:_([n.from,`one-ai-push-button`])},{default:z(()=>[c(`div`,kr,[w(r.SvgIcon,{class:`one-ai-push-icon`,"icon-class":`ai-commit`,style:{color:`#fff`}}),c(`div`,Ar,[c(`span`,jr,V(r.buttonTitle),1),n.from===`form`?(P(),H(`span`,Mr,V(r.buttonDesc),1)):C(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}var Pr=Y(Dr,[[`render`,Nr],[`__scopeId`,`data-v-0a8120f6`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/AiQuickPushButton.vue`]]);n(),G();var Fr=h({__name:`GitActionButtons`,props:{hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1},from:{type:String,required:!1,default:`form`},aiGenerating:{type:Boolean,required:!1,default:!1}},emits:[`afterCommit`,`afterPush`,`beforePush`,`pushStart`,`clearFields`,`aiQuickPush`],setup(e,{expose:t,emit:n}){let r=n,i=R(null);function a(e){r(`afterCommit`,e)}function o(e){r(`afterPush`,e)}function s(){r(`beforePush`)}function c(){r(`pushStart`)}function l(){r(`clearFields`)}function u(){r(`aiQuickPush`)}async function d(){return i.value?.triggerQuickPush()}t({triggerQuickPush:d});let f={emit:r,quickPushRef:i,handleAfterCommit:a,handleAfterPush:o,handleBeforePush:s,handlePushStart:c,handleClearFields:l,handleAiQuickPush:u,triggerQuickPush:d,StageButton:He,CommitButton:Ke,PushButton:bt,QuickPushButton:Dt,QuickCommitButton:Er,AiQuickPushButton:Pr};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}});n();var Ir={class:`form-bottom-actions`},Lr={class:`actions-flex-container`},Rr={class:`left-actions`},zr={class:`button-grid`},Br={class:`right-actions`};function Vr(e,t,n,r,i,a){return P(),H(`div`,Ir,[c(`div`,Lr,[c(`div`,Rr,[c(`div`,zr,[w(r.StageButton,{onClick:()=>{},from:n.from},null,8,[`from`]),w(r.CommitButton,{"has-user-commit-message":n.hasUserCommitMessage,"final-commit-message":n.finalCommitMessage,"skip-hooks":n.skipHooks,onBeforeCommit:()=>{},onAfterCommit:r.handleAfterCommit,onClick:()=>{},from:n.from},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`,`from`]),w(r.PushButton,{onBeforePush:()=>{},onAfterPush:r.handleAfterPush,onClick:()=>{},from:n.from},null,8,[`from`])])]),c(`div`,Br,[w(r.QuickCommitButton,{from:n.from,"has-user-commit-message":n.hasUserCommitMessage,"final-commit-message":n.finalCommitMessage,"skip-hooks":n.skipHooks,onAfterCommit:r.handleAfterCommit,onClearFields:r.handleClearFields},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),w(r.QuickPushButton,{ref:`quickPushRef`,from:n.from,"has-user-commit-message":n.hasUserCommitMessage,"final-commit-message":n.finalCommitMessage,"skip-hooks":n.skipHooks,onBeforePush:r.handleBeforePush,onPushStart:r.handlePushStart,onAfterPush:r.handleAfterPush,onClearFields:r.handleClearFields},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),w(r.AiQuickPushButton,{from:n.from,generating:n.aiGenerating,onTrigger:r.handleAiQuickPush},null,8,[`from`,`generating`])])])])}var Hr=Y(Fr,[[`render`,Vr],[`__scopeId`,`data-v-12b4dc63`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/GitActionButtons.vue`]]);n(),G();var Ur=h({__name:`CommandHistory`,setup(e,{expose:n}){n();let r=Z(),i=R([]),a=R(!1);function o(e){return Array.isArray(e)?e.join(` `):e==null?``:String(e)}let s=R(!1),c=R(!1),l=R(!1),u=R(new Set),d=R(!1),p=R(!1),m=R(`all`),h=R(`all`),g=R(``),_=O(()=>{let e=i.value;if(m.value!==`all`&&(e=e.filter(e=>m.value===`success`?e.success:!e.success)),h.value!==`all`&&(e=e.filter(e=>{let t=o(e.command).startsWith(`git `);return h.value===`git`?t:!t})),g.value.trim()){let t=g.value.toLowerCase();e=e.filter(e=>o(e.command).toLowerCase().includes(t)||e.stdout&&e.stdout.toLowerCase().includes(t)||e.stderr&&e.stderr.toLowerCase().includes(t)||e.error&&e.error.toLowerCase().includes(t))}return e}),v=O(()=>i.value.filter(e=>e.success).length),y=O(()=>i.value.filter(e=>!e.success).length),b=O(()=>i.value.filter(e=>o(e.command).startsWith(`git `)).length),x=O(()=>i.value.filter(e=>!o(e.command).startsWith(`git `)).length);function S(){p.value=!0,i.value.length===0&&C()}async function C(){try{if(a.value=!0,r.socket&&r.socket.connected)r.socket.emit(`request_full_history`);else{let e=await(await fetch(`/api/command-history`)).json();e.success?i.value=e.history:F.error(`${J(`@81F0F:加载命令历史失败: `)}${e.error}`)}}catch(e){F.error(`${J(`@81F0F:加载命令历史失败: `)}${e.message}`)}finally{a.value=!1}}async function w(){if(_.value.length===0){F.warning(J(`@81F0F:没有可复制的命令历史`));return}try{c.value=!0;let e=_.value.map(e=>{let t=`# ${k(e.timestamp)}${J(`@81F0F: (耗时: `)}${A(e.executionTime)}) - ${e.success?J(`@81F0F:成功`):J(`@81F0F:失败`)}\n`;if(t+=`${o(e.command)}\n`,e.stdout&&(t+=`\n# 输出:\n${e.stdout}\n`),e.stderr){let n=P(e.command)?J(`@81F0F:输出信息`):J(`@81F0F:错误输出`);t+=`\n# ${n}:\n${e.stderr}\n`}return e.error&&(t+=`\n# 错误信息:\n${e.error}\n`),t}).join(`
2
2
  ---
3
3
 
4
4
  `);await navigator.clipboard.writeText(e),F({message:J(`@81F0F:命令历史已复制到剪贴板`),type:`success`,zIndex:1e5})}catch(e){F.error(`${J(`@81F0F:复制失败: `)}${e.message}`)}finally{c.value=!1}}async function E(){if(_.value.length===0){F.warning(J(`@81F0F:没有可复制的命令`));return}try{d.value=!0;let e=_.value.map(e=>o(e.command)).join(`