zen-gitsync 2.17.42 → 2.17.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +7 -1
- package/src/ui/public/assets/AgentEngineSelector-BwFdXZnh.js +2 -0
- package/src/ui/public/assets/AgentView-CMQ7TzwN.js +11 -0
- package/src/ui/public/assets/AppVersionBadge-Bk4XGXki.js +2 -0
- package/src/ui/public/assets/BranchSelector-DL37Ho4j.js +1 -0
- package/src/ui/public/assets/CommitForm-BGpFU-fp.css +1 -0
- package/src/ui/public/assets/CommitForm-DdvYlUtA.js +14 -0
- package/src/ui/public/assets/{CommonDialog-q8bffY57.js → CommonDialog-BT6e135Y.js} +1 -1
- package/src/ui/public/assets/EditorView-CeZ-EvP1.js +37 -0
- package/src/ui/public/assets/{EditorView-QROmuz4O.css → EditorView-X6M5DS2w.css} +1 -1
- package/src/ui/public/assets/{FlowExecutionViewer-DMxdFp7T.js → FlowExecutionViewer-DIlgernH.js} +1 -1
- package/src/ui/public/assets/FlowOrchestrationWorkspace-BIFFckMG.js +21 -0
- package/src/ui/public/assets/LogList-CYU0YVnC.js +7 -0
- package/src/ui/public/assets/MindmapView-B2Oz9nCS.css +1 -0
- package/src/ui/public/assets/MindmapView-DYB3_94z.js +2 -0
- package/src/ui/public/assets/MonitorView-CTtuMls4.css +1 -0
- package/src/ui/public/assets/MonitorView-DKXSFbyq.js +3 -0
- package/src/ui/public/assets/ProjectStartupButton-BMICmCA_.js +1 -0
- package/src/ui/public/assets/RecentDirectoriesChat-LOD3UBFM.js +3 -0
- package/src/ui/public/assets/RemoteManagerDialog-S3xLgN02.js +4 -0
- package/src/ui/public/assets/{RemoteRepoCard-muY6G96M.js → RemoteRepoCard-BLb8tACY.js} +2 -2
- package/src/ui/public/assets/{SourceMapView-CLrtq2ey.js → SourceMapView-BA7E3JX7.js} +3 -3
- package/src/ui/public/assets/{SvgIcon-CVenF0Ye.js → SvgIcon-Dd0dgVcd.js} +1 -1
- package/src/ui/public/assets/UserInputNode-B0YtQfhh.js +1 -0
- package/src/ui/public/assets/WorkbenchView-lgVbWRyY.js +287 -0
- package/src/ui/public/assets/{_plugin-vue_export-helper-BUtBXJ4L.js → _plugin-vue_export-helper-DibQ4qNS.js} +3 -3
- package/src/ui/public/assets/{agentConversations-COO5r7ra.js → agentConversations-CyGrxt-h.js} +4 -4
- package/src/ui/public/assets/{configStore-B8_uxBp2.js → configStore-DQ92GVaR.js} +1 -1
- package/src/ui/public/assets/{css.worker-BDCmgL4U.js → css.worker-DFdt6_zu.js} +9 -9
- package/src/ui/public/assets/{dagre-BWDqZwmv.js → dagre-BPEW99Ym.js} +4 -4
- package/src/ui/public/assets/editor.worker-O-CH8JUO.js +26 -0
- package/src/ui/public/assets/element-plus-C8IhrglD.js +48 -0
- package/src/ui/public/assets/element-plus-DJ3ZQa98.css +1 -0
- package/src/ui/public/assets/{flow-mindmap-CY72TleH.js → flow-mindmap-BQUUIfaR.js} +1 -1
- package/src/ui/public/assets/{html.worker-DG8hnSJR.js → html.worker-JUzsMP-j.js} +8 -8
- package/src/ui/public/assets/index-DavZzOom.css +1 -0
- package/src/ui/public/assets/index-ED00NaPI.js +198 -0
- package/src/ui/public/assets/json.worker-B4dEhy0e.js +58 -0
- package/src/ui/public/assets/{monaco-CpT1sgBA.js → monaco-kXz8a-yc.js} +6 -6
- package/src/ui/public/assets/{office-docx-COuLzG9K.js → office-docx-4ZL-nECj.js} +1 -1
- package/src/ui/public/assets/{office-excel-BTtyMAdK.js → office-excel-BlPftvU4.js} +1 -1
- package/src/ui/public/assets/{office-pptx-BB2cWQB-.js → office-pptx-CVP1caLm.js} +3 -3
- package/src/ui/public/assets/{ts.worker-DgFMIcEs.js → ts.worker-CmEKzkmF.js} +49 -49
- package/src/ui/public/assets/{vendor-JPxCsYZA.js → vendor-CazUJJkv.js} +8 -8
- package/src/ui/public/assets/{vue-flow-DinCMZbP.js → vue-flow-BABZEIJA.js} +1 -1
- package/src/ui/public/index.html +14 -26
- package/src/ui/server/routes/instances.js +42 -13
- package/src/ui/server/routes/instances.test.js +55 -32
- package/src/ui/server/routes/workbench/executorModels.test.js +326 -326
- package/src/ui/public/assets/AgentEngineSelector-CLJ4rGGb.js +0 -2
- package/src/ui/public/assets/AgentView-C7tbE1pr.js +0 -11
- package/src/ui/public/assets/AppVersionBadge-CjrqnPHZ.js +0 -2
- package/src/ui/public/assets/BranchSelector-B1RkRjkT.js +0 -1
- package/src/ui/public/assets/CommitForm-Dlr6QTba.js +0 -6
- package/src/ui/public/assets/CommitForm-DoR9UNBD.css +0 -1
- package/src/ui/public/assets/EditorView-WQIQHdqS.js +0 -37
- package/src/ui/public/assets/FileDiffViewer-CFJFN_xQ.js +0 -15
- package/src/ui/public/assets/FileDiffViewer-D1aR4rba.css +0 -1
- package/src/ui/public/assets/FlowOrchestrationWorkspace-vBWYTGeM.js +0 -21
- package/src/ui/public/assets/IconButton-Ca_axHSP.css +0 -1
- package/src/ui/public/assets/IconButton-Chpl6IGZ.js +0 -1
- package/src/ui/public/assets/LogList-CinD-VGc.js +0 -7
- package/src/ui/public/assets/MindmapView-BXCi5cvH.css +0 -1
- package/src/ui/public/assets/MindmapView-CAod7lPv.js +0 -2
- package/src/ui/public/assets/MonitorView-B2YVWNrs.css +0 -1
- package/src/ui/public/assets/MonitorView-B5sOfRgx.js +0 -1
- package/src/ui/public/assets/ProjectStartupButton-ZzSQN2oO.js +0 -1
- package/src/ui/public/assets/RecentDirectoriesChat-DiiaL2lT.js +0 -3
- package/src/ui/public/assets/RemoteManagerDialog-D8pMeIHt.js +0 -4
- package/src/ui/public/assets/TemplateManager-Bnek7hoV.css +0 -1
- package/src/ui/public/assets/TemplateManager-DTQ0Oir3.js +0 -1
- package/src/ui/public/assets/UserInputNode-CGKrY_Y8.js +0 -1
- package/src/ui/public/assets/WorkbenchView-BnHSL8Lr.js +0 -287
- package/src/ui/public/assets/editor.worker-GCPm6rMv.js +0 -26
- package/src/ui/public/assets/element-plus-0wIX-Gk-.js +0 -48
- package/src/ui/public/assets/element-plus-C1xzgNSR.css +0 -1
- package/src/ui/public/assets/fileIcon-B5p5pGN9.js +0 -1
- package/src/ui/public/assets/gitStore-bZysdieB.js +0 -6
- package/src/ui/public/assets/index-BetEwMCp.js +0 -162
- package/src/ui/public/assets/index-JVjC2bGh.css +0 -1
- package/src/ui/public/assets/json.worker-CxwlJRnL.js +0 -58
- package/src/ui/public/assets/previewSandbox-BcYj-0Up.css +0 -1
- package/src/ui/public/assets/previewSandbox-CgcL-OLc.js +0 -9
- package/src/ui/public/assets/toolsStore-CofRox1m.js +0 -1
- package/src/ui/public/assets/useThemeObserver-D0lx06N9.js +0 -1
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{Bn as e,Tn as t,Xn as n,Yn as r,br as i,i as a,pr as o}from"./element-plus-0wIX-Gk-.js";import{S as s}from"./vendor-JPxCsYZA.js";import{n as c}from"./_plugin-vue_export-helper-BUtBXJ4L.js";import{t as ee}from"./socket-io-BFqQXqAp.js";import{t as te}from"./configStore-B8_uxBp2.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=5545;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(),e();var m=800,h=2e3,re=`git-log-auto-refresh`,ie=d(),ae=`chore: init`,oe=1e3,g=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(g.has(t[e].toLowerCase()))return t.slice(0,e+1).join(`/`);return null}var _=[`.port`];function v(e){let t=(e?.generated??[]).map(e=>`${e.path}/`);for(let e of _)t.includes(e)||t.push(e);return t}var y=s(`git`,()=>{let e=te(),o=i(``),s=i([]),l=i(``),u=i(``),d=i(!1),f=i(!1),p=i(!1),g=i(0),_=i(``),v=i(!1),y=i([]),b=i(!1),ce=i(``),le=i(!1),ue=t(()=>y.value.length>1),x=i([]),S=i(!1),de=i(!1),C=i(!1),w=i(!1),fe=i(!1),T=i(0),E=i(0),D=i(!1),O=i(``),pe=i(0),k=i(``),A=i(null),j=i(``),me=i(``),M=i([]),he=i({staged:[],unstaged:[],untracked:[]}),N=i([]),ge=i(!1),P=i(!1),F=i(!1),I=i(!1),L=i(!1),R=i(1),_e=i(!0),ve=i(0),z=0,ye=!1,be=i([]),xe=i(!1),Se=i(!1),B=i(!1),V=i(!1);function Ce(){o.value=``,s.value=[],l.value=``,u.value=``,d.value=!1,f.value=!1,p.value=!1,g.value=0,T.value=0,E.value=0,D.value=!1,O.value=``,pe.value=0,S.value=!1,de.value=!1,C.value=!1,w.value=!1,_.value=``,v.value=!1,y.value=[],b.value=!1,ce.value=``,le.value=!1,x.value=[],M.value=[],he.value={staged:[],unstaged:[],untracked:[]},N.value=[],ge.value=!1,P.value=!1,F.value=!1,I.value=!1,L.value=!1,R.value=1,_e.value=!0,ve.value=0}function we(){let e=N.value,t=2166136261;for(let n=0;n<e.length;n++){let r=`${e[n].type}:${e[n].path}`;for(let e=0;e<r.length;e++)t=(t^r.charCodeAt(e))>>>0,t=Math.imul(t,16777619)>>>0;t=Math.imul(t^10,16777619)>>>0}return`${e.length}:${t.toString(16)}`}async function Te(e=!1){if(p.value&&!ye){ye=!0;try{let t=we();await Promise.all([K(),H(e)]);let n=we();if(t===n)return;let r=Date.now();if(r-z<h){console.log(`[refreshStatusOnFocus] 工作区状态已变化,但在 ${h}ms 节流窗口内,跳过自动刷新提交历史`);return}z=r,console.log(`[refreshStatusOnFocus] 检测到工作区状态变化(${t} → ${n}),自动刷新右侧提交历史`),window.dispatchEvent(new CustomEvent(re,{detail:{reason:`status-changed-on-focus`}}))}catch(e){console.error(`[refreshStatusOnFocus] 刷新失败:`,e)}finally{ye=!1}}}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-z>=h?(z=n,console.log(`[getBranchStatus] 检测到分支状态变化 (ahead: ${e}→${T.value}, behind: ${t}→${E.value}, upstream: ${r||`无`}→${O.value||`无`}), 自动刷新右侧提交历史`),G(!1)):console.log(`[getBranchStatus] 分支状态变化但在 ${h}ms 节流窗口内,跳过自动刷新`)}}}catch(e){console.error(`获取分支状态失败:`,e),T.value=0,E.value=0,D.value=!1,O.value=``}}async function Ee(){let e=Date.now();if(e-g.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,g.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,g.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,pe.value=Date.now(),console.log(`${c(`@C298B:获取到`)}${e.branches.length}${c(`@C298B:个分支`)}`))}catch(e){console.error(`获取所有分支信息失败:`,e)}}async function De(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?(a({message:`${c(`@C298B:已切换到分支: `)}${t.branch||e}`,type:`success`}),await U(!0),await H(!0),!0):(a({message:`${c(`@C298B:切换分支失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:切换分支失败: `)}${e.message}`,type:`error`}),!1}finally{d.value=!1}}async function Oe(){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 ke(e,t){if(!e.trim())return a({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?(a({message:`${c(`@C298B:已创建并切换到分支: `)}${e}`,type:`success`}),await U(!0),await H(!0),await W(),!0):(a({message:`${c(`@C298B:创建分支失败: `)}${n.error}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:创建分支失败: `)}${e.message}`,type:`error`}),!1}finally{f.value=!1}}async function Ae(){try{let e=await(await fetch(`/api/clear-user-config`,{method:`POST`})).json();return e.success?(l.value=``,u.value=``,a({message:c(`@C298B:已清除Git用户配置`),type:`success`}),!0):(a({message:`${c(`@C298B:清除配置失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:清除配置失败: `)}${e.message}`,type:`error`}),!1}}async function je(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,a({message:c(`@C298B:已恢复Git用户配置`),type:`success`}),!0):(a({message:`${c(`@C298B:恢复配置失败: `)}${n.error}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:恢复配置失败: `)}${e.message}`,type:`error`}),!1}}async function Me(){if(!p.value)return a({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),{success:!1,needsMerge:!1,error:c(`@C298B:当前目录不是Git仓库`),fullError:``,pullOutput:``};try{de.value=!0;let e=await(await fetch(`/api/pull`,{method:`POST`})).json();return e.success?(a({message:c(`@C298B:拉取成功`),type:`success`}),await Promise.all([H(!0),W(),Le()]),{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{de.value=!1}}async function Ne(){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 Pe(){if(!p.value)return a({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?(a({message:c(`@C298B:获取所有远程分支信息成功`),type:`success`}),await Promise.all([H(),W()]),!0):(a({message:`${c(`@C298B:获取远程分支信息失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:获取远程分支信息失败: `)}${e.message}`,type:`error`}),!1}finally{C.value=!1}}async function Fe(){A.value&&(xt(),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,me.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,me.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&&Ie(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 Ie(e){if(e===void 0||e===``){N.value=[];return}let t=e.split(`
|
|
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{ge.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],R.value=1,_e.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&&a({message:`${c(`@C298B:获取提交历史失败: `)}${t.message}`,type:`error`})}finally{ge.value=!1}}async function Le(){console.log(c(`@C298B:刷新提交历史...`)),R.value=1,await G(!0),ve.value=M.value.length,console.log(c(`@C298B:提交历史刷新完成`))}async function K(){if(!p.value){console.log(c(`@C298B:当前目录不是Git仓库,跳过加载Git状态`));return}try{P.value=!0,await q()}catch(e){console.error(`获取Git状态失败:`,e),a({message:`${c(`@C298B:获取Git状态失败: `)}${e.message}`,type:`error`})}finally{P.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=[]:Ie(e.status),fe.value=!!e.isMergeInProgress,e.isMergeInProgress&&e.mergeMessage&&!k.value&&(k.value=String(e.mergeMessage))}catch(e){console.error(`获取Git状态(porcelain)失败:`,e),a({message:`${c(`@C298B:获取Git状态(porcelain)失败: `)}${e.message}`,type:`error`}),N.value=[]}}async function Re(){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{F.value=!0;let t=N.value.filter(t=>{let n=t.path.replace(/\\/g,`/`);return!e.lockedFiles.some(e=>{let t=e.replace(/\\/g,`/`);return n===t})});if(t.length===0)return a({message:c(`@C298B:没有需要暂存的文件(所有文件都被锁定)`),type:`warning`}),!1;if(t.length===N.value.length){let e=await(await fetch(`/api/add`,{method:`POST`})).json();return e.success?(a({message:c(`@C298B:文件已添加到暂存区`),type:`success`}),await q(),!0):(a({message:`${c(`@C298B:添加文件失败: `)}${e.error}`,type:`error`}),!1)}{let e=await(await fetch(`/api/add-filtered`,{method:`POST`})).json();if(e.success){let e=N.value.length-t.length,n=`${c(`@C298B:已添加 `)}${t.length}${c(`@C298B: 个文件到暂存区`)}`;return e>0&&(n+=`${c(`@C298B:,跳过 `)}${e}${c(`@C298B: 个锁定文件`)}`),a({message:n,type:`success`}),await q(),!0}return a({message:`${c(`@C298B:添加文件失败: `)}${e.error}`,type:`error`}),!1}}catch(e){return a({message:`${c(`@C298B:添加文件失败: `)}${e.message}`,type:`error`}),!1}finally{F.value=!1}}async function ze(e={}){let{silent:t=!1}=e;if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{F.value=!0;let e=await(await fetch(`/api/add-all`,{method:`POST`})).json();return e.success?(t||a({message:c(`@C298B:所有文件已添加到暂存区`),type:`success`}),await q(),!0):(a({message:`${c(`@C298B:添加文件失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:添加文件失败: `)}${e.message}`,type:`error`}),!1}finally{F.value=!1}}async function Be(e){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{F.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?(a({message:c(`@C298B:文件已暂存`),type:`success`}),K(),!0):(a({message:`${c(`@C298B:暂存文件失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:暂存文件失败: `)}${e.message}`,type:`error`}),!1}finally{F.value=!1}}async function Ve(e){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{L.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?(a({message:c(`@C298B:已取消暂存文件`),type:`success`}),K(),!0):(a({message:`${c(`@C298B:取消暂存失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:取消暂存失败: `)}${e.message}`,type:`error`}),!1}finally{L.value=!1}}function J(e){return new Promise(t=>setTimeout(t,e))}async function Y(e,t=!1,n={}){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;let{autoRefresh:r=!0}=n;try{I.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
|
-
`),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: 个锁定文件`)),a({message:t,type:`success`}),r&&(await q(),await G(!1),H(!0)),_.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,a.success(c(`@C298B:已自动推送并设置上游分支`)),await W(),H(!0)):a.warning(`${c(`@C298B:自动推送建上游失败: `)}${e.error||``}`)}catch(e){a.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: 个锁定文件`)})`),a({message:`${c(`@C298B:commitChanges 提交失败: `)}${t}`,type:`error`}),!1}}catch(e){return a({message:`${c(`@C298B:提交失败: `)}${e.message}`,type:`error`}),!1}finally{I.value=!1}}async function He(){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{S.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`?a({message:e.error||c(`@C298B:当前仓库没有任何提交,请先暂存并提交至少一个文件后再推送。`),type:`warning`}):a({message:`${c(`@C298B:推送失败: `)}${ne(e)}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),!1}finally{S.value=!1}}async function Ue(e,t){return p.value?new Promise(n=>{try{S.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(),i=new TextDecoder;if(!r)throw Error(`无法读取响应流`);(async()=>{try{for(;;){let{done:t,value:o}=await r.read();if(t)break;let s=i.decode(o,{stream:!0}).split(`
|
|
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`){S.value=!1,r.errorCode===`EMPTY_REPO`?a({message:r.error||c(`@C298B:当前仓库没有任何提交,请先暂存并提交至少一个文件后再推送。`),type:`warning`}):a({message:`${c(`@C298B:推送失败: `)}${r.error||c(`@C298B:未知错误`)}`,type:`error`}),n(!1);return}r.type===`complete`&&(S.value=!1,r.success?(T.value=0,E.value=0,Promise.all([K(),G()]),n(!0)):(a({message:`${c(`@C298B:推送失败: `)}${ne(r)}`,type:`error`}),n(!1)))}catch(e){console.error(`解析SSE数据失败:`,e)}}}catch(e){console.error(`读取流失败:`,e),S.value=!1,a({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),n(!1)}})()}).catch(e=>{S.value=!1,a({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),n(!1)})}catch(e){S.value=!1,a({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),n(!1)}}):(a.warning(c(`@C298B:当前目录不是Git仓库`)),!1)}async function We(e,t={}){if(!p.value)return a({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),!1;if(!e)return a({message:c(`@C298B:请选择要合并的分支`),type:`warning`}),!1;if(e===o.value)return a({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})}),i=await r.json();return r.status===409?(k.value=t.message||n,a({message:c(`@C298B:合并分支时发生冲突,请手动解决`),type:`warning`,duration:5e3}),!1):(k.value=``,i.success?(a({message:`${c(`@C298B:成功合并分支 `)}${e}${c(`@C298B: 到 `)}${o.value}`,type:`success`}),await K(),await H(),!0):(a({message:`${c(`@C298B:合并分支失败: `)}${i.error}`,type:`error`}),!1))}catch(e){return a({message:`${c(`@C298B:合并分支失败: `)}${e.message}`,type:`error`}),!1}finally{w.value=!1}}async function Ge(e,t=!1){if(console.log(c(`@C298B:开始暂存并提交操作...`)),!await Re())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 Ke(e,t=!1){try{if(console.log(c(`@C298B:开始暂存文件...`)),!await Re()||(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 He();return console.log(c(`@C298B:一键推送操作完成,状态已统一刷新`)),n}catch(e){console.error(`一键推送操作失败:`,e);try{(await(await fetch(`/api/remove-lock`,{method:`POST`})).json()).success&&a({message:c(`@C298B:检测到Git锁定文件冲突,已自动清理,请重试操作`),type:`warning`})}catch(e){console.error(`清理锁定文件失败:`,e)}a({message:`${c(`@C298B:操作失败: `)}${e.message}`,type:`error`});try{await Promise.all([K(),G(),H()])}catch(e){console.error(`刷新状态失败:`,e)}return!1}}async function qe(e,t=!1){if(!Q.value||$.value.size===0)return Ge(e,t);let n=Pt.value;return n.length===0?(a.warning(c(`@C298B:请选择要暂存的文件`)),!1):(console.log(c(`@C298B:开始暂存所选文件并提交...`,{n:n.length})),await It(n)?(await J(m),Y(e,t)):!1)}async function Je(e,t=!1){if(!Q.value||$.value.size===0)return Ke(e,t);let n=Pt.value;return n.length===0?(a.warning(c(`@C298B:请选择要暂存的文件`)),!1):!await It(n)||(await J(m),!await Y(e,t))?!1:(await J(m),He())}async function Ye(){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{L.value=!0;let e=await(await fetch(`/api/reset-head`,{method:`POST`})).json();return e.success?(a({message:c(`@C298B:已重置暂存区`),type:`success`}),K(),!0):(a({message:`${c(`@C298B:重置暂存区失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:重置暂存区失败: `)}${e.message}`,type:`error`}),!1}finally{L.value=!1}}async function Xe(e){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{L.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?(a({message:`${c(`@C298B:已重置分支 `)}${e}${c(`@C298B: 到远程状态`)}`,type:`success`}),K(),G(),await U(!0),await W(),!0):(a({message:`${c(`@C298B:重置分支失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:重置分支失败: `)}${e.message}`,type:`error`}),!1}finally{L.value=!1}}async function Ze(){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{L.value=!0;let e=await(await fetch(`/api/discard-all-changes`,{method:`POST`})).json();return e.success?(a.success(c(`@C298B:已清除所有本地更改`)),K(),G(),!0):(a.error(`${c(`@C298B:操作失败: `)}${e.error}`),!1)}catch(e){return a.error(`${c(`@C298B:操作失败: `)}${e.message}`),!1}finally{L.value=!1}}async function Qe(e){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;if(!Array.isArray(e)||e.length===0)return a.warning(c(`@C298B:未选择任何文件`)),!1;try{L.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?a.warning(`${c(`@C298B:已清除 `)}${n-r.length}${c(`@C298B: 个文件,失败 `)}${r.length}${c(`@C298B: 个`)}`):a.success(`${c(`@C298B:已清除 `)}${n}${c(`@C298B: 个所选文件`)}`),K(),G(),!0}return a.error(`${c(`@C298B:操作失败: `)}${t.error}`),!1}catch(e){return a.error(`${c(`@C298B:操作失败: `)}${e.message}`),!1}finally{L.value=!1}}async function $e(){if(p.value)try{v.value=!0,console.log(c(`@C298B:获取远程仓库地址...`));let e=await(await fetch(`/api/remote-url`)).json();e.success?(_.value=e.url||``,console.log(`${c(`@C298B:获取到远程仓库地址: `)}${_.value}`)):(console.warn(`获取远程仓库地址失败:`,e.error),_.value=``)}catch(e){console.error(`获取远程仓库地址失败:`,e),_.value=``}finally{v.value=!1}}async function et(){try{let e=await(await fetch(`/api/git-init`,{method:`POST`})).json();return e.success?(await Ee(),!0):(a.error(e.error||c(`@C298B:Git仓库初始化失败`)),!1)}catch(e){return a.error(`${c(`@C298B:Git仓库初始化失败: `)}${e.message}`),!1}}async function tt(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([$e(),X()]),!0):(a.error(n.error||c(`@C298B:添加远程仓库失败`)),!1)}catch(e){return a.error(`${c(`@C298B:添加远程仓库失败: `)}${e.message}`),!1}}async function X(){if(p.value)try{b.value=!0;let e=await(await fetch(`/api/remotes`)).json();if(e.success){y.value=e.remotes||[],ce.value=e.pushDefault||``;let t=y.value.find(e=>e.isUpstream),n=y.value.find(e=>e.name===`origin`),r=t||n||y.value[0];_.value=r?.fetchUrl||``}}catch(e){console.error(`获取远程仓库列表失败:`,e)}finally{b.value=!1}}async function nt(){await Promise.all([X(),H(!0)])}async function rt(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?(a.success(c(`@C298B:远程仓库已重命名`)),await nt(),!0):(a.error(n.error||c(`@C298B:重命名远程仓库失败`)),!1)}catch(e){return a.error(`${c(`@C298B:重命名远程仓库失败: `)}${e.message}`),!1}}async function it(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?(a.success(c(`@C298B:远程仓库已删除`)),t.wasUpstream&&a.info(c(`@C298B:已解除当前分支的上游跟踪`)),await nt(),!0):(a.error(t.error||c(`@C298B:删除远程仓库失败`)),!1)}catch(e){return a.error(`${c(`@C298B:删除远程仓库失败: `)}${e.message}`),!1}}async function at(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?(a.success(c(`@C298B:远程地址已更新`)),n.hasExplicitPushUrls&&a.info(c(`@C298B:该远程配置了独立的推送地址,不受本次修改影响`)),await nt(),!0):(a.error(n.error||c(`@C298B:更新远程地址失败`)),!1)}catch(e){return a.error(`${c(`@C298B:更新远程地址失败: `)}${e.message}`),!1}}async function ot(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?(a.success(c(`@C298B:推送地址已更新`)),await X(),!0):(a.error(n.error||c(`@C298B:更新推送地址失败`)),!1)}catch(e){return a.error(`${c(`@C298B:更新推送地址失败: `)}${e.message}`),!1}}async function st(){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{S.value=!0,x.value=[];let e=await(await fetch(`/api/push-all-remotes`,{method:`POST`})).json();if(Array.isArray(e.results)&&(x.value=e.results),e.success)return T.value=0,E.value=0,a.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);a.error(`${c(`@C298B:部分远程推送失败: `)}${t.map(e=>e.name).join(`, `)}`)}else a.warning(e.error||c(`@C298B:推送失败`));return!1}catch(e){return a.error(`${c(`@C298B:推送失败: `)}${e.message}`),!1}finally{S.value=!1}}async function ct(){try{let e=await(await fetch(`/api/attach-remote-branch`,{method:`POST`})).json();return e.success?(e.attached?(a.success(c(`@C298B:已检出远程分支 {branch} 并建立跟踪`,{branch:e.branch})),await Promise.all([U(!0),W(),H(!0),G(!1),q()])):e.empty&&a.info(c(`@C298B:远程仓库为空,提交首个 commit 后可一键推送建上游`)),e):(a.warning(`${c(`@C298B:关联远程分支失败: `)}${e.error||``}`),e)}catch(e){return a.warning(`${c(`@C298B:关联远程分支失败: `)}${e.message}`),{success:!1,error:e.message}}}let lt=i(null);function ut(){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 dt(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(`
|
|
5
|
-
`)?e:`${e}\n`:``,s=await(await fetch(`/api/editor/file`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:`.gitignore`,content:`${o}${a.join(`
|
|
6
|
-
`)}\n`})})).json().catch(()=>({}));return s?.success?{ok:!0,added:a}:{ok:!1,added:[],error:s?.error||c(`@C298B:写入 .gitignore 失败`)}}catch(e){return{ok:!1,added:[],error:e.message}}}async function ft(e=ae,t={}){let{force:n=!1}=t;if(M.value.length>0)return`skipped-has-commits`;let r=ut();return lt.value=r,r.suspicious&&!n?`confirm-required`:await ze({silent:!0})?N.value.some(e=>e.type===`added`)?await Y(e.trim()||`chore: init`)?`committed`:`failed`:`skipped-no-files`:`failed`}async function pt(){try{let e=await(await fetch(`/api/diff-head`)).json();return e.success?e.diff?(await navigator.clipboard.writeText(e.diff),a({message:c(`@C298B:已复制全量 Diff`),type:`success`}),!0):(a({message:c(`@C298B:没有可复制的 Diff`),type:`warning`}),!1):(a({message:`${c(`@C298B:复制失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return a({message:`${c(`@C298B:复制失败: `)}${e.message}`,type:`error`}),!1}}let mt=[`github.com`,`gitlab.com`,`bitbucket.org`,`gitee.com`,`coding.net`,`codeup.aliyun.com`],ht=t(()=>{let e=_.value.trim();if(!e)return null;if(/^https?:\/\//i.test(e))return e.replace(/\.git$/i,``);let t=e.match(/^[\w.-]+@([^:]+):(.+?)(?:\.git)?$/i);if(t){let e=t[1],n=t[2];return mt.includes(e.toLowerCase())?`https://${e}/${n}`:null}let n=e.match(/^ssh:\/\/(?:[\w.-]+@)?([^/:]+)(?::\d+)?\/(.+?)(?:\.git)?$/i);if(n){let e=n[1],t=n[2];return mt.includes(e.toLowerCase())?`https://${e}/${t}`:null}return null}),gt=t(()=>ht.value!==null);function _t(){let e=ht.value;return e?(window.open(e,`_blank`,`noopener,noreferrer`),!0):(a({message:c(`@C298B:该远程仓库地址无法识别为可访问的网页地址`),type:`warning`}),!1)}async function vt(){if(!_.value)return a({message:c(`@C298B:没有可复制的远程仓库地址`),type:`warning`}),!1;try{return await navigator.clipboard.writeText(_.value),a({message:c(`@C298B:已复制远程仓库地址`),type:`success`}),!0}catch(e){return console.error(`复制远程仓库地址失败:`,e),a({message:`${c(`@C298B:复制失败: `)}${e.message}`,type:`error`}),!1}}async function yt(){if(!_.value)return a({message:c(`@C298B:没有可复制的远程仓库地址`),type:`warning`}),!1;try{let e=`git clone ${_.value}`;return await navigator.clipboard.writeText(e),a({message:c(`@F13B4:已复制克隆命令`),type:`success`}),!0}catch(e){return console.error(`复制克隆命令失败:`,e),a({message:`${c(`@C298B:复制失败: `)}${e.message}`,type:`error`}),!1}}r(()=>{Fe()});function bt(){A.value&&=(xt(),A.value.disconnect(),null)}function xt(){if(A.value)for(let e of[`connect`,`project_info`,`project_changed`,`disconnect`,`git_status_update`,`connect_error`,`connect_timeout`,`reconnect`,`reconnect_attempt`,`reconnect_error`,`reconnect_failed`])try{A.value.off(e)}catch{}}n(()=>{bt()});async function Z(){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),[];try{xe.value=!0;let e=await(await fetch(`/api/stash-list`)).json();return e.success?(be.value=e.stashes,e.stashes):(a.error(`${c(`@C298B:获取stash列表失败: `)}${e.error}`),[])}catch(e){return console.error(`获取stash列表失败:`,e),a.error(`${c(`@C298B:获取stash列表失败: `)}${e.message}`),[]}finally{xe.value=!1}}async function St(e,t=!1,n=!0){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{V.value=!0;let r=await(await fetch(`/api/stash-save`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({message:e,includeUntracked:t,excludeLocked:n})})).json();return r.success?(a.success(r.message),await Z(),await K(),!0):(a.warning(r.message),!1)}catch(e){return console.error(`保存stash失败:`,e),a.error(`${c(`@C298B:保存stash失败: `)}${e.message}`),!1}finally{V.value=!1}}async function Ct(e,t,n=!1){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;if(!e||e.length===0)return a.warning(c(`@C298B:请选择要储藏的文件`)),!1;try{V.value=!0;let r=await(await fetch(`/api/stash-save-partial`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({files:e,message:t,includeUntracked:n})})).json();return r.success?(a.success(r.message),await Z(),await K(),!0):(a.warning(r.message),!1)}catch(e){return console.error(`保存部分stash失败:`,e),a.error(`${c(`@C298B:保存stash失败: `)}${e.message}`),!1}finally{V.value=!1}}async function wt(e,t=!1){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{Se.value=!0;let n=await fetch(`/api/stash-apply`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({stashId:e,pop:t})}),r=await n.json();return n.status===409?(a.warning(c(`@C298B:应用stash时发生冲突,请手动解决`)),!1):r.success?(a.success(r.message),await Z(),await K(),!0):(a.error(`${c(`@C298B:应用stash失败: `)}${r.error}`),!1)}catch(e){return console.error(`应用stash失败:`,e),a.error(`${c(`@C298B:应用stash失败: `)}${e.message}`),!1}finally{Se.value=!1}}async function Tt(e){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{B.value=!0;let t=await(await fetch(`/api/stash-drop`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({stashId:e})})).json();return t.success?(a.success(t.message),await Z(),!0):(a.error(`${c(`@C298B:删除stash失败: `)}${t.error}`),!1)}catch(e){return console.error(`删除stash失败:`,e),a.error(`${c(`@C298B:删除stash失败: `)}${e.message}`),!1}finally{B.value=!1}}async function Et(){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{B.value=!0;let e=await(await fetch(`/api/stash-clear`,{method:`POST`})).json();return e.success?(a.success(e.message),be.value=[],!0):(a.error(`${c(`@C298B:清空stash失败: `)}${e.error}`),!1)}catch(e){return console.error(`清空stash失败:`,e),a.error(`${c(`@C298B:清空stash失败: `)}${e.message}`),!1}finally{B.value=!1}}let Dt=t(()=>N.value.some(e=>e.type===`conflicted`)),Q=i(!1),$=i(new Set);function Ot(){Q.value=!Q.value,Q.value||($.value=new Set)}function kt(){Q.value=!0}function At(){Q.value=!1,$.value=new Set}function jt(e){let t=new Set($.value);t.has(e)?t.delete(e):t.add(e),$.value=t}function Mt(){$.value=new Set(N.value.map(e=>e.path))}function Nt(){$.value=new Set}let Pt=t(()=>{if(!Q.value)return[];let t=new Set(e.lockedFiles.map(e=>e.replace(/\\/g,`/`))),n=[];for(let e of $.value){let r=e.replace(/\\/g,`/`);if(t.has(r))continue;let i=N.value.find(t=>t.path===e);i&&[`modified`,`deleted`,`untracked`,`intent-to-add`].includes(i.type)&&n.push(e)}return n}),Ft=t(()=>Pt.value.length>0);async function It(e){if(!p.value)return a.warning(c(`@C298B:当前目录不是Git仓库`)),!1;let t=[...new Set(e.filter(e=>typeof e==`string`&&e.length>0))];if(t.length===0)return a.warning(c(`@C298B:请选择要暂存的文件`)),!1;try{F.value=!0;let e=await(await fetch(`/api/add-files`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePaths:t})})).json();if(e.success){let n=e.successCount??t.length;a.success(n>0?`${c(`@C298B:已暂存 `)}${n}${c(`@C298B: 个所选文件`)}`:c(`@C298B:文件已添加到暂存区`));let r=new Set($.value);for(let e of t)r.delete(e);return $.value=r,await q(),!0}return a.error(`${c(`@C298B:暂存失败: `)}${e.error||``}`),!1}catch(e){return a.error(`${c(`@C298B:暂存失败: `)}${e.message}`),!1}finally{F.value=!1}}return{currentBranch:o,allBranches:s,userName:l,userEmail:u,isChangingBranch:d,isCreatingBranch:f,isGitRepo:p,lastCheckedTime:g,branchAhead:T,branchBehind:E,hasUpstream:D,upstreamBranch:O,lastBranchesTime:pe,remoteUrl:_,isLoadingRemoteUrl:v,remotes:y,isLoadingRemotes:b,pushDefaultRemote:ce,isRemoteManagerVisible:le,hasMultipleRemotes:ue,lastPushAllResults:x,remoteWebUrl:ht,isRemoteBrowsable:gt,openRemoteWebUrl:_t,hasConflictedFiles:Dt,stashes:be,isLoadingStashes:xe,isApplyingStash:Se,isDroppingStash:B,isSavingStash:V,log:M,status:he,fileList:N,isLoadingLog:ge,isLoadingStatus:P,isAddingFiles:F,isCommiting:I,isResetting:L,currentPage:R,hasMoreData:_e,totalCommits:ve,isPushing:S,isGitPulling:de,isGitFetching:C,isGitMerging:w,isMergeInProgress:fe,pendingMergeMessage:k,isSelectionMode:Q,selectedFiles:$,selectedUnstagedPaths:Pt,hasSelectableFiles:Ft,toggleSelectionMode:Ot,enterSelectionMode:kt,exitSelectionMode:At,toggleFileSelection:jt,selectAllFiles:Mt,clearSelection:Nt,$reset:Ce,checkGitRepo:Ee,getCurrentBranch:U,getAllBranches:W,changeBranch:De,getUserInfo:Oe,createBranch:ke,clearUserConfig:Ae,restoreUserConfig:je,getBranchStatus:H,refreshStatusOnFocus:Te,gitPull:Me,gitFetchAll:Pe,bootFetch:Ne,initSocketConnection:Fe,parseStatusPorcelain:Ie,fetchLog:G,refreshLog:Le,fetchStatus:K,fetchStatusPorcelain:q,addToStage:Re,addAllToStage:ze,addFileToStage:Be,stageFiles:It,unstageFile:Ve,commitChanges:Y,pushToRemote:He,pushToRemoteWithProgress:Ue,addAndCommit:Ge,addCommitAndPush:Ke,stageSelectedAndCommit:qe,stageSelectedAndCommitAndPush:Je,resetHead:Ye,resetToRemote:Xe,discardAllChanges:Ze,discardSelectedFiles:Qe,getRemoteUrl:$e,addRemote:tt,fetchRemotes:X,renameRemote:rt,removeRemote:it,setRemoteUrl:at,setRemotePushUrls:ot,pushAllRemotes:st,attachRemoteBranch:ct,gitInit:et,createInitialCommit:ft,initialCommitScope:lt,inspectInitialCommitScope:ut,ensureGitignore:dt,copyRemoteUrl:vt,copyCloneCommand:yt,copyCurrentDiff:pt,mergeBranch:We,getStashList:Z,saveStash:St,savePartialStash:Ct,applyStash:wt,dropStash:Tt,clearAllStashes:Et,socket:A,disconnectSocket:bt}});export{d as a,ne as i,v as n,y as r,ae as t};
|