zen-gitsync 2.17.15 → 2.17.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/package.json +1 -1
- package/src/cli/ai/agent.js +24 -2
- package/src/cli/ai/runtime.test.js +1 -1
- package/src/cli/ai/tools.js +7 -1
- package/src/cli/ai/tools.test.js +11 -0
- package/src/config.js +4 -4
- package/src/paths.js +3 -0
- package/src/ui/public/assets/AgentView-CXZUWLPL.css +1 -0
- package/src/ui/public/assets/AgentView-Dhs3eKFY.js +7 -0
- package/src/ui/public/assets/AppVersionBadge-D70AjIBo.js +2 -0
- package/src/ui/public/assets/AppVersionBadge-DDYQqoy7.css +1 -0
- package/src/ui/public/assets/BranchSelector-F4ibldMN.css +1 -0
- package/src/ui/public/assets/BranchSelector-t3fnGS_5.js +1 -0
- package/src/ui/public/assets/CommitForm-4kI2csgs.css +1 -0
- package/src/ui/public/assets/CommitForm-DmlTnTwc.js +6 -0
- package/src/ui/public/assets/CommonDialog-CecgvEzd.js +1 -0
- package/src/ui/public/assets/CommonDialog-w6EmBEXv.css +1 -0
- package/src/ui/public/assets/EditorView-DBqhjm84.css +1 -0
- package/src/ui/public/assets/EditorView-DVRemzZU.js +16 -0
- package/src/ui/public/assets/FileDiffViewer-DH8Y2lUO.js +15 -0
- package/src/ui/public/assets/FileDiffViewer-n5ea9qMe.css +1 -0
- package/src/ui/public/assets/{FlowExecutionViewer-BmfstdaT.js → FlowExecutionViewer-Cie2_TG4.js} +1 -1
- package/src/ui/public/assets/FlowOrchestrationWorkspace-Bbf8X1KP.js +21 -0
- package/src/ui/public/assets/FlowOrchestrationWorkspace-DwuSSxJ1.css +1 -0
- package/src/ui/public/assets/IconButton-BEiZI4F6.js +1 -0
- package/src/ui/public/assets/IconButton-RlXqKOeu.css +1 -0
- package/src/ui/public/assets/LogList-DvuC03Tx.js +7 -0
- package/src/ui/public/assets/LogList-XspUhx-C.css +1 -0
- package/src/ui/public/assets/MindmapView-B6rITyNs.js +2 -0
- package/src/ui/public/assets/MindmapView-Diq2Cu4O.css +1 -0
- package/src/ui/public/assets/MonitorView-DwUwJXnY.css +1 -0
- package/src/ui/public/assets/MonitorView-q92EZvay.js +1 -0
- package/src/ui/public/assets/ProjectStartupButton-CB8IOg1E.css +1 -0
- package/src/ui/public/assets/ProjectStartupButton-RiIi8TwW.js +1 -0
- package/src/ui/public/assets/RemoteManagerDialog-D4WphMtO.css +1 -0
- package/src/ui/public/assets/RemoteManagerDialog-qtBotYAQ.js +4 -0
- package/src/ui/public/assets/RemoteRepoCard-DvtzfwHV.js +7 -0
- package/src/ui/public/assets/RemoteRepoCard-o01IrbVz.css +1 -0
- package/src/ui/public/assets/SourceMapView-CfDydtsu.css +1 -0
- package/src/ui/public/assets/SourceMapView-EEWAmy4U.js +3 -0
- package/src/ui/public/assets/SvgIcon-Bkc_oGUI.js +1 -0
- package/src/ui/public/assets/TemplateManager-9e4amMlI.js +1 -0
- package/src/ui/public/assets/TemplateManager-DO7EPfj8.css +1 -0
- package/src/ui/public/assets/UserInputNode-4FoJblJi.js +1 -0
- package/src/ui/public/assets/UserInputNode-DDNSarag.css +1 -0
- package/src/ui/public/assets/WorkbenchView-BFaTinH8.js +56 -0
- package/src/ui/public/assets/WorkbenchView-BU2kJCAA.css +1 -0
- package/src/ui/public/assets/{_plugin-vue_export-helper-B1mHBne9.js → _plugin-vue_export-helper-BLGowG5t.js} +7 -7
- package/src/ui/public/assets/agentConversations-BQCIv4u1.js +5 -0
- package/src/ui/public/assets/configStore-BUXv5i5j.js +1 -0
- package/src/ui/public/assets/element-plus-C1xzgNSR.css +1 -0
- package/src/ui/public/assets/{element-plus-DxBPQwL7.js → element-plus-D7LDHcAn.js} +3 -3
- package/src/ui/public/assets/flow-mindmap-zXXF3qDh.js +139 -0
- package/src/ui/public/assets/gitStore-BGbEYd0U.js +6 -0
- package/src/ui/public/assets/index-DIU5200G.css +1 -0
- package/src/ui/public/assets/index-Di5cimoI.js +115 -0
- package/src/ui/public/assets/{office-docx-CZXLkCf5.js → office-docx-C8sYW8O1.js} +5 -5
- package/src/ui/public/assets/{office-excel-CBKszjVA.js → office-excel-DpZn5My2.js} +1 -1
- package/src/ui/public/assets/{office-pptx-NeUSnN3k.js → office-pptx-BnYBTwT7.js} +1 -1
- package/src/ui/public/assets/previewSandbox-CxLaNg4X.css +1 -0
- package/src/ui/public/assets/previewSandbox-DEQpyVNu.js +0 -0
- package/src/ui/public/assets/toolsStore-DMCSd287.js +1 -0
- package/src/ui/public/assets/{useThemeObserver-E7Hk50l3.js → useThemeObserver-QpveGpnn.js} +1 -1
- package/src/ui/public/assets/{vendor-C5qX_I8r.css → vendor-C-GCxMMu.css} +1 -1
- package/src/ui/public/assets/{vendor-IQQMq-1c.js → vendor-CLmPUj3K.js} +43 -43
- package/src/ui/public/assets/vue-flow-CxnoC7Uq.js +39 -0
- package/src/ui/public/fonts/jetbrains-mono-latin.woff2 +0 -0
- package/src/ui/public/fonts/plus-jakarta-sans-latin-ext.woff2 +0 -0
- package/src/ui/public/fonts/plus-jakarta-sans-latin-italic.woff2 +0 -0
- package/src/ui/public/fonts/plus-jakarta-sans-latin.woff2 +0 -0
- package/src/ui/public/index.html +28 -27
- package/src/ui/server/routes/workbench/agentChat.js +69 -12
- package/src/ui/server/routes/workbench/agentChatContext.test.js +106 -0
- package/src/ui/server/routes/workbench/agentChatShared.test.js +33 -3
- package/src/ui/server/routes/workbench/agentMarketplace.js +23 -9
- package/src/ui/server/routes/workbench/agentMarketplace.test.js +32 -0
- package/src/ui/server/routes/workbench/agentRoutes.js +57 -15
- package/src/ui/server/routes/workbench/agentRoutes.test.js +142 -2
- package/src/ui/server/routes/workbench/taskRunner.codex.test.js +173 -0
- package/src/ui/server/routes/workbench/taskRunner.js +259 -10
- package/src/ui/server/routes/workbench/taskRunner.opencode.test.js +4 -2
- package/src/ui/server/utils/agentAttachments.js +169 -0
- package/src/ui/server/utils/agentAttachments.test.js +140 -0
- package/src/ui/public/assets/AgentView-Bz9LFamz.js +0 -5
- package/src/ui/public/assets/AgentView-vvVhbIQ5.css +0 -1
- package/src/ui/public/assets/AppVersionBadge-CJrDr7GV.css +0 -1
- package/src/ui/public/assets/AppVersionBadge-D5iXcAEV.js +0 -2
- package/src/ui/public/assets/BranchSelector-B0eLkAdv.css +0 -1
- package/src/ui/public/assets/BranchSelector-DP4u1f_B.js +0 -1
- package/src/ui/public/assets/CommitForm-CQ0K8Yy2.css +0 -1
- package/src/ui/public/assets/CommitForm-boOw8uGS.js +0 -6
- package/src/ui/public/assets/CommonDialog-B_qUsIGr.js +0 -1
- package/src/ui/public/assets/CommonDialog-jP0E9mco.css +0 -1
- package/src/ui/public/assets/EditorView-DZMLvQds.css +0 -1
- package/src/ui/public/assets/EditorView-ZULtfIzl.js +0 -1
- package/src/ui/public/assets/FileDiffViewer-B9EkuKdF.css +0 -1
- package/src/ui/public/assets/FileDiffViewer-C4xxq5S0.js +0 -15
- package/src/ui/public/assets/FlowOrchestrationWorkspace-28kErqrn.js +0 -21
- package/src/ui/public/assets/FlowOrchestrationWorkspace-CYGp-PqS.css +0 -1
- package/src/ui/public/assets/IconButton-DcOAqpq0.js +0 -1
- package/src/ui/public/assets/IconButton-tjkOjzkC.css +0 -1
- package/src/ui/public/assets/LogList-BlJplIi1.css +0 -1
- package/src/ui/public/assets/LogList-FEP7EeJt.js +0 -7
- package/src/ui/public/assets/MindmapView-8X6z245q.css +0 -1
- package/src/ui/public/assets/MindmapView-NDJvfSCn.js +0 -2
- package/src/ui/public/assets/MonitorView-DU4aBCK0.js +0 -1
- package/src/ui/public/assets/MonitorView-DetlFFXq.css +0 -1
- package/src/ui/public/assets/ProjectStartupButton-JQk4Etsu.js +0 -1
- package/src/ui/public/assets/ProjectStartupButton-QLPltCK5.css +0 -1
- package/src/ui/public/assets/RemoteManagerDialog-BauAeH2w.css +0 -1
- package/src/ui/public/assets/RemoteManagerDialog-Di2WizMS.js +0 -4
- package/src/ui/public/assets/RemoteRepoCard-CG-jARTe.css +0 -1
- package/src/ui/public/assets/RemoteRepoCard-DxB8Q8yE.js +0 -7
- package/src/ui/public/assets/SourceMapView-CN4Hkyp4.css +0 -1
- package/src/ui/public/assets/SourceMapView-CfmrPMBm.js +0 -3
- package/src/ui/public/assets/SvgIcon-yefEMV0-.js +0 -1
- package/src/ui/public/assets/TemplateManager-CCy_WcSK.js +0 -1
- package/src/ui/public/assets/TemplateManager-DMuG4i3G.css +0 -1
- package/src/ui/public/assets/UserInputNode-3Gv_9YZx.js +0 -1
- package/src/ui/public/assets/UserInputNode-BVgQkB2l.css +0 -1
- package/src/ui/public/assets/WorkbenchView-B1BJhWHi.css +0 -1
- package/src/ui/public/assets/WorkbenchView-Dgp6A83v.js +0 -56
- package/src/ui/public/assets/configStore-BDxel6Co.js +0 -1
- package/src/ui/public/assets/element-plus-Cwwq-Gje.css +0 -1
- package/src/ui/public/assets/flow-mindmap-BqFb1WO5.js +0 -139
- package/src/ui/public/assets/gitStore-D5CWxPLv.js +0 -6
- package/src/ui/public/assets/index-CmbatbSR.css +0 -1
- package/src/ui/public/assets/index-gpuX9fhG.js +0 -111
- package/src/ui/public/assets/previewSandbox-CgdwPcuW.css +0 -1
- package/src/ui/public/assets/previewSandbox-qLKxghfr.js +0 -0
- package/src/ui/public/assets/vue-flow-fLUQ0_kE.js +0 -39
package/README.md
CHANGED
|
@@ -374,11 +374,11 @@ A dedicated view for running coding agents across one or many projects. Every ta
|
|
|
374
374
|
| 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 activity feed 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 |
|
|
375
375
|
| 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 |
|
|
376
376
|
| 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 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 |
|
|
377
|
-
| Executor choice | Run each task with **Claude Code** or **
|
|
377
|
+
| 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 |
|
|
378
378
|
| 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`) |
|
|
379
379
|
| Prompt presets | Reusable prompt templates with `{{task.title}}` / `{{task.desc}}` / `{{repo.path}}` / `{{branch}}` variable interpolation |
|
|
380
380
|
| AI prompt generation | The "New / Edit preset" dialog carries an **AI Generate project architecture** button plus an **Edit instruction** button: the server recursively finds every sub-project (a directory holding `.git` or one of 9 manifests), reads each one's key files on its own (manifest 20 KB / README 8 KB / a 2-level tree), calls the LLM concurrently to produce a per-sub-project architecture description, and merges them into one when there are several. **Edit instruction** customises the prompt used for generation (persisted to `~/.zen-gitsync/ai-instruction.json`) |
|
|
381
|
-
| Pipe-mode launcher | Spawns the selected executor as a detached process with stdout/stderr piped to the server — no external terminal window is opened, so output streams directly into the UI. Claude Code runs as `claude -p - --output-format stream-json --verbose --permission-mode bypassPermissions --dangerously-skip-permissions` (the prompt goes in over stdin to dodge Windows' 32 K command-line limit); OpenCode runs as `opencode run --format json --auto --thinking
|
|
381
|
+
| Pipe-mode launcher | Spawns the selected executor as a detached process with stdout/stderr piped to the server — no external terminal window is opened, so output streams directly into the UI. Claude Code runs as `claude -p - --output-format stream-json --verbose --permission-mode bypassPermissions --dangerously-skip-permissions` (the prompt goes in over stdin to dodge Windows' 32 K command-line limit); OpenCode runs as `opencode run --format json --auto --thinking`; Codex runs as `codex exec --json --skip-git-repo-check --dangerously-bypass-approvals-and-sandbox -`, both following whatever default model their own CLI is configured with |
|
|
382
382
|
| Isolated processes | Every run is its own detached process with fresh context, so memory and conversation state never accumulate across tasks |
|
|
383
383
|
| Live log | The "执行日志 / Execution log" panel **opens by default** and auto-scrolls, showing accumulated `stdout` + `stderr` (last 64 KB rendered client-side; the server keeps up to 100 MB per job) |
|
|
384
384
|
| Live status | Task status (pending / running / done / error / cancelled) and PID stream in real time over SSE |
|
|
@@ -386,7 +386,7 @@ A dedicated view for running coding agents across one or many projects. Every ta
|
|
|
386
386
|
| Finish notice | When a run finishes or fails you get an in-app toast while the page is in the foreground, and a system notification when it is not — so you can be looking at another view or window and still be told |
|
|
387
387
|
| Cross-view indicator | While any Workbench task is running, a pulsing dot appears on the Workbench icon in the Activity Bar so you can see job state from the Git or Editor view |
|
|
388
388
|
| Execution log manager (dialog) | The "Execution logs" button in the workbench top bar opens a dialog with the list / filter / batch delete / clear / retention-policy UI (defaults: 500 records, 256 MB); the task execution view stays mounted so no work-in-progress state is dropped |
|
|
389
|
-
| Continue chat | After a task reaches a done / error / cancelled state, a follow-up composer appears; sending a message resumes the previous session (`claude --resume <session_id>` for Claude Code, `--session` for OpenCode), and each new turn stacks into the same chat-style flow |
|
|
389
|
+
| Continue chat | After a task reaches a done / error / cancelled state, a follow-up composer appears; sending a message resumes the previous session (`claude --resume <session_id>` for Claude Code, `--session` for OpenCode, `codex exec resume <thread_id>` for Codex), and each new turn stacks into the same chat-style flow |
|
|
390
390
|
| Local tool detection | On startup + every 10 min the server probes 7 CLIs (`code`, `claude`, `codex`, `opencode`, `kimi`, `zcode`, `dsh`). Tools that are missing are dimmed and labelled "Not installed" — clicking one opens the install guide, and right-clicking a tool button offers an update to the latest published version |
|
|
391
391
|
|
|
392
392
|
Prompt presets and tasks are persisted to `~/.zen-gitsync/prompts.json` and `~/.zen-gitsync/tasks.json` (cross-project, shared across repos); run history and the retention policy live in `jobs.json` / `jobs-config.json`, the master-agent console state in `orchestrator.json`, and task attachments under `~/.zen-gitsync/workbench-images/_task-<taskId>/`.
|
|
@@ -1025,11 +1025,11 @@ Activity Bar 第四个视图,在 GUI 内直接浏览并编辑项目文件:
|
|
|
1025
1025
|
| 派发默认提示词 | 给每次派发配一段常驻提示词:一条**全局**的(所有项目都附加)+ 每个项目一条(派发到该项目时追加在全局之后,是补充而不是覆盖)。两者都在控制台输入区的齿轮按钮里设置;拼好的正文放在指令**之前**,「立即执行」旁边会多出一个「默认提示词(全局 + 本项目)」勾选,单次派发可以取消勾选,活动流里也记下这条指令附带的是哪一级。提示词在派发那一刻就抄进任务自己的提示词字段,之后改设置不会回头改写已建任务,单条任务仍可再改 |
|
|
1026
1026
|
| 项目行打开方式 | 编排台项目列表里 hover 任意一行会出现两个按钮:「打开文件夹」一键进资源管理器,以及「打开方式」菜单 —— 文件管理器 / 终端 / 新标签页跑 `g ui`,以及各编辑器与 AI 工具(VS Code、Codex、OpenCode、Kimi Code、ZCode、DeepSeek Harness,加上默认权限或完全批准的 Claude Code)。没安装的工具会置灰并标「未安装」,点它弹的是顶栏那套安装引导;菜单里的动作只作用于该行项目,不会改变看板选中态 |
|
|
1027
1027
|
| 任务编辑器浮层 | 点击看板卡片时以浮层打开:左侧是扁平化的任务列表与提示词预置,右侧依次是任务头部、预置下拉、执行器 split 按钮、「执行日志 / 清空执行」动作,以及对话式执行主体。描述默认折叠成一行「任务描述(可选)」摘要,点击展开;已填写描述或挂有附件时摘要右侧显示「已填写」徽标与附件数量 |
|
|
1028
|
-
| 执行器选择 | 每个任务可用 **Claude Code**
|
|
1028
|
+
| 执行器选择 | 每个任务可用 **Claude Code** / **OpenCode** / **Codex** 执行。全局默认在 **设置 → 通用设置 → 任务执行器**(`config.taskExecutor`);执行按钮旁的 split 按钮可临时切换下一次执行用的执行器,选择记在浏览器里。续聊固定沿用最初那个执行器 —— Claude 的 `--resume`、OpenCode 的 `--session`、Codex 的 thread id 互不通用 |
|
|
1029
1029
|
| 附件 | 每个任务最多挂 9 个附件(图片 / PDF / 文本 / Markdown / CSV / JSON / log,单个 ≤ 20 MB);超过 3.5 MB 的图片会先在浏览器里压缩(先按原分辨率转 WebP,压不下去再逐级降采样),4K 屏截图不用再手动裁剪;执行时绝对路径会自动追加到 prompt 末尾,智能体直接按路径读取。**右键图片附件可一键复制到系统剪贴板**(支持 png / jpeg / webp / gif) |
|
|
1030
1030
|
| 提示词预置 | 可复用提示词模板,支持 `{{task.title}}` / `{{task.desc}}` / `{{repo.path}}` / `{{branch}}` 变量插值 |
|
|
1031
1031
|
| AI 生成预置 | 「新建 / 编辑预置」对话框内置 **AI 生成项目架构说明** 按钮 + **编辑指令** 按钮:服务端递归识别当前项目里的所有子项目(含 `.git` 或 9 种 manifest 之一的目录),为每个子项目独立读取关键文件(manifest 20 KB / README 8 KB / 2 层目录树),并发调 LLM 产出各子项目架构说明,多子项目场景再合并成一份整体说明;用户可点「编辑指令」自定义生成策略(持久化到 `~/.zen-gitsync/ai-instruction.json`);`max_tokens=4000`,单次请求最多 20 分钟 |
|
|
1032
|
-
| 管道模式启动 | 选定执行器以 detached 进程拉起,stdout / stderr 通过管道回传服务端,不再弹外部终端窗口。Claude Code 走 `claude -p - --output-format stream-json --verbose --permission-mode bypassPermissions --dangerously-skip-permissions`(prompt 从 stdin 喂入,避开 Windows 32K 命令行上限);OpenCode 走 `opencode run --format json --auto --thinking
|
|
1032
|
+
| 管道模式启动 | 选定执行器以 detached 进程拉起,stdout / stderr 通过管道回传服务端,不再弹外部终端窗口。Claude Code 走 `claude -p - --output-format stream-json --verbose --permission-mode bypassPermissions --dangerously-skip-permissions`(prompt 从 stdin 喂入,避开 Windows 32K 命令行上限);OpenCode 走 `opencode run --format json --auto --thinking`;Codex 走 `codex exec --json --skip-git-repo-check --dangerously-bypass-approvals-and-sandbox -`,后两者的模型都跟随各自 CLI 配置的默认值 |
|
|
1033
1033
|
| 独立进程 | 每次执行都是独立的 detached 进程,上下文与状态不会跨任务累积 |
|
|
1034
1034
|
| 实时日志 | 「执行日志」面板**默认展开**,方便随时回看上次执行结果;面板内自动滚到底,展示累积的 stdout / stderr(客户端渲染最近 64 KB,服务端单个 job 最多保留 100 MB 输出) |
|
|
1035
1035
|
| 实时状态 | 任务状态(pending / running / done / error / cancelled)和 PID 通过 SSE 实时推送 |
|
|
@@ -1037,7 +1037,7 @@ Activity Bar 第四个视图,在 GUI 内直接浏览并编辑项目文件:
|
|
|
1037
1037
|
| 结束提示 | 任务结束或报错时:页面在前台弹应用内提示,页面在后台/别的窗口发系统通知,切到别的视图也不会漏掉结果 |
|
|
1038
1038
|
| 跨视图指示 | 任意任务运行中时,Activity Bar 上的工作台图标会显示脉动小圆点;切换到 Git 或编辑器视图也能看到运行状态 |
|
|
1039
1039
|
| 执行日志管理(弹窗) | 顶部「执行日志」按钮唤起弹窗:列表 / 过滤 / 批量删除 / 清空 / 保留策略全部可在此一次性管理(默认保留 500 条、256 MB);弹窗关闭后任务执行视图常驻,避免切换时不必要的卸载 |
|
|
1040
|
-
| 继续对话 | 任务进入终态(done / error / cancelled)后出现续聊输入框;发送续聊消息会用 `claude --resume <session_id>`(Claude Code
|
|
1040
|
+
| 继续对话 | 任务进入终态(done / error / cancelled)后出现续聊输入框;发送续聊消息会用 `claude --resume <session_id>`(Claude Code)、`--session`(OpenCode)或 `codex exec resume <thread_id>`(Codex)续接上一轮会话,**新一轮 = 新 job**,多轮纵向堆叠成对话流 |
|
|
1041
1041
|
| 本地工具检测 | 启动时 + 每 10 分钟探测 7 个 CLI(`code` / `claude` / `codex` / `opencode` / `kimi` / `zcode` / `dsh`)。未安装的工具置灰并标「未安装」,点击弹出安装引导;右键工具按钮可升级到最新已发布版本 |
|
|
1042
1042
|
|
|
1043
1043
|
提示词预置与任务数据持久化到 `~/.zen-gitsync/prompts.json` 和 `~/.zen-gitsync/tasks.json`(跨项目共享);执行历史与保留策略在 `jobs.json` / `jobs-config.json`,主 Agent 控制台状态在 `orchestrator.json`,任务附件落盘在 `~/.zen-gitsync/workbench-images/_task-<taskId>/`。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zen-gitsync",
|
|
3
|
-
"version": "2.17.
|
|
3
|
+
"version": "2.17.17",
|
|
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",
|
package/src/cli/ai/agent.js
CHANGED
|
@@ -849,9 +849,11 @@ export async function runAiAgent(argv = []) {
|
|
|
849
849
|
|
|
850
850
|
// ask_user pauses the tool loop inside the same readline session. The REPL
|
|
851
851
|
// line handler is bypassed while this small wizard owns the input line.
|
|
852
|
-
state.ctx.askUser = ({ question, options = [], allowFreeText = true }) => {
|
|
852
|
+
state.ctx.askUser = ({ question, options = [], allowFreeText = true, multiple = false }) => {
|
|
853
853
|
const zh = !String(state.locale || '').startsWith('en')
|
|
854
854
|
const safeOptions = Array.isArray(options) ? options.filter(Boolean).slice(0, 20) : []
|
|
855
|
+
// 多选只在真的给了选项时才有意义(与 tools.js 的归一化口径一致)
|
|
856
|
+
const multi = multiple === true && safeOptions.length > 0
|
|
855
857
|
state.inWizard = true
|
|
856
858
|
if (safeOptions.length > 0) {
|
|
857
859
|
console.log(chalk.cyan(`\n${question}`))
|
|
@@ -906,11 +908,31 @@ export async function runAiAgent(argv = []) {
|
|
|
906
908
|
|
|
907
909
|
const promptAnswer = () => {
|
|
908
910
|
const hint = safeOptions.length > 0
|
|
909
|
-
? (
|
|
911
|
+
? (multi
|
|
912
|
+
? (zh ? '请输入序号(逗号分隔可多选)' : 'Choose numbers, comma-separated for multiple')
|
|
913
|
+
: allowFreeText ? (zh ? '请输入序号或直接输入回答' : 'Choose a number or type an answer') : (zh ? '请输入序号' : 'Choose a number'))
|
|
910
914
|
: (zh ? '请输入回答' : 'Type your answer')
|
|
911
915
|
rl.question(`${hint}: `, { signal: questionController.signal }, answer => {
|
|
912
916
|
if (settled) return
|
|
913
917
|
const trimmed = String(answer || '').trim()
|
|
918
|
+
if (multi) {
|
|
919
|
+
// 逗号分隔的序号 → 选项列表(JSON 数组字符串回给模型,与 Web 端口径一致);
|
|
920
|
+
// 整行不是合法序号串时,允许自由输入的话就把它当作唯一一项
|
|
921
|
+
const parts = trimmed.split(/[,,]/).map(part => part.trim()).filter(Boolean)
|
|
922
|
+
const indexes = parts.map(part => Number.parseInt(part, 10))
|
|
923
|
+
const allIndexes = parts.length > 0 && indexes.every((n, i) => Number.isInteger(n) && String(n) === parts[i] && n >= 1 && n <= safeOptions.length)
|
|
924
|
+
if (allIndexes) {
|
|
925
|
+
finish(JSON.stringify(indexes.map(n => safeOptions[n - 1])))
|
|
926
|
+
return
|
|
927
|
+
}
|
|
928
|
+
if (allowFreeText && trimmed) {
|
|
929
|
+
finish(JSON.stringify([trimmed]))
|
|
930
|
+
return
|
|
931
|
+
}
|
|
932
|
+
console.log(chalk.yellow(zh ? `请输入 1-${safeOptions.length} 之间的序号,多个用逗号分隔` : `Enter numbers from 1 to ${safeOptions.length}, comma-separated`))
|
|
933
|
+
promptAnswer()
|
|
934
|
+
return
|
|
935
|
+
}
|
|
914
936
|
if (safeOptions.length > 0) {
|
|
915
937
|
const index = Number.parseInt(trimmed, 10)
|
|
916
938
|
if (Number.isInteger(index) && index >= 1 && index <= safeOptions.length) {
|
|
@@ -154,7 +154,7 @@ test('ask_user pauses a turn until the answer arrives, then continues the model
|
|
|
154
154
|
})
|
|
155
155
|
|
|
156
156
|
await new Promise(resolve => setImmediate(resolve))
|
|
157
|
-
assert.deepEqual(asked, { question: 'Which option?', options: ['A', 'B'], allowFreeText: false })
|
|
157
|
+
assert.deepEqual(asked, { question: 'Which option?', options: ['A', 'B'], allowFreeText: false, multiple: false })
|
|
158
158
|
assert.equal(round, 1)
|
|
159
159
|
resolveAnswer('B')
|
|
160
160
|
|
package/src/cli/ai/tools.js
CHANGED
|
@@ -211,6 +211,10 @@ export const TOOL_DEFINITIONS = [
|
|
|
211
211
|
type: 'boolean',
|
|
212
212
|
description: 'Whether the user may type an answer that is not one of the listed options. Defaults to true.',
|
|
213
213
|
},
|
|
214
|
+
multiple: {
|
|
215
|
+
type: 'boolean',
|
|
216
|
+
description: 'Allow selecting several options at once. Only meaningful when options are provided. Defaults to false.',
|
|
217
|
+
},
|
|
214
218
|
},
|
|
215
219
|
required: ['question'],
|
|
216
220
|
},
|
|
@@ -613,7 +617,9 @@ async function toolAskUser(args, ctx) {
|
|
|
613
617
|
? args.options.map(option => String(option || '').trim()).filter(Boolean).slice(0, 20)
|
|
614
618
|
: []
|
|
615
619
|
const allowFreeText = options.length === 0 || args.allow_free_text !== false
|
|
616
|
-
|
|
620
|
+
// 多选只在真的给了选项时才有意义
|
|
621
|
+
const multiple = args.multiple === true && options.length > 0
|
|
622
|
+
return ctx.askUser({ question, options, allowFreeText, multiple })
|
|
617
623
|
}
|
|
618
624
|
|
|
619
625
|
// ──────────────────────────────────────────────
|
package/src/cli/ai/tools.test.js
CHANGED
|
@@ -30,6 +30,7 @@ test('ask_user schema and arguments support options plus free text', async () =>
|
|
|
30
30
|
assert.deepEqual(definition.function.parameters.required, ['question'])
|
|
31
31
|
assert.ok(definition.function.parameters.properties.options)
|
|
32
32
|
assert.ok(definition.function.parameters.properties.allow_free_text)
|
|
33
|
+
assert.ok(definition.function.parameters.properties.multiple)
|
|
33
34
|
|
|
34
35
|
let received
|
|
35
36
|
const result = await executeTool('ask_user', {
|
|
@@ -48,9 +49,19 @@ test('ask_user schema and arguments support options plus free text', async () =>
|
|
|
48
49
|
question: 'Which path should I take?',
|
|
49
50
|
options: ['Fast', '42'],
|
|
50
51
|
allowFreeText: false,
|
|
52
|
+
multiple: false,
|
|
51
53
|
})
|
|
52
54
|
})
|
|
53
55
|
|
|
56
|
+
test('ask_user 把 multiple 透传给交互回调,没有选项时强制单选', async () => {
|
|
57
|
+
const seen = []
|
|
58
|
+
const askUser = async value => { seen.push(value); return 'x' }
|
|
59
|
+
await executeTool('ask_user', { question: '选几个?', options: ['A', 'B'], multiple: true }, { ...ctx, askUser })
|
|
60
|
+
await executeTool('ask_user', { question: '随便说', multiple: true }, { ...ctx, askUser })
|
|
61
|
+
assert.equal(seen[0].multiple, true)
|
|
62
|
+
assert.equal(seen[1].multiple, false, '没有选项时多选无意义')
|
|
63
|
+
})
|
|
64
|
+
|
|
54
65
|
test('ask_user returns a useful error when no interactive callback exists', async () => {
|
|
55
66
|
const result = await executeTool('ask_user', { question: 'Continue?' }, ctx)
|
|
56
67
|
assert.match(result, /ask_user is unavailable/)
|
package/src/config.js
CHANGED
|
@@ -73,9 +73,9 @@ function normalizeAiMaxToolIterations(value) {
|
|
|
73
73
|
return int;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
// 工作台任务执行器白名单。'claude' 是历史默认;'opencode' 为可选执行器
|
|
77
|
-
// (opencode run --format json
|
|
78
|
-
export const TASK_EXECUTORS = ['claude', 'opencode'];
|
|
76
|
+
// 工作台任务执行器白名单。'claude' 是历史默认;'opencode' / 'codex' 为可选执行器
|
|
77
|
+
// (opencode run --format json / codex exec --json,模型都跟随各自 CLI 的配置)。
|
|
78
|
+
export const TASK_EXECUTORS = ['claude', 'opencode', 'codex'];
|
|
79
79
|
|
|
80
80
|
/**
|
|
81
81
|
* 规范化任务执行器。非法值返回 null(交给调用方取默认),不抛错 ——
|
|
@@ -143,7 +143,7 @@ const defaultConfig = {
|
|
|
143
143
|
// 触顶后本轮被强制结束,用户必须再发一条消息才能接着跑,体感像被截断。
|
|
144
144
|
// 想调小/调大改这个值即可(GUI: 设置 → AI 模型配置)。
|
|
145
145
|
aiMaxToolIterations: 200,
|
|
146
|
-
// 工作台任务执行器(claude | opencode)。全局配置,跨项目共享。
|
|
146
|
+
// 工作台任务执行器(claude | opencode | codex)。全局配置,跨项目共享。
|
|
147
147
|
// 决定「执行任务 / 执行子任务 / 从此处开始 / 简单任务续聊」这条链路
|
|
148
148
|
// 默认 spawn 哪个本地 CLI;执行入口可以按次覆盖(见 workbench 执行路由)。
|
|
149
149
|
taskExecutor: 'claude',
|
package/src/paths.js
CHANGED
|
@@ -80,6 +80,9 @@ export const AI_MCP_FILE = path.join(DATA_DIR, 'ai', 'mcp.json');
|
|
|
80
80
|
|
|
81
81
|
// ── 工作台 / 会话 / 缓存 ──────────────────────────────────────
|
|
82
82
|
export const WORKBENCH_IMAGES_DIR = path.join(DATA_DIR, 'workbench-images');
|
|
83
|
+
// 智能体对话的非图片附件:前端把字节传上来后落在这里,只把绝对路径给模型(见
|
|
84
|
+
// src/ui/server/utils/agentAttachments.js)。按"一轮一个子目录"存放,避免同名覆盖。
|
|
85
|
+
export const AGENT_ATTACHMENTS_DIR = path.join(DATA_DIR, 'agent-attachments');
|
|
83
86
|
export const AGENT_SESSIONS_DIR = path.join(DATA_DIR, 'agent-sessions');
|
|
84
87
|
export const SPLIT_SESSIONS_DIR = path.join(DATA_DIR, 'ai-split-sessions');
|
|
85
88
|
export const AI_DIFF_SUMMARIES_DIR = path.join(DATA_DIR, 'ai-diff-summaries');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.marketplace-panel[data-v-e9f9e851]{background:var(--bg-container);flex-direction:column;height:100%;min-height:0;display:flex}.mp-toolbar[data-v-e9f9e851]{flex-shrink:0;align-items:center;gap:12px;padding:12px 16px 8px;display:flex}.mp-search[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);max-width:420px;height:32px;transition:border-color var(--transition-fast) ease;flex:1;align-items:center;gap:6px;padding:0 10px;display:flex}.mp-search[data-v-e9f9e851]:focus-within{border-color:var(--color-primary)}.mp-search .mp-search-icon[data-v-e9f9e851]{color:var(--text-tertiary);flex-shrink:0}.mp-search .mp-search-input[data-v-e9f9e851]{color:var(--text-primary);font-size:var(--font-size-mid);background:0 0;border:none;outline:none;flex:1;font-family:inherit}.mp-search .mp-search-input[data-v-e9f9e851]::placeholder{color:var(--text-tertiary)}.mp-target[data-v-e9f9e851]{flex-shrink:0}.mp-refresh[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);width:30px;height:30px;color:var(--text-secondary);cursor:pointer;transition:var(--transition-ui-fast);justify-content:center;align-items:center;display:flex}.mp-refresh[data-v-e9f9e851]:hover{color:var(--color-primary);border-color:var(--color-primary)}.mp-refresh.spinning svg[data-v-e9f9e851]{animation:.9s linear infinite mkt-spin-e9f9e851}@keyframes mkt-spin-e9f9e851{to{transform:rotate(360deg)}}.mp-toolbar-sub[data-v-e9f9e851]{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:12px;padding:0 16px 10px;display:flex}.mp-target-hint[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-tertiary)}.mp-target-hint b[data-v-e9f9e851]{color:var(--color-primary);font-weight:600}.mp-source-filter[data-v-e9f9e851]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.mp-chip[data-v-e9f9e851]{font-size:var(--font-size-sm);border:1px solid var(--border-color);border-radius:var(--radius-xl);color:var(--text-tertiary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:2px 10px;font-family:inherit}.mp-chip[data-v-e9f9e851]:hover{color:var(--text-secondary);border-color:var(--text-tertiary)}.mp-chip.active[data-v-e9f9e851]{color:var(--color-primary);border-color:var(--color-primary);background:color-mix(in srgb, var(--color-primary) 8%, transparent)}.mp-chip.clear[data-v-e9f9e851]{color:var(--text-tertiary);border-style:dashed}.mp-body[data-v-e9f9e851]{flex:1;min-height:0;padding:0 16px 20px;overflow-y:auto}.mp-group[data-v-e9f9e851]{margin-bottom:20px}.mp-group.installed[data-v-e9f9e851]{border-top:1px dashed var(--border-color);padding-top:14px}.mp-group-header[data-v-e9f9e851]{align-items:center;gap:8px;margin-bottom:10px;display:flex}.mp-group-title[data-v-e9f9e851]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mp-group-count[data-v-e9f9e851]{min-width:20px;height:18px;font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-tertiary);justify-content:center;align-items:center;padding:0 6px;display:inline-flex}.mp-group-error[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--color-warning);align-items:center;gap:4px;display:inline-flex}.mp-group-link[data-v-e9f9e851]{color:var(--text-tertiary);transition:color var(--transition-fast) ease;display:inline-flex}.mp-group-link[data-v-e9f9e851]:hover{color:var(--color-primary)}.mp-grid[data-v-e9f9e851]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;display:grid}.mp-card[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);transition:border-color var(--transition-fast) ease, box-shadow var(--transition-fast) ease;flex-direction:column;gap:6px;padding:12px;display:flex}.mp-card[data-v-e9f9e851]:hover{border-color:color-mix(in srgb, var(--color-primary) 40%, var(--border-color));box-shadow:var(--shadow-sm)}.mp-card-head[data-v-e9f9e851]{align-items:center;gap:8px;display:flex}.mp-card-name[data-v-e9f9e851]{min-width:0;font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-weight:600;overflow:hidden}.mp-card-metric[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);flex-shrink:0;align-items:center;gap:3px;display:inline-flex}.mp-card-desc[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:36px;margin:0;line-height:1.5;display:-webkit-box;overflow:hidden}.mp-card-meta[data-v-e9f9e851]{flex-wrap:wrap;align-items:center;gap:6px;min-height:18px;display:flex}.mp-meta-pkg[data-v-e9f9e851],.mp-meta-repo[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);white-space:nowrap;text-overflow:ellipsis;max-width:220px;overflow:hidden}.mp-tag[data-v-e9f9e851]{font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-tertiary);flex-shrink:0;padding:1px 6px}.mp-tag.remote[data-v-e9f9e851]{background:color-mix(in srgb, var(--color-info,var(--action-teal)) 14%, transparent);color:var(--color-info,var(--action-teal))}.mp-tag.warn[data-v-e9f9e851]{background:color-mix(in srgb, var(--color-warning) 14%, transparent);color:var(--color-warning)}.mp-card-foot[data-v-e9f9e851]{align-items:center;gap:8px;margin-top:2px;display:flex}.mp-card-link[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);text-decoration:none}.mp-card-link[data-v-e9f9e851]:hover{color:var(--color-primary);text-decoration:underline}.mp-foot-spacer[data-v-e9f9e851]{flex:1}.mp-install-btn[data-v-e9f9e851]{font-size:var(--font-size-sm);border:1px solid var(--color-primary);border-radius:var(--radius-base);color:var(--color-primary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:4px 14px;font-family:inherit}.mp-install-btn[data-v-e9f9e851]:hover:not(:disabled){background:var(--color-primary);color:#fff}.mp-install-btn[data-v-e9f9e851]:disabled{opacity:.5;cursor:not-allowed}.mp-installed-chip[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--color-success,var(--action-emerald));align-items:center;gap:3px;display:inline-flex}.mp-not-installable[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary)}.mp-empty[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-tertiary);padding:16px 0}.mp-empty.all[data-v-e9f9e851]{text-align:center;padding:48px 0}.mp-installed-block[data-v-e9f9e851]{margin-bottom:12px}.mp-installed-target[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px;font-weight:600}.mp-installed-list[data-v-e9f9e851]{flex-direction:column;gap:4px;display:flex}.mp-installed-row[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-base);background:var(--bg-panel);align-items:center;gap:10px;padding:6px 10px;display:flex}.mp-installed-name[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-weight:500;overflow:hidden}.mp-remove-btn[data-v-e9f9e851]{font-size:var(--font-size-xs);border:1px solid var(--border-color);border-radius:var(--radius-xs);color:var(--text-tertiary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;align-items:center;gap:4px;padding:3px 10px;font-family:inherit;display:inline-flex}.mp-remove-btn[data-v-e9f9e851]:hover:not(:disabled){color:var(--color-danger);border-color:var(--color-danger)}.mp-remove-btn[data-v-e9f9e851]:disabled{opacity:.5;cursor:not-allowed}@media (prefers-reduced-motion:reduce){.mp-refresh.spinning svg[data-v-e9f9e851]{animation:none}}.mkt-form[data-v-e9f9e851]{flex-direction:column;gap:12px;display:flex}.mkt-form-name[data-v-e9f9e851]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mkt-field[data-v-e9f9e851]{flex-direction:column;gap:4px;display:flex}.mkt-field label[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:600}.mkt-field input[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-container);height:30px;color:var(--text-primary);font-size:var(--font-size-mid);transition:border-color var(--transition-fast) ease;padding:0 8px;font-family:inherit}.mkt-field input[data-v-e9f9e851]:focus{border-color:var(--color-primary);outline:none}.mkt-hint[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-tertiary);margin:0}.mkt-cancel[data-v-e9f9e851],.mkt-confirm[data-v-e9f9e851]{font-size:var(--font-size-mid);border-radius:var(--radius-base);cursor:pointer;transition:var(--transition-ui-fast);padding:6px 16px;font-family:inherit}.mkt-cancel[data-v-e9f9e851]{border:1px solid var(--border-color);color:var(--text-secondary);background:0 0;margin-right:8px}.mkt-cancel[data-v-e9f9e851]:hover{color:var(--text-primary);border-color:var(--text-tertiary)}.mkt-confirm[data-v-e9f9e851]{border:1px solid var(--color-primary);background:var(--color-primary);color:#fff}.mkt-confirm[data-v-e9f9e851]:hover{opacity:.9}.agent-view[data-v-bd681ddd]{background:var(--bg-container);height:100%;min-height:0;display:flex}.agent-sidebar[data-v-bd681ddd]{background:var(--bg-panel);border-right:1px solid var(--border-color);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.agent-conversations[data-v-bd681ddd]{flex:1;min-height:0;padding:10px 6px 8px 12px}.sidebar-resizer[data-v-bd681ddd]{cursor:col-resize;width:4px;transition:background var(--transition-fast) ease;background:0 0;flex-shrink:0}.sidebar-resizer[data-v-bd681ddd]:hover,.sidebar-resizer.active[data-v-bd681ddd]{background:var(--color-primary);opacity:.3}.agent-chat-area[data-v-bd681ddd]{flex-direction:column;flex:1;min-width:0;display:flex;position:relative;overflow:hidden}.agent-tabs[data-v-bd681ddd]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:4px;padding:8px 12px 0;display:flex}.agent-tab[data-v-bd681ddd]{color:var(--text-tertiary);font-size:var(--font-size-mid);cursor:pointer;transition:color var(--transition-fast) ease, border-color var(--transition-fast) ease, background var(--transition-fast) ease;border-radius:var(--radius-base) var(--radius-base) 0 0;background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:7px 14px 9px;font-family:inherit;display:inline-flex}.agent-tab[data-v-bd681ddd]:hover{color:var(--text-secondary);background:var(--bg-hover)}.agent-tab.active[data-v-bd681ddd]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:600}.agent-tab-body[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-pane[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.agent-tab-body[data-v-bd681ddd]>.marketplace-panel{flex:1;min-height:0}.chat-loading[data-v-bd681ddd]{color:var(--text-tertiary);font-size:var(--font-size-base);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}.agent-list-page[data-v-bd681ddd]{background:var(--bg-panel);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-list-page .agent-conversations[data-v-bd681ddd]{padding:12px 12px 10px 14px}.agent-page-bar[data-v-bd681ddd]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 12px 0 6px;display:flex}.agent-page-back[data-v-bd681ddd]{border-radius:var(--radius-xs);width:24px;height:24px;color:var(--text-tertiary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.agent-page-back[data-v-bd681ddd]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-page-title[data-v-bd681ddd]{min-width:0;font-size:var(--font-size-mid);color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.agent-chat-host[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}[data-v-bd681ddd] .acu-welcome-grid>.acu-preset-q:last-child:nth-child(odd){grid-column:1/-1}[data-theme=dark]{background:var(--bg-panel)}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$ as e,A as t,Bt as n,Cn as r,Ct as i,Dn as a,Dt as o,En as s,Gn as c,H as l,Hn as u,Jr as d,K as f,Kr as p,Mn as m,Nr as h,Ot as g,Pn as _,Q as v,Qr as y,Rn as b,Tn as x,Ut as S,Yn as C,Zn as w,a as T,at as E,dr as D,er as O,ft as k,gr as A,hn as j,i as M,ir as N,j as P,jn as F,ln as I,or as L,qn as R,qt as z,r as B,rn as V,sr as H,st as U,vr as W,wn as G,yn as K}from"./element-plus-D7LDHcAn.js";import{n as ee,s as te}from"./vendor-CLmPUj3K.js";import{n as q,t as J}from"./_plugin-vue_export-helper-BLGowG5t.js";import{t as Y}from"./configStore-BUXv5i5j.js";import{t as X}from"./CommonDialog-CecgvEzd.js";import{a as ne,i as re,n as ie,o as ae,r as oe,t as se}from"./agentConversations-BQCIv4u1.js";b(),D();function ce(e,t=680){let n=W(0),i=null;function a(){let t=e.value;return t?(n.value=t.clientWidth,typeof ResizeObserver>`u`||(i=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(n.value=t)}),i.observe(t),!0)):!1}return R(()=>{a()||u(()=>a())}),c(()=>{i?.disconnect(),i=null}),{width:n,narrow:r(()=>n.value>0&&n.value<t)}}b(),D();var Z=_({__name:`MarketplacePanel`,props:{type:{type:String,required:!0}},setup(t,{expose:i}){i();let a=t,s=Y(),c=W([]),l=W([]),u=W(!1),d=W(``),f=W(``),p=W([]),m=W(`project`),h=W(new Set),g=W(new Set),_=r(()=>s.currentDirectory||``),v=null;async function y(){if(!u.value){u.value=!0;try{let e=new URLSearchParams({type:a.type,cwd:_.value});f.value&&e.set(`q`,f.value),p.value.length&&e.set(`sources`,p.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();t?.success?(c.value=t.groups||[],l.value=t.installed||[]):M.error(t?.error||q(`@MKT:加载失败`))}catch{M.error(q(`@MKT:加载失败`))}finally{u.value=!1}}}N(d,e=>{v&&clearTimeout(v),v=setTimeout(()=>{f.value=e.trim(),y()},400)}),N(p,()=>y()),N(()=>a.type,()=>{p.value=[],f.value=``,d.value=``,y()}),N(_,()=>y()),y();let b=r(()=>{let e=_.value?_.value.split(/[\\/]/).filter(Boolean).pop():``;return m.value===`project`?e||q(`@MKT:当前项目`):q(`@MKT:g ai 智能体`)});function x(e){return e.stars?`${C(e.stars)} ★`:e.downloads?`${C(e.downloads)} ${q(`@MKT:周下载`)}`:e.uses?`${C(e.uses)} ${q(`@MKT:次使用`)}`:``}function C(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function w(e){return`${e.id}`}function T(e){return h.value.has(w(e))}let E=r(()=>{let e={project:[],global:[]};for(let t of l.value)(e[t.target]||=[]).push(t);return e}),D=A({visible:!1,item:null,env:{},args:``});function O(e){return a.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function j(e){D.item=e,D.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),D.args=(e.args||[]).join(` `),D.visible=!0}function P(){let e=D.item;if(D.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(D.env).filter(([,e])=>e.trim()!==``)),n=D.args.trim()?D.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;I(e,{env:t,...n?{args:n}:{}})}async function F(e){if(!e.installed||await L(e)){if(O(e)){j(e);return}await I(e,{})}}async function I(e,t){let n=w(e);h.value.add(n);try{let n=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:a.type,target:m.value,cwd:_.value,item:{...e,...t}})}),r=await n.json().catch(()=>null);if(!n.ok||!r?.success){M.error(r?.error||q(`@MKT:安装失败`));return}r.item?.warning&&M.warning(r.item.warning),r.item?.envKeys?.length?M.warning(`${q(`@MKT:还缺环境变量`)}: ${r.item.envKeys.join(`, `)}`):M.success(q(`@MKT:安装成功`)),await y()}catch{M.error(q(`@MKT:安装失败`))}finally{h.value.delete(n)}}async function L(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 R(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}`;g.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:_.value}),n=await fetch(`/api/agent/marketplace/item/${a.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),r=await n.json().catch(()=>null);if(!n.ok||!r?.success){M.error(r?.error||q(`@MKT:卸载失败`));return}M.success(q(`@MKT:已卸载`)),await y()}catch{M.error(q(`@MKT:卸载失败`))}finally{g.value.delete(t)}}let H={props:a,configStore:s,groups:c,installed:l,loading:u,searchInput:d,query:f,selectedSources:p,installTarget:m,installing:h,removing:g,cwd:_,get searchTimer(){return v},set searchTimer(e){v=e},loadCatalog:y,targetLabel:b,metricText:x,formatCount:C,cardKey:w,isBusy:T,installedByTarget:E,configDialog:D,needsConfig:O,openConfigDialog:j,confirmConfig:P,onInstall:F,doInstall:I,confirmReinstall:L,onRemove:R,get $t(){return q},get Search(){return S},get Refresh(){return n},get Delete(){return U},get Link(){return o},get Check(){return e},get Star(){return z},get Download(){return k},get Warning(){return V},CommonDialog:X};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}});b(),I(),h();var Q={class:`marketplace-panel`},le={class:`mp-toolbar`},ue={class:`mp-search`},de=[`placeholder`],fe={class:`mp-toolbar-sub`},pe={class:`mp-target-hint`},me={class:`mp-source-filter`},he=[`onClick`],ge={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={class:`mp-installed-name`},Ge={key:0,class:`mp-meta-pkg`},Ke={key:1,class:`mp-tag warn`},qe=[`disabled`,`onClick`],Je={key:1,class:`mp-empty all`},Ye={key:0,class:`mkt-form`},Xe={class:`mkt-form-name`},Ze=[`onUpdate:modelValue`,`placeholder`],Qe={key:0,class:`mkt-field`},$e={class:`mkt-hint`};function et(e,n,r,i,o,c){let u=f,d=t,h=P,g=l,_=T;return C(),a(`div`,Q,[s(` ── 工具栏 ───────────────────────────────── `),G(`div`,le,[G(`div`,ue,[m(u,{class:`mp-search-icon`},{default:L(()=>[m(i.Search)]),_:1}),H(G(`input`,{"onUpdate:modelValue":n[0]||=e=>i.searchInput=e,class:`mp-search-input`,type:`text`,placeholder:r.type===`skill`?i.$t(`@MKT:搜索 Skill...`):i.$t(`@MKT:搜索 MCP 服务...`)},null,8,de),[[j,i.searchInput]])]),m(h,{modelValue:i.installTarget,"onUpdate:modelValue":n[1]||=e=>i.installTarget=e,size:`small`,class:`mp-target`},{default:L(()=>[m(d,{value:`project`},{default:L(()=>[F(y(i.$t(`@MKT:当前项目`)),1)]),_:1}),m(d,{value:`global`},{default:L(()=>[F(y(i.$t(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),m(g,{content:i.$t(`@MKT:刷新`),placement:`top`,"show-after":300},{default:L(()=>[G(`button`,{class:p([`mp-refresh`,{spinning:i.loading}]),onClick:i.loadCatalog},[m(u,null,{default:L(()=>[m(i.Refresh)]),_:1})],2)]),_:1},8,[`content`])]),G(`div`,fe,[G(`span`,pe,[F(y(i.$t(`@MKT:安装到`))+` `,1),G(`b`,null,y(i.targetLabel),1)]),G(`div`,me,[(C(!0),a(K,null,w(i.groups,e=>(C(),a(`button`,{key:e.id,class:p([`mp-chip`,{active:i.selectedSources.includes(e.id)}]),onClick:()=>{let t=i.selectedSources.indexOf(e.id);t>=0?i.selectedSources.splice(t,1):i.selectedSources.push(e.id)}},y(e.label),11,he))),128)),i.selectedSources.length?(C(),a(`button`,{key:0,class:`mp-chip clear`,onClick:n[2]||=e=>i.selectedSources=[]},y(i.$t(`@MKT:全部来源`)),1)):s(`v-if`,!0)])]),s(` ── 内容 ─────────────────────────────────── `),H((C(),a(`div`,ge,[(C(!0),a(K,null,w(i.groups,e=>(C(),a(`section`,{key:e.id,class:`mp-group`},[G(`header`,_e,[G(`h3`,ve,y(e.label),1),e.status===`ok`?(C(),a(`span`,ye,y(e.items.length),1)):(C(),a(`span`,be,[m(u,null,{default:L(()=>[m(i.Warning)]),_:1}),F(` `+y(e.error||i.$t(`@MKT:来源不可用`)),1)])),e.homepage?(C(),a(`a`,{key:2,class:`mp-group-link`,href:e.homepage,target:`_blank`,rel:`noopener noreferrer`,title:e.homepage},[m(u,null,{default:L(()=>[m(i.Link)]),_:1})],8,xe)):s(`v-if`,!0)]),e.status===`ok`&&e.items.length?(C(),a(`div`,Se,[(C(!0),a(K,null,w(e.items,e=>(C(),a(`article`,{key:i.cardKey(e),class:`mp-card`},[G(`div`,Ce,[G(`span`,{class:`mp-card-name`,title:e.name},y(e.name),9,we),i.metricText(e)?(C(),a(`span`,Te,[m(u,null,{default:L(()=>[e.stars?(C(),x(i.Star,{key:0})):(C(),x(i.Download,{key:1}))]),_:2},1024),F(` `+y(i.metricText(e)),1)])):s(`v-if`,!0)]),G(`p`,{class:`mp-card-desc`,title:e.description},y(e.description||i.$t(`@MKT:暂无描述`)),9,Ee),G(`div`,De,[e.package?(C(),a(`code`,{key:0,class:`mp-meta-pkg`,title:e.package},y(e.package),9,Oe)):e.repository?(C(),a(`span`,{key:1,class:`mp-meta-repo`,title:e.repository+(e.subpath?` · `+e.subpath:``)},[F(y(e.repository),1),e.subpath?(C(),a(K,{key:0},[F(` · `+y(e.subpath),1)],64)):s(`v-if`,!0)],8,ke)):s(`v-if`,!0),e.transport===`remote`?(C(),a(`span`,Ae,y(i.$t(`@MKT:远程服务`)),1)):s(`v-if`,!0),(C(!0),a(K,null,w((e.tags||[]).slice(0,2),e=>(C(),a(`span`,{key:e,class:`mp-tag`},y(e),1))),128))]),G(`div`,je,[e.upstream?(C(),a(`a`,{key:0,class:`mp-card-link`,href:e.upstream,target:`_blank`,rel:`noopener noreferrer`},y(i.$t(`@MKT:查看来源`)),9,Me)):s(`v-if`,!0),n[6]||=G(`span`,{class:`mp-foot-spacer`},null,-1),e.installed?(C(),a(`span`,Ne,[m(u,null,{default:L(()=>[m(i.Check)]),_:1}),F(y(i.$t(`@MKT:已安装`)),1)])):e.installable===!1?(C(),a(`span`,Fe,y(i.$t(`@MKT:暂不支持一键安装`)),1)):(C(),a(`button`,{key:2,class:`mp-install-btn`,disabled:i.isBusy(e),onClick:t=>i.onInstall(e)},y(i.isBusy(e)?i.$t(`@MKT:安装中...`):i.$t(`@MKT:安装`)),9,Pe))])]))),128))])):e.status===`ok`?(C(),a(`div`,Ie,y(i.$t(`@MKT:该来源暂无结果`)),1)):s(`v-if`,!0)]))),128)),s(` ── 已安装 ─────────────────────────────── `),i.installed.length?(C(),a(`section`,Le,[G(`header`,Re,[G(`h3`,ze,y(i.$t(`@MKT:已安装`)),1),G(`span`,Be,y(i.installed.length),1)]),(C(),a(K,null,w([`project`,`global`],e=>G(`div`,{key:e},[i.installedByTarget[e]?.length?(C(),a(`div`,Ve,[G(`div`,He,y(e===`project`?i.$t(`@MKT:当前项目`):i.$t(`@MKT:g ai 智能体`)),1),G(`div`,Ue,[(C(!0),a(K,null,w(i.installedByTarget[e],t=>(C(),a(`div`,{key:e+t.id,class:`mp-installed-row`},[G(`span`,We,y(t.name),1),t.package?(C(),a(`code`,Ge,y(t.package),1)):s(`v-if`,!0),t.requiredEnv?.length?(C(),a(`span`,Ke,y(i.$t(`@MKT:待配置`))+`: `+y(t.requiredEnv.join(`, `)),1)):s(`v-if`,!0),n[7]||=G(`span`,{class:`mp-foot-spacer`},null,-1),G(`button`,{class:`mp-remove-btn`,disabled:i.removing.has(e+t.id),onClick:e=>i.onRemove(t)},[m(u,null,{default:L(()=>[m(i.Delete)]),_:1}),F(` `+y(i.removing.has(e+t.id)?i.$t(`@MKT:卸载中...`):i.$t(`@MKT:卸载`)),1)],8,qe)]))),128))])])):s(`v-if`,!0)])),64))])):s(`v-if`,!0),!i.loading&&!i.groups.length?(C(),a(`div`,Je,y(i.$t(`@MKT:加载失败`)),1)):s(`v-if`,!0)])),[[_,i.loading]]),s(` ── MCP 安装前配置 ───────────────────────── `),m(i.CommonDialog,{modelValue:i.configDialog.visible,"onUpdate:modelValue":n[5]||=e=>i.configDialog.visible=e,title:i.$t(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:L(()=>[G(`button`,{class:`mkt-cancel`,onClick:n[4]||=e=>i.configDialog.visible=!1},y(i.$t(`@MKT:取消`)),1),G(`button`,{class:`mkt-confirm`,onClick:i.confirmConfig},y(i.$t(`@MKT:安装`)),1)]),default:L(()=>[i.configDialog.item?(C(),a(`div`,Ye,[G(`p`,Xe,y(i.configDialog.item.name),1),(C(!0),a(K,null,w(Object.keys(i.configDialog.env),e=>(C(),a(`div`,{key:e,class:`mkt-field`},[G(`label`,null,y(e),1),H(G(`input`,{"onUpdate:modelValue":t=>i.configDialog.env[e]=t,type:`text`,autocomplete:`off`,placeholder:i.$t(`@MKT:环境变量值`),spellcheck:`false`},null,8,Ze),[[j,i.configDialog.env[e]]])]))),128)),i.configDialog.item.args?.length?(C(),a(`div`,Qe,[G(`label`,null,y(i.$t(`@MKT:启动参数`)),1),H(G(`input`,{"onUpdate:modelValue":n[3]||=e=>i.configDialog.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[j,i.configDialog.args]]),G(`p`,$e,y(i.$t(`@MKT:参数提示`)),1)])):s(`v-if`,!0)])):s(`v-if`,!0)]),_:1},8,[`modelValue`,`title`])])}var tt=J(Z,[[`render`,et],[`__scopeId`,`data-v-e9f9e851`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/MarketplacePanel.vue`]]);b(),D();var $=_({__name:`AgentView`,setup(e,{expose:t}){t();let n=Y(),a=W(null),{narrow:o}=ce(a),s=W(`chat`),c=W(`chat`),l=r(()=>c.value===`mcp`?`mcp`:`skill`),d=r(()=>[{id:`chat`,label:q(`@AGENT:对话`),icon:v},{id:`skill`,label:q(`@AGENT:Skill 广场`),icon:i},{id:`mcp`,label:q(`@AGENT:MCP 广场`),icon:E}]),{sessions:p,sessionsLoading:m,currentSessionId:h,messages:_,isStreaming:y,sessionLoading:b,loadSessions:x,loadSession:S,deleteSession:C,renameSession:w,newSession:T,sendMessage:D,pendingQuestion:O,answeringQuestion:k,answerQuestion:A,isSessionGenerating:j,stop:M}=ae(),P=r(()=>{let e=n.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),F=r(()=>re(p.value,j)),I=ie(),L=r(()=>F.value.find(e=>e.id===h.value)?.title||q(`@AGENT:对话`)),R=r(()=>[{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 z(e){await D(e.text,e.files),await u(),U()}async function B(e){await D(e.prompt),await u(),U()}let V=oe(),H=W(null);function U(e=!0){H.value?.scrollToBottom(e)}N(()=>_.value.length,()=>{u(()=>U(!1))});function G(e){S(e),s.value=`chat`}function K(){T(),s.value=`chat`}let J=W(280),X=W(!1);function Z(e){X.value=!0;let t=e.clientX,n=J.value,r=e=>{let r=e.clientX-t,i=Math.max(200,Math.min(500,n+r));J.value=i},i=()=>{X.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}N(o,e=>{e||(s.value=`chat`)}),N(()=>[n.currentDirectory,y.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await x(),h.value&&!y.value&&!p.value.some(e=>e.sessionId===h.value)&&T()},{immediate:!0});let Q={configStore:n,rootRef:a,narrow:o,chatPage:s,activeTab:c,marketplaceType:l,tabs:d,sessions:p,sessionsLoading:m,currentSessionId:h,messages:_,isStreaming:y,sessionLoading:b,loadSessions:x,loadSession:S,deleteSession:C,renameSession:w,newSession:T,sendMessage:D,pendingQuestion:O,answeringQuestion:k,answerQuestion:A,isSessionGenerating:j,stop:M,chatTheme:P,conversationItems:F,conversationLabels:I,currentSessionTitle:L,presetQuestions:R,onSend:z,onSelectPreset:B,questionLabels:V,chatContainerRef:H,scrollToBottom:U,selectSession:G,handleNewSession:K,sidebarWidth:J,isResizing:X,startResize:Z,get $t(){return q},get ElIcon(){return f},get Loading(){return g},get ChatContainer(){return te},get ConversationList(){return ee},get AGENT_UPLOAD_ACCEPT(){return ne},get AGENT_ASSISTANT_NAME(){return se},MarketplacePanel:tt};return Object.defineProperty(Q,"__isScriptSetup",{enumerable:!1,value:!0}),Q}});b(),h();var nt={ref:`rootRef`,class:`agent-view`},rt={class:`agent-chat-area`},it={class:`agent-tabs`,role:`tablist`},at=[`aria-selected`,`onClick`],ot={class:`agent-tab-body`},st={key:0,class:`agent-chat-pane`},ct={key:0,class:`agent-list-page`},lt={key:0,class:`agent-page-bar`},ut=[`title`,`aria-label`],dt={class:`agent-page-title`},ft={class:`agent-chat-host`},pt={key:0,class:`chat-loading`};function mt(e,t,n,r,i,o){return C(),a(`div`,nt,[s(` ═══ 宽屏:左侧会话列表(只在「对话」Tab 显示)═══
|
|
2
|
+
窄屏时这一整块不渲染,会话列表改成 body 里的一个整页(见 .agent-list-page) `),r.activeTab===`chat`&&!r.narrow?(C(),a(K,{key:0},[G(`aside`,{class:`agent-sidebar`,style:d({width:r.sidebarWidth+`px`})},[s(` 会话列表:UI 与交互都在组件库的 ConversationList 里 `),m(r.ConversationList,{class:`agent-conversations`,items:r.conversationItems,"active-id":r.currentSessionId,loading:r.sessionsLoading,labels:r.conversationLabels,onSelect:r.selectSession,onNew:r.handleNewSession,onRename:r.renameSession,onDelete:r.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])],4),s(` 拖拽分隔条 `),G(`div`,{class:p([`sidebar-resizer`,{active:r.isResizing}]),onMousedown:r.startResize},null,34)],64)):s(`v-if`,!0),s(` ═══ 右侧:Tab 栏 + 内容区 ═══ `),G(`main`,rt,[G(`nav`,it,[(C(!0),a(K,null,w(r.tabs,e=>(C(),a(`button`,{key:e.id,type:`button`,class:p([`agent-tab`,{active:r.activeTab===e.id}]),role:`tab`,"aria-selected":r.activeTab===e.id,onClick:t=>r.activeTab=e.id},[m(r.ElIcon,null,{default:L(()=>[(C(),x(O(e.icon)))]),_:2},1024),G(`span`,null,y(e.label),1)],10,at))),128))]),G(`div`,ot,[s(` ── 对话 ── `),r.activeTab===`chat`?(C(),a(`div`,st,[s(` 窄屏 · 会话列表页:列表独占整页 `),r.narrow&&r.chatPage===`list`?(C(),a(`div`,ct,[m(r.ConversationList,{class:`agent-conversations`,items:r.conversationItems,"active-id":r.currentSessionId,loading:r.sessionsLoading,labels:r.conversationLabels,onSelect:r.selectSession,onNew:r.handleNewSession,onRename:r.renameSession,onDelete:r.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])])):(C(),a(K,{key:1},[s(` 对话页(窄屏时顶上多一条返回条;宽屏左侧就摆着列表,不需要) `),r.narrow?(C(),a(`div`,lt,[G(`button`,{type:`button`,class:`agent-page-back`,title:r.$t(`@AGENT:返回会话列表`),"aria-label":r.$t(`@AGENT:返回会话列表`),onClick:t[0]||=e=>r.chatPage=`list`},[...t[1]||=[G(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[G(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),G(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,ut),G(`span`,dt,y(r.currentSessionTitle),1)])):s(`v-if`,!0),s(`
|
|
3
|
+
对话宿主:单独开一层裁剪边界。
|
|
4
|
+
欢迎页在矮/窄窗口里会比可用高度还高,而它是垂直居中的 —— 溢出的部分
|
|
5
|
+
会**向上**跑出 .acu-chat,盖到刚加的返回条上(把返回条的点击也一起吃掉,
|
|
6
|
+
e2e 实测就是这个症状)。宿主的 overflow:hidden 把它裁在自己这一格里。
|
|
7
|
+
`),G(`div`,ft,[s(` 加载中 `),r.sessionLoading?(C(),a(`div`,pt,[m(r.ElIcon,{class:`is-loading`,size:32},{default:L(()=>[m(r.Loading)]),_:1}),G(`span`,null,y(r.$t(`@AGENT:加载会话中...`)),1)])):(C(),a(K,{key:1},[s(` ChatContainer `),m(r.ChatContainer,{ref:`chatContainerRef`,messages:r.messages,"preset-questions":r.presetQuestions,"welcome-title":r.$t(`@AGENT:智能体助手`),"welcome-description":r.$t(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":r.AGENT_ASSISTANT_NAME,theme:r.chatTheme,disabled:r.isStreaming,generating:r.isStreaming,"upload-config":{accept:r.AGENT_UPLOAD_ACCEPT},placeholder:r.isStreaming?r.$t(`@AGENT:正在生成中...`):r.$t(`@AGENT:输入消息,Enter 发送`),question:r.pendingQuestion,"question-submitting":r.answeringQuestion,"question-labels":r.questionLabels,onSend:r.onSend,onSelect:r.onSelectPreset,onStop:r.stop,onAnswer:r.answerQuestion},null,8,[`messages`,`preset-questions`,`welcome-title`,`welcome-description`,`assistant-name`,`theme`,`disabled`,`generating`,`upload-config`,`placeholder`,`question`,`question-submitting`,`question-labels`,`onStop`,`onAnswer`])],2112))])],64))])):(C(),a(K,{key:1},[s(` ── Skill 广场 / MCP 广场 ── `),m(r.MarketplacePanel,{type:r.marketplaceType},null,8,[`type`])],2112))])])],512)}var ht=J($,[[`render`,mt],[`__scopeId`,`data-v-bd681ddd`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/AgentView.vue`]]);export{ht as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{Cn as e,Dn as t,En as n,Gn as r,H as i,Hn as a,K as o,Kr as s,L as c,Mn as l,Nr as u,Ot as d,Pn as f,Qr as p,Rn as m,Tn as h,Yn as g,dr as _,et as v,i as y,ir as b,jn as x,or as S,qn as C,r as w,tt as T,vr as E,wn as D}from"./element-plus-D7LDHcAn.js";import{n as O,t as k}from"./_plugin-vue_export-helper-BLGowG5t.js";import{t as A}from"./CommonDialog-CecgvEzd.js";async function j(e,t){let n=e.body.getReader(),r=new TextDecoder(`utf-8`),i=``;for(;;){let{done:e,value:a}=await n.read();if(e)break;i+=r.decode(a,{stream:!0});let o=i.split(`
|
|
2
|
+
`);i=o.pop()??``;for(let e of o)e.trim()&&t(e)}i.trim()&&t(i)}async function M(){let e=await fetch(`/api/app-version`);return e.ok?e.json():{success:!1,current:``,latest:null,hasUpdate:!1,error:`HTTP ${e.status}`}}async function N(e){let t=await fetch(`/api/app-upgrade`,{method:`POST`});if(!t.ok){let n=`HTTP ${t.status}`;try{let e=await t.json();e?.error&&(n=e.error)}catch{}e({type:`error`,message:n}),e({type:`done`,code:t.status});return}if(!t.body){e({type:`error`,message:`响应无 body`}),e({type:`done`,code:-1});return}await j(t,t=>{try{e(JSON.parse(t))}catch{}})}async function P(){let e=await fetch(`/api/app-restart`,{method:`POST`});if(!e.ok){let t=`HTTP ${e.status}`;try{let n=await e.json();n?.error&&(t=n.error)}catch{}throw Error(t)}if(!e.body)throw Error(`响应无 body`);return new Promise((t,n)=>{let r=!1,i=e=>{r||(r=!0,e())};j(e,e=>{try{let r=JSON.parse(e);r.type===`ready`&&typeof r.port==`number`&&r.port>0?i(()=>t(r.port)):r.type===`timeout`?i(()=>n(Error(`restart.timeout`))):r.type===`error`&&i(()=>n(Error(r.message||`restart.failed`)))}catch{}}).then(()=>{i(()=>n(Error(`restart.stream-closed`)))}).catch(()=>{})})}m(),_();var F=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,I=f({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean,required:!0},logs:{type:String,required:!0},status:{type:String,required:!0},countdown:{type:Number,required:!1,default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(e,{expose:t,emit:n}){t();let r=e,i=n,o=E(null);b(()=>r.logs,async()=>{await a(),o.value&&(o.value.scrollTop=o.value.scrollHeight)});function s(){r.status!==`running`&&(r.status===`success`&&r.countdown>0&&i(`cancel`),i(`update:modelValue`,!1))}function c(){i(`retry`)}function l(){i(`restart`)}function u(){i(`cancel`),i(`update:modelValue`,!1)}async function f(){try{await navigator.clipboard.writeText(F),y.success(O(`@F13B4:已复制升级命令`))}catch{y.warning(O(`@F13B4:复制失败,请手动复制`))}}let p={MANUAL_COMMAND:F,props:r,emit:i,logEl:o,close:s,onRetry:c,onRestart:l,onLater:u,onCopyCommand:f,get Loading(){return d},get CircleCheck(){return v},get CircleClose(){return T},get $t(){return O},CommonDialog:A};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}});m(),u();var L={key:3},R={key:4},z={key:5},B={key:0,class:`upgrade-hint`},V={key:0,class:`upgrade-countdown`},H={key:1,class:`upgrade-manual`},U={class:`upgrade-manual__label`};function W(e,r,i,a,u,d){let f=o,m=c;return g(),h(a.CommonDialog,{"model-value":i.modelValue,"onUpdate:modelValue":r[0]||=e=>a.emit(`update:modelValue`,e),title:a.$t(`@F13B4:升级`),width:`680px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":i.status!==`running`,"append-to-body":``,onClose:a.close},{footer:S(()=>[i.status===`failed`?(g(),h(m,{key:0,type:`primary`,onClick:a.onRetry},{default:S(()=>[x(p(a.$t(`@F13B4:重试`)),1)]),_:1})):n(`v-if`,!0),i.status===`failed`?(g(),h(m,{key:1,onClick:a.onCopyCommand},{default:S(()=>[x(p(a.$t(`@F13B4:复制升级命令`)),1)]),_:1})):n(`v-if`,!0),i.status===`success`?(g(),h(m,{key:2,type:`primary`,onClick:a.onRestart},{default:S(()=>[x(p(a.$t(`@F13B4:立即重启并刷新`)),1)]),_:1})):n(`v-if`,!0),i.status===`success`?(g(),h(m,{key:3,onClick:a.onLater},{default:S(()=>[x(p(a.$t(`@F13B4:稍后手动重启`)),1)]),_:1})):n(`v-if`,!0),i.status===`running`?(g(),h(m,{key:4,disabled:``},{default:S(()=>[x(p(a.$t(`@F13B4:升级中`))+`... `,1)]),_:1})):n(`v-if`,!0)]),default:S(()=>[D(`div`,{class:s([`upgrade-status`,`is-${i.status}`])},[i.status===`running`?(g(),h(f,{key:0,class:`is-loading`},{default:S(()=>[l(a.Loading)]),_:1})):i.status===`success`?(g(),h(f,{key:1,color:`var(--color-success)`},{default:S(()=>[l(a.CircleCheck)]),_:1})):(g(),h(f,{key:2,color:`var(--color-danger)`},{default:S(()=>[l(a.CircleClose)]),_:1})),i.status===`running`?(g(),t(`span`,L,p(a.$t(`@F13B4:升级中`)),1)):i.status===`success`?(g(),t(`span`,R,p(a.$t(`@F13B4:升级完成`)),1)):(g(),t(`span`,z,p(a.$t(`@F13B4:升级失败`)),1))],2),i.status===`success`?(g(),t(`p`,B,[x(p(a.$t(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),i.countdown>0?(g(),t(`span`,V,p(a.$t(`@F13B4:{seconds} 秒后自动刷新`,{seconds:i.countdown})),1)):n(`v-if`,!0)])):n(`v-if`,!0),i.status===`failed`?(g(),t(`p`,H,[D(`span`,U,p(a.$t(`@F13B4:手动升级命令`)),1),D(`code`,{class:`upgrade-manual__cmd`},p(a.MANUAL_COMMAND))])):n(`v-if`,!0),D(`pre`,{ref:`logEl`,class:`upgrade-log`},p(i.logs||a.$t(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}var G=k(I,[[`render`,W],[`__scopeId`,`data-v-bc566bba`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/UpgradeDialog.vue`]]);m(),_();var K=`https://github.com/xz333221/zen-gitsync/releases`,q=5,J=`app-version-check`,Y=36e5,X=f({__name:`AppVersionBadge`,setup(t,{expose:n}){n();let i=`2.17.17`,a=E(i),o=e(()=>a.value||i),s=E(null),c=E(!1),l=E(``),u=E(`running`),d=E(0),f=null,p=E(!1);function m(){try{let e=sessionStorage.getItem(J);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>Y?null:n}catch{return null}}function h(e){try{sessionStorage.setItem(J,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function g(e=!1){let t=m();t&&(s.value=t);try{let t=await M();s.value=t,h(t),t.current&&(a.value=t.current),!e&&t.success&&t.hasUpdate&&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 _(){if(s.value?.hasUpdate){try{await w.confirm(O(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:s.value.current,latest:s.value.latest}),O(`@F13B4:升级`),{confirmButtonText:O(`@F13B4:确定升级`),cancelButtonText:O(`@F13B4:取消`),type:`info`})}catch{return}l.value=``,u.value=`running`,c.value=!0,await N(e=>{if(e.type===`done`){if(u.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(J)}catch{}s.value?.latest&&(a.value=s.value.latest),v()}}else e.message&&(l.value+=e.message)})}}function v(){b(),d.value=q,f=setInterval(()=>{--d.value,d.value<=0&&(f&&=(clearInterval(f),null),S())},1e3)}function b(){f&&=(clearInterval(f),null),d.value=0}function x(){b()}async function S(){if(b(),!p.value){p.value=!0;try{let e=await P(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];y({type:`warning`,message:n?O(n):O(`@F13B4:重启失败 {error}`,{error:t})}),p.value=!1}}}r(()=>{b()}),C(()=>{g(!0)});let T={buildVersion:i,releasesUrl:K,runtimeVersion:a,displayVersion:o,latestInfo:s,upgradeDialogVisible:c,upgradeLogs:l,upgradeStatus:u,AUTO_REFRESH_SECONDS:q,countdown:d,get countdownTimer(){return f},set countdownTimer(e){f=e},restartInFlight:p,CACHE_KEY:J,CACHE_TTL_MS:Y,readCache:m,writeCache:h,checkUpdate:g,handleUpgrade:_,startAutoRefreshCountdown:v,cancelAutoRefreshCountdown:b,handleCancelAutoRefresh:x,handleRestart:S,get $t(){return O},UpgradeDialog:G};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}});m(),u();var Z={class:`app-version-badge`},Q=[`aria-label`],$=[`aria-label`],ee=[`title`,`aria-label`],te={class:`upgrade-btn__label`},ne={class:`upgrade-btn__version`};function re(e,r,a,o,s,c){let u=i;return g(),t(`div`,Z,[n(` GitHub 链接 `),l(u,{content:o.$t(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:S(()=>[D(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":o.$t(`@F13B4:在 GitHub 上查看源码`)},[...r[1]||=[D(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[D(`path`,{d:`M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z`})],-1)]],8,Q)]),_:1},8,[`content`]),n(` NPM 链接 `),l(u,{content:o.$t(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:S(()=>[D(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":o.$t(`@F13B4:在 npm 上查看包`)},[...r[2]||=[D(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[D(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,$)]),_:1},8,[`content`]),n(` 版本号 `),l(u,{content:o.$t(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:S(()=>[D(`a`,{href:o.releasesUrl,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+p(o.displayVersion),1)]),_:1},8,[`content`]),o.latestInfo?.hasUpdate?(g(),t(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:o.$t(`@F13B4:发现新版本 {version},点击升级`,{version:o.latestInfo.latest??``}),"aria-label":o.$t(`@F13B4:发现新版本 {version},点击升级`,{version:o.latestInfo.latest??``}),onClick:o.handleUpgrade},[r[3]||=D(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),D(`span`,te,p(o.$t(`@F13B4:升级`)),1),D(`span`,ne,`v`+p(o.latestInfo.latest),1)],8,ee)):n(`v-if`,!0),l(o.UpgradeDialog,{modelValue:o.upgradeDialogVisible,"onUpdate:modelValue":r[0]||=e=>o.upgradeDialogVisible=e,logs:o.upgradeLogs,status:o.upgradeStatus,countdown:o.countdown,onRetry:o.handleUpgrade,onRestart:o.handleRestart,onCancel:o.handleCancelAutoRefresh},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}var ie=k(X,[[`render`,re],[`__scopeId`,`data-v-7e0300ec`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AppVersionBadge.vue`]]);export{ie as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.upgrade-status[data-v-bc566bba]{align-items:center;gap:var(--spacing-base);margin-bottom:var(--spacing-md);font-size:var(--font-size-base);font-weight:500;display:flex}.upgrade-status.is-running[data-v-bc566bba]{color:var(--el-color-primary)}.upgrade-status.is-success[data-v-bc566bba]{color:var(--el-color-success)}.upgrade-status.is-failed[data-v-bc566bba]{color:var(--el-color-danger)}.upgrade-status .is-loading[data-v-bc566bba]{animation:2s linear infinite rotating-bc566bba}.upgrade-log[data-v-bc566bba]{color:#d4d4d4;border-radius:var(--radius-base);height:320px;font-family:JetBrains Mono,Cascadia Code,Consolas,monospace;font-size:var(--font-size-sm);white-space:pre-wrap;word-break:break-all;background:#1e1e1e;margin:0;padding:12px;line-height:1.6;overflow:auto}.upgrade-hint[data-v-bc566bba]{margin:0 0 var(--spacing-md) 0;border-left:3px solid var(--el-color-success);border-radius:var(--radius-base);color:var(--el-color-success);font-size:var(--font-size-mid);background:#67c23a14;padding:8px 12px}.upgrade-countdown[data-v-bc566bba]{background:var(--el-color-success);color:#fff;border-radius:var(--radius-md);font-size:var(--font-size-sm);margin-left:8px;padding:1px 8px;font-weight:600;animation:1s ease-in-out infinite pulse-bc566bba;display:inline-block}.upgrade-manual[data-v-bc566bba]{margin:0 0 var(--spacing-md) 0;border-left:3px solid var(--el-color-danger);border-radius:var(--radius-base);font-size:var(--font-size-mid);background:#f56c6c14;padding:8px 12px}.upgrade-manual__label[data-v-bc566bba]{color:var(--el-color-danger);margin-bottom:4px;font-weight:500;display:block}.upgrade-manual__cmd[data-v-bc566bba]{border-radius:var(--radius-base);font-family:JetBrains Mono,Cascadia Code,Consolas,monospace;font-size:var(--font-size-sm);color:var(--text-primary,#303133);word-break:break-all;-webkit-user-select:all;user-select:all;background:#0000000a;padding:6px 8px;display:block}@keyframes pulse-bc566bba{0%,to{opacity:1}50%{opacity:.55}}@keyframes rotating-bc566bba{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.app-version-badge[data-v-7e0300ec]{align-items:center;gap:var(--spacing-base);margin-left:auto;display:inline-flex}.badge-icon-link[data-v-7e0300ec]{border-radius:var(--radius-base);width:22px;height:22px;color:var(--text-tertiary);opacity:.7;transition:color var(--transition-base) ease, opacity var(--transition-base) ease, background var(--transition-base) ease;justify-content:center;align-items:center;text-decoration:none;display:inline-flex}.badge-icon-link[data-v-7e0300ec]:hover{opacity:1;color:var(--text-secondary);background:var(--bg-hover)}.badge-icon-link--npm[data-v-7e0300ec]:hover{color:var(--color-npm)}.badge-icon-link[data-v-7e0300ec]:first-child:hover{color:var(--text-primary)}.version-link[data-v-7e0300ec]{font-family:monospace;font-size:var(--font-size-xs);color:var(--text-secondary);border-radius:var(--radius-base);transition:color var(--transition-base), background-color var(--transition-base);padding:2px 6px;text-decoration:none}.version-link[data-v-7e0300ec]:hover{color:var(--color-primary);background-color:#0000000a}.upgrade-btn[data-v-7e0300ec]{appearance:none;cursor:pointer;height:22px;font-family:inherit;font-size:var(--font-size-xs);color:#fff;background:linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-dark) 100%);box-shadow:var(--shadow-sm);transition:transform var(--transition-fast) var(--ease-custom), box-shadow var(--transition-fast) var(--ease-custom), filter var(--transition-fast) var(--ease-custom);white-space:nowrap;-webkit-user-select:none;user-select:none;border:0;border-radius:11px;outline:none;align-items:center;gap:5px;margin:0;padding:0 10px 0 8px;font-weight:600;line-height:1;display:inline-flex}.upgrade-btn[data-v-7e0300ec]:hover{filter:brightness(1.08);box-shadow:var(--shadow-md);transform:translateY(-1px)}.upgrade-btn[data-v-7e0300ec]:active{filter:brightness(.96);box-shadow:var(--shadow-sm);transform:translateY(0)}.upgrade-btn[data-v-7e0300ec]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.upgrade-btn__dot[data-v-7e0300ec]{background:#fff;border-radius:50%;flex-shrink:0;width:6px;height:6px;animation:1.6s ease-in-out infinite upgrade-pulse-7e0300ec;box-shadow:0 0 0 2px #ffffff59}.upgrade-btn__label[data-v-7e0300ec]{letter-spacing:.5px}.upgrade-btn__version[data-v-7e0300ec]{font-family:monospace;font-size:var(--font-size-xs);border-radius:var(--radius-md);background:#ffffff38;padding:1px 5px;font-weight:500;line-height:1.2}@keyframes upgrade-pulse-7e0300ec{0%,to{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.8)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.branch-wrapper[data-v-9548a76f]{align-items:center;gap:2px;display:inline-flex}.branch-btn[data-v-9548a76f]{border-radius:var(--radius-base);cursor:pointer;height:22px;color:var(--color-text);font-family:var(--font-mono,monospace);font-size:var(--font-size-sm);white-space:nowrap;transition:background var(--transition-fast);background:0 0;border:none;align-items:center;gap:4px;padding:0 6px;display:inline-flex}.branch-btn[data-v-9548a76f]:hover{background:var(--bg-hover)}.branch-btn[data-v-9548a76f]:active{background:var(--bg-active)}[data-v-9548a76f] .branch-btn-icon{flex-shrink:0;width:14px;height:14px}.branch-btn-name[data-v-9548a76f]{text-overflow:ellipsis;max-width:160px;overflow:hidden}.branch-btn-caret[data-v-9548a76f]{opacity:.6;font-size:var(--font-size-xs);align-items:center;display:flex}.branch-popover-inner[data-v-9548a76f]{flex-direction:column;gap:0;display:flex}.branch-search[data-v-9548a76f]{padding-bottom:8px}.branch-list[data-v-9548a76f]{max-height:240px;margin:0 -16px;padding:0 4px;overflow-y:auto}.branch-list[data-v-9548a76f]::-webkit-scrollbar{width:4px}.branch-list[data-v-9548a76f]::-webkit-scrollbar-thumb{background:var(--border-color,#8080804d);border-radius:var(--radius-xs)}.branch-item[data-v-9548a76f]{cursor:pointer;border-radius:var(--radius-base);height:28px;font-size:var(--font-size-mid);color:var(--color-text);transition:background var(--transition-fast);align-items:center;gap:6px;padding:0 12px;display:flex}.branch-item[data-v-9548a76f]:hover{background:var(--bg-hover)}.branch-item.is-active[data-v-9548a76f]{color:var(--color-primary)}.branch-item-check[data-v-9548a76f]{font-size:var(--font-size-sm);color:var(--color-primary);flex-shrink:0}.branch-item-check-placeholder[data-v-9548a76f]{flex-shrink:0;width:12px;display:inline-block}[data-v-9548a76f] .branch-item-icon{opacity:.7;flex-shrink:0;width:13px;height:13px}.branch-item-name[data-v-9548a76f]{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.branch-empty[data-v-9548a76f]{text-align:center;color:var(--color-text-secondary,#888);font-size:var(--font-size-sm);padding:12px}.branch-popover-footer[data-v-9548a76f]{margin-top:4px;padding-top:6px}.branch-create-btn[data-v-9548a76f]{border-radius:var(--radius-base);cursor:pointer;width:100%;height:28px;color:var(--color-text);font-size:var(--font-size-mid);text-align:left;transition:background var(--transition-fast);background:0 0;border:none;align-items:center;gap:6px;padding:0 12px;display:flex}.branch-create-btn[data-v-9548a76f]:hover{background:var(--bg-hover)}.branch-info[data-v-9548a76f]{align-items:center;display:flex}.create-branch-content[data-v-9548a76f]{padding:var(--spacing-base) 0}.is-loading[data-v-9548a76f]{animation:2s linear infinite rotating-9548a76f}@keyframes rotating-9548a76f{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.branch-popover{border-radius:4px!important;padding:12px 16px!important;box-shadow:0 4px 16px #0000002e!important}.create-branch-dialog .modern-select .el-select__wrapper{border-radius:var(--radius-lg);border:1px solid var(--border-input);box-shadow:var(--shadow-sm);transition:var(--transition-ui-base);padding:10px var(--spacing-md);background:var(--bg-container)}.create-branch-dialog .modern-select .el-select__wrapper:hover{border-color:var(--color-gray-300);box-shadow:var(--shadow-md)}.create-branch-dialog .modern-select.is-focus .el-select__wrapper{border-color:#3498db;box-shadow:0 0 0 2px #3498db1a,0 2px 6px #00000014}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$ as e,Bt as t,Cn as n,Dn as r,En as i,F as a,K as o,Kr as s,Lt as c,Mn as l,Nr as u,P as d,Pn as f,Qr as p,Rn as m,Tn as h,U as g,V as _,W as v,Yn as y,Zn as b,_ as x,_n as S,dr as C,jt as w,ln as T,or as E,vr as D,wn as O,yn as k}from"./element-plus-D7LDHcAn.js";import{n as A,t as j}from"./_plugin-vue_export-helper-BLGowG5t.js";import{t as M}from"./SvgIcon-Bkc_oGUI.js";import{t as N}from"./IconButton-BEiZI4F6.js";import{r as P}from"./gitStore-BGbEYd0U.js";import{t as F}from"./CommonDialog-CecgvEzd.js";m(),C();var I=f({__name:`BranchSelector`,emits:[`branchChanged`],setup(r,{expose:i,emit:a}){i();let o=P(),s=a,l=D(!1),u=D(``),d=n(()=>{let e=u.value.trim().toLowerCase();return e?o.allBranches.filter(t=>t.toLowerCase().includes(e)):o.allBranches});async function f(e){if(e===o.currentBranch){l.value=!1;return}l.value=!1,await o.changeBranch(e)&&(s(`branchChanged`),o.refreshLog())}let p=D(!1),m=D(``),h=D(``);function g(){l.value=!1,h.value=o.currentBranch,p.value=!0}async function _(){await o.createBranch(m.value,h.value)&&(p.value=!1,m.value=``,s(`branchChanged`))}let v=D(!1);async function y(){if(!v.value){v.value=!0;try{await Promise.all([o.getCurrentBranch(!0),o.getBranchStatus(!0),o.getAllBranches()]),s(`branchChanged`),o.refreshLog()}finally{v.value=!1}}}let b={gitStore:o,emit:s,branchPopoverVisible:l,branchFilter:u,filteredBranches:d,selectBranch:f,createBranchDialogVisible:p,newBranchName:m,selectedBaseBranch:h,openCreateBranchDialog:g,createNewBranch:_,isRefreshingBranch:v,refreshCurrentBranch:y,get $t(){return A},get Plus(){return c},get Menu(){return w},get Check(){return e},get Refresh(){return t},CommonDialog:F,IconButton:N,SvgIcon:M};return Object.defineProperty(b,"__isScriptSetup",{enumerable:!1,value:!0}),b}});m(),u(),T();var L={key:0,class:`branch-info`},R={class:`branch-wrapper`},z={class:`branch-btn`},B={class:`branch-btn-name`},V={class:`branch-btn-caret`},H={class:`branch-popover-inner`},U={class:`branch-search`},W={class:`branch-list`},G=[`onClick`],K={key:1,class:`branch-item-check-placeholder`},q={class:`branch-item-name`},J={key:0,class:`branch-empty`},Y={class:`branch-popover-footer`},X={class:`create-branch-content`},Z={class:`form-label`},Q={class:`form-label`},$={class:`dialog-footer`},ee={class:`footer-actions`},te=[`disabled`];function ne(e,t,n,c,u,f){let m=o,C=_,w=x,T=v,D=d,A=a,j=g;return c.gitStore.currentBranch?(y(),r(`div`,L,[O(`div`,R,[i(` VSCode 风格分支按钮 + 弹出列表 `),l(w,{visible:c.branchPopoverVisible,"onUpdate:visible":t[1]||=e=>c.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:t[2]||=e=>c.branchFilter=``},{reference:E(()=>[O(`button`,z,[l(c.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),O(`span`,B,p(c.gitStore.currentBranch),1),O(`span`,V,[l(m,null,{default:E(()=>[...t[7]||=[O(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[O(`path`,{fill:`currentColor`,d:`M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.776a29.12 29.12 0 0 0 0-41.6 30.592 30.592 0 0 0-42.752 0z`})],-1)]]),_:1})])])]),default:E(()=>[O(`div`,H,[i(` 搜索框 `),O(`div`,U,[l(C,{modelValue:c.branchFilter,"onUpdate:modelValue":t[0]||=e=>c.branchFilter=e,placeholder:c.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),i(` 分支列表 `),O(`div`,W,[(y(!0),r(k,null,b(c.filteredBranches,e=>(y(),r(`div`,{key:e,class:s([`branch-item`,{"is-active":e===c.gitStore.currentBranch}]),onClick:t=>c.selectBranch(e)},[e===c.gitStore.currentBranch?(y(),h(m,{key:0,class:`branch-item-check`},{default:E(()=>[l(c.Check)]),_:1})):(y(),r(`span`,K)),l(c.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),O(`span`,q,p(e),1)],10,G))),128)),c.filteredBranches.length===0?(y(),r(`div`,J,p(c.$t(`@F13B4:没有匹配的分支`)),1)):i(`v-if`,!0)]),i(` 底部:创建新分支 `),O(`div`,Y,[O(`button`,{class:`branch-create-btn`,onClick:c.openCreateBranchDialog},[l(m,null,{default:E(()=>[l(c.Plus)]),_:1}),O(`span`,null,p(c.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),i(` 刷新按钮 `),l(c.IconButton,{tooltip:c.$t(`@CMDCON:刷新`),onClick:c.refreshCurrentBranch},{default:E(()=>[l(m,{class:s({"is-loading":c.isRefreshingBranch})},{default:E(()=>[l(c.Refresh)]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),i(` 创建分支对话框 `),l(c.CommonDialog,{modelValue:c.createBranchDialogVisible,"onUpdate:modelValue":t[6]||=e=>c.createBranchDialogVisible=e,title:c.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:E(()=>[O(`div`,$,[O(`div`,ee,[O(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:t[5]||=e=>c.createBranchDialogVisible=!1},p(c.$t(`@F13B4:取消`)),1),O(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:c.createNewBranch,disabled:c.gitStore.isCreatingBranch},[c.gitStore.isCreatingBranch?(y(),h(m,{key:1,class:`is-loading`},{default:E(()=>[...t[8]||=[O(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[O(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z`})],-1)]]),_:1})):(y(),h(m,{key:0},{default:E(()=>[l(c.Check)]),_:1})),O(`span`,null,p(c.$t(`@F13B4:创建`)),1)],8,te)])])]),default:E(()=>[O(`div`,X,[l(j,{model:{newBranchName:c.newBranchName,selectedBaseBranch:c.selectedBaseBranch},"label-position":`top`},{default:E(()=>[l(T,null,{label:E(()=>[O(`div`,Z,[l(m,{class:`label-icon`},{default:E(()=>[l(c.Plus)]),_:1}),O(`span`,null,p(c.$t(`@F13B4:新分支名称`)),1)])]),default:E(()=>[l(C,{modelValue:c.newBranchName,"onUpdate:modelValue":t[3]||=e=>c.newBranchName=e,placeholder:c.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:S(c.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),l(T,null,{label:E(()=>[O(`div`,Q,[l(m,{class:`label-icon`},{default:E(()=>[l(c.Menu)]),_:1}),O(`span`,null,p(c.$t(`@F13B4:基于分支`)),1)])]),default:E(()=>[l(A,{modelValue:c.selectedBaseBranch,"onUpdate:modelValue":t[4]||=e=>c.selectedBaseBranch=e,placeholder:c.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:E(()=>[(y(!0),r(k,null,b(c.gitStore.allBranches,e=>(y(),h(D,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):i(`v-if`,!0)}var re=j(I,[[`render`,ne],[`__scopeId`,`data-v-9548a76f`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{re as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.stage-button.from-drawer[data-v-d99cab92]{padding:6px var(--spacing-md);font-size:var(--font-size-sm);height:32px}.stage-button.from-status[data-v-d99cab92]{padding:var(--spacing-base);font-size:var(--font-size-sm);height:36px}.stage-button.from-form[data-v-d99cab92]{font-size:var(--font-size-mid);height:32px}.stage-button.is-selective[data-v-d99cab92]{box-shadow:0 0 0 2px var(--tint-primary-35)}.commit-button.from-drawer[data-v-100f6d49]{padding:6px var(--spacing-md);font-size:var(--font-size-sm);height:32px}.commit-button.from-status[data-v-100f6d49]{padding:var(--spacing-base);font-size:var(--font-size-sm);height:36px}.commit-button.from-form[data-v-100f6d49]{font-size:var(--font-size-mid);height:32px}.commit-button.is-committing[data-v-100f6d49]{min-width:96px;transition:min-width var(--transition-base) var(--ease-custom)}[data-v-0e0be0c3] .el-overlay-dialog{will-change:auto!important}[data-v-0e0be0c3] .el-dialog{overflow:hidden;will-change:auto!important;border-radius:12px!important}.push-progress-dialog[data-v-0e0be0c3] .el-dialog__header{padding:var(--spacing-lg) var(--spacing-xl)}.push-progress-dialog[data-v-0e0be0c3] .el-dialog__title{font-size:var(--font-size-md);letter-spacing:.5px;font-weight:600}.status-progress[data-v-0e0be0c3] .el-dialog__title{color:var(--color-primary)}.status-success[data-v-0e0be0c3] .el-dialog__title{color:var(--color-success)}.status-error[data-v-0e0be0c3] .el-dialog__title{color:var(--color-danger)}.push-progress-container[data-v-0e0be0c3]{gap:var(--spacing-lg);padding:var(--spacing-md);flex-direction:column;display:flex}.push-progress-container[data-v-0e0be0c3] *{will-change:auto}@keyframes success-pulse-0e0be0c3{0%,to{transform:scale(1)}50%{transform:scale(1.05)}}@keyframes loading-pulse-0e0be0c3{0%,to{box-shadow:0 0 0 0 var(--tint-primary-16)}50%{box-shadow:0 0 0 6px #409eff00}}@keyframes border-light-run-0e0be0c3{0%{width:60px;height:2px;top:0;left:0}24.99%{width:60px;height:2px;top:0;left:100%}25%{width:2px;height:60px;top:0;left:100%}49.99%{width:2px;height:60px;top:100%;left:100%}50%{width:60px;height:2px;top:100%;left:100%}74.99%{width:60px;height:2px;top:100%;left:0}75%{width:2px;height:60px;top:100%;left:0}99.99%{width:2px;height:60px;top:0;left:0}to{width:60px;height:2px;top:0;left:0}}.pulling-section[data-v-0e0be0c3]{align-items:center;gap:var(--spacing-lg);padding:var(--spacing-xl) var(--spacing-xl);border-radius:var(--radius-md);background:#409eff0a;border:1px solid #409eff2e;display:flex;position:relative;overflow:hidden}.pulling-section[data-v-0e0be0c3]:before{content:"";width:60px;height:2px;box-shadow:0 0 10px var(--tint-primary-50);background:linear-gradient(90deg,#0000 0%,#409eff66 30%,#409effe6 50%,#409eff66 70%,#0000 100%);animation:2.5s linear infinite border-light-run-0e0be0c3;position:absolute;top:0;left:0}.pulling-icon-wrap[data-v-0e0be0c3]{flex-shrink:0;width:44px;height:44px}.pulling-spinner[data-v-0e0be0c3]{width:44px;height:44px;animation:1.4s linear infinite pulling-rotate-0e0be0c3}.pulling-spinner .pulling-spinner-track[data-v-0e0be0c3]{stroke:var(--tint-primary-16)}.pulling-spinner .pulling-spinner-arc[data-v-0e0be0c3]{stroke:#409effe6;stroke-linecap:round;stroke-dasharray:80 126;animation:1.4s ease-in-out infinite pulling-dash-0e0be0c3}.pulling-text-wrap[data-v-0e0be0c3]{flex-direction:column;gap:4px;display:flex}.pulling-title[data-v-0e0be0c3]{font-size:var(--font-size-sm);color:#409efff2;letter-spacing:.3px;font-weight:600}.pulling-sub[data-v-0e0be0c3]{font-size:var(--font-size-sm);color:#ffffff59}@keyframes pulling-rotate-0e0be0c3{to{transform:rotate(360deg)}}@keyframes pulling-dash-0e0be0c3{0%{stroke-dasharray:1 126;stroke-dashoffset:0}50%{stroke-dasharray:90 126;stroke-dashoffset:-35px}to{stroke-dasharray:90 126;stroke-dashoffset:-124px}}.stages-section[data-v-0e0be0c3]{gap:var(--spacing-md);padding:var(--spacing-md);border-radius:var(--radius-md);transition:var(--transition-ui-slow);background:0 0;border:1px solid #ffffff0d;grid-template-columns:repeat(2,1fr);display:grid;position:relative;overflow:hidden}.stages-section.is-loading[data-v-0e0be0c3]{border-color:var(--tint-primary-16)}.stages-section.is-loading[data-v-0e0be0c3]:before{content:"";width:60px;height:2px;box-shadow:0 0 10px var(--tint-primary-50);background:linear-gradient(90deg,#0000 0%,#409eff66 30%,#409effcc 50%,#409eff66 70%,#0000 100%);animation:4s linear infinite border-light-run-0e0be0c3;position:absolute;top:0;left:0}.stages-section.is-success[data-v-0e0be0c3]{border-color:#67c23a33}[data-theme=dark] .stages-section[data-v-0e0be0c3]{opacity:.8}.stage-item[data-v-0e0be0c3]{gap:var(--spacing-base);padding:10px var(--spacing-md);border-radius:var(--radius-lg);transition:var(--transition-ui-slow);background:#ffffff08;border:1px solid #ffffff14;flex-direction:column;display:flex;position:relative}.stage-item.active[data-v-0e0be0c3]{background:var(--tint-primary-06);border-color:var(--tint-primary-16);transform:scale(1.01)}.stage-item.finished[data-v-0e0be0c3]{background:#67c23a0d;border-color:#67c23a26}.stage-item.error[data-v-0e0be0c3]{background:#f56c6c0d;border-color:#f56c6c26}.stage-header[data-v-0e0be0c3]{align-items:center;gap:10px;display:flex}.stage-icon[data-v-0e0be0c3]{width:24px;height:24px;transition:var(--transition-ui-slow);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-weight:600;display:flex}.stage-icon .icon-finish[data-v-0e0be0c3]{color:var(--color-success);font-size:var(--font-size-md)}.stage-icon .icon-error[data-v-0e0be0c3]{color:var(--color-danger);font-size:var(--font-size-md)}.stage-icon .icon-process[data-v-0e0be0c3]{color:var(--color-primary);font-size:var(--font-size-md);animation:1s linear infinite rotate-0e0be0c3}.stage-icon .icon-wait[data-v-0e0be0c3]{color:gray;font-size:var(--font-size-md);animation:2s linear infinite rotate-0e0be0c3}@keyframes rotate-0e0be0c3{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.stage-info[data-v-0e0be0c3]{flex:1;justify-content:space-between;align-items:center;display:flex}.stage-label[data-v-0e0be0c3]{color:var(--text-primary);letter-spacing:.2px;font-weight:500}.stage-percent[data-v-0e0be0c3]{font-size:var(--font-size-sm);color:var(--color-primary);text-align:right;letter-spacing:.5px;min-width:42px;font-family:Consolas,Monaco,monospace;font-weight:700}.finished .stage-percent[data-v-0e0be0c3]{color:var(--color-success)}.stage-progress[data-v-0e0be0c3]{padding-left:34px}.stage-progress[data-v-0e0be0c3] .el-progress-bar__outer{background-color:#00000014}.stage-progress[data-v-0e0be0c3] .el-progress-bar__inner{background:linear-gradient(90deg, var(--color-primary), var(--color-primary-light));transition:var(--transition-ui-slow)}.finished .stage-progress[data-v-0e0be0c3] .el-progress-bar__inner{background:linear-gradient(90deg, var(--color-success), var(--color-success))}.error-section[data-v-0e0be0c3]{border-radius:var(--radius-lg);padding:var(--spacing-lg);gap:var(--spacing-base);background:#fef0f0;border:1px solid #fde2e2;flex-direction:column;display:flex}.error-header[data-v-0e0be0c3]{justify-content:space-between;align-items:center;display:flex}.error-title[data-v-0e0be0c3]{color:var(--color-danger);font-weight:600}.pull-button[data-v-0e0be0c3]{align-items:center;gap:4px;display:flex}.error-content[data-v-0e0be0c3]{color:#c45656;font-size:var(--font-size-mid);word-break:break-word;padding:var(--spacing-sm);border-radius:var(--radius-base);background:#00000008;line-height:1.6}.error-suggestion[data-v-0e0be0c3]{font-size:var(--font-size-sm);color:var(--color-primary);margin-top:4px;font-weight:500}.messages-section[data-v-0e0be0c3]{gap:var(--spacing-base);flex-direction:column;display:flex}.messages-title[data-v-0e0be0c3]{color:var(--text-secondary);font-weight:600;font-size:var(--font-size-sm);letter-spacing:.3px;opacity:.85}.progress-messages[data-v-0e0be0c3]{border-radius:var(--radius-lg);max-height:160px;padding:10px var(--spacing-md);font-family:Consolas,Monaco,Courier New,monospace;font-size:var(--font-size-xs);background:#0000004d;border:1px solid #ffffff0d;line-height:1.5;overflow-y:auto;box-shadow:inset 0 2px 4px #0003}.progress-messages[data-v-0e0be0c3]::-webkit-scrollbar{width:5px}.progress-messages[data-v-0e0be0c3]::-webkit-scrollbar-track{border-radius:var(--radius-base);background:#0000001a}.progress-messages[data-v-0e0be0c3]::-webkit-scrollbar-thumb{border-radius:var(--radius-base);background:#fff3}.progress-messages[data-v-0e0be0c3]::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.message-item[data-v-0e0be0c3]{color:#ffffffd9;padding:var(--spacing-xs) 0;white-space:nowrap;text-overflow:ellipsis;opacity:.9;transition:opacity var(--transition-base) ease;overflow:hidden}.message-item[data-v-0e0be0c3]:hover{opacity:1}.message-item[data-v-0e0be0c3]:not(:last-child){margin-bottom:3px}[data-theme=dark] .error-section[data-v-0e0be0c3]{background:#f56c6c1a;border-color:#f56c6c4d}[data-theme=dark] .error-content[data-v-0e0be0c3]{color:#f89898}:root:not([data-theme=dark]) .progress-messages[data-v-0e0be0c3]{background:#0000000f;border:1px solid #00000014;box-shadow:inset 0 1px 3px #00000014}:root:not([data-theme=dark]) .message-item[data-v-0e0be0c3]{color:#000000bf}:root:not([data-theme=dark]) .message-item[data-v-0e0be0c3]:hover{color:#000000e6}:root:not([data-theme=dark]) .messages-title[data-v-0e0be0c3]{color:#000000a6}:root:not([data-theme=dark]) .progress-messages[data-v-0e0be0c3]::-webkit-scrollbar-track{background:#0000000d}:root:not([data-theme=dark]) .progress-messages[data-v-0e0be0c3]::-webkit-scrollbar-thumb{background:#0003}:root:not([data-theme=dark]) .progress-messages[data-v-0e0be0c3]::-webkit-scrollbar-thumb:hover{background:#0000004d}.push-button-group[data-v-bcb696bd]{align-items:center;gap:4px;display:inline-flex}.push-remote-item[data-v-bcb696bd]{align-items:center;gap:6px;display:inline-flex}.push-button.from-drawer[data-v-bcb696bd]{padding:6px var(--spacing-md);font-size:var(--font-size-sm);height:32px}.push-button.from-status[data-v-bcb696bd]{padding:var(--spacing-base);font-size:var(--font-size-sm);height:36px}.push-button.from-form[data-v-bcb696bd]{font-size:var(--font-size-mid);height:32px}.push-button__caret.from-drawer[data-v-bcb696bd],.push-button__caret.from-form[data-v-bcb696bd]{height:32px;padding:0 6px}.push-button__caret.from-status[data-v-bcb696bd]{height:36px;padding:0 6px}.push-button__caret[data-v-bcb696bd] .el-icon{font-size:var(--font-size-sm)}.one-push-button[data-v-1a7fa402]{height:100%;background:var(--color-primary-dark)!important;border:1px solid var(--color-primary-dark)!important;color:#fff!important}.one-push-button[data-v-1a7fa402]:hover:not(.is-disabled){background:color-mix(in srgb, var(--color-primary-dark) 88%, #000)!important;border-color:color-mix(in srgb, var(--color-primary-dark) 88%, #000)!important}.one-push-button .one-push-icon[data-v-1a7fa402],.one-push-button .one-push-title[data-v-1a7fa402],.one-push-button .one-push-desc[data-v-1a7fa402]{color:#fff}.one-push-button.form[data-v-1a7fa402]{width:100%;padding:4px 12px}.one-push-button.drawer[data-v-1a7fa402]{width:auto;height:32px}.one-push-button .one-push-content[data-v-1a7fa402]{align-items:center;gap:6px;display:flex}.one-push-button .one-push-content .one-push-icon[data-v-1a7fa402]{font-size:var(--font-size-base)}.one-push-button .one-push-content .one-push-text[data-v-1a7fa402]{flex-direction:column;align-items:flex-start;gap:2px;display:flex}.one-push-button .one-push-content .one-push-text .one-push-title[data-v-1a7fa402]{font-size:var(--font-size-mid)}.one-push-button .one-push-content .one-push-text .one-push-desc[data-v-1a7fa402]{font-size:var(--font-size-xs);opacity:.9;letter-spacing:.1px;font-weight:400}.create-tag-button[data-v-fd2d5a18]{display:inline-block}.tag-dialog-content[data-v-fd2d5a18]{gap:var(--spacing-base);flex-direction:column;display:flex}.tag-info-card[data-v-fd2d5a18]{align-items:flex-start;gap:var(--spacing-base);padding:var(--spacing-base);border-radius:var(--radius-xl);background:linear-gradient(135deg,#f0fdf4 0%,#dcfce7 100%);border:1px solid #86efac;display:flex;position:relative;overflow:hidden}.tag-info-card[data-v-fd2d5a18]:before{content:"";background:linear-gradient(90deg, var(--action-green) 0%, var(--action-green-dark) 100%);height:3px;position:absolute;top:0;left:0;right:0}.tag-info-card .info-icon[data-v-fd2d5a18]{background:linear-gradient(135deg, var(--action-green) 0%, var(--action-green-dark) 100%);border-radius:var(--radius-md);color:#fff;width:40px;height:40px;font-size:var(--font-size-lg);box-shadow:var(--shadow-md);flex-shrink:0;justify-content:center;align-items:center;display:flex}.tag-info-card .info-content[data-v-fd2d5a18]{flex:1}.tag-info-card .info-content h4[data-v-fd2d5a18]{font-size:var(--font-size-md);color:#14532d;margin:0 0 6px;font-weight:600;line-height:1.2}.tag-info-card .info-content p[data-v-fd2d5a18]{color:#166534;margin:0;line-height:1.4}.tag-form[data-v-fd2d5a18]{gap:var(--spacing-base);flex-direction:column;display:flex}.tag-form[data-v-fd2d5a18] .el-form-item{margin-bottom:0}.tag-form[data-v-fd2d5a18] .el-form-item__label{color:var(--color-text-title);margin-bottom:var(--spacing-base);font-weight:600}.tag-form[data-v-fd2d5a18] .el-input .el-input__inner{border-radius:var(--radius-lg);border:2px solid var(--color-gray-200);transition:var(--transition-ui-slow)}.tag-form[data-v-fd2d5a18] .el-input .el-input__inner:hover{border-color:var(--color-gray-300)}.tag-form[data-v-fd2d5a18] .el-input .el-input__inner:focus-visible{border-color:var(--action-green);box-shadow:0 0 0 3px #22c55e1a}.tag-form[data-v-fd2d5a18] .el-textarea .el-textarea__inner{border-radius:var(--radius-lg);border:2px solid var(--color-gray-200);transition:var(--transition-ui-slow);line-height:1.5}.tag-form[data-v-fd2d5a18] .el-textarea .el-textarea__inner:hover{border-color:var(--color-gray-300)}.tag-form[data-v-fd2d5a18] .el-textarea .el-textarea__inner:focus-visible{border-color:var(--action-green);box-shadow:0 0 0 3px #22c55e1a}.tag-form[data-v-fd2d5a18] .el-radio-group{width:100%}.tag-form[data-v-fd2d5a18] .el-radio-group .el-radio-button{flex:1}.tag-form[data-v-fd2d5a18] .el-radio-group .el-radio-button .el-radio-button__inner{border-radius:var(--radius-lg);width:100%;transition:var(--transition-ui-slow)}.form-tip[data-v-fd2d5a18]{margin-top:var(--spacing-base);font-size:var(--font-size-sm);color:var(--color-gray-500);align-items:flex-start;gap:6px;line-height:1.4;display:flex}.form-tip .el-icon[data-v-fd2d5a18]{color:var(--color-gray-400);flex-shrink:0;margin-top:1px}.commit-prefix[data-v-fd2d5a18]{font-size:var(--font-size-sm);color:var(--color-gray-500);font-family:monospace}[data-v-fd2d5a18] .tag-dialog .common-dialog__footer .el-button{border-radius:var(--radius-lg);transition:var(--transition-ui-slow);font-weight:500}[data-v-fd2d5a18] .tag-dialog .common-dialog__footer .el-button:hover{transform:scale(1.02)}[data-v-fd2d5a18] .tag-dialog .common-dialog__footer .el-button:active{transform:scale(.98)}[data-v-fd2d5a18] .tag-dialog .common-dialog__footer .el-button:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.tag-list-button[data-v-8d9468ec]{display:inline-block}.tag-list-content[data-v-8d9468ec]{min-height:400px;padding:0}[data-v-8d9468ec] .tag-list-dialog .common-dialog__header{background:var(--action-green);color:#fff;padding:var(--spacing-xl) var(--spacing-2xl);border-radius:var(--radius-lg) var(--radius-lg) 0 0;margin:0}[data-v-8d9468ec] .tag-list-dialog .common-dialog__title{font-size:var(--font-size-lg);color:#fff;font-weight:600}[data-v-8d9468ec] .tag-list-dialog .common-dialog__close{color:#fff;font-size:var(--font-size-lg)}[data-v-8d9468ec] .tag-list-dialog .common-dialog__close:hover{color:var(--border-card)}.tag-header[data-v-8d9468ec]{margin-bottom:var(--spacing-base);padding:var(--spacing-base);background:linear-gradient(135deg, var(--color-white) 0%, var(--color-gray-soft) 100%);border-radius:var(--radius-lg);border:1px solid var(--border-component);box-shadow:var(--shadow-md);justify-content:space-between;align-items:center;display:flex}.tag-stats[data-v-8d9468ec]{align-items:center;gap:var(--spacing-base);display:flex}.stat-item[data-v-8d9468ec]{align-items:center;gap:var(--spacing-base);padding:var(--spacing-xs) var(--spacing-base);background:var(--action-green);border-radius:var(--radius-lg);color:#fff;display:flex}.stat-icon[data-v-8d9468ec]{font-size:var(--font-size-md)}.stat-number[data-v-8d9468ec]{font-size:var(--font-size-lg);font-weight:600}.stat-label[data-v-8d9468ec]{opacity:.9}.tag-actions-header[data-v-8d9468ec]{gap:var(--spacing-base);display:flex}.refresh-btn[data-v-8d9468ec],.push-all-btn[data-v-8d9468ec]{border-radius:var(--radius-lg);padding:var(--spacing-xs) var(--spacing-base);transition:var(--transition-ui-slow);font-weight:500}.refresh-btn[data-v-8d9468ec]:hover,.push-all-btn[data-v-8d9468ec]:hover{transform:scale(1.02)}.refresh-btn[data-v-8d9468ec]:active,.push-all-btn[data-v-8d9468ec]:active{transform:scale(.98)}.refresh-btn[data-v-8d9468ec]:focus-visible,.push-all-btn[data-v-8d9468ec]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.tag-list-container[data-v-8d9468ec]{min-height:300px}.tag-cards[data-v-8d9468ec]{gap:var(--spacing-base);flex-direction:column;display:flex}.tag-card[data-v-8d9468ec]{background:var(--bg-container);border-radius:var(--radius-lg);border:1px solid var(--border-component);box-shadow:var(--shadow-md);transition:var(--transition-ui-slow);overflow:hidden}.tag-card[data-v-8d9468ec]:hover{border-color:var(--action-green);transform:scale(1.02)}.tag-card[data-v-8d9468ec]:active{transform:scale(.98)}.tag-card[data-v-8d9468ec]:focus-visible{outline:2px solid var(--action-green);outline-offset:2px}.tag-card-content[data-v-8d9468ec]{padding:var(--spacing-base);align-items:center;gap:var(--spacing-base);display:flex}.tag-info[data-v-8d9468ec]{gap:var(--spacing-sm);flex-direction:column;flex:1;min-width:0;display:flex}.tag-main-info[data-v-8d9468ec]{flex-direction:column;gap:6px;display:flex}.tag-name-badge[data-v-8d9468ec]{align-items:center;gap:var(--spacing-base);flex-shrink:0;display:flex}.badge-icon[data-v-8d9468ec]{color:var(--action-green)}.tag-name-text[data-v-8d9468ec]{color:var(--color-text);font-family:Consolas,Monaco,Courier New,monospace;font-weight:600}.type-tag[data-v-8d9468ec]{margin-left:var(--spacing-sm)}.tag-meta[data-v-8d9468ec]{align-items:center;gap:var(--spacing-md);font-size:var(--font-size-sm);color:var(--text-secondary);display:flex}.tag-commit[data-v-8d9468ec]{align-items:center;gap:var(--spacing-sm);background:var(--bg-panel);padding:var(--spacing-xs) 6px;border-radius:var(--radius-base);font-family:monospace;display:flex}.tag-date[data-v-8d9468ec]{color:var(--text-tertiary)}.tag-message[data-v-8d9468ec]{font-size:var(--font-size-sm);color:var(--text-secondary);padding:6px var(--spacing-base);background:var(--bg-panel);border-radius:var(--radius-md);border-left:3px solid var(--action-green);line-height:1.4}.tag-card-actions[data-v-8d9468ec]{flex-shrink:0;align-items:center;gap:6px;display:none}.tag-card:hover .tag-card-actions[data-v-8d9468ec]{display:flex}.action-btn[data-v-8d9468ec]{border-radius:var(--radius-md);transition:var(--transition-ui-slow);min-width:60px;padding:6px var(--spacing-md);font-weight:500;font-size:var(--font-size-sm)}.action-btn[data-v-8d9468ec]:hover{transform:scale(1.02)}.action-btn[data-v-8d9468ec]:active{transform:scale(.98)}.action-btn[data-v-8d9468ec]:focus-visible{outline:2px solid var(--action-green);outline-offset:2px}.view-btn[data-v-8d9468ec]:hover,.push-btn[data-v-8d9468ec]:hover,.delete-btn[data-v-8d9468ec]:hover{box-shadow:var(--shadow-md)}.tag-detail-content[data-v-8d9468ec]{gap:var(--spacing-md);flex-direction:column;display:flex}.detail-row[data-v-8d9468ec]{align-items:center;gap:var(--spacing-md);background:var(--bg-panel);border-radius:var(--radius-lg);padding:10px;display:flex}.detail-row.detail-message[data-v-8d9468ec]{flex-direction:column;align-items:flex-start}.detail-label[data-v-8d9468ec]{font-size:var(--font-size-sm);color:var(--text-secondary);white-space:nowrap;min-width:80px;font-weight:600}.detail-value[data-v-8d9468ec]{color:var(--color-text)}.detail-value[data-v-8d9468ec]:is(code){background:var(--border-component);padding:var(--spacing-xs) var(--spacing-base);border-radius:var(--radius-base);border:1px solid var(--border-component);font-family:monospace}.message-content[data-v-8d9468ec]{width:100%;padding:var(--spacing-base);border-radius:var(--radius-md);border:1px solid var(--border-card);white-space:pre-wrap;word-break:break-word;background:#fff;line-height:1.6}.git-operations-button[data-v-3357e454]{display:inline-block}.action-groups[data-v-3357e454]{flex-direction:column;gap:16px;display:flex}.action-group[data-v-3357e454]{background:var(--bg-container);border-radius:var(--radius-lg);border:1px solid var(--border-component);padding:16px}.group-title[data-v-3357e454]{font-size:var(--font-size-base);color:var(--text-primary);margin-bottom:10px;padding-bottom:6px;font-weight:600}.group-buttons[data-v-3357e454]{flex-direction:column;gap:10px;display:flex}.group-buttons[data-v-3357e454] .el-button{justify-content:center;align-items:center;width:100%;height:40px;display:flex}.pull-error-content[data-v-3357e454]{flex-direction:column;gap:16px;display:flex}.pull-error-type[data-v-3357e454]{border-radius:var(--radius-lg);font-size:var(--font-size-mid);align-items:flex-start;gap:10px;padding:12px 14px;line-height:1.6;display:flex}.pull-error-type.is-warning[data-v-3357e454]{color:var(--color-warning-dark);background:#faad141a;border:1px solid #faad1466}.pull-error-type.is-error[data-v-3357e454]{color:var(--action-coral);background:#f56c6c14;border:1px solid #f56c6c59}.pull-error-icon[data-v-3357e454]{font-size:var(--font-size-md);flex-shrink:0;margin-top:2px}.pull-error-detail[data-v-3357e454]{flex-direction:column;gap:6px;display:flex}.pull-error-label[data-v-3357e454]{font-size:var(--font-size-mid);color:var(--text-primary);font-weight:600}.pull-error-pre[data-v-3357e454]{border-radius:var(--radius-lg);font-family:Consolas,Monaco,Courier New,monospace;font-size:var(--font-size-sm);color:var(--text-primary);white-space:pre-wrap;word-break:break-all;background:#0000000f;border:1px solid #0000001a;max-height:300px;margin:0;padding:12px 14px;line-height:1.6;overflow-y:auto}.global-loading-overlay[data-v-77e24a5f]{z-index:9999;background:#fff0;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.loading-container[data-v-77e24a5f]{justify-content:center;align-items:center;gap:var(--spacing-md);border-radius:var(--radius-xl);-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background:linear-gradient(135deg,#409effe6 0%,#67c23ae6 100%);flex-direction:column;width:240px;padding:28px 32px;display:flex;overflow:hidden;box-shadow:0 8px 32px #0000004d;height:auto!important}.loading-spinner[data-v-77e24a5f]{width:64px;height:64px;position:relative}.spinner-ring[data-v-77e24a5f]{border:4px solid #0000;border-radius:50%;width:100%;height:100%;position:absolute;top:0;left:0}.spinner-ring[data-v-77e24a5f]:first-child{border-top:4px solid #ffffffe6;animation:2s linear infinite spin-77e24a5f}.spinner-ring[data-v-77e24a5f]:nth-child(2){border-right:4px solid #fff9;width:90%;height:90%;animation:3s linear infinite reverse spin-77e24a5f;top:5%;left:5%}.spinner-ring[data-v-77e24a5f]:nth-child(3){border-bottom:4px solid #ffffff4d;width:80%;height:80%;animation:4s linear infinite spin-77e24a5f;top:10%;left:10%}.loading-text[data-v-77e24a5f]{font-size:var(--font-size-lg);text-shadow:0 2px 8px #0000004d;letter-spacing:1px;text-align:center;color:var(--color-white);font-weight:600;animation:2s ease-in-out infinite pulse-text-77e24a5f}.loading-progress[data-v-77e24a5f]{border-radius:var(--radius-xs);background:#fff3;width:200px;height:4px;overflow:hidden}.progress-bar[data-v-77e24a5f]{background:linear-gradient(90deg, var(--bg-container) 0%, #fffc 100%);border-radius:var(--radius-xs);height:100%;transition:width var(--transition-slow) ease;box-shadow:0 0 10px #ffffff80}.progress-bar.is-mock[data-v-77e24a5f]{width:0%;animation:2.4s ease-in-out infinite mock-progress-77e24a5f}@keyframes spin-77e24a5f{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes pulse-text-77e24a5f{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.05)}}@keyframes mock-progress-77e24a5f{0%{width:0%}50%{width:70%}to{width:100%}}.loading-fade-enter-active[data-v-77e24a5f],.loading-fade-leave-active[data-v-77e24a5f]{transition:var(--transition-ui-slow)}.loading-fade-enter-from[data-v-77e24a5f],.loading-fade-leave-to[data-v-77e24a5f]{opacity:0}.loading-fade-enter-to[data-v-77e24a5f],.loading-fade-leave-from[data-v-77e24a5f]{opacity:1}.loading-fade-enter-active .loading-container[data-v-77e24a5f],.loading-fade-leave-active .loading-container[data-v-77e24a5f]{transition:var(--transition-ui-slow)}.loading-fade-enter-from .loading-container[data-v-77e24a5f],.loading-fade-leave-to .loading-container[data-v-77e24a5f]{opacity:0;-webkit-backdrop-filter:blur();backdrop-filter:blur();transform:scale(.8)}.loading-fade-enter-to .loading-container[data-v-77e24a5f],.loading-fade-leave-from .loading-container[data-v-77e24a5f]{opacity:1;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);transform:scale(1)}[data-theme=dark] .global-loading-overlay[data-v-77e24a5f]{background:#00000073}[data-theme=dark] .loading-container[data-v-77e24a5f]{background:linear-gradient(135deg,#161616e6 0%,#1c1c1ce6 100%);border:1px solid #ffffff14;box-shadow:0 12px 36px #0009}[data-theme=dark] .loading-text[data-v-77e24a5f]{color:#ffffffeb;text-shadow:0 2px 10px #0009}[data-theme=dark] .loading-progress[data-v-77e24a5f]{background:#ffffff1f}[data-theme=dark] .progress-bar[data-v-77e24a5f]{box-shadow:0 0 10px var(--tint-primary-45);background:linear-gradient(90deg,#409effd9 0%,#67c23ad9 100%)}.success-overlay[data-v-30ab4535]{background:var(--dialog-overlay);-webkit-backdrop-filter:blur(10px);padding:var(--spacing-2xl);z-index:9999;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.success-container[data-v-30ab4535]{background:var(--bg-container);border:1px solid var(--dialog-border-color);border-radius:var(--dialog-radius);width:min(92vw,420px);box-shadow:var(--dialog-shadow);text-align:center;flex-direction:column;align-items:center;gap:18px;padding:32px 30px 28px;display:flex}.success-icon[data-v-30ab4535]{background:color-mix(in srgb, var(--color-success) 10%, var(--bg-container) 90%);width:76px;height:76px;box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--color-success) 18%, transparent 82%);border-radius:999px;justify-content:center;align-items:center;display:inline-flex}.success-svg[data-v-30ab4535]{width:48px;height:48px}.success-circle[data-v-30ab4535]{stroke:var(--color-success);stroke-width:2px;stroke-miterlimit:10;stroke-dasharray:166;stroke-dashoffset:166px;fill:none;animation:success-circle-animation-30ab4535 .58s var(--ease-enter) forwards}.success-check[data-v-30ab4535]{stroke:var(--color-success);stroke-width:3px;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:48;stroke-dashoffset:48px;animation:success-check-animation-30ab4535 .24s var(--ease-enter) .5s forwards}.success-text[data-v-30ab4535]{max-width:18ch;font-size:clamp(20px,2vw,22px);font-weight:var(--font-weight-semibold);letter-spacing:var(--letter-spacing-heading);color:var(--text-title);margin:0;line-height:1.25}.success-description[data-v-30ab4535]{max-width:28ch;font-size:var(--font-size-base);color:var(--text-secondary);line-height:var(--line-height-relaxed);margin:0}@keyframes success-circle-animation-30ab4535{to{stroke-dashoffset:0}}@keyframes success-check-animation-30ab4535{to{stroke-dashoffset:0}}.success-fade-enter-active[data-v-30ab4535],.success-fade-leave-active[data-v-30ab4535]{transition:opacity var(--transition-base) cubic-bezier(.22, 1, .36, 1)}.success-fade-enter-from[data-v-30ab4535],.success-fade-leave-to[data-v-30ab4535]{opacity:0}.success-fade-enter-to[data-v-30ab4535],.success-fade-leave-from[data-v-30ab4535]{opacity:1}.success-fade-enter-active .success-container[data-v-30ab4535],.success-fade-leave-active .success-container[data-v-30ab4535]{transition:opacity var(--transition-base) cubic-bezier(.22, 1, .36, 1), transform var(--transition-base) cubic-bezier(.22, 1, .36, 1)}.success-fade-enter-from .success-container[data-v-30ab4535],.success-fade-leave-to .success-container[data-v-30ab4535]{opacity:0;transform:translateY(8px)scale(.985)}.success-fade-enter-to .success-container[data-v-30ab4535],.success-fade-leave-from .success-container[data-v-30ab4535]{opacity:1;transform:translateY(0)scale(1)}.one-commit-button[data-v-0c962829]{height:100%;background:linear-gradient(135deg, var(--color-primary-dark) 0%, color-mix(in srgb, var(--color-primary-dark) 78%, #000) 100%)!important;color:#fff!important;border:none!important}.one-commit-button .one-commit-icon[data-v-0c962829],.one-commit-button .one-commit-title[data-v-0c962829],.one-commit-button .one-commit-desc[data-v-0c962829]{color:#fff}.one-commit-button.form[data-v-0c962829]{width:100%;padding:4px 12px}.one-commit-button.drawer[data-v-0c962829]{width:auto;height:32px}.one-commit-button .one-commit-content[data-v-0c962829]{align-items:center;gap:6px;display:flex}.one-commit-button .one-commit-content .one-commit-icon[data-v-0c962829]{font-size:var(--font-size-base)}.one-commit-button .one-commit-content .one-commit-text[data-v-0c962829]{flex-direction:column;align-items:flex-start;gap:2px;display:flex}.one-commit-button .one-commit-content .one-commit-text .one-commit-title[data-v-0c962829]{font-size:var(--font-size-mid)}.one-commit-button .one-commit-content .one-commit-text .one-commit-desc[data-v-0c962829]{font-size:var(--font-size-xs);opacity:.9;letter-spacing:.1px;font-weight:400}[data-v-12b4dc63] .el-button+.el-button{margin-left:0}[data-v-12b4dc63] .el-button{border-radius:var(--radius-md);transition:var(--transition-ui-slow);font-weight:500;font-size:var(--font-size-sm);padding:6px 10px}[data-v-12b4dc63] .el-button:hover{box-shadow:var(--shadow-md);transform:scale(1.02)}[data-v-12b4dc63] .el-button:active{transform:scale(.98)}[data-v-12b4dc63] .el-button:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}[data-v-12b4dc63] .el-button.is-disabled{opacity:.4!important}[data-v-12b4dc63] .el-button--primary{background:var(--color-primary);color:#fff;border:none}[data-v-12b4dc63] .el-button--primary.is-disabled{background-color:var(--color-primary-light)!important;border-color:var(--color-primary-light)!important;opacity:.5!important}[data-v-12b4dc63] .el-button--warning{background:var(--color-warning);color:#fff;border:none}[data-v-12b4dc63] .el-button--warning.is-disabled{background-color:var(--color-warning)!important;border-color:var(--color-warning)!important;opacity:.5!important}[data-v-12b4dc63] .left-actions .el-button{background:var(--bg-container);border:1px solid var(--border-color-medium);color:var(--text-secondary);box-shadow:none}[data-v-12b4dc63] .left-actions .el-button:hover:not(.is-disabled){background:var(--soft-btn-bg-hover);border-color:var(--soft-btn-border-hover)}[data-v-12b4dc63] .left-actions .el-button--primary.is-disabled{background-color:var(--bg-container)!important;border-color:var(--border-color-medium)!important;color:var(--text-disabled)!important;opacity:.6!important}.actions-flex-container[data-v-12b4dc63]{justify-content:flex-start;align-items:center;gap:6px;display:flex}.left-actions[data-v-12b4dc63]{align-self:center;display:flex}.button-grid[data-v-12b4dc63]{gap:6px;display:flex}.right-actions[data-v-12b4dc63]{align-items:stretch;gap:6px;height:36px;margin-left:auto;display:flex}.command-history-button[data-v-7bd5b1e2]{width:36px;height:36px;padding:0}.history-scroll[data-v-7bd5b1e2]{flex-grow:1;overflow-y:auto}.dialog-content .modern-btn[data-v-7bd5b1e2]{color:#000c;background:#0000000d;border:1px solid #0000001a}.dialog-content .modern-btn[data-v-7bd5b1e2]:hover{color:#000;background:#00000014;border-color:#00000026}.enhanced-btn[data-v-7bd5b1e2]{min-width:60px;height:36px;padding:var(--spacing-base);border-radius:var(--radius-md);font-size:var(--font-size-sm);transition:var(--transition-ui-slow);gap:6px;font-weight:500;position:relative;overflow:hidden}.enhanced-btn .btn-text[data-v-7bd5b1e2]{font-size:var(--font-size-sm);white-space:nowrap;z-index:1;font-weight:500;position:relative}.enhanced-btn .btn-icon[data-v-7bd5b1e2]{font-size:var(--font-size-lg);z-index:1;position:relative}.danger-btn[data-v-7bd5b1e2]{color:var(--color-danger);background:#f56c6c1a;border-color:#f56c6c33}.danger-btn[data-v-7bd5b1e2]:before{background:linear-gradient(135deg,#f56c6c26 0%,#ff4d4f26 100%)}.danger-btn[data-v-7bd5b1e2]:hover{color:var(--color-danger);box-shadow:var(--shadow-md);background:#f56c6c26;border-color:#f56c6c4d}.copy-commands-button[data-v-7bd5b1e2],.copy-all-button[data-v-7bd5b1e2],.clear-button[data-v-7bd5b1e2]{min-width:70px;height:36px;font-weight:600}.dialog-toolbar .enhanced-btn[data-v-7bd5b1e2]{color:#000000d9;box-shadow:var(--shadow-sm);background:#ffffffe6;border:1px solid #00000014}.dialog-toolbar .enhanced-btn[data-v-7bd5b1e2]:hover{color:#000;box-shadow:var(--shadow-lg);background:#fff;border-color:#0000001f}[data-theme=dark] .dialog-toolbar .enhanced-btn[data-v-7bd5b1e2]{background:var(--bg-container);color:var(--text-primary);border-color:var(--border-component);box-shadow:var(--shadow-md)}[data-theme=dark] .dialog-toolbar .enhanced-btn[data-v-7bd5b1e2]:hover{background:var(--bg-container-hover);color:var(--color-white);border-color:var(--border-component-light);box-shadow:var(--shadow-lg)}.dialog-toolbar .danger-btn[data-v-7bd5b1e2]{color:var(--color-danger);background:#f56c6c14;border-color:#f56c6c26}.dialog-toolbar .danger-btn[data-v-7bd5b1e2]:hover{color:var(--color-danger);box-shadow:var(--shadow-md);background:#f56c6c1f;border-color:#f56c6c40}[data-theme=dark] .dialog-toolbar .danger-btn[data-v-7bd5b1e2]{background:var(--action-coral);color:#fff;border-color:#e74c3c}[data-theme=dark] .dialog-toolbar .danger-btn[data-v-7bd5b1e2]:hover{color:#fff;box-shadow:var(--shadow-lg);background:#e74c3c;border-color:#ff6b6b}.item-copy-button[data-v-7bd5b1e2],.output-copy-button[data-v-7bd5b1e2]{width:32px;height:32px;padding:0!important}.item-copy-button .btn-icon[data-v-7bd5b1e2],.output-copy-button .btn-icon[data-v-7bd5b1e2]{font-size:var(--font-size-md)}.item-copy-button .btn-text[data-v-7bd5b1e2],.output-copy-button .btn-text[data-v-7bd5b1e2]{display:none}.item-copy-button[data-v-7bd5b1e2]:hover,.output-copy-button[data-v-7bd5b1e2]:hover{box-shadow:var(--shadow-md);transform:scale(1.02)}.item-copy-button[data-v-7bd5b1e2]:active,.output-copy-button[data-v-7bd5b1e2]:active{box-shadow:var(--shadow-md);transform:scale(.98)}.item-copy-button[data-v-7bd5b1e2]:focus-visible,.output-copy-button[data-v-7bd5b1e2]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.expand-button[data-v-7bd5b1e2]{width:32px;height:32px;color:var(--text-secondary);transition:transform var(--transition-slow) ease;justify-content:center;align-items:center;display:flex}.expand-button .btn-icon[data-v-7bd5b1e2]{font-size:var(--font-size-md);transition:transform var(--transition-slow) ease}.enhanced-btn[data-v-7bd5b1e2]:active{box-shadow:var(--shadow-md);transform:scale(.98)}.enhanced-btn[data-v-7bd5b1e2]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.enhanced-btn[data-v-7bd5b1e2]:disabled{opacity:.6;cursor:not-allowed;transform:none}.enhanced-btn[data-v-7bd5b1e2]:disabled:hover{box-shadow:none;transform:none}.expand-button.is-expanded .btn-icon[data-v-7bd5b1e2]{transform:rotate(180deg)}.command-history-dialog[data-v-7bd5b1e2]{border-radius:var(--radius-lg);z-index:9999!important}[data-v-7bd5b1e2] .command-history-dialog .el-overlay{z-index:9998!important}[data-v-7bd5b1e2] .command-history-dialog .el-dialog{z-index:9999!important}.dialog-toolbar[data-v-7bd5b1e2]{padding:var(--spacing-lg) var(--spacing-xl);justify-content:space-between;align-items:center;gap:var(--spacing-md);background:linear-gradient(135deg, var(--color-gray-soft) 0%, var(--border-component) 100%);border-radius:8px 8px 0 0;flex-wrap:wrap;display:flex}.filter-controls[data-v-7bd5b1e2]{align-items:center;gap:var(--spacing-sm);flex:1;min-width:300px;display:flex}.filter-select[data-v-7bd5b1e2]{width:120px}.search-input[data-v-7bd5b1e2]{width:200px}.toolbar-actions[data-v-7bd5b1e2]{align-items:center;gap:var(--spacing-sm);display:flex}[data-theme=dark] .dialog-toolbar[data-v-7bd5b1e2]{background:linear-gradient(135deg,#ffffff0d 0%,#ffffff05 100%);border-bottom-color:#ffffff1a}[data-theme=dark] .filter-controls .el-input__wrapper[data-v-7bd5b1e2],[data-theme=dark] .filter-controls .el-select .el-input__wrapper[data-v-7bd5b1e2]{background-color:#0000004d;border-color:#ffffff1a}[data-theme=dark] .filter-controls .el-input__inner[data-v-7bd5b1e2]{color:#ffffffe6}[data-theme=dark] .filter-controls .el-input__inner[data-v-7bd5b1e2]::placeholder{color:#ffffff80}.socket-status[data-v-7bd5b1e2]{font-size:var(--font-size-sm);margin-right:auto;font-weight:500}.loading-state[data-v-7bd5b1e2]{flex-direction:column;justify-content:center;align-items:center;height:100%;min-height:100px;display:flex}.loading-icon[data-v-7bd5b1e2]{color:var(--color-primary);margin-bottom:10px;font-size:36px}.loading-text[data-v-7bd5b1e2]{color:var(--text-secondary)}.history-list[data-v-7bd5b1e2]{gap:var(--spacing-base);flex-direction:column;flex:1;display:flex;overflow-y:auto}.history-item[data-v-7bd5b1e2]{border:1px solid var(--border-card);border-radius:var(--radius-base);transition:var(--transition-ui-base);overflow:hidden}[data-theme=dark] .history-item[data-v-7bd5b1e2]{background-color:#ffffff08;border-color:#ffffff1a}[data-theme=dark] .history-item[data-v-7bd5b1e2]:hover{background-color:#ffffff14;border-color:#fff3}.history-item[data-v-7bd5b1e2]:hover{box-shadow:0 2px 12px #0000001a}.history-item.is-error[data-v-7bd5b1e2]{border-left:3px solid var(--color-danger)}.item-header[data-v-7bd5b1e2]{padding:10px var(--spacing-md);cursor:pointer;transition:background-color var(--transition-base);justify-content:space-between;align-items:center;display:flex}.item-header[data-v-7bd5b1e2]:hover{background-color:var(--bg-icon-hover)}.command-info[data-v-7bd5b1e2]{flex:1;min-width:0;overflow:hidden}.command-text[data-v-7bd5b1e2]{align-items:center;gap:var(--spacing-base);margin-bottom:var(--spacing-sm);display:flex}.command-text code[data-v-7bd5b1e2]{font-family:Consolas,Courier New,monospace;font-size:var(--font-size-sm);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}[data-theme=dark] .command-text code[data-v-7bd5b1e2]{color:#ffffffe6}.command-meta[data-v-7bd5b1e2]{align-items:center;gap:var(--spacing-lg);font-size:var(--font-size-sm);color:var(--text-tertiary);display:flex}[data-theme=dark] .command-meta[data-v-7bd5b1e2]{color:#fff9}.timestamp[data-v-7bd5b1e2],.duration[data-v-7bd5b1e2]{white-space:nowrap}.item-actions[data-v-7bd5b1e2]{margin-left:var(--spacing-base);align-items:center;gap:6px;display:flex}.item-details[data-v-7bd5b1e2]{padding:10px var(--spacing-md);border-top:1px solid var(--border-card);gap:var(--spacing-md);flex-direction:column;display:flex}[data-theme=dark] .item-details[data-v-7bd5b1e2]{background-color:#ffffff05;border-top-color:#ffffff1a}.output-section[data-v-7bd5b1e2]{flex-direction:column;gap:6px;display:flex}.output-section.error[data-v-7bd5b1e2]{border-left:3px solid var(--color-danger);padding-left:var(--spacing-base)}.output-section[data-v-7bd5b1e2]:not(.error){border-left:3px solid var(--color-success);padding-left:var(--spacing-base)}.output-header[data-v-7bd5b1e2]{justify-content:space-between;align-items:center;display:flex}.output-header h4[data-v-7bd5b1e2]{color:var(--text-secondary);margin:0;font-weight:500}[data-theme=dark] .output-header h4[data-v-7bd5b1e2]{color:#fffc}.output-content[data-v-7bd5b1e2]{border-radius:var(--radius-base);font-family:Consolas,Courier New,monospace;font-size:var(--font-size-sm);white-space:pre-wrap;word-break:break-all;border:1px solid var(--border-card);max-height:300px;margin:0;padding:10px;overflow-y:auto}[data-theme=dark] .output-content[data-v-7bd5b1e2]{color:#ffffffe6;background-color:#0000004d;border-color:#ffffff1a}.status-tag[data-v-7bd5b1e2]{flex-shrink:0}.truncation-notice[data-v-7bd5b1e2]{margin-top:6px}.output-content[data-v-7bd5b1e2]::-webkit-scrollbar{width:6px;height:6px}.output-content[data-v-7bd5b1e2]::-webkit-scrollbar-thumb{background-color:var(--text-placeholder);border-radius:var(--radius-base)}.output-content[data-v-7bd5b1e2]::-webkit-scrollbar-track{background-color:var(--bg-panel)}.command-history-dialog{z-index:1999!important}.el-overlay{z-index:1998!important}.header-left[data-v-1ba78eef]{align-items:center;gap:var(--spacing-md);display:flex}.header-left h2[data-v-1ba78eef]{margin:0}.header-right[data-v-1ba78eef]{align-items:center;gap:var(--spacing-sm);display:flex}.card-content[data-v-1ba78eef]{padding:var(--spacing-base);flex:1;overflow-y:auto}.layout-container[data-v-1ba78eef]{gap:var(--spacing-base);flex-direction:column;height:100%;display:flex}.standard-commit-form[data-v-1ba78eef]{gap:var(--spacing-base);margin-bottom:var(--spacing-base);flex-direction:column;display:flex}.standard-commit-header[data-v-1ba78eef]{gap:var(--spacing-sm);flex-direction:column;width:100%;display:flex}.type-scope-container[data-v-1ba78eef]{gap:var(--spacing-base);align-items:stretch;width:100%;display:flex}.type-select[data-v-1ba78eef]{width:180px}.scope-wrapper[data-v-1ba78eef]{align-items:center;gap:5px;width:130px;display:flex}.commit-form[data-v-1ba78eef]{gap:var(--spacing-base);flex-direction:column;display:flex}.description-container[data-v-1ba78eef]{border-radius:var(--radius-xl);width:100%;box-shadow:none;transition:var(--transition-ui-slow);background:0 0;align-items:center;gap:5px;display:flex}.description-container.description-inline[data-v-1ba78eef]{min-width:0;box-shadow:none;background:0 0;flex:1}.description-container.description-inline[data-v-1ba78eef]:hover,.description-container[data-v-1ba78eef]:hover{box-shadow:none}[data-v-1ba78eef] .description-input{flex-grow:1}[data-v-1ba78eef] .description-input .el-input__wrapper{border-radius:var(--radius-lg);background:var(--input-bg);border:1px solid var(--input-border);box-shadow:none;transition:var(--transition-ui-fast);height:40px}[data-v-1ba78eef] .description-input .el-input__wrapper:hover{border-color:var(--input-border-hover)}[data-v-1ba78eef] .description-input .el-input__wrapper.is-focus{border-color:var(--input-border-focus);box-shadow:var(--focus-ring)}[data-v-1ba78eef] .description-input .el-input__inner{height:34px;font-weight:500}[data-v-1ba78eef] .description-input .el-input__inner::placeholder{color:var(--text-placeholder);font-weight:400}[data-v-1ba78eef] .type-select .el-select__wrapper{border-radius:var(--radius-lg);background:var(--input-bg);border:1px solid var(--input-border);box-shadow:none;transition:var(--transition-ui-fast);height:40px}[data-v-1ba78eef] .type-select .el-select__wrapper:hover{border-color:var(--input-border-hover)}[data-v-1ba78eef] .type-select .el-select__wrapper.is-focus{border-color:var(--input-border-focus);box-shadow:var(--focus-ring)}[data-v-1ba78eef] .type-select .el-select__inner{font-weight:500}[data-v-1ba78eef] .type-select .el-select__inner::placeholder{color:var(--text-placeholder);font-weight:400}[data-v-1ba78eef] .scope-input{flex-grow:1}[data-v-1ba78eef] .scope-input .el-input__wrapper{border-radius:var(--radius-lg);background:var(--input-bg);border:1px solid var(--input-border);box-shadow:none;transition:var(--transition-ui-fast);height:40px}[data-v-1ba78eef] .scope-input .el-input__wrapper:hover{border-color:var(--input-border-hover)}[data-v-1ba78eef] .scope-input .el-input__wrapper.is-focus{border-color:var(--input-border-focus);box-shadow:var(--focus-ring)}[data-v-1ba78eef] .scope-input .el-input__inner{font-weight:500}[data-v-1ba78eef] .scope-input .el-input__inner::placeholder{color:var(--text-placeholder);font-weight:400}[data-v-1ba78eef] .commit-message-input{border-radius:var(--radius-xl)}[data-v-1ba78eef] .commit-message-input .el-textarea__inner{border-radius:var(--radius-lg);background:var(--input-bg);border:1px solid var(--input-border);box-shadow:none;transition:var(--transition-ui-fast);font-weight:500}[data-v-1ba78eef] .commit-message-input .el-textarea__inner:hover{border-color:var(--input-border-hover)}[data-v-1ba78eef] .commit-message-input .el-textarea__inner:focus-visible{border-color:var(--input-border-focus);box-shadow:var(--focus-ring);outline:none}[data-v-1ba78eef] .commit-message-input .el-textarea__inner::placeholder{color:var(--text-placeholder);font-weight:400}[data-v-1ba78eef] .commit-message-input:hover{box-shadow:none}.git-config-warning[data-v-1ba78eef]{width:100%}.merge-in-progress-banner[data-v-1ba78eef]{width:100%;margin-bottom:var(--spacing-base)}.config-command[data-v-1ba78eef]{background-color:var(--bg-code-dark);color:#f8f8f2;font-family:var(--font-mono);padding:var(--spacing-base);border-radius:var(--radius-base);margin-top:var(--spacing-base);white-space:pre}.advanced-options-toggle[data-v-1ba78eef]{font:inherit;color:inherit;text-align:left;background:0 0;background-color:var(--bg-panel);border-radius:var(--radius-base);cursor:pointer;width:100%;transition:var(--transition-ui-slow);-webkit-user-select:none;user-select:none;border:none;justify-content:center;align-items:center;padding:7px 0 6px;display:flex}.advanced-options-toggle[data-v-1ba78eef]:hover{background-color:var(--border-card);color:var(--color-primary)}.toggle-icon[data-v-1ba78eef]{margin-left:var(--spacing-base);transition:transform var(--transition-slow) ease;font-size:var(--font-size-sm)}.toggle-icon.is-active[data-v-1ba78eef]{transform:rotate(180deg)}.advanced-fields[data-v-1ba78eef]{gap:var(--spacing-base);animation:fade-in-1ba78eef var(--transition-slow) ease-in-out;flex-direction:column;display:flex}@keyframes fade-in-1ba78eef{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.commit-section[data-v-1ba78eef]{flex:1;width:100%;min-width:0}.is-loading[data-v-1ba78eef]{animation:2s linear infinite rotating-1ba78eef}@keyframes rotating-1ba78eef{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.save-btn[data-v-1ba78eef]{border-radius:var(--radius-md);min-width:100px;transition:var(--transition-ui-slow);font-weight:500}.save-btn[data-v-1ba78eef]:hover{box-shadow:var(--shadow-md);transform:scale(1.02)}.save-btn[data-v-1ba78eef]:active{transform:scale(.98)}.save-btn[data-v-1ba78eef]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}
|