zen-gitsync 2.18.8 → 2.18.9
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/src/cli/ai/agent.js +7 -0
- package/src/cli/ai/runtime.test.js +22 -1
- package/src/cli/ai/tools.js +1 -1
- package/src/cli/ai/tools.test.js +1 -1
- package/src/cli/ai/transport.js +8 -3
- package/src/config.js +7 -5
- package/src/mcp/tools/workbench.js +1 -1
- package/src/ui/public/assets/{AgentView-DZx3n-So.css → AgentView-CV_8sYX6.css} +1 -1
- package/src/ui/public/assets/AgentView-DxmnqJxE.js +1 -0
- package/src/ui/public/assets/{AppVersionBadge-Bg5lrtKb.js → AppVersionBadge-C4OhcUi8.js} +2 -2
- package/src/ui/public/assets/{BranchSelector-CxjTqAkl.js → BranchSelector-CrLieQyJ.js} +1 -1
- package/src/ui/public/assets/{CommitForm-BWWrOvj5.js → CommitForm-KGQisnPQ.js} +2 -2
- package/src/ui/public/assets/{CommonDialog-x5jfL4Lq.js → CommonDialog-j_53ORvj.js} +1 -1
- package/src/ui/public/assets/CopySessionButton-y5Rzmact.js +20 -0
- package/src/ui/public/assets/EditorView-CkZb2kw5.js +1 -0
- package/src/ui/public/assets/{EditorView-BUiVsBv7.css → EditorView-Ims2BUK_.css} +1 -1
- package/src/ui/public/assets/{FlowExecutionViewer-BkZ20jxN.js → FlowExecutionViewer-CQ-TPhwF.js} +1 -1
- package/src/ui/public/assets/{FlowOrchestrationWorkspace-aZBYu29g.js → FlowOrchestrationWorkspace-BMQSVm3V.js} +1 -1
- package/src/ui/public/assets/{LogList-CSIbmUMK.js → LogList-BxH6QNlK.js} +4 -4
- package/src/ui/public/assets/{MindmapView-JYLp185X.js → MindmapView-D9_qjJsR.js} +1 -1
- package/src/ui/public/assets/{MonitorView-BS2Mh-I7.js → MonitorView-z_fsnE8Y.js} +1 -1
- package/src/ui/public/assets/{ProjectStartupButton-DAEP6ZU5.js → ProjectStartupButton-CFB_JpYG.js} +1 -1
- package/src/ui/public/assets/RecentDirectoriesChat-7fzSkSmc.css +1 -0
- package/src/ui/public/assets/RecentDirectoriesChat-BYI8lkjQ.js +1 -0
- package/src/ui/public/assets/{RemoteManagerDialog-aaNmsKpy.js → RemoteManagerDialog-DXDcN8e7.js} +1 -1
- package/src/ui/public/assets/{RemoteRepoCard-DndI8rNZ.js → RemoteRepoCard-C_TYGsXi.js} +1 -1
- package/src/ui/public/assets/{SourceMapView-BTD9-R8t.js → SourceMapView-D6cSweDt.js} +1 -1
- package/src/ui/public/assets/{SvgIcon-0n6uuKFm.js → SvgIcon-5AlG3IfR.js} +1 -1
- package/src/ui/public/assets/{UserInputNode-B-mDg9Wy.js → UserInputNode-BKP869D6.js} +1 -1
- package/src/ui/public/assets/WorkbenchView-D4UDurhF.js +6 -0
- package/src/ui/public/assets/WorkbenchView-DogERhHQ.css +1 -0
- package/src/ui/public/assets/{_plugin-vue_export-helper-C3o7kvRL.js → _plugin-vue_export-helper-Csn085FF.js} +4 -4
- package/src/ui/public/assets/agentConversations-DyzaxUXm.js +10 -0
- package/src/ui/public/assets/configStore-DOaPZ6Mq.js +1 -0
- package/src/ui/public/assets/index-C7Y9odvZ.js +57 -0
- package/src/ui/public/assets/index-NYzaTfbS.css +1 -0
- package/src/ui/public/assets/{useOrchestrator-CS9sn7nV.js → useOrchestrator-C236G5P5.js} +1 -1
- package/src/ui/public/index.html +6 -6
- package/src/ui/server/index.js +8 -0
- package/src/ui/server/routes/fileOpen.js +57 -1
- package/src/ui/server/routes/fileOpen.test.js +1 -1
- package/src/ui/server/routes/workbench/agentChat.js +70 -8
- package/src/ui/server/routes/workbench/agentChatExtensions.test.js +290 -0
- package/src/ui/server/routes/workbench/agentEngines.js +8 -4
- package/src/ui/server/routes/workbench/agentExtensions.js +157 -0
- package/src/ui/server/routes/workbench/agentMarketplace.js +12 -0
- package/src/ui/server/routes/workbench/agentParity.test.js +16 -0
- package/src/ui/server/routes/workbench/agentRoutes.js +82 -7
- package/src/ui/server/routes/workbench/agentRoutes.test.js +141 -1
- package/src/ui/server/routes/workbench/executorModels.js +30 -5
- package/src/ui/server/routes/workbench/executorModels.test.js +16 -4
- package/src/ui/server/routes/workbench/index.js +1 -1
- package/src/ui/server/routes/workbench/jobActivity.js +3 -3
- package/src/ui/server/routes/workbench/jobActivity.test.js +1 -0
- package/src/ui/server/routes/workbench/runExternalTurn.js +22 -25
- package/src/ui/server/routes/workbench/runExternalTurn.test.js +34 -0
- package/src/ui/server/routes/workbench/taskRunner.codebuddy.test.js +275 -0
- package/src/ui/server/routes/workbench/taskRunner.js +311 -24
- package/src/ui/server/routes/workbench/taskRunner.opencode.test.js +2 -1
- package/src/ui/public/assets/AgentView-BRAUZCtA.js +0 -1
- package/src/ui/public/assets/CopySessionButton-D0wFpk8a.js +0 -20
- package/src/ui/public/assets/EditorView-DmaGiI-z.js +0 -1
- package/src/ui/public/assets/RecentDirectoriesChat-B19uAf8k.css +0 -1
- package/src/ui/public/assets/RecentDirectoriesChat-CVFTShrU.js +0 -1
- package/src/ui/public/assets/WorkbenchView-CfSrCIbp.js +0 -8
- package/src/ui/public/assets/WorkbenchView-D6NRqZ5W.css +0 -1
- package/src/ui/public/assets/agentConversations-DpiGplZB.js +0 -8
- package/src/ui/public/assets/configStore-BdL3uW2E.js +0 -1
- package/src/ui/public/assets/index-BS7BDFG4.js +0 -57
- package/src/ui/public/assets/index-DwJWiCiN.css +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zen-gitsync",
|
|
3
|
-
"version": "2.18.
|
|
3
|
+
"version": "2.18.9",
|
|
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",
|
|
@@ -74,6 +74,7 @@
|
|
|
74
74
|
"verify:wb-card-cover:reverse": "node scripts/verify-wb-card-cover.cjs --reverse",
|
|
75
75
|
"verify:wb-list-view": "node scripts/verify-wb-list-view.cjs",
|
|
76
76
|
"verify:wb-executor-models": "node scripts/verify-wb-executor-models.cjs",
|
|
77
|
+
"verify:wb-codebuddy-env": "node scripts/verify-wb-codebuddy-env.mjs",
|
|
77
78
|
"verify:wb-task-sound": "node scripts/verify-wb-task-sound.cjs",
|
|
78
79
|
"verify:agent-ask-sound": "node scripts/verify-agent-ask-sound.cjs",
|
|
79
80
|
"verify:wb-proj-branch": "node scripts/verify-workbench-proj-branch.cjs",
|
package/src/cli/ai/agent.js
CHANGED
|
@@ -320,6 +320,9 @@ ${isWin ? `- 当前是 Windows cmd.exe,以下 Unix 命令**不存在**,用了必
|
|
|
320
320
|
|
|
321
321
|
# 输出
|
|
322
322
|
- 你的文本输出直接显示在用户终端,用简体中文交流
|
|
323
|
+
- 想让用户**看到**图(截图/图表/示意图),就在回答正文里写 Markdown 图片 \`\` ——
|
|
324
|
+
本机绝对路径、或相对当前工作目录的路径都可以,界面会自动加载渲染;
|
|
325
|
+
只贴一条路径、或把路径放进代码块,用户看到的只是一行字
|
|
323
326
|
- 完成任务后用一两句话汇报结果,不要复述过程细节`
|
|
324
327
|
}
|
|
325
328
|
return `You are "g ai" — the terminal coding agent built into the zen-gitsync CLI. You use tools to perform coding tasks on the user's real machine.
|
|
@@ -423,6 +426,10 @@ ${isWin ? `- This is Windows cmd.exe. The following Unix commands do NOT exist h
|
|
|
423
426
|
|
|
424
427
|
# Output
|
|
425
428
|
- Your text output goes straight to the user's terminal; reply in English
|
|
429
|
+
- To **show** the user an image (screenshot / chart / diagram), embed it in your reply as a Markdown
|
|
430
|
+
image \`\` — a local absolute path, or a path relative to the working directory,
|
|
431
|
+
both work and the UI loads and renders it; pasting a bare path, or wrapping it in a code block,
|
|
432
|
+
only shows the user a line of text
|
|
426
433
|
- Report results in one or two sentences; do not narrate the process`
|
|
427
434
|
}
|
|
428
435
|
|
|
@@ -60,7 +60,7 @@ test('unsupported stream_options retries once without requesting usage', async (
|
|
|
60
60
|
})
|
|
61
61
|
|
|
62
62
|
// 这两条关心的都是"失败时怎么收场",不是"重试几次" —— 一律 maxRetries: 0,
|
|
63
|
-
// 否则要真等退避(最多 10 次、单次封顶
|
|
63
|
+
// 否则要真等退避(最多 10 次、单次封顶 60s),一个用例就跑到分钟级。
|
|
64
64
|
// 重试本身的行为在文件末尾那组用例里单独验(那里注入 sleepFn,不真等)。
|
|
65
65
|
test('truncated streams do not yield executable tool calls', async () => {
|
|
66
66
|
await assert.rejects(streamChatOnce({ model, messages: [], maxRetries: 0, fetchFn: async () => response([
|
|
@@ -136,6 +136,27 @@ test('重试次数用尽后抛出最后一次的错误', async () => {
|
|
|
136
136
|
assert.equal(calls, 4, '首次 + 3 次重试')
|
|
137
137
|
})
|
|
138
138
|
|
|
139
|
+
test('重试退避是指数放慢、分钟级封顶(2026-10-12 口径:2s 起步 / 60s 封顶)', async () => {
|
|
140
|
+
// 每次都吐半截就断(可重试),注入 sleepFn 把每次退避的时长记下来,不真等。
|
|
141
|
+
// 钉这件事是因为 429 限流场景下亚秒级重试等于白刷请求 —— 用户看到的就是
|
|
142
|
+
// 重试提示连续弹。抖动区间是 exp/2 + random(exp/2),逐档断言落点。
|
|
143
|
+
const delays = []
|
|
144
|
+
await assert.rejects(streamChatOnce({
|
|
145
|
+
model, messages: [], maxRetries: 10,
|
|
146
|
+
fetchFn: async () => response([event({ choices: [{ delta: { content: '半截' } }] })]),
|
|
147
|
+
sleepFn: async ms => { delays.push(ms) },
|
|
148
|
+
}), /中断/)
|
|
149
|
+
assert.equal(delays.length, 10)
|
|
150
|
+
// exp = min(60s, 2s × 2^attempt):1~2s / 2~4s / 4~8s / 8~16s / 16~32s / 之后 30~60s
|
|
151
|
+
const bands = [[1000, 2000], [2000, 4000], [4000, 8000], [8000, 16000], [16000, 32000], [30000, 60000]]
|
|
152
|
+
for (let i = 0; i < 10; i++) {
|
|
153
|
+
const [lo, hi] = bands[Math.min(i, bands.length - 1)]
|
|
154
|
+
assert.ok(delays[i] >= lo && delays[i] <= hi,
|
|
155
|
+
`第 ${i + 1} 次退避 ${delays[i]}ms 不在 [${lo}, ${hi}] —— 退避口径被改了?`)
|
|
156
|
+
}
|
|
157
|
+
assert.ok(delays[0] >= 1000, '首次重试不再亚秒级')
|
|
158
|
+
})
|
|
159
|
+
|
|
139
160
|
test('4xx(重试也没用)不重试,网关原话照传', async () => {
|
|
140
161
|
let calls = 0
|
|
141
162
|
await assert.rejects(streamChatOnce({
|
package/src/cli/ai/tools.js
CHANGED
|
@@ -317,7 +317,7 @@ export const TOOL_DEFINITIONS = [
|
|
|
317
317
|
},
|
|
318
318
|
executor: {
|
|
319
319
|
type: 'string',
|
|
320
|
-
enum: ['claude', 'opencode', 'codex'],
|
|
320
|
+
enum: ['claude', 'opencode', 'codex', 'codebuddy'],
|
|
321
321
|
description: '用哪个本地 CLI 执行这条任务。不传则用控制台当前选中的执行器,再退到配置里的全局默认。',
|
|
322
322
|
},
|
|
323
323
|
auto_run: {
|
package/src/cli/ai/tools.test.js
CHANGED
|
@@ -347,7 +347,7 @@ test('dispatch_task schema 要求 text,并声明三条可选口径', async ()
|
|
|
347
347
|
const definition = TOOL_DEFINITIONS.find(tool => tool.function.name === 'dispatch_task')
|
|
348
348
|
assert.ok(definition, '工具表里必须有 dispatch_task —— 主 Agent 控制台的派发就靠它')
|
|
349
349
|
assert.deepEqual(definition.function.parameters.required, ['text'])
|
|
350
|
-
assert.deepEqual(definition.function.parameters.properties.executor.enum, ['claude', 'opencode', 'codex'])
|
|
350
|
+
assert.deepEqual(definition.function.parameters.properties.executor.enum, ['claude', 'opencode', 'codex', 'codebuddy'])
|
|
351
351
|
assert.ok(definition.function.parameters.properties.project_path)
|
|
352
352
|
assert.ok(definition.function.parameters.properties.auto_run)
|
|
353
353
|
assert.ok(definition.function.parameters.properties.use_default_prompt)
|
package/src/cli/ai/transport.js
CHANGED
|
@@ -18,12 +18,17 @@ const withoutStreamUsage = new Set()
|
|
|
18
18
|
// 判死的连接不再直接失败:交给下面这条自动重试接手,最多 MAX_LLM_RETRIES 次
|
|
19
19
|
// (口径对齐 Claude Code 的 MAX_RETRIES=10)。
|
|
20
20
|
//
|
|
21
|
+
// **退避是分钟级的(2026-10-12 改)**:基准 2s、封顶 60s。原先 500ms/30s,打
|
|
22
|
+
// 429 限流时前几次都在亚秒级重试 —— 限流窗口远长于这个间隔,等于白刷请求,
|
|
23
|
+
// 用户看到的是重试提示连续弹。现在第 1 次等 1~2s(网络闪断仍能快速自愈),
|
|
24
|
+
// 第 4 次起 8~16s+,第 6 次起稳定在分钟级,10 次全失败约 4~5 分钟收手。
|
|
25
|
+
//
|
|
21
26
|
// 外层的两个调用点(CLI 的 turn.js / Web 的 agentChat.js)通过 onRetry 拿到
|
|
22
27
|
// "这次尝试吐了哪些字"的快照,据此把界面上那半截丢掉再重来。
|
|
23
28
|
export const DEFAULT_IDLE_TIMEOUT_MS = 300_000
|
|
24
29
|
export const MAX_LLM_RETRIES = 10
|
|
25
|
-
const RETRY_BASE_DELAY_MS =
|
|
26
|
-
const RETRY_MAX_DELAY_MS =
|
|
30
|
+
const RETRY_BASE_DELAY_MS = 2_000
|
|
31
|
+
const RETRY_MAX_DELAY_MS = 60_000
|
|
27
32
|
|
|
28
33
|
// 值得再试一次的 HTTP 状态:限流 / 请求超时 / 服务端 5xx —— 都是"再试一次可能就好了"。
|
|
29
34
|
// 其余 4xx(400 参数错、401/403 鉴权、404 模型名不对、422 校验失败)再试十次也一样,
|
|
@@ -72,7 +77,7 @@ function isRetryable(err) {
|
|
|
72
77
|
return true
|
|
73
78
|
}
|
|
74
79
|
|
|
75
|
-
/** 指数退避 + 抖动;网关给了 Retry-After
|
|
80
|
+
/** 指数退避 + 抖动;网关给了 Retry-After 就听它的(封顶 2×RETRY_MAX_DELAY_MS,免得被一个 3600 挂住)。 */
|
|
76
81
|
function retryDelayMs(attempt, err) {
|
|
77
82
|
const exp = Math.min(RETRY_MAX_DELAY_MS, RETRY_BASE_DELAY_MS * 2 ** attempt)
|
|
78
83
|
const jittered = exp / 2 + Math.random() * (exp / 2)
|
package/src/config.js
CHANGED
|
@@ -77,9 +77,11 @@ function normalizeAiMaxToolIterations(value) {
|
|
|
77
77
|
return int;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
// 工作台任务执行器白名单。'claude' 是历史默认;'opencode' / 'codex'
|
|
81
|
-
//
|
|
82
|
-
|
|
80
|
+
// 工作台任务执行器白名单。'claude' 是历史默认;'opencode' / 'codex' / 'codebuddy'
|
|
81
|
+
// 为可选执行器(opencode run --format json / codex exec --json /
|
|
82
|
+
// codebuddy -p --output-format stream-json -y --port 0,模型都跟随各自 CLI 的配置)。
|
|
83
|
+
// ⚠️ taskRunner.js 里有一份同名单用于运行时分发(见那里的注释),加执行器两处都要改。
|
|
84
|
+
export const TASK_EXECUTORS = ['claude', 'opencode', 'codex', 'codebuddy'];
|
|
83
85
|
|
|
84
86
|
/**
|
|
85
87
|
* 规范化任务执行器。非法值返回 null(交给调用方取默认),不抛错 ——
|
|
@@ -294,7 +296,7 @@ const defaultConfig = {
|
|
|
294
296
|
// 见 workbench/chatPrompts.js)。空串 = 不注入。
|
|
295
297
|
// 归一化见 normalizeAgentDefaultPrompt。
|
|
296
298
|
agentDefaultPrompt: '',
|
|
297
|
-
// 工作台任务执行器(claude | opencode | codex)。全局配置,跨项目共享。
|
|
299
|
+
// 工作台任务执行器(claude | opencode | codex | codebuddy)。全局配置,跨项目共享。
|
|
298
300
|
// 决定「执行任务 / 执行子任务 / 从此处开始 / 简单任务续聊」这条链路
|
|
299
301
|
// 默认 spawn 哪个本地 CLI;执行入口可以按次覆盖(见 workbench 执行路由)。
|
|
300
302
|
taskExecutor: 'claude',
|
|
@@ -330,7 +332,7 @@ const defaultConfig = {
|
|
|
330
332
|
// 白名单式的默认空数组:以后新增工具默认就固定显示,不需要回头改默认值。
|
|
331
333
|
// 未勾选(= 落在本数组里)的工具连同未安装的一起收进顶栏右侧「更多」菜单。
|
|
332
334
|
headerToolsHidden: [],
|
|
333
|
-
// 工作台任务执行器「上次用过/选过的那个」(claude | opencode | codex),null = 还没选过,
|
|
335
|
+
// 工作台任务执行器「上次用过/选过的那个」(claude | opencode | codex | codebuddy),null = 还没选过,
|
|
334
336
|
// 回落顶层 taskExecutor(设置里配的默认值)。两者**故意分开**:后者是"配置的默认",
|
|
335
337
|
// 前者是"上次用的",语义不同,合并就再也分不清哪个是用户主动配的。
|
|
336
338
|
// 2026-09-30: 原先记在 localStorage(键 zen-gitsync-task-executor),而 GUI 每次启动都换一个
|
|
@@ -284,7 +284,7 @@ export const workbenchTools = [
|
|
|
284
284
|
properties: {
|
|
285
285
|
text: { type: 'string', description: '要派给那个项目的 agent 的完整指令' },
|
|
286
286
|
project_path: { type: 'string', description: '派到哪个项目目录(必须是已登记项目),不传则用控制台的默认目标' },
|
|
287
|
-
executor: { type: 'string', description: '可选,指定执行器(claude / codex / opencode / gai)' },
|
|
287
|
+
executor: { type: 'string', description: '可选,指定执行器(claude / codex / opencode / codebuddy / gai)' },
|
|
288
288
|
auto_run: { type: 'boolean', description: '是否建完就立刻执行,默认跟随控制台设置' },
|
|
289
289
|
use_default_prompt: { type: 'boolean', description: '是否拼上项目预设提示词,默认跟随控制台设置' },
|
|
290
290
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.marketplace-panel[data-v-536d7952]{background:var(--bg-container);flex-direction:column;height:100%;min-height:0;display:flex}.mp-toolbar[data-v-536d7952]{flex-shrink:0;align-items:center;gap:12px;padding:12px 16px 8px;display:flex}.mp-search[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);max-width:420px;height:32px;transition:border-color var(--transition-fast) ease;flex:1;align-items:center;gap:6px;padding:0 10px;display:flex}.mp-search[data-v-536d7952]:focus-within{border-color:var(--color-primary)}.mp-search .mp-search-icon[data-v-536d7952]{color:var(--text-meta);flex-shrink:0}.mp-search .mp-search-input[data-v-536d7952]{color:var(--text-primary);font-size:var(--font-size-mid);background:0 0;border:none;outline:none;flex:1;font-family:inherit}.mp-search .mp-search-input[data-v-536d7952]::placeholder{color:var(--text-meta)}.mp-target[data-v-536d7952]{flex-shrink:0}.mp-refresh[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);width:30px;height:30px;color:var(--text-secondary);cursor:pointer;transition:var(--transition-ui-fast);justify-content:center;align-items:center;display:flex}.mp-refresh[data-v-536d7952]:hover{color:var(--color-primary);border-color:var(--color-primary)}.mp-refresh.spinning svg[data-v-536d7952]{animation:.9s linear infinite mkt-spin-536d7952}@keyframes mkt-spin-536d7952{to{transform:rotate(360deg)}}.mp-toolbar-sub[data-v-536d7952]{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:12px;padding:0 16px 10px;display:flex}.mp-target-hint[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-meta)}.mp-target-hint b[data-v-536d7952]{color:var(--color-primary);font-weight:600}.mp-source-filter[data-v-536d7952]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.mp-chip[data-v-536d7952]{font-size:var(--font-size-sm);border:1px solid var(--border-color);border-radius:var(--radius-xl);color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:2px 10px;font-family:inherit}.mp-chip[data-v-536d7952]:hover{color:var(--text-secondary);border-color:var(--text-tertiary)}.mp-chip.active[data-v-536d7952]{color:var(--color-primary);border-color:var(--color-primary);background:color-mix(in srgb, var(--color-primary) 8%, transparent)}.mp-chip.clear[data-v-536d7952]{color:var(--text-meta);border-style:dashed}.mp-body[data-v-536d7952]{flex:1;min-height:0;padding:0 16px 20px;overflow-y:auto}.mp-group[data-v-536d7952]{margin-bottom:20px}.mp-group.installed[data-v-536d7952]{border-top:1px dashed var(--border-color);padding-top:14px}.mp-group-header[data-v-536d7952]{align-items:center;gap:8px;margin-bottom:10px;display:flex}.mp-group-title[data-v-536d7952]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mp-group-count[data-v-536d7952]{min-width:20px;height:18px;font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-meta);justify-content:center;align-items:center;padding:0 6px;display:inline-flex}.mp-group-error[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--color-warning-dark);align-items:center;gap:4px;display:inline-flex}.mp-group-link[data-v-536d7952]{color:var(--text-meta);transition:color var(--transition-fast) ease;display:inline-flex}.mp-group-link[data-v-536d7952]:hover{color:var(--color-primary)}.mp-grid[data-v-536d7952]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;display:grid}.mp-card[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);transition:border-color var(--transition-fast) ease, box-shadow var(--transition-fast) ease;flex-direction:column;gap:6px;padding:12px;display:flex}.mp-card[data-v-536d7952]:hover{border-color:color-mix(in srgb, var(--color-primary) 40%, var(--border-color));box-shadow:var(--shadow-sm)}.mp-card-head[data-v-536d7952]{align-items:center;gap:8px;display:flex}.mp-card-name[data-v-536d7952]{min-width:0;font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-weight:600;overflow:hidden}.mp-card-metric[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);flex-shrink:0;align-items:center;gap:3px;display:inline-flex}.mp-card-desc[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:36px;margin:0;line-height:1.5;display:-webkit-box;overflow:hidden}.mp-card-meta[data-v-536d7952]{flex-wrap:wrap;align-items:center;gap:6px;min-height:18px;display:flex}.mp-meta-pkg[data-v-536d7952],.mp-meta-repo[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;max-width:220px;overflow:hidden}.mp-tag[data-v-536d7952]{font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-meta);flex-shrink:0;padding:1px 6px}.mp-tag.remote[data-v-536d7952]{background:color-mix(in srgb, var(--color-info,var(--action-teal)) 14%, transparent);color:var(--color-info,var(--action-teal))}.mp-tag.warn[data-v-536d7952]{background:color-mix(in srgb, var(--color-warning) 14%, transparent);color:var(--color-warning-dark)}.mp-card-foot[data-v-536d7952]{align-items:center;gap:8px;margin-top:2px;display:flex}.mp-card-link[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);text-decoration:none}.mp-card-link[data-v-536d7952]:hover{color:var(--color-primary);text-decoration:underline}.mp-foot-spacer[data-v-536d7952]{flex:1}.mp-install-btn[data-v-536d7952]{font-size:var(--font-size-sm);border:1px solid var(--color-primary);border-radius:var(--radius-base);color:var(--color-primary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:4px 14px;font-family:inherit}.mp-install-btn[data-v-536d7952]:hover:not(:disabled){background:var(--color-primary);color:#fff}.mp-install-btn[data-v-536d7952]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-installed-chip[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--color-success,var(--action-emerald));align-items:center;gap:3px;display:inline-flex}.mp-not-installable[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta)}.mp-empty[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-meta);padding:16px 0}.mp-empty.all[data-v-536d7952]{text-align:center;padding:48px 0}.mp-installed-block[data-v-536d7952]{margin-bottom:12px}.mp-installed-target[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px;font-weight:600}.mp-installed-list[data-v-536d7952]{flex-direction:column;gap:4px;display:flex}.mp-installed-row[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-base);background:var(--bg-panel);align-items:center;gap:10px;padding:6px 10px;display:flex}.mp-installed-name[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:500;overflow:hidden}.mp-installed-id[data-v-536d7952]{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;max-width:40%;overflow:hidden}.mp-reveal-btn[data-v-536d7952],.mp-remove-btn[data-v-536d7952]{font-size:var(--font-size-xs);border:1px solid var(--border-color);border-radius:var(--radius-xs);color:var(--text-meta);cursor:pointer;white-space:nowrap;transition:var(--transition-ui-fast);background:0 0;align-items:center;gap:4px;padding:3px 10px;font-family:inherit;display:inline-flex}.mp-reveal-btn[data-v-536d7952]:disabled,.mp-remove-btn[data-v-536d7952]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-reveal-btn[data-v-536d7952]:hover:not(:disabled){color:var(--text-primary);border-color:var(--text-tertiary)}.mp-remove-btn[data-v-536d7952]:hover:not(:disabled){color:var(--color-danger-dark);border-color:var(--color-danger)}@media (prefers-reduced-motion:reduce){.mp-refresh.spinning svg[data-v-536d7952]{animation:none}}.mkt-form[data-v-536d7952]{flex-direction:column;gap:12px;display:flex}.mkt-form-name[data-v-536d7952]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mkt-field[data-v-536d7952]{flex-direction:column;gap:4px;display:flex}.mkt-field label[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:600}.mkt-field input[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-container);height:30px;color:var(--text-primary);font-size:var(--font-size-mid);transition:border-color var(--transition-fast) ease;padding:0 8px;font-family:inherit}.mkt-field input[data-v-536d7952]:focus{border-color:var(--color-primary);outline:none}.mkt-hint[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0}.mkt-cancel[data-v-536d7952],.mkt-confirm[data-v-536d7952]{font-size:var(--font-size-mid);border-radius:var(--radius-base);cursor:pointer;transition:var(--transition-ui-fast);padding:6px 16px;font-family:inherit}.mkt-cancel[data-v-536d7952]{border:1px solid var(--border-color);color:var(--text-secondary);background:0 0;margin-right:8px}.mkt-cancel[data-v-536d7952]:hover{color:var(--text-primary);border-color:var(--text-tertiary)}.mkt-confirm[data-v-536d7952]{border:1px solid var(--color-primary);background:var(--color-primary);color:#fff}.mkt-confirm[data-v-536d7952]:hover{opacity:.9}.schedule-panel[data-v-75be84e5]{flex-direction:column;flex:1;gap:12px;min-height:0;padding:16px 20px 24px;display:flex;overflow-y:auto}.schedule-toolbar[data-v-75be84e5]{justify-content:space-between;align-items:center;gap:12px;display:flex}.schedule-summary[data-v-75be84e5]{color:var(--text-secondary);font-size:12px}.schedule-error[data-v-75be84e5]{color:var(--text-danger);background:color-mix(in srgb, var(--color-danger) 8%, transparent);border:1px solid color-mix(in srgb, var(--color-danger) 25%, transparent);border-radius:6px;padding:8px 10px;font-size:12px}.schedule-loading[data-v-75be84e5],.schedule-empty[data-v-75be84e5]{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:40px 20px;font-size:13px;display:flex}.schedule-empty-title[data-v-75be84e5]{color:var(--text-primary);margin:0;font-size:14px;font-weight:500}.schedule-empty-desc[data-v-75be84e5]{text-align:center;max-width:440px;color:var(--text-tertiary);margin:0;font-size:12px;line-height:1.7}.schedule-list[data-v-75be84e5]{flex-direction:column;gap:8px;display:flex}.schedule-card[data-v-75be84e5]{background:var(--bg-card);border:1px solid var(--border-color);border-radius:8px;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px;transition:border-color .15s,background .15s;display:flex}.schedule-card[data-v-75be84e5]:hover{border-color:var(--border-color-medium)}.schedule-card.is-running[data-v-75be84e5]{border-color:var(--tint-primary-35);background:var(--tint-primary-04)}.schedule-card.is-disabled .schedule-name[data-v-75be84e5]{color:var(--text-secondary)}.schedule-card-body[data-v-75be84e5]{flex-direction:column;gap:4px;min-width:0;display:flex}.schedule-card-head[data-v-75be84e5]{align-items:center;gap:8px;min-width:0;display:flex}.schedule-name[data-v-75be84e5]{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.schedule-running[data-v-75be84e5]{color:var(--color-primary);background:var(--tint-primary-10);white-space:nowrap;border-radius:4px;padding:1px 6px;font-size:11px}.schedule-card-sub[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;align-items:center;gap:6px;min-width:0;font-size:12px;display:flex;overflow:hidden}.schedule-desc[data-v-75be84e5]{text-overflow:ellipsis;overflow:hidden}.schedule-sep[data-v-75be84e5]{color:var(--text-tertiary)}.schedule-last[data-v-75be84e5]{text-overflow:ellipsis;overflow:hidden}.schedule-last.is-ok[data-v-75be84e5]{color:var(--text-success)}.schedule-last.is-error[data-v-75be84e5]{color:var(--text-danger)}.schedule-last.is-skipped[data-v-75be84e5]{color:var(--text-warning)}.schedule-last.is-muted[data-v-75be84e5]{color:var(--text-tertiary)}.sch-link[data-v-75be84e5]{color:var(--color-primary);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px}.sch-link[data-v-75be84e5]:hover{text-decoration:underline}.schedule-card-side[data-v-75be84e5]{flex-shrink:0;align-items:center;gap:12px;display:flex}.schedule-next[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.schedule-next.is-muted[data-v-75be84e5]{color:var(--text-tertiary)}.schedule-actions[data-v-75be84e5]{align-items:center;gap:2px;display:flex}.sch-switch[data-v-75be84e5]{border:1px solid var(--border-color-medium);background:var(--bg-subtle);cursor:pointer;border-radius:10px;flex-shrink:0;width:34px;height:20px;padding:0;transition:background .15s,border-color .15s;position:relative}.sch-switch .sch-switch-knob[data-v-75be84e5]{background:var(--text-tertiary);border-radius:50%;width:14px;height:14px;transition:transform .15s,background .15s;position:absolute;top:2px;left:2px}.sch-switch.on[data-v-75be84e5]{background:var(--tint-primary-18);border-color:var(--tint-primary-45)}.sch-switch.on .sch-switch-knob[data-v-75be84e5]{background:var(--color-primary);transform:translate(14px)}.sch-btn[data-v-75be84e5]{border:1px solid var(--border-color);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:6px;padding:3px 10px;font-size:12px;transition:background .15s,color .15s,border-color .15s}.sch-btn[data-v-75be84e5]:hover:not(:disabled){background:var(--bg-subtle-hover);color:var(--text-primary);border-color:var(--border-color-medium)}.sch-btn[data-v-75be84e5]:disabled{opacity:.5;cursor:default}.sch-btn-primary[data-v-75be84e5]{background:var(--tint-primary-10);border-color:var(--tint-primary-35);color:var(--color-primary)}.sch-btn-primary[data-v-75be84e5]:hover:not(:disabled){background:var(--tint-primary-18);color:var(--color-primary);border-color:var(--tint-primary-45)}.sch-btn-danger[data-v-75be84e5]{color:var(--text-danger)}.sch-btn-danger[data-v-75be84e5]:hover:not(:disabled){background:color-mix(in srgb, var(--color-danger) 8%, transparent);color:var(--text-danger);border-color:color-mix(in srgb, var(--color-danger) 30%, transparent)}.sch-form[data-v-75be84e5]{flex-direction:column;gap:14px;display:flex}.sch-field[data-v-75be84e5]{flex-direction:column;gap:6px;display:flex}.sch-field-label[data-v-75be84e5]{color:var(--text-secondary);font-size:12px}.sch-input[data-v-75be84e5]{box-sizing:border-box;width:100%;color:var(--text-primary);background:var(--bg-container);border:1px solid var(--border-color-medium);border-radius:6px;outline:none;padding:6px 10px;font-family:inherit;font-size:13px;transition:border-color .15s}.sch-input[data-v-75be84e5]:focus{border-color:var(--tint-primary-55)}.sch-select[data-v-75be84e5]{cursor:pointer}.sch-select-sm[data-v-75be84e5]{width:auto;min-width:64px}.sch-input-cron[data-v-75be84e5]{font-family:var(--font-mono,monospace)}.sch-textarea[data-v-75be84e5]{resize:vertical;min-height:72px;line-height:1.6}.sch-freq-row[data-v-75be84e5]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.sch-inline-label[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.sch-hint[data-v-75be84e5]{color:var(--text-tertiary);font-size:11px}.sch-radio-row[data-v-75be84e5]{flex-wrap:wrap;align-items:center;gap:16px;display:flex}.sch-radio[data-v-75be84e5]{color:var(--text-secondary);cursor:pointer;align-items:center;gap:6px;font-size:12px;display:inline-flex}.sch-radio input[data-v-75be84e5]{accent-color:var(--color-primary);cursor:pointer;margin:0}.sch-form-error[data-v-75be84e5]{color:var(--text-danger);margin:0;font-size:12px}.sch-form-footer[data-v-75be84e5]{justify-content:flex-end;gap:8px;margin-top:14px;display:flex}.sch-confirm-text[data-v-75be84e5]{color:var(--text-primary);margin:0;font-size:13px;line-height:1.7}.aps[data-v-ae77c09c]{background:var(--bg-container);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.aps__scroll[data-v-ae77c09c]{flex-direction:column;flex:1;gap:14px;max-width:860px;min-height:0;padding:16px 18px 24px;line-height:1.5;display:flex;overflow-y:auto}.aps__head[data-v-ae77c09c]{flex-direction:column;gap:5px;display:flex}.aps__title[data-v-ae77c09c]{font-size:var(--font-size-lg);color:var(--text-primary);margin:0;font-weight:600}.aps__intro[data-v-ae77c09c]{font-size:var(--font-size-sm);color:var(--text-meta);margin:0;line-height:1.6}.aps__card[data-v-ae77c09c]{background:var(--bg-panel);border:1px solid var(--border-color);border-radius:var(--radius-lg);flex-direction:column;gap:9px;padding:14px 16px;display:flex}.aps__card-head[data-v-ae77c09c]{align-items:baseline;gap:8px;display:flex}.aps__card-title[data-v-ae77c09c]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.aps__label[data-v-ae77c09c]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:500}.aps__count[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta);font-variant-numeric:tabular-nums;margin-left:auto}.aps__field[data-v-ae77c09c]{flex-direction:column;gap:5px;display:flex}.aps__hint[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0;line-height:1.6}.aps__area[data-v-ae77c09c]{box-sizing:border-box;resize:vertical;width:100%;min-height:92px;max-height:320px;font-size:var(--font-size-mid);color:var(--text-primary);background:var(--bg-subtle);border:1px solid var(--border-color);border-radius:var(--radius-md);transition:border-color var(--transition-fast) var(--ease-custom);outline:none;padding:7px 9px;font-family:inherit;line-height:1.5}.aps__area[data-v-ae77c09c]:focus{border-color:var(--color-primary)}.aps__area[data-v-ae77c09c]::placeholder{color:var(--text-meta)}.aps__area[data-v-ae77c09c]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.aps__foot[data-v-ae77c09c]{align-items:center;gap:8px;display:flex}.aps__spacer[data-v-ae77c09c]{flex:1}.aps__saved[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta)}.aps__btn[data-v-ae77c09c]{color:var(--text-secondary);font-size:var(--font-size-sm);border-radius:var(--radius-md);cursor:pointer;transition:color var(--transition-fast) var(--ease-custom), background var(--transition-fast) var(--ease-custom);background:0 0;border:none;padding:0 12px;line-height:28px}.aps__btn[data-v-ae77c09c]:hover:not(:disabled){color:var(--color-primary);background:var(--bg-container-hover)}.aps__btn[data-v-ae77c09c]:disabled{opacity:var(--disabled-opacity);cursor:default}.aps__btn[data-v-ae77c09c]:focus-visible{outline:var(--focus-outline);outline-offset:1px}.aps__btn--primary[data-v-ae77c09c]{background:var(--color-primary);color:#fff}.aps__btn--primary[data-v-ae77c09c]:hover:not(:disabled){background:var(--color-primary);color:#fff;opacity:.88}.agent-view[data-v-287616d8]{background:var(--bg-container);height:100%;min-height:0;display:flex}.agent-sidebar[data-v-287616d8]{background:var(--bg-panel);border-right:1px solid var(--border-color);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.agent-conversations[data-v-287616d8]{flex:1;min-height:0;padding:10px 6px 8px 12px}.sidebar-resizer[data-v-287616d8]{cursor:col-resize;width:4px;transition:background var(--transition-fast) ease;background:0 0;flex-shrink:0}.sidebar-resizer[data-v-287616d8]:hover,.sidebar-resizer.active[data-v-287616d8]{background:var(--color-primary);opacity:.3}.agent-chat-area[data-v-287616d8]{flex-direction:column;flex:1;min-width:0;display:flex;position:relative;overflow:hidden}.agent-engine[data-v-287616d8]{margin-bottom:7px;margin-left:auto}.agent-copy[data-v-287616d8]{margin-bottom:7px;margin-left:2px}.agent-tabs[data-v-287616d8]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:4px;padding:8px 12px 0;display:flex}.agent-tab[data-v-287616d8]{color:var(--text-meta);font-size:var(--font-size-mid);cursor:pointer;transition:color var(--transition-fast) ease, border-color var(--transition-fast) ease, background var(--transition-fast) ease;border-radius:var(--radius-base) var(--radius-base) 0 0;background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:7px 14px 9px;font-family:inherit;display:inline-flex}.agent-tab[data-v-287616d8]:hover{color:var(--text-secondary);background:var(--bg-hover)}.agent-tab.active[data-v-287616d8]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:600}.agent-tab-body[data-v-287616d8]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-pane[data-v-287616d8]{flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.agent-tab-body[data-v-287616d8]>.marketplace-panel{flex:1;min-height:0}.chat-loading[data-v-287616d8]{color:var(--text-meta);font-size:var(--font-size-base);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}.agent-list-page[data-v-287616d8]{background:var(--bg-panel);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-list-page .agent-conversations[data-v-287616d8]{padding:12px 12px 10px 14px}.agent-page-bar[data-v-287616d8]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 12px 0 6px;display:flex}.agent-page-back[data-v-287616d8]{border-radius:var(--radius-xs);width:24px;height:24px;color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.agent-page-back[data-v-287616d8]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-page-title[data-v-287616d8]{min-width:0;font-size:var(--font-size-mid);color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.agent-chat-host[data-v-287616d8]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-host[data-v-287616d8] .acu-avatar--left{background:0 0}.agent-chat-host[data-v-287616d8] .acu-bubble-row.is-assistant .acu-bubble-main{width:var(--acu-bubble-max-width);max-width:var(--acu-bubble-max-width);position:relative}.agent-chat-host[data-v-287616d8] .acu-bubble-row.is-assistant .acu-bubble{align-self:flex-start}.agent-chat-host[data-v-287616d8] .acu-message-meta{margin:0;position:absolute;top:0;right:0}.agent-chat-host[data-v-287616d8] .acu-input-queue{--acu-queue-edge:var(--role-pending-edge);--acu-queue-surface:var(--role-pending-surface);--acu-queue-ink:var(--role-pending-ink);--acu-queue-wash:var(--role-pending-wash)}.agent-chat-host[data-v-287616d8] .acu-welcome-logo{background:var(--welcome-avatar) center/46px 46px no-repeat;width:56px;height:56px;box-shadow:none}.agent-chat-host[data-v-287616d8] .acu-welcome-logo>svg{display:none}.agent-chat-host[data-v-287616d8] .acu-welcome-grid{flex-wrap:wrap;display:flex}.agent-chat-host[data-v-287616d8] .acu-welcome-grid>.acu-preset-q{flex:260px;min-width:0}[data-theme=dark]{background:var(--bg-panel)}
|
|
1
|
+
.marketplace-panel[data-v-536d7952]{background:var(--bg-container);flex-direction:column;height:100%;min-height:0;display:flex}.mp-toolbar[data-v-536d7952]{flex-shrink:0;align-items:center;gap:12px;padding:12px 16px 8px;display:flex}.mp-search[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);max-width:420px;height:32px;transition:border-color var(--transition-fast) ease;flex:1;align-items:center;gap:6px;padding:0 10px;display:flex}.mp-search[data-v-536d7952]:focus-within{border-color:var(--color-primary)}.mp-search .mp-search-icon[data-v-536d7952]{color:var(--text-meta);flex-shrink:0}.mp-search .mp-search-input[data-v-536d7952]{color:var(--text-primary);font-size:var(--font-size-mid);background:0 0;border:none;outline:none;flex:1;font-family:inherit}.mp-search .mp-search-input[data-v-536d7952]::placeholder{color:var(--text-meta)}.mp-target[data-v-536d7952]{flex-shrink:0}.mp-refresh[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);width:30px;height:30px;color:var(--text-secondary);cursor:pointer;transition:var(--transition-ui-fast);justify-content:center;align-items:center;display:flex}.mp-refresh[data-v-536d7952]:hover{color:var(--color-primary);border-color:var(--color-primary)}.mp-refresh.spinning svg[data-v-536d7952]{animation:.9s linear infinite mkt-spin-536d7952}@keyframes mkt-spin-536d7952{to{transform:rotate(360deg)}}.mp-toolbar-sub[data-v-536d7952]{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:12px;padding:0 16px 10px;display:flex}.mp-target-hint[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-meta)}.mp-target-hint b[data-v-536d7952]{color:var(--color-primary);font-weight:600}.mp-source-filter[data-v-536d7952]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.mp-chip[data-v-536d7952]{font-size:var(--font-size-sm);border:1px solid var(--border-color);border-radius:var(--radius-xl);color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:2px 10px;font-family:inherit}.mp-chip[data-v-536d7952]:hover{color:var(--text-secondary);border-color:var(--text-tertiary)}.mp-chip.active[data-v-536d7952]{color:var(--color-primary);border-color:var(--color-primary);background:color-mix(in srgb, var(--color-primary) 8%, transparent)}.mp-chip.clear[data-v-536d7952]{color:var(--text-meta);border-style:dashed}.mp-body[data-v-536d7952]{flex:1;min-height:0;padding:0 16px 20px;overflow-y:auto}.mp-group[data-v-536d7952]{margin-bottom:20px}.mp-group.installed[data-v-536d7952]{border-top:1px dashed var(--border-color);padding-top:14px}.mp-group-header[data-v-536d7952]{align-items:center;gap:8px;margin-bottom:10px;display:flex}.mp-group-title[data-v-536d7952]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mp-group-count[data-v-536d7952]{min-width:20px;height:18px;font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-meta);justify-content:center;align-items:center;padding:0 6px;display:inline-flex}.mp-group-error[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--color-warning-dark);align-items:center;gap:4px;display:inline-flex}.mp-group-link[data-v-536d7952]{color:var(--text-meta);transition:color var(--transition-fast) ease;display:inline-flex}.mp-group-link[data-v-536d7952]:hover{color:var(--color-primary)}.mp-grid[data-v-536d7952]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;display:grid}.mp-card[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);transition:border-color var(--transition-fast) ease, box-shadow var(--transition-fast) ease;flex-direction:column;gap:6px;padding:12px;display:flex}.mp-card[data-v-536d7952]:hover{border-color:color-mix(in srgb, var(--color-primary) 40%, var(--border-color));box-shadow:var(--shadow-sm)}.mp-card-head[data-v-536d7952]{align-items:center;gap:8px;display:flex}.mp-card-name[data-v-536d7952]{min-width:0;font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-weight:600;overflow:hidden}.mp-card-metric[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);flex-shrink:0;align-items:center;gap:3px;display:inline-flex}.mp-card-desc[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:36px;margin:0;line-height:1.5;display:-webkit-box;overflow:hidden}.mp-card-meta[data-v-536d7952]{flex-wrap:wrap;align-items:center;gap:6px;min-height:18px;display:flex}.mp-meta-pkg[data-v-536d7952],.mp-meta-repo[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;max-width:220px;overflow:hidden}.mp-tag[data-v-536d7952]{font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-meta);flex-shrink:0;padding:1px 6px}.mp-tag.remote[data-v-536d7952]{background:color-mix(in srgb, var(--color-info,var(--action-teal)) 14%, transparent);color:var(--color-info,var(--action-teal))}.mp-tag.warn[data-v-536d7952]{background:color-mix(in srgb, var(--color-warning) 14%, transparent);color:var(--color-warning-dark)}.mp-card-foot[data-v-536d7952]{align-items:center;gap:8px;margin-top:2px;display:flex}.mp-card-link[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);text-decoration:none}.mp-card-link[data-v-536d7952]:hover{color:var(--color-primary);text-decoration:underline}.mp-foot-spacer[data-v-536d7952]{flex:1}.mp-install-btn[data-v-536d7952]{font-size:var(--font-size-sm);border:1px solid var(--color-primary);border-radius:var(--radius-base);color:var(--color-primary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:4px 14px;font-family:inherit}.mp-install-btn[data-v-536d7952]:hover:not(:disabled){background:var(--color-primary);color:#fff}.mp-install-btn[data-v-536d7952]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-installed-chip[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--color-success,var(--action-emerald));align-items:center;gap:3px;display:inline-flex}.mp-not-installable[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta)}.mp-empty[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-meta);padding:16px 0}.mp-empty.all[data-v-536d7952]{text-align:center;padding:48px 0}.mp-installed-block[data-v-536d7952]{margin-bottom:12px}.mp-installed-target[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px;font-weight:600}.mp-installed-list[data-v-536d7952]{flex-direction:column;gap:4px;display:flex}.mp-installed-row[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-base);background:var(--bg-panel);align-items:center;gap:10px;padding:6px 10px;display:flex}.mp-installed-name[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:500;overflow:hidden}.mp-installed-id[data-v-536d7952]{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;max-width:40%;overflow:hidden}.mp-reveal-btn[data-v-536d7952],.mp-remove-btn[data-v-536d7952]{font-size:var(--font-size-xs);border:1px solid var(--border-color);border-radius:var(--radius-xs);color:var(--text-meta);cursor:pointer;white-space:nowrap;transition:var(--transition-ui-fast);background:0 0;align-items:center;gap:4px;padding:3px 10px;font-family:inherit;display:inline-flex}.mp-reveal-btn[data-v-536d7952]:disabled,.mp-remove-btn[data-v-536d7952]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-reveal-btn[data-v-536d7952]:hover:not(:disabled){color:var(--text-primary);border-color:var(--text-tertiary)}.mp-remove-btn[data-v-536d7952]:hover:not(:disabled){color:var(--color-danger-dark);border-color:var(--color-danger)}@media (prefers-reduced-motion:reduce){.mp-refresh.spinning svg[data-v-536d7952]{animation:none}}.mkt-form[data-v-536d7952]{flex-direction:column;gap:12px;display:flex}.mkt-form-name[data-v-536d7952]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mkt-field[data-v-536d7952]{flex-direction:column;gap:4px;display:flex}.mkt-field label[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:600}.mkt-field input[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-container);height:30px;color:var(--text-primary);font-size:var(--font-size-mid);transition:border-color var(--transition-fast) ease;padding:0 8px;font-family:inherit}.mkt-field input[data-v-536d7952]:focus{border-color:var(--color-primary);outline:none}.mkt-hint[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0}.mkt-cancel[data-v-536d7952],.mkt-confirm[data-v-536d7952]{font-size:var(--font-size-mid);border-radius:var(--radius-base);cursor:pointer;transition:var(--transition-ui-fast);padding:6px 16px;font-family:inherit}.mkt-cancel[data-v-536d7952]{border:1px solid var(--border-color);color:var(--text-secondary);background:0 0;margin-right:8px}.mkt-cancel[data-v-536d7952]:hover{color:var(--text-primary);border-color:var(--text-tertiary)}.mkt-confirm[data-v-536d7952]{border:1px solid var(--color-primary);background:var(--color-primary);color:#fff}.mkt-confirm[data-v-536d7952]:hover{opacity:.9}.schedule-panel[data-v-75be84e5]{flex-direction:column;flex:1;gap:12px;min-height:0;padding:16px 20px 24px;display:flex;overflow-y:auto}.schedule-toolbar[data-v-75be84e5]{justify-content:space-between;align-items:center;gap:12px;display:flex}.schedule-summary[data-v-75be84e5]{color:var(--text-secondary);font-size:12px}.schedule-error[data-v-75be84e5]{color:var(--text-danger);background:color-mix(in srgb, var(--color-danger) 8%, transparent);border:1px solid color-mix(in srgb, var(--color-danger) 25%, transparent);border-radius:6px;padding:8px 10px;font-size:12px}.schedule-loading[data-v-75be84e5],.schedule-empty[data-v-75be84e5]{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:40px 20px;font-size:13px;display:flex}.schedule-empty-title[data-v-75be84e5]{color:var(--text-primary);margin:0;font-size:14px;font-weight:500}.schedule-empty-desc[data-v-75be84e5]{text-align:center;max-width:440px;color:var(--text-tertiary);margin:0;font-size:12px;line-height:1.7}.schedule-list[data-v-75be84e5]{flex-direction:column;gap:8px;display:flex}.schedule-card[data-v-75be84e5]{background:var(--bg-card);border:1px solid var(--border-color);border-radius:8px;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px;transition:border-color .15s,background .15s;display:flex}.schedule-card[data-v-75be84e5]:hover{border-color:var(--border-color-medium)}.schedule-card.is-running[data-v-75be84e5]{border-color:var(--tint-primary-35);background:var(--tint-primary-04)}.schedule-card.is-disabled .schedule-name[data-v-75be84e5]{color:var(--text-secondary)}.schedule-card-body[data-v-75be84e5]{flex-direction:column;gap:4px;min-width:0;display:flex}.schedule-card-head[data-v-75be84e5]{align-items:center;gap:8px;min-width:0;display:flex}.schedule-name[data-v-75be84e5]{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.schedule-running[data-v-75be84e5]{color:var(--color-primary);background:var(--tint-primary-10);white-space:nowrap;border-radius:4px;padding:1px 6px;font-size:11px}.schedule-card-sub[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;align-items:center;gap:6px;min-width:0;font-size:12px;display:flex;overflow:hidden}.schedule-desc[data-v-75be84e5]{text-overflow:ellipsis;overflow:hidden}.schedule-sep[data-v-75be84e5]{color:var(--text-tertiary)}.schedule-last[data-v-75be84e5]{text-overflow:ellipsis;overflow:hidden}.schedule-last.is-ok[data-v-75be84e5]{color:var(--text-success)}.schedule-last.is-error[data-v-75be84e5]{color:var(--text-danger)}.schedule-last.is-skipped[data-v-75be84e5]{color:var(--text-warning)}.schedule-last.is-muted[data-v-75be84e5]{color:var(--text-tertiary)}.sch-link[data-v-75be84e5]{color:var(--color-primary);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px}.sch-link[data-v-75be84e5]:hover{text-decoration:underline}.schedule-card-side[data-v-75be84e5]{flex-shrink:0;align-items:center;gap:12px;display:flex}.schedule-next[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.schedule-next.is-muted[data-v-75be84e5]{color:var(--text-tertiary)}.schedule-actions[data-v-75be84e5]{align-items:center;gap:2px;display:flex}.sch-switch[data-v-75be84e5]{border:1px solid var(--border-color-medium);background:var(--bg-subtle);cursor:pointer;border-radius:10px;flex-shrink:0;width:34px;height:20px;padding:0;transition:background .15s,border-color .15s;position:relative}.sch-switch .sch-switch-knob[data-v-75be84e5]{background:var(--text-tertiary);border-radius:50%;width:14px;height:14px;transition:transform .15s,background .15s;position:absolute;top:2px;left:2px}.sch-switch.on[data-v-75be84e5]{background:var(--tint-primary-18);border-color:var(--tint-primary-45)}.sch-switch.on .sch-switch-knob[data-v-75be84e5]{background:var(--color-primary);transform:translate(14px)}.sch-btn[data-v-75be84e5]{border:1px solid var(--border-color);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:6px;padding:3px 10px;font-size:12px;transition:background .15s,color .15s,border-color .15s}.sch-btn[data-v-75be84e5]:hover:not(:disabled){background:var(--bg-subtle-hover);color:var(--text-primary);border-color:var(--border-color-medium)}.sch-btn[data-v-75be84e5]:disabled{opacity:.5;cursor:default}.sch-btn-primary[data-v-75be84e5]{background:var(--tint-primary-10);border-color:var(--tint-primary-35);color:var(--color-primary)}.sch-btn-primary[data-v-75be84e5]:hover:not(:disabled){background:var(--tint-primary-18);color:var(--color-primary);border-color:var(--tint-primary-45)}.sch-btn-danger[data-v-75be84e5]{color:var(--text-danger)}.sch-btn-danger[data-v-75be84e5]:hover:not(:disabled){background:color-mix(in srgb, var(--color-danger) 8%, transparent);color:var(--text-danger);border-color:color-mix(in srgb, var(--color-danger) 30%, transparent)}.sch-form[data-v-75be84e5]{flex-direction:column;gap:14px;display:flex}.sch-field[data-v-75be84e5]{flex-direction:column;gap:6px;display:flex}.sch-field-label[data-v-75be84e5]{color:var(--text-secondary);font-size:12px}.sch-input[data-v-75be84e5]{box-sizing:border-box;width:100%;color:var(--text-primary);background:var(--bg-container);border:1px solid var(--border-color-medium);border-radius:6px;outline:none;padding:6px 10px;font-family:inherit;font-size:13px;transition:border-color .15s}.sch-input[data-v-75be84e5]:focus{border-color:var(--tint-primary-55)}.sch-select[data-v-75be84e5]{cursor:pointer}.sch-select-sm[data-v-75be84e5]{width:auto;min-width:64px}.sch-input-cron[data-v-75be84e5]{font-family:var(--font-mono,monospace)}.sch-textarea[data-v-75be84e5]{resize:vertical;min-height:72px;line-height:1.6}.sch-freq-row[data-v-75be84e5]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.sch-inline-label[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.sch-hint[data-v-75be84e5]{color:var(--text-tertiary);font-size:11px}.sch-radio-row[data-v-75be84e5]{flex-wrap:wrap;align-items:center;gap:16px;display:flex}.sch-radio[data-v-75be84e5]{color:var(--text-secondary);cursor:pointer;align-items:center;gap:6px;font-size:12px;display:inline-flex}.sch-radio input[data-v-75be84e5]{accent-color:var(--color-primary);cursor:pointer;margin:0}.sch-form-error[data-v-75be84e5]{color:var(--text-danger);margin:0;font-size:12px}.sch-form-footer[data-v-75be84e5]{justify-content:flex-end;gap:8px;margin-top:14px;display:flex}.sch-confirm-text[data-v-75be84e5]{color:var(--text-primary);margin:0;font-size:13px;line-height:1.7}.aps[data-v-ae77c09c]{background:var(--bg-container);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.aps__scroll[data-v-ae77c09c]{flex-direction:column;flex:1;gap:14px;max-width:860px;min-height:0;padding:16px 18px 24px;line-height:1.5;display:flex;overflow-y:auto}.aps__head[data-v-ae77c09c]{flex-direction:column;gap:5px;display:flex}.aps__title[data-v-ae77c09c]{font-size:var(--font-size-lg);color:var(--text-primary);margin:0;font-weight:600}.aps__intro[data-v-ae77c09c]{font-size:var(--font-size-sm);color:var(--text-meta);margin:0;line-height:1.6}.aps__card[data-v-ae77c09c]{background:var(--bg-panel);border:1px solid var(--border-color);border-radius:var(--radius-lg);flex-direction:column;gap:9px;padding:14px 16px;display:flex}.aps__card-head[data-v-ae77c09c]{align-items:baseline;gap:8px;display:flex}.aps__card-title[data-v-ae77c09c]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.aps__label[data-v-ae77c09c]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:500}.aps__count[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta);font-variant-numeric:tabular-nums;margin-left:auto}.aps__field[data-v-ae77c09c]{flex-direction:column;gap:5px;display:flex}.aps__hint[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0;line-height:1.6}.aps__area[data-v-ae77c09c]{box-sizing:border-box;resize:vertical;width:100%;min-height:92px;max-height:320px;font-size:var(--font-size-mid);color:var(--text-primary);background:var(--bg-subtle);border:1px solid var(--border-color);border-radius:var(--radius-md);transition:border-color var(--transition-fast) var(--ease-custom);outline:none;padding:7px 9px;font-family:inherit;line-height:1.5}.aps__area[data-v-ae77c09c]:focus{border-color:var(--color-primary)}.aps__area[data-v-ae77c09c]::placeholder{color:var(--text-meta)}.aps__area[data-v-ae77c09c]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.aps__foot[data-v-ae77c09c]{align-items:center;gap:8px;display:flex}.aps__spacer[data-v-ae77c09c]{flex:1}.aps__saved[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta)}.aps__btn[data-v-ae77c09c]{color:var(--text-secondary);font-size:var(--font-size-sm);border-radius:var(--radius-md);cursor:pointer;transition:color var(--transition-fast) var(--ease-custom), background var(--transition-fast) var(--ease-custom);background:0 0;border:none;padding:0 12px;line-height:28px}.aps__btn[data-v-ae77c09c]:hover:not(:disabled){color:var(--color-primary);background:var(--bg-container-hover)}.aps__btn[data-v-ae77c09c]:disabled{opacity:var(--disabled-opacity);cursor:default}.aps__btn[data-v-ae77c09c]:focus-visible{outline:var(--focus-outline);outline-offset:1px}.aps__btn--primary[data-v-ae77c09c]{background:var(--color-primary);color:#fff}.aps__btn--primary[data-v-ae77c09c]:hover:not(:disabled){background:var(--color-primary);color:#fff;opacity:.88}.agent-view[data-v-19c12ea4]{background:var(--bg-container);height:100%;min-height:0;display:flex}.agent-sidebar[data-v-19c12ea4]{background:var(--bg-panel);border-right:1px solid var(--border-color);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.agent-conversations[data-v-19c12ea4]{flex:1;min-height:0;padding:10px 6px 8px 12px}.sidebar-resizer[data-v-19c12ea4]{cursor:col-resize;width:4px;transition:background var(--transition-fast) ease;background:0 0;flex-shrink:0}.sidebar-resizer[data-v-19c12ea4]:hover,.sidebar-resizer.active[data-v-19c12ea4]{background:var(--color-primary);opacity:.3}.agent-chat-area[data-v-19c12ea4]{flex-direction:column;flex:1;min-width:0;display:flex;position:relative;overflow:hidden}.agent-engine[data-v-19c12ea4]{margin-bottom:7px;margin-left:auto}.agent-copy[data-v-19c12ea4]{margin-bottom:7px;margin-left:2px}.agent-tabs[data-v-19c12ea4]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:4px;padding:8px 12px 0;display:flex}.agent-tab[data-v-19c12ea4]{color:var(--text-meta);font-size:var(--font-size-mid);cursor:pointer;transition:color var(--transition-fast) ease, border-color var(--transition-fast) ease, background var(--transition-fast) ease;border-radius:var(--radius-base) var(--radius-base) 0 0;background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:7px 14px 9px;font-family:inherit;display:inline-flex}.agent-tab[data-v-19c12ea4]:hover{color:var(--text-secondary);background:var(--bg-hover)}.agent-tab.active[data-v-19c12ea4]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:600}.agent-tab-body[data-v-19c12ea4]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-pane[data-v-19c12ea4]{flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.agent-tab-body[data-v-19c12ea4]>.marketplace-panel{flex:1;min-height:0}.chat-loading[data-v-19c12ea4]{color:var(--text-meta);font-size:var(--font-size-base);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}.agent-list-page[data-v-19c12ea4]{background:var(--bg-panel);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-list-page .agent-conversations[data-v-19c12ea4]{padding:12px 12px 10px 14px}.agent-page-bar[data-v-19c12ea4]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 12px 0 6px;display:flex}.agent-page-back[data-v-19c12ea4]{border-radius:var(--radius-xs);width:24px;height:24px;color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.agent-page-back[data-v-19c12ea4]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-page-title[data-v-19c12ea4]{min-width:0;font-size:var(--font-size-mid);color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.agent-chat-host[data-v-19c12ea4]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-host[data-v-19c12ea4] .acu-avatar--left{background:0 0}.agent-chat-host[data-v-19c12ea4] .acu-bubble-row.is-assistant .acu-bubble-main{width:var(--acu-bubble-max-width);max-width:var(--acu-bubble-max-width);position:relative}.agent-chat-host[data-v-19c12ea4] .acu-bubble-row.is-assistant .acu-bubble{align-self:flex-start}.agent-chat-host[data-v-19c12ea4] .acu-message-meta{margin:0;position:absolute;top:0;right:0}.agent-chat-host[data-v-19c12ea4] .acu-input-queue{--acu-queue-edge:var(--role-pending-edge);--acu-queue-surface:var(--role-pending-surface);--acu-queue-ink:var(--role-pending-ink);--acu-queue-wash:var(--role-pending-wash)}.agent-chat-host[data-v-19c12ea4] .acu-welcome-logo{background:var(--welcome-avatar) center/46px 46px no-repeat;width:56px;height:56px;box-shadow:none}.agent-chat-host[data-v-19c12ea4] .acu-welcome-logo>svg{display:none}.agent-chat-host[data-v-19c12ea4] .acu-welcome-grid{flex-wrap:wrap;display:flex}.agent-chat-host[data-v-19c12ea4] .acu-welcome-grid>.acu-preset-q{flex:260px;min-width:0}[data-theme=dark]{background:var(--bg-panel)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,$t as t,An as n,At as r,Ct as i,Dn as a,Dr as o,En as s,Fn as c,Fr as l,Gn as u,Gt as d,Ht as f,J as p,Jn as m,Jr as h,Jt as g,Ln as _,M as v,On as y,Pn as b,Qn as x,Sn as S,Tt as C,Vn as w,W as ee,Xn as T,Xr as E,Yt as D,_n as O,a as k,an as te,dn as A,er as j,et as M,gn as N,i as P,j as ne,kn as F,kt as I,lr as L,lt as R,mn as z,mr as B,mt as re,r as V,rr as H,sr as U,st as W,tt as G,ur as K,vn as q,xr as J,yr as ie}from"./element-plus-J45pKUrE.js";import{a as Y,r as ae}from"./vendor-B3NyhlYR.js";import{n as X,t as Z}from"./_plugin-vue_export-helper-Csn085FF.js";import{t as oe}from"./configStore-DOaPZ6Mq.js";import{t as se}from"./CommonDialog-j_53ORvj.js";import{G as Q,K as ce,y as le}from"./index-C7Y9odvZ.js";import{a as ue,c as de,i as fe,l as pe,m as me,n as he,o as ge,r as _e,s as ve,t as ye,u as be}from"./agentConversations-DyzaxUXm.js";import{c as xe,s as Se,t as Ce}from"./CopySessionButton-y5Rzmact.js";import{t as we}from"./useOrchestrator-C236G5P5.js";w(),B(),A(),l();var Te={class:`marketplace-panel`},Ee={class:`mp-toolbar`},De={class:`mp-search`},Oe=[`placeholder`],ke={class:`mp-toolbar-sub`},Ae={class:`mp-target-hint`},je={class:`mp-source-filter`},Me=[`onClick`],Ne={class:`mp-body`},Pe={class:`mp-group-header`},Fe={class:`mp-group-title`},Ie={key:0,class:`mp-group-count`},Le={key:1,class:`mp-group-error`},Re=[`href`,`title`],ze={key:0,class:`mp-grid`},Be={class:`mp-card-head`},Ve=[`title`],He={key:0,class:`mp-card-metric`},Ue=[`title`],We={class:`mp-card-meta`},Ge=[`title`],Ke=[`title`],qe={key:2,class:`mp-tag remote`},Je={class:`mp-card-foot`},Ye=[`href`],Xe={key:1,class:`mp-installed-chip`},Ze=[`disabled`,`onClick`],Qe={key:3,class:`mp-not-installable`},$e={key:1,class:`mp-empty`},et={key:0,class:`mp-group installed`},tt={class:`mp-group-header`},nt={class:`mp-group-title`},rt={class:`mp-group-count`},it={key:0,class:`mp-installed-block`},at={class:`mp-installed-target`},ot={class:`mp-installed-list`},st=[`title`],ct=[`title`],lt={key:1,class:`mp-meta-pkg`},ut={key:2,class:`mp-tag warn`},dt=[`disabled`,`title`,`onClick`],ft=[`disabled`,`onClick`],pt={key:1,class:`mp-empty all`},mt={key:0,class:`mkt-form`},ht={class:`mkt-form-name`},gt=[`onUpdate:modelValue`,`placeholder`],_t={key:0,class:`mkt-field`},vt={class:`mkt-hint`},yt=Z(_({__name:`MarketplacePanel`,props:{type:{}},setup(t){let r=t,l=oe(),u=J([]),m=J([]),g=J(!1),_=J(``),C=J(``),w=J([]),T=J(`project`),E=J(new Set),O=J(new Set),A=J(new Set),M=s(()=>l.currentDirectory||``),N=null;async function z(){if(!g.value){g.value=!0;try{let e=new URLSearchParams({type:r.type,cwd:M.value});C.value&&e.set(`q`,C.value),w.value.length&&e.set(`sources`,w.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();t?.success?(u.value=t.groups||[],m.value=t.installed||[]):P.error(t?.error||X(`@MKT:加载失败`))}catch{P.error(X(`@MKT:加载失败`))}finally{g.value=!1}}}U(_,e=>{N&&clearTimeout(N),N=setTimeout(()=>{C.value=e.trim(),z()},400)}),U(w,()=>z()),U(()=>r.type,()=>{w.value=[],C.value=``,_.value=``,z()}),U(M,()=>z()),z();let B=s(()=>{let e=M.value?M.value.split(/[\\/]/).filter(Boolean).pop():``;return T.value===`project`?e||X(`@MKT:当前项目`):X(`@MKT:g ai 智能体`)});function H(e){return e.stars?`${W(e.stars)} ★`:e.downloads?`${W(e.downloads)} ${X(`@MKT:周下载`)}`:e.uses?`${W(e.uses)} ${X(`@MKT:次使用`)}`:``}function W(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function Y(e){return`${e.id}`}function ae(e){return E.value.has(Y(e))}let Z=s(()=>{let e={project:[],global:[]};for(let t of m.value)(e[t.target]||=[]).push(t);return e}),Q=ie({visible:!1,item:null,env:{},args:``});function ce(e){return r.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function le(e){Q.item=e,Q.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),Q.args=(e.args||[]).join(` `),Q.visible=!0}function ue(){let e=Q.item;if(Q.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(Q.env).filter(([,e])=>e.trim()!==``)),n=Q.args.trim()?Q.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;fe(e,{env:t,...n?{args:n}:{}})}async function de(e){if(!e.installed||await pe(e)){if(ce(e)){le(e);return}await fe(e,{})}}async function fe(e,t){let n=Y(e);E.value.add(n);try{let n=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:r.type,target:T.value,cwd:M.value,item:{...e,...t}})}),i=await n.json().catch(()=>null);if(!n.ok||!i?.success){P.error(i?.error||X(`@MKT:安装失败`));return}i.item?.warning&&P.warning(i.item.warning),i.item?.envKeys?.length?P.warning(`${X(`@MKT:还缺环境变量`)}: ${i.item.envKeys.join(`, `)}`):P.success(X(`@MKT:安装成功`)),await z()}catch{P.error(X(`@MKT:安装失败`))}finally{E.value.delete(n)}}async function pe(e){try{return await V.confirm(`${e.name} ${X(`@MKT:已安装,要重新安装吗?`)}`,X(`@MKT:重新安装`),{confirmButtonText:X(`@MKT:重装`),cancelButtonText:X(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function me(e){let t=`${e.target}:${e.id}`;A.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:r.type,target:e.target,cwd:M.value,id:e.id})}),n=await t.json().catch(()=>null);(!t.ok||!n?.success)&&P.error(n?.error||X(`@MKT:打开失败`))}catch{P.error(X(`@MKT:打开失败`))}finally{A.value.delete(t)}}async function he(e){try{await V.confirm(`${X(`@MKT:确定卸载`)} ${e.name}?`,X(`@MKT:卸载`),{confirmButtonText:X(`@MKT:卸载`),cancelButtonText:X(`@MKT:取消`),type:`warning`})}catch{return}let t=`${e.target}:${e.id}`;O.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:M.value}),n=await fetch(`/api/agent/marketplace/item/${r.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),i=await n.json().catch(()=>null);if(!n.ok||!i?.success){P.error(i?.error||X(`@MKT:卸载失败`));return}P.success(X(`@MKT:已卸载`)),await z()}catch{P.error(X(`@MKT:卸载失败`))}finally{O.value.delete(t)}}return(r,s)=>{let l=p,C=ne,E=v,M=ee,N=k;return x(),n(`div`,Te,[a(`div`,Ee,[a(`div`,De,[c(l,{class:`mp-search-icon`},{default:L(()=>[c(o(d))]),_:1}),K(a(`input`,{"onUpdate:modelValue":s[0]||=e=>_.value=e,class:`mp-search-input`,type:`text`,placeholder:t.type===`skill`?o(X)(`@MKT:搜索 Skill...`):o(X)(`@MKT:搜索 MCP 服务...`)},null,8,Oe),[[q,_.value]])]),c(E,{modelValue:T.value,"onUpdate:modelValue":s[1]||=e=>T.value=e,size:`small`,class:`mp-target`},{default:L(()=>[c(C,{value:`project`},{default:L(()=>[b(e(o(X)(`@MKT:当前项目`)),1)]),_:1}),c(C,{value:`global`},{default:L(()=>[b(e(o(X)(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),c(M,{content:o(X)(`@MKT:刷新`),placement:`top`,"show-after":300},{default:L(()=>[a(`button`,{class:h([`mp-refresh`,{spinning:g.value}]),onClick:z},[c(l,null,{default:L(()=>[c(o(f))]),_:1})],2)]),_:1},8,[`content`])]),a(`div`,ke,[a(`span`,Ae,[b(e(o(X)(`@MKT:安装到`))+` `,1),a(`b`,null,e(B.value),1)]),a(`div`,je,[(x(!0),n(S,null,j(u.value,t=>(x(),n(`button`,{key:t.id,class:h([`mp-chip`,{active:w.value.includes(t.id)}]),onClick:()=>{let e=w.value.indexOf(t.id);e>=0?w.value.splice(e,1):w.value.push(t.id)}},e(t.label),11,Me))),128)),w.value.length?(x(),n(`button`,{key:0,class:`mp-chip clear`,onClick:s[2]||=e=>w.value=[]},e(o(X)(`@MKT:全部来源`)),1)):F(``,!0)])]),K((x(),n(`div`,Ne,[(x(!0),n(S,null,j(u.value,t=>(x(),n(`section`,{key:t.id,class:`mp-group`},[a(`header`,Pe,[a(`h3`,Fe,e(t.label),1),t.status===`ok`?(x(),n(`span`,Ie,e(t.items.length),1)):(x(),n(`span`,Le,[c(l,null,{default:L(()=>[c(o(te))]),_:1}),b(` `+e(t.error||o(X)(`@MKT:来源不可用`)),1)])),t.homepage?(x(),n(`a`,{key:2,class:`mp-group-link`,href:t.homepage,target:`_blank`,rel:`noopener noreferrer`,title:t.homepage},[c(l,null,{default:L(()=>[c(o(I))]),_:1})],8,Re)):F(``,!0)]),t.status===`ok`&&t.items.length?(x(),n(`div`,ze,[(x(!0),n(S,null,j(t.items,t=>(x(),n(`article`,{key:Y(t),class:`mp-card`},[a(`div`,Be,[a(`span`,{class:`mp-card-name`,title:t.name},e(t.name),9,Ve),H(t)?(x(),n(`span`,He,[c(l,null,{default:L(()=>[t.stars?(x(),y(o(D),{key:0})):(x(),y(o(re),{key:1}))]),_:2},1024),b(` `+e(H(t)),1)])):F(``,!0)]),a(`p`,{class:`mp-card-desc`,title:t.description},e(t.description||o(X)(`@MKT:暂无描述`)),9,Ue),a(`div`,We,[t.package?(x(),n(`code`,{key:0,class:`mp-meta-pkg`,title:t.package},e(t.package),9,Ge)):t.repository?(x(),n(`span`,{key:1,class:`mp-meta-repo`,title:t.repository+(t.subpath?` · `+t.subpath:``)},[b(e(t.repository),1),t.subpath?(x(),n(S,{key:0},[b(` · `+e(t.subpath),1)],64)):F(``,!0)],8,Ke)):F(``,!0),t.transport===`remote`?(x(),n(`span`,qe,e(o(X)(`@MKT:远程服务`)),1)):F(``,!0),(x(!0),n(S,null,j((t.tags||[]).slice(0,2),t=>(x(),n(`span`,{key:t,class:`mp-tag`},e(t),1))),128))]),a(`div`,Je,[t.upstream?(x(),n(`a`,{key:0,class:`mp-card-link`,href:t.upstream,target:`_blank`,rel:`noopener noreferrer`},e(o(X)(`@MKT:查看来源`)),9,Ye)):F(``,!0),s[6]||=a(`span`,{class:`mp-foot-spacer`},null,-1),t.installed?(x(),n(`span`,Xe,[c(l,null,{default:L(()=>[c(o(G))]),_:1}),b(e(o(X)(`@MKT:已安装`)),1)])):t.installable===!1?(x(),n(`span`,Qe,e(o(X)(`@MKT:暂不支持一键安装`)),1)):(x(),n(`button`,{key:2,class:`mp-install-btn`,disabled:ae(t),onClick:e=>de(t)},e(ae(t)?o(X)(`@MKT:安装中...`):o(X)(`@MKT:安装`)),9,Ze))])]))),128))])):t.status===`ok`?(x(),n(`div`,$e,e(o(X)(`@MKT:该来源暂无结果`)),1)):F(``,!0)]))),128)),m.value.length?(x(),n(`section`,et,[a(`header`,tt,[a(`h3`,nt,e(o(X)(`@MKT:已安装`)),1),a(`span`,rt,e(m.value.length),1)]),(x(),n(S,null,j([`project`,`global`],t=>a(`div`,{key:t},[Z.value[t]?.length?(x(),n(`div`,it,[a(`div`,at,e(t===`project`?o(X)(`@MKT:当前项目`):o(X)(`@MKT:g ai 智能体`)),1),a(`div`,ot,[(x(!0),n(S,null,j(Z.value[t],r=>(x(),n(`div`,{key:t+r.id,class:`mp-installed-row`},[a(`span`,{class:`mp-installed-name`,title:r.name},e(r.name),9,st),r.id&&r.id!==r.name?(x(),n(`code`,{key:0,class:`mp-installed-id`,title:r.dir||r.file||r.id},e(r.id),9,ct)):F(``,!0),r.package?(x(),n(`code`,lt,e(r.package),1)):F(``,!0),r.requiredEnv?.length?(x(),n(`span`,ut,e(o(X)(`@MKT:待配置`))+`: `+e(r.requiredEnv.join(`, `)),1)):F(``,!0),s[7]||=a(`span`,{class:`mp-foot-spacer`},null,-1),a(`button`,{class:`mp-reveal-btn`,disabled:A.value.has(t+r.id),title:r.dir||r.file||``,onClick:e=>me(r)},[c(l,null,{default:L(()=>[c(o(i))]),_:1}),b(` `+e(o(X)(`@MKT:打开文件夹`)),1)],8,dt),a(`button`,{class:`mp-remove-btn`,disabled:O.value.has(t+r.id),onClick:e=>he(r)},[c(l,null,{default:L(()=>[c(o(R))]),_:1}),b(` `+e(O.value.has(t+r.id)?o(X)(`@MKT:卸载中...`):o(X)(`@MKT:卸载`)),1)],8,ft)]))),128))])])):F(``,!0)])),64))])):F(``,!0),!g.value&&!u.value.length?(x(),n(`div`,pt,e(o(X)(`@MKT:加载失败`)),1)):F(``,!0)])),[[N,g.value]]),c(se,{modelValue:Q.visible,"onUpdate:modelValue":s[5]||=e=>Q.visible=e,title:o(X)(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:L(()=>[a(`button`,{class:`mkt-cancel`,onClick:s[4]||=e=>Q.visible=!1},e(o(X)(`@MKT:取消`)),1),a(`button`,{class:`mkt-confirm`,onClick:ue},e(o(X)(`@MKT:安装`)),1)]),default:L(()=>[Q.item?(x(),n(`div`,mt,[a(`p`,ht,e(Q.item.name),1),(x(!0),n(S,null,j(Object.keys(Q.env),t=>(x(),n(`div`,{key:t,class:`mkt-field`},[a(`label`,null,e(t),1),K(a(`input`,{"onUpdate:modelValue":e=>Q.env[t]=e,type:`text`,autocomplete:`off`,placeholder:o(X)(`@MKT:环境变量值`),spellcheck:`false`},null,8,gt),[[q,Q.env[t]]])]))),128)),Q.item.args?.length?(x(),n(`div`,_t,[a(`label`,null,e(o(X)(`@MKT:启动参数`)),1),K(a(`input`,{"onUpdate:modelValue":s[3]||=e=>Q.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[q,Q.args]]),a(`p`,vt,e(o(X)(`@MKT:参数提示`)),1)])):F(``,!0)])):F(``,!0)]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-536d7952`]]);async function $(e,t){let n=await fetch(e,{headers:{"Content-Type":`application/json`},...t}),r={};try{r=await n.json()}catch{}if(!n.ok||r.success===!1)throw Error(r.error||`请求失败 (${n.status})`);return r}async function bt(){let e=await $(`/api/schedules`);return Array.isArray(e.tasks)?e.tasks:[]}async function xt(e){return(await $(`/api/schedules`,{method:`POST`,body:JSON.stringify(e)})).task}async function St(e,t){return(await $(`/api/schedules/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify(t)})).task}async function Ct(e){await $(`/api/schedules/${encodeURIComponent(e)}`,{method:`DELETE`})}async function wt(e){await $(`/api/schedules/${encodeURIComponent(e)}/run`,{method:`POST`})}async function Tt(e){await $(`/api/schedules/${encodeURIComponent(e)}/stop`,{method:`POST`})}function Et(e){if(typeof EventSource>`u`)return()=>{};let t=new EventSource(`/api/schedules/events`);return t.onmessage=t=>{try{e(JSON.parse(t.data))}catch{}},()=>t.close()}var Dt=e=>/^\d+$/.test(e)?Number(e):null;function Ot(e){let t=String(e||``).trim(),n=t.split(/\s+/);if(n.length!==5)return{kind:`custom`,raw:t};let[r,i,a,o,s]=n,c=Dt(r),l=Dt(i);if(t===`* * * * *`)return{kind:`every-minute`,raw:t};let u=r.match(/^\*\/(\d+)$/);if(u&&i===`*`&&a===`*`&&o===`*`&&s===`*`)return{kind:`every-n-minutes`,n:Number(u[1]),raw:t};if(c!==null&&i===`*`&&a===`*`&&o===`*`&&s===`*`)return{kind:`hourly`,minute:c,raw:t};if(c!==null&&l!==null&&a===`*`&&o===`*`&&s===`*`)return{kind:`daily`,hour:l,minute:c,raw:t};let d=Dt(s);if(c!==null&&l!==null&&a===`*`&&o===`*`&&d!==null)return{kind:`weekly`,weekday:d%7,hour:l,minute:c,raw:t};let f=Dt(a);return c!==null&&l!==null&&f!==null&&o===`*`&&s===`*`?{kind:`monthly`,day:f,hour:l,minute:c,raw:t}:{kind:`custom`,raw:t}}var kt=e=>String(e).padStart(2,`0`),At=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime();function jt(e,t=new Date){if(!e)return{kind:`none`};let n=new Date(e);if(Number.isNaN(n.getTime()))return{kind:`none`};let r=`${kt(n.getHours())}:${kt(n.getMinutes())}`,i=Math.round((At(n)-At(t))/864e5);return i<0?{kind:`date`,date:`${n.getMonth()+1}-${kt(n.getDate())}`,time:r}:i===0?{kind:`today`,time:r}:i===1?{kind:`tomorrow`,time:r}:i<7?{kind:`weekday`,weekday:n.getDay(),time:r}:{kind:`date`,date:`${n.getMonth()+1}-${kt(n.getDate())}`,time:r}}function Mt(e){switch(e){case`ok`:return`ok`;case`error`:case`timed-out`:return`error`;case`skipped-busy`:case`missed`:case`cancelled`:return`skipped`;default:return`pending`}}function Nt(e){let t=Number(e);if(!Number.isFinite(t)||t<0)return``;if(t<1e3)return`<1s`;let n=Math.round(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60);return r<60?`${r}m${kt(n%60)}s`:`${Math.floor(r/60)}h${kt(r%60)}m`}function Pt(e){let t=Math.min(59,Math.max(0,Math.floor(e.minute))),n=Math.min(23,Math.max(0,Math.floor(e.hour))),r=(Math.floor(e.weekday)%7+7)%7;switch(e.freq){case`minutes`:return`*/${Math.min(59,Math.max(1,Math.floor(e.everyMinutes??30)))} * * * *`;case`hourly`:return`${t} * * * *`;case`daily`:return`${t} ${n} * * *`;case`weekly`:return`${t} ${n} * * ${r}`;case`custom`:return String(e.custom||``).trim()}}w(),l(),B(),A();var Ft={class:`schedule-panel`},It={class:`schedule-toolbar`},Lt={class:`schedule-summary`},Rt={key:0,class:`schedule-error`},zt={key:1,class:`schedule-loading`},Bt={key:2,class:`schedule-empty`},Vt={class:`schedule-empty-title`},Ht={class:`schedule-empty-desc`},Ut={key:3,class:`schedule-list`},Wt={class:`schedule-card-body`},Gt={class:`schedule-card-head`},Kt={class:`schedule-name`},qt={key:0,class:`schedule-running`},Jt=[`aria-checked`,`aria-label`,`onClick`],Yt={class:`schedule-card-sub`},Xt={class:`schedule-desc`},Zt=[`onClick`],Qt={class:`schedule-card-side`},$t={class:`schedule-actions`},en=[`disabled`,`onClick`],tn=[`disabled`,`onClick`],nn=[`onClick`],rn=[`onClick`],an={class:`sch-form`},on={class:`sch-field`},sn={class:`sch-field-label`},cn=[`placeholder`],ln={class:`sch-field`},un={class:`sch-field-label`},dn={class:`sch-freq-row`},fn=[`value`],pn={class:`sch-inline-label`},mn=[`value`],hn={class:`sch-inline-label`},gn=[`value`],_n=[`value`],vn=[`value`],yn={class:`sch-inline-label`},bn=[`value`],xn={class:`sch-inline-label`},Sn=[`placeholder`],Cn={class:`sch-hint`},wn={class:`sch-field`},Tn={class:`sch-field-label`},En=[`placeholder`],Dn={class:`sch-field`},On={class:`sch-field-label`},kn=[`placeholder`],An={class:`sch-field`},jn={class:`sch-field-label`},Mn={class:`sch-radio-row`},Nn={class:`sch-radio`},Pn={class:`sch-radio`},Fn={class:`sch-radio`},In={key:0,class:`sch-form-error`},Ln={class:`sch-form-footer`},Rn=[`disabled`],zn={class:`sch-confirm-text`},Bn={class:`sch-form-footer`},Vn=Z(_({__name:`SchedulePanel`,emits:[`open-session`],setup(t,{emit:r}){let i=r,l=oe(),u=J([]),d=J(!0),f=J(``),p=J({}),g=null,_=null;async function v(){try{u.value=await bt(),f.value=``}catch(e){f.value=e?.message||String(e)}finally{d.value=!1}}function y(){_===null&&(_=window.setTimeout(()=>{_=null,v()},150))}T(async()=>{await v(),g=Et(e=>{[`tasks_changed`,`task_started`,`task_finished`,`hello`].includes(e.type)&&y()})}),m(()=>{g?.(),_!==null&&window.clearTimeout(_)});let b=s(()=>{let e=u.value.filter(e=>e.enabled).length,t=u.value.length-e;return u.value.length?X(`@SCHED:{on} 个启用 · {off} 个停用`,{on:e,off:t}):``}),C=[`@SCHED:周日`,`@SCHED:周一`,`@SCHED:周二`,`@SCHED:周三`,`@SCHED:周四`,`@SCHED:周五`,`@SCHED:周六`];function w(e){let t=Ot(e.schedule);switch(t.kind){case`every-minute`:return X(`@SCHED:每分钟`);case`every-n-minutes`:return X(`@SCHED:每 {n} 分钟`,{n:t.n});case`hourly`:return X(`@SCHED:每小时第 {minute} 分钟`,{minute:t.minute});case`daily`:return X(`@SCHED:每天 {time}`,{time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`weekly`:return X(`@SCHED:每周 {weekday} {time}`,{weekday:X(C[t.weekday]),time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`monthly`:return X(`@SCHED:每月 {day} 日 {time}`,{day:t.day,time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});default:return t.raw}}function ee(e){if(!e.enabled)return X(`@SCHED:已停用`);if(e.running)return X(`@SCHED:运行中...`);let t=jt(e.nextRunAt);switch(t.kind){case`none`:return``;case`today`:return X(`@SCHED:下次 今天 {time}`,{time:t.time});case`tomorrow`:return X(`@SCHED:下次 明天 {time}`,{time:t.time});case`weekday`:return X(`@SCHED:下次 {weekday} {time}`,{weekday:X(C[t.weekday]),time:t.time});case`date`:return X(`@SCHED:下次 {date} {time}`,{date:t.date,time:t.time})}}function E(e){let t=e.lastRun;if(!t)return X(`@SCHED:还没执行过`);switch(t.status){case`ok`:return X(`@SCHED:成功`);case`error`:return X(`@SCHED:失败`);case`timed-out`:return X(`@SCHED:超时中止`);case`skipped-busy`:return X(`@SCHED:已跳过(会话忙)`);case`missed`:return X(`@SCHED:已错过(未运行)`);case`cancelled`:return X(`@SCHED:已停止`);default:return t.status}}function D(e){let t=e.lastRun;if(!t)return X(`@SCHED:还没执行过`);let n=Nt(t.durationMs),r=X(`@SCHED:上次 {status}`,{status:E(e)});return n?`${r} · ${n}`:r}function k(e){return e.lastRun?`is-${Mt(e.lastRun.status)}`:`is-muted`}async function te(e,t){if(!p.value[e.id]){p.value={...p.value,[e.id]:!0};try{await t(),await v()}catch(e){P.error(e?.message||String(e))}finally{let t={...p.value};delete t[e.id],p.value=t}}}function A(e){return te(e,()=>St(e.id,{enabled:!e.enabled}))}function M(e){return te(e,()=>wt(e.id))}function ne(e){return te(e,()=>Tt(e.id))}let I=J(!1),R=J(null);function B(e){R.value=e,I.value=!0}async function re(){let e=R.value;if(e)try{await Ct(e.id),I.value=!1,await v()}catch(e){P.error(e?.message||String(e))}}let V=J(!1),H=J(``),U=J(``),W=J(!1),G=J({name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:``,prompt:``,onMissed:`run`,enabled:!0}),ie=s(()=>[{value:`minutes`,label:X(`@SCHED:每 N 分钟`)},{value:`hourly`,label:X(`@SCHED:每小时`)},{value:`daily`,label:X(`@SCHED:每天`)},{value:`weekly`,label:X(`@SCHED:每周`)},{value:`custom`,label:X(`@SCHED:自定义 cron`)}]),Y=s(()=>Pt({freq:G.value.freq,everyMinutes:G.value.everyMinutes,minute:G.value.minute,hour:G.value.hour,weekday:G.value.weekday,custom:G.value.custom}));function ae(){G.value={name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:l.currentDirectory||``,prompt:``,onMissed:`run`,enabled:!0},U.value=``}function Z(){H.value=``,ae(),V.value=!0}function Q(e){H.value=e.id;let t=Ot(e.schedule),n={name:e.name,freq:`custom`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:e.schedule,cwd:e.cwd,prompt:e.prompt,onMissed:e.onMissed===`skip`?`skip`:`run`,enabled:e.enabled};switch(t.kind){case`every-n-minutes`:n.freq=`minutes`,n.everyMinutes=t.n;break;case`hourly`:n.freq=`hourly`,n.minute=t.minute;break;case`daily`:n.freq=`daily`,n.minute=t.minute,n.hour=t.hour;break;case`weekly`:n.freq=`weekly`,n.minute=t.minute,n.hour=t.hour,n.weekday=t.weekday;break;default:n.freq=`custom`}G.value=n,U.value=``,V.value=!0}async function ce(){let e=G.value;if(!e.name.trim()){U.value=X(`@SCHED:任务名不能为空`);return}if(!e.prompt.trim()){U.value=X(`@SCHED:提示词不能为空`);return}let t=Y.value;if(!t){U.value=X(`@SCHED:cron 表达式不能为空`);return}let n={name:e.name.trim(),schedule:t,cwd:e.cwd.trim(),prompt:e.prompt.trim(),enabled:e.enabled,onMissed:e.onMissed};W.value=!0;try{H.value?await St(H.value,n):await xt(n),V.value=!1,await v()}catch(e){U.value=e?.message||String(e)}finally{W.value=!1}}return(t,r)=>(x(),n(`div`,Ft,[a(`div`,It,[a(`span`,Lt,e(b.value),1),a(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,onClick:Z},e(o(X)(`@SCHED:新建任务`)),1)]),f.value?(x(),n(`div`,Rt,e(o(X)(`@SCHED:操作失败:{error}`,{error:f.value})),1)):F(``,!0),d.value?(x(),n(`div`,zt,e(o(X)(`@SCHED:加载中...`)),1)):u.value.length?(x(),n(`div`,Ut,[(x(!0),n(S,null,j(u.value,t=>(x(),n(`article`,{key:t.id,class:h([`schedule-card`,{"is-disabled":!t.enabled,"is-running":!!t.running}])},[a(`div`,Wt,[a(`div`,Gt,[a(`span`,Kt,e(t.name),1),t.running?(x(),n(`span`,qt,e(o(X)(`@SCHED:运行中`)),1)):F(``,!0),a(`button`,{type:`button`,class:h([`sch-switch`,{on:t.enabled}]),role:`switch`,"aria-checked":t.enabled,"aria-label":t.enabled?o(X)(`@SCHED:停用`):o(X)(`@SCHED:启用`),onClick:e=>A(t)},[...r[17]||=[a(`span`,{class:`sch-switch-knob`},null,-1)]],10,Jt)]),a(`div`,Yt,[a(`span`,Xt,e(w(t)),1),r[18]||=a(`span`,{class:`schedule-sep`},`·`,-1),a(`span`,{class:h([`schedule-last`,k(t)])},e(D(t)),3),t.sessionId?(x(),n(`button`,{key:0,type:`button`,class:`sch-link`,onClick:e=>i(`open-session`,t.sessionId)},e(o(X)(`@SCHED:查看会话`)),9,Zt)):F(``,!0)])]),a(`div`,Qt,[a(`div`,{class:h([`schedule-next`,{"is-muted":!t.enabled}])},e(ee(t)),3),a(`div`,$t,[t.running?(x(),n(`button`,{key:0,type:`button`,class:`sch-btn`,disabled:!!p.value[t.id],onClick:e=>ne(t)},e(o(X)(`@SCHED:停止`)),9,en)):(x(),n(`button`,{key:1,type:`button`,class:`sch-btn`,disabled:!!p.value[t.id],onClick:e=>M(t)},e(o(X)(`@SCHED:运行`)),9,tn)),a(`button`,{type:`button`,class:`sch-btn`,onClick:e=>Q(t)},e(o(X)(`@SCHED:编辑`)),9,nn),a(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:e=>B(t)},e(o(X)(`@SCHED:删除`)),9,rn)])])],2))),128))])):(x(),n(`div`,Bt,[a(`p`,Vt,e(o(X)(`@SCHED:还没有定时任务`)),1),a(`p`,Ht,e(o(X)(`@SCHED:让 g ai 在指定时间自动做事:定时拉代码、定时巡检、定时汇总。也可以在对话里直接说「每天 9 点帮我…」,让 g ai 来创建。`)),1)])),c(se,{modelValue:V.value,"onUpdate:modelValue":r[14]||=e=>V.value=e,title:H.value?o(X)(`@SCHED:编辑任务`):o(X)(`@SCHED:新建任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`medium`,width:`560px`,"z-index":3e6,"custom-class":`schedule-dialog`},{default:L(()=>[a(`div`,an,[a(`label`,on,[a(`span`,sn,e(o(X)(`@SCHED:任务名`)),1),K(a(`input`,{"onUpdate:modelValue":r[0]||=e=>G.value.name=e,class:`sch-input`,type:`text`,placeholder:o(X)(`@SCHED:如:每日拉代码`)},null,8,cn),[[q,G.value.name]])]),a(`div`,ln,[a(`span`,un,e(o(X)(`@SCHED:执行计划`)),1),a(`div`,dn,[K(a(`select`,{"onUpdate:modelValue":r[1]||=e=>G.value.freq=e,class:`sch-input sch-select`},[(x(!0),n(S,null,j(ie.value,t=>(x(),n(`option`,{key:t.value,value:t.value},e(t.label),9,fn))),128))],512),[[O,G.value.freq]]),G.value.freq===`minutes`?(x(),n(S,{key:0},[a(`span`,pn,e(o(X)(`@SCHED:每`)),1),K(a(`select`,{"onUpdate:modelValue":r[2]||=e=>G.value.everyMinutes=e,class:`sch-input sch-select sch-select-sm`},[(x(),n(S,null,j([5,10,15,20,30,60],t=>a(`option`,{key:t,value:t},e(t),9,mn)),64))],512),[[O,G.value.everyMinutes,void 0,{number:!0}]]),a(`span`,hn,e(o(X)(`@SCHED:分钟`)),1)],64)):G.value.freq===`daily`||G.value.freq===`weekly`?(x(),n(S,{key:1},[G.value.freq===`weekly`?K((x(),n(`select`,{key:0,"onUpdate:modelValue":r[3]||=e=>G.value.weekday=e,class:`sch-input sch-select sch-select-sm`},[(x(),n(S,null,j(C,(t,n)=>a(`option`,{key:n,value:n},e(o(X)(t)),9,gn)),64))],512)),[[O,G.value.weekday,void 0,{number:!0}]]):F(``,!0),K(a(`select`,{"onUpdate:modelValue":r[4]||=e=>G.value.hour=e,class:`sch-input sch-select sch-select-sm`},[(x(),n(S,null,j(24,t=>a(`option`,{key:t-1,value:t-1},e(String(t-1).padStart(2,`0`)),9,_n)),64))],512),[[O,G.value.hour,void 0,{number:!0}]]),r[19]||=a(`span`,{class:`sch-inline-label`},`:`,-1),K(a(`select`,{"onUpdate:modelValue":r[5]||=e=>G.value.minute=e,class:`sch-input sch-select sch-select-sm`},[(x(),n(S,null,j(60,t=>a(`option`,{key:t-1,value:t-1},e(String(t-1).padStart(2,`0`)),9,vn)),64))],512),[[O,G.value.minute,void 0,{number:!0}]])],64)):G.value.freq===`hourly`?(x(),n(S,{key:2},[a(`span`,yn,e(o(X)(`@SCHED:第`)),1),K(a(`select`,{"onUpdate:modelValue":r[6]||=e=>G.value.minute=e,class:`sch-input sch-select sch-select-sm`},[(x(),n(S,null,j(60,t=>a(`option`,{key:t-1,value:t-1},e(String(t-1).padStart(2,`0`)),9,bn)),64))],512),[[O,G.value.minute,void 0,{number:!0}]]),a(`span`,xn,e(o(X)(`@SCHED:分钟`)),1)],64)):K((x(),n(`input`,{key:3,"onUpdate:modelValue":r[7]||=e=>G.value.custom=e,class:`sch-input sch-input-cron`,type:`text`,spellcheck:`false`,placeholder:o(X)(`@SCHED:如:0 9 * * 1-5`)},null,8,Sn)),[[q,G.value.custom]])]),a(`span`,Cn,e(o(X)(`@SCHED:cron:{cron}(分 时 日 月 周,本地时间)`,{cron:Y.value||`—`})),1)]),a(`label`,wn,[a(`span`,Tn,e(o(X)(`@SCHED:项目目录`)),1),K(a(`input`,{"onUpdate:modelValue":r[8]||=e=>G.value.cwd=e,class:`sch-input`,type:`text`,spellcheck:`false`,placeholder:o(X)(`@SCHED:任务在该目录下执行(默认当前项目)`)},null,8,En),[[q,G.value.cwd]])]),a(`label`,Dn,[a(`span`,On,e(o(X)(`@SCHED:提示词`)),1),K(a(`textarea`,{"onUpdate:modelValue":r[9]||=e=>G.value.prompt=e,class:`sch-input sch-textarea`,rows:`4`,placeholder:o(X)(`@SCHED:到点后发给 g ai 的完整指令,例如:检查所有仓库远端更新,有变更就 pull;写成一次自足的请求(未来那一轮没有现在的上下文)`)},null,8,kn),[[q,G.value.prompt]])]),a(`div`,An,[a(`span`,jn,e(o(X)(`@SCHED:错过补偿`)),1),a(`div`,Mn,[a(`label`,Nn,[K(a(`input`,{"onUpdate:modelValue":r[10]||=e=>G.value.onMissed=e,type:`radio`,value:`run`},null,512),[[N,G.value.onMissed]]),a(`span`,null,e(o(X)(`@SCHED:补跑一次(g ui 重新运行后)`)),1)]),a(`label`,Pn,[K(a(`input`,{"onUpdate:modelValue":r[11]||=e=>G.value.onMissed=e,type:`radio`,value:`skip`},null,512),[[N,G.value.onMissed]]),a(`span`,null,e(o(X)(`@SCHED:跳过`)),1)]),a(`label`,Fn,[K(a(`input`,{"onUpdate:modelValue":r[12]||=e=>G.value.enabled=e,type:`checkbox`},null,512),[[z,G.value.enabled]]),a(`span`,null,e(o(X)(`@SCHED:创建后启用`)),1)])])]),U.value?(x(),n(`p`,In,e(U.value),1)):F(``,!0)]),a(`div`,Ln,[a(`button`,{type:`button`,class:`sch-btn`,onClick:r[13]||=e=>V.value=!1},e(o(X)(`@SCHED:取消`)),1),a(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,disabled:W.value,onClick:ce},e(W.value?o(X)(`@SCHED:保存中...`):o(X)(`@SCHED:保存`)),9,Rn)])]),_:1},8,[`modelValue`,`title`]),c(se,{modelValue:I.value,"onUpdate:modelValue":r[16]||=e=>I.value=e,title:o(X)(`@SCHED:删除任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`small`,width:`400px`,"z-index":3e6,"custom-class":`schedule-dialog-confirm`},{default:L(()=>[a(`p`,zn,e(o(X)(`@SCHED:确定删除「{name}」吗?已产生的会话会保留,但任务不再执行。`,{name:R.value?.name||``})),1),a(`div`,Bn,[a(`button`,{type:`button`,class:`sch-btn`,onClick:r[15]||=e=>I.value=!1},e(o(X)(`@SCHED:取消`)),1),a(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:re},e(o(X)(`@SCHED:删除`)),1)])]),_:1},8,[`modelValue`,`title`])]))}}),[[`__scopeId`,`data-v-75be84e5`]]);w(),B(),l(),A();var Hn={class:`aps`},Un={class:`aps__scroll`},Wn={class:`aps__head`},Gn={class:`aps__title`},Kn={class:`aps__intro`},qn={class:`aps__card aps__card--gai`},Jn={class:`aps__card-head`},Yn={class:`aps__card-title`},Xn={class:`aps__count`},Zn={class:`aps__hint`},Qn=[`placeholder`],$n={class:`aps__foot`},er={key:0,class:`aps__saved`},tr=[`disabled`],nr={class:`aps__card aps__card--dispatch`},rr={class:`aps__card-head`},ir={class:`aps__card-title`},ar={class:`aps__hint`},or={class:`aps__field`},sr={class:`aps__card-head`},cr={class:`aps__label`,for:`aps-global`},lr={class:`aps__count`},ur=[`placeholder`],dr={class:`aps__field`},fr={class:`aps__card-head`},pr={class:`aps__label`,for:`aps-project`},mr={key:0,class:`aps__count`},hr=[`disabled`,`placeholder`],gr={class:`aps__hint`},_r={class:`aps__foot`},vr={key:0,class:`aps__saved`},yr={key:1,class:`aps__saved`},br=[`disabled`],xr=4e3,Sr=Z(_({__name:`AgentPromptSettings`,setup(t){let r=oe(),{defaultPrompt:i,projectPrompts:c,loadOrchestrator:l,saveDefaultPrompt:u,saveProjectPrompt:d}=we(),f=J(``),p=J(!1),m=J(!1),h=s(()=>r.agentDefaultPrompt||``),g=s(()=>f.value.trim()!==h.value.trim());async function _(){if(!p.value&&g.value){p.value=!0;try{await r.saveAiSettings({agentDefaultPrompt:f.value})&&(f.value=h.value,m.value=!0,P.success(X(`@AGENT:已保存 g ai 默认提示词`)))}finally{p.value=!1}}}let v=s(()=>r.currentDirectory||``),y=s(()=>ce(v.value)||v.value),b=s(()=>{let e=Q(v.value);return e&&c.value?.[e]?.prompt||``}),S=J(``),C=J(``),w=J(!1),ee=J(!1),E=J(!1),D=s(()=>S.value.trim()!==(i.value||``).trim()||!!v.value&&C.value.trim()!==b.value.trim());function O(){S.value=i.value||``,C.value=b.value}T(async()=>{f.value=h.value,O();let e=await l(!0);E.value=!e,e&&O()});async function k(){if(!w.value&&D.value){w.value=!0;try{let e=!0,t=S.value.trim();t!==(i.value||``).trim()&&(e=await u(t));let n=C.value.trim();e&&v.value&&n!==b.value.trim()&&(e=await d(v.value,n)),e&&(O(),ee.value=!0)}finally{w.value=!1}}}return(t,r)=>(x(),n(`div`,Hn,[a(`div`,Un,[a(`header`,Wn,[a(`h3`,Gn,e(o(X)(`@AGENT:提示词设置`)),1),a(`p`,Kn,e(o(X)(`@AGENT:这里配的两块提示词,和 g ai 对话时每一轮都会自动带上。改完下一次发消息就生效,不用新开会话。`)),1)]),a(`section`,qn,[a(`div`,Jn,[a(`h4`,Yn,e(o(X)(`@AGENT:g ai 智能体的默认提示词`)),1),a(`span`,Xn,e(f.value.length)+` / `+e(xr),1)]),a(`p`,Zn,e(o(X)(`@AGENT:只作用于 g ai 自己:每次对话都会带上(定时任务也一样)。派发出去的任务读不到这一段。`)),1),K(a(`textarea`,{id:`aps-gai`,"onUpdate:modelValue":r[0]||=e=>f.value=e,class:`aps__area`,rows:`6`,maxlength:xr,placeholder:o(X)(`@AGENT:例如:回答用中文;改完代码先跑一遍验证再汇报;不要动 dist 目录`)},null,8,Qn),[[q,f.value]]),a(`div`,$n,[m.value&&!g.value?(x(),n(`span`,er,e(o(X)(`@AGENT:已保存`)),1)):F(``,!0),r[3]||=a(`span`,{class:`aps__spacer`},null,-1),a(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:p.value||!g.value,onClick:_},e(p.value?o(X)(`@AGENT:保存中…`):o(X)(`@AGENT:保存`)),9,tr)])]),a(`section`,nr,[a(`div`,rr,[a(`h4`,ir,e(o(X)(`@AGENT:派发任务的提示词`)),1)]),a(`p`,ar,e(o(X)(`@AGENT:与工作台「预设提示词」是同一份设置,在哪边改都一样。派发任务时附加在指令之前,和 g ai 对话时也会带上。`)),1),a(`div`,or,[a(`div`,sr,[a(`label`,cr,e(o(X)(`@AGENT:全局提示词`)),1),a(`span`,lr,e(S.value.length)+` / `+e(xr),1)]),K(a(`textarea`,{id:`aps-global`,"onUpdate:modelValue":r[1]||=e=>S.value=e,class:`aps__area`,rows:`5`,maxlength:xr,placeholder:o(X)(`@AGENT:对所有项目生效。例如:回答用中文;改完代码必须跑一遍测试;不要动 dist 目录`)},null,8,ur),[[q,S.value]])]),a(`div`,dr,[a(`div`,fr,[a(`label`,pr,e(v.value?o(X)(`@AGENT:「{name}」的项目提示词`,{name:y.value}):o(X)(`@AGENT:项目提示词`)),1),v.value?(x(),n(`span`,mr,e(C.value.length)+` / `+e(xr),1)):F(``,!0)]),K(a(`textarea`,{id:`aps-project`,"onUpdate:modelValue":r[2]||=e=>C.value=e,class:`aps__area`,rows:`5`,maxlength:xr,disabled:!v.value,placeholder:v.value?o(X)(`@AGENT:只在这个项目派发/对话时附加。例如:包管理器用 pnpm;改动集中在 src/ui 下`):o(X)(`@AGENT:当前没有打开项目,项目级提示词暂时不能设置`)},null,8,hr),[[q,C.value]]),a(`p`,gr,e(v.value?o(X)(`@AGENT:项目提示词追加在全局提示词之后(不覆盖全局),在「{name}」里派发或对话时一起带上`,{name:y.value}):o(X)(`@AGENT:先在左上角切到一个项目,才能设置它的提示词`)),1)]),a(`div`,_r,[ee.value&&!D.value?(x(),n(`span`,vr,e(o(X)(`@AGENT:已保存`)),1)):E.value?(x(),n(`span`,yr,e(o(X)(`@AGENT:读取设置失败,请稍后重试`)),1)):F(``,!0),r[4]||=a(`span`,{class:`aps__spacer`},null,-1),a(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:w.value||!D.value,onClick:k},e(w.value?o(X)(`@AGENT:保存中…`):o(X)(`@AGENT:保存`)),9,br)])])])]))}}),[[`__scopeId`,`data-v-ae77c09c`]]);w(),B(),l();var Cr={class:`agent-chat-area`},wr={class:`agent-tabs`,role:`tablist`},Tr=[`aria-selected`,`onClick`],Er={class:`agent-tab-body`},Dr={key:0,class:`agent-chat-pane`},Or={key:0,class:`agent-list-page`},kr={key:0,class:`agent-page-bar`},Ar=[`title`,`aria-label`],jr={class:`agent-page-title`},Mr={key:0,class:`chat-loading`},Nr=Z(_({__name:`AgentView`,setup(i){let l=oe(),d=J(null),{narrow:f}=xe(d),m=J(`chat`),_=J(`chat`),v=s(()=>_.value===`mcp`?`mcp`:`skill`),b=s(()=>[{id:`chat`,label:X(`@AGENT:对话`),icon:M},{id:`schedule`,label:X(`@AGENT:定时任务`),icon:t},{id:`skill`,label:X(`@AGENT:Skill 广场`),icon:C},{id:`mcp`,label:X(`@AGENT:MCP 广场`),icon:W},{id:`settings`,label:X(`@AGENT:设置`),icon:g}]),{sessions:w,sessionsLoading:ee,currentSessionId:T,messages:D,displayMessages:O,isStreaming:k,sessionLoading:te,loadSessions:A,loadSession:N,deleteSession:P,renameSession:ne,newSession:I,sendMessage:R,retryTurn:z,questionPanel:B,answeringQuestion:re,answerQuestion:V,isSessionGenerating:G,currentEngine:K,pendingEngine:q,isEngineLocked:ie,pickEngine:Z,stop:se,inputContextUsage:Q,queuedMessages:ce,queuePaused:we,removeQueuedMessage:Te,flushQueued:Ee}=be(),De=s(()=>ie.value?K.value:q.value);function Oe(e){ie.value||Z(e)}let ke=s(()=>{let e=l.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),Ae=s(()=>de(w.value,G)),je=ue(),Me=s(()=>Ae.value.find(e=>e.id===T.value)?.title||X(`@AGENT:对话`)),Ne={"--welcome-avatar":`url("${ye}")`},Pe=s(()=>le(l.agentPresetPrompts));async function Fe(e){await R(e.text,e.files),await u(),Be()}async function Ie(e){await R(e.prompt),await u(),Be()}let Le=ge(),Re=J(null),ze=ve();function Be(e=!0){Re.value?.scrollToBottom(e)}U(()=>D.value.length,()=>{u(()=>Be(!1))});function Ve(e){N(e),m.value=`chat`}function He(e){e&&(_.value=`chat`,Ve(e))}function Ue(){I(),m.value=`chat`}let We=J(280),Ge=J(!1);function Ke(e){Ge.value=!0;let t=e.clientX,n=We.value,r=e=>{let r=e.clientX-t,i=Math.max(200,Math.min(500,n+r));We.value=i},i=()=>{Ge.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}return U(f,e=>{e||(m.value=`chat`)}),U(()=>[l.currentDirectory,k.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await A(),T.value&&!k.value&&!w.value.some(e=>e.sessionId===T.value)&&I()},{immediate:!0}),(t,i)=>(x(),n(`div`,{ref_key:`rootRef`,ref:d,class:`agent-view`},[_.value===`chat`&&!o(f)?(x(),n(S,{key:0},[a(`aside`,{class:`agent-sidebar`,style:E({width:We.value+`px`})},[c(o(ae),{class:`agent-conversations`,items:Ae.value,"active-id":o(T),loading:o(ee),labels:o(je),onSelect:Ve,onNew:Ue,onRename:o(ne),onDelete:o(P)},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])],4),a(`div`,{class:h([`sidebar-resizer`,{active:Ge.value}]),onMousedown:Ke},null,34)],64)):F(``,!0),a(`main`,Cr,[a(`nav`,wr,[(x(!0),n(S,null,j(b.value,t=>(x(),n(`button`,{key:t.id,type:`button`,class:h([`agent-tab`,{active:_.value===t.id}]),role:`tab`,"aria-selected":_.value===t.id,onClick:e=>_.value=t.id},[c(o(p),null,{default:L(()=>[(x(),y(H(t.icon)))]),_:2},1024),a(`span`,null,e(t.label),1)],10,Tr))),128)),_.value===`chat`?(x(),y(Se,{key:0,class:`agent-engine`,engine:De.value,locked:o(ie),onSelect:Oe},null,8,[`engine`,`locked`])):F(``,!0),_.value===`chat`?(x(),y(Ce,{key:1,class:`agent-copy`,messages:o(D),title:Me.value,engine:o(me)(De.value)},null,8,[`messages`,`title`,`engine`])):F(``,!0)]),a(`div`,Er,[_.value===`chat`?(x(),n(`div`,Dr,[o(f)&&m.value===`list`?(x(),n(`div`,Or,[c(o(ae),{class:`agent-conversations`,items:Ae.value,"active-id":o(T),loading:o(ee),labels:o(je),onSelect:Ve,onNew:Ue,onRename:o(ne),onDelete:o(P)},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])])):(x(),n(S,{key:1},[o(f)?(x(),n(`div`,kr,[a(`button`,{type:`button`,class:`agent-page-back`,title:o(X)(`@AGENT:返回会话列表`),"aria-label":o(X)(`@AGENT:返回会话列表`),onClick:i[0]||=e=>m.value=`list`},[...i[1]||=[a(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[a(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),a(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,Ar),a(`span`,jr,e(Me.value),1)])):F(``,!0),a(`div`,{class:`agent-chat-host`,style:Ne},[o(te)?(x(),n(`div`,Mr,[c(o(p),{class:`is-loading`,size:32},{default:L(()=>[c(o(r))]),_:1}),a(`span`,null,e(o(X)(`@AGENT:加载会话中...`)),1)])):(x(),y(o(Y),{key:1,ref_key:`chatContainerRef`,ref:Re,messages:o(O),"preset-questions":Pe.value,"welcome-title":o(X)(`@AGENT:智能体助手`),"welcome-description":o(X)(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":o(he),"assistant-avatar":o(ye),theme:ke.value,generating:o(k),"allow-queue":!0,queued:o(ce),"queue-paused":o(we),"queue-labels":o(ze),"upload-config":{accept:o(pe)},"context-usage":o(Q),placeholder:o(k)?o(X)(`@AGENT:生成中,发送后会排队,等本轮跑完自动接上…`):o(X)(`@AGENT:输入消息,Enter 发送`),question:o(B),"question-submitting":o(re),"question-labels":o(Le),"plan-config":{labels:{title:o(X)(`@AGENT:计划`),raw:o(X)(`@AGENT:原始参数`)}},"message-rail-config":o(fe),"message-meta-config":o(_e),onSend:Fe,onSelect:Ie,onStop:o(se),onUnqueue:o(Te),onFlushQueued:o(Ee),onAnswer:o(V),onRetry:o(z)},null,8,[`messages`,`preset-questions`,`welcome-title`,`welcome-description`,`assistant-name`,`assistant-avatar`,`theme`,`generating`,`queued`,`queue-paused`,`queue-labels`,`upload-config`,`context-usage`,`placeholder`,`question`,`question-submitting`,`question-labels`,`plan-config`,`message-rail-config`,`message-meta-config`,`onStop`,`onUnqueue`,`onFlushQueued`,`onAnswer`,`onRetry`]))])],64))])):_.value===`schedule`?(x(),y(Vn,{key:1,onOpenSession:He})):_.value===`skill`||_.value===`mcp`?(x(),y(yt,{key:2,type:v.value},null,8,[`type`])):(x(),y(Sr,{key:3}))])])],512))}}),[[`__scopeId`,`data-v-19c12ea4`]]);export{Nr as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,An as t,At as n,Dn as r,Dr as i,En as a,Fn as o,Fr as s,Gn as c,J as l,Jn as u,Jr as d,Ln as f,On as p,Pn as m,Qn as h,Vn as g,W as _,Xn as v,i as y,kn as b,lr as x,mr as S,nt as C,r as w,rt as T,sr as E,xr as D,z as O}from"./element-plus-J45pKUrE.js";import{n as k,t as A}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(()=>{})})}g(),S(),s();var I={key:3},L={key:4},R={key:5},z={key:0,class:`upgrade-hint`},B={key:0,class:`upgrade-countdown`},V={key:1,class:`upgrade-manual`},H={class:`upgrade-manual__label`},U=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,W=A(f({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean},logs:{},status:{},countdown:{default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(a,{emit:s}){let u=a,f=s,g=D(null);E(()=>u.logs,async()=>{await c(),g.value&&(g.value.scrollTop=g.value.scrollHeight)});function _(){u.status!==`running`&&(u.status===`success`&&u.countdown>0&&f(`cancel`),f(`update:modelValue`,!1))}function v(){f(`retry`)}function S(){f(`restart`)}function w(){f(`cancel`),f(`update:modelValue`,!1)}async function A(){try{await navigator.clipboard.writeText(U),y.success(k(`@F13B4:已复制升级命令`))}catch{y.warning(k(`@F13B4:复制失败,请手动复制`))}}return(s,c)=>{let u=l,y=O;return h(),p(j,{"model-value":a.modelValue,"onUpdate:modelValue":c[0]||=e=>f(`update:modelValue`,e),title:i(k)(`@F13B4:升级`),width:`680px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":a.status!==`running`,"append-to-body":``,onClose:_},{footer:x(()=>[a.status===`failed`?(h(),p(y,{key:0,type:`primary`,onClick:v},{default:x(()=>[m(e(i(k)(`@F13B4:重试`)),1)]),_:1})):b(``,!0),a.status===`failed`?(h(),p(y,{key:1,onClick:A},{default:x(()=>[m(e(i(k)(`@F13B4:复制升级命令`)),1)]),_:1})):b(``,!0),a.status===`success`?(h(),p(y,{key:2,type:`primary`,onClick:S},{default:x(()=>[m(e(i(k)(`@F13B4:立即重启并刷新`)),1)]),_:1})):b(``,!0),a.status===`success`?(h(),p(y,{key:3,onClick:w},{default:x(()=>[m(e(i(k)(`@F13B4:稍后手动重启`)),1)]),_:1})):b(``,!0),a.status===`running`?(h(),p(y,{key:4,disabled:``},{default:x(()=>[m(e(i(k)(`@F13B4:升级中`))+`... `,1)]),_:1})):b(``,!0)]),default:x(()=>[r(`div`,{class:d([`upgrade-status`,`is-${a.status}`])},[a.status===`running`?(h(),p(u,{key:0,class:`is-loading`},{default:x(()=>[o(i(n))]),_:1})):a.status===`success`?(h(),p(u,{key:1,color:`var(--color-success)`},{default:x(()=>[o(i(C))]),_:1})):(h(),p(u,{key:2,color:`var(--color-danger)`},{default:x(()=>[o(i(T))]),_:1})),a.status===`running`?(h(),t(`span`,I,e(i(k)(`@F13B4:升级中`)),1)):a.status===`success`?(h(),t(`span`,L,e(i(k)(`@F13B4:升级完成`)),1)):(h(),t(`span`,R,e(i(k)(`@F13B4:升级失败`)),1))],2),a.status===`success`?(h(),t(`p`,z,[m(e(i(k)(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),a.countdown>0?(h(),t(`span`,B,e(i(k)(`@F13B4:{seconds} 秒后自动刷新`,{seconds:a.countdown})),1)):b(``,!0)])):b(``,!0),a.status===`failed`?(h(),t(`p`,V,[r(`span`,H,e(i(k)(`@F13B4:手动升级命令`)),1),r(`code`,{class:`upgrade-manual__cmd`},e(U))])):b(``,!0),r(`pre`,{ref_key:`logEl`,ref:g,class:`upgrade-log`},e(a.logs||i(k)(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}}}),[[`__scopeId`,`data-v-6de8caee`]]);g(),S(),s();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/tags`,Q=5,$=`app-version-check`,ee=36e5,te=A(f({__name:`AppVersionBadge`,setup(n){let s=`2.18.
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,An as t,At as n,Dn as r,Dr as i,En as a,Fn as o,Fr as s,Gn as c,J as l,Jn as u,Jr as d,Ln as f,On as p,Pn as m,Qn as h,Vn as g,W as _,Xn as v,i as y,kn as b,lr as x,mr as S,nt as C,r as w,rt as T,sr as E,xr as D,z as O}from"./element-plus-J45pKUrE.js";import{n as k,t as A}from"./_plugin-vue_export-helper-Csn085FF.js";import{t as j}from"./CommonDialog-j_53ORvj.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(()=>{})})}g(),S(),s();var I={key:3},L={key:4},R={key:5},z={key:0,class:`upgrade-hint`},B={key:0,class:`upgrade-countdown`},V={key:1,class:`upgrade-manual`},H={class:`upgrade-manual__label`},U=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,W=A(f({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean},logs:{},status:{},countdown:{default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(a,{emit:s}){let u=a,f=s,g=D(null);E(()=>u.logs,async()=>{await c(),g.value&&(g.value.scrollTop=g.value.scrollHeight)});function _(){u.status!==`running`&&(u.status===`success`&&u.countdown>0&&f(`cancel`),f(`update:modelValue`,!1))}function v(){f(`retry`)}function S(){f(`restart`)}function w(){f(`cancel`),f(`update:modelValue`,!1)}async function A(){try{await navigator.clipboard.writeText(U),y.success(k(`@F13B4:已复制升级命令`))}catch{y.warning(k(`@F13B4:复制失败,请手动复制`))}}return(s,c)=>{let u=l,y=O;return h(),p(j,{"model-value":a.modelValue,"onUpdate:modelValue":c[0]||=e=>f(`update:modelValue`,e),title:i(k)(`@F13B4:升级`),width:`680px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":a.status!==`running`,"append-to-body":``,onClose:_},{footer:x(()=>[a.status===`failed`?(h(),p(y,{key:0,type:`primary`,onClick:v},{default:x(()=>[m(e(i(k)(`@F13B4:重试`)),1)]),_:1})):b(``,!0),a.status===`failed`?(h(),p(y,{key:1,onClick:A},{default:x(()=>[m(e(i(k)(`@F13B4:复制升级命令`)),1)]),_:1})):b(``,!0),a.status===`success`?(h(),p(y,{key:2,type:`primary`,onClick:S},{default:x(()=>[m(e(i(k)(`@F13B4:立即重启并刷新`)),1)]),_:1})):b(``,!0),a.status===`success`?(h(),p(y,{key:3,onClick:w},{default:x(()=>[m(e(i(k)(`@F13B4:稍后手动重启`)),1)]),_:1})):b(``,!0),a.status===`running`?(h(),p(y,{key:4,disabled:``},{default:x(()=>[m(e(i(k)(`@F13B4:升级中`))+`... `,1)]),_:1})):b(``,!0)]),default:x(()=>[r(`div`,{class:d([`upgrade-status`,`is-${a.status}`])},[a.status===`running`?(h(),p(u,{key:0,class:`is-loading`},{default:x(()=>[o(i(n))]),_:1})):a.status===`success`?(h(),p(u,{key:1,color:`var(--color-success)`},{default:x(()=>[o(i(C))]),_:1})):(h(),p(u,{key:2,color:`var(--color-danger)`},{default:x(()=>[o(i(T))]),_:1})),a.status===`running`?(h(),t(`span`,I,e(i(k)(`@F13B4:升级中`)),1)):a.status===`success`?(h(),t(`span`,L,e(i(k)(`@F13B4:升级完成`)),1)):(h(),t(`span`,R,e(i(k)(`@F13B4:升级失败`)),1))],2),a.status===`success`?(h(),t(`p`,z,[m(e(i(k)(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),a.countdown>0?(h(),t(`span`,B,e(i(k)(`@F13B4:{seconds} 秒后自动刷新`,{seconds:a.countdown})),1)):b(``,!0)])):b(``,!0),a.status===`failed`?(h(),t(`p`,V,[r(`span`,H,e(i(k)(`@F13B4:手动升级命令`)),1),r(`code`,{class:`upgrade-manual__cmd`},e(U))])):b(``,!0),r(`pre`,{ref_key:`logEl`,ref:g,class:`upgrade-log`},e(a.logs||i(k)(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}}}),[[`__scopeId`,`data-v-6de8caee`]]);g(),S(),s();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/tags`,Q=5,$=`app-version-check`,ee=36e5,te=A(f({__name:`AppVersionBadge`,setup(n){let s=`2.18.9`,c=D(s),l=a(()=>c.value||s),d=D(null),f=D(!1),p=D(``),m=D(`running`),g=D(0),S=null,C=D(!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&&(d.value=t);try{let t=await N();d.value=t,E(t),t.current&&(c.value=t.current),!e&&t.success&&t.hasUpdate&&y({type:`success`,message:k(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||y({type:`warning`,message:k(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function A(){if(d.value?.hasUpdate){try{await w.confirm(k(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:d.value.current,latest:d.value.latest}),k(`@F13B4:升级`),{confirmButtonText:k(`@F13B4:确定升级`),cancelButtonText:k(`@F13B4:取消`),type:`info`})}catch{return}p.value=``,m.value=`running`,f.value=!0,await P(e=>{if(e.type===`done`){if(m.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem($)}catch{}d.value?.latest&&(c.value=d.value.latest),j()}}else e.message&&(p.value+=e.message)})}}function j(){M(),g.value=Q,S=setInterval(()=>{--g.value,g.value<=0&&(S&&=(clearInterval(S),null),L())},1e3)}function M(){S&&=(clearInterval(S),null),g.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?k(n):k(`@F13B4:重启失败 {error}`,{error:t})}),C.value=!1}}}return u(()=>{M()}),v(()=>{O(!0)}),(n,a)=>{let s=_;return h(),t(`div`,G,[o(s,{content:i(k)(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:x(()=>[r(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i(k)(`@F13B4:在 GitHub 上查看源码`)},[...a[1]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z`})],-1)]],8,K)]),_:1},8,[`content`]),o(s,{content:i(k)(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:x(()=>[r(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i(k)(`@F13B4:在 npm 上查看包`)},[...a[2]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,q)]),_:1},8,[`content`]),o(s,{content:i(k)(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:x(()=>[r(`a`,{href:Z,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+e(l.value),1)]),_:1},8,[`content`]),d.value?.hasUpdate?(h(),t(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i(k)(`@F13B4:发现新版本 {version},点击升级`,{version:d.value.latest??``}),"aria-label":i(k)(`@F13B4:发现新版本 {version},点击升级`,{version:d.value.latest??``}),onClick:A},[a[3]||=r(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),r(`span`,Y,e(i(k)(`@F13B4:升级`)),1),r(`span`,X,`v`+e(d.value.latest),1)],8,J)):b(``,!0),o(W,{modelValue:f.value,"onUpdate:modelValue":a[0]||=e=>f.value=e,logs:p.value,status:m.value,countdown:g.value,onRetry:A,onRestart:L,onCancel:I},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}}}),[[`__scopeId`,`data-v-db57a632`]]);export{te as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,An as t,Dn as n,Dr as r,En as i,F as ee,Fn as a,Fr as o,G as te,Ht as s,I as c,J as ne,Jr as l,K as re,Ln as u,Nt as ie,On as d,Qn as f,Sn as p,U as ae,Vn as m,_ as h,bn as g,dn as _,er as v,kn as y,lr as b,mr as x,tt as S,xr as C,zt as w}from"./element-plus-J45pKUrE.js";import{n as T,t as E}from"./_plugin-vue_export-helper-
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,An as t,Dn as n,Dr as r,En as i,F as ee,Fn as a,Fr as o,G as te,Ht as s,I as c,J as ne,Jr as l,K as re,Ln as u,Nt as ie,On as d,Qn as f,Sn as p,U as ae,Vn as m,_ as h,bn as g,dn as _,er as v,kn as y,lr as b,mr as x,tt as S,xr as C,zt as w}from"./element-plus-J45pKUrE.js";import{n as T,t as E}from"./_plugin-vue_export-helper-Csn085FF.js";import{t as D}from"./SvgIcon-5AlG3IfR.js";import{t as O}from"./CommonDialog-j_53ORvj.js";import{U as k,W as A}from"./index-C7Y9odvZ.js";m(),x(),o(),_();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(u({__name:`BranchSelector`,emits:[`branchChanged`],setup(o,{emit:u}){let m=k(),_=u,x=C(!1),E=C(``),J=i(()=>{let e=E.value.trim().toLowerCase();return e?m.allBranches.filter(t=>t.toLowerCase().includes(e)):m.allBranches});async function ce(e){if(e===m.currentBranch){x.value=!1;return}x.value=!1,await m.changeBranch(e)&&(_(`branchChanged`),m.refreshLog())}let Y=C(!1),X=C(``),Z=C(``);function le(){x.value=!1,Z.value=m.currentBranch,Y.value=!0}async function Q(){await m.createBranch(X.value,Z.value)&&(Y.value=!1,X.value=``,_(`branchChanged`))}let $=C(!1);async function ue(){if(!$.value){$.value=!0;try{await Promise.all([m.getCurrentBranch(!0),m.getBranchStatus(!0),m.getAllBranches()]),_(`branchChanged`),m.refreshLog()}finally{$.value=!1}}}return(i,o)=>{let u=ne,_=ae,C=h,k=re,de=ee,fe=c,pe=te;return r(m).currentBranch?(f(),t(`div`,j,[n(`div`,M,[a(C,{visible:x.value,"onUpdate:visible":o[1]||=e=>x.value=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:o[2]||=e=>E.value=``},{reference:b(()=>[n(`button`,N,[a(D,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),n(`span`,P,e(r(m).currentBranch),1),n(`span`,F,[a(u,null,{default:b(()=>[...o[7]||=[n(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[n(`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:b(()=>[n(`div`,I,[n(`div`,L,[a(_,{modelValue:E.value,"onUpdate:modelValue":o[0]||=e=>E.value=e,placeholder:r(T)(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),n(`div`,R,[(f(!0),t(p,null,v(J.value,i=>(f(),t(`div`,{key:i,class:l([`branch-item`,{"is-active":i===r(m).currentBranch}]),onClick:e=>ce(i)},[i===r(m).currentBranch?(f(),d(u,{key:0,class:`branch-item-check`},{default:b(()=>[a(r(S))]),_:1})):(f(),t(`span`,B)),a(D,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),n(`span`,V,e(i),1)],10,z))),128)),J.value.length===0?(f(),t(`div`,oe,e(r(T)(`@F13B4:没有匹配的分支`)),1)):y(``,!0)]),n(`div`,H,[n(`button`,{class:`branch-create-btn`,onClick:le},[a(u,null,{default:b(()=>[a(r(w))]),_:1}),n(`span`,null,e(r(T)(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),a(A,{tooltip:r(T)(`@CMDCON:刷新`),onClick:ue},{default:b(()=>[a(u,{class:l({"is-loading":$.value})},{default:b(()=>[a(r(s))]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),a(O,{modelValue:Y.value,"onUpdate:modelValue":o[6]||=e=>Y.value=e,title:r(T)(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:b(()=>[n(`div`,K,[n(`div`,q,[n(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:o[5]||=e=>Y.value=!1},e(r(T)(`@F13B4:取消`)),1),n(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:Q,disabled:r(m).isCreatingBranch},[r(m).isCreatingBranch?(f(),d(u,{key:1,class:`is-loading`},{default:b(()=>[...o[8]||=[n(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[n(`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(),d(u,{key:0},{default:b(()=>[a(r(S))]),_:1})),n(`span`,null,e(r(T)(`@F13B4:创建`)),1)],8,se)])])]),default:b(()=>[n(`div`,U,[a(pe,{model:{newBranchName:X.value,selectedBaseBranch:Z.value},"label-position":`top`},{default:b(()=>[a(k,null,{label:b(()=>[n(`div`,W,[a(u,{class:`label-icon`},{default:b(()=>[a(r(w))]),_:1}),n(`span`,null,e(r(T)(`@F13B4:新分支名称`)),1)])]),default:b(()=>[a(_,{modelValue:X.value,"onUpdate:modelValue":o[3]||=e=>X.value=e,placeholder:r(T)(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:g(Q,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),a(k,null,{label:b(()=>[n(`div`,G,[a(u,{class:`label-icon`},{default:b(()=>[a(r(ie))]),_:1}),n(`span`,null,e(r(T)(`@F13B4:基于分支`)),1)])]),default:b(()=>[a(fe,{modelValue:Z.value,"onUpdate:modelValue":o[4]||=e=>Z.value=e,placeholder:r(T)(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:b(()=>[(f(!0),t(p,null,v(r(m).allBranches,e=>(f(),d(de,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):y(``,!0)}}}),[[`__scopeId`,`data-v-407da320`]]);export{J as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,An as t,At as n,Dn as r,Dr as i,En as a,F as o,Fn as s,Fr as c,Gn as l,I as u,J as d,Jr as f,Ln as p,On as m,Qn as h,Sn as g,U as _,V as v,Vn as y,W as b,Xn as x,Xr as S,Y as ee,dn as C,er as te,ht as w,i as T,kn as E,ln as ne,lr as D,mr as O,q as re,sr as k,ur as ie,wn as A,xn as j,xr as M,yn as ae,yr as oe,z as N}from"./element-plus-J45pKUrE.js";import{n as P,t as F}from"./_plugin-vue_export-helper-C3o7kvRL.js";import{t as se}from"./SvgIcon-0n6uuKFm.js";import{o as ce,t as le}from"./configStore-BdL3uW2E.js";import{B as I,H as ue,O as de,U as fe,c as L,d as R,l as z,s as pe,u as B}from"./index-BS7BDFG4.js";y(),c(),C();var V={class:`loading-container`},H={class:`loading-text`},U={key:0,class:`loading-progress`},W=p({__name:`GlobalLoading`,props:{visible:{type:Boolean,default:!1},text:{default:P(`@2AEBA:加载中...`)},showProgress:{type:Boolean,default:!1},progress:{default:0},mock:{type:Boolean,default:!1}},setup(n){return(i,a)=>(h(),m(A,{to:`body`},[s(ne,{name:`loading-fade`},{default:D(()=>[n.visible||n.mock?(h(),t(`div`,{key:0,class:`global-loading-overlay`,onClick:a[0]||=j(()=>{},[`stop`])},[r(`div`,V,[a[1]||=r(`div`,{class:`loading-spinner`},[r(`div`,{class:`spinner-ring`}),r(`div`,{class:`spinner-ring`}),r(`div`,{class:`spinner-ring`})],-1),r(`div`,H,e(n.text),1),n.showProgress||n.mock?(h(),t(`div`,U,[r(`div`,{class:f([`progress-bar`,{"is-mock":n.mock&&!n.showProgress}]),style:S(n.showProgress?{width:n.progress+`%`}:void 0)},null,6)])):E(``,!0)])])):E(``,!0)]),_:1})]))}}),me=F(W,[[`__scopeId`,`data-v-f4fe1f34`]]);y(),c(),C();var G={class:`success-container`},K={class:`success-text`},q={key:0,class:`success-description`},J=p({__name:`SuccessModal`,props:{visible:{type:Boolean,default:!1},text:{default:P(`@71545:操作成功!`)},description:{default:``}},setup(n){return(i,a)=>(h(),m(A,{to:`body`},[s(ne,{name:`success-fade`},{default:D(()=>[n.visible?(h(),t(`div`,{key:0,class:`success-overlay`,onClick:a[0]||=j(()=>{},[`stop`])},[r(`div`,G,[a[1]||=r(`div`,{class:`success-icon`},[r(`svg`,{viewBox:`0 0 52 52`,class:`success-svg`},[r(`circle`,{class:`success-circle`,cx:`26`,cy:`26`,r:`25`,fill:`none`}),r(`path`,{class:`success-check`,fill:`none`,d:`m14.1 27.2l7.1 7.2 16.7-16.8`})])],-1),r(`div`,K,e(n.text),1),n.description?(h(),t(`div`,q,e(n.description),1)):E(``,!0)])])):E(``,!0)]),_:1})]))}}),he=F(J,[[`__scopeId`,`data-v-3e82b431`]]);O();var Y=oe({visible:!1,text:P(`@F2A3A:加载中...`),showProgress:!1,progress:0});function ge(){return{loadingState:Y,show:e=>{Y.visible=!0,Y.text=e?.text||P(`@F2A3A:加载中...`),Y.showProgress=e?.showProgress||!1,Y.progress=e?.progress||0},hide:()=>{Y.visible=!1},updateProgress:e=>{Y.progress=Math.max(0,Math.min(100,e))},updateText:e=>{Y.text=e},setText:e=>{Y.visible&&(Y.text=e)}}}O();var X=oe({visible:!1,text:P(`@B8591:操作成功!`),description:``});function _e(){let e=e=>{X.visible=!0,X.text=e?.text||P(`@B8591:操作成功!`),X.description=e?.description||``;let n=e?.duration||2e3;setTimeout(()=>{t()},n)},t=()=>{X.visible=!1};return{successState:X,show:e,hide:t}}y(),O(),c();var Z={class:`one-commit-content`},ve={class:`one-commit-text`},Q={class:`one-commit-title`},ye={key:0,class:`one-commit-desc`},be=F(p({__name:`QuickCommitButton`,props:{from:{default:`form`},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1}},emits:[`beforeCommit`,`afterCommit`,`clearFields`],setup(n,{expose:o,emit:c}){let l=ue(),u=le(),p=n,m=c,g=a(()=>l.fileList.some(e=>!I(e.path,u.lockedFiles))),_=a(()=>l.isSelectionMode&&l.selectedFiles.size>0&&l.selectedUnstagedPaths.length>0),v=a(()=>l.hasConflictedFiles?!0:l.isSelectionMode?!_.value||!p.hasUserCommitMessage:!g.value||!p.hasUserCommitMessage),y=a(()=>l.isAddingFiles||l.isCommiting),x=a(()=>l.hasConflictedFiles?P(`@2E184:存在冲突文件,请先解决冲突`):l.isSelectionMode?l.selectedFiles.size===0?P(`@2E184:请先勾选要提交的文件`):l.selectedUnstagedPaths.length===0?P(`@2E184:所选文件无需暂存或被锁定`):p.hasUserCommitMessage?P(`@2E184:一键完成:仅暂存所选文件 → 提交`):P(`@2E184:请输入提交信息`):g.value?p.hasUserCommitMessage?P(`@2E184:一键完成:暂存所有更改 → 提交`):P(`@2E184:请输入提交信息`):P(`@2E184:没有需要提交的更改`)),S=a(()=>l.isSelectionMode&&_.value?P(`@2E184:一键提交所选`):P(`@2E184:一键提交`)),ee=a(()=>p.from===`form`?l.isSelectionMode&&_.value?P(`@2E184:暂存所选 + 提交`):P(`@2E184:暂存 + 提交`):``);async function C(){m(`beforeCommit`);try{let e=await l.stageSelectedAndCommit(p.finalCommitMessage,p.skipHooks);e&&m(`clearFields`),m(`afterCommit`,e)}catch(e){console.error(`一键提交失败:`,e),m(`afterCommit`,!1)}}return o({triggerQuickCommit:C}),(a,o)=>{let c=d,l=N;return h(),t(`div`,null,[s(i(b),{content:x.value,placement:`top`,"show-after":200},{default:D(()=>[s(l,{type:`primary`,onClick:C,loading:y.value,disabled:v.value,class:f([n.from,`one-commit-button`])},{default:D(()=>[r(`div`,Z,[s(c,{class:`one-commit-icon`},{default:D(()=>[s(i(w))]),_:1}),r(`div`,ve,[r(`span`,Q,e(S.value),1),n.from===`form`?(h(),t(`span`,ye,e(ee.value),1)):E(``,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}}}),[[`__scopeId`,`data-v-7621b470`]]);y(),c(),O();var xe={class:`one-ai-push`},$={class:`one-ai-push-content`},Se={class:`one-ai-push-text`},Ce={class:`one-ai-push-title`},we={key:0,class:`one-ai-push-desc`},Te=F(p({__name:`AiQuickPushButton`,props:{from:{default:`form`},generating:{type:Boolean,default:!1}},emits:[`trigger`],setup(n,{emit:o}){let c=ue(),l=le(),u=n,d=o,p=a(()=>c.fileList.some(e=>!I(e.path,l.lockedFiles))),m=a(()=>c.isSelectionMode&&c.selectedFiles.size>0&&c.selectedUnstagedPaths.length>0),g=a(()=>!c.isSelectionMode&&!p.value&&c.branchAhead>0),_=a(()=>c.hasConflictedFiles||!c.hasUpstream?!0:c.isSelectionMode?!m.value:!p.value&&c.branchAhead===0),v=a(()=>u.generating||c.isAddingFiles||c.isCommiting||c.isPushing),y=a(()=>c.hasConflictedFiles?P(`@2E184:存在冲突文件,请先解决冲突`):c.hasUpstream?u.generating?P(`@2E184:AI 正在生成提交信息…`):c.isSelectionMode?m.value?P(`@2E184:一键完成:AI 生成提交信息 → 仅暂存所选文件 → 提交 → 推送`):P(`@2E184:请先勾选要推送的文件`):!p.value&&c.branchAhead===0?P(`@2E184:没有需要提交或推送的更改`):p.value?P(`@2E184:一键完成:AI 生成提交信息 → 暂存所有更改 → 提交 → 推送`):P(`@2E184:本地已提交,AI 将直接推送到远程仓库`):P(`@2E184:当前分支没有上游分支`)),x=a(()=>u.generating?P(`@2E184:AI 正在生成提交信息…`):c.isSelectionMode&&m.value?P(`@2E184:AI 提交并推送所选`):P(`@2E184:AI 提交并推送`)),S=a(()=>u.from!==`form`||u.generating?``:g.value?P(`@2E184:本地已提交,直接推送`):P(`@2E184:AI 生成信息 + 推送`));function ee(){_.value||v.value||d(`trigger`)}return(a,o)=>{let c=N;return h(),t(`div`,xe,[s(i(b),{content:y.value,placement:`top`,"show-after":200},{default:D(()=>[s(c,{type:`primary`,onClick:ee,loading:v.value,disabled:_.value,class:f([n.from,`one-ai-push-button`])},{default:D(()=>[r(`div`,$,[s(se,{class:`one-ai-push-icon`,"icon-class":`ai-commit`,style:{color:`#fff`}}),r(`div`,Se,[r(`span`,Ce,e(x.value),1),n.from===`form`?(h(),t(`span`,we,e(S.value),1)):E(``,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}}}),[[`__scopeId`,`data-v-8a2a3d74`]]);y(),O();var Ee={class:`form-bottom-actions`},De={class:`actions-flex-container`},Oe={class:`left-actions`},ke={class:`button-grid`},Ae={class:`right-actions`},je=F(p({__name:`GitActionButtons`,props:{hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1},from:{default:`form`},aiGenerating:{type:Boolean,default:!1}},emits:[`afterCommit`,`afterPush`,`beforePush`,`pushStart`,`clearFields`,`aiQuickPush`],setup(e,{expose:n,emit:i}){let a=i,o=M(null);function c(e){a(`afterCommit`,e)}function l(e){a(`afterPush`,e)}function u(){a(`beforePush`)}function d(){a(`pushStart`)}function f(){a(`clearFields`)}function p(){a(`aiQuickPush`)}async function m(){return o.value?.triggerQuickPush()}return n({triggerQuickPush:m}),(n,i)=>(h(),t(`div`,Ee,[r(`div`,De,[r(`div`,Oe,[r(`div`,ke,[s(R,{onClick:()=>{},from:e.from},null,8,[`from`]),s(B,{"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforeCommit:()=>{},onAfterCommit:c,onClick:()=>{},from:e.from},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`,`from`]),s(z,{onBeforePush:()=>{},onAfterPush:l,onClick:()=>{},from:e.from},null,8,[`from`])])]),r(`div`,Ae,[s(be,{from:e.from,"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onAfterCommit:c,onClearFields:f},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),s(L,{ref_key:`quickPushRef`,ref:o,from:e.from,"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforePush:u,onPushStart:d,onAfterPush:l,onClearFields:f},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),s(Te,{from:e.from,generating:e.aiGenerating,onTrigger:p},null,8,[`from`,`generating`])])])]))}}),[[`__scopeId`,`data-v-de459eed`]]);y(),O(),c(),C();var Me={class:`card-header app-card-header`},Ne={class:`header-left`},Pe={class:`card-content app-card-content`},Fe={class:`layout-container`},Ie={key:0,class:`git-config-warning`},Le={key:0,class:`merge-in-progress-banner`},Re={class:`commit-section`},ze={key:0,class:`commit-form`},Be={class:`description-container`},Ve={key:1,class:`standard-commit-form`},He={class:`standard-commit-header`},Ue={class:`type-scope-container`},We={class:`scope-wrapper`},Ge={class:`description-container description-inline`},Ke=[`aria-expanded`],qe={class:`advanced-fields`},Je={key:0,class:`status-updating-indicator`},Ye={key:0,class:`status-updating-indicator`},Xe=F(p({__name:`CommitForm`,setup(c){let p=M(!1),y=M(!1);async function b(){let e=w.isSelectionMode&&w.selectedFiles.size>0?[...w.selectedFiles]:[],t=ce(),n=await(await fetch(`/api/config/generate-commit-message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({selectedPaths:e,locale:t.currentLocale})})).json();if(!n.success){let e=n.code,t=n.error||P(`@76872:AI生成失败`),r=e?{TIMEOUT:`@76872:AI生成超时,请重试或检查模型响应速度`,NO_MODEL:`@76872:未配置AI模型,请先在通用设置中添加模型`,NO_JSON:`@76872:AI未返回有效结果,请重试`,PARSE_FAILED:`@76872:AI返回格式无法解析,请重试`,GENERATE_FAILED:`@76872:AI生成失败`,HTTP_ERR:`@76872:AI生成失败`}[e]:null;return T.error(r?P(r):t),!1}let r=[`feat`,`fix`,`docs`,`style`,`refactor`,`test`,`chore`];if(z.value)n.type&&r.includes(n.type)&&(B.value=n.type),n.scope!==void 0&&(V.value=n.scope),n.description&&(H.value=n.description);else{let e=n.type&&n.description?n.scope?`${n.type}(${n.scope}): ${n.description}`:`${n.type}: ${n.description}`:n.description||``;e&&(A.value=e)}return!0}async function S(){if(!p.value){p.value=!0;try{if(!await b())return;T.success(P(`@76872:AI已生成提交信息`))}catch(e){T.error(`${P(`@76872:AI生成失败`)}: ${e.message}`)}finally{p.value=!1}}}async function C(){if(!y.value){y.value=!0;try{let e=w.isSelectionMode&&w.selectedFiles.size>0,t=w.fileList.some(e=>!I(e.path,O.lockedFiles));if(e||t){if(!await b())return;if(await l(),!$.value){T.error(P(`@76872:AI生成失败`));return}}await ve.value?.triggerQuickPush?.()}catch(e){console.error(`AI 提交并推送失败:`,e),T.error(`${P(`@76872:AI生成失败`)}: ${e.message}`)}finally{y.value=!1}}}let w=ue(),O=le(),A=M(``),{loadingState:j,show:oe,hide:N,setText:F}=ge(),{successState:se}=_e(),L=M(!1),R=M(``),z=a({get:()=>O.isStandardCommit,set:e=>{O.isStandardCommit=e}}),B=M(`feat`),V=M(``),H=M(``),U=M(``),W=M(``),G=M([]),K=M(!1),q=M([]),J=M(!1),Y=M(!1),X=a({get:()=>O.skipHooks,set:e=>{O.skipHooks=e}}),Z=a({get:()=>O.autoQuickPushOnEnter,set:e=>{O.autoQuickPushOnEnter=e}}),ve=M(null),Q=M(!1),ye=a(()=>[{value:`feat`,label:`feat: ${P(`@76872:新功能`)}`},{value:`fix`,label:`fix: ${P(`@76872:修复bug`)}`},{value:`docs`,label:`docs: ${P(`@76872:文档修改`)}`},{value:`style`,label:`style: ${P(`@76872:样式修改`)}`},{value:`refactor`,label:`refactor: ${P(`@76872:代码重构`)}`},{value:`test`,label:`test: ${P(`@76872:测试代码`)}`},{value:`chore`,label:`chore: ${P(`@76872:构建/工具修改`)}`}]),be=M([]),xe=a(()=>{if(!z.value)return A.value||R.value;let e=`${B.value||``}`;return V.value&&(e+=`(${V.value})`),e+=`: ${H.value}`,U.value&&(e+=`\n\n${U.value}`),W.value&&(e+=`\n\n${W.value}`),e}),$=a(()=>z.value?(w.isMergeInProgress||(B.value||``).trim()!==``)&&(H.value||``).trim()!==``:A.value.trim()!==``),Se=a(()=>w.hasConflictedFiles?!0:w.isMergeInProgress?!$.value:!w.fileList.some(e=>!I(e.path,O.lockedFiles))||!$.value),Ce=a(()=>{let e=`${P(`@76872:输入提交信息 (默认: `)}${R.value})`;return Z.value?`${e}${P(`@76872:(按回车一键推送)`)}`:e}),we=a(()=>{let e=P(`@76872:简短描述(必填)`);return Z.value?P(`@76872:简短描述(必填,按回车一键推送)`):e}),Te=a(()=>{let e=`git commit -m "${xe.value}"`;return X.value&&(e+=` --no-verify`),e});function Ee(){let e=O.config;e&&(R.value=e.defaultCommitMessage||``,e.descriptionTemplates&&Array.isArray(e.descriptionTemplates)&&(G.value=e.descriptionTemplates),e.scopeTemplates&&Array.isArray(e.scopeTemplates)&&(q.value=e.scopeTemplates),e.messageTemplates&&Array.isArray(e.messageTemplates)&&(be.value=e.messageTemplates))}function De(e){H.value=e,K.value=!1}function Oe(e){V.value=e,J.value=!1}function ke(){K.value=!0}function Ae(){J.value=!0}function Xe(){A.value=``,H.value=``,U.value=``,W.value=``,B.value=`feat`,O.autoSetDefaultMessage&&O.defaultCommitMessage&&(z.value?H.value=O.defaultCommitMessage:A.value=O.defaultCommitMessage)}function Ze(){oe({text:P(`@76872:正在暂存文件…`),showProgress:!1})}function Qe(){N()}function $e(e){if(N(),e){L.value=!0;try{setTimeout(async()=>{try{console.log(P(`@76872:推送成功,状态已更新`))}catch(e){console.error(`一键推送后处理失败:`,e)}finally{L.value=!1}},1e3)}catch(e){console.error(`一键推送后处理失败:`,e),L.value=!1}}}function et(e){A.value=e,Y.value=!1}async function tt(e){if(!Z.value||!$.value)return;let t=w.fileList.some(e=>!I(e.path,O.lockedFiles)),n=w.hasConflictedFiles;if(t&&$.value&&w.hasUpstream&&!n&&e.key===`Enter`&&!e.shiftKey){e.preventDefault();try{await ve.value?.triggerQuickPush()}catch(e){console.error(`回车自动一键提交失败:`,e)}}}async function nt(e){try{await O.saveDefaultMessage(e)&&T.success(P(`@76872:默认提交信息设置成功`))}catch(e){T.error(`${P(`@76872:设置默认提交信息失败: `)}${e.message}`)}}k(()=>w.pendingMergeMessage,e=>{e&&(z.value?(B.value=``,H.value=e):A.value=e,w.pendingMergeMessage=``,T.info(P(`@76872:已自动填充合并提交信息`)))}),k(()=>w.isAddingFiles,e=>{e&&j.visible&&F(P(`@76872:正在暂存文件…`))}),k(()=>w.isCommiting,e=>{e&&j.visible&&F(P(`@76872:正在提交更改...`))}),k(()=>w.isPushing,e=>{e&&j.visible&&N()}),x(async()=>{k(()=>O.config,Ee,{immediate:!0}),O.config||await O.loadConfig(),O.autoSetDefaultMessage&&O.defaultCommitMessage&&(z.value?H.value||=O.defaultCommitMessage:A.value||=O.defaultCommitMessage),w.pendingMergeMessage&&(z.value?(B.value=``,H.value=w.pendingMergeMessage):A.value=w.pendingMergeMessage,w.pendingMergeMessage=``,T.info(P(`@76872:已自动填充合并提交信息`)))});function rt(e,t){t([...e?G.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):G.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function it(e,t){t([...e?q.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):q.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function at(e){e.isSettings?(ke(),H.value=``):H.value=e.value}function ot(e){e.isSettings?(Ae(),V.value=``):V.value=e.value}function st(e,t){t([...e?be.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):be.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function ct(e){e.isSettings?(Y.value=!0,A.value=``):A.value=e.value}return(a,c)=>{let l=re,b=v,x=d,T=o,O=u,k=_;return h(),t(g,null,[r(`div`,{class:f([`card app-card`,{"is-pushing":i(w).isPushing}])},[r(`div`,Me,[r(`div`,Ne,[i(w).userName!==``&&i(w).userEmail!==``?(h(),m(je,{key:0,ref_key:`gitActionButtonsRef`,ref:ve,"has-user-commit-message":$.value,"final-commit-message":xe.value,"skip-hooks":X.value,"ai-generating":y.value,onAfterCommit:c[0]||=e=>{e&&Xe()},onAfterPush:$e,onBeforePush:Ze,onPushStart:Qe,onClearFields:Xe,onAiQuickPush:C},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`,`ai-generating`])):E(``,!0)])]),r(`div`,Pe,[r(`div`,Fe,[i(w).userName===``||i(w).userEmail===``?(h(),t(`div`,Ie,[s(l,{title:i(P)(`@76872:Git用户信息未配置`),type:`warning`,closable:!1,"show-icon":``},{default:D(()=>[r(`p`,null,e(i(P)(`@76872:您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:`)),1),c[11]||=r(`pre`,{class:`config-command`},`git config --global user.name "Your Name"
|
|
2
|
-
git config --global user.email "your.email@example.com"`,-1)]),_:1},8,[`title`])])):(h(),t(g,{key:1},[i(w).isMergeInProgress?(h(),t(`div`,Le,[s(l,{title:i(P)(`@76872:合并进行中`),type:`warning`,closable:!1,"show-icon":``},{default:D(()=>[r(`span`,null,e(i(P)(`@76872:分支合并尚未完成,请输入提交信息后点击「提交」按钮完成合并。`)),1)]),_:1},8,[`title`])])):E(``,!0),r(`div`,Re,[z.value?(h(),t(`div`,Ve,[r(`div`,He,[r(`div`,Ue,[s(O,{modelValue:B.value,"onUpdate:modelValue":c[2]||=e=>B.value=e,placeholder:i(P)(`@76872:提交类型`),class:`type-select`,clearable:``},{default:D(()=>[(h(!0),t(g,null,te(ye.value,e=>(h(),m(T,{key:e.value,label:e.label,value:e.value},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`]),r(`div`,We,[s(b,{modelValue:V.value,"onUpdate:modelValue":c[3]||=e=>V.value=e,"fetch-suggestions":it,placeholder:i(P)(`@76872:作用域(可选)`),class:`scope-input`,clearable:``,onSelect:ot},null,8,[`modelValue`,`placeholder`])]),r(`div`,Ge,[s(b,{modelValue:H.value,"onUpdate:modelValue":c[4]||=e=>H.value=e,"fetch-suggestions":rt,placeholder:we.value,class:`description-input`,clearable:``,onSelect:at,onKeydown:tt},{suffix:D(()=>[s(
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,An as t,At as n,Dn as r,Dr as i,En as a,F as o,Fn as s,Fr as c,Gn as l,I as u,J as d,Jr as f,Ln as p,On as m,Qn as h,Sn as g,U as _,V as v,Vn as y,W as b,Xn as x,Xr as S,Y as ee,dn as C,er as te,ht as w,i as T,kn as E,ln as ne,lr as D,mr as O,q as re,sr as k,ur as ie,wn as A,xn as j,xr as M,yn as ae,yr as oe,z as N}from"./element-plus-J45pKUrE.js";import{n as P,t as F}from"./_plugin-vue_export-helper-Csn085FF.js";import{t as se}from"./SvgIcon-5AlG3IfR.js";import{o as ce,t as le}from"./configStore-DOaPZ6Mq.js";import{U as ue,V as I,W as de,c as L,d as R,k as fe,l as z,s as pe,u as B}from"./index-C7Y9odvZ.js";y(),c(),C();var V={class:`loading-container`},H={class:`loading-text`},U={key:0,class:`loading-progress`},W=p({__name:`GlobalLoading`,props:{visible:{type:Boolean,default:!1},text:{default:P(`@2AEBA:加载中...`)},showProgress:{type:Boolean,default:!1},progress:{default:0},mock:{type:Boolean,default:!1}},setup(n){return(i,a)=>(h(),m(A,{to:`body`},[s(ne,{name:`loading-fade`},{default:D(()=>[n.visible||n.mock?(h(),t(`div`,{key:0,class:`global-loading-overlay`,onClick:a[0]||=j(()=>{},[`stop`])},[r(`div`,V,[a[1]||=r(`div`,{class:`loading-spinner`},[r(`div`,{class:`spinner-ring`}),r(`div`,{class:`spinner-ring`}),r(`div`,{class:`spinner-ring`})],-1),r(`div`,H,e(n.text),1),n.showProgress||n.mock?(h(),t(`div`,U,[r(`div`,{class:f([`progress-bar`,{"is-mock":n.mock&&!n.showProgress}]),style:S(n.showProgress?{width:n.progress+`%`}:void 0)},null,6)])):E(``,!0)])])):E(``,!0)]),_:1})]))}}),me=F(W,[[`__scopeId`,`data-v-f4fe1f34`]]);y(),c(),C();var G={class:`success-container`},K={class:`success-text`},q={key:0,class:`success-description`},J=p({__name:`SuccessModal`,props:{visible:{type:Boolean,default:!1},text:{default:P(`@71545:操作成功!`)},description:{default:``}},setup(n){return(i,a)=>(h(),m(A,{to:`body`},[s(ne,{name:`success-fade`},{default:D(()=>[n.visible?(h(),t(`div`,{key:0,class:`success-overlay`,onClick:a[0]||=j(()=>{},[`stop`])},[r(`div`,G,[a[1]||=r(`div`,{class:`success-icon`},[r(`svg`,{viewBox:`0 0 52 52`,class:`success-svg`},[r(`circle`,{class:`success-circle`,cx:`26`,cy:`26`,r:`25`,fill:`none`}),r(`path`,{class:`success-check`,fill:`none`,d:`m14.1 27.2l7.1 7.2 16.7-16.8`})])],-1),r(`div`,K,e(n.text),1),n.description?(h(),t(`div`,q,e(n.description),1)):E(``,!0)])])):E(``,!0)]),_:1})]))}}),he=F(J,[[`__scopeId`,`data-v-3e82b431`]]);O();var Y=oe({visible:!1,text:P(`@F2A3A:加载中...`),showProgress:!1,progress:0});function ge(){return{loadingState:Y,show:e=>{Y.visible=!0,Y.text=e?.text||P(`@F2A3A:加载中...`),Y.showProgress=e?.showProgress||!1,Y.progress=e?.progress||0},hide:()=>{Y.visible=!1},updateProgress:e=>{Y.progress=Math.max(0,Math.min(100,e))},updateText:e=>{Y.text=e},setText:e=>{Y.visible&&(Y.text=e)}}}O();var X=oe({visible:!1,text:P(`@B8591:操作成功!`),description:``});function _e(){let e=e=>{X.visible=!0,X.text=e?.text||P(`@B8591:操作成功!`),X.description=e?.description||``;let n=e?.duration||2e3;setTimeout(()=>{t()},n)},t=()=>{X.visible=!1};return{successState:X,show:e,hide:t}}y(),O(),c();var Z={class:`one-commit-content`},ve={class:`one-commit-text`},Q={class:`one-commit-title`},ye={key:0,class:`one-commit-desc`},be=F(p({__name:`QuickCommitButton`,props:{from:{default:`form`},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1}},emits:[`beforeCommit`,`afterCommit`,`clearFields`],setup(n,{expose:o,emit:c}){let l=ue(),u=le(),p=n,m=c,g=a(()=>l.fileList.some(e=>!I(e.path,u.lockedFiles))),_=a(()=>l.isSelectionMode&&l.selectedFiles.size>0&&l.selectedUnstagedPaths.length>0),v=a(()=>l.hasConflictedFiles?!0:l.isSelectionMode?!_.value||!p.hasUserCommitMessage:!g.value||!p.hasUserCommitMessage),y=a(()=>l.isAddingFiles||l.isCommiting),x=a(()=>l.hasConflictedFiles?P(`@2E184:存在冲突文件,请先解决冲突`):l.isSelectionMode?l.selectedFiles.size===0?P(`@2E184:请先勾选要提交的文件`):l.selectedUnstagedPaths.length===0?P(`@2E184:所选文件无需暂存或被锁定`):p.hasUserCommitMessage?P(`@2E184:一键完成:仅暂存所选文件 → 提交`):P(`@2E184:请输入提交信息`):g.value?p.hasUserCommitMessage?P(`@2E184:一键完成:暂存所有更改 → 提交`):P(`@2E184:请输入提交信息`):P(`@2E184:没有需要提交的更改`)),S=a(()=>l.isSelectionMode&&_.value?P(`@2E184:一键提交所选`):P(`@2E184:一键提交`)),ee=a(()=>p.from===`form`?l.isSelectionMode&&_.value?P(`@2E184:暂存所选 + 提交`):P(`@2E184:暂存 + 提交`):``);async function C(){m(`beforeCommit`);try{let e=await l.stageSelectedAndCommit(p.finalCommitMessage,p.skipHooks);e&&m(`clearFields`),m(`afterCommit`,e)}catch(e){console.error(`一键提交失败:`,e),m(`afterCommit`,!1)}}return o({triggerQuickCommit:C}),(a,o)=>{let c=d,l=N;return h(),t(`div`,null,[s(i(b),{content:x.value,placement:`top`,"show-after":200},{default:D(()=>[s(l,{type:`primary`,onClick:C,loading:y.value,disabled:v.value,class:f([n.from,`one-commit-button`])},{default:D(()=>[r(`div`,Z,[s(c,{class:`one-commit-icon`},{default:D(()=>[s(i(w))]),_:1}),r(`div`,ve,[r(`span`,Q,e(S.value),1),n.from===`form`?(h(),t(`span`,ye,e(ee.value),1)):E(``,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}}}),[[`__scopeId`,`data-v-7621b470`]]);y(),c(),O();var xe={class:`one-ai-push`},$={class:`one-ai-push-content`},Se={class:`one-ai-push-text`},Ce={class:`one-ai-push-title`},we={key:0,class:`one-ai-push-desc`},Te=F(p({__name:`AiQuickPushButton`,props:{from:{default:`form`},generating:{type:Boolean,default:!1}},emits:[`trigger`],setup(n,{emit:o}){let c=ue(),l=le(),u=n,d=o,p=a(()=>c.fileList.some(e=>!I(e.path,l.lockedFiles))),m=a(()=>c.isSelectionMode&&c.selectedFiles.size>0&&c.selectedUnstagedPaths.length>0),g=a(()=>!c.isSelectionMode&&!p.value&&c.branchAhead>0),_=a(()=>c.hasConflictedFiles||!c.hasUpstream?!0:c.isSelectionMode?!m.value:!p.value&&c.branchAhead===0),v=a(()=>u.generating||c.isAddingFiles||c.isCommiting||c.isPushing),y=a(()=>c.hasConflictedFiles?P(`@2E184:存在冲突文件,请先解决冲突`):c.hasUpstream?u.generating?P(`@2E184:AI 正在生成提交信息…`):c.isSelectionMode?m.value?P(`@2E184:一键完成:AI 生成提交信息 → 仅暂存所选文件 → 提交 → 推送`):P(`@2E184:请先勾选要推送的文件`):!p.value&&c.branchAhead===0?P(`@2E184:没有需要提交或推送的更改`):p.value?P(`@2E184:一键完成:AI 生成提交信息 → 暂存所有更改 → 提交 → 推送`):P(`@2E184:本地已提交,AI 将直接推送到远程仓库`):P(`@2E184:当前分支没有上游分支`)),x=a(()=>u.generating?P(`@2E184:AI 正在生成提交信息…`):c.isSelectionMode&&m.value?P(`@2E184:AI 提交并推送所选`):P(`@2E184:AI 提交并推送`)),S=a(()=>u.from!==`form`||u.generating?``:g.value?P(`@2E184:本地已提交,直接推送`):P(`@2E184:AI 生成信息 + 推送`));function ee(){_.value||v.value||d(`trigger`)}return(a,o)=>{let c=N;return h(),t(`div`,xe,[s(i(b),{content:y.value,placement:`top`,"show-after":200},{default:D(()=>[s(c,{type:`primary`,onClick:ee,loading:v.value,disabled:_.value,class:f([n.from,`one-ai-push-button`])},{default:D(()=>[r(`div`,$,[s(se,{class:`one-ai-push-icon`,"icon-class":`ai-commit`,style:{color:`#fff`}}),r(`div`,Se,[r(`span`,Ce,e(x.value),1),n.from===`form`?(h(),t(`span`,we,e(S.value),1)):E(``,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}}}),[[`__scopeId`,`data-v-8a2a3d74`]]);y(),O();var Ee={class:`form-bottom-actions`},De={class:`actions-flex-container`},Oe={class:`left-actions`},ke={class:`button-grid`},Ae={class:`right-actions`},je=F(p({__name:`GitActionButtons`,props:{hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:``},skipHooks:{type:Boolean,default:!1},from:{default:`form`},aiGenerating:{type:Boolean,default:!1}},emits:[`afterCommit`,`afterPush`,`beforePush`,`pushStart`,`clearFields`,`aiQuickPush`],setup(e,{expose:n,emit:i}){let a=i,o=M(null);function c(e){a(`afterCommit`,e)}function l(e){a(`afterPush`,e)}function u(){a(`beforePush`)}function d(){a(`pushStart`)}function f(){a(`clearFields`)}function p(){a(`aiQuickPush`)}async function m(){return o.value?.triggerQuickPush()}return n({triggerQuickPush:m}),(n,i)=>(h(),t(`div`,Ee,[r(`div`,De,[r(`div`,Oe,[r(`div`,ke,[s(R,{onClick:()=>{},from:e.from},null,8,[`from`]),s(B,{"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforeCommit:()=>{},onAfterCommit:c,onClick:()=>{},from:e.from},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`,`from`]),s(z,{onBeforePush:()=>{},onAfterPush:l,onClick:()=>{},from:e.from},null,8,[`from`])])]),r(`div`,Ae,[s(be,{from:e.from,"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onAfterCommit:c,onClearFields:f},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),s(L,{ref_key:`quickPushRef`,ref:o,from:e.from,"has-user-commit-message":e.hasUserCommitMessage,"final-commit-message":e.finalCommitMessage,"skip-hooks":e.skipHooks,onBeforePush:u,onPushStart:d,onAfterPush:l,onClearFields:f},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),s(Te,{from:e.from,generating:e.aiGenerating,onTrigger:p},null,8,[`from`,`generating`])])])]))}}),[[`__scopeId`,`data-v-de459eed`]]);y(),O(),c(),C();var Me={class:`card-header app-card-header`},Ne={class:`header-left`},Pe={class:`card-content app-card-content`},Fe={class:`layout-container`},Ie={key:0,class:`git-config-warning`},Le={key:0,class:`merge-in-progress-banner`},Re={class:`commit-section`},ze={key:0,class:`commit-form`},Be={class:`description-container`},Ve={key:1,class:`standard-commit-form`},He={class:`standard-commit-header`},Ue={class:`type-scope-container`},We={class:`scope-wrapper`},Ge={class:`description-container description-inline`},Ke=[`aria-expanded`],qe={class:`advanced-fields`},Je={key:0,class:`status-updating-indicator`},Ye={key:0,class:`status-updating-indicator`},Xe=F(p({__name:`CommitForm`,setup(c){let p=M(!1),y=M(!1);async function b(){let e=w.isSelectionMode&&w.selectedFiles.size>0?[...w.selectedFiles]:[],t=ce(),n=await(await fetch(`/api/config/generate-commit-message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({selectedPaths:e,locale:t.currentLocale})})).json();if(!n.success){let e=n.code,t=n.error||P(`@76872:AI生成失败`),r=e?{TIMEOUT:`@76872:AI生成超时,请重试或检查模型响应速度`,NO_MODEL:`@76872:未配置AI模型,请先在通用设置中添加模型`,NO_JSON:`@76872:AI未返回有效结果,请重试`,PARSE_FAILED:`@76872:AI返回格式无法解析,请重试`,GENERATE_FAILED:`@76872:AI生成失败`,HTTP_ERR:`@76872:AI生成失败`}[e]:null;return T.error(r?P(r):t),!1}let r=[`feat`,`fix`,`docs`,`style`,`refactor`,`test`,`chore`];if(z.value)n.type&&r.includes(n.type)&&(B.value=n.type),n.scope!==void 0&&(V.value=n.scope),n.description&&(H.value=n.description);else{let e=n.type&&n.description?n.scope?`${n.type}(${n.scope}): ${n.description}`:`${n.type}: ${n.description}`:n.description||``;e&&(A.value=e)}return!0}async function S(){if(!p.value){p.value=!0;try{if(!await b())return;T.success(P(`@76872:AI已生成提交信息`))}catch(e){T.error(`${P(`@76872:AI生成失败`)}: ${e.message}`)}finally{p.value=!1}}}async function C(){if(!y.value){y.value=!0;try{let e=w.isSelectionMode&&w.selectedFiles.size>0,t=w.fileList.some(e=>!I(e.path,O.lockedFiles));if(e||t){if(!await b())return;if(await l(),!$.value){T.error(P(`@76872:AI生成失败`));return}}await ve.value?.triggerQuickPush?.()}catch(e){console.error(`AI 提交并推送失败:`,e),T.error(`${P(`@76872:AI生成失败`)}: ${e.message}`)}finally{y.value=!1}}}let w=ue(),O=le(),A=M(``),{loadingState:j,show:oe,hide:N,setText:F}=ge(),{successState:se}=_e(),L=M(!1),R=M(``),z=a({get:()=>O.isStandardCommit,set:e=>{O.isStandardCommit=e}}),B=M(`feat`),V=M(``),H=M(``),U=M(``),W=M(``),G=M([]),K=M(!1),q=M([]),J=M(!1),Y=M(!1),X=a({get:()=>O.skipHooks,set:e=>{O.skipHooks=e}}),Z=a({get:()=>O.autoQuickPushOnEnter,set:e=>{O.autoQuickPushOnEnter=e}}),ve=M(null),Q=M(!1),ye=a(()=>[{value:`feat`,label:`feat: ${P(`@76872:新功能`)}`},{value:`fix`,label:`fix: ${P(`@76872:修复bug`)}`},{value:`docs`,label:`docs: ${P(`@76872:文档修改`)}`},{value:`style`,label:`style: ${P(`@76872:样式修改`)}`},{value:`refactor`,label:`refactor: ${P(`@76872:代码重构`)}`},{value:`test`,label:`test: ${P(`@76872:测试代码`)}`},{value:`chore`,label:`chore: ${P(`@76872:构建/工具修改`)}`}]),be=M([]),xe=a(()=>{if(!z.value)return A.value||R.value;let e=`${B.value||``}`;return V.value&&(e+=`(${V.value})`),e+=`: ${H.value}`,U.value&&(e+=`\n\n${U.value}`),W.value&&(e+=`\n\n${W.value}`),e}),$=a(()=>z.value?(w.isMergeInProgress||(B.value||``).trim()!==``)&&(H.value||``).trim()!==``:A.value.trim()!==``),Se=a(()=>w.hasConflictedFiles?!0:w.isMergeInProgress?!$.value:!w.fileList.some(e=>!I(e.path,O.lockedFiles))||!$.value),Ce=a(()=>{let e=`${P(`@76872:输入提交信息 (默认: `)}${R.value})`;return Z.value?`${e}${P(`@76872:(按回车一键推送)`)}`:e}),we=a(()=>{let e=P(`@76872:简短描述(必填)`);return Z.value?P(`@76872:简短描述(必填,按回车一键推送)`):e}),Te=a(()=>{let e=`git commit -m "${xe.value}"`;return X.value&&(e+=` --no-verify`),e});function Ee(){let e=O.config;e&&(R.value=e.defaultCommitMessage||``,e.descriptionTemplates&&Array.isArray(e.descriptionTemplates)&&(G.value=e.descriptionTemplates),e.scopeTemplates&&Array.isArray(e.scopeTemplates)&&(q.value=e.scopeTemplates),e.messageTemplates&&Array.isArray(e.messageTemplates)&&(be.value=e.messageTemplates))}function De(e){H.value=e,K.value=!1}function Oe(e){V.value=e,J.value=!1}function ke(){K.value=!0}function Ae(){J.value=!0}function Xe(){A.value=``,H.value=``,U.value=``,W.value=``,B.value=`feat`,O.autoSetDefaultMessage&&O.defaultCommitMessage&&(z.value?H.value=O.defaultCommitMessage:A.value=O.defaultCommitMessage)}function Ze(){oe({text:P(`@76872:正在暂存文件…`),showProgress:!1})}function Qe(){N()}function $e(e){if(N(),e){L.value=!0;try{setTimeout(async()=>{try{console.log(P(`@76872:推送成功,状态已更新`))}catch(e){console.error(`一键推送后处理失败:`,e)}finally{L.value=!1}},1e3)}catch(e){console.error(`一键推送后处理失败:`,e),L.value=!1}}}function et(e){A.value=e,Y.value=!1}async function tt(e){if(!Z.value||!$.value)return;let t=w.fileList.some(e=>!I(e.path,O.lockedFiles)),n=w.hasConflictedFiles;if(t&&$.value&&w.hasUpstream&&!n&&e.key===`Enter`&&!e.shiftKey){e.preventDefault();try{await ve.value?.triggerQuickPush()}catch(e){console.error(`回车自动一键提交失败:`,e)}}}async function nt(e){try{await O.saveDefaultMessage(e)&&T.success(P(`@76872:默认提交信息设置成功`))}catch(e){T.error(`${P(`@76872:设置默认提交信息失败: `)}${e.message}`)}}k(()=>w.pendingMergeMessage,e=>{e&&(z.value?(B.value=``,H.value=e):A.value=e,w.pendingMergeMessage=``,T.info(P(`@76872:已自动填充合并提交信息`)))}),k(()=>w.isAddingFiles,e=>{e&&j.visible&&F(P(`@76872:正在暂存文件…`))}),k(()=>w.isCommiting,e=>{e&&j.visible&&F(P(`@76872:正在提交更改...`))}),k(()=>w.isPushing,e=>{e&&j.visible&&N()}),x(async()=>{k(()=>O.config,Ee,{immediate:!0}),O.config||await O.loadConfig(),O.autoSetDefaultMessage&&O.defaultCommitMessage&&(z.value?H.value||=O.defaultCommitMessage:A.value||=O.defaultCommitMessage),w.pendingMergeMessage&&(z.value?(B.value=``,H.value=w.pendingMergeMessage):A.value=w.pendingMergeMessage,w.pendingMergeMessage=``,T.info(P(`@76872:已自动填充合并提交信息`)))});function rt(e,t){t([...e?G.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):G.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function it(e,t){t([...e?q.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):q.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function at(e){e.isSettings?(ke(),H.value=``):H.value=e.value}function ot(e){e.isSettings?(Ae(),V.value=``):V.value=e.value}function st(e,t){t([...e?be.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):be.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function ct(e){e.isSettings?(Y.value=!0,A.value=``):A.value=e.value}return(a,c)=>{let l=re,b=v,x=d,T=o,O=u,k=_;return h(),t(g,null,[r(`div`,{class:f([`card app-card`,{"is-pushing":i(w).isPushing}])},[r(`div`,Me,[r(`div`,Ne,[i(w).userName!==``&&i(w).userEmail!==``?(h(),m(je,{key:0,ref_key:`gitActionButtonsRef`,ref:ve,"has-user-commit-message":$.value,"final-commit-message":xe.value,"skip-hooks":X.value,"ai-generating":y.value,onAfterCommit:c[0]||=e=>{e&&Xe()},onAfterPush:$e,onBeforePush:Ze,onPushStart:Qe,onClearFields:Xe,onAiQuickPush:C},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`,`ai-generating`])):E(``,!0)])]),r(`div`,Pe,[r(`div`,Fe,[i(w).userName===``||i(w).userEmail===``?(h(),t(`div`,Ie,[s(l,{title:i(P)(`@76872:Git用户信息未配置`),type:`warning`,closable:!1,"show-icon":``},{default:D(()=>[r(`p`,null,e(i(P)(`@76872:您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:`)),1),c[11]||=r(`pre`,{class:`config-command`},`git config --global user.name "Your Name"
|
|
2
|
+
git config --global user.email "your.email@example.com"`,-1)]),_:1},8,[`title`])])):(h(),t(g,{key:1},[i(w).isMergeInProgress?(h(),t(`div`,Le,[s(l,{title:i(P)(`@76872:合并进行中`),type:`warning`,closable:!1,"show-icon":``},{default:D(()=>[r(`span`,null,e(i(P)(`@76872:分支合并尚未完成,请输入提交信息后点击「提交」按钮完成合并。`)),1)]),_:1},8,[`title`])])):E(``,!0),r(`div`,Re,[z.value?(h(),t(`div`,Ve,[r(`div`,He,[r(`div`,Ue,[s(O,{modelValue:B.value,"onUpdate:modelValue":c[2]||=e=>B.value=e,placeholder:i(P)(`@76872:提交类型`),class:`type-select`,clearable:``},{default:D(()=>[(h(!0),t(g,null,te(ye.value,e=>(h(),m(T,{key:e.value,label:e.label,value:e.value},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`]),r(`div`,We,[s(b,{modelValue:V.value,"onUpdate:modelValue":c[3]||=e=>V.value=e,"fetch-suggestions":it,placeholder:i(P)(`@76872:作用域(可选)`),class:`scope-input`,clearable:``,onSelect:ot},null,8,[`modelValue`,`placeholder`])]),r(`div`,Ge,[s(b,{modelValue:H.value,"onUpdate:modelValue":c[4]||=e=>H.value=e,"fetch-suggestions":rt,placeholder:we.value,class:`description-input`,clearable:``,onSelect:at,onKeydown:tt},{suffix:D(()=>[s(de,{"custom-class":`ai-suffix-btn`,tooltip:i(P)(`@76872:AI生成提交信息`),"icon-class":p.value?``:`ai-commit`,size:`small`,disabled:p.value,onClick:S},{default:D(()=>[p.value?(h(),m(x,{key:0,class:`is-loading`},{default:D(()=>[s(i(n))]),_:1})):E(``,!0)]),_:1},8,[`tooltip`,`icon-class`,`disabled`])]),_:1},8,[`modelValue`,`placeholder`])])])]),r(`button`,{type:`button`,class:`advanced-options-toggle`,"aria-expanded":Q.value,onClick:c[5]||=e=>Q.value=!Q.value},[r(`span`,null,e(Q.value?i(P)(`@76872:收起`):i(P)(`@76872:正文及页脚`)),1),s(x,{class:f([`toggle-icon`,{"is-active":Q.value}])},{default:D(()=>[s(i(ee))]),_:1},8,[`class`])],8,Ke),ie(r(`div`,qe,[s(k,{modelValue:U.value,"onUpdate:modelValue":c[6]||=e=>U.value=e,type:`textarea`,rows:4,placeholder:i(P)(`@76872:正文(可选):详细描述本次提交的内容和原因`),class:`body-input`,clearable:``},null,8,[`modelValue`,`placeholder`]),s(k,{modelValue:W.value,"onUpdate:modelValue":c[7]||=e=>W.value=e,placeholder:i(P)(`@76872:页脚(可选):如 Closes #123`),class:`footer-input`,clearable:``},null,8,[`modelValue`,`placeholder`])],512),[[ae,Q.value]])])):(h(),t(`div`,ze,[r(`div`,Be,[s(b,{modelValue:A.value,"onUpdate:modelValue":c[1]||=e=>A.value=e,"fetch-suggestions":st,placeholder:Ce.value,type:`textarea`,rows:3,resize:`none`,class:`commit-message-input`,onSelect:ct,onKeydown:tt},null,8,[`modelValue`,`placeholder`]),s(de,{"custom-class":`ai-suffix-btn ai-suffix-btn--ta`,tooltip:i(P)(`@76872:AI生成提交信息`),"icon-class":p.value?``:`ai-commit`,size:`small`,disabled:p.value,onClick:S},{default:D(()=>[p.value?(h(),m(x,{key:0,class:`is-loading`},{default:D(()=>[s(i(n))]),_:1})):E(``,!0)]),_:1},8,[`tooltip`,`icon-class`,`disabled`])])])),Se.value?E(``,!0):(h(),m(fe,{key:2,command:Te.value,title:i(P)(`@76872:提交命令预览:`),placeholder:`git commit -m "<提交信息>"`},null,8,[`command`,`title`]))])],64))])])],2),s(pe,{visible:K.value,"onUpdate:visible":c[8]||=e=>K.value=e,type:`description`,title:i(P)(`@76872:简短描述模板设置`),placeholder:i(P)(`@76872:输入新模板内容`),"edit-placeholder":i(P)(`@76872:编辑模板内容`),"empty-description":i(P)(`@76872:暂无保存的模板`),onUseTemplate:De},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),s(pe,{visible:J.value,"onUpdate:visible":c[9]||=e=>J.value=e,type:`scope`,title:i(P)(`@76872:作用域模板设置`),placeholder:i(P)(`@76872:输入新作用域模板`),"edit-placeholder":i(P)(`@76872:编辑作用域模板内容`),"empty-description":i(P)(`@76872:暂无保存的作用域`),onUseTemplate:Oe},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),s(pe,{visible:Y.value,"onUpdate:visible":c[10]||=e=>Y.value=e,type:`message`,title:i(P)(`@76872:默认提交信息设置`),placeholder:i(P)(`@76872:输入新模板内容`),"edit-placeholder":i(P)(`@76872:编辑模板内容`),"empty-description":i(P)(`@76872:暂无保存的模板`),"show-default-section":!0,"show-help-text":!0,onUseTemplate:et,onSetDefault:nt},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),s(ne,{name:`el-fade-in-linear`},{default:D(()=>[L.value?(h(),t(`div`,Je,[s(x,{class:`is-loading`},{default:D(()=>[s(i(n))]),_:1}),r(`span`,null,e(i(P)(`@76872:更新状态中...`)),1)])):E(``,!0)]),_:1}),s(me,{visible:i(j).visible,text:i(j).text,"show-progress":i(j).showProgress,progress:i(j).progress},null,8,[`visible`,`text`,`show-progress`,`progress`]),s(he,{visible:i(se).visible,text:i(se).text,description:i(se).description},null,8,[`visible`,`text`,`description`]),s(ne,{name:`el-fade-in-linear`},{default:D(()=>[L.value?(h(),t(`div`,Ye,[s(x,{class:`is-loading`},{default:D(()=>[s(i(n))]),_:1}),r(`span`,null,e(i(P)(`@76872:更新状态中...`)),1)])):E(``,!0)]),_:1})],64)}}}),[[`__scopeId`,`data-v-3f8848af`]]);export{Xe as default};
|