zen-gitsync 2.18.16 → 2.18.18
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 +44 -6
- package/package.json +3 -2
- package/src/ui/public/assets/AgentView-BE7GD8rc.css +1 -0
- package/src/ui/public/assets/AgentView-fJbuH0N-.js +12 -0
- package/src/ui/public/assets/{AppVersionBadge-C8aeLqSe.js → AppVersionBadge-BfgAvMQg.js} +2 -2
- package/src/ui/public/assets/BranchSelector-B55Ta_HD.js +4 -0
- package/src/ui/public/assets/{ChatSilenceBadge-CX-Q1BK4.js → ChatSilenceBadge-BDltHrA2.js} +1 -1
- package/src/ui/public/assets/{CommitForm-5QT3698o.js → CommitForm-C1Jql1he.js} +3 -3
- package/src/ui/public/assets/{CommonDialog-DcXSTg3n.js → CommonDialog-lhBO3OFL.js} +1 -1
- package/src/ui/public/assets/EditorView-Dvi9Js01.css +1 -0
- package/src/ui/public/assets/EditorView-nJTaLq6D.js +46 -0
- package/src/ui/public/assets/{FlowExecutionViewer-CJQEtP0d.js → FlowExecutionViewer-BPMqArlZ.js} +1 -1
- package/src/ui/public/assets/{FlowOrchestrationWorkspace-DxclUFA_.js → FlowOrchestrationWorkspace-Cq-1Knnp.js} +1 -1
- package/src/ui/public/assets/{LogList-BXIbzGgN.js → LogList-Bk7GAfle.js} +4 -4
- package/src/ui/public/assets/{MindmapView-Cp8DqQ1U.js → MindmapView-CBOfycTa.js} +1 -1
- package/src/ui/public/assets/MindmapView-DZHwQrhd.css +1 -0
- package/src/ui/public/assets/MonitorView-3g87o1gD.js +3 -0
- package/src/ui/public/assets/MonitorView-DFLZjKpz.css +1 -0
- package/src/ui/public/assets/ProjectManagerView-DgMq7Jed.js +10 -0
- package/src/ui/public/assets/{ProjectManagerView-DVIx9AVp.css → ProjectManagerView-DhC-Y5PR.css} +1 -1
- package/src/ui/public/assets/ProjectStartupButton-CkJEFz-S.js +1 -0
- package/src/ui/public/assets/{RecentDirectoriesChat-CYvrKZJ0.js → RecentDirectoriesChat-CQ6vjPkE.js} +1 -1
- package/src/ui/public/assets/RemoteManagerDialog-D9arrFOG.js +4 -0
- package/src/ui/public/assets/{RemoteRepoCard-Bf19DvWd.js → RemoteRepoCard-ZQ_SMlQZ.js} +1 -1
- package/src/ui/public/assets/{SourceMapView-BeVBU82G.js → SourceMapView-1q3TRufj.js} +1 -1
- package/src/ui/public/assets/{SvgIcon-kIrDXBzK.js → SvgIcon-CfjWD31j.js} +1 -1
- package/src/ui/public/assets/{UserInputNode-DdStei_J.js → UserInputNode-BdU3sSVR.js} +1 -1
- package/src/ui/public/assets/WorkbenchView-D6orzzEp.css +1 -0
- package/src/ui/public/assets/WorkbenchView-D8WdRklc.js +360 -0
- package/src/ui/public/assets/_plugin-vue_export-helper-D4DL0jyB.js +19 -0
- package/src/ui/public/assets/agentConversations-DJ8rPauy.js +10 -0
- package/src/ui/public/assets/{configStore-Bo0r1aq6.js → configStore-BmWis0h4.js} +1 -1
- package/src/ui/public/assets/{index-9h6sH4q0.js → index-DRDito6l.js} +106 -97
- package/src/ui/public/assets/index-DSQ6mp_N.css +1 -0
- package/src/ui/public/assets/{relativeTime-BzT7yFma.js → relativeTime-BpGKkKiW.js} +1 -1
- package/src/ui/public/assets/toolsStore-CmVXtAw_.js +1 -0
- package/src/ui/public/assets/useOrchestrator-DKr4ShyB.js +1 -0
- package/src/ui/public/assets/useWorkbenchProjects-D169QQnx.js +9 -0
- package/src/ui/public/index.html +7 -7
- package/src/ui/server/routes/fileOpen.js +277 -0
- package/src/ui/server/routes/workbench/agentMarketplace.js +17 -1
- package/src/ui/server/routes/workbench/runExternalTurn.js +9 -0
- package/src/ui/server/routes/workbench/runExternalTurn.test.js +20 -0
- package/src/ui/server/routes/workbench/taskRunner.codebuddy.test.js +42 -0
- package/src/ui/server/routes/workbench/taskRunner.js +34 -3
- package/src/ui/public/assets/AgentView-C-6_QbmJ.css +0 -1
- package/src/ui/public/assets/AgentView-CW4NHZhG.js +0 -12
- package/src/ui/public/assets/BranchSelector-B1qhhHaR.js +0 -4
- package/src/ui/public/assets/EditorView-DkXHZdKh.css +0 -1
- package/src/ui/public/assets/EditorView-eCxdCV3J.js +0 -38
- package/src/ui/public/assets/MindmapView-B2Oz9nCS.css +0 -1
- package/src/ui/public/assets/MonitorView-BDHs5wki.js +0 -3
- package/src/ui/public/assets/MonitorView-CTtuMls4.css +0 -1
- package/src/ui/public/assets/ProjectManagerView-BN-Rk3dE.js +0 -10
- package/src/ui/public/assets/ProjectStartupButton-B0UZ1c5m.js +0 -1
- package/src/ui/public/assets/RemoteManagerDialog-ByB-9iUe.js +0 -4
- package/src/ui/public/assets/WorkbenchView-DK2vT3Dr.css +0 -1
- package/src/ui/public/assets/WorkbenchView-DtOjBTLw.js +0 -358
- package/src/ui/public/assets/_plugin-vue_export-helper-BhoBCXbu.js +0 -19
- package/src/ui/public/assets/agentConversations-DYws7uRd.js +0 -10
- package/src/ui/public/assets/index-mEFBooIF.css +0 -1
- package/src/ui/public/assets/toolsStore-Dw93cKG_.js +0 -1
- package/src/ui/public/assets/useOrchestrator-5ZwvNS0V.js +0 -1
- package/src/ui/public/assets/useWorkbenchProjects-CQY-iTuV.js +0 -7
package/README.md
CHANGED
|
@@ -23,6 +23,7 @@ A Git automation platform with interactive commits, scheduled sync, custom comma
|
|
|
23
23
|
- [AI Startup Suggestions](#ai-startup-suggestions)
|
|
24
24
|
- [Console Panel](#console-panel)
|
|
25
25
|
- [Project Startup](#project-startup)
|
|
26
|
+
- [Project Manager](#project-manager)
|
|
26
27
|
- [Views at a glance](#views-at-a-glance)
|
|
27
28
|
- [Built-in Code Editor](#built-in-code-editor)
|
|
28
29
|
- [Workbench](#workbench-task-driven-agent-execution)
|
|
@@ -73,6 +74,8 @@ npm install -g zen-gitsync
|
|
|
73
74
|
- **Network error banner** — Global banner appears when the backend is unreachable, with one-click retry and relative-time status
|
|
74
75
|
- **Accessibility (WCAG 2.1 AA)** — Dialog focus trap & restore, role-based separators, keyboard-only panel resize (`← →`), screen-reader friendly commit context menu, ARIA-pressed toggle buttons, commit button `aria-busy` during in-flight commits, Git SHA hashes meet ≥ 4.5:1 contrast in both light and dark themes
|
|
75
76
|
- **Faster cold start** — `monaco-editor` / `@vue-flow` / `flow-mindmap` / `dagre` are split into independent chunks and lazy-loaded so the Git panel boots without waiting on the code editor or visual workflow designer
|
|
77
|
+
- **Project manager view** — manage the project list as an asset: add / remove without switching the current project, see each project's open-with actions, with recommended additions
|
|
78
|
+
- **Content-aware file search** — the editor's search box now also matches file contents: name hits filter the tree as before, content hits arrive as a flat list with line numbers and jump-to-line
|
|
76
79
|
|
|
77
80
|
> Detailed per-release changes can be found via `git log` or the [GitHub Releases](https://github.com/xz333221/zen-gitsync/releases) page.
|
|
78
81
|
|
|
@@ -85,7 +88,7 @@ npm install -g zen-gitsync
|
|
|
85
88
|
$ g ui
|
|
86
89
|
```
|
|
87
90
|
|
|
88
|
-
The GUI runs as a local web server and opens in your default browser on the first free port it finds in `4000–6000` (set `PORT` to pin a fixed one). It attaches to the current Git repository automatically. The activity bar on the left switches between **Git**, **Console**, **Agent**, **Editor**, **Workbench**, **System Monitor** and **Mindmap**, top to bottom. See the [Core Git Panel](#core-git-panel) screenshot below for what the main view looks like.
|
|
91
|
+
The GUI runs as a local web server and opens in your default browser on the first free port it finds in `4000–6000` (set `PORT` to pin a fixed one). It attaches to the current Git repository automatically. The activity bar on the left switches between **Git**, **Console**, **Agent**, **Editor**, **Workbench**, **Projects**, **System Monitor** and **Mindmap**, top to bottom. See the [Core Git Panel](#core-git-panel) screenshot below for what the main view looks like.
|
|
89
92
|
|
|
90
93
|
### Architecture at a glance
|
|
91
94
|
|
|
@@ -110,6 +113,9 @@ The GUI runs as a local web server and opens in your default browser on the firs
|
|
|
110
113
|
│ │Bench │─► Board: projects·kanban·agent│
|
|
111
114
|
│ └──────┘ │
|
|
112
115
|
│ ┌──────┐ │
|
|
116
|
+
│ │Proj │─► Project list management │
|
|
117
|
+
│ └──────┘ │
|
|
118
|
+
│ ┌──────┐ │
|
|
113
119
|
│ │Monit │─► System monitor │
|
|
114
120
|
│ └──────┘ │
|
|
115
121
|
│ ┌──────┐ │
|
|
@@ -348,13 +354,26 @@ Configure commands or workflows to run automatically when a project is opened:
|
|
|
348
354
|
|
|
349
355
|
---
|
|
350
356
|
|
|
357
|
+
### Project Manager
|
|
358
|
+
|
|
359
|
+
> A dedicated view (folders icon in the activity bar) that manages the project list as an asset. It reads the same list the Workbench does (`GET /api/workbench/projects`), so anything you add or remove here shows up there too — the list is the union of recent directories and the paths your tasks remember.
|
|
360
|
+
|
|
361
|
+
- **Add without switching** — add any directory to the list; adding never changes the current project (switching directories is a global state change that reaches every `g ui` instance)
|
|
362
|
+
- **Remove a dead project** — a row whose folder no longer exists gets a single red **Remove from list** action; the confirm dialog spells out that no tasks are deleted, and the entry comes back on its own if you ever clone the folder again
|
|
363
|
+
- **Startup & open-with at a glance** — each row leads with the project's own favicon (32 px tile, the same lookup the Workbench and the directory switcher use) beside its name and branch, with open-with actions for the file manager, a terminal, a new `g ui` tab, and every detected editor / AI tool
|
|
364
|
+
- **Recommended additions** — directories that look like projects but are not on the list yet are suggested for one-click adding
|
|
365
|
+
- **Quiet refresh** — the list reloads on mount, then silently polls every 10 s, so projects added or removed in another `g ui` instance show up here too
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
351
369
|
### Views at a glance
|
|
352
370
|
|
|
353
371
|
| View | Purpose | Persistent state | Highlights |
|
|
354
372
|
|---|---|---|---|
|
|
355
373
|
| **Git** | Day-to-day staging, committing, pushing, history review | Per-project UI prefs (view mode, layout ratios) | Structured commit form, AI commit message, selection-scoped quick push |
|
|
356
|
-
| **Editor** | Browse & edit project files without leaving the GUI | Open tabs, unsaved markers, recent files | Monaco editor with syntax highlighting, Markdown preview, file search |
|
|
374
|
+
| **Editor** | Browse & edit project files without leaving the GUI | Open tabs, unsaved markers, recent files | Monaco editor with syntax highlighting, Markdown preview, file search (file names and contents) |
|
|
357
375
|
| **Workbench** | Multi-project board for dispatching and running agent tasks | Tasks, prompts, board layout, log retention | Kanban board, master-agent console, executor choice, live chat-style logs |
|
|
376
|
+
| **Projects** | Manage the project list as an asset | The same list the Workbench reads | Add / remove without touching the current project, recommended additions, 10 s silent refresh |
|
|
358
377
|
| **Agent** | Chat with the built-in AI agent (web + CLI sessions) | Sessions, pending questions | Streaming answers, tool-call cards, Skill / MCP plaza, rail badge counting the conversations still generating |
|
|
359
378
|
|
|
360
379
|
**Console**, **System Monitor** and **Mindmap** are utility views on the same rail.
|
|
@@ -368,7 +387,7 @@ A full IDE-like editor (fourth icon in the activity bar) for browsing and editin
|
|
|
368
387
|
| Feature | Description |
|
|
369
388
|
|---|---|
|
|
370
389
|
| File tree | Collapsible directory tree with file-type icons; **auto-refreshes every 60s** to pick up changes made outside the GUI (skipped when the tab is hidden or the search box is non-empty) |
|
|
371
|
-
| File search | Type in the sidebar search box to filter the tree (180 ms debounce); matched substrings are highlighted in node names; `Ctrl+F` / `Cmd+F` focuses the box; `Esc` clears the query or blurs the input |
|
|
390
|
+
| File search | Type in the sidebar search box to filter the tree (180 ms debounce); matched substrings are highlighted in node names; `Ctrl+F` / `Cmd+F` focuses the box; `Esc` clears the query or blurs the input. When the name filter has no hit, the query also goes to the server (`POST /api/search_content`) for a **file-content** scan: hits arrive as a flat list with line numbers, highlighted snippets and per-file match counts, and clicking one jumps straight to that line. The scan is a plain filesystem walk (no `rg` / `git grep` dependency) that skips `node_modules` / `dist` / `.git` plus files over 2 MB or binary, capped at 20 000 files / 100 hit files / 10 s, and aborted as soon as you keep typing; single-character queries skip the content pass |
|
|
372
391
|
| Multi-tab editing | Open multiple files simultaneously; tabs show unsaved (●) indicator |
|
|
373
392
|
| Sync with disk | The current tab re-checks the file on disk when the window regains focus, when you switch to that tab, or when you come back to the Editor view; a 30s fallback poll covers the case where something in the same window (the `g ai` panel) rewrote the file with no focus change. If it changed and you have no unsaved edits, it reloads silently (cursor position and undo history preserved); if you do have unsaved edits it asks first and never overwrites on its own |
|
|
374
393
|
| Workspace restore | The tree's expanded folders and the open tabs (their order plus which one is active) are remembered **per project** and put back on reload, and when you switch back to that project. The snapshot lives in `~/.zen-gitsync/config.json` under `ui.editorWorkspaceByProject`; only paths are stored — files are re-read from disk, so unsaved edits do not survive a reload, and files that no longer exist are skipped silently |
|
|
@@ -729,6 +748,7 @@ $ g --check-lock=config.json
|
|
|
729
748
|
- [AI 启动建议](#ai-启动建议)
|
|
730
749
|
- [控制台面板](#控制台面板)
|
|
731
750
|
- [项目启动](#项目启动)
|
|
751
|
+
- [项目管理](#项目管理)
|
|
732
752
|
- [视图一览](#视图一览)
|
|
733
753
|
- [内置代码编辑器](#内置代码编辑器)
|
|
734
754
|
- [工作台](#工作台任务驱动的智能体执行)
|
|
@@ -779,6 +799,8 @@ npm install -g zen-gitsync
|
|
|
779
799
|
- **网络错误横幅** — 后端不可达时全局弹出横幅,支持一键重试与相对时间状态
|
|
780
800
|
- **可访问性(WCAG 2.1 AA)** — 弹窗焦点陷阱与归还、`role="separator"` 键盘可达的分隔条、纯键盘(`← →`)调整面板宽度、屏幕阅读器友好的提交右键菜单、ARIA-pressed 切换按钮、提交按钮在提交过程中挂 `aria-busy`、Git 提交哈希在明/暗主题下对比度均 ≥ 4.5:1
|
|
781
801
|
- **更快的冷启动** — `monaco-editor` / `@vue-flow` / `flow-mindmap` / `dagre` 拆分为独立 chunk 并按需懒加载,Git 面板首屏不再等待代码编辑器或可视化流程编排模块
|
|
802
|
+
- **项目管理视图** — 把项目清单当资产来管:添加 / 删除不切换当前项目,逐行看打开方式,带推荐添加
|
|
803
|
+
- **文件内容搜索** — 编辑器搜索框现在也匹配文件内容:名称命中仍走本地树过滤,内容命中按文件平铺、带行号,点击跳转对应行
|
|
782
804
|
|
|
783
805
|
> 每个版本的详细变更可通过 `git log` 或 [GitHub Releases](https://github.com/xz333221/zen-gitsync/releases) 页面查看。
|
|
784
806
|
|
|
@@ -791,7 +813,7 @@ npm install -g zen-gitsync
|
|
|
791
813
|
$ g ui
|
|
792
814
|
```
|
|
793
815
|
|
|
794
|
-
GUI 以本地 Web 服务器形式运行,自动在浏览器中打开,并附加到当前 Git 仓库。端口默认在 `4000–6000` 里挑第一个可用的(可用 `PORT` 固定)。左侧 Activity Bar 自上而下为 **Git** / **控制台** / **智能体** / **编辑器** / **工作台** / **系统监控** / **思维导图**。主界面长什么样可参考下方[核心 Git 面板](#核心-git-面板)的截图。
|
|
816
|
+
GUI 以本地 Web 服务器形式运行,自动在浏览器中打开,并附加到当前 Git 仓库。端口默认在 `4000–6000` 里挑第一个可用的(可用 `PORT` 固定)。左侧 Activity Bar 自上而下为 **Git** / **控制台** / **智能体** / **编辑器** / **工作台** / **项目管理** / **系统监控** / **思维导图**。主界面长什么样可参考下方[核心 Git 面板](#核心-git-面板)的截图。
|
|
795
817
|
|
|
796
818
|
### 监听地址
|
|
797
819
|
|
|
@@ -847,6 +869,9 @@ $ ZEN_ALLOWED_ORIGINS="https://zen.example.com,http://10.0.0.5:8080" g ui
|
|
|
847
869
|
│ │工作 │──► 看板: 项目 · 看板 · 主 Agent │
|
|
848
870
|
│ └──────┘ │
|
|
849
871
|
│ ┌──────┐ │
|
|
872
|
+
│ │项管 │──► 项目管理清单 │
|
|
873
|
+
│ └──────┘ │
|
|
874
|
+
│ ┌──────┐ │
|
|
850
875
|
│ │监控 │──► 系统监控 │
|
|
851
876
|
│ └──────┘ │
|
|
852
877
|
│ ┌──────┐ │
|
|
@@ -1085,13 +1110,26 @@ $ ZEN_ALLOWED_ORIGINS="https://zen.example.com,http://10.0.0.5:8080" g ui
|
|
|
1085
1110
|
|
|
1086
1111
|
---
|
|
1087
1112
|
|
|
1113
|
+
### 项目管理
|
|
1114
|
+
|
|
1115
|
+
> Activity Bar 里的文件夹图标视图,把项目清单当资产来管。它读的是工作台那份同一接口的清单(`GET /api/workbench/projects`)—— 清单本身是常用目录与任务记得的目录两份来源的并集,在这里增删,工作台左栏同步可见。
|
|
1116
|
+
|
|
1117
|
+
- **添加不切换** — 把任意目录加进清单即可;添加≠切过去看(切目录是全局状态,会波及每个 `g ui` 实例)
|
|
1118
|
+
- **移除死项目** — 目录已经不存在的行只留一颗红色「从清单移除」;确认框写明任务不会被删除,目录哪天被克隆回来,这一行会自己现身
|
|
1119
|
+
- **启动方式与打开方式一目了然** — 每行以项目自己的 favicon 开头(32px 方块,与工作台、切换目录弹窗同一套探测),旁边是名字与分支,打开方式覆盖资源管理器、终端、新标签页 `g ui` 以及各编辑器 / AI 工具
|
|
1120
|
+
- **推荐添加** — 看着像项目但还不在清单里的目录,会作为推荐项出现,一键加入
|
|
1121
|
+
- **静默刷新** — 挂载拉一次,之后每 10 秒静默轮询 —— 别的 `g ui` 实例增删项目、任务路径带来的新项目,这里都能看到
|
|
1122
|
+
|
|
1123
|
+
---
|
|
1124
|
+
|
|
1088
1125
|
### 视图一览
|
|
1089
1126
|
|
|
1090
1127
|
| 视图 | 用途 | 持久化状态 | 高亮特性 |
|
|
1091
1128
|
|---|---|---|---|
|
|
1092
1129
|
| **Git** | 日常暂存、提交、推送、历史回看 | 每个项目的 UI 偏好(视图模式、布局比例) | 结构化提交表单、AI 生成提交信息、选择范围一键推送 |
|
|
1093
|
-
| **编辑器** | 不离开 GUI 浏览并编辑项目文件 | 打开的 tab、未保存标记、最近访问 | Monaco 编辑器带语法高亮、Markdown
|
|
1130
|
+
| **编辑器** | 不离开 GUI 浏览并编辑项目文件 | 打开的 tab、未保存标记、最近访问 | Monaco 编辑器带语法高亮、Markdown 预览、文件搜索(文件名 + 文件内容) |
|
|
1094
1131
|
| **工作台** | 多项目看板:派发并执行智能体任务 | 任务、提示词、看板布局、日志保留策略 | 看板视图、主 Agent 控制台、执行器选择、对话式实时日志 |
|
|
1132
|
+
| **项目管理** | 把项目清单当资产管理 | 与工作台同一份清单 | 添加 / 删除不切换当前项目、推荐添加、10 秒静默刷新 |
|
|
1095
1133
|
| **智能体** | 与内置 AI 智能体对话(Web + CLI 会话) | 会话、待回答问题 | 流式回答、工具调用卡片、Skill / MCP 广场、导航栏徽标显示仍在生成的对话数 |
|
|
1096
1134
|
|
|
1097
1135
|
**控制台**、**系统监控**、**思维导图** 是同一导航栏上的辅助视图。
|
|
@@ -1105,7 +1143,7 @@ Activity Bar 第四个视图,在 GUI 内直接浏览并编辑项目文件:
|
|
|
1105
1143
|
| 功能 | 说明 |
|
|
1106
1144
|
|---|---|
|
|
1107
1145
|
| 文件树 | 可折叠的目录树,附带文件类型图标;**每 60 秒自动刷新一次**,捕获 GUI 外部对文件的改动(标签页隐藏或搜索框非空时跳过) |
|
|
1108
|
-
| 文件搜索 | 在侧边栏搜索框中输入关键字过滤文件树(180ms 防抖),命中片段会在节点名中高亮;`Ctrl+F` / `Cmd+F` 聚焦搜索框,`Esc`
|
|
1146
|
+
| 文件搜索 | 在侧边栏搜索框中输入关键字过滤文件树(180ms 防抖),命中片段会在节点名中高亮;`Ctrl+F` / `Cmd+F` 聚焦搜索框,`Esc` 清空内容或失焦。名称没有命中时,关键词还会送到服务端(`POST /api/search_content`)做一次**文件内容**扫描:结果按文件平铺,带行号、片段高亮与每个文件的命中数,点一条直接跳到对应行。扫描是纯文件系统遍历(不依赖 `rg` / `git grep`),跳过 `node_modules` / `dist` / `.git` 以及超过 2 MB 或二进制的文件,上限 2 万个文件 / 100 个命中文件 / 10 秒,继续输入会立即中止上一次;单字符关键词不触发内容扫描 |
|
|
1109
1147
|
| 多标签页 | 同时打开多个文件,未保存文件显示 ● 标记 |
|
|
1110
1148
|
| 跟盘同步 | 窗口重新聚焦、切到某个标签、或切回文件空间时,当前标签会跟盘上对一次账;另有 30 秒兜底轮询,盖住"同窗口里 AI 面板写了文件、用户全程没切焦点"的情况。变了且没有未保存改动就静默换成最新正文(光标位置与撤销栈都保留);有未保存改动则先问一次,绝不自动覆盖 |
|
|
1111
1149
|
| 工作区恢复 | **按项目**记住文件树展开了哪些目录、开了哪些标签(顺序 + 当前激活的那个),刷新页面或切回该项目时自动恢复;快照存在 `~/.zen-gitsync/config.json` 的 `ui.editorWorkspaceByProject`。只记路径 —— 文件按盘上最新内容重开,未保存的改动不跨会话保留,已被删除的文件静默跳过 |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zen-gitsync",
|
|
3
|
-
"version": "2.18.
|
|
3
|
+
"version": "2.18.18",
|
|
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",
|
|
@@ -172,7 +172,8 @@
|
|
|
172
172
|
"verify:ai-push-loading:reverse": "node scripts/verify-ai-push-loading.cjs --reverse",
|
|
173
173
|
"verify:header-monitor": "node scripts/verify-header-monitor.cjs",
|
|
174
174
|
"verify:header-git-buttons": "node scripts/verify-header-git-buttons.cjs",
|
|
175
|
-
"verify:header-git-buttons:reverse": "node scripts/verify-header-git-buttons.cjs --reverse"
|
|
175
|
+
"verify:header-git-buttons:reverse": "node scripts/verify-header-git-buttons.cjs --reverse",
|
|
176
|
+
"shots:ui": "node scripts/capture-ui-shots.mjs"
|
|
176
177
|
},
|
|
177
178
|
"files": [
|
|
178
179
|
"src/ui/public/**",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.marketplace-panel[data-v-e9f9e851]{background:var(--bg-container);flex-direction:column;height:100%;min-height:0;display:flex}.mp-hero[data-v-e9f9e851]{flex-shrink:0;justify-content:space-between;align-items:flex-end;gap:12px;padding:16px 16px 12px;display:flex}.mp-hero-text[data-v-e9f9e851]{min-width:0}.mp-hero-title[data-v-e9f9e851]{font-size:var(--font-size-md);color:var(--text-primary);margin:0;font-weight:600}.mp-hero-sub[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;margin:2px 0 0;overflow:hidden}.mp-hero-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-meta);flex-shrink:0;justify-content:center;align-items:center;padding:0 8px;display:inline-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-meta);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-meta)}.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-meta)}.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-meta);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-meta);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-meta);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-dark);align-items:center;gap:4px;display:inline-flex}.mp-group-link[data-v-e9f9e851]{color:var(--text-meta);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]{transition:background var(--transition-fast) ease;gap:10px;padding:12px;display:flex}.mp-card[data-v-e9f9e851]:hover{background:var(--bg-hover)}.mp-card-icon[data-v-e9f9e851]{border-radius:var(--radius-lg);flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;display:flex;overflow:hidden}.mp-card-icon img[data-v-e9f9e851]{object-fit:contain;width:100%;height:100%;display:block}.mp-card-icon.tile[data-v-e9f9e851]{background:hsl(var(--tile-hue,220), 62%, 95%)}.mp-card-icon.tile span[data-v-e9f9e851]{font-size:var(--font-size-mid);color:hsl(var(--tile-hue,220), 45%, 38%);font-weight:600}[data-theme=dark] .mp-card-icon.tile[data-v-e9f9e851]{background:hsl(var(--tile-hue,220), 35%, 22%)}[data-theme=dark] .mp-card-icon.tile span[data-v-e9f9e851]{color:hsl(var(--tile-hue,220), 55%, 75%)}.mp-card-main[data-v-e9f9e851]{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}.mp-verified[data-v-e9f9e851]{color:var(--color-success-dark);flex-shrink:0;font-size:12px}.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-meta);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-meta);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-meta);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-dark)}.mp-card-foot[data-v-e9f9e851]{align-items:center;gap:8px;margin-top:auto;padding-top:2px;display:flex}.mp-card-link[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-meta);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:var(--disabled-opacity);cursor:not-allowed}.mp-installed-chip[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--color-success-dark);align-items:center;gap:3px;display:inline-flex}.mp-not-installable[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-meta)}.mp-empty[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-meta);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-meta);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]{transition:background var(--transition-fast) ease;align-items:center;gap:10px;padding:6px 10px;display:flex}.mp-installed-row[data-v-e9f9e851]:hover{background:var(--bg-hover)}.mp-installed-name[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:500;overflow:hidden}.mp-installed-id[data-v-e9f9e851]{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;max-width:40%;overflow:hidden}.mp-reveal-btn[data-v-e9f9e851],.mp-remove-btn[data-v-e9f9e851]{font-size:var(--font-size-xs);border:1px solid var(--border-color);border-radius:var(--radius-xs);color:var(--text-meta);cursor:pointer;white-space:nowrap;transition:var(--transition-ui-fast);background:0 0;align-items:center;gap:4px;padding:3px 10px;font-family:inherit;display:inline-flex}.mp-reveal-btn[data-v-e9f9e851]:disabled,.mp-remove-btn[data-v-e9f9e851]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-reveal-btn[data-v-e9f9e851]:hover:not(:disabled){color:var(--text-primary);border-color:var(--text-tertiary)}.mp-remove-btn[data-v-e9f9e851]:hover:not(:disabled){color:var(--color-danger-dark);border-color:var(--color-danger)}@media (prefers-reduced-motion:reduce){.mp-refresh.spinning svg[data-v-e9f9e851]{animation:none}}.mkt-form[data-v-e9f9e851]{flex-direction:column;gap:12px;display:flex}.mkt-form-name[data-v-e9f9e851]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mkt-field[data-v-e9f9e851]{flex-direction:column;gap:4px;display:flex}.mkt-field label[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:600}.mkt-field input[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-container);height:30px;color:var(--text-primary);font-size:var(--font-size-mid);transition:border-color var(--transition-fast) ease;padding:0 8px;font-family:inherit}.mkt-field input[data-v-e9f9e851]:focus{border-color:var(--color-primary);outline:none}.mkt-hint[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-meta);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}.schedule-panel[data-v-63dc658b]{flex-direction:column;flex:1;gap:12px;min-height:0;padding:16px 20px 24px;display:flex;overflow-y:auto}.schedule-toolbar[data-v-63dc658b]{justify-content:space-between;align-items:center;gap:12px;display:flex}.schedule-summary[data-v-63dc658b]{color:var(--text-secondary);font-size:12px}.schedule-error[data-v-63dc658b]{color:var(--text-danger);background:color-mix(in srgb, var(--color-danger) 8%, transparent);border:1px solid color-mix(in srgb, var(--color-danger) 25%, transparent);border-radius:6px;padding:8px 10px;font-size:12px}.schedule-loading[data-v-63dc658b],.schedule-empty[data-v-63dc658b]{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:40px 20px;font-size:13px;display:flex}.schedule-empty-title[data-v-63dc658b]{color:var(--text-primary);margin:0;font-size:14px;font-weight:500}.schedule-empty-desc[data-v-63dc658b]{text-align:center;max-width:440px;color:var(--text-tertiary);margin:0;font-size:12px;line-height:1.7}.schedule-list[data-v-63dc658b]{flex-direction:column;gap:8px;display:flex}.schedule-card[data-v-63dc658b]{background:var(--bg-card);border:1px solid var(--border-color);border-radius:8px;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px;transition:border-color .15s,background .15s;display:flex}.schedule-card[data-v-63dc658b]:hover{border-color:var(--border-color-medium)}.schedule-card.is-running[data-v-63dc658b]{border-color:var(--tint-primary-35);background:var(--tint-primary-04)}.schedule-card.is-disabled .schedule-name[data-v-63dc658b]{color:var(--text-secondary)}.schedule-card-body[data-v-63dc658b]{flex-direction:column;gap:4px;min-width:0;display:flex}.schedule-card-head[data-v-63dc658b]{align-items:center;gap:8px;min-width:0;display:flex}.schedule-name[data-v-63dc658b]{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.schedule-running[data-v-63dc658b]{color:var(--color-primary);background:var(--tint-primary-10);white-space:nowrap;border-radius:4px;padding:1px 6px;font-size:11px}.schedule-card-sub[data-v-63dc658b]{color:var(--text-secondary);white-space:nowrap;align-items:center;gap:6px;min-width:0;font-size:12px;display:flex;overflow:hidden}.schedule-desc[data-v-63dc658b]{text-overflow:ellipsis;overflow:hidden}.schedule-sep[data-v-63dc658b]{color:var(--text-tertiary)}.schedule-last[data-v-63dc658b]{text-overflow:ellipsis;overflow:hidden}.schedule-last.is-ok[data-v-63dc658b]{color:var(--text-success)}.schedule-last.is-error[data-v-63dc658b]{color:var(--text-danger)}.schedule-last.is-skipped[data-v-63dc658b]{color:var(--text-warning)}.schedule-last.is-muted[data-v-63dc658b]{color:var(--text-tertiary)}.sch-link[data-v-63dc658b]{color:var(--color-primary);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px}.sch-link[data-v-63dc658b]:hover{text-decoration:underline}.schedule-card-side[data-v-63dc658b]{flex-shrink:0;align-items:center;gap:12px;display:flex}.schedule-next[data-v-63dc658b]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.schedule-next.is-muted[data-v-63dc658b]{color:var(--text-tertiary)}.schedule-actions[data-v-63dc658b]{align-items:center;gap:2px;display:flex}.sch-switch[data-v-63dc658b]{border:1px solid var(--border-color-medium);background:var(--bg-subtle);cursor:pointer;border-radius:10px;flex-shrink:0;width:34px;height:20px;padding:0;transition:background .15s,border-color .15s;position:relative}.sch-switch .sch-switch-knob[data-v-63dc658b]{background:var(--text-tertiary);border-radius:50%;width:14px;height:14px;transition:transform .15s,background .15s;position:absolute;top:2px;left:2px}.sch-switch.on[data-v-63dc658b]{background:var(--tint-primary-18);border-color:var(--tint-primary-45)}.sch-switch.on .sch-switch-knob[data-v-63dc658b]{background:var(--color-primary);transform:translate(14px)}.sch-btn[data-v-63dc658b]{border:1px solid var(--border-color);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:6px;padding:3px 10px;font-size:12px;transition:background .15s,color .15s,border-color .15s}.sch-btn[data-v-63dc658b]:hover:not(:disabled){background:var(--bg-subtle-hover);color:var(--text-primary);border-color:var(--border-color-medium)}.sch-btn[data-v-63dc658b]:disabled{opacity:.5;cursor:default}.sch-btn-primary[data-v-63dc658b]{background:var(--tint-primary-10);border-color:var(--tint-primary-35);color:var(--color-primary)}.sch-btn-primary[data-v-63dc658b]:hover:not(:disabled){background:var(--tint-primary-18);color:var(--color-primary);border-color:var(--tint-primary-45)}.sch-btn-danger[data-v-63dc658b]{color:var(--text-danger)}.sch-btn-danger[data-v-63dc658b]:hover:not(:disabled){background:color-mix(in srgb, var(--color-danger) 8%, transparent);color:var(--text-danger);border-color:color-mix(in srgb, var(--color-danger) 30%, transparent)}.sch-form[data-v-63dc658b]{flex-direction:column;gap:14px;display:flex}.sch-field[data-v-63dc658b]{flex-direction:column;gap:6px;display:flex}.sch-field-label[data-v-63dc658b]{color:var(--text-secondary);font-size:12px}.sch-input[data-v-63dc658b]{box-sizing:border-box;width:100%;color:var(--text-primary);background:var(--bg-container);border:1px solid var(--border-color-medium);border-radius:6px;outline:none;padding:6px 10px;font-family:inherit;font-size:13px;transition:border-color .15s}.sch-input[data-v-63dc658b]:focus{border-color:var(--tint-primary-55)}.sch-select[data-v-63dc658b]{cursor:pointer}.sch-select-sm[data-v-63dc658b]{width:auto;min-width:64px}.sch-input-cron[data-v-63dc658b]{font-family:var(--font-mono,monospace)}.sch-textarea[data-v-63dc658b]{resize:vertical;min-height:72px;line-height:1.6}.sch-freq-row[data-v-63dc658b]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.sch-inline-label[data-v-63dc658b]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.sch-hint[data-v-63dc658b]{color:var(--text-tertiary);font-size:11px}.sch-radio-row[data-v-63dc658b]{flex-wrap:wrap;align-items:center;gap:16px;display:flex}.sch-radio[data-v-63dc658b]{color:var(--text-secondary);cursor:pointer;align-items:center;gap:6px;font-size:12px;display:inline-flex}.sch-radio input[data-v-63dc658b]{accent-color:var(--color-primary);cursor:pointer;margin:0}.sch-form-error[data-v-63dc658b]{color:var(--text-danger);margin:0;font-size:12px}.sch-form-footer[data-v-63dc658b]{justify-content:flex-end;gap:8px;margin-top:14px;display:flex}.sch-confirm-text[data-v-63dc658b]{color:var(--text-primary);margin:0;font-size:13px;line-height:1.7}.aps[data-v-f9ada51b]{background:var(--bg-container);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.aps__scroll[data-v-f9ada51b]{flex-direction:column;flex:1;gap:14px;max-width:860px;min-height:0;padding:16px 18px 24px;line-height:1.5;display:flex;overflow-y:auto}.aps__head[data-v-f9ada51b]{flex-direction:column;gap:5px;display:flex}.aps__title[data-v-f9ada51b]{font-size:var(--font-size-lg);color:var(--text-primary);margin:0;font-weight:600}.aps__intro[data-v-f9ada51b]{font-size:var(--font-size-sm);color:var(--text-meta);margin:0;line-height:1.6}.aps__card[data-v-f9ada51b]{background:var(--bg-panel);border:1px solid var(--border-color);border-radius:var(--radius-lg);flex-direction:column;gap:9px;padding:14px 16px;display:flex}.aps__card-head[data-v-f9ada51b]{align-items:baseline;gap:8px;display:flex}.aps__card-title[data-v-f9ada51b]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.aps__label[data-v-f9ada51b]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:500}.aps__count[data-v-f9ada51b]{font-size:var(--font-size-xs);color:var(--text-meta);font-variant-numeric:tabular-nums;margin-left:auto}.aps__field[data-v-f9ada51b]{flex-direction:column;gap:5px;display:flex}.aps__hint[data-v-f9ada51b]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0;line-height:1.6}.aps__area[data-v-f9ada51b]{box-sizing:border-box;resize:vertical;width:100%;min-height:92px;max-height:320px;font-size:var(--font-size-mid);color:var(--text-primary);background:var(--bg-subtle);border:1px solid var(--border-color);border-radius:var(--radius-md);transition:border-color var(--transition-fast) var(--ease-custom);outline:none;padding:7px 9px;font-family:inherit;line-height:1.5}.aps__area[data-v-f9ada51b]:focus{border-color:var(--color-primary)}.aps__area[data-v-f9ada51b]::placeholder{color:var(--text-meta)}.aps__area[data-v-f9ada51b]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.aps__foot[data-v-f9ada51b]{align-items:center;gap:8px;display:flex}.aps__spacer[data-v-f9ada51b]{flex:1}.aps__saved[data-v-f9ada51b]{font-size:var(--font-size-xs);color:var(--text-meta)}.aps__btn[data-v-f9ada51b]{color:var(--text-secondary);font-size:var(--font-size-sm);border-radius:var(--radius-md);cursor:pointer;transition:color var(--transition-fast) var(--ease-custom), background var(--transition-fast) var(--ease-custom);background:0 0;border:none;padding:0 12px;line-height:28px}.aps__btn[data-v-f9ada51b]:hover:not(:disabled){color:var(--color-primary);background:var(--bg-container-hover)}.aps__btn[data-v-f9ada51b]:disabled{opacity:var(--disabled-opacity);cursor:default}.aps__btn[data-v-f9ada51b]:focus-visible{outline:var(--focus-outline);outline-offset:1px}.aps__btn--primary[data-v-f9ada51b]{background:var(--color-primary);color:#fff}.aps__btn--primary[data-v-f9ada51b]:hover:not(:disabled){background:var(--color-primary);color:#fff;opacity:.88}.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);transition:width var(--transition-base) var(--ease-custom);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}.agent-sidebar.is-convs-collapsed .agent-conversations[data-v-bd681ddd]{padding:10px 4px 8px}.sidebar-resizer[data-v-bd681ddd]{cursor:col-resize;width:4px;transition:background var(--transition-fast) ease;background:0 0;flex-shrink:0}.sidebar-resizer[data-v-bd681ddd]:hover,.sidebar-resizer.active[data-v-bd681ddd]{background:var(--color-primary);opacity:.3}.agent-chat-area[data-v-bd681ddd]{flex-direction:column;flex:1;min-width:0;display:flex;position:relative;overflow:hidden}.agent-engine[data-v-bd681ddd]{margin-bottom:7px;margin-left:auto}.agent-copy[data-v-bd681ddd]{margin-bottom:7px;margin-left:2px}.agent-silence[data-v-bd681ddd]{margin-bottom:7px;margin-left:10px}.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-meta);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-meta);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-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.agent-page-back[data-v-bd681ddd]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-page-title[data-v-bd681ddd]{min-width:0;font-size:var(--font-size-mid);color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.agent-chat-host[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-host[data-v-bd681ddd] .acu-avatar--left{background:0 0}.agent-chat-host[data-v-bd681ddd] .acu-bubble-row.is-assistant .acu-bubble-main{width:var(--acu-bubble-max-width);max-width:var(--acu-bubble-max-width);position:relative}.agent-chat-host[data-v-bd681ddd] .acu-bubble-row.is-assistant .acu-bubble{align-self:flex-start}.agent-chat-host[data-v-bd681ddd] .acu-message-meta{margin:0;position:absolute;top:0;right:0}.agent-chat-host[data-v-bd681ddd] .acu-input-queue{--acu-queue-edge:var(--role-pending-edge);--acu-queue-surface:var(--role-pending-surface);--acu-queue-ink:var(--role-pending-ink);--acu-queue-wash:var(--role-pending-wash)}.agent-chat-host[data-v-bd681ddd] .acu-welcome-logo{background:var(--welcome-avatar) center/46px 46px no-repeat;width:56px;height:56px;box-shadow:none}.agent-chat-host[data-v-bd681ddd] .acu-welcome-logo>svg{display:none}.agent-chat-host[data-v-bd681ddd] .acu-welcome-grid{flex-wrap:wrap;display:flex}.agent-chat-host[data-v-bd681ddd] .acu-welcome-grid>.acu-preset-q{border-radius:var(--radius-lg);background:0 0;border:0;flex:260px;min-width:0;padding:12px 10px 12px 0}.agent-chat-host[data-v-bd681ddd] .acu-welcome-grid>.acu-preset-q:hover{background:var(--bg-hover);box-shadow:none;transform:none}[data-theme=dark]{background:var(--bg-panel)}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Bn as t,Cn as n,Dt as r,Et as i,Gn as a,Gt as o,Ht as s,In as c,J as l,Kr as u,M as d,Mn as f,Pn as p,Qn as m,Rt as h,Sn as g,Tn as _,Un as v,Vt as y,W as b,Wr as x,Xr as S,Yn as C,_n as w,a as T,ar as E,ct as D,dn as O,en as ee,et as k,fn as A,gr as j,i as M,ir as N,j as P,jr as F,kn as I,ln as L,lr as R,mr as z,nr as B,on as V,pn as H,pt as te,qn as U,r as ne,wn as W,xn as G,xt as re}from"./element-plus-Bz6lYur-.js";import{c as K,t as ie}from"./vendor-C2k0GBzj.js";import{n as q,t as J}from"./_plugin-vue_export-helper-D4DL0jyB.js";import{t as Y}from"./configStore-BmWis0h4.js";import{t as ae}from"./CommonDialog-lhBO3OFL.js";import{j as oe,lt as se,st as ce,tt as le,ut as ue}from"./index-DRDito6l.js";import{a as de,c as fe,i as pe,l as me,m as he,n as ge,o as _e,r as ve,s as ye,t as be,u as xe}from"./agentConversations-DJ8rPauy.js";import{c as Se,d as Ce,n as we,t as Te,u as Ee}from"./ChatSilenceBadge-BDltHrA2.js";import{t as De}from"./useOrchestrator-DKr4ShyB.js";async function X(e,t){let n=await fetch(e,{headers:{"Content-Type":`application/json`},...t}),r={};try{r=await n.json()}catch{}if(!n.ok||r.success===!1)throw Error(r.error||`请求失败 (${n.status})`);return r}async function Oe(){let e=await X(`/api/schedules`);return Array.isArray(e.tasks)?e.tasks:[]}async function ke(e){return(await X(`/api/schedules`,{method:`POST`,body:JSON.stringify(e)})).task}async function Ae(e,t){return(await X(`/api/schedules/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify(t)})).task}async function je(e){await X(`/api/schedules/${encodeURIComponent(e)}`,{method:`DELETE`})}async function Me(e){await X(`/api/schedules/${encodeURIComponent(e)}/run`,{method:`POST`})}async function Ne(e){await X(`/api/schedules/${encodeURIComponent(e)}/stop`,{method:`POST`})}function Pe(e){if(typeof EventSource>`u`)return()=>{};let t=new EventSource(`/api/schedules/events`);return t.onmessage=t=>{try{e(JSON.parse(t.data))}catch{}},()=>t.close()}var Z=e=>/^\d+$/.test(e)?Number(e):null;function Fe(e){let t=String(e||``).trim(),n=t.split(/\s+/);if(n.length!==5)return{kind:`custom`,raw:t};let[r,i,a,o,s]=n,c=Z(r),l=Z(i);if(t===`* * * * *`)return{kind:`every-minute`,raw:t};let u=r.match(/^\*\/(\d+)$/);if(u&&i===`*`&&a===`*`&&o===`*`&&s===`*`)return{kind:`every-n-minutes`,n:Number(u[1]),raw:t};if(c!==null&&i===`*`&&a===`*`&&o===`*`&&s===`*`)return{kind:`hourly`,minute:c,raw:t};if(c!==null&&l!==null&&a===`*`&&o===`*`&&s===`*`)return{kind:`daily`,hour:l,minute:c,raw:t};let d=Z(s);if(c!==null&&l!==null&&a===`*`&&o===`*`&&d!==null)return{kind:`weekly`,weekday:d%7,hour:l,minute:c,raw:t};let f=Z(a);return c!==null&&l!==null&&f!==null&&o===`*`&&s===`*`?{kind:`monthly`,day:f,hour:l,minute:c,raw:t}:{kind:`custom`,raw:t}}var Q=e=>String(e).padStart(2,`0`),Ie=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime();function Le(e,t=new Date){if(!e)return{kind:`none`};let n=new Date(e);if(Number.isNaN(n.getTime()))return{kind:`none`};let r=`${Q(n.getHours())}:${Q(n.getMinutes())}`,i=Math.round((Ie(n)-Ie(t))/864e5);return i<0?{kind:`date`,date:`${n.getMonth()+1}-${Q(n.getDate())}`,time:r}:i===0?{kind:`today`,time:r}:i===1?{kind:`tomorrow`,time:r}:i<7?{kind:`weekday`,weekday:n.getDay(),time:r}:{kind:`date`,date:`${n.getMonth()+1}-${Q(n.getDate())}`,time:r}}function Re(e){switch(e){case`ok`:return`ok`;case`error`:case`timed-out`:return`error`;case`skipped-busy`:case`missed`:case`cancelled`:return`skipped`;default:return`pending`}}function ze(e){let t=Number(e);if(!Number.isFinite(t)||t<0)return``;if(t<1e3)return`<1s`;let n=Math.round(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60);return r<60?`${r}m${Q(n%60)}s`:`${Math.floor(r/60)}h${Q(r%60)}m`}function Be(e){let t=Math.min(59,Math.max(0,Math.floor(e.minute))),n=Math.min(23,Math.max(0,Math.floor(e.hour))),r=(Math.floor(e.weekday)%7+7)%7;switch(e.freq){case`minutes`:return`*/${Math.min(59,Math.max(1,Math.floor(e.everyMinutes??30)))} * * * *`;case`hourly`:return`${t} * * * *`;case`daily`:return`${t} ${n} * * *`;case`weekly`:return`${t} ${n} * * ${r}`;case`custom`:return String(e.custom||``).trim()}}var Ve=`https://cdn.simpleicons.org`;function He(e){return`https://github.com/${e}.png?size=64`}function Ue(e,t){return`${Ve}/${e}${t?`/E8EAED`:``}`}var $=[[/chromedevtools|chrome-dev-tools/,`avatar:ChromeDevTools`],[/googlechrome|\bchrome\b/,`googlechrome`],[/\bfirefox\b/,`firefox`],[/puppeteer/,`puppeteer`],[/playwright/,`avatar:microsoft`],[/selenium/,`selenium`],[/cypress/,`cypress`],[/appium/,`appium`],[/browserstack/,`avatar:browserstack`],[/saucelabs/,`saucelabs`],[/storybook/,`storybook`],[/\bgithub\b|githubcopilot|githubactions/,`github`],[/\bgitlab\b/,`gitlab`],[/\bbitbucket\b/,`bitbucket`],[/context7/,`avatar:upstash`],[/modelcontextprotocol/,`avatar:modelcontextprotocol`],[/claude|anthropic/,`claude`],[/\bopenai\b|chatgpt/,`avatar:openai`],[/gemini|google\s*ai\b/,`googlegemini`],[/hugging\s*face/,`huggingface`],[/\bollama\b/,`ollama`],[/\bdify\b/,`dify`],[/\bn8n\b/,`n8n`],[/langchain/,`langchain`],[/perplexity/,`avatar:perplexityai`],[/\bexa\b/,`avatar:exa-labs`],[/firecrawl/,`avatar:firecrawl`],[/\be2b\b/,`avatar:e2b-dev`],[/browserbase/,`avatar:browserbase`],[/apify/,`avatar:apify`],[/postgres|postgresql/,`postgresql`],[/\bmysql\b|mariadb/,`mysql`],[/\bsqlite\b/,`sqlite`],[/mongodb|\bmongo\b/,`mongodb`],[/\bredis\b/,`redis`],[/elasticsearch|\belastic\b/,`elasticsearch`],[/clickhouse/,`clickhouse`],[/snowflake/,`snowflake`],[/databricks/,`databricks`],[/duckdb/,`duckdb`],[/influxdb/,`influxdb`],[/neo4j/,`neo4j`],[/cassandra/,`apachecassandra`],[/rabbitmq/,`rabbitmq`],[/kafka/,`apachekafka`],[/\bqdrant\b/,`qdrant`],[/weaviate/,`weaviate`],[/pinecone/,`avatar:pinecone`],[/planetscale/,`avatar:planetscale`],[/neondatabase|\bneon\b/,`avatar:neondatabase`],[/supabase/,`supabase`],[/firebase/,`firebase`],[/\bdbt\b/,`avatar:dbt-labs`],[/airflow/,`apacheairflow`],[/dagster/,`avatar:dagster-io`],[/prefect/,`prefect`],[/\bspark\b/,`apachespark`],[/hadoop/,`apachehadoop`],[/airbyte/,`airbyte`],[/bigquery/,`googlebigquery`],[/\baws\b|amazon\s*web\s*services|amazons3|amazondynamodb/,`avatar:aws`],[/azure/,`microsoftazure`],[/google\s*cloud|\bgcp\b/,`googlecloud`],[/cloudflare/,`cloudflare`],[/vercel/,`vercel`],[/netlify/,`netlify`],[/heroku/,`heroku`],[/digitalocean/,`digitalocean`],[/\bdocker\b/,`docker`],[/kubernetes|\bk8s\b|kubectl/,`kubernetes`],[/kubeflow/,`kubeflow`],[/terraform/,`terraform`],[/jenkins/,`jenkins`],[/circleci/,`circleci`],[/\bhelm\b/,`avatar:helm`],[/argocd|argo\s*cd/,`avatar:argoproj`],[/\bnginx\b/,`nginx`],[/\bapache\b/,`apache`],[/caddy/,`caddy`],[/traefik/,`traefikproxy`],[/haproxy/,`haproxy`],[/tailscale/,`tailscale`],[/\bngrok\b/,`ngrok`],[/\bconsul\b|hashicorp/,`hashicorp`],[/vault/,`hashicorp`],[/packer/,`packer`],[/virtualbox/,`virtualbox`],[/vmware/,`vmware`],[/grafana/,`grafana`],[/prometheus/,`prometheus`],[/datadog/,`datadog`],[/\bsentry\b/,`sentry`],[/splunk/,`splunk`],[/new\s*relic/,`newrelic`],[/pagerduty/,`pagerduty`],[/opsgenie/,`opsgenie`],[/home\s*assistant/,`homeassistant`],[/obsidian/,`obsidian`],[/notion/,`notion`],[/figma/,`figma`],[/\blinear\b/,`linear`],[/atlassian/,`atlassian`],[/\bjira\b/,`jira`],[/confluence/,`confluence`],[/airtable/,`airtable`],[/clickup/,`clickup`],[/asana/,`asana`],[/trello/,`trello`],[/basecamp/,`basecamp`],[/todoist/,`todoist`],[/zapier/,`zapier`],[/hubspot/,`hubspot`],[/zendesk/,`zendesk`],[/intercom/,`intercom`],[/mailchimp/,`mailchimp`],[/salesforce/,`avatar:salesforce`],[/slack/,`avatar:slack`],[/discord/,`discord`],[/telegram/,`telegram`],[/whatsapp/,`whatsapp`],[/gmail/,`gmail`],[/google\s*drive/,`googledrive`],[/google\s*sheets/,`googlesheets`],[/google\s*docs/,`googledocs`],[/google\s*maps/,`googlemaps`],[/google\s*calendar/,`googlecalendar`],[/youtube/,`youtube`],[/spotify/,`spotify`],[/twilio/,`avatar:twilio`],[/sendgrid/,`avatar:sendgrid`],[/mailgun/,`mailgun`],[/stripe/,`stripe`],[/paypal/,`paypal`],[/shopify/,`shopify`],[/posthog/,`avatar:posthog`],[/segment\b/,`avatar:segmentio`],[/amplitude/,`avatar:amplitude`],[/mixpanel/,`avatar:mixpanel`],[/contentful/,`contentful`],[/sanity/,`sanity`],[/wordpress|\bwp\b/,`wordpress`],[/ghost\b/,`ghost`],[/webflow/,`webflow`],[/framer/,`framer`],[/bitwarden/,`bitwarden`],[/proton\s*vpn/,`protonvpn`],[/1password/,`1password`],[/auth0/,`auth0`],[/okta/,`okta`],[/keycloak/,`keycloak`],[/clerk/,`avatar:clerk`],[/brave\b/,`brave`],[/duckduckgo/,`duckduckgo`],[/openapi|swagger/,`openapiinitiative`],[/graphql/,`graphql`],[/apollo/,`apollographql`],[/postman/,`postman`],[/insomnia/,`insomnia`],[/hoppscotch/,`hoppscotch`],[/\bcurl\b/,`curl`],[/react/,`react`],[/vue/,`vuedotjs`],[/angular/,`angular`],[/svelte/,`svelte`],[/next\.?js/,`nextdotjs`],[/nuxt/,`nuxtdotjs`],[/\bastro\b/,`astro`],[/tailwind/,`tailwindcss`],[/electron/,`electron`],[/flutter/,`flutter`],[/\bswift\b/,`swift`],[/typescript/,`typescript`],[/javascript/,`javascript`],[/python/,`python`],[/node\.?js/,`nodedotjs`],[/\bdeno\b/,`deno`],[/\bbun\b/,`bun`],[/\brust\b/,`rust`],[/\bgolang\b|\bgo\b/,`go`],[/pytorch|\btorch\b/,`pytorch`],[/tensorflow/,`tensorflow`],[/scikit|sklearn/,`scikitlearn`],[/mlflow/,`mlflow`],[/\bray\b/,`ray`],[/jupyter/,`jupyter`],[/\bvite\b/,`vite`],[/vitest/,`vitest`],[/eslint/,`eslint`],[/prettier/,`prettier`],[/\bjest\b/,`jest`],[/\bnpm\b/,`npm`],[/pnpm/,`pnpm`],[/\byarn\b/,`yarn`],[/homebrew/,`homebrew`],[/docusaurus/,`docusaurus`],[/readthedocs/,`readthedocs`],[/gitbook/,`gitbook`],[/markdown/,`markdown`],[/\blinux\b/,`linux`],[/ubuntu/,`ubuntu`],[/debian/,`debian`],[/apple|macos/,`apple`],[/windows/,`windows`],[/microsoft/,`microsoft`],[/\bteams\b/,`microsoftteams`],[/onedrive/,`onedrive`],[/power\s*bi/,`powerbi`],[/bing\b/,`bing`],[/google/,`google`],[/baidu/,`baidu`],[/bilibili/,`bilibili`],[/wechat|weixin/,`wechat`],[/alibaba|aliyun/,`alibabacloud`]],We={url:``,letter:``,hue:0};function Ge(e){let t=String(e||``).trim();if(!t)return``;let n=t.match(/github\.com\/([^/\s]+)/i),r=n?n[1]:t.split(`/`)[0];return/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$/.test(r)?r:``}function Ke(e){let t=0;for(let n=0;n<e.length;n++)t=(t*31+e.charCodeAt(n))%36e4;return t%360}function qe(e,t=!1){let n=String(e?.name||``).trim();if(!n)return We;let r=[...n][0]?.toUpperCase()||``,i=Ke(n.toLowerCase()),a=`${n} ${e?.package||``} ${e?.repository||``}`.toLowerCase();for(let[e,n]of $)if(e.test(a))return{url:n.startsWith(`avatar:`)?He(n.slice(7)):Ue(n,t),letter:r,hue:i};let o=Ge(e?.repository||``);return o?{url:He(o),letter:r,hue:i}:{url:``,letter:r,hue:i}}c(),R();var Je=4e3,Ye=f({__name:`MarketplacePanel`,props:{type:{type:String,required:!0}},setup(e,{expose:t}){t();let n=e,r=Y(),a=j([]),c=j([]),l=j(!1),u=j(``),d=j(``),f=j([]),p=j(`project`),m=j(new Set),g=j(new Set),_=j(new Set),b=G(()=>r.currentDirectory||``),{theme:x}=le(),S=G(()=>x.value===`dark`),C=j(new Set),w=new Map;function T(e){let t=w.get(e);t&&clearTimeout(t),w.delete(e)}function E(e){let t=H(e);qe(e,S.value).url&&(T(t),w.set(t,setTimeout(()=>{w.delete(t),C.value.add(t)},Je)))}v(()=>{for(let e of w.values())clearTimeout(e);w.clear()});function O(e){let t=qe(e,S.value);return C.value.has(H(e))?{...t,url:``}:t}function A(e){T(H(e))}function N(e){T(H(e)),C.value.add(H(e))}let P=G(()=>a.value.reduce((e,t)=>e+(t.status===`ok`?t.items.length:0),0)),F=null;async function I(){if(!l.value){l.value=!0;try{let e=new URLSearchParams({type:n.type,cwd:b.value});d.value&&e.set(`q`,d.value),f.value.length&&e.set(`sources`,f.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();if(t?.success){a.value=t.groups||[],c.value=t.installed||[];for(let e of a.value)for(let t of e.items)E(t)}else M.error(t?.error||q(`@MKT:加载失败`))}catch{M.error(q(`@MKT:加载失败`))}finally{l.value=!1}}}B(u,e=>{F&&clearTimeout(F),F=setTimeout(()=>{d.value=e.trim(),I()},400)}),B(f,()=>I()),B(()=>n.type,()=>{f.value=[],d.value=``,u.value=``,I()}),B(b,()=>I()),I();let L=G(()=>{let e=b.value?b.value.split(/[\\/]/).filter(Boolean).pop():``;return p.value===`project`?e||q(`@MKT:当前项目`):q(`@MKT:g ai 智能体`)});function R(e){return e.stars?`${V(e.stars)} ★`:e.downloads?`${V(e.downloads)} ${q(`@MKT:周下载`)}`:e.uses?`${V(e.uses)} ${q(`@MKT:次使用`)}`:``}function V(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function H(e){return`${e.id}`}function U(e){return m.value.has(H(e))}let W=G(()=>{let e={project:[],global:[]};for(let t of c.value)(e[t.target]||=[]).push(t);return e}),K=z({visible:!1,item:null,env:{},args:``});function ie(e){return n.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function J(e){K.item=e,K.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),K.args=(e.args||[]).join(` `),K.visible=!0}function oe(){let e=K.item;if(K.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(K.env).filter(([,e])=>e.trim()!==``)),n=K.args.trim()?K.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;ce(e,{env:t,...n?{args:n}:{}})}async function se(e){if(!e.installed||await ue(e)){if(ie(e)){J(e);return}await ce(e,{})}}async function ce(e,t){let r=H(e);m.value.add(r);try{let r=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:p.value,cwd:b.value,item:{...e,...t}})}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){M.error(i?.error||q(`@MKT:安装失败`));return}i.item?.warning&&M.warning(i.item.warning),i.item?.envKeys?.length?M.warning(`${q(`@MKT:还缺环境变量`)}: ${i.item.envKeys.join(`, `)}`):M.success(q(`@MKT:安装成功`)),await I()}catch{M.error(q(`@MKT:安装失败`))}finally{m.value.delete(r)}}async function ue(e){try{return await ne.confirm(`${e.name} ${q(`@MKT:已安装,要重新安装吗?`)}`,q(`@MKT:重新安装`),{confirmButtonText:q(`@MKT:重装`),cancelButtonText:q(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function de(e){let t=`${e.target}:${e.id}`;_.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:e.target,cwd:b.value,id:e.id})}),r=await t.json().catch(()=>null);(!t.ok||!r?.success)&&M.error(r?.error||q(`@MKT:打开失败`))}catch{M.error(q(`@MKT:打开失败`))}finally{_.value.delete(t)}}async function fe(e){try{await ne.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:b.value}),r=await fetch(`/api/agent/marketplace/item/${n.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){M.error(i?.error||q(`@MKT:卸载失败`));return}M.success(q(`@MKT:已卸载`)),await I()}catch{M.error(q(`@MKT:卸载失败`))}finally{g.value.delete(t)}}let pe={props:n,configStore:r,groups:a,installed:c,loading:l,searchInput:u,query:d,selectedSources:f,installTarget:p,installing:m,removing:g,revealing:_,cwd:b,currentTheme:x,isDark:S,ICON_FALLBACK_MS:Je,iconErrors:C,iconTimers:w,settleIconTimer:T,scheduleIconFallback:E,iconOf:O,onIconLoad:A,onIconError:N,totalCount:P,get searchTimer(){return F},set searchTimer(e){F=e},loadCatalog:I,targetLabel:L,metricText:R,formatCount:V,cardKey:H,isBusy:U,installedByTarget:W,configDialog:K,needsConfig:ie,openConfigDialog:J,confirmConfig:oe,onInstall:se,doInstall:ce,confirmReinstall:ue,onReveal:de,onRemove:fe,get $t(){return q},get Search(){return y},get Refresh(){return h},get Delete(){return D},get Link(){return i},get Check(){return k},get Select(){return s},get Star(){return o},get Download(){return te},get Warning(){return ee},get FolderOpened(){return re},CommonDialog:ae};return Object.defineProperty(pe,"__isScriptSetup",{enumerable:!1,value:!0}),pe}});c(),F(),V();var Xe={class:`marketplace-panel`},Ze={class:`mp-hero`},Qe={class:`mp-hero-text`},$e={class:`mp-hero-title`},et={class:`mp-hero-sub`},tt={class:`mp-hero-count`},nt={class:`mp-toolbar`},rt={class:`mp-search`},it=[`placeholder`],at={class:`mp-toolbar-sub`},ot={class:`mp-target-hint`},st={class:`mp-source-filter`},ct=[`onClick`],lt={class:`mp-body`},ut={class:`mp-group-header`},dt={class:`mp-group-title`},ft={key:0,class:`mp-group-count`},pt={key:1,class:`mp-group-error`},mt=[`href`,`title`],ht={key:0,class:`mp-grid`},gt=[`src`,`alt`,`onLoad`,`onError`],_t={key:1},vt={class:`mp-card-main`},yt={class:`mp-card-head`},bt=[`title`],xt={key:1,class:`mp-card-metric`},St=[`title`],Ct={class:`mp-card-meta`},wt=[`title`],Tt=[`title`],Et={key:2,class:`mp-tag remote`},Dt={class:`mp-card-foot`},Ot=[`href`],kt={key:1,class:`mp-installed-chip`},At=[`disabled`,`onClick`],jt={key:3,class:`mp-not-installable`},Mt={key:1,class:`mp-empty`},Nt={key:0,class:`mp-group installed`},Pt={class:`mp-group-header`},Ft={class:`mp-group-title`},It={class:`mp-group-count`},Lt={key:0,class:`mp-installed-block`},Rt={class:`mp-installed-target`},zt={class:`mp-installed-list`},Bt=[`title`],Vt=[`title`],Ht={key:1,class:`mp-meta-pkg`},Ut={key:2,class:`mp-tag warn`},Wt=[`disabled`,`title`,`onClick`],Gt=[`disabled`,`onClick`],Kt={key:1,class:`mp-empty all`},qt={key:0,class:`mkt-form`},Jt={class:`mkt-form-name`},Yt=[`onUpdate:modelValue`,`placeholder`],Xt={key:0,class:`mkt-field`},Zt={class:`mkt-hint`};function Qt(t,r,i,a,o,s){let c=l,f=P,p=d,m=b,h=T;return U(),_(`div`,Xe,[W(` ── 页头 ───────────────────────────────── `),g(`header`,Ze,[g(`div`,Qe,[g(`h2`,$e,S(i.type===`skill`?a.$t(`@MKT:Skill 广场`):a.$t(`@MKT:MCP 广场`)),1),g(`p`,et,S(i.type===`skill`?a.$t(`@MKT:Skill 广场副标题`):a.$t(`@MKT:MCP 广场副标题`)),1)]),g(`span`,tt,S(i.type===`skill`?a.$t(`@MKT:共 {n} 个技能`,{n:a.totalCount}):a.$t(`@MKT:共 {n} 个服务`,{n:a.totalCount})),1)]),W(` ── 工具栏 ───────────────────────────────── `),g(`div`,nt,[g(`div`,rt,[e(c,{class:`mp-search-icon`},{default:N(()=>[e(a.Search)]),_:1}),E(g(`input`,{"onUpdate:modelValue":r[0]||=e=>a.searchInput=e,class:`mp-search-input`,type:`text`,placeholder:i.type===`skill`?a.$t(`@MKT:搜索 Skill...`):a.$t(`@MKT:搜索 MCP 服务...`)},null,8,it),[[H,a.searchInput]])]),e(p,{modelValue:a.installTarget,"onUpdate:modelValue":r[1]||=e=>a.installTarget=e,size:`small`,class:`mp-target`},{default:N(()=>[e(f,{value:`project`},{default:N(()=>[I(S(a.$t(`@MKT:当前项目`)),1)]),_:1}),e(f,{value:`global`},{default:N(()=>[I(S(a.$t(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),e(m,{content:a.$t(`@MKT:刷新`),placement:`top`,"show-after":300},{default:N(()=>[g(`button`,{class:x([`mp-refresh`,{spinning:a.loading}]),onClick:a.loadCatalog},[e(c,null,{default:N(()=>[e(a.Refresh)]),_:1})],2)]),_:1},8,[`content`])]),g(`div`,at,[g(`span`,ot,[I(S(a.$t(`@MKT:安装到`))+` `,1),g(`b`,null,S(a.targetLabel),1)]),g(`div`,st,[(U(!0),_(w,null,C(a.groups,e=>(U(),_(`button`,{key:e.id,class:x([`mp-chip`,{active:a.selectedSources.includes(e.id)}]),onClick:()=>{let t=a.selectedSources.indexOf(e.id);t>=0?a.selectedSources.splice(t,1):a.selectedSources.push(e.id)}},S(e.label),11,ct))),128)),a.selectedSources.length?(U(),_(`button`,{key:0,class:`mp-chip clear`,onClick:r[2]||=e=>a.selectedSources=[]},S(a.$t(`@MKT:全部来源`)),1)):W(`v-if`,!0)])]),W(` ── 内容 ─────────────────────────────────── `),E((U(),_(`div`,lt,[(U(!0),_(w,null,C(a.groups,t=>(U(),_(`section`,{key:t.id,class:`mp-group`},[g(`header`,ut,[g(`h3`,dt,S(t.label),1),t.status===`ok`?(U(),_(`span`,ft,S(t.items.length),1)):(U(),_(`span`,pt,[e(c,null,{default:N(()=>[e(a.Warning)]),_:1}),I(` `+S(t.error||a.$t(`@MKT:来源不可用`)),1)])),t.homepage?(U(),_(`a`,{key:2,class:`mp-group-link`,href:t.homepage,target:`_blank`,rel:`noopener noreferrer`,title:t.homepage},[e(c,null,{default:N(()=>[e(a.Link)]),_:1})],8,mt)):W(`v-if`,!0)]),t.status===`ok`&&t.items.length?(U(),_(`div`,ht,[(U(!0),_(w,null,C(t.items,t=>(U(),_(`article`,{key:a.cardKey(t),class:`mp-card`},[W(` 图标:品牌 logo(simple-icons / GitHub 组织头像)→ 首字母砖兜底 `),g(`div`,{class:x([`mp-card-icon`,{tile:!a.iconOf(t).url}]),style:u({"--tile-hue":String(a.iconOf(t).hue)})},[a.iconOf(t).url?(U(),_(`img`,{key:0,src:a.iconOf(t).url,alt:t.name,draggable:`false`,onLoad:e=>a.onIconLoad(t),onError:e=>a.onIconError(t)},null,40,gt)):(U(),_(`span`,_t,S(a.iconOf(t).letter),1))],6),g(`div`,vt,[g(`div`,yt,[g(`span`,{class:`mp-card-name`,title:t.name},S(t.name),9,bt),t.verified?(U(),n(c,{key:0,class:`mp-verified`,title:a.$t(`@MKT:已验证`)},{default:N(()=>[e(a.Select)]),_:1},8,[`title`])):W(`v-if`,!0),a.metricText(t)?(U(),_(`span`,xt,[e(c,null,{default:N(()=>[t.stars?(U(),n(a.Star,{key:0})):(U(),n(a.Download,{key:1}))]),_:2},1024),I(` `+S(a.metricText(t)),1)])):W(`v-if`,!0)]),g(`p`,{class:`mp-card-desc`,title:t.description},S(t.description||a.$t(`@MKT:暂无描述`)),9,St),g(`div`,Ct,[t.package?(U(),_(`code`,{key:0,class:`mp-meta-pkg`,title:t.package},S(t.package),9,wt)):t.repository?(U(),_(`span`,{key:1,class:`mp-meta-repo`,title:t.repository+(t.subpath?` · `+t.subpath:``)},[I(S(t.repository),1),t.subpath?(U(),_(w,{key:0},[I(` · `+S(t.subpath),1)],64)):W(`v-if`,!0)],8,Tt)):W(`v-if`,!0),t.transport===`remote`?(U(),_(`span`,Et,S(a.$t(`@MKT:远程服务`)),1)):W(`v-if`,!0),(U(!0),_(w,null,C((t.tags||[]).slice(0,2),e=>(U(),_(`span`,{key:e,class:`mp-tag`},S(e),1))),128))]),g(`div`,Dt,[t.upstream?(U(),_(`a`,{key:0,class:`mp-card-link`,href:t.upstream,target:`_blank`,rel:`noopener noreferrer`},S(a.$t(`@MKT:查看来源`)),9,Ot)):W(`v-if`,!0),r[6]||=g(`span`,{class:`mp-foot-spacer`},null,-1),t.installed?(U(),_(`span`,kt,[e(c,null,{default:N(()=>[e(a.Check)]),_:1}),I(S(a.$t(`@MKT:已安装`)),1)])):t.installable===!1?(U(),_(`span`,jt,S(a.$t(`@MKT:暂不支持一键安装`)),1)):(U(),_(`button`,{key:2,class:`mp-install-btn`,disabled:a.isBusy(t),onClick:e=>a.onInstall(t)},S(a.isBusy(t)?a.$t(`@MKT:安装中...`):a.$t(`@MKT:安装`)),9,At))])])]))),128))])):t.status===`ok`?(U(),_(`div`,Mt,S(a.$t(`@MKT:该来源暂无结果`)),1)):W(`v-if`,!0)]))),128)),W(` ── 已安装 ─────────────────────────────── `),a.installed.length?(U(),_(`section`,Nt,[g(`header`,Pt,[g(`h3`,Ft,S(a.$t(`@MKT:已安装`)),1),g(`span`,It,S(a.installed.length),1)]),(U(),_(w,null,C([`project`,`global`],t=>g(`div`,{key:t},[a.installedByTarget[t]?.length?(U(),_(`div`,Lt,[g(`div`,Rt,S(t===`project`?a.$t(`@MKT:当前项目`):a.$t(`@MKT:g ai 智能体`)),1),g(`div`,zt,[(U(!0),_(w,null,C(a.installedByTarget[t],n=>(U(),_(`div`,{key:t+n.id,class:`mp-installed-row`},[g(`span`,{class:`mp-installed-name`,title:n.name},S(n.name),9,Bt),W(` 实际落盘的标识:SKILL.md 里的 name 常与仓库名不同(如仓库 taste-skill
|
|
2
|
+
里的 skill 自称 brandkit),不显示这个用户就对不上广场卡片上的名字 `),n.id&&n.id!==n.name?(U(),_(`code`,{key:0,class:`mp-installed-id`,title:n.dir||n.file||n.id},S(n.id),9,Vt)):W(`v-if`,!0),n.package?(U(),_(`code`,Ht,S(n.package),1)):W(`v-if`,!0),n.requiredEnv?.length?(U(),_(`span`,Ut,S(a.$t(`@MKT:待配置`))+`: `+S(n.requiredEnv.join(`, `)),1)):W(`v-if`,!0),r[7]||=g(`span`,{class:`mp-foot-spacer`},null,-1),g(`button`,{class:`mp-reveal-btn`,disabled:a.revealing.has(t+n.id),title:n.dir||n.file||``,onClick:e=>a.onReveal(n)},[e(c,null,{default:N(()=>[e(a.FolderOpened)]),_:1}),I(` `+S(a.$t(`@MKT:打开文件夹`)),1)],8,Wt),g(`button`,{class:`mp-remove-btn`,disabled:a.removing.has(t+n.id),onClick:e=>a.onRemove(n)},[e(c,null,{default:N(()=>[e(a.Delete)]),_:1}),I(` `+S(a.removing.has(t+n.id)?a.$t(`@MKT:卸载中...`):a.$t(`@MKT:卸载`)),1)],8,Gt)]))),128))])])):W(`v-if`,!0)])),64))])):W(`v-if`,!0),!a.loading&&!a.groups.length?(U(),_(`div`,Kt,S(a.$t(`@MKT:加载失败`)),1)):W(`v-if`,!0)])),[[h,a.loading]]),W(` ── MCP 安装前配置 ───────────────────────── `),e(a.CommonDialog,{modelValue:a.configDialog.visible,"onUpdate:modelValue":r[5]||=e=>a.configDialog.visible=e,title:a.$t(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:N(()=>[g(`button`,{class:`mkt-cancel`,onClick:r[4]||=e=>a.configDialog.visible=!1},S(a.$t(`@MKT:取消`)),1),g(`button`,{class:`mkt-confirm`,onClick:a.confirmConfig},S(a.$t(`@MKT:安装`)),1)]),default:N(()=>[a.configDialog.item?(U(),_(`div`,qt,[g(`p`,Jt,S(a.configDialog.item.name),1),(U(!0),_(w,null,C(Object.keys(a.configDialog.env),e=>(U(),_(`div`,{key:e,class:`mkt-field`},[g(`label`,null,S(e),1),E(g(`input`,{"onUpdate:modelValue":t=>a.configDialog.env[e]=t,type:`text`,autocomplete:`off`,placeholder:a.$t(`@MKT:环境变量值`),spellcheck:`false`},null,8,Yt),[[H,a.configDialog.env[e]]])]))),128)),a.configDialog.item.args?.length?(U(),_(`div`,Xt,[g(`label`,null,S(a.$t(`@MKT:启动参数`)),1),E(g(`input`,{"onUpdate:modelValue":r[3]||=e=>a.configDialog.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[H,a.configDialog.args]]),g(`p`,Zt,S(a.$t(`@MKT:参数提示`)),1)])):W(`v-if`,!0)])):W(`v-if`,!0)]),_:1},8,[`modelValue`,`title`])])}var $t=J(Ye,[[`render`,Qt],[`__scopeId`,`data-v-e9f9e851`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/MarketplacePanel.vue`]]);c(),R();var en=f({__name:`SchedulePanel`,emits:[`open-session`],setup(e,{expose:t,emit:n}){t();let r=n,i=Y(),o=j([]),s=j(!0),c=j(``),l=j({}),u=null,d=null;async function f(){try{o.value=await Oe(),c.value=``}catch(e){c.value=e?.message||String(e)}finally{s.value=!1}}function p(){d===null&&(d=window.setTimeout(()=>{d=null,f()},150))}a(async()=>{await f(),u=Pe(e=>{[`tasks_changed`,`task_started`,`task_finished`,`hello`].includes(e.type)&&p()})}),v(()=>{u?.(),d!==null&&window.clearTimeout(d)});let m=G(()=>{let e=o.value.filter(e=>e.enabled).length,t=o.value.length-e;return o.value.length?q(`@SCHED:{on} 个启用 · {off} 个停用`,{on:e,off:t}):``}),h=[`@SCHED:周日`,`@SCHED:周一`,`@SCHED:周二`,`@SCHED:周三`,`@SCHED:周四`,`@SCHED:周五`,`@SCHED:周六`];function g(e){let t=Fe(e.schedule);switch(t.kind){case`every-minute`:return q(`@SCHED:每分钟`);case`every-n-minutes`:return q(`@SCHED:每 {n} 分钟`,{n:t.n});case`hourly`:return q(`@SCHED:每小时第 {minute} 分钟`,{minute:t.minute});case`daily`:return q(`@SCHED:每天 {time}`,{time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`weekly`:return q(`@SCHED:每周 {weekday} {time}`,{weekday:q(h[t.weekday]),time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`monthly`:return q(`@SCHED:每月 {day} 日 {time}`,{day:t.day,time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});default:return t.raw}}function _(e){if(!e.enabled)return q(`@SCHED:已停用`);if(e.running)return q(`@SCHED:运行中...`);let t=Le(e.nextRunAt);switch(t.kind){case`none`:return``;case`today`:return q(`@SCHED:下次 今天 {time}`,{time:t.time});case`tomorrow`:return q(`@SCHED:下次 明天 {time}`,{time:t.time});case`weekday`:return q(`@SCHED:下次 {weekday} {time}`,{weekday:q(h[t.weekday]),time:t.time});case`date`:return q(`@SCHED:下次 {date} {time}`,{date:t.date,time:t.time})}}function y(e){let t=e.lastRun;if(!t)return q(`@SCHED:还没执行过`);switch(t.status){case`ok`:return q(`@SCHED:成功`);case`error`:return q(`@SCHED:失败`);case`timed-out`:return q(`@SCHED:超时中止`);case`skipped-busy`:return q(`@SCHED:已跳过(会话忙)`);case`missed`:return q(`@SCHED:已错过(未运行)`);case`cancelled`:return q(`@SCHED:已停止`);default:return t.status}}function b(e){let t=e.lastRun;if(!t)return q(`@SCHED:还没执行过`);let n=ze(t.durationMs),r=q(`@SCHED:上次 {status}`,{status:y(e)});return n?`${r} · ${n}`:r}function x(e){return e.lastRun?`is-${Re(e.lastRun.status)}`:`is-muted`}async function S(e,t){if(!l.value[e.id]){l.value={...l.value,[e.id]:!0};try{await t(),await f()}catch(e){M.error(e?.message||String(e))}finally{let t={...l.value};delete t[e.id],l.value=t}}}function C(e){return S(e,()=>Ae(e.id,{enabled:!e.enabled}))}function w(e){return S(e,()=>Me(e.id))}function T(e){return S(e,()=>Ne(e.id))}let E=j(!1),D=j(null);function O(e){D.value=e,E.value=!0}async function ee(){let e=D.value;if(e)try{await je(e.id),E.value=!1,await f()}catch(e){M.error(e?.message||String(e))}}let k=j(!1),A=j(``),N=j(``),P=j(!1),F=j({name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:``,prompt:``,onMissed:`run`,enabled:!0}),I=G(()=>[{value:`minutes`,label:q(`@SCHED:每 N 分钟`)},{value:`hourly`,label:q(`@SCHED:每小时`)},{value:`daily`,label:q(`@SCHED:每天`)},{value:`weekly`,label:q(`@SCHED:每周`)},{value:`custom`,label:q(`@SCHED:自定义 cron`)}]),L=G(()=>Be({freq:F.value.freq,everyMinutes:F.value.everyMinutes,minute:F.value.minute,hour:F.value.hour,weekday:F.value.weekday,custom:F.value.custom}));function R(){F.value={name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:i.currentDirectory||``,prompt:``,onMissed:`run`,enabled:!0},N.value=``}function z(){A.value=``,R(),k.value=!0}function B(e){A.value=e.id;let t=Fe(e.schedule),n={name:e.name,freq:`custom`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:e.schedule,cwd:e.cwd,prompt:e.prompt,onMissed:e.onMissed===`skip`?`skip`:`run`,enabled:e.enabled};switch(t.kind){case`every-n-minutes`:n.freq=`minutes`,n.everyMinutes=t.n;break;case`hourly`:n.freq=`hourly`,n.minute=t.minute;break;case`daily`:n.freq=`daily`,n.minute=t.minute,n.hour=t.hour;break;case`weekly`:n.freq=`weekly`,n.minute=t.minute,n.hour=t.hour,n.weekday=t.weekday;break;default:n.freq=`custom`}F.value=n,N.value=``,k.value=!0}async function V(){let e=F.value;if(!e.name.trim()){N.value=q(`@SCHED:任务名不能为空`);return}if(!e.prompt.trim()){N.value=q(`@SCHED:提示词不能为空`);return}let t=L.value;if(!t){N.value=q(`@SCHED:cron 表达式不能为空`);return}let n={name:e.name.trim(),schedule:t,cwd:e.cwd.trim(),prompt:e.prompt.trim(),enabled:e.enabled,onMissed:e.onMissed};P.value=!0;try{A.value?await Ae(A.value,n):await ke(n),k.value=!1,await f()}catch(e){N.value=e?.message||String(e)}finally{P.value=!1}}let H={emit:r,configStore:i,tasks:o,loading:s,errorMsg:c,pending:l,get disposeEvents(){return u},set disposeEvents(e){u=e},get refreshTimer(){return d},set refreshTimer(e){d=e},refresh:f,scheduleRefresh:p,summaryText:m,WEEKDAY_KEYS:h,descText:g,nextText:_,lastStatusText:y,lastText:b,lastClass:x,withPending:S,toggle:C,runNow:w,stop:T,confirmVisible:E,confirmTarget:D,askRemove:O,confirmRemove:ee,formVisible:k,editingId:A,formError:N,saving:P,form:F,freqOptions:I,cronPreview:L,resetForm:R,openCreate:z,openEdit:B,submitForm:V,get $t(){return q},CommonDialog:ae};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}});F(),c(),V();var tn={class:`schedule-panel`},nn={class:`schedule-toolbar`},rn={class:`schedule-summary`},an={key:0,class:`schedule-error`},on={key:1,class:`schedule-loading`},sn={key:2,class:`schedule-empty`},cn={class:`schedule-empty-title`},ln={class:`schedule-empty-desc`},un={key:3,class:`schedule-list`},dn={class:`schedule-card-body`},fn={class:`schedule-card-head`},pn={class:`schedule-name`},mn={key:0,class:`schedule-running`},hn=[`aria-checked`,`aria-label`,`onClick`],gn={class:`schedule-card-sub`},_n={class:`schedule-desc`},vn=[`onClick`],yn={class:`schedule-card-side`},bn={class:`schedule-actions`},xn=[`disabled`,`onClick`],Sn=[`disabled`,`onClick`],Cn=[`onClick`],wn=[`onClick`],Tn={class:`sch-form`},En={class:`sch-field`},Dn={class:`sch-field-label`},On=[`placeholder`],kn={class:`sch-field`},An={class:`sch-field-label`},jn={class:`sch-freq-row`},Mn=[`value`],Nn={class:`sch-inline-label`},Pn=[`value`],Fn={class:`sch-inline-label`},In=[`value`],Ln=[`value`],Rn=[`value`],zn={class:`sch-inline-label`},Bn=[`value`],Vn={class:`sch-inline-label`},Hn=[`placeholder`],Un={class:`sch-hint`},Wn={class:`sch-field`},Gn={class:`sch-field-label`},Kn=[`placeholder`],qn={class:`sch-field`},Jn={class:`sch-field-label`},Yn=[`placeholder`],Xn={class:`sch-field`},Zn={class:`sch-field-label`},Qn={class:`sch-radio-row`},$n={class:`sch-radio`},er={class:`sch-radio`},tr={class:`sch-radio`},nr={key:0,class:`sch-form-error`},rr={class:`sch-form-footer`},ir=[`disabled`],ar={class:`sch-confirm-text`},or={class:`sch-form-footer`};function sr(t,n,r,i,a,o){return U(),_(`div`,tn,[g(`div`,nn,[g(`span`,rn,S(i.summaryText),1),g(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,onClick:i.openCreate},S(i.$t(`@SCHED:新建任务`)),1)]),i.errorMsg?(U(),_(`div`,an,S(i.$t(`@SCHED:操作失败:{error}`,{error:i.errorMsg})),1)):W(`v-if`,!0),i.loading?(U(),_(`div`,on,S(i.$t(`@SCHED:加载中...`)),1)):i.tasks.length?(U(),_(`div`,un,[(U(!0),_(w,null,C(i.tasks,e=>(U(),_(`article`,{key:e.id,class:x([`schedule-card`,{"is-disabled":!e.enabled,"is-running":!!e.running}])},[g(`div`,dn,[g(`div`,fn,[g(`span`,pn,S(e.name),1),e.running?(U(),_(`span`,mn,S(i.$t(`@SCHED:运行中`)),1)):W(`v-if`,!0),g(`button`,{type:`button`,class:x([`sch-switch`,{on:e.enabled}]),role:`switch`,"aria-checked":e.enabled,"aria-label":e.enabled?i.$t(`@SCHED:停用`):i.$t(`@SCHED:启用`),onClick:t=>i.toggle(e)},[...n[17]||=[g(`span`,{class:`sch-switch-knob`},null,-1)]],10,hn)]),g(`div`,gn,[g(`span`,_n,S(i.descText(e)),1),n[18]||=g(`span`,{class:`schedule-sep`},`·`,-1),g(`span`,{class:x([`schedule-last`,i.lastClass(e)])},S(i.lastText(e)),3),e.sessionId?(U(),_(`button`,{key:0,type:`button`,class:`sch-link`,onClick:t=>i.emit(`open-session`,e.sessionId)},S(i.$t(`@SCHED:查看会话`)),9,vn)):W(`v-if`,!0)])]),g(`div`,yn,[g(`div`,{class:x([`schedule-next`,{"is-muted":!e.enabled}])},S(i.nextText(e)),3),g(`div`,bn,[e.running?(U(),_(`button`,{key:0,type:`button`,class:`sch-btn`,disabled:!!i.pending[e.id],onClick:t=>i.stop(e)},S(i.$t(`@SCHED:停止`)),9,xn)):(U(),_(`button`,{key:1,type:`button`,class:`sch-btn`,disabled:!!i.pending[e.id],onClick:t=>i.runNow(e)},S(i.$t(`@SCHED:运行`)),9,Sn)),g(`button`,{type:`button`,class:`sch-btn`,onClick:t=>i.openEdit(e)},S(i.$t(`@SCHED:编辑`)),9,Cn),g(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:t=>i.askRemove(e)},S(i.$t(`@SCHED:删除`)),9,wn)])])],2))),128))])):(U(),_(`div`,sn,[g(`p`,cn,S(i.$t(`@SCHED:还没有定时任务`)),1),g(`p`,ln,S(i.$t(`@SCHED:让 g ai 在指定时间自动做事:定时拉代码、定时巡检、定时汇总。也可以在对话里直接说「每天 9 点帮我…」,让 g ai 来创建。`)),1)])),W(` 新建 / 编辑 `),e(i.CommonDialog,{modelValue:i.formVisible,"onUpdate:modelValue":n[14]||=e=>i.formVisible=e,title:i.editingId?i.$t(`@SCHED:编辑任务`):i.$t(`@SCHED:新建任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`medium`,width:`560px`,"z-index":3e6,"custom-class":`schedule-dialog`},{default:N(()=>[g(`div`,Tn,[g(`label`,En,[g(`span`,Dn,S(i.$t(`@SCHED:任务名`)),1),E(g(`input`,{"onUpdate:modelValue":n[0]||=e=>i.form.name=e,class:`sch-input`,type:`text`,placeholder:i.$t(`@SCHED:如:每日拉代码`)},null,8,On),[[H,i.form.name]])]),g(`div`,kn,[g(`span`,An,S(i.$t(`@SCHED:执行计划`)),1),g(`div`,jn,[E(g(`select`,{"onUpdate:modelValue":n[1]||=e=>i.form.freq=e,class:`sch-input sch-select`},[(U(!0),_(w,null,C(i.freqOptions,e=>(U(),_(`option`,{key:e.value,value:e.value},S(e.label),9,Mn))),128))],512),[[A,i.form.freq]]),i.form.freq===`minutes`?(U(),_(w,{key:0},[g(`span`,Nn,S(i.$t(`@SCHED:每`)),1),E(g(`select`,{"onUpdate:modelValue":n[2]||=e=>i.form.everyMinutes=e,class:`sch-input sch-select sch-select-sm`},[(U(),_(w,null,C([5,10,15,20,30,60],e=>g(`option`,{key:e,value:e},S(e),9,Pn)),64))],512),[[A,i.form.everyMinutes,void 0,{number:!0}]]),g(`span`,Fn,S(i.$t(`@SCHED:分钟`)),1)],64)):i.form.freq===`daily`||i.form.freq===`weekly`?(U(),_(w,{key:1},[i.form.freq===`weekly`?E((U(),_(`select`,{key:0,"onUpdate:modelValue":n[3]||=e=>i.form.weekday=e,class:`sch-input sch-select sch-select-sm`},[(U(),_(w,null,C(i.WEEKDAY_KEYS,(e,t)=>g(`option`,{key:t,value:t},S(i.$t(e)),9,In)),64))],512)),[[A,i.form.weekday,void 0,{number:!0}]]):W(`v-if`,!0),E(g(`select`,{"onUpdate:modelValue":n[4]||=e=>i.form.hour=e,class:`sch-input sch-select sch-select-sm`},[(U(),_(w,null,C(24,e=>g(`option`,{key:e-1,value:e-1},S(String(e-1).padStart(2,`0`)),9,Ln)),64))],512),[[A,i.form.hour,void 0,{number:!0}]]),n[19]||=g(`span`,{class:`sch-inline-label`},`:`,-1),E(g(`select`,{"onUpdate:modelValue":n[5]||=e=>i.form.minute=e,class:`sch-input sch-select sch-select-sm`},[(U(),_(w,null,C(60,e=>g(`option`,{key:e-1,value:e-1},S(String(e-1).padStart(2,`0`)),9,Rn)),64))],512),[[A,i.form.minute,void 0,{number:!0}]])],64)):i.form.freq===`hourly`?(U(),_(w,{key:2},[g(`span`,zn,S(i.$t(`@SCHED:第`)),1),E(g(`select`,{"onUpdate:modelValue":n[6]||=e=>i.form.minute=e,class:`sch-input sch-select sch-select-sm`},[(U(),_(w,null,C(60,e=>g(`option`,{key:e-1,value:e-1},S(String(e-1).padStart(2,`0`)),9,Bn)),64))],512),[[A,i.form.minute,void 0,{number:!0}]]),g(`span`,Vn,S(i.$t(`@SCHED:分钟`)),1)],64)):E((U(),_(`input`,{key:3,"onUpdate:modelValue":n[7]||=e=>i.form.custom=e,class:`sch-input sch-input-cron`,type:`text`,spellcheck:`false`,placeholder:i.$t(`@SCHED:如:0 9 * * 1-5`)},null,8,Hn)),[[H,i.form.custom]])]),g(`span`,Un,S(i.$t(`@SCHED:cron:{cron}(分 时 日 月 周,本地时间)`,{cron:i.cronPreview||`—`})),1)]),g(`label`,Wn,[g(`span`,Gn,S(i.$t(`@SCHED:项目目录`)),1),E(g(`input`,{"onUpdate:modelValue":n[8]||=e=>i.form.cwd=e,class:`sch-input`,type:`text`,spellcheck:`false`,placeholder:i.$t(`@SCHED:任务在该目录下执行(默认当前项目)`)},null,8,Kn),[[H,i.form.cwd]])]),g(`label`,qn,[g(`span`,Jn,S(i.$t(`@SCHED:提示词`)),1),E(g(`textarea`,{"onUpdate:modelValue":n[9]||=e=>i.form.prompt=e,class:`sch-input sch-textarea`,rows:`4`,placeholder:i.$t(`@SCHED:到点后发给 g ai 的完整指令,例如:检查所有仓库远端更新,有变更就 pull;写成一次自足的请求(未来那一轮没有现在的上下文)`)},null,8,Yn),[[H,i.form.prompt]])]),g(`div`,Xn,[g(`span`,Zn,S(i.$t(`@SCHED:错过补偿`)),1),g(`div`,Qn,[g(`label`,$n,[E(g(`input`,{"onUpdate:modelValue":n[10]||=e=>i.form.onMissed=e,type:`radio`,value:`run`},null,512),[[O,i.form.onMissed]]),g(`span`,null,S(i.$t(`@SCHED:补跑一次(g ui 重新运行后)`)),1)]),g(`label`,er,[E(g(`input`,{"onUpdate:modelValue":n[11]||=e=>i.form.onMissed=e,type:`radio`,value:`skip`},null,512),[[O,i.form.onMissed]]),g(`span`,null,S(i.$t(`@SCHED:跳过`)),1)]),g(`label`,tr,[E(g(`input`,{"onUpdate:modelValue":n[12]||=e=>i.form.enabled=e,type:`checkbox`},null,512),[[L,i.form.enabled]]),g(`span`,null,S(i.$t(`@SCHED:创建后启用`)),1)])])]),i.formError?(U(),_(`p`,nr,S(i.formError),1)):W(`v-if`,!0)]),g(`div`,rr,[g(`button`,{type:`button`,class:`sch-btn`,onClick:n[13]||=e=>i.formVisible=!1},S(i.$t(`@SCHED:取消`)),1),g(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,disabled:i.saving,onClick:i.submitForm},S(i.saving?i.$t(`@SCHED:保存中...`):i.$t(`@SCHED:保存`)),9,ir)])]),_:1},8,[`modelValue`,`title`]),W(` 删除确认 `),e(i.CommonDialog,{modelValue:i.confirmVisible,"onUpdate:modelValue":n[16]||=e=>i.confirmVisible=e,title:i.$t(`@SCHED:删除任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`small`,width:`400px`,"z-index":3e6,"custom-class":`schedule-dialog-confirm`},{default:N(()=>[g(`p`,ar,S(i.$t(`@SCHED:确定删除「{name}」吗?已产生的会话会保留,但任务不再执行。`,{name:i.confirmTarget?.name||``})),1),g(`div`,or,[g(`button`,{type:`button`,class:`sch-btn`,onClick:n[15]||=e=>i.confirmVisible=!1},S(i.$t(`@SCHED:取消`)),1),g(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:i.confirmRemove},S(i.$t(`@SCHED:删除`)),1)])]),_:1},8,[`modelValue`,`title`])])}var cr=J(en,[[`render`,sr],[`__scopeId`,`data-v-63dc658b`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/SchedulePanel.vue`]]);c(),R();var lr=4e3,ur=f({__name:`AgentPromptSettings`,setup(e,{expose:t}){t();let n=Y(),{defaultPrompt:r,projectPrompts:i,loadOrchestrator:o,saveDefaultPrompt:s,saveProjectPrompt:c}=De(),l=j(``),u=j(!1),d=j(!1),f=G(()=>n.agentDefaultPrompt||``),p=G(()=>l.value.trim()!==f.value.trim());async function m(){if(!u.value&&p.value){u.value=!0;try{await n.saveAiSettings({agentDefaultPrompt:l.value})&&(l.value=f.value,d.value=!0,M.success(q(`@AGENT:已保存 g ai 默认提示词`)))}finally{u.value=!1}}}let h=G(()=>n.currentDirectory||``),g=G(()=>ue(h.value)||h.value),_=G(()=>{let e=se(h.value);return e&&i.value?.[e]?.prompt||``}),v=j(``),y=j(``),b=j(!1),x=j(!1),S=j(!1),C=G(()=>v.value.trim()!==(r.value||``).trim()||!!h.value&&y.value.trim()!==_.value.trim());function w(){v.value=r.value||``,y.value=_.value}a(async()=>{l.value=f.value,w();let e=await o(!0);S.value=!e,e&&w()});async function T(){if(!b.value&&C.value){b.value=!0;try{let e=!0,t=v.value.trim();t!==(r.value||``).trim()&&(e=await s(t));let n=y.value.trim();e&&h.value&&n!==_.value.trim()&&(e=await c(h.value,n)),e&&(w(),x.value=!0)}finally{b.value=!1}}}let E={configStore:n,defaultPrompt:r,projectPrompts:i,loadOrchestrator:o,saveDefaultPrompt:s,saveProjectPrompt:c,MAX_CHARS:lr,gaiDraft:l,savingGai:u,gaiSaved:d,gaiStored:f,gaiDirty:p,saveGai:m,projectPath:h,projectName:g,projectPrompt:_,globalDraft:v,projectDraft:y,savingDispatch:b,dispatchSaved:x,dispatchLoadFailed:S,dispatchDirty:C,syncDispatchDraft:w,saveDispatch:T,get $t(){return q}};return Object.defineProperty(E,"__isScriptSetup",{enumerable:!1,value:!0}),E}});F(),c(),V();var dr={class:`aps`},fr={class:`aps__scroll`},pr={class:`aps__head`},mr={class:`aps__title`},hr={class:`aps__intro`},gr={class:`aps__card aps__card--gai`},_r={class:`aps__card-head`},vr={class:`aps__card-title`},yr={class:`aps__count`},br={class:`aps__hint`},xr=[`placeholder`],Sr={class:`aps__foot`},Cr={key:0,class:`aps__saved`},wr=[`disabled`],Tr={class:`aps__card aps__card--dispatch`},Er={class:`aps__card-head`},Dr={class:`aps__card-title`},Or={class:`aps__hint`},kr={class:`aps__field`},Ar={class:`aps__card-head`},jr={class:`aps__label`,for:`aps-global`},Mr={class:`aps__count`},Nr=[`placeholder`],Pr={class:`aps__field`},Fr={class:`aps__card-head`},Ir={class:`aps__label`,for:`aps-project`},Lr={key:0,class:`aps__count`},Rr=[`disabled`,`placeholder`],zr={class:`aps__hint`},Br={class:`aps__foot`},Vr={key:0,class:`aps__saved`},Hr={key:1,class:`aps__saved`},Ur=[`disabled`];function Wr(e,t,n,r,i,a){return U(),_(`div`,dr,[g(`div`,fr,[g(`header`,pr,[g(`h3`,mr,S(r.$t(`@AGENT:提示词设置`)),1),g(`p`,hr,S(r.$t(`@AGENT:这里配的两块提示词,和 g ai 对话时每一轮都会自动带上。改完下一次发消息就生效,不用新开会话。`)),1)]),W(` ── ① g ai 智能体的默认提示词 ── `),g(`section`,gr,[g(`div`,_r,[g(`h4`,vr,S(r.$t(`@AGENT:g ai 智能体的默认提示词`)),1),g(`span`,yr,S(r.gaiDraft.length)+` / `+S(r.MAX_CHARS),1)]),g(`p`,br,S(r.$t(`@AGENT:只作用于 g ai 自己:每次对话都会带上(定时任务也一样)。派发出去的任务读不到这一段。`)),1),E(g(`textarea`,{id:`aps-gai`,"onUpdate:modelValue":t[0]||=e=>r.gaiDraft=e,class:`aps__area`,rows:`6`,maxlength:r.MAX_CHARS,placeholder:r.$t(`@AGENT:例如:回答用中文;改完代码先跑一遍验证再汇报;不要动 dist 目录`)},null,8,xr),[[H,r.gaiDraft]]),g(`div`,Sr,[r.gaiSaved&&!r.gaiDirty?(U(),_(`span`,Cr,S(r.$t(`@AGENT:已保存`)),1)):W(`v-if`,!0),t[3]||=g(`span`,{class:`aps__spacer`},null,-1),g(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:r.savingGai||!r.gaiDirty,onClick:r.saveGai},S(r.savingGai?r.$t(`@AGENT:保存中…`):r.$t(`@AGENT:保存`)),9,wr)])]),W(` ── ② 派发任务的提示词 ── `),g(`section`,Tr,[g(`div`,Er,[g(`h4`,Dr,S(r.$t(`@AGENT:派发任务的提示词`)),1)]),g(`p`,Or,S(r.$t(`@AGENT:与工作台「预设提示词」是同一份设置,在哪边改都一样。派发任务时附加在指令之前,和 g ai 对话时也会带上。`)),1),g(`div`,kr,[g(`div`,Ar,[g(`label`,jr,S(r.$t(`@AGENT:全局提示词`)),1),g(`span`,Mr,S(r.globalDraft.length)+` / `+S(r.MAX_CHARS),1)]),E(g(`textarea`,{id:`aps-global`,"onUpdate:modelValue":t[1]||=e=>r.globalDraft=e,class:`aps__area`,rows:`5`,maxlength:r.MAX_CHARS,placeholder:r.$t(`@AGENT:对所有项目生效。例如:回答用中文;改完代码必须跑一遍测试;不要动 dist 目录`)},null,8,Nr),[[H,r.globalDraft]])]),g(`div`,Pr,[g(`div`,Fr,[g(`label`,Ir,S(r.projectPath?r.$t(`@AGENT:「{name}」的项目提示词`,{name:r.projectName}):r.$t(`@AGENT:项目提示词`)),1),r.projectPath?(U(),_(`span`,Lr,S(r.projectDraft.length)+` / `+S(r.MAX_CHARS),1)):W(`v-if`,!0)]),E(g(`textarea`,{id:`aps-project`,"onUpdate:modelValue":t[2]||=e=>r.projectDraft=e,class:`aps__area`,rows:`5`,maxlength:r.MAX_CHARS,disabled:!r.projectPath,placeholder:r.projectPath?r.$t(`@AGENT:只在这个项目派发/对话时附加。例如:包管理器用 pnpm;改动集中在 src/ui 下`):r.$t(`@AGENT:当前没有打开项目,项目级提示词暂时不能设置`)},null,8,Rr),[[H,r.projectDraft]]),g(`p`,zr,S(r.projectPath?r.$t(`@AGENT:项目提示词追加在全局提示词之后(不覆盖全局),在「{name}」里派发或对话时一起带上`,{name:r.projectName}):r.$t(`@AGENT:先在左上角切到一个项目,才能设置它的提示词`)),1)]),g(`div`,Br,[r.dispatchSaved&&!r.dispatchDirty?(U(),_(`span`,Vr,S(r.$t(`@AGENT:已保存`)),1)):r.dispatchLoadFailed?(U(),_(`span`,Hr,S(r.$t(`@AGENT:读取设置失败,请稍后重试`)),1)):W(`v-if`,!0),t[4]||=g(`span`,{class:`aps__spacer`},null,-1),g(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:r.savingDispatch||!r.dispatchDirty,onClick:r.saveDispatch},S(r.savingDispatch?r.$t(`@AGENT:保存中…`):r.$t(`@AGENT:保存`)),9,Ur)])])])])}var Gr=J(ur,[[`render`,Wr],[`__scopeId`,`data-v-f9ada51b`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AgentPromptSettings.vue`]]);c(),R();var Kr=1100,qr=40,Jr=f({__name:`AgentView`,setup(e,{expose:n}){n();let i=Y(),o=ce(),s=j(null),{width:c,narrow:u}=Ce(s),d=j(`chat`),m=j(`chat`),h=G(()=>m.value===`mcp`?`mcp`:`skill`),g=(...e)=>f({render:()=>p(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`},e.map(e=>p(`path`,{d:e})))}),_=G(()=>[{id:`chat`,label:q(`@AGENT:对话`),icon:g(`M12 11v.01`,`M8 11v.01`,`M16 11v.01`,`M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-5l-5 3v-3h-2a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3l12 0`)},{id:`schedule`,label:q(`@AGENT:定时任务`),icon:g(`M5 13a7 7 0 1 0 14 0a7 7 0 0 0-14 0`,`M14.5 10.5l-2.5 2.5`,`M17 8l1-1`,`M14 3h-4`)},{id:`skill`,label:q(`@AGENT:Skill 广场`),icon:g(`M6.331 8h11.339a2 2 0 0 1 1.977 2.304l-1.255 8.152a3 3 0 0 1-2.966 2.544h-6.852a3 3 0 0 1-2.965-2.544l-1.255-8.152a2 2 0 0 1 1.977-2.304`,`M9 11v-5a3 3 0 0 1 6 0v5`)},{id:`mcp`,label:q(`@AGENT:MCP 广场`),icon:g(`M7 12l5 5l-1.5 1.5a3.536 3.536 0 1 1-5-5l1.5-1.5`,`M17 12l-5-5l1.5-1.5a3.536 3.536 0 1 1 5 5l-1.5 1.5`,`M3 21l2.5-2.5`,`M18.5 5.5l2.5-2.5`,`M10 11l-2 2`,`M13 14l-2 2`)},{id:`settings`,label:q(`@AGENT:设置`),icon:g(`M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 0 0-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 0 0-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 0 0-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 0 0-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 0 0 1.066-2.573c-.94-1.543.826-3.31 2.37-2.37c1 .608 2.296.07 2.572-1.065`,`M9 12a3 3 0 1 0 6 0a3 3 0 0 0-6 0`)}]),{sessions:y,sessionsLoading:b,currentSessionId:x,messages:S,displayMessages:C,isStreaming:w,sessionLoading:T,loadSessions:E,loadSession:D,deleteSession:O,renameSession:ee,newSession:k,sendMessage:A,retryTurn:M,questionPanel:N,answeringQuestion:P,answerQuestion:F,isSessionGenerating:I,currentEngine:L,pendingEngine:R,isEngineLocked:z,pickEngine:V,stop:H,inputContextUsage:te,queuedMessages:U,queuePaused:ne,removeQueuedMessage:W,flushQueued:re,silentMs:J}=xe(),ae=G(()=>z.value?L.value:R.value);function se(e){z.value||V(e)}let le=G(()=>{let e=i.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),ue=G(()=>{let e=i.models.find(e=>e.isDefault);return e&&(e.name||e.model)||``}),De=G(()=>fe(y.value,I)),X=de(),Oe=G(()=>De.value.find(e=>e.id===x.value)?.title||q(`@AGENT:对话`)),ke={"--welcome-avatar":`url("${be}")`},Ae=G(()=>oe(i.agentPresetPrompts));async function je(e){await A(e.text,e.files),await t(),Q()}async function Me(e){await A(e.prompt),await t(),Q()}let Ne=_e(),Z=j(null),Fe=ye();function Q(e=!0){Z.value?.scrollToBottom(e)}B(()=>S.value.length,()=>{t(()=>Q(!1))});function Ie(e){D(e),d.value=`chat`}function Le(e){e&&(m.value=`chat`,Ie(e))}function Re(){k(),d.value=`chat`}let ze=j(280),Be=j(!1),{convListCollapsed:Ve,setConvListCollapsed:He}=Ee();function Ue(e){if(Ve.value)return;Be.value=!0;let t=e.clientX,n=ze.value,r=e=>{let r=e.clientX-t,i=Math.max(200,Math.min(500,n+r));ze.value=i},i=()=>{Be.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}B(u,e=>{e||(d.value=`chat`)}),B(()=>[i.currentDirectory,w.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await E(),x.value&&!w.value&&!y.value.some(e=>e.sessionId===x.value)&&k()},{immediate:!0});let $=null;a(()=>{$=Pe(e=>{e.type===`task_finished`&&E().catch(()=>{})})}),v(()=>{$?.(),$=null});let We={configStore:i,gitStore:o,rootRef:s,width:c,narrow:u,TABS_SILENCE_MIN_WIDTH:Kr,chatPage:d,activeTab:m,marketplaceType:h,tablerIcon:g,tabs:_,sessions:y,sessionsLoading:b,currentSessionId:x,messages:S,displayMessages:C,isStreaming:w,sessionLoading:T,loadSessions:E,loadSession:D,deleteSession:O,renameSession:ee,newSession:k,sendMessage:A,retryTurn:M,questionPanel:N,answeringQuestion:P,answerQuestion:F,isSessionGenerating:I,currentEngine:L,pendingEngine:R,isEngineLocked:z,pickEngine:V,stop:H,inputContextUsage:te,queuedMessages:U,queuePaused:ne,removeQueuedMessage:W,flushQueued:re,silentMs:J,displayEngine:ae,handleEngineSelect:se,chatTheme:le,inputModelName:ue,conversationItems:De,conversationLabels:X,currentSessionTitle:Oe,welcomeAvatarStyle:ke,presetQuestions:Ae,onSend:je,onSelectPreset:Me,questionLabels:Ne,chatContainerRef:Z,queueLabels:Fe,scrollToBottom:Q,selectSession:Ie,handleScheduleOpenSession:Le,handleNewSession:Re,sidebarWidth:ze,isResizing:Be,convListCollapsed:Ve,setConvListCollapsed:He,CONV_RAIL_WIDTH:qr,startResize:Ue,get disposeScheduleEvents(){return $},set disposeScheduleEvents(e){$=e},get $t(){return q},get ElIcon(){return l},get Loading(){return r},get ChatContainer(){return K},get ConversationList(){return ie},get AGENT_UPLOAD_ACCEPT(){return me},get AGENT_ASSISTANT_NAME(){return ge},get AGENT_ASSISTANT_AVATAR(){return be},get MESSAGE_RAIL_CONFIG(){return pe},get MESSAGE_META_CONFIG(){return ve},get agentEngineName(){return he},MarketplacePanel:$t,SchedulePanel:cr,AgentPromptSettings:Gr,AgentEngineSelector:Se,CopySessionButton:we,ChatSilenceBadge:Te};return Object.defineProperty(We,"__isScriptSetup",{enumerable:!1,value:!0}),We}});c(),F();var Yr={ref:`rootRef`,class:`agent-view`},Xr={class:`agent-chat-area`},Zr={class:`agent-tabs`,role:`tablist`},Qr=[`aria-selected`,`onClick`],$r={class:`agent-tab-body`},ei={key:0,class:`agent-chat-pane`},ti={key:0,class:`agent-list-page`},ni={key:0,class:`agent-page-bar`},ri=[`title`,`aria-label`],ii={class:`agent-page-title`},ai={key:0,class:`chat-loading`};function oi(t,r,i,a,o,s){return U(),_(`div`,Yr,[W(` ═══ 宽屏:左侧会话列表(只在「对话」Tab 显示)═══
|
|
3
|
+
窄屏时这一整块不渲染,会话列表改成 body 里的一个整页(见 .agent-list-page) `),a.activeTab===`chat`&&!a.narrow?(U(),_(w,{key:0},[g(`aside`,{class:x([`agent-sidebar`,{"is-convs-collapsed":a.convListCollapsed}]),style:u({width:(a.convListCollapsed?a.CONV_RAIL_WIDTH:a.sidebarWidth)+`px`})},[W(` 会话列表:UI 与交互都在组件库的 ConversationList 里(含收起 / 展开) `),e(a.ConversationList,{class:`agent-conversations`,items:a.conversationItems,"active-id":a.currentSessionId,loading:a.sessionsLoading,labels:a.conversationLabels,collapsible:``,collapsed:a.convListCollapsed,"onUpdate:collapsed":a.setConvListCollapsed,onSelect:a.selectSession,onNew:a.handleNewSession,onRename:a.renameSession,onDelete:a.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`collapsed`,`onUpdate:collapsed`,`onRename`,`onDelete`])],6),W(` 拖拽分隔条(收起时藏起来:40px 的收纳条没有可拖的余地) `),a.convListCollapsed?W(`v-if`,!0):(U(),_(`div`,{key:0,class:x([`sidebar-resizer`,{active:a.isResizing}]),onMousedown:a.startResize},null,34))],64)):W(`v-if`,!0),W(` ═══ 右侧:Tab 栏 + 内容区 ═══ `),g(`main`,Xr,[g(`nav`,Zr,[(U(!0),_(w,null,C(a.tabs,t=>(U(),_(`button`,{key:t.id,type:`button`,class:x([`agent-tab`,{active:a.activeTab===t.id}]),role:`tab`,"aria-selected":a.activeTab===t.id,onClick:e=>a.activeTab=t.id},[e(a.ElIcon,null,{default:N(()=>[(U(),n(m(t.icon)))]),_:2},1024),g(`span`,null,S(t.label),1)],10,Qr))),128)),W(` ═══ 引擎选择器 ═══
|
|
4
|
+
与工作台执行器下拉同一套交互(点击展开、未安装标出来、点了直接开安装弹窗)。
|
|
5
|
+
下拉本体收口在 AgentEngineSelector,文件空间 g ai 面板复用同一份实现。
|
|
6
|
+
会话一旦落盘就置灰:引擎在会话建立时锁定(三家续聊标识互不通用),要换请新建。 `),a.activeTab===`chat`?(U(),n(a.AgentEngineSelector,{key:0,class:`agent-engine`,engine:a.displayEngine,locked:a.isEngineLocked,onSelect:a.handleEngineSelect},null,8,[`engine`,`locked`])):W(`v-if`,!0),W(` 复制整条会话(默认精简范围,小箭头可选全量)——与工作台的「复制执行内容」同一套口径 `),a.activeTab===`chat`?(U(),n(a.CopySessionButton,{key:1,class:`agent-copy`,messages:a.messages,title:a.currentSessionTitle,engine:a.agentEngineName(a.displayEngine)},null,8,[`messages`,`title`,`engine`])):W(`v-if`,!0),W(` 本轮静默:挂在 Tab 行最右端(与引擎 / 复制同一条右对齐线)。
|
|
7
|
+
等回答时不算静默 —— 那一轮挂着是在等用户点选项(见 ChatSilenceBadge 文件头)。 `),a.activeTab===`chat`&&a.width>=a.TABS_SILENCE_MIN_WIDTH?(U(),n(a.ChatSilenceBadge,{key:2,class:`agent-silence`,"silent-ms":a.silentMs,streaming:a.isStreaming&&!a.questionPanel},null,8,[`silent-ms`,`streaming`])):W(`v-if`,!0)]),g(`div`,$r,[W(` ── 对话 ── `),a.activeTab===`chat`?(U(),_(`div`,ei,[W(` 窄屏 · 会话列表页:列表独占整页 `),a.narrow&&a.chatPage===`list`?(U(),_(`div`,ti,[e(a.ConversationList,{class:`agent-conversations`,items:a.conversationItems,"active-id":a.currentSessionId,loading:a.sessionsLoading,labels:a.conversationLabels,onSelect:a.selectSession,onNew:a.handleNewSession,onRename:a.renameSession,onDelete:a.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])])):(U(),_(w,{key:1},[W(` 对话页(窄屏时顶上多一条返回条;宽屏左侧就摆着列表,不需要) `),a.narrow?(U(),_(`div`,ni,[g(`button`,{type:`button`,class:`agent-page-back`,title:a.$t(`@AGENT:返回会话列表`),"aria-label":a.$t(`@AGENT:返回会话列表`),onClick:r[0]||=e=>a.chatPage=`list`},[...r[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,ri),g(`span`,ii,S(a.currentSessionTitle),1)])):W(`v-if`,!0),W(`
|
|
8
|
+
对话宿主:单独开一层裁剪边界。
|
|
9
|
+
欢迎页在矮/窄窗口里会比可用高度还高,而它是垂直居中的 —— 溢出的部分
|
|
10
|
+
会**向上**跑出 .acu-chat,盖到刚加的返回条上(把返回条的点击也一起吃掉,
|
|
11
|
+
e2e 实测就是这个症状)。宿主的 overflow:hidden 把它裁在自己这一格里。
|
|
12
|
+
`),g(`div`,{class:`agent-chat-host`,style:a.welcomeAvatarStyle},[W(` 加载中 `),a.sessionLoading?(U(),_(`div`,ai,[e(a.ElIcon,{class:`is-loading`,size:32},{default:N(()=>[e(a.Loading)]),_:1}),g(`span`,null,S(a.$t(`@AGENT:加载会话中...`)),1)])):(U(),_(w,{key:1},[W(` ChatContainer `),e(a.ChatContainer,{ref:`chatContainerRef`,messages:a.displayMessages,"preset-questions":a.presetQuestions,"welcome-title":a.$t(`@AGENT:智能体助手`),"welcome-description":a.$t(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":a.AGENT_ASSISTANT_NAME,"assistant-avatar":a.AGENT_ASSISTANT_AVATAR,theme:a.chatTheme,generating:a.isStreaming,"allow-queue":!0,queued:a.queuedMessages,"queue-paused":a.queuePaused,"queue-labels":a.queueLabels,"upload-config":{accept:a.AGENT_UPLOAD_ACCEPT},"context-usage":a.inputContextUsage,"git-branch":a.gitStore.currentBranch||void 0,model:a.inputModelName||void 0,placeholder:a.isStreaming?a.$t(`@AGENT:生成中,发送后会排队,等本轮跑完自动接上…`):a.$t(`@AGENT:输入消息,Enter 发送`),question:a.questionPanel,"question-submitting":a.answeringQuestion,"question-labels":a.questionLabels,"plan-config":{labels:{title:a.$t(`@AGENT:计划`),raw:a.$t(`@AGENT:原始参数`)}},"message-rail-config":a.MESSAGE_RAIL_CONFIG,"message-meta-config":a.MESSAGE_META_CONFIG,onSend:a.onSend,onSelect:a.onSelectPreset,onStop:a.stop,onUnqueue:a.removeQueuedMessage,onFlushQueued:a.flushQueued,onAnswer:a.answerQuestion,onRetry:a.retryTurn},null,8,`messages.preset-questions.welcome-title.welcome-description.assistant-name.assistant-avatar.theme.generating.queued.queue-paused.queue-labels.upload-config.context-usage.git-branch.model.placeholder.question.question-submitting.question-labels.plan-config.message-rail-config.message-meta-config.onStop.onUnqueue.onFlushQueued.onAnswer.onRetry`.split(`.`))],2112))])],64))])):a.activeTab===`schedule`?(U(),_(w,{key:1},[W(` ── 定时任务 ── `),e(a.SchedulePanel,{onOpenSession:a.handleScheduleOpenSession})],2112)):a.activeTab===`skill`||a.activeTab===`mcp`?(U(),_(w,{key:2},[W(` ── Skill 广场 / MCP 广场 ── `),e(a.MarketplacePanel,{type:a.marketplaceType},null,8,[`type`])],2112)):(U(),_(w,{key:3},[W(` ── 设置(提示词设置)── `),e(a.AgentPromptSettings)],2112))])])],512)}var si=J(Jr,[[`render`,oi],[`__scopeId`,`data-v-bd681ddd`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/AgentView.vue`]]);export{si as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Bn as t,Cn as n,Dt as r,Gn as i,In as a,J as o,Mn as s,Sn as c,Tn as l,Un as u,W as d,Wr as f,Xr as p,gr as m,i as h,ir as g,jr as _,kn as v,lr as y,nr as b,nt as x,qn as S,r as C,tt as w,wn as T,xn as E,z as D}from"./element-plus-Bz6lYur-.js";import{n as O,t as k}from"./_plugin-vue_export-helper-
|
|
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(()=>{})})}a(),y();var F=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,I=s({__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:n,emit:i}){n();let a=e,o=i,s=m(null);b(()=>a.logs,async()=>{await t(),s.value&&(s.value.scrollTop=s.value.scrollHeight)});function c(){a.status!==`running`&&(a.status===`success`&&a.countdown>0&&o(`cancel`),o(`update:modelValue`,!1))}function l(){o(`retry`)}function u(){o(`restart`)}function d(){o(`cancel`),o(`update:modelValue`,!1)}async function f(){try{await navigator.clipboard.writeText(F),h.success(O(`@F13B4:已复制升级命令`))}catch{h.warning(O(`@F13B4:复制失败,请手动复制`))}}let p={MANUAL_COMMAND:F,props:a,emit:o,logEl:s,close:c,onRetry:l,onRestart:u,onLater:d,onCopyCommand:f,get Loading(){return r},get CircleCheck(){return w},get CircleClose(){return x},get $t(){return O},CommonDialog:A};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}});a(),_();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(t,r,i,a,s,u){let d=o,m=D;return S(),n(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:g(()=>[i.status===`failed`?(S(),n(m,{key:0,type:`primary`,onClick:a.onRetry},{default:g(()=>[v(p(a.$t(`@F13B4:重试`)),1)]),_:1})):T(`v-if`,!0),i.status===`failed`?(S(),n(m,{key:1,onClick:a.onCopyCommand},{default:g(()=>[v(p(a.$t(`@F13B4:复制升级命令`)),1)]),_:1})):T(`v-if`,!0),i.status===`success`?(S(),n(m,{key:2,type:`primary`,onClick:a.onRestart},{default:g(()=>[v(p(a.$t(`@F13B4:立即重启并刷新`)),1)]),_:1})):T(`v-if`,!0),i.status===`success`?(S(),n(m,{key:3,onClick:a.onLater},{default:g(()=>[v(p(a.$t(`@F13B4:稍后手动重启`)),1)]),_:1})):T(`v-if`,!0),i.status===`running`?(S(),n(m,{key:4,disabled:``},{default:g(()=>[v(p(a.$t(`@F13B4:升级中`))+`... `,1)]),_:1})):T(`v-if`,!0)]),default:g(()=>[c(`div`,{class:f([`upgrade-status`,`is-${i.status}`])},[i.status===`running`?(S(),n(d,{key:0,class:`is-loading`},{default:g(()=>[e(a.Loading)]),_:1})):i.status===`success`?(S(),n(d,{key:1,color:`var(--color-success)`},{default:g(()=>[e(a.CircleCheck)]),_:1})):(S(),n(d,{key:2,color:`var(--color-danger)`},{default:g(()=>[e(a.CircleClose)]),_:1})),i.status===`running`?(S(),l(`span`,L,p(a.$t(`@F13B4:升级中`)),1)):i.status===`success`?(S(),l(`span`,R,p(a.$t(`@F13B4:升级完成`)),1)):(S(),l(`span`,z,p(a.$t(`@F13B4:升级失败`)),1))],2),i.status===`success`?(S(),l(`p`,B,[v(p(a.$t(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),i.countdown>0?(S(),l(`span`,V,p(a.$t(`@F13B4:{seconds} 秒后自动刷新`,{seconds:i.countdown})),1)):T(`v-if`,!0)])):T(`v-if`,!0),i.status===`failed`?(S(),l(`p`,H,[c(`span`,U,p(a.$t(`@F13B4:手动升级命令`)),1),c(`code`,{class:`upgrade-manual__cmd`},p(a.MANUAL_COMMAND))])):T(`v-if`,!0),c(`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`]]);a(),y();var K=`https://github.com/xz333221/zen-gitsync/tags`,q=5,J=`app-version-check`,Y=36e5,X=s({__name:`AppVersionBadge`,setup(e,{expose:t}){t();let n=`2.18.16`,r=m(n),a=E(()=>r.value||n),o=m(null),s=m(!1),c=m(``),l=m(`running`),d=m(0),f=null,p=m(!1);function g(){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 _(e){try{sessionStorage.setItem(J,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function v(e=!1){let t=g();t&&(o.value=t);try{let t=await M();o.value=t,_(t),t.current&&(r.value=t.current),!e&&t.success&&t.hasUpdate&&h({type:`success`,message:O(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||h({type:`warning`,message:O(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function y(){if(o.value?.hasUpdate){try{await C.confirm(O(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:o.value.current,latest:o.value.latest}),O(`@F13B4:升级`),{confirmButtonText:O(`@F13B4:确定升级`),cancelButtonText:O(`@F13B4:取消`),type:`info`})}catch{return}c.value=``,l.value=`running`,s.value=!0,await N(e=>{if(e.type===`done`){if(l.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(J)}catch{}o.value?.latest&&(r.value=o.value.latest),b()}}else e.message&&(c.value+=e.message)})}}function b(){x(),d.value=q,f=setInterval(()=>{--d.value,d.value<=0&&(f&&=(clearInterval(f),null),w())},1e3)}function x(){f&&=(clearInterval(f),null),d.value=0}function S(){x()}async function w(){if(x(),!p.value){p.value=!0;try{let e=await P(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];h({type:`warning`,message:n?O(n):O(`@F13B4:重启失败 {error}`,{error:t})}),p.value=!1}}}u(()=>{x()}),i(()=>{v(!0)});let T={buildVersion:n,releasesUrl:K,runtimeVersion:r,displayVersion:a,latestInfo:o,upgradeDialogVisible:s,upgradeLogs:c,upgradeStatus:l,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:g,writeCache:_,checkUpdate:v,handleUpgrade:y,startAutoRefreshCountdown:b,cancelAutoRefreshCountdown:x,handleCancelAutoRefresh:S,handleRestart:w,get $t(){return O},UpgradeDialog:G};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}});a(),_();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(t,n,r,i,a,o){let s=d;return S(),l(`div`,Z,[T(` GitHub 链接 `),e(s,{content:i.$t(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:g(()=>[c(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i.$t(`@F13B4:在 GitHub 上查看源码`)},[...n[1]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[c(`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`]),T(` NPM 链接 `),e(s,{content:i.$t(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:g(()=>[c(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i.$t(`@F13B4:在 npm 上查看包`)},[...n[2]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,$)]),_:1},8,[`content`]),T(` 版本号 `),e(s,{content:i.$t(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:g(()=>[c(`a`,{href:i.releasesUrl,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+p(i.displayVersion),1)]),_:1},8,[`content`]),i.latestInfo?.hasUpdate?(S(),l(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),"aria-label":i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),onClick:i.handleUpgrade},[n[3]||=c(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),c(`span`,te,p(i.$t(`@F13B4:升级`)),1),c(`span`,ne,`v`+p(i.latestInfo.latest),1)],8,ee)):T(`v-if`,!0),e(i.UpgradeDialog,{modelValue:i.upgradeDialogVisible,"onUpdate:modelValue":n[0]||=e=>i.upgradeDialogVisible=e,logs:i.upgradeLogs,status:i.upgradeStatus,countdown:i.countdown,onRetry:i.handleUpgrade,onRestart:i.handleRestart,onCancel:i.handleCancelAutoRefresh},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}var ie=k(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};
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Bn as t,Cn as n,Dt as r,Gn as i,In as a,J as o,Mn as s,Sn as c,Tn as l,Un as u,W as d,Wr as f,Xr as p,gr as m,i as h,ir as g,jr as _,kn as v,lr as y,nr as b,nt as x,qn as S,r as C,tt as w,wn as T,xn as E,z as D}from"./element-plus-Bz6lYur-.js";import{n as O,t as k}from"./_plugin-vue_export-helper-D4DL0jyB.js";import{t as A}from"./CommonDialog-lhBO3OFL.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(()=>{})})}a(),y();var F=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,I=s({__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:n,emit:i}){n();let a=e,o=i,s=m(null);b(()=>a.logs,async()=>{await t(),s.value&&(s.value.scrollTop=s.value.scrollHeight)});function c(){a.status!==`running`&&(a.status===`success`&&a.countdown>0&&o(`cancel`),o(`update:modelValue`,!1))}function l(){o(`retry`)}function u(){o(`restart`)}function d(){o(`cancel`),o(`update:modelValue`,!1)}async function f(){try{await navigator.clipboard.writeText(F),h.success(O(`@F13B4:已复制升级命令`))}catch{h.warning(O(`@F13B4:复制失败,请手动复制`))}}let p={MANUAL_COMMAND:F,props:a,emit:o,logEl:s,close:c,onRetry:l,onRestart:u,onLater:d,onCopyCommand:f,get Loading(){return r},get CircleCheck(){return w},get CircleClose(){return x},get $t(){return O},CommonDialog:A};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}});a(),_();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(t,r,i,a,s,u){let d=o,m=D;return S(),n(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:g(()=>[i.status===`failed`?(S(),n(m,{key:0,type:`primary`,onClick:a.onRetry},{default:g(()=>[v(p(a.$t(`@F13B4:重试`)),1)]),_:1})):T(`v-if`,!0),i.status===`failed`?(S(),n(m,{key:1,onClick:a.onCopyCommand},{default:g(()=>[v(p(a.$t(`@F13B4:复制升级命令`)),1)]),_:1})):T(`v-if`,!0),i.status===`success`?(S(),n(m,{key:2,type:`primary`,onClick:a.onRestart},{default:g(()=>[v(p(a.$t(`@F13B4:立即重启并刷新`)),1)]),_:1})):T(`v-if`,!0),i.status===`success`?(S(),n(m,{key:3,onClick:a.onLater},{default:g(()=>[v(p(a.$t(`@F13B4:稍后手动重启`)),1)]),_:1})):T(`v-if`,!0),i.status===`running`?(S(),n(m,{key:4,disabled:``},{default:g(()=>[v(p(a.$t(`@F13B4:升级中`))+`... `,1)]),_:1})):T(`v-if`,!0)]),default:g(()=>[c(`div`,{class:f([`upgrade-status`,`is-${i.status}`])},[i.status===`running`?(S(),n(d,{key:0,class:`is-loading`},{default:g(()=>[e(a.Loading)]),_:1})):i.status===`success`?(S(),n(d,{key:1,color:`var(--color-success)`},{default:g(()=>[e(a.CircleCheck)]),_:1})):(S(),n(d,{key:2,color:`var(--color-danger)`},{default:g(()=>[e(a.CircleClose)]),_:1})),i.status===`running`?(S(),l(`span`,L,p(a.$t(`@F13B4:升级中`)),1)):i.status===`success`?(S(),l(`span`,R,p(a.$t(`@F13B4:升级完成`)),1)):(S(),l(`span`,z,p(a.$t(`@F13B4:升级失败`)),1))],2),i.status===`success`?(S(),l(`p`,B,[v(p(a.$t(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),i.countdown>0?(S(),l(`span`,V,p(a.$t(`@F13B4:{seconds} 秒后自动刷新`,{seconds:i.countdown})),1)):T(`v-if`,!0)])):T(`v-if`,!0),i.status===`failed`?(S(),l(`p`,H,[c(`span`,U,p(a.$t(`@F13B4:手动升级命令`)),1),c(`code`,{class:`upgrade-manual__cmd`},p(a.MANUAL_COMMAND))])):T(`v-if`,!0),c(`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`]]);a(),y();var K=`https://github.com/xz333221/zen-gitsync/tags`,q=5,J=`app-version-check`,Y=36e5,X=s({__name:`AppVersionBadge`,setup(e,{expose:t}){t();let n=`2.18.18`,r=m(n),a=E(()=>r.value||n),o=m(null),s=m(!1),c=m(``),l=m(`running`),d=m(0),f=null,p=m(!1);function g(){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 _(e){try{sessionStorage.setItem(J,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function v(e=!1){let t=g();t&&(o.value=t);try{let t=await M();o.value=t,_(t),t.current&&(r.value=t.current),!e&&t.success&&t.hasUpdate&&h({type:`success`,message:O(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||h({type:`warning`,message:O(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function y(){if(o.value?.hasUpdate){try{await C.confirm(O(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:o.value.current,latest:o.value.latest}),O(`@F13B4:升级`),{confirmButtonText:O(`@F13B4:确定升级`),cancelButtonText:O(`@F13B4:取消`),type:`info`})}catch{return}c.value=``,l.value=`running`,s.value=!0,await N(e=>{if(e.type===`done`){if(l.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(J)}catch{}o.value?.latest&&(r.value=o.value.latest),b()}}else e.message&&(c.value+=e.message)})}}function b(){x(),d.value=q,f=setInterval(()=>{--d.value,d.value<=0&&(f&&=(clearInterval(f),null),w())},1e3)}function x(){f&&=(clearInterval(f),null),d.value=0}function S(){x()}async function w(){if(x(),!p.value){p.value=!0;try{let e=await P(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];h({type:`warning`,message:n?O(n):O(`@F13B4:重启失败 {error}`,{error:t})}),p.value=!1}}}u(()=>{x()}),i(()=>{v(!0)});let T={buildVersion:n,releasesUrl:K,runtimeVersion:r,displayVersion:a,latestInfo:o,upgradeDialogVisible:s,upgradeLogs:c,upgradeStatus:l,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:g,writeCache:_,checkUpdate:v,handleUpgrade:y,startAutoRefreshCountdown:b,cancelAutoRefreshCountdown:x,handleCancelAutoRefresh:S,handleRestart:w,get $t(){return O},UpgradeDialog:G};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}});a(),_();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(t,n,r,i,a,o){let s=d;return S(),l(`div`,Z,[T(` GitHub 链接 `),e(s,{content:i.$t(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:g(()=>[c(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i.$t(`@F13B4:在 GitHub 上查看源码`)},[...n[1]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[c(`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`]),T(` NPM 链接 `),e(s,{content:i.$t(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:g(()=>[c(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i.$t(`@F13B4:在 npm 上查看包`)},[...n[2]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,$)]),_:1},8,[`content`]),T(` 版本号 `),e(s,{content:i.$t(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:g(()=>[c(`a`,{href:i.releasesUrl,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+p(i.displayVersion),1)]),_:1},8,[`content`]),i.latestInfo?.hasUpdate?(S(),l(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),"aria-label":i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),onClick:i.handleUpgrade},[n[3]||=c(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),c(`span`,te,p(i.$t(`@F13B4:升级`)),1),c(`span`,ne,`v`+p(i.latestInfo.latest),1)],8,ee)):T(`v-if`,!0),e(i.UpgradeDialog,{modelValue:i.upgradeDialogVisible,"onUpdate:modelValue":n[0]||=e=>i.upgradeDialogVisible=e,logs:i.upgradeLogs,status:i.upgradeStatus,countdown:i.countdown,onRetry:i.handleUpgrade,onRestart:i.handleRestart,onCancel:i.handleCancelAutoRefresh},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}var ie=k(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,4 @@
|
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Cn as t,F as n,Ft as r,G as i,I as a,In as o,J as s,K as c,Mn as l,Sn as u,Tn as d,U as f,Wr as p,Xr as m,Yn as h,_ as g,_n as _,et as v,gr as y,hn as b,ir as x,jr as S,jt as C,lr as w,on as T,qn as E,wn as D,xn as O}from"./element-plus-Bz6lYur-.js";import{n as k,t as A}from"./_plugin-vue_export-helper-D4DL0jyB.js";import{t as j}from"./CommonDialog-lhBO3OFL.js";import{ct as M,st as N}from"./index-DRDito6l.js";o(),w();var P=l({__name:`BranchSelector`,emits:[`branchChanged`],setup(e,{expose:t,emit:n}){t();let i=N(),a=n,o=y(!1),s=y(``),c=O(()=>{let e=s.value.trim().toLowerCase();return e?i.allBranches.filter(t=>t.toLowerCase().includes(e)):i.allBranches});async function l(e){if(e===i.currentBranch){o.value=!1;return}o.value=!1,await i.changeBranch(e)&&(a(`branchChanged`),i.refreshLog())}let u=y(!1),d=y(``),f=y(``);function p(){o.value=!1,f.value=i.currentBranch,u.value=!0}async function m(){await i.createBranch(d.value,f.value)&&(u.value=!1,d.value=``,a(`branchChanged`))}let h=y(!1);async function g(){if(!h.value){h.value=!0;try{await Promise.all([i.getCurrentBranch(!0),i.getBranchStatus(!0),i.getAllBranches()]),a(`branchChanged`),i.refreshLog()}finally{h.value=!1}}}let _={gitStore:i,emit:a,branchPopoverVisible:o,branchFilter:s,filteredBranches:c,selectBranch:l,createBranchDialogVisible:u,newBranchName:d,selectedBaseBranch:f,openCreateBranchDialog:p,createNewBranch:m,isRefreshingBranch:h,refreshCurrentBranch:g,get $t(){return k},get Plus(){return r},get Menu(){return C},get Check(){return v},CommonDialog:j,IconButton:M};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}});o(),S(),T();var F={key:0,class:`branch-info`},I={class:`branch-wrapper`},L={class:`branch-btn`},R={class:`branch-btn-name`},z={class:`branch-btn-caret`},B={class:`branch-popover-inner`},V={class:`branch-search`},H={class:`branch-list`},U=[`onClick`],W={key:1,class:`branch-item-check-placeholder`},G={class:`branch-item-name`},K={key:0,class:`branch-empty`},q={class:`branch-popover-footer`},J={class:`create-branch-content`},Y={class:`form-label`},X={class:`form-label`},Z={class:`dialog-footer`},Q={class:`footer-actions`},$=[`disabled`];function ee(r,o,l,v,y,S){let C=s,w=f,T=g,O=c,k=n,A=a,j=i;return v.gitStore.currentBranch?(E(),d(`div`,F,[u(`div`,I,[D(` VSCode 风格分支按钮 + 弹出列表 `),e(T,{visible:v.branchPopoverVisible,"onUpdate:visible":o[1]||=e=>v.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:o[2]||=e=>v.branchFilter=``},{reference:x(()=>[u(`button`,L,[D(` git-branch.svg(Tabler icons,MIT) `),o[8]||=u(`svg`,{class:`branch-btn-icon`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[u(`path`,{d:`M5 18a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M5 6a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M15 6a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M7 8l0 8`}),u(`path`,{d:`M9 18h6a2 2 0 0 0 2-2v-5`}),u(`path`,{d:`M14 14l3-3l3 3`})],-1),u(`span`,R,m(v.gitStore.currentBranch),1),u(`span`,z,[D(` chevron-down.svg(Tabler icons,MIT) `),e(C,null,{default:x(()=>[...o[7]||=[u(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[u(`path`,{d:`M6 9l6 6l6 -6`})],-1)]]),_:1})])])]),default:x(()=>[u(`div`,B,[D(` 搜索框 `),u(`div`,V,[e(w,{modelValue:v.branchFilter,"onUpdate:modelValue":o[0]||=e=>v.branchFilter=e,placeholder:v.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),D(` 分支列表 `),u(`div`,H,[(E(!0),d(_,null,h(v.filteredBranches,n=>(E(),d(`div`,{key:n,class:p([`branch-item`,{"is-active":n===v.gitStore.currentBranch}]),onClick:e=>v.selectBranch(n)},[n===v.gitStore.currentBranch?(E(),t(C,{key:0,class:`branch-item-check`},{default:x(()=>[e(v.Check)]),_:1})):(E(),d(`span`,W)),D(` git-branch.svg(Tabler icons,MIT) `),o[9]||=u(`svg`,{class:`branch-item-icon`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[u(`path`,{d:`M5 18a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M5 6a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M15 6a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M7 8l0 8`}),u(`path`,{d:`M9 18h6a2 2 0 0 0 2-2v-5`}),u(`path`,{d:`M14 14l3-3l3 3`})],-1),u(`span`,G,m(n),1)],10,U))),128)),v.filteredBranches.length===0?(E(),d(`div`,K,m(v.$t(`@F13B4:没有匹配的分支`)),1)):D(`v-if`,!0)]),D(` 底部:创建新分支 `),u(`div`,q,[u(`button`,{class:`branch-create-btn`,onClick:v.openCreateBranchDialog},[e(C,null,{default:x(()=>[e(v.Plus)]),_:1}),u(`span`,null,m(v.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),D(` 刷新按钮(size=small:与 RemoteRepoCard 状态栏那两颗同档。
|
|
2
|
+
IconButton 默认走 medium = 38px 盒 / 20px 字形(--icon-glyph-size-md),
|
|
3
|
+
比邻居大一整档 —— 用户 2026-10-16 反馈"footer 这枚刷新比其他的都大"。
|
|
4
|
+
图标本身本来就是 Tabler refresh,不用换。) `),e(v.IconButton,{size:`small`,tooltip:v.$t(`@CMDCON:刷新`),onClick:v.refreshCurrentBranch},{default:x(()=>[D(` refresh.svg(Tabler icons,MIT) `),e(C,{class:p({"is-loading":v.isRefreshingBranch})},{default:x(()=>[...o[10]||=[u(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[u(`path`,{d:`M20 11a8.1 8.1 0 0 0-15.5-2m-.5-4v4h4`}),u(`path`,{d:`M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4`})],-1)]]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),D(` 创建分支对话框 `),e(v.CommonDialog,{modelValue:v.createBranchDialogVisible,"onUpdate:modelValue":o[6]||=e=>v.createBranchDialogVisible=e,title:v.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:x(()=>[u(`div`,Z,[u(`div`,Q,[u(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:o[5]||=e=>v.createBranchDialogVisible=!1},m(v.$t(`@F13B4:取消`)),1),u(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:v.createNewBranch,disabled:v.gitStore.isCreatingBranch},[v.gitStore.isCreatingBranch?(E(),t(C,{key:1,class:`is-loading`},{default:x(()=>[...o[11]||=[u(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[u(`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})):(E(),t(C,{key:0},{default:x(()=>[e(v.Check)]),_:1})),u(`span`,null,m(v.$t(`@F13B4:创建`)),1)],8,$)])])]),default:x(()=>[u(`div`,J,[e(j,{model:{newBranchName:v.newBranchName,selectedBaseBranch:v.selectedBaseBranch},"label-position":`top`},{default:x(()=>[e(O,null,{label:x(()=>[u(`div`,Y,[e(C,{class:`label-icon`},{default:x(()=>[e(v.Plus)]),_:1}),u(`span`,null,m(v.$t(`@F13B4:新分支名称`)),1)])]),default:x(()=>[e(w,{modelValue:v.newBranchName,"onUpdate:modelValue":o[3]||=e=>v.newBranchName=e,placeholder:v.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:b(v.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),e(O,null,{label:x(()=>[u(`div`,X,[e(C,{class:`label-icon`},{default:x(()=>[e(v.Menu)]),_:1}),u(`span`,null,m(v.$t(`@F13B4:基于分支`)),1)])]),default:x(()=>[e(A,{modelValue:v.selectedBaseBranch,"onUpdate:modelValue":o[4]||=e=>v.selectedBaseBranch=e,placeholder:v.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:x(()=>[(E(!0),d(_,null,h(v.gitStore.allBranches,e=>(E(),t(k,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):D(`v-if`,!0)}var te=A(P,[[`render`,ee],[`__scopeId`,`data-v-9548a76f`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{te as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Bn as t,C as n,Cn as r,Gn as i,In as a,J as o,Mn as s,S as c,Sn as l,Tn as u,Un as d,Wr as f,Xr as p,Y as m,Yn as h,_n as g,et as ee,gr as _,i as v,ir as y,jr as b,kn as x,lr as S,qn as C,w,wn as T,xn as E}from"./element-plus-Bz6lYur-.js";import{n as D,t as O}from"./_plugin-vue_export-helper-
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Bn as t,C as n,Cn as r,Gn as i,In as a,J as o,Mn as s,S as c,Sn as l,Tn as u,Un as d,Wr as f,Xr as p,Y as m,Yn as h,_n as g,et as ee,gr as _,i as v,ir as y,jr as b,kn as x,lr as S,qn as C,w,wn as T,xn as E}from"./element-plus-Bz6lYur-.js";import{n as D,t as O}from"./_plugin-vue_export-helper-D4DL0jyB.js";import{t as k}from"./SvgIcon-CfjWD31j.js";import{c as A,l as j,s as te,t as ne}from"./configStore-BmWis0h4.js";import{t as re}from"./toolsStore-CmVXtAw_.js";import{E as ie,G as ae}from"./index-DRDito6l.js";import{f as oe,h as M,m as se,n as ce,p as le}from"./agentConversations-DJ8rPauy.js";import{n as ue}from"./relativeTime-BpGKkKiW.js";a(),S();function N(e,n=680){let r=_(0),a=null;function o(){let t=e.value;return t?(r.value=t.clientWidth,typeof ResizeObserver>`u`||(a=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(r.value=t)}),a.observe(t),!0)):!1}return i(()=>{o()||t(()=>o())}),d(()=>{a?.disconnect(),a=null}),{width:r,narrow:E(()=>r.value>0&&r.value<n)}}S();var P=`agent.convListCollapsed.v1`;function F(){try{return localStorage.getItem(P)===`1`}catch{return!1}}var I=_(F());function L(){function e(e){I.value=e;try{localStorage.setItem(P,e?`1`:`0`)}catch{}}return{convListCollapsed:I,setConvListCollapsed:e}}a();function R(){let e=ne(),t=re(),n=E({get:()=>e.resolvedTaskExecutor,set:t=>{A(t)&&e.setLastTaskExecutor(t)}}),r=E(()=>({claude:t.claudeAvailable,opencode:t.opencodeAvailable,codex:t.codexAvailable,codebuddy:t.codebuddyAvailable,pi:t.piAvailable})),i=E(()=>te.some(e=>r.value[e.id])),a=E(()=>r.value[n.value]?n.value:Object.keys(r.value).find(e=>r.value[e])??n.value);function o(e){r.value[e]&&(n.value=e)}function s(e){return t.executorModelText(e)}function c(e){return[s(e),t.executorModelDetail(e)].filter(Boolean).join(` · `)}return{selected:n,active:a,availability:r,hasAnyExecutor:i,choose:o,executorModelText:s,executorModelTitle:c}}a(),S();var z=s({__name:`AgentEngineSelector`,props:{engine:{type:String,required:!0},locked:{type:Boolean,required:!1}},emits:[`select`],setup(e,{expose:t,emit:r}){t();let i=e,a=r,{availability:s}=R(),l=E(()=>se(i.engine)),u=E(()=>({gai:!0,...s.value})),d=_(!1),f=_(null);function p(e){if(!i.locked){if(!u.value[e]){if(!M(e))return;f.value=e,d.value=!0;return}a(`select`,e)}}let h={props:i,emit:a,executorAvailability:s,engineName:l,engineAvailability:u,installDialogVisible:d,installTool:f,onCommand:p,get $t(){return D},get ElIcon(){return o},get ElDropdown(){return c},get ElDropdownMenu(){return w},get ElDropdownItem(){return n},get ArrowDown(){return m},get Check(){return ee},get AGENT_ENGINE_OPTIONS(){return oe},get BUILTIN_ENGINE_ICON(){return le},get isExternalAgentEngine(){return M},SvgIcon:k,TaskExecutorIcon:ie,ToolInstallDialog:ae};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}});a(),b();var B={class:`agent-engine`},V=[`disabled`,`title`,`aria-label`],H={class:`agent-engine__name`},U={class:`agent-engine__item`},de={class:`agent-engine__item-name`},fe={key:3,class:`agent-engine__item-missing`};function pe(t,n,i,a,o,s){return C(),u(g,null,[T(` 单根包一层:父级传下来的 class(Tab 行的 margin-left:auto、面板的 flex:none)
|
|
2
2
|
才能可靠落到这里 —— 多根组件会丢掉 fallthrough class。 `),l(`div`,B,[e(a.ElDropdown,{trigger:`click`,onCommand:a.onCommand},{dropdown:y(()=>[e(a.ElDropdownMenu,null,{default:y(()=>[(C(!0),u(g,null,h(a.AGENT_ENGINE_OPTIONS,t=>(C(),r(a.ElDropdownItem,{key:t.id,command:t.id},{default:y(()=>[l(`span`,U,[a.isExternalAgentEngine(t.id)?(C(),r(a.TaskExecutorIcon,{key:0,executor:t.id,class:`agent-engine__item-icon`},null,8,[`executor`])):(C(),r(a.SvgIcon,{key:1,"icon-class":a.BUILTIN_ENGINE_ICON,class:`agent-engine__item-icon`},null,8,[`icon-class`])),l(`span`,de,p(t.name),1),i.engine===t.id?(C(),r(a.ElIcon,{key:2,class:`agent-engine__item-check`},{default:y(()=>[e(a.Check)]),_:1})):a.engineAvailability[t.id]?T(`v-if`,!0):(C(),u(`span`,fe,p(a.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`]))),128))]),_:1})]),default:y(()=>[l(`button`,{type:`button`,class:f([`agent-engine__btn`,{"is-locked":i.locked}]),disabled:i.locked,title:i.locked?a.$t(`@AGENT:本会话的引擎已锁定;要换引擎请新建会话`):a.$t(`@AGENT:新建会话使用的引擎`),"aria-label":a.$t(`@AGENT:智能体引擎`)},[a.isExternalAgentEngine(i.engine)?(C(),r(a.TaskExecutorIcon,{key:0,executor:i.engine,class:`agent-engine__icon`},null,8,[`executor`])):(C(),r(a.SvgIcon,{key:1,"icon-class":a.BUILTIN_ENGINE_ICON,class:`agent-engine__icon`},null,8,[`icon-class`])),l(`span`,H,p(a.engineName),1),e(a.ElIcon,{class:`agent-engine__caret`},{default:y(()=>[e(a.ArrowDown)]),_:1})],10,V)]),_:1}),e(a.ToolInstallDialog,{modelValue:a.installDialogVisible,"onUpdate:modelValue":n[0]||=e=>a.installDialogVisible=e,tool:a.installTool},null,8,[`modelValue`,`tool`])])],2112)}var me=O(z,[[`render`,pe],[`__scopeId`,`data-v-c67a4d14`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AgentEngineSelector.vue`]]),he=8192;function ge(e,t){return e.length>t?`…(前文已截断)\n${e.slice(-t)}`:e}function _e(e,t){let n=e||`done`;return n!==`pending`&&n!==`running`||t===`running`||t===`pending`?n:t===`cancelled`||t===`error`?`error`:`done`}function W(e){let t=e?.toolCalls;if(!Array.isArray(t)||t.length===0)return[];let n=e?.status||`done`,r=[];for(let e=0;e<t.length;e++){let i=t[e];if(!i||typeof i!=`object`)continue;let a=_e(i.status,n),o=typeof i.result==`string`?i.result:``;r.push({id:typeof i.id==`string`&&i.id?i.id:`tool-${e}`,name:typeof i.name==`string`?i.name:``,argsPreview:typeof i.argsPreview==`string`?i.argsPreview:``,arguments:typeof i.arguments==`string`?i.arguments:``,result:o?ge(o,he):``,status:a,error:typeof i.error==`string`&&i.error?i.error:void 0})}return r}var ve=`
|
|
3
3
|
|
|
4
4
|
---
|