zen-gitsync 2.18.12 → 2.18.13

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 (79) hide show
  1. package/package.json +1 -1
  2. package/src/cli/ai/agent.js +1385 -1385
  3. package/src/cli/ai/context.js +431 -431
  4. package/src/cli/ai/context.test.js +376 -376
  5. package/src/cli/ai/turn.js +190 -190
  6. package/src/ui/public/assets/AgentView-CuEM6xzC.js +11 -0
  7. package/src/ui/public/assets/AppVersionBadge-BK1Fiv3b.js +2 -0
  8. package/src/ui/public/assets/BranchSelector-avxY_m05.js +1 -0
  9. package/src/ui/public/assets/CommitForm-hThTnoNt.js +14 -0
  10. package/src/ui/public/assets/CommonDialog-zaBdFGFH.js +1 -0
  11. package/src/ui/public/assets/CopySessionButton-CAxaqLQL.js +21 -0
  12. package/src/ui/public/assets/EditorView-iSA2SXJR.js +37 -0
  13. package/src/ui/public/assets/{FlowExecutionViewer-Ce4Q5ia6.js → FlowExecutionViewer-C5ylYV2C.js} +1 -1
  14. package/src/ui/public/assets/FlowOrchestrationWorkspace-CiQ07ZQv.js +21 -0
  15. package/src/ui/public/assets/LogList-Sjb8vmvq.js +7 -0
  16. package/src/ui/public/assets/MindmapView-B5rChFMP.js +2 -0
  17. package/src/ui/public/assets/MonitorView-Dcc-i2Fo.js +3 -0
  18. package/src/ui/public/assets/ProjectStartupButton-fz6eLCZU.js +1 -0
  19. package/src/ui/public/assets/RecentDirectoriesChat-BDnNp9jh.js +3 -0
  20. package/src/ui/public/assets/RemoteManagerDialog-NA1jRC7O.js +4 -0
  21. package/src/ui/public/assets/RemoteRepoCard-CKm4KqHs.js +7 -0
  22. package/src/ui/public/assets/SourceMapView-Drfato_u.js +3 -0
  23. package/src/ui/public/assets/SvgIcon-DR_79iBR.js +1 -0
  24. package/src/ui/public/assets/UserInputNode-DroKvDOa.js +1 -0
  25. package/src/ui/public/assets/WorkbenchView-CW7OACCU.js +326 -0
  26. package/src/ui/public/assets/{WorkbenchView-DzBtCzay.css → WorkbenchView-C_u6BptZ.css} +1 -1
  27. package/src/ui/public/assets/{_plugin-vue_export-helper-BY0jlMBE.js → _plugin-vue_export-helper-bQQyMRS6.js} +5 -5
  28. package/src/ui/public/assets/{agentConversations-CC01a7SP.js → agentConversations-wYAksLq1.js} +8 -8
  29. package/src/ui/public/assets/{configStore-EvRYufor.js → configStore-BeHB-gV4.js} +1 -1
  30. package/src/ui/public/assets/{css.worker-BDCmgL4U.js → css.worker-DFdt6_zu.js} +9 -9
  31. package/src/ui/public/assets/{dagre-Ct-SQ-7k.js → dagre-CXi8gaG9.js} +4 -4
  32. package/src/ui/public/assets/editor.worker-O-CH8JUO.js +26 -0
  33. package/src/ui/public/assets/{element-plus-D-6gla1z.css → element-plus-DJ3ZQa98.css} +1 -1
  34. package/src/ui/public/assets/element-plus-DgSY_Wt4.js +48 -0
  35. package/src/ui/public/assets/{flow-mindmap-C8x6ucsA.js → flow-mindmap-BsTRkgat.js} +56 -56
  36. package/src/ui/public/assets/{html.worker-DG8hnSJR.js → html.worker-JUzsMP-j.js} +8 -8
  37. package/src/ui/public/assets/index-BRQstBzy.js +211 -0
  38. package/src/ui/public/assets/json.worker-B4dEhy0e.js +58 -0
  39. package/src/ui/public/assets/{monaco-BV4P06MT.js → monaco-CnWeufxc.js} +6 -6
  40. package/src/ui/public/assets/{office-docx-B8BoOvth.js → office-docx-EUfAIM4w.js} +6 -6
  41. package/src/ui/public/assets/{office-excel-CFRkxKv8.js → office-excel-BZW0bXQo.js} +1 -1
  42. package/src/ui/public/assets/{office-pptx-DXdbDvLM.js → office-pptx-CBvDNZ4m.js} +3 -3
  43. package/src/ui/public/assets/{ts.worker-DgFMIcEs.js → ts.worker-CmEKzkmF.js} +49 -49
  44. package/src/ui/public/assets/{useOrchestrator-C8BD2JSO.js → useOrchestrator-Bhl7DGKW.js} +1 -1
  45. package/src/ui/public/assets/{vendor-DYtaPSUU.js → vendor-CZlKgriV.js} +43 -43
  46. package/src/ui/public/assets/vue-flow-DawpR_uk.js +39 -0
  47. package/src/ui/public/index.html +12 -12
  48. package/src/ui/server/routes/config.js +1348 -1348
  49. package/src/ui/server/routes/workbench/agentChat.js +752 -752
  50. package/src/ui/server/routes/workbench/agentChatShared.test.js +496 -496
  51. package/src/ui/server/routes/workbench/agentRoutes.js +13 -1
  52. package/src/ui/server/routes/workbench/agentRoutes.test.js +75 -0
  53. package/src/ui/server/routes/workbench/index.js +2 -1
  54. package/src/ui/server/routes/workbench/scheduleRoutes.js +2 -2
  55. package/src/ui/server/routes/workbench/shared.js +17 -0
  56. package/src/ui/public/assets/AgentView-CVbcrngz.js +0 -11
  57. package/src/ui/public/assets/AppVersionBadge-7gFB6t_t.js +0 -2
  58. package/src/ui/public/assets/BranchSelector-BIRNxA6U.js +0 -1
  59. package/src/ui/public/assets/CommitForm-CWpaazi7.js +0 -14
  60. package/src/ui/public/assets/CommonDialog-DrxsmpDL.js +0 -1
  61. package/src/ui/public/assets/CopySessionButton-C_01fcd3.js +0 -21
  62. package/src/ui/public/assets/EditorView-D80wG480.js +0 -37
  63. package/src/ui/public/assets/FlowOrchestrationWorkspace-Cq1zEt5K.js +0 -21
  64. package/src/ui/public/assets/LogList-DtmJG27U.js +0 -7
  65. package/src/ui/public/assets/MindmapView-BR2_C4Du.js +0 -2
  66. package/src/ui/public/assets/MonitorView-Cs_kwPBu.js +0 -3
  67. package/src/ui/public/assets/ProjectStartupButton-BfQJ0i5X.js +0 -1
  68. package/src/ui/public/assets/RecentDirectoriesChat-_gNQGqkM.js +0 -3
  69. package/src/ui/public/assets/RemoteManagerDialog-KY5I3Ftv.js +0 -4
  70. package/src/ui/public/assets/RemoteRepoCard-BUgdGtwC.js +0 -7
  71. package/src/ui/public/assets/SourceMapView-RkGgdvnN.js +0 -3
  72. package/src/ui/public/assets/SvgIcon-CP7WAT4C.js +0 -1
  73. package/src/ui/public/assets/UserInputNode-CwSqPh4O.js +0 -1
  74. package/src/ui/public/assets/WorkbenchView-CBfccRIP.js +0 -320
  75. package/src/ui/public/assets/editor.worker-GCPm6rMv.js +0 -26
  76. package/src/ui/public/assets/element-plus-CDrtgG55.js +0 -48
  77. package/src/ui/public/assets/index-CyEcaEC9.js +0 -211
  78. package/src/ui/public/assets/json.worker-CxwlJRnL.js +0 -58
  79. package/src/ui/public/assets/vue-flow-B7Hdmt-y.js +0 -39
@@ -41,7 +41,7 @@ import { isSessionBusy, acquireSession, releaseSession } from './sessionGate.js'
41
41
  import { createScheduler } from './scheduler.js';
42
42
  import { registerScheduleRoutes } from './scheduleRoutes.js';
43
43
  import { normalizeItems, filterToRecentDirs, buildDirStatusBlock } from '../recentDirectoriesAiSummary.js';
44
- import { nowIso, logger, fs, fsp, MAX_IMAGE_BYTES } from './shared.js';
44
+ import { nowIso, logger, fs, fsp, MAX_IMAGE_BYTES, SSE_HEARTBEAT_MS } from './shared.js';
45
45
  // 正文内嵌图片的路径判定纯函数 —— 与任务对话的图片端点(workbench/index.js 的
46
46
  // /api/workbench/jobs/:id/image)同一份:后缀白名单、root 内、防穿越。两份白名单
47
47
  // 分叉时不会报错,只会让某一类图在任务对话里能看、在 Agent 对话里裂。
@@ -471,6 +471,10 @@ export function registerAgentRoutes({ app, getCurrentProjectPath, configManager,
471
471
  'X-Accel-Buffering': 'no'
472
472
  });
473
473
  res.flushHeaders?.();
474
+ // 先把流"点亮":Firefox 在收到第一个 body 字节之前,不会把流式响应交给页面的
475
+ // fetch(只 flush 头会一直卡着不 resolve,Chromium 则是收到头就 resolve)。
476
+ // 一条惰性注释即可,代价 3 个字节。
477
+ try { res.write(':\n\n'); } catch {}
474
478
  const send = (obj) => {
475
479
  try { res.write(`data: ${JSON.stringify(obj)}\n\n`); } catch {}
476
480
  };
@@ -488,6 +492,13 @@ export function registerAgentRoutes({ app, getCurrentProjectPath, configManager,
488
492
  }
489
493
  let activeSessionKey = null;
490
494
 
495
+ // 心跳只在真的开跑这一轮之后起(上面那条 busy 短路不需要它,也不该背一个 interval)。
496
+ // 出口统一在 finally 里 clearInterval —— 中间那些 return res.end() 全在 try 里,
497
+ // 漏一个就等于给进程留一个一直在写的定时器。
498
+ const heartbeat = setInterval(() => {
499
+ try { res.write(': keep-alive\n\n'); } catch {}
500
+ }, SSE_HEARTBEAT_MS);
501
+
491
502
  // 客户端断开
492
503
  if (req.socket) {
493
504
  req.socket.once('close', () => {
@@ -803,6 +814,7 @@ export function registerAgentRoutes({ app, getCurrentProjectPath, configManager,
803
814
  finished = true;
804
815
  res.end();
805
816
  } finally {
817
+ clearInterval(heartbeat);
806
818
  if (activeSessionKey) releaseSession(activeSessionKey);
807
819
  }
808
820
  });
@@ -616,3 +616,78 @@ test('没有 cwd 的老会话:根退回当前项目路径(与列表可见性
616
616
  assert.equal(res.statusCode, 200);
617
617
  assert.equal(res.headers['content-type'], 'image/png');
618
618
  });
619
+
620
+ // SSE 保活:Firefox 对 text/event-stream 有两条硬脾气,都只有在浏览器里才看得见
621
+ // (单测能守住的是"字节有没有按约定写出去",守不住浏览器行为本身):
622
+ // ① 收到第一个 body 字节之前,它不把响应交给页面的 fetch —— 只 flush 头会一直卡住,
623
+ // 所以"流已建立"这个信号本身就是一条惰性注释;
624
+ // ② 两次字节之间空太久,它会直接掐连接,报 TypeError: Error in input stream
625
+ // (见 enisdenjo/graphql-sse#99;实测 5s 一条能一直活着)。
626
+ // 没有心跳时,只要这一轮里有一步超过半分钟不吐字(长命令 / 慢 LLM / MCP),
627
+ // 用户看到的就是"这一轮失败 + 重试",而服务端其实还在正常跑并已落盘。
628
+ test('SSE 保活:建流先点亮,开跑后每 5s 一条注释心跳,收尾必须停掉', async (t) => {
629
+ const activeCwd = path.resolve('active-project');
630
+ let chatHandler;
631
+ const app = {
632
+ get() {},
633
+ delete() {},
634
+ put() {},
635
+ post(route, handler) {
636
+ if (route === '/api/agent/chat') chatHandler = handler;
637
+ }
638
+ };
639
+ registerAgentRoutes({
640
+ app,
641
+ getCurrentProjectPath: () => activeCwd,
642
+ configManager: {
643
+ readRawConfigFile: async () => ({
644
+ models: [{ model: 'test', name: 'T', baseURL: 'https://example.invalid/v1', apiKey: 'k', isDefault: true }]
645
+ })
646
+ },
647
+ snapshotter: STUB_SNAPSHOTTER
648
+ });
649
+
650
+ // 模型吐半句就挂住:这一轮会一直停在"生成中",正好用来观察空转期间的心跳
651
+ const hanging = init => new Response(new ReadableStream({
652
+ start(stream) {
653
+ stream.enqueue(new TextEncoder().encode(event({ choices: [{ delta: { content: '半句' } }] })));
654
+ init?.signal?.addEventListener('abort', () => stream.error(new DOMException('Aborted', 'AbortError')));
655
+ }
656
+ }), { status: 200, headers: { 'content-type': 'text/event-stream' } });
657
+
658
+ const originalFetch = globalThis.fetch;
659
+ globalThis.fetch = async (_url, init) => hanging(init);
660
+ // 只假 setInterval(心跳),setTimeout 保持真身 —— waitUntil 靠它轮询
661
+ t.mock.timers.enable({ apis: ['setInterval'] });
662
+
663
+ let output = '';
664
+ let onSocketClose;
665
+ const req = {
666
+ body: { userMessage: '保活用例', cwd: activeCwd },
667
+ headers: {},
668
+ socket: { once(_evt, cb) { onSocketClose = cb; } }
669
+ };
670
+ const res = { set() {}, flushHeaders() {}, write(chunk) { output += chunk; }, end() {} };
671
+ const dataFrames = text => text.split('\n').filter(l => l.trim().startsWith('data:')).length;
672
+
673
+ try {
674
+ const route = chatHandler(req, res);
675
+ await waitUntil(() => output.length > 0);
676
+ assert.equal(output.slice(0, 3), ':\n\n', '建流要先补一条惰性注释,否则 Firefox 的 fetch 一直不 resolve');
677
+
678
+ await waitUntil(() => output.includes('"type":"content"'));
679
+ const beforeTick = output;
680
+ t.mock.timers.tick(5000);
681
+ assert.match(output.slice(beforeTick.length), /^: keep-alive\n\n/, '空转满一个心跳周期要补一条注释');
682
+ assert.equal(dataFrames(output), dataFrames(beforeTick), '心跳是注释,不该混进任何 data: 事件');
683
+
684
+ onSocketClose(); // 客户端断开 → 这一轮收尾
685
+ await route;
686
+ const afterEnd = output;
687
+ t.mock.timers.tick(30000); // 收尾后再空转 30s
688
+ assert.equal(output, afterEnd, '收尾必须 clearInterval,否则每轮都给进程留一个一直在写的定时器');
689
+ } finally {
690
+ globalThis.fetch = originalFetch;
691
+ t.mock.timers.reset();
692
+ }
693
+ });
@@ -52,6 +52,7 @@ import {
52
52
  writeJson,
53
53
  nowIso,
54
54
  genId,
55
+ SSE_HEARTBEAT_MS,
55
56
  } from './shared.js';
56
57
  import {
57
58
  isImageExt,
@@ -191,7 +192,7 @@ export function registerWorkbenchRoutes({
191
192
  send({ event: 'hello', payload: { jobs: snapshotJobs() }, ts: nowIso() });
192
193
  const handler = (evt) => send(evt);
193
194
  bus.on('event', handler);
194
- const ka = setInterval(() => res.write(`: keep-alive\n\n`), 15000);
195
+ const ka = setInterval(() => res.write(`: keep-alive\n\n`), SSE_HEARTBEAT_MS);
195
196
  req.on('close', () => {
196
197
  clearInterval(ka);
197
198
  bus.off('event', handler);
@@ -31,7 +31,7 @@ import {
31
31
  loadTasks, createTask, updateTask, deleteTask,
32
32
  } from '../../../../utils/scheduleStore.js';
33
33
  import { nextFireAfter } from '../../../../utils/scheduleCron.js';
34
- import { nowIso } from './shared.js';
34
+ import { nowIso, SSE_HEARTBEAT_MS } from './shared.js';
35
35
 
36
36
  const RUN_FAIL_REASONS = {
37
37
  'already-running': '该任务正在执行中,请等它跑完',
@@ -119,7 +119,7 @@ export function registerScheduleRoutes({ app, scheduler, getCurrentProjectPath }
119
119
  const dispose = scheduler.onEvent(evt => send(evt));
120
120
  const keepAlive = setInterval(() => {
121
121
  try { res.write(': keep-alive\n\n'); } catch {}
122
- }, 15000);
122
+ }, SSE_HEARTBEAT_MS);
123
123
  req.on('close', () => {
124
124
  clearInterval(keepAlive);
125
125
  dispose();
@@ -156,6 +156,23 @@ export const MANIFEST_FILES = [
156
156
  // 封顶只会逼人分批建任务。数量放开后单文件上限成了唯一的内存关口,所以它必须留着。
157
157
  export const MAX_IMAGE_BYTES = 20 * 1024 * 1024; // 单个附件最大 20MB
158
158
 
159
+ /**
160
+ * 所有 SSE 长连接的保活间隔(毫秒)。**必须 ≤5s,别往上调。**
161
+ *
162
+ * Firefox 对 text/event-stream 的空档极敏感:两次 body 字节之间隔太久,它会直接掐掉
163
+ * 连接,页面拿到的是 `TypeError: Error in input stream` —— 看着像"这一轮失败",
164
+ * 而服务端其实还在正常跑(对话那一轮的落盘、任务日志、定时任务面板都是这样)。
165
+ * 上游复现帖(enisdenjo/graphql-sse#99)给的线是:5s 一条能一直活着,7.5s 以上最终会断。
166
+ *
167
+ * 所以间隔不看"省不省流量"(一条注释十几个字节,一小时也就几 KB),只看浏览器脾气。
168
+ * 集中在这里的理由:agentRoutes 的对话流、任务日志流、定时任务面板流三条都靠它,
169
+ * 各写各的迟早出现"一处改成 5s、另一处还留着 15s",而漏的那条永远查不出来。
170
+ *
171
+ * 配套还有一条(不在这个常量里):流一建立就要立刻写一次,因为 Firefox 在收到
172
+ * 第一个 body 字节之前不会把响应交给页面的 fetch。
173
+ */
174
+ export const SSE_HEARTBEAT_MS = 5000;
175
+
159
176
  // ── 时间 / ID 工具 ─────────────────────────────────────────
160
177
  export function nowIso() {
161
178
  return new Date().toISOString();
@@ -1,11 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{$t as e,An as t,At as n,Ct as r,Dn as i,En as a,Fn as o,Gn as s,Gt as c,Ht as l,Ir as u,J as d,Jn as f,Jt as p,Ln as m,M as h,On as g,Pn as _,Qn as v,Sn as y,Tt as b,Vn as x,W as S,Xn as C,Yr as w,Yt as T,Zr as E,_n as D,a as O,an as k,dn as A,er as j,et as M,gn as N,i as P,j as F,kn as I,kt as ee,lr as L,lt as R,mn as z,mr as B,mt as te,r as ne,rr as re,sr as V,st as ie,ti as H,tt as ae,ur as U,vn as W,xr as G,yr as oe}from"./element-plus-CDrtgG55.js";import{c as se,t as ce}from"./vendor-DYtaPSUU.js";import{n as K,t as q}from"./_plugin-vue_export-helper-BY0jlMBE.js";import{t as le}from"./configStore-EvRYufor.js";import{t as ue}from"./CommonDialog-DrxsmpDL.js";import{J as de,b as fe,q as pe}from"./index-CyEcaEC9.js";import{a as me,c as he,i as ge,l as _e,m as ve,n as ye,o as be,r as xe,s as Se,t as Ce,u as we}from"./agentConversations-CC01a7SP.js";import{l as Te,s as Ee,t as De,u as Oe}from"./CopySessionButton-C_01fcd3.js";import{t as ke}from"./useOrchestrator-C8BD2JSO.js";async function J(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 Ae(){let e=await J(`/api/schedules`);return Array.isArray(e.tasks)?e.tasks:[]}async function je(e){return(await J(`/api/schedules`,{method:`POST`,body:JSON.stringify(e)})).task}async function Me(e,t){return(await J(`/api/schedules/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify(t)})).task}async function Ne(e){await J(`/api/schedules/${encodeURIComponent(e)}`,{method:`DELETE`})}async function Y(e){await J(`/api/schedules/${encodeURIComponent(e)}/run`,{method:`POST`})}async function Pe(e){await J(`/api/schedules/${encodeURIComponent(e)}/stop`,{method:`POST`})}function Fe(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 X=e=>/^\d+$/.test(e)?Number(e):null;function Ie(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=X(r),l=X(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=X(s);if(c!==null&&l!==null&&a===`*`&&o===`*`&&d!==null)return{kind:`weekly`,weekday:d%7,hour:l,minute:c,raw:t};let f=X(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 Z=e=>String(e).padStart(2,`0`),Q=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime();function Le(e,t=new Date){if(!e)return{kind:`none`};let n=new Date(e);if(Number.isNaN(n.getTime()))return{kind:`none`};let r=`${Z(n.getHours())}:${Z(n.getMinutes())}`,i=Math.round((Q(n)-Q(t))/864e5);return i<0?{kind:`date`,date:`${n.getMonth()+1}-${Z(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}-${Z(n.getDate())}`,time:r}}function Re(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 ze(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${Z(n%60)}s`:`${Math.floor(r/60)}h${Z(r%60)}m`}function $(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()}}x(),B();var Be=m({__name:`MarketplacePanel`,props:{type:{type:String,required:!0}},setup(e,{expose:t}){t();let n=e,i=le(),o=G([]),s=G([]),u=G(!1),d=G(``),f=G(``),p=G([]),m=G(`project`),h=G(new Set),g=G(new Set),_=G(new Set),v=a(()=>i.currentDirectory||``),y=null;async function b(){if(!u.value){u.value=!0;try{let e=new URLSearchParams({type:n.type,cwd:v.value});f.value&&e.set(`q`,f.value),p.value.length&&e.set(`sources`,p.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();t?.success?(o.value=t.groups||[],s.value=t.installed||[]):P.error(t?.error||K(`@MKT:加载失败`))}catch{P.error(K(`@MKT:加载失败`))}finally{u.value=!1}}}V(d,e=>{y&&clearTimeout(y),y=setTimeout(()=>{f.value=e.trim(),b()},400)}),V(p,()=>b()),V(()=>n.type,()=>{p.value=[],f.value=``,d.value=``,b()}),V(v,()=>b()),b();let x=a(()=>{let e=v.value?v.value.split(/[\\/]/).filter(Boolean).pop():``;return m.value===`project`?e||K(`@MKT:当前项目`):K(`@MKT:g ai 智能体`)});function S(e){return e.stars?`${C(e.stars)} ★`:e.downloads?`${C(e.downloads)} ${K(`@MKT:周下载`)}`:e.uses?`${C(e.uses)} ${K(`@MKT:次使用`)}`:``}function C(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function w(e){return`${e.id}`}function E(e){return h.value.has(w(e))}let D=a(()=>{let e={project:[],global:[]};for(let t of s.value)(e[t.target]||=[]).push(t);return e}),O=oe({visible:!1,item:null,env:{},args:``});function A(e){return n.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function j(e){O.item=e,O.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),O.args=(e.args||[]).join(` `),O.visible=!0}function M(){let e=O.item;if(O.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(O.env).filter(([,e])=>e.trim()!==``)),n=O.args.trim()?O.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;F(e,{env:t,...n?{args:n}:{}})}async function N(e){if(!e.installed||await I(e)){if(A(e)){j(e);return}await F(e,{})}}async function F(e,t){let r=w(e);h.value.add(r);try{let r=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:m.value,cwd:v.value,item:{...e,...t}})}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){P.error(i?.error||K(`@MKT:安装失败`));return}i.item?.warning&&P.warning(i.item.warning),i.item?.envKeys?.length?P.warning(`${K(`@MKT:还缺环境变量`)}: ${i.item.envKeys.join(`, `)}`):P.success(K(`@MKT:安装成功`)),await b()}catch{P.error(K(`@MKT:安装失败`))}finally{h.value.delete(r)}}async function I(e){try{return await ne.confirm(`${e.name} ${K(`@MKT:已安装,要重新安装吗?`)}`,K(`@MKT:重新安装`),{confirmButtonText:K(`@MKT:重装`),cancelButtonText:K(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function L(e){let t=`${e.target}:${e.id}`;_.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:e.target,cwd:v.value,id:e.id})}),r=await t.json().catch(()=>null);(!t.ok||!r?.success)&&P.error(r?.error||K(`@MKT:打开失败`))}catch{P.error(K(`@MKT:打开失败`))}finally{_.value.delete(t)}}async function z(e){try{await ne.confirm(`${K(`@MKT:确定卸载`)} ${e.name}?`,K(`@MKT:卸载`),{confirmButtonText:K(`@MKT:卸载`),cancelButtonText:K(`@MKT:取消`),type:`warning`})}catch{return}let t=`${e.target}:${e.id}`;g.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:v.value}),r=await fetch(`/api/agent/marketplace/item/${n.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){P.error(i?.error||K(`@MKT:卸载失败`));return}P.success(K(`@MKT:已卸载`)),await b()}catch{P.error(K(`@MKT:卸载失败`))}finally{g.value.delete(t)}}let B={props:n,configStore:i,groups:o,installed:s,loading:u,searchInput:d,query:f,selectedSources:p,installTarget:m,installing:h,removing:g,revealing:_,cwd:v,get searchTimer(){return y},set searchTimer(e){y=e},loadCatalog:b,targetLabel:x,metricText:S,formatCount:C,cardKey:w,isBusy:E,installedByTarget:D,configDialog:O,needsConfig:A,openConfigDialog:j,confirmConfig:M,onInstall:N,doInstall:F,confirmReinstall:I,onReveal:L,onRemove:z,get $t(){return K},get Search(){return c},get Refresh(){return l},get Delete(){return R},get Link(){return ee},get Check(){return ae},get Star(){return T},get Download(){return te},get Warning(){return k},get FolderOpened(){return r},CommonDialog:ue};return Object.defineProperty(B,"__isScriptSetup",{enumerable:!1,value:!0}),B}});x(),A(),u();var Ve={class:`marketplace-panel`},He={class:`mp-toolbar`},Ue={class:`mp-search`},We=[`placeholder`],Ge={class:`mp-toolbar-sub`},Ke={class:`mp-target-hint`},qe={class:`mp-source-filter`},Je=[`onClick`],Ye={class:`mp-body`},Xe={class:`mp-group-header`},Ze={class:`mp-group-title`},Qe={key:0,class:`mp-group-count`},$e={key:1,class:`mp-group-error`},et=[`href`,`title`],tt={key:0,class:`mp-grid`},nt={class:`mp-card-head`},rt=[`title`],it={key:0,class:`mp-card-metric`},at=[`title`],ot={class:`mp-card-meta`},st=[`title`],ct=[`title`],lt={key:2,class:`mp-tag remote`},ut={class:`mp-card-foot`},dt=[`href`],ft={key:1,class:`mp-installed-chip`},pt=[`disabled`,`onClick`],mt={key:3,class:`mp-not-installable`},ht={key:1,class:`mp-empty`},gt={key:0,class:`mp-group installed`},_t={class:`mp-group-header`},vt={class:`mp-group-title`},yt={class:`mp-group-count`},bt={key:0,class:`mp-installed-block`},xt={class:`mp-installed-target`},St={class:`mp-installed-list`},Ct=[`title`],wt=[`title`],Tt={key:1,class:`mp-meta-pkg`},Et={key:2,class:`mp-tag warn`},Dt=[`disabled`,`title`,`onClick`],Ot=[`disabled`,`onClick`],kt={key:1,class:`mp-empty all`},At={key:0,class:`mkt-form`},jt={class:`mkt-form-name`},Mt=[`onUpdate:modelValue`,`placeholder`],Nt={key:0,class:`mkt-field`},Pt={class:`mkt-hint`};function Ft(e,n,r,a,s,c){let l=d,u=F,f=h,p=S,m=O;return v(),t(`div`,Ve,[I(` ── 工具栏 ───────────────────────────────── `),i(`div`,He,[i(`div`,Ue,[o(l,{class:`mp-search-icon`},{default:L(()=>[o(a.Search)]),_:1}),U(i(`input`,{"onUpdate:modelValue":n[0]||=e=>a.searchInput=e,class:`mp-search-input`,type:`text`,placeholder:r.type===`skill`?a.$t(`@MKT:搜索 Skill...`):a.$t(`@MKT:搜索 MCP 服务...`)},null,8,We),[[W,a.searchInput]])]),o(f,{modelValue:a.installTarget,"onUpdate:modelValue":n[1]||=e=>a.installTarget=e,size:`small`,class:`mp-target`},{default:L(()=>[o(u,{value:`project`},{default:L(()=>[_(H(a.$t(`@MKT:当前项目`)),1)]),_:1}),o(u,{value:`global`},{default:L(()=>[_(H(a.$t(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),o(p,{content:a.$t(`@MKT:刷新`),placement:`top`,"show-after":300},{default:L(()=>[i(`button`,{class:w([`mp-refresh`,{spinning:a.loading}]),onClick:a.loadCatalog},[o(l,null,{default:L(()=>[o(a.Refresh)]),_:1})],2)]),_:1},8,[`content`])]),i(`div`,Ge,[i(`span`,Ke,[_(H(a.$t(`@MKT:安装到`))+` `,1),i(`b`,null,H(a.targetLabel),1)]),i(`div`,qe,[(v(!0),t(y,null,j(a.groups,e=>(v(),t(`button`,{key:e.id,class:w([`mp-chip`,{active:a.selectedSources.includes(e.id)}]),onClick:()=>{let t=a.selectedSources.indexOf(e.id);t>=0?a.selectedSources.splice(t,1):a.selectedSources.push(e.id)}},H(e.label),11,Je))),128)),a.selectedSources.length?(v(),t(`button`,{key:0,class:`mp-chip clear`,onClick:n[2]||=e=>a.selectedSources=[]},H(a.$t(`@MKT:全部来源`)),1)):I(`v-if`,!0)])]),I(` ── 内容 ─────────────────────────────────── `),U((v(),t(`div`,Ye,[(v(!0),t(y,null,j(a.groups,e=>(v(),t(`section`,{key:e.id,class:`mp-group`},[i(`header`,Xe,[i(`h3`,Ze,H(e.label),1),e.status===`ok`?(v(),t(`span`,Qe,H(e.items.length),1)):(v(),t(`span`,$e,[o(l,null,{default:L(()=>[o(a.Warning)]),_:1}),_(` `+H(e.error||a.$t(`@MKT:来源不可用`)),1)])),e.homepage?(v(),t(`a`,{key:2,class:`mp-group-link`,href:e.homepage,target:`_blank`,rel:`noopener noreferrer`,title:e.homepage},[o(l,null,{default:L(()=>[o(a.Link)]),_:1})],8,et)):I(`v-if`,!0)]),e.status===`ok`&&e.items.length?(v(),t(`div`,tt,[(v(!0),t(y,null,j(e.items,e=>(v(),t(`article`,{key:a.cardKey(e),class:`mp-card`},[i(`div`,nt,[i(`span`,{class:`mp-card-name`,title:e.name},H(e.name),9,rt),a.metricText(e)?(v(),t(`span`,it,[o(l,null,{default:L(()=>[e.stars?(v(),g(a.Star,{key:0})):(v(),g(a.Download,{key:1}))]),_:2},1024),_(` `+H(a.metricText(e)),1)])):I(`v-if`,!0)]),i(`p`,{class:`mp-card-desc`,title:e.description},H(e.description||a.$t(`@MKT:暂无描述`)),9,at),i(`div`,ot,[e.package?(v(),t(`code`,{key:0,class:`mp-meta-pkg`,title:e.package},H(e.package),9,st)):e.repository?(v(),t(`span`,{key:1,class:`mp-meta-repo`,title:e.repository+(e.subpath?` · `+e.subpath:``)},[_(H(e.repository),1),e.subpath?(v(),t(y,{key:0},[_(` · `+H(e.subpath),1)],64)):I(`v-if`,!0)],8,ct)):I(`v-if`,!0),e.transport===`remote`?(v(),t(`span`,lt,H(a.$t(`@MKT:远程服务`)),1)):I(`v-if`,!0),(v(!0),t(y,null,j((e.tags||[]).slice(0,2),e=>(v(),t(`span`,{key:e,class:`mp-tag`},H(e),1))),128))]),i(`div`,ut,[e.upstream?(v(),t(`a`,{key:0,class:`mp-card-link`,href:e.upstream,target:`_blank`,rel:`noopener noreferrer`},H(a.$t(`@MKT:查看来源`)),9,dt)):I(`v-if`,!0),n[6]||=i(`span`,{class:`mp-foot-spacer`},null,-1),e.installed?(v(),t(`span`,ft,[o(l,null,{default:L(()=>[o(a.Check)]),_:1}),_(H(a.$t(`@MKT:已安装`)),1)])):e.installable===!1?(v(),t(`span`,mt,H(a.$t(`@MKT:暂不支持一键安装`)),1)):(v(),t(`button`,{key:2,class:`mp-install-btn`,disabled:a.isBusy(e),onClick:t=>a.onInstall(e)},H(a.isBusy(e)?a.$t(`@MKT:安装中...`):a.$t(`@MKT:安装`)),9,pt))])]))),128))])):e.status===`ok`?(v(),t(`div`,ht,H(a.$t(`@MKT:该来源暂无结果`)),1)):I(`v-if`,!0)]))),128)),I(` ── 已安装 ─────────────────────────────── `),a.installed.length?(v(),t(`section`,gt,[i(`header`,_t,[i(`h3`,vt,H(a.$t(`@MKT:已安装`)),1),i(`span`,yt,H(a.installed.length),1)]),(v(),t(y,null,j([`project`,`global`],e=>i(`div`,{key:e},[a.installedByTarget[e]?.length?(v(),t(`div`,bt,[i(`div`,xt,H(e===`project`?a.$t(`@MKT:当前项目`):a.$t(`@MKT:g ai 智能体`)),1),i(`div`,St,[(v(!0),t(y,null,j(a.installedByTarget[e],r=>(v(),t(`div`,{key:e+r.id,class:`mp-installed-row`},[i(`span`,{class:`mp-installed-name`,title:r.name},H(r.name),9,Ct),I(` 实际落盘的标识:SKILL.md 里的 name 常与仓库名不同(如仓库 taste-skill
2
- 里的 skill 自称 brandkit),不显示这个用户就对不上广场卡片上的名字 `),r.id&&r.id!==r.name?(v(),t(`code`,{key:0,class:`mp-installed-id`,title:r.dir||r.file||r.id},H(r.id),9,wt)):I(`v-if`,!0),r.package?(v(),t(`code`,Tt,H(r.package),1)):I(`v-if`,!0),r.requiredEnv?.length?(v(),t(`span`,Et,H(a.$t(`@MKT:待配置`))+`: `+H(r.requiredEnv.join(`, `)),1)):I(`v-if`,!0),n[7]||=i(`span`,{class:`mp-foot-spacer`},null,-1),i(`button`,{class:`mp-reveal-btn`,disabled:a.revealing.has(e+r.id),title:r.dir||r.file||``,onClick:e=>a.onReveal(r)},[o(l,null,{default:L(()=>[o(a.FolderOpened)]),_:1}),_(` `+H(a.$t(`@MKT:打开文件夹`)),1)],8,Dt),i(`button`,{class:`mp-remove-btn`,disabled:a.removing.has(e+r.id),onClick:e=>a.onRemove(r)},[o(l,null,{default:L(()=>[o(a.Delete)]),_:1}),_(` `+H(a.removing.has(e+r.id)?a.$t(`@MKT:卸载中...`):a.$t(`@MKT:卸载`)),1)],8,Ot)]))),128))])])):I(`v-if`,!0)])),64))])):I(`v-if`,!0),!a.loading&&!a.groups.length?(v(),t(`div`,kt,H(a.$t(`@MKT:加载失败`)),1)):I(`v-if`,!0)])),[[m,a.loading]]),I(` ── MCP 安装前配置 ───────────────────────── `),o(a.CommonDialog,{modelValue:a.configDialog.visible,"onUpdate:modelValue":n[5]||=e=>a.configDialog.visible=e,title:a.$t(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:L(()=>[i(`button`,{class:`mkt-cancel`,onClick:n[4]||=e=>a.configDialog.visible=!1},H(a.$t(`@MKT:取消`)),1),i(`button`,{class:`mkt-confirm`,onClick:a.confirmConfig},H(a.$t(`@MKT:安装`)),1)]),default:L(()=>[a.configDialog.item?(v(),t(`div`,At,[i(`p`,jt,H(a.configDialog.item.name),1),(v(!0),t(y,null,j(Object.keys(a.configDialog.env),e=>(v(),t(`div`,{key:e,class:`mkt-field`},[i(`label`,null,H(e),1),U(i(`input`,{"onUpdate:modelValue":t=>a.configDialog.env[e]=t,type:`text`,autocomplete:`off`,placeholder:a.$t(`@MKT:环境变量值`),spellcheck:`false`},null,8,Mt),[[W,a.configDialog.env[e]]])]))),128)),a.configDialog.item.args?.length?(v(),t(`div`,Nt,[i(`label`,null,H(a.$t(`@MKT:启动参数`)),1),U(i(`input`,{"onUpdate:modelValue":n[3]||=e=>a.configDialog.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[W,a.configDialog.args]]),i(`p`,Pt,H(a.$t(`@MKT:参数提示`)),1)])):I(`v-if`,!0)])):I(`v-if`,!0)]),_:1},8,[`modelValue`,`title`])])}var It=q(Be,[[`render`,Ft],[`__scopeId`,`data-v-e9f9e851`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/MarketplacePanel.vue`]]);x(),B();var Lt=m({__name:`SchedulePanel`,emits:[`open-session`],setup(e,{expose:t,emit:n}){t();let r=n,i=le(),o=G([]),s=G(!0),c=G(``),l=G({}),u=null,d=null;async function p(){try{o.value=await Ae(),c.value=``}catch(e){c.value=e?.message||String(e)}finally{s.value=!1}}function m(){d===null&&(d=window.setTimeout(()=>{d=null,p()},150))}C(async()=>{await p(),u=Fe(e=>{[`tasks_changed`,`task_started`,`task_finished`,`hello`].includes(e.type)&&m()})}),f(()=>{u?.(),d!==null&&window.clearTimeout(d)});let h=a(()=>{let e=o.value.filter(e=>e.enabled).length,t=o.value.length-e;return o.value.length?K(`@SCHED:{on} 个启用 · {off} 个停用`,{on:e,off:t}):``}),g=[`@SCHED:周日`,`@SCHED:周一`,`@SCHED:周二`,`@SCHED:周三`,`@SCHED:周四`,`@SCHED:周五`,`@SCHED:周六`];function _(e){let t=Ie(e.schedule);switch(t.kind){case`every-minute`:return K(`@SCHED:每分钟`);case`every-n-minutes`:return K(`@SCHED:每 {n} 分钟`,{n:t.n});case`hourly`:return K(`@SCHED:每小时第 {minute} 分钟`,{minute:t.minute});case`daily`:return K(`@SCHED:每天 {time}`,{time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`weekly`:return K(`@SCHED:每周 {weekday} {time}`,{weekday:K(g[t.weekday]),time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`monthly`:return K(`@SCHED:每月 {day} 日 {time}`,{day:t.day,time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});default:return t.raw}}function v(e){if(!e.enabled)return K(`@SCHED:已停用`);if(e.running)return K(`@SCHED:运行中...`);let t=Le(e.nextRunAt);switch(t.kind){case`none`:return``;case`today`:return K(`@SCHED:下次 今天 {time}`,{time:t.time});case`tomorrow`:return K(`@SCHED:下次 明天 {time}`,{time:t.time});case`weekday`:return K(`@SCHED:下次 {weekday} {time}`,{weekday:K(g[t.weekday]),time:t.time});case`date`:return K(`@SCHED:下次 {date} {time}`,{date:t.date,time:t.time})}}function y(e){let t=e.lastRun;if(!t)return K(`@SCHED:还没执行过`);switch(t.status){case`ok`:return K(`@SCHED:成功`);case`error`:return K(`@SCHED:失败`);case`timed-out`:return K(`@SCHED:超时中止`);case`skipped-busy`:return K(`@SCHED:已跳过(会话忙)`);case`missed`:return K(`@SCHED:已错过(未运行)`);case`cancelled`:return K(`@SCHED:已停止`);default:return t.status}}function b(e){let t=e.lastRun;if(!t)return K(`@SCHED:还没执行过`);let n=ze(t.durationMs),r=K(`@SCHED:上次 {status}`,{status:y(e)});return n?`${r} · ${n}`:r}function x(e){return e.lastRun?`is-${Re(e.lastRun.status)}`:`is-muted`}async function S(e,t){if(!l.value[e.id]){l.value={...l.value,[e.id]:!0};try{await t(),await p()}catch(e){P.error(e?.message||String(e))}finally{let t={...l.value};delete t[e.id],l.value=t}}}function w(e){return S(e,()=>Me(e.id,{enabled:!e.enabled}))}function T(e){return S(e,()=>Y(e.id))}function E(e){return S(e,()=>Pe(e.id))}let D=G(!1),O=G(null);function k(e){O.value=e,D.value=!0}async function A(){let e=O.value;if(e)try{await Ne(e.id),D.value=!1,await p()}catch(e){P.error(e?.message||String(e))}}let j=G(!1),M=G(``),N=G(``),F=G(!1),I=G({name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:``,prompt:``,onMissed:`run`,enabled:!0}),ee=a(()=>[{value:`minutes`,label:K(`@SCHED:每 N 分钟`)},{value:`hourly`,label:K(`@SCHED:每小时`)},{value:`daily`,label:K(`@SCHED:每天`)},{value:`weekly`,label:K(`@SCHED:每周`)},{value:`custom`,label:K(`@SCHED:自定义 cron`)}]),L=a(()=>$({freq:I.value.freq,everyMinutes:I.value.everyMinutes,minute:I.value.minute,hour:I.value.hour,weekday:I.value.weekday,custom:I.value.custom}));function R(){I.value={name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:i.currentDirectory||``,prompt:``,onMissed:`run`,enabled:!0},N.value=``}function z(){M.value=``,R(),j.value=!0}function B(e){M.value=e.id;let t=Ie(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`}I.value=n,N.value=``,j.value=!0}async function te(){let e=I.value;if(!e.name.trim()){N.value=K(`@SCHED:任务名不能为空`);return}if(!e.prompt.trim()){N.value=K(`@SCHED:提示词不能为空`);return}let t=L.value;if(!t){N.value=K(`@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};F.value=!0;try{M.value?await Me(M.value,n):await je(n),j.value=!1,await p()}catch(e){N.value=e?.message||String(e)}finally{F.value=!1}}let ne={emit:r,configStore:i,tasks:o,loading:s,errorMsg:c,pending:l,get disposeEvents(){return u},set disposeEvents(e){u=e},get refreshTimer(){return d},set refreshTimer(e){d=e},refresh:p,scheduleRefresh:m,summaryText:h,WEEKDAY_KEYS:g,descText:_,nextText:v,lastStatusText:y,lastText:b,lastClass:x,withPending:S,toggle:w,runNow:T,stop:E,confirmVisible:D,confirmTarget:O,askRemove:k,confirmRemove:A,formVisible:j,editingId:M,formError:N,saving:F,form:I,freqOptions:ee,cronPreview:L,resetForm:R,openCreate:z,openEdit:B,submitForm:te,get $t(){return K},CommonDialog:ue};return Object.defineProperty(ne,"__isScriptSetup",{enumerable:!1,value:!0}),ne}});u(),x(),A();var Rt={class:`schedule-panel`},zt={class:`schedule-toolbar`},Bt={class:`schedule-summary`},Vt={key:0,class:`schedule-error`},Ht={key:1,class:`schedule-loading`},Ut={key:2,class:`schedule-empty`},Wt={class:`schedule-empty-title`},Gt={class:`schedule-empty-desc`},Kt={key:3,class:`schedule-list`},qt={class:`schedule-card-body`},Jt={class:`schedule-card-head`},Yt={class:`schedule-name`},Xt={key:0,class:`schedule-running`},Zt=[`aria-checked`,`aria-label`,`onClick`],Qt={class:`schedule-card-sub`},$t={class:`schedule-desc`},en=[`onClick`],tn={class:`schedule-card-side`},nn={class:`schedule-actions`},rn=[`disabled`,`onClick`],an=[`disabled`,`onClick`],on=[`onClick`],sn=[`onClick`],cn={class:`sch-form`},ln={class:`sch-field`},un={class:`sch-field-label`},dn=[`placeholder`],fn={class:`sch-field`},pn={class:`sch-field-label`},mn={class:`sch-freq-row`},hn=[`value`],gn={class:`sch-inline-label`},_n=[`value`],vn={class:`sch-inline-label`},yn=[`value`],bn=[`value`],xn=[`value`],Sn={class:`sch-inline-label`},Cn=[`value`],wn={class:`sch-inline-label`},Tn=[`placeholder`],En={class:`sch-hint`},Dn={class:`sch-field`},On={class:`sch-field-label`},kn=[`placeholder`],An={class:`sch-field`},jn={class:`sch-field-label`},Mn=[`placeholder`],Nn={class:`sch-field`},Pn={class:`sch-field-label`},Fn={class:`sch-radio-row`},In={class:`sch-radio`},Ln={class:`sch-radio`},Rn={class:`sch-radio`},zn={key:0,class:`sch-form-error`},Bn={class:`sch-form-footer`},Vn=[`disabled`],Hn={class:`sch-confirm-text`},Un={class:`sch-form-footer`};function Wn(e,n,r,a,s,c){return v(),t(`div`,Rt,[i(`div`,zt,[i(`span`,Bt,H(a.summaryText),1),i(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,onClick:a.openCreate},H(a.$t(`@SCHED:新建任务`)),1)]),a.errorMsg?(v(),t(`div`,Vt,H(a.$t(`@SCHED:操作失败:{error}`,{error:a.errorMsg})),1)):I(`v-if`,!0),a.loading?(v(),t(`div`,Ht,H(a.$t(`@SCHED:加载中...`)),1)):a.tasks.length?(v(),t(`div`,Kt,[(v(!0),t(y,null,j(a.tasks,e=>(v(),t(`article`,{key:e.id,class:w([`schedule-card`,{"is-disabled":!e.enabled,"is-running":!!e.running}])},[i(`div`,qt,[i(`div`,Jt,[i(`span`,Yt,H(e.name),1),e.running?(v(),t(`span`,Xt,H(a.$t(`@SCHED:运行中`)),1)):I(`v-if`,!0),i(`button`,{type:`button`,class:w([`sch-switch`,{on:e.enabled}]),role:`switch`,"aria-checked":e.enabled,"aria-label":e.enabled?a.$t(`@SCHED:停用`):a.$t(`@SCHED:启用`),onClick:t=>a.toggle(e)},[...n[17]||=[i(`span`,{class:`sch-switch-knob`},null,-1)]],10,Zt)]),i(`div`,Qt,[i(`span`,$t,H(a.descText(e)),1),n[18]||=i(`span`,{class:`schedule-sep`},`·`,-1),i(`span`,{class:w([`schedule-last`,a.lastClass(e)])},H(a.lastText(e)),3),e.sessionId?(v(),t(`button`,{key:0,type:`button`,class:`sch-link`,onClick:t=>a.emit(`open-session`,e.sessionId)},H(a.$t(`@SCHED:查看会话`)),9,en)):I(`v-if`,!0)])]),i(`div`,tn,[i(`div`,{class:w([`schedule-next`,{"is-muted":!e.enabled}])},H(a.nextText(e)),3),i(`div`,nn,[e.running?(v(),t(`button`,{key:0,type:`button`,class:`sch-btn`,disabled:!!a.pending[e.id],onClick:t=>a.stop(e)},H(a.$t(`@SCHED:停止`)),9,rn)):(v(),t(`button`,{key:1,type:`button`,class:`sch-btn`,disabled:!!a.pending[e.id],onClick:t=>a.runNow(e)},H(a.$t(`@SCHED:运行`)),9,an)),i(`button`,{type:`button`,class:`sch-btn`,onClick:t=>a.openEdit(e)},H(a.$t(`@SCHED:编辑`)),9,on),i(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:t=>a.askRemove(e)},H(a.$t(`@SCHED:删除`)),9,sn)])])],2))),128))])):(v(),t(`div`,Ut,[i(`p`,Wt,H(a.$t(`@SCHED:还没有定时任务`)),1),i(`p`,Gt,H(a.$t(`@SCHED:让 g ai 在指定时间自动做事:定时拉代码、定时巡检、定时汇总。也可以在对话里直接说「每天 9 点帮我…」,让 g ai 来创建。`)),1)])),I(` 新建 / 编辑 `),o(a.CommonDialog,{modelValue:a.formVisible,"onUpdate:modelValue":n[14]||=e=>a.formVisible=e,title:a.editingId?a.$t(`@SCHED:编辑任务`):a.$t(`@SCHED:新建任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`medium`,width:`560px`,"z-index":3e6,"custom-class":`schedule-dialog`},{default:L(()=>[i(`div`,cn,[i(`label`,ln,[i(`span`,un,H(a.$t(`@SCHED:任务名`)),1),U(i(`input`,{"onUpdate:modelValue":n[0]||=e=>a.form.name=e,class:`sch-input`,type:`text`,placeholder:a.$t(`@SCHED:如:每日拉代码`)},null,8,dn),[[W,a.form.name]])]),i(`div`,fn,[i(`span`,pn,H(a.$t(`@SCHED:执行计划`)),1),i(`div`,mn,[U(i(`select`,{"onUpdate:modelValue":n[1]||=e=>a.form.freq=e,class:`sch-input sch-select`},[(v(!0),t(y,null,j(a.freqOptions,e=>(v(),t(`option`,{key:e.value,value:e.value},H(e.label),9,hn))),128))],512),[[D,a.form.freq]]),a.form.freq===`minutes`?(v(),t(y,{key:0},[i(`span`,gn,H(a.$t(`@SCHED:每`)),1),U(i(`select`,{"onUpdate:modelValue":n[2]||=e=>a.form.everyMinutes=e,class:`sch-input sch-select sch-select-sm`},[(v(),t(y,null,j([5,10,15,20,30,60],e=>i(`option`,{key:e,value:e},H(e),9,_n)),64))],512),[[D,a.form.everyMinutes,void 0,{number:!0}]]),i(`span`,vn,H(a.$t(`@SCHED:分钟`)),1)],64)):a.form.freq===`daily`||a.form.freq===`weekly`?(v(),t(y,{key:1},[a.form.freq===`weekly`?U((v(),t(`select`,{key:0,"onUpdate:modelValue":n[3]||=e=>a.form.weekday=e,class:`sch-input sch-select sch-select-sm`},[(v(),t(y,null,j(a.WEEKDAY_KEYS,(e,t)=>i(`option`,{key:t,value:t},H(a.$t(e)),9,yn)),64))],512)),[[D,a.form.weekday,void 0,{number:!0}]]):I(`v-if`,!0),U(i(`select`,{"onUpdate:modelValue":n[4]||=e=>a.form.hour=e,class:`sch-input sch-select sch-select-sm`},[(v(),t(y,null,j(24,e=>i(`option`,{key:e-1,value:e-1},H(String(e-1).padStart(2,`0`)),9,bn)),64))],512),[[D,a.form.hour,void 0,{number:!0}]]),n[19]||=i(`span`,{class:`sch-inline-label`},`:`,-1),U(i(`select`,{"onUpdate:modelValue":n[5]||=e=>a.form.minute=e,class:`sch-input sch-select sch-select-sm`},[(v(),t(y,null,j(60,e=>i(`option`,{key:e-1,value:e-1},H(String(e-1).padStart(2,`0`)),9,xn)),64))],512),[[D,a.form.minute,void 0,{number:!0}]])],64)):a.form.freq===`hourly`?(v(),t(y,{key:2},[i(`span`,Sn,H(a.$t(`@SCHED:第`)),1),U(i(`select`,{"onUpdate:modelValue":n[6]||=e=>a.form.minute=e,class:`sch-input sch-select sch-select-sm`},[(v(),t(y,null,j(60,e=>i(`option`,{key:e-1,value:e-1},H(String(e-1).padStart(2,`0`)),9,Cn)),64))],512),[[D,a.form.minute,void 0,{number:!0}]]),i(`span`,wn,H(a.$t(`@SCHED:分钟`)),1)],64)):U((v(),t(`input`,{key:3,"onUpdate:modelValue":n[7]||=e=>a.form.custom=e,class:`sch-input sch-input-cron`,type:`text`,spellcheck:`false`,placeholder:a.$t(`@SCHED:如:0 9 * * 1-5`)},null,8,Tn)),[[W,a.form.custom]])]),i(`span`,En,H(a.$t(`@SCHED:cron:{cron}(分 时 日 月 周,本地时间)`,{cron:a.cronPreview||`—`})),1)]),i(`label`,Dn,[i(`span`,On,H(a.$t(`@SCHED:项目目录`)),1),U(i(`input`,{"onUpdate:modelValue":n[8]||=e=>a.form.cwd=e,class:`sch-input`,type:`text`,spellcheck:`false`,placeholder:a.$t(`@SCHED:任务在该目录下执行(默认当前项目)`)},null,8,kn),[[W,a.form.cwd]])]),i(`label`,An,[i(`span`,jn,H(a.$t(`@SCHED:提示词`)),1),U(i(`textarea`,{"onUpdate:modelValue":n[9]||=e=>a.form.prompt=e,class:`sch-input sch-textarea`,rows:`4`,placeholder:a.$t(`@SCHED:到点后发给 g ai 的完整指令,例如:检查所有仓库远端更新,有变更就 pull;写成一次自足的请求(未来那一轮没有现在的上下文)`)},null,8,Mn),[[W,a.form.prompt]])]),i(`div`,Nn,[i(`span`,Pn,H(a.$t(`@SCHED:错过补偿`)),1),i(`div`,Fn,[i(`label`,In,[U(i(`input`,{"onUpdate:modelValue":n[10]||=e=>a.form.onMissed=e,type:`radio`,value:`run`},null,512),[[N,a.form.onMissed]]),i(`span`,null,H(a.$t(`@SCHED:补跑一次(g ui 重新运行后)`)),1)]),i(`label`,Ln,[U(i(`input`,{"onUpdate:modelValue":n[11]||=e=>a.form.onMissed=e,type:`radio`,value:`skip`},null,512),[[N,a.form.onMissed]]),i(`span`,null,H(a.$t(`@SCHED:跳过`)),1)]),i(`label`,Rn,[U(i(`input`,{"onUpdate:modelValue":n[12]||=e=>a.form.enabled=e,type:`checkbox`},null,512),[[z,a.form.enabled]]),i(`span`,null,H(a.$t(`@SCHED:创建后启用`)),1)])])]),a.formError?(v(),t(`p`,zn,H(a.formError),1)):I(`v-if`,!0)]),i(`div`,Bn,[i(`button`,{type:`button`,class:`sch-btn`,onClick:n[13]||=e=>a.formVisible=!1},H(a.$t(`@SCHED:取消`)),1),i(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,disabled:a.saving,onClick:a.submitForm},H(a.saving?a.$t(`@SCHED:保存中...`):a.$t(`@SCHED:保存`)),9,Vn)])]),_:1},8,[`modelValue`,`title`]),I(` 删除确认 `),o(a.CommonDialog,{modelValue:a.confirmVisible,"onUpdate:modelValue":n[16]||=e=>a.confirmVisible=e,title:a.$t(`@SCHED:删除任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`small`,width:`400px`,"z-index":3e6,"custom-class":`schedule-dialog-confirm`},{default:L(()=>[i(`p`,Hn,H(a.$t(`@SCHED:确定删除「{name}」吗?已产生的会话会保留,但任务不再执行。`,{name:a.confirmTarget?.name||``})),1),i(`div`,Un,[i(`button`,{type:`button`,class:`sch-btn`,onClick:n[15]||=e=>a.confirmVisible=!1},H(a.$t(`@SCHED:取消`)),1),i(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:a.confirmRemove},H(a.$t(`@SCHED:删除`)),1)])]),_:1},8,[`modelValue`,`title`])])}var Gn=q(Lt,[[`render`,Wn],[`__scopeId`,`data-v-63dc658b`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/SchedulePanel.vue`]]);x(),B();var Kn=4e3,qn=m({__name:`AgentPromptSettings`,setup(e,{expose:t}){t();let n=le(),{defaultPrompt:r,projectPrompts:i,loadOrchestrator:o,saveDefaultPrompt:s,saveProjectPrompt:c}=ke(),l=G(``),u=G(!1),d=G(!1),f=a(()=>n.agentDefaultPrompt||``),p=a(()=>l.value.trim()!==f.value.trim());async function m(){if(!u.value&&p.value){u.value=!0;try{await n.saveAiSettings({agentDefaultPrompt:l.value})&&(l.value=f.value,d.value=!0,P.success(K(`@AGENT:已保存 g ai 默认提示词`)))}finally{u.value=!1}}}let h=a(()=>n.currentDirectory||``),g=a(()=>de(h.value)||h.value),_=a(()=>{let e=pe(h.value);return e&&i.value?.[e]?.prompt||``}),v=G(``),y=G(``),b=G(!1),x=G(!1),S=G(!1),w=a(()=>v.value.trim()!==(r.value||``).trim()||!!h.value&&y.value.trim()!==_.value.trim());function T(){v.value=r.value||``,y.value=_.value}C(async()=>{l.value=f.value,T();let e=await o(!0);S.value=!e,e&&T()});async function E(){if(!b.value&&w.value){b.value=!0;try{let e=!0,t=v.value.trim();t!==(r.value||``).trim()&&(e=await s(t));let n=y.value.trim();e&&h.value&&n!==_.value.trim()&&(e=await c(h.value,n)),e&&(T(),x.value=!0)}finally{b.value=!1}}}let D={configStore:n,defaultPrompt:r,projectPrompts:i,loadOrchestrator:o,saveDefaultPrompt:s,saveProjectPrompt:c,MAX_CHARS:Kn,gaiDraft:l,savingGai:u,gaiSaved:d,gaiStored:f,gaiDirty:p,saveGai:m,projectPath:h,projectName:g,projectPrompt:_,globalDraft:v,projectDraft:y,savingDispatch:b,dispatchSaved:x,dispatchLoadFailed:S,dispatchDirty:w,syncDispatchDraft:T,saveDispatch:E,get $t(){return K}};return Object.defineProperty(D,"__isScriptSetup",{enumerable:!1,value:!0}),D}});u(),x(),A();var Jn={class:`aps`},Yn={class:`aps__scroll`},Xn={class:`aps__head`},Zn={class:`aps__title`},Qn={class:`aps__intro`},$n={class:`aps__card aps__card--gai`},er={class:`aps__card-head`},tr={class:`aps__card-title`},nr={class:`aps__count`},rr={class:`aps__hint`},ir=[`placeholder`],ar={class:`aps__foot`},or={key:0,class:`aps__saved`},sr=[`disabled`],cr={class:`aps__card aps__card--dispatch`},lr={class:`aps__card-head`},ur={class:`aps__card-title`},dr={class:`aps__hint`},fr={class:`aps__field`},pr={class:`aps__card-head`},mr={class:`aps__label`,for:`aps-global`},hr={class:`aps__count`},gr=[`placeholder`],_r={class:`aps__field`},vr={class:`aps__card-head`},yr={class:`aps__label`,for:`aps-project`},br={key:0,class:`aps__count`},xr=[`disabled`,`placeholder`],Sr={class:`aps__hint`},Cr={class:`aps__foot`},wr={key:0,class:`aps__saved`},Tr={key:1,class:`aps__saved`},Er=[`disabled`];function Dr(e,n,r,a,o,s){return v(),t(`div`,Jn,[i(`div`,Yn,[i(`header`,Xn,[i(`h3`,Zn,H(a.$t(`@AGENT:提示词设置`)),1),i(`p`,Qn,H(a.$t(`@AGENT:这里配的两块提示词,和 g ai 对话时每一轮都会自动带上。改完下一次发消息就生效,不用新开会话。`)),1)]),I(` ── ① g ai 智能体的默认提示词 ── `),i(`section`,$n,[i(`div`,er,[i(`h4`,tr,H(a.$t(`@AGENT:g ai 智能体的默认提示词`)),1),i(`span`,nr,H(a.gaiDraft.length)+` / `+H(a.MAX_CHARS),1)]),i(`p`,rr,H(a.$t(`@AGENT:只作用于 g ai 自己:每次对话都会带上(定时任务也一样)。派发出去的任务读不到这一段。`)),1),U(i(`textarea`,{id:`aps-gai`,"onUpdate:modelValue":n[0]||=e=>a.gaiDraft=e,class:`aps__area`,rows:`6`,maxlength:a.MAX_CHARS,placeholder:a.$t(`@AGENT:例如:回答用中文;改完代码先跑一遍验证再汇报;不要动 dist 目录`)},null,8,ir),[[W,a.gaiDraft]]),i(`div`,ar,[a.gaiSaved&&!a.gaiDirty?(v(),t(`span`,or,H(a.$t(`@AGENT:已保存`)),1)):I(`v-if`,!0),n[3]||=i(`span`,{class:`aps__spacer`},null,-1),i(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:a.savingGai||!a.gaiDirty,onClick:a.saveGai},H(a.savingGai?a.$t(`@AGENT:保存中…`):a.$t(`@AGENT:保存`)),9,sr)])]),I(` ── ② 派发任务的提示词 ── `),i(`section`,cr,[i(`div`,lr,[i(`h4`,ur,H(a.$t(`@AGENT:派发任务的提示词`)),1)]),i(`p`,dr,H(a.$t(`@AGENT:与工作台「预设提示词」是同一份设置,在哪边改都一样。派发任务时附加在指令之前,和 g ai 对话时也会带上。`)),1),i(`div`,fr,[i(`div`,pr,[i(`label`,mr,H(a.$t(`@AGENT:全局提示词`)),1),i(`span`,hr,H(a.globalDraft.length)+` / `+H(a.MAX_CHARS),1)]),U(i(`textarea`,{id:`aps-global`,"onUpdate:modelValue":n[1]||=e=>a.globalDraft=e,class:`aps__area`,rows:`5`,maxlength:a.MAX_CHARS,placeholder:a.$t(`@AGENT:对所有项目生效。例如:回答用中文;改完代码必须跑一遍测试;不要动 dist 目录`)},null,8,gr),[[W,a.globalDraft]])]),i(`div`,_r,[i(`div`,vr,[i(`label`,yr,H(a.projectPath?a.$t(`@AGENT:「{name}」的项目提示词`,{name:a.projectName}):a.$t(`@AGENT:项目提示词`)),1),a.projectPath?(v(),t(`span`,br,H(a.projectDraft.length)+` / `+H(a.MAX_CHARS),1)):I(`v-if`,!0)]),U(i(`textarea`,{id:`aps-project`,"onUpdate:modelValue":n[2]||=e=>a.projectDraft=e,class:`aps__area`,rows:`5`,maxlength:a.MAX_CHARS,disabled:!a.projectPath,placeholder:a.projectPath?a.$t(`@AGENT:只在这个项目派发/对话时附加。例如:包管理器用 pnpm;改动集中在 src/ui 下`):a.$t(`@AGENT:当前没有打开项目,项目级提示词暂时不能设置`)},null,8,xr),[[W,a.projectDraft]]),i(`p`,Sr,H(a.projectPath?a.$t(`@AGENT:项目提示词追加在全局提示词之后(不覆盖全局),在「{name}」里派发或对话时一起带上`,{name:a.projectName}):a.$t(`@AGENT:先在左上角切到一个项目,才能设置它的提示词`)),1)]),i(`div`,Cr,[a.dispatchSaved&&!a.dispatchDirty?(v(),t(`span`,wr,H(a.$t(`@AGENT:已保存`)),1)):a.dispatchLoadFailed?(v(),t(`span`,Tr,H(a.$t(`@AGENT:读取设置失败,请稍后重试`)),1)):I(`v-if`,!0),n[4]||=i(`span`,{class:`aps__spacer`},null,-1),i(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:a.savingDispatch||!a.dispatchDirty,onClick:a.saveDispatch},H(a.savingDispatch?a.$t(`@AGENT:保存中…`):a.$t(`@AGENT:保存`)),9,Er)])])])])}var Or=q(qn,[[`render`,Dr],[`__scopeId`,`data-v-f9ada51b`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AgentPromptSettings.vue`]]);x(),B();var kr=40,Ar=m({__name:`AgentView`,setup(t,{expose:r}){r();let i=le(),o=G(null),{narrow:c}=Oe(o),l=G(`chat`),u=G(`chat`),m=a(()=>u.value===`mcp`?`mcp`:`skill`),h=a(()=>[{id:`chat`,label:K(`@AGENT:对话`),icon:M},{id:`schedule`,label:K(`@AGENT:定时任务`),icon:e},{id:`skill`,label:K(`@AGENT:Skill 广场`),icon:b},{id:`mcp`,label:K(`@AGENT:MCP 广场`),icon:ie},{id:`settings`,label:K(`@AGENT:设置`),icon:p}]),{sessions:g,sessionsLoading:_,currentSessionId:v,messages:y,displayMessages:x,isStreaming:S,sessionLoading:w,loadSessions:T,loadSession:E,deleteSession:D,renameSession:O,newSession:k,sendMessage:A,retryTurn:j,questionPanel:N,answeringQuestion:P,answerQuestion:F,isSessionGenerating:I,currentEngine:ee,pendingEngine:L,isEngineLocked:R,pickEngine:z,stop:B,inputContextUsage:te,queuedMessages:ne,queuePaused:re,removeQueuedMessage:H,flushQueued:ae}=we(),U=a(()=>R.value?ee.value:L.value);function W(e){R.value||z(e)}let oe=a(()=>{let e=i.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),q=a(()=>he(g.value,I)),ue=me(),de=a(()=>q.value.find(e=>e.id===v.value)?.title||K(`@AGENT:对话`)),pe={"--welcome-avatar":`url("${Ce}")`},ke=a(()=>fe(i.agentPresetPrompts));async function J(e){await A(e.text,e.files),await s(),Y()}async function Ae(e){await A(e.prompt),await s(),Y()}let je=be(),Me=G(null),Ne=Se();function Y(e=!0){Me.value?.scrollToBottom(e)}V(()=>y.value.length,()=>{s(()=>Y(!1))});function Pe(e){E(e),l.value=`chat`}function X(e){e&&(u.value=`chat`,Pe(e))}function Ie(){k(),l.value=`chat`}let Z=G(280),Q=G(!1),{convListCollapsed:Le,setConvListCollapsed:Re}=Te();function ze(e){if(Le.value)return;Q.value=!0;let t=e.clientX,n=Z.value,r=e=>{let r=e.clientX-t,i=Math.max(200,Math.min(500,n+r));Z.value=i},i=()=>{Q.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}V(c,e=>{e||(l.value=`chat`)}),V(()=>[i.currentDirectory,S.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await T(),v.value&&!S.value&&!g.value.some(e=>e.sessionId===v.value)&&k()},{immediate:!0});let $=null;C(()=>{$=Fe(e=>{e.type===`task_finished`&&T().catch(()=>{})})}),f(()=>{$?.(),$=null});let Be={configStore:i,rootRef:o,narrow:c,chatPage:l,activeTab:u,marketplaceType:m,tabs:h,sessions:g,sessionsLoading:_,currentSessionId:v,messages:y,displayMessages:x,isStreaming:S,sessionLoading:w,loadSessions:T,loadSession:E,deleteSession:D,renameSession:O,newSession:k,sendMessage:A,retryTurn:j,questionPanel:N,answeringQuestion:P,answerQuestion:F,isSessionGenerating:I,currentEngine:ee,pendingEngine:L,isEngineLocked:R,pickEngine:z,stop:B,inputContextUsage:te,queuedMessages:ne,queuePaused:re,removeQueuedMessage:H,flushQueued:ae,displayEngine:U,handleEngineSelect:W,chatTheme:oe,conversationItems:q,conversationLabels:ue,currentSessionTitle:de,welcomeAvatarStyle:pe,presetQuestions:ke,onSend:J,onSelectPreset:Ae,questionLabels:je,chatContainerRef:Me,queueLabels:Ne,scrollToBottom:Y,selectSession:Pe,handleScheduleOpenSession:X,handleNewSession:Ie,sidebarWidth:Z,isResizing:Q,convListCollapsed:Le,setConvListCollapsed:Re,CONV_RAIL_WIDTH:kr,startResize:ze,get disposeScheduleEvents(){return $},set disposeScheduleEvents(e){$=e},get $t(){return K},get ElIcon(){return d},get Loading(){return n},get ChatContainer(){return se},get ConversationList(){return ce},get AGENT_UPLOAD_ACCEPT(){return _e},get AGENT_ASSISTANT_NAME(){return ye},get AGENT_ASSISTANT_AVATAR(){return Ce},get MESSAGE_RAIL_CONFIG(){return ge},get MESSAGE_META_CONFIG(){return xe},get agentEngineName(){return ve},MarketplacePanel:It,SchedulePanel:Gn,AgentPromptSettings:Or,AgentEngineSelector:Ee,CopySessionButton:De};return Object.defineProperty(Be,"__isScriptSetup",{enumerable:!1,value:!0}),Be}});x(),u();var jr={ref:`rootRef`,class:`agent-view`},Mr={class:`agent-chat-area`},Nr={class:`agent-tabs`,role:`tablist`},Pr=[`aria-selected`,`onClick`],Fr={class:`agent-tab-body`},Ir={key:0,class:`agent-chat-pane`},Lr={key:0,class:`agent-list-page`},Rr={key:0,class:`agent-page-bar`},zr=[`title`,`aria-label`],Br={class:`agent-page-title`},Vr={key:0,class:`chat-loading`};function Hr(e,n,r,a,s,c){return v(),t(`div`,jr,[I(` ═══ 宽屏:左侧会话列表(只在「对话」Tab 显示)═══
3
- 窄屏时这一整块不渲染,会话列表改成 body 里的一个整页(见 .agent-list-page) `),a.activeTab===`chat`&&!a.narrow?(v(),t(y,{key:0},[i(`aside`,{class:w([`agent-sidebar`,{"is-convs-collapsed":a.convListCollapsed}]),style:E({width:(a.convListCollapsed?a.CONV_RAIL_WIDTH:a.sidebarWidth)+`px`})},[I(` 会话列表:UI 与交互都在组件库的 ConversationList 里(含收起 / 展开) `),o(a.ConversationList,{class:`agent-conversations`,items:a.conversationItems,"active-id":a.currentSessionId,loading:a.sessionsLoading,labels:a.conversationLabels,collapsible:``,collapsed:a.convListCollapsed,"onUpdate:collapsed":a.setConvListCollapsed,onSelect:a.selectSession,onNew:a.handleNewSession,onRename:a.renameSession,onDelete:a.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`collapsed`,`onUpdate:collapsed`,`onRename`,`onDelete`])],6),I(` 拖拽分隔条(收起时藏起来:40px 的收纳条没有可拖的余地) `),a.convListCollapsed?I(`v-if`,!0):(v(),t(`div`,{key:0,class:w([`sidebar-resizer`,{active:a.isResizing}]),onMousedown:a.startResize},null,34))],64)):I(`v-if`,!0),I(` ═══ 右侧:Tab 栏 + 内容区 ═══ `),i(`main`,Mr,[i(`nav`,Nr,[(v(!0),t(y,null,j(a.tabs,e=>(v(),t(`button`,{key:e.id,type:`button`,class:w([`agent-tab`,{active:a.activeTab===e.id}]),role:`tab`,"aria-selected":a.activeTab===e.id,onClick:t=>a.activeTab=e.id},[o(a.ElIcon,null,{default:L(()=>[(v(),g(re(e.icon)))]),_:2},1024),i(`span`,null,H(e.label),1)],10,Pr))),128)),I(` ═══ 引擎选择器 ═══
4
- 与工作台执行器下拉同一套交互(点击展开、未安装标出来、点了直接开安装弹窗)。
5
- 下拉本体收口在 AgentEngineSelector,文件空间 g ai 面板复用同一份实现。
6
- 会话一旦落盘就置灰:引擎在会话建立时锁定(三家续聊标识互不通用),要换请新建。 `),a.activeTab===`chat`?(v(),g(a.AgentEngineSelector,{key:0,class:`agent-engine`,engine:a.displayEngine,locked:a.isEngineLocked,onSelect:a.handleEngineSelect},null,8,[`engine`,`locked`])):I(`v-if`,!0),I(` 复制整条会话(默认精简范围,小箭头可选全量)——与工作台的「复制执行内容」同一套口径 `),a.activeTab===`chat`?(v(),g(a.CopySessionButton,{key:1,class:`agent-copy`,messages:a.messages,title:a.currentSessionTitle,engine:a.agentEngineName(a.displayEngine)},null,8,[`messages`,`title`,`engine`])):I(`v-if`,!0)]),i(`div`,Fr,[I(` ── 对话 ── `),a.activeTab===`chat`?(v(),t(`div`,Ir,[I(` 窄屏 · 会话列表页:列表独占整页 `),a.narrow&&a.chatPage===`list`?(v(),t(`div`,Lr,[o(a.ConversationList,{class:`agent-conversations`,items:a.conversationItems,"active-id":a.currentSessionId,loading:a.sessionsLoading,labels:a.conversationLabels,onSelect:a.selectSession,onNew:a.handleNewSession,onRename:a.renameSession,onDelete:a.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])])):(v(),t(y,{key:1},[I(` 对话页(窄屏时顶上多一条返回条;宽屏左侧就摆着列表,不需要) `),a.narrow?(v(),t(`div`,Rr,[i(`button`,{type:`button`,class:`agent-page-back`,title:a.$t(`@AGENT:返回会话列表`),"aria-label":a.$t(`@AGENT:返回会话列表`),onClick:n[0]||=e=>a.chatPage=`list`},[...n[1]||=[i(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[i(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),i(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,zr),i(`span`,Br,H(a.currentSessionTitle),1)])):I(`v-if`,!0),I(`
7
- 对话宿主:单独开一层裁剪边界。
8
- 欢迎页在矮/窄窗口里会比可用高度还高,而它是垂直居中的 —— 溢出的部分
9
- 会**向上**跑出 .acu-chat,盖到刚加的返回条上(把返回条的点击也一起吃掉,
10
- e2e 实测就是这个症状)。宿主的 overflow:hidden 把它裁在自己这一格里。
11
- `),i(`div`,{class:`agent-chat-host`,style:a.welcomeAvatarStyle},[I(` 加载中 `),a.sessionLoading?(v(),t(`div`,Vr,[o(a.ElIcon,{class:`is-loading`,size:32},{default:L(()=>[o(a.Loading)]),_:1}),i(`span`,null,H(a.$t(`@AGENT:加载会话中...`)),1)])):(v(),t(y,{key:1},[I(` ChatContainer `),o(a.ChatContainer,{ref:`chatContainerRef`,messages:a.displayMessages,"preset-questions":a.presetQuestions,"welcome-title":a.$t(`@AGENT:智能体助手`),"welcome-description":a.$t(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":a.AGENT_ASSISTANT_NAME,"assistant-avatar":a.AGENT_ASSISTANT_AVATAR,theme:a.chatTheme,generating:a.isStreaming,"allow-queue":!0,queued:a.queuedMessages,"queue-paused":a.queuePaused,"queue-labels":a.queueLabels,"upload-config":{accept:a.AGENT_UPLOAD_ACCEPT},"context-usage":a.inputContextUsage,placeholder:a.isStreaming?a.$t(`@AGENT:生成中,发送后会排队,等本轮跑完自动接上…`):a.$t(`@AGENT:输入消息,Enter 发送`),question:a.questionPanel,"question-submitting":a.answeringQuestion,"question-labels":a.questionLabels,"plan-config":{labels:{title:a.$t(`@AGENT:计划`),raw:a.$t(`@AGENT:原始参数`)}},"message-rail-config":a.MESSAGE_RAIL_CONFIG,"message-meta-config":a.MESSAGE_META_CONFIG,onSend:a.onSend,onSelect:a.onSelectPreset,onStop:a.stop,onUnqueue:a.removeQueuedMessage,onFlushQueued:a.flushQueued,onAnswer:a.answerQuestion,onRetry:a.retryTurn},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`])],2112))])],64))])):a.activeTab===`schedule`?(v(),t(y,{key:1},[I(` ── 定时任务 ── `),o(a.SchedulePanel,{onOpenSession:a.handleScheduleOpenSession})],2112)):a.activeTab===`skill`||a.activeTab===`mcp`?(v(),t(y,{key:2},[I(` ── Skill 广场 / MCP 广场 ── `),o(a.MarketplacePanel,{type:a.marketplaceType},null,8,[`type`])],2112)):(v(),t(y,{key:3},[I(` ── 设置(提示词设置)── `),o(a.AgentPromptSettings)],2112))])])],512)}var Ur=q(Ar,[[`render`,Hr],[`__scopeId`,`data-v-bd681ddd`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/AgentView.vue`]]);export{Ur as default};
@@ -1,2 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,At as t,Dn as n,En as r,Fn as i,Gn as a,Ir as o,J as s,Jn as c,Ln as l,On as u,Pn as d,Qn as f,Vn as p,W as m,Xn as h,Yr as g,i as _,kn as v,lr as y,mr as b,nt as x,r as S,rt as C,sr as w,ti as T,xr as E,z as D}from"./element-plus-CDrtgG55.js";import{n as O,t as k}from"./_plugin-vue_export-helper-BY0jlMBE.js";import{t as A}from"./CommonDialog-DrxsmpDL.js";async function j(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 M(){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 N(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 j(t,t=>{try{e(JSON.parse(t))}catch{}})}async function P(){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())};j(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(()=>{})})}p(),b();var F=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,I=l({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean,required:!0},logs:{type:String,required:!0},status:{type:String,required:!0},countdown:{type:Number,required:!1,default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(e,{expose:n,emit:r}){n();let i=e,o=r,s=E(null);w(()=>i.logs,async()=>{await a(),s.value&&(s.value.scrollTop=s.value.scrollHeight)});function c(){i.status!==`running`&&(i.status===`success`&&i.countdown>0&&o(`cancel`),o(`update:modelValue`,!1))}function l(){o(`retry`)}function u(){o(`restart`)}function d(){o(`cancel`),o(`update:modelValue`,!1)}async function f(){try{await navigator.clipboard.writeText(F),_.success(O(`@F13B4:已复制升级命令`))}catch{_.warning(O(`@F13B4:复制失败,请手动复制`))}}let p={MANUAL_COMMAND:F,props:i,emit:o,logEl:s,close:c,onRetry:l,onRestart:u,onLater:d,onCopyCommand:f,get Loading(){return t},get CircleCheck(){return x},get CircleClose(){return C},get $t(){return O},CommonDialog:A};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}});p(),o();var L={key:3},R={key:4},z={key:5},B={key:0,class:`upgrade-hint`},V={key:0,class:`upgrade-countdown`},H={key:1,class:`upgrade-manual`},U={class:`upgrade-manual__label`};function W(t,r,a,o,c,l){let p=s,m=D;return f(),u(o.CommonDialog,{"model-value":a.modelValue,"onUpdate:modelValue":r[0]||=e=>o.emit(`update:modelValue`,e),title:o.$t(`@F13B4:升级`),width:`680px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":a.status!==`running`,"append-to-body":``,onClose:o.close},{footer:y(()=>[a.status===`failed`?(f(),u(m,{key:0,type:`primary`,onClick:o.onRetry},{default:y(()=>[d(T(o.$t(`@F13B4:重试`)),1)]),_:1})):v(`v-if`,!0),a.status===`failed`?(f(),u(m,{key:1,onClick:o.onCopyCommand},{default:y(()=>[d(T(o.$t(`@F13B4:复制升级命令`)),1)]),_:1})):v(`v-if`,!0),a.status===`success`?(f(),u(m,{key:2,type:`primary`,onClick:o.onRestart},{default:y(()=>[d(T(o.$t(`@F13B4:立即重启并刷新`)),1)]),_:1})):v(`v-if`,!0),a.status===`success`?(f(),u(m,{key:3,onClick:o.onLater},{default:y(()=>[d(T(o.$t(`@F13B4:稍后手动重启`)),1)]),_:1})):v(`v-if`,!0),a.status===`running`?(f(),u(m,{key:4,disabled:``},{default:y(()=>[d(T(o.$t(`@F13B4:升级中`))+`... `,1)]),_:1})):v(`v-if`,!0)]),default:y(()=>[n(`div`,{class:g([`upgrade-status`,`is-${a.status}`])},[a.status===`running`?(f(),u(p,{key:0,class:`is-loading`},{default:y(()=>[i(o.Loading)]),_:1})):a.status===`success`?(f(),u(p,{key:1,color:`var(--color-success)`},{default:y(()=>[i(o.CircleCheck)]),_:1})):(f(),u(p,{key:2,color:`var(--color-danger)`},{default:y(()=>[i(o.CircleClose)]),_:1})),a.status===`running`?(f(),e(`span`,L,T(o.$t(`@F13B4:升级中`)),1)):a.status===`success`?(f(),e(`span`,R,T(o.$t(`@F13B4:升级完成`)),1)):(f(),e(`span`,z,T(o.$t(`@F13B4:升级失败`)),1))],2),a.status===`success`?(f(),e(`p`,B,[d(T(o.$t(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),a.countdown>0?(f(),e(`span`,V,T(o.$t(`@F13B4:{seconds} 秒后自动刷新`,{seconds:a.countdown})),1)):v(`v-if`,!0)])):v(`v-if`,!0),a.status===`failed`?(f(),e(`p`,H,[n(`span`,U,T(o.$t(`@F13B4:手动升级命令`)),1),n(`code`,{class:`upgrade-manual__cmd`},T(o.MANUAL_COMMAND))])):v(`v-if`,!0),n(`pre`,{ref:`logEl`,class:`upgrade-log`},T(a.logs||o.$t(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}var G=k(I,[[`render`,W],[`__scopeId`,`data-v-bc566bba`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/UpgradeDialog.vue`]]);p(),b();var K=`https://github.com/xz333221/zen-gitsync/tags`,q=5,J=`app-version-check`,Y=36e5,X=l({__name:`AppVersionBadge`,setup(e,{expose:t}){t();let n=`2.18.12`,i=E(n),a=r(()=>i.value||n),o=E(null),s=E(!1),l=E(``),u=E(`running`),d=E(0),f=null,p=E(!1);function m(){try{let e=sessionStorage.getItem(J);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>Y?null:n}catch{return null}}function g(e){try{sessionStorage.setItem(J,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function v(e=!1){let t=m();t&&(o.value=t);try{let t=await M();o.value=t,g(t),t.current&&(i.value=t.current),!e&&t.success&&t.hasUpdate&&_({type:`success`,message:O(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||_({type:`warning`,message:O(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function y(){if(o.value?.hasUpdate){try{await S.confirm(O(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:o.value.current,latest:o.value.latest}),O(`@F13B4:升级`),{confirmButtonText:O(`@F13B4:确定升级`),cancelButtonText:O(`@F13B4:取消`),type:`info`})}catch{return}l.value=``,u.value=`running`,s.value=!0,await N(e=>{if(e.type===`done`){if(u.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(J)}catch{}o.value?.latest&&(i.value=o.value.latest),b()}}else e.message&&(l.value+=e.message)})}}function b(){x(),d.value=q,f=setInterval(()=>{--d.value,d.value<=0&&(f&&=(clearInterval(f),null),w())},1e3)}function x(){f&&=(clearInterval(f),null),d.value=0}function C(){x()}async function w(){if(x(),!p.value){p.value=!0;try{let e=await P(),{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];_({type:`warning`,message:n?O(n):O(`@F13B4:重启失败 {error}`,{error:t})}),p.value=!1}}}c(()=>{x()}),h(()=>{v(!0)});let T={buildVersion:n,releasesUrl:K,runtimeVersion:i,displayVersion:a,latestInfo:o,upgradeDialogVisible:s,upgradeLogs:l,upgradeStatus:u,AUTO_REFRESH_SECONDS:q,countdown:d,get countdownTimer(){return f},set countdownTimer(e){f=e},restartInFlight:p,CACHE_KEY:J,CACHE_TTL_MS:Y,readCache:m,writeCache:g,checkUpdate:v,handleUpgrade:y,startAutoRefreshCountdown:b,cancelAutoRefreshCountdown:x,handleCancelAutoRefresh:C,handleRestart:w,get $t(){return O},UpgradeDialog:G};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}});p(),o();var Z={class:`app-version-badge`},Q=[`aria-label`],$=[`aria-label`],ee=[`title`,`aria-label`],te={class:`upgrade-btn__label`},ne={class:`upgrade-btn__version`};function re(t,r,a,o,s,c){let l=m;return f(),e(`div`,Z,[v(` GitHub 链接 `),i(l,{content:o.$t(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:y(()=>[n(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":o.$t(`@F13B4:在 GitHub 上查看源码`)},[...r[1]||=[n(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[n(`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,Q)]),_:1},8,[`content`]),v(` NPM 链接 `),i(l,{content:o.$t(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:y(()=>[n(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":o.$t(`@F13B4:在 npm 上查看包`)},[...r[2]||=[n(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[n(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,$)]),_:1},8,[`content`]),v(` 版本号 `),i(l,{content:o.$t(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:y(()=>[n(`a`,{href:o.releasesUrl,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+T(o.displayVersion),1)]),_:1},8,[`content`]),o.latestInfo?.hasUpdate?(f(),e(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:o.$t(`@F13B4:发现新版本 {version},点击升级`,{version:o.latestInfo.latest??``}),"aria-label":o.$t(`@F13B4:发现新版本 {version},点击升级`,{version:o.latestInfo.latest??``}),onClick:o.handleUpgrade},[r[3]||=n(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),n(`span`,te,T(o.$t(`@F13B4:升级`)),1),n(`span`,ne,`v`+T(o.latestInfo.latest),1)],8,ee)):v(`v-if`,!0),i(o.UpgradeDialog,{modelValue:o.upgradeDialogVisible,"onUpdate:modelValue":r[0]||=e=>o.upgradeDialogVisible=e,logs:o.upgradeLogs,status:o.upgradeStatus,countdown:o.countdown,onRetry:o.handleUpgrade,onRestart:o.handleRestart,onCancel:o.handleCancelAutoRefresh},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}var ie=k(X,[[`render`,re],[`__scopeId`,`data-v-7e0300ec`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AppVersionBadge.vue`]]);export{ie as default};
@@ -1 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Dn as t,En as n,F as r,Fn as i,G as a,Ht as o,I as s,Ir as c,J as l,K as u,Ln as d,Nt as f,On as p,Qn as m,Sn as h,U as g,Vn as _,Yr as v,_ as y,bn as b,dn as x,er as S,kn as C,lr as w,mr as T,ti as E,tt as D,xr as O,zt as k}from"./element-plus-CDrtgG55.js";import{n as A,t as j}from"./_plugin-vue_export-helper-BY0jlMBE.js";import{t as M}from"./SvgIcon-CP7WAT4C.js";import{t as N}from"./CommonDialog-DrxsmpDL.js";import{G as P,K as F}from"./index-CyEcaEC9.js";_(),T();var I=d({__name:`BranchSelector`,emits:[`branchChanged`],setup(e,{expose:t,emit:r}){t();let i=P(),a=r,s=O(!1),c=O(``),l=n(()=>{let e=c.value.trim().toLowerCase();return e?i.allBranches.filter(t=>t.toLowerCase().includes(e)):i.allBranches});async function u(e){if(e===i.currentBranch){s.value=!1;return}s.value=!1,await i.changeBranch(e)&&(a(`branchChanged`),i.refreshLog())}let d=O(!1),p=O(``),m=O(``);function h(){s.value=!1,m.value=i.currentBranch,d.value=!0}async function g(){await i.createBranch(p.value,m.value)&&(d.value=!1,p.value=``,a(`branchChanged`))}let _=O(!1);async function v(){if(!_.value){_.value=!0;try{await Promise.all([i.getCurrentBranch(!0),i.getBranchStatus(!0),i.getAllBranches()]),a(`branchChanged`),i.refreshLog()}finally{_.value=!1}}}let y={gitStore:i,emit:a,branchPopoverVisible:s,branchFilter:c,filteredBranches:l,selectBranch:u,createBranchDialogVisible:d,newBranchName:p,selectedBaseBranch:m,openCreateBranchDialog:h,createNewBranch:g,isRefreshingBranch:_,refreshCurrentBranch:v,get $t(){return A},get Plus(){return k},get Menu(){return f},get Check(){return D},get Refresh(){return o},CommonDialog:N,IconButton:F,SvgIcon:M};return Object.defineProperty(y,"__isScriptSetup",{enumerable:!1,value:!0}),y}});_(),c(),x();var L={key:0,class:`branch-info`},R={class:`branch-wrapper`},z={class:`branch-btn`},B={class:`branch-btn-name`},V={class:`branch-btn-caret`},H={class:`branch-popover-inner`},U={class:`branch-search`},W={class:`branch-list`},G=[`onClick`],K={key:1,class:`branch-item-check-placeholder`},q={class:`branch-item-name`},J={key:0,class:`branch-empty`},Y={class:`branch-popover-footer`},X={class:`create-branch-content`},Z={class:`form-label`},Q={class:`form-label`},$={class:`dialog-footer`},ee={class:`footer-actions`},te=[`disabled`];function ne(n,o,c,d,f,_){let x=l,T=g,D=y,O=u,k=r,A=s,j=a;return d.gitStore.currentBranch?(m(),e(`div`,L,[t(`div`,R,[C(` VSCode 风格分支按钮 + 弹出列表 `),i(D,{visible:d.branchPopoverVisible,"onUpdate:visible":o[1]||=e=>d.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:o[2]||=e=>d.branchFilter=``},{reference:w(()=>[t(`button`,z,[i(d.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),t(`span`,B,E(d.gitStore.currentBranch),1),t(`span`,V,[i(x,null,{default:w(()=>[...o[7]||=[t(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[t(`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:w(()=>[t(`div`,H,[C(` 搜索框 `),t(`div`,U,[i(T,{modelValue:d.branchFilter,"onUpdate:modelValue":o[0]||=e=>d.branchFilter=e,placeholder:d.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),C(` 分支列表 `),t(`div`,W,[(m(!0),e(h,null,S(d.filteredBranches,n=>(m(),e(`div`,{key:n,class:v([`branch-item`,{"is-active":n===d.gitStore.currentBranch}]),onClick:e=>d.selectBranch(n)},[n===d.gitStore.currentBranch?(m(),p(x,{key:0,class:`branch-item-check`},{default:w(()=>[i(d.Check)]),_:1})):(m(),e(`span`,K)),i(d.SvgIcon,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),t(`span`,q,E(n),1)],10,G))),128)),d.filteredBranches.length===0?(m(),e(`div`,J,E(d.$t(`@F13B4:没有匹配的分支`)),1)):C(`v-if`,!0)]),C(` 底部:创建新分支 `),t(`div`,Y,[t(`button`,{class:`branch-create-btn`,onClick:d.openCreateBranchDialog},[i(x,null,{default:w(()=>[i(d.Plus)]),_:1}),t(`span`,null,E(d.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),C(` 刷新按钮 `),i(d.IconButton,{tooltip:d.$t(`@CMDCON:刷新`),onClick:d.refreshCurrentBranch},{default:w(()=>[i(x,{class:v({"is-loading":d.isRefreshingBranch})},{default:w(()=>[i(d.Refresh)]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),C(` 创建分支对话框 `),i(d.CommonDialog,{modelValue:d.createBranchDialogVisible,"onUpdate:modelValue":o[6]||=e=>d.createBranchDialogVisible=e,title:d.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:w(()=>[t(`div`,$,[t(`div`,ee,[t(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:o[5]||=e=>d.createBranchDialogVisible=!1},E(d.$t(`@F13B4:取消`)),1),t(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:d.createNewBranch,disabled:d.gitStore.isCreatingBranch},[d.gitStore.isCreatingBranch?(m(),p(x,{key:1,class:`is-loading`},{default:w(()=>[...o[8]||=[t(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[t(`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})):(m(),p(x,{key:0},{default:w(()=>[i(d.Check)]),_:1})),t(`span`,null,E(d.$t(`@F13B4:创建`)),1)],8,te)])])]),default:w(()=>[t(`div`,X,[i(j,{model:{newBranchName:d.newBranchName,selectedBaseBranch:d.selectedBaseBranch},"label-position":`top`},{default:w(()=>[i(O,null,{label:w(()=>[t(`div`,Z,[i(x,{class:`label-icon`},{default:w(()=>[i(d.Plus)]),_:1}),t(`span`,null,E(d.$t(`@F13B4:新分支名称`)),1)])]),default:w(()=>[i(T,{modelValue:d.newBranchName,"onUpdate:modelValue":o[3]||=e=>d.newBranchName=e,placeholder:d.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:b(d.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),i(O,null,{label:w(()=>[t(`div`,Q,[i(x,{class:`label-icon`},{default:w(()=>[i(d.Menu)]),_:1}),t(`span`,null,E(d.$t(`@F13B4:基于分支`)),1)])]),default:w(()=>[i(A,{modelValue:d.selectedBaseBranch,"onUpdate:modelValue":o[4]||=e=>d.selectedBaseBranch=e,placeholder:d.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:w(()=>[(m(!0),e(h,null,S(d.gitStore.allBranches,e=>(m(),p(k,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):C(`v-if`,!0)}var re=j(I,[[`render`,ne],[`__scopeId`,`data-v-9548a76f`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{re as default};
@@ -1,14 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,At as t,Dn as n,En as r,F as i,Fn as a,Gn as o,I as s,Ir as c,J as l,Ln as u,On as d,Qn as f,Sn as p,U as m,V as h,Vn as g,W as _,Xn as v,Y as y,Yr as b,Zr as x,dn as S,er as C,ht as w,i as T,kn as E,ln as D,lr as O,mr as k,q as A,sr as j,ti as M,ur as N,wn as P,xn as F,xr as I,yn as L,yr as R,z}from"./element-plus-CDrtgG55.js";import{n as B,t as V}from"./_plugin-vue_export-helper-BY0jlMBE.js";import{t as H}from"./SvgIcon-CP7WAT4C.js";import{o as ee,t as U}from"./configStore-EvRYufor.js";import{G as W,K as te,U as G,c as K,d as q,j as ne,l as re,s as ie,u as ae}from"./index-CyEcaEC9.js";g();var oe=u({__name:`GlobalLoading`,props:{visible:{type:Boolean,required:!1,default:!1},text:{type:String,required:!1,default:B(`@2AEBA:加载中...`)},showProgress:{type:Boolean,required:!1,default:!1},progress:{type:Number,required:!1,default:0},mock:{type:Boolean,required:!1,default:!1}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});g(),c(),S();var se={class:`loading-container`},J={class:`loading-text`},ce={key:0,class:`loading-progress`};function le(t,r,i,o,s,c){return f(),d(P,{to:`body`},[a(D,{name:`loading-fade`},{default:O(()=>[i.visible||i.mock?(f(),e(`div`,{key:0,class:`global-loading-overlay`,onClick:r[0]||=F(()=>{},[`stop`])},[n(`div`,se,[E(` 主加载器 `),r[1]||=n(`div`,{class:`loading-spinner`},[n(`div`,{class:`spinner-ring`}),n(`div`,{class:`spinner-ring`}),n(`div`,{class:`spinner-ring`})],-1),E(` 加载文字 `),n(`div`,J,M(i.text),1),E(` 进度条(可选/Mock) `),i.showProgress||i.mock?(f(),e(`div`,ce,[n(`div`,{class:b([`progress-bar`,{"is-mock":i.mock&&!i.showProgress}]),style:x(i.showProgress?{width:i.progress+`%`}:void 0)},null,6)])):E(`v-if`,!0)])])):E(`v-if`,!0)]),_:1})])}var ue=V(oe,[[`render`,le],[`__scopeId`,`data-v-77e24a5f`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/GlobalLoading.vue`]]);g();var Y=u({__name:`SuccessModal`,props:{visible:{type:Boolean,required:!1,default:!1},text:{type:String,required:!1,default:B(`@71545:操作成功!`)},description:{type:String,required:!1,default:``}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});g(),c(),S();var X={class:`success-container`},de={class:`success-text`},fe={key:0,class:`success-description`};function pe(t,r,i,o,s,c){return f(),d(P,{to:`body`},[a(D,{name:`success-fade`},{default:O(()=>[i.visible?(f(),e(`div`,{key:0,class:`success-overlay`,onClick:r[0]||=F(()=>{},[`stop`])},[n(`div`,X,[E(` 成功图标 `),r[1]||=n(`div`,{class:`success-icon`},[n(`svg`,{viewBox:`0 0 52 52`,class:`success-svg`},[n(`circle`,{class:`success-circle`,cx:`26`,cy:`26`,r:`25`,fill:`none`}),n(`path`,{class:`success-check`,fill:`none`,d:`m14.1 27.2l7.1 7.2 16.7-16.8`})])],-1),E(` 成功文字 `),n(`div`,de,M(i.text),1),E(` 描述文字 `),i.description?(f(),e(`div`,fe,M(i.description),1)):E(`v-if`,!0)])])):E(`v-if`,!0)]),_:1})])}var me=V(Y,[[`render`,pe],[`__scopeId`,`data-v-30ab4535`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/SuccessModal.vue`]]);k();var Z=R({visible:!1,text:B(`@F2A3A:加载中...`),showProgress:!1,progress:0});function he(){return{loadingState:Z,show:e=>{Z.visible=!0,Z.text=e?.text||B(`@F2A3A:加载中...`),Z.showProgress=e?.showProgress||!1,Z.progress=e?.progress||0},hide:()=>{Z.visible=!1},updateProgress:e=>{Z.progress=Math.max(0,Math.min(100,e))},updateText:e=>{Z.text=e},setText:e=>{Z.visible&&(Z.text=e)}}}k();var Q=R({visible:!1,text:B(`@B8591:操作成功!`),description:``});function ge(){let e=e=>{Q.visible=!0,Q.text=e?.text||B(`@B8591:操作成功!`),Q.description=e?.description||``;let n=e?.duration||2e3;setTimeout(()=>{t()},n)},t=()=>{Q.visible=!1};return{successState:Q,show:e,hide:t}}g();var _e=u({__name:`QuickCommitButton`,props:{from:{type:String,required:!1,default:`form`},hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1}},emits:[`beforeCommit`,`afterCommit`,`clearFields`],setup(e,{expose:t,emit:n}){let i=W(),a=U(),o=e,s=n,c=r(()=>i.fileList.some(e=>!G(e.path,a.lockedFiles))),l=r(()=>i.isSelectionMode&&i.selectedFiles.size>0&&i.selectedUnstagedPaths.length>0),u=r(()=>i.hasConflictedFiles?!0:i.isSelectionMode?!l.value||!o.hasUserCommitMessage:!c.value||!o.hasUserCommitMessage),d=r(()=>i.isAddingFiles||i.isCommiting),f=r(()=>i.hasConflictedFiles?B(`@2E184:存在冲突文件,请先解决冲突`):i.isSelectionMode?i.selectedFiles.size===0?B(`@2E184:请先勾选要提交的文件`):i.selectedUnstagedPaths.length===0?B(`@2E184:所选文件无需暂存或被锁定`):o.hasUserCommitMessage?B(`@2E184:一键完成:仅暂存所选文件 → 提交`):B(`@2E184:请输入提交信息`):c.value?o.hasUserCommitMessage?B(`@2E184:一键完成:暂存所有更改 → 提交`):B(`@2E184:请输入提交信息`):B(`@2E184:没有需要提交的更改`)),p=r(()=>i.isSelectionMode&&l.value?B(`@2E184:一键提交所选`):B(`@2E184:一键提交`)),m=r(()=>o.from===`form`?i.isSelectionMode&&l.value?B(`@2E184:暂存所选 + 提交`):B(`@2E184:暂存 + 提交`):``);async function h(){s(`beforeCommit`);try{let e=await i.stageSelectedAndCommit(o.finalCommitMessage,o.skipHooks);e&&s(`clearFields`),s(`afterCommit`,e)}catch(e){console.error(`一键提交失败:`,e),s(`afterCommit`,!1)}}t({triggerQuickCommit:h});let g={gitStore:i,configStore:a,props:o,emit:s,hasAnyChanges:c,hasSelectedToStage:l,isDisabled:u,isLoading:d,tooltipText:f,buttonTitle:p,buttonDesc:m,handleQuickCommit:h,get ElTooltip(){return _},get Edit(){return w}};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}});g(),c();var ve={class:`one-commit-content`},ye={class:`one-commit-text`},be={class:`one-commit-title`},xe={key:0,class:`one-commit-desc`};function Se(t,r,i,o,s,c){let u=l,d=z;return f(),e(`div`,null,[a(o.ElTooltip,{content:o.tooltipText,placement:`top`,"show-after":200},{default:O(()=>[a(d,{type:`primary`,onClick:o.handleQuickCommit,loading:o.isLoading,disabled:o.isDisabled,class:b([i.from,`one-commit-button`])},{default:O(()=>[n(`div`,ve,[a(u,{class:`one-commit-icon`},{default:O(()=>[a(o.Edit)]),_:1}),n(`div`,ye,[n(`span`,be,M(o.buttonTitle),1),i.from===`form`?(f(),e(`span`,xe,M(o.buttonDesc),1)):E(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}var Ce=V(_e,[[`render`,Se],[`__scopeId`,`data-v-0c962829`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/buttons/QuickCommitButton.vue`]]);g();var we=u({__name:`AiQuickPushButton`,props:{from:{type:String,required:!1,default:`form`},generating:{type:Boolean,required:!1,default:!1}},emits:[`trigger`],setup(e,{expose:t,emit:n}){t();let i=W(),a=U(),o=e,s=n,c=r(()=>i.fileList.some(e=>!G(e.path,a.lockedFiles))),l=r(()=>i.isSelectionMode&&i.selectedFiles.size>0&&i.selectedUnstagedPaths.length>0),u=r(()=>!i.isSelectionMode&&!c.value&&i.branchAhead>0),d=r(()=>i.hasConflictedFiles||!i.hasUpstream?!0:i.isSelectionMode?!l.value:!c.value&&i.branchAhead===0),f=r(()=>o.generating||i.isAddingFiles||i.isCommiting||i.isPushing),p=r(()=>i.hasConflictedFiles?B(`@2E184:存在冲突文件,请先解决冲突`):i.hasUpstream?o.generating?B(`@2E184:AI 正在生成提交信息…`):i.isSelectionMode?l.value?B(`@2E184:一键完成:AI 生成提交信息 → 仅暂存所选文件 → 提交 → 推送`):B(`@2E184:请先勾选要推送的文件`):!c.value&&i.branchAhead===0?B(`@2E184:没有需要提交或推送的更改`):c.value?B(`@2E184:一键完成:AI 生成提交信息 → 暂存所有更改 → 提交 → 推送`):B(`@2E184:本地已提交,AI 将直接推送到远程仓库`):B(`@2E184:当前分支没有上游分支`)),m=r(()=>o.generating?B(`@2E184:AI 正在生成提交信息…`):i.isSelectionMode&&l.value?B(`@2E184:AI 提交并推送所选`):B(`@2E184:AI 提交并推送`)),h=r(()=>o.from!==`form`||o.generating?``:u.value?B(`@2E184:本地已提交,直接推送`):B(`@2E184:AI 生成信息 + 推送`));function g(){d.value||f.value||s(`trigger`)}let v={gitStore:i,configStore:a,props:o,emit:s,hasAnyChanges:c,hasSelectedToStage:l,isPushOnly:u,isDisabled:d,isLoading:f,tooltipText:p,buttonTitle:m,buttonDesc:h,handleClick:g,get ElTooltip(){return _},SvgIcon:H};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}});g(),c();var $={class:`one-ai-push`},Te={class:`one-ai-push-content`},Ee={class:`one-ai-push-text`},De={class:`one-ai-push-title`},Oe={key:0,class:`one-ai-push-desc`};function ke(t,r,i,o,s,c){let l=z;return f(),e(`div`,$,[a(o.ElTooltip,{content:o.tooltipText,placement:`top`,"show-after":200},{default:O(()=>[a(l,{type:`primary`,onClick:o.handleClick,loading:o.isLoading,disabled:o.isDisabled,class:b([i.from,`one-ai-push-button`])},{default:O(()=>[n(`div`,Te,[a(o.SvgIcon,{class:`one-ai-push-icon`,"icon-class":`ai-commit`,style:{color:`#fff`}}),n(`div`,Ee,[n(`span`,De,M(o.buttonTitle),1),i.from===`form`?(f(),e(`span`,Oe,M(o.buttonDesc),1)):E(`v-if`,!0)])])]),_:1},8,[`loading`,`disabled`,`class`])]),_:1},8,[`content`])])}var Ae=V(we,[[`render`,ke],[`__scopeId`,`data-v-0a8120f6`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/buttons/AiQuickPushButton.vue`]]);g(),k();var je=u({__name:`GitActionButtons`,props:{hasUserCommitMessage:{type:Boolean,required:!1,default:!1},finalCommitMessage:{type:String,required:!1,default:``},skipHooks:{type:Boolean,required:!1,default:!1},from:{type:String,required:!1,default:`form`},aiGenerating:{type:Boolean,required:!1,default:!1}},emits:[`afterCommit`,`afterPush`,`beforePush`,`pushStart`,`clearFields`,`aiQuickPush`],setup(e,{expose:t,emit:n}){let r=n,i=I(null);function a(e){r(`afterCommit`,e)}function o(e){r(`afterPush`,e)}function s(){r(`beforePush`)}function c(){r(`pushStart`)}function l(){r(`clearFields`)}function u(){r(`aiQuickPush`)}async function d(){return i.value?.triggerQuickPush()}t({triggerQuickPush:d});let f={emit:r,quickPushRef:i,handleAfterCommit:a,handleAfterPush:o,handleBeforePush:s,handlePushStart:c,handleClearFields:l,handleAiQuickPush:u,triggerQuickPush:d,StageButton:q,CommitButton:ae,PushButton:re,QuickPushButton:K,QuickCommitButton:Ce,AiQuickPushButton:Ae};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}});g();var Me={class:`form-bottom-actions`},Ne={class:`actions-flex-container`},Pe={class:`left-actions`},Fe={class:`button-grid`},Ie={class:`right-actions`};function Le(t,r,i,o,s,c){return f(),e(`div`,Me,[n(`div`,Ne,[n(`div`,Pe,[n(`div`,Fe,[a(o.StageButton,{onClick:()=>{},from:i.from},null,8,[`from`]),a(o.CommitButton,{"has-user-commit-message":i.hasUserCommitMessage,"final-commit-message":i.finalCommitMessage,"skip-hooks":i.skipHooks,onBeforeCommit:()=>{},onAfterCommit:o.handleAfterCommit,onClick:()=>{},from:i.from},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`,`from`]),a(o.PushButton,{onBeforePush:()=>{},onAfterPush:o.handleAfterPush,onClick:()=>{},from:i.from},null,8,[`from`])])]),n(`div`,Ie,[a(o.QuickCommitButton,{from:i.from,"has-user-commit-message":i.hasUserCommitMessage,"final-commit-message":i.finalCommitMessage,"skip-hooks":i.skipHooks,onAfterCommit:o.handleAfterCommit,onClearFields:o.handleClearFields},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),a(o.QuickPushButton,{ref:`quickPushRef`,from:i.from,"has-user-commit-message":i.hasUserCommitMessage,"final-commit-message":i.finalCommitMessage,"skip-hooks":i.skipHooks,onBeforePush:o.handleBeforePush,onPushStart:o.handlePushStart,onAfterPush:o.handleAfterPush,onClearFields:o.handleClearFields},null,8,[`from`,`has-user-commit-message`,`final-commit-message`,`skip-hooks`]),a(o.AiQuickPushButton,{from:i.from,generating:i.aiGenerating,onTrigger:o.handleAiQuickPush},null,8,[`from`,`generating`])])])])}var Re=V(je,[[`render`,Le],[`__scopeId`,`data-v-12b4dc63`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/GitActionButtons.vue`]]);g(),k();var ze=u({__name:`CommitForm`,setup(e,{expose:n}){n();let i=I(!1),a=I(!1);async function s(){let e=u.isSelectionMode&&u.selectedFiles.size>0?[...u.selectedFiles]:[],t=ee(),n=await(await fetch(`/api/config/generate-commit-message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({selectedPaths:e,locale:t.currentLocale})})).json();if(!n.success){let e=n.code,t=n.error||B(`@76872:AI生成失败`),r=e?{TIMEOUT:`@76872:AI生成超时,请重试或检查模型响应速度`,NO_MODEL:`@76872:未配置AI模型,请先在通用设置中添加模型`,NO_JSON:`@76872:AI未返回有效结果,请重试`,PARSE_FAILED:`@76872:AI返回格式无法解析,请重试`,GENERATE_FAILED:`@76872:AI生成失败`,HTTP_ERR:`@76872:AI生成失败`}[e]:null;return T.error(r?B(r):t),!1}let r=[`feat`,`fix`,`docs`,`style`,`refactor`,`test`,`chore`];if(S.value)n.type&&r.includes(n.type)&&(C.value=n.type),n.scope!==void 0&&(w.value=n.scope),n.description&&(E.value=n.description);else{let e=n.type&&n.description?n.scope?`${n.type}(${n.scope}): ${n.description}`:`${n.type}: ${n.description}`:n.description||``;e&&(f.value=e)}return!0}async function c(){if(!i.value){i.value=!0;try{if(!await s())return;T.success(B(`@76872:AI已生成提交信息`))}catch(e){T.error(`${B(`@76872:AI生成失败`)}: ${e.message}`)}finally{i.value=!1}}}async function l(){if(!a.value){a.value=!0;try{let e=u.isSelectionMode&&u.selectedFiles.size>0,t=u.fileList.some(e=>!G(e.path,d.lockedFiles));if(e||t){if(!await s())return;if(await o(),!q.value){T.error(B(`@76872:AI生成失败`));return}}await R.value?.triggerQuickPush?.()}catch(e){console.error(`AI 提交并推送失败:`,e),T.error(`${B(`@76872:AI生成失败`)}: ${e.message}`)}finally{a.value=!1}}}let u=W(),d=U(),f=I(``),{loadingState:p,show:m,hide:h,setText:g}=he(),{successState:_}=ge(),b=I(!1),x=I(``),S=r({get:()=>d.isStandardCommit,set:e=>{d.isStandardCommit=e}}),C=I(`feat`),w=I(``),E=I(``),D=I(``),O=I(``),k=I([]),A=I(!1),M=I([]),N=I(!1),P=I(!1),F=r({get:()=>d.skipHooks,set:e=>{d.skipHooks=e}}),L=r({get:()=>d.autoQuickPushOnEnter,set:e=>{d.autoQuickPushOnEnter=e}}),R=I(null),z=I(!1),V=r(()=>[{value:`feat`,label:`feat: ${B(`@76872:新功能`)}`},{value:`fix`,label:`fix: ${B(`@76872:修复bug`)}`},{value:`docs`,label:`docs: ${B(`@76872:文档修改`)}`},{value:`style`,label:`style: ${B(`@76872:样式修改`)}`},{value:`refactor`,label:`refactor: ${B(`@76872:代码重构`)}`},{value:`test`,label:`test: ${B(`@76872:测试代码`)}`},{value:`chore`,label:`chore: ${B(`@76872:构建/工具修改`)}`}]),H=I([]),K=r(()=>{if(!S.value)return f.value||x.value;let e=`${C.value||``}`;return w.value&&(e+=`(${w.value})`),e+=`: ${E.value}`,D.value&&(e+=`\n\n${D.value}`),O.value&&(e+=`\n\n${O.value}`),e}),q=r(()=>S.value?(u.isMergeInProgress||(C.value||``).trim()!==``)&&(E.value||``).trim()!==``:f.value.trim()!==``),re=r(()=>u.hasConflictedFiles?!0:u.isMergeInProgress?!q.value:!u.fileList.some(e=>!G(e.path,d.lockedFiles))||!q.value),ae=r(()=>{let e=`${B(`@76872:输入提交信息 (默认: `)}${x.value})`;return L.value?`${e}${B(`@76872:(按回车一键推送)`)}`:e}),oe=r(()=>{let e=B(`@76872:简短描述(必填)`);return L.value?B(`@76872:简短描述(必填,按回车一键推送)`):e}),se=r(()=>{let e=`git commit -m "${K.value}"`;return F.value&&(e+=` --no-verify`),e});function J(){let e=d.config;e&&(x.value=e.defaultCommitMessage||``,e.descriptionTemplates&&Array.isArray(e.descriptionTemplates)&&(k.value=e.descriptionTemplates),e.scopeTemplates&&Array.isArray(e.scopeTemplates)&&(M.value=e.scopeTemplates),e.messageTemplates&&Array.isArray(e.messageTemplates)&&(H.value=e.messageTemplates))}function ce(e){E.value=e,A.value=!1}function le(e){w.value=e,N.value=!1}function Y(){A.value=!0}function X(){N.value=!0}function de(){f.value=``,E.value=``,D.value=``,O.value=``,C.value=`feat`,d.autoSetDefaultMessage&&d.defaultCommitMessage&&(S.value?E.value=d.defaultCommitMessage:f.value=d.defaultCommitMessage)}function fe(){m({text:B(`@76872:正在暂存文件…`),showProgress:!1})}function pe(){h()}function Z(e){if(h(),e){b.value=!0;try{setTimeout(async()=>{try{console.log(B(`@76872:推送成功,状态已更新`))}catch(e){console.error(`一键推送后处理失败:`,e)}finally{b.value=!1}},1e3)}catch(e){console.error(`一键推送后处理失败:`,e),b.value=!1}}}function Q(e){f.value=e,P.value=!1}async function _e(e){if(!L.value||!q.value)return;let t=u.fileList.some(e=>!G(e.path,d.lockedFiles)),n=u.hasConflictedFiles;if(t&&q.value&&u.hasUpstream&&!n&&e.key===`Enter`&&!e.shiftKey){e.preventDefault();try{await R.value?.triggerQuickPush()}catch(e){console.error(`回车自动一键提交失败:`,e)}}}async function ve(e){try{await d.saveDefaultMessage(e)&&T.success(B(`@76872:默认提交信息设置成功`))}catch(e){T.error(`${B(`@76872:设置默认提交信息失败: `)}${e.message}`)}}j(()=>u.pendingMergeMessage,e=>{e&&(S.value?(C.value=``,E.value=e):f.value=e,u.pendingMergeMessage=``,T.info(B(`@76872:已自动填充合并提交信息`)))}),j(()=>u.isAddingFiles,e=>{e&&p.visible&&g(B(`@76872:正在暂存文件…`))}),j(()=>u.isCommiting,e=>{e&&p.visible&&g(B(`@76872:正在提交更改...`))}),j(()=>u.isPushing,e=>{e&&p.visible&&h()}),v(async()=>{j(()=>d.config,J,{immediate:!0}),d.config||await d.loadConfig(),d.autoSetDefaultMessage&&d.defaultCommitMessage&&(S.value?E.value||=d.defaultCommitMessage:f.value||=d.defaultCommitMessage),u.pendingMergeMessage&&(S.value?(C.value=``,E.value=u.pendingMergeMessage):f.value=u.pendingMergeMessage,u.pendingMergeMessage=``,T.info(B(`@76872:已自动填充合并提交信息`)))});function ye(e,t){t([...e?k.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):k.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function be(e,t){t([...e?M.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):M.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function xe(e){e.isSettings?(Y(),E.value=``):E.value=e.value}function Se(e){e.isSettings?(X(),w.value=``):w.value=e.value}function Ce(e,t){t([...e?H.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())).map(e=>({value:e})):H.value.map(e=>({value:e})),{value:`⚙️ 管理模板…`,isSettings:!0}])}function we(e){e.isSettings?(P.value=!0,f.value=``):f.value=e.value}let $={aiGenerating:i,aiQuickPushing:a,requestAiCommitMessage:s,handleAiGenerateCommit:c,handleAiQuickPush:l,gitStore:u,configStore:d,commitMessage:f,loadingState:p,showLoading:m,hideLoading:h,setLoadingText:g,successState:_,isUpdatingStatus:b,defaultCommitMessage:x,isStandardCommit:S,commitType:C,commitScope:w,commitDescription:E,commitBody:D,commitFooter:O,descriptionTemplates:k,descriptionDialogVisible:A,scopeTemplates:M,scopeDialogVisible:N,defaultMessageDialogVisible:P,skipHooks:F,autoQuickPushOnEnter:L,gitActionButtonsRef:R,showAdvancedFields:z,commitTypeOptions:V,messageTemplates:H,finalCommitMessage:K,hasUserCommitMessage:q,isCommitDisabled:re,commitMessagePlaceholder:ae,descriptionPlaceholder:oe,gitCommandPreview:se,updateFromConfig:J,useTemplate:ce,useScopeTemplate:le,openDescriptionSettings:Y,openScopeSettings:X,clearCommitFields:de,handleQuickPushBefore:fe,handlePushStart:pe,handleQuickPushAfter:Z,useMessageTemplate:Q,handleEnterKey:_e,setDefaultFromTemplate:ve,queryDescriptionTemplates:ye,queryScopeTemplates:be,handleDescriptionSelect:xe,handleScopeSelect:Se,queryMessageTemplates:Ce,handleMessageSelect:we,get $t(){return B},get Loading(){return t},get ArrowDown(){return y},GlobalLoading:ue,SuccessModal:me,TemplateManager:ie,GitCommandPreview:ne,GitActionButtons:Re,IconButton:te};return Object.defineProperty($,"__isScriptSetup",{enumerable:!1,value:!0}),$}});g(),c(),S();var Be={class:`card-header app-card-header`},Ve={class:`header-left`},He={class:`card-content app-card-content`},Ue={class:`layout-container`},We={key:0,class:`git-config-warning`},Ge={key:0,class:`merge-in-progress-banner`},Ke={class:`commit-section`},qe={key:0,class:`commit-form`},Je={class:`description-container`},Ye={class:`standard-commit-form`},Xe={class:`standard-commit-header`},Ze={class:`type-scope-container`},Qe={class:`scope-wrapper`},$e={class:`description-container description-inline`},et=[`aria-expanded`],tt={class:`advanced-fields`},nt={key:0,class:`status-updating-indicator`},rt={key:0,class:`status-updating-indicator`};function it(t,r,o,c,u,g){let _=A,v=h,y=l,x=i,S=s,w=m;return f(),e(p,null,[n(`div`,{class:b([`card app-card`,{"is-pushing":c.gitStore.isPushing}])},[n(`div`,Be,[n(`div`,Ve,[c.gitStore.userName!==``&&c.gitStore.userEmail!==``?(f(),d(c.GitActionButtons,{key:0,ref:`gitActionButtonsRef`,"has-user-commit-message":c.hasUserCommitMessage,"final-commit-message":c.finalCommitMessage,"skip-hooks":c.skipHooks,"ai-generating":c.aiQuickPushing,onAfterCommit:r[0]||=e=>{e&&c.clearCommitFields()},onAfterPush:c.handleQuickPushAfter,onBeforePush:c.handleQuickPushBefore,onPushStart:c.handlePushStart,onClearFields:c.clearCommitFields,onAiQuickPush:c.handleAiQuickPush},null,8,[`has-user-commit-message`,`final-commit-message`,`skip-hooks`,`ai-generating`])):E(`v-if`,!0)]),E(` 「命令历史」与「Git 操作」2026-10-06 搬到顶栏(App.vue):这个面板在
2
- "无事可做"时会整块收起,那两个入口必须常驻 —— 否则工作区干净时
3
- 连 pull / fetch / merge 都点不到。
4
- 2026-10-06:✨「AI 生成提交信息」也从这条工具条搬进了输入框那一行
5
- (见下面 type-scope-container / description-container 末尾)——
6
- 它生成的就是这个输入框的内容,放在输入框里语义更直接,也省掉一条
7
- 只放一个图标的空工具条。 `)]),n(`div`,He,[n(`div`,Ue,[E(` 如果没有配置Git用户信息,显示提示 `),c.gitStore.userName===``||c.gitStore.userEmail===``?(f(),e(`div`,We,[a(_,{title:c.$t(`@76872:Git用户信息未配置`),type:`warning`,closable:!1,"show-icon":``},{default:O(()=>[n(`p`,null,M(c.$t(`@76872:您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:`)),1),r[11]||=n(`pre`,{class:`config-command`},`git config --global user.name "Your Name"
8
- git config --global user.email "your.email@example.com"`,-1)]),_:1},8,[`title`])])):(f(),e(p,{key:1},[E(` 正常的提交区域,仅在Git用户信息已配置时显示 `),E(` MERGING 状态提示 `),c.gitStore.isMergeInProgress?(f(),e(`div`,Ge,[a(_,{title:c.$t(`@76872:合并进行中`),type:`warning`,closable:!1,"show-icon":``},{default:O(()=>[n(`span`,null,M(c.$t(`@76872:分支合并尚未完成,请输入提交信息后点击「提交」按钮完成合并。`)),1)]),_:1},8,[`title`])])):E(`v-if`,!0),E(` 左侧:提交表单 `),n(`div`,Ke,[E(` 普通提交表单 `),c.isStandardCommit?(f(),e(p,{key:1},[E(` 标准化提交表单 `),n(`div`,Ye,[n(`div`,Xe,[n(`div`,Ze,[a(S,{modelValue:c.commitType,"onUpdate:modelValue":r[2]||=e=>c.commitType=e,placeholder:c.$t(`@76872:提交类型`),class:`type-select`,clearable:``},{default:O(()=>[(f(!0),e(p,null,C(c.commitTypeOptions,e=>(f(),d(x,{key:e.value,label:e.label,value:e.value},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`]),n(`div`,Qe,[a(v,{modelValue:c.commitScope,"onUpdate:modelValue":r[3]||=e=>c.commitScope=e,"fetch-suggestions":c.queryScopeTemplates,placeholder:c.$t(`@76872:作用域(可选)`),class:`scope-input`,clearable:``,onSelect:c.handleScopeSelect},null,8,[`modelValue`,`placeholder`])]),E(` 将简短描述放入同一行 `),n(`div`,$e,[a(v,{modelValue:c.commitDescription,"onUpdate:modelValue":r[4]||=e=>c.commitDescription=e,"fetch-suggestions":c.queryDescriptionTemplates,placeholder:c.descriptionPlaceholder,class:`description-input`,clearable:``,onSelect:c.handleDescriptionSelect,onKeydown:c.handleEnterKey},{suffix:O(()=>[a(c.IconButton,{"custom-class":`ai-suffix-btn`,tooltip:c.$t(`@76872:AI生成提交信息`),"icon-class":c.aiGenerating?``:`ai-commit`,size:`small`,disabled:c.aiGenerating,onClick:c.handleAiGenerateCommit},{default:O(()=>[c.aiGenerating?(f(),d(y,{key:0,class:`is-loading`},{default:O(()=>[a(c.Loading)]),_:1})):E(`v-if`,!0)]),_:1},8,[`tooltip`,`icon-class`,`disabled`])]),_:1},8,[`modelValue`,`placeholder`])])])]),E(` 添加展开/收起高级选项的控制按钮 `),n(`button`,{type:`button`,class:`advanced-options-toggle`,"aria-expanded":c.showAdvancedFields,onClick:r[5]||=e=>c.showAdvancedFields=!c.showAdvancedFields},[n(`span`,null,M(c.showAdvancedFields?c.$t(`@76872:收起`):c.$t(`@76872:正文及页脚`)),1),a(y,{class:b([`toggle-icon`,{"is-active":c.showAdvancedFields}])},{default:O(()=>[a(c.ArrowDown)]),_:1},8,[`class`])],8,et),E(` 使用过渡效果包装高级字段 `),N(n(`div`,tt,[a(w,{modelValue:c.commitBody,"onUpdate:modelValue":r[6]||=e=>c.commitBody=e,type:`textarea`,rows:4,placeholder:c.$t(`@76872:正文(可选):详细描述本次提交的内容和原因`),class:`body-input`,clearable:``},null,8,[`modelValue`,`placeholder`]),a(w,{modelValue:c.commitFooter,"onUpdate:modelValue":r[7]||=e=>c.commitFooter=e,placeholder:c.$t(`@76872:页脚(可选):如 Closes #123`),class:`footer-input`,clearable:``},null,8,[`modelValue`,`placeholder`])],512),[[L,c.showAdvancedFields]])])],2112)):(f(),e(`div`,qe,[n(`div`,Je,[a(v,{modelValue:c.commitMessage,"onUpdate:modelValue":r[1]||=e=>c.commitMessage=e,"fetch-suggestions":c.queryMessageTemplates,placeholder:c.commitMessagePlaceholder,type:`textarea`,rows:3,resize:`none`,class:`commit-message-input`,onSelect:c.handleMessageSelect,onKeydown:c.handleEnterKey},null,8,[`modelValue`,`placeholder`]),E(` 普通模式(3 行 textarea)**不能**像标准模式那样走 suffix 插槽:
9
- EP 的 el-input 在 type="textarea" 时切到 el-textarea 分支,
10
- suffix 插槽被 v-if 短路,整个 .el-input__suffix 容器根本不渲染
11
- (实测 dump 出来只有 textarea 元素 + 两个 v-if 注释)。
12
- 所以这里回到绝对定位:贴框内右上角,靠 padding-right 让开。
13
- 类名刻意区分(ai-suffix-btn--ta),别和标准模式共用 ——
14
- 两者的定位机制完全不同,共用一套样式会在其中一个上失效。 `),a(c.IconButton,{"custom-class":`ai-suffix-btn ai-suffix-btn--ta`,tooltip:c.$t(`@76872:AI生成提交信息`),"icon-class":c.aiGenerating?``:`ai-commit`,size:`small`,disabled:c.aiGenerating,onClick:c.handleAiGenerateCommit},{default:O(()=>[c.aiGenerating?(f(),d(y,{key:0,class:`is-loading`},{default:O(()=>[a(c.Loading)]),_:1})):E(`v-if`,!0)]),_:1},8,[`tooltip`,`icon-class`,`disabled`])])])),c.isCommitDisabled?E(`v-if`,!0):(f(),d(c.GitCommandPreview,{key:2,command:c.gitCommandPreview,title:c.$t(`@76872:提交命令预览:`),placeholder:`git commit -m "<提交信息>"`},null,8,[`command`,`title`]))])],64))])])],2),E(` 简短描述模板设置 `),a(c.TemplateManager,{visible:c.descriptionDialogVisible,"onUpdate:visible":r[8]||=e=>c.descriptionDialogVisible=e,type:`description`,title:c.$t(`@76872:简短描述模板设置`),placeholder:c.$t(`@76872:输入新模板内容`),"edit-placeholder":c.$t(`@76872:编辑模板内容`),"empty-description":c.$t(`@76872:暂无保存的模板`),onUseTemplate:c.useTemplate},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),E(` 作用域设置弹窗 `),a(c.TemplateManager,{visible:c.scopeDialogVisible,"onUpdate:visible":r[9]||=e=>c.scopeDialogVisible=e,type:`scope`,title:c.$t(`@76872:作用域模板设置`),placeholder:c.$t(`@76872:输入新作用域模板`),"edit-placeholder":c.$t(`@76872:编辑作用域模板内容`),"empty-description":c.$t(`@76872:暂无保存的作用域`),onUseTemplate:c.useScopeTemplate},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),E(` 默认提交信息设置弹窗 `),a(c.TemplateManager,{visible:c.defaultMessageDialogVisible,"onUpdate:visible":r[10]||=e=>c.defaultMessageDialogVisible=e,type:`message`,title:c.$t(`@76872:默认提交信息设置`),placeholder:c.$t(`@76872:输入新模板内容`),"edit-placeholder":c.$t(`@76872:编辑模板内容`),"empty-description":c.$t(`@76872:暂无保存的模板`),"show-default-section":!0,"show-help-text":!0,onUseTemplate:c.useMessageTemplate,onSetDefault:c.setDefaultFromTemplate},null,8,[`visible`,`title`,`placeholder`,`edit-placeholder`,`empty-description`]),E(` 状态更新指示器 `),a(D,{name:`el-fade-in-linear`},{default:O(()=>[c.isUpdatingStatus?(f(),e(`div`,nt,[a(y,{class:`is-loading`},{default:O(()=>[a(c.Loading)]),_:1}),n(`span`,null,M(c.$t(`@76872:更新状态中...`)),1)])):E(`v-if`,!0)]),_:1}),E(` 全局Loading组件 `),a(c.GlobalLoading,{visible:c.loadingState.visible,text:c.loadingState.text,"show-progress":c.loadingState.showProgress,progress:c.loadingState.progress},null,8,[`visible`,`text`,`show-progress`,`progress`]),E(` 成功提示组件 `),a(c.SuccessModal,{visible:c.successState.visible,text:c.successState.text,description:c.successState.description},null,8,[`visible`,`text`,`description`]),E(` 状态更新指示器 `),a(D,{name:`el-fade-in-linear`},{default:O(()=>[c.isUpdatingStatus?(f(),e(`div`,rt,[a(y,{class:`is-loading`},{default:O(()=>[a(c.Loading)]),_:1}),n(`span`,null,M(c.$t(`@76872:更新状态中...`)),1)])):E(`v-if`,!0)]),_:1})],64)}var at=V(ze,[[`render`,it],[`__scopeId`,`data-v-1ba78eef`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/CommitForm.vue`]]);export{at as default};
@@ -1 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{Dn as e,E as t,En as n,Fn as r,Gn as i,Ir as a,Ln as o,Mn as s,On as c,Pn as l,Qn as u,Vn as d,Yr as f,Zr as p,ar as m,kn as h,lr as g,ti as _,tr as v,z as y}from"./element-plus-CDrtgG55.js";import{n as b,t as x}from"./_plugin-vue_export-helper-BY0jlMBE.js";d();var S=o({__name:`CommonDialog`,props:{modelValue:{type:Boolean,required:!0},title:{type:String,required:!0},size:{type:String,required:!1,default:`medium`},type:{type:String,required:!1,default:`default`},width:{type:String,required:!1},height:{type:String,required:!1},top:{type:String,required:!1,default:`50px`},closeOnClickModal:{type:Boolean,required:!1,default:!1},closeOnPressEscape:{type:Boolean,required:!1,default:!0},destroyOnClose:{type:Boolean,required:!1,default:!1},draggable:{type:Boolean,required:!1,default:!1},customClass:{type:String,required:!1},modalClass:{type:String,required:!1},appendToBody:{type:Boolean,required:!1,default:!0},lockScroll:{type:Boolean,required:!1,default:!0},zIndex:{type:Number,required:!1},showClose:{type:Boolean,required:!1,default:!0},heightMode:{type:String,required:!1,default:`max`},heightOffset:{type:String,required:!1,default:`100px`},showFooter:{type:Boolean,required:!1,default:!1},confirmText:{type:String,required:!1,default:b(`@803A9:确定`)},cancelText:{type:String,required:!1,default:b(`@803A9:取消`)},showCancel:{type:Boolean,required:!1,default:!0},confirmLoading:{type:Boolean,required:!1,default:!1}},emits:[`update:modelValue`,`confirm`,`cancel`,`close`,`opened`,`closed`],setup(e,{expose:r,emit:a}){r();let o=e,s=a,c=n(()=>{if(o.width)return o.width;switch(o.size){case`small`:return`30%`;case`medium`:return`50%`;case`large`:return`80%`;case`extra-large`:return`90%`;case`fullscreen`:return`100vw`;default:return`50%`}}),l=m(),u=null;function d(){s(`opened`),i(()=>{let e=document.querySelector(`.el-dialog__wrapper:not([style*="display: none"]) .el-dialog`);e&&(e.querySelector(`button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])`)||e).focus?.()})}function f(){s(`closed`),u&&typeof u.focus==`function`&&(i(()=>u?.focus()),u=null)}function p(e){e&&!o.modelValue&&(u=document.activeElement),s(`update:modelValue`,e)}let h=n(()=>o.size===`fullscreen`?`0`:o.top),g=n(()=>{let e=[];return o.customClass&&e.push(o.customClass),o.type===`flex`&&e.push(`common-dialog--flex`),o.type===`full-height`&&e.push(`common-dialog--full-height`),o.size===`fullscreen`&&e.push(`common-dialog--fullscreen`),e.join(` `)}),_=n(()=>{if(o.size===`fullscreen`)return{height:`100vh`,maxHeight:`100vh`};let e=`calc(100% - ${o.heightOffset})`;return o.heightMode===`fixed`?{height:e}:{maxHeight:e}});function v(){s(`update:modelValue`,!1),s(`close`)}function y(){s(`confirm`)}function b(){s(`cancel`),v()}let x={props:o,emit:s,dialogWidth:c,titleId:l,get previouslyFocused(){return u},set previouslyFocused(e){u=e},handleOpened:d,handleClosed:f,handleUpdateModelValue:p,dialogTop:h,dialogClass:g,dialogStyle:_,handleClose:v,handleConfirm:y,handleCancel:b,get ElDialog(){return t}};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}});d(),a();var C=[`id`],w={class:`common-dialog__footer`};function T(t,n,i,a,o,d){let m=y;return u(),c(a.ElDialog,{"model-value":i.modelValue,title:i.title,width:a.dialogWidth,top:a.dialogTop,style:p(a.dialogStyle),"z-index":i.zIndex,fullscreen:i.size===`fullscreen`,"close-on-click-modal":i.closeOnClickModal,"close-on-press-escape":i.closeOnPressEscape,"destroy-on-close":i.destroyOnClose,draggable:i.draggable,class:f(a.dialogClass),"show-close":i.showClose,"modal-class":i.modalClass,"data-dialog-shell":`common`,"append-to-body":i.appendToBody,"lock-scroll":i.lockScroll,"aria-modal":!0,"aria-labelledby":a.titleId,role:`dialog`,onClose:a.handleClose,"onUpdate:modelValue":a.handleUpdateModelValue,onOpened:a.handleOpened,onClosed:a.handleClosed},s({header:g(({titleClass:t})=>[e(`span`,{id:a.titleId,class:f([`el-dialog__title`,t]),role:`heading`,"aria-level":`2`},_(i.title),11,C)]),default:g(()=>[v(t.$slots,`default`,{},void 0,!0)]),_:2},[i.showFooter||t.$slots.footer?{name:`footer`,fn:g(()=>[v(t.$slots,`footer`,{},()=>[e(`div`,w,[i.showCancel?(u(),c(m,{key:0,type:`button`,onClick:a.handleCancel},{default:g(()=>[l(_(i.cancelText),1)]),_:1})):h(`v-if`,!0),r(m,{type:`primary`,loading:i.confirmLoading,onClick:a.handleConfirm},{default:g(()=>[l(_(i.confirmText),1)]),_:1},8,[`loading`])])],!0)]),key:`0`}:void 0]),1032,[`model-value`,`title`,`width`,`top`,`style`,`z-index`,`fullscreen`,`close-on-click-modal`,`close-on-press-escape`,`destroy-on-close`,`draggable`,`class`,`show-close`,`modal-class`,`append-to-body`,`lock-scroll`,`aria-labelledby`])}var E=x(S,[[`render`,T],[`__scopeId`,`data-v-c5fee217`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/CommonDialog.vue`]]);export{E as t};
@@ -1,21 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,C as t,Dn as n,En as r,Fn as i,Gn as a,Ir as o,J as s,Jn as c,Ln as l,On as u,Pn as d,Qn as f,S as p,Sn as m,Vn as h,Xn as ee,Y as te,Yr as g,er as _,i as v,kn as y,lr as b,mr as x,ti as S,tt as ne,w as C,xr as w}from"./element-plus-CDrtgG55.js";import{n as T,t as E}from"./_plugin-vue_export-helper-BY0jlMBE.js";import{t as D}from"./SvgIcon-CP7WAT4C.js";import{c as O,l as k,s as re,t as ie}from"./configStore-EvRYufor.js";import{W as ae,h as oe,k as se}from"./index-CyEcaEC9.js";import{f as ce,h as A,m as j,n as M,p as N}from"./agentConversations-CC01a7SP.js";h(),x();function P(e,t=680){let n=w(0),i=null;function o(){let t=e.value;return t?(n.value=t.clientWidth,typeof ResizeObserver>`u`||(i=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(n.value=t)}),i.observe(t),!0)):!1}return ee(()=>{o()||a(()=>o())}),c(()=>{i?.disconnect(),i=null}),{width:n,narrow:r(()=>n.value>0&&n.value<t)}}x();var F=`agent.convListCollapsed.v1`;function I(){try{return localStorage.getItem(F)===`1`}catch{return!1}}var L=w(I());function R(){function e(e){L.value=e;try{localStorage.setItem(F,e?`1`:`0`)}catch{}}return{convListCollapsed:L,setConvListCollapsed:e}}h();function z(){let e=ie(),t=ae(),n=r({get:()=>e.resolvedTaskExecutor,set:t=>{O(t)&&e.setLastTaskExecutor(t)}}),i=r(()=>({claude:t.claudeAvailable,opencode:t.opencodeAvailable,codex:t.codexAvailable,codebuddy:t.codebuddyAvailable,pi:t.piAvailable})),a=r(()=>re.some(e=>i.value[e.id])),o=r(()=>i.value[n.value]?n.value:Object.keys(i.value).find(e=>i.value[e])??n.value);function s(e){i.value[e]&&(n.value=e)}function c(e){return t.executorModelText(e)}function l(e){return[c(e),t.executorModelDetail(e)].filter(Boolean).join(` · `)}return{selected:n,active:o,availability:i,hasAnyExecutor:a,choose:s,executorModelText:c,executorModelTitle:l}}h(),x();var B=l({__name:`AgentEngineSelector`,props:{engine:{type:String,required:!0},locked:{type:Boolean,required:!1}},emits:[`select`],setup(e,{expose:n,emit:i}){n();let a=e,o=i,{availability:c}=z(),l=r(()=>j(a.engine)),u=r(()=>({gai:!0,...c.value})),d=w(!1),f=w(null);function m(e){if(!a.locked){if(!u.value[e]){if(!A(e))return;f.value=e,d.value=!0;return}o(`select`,e)}}let h={props:a,emit:o,executorAvailability:c,engineName:l,engineAvailability:u,installDialogVisible:d,installTool:f,onCommand:m,get $t(){return T},get ElIcon(){return s},get ElDropdown(){return p},get ElDropdownMenu(){return C},get ElDropdownItem(){return t},get ArrowDown(){return te},get Check(){return ne},get AGENT_ENGINE_OPTIONS(){return ce},get BUILTIN_ENGINE_ICON(){return N},get isExternalAgentEngine(){return A},SvgIcon:D,TaskExecutorIcon:oe,ToolInstallDialog:se};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}});h(),o();var V={class:`agent-engine`},H=[`disabled`,`title`,`aria-label`],U={class:`agent-engine__name`},W={class:`agent-engine__item`},G={class:`agent-engine__item-name`},le={key:3,class:`agent-engine__item-missing`};function ue(t,r,a,o,s,c){return f(),e(m,null,[y(` 单根包一层:父级传下来的 class(Tab 行的 margin-left:auto、面板的 flex:none)
2
- 才能可靠落到这里 —— 多根组件会丢掉 fallthrough class。 `),n(`div`,V,[i(o.ElDropdown,{trigger:`click`,onCommand:o.onCommand},{dropdown:b(()=>[i(o.ElDropdownMenu,null,{default:b(()=>[(f(!0),e(m,null,_(o.AGENT_ENGINE_OPTIONS,t=>(f(),u(o.ElDropdownItem,{key:t.id,command:t.id},{default:b(()=>[n(`span`,W,[o.isExternalAgentEngine(t.id)?(f(),u(o.TaskExecutorIcon,{key:0,executor:t.id,class:`agent-engine__item-icon`},null,8,[`executor`])):(f(),u(o.SvgIcon,{key:1,"icon-class":o.BUILTIN_ENGINE_ICON,class:`agent-engine__item-icon`},null,8,[`icon-class`])),n(`span`,G,S(t.name),1),a.engine===t.id?(f(),u(o.ElIcon,{key:2,class:`agent-engine__item-check`},{default:b(()=>[i(o.Check)]),_:1})):o.engineAvailability[t.id]?y(`v-if`,!0):(f(),e(`span`,le,S(o.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`]))),128))]),_:1})]),default:b(()=>[n(`button`,{type:`button`,class:g([`agent-engine__btn`,{"is-locked":a.locked}]),disabled:a.locked,title:a.locked?o.$t(`@AGENT:本会话的引擎已锁定;要换引擎请新建会话`):o.$t(`@AGENT:新建会话使用的引擎`),"aria-label":o.$t(`@AGENT:智能体引擎`)},[o.isExternalAgentEngine(a.engine)?(f(),u(o.TaskExecutorIcon,{key:0,executor:a.engine,class:`agent-engine__icon`},null,8,[`executor`])):(f(),u(o.SvgIcon,{key:1,"icon-class":o.BUILTIN_ENGINE_ICON,class:`agent-engine__icon`},null,8,[`icon-class`])),n(`span`,U,S(o.engineName),1),i(o.ElIcon,{class:`agent-engine__caret`},{default:b(()=>[i(o.ArrowDown)]),_:1})],10,H)]),_:1}),i(o.ToolInstallDialog,{modelValue:o.installDialogVisible,"onUpdate:modelValue":r[0]||=e=>o.installDialogVisible=e,tool:o.installTool},null,8,[`modelValue`,`tool`])])],2112)}var de=E(B,[[`render`,ue],[`__scopeId`,`data-v-c67a4d14`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AgentEngineSelector.vue`]]),fe=8192;function pe(e,t){return e.length>t?`…(前文已截断)\n${e.slice(-t)}`:e}function me(e,t){let n=e||`done`;return n!==`pending`&&n!==`running`||t===`running`||t===`pending`?n:t===`cancelled`||t===`error`?`error`:`done`}function K(e){let t=e?.toolCalls;if(!Array.isArray(t)||t.length===0)return[];let n=e?.status||`done`,r=[];for(let e=0;e<t.length;e++){let i=t[e];if(!i||typeof i!=`object`)continue;let a=me(i.status,n),o=typeof i.result==`string`?i.result:``;r.push({id:typeof i.id==`string`&&i.id?i.id:`tool-${e}`,name:typeof i.name==`string`?i.name:``,argsPreview:typeof i.argsPreview==`string`?i.argsPreview:``,arguments:typeof i.arguments==`string`?i.arguments:``,result:o?pe(o,fe):``,status:a,error:typeof i.error==`string`&&i.error?i.error:void 0})}return r}var he=`
3
-
4
- ---
5
-
6
- `,ge=`[运行环境 ·`,_e=`## 跨会话记忆库`,ve=/\n\n---\n本任务包含 \d+ 个附件(请按文件路径读取[\s\S]*$/,ye=/\n\n续接 #\d+\s*$/;function q(e){let t=e.indexOf(he);return t===-1?0:t+7}function J(e){let t=typeof e==`string`?e:``;return t?(t.startsWith(ge)&&(t=t.slice(q(t))),t.startsWith(_e)&&(t=t.slice(q(t))),t=t.replace(ve,``).replace(ye,``),t.trim()):``}function Y(e){switch(e){case`todo`:return T(`@WORKBENCH:待执行`);case`running`:return T(`@WORKBENCH:执行中`);case`done`:return T(`@WORKBENCH:已完成`);case`error`:return T(`@WORKBENCH:出错`);case`cancelled`:return T(`@WORKBENCH:已取消`);case`pending`:return T(`@WORKBENCH:排队中`);default:return e}}function be(e){switch(e){case`running`:return`var(--color-primary)`;case`done`:return`#22c55e`;case`error`:return`#ef4444`;case`cancelled`:return`#9ca3af`;case`pending`:return`#f59e0b`;default:return`var(--text-tertiary)`}}function X(e){let t=e?new Date(e):new Date;if(Number.isNaN(t.getTime()))return``;let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}function xe(e,t=120){let n=e.replace(/\s+/g,` `).trim();return n.length>t?`${n.slice(0,t-1)}…`:n}function Se(e){let t=(e.match(/`+/g)||[]).reduce((e,t)=>Math.max(e,t.length),0),n="`".repeat(Math.max(3,t+1));return`${n}\n${e}\n${n}`}function Z(e,t){return`### ${e}\n\n${t.trim()}`}function Ce(e){let t=[];return e.forEach((e,n)=>{let r=e.name||T(`@WORKBENCH:工具`),i=xe(e.argsPreview||``);t.push(`${n+1}. **${r}**${i?` — \`${i}\``:``}`);let a=(e.status===`error`?e.error:e.result)||e.result||e.error||``;a.trim()&&t.push(``,Se(a.trim()))}),t.join(`
7
- `)}function we(e,t={},n={}){let r=Array.isArray(e)?e.filter(Boolean):[],i=n.scope===`brief`,a=[];if(r.forEach((e,t)=>{let n=[],r=J(e.prompt);if(r&&n.push(Z(T(`@WORKBENCH:用户提示词`),r)),!i){let t=(e.thinking||``).trim();t&&n.push(Z(T(`@WORKBENCH:Claude 思考`),t));let r=Ce(K(e));r&&n.push(Z(T(`@WORKBENCH:工具调用`),r))}let o=(e.output||``).trim();o&&n.push(Z(T(`@WORKBENCH:模型返回`),o));let s=(e.error||e.agentError||``).trim();if(s&&n.push(Z(T(`@WORKBENCH:出错`),s)),n.length===0)return;let c=[k(e.agent),Y(e.status),X(e.startedAt)].filter(Boolean);a.push(`## ${T(`@WORKBENCH:第 {n} 轮`,{n:t+1})}\n\n*${c.join(` · `)}*\n\n${n.join(`
8
-
9
- `)}`)}),a.length===0)return``;let o=[`# ${(t.title||``).trim()||T(`@WORKBENCH:未命名任务`)}`],s=(t.projectName||``).trim();return s&&o.push(``,`- ${T(`@WORKBENCH:项目:{name}`,{name:s})}`),o.push(`- ${T(`@WORKBENCH:导出时间:{time}`,{time:X((t.now||new Date).toISOString())})}`),`${o.join(`
10
- `)}\n\n---\n\n${a.join(`
11
-
12
- ---
13
-
14
- `)}\n`}function Te(e,t=120){let n=e.replace(/\s+/g,` `).trim();return n.length>t?`${n.slice(0,t-1)}…`:n}function Ee(e){let t=(e.match(/`+/g)||[]).reduce((e,t)=>Math.max(e,t.length),0),n="`".repeat(Math.max(3,t+1));return`${n}\n${e}\n${n}`}function Q(e,t){return`### ${e}\n\n${t.trim()}`}function De(e,t){return e===`user`?T(`@AGENT:我`):t}function Oe(e){if(!Array.isArray(e)||!e.length)return``;let t=[];return e.forEach((e,n)=>{let r=e.name||T(`@AGENT:工具`),i=Te(e.argsPreview||``);t.push(`${n+1}. **${r}**${i?` — \`${i}\``:``}`);let a=(e.status===`error`?e.error:e.result)||e.result||e.error||``;a.trim()&&t.push(``,Ee(a.trim()))}),t.join(`
15
- `)}function ke(e,t,n){if(e.role===`system`)return``;let r=[];if(t){let t=(e.reasoning||``).trim();t&&r.push(Q(T(`@AGENT:思考`),t));let n=Oe(e.toolCalls);n&&r.push(Q(T(`@AGENT:工具调用`),n))}let i=(e.content||``).trim();i&&r.push(i);let a=(e.attachments||[]).map(e=>e.name).filter(Boolean);a.length&&r.push(`${T(`@AGENT:附件`)}:${a.join(`、`)}`);let o=(e.error||``).trim();if(o&&r.push(`> ⚠️ ${o}`),r.length===0){if(e.role!==`assistant`)return``;r.push(`*${T(`@AGENT:本轮未输出正文`)}*`)}return`## ${De(e.role,n)}\n\n${r.join(`
16
-
17
- `)}`}function Ae(e,t={},n={}){let r=Array.isArray(e)?e.filter(Boolean):[],i=n.scope===`full`,a=(t.assistantName||``).trim()||`g ai`,o=[];for(let e of r){let t=ke(e,i,a);t&&o.push(t)}if(o.length===0)return``;let s=[`${T(`@AGENT:导出时间`)}:${X((t.now||new Date).toISOString())}`],c=(t.engine||``).trim();return c&&s.push(`${T(`@AGENT:引擎`)}:${c}`),s.push(T(`@AGENT:共 {n} 条消息`,{n:o.length})),`${`# ${(t.title||``).trim()||T(`@AGENT:无标题`)}\n\n- ${s.join(` · `)}`}\n\n---\n\n${o.join(`
18
-
19
- ---
20
-
21
- `)}\n`}h(),x();var $=l({__name:`CopySessionButton`,props:{messages:{type:Array,required:!0},title:{type:String,required:!1},engine:{type:String,required:!1}},setup(e,{expose:t}){t();let n=e,r=w(!1),i=null;c(()=>{i&&clearTimeout(i)});async function a(e){try{if(navigator?.clipboard?.writeText)return await navigator.clipboard.writeText(e),!0}catch{}try{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.opacity=`0`,t.style.left=`-9999px`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);return document.body.removeChild(t),n}catch{return!1}}async function o(e){let t=Ae(n.messages||[],{title:n.title,engine:n.engine,assistantName:M},{scope:e});if(!t){v.warning(T(`@AGENT:暂无会话内容可复制`));return}if(!await a(t)){v.error(T(`@AGENT:复制失败`));return}r.value=!0,v.success(T(`@AGENT:已复制会话`)),i&&clearTimeout(i),i=setTimeout(()=>{r.value=!1,i=null},1500)}function s(e){o(e===`full`?`full`:`brief`)}let l={props:n,flash:r,get timer(){return i},set timer(e){i=e},copyToClipboard:a,doCopy:o,onCommand:s,get $t(){return T}};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}});h(),o();var je={class:`csb`},Me=[`title`,`aria-label`],Ne={key:0,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},Pe={key:1,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`},Fe=[`title`,`aria-label`];function Ie(r,a,o,s,c,l){let u=t,m=C,h=p;return f(),e(`div`,je,[n(`button`,{type:`button`,class:g([`csb__btn`,{"is-flash":s.flash}]),title:s.$t(`@AGENT:复制本会话的对话内容(默认精简:仅对话正文)`),"aria-label":s.$t(`@AGENT:复制会话`),onClick:a[0]||=e=>s.doCopy(`brief`)},[s.flash?(f(),e(`svg`,Ne,[...a[1]||=[n(`polyline`,{points:`20 6 9 17 4 12`},null,-1)]])):(f(),e(`svg`,Pe,[...a[2]||=[n(`rect`,{x:`9`,y:`9`,width:`13`,height:`13`,rx:`2`},null,-1),n(`path`,{d:`M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1`},null,-1)]]))],10,Me),i(h,{trigger:`click`,placement:`bottom-end`,onCommand:s.onCommand},{dropdown:b(()=>[i(m,null,{default:b(()=>[i(u,{command:`brief`},{default:b(()=>[d(S(s.$t(`@AGENT:精简:对话正文`)),1)]),_:1}),i(u,{command:`full`},{default:b(()=>[d(S(s.$t(`@AGENT:全量:对话正文 + 思考 + 工具调用`)),1)]),_:1})]),_:1})]),default:b(()=>[n(`button`,{type:`button`,class:`csb__btn csb__caret`,title:s.$t(`@AGENT:选择复制范围`),"aria-label":s.$t(`@AGENT:选择复制范围`)},[...a[3]||=[n(`svg`,{viewBox:`0 0 24 24`,width:`11`,height:`11`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[n(`polyline`,{points:`6 9 12 15 18 9`})],-1)]],8,Fe)]),_:1})])}var Le=E($,[[`render`,Ie],[`__scopeId`,`data-v-76f63575`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/CopySessionButton.vue`]]);export{J as a,z as c,Y as i,R as l,we as n,K as o,be as r,de as s,Le as t,P as u};