zen-gitsync 2.17.43 → 2.17.44

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 (64) hide show
  1. package/README.md +2 -2
  2. package/package.json +8 -2
  3. package/src/cli/ai/termui.js +21 -7
  4. package/src/cli/ai/termui.test.js +19 -2
  5. package/src/ui/public/assets/{AgentEngineSelector-BwFdXZnh.js → AgentEngineSelector-SBPtLGPv.js} +2 -2
  6. package/src/ui/public/assets/AgentView-Dn4FKdQ4.js +11 -0
  7. package/src/ui/public/assets/AppVersionBadge-DQ4EU4pX.js +2 -0
  8. package/src/ui/public/assets/{BranchSelector-DL37Ho4j.js → BranchSelector-CzbW12er.js} +1 -1
  9. package/src/ui/public/assets/CommitForm-B-rCGP4U.js +14 -0
  10. package/src/ui/public/assets/{CommonDialog-BT6e135Y.js → CommonDialog-BU2WnvCP.js} +1 -1
  11. package/src/ui/public/assets/EditorView-Ow0NbfoS.js +37 -0
  12. package/src/ui/public/assets/{FlowExecutionViewer-DIlgernH.js → FlowExecutionViewer-DGAyV9U4.js} +1 -1
  13. package/src/ui/public/assets/FlowOrchestrationWorkspace-D2kYrmGf.js +21 -0
  14. package/src/ui/public/assets/LogList-CawuKgSs.js +7 -0
  15. package/src/ui/public/assets/MindmapView-DEsuTaSg.js +2 -0
  16. package/src/ui/public/assets/MonitorView-DxlF3drD.js +3 -0
  17. package/src/ui/public/assets/ProjectStartupButton-C8IaVsyB.js +1 -0
  18. package/src/ui/public/assets/{RecentDirectoriesChat-LOD3UBFM.js → RecentDirectoriesChat-BeRlRXUS.js} +2 -2
  19. package/src/ui/public/assets/{RemoteManagerDialog-S3xLgN02.js → RemoteManagerDialog-Cm1FrUFN.js} +3 -3
  20. package/src/ui/public/assets/{RemoteRepoCard-BLb8tACY.js → RemoteRepoCard-CIaQJFkO.js} +2 -2
  21. package/src/ui/public/assets/{SourceMapView-BA7E3JX7.js → SourceMapView-BzABBB5V.js} +3 -3
  22. package/src/ui/public/assets/{SvgIcon-Dd0dgVcd.js → SvgIcon-DKzB5l7x.js} +1 -1
  23. package/src/ui/public/assets/UserInputNode-B9_WFqBz.js +1 -0
  24. package/src/ui/public/assets/WorkbenchView-B8Jyku-x.css +1 -0
  25. package/src/ui/public/assets/WorkbenchView-BbAYZZW0.js +299 -0
  26. package/src/ui/public/assets/{_plugin-vue_export-helper-DibQ4qNS.js → _plugin-vue_export-helper-CEyZbjNo.js} +1 -1
  27. package/src/ui/public/assets/{agentConversations-CyGrxt-h.js → agentConversations-zhSKENjT.js} +4 -4
  28. package/src/ui/public/assets/{configStore-DQ92GVaR.js → configStore-DZgueZaZ.js} +1 -1
  29. package/src/ui/public/assets/{css.worker-DFdt6_zu.js → css.worker-BDCmgL4U.js} +9 -9
  30. package/src/ui/public/assets/{dagre-BPEW99Ym.js → dagre-BkIBWWsW.js} +4 -4
  31. package/src/ui/public/assets/editor.worker-GCPm6rMv.js +26 -0
  32. package/src/ui/public/assets/element-plus-BM4vMiQt.js +48 -0
  33. package/src/ui/public/assets/{element-plus-DJ3ZQa98.css → element-plus-D-6gla1z.css} +1 -1
  34. package/src/ui/public/assets/{flow-mindmap-BQUUIfaR.js → flow-mindmap-CQ3aUAgf.js} +1 -1
  35. package/src/ui/public/assets/{html.worker-JUzsMP-j.js → html.worker-DG8hnSJR.js} +8 -8
  36. package/src/ui/public/assets/index-BUX1f2WT.js +204 -0
  37. package/src/ui/public/assets/index-Ja0NzLzp.css +1 -0
  38. package/src/ui/public/assets/json.worker-CxwlJRnL.js +58 -0
  39. package/src/ui/public/assets/{monaco-kXz8a-yc.js → monaco-uSKsFhgW.js} +6 -6
  40. package/src/ui/public/assets/{office-docx-4ZL-nECj.js → office-docx-CP6zThhk.js} +1 -1
  41. package/src/ui/public/assets/{office-excel-BlPftvU4.js → office-excel-BXCp3PSj.js} +1 -1
  42. package/src/ui/public/assets/{office-pptx-CVP1caLm.js → office-pptx-h_kukgO8.js} +3 -3
  43. package/src/ui/public/assets/{ts.worker-CmEKzkmF.js → ts.worker-DgFMIcEs.js} +49 -49
  44. package/src/ui/public/assets/{vendor-CazUJJkv.js → vendor-k3t4WBZA.js} +8 -8
  45. package/src/ui/public/assets/{vue-flow-BABZEIJA.js → vue-flow-B5o0saHS.js} +1 -1
  46. package/src/ui/public/index.html +13 -13
  47. package/src/ui/server/routes/workbench/executorModels.test.js +326 -326
  48. package/src/ui/public/assets/AgentView-CMQ7TzwN.js +0 -11
  49. package/src/ui/public/assets/AppVersionBadge-Bk4XGXki.js +0 -2
  50. package/src/ui/public/assets/CommitForm-DdvYlUtA.js +0 -14
  51. package/src/ui/public/assets/EditorView-CeZ-EvP1.js +0 -37
  52. package/src/ui/public/assets/FlowOrchestrationWorkspace-BIFFckMG.js +0 -21
  53. package/src/ui/public/assets/LogList-CYU0YVnC.js +0 -7
  54. package/src/ui/public/assets/MindmapView-DYB3_94z.js +0 -2
  55. package/src/ui/public/assets/MonitorView-DKXSFbyq.js +0 -3
  56. package/src/ui/public/assets/ProjectStartupButton-BMICmCA_.js +0 -1
  57. package/src/ui/public/assets/UserInputNode-B0YtQfhh.js +0 -1
  58. package/src/ui/public/assets/WorkbenchView-CIuHGPhc.css +0 -1
  59. package/src/ui/public/assets/WorkbenchView-lgVbWRyY.js +0 -287
  60. package/src/ui/public/assets/editor.worker-O-CH8JUO.js +0 -26
  61. package/src/ui/public/assets/element-plus-C8IhrglD.js +0 -48
  62. package/src/ui/public/assets/index-DavZzOom.css +0 -1
  63. package/src/ui/public/assets/index-ED00NaPI.js +0 -198
  64. package/src/ui/public/assets/json.worker-B4dEhy0e.js +0 -58
package/README.md CHANGED
@@ -406,7 +406,7 @@ A dedicated view for running coding agents across one or many projects. Every ta
406
406
  | Dispatch default prompts | Give every dispatch a standing prompt: one **global** entry that applies to all projects, plus one **per project** that is appended after it whenever you dispatch to that project (it supplements the global one rather than replacing it). Both are edited from the gear button in the console's composer; the combined text is prepended to the instruction, a "Default prompt (global + this project)" checkbox appears next to **Run now** so a single dispatch can opt out, and the instruction log records which level was attached. The prompt is copied onto the task at dispatch time, so editing the setting later never rewrites tasks that already exist; it lands in the task's own prompt field, where you can still edit it per task |
407
407
  | Open-with menu per project | Hovering a project row in the board's project list reveals two buttons: **Open folder** (straight to your file manager) and **Open with**, a menu holding file manager / terminal / `g ui` in a new tab plus every editor and AI tool (VS Code, Codex, OpenCode, Kimi Code, ZCode, DeepSeek Harness, and Claude Code in default or fully-approved mode). Tools that are not installed are dimmed and labelled "Not installed" — clicking one opens the very same install guide the top bar uses. Every action applies to that row's project only; the board's selection is never touched |
408
408
  | Remove a dead project | A row whose folder no longer exists still shows up — the list is the union of recent directories and the paths your tasks remember — so that row gets a single red **Remove from list** button instead of the open actions (opening a missing folder can only fail). The confirm dialog spells it out: **no tasks are deleted**, and the toast repeats how many were kept. The entry disappears from the list while every task, job and history record stays put; if you ever clone the folder back, the row returns on its own |
409
- | Task editor overlay | Clicking a board card opens the editor as an overlay: a flat sidebar holding the task list and prompt presets, then the task header, preset selector, executor split-button, the copy-execution / execution-log / clear-execution actions, and a chat-style execution body. The description collapses into a one-line "Task description (optional)" summary until clicked, showing a "Filled" badge and the attachment count once there is content. Opening the overlay lands the conversation on its **newest** turn rather than its first: the flow keeps re-pinning to the bottom while markdown highlighting and tool-call folding are still growing it after mount, and lets go as soon as you scroll yourself |
409
+ | Task editor overlay | Clicking a board card opens the editor as an overlay: a flat sidebar holding the task list and prompt presets, then the task header, preset selector, executor split-button, the copy-execution / execution-log / clear-execution actions, and a chat-style execution body. The description collapses into a one-line "Task description (optional)" summary until clicked, showing a "Filled" badge and the attachment count once there is content. Opening the overlay lands the conversation on its **newest** turn rather than its first: the flow keeps re-pinning to the bottom while markdown highlighting and tool-call folding are still growing it after mount, and lets go as soon as you scroll yourself. The thin bar on top carries the back-to-board button and the current project, and — just left of the "Task execution" label at its right end — the task's **relative time and how long it took** (a "took x" line once it has run, a live "running for x" while it is, and only the time — no placeholder — if it never ran), word for word the same two values the board card shows. When the window narrows, this block yields first: the back button, project and execution-path chips never give up a single pixel |
410
410
  | Copy execution content | **Copy execution content** in the task header puts the whole task — every turn, not just whatever is on screen — on the clipboard as plain Markdown: a header line for the task and its project, then one section per turn (`## Round N`, with the executor, status and start time on the line under it) holding the user's prompt, the agent's thinking, its tool calls (arguments and results in fenced blocks) and the model's output. It is assembled from the run records rather than scraped from the DOM, so what you get never depends on what happens to be selected. The user side goes through the same trimming the chat bubbles use, so what you copy is what you typed — the injected environment / memory blocks and the attachment list stay behind in `job.prompt`. Turns with nothing in them are skipped without renumbering the ones after them, and a task that has never run answers with a "nothing to copy" toast instead of putting an empty string on the clipboard |
411
411
  | Executor choice | Run each task with **Claude Code**, **OpenCode** or **Codex**. The global default is set in **Settings → General → Task executor** (`config.taskExecutor`); the split-button next to the run button switches it for the next run and remembers that pick in the browser. A continued conversation always stays on the executor that started it — Claude's `--resume`, OpenCode's `--session` and Codex's thread id are not interchangeable |
412
412
  | Attachments | Up to 9 files per task (image / PDF / text / Markdown / CSV / JSON / log, ≤ 20 MB each); images over 3.5 MB are re-encoded / downscaled in the browser before upload so 4K screenshots still fit what the model and the reader can take. Their absolute paths are appended to the prompt so the agent reads them directly. Right-click an image attachment to copy it to the system clipboard (`image/png` / `jpeg` / `webp` / `gif`) |
@@ -1118,7 +1118,7 @@ Activity Bar 第四个视图,在 GUI 内直接浏览并编辑项目文件:
1118
1118
  | 派发默认提示词 | 给每次派发配一段常驻提示词:一条**全局**的(所有项目都附加)+ 每个项目一条(派发到该项目时追加在全局之后,是补充而不是覆盖)。两者都在控制台输入区的齿轮按钮里设置;拼好的正文放在指令**之前**,「立即执行」旁边会多出一个「默认提示词(全局 + 本项目)」勾选,单次派发可以取消勾选,指令流水里也记下这条指令附带的是哪一级。提示词在派发那一刻就抄进任务自己的提示词字段,之后改设置不会回头改写已建任务,单条任务仍可再改 |
1119
1119
  | 项目行打开方式 | 编排台项目列表里 hover 任意一行会出现两个按钮:「打开文件夹」一键进资源管理器,以及「打开方式」菜单 —— 文件管理器 / 终端 / 新标签页跑 `g ui`,以及各编辑器与 AI 工具(VS Code、Codex、OpenCode、Kimi Code、ZCode、DeepSeek Harness,加上默认权限或完全批准的 Claude Code)。没安装的工具会置灰并标「未安装」,点它弹的是顶栏那套安装引导;菜单里的动作只作用于该行项目,不会改变看板选中态 |
1120
1120
  | 移除死项目 | 目录已经不存在的项目行仍会留在清单里(清单是常用目录与任务路径两份来源的并集),这一行 hover 时不再给任何打开动作(点了只会报「无法打开目录」),只留一颗红色的**「从清单移除」**。确认框会写明**任务不会被删除**,成功提示还会带上保留的条数。移除后这一行从清单消失,而任务、执行记录、历史一条不动;目录哪天被克隆回来,它会自己现身 |
1121
- | 任务编辑器浮层 | 点击看板卡片时以浮层打开:左侧是扁平化的任务列表与提示词预置,右侧依次是任务头部、预置下拉、执行器 split 按钮、「复制执行内容 / 执行日志 / 清空执行」动作,以及对话式执行主体。描述默认折叠成一行「任务描述(可选)」摘要,点击展开;已填写描述或挂有附件时摘要右侧显示「已填写」徽标与附件数量。打开浮层时对话流直接落在**最新一轮**而不是第一轮:正文异步高亮与工具调用折叠会在挂载后继续长高,这段时间里持续贴底,用户自己一滚就立刻撒手 |
1121
+ | 任务编辑器浮层 | 点击看板卡片时以浮层打开:左侧是扁平化的任务列表与提示词预置,右侧依次是任务头部、预置下拉、执行器 split 按钮、「复制执行内容 / 执行日志 / 清空执行」动作,以及对话式执行主体。描述默认折叠成一行「任务描述(可选)」摘要,点击展开;已填写描述或挂有附件时摘要右侧显示「已填写」徽标与附件数量。打开浮层时对话流直接落在**最新一轮**而不是第一轮:正文异步高亮与工具调用折叠会在挂载后继续长高,这段时间里持续贴底,用户自己一滚就立刻撒手。顶部细栏在「返回看板」与当前项目之后、右端靠着一枚「任务执行」,还给出这条任务的**相对时间与用时**(跑过给「用时 x」,正在跑给实时的「已运行 x」,从没跑过只给时间、不写占位),与看板卡片上那两个值逐字一致;窗口收窄时先让位的是这一块,左边的返回 / 项目 / 执行于一个字节都不动 |
1122
1122
  | 复制执行内容 | 任务头部的「复制执行内容」把**整条任务**(所有轮次,不只是屏幕上那一段)以纯 Markdown 放进剪贴板:先是任务与项目的标题行,然后一轮一节(`## 第 N 轮`,下面一行是本轮执行器、状态与开始时间),每节依次是用户提示词、智能体思考、工具调用(参数与结果都放在围栏代码块里)与模型返回。内容是从执行记录现拼的、不是从 DOM 里抠的,所以复制到什么跟你当前选中了哪段文字无关。用户侧走的是与对话气泡同一套裁剪,复制出来的就是你真正说过的话 —— 注入的环境块 / 记忆块 / 附件清单留在 `job.prompt` 里不跟着出去。一个字都没有的轮次会被跳过,且不让后面的轮次跟着往前重编号;从没跑过的任务回答「暂无执行内容可复制」,而不是把空串写进剪贴板 |
1123
1123
  | 执行器选择 | 每个任务可用 **Claude Code** / **OpenCode** / **Codex** 执行。全局默认在 **设置 → 通用设置 → 任务执行器**(`config.taskExecutor`);执行按钮旁的 split 按钮可临时切换下一次执行用的执行器,选择记在浏览器里。续聊固定沿用最初那个执行器 —— Claude 的 `--resume`、OpenCode 的 `--session`、Codex 的 thread id 互不通用 |
1124
1124
  | 附件 | 每个任务最多挂 9 个附件(图片 / PDF / 文本 / Markdown / CSV / JSON / log,单个 ≤ 20 MB);超过 3.5 MB 的图片会先在浏览器里压缩(先按原分辨率转 WebP,压不下去再逐级降采样),4K 屏截图不用再手动裁剪;执行时绝对路径会自动追加到 prompt 末尾,智能体直接按路径读取。**右键图片附件可一键复制到系统剪贴板**(支持 png / jpeg / webp / gif) |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zen-gitsync",
3
- "version": "2.17.43",
3
+ "version": "2.17.44",
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",
@@ -69,6 +69,8 @@
69
69
  "verify:wb-task-sound": "node scripts/verify-wb-task-sound.cjs",
70
70
  "verify:wb-proj-branch": "node scripts/verify-workbench-proj-branch.cjs",
71
71
  "verify:wb-proj-filter": "node scripts/verify-wb-proj-filter.cjs",
72
+ "verify:wb-proj-search": "node scripts/verify-wb-proj-search.cjs",
73
+ "verify:wb-proj-search:reverse": "node scripts/verify-wb-proj-search.cjs --reverse",
72
74
  "verify:wb-proj-remove": "node scripts/verify-wb-project-remove.cjs",
73
75
  "verify:wb-panel-resize": "node scripts/verify-wb-panel-resize.cjs",
74
76
  "verify:wb-toolcalls": "node scripts/verify-workbench-toolcalls.mjs",
@@ -124,11 +126,15 @@
124
126
  "verify:wb-colors": "node scripts/verify-wb-colors.cjs",
125
127
  "verify:wb-colors:reverse": "node scripts/verify-wb-colors.cjs --reverse",
126
128
  "verify:ui-consistency": "node scripts/verify-ui-consistency.cjs",
129
+ "verify:commit-area-no-bounce": "node scripts/verify-commit-area-no-bounce.cjs",
130
+ "verify:commit-area-no-bounce:reverse": "node scripts/verify-commit-area-no-bounce.cjs --reverse",
127
131
  "verify:git-operations-drawer": "node scripts/verify-git-operations-drawer.cjs",
128
132
  "verify:git-operations-drawer:reverse": "node scripts/verify-git-operations-drawer.cjs --reverse",
129
133
  "verify:commit-ai-suffix": "node scripts/verify-commit-ai-suffix.cjs",
130
134
  "verify:commit-ai-suffix:reverse": "node scripts/verify-commit-ai-suffix.cjs --reverse",
131
- "verify:header-monitor": "node scripts/verify-header-monitor.cjs"
135
+ "verify:header-monitor": "node scripts/verify-header-monitor.cjs",
136
+ "verify:header-git-buttons": "node scripts/verify-header-git-buttons.cjs",
137
+ "verify:header-git-buttons:reverse": "node scripts/verify-header-git-buttons.cjs --reverse"
132
138
  },
133
139
  "files": [
134
140
  "src/ui/public/**",
@@ -605,9 +605,15 @@ export function createAssistantWriter({
605
605
 
606
606
  /**
607
607
  * 格式化耗时(毫秒 → 人类可读)。
608
- * < 1s → "123ms"
609
- * < 60s → "1.2s"
610
- * ≥ 60s → "2m30s"
608
+ * < 1s → "123ms"
609
+ * < 60s → "1.2s"
610
+ * < 60m → "2m30s"
611
+ * < 24h → "10h58m"
612
+ * ≥ 24h → "2d3h"
613
+ *
614
+ * 分钟以上不再往下带秒:一条挂了半小时的命令显示 "31m12s" 尚可,显示
615
+ * "658m17s" 就没人有概念了(那是 10 小时 58 分)。所以一过 60 分钟就换
616
+ * 成小时,一过 24 小时就换成天,只保留两个量级。
611
617
  * @param {number} ms
612
618
  * @returns {string}
613
619
  */
@@ -615,10 +621,18 @@ export function formatDuration(ms) {
615
621
  if (!Number.isFinite(ms) || ms < 0) return ''
616
622
  if (ms < 1000) return `${Math.round(ms)}ms`
617
623
  const s = ms / 1000
618
- if (s < 60) return `${s.toFixed(1)}s`
619
- const m = Math.floor(s / 60)
620
- const rem = Math.round(s % 60)
621
- return `${m}m${rem}s`
624
+ if (s < 60) {
625
+ // 59.97s 这种四舍五入后就是 60 的,不留成 "60.0s",往下走进位成 1m0s
626
+ const oneDecimal = Math.round(s * 10) / 10
627
+ if (oneDecimal < 60) return `${oneDecimal.toFixed(1)}s`
628
+ }
629
+ // 先取整到秒再拆分量级,避免 m/s 拼接时出现 "59m60s"
630
+ const totalSec = Math.round(s)
631
+ const totalMin = Math.floor(totalSec / 60)
632
+ if (totalMin < 60) return `${totalMin}m${totalSec % 60}s`
633
+ const totalHour = Math.floor(totalMin / 60)
634
+ if (totalHour < 24) return `${totalHour}h${totalMin % 60}m`
635
+ return `${Math.floor(totalHour / 24)}d${totalHour % 24}h`
622
636
  }
623
637
 
624
638
  export function renderTurnSummary(stats, { locale = 'zh-CN', session, width = Math.min(100, termWidth() - 4) } = {}) {
@@ -362,13 +362,30 @@ test('formatDuration: 毫秒级显示 ms', () => {
362
362
  test('formatDuration: 秒级显示一位小数', () => {
363
363
  assert.equal(formatDuration(1000), '1.0s')
364
364
  assert.equal(formatDuration(1500), '1.5s')
365
- assert.equal(formatDuration(59999), '60.0s')
365
+ assert.equal(formatDuration(59900), '59.9s')
366
366
  })
367
367
 
368
368
  test('formatDuration: 分钟级显示 m+s', () => {
369
369
  assert.equal(formatDuration(60000), '1m0s')
370
370
  assert.equal(formatDuration(125000), '2m5s')
371
- assert.equal(formatDuration(3600000), '60m0s')
371
+ assert.equal(formatDuration(3599000), '59m59s')
372
+ // 59.999s 四舍五入到 60,不进位成 "60.0s"
373
+ assert.equal(formatDuration(59999), '1m0s')
374
+ })
375
+
376
+ test('formatDuration: 小时级显示 h+m(不再堆分钟)', () => {
377
+ assert.equal(formatDuration(3600000), '1h0m')
378
+ assert.equal(formatDuration(3600000 + 30 * 60000), '1h30m')
379
+ assert.equal(formatDuration(16320000), '4h32m')
380
+ // 658m17s 这种就该显示成 10h58m
381
+ assert.equal(formatDuration(658 * 60000 + 17000), '10h58m')
382
+ assert.equal(formatDuration(23 * 3600000 + 59 * 60000), '23h59m')
383
+ })
384
+
385
+ test('formatDuration: 天级显示 d+h', () => {
386
+ assert.equal(formatDuration(24 * 3600000), '1d0h')
387
+ assert.equal(formatDuration(26 * 3600000 + 2 * 60000), '1d2h')
388
+ assert.equal(formatDuration(50 * 3600000), '2d2h')
372
389
  })
373
390
 
374
391
  test('formatDuration: 无效输入返回空串', () => {
@@ -1,2 +1,2 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,C as n,Dn as r,En as i,Fr as a,In as o,J as s,Jr as c,On as l,Pn as u,S as d,Tn as f,Wn as p,Y as m,Yn as h,Zn as g,br as _,cr as v,ei as y,kn as b,pr as x,qn as S,tt as C,w,xn as T}from"./element-plus-C8IhrglD.js";import{n as E,t as D}from"./_plugin-vue_export-helper-DibQ4qNS.js";import{t as O}from"./SvgIcon-Dd0dgVcd.js";import{T as k,m as A,z as j}from"./index-ED00NaPI.js";import{c as M,d as N,l as P,u as F}from"./agentConversations-CyGrxt-h.js";t(),x();function I(e,t=680){let n=_(0),r=null;function i(){let t=e.value;return t?(n.value=t.clientWidth,typeof ResizeObserver>`u`||(r=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(n.value=t)}),r.observe(t),!0)):!1}return h(()=>{i()||p(()=>i())}),S(()=>{r?.disconnect(),r=null}),{width:n,narrow:f(()=>n.value>0&&n.value<t)}}t(),x();var L=o({__name:`AgentEngineSelector`,props:{engine:{type:String,required:!0},locked:{type:Boolean,required:!1}},emits:[`select`],setup(e,{expose:t,emit:r}){t();let i=e,a=r,o=j(),c=f(()=>F(i.engine)),l=f(()=>({gai:!0,claude:o.claudeAvailable,opencode:o.opencodeAvailable,codex:o.codexAvailable})),u=_(!1),p=_(null);function h(e){if(!i.locked){if(!l.value[e]){if(!N(e))return;p.value=e,u.value=!0;return}a(`select`,e)}}let g={props:i,emit:a,toolsStore:o,engineName:c,engineAvailability:l,installDialogVisible:u,installTool:p,onCommand:h,get $t(){return E},get ElIcon(){return s},get ElDropdown(){return d},get ElDropdownMenu(){return w},get ElDropdownItem(){return n},get ArrowDown(){return m},get Check(){return C},get AGENT_ENGINE_OPTIONS(){return M},get BUILTIN_ENGINE_ICON(){return P},get isExternalAgentEngine(){return N},SvgIcon:O,TaskExecutorIcon:A,ToolInstallDialog:k};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}});t(),a();var R={class:`agent-engine`},z=[`disabled`,`title`,`aria-label`],B={class:`agent-engine__name`},V={class:`agent-engine__item`},H={class:`agent-engine__item-name`},U={key:3,class:`agent-engine__item-missing`};function W(t,n,a,o,s,d){return g(),b(T,null,[l(` 单根包一层:父级传下来的 class(Tab 行的 margin-left:auto、面板的 flex:none)
2
- 才能可靠落到这里 —— 多根组件会丢掉 fallthrough class。 `),i(`div`,R,[u(o.ElDropdown,{trigger:`click`,onCommand:o.onCommand},{dropdown:v(()=>[u(o.ElDropdownMenu,null,{default:v(()=>[(g(!0),b(T,null,e(o.AGENT_ENGINE_OPTIONS,e=>(g(),r(o.ElDropdownItem,{key:e.id,command:e.id},{default:v(()=>[i(`span`,V,[o.isExternalAgentEngine(e.id)?(g(),r(o.TaskExecutorIcon,{key:0,executor:e.id,class:`agent-engine__item-icon`},null,8,[`executor`])):(g(),r(o.SvgIcon,{key:1,"icon-class":o.BUILTIN_ENGINE_ICON,class:`agent-engine__item-icon`},null,8,[`icon-class`])),i(`span`,H,y(e.name),1),a.engine===e.id?(g(),r(o.ElIcon,{key:2,class:`agent-engine__item-check`},{default:v(()=>[u(o.Check)]),_:1})):o.engineAvailability[e.id]?l(`v-if`,!0):(g(),b(`span`,U,y(o.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`]))),128))]),_:1})]),default:v(()=>[i(`button`,{type:`button`,class:c([`agent-engine__btn`,{"is-locked":a.locked}]),disabled:a.locked,title:a.locked?o.$t(`@AGENT:本会话的引擎已锁定;要换引擎请新建会话`):o.$t(`@AGENT:新建会话使用的引擎`),"aria-label":o.$t(`@AGENT:智能体引擎`)},[o.isExternalAgentEngine(a.engine)?(g(),r(o.TaskExecutorIcon,{key:0,executor:a.engine,class:`agent-engine__icon`},null,8,[`executor`])):(g(),r(o.SvgIcon,{key:1,"icon-class":o.BUILTIN_ENGINE_ICON,class:`agent-engine__icon`},null,8,[`icon-class`])),i(`span`,B,y(o.engineName),1),u(o.ElIcon,{class:`agent-engine__caret`},{default:v(()=>[u(o.ArrowDown)]),_:1})],10,z)]),_:1}),u(o.ToolInstallDialog,{modelValue:o.installDialogVisible,"onUpdate:modelValue":n[0]||=e=>o.installDialogVisible=e,tool:o.installTool},null,8,[`modelValue`,`tool`])])],2112)}var G=D(L,[[`render`,W],[`__scopeId`,`data-v-c67a4d14`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/AgentEngineSelector.vue`]]);export{I as n,G as t};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,C as n,Dn as r,En as i,Fr as a,In as o,J as s,Jr as c,On as l,Pn as u,S as d,Tn as f,Wn as p,Y as m,Yn as h,Zn as g,br as _,cr as v,ei as y,kn as b,pr as x,qn as S,tt as C,w,xn as T}from"./element-plus-BM4vMiQt.js";import{n as E,t as D}from"./_plugin-vue_export-helper-CEyZbjNo.js";import{t as O}from"./SvgIcon-DKzB5l7x.js";import{T as k,m as A,z as j}from"./index-BUX1f2WT.js";import{c as M,d as N,l as P,u as F}from"./agentConversations-zhSKENjT.js";t(),x();function I(e,t=680){let n=_(0),r=null;function i(){let t=e.value;return t?(n.value=t.clientWidth,typeof ResizeObserver>`u`||(r=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(n.value=t)}),r.observe(t),!0)):!1}return h(()=>{i()||p(()=>i())}),S(()=>{r?.disconnect(),r=null}),{width:n,narrow:f(()=>n.value>0&&n.value<t)}}t(),x();var L=o({__name:`AgentEngineSelector`,props:{engine:{type:String,required:!0},locked:{type:Boolean,required:!1}},emits:[`select`],setup(e,{expose:t,emit:r}){t();let i=e,a=r,o=j(),c=f(()=>F(i.engine)),l=f(()=>({gai:!0,claude:o.claudeAvailable,opencode:o.opencodeAvailable,codex:o.codexAvailable})),u=_(!1),p=_(null);function h(e){if(!i.locked){if(!l.value[e]){if(!N(e))return;p.value=e,u.value=!0;return}a(`select`,e)}}let g={props:i,emit:a,toolsStore:o,engineName:c,engineAvailability:l,installDialogVisible:u,installTool:p,onCommand:h,get $t(){return E},get ElIcon(){return s},get ElDropdown(){return d},get ElDropdownMenu(){return w},get ElDropdownItem(){return n},get ArrowDown(){return m},get Check(){return C},get AGENT_ENGINE_OPTIONS(){return M},get BUILTIN_ENGINE_ICON(){return P},get isExternalAgentEngine(){return N},SvgIcon:O,TaskExecutorIcon:A,ToolInstallDialog:k};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}});t(),a();var R={class:`agent-engine`},z=[`disabled`,`title`,`aria-label`],B={class:`agent-engine__name`},V={class:`agent-engine__item`},H={class:`agent-engine__item-name`},U={key:3,class:`agent-engine__item-missing`};function W(t,n,a,o,s,d){return g(),b(T,null,[l(` 单根包一层:父级传下来的 class(Tab 行的 margin-left:auto、面板的 flex:none)
2
+ 才能可靠落到这里 —— 多根组件会丢掉 fallthrough class。 `),i(`div`,R,[u(o.ElDropdown,{trigger:`click`,onCommand:o.onCommand},{dropdown:v(()=>[u(o.ElDropdownMenu,null,{default:v(()=>[(g(!0),b(T,null,e(o.AGENT_ENGINE_OPTIONS,e=>(g(),r(o.ElDropdownItem,{key:e.id,command:e.id},{default:v(()=>[i(`span`,V,[o.isExternalAgentEngine(e.id)?(g(),r(o.TaskExecutorIcon,{key:0,executor:e.id,class:`agent-engine__item-icon`},null,8,[`executor`])):(g(),r(o.SvgIcon,{key:1,"icon-class":o.BUILTIN_ENGINE_ICON,class:`agent-engine__item-icon`},null,8,[`icon-class`])),i(`span`,H,y(e.name),1),a.engine===e.id?(g(),r(o.ElIcon,{key:2,class:`agent-engine__item-check`},{default:v(()=>[u(o.Check)]),_:1})):o.engineAvailability[e.id]?l(`v-if`,!0):(g(),b(`span`,U,y(o.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`]))),128))]),_:1})]),default:v(()=>[i(`button`,{type:`button`,class:c([`agent-engine__btn`,{"is-locked":a.locked}]),disabled:a.locked,title:a.locked?o.$t(`@AGENT:本会话的引擎已锁定;要换引擎请新建会话`):o.$t(`@AGENT:新建会话使用的引擎`),"aria-label":o.$t(`@AGENT:智能体引擎`)},[o.isExternalAgentEngine(a.engine)?(g(),r(o.TaskExecutorIcon,{key:0,executor:a.engine,class:`agent-engine__icon`},null,8,[`executor`])):(g(),r(o.SvgIcon,{key:1,"icon-class":o.BUILTIN_ENGINE_ICON,class:`agent-engine__icon`},null,8,[`icon-class`])),i(`span`,B,y(o.engineName),1),u(o.ElIcon,{class:`agent-engine__caret`},{default:v(()=>[u(o.ArrowDown)]),_:1})],10,z)]),_:1}),u(o.ToolInstallDialog,{modelValue:o.installDialogVisible,"onUpdate:modelValue":n[0]||=e=>o.installDialogVisible=e,tool:o.installTool},null,8,[`modelValue`,`tool`])])],2112)}var G=D(L,[[`render`,W],[`__scopeId`,`data-v-c67a4d14`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AgentEngineSelector.vue`]]);export{I as n,G as t};
@@ -0,0 +1,11 @@
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,At as t,Bn as n,Ct as r,Dn as i,En as a,Fr as o,Gt as s,Ht as c,In as l,J as u,Jr as d,M as f,Nn as p,On as m,Pn as h,Tn as g,Tt as _,W as v,Wn as y,Xr as b,Yt as x,Zn as S,_n as C,a as w,an as T,br as E,cr as D,dn as O,ei as k,et as A,i as j,j as M,kn as N,kt as P,lr as F,lt as ee,mt as I,nr as L,or as R,pr as z,r as B,st as V,tt as H,vr as U,xn as W}from"./element-plus-BM4vMiQt.js";import{a as G,t as K}from"./vendor-k3t4WBZA.js";import{n as q,t as J}from"./_plugin-vue_export-helper-CEyZbjNo.js";import{t as te}from"./configStore-DZgueZaZ.js";import{t as ne}from"./CommonDialog-BU2WnvCP.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-zhSKENjT.js";import{n as ue,t as de}from"./AgentEngineSelector-SBPtLGPv.js";n(),z();var fe=l({__name:`MarketplacePanel`,props:{type:{type:String,required:!0}},setup(e,{expose:t}){t();let n=e,i=te(),a=E([]),o=E([]),l=E(!1),u=E(``),d=E(``),f=E([]),p=E(`project`),m=E(new Set),h=E(new Set),_=E(new Set),v=g(()=>i.currentDirectory||``),y=null;async function b(){if(!l.value){l.value=!0;try{let e=new URLSearchParams({type:n.type,cwd:v.value});d.value&&e.set(`q`,d.value),f.value.length&&e.set(`sources`,f.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();t?.success?(a.value=t.groups||[],o.value=t.installed||[]):j.error(t?.error||q(`@MKT:加载失败`))}catch{j.error(q(`@MKT:加载失败`))}finally{l.value=!1}}}R(u,e=>{y&&clearTimeout(y),y=setTimeout(()=>{d.value=e.trim(),b()},400)}),R(f,()=>b()),R(()=>n.type,()=>{f.value=[],d.value=``,u.value=``,b()}),R(v,()=>b()),b();let S=g(()=>{let e=v.value?v.value.split(/[\\/]/).filter(Boolean).pop():``;return p.value===`project`?e||q(`@MKT:当前项目`):q(`@MKT:g ai 智能体`)});function C(e){return e.stars?`${w(e.stars)} ★`:e.downloads?`${w(e.downloads)} ${q(`@MKT:周下载`)}`:e.uses?`${w(e.uses)} ${q(`@MKT:次使用`)}`:``}function w(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function D(e){return`${e.id}`}function O(e){return m.value.has(D(e))}let k=g(()=>{let e={project:[],global:[]};for(let t of o.value)(e[t.target]||=[]).push(t);return e}),A=U({visible:!1,item:null,env:{},args:``});function M(e){return n.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function N(e){A.item=e,A.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),A.args=(e.args||[]).join(` `),A.visible=!0}function F(){let e=A.item;if(A.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(A.env).filter(([,e])=>e.trim()!==``)),n=A.args.trim()?A.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;z(e,{env:t,...n?{args:n}:{}})}async function L(e){if(!e.installed||await V(e)){if(M(e)){N(e);return}await z(e,{})}}async function z(e,t){let r=D(e);m.value.add(r);try{let r=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:p.value,cwd:v.value,item:{...e,...t}})}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){j.error(i?.error||q(`@MKT:安装失败`));return}i.item?.warning&&j.warning(i.item.warning),i.item?.envKeys?.length?j.warning(`${q(`@MKT:还缺环境变量`)}: ${i.item.envKeys.join(`, `)}`):j.success(q(`@MKT:安装成功`)),await b()}catch{j.error(q(`@MKT:安装失败`))}finally{m.value.delete(r)}}async function V(e){try{return await B.confirm(`${e.name} ${q(`@MKT:已安装,要重新安装吗?`)}`,q(`@MKT:重新安装`),{confirmButtonText:q(`@MKT:重装`),cancelButtonText:q(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function W(e){let t=`${e.target}:${e.id}`;_.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:e.target,cwd:v.value,id:e.id})}),r=await t.json().catch(()=>null);(!t.ok||!r?.success)&&j.error(r?.error||q(`@MKT:打开失败`))}catch{j.error(q(`@MKT:打开失败`))}finally{_.value.delete(t)}}async function G(e){try{await B.confirm(`${q(`@MKT:确定卸载`)} ${e.name}?`,q(`@MKT:卸载`),{confirmButtonText:q(`@MKT:卸载`),cancelButtonText:q(`@MKT:取消`),type:`warning`})}catch{return}let t=`${e.target}:${e.id}`;h.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:v.value}),r=await fetch(`/api/agent/marketplace/item/${n.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){j.error(i?.error||q(`@MKT:卸载失败`));return}j.success(q(`@MKT:已卸载`)),await b()}catch{j.error(q(`@MKT:卸载失败`))}finally{h.value.delete(t)}}let K={props:n,configStore:i,groups:a,installed:o,loading:l,searchInput:u,query:d,selectedSources:f,installTarget:p,installing:m,removing:h,revealing:_,cwd:v,get searchTimer(){return y},set searchTimer(e){y=e},loadCatalog:b,targetLabel:S,metricText:C,formatCount:w,cardKey:D,isBusy:O,installedByTarget:k,configDialog:A,needsConfig:M,openConfigDialog:N,confirmConfig:F,onInstall:L,doInstall:z,confirmReinstall:V,onReveal:W,onRemove:G,get $t(){return q},get Search(){return s},get Refresh(){return c},get Delete(){return ee},get Link(){return P},get Check(){return H},get Star(){return x},get Download(){return I},get Warning(){return T},get FolderOpened(){return r},CommonDialog:ne};return Object.defineProperty(K,"__isScriptSetup",{enumerable:!1,value:!0}),K}});n(),O(),o();var pe={class:`marketplace-panel`},Y={class:`mp-toolbar`},X={class:`mp-search`},me=[`placeholder`],he={class:`mp-toolbar-sub`},Z={class:`mp-target-hint`},Q={class:`mp-source-filter`},ge=[`onClick`],$={class:`mp-body`},_e={class:`mp-group-header`},ve={class:`mp-group-title`},ye={key:0,class:`mp-group-count`},be={key:1,class:`mp-group-error`},xe=[`href`,`title`],Se={key:0,class:`mp-grid`},Ce={class:`mp-card-head`},we=[`title`],Te={key:0,class:`mp-card-metric`},Ee=[`title`],De={class:`mp-card-meta`},Oe=[`title`],ke=[`title`],Ae={key:2,class:`mp-tag remote`},je={class:`mp-card-foot`},Me=[`href`],Ne={key:1,class:`mp-installed-chip`},Pe=[`disabled`,`onClick`],Fe={key:3,class:`mp-not-installable`},Ie={key:1,class:`mp-empty`},Le={key:0,class:`mp-group installed`},Re={class:`mp-group-header`},ze={class:`mp-group-title`},Be={class:`mp-group-count`},Ve={key:0,class:`mp-installed-block`},He={class:`mp-installed-target`},Ue={class:`mp-installed-list`},We=[`title`],Ge=[`title`],Ke={key:1,class:`mp-meta-pkg`},qe={key:2,class:`mp-tag warn`},Je=[`disabled`,`title`,`onClick`],Ye=[`disabled`,`onClick`],Xe={key:1,class:`mp-empty all`},Ze={key:0,class:`mkt-form`},Qe={class:`mkt-form-name`},$e=[`onUpdate:modelValue`,`placeholder`],et={key:0,class:`mkt-field`},tt={class:`mkt-hint`};function nt(t,n,r,o,s,c){let l=u,g=M,_=f,y=v,b=w;return S(),N(`div`,pe,[m(` ── 工具栏 ───────────────────────────────── `),a(`div`,Y,[a(`div`,X,[h(l,{class:`mp-search-icon`},{default:D(()=>[h(o.Search)]),_:1}),F(a(`input`,{"onUpdate:modelValue":n[0]||=e=>o.searchInput=e,class:`mp-search-input`,type:`text`,placeholder:r.type===`skill`?o.$t(`@MKT:搜索 Skill...`):o.$t(`@MKT:搜索 MCP 服务...`)},null,8,me),[[C,o.searchInput]])]),h(_,{modelValue:o.installTarget,"onUpdate:modelValue":n[1]||=e=>o.installTarget=e,size:`small`,class:`mp-target`},{default:D(()=>[h(g,{value:`project`},{default:D(()=>[p(k(o.$t(`@MKT:当前项目`)),1)]),_:1}),h(g,{value:`global`},{default:D(()=>[p(k(o.$t(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),h(y,{content:o.$t(`@MKT:刷新`),placement:`top`,"show-after":300},{default:D(()=>[a(`button`,{class:d([`mp-refresh`,{spinning:o.loading}]),onClick:o.loadCatalog},[h(l,null,{default:D(()=>[h(o.Refresh)]),_:1})],2)]),_:1},8,[`content`])]),a(`div`,he,[a(`span`,Z,[p(k(o.$t(`@MKT:安装到`))+` `,1),a(`b`,null,k(o.targetLabel),1)]),a(`div`,Q,[(S(!0),N(W,null,e(o.groups,e=>(S(),N(`button`,{key:e.id,class:d([`mp-chip`,{active:o.selectedSources.includes(e.id)}]),onClick:()=>{let t=o.selectedSources.indexOf(e.id);t>=0?o.selectedSources.splice(t,1):o.selectedSources.push(e.id)}},k(e.label),11,ge))),128)),o.selectedSources.length?(S(),N(`button`,{key:0,class:`mp-chip clear`,onClick:n[2]||=e=>o.selectedSources=[]},k(o.$t(`@MKT:全部来源`)),1)):m(`v-if`,!0)])]),m(` ── 内容 ─────────────────────────────────── `),F((S(),N(`div`,$,[(S(!0),N(W,null,e(o.groups,t=>(S(),N(`section`,{key:t.id,class:`mp-group`},[a(`header`,_e,[a(`h3`,ve,k(t.label),1),t.status===`ok`?(S(),N(`span`,ye,k(t.items.length),1)):(S(),N(`span`,be,[h(l,null,{default:D(()=>[h(o.Warning)]),_:1}),p(` `+k(t.error||o.$t(`@MKT:来源不可用`)),1)])),t.homepage?(S(),N(`a`,{key:2,class:`mp-group-link`,href:t.homepage,target:`_blank`,rel:`noopener noreferrer`,title:t.homepage},[h(l,null,{default:D(()=>[h(o.Link)]),_:1})],8,xe)):m(`v-if`,!0)]),t.status===`ok`&&t.items.length?(S(),N(`div`,Se,[(S(!0),N(W,null,e(t.items,t=>(S(),N(`article`,{key:o.cardKey(t),class:`mp-card`},[a(`div`,Ce,[a(`span`,{class:`mp-card-name`,title:t.name},k(t.name),9,we),o.metricText(t)?(S(),N(`span`,Te,[h(l,null,{default:D(()=>[t.stars?(S(),i(o.Star,{key:0})):(S(),i(o.Download,{key:1}))]),_:2},1024),p(` `+k(o.metricText(t)),1)])):m(`v-if`,!0)]),a(`p`,{class:`mp-card-desc`,title:t.description},k(t.description||o.$t(`@MKT:暂无描述`)),9,Ee),a(`div`,De,[t.package?(S(),N(`code`,{key:0,class:`mp-meta-pkg`,title:t.package},k(t.package),9,Oe)):t.repository?(S(),N(`span`,{key:1,class:`mp-meta-repo`,title:t.repository+(t.subpath?` · `+t.subpath:``)},[p(k(t.repository),1),t.subpath?(S(),N(W,{key:0},[p(` · `+k(t.subpath),1)],64)):m(`v-if`,!0)],8,ke)):m(`v-if`,!0),t.transport===`remote`?(S(),N(`span`,Ae,k(o.$t(`@MKT:远程服务`)),1)):m(`v-if`,!0),(S(!0),N(W,null,e((t.tags||[]).slice(0,2),e=>(S(),N(`span`,{key:e,class:`mp-tag`},k(e),1))),128))]),a(`div`,je,[t.upstream?(S(),N(`a`,{key:0,class:`mp-card-link`,href:t.upstream,target:`_blank`,rel:`noopener noreferrer`},k(o.$t(`@MKT:查看来源`)),9,Me)):m(`v-if`,!0),n[6]||=a(`span`,{class:`mp-foot-spacer`},null,-1),t.installed?(S(),N(`span`,Ne,[h(l,null,{default:D(()=>[h(o.Check)]),_:1}),p(k(o.$t(`@MKT:已安装`)),1)])):t.installable===!1?(S(),N(`span`,Fe,k(o.$t(`@MKT:暂不支持一键安装`)),1)):(S(),N(`button`,{key:2,class:`mp-install-btn`,disabled:o.isBusy(t),onClick:e=>o.onInstall(t)},k(o.isBusy(t)?o.$t(`@MKT:安装中...`):o.$t(`@MKT:安装`)),9,Pe))])]))),128))])):t.status===`ok`?(S(),N(`div`,Ie,k(o.$t(`@MKT:该来源暂无结果`)),1)):m(`v-if`,!0)]))),128)),m(` ── 已安装 ─────────────────────────────── `),o.installed.length?(S(),N(`section`,Le,[a(`header`,Re,[a(`h3`,ze,k(o.$t(`@MKT:已安装`)),1),a(`span`,Be,k(o.installed.length),1)]),(S(),N(W,null,e([`project`,`global`],t=>a(`div`,{key:t},[o.installedByTarget[t]?.length?(S(),N(`div`,Ve,[a(`div`,He,k(t===`project`?o.$t(`@MKT:当前项目`):o.$t(`@MKT:g ai 智能体`)),1),a(`div`,Ue,[(S(!0),N(W,null,e(o.installedByTarget[t],e=>(S(),N(`div`,{key:t+e.id,class:`mp-installed-row`},[a(`span`,{class:`mp-installed-name`,title:e.name},k(e.name),9,We),m(` 实际落盘的标识:SKILL.md 里的 name 常与仓库名不同(如仓库 taste-skill
2
+ 里的 skill 自称 brandkit),不显示这个用户就对不上广场卡片上的名字 `),e.id&&e.id!==e.name?(S(),N(`code`,{key:0,class:`mp-installed-id`,title:e.dir||e.file||e.id},k(e.id),9,Ge)):m(`v-if`,!0),e.package?(S(),N(`code`,Ke,k(e.package),1)):m(`v-if`,!0),e.requiredEnv?.length?(S(),N(`span`,qe,k(o.$t(`@MKT:待配置`))+`: `+k(e.requiredEnv.join(`, `)),1)):m(`v-if`,!0),n[7]||=a(`span`,{class:`mp-foot-spacer`},null,-1),a(`button`,{class:`mp-reveal-btn`,disabled:o.revealing.has(t+e.id),title:e.dir||e.file||``,onClick:t=>o.onReveal(e)},[h(l,null,{default:D(()=>[h(o.FolderOpened)]),_:1}),p(` `+k(o.$t(`@MKT:打开文件夹`)),1)],8,Je),a(`button`,{class:`mp-remove-btn`,disabled:o.removing.has(t+e.id),onClick:t=>o.onRemove(e)},[h(l,null,{default:D(()=>[h(o.Delete)]),_:1}),p(` `+k(o.removing.has(t+e.id)?o.$t(`@MKT:卸载中...`):o.$t(`@MKT:卸载`)),1)],8,Ye)]))),128))])])):m(`v-if`,!0)])),64))])):m(`v-if`,!0),!o.loading&&!o.groups.length?(S(),N(`div`,Xe,k(o.$t(`@MKT:加载失败`)),1)):m(`v-if`,!0)])),[[b,o.loading]]),m(` ── MCP 安装前配置 ───────────────────────── `),h(o.CommonDialog,{modelValue:o.configDialog.visible,"onUpdate:modelValue":n[5]||=e=>o.configDialog.visible=e,title:o.$t(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:D(()=>[a(`button`,{class:`mkt-cancel`,onClick:n[4]||=e=>o.configDialog.visible=!1},k(o.$t(`@MKT:取消`)),1),a(`button`,{class:`mkt-confirm`,onClick:o.confirmConfig},k(o.$t(`@MKT:安装`)),1)]),default:D(()=>[o.configDialog.item?(S(),N(`div`,Ze,[a(`p`,Qe,k(o.configDialog.item.name),1),(S(!0),N(W,null,e(Object.keys(o.configDialog.env),e=>(S(),N(`div`,{key:e,class:`mkt-field`},[a(`label`,null,k(e),1),F(a(`input`,{"onUpdate:modelValue":t=>o.configDialog.env[e]=t,type:`text`,autocomplete:`off`,placeholder:o.$t(`@MKT:环境变量值`),spellcheck:`false`},null,8,$e),[[C,o.configDialog.env[e]]])]))),128)),o.configDialog.item.args?.length?(S(),N(`div`,et,[a(`label`,null,k(o.$t(`@MKT:启动参数`)),1),F(a(`input`,{"onUpdate:modelValue":n[3]||=e=>o.configDialog.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[C,o.configDialog.args]]),a(`p`,tt,k(o.$t(`@MKT:参数提示`)),1)])):m(`v-if`,!0)])):m(`v-if`,!0)]),_:1},8,[`modelValue`,`title`])])}var rt=J(fe,[[`render`,nt],[`__scopeId`,`data-v-e9f9e851`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/MarketplacePanel.vue`]]);n(),z();var it=l({__name:`AgentView`,setup(e,{expose:n}){n();let r=te(),i=E(null),{narrow:a}=ue(i),o=E(`chat`),s=E(`chat`),c=g(()=>s.value===`mcp`?`mcp`:`skill`),l=g(()=>[{id:`chat`,label:q(`@AGENT:对话`),icon:A},{id:`skill`,label:q(`@AGENT:Skill 广场`),icon:_},{id:`mcp`,label:q(`@AGENT:MCP 广场`),icon:V}]),{sessions:d,sessionsLoading:f,currentSessionId:p,messages:m,isStreaming:h,sessionLoading:v,loadSessions:b,loadSession:x,deleteSession:S,renameSession:C,newSession:w,sendMessage:T,pendingQuestion:D,answeringQuestion:O,answerQuestion:k,isSessionGenerating:j,currentEngine:M,pendingEngine:N,isEngineLocked:P,pickEngine:F,stop:ee}=ce(),I=g(()=>P.value?M.value:N.value);function L(e){P.value||F(e)}let z=g(()=>{let e=r.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),B=g(()=>re(d.value,j)),H=se(),U=g(()=>B.value.find(e=>e.id===p.value)?.title||q(`@AGENT:对话`)),W={"--welcome-avatar":`url("${le}")`},J=g(()=>[{id:`p1`,label:q(`@AGENT:查看项目结构`),prompt:q(`@AGENT:prompt_p1`)},{id:`p2`,label:q(`@AGENT:分析代码质量`),prompt:q(`@AGENT:prompt_p2`)},{id:`p3`,label:q(`@AGENT:帮我写测试`),prompt:q(`@AGENT:prompt_p3`)},{id:`p4`,label:q(`@AGENT:Git 状态检查`),prompt:q(`@AGENT:prompt_p4`)},{id:`p5`,label:q(`@AGENT:帮我启动项目`),prompt:q(`@AGENT:prompt_p5`)}]);async function ne(e){await T(e.text,e.files),await y(),X()}async function fe(e){await T(e.prompt),await y(),X()}let pe=ie(),Y=E(null);function X(e=!0){Y.value?.scrollToBottom(e)}R(()=>m.value.length,()=>{y(()=>X(!1))});function me(e){x(e),o.value=`chat`}function he(){w(),o.value=`chat`}let Z=E(280),Q=E(!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)}R(a,e=>{e||(o.value=`chat`)}),R(()=>[r.currentDirectory,h.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await b(),p.value&&!h.value&&!d.value.some(e=>e.sessionId===p.value)&&w()},{immediate:!0});let $={configStore:r,rootRef:i,narrow:a,chatPage:o,activeTab:s,marketplaceType:c,tabs:l,sessions:d,sessionsLoading:f,currentSessionId:p,messages:m,isStreaming:h,sessionLoading:v,loadSessions:b,loadSession:x,deleteSession:S,renameSession:C,newSession:w,sendMessage:T,pendingQuestion:D,answeringQuestion:O,answerQuestion:k,isSessionGenerating:j,currentEngine:M,pendingEngine:N,isEngineLocked:P,pickEngine:F,stop:ee,displayEngine:I,handleEngineSelect:L,chatTheme:z,conversationItems:B,conversationLabels:H,currentSessionTitle:U,welcomeAvatarStyle:W,presetQuestions:J,onSend:ne,onSelectPreset:fe,questionLabels:pe,chatContainerRef:Y,scrollToBottom:X,selectSession:me,handleNewSession:he,sidebarWidth:Z,isResizing:Q,startResize:ge,get $t(){return q},get ElIcon(){return u},get Loading(){return t},get ChatContainer(){return G},get ConversationList(){return K},get AGENT_UPLOAD_ACCEPT(){return oe},get AGENT_ASSISTANT_NAME(){return ae},get AGENT_ASSISTANT_AVATAR(){return le},MarketplacePanel:rt,AgentEngineSelector:de};return Object.defineProperty($,"__isScriptSetup",{enumerable:!1,value:!0}),$}});n(),o();var at={ref:`rootRef`,class:`agent-view`},ot={class:`agent-chat-area`},st={class:`agent-tabs`,role:`tablist`},ct=[`aria-selected`,`onClick`],lt={class:`agent-tab-body`},ut={key:0,class:`agent-chat-pane`},dt={key:0,class:`agent-list-page`},ft={key:0,class:`agent-page-bar`},pt=[`title`,`aria-label`],mt={class:`agent-page-title`},ht={key:0,class:`chat-loading`};function gt(t,n,r,o,s,c){return S(),N(`div`,at,[m(` ═══ 宽屏:左侧会话列表(只在「对话」Tab 显示)═══
3
+ 窄屏时这一整块不渲染,会话列表改成 body 里的一个整页(见 .agent-list-page) `),o.activeTab===`chat`&&!o.narrow?(S(),N(W,{key:0},[a(`aside`,{class:`agent-sidebar`,style:b({width:o.sidebarWidth+`px`})},[m(` 会话列表:UI 与交互都在组件库的 ConversationList 里 `),h(o.ConversationList,{class:`agent-conversations`,items:o.conversationItems,"active-id":o.currentSessionId,loading:o.sessionsLoading,labels:o.conversationLabels,onSelect:o.selectSession,onNew:o.handleNewSession,onRename:o.renameSession,onDelete:o.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])],4),m(` 拖拽分隔条 `),a(`div`,{class:d([`sidebar-resizer`,{active:o.isResizing}]),onMousedown:o.startResize},null,34)],64)):m(`v-if`,!0),m(` ═══ 右侧:Tab 栏 + 内容区 ═══ `),a(`main`,ot,[a(`nav`,st,[(S(!0),N(W,null,e(o.tabs,e=>(S(),N(`button`,{key:e.id,type:`button`,class:d([`agent-tab`,{active:o.activeTab===e.id}]),role:`tab`,"aria-selected":o.activeTab===e.id,onClick:t=>o.activeTab=e.id},[h(o.ElIcon,null,{default:D(()=>[(S(),i(L(e.icon)))]),_:2},1024),a(`span`,null,k(e.label),1)],10,ct))),128)),m(` ═══ 引擎选择器 ═══
4
+ 与工作台执行器下拉同一套交互(点击展开、未安装标出来、点了直接开安装弹窗)。
5
+ 下拉本体收口在 AgentEngineSelector,文件空间 g ai 面板复用同一份实现。
6
+ 会话一旦落盘就置灰:引擎在会话建立时锁定(三家续聊标识互不通用),要换请新建。 `),o.activeTab===`chat`?(S(),i(o.AgentEngineSelector,{key:0,class:`agent-engine`,engine:o.displayEngine,locked:o.isEngineLocked,onSelect:o.handleEngineSelect},null,8,[`engine`,`locked`])):m(`v-if`,!0)]),a(`div`,lt,[m(` ── 对话 ── `),o.activeTab===`chat`?(S(),N(`div`,ut,[m(` 窄屏 · 会话列表页:列表独占整页 `),o.narrow&&o.chatPage===`list`?(S(),N(`div`,dt,[h(o.ConversationList,{class:`agent-conversations`,items:o.conversationItems,"active-id":o.currentSessionId,loading:o.sessionsLoading,labels:o.conversationLabels,onSelect:o.selectSession,onNew:o.handleNewSession,onRename:o.renameSession,onDelete:o.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])])):(S(),N(W,{key:1},[m(` 对话页(窄屏时顶上多一条返回条;宽屏左侧就摆着列表,不需要) `),o.narrow?(S(),N(`div`,ft,[a(`button`,{type:`button`,class:`agent-page-back`,title:o.$t(`@AGENT:返回会话列表`),"aria-label":o.$t(`@AGENT:返回会话列表`),onClick:n[0]||=e=>o.chatPage=`list`},[...n[1]||=[a(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[a(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),a(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,pt),a(`span`,mt,k(o.currentSessionTitle),1)])):m(`v-if`,!0),m(`
7
+ 对话宿主:单独开一层裁剪边界。
8
+ 欢迎页在矮/窄窗口里会比可用高度还高,而它是垂直居中的 —— 溢出的部分
9
+ 会**向上**跑出 .acu-chat,盖到刚加的返回条上(把返回条的点击也一起吃掉,
10
+ e2e 实测就是这个症状)。宿主的 overflow:hidden 把它裁在自己这一格里。
11
+ `),a(`div`,{class:`agent-chat-host`,style:o.welcomeAvatarStyle},[m(` 加载中 `),o.sessionLoading?(S(),N(`div`,ht,[h(o.ElIcon,{class:`is-loading`,size:32},{default:D(()=>[h(o.Loading)]),_:1}),a(`span`,null,k(o.$t(`@AGENT:加载会话中...`)),1)])):(S(),N(W,{key:1},[m(` ChatContainer `),h(o.ChatContainer,{ref:`chatContainerRef`,messages:o.messages,"preset-questions":o.presetQuestions,"welcome-title":o.$t(`@AGENT:智能体助手`),"welcome-description":o.$t(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":o.AGENT_ASSISTANT_NAME,"assistant-avatar":o.AGENT_ASSISTANT_AVATAR,theme:o.chatTheme,disabled:o.isStreaming,generating:o.isStreaming,"upload-config":{accept:o.AGENT_UPLOAD_ACCEPT},placeholder:o.isStreaming?o.$t(`@AGENT:正在生成中...`):o.$t(`@AGENT:输入消息,Enter 发送`),question:o.pendingQuestion,"question-submitting":o.answeringQuestion,"question-labels":o.questionLabels,"plan-config":{labels:{title:o.$t(`@AGENT:计划`),raw:o.$t(`@AGENT:原始参数`)}},onSend:o.onSend,onSelect:o.onSelectPreset,onStop:o.stop,onAnswer:o.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(),N(W,{key:1},[m(` ── Skill 广场 / MCP 广场 ── `),h(o.MarketplacePanel,{type:o.marketplaceType},null,8,[`type`])],2112))])])],512)}var _t=J(it,[[`render`,gt],[`__scopeId`,`data-v-bd681ddd`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/AgentView.vue`]]);export{_t as default};
@@ -0,0 +1,2 @@
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{At as e,Bn as t,Dn as n,En as r,Fr as i,In as a,J as o,Jr as s,Nn as c,On as l,Pn as u,Tn as d,W as f,Wn as p,Yn as m,Zn as h,br as g,cr as _,ei as v,i as y,kn as b,nt as x,or as S,pr as C,qn as w,r as T,rt as E,z as D}from"./element-plus-BM4vMiQt.js";import{n as O,t as k}from"./_plugin-vue_export-helper-CEyZbjNo.js";import{t as A}from"./CommonDialog-BU2WnvCP.js";async function j(e,t){let n=e.body.getReader(),r=new TextDecoder(`utf-8`),i=``;for(;;){let{done:e,value:a}=await n.read();if(e)break;i+=r.decode(a,{stream:!0});let o=i.split(`
2
+ `);i=o.pop()??``;for(let e of o)e.trim()&&t(e)}i.trim()&&t(i)}async function M(){let e=await fetch(`/api/app-version`);return e.ok?e.json():{success:!1,current:``,latest:null,hasUpdate:!1,error:`HTTP ${e.status}`}}async function ee(e){let t=await fetch(`/api/app-upgrade`,{method:`POST`});if(!t.ok){let n=`HTTP ${t.status}`;try{let e=await t.json();e?.error&&(n=e.error)}catch{}e({type:`error`,message:n}),e({type:`done`,code:t.status});return}if(!t.body){e({type:`error`,message:`响应无 body`}),e({type:`done`,code:-1});return}await j(t,t=>{try{e(JSON.parse(t))}catch{}})}async function N(){let e=await fetch(`/api/app-restart`,{method:`POST`});if(!e.ok){let t=`HTTP ${e.status}`;try{let n=await e.json();n?.error&&(t=n.error)}catch{}throw Error(t)}if(!e.body)throw Error(`响应无 body`);return new Promise((t,n)=>{let r=!1,i=e=>{r||(r=!0,e())};j(e,e=>{try{let r=JSON.parse(e);r.type===`ready`&&typeof r.port==`number`&&r.port>0?i(()=>t(r.port)):r.type===`timeout`?i(()=>n(Error(`restart.timeout`))):r.type===`error`&&i(()=>n(Error(r.message||`restart.failed`)))}catch{}}).then(()=>{i(()=>n(Error(`restart.stream-closed`)))}).catch(()=>{})})}t(),C();var P=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,F=a({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean,required:!0},logs:{type:String,required:!0},status:{type:String,required:!0},countdown:{type:Number,required:!1,default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(t,{expose:n,emit:r}){n();let i=t,a=r,o=g(null);S(()=>i.logs,async()=>{await p(),o.value&&(o.value.scrollTop=o.value.scrollHeight)});function s(){i.status!==`running`&&(i.status===`success`&&i.countdown>0&&a(`cancel`),a(`update:modelValue`,!1))}function c(){a(`retry`)}function l(){a(`restart`)}function u(){a(`cancel`),a(`update:modelValue`,!1)}async function d(){try{await navigator.clipboard.writeText(P),y.success(O(`@F13B4:已复制升级命令`))}catch{y.warning(O(`@F13B4:复制失败,请手动复制`))}}let f={MANUAL_COMMAND:P,props:i,emit:a,logEl:o,close:s,onRetry:c,onRestart:l,onLater:u,onCopyCommand:d,get Loading(){return e},get CircleCheck(){return x},get CircleClose(){return E},get $t(){return O},CommonDialog:A};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}});t(),i();var I={key:3},L={key:4},R={key:5},z={key:0,class:`upgrade-hint`},B={key:0,class:`upgrade-countdown`},V={key:1,class:`upgrade-manual`},H={class:`upgrade-manual__label`};function U(e,t,i,a,d,f){let p=o,m=D;return h(),n(a.CommonDialog,{"model-value":i.modelValue,"onUpdate:modelValue":t[0]||=e=>a.emit(`update:modelValue`,e),title:a.$t(`@F13B4:升级`),width:`680px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":i.status!==`running`,"append-to-body":``,onClose:a.close},{footer:_(()=>[i.status===`failed`?(h(),n(m,{key:0,type:`primary`,onClick:a.onRetry},{default:_(()=>[c(v(a.$t(`@F13B4:重试`)),1)]),_:1})):l(`v-if`,!0),i.status===`failed`?(h(),n(m,{key:1,onClick:a.onCopyCommand},{default:_(()=>[c(v(a.$t(`@F13B4:复制升级命令`)),1)]),_:1})):l(`v-if`,!0),i.status===`success`?(h(),n(m,{key:2,type:`primary`,onClick:a.onRestart},{default:_(()=>[c(v(a.$t(`@F13B4:立即重启并刷新`)),1)]),_:1})):l(`v-if`,!0),i.status===`success`?(h(),n(m,{key:3,onClick:a.onLater},{default:_(()=>[c(v(a.$t(`@F13B4:稍后手动重启`)),1)]),_:1})):l(`v-if`,!0),i.status===`running`?(h(),n(m,{key:4,disabled:``},{default:_(()=>[c(v(a.$t(`@F13B4:升级中`))+`... `,1)]),_:1})):l(`v-if`,!0)]),default:_(()=>[r(`div`,{class:s([`upgrade-status`,`is-${i.status}`])},[i.status===`running`?(h(),n(p,{key:0,class:`is-loading`},{default:_(()=>[u(a.Loading)]),_:1})):i.status===`success`?(h(),n(p,{key:1,color:`var(--color-success)`},{default:_(()=>[u(a.CircleCheck)]),_:1})):(h(),n(p,{key:2,color:`var(--color-danger)`},{default:_(()=>[u(a.CircleClose)]),_:1})),i.status===`running`?(h(),b(`span`,I,v(a.$t(`@F13B4:升级中`)),1)):i.status===`success`?(h(),b(`span`,L,v(a.$t(`@F13B4:升级完成`)),1)):(h(),b(`span`,R,v(a.$t(`@F13B4:升级失败`)),1))],2),i.status===`success`?(h(),b(`p`,z,[c(v(a.$t(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),i.countdown>0?(h(),b(`span`,B,v(a.$t(`@F13B4:{seconds} 秒后自动刷新`,{seconds:i.countdown})),1)):l(`v-if`,!0)])):l(`v-if`,!0),i.status===`failed`?(h(),b(`p`,V,[r(`span`,H,v(a.$t(`@F13B4:手动升级命令`)),1),r(`code`,{class:`upgrade-manual__cmd`},v(a.MANUAL_COMMAND))])):l(`v-if`,!0),r(`pre`,{ref:`logEl`,class:`upgrade-log`},v(i.logs||a.$t(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}var W=k(F,[[`render`,U],[`__scopeId`,`data-v-bc566bba`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/UpgradeDialog.vue`]]);t(),C();var G=`https://github.com/xz333221/zen-gitsync/releases`,K=5,q=`app-version-check`,J=36e5,Y=a({__name:`AppVersionBadge`,setup(e,{expose:t}){t();let n=`2.17.44`,r=g(n),i=d(()=>r.value||n),a=g(null),o=g(!1),s=g(``),c=g(`running`),l=g(0),u=null,f=g(!1);function p(){try{let e=sessionStorage.getItem(q);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>J?null:n}catch{return null}}function h(e){try{sessionStorage.setItem(q,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function _(e=!1){let t=p();t&&(a.value=t);try{let t=await M();a.value=t,h(t),t.current&&(r.value=t.current),!e&&t.success&&t.hasUpdate&&y({type:`success`,message:O(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||y({type:`warning`,message:O(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function v(){if(a.value?.hasUpdate){try{await T.confirm(O(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:a.value.current,latest:a.value.latest}),O(`@F13B4:升级`),{confirmButtonText:O(`@F13B4:确定升级`),cancelButtonText:O(`@F13B4:取消`),type:`info`})}catch{return}s.value=``,c.value=`running`,o.value=!0,await ee(e=>{if(e.type===`done`){if(c.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(q)}catch{}a.value?.latest&&(r.value=a.value.latest),b()}}else e.message&&(s.value+=e.message)})}}function b(){x(),l.value=K,u=setInterval(()=>{--l.value,l.value<=0&&(u&&=(clearInterval(u),null),C())},1e3)}function x(){u&&=(clearInterval(u),null),l.value=0}function S(){x()}async function C(){if(x(),!f.value){f.value=!0;try{let e=await N(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];y({type:`warning`,message:n?O(n):O(`@F13B4:重启失败 {error}`,{error:t})}),f.value=!1}}}w(()=>{x()}),m(()=>{_(!0)});let E={buildVersion:n,releasesUrl:G,runtimeVersion:r,displayVersion:i,latestInfo:a,upgradeDialogVisible:o,upgradeLogs:s,upgradeStatus:c,AUTO_REFRESH_SECONDS:K,countdown:l,get countdownTimer(){return u},set countdownTimer(e){u=e},restartInFlight:f,CACHE_KEY:q,CACHE_TTL_MS:J,readCache:p,writeCache:h,checkUpdate:_,handleUpgrade:v,startAutoRefreshCountdown:b,cancelAutoRefreshCountdown:x,handleCancelAutoRefresh:S,handleRestart:C,get $t(){return O},UpgradeDialog:W};return Object.defineProperty(E,"__isScriptSetup",{enumerable:!1,value:!0}),E}});t(),i();var X={class:`app-version-badge`},Z=[`aria-label`],Q=[`aria-label`],$=[`title`,`aria-label`],te={class:`upgrade-btn__label`},ne={class:`upgrade-btn__version`};function re(e,t,n,i,a,o){let s=f;return h(),b(`div`,X,[l(` GitHub 链接 `),u(s,{content:i.$t(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:_(()=>[r(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i.$t(`@F13B4:在 GitHub 上查看源码`)},[...t[1]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z`})],-1)]],8,Z)]),_:1},8,[`content`]),l(` NPM 链接 `),u(s,{content:i.$t(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:_(()=>[r(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i.$t(`@F13B4:在 npm 上查看包`)},[...t[2]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,Q)]),_:1},8,[`content`]),l(` 版本号 `),u(s,{content:i.$t(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:_(()=>[r(`a`,{href:i.releasesUrl,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+v(i.displayVersion),1)]),_:1},8,[`content`]),i.latestInfo?.hasUpdate?(h(),b(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),"aria-label":i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),onClick:i.handleUpgrade},[t[3]||=r(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),r(`span`,te,v(i.$t(`@F13B4:升级`)),1),r(`span`,ne,`v`+v(i.latestInfo.latest),1)],8,$)):l(`v-if`,!0),u(i.UpgradeDialog,{modelValue:i.upgradeDialogVisible,"onUpdate:modelValue":t[0]||=e=>i.upgradeDialogVisible=e,logs:i.upgradeLogs,status:i.upgradeStatus,countdown:i.countdown,onRetry:i.handleUpgrade,onRestart:i.handleRestart,onCancel:i.handleCancelAutoRefresh},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}var ie=k(Y,[[`render`,re],[`__scopeId`,`data-v-7e0300ec`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AppVersionBadge.vue`]]);export{ie as default};
@@ -1 +1 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,Dn as n,En as r,F as i,Fr as a,G as o,Ht as s,I as c,In as l,J as u,Jr as d,K as f,Nt as p,On as m,Pn as h,Tn as g,U as _,Zn as v,br as y,cr as b,dn as x,ei as S,kn as C,pr as w,r as T,tt as E,xn as D,yn as O,zt as k}from"./element-plus-C8IhrglD.js";import{n as A,t as j}from"./_plugin-vue_export-helper-DibQ4qNS.js";import{t as M}from"./SvgIcon-Dd0dgVcd.js";import{t as N}from"./CommonDialog-BT6e135Y.js";import{B as P,V as F}from"./index-ED00NaPI.js";t(),w();var I=l({__name:`BranchSelector`,emits:[`branchChanged`],setup(e,{expose:t,emit:n}){t();let r=P(),i=n,a=y(!1),o=y(``),c=g(()=>{let e=o.value.trim().toLowerCase();return e?r.allBranches.filter(t=>t.toLowerCase().includes(e)):r.allBranches});async function l(e){if(e===r.currentBranch){a.value=!1;return}a.value=!1,await r.changeBranch(e)&&(i(`branchChanged`),r.refreshLog())}let u=y(!1),d=y(``),f=y(``);function m(){a.value=!1,f.value=r.currentBranch,u.value=!0}async function h(){await r.createBranch(d.value,f.value)&&(u.value=!1,d.value=``,i(`branchChanged`))}let _=y(!1);async function v(){if(!_.value){_.value=!0;try{await Promise.all([r.getCurrentBranch(!0),r.getBranchStatus(!0),r.getAllBranches()]),i(`branchChanged`),r.refreshLog()}finally{_.value=!1}}}let b={gitStore:r,emit:i,branchPopoverVisible:a,branchFilter:o,filteredBranches:c,selectBranch:l,createBranchDialogVisible:u,newBranchName:d,selectedBaseBranch:f,openCreateBranchDialog:m,createNewBranch:h,isRefreshingBranch:_,refreshCurrentBranch:v,get $t(){return A},get Plus(){return k},get Menu(){return p},get Check(){return E},get Refresh(){return s},CommonDialog:N,IconButton:F,SvgIcon:M};return Object.defineProperty(b,"__isScriptSetup",{enumerable:!1,value:!0}),b}});t(),a(),x();var L={key:0,class:`branch-info`},R={class:`branch-wrapper`},z={class:`branch-btn`},B={class:`branch-btn-name`},V={class:`branch-btn-caret`},H={class:`branch-popover-inner`},U={class:`branch-search`},W={class:`branch-list`},G=[`onClick`],K={key:1,class:`branch-item-check-placeholder`},q={class:`branch-item-name`},J={key:0,class:`branch-empty`},Y={class:`branch-popover-footer`},X={class:`create-branch-content`},Z={class:`form-label`},Q={class:`form-label`},$={class:`dialog-footer`},ee={class:`footer-actions`},te=[`disabled`];function ne(t,a,s,l,p,g){let y=u,x=_,w=T,E=f,k=i,A=c,j=o;return l.gitStore.currentBranch?(v(),C(`div`,L,[r(`div`,R,[m(` VSCode 风格分支按钮 + 弹出列表 `),h(w,{visible:l.branchPopoverVisible,"onUpdate:visible":a[1]||=e=>l.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:a[2]||=e=>l.branchFilter=``},{reference:b(()=>[r(`button`,z,[h(l.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),r(`span`,B,S(l.gitStore.currentBranch),1),r(`span`,V,[h(y,null,{default:b(()=>[...a[7]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.776a29.12 29.12 0 0 0 0-41.6 30.592 30.592 0 0 0-42.752 0z`})],-1)]]),_:1})])])]),default:b(()=>[r(`div`,H,[m(` 搜索框 `),r(`div`,U,[h(x,{modelValue:l.branchFilter,"onUpdate:modelValue":a[0]||=e=>l.branchFilter=e,placeholder:l.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),m(` 分支列表 `),r(`div`,W,[(v(!0),C(D,null,e(l.filteredBranches,e=>(v(),C(`div`,{key:e,class:d([`branch-item`,{"is-active":e===l.gitStore.currentBranch}]),onClick:t=>l.selectBranch(e)},[e===l.gitStore.currentBranch?(v(),n(y,{key:0,class:`branch-item-check`},{default:b(()=>[h(l.Check)]),_:1})):(v(),C(`span`,K)),h(l.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),r(`span`,q,S(e),1)],10,G))),128)),l.filteredBranches.length===0?(v(),C(`div`,J,S(l.$t(`@F13B4:没有匹配的分支`)),1)):m(`v-if`,!0)]),m(` 底部:创建新分支 `),r(`div`,Y,[r(`button`,{class:`branch-create-btn`,onClick:l.openCreateBranchDialog},[h(y,null,{default:b(()=>[h(l.Plus)]),_:1}),r(`span`,null,S(l.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),m(` 刷新按钮 `),h(l.IconButton,{tooltip:l.$t(`@CMDCON:刷新`),onClick:l.refreshCurrentBranch},{default:b(()=>[h(y,{class:d({"is-loading":l.isRefreshingBranch})},{default:b(()=>[h(l.Refresh)]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),m(` 创建分支对话框 `),h(l.CommonDialog,{modelValue:l.createBranchDialogVisible,"onUpdate:modelValue":a[6]||=e=>l.createBranchDialogVisible=e,title:l.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:b(()=>[r(`div`,$,[r(`div`,ee,[r(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:a[5]||=e=>l.createBranchDialogVisible=!1},S(l.$t(`@F13B4:取消`)),1),r(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:l.createNewBranch,disabled:l.gitStore.isCreatingBranch},[l.gitStore.isCreatingBranch?(v(),n(y,{key:1,class:`is-loading`},{default:b(()=>[...a[8]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z`})],-1)]]),_:1})):(v(),n(y,{key:0},{default:b(()=>[h(l.Check)]),_:1})),r(`span`,null,S(l.$t(`@F13B4:创建`)),1)],8,te)])])]),default:b(()=>[r(`div`,X,[h(j,{model:{newBranchName:l.newBranchName,selectedBaseBranch:l.selectedBaseBranch},"label-position":`top`},{default:b(()=>[h(E,null,{label:b(()=>[r(`div`,Z,[h(y,{class:`label-icon`},{default:b(()=>[h(l.Plus)]),_:1}),r(`span`,null,S(l.$t(`@F13B4:新分支名称`)),1)])]),default:b(()=>[h(x,{modelValue:l.newBranchName,"onUpdate:modelValue":a[3]||=e=>l.newBranchName=e,placeholder:l.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:O(l.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),h(E,null,{label:b(()=>[r(`div`,Q,[h(y,{class:`label-icon`},{default:b(()=>[h(l.Menu)]),_:1}),r(`span`,null,S(l.$t(`@F13B4:基于分支`)),1)])]),default:b(()=>[h(A,{modelValue:l.selectedBaseBranch,"onUpdate:modelValue":a[4]||=e=>l.selectedBaseBranch=e,placeholder:l.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:b(()=>[(v(!0),C(D,null,e(l.gitStore.allBranches,e=>(v(),n(k,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):m(`v-if`,!0)}var re=j(I,[[`render`,ne],[`__scopeId`,`data-v-9548a76f`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{re as default};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,Dn as n,En as r,F as i,Fr as a,G as o,Ht as s,I as c,In as l,J as u,Jr as d,K as f,Nt as p,On as m,Pn as h,Tn as g,U as _,Zn as v,_ as y,br as b,cr as x,dn as S,ei as C,kn as w,pr as T,tt as E,xn as D,yn as O,zt as k}from"./element-plus-BM4vMiQt.js";import{n as A,t as j}from"./_plugin-vue_export-helper-CEyZbjNo.js";import{t as M}from"./SvgIcon-DKzB5l7x.js";import{t as N}from"./CommonDialog-BU2WnvCP.js";import{B as P,V as F}from"./index-BUX1f2WT.js";t(),T();var I=l({__name:`BranchSelector`,emits:[`branchChanged`],setup(e,{expose:t,emit:n}){t();let r=P(),i=n,a=b(!1),o=b(``),c=g(()=>{let e=o.value.trim().toLowerCase();return e?r.allBranches.filter(t=>t.toLowerCase().includes(e)):r.allBranches});async function l(e){if(e===r.currentBranch){a.value=!1;return}a.value=!1,await r.changeBranch(e)&&(i(`branchChanged`),r.refreshLog())}let u=b(!1),d=b(``),f=b(``);function m(){a.value=!1,f.value=r.currentBranch,u.value=!0}async function h(){await r.createBranch(d.value,f.value)&&(u.value=!1,d.value=``,i(`branchChanged`))}let _=b(!1);async function v(){if(!_.value){_.value=!0;try{await Promise.all([r.getCurrentBranch(!0),r.getBranchStatus(!0),r.getAllBranches()]),i(`branchChanged`),r.refreshLog()}finally{_.value=!1}}}let y={gitStore:r,emit:i,branchPopoverVisible:a,branchFilter:o,filteredBranches:c,selectBranch:l,createBranchDialogVisible:u,newBranchName:d,selectedBaseBranch:f,openCreateBranchDialog:m,createNewBranch:h,isRefreshingBranch:_,refreshCurrentBranch:v,get $t(){return A},get Plus(){return k},get Menu(){return p},get Check(){return E},get Refresh(){return s},CommonDialog:N,IconButton:F,SvgIcon:M};return Object.defineProperty(y,"__isScriptSetup",{enumerable:!1,value:!0}),y}});t(),a(),S();var L={key:0,class:`branch-info`},R={class:`branch-wrapper`},z={class:`branch-btn`},B={class:`branch-btn-name`},V={class:`branch-btn-caret`},H={class:`branch-popover-inner`},U={class:`branch-search`},W={class:`branch-list`},G=[`onClick`],K={key:1,class:`branch-item-check-placeholder`},q={class:`branch-item-name`},J={key:0,class:`branch-empty`},Y={class:`branch-popover-footer`},X={class:`create-branch-content`},Z={class:`form-label`},Q={class:`form-label`},$={class:`dialog-footer`},ee={class:`footer-actions`},te=[`disabled`];function ne(t,a,s,l,p,g){let b=u,S=_,T=y,E=f,k=i,A=c,j=o;return l.gitStore.currentBranch?(v(),w(`div`,L,[r(`div`,R,[m(` VSCode 风格分支按钮 + 弹出列表 `),h(T,{visible:l.branchPopoverVisible,"onUpdate:visible":a[1]||=e=>l.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:a[2]||=e=>l.branchFilter=``},{reference:x(()=>[r(`button`,z,[h(l.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),r(`span`,B,C(l.gitStore.currentBranch),1),r(`span`,V,[h(b,null,{default:x(()=>[...a[7]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.776a29.12 29.12 0 0 0 0-41.6 30.592 30.592 0 0 0-42.752 0z`})],-1)]]),_:1})])])]),default:x(()=>[r(`div`,H,[m(` 搜索框 `),r(`div`,U,[h(S,{modelValue:l.branchFilter,"onUpdate:modelValue":a[0]||=e=>l.branchFilter=e,placeholder:l.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),m(` 分支列表 `),r(`div`,W,[(v(!0),w(D,null,e(l.filteredBranches,e=>(v(),w(`div`,{key:e,class:d([`branch-item`,{"is-active":e===l.gitStore.currentBranch}]),onClick:t=>l.selectBranch(e)},[e===l.gitStore.currentBranch?(v(),n(b,{key:0,class:`branch-item-check`},{default:x(()=>[h(l.Check)]),_:1})):(v(),w(`span`,K)),h(l.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),r(`span`,q,C(e),1)],10,G))),128)),l.filteredBranches.length===0?(v(),w(`div`,J,C(l.$t(`@F13B4:没有匹配的分支`)),1)):m(`v-if`,!0)]),m(` 底部:创建新分支 `),r(`div`,Y,[r(`button`,{class:`branch-create-btn`,onClick:l.openCreateBranchDialog},[h(b,null,{default:x(()=>[h(l.Plus)]),_:1}),r(`span`,null,C(l.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),m(` 刷新按钮 `),h(l.IconButton,{tooltip:l.$t(`@CMDCON:刷新`),onClick:l.refreshCurrentBranch},{default:x(()=>[h(b,{class:d({"is-loading":l.isRefreshingBranch})},{default:x(()=>[h(l.Refresh)]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),m(` 创建分支对话框 `),h(l.CommonDialog,{modelValue:l.createBranchDialogVisible,"onUpdate:modelValue":a[6]||=e=>l.createBranchDialogVisible=e,title:l.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:x(()=>[r(`div`,$,[r(`div`,ee,[r(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:a[5]||=e=>l.createBranchDialogVisible=!1},C(l.$t(`@F13B4:取消`)),1),r(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:l.createNewBranch,disabled:l.gitStore.isCreatingBranch},[l.gitStore.isCreatingBranch?(v(),n(b,{key:1,class:`is-loading`},{default:x(()=>[...a[8]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z`})],-1)]]),_:1})):(v(),n(b,{key:0},{default:x(()=>[h(l.Check)]),_:1})),r(`span`,null,C(l.$t(`@F13B4:创建`)),1)],8,te)])])]),default:x(()=>[r(`div`,X,[h(j,{model:{newBranchName:l.newBranchName,selectedBaseBranch:l.selectedBaseBranch},"label-position":`top`},{default:x(()=>[h(E,null,{label:x(()=>[r(`div`,Z,[h(b,{class:`label-icon`},{default:x(()=>[h(l.Plus)]),_:1}),r(`span`,null,C(l.$t(`@F13B4:新分支名称`)),1)])]),default:x(()=>[h(S,{modelValue:l.newBranchName,"onUpdate:modelValue":a[3]||=e=>l.newBranchName=e,placeholder:l.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:O(l.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),h(E,null,{label:x(()=>[r(`div`,Q,[h(b,{class:`label-icon`},{default:x(()=>[h(l.Menu)]),_:1}),r(`span`,null,C(l.$t(`@F13B4:基于分支`)),1)])]),default:x(()=>[h(A,{modelValue:l.selectedBaseBranch,"onUpdate:modelValue":a[4]||=e=>l.selectedBaseBranch=e,placeholder:l.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:x(()=>[(v(!0),w(D,null,e(l.gitStore.allBranches,e=>(v(),n(k,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):m(`v-if`,!0)}var re=j(I,[[`render`,ne],[`__scopeId`,`data-v-9548a76f`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{re as default};
@@ -0,0 +1,14 @@
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,At as t,Bn as n,Cn as r,Dn as i,En as a,F as o,Fr as s,I as c,In as l,J as u,Jr as d,On as f,Pn as p,Tn as m,U as h,V as g,W as _,Wn as v,Xr as y,Y as ee,Yn as te,Zn as b,bn as x,br as S,cr as C,dn as w,ei as T,ht as E,i as D,kn as O,ln as k,lr as A,or as j,pr as M,q as N,vn as P,vr as F,xn as I,z as L}from"./element-plus-BM4vMiQt.js";import{n as R,t as z}from"./_plugin-vue_export-helper-CEyZbjNo.js";import{t as B}from"./SvgIcon-DKzB5l7x.js";import{r as ne,t as V}from"./configStore-DZgueZaZ.js";import{B as H,E as re,R as U,V as ie,c as W,l as G,o as ae,s as K,u as q}from"./index-BUX1f2WT.js";n();var oe=l({__name:`GlobalLoading`,props:{visible:{type:Boolean,required:!1,default:!1},text:{type:String,required:!1,default:R(`@2AEBA:加载中...`)},showProgress:{type:Boolean,required:!1,default:!1},progress:{type:Number,required:!1,default:0},mock:{type:Boolean,required:!1,default:!1}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});n(),s(),w();var se={class:`loading-container`},J={class:`loading-text`},ce={key:0,class:`loading-progress`};function le(e,t,n,o,s,c){return b(),i(r,{to:`body`},[p(k,{name:`loading-fade`},{default:C(()=>[n.visible||n.mock?(b(),O(`div`,{key:0,class:`global-loading-overlay`,onClick:t[0]||=x(()=>{},[`stop`])},[a(`div`,se,[f(` 主加载器 `),t[1]||=a(`div`,{class:`loading-spinner`},[a(`div`,{class:`spinner-ring`}),a(`div`,{class:`spinner-ring`}),a(`div`,{class:`spinner-ring`})],-1),f(` 加载文字 `),a(`div`,J,T(n.text),1),f(` 进度条(可选/Mock) `),n.showProgress||n.mock?(b(),O(`div`,ce,[a(`div`,{class:d([`progress-bar`,{"is-mock":n.mock&&!n.showProgress}]),style:y(n.showProgress?{width:n.progress+`%`}:void 0)},null,6)])):f(`v-if`,!0)])])):f(`v-if`,!0)]),_:1})])}var ue=z(oe,[[`render`,le],[`__scopeId`,`data-v-77e24a5f`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/GlobalLoading.vue`]]);n();var Y=l({__name:`SuccessModal`,props:{visible:{type:Boolean,required:!1,default:!1},text:{type:String,required:!1,default:R(`@71545:操作成功!`)},description:{type:String,required:!1,default:``}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});n(),s(),w();var X={class:`success-container`},de={class:`success-text`},fe={key:0,class:`success-description`};function pe(e,t,n,o,s,c){return b(),i(r,{to:`body`},[p(k,{name:`success-fade`},{default:C(()=>[n.visible?(b(),O(`div`,{key:0,class:`success-overlay`,onClick:t[0]||=x(()=>{},[`stop`])},[a(`div`,X,[f(` 成功图标 `),t[1]||=a(`div`,{class:`success-icon`},[a(`svg`,{viewBox:`0 0 52 52`,class:`success-svg`},[a(`circle`,{class:`success-circle`,cx:`26`,cy:`26`,r:`25`,fill:`none`}),a(`path`,{class:`success-check`,fill:`none`,d:`m14.1 27.2l7.1 7.2 16.7-16.8`})])],-1),f(` 成功文字 `),a(`div`,de,T(n.text),1),f(` 描述文字 `),n.description?(b(),O(`div`,fe,T(n.description),1)):f(`v-if`,!0)])])):f(`v-if`,!0)]),_:1})])}var me=z(Y,[[`render`,pe],[`__scopeId`,`data-v-30ab4535`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/SuccessModal.vue`]]);M();var Z=F({visible:!1,text:R(`@F2A3A:加载中...`),showProgress:!1,progress:0});function he(){return{loadingState:Z,show:e=>{Z.visible=!0,Z.text=e?.text||R(`@F2A3A:加载中...`),Z.showProgress=e?.showProgress||!1,Z.progress=e?.progress||0},hide:()=>{Z.visible=!1},updateProgress:e=>{Z.progress=Math.max(0,Math.min(100,e))},updateText:e=>{Z.text=e},setText:e=>{Z.visible&&(Z.text=e)}}}M();var Q=F({visible:!1,text:R(`@B8591:操作成功!`),description:``});function ge(){let e=e=>{Q.visible=!0,Q.text=e?.text||R(`@B8591:操作成功!`),Q.description=e?.description||``;let n=e?.duration||2e3;setTimeout(()=>{t()},n)},t=()=>{Q.visible=!1};return{successState:Q,show:e,hide:t}}n();var _e=l({__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=H(),i=V(),a=e,o=n,s=m(()=>r.fileList.some(e=>!U(e.path,i.lockedFiles))),c=m(()=>r.isSelectionMode&&r.selectedFiles.size>0&&r.selectedUnstagedPaths.length>0),l=m(()=>r.hasConflictedFiles?!0:r.isSelectionMode?!c.value||!a.hasUserCommitMessage:!s.value||!a.hasUserCommitMessage),u=m(()=>r.isAddingFiles||r.isCommiting),d=m(()=>r.hasConflictedFiles?R(`@2E184:存在冲突文件,请先解决冲突`):r.isSelectionMode?r.selectedFiles.size===0?R(`@2E184:请先勾选要提交的文件`):r.selectedUnstagedPaths.length===0?R(`@2E184:所选文件无需暂存或被锁定`):a.hasUserCommitMessage?R(`@2E184:一键完成:仅暂存所选文件 → 提交`):R(`@2E184:请输入提交信息`):s.value?a.hasUserCommitMessage?R(`@2E184:一键完成:暂存所有更改 → 提交`):R(`@2E184:请输入提交信息`):R(`@2E184:没有需要提交的更改`)),f=m(()=>r.isSelectionMode&&c.value?R(`@2E184:一键提交所选`):R(`@2E184:一键提交`)),p=m(()=>a.from===`form`?r.isSelectionMode&&c.value?R(`@2E184:暂存所选 + 提交`):R(`@2E184:暂存 + 提交`):``);async function h(){o(`beforeCommit`);try{let e=await r.stageSelectedAndCommit(a.finalCommitMessage,a.skipHooks);e&&o(`clearFields`),o(`afterCommit`,e)}catch(e){console.error(`一键提交失败:`,e),o(`afterCommit`,!1)}}t({triggerQuickCommit:h});let g={gitStore:r,configStore:i,props:a,emit:o,hasAnyChanges:s,hasSelectedToStage:c,isDisabled:l,isLoading:u,tooltipText:d,buttonTitle:f,buttonDesc:p,handleQuickCommit:h,get ElTooltip(){return _},get Edit(){return E}};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}});n(),s();var ve={class:`one-commit-content`},ye={class:`one-commit-text`},be={class:`one-commit-title`},xe={key:0,class:`one-commit-desc`};function Se(e,t,n,r,i,o){let s=u,c=L;return b(),O(`div`,null,[p(r.ElTooltip,{content:r.tooltipText,placement:`top`,"show-after":200},{default:C(()=>[p(c,{type:`primary`,onClick:r.handleQuickCommit,loading:r.isLoading,disabled:r.isDisabled,class:d([n.from,`one-commit-button`])},{default:C(()=>[a(`div`,ve,[p(s,{class:`one-commit-icon`},{default:C(()=>[p(r.Edit)]),_:1}),a(`div`,ye,[a(`span`,be,T(r.buttonTitle),1),n.from===`form`?(b(),O(`span`,xe,T(r.buttonDesc),1)):f(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}var Ce=z(_e,[[`render`,Se],[`__scopeId`,`data-v-0c962829`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/buttons/QuickCommitButton.vue`]]);n();var we=l({__name:`AiQuickPushButton`,props:{from:{type:String,required:!1,default:`form`},generating:{type:Boolean,required:!1,default:!1}},emits:[`trigger`],setup(e,{expose:t,emit:n}){t();let r=H(),i=V(),a=e,o=n,s=m(()=>r.fileList.some(e=>!U(e.path,i.lockedFiles))),c=m(()=>r.isSelectionMode&&r.selectedFiles.size>0&&r.selectedUnstagedPaths.length>0),l=m(()=>!r.isSelectionMode&&!s.value&&r.branchAhead>0),u=m(()=>r.hasConflictedFiles||!r.hasUpstream?!0:r.isSelectionMode?!c.value:!s.value&&r.branchAhead===0),d=m(()=>a.generating||r.isAddingFiles||r.isCommiting||r.isPushing),f=m(()=>r.hasConflictedFiles?R(`@2E184:存在冲突文件,请先解决冲突`):r.hasUpstream?a.generating?R(`@2E184:AI 正在生成提交信息…`):r.isSelectionMode?c.value?R(`@2E184:一键完成:AI 生成提交信息 → 仅暂存所选文件 → 提交 → 推送`):R(`@2E184:请先勾选要推送的文件`):!s.value&&r.branchAhead===0?R(`@2E184:没有需要提交或推送的更改`):s.value?R(`@2E184:一键完成:AI 生成提交信息 → 暂存所有更改 → 提交 → 推送`):R(`@2E184:本地已提交,AI 将直接推送到远程仓库`):R(`@2E184:当前分支没有上游分支`)),p=m(()=>r.isSelectionMode&&c.value?R(`@2E184:AI 提交并推送所选`):R(`@2E184:AI 提交并推送`)),h=m(()=>a.from===`form`?l.value?R(`@2E184:本地已提交,直接推送`):R(`@2E184:AI 生成信息 + 推送`):``);function g(){u.value||d.value||o(`trigger`)}let v={gitStore:r,configStore:i,props:a,emit:o,hasAnyChanges:s,hasSelectedToStage:c,isPushOnly:l,isDisabled:u,isLoading:d,tooltipText:f,buttonTitle:p,buttonDesc:h,handleClick:g,get ElTooltip(){return _},SvgIcon:B};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}});n(),s();var $={class:`one-ai-push`},Te={class:`one-ai-push-content`},Ee={class:`one-ai-push-text`},De={class:`one-ai-push-title`},Oe={key:0,class:`one-ai-push-desc`};function ke(e,t,n,r,i,o){let s=L;return b(),O(`div`,$,[p(r.ElTooltip,{content:r.tooltipText,placement:`top`,"show-after":200},{default:C(()=>[p(s,{type:`primary`,onClick:r.handleClick,loading:r.isLoading,disabled:r.isDisabled,class:d([n.from,`one-ai-push-button`])},{default:C(()=>[a(`div`,Te,[p(r.SvgIcon,{class:`one-ai-push-icon`,"icon-class":`ai-commit`,style:{color:`#fff`}}),a(`div`,Ee,[a(`span`,De,T(r.buttonTitle),1),n.from===`form`?(b(),O(`span`,Oe,T(r.buttonDesc),1)):f(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}var Ae=z(we,[[`render`,ke],[`__scopeId`,`data-v-0a8120f6`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/buttons/AiQuickPushButton.vue`]]);n(),M();var je=l({__name:`GitActionButtons`,props:{hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1},from:{type:String,required:!1,default:`form`},aiGenerating:{type:Boolean,required:!1,default:!1}},emits:[`afterCommit`,`afterPush`,`beforePush`,`pushStart`,`clearFields`,`aiQuickPush`],setup(e,{expose:t,emit:n}){let r=n,i=S(null);function a(e){r(`afterCommit`,e)}function o(e){r(`afterPush`,e)}function s(){r(`beforePush`)}function c(){r(`pushStart`)}function l(){r(`clearFields`)}function u(){r(`aiQuickPush`)}async function d(){return i.value?.triggerQuickPush()}t({triggerQuickPush:d});let f={emit:r,quickPushRef:i,handleAfterCommit:a,handleAfterPush:o,handleBeforePush:s,handlePushStart:c,handleClearFields:l,handleAiQuickPush:u,triggerQuickPush:d,StageButton:q,CommitButton:G,PushButton:W,QuickPushButton:K,QuickCommitButton:Ce,AiQuickPushButton:Ae};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}});n();var Me={class:`form-bottom-actions`},Ne={class:`actions-flex-container`},Pe={class:`left-actions`},Fe={class:`button-grid`},Ie={class:`right-actions`};function Le(e,t,n,r,i,o){return b(),O(`div`,Me,[a(`div`,Ne,[a(`div`,Pe,[a(`div`,Fe,[p(r.StageButton,{onClick:()=>{},from:n.from},null,8,[`from`]),p(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`]),p(r.PushButton,{onBeforePush:()=>{},onAfterPush:r.handleAfterPush,onClick:()=>{},from:n.from},null,8,[`from`])])]),a(`div`,Ie,[p(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`]),p(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`]),p(r.AiQuickPushButton,{from:n.from,generating:n.aiGenerating,onTrigger:r.handleAiQuickPush},null,8,[`from`,`generating`])])])])}var Re=z(je,[[`render`,Le],[`__scopeId`,`data-v-12b4dc63`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/GitActionButtons.vue`]]);n(),M();var ze=l({__name:`CommitForm`,setup(e,{expose:n}){n();let r=S(!1),i=S(!1);async function a(){let e=c.isSelectionMode&&c.selectedFiles.size>0?[...c.selectedFiles]:[],t=ne(),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||R(`@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;return D.error(r?R(r):t),!1}let r=[`feat`,`fix`,`docs`,`style`,`refactor`,`test`,`chore`];if(b.value)n.type&&r.includes(n.type)&&(x.value=n.type),n.scope!==void 0&&(C.value=n.scope),n.description&&(w.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&&(u.value=e)}return!0}async function o(){if(!r.value){r.value=!0;try{if(!await a())return;D.success(R(`@76872:AI已生成提交信息`))}catch(e){D.error(`${R(`@76872:AI生成失败`)}: ${e.message}`)}finally{r.value=!1}}}async function s(){if(!i.value){i.value=!0;try{let e=c.isSelectionMode&&c.selectedFiles.size>0,t=c.fileList.some(e=>!U(e.path,l.lockedFiles));if(e||t){f({text:R(`@76872:AI 正在生成提交信息…`),showProgress:!1});let e=!1;try{e=await a()}finally{p()}if(!e)return;if(await v(),!G.value){D.error(R(`@76872:AI生成失败`));return}}await I.value?.triggerQuickPush?.()}catch(e){console.error(`AI 提交并推送失败:`,e),D.error(`${R(`@76872:AI生成失败`)}: ${e.message}`)}finally{i.value=!1}}}let c=H(),l=V(),u=S(``),{loadingState:d,show:f,hide:p,setText:h}=he(),{successState:g}=ge(),_=S(!1),y=S(``),b=m({get:()=>l.isStandardCommit,set:e=>{l.isStandardCommit=e}}),x=S(`feat`),C=S(``),w=S(``),T=S(``),E=S(``),O=S([]),k=S(!1),A=S([]),M=S(!1),N=S(!1),P=m({get:()=>l.skipHooks,set:e=>{l.skipHooks=e}}),F=m({get:()=>l.autoQuickPushOnEnter,set:e=>{l.autoQuickPushOnEnter=e}}),I=S(null),L=S(!1),z=m(()=>[{value:`feat`,label:`feat: ${R(`@76872:新功能`)}`},{value:`fix`,label:`fix: ${R(`@76872:修复bug`)}`},{value:`docs`,label:`docs: ${R(`@76872:文档修改`)}`},{value:`style`,label:`style: ${R(`@76872:样式修改`)}`},{value:`refactor`,label:`refactor: ${R(`@76872:代码重构`)}`},{value:`test`,label:`test: ${R(`@76872:测试代码`)}`},{value:`chore`,label:`chore: ${R(`@76872:构建/工具修改`)}`}]),B=S([]),W=m(()=>{if(!b.value)return u.value||y.value;let e=`${x.value||``}`;return C.value&&(e+=`(${C.value})`),e+=`: ${w.value}`,T.value&&(e+=`\n\n${T.value}`),E.value&&(e+=`\n\n${E.value}`),e}),G=m(()=>b.value?(c.isMergeInProgress||(x.value||``).trim()!==``)&&(w.value||``).trim()!==``:u.value.trim()!==``),K=m(()=>c.hasConflictedFiles?!0:c.isMergeInProgress?!G.value:!c.fileList.some(e=>!U(e.path,l.lockedFiles))||!G.value),q=m(()=>{let e=`${R(`@76872:输入提交信息 (默认: `)}${y.value})`;return F.value?`${e}${R(`@76872:(按回车一键推送)`)}`:e}),oe=m(()=>{let e=R(`@76872:简短描述(必填)`);return F.value?R(`@76872:简短描述(必填,按回车一键推送)`):e}),se=m(()=>{let e=`git commit -m "${W.value}"`;return P.value&&(e+=` --no-verify`),e});function J(){let e=l.config;e&&(y.value=e.defaultCommitMessage||``,e.descriptionTemplates&&Array.isArray(e.descriptionTemplates)&&(O.value=e.descriptionTemplates),e.scopeTemplates&&Array.isArray(e.scopeTemplates)&&(A.value=e.scopeTemplates),e.messageTemplates&&Array.isArray(e.messageTemplates)&&(B.value=e.messageTemplates))}function ce(e){w.value=e,k.value=!1}function le(e){C.value=e,M.value=!1}function Y(){k.value=!0}function X(){M.value=!0}function de(){u.value=``,w.value=``,T.value=``,E.value=``,x.value=`feat`,l.autoSetDefaultMessage&&l.defaultCommitMessage&&(b.value?w.value=l.defaultCommitMessage:u.value=l.defaultCommitMessage)}function fe(){f({text:R(`@76872:正在暂存文件…`),showProgress:!1})}function pe(){p()}function Z(e){if(p(),e){_.value=!0;try{setTimeout(async()=>{try{console.log(R(`@76872:推送成功,状态已更新`))}catch(e){console.error(`一键推送后处理失败:`,e)}finally{_.value=!1}},1e3)}catch(e){console.error(`一键推送后处理失败:`,e),_.value=!1}}}function Q(e){u.value=e,N.value=!1}async function _e(e){if(!F.value||!G.value)return;let t=c.fileList.some(e=>!U(e.path,l.lockedFiles)),n=c.hasConflictedFiles;if(t&&G.value&&c.hasUpstream&&!n&&e.key===`Enter`&&!e.shiftKey){e.preventDefault();try{await I.value?.triggerQuickPush()}catch(e){console.error(`回车自动一键提交失败:`,e)}}}async function ve(e){try{await l.saveDefaultMessage(e)&&D.success(R(`@76872:默认提交信息设置成功`))}catch(e){D.error(`${R(`@76872:设置默认提交信息失败: `)}${e.message}`)}}j(()=>c.pendingMergeMessage,e=>{e&&(b.value?(x.value=``,w.value=e):u.value=e,c.pendingMergeMessage=``,D.info(R(`@76872:已自动填充合并提交信息`)))}),j(()=>c.isAddingFiles,e=>{e&&d.visible&&h(R(`@76872:正在暂存文件…`))}),j(()=>c.isCommiting,e=>{e&&d.visible&&h(R(`@76872:正在提交更改...`))}),j(()=>c.isPushing,e=>{e&&d.visible&&p()}),te(async()=>{j(()=>l.config,J,{immediate:!0}),l.config||await l.loadConfig(),l.autoSetDefaultMessage&&l.defaultCommitMessage&&(b.value?w.value||=l.defaultCommitMessage:u.value||=l.defaultCommitMessage),c.pendingMergeMessage&&(b.value?(x.value=``,w.value=c.pendingMergeMessage):u.value=c.pendingMergeMessage,c.pendingMergeMessage=``,D.info(R(`@76872:已自动填充合并提交信息`)))});function ye(e,t){t([...e?O.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):O.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function be(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 xe(e){e.isSettings?(Y(),w.value=``):w.value=e.value}function Se(e){e.isSettings?(X(),C.value=``):C.value=e.value}function Ce(e,t){t([...e?B.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):B.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function we(e){e.isSettings?(N.value=!0,u.value=``):u.value=e.value}let $={aiGenerating:r,aiQuickPushing:i,requestAiCommitMessage:a,handleAiGenerateCommit:o,handleAiQuickPush:s,gitStore:c,configStore:l,commitMessage:u,loadingState:d,showLoading:f,hideLoading:p,setLoadingText:h,successState:g,isUpdatingStatus:_,defaultCommitMessage:y,isStandardCommit:b,commitType:x,commitScope:C,commitDescription:w,commitBody:T,commitFooter:E,descriptionTemplates:O,descriptionDialogVisible:k,scopeTemplates:A,scopeDialogVisible:M,defaultMessageDialogVisible:N,skipHooks:P,autoQuickPushOnEnter:F,gitActionButtonsRef:I,showAdvancedFields:L,commitTypeOptions:z,messageTemplates:B,finalCommitMessage:W,hasUserCommitMessage:G,isCommitDisabled:K,commitMessagePlaceholder:q,descriptionPlaceholder:oe,gitCommandPreview:se,updateFromConfig:J,useTemplate:ce,useScopeTemplate:le,openDescriptionSettings:Y,openScopeSettings:X,clearCommitFields:de,handleQuickPushBefore:fe,handlePushStart:pe,handleQuickPushAfter:Z,useMessageTemplate:Q,handleEnterKey:_e,setDefaultFromTemplate:ve,queryDescriptionTemplates:ye,queryScopeTemplates:be,handleDescriptionSelect:xe,handleScopeSelect:Se,queryMessageTemplates:Ce,handleMessageSelect:we,get $t(){return R},get Loading(){return t},get ArrowDown(){return ee},GlobalLoading:ue,SuccessModal:me,TemplateManager:ae,GitCommandPreview:re,GitActionButtons:Re,IconButton:ie};return Object.defineProperty($,"__isScriptSetup",{enumerable:!1,value:!0}),$}});n(),s(),w();var Be={class:`card-header app-card-header`},Ve={class:`header-left`},He={class:`card-content app-card-content`},Ue={class:`layout-container`},We={key:0,class:`git-config-warning`},Ge={key:0,class:`merge-in-progress-banner`},Ke={class:`commit-section`},qe={key:0,class:`commit-form`},Je={class:`description-container`},Ye={class:`standard-commit-form`},Xe={class:`standard-commit-header`},Ze={class:`type-scope-container`},Qe={class:`scope-wrapper`},$e={class:`description-container description-inline`},et=[`aria-expanded`],tt={class:`advanced-fields`},nt={key:0,class:`status-updating-indicator`},rt={key:0,class:`status-updating-indicator`};function it(t,n,r,s,l,m){let _=N,v=g,y=u,ee=o,te=c,x=h;return b(),O(I,null,[a(`div`,{class:d([`card app-card`,{"is-pushing":s.gitStore.isPushing}])},[a(`div`,Be,[a(`div`,Ve,[s.gitStore.userName!==``&&s.gitStore.userEmail!==``?(b(),i(s.GitActionButtons,{key:0,ref:`gitActionButtonsRef`,"has-user-commit-message":s.hasUserCommitMessage,"final-commit-message":s.finalCommitMessage,"skip-hooks":s.skipHooks,"ai-generating":s.aiQuickPushing,onAfterCommit:n[0]||=e=>{e&&s.clearCommitFields()},onAfterPush:s.handleQuickPushAfter,onBeforePush:s.handleQuickPushBefore,onPushStart:s.handlePushStart,onClearFields:s.clearCommitFields,onAiQuickPush:s.handleAiQuickPush},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`,`ai-generating`])):f(`v-if`,!0)]),f(` 「命令历史」与「Git 操作」2026-10-06 搬到顶栏(App.vue):这个面板在
2
+ "无事可做"时会整块收起,那两个入口必须常驻 —— 否则工作区干净时
3
+ 连 pull / fetch / merge 都点不到。
4
+ 2026-10-06:✨「AI 生成提交信息」也从这条工具条搬进了输入框那一行
5
+ (见下面 type-scope-container / description-container 末尾)——
6
+ 它生成的就是这个输入框的内容,放在输入框里语义更直接,也省掉一条
7
+ 只放一个图标的空工具条。 `)]),a(`div`,He,[a(`div`,Ue,[f(` 如果没有配置Git用户信息,显示提示 `),s.gitStore.userName===``||s.gitStore.userEmail===``?(b(),O(`div`,We,[p(_,{title:s.$t(`@76872:Git用户信息未配置`),type:`warning`,closable:!1,"show-icon":``},{default:C(()=>[a(`p`,null,T(s.$t(`@76872:您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:`)),1),n[11]||=a(`pre`,{class:`config-command`},`git config --global user.name "Your Name"
8
+ git config --global user.email "your.email@example.com"`,-1)]),_:1},8,[`title`])])):(b(),O(I,{key:1},[f(` 正常的提交区域,仅在Git用户信息已配置时显示 `),f(` MERGING 状态提示 `),s.gitStore.isMergeInProgress?(b(),O(`div`,Ge,[p(_,{title:s.$t(`@76872:合并进行中`),type:`warning`,closable:!1,"show-icon":``},{default:C(()=>[a(`span`,null,T(s.$t(`@76872:分支合并尚未完成,请输入提交信息后点击「提交」按钮完成合并。`)),1)]),_:1},8,[`title`])])):f(`v-if`,!0),f(` 左侧:提交表单 `),a(`div`,Ke,[f(` 普通提交表单 `),s.isStandardCommit?(b(),O(I,{key:1},[f(` 标准化提交表单 `),a(`div`,Ye,[a(`div`,Xe,[a(`div`,Ze,[p(te,{modelValue:s.commitType,"onUpdate:modelValue":n[2]||=e=>s.commitType=e,placeholder:s.$t(`@76872:提交类型`),class:`type-select`,clearable:``},{default:C(()=>[(b(!0),O(I,null,e(s.commitTypeOptions,e=>(b(),i(ee,{key:e.value,label:e.label,value:e.value},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`]),a(`div`,Qe,[p(v,{modelValue:s.commitScope,"onUpdate:modelValue":n[3]||=e=>s.commitScope=e,"fetch-suggestions":s.queryScopeTemplates,placeholder:s.$t(`@76872:作用域(可选)`),class:`scope-input`,clearable:``,onSelect:s.handleScopeSelect},null,8,[`modelValue`,`placeholder`])]),f(` 将简短描述放入同一行 `),a(`div`,$e,[p(v,{modelValue:s.commitDescription,"onUpdate:modelValue":n[4]||=e=>s.commitDescription=e,"fetch-suggestions":s.queryDescriptionTemplates,placeholder:s.descriptionPlaceholder,class:`description-input`,clearable:``,onSelect:s.handleDescriptionSelect,onKeydown:s.handleEnterKey},{suffix:C(()=>[p(s.IconButton,{"custom-class":`ai-suffix-btn`,tooltip:s.$t(`@76872:AI生成提交信息`),"icon-class":s.aiGenerating?``:`ai-commit`,size:`small`,disabled:s.aiGenerating,onClick:s.handleAiGenerateCommit},{default:C(()=>[s.aiGenerating?(b(),i(y,{key:0,class:`is-loading`},{default:C(()=>[p(s.Loading)]),_:1})):f(`v-if`,!0)]),_:1},8,[`tooltip`,`icon-class`,`disabled`])]),_:1},8,[`modelValue`,`placeholder`])])])]),f(` 添加展开/收起高级选项的控制按钮 `),a(`button`,{type:`button`,class:`advanced-options-toggle`,"aria-expanded":s.showAdvancedFields,onClick:n[5]||=e=>s.showAdvancedFields=!s.showAdvancedFields},[a(`span`,null,T(s.showAdvancedFields?s.$t(`@76872:收起`):s.$t(`@76872:正文及页脚`)),1),p(y,{class:d([`toggle-icon`,{"is-active":s.showAdvancedFields}])},{default:C(()=>[p(s.ArrowDown)]),_:1},8,[`class`])],8,et),f(` 使用过渡效果包装高级字段 `),A(a(`div`,tt,[p(x,{modelValue:s.commitBody,"onUpdate:modelValue":n[6]||=e=>s.commitBody=e,type:`textarea`,rows:4,placeholder:s.$t(`@76872:正文(可选):详细描述本次提交的内容和原因`),class:`body-input`,clearable:``},null,8,[`modelValue`,`placeholder`]),p(x,{modelValue:s.commitFooter,"onUpdate:modelValue":n[7]||=e=>s.commitFooter=e,placeholder:s.$t(`@76872:页脚(可选):如 Closes #123`),class:`footer-input`,clearable:``},null,8,[`modelValue`,`placeholder`])],512),[[P,s.showAdvancedFields]])])],2112)):(b(),O(`div`,qe,[a(`div`,Je,[p(v,{modelValue:s.commitMessage,"onUpdate:modelValue":n[1]||=e=>s.commitMessage=e,"fetch-suggestions":s.queryMessageTemplates,placeholder:s.commitMessagePlaceholder,type:`textarea`,rows:3,resize:`none`,class:`commit-message-input`,onSelect:s.handleMessageSelect,onKeydown:s.handleEnterKey},null,8,[`modelValue`,`placeholder`]),f(` 普通模式(3 行 textarea)**不能**像标准模式那样走 suffix 插槽:
9
+ EP 的 el-input 在 type="textarea" 时切到 el-textarea 分支,
10
+ suffix 插槽被 v-if 短路,整个 .el-input__suffix 容器根本不渲染
11
+ (实测 dump 出来只有 textarea 元素 + 两个 v-if 注释)。
12
+ 所以这里回到绝对定位:贴框内右上角,靠 padding-right 让开。
13
+ 类名刻意区分(ai-suffix-btn--ta),别和标准模式共用 ——
14
+ 两者的定位机制完全不同,共用一套样式会在其中一个上失效。 `),p(s.IconButton,{"custom-class":`ai-suffix-btn ai-suffix-btn--ta`,tooltip:s.$t(`@76872:AI生成提交信息`),"icon-class":s.aiGenerating?``:`ai-commit`,size:`small`,disabled:s.aiGenerating,onClick:s.handleAiGenerateCommit},{default:C(()=>[s.aiGenerating?(b(),i(y,{key:0,class:`is-loading`},{default:C(()=>[p(s.Loading)]),_:1})):f(`v-if`,!0)]),_:1},8,[`tooltip`,`icon-class`,`disabled`])])])),s.isCommitDisabled?f(`v-if`,!0):(b(),i(s.GitCommandPreview,{key:2,command:s.gitCommandPreview,title:s.$t(`@76872:提交命令预览:`),placeholder:`git commit -m "<提交信息>"`},null,8,[`command`,`title`]))])],64))])])],2),f(` 简短描述模板设置 `),p(s.TemplateManager,{visible:s.descriptionDialogVisible,"onUpdate:visible":n[8]||=e=>s.descriptionDialogVisible=e,type:`description`,title:s.$t(`@76872:简短描述模板设置`),placeholder:s.$t(`@76872:输入新模板内容`),"edit-placeholder":s.$t(`@76872:编辑模板内容`),"empty-description":s.$t(`@76872:暂无保存的模板`),onUseTemplate:s.useTemplate},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),f(` 作用域设置弹窗 `),p(s.TemplateManager,{visible:s.scopeDialogVisible,"onUpdate:visible":n[9]||=e=>s.scopeDialogVisible=e,type:`scope`,title:s.$t(`@76872:作用域模板设置`),placeholder:s.$t(`@76872:输入新作用域模板`),"edit-placeholder":s.$t(`@76872:编辑作用域模板内容`),"empty-description":s.$t(`@76872:暂无保存的作用域`),onUseTemplate:s.useScopeTemplate},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),f(` 默认提交信息设置弹窗 `),p(s.TemplateManager,{visible:s.defaultMessageDialogVisible,"onUpdate:visible":n[10]||=e=>s.defaultMessageDialogVisible=e,type:`message`,title:s.$t(`@76872:默认提交信息设置`),placeholder:s.$t(`@76872:输入新模板内容`),"edit-placeholder":s.$t(`@76872:编辑模板内容`),"empty-description":s.$t(`@76872:暂无保存的模板`),"show-default-section":!0,"show-help-text":!0,onUseTemplate:s.useMessageTemplate,onSetDefault:s.setDefaultFromTemplate},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),f(` 状态更新指示器 `),p(k,{name:`el-fade-in-linear`},{default:C(()=>[s.isUpdatingStatus?(b(),O(`div`,nt,[p(y,{class:`is-loading`},{default:C(()=>[p(s.Loading)]),_:1}),a(`span`,null,T(s.$t(`@76872:更新状态中...`)),1)])):f(`v-if`,!0)]),_:1}),f(` 全局Loading组件 `),p(s.GlobalLoading,{visible:s.loadingState.visible,text:s.loadingState.text,"show-progress":s.loadingState.showProgress,progress:s.loadingState.progress},null,8,[`visible`,`text`,`show-progress`,`progress`]),f(` 成功提示组件 `),p(s.SuccessModal,{visible:s.successState.visible,text:s.successState.text,description:s.successState.description},null,8,[`visible`,`text`,`description`]),f(` 状态更新指示器 `),p(k,{name:`el-fade-in-linear`},{default:C(()=>[s.isUpdatingStatus?(b(),O(`div`,rt,[p(y,{class:`is-loading`},{default:C(()=>[p(s.Loading)]),_:1}),a(`span`,null,T(s.$t(`@76872:更新状态中...`)),1)])):f(`v-if`,!0)]),_:1})],64)}var at=z(ze,[[`render`,it],[`__scopeId`,`data-v-1ba78eef`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/CommitForm.vue`]]);export{at as default};
@@ -1 +1 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{Bn as e,Dn as t,E as n,En as r,Fr as i,In as a,Jr as o,Nn as s,On as c,Pn as l,Tn as u,Wn as d,Xr as f,Zn as p,cr as m,ei as h,er as g,ir as _,jn as v,z as y}from"./element-plus-C8IhrglD.js";import{n as b,t as x}from"./_plugin-vue_export-helper-DibQ4qNS.js";e();var S=a({__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(e,{expose:t,emit:r}){t();let i=e,a=r,o=u(()=>{if(i.width)return i.width;switch(i.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%`}}),s=_(),c=null;function l(){a(`opened`),d(()=>{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(){a(`closed`),c&&typeof c.focus==`function`&&(d(()=>c?.focus()),c=null)}function p(e){e&&!i.modelValue&&(c=document.activeElement),a(`update:modelValue`,e)}let m=u(()=>i.size===`fullscreen`?`0`:i.top),h=u(()=>{let e=[];return i.customClass&&e.push(i.customClass),i.type===`flex`&&e.push(`common-dialog--flex`),i.type===`full-height`&&e.push(`common-dialog--full-height`),i.size===`fullscreen`&&e.push(`common-dialog--fullscreen`),e.join(` `)}),g=u(()=>{if(i.size===`fullscreen`)return{height:`100vh`,maxHeight:`100vh`};let e=`calc(100% - ${i.heightOffset})`;return i.heightMode===`fixed`?{height:e}:{maxHeight:e}});function v(){a(`update:modelValue`,!1),a(`close`)}function y(){a(`confirm`)}function b(){a(`cancel`),v()}let x={props:i,emit:a,dialogWidth:o,titleId:s,get previouslyFocused(){return c},set previouslyFocused(e){c=e},handleOpened:l,handleClosed:f,handleUpdateModelValue:p,dialogTop:m,dialogClass:h,dialogStyle:g,handleClose:v,handleConfirm:y,handleCancel:b,get ElDialog(){return n}};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}});e(),i();var C=[`id`],w={class:`common-dialog__footer`};function T(e,n,i,a,u,d){let _=y;return p(),t(a.ElDialog,{"model-value":i.modelValue,title:i.title,width:a.dialogWidth,top:a.dialogTop,style:f(a.dialogStyle),"z-index":i.zIndex,fullscreen:i.size===`fullscreen`,"close-on-click-modal":i.closeOnClickModal,"close-on-press-escape":i.closeOnPressEscape,"destroy-on-close":i.destroyOnClose,draggable:i.draggable,class:o(a.dialogClass),"show-close":i.showClose,"modal-class":i.modalClass,"data-dialog-shell":`common`,"append-to-body":i.appendToBody,"lock-scroll":i.lockScroll,"aria-modal":!0,"aria-labelledby":a.titleId,role:`dialog`,onClose:a.handleClose,"onUpdate:modelValue":a.handleUpdateModelValue,onOpened:a.handleOpened,onClosed:a.handleClosed},v({header:m(({titleClass:e})=>[r(`span`,{id:a.titleId,class:o([`el-dialog__title`,e]),role:`heading`,"aria-level":`2`},h(i.title),11,C)]),default:m(()=>[g(e.$slots,`default`,{},void 0,!0)]),_:2},[i.showFooter||e.$slots.footer?{name:`footer`,fn:m(()=>[g(e.$slots,`footer`,{},()=>[r(`div`,w,[i.showCancel?(p(),t(_,{key:0,type:`button`,onClick:a.handleCancel},{default:m(()=>[s(h(i.cancelText),1)]),_:1})):c(`v-if`,!0),l(_,{type:`primary`,loading:i.confirmLoading,onClick:a.handleConfirm},{default:m(()=>[s(h(i.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};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{Bn as e,Dn as t,E as n,En as r,Fr as i,In as a,Jr as o,Nn as s,On as c,Pn as l,Tn as u,Wn as d,Xr as f,Zn as p,cr as m,ei as h,er as g,ir as _,jn as v,z as y}from"./element-plus-BM4vMiQt.js";import{n as b,t as x}from"./_plugin-vue_export-helper-CEyZbjNo.js";e();var S=a({__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(e,{expose:t,emit:r}){t();let i=e,a=r,o=u(()=>{if(i.width)return i.width;switch(i.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%`}}),s=_(),c=null;function l(){a(`opened`),d(()=>{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(){a(`closed`),c&&typeof c.focus==`function`&&(d(()=>c?.focus()),c=null)}function p(e){e&&!i.modelValue&&(c=document.activeElement),a(`update:modelValue`,e)}let m=u(()=>i.size===`fullscreen`?`0`:i.top),h=u(()=>{let e=[];return i.customClass&&e.push(i.customClass),i.type===`flex`&&e.push(`common-dialog--flex`),i.type===`full-height`&&e.push(`common-dialog--full-height`),i.size===`fullscreen`&&e.push(`common-dialog--fullscreen`),e.join(` `)}),g=u(()=>{if(i.size===`fullscreen`)return{height:`100vh`,maxHeight:`100vh`};let e=`calc(100% - ${i.heightOffset})`;return i.heightMode===`fixed`?{height:e}:{maxHeight:e}});function v(){a(`update:modelValue`,!1),a(`close`)}function y(){a(`confirm`)}function b(){a(`cancel`),v()}let x={props:i,emit:a,dialogWidth:o,titleId:s,get previouslyFocused(){return c},set previouslyFocused(e){c=e},handleOpened:l,handleClosed:f,handleUpdateModelValue:p,dialogTop:m,dialogClass:h,dialogStyle:g,handleClose:v,handleConfirm:y,handleCancel:b,get ElDialog(){return n}};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}});e(),i();var C=[`id`],w={class:`common-dialog__footer`};function T(e,n,i,a,u,d){let _=y;return p(),t(a.ElDialog,{"model-value":i.modelValue,title:i.title,width:a.dialogWidth,top:a.dialogTop,style:f(a.dialogStyle),"z-index":i.zIndex,fullscreen:i.size===`fullscreen`,"close-on-click-modal":i.closeOnClickModal,"close-on-press-escape":i.closeOnPressEscape,"destroy-on-close":i.destroyOnClose,draggable:i.draggable,class:o(a.dialogClass),"show-close":i.showClose,"modal-class":i.modalClass,"data-dialog-shell":`common`,"append-to-body":i.appendToBody,"lock-scroll":i.lockScroll,"aria-modal":!0,"aria-labelledby":a.titleId,role:`dialog`,onClose:a.handleClose,"onUpdate:modelValue":a.handleUpdateModelValue,onOpened:a.handleOpened,onClosed:a.handleClosed},v({header:m(({titleClass:e})=>[r(`span`,{id:a.titleId,class:o([`el-dialog__title`,e]),role:`heading`,"aria-level":`2`},h(i.title),11,C)]),default:m(()=>[g(e.$slots,`default`,{},void 0,!0)]),_:2},[i.showFooter||e.$slots.footer?{name:`footer`,fn:m(()=>[g(e.$slots,`footer`,{},()=>[r(`div`,w,[i.showCancel?(p(),t(_,{key:0,type:`button`,onClick:a.handleCancel},{default:m(()=>[s(h(i.cancelText),1)]),_:1})):c(`v-if`,!0),l(_,{type:`primary`,loading:i.confirmLoading,onClick:a.handleConfirm},{default:m(()=>[s(h(i.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};