zen-gitsync 2.17.25 → 2.17.26

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 (44) hide show
  1. package/package.json +1 -1
  2. package/scripts/release.js +8 -10
  3. package/src/cli/ai/tools.js +2 -1
  4. package/src/ui/public/assets/{AgentEngineSelector-BArUIELz.js → AgentEngineSelector-CEayBStS.js} +1 -1
  5. package/src/ui/public/assets/{AgentView-LpT8A9Fo.js → AgentView-BhLlAvng.js} +1 -1
  6. package/src/ui/public/assets/{AppVersionBadge-DNXQm_Si.js → AppVersionBadge-btxeyJpH.js} +2 -2
  7. package/src/ui/public/assets/{BranchSelector-DZPTz5Ql.js → BranchSelector-ERybqfLW.js} +1 -1
  8. package/src/ui/public/assets/{CommitForm-6avyu1Kv.js → CommitForm-DcXdYwKn.js} +1 -1
  9. package/src/ui/public/assets/{CommonDialog-CRXyMlp5.js → CommonDialog-5bwugMhs.js} +1 -1
  10. package/src/ui/public/assets/{EditorView-BIHL8I9g.js → EditorView-BzxNDG8A.js} +1 -1
  11. package/src/ui/public/assets/{FileDiffViewer-BEYcCYs5.js → FileDiffViewer-BBOtL3bR.js} +1 -1
  12. package/src/ui/public/assets/{FlowExecutionViewer-DKRHDqbG.js → FlowExecutionViewer-BPMDn3Md.js} +1 -1
  13. package/src/ui/public/assets/{FlowOrchestrationWorkspace-BnCsF4z4.js → FlowOrchestrationWorkspace-PtCM4LB1.js} +1 -1
  14. package/src/ui/public/assets/{IconButton-D4df4t9A.js → IconButton-BELiW6cx.js} +1 -1
  15. package/src/ui/public/assets/{LogList-DXqB4JJv.js → LogList-BAD5dV_N.js} +1 -1
  16. package/src/ui/public/assets/{MindmapView-Ddc55wzp.js → MindmapView-BAwb7Gs1.js} +1 -1
  17. package/src/ui/public/assets/{MonitorView-DeERavq-.js → MonitorView-DIqKQfiM.js} +1 -1
  18. package/src/ui/public/assets/{ProjectStartupButton-DaLU4iS4.js → ProjectStartupButton-DnQyvZOG.js} +1 -1
  19. package/src/ui/public/assets/{RecentDirectoriesChat-DVtsf7lW.js → RecentDirectoriesChat-BMZA0DgP.js} +1 -1
  20. package/src/ui/public/assets/{RemoteManagerDialog-C3cfDsZi.js → RemoteManagerDialog-BmdcIfwA.js} +1 -1
  21. package/src/ui/public/assets/{RemoteRepoCard-D1Hso5Fq.js → RemoteRepoCard-DqKIIcGh.js} +1 -1
  22. package/src/ui/public/assets/{SourceMapView-Dwn5wy1o.js → SourceMapView-Sd_871DD.js} +1 -1
  23. package/src/ui/public/assets/{SvgIcon-diKLLWK9.js → SvgIcon-DyQoHzNw.js} +1 -1
  24. package/src/ui/public/assets/{TemplateManager-D9gyZbHP.js → TemplateManager-BI1EXn7d.js} +1 -1
  25. package/src/ui/public/assets/{UserInputNode-JNtVWcbE.js → UserInputNode-3qtC_swg.js} +1 -1
  26. package/src/ui/public/assets/{WorkbenchView-CJCxYK-K.css → WorkbenchView-BNxybEqF.css} +1 -1
  27. package/src/ui/public/assets/WorkbenchView-wAdnj8Kl.js +6 -0
  28. package/src/ui/public/assets/{_plugin-vue_export-helper-C7IvbEC3.js → _plugin-vue_export-helper-CGArUtKL.js} +2 -2
  29. package/src/ui/public/assets/{agentConversations-nN-yDz8q.js → agentConversations-cmS8iux5.js} +1 -1
  30. package/src/ui/public/assets/{configStore-C-htWfWm.js → configStore-Vh8LZWlL.js} +1 -1
  31. package/src/ui/public/assets/{gitStore-DYpd8vZK.js → gitStore-B9gZQf2q.js} +1 -1
  32. package/src/ui/public/assets/{index-eq1OUcdk.js → index-DE-31lcL.js} +5 -5
  33. package/src/ui/public/assets/{previewSandbox-Z707CZD9.js → previewSandbox-DmecmT9g.js} +1 -1
  34. package/src/ui/public/assets/{toolsStore-DFu4Alwg.js → toolsStore-DgCBDdhm.js} +1 -1
  35. package/src/ui/public/index.html +11 -11
  36. package/src/ui/server/routes/workbench/dispatchInstruction.js +8 -6
  37. package/src/ui/server/routes/workbench/dispatchInstruction.test.js +29 -2
  38. package/src/ui/server/routes/workbench/index.js +22 -15
  39. package/src/ui/server/routes/workbench/orchestratorPrompt.test.js +47 -2
  40. package/src/ui/server/routes/workbench/orchestratorStore.js +29 -1
  41. package/src/ui/server/routes/workbench/shared.js +28 -2
  42. package/src/utils/selfUpdatePolicy.js +26 -4
  43. package/src/utils/selfUpdatePolicy.test.js +21 -2
  44. package/src/ui/public/assets/WorkbenchView-DxaAjZAA.js +0 -6
@@ -1,4 +1,4 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{Cn as e,Rn as t,a as n,br as r,i,pr as a,vr as o}from"./element-plus-Bx3j6vzG.js";import{i as s,l as c,o as l,s as u}from"./vendor-BjomZKSS.js";import{n as d}from"./_plugin-vue_export-helper-C7IvbEC3.js";import{i as f,o as p,t as m}from"./configStore-C-htWfWm.js";var h=`g ai`,g=`g-ai`,_=[{id:`gai`,name:h},...f.map(e=>({id:e.id,name:e.name}))],v=`zen-gitsync-agent-engine`;function y(e){return e===`gai`||p(e)}function b(e){return _.find(t=>t.id===e)?.name||`g ai`}function x(e){return p(e)}function S(){try{let e=localStorage.getItem(v);if(y(e))return e}catch{}return`gai`}function C(e){try{localStorage.setItem(v,e)}catch{}}t(),a();var w=[`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(`,`),T=65536,E=`local-`;function D(e){if(!e||!Array.isArray(e.messages))return[];let t=[],n=e.messages.length;for(let r=0;r<n;r++){let i=e.messages[r];if(i.role!==`system`){if(i.role===`user`){let e=``,n;if(typeof i.content==`string`)e=i.content;else if(Array.isArray(i.content)){e=i.content.filter(e=>e?.type===`text`).map(e=>e.text||``).join(` `);let t=i.content.filter(e=>e?.type===`image_url`&&typeof e.image_url?.url==`string`).map((e,t)=>({id:`att-${r}-${t}`,name:`image`,size:0,type:A(e.image_url?.url||``)||`image/*`,preview:e.image_url?.url}));t.length>0&&(n=t)}(e||n)&&t.push({id:`msg-${r}`,role:`user`,content:e,attachments:n,status:`done`,createdAt:Date.now()})}else if(i.role===`assistant`){let i=`msg-${r}`,a=``,o=[],s=r;for(;s<n;){let t=e.messages[s];if(t.role!==`assistant`&&t.role!==`tool`)break;if(t.role===`assistant`){if(typeof t.content==`string`&&(a+=t.content),t.tool_calls&&t.tool_calls.length>0)for(let e of t.tool_calls)o.push({id:e.id||e.function?.name||l(),name:e.function?.name||``,arguments:e.function?.arguments||``,argsPreview:O(e.function?.name||``,e.function?.arguments||``),status:`done`,result:``})}else{let e=t.tool_call_id||t.name||``,n=o.find(t=>t.id===e);if(n){let e=t.content;typeof e!=`string`&&(e=`(non-text result)`),e.length>T&&(e=`…(前文已截断)\n${e.slice(-65536)}`),n.result=e}}s++}r=s-1,a.length>T&&(a=`…(前文已截断)\n${a.slice(-65536)}`);let c=!!a,u=o.length>0;(c||u)&&t.push({id:i,role:`assistant`,content:a,toolCalls:u?o:void 0,status:`done`,createdAt:Date.now()})}}}return t}function O(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=c(t,`update_plan`);if(!e)return``;let{total:r,done:i}=s(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 A(e){let t=/^data:([^;,]+)/.exec(e);return t?t[1]:``}function j(){let t=m(),a=r([]),s=r(!1),c=r(S());function f(e){y(e)&&(c.value=e,C(e))}let p=o(new Map),h=r(null),g=r(!1),_=0,v=0,b=new Set;function x(e){return{key:e,sessionId:e.startsWith(E)?null:e,title:``,messages:[],isStreaming:!1,abortController:null,nonce:0,pendingQuestion:null,answeringQuestion:!1}}function w(e){let t=p.get(e);return t||=(p.set(e,x(e)),p.get(e)),t}let O=e(()=>h.value?p.get(h.value)??null:null),A=e(()=>O.value?.messages??[]),j=e(()=>O.value?.isStreaming??!1),M=e(()=>{let e=a.value.find(e=>e.sessionId===h.value);return y(e?.engine)?e.engine:c.value}),N=e(()=>a.value.some(e=>e.sessionId===h.value)),P=e(()=>O.value?.pendingQuestion??null),F=e(()=>O.value?.answeringQuestion??!1);function I(e){return!!p.get(e)?.isStreaming}function L(e){let n=[...e];for(let e of p.values()){if(!e.sessionId)continue;let r=n.findIndex(t=>t.sessionId===e.sessionId);if(r!==-1){b.delete(e.sessionId),e.isStreaming&&(n[r]={...n[r],isGenerating:!0});continue}if(!e.isStreaming&&!b.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:c.value,createdAt:i,updatedAt:i,messageCount:e.messages.filter(e=>e.role===`user`).length||1,size:0,isGenerating:e.isStreaming})}return n}async function R(){let e=++_,r=t.currentDirectory||``;if(!r){a.value=[],s.value=!1;return}s.value=!0;try{let t=`/api/agent/sessions?cwd=${encodeURIComponent(r)}`,i=await fetch(t).then(e=>e.json());if(e!==_)return;if(!i.success){n.error(i.error||d(`@AGENT:加载会话列表失败`));return}let o=Array.isArray(i.sessions)?i.sessions:[];a.value=L(o)}catch(t){if(e!==_)return;n.error(d(`@AGENT:加载会话列表失败`)+`: `+(t?.message||t))}finally{e===_&&(s.value=!1)}}function z(e,n){let r=new Date().toISOString(),i=a.value.find(t=>t.sessionId===e);if(i){i.isGenerating=!0,i.updatedAt=r;return}a.value=[{sessionId:e,title:n||d(`@AGENT:无标题`),source:`web`,cwd:t.currentDirectory||``,model:``,engine:c.value,createdAt:r,updatedAt:r,messageCount:1,size:0,isGenerating:!0},...a.value]}function B(e){let t=a.value.find(t=>t.sessionId===e);t&&(t.isGenerating=!1)}async function V(e){if(p.get(e)?.isStreaming){h.value=e;return}g.value=!0,h.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=w(e);r.sessionId=e,r.messages=D(t.session),t.session?.title&&(r.title=t.session.title)}catch(e){n.error(d(`@AGENT:加载会话失败`)+`: `+(e?.message||e))}finally{g.value=!1}}async function H(e){try{await i.confirm(d(`@AGENT:确认删除该会话`),d(`@AGENT:删除后无法恢复`),{type:`warning`})}catch{return}let t=p.get(e);if(t?.abortController)try{t.abortController.abort()}catch{}p.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}a.value=a.value.filter(t=>t.sessionId!==e),h.value===e&&(h.value=null),n.success(d(`@AGENT:已删除`))}catch(e){n.error(d(`@AGENT:删除失败`)+`: `+(e?.message||e))}}async function U(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=a.value.find(t=>t.sessionId===e);i&&(i.title=t);let o=p.get(e);o&&(o.title=t),n.success(d(`@AGENT:已重命名`))}catch(e){n.error(d(`@AGENT:重命名失败`)+`: `+(e?.message||e))}}function W(){h.value=null}async function G(e,r=[],i={}){let a=r.filter(e=>e?.file?.type?.startsWith(`image/`)),s=r.filter(e=>!e?.file?.type?.startsWith(`image/`)),c=[],f=0;for(let e of s){let t=e.file.size||0;if(!(t>10485760)){if(c.length>=10||f+t>20971520)break;f+=t,c.push(e)}}let m=s.filter(e=>!c.includes(e));m.length>0&&n.warning(`${d(`@AGENT:以下附件超过大小或数量上限,已忽略:`)}${m.map(e=>e.file.name).join(`、`)}`);let g=w(h.value||`${E}${Date.now()}-${++v}`);if(!e.trim()&&a.length===0&&c.length===0||g.isStreaming)return;let _=(await Promise.allSettled(a.map(e=>k(e.file)))).map(e=>e.status===`fulfilled`?e.value:``).filter(e=>e.startsWith(`data:image/`)),y=(await Promise.allSettled(c.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:`));h.value=g.key,g.nonce+=1;let x=g.nonce;g.abortController=new AbortController;let S=g.abortController;g.pendingQuestion=null,g.answeringQuestion=!1;let C={id:l(),role:`user`,content:e,status:`done`,createdAt:Date.now()},D=[...a,...c];D.length>0&&(C.attachments=D.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 O=o({id:l(),role:`assistant`,content:``,status:`pending`,createdAt:Date.now()});g.messages.push(O),g.isStreaming=!0;let A=[],j=g.sessionId,N=!1;try{let n=await fetch(`/api/agent/chat`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify({sessionId:g.sessionId||``,userMessage:e,cwd:t.currentDirectory||``,engine:i.engine??M.value,..._.length>0?{images:_}:{},...y.length>0?{attachments:y}:{},...i.openFilePath?{openFilePath:i.openFilePath}:{},...i.dirStatus?.length?{dirStatus:i.dirStatus}:{},...i.dirSummary?{dirSummary:i.dirSummary}:{},...i.allowDispatch?{allowDispatch:!0,dispatchExecutor:i.dispatchExecutor||``,dispatchUseDefaultPrompt:i.dispatchUseDefaultPrompt!==!1}:{}}),signal:S.signal});if(x!==g.nonce)return;if(!n.ok||!n.body){let e=await n.text().catch(()=>``);throw Error(e||`HTTP ${n.status}`)}let r=n.body.getReader(),a=new TextDecoder(`utf-8`),s=``;for(;;){let{value:t,done:n}=await r.read();if(x!==g.nonce)return;if(n)break;s+=a.decode(t,{stream:!0});let i=s.split(`
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{Cn as e,Rn as t,a as n,br as r,i,pr as a,vr as o}from"./element-plus-Bx3j6vzG.js";import{i as s,l as c,o as l,s as u}from"./vendor-BjomZKSS.js";import{n as d}from"./_plugin-vue_export-helper-CGArUtKL.js";import{i as f,o as p,t as m}from"./configStore-Vh8LZWlL.js";var h=`g ai`,g=`g-ai`,_=[{id:`gai`,name:h},...f.map(e=>({id:e.id,name:e.name}))],v=`zen-gitsync-agent-engine`;function y(e){return e===`gai`||p(e)}function b(e){return _.find(t=>t.id===e)?.name||`g ai`}function x(e){return p(e)}function S(){try{let e=localStorage.getItem(v);if(y(e))return e}catch{}return`gai`}function C(e){try{localStorage.setItem(v,e)}catch{}}t(),a();var w=[`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(`,`),T=65536,E=`local-`;function D(e){if(!e||!Array.isArray(e.messages))return[];let t=[],n=e.messages.length;for(let r=0;r<n;r++){let i=e.messages[r];if(i.role!==`system`){if(i.role===`user`){let e=``,n;if(typeof i.content==`string`)e=i.content;else if(Array.isArray(i.content)){e=i.content.filter(e=>e?.type===`text`).map(e=>e.text||``).join(` `);let t=i.content.filter(e=>e?.type===`image_url`&&typeof e.image_url?.url==`string`).map((e,t)=>({id:`att-${r}-${t}`,name:`image`,size:0,type:A(e.image_url?.url||``)||`image/*`,preview:e.image_url?.url}));t.length>0&&(n=t)}(e||n)&&t.push({id:`msg-${r}`,role:`user`,content:e,attachments:n,status:`done`,createdAt:Date.now()})}else if(i.role===`assistant`){let i=`msg-${r}`,a=``,o=[],s=r;for(;s<n;){let t=e.messages[s];if(t.role!==`assistant`&&t.role!==`tool`)break;if(t.role===`assistant`){if(typeof t.content==`string`&&(a+=t.content),t.tool_calls&&t.tool_calls.length>0)for(let e of t.tool_calls)o.push({id:e.id||e.function?.name||l(),name:e.function?.name||``,arguments:e.function?.arguments||``,argsPreview:O(e.function?.name||``,e.function?.arguments||``),status:`done`,result:``})}else{let e=t.tool_call_id||t.name||``,n=o.find(t=>t.id===e);if(n){let e=t.content;typeof e!=`string`&&(e=`(non-text result)`),e.length>T&&(e=`…(前文已截断)\n${e.slice(-65536)}`),n.result=e}}s++}r=s-1,a.length>T&&(a=`…(前文已截断)\n${a.slice(-65536)}`);let c=!!a,u=o.length>0;(c||u)&&t.push({id:i,role:`assistant`,content:a,toolCalls:u?o:void 0,status:`done`,createdAt:Date.now()})}}}return t}function O(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=c(t,`update_plan`);if(!e)return``;let{total:r,done:i}=s(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 A(e){let t=/^data:([^;,]+)/.exec(e);return t?t[1]:``}function j(){let t=m(),a=r([]),s=r(!1),c=r(S());function f(e){y(e)&&(c.value=e,C(e))}let p=o(new Map),h=r(null),g=r(!1),_=0,v=0,b=new Set;function x(e){return{key:e,sessionId:e.startsWith(E)?null:e,title:``,messages:[],isStreaming:!1,abortController:null,nonce:0,pendingQuestion:null,answeringQuestion:!1}}function w(e){let t=p.get(e);return t||=(p.set(e,x(e)),p.get(e)),t}let O=e(()=>h.value?p.get(h.value)??null:null),A=e(()=>O.value?.messages??[]),j=e(()=>O.value?.isStreaming??!1),M=e(()=>{let e=a.value.find(e=>e.sessionId===h.value);return y(e?.engine)?e.engine:c.value}),N=e(()=>a.value.some(e=>e.sessionId===h.value)),P=e(()=>O.value?.pendingQuestion??null),F=e(()=>O.value?.answeringQuestion??!1);function I(e){return!!p.get(e)?.isStreaming}function L(e){let n=[...e];for(let e of p.values()){if(!e.sessionId)continue;let r=n.findIndex(t=>t.sessionId===e.sessionId);if(r!==-1){b.delete(e.sessionId),e.isStreaming&&(n[r]={...n[r],isGenerating:!0});continue}if(!e.isStreaming&&!b.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:c.value,createdAt:i,updatedAt:i,messageCount:e.messages.filter(e=>e.role===`user`).length||1,size:0,isGenerating:e.isStreaming})}return n}async function R(){let e=++_,r=t.currentDirectory||``;if(!r){a.value=[],s.value=!1;return}s.value=!0;try{let t=`/api/agent/sessions?cwd=${encodeURIComponent(r)}`,i=await fetch(t).then(e=>e.json());if(e!==_)return;if(!i.success){n.error(i.error||d(`@AGENT:加载会话列表失败`));return}let o=Array.isArray(i.sessions)?i.sessions:[];a.value=L(o)}catch(t){if(e!==_)return;n.error(d(`@AGENT:加载会话列表失败`)+`: `+(t?.message||t))}finally{e===_&&(s.value=!1)}}function z(e,n){let r=new Date().toISOString(),i=a.value.find(t=>t.sessionId===e);if(i){i.isGenerating=!0,i.updatedAt=r;return}a.value=[{sessionId:e,title:n||d(`@AGENT:无标题`),source:`web`,cwd:t.currentDirectory||``,model:``,engine:c.value,createdAt:r,updatedAt:r,messageCount:1,size:0,isGenerating:!0},...a.value]}function B(e){let t=a.value.find(t=>t.sessionId===e);t&&(t.isGenerating=!1)}async function V(e){if(p.get(e)?.isStreaming){h.value=e;return}g.value=!0,h.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=w(e);r.sessionId=e,r.messages=D(t.session),t.session?.title&&(r.title=t.session.title)}catch(e){n.error(d(`@AGENT:加载会话失败`)+`: `+(e?.message||e))}finally{g.value=!1}}async function H(e){try{await i.confirm(d(`@AGENT:确认删除该会话`),d(`@AGENT:删除后无法恢复`),{type:`warning`})}catch{return}let t=p.get(e);if(t?.abortController)try{t.abortController.abort()}catch{}p.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}a.value=a.value.filter(t=>t.sessionId!==e),h.value===e&&(h.value=null),n.success(d(`@AGENT:已删除`))}catch(e){n.error(d(`@AGENT:删除失败`)+`: `+(e?.message||e))}}async function U(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=a.value.find(t=>t.sessionId===e);i&&(i.title=t);let o=p.get(e);o&&(o.title=t),n.success(d(`@AGENT:已重命名`))}catch(e){n.error(d(`@AGENT:重命名失败`)+`: `+(e?.message||e))}}function W(){h.value=null}async function G(e,r=[],i={}){let a=r.filter(e=>e?.file?.type?.startsWith(`image/`)),s=r.filter(e=>!e?.file?.type?.startsWith(`image/`)),c=[],f=0;for(let e of s){let t=e.file.size||0;if(!(t>10485760)){if(c.length>=10||f+t>20971520)break;f+=t,c.push(e)}}let m=s.filter(e=>!c.includes(e));m.length>0&&n.warning(`${d(`@AGENT:以下附件超过大小或数量上限,已忽略:`)}${m.map(e=>e.file.name).join(`、`)}`);let g=w(h.value||`${E}${Date.now()}-${++v}`);if(!e.trim()&&a.length===0&&c.length===0||g.isStreaming)return;let _=(await Promise.allSettled(a.map(e=>k(e.file)))).map(e=>e.status===`fulfilled`?e.value:``).filter(e=>e.startsWith(`data:image/`)),y=(await Promise.allSettled(c.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:`));h.value=g.key,g.nonce+=1;let x=g.nonce;g.abortController=new AbortController;let S=g.abortController;g.pendingQuestion=null,g.answeringQuestion=!1;let C={id:l(),role:`user`,content:e,status:`done`,createdAt:Date.now()},D=[...a,...c];D.length>0&&(C.attachments=D.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 O=o({id:l(),role:`assistant`,content:``,status:`pending`,createdAt:Date.now()});g.messages.push(O),g.isStreaming=!0;let A=[],j=g.sessionId,N=!1;try{let n=await fetch(`/api/agent/chat`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify({sessionId:g.sessionId||``,userMessage:e,cwd:t.currentDirectory||``,engine:i.engine??M.value,..._.length>0?{images:_}:{},...y.length>0?{attachments:y}:{},...i.openFilePath?{openFilePath:i.openFilePath}:{},...i.dirStatus?.length?{dirStatus:i.dirStatus}:{},...i.dirSummary?{dirSummary:i.dirSummary}:{},...i.allowDispatch?{allowDispatch:!0,dispatchExecutor:i.dispatchExecutor||``,dispatchUseDefaultPrompt:i.dispatchUseDefaultPrompt!==!1}:{}}),signal:S.signal});if(x!==g.nonce)return;if(!n.ok||!n.body){let e=await n.text().catch(()=>``);throw Error(e||`HTTP ${n.status}`)}let r=n.body.getReader(),a=new TextDecoder(`utf-8`),s=``;for(;;){let{value:t,done:n}=await r.read();if(x!==g.nonce)return;if(n)break;s+=a.decode(t,{stream:!0});let i=s.split(`
2
2
  `);s=i.pop()??``;for(let t of i){let n=t.trim();if(!n.startsWith(`data:`))continue;let r=n.slice(5).trim();if(!r)continue;let i;try{i=JSON.parse(r)}catch{continue}switch(i.type){case`meta`:if(i.sessionId){let t=String(i.sessionId);if(j=t,g.sessionId!==t){let e=g.key;g.sessionId=t,g.key=t,e!==t&&(p.delete(e),p.set(t,g),h.value===e&&(h.value=t))}let n=String(i.title||``).trim()||e.trim().split(`
3
3
  `)[0].trim().slice(0,40)||d(`@AGENT:无标题`);g.title||=n,z(t,n)}break;case`thinking`:O.reasoning||(O.reasoning=``,O.reasoningStatus=`streaming`),O.reasoning+=String(i.delta||``),O.status=`streaming`;break;case`content`:O.status===`pending`&&(O.status=`streaming`);{let e=String(i.delta||``);O.content+=e;let t=u(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=o({id:i.toolCallId||l(),name:i.name||``,argsPreview:i.argsPreview||``,arguments:i.arguments||i.argsPreview||``,status:`running`,result:``});A.push(e),O.toolCalls||=[],O.toolCalls.push(e),O.status===`pending`&&(O.status=`streaming`);break}case`tool_output`:{let e=A.find(e=>e.id===i.toolCallId);if(e){let t=`${e.result||``}${String(i.chunk||``)}`;e.result=t.length>T?`…(前文已截断)\n${t.slice(-65536)}`:t}break}case`tool_result`:{let e=A.find(e=>e.id===i.toolCallId);e&&(e.result=String(i.result||``),e.status=`done`,e.name===`ask_user`&&(g.pendingQuestion=null));break}case`ask_user`:g.pendingQuestion={interactionId:String(i.interactionId||``),question:String(i.question||``),options:Array.isArray(i.options)?i.options.map(e=>String(e)):[],allowFreeText:i.allowFreeText!==!1,multiple:i.multiple===!0};break;case`done`:{let e=i.content||O.content,t=u(e);t.reasoning&&!O.reasoning&&(O.reasoning=t.reasoning),O.content=t.content,O.status=`done`,O.reasoningStatus===`streaming`&&(O.reasoningStatus=`done`);break}case`error`:O.status=`error`,O.error=String(i.error||d(`@AGENT:未知错误`)),O.reasoningStatus===`streaming`&&(O.reasoningStatus=`done`)}}}if(x!==g.nonce)return;O.status===`pending`&&(O.status=`done`)}catch(e){if(x!==g.nonce)return;e?.name===`AbortError`||S.signal.aborted?(N=!0,O.content=(O.content||``)+`
4
4
 
@@ -1 +1 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{Cn as e,Rn as t,a as n,br as r,n as i,or as a,pr as o,t as s}from"./element-plus-Bx3j6vzG.js";import{b as c,g as l,p as u}from"./vendor-BjomZKSS.js";import{a as d,n as f,r as p}from"./_plugin-vue_export-helper-C7IvbEC3.js";var m=`zen-gitsync-task-executor`,h=[{id:`claude`,name:`Claude Code`},{id:`opencode`,name:`OpenCode`},{id:`codex`,name:`Codex`}];function g(e){return h.some(t=>t.id===e)}function _(e){return h.find(t=>t.id===e)?.name||h[0].name}function v(){try{let e=localStorage.getItem(m);if(g(e))return e}catch{}return`claude`}function y(e){try{localStorage.setItem(m,e)}catch{}}var b={"zh-CN":i,"en-US":s};function x(e){return b[e]||i}o(),t();var S=c(`locale`,()=>{let t=r(p()),n=e(()=>x(t.value));async function i(e){d(e),t.value=e;let n=A();n.locale!==e&&await n.saveGeneralSettings({locale:e})}return{currentLocale:t,elementPlusLocale:n,changeLocale:i}}),C=`flowdash-md-preview-theme`,w=`data-md-theme`,T=`github`,E=Object.keys(u);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=l(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():T,n=l(t)??l(`github`),r=document.getElementById(C);if(!n){r?.remove();return}r||(r=document.createElement(`style`),r.id=C,document.head.appendChild(r)),r.setAttribute(w,t),r.textContent!==n&&(r.textContent=n)}o(),t();var A=c(`config`,()=>{let t=r(``),i=r([]),o=r([]),s=r([]),c=r([]),l=r([]),u=r([]),p=r([]),m=r([]),h=r(!1),_=r({enabled:!1,type:`command`,refId:``}),v=r(!1),y=r(!1),b=r(``),x=r(``),C=r(``),w=r(!0),D=r(!1),O=r(!0),A=r(!1),j=r(!1),M=r(!0),N=r(`light`),P=r(`zh-CN`),F=r([]),I=r(200),L=r(`claude`),R=r(!0),z=r(!0),B={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:[],pickerGlobalSearch:!1,markdownTheme:T,editorWorkspaceByProject:{}},V=r(JSON.parse(JSON.stringify(B))),H=r(!1);function ee(e){C.value=e||``}let te=e(()=>{let e=C.value;return e?V.value.aiDiffSummaryByProject[e]!==!1:!1});function ne(){let e=C.value;if(e&&V.value.layoutsByProject?.[e]){V.value.layout={...V.value.layoutsByProject[e]};return}}function U(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 re(){let e=document.documentElement.getAttribute(`data-theme`)===`dark`?`light`:`dark`;return N.value=e,U(e),$({theme:e}).catch(e=>{console.error(`保存主题切换结果失败:`,e)}),e}U(N.value);let W=e(()=>({defaultCommitMessage:t.value,descriptionTemplates:i.value,scopeTemplates:o.value,messageTemplates:s.value,commandTemplates:c.value,lockedFiles:l.value,customCommands:u.value,orchestrations:p.value,startupItems:m.value,startupAutoRun:h.value,afterQuickPushAction:_.value,currentDirectory:C.value})),ie=e(()=>!!(b.value&&b.value.trim()));async function ae(){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 G(e=!1){if(!e&&y.value&&!v.value)return console.log(f(`@D50BB:使用缓存的配置信息`)),W.value;v.value=!0;try{v.value=!0,console.log(f(`@D50BB:加载配置信息...`));let e=await fetch(`/api/config/getConfig`),r=await e.json().catch(()=>({}));if(!e.ok||r&&r.success===!1){let e=String(r?.error||f(`@D50BB:加载配置失败`)),t=String(r?.configPath||``),i=t?`\n${f(`@D50BB:配置文件`)}: ${t}`:``;return n.error(`${f(`@D50BB:加载配置失败: `)}${e}${i}`),b.value=e,x.value=t,null}if(b.value=``,x.value=``,t.value=r.defaultCommitMessage||``,i.value=r.descriptionTemplates||[],o.value=r.scopeTemplates||[],s.value=r.messageTemplates||[],c.value=r.commandTemplates||[],l.value=r.lockedFiles||[],u.value=r.customCommands||[],p.value=r.orchestrations||[],m.value=(r.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),h.value=r.startupAutoRun||!1,_.value={enabled:!!r?.afterQuickPushAction?.enabled,type:r?.afterQuickPushAction?.type===`workflow`?`workflow`:`command`,refId:String(r?.afterQuickPushAction?.refId||``).trim()},r.isStandardCommit!==void 0&&(O.value=!!r.isStandardCommit),r.skipHooks!==void 0&&(A.value=!!r.skipHooks),r.autoQuickPushOnEnter!==void 0&&(j.value=!!r.autoQuickPushOnEnter),r.autoSetDefaultMessage!==void 0&&(D.value=!!r.autoSetDefaultMessage),r.autoClosePushModal!==void 0&&(w.value=!!r.autoClosePushModal),r.pullBeforePush!==void 0&&(M.value=!!r.pullBeforePush),Array.isArray(r.models)&&(F.value=r.models),Number.isFinite(Number(r.aiMaxToolIterations))&&Number(r.aiMaxToolIterations)>0&&(I.value=Math.floor(Number(r.aiMaxToolIterations))),g(r.taskExecutor)&&(L.value=r.taskExecutor),typeof r.notifyOnTaskDone==`boolean`&&(R.value=r.notifyOnTaskDone),typeof r.notifySoundOnTaskDone==`boolean`&&(z.value=r.notifySoundOnTaskDone),r.theme&&[`light`,`dark`,`auto`].includes(r.theme)&&(N.value=r.theme,U(r.theme)),r.locale&&[`zh-CN`,`en-US`].includes(r.locale)){P.value=r.locale,d(r.locale);let e=S();e.currentLocale=r.locale}if(r.currentDirectory&&(C.value=r.currentDirectory),r.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,B.layout.leftRatio),midRatio:e(r,B.layout.midRatio),rightRatio:e(i,B.layout.rightRatio),topRatio:e(a,B.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)):B.commandConsole.splitPercent}}let f=e(`zen-gitsync-editor-auto-save`);f!=null&&(t.editorAutoSave=f===`true`),Object.keys(t).length>0&&(V.value={...V.value,...t}),Object.keys(t).length>0&&X(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=r.ui.layoutsByProject&&typeof r.ui.layoutsByProject==`object`&&!Array.isArray(r.ui.layoutsByProject)?r.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):B.layout.leftRatio,midRatio:Number.isFinite(Number(e.midRatio))?Number(e.midRatio):B.layout.midRatio,rightRatio:Number.isFinite(Number(e.rightRatio))?Number(e.rightRatio):B.layout.rightRatio,topRatio:Number.isFinite(Number(e.topRatio))?Number(e.topRatio):B.layout.topRatio}}let n=r.ui.aiDiffSummaryByProject&&typeof r.ui.aiDiffSummaryByProject==`object`&&!Array.isArray(r.ui.aiDiffSummaryByProject)?r.ui.aiDiffSummaryByProject:{},i={};for(let[e,t]of Object.entries(n))typeof t==`boolean`&&(i[e]=t);let a=r.ui.editorWorkspaceByProject&&typeof r.ui.editorWorkspaceByProject==`object`&&!Array.isArray(r.ui.editorWorkspaceByProject)?r.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 r.ui.mindmapDir==`string`?r.ui.mindmapDir.trim():``,l=[],u=new Set,d=Array.isArray(r.ui.mindmapDirs)?r.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={...B.layout,...r.ui.layout||{}};V.value={layout:f,layoutsByProject:t,aiDiffSummaryByProject:i,fileListViewMode:r.ui.fileListViewMode===`tree`?`tree`:`list`,fileDiffSplitPercent:Number.isFinite(Number(r.ui.fileDiffSplitPercent))?Math.min(85,Math.max(15,Number(r.ui.fileDiffSplitPercent))):B.fileDiffSplitPercent,diffPreviewSplitPercent:Number.isFinite(Number(r.ui.diffPreviewSplitPercent))?Math.min(85,Math.max(25,Number(r.ui.diffPreviewSplitPercent))):B.diffPreviewSplitPercent,commandConsole:{expanded:typeof r.ui.commandConsole?.expanded==`boolean`?r.ui.commandConsole.expanded:B.commandConsole.expanded,useTerminal:typeof r.ui.commandConsole?.useTerminal==`boolean`?r.ui.commandConsole.useTerminal:B.commandConsole.useTerminal,showTerminalSessions:typeof r.ui.commandConsole?.showTerminalSessions==`boolean`?r.ui.commandConsole.showTerminalSessions:B.commandConsole.showTerminalSessions,splitPercent:Number.isFinite(Number(r.ui.commandConsole?.splitPercent))?Math.min(85,Math.max(15,Number(r.ui.commandConsole.splitPercent))):B.commandConsole.splitPercent},editorAutoSave:typeof r.ui.editorAutoSave==`boolean`?r.ui.editorAutoSave:B.editorAutoSave,fileTreeAutoRefresh:typeof r.ui.fileTreeAutoRefresh==`boolean`?r.ui.fileTreeAutoRefresh:B.fileTreeAutoRefresh,editorSidebarWidth:Number.isFinite(Number(r.ui.editorSidebarWidth))?Math.min(400,Math.max(140,Number(r.ui.editorSidebarWidth))):B.editorSidebarWidth,mindmapDirs:l,mindmapDir:c,headerToolsHidden:Array.isArray(r.ui.headerToolsHidden)?r.ui.headerToolsHidden.filter(e=>typeof e==`string`):[],pickerGlobalSearch:typeof r.ui.pickerGlobalSearch==`boolean`?r.ui.pickerGlobalSearch:B.pickerGlobalSearch,markdownTheme:typeof r.ui.markdownTheme==`string`&&E.includes(r.ui.markdownTheme)?r.ui.markdownTheme:B.markdownTheme,editorWorkspaceByProject:o}}return ne(),k(V.value.markdownTheme),H.value=!0,y.value=!0,console.log(f(`@D50BB:配置信息加载完成`)),W.value}catch(e){return console.error(`加载配置失败:`,e),n.error(`${f(`@D50BB:加载配置失败: `)}${e.message}`),b.value=e.message,null}finally{v.value=!1}}async function K(){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:w.value,pullBeforePush:M.value})})}catch(e){console.error(`保存提交设置失败:`,e)}}a([O,A,j,D,w,M],()=>{y.value&&K()});let q=null,J={};async function Y(){if(q&&=(clearTimeout(q),null),Object.keys(J).length===0)return;let e=J;J={};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 X(e,t={}){if(H.value){if(t.immediate){Object.assign(J,e),await Y();return}Object.assign(J,e),q&&clearTimeout(q),q=setTimeout(()=>{Y()},300)}}async function oe(){V.value.layout={...B.layout};let e=C.value;return e&&(V.value.layoutsByProject={...V.value.layoutsByProject,[e]:{...V.value.layout}}),await X({layoutsByProject:V.value.layoutsByProject},{immediate:!0}),V.value.layout}async function se(e){let t=C.value;t&&(V.value.aiDiffSummaryByProject={...V.value.aiDiffSummaryByProject,[t]:e},await X({aiDiffSummaryByProject:{[t]:e}},{immediate:!0}))}async function ce(e){if(!Number.isFinite(e))return;let t=Math.min(400,Math.max(140,e));V.value.editorSidebarWidth=t,await X({editorSidebarWidth:t})}function le(e){let t=C.value;if(!t)return;let n=e.tabs.slice(0,40);V.value.editorWorkspaceByProject={...V.value.editorWorkspaceByProject,[t]:{expandedDirs:e.expandedDirs.slice(0,200),tabs:n,activeTab:e.activeTab&&n.includes(e.activeTab)?e.activeTab:null}},X({editorWorkspaceByProject:V.value.editorWorkspaceByProject})}function ue(e){let t=e??C.value;return t?V.value.editorWorkspaceByProject[t]??null:null}a(()=>V.value.fileListViewMode,e=>{H.value&&X({fileListViewMode:e})}),a(()=>V.value.fileDiffSplitPercent,e=>{H.value&&X({fileDiffSplitPercent:e})}),a(()=>V.value.diffPreviewSplitPercent,e=>{H.value&&e!=null&&X({diffPreviewSplitPercent:e})}),a(()=>V.value.editorAutoSave,e=>{H.value&&X({editorAutoSave:e})}),a(()=>V.value.fileTreeAutoRefresh,e=>{H.value&&X({fileTreeAutoRefresh:e})}),a(()=>V.value.headerToolsHidden,e=>{H.value&&Array.isArray(e)&&X({headerToolsHidden:e})}),a(()=>V.value.mindmapDirs,e=>{H.value&&Array.isArray(e)&&X({mindmapDirs:e})}),a(()=>V.value.pickerGlobalSearch,e=>{H.value&&X({pickerGlobalSearch:e})});let de=e(()=>V.value.markdownTheme);async function fe(e){let t=E.includes(e)?e:B.markdownTheme;return V.value.markdownTheme=t,k(t),await X({markdownTheme:t},{immediate:!0}),t}a(()=>V.value.markdownTheme,e=>{H.value&&typeof e==`string`&&e&&(k(e),X({markdownTheme:e}))}),a(()=>V.value.layout,e=>{if(!H.value)return;let t=C.value;t&&(V.value.layoutsByProject={...V.value.layoutsByProject,[t]:e},X({layoutsByProject:V.value.layoutsByProject}))},{deep:!0}),a(()=>V.value.commandConsole,e=>{H.value&&X({commandConsole:e})},{deep:!0}),typeof window<`u`&&window.addEventListener(`beforeunload`,()=>{Y()});async function pe(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 me(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 he(e,t){try{let r=await(await fetch(`/api/config/save-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return r.success?(t===`description`?i.value.includes(e)||i.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)),n.success(f(`@D50BB:模板已保存`)),!0):(n.error(`${f(`@D50BB:保存模板失败: `)}${r.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:保存模板失败: `)}${e.message}`),!1}}async function ge(e,t){try{let r=await(await fetch(`/api/config/delete-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return r.success?(t===`description`?i.value=i.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)),n.success(f(`@D50BB:模板已删除`)),!0):(n.error(`${f(`@D50BB:删除模板失败: `)}${r.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:删除模板失败: `)}${e.message}`),!1}}async function _e(e,t,r){try{let a=await(await fetch(`/api/config/update-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({oldTemplate:e,newTemplate:t,type:r})})).json();if(a.success){if(r===`description`){let n=i.value.indexOf(e);n!==-1&&(i.value[n]=t)}else if(r===`scope`){let n=o.value.indexOf(e);n!==-1&&(o.value[n]=t)}else if(r===`message`){let n=s.value.indexOf(e);n!==-1&&(s.value[n]=t)}else if(r===`command`){let n=c.value.indexOf(e);n!==-1&&(c.value[n]=t)}return n.success(f(`@D50BB:模板已更新`)),!0}return n.error(`${f(`@D50BB:更新模板失败: `)}${a.error}`),!1}catch(e){return n.error(`${f(`@D50BB:更新模板失败: `)}${e.message}`),!1}}async function ve(e,t){try{let r=await(await fetch(`/api/config/pin-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return r.success?(t===`description`?(i.value=i.value.filter(t=>t!==e),i.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)),n.success(f(`@D50BB:模板已置顶`)),!0):(n.error(`${f(`@D50BB:置顶模板失败: `)}${r.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:置顶模板失败: `)}${e.message}`),!1}}async function Z(){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 ye(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 Z(),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 be(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 Z(),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 xe(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 Se(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 G(!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 Ce(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 G(!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 we(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 G(!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 Q(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 G(!0),!0):(n.error(t.error),!1)}catch(e){return n.error(e.message),!1}}async function Te(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 G(!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 Ee(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 G(!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 De(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 G(!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 Oe(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?h.value:t})})).json();return r.success?(m.value=e,t!==void 0&&(h.value=t),!0):(n.error(`保存启动项失败: ${r.error}`),!1)}catch(e){return n.error(`保存启动项失败: ${e.message}`),!1}}async function ke(e){try{let t=await(await fetch(`/api/config/save-ai-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({aiMaxToolIterations:e.aiMaxToolIterations})})).json();return t.success?(I.value=Number(t.aiMaxToolIterations)||e.aiMaxToolIterations,!0):(n.error(`${f(`@D50BB:保存 AI 设置失败: `)}${t.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:保存 AI 设置失败: `)}${e.message}`),!1}}async function Ae(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 $(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,U(e.theme)),e.locale){P.value=e.locale,d(e.locale);let t=S();t.currentLocale=e.locale}return g(e.taskExecutor)&&(L.value=e.taskExecutor),typeof e.notifyOnTaskDone==`boolean`&&(R.value=e.notifyOnTaskDone),typeof e.notifySoundOnTaskDone==`boolean`&&(z.value=e.notifySoundOnTaskDone),!0}return n.error(`保存通用设置失败: ${t.error}`),!1}catch(e){return n.error(`保存通用设置失败: ${e.message}`),!1}}return{models:F,aiMaxToolIterations:I,taskExecutor:L,notifyOnTaskDone:R,notifySoundOnTaskDone:z,defaultCommitMessage:t,descriptionTemplates:i,scopeTemplates:o,messageTemplates:s,commandTemplates:c,lockedFiles:l,customCommands:u,orchestrations:p,startupItems:m,startupAutoRun:h,afterQuickPushAction:_,isLoading:v,isLoaded:y,configLoadError:b,configFilePath:x,hasConfigLoadError:ie,currentDirectory:C,config:W,autoClosePushModal:w,autoSetDefaultMessage:D,isStandardCommit:O,skipHooks:A,autoQuickPushOnEnter:j,pullBeforePush:M,theme:N,locale:P,ui:V,isUiLoaded:H,aiDiffSummaryEnabled:te,markdownTheme:de,loadConfig:G,setCurrentDirectory:ee,openSystemConfigFile:ae,saveTemplate:he,saveModels:Ae,saveAiSettings:ke,saveGeneralSettings:$,saveUiSettings:X,setAiDiffSummaryEnabled:se,setEditorSidebarWidth:ce,saveEditorWorkspace:le,getEditorWorkspace:ue,setMarkdownTheme:fe,resetUiLayout:oe,applyTheme:U,toggleTheme:re,saveDefaultMessage:pe,deleteTemplate:ge,updateTemplate:_e,pinTemplate:ve,loadLockedFiles:Z,lockFile:ye,unlockFile:be,isFileLocked:xe,saveCustomCommand:Se,deleteCustomCommand:Ce,updateCustomCommand:we,pinCustomCommand:Q,saveOrchestration:Te,deleteOrchestration:Ee,updateOrchestration:De,saveStartupItems:Oe,saveAfterQuickPushAction:me,saveCommitSettings:K}});export{v as a,_ as c,h as i,O as n,g as o,S as r,y as s,A as t};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{Cn as e,Rn as t,a as n,br as r,n as i,or as a,pr as o,t as s}from"./element-plus-Bx3j6vzG.js";import{b as c,g as l,p as u}from"./vendor-BjomZKSS.js";import{a as d,n as f,r as p}from"./_plugin-vue_export-helper-CGArUtKL.js";var m=`zen-gitsync-task-executor`,h=[{id:`claude`,name:`Claude Code`},{id:`opencode`,name:`OpenCode`},{id:`codex`,name:`Codex`}];function g(e){return h.some(t=>t.id===e)}function _(e){return h.find(t=>t.id===e)?.name||h[0].name}function v(){try{let e=localStorage.getItem(m);if(g(e))return e}catch{}return`claude`}function y(e){try{localStorage.setItem(m,e)}catch{}}var b={"zh-CN":i,"en-US":s};function x(e){return b[e]||i}o(),t();var S=c(`locale`,()=>{let t=r(p()),n=e(()=>x(t.value));async function i(e){d(e),t.value=e;let n=A();n.locale!==e&&await n.saveGeneralSettings({locale:e})}return{currentLocale:t,elementPlusLocale:n,changeLocale:i}}),C=`flowdash-md-preview-theme`,w=`data-md-theme`,T=`github`,E=Object.keys(u);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=l(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():T,n=l(t)??l(`github`),r=document.getElementById(C);if(!n){r?.remove();return}r||(r=document.createElement(`style`),r.id=C,document.head.appendChild(r)),r.setAttribute(w,t),r.textContent!==n&&(r.textContent=n)}o(),t();var A=c(`config`,()=>{let t=r(``),i=r([]),o=r([]),s=r([]),c=r([]),l=r([]),u=r([]),p=r([]),m=r([]),h=r(!1),_=r({enabled:!1,type:`command`,refId:``}),v=r(!1),y=r(!1),b=r(``),x=r(``),C=r(``),w=r(!0),D=r(!1),O=r(!0),A=r(!1),j=r(!1),M=r(!0),N=r(`light`),P=r(`zh-CN`),F=r([]),I=r(200),L=r(`claude`),R=r(!0),z=r(!0),B={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:[],pickerGlobalSearch:!1,markdownTheme:T,editorWorkspaceByProject:{}},V=r(JSON.parse(JSON.stringify(B))),H=r(!1);function ee(e){C.value=e||``}let te=e(()=>{let e=C.value;return e?V.value.aiDiffSummaryByProject[e]!==!1:!1});function ne(){let e=C.value;if(e&&V.value.layoutsByProject?.[e]){V.value.layout={...V.value.layoutsByProject[e]};return}}function U(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 re(){let e=document.documentElement.getAttribute(`data-theme`)===`dark`?`light`:`dark`;return N.value=e,U(e),$({theme:e}).catch(e=>{console.error(`保存主题切换结果失败:`,e)}),e}U(N.value);let W=e(()=>({defaultCommitMessage:t.value,descriptionTemplates:i.value,scopeTemplates:o.value,messageTemplates:s.value,commandTemplates:c.value,lockedFiles:l.value,customCommands:u.value,orchestrations:p.value,startupItems:m.value,startupAutoRun:h.value,afterQuickPushAction:_.value,currentDirectory:C.value})),ie=e(()=>!!(b.value&&b.value.trim()));async function ae(){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 G(e=!1){if(!e&&y.value&&!v.value)return console.log(f(`@D50BB:使用缓存的配置信息`)),W.value;v.value=!0;try{v.value=!0,console.log(f(`@D50BB:加载配置信息...`));let e=await fetch(`/api/config/getConfig`),r=await e.json().catch(()=>({}));if(!e.ok||r&&r.success===!1){let e=String(r?.error||f(`@D50BB:加载配置失败`)),t=String(r?.configPath||``),i=t?`\n${f(`@D50BB:配置文件`)}: ${t}`:``;return n.error(`${f(`@D50BB:加载配置失败: `)}${e}${i}`),b.value=e,x.value=t,null}if(b.value=``,x.value=``,t.value=r.defaultCommitMessage||``,i.value=r.descriptionTemplates||[],o.value=r.scopeTemplates||[],s.value=r.messageTemplates||[],c.value=r.commandTemplates||[],l.value=r.lockedFiles||[],u.value=r.customCommands||[],p.value=r.orchestrations||[],m.value=(r.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),h.value=r.startupAutoRun||!1,_.value={enabled:!!r?.afterQuickPushAction?.enabled,type:r?.afterQuickPushAction?.type===`workflow`?`workflow`:`command`,refId:String(r?.afterQuickPushAction?.refId||``).trim()},r.isStandardCommit!==void 0&&(O.value=!!r.isStandardCommit),r.skipHooks!==void 0&&(A.value=!!r.skipHooks),r.autoQuickPushOnEnter!==void 0&&(j.value=!!r.autoQuickPushOnEnter),r.autoSetDefaultMessage!==void 0&&(D.value=!!r.autoSetDefaultMessage),r.autoClosePushModal!==void 0&&(w.value=!!r.autoClosePushModal),r.pullBeforePush!==void 0&&(M.value=!!r.pullBeforePush),Array.isArray(r.models)&&(F.value=r.models),Number.isFinite(Number(r.aiMaxToolIterations))&&Number(r.aiMaxToolIterations)>0&&(I.value=Math.floor(Number(r.aiMaxToolIterations))),g(r.taskExecutor)&&(L.value=r.taskExecutor),typeof r.notifyOnTaskDone==`boolean`&&(R.value=r.notifyOnTaskDone),typeof r.notifySoundOnTaskDone==`boolean`&&(z.value=r.notifySoundOnTaskDone),r.theme&&[`light`,`dark`,`auto`].includes(r.theme)&&(N.value=r.theme,U(r.theme)),r.locale&&[`zh-CN`,`en-US`].includes(r.locale)){P.value=r.locale,d(r.locale);let e=S();e.currentLocale=r.locale}if(r.currentDirectory&&(C.value=r.currentDirectory),r.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,B.layout.leftRatio),midRatio:e(r,B.layout.midRatio),rightRatio:e(i,B.layout.rightRatio),topRatio:e(a,B.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)):B.commandConsole.splitPercent}}let f=e(`zen-gitsync-editor-auto-save`);f!=null&&(t.editorAutoSave=f===`true`),Object.keys(t).length>0&&(V.value={...V.value,...t}),Object.keys(t).length>0&&X(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=r.ui.layoutsByProject&&typeof r.ui.layoutsByProject==`object`&&!Array.isArray(r.ui.layoutsByProject)?r.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):B.layout.leftRatio,midRatio:Number.isFinite(Number(e.midRatio))?Number(e.midRatio):B.layout.midRatio,rightRatio:Number.isFinite(Number(e.rightRatio))?Number(e.rightRatio):B.layout.rightRatio,topRatio:Number.isFinite(Number(e.topRatio))?Number(e.topRatio):B.layout.topRatio}}let n=r.ui.aiDiffSummaryByProject&&typeof r.ui.aiDiffSummaryByProject==`object`&&!Array.isArray(r.ui.aiDiffSummaryByProject)?r.ui.aiDiffSummaryByProject:{},i={};for(let[e,t]of Object.entries(n))typeof t==`boolean`&&(i[e]=t);let a=r.ui.editorWorkspaceByProject&&typeof r.ui.editorWorkspaceByProject==`object`&&!Array.isArray(r.ui.editorWorkspaceByProject)?r.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 r.ui.mindmapDir==`string`?r.ui.mindmapDir.trim():``,l=[],u=new Set,d=Array.isArray(r.ui.mindmapDirs)?r.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={...B.layout,...r.ui.layout||{}};V.value={layout:f,layoutsByProject:t,aiDiffSummaryByProject:i,fileListViewMode:r.ui.fileListViewMode===`tree`?`tree`:`list`,fileDiffSplitPercent:Number.isFinite(Number(r.ui.fileDiffSplitPercent))?Math.min(85,Math.max(15,Number(r.ui.fileDiffSplitPercent))):B.fileDiffSplitPercent,diffPreviewSplitPercent:Number.isFinite(Number(r.ui.diffPreviewSplitPercent))?Math.min(85,Math.max(25,Number(r.ui.diffPreviewSplitPercent))):B.diffPreviewSplitPercent,commandConsole:{expanded:typeof r.ui.commandConsole?.expanded==`boolean`?r.ui.commandConsole.expanded:B.commandConsole.expanded,useTerminal:typeof r.ui.commandConsole?.useTerminal==`boolean`?r.ui.commandConsole.useTerminal:B.commandConsole.useTerminal,showTerminalSessions:typeof r.ui.commandConsole?.showTerminalSessions==`boolean`?r.ui.commandConsole.showTerminalSessions:B.commandConsole.showTerminalSessions,splitPercent:Number.isFinite(Number(r.ui.commandConsole?.splitPercent))?Math.min(85,Math.max(15,Number(r.ui.commandConsole.splitPercent))):B.commandConsole.splitPercent},editorAutoSave:typeof r.ui.editorAutoSave==`boolean`?r.ui.editorAutoSave:B.editorAutoSave,fileTreeAutoRefresh:typeof r.ui.fileTreeAutoRefresh==`boolean`?r.ui.fileTreeAutoRefresh:B.fileTreeAutoRefresh,editorSidebarWidth:Number.isFinite(Number(r.ui.editorSidebarWidth))?Math.min(400,Math.max(140,Number(r.ui.editorSidebarWidth))):B.editorSidebarWidth,mindmapDirs:l,mindmapDir:c,headerToolsHidden:Array.isArray(r.ui.headerToolsHidden)?r.ui.headerToolsHidden.filter(e=>typeof e==`string`):[],pickerGlobalSearch:typeof r.ui.pickerGlobalSearch==`boolean`?r.ui.pickerGlobalSearch:B.pickerGlobalSearch,markdownTheme:typeof r.ui.markdownTheme==`string`&&E.includes(r.ui.markdownTheme)?r.ui.markdownTheme:B.markdownTheme,editorWorkspaceByProject:o}}return ne(),k(V.value.markdownTheme),H.value=!0,y.value=!0,console.log(f(`@D50BB:配置信息加载完成`)),W.value}catch(e){return console.error(`加载配置失败:`,e),n.error(`${f(`@D50BB:加载配置失败: `)}${e.message}`),b.value=e.message,null}finally{v.value=!1}}async function K(){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:w.value,pullBeforePush:M.value})})}catch(e){console.error(`保存提交设置失败:`,e)}}a([O,A,j,D,w,M],()=>{y.value&&K()});let q=null,J={};async function Y(){if(q&&=(clearTimeout(q),null),Object.keys(J).length===0)return;let e=J;J={};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 X(e,t={}){if(H.value){if(t.immediate){Object.assign(J,e),await Y();return}Object.assign(J,e),q&&clearTimeout(q),q=setTimeout(()=>{Y()},300)}}async function oe(){V.value.layout={...B.layout};let e=C.value;return e&&(V.value.layoutsByProject={...V.value.layoutsByProject,[e]:{...V.value.layout}}),await X({layoutsByProject:V.value.layoutsByProject},{immediate:!0}),V.value.layout}async function se(e){let t=C.value;t&&(V.value.aiDiffSummaryByProject={...V.value.aiDiffSummaryByProject,[t]:e},await X({aiDiffSummaryByProject:{[t]:e}},{immediate:!0}))}async function ce(e){if(!Number.isFinite(e))return;let t=Math.min(400,Math.max(140,e));V.value.editorSidebarWidth=t,await X({editorSidebarWidth:t})}function le(e){let t=C.value;if(!t)return;let n=e.tabs.slice(0,40);V.value.editorWorkspaceByProject={...V.value.editorWorkspaceByProject,[t]:{expandedDirs:e.expandedDirs.slice(0,200),tabs:n,activeTab:e.activeTab&&n.includes(e.activeTab)?e.activeTab:null}},X({editorWorkspaceByProject:V.value.editorWorkspaceByProject})}function ue(e){let t=e??C.value;return t?V.value.editorWorkspaceByProject[t]??null:null}a(()=>V.value.fileListViewMode,e=>{H.value&&X({fileListViewMode:e})}),a(()=>V.value.fileDiffSplitPercent,e=>{H.value&&X({fileDiffSplitPercent:e})}),a(()=>V.value.diffPreviewSplitPercent,e=>{H.value&&e!=null&&X({diffPreviewSplitPercent:e})}),a(()=>V.value.editorAutoSave,e=>{H.value&&X({editorAutoSave:e})}),a(()=>V.value.fileTreeAutoRefresh,e=>{H.value&&X({fileTreeAutoRefresh:e})}),a(()=>V.value.headerToolsHidden,e=>{H.value&&Array.isArray(e)&&X({headerToolsHidden:e})}),a(()=>V.value.mindmapDirs,e=>{H.value&&Array.isArray(e)&&X({mindmapDirs:e})}),a(()=>V.value.pickerGlobalSearch,e=>{H.value&&X({pickerGlobalSearch:e})});let de=e(()=>V.value.markdownTheme);async function fe(e){let t=E.includes(e)?e:B.markdownTheme;return V.value.markdownTheme=t,k(t),await X({markdownTheme:t},{immediate:!0}),t}a(()=>V.value.markdownTheme,e=>{H.value&&typeof e==`string`&&e&&(k(e),X({markdownTheme:e}))}),a(()=>V.value.layout,e=>{if(!H.value)return;let t=C.value;t&&(V.value.layoutsByProject={...V.value.layoutsByProject,[t]:e},X({layoutsByProject:V.value.layoutsByProject}))},{deep:!0}),a(()=>V.value.commandConsole,e=>{H.value&&X({commandConsole:e})},{deep:!0}),typeof window<`u`&&window.addEventListener(`beforeunload`,()=>{Y()});async function pe(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 me(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 he(e,t){try{let r=await(await fetch(`/api/config/save-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return r.success?(t===`description`?i.value.includes(e)||i.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)),n.success(f(`@D50BB:模板已保存`)),!0):(n.error(`${f(`@D50BB:保存模板失败: `)}${r.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:保存模板失败: `)}${e.message}`),!1}}async function ge(e,t){try{let r=await(await fetch(`/api/config/delete-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return r.success?(t===`description`?i.value=i.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)),n.success(f(`@D50BB:模板已删除`)),!0):(n.error(`${f(`@D50BB:删除模板失败: `)}${r.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:删除模板失败: `)}${e.message}`),!1}}async function _e(e,t,r){try{let a=await(await fetch(`/api/config/update-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({oldTemplate:e,newTemplate:t,type:r})})).json();if(a.success){if(r===`description`){let n=i.value.indexOf(e);n!==-1&&(i.value[n]=t)}else if(r===`scope`){let n=o.value.indexOf(e);n!==-1&&(o.value[n]=t)}else if(r===`message`){let n=s.value.indexOf(e);n!==-1&&(s.value[n]=t)}else if(r===`command`){let n=c.value.indexOf(e);n!==-1&&(c.value[n]=t)}return n.success(f(`@D50BB:模板已更新`)),!0}return n.error(`${f(`@D50BB:更新模板失败: `)}${a.error}`),!1}catch(e){return n.error(`${f(`@D50BB:更新模板失败: `)}${e.message}`),!1}}async function ve(e,t){try{let r=await(await fetch(`/api/config/pin-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return r.success?(t===`description`?(i.value=i.value.filter(t=>t!==e),i.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)),n.success(f(`@D50BB:模板已置顶`)),!0):(n.error(`${f(`@D50BB:置顶模板失败: `)}${r.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:置顶模板失败: `)}${e.message}`),!1}}async function Z(){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 ye(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 Z(),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 be(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 Z(),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 xe(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 Se(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 G(!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 Ce(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 G(!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 we(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 G(!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 Q(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 G(!0),!0):(n.error(t.error),!1)}catch(e){return n.error(e.message),!1}}async function Te(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 G(!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 Ee(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 G(!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 De(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 G(!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 Oe(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?h.value:t})})).json();return r.success?(m.value=e,t!==void 0&&(h.value=t),!0):(n.error(`保存启动项失败: ${r.error}`),!1)}catch(e){return n.error(`保存启动项失败: ${e.message}`),!1}}async function ke(e){try{let t=await(await fetch(`/api/config/save-ai-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({aiMaxToolIterations:e.aiMaxToolIterations})})).json();return t.success?(I.value=Number(t.aiMaxToolIterations)||e.aiMaxToolIterations,!0):(n.error(`${f(`@D50BB:保存 AI 设置失败: `)}${t.error}`),!1)}catch(e){return n.error(`${f(`@D50BB:保存 AI 设置失败: `)}${e.message}`),!1}}async function Ae(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 $(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,U(e.theme)),e.locale){P.value=e.locale,d(e.locale);let t=S();t.currentLocale=e.locale}return g(e.taskExecutor)&&(L.value=e.taskExecutor),typeof e.notifyOnTaskDone==`boolean`&&(R.value=e.notifyOnTaskDone),typeof e.notifySoundOnTaskDone==`boolean`&&(z.value=e.notifySoundOnTaskDone),!0}return n.error(`保存通用设置失败: ${t.error}`),!1}catch(e){return n.error(`保存通用设置失败: ${e.message}`),!1}}return{models:F,aiMaxToolIterations:I,taskExecutor:L,notifyOnTaskDone:R,notifySoundOnTaskDone:z,defaultCommitMessage:t,descriptionTemplates:i,scopeTemplates:o,messageTemplates:s,commandTemplates:c,lockedFiles:l,customCommands:u,orchestrations:p,startupItems:m,startupAutoRun:h,afterQuickPushAction:_,isLoading:v,isLoaded:y,configLoadError:b,configFilePath:x,hasConfigLoadError:ie,currentDirectory:C,config:W,autoClosePushModal:w,autoSetDefaultMessage:D,isStandardCommit:O,skipHooks:A,autoQuickPushOnEnter:j,pullBeforePush:M,theme:N,locale:P,ui:V,isUiLoaded:H,aiDiffSummaryEnabled:te,markdownTheme:de,loadConfig:G,setCurrentDirectory:ee,openSystemConfigFile:ae,saveTemplate:he,saveModels:Ae,saveAiSettings:ke,saveGeneralSettings:$,saveUiSettings:X,setAiDiffSummaryEnabled:se,setEditorSidebarWidth:ce,saveEditorWorkspace:le,getEditorWorkspace:ue,setMarkdownTheme:fe,resetUiLayout:oe,applyTheme:U,toggleTheme:re,saveDefaultMessage:pe,deleteTemplate:ge,updateTemplate:_e,pinTemplate:ve,loadLockedFiles:Z,lockFile:ye,unlockFile:be,isFileLocked:xe,saveCustomCommand:Se,deleteCustomCommand:Ce,updateCustomCommand:we,pinCustomCommand:Q,saveOrchestration:Te,deleteOrchestration:Ee,updateOrchestration:De,saveStartupItems:Oe,saveAfterQuickPushAction:me,saveCommitSettings:K}});export{v as a,_ as c,h as i,O as n,g as o,S as r,y as s,A as t};
@@ -1,4 +1,4 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{Cn as e,Jn as t,Rn as n,Yn as r,a as i,br as a,pr as o}from"./element-plus-Bx3j6vzG.js";import{b as s}from"./vendor-BjomZKSS.js";import{n as c}from"./_plugin-vue_export-helper-C7IvbEC3.js";import{t as ee}from"./socket-io-TBtw0msS.js";import{t as te}from"./configStore-C-htWfWm.js";var l=new Set([`5173`,`4173`,`5544`]),u=3e3;function d(){if(typeof window>`u`)return u;let e=window.location.port||`80`;if(l.has(e)){{let e=5546;if(!Number.isNaN(e))return e}return u}let t=parseInt(e,10);return Number.isNaN(t)?u:t}var f={PROCESS_INIT_FAILED:()=>c(`@PUSH:未能启动 git 进程(Windows 错误 0xC0000142:系统加载 DLL 失败)。这通常是系统的一次性瞬时故障,不是仓库的问题——请直接重试推送。`),PROCESS_DLL_NOT_FOUND:()=>c(`@PUSH:未能启动 git 进程(Windows 错误 0xC0000135:缺少依赖 DLL)。请检查 Git 安装是否完整,必要时重装 Git for Windows。`),PROCESS_NO_MEMORY:()=>c(`@PUSH:系统内存不足,git 进程未能启动(Windows 错误 0xC0000017)。请关闭一些程序后重试。`),PROCESS_CRASHED:()=>c(`@PUSH:git 进程崩溃(Windows 错误 0xC0000005:访问冲突),没有产生任何输出。请重试;若反复出现,检查安全软件是否拦截了 git。`),PROCESS_INTERRUPTED:()=>c(`@PUSH:推送已被中断(Windows 错误 0xC000013A)。`),GIT_NOT_FOUND:()=>c(`@PUSH:找不到 git 命令,请先安装 Git 并确保它在 PATH 中。`),PROCESS_EXITED:e=>c(`@PUSH:git 进程异常退出(退出码 {code}),且没有产生任何输出——通常是进程未能成功启动,请重试。`,{code:p(e.exitCode)})};function p(e){if(typeof e!=`number`||!Number.isFinite(e))return String(e);let t=e>>>0;return t>=2147483648?`0x${t.toString(16).toUpperCase()}`:String(t)}function ne(e){if(!e)return c(`@PUSH:未知错误`);let t=e.errorCode?f[e.errorCode]:void 0;return t?t(e):e.error||c(`@PUSH:未知错误`)}o(),n();var m=800,re=2e3,ie=d(),ae=`chore: init`,oe=1e3,h=new Set([`node_modules`,`bower_components`,`jspm_packages`,`dist`,`build`,`out`,`coverage`,`.next`,`.nuxt`,`.output`,`.svelte-kit`,`.parcel-cache`,`.turbo`,`.cache`,`.venv`,`venv`,`__pycache__`,`.tox`,`.mypy_cache`,`.pytest_cache`,`.gradle`,`target`,`Pods`]);function se(e){let t=String(e||``).split(`/`).filter(Boolean);for(let e=0;e<t.length-1;e++)if(h.has(t[e].toLowerCase()))return t.slice(0,e+1).join(`/`);return null}var g=[`.port`];function _(e){let t=(e?.generated??[]).map(e=>`${e.path}/`);for(let e of g)t.includes(e)||t.push(e);return t}var v=s(`git`,()=>{let n=te(),o=a(``),s=a([]),l=a(``),u=a(``),d=a(!1),f=a(!1),p=a(!1),h=a(0),g=a(``),_=a(!1),v=a([]),y=a(!1),ce=a(``),le=a(!1),ue=e(()=>v.value.length>1),b=a([]),x=a(!1),S=a(!1),C=a(!1),w=a(!1),de=a(!1),T=a(0),E=a(0),D=a(!1),O=a(``),fe=a(0),k=a(``),A=a(null),j=a(``),pe=a(``),M=a([]),me=a({staged:[],unstaged:[],untracked:[]}),N=a([]),P=a(!1),F=a(!1),I=a(!1),L=a(!1),R=a(!1),z=a(1),he=a(!0),ge=a(0),_e=0,ve=a([]),ye=a(!1),be=a(!1),B=a(!1),V=a(!1);function xe(){o.value=``,s.value=[],l.value=``,u.value=``,d.value=!1,f.value=!1,p.value=!1,h.value=0,T.value=0,E.value=0,D.value=!1,O.value=``,fe.value=0,x.value=!1,S.value=!1,C.value=!1,w.value=!1,g.value=``,_.value=!1,v.value=[],y.value=!1,ce.value=``,le.value=!1,b.value=[],M.value=[],me.value={staged:[],unstaged:[],untracked:[]},N.value=[],P.value=!1,F.value=!1,I.value=!1,L.value=!1,R.value=!1,z.value=1,he.value=!0,ge.value=0}async function H(e=!1,t=!1){if(p.value)try{console.log(c(`@C298B:获取分支状态...`));let n=`/api/branch-status`,r=[];e&&r.push(`force=true`),t&&r.push(`countOnly=true`),r.length>0&&(n+=`?`+r.join(`&`));let i=await(await fetch(n)).json();if(i){let e=T.value,t=E.value,n=D.value,r=O.value;if(T.value=i.ahead||0,E.value=i.behind||0,D.value=i.hasUpstream||!1,O.value=i.upstreamBranch||``,console.log(`${c(`@C298B:分支状态更新:领先 `)}${T.value}${c(`@C298B: 个提交,落后 `)}${E.value}${c(`@C298B: 个提交,上游分支:`)}${D.value?O.value:c(`@C298B:无`)}`),T.value!==e||E.value!==t||D.value!==n||O.value!==r){let n=Date.now();n-_e>=re?(_e=n,console.log(`[getBranchStatus] 检测到分支状态变化 (ahead: ${e}→${T.value}, behind: ${t}→${E.value}, upstream: ${r||`无`}→${O.value||`无`}), 自动刷新右侧提交历史`),G(!1)):console.log(`[getBranchStatus] 分支状态变化但在 ${re}ms 节流窗口内,跳过自动刷新`)}}}catch(e){console.error(`获取分支状态失败:`,e),T.value=0,E.value=0,D.value=!1,O.value=``}}async function Se(){let e=Date.now();if(e-h.value<1e3)return console.log(`使用缓存的Git仓库状态:`,p.value?`是`:c(`@C298B:不是`)),p.value;try{let t=await(await fetch(`/api/current_directory`)).json();return p.value=t.isGitRepo===!0,h.value=e,console.log(`${c(`@C298B:当前目录`)}${p.value?c(`@C298B:是`):c(`@C298B:不是`)}${c(`@C298B:Git仓库`)}`),p.value}catch(t){return console.error(`检查Git仓库状态失败:`,t),p.value=!1,h.value=e,!1}}async function U(e=!1){try{let t=await(await fetch(e?`/api/branch?force=true`:`/api/branch`)).json();t.branch&&(o.value=t.branch,console.log(`${c(`@C298B:当前分支更新为: `)}${t.branch}${e?c(`@C298B: (强制刷新)`):``}`))}catch(e){console.error(`获取分支信息失败:`,e)}}async function W(){if(p.value)try{console.log(c(`@C298B:获取所有分支...`));let e=await(await fetch(`/api/branches`)).json();e.branches&&Array.isArray(e.branches)&&(s.value=e.branches,fe.value=Date.now(),console.log(`${c(`@C298B:获取到`)}${e.branches.length}${c(`@C298B:个分支`)}`))}catch(e){console.error(`获取所有分支信息失败:`,e)}}async function Ce(e){console.log(`切换到分支:`,e);try{d.value=!0;let t=await(await fetch(`/api/checkout`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({branch:e})})).json();return t.success?(i({message:`${c(`@C298B:已切换到分支: `)}${t.branch||e}`,type:`success`}),await U(!0),await H(!0),!0):(i({message:`${c(`@C298B:切换分支失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:切换分支失败: `)}${e.message}`,type:`error`}),!1}finally{d.value=!1}}async function we(){try{let e=await(await fetch(`/api/user-info`)).json();l.value=e.name||``,u.value=e.email||``}catch(e){console.error(`获取用户信息失败:`,e)}}async function Te(e,t){if(!e.trim())return i({message:c(`@C298B:分支名称不能为空`),type:`warning`}),!1;try{f.value=!0;let n=await(await fetch(`/api/create-branch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({newBranchName:e,baseBranch:t||o.value})})).json();return n.success?(i({message:`${c(`@C298B:已创建并切换到分支: `)}${e}`,type:`success`}),await U(!0),await H(!0),await W(),!0):(i({message:`${c(`@C298B:创建分支失败: `)}${n.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:创建分支失败: `)}${e.message}`,type:`error`}),!1}finally{f.value=!1}}async function Ee(){try{let e=await(await fetch(`/api/clear-user-config`,{method:`POST`})).json();return e.success?(l.value=``,u.value=``,i({message:c(`@C298B:已清除Git用户配置`),type:`success`}),!0):(i({message:`${c(`@C298B:清除配置失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:清除配置失败: `)}${e.message}`,type:`error`}),!1}}async function De(e,t){try{let n=await(await fetch(`/api/restore-user-config`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e,email:t})})).json();return n.success?(l.value=e,u.value=t,i({message:c(`@C298B:已恢复Git用户配置`),type:`success`}),!0):(i({message:`${c(`@C298B:恢复配置失败: `)}${n.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:恢复配置失败: `)}${e.message}`,type:`error`}),!1}}async function Oe(){if(!p.value)return i({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),{success:!1,needsMerge:!1,error:c(`@C298B:当前目录不是Git仓库`),fullError:``,pullOutput:``};try{S.value=!0;let e=await(await fetch(`/api/pull`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:拉取成功`),type:`success`}),await Promise.all([H(!0),W(),Ne()]),{success:!0,hadChanges:!0}):{success:!1,needsMerge:e.needsMerge||!1,error:e.error||``,fullError:e.fullError||e.error||``,pullOutput:e.pullOutput||``}}catch(e){return{success:!1,needsMerge:!1,error:e.message,fullError:e.message,pullOutput:``}}finally{S.value=!1}}async function ke(){if(!p.value)return!1;if(!D.value)return console.log(`[bootFetch] no upstream, skip`),!1;try{C.value=!0;let e=E.value;console.log(`[bootFetch] start silent fetch --all, beforeBehind=${e}`);let t=await(await fetch(`/api/fetch-all`,{method:`POST`})).json();if(!t.success)return console.warn(`[bootFetch] fetch --all failed:`,t.error),!1;await H(!0);let n=E.value,r=n<e;return console.log(`[bootFetch] afterBehind=${n}, hasNewRemoteCommits=${r}`),r?(await G(!0),!0):!1}catch(e){return console.warn(`[bootFetch] silent fetch error (ignored):`,e.message),!1}finally{C.value=!1}}async function Ae(){if(!p.value)return i({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),!1;try{C.value=!0;let e=await(await fetch(`/api/fetch-all`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:获取所有远程分支信息成功`),type:`success`}),await Promise.all([H(),W()]),!0):(i({message:`${c(`@C298B:获取远程分支信息失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:获取远程分支信息失败: `)}${e.message}`,type:`error`}),!1}finally{C.value=!1}}async function je(){A.value&&(_t(),A.value.disconnect());try{let e=`http://localhost:${ie}`;if(console.log(`尝试连接Socket.IO服务器:`,e),A.value=ee(e,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:[`websocket`,`polling`]}),!A.value){console.error(`Socket.IO初始化失败: socket为null`);return}console.log(c(`@C298B:Socket.IO客户端已创建,开始注册事件监听器...`)),A.value.on(`connect`,()=>{console.log(`✅ Socket.IO连接成功,事件监听器已生效,Socket ID:`,A.value?.id)}),A.value.on(`project_info`,e=>{j.value=e.projectPath,pe.value=e.projectRoomId,console.log(`${c(`@C298B:当前项目: `)}${e.projectPath}`),console.log(`${c(`@C298B:房间ID: `)}${e.projectRoomId}`)}),A.value.on(`project_changed`,e=>{console.log(`${c(`@C298B:项目已切换: `)}${e.oldProjectPath} -> ${e.newProjectPath}`),j.value=e.newProjectPath,pe.value=e.newProjectRoomId,A.value&&A.value.emit(`join_room`,e.newProjectRoomId),console.log(`${c(`@C298B:已加入新项目房间: `)}${e.newProjectRoomId}`)}),A.value.on(`disconnect`,e=>{console.log(`与Socket.IO服务器断开连接:`,e)}),A.value.on(`git_status_update`,e=>{if(console.log(`✅ 成功监听到 git_status_update 事件:`,new Date().toLocaleTimeString()),console.log(`git_status_update data ==>`,e),console.log(`currentProjectPath.value ==>`,j.value),console.log(`data.projectPath ==>`,e.projectPath),e.projectPath&&j.value&&e.projectPath!==j.value){console.log(`${c(`@C298B:忽略不同项目的状态更新: `)}${e.projectPath}`);return}console.log(c(`@C298B:正在更新 Git 文件状态...`)),e.porcelain!==void 0&&Me(e.porcelain)}),A.value.on(`connect_error`,e=>{console.error(`Socket连接错误:`,e.message)}),A.value.on(`connect_timeout`,()=>{console.error(c(`@C298B:Socket连接超时`))}),A.value.on(`reconnect`,e=>{console.log(`${c(`@C298B:Socket重连成功,尝试次数: `)}${e}`)}),A.value.on(`reconnect_attempt`,e=>{console.log(`${c(`@C298B:Socket尝试重连,第 `)}${e}${c(`@C298B: 次尝试`)}`)}),A.value.on(`reconnect_error`,e=>{console.error(`Socket重连错误:`,e.message)}),A.value.on(`reconnect_failed`,()=>{console.error(c(`@C298B:Socket重连失败,已达到最大重试次数`))}),console.log(c(`@C298B:Socket.IO事件监听器注册完成:connect, project_info, project_changed, git_status_update, monitoring_status`)),A.value&&!A.value.connected&&(console.log(c(`@C298B:Socket未连接,尝试手动连接...`)),A.value.connect())}catch(e){console.error(`Socket.IO连接初始化失败:`,e)}}function Me(e){if(e===void 0||e===``){N.value=[];return}let t=e.split(`
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{Cn as e,Jn as t,Rn as n,Yn as r,a as i,br as a,pr as o}from"./element-plus-Bx3j6vzG.js";import{b as s}from"./vendor-BjomZKSS.js";import{n as c}from"./_plugin-vue_export-helper-CGArUtKL.js";import{t as ee}from"./socket-io-TBtw0msS.js";import{t as te}from"./configStore-Vh8LZWlL.js";var l=new Set([`5173`,`4173`,`5544`]),u=3e3;function d(){if(typeof window>`u`)return u;let e=window.location.port||`80`;if(l.has(e)){{let e=5546;if(!Number.isNaN(e))return e}return u}let t=parseInt(e,10);return Number.isNaN(t)?u:t}var f={PROCESS_INIT_FAILED:()=>c(`@PUSH:未能启动 git 进程(Windows 错误 0xC0000142:系统加载 DLL 失败)。这通常是系统的一次性瞬时故障,不是仓库的问题——请直接重试推送。`),PROCESS_DLL_NOT_FOUND:()=>c(`@PUSH:未能启动 git 进程(Windows 错误 0xC0000135:缺少依赖 DLL)。请检查 Git 安装是否完整,必要时重装 Git for Windows。`),PROCESS_NO_MEMORY:()=>c(`@PUSH:系统内存不足,git 进程未能启动(Windows 错误 0xC0000017)。请关闭一些程序后重试。`),PROCESS_CRASHED:()=>c(`@PUSH:git 进程崩溃(Windows 错误 0xC0000005:访问冲突),没有产生任何输出。请重试;若反复出现,检查安全软件是否拦截了 git。`),PROCESS_INTERRUPTED:()=>c(`@PUSH:推送已被中断(Windows 错误 0xC000013A)。`),GIT_NOT_FOUND:()=>c(`@PUSH:找不到 git 命令,请先安装 Git 并确保它在 PATH 中。`),PROCESS_EXITED:e=>c(`@PUSH:git 进程异常退出(退出码 {code}),且没有产生任何输出——通常是进程未能成功启动,请重试。`,{code:p(e.exitCode)})};function p(e){if(typeof e!=`number`||!Number.isFinite(e))return String(e);let t=e>>>0;return t>=2147483648?`0x${t.toString(16).toUpperCase()}`:String(t)}function ne(e){if(!e)return c(`@PUSH:未知错误`);let t=e.errorCode?f[e.errorCode]:void 0;return t?t(e):e.error||c(`@PUSH:未知错误`)}o(),n();var m=800,re=2e3,ie=d(),ae=`chore: init`,oe=1e3,h=new Set([`node_modules`,`bower_components`,`jspm_packages`,`dist`,`build`,`out`,`coverage`,`.next`,`.nuxt`,`.output`,`.svelte-kit`,`.parcel-cache`,`.turbo`,`.cache`,`.venv`,`venv`,`__pycache__`,`.tox`,`.mypy_cache`,`.pytest_cache`,`.gradle`,`target`,`Pods`]);function se(e){let t=String(e||``).split(`/`).filter(Boolean);for(let e=0;e<t.length-1;e++)if(h.has(t[e].toLowerCase()))return t.slice(0,e+1).join(`/`);return null}var g=[`.port`];function _(e){let t=(e?.generated??[]).map(e=>`${e.path}/`);for(let e of g)t.includes(e)||t.push(e);return t}var v=s(`git`,()=>{let n=te(),o=a(``),s=a([]),l=a(``),u=a(``),d=a(!1),f=a(!1),p=a(!1),h=a(0),g=a(``),_=a(!1),v=a([]),y=a(!1),ce=a(``),le=a(!1),ue=e(()=>v.value.length>1),b=a([]),x=a(!1),S=a(!1),C=a(!1),w=a(!1),de=a(!1),T=a(0),E=a(0),D=a(!1),O=a(``),fe=a(0),k=a(``),A=a(null),j=a(``),pe=a(``),M=a([]),me=a({staged:[],unstaged:[],untracked:[]}),N=a([]),P=a(!1),F=a(!1),I=a(!1),L=a(!1),R=a(!1),z=a(1),he=a(!0),ge=a(0),_e=0,ve=a([]),ye=a(!1),be=a(!1),B=a(!1),V=a(!1);function xe(){o.value=``,s.value=[],l.value=``,u.value=``,d.value=!1,f.value=!1,p.value=!1,h.value=0,T.value=0,E.value=0,D.value=!1,O.value=``,fe.value=0,x.value=!1,S.value=!1,C.value=!1,w.value=!1,g.value=``,_.value=!1,v.value=[],y.value=!1,ce.value=``,le.value=!1,b.value=[],M.value=[],me.value={staged:[],unstaged:[],untracked:[]},N.value=[],P.value=!1,F.value=!1,I.value=!1,L.value=!1,R.value=!1,z.value=1,he.value=!0,ge.value=0}async function H(e=!1,t=!1){if(p.value)try{console.log(c(`@C298B:获取分支状态...`));let n=`/api/branch-status`,r=[];e&&r.push(`force=true`),t&&r.push(`countOnly=true`),r.length>0&&(n+=`?`+r.join(`&`));let i=await(await fetch(n)).json();if(i){let e=T.value,t=E.value,n=D.value,r=O.value;if(T.value=i.ahead||0,E.value=i.behind||0,D.value=i.hasUpstream||!1,O.value=i.upstreamBranch||``,console.log(`${c(`@C298B:分支状态更新:领先 `)}${T.value}${c(`@C298B: 个提交,落后 `)}${E.value}${c(`@C298B: 个提交,上游分支:`)}${D.value?O.value:c(`@C298B:无`)}`),T.value!==e||E.value!==t||D.value!==n||O.value!==r){let n=Date.now();n-_e>=re?(_e=n,console.log(`[getBranchStatus] 检测到分支状态变化 (ahead: ${e}→${T.value}, behind: ${t}→${E.value}, upstream: ${r||`无`}→${O.value||`无`}), 自动刷新右侧提交历史`),G(!1)):console.log(`[getBranchStatus] 分支状态变化但在 ${re}ms 节流窗口内,跳过自动刷新`)}}}catch(e){console.error(`获取分支状态失败:`,e),T.value=0,E.value=0,D.value=!1,O.value=``}}async function Se(){let e=Date.now();if(e-h.value<1e3)return console.log(`使用缓存的Git仓库状态:`,p.value?`是`:c(`@C298B:不是`)),p.value;try{let t=await(await fetch(`/api/current_directory`)).json();return p.value=t.isGitRepo===!0,h.value=e,console.log(`${c(`@C298B:当前目录`)}${p.value?c(`@C298B:是`):c(`@C298B:不是`)}${c(`@C298B:Git仓库`)}`),p.value}catch(t){return console.error(`检查Git仓库状态失败:`,t),p.value=!1,h.value=e,!1}}async function U(e=!1){try{let t=await(await fetch(e?`/api/branch?force=true`:`/api/branch`)).json();t.branch&&(o.value=t.branch,console.log(`${c(`@C298B:当前分支更新为: `)}${t.branch}${e?c(`@C298B: (强制刷新)`):``}`))}catch(e){console.error(`获取分支信息失败:`,e)}}async function W(){if(p.value)try{console.log(c(`@C298B:获取所有分支...`));let e=await(await fetch(`/api/branches`)).json();e.branches&&Array.isArray(e.branches)&&(s.value=e.branches,fe.value=Date.now(),console.log(`${c(`@C298B:获取到`)}${e.branches.length}${c(`@C298B:个分支`)}`))}catch(e){console.error(`获取所有分支信息失败:`,e)}}async function Ce(e){console.log(`切换到分支:`,e);try{d.value=!0;let t=await(await fetch(`/api/checkout`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({branch:e})})).json();return t.success?(i({message:`${c(`@C298B:已切换到分支: `)}${t.branch||e}`,type:`success`}),await U(!0),await H(!0),!0):(i({message:`${c(`@C298B:切换分支失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:切换分支失败: `)}${e.message}`,type:`error`}),!1}finally{d.value=!1}}async function we(){try{let e=await(await fetch(`/api/user-info`)).json();l.value=e.name||``,u.value=e.email||``}catch(e){console.error(`获取用户信息失败:`,e)}}async function Te(e,t){if(!e.trim())return i({message:c(`@C298B:分支名称不能为空`),type:`warning`}),!1;try{f.value=!0;let n=await(await fetch(`/api/create-branch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({newBranchName:e,baseBranch:t||o.value})})).json();return n.success?(i({message:`${c(`@C298B:已创建并切换到分支: `)}${e}`,type:`success`}),await U(!0),await H(!0),await W(),!0):(i({message:`${c(`@C298B:创建分支失败: `)}${n.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:创建分支失败: `)}${e.message}`,type:`error`}),!1}finally{f.value=!1}}async function Ee(){try{let e=await(await fetch(`/api/clear-user-config`,{method:`POST`})).json();return e.success?(l.value=``,u.value=``,i({message:c(`@C298B:已清除Git用户配置`),type:`success`}),!0):(i({message:`${c(`@C298B:清除配置失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:清除配置失败: `)}${e.message}`,type:`error`}),!1}}async function De(e,t){try{let n=await(await fetch(`/api/restore-user-config`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e,email:t})})).json();return n.success?(l.value=e,u.value=t,i({message:c(`@C298B:已恢复Git用户配置`),type:`success`}),!0):(i({message:`${c(`@C298B:恢复配置失败: `)}${n.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:恢复配置失败: `)}${e.message}`,type:`error`}),!1}}async function Oe(){if(!p.value)return i({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),{success:!1,needsMerge:!1,error:c(`@C298B:当前目录不是Git仓库`),fullError:``,pullOutput:``};try{S.value=!0;let e=await(await fetch(`/api/pull`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:拉取成功`),type:`success`}),await Promise.all([H(!0),W(),Ne()]),{success:!0,hadChanges:!0}):{success:!1,needsMerge:e.needsMerge||!1,error:e.error||``,fullError:e.fullError||e.error||``,pullOutput:e.pullOutput||``}}catch(e){return{success:!1,needsMerge:!1,error:e.message,fullError:e.message,pullOutput:``}}finally{S.value=!1}}async function ke(){if(!p.value)return!1;if(!D.value)return console.log(`[bootFetch] no upstream, skip`),!1;try{C.value=!0;let e=E.value;console.log(`[bootFetch] start silent fetch --all, beforeBehind=${e}`);let t=await(await fetch(`/api/fetch-all`,{method:`POST`})).json();if(!t.success)return console.warn(`[bootFetch] fetch --all failed:`,t.error),!1;await H(!0);let n=E.value,r=n<e;return console.log(`[bootFetch] afterBehind=${n}, hasNewRemoteCommits=${r}`),r?(await G(!0),!0):!1}catch(e){return console.warn(`[bootFetch] silent fetch error (ignored):`,e.message),!1}finally{C.value=!1}}async function Ae(){if(!p.value)return i({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),!1;try{C.value=!0;let e=await(await fetch(`/api/fetch-all`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:获取所有远程分支信息成功`),type:`success`}),await Promise.all([H(),W()]),!0):(i({message:`${c(`@C298B:获取远程分支信息失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:获取远程分支信息失败: `)}${e.message}`,type:`error`}),!1}finally{C.value=!1}}async function je(){A.value&&(_t(),A.value.disconnect());try{let e=`http://localhost:${ie}`;if(console.log(`尝试连接Socket.IO服务器:`,e),A.value=ee(e,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:[`websocket`,`polling`]}),!A.value){console.error(`Socket.IO初始化失败: socket为null`);return}console.log(c(`@C298B:Socket.IO客户端已创建,开始注册事件监听器...`)),A.value.on(`connect`,()=>{console.log(`✅ Socket.IO连接成功,事件监听器已生效,Socket ID:`,A.value?.id)}),A.value.on(`project_info`,e=>{j.value=e.projectPath,pe.value=e.projectRoomId,console.log(`${c(`@C298B:当前项目: `)}${e.projectPath}`),console.log(`${c(`@C298B:房间ID: `)}${e.projectRoomId}`)}),A.value.on(`project_changed`,e=>{console.log(`${c(`@C298B:项目已切换: `)}${e.oldProjectPath} -> ${e.newProjectPath}`),j.value=e.newProjectPath,pe.value=e.newProjectRoomId,A.value&&A.value.emit(`join_room`,e.newProjectRoomId),console.log(`${c(`@C298B:已加入新项目房间: `)}${e.newProjectRoomId}`)}),A.value.on(`disconnect`,e=>{console.log(`与Socket.IO服务器断开连接:`,e)}),A.value.on(`git_status_update`,e=>{if(console.log(`✅ 成功监听到 git_status_update 事件:`,new Date().toLocaleTimeString()),console.log(`git_status_update data ==>`,e),console.log(`currentProjectPath.value ==>`,j.value),console.log(`data.projectPath ==>`,e.projectPath),e.projectPath&&j.value&&e.projectPath!==j.value){console.log(`${c(`@C298B:忽略不同项目的状态更新: `)}${e.projectPath}`);return}console.log(c(`@C298B:正在更新 Git 文件状态...`)),e.porcelain!==void 0&&Me(e.porcelain)}),A.value.on(`connect_error`,e=>{console.error(`Socket连接错误:`,e.message)}),A.value.on(`connect_timeout`,()=>{console.error(c(`@C298B:Socket连接超时`))}),A.value.on(`reconnect`,e=>{console.log(`${c(`@C298B:Socket重连成功,尝试次数: `)}${e}`)}),A.value.on(`reconnect_attempt`,e=>{console.log(`${c(`@C298B:Socket尝试重连,第 `)}${e}${c(`@C298B: 次尝试`)}`)}),A.value.on(`reconnect_error`,e=>{console.error(`Socket重连错误:`,e.message)}),A.value.on(`reconnect_failed`,()=>{console.error(c(`@C298B:Socket重连失败,已达到最大重试次数`))}),console.log(c(`@C298B:Socket.IO事件监听器注册完成:connect, project_info, project_changed, git_status_update, monitoring_status`)),A.value&&!A.value.connected&&(console.log(c(`@C298B:Socket未连接,尝试手动连接...`)),A.value.connect())}catch(e){console.error(`Socket.IO连接初始化失败:`,e)}}function Me(e){if(e===void 0||e===``){N.value=[];return}let t=e.split(`
2
2
  `),n=[];for(let e of t){let t=e.match(/^([ MADRCU\?]{2})\s+(.+)$/);if(t){let e=``,r=t[1],i=r.charAt(0),a=r.charAt(1);e=r===`UU`||r===`AA`||r===`DD`||r===`AU`||r===`UA`||r===`DU`||r===`UD`?`conflicted`:i===`A`||i===`M`||i===`D`||i===`R`?`added`:i===` `&&a===`M`?`modified`:i===` `&&a===`D`?`deleted`:i===` `&&a===`A`?`intent-to-add`:r===`??`?`untracked`:`other`,n.push({path:t[2],type:e})}}N.value=n}async function G(e=!0){if(!p.value){console.log(c(`@C298B:当前目录不是Git仓库,跳过加载提交历史`));return}try{P.value=!0,console.log(c(`@C298B:开始加载提交历史...`));let e=new Date().getTime(),t=await(await fetch(`/api/log?page=1&with_parents=true&_t=${e}`)).json();t&&t.data&&Array.isArray(t.data)?(M.value=[...t.data],z.value=1,he.value=t.hasMore===!0,console.log(`${c(`@C298B:提交历史加载完成,共 `)}${M.value.length}${c(`@C298B: 条记录`)}`)):(console.warn(`API返回的提交历史格式不正确:`,t),M.value=[])}catch(t){console.error(`获取提交历史失败:`,t),e&&i({message:`${c(`@C298B:获取提交历史失败: `)}${t.message}`,type:`error`})}finally{P.value=!1}}async function Ne(){console.log(c(`@C298B:刷新提交历史...`)),z.value=1,await G(!0),ge.value=M.value.length,console.log(c(`@C298B:提交历史刷新完成`))}async function K(){if(!p.value){console.log(c(`@C298B:当前目录不是Git仓库,跳过加载Git状态`));return}try{F.value=!0,await q()}catch(e){console.error(`获取Git状态失败:`,e),i({message:`${c(`@C298B:获取Git状态失败: `)}${e.message}`,type:`error`})}finally{F.value=!1}}async function q(){if(console.log(c(`@C298B:开始获取Git状态(porcelain格式)...`)),!p.value){console.log(c(`@C298B:当前目录不是Git仓库,跳过加载Git状态`));return}try{let e=await(await fetch(`/api/status_porcelain`)).json();e.status===void 0?N.value=[]:Me(e.status),de.value=!!e.isMergeInProgress,e.isMergeInProgress&&e.mergeMessage&&!k.value&&(k.value=String(e.mergeMessage))}catch(e){console.error(`获取Git状态(porcelain)失败:`,e),i({message:`${c(`@C298B:获取Git状态(porcelain)失败: `)}${e.message}`,type:`error`}),N.value=[]}}async function Pe(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{I.value=!0;let e=N.value.filter(e=>{let t=e.path.replace(/\\/g,`/`);return!n.lockedFiles.some(e=>{let n=e.replace(/\\/g,`/`);return t===n})});if(e.length===0)return i({message:c(`@C298B:没有需要暂存的文件(所有文件都被锁定)`),type:`warning`}),!1;if(e.length===N.value.length){let e=await(await fetch(`/api/add`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:文件已添加到暂存区`),type:`success`}),await q(),!0):(i({message:`${c(`@C298B:添加文件失败: `)}${e.error}`,type:`error`}),!1)}{let t=await(await fetch(`/api/add-filtered`,{method:`POST`})).json();if(t.success){let t=N.value.length-e.length,n=`${c(`@C298B:已添加 `)}${e.length}${c(`@C298B: 个文件到暂存区`)}`;return t>0&&(n+=`${c(`@C298B:,跳过 `)}${t}${c(`@C298B: 个锁定文件`)}`),i({message:n,type:`success`}),await q(),!0}return i({message:`${c(`@C298B:添加文件失败: `)}${t.error}`,type:`error`}),!1}}catch(e){return i({message:`${c(`@C298B:添加文件失败: `)}${e.message}`,type:`error`}),!1}finally{I.value=!1}}async function Fe(e={}){let{silent:t=!1}=e;if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{I.value=!0;let e=await(await fetch(`/api/add-all`,{method:`POST`})).json();return e.success?(t||i({message:c(`@C298B:所有文件已添加到暂存区`),type:`success`}),await q(),!0):(i({message:`${c(`@C298B:添加文件失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:添加文件失败: `)}${e.message}`,type:`error`}),!1}finally{I.value=!1}}async function Ie(e){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{I.value=!0;let t=await(await fetch(`/api/add-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?(i({message:c(`@C298B:文件已暂存`),type:`success`}),K(),!0):(i({message:`${c(`@C298B:暂存文件失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:暂存文件失败: `)}${e.message}`,type:`error`}),!1}finally{I.value=!1}}async function Le(e){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{R.value=!0;let t=await(await fetch(`/api/unstage-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?(i({message:c(`@C298B:已取消暂存文件`),type:`success`}),K(),!0):(i({message:`${c(`@C298B:取消暂存失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:取消暂存失败: `)}${e.message}`,type:`error`}),!1}finally{R.value=!1}}function J(e){return new Promise(t=>setTimeout(t,e))}async function Y(e,t=!1,n={}){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;let{autoRefresh:r=!0}=n;try{L.value=!0;let n=await(await fetch(`/api/commit`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({message:e,hasNewlines:e.includes(`
3
3
  `),noVerify:t})})).json();if(n.success){let e=Array.isArray(n.skippedLockedFiles)?n.skippedLockedFiles:[],t=c(`@C298B:提交成功`);if(e.length>0&&(t+=c(`@C298B:,已跳过 `)+e.length+c(`@C298B: 个锁定文件`)),i({message:t,type:`success`}),r&&(await q(),await G(!1),H(!0)),g.value&&!D.value&&o.value)try{let e=await(await fetch(`/api/git/push-with-upstream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({branch:o.value})})).json();e.success?(D.value=!0,O.value=`origin/${o.value}`,T.value=0,E.value=0,i.success(c(`@C298B:已自动推送并设置上游分支`)),await W(),H(!0)):i.warning(`${c(`@C298B:自动推送建上游失败: `)}${e.error||``}`)}catch(e){i.warning(`${c(`@C298B:自动推送建上游失败: `)}${e.message}`)}return!0}{let e=Array.isArray(n.skippedLockedFiles)?n.skippedLockedFiles:[],t=n.error||``;return e.length>0&&(t+=`(${c(`@C298B:跳过 `)}${e.length}${c(`@C298B: 个锁定文件`)})`),i({message:`${c(`@C298B:commitChanges 提交失败: `)}${t}`,type:`error`}),!1}}catch(e){return i({message:`${c(`@C298B:提交失败: `)}${e.message}`,type:`error`}),!1}finally{L.value=!1}}async function Re(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{x.value=!0;let e=await(await fetch(`/api/push`,{method:`POST`})).json();return e.success?(T.value=0,E.value=0,await Promise.all([K(),G()]),console.log(`推送成功,分支状态已设置为同步 (ahead=0, behind=0)`),!0):(e.errorCode===`EMPTY_REPO`?i({message:e.error||c(`@C298B:当前仓库没有任何提交,请先暂存并提交至少一个文件后再推送。`),type:`warning`}):i({message:`${c(`@C298B:推送失败: `)}${ne(e)}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),!1}finally{x.value=!1}}async function ze(e,t){return p.value?new Promise(n=>{try{x.value=!0,fetch(`/api/push-with-progress`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t?{remote:t}:{})}).then(t=>{let r=t.body?.getReader(),a=new TextDecoder;if(!r)throw Error(`无法读取响应流`);(async()=>{try{for(;;){let{done:t,value:o}=await r.read();if(t)break;let s=a.decode(o,{stream:!0}).split(`
4
4
  `);for(let t of s)if(t.startsWith(`data: `))try{let r=JSON.parse(t.slice(6));if(e&&e(r),r.type===`error`){x.value=!1,r.errorCode===`EMPTY_REPO`?i({message:r.error||c(`@C298B:当前仓库没有任何提交,请先暂存并提交至少一个文件后再推送。`),type:`warning`}):i({message:`${c(`@C298B:推送失败: `)}${r.error||c(`@C298B:未知错误`)}`,type:`error`}),n(!1);return}r.type===`complete`&&(x.value=!1,r.success?(T.value=0,E.value=0,Promise.all([K(),G()]),n(!0)):(i({message:`${c(`@C298B:推送失败: `)}${ne(r)}`,type:`error`}),n(!1)))}catch(e){console.error(`解析SSE数据失败:`,e)}}}catch(e){console.error(`读取流失败:`,e),x.value=!1,i({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),n(!1)}})()}).catch(e=>{x.value=!1,i({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),n(!1)})}catch(e){x.value=!1,i({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),n(!1)}}):(i.warning(c(`@C298B:当前目录不是Git仓库`)),!1)}async function Be(e,t={}){if(!p.value)return i({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),!1;if(!e)return i({message:c(`@C298B:请选择要合并的分支`),type:`warning`}),!1;if(e===o.value)return i({message:c(`@C298B:不能合并当前分支到自身`),type:`warning`}),!1;let n=`Merge branch '${e}' into ${o.value}`;try{w.value=!0;let r=await fetch(`/api/merge`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({branch:e,...t})}),a=await r.json();return r.status===409?(k.value=t.message||n,i({message:c(`@C298B:合并分支时发生冲突,请手动解决`),type:`warning`,duration:5e3}),!1):(k.value=``,a.success?(i({message:`${c(`@C298B:成功合并分支 `)}${e}${c(`@C298B: 到 `)}${o.value}`,type:`success`}),await K(),await H(),!0):(i({message:`${c(`@C298B:合并分支失败: `)}${a.error}`,type:`error`}),!1))}catch(e){return i({message:`${c(`@C298B:合并分支失败: `)}${e.message}`,type:`error`}),!1}finally{w.value=!1}}async function Ve(e,t=!1){if(console.log(c(`@C298B:开始暂存并提交操作...`)),!await Pe())return!1;console.log(c(`@C298B:暂存完成,等待Git操作完成...`)),await J(m),console.log(c(`@C298B:开始提交更改...`));let n=await Y(e,t);return console.log(c(`@C298B:暂存并提交操作完成`)),n}async function He(e,t=!1){try{if(console.log(c(`@C298B:开始暂存文件...`)),!await Pe()||(console.log(c(`@C298B:暂存完成,等待Git操作完成...`)),await J(m),console.log(c(`@C298B:开始提交更改...`)),!await Y(e,t)))return!1;console.log(c(`@C298B:提交完成,等待Git操作完成...`)),await J(m),console.log(c(`@C298B:开始推送到远程...`));let n=await Re();return console.log(c(`@C298B:一键推送操作完成,状态已统一刷新`)),n}catch(e){console.error(`一键推送操作失败:`,e);try{(await(await fetch(`/api/remove-lock`,{method:`POST`})).json()).success&&i({message:c(`@C298B:检测到Git锁定文件冲突,已自动清理,请重试操作`),type:`warning`})}catch(e){console.error(`清理锁定文件失败:`,e)}i({message:`${c(`@C298B:操作失败: `)}${e.message}`,type:`error`});try{await Promise.all([K(),G(),H()])}catch(e){console.error(`刷新状态失败:`,e)}return!1}}async function Ue(e,t=!1){if(!Q.value||$.value.size===0)return Ve(e,t);let n=At.value;return n.length===0?(i.warning(c(`@C298B:请选择要暂存的文件`)),!1):(console.log(c(`@C298B:开始暂存所选文件并提交...`,{n:n.length})),await Mt(n)?(await J(m),Y(e,t)):!1)}async function We(e,t=!1){if(!Q.value||$.value.size===0)return He(e,t);let n=At.value;return n.length===0?(i.warning(c(`@C298B:请选择要暂存的文件`)),!1):!await Mt(n)||(await J(m),!await Y(e,t))?!1:(await J(m),Re())}async function Ge(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{R.value=!0;let e=await(await fetch(`/api/reset-head`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:已重置暂存区`),type:`success`}),K(),!0):(i({message:`${c(`@C298B:重置暂存区失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:重置暂存区失败: `)}${e.message}`,type:`error`}),!1}finally{R.value=!1}}async function Ke(e){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{R.value=!0;let t=await(await fetch(`/api/reset-to-remote`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({branch:e})})).json();return t.success?(i({message:`${c(`@C298B:已重置分支 `)}${e}${c(`@C298B: 到远程状态`)}`,type:`success`}),K(),G(),await U(!0),await W(),!0):(i({message:`${c(`@C298B:重置分支失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:重置分支失败: `)}${e.message}`,type:`error`}),!1}finally{R.value=!1}}async function qe(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{R.value=!0;let e=await(await fetch(`/api/discard-all-changes`,{method:`POST`})).json();return e.success?(i.success(c(`@C298B:已清除所有本地更改`)),K(),G(),!0):(i.error(`${c(`@C298B:操作失败: `)}${e.error}`),!1)}catch(e){return i.error(`${c(`@C298B:操作失败: `)}${e.message}`),!1}finally{R.value=!1}}async function Je(e){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;if(!Array.isArray(e)||e.length===0)return i.warning(c(`@C298B:未选择任何文件`)),!1;try{R.value=!0;let t=await(await fetch(`/api/revert_files`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePaths:e})})).json();if(t.success){let n=Number(t?.count??e.length),r=Array.isArray(t?.results)?t.results.filter(e=>!e?.success).map(e=>String(e?.path||``)):[];return r.length>0?i.warning(`${c(`@C298B:已清除 `)}${n-r.length}${c(`@C298B: 个文件,失败 `)}${r.length}${c(`@C298B: 个`)}`):i.success(`${c(`@C298B:已清除 `)}${n}${c(`@C298B: 个所选文件`)}`),K(),G(),!0}return i.error(`${c(`@C298B:操作失败: `)}${t.error}`),!1}catch(e){return i.error(`${c(`@C298B:操作失败: `)}${e.message}`),!1}finally{R.value=!1}}async function Ye(){if(p.value)try{_.value=!0,console.log(c(`@C298B:获取远程仓库地址...`));let e=await(await fetch(`/api/remote-url`)).json();e.success?(g.value=e.url||``,console.log(`${c(`@C298B:获取到远程仓库地址: `)}${g.value}`)):(console.warn(`获取远程仓库地址失败:`,e.error),g.value=``)}catch(e){console.error(`获取远程仓库地址失败:`,e),g.value=``}finally{_.value=!1}}async function Xe(){try{let e=await(await fetch(`/api/git-init`,{method:`POST`})).json();return e.success?(await Se(),!0):(i.error(e.error||c(`@C298B:Git仓库初始化失败`)),!1)}catch(e){return i.error(`${c(`@C298B:Git仓库初始化失败: `)}${e.message}`),!1}}async function Ze(e,t=`origin`){try{let n=await(await fetch(`/api/add-remote`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:t,url:e})})).json();return n.success?(await Promise.all([Ye(),X()]),!0):(i.error(n.error||c(`@C298B:添加远程仓库失败`)),!1)}catch(e){return i.error(`${c(`@C298B:添加远程仓库失败: `)}${e.message}`),!1}}async function X(){if(p.value)try{y.value=!0;let e=await(await fetch(`/api/remotes`)).json();if(e.success){v.value=e.remotes||[],ce.value=e.pushDefault||``;let t=v.value.find(e=>e.isUpstream),n=v.value.find(e=>e.name===`origin`),r=t||n||v.value[0];g.value=r?.fetchUrl||``}}catch(e){console.error(`获取远程仓库列表失败:`,e)}finally{y.value=!1}}async function Qe(){await Promise.all([X(),H(!0)])}async function $e(e,t){try{let n=await(await fetch(`/api/remote/rename`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({oldName:e,newName:t})})).json();return n.success?(i.success(c(`@C298B:远程仓库已重命名`)),await Qe(),!0):(i.error(n.error||c(`@C298B:重命名远程仓库失败`)),!1)}catch(e){return i.error(`${c(`@C298B:重命名远程仓库失败: `)}${e.message}`),!1}}async function et(e){try{let t=await(await fetch(`/api/remote/remove`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e})})).json();return t.success?(i.success(c(`@C298B:远程仓库已删除`)),t.wasUpstream&&i.info(c(`@C298B:已解除当前分支的上游跟踪`)),await Qe(),!0):(i.error(t.error||c(`@C298B:删除远程仓库失败`)),!1)}catch(e){return i.error(`${c(`@C298B:删除远程仓库失败: `)}${e.message}`),!1}}async function tt(e,t){try{let n=await(await fetch(`/api/remote/set-url`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e,url:t})})).json();return n.success?(i.success(c(`@C298B:远程地址已更新`)),n.hasExplicitPushUrls&&i.info(c(`@C298B:该远程配置了独立的推送地址,不受本次修改影响`)),await Qe(),!0):(i.error(n.error||c(`@C298B:更新远程地址失败`)),!1)}catch(e){return i.error(`${c(`@C298B:更新远程地址失败: `)}${e.message}`),!1}}async function nt(e,t){try{let n=await(await fetch(`/api/remote/push-urls`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e,pushUrls:t})})).json();return n.success?(i.success(c(`@C298B:推送地址已更新`)),await X(),!0):(i.error(n.error||c(`@C298B:更新推送地址失败`)),!1)}catch(e){return i.error(`${c(`@C298B:更新推送地址失败: `)}${e.message}`),!1}}async function rt(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{x.value=!0,b.value=[];let e=await(await fetch(`/api/push-all-remotes`,{method:`POST`})).json();if(Array.isArray(e.results)&&(b.value=e.results),e.success)return T.value=0,E.value=0,i.success(c(`@C298B:全部远程推送完成`)),await Promise.all([K(),G(),X()]),!0;if(Array.isArray(e.results)&&e.results.length>0){let t=e.results.filter(e=>!e.ok);i.error(`${c(`@C298B:部分远程推送失败: `)}${t.map(e=>e.name).join(`, `)}`)}else i.warning(e.error||c(`@C298B:推送失败`));return!1}catch(e){return i.error(`${c(`@C298B:推送失败: `)}${e.message}`),!1}finally{x.value=!1}}async function it(){try{let e=await(await fetch(`/api/attach-remote-branch`,{method:`POST`})).json();return e.success?(e.attached?(i.success(c(`@C298B:已检出远程分支 {branch} 并建立跟踪`,{branch:e.branch})),await Promise.all([U(!0),W(),H(!0),G(!1),q()])):e.empty&&i.info(c(`@C298B:远程仓库为空,提交首个 commit 后可一键推送建上游`)),e):(i.warning(`${c(`@C298B:关联远程分支失败: `)}${e.error||``}`),e)}catch(e){return i.warning(`${c(`@C298B:关联远程分支失败: `)}${e.message}`),{success:!1,error:e.message}}}let at=a(null);function ot(){let e=new Map,t=new Map,n=0;for(let r of N.value){let i=String(r.path||``);if(!i)continue;n+=1;let a=se(i);if(a)e.set(a,(e.get(a)||0)+1);else{let e=i.includes(`/`)?i.slice(0,i.indexOf(`/`)):`.`;t.set(e,(t.get(e)||0)+1)}}let r=e=>[...e.entries()].map(([e,t])=>({path:e,count:t})).sort((e,t)=>t.count-e.count),i=r(e);return{total:n,generated:i,topDirs:r(t).slice(0,5),suspicious:n>=oe||i.length>0}}async function st(e){let t=[...new Set(e.map(e=>String(e).trim()).filter(Boolean))];if(!t.length)return{ok:!0,added:[]};try{let e=``,n=await(await fetch(`/api/editor/file?path=.gitignore`)).json().catch(()=>({}));n?.success&&typeof n.content==`string`&&(e=n.content);let r=e=>e.trim().replace(/\/+$/,``),i=new Set(e.split(/\r?\n/).filter(e=>e.trim()&&!e.trim().startsWith(`#`)).map(r)),a=t.filter(e=>!i.has(r(e)));if(!a.length)return{ok:!0,added:[]};let o=e.length?e.endsWith(`