zen-gitsync 2.17.40 → 2.17.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +6 -6
  2. package/package.json +7 -2
  3. package/src/config.js +69 -44
  4. package/src/ui/public/assets/{AgentEngineSelector-BXRU9N3n.js → AgentEngineSelector-CSHgQmBZ.js} +1 -1
  5. package/src/ui/public/assets/AgentEngineSelector-D7DmG6PU.css +1 -0
  6. package/src/ui/public/assets/{AgentView-YQuKBxoC.js → AgentView-I_fQFLKK.js} +1 -1
  7. package/src/ui/public/assets/AgentView-h2YnbB7J.css +1 -0
  8. package/src/ui/public/assets/{AppVersionBadge-CSOyKuxL.js → AppVersionBadge-CBSMyORM.js} +2 -2
  9. package/src/ui/public/assets/AppVersionBadge-XszX3cSC.css +1 -0
  10. package/src/ui/public/assets/{BranchSelector-mcQyh4sc.js → BranchSelector-Dus0Co03.js} +1 -1
  11. package/src/ui/public/assets/CommitForm-C7ydqzWG.css +1 -0
  12. package/src/ui/public/assets/{CommitForm-DcVysfJZ.js → CommitForm-DZfqHlWx.js} +3 -3
  13. package/src/ui/public/assets/{CommonDialog-CFLZuomi.js → CommonDialog-BaaWQMm0.js} +1 -1
  14. package/src/ui/public/assets/EditorView-4yWirn4A.js +1 -0
  15. package/src/ui/public/assets/EditorView-CzrwLEbB.css +1 -0
  16. package/src/ui/public/assets/FileDiffViewer-CtP7u1L7.css +1 -0
  17. package/src/ui/public/assets/{FileDiffViewer-BrrqMLh8.js → FileDiffViewer-qC3HjA4L.js} +4 -4
  18. package/src/ui/public/assets/{FlowExecutionViewer-BucjKlcc.js → FlowExecutionViewer-Baabatxd.js} +1 -1
  19. package/src/ui/public/assets/FlowOrchestrationWorkspace-DLt_i4gs.css +1 -0
  20. package/src/ui/public/assets/{FlowOrchestrationWorkspace-yUPhhUL9.js → FlowOrchestrationWorkspace-teHyeO3I.js} +2 -2
  21. package/src/ui/public/assets/{IconButton-BSJ5FhS5.js → IconButton-8QwNIEIr.js} +1 -1
  22. package/src/ui/public/assets/IconButton-DmetnIEM.css +1 -0
  23. package/src/ui/public/assets/{LogList-6iOkdR0p.js → LogList-BMm64HIx.js} +2 -2
  24. package/src/ui/public/assets/LogList-DViWAYe9.css +1 -0
  25. package/src/ui/public/assets/{MindmapView-Dc7VRSLk.js → MindmapView-CemLoVSh.js} +1 -1
  26. package/src/ui/public/assets/MindmapView-D_tEBhMg.css +1 -0
  27. package/src/ui/public/assets/{MonitorView-B8tcPtiX.js → MonitorView-DolfvhpN.js} +1 -1
  28. package/src/ui/public/assets/MonitorView-nh6LB-oh.css +1 -0
  29. package/src/ui/public/assets/ProjectStartupButton-BWGIWiPF.css +1 -0
  30. package/src/ui/public/assets/{ProjectStartupButton-CPGw8eiW.js → ProjectStartupButton-DzzIon_u.js} +1 -1
  31. package/src/ui/public/assets/RecentDirectoriesChat-BxbpKrXc.css +1 -0
  32. package/src/ui/public/assets/{RecentDirectoriesChat-C0lQ_zmQ.js → RecentDirectoriesChat-ciDAbG1B.js} +1 -1
  33. package/src/ui/public/assets/RemoteManagerDialog-DecRuME6.css +1 -0
  34. package/src/ui/public/assets/{RemoteManagerDialog-CGuGZSse.js → RemoteManagerDialog-DydRnKaP.js} +1 -1
  35. package/src/ui/public/assets/RemoteRepoCard-DJkEGjRM.css +1 -0
  36. package/src/ui/public/assets/RemoteRepoCard-i-0LnQMD.js +1 -0
  37. package/src/ui/public/assets/{SourceMapView-OwBvsqME.js → SourceMapView-BV5r3wZE.js} +3 -3
  38. package/src/ui/public/assets/SourceMapView-W3kEDGi8.css +1 -0
  39. package/src/ui/public/assets/{SvgIcon-CevyX7lX.js → SvgIcon-7IDEgoQx.js} +1 -1
  40. package/src/ui/public/assets/{TemplateManager-BtpsyfbK.js → TemplateManager-6FX2EdMq.js} +1 -1
  41. package/src/ui/public/assets/TemplateManager-6liTCBpW.css +1 -0
  42. package/src/ui/public/assets/{UserInputNode-BPTWXh5G.js → UserInputNode-Dajnb5r1.js} +1 -1
  43. package/src/ui/public/assets/UserInputNode-wfqZIucW.css +1 -0
  44. package/src/ui/public/assets/WorkbenchView-DfHNBWS0.css +1 -0
  45. package/src/ui/public/assets/WorkbenchView-trn3xPiX.js +20 -0
  46. package/src/ui/public/assets/{_plugin-vue_export-helper-DF39dMex.js → _plugin-vue_export-helper-Dp1lG95_.js} +4 -4
  47. package/src/ui/public/assets/agentConversations-FiD_iarB.js +6 -0
  48. package/src/ui/public/assets/configStore-wR8LDvKB.js +1 -0
  49. package/src/ui/public/assets/{gitStore-1o5Sp0mh.js → gitStore-D4L9bpMp.js} +1 -1
  50. package/src/ui/public/assets/index-Bu08kcaz.js +29 -0
  51. package/src/ui/public/assets/index-DdSWvL8M.css +1 -0
  52. package/src/ui/public/assets/{previewSandbox-BioBqkiI.js → previewSandbox-BHijazEq.js} +1 -1
  53. package/src/ui/public/assets/previewSandbox-BeiZ2CBl.css +1 -0
  54. package/src/ui/public/assets/{toolsStore-DozQNwtU.js → toolsStore-BGwhTEUD.js} +1 -1
  55. package/src/ui/public/index.html +16 -16
  56. package/src/ui/server/routes/config.js +13 -16
  57. package/src/ui/server/routes/workbench/projectRegistry.js +39 -0
  58. package/src/ui/server/routes/workbench/projectRegistry.test.js +48 -0
  59. package/src/ui/public/assets/AgentEngineSelector-DR3r5eQE.css +0 -1
  60. package/src/ui/public/assets/AgentView-D87GB-H9.css +0 -1
  61. package/src/ui/public/assets/AppVersionBadge--5If494j.css +0 -1
  62. package/src/ui/public/assets/CommitForm-94maYxfo.css +0 -1
  63. package/src/ui/public/assets/EditorView-BS4GfwaQ.js +0 -1
  64. package/src/ui/public/assets/EditorView-BsuQfcO4.css +0 -1
  65. package/src/ui/public/assets/FileDiffViewer-B6zy6NiA.css +0 -1
  66. package/src/ui/public/assets/FlowOrchestrationWorkspace-CM2_9TW3.css +0 -1
  67. package/src/ui/public/assets/IconButton-W2X09OKH.css +0 -1
  68. package/src/ui/public/assets/LogList-DLxxk9NX.css +0 -1
  69. package/src/ui/public/assets/MindmapView-C4xg3TwX.css +0 -1
  70. package/src/ui/public/assets/MonitorView-BWOQfPtI.css +0 -1
  71. package/src/ui/public/assets/ProjectStartupButton-VoQqFee4.css +0 -1
  72. package/src/ui/public/assets/RecentDirectoriesChat-o4xK1Koc.css +0 -1
  73. package/src/ui/public/assets/RemoteManagerDialog-BSOph2h2.css +0 -1
  74. package/src/ui/public/assets/RemoteRepoCard-CG9WPcA_.css +0 -1
  75. package/src/ui/public/assets/RemoteRepoCard-DbflPz65.js +0 -1
  76. package/src/ui/public/assets/SourceMapView-CO_BZJKu.css +0 -1
  77. package/src/ui/public/assets/TemplateManager-DiM3vrbf.css +0 -1
  78. package/src/ui/public/assets/UserInputNode-d-oRXM_J.css +0 -1
  79. package/src/ui/public/assets/WorkbenchView-CSRMrK-l.js +0 -20
  80. package/src/ui/public/assets/WorkbenchView-fCu0K8e3.css +0 -1
  81. package/src/ui/public/assets/agentConversations-CPWL3WOC.js +0 -6
  82. package/src/ui/public/assets/configStore-CZhbJNkw.js +0 -1
  83. package/src/ui/public/assets/index-CM4UxQfy.css +0 -1
  84. package/src/ui/public/assets/index-Cw-KBQo_.js +0 -29
  85. package/src/ui/public/assets/previewSandbox-SqNQvuHv.css +0 -1
package/README.md CHANGED
@@ -396,7 +396,7 @@ A dedicated view for running coding agents across one or many projects. Every ta
396
396
  |---|---|
397
397
  | Task list | Create, edit, delete tasks. Rows are grouped by project (current project first), each a single line — the title, or the first characters of the description (ellipsised) when the title is empty. Tasks with neither a title nor a description count as drafts that are never saved (switching away drops them) |
398
398
  | Multi-project board | Three resizable / collapsible panes: the project list with its run monitor, the kanban board, and the master-agent console. Drag a divider to resize (project list 180–420 px, console 260–560 px), double-click it to reset the responsive default, or fold a side away — the top-bar button folds the project list, the console folds into a 32 px rail that expands on click. The run monitor has its own divider (120 px up to half the viewport height) for when several jobs run at once. All widths / heights are remembered across sessions. Below 860 px the panes stack vertically with the console **above** the board — a stacked board runs to five figures of pixels, so a console placed after it would be out of reach — and the progress report is shown in full instead of clamped to six lines |
399
- | Kanban board | **Todo / Doing / Done** columns with the done column sorted newest-first; a filter checkbox narrows the board to tasks whose last run failed, and a table view is one click away for a denser listing. A **New task** entry sits at the end of the Todo column whether or not that column already holds cards (it doubles as the empty state, and opens the same create dialog as the top-right button) |
399
+ | Kanban board | **Todo / Doing / Done** columns with the done column sorted newest-first; a filter checkbox narrows the board to tasks whose last run failed, and a table view is one click away for a denser listing. A **New task** entry sits at the end of the Todo column whether or not that column already holds cards (it doubles as the empty state, and opens the same create dialog as the top-right button). Task attachments of the image kind get a **cover** across the top of the card — the first one, with a `+N` badge when there are more — and clicking it opens the full-size viewer with arrow-key paging through the whole set (clicking it does *not* open the task: the card is one big click target, so the cover opts out). An attachment whose file has gone missing drops the cover instead of leaving a broken-image icon on the board; the table view marks the same fact with an `N image(s)` chip next to the title so the two views never disagree |
400
400
  | Card status while running | A running task is more than a blinking dot: the card itself carries its executor's brand icon (hover for the product name), the elapsed time, how many tool calls it has made (hover for the mix of types), its most recent tool call, what it is thinking right now, and its newest reply — plus a silence figure once the job has gone quiet for a while. A row with nothing in it is left out instead of being filled with "none yet", and a card that is not running has no such block at all. The facts come from the execution log, the same source the progress report reads, so they refresh with the board's 5-second poll and a task running in another `g ui` instance shows up here too; in table view the same summary sits under the task name. Hovering the card also reveals a **Stop** button in the very slot an idle card puts **Run** in (a running card does not show both — there is no second run to start), so killing a stuck run no longer means opening the editor and scrolling down to it; it goes through the same endpoint and the very same confirmation text as the editor's stop, and a job running inside another `g ui` instance cannot be stopped from this window — the server says exactly that instead of a flat "stop failed" |
401
401
  | Master-agent console | Give the master agent an instruction and it dispatches a new task, deciding the target project itself (or honouring the project you selected). Enter dispatches, Shift+Enter starts a new line. Dispatching can be paused and resumed — while paused, a dispatch creates the task without running it |
402
402
  | Card after a run | A card in Done no longer stops at its title and timestamp: it keeps a short excerpt of the last thing the agent said — the tail of the newest run's reply, flattened to one line and capped at 100 characters. This is the case it was built for: a run often ends by asking you something ("shall I push?"), so a task sitting in Done may still be waiting on your answer, and the only way to find out used to be opening the editor and reading the log. The executor's brand icon sits at the head of that excerpt — the line is what **it** said, so the icon that says which CLI said it belongs there rather than somewhere else on the card. A task that is still running keeps showing the live block instead (the two are mutually exclusive), a run that wrote no body text leaves this line out entirely rather than borrowing an earlier run's words, and the full excerpt is in the hover tooltip; the table view carries the same line under the task name. Executor icons are drawn only when the executor is actually known — a run recorded before the `agent` field existed, or one whose value this build does not recognise, gets no icon rather than a guessed brand (in the table view, icons appear on the status line for a running task and on the last-reply line for a finished one) |
@@ -420,7 +420,7 @@ A dedicated view for running coding agents across one or many projects. Every ta
420
420
  | Live status | Task status (pending / running / done / error / cancelled) and PID stream in real time over SSE |
421
421
  | Tool-call stream | The model's tool calls are rendered inline in the conversation flow, so you can follow what the agent actually did |
422
422
  | Inline images in a reply | The agent can put a picture in its reply body: write it as a Markdown image pointing at a local file — `![caption](C:\...\docs\shot.png)` — and it is rendered right in the conversation flow. That path is rewritten to a server endpoint that only serves images from **the task's own repository** (path traversal, absolute paths outside the repo and symlinks pointing out of it are all rejected, and the response carries `nosniff` plus a sandbox CSP), and the executor is told the syntax through the injected environment block — pasting a bare path is what it does otherwise, and a bare path or one wrapped in a code fence stays plain text. Follow-up turns carry a one-line version of the same hint. A file the run cannot read renders as a broken image rather than silently disappearing; png / jpg / jpeg / gif / webp / bmp / svg up to 20 MB |
423
- | Finish notice | When a run finishes or fails you get a chime (a distinct tone for done vs. error; stopping on purpose stays silent) plus an in-app toast while the page is in the foreground, and a system notification when it is not — so you can be looking at another view or window and still be told. The chime has its **own switch** under the notice toggle, so you can keep the notices but mute the sound, or the other way round. Sounds are CC0 assets under `public/sounds/`; see `CREDITS.txt` there to swap in another tone |
423
+ | Finish notice | When a run finishes or fails you can be told three ways, each with its **own switch**: an **in-app toast** (on by default), a **browser notification** (off by default), and a **chime** (on by default; a distinct tone for done vs. error, silent when you stop a run yourself). The three are independent — keep any combination. With the toast and the notification both on, the toast shows while the page is focused and the system notification takes over once it is not; with the toast off, the notification fires even in the foreground, since it is then the only channel you asked for. The browser notification switch asks for notification permission **only at the moment you turn it on** — it is off by default and nothing ever prompts you on its own. Sounds are CC0 assets under `public/sounds/`; see `CREDITS.txt` there to swap in another tone |
424
424
  | Cross-view indicator | While any Workbench task is running, a pulsing dot appears on the Workbench icon in the Activity Bar so you can see job state from the Git or Editor view |
425
425
  | Execution log manager (dialog) | The "Execution logs" button in the workbench top bar opens a dialog with the list / filter / batch delete / clear / retention-policy UI (defaults: 500 records, 256 MB); the task execution view stays mounted so no work-in-progress state is dropped |
426
426
  | Continue chat | After a task reaches a done / error / cancelled state, a follow-up composer appears; sending a message resumes the previous session (`claude --resume <session_id>` for Claude Code, `--session` for OpenCode, `codex exec resume <thread_id>` for Codex), and each new turn stacks into the same chat-style flow. Since the resumed session already carries the previous turn's context, follow-up turns inject only a **slim refresh** of the run-environment block (current project + board totals + truth-file paths) instead of the full project list. The bubbles show only what the user actually typed: the injected environment / memory blocks and the attachment list stay in the raw `job.prompt` (readable and copyable in the run log), so copying a conversation out and pasting it back no longer drags a whole round of background along |
@@ -461,7 +461,7 @@ A dedicated view (robot icon in the activity bar) for chatting with the built-in
461
461
 
462
462
  | Tab | What's inside |
463
463
  |---|---|
464
- | General settings | Appearance (theme — light / dark / follow the system — and language), task execution (task executor, task-finish notifications and their sound cue) and UI options (file-list view, diff split ratio, AI diff explanation, command console, layout ratios) |
464
+ | General settings | Appearance (theme — light / dark / follow the system — and language), task execution (task executor, and the three task/chat finish notice channels — in-app toast / browser notification / sound cue), and UI options (file-list view, diff split ratio, AI diff explanation, command console, layout ratios) |
465
465
  | AI models | OpenAI-compatible endpoints — API key, base URL, model name — with several entries side by side, a default model, plus the **Agent runtime** section holding the per-turn tool-call budget |
466
466
  | Git global settings | `user.name` / `user.email`, auto-set upstream, pull strategy, auto-prune remote branches, line-ending handling, the default branch for `git init` |
467
467
  | Commit settings | Standardised commit form, skip hooks (`--no-verify`), Enter-to-commit, auto-close the push modal, pull before push, auto-fill the default commit message |
@@ -1107,7 +1107,7 @@ Activity Bar 第四个视图,在 GUI 内直接浏览并编辑项目文件:
1107
1107
  |---|---|
1108
1108
  | 任务列表 | 新建、编辑、删除任务;按项目分组(当前项目排在最前),每条任务只占一行 —— 有标题显示标题,没标题则显示描述前若干字符(超出省略);标题和描述都没填的任务视为草稿,切走时直接丢弃、不落盘 |
1109
1109
  | 多项目看板 | 三栏均可拖动 / 可折叠:项目列表(含执行监控)、看板、主 Agent 控制台。拖动分隔条调整宽度(项目列表 180–420 px、控制台 260 px ~ `min(900, 视口 46%)`),双击恢复响应式默认值;两侧也都能收起 —— 顶栏按钮收项目列表,控制台自己的按钮把它收成 32px 收纳条、点一下展开。项目列表下方的执行监控有独立分隔条(120 px ~ 视口高度一半),并行跑多个任务时上下拖动即可加高。所有宽高跨会话记住。窄屏(≤860px)三栏改成上下排列,主 Agent 控制台排在**看板前面**(看板三列摞起来有一万多像素,控制台落在它后面就够不着了),报告正文也不再按 6 行截断 |
1110
- | 看板视图 | **待处理 / 进行中 / 已完成** 三列,已完成列按完成时间倒序;顶部勾选可只看「最近一次执行报错」的任务;一键切换成表格视图,信息密度更高。待处理列末尾常驻一个「新建任务」入口 —— 列里已有卡片时它照样在(列空时它还兼任空状态),点开的是和右上角按钮同一个新建弹窗 |
1110
+ | 看板视图 | **待处理 / 进行中 / 已完成** 三列,已完成列按完成时间倒序;顶部勾选可只看「最近一次执行报错」的任务;一键切换成表格视图,信息密度更高。待处理列末尾常驻一个「新建任务」入口 —— 列里已有卡片时它照样在(列空时它还兼任空状态),点开的是和右上角按钮同一个新建弹窗。任务附件里的**图片会在卡片顶部画一张封面** —— 只画第一张,多张时角上压一枚 `+N`;点封面直接看大图,且能左右翻完整组(**不会**顺手把任务也打开:卡片整块是"打开任务"的可点区域,封面把自己摘出来了)。附件文件已经丢了的那种卡**不画封面**,而不是在板上留一枚裂图;表格视图用任务名前的「N 张图」标同一件事 —— 两种画法不会一个有一个没有 |
1111
1111
  | 进行中卡片 | 正在跑的任务不只是右上角一个圆点:卡片上直接带着**执行器的品牌图标**(悬停看是哪个产品)、已运行时长、调用了多少次工具(悬停看类型分布)、最近一次工具调用、最近在思考什么、最新的回复 —— 一段时间没有产出时再补一句静默多久。某一项没有内容就**整行不渲染**(不写"暂无"),没在跑的任务则完全没有这块。这些事实与右栏进度报告同源(都来自执行记录),所以跟随看板 5 秒轮询刷新,别的 `g ui` 实例里跑的任务在这里同样看得到;切到表格视图时同一行摘要压在任务名下方。悬停时卡片右下角还会浮出 **停止** —— 位置正是空闲卡片摆「执行」的那一格(在跑时两者不并排:没有第二轮可跑),所以停掉一条卡住的任务不必再点进编辑器往下翻;它走的是与编辑器里那个「停止」**同一个接口、同一段确认文案**,而在**别的 g ui 实例**里跑的任务在这个窗口停不了 —— 服务端会直说这一句,而不是笼统回一句「停止失败」 |
1112
1112
  | 跑完卡片 | 「已完成」列的卡片不再只有标题和时间:它留下一小段**智能体最后说的话** —— 最近一轮执行的正文尾部,压平成一句话、最多 100 字。这条最有用的时候正是它被做出来的理由:一次执行常常以反问收尾(「要 push 吗?」),标着"已完成"的任务其实在等你回一句话,而以前只有点进编辑器翻日志才知道。**执行器的品牌图标就挂在这段摘录的开头** —— 这句话是"它"说的,图标说的是哪个 CLI 说的,放在这里比放在卡片别处更直接。正在跑的任务仍然走上面那块活动区(两者互斥);那次执行没写正文时这段整块不渲染,不拿上一轮的旧话顶;完整摘录在悬停提示里。表格视图的任务名下方同样有这一行。图标只在**执行器认得出来**时才画:加 `agent` 字段之前跑的记录、或值不在已知执行器里的,一律不画,而不是猜一个品牌显示(表格视图里,正在跑的任务图标在状态摘要行、跑完的在最后回复行) |
1113
1113
  | 主 Agent 控制台 | 两种工作方式,拨片切换、选择记在浏览器里:**对话** —— 直接跟内置 g ai 聊,由它按需把活派给某个项目(可多轮、可先问清再派);**指令** —— 你自己写一句话,落点由主 Agent 判断(或遵从此前选中的项目),Enter 派发、Shift+Enter 换行。两种方式落到**同一条派发链路与同一条指令流水**,差别只在"谁决定派什么"。调度可暂停 / 恢复,暂停期间派发只建任务不执行 |
@@ -1132,7 +1132,7 @@ Activity Bar 第四个视图,在 GUI 内直接浏览并编辑项目文件:
1132
1132
  | 实时状态 | 任务状态(pending / running / done / error / cancelled)和 PID 通过 SSE 实时推送 |
1133
1133
  | 工具调用流 | 模型的工具调用直接渲染在对话流里,能看清智能体具体做了什么 |
1134
1134
  | 正文配图 | 智能体可以在回答正文里直接给你看图:按 Markdown 图片语法写 `![说明](C:\...\docs\shot.png)`,界面就在对话流里渲染出来。该路径会被重写成只服务**本任务仓库内**图片的后端端点(`..` 穿越、仓库外的绝对路径、指向仓库外的符号链接一律拒掉,响应带 `nosniff` 与 sandbox CSP);同时通过注入的环境上下文块把这条写法告诉执行器 —— 不告诉它,它默认只会贴一行路径(裸路径、或放进代码块的路径,仍是纯文本)。续聊轮发的是这条提示的一句话版本。读不到的图会显示成裂图而不是悄悄消失;限 png / jpg / jpeg / gif / webp / bmp / svg,单张 20 MB |
1135
- | 结束提示 | 任务结束或报错时响一声提示音(完成 / 出错各一种音色,主动停止不响),同时页面在前台弹应用内提示、页面在后台/别的窗口发系统通知,切到别的视图也不会漏掉结果。提示音在总开关下**有自己的开关**——可以"要提示但静音",也可以反过来只要声音。音源是 CC0 资源(`public/sounds/`),换音色见同目录 `CREDITS.txt` |
1135
+ | 结束提示 | 任务结束或报错时有三种提示方式,**各有一个独立开关**:**页面提示**(应用内提示条,默认开)、**浏览器通知**(系统通知,默认关)、**提示音**(完成 / 出错各一种音色,主动停止不响,默认开)。三者互不从属,任意组合都行。页面提示与浏览器通知都开着时,页面在前台弹提示条、切到后台/别的窗口才发系统通知;只开浏览器通知时前台也发(它是你唯一要的通道)。浏览器通知**只在你拨开那个开关的那一刻**申请权限 —— 它默认关,也不会有任何自动弹窗。音源是 CC0 资源(`public/sounds/`),换音色见同目录 `CREDITS.txt` |
1136
1136
  | 跨视图指示 | 任意任务运行中时,Activity Bar 上的工作台图标会显示脉动小圆点;切换到 Git 或编辑器视图也能看到运行状态 |
1137
1137
  | 执行日志管理(弹窗) | 顶部「执行日志」按钮唤起弹窗:列表 / 过滤 / 批量删除 / 清空 / 保留策略全部可在此一次性管理(默认保留 500 条、256 MB);弹窗关闭后任务执行视图常驻,避免切换时不必要的卸载 |
1138
1138
  | 继续对话 | 任务进入终态(done / error / cancelled)后出现续聊输入框;发送续聊消息会用 `claude --resume <session_id>`(Claude Code)、`--session`(OpenCode)或 `codex exec resume <thread_id>`(Codex)续接上一轮会话,**新一轮 = 新 job**,多轮纵向堆叠成对话流。续接的会话本身就带着上一轮的上下文,所以续聊轮注入的是**精简刷新版**运行环境块(当前项目 + 看板合计 + 真相源路径),不再重发整份项目清单。对话气泡只显示用户真正说过的那句话 —— 注入的环境块 / 记忆块 / 附件清单仍留在 `job.prompt` 原文里(执行日志详情可看可复制),所以把对话复制出来再粘回续聊框时不会连带一整套背景一起回去 |
@@ -1173,7 +1173,7 @@ Activity Bar 中的机器人图标视图,可直接在浏览器中与内置 AI
1173
1173
 
1174
1174
  | tab | 内容 |
1175
1175
  |---|---|
1176
- | 通用设置 | 外观(主题 —— 浅色 / 深色 / 跟随系统,以及界面语言)、任务执行(任务执行器、任务与对话完成提示及其提示音),以及界面选项(文件列表视图、文件差异分割、AI 差异说明、命令控制台、布局比例) |
1176
+ | 通用设置 | 外观(主题 —— 浅色 / 深色 / 跟随系统,以及界面语言)、任务执行(任务执行器,以及任务/对话完成提示的三个通道:页面提示 / 浏览器通知 / 提示音),以及界面选项(文件列表视图、文件差异分割、AI 差异说明、命令控制台、布局比例) |
1177
1177
  | AI 模型配置 | 兼容 OpenAI 协议的模型端点 —— API Key、baseURL、模型名,可多套并存并设置默认模型;另有 **智能体运行时** 存放单轮工具调用上限 |
1178
1178
  | Git 全局设置 | `user.name` / `user.email`、自动设置上游、拉取策略、自动清理远程分支、换行符处理、`git init` 默认分支 |
1179
1179
  | 提交设置 | 标准化提交、跳过钩子检查(`--no-verify`)、回车自动提交、Push 完成自动关闭、推送前拉取更新、自动填充默认提交信息 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zen-gitsync",
3
- "version": "2.17.40",
3
+ "version": "2.17.41",
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",
@@ -61,6 +61,8 @@
61
61
  "verify:wb-rerun-label:reverse": "node scripts/verify-wb-rerun-label.cjs --reverse",
62
62
  "verify:wb-auto-done": "node scripts/verify-wb-auto-done.cjs",
63
63
  "verify:wb-auto-done:reverse": "node scripts/verify-wb-auto-done.cjs --reverse",
64
+ "verify:wb-card-cover": "node scripts/verify-wb-card-cover.cjs",
65
+ "verify:wb-card-cover:reverse": "node scripts/verify-wb-card-cover.cjs --reverse",
64
66
  "verify:wb-list-view": "node scripts/verify-wb-list-view.cjs",
65
67
  "verify:wb-executor-models": "node scripts/verify-wb-executor-models.cjs",
66
68
  "verify:wb-task-sound": "node scripts/verify-wb-task-sound.cjs",
@@ -115,7 +117,10 @@
115
117
  "npm:2fa:get": "npm profile get",
116
118
  "npm:2fa:disable": "npm profile disable-2fa",
117
119
  "verify:wb-select-popup": "node scripts/verify-native-select-popup.cjs",
118
- "verify:wb-inline-images": "node scripts/verify-wb-inline-images.mjs"
120
+ "verify:wb-inline-images": "node scripts/verify-wb-inline-images.mjs",
121
+ "verify:wb-colors": "node scripts/verify-wb-colors.cjs",
122
+ "verify:wb-colors:reverse": "node scripts/verify-wb-colors.cjs --reverse",
123
+ "verify:ui-consistency": "node scripts/verify-ui-consistency.cjs"
119
124
  },
120
125
  "files": [
121
126
  "src/ui/public/**",
package/src/config.js CHANGED
@@ -89,27 +89,43 @@ export function normalizeTaskExecutor(value) {
89
89
  }
90
90
 
91
91
  /**
92
- * 规范化「任务执行结束提示」开关。只接受布尔值,其它类型返回 null
93
- * (交给调用方取默认),不抛错 —— 与 normalizeTaskExecutor 同一套语义。
92
+ * 规范化「任务/对话结束提示」的通道开关(页面提示 / 浏览器通知 / 提示音共用)。
93
+ * 只接受布尔值,其它类型返回 null(交给调用方取默认),不抛错 —— 与
94
+ * normalizeTaskExecutor 同一套语义。
94
95
  *
95
- * 为什么不做 `!!value`:这个值控制是否弹浏览器系统通知,`'false'` 这种字符串
96
- * 被强转成 true 之后用户会在设置里明明关着却照样被弹,且落盘后一直错下去。
96
+ * 为什么不做 `!!value`:这个值控制是否弹提示条、是否弹浏览器系统通知,
97
+ * `'false'` 这种字符串被强转成 true 之后用户会在设置里明明关着却照样被弹,
98
+ * 且落盘后一直错下去。
97
99
  */
98
- export function normalizeNotifyOnTaskDone(value) {
100
+ export function normalizeNotifySwitch(value) {
99
101
  return typeof value === 'boolean' ? value : null;
100
102
  }
101
103
 
102
104
  /**
103
- * 规范化「任务完成提示音」开关。语义与 normalizeNotifyOnTaskDone 完全一致
104
- * (只收布尔值,`'false'` 这种字符串不当真值用 —— 理由同上)。
105
+ * 三个提示通道(页面提示 / 浏览器通知 / 提示音)的最终取值。
105
106
  *
106
- * 为什么和总开关分开成两个键:有人要"发系统通知但别出声"(开会 / 图书馆 / 夜里),
107
- * 也有人反过来只要"叮"一声、不想要通知卡片和权限询问。合成一个开关两边都别扭。
108
- * 从属关系在消费端:总开关关着时整个提示链路都不走,提示音自然也不会响
109
- * (见 useTaskNotifier.announce 的调用点)。
107
+ * 2026-10-05 之前只有「总开关 notifyOnTaskDone + 从属的提示音 notifySoundOnTaskDone」,
108
+ * 浏览器通知没有自己的开关 —— 前台弹 toast、后台发系统通知是自动二选一,而且页面内
109
+ * 首次点击会自动申请通知权限。用户反馈"每次开 GUI 都弹授权框"(默认开 + 自动申请 =
110
+ * 一个从没要过系统通知的人被反复打扰),且想要的三件事本来就该分开配。
111
+ *
112
+ * 现在三个键平级、各自独立,默认值:页面提示开、提示音开、**浏览器通知关**。
113
+ * 权限只在用户把浏览器通知拨开的那一刻申请(见设置页的 onBrowserNotifyToggleChange)。
114
+ *
115
+ * 旧键 notifyOnTaskDone 只作为**迁移输入**读一次:磁盘上显式 false 且新键都没写过
116
+ * → 三个通道全关(尊重"我以前就是关掉的",别让老用户升级后被突然弹一脸)。
117
+ * 它不再被写入,也不再是任何东西的前置条件 —— 三通道之间没有从属关系。
110
118
  */
111
- export function normalizeNotifySoundOnTaskDone(value) {
112
- return typeof value === 'boolean' ? value : null;
119
+ function resolveNotifySwitches(raw) {
120
+ const page = normalizeNotifySwitch(raw?.notifyPageOnTaskDone);
121
+ const browser = normalizeNotifySwitch(raw?.notifyBrowserOnTaskDone);
122
+ const sound = normalizeNotifySwitch(raw?.notifySoundOnTaskDone);
123
+ const legacyAllOff = raw?.notifyOnTaskDone === false;
124
+ return {
125
+ notifyPageOnTaskDone: page ?? (legacyAllOff ? false : defaultConfig.notifyPageOnTaskDone),
126
+ notifyBrowserOnTaskDone: browser ?? (legacyAllOff ? false : defaultConfig.notifyBrowserOnTaskDone),
127
+ notifySoundOnTaskDone: sound ?? (legacyAllOff ? false : defaultConfig.notifySoundOnTaskDone),
128
+ };
113
129
  }
114
130
 
115
131
  // 默认配置
@@ -163,16 +179,17 @@ const defaultConfig = {
163
179
  // 决定「执行任务 / 执行子任务 / 从此处开始 / 简单任务续聊」这条链路
164
180
  // 默认 spawn 哪个本地 CLI;执行入口可以按次覆盖(见 workbench 执行路由)。
165
181
  taskExecutor: 'claude',
166
- // 任务执行结束提示(全局,默认开)。开启后工作台任务从"跑着"变终态时,
167
- // 页面在后台发浏览器系统通知、在前台发应用内提示条。见 useTaskNotifier。
168
- // 2026-09-28: 默认关 → 开。这个功能的价值恰恰在"任务跑完时用户不在这个页面上",
169
- // 默认关等于大部分人永远不知道有它;浏览器通知权限在页面内首次点击时自动申请
170
- // (见 App.vue 的 onUserGestureForNotifyPermission),所以默认开不会静默失效。
171
- notifyOnTaskDone: true,
172
- // 任务完成提示音(全局,默认开):跑完 / 出错误各响一声,主动停止不响。
173
- // 从属于上面的 notifyOnTaskDone —— 总开关关着时整条提示链路都不走,声音也不会响。
174
- // 单独一个键是为了"要通知但别出声"和"要声音但不要通知卡片"这两种人都能配。
175
- // 音源是 CC0 资源(src/ui/client/public/sounds/),见同目录 CREDITS.txt。
182
+ // 任务 / 对话执行结束提示的三个通道(全局)。三者**平级且互相独立**,
183
+ // 见 resolveNotifySwitches 的注释(2026-10-05 从"总开关 + 提示音子开关"拆过来)。
184
+ //
185
+ // 页面提示(默认开):结束时在页面内弹一条 ElMessage。
186
+ // 浏览器通知(默认关):页面在后台/别的窗口时发系统通知。默认关是因为它要申请
187
+ // 浏览器通知权限 —— 默认开 + 自动申请 = 用户每次开 GUI 都被弹一个授权框。
188
+ // 想用的人自己去设置里拨开,那一刻才申请。
189
+ // 提示音(默认开):跑完 / 出错误各响一声,主动停止不响。
190
+ // 音源是 CC0 资源(src/ui/client/public/sounds/),见同目录 CREDITS.txt。
191
+ notifyPageOnTaskDone: true,
192
+ notifyBrowserOnTaskDone: false,
176
193
  notifySoundOnTaskDone: true,
177
194
  // UI 状态(跨项目共享,存到顶层 ui 对象)
178
195
  // 之前散落在 localStorage,因随机端口启动而失效,迁到文件持久化
@@ -503,9 +520,7 @@ async function loadConfig() {
503
520
  aiMaxToolIterations: normalizeAiMaxToolIterations(raw.aiMaxToolIterations)
504
521
  ?? defaultConfig.aiMaxToolIterations,
505
522
  taskExecutor: normalizeTaskExecutor(raw.taskExecutor) ?? defaultConfig.taskExecutor,
506
- notifyOnTaskDone: normalizeNotifyOnTaskDone(raw.notifyOnTaskDone) ?? defaultConfig.notifyOnTaskDone,
507
- notifySoundOnTaskDone: normalizeNotifySoundOnTaskDone(raw.notifySoundOnTaskDone)
508
- ?? defaultConfig.notifySoundOnTaskDone
523
+ ...resolveNotifySwitches(raw)
509
524
  };
510
525
  }
511
526
 
@@ -525,9 +540,7 @@ async function loadConfig() {
525
540
  ?? defaultConfig.aiMaxToolIterations,
526
541
  taskExecutor: normalizeTaskExecutor(raw?.taskExecutor) ?? defaultConfig.taskExecutor,
527
542
  // 同 taskExecutor:全局配置,始终取顶层,防止被项目配置里的旧值覆盖
528
- notifyOnTaskDone: normalizeNotifyOnTaskDone(raw?.notifyOnTaskDone) ?? defaultConfig.notifyOnTaskDone,
529
- notifySoundOnTaskDone: normalizeNotifySoundOnTaskDone(raw?.notifySoundOnTaskDone)
530
- ?? defaultConfig.notifySoundOnTaskDone
543
+ ...resolveNotifySwitches(raw)
531
544
  };
532
545
  }
533
546
 
@@ -575,7 +588,16 @@ async function saveConfig(config) {
575
588
 
576
589
  // 分离全局设置和项目设置
577
590
  // models / ui 也是全局配置(跨项目共享),和 theme/locale 一样存到顶层
578
- const { theme, locale, models, ui, aiMaxToolIterations, taskExecutor, notifyOnTaskDone, notifySoundOnTaskDone, ...projectConfig } = config;
591
+ // ⚠️ notifyOnTaskDone 是**旧键**(2026-10-05 拆成下面三个通道键):这里仍要显式
592
+ // 解构出来,否则它会跟着 ...projectConfig 被写进**项目配置**里 —— 全局设置漏进
593
+ // 项目级是这一族键最容易踩的坑。解构出来本身不写回顶层(它已不再被任何地方读取)。
594
+ const {
595
+ theme, locale, models, ui, aiMaxToolIterations, taskExecutor,
596
+ notifyOnTaskDone: legacyNotifyOnTaskDone,
597
+ notifyPageOnTaskDone, notifyBrowserOnTaskDone, notifySoundOnTaskDone,
598
+ ...projectConfig
599
+ } = config;
600
+ void legacyNotifyOnTaskDone;
579
601
 
580
602
  // 保存全局设置到根级别
581
603
  if (theme !== undefined) {
@@ -600,14 +622,18 @@ async function saveConfig(config) {
600
622
  if (normalizedExecutor !== null) {
601
623
  raw.taskExecutor = normalizedExecutor;
602
624
  }
603
- // 任务完成提示开关同属全局设置:非布尔值不落盘(保留磁盘旧值)
604
- const normalizedNotify = normalizeNotifyOnTaskDone(notifyOnTaskDone);
605
- if (normalizedNotify !== null) {
606
- raw.notifyOnTaskDone = normalizedNotify;
607
- }
608
- const normalizedNotifySound = normalizeNotifySoundOnTaskDone(notifySoundOnTaskDone);
609
- if (normalizedNotifySound !== null) {
610
- raw.notifySoundOnTaskDone = normalizedNotifySound;
625
+ // 三个提示通道开关同属全局设置:非布尔值不落盘(保留磁盘旧值)。
626
+ // 各自独立 —— 写其中一个绝不顺带改动另外两个。
627
+ const notifySwitches = {
628
+ notifyPageOnTaskDone,
629
+ notifyBrowserOnTaskDone,
630
+ notifySoundOnTaskDone,
631
+ };
632
+ for (const [key, value] of Object.entries(notifySwitches)) {
633
+ const normalized = normalizeNotifySwitch(value);
634
+ if (normalized !== null) {
635
+ raw[key] = normalized;
636
+ }
611
637
  }
612
638
 
613
639
  // 写入当前项目配置(在 defaultConfig 基础上合并,但不清空顶层其它键)
@@ -806,13 +832,12 @@ export default {
806
832
  // 工作台任务执行器规范化(GUI 保存前也要用,见 /api/config/save-general-settings)
807
833
  normalizeTaskExecutor,
808
834
  TASK_EXECUTORS,
809
- // 任务执行结束提示开关规范化(同上)
810
- normalizeNotifyOnTaskDone,
811
- // 任务完成提示音开关规范化(同上)。⚠️ 新增规范化函数务必同步加进这个对象字面量 ——
812
- // server 侧 `import config from '../../config.js'` 拿的是**这个默认导出对象**,
813
- // 只在下面 `export {}` 里命名导出是不够的:漏加会变成 undefined 调用 → 路由 500,
835
+ // 任务/对话结束提示三个通道的开关规范化(同上)。
836
+ // ⚠️ 新增规范化函数务必同步加进这个对象字面量 —— server 侧
837
+ // `import config from '../../config.js'` 拿的是**这个默认导出对象**,
838
+ // 只在 `export function` 里命名导出是不够的:漏加会变成 undefined 调用 → 路由 500,
814
839
  // 而且因为有 try/catch 兜底,前端只会看到"保存失败",不知道是哪个函数缺了。
815
- normalizeNotifySoundOnTaskDone,
840
+ normalizeNotifySwitch,
816
841
  };
817
842
 
818
843
  // 命名导出 — 用于测试与外部复用
@@ -1 +1 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,C as n,Dn as r,En as i,Er as a,In as o,J as s,On as c,Pn as l,Pr as u,Qr as d,S as f,Tn as p,Wn as m,Y as h,Yn as g,Zn as _,br as v,cr as y,kn as b,pr as x,qn as S,qr as C,tt as w,w as T,xn as E}from"./element-plus-CgEuJBlB.js";import{n as D,t as O}from"./_plugin-vue_export-helper-DF39dMex.js";import{t as k}from"./SvgIcon-CevyX7lX.js";import{t as A}from"./toolsStore-DozQNwtU.js";import{s as j,v as M}from"./index-Cw-KBQo_.js";import{c as N,d as P,l as F,u as I}from"./agentConversations-CPWL3WOC.js";t(),x();function L(e,t=680){let n=v(0),r=null;function i(){let t=e.value;return t?(n.value=t.clientWidth,typeof ResizeObserver>`u`||(r=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(n.value=t)}),r.observe(t),!0)):!1}return g(()=>{i()||m(()=>i())}),S(()=>{r?.disconnect(),r=null}),{width:n,narrow:p(()=>n.value>0&&n.value<t)}}t(),x(),u();var R={class:`agent-engine`},z=[`disabled`,`title`,`aria-label`],B={class:`agent-engine__name`},V={class:`agent-engine__item`},H={class:`agent-engine__item-name`},U={key:3,class:`agent-engine__item-missing`},W=O(o({__name:`AgentEngineSelector`,props:{engine:{},locked:{type:Boolean}},emits:[`select`],setup(t,{emit:o}){let u=t,m=o,g=A(),x=p(()=>I(u.engine)),S=p(()=>({gai:!0,claude:g.claudeAvailable,opencode:g.opencodeAvailable,codex:g.codexAvailable})),O=v(!1),L=v(null);function W(e){if(!u.locked){if(!S.value[e]){if(!P(e))return;L.value=e,O.value=!0;return}m(`select`,e)}}return(o,u)=>(_(),b(`div`,R,[l(a(f),{trigger:`click`,onCommand:W},{dropdown:y(()=>[l(a(T),null,{default:y(()=>[(_(!0),b(E,null,e(a(N),e=>(_(),r(a(n),{key:e.id,command:e.id},{default:y(()=>[i(`span`,V,[a(P)(e.id)?(_(),r(j,{key:0,executor:e.id,class:`agent-engine__item-icon`},null,8,[`executor`])):(_(),r(k,{key:1,"icon-class":a(F),class:`agent-engine__item-icon`},null,8,[`icon-class`])),i(`span`,H,d(e.name),1),t.engine===e.id?(_(),r(a(s),{key:2,class:`agent-engine__item-check`},{default:y(()=>[l(a(w))]),_:1})):S.value[e.id]?c(``,!0):(_(),b(`span`,U,d(a(D)(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`]))),128))]),_:1})]),default:y(()=>[i(`button`,{type:`button`,class:C([`agent-engine__btn`,{"is-locked":t.locked}]),disabled:t.locked,title:t.locked?a(D)(`@AGENT:本会话的引擎已锁定;要换引擎请新建会话`):a(D)(`@AGENT:新建会话使用的引擎`),"aria-label":a(D)(`@AGENT:智能体引擎`)},[a(P)(t.engine)?(_(),r(j,{key:0,executor:t.engine,class:`agent-engine__icon`},null,8,[`executor`])):(_(),r(k,{key:1,"icon-class":a(F),class:`agent-engine__icon`},null,8,[`icon-class`])),i(`span`,B,d(x.value),1),l(a(s),{class:`agent-engine__caret`},{default:y(()=>[l(a(h))]),_:1})],10,z)]),_:1}),l(M,{modelValue:O.value,"onUpdate:modelValue":u[0]||=e=>O.value=e,tool:L.value},null,8,[`modelValue`,`tool`])]))}}),[[`__scopeId`,`data-v-81dfa007`]]);export{L as n,W as t};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,C as n,Dn as r,En as i,Er as a,In as o,J as s,On as c,Pn as l,Pr as u,Qr as d,S as f,Tn as p,Wn as m,Y as h,Yn as g,Zn as _,br as v,cr as y,kn as b,pr as x,qn as S,qr as C,tt as w,w as T,xn as E}from"./element-plus-CgEuJBlB.js";import{n as D,t as O}from"./_plugin-vue_export-helper-Dp1lG95_.js";import{t as k}from"./SvgIcon-7IDEgoQx.js";import{t as A}from"./toolsStore-BGwhTEUD.js";import{c as j,y as M}from"./index-Bu08kcaz.js";import{c as N,d as P,l as F,u as I}from"./agentConversations-FiD_iarB.js";t(),x();function L(e,t=680){let n=v(0),r=null;function i(){let t=e.value;return t?(n.value=t.clientWidth,typeof ResizeObserver>`u`||(r=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(n.value=t)}),r.observe(t),!0)):!1}return g(()=>{i()||m(()=>i())}),S(()=>{r?.disconnect(),r=null}),{width:n,narrow:p(()=>n.value>0&&n.value<t)}}t(),x(),u();var R={class:`agent-engine`},z=[`disabled`,`title`,`aria-label`],B={class:`agent-engine__name`},V={class:`agent-engine__item`},H={class:`agent-engine__item-name`},U={key:3,class:`agent-engine__item-missing`},W=O(o({__name:`AgentEngineSelector`,props:{engine:{},locked:{type:Boolean}},emits:[`select`],setup(t,{emit:o}){let u=t,m=o,g=A(),x=p(()=>I(u.engine)),S=p(()=>({gai:!0,claude:g.claudeAvailable,opencode:g.opencodeAvailable,codex:g.codexAvailable})),O=v(!1),L=v(null);function W(e){if(!u.locked){if(!S.value[e]){if(!P(e))return;L.value=e,O.value=!0;return}m(`select`,e)}}return(o,u)=>(_(),b(`div`,R,[l(a(f),{trigger:`click`,onCommand:W},{dropdown:y(()=>[l(a(T),null,{default:y(()=>[(_(!0),b(E,null,e(a(N),e=>(_(),r(a(n),{key:e.id,command:e.id},{default:y(()=>[i(`span`,V,[a(P)(e.id)?(_(),r(j,{key:0,executor:e.id,class:`agent-engine__item-icon`},null,8,[`executor`])):(_(),r(k,{key:1,"icon-class":a(F),class:`agent-engine__item-icon`},null,8,[`icon-class`])),i(`span`,H,d(e.name),1),t.engine===e.id?(_(),r(a(s),{key:2,class:`agent-engine__item-check`},{default:y(()=>[l(a(w))]),_:1})):S.value[e.id]?c(``,!0):(_(),b(`span`,U,d(a(D)(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`]))),128))]),_:1})]),default:y(()=>[i(`button`,{type:`button`,class:C([`agent-engine__btn`,{"is-locked":t.locked}]),disabled:t.locked,title:t.locked?a(D)(`@AGENT:本会话的引擎已锁定;要换引擎请新建会话`):a(D)(`@AGENT:新建会话使用的引擎`),"aria-label":a(D)(`@AGENT:智能体引擎`)},[a(P)(t.engine)?(_(),r(j,{key:0,executor:t.engine,class:`agent-engine__icon`},null,8,[`executor`])):(_(),r(k,{key:1,"icon-class":a(F),class:`agent-engine__icon`},null,8,[`icon-class`])),i(`span`,B,d(x.value),1),l(a(s),{class:`agent-engine__caret`},{default:y(()=>[l(a(h))]),_:1})],10,z)]),_:1}),l(M,{modelValue:O.value,"onUpdate:modelValue":u[0]||=e=>O.value=e,tool:L.value},null,8,[`modelValue`,`tool`])]))}}),[[`__scopeId`,`data-v-cc0a8973`]]);export{L as n,W as t};
@@ -0,0 +1 @@
1
+ .agent-engine[data-v-cc0a8973]{vertical-align:middle}.agent-engine__btn[data-v-cc0a8973]{border:1px solid var(--border-color);border-radius:var(--radius-base);color:var(--text-secondary);font-size:var(--font-size-sm);cursor:pointer;transition:border-color var(--transition-fast) ease, color var(--transition-fast) ease;background:0 0;align-items:center;gap:6px;padding:4px 8px;font-family:inherit;line-height:1.5;display:inline-flex}.agent-engine__btn[data-v-cc0a8973]:hover:not(:disabled){border-color:var(--color-primary);color:var(--text-primary)}.agent-engine__btn[data-v-cc0a8973]:disabled{cursor:not-allowed;color:var(--text-meta)}.agent-engine__icon[data-v-cc0a8973],.agent-engine__item-icon[data-v-cc0a8973]{flex:none;font-size:14px}.agent-engine__caret[data-v-cc0a8973]{color:var(--text-meta);font-size:12px}.agent-engine__item[data-v-cc0a8973]{align-items:center;gap:8px;min-width:148px;display:inline-flex}.agent-engine__item-name[data-v-cc0a8973]{flex:1}.agent-engine__item-check[data-v-cc0a8973]{color:var(--color-primary);font-size:13px}.agent-engine__item-missing[data-v-cc0a8973]{font-size:var(--font-size-sm);color:var(--text-meta)}
@@ -1 +1 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,At as t,Bn as n,Ct as r,Dn as i,En as a,Er as o,Gt as s,Ht as c,In as l,J as ee,M as u,Nn as d,On as f,Pn as p,Pr as m,Qr as h,Tn as g,Tt as _,W as te,Wn as v,Yr as y,Yt as ne,Zn as b,_n as x,a as S,an as C,br as w,cr as T,dn as E,et as D,i as O,j as re,kn as k,kt as A,lr as j,lt as M,mt as N,nr as P,o as ie,or as F,pr as I,qr as L,st as R,tt as ae,vr as oe,xn as z}from"./element-plus-CgEuJBlB.js";import{a as B,t as V}from"./vendor-CDZ64WVU.js";import{n as H,t as U}from"./_plugin-vue_export-helper-DF39dMex.js";import{t as se}from"./configStore-CZhbJNkw.js";import{t as ce}from"./CommonDialog-CFLZuomi.js";import{a as W,i as le,n as ue,o as G,r as K,s as de,t as q}from"./agentConversations-CPWL3WOC.js";import{n as J,t as fe}from"./AgentEngineSelector-BXRU9N3n.js";n(),I(),E(),m();var Y={class:`marketplace-panel`},pe={class:`mp-toolbar`},me={class:`mp-search`},he=[`placeholder`],ge={class:`mp-toolbar-sub`},_e={class:`mp-target-hint`},X={class:`mp-source-filter`},ve=[`onClick`],ye={class:`mp-body`},be={class:`mp-group-header`},xe={class:`mp-group-title`},Se={key:0,class:`mp-group-count`},Ce={key:1,class:`mp-group-error`},we=[`href`,`title`],Te={key:0,class:`mp-grid`},Z={class:`mp-card-head`},Ee=[`title`],De={key:0,class:`mp-card-metric`},Q=[`title`],$={class:`mp-card-meta`},Oe=[`title`],ke=[`title`],Ae={key:2,class:`mp-tag remote`},je={class:`mp-card-foot`},Me=[`href`],Ne={key:1,class:`mp-installed-chip`},Pe=[`disabled`,`onClick`],Fe={key:3,class:`mp-not-installable`},Ie={key:1,class:`mp-empty`},Le={key:0,class:`mp-group installed`},Re={class:`mp-group-header`},ze={class:`mp-group-title`},Be={class:`mp-group-count`},Ve={key:0,class:`mp-installed-block`},He={class:`mp-installed-target`},Ue={class:`mp-installed-list`},We=[`title`],Ge=[`title`],Ke={key:1,class:`mp-meta-pkg`},qe={key:2,class:`mp-tag warn`},Je=[`disabled`,`title`,`onClick`],Ye=[`disabled`,`onClick`],Xe={key:1,class:`mp-empty all`},Ze={key:0,class:`mkt-form`},Qe={class:`mkt-form-name`},$e=[`onUpdate:modelValue`,`placeholder`],et={key:0,class:`mkt-field`},tt={class:`mkt-hint`},nt=U(l({__name:`MarketplacePanel`,props:{type:{}},setup(t){let n=t,l=se(),m=w([]),_=w([]),v=w(!1),y=w(``),E=w(``),D=w([]),P=w(`project`),I=w(new Set),R=w(new Set),B=w(new Set),V=g(()=>l.currentDirectory||``),U=null;async function W(){if(!v.value){v.value=!0;try{let e=new URLSearchParams({type:n.type,cwd:V.value});E.value&&e.set(`q`,E.value),D.value.length&&e.set(`sources`,D.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();t?.success?(m.value=t.groups||[],_.value=t.installed||[]):S.error(t?.error||H(`@MKT:加载失败`))}catch{S.error(H(`@MKT:加载失败`))}finally{v.value=!1}}}F(y,e=>{U&&clearTimeout(U),U=setTimeout(()=>{E.value=e.trim(),W()},400)}),F(D,()=>W()),F(()=>n.type,()=>{D.value=[],E.value=``,y.value=``,W()}),F(V,()=>W()),W();let le=g(()=>{let e=V.value?V.value.split(/[\\/]/).filter(Boolean).pop():``;return P.value===`project`?e||H(`@MKT:当前项目`):H(`@MKT:g ai 智能体`)});function ue(e){return e.stars?`${G(e.stars)} ★`:e.downloads?`${G(e.downloads)} ${H(`@MKT:周下载`)}`:e.uses?`${G(e.uses)} ${H(`@MKT:次使用`)}`:``}function G(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function K(e){return`${e.id}`}function de(e){return I.value.has(K(e))}let q=g(()=>{let e={project:[],global:[]};for(let t of _.value)(e[t.target]||=[]).push(t);return e}),J=oe({visible:!1,item:null,env:{},args:``});function fe(e){return n.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function nt(e){J.item=e,J.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),J.args=(e.args||[]).join(` `),J.visible=!0}function rt(){let e=J.item;if(J.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(J.env).filter(([,e])=>e.trim()!==``)),n=J.args.trim()?J.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;at(e,{env:t,...n?{args:n}:{}})}async function it(e){if(!e.installed||await ot(e)){if(fe(e)){nt(e);return}await at(e,{})}}async function at(e,t){let r=K(e);I.value.add(r);try{let r=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:P.value,cwd:V.value,item:{...e,...t}})}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){S.error(i?.error||H(`@MKT:安装失败`));return}i.item?.warning&&S.warning(i.item.warning),i.item?.envKeys?.length?S.warning(`${H(`@MKT:还缺环境变量`)}: ${i.item.envKeys.join(`, `)}`):S.success(H(`@MKT:安装成功`)),await W()}catch{S.error(H(`@MKT:安装失败`))}finally{I.value.delete(r)}}async function ot(e){try{return await O.confirm(`${e.name} ${H(`@MKT:已安装,要重新安装吗?`)}`,H(`@MKT:重新安装`),{confirmButtonText:H(`@MKT:重装`),cancelButtonText:H(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function st(e){let t=`${e.target}:${e.id}`;B.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:e.target,cwd:V.value,id:e.id})}),r=await t.json().catch(()=>null);(!t.ok||!r?.success)&&S.error(r?.error||H(`@MKT:打开失败`))}catch{S.error(H(`@MKT:打开失败`))}finally{B.value.delete(t)}}async function ct(e){try{await O.confirm(`${H(`@MKT:确定卸载`)} ${e.name}?`,H(`@MKT:卸载`),{confirmButtonText:H(`@MKT:卸载`),cancelButtonText:H(`@MKT:取消`),type:`warning`})}catch{return}let t=`${e.target}:${e.id}`;R.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:V.value}),r=await fetch(`/api/agent/marketplace/item/${n.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){S.error(i?.error||H(`@MKT:卸载失败`));return}S.success(H(`@MKT:已卸载`)),await W()}catch{S.error(H(`@MKT:卸载失败`))}finally{R.value.delete(t)}}return(n,l)=>{let g=ee,S=re,w=u,E=te,O=ie;return b(),k(`div`,Y,[a(`div`,pe,[a(`div`,me,[p(g,{class:`mp-search-icon`},{default:T(()=>[p(o(s))]),_:1}),j(a(`input`,{"onUpdate:modelValue":l[0]||=e=>y.value=e,class:`mp-search-input`,type:`text`,placeholder:t.type===`skill`?o(H)(`@MKT:搜索 Skill...`):o(H)(`@MKT:搜索 MCP 服务...`)},null,8,he),[[x,y.value]])]),p(w,{modelValue:P.value,"onUpdate:modelValue":l[1]||=e=>P.value=e,size:`small`,class:`mp-target`},{default:T(()=>[p(S,{value:`project`},{default:T(()=>[d(h(o(H)(`@MKT:当前项目`)),1)]),_:1}),p(S,{value:`global`},{default:T(()=>[d(h(o(H)(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),p(E,{content:o(H)(`@MKT:刷新`),placement:`top`,"show-after":300},{default:T(()=>[a(`button`,{class:L([`mp-refresh`,{spinning:v.value}]),onClick:W},[p(g,null,{default:T(()=>[p(o(c))]),_:1})],2)]),_:1},8,[`content`])]),a(`div`,ge,[a(`span`,_e,[d(h(o(H)(`@MKT:安装到`))+` `,1),a(`b`,null,h(le.value),1)]),a(`div`,X,[(b(!0),k(z,null,e(m.value,e=>(b(),k(`button`,{key:e.id,class:L([`mp-chip`,{active:D.value.includes(e.id)}]),onClick:()=>{let t=D.value.indexOf(e.id);t>=0?D.value.splice(t,1):D.value.push(e.id)}},h(e.label),11,ve))),128)),D.value.length?(b(),k(`button`,{key:0,class:`mp-chip clear`,onClick:l[2]||=e=>D.value=[]},h(o(H)(`@MKT:全部来源`)),1)):f(``,!0)])]),j((b(),k(`div`,ye,[(b(!0),k(z,null,e(m.value,t=>(b(),k(`section`,{key:t.id,class:`mp-group`},[a(`header`,be,[a(`h3`,xe,h(t.label),1),t.status===`ok`?(b(),k(`span`,Se,h(t.items.length),1)):(b(),k(`span`,Ce,[p(g,null,{default:T(()=>[p(o(C))]),_:1}),d(` `+h(t.error||o(H)(`@MKT:来源不可用`)),1)])),t.homepage?(b(),k(`a`,{key:2,class:`mp-group-link`,href:t.homepage,target:`_blank`,rel:`noopener noreferrer`,title:t.homepage},[p(g,null,{default:T(()=>[p(o(A))]),_:1})],8,we)):f(``,!0)]),t.status===`ok`&&t.items.length?(b(),k(`div`,Te,[(b(!0),k(z,null,e(t.items,t=>(b(),k(`article`,{key:K(t),class:`mp-card`},[a(`div`,Z,[a(`span`,{class:`mp-card-name`,title:t.name},h(t.name),9,Ee),ue(t)?(b(),k(`span`,De,[p(g,null,{default:T(()=>[t.stars?(b(),i(o(ne),{key:0})):(b(),i(o(N),{key:1}))]),_:2},1024),d(` `+h(ue(t)),1)])):f(``,!0)]),a(`p`,{class:`mp-card-desc`,title:t.description},h(t.description||o(H)(`@MKT:暂无描述`)),9,Q),a(`div`,$,[t.package?(b(),k(`code`,{key:0,class:`mp-meta-pkg`,title:t.package},h(t.package),9,Oe)):t.repository?(b(),k(`span`,{key:1,class:`mp-meta-repo`,title:t.repository+(t.subpath?` · `+t.subpath:``)},[d(h(t.repository),1),t.subpath?(b(),k(z,{key:0},[d(` · `+h(t.subpath),1)],64)):f(``,!0)],8,ke)):f(``,!0),t.transport===`remote`?(b(),k(`span`,Ae,h(o(H)(`@MKT:远程服务`)),1)):f(``,!0),(b(!0),k(z,null,e((t.tags||[]).slice(0,2),e=>(b(),k(`span`,{key:e,class:`mp-tag`},h(e),1))),128))]),a(`div`,je,[t.upstream?(b(),k(`a`,{key:0,class:`mp-card-link`,href:t.upstream,target:`_blank`,rel:`noopener noreferrer`},h(o(H)(`@MKT:查看来源`)),9,Me)):f(``,!0),l[6]||=a(`span`,{class:`mp-foot-spacer`},null,-1),t.installed?(b(),k(`span`,Ne,[p(g,null,{default:T(()=>[p(o(ae))]),_:1}),d(h(o(H)(`@MKT:已安装`)),1)])):t.installable===!1?(b(),k(`span`,Fe,h(o(H)(`@MKT:暂不支持一键安装`)),1)):(b(),k(`button`,{key:2,class:`mp-install-btn`,disabled:de(t),onClick:e=>it(t)},h(de(t)?o(H)(`@MKT:安装中...`):o(H)(`@MKT:安装`)),9,Pe))])]))),128))])):t.status===`ok`?(b(),k(`div`,Ie,h(o(H)(`@MKT:该来源暂无结果`)),1)):f(``,!0)]))),128)),_.value.length?(b(),k(`section`,Le,[a(`header`,Re,[a(`h3`,ze,h(o(H)(`@MKT:已安装`)),1),a(`span`,Be,h(_.value.length),1)]),(b(),k(z,null,e([`project`,`global`],t=>a(`div`,{key:t},[q.value[t]?.length?(b(),k(`div`,Ve,[a(`div`,He,h(t===`project`?o(H)(`@MKT:当前项目`):o(H)(`@MKT:g ai 智能体`)),1),a(`div`,Ue,[(b(!0),k(z,null,e(q.value[t],e=>(b(),k(`div`,{key:t+e.id,class:`mp-installed-row`},[a(`span`,{class:`mp-installed-name`,title:e.name},h(e.name),9,We),e.id&&e.id!==e.name?(b(),k(`code`,{key:0,class:`mp-installed-id`,title:e.dir||e.file||e.id},h(e.id),9,Ge)):f(``,!0),e.package?(b(),k(`code`,Ke,h(e.package),1)):f(``,!0),e.requiredEnv?.length?(b(),k(`span`,qe,h(o(H)(`@MKT:待配置`))+`: `+h(e.requiredEnv.join(`, `)),1)):f(``,!0),l[7]||=a(`span`,{class:`mp-foot-spacer`},null,-1),a(`button`,{class:`mp-reveal-btn`,disabled:B.value.has(t+e.id),title:e.dir||e.file||``,onClick:t=>st(e)},[p(g,null,{default:T(()=>[p(o(r))]),_:1}),d(` `+h(o(H)(`@MKT:打开文件夹`)),1)],8,Je),a(`button`,{class:`mp-remove-btn`,disabled:R.value.has(t+e.id),onClick:t=>ct(e)},[p(g,null,{default:T(()=>[p(o(M))]),_:1}),d(` `+h(R.value.has(t+e.id)?o(H)(`@MKT:卸载中...`):o(H)(`@MKT:卸载`)),1)],8,Ye)]))),128))])])):f(``,!0)])),64))])):f(``,!0),!v.value&&!m.value.length?(b(),k(`div`,Xe,h(o(H)(`@MKT:加载失败`)),1)):f(``,!0)])),[[O,v.value]]),p(ce,{modelValue:J.visible,"onUpdate:modelValue":l[5]||=e=>J.visible=e,title:o(H)(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:T(()=>[a(`button`,{class:`mkt-cancel`,onClick:l[4]||=e=>J.visible=!1},h(o(H)(`@MKT:取消`)),1),a(`button`,{class:`mkt-confirm`,onClick:rt},h(o(H)(`@MKT:安装`)),1)]),default:T(()=>[J.item?(b(),k(`div`,Ze,[a(`p`,Qe,h(J.item.name),1),(b(!0),k(z,null,e(Object.keys(J.env),e=>(b(),k(`div`,{key:e,class:`mkt-field`},[a(`label`,null,h(e),1),j(a(`input`,{"onUpdate:modelValue":t=>J.env[e]=t,type:`text`,autocomplete:`off`,placeholder:o(H)(`@MKT:环境变量值`),spellcheck:`false`},null,8,$e),[[x,J.env[e]]])]))),128)),J.item.args?.length?(b(),k(`div`,et,[a(`label`,null,h(o(H)(`@MKT:启动参数`)),1),j(a(`input`,{"onUpdate:modelValue":l[3]||=e=>J.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[x,J.args]]),a(`p`,tt,h(o(H)(`@MKT:参数提示`)),1)])):f(``,!0)])):f(``,!0)]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-79426bd0`]]);n(),I(),m();var rt={class:`agent-chat-area`},it={class:`agent-tabs`,role:`tablist`},at=[`aria-selected`,`onClick`],ot={class:`agent-tab-body`},st={key:0,class:`agent-chat-pane`},ct={key:0,class:`agent-list-page`},lt={key:0,class:`agent-page-bar`},ut=[`title`,`aria-label`],dt={class:`agent-page-title`},ft={key:0,class:`chat-loading`},pt=U(l({__name:`AgentView`,setup(n){let r=se(),s=w(null),{narrow:c}=J(s),l=w(`chat`),u=w(`chat`),d=g(()=>u.value===`mcp`?`mcp`:`skill`),m=g(()=>[{id:`chat`,label:H(`@AGENT:对话`),icon:D},{id:`skill`,label:H(`@AGENT:Skill 广场`),icon:_},{id:`mcp`,label:H(`@AGENT:MCP 广场`),icon:R}]),{sessions:te,sessionsLoading:ne,currentSessionId:x,messages:S,isStreaming:C,sessionLoading:E,loadSessions:O,loadSession:re,deleteSession:A,renameSession:j,newSession:M,sendMessage:N,pendingQuestion:ie,answeringQuestion:I,answerQuestion:ae,isSessionGenerating:oe,currentEngine:U,pendingEngine:ce,isEngineLocked:Y,pickEngine:pe,stop:me}=de(),he=g(()=>Y.value?U.value:ce.value);function ge(e){Y.value||pe(e)}let _e=g(()=>{let e=r.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),X=g(()=>W(te.value,oe)),ve=K(),ye=g(()=>X.value.find(e=>e.id===x.value)?.title||H(`@AGENT:对话`)),be={"--welcome-avatar":`url("${q}")`},xe=g(()=>[{id:`p1`,label:H(`@AGENT:查看项目结构`),prompt:H(`@AGENT:prompt_p1`)},{id:`p2`,label:H(`@AGENT:分析代码质量`),prompt:H(`@AGENT:prompt_p2`)},{id:`p3`,label:H(`@AGENT:帮我写测试`),prompt:H(`@AGENT:prompt_p3`)},{id:`p4`,label:H(`@AGENT:Git 状态检查`),prompt:H(`@AGENT:prompt_p4`)},{id:`p5`,label:H(`@AGENT:帮我启动项目`),prompt:H(`@AGENT:prompt_p5`)}]);async function Se(e){await N(e.text,e.files),await v(),Z()}async function Ce(e){await N(e.prompt),await v(),Z()}let we=le(),Te=w(null);function Z(e=!0){Te.value?.scrollToBottom(e)}F(()=>S.value.length,()=>{v(()=>Z(!1))});function Ee(e){re(e),l.value=`chat`}function De(){M(),l.value=`chat`}let Q=w(280),$=w(!1);function Oe(e){$.value=!0;let t=e.clientX,n=Q.value,r=e=>{let r=e.clientX-t,i=Math.max(200,Math.min(500,n+r));Q.value=i},i=()=>{$.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}return F(c,e=>{e||(l.value=`chat`)}),F(()=>[r.currentDirectory,C.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await O(),x.value&&!C.value&&!te.value.some(e=>e.sessionId===x.value)&&M()},{immediate:!0}),(n,r)=>(b(),k(`div`,{ref_key:`rootRef`,ref:s,class:`agent-view`},[u.value===`chat`&&!o(c)?(b(),k(z,{key:0},[a(`aside`,{class:`agent-sidebar`,style:y({width:Q.value+`px`})},[p(o(V),{class:`agent-conversations`,items:X.value,"active-id":o(x),loading:o(ne),labels:o(ve),onSelect:Ee,onNew:De,onRename:o(j),onDelete:o(A)},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])],4),a(`div`,{class:L([`sidebar-resizer`,{active:$.value}]),onMousedown:Oe},null,34)],64)):f(``,!0),a(`main`,rt,[a(`nav`,it,[(b(!0),k(z,null,e(m.value,e=>(b(),k(`button`,{key:e.id,type:`button`,class:L([`agent-tab`,{active:u.value===e.id}]),role:`tab`,"aria-selected":u.value===e.id,onClick:t=>u.value=e.id},[p(o(ee),null,{default:T(()=>[(b(),i(P(e.icon)))]),_:2},1024),a(`span`,null,h(e.label),1)],10,at))),128)),u.value===`chat`?(b(),i(fe,{key:0,class:`agent-engine`,engine:he.value,locked:o(Y),onSelect:ge},null,8,[`engine`,`locked`])):f(``,!0)]),a(`div`,ot,[u.value===`chat`?(b(),k(`div`,st,[o(c)&&l.value===`list`?(b(),k(`div`,ct,[p(o(V),{class:`agent-conversations`,items:X.value,"active-id":o(x),loading:o(ne),labels:o(ve),onSelect:Ee,onNew:De,onRename:o(j),onDelete:o(A)},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])])):(b(),k(z,{key:1},[o(c)?(b(),k(`div`,lt,[a(`button`,{type:`button`,class:`agent-page-back`,title:o(H)(`@AGENT:返回会话列表`),"aria-label":o(H)(`@AGENT:返回会话列表`),onClick:r[0]||=e=>l.value=`list`},[...r[1]||=[a(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[a(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),a(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,ut),a(`span`,dt,h(ye.value),1)])):f(``,!0),a(`div`,{class:`agent-chat-host`,style:be},[o(E)?(b(),k(`div`,ft,[p(o(ee),{class:`is-loading`,size:32},{default:T(()=>[p(o(t))]),_:1}),a(`span`,null,h(o(H)(`@AGENT:加载会话中...`)),1)])):(b(),i(o(B),{key:1,ref_key:`chatContainerRef`,ref:Te,messages:o(S),"preset-questions":xe.value,"welcome-title":o(H)(`@AGENT:智能体助手`),"welcome-description":o(H)(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":o(ue),"assistant-avatar":o(q),theme:_e.value,disabled:o(C),generating:o(C),"upload-config":{accept:o(G)},placeholder:o(C)?o(H)(`@AGENT:正在生成中...`):o(H)(`@AGENT:输入消息,Enter 发送`),question:o(ie),"question-submitting":o(I),"question-labels":o(we),"plan-config":{labels:{title:o(H)(`@AGENT:计划`),raw:o(H)(`@AGENT:原始参数`)}},onSend:Se,onSelect:Ce,onStop:o(me),onAnswer:o(ae)},null,8,[`messages`,`preset-questions`,`welcome-title`,`welcome-description`,`assistant-name`,`assistant-avatar`,`theme`,`disabled`,`generating`,`upload-config`,`placeholder`,`question`,`question-submitting`,`question-labels`,`plan-config`,`onStop`,`onAnswer`]))])],64))])):(b(),i(nt,{key:1,type:d.value},null,8,[`type`]))])])],512))}}),[[`__scopeId`,`data-v-05972cec`]]);export{pt as default};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,At as t,Bn as n,Ct as r,Dn as i,En as a,Er as o,Gt as s,Ht as c,In as l,J as ee,M as u,Nn as d,On as f,Pn as p,Pr as m,Qr as h,Tn as g,Tt as _,W as te,Wn as v,Yr as y,Yt as ne,Zn as b,_n as x,a as S,an as C,br as w,cr as T,dn as E,et as D,i as O,j as re,kn as k,kt as A,lr as j,lt as M,mt as N,nr as P,o as ie,or as F,pr as I,qr as L,st as R,tt as ae,vr as oe,xn as z}from"./element-plus-CgEuJBlB.js";import{a as B,t as V}from"./vendor-CDZ64WVU.js";import{n as H,t as U}from"./_plugin-vue_export-helper-Dp1lG95_.js";import{t as se}from"./configStore-wR8LDvKB.js";import{t as ce}from"./CommonDialog-BaaWQMm0.js";import{a as W,i as le,n as ue,o as G,r as K,s as de,t as q}from"./agentConversations-FiD_iarB.js";import{n as J,t as fe}from"./AgentEngineSelector-CSHgQmBZ.js";n(),I(),E(),m();var Y={class:`marketplace-panel`},pe={class:`mp-toolbar`},me={class:`mp-search`},he=[`placeholder`],ge={class:`mp-toolbar-sub`},_e={class:`mp-target-hint`},X={class:`mp-source-filter`},ve=[`onClick`],ye={class:`mp-body`},be={class:`mp-group-header`},xe={class:`mp-group-title`},Se={key:0,class:`mp-group-count`},Ce={key:1,class:`mp-group-error`},we=[`href`,`title`],Te={key:0,class:`mp-grid`},Z={class:`mp-card-head`},Ee=[`title`],De={key:0,class:`mp-card-metric`},Q=[`title`],$={class:`mp-card-meta`},Oe=[`title`],ke=[`title`],Ae={key:2,class:`mp-tag remote`},je={class:`mp-card-foot`},Me=[`href`],Ne={key:1,class:`mp-installed-chip`},Pe=[`disabled`,`onClick`],Fe={key:3,class:`mp-not-installable`},Ie={key:1,class:`mp-empty`},Le={key:0,class:`mp-group installed`},Re={class:`mp-group-header`},ze={class:`mp-group-title`},Be={class:`mp-group-count`},Ve={key:0,class:`mp-installed-block`},He={class:`mp-installed-target`},Ue={class:`mp-installed-list`},We=[`title`],Ge=[`title`],Ke={key:1,class:`mp-meta-pkg`},qe={key:2,class:`mp-tag warn`},Je=[`disabled`,`title`,`onClick`],Ye=[`disabled`,`onClick`],Xe={key:1,class:`mp-empty all`},Ze={key:0,class:`mkt-form`},Qe={class:`mkt-form-name`},$e=[`onUpdate:modelValue`,`placeholder`],et={key:0,class:`mkt-field`},tt={class:`mkt-hint`},nt=U(l({__name:`MarketplacePanel`,props:{type:{}},setup(t){let n=t,l=se(),m=w([]),_=w([]),v=w(!1),y=w(``),E=w(``),D=w([]),P=w(`project`),I=w(new Set),R=w(new Set),B=w(new Set),V=g(()=>l.currentDirectory||``),U=null;async function W(){if(!v.value){v.value=!0;try{let e=new URLSearchParams({type:n.type,cwd:V.value});E.value&&e.set(`q`,E.value),D.value.length&&e.set(`sources`,D.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();t?.success?(m.value=t.groups||[],_.value=t.installed||[]):S.error(t?.error||H(`@MKT:加载失败`))}catch{S.error(H(`@MKT:加载失败`))}finally{v.value=!1}}}F(y,e=>{U&&clearTimeout(U),U=setTimeout(()=>{E.value=e.trim(),W()},400)}),F(D,()=>W()),F(()=>n.type,()=>{D.value=[],E.value=``,y.value=``,W()}),F(V,()=>W()),W();let le=g(()=>{let e=V.value?V.value.split(/[\\/]/).filter(Boolean).pop():``;return P.value===`project`?e||H(`@MKT:当前项目`):H(`@MKT:g ai 智能体`)});function ue(e){return e.stars?`${G(e.stars)} ★`:e.downloads?`${G(e.downloads)} ${H(`@MKT:周下载`)}`:e.uses?`${G(e.uses)} ${H(`@MKT:次使用`)}`:``}function G(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function K(e){return`${e.id}`}function de(e){return I.value.has(K(e))}let q=g(()=>{let e={project:[],global:[]};for(let t of _.value)(e[t.target]||=[]).push(t);return e}),J=oe({visible:!1,item:null,env:{},args:``});function fe(e){return n.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function nt(e){J.item=e,J.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),J.args=(e.args||[]).join(` `),J.visible=!0}function rt(){let e=J.item;if(J.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(J.env).filter(([,e])=>e.trim()!==``)),n=J.args.trim()?J.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;at(e,{env:t,...n?{args:n}:{}})}async function it(e){if(!e.installed||await ot(e)){if(fe(e)){nt(e);return}await at(e,{})}}async function at(e,t){let r=K(e);I.value.add(r);try{let r=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:P.value,cwd:V.value,item:{...e,...t}})}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){S.error(i?.error||H(`@MKT:安装失败`));return}i.item?.warning&&S.warning(i.item.warning),i.item?.envKeys?.length?S.warning(`${H(`@MKT:还缺环境变量`)}: ${i.item.envKeys.join(`, `)}`):S.success(H(`@MKT:安装成功`)),await W()}catch{S.error(H(`@MKT:安装失败`))}finally{I.value.delete(r)}}async function ot(e){try{return await O.confirm(`${e.name} ${H(`@MKT:已安装,要重新安装吗?`)}`,H(`@MKT:重新安装`),{confirmButtonText:H(`@MKT:重装`),cancelButtonText:H(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function st(e){let t=`${e.target}:${e.id}`;B.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:e.target,cwd:V.value,id:e.id})}),r=await t.json().catch(()=>null);(!t.ok||!r?.success)&&S.error(r?.error||H(`@MKT:打开失败`))}catch{S.error(H(`@MKT:打开失败`))}finally{B.value.delete(t)}}async function ct(e){try{await O.confirm(`${H(`@MKT:确定卸载`)} ${e.name}?`,H(`@MKT:卸载`),{confirmButtonText:H(`@MKT:卸载`),cancelButtonText:H(`@MKT:取消`),type:`warning`})}catch{return}let t=`${e.target}:${e.id}`;R.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:V.value}),r=await fetch(`/api/agent/marketplace/item/${n.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){S.error(i?.error||H(`@MKT:卸载失败`));return}S.success(H(`@MKT:已卸载`)),await W()}catch{S.error(H(`@MKT:卸载失败`))}finally{R.value.delete(t)}}return(n,l)=>{let g=ee,S=re,w=u,E=te,O=ie;return b(),k(`div`,Y,[a(`div`,pe,[a(`div`,me,[p(g,{class:`mp-search-icon`},{default:T(()=>[p(o(s))]),_:1}),j(a(`input`,{"onUpdate:modelValue":l[0]||=e=>y.value=e,class:`mp-search-input`,type:`text`,placeholder:t.type===`skill`?o(H)(`@MKT:搜索 Skill...`):o(H)(`@MKT:搜索 MCP 服务...`)},null,8,he),[[x,y.value]])]),p(w,{modelValue:P.value,"onUpdate:modelValue":l[1]||=e=>P.value=e,size:`small`,class:`mp-target`},{default:T(()=>[p(S,{value:`project`},{default:T(()=>[d(h(o(H)(`@MKT:当前项目`)),1)]),_:1}),p(S,{value:`global`},{default:T(()=>[d(h(o(H)(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),p(E,{content:o(H)(`@MKT:刷新`),placement:`top`,"show-after":300},{default:T(()=>[a(`button`,{class:L([`mp-refresh`,{spinning:v.value}]),onClick:W},[p(g,null,{default:T(()=>[p(o(c))]),_:1})],2)]),_:1},8,[`content`])]),a(`div`,ge,[a(`span`,_e,[d(h(o(H)(`@MKT:安装到`))+` `,1),a(`b`,null,h(le.value),1)]),a(`div`,X,[(b(!0),k(z,null,e(m.value,e=>(b(),k(`button`,{key:e.id,class:L([`mp-chip`,{active:D.value.includes(e.id)}]),onClick:()=>{let t=D.value.indexOf(e.id);t>=0?D.value.splice(t,1):D.value.push(e.id)}},h(e.label),11,ve))),128)),D.value.length?(b(),k(`button`,{key:0,class:`mp-chip clear`,onClick:l[2]||=e=>D.value=[]},h(o(H)(`@MKT:全部来源`)),1)):f(``,!0)])]),j((b(),k(`div`,ye,[(b(!0),k(z,null,e(m.value,t=>(b(),k(`section`,{key:t.id,class:`mp-group`},[a(`header`,be,[a(`h3`,xe,h(t.label),1),t.status===`ok`?(b(),k(`span`,Se,h(t.items.length),1)):(b(),k(`span`,Ce,[p(g,null,{default:T(()=>[p(o(C))]),_:1}),d(` `+h(t.error||o(H)(`@MKT:来源不可用`)),1)])),t.homepage?(b(),k(`a`,{key:2,class:`mp-group-link`,href:t.homepage,target:`_blank`,rel:`noopener noreferrer`,title:t.homepage},[p(g,null,{default:T(()=>[p(o(A))]),_:1})],8,we)):f(``,!0)]),t.status===`ok`&&t.items.length?(b(),k(`div`,Te,[(b(!0),k(z,null,e(t.items,t=>(b(),k(`article`,{key:K(t),class:`mp-card`},[a(`div`,Z,[a(`span`,{class:`mp-card-name`,title:t.name},h(t.name),9,Ee),ue(t)?(b(),k(`span`,De,[p(g,null,{default:T(()=>[t.stars?(b(),i(o(ne),{key:0})):(b(),i(o(N),{key:1}))]),_:2},1024),d(` `+h(ue(t)),1)])):f(``,!0)]),a(`p`,{class:`mp-card-desc`,title:t.description},h(t.description||o(H)(`@MKT:暂无描述`)),9,Q),a(`div`,$,[t.package?(b(),k(`code`,{key:0,class:`mp-meta-pkg`,title:t.package},h(t.package),9,Oe)):t.repository?(b(),k(`span`,{key:1,class:`mp-meta-repo`,title:t.repository+(t.subpath?` · `+t.subpath:``)},[d(h(t.repository),1),t.subpath?(b(),k(z,{key:0},[d(` · `+h(t.subpath),1)],64)):f(``,!0)],8,ke)):f(``,!0),t.transport===`remote`?(b(),k(`span`,Ae,h(o(H)(`@MKT:远程服务`)),1)):f(``,!0),(b(!0),k(z,null,e((t.tags||[]).slice(0,2),e=>(b(),k(`span`,{key:e,class:`mp-tag`},h(e),1))),128))]),a(`div`,je,[t.upstream?(b(),k(`a`,{key:0,class:`mp-card-link`,href:t.upstream,target:`_blank`,rel:`noopener noreferrer`},h(o(H)(`@MKT:查看来源`)),9,Me)):f(``,!0),l[6]||=a(`span`,{class:`mp-foot-spacer`},null,-1),t.installed?(b(),k(`span`,Ne,[p(g,null,{default:T(()=>[p(o(ae))]),_:1}),d(h(o(H)(`@MKT:已安装`)),1)])):t.installable===!1?(b(),k(`span`,Fe,h(o(H)(`@MKT:暂不支持一键安装`)),1)):(b(),k(`button`,{key:2,class:`mp-install-btn`,disabled:de(t),onClick:e=>it(t)},h(de(t)?o(H)(`@MKT:安装中...`):o(H)(`@MKT:安装`)),9,Pe))])]))),128))])):t.status===`ok`?(b(),k(`div`,Ie,h(o(H)(`@MKT:该来源暂无结果`)),1)):f(``,!0)]))),128)),_.value.length?(b(),k(`section`,Le,[a(`header`,Re,[a(`h3`,ze,h(o(H)(`@MKT:已安装`)),1),a(`span`,Be,h(_.value.length),1)]),(b(),k(z,null,e([`project`,`global`],t=>a(`div`,{key:t},[q.value[t]?.length?(b(),k(`div`,Ve,[a(`div`,He,h(t===`project`?o(H)(`@MKT:当前项目`):o(H)(`@MKT:g ai 智能体`)),1),a(`div`,Ue,[(b(!0),k(z,null,e(q.value[t],e=>(b(),k(`div`,{key:t+e.id,class:`mp-installed-row`},[a(`span`,{class:`mp-installed-name`,title:e.name},h(e.name),9,We),e.id&&e.id!==e.name?(b(),k(`code`,{key:0,class:`mp-installed-id`,title:e.dir||e.file||e.id},h(e.id),9,Ge)):f(``,!0),e.package?(b(),k(`code`,Ke,h(e.package),1)):f(``,!0),e.requiredEnv?.length?(b(),k(`span`,qe,h(o(H)(`@MKT:待配置`))+`: `+h(e.requiredEnv.join(`, `)),1)):f(``,!0),l[7]||=a(`span`,{class:`mp-foot-spacer`},null,-1),a(`button`,{class:`mp-reveal-btn`,disabled:B.value.has(t+e.id),title:e.dir||e.file||``,onClick:t=>st(e)},[p(g,null,{default:T(()=>[p(o(r))]),_:1}),d(` `+h(o(H)(`@MKT:打开文件夹`)),1)],8,Je),a(`button`,{class:`mp-remove-btn`,disabled:R.value.has(t+e.id),onClick:t=>ct(e)},[p(g,null,{default:T(()=>[p(o(M))]),_:1}),d(` `+h(R.value.has(t+e.id)?o(H)(`@MKT:卸载中...`):o(H)(`@MKT:卸载`)),1)],8,Ye)]))),128))])])):f(``,!0)])),64))])):f(``,!0),!v.value&&!m.value.length?(b(),k(`div`,Xe,h(o(H)(`@MKT:加载失败`)),1)):f(``,!0)])),[[O,v.value]]),p(ce,{modelValue:J.visible,"onUpdate:modelValue":l[5]||=e=>J.visible=e,title:o(H)(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:T(()=>[a(`button`,{class:`mkt-cancel`,onClick:l[4]||=e=>J.visible=!1},h(o(H)(`@MKT:取消`)),1),a(`button`,{class:`mkt-confirm`,onClick:rt},h(o(H)(`@MKT:安装`)),1)]),default:T(()=>[J.item?(b(),k(`div`,Ze,[a(`p`,Qe,h(J.item.name),1),(b(!0),k(z,null,e(Object.keys(J.env),e=>(b(),k(`div`,{key:e,class:`mkt-field`},[a(`label`,null,h(e),1),j(a(`input`,{"onUpdate:modelValue":t=>J.env[e]=t,type:`text`,autocomplete:`off`,placeholder:o(H)(`@MKT:环境变量值`),spellcheck:`false`},null,8,$e),[[x,J.env[e]]])]))),128)),J.item.args?.length?(b(),k(`div`,et,[a(`label`,null,h(o(H)(`@MKT:启动参数`)),1),j(a(`input`,{"onUpdate:modelValue":l[3]||=e=>J.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[x,J.args]]),a(`p`,tt,h(o(H)(`@MKT:参数提示`)),1)])):f(``,!0)])):f(``,!0)]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-536d7952`]]);n(),I(),m();var rt={class:`agent-chat-area`},it={class:`agent-tabs`,role:`tablist`},at=[`aria-selected`,`onClick`],ot={class:`agent-tab-body`},st={key:0,class:`agent-chat-pane`},ct={key:0,class:`agent-list-page`},lt={key:0,class:`agent-page-bar`},ut=[`title`,`aria-label`],dt={class:`agent-page-title`},ft={key:0,class:`chat-loading`},pt=U(l({__name:`AgentView`,setup(n){let r=se(),s=w(null),{narrow:c}=J(s),l=w(`chat`),u=w(`chat`),d=g(()=>u.value===`mcp`?`mcp`:`skill`),m=g(()=>[{id:`chat`,label:H(`@AGENT:对话`),icon:D},{id:`skill`,label:H(`@AGENT:Skill 广场`),icon:_},{id:`mcp`,label:H(`@AGENT:MCP 广场`),icon:R}]),{sessions:te,sessionsLoading:ne,currentSessionId:x,messages:S,isStreaming:C,sessionLoading:E,loadSessions:O,loadSession:re,deleteSession:A,renameSession:j,newSession:M,sendMessage:N,pendingQuestion:ie,answeringQuestion:I,answerQuestion:ae,isSessionGenerating:oe,currentEngine:U,pendingEngine:ce,isEngineLocked:Y,pickEngine:pe,stop:me}=de(),he=g(()=>Y.value?U.value:ce.value);function ge(e){Y.value||pe(e)}let _e=g(()=>{let e=r.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),X=g(()=>W(te.value,oe)),ve=K(),ye=g(()=>X.value.find(e=>e.id===x.value)?.title||H(`@AGENT:对话`)),be={"--welcome-avatar":`url("${q}")`},xe=g(()=>[{id:`p1`,label:H(`@AGENT:查看项目结构`),prompt:H(`@AGENT:prompt_p1`)},{id:`p2`,label:H(`@AGENT:分析代码质量`),prompt:H(`@AGENT:prompt_p2`)},{id:`p3`,label:H(`@AGENT:帮我写测试`),prompt:H(`@AGENT:prompt_p3`)},{id:`p4`,label:H(`@AGENT:Git 状态检查`),prompt:H(`@AGENT:prompt_p4`)},{id:`p5`,label:H(`@AGENT:帮我启动项目`),prompt:H(`@AGENT:prompt_p5`)}]);async function Se(e){await N(e.text,e.files),await v(),Z()}async function Ce(e){await N(e.prompt),await v(),Z()}let we=le(),Te=w(null);function Z(e=!0){Te.value?.scrollToBottom(e)}F(()=>S.value.length,()=>{v(()=>Z(!1))});function Ee(e){re(e),l.value=`chat`}function De(){M(),l.value=`chat`}let Q=w(280),$=w(!1);function Oe(e){$.value=!0;let t=e.clientX,n=Q.value,r=e=>{let r=e.clientX-t,i=Math.max(200,Math.min(500,n+r));Q.value=i},i=()=>{$.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}return F(c,e=>{e||(l.value=`chat`)}),F(()=>[r.currentDirectory,C.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await O(),x.value&&!C.value&&!te.value.some(e=>e.sessionId===x.value)&&M()},{immediate:!0}),(n,r)=>(b(),k(`div`,{ref_key:`rootRef`,ref:s,class:`agent-view`},[u.value===`chat`&&!o(c)?(b(),k(z,{key:0},[a(`aside`,{class:`agent-sidebar`,style:y({width:Q.value+`px`})},[p(o(V),{class:`agent-conversations`,items:X.value,"active-id":o(x),loading:o(ne),labels:o(ve),onSelect:Ee,onNew:De,onRename:o(j),onDelete:o(A)},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])],4),a(`div`,{class:L([`sidebar-resizer`,{active:$.value}]),onMousedown:Oe},null,34)],64)):f(``,!0),a(`main`,rt,[a(`nav`,it,[(b(!0),k(z,null,e(m.value,e=>(b(),k(`button`,{key:e.id,type:`button`,class:L([`agent-tab`,{active:u.value===e.id}]),role:`tab`,"aria-selected":u.value===e.id,onClick:t=>u.value=e.id},[p(o(ee),null,{default:T(()=>[(b(),i(P(e.icon)))]),_:2},1024),a(`span`,null,h(e.label),1)],10,at))),128)),u.value===`chat`?(b(),i(fe,{key:0,class:`agent-engine`,engine:he.value,locked:o(Y),onSelect:ge},null,8,[`engine`,`locked`])):f(``,!0)]),a(`div`,ot,[u.value===`chat`?(b(),k(`div`,st,[o(c)&&l.value===`list`?(b(),k(`div`,ct,[p(o(V),{class:`agent-conversations`,items:X.value,"active-id":o(x),loading:o(ne),labels:o(ve),onSelect:Ee,onNew:De,onRename:o(j),onDelete:o(A)},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])])):(b(),k(z,{key:1},[o(c)?(b(),k(`div`,lt,[a(`button`,{type:`button`,class:`agent-page-back`,title:o(H)(`@AGENT:返回会话列表`),"aria-label":o(H)(`@AGENT:返回会话列表`),onClick:r[0]||=e=>l.value=`list`},[...r[1]||=[a(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[a(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),a(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,ut),a(`span`,dt,h(ye.value),1)])):f(``,!0),a(`div`,{class:`agent-chat-host`,style:be},[o(E)?(b(),k(`div`,ft,[p(o(ee),{class:`is-loading`,size:32},{default:T(()=>[p(o(t))]),_:1}),a(`span`,null,h(o(H)(`@AGENT:加载会话中...`)),1)])):(b(),i(o(B),{key:1,ref_key:`chatContainerRef`,ref:Te,messages:o(S),"preset-questions":xe.value,"welcome-title":o(H)(`@AGENT:智能体助手`),"welcome-description":o(H)(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":o(ue),"assistant-avatar":o(q),theme:_e.value,disabled:o(C),generating:o(C),"upload-config":{accept:o(G)},placeholder:o(C)?o(H)(`@AGENT:正在生成中...`):o(H)(`@AGENT:输入消息,Enter 发送`),question:o(ie),"question-submitting":o(I),"question-labels":o(we),"plan-config":{labels:{title:o(H)(`@AGENT:计划`),raw:o(H)(`@AGENT:原始参数`)}},onSend:Se,onSelect:Ce,onStop:o(me),onAnswer:o(ae)},null,8,[`messages`,`preset-questions`,`welcome-title`,`welcome-description`,`assistant-name`,`assistant-avatar`,`theme`,`disabled`,`generating`,`upload-config`,`placeholder`,`question`,`question-submitting`,`question-labels`,`plan-config`,`onStop`,`onAnswer`]))])],64))])):(b(),i(nt,{key:1,type:d.value},null,8,[`type`]))])])],512))}}),[[`__scopeId`,`data-v-855f248d`]]);export{pt as default};
@@ -0,0 +1 @@
1
+ .marketplace-panel[data-v-536d7952]{background:var(--bg-container);flex-direction:column;height:100%;min-height:0;display:flex}.mp-toolbar[data-v-536d7952]{flex-shrink:0;align-items:center;gap:12px;padding:12px 16px 8px;display:flex}.mp-search[data-v-536d7952]{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-536d7952]:focus-within{border-color:var(--color-primary)}.mp-search .mp-search-icon[data-v-536d7952]{color:var(--text-meta);flex-shrink:0}.mp-search .mp-search-input[data-v-536d7952]{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-536d7952]::placeholder{color:var(--text-meta)}.mp-target[data-v-536d7952]{flex-shrink:0}.mp-refresh[data-v-536d7952]{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-536d7952]:hover{color:var(--color-primary);border-color:var(--color-primary)}.mp-refresh.spinning svg[data-v-536d7952]{animation:.9s linear infinite mkt-spin-536d7952}@keyframes mkt-spin-536d7952{to{transform:rotate(360deg)}}.mp-toolbar-sub[data-v-536d7952]{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:12px;padding:0 16px 10px;display:flex}.mp-target-hint[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-meta)}.mp-target-hint b[data-v-536d7952]{color:var(--color-primary);font-weight:600}.mp-source-filter[data-v-536d7952]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.mp-chip[data-v-536d7952]{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-536d7952]:hover{color:var(--text-secondary);border-color:var(--text-tertiary)}.mp-chip.active[data-v-536d7952]{color:var(--color-primary);border-color:var(--color-primary);background:color-mix(in srgb, var(--color-primary) 8%, transparent)}.mp-chip.clear[data-v-536d7952]{color:var(--text-meta);border-style:dashed}.mp-body[data-v-536d7952]{flex:1;min-height:0;padding:0 16px 20px;overflow-y:auto}.mp-group[data-v-536d7952]{margin-bottom:20px}.mp-group.installed[data-v-536d7952]{border-top:1px dashed var(--border-color);padding-top:14px}.mp-group-header[data-v-536d7952]{align-items:center;gap:8px;margin-bottom:10px;display:flex}.mp-group-title[data-v-536d7952]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mp-group-count[data-v-536d7952]{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-536d7952]{font-size:var(--font-size-sm);color:var(--color-warning-dark);align-items:center;gap:4px;display:inline-flex}.mp-group-link[data-v-536d7952]{color:var(--text-meta);transition:color var(--transition-fast) ease;display:inline-flex}.mp-group-link[data-v-536d7952]:hover{color:var(--color-primary)}.mp-grid[data-v-536d7952]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;display:grid}.mp-card[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);transition:border-color var(--transition-fast) ease, box-shadow var(--transition-fast) ease;flex-direction:column;gap:6px;padding:12px;display:flex}.mp-card[data-v-536d7952]:hover{border-color:color-mix(in srgb, var(--color-primary) 40%, var(--border-color));box-shadow:var(--shadow-sm)}.mp-card-head[data-v-536d7952]{align-items:center;gap:8px;display:flex}.mp-card-name[data-v-536d7952]{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-536d7952]{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-536d7952]{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-536d7952]{flex-wrap:wrap;align-items:center;gap:6px;min-height:18px;display:flex}.mp-meta-pkg[data-v-536d7952],.mp-meta-repo[data-v-536d7952]{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-536d7952]{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-536d7952]{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-536d7952]{background:color-mix(in srgb, var(--color-warning) 14%, transparent);color:var(--color-warning-dark)}.mp-card-foot[data-v-536d7952]{align-items:center;gap:8px;margin-top:2px;display:flex}.mp-card-link[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);text-decoration:none}.mp-card-link[data-v-536d7952]:hover{color:var(--color-primary);text-decoration:underline}.mp-foot-spacer[data-v-536d7952]{flex:1}.mp-install-btn[data-v-536d7952]{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-536d7952]:hover:not(:disabled){background:var(--color-primary);color:#fff}.mp-install-btn[data-v-536d7952]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-installed-chip[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--color-success,var(--action-emerald));align-items:center;gap:3px;display:inline-flex}.mp-not-installable[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta)}.mp-empty[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-meta);padding:16px 0}.mp-empty.all[data-v-536d7952]{text-align:center;padding:48px 0}.mp-installed-block[data-v-536d7952]{margin-bottom:12px}.mp-installed-target[data-v-536d7952]{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-536d7952]{flex-direction:column;gap:4px;display:flex}.mp-installed-row[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-base);background:var(--bg-panel);align-items:center;gap:10px;padding:6px 10px;display:flex}.mp-installed-name[data-v-536d7952]{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-536d7952]{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-536d7952],.mp-remove-btn[data-v-536d7952]{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-536d7952]:disabled,.mp-remove-btn[data-v-536d7952]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-reveal-btn[data-v-536d7952]:hover:not(:disabled){color:var(--text-primary);border-color:var(--text-tertiary)}.mp-remove-btn[data-v-536d7952]:hover:not(:disabled){color:var(--color-danger-dark);border-color:var(--color-danger)}@media (prefers-reduced-motion:reduce){.mp-refresh.spinning svg[data-v-536d7952]{animation:none}}.mkt-form[data-v-536d7952]{flex-direction:column;gap:12px;display:flex}.mkt-form-name[data-v-536d7952]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mkt-field[data-v-536d7952]{flex-direction:column;gap:4px;display:flex}.mkt-field label[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:600}.mkt-field input[data-v-536d7952]{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-536d7952]:focus{border-color:var(--color-primary);outline:none}.mkt-hint[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0}.mkt-cancel[data-v-536d7952],.mkt-confirm[data-v-536d7952]{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-536d7952]{border:1px solid var(--border-color);color:var(--text-secondary);background:0 0;margin-right:8px}.mkt-cancel[data-v-536d7952]:hover{color:var(--text-primary);border-color:var(--text-tertiary)}.mkt-confirm[data-v-536d7952]{border:1px solid var(--color-primary);background:var(--color-primary);color:#fff}.mkt-confirm[data-v-536d7952]:hover{opacity:.9}.agent-view[data-v-855f248d]{background:var(--bg-container);height:100%;min-height:0;display:flex}.agent-sidebar[data-v-855f248d]{background:var(--bg-panel);border-right:1px solid var(--border-color);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.agent-conversations[data-v-855f248d]{flex:1;min-height:0;padding:10px 6px 8px 12px}.sidebar-resizer[data-v-855f248d]{cursor:col-resize;width:4px;transition:background var(--transition-fast) ease;background:0 0;flex-shrink:0}.sidebar-resizer[data-v-855f248d]:hover,.sidebar-resizer.active[data-v-855f248d]{background:var(--color-primary);opacity:.3}.agent-chat-area[data-v-855f248d]{flex-direction:column;flex:1;min-width:0;display:flex;position:relative;overflow:hidden}.agent-engine[data-v-855f248d]{margin-bottom:7px;margin-left:auto}.agent-tabs[data-v-855f248d]{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-855f248d]{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-855f248d]:hover{color:var(--text-secondary);background:var(--bg-hover)}.agent-tab.active[data-v-855f248d]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:600}.agent-tab-body[data-v-855f248d]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-pane[data-v-855f248d]{flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.agent-tab-body[data-v-855f248d]>.marketplace-panel{flex:1;min-height:0}.chat-loading[data-v-855f248d]{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-855f248d]{background:var(--bg-panel);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-list-page .agent-conversations[data-v-855f248d]{padding:12px 12px 10px 14px}.agent-page-bar[data-v-855f248d]{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-855f248d]{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-855f248d]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-page-title[data-v-855f248d]{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-855f248d]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-host[data-v-855f248d] .acu-avatar--left{background:0 0}.agent-chat-host[data-v-855f248d] .acu-welcome-logo{background:var(--welcome-avatar) center/46px 46px no-repeat;width:56px;height:56px;box-shadow:none}.agent-chat-host[data-v-855f248d] .acu-welcome-logo>svg{display:none}.agent-chat-host[data-v-855f248d] .acu-welcome-grid{flex-wrap:wrap;display:flex}.agent-chat-host[data-v-855f248d] .acu-welcome-grid>.acu-preset-q{flex:260px;min-width:0}[data-theme=dark]{background:var(--bg-panel)}
@@ -1,2 +1,2 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{At as e,Bn as t,Dn as n,En as r,Er as i,In as a,J as o,Nn as s,On as c,Pn as l,Pr as u,Qr as d,Tn as f,W as p,Wn as m,Yn as h,Zn as g,a as _,br as v,cr as y,i as b,kn as x,nt as S,or as C,pr as w,qn as T,qr as E,rt as D,z as O}from"./element-plus-CgEuJBlB.js";import{n as k,t as A}from"./_plugin-vue_export-helper-DF39dMex.js";import{t as j}from"./CommonDialog-CFLZuomi.js";async function M(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 N(){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 P(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 M(t,t=>{try{e(JSON.parse(t))}catch{}})}async function F(){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())};M(e,e=>{try{let r=JSON.parse(e);r.type===`ready`&&typeof r.port==`number`&&r.port>0?i(()=>t(r.port)):r.type===`timeout`?i(()=>n(Error(`restart.timeout`))):r.type===`error`&&i(()=>n(Error(r.message||`restart.failed`)))}catch{}}).then(()=>{i(()=>n(Error(`restart.stream-closed`)))}).catch(()=>{})})}t(),w(),u();var I={key:3},L={key:4},R={key:5},z={key:0,class:`upgrade-hint`},B={key:0,class:`upgrade-countdown`},V={key:1,class:`upgrade-manual`},H={class:`upgrade-manual__label`},U=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,W=A(a({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean},logs:{},status:{},countdown:{default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(t,{emit:a}){let u=t,f=a,p=v(null);C(()=>u.logs,async()=>{await m(),p.value&&(p.value.scrollTop=p.value.scrollHeight)});function h(){u.status!==`running`&&(u.status===`success`&&u.countdown>0&&f(`cancel`),f(`update:modelValue`,!1))}function b(){f(`retry`)}function w(){f(`restart`)}function T(){f(`cancel`),f(`update:modelValue`,!1)}async function A(){try{await navigator.clipboard.writeText(U),_.success(k(`@F13B4:已复制升级命令`))}catch{_.warning(k(`@F13B4:复制失败,请手动复制`))}}return(a,u)=>{let m=o,_=O;return g(),n(j,{"model-value":t.modelValue,"onUpdate:modelValue":u[0]||=e=>f(`update:modelValue`,e),title:i(k)(`@F13B4:升级`),width:`680px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":t.status!==`running`,"append-to-body":``,onClose:h},{footer:y(()=>[t.status===`failed`?(g(),n(_,{key:0,type:`primary`,onClick:b},{default:y(()=>[s(d(i(k)(`@F13B4:重试`)),1)]),_:1})):c(``,!0),t.status===`failed`?(g(),n(_,{key:1,onClick:A},{default:y(()=>[s(d(i(k)(`@F13B4:复制升级命令`)),1)]),_:1})):c(``,!0),t.status===`success`?(g(),n(_,{key:2,type:`primary`,onClick:w},{default:y(()=>[s(d(i(k)(`@F13B4:立即重启并刷新`)),1)]),_:1})):c(``,!0),t.status===`success`?(g(),n(_,{key:3,onClick:T},{default:y(()=>[s(d(i(k)(`@F13B4:稍后手动重启`)),1)]),_:1})):c(``,!0),t.status===`running`?(g(),n(_,{key:4,disabled:``},{default:y(()=>[s(d(i(k)(`@F13B4:升级中`))+`... `,1)]),_:1})):c(``,!0)]),default:y(()=>[r(`div`,{class:E([`upgrade-status`,`is-${t.status}`])},[t.status===`running`?(g(),n(m,{key:0,class:`is-loading`},{default:y(()=>[l(i(e))]),_:1})):t.status===`success`?(g(),n(m,{key:1,color:`var(--color-success)`},{default:y(()=>[l(i(S))]),_:1})):(g(),n(m,{key:2,color:`var(--color-danger)`},{default:y(()=>[l(i(D))]),_:1})),t.status===`running`?(g(),x(`span`,I,d(i(k)(`@F13B4:升级中`)),1)):t.status===`success`?(g(),x(`span`,L,d(i(k)(`@F13B4:升级完成`)),1)):(g(),x(`span`,R,d(i(k)(`@F13B4:升级失败`)),1))],2),t.status===`success`?(g(),x(`p`,z,[s(d(i(k)(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),t.countdown>0?(g(),x(`span`,B,d(i(k)(`@F13B4:{seconds} 秒后自动刷新`,{seconds:t.countdown})),1)):c(``,!0)])):c(``,!0),t.status===`failed`?(g(),x(`p`,V,[r(`span`,H,d(i(k)(`@F13B4:手动升级命令`)),1),r(`code`,{class:`upgrade-manual__cmd`},d(U))])):c(``,!0),r(`pre`,{ref_key:`logEl`,ref:p,class:`upgrade-log`},d(t.logs||i(k)(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}}}),[[`__scopeId`,`data-v-5c9f402d`]]);t(),w(),u();var G={class:`app-version-badge`},K=[`aria-label`],q=[`aria-label`],J=[`title`,`aria-label`],Y={class:`upgrade-btn__label`},X={class:`upgrade-btn__version`},Z=`https://github.com/xz333221/zen-gitsync/releases`,Q=5,$=`app-version-check`,ee=36e5,te=A(a({__name:`AppVersionBadge`,setup(e){let t=`2.17.40`,n=v(t),a=f(()=>n.value||t),o=v(null),s=v(!1),u=v(``),m=v(`running`),S=v(0),C=null,w=v(!1);function E(){try{let e=sessionStorage.getItem($);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>ee?null:n}catch{return null}}function D(e){try{sessionStorage.setItem($,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function O(e=!1){let t=E();t&&(o.value=t);try{let t=await N();o.value=t,D(t),t.current&&(n.value=t.current),!e&&t.success&&t.hasUpdate&&_({type:`success`,message:k(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||_({type:`warning`,message:k(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function A(){if(o.value?.hasUpdate){try{await b.confirm(k(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:o.value.current,latest:o.value.latest}),k(`@F13B4:升级`),{confirmButtonText:k(`@F13B4:确定升级`),cancelButtonText:k(`@F13B4:取消`),type:`info`})}catch{return}u.value=``,m.value=`running`,s.value=!0,await P(e=>{if(e.type===`done`){if(m.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem($)}catch{}o.value?.latest&&(n.value=o.value.latest),j()}}else e.message&&(u.value+=e.message)})}}function j(){M(),S.value=Q,C=setInterval(()=>{--S.value,S.value<=0&&(C&&=(clearInterval(C),null),L())},1e3)}function M(){C&&=(clearInterval(C),null),S.value=0}function I(){M()}async function L(){if(M(),!w.value){w.value=!0;try{let e=await F(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];_({type:`warning`,message:n?k(n):k(`@F13B4:重启失败 {error}`,{error:t})}),w.value=!1}}}return T(()=>{M()}),h(()=>{O(!0)}),(e,t)=>{let n=p;return g(),x(`div`,G,[l(n,{content:i(k)(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:y(()=>[r(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i(k)(`@F13B4:在 GitHub 上查看源码`)},[...t[1]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z`})],-1)]],8,K)]),_:1},8,[`content`]),l(n,{content:i(k)(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:y(()=>[r(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i(k)(`@F13B4:在 npm 上查看包`)},[...t[2]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,q)]),_:1},8,[`content`]),l(n,{content:i(k)(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:y(()=>[r(`a`,{href:Z,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+d(a.value),1)]),_:1},8,[`content`]),o.value?.hasUpdate?(g(),x(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i(k)(`@F13B4:发现新版本 {version},点击升级`,{version:o.value.latest??``}),"aria-label":i(k)(`@F13B4:发现新版本 {version},点击升级`,{version:o.value.latest??``}),onClick:A},[t[3]||=r(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),r(`span`,Y,d(i(k)(`@F13B4:升级`)),1),r(`span`,X,`v`+d(o.value.latest),1)],8,J)):c(``,!0),l(W,{modelValue:s.value,"onUpdate:modelValue":t[0]||=e=>s.value=e,logs:u.value,status:m.value,countdown:S.value,onRetry:A,onRestart:L,onCancel:I},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}}}),[[`__scopeId`,`data-v-4084e4be`]]);export{te as default};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{At as e,Bn as t,Dn as n,En as r,Er as i,In as a,J as o,Nn as s,On as c,Pn as l,Pr as u,Qr as d,Tn as f,W as p,Wn as m,Yn as h,Zn as g,a as _,br as v,cr as y,i as b,kn as x,nt as S,or as C,pr as w,qn as T,qr as E,rt as D,z as O}from"./element-plus-CgEuJBlB.js";import{n as k,t as A}from"./_plugin-vue_export-helper-Dp1lG95_.js";import{t as j}from"./CommonDialog-BaaWQMm0.js";async function M(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 N(){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 P(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 M(t,t=>{try{e(JSON.parse(t))}catch{}})}async function F(){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())};M(e,e=>{try{let r=JSON.parse(e);r.type===`ready`&&typeof r.port==`number`&&r.port>0?i(()=>t(r.port)):r.type===`timeout`?i(()=>n(Error(`restart.timeout`))):r.type===`error`&&i(()=>n(Error(r.message||`restart.failed`)))}catch{}}).then(()=>{i(()=>n(Error(`restart.stream-closed`)))}).catch(()=>{})})}t(),w(),u();var I={key:3},L={key:4},R={key:5},z={key:0,class:`upgrade-hint`},B={key:0,class:`upgrade-countdown`},V={key:1,class:`upgrade-manual`},H={class:`upgrade-manual__label`},U=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,W=A(a({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean},logs:{},status:{},countdown:{default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(t,{emit:a}){let u=t,f=a,p=v(null);C(()=>u.logs,async()=>{await m(),p.value&&(p.value.scrollTop=p.value.scrollHeight)});function h(){u.status!==`running`&&(u.status===`success`&&u.countdown>0&&f(`cancel`),f(`update:modelValue`,!1))}function b(){f(`retry`)}function w(){f(`restart`)}function T(){f(`cancel`),f(`update:modelValue`,!1)}async function A(){try{await navigator.clipboard.writeText(U),_.success(k(`@F13B4:已复制升级命令`))}catch{_.warning(k(`@F13B4:复制失败,请手动复制`))}}return(a,u)=>{let m=o,_=O;return g(),n(j,{"model-value":t.modelValue,"onUpdate:modelValue":u[0]||=e=>f(`update:modelValue`,e),title:i(k)(`@F13B4:升级`),width:`680px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":t.status!==`running`,"append-to-body":``,onClose:h},{footer:y(()=>[t.status===`failed`?(g(),n(_,{key:0,type:`primary`,onClick:b},{default:y(()=>[s(d(i(k)(`@F13B4:重试`)),1)]),_:1})):c(``,!0),t.status===`failed`?(g(),n(_,{key:1,onClick:A},{default:y(()=>[s(d(i(k)(`@F13B4:复制升级命令`)),1)]),_:1})):c(``,!0),t.status===`success`?(g(),n(_,{key:2,type:`primary`,onClick:w},{default:y(()=>[s(d(i(k)(`@F13B4:立即重启并刷新`)),1)]),_:1})):c(``,!0),t.status===`success`?(g(),n(_,{key:3,onClick:T},{default:y(()=>[s(d(i(k)(`@F13B4:稍后手动重启`)),1)]),_:1})):c(``,!0),t.status===`running`?(g(),n(_,{key:4,disabled:``},{default:y(()=>[s(d(i(k)(`@F13B4:升级中`))+`... `,1)]),_:1})):c(``,!0)]),default:y(()=>[r(`div`,{class:E([`upgrade-status`,`is-${t.status}`])},[t.status===`running`?(g(),n(m,{key:0,class:`is-loading`},{default:y(()=>[l(i(e))]),_:1})):t.status===`success`?(g(),n(m,{key:1,color:`var(--color-success)`},{default:y(()=>[l(i(S))]),_:1})):(g(),n(m,{key:2,color:`var(--color-danger)`},{default:y(()=>[l(i(D))]),_:1})),t.status===`running`?(g(),x(`span`,I,d(i(k)(`@F13B4:升级中`)),1)):t.status===`success`?(g(),x(`span`,L,d(i(k)(`@F13B4:升级完成`)),1)):(g(),x(`span`,R,d(i(k)(`@F13B4:升级失败`)),1))],2),t.status===`success`?(g(),x(`p`,z,[s(d(i(k)(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),t.countdown>0?(g(),x(`span`,B,d(i(k)(`@F13B4:{seconds} 秒后自动刷新`,{seconds:t.countdown})),1)):c(``,!0)])):c(``,!0),t.status===`failed`?(g(),x(`p`,V,[r(`span`,H,d(i(k)(`@F13B4:手动升级命令`)),1),r(`code`,{class:`upgrade-manual__cmd`},d(U))])):c(``,!0),r(`pre`,{ref_key:`logEl`,ref:p,class:`upgrade-log`},d(t.logs||i(k)(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}}}),[[`__scopeId`,`data-v-6de8caee`]]);t(),w(),u();var G={class:`app-version-badge`},K=[`aria-label`],q=[`aria-label`],J=[`title`,`aria-label`],Y={class:`upgrade-btn__label`},X={class:`upgrade-btn__version`},Z=`https://github.com/xz333221/zen-gitsync/releases`,Q=5,$=`app-version-check`,ee=36e5,te=A(a({__name:`AppVersionBadge`,setup(e){let t=`2.17.41`,n=v(t),a=f(()=>n.value||t),o=v(null),s=v(!1),u=v(``),m=v(`running`),S=v(0),C=null,w=v(!1);function E(){try{let e=sessionStorage.getItem($);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>ee?null:n}catch{return null}}function D(e){try{sessionStorage.setItem($,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function O(e=!1){let t=E();t&&(o.value=t);try{let t=await N();o.value=t,D(t),t.current&&(n.value=t.current),!e&&t.success&&t.hasUpdate&&_({type:`success`,message:k(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||_({type:`warning`,message:k(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function A(){if(o.value?.hasUpdate){try{await b.confirm(k(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:o.value.current,latest:o.value.latest}),k(`@F13B4:升级`),{confirmButtonText:k(`@F13B4:确定升级`),cancelButtonText:k(`@F13B4:取消`),type:`info`})}catch{return}u.value=``,m.value=`running`,s.value=!0,await P(e=>{if(e.type===`done`){if(m.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem($)}catch{}o.value?.latest&&(n.value=o.value.latest),j()}}else e.message&&(u.value+=e.message)})}}function j(){M(),S.value=Q,C=setInterval(()=>{--S.value,S.value<=0&&(C&&=(clearInterval(C),null),L())},1e3)}function M(){C&&=(clearInterval(C),null),S.value=0}function I(){M()}async function L(){if(M(),!w.value){w.value=!0;try{let e=await F(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];_({type:`warning`,message:n?k(n):k(`@F13B4:重启失败 {error}`,{error:t})}),w.value=!1}}}return T(()=>{M()}),h(()=>{O(!0)}),(e,t)=>{let n=p;return g(),x(`div`,G,[l(n,{content:i(k)(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:y(()=>[r(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i(k)(`@F13B4:在 GitHub 上查看源码`)},[...t[1]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z`})],-1)]],8,K)]),_:1},8,[`content`]),l(n,{content:i(k)(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:y(()=>[r(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i(k)(`@F13B4:在 npm 上查看包`)},[...t[2]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,q)]),_:1},8,[`content`]),l(n,{content:i(k)(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:y(()=>[r(`a`,{href:Z,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+d(a.value),1)]),_:1},8,[`content`]),o.value?.hasUpdate?(g(),x(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i(k)(`@F13B4:发现新版本 {version},点击升级`,{version:o.value.latest??``}),"aria-label":i(k)(`@F13B4:发现新版本 {version},点击升级`,{version:o.value.latest??``}),onClick:A},[t[3]||=r(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),r(`span`,Y,d(i(k)(`@F13B4:升级`)),1),r(`span`,X,`v`+d(o.value.latest),1)],8,J)):c(``,!0),l(W,{modelValue:s.value,"onUpdate:modelValue":t[0]||=e=>s.value=e,logs:u.value,status:m.value,countdown:S.value,onRetry:A,onRestart:L,onCancel:I},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}}}),[[`__scopeId`,`data-v-81522bab`]]);export{te as default};
@@ -0,0 +1 @@
1
+ .upgrade-status[data-v-6de8caee]{align-items:center;gap:var(--spacing-base);margin-bottom:var(--spacing-md);font-size:var(--font-size-base);font-weight:500;display:flex}.upgrade-status.is-running[data-v-6de8caee]{color:var(--el-color-primary)}.upgrade-status.is-success[data-v-6de8caee]{color:var(--color-success-dark)}.upgrade-status.is-failed[data-v-6de8caee]{color:var(--color-danger-dark)}.upgrade-status .is-loading[data-v-6de8caee]{animation:2s linear infinite rotating-6de8caee}.upgrade-log[data-v-6de8caee]{color:#d4d4d4;border-radius:var(--radius-base);height:320px;font-family:JetBrains Mono,Cascadia Code,Consolas,monospace;font-size:var(--font-size-sm);white-space:pre-wrap;word-break:break-all;background:#1e1e1e;margin:0;padding:12px;line-height:1.6;overflow:auto}.upgrade-hint[data-v-6de8caee]{margin:0 0 var(--spacing-md) 0;border:1px solid color-mix(in srgb, var(--color-success) 26%, transparent);border-radius:var(--radius-base);color:var(--color-success-dark);font-size:var(--font-size-mid);background:#67c23a14;padding:8px 12px}.upgrade-countdown[data-v-6de8caee]{background:var(--el-color-success);color:#fff;border-radius:var(--radius-md);font-size:var(--font-size-sm);margin-left:8px;padding:1px 8px;font-weight:600;animation:1s ease-in-out infinite pulse-6de8caee;display:inline-block}.upgrade-manual[data-v-6de8caee]{margin:0 0 var(--spacing-md) 0;border:1px solid color-mix(in srgb, var(--color-danger) 26%, transparent);border-radius:var(--radius-base);font-size:var(--font-size-mid);background:#f56c6c14;padding:8px 12px}.upgrade-manual__label[data-v-6de8caee]{color:var(--color-danger-dark);margin-bottom:4px;font-weight:500;display:block}.upgrade-manual__cmd[data-v-6de8caee]{border-radius:var(--radius-base);font-family:JetBrains Mono,Cascadia Code,Consolas,monospace;font-size:var(--font-size-sm);color:var(--text-primary,#303133);word-break:break-all;-webkit-user-select:all;user-select:all;background:#0000000a;padding:6px 8px;display:block}@keyframes pulse-6de8caee{0%,to{opacity:1}50%{opacity:.55}}@keyframes rotating-6de8caee{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.app-version-badge[data-v-81522bab]{align-items:center;gap:var(--spacing-base);margin-left:auto;display:inline-flex}.badge-icon-link[data-v-81522bab]{border-radius:var(--radius-base);width:22px;height:22px;color:var(--text-meta);opacity:.7;transition:color var(--transition-base) ease, opacity var(--transition-base) ease, background var(--transition-base) ease;justify-content:center;align-items:center;text-decoration:none;display:inline-flex}.badge-icon-link[data-v-81522bab]:hover{opacity:1;color:var(--text-secondary);background:var(--bg-hover)}.badge-icon-link--npm[data-v-81522bab]:hover{color:var(--color-npm)}.badge-icon-link[data-v-81522bab]:first-child:hover{color:var(--text-primary)}.version-link[data-v-81522bab]{font-family:monospace;font-size:var(--font-size-xs);color:var(--text-secondary);border-radius:var(--radius-base);transition:color var(--transition-base), background-color var(--transition-base);padding:2px 6px;text-decoration:none}.version-link[data-v-81522bab]:hover{color:var(--color-primary);background-color:#0000000a}.upgrade-btn[data-v-81522bab]{appearance:none;cursor:pointer;height:22px;font-family:inherit;font-size:var(--font-size-xs);color:#fff;background:linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-dark) 100%);box-shadow:var(--shadow-sm);transition:transform var(--transition-fast) var(--ease-custom), box-shadow var(--transition-fast) var(--ease-custom), filter var(--transition-fast) var(--ease-custom);white-space:nowrap;-webkit-user-select:none;user-select:none;border:0;border-radius:11px;outline:none;align-items:center;gap:5px;margin:0;padding:0 10px 0 8px;font-weight:600;line-height:1;display:inline-flex}.upgrade-btn[data-v-81522bab]:hover{filter:brightness(1.08);box-shadow:var(--shadow-md);transform:translateY(-1px)}.upgrade-btn[data-v-81522bab]:active{filter:brightness(.96);box-shadow:var(--shadow-sm);transform:translateY(0)}.upgrade-btn[data-v-81522bab]:focus-visible{outline:var(--focus-outline);outline-offset:2px}.upgrade-btn__dot[data-v-81522bab]{background:#fff;border-radius:50%;flex-shrink:0;width:6px;height:6px;animation:1.6s ease-in-out infinite upgrade-pulse-81522bab;box-shadow:0 0 0 2px #ffffff59}.upgrade-btn__label[data-v-81522bab]{letter-spacing:.5px}.upgrade-btn__version[data-v-81522bab]{font-family:monospace;font-size:var(--font-size-xs);border-radius:var(--radius-md);background:#ffffff38;padding:1px 5px;font-weight:500;line-height:1.2}@keyframes upgrade-pulse-81522bab{0%,to{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.8)}}
@@ -1 +1 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,Dn as n,En as r,Er as i,F as ee,G as te,Ht as a,I as ne,In as o,J as re,K as s,Nt as c,On as l,Pn as u,Pr as d,Qr as f,Tn as p,U as ie,Zn as m,br as h,cr as g,dn as _,kn as v,pr as y,qr as b,r as ae,tt as x,xn as S,yn as C,zt as w}from"./element-plus-CgEuJBlB.js";import{n as T,t as E}from"./_plugin-vue_export-helper-DF39dMex.js";import{t as D}from"./SvgIcon-CevyX7lX.js";import{t as O}from"./IconButton-BSJ5FhS5.js";import{r as k}from"./gitStore-1o5Sp0mh.js";import{t as A}from"./CommonDialog-CFLZuomi.js";t(),y(),d(),_();var j={key:0,class:`branch-info`},M={class:`branch-wrapper`},N={class:`branch-btn`},P={class:`branch-btn-name`},F={class:`branch-btn-caret`},I={class:`branch-popover-inner`},L={class:`branch-search`},R={class:`branch-list`},z=[`onClick`],B={key:1,class:`branch-item-check-placeholder`},V={class:`branch-item-name`},oe={key:0,class:`branch-empty`},H={class:`branch-popover-footer`},U={class:`create-branch-content`},W={class:`form-label`},G={class:`form-label`},K={class:`dialog-footer`},q={class:`footer-actions`},se=[`disabled`],J=E(o({__name:`BranchSelector`,emits:[`branchChanged`],setup(t,{emit:o}){let d=k(),_=o,y=h(!1),E=h(``),J=p(()=>{let e=E.value.trim().toLowerCase();return e?d.allBranches.filter(t=>t.toLowerCase().includes(e)):d.allBranches});async function ce(e){if(e===d.currentBranch){y.value=!1;return}y.value=!1,await d.changeBranch(e)&&(_(`branchChanged`),d.refreshLog())}let Y=h(!1),X=h(``),Z=h(``);function le(){y.value=!1,Z.value=d.currentBranch,Y.value=!0}async function Q(){await d.createBranch(X.value,Z.value)&&(Y.value=!1,X.value=``,_(`branchChanged`))}let $=h(!1);async function ue(){if(!$.value){$.value=!0;try{await Promise.all([d.getCurrentBranch(!0),d.getBranchStatus(!0),d.getAllBranches()]),_(`branchChanged`),d.refreshLog()}finally{$.value=!1}}}return(t,o)=>{let p=re,h=ie,_=ae,k=s,de=ee,fe=ne,pe=te;return i(d).currentBranch?(m(),v(`div`,j,[r(`div`,M,[u(_,{visible:y.value,"onUpdate:visible":o[1]||=e=>y.value=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:o[2]||=e=>E.value=``},{reference:g(()=>[r(`button`,N,[u(D,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),r(`span`,P,f(i(d).currentBranch),1),r(`span`,F,[u(p,null,{default:g(()=>[...o[7]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.776a29.12 29.12 0 0 0 0-41.6 30.592 30.592 0 0 0-42.752 0z`})],-1)]]),_:1})])])]),default:g(()=>[r(`div`,I,[r(`div`,L,[u(h,{modelValue:E.value,"onUpdate:modelValue":o[0]||=e=>E.value=e,placeholder:i(T)(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),r(`div`,R,[(m(!0),v(S,null,e(J.value,e=>(m(),v(`div`,{key:e,class:b([`branch-item`,{"is-active":e===i(d).currentBranch}]),onClick:t=>ce(e)},[e===i(d).currentBranch?(m(),n(p,{key:0,class:`branch-item-check`},{default:g(()=>[u(i(x))]),_:1})):(m(),v(`span`,B)),u(D,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),r(`span`,V,f(e),1)],10,z))),128)),J.value.length===0?(m(),v(`div`,oe,f(i(T)(`@F13B4:没有匹配的分支`)),1)):l(``,!0)]),r(`div`,H,[r(`button`,{class:`branch-create-btn`,onClick:le},[u(p,null,{default:g(()=>[u(i(w))]),_:1}),r(`span`,null,f(i(T)(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),u(O,{tooltip:i(T)(`@CMDCON:刷新`),onClick:ue},{default:g(()=>[u(p,{class:b({"is-loading":$.value})},{default:g(()=>[u(i(a))]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),u(A,{modelValue:Y.value,"onUpdate:modelValue":o[6]||=e=>Y.value=e,title:i(T)(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:g(()=>[r(`div`,K,[r(`div`,q,[r(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:o[5]||=e=>Y.value=!1},f(i(T)(`@F13B4:取消`)),1),r(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:Q,disabled:i(d).isCreatingBranch},[i(d).isCreatingBranch?(m(),n(p,{key:1,class:`is-loading`},{default:g(()=>[...o[8]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z`})],-1)]]),_:1})):(m(),n(p,{key:0},{default:g(()=>[u(i(x))]),_:1})),r(`span`,null,f(i(T)(`@F13B4:创建`)),1)],8,se)])])]),default:g(()=>[r(`div`,U,[u(pe,{model:{newBranchName:X.value,selectedBaseBranch:Z.value},"label-position":`top`},{default:g(()=>[u(k,null,{label:g(()=>[r(`div`,W,[u(p,{class:`label-icon`},{default:g(()=>[u(i(w))]),_:1}),r(`span`,null,f(i(T)(`@F13B4:新分支名称`)),1)])]),default:g(()=>[u(h,{modelValue:X.value,"onUpdate:modelValue":o[3]||=e=>X.value=e,placeholder:i(T)(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:C(Q,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),u(k,null,{label:g(()=>[r(`div`,G,[u(p,{class:`label-icon`},{default:g(()=>[u(i(c))]),_:1}),r(`span`,null,f(i(T)(`@F13B4:基于分支`)),1)])]),default:g(()=>[u(fe,{modelValue:Z.value,"onUpdate:modelValue":o[4]||=e=>Z.value=e,placeholder:i(T)(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:g(()=>[(m(!0),v(S,null,e(i(d).allBranches,e=>(m(),n(de,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):l(``,!0)}}}),[[`__scopeId`,`data-v-407da320`]]);export{J as default};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,Dn as n,En as r,Er as i,F as ee,G as te,Ht as a,I as ne,In as o,J as re,K as s,Nt as c,On as l,Pn as u,Pr as d,Qr as f,Tn as p,U as ie,Zn as m,br as h,cr as g,dn as _,kn as v,pr as y,qr as b,r as ae,tt as x,xn as S,yn as C,zt as w}from"./element-plus-CgEuJBlB.js";import{n as T,t as E}from"./_plugin-vue_export-helper-Dp1lG95_.js";import{t as D}from"./SvgIcon-7IDEgoQx.js";import{t as O}from"./IconButton-8QwNIEIr.js";import{r as k}from"./gitStore-D4L9bpMp.js";import{t as A}from"./CommonDialog-BaaWQMm0.js";t(),y(),d(),_();var j={key:0,class:`branch-info`},M={class:`branch-wrapper`},N={class:`branch-btn`},P={class:`branch-btn-name`},F={class:`branch-btn-caret`},I={class:`branch-popover-inner`},L={class:`branch-search`},R={class:`branch-list`},z=[`onClick`],B={key:1,class:`branch-item-check-placeholder`},V={class:`branch-item-name`},oe={key:0,class:`branch-empty`},H={class:`branch-popover-footer`},U={class:`create-branch-content`},W={class:`form-label`},G={class:`form-label`},K={class:`dialog-footer`},q={class:`footer-actions`},se=[`disabled`],J=E(o({__name:`BranchSelector`,emits:[`branchChanged`],setup(t,{emit:o}){let d=k(),_=o,y=h(!1),E=h(``),J=p(()=>{let e=E.value.trim().toLowerCase();return e?d.allBranches.filter(t=>t.toLowerCase().includes(e)):d.allBranches});async function ce(e){if(e===d.currentBranch){y.value=!1;return}y.value=!1,await d.changeBranch(e)&&(_(`branchChanged`),d.refreshLog())}let Y=h(!1),X=h(``),Z=h(``);function le(){y.value=!1,Z.value=d.currentBranch,Y.value=!0}async function Q(){await d.createBranch(X.value,Z.value)&&(Y.value=!1,X.value=``,_(`branchChanged`))}let $=h(!1);async function ue(){if(!$.value){$.value=!0;try{await Promise.all([d.getCurrentBranch(!0),d.getBranchStatus(!0),d.getAllBranches()]),_(`branchChanged`),d.refreshLog()}finally{$.value=!1}}}return(t,o)=>{let p=re,h=ie,_=ae,k=s,de=ee,fe=ne,pe=te;return i(d).currentBranch?(m(),v(`div`,j,[r(`div`,M,[u(_,{visible:y.value,"onUpdate:visible":o[1]||=e=>y.value=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:o[2]||=e=>E.value=``},{reference:g(()=>[r(`button`,N,[u(D,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),r(`span`,P,f(i(d).currentBranch),1),r(`span`,F,[u(p,null,{default:g(()=>[...o[7]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.776a29.12 29.12 0 0 0 0-41.6 30.592 30.592 0 0 0-42.752 0z`})],-1)]]),_:1})])])]),default:g(()=>[r(`div`,I,[r(`div`,L,[u(h,{modelValue:E.value,"onUpdate:modelValue":o[0]||=e=>E.value=e,placeholder:i(T)(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),r(`div`,R,[(m(!0),v(S,null,e(J.value,e=>(m(),v(`div`,{key:e,class:b([`branch-item`,{"is-active":e===i(d).currentBranch}]),onClick:t=>ce(e)},[e===i(d).currentBranch?(m(),n(p,{key:0,class:`branch-item-check`},{default:g(()=>[u(i(x))]),_:1})):(m(),v(`span`,B)),u(D,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),r(`span`,V,f(e),1)],10,z))),128)),J.value.length===0?(m(),v(`div`,oe,f(i(T)(`@F13B4:没有匹配的分支`)),1)):l(``,!0)]),r(`div`,H,[r(`button`,{class:`branch-create-btn`,onClick:le},[u(p,null,{default:g(()=>[u(i(w))]),_:1}),r(`span`,null,f(i(T)(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),u(O,{tooltip:i(T)(`@CMDCON:刷新`),onClick:ue},{default:g(()=>[u(p,{class:b({"is-loading":$.value})},{default:g(()=>[u(i(a))]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),u(A,{modelValue:Y.value,"onUpdate:modelValue":o[6]||=e=>Y.value=e,title:i(T)(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:g(()=>[r(`div`,K,[r(`div`,q,[r(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:o[5]||=e=>Y.value=!1},f(i(T)(`@F13B4:取消`)),1),r(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:Q,disabled:i(d).isCreatingBranch},[i(d).isCreatingBranch?(m(),n(p,{key:1,class:`is-loading`},{default:g(()=>[...o[8]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z`})],-1)]]),_:1})):(m(),n(p,{key:0},{default:g(()=>[u(i(x))]),_:1})),r(`span`,null,f(i(T)(`@F13B4:创建`)),1)],8,se)])])]),default:g(()=>[r(`div`,U,[u(pe,{model:{newBranchName:X.value,selectedBaseBranch:Z.value},"label-position":`top`},{default:g(()=>[u(k,null,{label:g(()=>[r(`div`,W,[u(p,{class:`label-icon`},{default:g(()=>[u(i(w))]),_:1}),r(`span`,null,f(i(T)(`@F13B4:新分支名称`)),1)])]),default:g(()=>[u(h,{modelValue:X.value,"onUpdate:modelValue":o[3]||=e=>X.value=e,placeholder:i(T)(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:C(Q,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),u(k,null,{label:g(()=>[r(`div`,G,[u(p,{class:`label-icon`},{default:g(()=>[u(i(c))]),_:1}),r(`span`,null,f(i(T)(`@F13B4:基于分支`)),1)])]),default:g(()=>[u(fe,{modelValue:Z.value,"onUpdate:modelValue":o[4]||=e=>Z.value=e,placeholder:i(T)(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:g(()=>[(m(!0),v(S,null,e(i(d).allBranches,e=>(m(),n(de,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):l(``,!0)}}}),[[`__scopeId`,`data-v-407da320`]]);export{J as default};