zen-gitsync 2.16.11 → 2.16.12

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 (24) hide show
  1. package/README.md +8 -16
  2. package/package.json +1 -1
  3. package/scripts/release.js +3 -3
  4. package/src/cli/customCommand.exec.test.js +52 -13
  5. package/src/ui/public/assets/{AgentView-d83DuyQq.js → AgentView-B_SeSMYO.js} +1 -1
  6. package/src/ui/public/assets/{AppVersionBadge-UNabzjNF.js → AppVersionBadge-BeXH_zPw.js} +2 -2
  7. package/src/ui/public/assets/{BranchSelector-DUbFSWiQ.js → BranchSelector-DiKVTd6_.js} +1 -1
  8. package/src/ui/public/assets/{CommitForm-HiRHE42z.js → CommitForm-bj3k-DPA.js} +1 -1
  9. package/src/ui/public/assets/{EditorView-BvLP-NL1.js → EditorView-B9Px9HM-.js} +0 -0
  10. package/src/ui/public/assets/{FlowExecutionViewer-6mr8M454.js → FlowExecutionViewer-B5j4P2AL.js} +1 -1
  11. package/src/ui/public/assets/{FlowOrchestrationWorkspace-Cw2ADY-p.js → FlowOrchestrationWorkspace-CvpUR_GE.js} +1 -1
  12. package/src/ui/public/assets/{LogList-DLg6RUCd.js → LogList-CRf4Qp6G.js} +1 -1
  13. package/src/ui/public/assets/{MindmapView-BKIsdNvz.js → MindmapView-F9BzvQzm.js} +1 -1
  14. package/src/ui/public/assets/{MonitorView-BjjHr8a5.js → MonitorView-Cp74zQIe.js} +1 -1
  15. package/src/ui/public/assets/{ProjectStartupButton-C-qI63k1.js → ProjectStartupButton-CAJ6NfgE.js} +1 -1
  16. package/src/ui/public/assets/{RemoteRepoCard-B0q3WipX.js → RemoteRepoCard-DbxZKwZQ.js} +1 -1
  17. package/src/ui/public/assets/{SourceMapView-BZgc-Ylv.js → SourceMapView-SLERMi2h.js} +1 -1
  18. package/src/ui/public/assets/{UserInputNode-s3Dfg2Gm.js → UserInputNode-BJdehl9K.js} +1 -1
  19. package/src/ui/public/assets/{WorkbenchView-BakrUWDH.js → WorkbenchView-Ds2-DJ0d.js} +1 -1
  20. package/src/ui/public/assets/index-BEPT2LNX.js +82 -0
  21. package/src/ui/public/assets/index-Fbjp0DKn.css +1 -0
  22. package/src/ui/public/index.html +2 -2
  23. package/src/ui/public/assets/index-Bumd4MSq.css +0 -1
  24. package/src/ui/public/assets/index-Cr5-U-r6.js +0 -82
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # zen-gitsync
1
+ # zen-gitsync
2
2
 
3
3
  [English](#zen-gitsync) | [中文](#zh)
4
4
 
@@ -7,7 +7,7 @@ A Git automation platform with interactive commits, scheduled sync, custom comma
7
7
  ## Table of Contents
8
8
 
9
9
  - [Installation](#installation)
10
- - [What''s New](#v2xx--whats-new)
10
+ - [What's New](#v2xx--whats-new)
11
11
  - [GUI](#gui)
12
12
  - [Core Git Panel](#core-git-panel)
13
13
  - [Branch Management](#branch-management)
@@ -38,7 +38,7 @@ npm install -g zen-gitsync
38
38
 
39
39
  ---
40
40
 
41
- ## v2.x.x — What''s New
41
+ ## v2.x.x — What's New
42
42
 
43
43
  - **Visual GUI** — Full graphical interface for Git operations
44
44
  - **Branch management** — Create, switch, and track local/remote branches
@@ -62,7 +62,7 @@ npm install -g zen-gitsync
62
62
  - **Accessibility (WCAG 2.1 AA)** — Dialog focus trap & restore, role-based separators, keyboard-only panel resize (`← → ↑ ↓`), screen-reader friendly commit context menu, ARIA-pressed toggle buttons, commit button `aria-busy` during in-flight commits, Git SHA hashes meet ≥ 4.5:1 contrast in both light and dark themes
63
63
  - **Faster cold start** — `monaco-editor` / `@vue-flow` / `flow-mindmap` / `dagre` are split into independent chunks and lazy-loaded so the Git panel boots without waiting on the code editor or visual workflow designer
64
64
 
65
- > Detailed per-release change log (a11y/perf fixes, i18n missing translations, dead-code removals, etc.) lives in [CHANGELOG.md](./CHANGELOG.md).
65
+ > Detailed per-release changes can be found via `git log` or the [GitHub Releases](https://github.com/xz333221/zen-gitsync/releases) page.
66
66
 
67
67
  ---
68
68
 
@@ -410,16 +410,7 @@ git add --renormalize .
410
410
 
411
411
  ### Package manager
412
412
 
413
- All `package.json` scripts use **npm** (`npm install`, `npm run dev`, `npm run release`, etc.). The repo also has a `pnpm-lock.yaml` checked in for reproducibility on machines that prefer pnpm — both managers work because `package.json` is the single source of truth. The CLI's own `bin` entry and most devDeps are pinned to caret ranges; either manager will resolve to compatible versions.
414
-
415
- If you switch managers, delete the other manager's lockfile so only one is in the tree:
416
-
417
- ```bash
418
- rm -f pnpm-lock.yaml # when running on npm
419
- rm -f package-lock.json # when running on pnpm
420
- ```
421
-
422
- `.gitignore` already lists both `pnpm-lock.yaml` and `package-lock.json`, so neither is forced into version control.
413
+ All `package.json` scripts use **npm** (`npm install`, `npm run dev`, `npm run release`, etc.). The `package-lock.json` is git-ignored, so each developer generates it locally. The CLI's own `bin` entry and most devDeps are pinned to caret ranges.
423
414
 
424
415
  ---
425
416
 
@@ -608,7 +599,7 @@ npm install -g zen-gitsync
608
599
  - **可访问性(WCAG 2.1 AA)** — 弹窗焦点陷阱与归还、`role="separator"` 键盘可达的分隔条、纯键盘(`← → ↑ ↓`)调整面板宽度、屏幕阅读器友好的提交右键菜单、ARIA-pressed 切换按钮、提交按钮在提交过程中挂 `aria-busy`、Git 提交哈希在明/暗主题下对比度均 ≥ 4.5:1
609
600
  - **更快的冷启动** — `monaco-editor` / `@vue-flow` / `flow-mindmap` / `dagre` 拆分为独立 chunk 并按需懒加载,Git 面板首屏不再等待代码编辑器或可视化流程编排模块
610
601
 
611
- > 每个版本的详细变更日志(可访问性/性能修复、i18n 漏译、死代码清理等)见 [CHANGELOG.md](./CHANGELOG.md)
602
+ > 每个版本的详细变更可通过 `git log` 或 [GitHub Releases](https://github.com/xz333221/zen-gitsync/releases) 页面查看。
612
603
 
613
604
  ---
614
605
 
@@ -923,7 +914,7 @@ Activity Bar 中的机器人图标视图,可直接在浏览器中与内置 AI
923
914
 
924
915
  ![用户设置弹窗 — 通用 tab](https://raw.githubusercontent.com/xz333221/zen-gitsync/main/public/images/settings-general.png)
925
916
 
926
- > 点击顶部条右上角齿轮图标。tab 包含 **通用 / Git / 提交 / AI / 主题 / 语言 / 文件锁定 / NPM 路径**。大部分开关即时生效,无需重启 GUI。
917
+ > 点击顶部条右上角齿轮图标。tab 包含 **通用 / Git / 提交 / AI / 主题 / 语言 / 文件锁定 / NPM 路径**。大部分开关即时生效,无需重启 GUI。点击底栏的 **默认模型** 名称可一键定位到「AI 模型」tab
927
918
 
928
919
  | 设置项 | 说明 |
929
920
  |---|---|
@@ -933,6 +924,7 @@ Activity Bar 中的机器人图标视图,可直接在浏览器中与内置 AI
933
924
  | 语言 | 中文 / English |
934
925
  | 文件锁定 | 锁定文件,使其永远不被暂存或储藏 |
935
926
  | NPM 路径 | 配置 `package.json` 的扫描位置 |
927
+ | AI 模型 | 配置 OpenAI / Claude 等兼容 OpenAI 协议的 LLM 端点(API Key、baseURL、模型名),可设置默认模型,多套配置并存 |
936
928
 
937
929
  ---
938
930
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zen-gitsync",
3
- "version": "2.16.11",
3
+ "version": "2.16.12",
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",
@@ -50,10 +50,10 @@ const sleep = (ms) => new Promise((r) => setTimeout(r, ms))
50
50
 
51
51
  // 显式白名单:只有这些文件路径会被 git add。
52
52
  // 禁止 `git add .` 防止把工作区脏文件 / 临时调试文件一起带上 release commit。
53
- // lockfile (package-lock.json / pnpm-lock.yaml) 都在 .gitignore 里,
53
+ // lockfile (package-lock.json) .gitignore 里,
54
54
  // 即便列在白名单也会被 git 拒绝 add,所以这里不列。
55
- // 实际入 release commit 的只有 package.json(版本号)+ CHANGELOG.md
56
- const RELEASE_FILES = ['package.json', 'CHANGELOG.md']
55
+ // 实际入 release commit 的只有 package.json(版本号)。
56
+ const RELEASE_FILES = ['package.json']
57
57
 
58
58
  function createReadlineInterface() {
59
59
  return readline.createInterface({ input: process.stdin, output: process.stdout })
@@ -19,7 +19,9 @@
19
19
  // (`node -e "..."` 跨平台) 触发 runCustomCommand 内部 callback,
20
20
  // 验证 stdout/stderr/error 三条打印分支都生效。
21
21
  //
22
- // 测试间用 `setTimeout(200)` 等真实子进程跑完(避免 microtask 顺序问题)。
22
+ // 测试间用 `waitForContent()` 轮询等待真实子进程的 exec 回调跑完。
23
+ // 早期版本用固定 setTimeout(200),但在 Windows + node --test 并行执行下
24
+ // 子进程回调经常晚于 200ms 到达,导致 flaky 失败。
23
25
  import { test, afterEach } from 'node:test'
24
26
  import assert from 'node:assert/strict'
25
27
  import { runCustomCommand } from './customCommand.js'
@@ -46,9 +48,37 @@ afterEach(() => {
46
48
  _resetForTests()
47
49
  })
48
50
 
49
- /** 等异步 exec 回调跑完的辅助函数 — 200ms 足够本地 node -e 完成 */
50
- function settle() {
51
- return new Promise((r) => setTimeout(r, 200))
51
+ /**
52
+ * 等异步 exec 回调跑完的辅助函数。
53
+ * 轮询检测目标数组中出现匹配内容,最多等 3 秒。
54
+ * 比固定 setTimeout 更可靠,避免 Windows 上 exec 回调时序不稳定导致的 flaky。
55
+ *
56
+ * @param {() => boolean} predicate - 检测是否完成的断言函数
57
+ * @param {number} timeout - 最大等待毫秒数
58
+ * @param {number} interval - 轮询间隔毫秒数
59
+ * @returns {Promise<void>}
60
+ */
61
+ function waitFor(predicate, timeout = 3000, interval = 50) {
62
+ return new Promise((resolve, reject) => {
63
+ const start = Date.now()
64
+ function check() {
65
+ try {
66
+ if (predicate()) return resolve()
67
+ } catch (e) {
68
+ // predicate 可能抛 AssertionError,先记录但不立即失败
69
+ }
70
+ if (Date.now() - start >= timeout) {
71
+ return reject(new Error(`waitFor() 超时(${timeout}ms): 条件未满足`))
72
+ }
73
+ setTimeout(check, interval)
74
+ }
75
+ check()
76
+ })
77
+ }
78
+
79
+ /** 超时兜底:无论结果如何,在指定时间后 resolve(用于断言"不应出现"的场景) */
80
+ function settle(timeout = 500) {
81
+ return new Promise((r) => setTimeout(r, timeout))
52
82
  }
53
83
 
54
84
  // ========== 行为契约 ==========
@@ -56,7 +86,8 @@ function settle() {
56
86
  test('runCustomCommand: silent=true 不打印 [自定义命令执行] 头标', async () => {
57
87
  captureConsole()
58
88
  runCustomCommand('node -e "console.log(1)"', { silent: true })
59
- await settle()
89
+ // 等足够久确保 exec 回调已执行(断言"不应出现"的场景)
90
+ await settle(500)
60
91
  assert.equal(
61
92
  logs.some((m) => /\[自定义命令执行\]/.test(m)),
62
93
  false,
@@ -66,8 +97,9 @@ test('runCustomCommand: silent=true 不打印 [自定义命令执行] 头标', a
66
97
 
67
98
  test('runCustomCommand: 非 silent 打印 [自定义命令执行] 头标 + 命令', async () => {
68
99
  captureConsole()
100
+ // 非 silent 模式头标是同步打印的,但 stdout 是异步的
69
101
  runCustomCommand('node -e "console.log(1)"')
70
- await settle()
102
+ await waitFor(() => logs.some((m) => /\[自定义命令执行\]/.test(m)))
71
103
  assert.ok(
72
104
  logs.some((m) => /\[自定义命令执行\]/.test(m)),
73
105
  '非 silent 应打印 [自定义命令执行] 头标'
@@ -81,7 +113,7 @@ test('runCustomCommand: 非 silent 打印 [自定义命令执行] 头标 + 命
81
113
  test('runCustomCommand: stdout 有内容时打印 [自定义命令输出] + 内容', async () => {
82
114
  captureConsole()
83
115
  runCustomCommand('node -e "console.log(\'hello-from-stdout\')"', { silent: true })
84
- await settle()
116
+ await waitFor(() => logs.some((m) => /hello-from-stdout/.test(m)))
85
117
  assert.ok(
86
118
  logs.some((m) => /\[自定义命令输出\]/.test(m)),
87
119
  '应打印 [自定义命令输出] 头标'
@@ -98,7 +130,7 @@ test('runCustomCommand: stderr 有内容时打印 [自定义命令错误输出]
98
130
  'node -e "console.error(\'warning-msg\')"',
99
131
  { silent: true }
100
132
  )
101
- await settle()
133
+ await waitFor(() => errs.some((m) => /warning-msg/.test(m)))
102
134
  assert.ok(
103
135
  errs.some((m) => /\[自定义命令错误输出\]/.test(m)),
104
136
  '应打印 [自定义命令错误输出] 头标'
@@ -112,7 +144,7 @@ test('runCustomCommand: stderr 有内容时打印 [自定义命令错误输出]
112
144
  test('runCustomCommand: 进程非 0 退出时打印 [自定义命令错误]', async () => {
113
145
  captureConsole()
114
146
  runCustomCommand('node -e "process.exit(1)"', { silent: true })
115
- await settle()
147
+ await waitFor(() => errs.some((m) => /\[自定义命令错误\]/.test(m)))
116
148
  assert.ok(
117
149
  errs.some((m) => /\[自定义命令错误\]/.test(m)),
118
150
  '非 0 退出应打印 [自定义命令错误] 头标'
@@ -123,7 +155,8 @@ test('runCustomCommand: 进程非 0 退出时打印 [自定义命令错误]', as
123
155
  test('runCustomCommand: 成功 + 无输出时不打印 [自定义命令输出/错误]', async () => {
124
156
  captureConsole()
125
157
  runCustomCommand('node -e ""', { silent: true })
126
- await settle()
158
+ // 等足够久确保 exec 回调已执行(无输出的情况无法用 waitFor 检测内容)
159
+ await settle(1000)
127
160
  assert.equal(logs.some((m) => /\[自定义命令输出\]/.test(m)), false)
128
161
  assert.equal(errs.some((m) => /\[自定义命令错误\]/.test(m)), false)
129
162
  assert.equal(errs.some((m) => /\[自定义命令错误输出\]/.test(m)), false)
@@ -135,7 +168,10 @@ test('runCustomCommand: 同时有 stdout 和 stderr 时两条都打印', async (
135
168
  'node -e "console.log(\'OUT-MARKER-XYZ\'); console.error(\'ERR-MARKER-XYZ\')"',
136
169
  { silent: true }
137
170
  )
138
- await settle()
171
+ await waitFor(() =>
172
+ logs.some((m) => /OUT-MARKER-XYZ/.test(m)) &&
173
+ errs.some((m) => /ERR-MARKER-XYZ/.test(m))
174
+ )
139
175
  assert.ok(logs.some((m) => /OUT-MARKER-XYZ/.test(m)), 'stdout 应被打印到 console.log')
140
176
  assert.ok(errs.some((m) => /ERR-MARKER-XYZ/.test(m)), 'stderr 应被打印到 console.error')
141
177
  })
@@ -153,13 +189,16 @@ test('runCustomCommand: 跟踪 child 到 activeChildren(SIGINT 兜底)', async (
153
189
  // 且 SIGINT 路径下用户主动 kill 才走 killAllTrackedChildren,
154
190
  // 主动 exit 的 child 由 trackChild 的 once('exit') 自动从集合移除,
155
191
  // 已在 cleanup.test.js#trackChild 单独覆盖)
156
- await settle()
192
+ await settle(1000)
157
193
  })
158
194
 
159
195
  test('runCustomCommand: 非 silent + stdout 都打印,顺序头标在前', async () => {
160
196
  captureConsole()
161
197
  runCustomCommand('node -e "console.log(\'payload\')"')
162
- await settle()
198
+ await waitFor(() =>
199
+ logs.some((m) => /\[自定义命令执行\]/.test(m)) &&
200
+ logs.some((m) => /\[自定义命令输出\]/.test(m))
201
+ )
163
202
  const execIdx = logs.findIndex((m) => /\[自定义命令执行\]/.test(m))
164
203
  const outIdx = logs.findIndex((m) => /\[自定义命令输出\]/.test(m))
165
204
  assert.ok(execIdx >= 0, '应有 [自定义命令执行] 头标')
@@ -1,4 +1,4 @@
1
- import"./rolldown-runtime-BM3Ffeng.js";import{Bt as e,Cn as t,Et as n,G as r,Jn as i,Ln as a,Mn as o,Pt as s,Tn as c,Vn as l,Xn as u,Y as d,Zn as f,_n as p,_r as m,a as h,ar as g,et as _,gr as v,hn as y,ht as b,i as x,ln as S,lt as C,mn as w,mr as T,o as E,on as D,sr as O,tn as k,un as A,vn as j,zn as M}from"./element-plus-C0loJL0J.js";import{i as N,n as P,o as ee}from"./vendor-pbWglt5U.js";import{E as F,T as I,x as L}from"./index-Cr5-U-r6.js";var R=64*1024;function z(e){if(!e||!Array.isArray(e.messages))return[];let t=[],n=e.messages.length;for(let r=0;r<n;r++){let i=e.messages[r];if(i.role!==`system`){if(i.role===`user`){let e=``,n;if(typeof i.content==`string`)e=i.content;else if(Array.isArray(i.content)){e=i.content.filter(e=>e?.type===`text`).map(e=>e.text||``).join(` `);let t=i.content.filter(e=>e?.type===`image_url`&&typeof e.image_url?.url==`string`).map((e,t)=>({id:`att-${r}-${t}`,name:`image`,size:0,type:H(e.image_url?.url||``)||`image/*`,preview:e.image_url?.url}));t.length>0&&(n=t)}(e||n)&&t.push({id:`msg-${r}`,role:`user`,content:e,attachments:n,status:`done`,createdAt:Date.now()})}else if(i.role===`assistant`){let a=``;typeof i.content==`string`&&(a=i.content),a.length>R&&(a=`…(前文已截断)\n${a.slice(-R)}`);let o=[];if(i.tool_calls&&i.tool_calls.length>0)for(let e of i.tool_calls)o.push({id:e.id||e.function?.name||N(),name:e.function?.name||``,arguments:e.function?.arguments||``,argsPreview:B(e.function?.name||``,e.function?.arguments||``),status:`done`,result:``});let s=r+1;for(;s<n&&e.messages[s].role===`tool`;){let t=e.messages[s],n=t.tool_call_id||t.name||``,i=o.find(e=>e.id===n);if(i){let e=t.content;typeof e!=`string`&&(e=`(non-text result)`),e.length>R&&(e=`…(前文已截断)\n${e.slice(-R)}`),i.result=e}r=s,s++}let c=!!a,l=o.length>0;(c||l)&&t.push({id:`msg-${r}`,role:`assistant`,content:a||``,toolCalls:l?o:void 0,status:`done`,createdAt:Date.now()})}}}return t}function B(e,t){try{let n=JSON.parse(t);switch(e){case`run_command`:return String(n.command||``).slice(0,200);case`read_file`:case`write_file`:case`edit_file`:return String(n.path||``);case`list_files`:return String(n.path||`.`);case`search_text`:return String(n.pattern||``);default:return JSON.stringify(n).slice(0,200)}}catch{return t.slice(0,200)}}function V(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result||``)),r.onerror=()=>n(r.error||Error(`FileReader failed`)),r.readAsDataURL(e)})}function H(e){let t=/^data:([^;,]+)/.exec(e);return t?t[1]:``}function U(){let e=O([]),t=O(!1),n=O(null),r=O([]),i=O(!1),a=O(!1),o=null,s=0;async function c(){t.value=!0;try{let t=await fetch(`/api/agent/sessions`).then(e=>e.json());if(!t.success){h.error(t.error||F(`@AGENT:加载会话列表失败`));return}e.value=Array.isArray(t.sessions)?t.sessions:[]}catch(e){h.error(F(`@AGENT:加载会话列表失败`)+`: `+(e?.message||e))}finally{t.value=!1}}async function l(e){a.value=!0,n.value=e;try{let t=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`).then(e=>e.json());if(!t.success){h.error(t.error||F(`@AGENT:加载会话失败`));return}r.value=z(t.session)}catch(e){h.error(F(`@AGENT:加载会话失败`)+`: `+(e?.message||e))}finally{a.value=!1}}async function u(t){try{await x.confirm(F(`@AGENT:确认删除该会话`),F(`@AGENT:删除后无法恢复`),{type:`warning`})}catch{return}try{let i=await fetch(`/api/agent/sessions/${encodeURIComponent(t)}`,{method:`DELETE`}).then(e=>e.json());if(!i.success){h.error(i.error||F(`@AGENT:删除失败`));return}e.value=e.value.filter(e=>e.sessionId!==t),n.value===t&&(n.value=null,r.value=[]),h.success(F(`@AGENT:已删除`))}catch(e){h.error(F(`@AGENT:删除失败`)+`: `+(e?.message||e))}}async function d(t,n){try{let r=await fetch(`/api/agent/sessions/${encodeURIComponent(t)}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:n})}).then(e=>e.json());if(!r.success){h.error(r.error||F(`@AGENT:重命名失败`));return}let i=e.value.find(e=>e.sessionId===t);i&&(i.title=n),h.success(F(`@AGENT:已重命名`))}catch(e){h.error(F(`@AGENT:重命名失败`)+`: `+(e?.message||e))}}function f(){n.value=null,r.value=[]}async function p(e,t=[]){let a=t.filter(e=>e?.file?.type?.startsWith(`image/`));if(a.length<t.length&&h.warning(F(`@AGENT:仅支持发送图片,非图片文件已忽略`)),!e.trim()&&a.length===0||i.value)return;let l=(await Promise.allSettled(a.map(e=>V(e.file)))).map(e=>e.status===`fulfilled`?e.value:``).filter(e=>e.startsWith(`data:image/`)),u=++s;o=new AbortController;let d=o,f={id:N(),role:`user`,content:e,status:`done`,createdAt:Date.now()};a.length>0&&(f.attachments=a.map(e=>({id:e.id,name:e.file.name||`image`,size:e.file.size||0,type:e.file.type||``,preview:e.preview}))),r.value.push(f);let p=g({id:N(),role:`assistant`,content:``,status:`pending`,createdAt:Date.now()});r.value.push(p),i.value=!0;let m=[];try{let t=await fetch(`/api/agent/chat`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify({sessionId:n.value||``,userMessage:e,...l.length>0?{images:l}:{}}),signal:d.signal});if(u!==s)return;if(!t.ok||!t.body){let e=await t.text().catch(()=>``);throw Error(e||`HTTP ${t.status}`)}let i=t.body.getReader(),a=new TextDecoder(`utf-8`),o=``,f=n.value;for(;;){let{value:e,done:t}=await i.read();if(u!==s)return;if(t)break;o+=a.decode(e,{stream:!0});let c=o.split(`
1
+ import"./rolldown-runtime-BM3Ffeng.js";import{Bt as e,Cn as t,Et as n,G as r,Jn as i,Ln as a,Mn as o,Pt as s,Tn as c,Vn as l,Xn as u,Y as d,Zn as f,_n as p,_r as m,a as h,ar as g,et as _,gr as v,hn as y,ht as b,i as x,ln as S,lt as C,mn as w,mr as T,o as E,on as D,sr as O,tn as k,un as A,vn as j,zn as M}from"./element-plus-C0loJL0J.js";import{i as N,n as P,o as ee}from"./vendor-pbWglt5U.js";import{E as F,T as I,x as L}from"./index-BEPT2LNX.js";var R=64*1024;function z(e){if(!e||!Array.isArray(e.messages))return[];let t=[],n=e.messages.length;for(let r=0;r<n;r++){let i=e.messages[r];if(i.role!==`system`){if(i.role===`user`){let e=``,n;if(typeof i.content==`string`)e=i.content;else if(Array.isArray(i.content)){e=i.content.filter(e=>e?.type===`text`).map(e=>e.text||``).join(` `);let t=i.content.filter(e=>e?.type===`image_url`&&typeof e.image_url?.url==`string`).map((e,t)=>({id:`att-${r}-${t}`,name:`image`,size:0,type:H(e.image_url?.url||``)||`image/*`,preview:e.image_url?.url}));t.length>0&&(n=t)}(e||n)&&t.push({id:`msg-${r}`,role:`user`,content:e,attachments:n,status:`done`,createdAt:Date.now()})}else if(i.role===`assistant`){let a=``;typeof i.content==`string`&&(a=i.content),a.length>R&&(a=`…(前文已截断)\n${a.slice(-R)}`);let o=[];if(i.tool_calls&&i.tool_calls.length>0)for(let e of i.tool_calls)o.push({id:e.id||e.function?.name||N(),name:e.function?.name||``,arguments:e.function?.arguments||``,argsPreview:B(e.function?.name||``,e.function?.arguments||``),status:`done`,result:``});let s=r+1;for(;s<n&&e.messages[s].role===`tool`;){let t=e.messages[s],n=t.tool_call_id||t.name||``,i=o.find(e=>e.id===n);if(i){let e=t.content;typeof e!=`string`&&(e=`(non-text result)`),e.length>R&&(e=`…(前文已截断)\n${e.slice(-R)}`),i.result=e}r=s,s++}let c=!!a,l=o.length>0;(c||l)&&t.push({id:`msg-${r}`,role:`assistant`,content:a||``,toolCalls:l?o:void 0,status:`done`,createdAt:Date.now()})}}}return t}function B(e,t){try{let n=JSON.parse(t);switch(e){case`run_command`:return String(n.command||``).slice(0,200);case`read_file`:case`write_file`:case`edit_file`:return String(n.path||``);case`list_files`:return String(n.path||`.`);case`search_text`:return String(n.pattern||``);default:return JSON.stringify(n).slice(0,200)}}catch{return t.slice(0,200)}}function V(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result||``)),r.onerror=()=>n(r.error||Error(`FileReader failed`)),r.readAsDataURL(e)})}function H(e){let t=/^data:([^;,]+)/.exec(e);return t?t[1]:``}function U(){let e=O([]),t=O(!1),n=O(null),r=O([]),i=O(!1),a=O(!1),o=null,s=0;async function c(){t.value=!0;try{let t=await fetch(`/api/agent/sessions`).then(e=>e.json());if(!t.success){h.error(t.error||F(`@AGENT:加载会话列表失败`));return}e.value=Array.isArray(t.sessions)?t.sessions:[]}catch(e){h.error(F(`@AGENT:加载会话列表失败`)+`: `+(e?.message||e))}finally{t.value=!1}}async function l(e){a.value=!0,n.value=e;try{let t=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`).then(e=>e.json());if(!t.success){h.error(t.error||F(`@AGENT:加载会话失败`));return}r.value=z(t.session)}catch(e){h.error(F(`@AGENT:加载会话失败`)+`: `+(e?.message||e))}finally{a.value=!1}}async function u(t){try{await x.confirm(F(`@AGENT:确认删除该会话`),F(`@AGENT:删除后无法恢复`),{type:`warning`})}catch{return}try{let i=await fetch(`/api/agent/sessions/${encodeURIComponent(t)}`,{method:`DELETE`}).then(e=>e.json());if(!i.success){h.error(i.error||F(`@AGENT:删除失败`));return}e.value=e.value.filter(e=>e.sessionId!==t),n.value===t&&(n.value=null,r.value=[]),h.success(F(`@AGENT:已删除`))}catch(e){h.error(F(`@AGENT:删除失败`)+`: `+(e?.message||e))}}async function d(t,n){try{let r=await fetch(`/api/agent/sessions/${encodeURIComponent(t)}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:n})}).then(e=>e.json());if(!r.success){h.error(r.error||F(`@AGENT:重命名失败`));return}let i=e.value.find(e=>e.sessionId===t);i&&(i.title=n),h.success(F(`@AGENT:已重命名`))}catch(e){h.error(F(`@AGENT:重命名失败`)+`: `+(e?.message||e))}}function f(){n.value=null,r.value=[]}async function p(e,t=[]){let a=t.filter(e=>e?.file?.type?.startsWith(`image/`));if(a.length<t.length&&h.warning(F(`@AGENT:仅支持发送图片,非图片文件已忽略`)),!e.trim()&&a.length===0||i.value)return;let l=(await Promise.allSettled(a.map(e=>V(e.file)))).map(e=>e.status===`fulfilled`?e.value:``).filter(e=>e.startsWith(`data:image/`)),u=++s;o=new AbortController;let d=o,f={id:N(),role:`user`,content:e,status:`done`,createdAt:Date.now()};a.length>0&&(f.attachments=a.map(e=>({id:e.id,name:e.file.name||`image`,size:e.file.size||0,type:e.file.type||``,preview:e.preview}))),r.value.push(f);let p=g({id:N(),role:`assistant`,content:``,status:`pending`,createdAt:Date.now()});r.value.push(p),i.value=!0;let m=[];try{let t=await fetch(`/api/agent/chat`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify({sessionId:n.value||``,userMessage:e,...l.length>0?{images:l}:{}}),signal:d.signal});if(u!==s)return;if(!t.ok||!t.body){let e=await t.text().catch(()=>``);throw Error(e||`HTTP ${t.status}`)}let i=t.body.getReader(),a=new TextDecoder(`utf-8`),o=``,f=n.value;for(;;){let{value:e,done:t}=await i.read();if(u!==s)return;if(t)break;o+=a.decode(e,{stream:!0});let c=o.split(`
2
2
  `);o=c.pop()??``;for(let e of c){let t=e.trim();if(!t.startsWith(`data:`))continue;let r=t.slice(5).trim();if(!r)continue;let i;try{i=JSON.parse(r)}catch{continue}switch(i.type){case`meta`:i.sessionId&&(f=i.sessionId,n.value=i.sessionId);break;case`thinking`:p.reasoning||(p.reasoning=``,p.reasoningStatus=`streaming`),p.reasoning+=String(i.delta||``),p.status=`streaming`;break;case`content`:p.status===`pending`&&(p.status=`streaming`);{let e=String(i.delta||``);p.content+=e;let t=P(p.content);t.reasoning&&(p.reasoning||(p.reasoning=``,p.reasoningStatus=`streaming`),p.reasoning=t.reasoning,p.content=t.content)}break;case`tool_call_start`:{let e=g({id:i.toolCallId||N(),name:i.name||``,argsPreview:i.argsPreview||``,arguments:i.argsPreview||``,status:`running`,result:``});m.push(e),p.toolCalls||=[],p.toolCalls.push(e),p.status===`pending`&&(p.status=`streaming`);break}case`tool_result`:{let e=m.find(e=>e.id===i.toolCallId);e&&(e.result=String(i.result||``),e.status=`done`);break}case`done`:{let e=P(i.content||p.content);e.reasoning&&!p.reasoning&&(p.reasoning=e.reasoning),p.content=e.content,p.status=`done`,p.reasoningStatus===`streaming`&&(p.reasoningStatus=`done`);break}case`error`:p.status=`error`,p.error=String(i.error||F(`@AGENT:未知错误`)),p.reasoningStatus===`streaming`&&(p.reasoningStatus=`done`);break}}r.value=[...r.value]}if(u!==s)return;p.status===`pending`&&(p.status=`done`),f&&f!==n.value&&(n.value=f),c().catch(()=>{})}catch(e){if(u!==s)return;e?.name===`AbortError`||d.signal.aborted?(p.content=(p.content||``)+`
3
3
 
4
4
  [`+F(`@AGENT:已停止`)+`]`,p.status=`done`,p.reasoningStatus===`streaming`&&(p.reasoningStatus=`done`)):(p.status=`error`,p.error=e?.message||String(e),h.error(p.error||F(`@AGENT:对话失败`)))}finally{u===s&&(i.value=!1,o=null)}}function m(){o&&=(o.abort(),null)}return{sessions:e,sessionsLoading:t,currentSessionId:n,messages:r,isStreaming:i,sessionLoading:a,loadSessions:c,loadSession:l,deleteSession:u,renameSession:d,newSession:f,sendMessage:p,stop:m}}var W=c({__name:`AgentView`,setup(t,{expose:c}){c();let l=L(),{sessions:u,sessionsLoading:f,currentSessionId:p,messages:m,isStreaming:g,sessionLoading:v,loadSessions:y,loadSession:S,deleteSession:T,renameSession:E,newSession:D,sendMessage:k,stop:A}=U(),j=w(()=>{let e=l.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),M=O(``),N=w(()=>{if(!M.value.trim())return u.value;let e=M.value.toLowerCase();return u.value.filter(t=>(t.title||``).toLowerCase().includes(e)||(t.model||``).toLowerCase().includes(e))}),P=w(()=>[{id:`p1`,label:F(`@AGENT:查看项目结构`),prompt:F(`@AGENT:prompt_p1`)},{id:`p2`,label:F(`@AGENT:分析代码质量`),prompt:F(`@AGENT:prompt_p2`)},{id:`p3`,label:F(`@AGENT:帮我写测试`),prompt:F(`@AGENT:prompt_p3`)},{id:`p4`,label:F(`@AGENT:Git 状态检查`),prompt:F(`@AGENT:prompt_p4`)}]);async function I(e){await k(e.text,e.files),await o(),B()}async function R(e){await k(e.prompt),await o(),B()}let z=O(null);function B(e=!0){z.value?.scrollToBottom(e)}i(()=>m.value.length,()=>{o(()=>B(!1))});function V(e){if(g.value){h.warning(F(`@AGENT:请先停止当前生成`));return}S(e)}function H(){if(g.value){h.warning(F(`@AGENT:请先停止当前生成`));return}D()}function W(e,t){if(t.stopPropagation(),g.value&&p.value===e){h.warning(F(`@AGENT:请先停止当前生成`));return}T(e)}async function G(e,t,n){n.stopPropagation();try{let{value:n}=await x.prompt(F(`@AGENT:请输入新的会话标题`),F(`@AGENT:重命名会话`),{inputValue:t,inputPattern:/.+/,inputErrorMessage:F(`@AGENT:标题不能为空`)});n&&n!==t&&await E(e,n)}catch{}}function K(e){if(!e)return``;try{let t=new Date(e);if(Number.isNaN(t.getTime()))return e;let n=new Date,r=n.getTime()-t.getTime(),i=e=>String(e).padStart(2,`0`);if(t.toDateString()===n.toDateString())return`${i(t.getHours())}:${i(t.getMinutes())}`;if(r<10080*60*1e3){let e=Math.floor(r/(1440*60*1e3));return e===0?F(`@AGENT:今天`):`${e}${F(`@AGENT:天前`)}`}return`${t.getFullYear()}-${i(t.getMonth()+1)}-${i(t.getDate())}`}catch{return e}}let q=O(280),J=O(!1);function Y(e){J.value=!0;let t=e.clientX,n=q.value,r=e=>{let r=e.clientX-t;q.value=Math.max(200,Math.min(500,n+r))},i=()=>{J.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}a(()=>{y()});let X={configStore:l,sessions:u,sessionsLoading:f,currentSessionId:p,messages:m,isStreaming:g,sessionLoading:v,loadSessions:y,loadSession:S,deleteSession:T,renameSession:E,newSession:D,sendMessage:k,stop:A,chatTheme:j,searchQuery:M,filteredSessions:N,presetQuestions:P,onSend:I,onSelectPreset:R,chatContainerRef:z,scrollToBottom:B,selectSession:V,handleNewSession:H,handleDelete:W,handleRename:G,formatDate:K,sidebarWidth:q,isResizing:J,startResize:Y,get $t(){return F},get ElTooltip(){return r},get ElIcon(){return d},get Plus(){return s},get Search(){return e},get Delete(){return C},get Edit(){return b},get ChatLineRound(){return _},get Loading(){return n},get ChatContainer(){return ee}};return Object.defineProperty(X,`__isScriptSetup`,{enumerable:!1,value:!0}),X}}),G={class:`agent-view`},K={class:`sidebar-header`},q={class:`sidebar-search`},J=[`placeholder`],Y={class:`session-list`},X={key:0,class:`empty-state`},Z={class:`empty-text`},Q={key:0,class:`empty-hint`},te=[`onClick`],ne={class:`session-item-main`},$={class:`session-item-title`},re={class:`session-item-meta`},ie={class:`meta-time`},ae={class:`meta-count`},oe={key:0,class:`meta-source cli`},se=[`onClick`],ce=[`onClick`],le={class:`agent-chat-area`},ue={key:0,class:`chat-loading`},de={key:0,class:`stop-button-bar`};function fe(e,n,r,i,a,o){let s=E;return M(),j(`div`,G,[p(` ═══ 左侧:会话列表 ═══ `),y(`aside`,{class:`agent-sidebar`,style:v({width:i.sidebarWidth+`px`})},[p(` 顶部操作栏 `),y(`div`,K,[y(`button`,{class:`new-session-btn`,onClick:i.handleNewSession},[t(i.ElIcon,null,{default:u(()=>[t(i.Plus)]),_:1}),y(`span`,null,m(i.$t(`@AGENT:新建会话`)),1)])]),p(` 搜索框 `),y(`div`,q,[t(i.ElIcon,{class:`search-icon`},{default:u(()=>[t(i.Search)]),_:1}),f(y(`input`,{"onUpdate:modelValue":n[0]||=e=>i.searchQuery=e,placeholder:i.$t(`@AGENT:搜索会话...`),class:`search-input`,type:`text`},null,8,J),[[D,i.searchQuery]])]),p(` 会话列表 `),f((M(),j(`div`,Y,[i.filteredSessions.length===0&&!i.sessionsLoading?(M(),j(`div`,X,[t(i.ElIcon,{size:28,color:`var(--text-tertiary)`},{default:u(()=>[t(i.ChatLineRound)]),_:1}),y(`div`,Z,m(i.searchQuery?i.$t(`@AGENT:未找到匹配的会话`):i.$t(`@AGENT:暂无会话`)),1),i.searchQuery?p(`v-if`,!0):(M(),j(`div`,Q,m(i.$t(`@AGENT:点击上方按钮开始对话`)),1))])):p(`v-if`,!0),(M(!0),j(A,null,l(i.filteredSessions,e=>(M(),j(`div`,{key:e.sessionId,class:T([`session-item`,{active:i.currentSessionId===e.sessionId}]),onClick:t=>i.selectSession(e.sessionId)},[y(`div`,ne,[y(`div`,$,m(e.title||i.$t(`@AGENT:无标题`)),1),y(`div`,re,[y(`span`,ie,m(i.formatDate(e.updatedAt)),1),n[3]||=y(`span`,{class:`meta-dot`},`·`,-1),y(`span`,ae,m(e.messageCount)+` `+m(i.$t(`@AGENT:条`)),1),e.source===`cli`?(M(),j(`span`,oe,`CLI`)):p(`v-if`,!0)])]),y(`div`,{class:`session-item-actions`,onClick:n[1]||=S(()=>{},[`stop`])},[t(i.ElTooltip,{content:i.$t(`@AGENT:重命名`),placement:`top`,"show-after":500},{default:u(()=>[y(`button`,{class:`item-action-btn`,onClick:t=>i.handleRename(e.sessionId,e.title,t)},[t(i.ElIcon,null,{default:u(()=>[t(i.Edit)]),_:1})],8,se)]),_:2},1032,[`content`]),t(i.ElTooltip,{content:i.$t(`@AGENT:删除`),placement:`top`,"show-after":500},{default:u(()=>[y(`button`,{class:`item-action-btn danger`,onClick:t=>i.handleDelete(e.sessionId,t)},[t(i.ElIcon,null,{default:u(()=>[t(i.Delete)]),_:1})],8,ce)]),_:2},1032,[`content`])])],10,te))),128))])),[[s,i.sessionsLoading]])],4),p(` 拖拽分隔条 `),y(`div`,{class:T([`sidebar-resizer`,{active:i.isResizing}]),onMousedown:i.startResize},null,34),p(` ═══ 右侧:对话区域 ═══ `),y(`main`,le,[p(` 加载中 `),i.sessionLoading?(M(),j(`div`,ue,[t(i.ElIcon,{class:`is-loading`,size:32},{default:u(()=>[t(i.Loading)]),_:1}),y(`span`,null,m(i.$t(`@AGENT:加载会话中...`)),1)])):(M(),j(A,{key:1},[p(` ChatContainer `),t(i.ChatContainer,{ref:`chatContainerRef`,messages:i.messages,"preset-questions":i.presetQuestions,"welcome-title":i.$t(`@AGENT:智能体助手`),"welcome-description":i.$t(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":`g ai`,theme:i.chatTheme,disabled:i.isStreaming,"upload-config":{accept:`image/*`},placeholder:i.isStreaming?i.$t(`@AGENT:正在生成中...`):i.$t(`@AGENT:输入消息,Enter 发送`),onSend:i.onSend,onSelect:i.onSelectPreset},null,8,[`messages`,`preset-questions`,`welcome-title`,`welcome-description`,`theme`,`disabled`,`placeholder`])],2112)),p(` 停止按钮浮层 `),t(k,{name:`fade`},{default:u(()=>[i.isStreaming?(M(),j(`div`,de,[y(`button`,{class:`stop-button`,onClick:n[2]||=(...e)=>i.stop&&i.stop(...e)},[t(i.ElIcon,null,{default:u(()=>[t(i.Loading,{class:`is-loading`})]),_:1}),y(`span`,null,m(i.$t(`@AGENT:停止生成`)),1)])])):p(`v-if`,!0)]),_:1})])])}var pe=I(W,[[`render`,fe],[`__scopeId`,`data-v-bd681ddd`],[`__file`,`C:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/AgentView.vue`]]);export{pe as default};
@@ -1,2 +1,2 @@
1
- import"./rolldown-runtime-BM3Ffeng.js";import{B as e,Cn as t,D as n,Et as r,Fn as i,G as a,Jn as o,Ln as s,Mn as c,Sn as l,Tn as u,Xn as d,Y as f,_n as p,_r as m,a as h,gn as g,hn as _,i as v,mn as y,mr as b,nt as x,rt as S,sr as C,vn as w,zn as T}from"./element-plus-C0loJL0J.js";import{E,T as D}from"./index-Cr5-U-r6.js";async function O(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 k(){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 A(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 O(t,t=>{try{e(JSON.parse(t))}catch{}})}async function j(){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())};O(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(()=>{})})}var M=u({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean,required:!0},logs:{type:String,required:!0},status:{type:String,required:!0},countdown:{type:Number,required:!1,default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(e,{expose:t,emit:n}){t();let i=e,a=n,s=C(null);o(()=>i.logs,async()=>{await c(),s.value&&(s.value.scrollTop=s.value.scrollHeight)});function l(){i.status!==`running`&&(i.status===`success`&&i.countdown>0&&a(`cancel`),a(`update:modelValue`,!1))}function u(){a(`retry`)}function d(){a(`restart`)}function f(){a(`cancel`),a(`update:modelValue`,!1)}let p={props:i,emit:a,logEl:s,close:l,onRetry:u,onRestart:d,onLater:f,get Loading(){return r},get CircleCheck(){return x},get CircleClose(){return S},get $t(){return E}};return Object.defineProperty(p,`__isScriptSetup`,{enumerable:!1,value:!0}),p}}),N={key:3},P={key:4},F={key:5},I={key:0,class:`upgrade-hint`},L={key:0,class:`upgrade-countdown`};function R(r,i,a,o,s,c){let u=f,h=e,v=n;return T(),g(v,{"model-value":a.modelValue,"onUpdate:modelValue":i[0]||=e=>o.emit(`update:modelValue`,e),title:o.$t(`@F13B4:升级`),width:`680px`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":a.status!==`running`,"append-to-body":``,onClose:o.close},{footer:d(()=>[a.status===`failed`?(T(),g(h,{key:0,type:`primary`,onClick:o.onRetry},{default:d(()=>[l(m(o.$t(`@F13B4:重试`)),1)]),_:1})):p(`v-if`,!0),a.status===`success`?(T(),g(h,{key:1,type:`primary`,onClick:o.onRestart},{default:d(()=>[l(m(o.$t(`@F13B4:立即重启并刷新`)),1)]),_:1})):p(`v-if`,!0),a.status===`success`?(T(),g(h,{key:2,onClick:o.onLater},{default:d(()=>[l(m(o.$t(`@F13B4:稍后手动重启`)),1)]),_:1})):p(`v-if`,!0),a.status===`running`?(T(),g(h,{key:3,disabled:``},{default:d(()=>[l(m(o.$t(`@F13B4:升级中`))+`... `,1)]),_:1})):p(`v-if`,!0)]),default:d(()=>[_(`div`,{class:b([`upgrade-status`,`is-${a.status}`])},[a.status===`running`?(T(),g(u,{key:0,class:`is-loading`},{default:d(()=>[t(o.Loading)]),_:1})):a.status===`success`?(T(),g(u,{key:1,color:`#67c23a`},{default:d(()=>[t(o.CircleCheck)]),_:1})):(T(),g(u,{key:2,color:`#f56c6c`},{default:d(()=>[t(o.CircleClose)]),_:1})),a.status===`running`?(T(),w(`span`,N,m(o.$t(`@F13B4:升级中`)),1)):a.status===`success`?(T(),w(`span`,P,m(o.$t(`@F13B4:升级完成`)),1)):(T(),w(`span`,F,m(o.$t(`@F13B4:升级失败`)),1))],2),a.status===`success`?(T(),w(`p`,I,[l(m(o.$t(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),a.countdown>0?(T(),w(`span`,L,m(o.$t(`@F13B4:{seconds} 秒后自动刷新`,{seconds:a.countdown})),1)):p(`v-if`,!0)])):p(`v-if`,!0),_(`pre`,{ref:`logEl`,class:`upgrade-log`},m(a.logs||o.$t(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}var z=D(M,[[`render`,R],[`__scopeId`,`data-v-bc566bba`],[`__file`,`C:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/UpgradeDialog.vue`]]),B=`https://github.com/xz333221/zen-gitsync/releases`,V=5,H=`app-version-check`,U=3600*1e3,W=u({__name:`AppVersionBadge`,setup(e,{expose:t}){t();let n=`2.16.11`,r=C(n),a=y(()=>r.value||n),o=C(null),c=C(!1),l=C(``),u=C(`running`),d=C(0),f=null,p=C(!1);function m(){try{let e=sessionStorage.getItem(H);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>U?null:n}catch{return null}}function g(e){try{sessionStorage.setItem(H,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function _(e=!1){let t=m();t&&(o.value=t);try{let t=await k();o.value=t,g(t),t.current&&(r.value=t.current),!e&&t.success&&t.hasUpdate&&h({type:`success`,message:E(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||h({type:`warning`,message:E(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function b(){if(o.value?.hasUpdate){try{await v.confirm(E(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:o.value.current,latest:o.value.latest}),E(`@F13B4:升级`),{confirmButtonText:E(`@F13B4:确定升级`),cancelButtonText:E(`@F13B4:取消`),type:`info`})}catch{return}l.value=``,u.value=`running`,c.value=!0,await A(e=>{if(e.type===`done`){if(u.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(H)}catch{}o.value?.latest&&(r.value=o.value.latest),x()}}else e.message&&(l.value+=e.message)})}}function x(){S(),d.value=V,f=setInterval(()=>{--d.value,d.value<=0&&(f&&=(clearInterval(f),null),T())},1e3)}function S(){f&&=(clearInterval(f),null),d.value=0}function w(){S()}async function T(){if(S(),!p.value){p.value=!0;try{let e=await j(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];h({type:`warning`,message:n?E(n):E(`@F13B4:重启失败 {error}`,{error:t})}),p.value=!1}}}i(()=>{S()}),s(()=>{_(!0)});let D={buildVersion:n,releasesUrl:B,runtimeVersion:r,displayVersion:a,latestInfo:o,upgradeDialogVisible:c,upgradeLogs:l,upgradeStatus:u,AUTO_REFRESH_SECONDS:V,countdown:d,get countdownTimer(){return f},set countdownTimer(e){f=e},restartInFlight:p,CACHE_KEY:H,CACHE_TTL_MS:U,readCache:m,writeCache:g,checkUpdate:_,handleUpgrade:b,startAutoRefreshCountdown:x,cancelAutoRefreshCountdown:S,handleCancelAutoRefresh:w,handleRestart:T,get $t(){return E},UpgradeDialog:z};return Object.defineProperty(D,`__isScriptSetup`,{enumerable:!1,value:!0}),D}}),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`};function Z(e,n,r,i,o,s){let c=a;return T(),w(`div`,G,[p(` GitHub 链接 `),t(c,{content:i.$t(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:d(()=>[_(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i.$t(`@F13B4:在 GitHub 上查看源码`)},[...n[1]||=[_(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[_(`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`]),p(` NPM 链接 `),t(c,{content:i.$t(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:d(()=>[_(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i.$t(`@F13B4:在 npm 上查看包`)},[...n[2]||=[_(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[_(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,q)]),_:1},8,[`content`]),p(` 版本号 `),t(c,{content:i.$t(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:d(()=>[_(`a`,{href:i.releasesUrl,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+m(i.displayVersion),1)]),_:1},8,[`content`]),i.latestInfo?.hasUpdate?(T(),w(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),"aria-label":i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),onClick:i.handleUpgrade},[n[3]||=_(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),_(`span`,Y,m(i.$t(`@F13B4:升级`)),1),_(`span`,X,`v`+m(i.latestInfo.latest),1)],8,J)):p(`v-if`,!0),t(i.UpgradeDialog,{modelValue:i.upgradeDialogVisible,"onUpdate:modelValue":n[0]||=e=>i.upgradeDialogVisible=e,logs:i.upgradeLogs,status:i.upgradeStatus,countdown:i.countdown,onRetry:i.handleUpgrade,onRestart:i.handleRestart,onCancel:i.handleCancelAutoRefresh},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}var Q=D(W,[[`render`,Z],[`__scopeId`,`data-v-7e0300ec`],[`__file`,`C:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AppVersionBadge.vue`]]);export{Q as default};
1
+ import"./rolldown-runtime-BM3Ffeng.js";import{B as e,Cn as t,D as n,Et as r,Fn as i,G as a,Jn as o,Ln as s,Mn as c,Sn as l,Tn as u,Xn as d,Y as f,_n as p,_r as m,a as h,gn as g,hn as _,i as v,mn as y,mr as b,nt as x,rt as S,sr as C,vn as w,zn as T}from"./element-plus-C0loJL0J.js";import{E,T as D}from"./index-BEPT2LNX.js";async function O(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 k(){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 A(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 O(t,t=>{try{e(JSON.parse(t))}catch{}})}async function j(){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())};O(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(()=>{})})}var M=u({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean,required:!0},logs:{type:String,required:!0},status:{type:String,required:!0},countdown:{type:Number,required:!1,default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(e,{expose:t,emit:n}){t();let i=e,a=n,s=C(null);o(()=>i.logs,async()=>{await c(),s.value&&(s.value.scrollTop=s.value.scrollHeight)});function l(){i.status!==`running`&&(i.status===`success`&&i.countdown>0&&a(`cancel`),a(`update:modelValue`,!1))}function u(){a(`retry`)}function d(){a(`restart`)}function f(){a(`cancel`),a(`update:modelValue`,!1)}let p={props:i,emit:a,logEl:s,close:l,onRetry:u,onRestart:d,onLater:f,get Loading(){return r},get CircleCheck(){return x},get CircleClose(){return S},get $t(){return E}};return Object.defineProperty(p,`__isScriptSetup`,{enumerable:!1,value:!0}),p}}),N={key:3},P={key:4},F={key:5},I={key:0,class:`upgrade-hint`},L={key:0,class:`upgrade-countdown`};function R(r,i,a,o,s,c){let u=f,h=e,v=n;return T(),g(v,{"model-value":a.modelValue,"onUpdate:modelValue":i[0]||=e=>o.emit(`update:modelValue`,e),title:o.$t(`@F13B4:升级`),width:`680px`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":a.status!==`running`,"append-to-body":``,onClose:o.close},{footer:d(()=>[a.status===`failed`?(T(),g(h,{key:0,type:`primary`,onClick:o.onRetry},{default:d(()=>[l(m(o.$t(`@F13B4:重试`)),1)]),_:1})):p(`v-if`,!0),a.status===`success`?(T(),g(h,{key:1,type:`primary`,onClick:o.onRestart},{default:d(()=>[l(m(o.$t(`@F13B4:立即重启并刷新`)),1)]),_:1})):p(`v-if`,!0),a.status===`success`?(T(),g(h,{key:2,onClick:o.onLater},{default:d(()=>[l(m(o.$t(`@F13B4:稍后手动重启`)),1)]),_:1})):p(`v-if`,!0),a.status===`running`?(T(),g(h,{key:3,disabled:``},{default:d(()=>[l(m(o.$t(`@F13B4:升级中`))+`... `,1)]),_:1})):p(`v-if`,!0)]),default:d(()=>[_(`div`,{class:b([`upgrade-status`,`is-${a.status}`])},[a.status===`running`?(T(),g(u,{key:0,class:`is-loading`},{default:d(()=>[t(o.Loading)]),_:1})):a.status===`success`?(T(),g(u,{key:1,color:`#67c23a`},{default:d(()=>[t(o.CircleCheck)]),_:1})):(T(),g(u,{key:2,color:`#f56c6c`},{default:d(()=>[t(o.CircleClose)]),_:1})),a.status===`running`?(T(),w(`span`,N,m(o.$t(`@F13B4:升级中`)),1)):a.status===`success`?(T(),w(`span`,P,m(o.$t(`@F13B4:升级完成`)),1)):(T(),w(`span`,F,m(o.$t(`@F13B4:升级失败`)),1))],2),a.status===`success`?(T(),w(`p`,I,[l(m(o.$t(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),a.countdown>0?(T(),w(`span`,L,m(o.$t(`@F13B4:{seconds} 秒后自动刷新`,{seconds:a.countdown})),1)):p(`v-if`,!0)])):p(`v-if`,!0),_(`pre`,{ref:`logEl`,class:`upgrade-log`},m(a.logs||o.$t(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}var z=D(M,[[`render`,R],[`__scopeId`,`data-v-bc566bba`],[`__file`,`C:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/UpgradeDialog.vue`]]),B=`https://github.com/xz333221/zen-gitsync/releases`,V=5,H=`app-version-check`,U=3600*1e3,W=u({__name:`AppVersionBadge`,setup(e,{expose:t}){t();let n=`2.16.12`,r=C(n),a=y(()=>r.value||n),o=C(null),c=C(!1),l=C(``),u=C(`running`),d=C(0),f=null,p=C(!1);function m(){try{let e=sessionStorage.getItem(H);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>U?null:n}catch{return null}}function g(e){try{sessionStorage.setItem(H,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function _(e=!1){let t=m();t&&(o.value=t);try{let t=await k();o.value=t,g(t),t.current&&(r.value=t.current),!e&&t.success&&t.hasUpdate&&h({type:`success`,message:E(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||h({type:`warning`,message:E(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function b(){if(o.value?.hasUpdate){try{await v.confirm(E(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:o.value.current,latest:o.value.latest}),E(`@F13B4:升级`),{confirmButtonText:E(`@F13B4:确定升级`),cancelButtonText:E(`@F13B4:取消`),type:`info`})}catch{return}l.value=``,u.value=`running`,c.value=!0,await A(e=>{if(e.type===`done`){if(u.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(H)}catch{}o.value?.latest&&(r.value=o.value.latest),x()}}else e.message&&(l.value+=e.message)})}}function x(){S(),d.value=V,f=setInterval(()=>{--d.value,d.value<=0&&(f&&=(clearInterval(f),null),T())},1e3)}function S(){f&&=(clearInterval(f),null),d.value=0}function w(){S()}async function T(){if(S(),!p.value){p.value=!0;try{let e=await j(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];h({type:`warning`,message:n?E(n):E(`@F13B4:重启失败 {error}`,{error:t})}),p.value=!1}}}i(()=>{S()}),s(()=>{_(!0)});let D={buildVersion:n,releasesUrl:B,runtimeVersion:r,displayVersion:a,latestInfo:o,upgradeDialogVisible:c,upgradeLogs:l,upgradeStatus:u,AUTO_REFRESH_SECONDS:V,countdown:d,get countdownTimer(){return f},set countdownTimer(e){f=e},restartInFlight:p,CACHE_KEY:H,CACHE_TTL_MS:U,readCache:m,writeCache:g,checkUpdate:_,handleUpgrade:b,startAutoRefreshCountdown:x,cancelAutoRefreshCountdown:S,handleCancelAutoRefresh:w,handleRestart:T,get $t(){return E},UpgradeDialog:z};return Object.defineProperty(D,`__isScriptSetup`,{enumerable:!1,value:!0}),D}}),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`};function Z(e,n,r,i,o,s){let c=a;return T(),w(`div`,G,[p(` GitHub 链接 `),t(c,{content:i.$t(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:d(()=>[_(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i.$t(`@F13B4:在 GitHub 上查看源码`)},[...n[1]||=[_(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[_(`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`]),p(` NPM 链接 `),t(c,{content:i.$t(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:d(()=>[_(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i.$t(`@F13B4:在 npm 上查看包`)},[...n[2]||=[_(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[_(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,q)]),_:1},8,[`content`]),p(` 版本号 `),t(c,{content:i.$t(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:d(()=>[_(`a`,{href:i.releasesUrl,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+m(i.displayVersion),1)]),_:1},8,[`content`]),i.latestInfo?.hasUpdate?(T(),w(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),"aria-label":i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),onClick:i.handleUpgrade},[n[3]||=_(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),_(`span`,Y,m(i.$t(`@F13B4:升级`)),1),_(`span`,X,`v`+m(i.latestInfo.latest),1)],8,J)):p(`v-if`,!0),t(i.UpgradeDialog,{modelValue:i.upgradeDialogVisible,"onUpdate:modelValue":n[0]||=e=>i.upgradeDialogVisible=e,logs:i.upgradeLogs,status:i.upgradeStatus,countdown:i.countdown,onRetry:i.handleUpgrade,onRestart:i.handleRestart,onCancel:i.handleCancelAutoRefresh},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}var Q=D(W,[[`render`,Z],[`__scopeId`,`data-v-7e0300ec`],[`__file`,`C:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AppVersionBadge.vue`]]);export{Q as default};
@@ -1 +1 @@
1
- import"./rolldown-runtime-BM3Ffeng.js";import{Cn as e,K as t,L as n,Lt as r,Pt as i,R as a,Tn as o,Vn as s,W as c,Xn as l,Y as u,_n as d,_r as f,cn as p,gn as m,hn as h,kt as g,mn as _,mr as v,q as y,r as b,sr as x,tt as S,un as C,vn as w,zn as T}from"./element-plus-C0loJL0J.js";import{C as E,E as D,T as O,b as k,d as A,w as j}from"./index-Cr5-U-r6.js";var M=o({__name:`BranchSelector`,emits:[`branchChanged`],setup(e,{expose:t,emit:n}){t();let a=k(),o=n,s=x(!1),c=x(``),l=_(()=>{let e=c.value.trim().toLowerCase();return e?a.allBranches.filter(t=>t.toLowerCase().includes(e)):a.allBranches});async function u(e){if(e===a.currentBranch){s.value=!1;return}s.value=!1,await a.changeBranch(e)&&(o(`branchChanged`),a.refreshLog())}let d=x(!1),f=x(``),p=x(``);function m(){s.value=!1,p.value=a.currentBranch,d.value=!0}async function h(){await a.createBranch(f.value,p.value)&&(d.value=!1,f.value=``,o(`branchChanged`))}let v=x(!1);async function y(){if(!v.value){v.value=!0;try{await Promise.all([a.getCurrentBranch(!0),a.getBranchStatus(!0),a.getAllBranches()]),o(`branchChanged`),a.refreshLog()}finally{v.value=!1}}}let b={gitStore:a,emit:o,branchPopoverVisible:s,branchFilter:c,filteredBranches:l,selectBranch:u,createBranchDialogVisible:d,newBranchName:f,selectedBaseBranch:p,openCreateBranchDialog:m,createNewBranch:h,isRefreshingBranch:v,refreshCurrentBranch:y,get $t(){return D},get Plus(){return i},get Menu(){return g},get Check(){return S},get Refresh(){return r},CommonDialog:A,IconButton:E,SvgIcon:j};return Object.defineProperty(b,`__isScriptSetup`,{enumerable:!1,value:!0}),b}}),N={key:0,class:`branch-info`},P={class:`branch-wrapper`},F={class:`branch-btn`},I={class:`branch-btn-name`},L={class:`branch-btn-caret`},R={class:`branch-popover-inner`},z={class:`branch-search`},B={class:`branch-list`},V=[`onClick`],H={key:1,class:`branch-item-check-placeholder`},U={class:`branch-item-name`},W={key:0,class:`branch-empty`},G={class:`branch-popover-footer`},K={class:`create-branch-content`},q={class:`form-label`},J={class:`form-label`},Y={class:`dialog-footer`},X={class:`footer-actions`},Z=[`disabled`];function Q(r,i,o,g,_,x){let S=u,E=c,D=b,O=y,k=n,A=a,j=t;return g.gitStore.currentBranch?(T(),w(`div`,N,[h(`div`,P,[d(` VSCode 风格分支按钮 + 弹出列表 `),e(D,{visible:g.branchPopoverVisible,"onUpdate:visible":i[1]||=e=>g.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:i[2]||=e=>g.branchFilter=``},{reference:l(()=>[h(`button`,F,[e(g.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),h(`span`,I,f(g.gitStore.currentBranch),1),h(`span`,L,[e(S,null,{default:l(()=>[...i[7]||=[h(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[h(`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:l(()=>[h(`div`,R,[d(` 搜索框 `),h(`div`,z,[e(E,{modelValue:g.branchFilter,"onUpdate:modelValue":i[0]||=e=>g.branchFilter=e,placeholder:g.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),d(` 分支列表 `),h(`div`,B,[(T(!0),w(C,null,s(g.filteredBranches,t=>(T(),w(`div`,{key:t,class:v([`branch-item`,{"is-active":t===g.gitStore.currentBranch}]),onClick:e=>g.selectBranch(t)},[t===g.gitStore.currentBranch?(T(),m(S,{key:0,class:`branch-item-check`},{default:l(()=>[e(g.Check)]),_:1})):(T(),w(`span`,H)),e(g.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),h(`span`,U,f(t),1)],10,V))),128)),g.filteredBranches.length===0?(T(),w(`div`,W,f(g.$t(`@F13B4:没有匹配的分支`)),1)):d(`v-if`,!0)]),d(` 底部:创建新分支 `),h(`div`,G,[h(`button`,{class:`branch-create-btn`,onClick:g.openCreateBranchDialog},[e(S,null,{default:l(()=>[e(g.Plus)]),_:1}),h(`span`,null,f(g.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),d(` 刷新按钮 `),e(g.IconButton,{tooltip:g.$t(`@CMDCON:刷新`),onClick:g.refreshCurrentBranch},{default:l(()=>[e(S,{class:v({"is-loading":g.isRefreshingBranch})},{default:l(()=>[e(g.Refresh)]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),d(` 创建分支对话框 `),e(g.CommonDialog,{modelValue:g.createBranchDialogVisible,"onUpdate:modelValue":i[6]||=e=>g.createBranchDialogVisible=e,title:g.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:l(()=>[h(`div`,Y,[h(`div`,X,[h(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:i[5]||=e=>g.createBranchDialogVisible=!1},f(g.$t(`@F13B4:取消`)),1),h(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:g.createNewBranch,disabled:g.gitStore.isCreatingBranch},[g.gitStore.isCreatingBranch?(T(),m(S,{key:1,class:`is-loading`},{default:l(()=>[...i[8]||=[h(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[h(`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})):(T(),m(S,{key:0},{default:l(()=>[e(g.Check)]),_:1})),h(`span`,null,f(g.$t(`@F13B4:创建`)),1)],8,Z)])])]),default:l(()=>[h(`div`,K,[e(j,{model:{newBranchName:g.newBranchName,selectedBaseBranch:g.selectedBaseBranch},"label-position":`top`},{default:l(()=>[e(O,null,{label:l(()=>[h(`div`,q,[e(S,{class:`label-icon`},{default:l(()=>[e(g.Plus)]),_:1}),h(`span`,null,f(g.$t(`@F13B4:新分支名称`)),1)])]),default:l(()=>[e(E,{modelValue:g.newBranchName,"onUpdate:modelValue":i[3]||=e=>g.newBranchName=e,placeholder:g.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:p(g.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),e(O,null,{label:l(()=>[h(`div`,J,[e(S,{class:`label-icon`},{default:l(()=>[e(g.Menu)]),_:1}),h(`span`,null,f(g.$t(`@F13B4:基于分支`)),1)])]),default:l(()=>[e(A,{modelValue:g.selectedBaseBranch,"onUpdate:modelValue":i[4]||=e=>g.selectedBaseBranch=e,placeholder:g.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:l(()=>[(T(!0),w(C,null,s(g.gitStore.allBranches,e=>(T(),m(k,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):d(`v-if`,!0)}var $=O(M,[[`render`,Q],[`__scopeId`,`data-v-9548a76f`],[`__file`,`C:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{$ as default};
1
+ import"./rolldown-runtime-BM3Ffeng.js";import{Cn as e,K as t,L as n,Lt as r,Pt as i,R as a,Tn as o,Vn as s,W as c,Xn as l,Y as u,_n as d,_r as f,cn as p,gn as m,hn as h,kt as g,mn as _,mr as v,q as y,r as b,sr as x,tt as S,un as C,vn as w,zn as T}from"./element-plus-C0loJL0J.js";import{C as E,E as D,T as O,b as k,d as A,w as j}from"./index-BEPT2LNX.js";var M=o({__name:`BranchSelector`,emits:[`branchChanged`],setup(e,{expose:t,emit:n}){t();let a=k(),o=n,s=x(!1),c=x(``),l=_(()=>{let e=c.value.trim().toLowerCase();return e?a.allBranches.filter(t=>t.toLowerCase().includes(e)):a.allBranches});async function u(e){if(e===a.currentBranch){s.value=!1;return}s.value=!1,await a.changeBranch(e)&&(o(`branchChanged`),a.refreshLog())}let d=x(!1),f=x(``),p=x(``);function m(){s.value=!1,p.value=a.currentBranch,d.value=!0}async function h(){await a.createBranch(f.value,p.value)&&(d.value=!1,f.value=``,o(`branchChanged`))}let v=x(!1);async function y(){if(!v.value){v.value=!0;try{await Promise.all([a.getCurrentBranch(!0),a.getBranchStatus(!0),a.getAllBranches()]),o(`branchChanged`),a.refreshLog()}finally{v.value=!1}}}let b={gitStore:a,emit:o,branchPopoverVisible:s,branchFilter:c,filteredBranches:l,selectBranch:u,createBranchDialogVisible:d,newBranchName:f,selectedBaseBranch:p,openCreateBranchDialog:m,createNewBranch:h,isRefreshingBranch:v,refreshCurrentBranch:y,get $t(){return D},get Plus(){return i},get Menu(){return g},get Check(){return S},get Refresh(){return r},CommonDialog:A,IconButton:E,SvgIcon:j};return Object.defineProperty(b,`__isScriptSetup`,{enumerable:!1,value:!0}),b}}),N={key:0,class:`branch-info`},P={class:`branch-wrapper`},F={class:`branch-btn`},I={class:`branch-btn-name`},L={class:`branch-btn-caret`},R={class:`branch-popover-inner`},z={class:`branch-search`},B={class:`branch-list`},V=[`onClick`],H={key:1,class:`branch-item-check-placeholder`},U={class:`branch-item-name`},W={key:0,class:`branch-empty`},G={class:`branch-popover-footer`},K={class:`create-branch-content`},q={class:`form-label`},J={class:`form-label`},Y={class:`dialog-footer`},X={class:`footer-actions`},Z=[`disabled`];function Q(r,i,o,g,_,x){let S=u,E=c,D=b,O=y,k=n,A=a,j=t;return g.gitStore.currentBranch?(T(),w(`div`,N,[h(`div`,P,[d(` VSCode 风格分支按钮 + 弹出列表 `),e(D,{visible:g.branchPopoverVisible,"onUpdate:visible":i[1]||=e=>g.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:i[2]||=e=>g.branchFilter=``},{reference:l(()=>[h(`button`,F,[e(g.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),h(`span`,I,f(g.gitStore.currentBranch),1),h(`span`,L,[e(S,null,{default:l(()=>[...i[7]||=[h(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[h(`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:l(()=>[h(`div`,R,[d(` 搜索框 `),h(`div`,z,[e(E,{modelValue:g.branchFilter,"onUpdate:modelValue":i[0]||=e=>g.branchFilter=e,placeholder:g.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),d(` 分支列表 `),h(`div`,B,[(T(!0),w(C,null,s(g.filteredBranches,t=>(T(),w(`div`,{key:t,class:v([`branch-item`,{"is-active":t===g.gitStore.currentBranch}]),onClick:e=>g.selectBranch(t)},[t===g.gitStore.currentBranch?(T(),m(S,{key:0,class:`branch-item-check`},{default:l(()=>[e(g.Check)]),_:1})):(T(),w(`span`,H)),e(g.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),h(`span`,U,f(t),1)],10,V))),128)),g.filteredBranches.length===0?(T(),w(`div`,W,f(g.$t(`@F13B4:没有匹配的分支`)),1)):d(`v-if`,!0)]),d(` 底部:创建新分支 `),h(`div`,G,[h(`button`,{class:`branch-create-btn`,onClick:g.openCreateBranchDialog},[e(S,null,{default:l(()=>[e(g.Plus)]),_:1}),h(`span`,null,f(g.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),d(` 刷新按钮 `),e(g.IconButton,{tooltip:g.$t(`@CMDCON:刷新`),onClick:g.refreshCurrentBranch},{default:l(()=>[e(S,{class:v({"is-loading":g.isRefreshingBranch})},{default:l(()=>[e(g.Refresh)]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),d(` 创建分支对话框 `),e(g.CommonDialog,{modelValue:g.createBranchDialogVisible,"onUpdate:modelValue":i[6]||=e=>g.createBranchDialogVisible=e,title:g.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:l(()=>[h(`div`,Y,[h(`div`,X,[h(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:i[5]||=e=>g.createBranchDialogVisible=!1},f(g.$t(`@F13B4:取消`)),1),h(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:g.createNewBranch,disabled:g.gitStore.isCreatingBranch},[g.gitStore.isCreatingBranch?(T(),m(S,{key:1,class:`is-loading`},{default:l(()=>[...i[8]||=[h(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[h(`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})):(T(),m(S,{key:0},{default:l(()=>[e(g.Check)]),_:1})),h(`span`,null,f(g.$t(`@F13B4:创建`)),1)],8,Z)])])]),default:l(()=>[h(`div`,K,[e(j,{model:{newBranchName:g.newBranchName,selectedBaseBranch:g.selectedBaseBranch},"label-position":`top`},{default:l(()=>[e(O,null,{label:l(()=>[h(`div`,q,[e(S,{class:`label-icon`},{default:l(()=>[e(g.Plus)]),_:1}),h(`span`,null,f(g.$t(`@F13B4:新分支名称`)),1)])]),default:l(()=>[e(E,{modelValue:g.newBranchName,"onUpdate:modelValue":i[3]||=e=>g.newBranchName=e,placeholder:g.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:p(g.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),e(O,null,{label:l(()=>[h(`div`,J,[e(S,{class:`label-icon`},{default:l(()=>[e(g.Menu)]),_:1}),h(`span`,null,f(g.$t(`@F13B4:基于分支`)),1)])]),default:l(()=>[e(A,{modelValue:g.selectedBaseBranch,"onUpdate:modelValue":i[4]||=e=>g.selectedBaseBranch=e,placeholder:g.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:l(()=>[(T(!0),w(C,null,s(g.gitStore.allBranches,e=>(T(),m(k,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):d(`v-if`,!0)}var $=O(M,[[`render`,Q],[`__scopeId`,`data-v-9548a76f`],[`__file`,`C:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{$ as default};