zen-gitsync 2.18.7 → 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.
Files changed (76) hide show
  1. package/package.json +4 -1
  2. package/src/cli/ai/agent.js +7 -0
  3. package/src/cli/ai/runtime.test.js +22 -1
  4. package/src/cli/ai/tools.js +1 -1
  5. package/src/cli/ai/tools.test.js +1 -1
  6. package/src/cli/ai/transport.js +8 -3
  7. package/src/config.js +48 -6
  8. package/src/mcp/tools/workbench.js +1 -1
  9. package/src/ui/public/assets/{AgentView-am93H7C2.css → AgentView-CV_8sYX6.css} +1 -1
  10. package/src/ui/public/assets/AgentView-DxmnqJxE.js +1 -0
  11. package/src/ui/public/assets/{AppVersionBadge-D7X53Bf1.js → AppVersionBadge-C4OhcUi8.js} +2 -2
  12. package/src/ui/public/assets/{BranchSelector-yXxfIs57.js → BranchSelector-CrLieQyJ.js} +1 -1
  13. package/src/ui/public/assets/{CommitForm-C8Ez91_c.js → CommitForm-KGQisnPQ.js} +2 -2
  14. package/src/ui/public/assets/{CommonDialog-BUuLsgNS.js → CommonDialog-j_53ORvj.js} +1 -1
  15. package/src/ui/public/assets/CopySessionButton-y5Rzmact.js +20 -0
  16. package/src/ui/public/assets/EditorView-CkZb2kw5.js +1 -0
  17. package/src/ui/public/assets/{EditorView-BUiVsBv7.css → EditorView-Ims2BUK_.css} +1 -1
  18. package/src/ui/public/assets/{FlowExecutionViewer-BuU5kQG8.js → FlowExecutionViewer-CQ-TPhwF.js} +1 -1
  19. package/src/ui/public/assets/{FlowOrchestrationWorkspace-CTBEooj5.js → FlowOrchestrationWorkspace-BMQSVm3V.js} +1 -1
  20. package/src/ui/public/assets/{LogList-Bq5aLoA-.js → LogList-BxH6QNlK.js} +4 -4
  21. package/src/ui/public/assets/{MindmapView-CSysrruz.js → MindmapView-D9_qjJsR.js} +1 -1
  22. package/src/ui/public/assets/{MonitorView-Cgf5zRxT.js → MonitorView-z_fsnE8Y.js} +1 -1
  23. package/src/ui/public/assets/{ProjectStartupButton-CrLWTK20.js → ProjectStartupButton-CFB_JpYG.js} +1 -1
  24. package/src/ui/public/assets/RecentDirectoriesChat-7fzSkSmc.css +1 -0
  25. package/src/ui/public/assets/RecentDirectoriesChat-BYI8lkjQ.js +1 -0
  26. package/src/ui/public/assets/{RemoteManagerDialog-CJZFzQPc.js → RemoteManagerDialog-DXDcN8e7.js} +1 -1
  27. package/src/ui/public/assets/{RemoteRepoCard-aSx1ikZ8.js → RemoteRepoCard-C_TYGsXi.js} +1 -1
  28. package/src/ui/public/assets/{SourceMapView-DEljf14g.js → SourceMapView-D6cSweDt.js} +1 -1
  29. package/src/ui/public/assets/{SvgIcon-Du5MOe8A.js → SvgIcon-5AlG3IfR.js} +1 -1
  30. package/src/ui/public/assets/{UserInputNode-oOQwaadU.js → UserInputNode-BKP869D6.js} +1 -1
  31. package/src/ui/public/assets/WorkbenchView-D4UDurhF.js +6 -0
  32. package/src/ui/public/assets/WorkbenchView-DogERhHQ.css +1 -0
  33. package/src/ui/public/assets/_plugin-vue_export-helper-Csn085FF.js +19 -0
  34. package/src/ui/public/assets/agentConversations-DyzaxUXm.js +10 -0
  35. package/src/ui/public/assets/configStore-DOaPZ6Mq.js +1 -0
  36. package/src/ui/public/assets/index-C7Y9odvZ.js +57 -0
  37. package/src/ui/public/assets/index-NYzaTfbS.css +1 -0
  38. package/src/ui/public/assets/useOrchestrator-C236G5P5.js +1 -0
  39. package/src/ui/public/index.html +6 -6
  40. package/src/ui/server/index.js +8 -0
  41. package/src/ui/server/routes/config.js +13 -0
  42. package/src/ui/server/routes/fileOpen.js +57 -1
  43. package/src/ui/server/routes/fileOpen.test.js +1 -1
  44. package/src/ui/server/routes/workbench/agentChat.js +106 -12
  45. package/src/ui/server/routes/workbench/agentChatExtensions.test.js +290 -0
  46. package/src/ui/server/routes/workbench/agentChatShared.test.js +148 -57
  47. package/src/ui/server/routes/workbench/agentEngines.js +8 -4
  48. package/src/ui/server/routes/workbench/agentExtensions.js +157 -0
  49. package/src/ui/server/routes/workbench/agentMarketplace.js +12 -0
  50. package/src/ui/server/routes/workbench/agentParity.test.js +16 -0
  51. package/src/ui/server/routes/workbench/agentRoutes.js +105 -8
  52. package/src/ui/server/routes/workbench/agentRoutes.test.js +141 -1
  53. package/src/ui/server/routes/workbench/chatPrompts.js +115 -0
  54. package/src/ui/server/routes/workbench/chatPrompts.test.js +114 -0
  55. package/src/ui/server/routes/workbench/executorModels.js +30 -5
  56. package/src/ui/server/routes/workbench/executorModels.test.js +16 -4
  57. package/src/ui/server/routes/workbench/index.js +1 -1
  58. package/src/ui/server/routes/workbench/jobActivity.js +3 -3
  59. package/src/ui/server/routes/workbench/jobActivity.test.js +1 -0
  60. package/src/ui/server/routes/workbench/runExternalTurn.js +22 -25
  61. package/src/ui/server/routes/workbench/runExternalTurn.test.js +34 -0
  62. package/src/ui/server/routes/workbench/taskRunner.codebuddy.test.js +275 -0
  63. package/src/ui/server/routes/workbench/taskRunner.js +311 -24
  64. package/src/ui/server/routes/workbench/taskRunner.opencode.test.js +2 -1
  65. package/src/ui/public/assets/AgentView-BlG0PdkI.js +0 -1
  66. package/src/ui/public/assets/CopySessionButton-Do4vHJm6.js +0 -20
  67. package/src/ui/public/assets/EditorView-DK2dYRVb.js +0 -1
  68. package/src/ui/public/assets/RecentDirectoriesChat-B19uAf8k.css +0 -1
  69. package/src/ui/public/assets/RecentDirectoriesChat-BlIG_9G4.js +0 -1
  70. package/src/ui/public/assets/WorkbenchView-D6NRqZ5W.css +0 -1
  71. package/src/ui/public/assets/WorkbenchView-DXzxg5_z.js +0 -8
  72. package/src/ui/public/assets/_plugin-vue_export-helper-CDrhhAKC.js +0 -19
  73. package/src/ui/public/assets/agentConversations-BKjyYn-u.js +0 -8
  74. package/src/ui/public/assets/configStore-D0oycG71.js +0 -1
  75. package/src/ui/public/assets/index-DjaZpz97.js +0 -57
  76. 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.7",
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",
@@ -42,6 +42,8 @@
42
42
  "verify:wb-oc-modes": "node scripts/verify-wb-oc-agent-chat.cjs",
43
43
  "verify:wb-oc-modes:reverse": "node scripts/verify-wb-oc-agent-chat-reverse.cjs",
44
44
  "verify:wb-default-prompt": "node scripts/verify-workbench-default-prompt.cjs",
45
+ "verify:agent-prompt-settings": "node scripts/verify-agent-prompt-settings.cjs",
46
+ "verify:agent-prompt-settings:reverse": "node scripts/verify-agent-prompt-settings.cjs --reverse",
45
47
  "verify:wb-dialogs": "node scripts/verify-workbench-dialogs.cjs",
46
48
  "verify:wb-dispatch": "node scripts/verify-workbench-dispatch-attach.cjs",
47
49
  "verify:wb-env-context": "node scripts/verify-workbench-env-context.mjs",
@@ -72,6 +74,7 @@
72
74
  "verify:wb-card-cover:reverse": "node scripts/verify-wb-card-cover.cjs --reverse",
73
75
  "verify:wb-list-view": "node scripts/verify-wb-list-view.cjs",
74
76
  "verify:wb-executor-models": "node scripts/verify-wb-executor-models.cjs",
77
+ "verify:wb-codebuddy-env": "node scripts/verify-wb-codebuddy-env.mjs",
75
78
  "verify:wb-task-sound": "node scripts/verify-wb-task-sound.cjs",
76
79
  "verify:agent-ask-sound": "node scripts/verify-agent-ask-sound.cjs",
77
80
  "verify:wb-proj-branch": "node scripts/verify-workbench-proj-branch.cjs",
@@ -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 \`![caption](path)\` — 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 次、单次封顶 30s),一个用例就跑到分钟级。
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({
@@ -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: {
@@ -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)
@@ -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 = 500
26
- const RETRY_MAX_DELAY_MS = 30_000
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 就听它的(封顶,免得被一个 3600 挂住半小时)。 */
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
- // (opencode run --format json / codex exec --json,模型都跟随各自 CLI 的配置)。
82
- export const TASK_EXECUTORS = ['claude', 'opencode', 'codex'];
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(交给调用方取默认),不抛错 ——
@@ -176,6 +178,28 @@ export function normalizeAgentPresetPrompts(value) {
176
178
  return out;
177
179
  }
178
180
 
181
+ // 「g ai 智能体的默认提示词」上限。
182
+ // 与派发预设提示词同值(4000):两者都是"每一轮对话都会被拼进 prompt 的约束",
183
+ // 到这个量级已经能写下一整套规范,再长只是让每次请求都白烧一遍 token。
184
+ const AGENT_DEFAULT_PROMPT_MAX = 4000;
185
+
186
+ /**
187
+ * 规范化「g ai 智能体的默认提示词」(全局配置,跨项目共享)。
188
+ *
189
+ * 语义约定:
190
+ * · undefined / null / 非字符串 → null(没配过或手改坏了,调用方回落 defaultConfig,
191
+ * 即空串 = 不注入)—— 与 normalizeAgentPresetPrompts 同一套"坏值不落盘"的口径
192
+ * · 字符串(**含空串**)→ 截断到上限的副本。空串是合法值(= 清除),照写。
193
+ *
194
+ * 为什么只截断、不 trim:用户可能刻意用空行排版(几段约束),首尾空白在拼进 prompt
195
+ * 时由 buildChatPromptSection 统一 trim —— 落盘保持原样,与派发提示词同一套口径。
196
+ */
197
+ export function normalizeAgentDefaultPrompt(value) {
198
+ if (value === undefined || value === null) return null;
199
+ if (typeof value !== 'string') return null;
200
+ return value.slice(0, AGENT_DEFAULT_PROMPT_MAX);
201
+ }
202
+
179
203
  /**
180
204
  * 三个提示通道(页面提示 / 浏览器通知 / 提示音)的最终取值。
181
205
  *
@@ -267,7 +291,12 @@ const defaultConfig = {
267
291
  // 空数组 = 使用前端内置的 5 条默认(zh/en 文案随界面语言走,见 utils/agentPresets.ts);
268
292
  // 非空 = 用户自定义全量(每条 {id, label, prompt})。归一化见 normalizeAgentPresetPrompts。
269
293
  agentPresetPrompts: [],
270
- // 工作台任务执行器(claude | opencode | codex)。全局配置,跨项目共享。
294
+ // g ai 智能体的默认提示词(全局配置,跨项目共享)。
295
+ // 和 g ai 对话时每一轮都会拼进系统提示词(Web 智能体视图 / 文件空间面板 / 定时任务,
296
+ // 见 workbench/chatPrompts.js)。空串 = 不注入。
297
+ // 归一化见 normalizeAgentDefaultPrompt。
298
+ agentDefaultPrompt: '',
299
+ // 工作台任务执行器(claude | opencode | codex | codebuddy)。全局配置,跨项目共享。
271
300
  // 决定「执行任务 / 执行子任务 / 从此处开始 / 简单任务续聊」这条链路
272
301
  // 默认 spawn 哪个本地 CLI;执行入口可以按次覆盖(见 workbench 执行路由)。
273
302
  taskExecutor: 'claude',
@@ -303,7 +332,7 @@ const defaultConfig = {
303
332
  // 白名单式的默认空数组:以后新增工具默认就固定显示,不需要回头改默认值。
304
333
  // 未勾选(= 落在本数组里)的工具连同未安装的一起收进顶栏右侧「更多」菜单。
305
334
  headerToolsHidden: [],
306
- // 工作台任务执行器「上次用过/选过的那个」(claude | opencode | codex),null = 还没选过,
335
+ // 工作台任务执行器「上次用过/选过的那个」(claude | opencode | codex | codebuddy),null = 还没选过,
307
336
  // 回落顶层 taskExecutor(设置里配的默认值)。两者**故意分开**:后者是"配置的默认",
308
337
  // 前者是"上次用的",语义不同,合并就再也分不清哪个是用户主动配的。
309
338
  // 2026-09-30: 原先记在 localStorage(键 zen-gitsync-task-executor),而 GUI 每次启动都换一个
@@ -615,6 +644,8 @@ async function loadConfig() {
615
644
  taskExecutor: normalizeTaskExecutor(raw.taskExecutor) ?? defaultConfig.taskExecutor,
616
645
  agentPresetPrompts: normalizeAgentPresetPrompts(raw.agentPresetPrompts)
617
646
  ?? defaultConfig.agentPresetPrompts,
647
+ agentDefaultPrompt: normalizeAgentDefaultPrompt(raw.agentDefaultPrompt)
648
+ ?? defaultConfig.agentDefaultPrompt,
618
649
  ...resolveNotifySwitches(raw)
619
650
  };
620
651
  }
@@ -638,6 +669,9 @@ async function loadConfig() {
638
669
  // 同 taskExecutor:全局配置,始终取顶层,防止被项目配置里的旧值覆盖
639
670
  agentPresetPrompts: normalizeAgentPresetPrompts(raw?.agentPresetPrompts)
640
671
  ?? defaultConfig.agentPresetPrompts,
672
+ // 同 agentPresetPrompts:全局配置,始终取顶层,防止被项目配置里的旧值覆盖
673
+ agentDefaultPrompt: normalizeAgentDefaultPrompt(raw?.agentDefaultPrompt)
674
+ ?? defaultConfig.agentDefaultPrompt,
641
675
  ...resolveNotifySwitches(raw)
642
676
  };
643
677
  }
@@ -691,7 +725,7 @@ async function saveConfig(config) {
691
725
  // 项目级是这一族键最容易踩的坑。解构出来本身不写回顶层(它已不再被任何地方读取)。
692
726
  const {
693
727
  theme, locale, models, ui, aiMaxToolIterations, aiMaxRequestTokens, taskExecutor,
694
- agentPresetPrompts,
728
+ agentPresetPrompts, agentDefaultPrompt,
695
729
  notifyOnTaskDone: legacyNotifyOnTaskDone,
696
730
  notifyPageOnTaskDone, notifyBrowserOnTaskDone, notifySoundOnTaskDone,
697
731
  ...projectConfig
@@ -745,6 +779,12 @@ async function saveConfig(config) {
745
779
  if (normalizedPresets !== null) {
746
780
  raw.agentPresetPrompts = normalizedPresets;
747
781
  }
782
+ // g ai 默认提示词同属全局设置:**空串是合法值**(= 清除),照写;
783
+ // 非字符串不落盘,保留磁盘旧值 —— 与上面各键同一套语义。
784
+ const normalizedAgentPrompt = normalizeAgentDefaultPrompt(agentDefaultPrompt);
785
+ if (normalizedAgentPrompt !== null) {
786
+ raw.agentDefaultPrompt = normalizedAgentPrompt;
787
+ }
748
788
 
749
789
  // 写入当前项目配置(在 defaultConfig 基础上合并,但不清空顶层其它键)
750
790
  const existingProjectConfig = (raw.projects[key] && typeof raw.projects[key] === 'object') ? raw.projects[key] : {};
@@ -953,6 +993,8 @@ export default {
953
993
  normalizeNotifySwitch,
954
994
  // 智能体视图「预设提示词」的规范化(GUI 保存前也要用,见 /api/config/save-ai-settings)
955
995
  normalizeAgentPresetPrompts,
996
+ // g ai 智能体默认提示词的规范化(同上,见 /api/config/save-ai-settings)
997
+ normalizeAgentDefaultPrompt,
956
998
  };
957
999
 
958
1000
  // 命名导出 — 用于测试与外部复用
@@ -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}.agent-view[data-v-df7b54d8]{background:var(--bg-container);height:100%;min-height:0;display:flex}.agent-sidebar[data-v-df7b54d8]{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-df7b54d8]{flex:1;min-height:0;padding:10px 6px 8px 12px}.sidebar-resizer[data-v-df7b54d8]{cursor:col-resize;width:4px;transition:background var(--transition-fast) ease;background:0 0;flex-shrink:0}.sidebar-resizer[data-v-df7b54d8]:hover,.sidebar-resizer.active[data-v-df7b54d8]{background:var(--color-primary);opacity:.3}.agent-chat-area[data-v-df7b54d8]{flex-direction:column;flex:1;min-width:0;display:flex;position:relative;overflow:hidden}.agent-engine[data-v-df7b54d8]{margin-bottom:7px;margin-left:auto}.agent-copy[data-v-df7b54d8]{margin-bottom:7px;margin-left:2px}.agent-tabs[data-v-df7b54d8]{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-df7b54d8]{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-df7b54d8]:hover{color:var(--text-secondary);background:var(--bg-hover)}.agent-tab.active[data-v-df7b54d8]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:600}.agent-tab-body[data-v-df7b54d8]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-pane[data-v-df7b54d8]{flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.agent-tab-body[data-v-df7b54d8]>.marketplace-panel{flex:1;min-height:0}.chat-loading[data-v-df7b54d8]{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-df7b54d8]{background:var(--bg-panel);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-list-page .agent-conversations[data-v-df7b54d8]{padding:12px 12px 10px 14px}.agent-page-bar[data-v-df7b54d8]{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-df7b54d8]{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-df7b54d8]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-page-title[data-v-df7b54d8]{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-df7b54d8]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-host[data-v-df7b54d8] .acu-avatar--left{background:0 0}.agent-chat-host[data-v-df7b54d8] .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-df7b54d8] .acu-bubble-row.is-assistant .acu-bubble{align-self:flex-start}.agent-chat-host[data-v-df7b54d8] .acu-message-meta{margin:0;position:absolute;top:0;right:0}.agent-chat-host[data-v-df7b54d8] .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-df7b54d8] .acu-welcome-logo{background:var(--welcome-avatar) center/46px 46px no-repeat;width:56px;height:56px;box-shadow:none}.agent-chat-host[data-v-df7b54d8] .acu-welcome-logo>svg{display:none}.agent-chat-host[data-v-df7b54d8] .acu-welcome-grid{flex-wrap:wrap;display:flex}.agent-chat-host[data-v-df7b54d8] .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-CDrhhAKC.js";import{t as j}from"./CommonDialog-BUuLsgNS.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.7`,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
+ 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-CDrhhAKC.js";import{t as D}from"./SvgIcon-Du5MOe8A.js";import{t as O}from"./CommonDialog-BUuLsgNS.js";import{H as k,U as A}from"./index-DjaZpz97.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
+ 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};