zen-gitsync 2.17.28 → 2.17.29

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 (76) hide show
  1. package/README.md +8 -6
  2. package/package.json +4 -1
  3. package/src/ui/public/assets/{AgentEngineSelector-D8iaDrev.js → AgentEngineSelector-Wl7dKYKL.js} +2 -2
  4. package/src/ui/public/assets/{AgentView-BaYMwfC4.css → AgentView-Bebv5xk6.css} +1 -1
  5. package/src/ui/public/assets/AgentView-CebQ3545.js +11 -0
  6. package/src/ui/public/assets/AppVersionBadge-jm8ejuZ-.js +2 -0
  7. package/src/ui/public/assets/{BranchSelector-CTrTouMm.js → BranchSelector-CcNILIbg.js} +1 -1
  8. package/src/ui/public/assets/CommitForm-1ocxo8Cb.js +6 -0
  9. package/src/ui/public/assets/{CommonDialog-Bwj--3EO.js → CommonDialog-DpFTO5cg.js} +1 -1
  10. package/src/ui/public/assets/EditorView-CtRHV1Sv.js +37 -0
  11. package/src/ui/public/assets/FileDiffViewer-DXJO-G55.js +15 -0
  12. package/src/ui/public/assets/{FlowExecutionViewer-awWx7pMb.js → FlowExecutionViewer-d4O5Y9Ca.js} +1 -1
  13. package/src/ui/public/assets/FlowOrchestrationWorkspace-CKLRMeaL.js +21 -0
  14. package/src/ui/public/assets/{IconButton-IoukQQts.js → IconButton-Dl1cdP_x.js} +1 -1
  15. package/src/ui/public/assets/{LogList-Ca0hE-S0.js → LogList-CdDRC_CO.js} +4 -4
  16. package/src/ui/public/assets/MindmapView-U84MWPHc.js +2 -0
  17. package/src/ui/public/assets/MonitorView-spOV0cP7.js +1 -0
  18. package/src/ui/public/assets/{ProjectStartupButton-C8OZPgjM.js → ProjectStartupButton-BbAbfFn2.js} +1 -1
  19. package/src/ui/public/assets/{RecentDirectoriesChat-DFGIm3ab.js → RecentDirectoriesChat-CxNjjgVG.js} +2 -2
  20. package/src/ui/public/assets/RemoteManagerDialog-BVm2-Hn4.js +4 -0
  21. package/src/ui/public/assets/{RemoteRepoCard-HV8oHZL_.js → RemoteRepoCard-UHK_hrDS.js} +2 -2
  22. package/src/ui/public/assets/{SourceMapView-ByGif9Z8.js → SourceMapView-PHMr0wt3.js} +2 -2
  23. package/src/ui/public/assets/{SvgIcon-Cv-Ewpj-.js → SvgIcon-Dk7WnZLB.js} +1 -1
  24. package/src/ui/public/assets/{TemplateManager-DBuPZE4y.js → TemplateManager-B3ZNTXnP.js} +1 -1
  25. package/src/ui/public/assets/UserInputNode-DeAD7H0z.js +1 -0
  26. package/src/ui/public/assets/WorkbenchView-DsZ2ONpW.js +143 -0
  27. package/src/ui/public/assets/WorkbenchView-kZ8DoH2l.css +1 -0
  28. package/src/ui/public/assets/{_plugin-vue_export-helper-BP5VbhV0.js → _plugin-vue_export-helper-BKeZSroN.js} +5 -5
  29. package/src/ui/public/assets/{agentConversations-CDIB8kgC.js → agentConversations-ChTc-LkQ.js} +5 -5
  30. package/src/ui/public/assets/{configStore-eQKYDKzd.js → configStore-fJaic3kE.js} +1 -1
  31. package/src/ui/public/assets/{css.worker-BDCmgL4U.js → css.worker-DFdt6_zu.js} +9 -9
  32. package/src/ui/public/assets/editor.worker-O-CH8JUO.js +26 -0
  33. package/src/ui/public/assets/element-plus-D0R8BMj4.js +48 -0
  34. package/src/ui/public/assets/{element-plus-C1xzgNSR.css → element-plus-Qexo5hiM.css} +1 -1
  35. package/src/ui/public/assets/{flow-mindmap-B3900Z4K.js → flow-mindmap-Doi70WWn.js} +1 -1
  36. package/src/ui/public/assets/gitStore-D9oF5nof.js +6 -0
  37. package/src/ui/public/assets/{html.worker-DG8hnSJR.js → html.worker-JUzsMP-j.js} +8 -8
  38. package/src/ui/public/assets/index-CKxygqdx.js +148 -0
  39. package/src/ui/public/assets/json.worker-B4dEhy0e.js +58 -0
  40. package/src/ui/public/assets/{monaco-BScz9v63.js → monaco-DkJuNcCr.js} +6 -6
  41. package/src/ui/public/assets/{office-docx-C8sYW8O1.js → office-docx-O0YXk5gA.js} +1 -1
  42. package/src/ui/public/assets/{office-excel-DpZn5My2.js → office-excel-CXD9VwgB.js} +1 -1
  43. package/src/ui/public/assets/{office-pptx-BnYBTwT7.js → office-pptx-CiF2OlTq.js} +3 -3
  44. package/src/ui/public/assets/previewSandbox-21uStCdd.js +9 -0
  45. package/src/ui/public/assets/{toolsStore-C4B7BL-O.js → toolsStore-C89takm3.js} +1 -1
  46. package/src/ui/public/assets/{ts.worker-DgFMIcEs.js → ts.worker-CmEKzkmF.js} +49 -49
  47. package/src/ui/public/assets/{useThemeObserver-CGbhdyNi.js → useThemeObserver-BvSA7RDh.js} +1 -1
  48. package/src/ui/public/assets/{vendor-CUTaFm6P.js → vendor-CCrjQw5C.js} +2 -2
  49. package/src/ui/public/assets/{vue-flow-CxnoC7Uq.js → vue-flow-5Aq2bwoG.js} +1 -1
  50. package/src/ui/public/index.html +18 -18
  51. package/src/ui/server/routes/fs.js +12 -2
  52. package/src/ui/server/routes/workbench/agentMarketplace.js +130 -23
  53. package/src/ui/server/routes/workbench/agentMarketplace.test.js +68 -1
  54. package/src/ui/server/routes/workbench/envContext.js +69 -29
  55. package/src/ui/server/routes/workbench/envContext.test.js +68 -0
  56. package/src/ui/server/routes/workbench/executorModels.test.js +326 -326
  57. package/src/ui/server/routes/workbench/index.js +10 -3
  58. package/src/ui/server/routes/workbench/taskRunner.js +11 -4
  59. package/src/ui/public/assets/AgentView-BQz9h_Qi.js +0 -10
  60. package/src/ui/public/assets/AppVersionBadge-Mx8QwTA1.js +0 -2
  61. package/src/ui/public/assets/CommitForm-DsfySGI2.js +0 -6
  62. package/src/ui/public/assets/EditorView-DiyJWwAk.js +0 -37
  63. package/src/ui/public/assets/FileDiffViewer-DFFyUPF2.js +0 -15
  64. package/src/ui/public/assets/FlowOrchestrationWorkspace-Brq0M2sZ.js +0 -21
  65. package/src/ui/public/assets/MindmapView-BO_PG-mg.js +0 -2
  66. package/src/ui/public/assets/MonitorView-BXlLpzYU.js +0 -1
  67. package/src/ui/public/assets/RemoteManagerDialog-DFtZmhn4.js +0 -4
  68. package/src/ui/public/assets/UserInputNode-CVKtLvHE.js +0 -1
  69. package/src/ui/public/assets/WorkbenchView-5K0toOqC.js +0 -143
  70. package/src/ui/public/assets/WorkbenchView-BA7mKIr4.css +0 -1
  71. package/src/ui/public/assets/editor.worker-GCPm6rMv.js +0 -26
  72. package/src/ui/public/assets/element-plus-D7LDHcAn.js +0 -48
  73. package/src/ui/public/assets/gitStore-8MMG-kBB.js +0 -6
  74. package/src/ui/public/assets/index-DBOS6HZF.js +0 -148
  75. package/src/ui/public/assets/json.worker-CxwlJRnL.js +0 -58
  76. package/src/ui/public/assets/previewSandbox-C-BRP5dF.js +0 -9
package/README.md CHANGED
@@ -347,9 +347,10 @@ A full IDE-like editor (fourth icon in the activity bar) for browsing and editin
347
347
 
348
348
  | Feature | Description |
349
349
  |---|---|
350
- | File tree | Collapsible directory tree with file-type icons; **auto-refreshes every 15s** to pick up changes made outside the GUI (skipped when the tab is hidden or the search box is non-empty) |
350
+ | File tree | Collapsible directory tree with file-type icons; **auto-refreshes every 60s** to pick up changes made outside the GUI (skipped when the tab is hidden or the search box is non-empty) |
351
351
  | File search | Type in the sidebar search box to filter the tree (180 ms debounce); matched substrings are highlighted in node names; `Ctrl+F` / `Cmd+F` focuses the box; `Esc` clears the query or blurs the input |
352
352
  | Multi-tab editing | Open multiple files simultaneously; tabs show unsaved (●) indicator |
353
+ | Sync with disk | The current tab re-checks the file on disk when the window regains focus, when you switch to that tab, or when you come back to the Editor view; a 30s fallback poll covers the case where something in the same window (the `g ai` panel) rewrote the file with no focus change. If it changed and you have no unsaved edits, it reloads silently (cursor position and undo history preserved); if you do have unsaved edits it asks first and never overwrites on its own |
353
354
  | Workspace restore | The tree's expanded folders and the open tabs (their order plus which one is active) are remembered **per project** and put back on reload, and when you switch back to that project. The snapshot lives in `~/.zen-gitsync/config.json` under `ui.editorWorkspaceByProject`; only paths are stored — files are re-read from disk, so unsaved edits do not survive a reload, and files that no longer exist are skipped silently |
354
355
  | Sidebar width | Drag the divider to resize the file tree pane; unlike the workspace snapshot the width is **global** (one value for every project) and is stored in `~/.zen-gitsync/config.json` under `ui.editorSidebarWidth`, restored on reload. Clamped to 140–400px |
355
356
  | Monaco editor | Syntax highlighting for JS, TS, Vue, Python, Go, JSON, CSS, and more |
@@ -398,7 +399,7 @@ A dedicated view for running coding agents across one or many projects. Every ta
398
399
  | Finish notice | When a run finishes or fails you get a chime (a distinct tone for done vs. error; stopping on purpose stays silent) plus an in-app toast while the page is in the foreground, and a system notification when it is not — so you can be looking at another view or window and still be told. The chime has its **own switch** under the notice toggle, so you can keep the notices but mute the sound, or the other way round. Sounds are CC0 assets under `public/sounds/`; see `CREDITS.txt` there to swap in another tone |
399
400
  | Cross-view indicator | While any Workbench task is running, a pulsing dot appears on the Workbench icon in the Activity Bar so you can see job state from the Git or Editor view |
400
401
  | Execution log manager (dialog) | The "Execution logs" button in the workbench top bar opens a dialog with the list / filter / batch delete / clear / retention-policy UI (defaults: 500 records, 256 MB); the task execution view stays mounted so no work-in-progress state is dropped |
401
- | Continue chat | After a task reaches a done / error / cancelled state, a follow-up composer appears; sending a message resumes the previous session (`claude --resume <session_id>` for Claude Code, `--session` for OpenCode, `codex exec resume <thread_id>` for Codex), and each new turn stacks into the same chat-style flow |
402
+ | Continue chat | After a task reaches a done / error / cancelled state, a follow-up composer appears; sending a message resumes the previous session (`claude --resume <session_id>` for Claude Code, `--session` for OpenCode, `codex exec resume <thread_id>` for Codex), and each new turn stacks into the same chat-style flow. Since the resumed session already carries the previous turn's context, follow-up turns inject only a **slim refresh** of the run-environment block (current project + board totals + truth-file paths) instead of the full project list — the chat log no longer repeats the same list every round |
402
403
  | Local tool detection | On startup + every 10 min the server probes 7 CLIs (`code`, `claude`, `codex`, `opencode`, `kimi`, `zcode`, `dsh`). Tools that are missing are dimmed and labelled "Not installed" — clicking one opens the install guide, and right-clicking a tool button offers an update to the latest published version |
403
404
 
404
405
  Prompt presets and tasks are persisted to `~/.zen-gitsync/prompts.json` and `~/.zen-gitsync/tasks.json` (cross-project, shared across repos); run history and the retention policy live in `jobs.json` / `jobs-config.json`, the master-agent console state in `orchestrator.json` (with its report history in `orchestrator-reports.json` — kept apart so the polled state file stays small), and task attachments under `~/.zen-gitsync/workbench-images/_task-<taskId>/`.
@@ -419,7 +420,7 @@ A dedicated view (robot icon in the activity bar) for chatting with the built-in
419
420
  | Task plan | Multi-step work gets a visible plan: the agent calls the built-in `update_plan` tool to split the task into 3-8 verifiable steps before touching anything, then updates each step's status as it goes. Steps render as a checklist with completed / in-progress / pending states and a `2/5` progress header — in the terminal as a `✓ / ▶ / ○` list, in the Web panel as a card that **stays visible even when the tool group is collapsed** (collapsing hides other tool calls, never the current plan) |
420
421
  | Recent-projects awareness | Ask "which of my projects need a pull?" and the agent calls its built-in `list_projects` tool instead of scanning the disk: it returns exactly the list behind the GUI's **Recent projects** panel (recent directories plus any directory a task was created in, with branch / ahead / behind / uncommitted counts and task progress), so the agent's answer and the UI agree. Ahead/behind reads local refs, so the agent can pass `refresh=true` to run a `git fetch` pass first when the question is about pulling |
421
422
  | Session persistence | All conversations are saved to `~/.zen-gitsync/agent-sessions/` as JSON files; the CLI agent (`g ai`) writes to the same directory so Web and CLI sessions are unified |
422
- | Skill / MCP plaza | The **Skill plaza** and **MCP plaza** tabs list skills and MCP servers from several sources, each with its description, weekly downloads / usage count and install state. Install one into the **current project** or into the **`g ai` agent** — entries already installed can be uninstalled from the same card, and ones that still need environment variables are flagged. From a terminal, `g ai` lists what is installed with `/skills` (`/mcp` is an alias) |
423
+ | Skill / MCP plaza | The **Skill plaza** and **MCP plaza** tabs list skills and MCP servers from several sources, each with its description, weekly downloads / usage count and install state. Install one into the **current project** or into the **`g ai` agent** — entries already installed can be opened in the system file manager or uninstalled from the same row, and ones that still need environment variables are flagged. The installed list shows both the skill's own `name` and the on-disk id, since a repository often ships a skill whose `SKILL.md` calls itself something else. From a terminal, `g ai` lists what is installed with `/skills` (`/mcp` is an alias) |
423
424
  | SSH-first cloning | When you ask it to clone a repo (or add a remote) it uses the SSH form — `git@github.com:owner/repo.git` / `git@gitee.com:owner/repo.git` — converting an `https://` URL first, so the clone never stalls on a Git Credential Manager username/password prompt; it falls back to https only when SSH genuinely fails (`Permission denied (publickey)` / host-key verification) and says which one it used. The same preference is injected into every workbench task, whose executor is an external CLI with a system prompt this app does not own |
424
425
  | Per-turn tool limit | A single message may trigger up to N tool calls in a row (default **200**, range 1–2000). Configurable in **Settings → AI models → Agent Runtime**; hitting the limit ends the turn and asks you to send another message. The same setting drives the CLI agent |
425
426
  | Preset questions | Quick-start buttons on the welcome screen for common tasks (view project structure, analyze code quality, write tests, check git status, start the project) |
@@ -1012,9 +1013,10 @@ Activity Bar 第四个视图,在 GUI 内直接浏览并编辑项目文件:
1012
1013
 
1013
1014
  | 功能 | 说明 |
1014
1015
  |---|---|
1015
- | 文件树 | 可折叠的目录树,附带文件类型图标;**每 15 秒自动刷新一次**,捕获 GUI 外部对文件的改动(标签页隐藏或搜索框非空时跳过) |
1016
+ | 文件树 | 可折叠的目录树,附带文件类型图标;**每 60 秒自动刷新一次**,捕获 GUI 外部对文件的改动(标签页隐藏或搜索框非空时跳过) |
1016
1017
  | 文件搜索 | 在侧边栏搜索框中输入关键字过滤文件树(180ms 防抖),命中片段会在节点名中高亮;`Ctrl+F` / `Cmd+F` 聚焦搜索框,`Esc` 清空内容或失焦 |
1017
1018
  | 多标签页 | 同时打开多个文件,未保存文件显示 ● 标记 |
1019
+ | 跟盘同步 | 窗口重新聚焦、切到某个标签、或切回文件空间时,当前标签会跟盘上对一次账;另有 30 秒兜底轮询,盖住"同窗口里 AI 面板写了文件、用户全程没切焦点"的情况。变了且没有未保存改动就静默换成最新正文(光标位置与撤销栈都保留);有未保存改动则先问一次,绝不自动覆盖 |
1018
1020
  | 工作区恢复 | **按项目**记住文件树展开了哪些目录、开了哪些标签(顺序 + 当前激活的那个),刷新页面或切回该项目时自动恢复;快照存在 `~/.zen-gitsync/config.json` 的 `ui.editorWorkspaceByProject`。只记路径 —— 文件按盘上最新内容重开,未保存的改动不跨会话保留,已被删除的文件静默跳过 |
1019
1021
  | 侧边栏宽度 | 拖拽分隔条调整文件树栏宽度;与工作区快照不同,宽度是**全局**一份(所有项目共用),存在 `~/.zen-gitsync/config.json` 的 `ui.editorSidebarWidth`,刷新后自动恢复,取值夹在 140–400px |
1020
1022
  | Monaco 编辑器 | 支持 JS、TS、Vue、Python、Go、JSON、CSS 等语法高亮 |
@@ -1064,7 +1066,7 @@ Activity Bar 第四个视图,在 GUI 内直接浏览并编辑项目文件:
1064
1066
  | 结束提示 | 任务结束或报错时响一声提示音(完成 / 出错各一种音色,主动停止不响),同时页面在前台弹应用内提示、页面在后台/别的窗口发系统通知,切到别的视图也不会漏掉结果。提示音在总开关下**有自己的开关**——可以"要提示但静音",也可以反过来只要声音。音源是 CC0 资源(`public/sounds/`),换音色见同目录 `CREDITS.txt` |
1065
1067
  | 跨视图指示 | 任意任务运行中时,Activity Bar 上的工作台图标会显示脉动小圆点;切换到 Git 或编辑器视图也能看到运行状态 |
1066
1068
  | 执行日志管理(弹窗) | 顶部「执行日志」按钮唤起弹窗:列表 / 过滤 / 批量删除 / 清空 / 保留策略全部可在此一次性管理(默认保留 500 条、256 MB);弹窗关闭后任务执行视图常驻,避免切换时不必要的卸载 |
1067
- | 继续对话 | 任务进入终态(done / error / cancelled)后出现续聊输入框;发送续聊消息会用 `claude --resume <session_id>`(Claude Code)、`--session`(OpenCode)或 `codex exec resume <thread_id>`(Codex)续接上一轮会话,**新一轮 = 新 job**,多轮纵向堆叠成对话流 |
1069
+ | 继续对话 | 任务进入终态(done / error / cancelled)后出现续聊输入框;发送续聊消息会用 `claude --resume <session_id>`(Claude Code)、`--session`(OpenCode)或 `codex exec resume <thread_id>`(Codex)续接上一轮会话,**新一轮 = 新 job**,多轮纵向堆叠成对话流。续接的会话本身就带着上一轮的上下文,所以续聊轮注入的是**精简刷新版**运行环境块(当前项目 + 看板合计 + 真相源路径),不再重发整份项目清单 —— 聊天记录里也就不会每轮复制一遍同一张表 |
1068
1070
  | 本地工具检测 | 启动时 + 每 10 分钟探测 7 个 CLI(`code` / `claude` / `codex` / `opencode` / `kimi` / `zcode` / `dsh`)。未安装的工具置灰并标「未安装」,点击弹出安装引导;右键工具按钮可升级到最新已发布版本 |
1069
1071
 
1070
1072
  提示词预置与任务数据持久化到 `~/.zen-gitsync/prompts.json` 和 `~/.zen-gitsync/tasks.json`(跨项目共享);执行历史与保留策略在 `jobs.json` / `jobs-config.json`,主 Agent 控制台状态在 `orchestrator.json`(进度报告历史另存 `orchestrator-reports.json` —— 与"配置和历史分两个文件"同一个理由:被 5s 轮询的那份要小),任务附件落盘在 `~/.zen-gitsync/workbench-images/_task-<taskId>/`。
@@ -1085,7 +1087,7 @@ Activity Bar 中的机器人图标视图,可直接在浏览器中与内置 AI
1085
1087
  | 任务计划 | 多步任务有一份看得见的计划:智能体在动手之前先调内置的 `update_plan` 工具,把任务拆成 3-8 个可核对的步骤,随后逐步更新状态。步骤以清单渲染,区分完成 / 进行中 / 待办三态,标题右侧带 `2/5` 进度 —— 终端里是 `✓ / ▶ / ○` 列表,Web 面板里是一张卡片,且**工具组折叠时仍然常驻**(折叠只藏别的工具调用,绝不藏当前计划) |
1086
1088
  | 最近项目感知 | 问「我哪些项目需要 pull」时,智能体调用内置的 `list_projects` 工具,而不是自己去扫盘:返回的就是 GUI「最近项目」面板那份清单(最近目录 + 建过任务的目录,带分支 / 领先 / 落后 / 未提交数与任务进度),回答与界面对得上。领先/落后读的是本地引用,因此问到"要不要拉"时它可以带 `refresh=true` 先联网 fetch 一轮再答 |
1087
1089
  | 会话持久化 | 所有对话保存为 JSON 文件到 `~/.zen-gitsync/agent-sessions/`;CLI 智能体(`g ai`)写入同一目录,Web 端与 CLI 端会话统一管理 |
1088
- | Skill / MCP 广场 | **Skill 广场** 与 **MCP 广场** 两个 tab 列出多个来源的 Skill 与 MCP 服务,每项带说明、周下载 / 使用次数与安装状态。可安装到**当前项目**或 **`g ai` 智能体**;已安装的可在同一张卡片上卸载,还缺环境变量的会标出「还缺环境变量」。终端侧 `g ai` 用 `/skills`(`/mcp` 为别名)查看已装清单 |
1090
+ | Skill / MCP 广场 | **Skill 广场** 与 **MCP 广场** 两个 tab 列出多个来源的 Skill 与 MCP 服务,每项带说明、周下载 / 使用次数与安装状态。可安装到**当前项目**或 **`g ai` 智能体**;已安装的可在同一行「打开文件夹」定位到落盘位置,或直接卸载,还缺环境变量的会标出「还缺环境变量」。已安装清单同时显示 skill 自报的 `name` 和实际落盘的目录 id —— 仓库名和 `SKILL.md` 里自称的名字经常不是一个。终端侧 `g ai` 用 `/skills`(`/mcp` 为别名)查看已装清单 |
1089
1091
  | 克隆优先 SSH | 让它克隆仓库(或加远端)时走 SSH 形式 —— `git@github.com:owner/repo.git` / `git@gitee.com:owner/repo.git`;拿到 `https://` 地址先换算,克隆不会停在 Git Credential Manager 的账号密码弹窗上。只有 SSH 真的不可用(`Permission denied (publickey)` / 主机密钥校验失败)才退回 https,并说明这次走的是哪条。同一条偏好也会注入到每个工作台任务的 prompt —— 那里执行器是外部 CLI,系统提示词不归本应用管,环境上下文块是唯一的注入口 |
1090
1092
  | 单轮工具调用上限 | 一条消息内智能体最多连续调用多少次工具(默认 **200**,可调范围 1–2000)。在 **设置 → AI 模型配置 → 智能体运行时** 中修改;达到上限本轮会被强制结束并提示再发一条消息继续。CLI 智能体共用同一项设置 |
1091
1093
  | 预设问题 | 开场界面提供快捷按钮(查看项目结构、分析代码质量、写测试、Git 状态检查、帮我启动项目)|
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zen-gitsync",
3
- "version": "2.17.28",
3
+ "version": "2.17.29",
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",
@@ -47,6 +47,7 @@
47
47
  "verify:wb-card-reply": "node scripts/verify-wb-card-reply.cjs",
48
48
  "verify:wb-card-executor-icon": "node scripts/verify-wb-card-executor-icon.cjs",
49
49
  "verify:wb-card-opened": "node scripts/verify-wb-card-opened.cjs",
50
+ "verify:wb-list-view": "node scripts/verify-wb-list-view.cjs",
50
51
  "verify:wb-executor-models": "node scripts/verify-wb-executor-models.cjs",
51
52
  "verify:wb-task-sound": "node scripts/verify-wb-task-sound.cjs",
52
53
  "verify:wb-proj-branch": "node scripts/verify-workbench-proj-branch.cjs",
@@ -58,7 +59,9 @@
58
59
  "verify:wb-open-scroll-bottom": "node scripts/verify-workbench-open-scroll-bottom.cjs",
59
60
  "verify:editor-preview-scroll": "node scripts/verify-editor-preview-scroll.cjs",
60
61
  "verify:editor-sidebar-width": "node scripts/verify-editor-sidebar-width.cjs",
62
+ "verify:editor-disk-sync": "node scripts/verify-editor-disk-sync.cjs",
61
63
  "verify:wb-copy-folder-name": "node scripts/verify-copy-folder-name.cjs",
64
+ "verify:marketplace-panel": "node scripts/verify-marketplace-panel.cjs",
62
65
  "verify:wb-open-with-permission": "node scripts/verify-open-with-permission-menus.cjs",
63
66
  "verify:open-with-permission": "node --test test/open-with-permission.test.mjs",
64
67
  "verify:repo-list": "node scripts/verify-repo-list.cjs",
@@ -1,2 +1,2 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{$ as e,C as t,Cn as n,Dn as r,En as i,Gn as a,Hn as o,K as s,Kr as c,Mn as l,Nr as u,Pn as d,Qr as f,Rn as p,S as m,Tn as h,Yn as g,Zn as _,dr as v,or as y,q as b,qn as x,vr as S,w as C,wn as w,yn as T}from"./element-plus-D7LDHcAn.js";import{n as E,t as D}from"./_plugin-vue_export-helper-BP5VbhV0.js";import{t as O}from"./SvgIcon-Cv-Ewpj-.js";import{t as k}from"./toolsStore-C4B7BL-O.js";import{s as A,v as j}from"./index-DBOS6HZF.js";import{c as M,d as N,l as P,u as F}from"./agentConversations-CDIB8kgC.js";p(),v();function I(e,t=680){let r=S(0),i=null;function s(){let t=e.value;return t?(r.value=t.clientWidth,typeof ResizeObserver>`u`||(i=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(r.value=t)}),i.observe(t),!0)):!1}return x(()=>{s()||o(()=>s())}),a(()=>{i?.disconnect(),i=null}),{width:r,narrow:n(()=>r.value>0&&r.value<t)}}p(),v();var L=d({__name:`AgentEngineSelector`,props:{engine:{type:String,required:!0},locked:{type:Boolean,required:!1}},emits:[`select`],setup(r,{expose:i,emit:a}){i();let o=r,c=a,l=k(),u=n(()=>F(o.engine)),d=n(()=>({gai:!0,claude:l.claudeAvailable,opencode:l.opencodeAvailable,codex:l.codexAvailable})),f=S(!1),p=S(null);function h(e){if(!o.locked){if(!d.value[e]){if(!N(e))return;p.value=e,f.value=!0;return}c(`select`,e)}}let g={props:o,emit:c,toolsStore:l,engineName:u,engineAvailability:d,installDialogVisible:f,installTool:p,onCommand:h,get $t(){return E},get ElIcon(){return s},get ElDropdown(){return m},get ElDropdownMenu(){return C},get ElDropdownItem(){return t},get ArrowDown(){return b},get Check(){return e},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}});p(),u();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(e,t,n,a,o,s){return g(),r(T,null,[i(` 单根包一层:父级传下来的 class(Tab 行的 margin-left:auto、面板的 flex:none)
2
- 才能可靠落到这里 —— 多根组件会丢掉 fallthrough class。 `),w(`div`,R,[l(a.ElDropdown,{trigger:`click`,onCommand:a.onCommand},{dropdown:y(()=>[l(a.ElDropdownMenu,null,{default:y(()=>[(g(!0),r(T,null,_(a.AGENT_ENGINE_OPTIONS,e=>(g(),h(a.ElDropdownItem,{key:e.id,command:e.id},{default:y(()=>[w(`span`,V,[a.isExternalAgentEngine(e.id)?(g(),h(a.TaskExecutorIcon,{key:0,executor:e.id,class:`agent-engine__item-icon`},null,8,[`executor`])):(g(),h(a.SvgIcon,{key:1,"icon-class":a.BUILTIN_ENGINE_ICON,class:`agent-engine__item-icon`},null,8,[`icon-class`])),w(`span`,H,f(e.name),1),n.engine===e.id?(g(),h(a.ElIcon,{key:2,class:`agent-engine__item-check`},{default:y(()=>[l(a.Check)]),_:1})):a.engineAvailability[e.id]?i(`v-if`,!0):(g(),r(`span`,U,f(a.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`]))),128))]),_:1})]),default:y(()=>[w(`button`,{type:`button`,class:c([`agent-engine__btn`,{"is-locked":n.locked}]),disabled:n.locked,title:n.locked?a.$t(`@AGENT:本会话的引擎已锁定;要换引擎请新建会话`):a.$t(`@AGENT:新建会话使用的引擎`),"aria-label":a.$t(`@AGENT:智能体引擎`)},[a.isExternalAgentEngine(n.engine)?(g(),h(a.TaskExecutorIcon,{key:0,executor:n.engine,class:`agent-engine__icon`},null,8,[`executor`])):(g(),h(a.SvgIcon,{key:1,"icon-class":a.BUILTIN_ENGINE_ICON,class:`agent-engine__icon`},null,8,[`icon-class`])),w(`span`,B,f(a.engineName),1),l(a.ElIcon,{class:`agent-engine__caret`},{default:y(()=>[l(a.ArrowDown)]),_:1})],10,z)]),_:1}),l(a.ToolInstallDialog,{modelValue:a.installDialogVisible,"onUpdate:modelValue":t[0]||=e=>a.installDialogVisible=e,tool:a.installTool},null,8,[`modelValue`,`tool`])])],2112)}var G=D(L,[[`render`,W],[`__scopeId`,`data-v-c67a4d14`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AgentEngineSelector.vue`]]);export{I as n,G as t};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$ as e,C as t,Cn as n,Dn as r,En as i,Gn as a,Hn as o,K as s,Kr as c,Mn as l,Nr as u,Pn as d,Qr as f,Rn as p,S as m,Tn as h,Yn as g,Zn as _,dr as v,or as y,q as b,qn as x,vr as S,w as C,wn as w,yn as T}from"./element-plus-D0R8BMj4.js";import{n as E,t as D}from"./_plugin-vue_export-helper-BKeZSroN.js";import{t as O}from"./SvgIcon-Dk7WnZLB.js";import{t as k}from"./toolsStore-C89takm3.js";import{s as A,v as j}from"./index-CKxygqdx.js";import{c as M,d as N,l as P,u as F}from"./agentConversations-ChTc-LkQ.js";p(),v();function I(e,t=680){let r=S(0),i=null;function s(){let t=e.value;return t?(r.value=t.clientWidth,typeof ResizeObserver>`u`||(i=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(r.value=t)}),i.observe(t),!0)):!1}return x(()=>{s()||o(()=>s())}),a(()=>{i?.disconnect(),i=null}),{width:r,narrow:n(()=>r.value>0&&r.value<t)}}p(),v();var L=d({__name:`AgentEngineSelector`,props:{engine:{type:String,required:!0},locked:{type:Boolean,required:!1}},emits:[`select`],setup(r,{expose:i,emit:a}){i();let o=r,c=a,l=k(),u=n(()=>F(o.engine)),d=n(()=>({gai:!0,claude:l.claudeAvailable,opencode:l.opencodeAvailable,codex:l.codexAvailable})),f=S(!1),p=S(null);function h(e){if(!o.locked){if(!d.value[e]){if(!N(e))return;p.value=e,f.value=!0;return}c(`select`,e)}}let g={props:o,emit:c,toolsStore:l,engineName:u,engineAvailability:d,installDialogVisible:f,installTool:p,onCommand:h,get $t(){return E},get ElIcon(){return s},get ElDropdown(){return m},get ElDropdownMenu(){return C},get ElDropdownItem(){return t},get ArrowDown(){return b},get Check(){return e},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}});p(),u();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(e,t,n,a,o,s){return g(),r(T,null,[i(` 单根包一层:父级传下来的 class(Tab 行的 margin-left:auto、面板的 flex:none)
2
+ 才能可靠落到这里 —— 多根组件会丢掉 fallthrough class。 `),w(`div`,R,[l(a.ElDropdown,{trigger:`click`,onCommand:a.onCommand},{dropdown:y(()=>[l(a.ElDropdownMenu,null,{default:y(()=>[(g(!0),r(T,null,_(a.AGENT_ENGINE_OPTIONS,e=>(g(),h(a.ElDropdownItem,{key:e.id,command:e.id},{default:y(()=>[w(`span`,V,[a.isExternalAgentEngine(e.id)?(g(),h(a.TaskExecutorIcon,{key:0,executor:e.id,class:`agent-engine__item-icon`},null,8,[`executor`])):(g(),h(a.SvgIcon,{key:1,"icon-class":a.BUILTIN_ENGINE_ICON,class:`agent-engine__item-icon`},null,8,[`icon-class`])),w(`span`,H,f(e.name),1),n.engine===e.id?(g(),h(a.ElIcon,{key:2,class:`agent-engine__item-check`},{default:y(()=>[l(a.Check)]),_:1})):a.engineAvailability[e.id]?i(`v-if`,!0):(g(),r(`span`,U,f(a.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`]))),128))]),_:1})]),default:y(()=>[w(`button`,{type:`button`,class:c([`agent-engine__btn`,{"is-locked":n.locked}]),disabled:n.locked,title:n.locked?a.$t(`@AGENT:本会话的引擎已锁定;要换引擎请新建会话`):a.$t(`@AGENT:新建会话使用的引擎`),"aria-label":a.$t(`@AGENT:智能体引擎`)},[a.isExternalAgentEngine(n.engine)?(g(),h(a.TaskExecutorIcon,{key:0,executor:n.engine,class:`agent-engine__icon`},null,8,[`executor`])):(g(),h(a.SvgIcon,{key:1,"icon-class":a.BUILTIN_ENGINE_ICON,class:`agent-engine__icon`},null,8,[`icon-class`])),w(`span`,B,f(a.engineName),1),l(a.ElIcon,{class:`agent-engine__caret`},{default:y(()=>[l(a.ArrowDown)]),_:1})],10,z)]),_:1}),l(a.ToolInstallDialog,{modelValue:a.installDialogVisible,"onUpdate:modelValue":t[0]||=e=>a.installDialogVisible=e,tool:a.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 +1 @@
1
- .marketplace-panel[data-v-e9f9e851]{background:var(--bg-container);flex-direction:column;height:100%;min-height:0;display:flex}.mp-toolbar[data-v-e9f9e851]{flex-shrink:0;align-items:center;gap:12px;padding:12px 16px 8px;display:flex}.mp-search[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);max-width:420px;height:32px;transition:border-color var(--transition-fast) ease;flex:1;align-items:center;gap:6px;padding:0 10px;display:flex}.mp-search[data-v-e9f9e851]:focus-within{border-color:var(--color-primary)}.mp-search .mp-search-icon[data-v-e9f9e851]{color:var(--text-tertiary);flex-shrink:0}.mp-search .mp-search-input[data-v-e9f9e851]{color:var(--text-primary);font-size:var(--font-size-mid);background:0 0;border:none;outline:none;flex:1;font-family:inherit}.mp-search .mp-search-input[data-v-e9f9e851]::placeholder{color:var(--text-tertiary)}.mp-target[data-v-e9f9e851]{flex-shrink:0}.mp-refresh[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);width:30px;height:30px;color:var(--text-secondary);cursor:pointer;transition:var(--transition-ui-fast);justify-content:center;align-items:center;display:flex}.mp-refresh[data-v-e9f9e851]:hover{color:var(--color-primary);border-color:var(--color-primary)}.mp-refresh.spinning svg[data-v-e9f9e851]{animation:.9s linear infinite mkt-spin-e9f9e851}@keyframes mkt-spin-e9f9e851{to{transform:rotate(360deg)}}.mp-toolbar-sub[data-v-e9f9e851]{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:12px;padding:0 16px 10px;display:flex}.mp-target-hint[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-tertiary)}.mp-target-hint b[data-v-e9f9e851]{color:var(--color-primary);font-weight:600}.mp-source-filter[data-v-e9f9e851]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.mp-chip[data-v-e9f9e851]{font-size:var(--font-size-sm);border:1px solid var(--border-color);border-radius:var(--radius-xl);color:var(--text-tertiary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:2px 10px;font-family:inherit}.mp-chip[data-v-e9f9e851]:hover{color:var(--text-secondary);border-color:var(--text-tertiary)}.mp-chip.active[data-v-e9f9e851]{color:var(--color-primary);border-color:var(--color-primary);background:color-mix(in srgb, var(--color-primary) 8%, transparent)}.mp-chip.clear[data-v-e9f9e851]{color:var(--text-tertiary);border-style:dashed}.mp-body[data-v-e9f9e851]{flex:1;min-height:0;padding:0 16px 20px;overflow-y:auto}.mp-group[data-v-e9f9e851]{margin-bottom:20px}.mp-group.installed[data-v-e9f9e851]{border-top:1px dashed var(--border-color);padding-top:14px}.mp-group-header[data-v-e9f9e851]{align-items:center;gap:8px;margin-bottom:10px;display:flex}.mp-group-title[data-v-e9f9e851]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mp-group-count[data-v-e9f9e851]{min-width:20px;height:18px;font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-tertiary);justify-content:center;align-items:center;padding:0 6px;display:inline-flex}.mp-group-error[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--color-warning);align-items:center;gap:4px;display:inline-flex}.mp-group-link[data-v-e9f9e851]{color:var(--text-tertiary);transition:color var(--transition-fast) ease;display:inline-flex}.mp-group-link[data-v-e9f9e851]:hover{color:var(--color-primary)}.mp-grid[data-v-e9f9e851]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;display:grid}.mp-card[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);transition:border-color var(--transition-fast) ease, box-shadow var(--transition-fast) ease;flex-direction:column;gap:6px;padding:12px;display:flex}.mp-card[data-v-e9f9e851]:hover{border-color:color-mix(in srgb, var(--color-primary) 40%, var(--border-color));box-shadow:var(--shadow-sm)}.mp-card-head[data-v-e9f9e851]{align-items:center;gap:8px;display:flex}.mp-card-name[data-v-e9f9e851]{min-width:0;font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-weight:600;overflow:hidden}.mp-card-metric[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);flex-shrink:0;align-items:center;gap:3px;display:inline-flex}.mp-card-desc[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:36px;margin:0;line-height:1.5;display:-webkit-box;overflow:hidden}.mp-card-meta[data-v-e9f9e851]{flex-wrap:wrap;align-items:center;gap:6px;min-height:18px;display:flex}.mp-meta-pkg[data-v-e9f9e851],.mp-meta-repo[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);white-space:nowrap;text-overflow:ellipsis;max-width:220px;overflow:hidden}.mp-tag[data-v-e9f9e851]{font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-tertiary);flex-shrink:0;padding:1px 6px}.mp-tag.remote[data-v-e9f9e851]{background:color-mix(in srgb, var(--color-info,var(--action-teal)) 14%, transparent);color:var(--color-info,var(--action-teal))}.mp-tag.warn[data-v-e9f9e851]{background:color-mix(in srgb, var(--color-warning) 14%, transparent);color:var(--color-warning)}.mp-card-foot[data-v-e9f9e851]{align-items:center;gap:8px;margin-top:2px;display:flex}.mp-card-link[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);text-decoration:none}.mp-card-link[data-v-e9f9e851]:hover{color:var(--color-primary);text-decoration:underline}.mp-foot-spacer[data-v-e9f9e851]{flex:1}.mp-install-btn[data-v-e9f9e851]{font-size:var(--font-size-sm);border:1px solid var(--color-primary);border-radius:var(--radius-base);color:var(--color-primary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:4px 14px;font-family:inherit}.mp-install-btn[data-v-e9f9e851]:hover:not(:disabled){background:var(--color-primary);color:#fff}.mp-install-btn[data-v-e9f9e851]:disabled{opacity:.5;cursor:not-allowed}.mp-installed-chip[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--color-success,var(--action-emerald));align-items:center;gap:3px;display:inline-flex}.mp-not-installable[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary)}.mp-empty[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-tertiary);padding:16px 0}.mp-empty.all[data-v-e9f9e851]{text-align:center;padding:48px 0}.mp-installed-block[data-v-e9f9e851]{margin-bottom:12px}.mp-installed-target[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px;font-weight:600}.mp-installed-list[data-v-e9f9e851]{flex-direction:column;gap:4px;display:flex}.mp-installed-row[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-base);background:var(--bg-panel);align-items:center;gap:10px;padding:6px 10px;display:flex}.mp-installed-name[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-weight:500;overflow:hidden}.mp-remove-btn[data-v-e9f9e851]{font-size:var(--font-size-xs);border:1px solid var(--border-color);border-radius:var(--radius-xs);color:var(--text-tertiary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;align-items:center;gap:4px;padding:3px 10px;font-family:inherit;display:inline-flex}.mp-remove-btn[data-v-e9f9e851]:hover:not(:disabled){color:var(--color-danger);border-color:var(--color-danger)}.mp-remove-btn[data-v-e9f9e851]:disabled{opacity:.5;cursor:not-allowed}@media (prefers-reduced-motion:reduce){.mp-refresh.spinning svg[data-v-e9f9e851]{animation:none}}.mkt-form[data-v-e9f9e851]{flex-direction:column;gap:12px;display:flex}.mkt-form-name[data-v-e9f9e851]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mkt-field[data-v-e9f9e851]{flex-direction:column;gap:4px;display:flex}.mkt-field label[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:600}.mkt-field input[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-container);height:30px;color:var(--text-primary);font-size:var(--font-size-mid);transition:border-color var(--transition-fast) ease;padding:0 8px;font-family:inherit}.mkt-field input[data-v-e9f9e851]:focus{border-color:var(--color-primary);outline:none}.mkt-hint[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);margin:0}.mkt-cancel[data-v-e9f9e851],.mkt-confirm[data-v-e9f9e851]{font-size:var(--font-size-mid);border-radius:var(--radius-base);cursor:pointer;transition:var(--transition-ui-fast);padding:6px 16px;font-family:inherit}.mkt-cancel[data-v-e9f9e851]{border:1px solid var(--border-color);color:var(--text-secondary);background:0 0;margin-right:8px}.mkt-cancel[data-v-e9f9e851]:hover{color:var(--text-primary);border-color:var(--text-tertiary)}.mkt-confirm[data-v-e9f9e851]{border:1px solid var(--color-primary);background:var(--color-primary);color:#fff}.mkt-confirm[data-v-e9f9e851]:hover{opacity:.9}.agent-view[data-v-bd681ddd]{background:var(--bg-container);height:100%;min-height:0;display:flex}.agent-sidebar[data-v-bd681ddd]{background:var(--bg-panel);border-right:1px solid var(--border-color);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.agent-conversations[data-v-bd681ddd]{flex:1;min-height:0;padding:10px 6px 8px 12px}.sidebar-resizer[data-v-bd681ddd]{cursor:col-resize;width:4px;transition:background var(--transition-fast) ease;background:0 0;flex-shrink:0}.sidebar-resizer[data-v-bd681ddd]:hover,.sidebar-resizer.active[data-v-bd681ddd]{background:var(--color-primary);opacity:.3}.agent-chat-area[data-v-bd681ddd]{flex-direction:column;flex:1;min-width:0;display:flex;position:relative;overflow:hidden}.agent-engine[data-v-bd681ddd]{margin-bottom:7px;margin-left:auto}.agent-tabs[data-v-bd681ddd]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:4px;padding:8px 12px 0;display:flex}.agent-tab[data-v-bd681ddd]{color:var(--text-tertiary);font-size:var(--font-size-mid);cursor:pointer;transition:color var(--transition-fast) ease, border-color var(--transition-fast) ease, background var(--transition-fast) ease;border-radius:var(--radius-base) var(--radius-base) 0 0;background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:7px 14px 9px;font-family:inherit;display:inline-flex}.agent-tab[data-v-bd681ddd]:hover{color:var(--text-secondary);background:var(--bg-hover)}.agent-tab.active[data-v-bd681ddd]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:600}.agent-tab-body[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-pane[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.agent-tab-body[data-v-bd681ddd]>.marketplace-panel{flex:1;min-height:0}.chat-loading[data-v-bd681ddd]{color:var(--text-tertiary);font-size:var(--font-size-base);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}.agent-list-page[data-v-bd681ddd]{background:var(--bg-panel);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-list-page .agent-conversations[data-v-bd681ddd]{padding:12px 12px 10px 14px}.agent-page-bar[data-v-bd681ddd]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 12px 0 6px;display:flex}.agent-page-back[data-v-bd681ddd]{border-radius:var(--radius-xs);width:24px;height:24px;color:var(--text-tertiary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.agent-page-back[data-v-bd681ddd]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-page-title[data-v-bd681ddd]{min-width:0;font-size:var(--font-size-mid);color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.agent-chat-host[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-host[data-v-bd681ddd] .acu-avatar--left{background:0 0}.agent-chat-host[data-v-bd681ddd] .acu-welcome-logo{background:var(--welcome-avatar) center/46px 46px no-repeat;width:56px;height:56px;box-shadow:none}.agent-chat-host[data-v-bd681ddd] .acu-welcome-logo>svg{display:none}.agent-chat-host[data-v-bd681ddd] .acu-welcome-grid{flex-wrap:wrap;display:flex}.agent-chat-host[data-v-bd681ddd] .acu-welcome-grid>.acu-preset-q{flex:260px;min-width:0}[data-theme=dark]{background:var(--bg-panel)}
1
+ .marketplace-panel[data-v-e9f9e851]{background:var(--bg-container);flex-direction:column;height:100%;min-height:0;display:flex}.mp-toolbar[data-v-e9f9e851]{flex-shrink:0;align-items:center;gap:12px;padding:12px 16px 8px;display:flex}.mp-search[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);max-width:420px;height:32px;transition:border-color var(--transition-fast) ease;flex:1;align-items:center;gap:6px;padding:0 10px;display:flex}.mp-search[data-v-e9f9e851]:focus-within{border-color:var(--color-primary)}.mp-search .mp-search-icon[data-v-e9f9e851]{color:var(--text-tertiary);flex-shrink:0}.mp-search .mp-search-input[data-v-e9f9e851]{color:var(--text-primary);font-size:var(--font-size-mid);background:0 0;border:none;outline:none;flex:1;font-family:inherit}.mp-search .mp-search-input[data-v-e9f9e851]::placeholder{color:var(--text-tertiary)}.mp-target[data-v-e9f9e851]{flex-shrink:0}.mp-refresh[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);width:30px;height:30px;color:var(--text-secondary);cursor:pointer;transition:var(--transition-ui-fast);justify-content:center;align-items:center;display:flex}.mp-refresh[data-v-e9f9e851]:hover{color:var(--color-primary);border-color:var(--color-primary)}.mp-refresh.spinning svg[data-v-e9f9e851]{animation:.9s linear infinite mkt-spin-e9f9e851}@keyframes mkt-spin-e9f9e851{to{transform:rotate(360deg)}}.mp-toolbar-sub[data-v-e9f9e851]{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:12px;padding:0 16px 10px;display:flex}.mp-target-hint[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-tertiary)}.mp-target-hint b[data-v-e9f9e851]{color:var(--color-primary);font-weight:600}.mp-source-filter[data-v-e9f9e851]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.mp-chip[data-v-e9f9e851]{font-size:var(--font-size-sm);border:1px solid var(--border-color);border-radius:var(--radius-xl);color:var(--text-tertiary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:2px 10px;font-family:inherit}.mp-chip[data-v-e9f9e851]:hover{color:var(--text-secondary);border-color:var(--text-tertiary)}.mp-chip.active[data-v-e9f9e851]{color:var(--color-primary);border-color:var(--color-primary);background:color-mix(in srgb, var(--color-primary) 8%, transparent)}.mp-chip.clear[data-v-e9f9e851]{color:var(--text-tertiary);border-style:dashed}.mp-body[data-v-e9f9e851]{flex:1;min-height:0;padding:0 16px 20px;overflow-y:auto}.mp-group[data-v-e9f9e851]{margin-bottom:20px}.mp-group.installed[data-v-e9f9e851]{border-top:1px dashed var(--border-color);padding-top:14px}.mp-group-header[data-v-e9f9e851]{align-items:center;gap:8px;margin-bottom:10px;display:flex}.mp-group-title[data-v-e9f9e851]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mp-group-count[data-v-e9f9e851]{min-width:20px;height:18px;font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-tertiary);justify-content:center;align-items:center;padding:0 6px;display:inline-flex}.mp-group-error[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--color-warning);align-items:center;gap:4px;display:inline-flex}.mp-group-link[data-v-e9f9e851]{color:var(--text-tertiary);transition:color var(--transition-fast) ease;display:inline-flex}.mp-group-link[data-v-e9f9e851]:hover{color:var(--color-primary)}.mp-grid[data-v-e9f9e851]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;display:grid}.mp-card[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);transition:border-color var(--transition-fast) ease, box-shadow var(--transition-fast) ease;flex-direction:column;gap:6px;padding:12px;display:flex}.mp-card[data-v-e9f9e851]:hover{border-color:color-mix(in srgb, var(--color-primary) 40%, var(--border-color));box-shadow:var(--shadow-sm)}.mp-card-head[data-v-e9f9e851]{align-items:center;gap:8px;display:flex}.mp-card-name[data-v-e9f9e851]{min-width:0;font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-weight:600;overflow:hidden}.mp-card-metric[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);flex-shrink:0;align-items:center;gap:3px;display:inline-flex}.mp-card-desc[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:36px;margin:0;line-height:1.5;display:-webkit-box;overflow:hidden}.mp-card-meta[data-v-e9f9e851]{flex-wrap:wrap;align-items:center;gap:6px;min-height:18px;display:flex}.mp-meta-pkg[data-v-e9f9e851],.mp-meta-repo[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);white-space:nowrap;text-overflow:ellipsis;max-width:220px;overflow:hidden}.mp-tag[data-v-e9f9e851]{font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-tertiary);flex-shrink:0;padding:1px 6px}.mp-tag.remote[data-v-e9f9e851]{background:color-mix(in srgb, var(--color-info,var(--action-teal)) 14%, transparent);color:var(--color-info,var(--action-teal))}.mp-tag.warn[data-v-e9f9e851]{background:color-mix(in srgb, var(--color-warning) 14%, transparent);color:var(--color-warning)}.mp-card-foot[data-v-e9f9e851]{align-items:center;gap:8px;margin-top:2px;display:flex}.mp-card-link[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);text-decoration:none}.mp-card-link[data-v-e9f9e851]:hover{color:var(--color-primary);text-decoration:underline}.mp-foot-spacer[data-v-e9f9e851]{flex:1}.mp-install-btn[data-v-e9f9e851]{font-size:var(--font-size-sm);border:1px solid var(--color-primary);border-radius:var(--radius-base);color:var(--color-primary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:4px 14px;font-family:inherit}.mp-install-btn[data-v-e9f9e851]:hover:not(:disabled){background:var(--color-primary);color:#fff}.mp-install-btn[data-v-e9f9e851]:disabled{opacity:.5;cursor:not-allowed}.mp-installed-chip[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--color-success,var(--action-emerald));align-items:center;gap:3px;display:inline-flex}.mp-not-installable[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary)}.mp-empty[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-tertiary);padding:16px 0}.mp-empty.all[data-v-e9f9e851]{text-align:center;padding:48px 0}.mp-installed-block[data-v-e9f9e851]{margin-bottom:12px}.mp-installed-target[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px;font-weight:600}.mp-installed-list[data-v-e9f9e851]{flex-direction:column;gap:4px;display:flex}.mp-installed-row[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-base);background:var(--bg-panel);align-items:center;gap:10px;padding:6px 10px;display:flex}.mp-installed-name[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:500;overflow:hidden}.mp-installed-id[data-v-e9f9e851]{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-tertiary);white-space:nowrap;text-overflow:ellipsis;max-width:40%;overflow:hidden}.mp-reveal-btn[data-v-e9f9e851],.mp-remove-btn[data-v-e9f9e851]{font-size:var(--font-size-xs);border:1px solid var(--border-color);border-radius:var(--radius-xs);color:var(--text-tertiary);cursor:pointer;white-space:nowrap;transition:var(--transition-ui-fast);background:0 0;align-items:center;gap:4px;padding:3px 10px;font-family:inherit;display:inline-flex}.mp-reveal-btn[data-v-e9f9e851]:disabled,.mp-remove-btn[data-v-e9f9e851]:disabled{opacity:.5;cursor:not-allowed}.mp-reveal-btn[data-v-e9f9e851]:hover:not(:disabled){color:var(--text-primary);border-color:var(--text-tertiary)}.mp-remove-btn[data-v-e9f9e851]:hover:not(:disabled){color:var(--color-danger);border-color:var(--color-danger)}@media (prefers-reduced-motion:reduce){.mp-refresh.spinning svg[data-v-e9f9e851]{animation:none}}.mkt-form[data-v-e9f9e851]{flex-direction:column;gap:12px;display:flex}.mkt-form-name[data-v-e9f9e851]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mkt-field[data-v-e9f9e851]{flex-direction:column;gap:4px;display:flex}.mkt-field label[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:600}.mkt-field input[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-container);height:30px;color:var(--text-primary);font-size:var(--font-size-mid);transition:border-color var(--transition-fast) ease;padding:0 8px;font-family:inherit}.mkt-field input[data-v-e9f9e851]:focus{border-color:var(--color-primary);outline:none}.mkt-hint[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);margin:0}.mkt-cancel[data-v-e9f9e851],.mkt-confirm[data-v-e9f9e851]{font-size:var(--font-size-mid);border-radius:var(--radius-base);cursor:pointer;transition:var(--transition-ui-fast);padding:6px 16px;font-family:inherit}.mkt-cancel[data-v-e9f9e851]{border:1px solid var(--border-color);color:var(--text-secondary);background:0 0;margin-right:8px}.mkt-cancel[data-v-e9f9e851]:hover{color:var(--text-primary);border-color:var(--text-tertiary)}.mkt-confirm[data-v-e9f9e851]{border:1px solid var(--color-primary);background:var(--color-primary);color:#fff}.mkt-confirm[data-v-e9f9e851]:hover{opacity:.9}.agent-view[data-v-bd681ddd]{background:var(--bg-container);height:100%;min-height:0;display:flex}.agent-sidebar[data-v-bd681ddd]{background:var(--bg-panel);border-right:1px solid var(--border-color);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.agent-conversations[data-v-bd681ddd]{flex:1;min-height:0;padding:10px 6px 8px 12px}.sidebar-resizer[data-v-bd681ddd]{cursor:col-resize;width:4px;transition:background var(--transition-fast) ease;background:0 0;flex-shrink:0}.sidebar-resizer[data-v-bd681ddd]:hover,.sidebar-resizer.active[data-v-bd681ddd]{background:var(--color-primary);opacity:.3}.agent-chat-area[data-v-bd681ddd]{flex-direction:column;flex:1;min-width:0;display:flex;position:relative;overflow:hidden}.agent-engine[data-v-bd681ddd]{margin-bottom:7px;margin-left:auto}.agent-tabs[data-v-bd681ddd]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:4px;padding:8px 12px 0;display:flex}.agent-tab[data-v-bd681ddd]{color:var(--text-tertiary);font-size:var(--font-size-mid);cursor:pointer;transition:color var(--transition-fast) ease, border-color var(--transition-fast) ease, background var(--transition-fast) ease;border-radius:var(--radius-base) var(--radius-base) 0 0;background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:7px 14px 9px;font-family:inherit;display:inline-flex}.agent-tab[data-v-bd681ddd]:hover{color:var(--text-secondary);background:var(--bg-hover)}.agent-tab.active[data-v-bd681ddd]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:600}.agent-tab-body[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-pane[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.agent-tab-body[data-v-bd681ddd]>.marketplace-panel{flex:1;min-height:0}.chat-loading[data-v-bd681ddd]{color:var(--text-tertiary);font-size:var(--font-size-base);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}.agent-list-page[data-v-bd681ddd]{background:var(--bg-panel);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-list-page .agent-conversations[data-v-bd681ddd]{padding:12px 12px 10px 14px}.agent-page-bar[data-v-bd681ddd]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 12px 0 6px;display:flex}.agent-page-back[data-v-bd681ddd]{border-radius:var(--radius-xs);width:24px;height:24px;color:var(--text-tertiary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.agent-page-back[data-v-bd681ddd]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-page-title[data-v-bd681ddd]{min-width:0;font-size:var(--font-size-mid);color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.agent-chat-host[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-host[data-v-bd681ddd] .acu-avatar--left{background:0 0}.agent-chat-host[data-v-bd681ddd] .acu-welcome-logo{background:var(--welcome-avatar) center/46px 46px no-repeat;width:56px;height:56px;box-shadow:none}.agent-chat-host[data-v-bd681ddd] .acu-welcome-logo>svg{display:none}.agent-chat-host[data-v-bd681ddd] .acu-welcome-grid{flex-wrap:wrap;display:flex}.agent-chat-host[data-v-bd681ddd] .acu-welcome-grid>.acu-preset-q{flex:260px;min-width:0}[data-theme=dark]{background:var(--bg-panel)}
@@ -0,0 +1,11 @@
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$ as e,A as t,Bt as n,Cn as r,Ct as i,Dn as a,Dt as o,En as s,H as c,Hn as l,Jr as u,K as d,Kr as f,Mn as p,Nr as m,Ot as h,Pn as g,Q as _,Qr as v,Rn as y,Tn as b,Ut as x,Yn as S,Zn as C,a as w,at as T,dr as E,er as D,ft as O,gr as k,hn as A,i as j,ir as M,j as N,jn as P,ln as F,o as I,or as L,qt as ee,rn as te,sr as R,st as z,vr as B,wn as V,xt as H,yn as U}from"./element-plus-D0R8BMj4.js";import{o as W,s as G}from"./vendor-CCrjQw5C.js";import{n as K,t as q}from"./_plugin-vue_export-helper-BKeZSroN.js";import{t as J}from"./configStore-fJaic3kE.js";import{t as ne}from"./CommonDialog-DpFTO5cg.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-ChTc-LkQ.js";import{n as ue,t as de}from"./AgentEngineSelector-Wl7dKYKL.js";y(),E();var fe=g({__name:`MarketplacePanel`,props:{type:{type:String,required:!0}},setup(t,{expose:i}){i();let a=t,s=J(),c=B([]),l=B([]),u=B(!1),d=B(``),f=B(``),p=B([]),m=B(`project`),h=B(new Set),g=B(new Set),_=B(new Set),v=r(()=>s.currentDirectory||``),y=null;async function b(){if(!u.value){u.value=!0;try{let e=new URLSearchParams({type:a.type,cwd:v.value});f.value&&e.set(`q`,f.value),p.value.length&&e.set(`sources`,p.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();t?.success?(c.value=t.groups||[],l.value=t.installed||[]):w.error(t?.error||K(`@MKT:加载失败`))}catch{w.error(K(`@MKT:加载失败`))}finally{u.value=!1}}}M(d,e=>{y&&clearTimeout(y),y=setTimeout(()=>{f.value=e.trim(),b()},400)}),M(p,()=>b()),M(()=>a.type,()=>{p.value=[],f.value=``,d.value=``,b()}),M(v,()=>b()),b();let S=r(()=>{let e=v.value?v.value.split(/[\\/]/).filter(Boolean).pop():``;return m.value===`project`?e||K(`@MKT:当前项目`):K(`@MKT:g ai 智能体`)});function C(e){return e.stars?`${T(e.stars)} ★`:e.downloads?`${T(e.downloads)} ${K(`@MKT:周下载`)}`:e.uses?`${T(e.uses)} ${K(`@MKT:次使用`)}`:``}function T(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function E(e){return`${e.id}`}function D(e){return h.value.has(E(e))}let A=r(()=>{let e={project:[],global:[]};for(let t of l.value)(e[t.target]||=[]).push(t);return e}),N=k({visible:!1,item:null,env:{},args:``});function P(e){return a.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function F(e){N.item=e,N.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),N.args=(e.args||[]).join(` `),N.visible=!0}function I(){let e=N.item;if(N.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(N.env).filter(([,e])=>e.trim()!==``)),n=N.args.trim()?N.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;R(e,{env:t,...n?{args:n}:{}})}async function L(e){if(!e.installed||await V(e)){if(P(e)){F(e);return}await R(e,{})}}async function R(e,t){let n=E(e);h.value.add(n);try{let n=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:a.type,target:m.value,cwd:v.value,item:{...e,...t}})}),r=await n.json().catch(()=>null);if(!n.ok||!r?.success){w.error(r?.error||K(`@MKT:安装失败`));return}r.item?.warning&&w.warning(r.item.warning),r.item?.envKeys?.length?w.warning(`${K(`@MKT:还缺环境变量`)}: ${r.item.envKeys.join(`, `)}`):w.success(K(`@MKT:安装成功`)),await b()}catch{w.error(K(`@MKT:安装失败`))}finally{h.value.delete(n)}}async function V(e){try{return await j.confirm(`${e.name} ${K(`@MKT:已安装,要重新安装吗?`)}`,K(`@MKT:重新安装`),{confirmButtonText:K(`@MKT:重装`),cancelButtonText:K(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function U(e){let t=`${e.target}:${e.id}`;_.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:a.type,target:e.target,cwd:v.value,id:e.id})}),n=await t.json().catch(()=>null);(!t.ok||!n?.success)&&w.error(n?.error||K(`@MKT:打开失败`))}catch{w.error(K(`@MKT:打开失败`))}finally{_.value.delete(t)}}async function W(e){try{await j.confirm(`${K(`@MKT:确定卸载`)} ${e.name}?`,K(`@MKT:卸载`),{confirmButtonText:K(`@MKT:卸载`),cancelButtonText:K(`@MKT:取消`),type:`warning`})}catch{return}let t=`${e.target}:${e.id}`;g.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:v.value}),n=await fetch(`/api/agent/marketplace/item/${a.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),r=await n.json().catch(()=>null);if(!n.ok||!r?.success){w.error(r?.error||K(`@MKT:卸载失败`));return}w.success(K(`@MKT:已卸载`)),await b()}catch{w.error(K(`@MKT:卸载失败`))}finally{g.value.delete(t)}}let G={props:a,configStore:s,groups:c,installed:l,loading:u,searchInput:d,query:f,selectedSources:p,installTarget:m,installing:h,removing:g,revealing:_,cwd:v,get searchTimer(){return y},set searchTimer(e){y=e},loadCatalog:b,targetLabel:S,metricText:C,formatCount:T,cardKey:E,isBusy:D,installedByTarget:A,configDialog:N,needsConfig:P,openConfigDialog:F,confirmConfig:I,onInstall:L,doInstall:R,confirmReinstall:V,onReveal:U,onRemove:W,get $t(){return K},get Search(){return x},get Refresh(){return n},get Delete(){return z},get Link(){return o},get Check(){return e},get Star(){return ee},get Download(){return O},get Warning(){return te},get FolderOpened(){return H},CommonDialog:ne};return Object.defineProperty(G,"__isScriptSetup",{enumerable:!1,value:!0}),G}});y(),F(),m();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(e,n,r,i,o,l){let u=d,m=t,h=N,g=c,_=I;return S(),a(`div`,pe,[s(` ── 工具栏 ───────────────────────────────── `),V(`div`,Y,[V(`div`,X,[p(u,{class:`mp-search-icon`},{default:L(()=>[p(i.Search)]),_:1}),R(V(`input`,{"onUpdate:modelValue":n[0]||=e=>i.searchInput=e,class:`mp-search-input`,type:`text`,placeholder:r.type===`skill`?i.$t(`@MKT:搜索 Skill...`):i.$t(`@MKT:搜索 MCP 服务...`)},null,8,me),[[A,i.searchInput]])]),p(h,{modelValue:i.installTarget,"onUpdate:modelValue":n[1]||=e=>i.installTarget=e,size:`small`,class:`mp-target`},{default:L(()=>[p(m,{value:`project`},{default:L(()=>[P(v(i.$t(`@MKT:当前项目`)),1)]),_:1}),p(m,{value:`global`},{default:L(()=>[P(v(i.$t(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),p(g,{content:i.$t(`@MKT:刷新`),placement:`top`,"show-after":300},{default:L(()=>[V(`button`,{class:f([`mp-refresh`,{spinning:i.loading}]),onClick:i.loadCatalog},[p(u,null,{default:L(()=>[p(i.Refresh)]),_:1})],2)]),_:1},8,[`content`])]),V(`div`,he,[V(`span`,Z,[P(v(i.$t(`@MKT:安装到`))+` `,1),V(`b`,null,v(i.targetLabel),1)]),V(`div`,Q,[(S(!0),a(U,null,C(i.groups,e=>(S(),a(`button`,{key:e.id,class:f([`mp-chip`,{active:i.selectedSources.includes(e.id)}]),onClick:()=>{let t=i.selectedSources.indexOf(e.id);t>=0?i.selectedSources.splice(t,1):i.selectedSources.push(e.id)}},v(e.label),11,ge))),128)),i.selectedSources.length?(S(),a(`button`,{key:0,class:`mp-chip clear`,onClick:n[2]||=e=>i.selectedSources=[]},v(i.$t(`@MKT:全部来源`)),1)):s(`v-if`,!0)])]),s(` ── 内容 ─────────────────────────────────── `),R((S(),a(`div`,$,[(S(!0),a(U,null,C(i.groups,e=>(S(),a(`section`,{key:e.id,class:`mp-group`},[V(`header`,_e,[V(`h3`,ve,v(e.label),1),e.status===`ok`?(S(),a(`span`,ye,v(e.items.length),1)):(S(),a(`span`,be,[p(u,null,{default:L(()=>[p(i.Warning)]),_:1}),P(` `+v(e.error||i.$t(`@MKT:来源不可用`)),1)])),e.homepage?(S(),a(`a`,{key:2,class:`mp-group-link`,href:e.homepage,target:`_blank`,rel:`noopener noreferrer`,title:e.homepage},[p(u,null,{default:L(()=>[p(i.Link)]),_:1})],8,xe)):s(`v-if`,!0)]),e.status===`ok`&&e.items.length?(S(),a(`div`,Se,[(S(!0),a(U,null,C(e.items,e=>(S(),a(`article`,{key:i.cardKey(e),class:`mp-card`},[V(`div`,Ce,[V(`span`,{class:`mp-card-name`,title:e.name},v(e.name),9,we),i.metricText(e)?(S(),a(`span`,Te,[p(u,null,{default:L(()=>[e.stars?(S(),b(i.Star,{key:0})):(S(),b(i.Download,{key:1}))]),_:2},1024),P(` `+v(i.metricText(e)),1)])):s(`v-if`,!0)]),V(`p`,{class:`mp-card-desc`,title:e.description},v(e.description||i.$t(`@MKT:暂无描述`)),9,Ee),V(`div`,De,[e.package?(S(),a(`code`,{key:0,class:`mp-meta-pkg`,title:e.package},v(e.package),9,Oe)):e.repository?(S(),a(`span`,{key:1,class:`mp-meta-repo`,title:e.repository+(e.subpath?` · `+e.subpath:``)},[P(v(e.repository),1),e.subpath?(S(),a(U,{key:0},[P(` · `+v(e.subpath),1)],64)):s(`v-if`,!0)],8,ke)):s(`v-if`,!0),e.transport===`remote`?(S(),a(`span`,Ae,v(i.$t(`@MKT:远程服务`)),1)):s(`v-if`,!0),(S(!0),a(U,null,C((e.tags||[]).slice(0,2),e=>(S(),a(`span`,{key:e,class:`mp-tag`},v(e),1))),128))]),V(`div`,je,[e.upstream?(S(),a(`a`,{key:0,class:`mp-card-link`,href:e.upstream,target:`_blank`,rel:`noopener noreferrer`},v(i.$t(`@MKT:查看来源`)),9,Me)):s(`v-if`,!0),n[6]||=V(`span`,{class:`mp-foot-spacer`},null,-1),e.installed?(S(),a(`span`,Ne,[p(u,null,{default:L(()=>[p(i.Check)]),_:1}),P(v(i.$t(`@MKT:已安装`)),1)])):e.installable===!1?(S(),a(`span`,Fe,v(i.$t(`@MKT:暂不支持一键安装`)),1)):(S(),a(`button`,{key:2,class:`mp-install-btn`,disabled:i.isBusy(e),onClick:t=>i.onInstall(e)},v(i.isBusy(e)?i.$t(`@MKT:安装中...`):i.$t(`@MKT:安装`)),9,Pe))])]))),128))])):e.status===`ok`?(S(),a(`div`,Ie,v(i.$t(`@MKT:该来源暂无结果`)),1)):s(`v-if`,!0)]))),128)),s(` ── 已安装 ─────────────────────────────── `),i.installed.length?(S(),a(`section`,Le,[V(`header`,Re,[V(`h3`,ze,v(i.$t(`@MKT:已安装`)),1),V(`span`,Be,v(i.installed.length),1)]),(S(),a(U,null,C([`project`,`global`],e=>V(`div`,{key:e},[i.installedByTarget[e]?.length?(S(),a(`div`,Ve,[V(`div`,He,v(e===`project`?i.$t(`@MKT:当前项目`):i.$t(`@MKT:g ai 智能体`)),1),V(`div`,Ue,[(S(!0),a(U,null,C(i.installedByTarget[e],t=>(S(),a(`div`,{key:e+t.id,class:`mp-installed-row`},[V(`span`,{class:`mp-installed-name`,title:t.name},v(t.name),9,We),s(` 实际落盘的标识:SKILL.md 里的 name 常与仓库名不同(如仓库 taste-skill
2
+ 里的 skill 自称 brandkit),不显示这个用户就对不上广场卡片上的名字 `),t.id&&t.id!==t.name?(S(),a(`code`,{key:0,class:`mp-installed-id`,title:t.dir||t.file||t.id},v(t.id),9,Ge)):s(`v-if`,!0),t.package?(S(),a(`code`,Ke,v(t.package),1)):s(`v-if`,!0),t.requiredEnv?.length?(S(),a(`span`,qe,v(i.$t(`@MKT:待配置`))+`: `+v(t.requiredEnv.join(`, `)),1)):s(`v-if`,!0),n[7]||=V(`span`,{class:`mp-foot-spacer`},null,-1),V(`button`,{class:`mp-reveal-btn`,disabled:i.revealing.has(e+t.id),title:t.dir||t.file||``,onClick:e=>i.onReveal(t)},[p(u,null,{default:L(()=>[p(i.FolderOpened)]),_:1}),P(` `+v(i.$t(`@MKT:打开文件夹`)),1)],8,Je),V(`button`,{class:`mp-remove-btn`,disabled:i.removing.has(e+t.id),onClick:e=>i.onRemove(t)},[p(u,null,{default:L(()=>[p(i.Delete)]),_:1}),P(` `+v(i.removing.has(e+t.id)?i.$t(`@MKT:卸载中...`):i.$t(`@MKT:卸载`)),1)],8,Ye)]))),128))])])):s(`v-if`,!0)])),64))])):s(`v-if`,!0),!i.loading&&!i.groups.length?(S(),a(`div`,Xe,v(i.$t(`@MKT:加载失败`)),1)):s(`v-if`,!0)])),[[_,i.loading]]),s(` ── MCP 安装前配置 ───────────────────────── `),p(i.CommonDialog,{modelValue:i.configDialog.visible,"onUpdate:modelValue":n[5]||=e=>i.configDialog.visible=e,title:i.$t(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:L(()=>[V(`button`,{class:`mkt-cancel`,onClick:n[4]||=e=>i.configDialog.visible=!1},v(i.$t(`@MKT:取消`)),1),V(`button`,{class:`mkt-confirm`,onClick:i.confirmConfig},v(i.$t(`@MKT:安装`)),1)]),default:L(()=>[i.configDialog.item?(S(),a(`div`,Ze,[V(`p`,Qe,v(i.configDialog.item.name),1),(S(!0),a(U,null,C(Object.keys(i.configDialog.env),e=>(S(),a(`div`,{key:e,class:`mkt-field`},[V(`label`,null,v(e),1),R(V(`input`,{"onUpdate:modelValue":t=>i.configDialog.env[e]=t,type:`text`,autocomplete:`off`,placeholder:i.$t(`@MKT:环境变量值`),spellcheck:`false`},null,8,$e),[[A,i.configDialog.env[e]]])]))),128)),i.configDialog.item.args?.length?(S(),a(`div`,et,[V(`label`,null,v(i.$t(`@MKT:启动参数`)),1),R(V(`input`,{"onUpdate:modelValue":n[3]||=e=>i.configDialog.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[A,i.configDialog.args]]),V(`p`,tt,v(i.$t(`@MKT:参数提示`)),1)])):s(`v-if`,!0)])):s(`v-if`,!0)]),_:1},8,[`modelValue`,`title`])])}var rt=q(fe,[[`render`,nt],[`__scopeId`,`data-v-e9f9e851`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/MarketplacePanel.vue`]]);y(),E();var it=g({__name:`AgentView`,setup(e,{expose:t}){t();let n=J(),a=B(null),{narrow:o}=ue(a),s=B(`chat`),c=B(`chat`),u=r(()=>c.value===`mcp`?`mcp`:`skill`),f=r(()=>[{id:`chat`,label:K(`@AGENT:对话`),icon:_},{id:`skill`,label:K(`@AGENT:Skill 广场`),icon:i},{id:`mcp`,label:K(`@AGENT:MCP 广场`),icon:T}]),{sessions:p,sessionsLoading:m,currentSessionId:g,messages:v,isStreaming:y,sessionLoading:b,loadSessions:x,loadSession:S,deleteSession:C,renameSession:w,newSession:E,sendMessage:D,pendingQuestion:O,answeringQuestion:k,answerQuestion:A,isSessionGenerating:j,currentEngine:N,pendingEngine:P,isEngineLocked:F,pickEngine:I,stop:L}=ce(),ee=r(()=>F.value?N.value:P.value);function te(e){F.value||I(e)}let R=r(()=>{let e=n.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),z=r(()=>re(p.value,j)),V=se(),H=r(()=>z.value.find(e=>e.id===g.value)?.title||K(`@AGENT:对话`)),U={"--welcome-avatar":`url("${le}")`},q=r(()=>[{id:`p1`,label:K(`@AGENT:查看项目结构`),prompt:K(`@AGENT:prompt_p1`)},{id:`p2`,label:K(`@AGENT:分析代码质量`),prompt:K(`@AGENT:prompt_p2`)},{id:`p3`,label:K(`@AGENT:帮我写测试`),prompt:K(`@AGENT:prompt_p3`)},{id:`p4`,label:K(`@AGENT:Git 状态检查`),prompt:K(`@AGENT:prompt_p4`)},{id:`p5`,label:K(`@AGENT:帮我启动项目`),prompt:K(`@AGENT:prompt_p5`)}]);async function ne(e){await D(e.text,e.files),await l(),X()}async function fe(e){await D(e.prompt),await l(),X()}let pe=ie(),Y=B(null);function X(e=!0){Y.value?.scrollToBottom(e)}M(()=>v.value.length,()=>{l(()=>X(!1))});function me(e){S(e),s.value=`chat`}function he(){E(),s.value=`chat`}let Z=B(280),Q=B(!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)}M(o,e=>{e||(s.value=`chat`)}),M(()=>[n.currentDirectory,y.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await x(),g.value&&!y.value&&!p.value.some(e=>e.sessionId===g.value)&&E()},{immediate:!0});let $={configStore:n,rootRef:a,narrow:o,chatPage:s,activeTab:c,marketplaceType:u,tabs:f,sessions:p,sessionsLoading:m,currentSessionId:g,messages:v,isStreaming:y,sessionLoading:b,loadSessions:x,loadSession:S,deleteSession:C,renameSession:w,newSession:E,sendMessage:D,pendingQuestion:O,answeringQuestion:k,answerQuestion:A,isSessionGenerating:j,currentEngine:N,pendingEngine:P,isEngineLocked:F,pickEngine:I,stop:L,displayEngine:ee,handleEngineSelect:te,chatTheme:R,conversationItems:z,conversationLabels:V,currentSessionTitle:H,welcomeAvatarStyle:U,presetQuestions:q,onSend:ne,onSelectPreset:fe,questionLabels:pe,chatContainerRef:Y,scrollToBottom:X,selectSession:me,handleNewSession:he,sidebarWidth:Z,isResizing:Q,startResize:ge,get $t(){return K},get ElIcon(){return d},get Loading(){return h},get ChatContainer(){return G},get ConversationList(){return W},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}),$}});y(),m();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(e,t,n,r,i,o){return S(),a(`div`,at,[s(` ═══ 宽屏:左侧会话列表(只在「对话」Tab 显示)═══
3
+ 窄屏时这一整块不渲染,会话列表改成 body 里的一个整页(见 .agent-list-page) `),r.activeTab===`chat`&&!r.narrow?(S(),a(U,{key:0},[V(`aside`,{class:`agent-sidebar`,style:u({width:r.sidebarWidth+`px`})},[s(` 会话列表:UI 与交互都在组件库的 ConversationList 里 `),p(r.ConversationList,{class:`agent-conversations`,items:r.conversationItems,"active-id":r.currentSessionId,loading:r.sessionsLoading,labels:r.conversationLabels,onSelect:r.selectSession,onNew:r.handleNewSession,onRename:r.renameSession,onDelete:r.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])],4),s(` 拖拽分隔条 `),V(`div`,{class:f([`sidebar-resizer`,{active:r.isResizing}]),onMousedown:r.startResize},null,34)],64)):s(`v-if`,!0),s(` ═══ 右侧:Tab 栏 + 内容区 ═══ `),V(`main`,ot,[V(`nav`,st,[(S(!0),a(U,null,C(r.tabs,e=>(S(),a(`button`,{key:e.id,type:`button`,class:f([`agent-tab`,{active:r.activeTab===e.id}]),role:`tab`,"aria-selected":r.activeTab===e.id,onClick:t=>r.activeTab=e.id},[p(r.ElIcon,null,{default:L(()=>[(S(),b(D(e.icon)))]),_:2},1024),V(`span`,null,v(e.label),1)],10,ct))),128)),s(` ═══ 引擎选择器 ═══
4
+ 与工作台执行器下拉同一套交互(点击展开、未安装标出来、点了直接开安装弹窗)。
5
+ 下拉本体收口在 AgentEngineSelector,文件空间 g ai 面板复用同一份实现。
6
+ 会话一旦落盘就置灰:引擎在会话建立时锁定(三家续聊标识互不通用),要换请新建。 `),r.activeTab===`chat`?(S(),b(r.AgentEngineSelector,{key:0,class:`agent-engine`,engine:r.displayEngine,locked:r.isEngineLocked,onSelect:r.handleEngineSelect},null,8,[`engine`,`locked`])):s(`v-if`,!0)]),V(`div`,lt,[s(` ── 对话 ── `),r.activeTab===`chat`?(S(),a(`div`,ut,[s(` 窄屏 · 会话列表页:列表独占整页 `),r.narrow&&r.chatPage===`list`?(S(),a(`div`,dt,[p(r.ConversationList,{class:`agent-conversations`,items:r.conversationItems,"active-id":r.currentSessionId,loading:r.sessionsLoading,labels:r.conversationLabels,onSelect:r.selectSession,onNew:r.handleNewSession,onRename:r.renameSession,onDelete:r.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])])):(S(),a(U,{key:1},[s(` 对话页(窄屏时顶上多一条返回条;宽屏左侧就摆着列表,不需要) `),r.narrow?(S(),a(`div`,ft,[V(`button`,{type:`button`,class:`agent-page-back`,title:r.$t(`@AGENT:返回会话列表`),"aria-label":r.$t(`@AGENT:返回会话列表`),onClick:t[0]||=e=>r.chatPage=`list`},[...t[1]||=[V(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[V(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),V(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,pt),V(`span`,mt,v(r.currentSessionTitle),1)])):s(`v-if`,!0),s(`
7
+ 对话宿主:单独开一层裁剪边界。
8
+ 欢迎页在矮/窄窗口里会比可用高度还高,而它是垂直居中的 —— 溢出的部分
9
+ 会**向上**跑出 .acu-chat,盖到刚加的返回条上(把返回条的点击也一起吃掉,
10
+ e2e 实测就是这个症状)。宿主的 overflow:hidden 把它裁在自己这一格里。
11
+ `),V(`div`,{class:`agent-chat-host`,style:r.welcomeAvatarStyle},[s(` 加载中 `),r.sessionLoading?(S(),a(`div`,ht,[p(r.ElIcon,{class:`is-loading`,size:32},{default:L(()=>[p(r.Loading)]),_:1}),V(`span`,null,v(r.$t(`@AGENT:加载会话中...`)),1)])):(S(),a(U,{key:1},[s(` ChatContainer `),p(r.ChatContainer,{ref:`chatContainerRef`,messages:r.messages,"preset-questions":r.presetQuestions,"welcome-title":r.$t(`@AGENT:智能体助手`),"welcome-description":r.$t(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":r.AGENT_ASSISTANT_NAME,"assistant-avatar":r.AGENT_ASSISTANT_AVATAR,theme:r.chatTheme,disabled:r.isStreaming,generating:r.isStreaming,"upload-config":{accept:r.AGENT_UPLOAD_ACCEPT},placeholder:r.isStreaming?r.$t(`@AGENT:正在生成中...`):r.$t(`@AGENT:输入消息,Enter 发送`),question:r.pendingQuestion,"question-submitting":r.answeringQuestion,"question-labels":r.questionLabels,"plan-config":{labels:{title:r.$t(`@AGENT:计划`),raw:r.$t(`@AGENT:原始参数`)}},onSend:r.onSend,onSelect:r.onSelectPreset,onStop:r.stop,onAnswer:r.answerQuestion},null,8,[`messages`,`preset-questions`,`welcome-title`,`welcome-description`,`assistant-name`,`assistant-avatar`,`theme`,`disabled`,`generating`,`upload-config`,`placeholder`,`question`,`question-submitting`,`question-labels`,`plan-config`,`onStop`,`onAnswer`])],2112))])],64))])):(S(),a(U,{key:1},[s(` ── Skill 广场 / MCP 广场 ── `),p(r.MarketplacePanel,{type:r.marketplaceType},null,8,[`type`])],2112))])])],512)}var _t=q(it,[[`render`,gt],[`__scopeId`,`data-v-bd681ddd`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/views/AgentView.vue`]]);export{_t as default};
@@ -0,0 +1,2 @@
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{Cn as e,Dn as t,En as n,Gn as r,H as i,Hn as a,K as o,Kr as s,L as c,Mn as l,Nr as u,Ot as d,Pn as f,Qr as p,Rn as m,Tn as h,Yn as g,a as _,dr as v,et as y,i as b,ir as x,jn as S,or as C,qn as w,tt as T,vr as E,wn as D}from"./element-plus-D0R8BMj4.js";import{n as O,t as k}from"./_plugin-vue_export-helper-BKeZSroN.js";import{t as A}from"./CommonDialog-DpFTO5cg.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 N(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 P(){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(()=>{})})}m(),v();var F=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,I=f({__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(e,{expose:t,emit:n}){t();let r=e,i=n,o=E(null);x(()=>r.logs,async()=>{await a(),o.value&&(o.value.scrollTop=o.value.scrollHeight)});function s(){r.status!==`running`&&(r.status===`success`&&r.countdown>0&&i(`cancel`),i(`update:modelValue`,!1))}function c(){i(`retry`)}function l(){i(`restart`)}function u(){i(`cancel`),i(`update:modelValue`,!1)}async function f(){try{await navigator.clipboard.writeText(F),_.success(O(`@F13B4:已复制升级命令`))}catch{_.warning(O(`@F13B4:复制失败,请手动复制`))}}let p={MANUAL_COMMAND:F,props:r,emit:i,logEl:o,close:s,onRetry:c,onRestart:l,onLater:u,onCopyCommand:f,get Loading(){return d},get CircleCheck(){return y},get CircleClose(){return T},get $t(){return O},CommonDialog:A};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}});m(),u();var L={key:3},R={key:4},z={key:5},B={key:0,class:`upgrade-hint`},V={key:0,class:`upgrade-countdown`},H={key:1,class:`upgrade-manual`},U={class:`upgrade-manual__label`};function W(e,r,i,a,u,d){let f=o,m=c;return g(),h(a.CommonDialog,{"model-value":i.modelValue,"onUpdate:modelValue":r[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:C(()=>[i.status===`failed`?(g(),h(m,{key:0,type:`primary`,onClick:a.onRetry},{default:C(()=>[S(p(a.$t(`@F13B4:重试`)),1)]),_:1})):n(`v-if`,!0),i.status===`failed`?(g(),h(m,{key:1,onClick:a.onCopyCommand},{default:C(()=>[S(p(a.$t(`@F13B4:复制升级命令`)),1)]),_:1})):n(`v-if`,!0),i.status===`success`?(g(),h(m,{key:2,type:`primary`,onClick:a.onRestart},{default:C(()=>[S(p(a.$t(`@F13B4:立即重启并刷新`)),1)]),_:1})):n(`v-if`,!0),i.status===`success`?(g(),h(m,{key:3,onClick:a.onLater},{default:C(()=>[S(p(a.$t(`@F13B4:稍后手动重启`)),1)]),_:1})):n(`v-if`,!0),i.status===`running`?(g(),h(m,{key:4,disabled:``},{default:C(()=>[S(p(a.$t(`@F13B4:升级中`))+`... `,1)]),_:1})):n(`v-if`,!0)]),default:C(()=>[D(`div`,{class:s([`upgrade-status`,`is-${i.status}`])},[i.status===`running`?(g(),h(f,{key:0,class:`is-loading`},{default:C(()=>[l(a.Loading)]),_:1})):i.status===`success`?(g(),h(f,{key:1,color:`var(--color-success)`},{default:C(()=>[l(a.CircleCheck)]),_:1})):(g(),h(f,{key:2,color:`var(--color-danger)`},{default:C(()=>[l(a.CircleClose)]),_:1})),i.status===`running`?(g(),t(`span`,L,p(a.$t(`@F13B4:升级中`)),1)):i.status===`success`?(g(),t(`span`,R,p(a.$t(`@F13B4:升级完成`)),1)):(g(),t(`span`,z,p(a.$t(`@F13B4:升级失败`)),1))],2),i.status===`success`?(g(),t(`p`,B,[S(p(a.$t(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),i.countdown>0?(g(),t(`span`,V,p(a.$t(`@F13B4:{seconds} 秒后自动刷新`,{seconds:i.countdown})),1)):n(`v-if`,!0)])):n(`v-if`,!0),i.status===`failed`?(g(),t(`p`,H,[D(`span`,U,p(a.$t(`@F13B4:手动升级命令`)),1),D(`code`,{class:`upgrade-manual__cmd`},p(a.MANUAL_COMMAND))])):n(`v-if`,!0),D(`pre`,{ref:`logEl`,class:`upgrade-log`},p(i.logs||a.$t(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}var G=k(I,[[`render`,W],[`__scopeId`,`data-v-bc566bba`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/UpgradeDialog.vue`]]);m(),v();var K=`https://github.com/xz333221/zen-gitsync/releases`,q=5,J=`app-version-check`,Y=36e5,X=f({__name:`AppVersionBadge`,setup(t,{expose:n}){n();let i=`2.17.29`,a=E(i),o=e(()=>a.value||i),s=E(null),c=E(!1),l=E(``),u=E(`running`),d=E(0),f=null,p=E(!1);function m(){try{let e=sessionStorage.getItem(J);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>Y?null:n}catch{return null}}function h(e){try{sessionStorage.setItem(J,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function g(e=!1){let t=m();t&&(s.value=t);try{let t=await M();s.value=t,h(t),t.current&&(a.value=t.current),!e&&t.success&&t.hasUpdate&&_({type:`success`,message:O(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||_({type:`warning`,message:O(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function v(){if(s.value?.hasUpdate){try{await b.confirm(O(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:s.value.current,latest:s.value.latest}),O(`@F13B4:升级`),{confirmButtonText:O(`@F13B4:确定升级`),cancelButtonText:O(`@F13B4:取消`),type:`info`})}catch{return}l.value=``,u.value=`running`,c.value=!0,await N(e=>{if(e.type===`done`){if(u.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(J)}catch{}s.value?.latest&&(a.value=s.value.latest),y()}}else e.message&&(l.value+=e.message)})}}function y(){x(),d.value=q,f=setInterval(()=>{--d.value,d.value<=0&&(f&&=(clearInterval(f),null),C())},1e3)}function x(){f&&=(clearInterval(f),null),d.value=0}function S(){x()}async function C(){if(x(),!p.value){p.value=!0;try{let e=await P(),{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];_({type:`warning`,message:n?O(n):O(`@F13B4:重启失败 {error}`,{error:t})}),p.value=!1}}}r(()=>{x()}),w(()=>{g(!0)});let T={buildVersion:i,releasesUrl:K,runtimeVersion:a,displayVersion:o,latestInfo:s,upgradeDialogVisible:c,upgradeLogs:l,upgradeStatus:u,AUTO_REFRESH_SECONDS:q,countdown:d,get countdownTimer(){return f},set countdownTimer(e){f=e},restartInFlight:p,CACHE_KEY:J,CACHE_TTL_MS:Y,readCache:m,writeCache:h,checkUpdate:g,handleUpgrade:v,startAutoRefreshCountdown:y,cancelAutoRefreshCountdown:x,handleCancelAutoRefresh:S,handleRestart:C,get $t(){return O},UpgradeDialog:G};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}});m(),u();var Z={class:`app-version-badge`},Q=[`aria-label`],$=[`aria-label`],ee=[`title`,`aria-label`],te={class:`upgrade-btn__label`},ne={class:`upgrade-btn__version`};function re(e,r,a,o,s,c){let u=i;return g(),t(`div`,Z,[n(` GitHub 链接 `),l(u,{content:o.$t(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:C(()=>[D(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":o.$t(`@F13B4:在 GitHub 上查看源码`)},[...r[1]||=[D(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[D(`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,Q)]),_:1},8,[`content`]),n(` NPM 链接 `),l(u,{content:o.$t(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:C(()=>[D(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":o.$t(`@F13B4:在 npm 上查看包`)},[...r[2]||=[D(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[D(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,$)]),_:1},8,[`content`]),n(` 版本号 `),l(u,{content:o.$t(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:C(()=>[D(`a`,{href:o.releasesUrl,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+p(o.displayVersion),1)]),_:1},8,[`content`]),o.latestInfo?.hasUpdate?(g(),t(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:o.$t(`@F13B4:发现新版本 {version},点击升级`,{version:o.latestInfo.latest??``}),"aria-label":o.$t(`@F13B4:发现新版本 {version},点击升级`,{version:o.latestInfo.latest??``}),onClick:o.handleUpgrade},[r[3]||=D(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),D(`span`,te,p(o.$t(`@F13B4:升级`)),1),D(`span`,ne,`v`+p(o.latestInfo.latest),1)],8,ee)):n(`v-if`,!0),l(o.UpgradeDialog,{modelValue:o.upgradeDialogVisible,"onUpdate:modelValue":r[0]||=e=>o.upgradeDialogVisible=e,logs:o.upgradeLogs,status:o.upgradeStatus,countdown:o.countdown,onRetry:o.handleUpgrade,onRestart:o.handleRestart,onCancel:o.handleCancelAutoRefresh},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}var ie=k(X,[[`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{$ as e,Bt as t,Cn as n,Dn as r,En as i,F as a,K as o,Kr as s,Lt as c,Mn as l,Nr as u,P as d,Pn as f,Qr as p,Rn as m,Tn as h,U as g,V as _,W as v,Yn as y,Zn as b,_ as x,_n as S,dr as C,jt as w,ln as T,or as E,vr as D,wn as O,yn as k}from"./element-plus-D7LDHcAn.js";import{n as A,t as j}from"./_plugin-vue_export-helper-BP5VbhV0.js";import{t as M}from"./SvgIcon-Cv-Ewpj-.js";import{t as N}from"./IconButton-IoukQQts.js";import{r as P}from"./gitStore-8MMG-kBB.js";import{t as F}from"./CommonDialog-Bwj--3EO.js";m(),C();var I=f({__name:`BranchSelector`,emits:[`branchChanged`],setup(r,{expose:i,emit:a}){i();let o=P(),s=a,l=D(!1),u=D(``),d=n(()=>{let e=u.value.trim().toLowerCase();return e?o.allBranches.filter(t=>t.toLowerCase().includes(e)):o.allBranches});async function f(e){if(e===o.currentBranch){l.value=!1;return}l.value=!1,await o.changeBranch(e)&&(s(`branchChanged`),o.refreshLog())}let p=D(!1),m=D(``),h=D(``);function g(){l.value=!1,h.value=o.currentBranch,p.value=!0}async function _(){await o.createBranch(m.value,h.value)&&(p.value=!1,m.value=``,s(`branchChanged`))}let v=D(!1);async function y(){if(!v.value){v.value=!0;try{await Promise.all([o.getCurrentBranch(!0),o.getBranchStatus(!0),o.getAllBranches()]),s(`branchChanged`),o.refreshLog()}finally{v.value=!1}}}let b={gitStore:o,emit:s,branchPopoverVisible:l,branchFilter:u,filteredBranches:d,selectBranch:f,createBranchDialogVisible:p,newBranchName:m,selectedBaseBranch:h,openCreateBranchDialog:g,createNewBranch:_,isRefreshingBranch:v,refreshCurrentBranch:y,get $t(){return A},get Plus(){return c},get Menu(){return w},get Check(){return e},get Refresh(){return t},CommonDialog:F,IconButton:N,SvgIcon:M};return Object.defineProperty(b,"__isScriptSetup",{enumerable:!1,value:!0}),b}});m(),u(),T();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(e,t,n,c,u,f){let m=o,C=_,w=x,T=v,D=d,A=a,j=g;return c.gitStore.currentBranch?(y(),r(`div`,L,[O(`div`,R,[i(` VSCode 风格分支按钮 + 弹出列表 `),l(w,{visible:c.branchPopoverVisible,"onUpdate:visible":t[1]||=e=>c.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:t[2]||=e=>c.branchFilter=``},{reference:E(()=>[O(`button`,z,[l(c.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),O(`span`,B,p(c.gitStore.currentBranch),1),O(`span`,V,[l(m,null,{default:E(()=>[...t[7]||=[O(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[O(`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:E(()=>[O(`div`,H,[i(` 搜索框 `),O(`div`,U,[l(C,{modelValue:c.branchFilter,"onUpdate:modelValue":t[0]||=e=>c.branchFilter=e,placeholder:c.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),i(` 分支列表 `),O(`div`,W,[(y(!0),r(k,null,b(c.filteredBranches,e=>(y(),r(`div`,{key:e,class:s([`branch-item`,{"is-active":e===c.gitStore.currentBranch}]),onClick:t=>c.selectBranch(e)},[e===c.gitStore.currentBranch?(y(),h(m,{key:0,class:`branch-item-check`},{default:E(()=>[l(c.Check)]),_:1})):(y(),r(`span`,K)),l(c.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),O(`span`,q,p(e),1)],10,G))),128)),c.filteredBranches.length===0?(y(),r(`div`,J,p(c.$t(`@F13B4:没有匹配的分支`)),1)):i(`v-if`,!0)]),i(` 底部:创建新分支 `),O(`div`,Y,[O(`button`,{class:`branch-create-btn`,onClick:c.openCreateBranchDialog},[l(m,null,{default:E(()=>[l(c.Plus)]),_:1}),O(`span`,null,p(c.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),i(` 刷新按钮 `),l(c.IconButton,{tooltip:c.$t(`@CMDCON:刷新`),onClick:c.refreshCurrentBranch},{default:E(()=>[l(m,{class:s({"is-loading":c.isRefreshingBranch})},{default:E(()=>[l(c.Refresh)]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),i(` 创建分支对话框 `),l(c.CommonDialog,{modelValue:c.createBranchDialogVisible,"onUpdate:modelValue":t[6]||=e=>c.createBranchDialogVisible=e,title:c.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:E(()=>[O(`div`,$,[O(`div`,ee,[O(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:t[5]||=e=>c.createBranchDialogVisible=!1},p(c.$t(`@F13B4:取消`)),1),O(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:c.createNewBranch,disabled:c.gitStore.isCreatingBranch},[c.gitStore.isCreatingBranch?(y(),h(m,{key:1,class:`is-loading`},{default:E(()=>[...t[8]||=[O(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[O(`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})):(y(),h(m,{key:0},{default:E(()=>[l(c.Check)]),_:1})),O(`span`,null,p(c.$t(`@F13B4:创建`)),1)],8,te)])])]),default:E(()=>[O(`div`,X,[l(j,{model:{newBranchName:c.newBranchName,selectedBaseBranch:c.selectedBaseBranch},"label-position":`top`},{default:E(()=>[l(T,null,{label:E(()=>[O(`div`,Z,[l(m,{class:`label-icon`},{default:E(()=>[l(c.Plus)]),_:1}),O(`span`,null,p(c.$t(`@F13B4:新分支名称`)),1)])]),default:E(()=>[l(C,{modelValue:c.newBranchName,"onUpdate:modelValue":t[3]||=e=>c.newBranchName=e,placeholder:c.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:S(c.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),l(T,null,{label:E(()=>[O(`div`,Q,[l(m,{class:`label-icon`},{default:E(()=>[l(c.Menu)]),_:1}),O(`span`,null,p(c.$t(`@F13B4:基于分支`)),1)])]),default:E(()=>[l(A,{modelValue:c.selectedBaseBranch,"onUpdate:modelValue":t[4]||=e=>c.selectedBaseBranch=e,placeholder:c.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:E(()=>[(y(!0),r(k,null,b(c.gitStore.allBranches,e=>(y(),h(D,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):i(`v-if`,!0)}var re=j(I,[[`render`,ne],[`__scopeId`,`data-v-9548a76f`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{re as default};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$ as e,Bt as t,Cn as n,Dn as r,En as i,F as a,K as o,Kr as s,Lt as c,Mn as l,Nr as u,P as d,Pn as f,Qr as p,Rn as m,Tn as h,U as g,V as _,W as v,Yn as y,Zn as b,_n as x,dr as S,jt as C,ln as w,or as T,r as E,vr as D,wn as O,yn as k}from"./element-plus-D0R8BMj4.js";import{n as A,t as j}from"./_plugin-vue_export-helper-BKeZSroN.js";import{t as M}from"./SvgIcon-Dk7WnZLB.js";import{t as N}from"./IconButton-Dl1cdP_x.js";import{r as P}from"./gitStore-D9oF5nof.js";import{t as F}from"./CommonDialog-DpFTO5cg.js";m(),S();var I=f({__name:`BranchSelector`,emits:[`branchChanged`],setup(r,{expose:i,emit:a}){i();let o=P(),s=a,l=D(!1),u=D(``),d=n(()=>{let e=u.value.trim().toLowerCase();return e?o.allBranches.filter(t=>t.toLowerCase().includes(e)):o.allBranches});async function f(e){if(e===o.currentBranch){l.value=!1;return}l.value=!1,await o.changeBranch(e)&&(s(`branchChanged`),o.refreshLog())}let p=D(!1),m=D(``),h=D(``);function g(){l.value=!1,h.value=o.currentBranch,p.value=!0}async function _(){await o.createBranch(m.value,h.value)&&(p.value=!1,m.value=``,s(`branchChanged`))}let v=D(!1);async function y(){if(!v.value){v.value=!0;try{await Promise.all([o.getCurrentBranch(!0),o.getBranchStatus(!0),o.getAllBranches()]),s(`branchChanged`),o.refreshLog()}finally{v.value=!1}}}let b={gitStore:o,emit:s,branchPopoverVisible:l,branchFilter:u,filteredBranches:d,selectBranch:f,createBranchDialogVisible:p,newBranchName:m,selectedBaseBranch:h,openCreateBranchDialog:g,createNewBranch:_,isRefreshingBranch:v,refreshCurrentBranch:y,get $t(){return A},get Plus(){return c},get Menu(){return C},get Check(){return e},get Refresh(){return t},CommonDialog:F,IconButton:N,SvgIcon:M};return Object.defineProperty(b,"__isScriptSetup",{enumerable:!1,value:!0}),b}});m(),u(),w();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(e,t,n,c,u,f){let m=o,S=_,C=E,w=v,D=d,A=a,j=g;return c.gitStore.currentBranch?(y(),r(`div`,L,[O(`div`,R,[i(` VSCode 风格分支按钮 + 弹出列表 `),l(C,{visible:c.branchPopoverVisible,"onUpdate:visible":t[1]||=e=>c.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:t[2]||=e=>c.branchFilter=``},{reference:T(()=>[O(`button`,z,[l(c.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),O(`span`,B,p(c.gitStore.currentBranch),1),O(`span`,V,[l(m,null,{default:T(()=>[...t[7]||=[O(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[O(`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:T(()=>[O(`div`,H,[i(` 搜索框 `),O(`div`,U,[l(S,{modelValue:c.branchFilter,"onUpdate:modelValue":t[0]||=e=>c.branchFilter=e,placeholder:c.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),i(` 分支列表 `),O(`div`,W,[(y(!0),r(k,null,b(c.filteredBranches,e=>(y(),r(`div`,{key:e,class:s([`branch-item`,{"is-active":e===c.gitStore.currentBranch}]),onClick:t=>c.selectBranch(e)},[e===c.gitStore.currentBranch?(y(),h(m,{key:0,class:`branch-item-check`},{default:T(()=>[l(c.Check)]),_:1})):(y(),r(`span`,K)),l(c.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),O(`span`,q,p(e),1)],10,G))),128)),c.filteredBranches.length===0?(y(),r(`div`,J,p(c.$t(`@F13B4:没有匹配的分支`)),1)):i(`v-if`,!0)]),i(` 底部:创建新分支 `),O(`div`,Y,[O(`button`,{class:`branch-create-btn`,onClick:c.openCreateBranchDialog},[l(m,null,{default:T(()=>[l(c.Plus)]),_:1}),O(`span`,null,p(c.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),i(` 刷新按钮 `),l(c.IconButton,{tooltip:c.$t(`@CMDCON:刷新`),onClick:c.refreshCurrentBranch},{default:T(()=>[l(m,{class:s({"is-loading":c.isRefreshingBranch})},{default:T(()=>[l(c.Refresh)]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),i(` 创建分支对话框 `),l(c.CommonDialog,{modelValue:c.createBranchDialogVisible,"onUpdate:modelValue":t[6]||=e=>c.createBranchDialogVisible=e,title:c.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:T(()=>[O(`div`,$,[O(`div`,ee,[O(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:t[5]||=e=>c.createBranchDialogVisible=!1},p(c.$t(`@F13B4:取消`)),1),O(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:c.createNewBranch,disabled:c.gitStore.isCreatingBranch},[c.gitStore.isCreatingBranch?(y(),h(m,{key:1,class:`is-loading`},{default:T(()=>[...t[8]||=[O(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[O(`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})):(y(),h(m,{key:0},{default:T(()=>[l(c.Check)]),_:1})),O(`span`,null,p(c.$t(`@F13B4:创建`)),1)],8,te)])])]),default:T(()=>[O(`div`,X,[l(j,{model:{newBranchName:c.newBranchName,selectedBaseBranch:c.selectedBaseBranch},"label-position":`top`},{default:T(()=>[l(w,null,{label:T(()=>[O(`div`,Z,[l(m,{class:`label-icon`},{default:T(()=>[l(c.Plus)]),_:1}),O(`span`,null,p(c.$t(`@F13B4:新分支名称`)),1)])]),default:T(()=>[l(S,{modelValue:c.newBranchName,"onUpdate:modelValue":t[3]||=e=>c.newBranchName=e,placeholder:c.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:x(c.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),l(w,null,{label:T(()=>[O(`div`,Q,[l(m,{class:`label-icon`},{default:T(()=>[l(c.Menu)]),_:1}),O(`span`,null,p(c.$t(`@F13B4:基于分支`)),1)])]),default:T(()=>[l(A,{modelValue:c.selectedBaseBranch,"onUpdate:modelValue":t[4]||=e=>c.selectedBaseBranch=e,placeholder:c.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:T(()=>[(y(!0),r(k,null,b(c.gitStore.allBranches,e=>(y(),h(D,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):i(`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};
@@ -0,0 +1,6 @@
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$ as e,A as t,Bt as n,C as r,Cn as i,Dn as a,En as o,F as s,G as c,Gt as l,H as u,Ht as d,I as f,Jn as p,Jr as m,K as h,Kr as g,L as _,Lt as v,Mn as y,Nr as b,Ot as x,P as S,Pn as C,Qr as w,Rn as T,Rt as E,S as ee,T as D,Tn as O,Tt as k,U as te,Ut as A,V as j,W as M,X as ne,Yn as N,Zn as P,_ as re,a as F,at as I,dr as L,en as ie,et as ae,ft as oe,gn as se,gr as ce,i as R,ir as le,it as ue,j as de,jn as z,jt as fe,ln as B,o as pe,or as V,ot as me,pt as he,q as ge,qn as _e,rt as ve,sn as H,sr as ye,st as be,vn as xe,vr as U,w as Se,wn as W,x as Ce,xn as we,yn as G,z as Te}from"./element-plus-D0R8BMj4.js";import{v as Ee}from"./vendor-CCrjQw5C.js";import{n as K,t as q}from"./_plugin-vue_export-helper-BKeZSroN.js";import{t as De}from"./IconButton-Dl1cdP_x.js";import{r as Oe,t as J}from"./configStore-fJaic3kE.js";import{i as ke,r as Y}from"./gitStore-D9oF5nof.js";import{t as X}from"./CommonDialog-DpFTO5cg.js";import{t as Ae}from"./TemplateManager-B3ZNTXnP.js";import{C as je,S as Me,T as Z,b as Ne,w as Pe,x as Fe,y as Ie}from"./index-CKxygqdx.js";T();var Le=C({__name:`StageButton`,props:{from:{type:String,required:!1,default:`form`}},emits:[`click`],setup(e,{expose:t,emit:n}){t();let r=n,a=Y(),o=J();function s(e){let t=e.replace(/\\/g,`/`);return o.lockedFiles.some(e=>{let n=e.replace(/\\/g,`/`);return t===n})}function c(){return o.lockedFiles.length!==0&&a.fileList.some(e=>[`modified`,`deleted`,`untracked`].includes(e.type)?s(e.path):!1)}let l=i(()=>a.fileList.filter(e=>[`modified`,`deleted`,`untracked`].includes(e.type)&&!s(e.path)).length),u=i(()=>a.fileList.some(e=>[`modified`,`deleted`,`untracked`].includes(e.type)&&!s(e.path))),d=i(()=>a.isSelectionMode&&a.hasSelectableFiles),f=i(()=>a.selectedUnstagedPaths.length),p=i(()=>a.isSelectionMode?f.value===0:!u.value),m=i(()=>d.value?`${K(`@29974:暂存所选 `)}${f.value}${K(`@29974: 个文件`)}`:u.value?c()?`${K(`@29974:暂存`)}${l.value}${K(`@29974:个未暂存文件(逐个添加)`)}`:`${K(`@29974:暂存所有更改(git add .)`)}`:K(`@29974:没有需要暂存的更改`));async function h(){r(`click`);try{if(d.value){await a.stageFiles(a.selectedUnstagedPaths);return}if(a.isSelectionMode)return;c()?await a.addToStage():await a.addAllToStage()}catch(e){console.error(`添加文件失败:`,e)}}let g={emit:r,gitStore:a,configStore:o,isFileLocked:s,hasLockedFileMatches:c,unstagedFilesCount:l,hasUnstagedChanges:u,isSelectiveStage:d,selectedStageCount:f,isDisabled:p,tooltipText:m,handleClick:h,get $t(){return K},get Plus(){return v}};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}});b(),T();var Re={key:0},ze={key:1};function Be(e,t,n,r,i,s){let c=_,l=u;return N(),O(l,{content:r.tooltipText,placement:`top`},{default:V(()=>[y(c,{type:`primary`,icon:r.Plus,onClick:r.handleClick,loading:r.gitStore.isAddingFiles,disabled:r.isDisabled,class:g([`stage-button`,`from-${n.from}`,{"is-selective":r.isSelectiveStage}])},{default:V(()=>[z(w(r.isSelectiveStage?r.$t(`@29974:暂存所选`):r.$t(`@29974:暂存`))+` `,1),r.isSelectiveStage?(N(),a(`span`,Re,`(`+w(r.selectedStageCount)+`)`,1)):r.unstagedFilesCount>0?(N(),a(`span`,ze,`(`+w(r.unstagedFilesCount)+`)`,1)):o(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`class`])]),_:1},8,[`content`])}var Ve=q(Le,[[`render`,Be],[`__scopeId`,`data-v-d99cab92`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/StageButton.vue`]]);T();var He=C({__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(t,{expose:n,emit:r}){n();let a=t,o=r,s=Y(),c=J(),l=i(()=>s.fileList.filter(e=>e.type===`added`&&!Z(e.path,c.lockedFiles)).length),u=i(()=>l.value>0),d=i(()=>s.hasConflictedFiles||s.isCommiting?!0:s.isMergeInProgress?!a.hasUserCommitMessage:!u.value||!a.hasUserCommitMessage),f=i(()=>s.isCommiting?K(`@76A11:正在提交中…`):s.hasConflictedFiles?K(`@76A11:存在冲突文件,请先解决冲突`):s.isMergeInProgress?a.hasUserCommitMessage?K(`@76A11:提交并完成合并`):K(`@76A11:请输入提交信息`):u.value?a.hasUserCommitMessage?`${K(`@76A11:提交`)}${l.value}${K(`@76A11:个已暂存文件`)}`:K(`@76A11:请输入提交信息`):K(`@76A11:没有已暂存的更改`)),p=i(()=>s.isCommiting?K(`@76A11:提交中…`):K(`@76A11:提交`));async function m(){if(a.finalCommitMessage.trim()){o(`beforeCommit`),o(`click`);try{let e=await s.commitChanges(a.finalCommitMessage,a.skipHooks);o(`afterCommit`,e)}catch(e){console.error(`提交失败:`,e),o(`afterCommit`,!1)}}}let h={props:a,emit:o,gitStore:s,configStore:c,stagedFilesCount:l,hasStagedChanges:u,isDisabled:d,tooltipText:f,buttonLabel:p,handleClick:m,get $t(){return K},get Check(){return e},get Loading(){return x}};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}});b(),T();var Ue={key:0};function We(e,t,n,r,i,s){let c=_,l=u;return N(),O(l,{content:r.tooltipText,placement:`top`,disabled:r.gitStore.isCommiting},{default:V(()=>[y(c,{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:g([`commit-button`,`from-${n.from}`,{"is-committing":r.gitStore.isCommiting}])},{default:V(()=>[z(w(r.buttonLabel)+` `,1),r.stagedFilesCount>0&&!r.gitStore.isCommiting?(N(),a(`span`,Ue,`(`+w(r.stagedFilesCount)+`)`,1)):o(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`aria-busy`,`aria-label`,`class`])]),_:1},8,[`content`,`disabled`])}var Ge=q(He,[[`render`,We],[`__scopeId`,`data-v-100f6d49`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/CommitButton.vue`]]);T(),L();var Ke=C({__name:`PushProgressModal`,props:{modelValue:{type:Boolean,required:!0}},emits:[`update:modelValue`,`complete`,`pull-requested`],setup(e,{expose:t,emit:n}){let{t:r}=Ee(),a=e,o=n,s=J(),c=Y(),l=U(`progress`),u=U([]),d=U(``),f=U(!1),p=i(()=>d.value.includes(`non-fast-forward`)||d.value.includes(`rejected`)&&d.value.includes(`fetch first`)),m=U(!1);async function g(){m.value=!0;try{(await c.gitPull()).success&&(b.value=!1,o(`pull-requested`))}finally{m.value=!1}}let _=ce([{name:`counting`,label:r(`@PUSH:计数对象`),status:`wait`,percent:0},{name:`compressing`,label:r(`@PUSH:压缩对象`),status:`wait`,percent:0},{name:`writing`,label:r(`@PUSH:写入对象`),status:`wait`,percent:0},{name:`resolving`,label:r(`@PUSH:解析增量`),status:`wait`,percent:0}]),v=U(0),y=U(null),b=i({get:()=>a.modelValue,set:e=>o(`update:modelValue`,e)}),S=i(()=>{if(f.value)return r(`@PUSH:正在拉取远程更新`);switch(l.value){case`progress`:return r(`@PUSH:正在推送`);case`success`:return r(`@PUSH:推送成功`);case`error`:return r(`@PUSH:推送失败`);default:return``}});function C(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 w(){l.value=`progress`,u.value=[],d.value=``,v.value=0,f.value=!1,_.forEach(e=>{e.status=`wait`,e.percent=0})}function T(e){f.value=e}t({handleProgress:C,reset:w,setPulling:T});let E={t:r,props:a,emit:o,configStore:s,gitStore:c,status:l,messages:u,errorMessage:d,isPullingRemote:f,isNonFastForwardError:p,isPulling:m,handlePullAndRetry:g,stages:_,activeStep:v,messagesContainerRef:y,visible:b,statusText:S,handleProgress:C,reset:w,setPulling:T,get ElProgress(){return re},get ElIcon(){return h},get Close(){return ue},get Loading(){return x},get CircleCheck(){return ae},get Download(){return oe},CommonDialog:X};return Object.defineProperty(E,"__isScriptSetup",{enumerable:!1,value:!0}),E}});T(),b();var qe={class:`push-progress-container`},Je={key:0,class:`pulling-section`},Ye={class:`pulling-text-wrap`},Xe={class:`pulling-title`},Ze={class:`pulling-sub`},Qe={class:`stage-header`},$e={class:`stage-icon`},et={class:`stage-info`},tt={class:`stage-label`},nt={key:0,class:`stage-percent`},rt={key:0,class:`stage-progress`},it={key:2,class:`error-section`},at={class:`error-header`},ot={class:`error-title`},st={class:`error-content`},ct={key:0,class:`error-suggestion`},lt={key:3,class:`messages-section`},ut={class:`messages-title`},dt={ref:`messagesContainerRef`,class:`progress-messages`};function ft(e,t,n,r,i,s){let c=_;return N(),O(r.CommonDialog,{modelValue:r.visible,"onUpdate:modelValue":t[0]||=e=>r.visible=e,title:r.statusText,width:`650px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":r.status!==`progress`,"append-to-body":!0,"lock-scroll":!1,"destroy-on-close":``,"custom-class":`push-progress-dialog status-${r.status}`},{default:V(()=>[W(`div`,qe,[o(` 拉取中提示 `),r.isPullingRemote?(N(),a(`div`,Je,[t[1]||=W(`div`,{class:`pulling-icon-wrap`},[W(`svg`,{class:`pulling-spinner`,viewBox:`0 0 50 50`},[W(`circle`,{class:`pulling-spinner-track`,cx:`25`,cy:`25`,r:`20`,fill:`none`,"stroke-width":`4`}),W(`circle`,{class:`pulling-spinner-arc`,cx:`25`,cy:`25`,r:`20`,fill:`none`,"stroke-width":`4`})])],-1),W(`div`,Ye,[W(`div`,Xe,w(r.t(`@PUSH:正在拉取远程更新`)),1),W(`div`,Ze,w(r.t(`@PUSH:拉取完成后自动继续推送`)),1)])])):(N(),a(G,{key:1},[o(` 推送阶段(2x2网格) `),W(`div`,{class:g([`stages-section`,{"is-loading":r.status===`progress`,"is-success":r.status===`success`}])},[(N(!0),a(G,null,P(r.stages,(e,t)=>(N(),a(`div`,{key:e.name,class:g([`stage-item`,{active:r.activeStep===t,finished:e.status===`finish`,error:e.status===`error`}])},[W(`div`,Qe,[W(`div`,$e,[e.status===`finish`?(N(),O(r.ElIcon,{key:0,class:`icon-finish`},{default:V(()=>[y(r.CircleCheck)]),_:1})):e.status===`error`?(N(),O(r.ElIcon,{key:1,class:`icon-error`},{default:V(()=>[y(r.Close)]),_:1})):e.status===`process`?(N(),O(r.ElIcon,{key:2,class:`icon-process rotating`},{default:V(()=>[y(r.Loading)]),_:1})):(N(),O(r.ElIcon,{key:3,class:`icon-wait`},{default:V(()=>[y(r.Loading)]),_:1}))]),W(`div`,et,[W(`div`,tt,w(e.label),1),e.status===`process`||e.status===`finish`?(N(),a(`div`,nt,w(e.percent)+`% `,1)):o(`v-if`,!0)])]),e.status===`process`||e.status===`finish`?(N(),a(`div`,rt,[y(r.ElProgress,{percentage:e.percent,"stroke-width":6,"show-text":!1,color:e.status===`finish`?`var(--color-success)`:`var(--color-primary)`},null,8,[`percentage`,`color`])])):o(`v-if`,!0)],2))),128))],2)],2112)),o(` 错误信息 `),r.status===`error`&&r.errorMessage?(N(),a(`div`,it,[W(`div`,at,[W(`div`,ot,w(r.t(`@PUSH:错误详情`))+`:`,1),r.isNonFastForwardError?(N(),O(c,{key:0,type:`primary`,size:`small`,loading:r.isPulling,onClick:r.handlePullAndRetry,class:`pull-button`},{default:V(()=>[y(r.ElIcon,null,{default:V(()=>[y(r.Download)]),_:1}),z(` `+w(r.t(`@PUSH:先拉取更新`)),1)]),_:1},8,[`loading`])):o(`v-if`,!0)]),W(`div`,st,w(r.errorMessage),1),r.isNonFastForwardError?(N(),a(`div`,ct,w(r.t(`@PUSH:检测到远程有新提交,请先拉取更新后再推送。`)),1)):o(`v-if`,!0)])):o(`v-if`,!0),o(` 进度消息 `),r.messages.length>0?(N(),a(`div`,lt,[W(`div`,ut,w(r.t(`@PUSH:详细信息`))+`:`,1),W(`div`,dt,[(N(!0),a(G,null,P(r.messages,(e,t)=>(N(),a(`div`,{key:t,class:`message-item`},w(e),1))),128))],512)])):o(`v-if`,!0)])]),_:1},8,[`modelValue`,`title`,`show-close`,`custom-class`])}var pt=q(Ke,[[`render`,ft],[`__scopeId`,`data-v-0e0be0c3`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/PushProgressModal.vue`]]);T(),L();var mt=C({__name:`PushButton`,props:{from:{type:String,required:!1,default:`form`}},emits:[`click`,`beforePush`,`afterPush`],setup(e,{expose:t,emit:n}){t();let r=n,a=Y(),o=U(!1),s=U(null),c=i(()=>a.branchAhead>0),l=i(()=>a.fileList.some(e=>e.type===`added`)),u=i(()=>!a.hasConflictedFiles&&a.hasUpstream&&c.value&&!l.value),d=i(()=>!u.value),f=i(()=>a.hasConflictedFiles?K(`@F4137:存在冲突文件,请先解决冲突`):a.hasUpstream?c.value?l.value?K(`@F4137:有未提交的暂存更改,请先提交`):`${K(`@F4137:推送`)}${a.branchAhead}${K(`@F4137:个本地提交`)}`:K(`@F4137:没有需要推送的提交`):K(`@F4137:当前分支没有上游分支`)),p=i(()=>u.value?{backgroundColor:`var(--tint-success-14)`,borderColor:`var(--color-success)`,color:`var(--text-primary)`}:{});async function m(){r(`beforePush`),r(`click`);try{o.value=!0,s.value&&s.value.reset();let e=await a.pushToRemoteWithProgress(e=>{s.value&&s.value.handleProgress(e)});e&&await new Promise(e=>setTimeout(e,200)),r(`afterPush`,e)}catch(e){console.error(`推送失败:`,e),r(`afterPush`,!1)}}function h(e){}let g=i(()=>[...a.remotes].sort((e,t)=>e.isUpstream===t.isUpstream?e.name.localeCompare(t.name):e.isUpstream?-1:1));async function _(e){if(e===`manage`){a.isRemoteManagerVisible=!0;return}if(e===`push-all`){await a.pushAllRemotes();return}if(!e.startsWith(`push:`))return;let t=e.slice(5);r(`beforePush`);try{o.value=!0,s.value?.reset();let e=await a.pushToRemoteWithProgress(e=>{s.value?.handleProgress(e)},t);r(`afterPush`,e)}catch(e){console.error(`推送失败:`,e),r(`afterPush`,!1)}}let v={emit:r,gitStore:a,progressModalVisible:o,progressModalRef:s,needsPush:c,hasStagedChanges:l,canPush:u,isDisabled:d,tooltipText:f,buttonStyle:p,handleClick:m,handleProgressComplete:h,sortedRemotes:g,handleDropdownCommand:_,get $t(){return K},get Upload(){return ie},get ArrowDown(){return ge},PushProgressModal:pt};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}});b(),T();var ht={class:`push-button-group`},gt={key:0},_t={class:`push-remote-item`};function vt(e,t,n,i,s,c){let l=_,d=u,p=f,h=r,v=Se,b=ee;return N(),a(`div`,null,[W(`div`,ht,[y(d,{content:i.tooltipText,placement:`top`},{default:V(()=>[y(l,{type:`primary`,icon:i.Upload,onClick:i.handleClick,loading:i.gitStore.isPushing,disabled:i.isDisabled,style:m(i.buttonStyle),class:g([`push-button`,`from-${n.from}`])},{default:V(()=>[z(w(i.$t(`@F4137:推送`))+` `,1),i.needsPush?(N(),a(`span`,gt,`(`+w(i.gitStore.branchAhead)+`)`,1)):o(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`style`,`class`])]),_:1},8,[`content`]),o(` 多远程下拉:仅在配置了多个远程时出现,单远程外观与历史完全一致 `),i.gitStore.hasMultipleRemotes?(N(),O(b,{key:0,trigger:`click`,placement:`top-end`,onCommand:i.handleDropdownCommand},{dropdown:V(()=>[y(v,null,{default:V(()=>[(N(!0),a(G,null,P(i.sortedRemotes,e=>(N(),O(h,{key:e.name,command:`push:${e.name}`},{default:V(()=>[W(`span`,_t,[W(`span`,null,w(i.$t(`@F4137:推送到`))+` `+w(e.name),1),e.isUpstream?(N(),O(p,{key:0,size:`small`,type:`success`,effect:`plain`},{default:V(()=>[z(w(i.$t(`@F4137:上游`)),1)]),_:1})):o(`v-if`,!0)])]),_:2},1032,[`command`]))),128)),y(h,{divided:``,command:`push-all`},{default:V(()=>[z(w(i.$t(`@F4137:推送到全部远程`)),1)]),_:1}),y(h,{divided:``,command:`manage`},{default:V(()=>[z(w(i.$t(`@F4137:管理远程…`)),1)]),_:1})]),_:1})]),default:V(()=>[y(l,{type:`primary`,icon:i.ArrowDown,style:m(i.buttonStyle),class:g([`push-button__caret`,`from-${n.from}`]),"aria-label":i.$t(`@F4137:更多推送选项`)},null,8,[`icon`,`style`,`class`,`aria-label`])]),_:1})):o(`v-if`,!0)]),o(` 推送进度弹窗 `),y(i.PushProgressModal,{ref:`progressModalRef`,modelValue:i.progressModalVisible,"onUpdate:modelValue":t[0]||=e=>i.progressModalVisible=e,onComplete:i.handleProgressComplete},null,8,[`modelValue`])])}var yt=q(mt,[[`render`,vt],[`__scopeId`,`data-v-bcb696bd`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/PushButton.vue`]]);T(),L();var bt=C({__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 r=Y(),a=J(),o=U(!1),s=U(null),c=e,l=n,d=i(()=>r.fileList.some(e=>!Z(e.path,a.lockedFiles))),f=i(()=>r.isSelectionMode&&r.selectedFiles.size>0&&r.selectedUnstagedPaths.length>0),p=i(()=>r.hasConflictedFiles?!0:r.isSelectionMode?!f.value||!c.hasUserCommitMessage||!r.hasUpstream:!d.value&&r.branchAhead===0||!c.hasUserCommitMessage||!r.hasUpstream),m=i(()=>r.isAddingFiles||r.isCommiting||r.isPushing),h=i(()=>{if(r.hasConflictedFiles)return K(`@2E184:存在冲突文件,请先解决冲突`);if(r.isSelectionMode)return r.selectedFiles.size===0?K(`@2E184:请先勾选要推送的文件`):r.selectedUnstagedPaths.length===0?K(`@2E184:所选文件无需暂存或被锁定`):c.hasUserCommitMessage?r.hasUpstream?K(`@2E184:一键完成:仅暂存所选文件 → 提交 → 推送到远程仓库`):K(`@2E184:当前分支没有上游分支`):K(`@2E184:请输入提交信息`);let e=r.branchAhead>0;return!d.value&&!e?K(`@2E184:没有需要提交或推送的更改`):c.hasUserCommitMessage?r.hasUpstream?d.value?K(`@2E184:一键完成:暂存所有更改 → 提交 → 推送到远程仓库`):K(`@2E184:本地已提交,一键推送到远程仓库`):K(`@2E184:当前分支没有上游分支`):K(`@2E184:请输入提交信息`)}),g=i(()=>r.isSelectionMode&&f.value?K(`@2E184:一键推送所选`):K(`@2E184:一键推送所有`)),_=i(()=>c.from===`form`?r.isSelectionMode&&f.value?K(`@2E184:暂存所选 + 提交 + 推送`):K(`@2E184:暂存 + 提交 + 推送`):``);async function v(){l(`beforePush`);try{let e=r.isSelectionMode&&f.value;if((e||d.value)&&!(e?await r.stageSelectedAndCommit(c.finalCommitMessage,c.skipHooks):await r.addAndCommit(c.finalCommitMessage,c.skipHooks))){l(`afterPush`,!1);return}if(l(`pushStart`),o.value=!0,a.pullBeforePush){s.value?.setPulling(!0);let e=await r.gitPull();if(s.value?.setPulling(!1),!e.success){F.error(K(`@2E184:拉取远程更新失败,已停止推送`)),o.value=!1,r.fetchStatus(),r.getBranchStatus(!0),l(`afterPush`,!1);return}}s.value&&s.value.reset();let t=await r.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:r,configStore:a,progressModalVisible:o,progressModalRef:s,props:c,emit:l,hasAnyChanges:d,hasSelectedToStage:f,isDisabled:p,isLoading:m,tooltipText:h,buttonTitle:g,buttonDesc:_,handleQuickPush:v,handleProgressComplete:y,get ElTooltip(){return u},get Position(){return E},PushProgressModal:pt};return Object.defineProperty(b,"__isScriptSetup",{enumerable:!1,value:!0}),b}});T(),b();var xt={class:`one-push-content`},St={class:`one-push-text`},Ct={class:`one-push-title`},wt={key:0,class:`one-push-desc`};function Tt(e,t,n,r,i,s){let c=h,l=_;return N(),a(`div`,null,[y(r.ElTooltip,{content:r.tooltipText,placement:`top`,"show-after":200},{default:V(()=>[y(l,{type:`primary`,onClick:r.handleQuickPush,loading:r.isLoading,disabled:r.isDisabled,class:g([n.from,`one-push-button`])},{default:V(()=>[W(`div`,xt,[y(c,{class:`one-push-icon`},{default:V(()=>[y(r.Position)]),_:1}),W(`div`,St,[W(`span`,Ct,w(r.buttonTitle),1),n.from===`form`?(N(),a(`span`,wt,w(r.buttonDesc),1)):o(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`]),o(` 推送进度弹窗 `),y(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 Et=q(bt,[[`render`,Tt],[`__scopeId`,`data-v-1a7fa402`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/QuickPushButton.vue`]]);T(),L();var Dt=C({__name:`CreateTagButton`,props:{variant:{type:String,required:!1,default:`icon`}},setup(e,{expose:t}){t();let n=e,r=Y(),a=U(!1),o=U(``),s=U(``),c=U(`lightweight`),u=U(``),d=U(!1);function f(){o.value=``,s.value=``,c.value=`lightweight`,u.value=``,a.value=!0}async function p(){if(!o.value.trim()){F.warning(K(`@TAG01:请输入标签名称`));return}if(!/^[a-zA-Z0-9._\/-]+$/.test(o.value)){F.warning(K(`@TAG01:标签名称只能包含字母、数字、点、下划线、斜杠和连字符`));return}try{d.value=!0;let e=await(await fetch(`/api/create-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:o.value.trim(),message:s.value.trim(),type:c.value,commit:u.value.trim()})})).json();e.success?(F.success(K(`@TAG01:标签创建成功`)),a.value=!1):F.error(e.error||K(`@TAG01:创建标签失败`))}catch(e){console.error(`创建标签失败:`,e),F.error(K(`@TAG01:创建标签失败`))}finally{d.value=!1}}let m={props:n,gitStore:r,isTagDialogVisible:a,tagName:o,tagMessage:s,tagType:c,targetCommit:u,isCreating:d,openTagDialog:f,createTag:p,tagTypeDescription:i(()=>c.value===`lightweight`?K(`@TAG01:轻量标签是指向提交对象的引用,不包含额外信息`):K(`@TAG01:附注标签是完整的Git对象,包含标签信息、日期、标签者和可选的签名`)),get $t(){return K},get Sell(){return l},get InfoFilled(){return k},CommonDialog:X};return Object.defineProperty(m,"__isScriptSetup",{enumerable:!1,value:!0}),m}});T(),b();var Ot={class:`create-tag-button`},kt={class:`tag-dialog-content`},At={class:`tag-info-card`},jt={class:`info-icon`},Mt={class:`info-content`},Nt={class:`form-tip`},Pt={class:`form-tip`},Ft={class:`form-tip`};function It(e,n,r,i,s,c){let l=h,d=_,f=u,p=j,m=M,v=t,b=de,x=te;return N(),a(`div`,Ot,[o(` 创建标签按钮 `),y(f,{content:i.$t(`@TAG01:为当前提交创建标签`),placement:`top`,"show-after":200,disabled:i.props.variant===`text`},{default:V(()=>[y(d,{type:`success`,onClick:i.openTagDialog,disabled:!i.gitStore.isGitRepo,circle:i.props.variant===`icon`,size:i.props.variant===`icon`?`small`:`default`,class:g(i.props.variant===`text`?`action-button`:``)},{default:V(()=>[i.props.variant===`icon`?(N(),O(l,{key:0},{default:V(()=>[y(i.Sell)]),_:1})):(N(),a(G,{key:1},[z(w(i.$t(`@TAG01:创建标签`)),1)],64))]),_:1},8,[`disabled`,`circle`,`size`,`class`])]),_:1},8,[`content`,`disabled`]),o(` 创建标签弹窗 `),y(i.CommonDialog,{modelValue:i.isTagDialogVisible,"onUpdate:modelValue":n[4]||=e=>i.isTagDialogVisible=e,title:i.$t(`@TAG01:创建 Git 标签`),size:`medium`,"close-on-click-modal":!1,"show-footer":``,"confirm-text":i.$t(`@TAG01:创建`),"cancel-text":i.$t(`@TAG01:取消`),"confirm-loading":i.isCreating,"custom-class":`tag-dialog`,onConfirm:i.createTag},{default:V(()=>[W(`div`,kt,[o(` 功能说明卡片 `),W(`div`,At,[W(`div`,jt,[y(l,null,{default:V(()=>[y(i.Sell)]),_:1})]),W(`div`,Mt,[W(`h4`,null,w(i.$t(`@TAG01:Git 标签`)),1),W(`p`,null,w(i.$t(`@TAG01:标签用于标记项目的重要版本点,如发布版本 v1.0.0`)),1)])]),y(x,{"label-position":`top`,class:`tag-form`},{default:V(()=>[o(` 标签名称 `),y(m,{label:i.$t(`@TAG01:标签名称`),required:``},{default:V(()=>[y(p,{modelValue:i.tagName,"onUpdate:modelValue":n[0]||=e=>i.tagName=e,placeholder:i.$t(`@TAG01:例如: v1.0.0 或 release-2024`),clearable:``,maxlength:`100`},{prefix:V(()=>[y(l,null,{default:V(()=>[y(i.Sell)]),_:1})]),_:1},8,[`modelValue`,`placeholder`]),W(`div`,Nt,[y(l,null,{default:V(()=>[y(i.InfoFilled)]),_:1}),W(`span`,null,w(i.$t(`@TAG01:建议使用语义化版本号,如 v1.0.0`)),1)])]),_:1},8,[`label`]),o(` 标签类型 `),y(m,{label:i.$t(`@TAG01:标签类型`)},{default:V(()=>[y(b,{modelValue:i.tagType,"onUpdate:modelValue":n[1]||=e=>i.tagType=e,size:`default`},{default:V(()=>[y(v,{value:`lightweight`},{default:V(()=>[z(w(i.$t(`@TAG01:轻量标签`)),1)]),_:1}),y(v,{value:`annotated`},{default:V(()=>[z(w(i.$t(`@TAG01:附注标签`)),1)]),_:1})]),_:1},8,[`modelValue`]),W(`div`,Pt,[y(l,null,{default:V(()=>[y(i.InfoFilled)]),_:1}),W(`span`,null,w(i.tagTypeDescription),1)])]),_:1},8,[`label`]),o(` 标签说明(仅附注标签) `),i.tagType===`annotated`?(N(),O(m,{key:0,label:i.$t(`@TAG01:标签说明`),required:i.tagType===`annotated`},{default:V(()=>[y(p,{modelValue:i.tagMessage,"onUpdate:modelValue":n[2]||=e=>i.tagMessage=e,placeholder:i.$t(`@TAG01:为此标签添加说明信息`),clearable:``,rows:3,type:`textarea`,resize:`none`,maxlength:`500`,"show-word-limit":``},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`,`required`])):o(`v-if`,!0),o(` 目标提交(可选) `),y(m,{label:i.$t(`@TAG01:目标提交(可选)`)},{default:V(()=>[y(p,{modelValue:i.targetCommit,"onUpdate:modelValue":n[3]||=e=>i.targetCommit=e,placeholder:i.$t(`@TAG01:留空则为当前HEAD,或输入commit SHA`),clearable:``,maxlength:`40`},{prefix:V(()=>[...n[5]||=[W(`span`,{class:`commit-prefix`},`commit:`,-1)]]),_:1},8,[`modelValue`,`placeholder`]),W(`div`,Ft,[y(l,null,{default:V(()=>[y(i.InfoFilled)]),_:1}),W(`span`,null,w(i.$t(`@TAG01:默认为当前HEAD提交,也可以指定历史提交`)),1)])]),_:1},8,[`label`])]),_:1})])]),_:1},8,[`modelValue`,`title`,`confirm-text`,`cancel-text`,`confirm-loading`])])}var Lt=q(Dt,[[`render`,It],[`__scopeId`,`data-v-fd2d5a18`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/CreateTagButton.vue`]]);T(),L();var Rt=C({__name:`TagListButton`,props:{variant:{type:String,required:!1,default:`icon`}},setup(e,{expose:t}){t();let r=e,i=Y(),a=U(!1),o=U([]),s=U(!1),c=U(!1),u=U(!1),d=U(!1),f=U(null);async function p(){a.value=!0,await m()}async function m(){try{s.value=!0;let e=await(await fetch(`/api/list-tags`)).json();e.success?o.value=e.tags||[]:F.error(e.error||K(`@TAG01:获取标签列表失败`))}catch(e){console.error(`获取标签列表失败:`,e),F.error(K(`@TAG01:获取标签列表失败`))}finally{s.value=!1}}function h(e){f.value=e,d.value=!0}async function g(e){R.confirm(K(`@TAG01:确定要推送此标签到远程仓库吗?`),K(`@TAG01:推送标签`),{confirmButtonText:K(`@TAG01:推送`),cancelButtonText:K(`@TAG01:取消`),type:`info`}).then(async()=>{try{u.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(K(`@TAG01:标签推送成功`)):F.error(t.error||K(`@TAG01:推送标签失败`))}catch(e){console.error(`推送标签失败:`,e),F.error(K(`@TAG01:推送标签失败`))}finally{u.value=!1}}).catch(()=>{})}async function _(){R.confirm(K(`@TAG01:确定要推送所有标签到远程仓库吗?`),K(`@TAG01:推送所有标签`),{confirmButtonText:K(`@TAG01:推送`),cancelButtonText:K(`@TAG01:取消`),type:`info`}).then(async()=>{try{u.value=!0;let e=await(await fetch(`/api/push-all-tags`,{method:`POST`})).json();e.success?F.success(K(`@TAG01:所有标签推送成功`)):F.error(e.error||K(`@TAG01:推送标签失败`))}catch(e){console.error(`推送标签失败:`,e),F.error(K(`@TAG01:推送标签失败`))}finally{u.value=!1}}).catch(()=>{})}async function v(e){R.confirm(K(`@TAG01:确定要删除此标签吗?此操作不可恢复。`),K(`@TAG01:删除标签`),{confirmButtonText:K(`@TAG01:删除`),cancelButtonText:K(`@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(K(`@TAG01:标签删除成功`)),await m()):F.error(t.error||K(`@TAG01:删除标签失败`))}catch(e){console.error(`删除标签失败:`,e),F.error(K(`@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:r,gitStore:i,isTagListDialogVisible:a,tags:o,isLoadingTags:s,isDeletingTag:c,isPushingTag:u,tagDetailVisible:d,selectedTag:f,openTagListDialog:p,loadTags:m,viewTagDetail:h,pushTag:g,pushAllTags:_,confirmDeleteTag:v,deleteTag:y,formatDate:b,get $t(){return K},get Sell(){return l},get Delete(){return be},get Upload(){return ie},get InfoFilled(){return k},get Refresh(){return n},CommonDialog:X};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}});T(),b();var zt={class:`tag-list-button`},Bt={class:`tag-list-content`},Vt={key:0,class:`tag-header`},Ht={class:`tag-stats`},Ut={class:`stat-item`},Wt={class:`stat-number`},Gt={class:`stat-label`},Kt={class:`tag-actions-header`},qt={class:`tag-list-container`},Jt={key:0,class:`empty-state`},Yt={class:`empty-text`},Xt={class:`empty-hint`},Zt={key:1,class:`tag-cards`},Qt={class:`tag-card-content`},$t={class:`tag-info`},en={class:`tag-main-info`},tn={class:`tag-name-badge`},nn={class:`tag-name-text`},rn={class:`tag-meta`},an={class:`tag-commit`},on={class:`tag-date`},sn={key:0,class:`tag-message`},cn={class:`tag-card-actions`},ln={key:0,class:`tag-detail-content`},un={class:`detail-row`},dn={class:`detail-label`},fn={class:`detail-value`},pn={class:`detail-row`},mn={class:`detail-label`},hn={class:`detail-value`},gn={class:`detail-row`},_n={class:`detail-label`},vn={class:`detail-value`},yn={class:`detail-row`},bn={class:`detail-label`},xn={key:0,class:`detail-row detail-message`},Sn={class:`detail-label`},Cn={class:`message-content`};function wn(e,t,n,r,i,s){let c=h,l=_,d=u,p=Ce,m=f,v=pe;return N(),a(`div`,zt,[o(` 标签列表按钮 `),y(d,{content:r.$t(`@TAG01:查看和管理所有标签`),placement:`top`,"show-after":200,disabled:r.props.variant===`text`},{default:V(()=>[y(l,{type:`info`,onClick:r.openTagListDialog,disabled:!r.gitStore.isGitRepo,circle:r.props.variant===`icon`,size:r.props.variant===`icon`?`small`:`default`,class:g(r.props.variant===`text`?`action-button`:``)},{default:V(()=>[r.props.variant===`icon`?(N(),O(c,{key:0},{default:V(()=>[y(r.Sell)]),_:1})):(N(),a(G,{key:1},[z(w(r.$t(`@TAG01:标签列表`)),1)],64))]),_:1},8,[`disabled`,`circle`,`size`,`class`])]),_:1},8,[`content`,`disabled`]),o(` 标签列表弹窗 `),y(r.CommonDialog,{modelValue:r.isTagListDialogVisible,"onUpdate:modelValue":t[0]||=e=>r.isTagListDialogVisible=e,title:r.$t(`@TAG01:Git 标签列表`),size:`large`,"show-footer":!1,"custom-class":`tag-list-dialog`},{default:V(()=>[W(`div`,Bt,[o(` 头部统计信息 `),r.isLoadingTags?o(`v-if`,!0):(N(),a(`div`,Vt,[W(`div`,Ht,[W(`div`,Ut,[y(c,{class:`stat-icon`},{default:V(()=>[y(r.Sell)]),_:1}),W(`span`,Wt,w(r.tags.length),1),W(`span`,Gt,w(r.$t(`@TAG01:个标签`)),1)])]),W(`div`,Kt,[y(l,{type:`primary`,size:`small`,icon:r.Refresh,onClick:r.loadTags,loading:r.isLoadingTags,class:`refresh-btn`},{default:V(()=>[z(w(r.$t(`@TAG01:刷新`)),1)]),_:1},8,[`icon`,`loading`]),r.tags.length>0?(N(),O(l,{key:0,type:`success`,size:`small`,icon:r.Upload,onClick:r.pushAllTags,loading:r.isPushingTag,class:`push-all-btn`},{default:V(()=>[z(w(r.$t(`@TAG01:推送所有标签`)),1)]),_:1},8,[`icon`,`loading`])):o(`v-if`,!0)])])),o(` 标签列表 `),ye((N(),a(`div`,qt,[r.tags.length===0&&!r.isLoadingTags?(N(),a(`div`,Jt,[y(p,{description:r.$t(`@TAG01:暂无标签`),"image-size":120},{image:V(()=>[y(c,{class:`empty-icon`},{default:V(()=>[y(r.Sell)]),_:1})]),description:V(()=>[W(`p`,Yt,w(r.$t(`@TAG01:还没有创建任何标签`)),1),W(`p`,Xt,w(r.$t(`@TAG01:使用创建标签功能为项目添加版本标记`)),1)]),_:1},8,[`description`])])):(N(),a(`div`,Zt,[(N(!0),a(G,null,P(r.tags,e=>(N(),a(`div`,{key:e.name,class:`tag-card`},[W(`div`,Qt,[W(`div`,$t,[W(`div`,en,[W(`div`,tn,[y(c,{class:`badge-icon`},{default:V(()=>[y(r.Sell)]),_:1}),W(`span`,nn,w(e.name),1),y(m,{size:`small`,type:e.type===`annotated`?`warning`:`info`,class:`type-tag`},{default:V(()=>[z(w(e.type===`annotated`?r.$t(`@TAG01:附注`):r.$t(`@TAG01:轻量`)),1)]),_:2},1032,[`type`])]),W(`div`,rn,[W(`span`,an,[y(c,null,{default:V(()=>[y(r.InfoFilled)]),_:1}),z(` `+w(e.commit.substring(0,8)),1)]),W(`span`,on,w(r.formatDate(e.date)),1)]),e.message?(N(),a(`div`,sn,w(e.message),1)):o(`v-if`,!0)])]),W(`div`,cn,[e.message?(N(),O(l,{key:0,size:`small`,type:`info`,onClick:t=>r.viewTagDetail(e),class:`action-btn view-btn`},{default:V(()=>[z(w(r.$t(`@TAG01:查看`)),1)]),_:1},8,[`onClick`])):o(`v-if`,!0),y(l,{size:`small`,type:`success`,icon:r.Upload,onClick:t=>r.pushTag(e.name),loading:r.isPushingTag,class:`action-btn push-btn`},{default:V(()=>[z(w(r.$t(`@TAG01:推送`)),1)]),_:1},8,[`icon`,`onClick`,`loading`]),y(l,{size:`small`,type:`danger`,icon:r.Delete,onClick:t=>r.confirmDeleteTag(e.name),loading:r.isDeletingTag,class:`action-btn delete-btn`},{default:V(()=>[z(w(r.$t(`@TAG01:删除`)),1)]),_:1},8,[`icon`,`onClick`,`loading`])])])]))),128))]))])),[[v,r.isLoadingTags]])])]),_:1},8,[`modelValue`,`title`]),o(` 标签详情弹窗 `),y(r.CommonDialog,{modelValue:r.tagDetailVisible,"onUpdate:modelValue":t[1]||=e=>r.tagDetailVisible=e,title:r.$t(`@TAG01:标签详情`),size:`medium`,"show-footer":!1,"custom-class":`tag-detail-dialog`},{default:V(()=>[r.selectedTag?(N(),a(`div`,ln,[W(`div`,un,[W(`span`,dn,w(r.$t(`@TAG01:标签名称:`)),1),W(`code`,fn,w(r.selectedTag.name),1)]),W(`div`,pn,[W(`span`,mn,w(r.$t(`@TAG01:提交SHA:`)),1),W(`code`,hn,w(r.selectedTag.commit),1)]),W(`div`,gn,[W(`span`,_n,w(r.$t(`@TAG01:创建时间:`)),1),W(`span`,vn,w(r.formatDate(r.selectedTag.date)),1)]),W(`div`,yn,[W(`span`,bn,w(r.$t(`@TAG01:类型:`)),1),y(m,{type:r.selectedTag.type===`annotated`?`warning`:`info`,size:`small`},{default:V(()=>[z(w(r.selectedTag.type===`annotated`?r.$t(`@TAG01:附注标签`):r.$t(`@TAG01:轻量标签`)),1)]),_:1},8,[`type`])]),r.selectedTag.message?(N(),a(`div`,xn,[W(`span`,Sn,w(r.$t(`@TAG01:标签说明:`)),1),W(`div`,Cn,w(r.selectedTag.message),1)])):o(`v-if`,!0)])):o(`v-if`,!0)]),_:1},8,[`modelValue`,`title`])])}var Tn=q(Rt,[[`render`,wn],[`__scopeId`,`data-v-8d9468ec`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/TagListButton.vue`]]);T(),L();var En=C({__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,a=n,o=Y(),s=U(!1),c=U(!1),l=U({needsMerge:!1,error:``,fullError:``,pullOutput:``});function u(){s.value=!0}let f=i(()=>o.fileList.filter(e=>e.type===`added`).length),p=i(()=>o.branchBehind>0),m=i(()=>o.fileList.some(e=>[`modified`,`deleted`,`untracked`,`intent-to-add`].includes(e.type)));async function h(){try{let e=await o.gitPull();e.success?(await o.fetchStatus(),await o.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 g(){try{await o.gitFetchAll(),await o.fetchStatus(),await o.fetchLog(!1)}catch(e){console.error(`获取远程分支失败:`,e)}}async function _(){if(r.hasUserCommitMessage)try{await o.addAndCommit(r.finalCommitMessage,r.skipHooks),o.fetchStatus(),o.fetchLog(),a(`afterCommit`,!0),a(`clearFields`)}catch(e){console.error(`暂存并提交失败:`,e)}}function v(){a(`beforePush`)}function y(e){a(`afterPush`,e)}function b(){a(`clearFields`)}t({openGitOperationsDrawer:u});let x={props:r,emit:a,gitStore:o,gitOperationsDrawerVisible:s,pullErrorDialogVisible:c,pullErrorInfo:l,openGitOperationsDrawer:u,stagedFilesCount:f,needsPull:p,hasUnstagedChanges:m,handleGitPull:h,handleGitFetchAll:g,addAndCommit:_,handleQuickPushBefore:v,handleQuickPushAfter:y,handleClearFields:b,get $t(){return K},get Menu(){return fe},get RefreshRight(){return d},get Download(){return oe},get Connection(){return I},get Edit(){return he},get InfoFilled(){return k},IconButton:De,StageButton:Ve,UnstageAllButton:Ne,CommitButton:Ge,PushButton:yt,QuickPushButton:Et,MergeBranchButton:Fe,StashChangesButton:Pe,StashListButton:je,CreateTagButton:Lt,TagListButton:Tn,ResetToRemoteButton:Ie,CommonDialog:X};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}});T(),b();var Dn={class:`git-operations-button`},On={class:`actions-section`},kn={class:`action-groups`},An={class:`action-group`},jn={class:`group-title`},Mn={class:`group-buttons`},Nn={key:0},Pn={class:`action-group`},Fn={class:`group-title`},In={class:`group-buttons`},Ln={class:`action-group`},Rn={class:`group-title`},zn={class:`group-buttons`},Bn={key:0},Vn={class:`action-group`},Hn={class:`group-title`},Un={class:`group-buttons`},Wn={class:`action-group`},Gn={class:`group-title`},Kn={class:`group-buttons`},qn={class:`action-group`},Jn={class:`group-title`},Yn={class:`group-buttons`},Xn={class:`pull-error-content`},Zn={key:0},Qn={key:1},$n={class:`pull-error-detail`},er={class:`pull-error-label`},tr={class:`pull-error-pre`};function nr(e,t,n,r,i,s){let c=h,l=_,d=u,f=D;return N(),a(`div`,Dn,[o(` Git操作按钮 `),r.props.variant===`icon`?(N(),O(r.IconButton,{key:0,tooltip:r.$t(`@F13B4:Git 操作`),size:`large`,"custom-class":`btn-rotate-on-hover`,onClick:r.openGitOperationsDrawer},{default:V(()=>[y(c,null,{default:V(()=>[y(r.Menu)]),_:1})]),_:1},8,[`tooltip`])):(N(),O(l,{key:1,type:`primary`,class:`action-button`,onClick:r.openGitOperationsDrawer},{default:V(()=>[z(w(r.$t(`@F13B4:Git 操作`)),1)]),_:1})),o(` Git操作抽屉 `),y(f,{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:V(()=>[W(`div`,On,[W(`div`,kn,[o(` 基础操作 `),W(`div`,An,[W(`div`,jn,w(r.$t(`@76872:基础操作`)),1),W(`div`,Mn,[y(r.StageButton,{onClick:()=>{},from:`drawer`}),y(r.UnstageAllButton,{onClick:()=>{},from:`drawer`}),y(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`]),y(r.PushButton,{onBeforePush:()=>{},onAfterPush:t[1]||=e=>r.emit(`afterPush`,e),onClick:()=>{},from:`drawer`}),y(d,{content:r.gitStore.hasConflictedFiles?r.$t(`@76872:存在冲突文件,请先解决冲突`):r.needsPull?`${r.$t(`@76872:拉取`)}${r.gitStore.branchBehind}${r.$t(`@76872:个远程提交`)}`:`git pull`,placement:`top`},{default:V(()=>[y(l,{type:`primary`,icon:r.Download,onClick:r.handleGitPull,loading:r.gitStore.isGitPulling,disabled:!r.gitStore.hasUpstream||r.gitStore.hasConflictedFiles,class:`action-button`,style:m(r.gitStore.hasUpstream&&!r.gitStore.hasConflictedFiles?{color:`white`,backgroundColor:`var(--color-primary)`,borderColor:`var(--color-primary)`}:{})},{default:V(()=>[z(w(r.$t(`@76872:拉取`))+` `,1),r.needsPull?(N(),a(`span`,Nn,`(`+w(r.gitStore.branchBehind)+`)`,1)):o(`v-if`,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`style`])]),_:1},8,[`content`]),y(d,{content:`git fetch --all`,placement:`top`},{default:V(()=>[y(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:V(()=>[z(w(r.$t(`@76872:获取所有远程分支`)),1)]),_:1},8,[`icon`,`loading`])]),_:1})])]),o(` 组合操作 `),W(`div`,Pn,[W(`div`,Fn,w(r.$t(`@76872:组合操作`)),1),W(`div`,In,[y(d,{content:r.gitStore.hasConflictedFiles?r.$t(`@76872:存在冲突文件,请先解决冲突`):`git add + git commit`,placement:`top`},{default:V(()=>[y(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:V(()=>[z(w(r.$t(`@76872:暂存并提交`)),1)]),_:1},8,[`icon`,`loading`,`disabled`])]),_:1},8,[`content`]),y(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`])])]),o(` 重置操作 `),W(`div`,Ln,[W(`div`,Rn,w(r.$t(`@76872:重置操作`)),1),W(`div`,zn,[y(d,{content:r.stagedFilesCount>0?`${r.$t(`@76872:撤销`)}${r.stagedFilesCount}${r.$t(`@76872:个已暂存文件`)}`:`git reset HEAD`,placement:`top`},{default:V(()=>[y(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:V(()=>[z(w(r.$t(`@76872:重置暂存区`))+` `,1),r.stagedFilesCount>0?(N(),a(`span`,Bn,`(`+w(r.stagedFilesCount)+`)`,1)):o(`v-if`,!0)]),_:1},8,[`icon`,`onClick`,`loading`,`disabled`])]),_:1},8,[`content`]),y(r.ResetToRemoteButton,{variant:`text`})])]),o(` 分支操作 `),W(`div`,Vn,[W(`div`,Hn,w(r.$t(`@76872:分支操作`)),1),W(`div`,Un,[y(r.MergeBranchButton,{variant:`text`})])]),o(` 储藏操作 `),W(`div`,Wn,[W(`div`,Gn,w(r.$t(`@76872:储藏操作`)),1),W(`div`,Kn,[y(r.StashChangesButton,{variant:`text`}),y(r.StashListButton,{variant:`text`})])]),o(` 标签操作 `),W(`div`,qn,[W(`div`,Jn,w(r.$t(`@TAG01:标签操作`)),1),W(`div`,Yn,[y(r.CreateTagButton,{variant:`text`}),y(r.TagListButton,{variant:`text`})])])])])]),_:1},8,[`modelValue`,`title`]),o(` Pull 失败错误详情弹窗 `),y(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:V(()=>[W(`div`,Xn,[W(`div`,{class:g([`pull-error-type`,r.pullErrorInfo.needsMerge?`is-warning`:`is-error`])},[y(c,{class:`pull-error-icon`},{default:V(()=>[y(r.InfoFilled)]),_:1}),r.pullErrorInfo.needsMerge?(N(),a(`span`,Zn,w(r.$t(`@76872:本地存在未提交的更改,与远程内容冲突,请先处理本地更改后再拉取。`)),1)):(N(),a(`span`,Qn,w(r.$t(`@76872:执行 git pull 时发生错误,请查看详细信息。`)),1))],2),W(`div`,$n,[W(`div`,er,w(r.$t(`@76872:错误详情`))+`:`,1),W(`pre`,tr,w(r.pullErrorInfo.fullError||r.pullErrorInfo.error),1)])])]),_:1},8,[`modelValue`,`title`,`confirm-text`])])}var rr=q(En,[[`render`,nr],[`__scopeId`,`data-v-3357e454`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/GitOperationsButton.vue`]]);T();var ir=C({__name:`GlobalLoading`,props:{visible:{type:Boolean,required:!1,default:!1},text:{type:String,required:!1,default:K(`@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}});T(),b(),B();var ar={class:`loading-container`},or={class:`loading-text`},sr={key:0,class:`loading-progress`};function cr(e,t,n,r,i,s){return N(),O(we,{to:`body`},[y(H,{name:`loading-fade`},{default:V(()=>[n.visible||n.mock?(N(),a(`div`,{key:0,class:`global-loading-overlay`,onClick:t[0]||=xe(()=>{},[`stop`])},[W(`div`,ar,[o(` 主加载器 `),t[1]||=W(`div`,{class:`loading-spinner`},[W(`div`,{class:`spinner-ring`}),W(`div`,{class:`spinner-ring`}),W(`div`,{class:`spinner-ring`})],-1),o(` 加载文字 `),W(`div`,or,w(n.text),1),o(` 进度条(可选/Mock) `),n.showProgress||n.mock?(N(),a(`div`,sr,[W(`div`,{class:g([`progress-bar`,{"is-mock":n.mock&&!n.showProgress}]),style:m(n.showProgress?{width:n.progress+`%`}:void 0)},null,6)])):o(`v-if`,!0)])])):o(`v-if`,!0)]),_:1})])}var lr=q(ir,[[`render`,cr],[`__scopeId`,`data-v-77e24a5f`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/GlobalLoading.vue`]]);T();var ur=C({__name:`SuccessModal`,props:{visible:{type:Boolean,required:!1,default:!1},text:{type:String,required:!1,default:K(`@71545:操作成功!`)},description:{type:String,required:!1,default:``}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});T(),b(),B();var dr={class:`success-container`},fr={class:`success-text`},pr={key:0,class:`success-description`};function mr(e,t,n,r,i,s){return N(),O(we,{to:`body`},[y(H,{name:`success-fade`},{default:V(()=>[n.visible?(N(),a(`div`,{key:0,class:`success-overlay`,onClick:t[0]||=xe(()=>{},[`stop`])},[W(`div`,dr,[o(` 成功图标 `),t[1]||=W(`div`,{class:`success-icon`},[W(`svg`,{viewBox:`0 0 52 52`,class:`success-svg`},[W(`circle`,{class:`success-circle`,cx:`26`,cy:`26`,r:`25`,fill:`none`}),W(`path`,{class:`success-check`,fill:`none`,d:`m14.1 27.2l7.1 7.2 16.7-16.8`})])],-1),o(` 成功文字 `),W(`div`,fr,w(n.text),1),o(` 描述文字 `),n.description?(N(),a(`div`,pr,w(n.description),1)):o(`v-if`,!0)])])):o(`v-if`,!0)]),_:1})])}var hr=q(ur,[[`render`,mr],[`__scopeId`,`data-v-30ab4535`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/SuccessModal.vue`]]);L();var Q=ce({visible:!1,text:K(`@F2A3A:加载中...`),showProgress:!1,progress:0});function gr(){return{loadingState:Q,show:e=>{Q.visible=!0,Q.text=e?.text||K(`@F2A3A:加载中...`),Q.showProgress=e?.showProgress||!1,Q.progress=e?.progress||0},hide:()=>{Q.visible=!1},updateProgress:e=>{Q.progress=Math.max(0,Math.min(100,e))},updateText:e=>{Q.text=e},setText:e=>{Q.visible&&(Q.text=e)}}}L();var $=ce({visible:!1,text:K(`@B8591:操作成功!`),description:``});function _r(){let e=e=>{$.visible=!0,$.text=e?.text||K(`@B8591:操作成功!`),$.description=e?.description||``;let n=e?.duration||2e3;setTimeout(()=>{t()},n)},t=()=>{$.visible=!1};return{successState:$,show:e,hide:t}}T();var vr=C({__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=Y(),a=J(),o=e,s=n,c=i(()=>r.fileList.some(e=>!Z(e.path,a.lockedFiles))),l=i(()=>r.isSelectionMode&&r.selectedFiles.size>0&&r.selectedUnstagedPaths.length>0),d=i(()=>r.hasConflictedFiles?!0:r.isSelectionMode?!l.value||!o.hasUserCommitMessage:!c.value||!o.hasUserCommitMessage),f=i(()=>r.isAddingFiles||r.isCommiting),p=i(()=>r.hasConflictedFiles?K(`@2E184:存在冲突文件,请先解决冲突`):r.isSelectionMode?r.selectedFiles.size===0?K(`@2E184:请先勾选要提交的文件`):r.selectedUnstagedPaths.length===0?K(`@2E184:所选文件无需暂存或被锁定`):o.hasUserCommitMessage?K(`@2E184:一键完成:仅暂存所选文件 → 提交`):K(`@2E184:请输入提交信息`):c.value?o.hasUserCommitMessage?K(`@2E184:一键完成:暂存所有更改 → 提交`):K(`@2E184:请输入提交信息`):K(`@2E184:没有需要提交的更改`)),m=i(()=>r.isSelectionMode&&l.value?K(`@2E184:一键提交所选`):K(`@2E184:一键提交`)),h=i(()=>o.from===`form`?r.isSelectionMode&&l.value?K(`@2E184:暂存所选 + 提交`):K(`@2E184:暂存 + 提交`):``);async function g(){s(`beforeCommit`);try{let e=await r.stageSelectedAndCommit(o.finalCommitMessage,o.skipHooks);e&&s(`clearFields`),s(`afterCommit`,e)}catch(e){console.error(`一键提交失败:`,e),s(`afterCommit`,!1)}}t({triggerQuickCommit:g});let _={gitStore:r,configStore:a,props:o,emit:s,hasAnyChanges:c,hasSelectedToStage:l,isDisabled:d,isLoading:f,tooltipText:p,buttonTitle:m,buttonDesc:h,handleQuickCommit:g,get ElTooltip(){return u},get Edit(){return he}};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}});T(),b();var yr={class:`one-commit-content`},br={class:`one-commit-text`},xr={class:`one-commit-title`},Sr={key:0,class:`one-commit-desc`};function Cr(e,t,n,r,i,s){let c=h,l=_;return N(),a(`div`,null,[y(r.ElTooltip,{content:r.tooltipText,placement:`top`,"show-after":200},{default:V(()=>[y(l,{type:`primary`,onClick:r.handleQuickCommit,loading:r.isLoading,disabled:r.isDisabled,class:g([n.from,`one-commit-button`])},{default:V(()=>[W(`div`,yr,[y(c,{class:`one-commit-icon`},{default:V(()=>[y(r.Edit)]),_:1}),W(`div`,br,[W(`span`,xr,w(r.buttonTitle),1),n.from===`form`?(N(),a(`span`,Sr,w(r.buttonDesc),1)):o(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}var wr=q(vr,[[`render`,Cr],[`__scopeId`,`data-v-0c962829`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/buttons/QuickCommitButton.vue`]]);T(),L();var Tr=C({__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`}},emits:[`afterCommit`,`afterPush`,`beforePush`,`pushStart`,`clearFields`],setup(e,{expose:t,emit:n}){let r=n,i=U(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`)}async function u(){return i.value?.triggerQuickPush()}t({triggerQuickPush:u});let d={emit:r,quickPushRef:i,handleAfterCommit:a,handleAfterPush:o,handleBeforePush:s,handlePushStart:c,handleClearFields:l,triggerQuickPush:u,StageButton:Ve,CommitButton:Ge,PushButton:yt,QuickPushButton:Et,QuickCommitButton:wr};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}});T();var Er={class:`form-bottom-actions`},Dr={class:`actions-flex-container`},Or={class:`left-actions`},kr={class:`button-grid`},Ar={class:`right-actions`};function jr(e,t,n,r,i,o){return N(),a(`div`,Er,[W(`div`,Dr,[W(`div`,Or,[W(`div`,kr,[y(r.StageButton,{onClick:()=>{},from:n.from},null,8,[`from`]),y(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`]),y(r.PushButton,{onBeforePush:()=>{},onAfterPush:r.handleAfterPush,onClick:()=>{},from:n.from},null,8,[`from`])])]),W(`div`,Ar,[y(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`]),y(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`])])])])}var Mr=q(Tr,[[`render`,jr],[`__scopeId`,`data-v-12b4dc63`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/GitActionButtons.vue`]]);T(),L();var Nr=C({__name:`CommandHistory`,setup(e,{expose:t}){t();let n=Y(),r=U([]),a=U(!1);function o(e){return Array.isArray(e)?e.join(` `):e==null?``:String(e)}let s=U(!1),c=U(!1),l=U(!1),u=U(new Set),d=U(!1),f=U(!1),m=U(`all`),h=U(`all`),g=U(``),_=i(()=>{let e=r.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=i(()=>r.value.filter(e=>e.success).length),y=i(()=>r.value.filter(e=>!e.success).length),b=i(()=>r.value.filter(e=>o(e.command).startsWith(`git `)).length),S=i(()=>r.value.filter(e=>!o(e.command).startsWith(`git `)).length);function C(){f.value=!0,r.value.length===0&&w()}async function w(){try{if(a.value=!0,n.socket&&n.socket.connected)n.socket.emit(`request_full_history`);else{let e=await(await fetch(`/api/command-history`)).json();e.success?r.value=e.history:F.error(`${K(`@81F0F:加载命令历史失败: `)}${e.error}`)}}catch(e){F.error(`${K(`@81F0F:加载命令历史失败: `)}${e.message}`)}finally{a.value=!1}}async function T(){if(_.value.length===0){F.warning(K(`@81F0F:没有可复制的命令历史`));return}try{c.value=!0;let e=_.value.map(e=>{let t=`# ${D(e.timestamp)}${K(`@81F0F: (耗时: `)}${O(e.executionTime)}) - ${e.success?K(`@81F0F:成功`):K(`@81F0F:失败`)}\n`;if(t+=`${o(e.command)}\n`,e.stdout&&(t+=`\n# 输出:\n${e.stdout}\n`),e.stderr){let n=N(e.command)?K(`@81F0F:输出信息`):K(`@81F0F:错误输出`);t+=`\n# ${n}:\n${e.stderr}\n`}return e.error&&(t+=`\n# 错误信息:\n${e.error}\n`),t}).join(`
2
+ ---
3
+
4
+ `);await navigator.clipboard.writeText(e),F({message:K(`@81F0F:命令历史已复制到剪贴板`),type:`success`,zIndex:1e5})}catch(e){F.error(`${K(`@81F0F:复制失败: `)}${e.message}`)}finally{c.value=!1}}async function E(){if(_.value.length===0){F.warning(K(`@81F0F:没有可复制的命令`));return}try{d.value=!0;let e=_.value.map(e=>o(e.command)).join(`
5
+ `);await navigator.clipboard.writeText(e),F({message:K(`@81F0F:命令列表已复制到剪贴板`),type:`success`,zIndex:1e5})}catch(e){F.error(`${K(`@81F0F:复制失败: `)}${e.message}`)}finally{d.value=!1}}async function ee(){try{if(await R.confirm(K(`@81F0F:确定要清空所有命令历史记录吗?此操作不可恢复。`),K(`@81F0F:清空命令历史`),{confirmButtonText:K(`@81F0F:确定`),cancelButtonText:K(`@81F0F:取消`),type:`warning`}),s.value=!0,n.socket&&n.socket.connected)n.socket.emit(`clear_command_history`);else{let e=await(await fetch(`/api/clear-command-history`,{method:`POST`,headers:{"Content-Type":`application/json`}})).json();e.success?(r.value=[],F.success(K(`@81F0F:命令历史已清空`))):F.error(`${K(`@81F0F:清空命令历史失败: `)}${e.error}`)}}catch(e){e!==`cancel`&&e.toString()!==`Error: cancel`&&F.error(`${K(`@81F0F:清空命令历史失败: `)}${e.message}`)}finally{s.value=!1}}function D(e){return new Date(e).toLocaleString()}function O(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(2)}s`}function k(e){u.value.has(e)?u.value.delete(e):u.value.add(e)}function te(e){return u.value.has(e)}async function j(e){try{await navigator.clipboard.writeText(e),F({message:K(`@81F0F:命令已复制到剪贴板`),type:`success`,zIndex:1e5})}catch(e){F.error(`${K(`@81F0F:复制失败: `)}${e.message}`)}}function M(e){return e.includes(`git push`)||e.includes(`git-push`)}function N(e){return!!M(o(e))}async function P(e){try{let t=``;if(e.stdout&&(t+=`标准输出:\n${e.stdout}\n\n`),e.stderr){let n=N(e.command)?K(`@81F0F:输出信息`):K(`@81F0F:错误输出`);t+=`${n}:\n${e.stderr}\n\n`}e.error&&(t+=`错误信息:\n${e.error}`),await navigator.clipboard.writeText(t.trim()),F({message:K(`@81F0F:输出已复制到剪贴板`),type:`success`,zIndex:1e5})}catch(e){F.error(`${K(`@81F0F:复制失败: `)}${e.message}`)}}function re(){if(!n.socket){console.error(K(`@81F0F:Socket实例不可用`));return}n.socket.on(`initial_command_history`,e=>{r.value=e.history,l.value=!0}),n.socket.on(`command_history_update`,e=>{r.value.unshift(e.newCommand),r.value.length>100&&r.value.pop(),l.value=!0}),n.socket.on(`full_command_history`,e=>{r.value=e.history,a.value=!1,l.value=!0}),n.socket.on(`command_history_cleared`,e=>{e.success&&(r.value=[],F.success(K(`@81F0F:命令历史已清空`))),s.value=!1}),n.socket.on(`connect`,()=>{l.value=!0,F.success(K(`@81F0F:已连接到实时命令历史`))}),n.socket.on(`disconnect`,()=>{l.value=!1,F.warning(K(`@81F0F:实时命令历史连接已断开`))})}function I(){n.socket&&(n.socket.off(`initial_command_history`),n.socket.off(`command_history_update`),n.socket.off(`full_command_history`),n.socket.off(`command_history_cleared`))}_e(()=>{re(),n.socket||(console.log(K(`@81F0F:尝试初始化Socket连接`)),n.initSocketConnection())}),p(()=>{I()});let L={gitStore:n,commandHistory:r,isLoading:a,normalizeCommand:o,isClearingHistory:s,isCopyingHistory:c,hasSocketConnection:l,expandedItems:u,isCopyingCommands:d,dialogVisible:f,filterStatus:m,filterCommandType:h,searchKeyword:g,filteredCommandHistory:_,successCount:v,errorCount:y,gitCommandCount:b,otherCommandCount:S,openCommandHistory:C,loadHistory:w,copyAllHistory:T,copyCommandsOnly:E,clearCommandHistory:ee,formatTimestamp:D,formatExecutionTime:O,toggleExpand:k,isExpanded:te,copyCommand:j,isGitPushCommand:M,isStderrNormalOutput:N,copyOutput:P,initSocketListeners:re,cleanupSocketListeners:I,get $t(){return K},get Delete(){return be},get CopyDocument(){return me},get ArrowDown(){return ge},get ArrowUp(){return ne},get Clock(){return ve},get Loading(){return x},get Search(){return A},CommonDialog:X,IconButton:De};return Object.defineProperty(L,"__isScriptSetup",{enumerable:!1,value:!0}),L}});T(),b(),B();var Pr={class:`dialog-toolbar`},Fr={class:`filter-controls`},Ir={class:`toolbar-actions`},Lr=[`disabled`],Rr={class:`btn-text`},zr=[`disabled`],Br={class:`btn-text`},Vr=[`disabled`],Hr={class:`btn-text`},Ur={class:`history-scroll`},Wr={key:0,class:`loading-state`},Gr={class:`loading-text`},Kr={key:3,class:`history-list`},qr=[`onClick`],Jr={class:`command-info`},Yr={class:`command-text`},Xr={class:`command-meta`},Zr={class:`timestamp`},Qr={class:`duration`},$r={class:`item-actions`},ei={key:0,class:`item-details`},ti={key:0,class:`output-section`},ni={class:`output-header`},ri=[`onClick`],ii={class:`output-content`},ai={key:0,class:`truncation-notice`},oi={class:`output-header`},si={class:`output-content`},ci={key:0,class:`truncation-notice`},li={key:2,class:`output-section error`},ui={class:`output-header`},di={class:`output-content`};function fi(e,t,n,r,i,l){let d=h,p=f,m=S,_=s,v=j,b=u,x=Ce,C=c;return N(),a(G,null,[o(` 命令历史按钮 `),y(r.IconButton,{tooltip:r.$t(`@81F0F:查看Git命令历史`),size:`large`,onClick:r.openCommandHistory},{default:V(()=>[y(d,null,{default:V(()=>[y(r.Clock)]),_:1})]),_:1},8,[`tooltip`]),o(` 命令历史弹窗(使用 CommonDialog) `),y(r.CommonDialog,{modelValue:r.dialogVisible,"onUpdate:modelValue":t[3]||=e=>r.dialogVisible=e,title:r.$t(`@81F0F:Git 命令历史`),"destroy-on-close":``,"custom-class":`command-history-dialog`,"append-to-body":!0},{default:V(()=>[W(`div`,Pr,[y(p,{type:r.hasSocketConnection?`success`:`danger`,size:`small`,effect:`dark`,class:`socket-status`},{default:V(()=>[z(w(r.hasSocketConnection?r.$t(`@81F0F:实时更新`):r.$t(`@81F0F:未连接`)),1)]),_:1},8,[`type`]),o(` 筛选控件 `),W(`div`,Fr,[o(` 状态筛选 `),y(_,{modelValue:r.filterStatus,"onUpdate:modelValue":t[0]||=e=>r.filterStatus=e,size:`small`,class:`filter-select`},{default:V(()=>[y(m,{label:`全部状态`,value:`all`}),y(m,{label:`成功 (${r.successCount})`,value:`success`},null,8,[`label`]),y(m,{label:`失败 (${r.errorCount})`,value:`error`},null,8,[`label`])]),_:1},8,[`modelValue`]),o(` 命令类型筛选 `),y(_,{modelValue:r.filterCommandType,"onUpdate:modelValue":t[1]||=e=>r.filterCommandType=e,size:`small`,class:`filter-select`},{default:V(()=>[y(m,{label:`全部命令`,value:`all`}),y(m,{label:`Git 命令 (${r.gitCommandCount})`,value:`git`},null,8,[`label`]),y(m,{label:`其他命令 (${r.otherCommandCount})`,value:`other`},null,8,[`label`])]),_:1},8,[`modelValue`]),o(` 搜索框 `),y(v,{modelValue:r.searchKeyword,"onUpdate:modelValue":t[2]||=e=>r.searchKeyword=e,size:`small`,placeholder:`搜索命令或输出...`,clearable:``,class:`search-input`},{prefix:V(()=>[y(d,null,{default:V(()=>[y(r.Search)]),_:1})]),_:1},8,[`modelValue`])]),W(`div`,Ir,[y(b,{content:r.$t(`@81F0F:只复制命令列表(不含输出)`),placement:`bottom`,effect:`dark`,"show-after":200},{default:V(()=>[W(`button`,{class:`modern-btn copy-commands-button enhanced-btn`,onClick:r.copyCommandsOnly,disabled:r.filteredCommandHistory.length===0||r.isCopyingCommands},[r.isCopyingCommands?(N(),O(d,{key:1,class:`btn-icon is-loading`},{default:V(()=>[y(r.Loading)]),_:1})):(N(),O(d,{key:0,class:`btn-icon`},{default:V(()=>[y(r.CopyDocument)]),_:1})),W(`span`,Rr,w(r.$t(`@81F0F:命令`)),1)],8,Lr)]),_:1},8,[`content`]),y(b,{content:r.$t(`@81F0F:复制完整命令历史(含输出)`),placement:`bottom`,effect:`dark`,"show-after":200},{default:V(()=>[W(`button`,{class:`modern-btn copy-all-button enhanced-btn`,onClick:r.copyAllHistory,disabled:r.filteredCommandHistory.length===0||r.isCopyingHistory},[r.isCopyingHistory?(N(),O(d,{key:1,class:`btn-icon is-loading`},{default:V(()=>[y(r.Loading)]),_:1})):(N(),O(d,{key:0,class:`btn-icon`},{default:V(()=>[y(r.CopyDocument)]),_:1})),W(`span`,Br,w(r.$t(`@81F0F:全部`)),1)],8,zr)]),_:1},8,[`content`]),y(b,{content:r.$t(`@81F0F:清空命令历史`),placement:`bottom`,effect:`dark`,"show-after":200},{default:V(()=>[W(`button`,{class:`modern-btn clear-button enhanced-btn danger-btn`,onClick:r.clearCommandHistory,disabled:r.commandHistory.length===0||r.isClearingHistory},[r.isClearingHistory?(N(),O(d,{key:1,class:`btn-icon is-loading`},{default:V(()=>[y(r.Loading)]),_:1})):(N(),O(d,{key:0,class:`btn-icon`},{default:V(()=>[y(r.Delete)]),_:1})),W(`span`,Hr,w(r.$t(`@81F0F:清空`)),1)],8,Vr)]),_:1},8,[`content`])])]),W(`div`,Ur,[r.isLoading&&r.commandHistory.length===0?(N(),a(`div`,Wr,[y(d,{class:`loading-icon is-loading`},{default:V(()=>[y(r.Loading)]),_:1}),W(`div`,Gr,w(r.$t(`@81F0F:加载命令历史...`)),1)])):r.commandHistory.length===0?(N(),O(x,{key:1,description:r.$t(`@81F0F:暂无命令历史`)},null,8,[`description`])):r.filteredCommandHistory.length===0?(N(),O(x,{key:2,description:r.$t(`@81F0F:没有匹配的命令`)},null,8,[`description`])):(N(),a(`div`,Kr,[(N(!0),a(G,null,P(r.filteredCommandHistory,(e,t)=>(N(),a(`div`,{key:t,class:g([`history-item`,{"is-error":!e.success}])},[W(`div`,{class:`item-header`,onClick:e=>r.toggleExpand(t)},[W(`div`,Jr,[W(`div`,Yr,[y(p,{size:`small`,type:e.success?`success`:`danger`,effect:`dark`,class:`status-tag`},{default:V(()=>[z(w(e.success?r.$t(`@81F0F:成功`):r.$t(`@81F0F:失败`)),1)]),_:2},1032,[`type`]),W(`code`,null,w(r.normalizeCommand(e.command)),1)]),W(`div`,Xr,[W(`span`,Zr,w(r.formatTimestamp(e.timestamp)),1),W(`span`,Qr,w(r.$t(`@81F0F:耗时: `))+w(r.formatExecutionTime(e.executionTime)),1)])]),W(`div`,$r,[y(r.IconButton,{tooltip:r.$t(`@81F0F:复制命令`),"custom-class":`item-copy-button`,onClick:xe(t=>r.copyCommand(r.normalizeCommand(e.command)),[`stop`])},{default:V(()=>[y(d,null,{default:V(()=>[y(r.CopyDocument)]),_:1})]),_:1},8,[`tooltip`,`onClick`]),W(`div`,{class:g([`expand-button`,{"is-expanded":r.isExpanded(t)}])},[y(d,{class:`btn-icon`},{default:V(()=>[r.isExpanded(t)?(N(),O(r.ArrowUp,{key:0})):(N(),O(r.ArrowDown,{key:1}))]),_:2},1024)],2)])],8,qr),r.isExpanded(t)?(N(),a(`div`,ei,[e.stdout?(N(),a(`div`,ti,[W(`div`,ni,[W(`h4`,null,w(r.$t(`@81F0F:标准输出`)),1),y(b,{content:r.$t(`@81F0F:复制输出`),placement:`bottom`,effect:`dark`,"show-after":200},{default:V(()=>[W(`button`,{class:`modern-btn output-copy-button enhanced-btn`,onClick:t=>r.copyOutput(e)},[y(d,{class:`btn-icon`},{default:V(()=>[y(r.CopyDocument)]),_:1})],8,ri)]),_:2},1032,[`content`])]),W(`pre`,ii,w(e.stdout),1),e.isStdoutTruncated?(N(),a(`div`,ai,[y(C,{type:`info`,closable:!1,"show-icon":``},{default:V(()=>[z(w(r.$t(`@81F0F:输出内容过长已被截断,请直接执行命令查看完整输出`)),1)]),_:1})])):o(`v-if`,!0)])):o(`v-if`,!0),e.stderr?(N(),a(`div`,{key:1,class:g([`output-section`,r.isStderrNormalOutput(e.command)?``:`error`])},[W(`div`,oi,[W(`h4`,null,w(r.isStderrNormalOutput(e.command)?r.$t(`@81F0F:输出信息`):r.$t(`@81F0F:错误输出`)),1)]),W(`pre`,si,w(e.stderr),1),e.isStderrTruncated?(N(),a(`div`,ci,[y(C,{type:`info`,closable:!1,"show-icon":``},{default:V(()=>[z(w(r.isStderrNormalOutput(e.command)?r.$t(`@81F0F:输出信息`):r.$t(`@81F0F:错误输出`))+w(r.$t(`@81F0F:内容过长已被截断,请直接执行命令查看完整输出`)),1)]),_:2},1024)])):o(`v-if`,!0)],2)):o(`v-if`,!0),e.error?(N(),a(`div`,li,[W(`div`,ui,[W(`h4`,null,w(r.$t(`@81F0F:错误信息`)),1)]),W(`pre`,di,w(e.error),1)])):o(`v-if`,!0)])):o(`v-if`,!0)],2))),128))]))])]),_:1},8,[`modelValue`,`title`])],64)}var pi=q(Nr,[[`render`,fi],[`__scopeId`,`data-v-7bd5b1e2`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/views/components/CommandHistory.vue`]]);T(),L();var mi=C({__name:`CommitForm`,setup(e,{expose:t}){t();let n=U(!1);async function r(){if(!n.value){n.value=!0;try{let e=a.isSelectionMode&&a.selectedFiles.size>0?[...a.selectedFiles]:[],t=Oe(),n=await(await fetch(`/api/config/generate-commit-message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({selectedPaths:e,locale:t.currentLocale})})).json();if(!n.success){let e=n.code,t=n.error||K(`@76872:AI生成失败`),r=e?{TIMEOUT:`@76872:AI生成超时,请重试或检查模型响应速度`,NO_MODEL:`@76872:未配置AI模型,请先在通用设置中添加模型`,NO_JSON:`@76872:AI未返回有效结果,请重试`,PARSE_FAILED:`@76872:AI返回格式无法解析,请重试`,GENERATE_FAILED:`@76872:AI生成失败`,HTTP_ERR:`@76872:AI生成失败`}[e]:null;F.error(r?K(r):t);return}let r=[`feat`,`fix`,`docs`,`style`,`refactor`,`test`,`chore`];if(h.value)n.type&&r.includes(n.type)&&(g.value=n.type),n.scope!==void 0&&(_.value=n.scope),n.description&&(v.value=n.description);else{let e=n.type&&n.description?n.scope?`${n.type}(${n.scope}): ${n.description}`:`${n.type}: ${n.description}`:n.description||``;e&&(s.value=e)}F.success(K(`@76872:AI已生成提交信息`))}catch(e){F.error(`${K(`@76872:AI生成失败`)}: ${e.message}`)}finally{n.value=!1}}}let a=Y(),o=J(),s=U(``),{loadingState:c,show:l,hide:u,setText:d}=gr(),{successState:f}=_r(),p=U(!1),m=U(``),h=i({get:()=>o.isStandardCommit,set:e=>{o.isStandardCommit=e}}),g=U(`feat`),_=U(``),v=U(``),y=U(``),b=U(``),S=U([]),C=U(!1),w=U([]),T=U(!1),E=U(!1),ee=i({get:()=>o.skipHooks,set:e=>{o.skipHooks=e}}),D=i({get:()=>o.autoQuickPushOnEnter,set:e=>{o.autoQuickPushOnEnter=e}}),O=U(null),k=U(!1),te=i(()=>[{value:`feat`,label:`feat: ${K(`@76872:新功能`)}`},{value:`fix`,label:`fix: ${K(`@76872:修复bug`)}`},{value:`docs`,label:`docs: ${K(`@76872:文档修改`)}`},{value:`style`,label:`style: ${K(`@76872:样式修改`)}`},{value:`refactor`,label:`refactor: ${K(`@76872:代码重构`)}`},{value:`test`,label:`test: ${K(`@76872:测试代码`)}`},{value:`chore`,label:`chore: ${K(`@76872:构建/工具修改`)}`}]),A=U([]),j=i(()=>{if(!h.value)return s.value||m.value;let e=`${g.value||``}`;return _.value&&(e+=`(${_.value})`),e+=`: ${v.value}`,y.value&&(e+=`\n\n${y.value}`),b.value&&(e+=`\n\n${b.value}`),e}),M=i(()=>h.value?(a.isMergeInProgress||(g.value||``).trim()!==``)&&(v.value||``).trim()!==``:s.value.trim()!==``),ne=i(()=>a.hasConflictedFiles?!0:a.isMergeInProgress?!M.value:!a.fileList.some(e=>!Z(e.path,o.lockedFiles))||!M.value),N=i(()=>{let e=`${K(`@76872:输入提交信息 (默认: `)}${m.value})`;return D.value?`${e}${K(`@76872:(按回车一键推送)`)}`:e}),P=i(()=>{let e=K(`@76872:简短描述(必填)`);return D.value?K(`@76872:简短描述(必填,按回车一键推送)`):e}),re=i(()=>{let e=`git commit -m "${j.value}"`;return ee.value&&(e+=` --no-verify`),e});function I(){let e=o.config;e&&(m.value=e.defaultCommitMessage||``,e.descriptionTemplates&&Array.isArray(e.descriptionTemplates)&&(S.value=e.descriptionTemplates),e.scopeTemplates&&Array.isArray(e.scopeTemplates)&&(w.value=e.scopeTemplates),e.messageTemplates&&Array.isArray(e.messageTemplates)&&(A.value=e.messageTemplates))}function L(e){v.value=e,C.value=!1}function ie(e){_.value=e,T.value=!1}function ae(){C.value=!0}function oe(){T.value=!0}function se(){s.value=``,v.value=``,y.value=``,b.value=``,g.value=`feat`,o.autoSetDefaultMessage&&o.defaultCommitMessage&&(h.value?v.value=o.defaultCommitMessage:s.value=o.defaultCommitMessage)}function ce(){l({text:K(`@76872:正在暂存文件…`),showProgress:!1})}function R(){u()}function ue(e){if(u(),e){p.value=!0;try{setTimeout(async()=>{try{console.log(K(`@76872:推送成功,状态已更新`))}catch(e){console.error(`一键推送后处理失败:`,e)}finally{p.value=!1}},1e3)}catch(e){console.error(`一键推送后处理失败:`,e),p.value=!1}}}function de(e){s.value=e,E.value=!1}async function z(e){if(!D.value||!M.value)return;let t=a.fileList.some(e=>!Z(e.path,o.lockedFiles)),n=a.hasConflictedFiles;if(t&&M.value&&a.hasUpstream&&!n&&e.key===`Enter`&&!e.shiftKey){e.preventDefault();try{await O.value?.triggerQuickPush()}catch(e){console.error(`回车自动一键提交失败:`,e)}}}async function fe(e){try{await o.saveDefaultMessage(e)&&F.success(K(`@76872:默认提交信息设置成功`))}catch(e){F.error(`${K(`@76872:设置默认提交信息失败: `)}${e.message}`)}}le(()=>a.pendingMergeMessage,e=>{e&&(h.value?(g.value=``,v.value=e):s.value=e,a.pendingMergeMessage=``,F.info(K(`@76872:已自动填充合并提交信息`)))}),le(()=>a.isAddingFiles,e=>{e&&c.visible&&d(K(`@76872:正在暂存文件…`))}),le(()=>a.isCommiting,e=>{e&&c.visible&&d(K(`@76872:正在提交更改...`))}),le(()=>a.isPushing,e=>{e&&c.visible&&u()}),_e(async()=>{le(()=>o.config,I,{immediate:!0}),o.config||await o.loadConfig(),o.autoSetDefaultMessage&&o.defaultCommitMessage&&(h.value?v.value||=o.defaultCommitMessage:s.value||=o.defaultCommitMessage),a.pendingMergeMessage&&(h.value?(g.value=``,v.value=a.pendingMergeMessage):s.value=a.pendingMergeMessage,a.pendingMergeMessage=``,F.info(K(`@76872:已自动填充合并提交信息`)))});function B(e,t){t([...e?S.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):S.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function pe(e,t){t([...e?w.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):w.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function V(e){e.isSettings?(ae(),v.value=``):v.value=e.value}function me(e){e.isSettings?(oe(),_.value=``):_.value=e.value}function he(e,t){t([...e?A.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):A.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function ve(e){e.isSettings?(E.value=!0,s.value=``):s.value=e.value}let H={aiGenerating:n,handleAiGenerateCommit:r,gitStore:a,configStore:o,commitMessage:s,loadingState:c,showLoading:l,hideLoading:u,setLoadingText:d,successState:f,isUpdatingStatus:p,defaultCommitMessage:m,isStandardCommit:h,commitType:g,commitScope:_,commitDescription:v,commitBody:y,commitFooter:b,descriptionTemplates:S,descriptionDialogVisible:C,scopeTemplates:w,scopeDialogVisible:T,defaultMessageDialogVisible:E,skipHooks:ee,autoQuickPushOnEnter:D,gitActionButtonsRef:O,showAdvancedFields:k,commitTypeOptions:te,messageTemplates:A,finalCommitMessage:j,hasUserCommitMessage:M,isCommitDisabled:ne,commitMessagePlaceholder:N,descriptionPlaceholder:P,gitCommandPreview:re,updateFromConfig:I,useTemplate:L,useScopeTemplate:ie,openDescriptionSettings:ae,openScopeSettings:oe,clearCommitFields:se,handleQuickPushBefore:ce,handlePushStart:R,handleQuickPushAfter:ue,useMessageTemplate:de,handleEnterKey:z,setDefaultFromTemplate:fe,queryDescriptionTemplates:B,queryScopeTemplates:pe,handleDescriptionSelect:V,handleScopeSelect:me,queryMessageTemplates:he,handleMessageSelect:ve,get $t(){return K},get Loading(){return x},get ArrowDown(){return ge},GlobalLoading:lr,SuccessModal:hr,TemplateManager:Ae,GitCommandPreview:Me,GitActionButtons:Mr,CommandHistory:pi,IconButton:De};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}});T(),b(),B();var hi={class:`card-header app-card-header`},gi={class:`header-left`},_i={class:`header-right`},vi={class:`card-content app-card-content`},yi={class:`layout-container`},bi={key:0,class:`git-config-warning`},xi={key:0,class:`merge-in-progress-banner`},Si={class:`commit-section`},Ci={key:0,class:`commit-form`},wi={class:`description-container`},Ti={class:`standard-commit-form`},Ei={class:`standard-commit-header`},Di={class:`type-scope-container`},Oi={class:`scope-wrapper`},ki={class:`description-container description-inline`},Ai=[`aria-expanded`],ji={class:`advanced-fields`},Mi={key:0,class:`status-updating-indicator`},Ni={key:0,class:`status-updating-indicator`};function Pi(e,t,n,r,i,l){let u=h,d=rr,f=c,p=Te,m=S,_=s,v=j;return N(),a(G,null,[W(`div`,{class:g([`card app-card`,{"is-pushing":r.gitStore.isPushing}])},[W(`div`,hi,[W(`div`,gi,[r.gitStore.userName!==``&&r.gitStore.userEmail!==``?(N(),O(r.GitActionButtons,{key:0,ref:`gitActionButtonsRef`,"has-user-commit-message":r.hasUserCommitMessage,"final-commit-message":r.finalCommitMessage,"skip-hooks":r.skipHooks,onAfterCommit:t[0]||=e=>{e&&r.clearCommitFields()},onAfterPush:r.handleQuickPushAfter,onBeforePush:r.handleQuickPushBefore,onPushStart:r.handlePushStart,onClearFields:r.clearCommitFields},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`])):o(`v-if`,!0)]),W(`div`,_i,[y(r.IconButton,{tooltip:r.$t(`@76872:AI生成提交信息`),"icon-class":r.aiGenerating?``:`ai-commit`,size:`medium`,disabled:r.aiGenerating,onClick:r.handleAiGenerateCommit},{default:V(()=>[r.aiGenerating?(N(),O(u,{key:0,class:`is-loading`},{default:V(()=>[y(r.Loading)]),_:1})):o(`v-if`,!0)]),_:1},8,[`tooltip`,`icon-class`,`disabled`]),y(r.CommandHistory),y(d,{class:`ml-auto`,variant:`icon`})])]),W(`div`,vi,[W(`div`,yi,[o(` 如果没有配置Git用户信息,显示提示 `),r.gitStore.userName===``||r.gitStore.userEmail===``?(N(),a(`div`,bi,[y(f,{title:r.$t(`@76872:Git用户信息未配置`),type:`warning`,closable:!1,"show-icon":``},{default:V(()=>[W(`p`,null,w(r.$t(`@76872:您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:`)),1),t[11]||=W(`pre`,{class:`config-command`},`git config --global user.name "Your Name"
6
+ git config --global user.email "your.email@example.com"`,-1)]),_:1},8,[`title`])])):(N(),a(G,{key:1},[o(` 正常的提交区域,仅在Git用户信息已配置时显示 `),o(` MERGING 状态提示 `),r.gitStore.isMergeInProgress?(N(),a(`div`,xi,[y(f,{title:r.$t(`@76872:合并进行中`),type:`warning`,closable:!1,"show-icon":``},{default:V(()=>[W(`span`,null,w(r.$t(`@76872:分支合并尚未完成,请输入提交信息后点击「提交」按钮完成合并。`)),1)]),_:1},8,[`title`])])):o(`v-if`,!0),o(` 左侧:提交表单 `),W(`div`,Si,[o(` 普通提交表单 `),r.isStandardCommit?(N(),a(G,{key:1},[o(` 标准化提交表单 `),W(`div`,Ti,[W(`div`,Ei,[W(`div`,Di,[y(_,{modelValue:r.commitType,"onUpdate:modelValue":t[2]||=e=>r.commitType=e,placeholder:r.$t(`@76872:提交类型`),class:`type-select`,clearable:``},{default:V(()=>[(N(!0),a(G,null,P(r.commitTypeOptions,e=>(N(),O(m,{key:e.value,label:e.label,value:e.value},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`]),W(`div`,Oi,[y(p,{modelValue:r.commitScope,"onUpdate:modelValue":t[3]||=e=>r.commitScope=e,"fetch-suggestions":r.queryScopeTemplates,placeholder:r.$t(`@76872:作用域(可选)`),class:`scope-input`,clearable:``,onSelect:r.handleScopeSelect},null,8,[`modelValue`,`placeholder`])]),o(` 将简短描述放入同一行 `),W(`div`,ki,[y(p,{modelValue:r.commitDescription,"onUpdate:modelValue":t[4]||=e=>r.commitDescription=e,"fetch-suggestions":r.queryDescriptionTemplates,placeholder:r.descriptionPlaceholder,class:`description-input`,clearable:``,onSelect:r.handleDescriptionSelect,onKeydown:r.handleEnterKey},null,8,[`modelValue`,`placeholder`])])])]),o(` 添加展开/收起高级选项的控制按钮 `),W(`button`,{type:`button`,class:`advanced-options-toggle`,"aria-expanded":r.showAdvancedFields,onClick:t[5]||=e=>r.showAdvancedFields=!r.showAdvancedFields},[W(`span`,null,w(r.showAdvancedFields?r.$t(`@76872:收起`):r.$t(`@76872:正文及页脚`)),1),y(u,{class:g([`toggle-icon`,{"is-active":r.showAdvancedFields}])},{default:V(()=>[y(r.ArrowDown)]),_:1},8,[`class`])],8,Ai),o(` 使用过渡效果包装高级字段 `),ye(W(`div`,ji,[y(v,{modelValue:r.commitBody,"onUpdate:modelValue":t[6]||=e=>r.commitBody=e,type:`textarea`,rows:4,placeholder:r.$t(`@76872:正文(可选):详细描述本次提交的内容和原因`),class:`body-input`,clearable:``},null,8,[`modelValue`,`placeholder`]),y(v,{modelValue:r.commitFooter,"onUpdate:modelValue":t[7]||=e=>r.commitFooter=e,placeholder:r.$t(`@76872:页脚(可选):如 Closes #123`),class:`footer-input`,clearable:``},null,8,[`modelValue`,`placeholder`])],512),[[se,r.showAdvancedFields]])])],2112)):(N(),a(`div`,Ci,[W(`div`,wi,[y(p,{modelValue:r.commitMessage,"onUpdate:modelValue":t[1]||=e=>r.commitMessage=e,"fetch-suggestions":r.queryMessageTemplates,placeholder:r.commitMessagePlaceholder,type:`textarea`,rows:3,resize:`none`,class:`commit-message-input`,onSelect:r.handleMessageSelect,onKeydown:r.handleEnterKey},null,8,[`modelValue`,`placeholder`])])])),r.isCommitDisabled?o(`v-if`,!0):(N(),O(r.GitCommandPreview,{key:2,command:r.gitCommandPreview,title:r.$t(`@76872:提交命令预览:`),placeholder:`git commit -m "<提交信息>"`},null,8,[`command`,`title`]))])],64))])])],2),o(` 简短描述模板设置 `),y(r.TemplateManager,{visible:r.descriptionDialogVisible,"onUpdate:visible":t[8]||=e=>r.descriptionDialogVisible=e,type:`description`,title:r.$t(`@76872:简短描述模板设置`),placeholder:r.$t(`@76872:输入新模板内容`),"edit-placeholder":r.$t(`@76872:编辑模板内容`),"empty-description":r.$t(`@76872:暂无保存的模板`),onUseTemplate:r.useTemplate},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),o(` 作用域设置弹窗 `),y(r.TemplateManager,{visible:r.scopeDialogVisible,"onUpdate:visible":t[9]||=e=>r.scopeDialogVisible=e,type:`scope`,title:r.$t(`@76872:作用域模板设置`),placeholder:r.$t(`@76872:输入新作用域模板`),"edit-placeholder":r.$t(`@76872:编辑作用域模板内容`),"empty-description":r.$t(`@76872:暂无保存的作用域`),onUseTemplate:r.useScopeTemplate},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),o(` 默认提交信息设置弹窗 `),y(r.TemplateManager,{visible:r.defaultMessageDialogVisible,"onUpdate:visible":t[10]||=e=>r.defaultMessageDialogVisible=e,type:`message`,title:r.$t(`@76872:默认提交信息设置`),placeholder:r.$t(`@76872:输入新模板内容`),"edit-placeholder":r.$t(`@76872:编辑模板内容`),"empty-description":r.$t(`@76872:暂无保存的模板`),"show-default-section":!0,"show-help-text":!0,onUseTemplate:r.useMessageTemplate,onSetDefault:r.setDefaultFromTemplate},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),o(` 状态更新指示器 `),y(H,{name:`el-fade-in-linear`},{default:V(()=>[r.isUpdatingStatus?(N(),a(`div`,Mi,[y(u,{class:`is-loading`},{default:V(()=>[y(r.Loading)]),_:1}),W(`span`,null,w(r.$t(`@76872:更新状态中...`)),1)])):o(`v-if`,!0)]),_:1}),o(` 全局Loading组件 `),y(r.GlobalLoading,{visible:r.loadingState.visible,text:r.loadingState.text,"show-progress":r.loadingState.showProgress,progress:r.loadingState.progress},null,8,[`visible`,`text`,`show-progress`,`progress`]),o(` 成功提示组件 `),y(r.SuccessModal,{visible:r.successState.visible,text:r.successState.text,description:r.successState.description},null,8,[`visible`,`text`,`description`]),o(` 状态更新指示器 `),y(H,{name:`el-fade-in-linear`},{default:V(()=>[r.isUpdatingStatus?(N(),a(`div`,Ni,[y(u,{class:`is-loading`},{default:V(()=>[y(r.Loading)]),_:1}),W(`span`,null,w(r.$t(`@76872:更新状态中...`)),1)])):o(`v-if`,!0)]),_:1})],64)}var Fi=q(mi,[[`render`,Pi],[`__scopeId`,`data-v-1ba78eef`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/views/components/CommitForm.vue`]]);export{Fi as default};
@@ -1 +1 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{Cn as e,E as t,En as n,Hn as r,Jr as i,Kr as a,L as o,Mn as s,Nr as c,Pn as l,Qn as u,Qr as d,Rn as f,Tn as p,Yn as m,jn as h,kn as g,nr as _,or as v,wn as y}from"./element-plus-D7LDHcAn.js";import{n as b,t as x}from"./_plugin-vue_export-helper-BP5VbhV0.js";f();var S=l({__name:`CommonDialog`,props:{modelValue:{type:Boolean,required:!0},title:{type:String,required:!0},size:{type:String,required:!1,default:`medium`},type:{type:String,required:!1,default:`default`},width:{type:String,required:!1},height:{type:String,required:!1},top:{type:String,required:!1,default:`50px`},closeOnClickModal:{type:Boolean,required:!1,default:!1},closeOnPressEscape:{type:Boolean,required:!1,default:!0},destroyOnClose:{type:Boolean,required:!1,default:!1},draggable:{type:Boolean,required:!1,default:!1},customClass:{type:String,required:!1},modalClass:{type:String,required:!1},appendToBody:{type:Boolean,required:!1,default:!0},lockScroll:{type:Boolean,required:!1,default:!0},zIndex:{type:Number,required:!1},showClose:{type:Boolean,required:!1,default:!0},heightMode:{type:String,required:!1,default:`max`},heightOffset:{type:String,required:!1,default:`100px`},showFooter:{type:Boolean,required:!1,default:!1},confirmText:{type:String,required:!1,default:b(`@803A9:确定`)},cancelText:{type:String,required:!1,default:b(`@803A9:取消`)},showCancel:{type:Boolean,required:!1,default:!0},confirmLoading:{type:Boolean,required:!1,default:!1}},emits:[`update:modelValue`,`confirm`,`cancel`,`close`,`opened`,`closed`],setup(n,{expose:i,emit:a}){i();let o=n,s=a,c=e(()=>{if(o.width)return o.width;switch(o.size){case`small`:return`30%`;case`medium`:return`50%`;case`large`:return`80%`;case`extra-large`:return`90%`;case`fullscreen`:return`100vw`;default:return`50%`}}),l=_(),u=null;function d(){s(`opened`),r(()=>{let e=document.querySelector(`.el-dialog__wrapper:not([style*="display: none"]) .el-dialog`);e&&(e.querySelector(`button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])`)||e).focus?.()})}function f(){s(`closed`),u&&typeof u.focus==`function`&&(r(()=>u?.focus()),u=null)}function p(e){e&&!o.modelValue&&(u=document.activeElement),s(`update:modelValue`,e)}let m=e(()=>o.size===`fullscreen`?`0`:o.top),h=e(()=>{let e=[];return o.customClass&&e.push(o.customClass),o.type===`flex`&&e.push(`common-dialog--flex`),o.type===`full-height`&&e.push(`common-dialog--full-height`),o.size===`fullscreen`&&e.push(`common-dialog--fullscreen`),e.join(` `)}),g=e(()=>{if(o.size===`fullscreen`)return{height:`100vh`,maxHeight:`100vh`};let e=`calc(100% - ${o.heightOffset})`;return o.heightMode===`fixed`?{height:e}:{maxHeight:e}});function v(){s(`update:modelValue`,!1),s(`close`)}function y(){s(`confirm`)}function b(){s(`cancel`),v()}let x={props:o,emit:s,dialogWidth:c,titleId:l,get previouslyFocused(){return u},set previouslyFocused(e){u=e},handleOpened:d,handleClosed:f,handleUpdateModelValue:p,dialogTop:m,dialogClass:h,dialogStyle:g,handleClose:v,handleConfirm:y,handleCancel:b,get ElDialog(){return t}};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}});f(),c();var C=[`id`],w={class:`common-dialog__footer`};function T(e,t,r,c,l,f){let _=o;return m(),p(c.ElDialog,{"model-value":r.modelValue,title:r.title,width:c.dialogWidth,top:c.dialogTop,style:i(c.dialogStyle),"z-index":r.zIndex,fullscreen:r.size===`fullscreen`,"close-on-click-modal":r.closeOnClickModal,"close-on-press-escape":r.closeOnPressEscape,"destroy-on-close":r.destroyOnClose,draggable:r.draggable,class:a(c.dialogClass),"show-close":r.showClose,"modal-class":r.modalClass,"data-dialog-shell":`common`,"append-to-body":r.appendToBody,"lock-scroll":r.lockScroll,"aria-modal":!0,"aria-labelledby":c.titleId,role:`dialog`,onClose:c.handleClose,"onUpdate:modelValue":c.handleUpdateModelValue,onOpened:c.handleOpened,onClosed:c.handleClosed},g({header:v(({titleClass:e})=>[y(`span`,{id:c.titleId,class:a([`el-dialog__title`,e]),role:`heading`,"aria-level":`2`},d(r.title),11,C)]),default:v(()=>[u(e.$slots,`default`,{},void 0,!0)]),_:2},[r.showFooter||e.$slots.footer?{name:`footer`,fn:v(()=>[u(e.$slots,`footer`,{},()=>[y(`div`,w,[r.showCancel?(m(),p(_,{key:0,type:`button`,onClick:c.handleCancel},{default:v(()=>[h(d(r.cancelText),1)]),_:1})):n(`v-if`,!0),s(_,{type:`primary`,loading:r.confirmLoading,onClick:c.handleConfirm},{default:v(()=>[h(d(r.confirmText),1)]),_:1},8,[`loading`])])],!0)]),key:`0`}:void 0]),1032,[`model-value`,`title`,`width`,`top`,`style`,`z-index`,`fullscreen`,`close-on-click-modal`,`close-on-press-escape`,`destroy-on-close`,`draggable`,`class`,`show-close`,`modal-class`,`append-to-body`,`lock-scroll`,`aria-labelledby`])}var E=x(S,[[`render`,T],[`__scopeId`,`data-v-c5fee217`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/CommonDialog.vue`]]);export{E as t};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{Cn as e,E as t,En as n,Hn as r,Jr as i,Kr as a,L as o,Mn as s,Nr as c,Pn as l,Qn as u,Qr as d,Rn as f,Tn as p,Yn as m,jn as h,kn as g,nr as _,or as v,wn as y}from"./element-plus-D0R8BMj4.js";import{n as b,t as x}from"./_plugin-vue_export-helper-BKeZSroN.js";f();var S=l({__name:`CommonDialog`,props:{modelValue:{type:Boolean,required:!0},title:{type:String,required:!0},size:{type:String,required:!1,default:`medium`},type:{type:String,required:!1,default:`default`},width:{type:String,required:!1},height:{type:String,required:!1},top:{type:String,required:!1,default:`50px`},closeOnClickModal:{type:Boolean,required:!1,default:!1},closeOnPressEscape:{type:Boolean,required:!1,default:!0},destroyOnClose:{type:Boolean,required:!1,default:!1},draggable:{type:Boolean,required:!1,default:!1},customClass:{type:String,required:!1},modalClass:{type:String,required:!1},appendToBody:{type:Boolean,required:!1,default:!0},lockScroll:{type:Boolean,required:!1,default:!0},zIndex:{type:Number,required:!1},showClose:{type:Boolean,required:!1,default:!0},heightMode:{type:String,required:!1,default:`max`},heightOffset:{type:String,required:!1,default:`100px`},showFooter:{type:Boolean,required:!1,default:!1},confirmText:{type:String,required:!1,default:b(`@803A9:确定`)},cancelText:{type:String,required:!1,default:b(`@803A9:取消`)},showCancel:{type:Boolean,required:!1,default:!0},confirmLoading:{type:Boolean,required:!1,default:!1}},emits:[`update:modelValue`,`confirm`,`cancel`,`close`,`opened`,`closed`],setup(n,{expose:i,emit:a}){i();let o=n,s=a,c=e(()=>{if(o.width)return o.width;switch(o.size){case`small`:return`30%`;case`medium`:return`50%`;case`large`:return`80%`;case`extra-large`:return`90%`;case`fullscreen`:return`100vw`;default:return`50%`}}),l=_(),u=null;function d(){s(`opened`),r(()=>{let e=document.querySelector(`.el-dialog__wrapper:not([style*="display: none"]) .el-dialog`);e&&(e.querySelector(`button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])`)||e).focus?.()})}function f(){s(`closed`),u&&typeof u.focus==`function`&&(r(()=>u?.focus()),u=null)}function p(e){e&&!o.modelValue&&(u=document.activeElement),s(`update:modelValue`,e)}let m=e(()=>o.size===`fullscreen`?`0`:o.top),h=e(()=>{let e=[];return o.customClass&&e.push(o.customClass),o.type===`flex`&&e.push(`common-dialog--flex`),o.type===`full-height`&&e.push(`common-dialog--full-height`),o.size===`fullscreen`&&e.push(`common-dialog--fullscreen`),e.join(` `)}),g=e(()=>{if(o.size===`fullscreen`)return{height:`100vh`,maxHeight:`100vh`};let e=`calc(100% - ${o.heightOffset})`;return o.heightMode===`fixed`?{height:e}:{maxHeight:e}});function v(){s(`update:modelValue`,!1),s(`close`)}function y(){s(`confirm`)}function b(){s(`cancel`),v()}let x={props:o,emit:s,dialogWidth:c,titleId:l,get previouslyFocused(){return u},set previouslyFocused(e){u=e},handleOpened:d,handleClosed:f,handleUpdateModelValue:p,dialogTop:m,dialogClass:h,dialogStyle:g,handleClose:v,handleConfirm:y,handleCancel:b,get ElDialog(){return t}};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}});f(),c();var C=[`id`],w={class:`common-dialog__footer`};function T(e,t,r,c,l,f){let _=o;return m(),p(c.ElDialog,{"model-value":r.modelValue,title:r.title,width:c.dialogWidth,top:c.dialogTop,style:i(c.dialogStyle),"z-index":r.zIndex,fullscreen:r.size===`fullscreen`,"close-on-click-modal":r.closeOnClickModal,"close-on-press-escape":r.closeOnPressEscape,"destroy-on-close":r.destroyOnClose,draggable:r.draggable,class:a(c.dialogClass),"show-close":r.showClose,"modal-class":r.modalClass,"data-dialog-shell":`common`,"append-to-body":r.appendToBody,"lock-scroll":r.lockScroll,"aria-modal":!0,"aria-labelledby":c.titleId,role:`dialog`,onClose:c.handleClose,"onUpdate:modelValue":c.handleUpdateModelValue,onOpened:c.handleOpened,onClosed:c.handleClosed},g({header:v(({titleClass:e})=>[y(`span`,{id:c.titleId,class:a([`el-dialog__title`,e]),role:`heading`,"aria-level":`2`},d(r.title),11,C)]),default:v(()=>[u(e.$slots,`default`,{},void 0,!0)]),_:2},[r.showFooter||e.$slots.footer?{name:`footer`,fn:v(()=>[u(e.$slots,`footer`,{},()=>[y(`div`,w,[r.showCancel?(m(),p(_,{key:0,type:`button`,onClick:c.handleCancel},{default:v(()=>[h(d(r.cancelText),1)]),_:1})):n(`v-if`,!0),s(_,{type:`primary`,loading:r.confirmLoading,onClick:c.handleConfirm},{default:v(()=>[h(d(r.confirmText),1)]),_:1},8,[`loading`])])],!0)]),key:`0`}:void 0]),1032,[`model-value`,`title`,`width`,`top`,`style`,`z-index`,`fullscreen`,`close-on-click-modal`,`close-on-press-escape`,`destroy-on-close`,`draggable`,`class`,`show-close`,`modal-class`,`append-to-body`,`lock-scroll`,`aria-labelledby`])}var E=x(S,[[`render`,T],[`__scopeId`,`data-v-c5fee217`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/CommonDialog.vue`]]);export{E as t};