zen-gitsync 2.17.4 → 2.17.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/scripts/release.js +93 -66
- package/src/ui/public/assets/{AgentView-BkNdHFRW.js → AgentView-DJOdvJEV.js} +1 -1
- package/src/ui/public/assets/{AppVersionBadge-pJ33fsvn.js → AppVersionBadge-D2Li5_R-.js} +2 -2
- package/src/ui/public/assets/{BranchSelector-Ixv2uRS6.js → BranchSelector-CSd5uaVm.js} +1 -1
- package/src/ui/public/assets/{CommitForm-DqJvDzSw.js → CommitForm-Ckg9-zay.js} +1 -1
- package/src/ui/public/assets/{CommonDialog-DfT04-V7.js → CommonDialog-B8XOXtz_.js} +1 -1
- package/src/ui/public/assets/{EditorView-Br0JBESF.js → EditorView-Crj8S2TI.js} +1 -1
- package/src/ui/public/assets/{FileDiffViewer-C3DxCngU.js → FileDiffViewer-DL07IMz5.js} +1 -1
- package/src/ui/public/assets/{FlowExecutionViewer-C_FOK1_9.js → FlowExecutionViewer-DvVT19Qv.js} +1 -1
- package/src/ui/public/assets/{FlowOrchestrationWorkspace-wu9ieYbz.js → FlowOrchestrationWorkspace-kRhK9IyL.js} +1 -1
- package/src/ui/public/assets/{IconButton-CQB_swX6.js → IconButton-pqSYKRT8.js} +1 -1
- package/src/ui/public/assets/{LogList-CSpeYuAd.js → LogList-BrN6qtFb.js} +1 -1
- package/src/ui/public/assets/{MindmapView-8AHGHv9g.js → MindmapView-CSsT0NDZ.js} +1 -1
- package/src/ui/public/assets/{MonitorView-Do6DcGd9.js → MonitorView-edRyBybQ.js} +1 -1
- package/src/ui/public/assets/{ProjectStartupButton-DwrukeUb.js → ProjectStartupButton-DZ8VgU79.js} +1 -1
- package/src/ui/public/assets/{RemoteManagerDialog-Dhdwvb2y.js → RemoteManagerDialog-pu9szuYB.js} +1 -1
- package/src/ui/public/assets/{RemoteRepoCard-DjKHYGRi.js → RemoteRepoCard-BSFehgY5.js} +1 -1
- package/src/ui/public/assets/{SourceMapView-COuEBUTw.js → SourceMapView-DbEydLSU.js} +1 -1
- package/src/ui/public/assets/{SvgIcon-C6aJB-3Q.js → SvgIcon-BVCbrPws.js} +1 -1
- package/src/ui/public/assets/{TemplateManager-Th1ibeIh.js → TemplateManager-DPyYaGCE.js} +1 -1
- package/src/ui/public/assets/{UserInputNode-B8F60XEE.js → UserInputNode-DXHeCjzG.js} +1 -1
- package/src/ui/public/assets/WorkbenchView-CKXtZAJn.css +1 -0
- package/src/ui/public/assets/WorkbenchView-DGcirla3.js +13 -0
- package/src/ui/public/assets/{_plugin-vue_export-helper-nUAWISuX.js → _plugin-vue_export-helper-C-YBnnP5.js} +2 -2
- package/src/ui/public/assets/{configStore-CRYvJSvr.js → configStore-DoobmT7N.js} +1 -1
- package/src/ui/public/assets/{gitStore-QokQdW7C.js → gitStore-BJbNtjxA.js} +1 -1
- package/src/ui/public/assets/{index-BLO9MkBC.js → index-ndDaGoRO.js} +4 -4
- package/src/ui/public/assets/{previewSandbox-CA1fFxdo.js → previewSandbox-BZV6Eqhv.js} +0 -0
- package/src/ui/public/index.html +10 -10
- package/src/ui/public/assets/WorkbenchView-CML-A0y6.css +0 -1
- package/src/ui/public/assets/WorkbenchView-jutdH9WI.js +0 -13
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zen-gitsync",
|
|
3
|
-
"version": "2.17.
|
|
3
|
+
"version": "2.17.5",
|
|
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",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"verify:wb-proj-filter": "node scripts/verify-wb-proj-filter.cjs",
|
|
38
38
|
"verify:wb-panel-resize": "node scripts/verify-wb-panel-resize.cjs",
|
|
39
39
|
"verify:wb-responsive": "node scripts/verify-wb-responsive.cjs",
|
|
40
|
+
"verify:wb-editor-persist": "node scripts/verify-workbench-editor-persist.cjs",
|
|
40
41
|
"e2e": "cd src/ui/client && npx playwright test",
|
|
41
42
|
"e2e:headed": "cd src/ui/client && npx playwright test --headed",
|
|
42
43
|
"e2e:install": "cd src/ui/client && npx playwright install chromium",
|
package/scripts/release.js
CHANGED
|
@@ -26,10 +26,11 @@
|
|
|
26
26
|
* npm run release -- --skip-self-update # 发布后不自动 npm install -g zen-gitsync
|
|
27
27
|
* npm run release -- --skip-push # 只发布到 npm,不 push git
|
|
28
28
|
* npm run release -- --dry-run # 只打印计划,不真正改 package.json / commit / publish
|
|
29
|
-
* npm run release -- --poll-interval=20 --poll-timeout=600 #
|
|
29
|
+
* npm run release -- --poll-interval=20 --poll-timeout=600 # 调自更新重试节奏(秒)
|
|
30
30
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
31
|
+
* 发布后自更新:反复尝试 `npm install -g zen-gitsync@<版本>` 并校验全局版本;
|
|
32
|
+
* 精确版本号解析不到(ETARGET)时改用 tarball URL 直连兜底。
|
|
33
|
+
* 原因见 tarballUrl() / selfUpdateGlobal() 处注释 —— publish 成功不等于 packument 立即可见。
|
|
33
34
|
*/
|
|
34
35
|
|
|
35
36
|
import fs from 'node:fs'
|
|
@@ -67,12 +68,27 @@ function readNumberArg(name, fallback) {
|
|
|
67
68
|
// 仍是 2.17.2,versions 里没有 2.17.3;packument 响应头
|
|
68
69
|
// `Cache-Control: public, max-age=300` —— 光 CDN 层就可能滞后 5 分钟。
|
|
69
70
|
// 所以"publish 完立刻 npm install -g"必然装回旧版(实测 `npm ls -g` 停在 2.17.2)。
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
//
|
|
71
|
+
//
|
|
72
|
+
// 再实测(2026-09-20, v2.17.4):滞后不止 600s。那次脚本"先等 dist-tags 翻牌"一直等到
|
|
73
|
+
// 超时(600s 里 latest 全程是 2.17.3),超时后再 install 依旧 ETARGET —— 因为
|
|
74
|
+
// `npm view dist-tags` 和 `npm install pkg@ver` 读的是**同一份 packument**:
|
|
75
|
+
// 等它、用它,走的是同一条被缓存的路。只把超时 600s 往上加,只是把失败往后推。
|
|
76
|
+
//
|
|
77
|
+
// 兜底:tarball URL 是不可变资源,发布完成即可取,且不经过 packument 的那层缓存
|
|
78
|
+
// (见 tarballUrl 注释)。所以自更新不再把安装卡在 dist-tags 后面,而是
|
|
79
|
+
// "反复尝试安装 + 校验全局版本",精确版本号解析不到时自动改用 tarball 直连。
|
|
80
|
+
// 默认 15s 一轮、上限 600s;可用 `--poll-interval=<秒>` / `--poll-timeout=<秒>` 调。
|
|
73
81
|
const POLL_INTERVAL_MS = readNumberArg('--poll-interval', 15) * 1000
|
|
74
82
|
const POLL_TIMEOUT_MS = readNumberArg('--poll-timeout', 600) * 1000
|
|
75
83
|
|
|
84
|
+
// 发布物 tarball 的地址。npm publish 是先把 tarball 推进 registry、再更新 packument;
|
|
85
|
+
// tarball 按 URL 寻址、内容不可变,所以它比 packument 更早对外可用,也不会被
|
|
86
|
+
// max-age 那层缓存挂在旧内容上 —— "新版本已发布、但 packument 还是旧的"时,
|
|
87
|
+
// 这是唯一能立刻装上的路径。
|
|
88
|
+
function tarballUrl(version) {
|
|
89
|
+
return `${NPM_REGISTRY.replace(/\/$/, '')}/${PKG_NAME}/-/${PKG_NAME}-${version}.tgz`
|
|
90
|
+
}
|
|
91
|
+
|
|
76
92
|
// 跨平台 sleep:Node 原生,避免 `sleep N || ping` 的 Windows 兜底 hack
|
|
77
93
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms))
|
|
78
94
|
|
|
@@ -531,86 +547,97 @@ function readGlobalInstalledVersion() {
|
|
|
531
547
|
}
|
|
532
548
|
}
|
|
533
549
|
|
|
534
|
-
//
|
|
535
|
-
//
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
console.log(chalk.gray(
|
|
539
|
-
|
|
550
|
+
// 执行一次全局安装。退出码 0 才返回 ok。
|
|
551
|
+
// 输出先兜住不打印:重试期间每失败一次就刷一屏 `npm error` 太吵,
|
|
552
|
+
// 只有整轮尝试全部失败时,调用方才回放最后一份输出。
|
|
553
|
+
function tryInstallGlobal(spec) {
|
|
554
|
+
console.log(chalk.gray(` → npm install -g ${spec}`))
|
|
555
|
+
try {
|
|
556
|
+
execSync(`npm install -g ${spec} --registry=${NPM_REGISTRY} --prefer-online`, {
|
|
557
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
558
|
+
maxBuffer: 8 * 1024 * 1024,
|
|
559
|
+
timeout: 300000,
|
|
560
|
+
})
|
|
561
|
+
return { ok: true }
|
|
562
|
+
} catch (err) {
|
|
563
|
+
const out = `${err.stdout ?? ''}${err.stderr ?? ''}`.trim()
|
|
564
|
+
return { ok: false, output: out || String(err.message || err) }
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// 自更新全局版本:反复尝试安装,直到全局版本校验通过或超时。
|
|
569
|
+
//
|
|
570
|
+
// 为什么不是"先等 dist-tags 翻牌,再安装"(v2.17.4 之前的老写法):
|
|
571
|
+
// `npm view dist-tags.latest` 和 `npm install -g pkg@ver` 读的是同一份 packument。
|
|
572
|
+
// packument 被 CDN 缓存(max-age=300,实测还能更久)时两边一起滞后 ——
|
|
573
|
+
// 等待阶段白等 600s,超时后再装照样 ETARGET,等于什么都没解决。
|
|
574
|
+
//
|
|
575
|
+
// 所以顺序反过来:先"尝试装",装不上才等。每轮按两条路试,任一条装上且校验通过就结束:
|
|
576
|
+
// ① `pkg@<version>` —— 常规路径,packument 已同步时一次命中;
|
|
577
|
+
// ② tarball URL 直连 —— packument 还是旧的时候的唯一出路(见 tarballUrl 注释)。
|
|
578
|
+
async function selfUpdateGlobal(version) {
|
|
579
|
+
console.log(chalk.blue('\n=== 发布后自更新全局版本 ==='))
|
|
580
|
+
console.log(chalk.gray('publish 成功 ≠ packument 立即可见(registry 处理 + CDN 缓存)。'))
|
|
581
|
+
console.log(chalk.gray('不空等 dist-tags,直接反复尝试安装;精确版本解析不到就 tarball 直连兜底。'))
|
|
540
582
|
console.log(chalk.gray(
|
|
541
|
-
|
|
542
|
-
+ '
|
|
583
|
+
`间隔 ${POLL_INTERVAL_MS / 1000}s,上限 ${POLL_TIMEOUT_MS / 1000}s`
|
|
584
|
+
+ '(可用 --poll-interval / --poll-timeout 调)。'
|
|
543
585
|
))
|
|
544
586
|
|
|
545
587
|
const startedAt = Date.now()
|
|
546
588
|
const deadline = startedAt + POLL_TIMEOUT_MS
|
|
589
|
+
const tarball = tarballUrl(version)
|
|
547
590
|
let attempt = 0
|
|
591
|
+
let lastOutput = ''
|
|
548
592
|
|
|
549
593
|
for (;;) {
|
|
550
594
|
attempt += 1
|
|
551
|
-
const
|
|
595
|
+
const packumentSynced = readLatestDistTag() === version
|
|
596
|
+
// packument 已同步 → 先走常规精确版本;还没同步 → tarball 优先,争取一轮命中
|
|
597
|
+
const targets = packumentSynced
|
|
598
|
+
? [`${PKG_NAME}@${version}`, tarball]
|
|
599
|
+
: [tarball, `${PKG_NAME}@${version}`]
|
|
600
|
+
|
|
601
|
+
console.log(chalk.gray(
|
|
602
|
+
`第 ${attempt} 次尝试(dist-tags.latest${packumentSynced ? '已同步' : '仍是旧版本'})...`
|
|
603
|
+
))
|
|
552
604
|
|
|
553
|
-
|
|
554
|
-
const
|
|
555
|
-
|
|
556
|
-
|
|
605
|
+
for (const spec of targets) {
|
|
606
|
+
const res = tryInstallGlobal(spec)
|
|
607
|
+
if (!res.ok) {
|
|
608
|
+
lastOutput = res.output
|
|
609
|
+
continue
|
|
610
|
+
}
|
|
611
|
+
const installed = readGlobalInstalledVersion()
|
|
612
|
+
if (installed === version) {
|
|
613
|
+
const cost = ((Date.now() - startedAt) / 1000).toFixed(1)
|
|
614
|
+
console.log(chalk.green(
|
|
615
|
+
`全局已更新到 ${PKG_NAME}@${version}(第 ${attempt} 次尝试,耗时 ${cost}s)`
|
|
616
|
+
))
|
|
617
|
+
return
|
|
618
|
+
}
|
|
619
|
+
// 退出码 0 但版本不对(极少见):按失败处理,继续下一轮
|
|
620
|
+
lastOutput = `安装命令退出码 0,但全局版本读到 ${installed ?? '未知'}`
|
|
621
|
+
console.log(chalk.yellow(` 安装命令成功,但全局版本是 ${installed ?? '未知'},继续重试`))
|
|
557
622
|
}
|
|
558
623
|
|
|
559
624
|
const remain = deadline - Date.now()
|
|
560
625
|
if (remain <= 0) {
|
|
561
|
-
console.
|
|
562
|
-
|
|
563
|
-
|
|
626
|
+
console.error(chalk.red(`已尝试 ${attempt} 次,仍未装上 ${PKG_NAME}@${version}`))
|
|
627
|
+
if (lastOutput) console.error(chalk.gray(lastOutput))
|
|
628
|
+
console.error(chalk.gray(
|
|
629
|
+
'可稍后手动重试:\n'
|
|
630
|
+
+ ` npm install -g ${PKG_NAME}@${version}\n`
|
|
631
|
+
+ '若仍报 ETARGET(packument 缓存滞后),直连 tarball:\n'
|
|
632
|
+
+ ` npm install -g ${tarball}`
|
|
564
633
|
))
|
|
565
|
-
return
|
|
634
|
+
return
|
|
566
635
|
}
|
|
567
|
-
|
|
568
|
-
console.log(chalk.gray(
|
|
569
|
-
`第 ${attempt} 次:latest=${latest ?? '查询失败(网络或 registry 波动)'},`
|
|
570
|
-
+ `期望 ${version},${Math.ceil(remain / 1000)}s 后重试`
|
|
571
|
-
))
|
|
636
|
+
console.log(chalk.gray(` ${Math.ceil(remain / 1000)}s 后重试`))
|
|
572
637
|
await sleep(Math.min(POLL_INTERVAL_MS, remain))
|
|
573
638
|
}
|
|
574
639
|
}
|
|
575
640
|
|
|
576
|
-
// 装"精确版本"而不是 latest:即便 dist-tags 的 CDN 缓存滞后,
|
|
577
|
-
// 精确版本号也只会命中刚发布的那份 tarball。
|
|
578
|
-
function installGlobal(version) {
|
|
579
|
-
console.log(chalk.gray(`执行 npm install -g ${PKG_NAME}@${version}...`))
|
|
580
|
-
execSync(
|
|
581
|
-
`npm install -g ${PKG_NAME}@${version} --registry=${NPM_REGISTRY} --prefer-online`,
|
|
582
|
-
{ stdio: 'inherit' }
|
|
583
|
-
)
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
// 等待可见 → 全局安装 → 校验装到的版本(校验不看退出码,退出码 0 不代表版本对)
|
|
587
|
-
async function selfUpdateGlobal(version) {
|
|
588
|
-
const visible = await waitForVersionVisible(version)
|
|
589
|
-
|
|
590
|
-
try {
|
|
591
|
-
installGlobal(version)
|
|
592
|
-
} catch (err) {
|
|
593
|
-
console.error(chalk.red('全局安装失败:'), err.message || err)
|
|
594
|
-
console.error(chalk.gray(`可稍后手动重试: npm install -g ${PKG_NAME}@${version}`))
|
|
595
|
-
return
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
const installed = readGlobalInstalledVersion()
|
|
599
|
-
if (installed === version) {
|
|
600
|
-
console.log(chalk.green(`全局已更新到 ${PKG_NAME}@${version}`))
|
|
601
|
-
if (!visible) {
|
|
602
|
-
console.log(chalk.gray('(轮询阶段 npm view 未查到该版本,但安装已拿到正确版本)'))
|
|
603
|
-
}
|
|
604
|
-
return
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
console.error(chalk.red(
|
|
608
|
-
`全局版本校验不一致:期望 ${version},实际 ${installed ?? '未知'}`
|
|
609
|
-
+ (visible ? '' : '(且轮询阶段未在 registry 上看到该版本)')
|
|
610
|
-
))
|
|
611
|
-
console.error(chalk.gray(`等 registry 同步完成后手动重试: npm install -g ${PKG_NAME}@${version}`))
|
|
612
|
-
}
|
|
613
|
-
|
|
614
641
|
// 发布到 NPM
|
|
615
642
|
async function publishToNpm(version) {
|
|
616
643
|
console.log(chalk.blue('\n=== 发布到 NPM ==='))
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,At as t,Bn as n,Dn as r,En as i,Er as a,G as o,Gt as s,In as c,On as l,Pn as u,Pr as d,Qr as f,Tn as p,Wn as m,Y as h,Yr as g,Zn as _,_n as ee,a as v,bn as te,br as y,cn as ne,cr as b,gt as x,i as S,kn as C,lr as w,o as re,or as T,pr as E,qr as D,tt as ie,un as O,ut as ae,vr as k,xn as oe,zt as se}from"./element-plus-KTmRV-so.js";import{a as ce,r as A,t as j}from"./vendor-CwZs6S_i.js";import{n as M,t as N}from"./_plugin-vue_export-helper-
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,At as t,Bn as n,Dn as r,En as i,Er as a,G as o,Gt as s,In as c,On as l,Pn as u,Pr as d,Qr as f,Tn as p,Wn as m,Y as h,Yr as g,Zn as _,_n as ee,a as v,bn as te,br as y,cn as ne,cr as b,gt as x,i as S,kn as C,lr as w,o as re,or as T,pr as E,qr as D,tt as ie,un as O,ut as ae,vr as k,xn as oe,zt as se}from"./element-plus-KTmRV-so.js";import{a as ce,r as A,t as j}from"./vendor-CwZs6S_i.js";import{n as M,t as N}from"./_plugin-vue_export-helper-C-YBnnP5.js";import{t as P}from"./configStore-DoobmT7N.js";E();var F=65536;function I(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:z(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>F&&(a=`…(前文已截断)\n${a.slice(-65536)}`);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||A(),name:e.function?.name||``,arguments:e.function?.arguments||``,argsPreview:L(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>F&&(e=`…(前文已截断)\n${e.slice(-65536)}`),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 L(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 R(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 z(e){let t=/^data:([^;,]+)/.exec(e);return t?t[1]:``}function B(){let e=P(),t=y([]),n=y(!1),r=y(null),i=y([]),a=y(!1),o=y(!1),s=null,c=0,l=0;async function u(){let r=++l,i=e.currentDirectory||``;if(!i){t.value=[],n.value=!1;return}n.value=!0;try{let e=`/api/agent/sessions?cwd=${encodeURIComponent(i)}`,n=await fetch(e).then(e=>e.json());if(r!==l)return;if(!n.success){v.error(n.error||M(`@AGENT:加载会话列表失败`));return}t.value=Array.isArray(n.sessions)?n.sessions:[]}catch(e){if(r!==l)return;v.error(M(`@AGENT:加载会话列表失败`)+`: `+(e?.message||e))}finally{r===l&&(n.value=!1)}}async function d(e){o.value=!0,r.value=e;try{let t=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`).then(e=>e.json());if(!t.success){v.error(t.error||M(`@AGENT:加载会话失败`));return}i.value=I(t.session)}catch(e){v.error(M(`@AGENT:加载会话失败`)+`: `+(e?.message||e))}finally{o.value=!1}}async function f(e){try{await S.confirm(M(`@AGENT:确认删除该会话`),M(`@AGENT:删除后无法恢复`),{type:`warning`})}catch{return}try{let n=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`,{method:`DELETE`}).then(e=>e.json());if(!n.success){v.error(n.error||M(`@AGENT:删除失败`));return}t.value=t.value.filter(t=>t.sessionId!==e),r.value===e&&(r.value=null,i.value=[]),v.success(M(`@AGENT:已删除`))}catch(e){v.error(M(`@AGENT:删除失败`)+`: `+(e?.message||e))}}async function p(e,n){try{let r=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:n})}).then(e=>e.json());if(!r.success){v.error(r.error||M(`@AGENT:重命名失败`));return}let i=t.value.find(t=>t.sessionId===e);i&&(i.title=n),v.success(M(`@AGENT:已重命名`))}catch(e){v.error(M(`@AGENT:重命名失败`)+`: `+(e?.message||e))}}function m(){r.value=null,i.value=[]}async function h(t,n=[]){let o=n.filter(e=>e?.file?.type?.startsWith(`image/`));if(o.length<n.length&&v.warning(M(`@AGENT:仅支持发送图片,非图片文件已忽略`)),!t.trim()&&o.length===0||a.value)return;let l=(await Promise.allSettled(o.map(e=>R(e.file)))).map(e=>e.status===`fulfilled`?e.value:``).filter(e=>e.startsWith(`data:image/`)),d=++c;s=new AbortController;let f=s,p={id:A(),role:`user`,content:t,status:`done`,createdAt:Date.now()};o.length>0&&(p.attachments=o.map(e=>({id:e.id,name:e.file.name||`image`,size:e.file.size||0,type:e.file.type||``,preview:e.preview}))),i.value.push(p);let m=k({id:A(),role:`assistant`,content:``,status:`pending`,createdAt:Date.now()});i.value.push(m),a.value=!0;let h=[];try{let n=await fetch(`/api/agent/chat`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify({sessionId:r.value||``,userMessage:t,cwd:e.currentDirectory||``,...l.length>0?{images:l}:{}}),signal:f.signal});if(d!==c)return;if(!n.ok||!n.body){let e=await n.text().catch(()=>``);throw Error(e||`HTTP ${n.status}`)}let a=n.body.getReader(),o=new TextDecoder(`utf-8`),s=``,p=r.value;for(;;){let{value:e,done:t}=await a.read();if(d!==c)return;if(t)break;s+=o.decode(e,{stream:!0});let n=s.split(`
|
|
2
2
|
`);s=n.pop()??``;for(let e of n){let t=e.trim();if(!t.startsWith(`data:`))continue;let n=t.slice(5).trim();if(!n)continue;let i;try{i=JSON.parse(n)}catch{continue}switch(i.type){case`meta`:i.sessionId&&(p=i.sessionId,r.value=i.sessionId);break;case`thinking`:m.reasoning||(m.reasoning=``,m.reasoningStatus=`streaming`),m.reasoning+=String(i.delta||``),m.status=`streaming`;break;case`content`:m.status===`pending`&&(m.status=`streaming`);{let e=String(i.delta||``);m.content+=e;let t=j(m.content);t.reasoning&&(m.reasoning||(m.reasoning=``,m.reasoningStatus=`streaming`),m.reasoning=t.reasoning,m.content=t.content)}break;case`tool_call_start`:{let e=k({id:i.toolCallId||A(),name:i.name||``,argsPreview:i.argsPreview||``,arguments:i.argsPreview||``,status:`running`,result:``});h.push(e),m.toolCalls||=[],m.toolCalls.push(e),m.status===`pending`&&(m.status=`streaming`);break}case`tool_result`:{let e=h.find(e=>e.id===i.toolCallId);e&&(e.result=String(i.result||``),e.status=`done`);break}case`done`:{let e=i.content||m.content,t=j(e);t.reasoning&&!m.reasoning&&(m.reasoning=t.reasoning),m.content=t.content,m.status=`done`,m.reasoningStatus===`streaming`&&(m.reasoningStatus=`done`);break}case`error`:m.status=`error`,m.error=String(i.error||M(`@AGENT:未知错误`)),m.reasoningStatus===`streaming`&&(m.reasoningStatus=`done`)}}i.value=[...i.value]}if(d!==c)return;m.status===`pending`&&(m.status=`done`),p&&p!==r.value&&(r.value=p),u().catch(()=>{})}catch(e){if(d!==c)return;e?.name===`AbortError`||f.signal.aborted?(m.content=(m.content||``)+`
|
|
3
3
|
|
|
4
4
|
[`+M(`@AGENT:已停止`)+`]`,m.status=`done`,m.reasoningStatus===`streaming`&&(m.reasoningStatus=`done`)):(m.status=`error`,m.error=e?.message||String(e),v.error(m.error||M(`@AGENT:对话失败`)))}finally{d===c&&(a.value=!1,s=null)}}function g(){s&&=(s.abort(),null)}return{sessions:t,sessionsLoading:n,currentSessionId:r,messages:i,isStreaming:a,sessionLoading:o,loadSessions:u,loadSession:d,deleteSession:f,renameSession:p,newSession:m,sendMessage:h,stop:g}}n(),E(),d(),O();var V={class:`agent-view`},H={class:`sidebar-header`},U={class:`sidebar-search`},W=[`placeholder`],G={class:`session-list`},le={key:0,class:`empty-state`},K={class:`empty-text`},ue={key:0,class:`empty-hint`},de=[`onClick`],fe={class:`session-item-main`},pe={class:`session-item-title`},me={class:`session-item-meta`},he={class:`meta-time`},ge={class:`meta-count`},_e={key:0,class:`meta-source cli`},ve=[`onClick`],ye=[`onClick`],be={class:`agent-chat-area`},xe={key:0,class:`chat-loading`},Se={key:0,class:`stop-button-bar`},q=N(c({__name:`AgentView`,setup(n){let c=P(),{sessions:d,sessionsLoading:E,currentSessionId:O,messages:k,isStreaming:A,sessionLoading:j,loadSessions:N,loadSession:F,deleteSession:I,renameSession:L,newSession:R,sendMessage:z,stop:q}=B(),Ce=p(()=>{let e=c.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),J=y(``),Y=p(()=>{if(!J.value.trim())return d.value;let e=J.value.toLowerCase();return d.value.filter(t=>(t.title||``).toLowerCase().includes(e)||(t.model||``).toLowerCase().includes(e))}),we=p(()=>[{id:`p1`,label:M(`@AGENT:查看项目结构`),prompt:M(`@AGENT:prompt_p1`)},{id:`p2`,label:M(`@AGENT:分析代码质量`),prompt:M(`@AGENT:prompt_p2`)},{id:`p3`,label:M(`@AGENT:帮我写测试`),prompt:M(`@AGENT:prompt_p3`)},{id:`p4`,label:M(`@AGENT:Git 状态检查`),prompt:M(`@AGENT:prompt_p4`)}]);async function Te(e){await z(e.text,e.files),await m(),Z()}async function Ee(e){await z(e.prompt),await m(),Z()}let X=y(null);function Z(e=!0){X.value?.scrollToBottom(e)}T(()=>k.value.length,()=>{m(()=>Z(!1))});function De(e){if(A.value){v.warning(M(`@AGENT:请先停止当前生成`));return}F(e)}function Oe(){if(A.value){v.warning(M(`@AGENT:请先停止当前生成`));return}R()}function ke(e,t){if(t.stopPropagation(),A.value&&O.value===e){v.warning(M(`@AGENT:请先停止当前生成`));return}I(e)}async function Ae(e,t,n){n.stopPropagation();try{let{value:n}=await S.prompt(M(`@AGENT:请输入新的会话标题`),M(`@AGENT:重命名会话`),{inputValue:t,inputPattern:/.+/,inputErrorMessage:M(`@AGENT:标题不能为空`)});n&&n!==t&&await L(e,n)}catch{}}function je(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<6048e5){let e=Math.floor(r/864e5);return e===0?M(`@AGENT:今天`):`${e}${M(`@AGENT:天前`)}`}return`${t.getFullYear()}-${i(t.getMonth()+1)}-${i(t.getDate())}`}catch{return e}}let Q=y(280),$=y(!1);function Me(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 T(()=>[c.currentDirectory,A.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await N(),O.value&&!A.value&&!d.value.some(e=>e.sessionId===O.value)&&R()},{immediate:!0}),(n,c)=>{let d=re;return _(),C(`div`,V,[i(`aside`,{class:`agent-sidebar`,style:g({width:Q.value+`px`})},[i(`div`,H,[i(`button`,{class:`new-session-btn`,onClick:Oe},[u(a(h),null,{default:b(()=>[u(a(se))]),_:1}),i(`span`,null,f(a(M)(`@AGENT:新建会话`)),1)])]),i(`div`,U,[u(a(h),{class:`search-icon`},{default:b(()=>[u(a(s))]),_:1}),w(i(`input`,{"onUpdate:modelValue":c[0]||=e=>J.value=e,placeholder:a(M)(`@AGENT:搜索会话...`),class:`search-input`,type:`text`},null,8,W),[[ee,J.value]])]),w((_(),C(`div`,G,[Y.value.length===0&&!a(E)?(_(),C(`div`,le,[u(a(h),{size:28,color:`var(--text-tertiary)`},{default:b(()=>[u(a(ie))]),_:1}),i(`div`,K,f(J.value?a(M)(`@AGENT:未找到匹配的会话`):a(M)(`@AGENT:暂无会话`)),1),J.value?l(``,!0):(_(),C(`div`,ue,f(a(M)(`@AGENT:点击上方按钮开始对话`)),1))])):l(``,!0),(_(!0),C(oe,null,e(Y.value,e=>(_(),C(`div`,{key:e.sessionId,class:D([`session-item`,{active:a(O)===e.sessionId}]),onClick:t=>De(e.sessionId)},[i(`div`,fe,[i(`div`,pe,f(e.title||a(M)(`@AGENT:无标题`)),1),i(`div`,me,[i(`span`,he,f(je(e.updatedAt)),1),c[3]||=i(`span`,{class:`meta-dot`},`·`,-1),i(`span`,ge,f(e.messageCount)+` `+f(a(M)(`@AGENT:条`)),1),e.source===`cli`?(_(),C(`span`,_e,`CLI`)):l(``,!0)])]),i(`div`,{class:`session-item-actions`,onClick:c[1]||=te(()=>{},[`stop`])},[u(a(o),{content:a(M)(`@AGENT:重命名`),placement:`top`,"show-after":500},{default:b(()=>[i(`button`,{class:`item-action-btn`,onClick:t=>Ae(e.sessionId,e.title,t)},[u(a(h),null,{default:b(()=>[u(a(x))]),_:1})],8,ve)]),_:2},1032,[`content`]),u(a(o),{content:a(M)(`@AGENT:删除`),placement:`top`,"show-after":500},{default:b(()=>[i(`button`,{class:`item-action-btn danger`,onClick:t=>ke(e.sessionId,t)},[u(a(h),null,{default:b(()=>[u(a(ae))]),_:1})],8,ye)]),_:2},1032,[`content`])])],10,de))),128))])),[[d,a(E)]])],4),i(`div`,{class:D([`sidebar-resizer`,{active:$.value}]),onMousedown:Me},null,34),i(`main`,be,[a(j)?(_(),C(`div`,xe,[u(a(h),{class:`is-loading`,size:32},{default:b(()=>[u(a(t))]),_:1}),i(`span`,null,f(a(M)(`@AGENT:加载会话中...`)),1)])):(_(),r(a(ce),{key:1,ref_key:`chatContainerRef`,ref:X,messages:a(k),"preset-questions":we.value,"welcome-title":a(M)(`@AGENT:智能体助手`),"welcome-description":a(M)(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":`g ai`,theme:Ce.value,disabled:a(A),"upload-config":{accept:`image/*`},placeholder:a(A)?a(M)(`@AGENT:正在生成中...`):a(M)(`@AGENT:输入消息,Enter 发送`),onSend:Te,onSelect:Ee},null,8,[`messages`,`preset-questions`,`welcome-title`,`welcome-description`,`theme`,`disabled`,`placeholder`])),u(ne,{name:`fade`},{default:b(()=>[a(A)?(_(),C(`div`,Se,[i(`button`,{class:`stop-button`,onClick:c[2]||=(...e)=>a(q)&&a(q)(...e)},[u(a(h),null,{default:b(()=>[u(a(t),{class:`is-loading`})]),_:1}),i(`span`,null,f(a(M)(`@AGENT:停止生成`)),1)])])):l(``,!0)]),_:1})])])}}}),[[`__scopeId`,`data-v-773baa74`]]);export{q as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{At as e,B as t,Bn as n,D as r,Dn as i,En as a,Er as o,G as s,In as c,Nn as l,On as u,Pn as d,Pr as f,Qr as p,Tn as m,Wn as h,Y as g,Yn as _,Zn as v,a as y,br as b,cr as x,i as S,it as C,kn as w,or as T,pr as E,qn as D,qr as O,rt as k}from"./element-plus-KTmRV-so.js";import{n as A,t as j}from"./_plugin-vue_export-helper-
|
|
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(()=>{})})}n(),E(),f();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=j(c({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean},logs:{},status:{},countdown:{default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(n,{emit:s}){let c=n,f=s,m=b(null);T(()=>c.logs,async()=>{await h(),m.value&&(m.value.scrollTop=m.value.scrollHeight)});function _(){c.status!==`running`&&(c.status===`success`&&c.countdown>0&&f(`cancel`),f(`update:modelValue`,!1))}function S(){f(`retry`)}function E(){f(`restart`)}function D(){f(`cancel`),f(`update:modelValue`,!1)}async function j(){try{await navigator.clipboard.writeText(U),y.success(A(`@F13B4:已复制升级命令`))}catch{y.warning(A(`@F13B4:复制失败,请手动复制`))}}return(s,c)=>{let h=g,y=t,b=r;return v(),i(b,{"model-value":n.modelValue,"onUpdate:modelValue":c[0]||=e=>f(`update:modelValue`,e),title:o(A)(`@F13B4:升级`),width:`680px`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":n.status!==`running`,"append-to-body":``,onClose:_},{footer:x(()=>[n.status===`failed`?(v(),i(y,{key:0,type:`primary`,onClick:S},{default:x(()=>[l(p(o(A)(`@F13B4:重试`)),1)]),_:1})):u(``,!0),n.status===`failed`?(v(),i(y,{key:1,onClick:j},{default:x(()=>[l(p(o(A)(`@F13B4:复制升级命令`)),1)]),_:1})):u(``,!0),n.status===`success`?(v(),i(y,{key:2,type:`primary`,onClick:E},{default:x(()=>[l(p(o(A)(`@F13B4:立即重启并刷新`)),1)]),_:1})):u(``,!0),n.status===`success`?(v(),i(y,{key:3,onClick:D},{default:x(()=>[l(p(o(A)(`@F13B4:稍后手动重启`)),1)]),_:1})):u(``,!0),n.status===`running`?(v(),i(y,{key:4,disabled:``},{default:x(()=>[l(p(o(A)(`@F13B4:升级中`))+`... `,1)]),_:1})):u(``,!0)]),default:x(()=>[a(`div`,{class:O([`upgrade-status`,`is-${n.status}`])},[n.status===`running`?(v(),i(h,{key:0,class:`is-loading`},{default:x(()=>[d(o(e))]),_:1})):n.status===`success`?(v(),i(h,{key:1,color:`#67c23a`},{default:x(()=>[d(o(k))]),_:1})):(v(),i(h,{key:2,color:`#f56c6c`},{default:x(()=>[d(o(C))]),_:1})),n.status===`running`?(v(),w(`span`,I,p(o(A)(`@F13B4:升级中`)),1)):n.status===`success`?(v(),w(`span`,L,p(o(A)(`@F13B4:升级完成`)),1)):(v(),w(`span`,R,p(o(A)(`@F13B4:升级失败`)),1))],2),n.status===`success`?(v(),w(`p`,z,[l(p(o(A)(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),n.countdown>0?(v(),w(`span`,B,p(o(A)(`@F13B4:{seconds} 秒后自动刷新`,{seconds:n.countdown})),1)):u(``,!0)])):u(``,!0),n.status===`failed`?(v(),w(`p`,V,[a(`span`,H,p(o(A)(`@F13B4:手动升级命令`)),1),a(`code`,{class:`upgrade-manual__cmd`},p(U))])):u(``,!0),a(`pre`,{ref_key:`logEl`,ref:m,class:`upgrade-log`},p(n.logs||o(A)(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}}}),[[`__scopeId`,`data-v-40c190d7`]]);n(),E(),f();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=j(c({__name:`AppVersionBadge`,setup(e){let t=`2.17.
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{At as e,B as t,Bn as n,D as r,Dn as i,En as a,Er as o,G as s,In as c,Nn as l,On as u,Pn as d,Pr as f,Qr as p,Tn as m,Wn as h,Y as g,Yn as _,Zn as v,a as y,br as b,cr as x,i as S,it as C,kn as w,or as T,pr as E,qn as D,qr as O,rt as k}from"./element-plus-KTmRV-so.js";import{n as A,t as j}from"./_plugin-vue_export-helper-C-YBnnP5.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(()=>{})})}n(),E(),f();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=j(c({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean},logs:{},status:{},countdown:{default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(n,{emit:s}){let c=n,f=s,m=b(null);T(()=>c.logs,async()=>{await h(),m.value&&(m.value.scrollTop=m.value.scrollHeight)});function _(){c.status!==`running`&&(c.status===`success`&&c.countdown>0&&f(`cancel`),f(`update:modelValue`,!1))}function S(){f(`retry`)}function E(){f(`restart`)}function D(){f(`cancel`),f(`update:modelValue`,!1)}async function j(){try{await navigator.clipboard.writeText(U),y.success(A(`@F13B4:已复制升级命令`))}catch{y.warning(A(`@F13B4:复制失败,请手动复制`))}}return(s,c)=>{let h=g,y=t,b=r;return v(),i(b,{"model-value":n.modelValue,"onUpdate:modelValue":c[0]||=e=>f(`update:modelValue`,e),title:o(A)(`@F13B4:升级`),width:`680px`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":n.status!==`running`,"append-to-body":``,onClose:_},{footer:x(()=>[n.status===`failed`?(v(),i(y,{key:0,type:`primary`,onClick:S},{default:x(()=>[l(p(o(A)(`@F13B4:重试`)),1)]),_:1})):u(``,!0),n.status===`failed`?(v(),i(y,{key:1,onClick:j},{default:x(()=>[l(p(o(A)(`@F13B4:复制升级命令`)),1)]),_:1})):u(``,!0),n.status===`success`?(v(),i(y,{key:2,type:`primary`,onClick:E},{default:x(()=>[l(p(o(A)(`@F13B4:立即重启并刷新`)),1)]),_:1})):u(``,!0),n.status===`success`?(v(),i(y,{key:3,onClick:D},{default:x(()=>[l(p(o(A)(`@F13B4:稍后手动重启`)),1)]),_:1})):u(``,!0),n.status===`running`?(v(),i(y,{key:4,disabled:``},{default:x(()=>[l(p(o(A)(`@F13B4:升级中`))+`... `,1)]),_:1})):u(``,!0)]),default:x(()=>[a(`div`,{class:O([`upgrade-status`,`is-${n.status}`])},[n.status===`running`?(v(),i(h,{key:0,class:`is-loading`},{default:x(()=>[d(o(e))]),_:1})):n.status===`success`?(v(),i(h,{key:1,color:`#67c23a`},{default:x(()=>[d(o(k))]),_:1})):(v(),i(h,{key:2,color:`#f56c6c`},{default:x(()=>[d(o(C))]),_:1})),n.status===`running`?(v(),w(`span`,I,p(o(A)(`@F13B4:升级中`)),1)):n.status===`success`?(v(),w(`span`,L,p(o(A)(`@F13B4:升级完成`)),1)):(v(),w(`span`,R,p(o(A)(`@F13B4:升级失败`)),1))],2),n.status===`success`?(v(),w(`p`,z,[l(p(o(A)(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),n.countdown>0?(v(),w(`span`,B,p(o(A)(`@F13B4:{seconds} 秒后自动刷新`,{seconds:n.countdown})),1)):u(``,!0)])):u(``,!0),n.status===`failed`?(v(),w(`p`,V,[a(`span`,H,p(o(A)(`@F13B4:手动升级命令`)),1),a(`code`,{class:`upgrade-manual__cmd`},p(U))])):u(``,!0),a(`pre`,{ref_key:`logEl`,ref:m,class:`upgrade-log`},p(n.logs||o(A)(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}}}),[[`__scopeId`,`data-v-40c190d7`]]);n(),E(),f();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=j(c({__name:`AppVersionBadge`,setup(e){let t=`2.17.5`,n=b(t),r=m(()=>n.value||t),i=b(null),c=b(!1),l=b(``),f=b(`running`),h=b(0),g=null,C=b(!1);function T(){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 E(e){try{sessionStorage.setItem($,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function O(e=!1){let t=T();t&&(i.value=t);try{let t=await N();i.value=t,E(t),t.current&&(n.value=t.current),!e&&t.success&&t.hasUpdate&&y({type:`success`,message:A(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||y({type:`warning`,message:A(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function k(){if(i.value?.hasUpdate){try{await S.confirm(A(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:i.value.current,latest:i.value.latest}),A(`@F13B4:升级`),{confirmButtonText:A(`@F13B4:确定升级`),cancelButtonText:A(`@F13B4:取消`),type:`info`})}catch{return}l.value=``,f.value=`running`,c.value=!0,await P(e=>{if(e.type===`done`){if(f.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem($)}catch{}i.value?.latest&&(n.value=i.value.latest),j()}}else e.message&&(l.value+=e.message)})}}function j(){M(),h.value=Q,g=setInterval(()=>{--h.value,h.value<=0&&(g&&=(clearInterval(g),null),L())},1e3)}function M(){g&&=(clearInterval(g),null),h.value=0}function I(){M()}async function L(){if(M(),!C.value){C.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];y({type:`warning`,message:n?A(n):A(`@F13B4:重启失败 {error}`,{error:t})}),C.value=!1}}}return D(()=>{M()}),_(()=>{O(!0)}),(e,t)=>{let n=s;return v(),w(`div`,G,[d(n,{content:o(A)(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:x(()=>[a(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":o(A)(`@F13B4:在 GitHub 上查看源码`)},[...t[1]||=[a(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[a(`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`]),d(n,{content:o(A)(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:x(()=>[a(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":o(A)(`@F13B4:在 npm 上查看包`)},[...t[2]||=[a(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[a(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,q)]),_:1},8,[`content`]),d(n,{content:o(A)(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:x(()=>[a(`a`,{href:Z,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+p(r.value),1)]),_:1},8,[`content`]),i.value?.hasUpdate?(v(),w(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:o(A)(`@F13B4:发现新版本 {version},点击升级`,{version:i.value.latest??``}),"aria-label":o(A)(`@F13B4:发现新版本 {version},点击升级`,{version:i.value.latest??``}),onClick:k},[t[3]||=a(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),a(`span`,Y,p(o(A)(`@F13B4:升级`)),1),a(`span`,X,`v`+p(i.value.latest),1)],8,J)):u(``,!0),d(W,{modelValue:c.value,"onUpdate:modelValue":t[0]||=e=>c.value=e,logs:l.value,status:f.value,countdown:h.value,onRetry:k,onRestart:L,onCancel:I},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}}}),[[`__scopeId`,`data-v-bc7c0d5c`]]);export{te as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,Dn as n,En as r,Er as i,Ht as ee,In as a,K as te,L as ne,Nt as re,On as o,Pn as s,Pr as c,Qr as l,R as ie,Tn as u,W as d,Y as ae,Zn as f,br as p,cr as m,kn as h,nt as g,pr as _,q as v,qr as y,r as b,un as x,xn as S,yn as C,zt as w}from"./element-plus-KTmRV-so.js";import{n as T,t as E}from"./_plugin-vue_export-helper-
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,Bn as t,Dn as n,En as r,Er as i,Ht as ee,In as a,K as te,L as ne,Nt as re,On as o,Pn as s,Pr as c,Qr as l,R as ie,Tn as u,W as d,Y as ae,Zn as f,br as p,cr as m,kn as h,nt as g,pr as _,q as v,qr as y,r as b,un as x,xn as S,yn as C,zt as w}from"./element-plus-KTmRV-so.js";import{n as T,t as E}from"./_plugin-vue_export-helper-C-YBnnP5.js";import{t as D}from"./SvgIcon-BVCbrPws.js";import{t as O}from"./IconButton-pqSYKRT8.js";import{t as k}from"./gitStore-BJbNtjxA.js";import{t as A}from"./CommonDialog-B8XOXtz_.js";t(),_(),c(),x();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(a({__name:`BranchSelector`,emits:[`branchChanged`],setup(t,{emit:a}){let c=k(),_=a,x=p(!1),E=p(``),J=u(()=>{let e=E.value.trim().toLowerCase();return e?c.allBranches.filter(t=>t.toLowerCase().includes(e)):c.allBranches});async function ce(e){if(e===c.currentBranch){x.value=!1;return}x.value=!1,await c.changeBranch(e)&&(_(`branchChanged`),c.refreshLog())}let Y=p(!1),X=p(``),Z=p(``);function le(){x.value=!1,Z.value=c.currentBranch,Y.value=!0}async function Q(){await c.createBranch(X.value,Z.value)&&(Y.value=!1,X.value=``,_(`branchChanged`))}let $=p(!1);async function ue(){if(!$.value){$.value=!0;try{await Promise.all([c.getCurrentBranch(!0),c.getBranchStatus(!0),c.getAllBranches()]),_(`branchChanged`),c.refreshLog()}finally{$.value=!1}}}return(t,a)=>{let u=ae,p=d,_=b,k=v,de=ne,fe=ie,pe=te;return i(c).currentBranch?(f(),h(`div`,j,[r(`div`,M,[s(_,{visible:x.value,"onUpdate:visible":a[1]||=e=>x.value=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:a[2]||=e=>E.value=``},{reference:m(()=>[r(`button`,N,[s(D,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),r(`span`,P,l(i(c).currentBranch),1),r(`span`,F,[s(u,null,{default:m(()=>[...a[7]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.776a29.12 29.12 0 0 0 0-41.6 30.592 30.592 0 0 0-42.752 0z`})],-1)]]),_:1})])])]),default:m(()=>[r(`div`,I,[r(`div`,L,[s(p,{modelValue:E.value,"onUpdate:modelValue":a[0]||=e=>E.value=e,placeholder:i(T)(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),r(`div`,R,[(f(!0),h(S,null,e(J.value,e=>(f(),h(`div`,{key:e,class:y([`branch-item`,{"is-active":e===i(c).currentBranch}]),onClick:t=>ce(e)},[e===i(c).currentBranch?(f(),n(u,{key:0,class:`branch-item-check`},{default:m(()=>[s(i(g))]),_:1})):(f(),h(`span`,B)),s(D,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),r(`span`,V,l(e),1)],10,z))),128)),J.value.length===0?(f(),h(`div`,oe,l(i(T)(`@F13B4:没有匹配的分支`)),1)):o(``,!0)]),r(`div`,H,[r(`button`,{class:`branch-create-btn`,onClick:le},[s(u,null,{default:m(()=>[s(i(w))]),_:1}),r(`span`,null,l(i(T)(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),s(O,{tooltip:i(T)(`@CMDCON:刷新`),onClick:ue},{default:m(()=>[s(u,{class:y({"is-loading":$.value})},{default:m(()=>[s(i(ee))]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),s(A,{modelValue:Y.value,"onUpdate:modelValue":a[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:m(()=>[r(`div`,K,[r(`div`,q,[r(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:a[5]||=e=>Y.value=!1},l(i(T)(`@F13B4:取消`)),1),r(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:Q,disabled:i(c).isCreatingBranch},[i(c).isCreatingBranch?(f(),n(u,{key:1,class:`is-loading`},{default:m(()=>[...a[8]||=[r(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z`})],-1)]]),_:1})):(f(),n(u,{key:0},{default:m(()=>[s(i(g))]),_:1})),r(`span`,null,l(i(T)(`@F13B4:创建`)),1)],8,se)])])]),default:m(()=>[r(`div`,U,[s(pe,{model:{newBranchName:X.value,selectedBaseBranch:Z.value},"label-position":`top`},{default:m(()=>[s(k,null,{label:m(()=>[r(`div`,W,[s(u,{class:`label-icon`},{default:m(()=>[s(i(w))]),_:1}),r(`span`,null,l(i(T)(`@F13B4:新分支名称`)),1)])]),default:m(()=>[s(p,{modelValue:X.value,"onUpdate:modelValue":a[3]||=e=>X.value=e,placeholder:i(T)(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:C(Q,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),s(k,null,{label:m(()=>[r(`div`,G,[s(u,{class:`label-icon`},{default:m(()=>[s(i(re))]),_:1}),r(`span`,null,l(i(T)(`@F13B4:基于分支`)),1)])]),default:m(()=>[s(fe,{modelValue:Z.value,"onUpdate:modelValue":a[4]||=e=>Z.value=e,placeholder:i(T)(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:m(()=>[(f(!0),h(S,null,e(i(c).allBranches,e=>(f(),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`])])):o(``,!0)}}}),[[`__scopeId`,`data-v-665171bc`]]);export{J as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{$ as e,$n as t,At as n,B as r,Bn as i,Bt as a,C as o,Cn as s,D as c,Dn as l,Dt as u,E as d,En as f,Er as p,G as m,Gt as h,H as g,Ht as _,In as v,J as y,K as b,L as x,N as S,Nn as C,Nt as w,On as T,P as E,Pn as D,Pr as O,Qr as k,R as A,S as j,T as M,Tn as N,W as ee,Wt as P,X as te,Xn as F,Y as I,Yn as ne,Yr as L,Zn as R,a as z,bn as re,br as B,cn as ie,cr as V,ct as H,gt as ae,ht as U,i as oe,kn as W,lr as se,lt as ce,nt as le,o as G,or as ue,ot as de,pr as K,q as fe,qr as q,qt as J,rt as pe,st as me,tn as he,un as ge,ut as _e,v as ve,vn as ye,vr as be,w as xe,xn as Y,z as Se,zt as Ce}from"./element-plus-KTmRV-so.js";import{d as we}from"./vendor-CwZs6S_i.js";import{n as X,t as Z}from"./_plugin-vue_export-helper-nUAWISuX.js";import{t as Te}from"./IconButton-CQB_swX6.js";import{n as Ee,t as De}from"./configStore-CRYvJSvr.js";import{n as Oe,t as Q}from"./gitStore-QokQdW7C.js";import{t as ke}from"./CommonDialog-DfT04-V7.js";import{t as Ae}from"./TemplateManager-Th1ibeIh.js";import{_ as je,b as Me,g as Ne,h as Pe,m as Fe,v as Ie,y as Le}from"./index-BLO9MkBC.js";i(),K(),O();var Re={key:0},ze={key:1},Be=Z(v({__name:`StageButton`,props:{from:{default:`form`}},emits:[`click`],setup(e,{emit:t}){let n=t,i=Q(),a=De();function o(e){let t=e.replace(/\\/g,`/`);return a.lockedFiles.some(e=>{let n=e.replace(/\\/g,`/`);return t===n})}function s(){return a.lockedFiles.length!==0&&i.fileList.some(e=>[`modified`,`deleted`,`untracked`].includes(e.type)?o(e.path):!1)}let c=N(()=>i.fileList.filter(e=>[`modified`,`deleted`,`untracked`].includes(e.type)&&!o(e.path)).length),u=N(()=>i.fileList.some(e=>[`modified`,`deleted`,`untracked`].includes(e.type)&&!o(e.path))),d=N(()=>i.isSelectionMode&&i.hasSelectableFiles),f=N(()=>i.selectedUnstagedPaths.length),h=N(()=>i.isSelectionMode?f.value===0:!u.value),g=N(()=>d.value?`${X(`@29974:暂存所选 `)}${f.value}${X(`@29974: 个文件`)}`:u.value?s()?`${X(`@29974:暂存`)}${c.value}${X(`@29974:个未暂存文件(逐个添加)`)}`:`${X(`@29974:暂存所有更改(git add .)`)}`:X(`@29974:没有需要暂存的更改`));async function _(){n(`click`);try{if(d.value){await i.stageFiles(i.selectedUnstagedPaths);return}if(i.isSelectionMode)return;s()?await i.addToStage():await i.addAllToStage()}catch(e){console.error(`添加文件失败:`,e)}}return(t,n)=>{let a=r,o=m;return R(),l(o,{content:g.value,placement:`top`},{default:V(()=>[D(a,{type:`primary`,icon:p(Ce),onClick:_,loading:p(i).isAddingFiles,disabled:h.value,class:q([`stage-button`,`from-${e.from}`,{"is-selective":d.value}])},{default:V(()=>[C(k(d.value?p(X)(`@29974:暂存所选`):p(X)(`@29974:暂存`))+` `,1),d.value?(R(),W(`span`,Re,`(`+k(f.value)+`)`,1)):c.value>0?(R(),W(`span`,ze,`(`+k(c.value)+`)`,1)):T(``,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`class`])]),_:1},8,[`content`])}}}),[[`__scopeId`,`data-v-22060f7f`]]);i(),K(),O();var Ve={key:0},He=Z(v({__name:`CommitButton`,props:{from:{default:`form`},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1}},emits:[`click`,`beforeCommit`,`afterCommit`],setup(e,{emit:t}){let i=e,a=t,o=Q(),s=De(),c=N(()=>o.fileList.filter(e=>e.type===`added`&&!Me(e.path,s.lockedFiles)).length),u=N(()=>c.value>0),d=N(()=>o.hasConflictedFiles||o.isCommiting?!0:o.isMergeInProgress?!i.hasUserCommitMessage:!u.value||!i.hasUserCommitMessage),f=N(()=>o.isCommiting?X(`@76A11:正在提交中…`):o.hasConflictedFiles?X(`@76A11:存在冲突文件,请先解决冲突`):o.isMergeInProgress?i.hasUserCommitMessage?X(`@76A11:提交并完成合并`):X(`@76A11:请输入提交信息`):u.value?i.hasUserCommitMessage?`${X(`@76A11:提交`)}${c.value}${X(`@76A11:个已暂存文件`)}`:X(`@76A11:请输入提交信息`):X(`@76A11:没有已暂存的更改`)),h=N(()=>o.isCommiting?X(`@76A11:提交中…`):X(`@76A11:提交`));async function g(){if(i.finalCommitMessage.trim()){a(`beforeCommit`),a(`click`);try{let e=await o.commitChanges(i.finalCommitMessage,i.skipHooks);a(`afterCommit`,e)}catch(e){console.error(`提交失败:`,e),a(`afterCommit`,!1)}}}return(t,i)=>{let a=r,s=m;return R(),l(s,{content:f.value,placement:`top`,disabled:p(o).isCommiting},{default:V(()=>[D(a,{type:`primary`,onClick:g,icon:p(o).isCommiting?p(n):p(le),loading:p(o).isCommiting,disabled:d.value,"aria-busy":p(o).isCommiting?`true`:void 0,"aria-label":p(o).isCommiting?p(X)(`@76A11:正在提交中…`):void 0,class:q([`commit-button`,`from-${e.from}`,{"is-committing":p(o).isCommiting}])},{default:V(()=>[C(k(h.value)+` `,1),c.value>0&&!p(o).isCommiting?(R(),W(`span`,Ve,`(`+k(c.value)+`)`,1)):T(``,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`aria-busy`,`aria-label`,`class`])]),_:1},8,[`content`,`disabled`])}}}),[[`__scopeId`,`data-v-6bd86c7e`]]);i(),K(),O();var Ue={class:`push-progress-container`},We={key:0,class:`pulling-section`},Ge={class:`pulling-text-wrap`},Ke={class:`pulling-title`},qe={class:`pulling-sub`},Je={class:`stage-header`},Ye={class:`stage-icon`},Xe={class:`stage-info`},Ze={class:`stage-label`},Qe={key:0,class:`stage-percent`},$e={key:0,class:`stage-progress`},et={key:2,class:`error-section`},tt={class:`error-header`},nt={class:`error-title`},rt={class:`error-content`},it={key:0,class:`error-suggestion`},at={key:3,class:`messages-section`},ot={class:`messages-title`},st=Z(v({__name:`PushProgressModal`,props:{modelValue:{type:Boolean}},emits:[`update:modelValue`,`complete`,`pull-requested`],setup(e,{expose:i,emit:a}){let{t:o}=we(),s=e,u=a,d=De(),m=Q(),h=B(`progress`),g=B([]),_=B(``),v=B(!1),y=N(()=>_.value.includes(`non-fast-forward`)||_.value.includes(`rejected`)&&_.value.includes(`fetch first`)),b=B(!1);async function x(){b.value=!0;try{(await m.gitPull()).success&&(O.value=!1,u(`pull-requested`))}finally{b.value=!1}}let S=be([{name:`counting`,label:o(`@PUSH:计数对象`),status:`wait`,percent:0},{name:`compressing`,label:o(`@PUSH:压缩对象`),status:`wait`,percent:0},{name:`writing`,label:o(`@PUSH:写入对象`),status:`wait`,percent:0},{name:`resolving`,label:o(`@PUSH:解析增量`),status:`wait`,percent:0}]),w=B(0),E=B(null),O=N({get:()=>s.modelValue,set:e=>u(`update:modelValue`,e)}),A=N(()=>{if(v.value)return o(`@PUSH:正在拉取远程更新`);switch(h.value){case`progress`:return o(`@PUSH:正在推送`);case`success`:return o(`@PUSH:推送成功`);case`error`:return o(`@PUSH:推送失败`);default:return``}});function j(e){switch(e.type){case`progress`:e.message&&(g.value.push(e.message),setTimeout(()=>{E.value&&(E.value.scrollTop=E.value.scrollHeight)},0));break;case`stage-progress`:if(e.stage&&typeof e.percent==`number`){let t=S.findIndex(t=>t.name===e.stage);t!==-1&&(S[t].percent=e.percent,S[t].status=e.percent===100?`finish`:`process`,w.value=t,e.percent===100&&t<S.length-1&&(S[t+1].status=`wait`))}break;case`complete`:e.success?(h.value=`success`,S.forEach(e=>{(e.status===`process`||e.status===`wait`)&&(e.status=`finish`,e.percent=100)}),w.value=-1,d.autoClosePushModal?setTimeout(()=>{O.value=!1,u(`complete`,!0)},2e3):u(`complete`,!0)):(h.value=`error`,_.value=Oe(e),w.value<S.length&&(S[w.value].status=`error`),w.value=-1,u(`complete`,!1))}}function M(){h.value=`progress`,g.value=[],_.value=``,w.value=0,v.value=!1,S.forEach(e=>{e.status=`wait`,e.percent=0})}function ee(e){v.value=e}return i({handleProgress:j,reset:M,setPulling:ee}),(e,i)=>{let a=r;return R(),l(p(c),{modelValue:O.value,"onUpdate:modelValue":i[0]||=e=>O.value=e,title:A.value,width:`650px`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":h.value!==`progress`,"append-to-body":!0,"lock-scroll":!1,"destroy-on-close":``,class:q([`push-progress-dialog`,`status-${h.value}`])},{default:V(()=>[f(`div`,Ue,[v.value?(R(),W(`div`,We,[i[1]||=f(`div`,{class:`pulling-icon-wrap`},[f(`svg`,{class:`pulling-spinner`,viewBox:`0 0 50 50`},[f(`circle`,{class:`pulling-spinner-track`,cx:`25`,cy:`25`,r:`20`,fill:`none`,"stroke-width":`4`}),f(`circle`,{class:`pulling-spinner-arc`,cx:`25`,cy:`25`,r:`20`,fill:`none`,"stroke-width":`4`})])],-1),f(`div`,Ge,[f(`div`,Ke,k(p(o)(`@PUSH:正在拉取远程更新`)),1),f(`div`,qe,k(p(o)(`@PUSH:拉取完成后自动继续推送`)),1)])])):(R(),W(`div`,{key:1,class:q([`stages-section`,{"is-loading":h.value===`progress`,"is-success":h.value===`success`}])},[(R(!0),W(Y,null,t(S,(e,t)=>(R(),W(`div`,{key:e.name,class:q([`stage-item`,{active:w.value===t,finished:e.status===`finish`,error:e.status===`error`}])},[f(`div`,Je,[f(`div`,Ye,[e.status===`finish`?(R(),l(p(I),{key:0,class:`icon-finish`},{default:V(()=>[D(p(pe))]),_:1})):e.status===`error`?(R(),l(p(I),{key:1,class:`icon-error`},{default:V(()=>[D(p(me))]),_:1})):e.status===`process`?(R(),l(p(I),{key:2,class:`icon-process rotating`},{default:V(()=>[D(p(n))]),_:1})):(R(),l(p(I),{key:3,class:`icon-wait`},{default:V(()=>[D(p(n))]),_:1}))]),f(`div`,Xe,[f(`div`,Ze,k(e.label),1),e.status===`process`||e.status===`finish`?(R(),W(`div`,Qe,k(e.percent)+`% `,1)):T(``,!0)])]),e.status===`process`||e.status===`finish`?(R(),W(`div`,$e,[D(p(ve),{percentage:e.percent,"stroke-width":6,"show-text":!1,color:e.status===`finish`?`var(--color-success)`:`var(--color-primary)`},null,8,[`percentage`,`color`])])):T(``,!0)],2))),128))],2)),h.value===`error`&&_.value?(R(),W(`div`,et,[f(`div`,tt,[f(`div`,nt,k(p(o)(`@PUSH:错误详情`))+`:`,1),y.value?(R(),l(a,{key:0,type:`primary`,size:`small`,loading:b.value,onClick:x,class:`pull-button`},{default:V(()=>[D(p(I),null,{default:V(()=>[D(p(U))]),_:1}),C(` `+k(p(o)(`@PUSH:先拉取更新`)),1)]),_:1},8,[`loading`])):T(``,!0)]),f(`div`,rt,k(_.value),1),y.value?(R(),W(`div`,it,k(p(o)(`@PUSH:检测到远程有新提交,请先拉取更新后再推送。`)),1)):T(``,!0)])):T(``,!0),g.value.length>0?(R(),W(`div`,at,[f(`div`,ot,k(p(o)(`@PUSH:详细信息`))+`:`,1),f(`div`,{ref_key:`messagesContainerRef`,ref:E,class:`progress-messages`},[(R(!0),W(Y,null,t(g.value,(e,t)=>(R(),W(`div`,{key:t,class:`message-item`},k(e),1))),128))],512)])):T(``,!0)])]),_:1},8,[`modelValue`,`title`,`show-close`,`class`])}}}),[[`__scopeId`,`data-v-f26d0df8`]]);i(),K(),O();var ct={class:`push-button-group`},lt={key:0},ut={class:`push-remote-item`},dt=Z(v({__name:`PushButton`,props:{from:{default:`form`}},emits:[`click`,`beforePush`,`afterPush`],setup(e,{emit:n}){let i=n,a=Q(),s=B(!1),c=B(null),u=N(()=>a.branchAhead>0),d=N(()=>a.fileList.some(e=>e.type===`added`)),h=N(()=>!a.hasConflictedFiles&&a.hasUpstream&&u.value&&!d.value),g=N(()=>!h.value),_=N(()=>a.hasConflictedFiles?X(`@F4137:存在冲突文件,请先解决冲突`):a.hasUpstream?u.value?d.value?X(`@F4137:有未提交的暂存更改,请先提交`):`${X(`@F4137:推送`)}${a.branchAhead}${X(`@F4137:个本地提交`)}`:X(`@F4137:没有需要推送的提交`):X(`@F4137:当前分支没有上游分支`)),v=N(()=>h.value?{backgroundColor:`var(--color-success)`,borderColor:`var(--color-success)`}:{});async function y(){i(`beforePush`),i(`click`);try{s.value=!0,c.value&&c.value.reset();let e=await a.pushToRemoteWithProgress(e=>{c.value&&c.value.handleProgress(e)});e&&await new Promise(e=>setTimeout(e,200)),i(`afterPush`,e)}catch(e){console.error(`推送失败:`,e),i(`afterPush`,!1)}}function b(e){}let x=N(()=>[...a.remotes].sort((e,t)=>e.isUpstream===t.isUpstream?e.name.localeCompare(t.name):e.isUpstream?-1:1));async function S(e){if(e===`manage`){a.isRemoteManagerVisible=!0;return}if(e===`push-all`){await a.pushAllRemotes();return}if(!e.startsWith(`push:`))return;let t=e.slice(5);i(`beforePush`);try{s.value=!0,c.value?.reset();let e=await a.pushToRemoteWithProgress(e=>{c.value?.handleProgress(e)},t);i(`afterPush`,e)}catch(e){console.error(`推送失败:`,e),i(`afterPush`,!1)}}return(n,i)=>{let d=r,h=m,w=Se,E=xe,O=M,A=o;return R(),W(`div`,null,[f(`div`,ct,[D(h,{content:_.value,placement:`top`},{default:V(()=>[D(d,{type:`primary`,icon:p(he),onClick:y,loading:p(a).isPushing,disabled:g.value,style:L(v.value),class:q([`push-button`,`from-${e.from}`])},{default:V(()=>[C(k(p(X)(`@F4137:推送`))+` `,1),u.value?(R(),W(`span`,lt,`(`+k(p(a).branchAhead)+`)`,1)):T(``,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`style`,`class`])]),_:1},8,[`content`]),p(a).hasMultipleRemotes?(R(),l(A,{key:0,trigger:`click`,placement:`top-end`,onCommand:S},{dropdown:V(()=>[D(O,null,{default:V(()=>[(R(!0),W(Y,null,t(x.value,e=>(R(),l(E,{key:e.name,command:`push:${e.name}`},{default:V(()=>[f(`span`,ut,[f(`span`,null,k(p(X)(`@F4137:推送到`))+` `+k(e.name),1),e.isUpstream?(R(),l(w,{key:0,size:`small`,type:`success`,effect:`plain`},{default:V(()=>[C(k(p(X)(`@F4137:上游`)),1)]),_:1})):T(``,!0)])]),_:2},1032,[`command`]))),128)),D(E,{divided:``,command:`push-all`},{default:V(()=>[C(k(p(X)(`@F4137:推送到全部远程`)),1)]),_:1}),D(E,{divided:``,command:`manage`},{default:V(()=>[C(k(p(X)(`@F4137:管理远程…`)),1)]),_:1})]),_:1})]),default:V(()=>[D(d,{type:`primary`,icon:p(te),style:L(v.value),class:q([`push-button__caret`,`from-${e.from}`]),"aria-label":p(X)(`@F4137:更多推送选项`)},null,8,[`icon`,`style`,`class`,`aria-label`])]),_:1})):T(``,!0)]),D(st,{ref_key:`progressModalRef`,ref:c,modelValue:s.value,"onUpdate:modelValue":i[0]||=e=>s.value=e,onComplete:b},null,8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-da69033d`]]);i(),K(),O();var ft={class:`one-push-content`},pt={class:`one-push-text`},mt={class:`one-push-title`},ht={key:0,class:`one-push-desc`},gt=Z(v({__name:`QuickPushButton`,props:{from:{default:`form`},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1}},emits:[`beforePush`,`pushStart`,`afterPush`,`clearFields`],setup(e,{expose:t,emit:n}){let i=Q(),o=De(),s=B(!1),c=B(null),l=e,u=n,d=N(()=>i.fileList.some(e=>!Me(e.path,o.lockedFiles))),h=N(()=>i.isSelectionMode&&i.selectedFiles.size>0&&i.selectedUnstagedPaths.length>0),g=N(()=>i.hasConflictedFiles?!0:i.isSelectionMode?!h.value||!l.hasUserCommitMessage||!i.hasUpstream:!d.value&&i.branchAhead===0||!l.hasUserCommitMessage||!i.hasUpstream),_=N(()=>i.isAddingFiles||i.isCommiting||i.isPushing),v=N(()=>{if(i.hasConflictedFiles)return X(`@2E184:存在冲突文件,请先解决冲突`);if(i.isSelectionMode)return i.selectedFiles.size===0?X(`@2E184:请先勾选要推送的文件`):i.selectedUnstagedPaths.length===0?X(`@2E184:所选文件无需暂存或被锁定`):l.hasUserCommitMessage?i.hasUpstream?X(`@2E184:一键完成:仅暂存所选文件 → 提交 → 推送到远程仓库`):X(`@2E184:当前分支没有上游分支`):X(`@2E184:请输入提交信息`);let e=i.branchAhead>0;return!d.value&&!e?X(`@2E184:没有需要提交或推送的更改`):l.hasUserCommitMessage?i.hasUpstream?d.value?X(`@2E184:一键完成:暂存所有更改 → 提交 → 推送到远程仓库`):X(`@2E184:本地已提交,一键推送到远程仓库`):X(`@2E184:当前分支没有上游分支`):X(`@2E184:请输入提交信息`)}),y=N(()=>i.isSelectionMode&&h.value?X(`@2E184:一键推送所选`):X(`@2E184:一键推送所有`)),b=N(()=>l.from===`form`?i.isSelectionMode&&h.value?X(`@2E184:暂存所选 + 提交 + 推送`):X(`@2E184:暂存 + 提交 + 推送`):``);async function x(){u(`beforePush`);try{let e=i.isSelectionMode&&h.value;if((e||d.value)&&!(e?await i.stageSelectedAndCommit(l.finalCommitMessage,l.skipHooks):await i.addAndCommit(l.finalCommitMessage,l.skipHooks))){u(`afterPush`,!1);return}if(u(`pushStart`),s.value=!0,o.pullBeforePush){c.value?.setPulling(!0);let e=await i.gitPull();if(c.value?.setPulling(!1),!e.success){z.error(X(`@2E184:拉取远程更新失败,已停止推送`)),s.value=!1,i.fetchStatus(),i.getBranchStatus(!0),u(`afterPush`,!1);return}}c.value&&c.value.reset();let t=await i.pushToRemoteWithProgress(e=>{c.value&&c.value.handleProgress(e)});if(t){try{window.dispatchEvent(new CustomEvent(`zen-gitsync:after-quick-push-success`))}catch{}u(`clearFields`)}u(`afterPush`,t)}catch(e){console.error(`一键推送失败:`,e),u(`afterPush`,!1)}}t({triggerQuickPush:x});function S(e){}return(t,n)=>{let i=I,o=r;return R(),W(`div`,null,[D(p(m),{content:v.value,placement:`top`,"show-after":200},{default:V(()=>[D(o,{type:`primary`,onClick:x,loading:_.value,disabled:g.value,class:q([e.from,`one-push-button`])},{default:V(()=>[f(`div`,ft,[D(i,{class:`one-push-icon`},{default:V(()=>[D(p(a))]),_:1}),f(`div`,pt,[f(`span`,mt,k(y.value),1),e.from===`form`?(R(),W(`span`,ht,k(b.value),1)):T(``,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`]),D(st,{ref_key:`progressModalRef`,ref:c,modelValue:s.value,"onUpdate:modelValue":n[0]||=e=>s.value=e,onComplete:S,onPullRequested:x},null,8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-9f003c37`]]);i(),K(),O();var _t={class:`create-tag-button`},vt={class:`tag-dialog-content`},yt={class:`tag-info-card`},bt={class:`info-icon`},xt={class:`info-content`},St={class:`form-tip`},Ct={class:`form-tip`},wt={class:`form-tip`},Tt=Z(v({__name:`CreateTagButton`,props:{variant:{default:`icon`}},setup(e){let t=e,n=Q(),i=B(!1),a=B(``),o=B(``),s=B(`lightweight`),c=B(``),d=B(!1);function h(){a.value=``,o.value=``,s.value=`lightweight`,c.value=``,i.value=!0}async function g(){if(!a.value.trim()){z.warning(X(`@TAG01:请输入标签名称`));return}if(!/^[a-zA-Z0-9._\/-]+$/.test(a.value)){z.warning(X(`@TAG01:标签名称只能包含字母、数字、点、下划线、斜杠和连字符`));return}try{d.value=!0;let e=await(await fetch(`/api/create-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:a.value.trim(),message:o.value.trim(),type:s.value,commit:c.value.trim()})})).json();e.success?(z.success(X(`@TAG01:标签创建成功`)),i.value=!1):z.error(e.error||X(`@TAG01:创建标签失败`))}catch(e){console.error(`创建标签失败:`,e),z.error(X(`@TAG01:创建标签失败`))}finally{d.value=!1}}let _=N(()=>s.value===`lightweight`?X(`@TAG01:轻量标签是指向提交对象的引用,不包含额外信息`):X(`@TAG01:附注标签是完整的Git对象,包含标签信息、日期、标签者和可选的签名`));return(e,v)=>{let y=I,x=r,w=m,O=ee,A=fe,j=S,M=E,N=b;return R(),W(`div`,_t,[D(w,{content:p(X)(`@TAG01:为当前提交创建标签`),placement:`top`,"show-after":200,disabled:t.variant===`text`},{default:V(()=>[D(x,{type:`success`,onClick:h,disabled:!p(n).isGitRepo,circle:t.variant===`icon`,size:t.variant===`icon`?`small`:`default`,class:q(t.variant===`text`?`action-button`:``)},{default:V(()=>[t.variant===`icon`?(R(),l(y,{key:0},{default:V(()=>[D(p(J))]),_:1})):(R(),W(Y,{key:1},[C(k(p(X)(`@TAG01:创建标签`)),1)],64))]),_:1},8,[`disabled`,`circle`,`size`,`class`])]),_:1},8,[`content`,`disabled`]),D(ke,{modelValue:i.value,"onUpdate:modelValue":v[4]||=e=>i.value=e,title:p(X)(`@TAG01:创建 Git 标签`),size:`medium`,"close-on-click-modal":!1,"show-footer":``,"confirm-text":p(X)(`@TAG01:创建`),"cancel-text":p(X)(`@TAG01:取消`),"confirm-loading":d.value,"custom-class":`tag-dialog`,onConfirm:g},{default:V(()=>[f(`div`,vt,[f(`div`,yt,[f(`div`,bt,[D(y,null,{default:V(()=>[D(p(J))]),_:1})]),f(`div`,xt,[f(`h4`,null,k(p(X)(`@TAG01:Git 标签`)),1),f(`p`,null,k(p(X)(`@TAG01:标签用于标记项目的重要版本点,如发布版本 v1.0.0`)),1)])]),D(N,{"label-position":`top`,class:`tag-form`},{default:V(()=>[D(A,{label:p(X)(`@TAG01:标签名称`),required:``},{default:V(()=>[D(O,{modelValue:a.value,"onUpdate:modelValue":v[0]||=e=>a.value=e,placeholder:p(X)(`@TAG01:例如: v1.0.0 或 release-2024`),clearable:``,maxlength:`100`},{prefix:V(()=>[D(y,null,{default:V(()=>[D(p(J))]),_:1})]),_:1},8,[`modelValue`,`placeholder`]),f(`div`,St,[D(y,null,{default:V(()=>[D(p(u))]),_:1}),f(`span`,null,k(p(X)(`@TAG01:建议使用语义化版本号,如 v1.0.0`)),1)])]),_:1},8,[`label`]),D(A,{label:p(X)(`@TAG01:标签类型`)},{default:V(()=>[D(M,{modelValue:s.value,"onUpdate:modelValue":v[1]||=e=>s.value=e,size:`default`},{default:V(()=>[D(j,{value:`lightweight`},{default:V(()=>[C(k(p(X)(`@TAG01:轻量标签`)),1)]),_:1}),D(j,{value:`annotated`},{default:V(()=>[C(k(p(X)(`@TAG01:附注标签`)),1)]),_:1})]),_:1},8,[`modelValue`]),f(`div`,Ct,[D(y,null,{default:V(()=>[D(p(u))]),_:1}),f(`span`,null,k(_.value),1)])]),_:1},8,[`label`]),s.value===`annotated`?(R(),l(A,{key:0,label:p(X)(`@TAG01:标签说明`),required:s.value===`annotated`},{default:V(()=>[D(O,{modelValue:o.value,"onUpdate:modelValue":v[2]||=e=>o.value=e,placeholder:p(X)(`@TAG01:为此标签添加说明信息`),clearable:``,rows:3,type:`textarea`,resize:`none`,maxlength:`500`,"show-word-limit":``},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`,`required`])):T(``,!0),D(A,{label:p(X)(`@TAG01:目标提交(可选)`)},{default:V(()=>[D(O,{modelValue:c.value,"onUpdate:modelValue":v[3]||=e=>c.value=e,placeholder:p(X)(`@TAG01:留空则为当前HEAD,或输入commit SHA`),clearable:``,maxlength:`40`},{prefix:V(()=>[...v[5]||=[f(`span`,{class:`commit-prefix`},`commit:`,-1)]]),_:1},8,[`modelValue`,`placeholder`]),f(`div`,wt,[D(y,null,{default:V(()=>[D(p(u))]),_:1}),f(`span`,null,k(p(X)(`@TAG01:默认为当前HEAD提交,也可以指定历史提交`)),1)])]),_:1},8,[`label`])]),_:1})])]),_:1},8,[`modelValue`,`title`,`confirm-text`,`cancel-text`,`confirm-loading`])])}}}),[[`__scopeId`,`data-v-cbbcdcda`]]);i(),K(),O();var Et={class:`tag-list-button`},Dt={class:`tag-list-content`},Ot={key:0,class:`tag-header`},kt={class:`tag-stats`},At={class:`stat-item`},jt={class:`stat-number`},Mt={class:`stat-label`},Nt={class:`tag-actions-header`},Pt={class:`tag-list-container`},Ft={key:0,class:`empty-state`},It={class:`empty-text`},Lt={class:`empty-hint`},Rt={key:1,class:`tag-cards`},zt={class:`tag-card-content`},Bt={class:`tag-info`},Vt={class:`tag-main-info`},Ht={class:`tag-name-badge`},Ut={class:`tag-name-text`},Wt={class:`tag-meta`},Gt={class:`tag-commit`},Kt={class:`tag-date`},qt={key:0,class:`tag-message`},Jt={class:`tag-card-actions`},Yt={key:0,class:`tag-detail-content`},Xt={class:`detail-row`},Zt={class:`detail-label`},Qt={class:`detail-value`},$t={class:`detail-row`},en={class:`detail-label`},tn={class:`detail-value`},nn={class:`detail-row`},rn={class:`detail-label`},an={class:`detail-value`},on={class:`detail-row`},sn={class:`detail-label`},cn={key:0,class:`detail-row detail-message`},ln={class:`detail-label`},un={class:`message-content`},dn=Z(v({__name:`TagListButton`,props:{variant:{default:`icon`}},setup(e){let n=e,i=Q(),a=B(!1),o=B([]),s=B(!1),c=B(!1),d=B(!1),h=B(!1),g=B(null);async function v(){a.value=!0,await y()}async function y(){try{s.value=!0;let e=await(await fetch(`/api/list-tags`)).json();e.success?o.value=e.tags||[]:z.error(e.error||X(`@TAG01:获取标签列表失败`))}catch(e){console.error(`获取标签列表失败:`,e),z.error(X(`@TAG01:获取标签列表失败`))}finally{s.value=!1}}function b(e){g.value=e,h.value=!0}async function x(e){oe.confirm(X(`@TAG01:确定要推送此标签到远程仓库吗?`),X(`@TAG01:推送标签`),{confirmButtonText:X(`@TAG01:推送`),cancelButtonText:X(`@TAG01:取消`),type:`info`}).then(async()=>{try{d.value=!0;let t=await(await fetch(`/api/push-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:e})})).json();t.success?z.success(X(`@TAG01:标签推送成功`)):z.error(t.error||X(`@TAG01:推送标签失败`))}catch(e){console.error(`推送标签失败:`,e),z.error(X(`@TAG01:推送标签失败`))}finally{d.value=!1}}).catch(()=>{})}async function S(){oe.confirm(X(`@TAG01:确定要推送所有标签到远程仓库吗?`),X(`@TAG01:推送所有标签`),{confirmButtonText:X(`@TAG01:推送`),cancelButtonText:X(`@TAG01:取消`),type:`info`}).then(async()=>{try{d.value=!0;let e=await(await fetch(`/api/push-all-tags`,{method:`POST`})).json();e.success?z.success(X(`@TAG01:所有标签推送成功`)):z.error(e.error||X(`@TAG01:推送标签失败`))}catch(e){console.error(`推送标签失败:`,e),z.error(X(`@TAG01:推送标签失败`))}finally{d.value=!1}}).catch(()=>{})}async function w(e){oe.confirm(X(`@TAG01:确定要删除此标签吗?此操作不可恢复。`),X(`@TAG01:删除标签`),{confirmButtonText:X(`@TAG01:删除`),cancelButtonText:X(`@TAG01:取消`),type:`warning`}).then(async()=>{await E(e)}).catch(()=>{})}async function E(e){try{c.value=!0;let t=await(await fetch(`/api/delete-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:e})})).json();t.success?(z.success(X(`@TAG01:标签删除成功`)),await y()):z.error(t.error||X(`@TAG01:删除标签失败`))}catch(e){console.error(`删除标签失败:`,e),z.error(X(`@TAG01:删除标签失败`))}finally{c.value=!1}}function O(e){if(!e)return`-`;try{return new Date(e).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}catch{return e}}return(e,E)=>{let A=I,M=r,N=m,ee=j,P=Se,te=G;return R(),W(`div`,Et,[D(N,{content:p(X)(`@TAG01:查看和管理所有标签`),placement:`top`,"show-after":200,disabled:n.variant===`text`},{default:V(()=>[D(M,{type:`info`,onClick:v,disabled:!p(i).isGitRepo,circle:n.variant===`icon`,size:n.variant===`icon`?`small`:`default`,class:q(n.variant===`text`?`action-button`:``)},{default:V(()=>[n.variant===`icon`?(R(),l(A,{key:0},{default:V(()=>[D(p(J))]),_:1})):(R(),W(Y,{key:1},[C(k(p(X)(`@TAG01:标签列表`)),1)],64))]),_:1},8,[`disabled`,`circle`,`size`,`class`])]),_:1},8,[`content`,`disabled`]),D(ke,{modelValue:a.value,"onUpdate:modelValue":E[0]||=e=>a.value=e,title:p(X)(`@TAG01:Git 标签列表`),size:`large`,"show-footer":!1,"custom-class":`tag-list-dialog`},{default:V(()=>[f(`div`,Dt,[s.value?T(``,!0):(R(),W(`div`,Ot,[f(`div`,kt,[f(`div`,At,[D(A,{class:`stat-icon`},{default:V(()=>[D(p(J))]),_:1}),f(`span`,jt,k(o.value.length),1),f(`span`,Mt,k(p(X)(`@TAG01:个标签`)),1)])]),f(`div`,Nt,[D(M,{type:`primary`,size:`small`,icon:p(_),onClick:y,loading:s.value,class:`refresh-btn`},{default:V(()=>[C(k(p(X)(`@TAG01:刷新`)),1)]),_:1},8,[`icon`,`loading`]),o.value.length>0?(R(),l(M,{key:0,type:`success`,size:`small`,icon:p(he),onClick:S,loading:d.value,class:`push-all-btn`},{default:V(()=>[C(k(p(X)(`@TAG01:推送所有标签`)),1)]),_:1},8,[`icon`,`loading`])):T(``,!0)])])),se((R(),W(`div`,Pt,[o.value.length===0&&!s.value?(R(),W(`div`,Ft,[D(ee,{description:p(X)(`@TAG01:暂无标签`),"image-size":120},{image:V(()=>[D(A,{class:`empty-icon`},{default:V(()=>[D(p(J))]),_:1})]),description:V(()=>[f(`p`,It,k(p(X)(`@TAG01:还没有创建任何标签`)),1),f(`p`,Lt,k(p(X)(`@TAG01:使用创建标签功能为项目添加版本标记`)),1)]),_:1},8,[`description`])])):(R(),W(`div`,Rt,[(R(!0),W(Y,null,t(o.value,e=>(R(),W(`div`,{key:e.name,class:`tag-card`},[f(`div`,zt,[f(`div`,Bt,[f(`div`,Vt,[f(`div`,Ht,[D(A,{class:`badge-icon`},{default:V(()=>[D(p(J))]),_:1}),f(`span`,Ut,k(e.name),1),D(P,{size:`small`,type:e.type===`annotated`?`warning`:`info`,class:`type-tag`},{default:V(()=>[C(k(e.type===`annotated`?p(X)(`@TAG01:附注`):p(X)(`@TAG01:轻量`)),1)]),_:2},1032,[`type`])]),f(`div`,Wt,[f(`span`,Gt,[D(A,null,{default:V(()=>[D(p(u))]),_:1}),C(` `+k(e.commit.substring(0,8)),1)]),f(`span`,Kt,k(O(e.date)),1)]),e.message?(R(),W(`div`,qt,k(e.message),1)):T(``,!0)])]),f(`div`,Jt,[e.message?(R(),l(M,{key:0,size:`small`,type:`info`,onClick:t=>b(e),class:`action-btn view-btn`},{default:V(()=>[C(k(p(X)(`@TAG01:查看`)),1)]),_:1},8,[`onClick`])):T(``,!0),D(M,{size:`small`,type:`success`,icon:p(he),onClick:t=>x(e.name),loading:d.value,class:`action-btn push-btn`},{default:V(()=>[C(k(p(X)(`@TAG01:推送`)),1)]),_:1},8,[`icon`,`onClick`,`loading`]),D(M,{size:`small`,type:`danger`,icon:p(_e),onClick:t=>w(e.name),loading:c.value,class:`action-btn delete-btn`},{default:V(()=>[C(k(p(X)(`@TAG01:删除`)),1)]),_:1},8,[`icon`,`onClick`,`loading`])])])]))),128))]))])),[[te,s.value]])])]),_:1},8,[`modelValue`,`title`]),D(ke,{modelValue:h.value,"onUpdate:modelValue":E[1]||=e=>h.value=e,title:p(X)(`@TAG01:标签详情`),size:`medium`,"show-footer":!1,"custom-class":`tag-detail-dialog`},{default:V(()=>[g.value?(R(),W(`div`,Yt,[f(`div`,Xt,[f(`span`,Zt,k(p(X)(`@TAG01:标签名称:`)),1),f(`code`,Qt,k(g.value.name),1)]),f(`div`,$t,[f(`span`,en,k(p(X)(`@TAG01:提交SHA:`)),1),f(`code`,tn,k(g.value.commit),1)]),f(`div`,nn,[f(`span`,rn,k(p(X)(`@TAG01:创建时间:`)),1),f(`span`,an,k(O(g.value.date)),1)]),f(`div`,on,[f(`span`,sn,k(p(X)(`@TAG01:类型:`)),1),D(P,{type:g.value.type===`annotated`?`warning`:`info`,size:`small`},{default:V(()=>[C(k(g.value.type===`annotated`?p(X)(`@TAG01:附注标签`):p(X)(`@TAG01:轻量标签`)),1)]),_:1},8,[`type`])]),g.value.message?(R(),W(`div`,cn,[f(`span`,ln,k(p(X)(`@TAG01:标签说明:`)),1),f(`div`,un,k(g.value.message),1)])):T(``,!0)])):T(``,!0)]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-fc8d7e86`]]);i(),K(),O();var fn={class:`git-operations-button`},pn={class:`actions-section`},mn={class:`action-groups`},hn={class:`action-group`},gn={class:`group-title`},_n={class:`group-buttons`},vn={key:0},yn={class:`action-group`},bn={class:`group-title`},xn={class:`group-buttons`},Sn={class:`action-group`},Cn={class:`group-title`},wn={class:`group-buttons`},Tn={key:0},En={class:`action-group`},Dn={class:`group-title`},On={class:`group-buttons`},kn={class:`action-group`},An={class:`group-title`},jn={class:`group-buttons`},Mn={class:`action-group`},Nn={class:`group-title`},Pn={class:`group-buttons`},Fn={class:`pull-error-content`},In={key:0},Ln={key:1},Rn={class:`pull-error-detail`},zn={class:`pull-error-label`},Bn={class:`pull-error-pre`},Vn=Z(v({__name:`GitOperationsButton`,props:{variant:{default:`icon`},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1}},emits:[`afterCommit`,`afterPush`,`beforePush`,`clearFields`],setup(e,{expose:t,emit:n}){let i=e,a=n,o=Q(),s=B(!1),c=B(!1),h=B({needsMerge:!1,error:``,fullError:``,pullOutput:``});function g(){s.value=!0}let _=N(()=>o.fileList.filter(e=>e.type===`added`).length),v=N(()=>o.branchBehind>0),y=N(()=>o.fileList.some(e=>[`modified`,`deleted`,`untracked`,`intent-to-add`].includes(e.type)));async function b(){try{let e=await o.gitPull();e.success?(await o.fetchStatus(),await o.fetchLog(!1)):(h.value={needsMerge:e.needsMerge,error:e.error,fullError:e.fullError,pullOutput:e.pullOutput},c.value=!0)}catch(e){console.error(`拉取失败:`,e)}}async function x(){try{await o.gitFetchAll(),await o.fetchStatus(),await o.fetchLog(!1)}catch(e){console.error(`获取远程分支失败:`,e)}}async function S(){if(i.hasUserCommitMessage)try{await o.addAndCommit(i.finalCommitMessage,i.skipHooks),o.fetchStatus(),o.fetchLog(),a(`afterCommit`,!0),a(`clearFields`)}catch(e){console.error(`暂存并提交失败:`,e)}}function E(){a(`beforePush`)}function O(e){a(`afterPush`,e)}function A(){a(`clearFields`)}return t({openGitOperationsDrawer:g}),(t,n)=>{let j=I,M=r,N=m,ee=d;return R(),W(`div`,fn,[i.variant===`icon`?(R(),l(Te,{key:0,tooltip:p(X)(`@F13B4:Git 操作`),size:`large`,"custom-class":`btn-rotate-on-hover`,onClick:g},{default:V(()=>[D(j,null,{default:V(()=>[D(p(w))]),_:1})]),_:1},8,[`tooltip`])):(R(),l(M,{key:1,type:`primary`,class:`action-button`,onClick:g},{default:V(()=>[C(k(p(X)(`@F13B4:Git 操作`)),1)]),_:1})),D(ee,{modelValue:s.value,"onUpdate:modelValue":n[2]||=e=>s.value=e,title:p(X)(`@76872:Git 操作`),direction:`rtl`,size:`362px`,"with-header":!0,"show-close":!0,"destroy-on-close":!1,"append-to-body":!0,class:`git-operations-drawer`},{default:V(()=>[f(`div`,pn,[f(`div`,mn,[f(`div`,hn,[f(`div`,gn,k(p(X)(`@76872:基础操作`)),1),f(`div`,_n,[D(Be,{onClick:()=>{},from:`drawer`}),D(Pe,{onClick:()=>{},from:`drawer`}),D(He,{"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforeCommit:()=>{},onAfterCommit:n[0]||=e=>a(`afterCommit`,e),onClick:()=>{},from:`drawer`},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),D(dt,{onBeforePush:()=>{},onAfterPush:n[1]||=e=>a(`afterPush`,e),onClick:()=>{},from:`drawer`}),D(N,{content:p(o).hasConflictedFiles?p(X)(`@76872:存在冲突文件,请先解决冲突`):v.value?`${p(X)(`@76872:拉取`)}${p(o).branchBehind}${p(X)(`@76872:个远程提交`)}`:`git pull`,placement:`top`},{default:V(()=>[D(M,{type:`primary`,icon:p(U),onClick:b,loading:p(o).isGitPulling,disabled:!p(o).hasUpstream||p(o).hasConflictedFiles,class:`action-button`,style:L(p(o).hasUpstream&&!p(o).hasConflictedFiles?{color:`white`,backgroundColor:`#1e90ff`,borderColor:`#1e90ff`}:{})},{default:V(()=>[C(k(p(X)(`@76872:拉取`))+` `,1),v.value?(R(),W(`span`,vn,`(`+k(p(o).branchBehind)+`)`,1)):T(``,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`style`])]),_:1},8,[`content`]),D(N,{content:`git fetch --all`,placement:`top`},{default:V(()=>[D(M,{type:`info`,icon:p(H),onClick:x,loading:p(o).isGitFetching,class:`action-button`,style:{color:`white`,"background-color":`#1e90ff`,"border-color":`#1e90ff`}},{default:V(()=>[C(k(p(X)(`@76872:获取所有远程分支`)),1)]),_:1},8,[`icon`,`loading`])]),_:1})])]),f(`div`,yn,[f(`div`,bn,k(p(X)(`@76872:组合操作`)),1),f(`div`,xn,[D(N,{content:p(o).hasConflictedFiles?p(X)(`@76872:存在冲突文件,请先解决冲突`):`git add + git commit`,placement:`top`},{default:V(()=>[D(M,{type:`primary`,icon:p(ae),onClick:S,loading:p(o).isAddingFiles||p(o).isCommiting,disabled:!y.value||!e.hasUserCommitMessage||p(o).hasConflictedFiles,class:`action-button`},{default:V(()=>[C(k(p(X)(`@76872:暂存并提交`)),1)]),_:1},8,[`icon`,`loading`,`disabled`])]),_:1},8,[`content`]),D(gt,{from:`drawer`,"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforePush:E,onAfterPush:O,onClearFields:A},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`])])]),f(`div`,Sn,[f(`div`,Cn,k(p(X)(`@76872:重置操作`)),1),f(`div`,wn,[D(N,{content:_.value>0?`${p(X)(`@76872:撤销`)}${_.value}${p(X)(`@76872:个已暂存文件`)}`:`git reset HEAD`,placement:`top`},{default:V(()=>[D(M,{type:`warning`,icon:p(P),onClick:p(o).resetHead,loading:p(o).isResetting,disabled:_.value===0||p(o).hasConflictedFiles,class:`action-button reset-button`},{default:V(()=>[C(k(p(X)(`@76872:重置暂存区`))+` `,1),_.value>0?(R(),W(`span`,Tn,`(`+k(_.value)+`)`,1)):T(``,!0)]),_:1},8,[`icon`,`onClick`,`loading`,`disabled`])]),_:1},8,[`content`]),D(Fe,{variant:`text`})])]),f(`div`,En,[f(`div`,Dn,k(p(X)(`@76872:分支操作`)),1),f(`div`,On,[D(Ne,{variant:`text`})])]),f(`div`,kn,[f(`div`,An,k(p(X)(`@76872:储藏操作`)),1),f(`div`,jn,[D(Le,{variant:`text`}),D(Ie,{variant:`text`})])]),f(`div`,Mn,[f(`div`,Nn,k(p(X)(`@TAG01:标签操作`)),1),f(`div`,Pn,[D(Tt,{variant:`text`}),D(dn,{variant:`text`})])])])])]),_:1},8,[`modelValue`,`title`]),D(ke,{modelValue:c.value,"onUpdate:modelValue":n[3]||=e=>c.value=e,title:h.value.needsMerge?p(X)(`@76872:需要合并更改`):p(X)(`@76872:拉取失败`),size:`medium`,"show-footer":!0,"show-cancel":!1,"confirm-text":p(X)(`@76872:我知道了`),"append-to-body":!0,onConfirm:n[4]||=e=>c.value=!1},{default:V(()=>[f(`div`,Fn,[f(`div`,{class:q([`pull-error-type`,h.value.needsMerge?`is-warning`:`is-error`])},[D(j,{class:`pull-error-icon`},{default:V(()=>[D(p(u))]),_:1}),h.value.needsMerge?(R(),W(`span`,In,k(p(X)(`@76872:本地存在未提交的更改,与远程内容冲突,请先处理本地更改后再拉取。`)),1)):(R(),W(`span`,Ln,k(p(X)(`@76872:执行 git pull 时发生错误,请查看详细信息。`)),1))],2),f(`div`,Rn,[f(`div`,zn,k(p(X)(`@76872:错误详情`))+`:`,1),f(`pre`,Bn,k(h.value.fullError||h.value.error),1)])])]),_:1},8,[`modelValue`,`title`,`confirm-text`])])}}}),[[`__scopeId`,`data-v-f75259bd`]]);i(),O(),ge();var Hn={class:`loading-container`},Un={class:`loading-text`},Wn={key:0,class:`loading-progress`},Gn=v({__name:`GlobalLoading`,props:{visible:{type:Boolean,default:!1},text:{default:X(`@2AEBA:加载中...`)},showProgress:{type:Boolean,default:!1},progress:{default:0},mock:{type:Boolean,default:!1}},setup(e){return(t,n)=>(R(),l(s,{to:`body`},[D(ie,{name:`loading-fade`},{default:V(()=>[e.visible||e.mock?(R(),W(`div`,{key:0,class:`global-loading-overlay`,onClick:n[0]||=re(()=>{},[`stop`])},[f(`div`,Hn,[n[1]||=f(`div`,{class:`loading-spinner`},[f(`div`,{class:`spinner-ring`}),f(`div`,{class:`spinner-ring`}),f(`div`,{class:`spinner-ring`})],-1),f(`div`,Un,k(e.text),1),e.showProgress||e.mock?(R(),W(`div`,Wn,[f(`div`,{class:q([`progress-bar`,{"is-mock":e.mock&&!e.showProgress}]),style:L(e.showProgress?{width:e.progress+`%`}:void 0)},null,6)])):T(``,!0)])])):T(``,!0)]),_:1})]))}}),Kn=Z(Gn,[[`__scopeId`,`data-v-6d13a220`]]);i(),O(),ge();var qn={class:`success-container`},Jn={class:`success-text`},Yn={key:0,class:`success-description`},Xn=v({__name:`SuccessModal`,props:{visible:{type:Boolean,default:!1},text:{default:X(`@71545:操作成功!`)},description:{default:``}},setup(e){return(t,n)=>(R(),l(s,{to:`body`},[D(ie,{name:`success-fade`},{default:V(()=>[e.visible?(R(),W(`div`,{key:0,class:`success-overlay`,onClick:n[0]||=re(()=>{},[`stop`])},[f(`div`,qn,[n[1]||=f(`div`,{class:`success-icon`},[f(`svg`,{viewBox:`0 0 52 52`,class:`success-svg`},[f(`circle`,{class:`success-circle`,cx:`26`,cy:`26`,r:`25`,fill:`none`}),f(`path`,{class:`success-check`,fill:`none`,d:`m14.1 27.2l7.1 7.2 16.7-16.8`})])],-1),f(`div`,Jn,k(e.text),1),e.description?(R(),W(`div`,Yn,k(e.description),1)):T(``,!0)])])):T(``,!0)]),_:1})]))}}),Zn=Z(Xn,[[`__scopeId`,`data-v-c10f43b3`]]);K();var $=be({visible:!1,text:X(`@F2A3A:加载中...`),showProgress:!1,progress:0});function Qn(){return{loadingState:$,show:e=>{$.visible=!0,$.text=e?.text||X(`@F2A3A:加载中...`),$.showProgress=e?.showProgress||!1,$.progress=e?.progress||0},hide:()=>{$.visible=!1},updateProgress:e=>{$.progress=Math.max(0,Math.min(100,e))},updateText:e=>{$.text=e},setText:e=>{$.visible&&($.text=e)}}}K();var $n=be({visible:!1,text:X(`@B8591:操作成功!`),description:``});function er(){let e=e=>{$n.visible=!0,$n.text=e?.text||X(`@B8591:操作成功!`),$n.description=e?.description||``;let n=e?.duration||2e3;setTimeout(()=>{t()},n)},t=()=>{$n.visible=!1};return{successState:$n,show:e,hide:t}}i(),K(),O();var tr={class:`one-commit-content`},nr={class:`one-commit-text`},rr={class:`one-commit-title`},ir={key:0,class:`one-commit-desc`},ar=Z(v({__name:`QuickCommitButton`,props:{from:{default:`form`},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1}},emits:[`beforeCommit`,`afterCommit`,`clearFields`],setup(e,{expose:t,emit:n}){let i=Q(),a=De(),o=e,s=n,c=N(()=>i.fileList.some(e=>!Me(e.path,a.lockedFiles))),l=N(()=>i.isSelectionMode&&i.selectedFiles.size>0&&i.selectedUnstagedPaths.length>0),u=N(()=>i.hasConflictedFiles?!0:i.isSelectionMode?!l.value||!o.hasUserCommitMessage:!c.value||!o.hasUserCommitMessage),d=N(()=>i.isAddingFiles||i.isCommiting),h=N(()=>i.hasConflictedFiles?X(`@2E184:存在冲突文件,请先解决冲突`):i.isSelectionMode?i.selectedFiles.size===0?X(`@2E184:请先勾选要提交的文件`):i.selectedUnstagedPaths.length===0?X(`@2E184:所选文件无需暂存或被锁定`):o.hasUserCommitMessage?X(`@2E184:一键完成:仅暂存所选文件 → 提交`):X(`@2E184:请输入提交信息`):c.value?o.hasUserCommitMessage?X(`@2E184:一键完成:暂存所有更改 → 提交`):X(`@2E184:请输入提交信息`):X(`@2E184:没有需要提交的更改`)),g=N(()=>i.isSelectionMode&&l.value?X(`@2E184:一键提交所选`):X(`@2E184:一键提交`)),_=N(()=>o.from===`form`?i.isSelectionMode&&l.value?X(`@2E184:暂存所选 + 提交`):X(`@2E184:暂存 + 提交`):``);async function v(){s(`beforeCommit`);try{let e=await i.stageSelectedAndCommit(o.finalCommitMessage,o.skipHooks);e&&s(`clearFields`),s(`afterCommit`,e)}catch(e){console.error(`一键提交失败:`,e),s(`afterCommit`,!1)}}return t({triggerQuickCommit:v}),(t,n)=>{let i=I,a=r;return R(),W(`div`,null,[D(p(m),{content:h.value,placement:`top`,"show-after":200},{default:V(()=>[D(a,{type:`primary`,onClick:v,loading:d.value,disabled:u.value,class:q([e.from,`one-commit-button`])},{default:V(()=>[f(`div`,tr,[D(i,{class:`one-commit-icon`},{default:V(()=>[D(p(ae))]),_:1}),f(`div`,nr,[f(`span`,rr,k(g.value),1),e.from===`form`?(R(),W(`span`,ir,k(_.value),1)):T(``,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}}}),[[`__scopeId`,`data-v-0bcf5e9d`]]);i(),K();var or={class:`form-bottom-actions`},sr={class:`actions-flex-container`},cr={class:`left-actions`},lr={class:`button-grid`},ur={class:`right-actions`},dr=Z(v({__name:`GitActionButtons`,props:{hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1},from:{default:`form`}},emits:[`afterCommit`,`afterPush`,`beforePush`,`pushStart`,`clearFields`],setup(e,{expose:t,emit:n}){let r=n,i=B(null);function a(e){r(`afterCommit`,e)}function o(e){r(`afterPush`,e)}function s(){r(`beforePush`)}function c(){r(`pushStart`)}function l(){r(`clearFields`)}async function u(){return i.value?.triggerQuickPush()}return t({triggerQuickPush:u}),(t,n)=>(R(),W(`div`,or,[f(`div`,sr,[f(`div`,cr,[f(`div`,lr,[D(Be,{onClick:()=>{},from:e.from},null,8,[`from`]),D(He,{"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforeCommit:()=>{},onAfterCommit:a,onClick:()=>{},from:e.from},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`,`from`]),D(dt,{onBeforePush:()=>{},onAfterPush:o,onClick:()=>{},from:e.from},null,8,[`from`])])]),f(`div`,ur,[D(ar,{from:e.from,"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onAfterCommit:a,onClearFields:l},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),D(gt,{ref_key:`quickPushRef`,ref:i,from:e.from,"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforePush:s,onPushStart:c,onAfterPush:o,onClearFields:l},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`])])])]))}}),[[`__scopeId`,`data-v-92e31e45`]]);i(),K(),O(),ge();var fr={class:`dialog-toolbar`},pr={class:`filter-controls`},mr={class:`toolbar-actions`},hr=[`disabled`],gr={class:`btn-text`},_r=[`disabled`],vr={class:`btn-text`},yr=[`disabled`],br={class:`btn-text`},xr={class:`history-scroll`},Sr={key:0,class:`loading-state`},Cr={class:`loading-text`},wr={key:3,class:`history-list`},Tr=[`onClick`],Er={class:`command-info`},Dr={class:`command-text`},Or={class:`command-meta`},kr={class:`timestamp`},Ar={class:`duration`},jr={class:`item-actions`},Mr={key:0,class:`item-details`},Nr={key:0,class:`output-section`},Pr={class:`output-header`},Fr=[`onClick`],Ir={class:`output-content`},Lr={key:0,class:`truncation-notice`},Rr={class:`output-header`},zr={class:`output-content`},Br={key:0,class:`truncation-notice`},Vr={key:2,class:`output-section error`},Hr={class:`output-header`},Ur={class:`output-content`},Wr=Z(v({__name:`CommandHistory`,setup(r){let i=Q(),a=B([]),o=B(!1);function s(e){return Array.isArray(e)?e.join(` `):e==null?``:String(e)}let c=B(!1),u=B(!1),d=B(!1),g=B(new Set),_=B(!1),v=B(!1),b=B(`all`),S=B(`all`),w=B(``),E=N(()=>{let e=a.value;if(b.value!==`all`&&(e=e.filter(e=>b.value===`success`?e.success:!e.success)),S.value!==`all`&&(e=e.filter(e=>{let t=s(e.command).startsWith(`git `);return S.value===`git`?t:!t})),w.value.trim()){let t=w.value.toLowerCase();e=e.filter(e=>s(e.command).toLowerCase().includes(t)||e.stdout&&e.stdout.toLowerCase().includes(t)||e.stderr&&e.stderr.toLowerCase().includes(t)||e.error&&e.error.toLowerCase().includes(t))}return e}),O=N(()=>a.value.filter(e=>e.success).length),M=N(()=>a.value.filter(e=>!e.success).length),P=N(()=>a.value.filter(e=>s(e.command).startsWith(`git `)).length),L=N(()=>a.value.filter(e=>!s(e.command).startsWith(`git `)).length);function ie(){v.value=!0,a.value.length===0&&H()}async function H(){try{if(o.value=!0,i.socket&&i.socket.connected)i.socket.emit(`request_full_history`);else{let e=await(await fetch(`/api/command-history`)).json();e.success?a.value=e.history:z.error(`${X(`@81F0F:加载命令历史失败: `)}${e.error}`)}}catch(e){z.error(`${X(`@81F0F:加载命令历史失败: `)}${e.message}`)}finally{o.value=!1}}async function ae(){if(E.value.length===0){z.warning(X(`@81F0F:没有可复制的命令历史`));return}try{u.value=!0;let e=E.value.map(e=>{let t=`# ${le(e.timestamp)}${X(`@81F0F: (耗时: `)}${G(e.executionTime)}) - ${e.success?X(`@81F0F:成功`):X(`@81F0F:失败`)}\n`;if(t+=`${s(e.command)}\n`,e.stdout&&(t+=`\n# 输出:\n${e.stdout}\n`),e.stderr){let n=pe(e.command)?X(`@81F0F:输出信息`):X(`@81F0F:错误输出`);t+=`\n# ${n}:\n${e.stderr}\n`}return e.error&&(t+=`\n# 错误信息:\n${e.error}\n`),t}).join(`
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$ as e,$n as t,At as n,B as r,Bn as i,Bt as a,C as o,Cn as s,D as c,Dn as l,Dt as u,E as d,En as f,Er as p,G as m,Gt as h,H as g,Ht as _,In as v,J as y,K as b,L as x,N as S,Nn as C,Nt as w,On as T,P as E,Pn as D,Pr as O,Qr as k,R as A,S as j,T as M,Tn as N,W as ee,Wt as P,X as te,Xn as F,Y as I,Yn as ne,Yr as L,Zn as R,a as z,bn as re,br as B,cn as ie,cr as V,ct as H,gt as ae,ht as U,i as oe,kn as W,lr as se,lt as ce,nt as le,o as G,or as ue,ot as de,pr as K,q as fe,qr as q,qt as J,rt as pe,st as me,tn as he,un as ge,ut as _e,v as ve,vn as ye,vr as be,w as xe,xn as Y,z as Se,zt as Ce}from"./element-plus-KTmRV-so.js";import{d as we}from"./vendor-CwZs6S_i.js";import{n as X,t as Z}from"./_plugin-vue_export-helper-C-YBnnP5.js";import{t as Te}from"./IconButton-pqSYKRT8.js";import{n as Ee,t as De}from"./configStore-DoobmT7N.js";import{n as Oe,t as Q}from"./gitStore-BJbNtjxA.js";import{t as ke}from"./CommonDialog-B8XOXtz_.js";import{t as Ae}from"./TemplateManager-DPyYaGCE.js";import{_ as je,b as Me,g as Ne,h as Pe,m as Fe,v as Ie,y as Le}from"./index-ndDaGoRO.js";i(),K(),O();var Re={key:0},ze={key:1},Be=Z(v({__name:`StageButton`,props:{from:{default:`form`}},emits:[`click`],setup(e,{emit:t}){let n=t,i=Q(),a=De();function o(e){let t=e.replace(/\\/g,`/`);return a.lockedFiles.some(e=>{let n=e.replace(/\\/g,`/`);return t===n})}function s(){return a.lockedFiles.length!==0&&i.fileList.some(e=>[`modified`,`deleted`,`untracked`].includes(e.type)?o(e.path):!1)}let c=N(()=>i.fileList.filter(e=>[`modified`,`deleted`,`untracked`].includes(e.type)&&!o(e.path)).length),u=N(()=>i.fileList.some(e=>[`modified`,`deleted`,`untracked`].includes(e.type)&&!o(e.path))),d=N(()=>i.isSelectionMode&&i.hasSelectableFiles),f=N(()=>i.selectedUnstagedPaths.length),h=N(()=>i.isSelectionMode?f.value===0:!u.value),g=N(()=>d.value?`${X(`@29974:暂存所选 `)}${f.value}${X(`@29974: 个文件`)}`:u.value?s()?`${X(`@29974:暂存`)}${c.value}${X(`@29974:个未暂存文件(逐个添加)`)}`:`${X(`@29974:暂存所有更改(git add .)`)}`:X(`@29974:没有需要暂存的更改`));async function _(){n(`click`);try{if(d.value){await i.stageFiles(i.selectedUnstagedPaths);return}if(i.isSelectionMode)return;s()?await i.addToStage():await i.addAllToStage()}catch(e){console.error(`添加文件失败:`,e)}}return(t,n)=>{let a=r,o=m;return R(),l(o,{content:g.value,placement:`top`},{default:V(()=>[D(a,{type:`primary`,icon:p(Ce),onClick:_,loading:p(i).isAddingFiles,disabled:h.value,class:q([`stage-button`,`from-${e.from}`,{"is-selective":d.value}])},{default:V(()=>[C(k(d.value?p(X)(`@29974:暂存所选`):p(X)(`@29974:暂存`))+` `,1),d.value?(R(),W(`span`,Re,`(`+k(f.value)+`)`,1)):c.value>0?(R(),W(`span`,ze,`(`+k(c.value)+`)`,1)):T(``,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`class`])]),_:1},8,[`content`])}}}),[[`__scopeId`,`data-v-22060f7f`]]);i(),K(),O();var Ve={key:0},He=Z(v({__name:`CommitButton`,props:{from:{default:`form`},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1}},emits:[`click`,`beforeCommit`,`afterCommit`],setup(e,{emit:t}){let i=e,a=t,o=Q(),s=De(),c=N(()=>o.fileList.filter(e=>e.type===`added`&&!Me(e.path,s.lockedFiles)).length),u=N(()=>c.value>0),d=N(()=>o.hasConflictedFiles||o.isCommiting?!0:o.isMergeInProgress?!i.hasUserCommitMessage:!u.value||!i.hasUserCommitMessage),f=N(()=>o.isCommiting?X(`@76A11:正在提交中…`):o.hasConflictedFiles?X(`@76A11:存在冲突文件,请先解决冲突`):o.isMergeInProgress?i.hasUserCommitMessage?X(`@76A11:提交并完成合并`):X(`@76A11:请输入提交信息`):u.value?i.hasUserCommitMessage?`${X(`@76A11:提交`)}${c.value}${X(`@76A11:个已暂存文件`)}`:X(`@76A11:请输入提交信息`):X(`@76A11:没有已暂存的更改`)),h=N(()=>o.isCommiting?X(`@76A11:提交中…`):X(`@76A11:提交`));async function g(){if(i.finalCommitMessage.trim()){a(`beforeCommit`),a(`click`);try{let e=await o.commitChanges(i.finalCommitMessage,i.skipHooks);a(`afterCommit`,e)}catch(e){console.error(`提交失败:`,e),a(`afterCommit`,!1)}}}return(t,i)=>{let a=r,s=m;return R(),l(s,{content:f.value,placement:`top`,disabled:p(o).isCommiting},{default:V(()=>[D(a,{type:`primary`,onClick:g,icon:p(o).isCommiting?p(n):p(le),loading:p(o).isCommiting,disabled:d.value,"aria-busy":p(o).isCommiting?`true`:void 0,"aria-label":p(o).isCommiting?p(X)(`@76A11:正在提交中…`):void 0,class:q([`commit-button`,`from-${e.from}`,{"is-committing":p(o).isCommiting}])},{default:V(()=>[C(k(h.value)+` `,1),c.value>0&&!p(o).isCommiting?(R(),W(`span`,Ve,`(`+k(c.value)+`)`,1)):T(``,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`aria-busy`,`aria-label`,`class`])]),_:1},8,[`content`,`disabled`])}}}),[[`__scopeId`,`data-v-6bd86c7e`]]);i(),K(),O();var Ue={class:`push-progress-container`},We={key:0,class:`pulling-section`},Ge={class:`pulling-text-wrap`},Ke={class:`pulling-title`},qe={class:`pulling-sub`},Je={class:`stage-header`},Ye={class:`stage-icon`},Xe={class:`stage-info`},Ze={class:`stage-label`},Qe={key:0,class:`stage-percent`},$e={key:0,class:`stage-progress`},et={key:2,class:`error-section`},tt={class:`error-header`},nt={class:`error-title`},rt={class:`error-content`},it={key:0,class:`error-suggestion`},at={key:3,class:`messages-section`},ot={class:`messages-title`},st=Z(v({__name:`PushProgressModal`,props:{modelValue:{type:Boolean}},emits:[`update:modelValue`,`complete`,`pull-requested`],setup(e,{expose:i,emit:a}){let{t:o}=we(),s=e,u=a,d=De(),m=Q(),h=B(`progress`),g=B([]),_=B(``),v=B(!1),y=N(()=>_.value.includes(`non-fast-forward`)||_.value.includes(`rejected`)&&_.value.includes(`fetch first`)),b=B(!1);async function x(){b.value=!0;try{(await m.gitPull()).success&&(O.value=!1,u(`pull-requested`))}finally{b.value=!1}}let S=be([{name:`counting`,label:o(`@PUSH:计数对象`),status:`wait`,percent:0},{name:`compressing`,label:o(`@PUSH:压缩对象`),status:`wait`,percent:0},{name:`writing`,label:o(`@PUSH:写入对象`),status:`wait`,percent:0},{name:`resolving`,label:o(`@PUSH:解析增量`),status:`wait`,percent:0}]),w=B(0),E=B(null),O=N({get:()=>s.modelValue,set:e=>u(`update:modelValue`,e)}),A=N(()=>{if(v.value)return o(`@PUSH:正在拉取远程更新`);switch(h.value){case`progress`:return o(`@PUSH:正在推送`);case`success`:return o(`@PUSH:推送成功`);case`error`:return o(`@PUSH:推送失败`);default:return``}});function j(e){switch(e.type){case`progress`:e.message&&(g.value.push(e.message),setTimeout(()=>{E.value&&(E.value.scrollTop=E.value.scrollHeight)},0));break;case`stage-progress`:if(e.stage&&typeof e.percent==`number`){let t=S.findIndex(t=>t.name===e.stage);t!==-1&&(S[t].percent=e.percent,S[t].status=e.percent===100?`finish`:`process`,w.value=t,e.percent===100&&t<S.length-1&&(S[t+1].status=`wait`))}break;case`complete`:e.success?(h.value=`success`,S.forEach(e=>{(e.status===`process`||e.status===`wait`)&&(e.status=`finish`,e.percent=100)}),w.value=-1,d.autoClosePushModal?setTimeout(()=>{O.value=!1,u(`complete`,!0)},2e3):u(`complete`,!0)):(h.value=`error`,_.value=Oe(e),w.value<S.length&&(S[w.value].status=`error`),w.value=-1,u(`complete`,!1))}}function M(){h.value=`progress`,g.value=[],_.value=``,w.value=0,v.value=!1,S.forEach(e=>{e.status=`wait`,e.percent=0})}function ee(e){v.value=e}return i({handleProgress:j,reset:M,setPulling:ee}),(e,i)=>{let a=r;return R(),l(p(c),{modelValue:O.value,"onUpdate:modelValue":i[0]||=e=>O.value=e,title:A.value,width:`650px`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":h.value!==`progress`,"append-to-body":!0,"lock-scroll":!1,"destroy-on-close":``,class:q([`push-progress-dialog`,`status-${h.value}`])},{default:V(()=>[f(`div`,Ue,[v.value?(R(),W(`div`,We,[i[1]||=f(`div`,{class:`pulling-icon-wrap`},[f(`svg`,{class:`pulling-spinner`,viewBox:`0 0 50 50`},[f(`circle`,{class:`pulling-spinner-track`,cx:`25`,cy:`25`,r:`20`,fill:`none`,"stroke-width":`4`}),f(`circle`,{class:`pulling-spinner-arc`,cx:`25`,cy:`25`,r:`20`,fill:`none`,"stroke-width":`4`})])],-1),f(`div`,Ge,[f(`div`,Ke,k(p(o)(`@PUSH:正在拉取远程更新`)),1),f(`div`,qe,k(p(o)(`@PUSH:拉取完成后自动继续推送`)),1)])])):(R(),W(`div`,{key:1,class:q([`stages-section`,{"is-loading":h.value===`progress`,"is-success":h.value===`success`}])},[(R(!0),W(Y,null,t(S,(e,t)=>(R(),W(`div`,{key:e.name,class:q([`stage-item`,{active:w.value===t,finished:e.status===`finish`,error:e.status===`error`}])},[f(`div`,Je,[f(`div`,Ye,[e.status===`finish`?(R(),l(p(I),{key:0,class:`icon-finish`},{default:V(()=>[D(p(pe))]),_:1})):e.status===`error`?(R(),l(p(I),{key:1,class:`icon-error`},{default:V(()=>[D(p(me))]),_:1})):e.status===`process`?(R(),l(p(I),{key:2,class:`icon-process rotating`},{default:V(()=>[D(p(n))]),_:1})):(R(),l(p(I),{key:3,class:`icon-wait`},{default:V(()=>[D(p(n))]),_:1}))]),f(`div`,Xe,[f(`div`,Ze,k(e.label),1),e.status===`process`||e.status===`finish`?(R(),W(`div`,Qe,k(e.percent)+`% `,1)):T(``,!0)])]),e.status===`process`||e.status===`finish`?(R(),W(`div`,$e,[D(p(ve),{percentage:e.percent,"stroke-width":6,"show-text":!1,color:e.status===`finish`?`var(--color-success)`:`var(--color-primary)`},null,8,[`percentage`,`color`])])):T(``,!0)],2))),128))],2)),h.value===`error`&&_.value?(R(),W(`div`,et,[f(`div`,tt,[f(`div`,nt,k(p(o)(`@PUSH:错误详情`))+`:`,1),y.value?(R(),l(a,{key:0,type:`primary`,size:`small`,loading:b.value,onClick:x,class:`pull-button`},{default:V(()=>[D(p(I),null,{default:V(()=>[D(p(U))]),_:1}),C(` `+k(p(o)(`@PUSH:先拉取更新`)),1)]),_:1},8,[`loading`])):T(``,!0)]),f(`div`,rt,k(_.value),1),y.value?(R(),W(`div`,it,k(p(o)(`@PUSH:检测到远程有新提交,请先拉取更新后再推送。`)),1)):T(``,!0)])):T(``,!0),g.value.length>0?(R(),W(`div`,at,[f(`div`,ot,k(p(o)(`@PUSH:详细信息`))+`:`,1),f(`div`,{ref_key:`messagesContainerRef`,ref:E,class:`progress-messages`},[(R(!0),W(Y,null,t(g.value,(e,t)=>(R(),W(`div`,{key:t,class:`message-item`},k(e),1))),128))],512)])):T(``,!0)])]),_:1},8,[`modelValue`,`title`,`show-close`,`class`])}}}),[[`__scopeId`,`data-v-f26d0df8`]]);i(),K(),O();var ct={class:`push-button-group`},lt={key:0},ut={class:`push-remote-item`},dt=Z(v({__name:`PushButton`,props:{from:{default:`form`}},emits:[`click`,`beforePush`,`afterPush`],setup(e,{emit:n}){let i=n,a=Q(),s=B(!1),c=B(null),u=N(()=>a.branchAhead>0),d=N(()=>a.fileList.some(e=>e.type===`added`)),h=N(()=>!a.hasConflictedFiles&&a.hasUpstream&&u.value&&!d.value),g=N(()=>!h.value),_=N(()=>a.hasConflictedFiles?X(`@F4137:存在冲突文件,请先解决冲突`):a.hasUpstream?u.value?d.value?X(`@F4137:有未提交的暂存更改,请先提交`):`${X(`@F4137:推送`)}${a.branchAhead}${X(`@F4137:个本地提交`)}`:X(`@F4137:没有需要推送的提交`):X(`@F4137:当前分支没有上游分支`)),v=N(()=>h.value?{backgroundColor:`var(--color-success)`,borderColor:`var(--color-success)`}:{});async function y(){i(`beforePush`),i(`click`);try{s.value=!0,c.value&&c.value.reset();let e=await a.pushToRemoteWithProgress(e=>{c.value&&c.value.handleProgress(e)});e&&await new Promise(e=>setTimeout(e,200)),i(`afterPush`,e)}catch(e){console.error(`推送失败:`,e),i(`afterPush`,!1)}}function b(e){}let x=N(()=>[...a.remotes].sort((e,t)=>e.isUpstream===t.isUpstream?e.name.localeCompare(t.name):e.isUpstream?-1:1));async function S(e){if(e===`manage`){a.isRemoteManagerVisible=!0;return}if(e===`push-all`){await a.pushAllRemotes();return}if(!e.startsWith(`push:`))return;let t=e.slice(5);i(`beforePush`);try{s.value=!0,c.value?.reset();let e=await a.pushToRemoteWithProgress(e=>{c.value?.handleProgress(e)},t);i(`afterPush`,e)}catch(e){console.error(`推送失败:`,e),i(`afterPush`,!1)}}return(n,i)=>{let d=r,h=m,w=Se,E=xe,O=M,A=o;return R(),W(`div`,null,[f(`div`,ct,[D(h,{content:_.value,placement:`top`},{default:V(()=>[D(d,{type:`primary`,icon:p(he),onClick:y,loading:p(a).isPushing,disabled:g.value,style:L(v.value),class:q([`push-button`,`from-${e.from}`])},{default:V(()=>[C(k(p(X)(`@F4137:推送`))+` `,1),u.value?(R(),W(`span`,lt,`(`+k(p(a).branchAhead)+`)`,1)):T(``,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`style`,`class`])]),_:1},8,[`content`]),p(a).hasMultipleRemotes?(R(),l(A,{key:0,trigger:`click`,placement:`top-end`,onCommand:S},{dropdown:V(()=>[D(O,null,{default:V(()=>[(R(!0),W(Y,null,t(x.value,e=>(R(),l(E,{key:e.name,command:`push:${e.name}`},{default:V(()=>[f(`span`,ut,[f(`span`,null,k(p(X)(`@F4137:推送到`))+` `+k(e.name),1),e.isUpstream?(R(),l(w,{key:0,size:`small`,type:`success`,effect:`plain`},{default:V(()=>[C(k(p(X)(`@F4137:上游`)),1)]),_:1})):T(``,!0)])]),_:2},1032,[`command`]))),128)),D(E,{divided:``,command:`push-all`},{default:V(()=>[C(k(p(X)(`@F4137:推送到全部远程`)),1)]),_:1}),D(E,{divided:``,command:`manage`},{default:V(()=>[C(k(p(X)(`@F4137:管理远程…`)),1)]),_:1})]),_:1})]),default:V(()=>[D(d,{type:`primary`,icon:p(te),style:L(v.value),class:q([`push-button__caret`,`from-${e.from}`]),"aria-label":p(X)(`@F4137:更多推送选项`)},null,8,[`icon`,`style`,`class`,`aria-label`])]),_:1})):T(``,!0)]),D(st,{ref_key:`progressModalRef`,ref:c,modelValue:s.value,"onUpdate:modelValue":i[0]||=e=>s.value=e,onComplete:b},null,8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-da69033d`]]);i(),K(),O();var ft={class:`one-push-content`},pt={class:`one-push-text`},mt={class:`one-push-title`},ht={key:0,class:`one-push-desc`},gt=Z(v({__name:`QuickPushButton`,props:{from:{default:`form`},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1}},emits:[`beforePush`,`pushStart`,`afterPush`,`clearFields`],setup(e,{expose:t,emit:n}){let i=Q(),o=De(),s=B(!1),c=B(null),l=e,u=n,d=N(()=>i.fileList.some(e=>!Me(e.path,o.lockedFiles))),h=N(()=>i.isSelectionMode&&i.selectedFiles.size>0&&i.selectedUnstagedPaths.length>0),g=N(()=>i.hasConflictedFiles?!0:i.isSelectionMode?!h.value||!l.hasUserCommitMessage||!i.hasUpstream:!d.value&&i.branchAhead===0||!l.hasUserCommitMessage||!i.hasUpstream),_=N(()=>i.isAddingFiles||i.isCommiting||i.isPushing),v=N(()=>{if(i.hasConflictedFiles)return X(`@2E184:存在冲突文件,请先解决冲突`);if(i.isSelectionMode)return i.selectedFiles.size===0?X(`@2E184:请先勾选要推送的文件`):i.selectedUnstagedPaths.length===0?X(`@2E184:所选文件无需暂存或被锁定`):l.hasUserCommitMessage?i.hasUpstream?X(`@2E184:一键完成:仅暂存所选文件 → 提交 → 推送到远程仓库`):X(`@2E184:当前分支没有上游分支`):X(`@2E184:请输入提交信息`);let e=i.branchAhead>0;return!d.value&&!e?X(`@2E184:没有需要提交或推送的更改`):l.hasUserCommitMessage?i.hasUpstream?d.value?X(`@2E184:一键完成:暂存所有更改 → 提交 → 推送到远程仓库`):X(`@2E184:本地已提交,一键推送到远程仓库`):X(`@2E184:当前分支没有上游分支`):X(`@2E184:请输入提交信息`)}),y=N(()=>i.isSelectionMode&&h.value?X(`@2E184:一键推送所选`):X(`@2E184:一键推送所有`)),b=N(()=>l.from===`form`?i.isSelectionMode&&h.value?X(`@2E184:暂存所选 + 提交 + 推送`):X(`@2E184:暂存 + 提交 + 推送`):``);async function x(){u(`beforePush`);try{let e=i.isSelectionMode&&h.value;if((e||d.value)&&!(e?await i.stageSelectedAndCommit(l.finalCommitMessage,l.skipHooks):await i.addAndCommit(l.finalCommitMessage,l.skipHooks))){u(`afterPush`,!1);return}if(u(`pushStart`),s.value=!0,o.pullBeforePush){c.value?.setPulling(!0);let e=await i.gitPull();if(c.value?.setPulling(!1),!e.success){z.error(X(`@2E184:拉取远程更新失败,已停止推送`)),s.value=!1,i.fetchStatus(),i.getBranchStatus(!0),u(`afterPush`,!1);return}}c.value&&c.value.reset();let t=await i.pushToRemoteWithProgress(e=>{c.value&&c.value.handleProgress(e)});if(t){try{window.dispatchEvent(new CustomEvent(`zen-gitsync:after-quick-push-success`))}catch{}u(`clearFields`)}u(`afterPush`,t)}catch(e){console.error(`一键推送失败:`,e),u(`afterPush`,!1)}}t({triggerQuickPush:x});function S(e){}return(t,n)=>{let i=I,o=r;return R(),W(`div`,null,[D(p(m),{content:v.value,placement:`top`,"show-after":200},{default:V(()=>[D(o,{type:`primary`,onClick:x,loading:_.value,disabled:g.value,class:q([e.from,`one-push-button`])},{default:V(()=>[f(`div`,ft,[D(i,{class:`one-push-icon`},{default:V(()=>[D(p(a))]),_:1}),f(`div`,pt,[f(`span`,mt,k(y.value),1),e.from===`form`?(R(),W(`span`,ht,k(b.value),1)):T(``,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`]),D(st,{ref_key:`progressModalRef`,ref:c,modelValue:s.value,"onUpdate:modelValue":n[0]||=e=>s.value=e,onComplete:S,onPullRequested:x},null,8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-9f003c37`]]);i(),K(),O();var _t={class:`create-tag-button`},vt={class:`tag-dialog-content`},yt={class:`tag-info-card`},bt={class:`info-icon`},xt={class:`info-content`},St={class:`form-tip`},Ct={class:`form-tip`},wt={class:`form-tip`},Tt=Z(v({__name:`CreateTagButton`,props:{variant:{default:`icon`}},setup(e){let t=e,n=Q(),i=B(!1),a=B(``),o=B(``),s=B(`lightweight`),c=B(``),d=B(!1);function h(){a.value=``,o.value=``,s.value=`lightweight`,c.value=``,i.value=!0}async function g(){if(!a.value.trim()){z.warning(X(`@TAG01:请输入标签名称`));return}if(!/^[a-zA-Z0-9._\/-]+$/.test(a.value)){z.warning(X(`@TAG01:标签名称只能包含字母、数字、点、下划线、斜杠和连字符`));return}try{d.value=!0;let e=await(await fetch(`/api/create-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:a.value.trim(),message:o.value.trim(),type:s.value,commit:c.value.trim()})})).json();e.success?(z.success(X(`@TAG01:标签创建成功`)),i.value=!1):z.error(e.error||X(`@TAG01:创建标签失败`))}catch(e){console.error(`创建标签失败:`,e),z.error(X(`@TAG01:创建标签失败`))}finally{d.value=!1}}let _=N(()=>s.value===`lightweight`?X(`@TAG01:轻量标签是指向提交对象的引用,不包含额外信息`):X(`@TAG01:附注标签是完整的Git对象,包含标签信息、日期、标签者和可选的签名`));return(e,v)=>{let y=I,x=r,w=m,O=ee,A=fe,j=S,M=E,N=b;return R(),W(`div`,_t,[D(w,{content:p(X)(`@TAG01:为当前提交创建标签`),placement:`top`,"show-after":200,disabled:t.variant===`text`},{default:V(()=>[D(x,{type:`success`,onClick:h,disabled:!p(n).isGitRepo,circle:t.variant===`icon`,size:t.variant===`icon`?`small`:`default`,class:q(t.variant===`text`?`action-button`:``)},{default:V(()=>[t.variant===`icon`?(R(),l(y,{key:0},{default:V(()=>[D(p(J))]),_:1})):(R(),W(Y,{key:1},[C(k(p(X)(`@TAG01:创建标签`)),1)],64))]),_:1},8,[`disabled`,`circle`,`size`,`class`])]),_:1},8,[`content`,`disabled`]),D(ke,{modelValue:i.value,"onUpdate:modelValue":v[4]||=e=>i.value=e,title:p(X)(`@TAG01:创建 Git 标签`),size:`medium`,"close-on-click-modal":!1,"show-footer":``,"confirm-text":p(X)(`@TAG01:创建`),"cancel-text":p(X)(`@TAG01:取消`),"confirm-loading":d.value,"custom-class":`tag-dialog`,onConfirm:g},{default:V(()=>[f(`div`,vt,[f(`div`,yt,[f(`div`,bt,[D(y,null,{default:V(()=>[D(p(J))]),_:1})]),f(`div`,xt,[f(`h4`,null,k(p(X)(`@TAG01:Git 标签`)),1),f(`p`,null,k(p(X)(`@TAG01:标签用于标记项目的重要版本点,如发布版本 v1.0.0`)),1)])]),D(N,{"label-position":`top`,class:`tag-form`},{default:V(()=>[D(A,{label:p(X)(`@TAG01:标签名称`),required:``},{default:V(()=>[D(O,{modelValue:a.value,"onUpdate:modelValue":v[0]||=e=>a.value=e,placeholder:p(X)(`@TAG01:例如: v1.0.0 或 release-2024`),clearable:``,maxlength:`100`},{prefix:V(()=>[D(y,null,{default:V(()=>[D(p(J))]),_:1})]),_:1},8,[`modelValue`,`placeholder`]),f(`div`,St,[D(y,null,{default:V(()=>[D(p(u))]),_:1}),f(`span`,null,k(p(X)(`@TAG01:建议使用语义化版本号,如 v1.0.0`)),1)])]),_:1},8,[`label`]),D(A,{label:p(X)(`@TAG01:标签类型`)},{default:V(()=>[D(M,{modelValue:s.value,"onUpdate:modelValue":v[1]||=e=>s.value=e,size:`default`},{default:V(()=>[D(j,{value:`lightweight`},{default:V(()=>[C(k(p(X)(`@TAG01:轻量标签`)),1)]),_:1}),D(j,{value:`annotated`},{default:V(()=>[C(k(p(X)(`@TAG01:附注标签`)),1)]),_:1})]),_:1},8,[`modelValue`]),f(`div`,Ct,[D(y,null,{default:V(()=>[D(p(u))]),_:1}),f(`span`,null,k(_.value),1)])]),_:1},8,[`label`]),s.value===`annotated`?(R(),l(A,{key:0,label:p(X)(`@TAG01:标签说明`),required:s.value===`annotated`},{default:V(()=>[D(O,{modelValue:o.value,"onUpdate:modelValue":v[2]||=e=>o.value=e,placeholder:p(X)(`@TAG01:为此标签添加说明信息`),clearable:``,rows:3,type:`textarea`,resize:`none`,maxlength:`500`,"show-word-limit":``},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`,`required`])):T(``,!0),D(A,{label:p(X)(`@TAG01:目标提交(可选)`)},{default:V(()=>[D(O,{modelValue:c.value,"onUpdate:modelValue":v[3]||=e=>c.value=e,placeholder:p(X)(`@TAG01:留空则为当前HEAD,或输入commit SHA`),clearable:``,maxlength:`40`},{prefix:V(()=>[...v[5]||=[f(`span`,{class:`commit-prefix`},`commit:`,-1)]]),_:1},8,[`modelValue`,`placeholder`]),f(`div`,wt,[D(y,null,{default:V(()=>[D(p(u))]),_:1}),f(`span`,null,k(p(X)(`@TAG01:默认为当前HEAD提交,也可以指定历史提交`)),1)])]),_:1},8,[`label`])]),_:1})])]),_:1},8,[`modelValue`,`title`,`confirm-text`,`cancel-text`,`confirm-loading`])])}}}),[[`__scopeId`,`data-v-cbbcdcda`]]);i(),K(),O();var Et={class:`tag-list-button`},Dt={class:`tag-list-content`},Ot={key:0,class:`tag-header`},kt={class:`tag-stats`},At={class:`stat-item`},jt={class:`stat-number`},Mt={class:`stat-label`},Nt={class:`tag-actions-header`},Pt={class:`tag-list-container`},Ft={key:0,class:`empty-state`},It={class:`empty-text`},Lt={class:`empty-hint`},Rt={key:1,class:`tag-cards`},zt={class:`tag-card-content`},Bt={class:`tag-info`},Vt={class:`tag-main-info`},Ht={class:`tag-name-badge`},Ut={class:`tag-name-text`},Wt={class:`tag-meta`},Gt={class:`tag-commit`},Kt={class:`tag-date`},qt={key:0,class:`tag-message`},Jt={class:`tag-card-actions`},Yt={key:0,class:`tag-detail-content`},Xt={class:`detail-row`},Zt={class:`detail-label`},Qt={class:`detail-value`},$t={class:`detail-row`},en={class:`detail-label`},tn={class:`detail-value`},nn={class:`detail-row`},rn={class:`detail-label`},an={class:`detail-value`},on={class:`detail-row`},sn={class:`detail-label`},cn={key:0,class:`detail-row detail-message`},ln={class:`detail-label`},un={class:`message-content`},dn=Z(v({__name:`TagListButton`,props:{variant:{default:`icon`}},setup(e){let n=e,i=Q(),a=B(!1),o=B([]),s=B(!1),c=B(!1),d=B(!1),h=B(!1),g=B(null);async function v(){a.value=!0,await y()}async function y(){try{s.value=!0;let e=await(await fetch(`/api/list-tags`)).json();e.success?o.value=e.tags||[]:z.error(e.error||X(`@TAG01:获取标签列表失败`))}catch(e){console.error(`获取标签列表失败:`,e),z.error(X(`@TAG01:获取标签列表失败`))}finally{s.value=!1}}function b(e){g.value=e,h.value=!0}async function x(e){oe.confirm(X(`@TAG01:确定要推送此标签到远程仓库吗?`),X(`@TAG01:推送标签`),{confirmButtonText:X(`@TAG01:推送`),cancelButtonText:X(`@TAG01:取消`),type:`info`}).then(async()=>{try{d.value=!0;let t=await(await fetch(`/api/push-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:e})})).json();t.success?z.success(X(`@TAG01:标签推送成功`)):z.error(t.error||X(`@TAG01:推送标签失败`))}catch(e){console.error(`推送标签失败:`,e),z.error(X(`@TAG01:推送标签失败`))}finally{d.value=!1}}).catch(()=>{})}async function S(){oe.confirm(X(`@TAG01:确定要推送所有标签到远程仓库吗?`),X(`@TAG01:推送所有标签`),{confirmButtonText:X(`@TAG01:推送`),cancelButtonText:X(`@TAG01:取消`),type:`info`}).then(async()=>{try{d.value=!0;let e=await(await fetch(`/api/push-all-tags`,{method:`POST`})).json();e.success?z.success(X(`@TAG01:所有标签推送成功`)):z.error(e.error||X(`@TAG01:推送标签失败`))}catch(e){console.error(`推送标签失败:`,e),z.error(X(`@TAG01:推送标签失败`))}finally{d.value=!1}}).catch(()=>{})}async function w(e){oe.confirm(X(`@TAG01:确定要删除此标签吗?此操作不可恢复。`),X(`@TAG01:删除标签`),{confirmButtonText:X(`@TAG01:删除`),cancelButtonText:X(`@TAG01:取消`),type:`warning`}).then(async()=>{await E(e)}).catch(()=>{})}async function E(e){try{c.value=!0;let t=await(await fetch(`/api/delete-tag`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tagName:e})})).json();t.success?(z.success(X(`@TAG01:标签删除成功`)),await y()):z.error(t.error||X(`@TAG01:删除标签失败`))}catch(e){console.error(`删除标签失败:`,e),z.error(X(`@TAG01:删除标签失败`))}finally{c.value=!1}}function O(e){if(!e)return`-`;try{return new Date(e).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}catch{return e}}return(e,E)=>{let A=I,M=r,N=m,ee=j,P=Se,te=G;return R(),W(`div`,Et,[D(N,{content:p(X)(`@TAG01:查看和管理所有标签`),placement:`top`,"show-after":200,disabled:n.variant===`text`},{default:V(()=>[D(M,{type:`info`,onClick:v,disabled:!p(i).isGitRepo,circle:n.variant===`icon`,size:n.variant===`icon`?`small`:`default`,class:q(n.variant===`text`?`action-button`:``)},{default:V(()=>[n.variant===`icon`?(R(),l(A,{key:0},{default:V(()=>[D(p(J))]),_:1})):(R(),W(Y,{key:1},[C(k(p(X)(`@TAG01:标签列表`)),1)],64))]),_:1},8,[`disabled`,`circle`,`size`,`class`])]),_:1},8,[`content`,`disabled`]),D(ke,{modelValue:a.value,"onUpdate:modelValue":E[0]||=e=>a.value=e,title:p(X)(`@TAG01:Git 标签列表`),size:`large`,"show-footer":!1,"custom-class":`tag-list-dialog`},{default:V(()=>[f(`div`,Dt,[s.value?T(``,!0):(R(),W(`div`,Ot,[f(`div`,kt,[f(`div`,At,[D(A,{class:`stat-icon`},{default:V(()=>[D(p(J))]),_:1}),f(`span`,jt,k(o.value.length),1),f(`span`,Mt,k(p(X)(`@TAG01:个标签`)),1)])]),f(`div`,Nt,[D(M,{type:`primary`,size:`small`,icon:p(_),onClick:y,loading:s.value,class:`refresh-btn`},{default:V(()=>[C(k(p(X)(`@TAG01:刷新`)),1)]),_:1},8,[`icon`,`loading`]),o.value.length>0?(R(),l(M,{key:0,type:`success`,size:`small`,icon:p(he),onClick:S,loading:d.value,class:`push-all-btn`},{default:V(()=>[C(k(p(X)(`@TAG01:推送所有标签`)),1)]),_:1},8,[`icon`,`loading`])):T(``,!0)])])),se((R(),W(`div`,Pt,[o.value.length===0&&!s.value?(R(),W(`div`,Ft,[D(ee,{description:p(X)(`@TAG01:暂无标签`),"image-size":120},{image:V(()=>[D(A,{class:`empty-icon`},{default:V(()=>[D(p(J))]),_:1})]),description:V(()=>[f(`p`,It,k(p(X)(`@TAG01:还没有创建任何标签`)),1),f(`p`,Lt,k(p(X)(`@TAG01:使用创建标签功能为项目添加版本标记`)),1)]),_:1},8,[`description`])])):(R(),W(`div`,Rt,[(R(!0),W(Y,null,t(o.value,e=>(R(),W(`div`,{key:e.name,class:`tag-card`},[f(`div`,zt,[f(`div`,Bt,[f(`div`,Vt,[f(`div`,Ht,[D(A,{class:`badge-icon`},{default:V(()=>[D(p(J))]),_:1}),f(`span`,Ut,k(e.name),1),D(P,{size:`small`,type:e.type===`annotated`?`warning`:`info`,class:`type-tag`},{default:V(()=>[C(k(e.type===`annotated`?p(X)(`@TAG01:附注`):p(X)(`@TAG01:轻量`)),1)]),_:2},1032,[`type`])]),f(`div`,Wt,[f(`span`,Gt,[D(A,null,{default:V(()=>[D(p(u))]),_:1}),C(` `+k(e.commit.substring(0,8)),1)]),f(`span`,Kt,k(O(e.date)),1)]),e.message?(R(),W(`div`,qt,k(e.message),1)):T(``,!0)])]),f(`div`,Jt,[e.message?(R(),l(M,{key:0,size:`small`,type:`info`,onClick:t=>b(e),class:`action-btn view-btn`},{default:V(()=>[C(k(p(X)(`@TAG01:查看`)),1)]),_:1},8,[`onClick`])):T(``,!0),D(M,{size:`small`,type:`success`,icon:p(he),onClick:t=>x(e.name),loading:d.value,class:`action-btn push-btn`},{default:V(()=>[C(k(p(X)(`@TAG01:推送`)),1)]),_:1},8,[`icon`,`onClick`,`loading`]),D(M,{size:`small`,type:`danger`,icon:p(_e),onClick:t=>w(e.name),loading:c.value,class:`action-btn delete-btn`},{default:V(()=>[C(k(p(X)(`@TAG01:删除`)),1)]),_:1},8,[`icon`,`onClick`,`loading`])])])]))),128))]))])),[[te,s.value]])])]),_:1},8,[`modelValue`,`title`]),D(ke,{modelValue:h.value,"onUpdate:modelValue":E[1]||=e=>h.value=e,title:p(X)(`@TAG01:标签详情`),size:`medium`,"show-footer":!1,"custom-class":`tag-detail-dialog`},{default:V(()=>[g.value?(R(),W(`div`,Yt,[f(`div`,Xt,[f(`span`,Zt,k(p(X)(`@TAG01:标签名称:`)),1),f(`code`,Qt,k(g.value.name),1)]),f(`div`,$t,[f(`span`,en,k(p(X)(`@TAG01:提交SHA:`)),1),f(`code`,tn,k(g.value.commit),1)]),f(`div`,nn,[f(`span`,rn,k(p(X)(`@TAG01:创建时间:`)),1),f(`span`,an,k(O(g.value.date)),1)]),f(`div`,on,[f(`span`,sn,k(p(X)(`@TAG01:类型:`)),1),D(P,{type:g.value.type===`annotated`?`warning`:`info`,size:`small`},{default:V(()=>[C(k(g.value.type===`annotated`?p(X)(`@TAG01:附注标签`):p(X)(`@TAG01:轻量标签`)),1)]),_:1},8,[`type`])]),g.value.message?(R(),W(`div`,cn,[f(`span`,ln,k(p(X)(`@TAG01:标签说明:`)),1),f(`div`,un,k(g.value.message),1)])):T(``,!0)])):T(``,!0)]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-fc8d7e86`]]);i(),K(),O();var fn={class:`git-operations-button`},pn={class:`actions-section`},mn={class:`action-groups`},hn={class:`action-group`},gn={class:`group-title`},_n={class:`group-buttons`},vn={key:0},yn={class:`action-group`},bn={class:`group-title`},xn={class:`group-buttons`},Sn={class:`action-group`},Cn={class:`group-title`},wn={class:`group-buttons`},Tn={key:0},En={class:`action-group`},Dn={class:`group-title`},On={class:`group-buttons`},kn={class:`action-group`},An={class:`group-title`},jn={class:`group-buttons`},Mn={class:`action-group`},Nn={class:`group-title`},Pn={class:`group-buttons`},Fn={class:`pull-error-content`},In={key:0},Ln={key:1},Rn={class:`pull-error-detail`},zn={class:`pull-error-label`},Bn={class:`pull-error-pre`},Vn=Z(v({__name:`GitOperationsButton`,props:{variant:{default:`icon`},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1}},emits:[`afterCommit`,`afterPush`,`beforePush`,`clearFields`],setup(e,{expose:t,emit:n}){let i=e,a=n,o=Q(),s=B(!1),c=B(!1),h=B({needsMerge:!1,error:``,fullError:``,pullOutput:``});function g(){s.value=!0}let _=N(()=>o.fileList.filter(e=>e.type===`added`).length),v=N(()=>o.branchBehind>0),y=N(()=>o.fileList.some(e=>[`modified`,`deleted`,`untracked`,`intent-to-add`].includes(e.type)));async function b(){try{let e=await o.gitPull();e.success?(await o.fetchStatus(),await o.fetchLog(!1)):(h.value={needsMerge:e.needsMerge,error:e.error,fullError:e.fullError,pullOutput:e.pullOutput},c.value=!0)}catch(e){console.error(`拉取失败:`,e)}}async function x(){try{await o.gitFetchAll(),await o.fetchStatus(),await o.fetchLog(!1)}catch(e){console.error(`获取远程分支失败:`,e)}}async function S(){if(i.hasUserCommitMessage)try{await o.addAndCommit(i.finalCommitMessage,i.skipHooks),o.fetchStatus(),o.fetchLog(),a(`afterCommit`,!0),a(`clearFields`)}catch(e){console.error(`暂存并提交失败:`,e)}}function E(){a(`beforePush`)}function O(e){a(`afterPush`,e)}function A(){a(`clearFields`)}return t({openGitOperationsDrawer:g}),(t,n)=>{let j=I,M=r,N=m,ee=d;return R(),W(`div`,fn,[i.variant===`icon`?(R(),l(Te,{key:0,tooltip:p(X)(`@F13B4:Git 操作`),size:`large`,"custom-class":`btn-rotate-on-hover`,onClick:g},{default:V(()=>[D(j,null,{default:V(()=>[D(p(w))]),_:1})]),_:1},8,[`tooltip`])):(R(),l(M,{key:1,type:`primary`,class:`action-button`,onClick:g},{default:V(()=>[C(k(p(X)(`@F13B4:Git 操作`)),1)]),_:1})),D(ee,{modelValue:s.value,"onUpdate:modelValue":n[2]||=e=>s.value=e,title:p(X)(`@76872:Git 操作`),direction:`rtl`,size:`362px`,"with-header":!0,"show-close":!0,"destroy-on-close":!1,"append-to-body":!0,class:`git-operations-drawer`},{default:V(()=>[f(`div`,pn,[f(`div`,mn,[f(`div`,hn,[f(`div`,gn,k(p(X)(`@76872:基础操作`)),1),f(`div`,_n,[D(Be,{onClick:()=>{},from:`drawer`}),D(Pe,{onClick:()=>{},from:`drawer`}),D(He,{"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforeCommit:()=>{},onAfterCommit:n[0]||=e=>a(`afterCommit`,e),onClick:()=>{},from:`drawer`},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),D(dt,{onBeforePush:()=>{},onAfterPush:n[1]||=e=>a(`afterPush`,e),onClick:()=>{},from:`drawer`}),D(N,{content:p(o).hasConflictedFiles?p(X)(`@76872:存在冲突文件,请先解决冲突`):v.value?`${p(X)(`@76872:拉取`)}${p(o).branchBehind}${p(X)(`@76872:个远程提交`)}`:`git pull`,placement:`top`},{default:V(()=>[D(M,{type:`primary`,icon:p(U),onClick:b,loading:p(o).isGitPulling,disabled:!p(o).hasUpstream||p(o).hasConflictedFiles,class:`action-button`,style:L(p(o).hasUpstream&&!p(o).hasConflictedFiles?{color:`white`,backgroundColor:`#1e90ff`,borderColor:`#1e90ff`}:{})},{default:V(()=>[C(k(p(X)(`@76872:拉取`))+` `,1),v.value?(R(),W(`span`,vn,`(`+k(p(o).branchBehind)+`)`,1)):T(``,!0)]),_:1},8,[`icon`,`loading`,`disabled`,`style`])]),_:1},8,[`content`]),D(N,{content:`git fetch --all`,placement:`top`},{default:V(()=>[D(M,{type:`info`,icon:p(H),onClick:x,loading:p(o).isGitFetching,class:`action-button`,style:{color:`white`,"background-color":`#1e90ff`,"border-color":`#1e90ff`}},{default:V(()=>[C(k(p(X)(`@76872:获取所有远程分支`)),1)]),_:1},8,[`icon`,`loading`])]),_:1})])]),f(`div`,yn,[f(`div`,bn,k(p(X)(`@76872:组合操作`)),1),f(`div`,xn,[D(N,{content:p(o).hasConflictedFiles?p(X)(`@76872:存在冲突文件,请先解决冲突`):`git add + git commit`,placement:`top`},{default:V(()=>[D(M,{type:`primary`,icon:p(ae),onClick:S,loading:p(o).isAddingFiles||p(o).isCommiting,disabled:!y.value||!e.hasUserCommitMessage||p(o).hasConflictedFiles,class:`action-button`},{default:V(()=>[C(k(p(X)(`@76872:暂存并提交`)),1)]),_:1},8,[`icon`,`loading`,`disabled`])]),_:1},8,[`content`]),D(gt,{from:`drawer`,"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforePush:E,onAfterPush:O,onClearFields:A},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`])])]),f(`div`,Sn,[f(`div`,Cn,k(p(X)(`@76872:重置操作`)),1),f(`div`,wn,[D(N,{content:_.value>0?`${p(X)(`@76872:撤销`)}${_.value}${p(X)(`@76872:个已暂存文件`)}`:`git reset HEAD`,placement:`top`},{default:V(()=>[D(M,{type:`warning`,icon:p(P),onClick:p(o).resetHead,loading:p(o).isResetting,disabled:_.value===0||p(o).hasConflictedFiles,class:`action-button reset-button`},{default:V(()=>[C(k(p(X)(`@76872:重置暂存区`))+` `,1),_.value>0?(R(),W(`span`,Tn,`(`+k(_.value)+`)`,1)):T(``,!0)]),_:1},8,[`icon`,`onClick`,`loading`,`disabled`])]),_:1},8,[`content`]),D(Fe,{variant:`text`})])]),f(`div`,En,[f(`div`,Dn,k(p(X)(`@76872:分支操作`)),1),f(`div`,On,[D(Ne,{variant:`text`})])]),f(`div`,kn,[f(`div`,An,k(p(X)(`@76872:储藏操作`)),1),f(`div`,jn,[D(Le,{variant:`text`}),D(Ie,{variant:`text`})])]),f(`div`,Mn,[f(`div`,Nn,k(p(X)(`@TAG01:标签操作`)),1),f(`div`,Pn,[D(Tt,{variant:`text`}),D(dn,{variant:`text`})])])])])]),_:1},8,[`modelValue`,`title`]),D(ke,{modelValue:c.value,"onUpdate:modelValue":n[3]||=e=>c.value=e,title:h.value.needsMerge?p(X)(`@76872:需要合并更改`):p(X)(`@76872:拉取失败`),size:`medium`,"show-footer":!0,"show-cancel":!1,"confirm-text":p(X)(`@76872:我知道了`),"append-to-body":!0,onConfirm:n[4]||=e=>c.value=!1},{default:V(()=>[f(`div`,Fn,[f(`div`,{class:q([`pull-error-type`,h.value.needsMerge?`is-warning`:`is-error`])},[D(j,{class:`pull-error-icon`},{default:V(()=>[D(p(u))]),_:1}),h.value.needsMerge?(R(),W(`span`,In,k(p(X)(`@76872:本地存在未提交的更改,与远程内容冲突,请先处理本地更改后再拉取。`)),1)):(R(),W(`span`,Ln,k(p(X)(`@76872:执行 git pull 时发生错误,请查看详细信息。`)),1))],2),f(`div`,Rn,[f(`div`,zn,k(p(X)(`@76872:错误详情`))+`:`,1),f(`pre`,Bn,k(h.value.fullError||h.value.error),1)])])]),_:1},8,[`modelValue`,`title`,`confirm-text`])])}}}),[[`__scopeId`,`data-v-f75259bd`]]);i(),O(),ge();var Hn={class:`loading-container`},Un={class:`loading-text`},Wn={key:0,class:`loading-progress`},Gn=v({__name:`GlobalLoading`,props:{visible:{type:Boolean,default:!1},text:{default:X(`@2AEBA:加载中...`)},showProgress:{type:Boolean,default:!1},progress:{default:0},mock:{type:Boolean,default:!1}},setup(e){return(t,n)=>(R(),l(s,{to:`body`},[D(ie,{name:`loading-fade`},{default:V(()=>[e.visible||e.mock?(R(),W(`div`,{key:0,class:`global-loading-overlay`,onClick:n[0]||=re(()=>{},[`stop`])},[f(`div`,Hn,[n[1]||=f(`div`,{class:`loading-spinner`},[f(`div`,{class:`spinner-ring`}),f(`div`,{class:`spinner-ring`}),f(`div`,{class:`spinner-ring`})],-1),f(`div`,Un,k(e.text),1),e.showProgress||e.mock?(R(),W(`div`,Wn,[f(`div`,{class:q([`progress-bar`,{"is-mock":e.mock&&!e.showProgress}]),style:L(e.showProgress?{width:e.progress+`%`}:void 0)},null,6)])):T(``,!0)])])):T(``,!0)]),_:1})]))}}),Kn=Z(Gn,[[`__scopeId`,`data-v-6d13a220`]]);i(),O(),ge();var qn={class:`success-container`},Jn={class:`success-text`},Yn={key:0,class:`success-description`},Xn=v({__name:`SuccessModal`,props:{visible:{type:Boolean,default:!1},text:{default:X(`@71545:操作成功!`)},description:{default:``}},setup(e){return(t,n)=>(R(),l(s,{to:`body`},[D(ie,{name:`success-fade`},{default:V(()=>[e.visible?(R(),W(`div`,{key:0,class:`success-overlay`,onClick:n[0]||=re(()=>{},[`stop`])},[f(`div`,qn,[n[1]||=f(`div`,{class:`success-icon`},[f(`svg`,{viewBox:`0 0 52 52`,class:`success-svg`},[f(`circle`,{class:`success-circle`,cx:`26`,cy:`26`,r:`25`,fill:`none`}),f(`path`,{class:`success-check`,fill:`none`,d:`m14.1 27.2l7.1 7.2 16.7-16.8`})])],-1),f(`div`,Jn,k(e.text),1),e.description?(R(),W(`div`,Yn,k(e.description),1)):T(``,!0)])])):T(``,!0)]),_:1})]))}}),Zn=Z(Xn,[[`__scopeId`,`data-v-c10f43b3`]]);K();var $=be({visible:!1,text:X(`@F2A3A:加载中...`),showProgress:!1,progress:0});function Qn(){return{loadingState:$,show:e=>{$.visible=!0,$.text=e?.text||X(`@F2A3A:加载中...`),$.showProgress=e?.showProgress||!1,$.progress=e?.progress||0},hide:()=>{$.visible=!1},updateProgress:e=>{$.progress=Math.max(0,Math.min(100,e))},updateText:e=>{$.text=e},setText:e=>{$.visible&&($.text=e)}}}K();var $n=be({visible:!1,text:X(`@B8591:操作成功!`),description:``});function er(){let e=e=>{$n.visible=!0,$n.text=e?.text||X(`@B8591:操作成功!`),$n.description=e?.description||``;let n=e?.duration||2e3;setTimeout(()=>{t()},n)},t=()=>{$n.visible=!1};return{successState:$n,show:e,hide:t}}i(),K(),O();var tr={class:`one-commit-content`},nr={class:`one-commit-text`},rr={class:`one-commit-title`},ir={key:0,class:`one-commit-desc`},ar=Z(v({__name:`QuickCommitButton`,props:{from:{default:`form`},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1}},emits:[`beforeCommit`,`afterCommit`,`clearFields`],setup(e,{expose:t,emit:n}){let i=Q(),a=De(),o=e,s=n,c=N(()=>i.fileList.some(e=>!Me(e.path,a.lockedFiles))),l=N(()=>i.isSelectionMode&&i.selectedFiles.size>0&&i.selectedUnstagedPaths.length>0),u=N(()=>i.hasConflictedFiles?!0:i.isSelectionMode?!l.value||!o.hasUserCommitMessage:!c.value||!o.hasUserCommitMessage),d=N(()=>i.isAddingFiles||i.isCommiting),h=N(()=>i.hasConflictedFiles?X(`@2E184:存在冲突文件,请先解决冲突`):i.isSelectionMode?i.selectedFiles.size===0?X(`@2E184:请先勾选要提交的文件`):i.selectedUnstagedPaths.length===0?X(`@2E184:所选文件无需暂存或被锁定`):o.hasUserCommitMessage?X(`@2E184:一键完成:仅暂存所选文件 → 提交`):X(`@2E184:请输入提交信息`):c.value?o.hasUserCommitMessage?X(`@2E184:一键完成:暂存所有更改 → 提交`):X(`@2E184:请输入提交信息`):X(`@2E184:没有需要提交的更改`)),g=N(()=>i.isSelectionMode&&l.value?X(`@2E184:一键提交所选`):X(`@2E184:一键提交`)),_=N(()=>o.from===`form`?i.isSelectionMode&&l.value?X(`@2E184:暂存所选 + 提交`):X(`@2E184:暂存 + 提交`):``);async function v(){s(`beforeCommit`);try{let e=await i.stageSelectedAndCommit(o.finalCommitMessage,o.skipHooks);e&&s(`clearFields`),s(`afterCommit`,e)}catch(e){console.error(`一键提交失败:`,e),s(`afterCommit`,!1)}}return t({triggerQuickCommit:v}),(t,n)=>{let i=I,a=r;return R(),W(`div`,null,[D(p(m),{content:h.value,placement:`top`,"show-after":200},{default:V(()=>[D(a,{type:`primary`,onClick:v,loading:d.value,disabled:u.value,class:q([e.from,`one-commit-button`])},{default:V(()=>[f(`div`,tr,[D(i,{class:`one-commit-icon`},{default:V(()=>[D(p(ae))]),_:1}),f(`div`,nr,[f(`span`,rr,k(g.value),1),e.from===`form`?(R(),W(`span`,ir,k(_.value),1)):T(``,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}}}),[[`__scopeId`,`data-v-0bcf5e9d`]]);i(),K();var or={class:`form-bottom-actions`},sr={class:`actions-flex-container`},cr={class:`left-actions`},lr={class:`button-grid`},ur={class:`right-actions`},dr=Z(v({__name:`GitActionButtons`,props:{hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1},from:{default:`form`}},emits:[`afterCommit`,`afterPush`,`beforePush`,`pushStart`,`clearFields`],setup(e,{expose:t,emit:n}){let r=n,i=B(null);function a(e){r(`afterCommit`,e)}function o(e){r(`afterPush`,e)}function s(){r(`beforePush`)}function c(){r(`pushStart`)}function l(){r(`clearFields`)}async function u(){return i.value?.triggerQuickPush()}return t({triggerQuickPush:u}),(t,n)=>(R(),W(`div`,or,[f(`div`,sr,[f(`div`,cr,[f(`div`,lr,[D(Be,{onClick:()=>{},from:e.from},null,8,[`from`]),D(He,{"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforeCommit:()=>{},onAfterCommit:a,onClick:()=>{},from:e.from},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`,`from`]),D(dt,{onBeforePush:()=>{},onAfterPush:o,onClick:()=>{},from:e.from},null,8,[`from`])])]),f(`div`,ur,[D(ar,{from:e.from,"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onAfterCommit:a,onClearFields:l},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),D(gt,{ref_key:`quickPushRef`,ref:i,from:e.from,"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforePush:s,onPushStart:c,onAfterPush:o,onClearFields:l},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`])])])]))}}),[[`__scopeId`,`data-v-92e31e45`]]);i(),K(),O(),ge();var fr={class:`dialog-toolbar`},pr={class:`filter-controls`},mr={class:`toolbar-actions`},hr=[`disabled`],gr={class:`btn-text`},_r=[`disabled`],vr={class:`btn-text`},yr=[`disabled`],br={class:`btn-text`},xr={class:`history-scroll`},Sr={key:0,class:`loading-state`},Cr={class:`loading-text`},wr={key:3,class:`history-list`},Tr=[`onClick`],Er={class:`command-info`},Dr={class:`command-text`},Or={class:`command-meta`},kr={class:`timestamp`},Ar={class:`duration`},jr={class:`item-actions`},Mr={key:0,class:`item-details`},Nr={key:0,class:`output-section`},Pr={class:`output-header`},Fr=[`onClick`],Ir={class:`output-content`},Lr={key:0,class:`truncation-notice`},Rr={class:`output-header`},zr={class:`output-content`},Br={key:0,class:`truncation-notice`},Vr={key:2,class:`output-section error`},Hr={class:`output-header`},Ur={class:`output-content`},Wr=Z(v({__name:`CommandHistory`,setup(r){let i=Q(),a=B([]),o=B(!1);function s(e){return Array.isArray(e)?e.join(` `):e==null?``:String(e)}let c=B(!1),u=B(!1),d=B(!1),g=B(new Set),_=B(!1),v=B(!1),b=B(`all`),S=B(`all`),w=B(``),E=N(()=>{let e=a.value;if(b.value!==`all`&&(e=e.filter(e=>b.value===`success`?e.success:!e.success)),S.value!==`all`&&(e=e.filter(e=>{let t=s(e.command).startsWith(`git `);return S.value===`git`?t:!t})),w.value.trim()){let t=w.value.toLowerCase();e=e.filter(e=>s(e.command).toLowerCase().includes(t)||e.stdout&&e.stdout.toLowerCase().includes(t)||e.stderr&&e.stderr.toLowerCase().includes(t)||e.error&&e.error.toLowerCase().includes(t))}return e}),O=N(()=>a.value.filter(e=>e.success).length),M=N(()=>a.value.filter(e=>!e.success).length),P=N(()=>a.value.filter(e=>s(e.command).startsWith(`git `)).length),L=N(()=>a.value.filter(e=>!s(e.command).startsWith(`git `)).length);function ie(){v.value=!0,a.value.length===0&&H()}async function H(){try{if(o.value=!0,i.socket&&i.socket.connected)i.socket.emit(`request_full_history`);else{let e=await(await fetch(`/api/command-history`)).json();e.success?a.value=e.history:z.error(`${X(`@81F0F:加载命令历史失败: `)}${e.error}`)}}catch(e){z.error(`${X(`@81F0F:加载命令历史失败: `)}${e.message}`)}finally{o.value=!1}}async function ae(){if(E.value.length===0){z.warning(X(`@81F0F:没有可复制的命令历史`));return}try{u.value=!0;let e=E.value.map(e=>{let t=`# ${le(e.timestamp)}${X(`@81F0F: (耗时: `)}${G(e.executionTime)}) - ${e.success?X(`@81F0F:成功`):X(`@81F0F:失败`)}\n`;if(t+=`${s(e.command)}\n`,e.stdout&&(t+=`\n# 输出:\n${e.stdout}\n`),e.stderr){let n=pe(e.command)?X(`@81F0F:输出信息`):X(`@81F0F:错误输出`);t+=`\n# ${n}:\n${e.stderr}\n`}return e.error&&(t+=`\n# 错误信息:\n${e.error}\n`),t}).join(`
|
|
2
2
|
---
|
|
3
3
|
|
|
4
4
|
`);await navigator.clipboard.writeText(e),z({message:X(`@81F0F:命令历史已复制到剪贴板`),type:`success`,zIndex:1e5})}catch(e){z.error(`${X(`@81F0F:复制失败: `)}${e.message}`)}finally{u.value=!1}}async function U(){if(E.value.length===0){z.warning(X(`@81F0F:没有可复制的命令`));return}try{_.value=!0;let e=E.value.map(e=>s(e.command)).join(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{B as e,Bn as t,D as n,Dn as r,En as i,Er as a,In as o,Nn as s,On as c,Pn as l,Pr as u,Qr as d,Tn as f,Wn as p,Yr as m,Zn as h,cr as g,er as _,ir as v,jn as y,pr as b,qr as x}from"./element-plus-KTmRV-so.js";import{n as S,t as C}from"./_plugin-vue_export-helper-
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{B as e,Bn as t,D as n,Dn as r,En as i,Er as a,In as o,Nn as s,On as c,Pn as l,Pr as u,Qr as d,Tn as f,Wn as p,Yr as m,Zn as h,cr as g,er as _,ir as v,jn as y,pr as b,qr as x}from"./element-plus-KTmRV-so.js";import{n as S,t as C}from"./_plugin-vue_export-helper-C-YBnnP5.js";t(),b(),u();var w=[`id`],T={class:`common-dialog__footer`},E=o({__name:`CommonDialog`,props:{modelValue:{type:Boolean},title:{},size:{default:`medium`},type:{default:`default`},width:{},height:{},top:{default:`50px`},closeOnClickModal:{type:Boolean,default:!1},closeOnPressEscape:{type:Boolean,default:!0},destroyOnClose:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},customClass:{},appendToBody:{type:Boolean,default:!0},lockScroll:{type:Boolean,default:!0},zIndex:{},heightMode:{default:`max`},heightOffset:{default:`100px`},showFooter:{type:Boolean,default:!1},confirmText:{default:S(`@803A9:确定`)},cancelText:{default:S(`@803A9:取消`)},showCancel:{type:Boolean,default:!0},confirmLoading:{type:Boolean,default:!1}},emits:[`update:modelValue`,`confirm`,`cancel`,`close`,`opened`,`closed`],setup(t,{emit:o}){let u=t,b=o,S=f(()=>{if(u.width)return u.width;switch(u.size){case`small`:return`30%`;case`medium`:return`50%`;case`large`:return`80%`;case`extra-large`:return`90%`;case`fullscreen`:return`100vw`;default:return`50%`}}),C=v(),E=null;function D(){b(`opened`),p(()=>{let e=document.querySelector(`.el-dialog__wrapper:not([style*="display: none"]) .el-dialog`);e&&(e.querySelector(`button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])`)||e).focus?.()})}function O(){b(`closed`),E&&typeof E.focus==`function`&&(p(()=>E?.focus()),E=null)}function k(e){e&&!u.modelValue&&(E=document.activeElement),b(`update:modelValue`,e)}let A=f(()=>u.size===`fullscreen`?`0`:u.top),j=f(()=>{let e=[];return u.customClass&&e.push(u.customClass),u.type===`flex`&&e.push(`common-dialog--flex`),u.type===`full-height`&&e.push(`common-dialog--full-height`),u.size===`fullscreen`&&e.push(`common-dialog--fullscreen`),e.join(` `)}),M=f(()=>{if(u.size===`fullscreen`)return{height:`100vh`,maxHeight:`100vh`};let e=`calc(100% - ${u.heightOffset})`;return u.heightMode===`fixed`?{height:e}:{maxHeight:e}});function N(){b(`update:modelValue`,!1),b(`close`)}function P(){b(`confirm`)}function F(){b(`cancel`),N()}return(o,u)=>{let f=e;return h(),r(a(n),{"model-value":t.modelValue,title:t.title,width:S.value,top:A.value,style:m(M.value),"z-index":t.zIndex,fullscreen:t.size===`fullscreen`,"close-on-click-modal":t.closeOnClickModal,"close-on-press-escape":t.closeOnPressEscape,"destroy-on-close":t.destroyOnClose,draggable:t.draggable,class:x(j.value),"append-to-body":t.appendToBody,"lock-scroll":t.lockScroll,"aria-modal":!0,"aria-labelledby":a(C),role:`dialog`,onClose:N,"onUpdate:modelValue":k,onOpened:D,onClosed:O},y({header:g(({titleClass:e})=>[i(`span`,{id:a(C),class:x([`el-dialog__title`,e]),role:`heading`,"aria-level":`2`},d(t.title),11,w)]),default:g(()=>[_(o.$slots,`default`,{},void 0,!0)]),_:2},[t.showFooter||o.$slots.footer?{name:`footer`,fn:g(()=>[_(o.$slots,`footer`,{},()=>[i(`div`,T,[t.showCancel?(h(),r(f,{key:0,type:`button`,onClick:F},{default:g(()=>[s(d(t.cancelText),1)]),_:1})):c(``,!0),l(f,{type:`primary`,loading:t.confirmLoading,onClick:P},{default:g(()=>[s(d(t.confirmText),1)]),_:1},8,[`loading`])])],!0)]),key:`0`}:void 0]),1032,[`model-value`,`title`,`width`,`top`,`style`,`z-index`,`fullscreen`,`close-on-click-modal`,`close-on-press-escape`,`destroy-on-close`,`draggable`,`class`,`append-to-body`,`lock-scroll`,`aria-labelledby`])}}}),D=C(E,[[`__scopeId`,`data-v-601f59df`]]);export{D as t};
|