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
@@ -1,10 +1,10 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{En as e,Vn as t,i as n,mr as r,r as i,xr as a,yr as o}from"./element-plus-CDrtgG55.js";import{a as s,i as c,o as l,r as u}from"./vendor-DYtaPSUU.js";import{n as d}from"./_plugin-vue_export-helper-BY0jlMBE.js";import{c as f,s as p,t as m}from"./configStore-EvRYufor.js";import{n as h,p as g,r as _,t as v,v as y,y as b}from"./index-CyEcaEC9.js";function x(e,t=200){let n=typeof e==`string`?e:``;if(!n.trim())return``;let r=n.split(`
2
- `).map(e=>e.trim()).filter(Boolean),i=(r.length?r[r.length-1]:``).replace(/\s+/g,` `);return i.length>t?`${i.slice(0,t-1)}…`:i}function S(e){return d(e===`done`?`@AGENT:对话已完成`:`@AGENT:对话出错`)}function C(){let e={page:!1,browser:!1,sound:!1};try{let t=m();e.page=!!t.notifyPageOnTaskDone,e.browser=!!t.notifyBrowserOnTaskDone,e.sound=!!t.notifySoundOnTaskDone}catch{}return e}function w(){return C().sound?_():!1}function T(e){let t=C();if(!v(t))return!1;let r=String(e.title||``).trim()||d(`@AGENT:无标题`),i=x(e.detail),a=e.tag||`zen-gitsync-agent`,o=i?`${r}\n${i}`:r;return t.sound&&h(e.kind),b(t)&&y({title:S(e.kind),body:o,tag:a})||!t.page||e.alreadyToast||(e.kind===`done`?n.success(d(`@AGENT:对话完成:{name}`,{name:r})):n.error(d(`@AGENT:对话出错:{name}`,{name:r}))),!0}var E=`g ai`,D=`g-ai`,O=[{id:`gai`,name:E},...p.map(e=>({id:e.id,name:e.name}))],k=`zen-gitsync-agent-engine`;function A(e){return e===`gai`||f(e)}function j(e){return O.find(t=>t.id===e)?.name||`g ai`}function ee(e){return f(e)}function te(){try{let e=localStorage.getItem(k);if(A(e))return e}catch{}return`gai`}function ne(e){try{localStorage.setItem(k,e)}catch{}}var M=[`png`,`jpg`,`jpeg`,`gif`,`webp`,`bmp`,`svg`],N=/!\[([^\]]*)\]\(\s*(?:<([^<>\n]+)>|([^()\s]+))(\s+["'][^"']*["'])?\s*\)/g,P=/^\s*(`{3,}|~{3,})/,re=/\.([a-z0-9]+)$/;function F(e){let t=e.trim().toLowerCase().match(re);return!!t&&M.includes(t[1])}function I(e){let t=String(e||``).trim();if(!t)return!1;if(/^[a-zA-Z]:[\\/]/.test(t))return F(t);let n=t.match(/^([a-z][a-z0-9+.-]+):/i);return n&&n[1].toLowerCase()!==`file`||t.startsWith(`//`)||t.startsWith(`/`)?!1:F(t)}function L(e,t){return`/api/workbench/jobs/${encodeURIComponent(e)}/image?path=${encodeURIComponent(t)}`}function R(e,t){return`/api/agent/sessions/${encodeURIComponent(e)}/image?path=${encodeURIComponent(t)}`}function z(e,t){return e.includes(`![`)?e.replace(N,(e,n,r,i,a)=>{let o=(r??i??``).trim();return I(o)?`![${n}](${t(o)}${a||``})`:e}):e}function B(e,t){let n=typeof e==`string`?e:``;if(!n||!t||!n.includes(`![`))return n;let r=n.split(`
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{Dn as e,Hn as t,Sr as n,a as r,br as i,hr as a,i as o}from"./element-plus-DgSY_Wt4.js";import{a as s,i as c,o as l,r as u}from"./vendor-CZlKgriV.js";import{n as d}from"./_plugin-vue_export-helper-bQQyMRS6.js";import{c as f,s as p,t as m}from"./configStore-BeHB-gV4.js";import{n as h,p as g,r as _,t as v,v as y,y as b}from"./index-BRQstBzy.js";function x(e,t=200){let n=typeof e==`string`?e:``;if(!n.trim())return``;let r=n.split(`
2
+ `).map(e=>e.trim()).filter(Boolean),i=(r.length?r[r.length-1]:``).replace(/\s+/g,` `);return i.length>t?`${i.slice(0,t-1)}…`:i}function S(e){return d(e===`done`?`@AGENT:对话已完成`:`@AGENT:对话出错`)}function C(){let e={page:!1,browser:!1,sound:!1};try{let t=m();e.page=!!t.notifyPageOnTaskDone,e.browser=!!t.notifyBrowserOnTaskDone,e.sound=!!t.notifySoundOnTaskDone}catch{}return e}function w(){return C().sound?_():!1}function T(e){let t=C();if(!v(t))return!1;let n=String(e.title||``).trim()||d(`@AGENT:无标题`),i=x(e.detail),a=e.tag||`zen-gitsync-agent`,o=i?`${n}\n${i}`:n;return t.sound&&h(e.kind),b(t)&&y({title:S(e.kind),body:o,tag:a})||!t.page||e.alreadyToast||(e.kind===`done`?r.success(d(`@AGENT:对话完成:{name}`,{name:n})):r.error(d(`@AGENT:对话出错:{name}`,{name:n}))),!0}var E=`g ai`,D=`g-ai`,O=[{id:`gai`,name:E},...p.map(e=>({id:e.id,name:e.name}))],k=`zen-gitsync-agent-engine`;function A(e){return e===`gai`||f(e)}function j(e){return O.find(t=>t.id===e)?.name||`g ai`}function ee(e){return f(e)}function te(){try{let e=localStorage.getItem(k);if(A(e))return e}catch{}return`gai`}function ne(e){try{localStorage.setItem(k,e)}catch{}}var M=[`png`,`jpg`,`jpeg`,`gif`,`webp`,`bmp`,`svg`],N=/!\[([^\]]*)\]\(\s*(?:<([^<>\n]+)>|([^()\s]+))(\s+["'][^"']*["'])?\s*\)/g,P=/^\s*(`{3,}|~{3,})/,re=/\.([a-z0-9]+)$/;function F(e){let t=e.trim().toLowerCase().match(re);return!!t&&M.includes(t[1])}function I(e){let t=String(e||``).trim();if(!t)return!1;if(/^[a-zA-Z]:[\\/]/.test(t))return F(t);let n=t.match(/^([a-z][a-z0-9+.-]+):/i);return n&&n[1].toLowerCase()!==`file`||t.startsWith(`//`)||t.startsWith(`/`)?!1:F(t)}function L(e,t){return`/api/workbench/jobs/${encodeURIComponent(e)}/image?path=${encodeURIComponent(t)}`}function R(e,t){return`/api/agent/sessions/${encodeURIComponent(e)}/image?path=${encodeURIComponent(t)}`}function z(e,t){return e.includes(`![`)?e.replace(N,(e,n,r,i,a)=>{let o=(r??i??``).trim();return I(o)?`![${n}](${t(o)}${a||``})`:e}):e}function B(e,t){let n=typeof e==`string`?e:``;if(!n||!t||!n.includes(`![`))return n;let r=n.split(`
3
3
  `),i=null,a=[];for(let e of r){let n=e.match(P);if(n){let t=n[1][0];i===null?i=t:i===t&&(i=null),a.push(e);continue}a.push(i===null?z(e,t):e)}return a.join(`
4
- `)}function V(e,t){return B(e,t?e=>L(t,e):null)}function ie(e,t){return B(e,t?e=>R(t,e):null)}t(),r();var H=[`image/*`,`.pdf`,`.txt`,`.md`,`.json`,`.csv`,`.log`,`.yml`,`.yaml`,`.xml`,`.toml`,`.ini`,`.html`,`.css`,`.js`,`.ts`,`.tsx`,`.vue`,`.py`,`.java`,`.go`,`.rs`,`.sql`,`.sh`].join(`,`),U=65536,W=`local-`,ae=0;function oe(e){if(!e||!Array.isArray(e.messages))return[];let t=[],n=e.messages.length,r=new Map;for(let t of e.turnTimings||[])typeof t?.turnIndex==`number`&&Number.isFinite(t?.durationMs)&&r.set(t.turnIndex,t);let i=-1;for(let a=0;a<n;a++){let o=e.messages[a];if(o.role!==`system`){if(o.role===`user`){i+=1;let e=``,n;if(typeof o.content==`string`)e=o.content;else if(Array.isArray(o.content)){e=o.content.filter(e=>e?.type===`text`).map(e=>e.text||``).join(` `);let t=o.content.filter(e=>e?.type===`image_url`&&typeof e.image_url?.url==`string`).map((e,t)=>({id:`att-${a}-${t}`,name:`image`,size:0,type:q(e.image_url?.url||``)||`image/*`,preview:e.image_url?.url}));t.length>0&&(n=t)}(e||n)&&t.push({id:`msg-${a}`,role:`user`,content:e,attachments:n,status:`done`,createdAt:Date.now()})}else if(o.role===`assistant`){let o=`msg-${a}`,s=``,l=[],u=a;for(;u<n;){let t=e.messages[u];if(t.role!==`assistant`&&t.role!==`tool`)break;if(t.role===`assistant`){if(typeof t.content==`string`&&(s+=t.content),t.tool_calls&&t.tool_calls.length>0)for(let e of t.tool_calls)l.push({id:e.id||e.function?.name||c(),name:e.function?.name||``,arguments:e.function?.arguments||``,argsPreview:G(e.function?.name||``,e.function?.arguments||``),status:`done`,result:``})}else{let e=t.tool_call_id||t.name||``,n=l.find(t=>t.id===e);if(n){let e;e=typeof t.content==`string`?t.content:Array.isArray(t.content)&&t.content.filter(e=>e?.type===`text`).map(e=>e.text||``).join(`
5
- `)||`(non-text result)`,e.length>U&&(e=`…(前文已截断)\n${e.slice(-65536)}`),n.result=e}}u++}a=u-1,s.length>U&&(s=`…(前文已截断)\n${s.slice(-65536)}`);let d=!!s,f=l.length>0;if(d||f){let e=r.get(i),n=e?.finishedAt?Date.parse(e.finishedAt):NaN;t.push({id:o,role:`assistant`,content:s,toolCalls:f?l:void 0,status:`done`,createdAt:Number.isFinite(n)&&e?n-e.durationMs:Date.now(),finishedAt:Number.isFinite(n)?n:void 0,meta:e?{durationMs:e.durationMs}:void 0})}}}}return t}function G(e,t){try{let n=JSON.parse(t);switch(e){case`run_command`:return String(n.command||``).slice(0,200);case`read_file`:case`write_file`:case`edit_file`:return String(n.path||``);case`list_files`:return String(n.path||`.`);case`search_text`:return String(n.pattern||``);case`update_plan`:{let e=l(t,`update_plan`);if(!e)return``;let{total:r,done:i}=u(e),a=String(n.explanation||``).replace(/\s+/g,` `).trim();return[`${i}/${r}`,a].filter(Boolean).join(` — `).slice(0,200)}default:return JSON.stringify(n).slice(0,200)}}catch{return t.slice(0,200)}}function K(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result||``)),r.onerror=()=>n(r.error||Error(`FileReader failed`)),r.readAsDataURL(e)})}function q(e){let t=/^data:([^;,]+)/.exec(e);return t?t[1]:``}function J(){let t=m(),r=g(),l=++ae,u=a([]),f=a(!1),p=a(te());function h(e){A(e)&&(p.value=e,ne(e))}let _=o(new Map),v=a(null),y=a(!1),b=0,x=0,S=new Set,C=new Map;function E(e){return{key:e,sessionId:e.startsWith(W)?null:e,title:``,messages:[],isStreaming:!1,abortController:null,nonce:0,pendingQuestion:null,answeringQuestion:!1,contextUsage:null,queue:[],queuePaused:!1}}function D(e){let t=_.get(e);return t||=(_.set(e,E(e)),_.get(e)),t}let O=e(()=>v.value?_.get(v.value)??null:null),k=e(()=>O.value?.messages??[]),j=e(()=>{let e=k.value,t=O.value?.sessionId??null;if(!t)return e;let n=!1,r=e.map(e=>{if(!e.content||!e.content.includes(`![`))return e;let r=ie(e.content,t);return r===e.content?e:(n=!0,{...e,content:r})});return n?r:e}),ee=e(()=>O.value?.isStreaming??!1),M=e(()=>O.value?.contextUsage??null),N=e(()=>{let e=M.value;return e?{ratio:Math.min(Math.max(e.tokenRatio,e.messageRatio),1),current:e.tokens,total:e.maxTokens,unit:`K`,suffix:`上下文已使用`,detail:[`${e.messages} / ${e.maxMessages} 条消息`,typeof e.actualInputTokens==`number`&&e.actualInputTokens>0?`实测 ${e.actualInputTokens.toLocaleString()} token`:`估算 ${Math.round(e.estTokens).toLocaleString()} token`,e.droppedMessages>0?`会话共 ${e.transcriptMessages} 条,本次只带入 ${e.messages} 条(其余已摘成梗概)`:``].filter(Boolean).join(`
6
- `)}:null}),P=e(()=>{let e=u.value.find(e=>e.sessionId===v.value);return A(e?.engine)?e.engine:p.value}),re=e(()=>u.value.some(e=>e.sessionId===v.value)),F=e(()=>O.value?.pendingQuestion??null),I=e(()=>O.value?.answeringQuestion??!1),L=e(()=>O.value?.pendingQuestion??null),R=e(()=>O.value?.queuePaused??!1),z=e(()=>(O.value?.queue??[]).map(e=>({id:e.id,text:e.text,attachmentNames:e.files.map(e=>e.file.name)})));function B(e){let t=O.value;if(!t)return;let n=t.queue.findIndex(t=>t.id===e);n<0||(t.queue.splice(n,1),t.queue.length===0&&(t.queuePaused=!1))}function V(e){if(e.isStreaming)return;let t=e.queue.shift();t&&$(t.text,t.files,{...t.options,targetKey:e.key,background:!0})}function H(){let e=O.value;e&&!e.isStreaming&&e.queue.length!==0&&(e.queuePaused=!1,V(e))}function G(e){return!!_.get(e)?.isStreaming}function q(e){let n=[...e];for(let e of _.values()){if(!e.sessionId)continue;let r=n.findIndex(t=>t.sessionId===e.sessionId);if(r!==-1){S.delete(e.sessionId),e.isStreaming&&(n[r]={...n[r],isGenerating:!0});continue}if(!e.isStreaming&&!S.has(e.sessionId))continue;let i=new Date().toISOString();n.unshift({sessionId:e.sessionId,title:e.title||d(`@AGENT:无标题`),source:`web`,cwd:t.currentDirectory||``,model:``,engine:p.value,createdAt:i,updatedAt:i,messageCount:e.messages.filter(e=>e.role===`user`).length||1,size:0,isGenerating:e.isStreaming})}return n}function J(e,t){return(t.updatedAt||``).localeCompare(e.updatedAt||``)}function Y(e){if(!e?.sessionId||u.value.some(t=>t.sessionId===e.sessionId))return;let n={sessionId:e.sessionId,title:e.title||d(`@AGENT:无标题`),source:e.source||`web`,cwd:e.cwd||``,model:e.model||``,engine:e.engine,createdAt:e.createdAt||``,updatedAt:e.updatedAt||``,messageCount:Array.isArray(e.messages)?e.messages.length:0,size:0};C.set(e.sessionId,{meta:n,cwd:t.currentDirectory||``}),u.value=[...u.value,n].sort(J)}function X(){if(C.size===0)return;let e=t.currentDirectory||``,n=[];for(let[t,r]of[...C]){if(r.cwd!==e||u.value.some(e=>e.sessionId===t)){C.delete(t);continue}n.push(r.meta)}n.length&&(u.value=[...u.value,...n].sort(J))}async function Z(){let e=++b,r=t.currentDirectory||``;if(!r){u.value=[],f.value=!1;return}f.value=!0;try{let t=`/api/agent/sessions?cwd=${encodeURIComponent(r)}`,i=await fetch(t).then(e=>e.json());if(e!==b)return;if(!i.success){n.error(i.error||d(`@AGENT:加载会话列表失败`));return}let a=Array.isArray(i.sessions)?i.sessions:[];u.value=q(a),X()}catch(t){if(e!==b)return;n.error(d(`@AGENT:加载会话列表失败`)+`: `+(t?.message||t))}finally{e===b&&(f.value=!1)}}function se(e,n){let r=new Date().toISOString(),i=u.value.find(t=>t.sessionId===e);if(i){i.isGenerating=!0,i.updatedAt=r;return}u.value=[{sessionId:e,title:n||d(`@AGENT:无标题`),source:`web`,cwd:t.currentDirectory||``,model:``,engine:p.value,createdAt:r,updatedAt:r,messageCount:1,size:0,isGenerating:!0},...u.value]}function Q(e){let t=u.value.find(t=>t.sessionId===e);t&&(t.isGenerating=!1)}async function ce(e){if(_.get(e)?.isStreaming){v.value=e;return}y.value=!0,v.value=e;try{let t=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`).then(e=>e.json());if(!t.success){n.error(t.error||d(`@AGENT:加载会话失败`));return}let r=D(e);r.sessionId=e,r.messages=oe(t.session),t.session?.title&&(r.title=t.session.title),Y(t.session)}catch(e){n.error(d(`@AGENT:加载会话失败`)+`: `+(e?.message||e))}finally{y.value=!1}}async function le(e){try{await i.confirm(d(`@AGENT:确认删除该会话`),d(`@AGENT:删除后无法恢复`),{type:`warning`})}catch{return}let t=_.get(e);if(t?.abortController)try{t.abortController.abort()}catch{}_.delete(e);try{let t=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`,{method:`DELETE`}).then(e=>e.json());if(!t.success){n.error(t.error||d(`@AGENT:删除失败`));return}u.value=u.value.filter(t=>t.sessionId!==e),C.delete(e),v.value===e&&(v.value=null),n.success(d(`@AGENT:已删除`))}catch(e){n.error(d(`@AGENT:删除失败`)+`: `+(e?.message||e))}}async function ue(e,t){try{let r=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:t})}).then(e=>e.json());if(!r.success){n.error(r.error||d(`@AGENT:重命名失败`));return}let i=u.value.find(t=>t.sessionId===e);i&&(i.title=t);let a=_.get(e);a&&(a.title=t),n.success(d(`@AGENT:已重命名`))}catch(e){n.error(d(`@AGENT:重命名失败`)+`: `+(e?.message||e))}}function de(){v.value=null}async function $(e,i=[],a={}){let s=i.filter(e=>e?.file?.type?.startsWith(`image/`)),u=i.filter(e=>!e?.file?.type?.startsWith(`image/`)),f=[],p=0;for(let e of u){let t=e.file.size||0;if(!(t>10485760)){if(f.length>=10||p+t>20971520)break;p+=t,f.push(e)}}let m=u.filter(e=>!f.includes(e));m.length>0&&n.warning(`${d(`@AGENT:以下附件超过大小或数量上限,已忽略:`)}${m.map(e=>e.file.name).join(`、`)}`);let h=a.targetKey||v.value||`${W}${Date.now()}-${++x}`,g=D(h);if(!e.trim()&&s.length===0&&f.length===0)return;if(g.isStreaming){g.queue.push({id:c(),text:e,files:[...s,...f],options:a});return}let _=(await Promise.allSettled(s.map(e=>K(e.file)))).map(e=>e.status===`fulfilled`?e.value:``).filter(e=>e.startsWith(`data:image/`)),y=(await Promise.allSettled(f.map(async e=>({name:e.file.name||`file`,dataUrl:await K(e.file)})))).map(e=>e.status===`fulfilled`?e.value:null).filter(e=>!!e&&typeof e.dataUrl==`string`&&e.dataUrl.startsWith(`data:`));a.background||(v.value=g.key),g.nonce+=1;let b=g.nonce;g.abortController=new AbortController;let S=g.abortController;g.pendingQuestion=null,g.answeringQuestion=!1;let C={id:c(),role:`user`,content:e,status:`done`,createdAt:Date.now()},w=[...s,...f];w.length>0&&(C.attachments=w.map(e=>({id:e.id,name:e.file.name||`image`,size:e.file.size||0,type:e.file.type||``,preview:e.preview}))),g.messages.push(C);let T=o({id:c(),role:`assistant`,content:``,status:`pending`,createdAt:Date.now()});g.messages.push(T),g.isStreaming=!0,g.lastSendOptions=a;let E=`${l}:${h}:${b}`;r.begin(E),await fe(g,b,S,T,E,{sessionId:g.sessionId||``,userMessage:e,cwd:t.currentDirectory||``,engine:a.engine??P.value,..._.length>0?{images:_}:{},...y.length>0?{attachments:y}:{},...a.openFilePath?{openFilePath:a.openFilePath}:{},...a.dirStatus?.length?{dirStatus:a.dirStatus}:{},...a.dirSummary?{dirSummary:a.dirSummary}:{},...a.allowDispatch?{allowDispatch:!0,dispatchExecutor:a.dispatchExecutor||``,dispatchUseDefaultPrompt:a.dispatchUseDefaultPrompt!==!1}:{}})}async function fe(e,t,i,a,l,u){let f=String(u.userMessage||``),p=[],m=e.sessionId,h=!1,g=null;try{let r=await fetch(`/api/agent/chat`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify(u),signal:i.signal});if(t!==e.nonce)return;if(!r.ok||!r.body){let e=await r.text().catch(()=>``);throw Error(e||`HTTP ${r.status}`)}let l=r.body.getReader(),h=new TextDecoder(`utf-8`),y=``;for(;;){let{value:r,done:i}=await l.read();if(t!==e.nonce)return;if(i)break;y+=h.decode(r,{stream:!0});let u=y.split(`
7
- `);y=u.pop()??``;for(let t of u){let r=t.trim();if(!r.startsWith(`data:`))continue;let i=r.slice(5).trim();if(!i)continue;let l;try{l=JSON.parse(i)}catch{continue}switch(l.type){case`context`:l.usage&&(e.contextUsage={...e.contextUsage||{},...l.usage});break;case`meta`:if(l.sessionId){let t=String(l.sessionId);if(m=t,e.sessionId!==t){let n=e.key;e.sessionId=t,e.key=t,n!==t&&(_.delete(n),_.set(t,e),v.value===n&&(v.value=t))}let n=String(l.title||``).trim()||f.trim().split(`
8
- `)[0].trim().slice(0,40)||d(`@AGENT:无标题`);e.title||=n,se(t,n)}break;case`attempt`:g={content:(a.content||``).length,reasoning:(a.reasoning||``).length,tools:a.toolCalls?.length??0};break;case`retry`:g&&(a.content=(a.content||``).slice(0,g.content),a.reasoning&&=a.reasoning.slice(0,g.reasoning),a.toolCalls&&a.toolCalls.length>g.tools&&(a.toolCalls.length=g.tools,p=[...a.toolCalls])),a.status=`pending`,a.error=``,a.finishedAt=void 0,a.reasoningStatus===`streaming`&&(a.reasoningStatus=`done`),n.info(d(`@AGENT:连接中断,正在自动重试({attempt}/{max}):{reason}`,{attempt:Number(l.attempt)||0,max:Number(l.maxRetries)||0,reason:String(l.reason||``)}));break;case`thinking`:a.reasoning||(a.reasoning=``,a.reasoningStatus=`streaming`),typeof a.reasoningStartedAt!=`number`&&(a.reasoningStartedAt=Date.now()),a.reasoningEndedAt=Date.now(),a.reasoning+=String(l.delta||``),a.status=`streaming`;break;case`content`:a.status===`pending`&&(a.status=`streaming`);{let e=String(l.delta||``);a.content+=e;let t=s(a.content);t.reasoning&&(a.reasoning||(a.reasoning=``,a.reasoningStatus=`streaming`),a.reasoning=t.reasoning,a.content=t.content)}break;case`tool_call_start`:{let e=o({id:l.toolCallId||c(),name:l.name||``,argsPreview:l.argsPreview||``,arguments:l.arguments||l.argsPreview||``,status:`running`,result:``});p.push(e),a.toolCalls||=[],a.toolCalls.push(e),a.status===`pending`&&(a.status=`streaming`);break}case`tool_output`:{let e=p.find(e=>e.id===l.toolCallId);if(e){let t=`${e.result||``}${String(l.chunk||``)}`;e.result=t.length>U?`…(前文已截断)\n${t.slice(-65536)}`:t}break}case`tool_result`:{let t=p.find(e=>e.id===l.toolCallId);t&&(t.result=String(l.result||``),t.status=`done`,t.name===`ask_user`&&(e.pendingQuestion=null));break}case`ask_user`:e.pendingQuestion={interactionId:String(l.interactionId||``),question:String(l.question||``),options:Array.isArray(l.options)?l.options.map(e=>String(e)):[],allowFreeText:l.allowFreeText!==!1,multiple:l.multiple===!0},w();break;case`done`:{let e=l.content||a.content,t=s(e);t.reasoning&&!a.reasoning&&(a.reasoning=t.reasoning),a.content=t.content,a.status=`done`,a.reasoningStatus===`streaming`&&(a.reasoningStatus=`done`);break}case`turn_done`:{let e=Number(l.durationMs);if(!Number.isFinite(e)||e<0||a.meta?.durationMs!==void 0)break;a.finishedAt=Date.now(),a.meta={...a.meta||{},durationMs:e};break}case`error`:a.status=`error`,a.error=String(l.error||d(`@AGENT:未知错误`)),a.reasoningStatus===`streaming`&&(a.reasoningStatus=`done`)}}}if(t!==e.nonce)return;a.status===`pending`&&(a.status=`done`)}catch(r){if(t!==e.nonce)return;r?.name===`AbortError`||i.signal.aborted?(h=!0,a.content=(a.content||``)+`
4
+ `)}function V(e,t){return B(e,t?e=>L(t,e):null)}function ie(e,t){return B(e,t?e=>R(t,e):null)}t(),a();var H=[`image/*`,`.pdf`,`.txt`,`.md`,`.json`,`.csv`,`.log`,`.yml`,`.yaml`,`.xml`,`.toml`,`.ini`,`.html`,`.css`,`.js`,`.ts`,`.tsx`,`.vue`,`.py`,`.java`,`.go`,`.rs`,`.sql`,`.sh`].join(`,`),U=65536,W=`local-`,ae=0;function oe(e){if(!e||!Array.isArray(e.messages))return[];let t=[],n=e.messages.length,r=new Map;for(let t of e.turnTimings||[])typeof t?.turnIndex==`number`&&Number.isFinite(t?.durationMs)&&r.set(t.turnIndex,t);let i=-1;for(let a=0;a<n;a++){let o=e.messages[a];if(o.role!==`system`){if(o.role===`user`){i+=1;let e=``,n;if(typeof o.content==`string`)e=o.content;else if(Array.isArray(o.content)){e=o.content.filter(e=>e?.type===`text`).map(e=>e.text||``).join(` `);let t=o.content.filter(e=>e?.type===`image_url`&&typeof e.image_url?.url==`string`).map((e,t)=>({id:`att-${a}-${t}`,name:`image`,size:0,type:q(e.image_url?.url||``)||`image/*`,preview:e.image_url?.url}));t.length>0&&(n=t)}(e||n)&&t.push({id:`msg-${a}`,role:`user`,content:e,attachments:n,status:`done`,createdAt:Date.now()})}else if(o.role===`assistant`){let o=`msg-${a}`,s=``,l=[],u=a;for(;u<n;){let t=e.messages[u];if(t.role!==`assistant`&&t.role!==`tool`)break;if(t.role===`assistant`){if(typeof t.content==`string`&&(s+=t.content),t.tool_calls&&t.tool_calls.length>0)for(let e of t.tool_calls)l.push({id:e.id||e.function?.name||c(),name:e.function?.name||``,arguments:e.function?.arguments||``,argsPreview:G(e.function?.name||``,e.function?.arguments||``),status:`done`,result:``})}else{let e=t.tool_call_id||t.name||``,n=l.find(t=>t.id===e);if(n){let e;e=typeof t.content==`string`?t.content:Array.isArray(t.content)&&t.content.filter(e=>e?.type===`text`).map(e=>e.text||``).join(`
5
+ `)||`(non-text result)`,e.length>U&&(e=`…(前文已截断)\n${e.slice(-65536)}`),n.result=e}}u++}a=u-1,s.length>U&&(s=`…(前文已截断)\n${s.slice(-65536)}`);let d=!!s,f=l.length>0;if(d||f){let e=r.get(i),n=e?.finishedAt?Date.parse(e.finishedAt):NaN;t.push({id:o,role:`assistant`,content:s,toolCalls:f?l:void 0,status:`done`,createdAt:Number.isFinite(n)&&e?n-e.durationMs:Date.now(),finishedAt:Number.isFinite(n)?n:void 0,meta:e?{durationMs:e.durationMs}:void 0})}}}}return t}function G(e,t){try{let n=JSON.parse(t);switch(e){case`run_command`:return String(n.command||``).slice(0,200);case`read_file`:case`write_file`:case`edit_file`:return String(n.path||``);case`list_files`:return String(n.path||`.`);case`search_text`:return String(n.pattern||``);case`update_plan`:{let e=l(t,`update_plan`);if(!e)return``;let{total:r,done:i}=u(e),a=String(n.explanation||``).replace(/\s+/g,` `).trim();return[`${i}/${r}`,a].filter(Boolean).join(` — `).slice(0,200)}default:return JSON.stringify(n).slice(0,200)}}catch{return t.slice(0,200)}}function K(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result||``)),r.onerror=()=>n(r.error||Error(`FileReader failed`)),r.readAsDataURL(e)})}function q(e){let t=/^data:([^;,]+)/.exec(e);return t?t[1]:``}function J(){let t=m(),a=g(),l=++ae,u=n([]),f=n(!1),p=n(te());function h(e){A(e)&&(p.value=e,ne(e))}let _=i(new Map),v=n(null),y=n(!1),b=0,x=0,S=new Set,C=new Map;function E(e){return{key:e,sessionId:e.startsWith(W)?null:e,title:``,messages:[],isStreaming:!1,abortController:null,nonce:0,pendingQuestion:null,answeringQuestion:!1,contextUsage:null,queue:[],queuePaused:!1}}function D(e){let t=_.get(e);return t||=(_.set(e,E(e)),_.get(e)),t}let O=e(()=>v.value?_.get(v.value)??null:null),k=e(()=>O.value?.messages??[]),j=e(()=>{let e=k.value,t=O.value?.sessionId??null;if(!t)return e;let n=!1,r=e.map(e=>{if(!e.content||!e.content.includes(`![`))return e;let r=ie(e.content,t);return r===e.content?e:(n=!0,{...e,content:r})});return n?r:e}),ee=e(()=>O.value?.isStreaming??!1),M=e(()=>O.value?.contextUsage??null),N=e(()=>{let e=M.value;return e?{ratio:Math.min(Math.max(e.tokenRatio,e.messageRatio),1),current:e.tokens,total:e.maxTokens,unit:`K`,suffix:`上下文已使用`,detail:[`${e.messages} / ${e.maxMessages} 条消息`,typeof e.actualInputTokens==`number`&&e.actualInputTokens>0?`实测 ${e.actualInputTokens.toLocaleString()} token`:`估算 ${Math.round(e.estTokens).toLocaleString()} token`,e.droppedMessages>0?`会话共 ${e.transcriptMessages} 条,本次只带入 ${e.messages} 条(其余已摘成梗概)`:``].filter(Boolean).join(`
6
+ `)}:null}),P=e(()=>{let e=u.value.find(e=>e.sessionId===v.value);return A(e?.engine)?e.engine:p.value}),re=e(()=>u.value.some(e=>e.sessionId===v.value)),F=e(()=>O.value?.pendingQuestion??null),I=e(()=>O.value?.answeringQuestion??!1),L=e(()=>O.value?.pendingQuestion??null),R=e(()=>O.value?.queuePaused??!1),z=e(()=>(O.value?.queue??[]).map(e=>({id:e.id,text:e.text,attachmentNames:e.files.map(e=>e.file.name)})));function B(e){let t=O.value;if(!t)return;let n=t.queue.findIndex(t=>t.id===e);n<0||(t.queue.splice(n,1),t.queue.length===0&&(t.queuePaused=!1))}function V(e){if(e.isStreaming)return;let t=e.queue.shift();t&&$(t.text,t.files,{...t.options,targetKey:e.key,background:!0})}function H(){let e=O.value;e&&!e.isStreaming&&e.queue.length!==0&&(e.queuePaused=!1,V(e))}function G(e){return!!_.get(e)?.isStreaming}function q(e){let n=[...e];for(let e of _.values()){if(!e.sessionId)continue;let r=n.findIndex(t=>t.sessionId===e.sessionId);if(r!==-1){S.delete(e.sessionId),e.isStreaming&&(n[r]={...n[r],isGenerating:!0});continue}if(!e.isStreaming&&!S.has(e.sessionId))continue;let i=new Date().toISOString();n.unshift({sessionId:e.sessionId,title:e.title||d(`@AGENT:无标题`),source:`web`,cwd:t.currentDirectory||``,model:``,engine:p.value,createdAt:i,updatedAt:i,messageCount:e.messages.filter(e=>e.role===`user`).length||1,size:0,isGenerating:e.isStreaming})}return n}function J(e,t){return(t.updatedAt||``).localeCompare(e.updatedAt||``)}function Y(e){if(!e?.sessionId||u.value.some(t=>t.sessionId===e.sessionId))return;let n={sessionId:e.sessionId,title:e.title||d(`@AGENT:无标题`),source:e.source||`web`,cwd:e.cwd||``,model:e.model||``,engine:e.engine,createdAt:e.createdAt||``,updatedAt:e.updatedAt||``,messageCount:Array.isArray(e.messages)?e.messages.length:0,size:0};C.set(e.sessionId,{meta:n,cwd:t.currentDirectory||``}),u.value=[...u.value,n].sort(J)}function X(){if(C.size===0)return;let e=t.currentDirectory||``,n=[];for(let[t,r]of[...C]){if(r.cwd!==e||u.value.some(e=>e.sessionId===t)){C.delete(t);continue}n.push(r.meta)}n.length&&(u.value=[...u.value,...n].sort(J))}async function Z(){let e=++b,n=t.currentDirectory||``;if(!n){u.value=[],f.value=!1;return}f.value=!0;try{let t=`/api/agent/sessions?cwd=${encodeURIComponent(n)}`,i=await fetch(t).then(e=>e.json());if(e!==b)return;if(!i.success){r.error(i.error||d(`@AGENT:加载会话列表失败`));return}let a=Array.isArray(i.sessions)?i.sessions:[];u.value=q(a),X()}catch(t){if(e!==b)return;r.error(d(`@AGENT:加载会话列表失败`)+`: `+(t?.message||t))}finally{e===b&&(f.value=!1)}}function se(e,n){let r=new Date().toISOString(),i=u.value.find(t=>t.sessionId===e);if(i){i.isGenerating=!0,i.updatedAt=r;return}u.value=[{sessionId:e,title:n||d(`@AGENT:无标题`),source:`web`,cwd:t.currentDirectory||``,model:``,engine:p.value,createdAt:r,updatedAt:r,messageCount:1,size:0,isGenerating:!0},...u.value]}function Q(e){let t=u.value.find(t=>t.sessionId===e);t&&(t.isGenerating=!1)}async function ce(e){if(_.get(e)?.isStreaming){v.value=e;return}y.value=!0,v.value=e;try{let t=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`).then(e=>e.json());if(!t.success){r.error(t.error||d(`@AGENT:加载会话失败`));return}let n=D(e);n.sessionId=e,n.messages=oe(t.session),t.session?.title&&(n.title=t.session.title),Y(t.session)}catch(e){r.error(d(`@AGENT:加载会话失败`)+`: `+(e?.message||e))}finally{y.value=!1}}async function le(e){try{await o.confirm(d(`@AGENT:确认删除该会话`),d(`@AGENT:删除后无法恢复`),{type:`warning`})}catch{return}let t=_.get(e);if(t?.abortController)try{t.abortController.abort()}catch{}_.delete(e);try{let t=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`,{method:`DELETE`}).then(e=>e.json());if(!t.success){r.error(t.error||d(`@AGENT:删除失败`));return}u.value=u.value.filter(t=>t.sessionId!==e),C.delete(e),v.value===e&&(v.value=null),r.success(d(`@AGENT:已删除`))}catch(e){r.error(d(`@AGENT:删除失败`)+`: `+(e?.message||e))}}async function ue(e,t){try{let n=await fetch(`/api/agent/sessions/${encodeURIComponent(e)}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:t})}).then(e=>e.json());if(!n.success){r.error(n.error||d(`@AGENT:重命名失败`));return}let i=u.value.find(t=>t.sessionId===e);i&&(i.title=t);let a=_.get(e);a&&(a.title=t),r.success(d(`@AGENT:已重命名`))}catch(e){r.error(d(`@AGENT:重命名失败`)+`: `+(e?.message||e))}}function de(){v.value=null}async function $(e,n=[],o={}){let s=n.filter(e=>e?.file?.type?.startsWith(`image/`)),u=n.filter(e=>!e?.file?.type?.startsWith(`image/`)),f=[],p=0;for(let e of u){let t=e.file.size||0;if(!(t>10485760)){if(f.length>=10||p+t>20971520)break;p+=t,f.push(e)}}let m=u.filter(e=>!f.includes(e));m.length>0&&r.warning(`${d(`@AGENT:以下附件超过大小或数量上限,已忽略:`)}${m.map(e=>e.file.name).join(`、`)}`);let h=o.targetKey||v.value||`${W}${Date.now()}-${++x}`,g=D(h);if(!e.trim()&&s.length===0&&f.length===0)return;if(g.isStreaming){g.queue.push({id:c(),text:e,files:[...s,...f],options:o});return}let _=(await Promise.allSettled(s.map(e=>K(e.file)))).map(e=>e.status===`fulfilled`?e.value:``).filter(e=>e.startsWith(`data:image/`)),y=(await Promise.allSettled(f.map(async e=>({name:e.file.name||`file`,dataUrl:await K(e.file)})))).map(e=>e.status===`fulfilled`?e.value:null).filter(e=>!!e&&typeof e.dataUrl==`string`&&e.dataUrl.startsWith(`data:`));o.background||(v.value=g.key),g.nonce+=1;let b=g.nonce;g.abortController=new AbortController;let S=g.abortController;g.pendingQuestion=null,g.answeringQuestion=!1;let C={id:c(),role:`user`,content:e,status:`done`,createdAt:Date.now()},w=[...s,...f];w.length>0&&(C.attachments=w.map(e=>({id:e.id,name:e.file.name||`image`,size:e.file.size||0,type:e.file.type||``,preview:e.preview}))),g.messages.push(C);let T=i({id:c(),role:`assistant`,content:``,status:`pending`,createdAt:Date.now()});g.messages.push(T),g.isStreaming=!0,g.lastSendOptions=o;let E=`${l}:${h}:${b}`;a.begin(E),await fe(g,b,S,T,E,{sessionId:g.sessionId||``,userMessage:e,cwd:t.currentDirectory||``,engine:o.engine??P.value,..._.length>0?{images:_}:{},...y.length>0?{attachments:y}:{},...o.openFilePath?{openFilePath:o.openFilePath}:{},...o.dirStatus?.length?{dirStatus:o.dirStatus}:{},...o.dirSummary?{dirSummary:o.dirSummary}:{},...o.allowDispatch?{allowDispatch:!0,dispatchExecutor:o.dispatchExecutor||``,dispatchUseDefaultPrompt:o.dispatchUseDefaultPrompt!==!1}:{}})}async function fe(e,t,n,o,l,u){let f=String(u.userMessage||``),p=[],m=e.sessionId,h=!1,g=null;try{let a=await fetch(`/api/agent/chat`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify(u),signal:n.signal});if(t!==e.nonce)return;if(!a.ok||!a.body){let e=await a.text().catch(()=>``);throw Error(e||`HTTP ${a.status}`)}let l=a.body.getReader(),h=new TextDecoder(`utf-8`),y=``;for(;;){let{value:n,done:a}=await l.read();if(t!==e.nonce)return;if(a)break;y+=h.decode(n,{stream:!0});let u=y.split(`
7
+ `);y=u.pop()??``;for(let t of u){let n=t.trim();if(!n.startsWith(`data:`))continue;let a=n.slice(5).trim();if(!a)continue;let l;try{l=JSON.parse(a)}catch{continue}switch(l.type){case`context`:l.usage&&(e.contextUsage={...e.contextUsage||{},...l.usage});break;case`meta`:if(l.sessionId){let t=String(l.sessionId);if(m=t,e.sessionId!==t){let n=e.key;e.sessionId=t,e.key=t,n!==t&&(_.delete(n),_.set(t,e),v.value===n&&(v.value=t))}let n=String(l.title||``).trim()||f.trim().split(`
8
+ `)[0].trim().slice(0,40)||d(`@AGENT:无标题`);e.title||=n,se(t,n)}break;case`attempt`:g={content:(o.content||``).length,reasoning:(o.reasoning||``).length,tools:o.toolCalls?.length??0};break;case`retry`:g&&(o.content=(o.content||``).slice(0,g.content),o.reasoning&&=o.reasoning.slice(0,g.reasoning),o.toolCalls&&o.toolCalls.length>g.tools&&(o.toolCalls.length=g.tools,p=[...o.toolCalls])),o.status=`pending`,o.error=``,o.finishedAt=void 0,o.reasoningStatus===`streaming`&&(o.reasoningStatus=`done`),r.info(d(`@AGENT:连接中断,正在自动重试({attempt}/{max}):{reason}`,{attempt:Number(l.attempt)||0,max:Number(l.maxRetries)||0,reason:String(l.reason||``)}));break;case`thinking`:o.reasoning||(o.reasoning=``,o.reasoningStatus=`streaming`),typeof o.reasoningStartedAt!=`number`&&(o.reasoningStartedAt=Date.now()),o.reasoningEndedAt=Date.now(),o.reasoning+=String(l.delta||``),o.status=`streaming`;break;case`content`:o.status===`pending`&&(o.status=`streaming`);{let e=String(l.delta||``);o.content+=e;let t=s(o.content);t.reasoning&&(o.reasoning||(o.reasoning=``,o.reasoningStatus=`streaming`),o.reasoning=t.reasoning,o.content=t.content)}break;case`tool_call_start`:{let e=i({id:l.toolCallId||c(),name:l.name||``,argsPreview:l.argsPreview||``,arguments:l.arguments||l.argsPreview||``,status:`running`,result:``});p.push(e),o.toolCalls||=[],o.toolCalls.push(e),o.status===`pending`&&(o.status=`streaming`);break}case`tool_output`:{let e=p.find(e=>e.id===l.toolCallId);if(e){let t=`${e.result||``}${String(l.chunk||``)}`;e.result=t.length>U?`…(前文已截断)\n${t.slice(-65536)}`:t}break}case`tool_result`:{let t=p.find(e=>e.id===l.toolCallId);t&&(t.result=String(l.result||``),t.status=`done`,t.name===`ask_user`&&(e.pendingQuestion=null));break}case`ask_user`:e.pendingQuestion={interactionId:String(l.interactionId||``),question:String(l.question||``),options:Array.isArray(l.options)?l.options.map(e=>String(e)):[],allowFreeText:l.allowFreeText!==!1,multiple:l.multiple===!0},w();break;case`done`:{let e=l.content||o.content,t=s(e);t.reasoning&&!o.reasoning&&(o.reasoning=t.reasoning),o.content=t.content,o.status=`done`,o.reasoningStatus===`streaming`&&(o.reasoningStatus=`done`);break}case`turn_done`:{let e=Number(l.durationMs);if(!Number.isFinite(e)||e<0||o.meta?.durationMs!==void 0)break;o.finishedAt=Date.now(),o.meta={...o.meta||{},durationMs:e};break}case`error`:o.status=`error`,o.error=String(l.error||d(`@AGENT:未知错误`)),o.reasoningStatus===`streaming`&&(o.reasoningStatus=`done`)}}}if(t!==e.nonce)return;o.status===`pending`&&(o.status=`done`)}catch(i){if(t!==e.nonce)return;if(i?.name===`AbortError`||n.signal.aborted)h=!0,o.content=(o.content||``)+`
9
9
 
10
- [`+d(`@AGENT:已停止`)+`]`,a.status=`done`,a.reasoningStatus===`streaming`&&(a.reasoningStatus=`done`),a.meta?.durationMs===void 0&&(a.finishedAt=Date.now(),a.meta={...a.meta||{},durationMs:a.finishedAt-(a.createdAt||a.finishedAt)})):(a.status=`error`,a.error=r?.message||String(r),n.error(a.error||d(`@AGENT:对话失败`)))}finally{let n=!!e.pendingQuestion,i=a.status===`error`?`error`:`done`;r.end(l),t===e.nonce&&(e.isStreaming=!1,e.pendingQuestion=null,e.answeringQuestion=!1,e.abortController=null,!h&&!n&&T({kind:i,title:e.title,detail:i===`error`&&a.error||a.content,tag:`zen-gitsync-agent-${m||e.key}`,alreadyToast:i===`error`}),e.queue.length>0&&(h||a.status===`error`?e.queuePaused=!0:n||V(e))),m&&(h&&S.add(m),Q(m)),Z().catch(()=>{})}}async function pe(e){let i=O.value;if(!i||i.isStreaming)return!1;let a=[...i.messages].reverse().find(e=>e.role===`assistant`),o=(e?.id?i.messages.find(t=>t.id===e.id):null)||a;if(!o||o.role!==`assistant`)return!1;if(a&&o.id!==a.id)return n.warning(d(`@AGENT:只能重试最后一轮`)),!1;if(!i.sessionId)return n.warning(d(`@AGENT:这条会话还没在服务端建立,请重新发送消息`)),!1;let s=u.value.find(e=>e.sessionId===i.sessionId)?.engine||P.value;if(s!==`gai`)return n.warning(d(`@AGENT:该会话由外部 CLI 引擎运行,不支持重试上一轮,请重新发送`)),!1;o.content=``,o.reasoning=void 0,o.reasoningStatus=void 0,o.reasoningStartedAt=void 0,o.reasoningEndedAt=void 0,o.error=``,o.status=`pending`,o.finishedAt=void 0,o.meta&&={...o.meta,durationMs:void 0},i.nonce+=1;let c=i.nonce;i.abortController=new AbortController;let f=i.abortController;i.pendingQuestion=null,i.answeringQuestion=!1,i.isStreaming=!0;let p=`${l}:${i.key}:${c}`;return r.begin(p),await fe(i,c,f,o,p,{sessionId:i.sessionId||``,resume:!0,cwd:t.currentDirectory||``,engine:s,...i.lastSendOptions?.openFilePath?{openFilePath:i.lastSendOptions.openFilePath}:{},...i.lastSendOptions?.dirStatus?.length?{dirStatus:i.lastSendOptions.dirStatus}:{},...i.lastSendOptions?.dirSummary?{dirSummary:i.lastSendOptions.dirSummary}:{},...i.lastSendOptions?.allowDispatch?{allowDispatch:!0,dispatchExecutor:i.lastSendOptions.dispatchExecutor||``,dispatchUseDefaultPrompt:i.lastSendOptions.dispatchUseDefaultPrompt!==!1}:{}}),!0}async function me(e){let t=O.value,r=t?.pendingQuestion,i=t?.sessionId,a=(Array.isArray(e)?e:[e]).map(e=>String(e??``).trim()).filter(Boolean);if(!t||!r||!i||!a.length||t.answeringQuestion)return!1;t.answeringQuestion=!0;try{let e=await fetch(`/api/agent/respond`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:i,interactionId:r.interactionId,answer:r.multiple?a:a[0]})}).then(e=>e.json());if(!e.success)throw Error(e.error||d(`@AGENT:回答提交失败`));return t.pendingQuestion=null,!0}catch(e){return n.error(e?.message||d(`@AGENT:回答提交失败`)),!1}finally{t.answeringQuestion=!1}}function he(){let e=O.value;e?.abortController&&(e.abortController.abort(),e.abortController=null)}return{sessions:u,sessionsLoading:f,currentSessionId:v,messages:k,displayMessages:j,isStreaming:ee,sessionLoading:y,pendingQuestion:F,questionPanel:L,answeringQuestion:I,isSessionGenerating:G,contextUsage:M,inputContextUsage:N,queuedMessages:z,queuePaused:R,removeQueuedMessage:B,flushQueued:H,currentEngine:P,pendingEngine:p,isEngineLocked:re,pickEngine:h,loadSessions:Z,loadSession:ce,deleteSession:le,renameSession:ue,newSession:de,sendMessage:$,retryTurn:pe,answerQuestion:me,stop:he}}var Y=`data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2032%2032'%20fill='none'%3e%3crect%20x='2'%20y='6'%20width='27'%20height='23'%20rx='6'%20fill='%235364E8'/%3e%3cpath%20d='M9.419%2012.581a1.3%201.3%200%200%200-1.838%201.838L11.162%2018l-3.581%203.581a1.3%201.3%200%200%200%201.838%201.838l4.5-4.5a1.3%201.3%200%200%200%200-1.838Z'%20fill='%23FFFFFF'/%3e%3crect%20x='15.7'%20y='21.2'%20width='7.6'%20height='2.6'%20rx='1.3'%20fill='%23FFFFFF'/%3e%3cpath%20d='M25%20.4%2027.115%204.885%2031.6%207l-4.485%202.115L25%2013.6l-2.115-4.485L18.4%207l4.485-2.115Z'%20fill='%23FFFFFF'/%3e%3cpath%20d='M25%202.5%2026.22%205.78%2029.5%207l-3.28%201.22L25%2011.5l-1.22-3.28L20.5%207l3.28-1.22Z'%20fill='%2339D7B5'/%3e%3c/svg%3e`;function X(e){if(!e)return``;try{let t=new Date(e);if(Number.isNaN(t.getTime()))return e;let n=new Date,r=n.getTime()-t.getTime(),i=e=>String(e).padStart(2,`0`);if(t.toDateString()===n.toDateString())return`${i(t.getHours())}:${i(t.getMinutes())}`;if(r<6048e5){let e=Math.floor(r/864e5);return e===0?d(`@AGENT:今天`):`${e}${d(`@AGENT:天前`)}`}return`${t.getFullYear()}-${i(t.getMonth()+1)}-${i(t.getDate())}`}catch{return e}}function Z(e,t){return e.map(e=>({id:e.sessionId,title:e.title||d(`@AGENT:无标题`),meta:`${X(e.updatedAt)} · ${e.messageCount??0} ${d(`@AGENT:条`)}`,generatingText:e.isGenerating||t(e.sessionId)?d(`@AGENT:正在生成中...`):``,badge:e.source===`cli`?`CLI`:``,searchText:e.model}))}function se(){return{newConversation:d(`@AGENT:新建会话`),searchPlaceholder:d(`@AGENT:搜索会话...`),empty:d(`@AGENT:暂无会话`),emptyHint:d(`@AGENT:点击上方按钮开始对话`),noResult:d(`@AGENT:未找到匹配的会话`),loading:d(`@AGENT:加载会话中...`),rename:d(`@AGENT:重命名`),delete:d(`@AGENT:删除`),untitled:d(`@AGENT:无标题`),collapse:d(`@AGENT:收起会话列表`),expand:d(`@AGENT:展开会话列表`)}}var Q=`g ai`,ce=Y,le={enable:!0},ue={enable:!0,items:[`duration`],visibility:`always`};function de(){return{title:d(`@AGENT:等待你的回答`),placeholder:d(`@AGENT:输入回答`),submit:d(`@AGENT:提交回答`),answered:d(`@AGENT:已回答`),expand:d(`@AGENT:展开完整问答`),collapse:d(`@AGENT:收起完整问答`)}}function $(){return{title:d(`@AGENT:排队中`),hint:d(`@AGENT:本轮结束后依次发送`),pausedHint:d(`@AGENT:已暂停,点「立即发送」继续`),send:d(`@AGENT:加入队列`),flush:d(`@AGENT:立即发送`),remove:d(`@AGENT:移出队列`)}}export{se as a,Z as c,V as d,O as f,ee as h,le as i,H as l,j as m,Q as n,de as o,D as p,ue as r,$ as s,ce as t,J as u};
10
+ [`+d(`@AGENT:已停止`)+`]`,o.status=`done`,o.reasoningStatus===`streaming`&&(o.reasoningStatus=`done`),o.meta?.durationMs===void 0&&(o.finishedAt=Date.now(),o.meta={...o.meta||{},durationMs:o.finishedAt-(o.createdAt||o.finishedAt)});else{o.status=`error`;let e=i?.message||String(i);o.error=d(`@AGENT:连接中断,本轮进度已保留;点「重试」接着跑。原因:{reason}`,{reason:e}),o.reasoningStatus===`streaming`&&(o.reasoningStatus=`done`),r.error(o.error||d(`@AGENT:对话失败`))}}finally{let n=!!e.pendingQuestion,r=o.status===`error`?`error`:`done`;a.end(l),t===e.nonce&&(e.isStreaming=!1,e.pendingQuestion=null,e.answeringQuestion=!1,e.abortController=null,!h&&!n&&T({kind:r,title:e.title,detail:r===`error`&&o.error||o.content,tag:`zen-gitsync-agent-${m||e.key}`,alreadyToast:r===`error`}),e.queue.length>0&&(h||o.status===`error`?e.queuePaused=!0:n||V(e))),m&&(h&&S.add(m),Q(m)),Z().catch(()=>{})}}async function pe(e){let n=O.value;if(!n||n.isStreaming)return!1;let i=[...n.messages].reverse().find(e=>e.role===`assistant`),o=(e?.id?n.messages.find(t=>t.id===e.id):null)||i;if(!o||o.role!==`assistant`)return!1;if(i&&o.id!==i.id)return r.warning(d(`@AGENT:只能重试最后一轮`)),!1;if(!n.sessionId)return r.warning(d(`@AGENT:这条会话还没在服务端建立,请重新发送消息`)),!1;let s=u.value.find(e=>e.sessionId===n.sessionId)?.engine||P.value;if(s!==`gai`)return r.warning(d(`@AGENT:该会话由外部 CLI 引擎运行,不支持重试上一轮,请重新发送`)),!1;o.content=``,o.reasoning=void 0,o.reasoningStatus=void 0,o.reasoningStartedAt=void 0,o.reasoningEndedAt=void 0,o.error=``,o.status=`pending`,o.finishedAt=void 0,o.meta&&={...o.meta,durationMs:void 0},n.nonce+=1;let c=n.nonce;n.abortController=new AbortController;let f=n.abortController;n.pendingQuestion=null,n.answeringQuestion=!1,n.isStreaming=!0;let p=`${l}:${n.key}:${c}`;return a.begin(p),await fe(n,c,f,o,p,{sessionId:n.sessionId||``,resume:!0,cwd:t.currentDirectory||``,engine:s,...n.lastSendOptions?.openFilePath?{openFilePath:n.lastSendOptions.openFilePath}:{},...n.lastSendOptions?.dirStatus?.length?{dirStatus:n.lastSendOptions.dirStatus}:{},...n.lastSendOptions?.dirSummary?{dirSummary:n.lastSendOptions.dirSummary}:{},...n.lastSendOptions?.allowDispatch?{allowDispatch:!0,dispatchExecutor:n.lastSendOptions.dispatchExecutor||``,dispatchUseDefaultPrompt:n.lastSendOptions.dispatchUseDefaultPrompt!==!1}:{}}),!0}async function me(e){let t=O.value,n=t?.pendingQuestion,i=t?.sessionId,a=(Array.isArray(e)?e:[e]).map(e=>String(e??``).trim()).filter(Boolean);if(!t||!n||!i||!a.length||t.answeringQuestion)return!1;t.answeringQuestion=!0;try{let e=await fetch(`/api/agent/respond`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:i,interactionId:n.interactionId,answer:n.multiple?a:a[0]})}).then(e=>e.json());if(!e.success)throw Error(e.error||d(`@AGENT:回答提交失败`));return t.pendingQuestion=null,!0}catch(e){return r.error(e?.message||d(`@AGENT:回答提交失败`)),!1}finally{t.answeringQuestion=!1}}function he(){let e=O.value;e?.abortController&&(e.abortController.abort(),e.abortController=null)}return{sessions:u,sessionsLoading:f,currentSessionId:v,messages:k,displayMessages:j,isStreaming:ee,sessionLoading:y,pendingQuestion:F,questionPanel:L,answeringQuestion:I,isSessionGenerating:G,contextUsage:M,inputContextUsage:N,queuedMessages:z,queuePaused:R,removeQueuedMessage:B,flushQueued:H,currentEngine:P,pendingEngine:p,isEngineLocked:re,pickEngine:h,loadSessions:Z,loadSession:ce,deleteSession:le,renameSession:ue,newSession:de,sendMessage:$,retryTurn:pe,answerQuestion:me,stop:he}}var Y=`data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2032%2032'%20fill='none'%3e%3crect%20x='2'%20y='6'%20width='27'%20height='23'%20rx='6'%20fill='%235364E8'/%3e%3cpath%20d='M9.419%2012.581a1.3%201.3%200%200%200-1.838%201.838L11.162%2018l-3.581%203.581a1.3%201.3%200%200%200%201.838%201.838l4.5-4.5a1.3%201.3%200%200%200%200-1.838Z'%20fill='%23FFFFFF'/%3e%3crect%20x='15.7'%20y='21.2'%20width='7.6'%20height='2.6'%20rx='1.3'%20fill='%23FFFFFF'/%3e%3cpath%20d='M25%20.4%2027.115%204.885%2031.6%207l-4.485%202.115L25%2013.6l-2.115-4.485L18.4%207l4.485-2.115Z'%20fill='%23FFFFFF'/%3e%3cpath%20d='M25%202.5%2026.22%205.78%2029.5%207l-3.28%201.22L25%2011.5l-1.22-3.28L20.5%207l3.28-1.22Z'%20fill='%2339D7B5'/%3e%3c/svg%3e`;function X(e){if(!e)return``;try{let t=new Date(e);if(Number.isNaN(t.getTime()))return e;let n=new Date,r=n.getTime()-t.getTime(),i=e=>String(e).padStart(2,`0`);if(t.toDateString()===n.toDateString())return`${i(t.getHours())}:${i(t.getMinutes())}`;if(r<6048e5){let e=Math.floor(r/864e5);return e===0?d(`@AGENT:今天`):`${e}${d(`@AGENT:天前`)}`}return`${t.getFullYear()}-${i(t.getMonth()+1)}-${i(t.getDate())}`}catch{return e}}function Z(e,t){return e.map(e=>({id:e.sessionId,title:e.title||d(`@AGENT:无标题`),meta:`${X(e.updatedAt)} · ${e.messageCount??0} ${d(`@AGENT:条`)}`,generatingText:e.isGenerating||t(e.sessionId)?d(`@AGENT:正在生成中...`):``,badge:e.source===`cli`?`CLI`:``,searchText:e.model}))}function se(){return{newConversation:d(`@AGENT:新建会话`),searchPlaceholder:d(`@AGENT:搜索会话...`),empty:d(`@AGENT:暂无会话`),emptyHint:d(`@AGENT:点击上方按钮开始对话`),noResult:d(`@AGENT:未找到匹配的会话`),loading:d(`@AGENT:加载会话中...`),rename:d(`@AGENT:重命名`),delete:d(`@AGENT:删除`),untitled:d(`@AGENT:无标题`),collapse:d(`@AGENT:收起会话列表`),expand:d(`@AGENT:展开会话列表`)}}var Q=`g ai`,ce=Y,le={enable:!0},ue={enable:!0,items:[`duration`],visibility:`always`};function de(){return{title:d(`@AGENT:等待你的回答`),placeholder:d(`@AGENT:输入回答`),submit:d(`@AGENT:提交回答`),answered:d(`@AGENT:已回答`),expand:d(`@AGENT:展开完整问答`),collapse:d(`@AGENT:收起完整问答`)}}function $(){return{title:d(`@AGENT:排队中`),hint:d(`@AGENT:本轮结束后依次发送`),pausedHint:d(`@AGENT:已暂停,点「立即发送」继续`),send:d(`@AGENT:加入队列`),flush:d(`@AGENT:立即发送`),remove:d(`@AGENT:移出队列`)}}export{se as a,Z as c,V as d,O as f,ee as h,le as i,H as l,j as m,Q as n,de as o,D as p,ue as r,$ as s,ce as t,J as u};
@@ -1 +1 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{En as e,Vn as t,i as n,mr as r,n as i,sr as a,t as o,xr as s}from"./element-plus-CDrtgG55.js";import{S as c,h as l,v as u}from"./vendor-DYtaPSUU.js";import{a as d,n as f,r as p}from"./_plugin-vue_export-helper-BY0jlMBE.js";var m=[{id:`claude`,name:`Claude Code`},{id:`opencode`,name:`OpenCode`},{id:`codex`,name:`Codex`},{id:`codebuddy`,name:`CodeBuddy Code`},{id:`pi`,name:`Pi Agent`}];function h(e){return m.some(t=>t.id===e)}function g(e){return m.find(t=>t.id===e)?.name||m[0].name}var _={"zh-CN":i,"en-US":o};function v(e){return _[e]||i}r(),t();var ee=c(`locale`,()=>{let t=s(p()),n=e(()=>v(t.value));async function r(e){d(e),t.value=e;let n=M();n.locale!==e&&await n.saveGeneralSettings({locale:e})}return{currentLocale:t,elementPlusLocale:n,changeLocale:r}}),y=`flowdash-md-preview-theme`,b=`data-md-theme`,x=`github`,S={light:`github`,dark:`github-dark`},C=`md-preview--scoped-`,w=`flowdash-md-preview-scoped-`,T=new Set,E=Object.keys(l);function D(e,t){let n=RegExp(`(?:^|[;{\\n])\\s*${t}\\s*:\\s*([^;]+);`).exec(e);return n?n[1].trim():void 0}var O=E.map(e=>{let t=u(e)||``;return{value:e,bg:D(t,`background`),fg:D(t,`color`)}});function k(e){if(typeof document>`u`)return;let t=typeof e==`string`&&e.trim()?e.trim():x,n=u(t)??u(`github`),r=document.getElementById(y);if(!n){r?.remove();return}r||(r=document.createElement(`style`),r.id=y,document.head.appendChild(r)),r.setAttribute(b,t),r.textContent!==n&&(r.textContent=n)}function A(e){let t=typeof e==`string`&&e.trim()?e.trim():x;return C+(u(t)?t:x).toLowerCase().replace(/[^a-z0-9_-]+/g,`-`)}function j(e){let t=A(e);if(typeof document>`u`||T.has(t))return t;let n=t.slice(19),r=u(n)??u(`github`);if(!r)return null;let i=document.createElement(`style`);return i.id=`${w}${n}`,i.setAttribute(b,n),i.textContent=r.replace(/\.md-preview(?![\w-])/g,`.md-preview.${t}`),document.head.appendChild(i),T.add(t),t}r(),t();var M=c(`config`,()=>{let t=s(``),r=s([]),i=s([]),o=s([]),c=s([]),l=s([]),u=s([]),p=s([]),m=s([]),g=s(!1),_=s({enabled:!1,type:`command`,refId:``}),v=s(!1),y=s(!1),b=s(``),S=s(``),C=s(``),w=s(``),T=s(!0),D=s(!1),O=s(!0),A=s(!1),j=s(!1),M=s(!0),N=s(`light`),P=s(`zh-CN`),F=s([]),I=s(1e3),L=s(8e5),R=s([]),z=s(``),B=s(null),V=s(`claude`),te=s(!0),H=s(!1),U=s(!0),W={layout:{leftRatio:.25,midRatio:.375,rightRatio:.375,topRatio:.5},layoutsByProject:{},aiDiffSummaryByProject:{},fileListViewMode:`list`,fileDiffSplitPercent:35,diffPreviewSplitPercent:55,commandConsole:{expanded:!0,useTerminal:!0,showTerminalSessions:!0,splitPercent:25},editorAutoSave:!0,fileTreeAutoRefresh:!0,editorSidebarWidth:220,mindmapDirs:[],mindmapDir:``,headerToolsHidden:[],lastTaskExecutor:null,pickerGlobalSearch:!1,markdownTheme:x,editorWorkspaceByProject:{}},G=s(JSON.parse(JSON.stringify(W))),K=s(!1);function ne(e,t=``){C.value=e||``,w.value=t||``}let re=e(()=>{let e=C.value;return e?G.value.aiDiffSummaryByProject[e]!==!1:!1});function ie(){let e=C.value;if(e&&G.value.layoutsByProject?.[e]){G.value.layout={...G.value.layoutsByProject[e]};return}}function q(e){let t=document.documentElement;e===`dark`?t.setAttribute(`data-theme`,`dark`):e===`light`?t.removeAttribute(`data-theme`):window.matchMedia(`(prefers-color-scheme: dark)`).matches?t.setAttribute(`data-theme`,`dark`):t.removeAttribute(`data-theme`)}function ae(){let e=document.documentElement.getAttribute(`data-theme`)===`dark`?`light`:`dark`;return N.value=e,q(e),Re({theme:e}).catch(e=>{console.error(`保存主题切换结果失败:`,e)}),e}q(N.value);let J=e(()=>({defaultCommitMessage:t.value,descriptionTemplates:r.value,scopeTemplates:i.value,messageTemplates:o.value,commandTemplates:c.value,lockedFiles:l.value,customCommands:u.value,orchestrations:p.value,startupItems:m.value,startupAutoRun:g.value,afterQuickPushAction:_.value,currentDirectory:C.value})),oe=e(()=>!!(b.value&&b.value.trim()));async function se(){try{let e=await fetch(`/api/config/open-file`,{method:`POST`,headers:{"Content-Type":`application/json`}}),t=await e.json().catch(()=>({}));return e.ok&&t?.success?(n.success(f(`@D50BB:已打开系统配置文件`)),!0):(n.error(`${f(`@D50BB:打开系统配置文件失败: `)}${t?.error||``}`),!1)}catch(e){return n.error(`${f(`@D50BB:打开系统配置文件失败: `)}${e.message}`),!1}}async function Y(e=!1){if(!e&&y.value&&!v.value)return console.log(f(`@D50BB:使用缓存的配置信息`)),J.value;v.value=!0;try{v.value=!0,console.log(f(`@D50BB:加载配置信息...`));let e=await fetch(`/api/config/getConfig`),a=await e.json().catch(()=>({}));if(!e.ok||a&&a.success===!1){let e=String(a?.error||f(`@D50BB:加载配置失败`)),t=String(a?.configPath||``),r=t?`\n${f(`@D50BB:配置文件`)}: ${t}`:``;return n.error(`${f(`@D50BB:加载配置失败: `)}${e}${r}`),b.value=e,S.value=t,null}if(b.value=``,S.value=``,t.value=a.defaultCommitMessage||``,r.value=a.descriptionTemplates||[],i.value=a.scopeTemplates||[],o.value=a.messageTemplates||[],c.value=a.commandTemplates||[],l.value=a.lockedFiles||[],u.value=a.customCommands||[],p.value=a.orchestrations||[],m.value=(a.startupItems||[]).map(e=>({id:String(e?.id??``),type:e?.type===`workflow`?`workflow`:`command`,refId:String(e?.refId??e?.commandId??``),createdAt:Number(e?.createdAt??Date.now()),enabled:typeof e?.enabled!=`boolean`||e.enabled})).filter(e=>e.id&&e.refId),g.value=a.startupAutoRun||!1,_.value={enabled:!!a?.afterQuickPushAction?.enabled,type:a?.afterQuickPushAction?.type===`workflow`?`workflow`:`command`,refId:String(a?.afterQuickPushAction?.refId||``).trim()},a.isStandardCommit!==void 0&&(O.value=!!a.isStandardCommit),a.skipHooks!==void 0&&(A.value=!!a.skipHooks),a.autoQuickPushOnEnter!==void 0&&(j.value=!!a.autoQuickPushOnEnter),a.autoSetDefaultMessage!==void 0&&(D.value=!!a.autoSetDefaultMessage),a.autoClosePushModal!==void 0&&(T.value=!!a.autoClosePushModal),a.pullBeforePush!==void 0&&(M.value=!!a.pullBeforePush),Array.isArray(a.models)&&(F.value=a.models),Number.isFinite(Number(a.aiMaxToolIterations))&&Number(a.aiMaxToolIterations)>0&&(I.value=Math.floor(Number(a.aiMaxToolIterations))),Number.isFinite(Number(a.aiMaxRequestTokens))&&Number(a.aiMaxRequestTokens)>0&&(L.value=Math.floor(Number(a.aiMaxRequestTokens))),Number.isFinite(Number(a?.aiRequestBudget?.maxUserChars))&&Number(a.aiRequestBudget.maxUserChars)>0&&(B.value={maxTokens:Math.floor(Number(a.aiRequestBudget.maxTokens)||0),maxChars:Math.floor(Number(a.aiRequestBudget.maxChars)||0),maxMessages:Math.floor(Number(a.aiRequestBudget.maxMessages)||0),maxUserChars:Math.floor(Number(a.aiRequestBudget.maxUserChars))}),Array.isArray(a.agentPresetPrompts)&&(R.value=a.agentPresetPrompts.filter(e=>e&&typeof e.label==`string`&&typeof e.prompt==`string`).map(e=>({id:String(e.id??``),label:e.label,prompt:e.prompt}))),h(a.taskExecutor)&&(V.value=a.taskExecutor),typeof a.agentDefaultPrompt==`string`&&(z.value=a.agentDefaultPrompt),typeof a.notifyPageOnTaskDone==`boolean`&&(te.value=a.notifyPageOnTaskDone),typeof a.notifyBrowserOnTaskDone==`boolean`&&(H.value=a.notifyBrowserOnTaskDone),typeof a.notifySoundOnTaskDone==`boolean`&&(U.value=a.notifySoundOnTaskDone),a.theme&&[`light`,`dark`,`auto`].includes(a.theme)&&(N.value=a.theme,q(a.theme)),a.locale&&[`zh-CN`,`en-US`].includes(a.locale)){P.value=a.locale,d(a.locale);let e=ee();e.currentLocale=a.locale}if(a.currentDirectory&&(C.value=a.currentDirectory),a.ui==null){let e=e=>{try{return localStorage.getItem(e)}catch{return null}},t={},n=e(`zen-gitsync-layout-left-ratio`),r=e(`zen-gitsync-layout-mid-ratio`),i=e(`zen-gitsync-layout-right-ratio`),a=e(`zen-gitsync-layout-top-ratio`);if(n||r||i||a){let e=(e,t)=>{let n=e==null?NaN:parseFloat(e);return Number.isFinite(n)?n:t};t.layout={leftRatio:e(n,W.layout.leftRatio),midRatio:e(r,W.layout.midRatio),rightRatio:e(i,W.layout.rightRatio),topRatio:e(a,W.layout.topRatio)}}let o=e(`zen-gitsync-file-list-view-mode`);(o===`list`||o===`tree`)&&(t.fileListViewMode=o);let s=e(`zen-gitsync-filediff-ratio`)??e(`fileDiff.splitPercent`);if(s!=null){let e=parseFloat(s);Number.isFinite(e)&&(t.fileDiffSplitPercent=Math.min(85,Math.max(15,e)))}let c=e(`useTerminal`),l=e(`isConsoleExpanded`),u=e(`showTerminalSessions`),d=e(`zen-gitsync-commandconsole-ratio`);if(c!==null||l!==null||u!==null||d!=null){let e=d==null?NaN:parseFloat(d);t.commandConsole={useTerminal:c!==`false`,expanded:l!==`false`,showTerminalSessions:u==null||u===`true`,splitPercent:Number.isFinite(e)?Math.min(85,Math.max(15,e)):W.commandConsole.splitPercent}}let f=e(`zen-gitsync-editor-auto-save`);f!=null&&(t.editorAutoSave=f===`true`),Object.keys(t).length>0&&(G.value={...G.value,...t}),Object.keys(t).length>0&&$(t,{immediate:!0}).catch(e=>{console.error(`迁移 UI 设置到文件失败:`,e)});try{[`zen-gitsync-theme`,`zen-gitsync-locale`,`zen-gitsync-editor-auto-save`,`zen-gitsync-file-list-view-mode`,`zen-gitsync-filediff-ratio`,`fileDiff.splitPercent`,`isConsoleExpanded`,`useTerminal`,`showTerminalSessions`,`zen-gitsync-commandconsole-ratio`,`zen-gitsync-layout-left-ratio`,`zen-gitsync-layout-mid-ratio`,`zen-gitsync-layout-right-ratio`,`zen-gitsync-layout-top-ratio`,`locale`].forEach(e=>localStorage.removeItem(e))}catch{}}else{let e=a.ui.layoutsByProject&&typeof a.ui.layoutsByProject==`object`&&!Array.isArray(a.ui.layoutsByProject)?a.ui.layoutsByProject:{},t={};for(let[n,r]of Object.entries(e))if(r&&typeof r==`object`&&!Array.isArray(r)){let e=r;t[n]={leftRatio:Number.isFinite(Number(e.leftRatio))?Number(e.leftRatio):W.layout.leftRatio,midRatio:Number.isFinite(Number(e.midRatio))?Number(e.midRatio):W.layout.midRatio,rightRatio:Number.isFinite(Number(e.rightRatio))?Number(e.rightRatio):W.layout.rightRatio,topRatio:Number.isFinite(Number(e.topRatio))?Number(e.topRatio):W.layout.topRatio}}let n=a.ui.aiDiffSummaryByProject&&typeof a.ui.aiDiffSummaryByProject==`object`&&!Array.isArray(a.ui.aiDiffSummaryByProject)?a.ui.aiDiffSummaryByProject:{},r={};for(let[e,t]of Object.entries(n))typeof t==`boolean`&&(r[e]=t);let i=a.ui.editorWorkspaceByProject&&typeof a.ui.editorWorkspaceByProject==`object`&&!Array.isArray(a.ui.editorWorkspaceByProject)?a.ui.editorWorkspaceByProject:{},o={},s=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.length>0):[];for(let[e,t]of Object.entries(i)){if(!t||typeof t!=`object`||Array.isArray(t))continue;let n=t,r=s(n.tabs).slice(0,40);o[e]={expandedDirs:s(n.expandedDirs).slice(0,200),tabs:r,activeTab:typeof n.activeTab==`string`&&r.includes(n.activeTab)?n.activeTab:null}}let c=typeof a.ui.mindmapDir==`string`?a.ui.mindmapDir.trim():``,l=[],u=new Set,d=Array.isArray(a.ui.mindmapDirs)?a.ui.mindmapDirs:[];for(let e of d){if(typeof e!=`string`)continue;let t=e.trim();if(!t)continue;let n=t.toLowerCase();u.has(n)||(u.add(n),l.push(t))}l.length===0&&c&&l.push(c);let f={...W.layout,...a.ui.layout||{}};G.value={layout:f,layoutsByProject:t,aiDiffSummaryByProject:r,fileListViewMode:a.ui.fileListViewMode===`tree`?`tree`:`list`,fileDiffSplitPercent:Number.isFinite(Number(a.ui.fileDiffSplitPercent))?Math.min(85,Math.max(15,Number(a.ui.fileDiffSplitPercent))):W.fileDiffSplitPercent,diffPreviewSplitPercent:Number.isFinite(Number(a.ui.diffPreviewSplitPercent))?Math.min(85,Math.max(25,Number(a.ui.diffPreviewSplitPercent))):W.diffPreviewSplitPercent,commandConsole:{expanded:typeof a.ui.commandConsole?.expanded==`boolean`?a.ui.commandConsole.expanded:W.commandConsole.expanded,useTerminal:typeof a.ui.commandConsole?.useTerminal==`boolean`?a.ui.commandConsole.useTerminal:W.commandConsole.useTerminal,showTerminalSessions:typeof a.ui.commandConsole?.showTerminalSessions==`boolean`?a.ui.commandConsole.showTerminalSessions:W.commandConsole.showTerminalSessions,splitPercent:Number.isFinite(Number(a.ui.commandConsole?.splitPercent))?Math.min(85,Math.max(15,Number(a.ui.commandConsole.splitPercent))):W.commandConsole.splitPercent},editorAutoSave:typeof a.ui.editorAutoSave==`boolean`?a.ui.editorAutoSave:W.editorAutoSave,fileTreeAutoRefresh:typeof a.ui.fileTreeAutoRefresh==`boolean`?a.ui.fileTreeAutoRefresh:W.fileTreeAutoRefresh,editorSidebarWidth:Number.isFinite(Number(a.ui.editorSidebarWidth))?Math.min(400,Math.max(140,Number(a.ui.editorSidebarWidth))):W.editorSidebarWidth,mindmapDirs:l,mindmapDir:c,headerToolsHidden:Array.isArray(a.ui.headerToolsHidden)?a.ui.headerToolsHidden.filter(e=>typeof e==`string`):[],lastTaskExecutor:h(a.ui.lastTaskExecutor)?a.ui.lastTaskExecutor:W.lastTaskExecutor,pickerGlobalSearch:typeof a.ui.pickerGlobalSearch==`boolean`?a.ui.pickerGlobalSearch:W.pickerGlobalSearch,markdownTheme:typeof a.ui.markdownTheme==`string`&&E.includes(a.ui.markdownTheme)?a.ui.markdownTheme:W.markdownTheme,editorWorkspaceByProject:o}}return ie(),k(G.value.markdownTheme),K.value=!0,y.value=!0,console.log(f(`@D50BB:配置信息加载完成`)),J.value}catch(e){return console.error(`加载配置失败:`,e),n.error(`${f(`@D50BB:加载配置失败: `)}${e.message}`),b.value=e.message,null}finally{v.value=!1}}async function ce(){try{await fetch(`/api/config/save-commit-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({isStandardCommit:O.value,skipHooks:A.value,autoQuickPushOnEnter:j.value,autoSetDefaultMessage:D.value,autoClosePushModal:T.value,pullBeforePush:M.value})})}catch(e){console.error(`保存提交设置失败:`,e)}}a([O,A,j,D,T,M],()=>{y.value&&ce()});let X=null,Z={};async function Q(){if(X&&=(clearTimeout(X),null),Object.keys(Z).length===0)return;let e=Z;Z={};try{await fetch(`/api/config/save-ui-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})}catch(e){console.error(`保存 UI 设置失败:`,e)}}async function $(e,t={}){if(K.value){if(t.immediate){Object.assign(Z,e),await Q();return}Object.assign(Z,e),X&&clearTimeout(X),X=setTimeout(()=>{Q()},300)}}async function le(e){h(e)&&G.value.lastTaskExecutor!==e&&(G.value.lastTaskExecutor=e,await $({lastTaskExecutor:e},{immediate:!0}))}let ue=e(()=>h(G.value.lastTaskExecutor)?G.value.lastTaskExecutor:V.value);async function de(){G.value.layout={...W.layout};let e=C.value;return e&&(G.value.layoutsByProject={...G.value.layoutsByProject,[e]:{...G.value.layout}}),await $({layoutsByProject:G.value.layoutsByProject},{immediate:!0}),G.value.layout}async function fe(e){let t=C.value;t&&(G.value.aiDiffSummaryByProject={...G.value.aiDiffSummaryByProject,[t]:e},await $({aiDiffSummaryByProject:{[t]:e}},{immediate:!0}))}async function pe(e){if(!Number.isFinite(e))return;let t=Math.min(400,Math.max(140,e));G.value.editorSidebarWidth=t,await $({editorSidebarWidth:t})}function me(e){let t=C.value;if(!t)return;let n=e.tabs.slice(0,40);G.value.editorWorkspaceByProject={...G.value.editorWorkspaceByProject,[t]:{expandedDirs:e.expandedDirs.slice(0,200),tabs:n,activeTab:e.activeTab&&n.includes(e.activeTab)?e.activeTab:null}},$({editorWorkspaceByProject:G.value.editorWorkspaceByProject})}function he(e){let t=e??C.value;return t?G.value.editorWorkspaceByProject[t]??null:null}a(()=>G.value.fileListViewMode,e=>{K.value&&$({fileListViewMode:e})}),a(()=>G.value.fileDiffSplitPercent,e=>{K.value&&$({fileDiffSplitPercent:e})}),a(()=>G.value.diffPreviewSplitPercent,e=>{K.value&&e!=null&&$({diffPreviewSplitPercent:e})}),a(()=>G.value.editorAutoSave,e=>{K.value&&$({editorAutoSave:e})}),a(()=>G.value.fileTreeAutoRefresh,e=>{K.value&&$({fileTreeAutoRefresh:e})}),a(()=>G.value.headerToolsHidden,e=>{K.value&&Array.isArray(e)&&$({headerToolsHidden:e})}),a(()=>G.value.mindmapDirs,e=>{K.value&&Array.isArray(e)&&$({mindmapDirs:e})}),a(()=>G.value.pickerGlobalSearch,e=>{K.value&&$({pickerGlobalSearch:e})});let ge=e(()=>G.value.markdownTheme);async function _e(e){let t=E.includes(e)?e:W.markdownTheme;return G.value.markdownTheme=t,k(t),await $({markdownTheme:t},{immediate:!0}),t}a(()=>G.value.markdownTheme,e=>{K.value&&typeof e==`string`&&e&&(k(e),$({markdownTheme:e}))}),a(()=>G.value.layout,e=>{if(!K.value)return;let t=C.value;t&&(G.value.layoutsByProject={...G.value.layoutsByProject,[t]:e},$({layoutsByProject:G.value.layoutsByProject}))},{deep:!0}),a(()=>G.value.commandConsole,e=>{K.value&&$({commandConsole:e})},{deep:!0}),typeof window<`u`&&window.addEventListener(`beforeunload`,()=>{Q()});async function ve(e){try{let r=await(await fetch(`/api/config/saveDefaultMessage`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({defaultCommitMessage:e})})).json();return r.success?(t.value=e,n.success(f(`@D50BB:默认提交信息已保存`)),!0):(n.error(`${f(`@D50BB:保存失败: `)}${r.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:保存失败: `)}${e.message}`),!1}}async function ye(e){try{let t=await(await fetch(`/api/config/save-after-quick-push-action`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({afterQuickPushAction:{enabled:!!e?.enabled,type:e?.type===`workflow`?`workflow`:`command`,refId:String(e?.refId||``).trim()}})})).json();return t.success?(_.value={enabled:!!e?.enabled,type:e?.type===`workflow`?`workflow`:`command`,refId:String(e?.refId||``).trim()},!0):(n.error(`保存提交后启动项失败: ${t.error}`),!1)}catch(e){return n.error(`保存提交后启动项失败: ${e.message}`),!1}}async function be(e,t){try{let a=await(await fetch(`/api/config/save-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return a.success?(t===`description`?r.value.includes(e)||r.value.push(e):t===`scope`?i.value.includes(e)||i.value.push(e):t===`message`?o.value.includes(e)||o.value.push(e):t===`command`&&(c.value.includes(e)||c.value.push(e)),n.success(f(`@D50BB:模板已保存`)),!0):(n.error(`${f(`@D50BB:保存模板失败: `)}${a.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:保存模板失败: `)}${e.message}`),!1}}async function xe(e,t){try{let a=await(await fetch(`/api/config/delete-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return a.success?(t===`description`?r.value=r.value.filter(t=>t!==e):t===`scope`?i.value=i.value.filter(t=>t!==e):t===`message`?o.value=o.value.filter(t=>t!==e):t===`command`&&(c.value=c.value.filter(t=>t!==e)),n.success(f(`@D50BB:模板已删除`)),!0):(n.error(`${f(`@D50BB:删除模板失败: `)}${a.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:删除模板失败: `)}${e.message}`),!1}}async function Se(e,t,a){try{let s=await(await fetch(`/api/config/update-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({oldTemplate:e,newTemplate:t,type:a})})).json();if(s.success){if(a===`description`){let n=r.value.indexOf(e);n!==-1&&(r.value[n]=t)}else if(a===`scope`){let n=i.value.indexOf(e);n!==-1&&(i.value[n]=t)}else if(a===`message`){let n=o.value.indexOf(e);n!==-1&&(o.value[n]=t)}else if(a===`command`){let n=c.value.indexOf(e);n!==-1&&(c.value[n]=t)}return n.success(f(`@D50BB:模板已更新`)),!0}return n.error(`${f(`@D50BB:更新模板失败: `)}${s.error}`),!1}catch(e){return n.error(`${f(`@D50BB:更新模板失败: `)}${e.message}`),!1}}async function Ce(e,t){try{let a=await(await fetch(`/api/config/pin-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return a.success?(t===`description`?(r.value=r.value.filter(t=>t!==e),r.value.unshift(e)):t===`scope`?(i.value=i.value.filter(t=>t!==e),i.value.unshift(e)):t===`message`?(o.value=o.value.filter(t=>t!==e),o.value.unshift(e)):t===`command`&&(c.value=c.value.filter(t=>t!==e),c.value.unshift(e)),n.success(f(`@D50BB:模板已置顶`)),!0):(n.error(`${f(`@D50BB:置顶模板失败: `)}${a.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:置顶模板失败: `)}${e.message}`),!1}}async function we(){try{let e=await(await fetch(`/api/locked-files`)).json();return e.success?(l.value=e.lockedFiles||[],e.lockedFiles):(n.error(`${f(`@D50BB:加载锁定文件列表失败: `)}${e.error}`),[])}catch(e){return console.error(`加载锁定文件列表失败:`,e),n.error(`${f(`@D50BB:加载锁定文件列表失败: `)}${e.message}`),[]}}async function Te(e){try{let t=await(await fetch(`/api/lock-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?(await we(),n.success(`${f(`@D50BB:文件已锁定: `)}${e}`),!0):(n.error(`${f(`@D50BB:锁定文件失败: `)}${t.error}`),!1)}catch(e){return console.error(`锁定文件失败:`,e),n.error(`${f(`@D50BB:锁定文件失败: `)}${e.message}`),!1}}async function Ee(e){try{let t=await(await fetch(`/api/unlock-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?(await we(),n.success(`${f(`@D50BB:文件已解锁: `)}${e}`),!0):(n.error(`${f(`@D50BB:解锁文件失败: `)}${t.error}`),!1)}catch(e){return console.error(`解锁文件失败:`,e),n.error(`${f(`@D50BB:解锁文件失败: `)}${e.message}`),!1}}async function De(e){try{let t=await(await fetch(`/api/check-file-lock`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?t.isLocked:(console.error(`检查文件锁定状态失败:`,t.error),!1)}catch(e){return console.error(`检查文件锁定状态失败:`,e),!1}}async function Oe(e){try{let t=await(await fetch(`/api/config/save-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({command:e})})).json();return t.success?(await Y(!0),n.success(f(`@CMD01:命令已保存`)),!0):(n.error(`${f(`@CMD01:保存命令失败: `)}${t.error}`),!1)}catch(e){return n.error(`${f(`@CMD01:保存命令失败: `)}${e.message}`),!1}}async function ke(e){try{let t=await(await fetch(`/api/config/delete-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e})})).json();return t.success?(await Y(!0),n.success(f(`@CMD01:命令已删除`)),!0):(n.error(`${f(`@CMD01:删除命令失败: `)}${t.error}`),!1)}catch(e){return n.error(`${f(`@CMD01:删除命令失败: `)}${e.message}`),!1}}async function Ae(e,t){try{let r=await(await fetch(`/api/config/update-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e,command:t})})).json();return r.success?(await Y(!0),n.success(f(`@CMD01:命令已更新`)),!0):(n.error(`${f(`@CMD01:更新命令失败: `)}${r.error}`),!1)}catch(e){return n.error(`${f(`@CMD01:更新命令失败: `)}${e.message}`),!1}}async function je(e){try{let t=await(await fetch(`/api/config/pin-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e})})).json();return t.success?(await Y(!0),!0):(n.error(t.error),!1)}catch(e){return n.error(e.message),!1}}async function Me(e){try{let t=await(await fetch(`/api/config/save-orchestration`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({orchestration:e})})).json();return t.success?(await Y(!0),n.success(f(`@ORCH:编排已保存`)),t.orchestration||null):(n.error(`${f(`@ORCH:保存编排失败: `)}${t.error}`),null)}catch(e){return n.error(`${f(`@ORCH:保存编排失败: `)}${e.message}`),null}}async function Ne(e){try{let t=await(await fetch(`/api/config/delete-orchestration`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e})})).json();return t.success?(await Y(!0),n.success(f(`@ORCH:编排已删除`)),!0):(n.error(`${f(`@ORCH:删除编排失败: `)}${t.error}`),!1)}catch(e){return n.error(`${f(`@ORCH:删除编排失败: `)}${e.message}`),!1}}async function Pe(e,t){try{let r=await(await fetch(`/api/config/update-orchestration`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e,orchestration:t})})).json();return r.success?(await Y(!0),n.success(f(`@ORCH:编排已更新`)),!0):(n.error(`${f(`@ORCH:更新编排失败: `)}${r.error}`),!1)}catch(e){return n.error(`${f(`@ORCH:更新编排失败: `)}${e.message}`),!1}}async function Fe(e,t){try{let r=await(await fetch(`/api/config/save-startup-items`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({startupItems:e,startupAutoRun:t===void 0?g.value:t})})).json();return r.success?(m.value=e,t!==void 0&&(g.value=t),!0):(n.error(`保存启动项失败: ${r.error}`),!1)}catch(e){return n.error(`保存启动项失败: ${e.message}`),!1}}async function Ie(e){try{let t=await(await fetch(`/api/config/save-ai-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...e.aiMaxToolIterations===void 0?{}:{aiMaxToolIterations:e.aiMaxToolIterations},...e.aiMaxRequestTokens===void 0?{}:{aiMaxRequestTokens:e.aiMaxRequestTokens},...e.agentPresetPrompts===void 0?{}:{agentPresetPrompts:e.agentPresetPrompts},...e.agentDefaultPrompt===void 0?{}:{agentDefaultPrompt:e.agentDefaultPrompt}})})).json();return t.success?(t.aiMaxToolIterations!==void 0&&(I.value=Number(t.aiMaxToolIterations)||e.aiMaxToolIterations||I.value),t.aiMaxRequestTokens!==void 0&&(L.value=Number(t.aiMaxRequestTokens)||e.aiMaxRequestTokens||L.value),t.aiRequestBudget&&Number(t.aiRequestBudget.maxUserChars)>0&&(B.value={maxTokens:Math.floor(Number(t.aiRequestBudget.maxTokens)||0),maxChars:Math.floor(Number(t.aiRequestBudget.maxChars)||0),maxMessages:Math.floor(Number(t.aiRequestBudget.maxMessages)||0),maxUserChars:Math.floor(Number(t.aiRequestBudget.maxUserChars))}),Array.isArray(t.agentPresetPrompts)&&(R.value=t.agentPresetPrompts),typeof t.agentDefaultPrompt==`string`&&(z.value=t.agentDefaultPrompt),!0):(n.error(`${f(`@D50BB:保存 AI 设置失败: `)}${t.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:保存 AI 设置失败: `)}${e.message}`),!1}}async function Le(e){try{let t=await(await fetch(`/api/config/save-models`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({models:e})})).json();return t.success?(F.value=e,!0):(n.error(`${f(`@D50BB:保存模型失败: `)}${t.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:保存模型失败: `)}${e.message}`),!1}}async function Re(e){try{let t=await(await fetch(`/api/config/save-general-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})).json();if(t.success){if(e.theme&&(N.value=e.theme,q(e.theme)),e.locale){P.value=e.locale,d(e.locale);let t=ee();t.currentLocale=e.locale}return h(e.taskExecutor)&&(V.value=e.taskExecutor),typeof e.notifyPageOnTaskDone==`boolean`&&(te.value=e.notifyPageOnTaskDone),typeof e.notifyBrowserOnTaskDone==`boolean`&&(H.value=e.notifyBrowserOnTaskDone),typeof e.notifySoundOnTaskDone==`boolean`&&(U.value=e.notifySoundOnTaskDone),!0}return n.error(`保存通用设置失败: ${t.error}`),!1}catch(e){return n.error(`保存通用设置失败: ${e.message}`),!1}}return{models:F,aiMaxToolIterations:I,aiMaxRequestTokens:L,agentPresetPrompts:R,agentDefaultPrompt:z,aiRequestBudget:B,taskExecutor:V,resolvedTaskExecutor:ue,setLastTaskExecutor:le,notifyPageOnTaskDone:te,notifyBrowserOnTaskDone:H,notifySoundOnTaskDone:U,defaultCommitMessage:t,descriptionTemplates:r,scopeTemplates:i,messageTemplates:o,commandTemplates:c,lockedFiles:l,customCommands:u,orchestrations:p,startupItems:m,startupAutoRun:g,afterQuickPushAction:_,isLoading:v,isLoaded:y,configLoadError:b,configFilePath:S,hasConfigLoadError:oe,currentDirectory:C,currentIconUrl:w,config:J,autoClosePushModal:T,autoSetDefaultMessage:D,isStandardCommit:O,skipHooks:A,autoQuickPushOnEnter:j,pullBeforePush:M,theme:N,locale:P,ui:G,isUiLoaded:K,aiDiffSummaryEnabled:re,markdownTheme:ge,loadConfig:Y,setCurrentDirectory:ne,openSystemConfigFile:se,saveTemplate:be,saveModels:Le,saveAiSettings:Ie,saveGeneralSettings:Re,saveUiSettings:$,setAiDiffSummaryEnabled:fe,setEditorSidebarWidth:pe,saveEditorWorkspace:me,getEditorWorkspace:he,setMarkdownTheme:_e,resetUiLayout:de,applyTheme:q,toggleTheme:ae,saveDefaultMessage:ve,deleteTemplate:xe,updateTemplate:Se,pinTemplate:Ce,loadLockedFiles:we,lockFile:Te,unlockFile:Ee,isFileLocked:De,saveCustomCommand:Oe,deleteCustomCommand:ke,updateCustomCommand:Ae,pinCustomCommand:je,saveOrchestration:Me,deleteOrchestration:Ne,updateOrchestration:Pe,saveStartupItems:Fe,saveAfterQuickPushAction:ye,saveCommitSettings:ce}});export{A as a,h as c,j as i,g as l,S as n,ee as o,O as r,m as s,M as t};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{Dn as e,Hn as t,Sr as n,a as r,cr as i,hr as a,n as o,t as s}from"./element-plus-DgSY_Wt4.js";import{S as c,h as l,v as u}from"./vendor-CZlKgriV.js";import{a as d,n as f,r as p}from"./_plugin-vue_export-helper-bQQyMRS6.js";var m=[{id:`claude`,name:`Claude Code`},{id:`opencode`,name:`OpenCode`},{id:`codex`,name:`Codex`},{id:`codebuddy`,name:`CodeBuddy Code`},{id:`pi`,name:`Pi Agent`}];function h(e){return m.some(t=>t.id===e)}function g(e){return m.find(t=>t.id===e)?.name||m[0].name}var _={"zh-CN":o,"en-US":s};function v(e){return _[e]||o}a(),t();var ee=c(`locale`,()=>{let t=n(p()),r=e(()=>v(t.value));async function i(e){d(e),t.value=e;let n=M();n.locale!==e&&await n.saveGeneralSettings({locale:e})}return{currentLocale:t,elementPlusLocale:r,changeLocale:i}}),y=`flowdash-md-preview-theme`,b=`data-md-theme`,x=`github`,S={light:`github`,dark:`github-dark`},C=`md-preview--scoped-`,w=`flowdash-md-preview-scoped-`,T=new Set,E=Object.keys(l);function D(e,t){let n=RegExp(`(?:^|[;{\\n])\\s*${t}\\s*:\\s*([^;]+);`).exec(e);return n?n[1].trim():void 0}var O=E.map(e=>{let t=u(e)||``;return{value:e,bg:D(t,`background`),fg:D(t,`color`)}});function k(e){if(typeof document>`u`)return;let t=typeof e==`string`&&e.trim()?e.trim():x,n=u(t)??u(`github`),r=document.getElementById(y);if(!n){r?.remove();return}r||(r=document.createElement(`style`),r.id=y,document.head.appendChild(r)),r.setAttribute(b,t),r.textContent!==n&&(r.textContent=n)}function A(e){let t=typeof e==`string`&&e.trim()?e.trim():x;return C+(u(t)?t:x).toLowerCase().replace(/[^a-z0-9_-]+/g,`-`)}function j(e){let t=A(e);if(typeof document>`u`||T.has(t))return t;let n=t.slice(19),r=u(n)??u(`github`);if(!r)return null;let i=document.createElement(`style`);return i.id=`${w}${n}`,i.setAttribute(b,n),i.textContent=r.replace(/\.md-preview(?![\w-])/g,`.md-preview.${t}`),document.head.appendChild(i),T.add(t),t}a(),t();var M=c(`config`,()=>{let t=n(``),a=n([]),o=n([]),s=n([]),c=n([]),l=n([]),u=n([]),p=n([]),m=n([]),g=n(!1),_=n({enabled:!1,type:`command`,refId:``}),v=n(!1),y=n(!1),b=n(``),S=n(``),C=n(``),w=n(``),T=n(!0),D=n(!1),O=n(!0),A=n(!1),j=n(!1),M=n(!0),N=n(`light`),P=n(`zh-CN`),F=n([]),I=n(1e3),L=n(8e5),R=n([]),z=n(``),B=n(null),V=n(`claude`),te=n(!0),H=n(!1),U=n(!0),W={layout:{leftRatio:.25,midRatio:.375,rightRatio:.375,topRatio:.5},layoutsByProject:{},aiDiffSummaryByProject:{},fileListViewMode:`list`,fileDiffSplitPercent:35,diffPreviewSplitPercent:55,commandConsole:{expanded:!0,useTerminal:!0,showTerminalSessions:!0,splitPercent:25},editorAutoSave:!0,fileTreeAutoRefresh:!0,editorSidebarWidth:220,mindmapDirs:[],mindmapDir:``,headerToolsHidden:[],lastTaskExecutor:null,pickerGlobalSearch:!1,markdownTheme:x,editorWorkspaceByProject:{}},G=n(JSON.parse(JSON.stringify(W))),K=n(!1);function ne(e,t=``){C.value=e||``,w.value=t||``}let re=e(()=>{let e=C.value;return e?G.value.aiDiffSummaryByProject[e]!==!1:!1});function ie(){let e=C.value;if(e&&G.value.layoutsByProject?.[e]){G.value.layout={...G.value.layoutsByProject[e]};return}}function q(e){let t=document.documentElement;e===`dark`?t.setAttribute(`data-theme`,`dark`):e===`light`?t.removeAttribute(`data-theme`):window.matchMedia(`(prefers-color-scheme: dark)`).matches?t.setAttribute(`data-theme`,`dark`):t.removeAttribute(`data-theme`)}function ae(){let e=document.documentElement.getAttribute(`data-theme`)===`dark`?`light`:`dark`;return N.value=e,q(e),Re({theme:e}).catch(e=>{console.error(`保存主题切换结果失败:`,e)}),e}q(N.value);let J=e(()=>({defaultCommitMessage:t.value,descriptionTemplates:a.value,scopeTemplates:o.value,messageTemplates:s.value,commandTemplates:c.value,lockedFiles:l.value,customCommands:u.value,orchestrations:p.value,startupItems:m.value,startupAutoRun:g.value,afterQuickPushAction:_.value,currentDirectory:C.value})),oe=e(()=>!!(b.value&&b.value.trim()));async function se(){try{let e=await fetch(`/api/config/open-file`,{method:`POST`,headers:{"Content-Type":`application/json`}}),t=await e.json().catch(()=>({}));return e.ok&&t?.success?(r.success(f(`@D50BB:已打开系统配置文件`)),!0):(r.error(`${f(`@D50BB:打开系统配置文件失败: `)}${t?.error||``}`),!1)}catch(e){return r.error(`${f(`@D50BB:打开系统配置文件失败: `)}${e.message}`),!1}}async function Y(e=!1){if(!e&&y.value&&!v.value)return console.log(f(`@D50BB:使用缓存的配置信息`)),J.value;v.value=!0;try{v.value=!0,console.log(f(`@D50BB:加载配置信息...`));let e=await fetch(`/api/config/getConfig`),n=await e.json().catch(()=>({}));if(!e.ok||n&&n.success===!1){let e=String(n?.error||f(`@D50BB:加载配置失败`)),t=String(n?.configPath||``),i=t?`\n${f(`@D50BB:配置文件`)}: ${t}`:``;return r.error(`${f(`@D50BB:加载配置失败: `)}${e}${i}`),b.value=e,S.value=t,null}if(b.value=``,S.value=``,t.value=n.defaultCommitMessage||``,a.value=n.descriptionTemplates||[],o.value=n.scopeTemplates||[],s.value=n.messageTemplates||[],c.value=n.commandTemplates||[],l.value=n.lockedFiles||[],u.value=n.customCommands||[],p.value=n.orchestrations||[],m.value=(n.startupItems||[]).map(e=>({id:String(e?.id??``),type:e?.type===`workflow`?`workflow`:`command`,refId:String(e?.refId??e?.commandId??``),createdAt:Number(e?.createdAt??Date.now()),enabled:typeof e?.enabled!=`boolean`||e.enabled})).filter(e=>e.id&&e.refId),g.value=n.startupAutoRun||!1,_.value={enabled:!!n?.afterQuickPushAction?.enabled,type:n?.afterQuickPushAction?.type===`workflow`?`workflow`:`command`,refId:String(n?.afterQuickPushAction?.refId||``).trim()},n.isStandardCommit!==void 0&&(O.value=!!n.isStandardCommit),n.skipHooks!==void 0&&(A.value=!!n.skipHooks),n.autoQuickPushOnEnter!==void 0&&(j.value=!!n.autoQuickPushOnEnter),n.autoSetDefaultMessage!==void 0&&(D.value=!!n.autoSetDefaultMessage),n.autoClosePushModal!==void 0&&(T.value=!!n.autoClosePushModal),n.pullBeforePush!==void 0&&(M.value=!!n.pullBeforePush),Array.isArray(n.models)&&(F.value=n.models),Number.isFinite(Number(n.aiMaxToolIterations))&&Number(n.aiMaxToolIterations)>0&&(I.value=Math.floor(Number(n.aiMaxToolIterations))),Number.isFinite(Number(n.aiMaxRequestTokens))&&Number(n.aiMaxRequestTokens)>0&&(L.value=Math.floor(Number(n.aiMaxRequestTokens))),Number.isFinite(Number(n?.aiRequestBudget?.maxUserChars))&&Number(n.aiRequestBudget.maxUserChars)>0&&(B.value={maxTokens:Math.floor(Number(n.aiRequestBudget.maxTokens)||0),maxChars:Math.floor(Number(n.aiRequestBudget.maxChars)||0),maxMessages:Math.floor(Number(n.aiRequestBudget.maxMessages)||0),maxUserChars:Math.floor(Number(n.aiRequestBudget.maxUserChars))}),Array.isArray(n.agentPresetPrompts)&&(R.value=n.agentPresetPrompts.filter(e=>e&&typeof e.label==`string`&&typeof e.prompt==`string`).map(e=>({id:String(e.id??``),label:e.label,prompt:e.prompt}))),h(n.taskExecutor)&&(V.value=n.taskExecutor),typeof n.agentDefaultPrompt==`string`&&(z.value=n.agentDefaultPrompt),typeof n.notifyPageOnTaskDone==`boolean`&&(te.value=n.notifyPageOnTaskDone),typeof n.notifyBrowserOnTaskDone==`boolean`&&(H.value=n.notifyBrowserOnTaskDone),typeof n.notifySoundOnTaskDone==`boolean`&&(U.value=n.notifySoundOnTaskDone),n.theme&&[`light`,`dark`,`auto`].includes(n.theme)&&(N.value=n.theme,q(n.theme)),n.locale&&[`zh-CN`,`en-US`].includes(n.locale)){P.value=n.locale,d(n.locale);let e=ee();e.currentLocale=n.locale}if(n.currentDirectory&&(C.value=n.currentDirectory),n.ui==null){let e=e=>{try{return localStorage.getItem(e)}catch{return null}},t={},n=e(`zen-gitsync-layout-left-ratio`),r=e(`zen-gitsync-layout-mid-ratio`),i=e(`zen-gitsync-layout-right-ratio`),a=e(`zen-gitsync-layout-top-ratio`);if(n||r||i||a){let e=(e,t)=>{let n=e==null?NaN:parseFloat(e);return Number.isFinite(n)?n:t};t.layout={leftRatio:e(n,W.layout.leftRatio),midRatio:e(r,W.layout.midRatio),rightRatio:e(i,W.layout.rightRatio),topRatio:e(a,W.layout.topRatio)}}let o=e(`zen-gitsync-file-list-view-mode`);(o===`list`||o===`tree`)&&(t.fileListViewMode=o);let s=e(`zen-gitsync-filediff-ratio`)??e(`fileDiff.splitPercent`);if(s!=null){let e=parseFloat(s);Number.isFinite(e)&&(t.fileDiffSplitPercent=Math.min(85,Math.max(15,e)))}let c=e(`useTerminal`),l=e(`isConsoleExpanded`),u=e(`showTerminalSessions`),d=e(`zen-gitsync-commandconsole-ratio`);if(c!==null||l!==null||u!==null||d!=null){let e=d==null?NaN:parseFloat(d);t.commandConsole={useTerminal:c!==`false`,expanded:l!==`false`,showTerminalSessions:u==null||u===`true`,splitPercent:Number.isFinite(e)?Math.min(85,Math.max(15,e)):W.commandConsole.splitPercent}}let f=e(`zen-gitsync-editor-auto-save`);f!=null&&(t.editorAutoSave=f===`true`),Object.keys(t).length>0&&(G.value={...G.value,...t}),Object.keys(t).length>0&&$(t,{immediate:!0}).catch(e=>{console.error(`迁移 UI 设置到文件失败:`,e)});try{[`zen-gitsync-theme`,`zen-gitsync-locale`,`zen-gitsync-editor-auto-save`,`zen-gitsync-file-list-view-mode`,`zen-gitsync-filediff-ratio`,`fileDiff.splitPercent`,`isConsoleExpanded`,`useTerminal`,`showTerminalSessions`,`zen-gitsync-commandconsole-ratio`,`zen-gitsync-layout-left-ratio`,`zen-gitsync-layout-mid-ratio`,`zen-gitsync-layout-right-ratio`,`zen-gitsync-layout-top-ratio`,`locale`].forEach(e=>localStorage.removeItem(e))}catch{}}else{let e=n.ui.layoutsByProject&&typeof n.ui.layoutsByProject==`object`&&!Array.isArray(n.ui.layoutsByProject)?n.ui.layoutsByProject:{},t={};for(let[n,r]of Object.entries(e))if(r&&typeof r==`object`&&!Array.isArray(r)){let e=r;t[n]={leftRatio:Number.isFinite(Number(e.leftRatio))?Number(e.leftRatio):W.layout.leftRatio,midRatio:Number.isFinite(Number(e.midRatio))?Number(e.midRatio):W.layout.midRatio,rightRatio:Number.isFinite(Number(e.rightRatio))?Number(e.rightRatio):W.layout.rightRatio,topRatio:Number.isFinite(Number(e.topRatio))?Number(e.topRatio):W.layout.topRatio}}let r=n.ui.aiDiffSummaryByProject&&typeof n.ui.aiDiffSummaryByProject==`object`&&!Array.isArray(n.ui.aiDiffSummaryByProject)?n.ui.aiDiffSummaryByProject:{},i={};for(let[e,t]of Object.entries(r))typeof t==`boolean`&&(i[e]=t);let a=n.ui.editorWorkspaceByProject&&typeof n.ui.editorWorkspaceByProject==`object`&&!Array.isArray(n.ui.editorWorkspaceByProject)?n.ui.editorWorkspaceByProject:{},o={},s=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.length>0):[];for(let[e,t]of Object.entries(a)){if(!t||typeof t!=`object`||Array.isArray(t))continue;let n=t,r=s(n.tabs).slice(0,40);o[e]={expandedDirs:s(n.expandedDirs).slice(0,200),tabs:r,activeTab:typeof n.activeTab==`string`&&r.includes(n.activeTab)?n.activeTab:null}}let c=typeof n.ui.mindmapDir==`string`?n.ui.mindmapDir.trim():``,l=[],u=new Set,d=Array.isArray(n.ui.mindmapDirs)?n.ui.mindmapDirs:[];for(let e of d){if(typeof e!=`string`)continue;let t=e.trim();if(!t)continue;let n=t.toLowerCase();u.has(n)||(u.add(n),l.push(t))}l.length===0&&c&&l.push(c);let f={...W.layout,...n.ui.layout||{}};G.value={layout:f,layoutsByProject:t,aiDiffSummaryByProject:i,fileListViewMode:n.ui.fileListViewMode===`tree`?`tree`:`list`,fileDiffSplitPercent:Number.isFinite(Number(n.ui.fileDiffSplitPercent))?Math.min(85,Math.max(15,Number(n.ui.fileDiffSplitPercent))):W.fileDiffSplitPercent,diffPreviewSplitPercent:Number.isFinite(Number(n.ui.diffPreviewSplitPercent))?Math.min(85,Math.max(25,Number(n.ui.diffPreviewSplitPercent))):W.diffPreviewSplitPercent,commandConsole:{expanded:typeof n.ui.commandConsole?.expanded==`boolean`?n.ui.commandConsole.expanded:W.commandConsole.expanded,useTerminal:typeof n.ui.commandConsole?.useTerminal==`boolean`?n.ui.commandConsole.useTerminal:W.commandConsole.useTerminal,showTerminalSessions:typeof n.ui.commandConsole?.showTerminalSessions==`boolean`?n.ui.commandConsole.showTerminalSessions:W.commandConsole.showTerminalSessions,splitPercent:Number.isFinite(Number(n.ui.commandConsole?.splitPercent))?Math.min(85,Math.max(15,Number(n.ui.commandConsole.splitPercent))):W.commandConsole.splitPercent},editorAutoSave:typeof n.ui.editorAutoSave==`boolean`?n.ui.editorAutoSave:W.editorAutoSave,fileTreeAutoRefresh:typeof n.ui.fileTreeAutoRefresh==`boolean`?n.ui.fileTreeAutoRefresh:W.fileTreeAutoRefresh,editorSidebarWidth:Number.isFinite(Number(n.ui.editorSidebarWidth))?Math.min(400,Math.max(140,Number(n.ui.editorSidebarWidth))):W.editorSidebarWidth,mindmapDirs:l,mindmapDir:c,headerToolsHidden:Array.isArray(n.ui.headerToolsHidden)?n.ui.headerToolsHidden.filter(e=>typeof e==`string`):[],lastTaskExecutor:h(n.ui.lastTaskExecutor)?n.ui.lastTaskExecutor:W.lastTaskExecutor,pickerGlobalSearch:typeof n.ui.pickerGlobalSearch==`boolean`?n.ui.pickerGlobalSearch:W.pickerGlobalSearch,markdownTheme:typeof n.ui.markdownTheme==`string`&&E.includes(n.ui.markdownTheme)?n.ui.markdownTheme:W.markdownTheme,editorWorkspaceByProject:o}}return ie(),k(G.value.markdownTheme),K.value=!0,y.value=!0,console.log(f(`@D50BB:配置信息加载完成`)),J.value}catch(e){return console.error(`加载配置失败:`,e),r.error(`${f(`@D50BB:加载配置失败: `)}${e.message}`),b.value=e.message,null}finally{v.value=!1}}async function ce(){try{await fetch(`/api/config/save-commit-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({isStandardCommit:O.value,skipHooks:A.value,autoQuickPushOnEnter:j.value,autoSetDefaultMessage:D.value,autoClosePushModal:T.value,pullBeforePush:M.value})})}catch(e){console.error(`保存提交设置失败:`,e)}}i([O,A,j,D,T,M],()=>{y.value&&ce()});let X=null,Z={};async function Q(){if(X&&=(clearTimeout(X),null),Object.keys(Z).length===0)return;let e=Z;Z={};try{await fetch(`/api/config/save-ui-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})}catch(e){console.error(`保存 UI 设置失败:`,e)}}async function $(e,t={}){if(K.value){if(t.immediate){Object.assign(Z,e),await Q();return}Object.assign(Z,e),X&&clearTimeout(X),X=setTimeout(()=>{Q()},300)}}async function le(e){h(e)&&G.value.lastTaskExecutor!==e&&(G.value.lastTaskExecutor=e,await $({lastTaskExecutor:e},{immediate:!0}))}let ue=e(()=>h(G.value.lastTaskExecutor)?G.value.lastTaskExecutor:V.value);async function de(){G.value.layout={...W.layout};let e=C.value;return e&&(G.value.layoutsByProject={...G.value.layoutsByProject,[e]:{...G.value.layout}}),await $({layoutsByProject:G.value.layoutsByProject},{immediate:!0}),G.value.layout}async function fe(e){let t=C.value;t&&(G.value.aiDiffSummaryByProject={...G.value.aiDiffSummaryByProject,[t]:e},await $({aiDiffSummaryByProject:{[t]:e}},{immediate:!0}))}async function pe(e){if(!Number.isFinite(e))return;let t=Math.min(400,Math.max(140,e));G.value.editorSidebarWidth=t,await $({editorSidebarWidth:t})}function me(e){let t=C.value;if(!t)return;let n=e.tabs.slice(0,40);G.value.editorWorkspaceByProject={...G.value.editorWorkspaceByProject,[t]:{expandedDirs:e.expandedDirs.slice(0,200),tabs:n,activeTab:e.activeTab&&n.includes(e.activeTab)?e.activeTab:null}},$({editorWorkspaceByProject:G.value.editorWorkspaceByProject})}function he(e){let t=e??C.value;return t?G.value.editorWorkspaceByProject[t]??null:null}i(()=>G.value.fileListViewMode,e=>{K.value&&$({fileListViewMode:e})}),i(()=>G.value.fileDiffSplitPercent,e=>{K.value&&$({fileDiffSplitPercent:e})}),i(()=>G.value.diffPreviewSplitPercent,e=>{K.value&&e!=null&&$({diffPreviewSplitPercent:e})}),i(()=>G.value.editorAutoSave,e=>{K.value&&$({editorAutoSave:e})}),i(()=>G.value.fileTreeAutoRefresh,e=>{K.value&&$({fileTreeAutoRefresh:e})}),i(()=>G.value.headerToolsHidden,e=>{K.value&&Array.isArray(e)&&$({headerToolsHidden:e})}),i(()=>G.value.mindmapDirs,e=>{K.value&&Array.isArray(e)&&$({mindmapDirs:e})}),i(()=>G.value.pickerGlobalSearch,e=>{K.value&&$({pickerGlobalSearch:e})});let ge=e(()=>G.value.markdownTheme);async function _e(e){let t=E.includes(e)?e:W.markdownTheme;return G.value.markdownTheme=t,k(t),await $({markdownTheme:t},{immediate:!0}),t}i(()=>G.value.markdownTheme,e=>{K.value&&typeof e==`string`&&e&&(k(e),$({markdownTheme:e}))}),i(()=>G.value.layout,e=>{if(!K.value)return;let t=C.value;t&&(G.value.layoutsByProject={...G.value.layoutsByProject,[t]:e},$({layoutsByProject:G.value.layoutsByProject}))},{deep:!0}),i(()=>G.value.commandConsole,e=>{K.value&&$({commandConsole:e})},{deep:!0}),typeof window<`u`&&window.addEventListener(`beforeunload`,()=>{Q()});async function ve(e){try{let n=await(await fetch(`/api/config/saveDefaultMessage`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({defaultCommitMessage:e})})).json();return n.success?(t.value=e,r.success(f(`@D50BB:默认提交信息已保存`)),!0):(r.error(`${f(`@D50BB:保存失败: `)}${n.error}`),!1)}catch(e){return r.error(`${f(`@D50BB:保存失败: `)}${e.message}`),!1}}async function ye(e){try{let t=await(await fetch(`/api/config/save-after-quick-push-action`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({afterQuickPushAction:{enabled:!!e?.enabled,type:e?.type===`workflow`?`workflow`:`command`,refId:String(e?.refId||``).trim()}})})).json();return t.success?(_.value={enabled:!!e?.enabled,type:e?.type===`workflow`?`workflow`:`command`,refId:String(e?.refId||``).trim()},!0):(r.error(`保存提交后启动项失败: ${t.error}`),!1)}catch(e){return r.error(`保存提交后启动项失败: ${e.message}`),!1}}async function be(e,t){try{let n=await(await fetch(`/api/config/save-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return n.success?(t===`description`?a.value.includes(e)||a.value.push(e):t===`scope`?o.value.includes(e)||o.value.push(e):t===`message`?s.value.includes(e)||s.value.push(e):t===`command`&&(c.value.includes(e)||c.value.push(e)),r.success(f(`@D50BB:模板已保存`)),!0):(r.error(`${f(`@D50BB:保存模板失败: `)}${n.error}`),!1)}catch(e){return r.error(`${f(`@D50BB:保存模板失败: `)}${e.message}`),!1}}async function xe(e,t){try{let n=await(await fetch(`/api/config/delete-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return n.success?(t===`description`?a.value=a.value.filter(t=>t!==e):t===`scope`?o.value=o.value.filter(t=>t!==e):t===`message`?s.value=s.value.filter(t=>t!==e):t===`command`&&(c.value=c.value.filter(t=>t!==e)),r.success(f(`@D50BB:模板已删除`)),!0):(r.error(`${f(`@D50BB:删除模板失败: `)}${n.error}`),!1)}catch(e){return r.error(`${f(`@D50BB:删除模板失败: `)}${e.message}`),!1}}async function Se(e,t,n){try{let i=await(await fetch(`/api/config/update-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({oldTemplate:e,newTemplate:t,type:n})})).json();if(i.success){if(n===`description`){let n=a.value.indexOf(e);n!==-1&&(a.value[n]=t)}else if(n===`scope`){let n=o.value.indexOf(e);n!==-1&&(o.value[n]=t)}else if(n===`message`){let n=s.value.indexOf(e);n!==-1&&(s.value[n]=t)}else if(n===`command`){let n=c.value.indexOf(e);n!==-1&&(c.value[n]=t)}return r.success(f(`@D50BB:模板已更新`)),!0}return r.error(`${f(`@D50BB:更新模板失败: `)}${i.error}`),!1}catch(e){return r.error(`${f(`@D50BB:更新模板失败: `)}${e.message}`),!1}}async function Ce(e,t){try{let n=await(await fetch(`/api/config/pin-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return n.success?(t===`description`?(a.value=a.value.filter(t=>t!==e),a.value.unshift(e)):t===`scope`?(o.value=o.value.filter(t=>t!==e),o.value.unshift(e)):t===`message`?(s.value=s.value.filter(t=>t!==e),s.value.unshift(e)):t===`command`&&(c.value=c.value.filter(t=>t!==e),c.value.unshift(e)),r.success(f(`@D50BB:模板已置顶`)),!0):(r.error(`${f(`@D50BB:置顶模板失败: `)}${n.error}`),!1)}catch(e){return r.error(`${f(`@D50BB:置顶模板失败: `)}${e.message}`),!1}}async function we(){try{let e=await(await fetch(`/api/locked-files`)).json();return e.success?(l.value=e.lockedFiles||[],e.lockedFiles):(r.error(`${f(`@D50BB:加载锁定文件列表失败: `)}${e.error}`),[])}catch(e){return console.error(`加载锁定文件列表失败:`,e),r.error(`${f(`@D50BB:加载锁定文件列表失败: `)}${e.message}`),[]}}async function Te(e){try{let t=await(await fetch(`/api/lock-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?(await we(),r.success(`${f(`@D50BB:文件已锁定: `)}${e}`),!0):(r.error(`${f(`@D50BB:锁定文件失败: `)}${t.error}`),!1)}catch(e){return console.error(`锁定文件失败:`,e),r.error(`${f(`@D50BB:锁定文件失败: `)}${e.message}`),!1}}async function Ee(e){try{let t=await(await fetch(`/api/unlock-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?(await we(),r.success(`${f(`@D50BB:文件已解锁: `)}${e}`),!0):(r.error(`${f(`@D50BB:解锁文件失败: `)}${t.error}`),!1)}catch(e){return console.error(`解锁文件失败:`,e),r.error(`${f(`@D50BB:解锁文件失败: `)}${e.message}`),!1}}async function De(e){try{let t=await(await fetch(`/api/check-file-lock`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?t.isLocked:(console.error(`检查文件锁定状态失败:`,t.error),!1)}catch(e){return console.error(`检查文件锁定状态失败:`,e),!1}}async function Oe(e){try{let t=await(await fetch(`/api/config/save-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({command:e})})).json();return t.success?(await Y(!0),r.success(f(`@CMD01:命令已保存`)),!0):(r.error(`${f(`@CMD01:保存命令失败: `)}${t.error}`),!1)}catch(e){return r.error(`${f(`@CMD01:保存命令失败: `)}${e.message}`),!1}}async function ke(e){try{let t=await(await fetch(`/api/config/delete-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e})})).json();return t.success?(await Y(!0),r.success(f(`@CMD01:命令已删除`)),!0):(r.error(`${f(`@CMD01:删除命令失败: `)}${t.error}`),!1)}catch(e){return r.error(`${f(`@CMD01:删除命令失败: `)}${e.message}`),!1}}async function Ae(e,t){try{let n=await(await fetch(`/api/config/update-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e,command:t})})).json();return n.success?(await Y(!0),r.success(f(`@CMD01:命令已更新`)),!0):(r.error(`${f(`@CMD01:更新命令失败: `)}${n.error}`),!1)}catch(e){return r.error(`${f(`@CMD01:更新命令失败: `)}${e.message}`),!1}}async function je(e){try{let t=await(await fetch(`/api/config/pin-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e})})).json();return t.success?(await Y(!0),!0):(r.error(t.error),!1)}catch(e){return r.error(e.message),!1}}async function Me(e){try{let t=await(await fetch(`/api/config/save-orchestration`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({orchestration:e})})).json();return t.success?(await Y(!0),r.success(f(`@ORCH:编排已保存`)),t.orchestration||null):(r.error(`${f(`@ORCH:保存编排失败: `)}${t.error}`),null)}catch(e){return r.error(`${f(`@ORCH:保存编排失败: `)}${e.message}`),null}}async function Ne(e){try{let t=await(await fetch(`/api/config/delete-orchestration`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e})})).json();return t.success?(await Y(!0),r.success(f(`@ORCH:编排已删除`)),!0):(r.error(`${f(`@ORCH:删除编排失败: `)}${t.error}`),!1)}catch(e){return r.error(`${f(`@ORCH:删除编排失败: `)}${e.message}`),!1}}async function Pe(e,t){try{let n=await(await fetch(`/api/config/update-orchestration`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e,orchestration:t})})).json();return n.success?(await Y(!0),r.success(f(`@ORCH:编排已更新`)),!0):(r.error(`${f(`@ORCH:更新编排失败: `)}${n.error}`),!1)}catch(e){return r.error(`${f(`@ORCH:更新编排失败: `)}${e.message}`),!1}}async function Fe(e,t){try{let n=await(await fetch(`/api/config/save-startup-items`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({startupItems:e,startupAutoRun:t===void 0?g.value:t})})).json();return n.success?(m.value=e,t!==void 0&&(g.value=t),!0):(r.error(`保存启动项失败: ${n.error}`),!1)}catch(e){return r.error(`保存启动项失败: ${e.message}`),!1}}async function Ie(e){try{let t=await(await fetch(`/api/config/save-ai-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...e.aiMaxToolIterations===void 0?{}:{aiMaxToolIterations:e.aiMaxToolIterations},...e.aiMaxRequestTokens===void 0?{}:{aiMaxRequestTokens:e.aiMaxRequestTokens},...e.agentPresetPrompts===void 0?{}:{agentPresetPrompts:e.agentPresetPrompts},...e.agentDefaultPrompt===void 0?{}:{agentDefaultPrompt:e.agentDefaultPrompt}})})).json();return t.success?(t.aiMaxToolIterations!==void 0&&(I.value=Number(t.aiMaxToolIterations)||e.aiMaxToolIterations||I.value),t.aiMaxRequestTokens!==void 0&&(L.value=Number(t.aiMaxRequestTokens)||e.aiMaxRequestTokens||L.value),t.aiRequestBudget&&Number(t.aiRequestBudget.maxUserChars)>0&&(B.value={maxTokens:Math.floor(Number(t.aiRequestBudget.maxTokens)||0),maxChars:Math.floor(Number(t.aiRequestBudget.maxChars)||0),maxMessages:Math.floor(Number(t.aiRequestBudget.maxMessages)||0),maxUserChars:Math.floor(Number(t.aiRequestBudget.maxUserChars))}),Array.isArray(t.agentPresetPrompts)&&(R.value=t.agentPresetPrompts),typeof t.agentDefaultPrompt==`string`&&(z.value=t.agentDefaultPrompt),!0):(r.error(`${f(`@D50BB:保存 AI 设置失败: `)}${t.error}`),!1)}catch(e){return r.error(`${f(`@D50BB:保存 AI 设置失败: `)}${e.message}`),!1}}async function Le(e){try{let t=await(await fetch(`/api/config/save-models`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({models:e})})).json();return t.success?(F.value=e,!0):(r.error(`${f(`@D50BB:保存模型失败: `)}${t.error}`),!1)}catch(e){return r.error(`${f(`@D50BB:保存模型失败: `)}${e.message}`),!1}}async function Re(e){try{let t=await(await fetch(`/api/config/save-general-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})).json();if(t.success){if(e.theme&&(N.value=e.theme,q(e.theme)),e.locale){P.value=e.locale,d(e.locale);let t=ee();t.currentLocale=e.locale}return h(e.taskExecutor)&&(V.value=e.taskExecutor),typeof e.notifyPageOnTaskDone==`boolean`&&(te.value=e.notifyPageOnTaskDone),typeof e.notifyBrowserOnTaskDone==`boolean`&&(H.value=e.notifyBrowserOnTaskDone),typeof e.notifySoundOnTaskDone==`boolean`&&(U.value=e.notifySoundOnTaskDone),!0}return r.error(`保存通用设置失败: ${t.error}`),!1}catch(e){return r.error(`保存通用设置失败: ${e.message}`),!1}}return{models:F,aiMaxToolIterations:I,aiMaxRequestTokens:L,agentPresetPrompts:R,agentDefaultPrompt:z,aiRequestBudget:B,taskExecutor:V,resolvedTaskExecutor:ue,setLastTaskExecutor:le,notifyPageOnTaskDone:te,notifyBrowserOnTaskDone:H,notifySoundOnTaskDone:U,defaultCommitMessage:t,descriptionTemplates:a,scopeTemplates:o,messageTemplates:s,commandTemplates:c,lockedFiles:l,customCommands:u,orchestrations:p,startupItems:m,startupAutoRun:g,afterQuickPushAction:_,isLoading:v,isLoaded:y,configLoadError:b,configFilePath:S,hasConfigLoadError:oe,currentDirectory:C,currentIconUrl:w,config:J,autoClosePushModal:T,autoSetDefaultMessage:D,isStandardCommit:O,skipHooks:A,autoQuickPushOnEnter:j,pullBeforePush:M,theme:N,locale:P,ui:G,isUiLoaded:K,aiDiffSummaryEnabled:re,markdownTheme:ge,loadConfig:Y,setCurrentDirectory:ne,openSystemConfigFile:se,saveTemplate:be,saveModels:Le,saveAiSettings:Ie,saveGeneralSettings:Re,saveUiSettings:$,setAiDiffSummaryEnabled:fe,setEditorSidebarWidth:pe,saveEditorWorkspace:me,getEditorWorkspace:he,setMarkdownTheme:_e,resetUiLayout:de,applyTheme:q,toggleTheme:ae,saveDefaultMessage:ve,deleteTemplate:xe,updateTemplate:Se,pinTemplate:Ce,loadLockedFiles:we,lockFile:Te,unlockFile:Ee,isFileLocked:De,saveCustomCommand:Oe,deleteCustomCommand:ke,updateCustomCommand:Ae,pinCustomCommand:je,saveOrchestration:Me,deleteOrchestration:Ne,updateOrchestration:Pe,saveStartupItems:Fe,saveAfterQuickPushAction:ye,saveCommitSettings:ce}});export{A as a,h as c,j as i,g as l,S as n,ee as o,O as r,m as s,M as t};