zen-gitsync 2.16.24 → 2.16.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/package.json +1 -1
- package/src/cli/ai/platformGuard.js +200 -200
- package/src/cli/ai/platformGuard.test.js +253 -253
- package/src/gitCommit.js +484 -484
- package/src/ui/public/assets/AgentView-Bytr0HbV.js +4 -0
- package/src/ui/public/assets/AppVersionBadge-BW4vXJxH.js +2 -0
- package/src/ui/public/assets/BranchSelector-DsLQi1AR.js +1 -0
- package/src/ui/public/assets/CommitForm-CmmxW73q.js +6 -0
- package/src/ui/public/assets/CommonDialog-CQz6iEqp.js +1 -0
- package/src/ui/public/assets/EditorView-CtygNTuz.js +1 -0
- package/src/ui/public/assets/{FlowExecutionViewer-BLv0xSX3.js → FlowExecutionViewer-B7CdeiSp.js} +1 -1
- package/src/ui/public/assets/FlowOrchestrationWorkspace-DtTItIzf.js +21 -0
- package/src/ui/public/assets/LogList-Bo53PBwg.css +1 -0
- package/src/ui/public/assets/LogList-Cwem9ONv.js +7 -0
- package/src/ui/public/assets/MindmapView-DR5bT_oQ.js +2 -0
- package/src/ui/public/assets/MonitorView-DoLNabxl.js +1 -0
- package/src/ui/public/assets/ProjectStartupButton-BiNiH43W.js +1 -0
- package/src/ui/public/assets/{RemoteRepoCard-LHrI3uIa.js → RemoteRepoCard-DJ7ficOj.js} +2 -2
- package/src/ui/public/assets/SourceMapView-CSVCaU8d.js +3 -0
- package/src/ui/public/assets/{SvgIcon-BfPnov-Z.js → SvgIcon-CL2qPswh.js} +1 -1
- package/src/ui/public/assets/UserInputNode-BftMuqji.js +1 -0
- package/src/ui/public/assets/WorkbenchView-Bp2YaSGS.css +1 -0
- package/src/ui/public/assets/WorkbenchView-Cl9H5uXg.js +28 -0
- package/src/ui/public/assets/{_plugin-vue_export-helper-BpqSqjxA.js → _plugin-vue_export-helper-D3_upOKo.js} +3 -3
- package/src/ui/public/assets/configStore-Cqnbpz5-.js +1 -0
- package/src/ui/public/assets/{css.worker-Wv5dxAWO.js → css.worker-CvXBzhp8.js} +1 -1
- package/src/ui/public/assets/{dagre-DgwsqYn1.js → dagre-CWIGcX9d.js} +1 -1
- package/src/ui/public/assets/element-plus-B3pTS_5R.js +32 -0
- package/src/ui/public/assets/element-plus-CQrjg9us.css +1 -0
- package/src/ui/public/assets/{flow-mindmap-ByUzqcTH.js → flow-mindmap-B5aqOviR.js} +38 -38
- package/src/ui/public/assets/{html.worker-CQP8QQsS.js → html.worker-BO6WuOEO.js} +1 -1
- package/src/ui/public/assets/index-D89M9m30.js +71 -0
- package/src/ui/public/assets/{json.worker-DzV-CpCQ.js → json.worker-BkJRGcCJ.js} +1 -1
- package/src/ui/public/assets/{monaco-Dje8Rg13.js → monaco-BFLoT2VD.js} +198 -198
- package/src/ui/public/assets/socket-io-Bcae2P7B.js +1 -0
- package/src/ui/public/assets/toolsStore-RkALTxME.js +1 -0
- package/src/ui/public/assets/{ts.worker-Dth06zuC.js → ts.worker-B0J26iPs.js} +15 -15
- package/src/ui/public/assets/{vendor-DKiix7Qv.js → vendor-Cx8PA1NP.js} +14 -14
- package/src/ui/public/assets/{vue-flow-B-YyhjTY.js → vue-flow-COROsN-V.js} +2 -2
- package/src/ui/public/favicon.svg +75 -75
- package/src/ui/public/index.html +31 -30
- package/src/ui/public/logo.svg +74 -74
- package/src/ui/server/.claude/codediff.txt +8 -0
- package/src/ui/server/index.js +2 -1
- package/src/ui/server/middleware/requestLogger.js +53 -53
- package/src/ui/server/routes/branchStatus.js +105 -105
- package/src/ui/server/routes/fileOpen.js +171 -1
- package/src/ui/server/routes/fs.js +2 -2
- package/src/ui/server/routes/git/diff.js +426 -426
- package/src/ui/server/routes/git/diffUtils.js +149 -149
- package/src/ui/server/routes/git/stash.js +550 -550
- package/src/ui/server/routes/git/tags.js +176 -176
- package/src/ui/server/routes/gitOps.js +10 -0
- package/src/ui/server/routes/process.js +86 -86
- package/src/ui/server/routes/status.js +67 -67
- package/src/ui/server/routes/workbench/pdfText.js +145 -145
- package/src/ui/server/utils/createSavePortToFile.js +48 -48
- package/src/ui/server/utils/instanceRegistry.js +282 -282
- package/src/ui/server/utils/pathGuard.js +21 -0
- package/src/ui/server/utils/startServerOnAvailablePort.js +116 -116
- package/src/utils/index.js +6 -3
- package/src/utils/utils.test.js +89 -2
- package/src/ui/public/assets/AgentView-B1P7BpdL.js +0 -4
- package/src/ui/public/assets/AppVersionBadge-CxbNViwm.js +0 -2
- package/src/ui/public/assets/BranchSelector-D4dKHxxK.js +0 -1
- package/src/ui/public/assets/CommitForm-klcrUCW7.js +0 -6
- package/src/ui/public/assets/CommonDialog-DfPvpafn.js +0 -1
- package/src/ui/public/assets/EditorView-CZofJ-wy.js +0 -1
- package/src/ui/public/assets/FlowOrchestrationWorkspace-BcPCI3Cq.js +0 -21
- package/src/ui/public/assets/LogList-BYrHPSZw.js +0 -15
- package/src/ui/public/assets/LogList-CeFFytjB.css +0 -1
- package/src/ui/public/assets/MindmapView-CNd4Q8B8.js +0 -2
- package/src/ui/public/assets/MonitorView-BlmWenOX.js +0 -1
- package/src/ui/public/assets/ProjectStartupButton-706xOj0N.js +0 -1
- package/src/ui/public/assets/SourceMapView-e96cgLn7.js +0 -3
- package/src/ui/public/assets/UserInputNode-W1uGFT5P.js +0 -1
- package/src/ui/public/assets/WorkbenchView-Cfp_bLC8.js +0 -28
- package/src/ui/public/assets/WorkbenchView-DFO8IfcU.css +0 -1
- package/src/ui/public/assets/configStore-CqqnJlVS.js +0 -1
- package/src/ui/public/assets/element-plus--ayTjGvF.js +0 -25
- package/src/ui/public/assets/element-plus-D3Dn7nX0.css +0 -1
- package/src/ui/public/assets/index-BNymf6-p.js +0 -71
- package/src/ui/public/assets/socket-io-CGezBd--.js +0 -1
- /package/src/ui/public/assets/{editor.worker-Bd9IXS8d.js → editor.worker-Cn2oRESe.js} +0 -0
- /package/src/ui/public/assets/{rolldown-runtime-BM3Ffeng.js → rolldown-runtime-CMxvf4Kt.js} +0 -0
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
// Copyright 2026 xz333221
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
//
|
|
15
|
-
import logger from './logger.js'
|
|
16
|
-
|
|
17
|
-
export async function startServerOnAvailablePort({
|
|
18
|
-
httpServer,
|
|
19
|
-
startPort,
|
|
20
|
-
chalk,
|
|
21
|
-
open,
|
|
22
|
-
noOpen,
|
|
23
|
-
isGitRepo,
|
|
24
|
-
savePortToFile,
|
|
25
|
-
fsSync,
|
|
26
|
-
maxTries = 100,
|
|
27
|
-
callbackExecutedRef
|
|
28
|
-
}) {
|
|
29
|
-
let currentPort = startPort;
|
|
30
|
-
const maxPort = startPort + maxTries;
|
|
31
|
-
const getCallbackExecuted = () => {
|
|
32
|
-
if (callbackExecutedRef && typeof callbackExecutedRef === 'object' && 'value' in callbackExecutedRef) {
|
|
33
|
-
return Boolean(callbackExecutedRef.value);
|
|
34
|
-
}
|
|
35
|
-
return false;
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const setCallbackExecuted = (value) => {
|
|
39
|
-
if (callbackExecutedRef && typeof callbackExecutedRef === 'object' && 'value' in callbackExecutedRef) {
|
|
40
|
-
callbackExecutedRef.value = Boolean(value);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
while (currentPort < maxPort) {
|
|
45
|
-
try {
|
|
46
|
-
if (currentPort > startPort) {
|
|
47
|
-
await new Promise(resolve => setTimeout(resolve, 800));
|
|
48
|
-
logger.info(`尝试端口 ${currentPort}...`);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
await new Promise((resolve, reject) => {
|
|
52
|
-
const errorHandler = (err) => {
|
|
53
|
-
httpServer.removeListener('error', errorHandler);
|
|
54
|
-
reject(err);
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
httpServer.once('error', errorHandler);
|
|
58
|
-
|
|
59
|
-
httpServer.listen(currentPort, () => {
|
|
60
|
-
if (getCallbackExecuted()) return;
|
|
61
|
-
setCallbackExecuted(true);
|
|
62
|
-
|
|
63
|
-
httpServer.removeListener('error', errorHandler);
|
|
64
|
-
|
|
65
|
-
console.log(chalk.green('======================================'));
|
|
66
|
-
console.log(chalk.green(` Zen GitSync 服务器已启动`));
|
|
67
|
-
console.log(chalk.green(` 访问地址: http://localhost:${currentPort}`));
|
|
68
|
-
console.log(chalk.green(` 启动时间: ${new Date().toLocaleString()}`));
|
|
69
|
-
|
|
70
|
-
if (isGitRepo) {
|
|
71
|
-
console.log(chalk.green(` 当前目录是Git仓库`));
|
|
72
|
-
} else {
|
|
73
|
-
console.log(chalk.yellow(` 当前目录不是Git仓库,文件监控未启动`));
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
console.log(chalk.green('======================================'));
|
|
77
|
-
|
|
78
|
-
savePortToFile(currentPort);
|
|
79
|
-
|
|
80
|
-
// 自拉起重启通知:父进程 spawn 时设置了 ZEN_RESTART_NOTIFY_PATH
|
|
81
|
-
// 子进程成功 bind 端口后,把端口写到该文件作为"已就绪"信号
|
|
82
|
-
// (instanceRegistry 在 EPERM 环境下不可用,这是回退通道)
|
|
83
|
-
const notifyPath = process.env.ZEN_RESTART_NOTIFY_PATH;
|
|
84
|
-
if (notifyPath && fsSync) {
|
|
85
|
-
try {
|
|
86
|
-
fsSync.writeFileSync(notifyPath, String(currentPort), 'utf8');
|
|
87
|
-
} catch (_) {
|
|
88
|
-
// 通知写失败不影响主流程
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
if (!noOpen) {
|
|
93
|
-
setTimeout(() => {
|
|
94
|
-
open(`http://localhost:${currentPort}`);
|
|
95
|
-
}, 0);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
resolve();
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
return currentPort;
|
|
103
|
-
} catch (err) {
|
|
104
|
-
if (err.code === 'EADDRINUSE') {
|
|
105
|
-
logger.info(`端口 ${currentPort} 被占用,尝试下一个端口...`);
|
|
106
|
-
currentPort++;
|
|
107
|
-
} else {
|
|
108
|
-
logger.error('启动服务器失败:', err);
|
|
109
|
-
process.exit(1);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
logger.error(`无法找到可用端口 (尝试范围: ${startPort}-${maxPort - 1})`);
|
|
115
|
-
process.exit(1);
|
|
116
|
-
}
|
|
1
|
+
// Copyright 2026 xz333221
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
import logger from './logger.js'
|
|
16
|
+
|
|
17
|
+
export async function startServerOnAvailablePort({
|
|
18
|
+
httpServer,
|
|
19
|
+
startPort,
|
|
20
|
+
chalk,
|
|
21
|
+
open,
|
|
22
|
+
noOpen,
|
|
23
|
+
isGitRepo,
|
|
24
|
+
savePortToFile,
|
|
25
|
+
fsSync,
|
|
26
|
+
maxTries = 100,
|
|
27
|
+
callbackExecutedRef
|
|
28
|
+
}) {
|
|
29
|
+
let currentPort = startPort;
|
|
30
|
+
const maxPort = startPort + maxTries;
|
|
31
|
+
const getCallbackExecuted = () => {
|
|
32
|
+
if (callbackExecutedRef && typeof callbackExecutedRef === 'object' && 'value' in callbackExecutedRef) {
|
|
33
|
+
return Boolean(callbackExecutedRef.value);
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const setCallbackExecuted = (value) => {
|
|
39
|
+
if (callbackExecutedRef && typeof callbackExecutedRef === 'object' && 'value' in callbackExecutedRef) {
|
|
40
|
+
callbackExecutedRef.value = Boolean(value);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
while (currentPort < maxPort) {
|
|
45
|
+
try {
|
|
46
|
+
if (currentPort > startPort) {
|
|
47
|
+
await new Promise(resolve => setTimeout(resolve, 800));
|
|
48
|
+
logger.info(`尝试端口 ${currentPort}...`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
await new Promise((resolve, reject) => {
|
|
52
|
+
const errorHandler = (err) => {
|
|
53
|
+
httpServer.removeListener('error', errorHandler);
|
|
54
|
+
reject(err);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
httpServer.once('error', errorHandler);
|
|
58
|
+
|
|
59
|
+
httpServer.listen(currentPort, () => {
|
|
60
|
+
if (getCallbackExecuted()) return;
|
|
61
|
+
setCallbackExecuted(true);
|
|
62
|
+
|
|
63
|
+
httpServer.removeListener('error', errorHandler);
|
|
64
|
+
|
|
65
|
+
console.log(chalk.green('======================================'));
|
|
66
|
+
console.log(chalk.green(` Zen GitSync 服务器已启动`));
|
|
67
|
+
console.log(chalk.green(` 访问地址: http://localhost:${currentPort}`));
|
|
68
|
+
console.log(chalk.green(` 启动时间: ${new Date().toLocaleString()}`));
|
|
69
|
+
|
|
70
|
+
if (isGitRepo) {
|
|
71
|
+
console.log(chalk.green(` 当前目录是Git仓库`));
|
|
72
|
+
} else {
|
|
73
|
+
console.log(chalk.yellow(` 当前目录不是Git仓库,文件监控未启动`));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
console.log(chalk.green('======================================'));
|
|
77
|
+
|
|
78
|
+
savePortToFile(currentPort);
|
|
79
|
+
|
|
80
|
+
// 自拉起重启通知:父进程 spawn 时设置了 ZEN_RESTART_NOTIFY_PATH
|
|
81
|
+
// 子进程成功 bind 端口后,把端口写到该文件作为"已就绪"信号
|
|
82
|
+
// (instanceRegistry 在 EPERM 环境下不可用,这是回退通道)
|
|
83
|
+
const notifyPath = process.env.ZEN_RESTART_NOTIFY_PATH;
|
|
84
|
+
if (notifyPath && fsSync) {
|
|
85
|
+
try {
|
|
86
|
+
fsSync.writeFileSync(notifyPath, String(currentPort), 'utf8');
|
|
87
|
+
} catch (_) {
|
|
88
|
+
// 通知写失败不影响主流程
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (!noOpen) {
|
|
93
|
+
setTimeout(() => {
|
|
94
|
+
open(`http://localhost:${currentPort}`);
|
|
95
|
+
}, 0);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
resolve();
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
return currentPort;
|
|
103
|
+
} catch (err) {
|
|
104
|
+
if (err.code === 'EADDRINUSE') {
|
|
105
|
+
logger.info(`端口 ${currentPort} 被占用,尝试下一个端口...`);
|
|
106
|
+
currentPort++;
|
|
107
|
+
} else {
|
|
108
|
+
logger.error('启动服务器失败:', err);
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
logger.error(`无法找到可用端口 (尝试范围: ${startPort}-${maxPort - 1})`);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
package/src/utils/index.js
CHANGED
|
@@ -90,15 +90,18 @@ const tableLog = (commandLine, content, type) => {
|
|
|
90
90
|
const endLine = '└' + '─'.repeat(terminalWidth - 2) + '┘'
|
|
91
91
|
|
|
92
92
|
// 计算每行右侧需要补多少空格(用 stringWidth 处理中文/emoji 宽度,避免对不齐)
|
|
93
|
-
|
|
93
|
+
// 每行结构:│ <space> <text> <spaces> │,两侧各 1 字符 + 中间 1 字符左 padding,
|
|
94
|
+
// 所以 spaces = terminalWidth - 3 - len(text)。不传 extraFix。
|
|
95
|
+
const padRight = (text) => {
|
|
94
96
|
const len = stringWidth(text)
|
|
95
|
-
const repeatLen = terminalWidth - len - 3
|
|
97
|
+
const repeatLen = terminalWidth - len - 3
|
|
96
98
|
return ' '.repeat(Math.max(repeatLen, 0)) + '│'
|
|
97
99
|
}
|
|
98
100
|
|
|
99
101
|
console.log(startLine)
|
|
100
102
|
// header 行:│ > command │,下面跟一条分隔线
|
|
101
|
-
|
|
103
|
+
// 不传 extraFix:旧版传 2 是想多扣 2 格,实际让 header 右边框比 ┐ 早 3 格(扣 2 + 多扣 1)
|
|
104
|
+
console.log(`│ ${head}${padRight(headLabel)}`)
|
|
102
105
|
console.log(midLine)
|
|
103
106
|
// 内容行:│ content │
|
|
104
107
|
for (const line of content) {
|
package/src/utils/utils.test.js
CHANGED
|
@@ -13,10 +13,17 @@
|
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
//
|
|
15
15
|
// utils/index.js 中暴露的工具函数测试(node:test 内置)。
|
|
16
|
-
// 覆盖 truncateForHistory(surrogate-pair 安全截断)+ exec_exit(字符串 'false' 回归)
|
|
16
|
+
// 覆盖 truncateForHistory(surrogate-pair 安全截断)+ exec_exit(字符串 'false' 回归)
|
|
17
|
+
// + coloredLog 表格化输出的边框对齐。
|
|
17
18
|
import { test } from 'node:test'
|
|
18
19
|
import assert from 'node:assert/strict'
|
|
19
|
-
import
|
|
20
|
+
import chalk from 'chalk'
|
|
21
|
+
import stringWidth from 'string-width'
|
|
22
|
+
import { truncateForHistory, exec_exit, coloredLog } from './index.js'
|
|
23
|
+
|
|
24
|
+
// chalk 在非 TTY 下 level=0 会把所有着色降级为空串,影响 stripAnsi 后长度计算;
|
|
25
|
+
// 显式提升到 level=2 让 \x1b 序列可见但断言统一走 stripAnsi 拿纯文本。
|
|
26
|
+
chalk.level = 2
|
|
20
27
|
|
|
21
28
|
// ========== truncateForHistory ==========
|
|
22
29
|
|
|
@@ -197,4 +204,84 @@ test('exec_exit: undefined / null 不退出', () => {
|
|
|
197
204
|
} finally {
|
|
198
205
|
process.exit = original
|
|
199
206
|
}
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
// ========== coloredLog 表格边框对齐 ==========
|
|
210
|
+
//
|
|
211
|
+
// tableLog 复刻旧版 coloredLog 的盒式边框 ┌─┐│├─┤└─┘,每行显示宽 = terminalWidth。
|
|
212
|
+
// 历史 bug:header 行 `padRight(headLabel, 2)` 多扣了 2 字符 + 公式里 -3 多扣 1 字符,
|
|
213
|
+
// 导致右边框 │ 比顶边框 ┐ 早 3 格。回归测试:5 行显示宽必须相等。
|
|
214
|
+
//
|
|
215
|
+
// 关键:测试断言用显示宽(stringWidth),不是字符数(length)。
|
|
216
|
+
// "─" 在 string-width 库里按 1 字符计(等同 box-drawing 不是 CJK),
|
|
217
|
+
// 但中日韩是 2 字符。混排字符串的 length 和 stringWidth 不一致,
|
|
218
|
+
// 用 length 断言会把 "字符数 74 / 显示宽 80" 这种"终端上正确对齐"的行判失败。
|
|
219
|
+
|
|
220
|
+
const stripAnsi = (s) => String(s).replace(/\x1b\[[0-9;]*m/g, '')
|
|
221
|
+
// 显示宽(等同 string-width 库):中日韩 / emoji 计 2,其它 1。用于断言终端视觉对齐。
|
|
222
|
+
const displayWidth = (s) => stringWidth(stripAnsi(s))
|
|
223
|
+
|
|
224
|
+
function captureColoredLog(columns, headLabel, content) {
|
|
225
|
+
// tableLog 用 process.stdout.columns 定框宽,mock 一个确定值便于断言
|
|
226
|
+
const originalCols = Object.getOwnPropertyDescriptor(process.stdout, 'columns')
|
|
227
|
+
Object.defineProperty(process.stdout, 'columns', { value: columns, configurable: true })
|
|
228
|
+
const captured = []
|
|
229
|
+
const originalLog = console.log
|
|
230
|
+
console.log = (s) => { captured.push(String(s)) }
|
|
231
|
+
try {
|
|
232
|
+
coloredLog(headLabel, content)
|
|
233
|
+
} finally {
|
|
234
|
+
console.log = originalLog
|
|
235
|
+
if (originalCols) {
|
|
236
|
+
Object.defineProperty(process.stdout, 'columns', originalCols)
|
|
237
|
+
} else {
|
|
238
|
+
delete process.stdout.columns
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return captured
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
test('coloredLog: 五行显示宽相等,header 右边框与 ┐ 对齐(回归)', () => {
|
|
245
|
+
const lines = captureColoredLog(80, '> rev-parse --show-toplevel', 'D:/xz_workspace/ai-model-form')
|
|
246
|
+
// 4 行边框(顶/header/中/底)+ 1 行内容 = 5
|
|
247
|
+
assert.equal(lines.length, 5, `4 边框 + 1 内容 = 5,实际 ${lines.length}`)
|
|
248
|
+
const widths = lines.map(displayWidth)
|
|
249
|
+
// 5 行必须同显示宽,这样 │ 能竖直对齐 ┐ / ┘(等宽字体下显示宽相等 ⇒ 视觉对齐)
|
|
250
|
+
assert.ok(widths.every((w) => w === widths[0]),
|
|
251
|
+
`5 行显示宽应一致,实际: ${JSON.stringify(widths)}`)
|
|
252
|
+
assert.equal(widths[0], 80, `终端列 80 时框宽应为 80,实际: ${widths[0]}`)
|
|
253
|
+
// 顶/中/底:边框行(纯 ASCII)
|
|
254
|
+
assert.ok(stripAnsi(lines[0]).startsWith('┌'), `第 1 行应以 ┌ 开头: ${stripAnsi(lines[0])}`)
|
|
255
|
+
assert.ok(stripAnsi(lines[0]).endsWith('┐'), `第 1 行应以 ┐ 结尾: ${stripAnsi(lines[0])}`)
|
|
256
|
+
assert.ok(stripAnsi(lines[2]).startsWith('├'), `第 3 行应以 ├ 开头: ${stripAnsi(lines[2])}`)
|
|
257
|
+
assert.ok(stripAnsi(lines[2]).endsWith('┤'), `第 3 行应以 ┤ 结尾: ${stripAnsi(lines[2])}`)
|
|
258
|
+
assert.ok(stripAnsi(lines[4]).startsWith('└'), `第 5 行应以 └ 开头: ${stripAnsi(lines[4])}`)
|
|
259
|
+
assert.ok(stripAnsi(lines[4]).endsWith('┘'), `第 5 行应以 ┘ 结尾: ${stripAnsi(lines[4])}`)
|
|
260
|
+
// header / 内容:都是 │ ... │ 结构(关键回归点 — 旧版 header 行 │ 提前 3 格)
|
|
261
|
+
assert.ok(stripAnsi(lines[1]).startsWith('│'), `header 行应以 │ 开头: ${stripAnsi(lines[1])}`)
|
|
262
|
+
assert.ok(stripAnsi(lines[1]).endsWith('│'), `header 行应以 │ 结尾(必须对齐到 ┐): ${stripAnsi(lines[1])}`)
|
|
263
|
+
assert.ok(stripAnsi(lines[3]).startsWith('│'), `内容行应以 │ 开头: ${stripAnsi(lines[3])}`)
|
|
264
|
+
assert.ok(stripAnsi(lines[3]).endsWith('│'), `内容行应以 │ 结尾: ${stripAnsi(lines[3])}`)
|
|
265
|
+
})
|
|
266
|
+
|
|
267
|
+
test('coloredLog: terminalWidth 顶到上限 120 时仍等宽', () => {
|
|
268
|
+
// min(cols, 120) 触发:模拟大屏终端
|
|
269
|
+
const lines = captureColoredLog(200, '$ git status', 'On branch main\nnothing to commit')
|
|
270
|
+
// 边框 4 行(顶/header/中/底)+ 内容 2 行 = 6
|
|
271
|
+
assert.equal(lines.length, 6, `4 边框 + 2 内容 = 6,实际 ${lines.length}`)
|
|
272
|
+
const widths = lines.map(displayWidth)
|
|
273
|
+
assert.ok(widths.every((w) => w === widths[0]),
|
|
274
|
+
`所有行显示宽应一致,实际: ${JSON.stringify(widths)}`)
|
|
275
|
+
assert.equal(widths[0], 120, `上限 120 时框宽应为 120,实际: ${widths[0]}`)
|
|
276
|
+
})
|
|
277
|
+
|
|
278
|
+
test('coloredLog: 中文 header 宽度仍对齐(stringWidth 处理宽字符)', () => {
|
|
279
|
+
// 验证 stringWidth(text) 正确计算中日韩 / emoji 宽度。
|
|
280
|
+
// 关键:用显示宽断言,不用字符数 — "─" 当 1 字符,但中日韩是 2 字符,
|
|
281
|
+
// 字符数 != 显示宽。只有显示宽相等,终端才视觉对齐。
|
|
282
|
+
const lines = captureColoredLog(80, '> 中文命令 测试', '目录: D:/中文路径')
|
|
283
|
+
const widths = lines.map(displayWidth)
|
|
284
|
+
assert.ok(widths.every((w) => w === widths[0]),
|
|
285
|
+
`含中文的 5 行显示宽应一致,实际: ${JSON.stringify(widths)}`)
|
|
286
|
+
assert.equal(widths[0], 80, `中文场景下框宽应仍为 80,实际: ${widths[0]}`)
|
|
200
287
|
})
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import"./rolldown-runtime-BM3Ffeng.js";import{$ as e,$n as t,Dn as n,G as r,Nt as i,Pn as a,Qn as o,Tn as s,Tt as c,Un as l,Vn as u,Xn as d,_n as f,a as p,bn as m,cn as h,ct as g,dn as _,fn as v,gn as y,gr as b,i as x,lr as S,mt as C,nn as w,r as T,rn as E,sr as D,vr as O,yn as k,yr as A,zt as j}from"./element-plus--ayTjGvF.js";import{a as M,r as N,t as P}from"./vendor-DKiix7Qv.js";import{n as F,t as I}from"./_plugin-vue_export-helper-BpqSqjxA.js";import{t as L}from"./configStore-CqqnJlVS.js";var R=64*1024;function z(e){if(!e||!Array.isArray(e.messages))return[];let t=[],n=e.messages.length;for(let r=0;r<n;r++){let i=e.messages[r];if(i.role!==`system`){if(i.role===`user`){let e=``,n;if(typeof i.content==`string`)e=i.content;else if(Array.isArray(i.content)){e=i.content.filter(e=>e?.type===`text`).map(e=>e.text||``).join(` `);let t=i.content.filter(e=>e?.type===`image_url`&&typeof e.image_url?.url==`string`).map((e,t)=>({id:`att-${r}-${t}`,name:`image`,size:0,type:H(e.image_url?.url||``)||`image/*`,preview:e.image_url?.url}));t.length>0&&(n=t)}(e||n)&&t.push({id:`msg-${r}`,role:`user`,content:e,attachments:n,status:`done`,createdAt:Date.now()})}else if(i.role===`assistant`){let a=``;typeof i.content==`string`&&(a=i.content),a.length>R&&(a=`…(前文已截断)\n${a.slice(-R)}`);let o=[];if(i.tool_calls&&i.tool_calls.length>0)for(let e of i.tool_calls)o.push({id:e.id||e.function?.name||N(),name:e.function?.name||``,arguments:e.function?.arguments||``,argsPreview:B(e.function?.name||``,e.function?.arguments||``),status:`done`,result:``});let s=r+1;for(;s<n&&e.messages[s].role===`tool`;){let t=e.messages[s],n=t.tool_call_id||t.name||``,i=o.find(e=>e.id===n);if(i){let e=t.content;typeof e!=`string`&&(e=`(non-text result)`),e.length>R&&(e=`…(前文已截断)\n${e.slice(-R)}`),i.result=e}r=s,s++}let c=!!a,l=o.length>0;(c||l)&&t.push({id:`msg-${r}`,role:`assistant`,content:a||``,toolCalls:l?o:void 0,status:`done`,createdAt:Date.now()})}}}return t}function B(e,t){try{let n=JSON.parse(t);switch(e){case`run_command`:return String(n.command||``).slice(0,200);case`read_file`:case`write_file`:case`edit_file`:return String(n.path||``);case`list_files`:return String(n.path||`.`);case`search_text`:return String(n.pattern||``);default:return JSON.stringify(n).slice(0,200)}}catch{return t.slice(0,200)}}function V(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result||``)),r.onerror=()=>n(r.error||Error(`FileReader failed`)),r.readAsDataURL(e)})}function H(e){let t=/^data:([^;,]+)/.exec(e);return t?t[1]:``}function U(){let e=L(),t=S([]),n=S(!1),r=S(null),i=S([]),a=S(!1),o=S(!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){x.error(n.error||F(`@AGENT:加载会话列表失败`));return}t.value=Array.isArray(n.sessions)?n.sessions:[]}catch(e){if(r!==l)return;x.error(F(`@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){x.error(t.error||F(`@AGENT:加载会话失败`));return}i.value=z(t.session)}catch(e){x.error(F(`@AGENT:加载会话失败`)+`: `+(e?.message||e))}finally{o.value=!1}}async function f(e){try{await T.confirm(F(`@AGENT:确认删除该会话`),F(`@AGENT:删除后无法恢复`),{type:`warning`})}catch{return}try{let n=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`,{method:`DELETE`}).then(e=>e.json());if(!n.success){x.error(n.error||F(`@AGENT:删除失败`));return}t.value=t.value.filter(t=>t.sessionId!==e),r.value===e&&(r.value=null,i.value=[]),x.success(F(`@AGENT:已删除`))}catch(e){x.error(F(`@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){x.error(r.error||F(`@AGENT:重命名失败`));return}let i=t.value.find(t=>t.sessionId===e);i&&(i.title=n),x.success(F(`@AGENT:已重命名`))}catch(e){x.error(F(`@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&&x.warning(F(`@AGENT:仅支持发送图片,非图片文件已忽略`)),!t.trim()&&o.length===0||a.value)return;let l=(await Promise.allSettled(o.map(e=>V(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:N(),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=D({id:N(),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
|
-
`);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=P(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=D({id:i.toolCallId||N(),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=P(i.content||m.content);e.reasoning&&!m.reasoning&&(m.reasoning=e.reasoning),m.content=e.content,m.status=`done`,m.reasoningStatus===`streaming`&&(m.reasoningStatus=`done`);break}case`error`:m.status=`error`,m.error=String(i.error||F(`@AGENT:未知错误`)),m.reasoningStatus===`streaming`&&(m.reasoningStatus=`done`);break}}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
|
-
|
|
4
|
-
[`+F(`@AGENT:已停止`)+`]`,m.status=`done`,m.reasoningStatus===`streaming`&&(m.reasoningStatus=`done`)):(m.status=`error`,m.error=e?.message||String(e),x.error(m.error||F(`@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}}var W=n({__name:`AgentView`,setup(t,{expose:n}){n();let o=L(),{sessions:s,sessionsLoading:l,currentSessionId:u,messages:f,isStreaming:p,sessionLoading:m,loadSessions:h,loadSession:_,deleteSession:v,renameSession:b,newSession:E,sendMessage:D,stop:O}=U(),k=y(()=>{let e=o.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),A=S(``),N=y(()=>{if(!A.value.trim())return s.value;let e=A.value.toLowerCase();return s.value.filter(t=>(t.title||``).toLowerCase().includes(e)||(t.model||``).toLowerCase().includes(e))}),P=y(()=>[{id:`p1`,label:F(`@AGENT:查看项目结构`),prompt:F(`@AGENT:prompt_p1`)},{id:`p2`,label:F(`@AGENT:分析代码质量`),prompt:F(`@AGENT:prompt_p2`)},{id:`p3`,label:F(`@AGENT:帮我写测试`),prompt:F(`@AGENT:prompt_p3`)},{id:`p4`,label:F(`@AGENT:Git 状态检查`),prompt:F(`@AGENT:prompt_p4`)}]);async function I(e){await D(e.text,e.files),await a(),B()}async function R(e){await D(e.prompt),await a(),B()}let z=S(null);function B(e=!0){z.value?.scrollToBottom(e)}d(()=>f.value.length,()=>{a(()=>B(!1))});function V(e){if(p.value){x.warning(F(`@AGENT:请先停止当前生成`));return}_(e)}function H(){if(p.value){x.warning(F(`@AGENT:请先停止当前生成`));return}E()}function W(e,t){if(t.stopPropagation(),p.value&&u.value===e){x.warning(F(`@AGENT:请先停止当前生成`));return}v(e)}async function G(e,t,n){n.stopPropagation();try{let{value:n}=await T.prompt(F(`@AGENT:请输入新的会话标题`),F(`@AGENT:重命名会话`),{inputValue:t,inputPattern:/.+/,inputErrorMessage:F(`@AGENT:标题不能为空`)});n&&n!==t&&await b(e,n)}catch{}}function K(e){if(!e)return``;try{let t=new Date(e);if(Number.isNaN(t.getTime()))return e;let n=new Date,r=n.getTime()-t.getTime(),i=e=>String(e).padStart(2,`0`);if(t.toDateString()===n.toDateString())return`${i(t.getHours())}:${i(t.getMinutes())}`;if(r<10080*60*1e3){let e=Math.floor(r/(1440*60*1e3));return e===0?F(`@AGENT:今天`):`${e}${F(`@AGENT:天前`)}`}return`${t.getFullYear()}-${i(t.getMonth()+1)}-${i(t.getDate())}`}catch{return e}}let q=S(280),J=S(!1);function Y(e){J.value=!0;let t=e.clientX,n=q.value,r=e=>{let r=e.clientX-t;q.value=Math.max(200,Math.min(500,n+r))},i=()=>{J.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}d(()=>[o.currentDirectory,p.value],async([e],t)=>{(!t||e!==t[0])&&await h(),u.value&&!p.value&&!s.value.some(e=>e.sessionId===u.value)&&E()},{immediate:!0});let X={configStore:o,sessions:s,sessionsLoading:l,currentSessionId:u,messages:f,isStreaming:p,sessionLoading:m,loadSessions:h,loadSession:_,deleteSession:v,renameSession:b,newSession:E,sendMessage:D,stop:O,chatTheme:k,searchQuery:A,filteredSessions:N,presetQuestions:P,onSend:I,onSelectPreset:R,chatContainerRef:z,scrollToBottom:B,selectSession:V,handleNewSession:H,handleDelete:W,handleRename:G,formatDate:K,sidebarWidth:q,isResizing:J,startResize:Y,get $t(){return F},get ElTooltip(){return r},get ElIcon(){return w},get Plus(){return i},get Search(){return j},get Delete(){return g},get Edit(){return C},get ChatLineRound(){return e},get Loading(){return c},get ChatContainer(){return M}};return Object.defineProperty(X,`__isScriptSetup`,{enumerable:!1,value:!0}),X}}),G={class:`agent-view`},K={class:`sidebar-header`},q={class:`sidebar-search`},J=[`placeholder`],Y={class:`session-list`},X={key:0,class:`empty-state`},Z={class:`empty-text`},Q={key:0,class:`empty-hint`},$=[`onClick`],ee={class:`session-item-main`},te={class:`session-item-title`},ne={class:`session-item-meta`},re={class:`meta-time`},ie={class:`meta-count`},ae={key:0,class:`meta-source cli`},oe=[`onClick`],se=[`onClick`],ce={class:`agent-chat-area`},le={key:0,class:`chat-loading`},ue={key:0,class:`stop-button-bar`};function de(e,n,r,i,a,c){let d=p;return u(),m(`div`,G,[k(` ═══ 左侧:会话列表 ═══ `),f(`aside`,{class:`agent-sidebar`,style:O({width:i.sidebarWidth+`px`})},[k(` 顶部操作栏 `),f(`div`,K,[f(`button`,{class:`new-session-btn`,onClick:i.handleNewSession},[s(i.ElIcon,null,{default:o(()=>[s(i.Plus)]),_:1}),f(`span`,null,A(i.$t(`@AGENT:新建会话`)),1)])]),k(` 搜索框 `),f(`div`,q,[s(i.ElIcon,{class:`search-icon`},{default:o(()=>[s(i.Search)]),_:1}),t(f(`input`,{"onUpdate:modelValue":n[0]||=e=>i.searchQuery=e,placeholder:i.$t(`@AGENT:搜索会话...`),class:`search-input`,type:`text`},null,8,J),[[h,i.searchQuery]])]),k(` 会话列表 `),t((u(),m(`div`,Y,[i.filteredSessions.length===0&&!i.sessionsLoading?(u(),m(`div`,X,[s(i.ElIcon,{size:28,color:`var(--text-tertiary)`},{default:o(()=>[s(i.ChatLineRound)]),_:1}),f(`div`,Z,A(i.searchQuery?i.$t(`@AGENT:未找到匹配的会话`):i.$t(`@AGENT:暂无会话`)),1),i.searchQuery?k(`v-if`,!0):(u(),m(`div`,Q,A(i.$t(`@AGENT:点击上方按钮开始对话`)),1))])):k(`v-if`,!0),(u(!0),m(v,null,l(i.filteredSessions,e=>(u(),m(`div`,{key:e.sessionId,class:b([`session-item`,{active:i.currentSessionId===e.sessionId}]),onClick:t=>i.selectSession(e.sessionId)},[f(`div`,ee,[f(`div`,te,A(e.title||i.$t(`@AGENT:无标题`)),1),f(`div`,ne,[f(`span`,re,A(i.formatDate(e.updatedAt)),1),n[3]||=f(`span`,{class:`meta-dot`},`·`,-1),f(`span`,ie,A(e.messageCount)+` `+A(i.$t(`@AGENT:条`)),1),e.source===`cli`?(u(),m(`span`,ae,`CLI`)):k(`v-if`,!0)])]),f(`div`,{class:`session-item-actions`,onClick:n[1]||=_(()=>{},[`stop`])},[s(i.ElTooltip,{content:i.$t(`@AGENT:重命名`),placement:`top`,"show-after":500},{default:o(()=>[f(`button`,{class:`item-action-btn`,onClick:t=>i.handleRename(e.sessionId,e.title,t)},[s(i.ElIcon,null,{default:o(()=>[s(i.Edit)]),_:1})],8,oe)]),_:2},1032,[`content`]),s(i.ElTooltip,{content:i.$t(`@AGENT:删除`),placement:`top`,"show-after":500},{default:o(()=>[f(`button`,{class:`item-action-btn danger`,onClick:t=>i.handleDelete(e.sessionId,t)},[s(i.ElIcon,null,{default:o(()=>[s(i.Delete)]),_:1})],8,se)]),_:2},1032,[`content`])])],10,$))),128))])),[[d,i.sessionsLoading]])],4),k(` 拖拽分隔条 `),f(`div`,{class:b([`sidebar-resizer`,{active:i.isResizing}]),onMousedown:i.startResize},null,34),k(` ═══ 右侧:对话区域 ═══ `),f(`main`,ce,[k(` 加载中 `),i.sessionLoading?(u(),m(`div`,le,[s(i.ElIcon,{class:`is-loading`,size:32},{default:o(()=>[s(i.Loading)]),_:1}),f(`span`,null,A(i.$t(`@AGENT:加载会话中...`)),1)])):(u(),m(v,{key:1},[k(` ChatContainer `),s(i.ChatContainer,{ref:`chatContainerRef`,messages:i.messages,"preset-questions":i.presetQuestions,"welcome-title":i.$t(`@AGENT:智能体助手`),"welcome-description":i.$t(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":`g ai`,theme:i.chatTheme,disabled:i.isStreaming,"upload-config":{accept:`image/*`},placeholder:i.isStreaming?i.$t(`@AGENT:正在生成中...`):i.$t(`@AGENT:输入消息,Enter 发送`),onSend:i.onSend,onSelect:i.onSelectPreset},null,8,[`messages`,`preset-questions`,`welcome-title`,`welcome-description`,`theme`,`disabled`,`placeholder`])],2112)),k(` 停止按钮浮层 `),s(E,{name:`fade`},{default:o(()=>[i.isStreaming?(u(),m(`div`,ue,[f(`button`,{class:`stop-button`,onClick:n[2]||=(...e)=>i.stop&&i.stop(...e)},[s(i.ElIcon,null,{default:o(()=>[s(i.Loading,{class:`is-loading`})]),_:1}),f(`span`,null,A(i.$t(`@AGENT:停止生成`)),1)])])):k(`v-if`,!0)]),_:1})])])}var fe=I(W,[[`render`,de],[`__scopeId`,`data-v-bd681ddd`],[`__file`,`D:/xz_workspace/github_workspace/zen-gitsync/src/ui/client/src/views/AgentView.vue`]]);export{fe as default};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import"./rolldown-runtime-BM3Ffeng.js";import{Dn as e,G as t,Ln as n,M as r,Pn as i,Qn as a,Tn as o,Tt as s,U as c,Vn as l,Xn as u,_n as d,bn as f,gn as p,gr as m,i as h,lr as g,nn as _,nt as v,r as y,tt as b,vn as x,wn as S,yn as C,yr as w,zn as T}from"./element-plus--ayTjGvF.js";import{n as E,t as D}from"./_plugin-vue_export-helper-BpqSqjxA.js";async function O(e,t){let n=e.body.getReader(),r=new TextDecoder(`utf-8`),i=``;for(;;){let{done:e,value:a}=await n.read();if(e)break;i+=r.decode(a,{stream:!0});let o=i.split(`
|
|
2
|
-
`);i=o.pop()??``;for(let e of o)e.trim()&&t(e)}i.trim()&&t(i)}async function k(){let e=await fetch(`/api/app-version`);return e.ok?e.json():{success:!1,current:``,latest:null,hasUpdate:!1,error:`HTTP ${e.status}`}}async function A(e){let t=await fetch(`/api/app-upgrade`,{method:`POST`});if(!t.ok){let n=`HTTP ${t.status}`;try{let e=await t.json();e?.error&&(n=e.error)}catch{}e({type:`error`,message:n}),e({type:`done`,code:t.status});return}if(!t.body){e({type:`error`,message:`响应无 body`}),e({type:`done`,code:-1});return}await O(t,t=>{try{e(JSON.parse(t))}catch{}})}async function j(){let e=await fetch(`/api/app-restart`,{method:`POST`});if(!e.ok){let t=`HTTP ${e.status}`;try{let n=await e.json();n?.error&&(t=n.error)}catch{}throw Error(t)}if(!e.body)throw Error(`响应无 body`);return new Promise((t,n)=>{let r=!1,i=e=>{r||(r=!0,e())};O(e,e=>{try{let r=JSON.parse(e);r.type===`ready`&&typeof r.port==`number`&&r.port>0?i(()=>t(r.port)):r.type===`timeout`?i(()=>n(Error(`restart.timeout`))):r.type===`error`&&i(()=>n(Error(r.message||`restart.failed`)))}catch{}}).then(()=>{i(()=>n(Error(`restart.stream-closed`)))}).catch(()=>{})})}var M=e({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean,required:!0},logs:{type:String,required:!0},status:{type:String,required:!0},countdown:{type:Number,required:!1,default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(e,{expose:t,emit:n}){t();let r=e,a=n,o=g(null);u(()=>r.logs,async()=>{await i(),o.value&&(o.value.scrollTop=o.value.scrollHeight)});function c(){r.status!==`running`&&(r.status===`success`&&r.countdown>0&&a(`cancel`),a(`update:modelValue`,!1))}function l(){a(`retry`)}function d(){a(`restart`)}function f(){a(`cancel`),a(`update:modelValue`,!1)}let p={props:r,emit:a,logEl:o,close:c,onRetry:l,onRestart:d,onLater:f,get Loading(){return s},get CircleCheck(){return b},get CircleClose(){return v},get $t(){return E}};return Object.defineProperty(p,`__isScriptSetup`,{enumerable:!1,value:!0}),p}}),N={key:3},P={key:4},F={key:5},I={key:0,class:`upgrade-hint`},L={key:0,class:`upgrade-countdown`};function R(e,t,n,i,s,u){let p=_,h=c,g=r;return l(),x(g,{"model-value":n.modelValue,"onUpdate:modelValue":t[0]||=e=>i.emit(`update:modelValue`,e),title:i.$t(`@F13B4:升级`),width:`680px`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":n.status!==`running`,"append-to-body":``,onClose:i.close},{footer:a(()=>[n.status===`failed`?(l(),x(h,{key:0,type:`primary`,onClick:i.onRetry},{default:a(()=>[S(w(i.$t(`@F13B4:重试`)),1)]),_:1})):C(`v-if`,!0),n.status===`success`?(l(),x(h,{key:1,type:`primary`,onClick:i.onRestart},{default:a(()=>[S(w(i.$t(`@F13B4:立即重启并刷新`)),1)]),_:1})):C(`v-if`,!0),n.status===`success`?(l(),x(h,{key:2,onClick:i.onLater},{default:a(()=>[S(w(i.$t(`@F13B4:稍后手动重启`)),1)]),_:1})):C(`v-if`,!0),n.status===`running`?(l(),x(h,{key:3,disabled:``},{default:a(()=>[S(w(i.$t(`@F13B4:升级中`))+`... `,1)]),_:1})):C(`v-if`,!0)]),default:a(()=>[d(`div`,{class:m([`upgrade-status`,`is-${n.status}`])},[n.status===`running`?(l(),x(p,{key:0,class:`is-loading`},{default:a(()=>[o(i.Loading)]),_:1})):n.status===`success`?(l(),x(p,{key:1,color:`#67c23a`},{default:a(()=>[o(i.CircleCheck)]),_:1})):(l(),x(p,{key:2,color:`#f56c6c`},{default:a(()=>[o(i.CircleClose)]),_:1})),n.status===`running`?(l(),f(`span`,N,w(i.$t(`@F13B4:升级中`)),1)):n.status===`success`?(l(),f(`span`,P,w(i.$t(`@F13B4:升级完成`)),1)):(l(),f(`span`,F,w(i.$t(`@F13B4:升级失败`)),1))],2),n.status===`success`?(l(),f(`p`,I,[S(w(i.$t(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),n.countdown>0?(l(),f(`span`,L,w(i.$t(`@F13B4:{seconds} 秒后自动刷新`,{seconds:n.countdown})),1)):C(`v-if`,!0)])):C(`v-if`,!0),d(`pre`,{ref:`logEl`,class:`upgrade-log`},w(n.logs||i.$t(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}var z=D(M,[[`render`,R],[`__scopeId`,`data-v-bc566bba`],[`__file`,`D:/xz_workspace/github_workspace/zen-gitsync/src/ui/client/src/components/UpgradeDialog.vue`]]),B=`https://github.com/xz333221/zen-gitsync/releases`,V=5,H=`app-version-check`,U=3600*1e3,W=e({__name:`AppVersionBadge`,setup(e,{expose:t}){t();let r=`2.16.24`,i=g(r),a=p(()=>i.value||r),o=g(null),s=g(!1),c=g(``),l=g(`running`),u=g(0),d=null,f=g(!1);function m(){try{let e=sessionStorage.getItem(H);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>U?null:n}catch{return null}}function _(e){try{sessionStorage.setItem(H,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function v(e=!1){let t=m();t&&(o.value=t);try{let t=await k();o.value=t,_(t),t.current&&(i.value=t.current),!e&&t.success&&t.hasUpdate&&h({type:`success`,message:E(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||h({type:`warning`,message:E(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function b(){if(o.value?.hasUpdate){try{await y.confirm(E(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:o.value.current,latest:o.value.latest}),E(`@F13B4:升级`),{confirmButtonText:E(`@F13B4:确定升级`),cancelButtonText:E(`@F13B4:取消`),type:`info`})}catch{return}c.value=``,l.value=`running`,s.value=!0,await A(e=>{if(e.type===`done`){if(l.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(H)}catch{}o.value?.latest&&(i.value=o.value.latest),x()}}else e.message&&(c.value+=e.message)})}}function x(){S(),u.value=V,d=setInterval(()=>{--u.value,u.value<=0&&(d&&=(clearInterval(d),null),w())},1e3)}function S(){d&&=(clearInterval(d),null),u.value=0}function C(){S()}async function w(){if(S(),!f.value){f.value=!0;try{let e=await j(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];h({type:`warning`,message:n?E(n):E(`@F13B4:重启失败 {error}`,{error:t})}),f.value=!1}}}n(()=>{S()}),T(()=>{v(!0)});let D={buildVersion:r,releasesUrl:B,runtimeVersion:i,displayVersion:a,latestInfo:o,upgradeDialogVisible:s,upgradeLogs:c,upgradeStatus:l,AUTO_REFRESH_SECONDS:V,countdown:u,get countdownTimer(){return d},set countdownTimer(e){d=e},restartInFlight:f,CACHE_KEY:H,CACHE_TTL_MS:U,readCache:m,writeCache:_,checkUpdate:v,handleUpgrade:b,startAutoRefreshCountdown:x,cancelAutoRefreshCountdown:S,handleCancelAutoRefresh:C,handleRestart:w,get $t(){return E},UpgradeDialog:z};return Object.defineProperty(D,`__isScriptSetup`,{enumerable:!1,value:!0}),D}}),G={class:`app-version-badge`},K=[`aria-label`],q=[`aria-label`],J=[`title`,`aria-label`],Y={class:`upgrade-btn__label`},X={class:`upgrade-btn__version`};function Z(e,n,r,i,s,c){let u=t;return l(),f(`div`,G,[C(` GitHub 链接 `),o(u,{content:i.$t(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:a(()=>[d(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i.$t(`@F13B4:在 GitHub 上查看源码`)},n[1]||=[d(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[d(`path`,{d:`M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z`})],-1)],8,K)]),_:1},8,[`content`]),C(` NPM 链接 `),o(u,{content:i.$t(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:a(()=>[d(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i.$t(`@F13B4:在 npm 上查看包`)},n[2]||=[d(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[d(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)],8,q)]),_:1},8,[`content`]),C(` 版本号 `),o(u,{content:i.$t(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:a(()=>[d(`a`,{href:i.releasesUrl,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+w(i.displayVersion),1)]),_:1},8,[`content`]),i.latestInfo?.hasUpdate?(l(),f(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),"aria-label":i.$t(`@F13B4:发现新版本 {version},点击升级`,{version:i.latestInfo.latest??``}),onClick:i.handleUpgrade},[n[3]||=d(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),d(`span`,Y,w(i.$t(`@F13B4:升级`)),1),d(`span`,X,`v`+w(i.latestInfo.latest),1)],8,J)):C(`v-if`,!0),o(i.UpgradeDialog,{modelValue:i.upgradeDialogVisible,"onUpdate:modelValue":n[0]||=e=>i.upgradeDialogVisible=e,logs:i.upgradeLogs,status:i.upgradeStatus,countdown:i.countdown,onRetry:i.handleUpgrade,onRestart:i.handleRestart,onCancel:i.handleCancelAutoRefresh},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}var Q=D(W,[[`render`,Z],[`__scopeId`,`data-v-7e0300ec`],[`__file`,`D:/xz_workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AppVersionBadge.vue`]]);export{Q as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./rolldown-runtime-BM3Ffeng.js";import{Dn as e,E as t,It as n,Nt as r,Ot as i,Qn as a,S as o,T as s,Tn as c,Un as l,Vn as u,_n as d,bn as f,et as p,fn as m,gn as h,gr as g,lr as _,nn as v,q as y,un as b,vn as x,x as S,y as C,yn as w,yr as T}from"./element-plus--ayTjGvF.js";import{n as E,t as D}from"./_plugin-vue_export-helper-BpqSqjxA.js";import{t as O}from"./SvgIcon-BfPnov-Z.js";import{n as k,t as A}from"./CommonDialog-DfPvpafn.js";import{b as j}from"./index-BNymf6-p.js";var M=e({__name:`BranchSelector`,emits:[`branchChanged`],setup(e,{expose:t,emit:a}){t();let o=j(),s=a,c=_(!1),l=_(``),u=h(()=>{let e=l.value.trim().toLowerCase();return e?o.allBranches.filter(t=>t.toLowerCase().includes(e)):o.allBranches});async function d(e){if(e===o.currentBranch){c.value=!1;return}c.value=!1,await o.changeBranch(e)&&(s(`branchChanged`),o.refreshLog())}let f=_(!1),m=_(``),g=_(``);function v(){c.value=!1,g.value=o.currentBranch,f.value=!0}async function y(){await o.createBranch(m.value,g.value)&&(f.value=!1,m.value=``,s(`branchChanged`))}let b=_(!1);async function x(){if(!b.value){b.value=!0;try{await Promise.all([o.getCurrentBranch(!0),o.getBranchStatus(!0),o.getAllBranches()]),s(`branchChanged`),o.refreshLog()}finally{b.value=!1}}}let S={gitStore:o,emit:s,branchPopoverVisible:c,branchFilter:l,filteredBranches:u,selectBranch:d,createBranchDialogVisible:f,newBranchName:m,selectedBaseBranch:g,openCreateBranchDialog:v,createNewBranch:y,isRefreshingBranch:b,refreshCurrentBranch:x,get $t(){return E},get Plus(){return r},get Menu(){return i},get Check(){return p},get Refresh(){return n},CommonDialog:A,IconButton:k,SvgIcon:O};return Object.defineProperty(S,`__isScriptSetup`,{enumerable:!1,value:!0}),S}}),N={key:0,class:`branch-info`},P={class:`branch-wrapper`},F={class:`branch-btn`},I={class:`branch-btn-name`},L={class:`branch-btn-caret`},R={class:`branch-popover-inner`},z={class:`branch-search`},B={class:`branch-list`},V=[`onClick`],H={key:1,class:`branch-item-check-placeholder`},U={class:`branch-item-name`},W={key:0,class:`branch-empty`},G={class:`branch-popover-footer`},K={class:`create-branch-content`},q={class:`form-label`},J={class:`form-label`},Y={class:`dialog-footer`},X={class:`footer-actions`},Z=[`disabled`];function Q(e,n,r,i,p,h){let _=v,E=y,D=C,O=t,k=S,A=o,j=s;return i.gitStore.currentBranch?(u(),f(`div`,N,[d(`div`,P,[w(` VSCode 风格分支按钮 + 弹出列表 `),c(D,{visible:i.branchPopoverVisible,"onUpdate:visible":n[1]||=e=>i.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:n[2]||=e=>i.branchFilter=``},{reference:a(()=>[d(`button`,F,[c(i.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),d(`span`,I,T(i.gitStore.currentBranch),1),d(`span`,L,[c(_,null,{default:a(()=>n[7]||=[d(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[d(`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:a(()=>[d(`div`,R,[w(` 搜索框 `),d(`div`,z,[c(E,{modelValue:i.branchFilter,"onUpdate:modelValue":n[0]||=e=>i.branchFilter=e,placeholder:i.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),w(` 分支列表 `),d(`div`,B,[(u(!0),f(m,null,l(i.filteredBranches,e=>(u(),f(`div`,{key:e,class:g([`branch-item`,{"is-active":e===i.gitStore.currentBranch}]),onClick:t=>i.selectBranch(e)},[e===i.gitStore.currentBranch?(u(),x(_,{key:0,class:`branch-item-check`},{default:a(()=>[c(i.Check)]),_:1})):(u(),f(`span`,H)),c(i.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),d(`span`,U,T(e),1)],10,V))),128)),i.filteredBranches.length===0?(u(),f(`div`,W,T(i.$t(`@F13B4:没有匹配的分支`)),1)):w(`v-if`,!0)]),w(` 底部:创建新分支 `),d(`div`,G,[d(`button`,{class:`branch-create-btn`,onClick:i.openCreateBranchDialog},[c(_,null,{default:a(()=>[c(i.Plus)]),_:1}),d(`span`,null,T(i.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),w(` 刷新按钮 `),c(i.IconButton,{tooltip:i.$t(`@CMDCON:刷新`),onClick:i.refreshCurrentBranch},{default:a(()=>[c(_,{class:g({"is-loading":i.isRefreshingBranch})},{default:a(()=>[c(i.Refresh)]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),w(` 创建分支对话框 `),c(i.CommonDialog,{modelValue:i.createBranchDialogVisible,"onUpdate:modelValue":n[6]||=e=>i.createBranchDialogVisible=e,title:i.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:a(()=>[d(`div`,Y,[d(`div`,X,[d(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:n[5]||=e=>i.createBranchDialogVisible=!1},T(i.$t(`@F13B4:取消`)),1),d(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:i.createNewBranch,disabled:i.gitStore.isCreatingBranch},[i.gitStore.isCreatingBranch?(u(),x(_,{key:1,class:`is-loading`},{default:a(()=>n[8]||=[d(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[d(`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})):(u(),x(_,{key:0},{default:a(()=>[c(i.Check)]),_:1})),d(`span`,null,T(i.$t(`@F13B4:创建`)),1)],8,Z)])])]),default:a(()=>[d(`div`,K,[c(j,{model:{newBranchName:i.newBranchName,selectedBaseBranch:i.selectedBaseBranch},"label-position":`top`},{default:a(()=>[c(O,null,{label:a(()=>[d(`div`,q,[c(_,{class:`label-icon`},{default:a(()=>[c(i.Plus)]),_:1}),d(`span`,null,T(i.$t(`@F13B4:新分支名称`)),1)])]),default:a(()=>[c(E,{modelValue:i.newBranchName,"onUpdate:modelValue":n[3]||=e=>i.newBranchName=e,placeholder:i.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:b(i.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),c(O,null,{label:a(()=>[d(`div`,J,[c(_,{class:`label-icon`},{default:a(()=>[c(i.Menu)]),_:1}),d(`span`,null,T(i.$t(`@F13B4:基于分支`)),1)])]),default:a(()=>[c(A,{modelValue:i.selectedBaseBranch,"onUpdate:modelValue":n[4]||=e=>i.selectedBaseBranch=e,placeholder:i.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:a(()=>[(u(!0),f(m,null,l(i.gitStore.allBranches,e=>(u(),x(k,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):w(`v-if`,!0)}var $=D(M,[[`render`,Q],[`__scopeId`,`data-v-9548a76f`],[`__file`,`D:/xz_workspace/github_workspace/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{$ as default};
|