zen-gitsync 2.4.5 → 2.4.7

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.
@@ -1,45 +0,0 @@
1
- import{d as ms,r as c,c as Q,E as n,o as ot,a as js,l as ho,b as $e,e as gs,f as vs,g as C,h as r,i as q,j as K,k as _e,w as s,m as t,n as Ge,p as Ue,q as us,u as a,s as Et,t as Os,F as Se,v as je,x as P,y as yo,z as Re,A as _t,B as _o,C as bo,D as e,G as Xe,H as wo,I as ko,J as rt,K as ge,L as ds,M as fs,N as Gs,O as $o,P as ct,Q as F,R as Co,S as Ke,T as ht,U as xt,V as Dt,W as zt,X as Gt,Y as As,Z as He,_ as Oe,$ as hs,a0 as vt,a1 as ps,a2 as mt,a3 as So,a4 as Nt,a5 as ut,a6 as bt,a7 as Ms,a8 as ys,a9 as Es,aa as Vt,ab as yt,ac as Is,ad as _s,ae as bs,af as To,ag as dt,ah as gt,ai as Fo,aj as Lo,ak as Ns,al as It,am as ws,an as Vo,ao as Pt,ap as Bt,aq as Mt,ar as Po,as as Bo,at as xs,au as xo,av as Do,aw as zo,ax as Ro,ay as Lt,az as Tt,aA as Uo,aB as jo,aC as Oo,aD as Go,aE as At,aF as Ao,aG as Mo,aH as Eo,aI as Io,aJ as No,aK as Ho,aL as Jo,aM as Wo,aN as qo,aO as Hs,aP as Yo,aQ as Ko,aR as Ds,aS as zs,aT as Qo,aU as Xo,aV as Zo}from"./vendor-CcAnbfaP.js";(function(){const v=document.createElement("link").relList;if(v&&v.supports&&v.supports("modulepreload"))return;for(const h of document.querySelectorAll('link[rel="modulepreload"]'))i(h);new MutationObserver(h=>{for(const u of h)if(u.type==="childList")for(const z of u.addedNodes)z.tagName==="LINK"&&z.rel==="modulepreload"&&i(z)}).observe(document,{childList:!0,subtree:!0});function o(h){const u={};return h.integrity&&(u.integrity=h.integrity),h.referrerPolicy&&(u.referrerPolicy=h.referrerPolicy),h.crossOrigin==="use-credentials"?u.credentials="include":h.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function i(h){if(h.ep)return;h.ep=!0;const u=o(h);fetch(h.href,u)}})();const Ze=ms("config",()=>{const E=c(""),v=c([]),o=c([]),i=c([]),h=c([]),u=c(!1),z=c(!1),m=c("");function k(D){m.value=D||""}const w=Q(()=>({defaultCommitMessage:E.value,descriptionTemplates:v.value,scopeTemplates:o.value,messageTemplates:i.value,lockedFiles:h.value,currentDirectory:m.value}));async function H(D=!1){if(!D&&z.value&&!u.value)return console.log("使用缓存的配置信息"),w.value;u.value=!0;try{u.value=!0,console.log("加载配置信息...");const J=await(await fetch("/api/config/getConfig")).json();return E.value=J.defaultCommitMessage||"",v.value=J.descriptionTemplates||[],o.value=J.scopeTemplates||[],i.value=J.messageTemplates||[],h.value=J.lockedFiles||[],J.currentDirectory&&(m.value=J.currentDirectory),z.value=!0,console.log("配置信息加载完成"),w.value}catch(U){return console.error("加载配置失败:",U),n.error(`加载配置失败: ${U.message}`),null}finally{u.value=!1}}async function T(D){try{const J=await(await fetch("/api/config/saveDefaultMessage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({defaultCommitMessage:D})})).json();return J.success?(E.value=D,n.success("默认提交信息已保存"),!0):(n.error(`保存失败: ${J.error}`),!1)}catch(U){return n.error(`保存失败: ${U.message}`),!1}}async function f(D,U){try{const I=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:D,type:U})})).json();return I.success?(U==="description"?v.value.includes(D)||v.value.push(D):U==="scope"?o.value.includes(D)||o.value.push(D):U==="message"&&(i.value.includes(D)||i.value.push(D)),n.success("模板已保存"),!0):(n.error(`保存模板失败: ${I.error}`),!1)}catch(J){return n.error(`保存模板失败: ${J.message}`),!1}}async function G(D,U){try{const I=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:D,type:U})})).json();return I.success?(U==="description"?v.value=v.value.filter(ae=>ae!==D):U==="scope"?o.value=o.value.filter(ae=>ae!==D):U==="message"&&(i.value=i.value.filter(ae=>ae!==D)),n.success("模板已删除"),!0):(n.error(`删除模板失败: ${I.error}`),!1)}catch(J){return n.error(`删除模板失败: ${J.message}`),!1}}async function O(D,U,J){try{const ae=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:D,newTemplate:U,type:J})})).json();if(ae.success){if(J==="description"){const ee=v.value.indexOf(D);ee!==-1&&(v.value[ee]=U)}else if(J==="scope"){const ee=o.value.indexOf(D);ee!==-1&&(o.value[ee]=U)}else if(J==="message"){const ee=i.value.indexOf(D);ee!==-1&&(i.value[ee]=U)}return n.success("模板已更新"),!0}else return n.error(`更新模板失败: ${ae.error}`),!1}catch(I){return n.error(`更新模板失败: ${I.message}`),!1}}async function te(){try{const U=await(await fetch("/api/locked-files")).json();return U.success?(h.value=U.lockedFiles||[],U.lockedFiles):(n.error(`加载锁定文件列表失败: ${U.error}`),[])}catch(D){return console.error("加载锁定文件列表失败:",D),n.error(`加载锁定文件列表失败: ${D.message}`),[]}}async function B(D){try{const J=await(await fetch("/api/lock-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:D})})).json();return J.success?(await te(),n.success(`文件已锁定: ${D}`),!0):(n.error(`锁定文件失败: ${J.error}`),!1)}catch(U){return console.error("锁定文件失败:",U),n.error(`锁定文件失败: ${U.message}`),!1}}async function L(D){try{const J=await(await fetch("/api/unlock-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:D})})).json();return J.success?(await te(),n.success(`文件已解锁: ${D}`),!0):(n.error(`解锁文件失败: ${J.error}`),!1)}catch(U){return console.error("解锁文件失败:",U),n.error(`解锁文件失败: ${U.message}`),!1}}async function Z(D){try{const J=await(await fetch("/api/check-file-lock",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:D})})).json();return J.success?J.isLocked:(console.error("检查文件锁定状态失败:",J.error),!1)}catch(U){return console.error("检查文件锁定状态失败:",U),!1}}return{defaultCommitMessage:E,descriptionTemplates:v,scopeTemplates:o,messageTemplates:i,lockedFiles:h,isLoading:u,isLoaded:z,currentDirectory:m,config:w,loadConfig:H,setCurrentDirectory:k,saveTemplate:f,saveDefaultMessage:T,deleteTemplate:G,updateTemplate:O,loadLockedFiles:te,lockFile:B,unlockFile:L,isFileLocked:Z}}),os=800;function ea(){const E=window.location.port||"80";if(E==="5173"||E==="4173"||E==="5544"){const o="3001";return console.log(`开发环境:从环境变量读取后端端口 ${o}`),parseInt(o,10)}const v=parseInt(E,10);return console.log(`生产环境:使用当前页面端口 ${v}`),v}const ta=ea(),Je=ms("git",()=>{const E=Ze(),v=c(""),o=c([]),i=c(""),h=c(""),u=c(!1),z=c(!1),m=c(!1),k=c(0),w=c(""),H=c(!1),T=c(!1),f=c(!1),G=c(!1),O=c(!1),te=c(0),B=c(0),L=c(!1),Z=c(""),D=c(0),U=c(0),J=c(!0),I=c(null),ae=c(""),ee=c(""),b=c([]),p=c({staged:[],unstaged:[],untracked:[]}),_=c([]),V=c(!1),N=c(!1),le=c(!1),pe=c(!1),W=c(!1),ce=c(1),ue=c(!0),me=c(0),Be=c([]),Fe=c(!1),x=c(!1),R=c(!1),A=c(!1);function y(){v.value="",o.value=[],i.value="",h.value="",u.value=!1,z.value=!1,m.value=!1,k.value=0,te.value=0,B.value=0,L.value=!1,Z.value="",D.value=0,U.value=0,T.value=!1,f.value=!1,G.value=!1,O.value=!1,w.value="",H.value=!1,b.value=[],p.value={staged:[],unstaged:[],untracked:[]},_.value=[],V.value=!1,N.value=!1,le.value=!1,pe.value=!1,W.value=!1,ce.value=1,ue.value=!0,me.value=0}async function se($=!1,g=!1){if(!m.value)return;const Y=Date.now();if(!$&&!g&&Y-D.value<3e4){console.log("使用缓存的分支状态");return}try{console.log("获取分支状态...");let oe="/api/branch-status";const Te=[];$&&Te.push("force=true"),g&&Te.push("countOnly=true"),Te.length>0&&(oe+="?"+Te.join("&"));const We=await(await fetch(oe)).json();We&&(te.value=We.ahead||0,B.value=We.behind||0,L.value=We.hasUpstream||!1,Z.value=We.upstreamBranch||"",D.value=Y,console.log(`分支状态更新:领先 ${te.value} 个提交,落后 ${B.value} 个提交,上游分支:${L.value?Z.value:"无"}`))}catch(oe){console.error("获取分支状态失败:",oe),te.value=0,B.value=0,L.value=!1,Z.value=""}}async function ie(){const $=Date.now();if($-k.value<1e3)return console.log("使用缓存的Git仓库状态:",m.value?"是":"不是"),m.value;try{const Y=await(await fetch("/api/current_directory")).json();return m.value=Y.isGitRepo===!0,k.value=$,console.log(`当前目录${m.value?"是":"不是"}Git仓库`),m.value}catch(g){return console.error("检查Git仓库状态失败:",g),m.value=!1,k.value=$,!1}}async function he($=!1){try{const oe=await(await fetch($?"/api/branch?force=true":"/api/branch")).json();oe.branch&&(v.value=oe.branch,console.log(`当前分支更新为: ${oe.branch}${$?" (强制刷新)":""}`))}catch(g){console.error("获取分支信息失败:",g)}}async function be(){if(m.value)try{console.log("获取所有分支...");const g=await(await fetch("/api/branches")).json();g.branches&&Array.isArray(g.branches)&&(o.value=g.branches,U.value=Date.now(),console.log(`获取到${g.branches.length}个分支`))}catch($){console.error("获取所有分支信息失败:",$)}}async function de($){console.log("切换到分支:",$);try{u.value=!0;const Y=await(await fetch("/api/checkout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:$})})).json();return Y.success?(n({message:`已切换到分支: ${$}`,type:"success"}),await he(!0),await se(!0),!0):(n({message:`切换分支失败: ${Y.error}`,type:"error"}),!1)}catch(g){return n({message:`切换分支失败: ${g.message}`,type:"error"}),!1}finally{u.value=!1}}async function ke(){try{const g=await(await fetch("/api/user-info")).json();g.name&&g.email&&(i.value=g.name,h.value=g.email)}catch($){console.error("获取用户信息失败:",$)}}async function Ae($,g){if(!$.trim())return n({message:"分支名称不能为空",type:"warning"}),!1;try{z.value=!0;const oe=await(await fetch("/api/create-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({newBranchName:$,baseBranch:g||v.value})})).json();return oe.success?(n({message:`已创建并切换到分支: ${$}`,type:"success"}),await he(!0),await se(!0),await be(),!0):(n({message:`创建分支失败: ${oe.error}`,type:"error"}),!1)}catch(Y){return n({message:`创建分支失败: ${Y.message}`,type:"error"}),!1}finally{z.value=!1}}async function xe(){try{const g=await(await fetch("/api/clear-user-config",{method:"POST"})).json();return g.success?(i.value="",h.value="",n({message:"已清除Git用户配置",type:"success"}),!0):(n({message:`清除配置失败: ${g.error}`,type:"error"}),!1)}catch($){return n({message:`清除配置失败: ${$.message}`,type:"error"}),!1}}async function De($,g){try{const oe=await(await fetch("/api/restore-user-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:$,email:g})})).json();return oe.success?(i.value=$,h.value=g,n({message:"已恢复Git用户配置",type:"success"}),!0):(n({message:`恢复配置失败: ${oe.error}`,type:"error"}),!1)}catch(Y){return n({message:`恢复配置失败: ${Y.message}`,type:"error"}),!1}}async function ve(){if(!m.value)return n({message:"当前目录不是Git仓库",type:"warning"}),!1;try{f.value=!0;const g=await(await fetch("/api/pull",{method:"POST"})).json();return g.success?(n({message:"拉取成功",type:"success"}),await se(),!0):(g.needsMerge?n({message:`需要合并更改: ${g.pullOutput||"存在冲突需要手动解决"}`,type:"warning",duration:5e3}):n({message:`拉取失败: ${g.error}`,type:"error"}),!1)}catch($){return n({message:`拉取失败: ${$.message}`,type:"error"}),!1}finally{f.value=!1}}async function Ee(){if(!m.value)return n({message:"当前目录不是Git仓库",type:"warning"}),!1;try{G.value=!0;const g=await(await fetch("/api/fetch-all",{method:"POST"})).json();return g.success?(n({message:"获取所有远程分支信息成功",type:"success"}),await se(),!0):(n({message:`获取远程分支信息失败: ${g.error}`,type:"error"}),!1)}catch($){return n({message:`获取远程分支信息失败: ${$.message}`,type:"error"}),!1}finally{G.value=!1}}async function at(){I.value&&I.value.disconnect();try{const $=`http://localhost:${ta}`;if(console.log("尝试连接Socket.IO服务器:",$),I.value=ho($,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:["websocket","polling"]}),!I.value){console.error("Socket.IO初始化失败: socket为null");return}console.log("Socket.IO客户端已创建,开始注册事件监听器..."),I.value.on("connect",()=>{var g;console.log("✅ Socket.IO连接成功,事件监听器已生效,Socket ID:",(g=I.value)==null?void 0:g.id),J.value&&I.value&&I.value.emit("start_monitoring")}),I.value.on("project_info",g=>{ae.value=g.projectPath,ee.value=g.projectRoomId,console.log(`当前项目: ${g.projectPath}`),console.log(`房间ID: ${g.projectRoomId}`)}),I.value.on("project_changed",g=>{console.log(`项目已切换: ${g.oldProjectPath} -> ${g.newProjectPath}`),ae.value=g.newProjectPath,ee.value=g.newProjectRoomId,I.value&&I.value.emit("join_room",g.newProjectRoomId),console.log(`已加入新项目房间: ${g.newProjectRoomId}`)}),I.value.on("disconnect",g=>{console.log("与Socket.IO服务器断开连接:",g)}),I.value.on("git_status_update",g=>{if(J.value){if(console.log("✅ 成功监听到 git_status_update 事件:",new Date().toLocaleTimeString()),console.log("git_status_update data ==>",g),console.log("currentProjectPath.value ==>",ae.value),console.log("data.projectPath ==>",g.projectPath),g.projectPath&&ae.value&&g.projectPath!==ae.value){console.log(`忽略不同项目的状态更新: ${g.projectPath}`);return}console.log("正在更新 Git 文件状态..."),g.porcelain!==void 0&&et(g.porcelain)}}),I.value.on("monitoring_status",g=>{console.log("文件监控状态:",g.active?"已启动":"已停止")}),I.value.on("connect_error",g=>{console.error("Socket连接错误:",g.message)}),I.value.on("connect_timeout",()=>{console.error("Socket连接超时")}),I.value.on("reconnect",g=>{var Y;console.log(`Socket重连成功,尝试次数: ${g}`),J.value&&(console.log("重连后重新发送start_monitoring请求"),(Y=I.value)==null||Y.emit("start_monitoring"))}),I.value.on("reconnect_attempt",g=>{console.log(`Socket尝试重连,第 ${g} 次尝试`)}),I.value.on("reconnect_error",g=>{console.error("Socket重连错误:",g.message)}),I.value.on("reconnect_failed",()=>{console.error("Socket重连失败,已达到最大重试次数")}),console.log("Socket.IO事件监听器注册完成:connect, project_info, project_changed, git_status_update, monitoring_status"),I.value&&!I.value.connected&&(console.log("Socket未连接,尝试手动连接..."),I.value.connect())}catch($){console.error("Socket.IO连接初始化失败:",$)}}function wt(){if(console.log("toggleAutoUpdate调用,当前值:",J.value),!I.value){console.error("无法切换自动更新状态: socket连接不存在"),n.error("无法连接到服务器,自动更新可能不会生效"),console.log("尝试重新建立socket连接..."),at(),localStorage.setItem("zen-gitsync-auto-update",J.value.toString());return}try{J.value?(console.log("发送start_monitoring命令..."),I.value.emit("start_monitoring"),n.success("自动更新已启用")):(console.log("发送stop_monitoring命令..."),I.value.emit("stop_monitoring"),n.info("自动更新已禁用")),localStorage.setItem("zen-gitsync-auto-update",J.value.toString()),console.log("已保存自动更新设置到本地存储:",J.value)}catch($){console.error("切换自动更新状态时出错:",$),n.error(`切换自动更新失败: ${$.message}`)}}function et($){if($===void 0||$===""){_.value=[];return}const g=$.split(`
2
- `),Y=[];for(const oe of g){const Te=oe.match(/^([ MADRCU\?]{2})\s+(.+)$/);if(Te){let ze="";const We=Te[1],st=We.charAt(0),Ut=We.charAt(1);st==="A"||st==="M"||st==="D"||st==="R"?ze="added":st===" "&&Ut==="M"?ze="modified":st===" "&&Ut==="D"?ze="deleted":We==="??"?ze="untracked":ze="other",Y.push({path:Te[2],type:ze})}}_.value=Y}async function Qe($=!0){if(!m.value){console.log("当前目录不是Git仓库,跳过加载提交历史");return}try{V.value=!0,console.log("开始加载提交历史...");const g=new Date().getTime(),oe=await(await fetch(`/api/log?page=1&_t=${g}`)).json();oe&&oe.data&&Array.isArray(oe.data)?(b.value=[...oe.data],console.log(`提交历史加载完成,共 ${b.value.length} 条记录`)):(console.warn("API返回的提交历史格式不正确:",oe),b.value=[])}catch(g){console.error("获取提交历史失败:",g),$&&n({message:`获取提交历史失败: ${g.message}`,type:"error"})}finally{V.value=!1}}async function kt(){console.log("刷新提交历史..."),ce.value=1,ue.value=!1,await Qe(!0),me.value=b.value.length,console.log("提交历史刷新完成")}async function Le(){if(!m.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{N.value=!0,await lt()}catch($){console.error("获取Git状态失败:",$),n({message:`获取Git状态失败: ${$.message}`,type:"error"})}finally{N.value=!1}}async function lt(){if(console.log("开始获取Git状态(porcelain格式)..."),!m.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{const g=await(await fetch("/api/status_porcelain")).json();g.status!==void 0?et(g.status):_.value=[]}catch($){console.error("获取Git状态(porcelain)失败:",$),n({message:`获取Git状态(porcelain)失败: ${$.message}`,type:"error"}),_.value=[]}}async function M(){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{le.value=!0;const $=_.value.filter(g=>{const Y=g.path.replace(/\\/g,"/");return!E.lockedFiles.some(Te=>{const ze=Te.replace(/\\/g,"/");return Y===ze})});if($.length===0)return n({message:"没有需要暂存的文件(所有文件都被锁定)",type:"warning"}),!1;if($.length===_.value.length){const Y=await(await fetch("/api/add",{method:"POST"})).json();return Y.success?(n({message:"文件已添加到暂存区",type:"success"}),!0):(n({message:`添加文件失败: ${Y.error}`,type:"error"}),!1)}else{const Y=await(await fetch("/api/add-filtered",{method:"POST"})).json();if(Y.success){const oe=_.value.length-$.length;let Te=`已添加 ${$.length} 个文件到暂存区`;return oe>0&&(Te+=`,跳过 ${oe} 个锁定文件`),n({message:Te,type:"success"}),!0}else return n({message:`添加文件失败: ${Y.error}`,type:"error"}),!1}}catch($){return n({message:`添加文件失败: ${$.message}`,type:"error"}),!1}finally{le.value=!1}}async function S(){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{le.value=!0;const g=await(await fetch("/api/add-all",{method:"POST"})).json();return g.success?(n({message:"所有文件已添加到暂存区",type:"success"}),!0):(n({message:`添加文件失败: ${g.error}`,type:"error"}),!1)}catch($){return n({message:`添加文件失败: ${$.message}`,type:"error"}),!1}finally{le.value=!1}}async function ne($){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{le.value=!0;const Y=await(await fetch("/api/add-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:$})})).json();return Y.success?(n({message:"文件已暂存",type:"success"}),Le(),!0):(n({message:`暂存文件失败: ${Y.error}`,type:"error"}),!1)}catch(g){return n({message:`暂存文件失败: ${g.message}`,type:"error"}),!1}finally{le.value=!1}}async function fe($){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{W.value=!0;const Y=await(await fetch("/api/unstage-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:$})})).json();return Y.success?(n({message:"已取消暂存文件",type:"success"}),Le(),!0):(n({message:`取消暂存失败: ${Y.error}`,type:"error"}),!1)}catch(g){return n({message:`取消暂存失败: ${g.message}`,type:"error"}),!1}finally{W.value=!1}}function Pe($){return new Promise(g=>setTimeout(g,$))}async function ye($,g=!1){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{pe.value=!0;const oe=await(await fetch("/api/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:$,hasNewlines:$.includes(`
3
- `),noVerify:g})})).json();return oe.success?(n({message:"提交成功",type:"success"}),!0):(n({message:`commitChanges 提交失败: ${oe.error}`,type:"error"}),!1)}catch(Y){return n({message:`提交失败: ${Y.message}`,type:"error"}),!1}finally{pe.value=!1}}async function re(){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{T.value=!0;const g=await(await fetch("/api/push",{method:"POST"})).json();return g.success?(te.value=0,B.value=0,await Promise.all([Le(),Qe()]),console.log("推送成功,分支状态已设置为同步 (ahead=0, behind=0)"),!0):(n({message:`推送失败: ${g.error}`,type:"error"}),!1)}catch($){return n({message:`推送失败: ${$.message}`,type:"error"}),!1}finally{T.value=!1}}async function Me($,g={}){if(!m.value)return n({message:"当前目录不是Git仓库",type:"warning"}),!1;if(!$)return n({message:"请选择要合并的分支",type:"warning"}),!1;if($===v.value)return n({message:"不能合并当前分支到自身",type:"warning"}),!1;try{O.value=!0;const Y=await fetch("/api/merge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:$,...g})}),oe=await Y.json();return Y.status===409?(n({message:"合并分支时发生冲突,请手动解决",type:"warning",duration:5e3}),!1):oe.success?(n({message:`成功合并分支 ${$} 到 ${v.value}`,type:"success"}),await Le(),await se(),!0):(n({message:`合并分支失败: ${oe.error}`,type:"error"}),!1)}catch(Y){return n({message:`合并分支失败: ${Y.message}`,type:"error"}),!1}finally{O.value=!1}}async function tt($,g=!1){if(console.log("开始暂存并提交操作..."),!await M())return!1;console.log("暂存完成,等待Git操作完成..."),await Pe(os),console.log("开始提交更改...");const oe=await ye($,g);return console.log("暂存并提交操作完成"),oe}async function nt($,g=!1){try{if(console.log("开始暂存文件..."),!await M()||(console.log("暂存完成,等待Git操作完成..."),await Pe(os),console.log("开始提交更改..."),!await ye($,g)))return!1;console.log("提交完成,等待Git操作完成..."),await Pe(os),console.log("开始推送到远程...");const Te=await re();return console.log("一键推送操作完成,状态已统一刷新"),Te}catch(Y){console.error("一键推送操作失败:",Y);try{(await(await fetch("/api/remove-lock",{method:"POST"})).json()).success&&n({message:"检测到Git锁定文件冲突,已自动清理,请重试操作",type:"warning"})}catch(oe){console.error("清理锁定文件失败:",oe)}n({message:`操作失败: ${Y.message}`,type:"error"});try{await Promise.all([Le(),Qe(),se()])}catch(oe){console.error("刷新状态失败:",oe)}return!1}}async function it(){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{W.value=!0;const g=await(await fetch("/api/reset-head",{method:"POST"})).json();return g.success?(n({message:"已重置暂存区",type:"success"}),Le(),!0):(n({message:`重置暂存区失败: ${g.error}`,type:"error"}),!1)}catch($){return n({message:`重置暂存区失败: ${$.message}`,type:"error"}),!1}finally{W.value=!1}}async function Ht($){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{W.value=!0;const Y=await(await fetch("/api/reset-to-remote",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:$})})).json();return Y.success?(n({message:`已重置分支 ${$} 到远程状态`,type:"success"}),Le(),Qe(),!0):(n({message:`重置分支失败: ${Y.error}`,type:"error"}),!1)}catch(g){return n({message:`重置分支失败: ${g.message}`,type:"error"}),!1}finally{W.value=!1}}async function Jt(){if(m.value)try{H.value=!0,console.log("获取远程仓库地址...");const g=await(await fetch("/api/remote-url")).json();g.success?(w.value=g.url||"",console.log(`获取到远程仓库地址: ${w.value}`)):(console.warn("获取远程仓库地址失败:",g.error),w.value="")}catch($){console.error("获取远程仓库地址失败:",$),w.value=""}finally{H.value=!1}}async function Wt(){if(!w.value)return n({message:"没有可复制的远程仓库地址",type:"warning"}),!1;try{return await navigator.clipboard.writeText(w.value),n({message:"已复制远程仓库地址",type:"success"}),!0}catch($){return console.error("复制远程仓库地址失败:",$),n({message:`复制失败: ${$.message}`,type:"error"}),!1}}ot(()=>{const $=localStorage.getItem("zen-gitsync-auto-update");$!==null&&(J.value=$==="true"),at()});function Rt(){I.value&&(I.value.disconnect(),I.value=null)}js(()=>{Rt()});async function ft(){if(!m.value)return n.warning("当前目录不是Git仓库"),[];try{Fe.value=!0;const g=await(await fetch("/api/stash-list")).json();return g.success?(Be.value=g.stashes,g.stashes):(n.error(`获取stash列表失败: ${g.error}`),[])}catch($){return console.error("获取stash列表失败:",$),n.error(`获取stash列表失败: ${$.message}`),[]}finally{Fe.value=!1}}async function qt($,g=!1,Y=!0){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{A.value=!0;const Te=await(await fetch("/api/stash-save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:$,includeUntracked:g,excludeLocked:Y})})).json();return Te.success?(n.success(Te.message),await ft(),await Le(),!0):(n.warning(Te.message),!1)}catch(oe){return console.error("保存stash失败:",oe),n.error(`保存stash失败: ${oe.message}`),!1}finally{A.value=!1}}async function Yt($,g=!1){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{x.value=!0;const Y=await fetch("/api/stash-apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stashId:$,pop:g})}),oe=await Y.json();return Y.status===409?(n.warning("应用stash时发生冲突,请手动解决"),!1):oe.success?(n.success(oe.message),await ft(),await Le(),!0):(n.error(`应用stash失败: ${oe.error}`),!1)}catch(Y){return console.error("应用stash失败:",Y),n.error(`应用stash失败: ${Y.message}`),!1}finally{x.value=!1}}async function Kt($){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{R.value=!0;const Y=await(await fetch("/api/stash-drop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stashId:$})})).json();return Y.success?(n.success(Y.message),await ft(),!0):(n.error(`删除stash失败: ${Y.error}`),!1)}catch(g){return console.error("删除stash失败:",g),n.error(`删除stash失败: ${g.message}`),!1}finally{R.value=!1}}async function Qt(){if(!m.value)return n.warning("当前目录不是Git仓库"),!1;try{R.value=!0;const g=await(await fetch("/api/stash-clear",{method:"POST"})).json();return g.success?(n.success(g.message),Be.value=[],!0):(n.error(`清空stash失败: ${g.error}`),!1)}catch($){return console.error("清空stash失败:",$),n.error(`清空stash失败: ${$.message}`),!1}finally{R.value=!1}}return{currentBranch:v,allBranches:o,userName:i,userEmail:h,isChangingBranch:u,isCreatingBranch:z,isGitRepo:m,lastCheckedTime:k,branchAhead:te,branchBehind:B,hasUpstream:L,upstreamBranch:Z,lastBranchStatusTime:D,lastBranchesTime:U,remoteUrl:w,isLoadingRemoteUrl:H,stashes:Be,isLoadingStashes:Fe,isApplyingStash:x,isDroppingStash:R,isSavingStash:A,log:b,status:p,fileList:_,isLoadingLog:V,isLoadingStatus:N,isAddingFiles:le,isCommiting:pe,isResetting:W,autoUpdateEnabled:J,currentPage:ce,hasMoreData:ue,totalCommits:me,isPushing:T,isGitPulling:f,isGitFetching:G,isGitMerging:O,$reset:y,checkGitRepo:ie,getCurrentBranch:he,getAllBranches:be,changeBranch:de,getUserInfo:ke,createBranch:Ae,clearUserConfig:xe,restoreUserConfig:De,getBranchStatus:se,gitPull:ve,gitFetchAll:Ee,initSocketConnection:at,toggleAutoUpdate:wt,parseStatusPorcelain:et,fetchLog:Qe,refreshLog:kt,fetchStatus:Le,fetchStatusPorcelain:lt,addToStage:M,addAllToStage:S,addFileToStage:ne,unstageFile:fe,commitChanges:ye,pushToRemote:re,addAndCommit:tt,addCommitAndPush:nt,resetHead:it,resetToRemote:Ht,getRemoteUrl:Jt,copyRemoteUrl:Wt,mergeBranch:Me,getStashList:ft,saveStash:qt,applyStash:Yt,dropStash:Kt,clearAllStashes:Qt,socket:I,disconnectSocket:Rt}});function sa(E){return E.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}function Rs(E){return E?E.split(`
4
- `).map(o=>{const i=sa(o);return o.startsWith("diff --git")||o.startsWith("diff --cc")||o.startsWith("diff --combined")?`<div class="diff-header">${i}</div>`:o.startsWith("---")?`<div class="diff-old-file">${i}</div>`:o.startsWith("+++")?`<div class="diff-new-file">${i}</div>`:o.startsWith("@@")?`<div class="diff-hunk-header">${i}</div>`:o.startsWith("+")?`<div class="diff-added">${i}</div>`:o.startsWith("-")?`<div class="diff-removed">${i}</div>`:`<div class="diff-context">${i}</div>`}).join(""):""}function oa(E){return E?E.trim():"(无提交信息)"}function aa(E){if(!E)return"";const v=/^(feat|fix|docs|style|refactor|perf|test|chore|build|ci|revert)(\([^)]+\))?\s*:\s*(.+)$/s,o=E.match(v);return o?o[3].trim():E.trim()}const Us="/assets/vscode-twqwGmNt.webp",la={class:"file-action-buttons"},na={key:1,style:{"font-size":"16px","font-weight":"bold"}},ia=$e({__name:"FileActionButtons",props:{filePath:{},fileType:{},isLocked:{type:Boolean,default:!1},isLocking:{type:Boolean,default:!1},showLockButton:{type:Boolean,default:!0}},emits:["toggleLock","stage","unstage","revert"],setup(E,{emit:v}){const o=E,i=v,h=Q(()=>{switch(o.fileType){case"added":return[{type:"unstage",tooltip:"取消暂存",buttonType:"warning",icon:"-",handler:()=>i("unstage",o.filePath)}];case"modified":case"deleted":return[{type:"stage",tooltip:"添加到暂存区",buttonType:"success",icon:"+",handler:()=>i("stage",o.filePath)},{type:"revert",tooltip:"撤回修改",buttonType:"danger",icon:vs,handler:()=>i("revert",o.filePath)}];case"untracked":return[{type:"stage",tooltip:"添加到暂存区",buttonType:"success",icon:"+",handler:()=>i("stage",o.filePath)},{type:"delete",tooltip:"删除文件",buttonType:"danger",icon:gs,handler:()=>i("revert",o.filePath)}];default:return[]}});function u(m){m.stopPropagation(),i("toggleLock",o.filePath)}function z(m,k){k.stopPropagation(),m()}return(m,k)=>{const w=Ue,H=Ge,T=_e;return r(),C("div",la,[m.showLockButton?(r(),q(T,{key:0,content:m.isLocking?"处理中...":m.isLocked?"解锁文件":"锁定文件",placement:"top","show-after":200},{default:s(()=>[t(H,{type:m.isLocked?"danger":"info",size:"small",text:"",loading:m.isLocking,disabled:m.isLocking,onClick:u,class:"file-action-btn"},{default:s(()=>[m.isLocking?K("",!0):(r(),q(w,{key:0,size:"16"},{default:s(()=>[(r(),q(us(m.isLocked?a(Et):a(Os))))]),_:1}))]),_:1},8,["type","loading","disabled"])]),_:1},8,["content"])):K("",!0),m.isLocked?K("",!0):(r(!0),C(Se,{key:1},je(h.value,f=>(r(),q(T,{key:f.type,content:f.tooltip,placement:"top","show-after":200},{default:s(()=>[t(H,{type:f.buttonType,size:"small",text:"",onClick:G=>z(f.handler,G),class:"file-action-btn"},{default:s(()=>[typeof f.icon!="string"?(r(),q(w,{key:0,size:"16"},{default:s(()=>[(r(),q(us(f.icon)))]),_:2},1024)):(r(),C("span",na,P(f.icon),1))]),_:2},1032,["type","onClick"])]),_:2},1032,["content"]))),128))])}}}),Ce=(E,v)=>{const o=E.__vccOpts||E;for(const[i,h]of v)o[i]=h;return o},Js=Ce(ia,[["__scopeId","data-v-6ed489df"]]);function Ws(E){if(!E)return"";try{return yo(E)||""}catch(v){return console.warn("Failed to get file icon class:",v),""}}const ra={class:"files-panel"},ca={class:"panel-header"},ua={key:0,class:"file-count"},da={class:"search-box"},fa={class:"files-list"},pa=["onClick"],ma={class:"file-name"},ga=["title"],va={class:"file-directory path-badge"},ha={key:2,class:"file-actions"},ya={class:"diff-panel"},_a={class:"panel-header"},ba={class:"header-right"},wa={class:"selected-file"},ka={class:"path-dir"},$a={class:"path-name"},Ca={key:1,class:"action-buttons"},Sa=["src"],Ta={class:"diff-content"},Fa=["innerHTML"],La={key:1,class:"diff-panel full-width"},Va={class:"panel-header"},Pa={class:"header-right"},Ba={class:"selected-file"},xa={class:"path-dir"},Da={class:"path-name"},za={key:1,class:"action-buttons"},Ra=["src"],Ua={class:"diff-content"},ja=["innerHTML"],as="fileDiff.splitPercent",ls="zen-gitsync-filediff-ratio",Oa=$e({__name:"FileDiffViewer",props:{files:{},emptyText:{default:"没有找到变更文件"},diffContent:{default:""},selectedFile:{default:""},height:{default:"100%"},showFileList:{type:Boolean,default:!0},context:{default:"git-status"},showOpenButton:{type:Boolean,default:!0},showActionButtons:{type:Boolean,default:!1},isFileLocked:{type:Function,default:()=>!1},isLocking:{type:Function,default:()=>!1}},emits:["file-select","open-file","open-with-vscode","toggle-lock","stage","unstage","revert"],setup(E,{emit:v}){const o=E,i=v,h=c(""),u=c(""),z=localStorage.getItem(ls)??localStorage.getItem(as),m=(()=>{const p=z?parseFloat(z):35;return isNaN(p)?35:Math.min(85,Math.max(15,p))})(),k=c(m),w=Q(()=>o.selectedFile||h.value),H=Q(()=>o.files.map(p=>{const _=p.name||p.path.split("/").pop()||p.path;return{...p,displayName:_,dirPath:(()=>{const V=(p.path||"").split("/");return V.length>1?V.slice(0,-1).join("/"):""})(),iconClass:Ws(_)}})),T=Q(()=>{if(!u.value.trim())return H.value;const p=u.value.toLowerCase().trim();return H.value.filter(_=>_.displayName.toLowerCase().includes(p)||_.path.toLowerCase().includes(p))}),f=Q(()=>o.diffContent&&o.diffContent.trim()!==""),G=Q(()=>{if(!w.value)return"";const p=w.value.split("/");return p.slice(0,-1).join("/")+(p.length>1?"/":"")}),O=Q(()=>{if(!w.value)return"";const p=w.value.split("/");return p[p.length-1]||w.value});function te(p){h.value=p,i("file-select",p)}function B(){if(!w.value){n.warning("请先选择一个文件");return}i("open-file",w.value,o.context)}function L(){if(!w.value){n.warning("请先选择一个文件");return}navigator.clipboard.writeText(w.value).then(()=>{n.success("文件路径已复制到剪贴板")}).catch(()=>{n.error("复制失败")})}function Z(){if(!w.value){n.warning("请先选择一个文件");return}i("open-with-vscode",w.value,o.context)}const D=Q(()=>{switch(o.context){case"git-status":return"在系统默认编辑器中打开文件";case"commit-detail":return"打开该提交时的文件版本";case"stash-detail":return"打开该stash中的文件版本";default:return"打开文件"}});Re(()=>o.selectedFile,p=>{p!==void 0&&(h.value=p)}),Re(()=>o.files,p=>{if(p.length>0&&!w.value){const _=p[0];te(_.path)}},{immediate:!0});const U=p=>Math.min(85,Math.max(15,p)),J=p=>{try{const _=String(U(p));localStorage.setItem(ls,_),localStorage.setItem(as,_)}catch{}};Re(k,p=>{J(p)}),ot(()=>{try{const p=localStorage.getItem(ls)??localStorage.getItem(as);if(p!=null){const _=parseFloat(p);isNaN(_)||(k.value=U(_))}}catch{}});const I=c(null),ae=()=>{var _,V;const p=((_=I.value)==null?void 0:_.$el)??I.value;if(p&&p.clientWidth)return p.clientWidth;try{return((V=p==null?void 0:p.getBoundingClientRect)==null?void 0:V.call(p).width)??0}catch{return 0}},ee=()=>{var le,pe,W,ce;const p=((le=I.value)==null?void 0:le.$el)??I.value;if(!p)return;const _=(pe=p.querySelectorAll)==null?void 0:pe.call(p,".el-splitter__panel"),V=ae();if(!_||_.length<1||V<=0)return;const N=((ce=(W=_[0])==null?void 0:W.getBoundingClientRect)==null?void 0:ce.call(W).width)??0;if(N>0){const ue=U(N/V*100);ue!==k.value&&(k.value=ue,J(ue))}},b=Q({get(){return`${U(k.value)}%`},set(p){let _=NaN;if(typeof p=="number"){const V=p,N=ae();N>0&&!isNaN(V)&&(_=V/N*100)}else if(typeof p=="string"){if(p.endsWith("%"))_=parseFloat(p);else if(p.endsWith("px")){const V=parseFloat(p),N=ae();N>0&&!isNaN(V)&&(_=V/N*100)}}isNaN(_)||(k.value=U(_),J(k.value))}});return(p,_)=>{const V=bo;return r(),C("div",{class:"file-diff-viewer",style:_t({height:p.height})},[p.showFileList?(r(),q(a(_o),{key:0,ref_key:"splitterRef",ref:I,layout:"horizontal",style:{height:"100%"},onResize:ee,onResizeEnd:ee},{default:s(()=>[t(V,{size:b.value,"onUpdate:size":_[5]||(_[5]=N=>b.value=N),min:"15%",max:"85%"},{default:s(()=>[e("div",ra,[e("div",ca,[_[6]||(_[6]=e("h4",null,"变更文件",-1)),p.files.length>0?(r(),C("span",ua,"("+P(p.files.length)+")",1)):K("",!0)]),e("div",da,[t(a(Xe),{modelValue:u.value,"onUpdate:modelValue":_[0]||(_[0]=N=>u.value=N),placeholder:"搜索文件名或路径...","prefix-icon":a(wo),clearable:"",size:"small"},null,8,["modelValue","prefix-icon"])]),e("div",fa,[t(a(ko),{height:"100%"},{default:s(()=>[p.files.length===0?(r(),q(a(rt),{key:0,description:p.emptyText,"image-size":60},null,8,["description"])):T.value.length===0?(r(),q(a(rt),{key:1,description:"没有找到匹配的文件","image-size":60})):K("",!0),(r(!0),C(Se,null,je(T.value,N=>(r(),C("div",{key:N.path,class:ge(["file-item",{active:N.path===w.value,[`file-type-${N.type}`]:N.type,"is-locked":N.locked}]),onClick:le=>te(N.path)},[e("span",{class:ge(["file-icon",N.iconClass])},null,2),t(a(_e),{content:N.path,placement:"top",disabled:N.displayName.length<=35,"show-after":200},{default:s(()=>[e("span",ma,P(N.displayName),1)]),_:2},1032,["content","disabled"]),N.dirPath?(r(),C("div",{key:0,class:"file-path-section",title:N.dirPath},[t(a(_e),{content:N.dirPath,placement:"top",disabled:N.dirPath.length<=30,"show-after":200},{default:s(()=>[e("span",va,P(N.dirPath),1)]),_:2},1032,["content","disabled"])],8,ga)):K("",!0),N.locked?(r(),q(a(_e),{key:1,content:"该文件已被锁定,提交时会被跳过",placement:"top","show-after":200},{default:s(()=>[t(a(Ue),{class:"lock-icon",color:"#E6A23C"},{default:s(()=>[t(a(Et))]),_:1})]),_:1})):K("",!0),p.showActionButtons?(r(),C("div",ha,[t(Js,{"file-path":N.path,"file-type":N.type||"modified","is-locked":p.isFileLocked(N.path),"is-locking":p.isLocking(N.path),onToggleLock:_[1]||(_[1]=le=>i("toggle-lock",le)),onStage:_[2]||(_[2]=le=>i("stage",le)),onUnstage:_[3]||(_[3]=le=>i("unstage",le)),onRevert:_[4]||(_[4]=le=>i("revert",le))},null,8,["file-path","file-type","is-locked","is-locking"])])):K("",!0)],10,pa))),128))]),_:1})])])]),_:1},8,["size"]),t(V,{min:"15%",max:"85%"},{default:s(()=>[e("div",ya,[e("div",_a,[_[7]||(_[7]=e("h4",null,"文件差异",-1)),e("div",ba,[w.value?(r(),q(a(_e),{key:0,content:w.value,placement:"top",effect:"light","show-after":200},{default:s(()=>[e("span",wa,[e("span",ka,P(G.value),1),e("span",$a,P(O.value),1)])]),_:1},8,["content"])):K("",!0),p.showOpenButton&&w.value?(r(),C("div",Ca,[t(a(_e),{content:"复制文件路径",placement:"top",effect:"light"},{default:s(()=>[e("button",{class:"modern-btn btn-icon-24",onClick:L},[t(a(Ue),{class:"btn-icon"},{default:s(()=>[t(a(ds))]),_:1})])]),_:1}),t(a(_e),{content:D.value,placement:"top",effect:"light"},{default:s(()=>[e("button",{class:"modern-btn btn-icon-24",onClick:B},[t(a(Ue),{class:"btn-icon"},{default:s(()=>[t(a(fs))]),_:1})])]),_:1},8,["content"]),t(a(_e),{content:"用VSCode打开文件",placement:"top",effect:"light"},{default:s(()=>[e("button",{class:"modern-btn btn-icon-24",onClick:Z},[e("img",{src:a(Us),alt:"VSCode",class:"btn-icon vscode-icon"},null,8,Sa)])]),_:1})])):K("",!0)])]),e("div",Ta,[f.value?(r(),C("div",{key:1,class:"diff-text",innerHTML:a(Rs)(p.diffContent)},null,8,Fa)):(r(),q(a(rt),{key:0,description:w.value?"该文件没有差异内容":"请选择文件查看差异","image-size":80},null,8,["description"]))])])]),_:1})]),_:1},512)):(r(),C("div",La,[e("div",Va,[_[8]||(_[8]=e("h4",null,"文件差异",-1)),e("div",Pa,[w.value?(r(),q(a(_e),{key:0,content:w.value,placement:"top",effect:"light","show-after":200},{default:s(()=>[e("span",Ba,[e("span",xa,P(G.value),1),e("span",Da,P(O.value),1)])]),_:1},8,["content"])):K("",!0),p.showOpenButton&&w.value?(r(),C("div",za,[t(a(_e),{content:"复制文件路径",placement:"top",effect:"light"},{default:s(()=>[e("button",{class:"modern-btn btn-icon-24",onClick:L},[t(a(Ue),{class:"btn-icon"},{default:s(()=>[t(a(ds))]),_:1})])]),_:1}),t(a(_e),{content:D.value,placement:"top",effect:"light"},{default:s(()=>[e("button",{class:"modern-btn btn-icon-24 btn-primary",onClick:B},[t(a(Ue),{class:"btn-icon"},{default:s(()=>[t(a(fs))]),_:1})])]),_:1},8,["content"]),t(a(_e),{content:"用VSCode打开文件",placement:"top",effect:"light"},{default:s(()=>[e("button",{class:"modern-btn btn-icon-24 btn-success",onClick:Z},[e("img",{src:a(Us),alt:"VSCode",class:"btn-icon vscode-icon"},null,8,Ra)])]),_:1})])):K("",!0)])]),e("div",Ua,[f.value?(r(),C("div",{key:1,class:"diff-text",innerHTML:a(Rs)(p.diffContent)},null,8,ja)):(r(),q(a(rt),{key:0,description:w.value?"该文件没有差异内容":"请选择文件查看差异","image-size":80},null,8,["description"]))])]))],4)}}}),ks=Ce(Oa,[["__scopeId","data-v-25fc3754"]]),Ga={class:"common-dialog__footer"},Aa=$e({__name:"CommonDialog",props:{modelValue:{type:Boolean},title:{},size:{default:"medium"},type:{default:"default"},width:{},height:{},top:{default:"50px"},closeOnClickModal:{type:Boolean,default:!1},closeOnPressEscape:{type:Boolean,default:!0},destroyOnClose:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},customClass:{},appendToBody:{type:Boolean,default:!1},lockScroll:{type:Boolean,default:!0},heightMode:{default:"max"},heightOffset:{default:"100px"},showFooter:{type:Boolean,default:!1},confirmText:{default:"确定"},cancelText:{default:"取消"},showCancel:{type:Boolean,default:!0},confirmLoading:{type:Boolean,default:!1}},emits:["update:modelValue","confirm","cancel","close","opened","closed"],setup(E,{emit:v}){const o=E,i=v,h=Q(()=>{if(o.width)return o.width;switch(o.size){case"small":return"30%";case"medium":return"50%";case"large":return"80%";case"extra-large":return"90%";default:return"50%"}}),u=Q(()=>{const f=[];return o.customClass&&f.push(o.customClass),o.type==="flex"&&f.push("common-dialog--flex"),o.type==="full-height"&&f.push("common-dialog--full-height"),f.join(" ")}),z=Q(()=>{const f=`calc(100% - ${o.heightOffset})`;return o.heightMode==="fixed"?{height:f}:{maxHeight:f}});function m(){i("update:modelValue",!1),i("close")}function k(){i("confirm")}function w(){i("cancel"),m()}function H(){i("opened")}function T(){i("closed")}return(f,G)=>{const O=Ge;return r(),q(a(Gs),{"model-value":f.modelValue,title:f.title,width:h.value,top:f.top,style:_t(z.value),"close-on-click-modal":f.closeOnClickModal,"close-on-press-escape":f.closeOnPressEscape,"destroy-on-close":f.destroyOnClose,draggable:f.draggable,class:ge(u.value),"append-to-body":f.appendToBody,"lock-scroll":f.lockScroll,onClose:m,onOpened:H,onClosed:T},$o({default:s(()=>[ct(f.$slots,"default",{},void 0,!0)]),_:2},[f.showFooter||f.$slots.footer?{name:"footer",fn:s(()=>[ct(f.$slots,"footer",{},()=>[e("div",Ga,[f.showCancel?(r(),q(O,{key:0,onClick:w},{default:s(()=>[F(P(f.cancelText),1)]),_:1})):K("",!0),t(O,{type:"primary",loading:f.confirmLoading,onClick:k},{default:s(()=>[F(P(f.confirmText),1)]),_:1},8,["loading"])])],!0)]),key:"0"}:void 0]),1032,["model-value","title","width","top","style","close-on-click-modal","close-on-press-escape","destroy-on-close","draggable","class","append-to-body","lock-scroll"])}}}),Ne=Ce(Aa,[["__scopeId","data-v-0f9dd475"]]),Ma={key:0,class:"file-group"},Ea={class:"file-list"},Ia=["onClick"],Na={class:"file-info"},Ha={class:"file-name-section"},Ja=["title"],Wa={class:"file-directory"},qa={class:"file-actions"},Ya=$e({__name:"FileGroup",props:{files:{},title:{},groupKey:{},collapsedGroups:{},isFileLocked:{type:Function},isLocking:{type:Function},getFileName:{type:Function},getFileDirectory:{type:Function}},emits:["toggleCollapse","fileClick","toggleFileLock","stageFile","unstageFile","revertFileChanges"],setup(E,{emit:v}){const o=E,i=v,h=Q(()=>o.files.length>0),u=Q(()=>o.collapsedGroups[o.groupKey]);function z(){i("toggleCollapse",o.groupKey)}function m(O){i("fileClick",O)}function k(O){i("toggleFileLock",O)}function w(O){i("stageFile",O)}function H(O){i("unstageFile",O)}function T(O){i("revertFileChanges",O)}function f(O){switch(O){case"added":return"A";case"modified":return"M";case"deleted":return"D";case"untracked":return"U";default:return""}}const G=O=>{const te=o.getFileName(O);return Ws(te)};return(O,te)=>{const B=Ue,L=Co("Lock"),Z=_e;return h.value?(r(),C("div",Ma,[e("div",{class:"file-group-header",onClick:z},[t(B,{class:ge(["collapse-icon",{collapsed:u.value}])},{default:s(()=>[t(a(ht))]),_:1},8,["class"]),e("span",null,P(O.title),1)]),Ke(e("div",Ea,[(r(!0),C(Se,null,je(O.files,D=>(r(),C("div",{key:D.path,class:ge(["file-item file-group-item",{"is-loading":o.isLocking(D.path)}]),onClick:U=>m(D)},[e("div",Na,[e("span",{class:ge(["file-type-icon",G(D.path)])},null,2),e("div",Ha,[t(Z,{content:o.getFileName(D.path),placement:"top",disabled:o.getFileName(D.path).length<=25,"show-after":200},{default:s(()=>[e("span",{class:ge(["file-name",{"locked-file-name":o.isFileLocked(D.path),"deleted-file-name":D.type==="deleted"}])},[F(P(o.getFileName(D.path))+" ",1),o.isFileLocked(D.path)?(r(),q(B,{key:0,class:"lock-indicator"},{default:s(()=>[t(L)]),_:1})):K("",!0)],2)]),_:2},1032,["content","disabled"])]),e("div",{class:"file-path-section",title:o.getFileDirectory(D.path)},[t(Z,{content:o.getFileDirectory(D.path),placement:"top",disabled:o.getFileDirectory(D.path).length<=30,"show-after":200},{default:s(()=>[e("span",Wa,P(o.getFileDirectory(D.path)),1)]),_:2},1032,["content","disabled"])],8,Ja),e("div",{class:ge(["file-status-indicator",[D.type,{locked:o.isFileLocked(D.path)}]])},P(f(D.type)),3)]),e("div",qa,[t(Js,{"file-path":D.path,"file-type":D.type,"is-locked":o.isFileLocked(D.path),"is-locking":o.isLocking(D.path),onToggleLock:k,onStage:w,onUnstage:H,onRevert:T},null,8,["file-path","file-type","is-locked","is-locking"])])],10,Ia))),128))],512),[[xt,!u.value]])])):K("",!0)}}}),ns=Ce(Ya,[["__scopeId","data-v-b4c70a7b"]]),Ka={id:"directory-selector",class:"directory-selector"},Qa=["title"],Xa={class:"directory-actions"},Za={class:"directory-content"},el={class:"form-label"},tl={class:"directory-input-group"},sl={class:"form-label"},ol={class:"recent-directories"},al=["onClick"],ll=["title"],nl={class:"directory-footer"},il={class:"footer-actions"},rl=["disabled"],cl=$e({__name:"DirectorySelector",setup(E){const v=Ze(),o=Je(),i=Q(()=>v.currentDirectory),h=c(!1),u=c(""),z=c(!1),m=c([]);function k(){u.value=i.value,h.value=!0,H()}async function w(){try{if(!i.value){n.warning("当前目录路径为空");return}const L=await(await fetch("/api/open_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:i.value})})).json();L.success?n.success("已在文件管理器中打开目录"):L.error&&n.error(L.error)}catch(B){n.error(`打开目录失败: ${B.message}`)}}async function H(){try{const L=await(await fetch("/api/recent_directories")).json();L.success&&Array.isArray(L.directories)&&(m.value=L.directories)}catch(B){console.error("获取最近目录失败:",B)}}async function T(B){try{await fetch("/api/save_recent_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:B})})}catch(L){console.error("保存最近目录失败:",L)}}async function f(){if(!u.value){n.warning("目录路径不能为空");return}try{z.value=!0;const L=await(await fetch("/api/change_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:u.value})})).json();L.success?(n.success("已切换工作目录"),h.value=!1,await T(L.directory),await H(),v.setCurrentDirectory(L.directory),o.isGitRepo=L.isGitRepo,await v.loadConfig(!0),L.isGitRepo?(await Promise.all([o.getCurrentBranch(),o.getAllBranches(),o.getUserInfo(),o.getRemoteUrl()]),o.refreshLog()):(n.warning("当前目录不是Git仓库,部分功能将不可用"),o.$reset())):n.error(L.error||"切换目录失败")}catch(B){n.error(`切换目录失败: ${B.message}`)}finally{z.value=!1}}async function G(){try{const L=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:u.value||i.value})})).json();L.success?O(L):L.error&&n.error(L.error)}catch(B){n.error(`浏览目录失败: ${B.message}`)}}function O(B){!B||!B.items||He.alert(Oe("div",{class:"directory-browser"},[Oe("div",{class:"current-path"},[Oe("span",{class:"path-label"},"当前路径: "),Oe("span",{class:"path-value"},B.path)]),Oe("div",{class:"directory-list"},[B.parentPath?Oe("div",{class:"directory-item parent-dir",onClick:()=>te(B.parentPath)},[Oe("span",{class:"dir-icon"},Oe("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#E6A23C"}},[Oe("path",{d:"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"})])),Oe("span",{class:"dir-name"},"返回上级目录")]):null,...B.items.map(L=>Oe("div",{class:"directory-item",onClick:()=>te(L.path)},[Oe("span",{class:"dir-icon"},Oe("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#409EFF"}},[Oe("path",{d:"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"})])),Oe("span",{class:"dir-name"},L.name)]))])]),"浏览并选择目录",{confirmButtonText:"使用当前目录",customClass:"directory-browser-dialog",callback:L=>{L==="confirm"&&(u.value=B.path)}})}async function te(B){try{He.close(),setTimeout(async()=>{try{const Z=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:B})})).json();Z.success?O(Z):Z.error&&n.error(Z.error)}catch(L){n.error(`浏览目录失败: ${L.message}`)}},100)}catch(L){n.error(`处理目录选择时出错: ${L.message}`)}}return(B,L)=>{const Z=Ue,D=_e,U=Xe,J=zt,I=Dt;return r(),C(Se,null,[e("div",Ka,[e("div",{class:"directory-display cursor-pointer",title:i.value,onClick:k},P(i.value),9,Qa),e("div",Xa,[t(D,{content:"在资源管理器中打开",placement:"top",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn btn-icon-28",onClick:w},[t(Z,{class:"btn-icon"},{default:s(()=>[t(a(fs))]),_:1})])]),_:1})])]),t(Ne,{modelValue:h.value,"onUpdate:modelValue":L[3]||(L[3]=ae=>h.value=ae),title:"切换工作目录",size:"medium","destroy-on-close":!0,"append-to-body":!0,"custom-class":"directory-dialog"},{footer:s(()=>[e("div",nl,[e("div",il,[e("button",{type:"button",class:"footer-btn cancel-btn",onClick:L[1]||(L[1]=ae=>h.value=!1)}," 取消 "),e("button",{type:"button",class:"footer-btn primary-btn",onClick:L[2]||(L[2]=ae=>f()),disabled:z.value},[z.value?(r(),q(Z,{key:1,class:"is-loading"},{default:s(()=>L[7]||(L[7]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z"})],-1)])),_:1})):(r(),q(Z,{key:0},{default:s(()=>[t(a(Gt))]),_:1})),L[8]||(L[8]=e("span",null,"切换",-1))],8,rl)])])]),default:s(()=>[e("div",Za,[t(I,{"label-position":"top"},{default:s(()=>[t(J,null,{label:s(()=>[e("div",el,[t(Z,{class:"label-icon"},{default:s(()=>[t(a(Gt))]),_:1}),L[4]||(L[4]=e("span",null,"目录路径",-1))])]),default:s(()=>[e("div",tl,[t(U,{modelValue:u.value,"onUpdate:modelValue":L[0]||(L[0]=ae=>u.value=ae),placeholder:"请输入目录路径",class:"modern-input",size:"large"},null,8,["modelValue"]),e("button",{type:"button",class:"browse-btn",onClick:G},[t(Z,null,{default:s(()=>[t(a(Gt))]),_:1}),L[5]||(L[5]=e("span",null,"浏览",-1))])])]),_:1}),m.value.length>0?(r(),q(J,{key:0},{label:s(()=>[e("div",sl,[t(Z,{class:"label-icon"},{default:s(()=>[t(a(As))]),_:1}),L[6]||(L[6]=e("span",null,"常用目录",-1))])]),default:s(()=>[e("div",ol,[(r(!0),C(Se,null,je(m.value,(ae,ee)=>(r(),C("div",{key:ee,class:"recent-dir-item",onClick:b=>u.value=ae},[t(Z,{class:"dir-icon"},{default:s(()=>[t(a(Gt))]),_:1}),e("span",{class:"dir-path",title:ae},P(ae),9,ll)],8,al))),128))])]),_:1})):K("",!0)]),_:1})])]),_:1},8,["modelValue"])],64)}}}),ul=Ce(cl,[["__scopeId","data-v-cb10aa78"]]),dl={class:"card git-status-card flex flex-col"},fl={class:"status-header"},pl={class:"title-row"},ml={class:"header-actions"},gl=["element-loading-text"],vl={key:0,class:"status-box"},hl={key:1,class:"status-box-wrap"},yl={key:0,class:"upstream-tip"},_l={class:"tip-header"},bl={class:"tip-body"},wl={class:"tip-actions"},kl={key:1,class:"branch-status-info"},$l={class:"branch-sync-status"},Cl={class:"sync-status-content"},Sl={class:"status-badges"},Tl={class:"badge-content"},Fl={class:"badge-content"},Ll={key:2,class:"file-list-container"},Vl={key:3,class:"empty-status"},Pl={class:"empty-icon"},Bl={class:"lock-feature-description"},xl={class:"description-header"},Dl={key:0,class:"empty-locked-files"},zl={class:"empty-icon"},Rl={key:1,class:"locked-files-list"},Ul={class:"locked-files-header"},jl={class:"locked-file-items"},Ol={class:"file-info"},Gl={class:"file-path-container"},Al={class:"file-name"},Ml={class:"file-directory"},El={class:"file-actions"},Il=$e({__name:"GitStatus",props:{initialDirectory:{type:String,default:""}},setup(E,{expose:v}){const o=E,i=Je(),h=Ze(),u=Q(()=>i.isLoadingStatus),z=c(""),m=c(""),k=c(!1),w=c(!1),H=c(-1),T=c({});function f(x){return!!T.value[x]}const G=Q(()=>i.fileList.map(x=>({path:x.path,name:x.path.split("/").pop()||x.path,type:x.type,locked:me(x.path)})));async function O(x){await ae(x)}async function te(x,R){try{const y=await(await fetch("/api/open-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:x,context:R})})).json();y.success?n.success(y.message):n.error(y.error||"打开文件失败")}catch(A){n.error(`打开文件失败: ${A.message}`)}}async function B(x,R){try{const y=await(await fetch("/api/open-with-vscode",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:x,context:R})})).json();y.success?n.success(y.message):n.error(y.error||"用VSCode打开文件失败")}catch(A){n.error(`用VSCode打开文件失败: ${A.message}`)}}const L=c(!1),Z=c({staged:!1,unstaged:!1,untracked:!1}),D=c(o.initialDirectory||"");async function U(){try{if(!D.value){const R=await(await fetch("/api/current_directory")).json();D.value=R.directory||"未知目录"}if(!i.isGitRepo)return;await i.fetchStatus(),await i.getBranchStatus(),n({message:"Git 状态已刷新",type:"success"})}catch(x){n({message:"刷新失败: "+x.message,type:"error"})}}async function J(x){try{await He.confirm(`确认解锁该文件?
5
- ${x}`,"确认解锁",{type:"warning",confirmButtonText:"解锁",cancelButtonText:"取消"}),await h.unlockFile(x)}catch{}}async function I(){if(h.lockedFiles.length)try{await He.confirm(`确认解锁所有已锁定文件?共 ${h.lockedFiles.length} 个。`,"清空全部锁定",{type:"warning",confirmButtonText:"全部解锁",cancelButtonText:"取消"});const x=[...h.lockedFiles];await Promise.all(x.map(R=>h.unlockFile(R))),await h.loadLockedFiles(),n.success("已清空所有文件锁定")}catch{}}async function ae(x){try{w.value=!0,z.value=x,H.value=i.fileList.findIndex(A=>A.path===x);const R=i.fileList[H.value];if(R&&R.type==="untracked")try{const y=await(await fetch(`/api/file-content?file=${encodeURIComponent(x)}`)).json();y.success&&y.content?m.value=`diff --git a/${x} b/${x}
6
- 新文件: ${x}
7
- --- /dev/null
8
- +++ b/${x}
9
- @@ -0,0 +1,${y.content.split(`
10
- `).length} @@
11
- `+y.content.split(`
12
- `).map(se=>`+${se}`).join(`
13
- `):m.value=`这是一个新文件,尚未被Git跟踪。
14
- 添加到暂存区后可以提交该文件。`}catch(A){console.error("获取未跟踪文件内容失败:",A),m.value=`这是一个新文件,尚未被Git跟踪。
15
- 添加到暂存区后可以提交该文件。`}else if(R&&R.type==="added"){const y=await(await fetch(`/api/diff-cached?file=${encodeURIComponent(x)}`)).json();m.value=y.diff||"没有变更"}else{const y=await(await fetch(`/api/diff?file=${encodeURIComponent(x)}`)).json();m.value=y.diff||"没有变更"}}catch(R){n({message:"获取文件差异失败: "+R.message,type:"error"}),m.value="获取差异失败: "+R.message}finally{w.value=!1}}function ee(x){if(k.value=!0,i.fileList.length>0){const R=i.fileList.find(A=>A.path===x.path)||i.fileList[0];ae(R.path)}}async function b(x){await i.addFileToStage(x)}async function p(x){await i.unstageFile(x)}async function _(){try{if(!i.isGitRepo)return;await i.fetchStatus(),await i.getBranchStatus(!0),n.success("Git 状态已刷新")}catch(x){n.error("刷新失败: "+x.message)}}async function V(){try{await i.gitPull(),await U()}catch(x){console.error("拉取操作发生错误:",x)}}async function N(){try{await i.gitFetchAll(),await U()}catch(x){console.error("获取远程分支信息操作发生错误:",x)}}const le=c(!1);async function pe(){if(!i.currentBranch){n.warning("未知当前分支");return}try{le.value=!0;const x=`git push -u origin ${i.currentBranch}`,A=await(await fetch("/api/exec",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:x})})).json();A.success?(n.success("已推送并设置上游分支"),await i.getAllBranches(),await i.getCurrentBranch(!0),await i.getBranchStatus(!0)):n.error(A.error||"设置上游失败")}catch(x){n.error(`设置上游失败: ${x.message}`)}finally{le.value=!1}}async function W(x){try{await He.confirm(`确定要撤回文件 "${x}" 的所有修改吗?此操作无法撤销。`,"撤回修改",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const A=await(await fetch("/api/revert_file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:x})})).json();A.success?(n.success("已撤回文件修改"),await U()):n.error(A.error?`撤回失败: ${A.error}`:"撤回文件修改失败,请重试")}catch(R){if(R==="cancel"||R.message==="cancel")return;const A=R.message||"未知错误";A!=="undefined"?n.error(`撤回文件修改失败: ${A}`):n.error("撤回文件修改失败,请重试")}}function ce(x){const R=x.split("/");return R[R.length-1]}function ue(x){const R=x.split("/");return R.length<=1?"":R.slice(0,-1).join("/")}function me(x){const R=x.replace(/\\/g,"/");return h.lockedFiles.some(y=>{const se=y.replace(/\\/g,"/");return R===se})}async function Be(x){if(!T.value[x]){T.value[x]=!0;try{me(x)?await h.unlockFile(x):await h.lockFile(x)}finally{delete T.value[x]}}}function Fe(x){Z.value[x]=!Z.value[x]}return ot(()=>{U(),h.loadConfig(),h.loadLockedFiles()}),Re(()=>i.autoUpdateEnabled,(x,R)=>{console.log(`自动更新状态变更: ${R} -> ${x}`),i.toggleAutoUpdate()},{immediate:!1}),v({refreshStatus:_}),(x,R)=>{const A=hs,y=_e,se=Ge,ie=Ue,he=bt,be=Nt;return r(),C(Se,null,[e("div",dl,[e("div",fl,[t(ul),e("div",pl,[R[4]||(R[4]=e("h2",null,"Git 状态",-1)),e("div",ml,[t(y,{content:(a(i).autoUpdateEnabled,"自动更新文件状态"),placement:"top","show-after":200},{default:s(()=>[t(A,{modelValue:a(i).autoUpdateEnabled,"onUpdate:modelValue":R[0]||(R[0]=de=>a(i).autoUpdateEnabled=de),style:{"--el-switch-on-color":"#67C23A","--el-switch-off-color":"#909399","margin-right":"4px"},"inline-prompt":"","active-icon":a(vt),"inactive-icon":a(gs),class:"auto-update-switch"},null,8,["modelValue","active-icon","inactive-icon"])]),_:1},8,["content"]),t(y,{content:"Git Pull (拉取远程更新)",placement:"top","show-after":200},{default:s(()=>[t(se,{type:"primary",icon:a(ps),circle:"",size:"small",onClick:V,loading:a(i).isGitPulling,disabled:!a(i).hasUpstream},null,8,["icon","loading","disabled"])]),_:1}),t(y,{content:"Git Fetch All (获取所有远程分支)",placement:"top","show-after":200},{default:s(()=>[Ke(t(se,{type:"primary",icon:a(mt),circle:"",size:"small",onClick:N,loading:a(i).isGitFetching},null,8,["icon","loading"]),[[xt,!1]])]),_:1}),a(h).lockedFiles.length>0?(r(),q(y,{key:0,content:"管理锁定文件",placement:"top","show-after":200},{default:s(()=>[t(se,{type:"warning",circle:"",size:"small",onClick:R[1]||(R[1]=de=>L.value=!0)},{default:s(()=>[t(ie,null,{default:s(()=>[t(a(Et))]),_:1})]),_:1})]),_:1})):K("",!0),t(y,{content:"刷新状态",placement:"top","show-after":200},{default:s(()=>[t(se,{type:"primary",icon:a(So),circle:"",size:"small",onClick:_,loading:u.value},null,8,["icon","loading"])]),_:1})])])]),Ke((r(),C("div",{class:"card-content","element-loading-text":a(i).isGitPulling?"正在拉取代码...":"正在获取远程分支信息..."},[a(i).isGitRepo?(r(),C("div",hl,[a(i).hasUpstream?K("",!0):(r(),C("div",yl,[e("div",_l,[t(ie,{class:"tip-icon"},{default:s(()=>[t(a(ut))]),_:1}),R[6]||(R[6]=e("span",{class:"tip-title"},"当前分支未设置上游分支",-1))]),e("div",bl,[R[8]||(R[8]=e("div",{class:"tip-text"},"首次推送后即可建立与远程的跟踪关系,后续可直接 pull/push。",-1)),e("div",wl,[t(se,{size:"small",type:"primary",plain:"",loading:le.value,disabled:le.value,onClick:pe},{default:s(()=>R[7]||(R[7]=[F(" 设置上游并推送 ")])),_:1},8,["loading","disabled"])])])])),a(i).hasUpstream&&(a(i).branchAhead>0||a(i).branchBehind>0)?(r(),C("div",kl,[e("div",$l,[e("div",Cl,[t(y,{content:"本地分支与远程分支的状态对比",placement:"top","show-after":200},{default:s(()=>[e("div",Sl,[a(i).branchAhead>0?(r(),q(he,{key:0,size:"small",type:"warning",class:"status-badge"},{default:s(()=>[e("span",Tl,[t(ie,null,{default:s(()=>[t(a(Ms))]),_:1}),F(" 你的分支领先 'origin/"+P(a(i).currentBranch)+"' "+P(a(i).branchAhead)+" 个提交 ",1)])]),_:1})):K("",!0),a(i).branchBehind>0?(r(),q(he,{key:1,size:"small",type:"info",class:"status-badge"},{default:s(()=>[e("span",Fl,[t(ie,null,{default:s(()=>[t(a(ht))]),_:1}),F(" 你的分支落后 'origin/"+P(a(i).currentBranch)+"' "+P(a(i).branchBehind)+" 个提交 ",1)])]),_:1})):K("",!0)])]),_:1})])])])):K("",!0),a(i).fileList.length?(r(),C("div",Ll,[t(ns,{files:a(i).fileList.filter(de=>de.type==="added"),title:"已暂存的更改","group-key":"staged","collapsed-groups":Z.value,"is-file-locked":me,"is-locking":f,"get-file-name":ce,"get-file-directory":ue,onToggleCollapse:Fe,onFileClick:ee,onToggleFileLock:Be,onUnstageFile:p},null,8,["files","collapsed-groups"]),t(ns,{files:a(i).fileList.filter(de=>de.type==="modified"||de.type==="deleted"),title:"未暂存的更改","group-key":"unstaged","collapsed-groups":Z.value,"is-file-locked":me,"is-locking":f,"get-file-name":ce,"get-file-directory":ue,onToggleCollapse:Fe,onFileClick:ee,onToggleFileLock:Be,onStageFile:b,onRevertFileChanges:W},null,8,["files","collapsed-groups"]),t(ns,{files:a(i).fileList.filter(de=>de.type==="untracked"),title:"未跟踪的文件","group-key":"untracked","collapsed-groups":Z.value,"is-file-locked":me,"is-locking":f,"get-file-name":ce,"get-file-directory":ue,onToggleCollapse:Fe,onFileClick:ee,onToggleFileLock:Be,onStageFile:b,onRevertFileChanges:W},null,8,["files","collapsed-groups"])])):a(i).isGitRepo?(r(),C("div",Vl,[e("div",Pl,[t(ie,null,{default:s(()=>[t(a(ys))]),_:1})]),R[9]||(R[9]=e("div",{class:"empty-text"},"没有检测到任何更改",-1)),R[10]||(R[10]=e("div",{class:"empty-subtext"},"工作区是干净的",-1))])):K("",!0)])):(r(),C("div",vl,R[5]||(R[5]=[e("div",{class:"empty-status"},[e("p",null,"当前目录不是Git仓库")],-1)])))],8,gl)),[[be,a(i).isGitPulling||a(i).isGitFetching]])]),t(Ne,{modelValue:k.value,"onUpdate:modelValue":R[2]||(R[2]=de=>k.value=de),title:"文件差异","custom-class":"file-diff-dialog",size:"extra-large",type:"flex","destroy-on-close":"",heightMode:"fixed"},{default:s(()=>[t(ks,{files:G.value,diffContent:m.value,selectedFile:z.value,showActionButtons:!0,isFileLocked:me,isLocking:f,context:"git-status",emptyText:"选择文件查看差异",onFileSelect:O,onOpenFile:te,onOpenWithVscode:B,onToggleLock:Be,onStage:b,onUnstage:p,onRevert:W},null,8,["files","diffContent","selectedFile"])]),_:1},8,["modelValue"]),t(Ne,{modelValue:L.value,"onUpdate:modelValue":R[3]||(R[3]=de=>L.value=de),title:"锁定文件管理",size:"large","destroy-on-close":""},{default:s(()=>[e("div",Bl,[e("div",xl,[t(ie,{class:"description-icon"},{default:s(()=>[t(a(ut))]),_:1}),R[11]||(R[11]=e("span",{class:"description-title"},"文件锁定功能说明",-1))]),R[12]||(R[12]=e("div",{class:"description-content"},[e("ul",null,[e("li",null,"锁定的文件在执行 Git 提交时会被自动跳过,不会被添加到暂存区")])],-1))]),a(h).lockedFiles.length===0?(r(),C("div",Dl,[e("div",zl,[t(ie,null,{default:s(()=>[t(a(Et))]),_:1})]),R[13]||(R[13]=e("p",null,"当前没有锁定的文件",-1)),R[14]||(R[14]=e("p",{class:"empty-tip"},"您可以在文件列表中点击锁定按钮来锁定文件",-1))])):(r(),C("div",Rl,[e("div",Ul,[e("span",null,"🔒 已锁定 "+P(a(h).lockedFiles.length)+" 个文件",1),t(y,{content:"这些文件在提交时会被自动跳过",placement:"top"},{default:s(()=>[t(ie,{class:"info-icon"},{default:s(()=>[t(a(ut))]),_:1})]),_:1}),R[16]||(R[16]=e("div",{style:{flex:"1"}},null,-1)),t(se,{type:"danger",size:"small",plain:"",disabled:!a(h).lockedFiles.length,onClick:I},{default:s(()=>R[15]||(R[15]=[F(" 清空全部锁定 ")])),_:1},8,["disabled"])]),e("div",jl,[(r(!0),C(Se,null,je(a(h).lockedFiles,de=>(r(),C("div",{key:de,class:"locked-file-item"},[e("div",Ol,[R[17]||(R[17]=e("div",{class:"file-status-indicator locked"},null,-1)),e("div",Gl,[e("span",Al,P(ce(de)),1),e("span",Ml,P(ue(de)),1)])]),e("div",El,[t(y,{content:"解锁文件",placement:"top"},{default:s(()=>[t(se,{type:"danger",size:"small",circle:"",class:"file-action-btn",icon:a(Os),"aria-label":"解锁",onClick:ke=>J(de)},null,8,["icon","onClick"])]),_:2},1024)])]))),128))])]))]),_:1},8,["modelValue"])],64)}}}),Nl=Ce(Il,[["__scopeId","data-v-ac1b59ce"]]),Hl={class:"loading-container"},Jl={class:"loading-text"},Wl={key:0,class:"loading-progress"},ql=$e({__name:"GlobalLoading",props:{visible:{type:Boolean,default:!1},text:{default:"加载中..."},showProgress:{type:Boolean,default:!1},progress:{default:0},mock:{type:Boolean,default:!1}},setup(E){return(v,o)=>(r(),q(Es,{to:"body"},[t(Vt,{name:"loading-fade"},{default:s(()=>[v.visible||v.mock?(r(),C("div",{key:0,class:"global-loading-overlay",onClick:o[0]||(o[0]=yt(()=>{},["stop"]))},[e("div",Hl,[o[1]||(o[1]=e("div",{class:"loading-spinner"},[e("div",{class:"spinner-ring"}),e("div",{class:"spinner-ring"}),e("div",{class:"spinner-ring"})],-1)),e("div",Jl,P(v.text),1),v.showProgress||v.mock?(r(),C("div",Wl,[e("div",{class:ge(["progress-bar",{"is-mock":v.mock&&!v.showProgress}]),style:_t(v.showProgress?{width:v.progress+"%"}:void 0)},null,6)])):K("",!0)])])):K("",!0)]),_:1})]))}}),Yl=Ce(ql,[["__scopeId","data-v-6ac6414b"]]),Kl={class:"success-container"},Ql={class:"success-text"},Xl={key:0,class:"success-description"},Zl=$e({__name:"SuccessModal",props:{visible:{type:Boolean,default:!1},text:{default:"操作成功!"},description:{default:""}},setup(E){return(v,o)=>(r(),q(Es,{to:"body"},[t(Vt,{name:"success-fade"},{default:s(()=>[v.visible?(r(),C("div",{key:0,class:"success-overlay",onClick:o[0]||(o[0]=yt(()=>{},["stop"]))},[e("div",Kl,[o[1]||(o[1]=e("div",{class:"success-icon"},[e("svg",{viewBox:"0 0 52 52",class:"success-svg"},[e("circle",{class:"success-circle",cx:"26",cy:"26",r:"25",fill:"none"}),e("path",{class:"success-check",fill:"none",d:"m14.1 27.2l7.1 7.2 16.7-16.8"})])],-1)),e("div",Ql,P(v.text),1),v.description?(r(),C("div",Xl,P(v.description),1)):K("",!0)])])):K("",!0)]),_:1})]))}}),en=Ce(Zl,[["__scopeId","data-v-099400fc"]]),Ye=Is({visible:!1,text:"加载中...",showProgress:!1,progress:0});function tn(){return{loadingState:Ye,show:u=>{Ye.visible=!0,Ye.text=(u==null?void 0:u.text)||"加载中...",Ye.showProgress=(u==null?void 0:u.showProgress)||!1,Ye.progress=(u==null?void 0:u.progress)||0},hide:()=>{Ye.visible=!1},updateProgress:u=>{Ye.progress=Math.max(0,Math.min(100,u))},updateText:u=>{Ye.text=u},setText:u=>{Ye.visible&&(Ye.text=u)}}}const Ft=Is({visible:!1,text:"操作成功!",description:""});function sn(){const E=o=>{Ft.visible=!0,Ft.text=(o==null?void 0:o.text)||"操作成功!",Ft.description=(o==null?void 0:o.description)||"";const i=(o==null?void 0:o.duration)||2e3;setTimeout(()=>{v()},i)},v=()=>{Ft.visible=!1};return{successState:Ft,show:E,hide:v}}const on={class:"template-form"},an={class:"template-form-buttons"},ln={key:0,class:"template-list"},nn={key:1,class:"template-list-scroll"},rn={class:"template-content"},cn={class:"template-actions"},un={key:1,class:"templates-container"},dn={class:"message-templates-list"},fn={class:"templates-scroll-area"},pn={class:"template-content"},mn={class:"template-actions"},gn={key:0,class:"current-default-message"},vn={class:"default-message-content"},hn={key:2,class:"message-help-text"},yn=$e({__name:"TemplateManager",props:{visible:{type:Boolean},type:{},title:{},placeholder:{default:"输入新模板内容"},editPlaceholder:{default:"编辑模板内容"},emptyDescription:{default:"暂无保存的模板"},showDefaultSection:{type:Boolean,default:!1},showHelpText:{type:Boolean,default:!1}},emits:["update:visible","use-template","set-default"],setup(E,{expose:v,emit:o}){const i=E,h=o,u=Ze(),z=c(""),m=c(!1),k=c(""),w=c(-1),H=c(!1),T=c(!1),f=Q(()=>{switch(i.type){case"description":return u.descriptionTemplates||[];case"scope":return u.scopeTemplates||[];case"message":return u.messageTemplates||[];default:return[]}}),G=Q(()=>i.type==="message"?u.defaultCommitMessage:""),O=Q(()=>m.value?i.editPlaceholder:i.placeholder),te=Q(()=>m.value?"更新模板":"添加模板"),B=Q({get:()=>i.visible,set:ee=>h("update:visible",ee)});Re(B,ee=>{ee||L()});function L(){z.value="",m.value=!1,k.value="",w.value=-1}async function Z(){if(!z.value.trim()){n.warning("模板内容不能为空");return}try{H.value=!0,m.value?await u.updateTemplate(k.value,z.value,i.type)&&L():await u.saveTemplate(z.value,i.type)&&(z.value="")}catch(ee){n.error(`模板保存失败: ${ee.message}`)}finally{H.value=!1}}function D(ee){h("use-template",ee),i.type!=="message"&&(B.value=!1)}function U(ee,b){m.value=!0,k.value=ee,z.value=ee,w.value=b}function J(){L()}async function I(ee){try{const b=await u.deleteTemplate(ee,i.type)}catch(b){n.error(`模板删除失败: ${b.message}`)}}async function ae(){if(!(i.type!=="message"||!z.value.trim()))try{T.value=!0,await u.saveDefaultMessage(z.value)&&h("set-default",z.value)}catch(ee){n.error(`设置默认提交信息失败: ${ee.message}`)}finally{T.value=!1}}return v({resetForm:L}),(ee,b)=>{const p=Xe,_=Ge,V=rt,N=To,le=bs,pe=bt;return r(),q(Ne,{modelValue:B.value,"onUpdate:modelValue":b[1]||(b[1]=W=>B.value=W),title:ee.title,"close-on-click-modal":!1,"custom-class":ee.type==="message"?"message-template-dialog":"template-dialog"},{default:s(()=>[e("div",{class:ge(["template-container",{"message-template-container":ee.type==="message"}])},[e("div",on,[t(p,{modelValue:z.value,"onUpdate:modelValue":b[0]||(b[0]=W=>z.value=W),placeholder:O.value,class:"template-input",clearable:"",onKeyup:_s(Z,["enter"])},null,8,["modelValue","placeholder"]),e("div",an,[m.value?(r(),q(_,{key:0,onClick:J},{default:s(()=>b[2]||(b[2]=[F("取消")])),_:1})):K("",!0),t(_,{type:"primary",onClick:Z,disabled:!z.value.trim()||H.value,loading:H.value},{default:s(()=>[F(P(te.value),1)]),_:1},8,["disabled","loading"]),ee.type==="message"?(r(),q(_,{key:1,type:"success",onClick:ae,disabled:!z.value.trim()||T.value,loading:T.value,plain:""},{default:s(()=>b[3]||(b[3]=[F(" 设为默认提交信息 ")])),_:1},8,["disabled","loading"])):K("",!0)])]),ee.type!=="message"?(r(),C("div",ln,[e("h3",null,"已保存"+P(ee.type==="description"?"模板":"作用域"),1),f.value.length===0?(r(),q(V,{key:0,description:ee.emptyDescription},null,8,["description"])):(r(),C("div",nn,[(r(!0),C(Se,null,je(f.value,(W,ce)=>(r(),q(le,{key:ce,class:"template-item"},{default:s(()=>[t(N,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",rn,P(W),1),e("div",cn,[t(_,{type:"primary",size:"small",onClick:ue=>D(W)},{default:s(()=>b[4]||(b[4]=[F("使用")])),_:2},1032,["onClick"]),t(_,{type:"warning",size:"small",icon:a(dt),onClick:ue=>U(W,ce)},{default:s(()=>b[5]||(b[5]=[F(" 编辑 ")])),_:2},1032,["icon","onClick"]),t(_,{type:"danger",size:"small",onClick:ue=>I(W)},{default:s(()=>b[6]||(b[6]=[F("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))]))])):(r(),C("div",un,[e("div",dn,[b[10]||(b[10]=e("h3",null,"已保存模板",-1)),e("div",fn,[f.value.length===0?(r(),q(V,{key:0,description:ee.emptyDescription},null,8,["description"])):K("",!0),(r(!0),C(Se,null,je(f.value,(W,ce)=>(r(),q(le,{key:ce,class:"template-item"},{default:s(()=>[t(N,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:s(()=>[e("div",pn,P(W),1),e("div",mn,[t(_,{type:"primary",size:"small",onClick:ue=>D(W)},{default:s(()=>b[7]||(b[7]=[F("使用")])),_:2},1032,["onClick"]),t(_,{type:"warning",size:"small",icon:a(dt),onClick:ue=>U(W,ce)},{default:s(()=>b[8]||(b[8]=[F(" 编辑 ")])),_:2},1032,["icon","onClick"]),t(_,{type:"danger",size:"small",onClick:ue=>I(W)},{default:s(()=>b[9]||(b[9]=[F("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])]),ee.showDefaultSection?(r(),C("div",gn,[b[18]||(b[18]=e("h3",null,"当前默认提交信息",-1)),G.value?(r(),q(le,{key:0,class:"default-message-card"},{default:s(()=>[e("div",vn,P(G.value),1)]),_:1})):(r(),q(V,{key:1,description:"尚未设置默认提交信息","image-size":100})),ee.showHelpText?(r(),C("div",hn,[b[16]||(b[16]=e("h4",null,"关于默认提交信息",-1)),b[17]||(b[17]=e("p",null,"默认提交信息将在未输入提交信息时自动使用。",-1)),e("p",null,[b[13]||(b[13]=F("你可以通过点击左侧模板的")),t(pe,{size:"small",type:"primary"},{default:s(()=>b[11]||(b[11]=[F("使用")])),_:1}),b[14]||(b[14]=F("按钮先选择喜欢的模板,然后点击上方")),t(pe,{size:"small",type:"success"},{default:s(()=>b[12]||(b[12]=[F("设为默认提交信息")])),_:1}),b[15]||(b[15]=F("按钮保存。"))])])):K("",!0)])):K("",!0)]))],2)]),_:1},8,["modelValue","title","custom-class"])}}}),is=Ce(yn,[["__scopeId","data-v-30972b5b"]]),_n={class:"git-command-preview"},bn={class:"preview-container"},wn={class:"preview-title"},kn={class:"preview-content code-command"},$n=$e({__name:"GitCommandPreview",props:{command:{},title:{default:"Git命令预览:"},copyButtonText:{default:"复制命令"},placeholder:{default:"<命令内容>"}},setup(E){const v=E,o=Q(()=>v.command||v.placeholder);async function i(){if(!v.command){n.warning("没有可复制的命令内容");return}try{await navigator.clipboard.writeText(v.command),n.success("命令已复制到剪贴板")}catch(h){n.error(`复制失败: ${h.message}`)}}return(h,u)=>{const z=Ue,m=_e;return r(),C("div",_n,[e("div",bn,[e("div",wn,P(h.title),1),e("div",kn,P(o.value),1),t(m,{content:h.copyButtonText,placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn copy-command-btn",onClick:i},[t(z,{class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})])]),_:1},8,["content"])])])}}}),Cn=Ce($n,[["__scopeId","data-v-33cee85e"]]),Sn={class:"one-push-content"},Tn={class:"one-push-text"},Fn={key:0,class:"one-push-desc"},Ln=$e({__name:"QuickPushButton",props:{from:{default:"form"},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:""},skipHooks:{type:Boolean,default:!1}},emits:["beforePush","afterPush","clearFields"],setup(E,{emit:v}){const o=Je(),i=Ze(),h=E,u=v;function z(f){const G=f.replace(/\\/g,"/");return i.lockedFiles.some(O=>{const te=O.replace(/\\/g,"/");return G===te})}const m=Q(()=>o.fileList.some(f=>!z(f.path))),k=Q(()=>!m.value||!h.hasUserCommitMessage||!o.hasUpstream),w=Q(()=>o.isAddingFiles||o.isCommiting||o.isPushing),H=Q(()=>m.value?h.hasUserCommitMessage?o.hasUpstream?"一键完成:暂存所有更改 → 提交 → 推送到远程仓库":"当前分支没有上游分支":"请输入提交信息":"没有需要提交的更改");async function T(){u("beforePush");try{const f=await o.addCommitAndPush(h.finalCommitMessage,h.skipHooks);f&&u("clearFields"),u("afterPush",f)}catch(f){console.error("一键推送失败:",f),u("afterPush",!1)}}return(f,G)=>{const O=Ue,te=Ge;return r(),q(a(_e),{content:H.value,placement:"top","show-after":200},{default:s(()=>[t(te,{type:"success",onClick:T,loading:w.value,disabled:k.value,class:ge([f.from,"one-push-button"])},{default:s(()=>[e("div",Sn,[t(O,{class:"one-push-icon"},{default:s(()=>[t(a(Fo))]),_:1}),e("div",Tn,[G[0]||(G[0]=e("span",{class:"one-push-title"},"一键推送所有",-1)),f.from==="form"?(r(),C("span",Fn,"暂存 + 提交 + 推送")):K("",!0)])])]),_:1},8,["loading","disabled","class"])]),_:1},8,["content"])}}}),qs=Ce(Ln,[["__scopeId","data-v-58e155b2"]]),Vn={key:0},Pn=$e({__name:"StageButton",props:{from:{default:"form"}},emits:["click"],setup(E,{emit:v}){const o=v,i=Je(),h=Ze();function u(f){const G=f.replace(/\\/g,"/");return h.lockedFiles.some(O=>{const te=O.replace(/\\/g,"/");return G===te})}function z(){return h.lockedFiles.length===0?!1:i.fileList.some(f=>["modified","deleted","untracked"].includes(f.type)?u(f.path):!1)}const m=Q(()=>i.fileList.filter(f=>["modified","deleted","untracked"].includes(f.type)&&!u(f.path)).length),k=Q(()=>i.fileList.some(f=>["modified","deleted","untracked"].includes(f.type)&&!u(f.path))),w=Q(()=>!k.value),H=Q(()=>k.value?z()?`暂存${m.value}个未暂存文件(逐个添加)`:"暂存所有更改(git add .)":"没有需要暂存的更改");async function T(){o("click");try{let f;z()?f=await i.addToStage():f=await i.addAllToStage(),f&&i.fetchStatus()}catch(f){console.error("添加文件失败:",f)}}return(f,G)=>{const O=Ge,te=_e;return r(),q(te,{content:H.value,placement:"top"},{default:s(()=>[t(O,{type:"primary",onClick:T,loading:a(i).isAddingFiles,disabled:w.value,class:ge(["stage-button",`from-${f.from}`])},{default:s(()=>[G[0]||(G[0]=F(" 暂存更改 ")),m.value>0?(r(),C("span",Vn,"("+P(m.value)+")",1)):K("",!0)]),_:1},8,["loading","disabled","class"])]),_:1},8,["content"])}}}),Ys=Ce(Pn,[["__scopeId","data-v-80c326be"]]),Bn={key:0},xn=$e({__name:"CommitButton",props:{from:{default:"form"},hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:""},skipHooks:{type:Boolean,default:!1}},emits:["click","beforeCommit","afterCommit"],setup(E,{emit:v}){const o=E,i=v,h=Je(),u=Ze();function z(f){const G=f.replace(/\\/g,"/");return u.lockedFiles.some(O=>{const te=O.replace(/\\/g,"/");return G===te})}const m=Q(()=>h.fileList.filter(f=>f.type==="added"&&!z(f.path)).length),k=Q(()=>m.value>0),w=Q(()=>!k.value||!o.hasUserCommitMessage),H=Q(()=>k.value?o.hasUserCommitMessage?`提交${m.value}个已暂存文件`:"请输入提交信息":"没有已暂存的更改");async function T(){if(o.finalCommitMessage.trim()){i("beforeCommit"),i("click");try{const f=await h.commitChanges(o.finalCommitMessage,o.skipHooks);f&&(h.fetchStatus(),h.fetchLog(),h.getBranchStatus(!0)),i("afterCommit",f)}catch(f){console.error("提交失败:",f),i("afterCommit",!1)}}}return(f,G)=>{const O=Ge,te=_e;return r(),q(te,{content:H.value,placement:"top"},{default:s(()=>[t(O,{type:"primary",onClick:T,loading:a(h).isLoadingStatus,disabled:w.value,class:ge(["commit-button",`from-${f.from}`])},{default:s(()=>[G[0]||(G[0]=F(" 提交 ")),m.value>0?(r(),C("span",Bn,"("+P(m.value)+")",1)):K("",!0)]),_:1},8,["loading","disabled","class"])]),_:1},8,["content"])}}}),Ks=Ce(xn,[["__scopeId","data-v-0d2dc989"]]),Dn={key:0},zn=$e({__name:"PushButton",props:{from:{default:"form"}},emits:["click","beforePush","afterPush"],setup(E,{emit:v}){const o=v,i=Je(),h=Q(()=>i.branchAhead>0),u=Q(()=>i.fileList.some(T=>T.type==="added")),z=Q(()=>i.hasUpstream&&h.value&&!u.value),m=Q(()=>!z.value),k=Q(()=>i.hasUpstream?h.value?u.value?"有未提交的暂存更改,请先提交":`推送${i.branchAhead}个本地提交`:"没有需要推送的提交":"当前分支没有上游分支"),w=Q(()=>z.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{});async function H(){o("beforePush"),o("click");try{const T=await i.pushToRemote();T&&await new Promise(f=>setTimeout(f,200)),o("afterPush",T)}catch(T){console.error("推送失败:",T),o("afterPush",!1)}}return(T,f)=>{const G=Ge,O=_e;return r(),q(O,{content:k.value,placement:"top"},{default:s(()=>[t(G,{type:"primary",icon:a(Lo),onClick:H,loading:a(i).isPushing,disabled:m.value,style:_t(w.value),class:ge(["push-button",`from-${T.from}`])},{default:s(()=>[f[0]||(f[0]=F(" 推送 ")),h.value?(r(),C("span",Dn,"("+P(a(i).branchAhead)+")",1)):K("",!0)]),_:1},8,["icon","loading","disabled","style","class"])]),_:1},8,["content"])}}}),Qs=Ce(zn,[["__scopeId","data-v-825223aa"]]),Rn={class:"form-bottom-actions"},Un={class:"actions-flex-container"},jn={class:"left-actions"},On={class:"button-grid"},Gn={class:"right-actions"},An=$e({__name:"GitActionButtons",props:{hasUserCommitMessage:{type:Boolean,default:!1},finalCommitMessage:{default:""},skipHooks:{type:Boolean,default:!1},from:{default:"form"}},emits:["afterCommit","afterPush","beforePush","clearFields"],setup(E,{emit:v}){const o=v;function i(m){o("afterCommit",m)}function h(m){o("afterPush",m)}function u(){o("beforePush")}function z(){o("clearFields")}return(m,k)=>(r(),C("div",Rn,[e("div",Un,[e("div",jn,[e("div",On,[t(Ys,{onClick:()=>{},from:m.from},null,8,["from"]),t(Ks,{"has-user-commit-message":m.hasUserCommitMessage,"final-commit-message":m.finalCommitMessage,"skip-hooks":m.skipHooks,onBeforeCommit:()=>{},onAfterCommit:i,onClick:()=>{},from:m.from},null,8,["has-user-commit-message","final-commit-message","skip-hooks","from"]),t(Qs,{onBeforePush:()=>{},onAfterPush:h,onClick:()=>{},from:m.from},null,8,["from"])])]),e("div",Gn,[t(qs,{from:m.from,"has-user-commit-message":m.hasUserCommitMessage,"final-commit-message":m.finalCommitMessage,"skip-hooks":m.skipHooks,onBeforePush:u,onAfterPush:h,onClearFields:z},null,8,["from","has-user-commit-message","final-commit-message","skip-hooks"])])])]))}}),Mn=Ce(An,[["__scopeId","data-v-e7e0beea"]]),En={class:"option-header"},In={class:"option-info"},Nn={class:"option-title"},Hn=$e({__name:"OptionSwitchCard",props:{modelValue:{type:Boolean},title:{},tooltip:{},activeText:{},inactiveText:{},activeColor:{},iconClass:{},compact:{type:Boolean}},emits:["update:modelValue"],setup(E,{emit:v}){const o=E,i=v;function h(u){i("update:modelValue",u)}return(u,z)=>{const m=hs,k=_e;return r(),C("div",{class:ge(["option-card",{compact:o.compact}])},[t(k,{content:u.tooltip,placement:"top","show-after":200},{default:s(()=>[e("div",En,[e("div",{class:ge(["option-icon",u.iconClass])},[ct(u.$slots,"icon",{},void 0,!0)],2),e("div",In,[e("h4",Nn,P(u.title),1)]),t(m,{class:"option-switch","model-value":u.modelValue,"onUpdate:modelValue":h,"active-text":u.activeText,"inactive-text":u.inactiveText,"active-color":u.activeColor,size:"small"},null,8,["model-value","active-text","inactive-text","active-color"])])]),_:3},8,["content"])],2)}}}),rs=Ce(Hn,[["__scopeId","data-v-98a6acaa"]]),Jn={class:"console-header"},Wn={class:"header-left"},qn={class:"header-actions"},Yn={class:"console-content"},Kn={class:"console-input-row"},Qn={class:"prompt",title:"当前路径"},Xn={key:0,class:"console-output"},Zn={class:"cmd-header"},ei={class:"cmd-line"},ti={class:"cmd-text"},si={class:"ts"},oi={key:0,class:"output-content"},ai={key:0,class:"stdout"},li={key:1,class:"stderr"},ni=$e({__name:"CommandConsole",setup(E){const v=c(""),o=c(""),i=c(!1),h=c([]);let u=0;const z=c(!1),m=c(!1);async function k(){const H=o.value.trim();if(!H||i.value)return;i.value=!0;const T={id:++u,command:H,success:!1,ts:new Date().toLocaleString(),expanded:!0,stdout:"",stderr:""};h.value.unshift(T);try{const G=await(await fetch("/api/exec",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:H})})).json();T.success=!!(G!=null&&G.success),T.stdout=(G==null?void 0:G.stdout)||"",T.stderr=(G==null?void 0:G.error)||(G==null?void 0:G.stderr)||""}catch(f){T.success=!1,T.stderr=(f==null?void 0:f.message)||String(f)}finally{i.value=!1,o.value=""}}function w(H){const T=h.value.findIndex(f=>f.id===H.id);T!==-1&&(h.value[T].expanded=!h.value[T].expanded)}return ot(async()=>{try{const T=await(await fetch("/api/current_directory")).json();v.value=(T==null?void 0:T.directory)||""}catch{}}),(H,T)=>{const f=Ue,G=Ge,O=_e,te=Xe;return r(),C("div",{class:ge(["command-console",{fullscreen:m.value}])},[e("div",Jn,[e("div",Wn,[t(f,{class:"title-icon"},{default:s(()=>[t(a(ys))]),_:1}),T[3]||(T[3]=e("span",{class:"console-title"},"自定义指令执行",-1))]),e("div",qn,[t(O,{content:m.value?"退出全屏":"全屏显示",placement:"bottom"},{default:s(()=>[t(G,{text:"",onClick:T[0]||(T[0]=B=>m.value=!m.value),class:"toggle-console-btn"},{default:s(()=>[t(f,null,{default:s(()=>[t(a(Ns))]),_:1})]),_:1})]),_:1},8,["content"]),t(O,{content:z.value?"收起":"展开",placement:"bottom"},{default:s(()=>[t(G,{text:"",onClick:T[1]||(T[1]=B=>z.value=!z.value),class:"toggle-console-btn"},{default:s(()=>[t(f,{class:ge({"rotate-icon":!z.value})},{default:s(()=>[t(a(ht))]),_:1},8,["class"])]),_:1})]),_:1},8,["content"])])]),t(Vt,{name:"console-content-slide"},{default:s(()=>[Ke(e("div",Yn,[e("div",Kn,[e("span",Qn,P(v.value)+" >",1),t(te,{modelValue:o.value,"onUpdate:modelValue":T[2]||(T[2]=B=>o.value=B),class:"console-input",placeholder:"输入命令,例如: git status",onKeydown:_s(yt(k,["prevent"]),["enter"]),disabled:i.value,clearable:""},null,8,["modelValue","onKeydown","disabled"]),t(G,{type:"primary",loading:i.value,onClick:k},{default:s(()=>T[4]||(T[4]=[F("执行")])),_:1},8,["loading"])]),h.value.length?(r(),C("div",Xn,[(r(!0),C(Se,null,je(h.value,B=>(r(),C("div",{key:B.id,class:"console-record"},[e("div",Zn,[e("div",ei,[T[5]||(T[5]=e("span",{class:"cmd-prefix"},">",-1)),e("span",ti,P(B.command),1),e("span",si,P(B.ts),1)]),t(O,{content:B.stdout||B.stderr?B.expanded?"收起输出":"展开输出":"无输出内容",placement:"left"},{default:s(()=>[t(G,{text:"",size:"small",onClick:L=>w(B),disabled:!B.stdout&&!B.stderr,class:"toggle-output-btn"},{default:s(()=>[t(f,{class:ge({"rotate-icon":!B.expanded})},{default:s(()=>[t(a(ht))]),_:2},1032,["class"])]),_:2},1032,["onClick","disabled"])]),_:2},1032,["content"])]),t(Vt,{name:"output-slide"},{default:s(()=>[B.expanded&&(B.stdout||B.stderr)?(r(),C("div",oi,[B.stdout?(r(),C("pre",ai,P(B.stdout),1)):K("",!0),B.stderr?(r(),C("pre",li,P(B.stderr),1)):K("",!0)])):K("",!0)]),_:2},1024)]))),128))])):K("",!0)],512),[[xt,z.value]])]),_:1})],2)}}}),ii=Ce(ni,[["__scopeId","data-v-19b78376"]]),ri={class:"card-header app-card-header"},ci={class:"header-left"},ui={key:0,class:"header-actions"},di={class:"card-content app-card-content"},fi={class:"layout-container"},pi={key:0,class:"git-config-warning"},mi={key:1,class:"commit-section"},gi={key:0,class:"commit-form"},vi={class:"description-container"},hi={key:1,class:"standard-commit-form"},yi={class:"standard-commit-header"},_i={class:"type-scope-container"},bi={class:"scope-wrapper"},wi={class:"description-container description-inline"},ki={class:"advanced-fields"},$i={class:"actions-section"},Ci={class:"action-groups"},Si={class:"operations-wrapper"},Ti={class:"action-group"},Fi={class:"group-buttons"},Li={key:0},Vi={class:"action-group"},Pi={class:"group-buttons"},Bi={class:"action-group reset-group"},xi={class:"group-buttons"},Di={key:0},zi={class:"action-group branch-group"},Ri={class:"group-buttons"},Ui={class:"action-group"},ji={class:"group-buttons"},Oi={class:"editor-header"},Gi={class:"editor-info"},Ai={class:"editor-tips"},Mi={class:"json-editor-wrapper"},Ei={class:"editor-footer"},Ii={class:"footer-left"},Ni={class:"footer-right"},Hi={class:"config-warning-content"},Ji={class:"warning-message"},Wi={class:"dialog-footer"},qi={class:"stash-dialog-content"},Yi={class:"stash-info-card"},Ki={class:"info-icon"},Qi={class:"stash-options"},Xi={class:"options-title"},Zi={class:"option-item"},er={class:"option-item"},tr={key:0,class:"stash-preview"},sr={class:"preview-title"},or={class:"file-count-info"},ar={class:"merge-dialog-content"},lr={class:"merge-intro"},nr={class:"merge-options"},ir={class:"dialog-footer"},rr={class:"stash-list-content"},cr={key:0,class:"stash-header"},ur={class:"stash-stats"},dr={class:"stat-item"},fr={class:"stat-number"},pr={key:0,class:"stash-actions-header"},mr={class:"stash-list-container"},gr={key:0,class:"empty-state"},vr={key:1,class:"stash-cards"},hr={class:"stash-card-content"},yr={class:"stash-info"},_r={class:"stash-main-info"},br={class:"stash-id-badge"},wr={class:"stash-id-text"},kr={class:"stash-description"},$r={class:"description-text"},Cr={class:"stash-card-actions"},Sr={class:"stash-content"},Tr={key:0,class:"stash-info-row"},Fr={class:"stash-id"},Lr={class:"stash-id-value"},Vr={class:"stash-description"},Pr={class:"stash-description-value"},Br={class:"stash-main-content"},xr={key:0,class:"status-updating-indicator"},Dr={class:"commit-settings-content"},zr=$e({__name:"CommitForm",setup(E,{expose:v}){const o=Je(),i=Ze(),h=c(""),{loadingState:u,show:z,hide:m,setText:k}=tn(),{successState:w,show:H}=sn(),T=c(!1),f=c("输入提交信息..."),G=c(""),O=c(!1),te=c("feat"),B=c(""),L=c(""),Z=c(""),D=c(""),U=c(!1),J=c(""),I=c(!1),ae=c(!1),ee=c(""),b=c([]),p=c(!1),_=c(!1),V=c(""),N=c({noFf:!1,squash:!1,noCommit:!1,message:""}),le=c([]),pe=c(!1),W=c(!1),ce=c(!1),ue=c(!1),me=c(!1),Be=[{value:"feat",label:"feat: 新功能"},{value:"fix",label:"fix: 修复bug"},{value:"docs",label:"docs: 文档修改"},{value:"style",label:"style: 样式修改"},{value:"refactor",label:"refactor: 代码重构"},{value:"test",label:"test: 测试代码"},{value:"chore",label:"chore: 构建/工具修改"}],Fe=c(!1),x=c(!1),R=c(""),A=c(!1),y=c(!0),se=c(!1),ie=c(null),he=c([]),be=c(""),de=c(!1),ke=c("");function Ae(){R.value="",A.value=!1,y.value=!Xt.value,Fe.value=!0}async function xe(){try{const l=await(await fetch("/api/config/check-file-format")).json();let X="";l.success&&(l.exists?l.isValidJson||(X=`系统配置文件格式有误:${l.error}
16
- 编辑后保存可能会覆盖原文件内容。`):X="系统配置文件不存在,将使用默认配置。");const we=i.config;if(J.value=JSON.stringify(we,null,2),X){ee.value=X,ae.value=!0;return}U.value=!0}catch{n.error("加载配置失败")}}async function De(){try{I.value=!0;let d;try{d=JSON.parse(J.value)}catch(we){n.error(`JSON 解析失败: ${we.message||we}`);return}const X=await(await fetch("/api/config/saveAll",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({config:d})})).json();if(!X.success)throw new Error(X.error||"保存失败");await i.loadConfig(!0);try{await i.loadLockedFiles()}catch{}try{Array.isArray(i.descriptionTemplates)&&(b.value=[...i.descriptionTemplates])}catch{}try{Array.isArray(i.scopeTemplates)&&(le.value=[...i.scopeTemplates])}catch{}try{Array.isArray(i.messageTemplates)&&(fe.value=[...i.messageTemplates])}catch{}n.success("配置已保存"),U.value=!1}catch(d){n.error(`保存配置失败: ${d.message||d}`)}finally{I.value=!1}}async function ve(){try{const d=await fetch("/api/config/open-file",{method:"POST"}),l=await d.json();if(!d.ok||!(l!=null&&l.success))throw new Error((l==null?void 0:l.error)||"打开失败");n.success("已用系统程序打开配置文件")}catch(d){n.error(`打开配置文件失败: ${(d==null?void 0:d.message)||d}`)}}function Ee(d){ae.value=!1,d==="continue"?U.value=!0:d==="open"&&ve()}function at(){o.getStashList(),x.value=!0}async function wt(){try{await o.saveStash(R.value,A.value,y.value),Fe.value=!1}catch(d){console.error("储藏失败:",d)}}async function et(d,l=!1){try{await o.applyStash(d,l),l&&await o.getStashList()}catch(X){console.error("应用储藏失败:",X)}}async function Qe(d){He.confirm("确定要删除此储藏吗?此操作不可恢复。","删除储藏",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(async()=>{await o.dropStash(d),await o.getStashList()}).catch(()=>{})}async function kt(){He.confirm("确定要清空所有储藏吗?此操作不可恢复。","清空所有储藏",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(async()=>{await o.clearAllStashes(),await o.getStashList()}).catch(()=>{})}async function Le(d){if(d){ie.value=d,se.value=!0,de.value=!0,he.value=[],be.value="",ke.value="";try{if(!d.id||d.id.length<7){be.value="无效的stash ID",de.value=!1;return}const X=await(await fetch(`/api/stash-files?stashId=${encodeURIComponent(d.id)}`)).json();X.success&&Array.isArray(X.files)?(he.value=X.files,he.value.length>0?await lt(d.id,he.value[0]):be.value="该stash没有变更文件"):be.value=`获取文件列表失败: ${X.error||"未知错误"}`}catch(l){be.value=`获取stash详情失败: ${l.message}`}finally{de.value=!1}}}async function lt(d,l){de.value=!0,ke.value=l;try{const we=await(await fetch(`/api/stash-file-diff?stashId=${encodeURIComponent(d)}&file=${encodeURIComponent(l)}`)).json();we.success?be.value=we.diff||"没有变更内容":be.value=`获取差异失败: ${we.error||"未知错误"}`}catch(X){be.value=`获取差异失败: ${X.message}`}finally{de.value=!1}}function M(d){ie.value&&lt(ie.value.id,d)}async function S(d,l){try{const we=await(await fetch("/api/open-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:d,context:l})})).json();we.success?n.success(we.message):n.error(we.error||"打开文件失败")}catch(X){n.error(`打开文件失败: ${X.message}`)}}async function ne(d,l){try{const we=await(await fetch("/api/open-with-vscode",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:d,context:l})})).json();we.success?n.success(we.message):n.error(we.error||"用VSCode打开文件失败")}catch(X){n.error(`用VSCode打开文件失败: ${X.message}`)}}const fe=c([]);Re(O,d=>{localStorage.setItem("zen-gitsync-standard-commit",d.toString())}),Re(ce,d=>{localStorage.setItem("zen-gitsync-skip-hooks",d.toString())}),Re(ue,d=>{localStorage.setItem("zen-gitsync-auto-quick-push",d.toString())});const Pe=Q(()=>{if(!O.value)return h.value||G.value;let d=`${te.value||""}`;return B.value&&(d+=`(${B.value})`),d+=`: ${L.value}`,Z.value&&(d+=`
17
-
18
- ${Z.value}`),D.value&&(d+=`
19
-
20
- ${D.value}`),d}),ye=Q(()=>O.value?te.value.trim()!==""&&L.value.trim()!=="":h.value.trim()!==""),re=Q(()=>{const d=`输入提交信息 (默认: ${G.value})`;return ue.value?`${d}(按回车一键推送)`:d}),Me=Q(()=>ue.value?"简短描述(必填,按回车一键推送)":"简短描述(必填)"),tt=Q(()=>he.value.map(d=>({path:d,name:d.split("/").pop()||d}))),nt=Q(()=>{let d=`git commit -m "${Pe.value}"`;return ce.value&&(d+=" --no-verify"),d});function it(){const d=i.config;d&&(f.value=`输入提交信息 (默认: ${d.defaultCommitMessage})`,G.value=d.defaultCommitMessage||"",d.descriptionTemplates&&Array.isArray(d.descriptionTemplates)&&(b.value=d.descriptionTemplates),d.scopeTemplates&&Array.isArray(d.scopeTemplates)&&(le.value=d.scopeTemplates),d.messageTemplates&&Array.isArray(d.messageTemplates)&&(fe.value=d.messageTemplates))}function Ht(d){L.value=d,p.value=!1}function Jt(d){B.value=d,pe.value=!1}function Wt(){p.value=!0}function Rt(){pe.value=!0}function ft(){H({text:"操作成功!",description:"已完成操作",duration:2e3})}async function qt(){try{await o.gitPull(),await o.fetchStatus(),await o.fetchLog(!1)}catch(d){console.error("拉取操作发生错误:",d)}}async function Yt(){try{await o.gitFetchAll(),await o.fetchStatus(),await o.fetchLog(!1)}catch(d){console.error("获取远程分支信息操作发生错误:",d)}}async function Kt(){if(!Pe.value.trim()){n({message:"提交信息不能为空",type:"warning"});return}try{await o.addAndCommit(Pe.value,ce.value),$(),o.fetchStatus(),o.fetchLog()}catch(d){n({message:`暂存并提交失败: ${d.message}`,type:"error"})}}async function Qt(){try{await He.confirm(`确定要重置当前分支 "${o.currentBranch}" 到远程状态吗?这将丢失所有未推送的提交和本地更改。`,"重置到远程分支",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await o.resetToRemote(o.currentBranch)&&(o.fetchStatus(),o.fetchLog())}catch(d){d!=="cancel"&&n({message:`重置到远程分支失败: ${d.message}`,type:"error"})}}function $(){h.value="",L.value="",Z.value="",D.value=""}function g(){z({text:"正在暂存文件...",showProgress:!1})}function Y(d){if(m(),d){T.value=!0;try{setTimeout(async()=>{try{console.log("推送成功,状态已更新")}catch(l){console.error("一键推送后处理失败:",l)}finally{T.value=!1}},1e3)}catch(l){console.error("一键推送后处理失败:",l),T.value=!1}}}function oe(d){const l=d.replace(/\\/g,"/");return i.lockedFiles.some(X=>{const we=X.replace(/\\/g,"/");return l===we})}const Te=Q(()=>o.fileList.some(d=>["modified","deleted","untracked"].includes(d.type)&&!oe(d.path))),ze=Q(()=>o.fileList.filter(d=>d.type==="added"&&!oe(d.path)).length),We=Q(()=>ze.value>0),st=Q(()=>o.fileList.some(d=>!oe(d.path))),Ut=Q(()=>o.fileList.length>0),Xt=Q(()=>o.fileList.length>0&&o.fileList.every(d=>oe(d.path))),Xs=Q(()=>o.branchAhead>0),Zt=Q(()=>o.branchBehind>0),Ss=Q(()=>We.value),Zs=Q(()=>o.hasUpstream&&(Xs.value||Zt.value||st.value));function eo(d){h.value=d,W.value=!1}async function Ts(d){if(!(!ue.value||!ye.value||!o.fileList.some(X=>!oe(X.path))||!ye.value||!o.hasUpstream)&&d.key==="Enter"&&!d.shiftKey){d.preventDefault();try{g();const X=await o.addCommitAndPush(Pe.value,ce.value);X&&$(),Y(X)}catch(X){console.error("回车自动一键提交失败:",X),Y(!1)}}}async function to(d){try{await i.saveDefaultMessage(d)&&n.success("默认提交信息设置成功")}catch(l){n.error(`设置默认提交信息失败: ${l.message}`)}}Re(()=>o.isAddingFiles,d=>{d&&u.visible&&k("正在暂存文件...")}),Re(()=>o.isCommiting,d=>{d&&u.visible&&k("正在提交更改...")}),Re(()=>o.isPushing,d=>{d&&u.visible&&k("正在推送...")}),ot(async()=>{const d=localStorage.getItem("zen-gitsync-standard-commit");d!==null&&(O.value=d==="true");const l=localStorage.getItem("zen-gitsync-skip-hooks");l!==null&&(ce.value=l==="true");const X=localStorage.getItem("zen-gitsync-auto-quick-push");X!==null&&(ue.value=X==="true"),Re(()=>i.config,it,{immediate:!0}),i.config||await i.loadConfig()});function so(){V.value="",N.value={noFf:!1,squash:!1,noCommit:!1,message:""},pt.value="all",_.value=!0,o.allBranches.length===0&&o.getAllBranches()}const pt=c("all"),oo=Q(()=>{const d=o.allBranches.filter(l=>l!==o.currentBranch);if(console.log("筛选分支列表:",{allBranches:o.allBranches,currentBranch:o.currentBranch,branchTypeFilter:pt.value,filteredBranches:d}),pt.value==="local"){const l=d.filter(X=>!X.includes("origin/"));return console.log("本地分支:",l),l}else if(pt.value==="remote"){const l=d.filter(X=>X.includes("origin/"));return console.log("远程分支:",l),l}else return console.log("所有分支:",d),d});async function ao(){if(!V.value){n({message:"请选择要合并的分支",type:"warning"});return}try{await o.mergeBranch(V.value,N.value)&&(_.value=!1,await o.fetchStatus(),await o.fetchLog(!1))}catch(d){console.error("合并分支操作发生错误:",d)}}const jt=c(!1),es=c(!1);function lo(){jt.value=!jt.value}v({openConfigEditor:xe,toggleGitOperationsDrawer:lo});function no(d,l){const we=[...d?b.value.filter(Ve=>Ve.toLowerCase().includes(d.toLowerCase())).map(Ve=>({value:Ve})):b.value.map(Ve=>({value:Ve})),{value:"⚙️ 管理模板...",isSettings:!0}];l(we)}function io(d,l){const we=[...d?le.value.filter(Ve=>Ve.toLowerCase().includes(d.toLowerCase())).map(Ve=>({value:Ve})):le.value.map(Ve=>({value:Ve})),{value:"⚙️ 管理模板...",isSettings:!0}];l(we)}function ro(d){d.isSettings?(Wt(),L.value=""):L.value=d.value}function co(d){d.isSettings?(Rt(),B.value=""):B.value=d.value}function uo(d,l){const we=[...d?fe.value.filter(Ve=>Ve.toLowerCase().includes(d.toLowerCase())).map(Ve=>({value:Ve})):fe.value.map(Ve=>({value:Ve})),{value:"⚙️ 管理模板...",isSettings:!0}];l(we)}function fo(d){d.isSettings?(W.value=!0,h.value=""):h.value=d.value}return(d,l)=>{const X=Ge,we=ws,Ve=Vo,Fs=Pt,Ls=Bt,Ie=Ue,$t=Xe,qe=_e,po=Bo,Ot=bt,Vs=Gs,Ct=zt,St=Do,Ps=Dt,ts=Ro,mo=zo,go=rt,vo=Nt;return r(),C(Se,null,[e("div",{class:ge(["card app-card",{"is-pushing":a(o).isPushing}])},[e("div",ri,[e("div",ci,[l[40]||(l[40]=e("h2",null,"提交更改",-1)),a(o).userName!==""&&a(o).userEmail!==""?(r(),q(X,{key:0,icon:a(It),onClick:l[0]||(l[0]=j=>es.value=!0),class:"modern-btn btn-icon-24"},null,8,["icon"])):K("",!0)]),a(o).userName!==""&&a(o).userEmail!==""?(r(),C("div",ui,[t(Mn,{"has-user-commit-message":ye.value,"final-commit-message":Pe.value,"skip-hooks":ce.value,from:"form",onAfterCommit:l[1]||(l[1]=j=>{j&&$()}),onAfterPush:Y,onBeforePush:g,onClearFields:$},null,8,["has-user-commit-message","final-commit-message","skip-hooks"])])):K("",!0)]),e("div",di,[e("div",fi,[a(o).userName===""||a(o).userEmail===""?(r(),C("div",pi,[t(we,{title:"Git用户信息未配置",type:"warning",closable:!1,"show-icon":""},{default:s(()=>l[41]||(l[41]=[e("p",null,"您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:",-1),e("pre",{class:"config-command"},`git config --global user.name "Your Name"
21
- git config --global user.email "your.email@example.com"`,-1)])),_:1})])):(r(),C("div",mi,[t(Cn,{command:nt.value,title:"提交命令预览:",placeholder:'git commit -m "<提交信息>"'},null,8,["command"]),O.value?(r(),C("div",hi,[e("div",yi,[e("div",_i,[t(Ls,{modelValue:te.value,"onUpdate:modelValue":l[3]||(l[3]=j=>te.value=j),placeholder:"提交类型",class:"type-select",clearable:""},{default:s(()=>[(r(),C(Se,null,je(Be,j=>t(Fs,{key:j.value,label:j.label,value:j.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),e("div",bi,[t(Ve,{modelValue:B.value,"onUpdate:modelValue":l[4]||(l[4]=j=>B.value=j),"fetch-suggestions":io,placeholder:"作用域(可选)",class:"scope-input",clearable:"",onSelect:co},null,8,["modelValue"])]),e("div",wi,[t(Ve,{modelValue:L.value,"onUpdate:modelValue":l[5]||(l[5]=j=>L.value=j),"fetch-suggestions":no,placeholder:Me.value,class:"description-input",clearable:"",onSelect:ro,onKeydown:Ts},null,8,["modelValue","placeholder"])])])]),e("div",{class:"advanced-options-toggle",onClick:l[6]||(l[6]=j=>me.value=!me.value)},[e("span",null,P(me.value?"收起":"正文及页脚"),1),t(Ie,{class:ge(["toggle-icon",{"is-active":me.value}])},{default:s(()=>[t(a(ht))]),_:1},8,["class"])]),Ke(e("div",ki,[t($t,{modelValue:Z.value,"onUpdate:modelValue":l[7]||(l[7]=j=>Z.value=j),type:"textarea",rows:4,placeholder:"正文(可选):详细描述本次提交的内容和原因",class:"body-input",clearable:""},null,8,["modelValue"]),t($t,{modelValue:D.value,"onUpdate:modelValue":l[8]||(l[8]=j=>D.value=j),placeholder:"页脚(可选):如 Closes #123",class:"footer-input",clearable:""},null,8,["modelValue"])],512),[[xt,me.value]])])):(r(),C("div",gi,[e("div",vi,[t(Ve,{modelValue:h.value,"onUpdate:modelValue":l[2]||(l[2]=j=>h.value=j),"fetch-suggestions":uo,placeholder:re.value,type:"textarea",rows:3,resize:"none",class:"commit-message-input",onSelect:fo,onKeydown:Ts},null,8,["modelValue","placeholder"])])])),t(ii)]))])])],2),t(po,{modelValue:jt.value,"onUpdate:modelValue":l[11]||(l[11]=j=>jt.value=j),title:"Git 操作",direction:"rtl",size:"362px","with-header":!0,"show-close":!0,"destroy-on-close":!1,class:"git-operations-drawer"},{default:s(()=>[e("div",$i,[e("div",Ci,[e("div",Si,[e("div",Ti,[l[44]||(l[44]=e("div",{class:"group-title"},"基础操作",-1)),e("div",Fi,[t(Ys,{onClick:()=>{},from:"drawer"}),t(Ks,{"has-user-commit-message":ye.value,"final-commit-message":Pe.value,"skip-hooks":ce.value,onBeforeCommit:()=>{},onAfterCommit:l[9]||(l[9]=j=>{j&&$()}),onClick:()=>{},from:"drawer"},null,8,["has-user-commit-message","final-commit-message","skip-hooks"]),t(Qs,{onBeforePush:()=>{},onAfterPush:l[10]||(l[10]=j=>{j&&ft()}),onClick:()=>{},from:"drawer"}),t(qe,{content:Zt.value?`拉取${a(o).branchBehind}个远程提交`:"git pull",placement:"top"},{default:s(()=>[t(X,{type:"primary",icon:a(ps),onClick:qt,loading:a(o).isGitPulling,disabled:!a(o).hasUpstream,class:"action-button",style:_t(a(o).hasUpstream?{color:"white",backgroundColor:"#1e90ff",borderColor:"#1e90ff"}:{})},{default:s(()=>[l[42]||(l[42]=F(" 拉取 ")),Zt.value?(r(),C("span",Li,"("+P(a(o).branchBehind)+")",1)):K("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"]),t(qe,{content:"git fetch --all",placement:"top"},{default:s(()=>[t(X,{type:"info",icon:a(mt),onClick:Yt,loading:a(o).isGitFetching,class:"action-button",style:{color:"white","background-color":"#1e90ff","border-color":"#1e90ff"}},{default:s(()=>l[43]||(l[43]=[F(" 获取所有远程分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",Vi,[l[46]||(l[46]=e("div",{class:"group-title"},"组合操作",-1)),e("div",Pi,[t(qe,{content:"git add + git commit",placement:"top"},{default:s(()=>[t(X,{type:"primary",icon:a(dt),onClick:Kt,loading:a(o).isAddingFiles||a(o).isCommiting,disabled:!Te.value||!ye.value,class:"action-button"},{default:s(()=>l[45]||(l[45]=[F(" 暂存并提交 ")])),_:1},8,["icon","loading","disabled"])]),_:1}),t(qs,{from:"drawer","has-user-commit-message":ye.value,"final-commit-message":Pe.value,"skip-hooks":ce.value,onBeforePush:g,onAfterPush:Y,onClearFields:$},null,8,["has-user-commit-message","final-commit-message","skip-hooks"])])])]),e("div",Bi,[l[49]||(l[49]=e("div",{class:"group-title"},"重置操作",-1)),e("div",xi,[t(qe,{content:Ss.value?`撤销${ze.value}个已暂存文件`:"git reset HEAD",placement:"top"},{default:s(()=>[t(X,{type:"warning",icon:a(vs),onClick:a(o).resetHead,loading:a(o).isResetting,disabled:!Ss.value,class:"action-button reset-button"},{default:s(()=>[l[47]||(l[47]=F(" 重置暂存区 ")),ze.value>0?(r(),C("span",Di,"("+P(ze.value)+")",1)):K("",!0)]),_:1},8,["icon","onClick","loading","disabled"])]),_:1},8,["content"]),t(qe,{content:"git reset --hard origin/branch",placement:"top"},{default:s(()=>[t(X,{type:"danger",icon:a(Mt),onClick:Qt,loading:a(o).isResetting,disabled:!Zs.value,class:"action-button danger-button"},{default:s(()=>l[48]||(l[48]=[F(" 重置到远程 ")])),_:1},8,["icon","loading","disabled"])]),_:1})])]),e("div",zi,[l[51]||(l[51]=e("div",{class:"group-title"},"分支操作",-1)),e("div",Ri,[t(qe,{content:"合并其他分支到当前分支",placement:"top"},{default:s(()=>[t(X,{type:"primary",icon:a(Po),onClick:so,loading:a(o).isGitMerging,class:"action-button merge-button"},{default:s(()=>l[50]||(l[50]=[F(" 合并分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",Ui,[l[54]||(l[54]=e("div",{class:"group-title"},"储藏操作",-1)),e("div",ji,[t(qe,{content:"将工作区更改储藏起来",placement:"top"},{default:s(()=>[t(X,{type:"warning",onClick:Ae,loading:a(o).isSavingStash,disabled:!Ut.value,class:"action-button"},{default:s(()=>l[52]||(l[52]=[F(" 储藏更改 ")])),_:1},8,["loading","disabled"])]),_:1}),t(qe,{content:"查看和管理所有储藏记录",placement:"top"},{default:s(()=>[t(X,{type:"info",onClick:at,class:"action-button"},{default:s(()=>l[53]||(l[53]=[F(" 储藏列表 ")])),_:1})]),_:1})])])])])]),_:1},8,["modelValue"]),t(Ne,{modelValue:U.value,"onUpdate:modelValue":l[14]||(l[14]=j=>U.value=j),title:"编辑配置 JSON",size:"large","height-mode":"fixed","custom-class":"config-editor-dialog","show-footer":!1},{default:s(()=>[e("div",Oi,[e("div",Gi,[t(Ie,{class:"info-icon"},{default:s(()=>[t(a(dt))]),_:1}),l[55]||(l[55]=e("span",{class:"info-text"},"编辑当前项目的配置文件",-1))]),e("div",Ai,[t(Ot,{size:"small",type:"info"},{default:s(()=>l[56]||(l[56]=[F("支持JSON格式")])),_:1})])]),e("div",Mi,[t($t,{modelValue:J.value,"onUpdate:modelValue":l[12]||(l[12]=j=>J.value=j),type:"textarea",spellcheck:"false",autocomplete:"off",placeholder:"在此编辑当前项目配置的 JSON...",class:"json-editor"},null,8,["modelValue"])]),e("div",Ei,[e("div",Ii,[t(X,{icon:a(mt),onClick:ve,class:"system-config-btn"},{default:s(()=>l[57]||(l[57]=[F(" 打开系统配置文件 ")])),_:1},8,["icon"])]),e("div",Ni,[t(X,{onClick:l[13]||(l[13]=j=>U.value=!1)},{default:s(()=>l[58]||(l[58]=[F("取消")])),_:1}),t(X,{type:"primary",loading:I.value,icon:a(vt),onClick:De,class:"save-btn"},{default:s(()=>l[59]||(l[59]=[F(" 保存配置 ")])),_:1},8,["loading","icon"])])])]),_:1},8,["modelValue"]),t(Vs,{modelValue:ae.value,"onUpdate:modelValue":l[18]||(l[18]=j=>ae.value=j),title:"配置文件格式提示",width:"500px","close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":!1},{footer:s(()=>[e("span",Wi,[t(X,{onClick:l[15]||(l[15]=j=>Ee("cancel"))},{default:s(()=>l[60]||(l[60]=[F("取消")])),_:1}),t(X,{type:"info",onClick:l[16]||(l[16]=j=>Ee("open"))},{default:s(()=>l[61]||(l[61]=[F("打开系统配置文件")])),_:1}),t(X,{type:"primary",onClick:l[17]||(l[17]=j=>Ee("continue"))},{default:s(()=>l[62]||(l[62]=[F("继续编辑")])),_:1})])]),default:s(()=>[e("div",Hi,[t(Ie,{class:"warning-icon",color:"#f56c6c",size:"24"},{default:s(()=>[t(a(xs))]),_:1}),e("p",Ji,P(ee.value),1)])]),_:1},8,["modelValue"]),t(is,{visible:p.value,"onUpdate:visible":l[19]||(l[19]=j=>p.value=j),type:"description",title:"简短描述模板设置",placeholder:"输入新模板内容","edit-placeholder":"编辑模板内容","empty-description":"暂无保存的模板",onUseTemplate:Ht},null,8,["visible"]),t(is,{visible:pe.value,"onUpdate:visible":l[20]||(l[20]=j=>pe.value=j),type:"scope",title:"作用域模板设置",placeholder:"输入新作用域模板","edit-placeholder":"编辑作用域模板内容","empty-description":"暂无保存的作用域",onUseTemplate:Jt},null,8,["visible"]),t(is,{visible:W.value,"onUpdate:visible":l[21]||(l[21]=j=>W.value=j),type:"message",title:"默认提交信息设置",placeholder:"输入新模板内容","edit-placeholder":"编辑模板内容","empty-description":"暂无保存的模板","show-default-section":!0,"show-help-text":!0,onUseTemplate:eo,onSetDefault:to},null,8,["visible"]),t(Ne,{modelValue:Fe.value,"onUpdate:modelValue":l[25]||(l[25]=j=>Fe.value=j),title:"储藏更改 (Git Stash)",size:"medium","close-on-click-modal":!1,"show-footer":"","confirm-text":"储藏","cancel-text":"取消","confirm-loading":a(o).isSavingStash,"custom-class":"stash-dialog",onConfirm:wt},{default:s(()=>[e("div",qi,[e("div",Yi,[e("div",Ki,[t(Ie,null,{default:s(()=>[t(a(xo))]),_:1})]),l[63]||(l[63]=e("div",{class:"info-content"},[e("h4",null,"储藏工作区更改"),e("p",null,"将当前工作区的更改临时保存,稍后可以重新应用到任何分支")],-1))]),t(Ps,{"label-position":"top",class:"stash-form"},{default:s(()=>[t(Ct,{label:"储藏说明"},{default:s(()=>[t($t,{modelValue:R.value,"onUpdate:modelValue":l[22]||(l[22]=j=>R.value=j),placeholder:"为这次储藏添加描述信息(可选)",clearable:"",rows:2,type:"textarea",resize:"none",maxlength:"200","show-word-limit":""},null,8,["modelValue"])]),_:1}),e("div",Qi,[e("h5",Xi,[t(Ie,null,{default:s(()=>[t(a(It))]),_:1}),l[64]||(l[64]=F(" 储藏选项 "))]),e("div",Zi,[t(St,{modelValue:A.value,"onUpdate:modelValue":l[23]||(l[23]=j=>A.value=j),size:"large"},{default:s(()=>l[65]||(l[65]=[e("span",{class:"option-label"},"包含未跟踪文件",-1)])),_:1},8,["modelValue"]),l[66]||(l[66]=e("p",{class:"option-desc"},"同时储藏新建但未添加到Git的文件 (--include-untracked)",-1))]),e("div",er,[t(St,{modelValue:y.value,"onUpdate:modelValue":l[24]||(l[24]=j=>y.value=j),disabled:Xt.value,size:"large"},{default:s(()=>l[67]||(l[67]=[e("span",{class:"option-label"},"排除锁定文件",-1)])),_:1},8,["modelValue","disabled"]),e("p",{class:ge(["option-desc",{disabled:Xt.value}])}," 不储藏被锁定的文件,保持其当前状态 ",2)])]),a(o).status.staged.length>0||a(o).status.unstaged.length>0?(r(),C("div",tr,[e("h5",sr,[t(Ie,null,{default:s(()=>[t(a(ys))]),_:1}),l[68]||(l[68]=F(" 将要储藏的文件 "))]),e("div",or,[a(o).status.staged.length>0?(r(),q(Ot,{key:0,type:"success"},{default:s(()=>[F(" 已暂存: "+P(a(o).status.staged.length)+" 个文件 ",1)]),_:1})):K("",!0),a(o).status.unstaged.length>0?(r(),q(Ot,{key:1,type:"warning"},{default:s(()=>[F(" 未暂存: "+P(a(o).status.unstaged.length)+" 个文件 ",1)]),_:1})):K("",!0)])])):K("",!0)]),_:1})])]),_:1},8,["modelValue","confirm-loading"]),t(Vs,{title:"合并分支",modelValue:_.value,"onUpdate:modelValue":l[33]||(l[33]=j=>_.value=j),width:"500px","close-on-click-modal":!1,class:"merge-dialog"},{footer:s(()=>[e("div",ir,[t(X,{onClick:l[32]||(l[32]=j=>_.value=!1)},{default:s(()=>l[75]||(l[75]=[F("取消")])),_:1}),t(X,{type:"primary",onClick:ao,loading:a(o).isGitMerging,disabled:!V.value,class:"merge-confirm-btn"},{default:s(()=>l[76]||(l[76]=[F(" 合并 ")])),_:1},8,["loading","disabled"])])]),default:s(()=>[e("div",ar,[e("p",lr,"选择要合并到当前分支 ("+P(a(o).currentBranch)+") 的分支:",1),t(Ps,{"label-position":"top"},{default:s(()=>[t(Ct,{label:"分支类型"},{default:s(()=>[t(mo,{modelValue:pt.value,"onUpdate:modelValue":l[26]||(l[26]=j=>pt.value=j),size:"small"},{default:s(()=>[t(ts,{label:"all"},{default:s(()=>l[69]||(l[69]=[F("所有分支")])),_:1}),t(ts,{label:"local"},{default:s(()=>l[70]||(l[70]=[F("本地分支")])),_:1}),t(ts,{label:"remote"},{default:s(()=>l[71]||(l[71]=[F("远程分支")])),_:1})]),_:1},8,["modelValue"])]),_:1}),t(Ct,{label:"选择分支"},{default:s(()=>[t(Ls,{modelValue:V.value,"onUpdate:modelValue":l[27]||(l[27]=j=>V.value=j),placeholder:"选择要合并的分支",style:{width:"100%"},filterable:""},{default:s(()=>[(r(!0),C(Se,null,je(oo.value,j=>(r(),q(Fs,{key:j,label:j,value:j},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(Ct,{label:"合并选项"},{default:s(()=>[e("div",nr,[t(St,{modelValue:N.value.noFf,"onUpdate:modelValue":l[28]||(l[28]=j=>N.value.noFf=j)},{default:s(()=>[t(qe,{content:"创建合并提交,即使可以使用快进合并",placement:"top"},{default:s(()=>l[72]||(l[72]=[e("span",null,"禁用快进合并 (--no-ff)",-1)])),_:1})]),_:1},8,["modelValue"]),t(St,{modelValue:N.value.squash,"onUpdate:modelValue":l[29]||(l[29]=j=>N.value.squash=j)},{default:s(()=>[t(qe,{content:"将多个提交压缩为一个提交",placement:"top"},{default:s(()=>l[73]||(l[73]=[e("span",null,"压缩提交 (--squash)",-1)])),_:1})]),_:1},8,["modelValue"]),t(St,{modelValue:N.value.noCommit,"onUpdate:modelValue":l[30]||(l[30]=j=>N.value.noCommit=j)},{default:s(()=>[t(qe,{content:"执行合并但不自动创建提交",placement:"top"},{default:s(()=>l[74]||(l[74]=[e("span",null,"不自动提交 (--no-commit)",-1)])),_:1})]),_:1},8,["modelValue"])])]),_:1}),N.value.noFf&&!N.value.noCommit?(r(),q(Ct,{key:0,label:"合并提交信息 (可选)"},{default:s(()=>[t($t,{modelValue:N.value.message,"onUpdate:modelValue":l[31]||(l[31]=j=>N.value.message=j),type:"textarea",rows:3,placeholder:"输入自定义合并提交信息"},null,8,["modelValue"])]),_:1})):K("",!0)]),_:1})])]),_:1},8,["modelValue"]),t(Ne,{modelValue:x.value,"onUpdate:modelValue":l[34]||(l[34]=j=>x.value=j),title:"储藏列表 (Git Stash)",size:"large","show-footer":!1,"custom-class":"stash-list-dialog"},{default:s(()=>[e("div",rr,[a(o).isLoadingStashes?K("",!0):(r(),C("div",cr,[e("div",ur,[e("div",dr,[t(Ie,{class:"stat-icon"},{default:s(()=>[t(a(mt))]),_:1}),e("span",fr,P(a(o).stashes.length),1),l[77]||(l[77]=e("span",{class:"stat-label"},"个储藏",-1))])]),a(o).stashes.length>0?(r(),C("div",pr,[t(X,{type:"danger",size:"small",icon:a(Mt),onClick:kt,loading:a(o).isDroppingStash,class:"clear-all-btn"},{default:s(()=>l[78]||(l[78]=[F(" 清空所有储藏 ")])),_:1},8,["icon","loading"])])):K("",!0)])),Ke((r(),C("div",mr,[a(o).stashes.length===0&&!a(o).isLoadingStashes?(r(),C("div",gr,[t(go,{description:"暂无储藏记录","image-size":120},{image:s(()=>[t(Ie,{class:"empty-icon"},{default:s(()=>[t(a(mt))]),_:1})]),description:s(()=>l[79]||(l[79]=[e("p",{class:"empty-text"},"还没有任何储藏记录",-1),e("p",{class:"empty-hint"},"使用 git stash 可以临时保存工作进度",-1)])),_:1})])):(r(),C("div",vr,[(r(!0),C(Se,null,je(a(o).stashes,(j,Bs)=>(r(),C("div",{key:j.id,class:ge(["stash-card",{"stash-card-latest":Bs===0}])},[e("div",hr,[e("div",yr,[e("div",_r,[e("div",br,[t(Ie,{class:"badge-icon"},{default:s(()=>[t(a(mt))]),_:1}),e("span",wr,P(j.id),1),Bs===0?(r(),q(Ot,{key:0,size:"small",type:"success",class:"latest-tag"},{default:s(()=>l[80]||(l[80]=[F("最新")])),_:1})):K("",!0)]),e("div",kr,[e("span",$r,P(j.description),1)])])]),e("div",Cr,[t(X,{size:"small",type:"info",icon:a(dt),onClick:ss=>Le(j),loading:de.value,class:"action-btn view-btn"},{default:s(()=>l[81]||(l[81]=[F(" 查看 ")])),_:2},1032,["icon","onClick","loading"]),t(X,{size:"small",type:"success",icon:a(ps),onClick:ss=>et(j.id,!1),loading:a(o).isApplyingStash,class:"action-btn apply-btn"},{default:s(()=>l[82]||(l[82]=[F(" 应用 ")])),_:2},1032,["icon","onClick","loading"]),t(X,{size:"small",type:"primary",icon:a(vt),onClick:ss=>et(j.id,!0),loading:a(o).isApplyingStash,class:"action-btn apply-pop-btn"},{default:s(()=>l[83]||(l[83]=[F(" 应用并删除 ")])),_:2},1032,["icon","onClick","loading"]),t(X,{size:"small",type:"danger",icon:a(Mt),onClick:ss=>Qe(j.id),loading:a(o).isDroppingStash,class:"action-btn delete-btn"},{default:s(()=>l[84]||(l[84]=[F(" 删除 ")])),_:2},1032,["icon","onClick","loading"])])])],2))),128))]))])),[[vo,a(o).isLoadingStashes]])])]),_:1},8,["modelValue"]),t(Ne,{modelValue:se.value,"onUpdate:modelValue":l[35]||(l[35]=j=>se.value=j),title:"储藏详情","custom-class":"stash-detail-dialog",size:"extra-large",type:"flex",heightMode:"fixed","close-on-click-modal":!1},{default:s(()=>[e("div",Sr,[ie.value?(r(),C("div",Tr,[e("div",Fr,[l[85]||(l[85]=e("span",{class:"info-label"},"Stash ID:",-1)),e("code",Lr,P(ie.value.id),1)]),e("div",Vr,[l[86]||(l[86]=e("span",{class:"info-label"},"描述:",-1)),e("span",Pr,P(ie.value.description),1)])])):K("",!0),e("div",Br,[t(ks,{files:tt.value,diffContent:be.value,selectedFile:ke.value,context:"stash-detail",emptyText:"该stash没有变更文件",onFileSelect:M,onOpenFile:S,onOpenWithVscode:ne},null,8,["files","diffContent","selectedFile"])])])]),_:1},8,["modelValue"]),t(Vt,{name:"el-fade-in-linear"},{default:s(()=>[T.value?(r(),C("div",xr,[t(Ie,{class:"is-loading"},{default:s(()=>[t(a(Lt))]),_:1}),l[87]||(l[87]=e("span",null,"更新状态中...",-1))])):K("",!0)]),_:1}),t(Yl,{visible:a(u).visible,text:a(u).text,"show-progress":a(u).showProgress,progress:a(u).progress},null,8,["visible","text","show-progress","progress"]),t(en,{visible:a(w).visible,text:a(w).text,description:a(w).description},null,8,["visible","text","description"]),t(Ne,{modelValue:es.value,"onUpdate:modelValue":l[39]||(l[39]=j=>es.value=j),title:"提交设置",size:"medium","show-footer":!1,"custom-class":"commit-settings-dialog"},{default:s(()=>[e("div",Dr,[t(rs,{modelValue:O.value,"onUpdate:modelValue":l[36]||(l[36]=j=>O.value=j),title:"提交模式",tooltip:"选择传统或标准化提交格式","active-text":"标准化","inactive-text":"普通","active-color":"#409eff"},{icon:s(()=>[t(Ie,null,{default:s(()=>[t(a(dt))]),_:1})]),_:1},8,["modelValue"]),t(rs,{modelValue:ce.value,"onUpdate:modelValue":l[37]||(l[37]=j=>ce.value=j),title:"跳过钩子检查",tooltip:"添加 --no-verify 参数","active-color":"#f56c6c","icon-class":"warning"},{icon:s(()=>[t(Ie,null,{default:s(()=>[t(a(xs))]),_:1})]),_:1},8,["modelValue"]),t(rs,{modelValue:ue.value,"onUpdate:modelValue":l[38]||(l[38]=j=>ue.value=j),title:"回车自动提交",tooltip:"输入提交信息后按回车直接执行一键推送","active-color":"#67c23a","icon-class":"success"},{icon:s(()=>[t(Ie,null,{default:s(()=>[t(a(vt))]),_:1})]),_:1},8,["modelValue"])])]),_:1},8,["modelValue"])],64)}}}),Rr=Ce(zr,[["__scopeId","data-v-1c8e05ac"]]),Ur={class:"log-header"},jr={class:"log-actions"},Or={key:0,class:"filter-panel-header"},Gr={class:"filter-form"},Ar={class:"filter-item"},Mr={class:"filter-item"},Er={class:"filter-item"},Ir={class:"filter-item"},Nr={class:"filter-actions"},Hr={key:0},Jr={key:1,class:"content-area-content"},Wr={class:"table-view-container"},qr=["onClick"],Yr={class:"commit-message-cell"},Kr={class:"message-content"},Qr={key:0,class:"branch-container"},Xr={class:"message-text"},Zr={class:"author-name"},ec={class:"commit-detail-container"},tc={key:0,class:"commit-info"},sc={class:"commit-info-row"},oc={class:"info-item date-item"},ac={class:"info-value"},lc={class:"info-item message-item"},nc=["innerHTML"],ic=$e({__name:"LogList",setup(E,{expose:v}){const o=Je();let i=[];const h=c(i),u=c(""),z=c(!1),m=Q(()=>o.isLoadingLog||z.value),k=c(!1),w=c(!1),H=c(null),T=c(!1),f=c(null),G=c([]),O=c(""),te=c(!1),B=c(""),L=c(!1),Z=c([]),D=c(""),U=c(null),J=c([]),I=c([]),ae=c([]),ee=c(!1),b=c(0),p=c(0),_=c(null),V=c(null),N=Q(()=>h.value),le=Q(()=>G.value.map(M=>({path:M,name:M.split("/").pop()||M})));async function pe(M=!1,S=1){const ne=Je();if(!ne.isGitRepo){u.value="当前目录不是Git仓库";return}try{S>1?w.value=!0:z.value=!0;const fe=new URLSearchParams;fe.append("page",S.toString()),fe.append("all",M.toString()),fe.append("with_parents","true"),Z.value.length>0&&fe.append("author",Z.value.join(",")),I.value.length>0&&fe.append("branch",I.value.join(",")),D.value&&fe.append("message",D.value),U.value&&Array.isArray(U.value)&&U.value.length===2&&(fe.append("dateFrom",U.value[0]),fe.append("dateTo",U.value[1])),fe.append("_t",Date.now().toString());const ye=await(await fetch(`/api/log?${fe.toString()}`)).json();if(!ye||!ye.data||!Array.isArray(ye.data)){u.value="加载提交历史失败: 服务器返回数据格式不正确";return}const re=S>1;re?ye.data.forEach(Me=>i.push(Me)):(i.length=0,ye.data.forEach(Me=>i.push(Me))),h.value=[...i],ne.currentPage=S,ne.totalCommits=ye.total||i.length,ne.hasMoreData=ye.hasMore===!0,!re&&!M&&Tt(()=>{Fe(),setTimeout(kt,200)}),u.value=""}catch(fe){u.value="加载提交历史失败: "+(fe instanceof Error?fe.message:String(fe)),S>1&&(ne.hasMoreData=!1)}finally{S>1?w.value=!1:z.value=!1}}function W(M){return M.includes("HEAD -> ")?M.replace("HEAD -> ",""):M.includes("origin/")?M:M.trim()}function ce(M){return M.includes("HEAD")?"success":M.includes("origin/")?"warning":"info"}const ue=c(null),me=c(null);function Be(M){if(!o.hasMoreData||w.value||m.value)return;const S=M.target,{scrollTop:ne,scrollHeight:fe,clientHeight:Pe}=S;fe-ne-Pe<=20&&ke()}function Fe(){if(!ue.value)return;const M=ue.value.$el.querySelector(".el-table__body-wrapper");M&&(me.value=M,me.value&&(me.value.removeEventListener("scroll",Be,!0),me.value.addEventListener("scroll",Be,!0)))}function x(){me.value&&(me.value.removeEventListener("scroll",Be,!0),me.value=null)}function R(M){M.key==="Escape"&&Le.value&&(Le.value=!1)}ot(()=>{o.isGitRepo?(o.log.length>0?(i.length=0,o.log.forEach(M=>i.push(M)),o.totalCommits=o.log.length):pe(),De()):u.value="当前目录不是Git仓库",Tt(()=>{setTimeout(()=>{Fe()},500)}),Re(()=>ue.value,M=>{M&&!k.value&&Tt(()=>{Fe()})}),window.addEventListener("keydown",R)}),Re(()=>o.allBranches,M=>{M&&M.length>0?ae.value=[...M].sort():ae.value=[]},{immediate:!0}),Uo(()=>{x(),H.value!==null&&(window.clearInterval(H.value),H.value=null),window.removeEventListener("keydown",R)});async function A(){o.currentPage=1,o.hasMoreData=!0,await pe(k.value,1),Tt(()=>{if(ue.value){const M=ue.value.$el.querySelector(".el-scrollbar__wrap");M&&(M.scrollTop=0)}})}Re(()=>o.log,M=>{try{i.length=0,Array.isArray(M)&&M.forEach(S=>S&&i.push(S)),o.totalCommits=i.length,o.currentPage=1,o.hasMoreData=!1,h.value=[...i]}catch{}},{immediate:!0}),v({refreshLog:A});async function y(M){if(M){f.value=M,T.value=!0,te.value=!0,G.value=[],O.value="",B.value="";try{if(!M.hash||M.hash.length<7){O.value="无效的提交哈希值",te.value=!1;return}const ne=await(await fetch(`/api/commit-files?hash=${M.hash}`)).json();ne.success&&Array.isArray(ne.files)?(G.value=ne.files,G.value.length>0?await se(M.hash,G.value[0]):O.value="该提交没有变更文件"):O.value=`获取文件列表失败: ${ne.error||"未知错误"}`}catch(S){O.value=`获取提交详情失败: ${S.message}`}finally{te.value=!1}}}async function se(M,S){te.value=!0,B.value=S;try{const fe=await(await fetch(`/api/commit-file-diff?hash=${M}&file=${encodeURIComponent(S)}`)).json();fe.success?O.value=fe.diff||"没有变更内容":O.value=`获取差异失败: ${fe.error||"未知错误"}`}catch(ne){O.value=`获取差异失败: ${ne.message}`}finally{te.value=!1}}function ie(M){f.value&&se(f.value.hash,M)}async function he(M,S){try{const fe=await(await fetch("/api/open-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:M,context:S})})).json();fe.success?n.success(fe.message):n.error(fe.error||"打开文件失败")}catch(ne){n.error(`打开文件失败: ${ne.message}`)}}async function be(M,S){try{const fe=await(await fetch("/api/open-with-vscode",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:M,context:S})})).json();fe.success?n.success(fe.message):n.error(fe.error||"用VSCode打开文件失败")}catch(ne){n.error(`用VSCode打开文件失败: ${ne.message}`)}}async function de(M){try{const S=aa(M);await navigator.clipboard.writeText(S),n.success("提交信息已复制到剪贴板")}catch{n.error("复制失败")}}function ke(){!o.hasMoreData||w.value||m.value||pe(k.value,o.currentPage+1)}function Ae(){Z.value=[],I.value=[],D.value="",U.value=null,o.currentPage=1,pe(k.value,1)}function xe(){o.currentPage=1,pe(k.value,1)}async function De(){try{const S=await(await fetch("/api/authors")).json();S.success&&Array.isArray(S.authors)?J.value=S.authors.sort():ve()}catch{ve()}}function ve(){const M=new Set;h.value.forEach(S=>{S.author&&M.add(S.author)}),J.value=Array.from(M).sort()}Re(()=>h.value,()=>{},{deep:!0});function Ee(M,S,ne){ne.preventDefault(),b.value=ne.clientY,p.value=ne.clientX,_.value=M,ee.value=!0,Tt(()=>{const Pe=V.value;if(Pe){const ye=Pe.getBoundingClientRect(),re=window.innerWidth,Me=window.innerHeight,tt=8;let nt=ne.clientX,it=ne.clientY;nt+ye.width>re&&(nt=Math.max(tt,ne.clientX-ye.width)),it+ye.height>Me&&(it=Math.max(tt,ne.clientY-ye.height)),p.value=nt,b.value=it}});const fe=()=>{ee.value=!1,document.removeEventListener("click",fe)};setTimeout(()=>{document.addEventListener("click",fe)},0)}async function at(M){if(M)try{await He.confirm(`确定要撤销提交 ${M.hash.substring(0,7)} 吗?这将创建一个新的提交来撤销这次提交的更改。`,"撤销提交确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const ne=await(await fetch("/api/revert-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:M.hash})})).json();ne.success?(n.success(ne.message||"已成功撤销提交"),A(),o.fetchStatus(),o.getBranchStatus()):n.error(ne.error||"撤销提交失败")}catch(S){S!=="cancel"&&n.error("撤销提交失败: "+(S.message||S))}}async function wt(M){if(M)try{await He.confirm(`确定要将提交 ${M.hash.substring(0,7)} Cherry-Pick 到当前分支吗?`,"Cherry-Pick确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const ne=await(await fetch("/api/cherry-pick-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:M.hash})})).json();ne.success?(n.success(ne.message||"已成功Cherry-Pick提交"),A(),o.fetchStatus(),o.getBranchStatus()):n.error(ne.error||"Cherry-Pick提交失败")}catch(S){S!=="cancel"&&n.error("Cherry-Pick提交失败: "+(S.message||S))}}async function et(M){if(M)try{await navigator.clipboard.writeText(M.hash),n.success(`已复制提交哈希: ${M.hash.substring(0,7)}`)}catch(S){n.error(`复制提交哈希失败: ${S.message}`)}}async function Qe(M){if(M)try{await He.confirm(`确定要将当前分支重置(hard)到提交 ${M.hash.substring(0,7)} 吗?
22
-
23
- 警告:这将丢失该提交之后的所有更改!`,"重置确认",{confirmButtonText:"确认重置",cancelButtonText:"取消",type:"warning",dangerouslyUseHTMLString:!0});const ne=await(await fetch("/api/reset-to-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:M.hash})})).json();ne.success?(n.success(ne.message||"已成功重置到指定提交"),A(),o.fetchStatus(),o.getBranchStatus()):n.error(ne.error||"重置到指定提交失败")}catch(S){S!=="cancel"&&n.error("重置到指定提交失败: "+(S.message||S))}}function kt(){if(!o.hasMoreData||w.value||m.value||k.value)return;if(!me.value){Fe();return}const{scrollTop:M,scrollHeight:S,clientHeight:ne}=me.value;S-M-ne<=50&&ke()}const Le=c(!1);function lt(){Le.value=!Le.value}return(M,S)=>{var ye;const ne=Ue,fe=_e,Pe=Nt;return r(),C(Se,null,[e("div",{class:ge(["card",{"fullscreen-mode":Le.value}])},[e("div",Ur,[S[13]||(S[13]=e("div",{class:"header-left"},[e("h2",null,"提交历史")],-1)),e("div",jr,[e("button",{onClick:S[0]||(S[0]=re=>L.value=!L.value),class:ge(["modern-btn btn-icon-32 action-button filter-button",{"active-filter":L.value}])},[t(ne,{class:"btn-icon"},{default:s(()=>[t(a(jo))]),_:1})],2),e("button",{onClick:lt,class:ge(["modern-btn btn-icon-32 action-button fullscreen-button",{"active-fullscreen":Le.value}])},[t(ne,{class:"btn-icon"},{default:s(()=>[(r(),q(us(Le.value?a(gs):a(Ns))))]),_:1})],2),e("button",{onClick:S[1]||(S[1]=re=>A()),class:"modern-btn btn-icon-32 action-button refresh-button"},[t(a(vs))])])]),L.value?(r(),C("div",Or,[e("div",Gr,[e("div",Ar,[t(a(Bt),{modelValue:Z.value,"onUpdate:modelValue":S[2]||(S[2]=re=>Z.value=re),placeholder:"选择作者",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:s(()=>S[14]||(S[14]=[e("span",{class:"compact-label"},"作者",-1)])),default:s(()=>[(r(!0),C(Se,null,je(J.value,re=>(r(),q(a(Pt),{key:re,label:re,value:re},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Mr,[t(a(Bt),{modelValue:I.value,"onUpdate:modelValue":S[3]||(S[3]=re=>I.value=re),placeholder:"选择分支",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:s(()=>S[15]||(S[15]=[e("span",{class:"compact-label"},"分支",-1)])),default:s(()=>[(r(!0),C(Se,null,je(ae.value,re=>(r(),q(a(Pt),{key:re,label:re,value:re},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Er,[t(a(Xe),{modelValue:D.value,"onUpdate:modelValue":S[4]||(S[4]=re=>D.value=re),placeholder:"提交信息关键词",clearable:"",class:"filter-input",size:"small"},{prefix:s(()=>S[16]||(S[16]=[e("span",{class:"compact-label"},"信息",-1)])),_:1},8,["modelValue"])]),e("div",Ir,[t(a(Oo),{modelValue:U.value,"onUpdate:modelValue":S[5]||(S[5]=re=>U.value=re),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",format:"YYYY-MM-DD","value-format":"YYYY-MM-DD",class:"filter-input date-range",size:"small"},{prefix:s(()=>S[17]||(S[17]=[e("span",{class:"compact-label"},"日期",-1)])),_:1},8,["modelValue"])]),e("div",Nr,[t(a(Ge),{type:"primary",size:"small",onClick:xe,class:"filter-action-button"},{default:s(()=>S[18]||(S[18]=[F("应用")])),_:1}),t(a(Ge),{type:"info",size:"small",onClick:Ae,class:"filter-action-button"},{default:s(()=>S[19]||(S[19]=[F("重置")])),_:1})])])])):K("",!0),e("div",{class:ge(["content-area",{"with-filter":L.value}])},[u.value?(r(),C("div",Hr,P(u.value),1)):(r(),C("div",Jr,[e("div",Wr,[Ke((r(),q(a(Go),{ref_key:"tableRef",ref:ue,data:N.value,stripe:"",border:"",class:"log-table","empty-text":m.value?"加载中...":"没有匹配的提交记录",height:"450",onRowContextmenu:Ee,onRowClick:S[6]||(S[6]=re=>y(re))},{default:s(()=>[t(a(At),{label:"哈希",width:"80",resizable:""},{default:s(re=>[e("span",{class:"commit-hash",onClick:Me=>y(re.row)},P(re.row.hash.substring(0,6)),9,qr)]),_:1}),t(a(At),{label:"提交信息","min-width":"300"},{default:s(re=>[e("div",Yr,[e("div",Kr,[re.row.branch?(r(),C("div",Qr,[(r(!0),C(Se,null,je(re.row.branch.split(","),(Me,tt)=>(r(),q(a(bt),{key:tt,size:"small",type:ce(Me),class:"branch-tag"},{default:s(()=>[F(P(W(Me)),1)]),_:2},1032,["type"]))),128))])):K("",!0),e("span",Xr,P(re.row.message),1),t(a(Ge),{type:"text",icon:a(gt),size:"small",onClick:yt(Me=>de(re.row.message),["stop"]),class:"copy-message-btn",title:"复制纯净提交信息(不含类型前缀)"},null,8,["icon","onClick"])])])]),_:1}),t(a(At),{prop:"date",label:"日期",width:"150",resizable:""}),t(a(At),{label:"作者",width:"100",resizable:""},{default:s(re=>[t(fe,{content:re.row.email,placement:"top","show-after":200},{default:s(()=>[e("span",Zr,P(re.row.author),1)]),_:2},1032,["content"])]),_:1})]),_:1},8,["data","empty-text"])),[[Pe,m.value]])])]))],2),t(Ne,{modelValue:T.value,"onUpdate:modelValue":S[7]||(S[7]=re=>T.value=re),title:`提交详情: ${(ye=f.value)!=null&&ye.hash?f.value.hash.substring(0,7):"未知"}`,size:"extra-large",type:"flex",heightMode:"fixed","destroy-on-close":"","custom-class":"commit-detail-dialog"},{default:s(()=>[Ke((r(),C("div",ec,[f.value?(r(),C("div",tc,[e("div",sc,[e("div",oc,[S[20]||(S[20]=e("span",{class:"info-label"},"日期",-1)),e("span",ac,P(f.value.date),1)]),e("div",lc,[S[21]||(S[21]=e("span",{class:"info-label"},"提交信息",-1)),e("div",{class:"info-message",innerHTML:a(oa)(f.value.message).replace(/\n/g,"<br>")},null,8,nc)])])])):K("",!0),t(ks,{files:le.value,loading:te.value,diffContent:O.value,selectedFile:B.value,context:"commit-detail",emptyText:"没有找到变更文件",onFileSelect:ie,onOpenFile:he,onOpenWithVscode:be},null,8,["files","loading","diffContent","selectedFile"])])),[[Pe,te.value]])]),_:1},8,["modelValue","title"])],2),Ke(e("div",{class:ge(["context-menu",{"fullscreen-context-menu":Le.value}]),style:_t({top:b.value+"px",left:p.value+"px"}),ref_key:"contextMenuRef",ref:V},[e("div",{class:"context-menu-item",onClick:S[8]||(S[8]=re=>y(_.value))},S[22]||(S[22]=[e("i",{class:"el-icon-view"},null,-1),F(" 查看详情 ")])),e("div",{class:"context-menu-item",onClick:S[9]||(S[9]=re=>et(_.value))},S[23]||(S[23]=[e("i",{class:"el-icon-document-copy"},null,-1),F(" 复制提交哈希 ")])),e("div",{class:"context-menu-item",onClick:S[10]||(S[10]=re=>Qe(_.value))},S[24]||(S[24]=[e("i",{class:"el-icon-refresh-right"},null,-1),F(" 重置到该提交(hard) ")])),e("div",{class:"context-menu-item",onClick:S[11]||(S[11]=re=>at(_.value))},S[25]||(S[25]=[e("i",{class:"el-icon-delete"},null,-1),F(" 撤销提交 (Revert) ")])),e("div",{class:"context-menu-item",onClick:S[12]||(S[12]=re=>wt(_.value))},S[26]||(S[26]=[e("i",{class:"el-icon-edit"},null,-1),F(" Cherry-Pick 到当前分支 ")]))],6),[[xt,ee.value]])],64)}}}),rc=Ce(ic,[["__scopeId","data-v-3fb471fc"]]),cc={class:"dialog-toolbar"},uc=["disabled"],dc=["disabled"],fc=["disabled"],pc={class:"history-scroll"},mc={key:0,class:"loading-state"},gc={key:2,class:"history-list"},vc=["onClick"],hc={class:"command-info"},yc={class:"command-text"},_c={class:"command-meta"},bc={class:"timestamp"},wc={class:"duration"},kc={class:"item-actions"},$c=["onClick"],Cc=["onClick"],Sc={key:0,class:"item-details"},Tc={key:0,class:"output-section"},Fc={class:"output-header"},Lc=["onClick"],Vc={class:"output-content"},Pc={key:0,class:"truncation-notice"},Bc={class:"output-header"},xc={class:"output-content"},Dc={key:0,class:"truncation-notice"},zc={key:2,class:"output-section error"},Rc={class:"output-content"},Uc=$e({__name:"CommandHistory",setup(E){const v=Je(),o=c([]),i=c(!1),h=c(!1),u=c(!1),z=c(!1),m=c(new Set),k=c(!1),w=c(!1);function H(){w.value=!0,o.value.length===0&&T()}async function T(){try{if(i.value=!0,v.socket&&v.socket.connected)v.socket.emit("request_full_history");else{const p=await(await fetch("/api/command-history")).json();p.success?o.value=p.history:n.error(`加载命令历史失败: ${p.error}`)}}catch(b){n.error(`加载命令历史失败: ${b.message}`)}finally{i.value=!1}}async function f(){if(o.value.length===0){n.warning("没有可复制的命令历史");return}try{u.value=!0;const b=o.value.map(p=>{let _=`# ${te(p.timestamp)} (耗时: ${B(p.executionTime)}) - ${p.success?"成功":"失败"}
24
- `;if(_+=`${p.command}
25
- `,p.stdout&&(_+=`
26
- # 输出:
27
- ${p.stdout}
28
- `),p.stderr){const V=J(p.command)?"输出信息":"错误输出";_+=`
29
- # ${V}:
30
- ${p.stderr}
31
- `}return p.error&&(_+=`
32
- # 错误信息:
33
- ${p.error}
34
- `),_}).join(`
35
- ---
36
-
37
- `);await navigator.clipboard.writeText(b),n({message:"命令历史已复制到剪贴板",type:"success",zIndex:1e5})}catch(b){n.error(`复制失败: ${b.message}`)}finally{u.value=!1}}async function G(){if(o.value.length===0){n.warning("没有可复制的命令");return}try{k.value=!0;const b=o.value.map(p=>p.command).join(`
38
- `);await navigator.clipboard.writeText(b),n({message:"命令列表已复制到剪贴板",type:"success",zIndex:1e5})}catch(b){n.error(`复制失败: ${b.message}`)}finally{k.value=!1}}async function O(){try{if(await He.confirm("确定要清空所有命令历史记录吗?此操作不可恢复。","清空命令历史",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),h.value=!0,v.socket&&v.socket.connected)v.socket.emit("clear_command_history");else{const p=await(await fetch("/api/clear-command-history",{method:"POST",headers:{"Content-Type":"application/json"}})).json();p.success?(o.value=[],n.success("命令历史已清空")):n.error(`清空命令历史失败: ${p.error}`)}}catch(b){b!=="cancel"&&b.toString()!=="Error: cancel"&&n.error(`清空命令历史失败: ${b.message}`)}finally{h.value=!1}}function te(b){return new Date(b).toLocaleString()}function B(b){return b<1e3?`${b}ms`:`${(b/1e3).toFixed(2)}s`}function L(b){m.value.has(b)?m.value.delete(b):m.value.add(b)}function Z(b){return m.value.has(b)}async function D(b){try{await navigator.clipboard.writeText(b),n({message:"命令已复制到剪贴板",type:"success",zIndex:1e5})}catch(p){n.error(`复制失败: ${p.message}`)}}function U(b){return b.includes("git push")||b.includes("git-push")}function J(b){return!!U(b)}async function I(b){try{let p="";if(b.stdout&&(p+=`标准输出:
39
- ${b.stdout}
40
-
41
- `),b.stderr){const _=J(b.command)?"输出信息":"错误输出";p+=`${_}:
42
- ${b.stderr}
43
-
44
- `}b.error&&(p+=`错误信息:
45
- ${b.error}`),await navigator.clipboard.writeText(p.trim()),n({message:"输出已复制到剪贴板",type:"success",zIndex:1e5})}catch(p){n.error(`复制失败: ${p.message}`)}}function ae(){if(!v.socket){console.error("Socket实例不可用");return}v.socket.on("initial_command_history",b=>{o.value=b.history,z.value=!0}),v.socket.on("command_history_update",b=>{o.value.unshift(b.newCommand),o.value.length>100&&o.value.pop(),z.value=!0}),v.socket.on("full_command_history",b=>{o.value=b.history,i.value=!1,z.value=!0}),v.socket.on("command_history_cleared",b=>{b.success&&(o.value=[],n.success("命令历史已清空")),h.value=!1}),v.socket.on("connect",()=>{z.value=!0,n.success("已连接到实时命令历史")}),v.socket.on("disconnect",()=>{z.value=!1,n.warning("实时命令历史连接已断开")})}function ee(){v.socket&&(v.socket.off("initial_command_history"),v.socket.off("command_history_update"),v.socket.off("full_command_history"),v.socket.off("command_history_cleared"))}return ot(()=>{ae(),v.socket||(console.log("尝试初始化Socket连接"),v.initSocketConnection())}),js(()=>{ee()}),(b,p)=>{const _=Ue,V=_e,N=bt,le=rt,pe=ws;return r(),C(Se,null,[t(V,{content:"查看Git命令历史",placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn btn-icon-36",onClick:H},[t(_,{class:"btn-icon"},{default:s(()=>[t(a(As))]),_:1})])]),_:1}),t(Ne,{modelValue:w.value,"onUpdate:modelValue":p[0]||(p[0]=W=>w.value=W),title:"Git 命令历史","destroy-on-close":"","custom-class":"command-history-dialog","append-to-body":!0},{default:s(()=>[e("div",cc,[t(N,{type:z.value?"success":"danger",size:"small",effect:"dark",class:"socket-status"},{default:s(()=>[F(P(z.value?"实时更新":"未连接"),1)]),_:1},8,["type"]),t(V,{content:"只复制命令列表(不含输出)",placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn copy-commands-button enhanced-btn",onClick:G,disabled:o.value.length===0||k.value},[k.value?(r(),q(_,{key:1,class:"btn-icon is-loading"},{default:s(()=>[t(a(Lt))]),_:1})):(r(),q(_,{key:0,class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})),p[1]||(p[1]=e("span",{class:"btn-text"},"命令",-1))],8,uc)]),_:1}),t(V,{content:"复制完整命令历史(含输出)",placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn copy-all-button enhanced-btn",onClick:f,disabled:o.value.length===0||u.value},[u.value?(r(),q(_,{key:1,class:"btn-icon is-loading"},{default:s(()=>[t(a(Lt))]),_:1})):(r(),q(_,{key:0,class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})),p[2]||(p[2]=e("span",{class:"btn-text"},"全部",-1))],8,dc)]),_:1}),t(V,{content:"清空命令历史",placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn clear-button enhanced-btn danger-btn",onClick:O,disabled:o.value.length===0||h.value},[h.value?(r(),q(_,{key:1,class:"btn-icon is-loading"},{default:s(()=>[t(a(Lt))]),_:1})):(r(),q(_,{key:0,class:"btn-icon"},{default:s(()=>[t(a(Mt))]),_:1})),p[3]||(p[3]=e("span",{class:"btn-text"},"清空",-1))],8,fc)]),_:1})]),e("div",pc,[i.value&&o.value.length===0?(r(),C("div",mc,[t(_,{class:"loading-icon is-loading"},{default:s(()=>[t(a(Lt))]),_:1}),p[4]||(p[4]=e("div",{class:"loading-text"},"加载命令历史...",-1))])):o.value.length===0?(r(),q(le,{key:1,description:"暂无命令历史"})):(r(),C("div",gc,[(r(!0),C(Se,null,je(o.value,(W,ce)=>(r(),C("div",{key:ce,class:ge(["history-item",{"is-error":!W.success}])},[e("div",{class:"item-header",onClick:ue=>L(ce)},[e("div",hc,[e("div",yc,[t(N,{size:"small",type:W.success?"success":"danger",effect:"dark",class:"status-tag"},{default:s(()=>[F(P(W.success?"成功":"失败"),1)]),_:2},1032,["type"]),e("code",null,P(W.command),1)]),e("div",_c,[e("span",bc,P(te(W.timestamp)),1),e("span",wc,"耗时: "+P(B(W.executionTime)),1)])]),e("div",kc,[t(V,{content:"复制命令",placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn item-copy-button enhanced-btn",onClick:yt(ue=>D(W.command),["stop"])},[t(_,{class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})],8,$c)]),_:2},1024),t(V,{content:"展开/收起",placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:ge(["modern-btn expand-button enhanced-btn",{"is-expanded":Z(ce)}]),onClick:yt(ue=>L(ce),["stop"])},[t(_,{class:"btn-icon"},{default:s(()=>[Z(ce)?(r(),q(a(Ms),{key:0})):(r(),q(a(ht),{key:1}))]),_:2},1024)],10,Cc)]),_:2},1024)])],8,vc),Z(ce)?(r(),C("div",Sc,[W.stdout?(r(),C("div",Tc,[e("div",Fc,[p[5]||(p[5]=e("h4",null,"标准输出",-1)),t(V,{content:"复制输出",placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn output-copy-button enhanced-btn",onClick:ue=>I(W)},[t(_,{class:"btn-icon"},{default:s(()=>[t(a(gt))]),_:1})],8,Lc)]),_:2},1024)]),e("pre",Vc,P(W.stdout),1),W.isStdoutTruncated?(r(),C("div",Pc,[t(pe,{type:"info",closable:!1,"show-icon":""},{default:s(()=>p[6]||(p[6]=[F(" 输出内容过长已被截断,请直接执行命令查看完整输出 ")])),_:1})])):K("",!0)])):K("",!0),W.stderr?(r(),C("div",{key:1,class:ge(["output-section",J(W.command)?"":"error"])},[e("div",Bc,[e("h4",null,P(J(W.command)?"输出信息":"错误输出"),1)]),e("pre",xc,P(W.stderr),1),W.isStderrTruncated?(r(),C("div",Dc,[t(pe,{type:"info",closable:!1,"show-icon":""},{default:s(()=>[F(P(J(W.command)?"输出信息":"错误输出")+"内容过长已被截断,请直接执行命令查看完整输出 ",1)]),_:2},1024)])):K("",!0)],2)):K("",!0),W.error?(r(),C("div",zc,[p[7]||(p[7]=e("div",{class:"output-header"},[e("h4",null,"错误信息")],-1)),e("pre",Rc,P(W.error),1)])):K("",!0)])):K("",!0)],2))),128))]))])]),_:1},8,["modelValue"])],64)}}}),jc=Ce(Uc,[["__scopeId","data-v-aa45cf58"]]),Oc={class:"inline-card"},Gc={key:0,class:"inline-card__icon"},Ac={class:"inline-card__content"},Mc={class:"inline-card__actions"},Ec=$e({__name:"InlineCard",setup(E){const v=Ao(),o=Q(()=>{var h;const i=(h=v.icon)==null?void 0:h.call(v);return Array.isArray(i)?i.length>0:!!i});return(i,h)=>(r(),C("div",Oc,[o.value?(r(),C("div",Gc,[ct(i.$slots,"icon",{},void 0,!0)])):K("",!0),e("div",Ac,[ct(i.$slots,"content",{},()=>[ct(i.$slots,"default",{},void 0,!0)],!0)]),e("div",Mc,[ct(i.$slots,"actions",{},void 0,!0)])]))}}),cs=Ce(Ec,[["__scopeId","data-v-d105f6c7"]]),Ic={class:"user-settings-content","element-loading-text":"正在加载配置...","element-loading-background":"rgba(0, 0, 0, 0.15)"},Nc={class:"info-section"},Hc={class:"info-card"},Jc={class:"info-icon"},Wc={class:"basic-info-section"},qc={class:"basic-info-grid"},Yc={class:"settings-section"},Kc={class:"section-title"},Qc={class:"settings-grid"},Xc={class:"setting-row"},Zc={class:"setting-label"},eu={class:"setting-row"},tu={class:"setting-row"},su={class:"setting-label"},ou={class:"setting-row"},au={class:"setting-row"},lu={class:"setting-label"},nu={class:"user-settings-footer"},iu={class:"footer-actions"},ru=["disabled"],cu=["disabled"],uu=$e({__name:"GitGlobalSettingsDialog",props:{modelValue:{type:Boolean}},emits:["update:modelValue"],setup(E,{emit:v}){const o=Je(),i=E,h=v,u=c(!1),z=c(!1),m=c(""),k=c(""),w=c(!1),H=c("false"),T=c(!1),f=c("true"),G=c("main");let O="",te="",B=!1,L="false",Z=!1,D="true",U="main";Re(()=>i.modelValue,async _=>{if(u.value=_,_){m.value=o.userName,k.value=o.userEmail;try{z.value=!0,await ee()}finally{z.value=!1}O=m.value,te=k.value,B=w.value,L=H.value,Z=T.value,D=f.value,U=G.value}},{immediate:!0});function J(_){h("update:modelValue",_)}async function I(_){try{const N=await(await fetch("/api/exec",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:`git config --global --get ${_}`})})).json();if(N.success)return String(N.stdout||"").trim()}catch{}return""}async function ae(_,V){const le=await(await fetch("/api/exec",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:`git config --global ${_} ${V}`})})).json();if(!le.success)throw new Error(le.error||`设置 ${_} 失败`)}async function ee(){const[_,V,N,le,pe]=await Promise.all([I("push.autoSetupRemote"),I("pull.rebase"),I("fetch.prune"),I("core.autocrlf"),I("init.defaultBranch")]);w.value=(_||"false").toLowerCase()==="true";const W=(V||"false").toLowerCase();H.value=W==="true"||W==="merges"?W:"false",T.value=(N||"false").toLowerCase()==="true";const ce=(le||"true").toLowerCase();f.value=ce==="true"||ce==="input"?ce:"false",G.value=pe||"main"}async function b(){const _=[];try{w.value!==B&&_.push(ae("push.autoSetupRemote",w.value?"true":"false")),H.value!==L&&_.push(ae("pull.rebase",H.value)),T.value!==Z&&_.push(ae("fetch.prune",T.value?"true":"false")),f.value!==D&&_.push(ae("core.autocrlf",f.value));const V=(G.value||"").trim();return V&&V!==U&&_.push(ae("init.defaultBranch",V)),_.length===0||(await Promise.all(_),n.success("已保存变更的 Git 配置"),B=w.value,L=H.value,Z=T.value,D=f.value,U=V||U),!0}catch(V){return n.error(V.message),!1}}async function p(){if(!m.value||!k.value){n.warning("用户名和邮箱不能为空");return}let _=!0;(m.value!==O||k.value!==te)&&(_=await o.restoreUserConfig(m.value,k.value),_&&(O=m.value,te=k.value));const V=await b();_&&V&&(m.value===O&&k.value,u.value=!1)}return(_,V)=>{const N=Ue,le=Xe,pe=zt,W=_e,ce=hs,ue=Pt,me=Bt,Be=Dt,Fe=Nt;return r(),q(Ne,{modelValue:u.value,"onUpdate:modelValue":[V[8]||(V[8]=x=>u.value=x),J],title:"Git 全局设置",size:"large","destroy-on-close":!0,"custom-class":"user-settings-dialog"},{footer:s(()=>[e("div",nu,[V[17]||(V[17]=e("div",null,null,-1)),e("div",iu,[e("button",{type:"button",class:"footer-btn cancel-btn",onClick:V[7]||(V[7]=x=>u.value=!1),disabled:z.value}," 取消 ",8,ru),e("button",{type:"button",class:"footer-btn primary-btn",onClick:p,disabled:z.value},[t(N,null,{default:s(()=>[t(a(vt))]),_:1}),V[16]||(V[16]=e("span",null,"保存设置",-1))],8,cu)])])]),default:s(()=>[Ke((r(),C("div",Ic,[e("div",Nc,[e("div",Hc,[e("div",Jc,[t(N,null,{default:s(()=>[t(a(ut))]),_:1})]),V[9]||(V[9]=e("div",{class:"info-content"},[e("p",{class:"info-title"},"全局配置"),e("p",{class:"info-desc"},"这些设置将影响全局 Git 配置,对所有 Git 仓库生效")],-1))])]),t(Be,{class:"user-form","label-width":"auto",model:{tempUserName:m.value,tempUserEmail:k.value}},{default:s(()=>[e("div",Wc,[e("div",qc,[t(pe,{class:"form-item",label:"用户名"},{default:s(()=>[t(le,{modelValue:m.value,"onUpdate:modelValue":V[0]||(V[0]=x=>m.value=x),placeholder:"请输入 Git 用户名",class:"modern-input"},null,8,["modelValue"])]),_:1}),t(pe,{class:"form-item",label:"邮箱地址"},{default:s(()=>[t(le,{modelValue:k.value,"onUpdate:modelValue":V[1]||(V[1]=x=>k.value=x),placeholder:"请输入 Git 邮箱地址",class:"modern-input"},null,8,["modelValue"])]),_:1})])]),e("div",Yc,[e("div",Kc,[t(N,{class:"title-icon"},{default:s(()=>[t(a(It))]),_:1}),V[10]||(V[10]=e("span",null,"高级配置",-1))]),e("div",Qc,[e("div",Xc,[e("label",Zc,[V[11]||(V[11]=F("自动设置上游 ")),t(W,{content:"首次 git push 时,自动为当前分支创建远程同名分支并建立跟踪关系(等同于 push -u)。",placement:"top","show-after":200},{default:s(()=>[t(N,{class:"qmark"},{default:s(()=>[t(a(ut))]),_:1})]),_:1})]),t(ce,{modelValue:w.value,"onUpdate:modelValue":V[2]||(V[2]=x=>w.value=x)},null,8,["modelValue"])]),e("div",eu,[V[12]||(V[12]=e("label",{class:"setting-label"},"拉取策略",-1)),t(me,{modelValue:H.value,"onUpdate:modelValue":V[3]||(V[3]=x=>H.value=x),class:"modern-input",size:"default"},{default:s(()=>[t(ue,{label:"merge (默认)",value:"false"}),t(ue,{label:"rebase",value:"true"}),t(ue,{label:"rebase(保留合并)",value:"merges"})]),_:1},8,["modelValue"])]),e("div",tu,[e("label",su,[V[13]||(V[13]=F("自动清理远程分支 ")),t(W,{content:"在 git fetch 时自动 prune,移除已在远程删除但本地仍保留的远程分支引用。",placement:"top","show-after":200},{default:s(()=>[t(N,{class:"qmark"},{default:s(()=>[t(a(ut))]),_:1})]),_:1})]),t(ce,{modelValue:T.value,"onUpdate:modelValue":V[4]||(V[4]=x=>T.value=x)},null,8,["modelValue"])]),e("div",ou,[V[14]||(V[14]=e("label",{class:"setting-label"},"换行符处理",-1)),t(me,{modelValue:f.value,"onUpdate:modelValue":V[5]||(V[5]=x=>f.value=x),class:"modern-input",size:"default"},{default:s(()=>[t(ue,{label:"true (Windows)",value:"true"}),t(ue,{label:"input",value:"input"}),t(ue,{label:"false",value:"false"})]),_:1},8,["modelValue"])]),e("div",au,[e("label",lu,[V[15]||(V[15]=F("默认初始化分支 ")),t(W,{content:"新建仓库时(git init)默认创建的分支名,常见为 main 或 master。",placement:"top","show-after":200},{default:s(()=>[t(N,{class:"qmark"},{default:s(()=>[t(a(ut))]),_:1})]),_:1})]),t(le,{modelValue:G.value,"onUpdate:modelValue":V[6]||(V[6]=x=>G.value=x),placeholder:"例如: main",class:"modern-input",size:"default"},null,8,["modelValue"])])])])]),_:1},8,["model"])])),[[Fe,z.value]])]),_:1},8,["modelValue"])}}}),du=Ce(uu,[["__scopeId","data-v-52446f71"]]),fu={class:"i18n-test-container"},pu={class:"test-section"},mu={class:"test-section"},gu={style:{"margin-top":"16px"}},vu={class:"test-section"},hu={style:{"margin-left":"16px"}},yu={class:"test-section"},_u={class:"test-section"},bu={class:"test-section"},wu={class:"test-section"},ku={class:"test-section"},$u={class:"test-section"},Cu=$e({__name:"I18nTest",setup(E){const{t:v}=Mo(),o=c(5),i=c(""),h=Q(()=>v("git.stagedCount",{count:o.value})),u=()=>{n.success(v("git.commitSuccess"))},z=()=>{He.confirm(v("git.revertChanges")+"?",v("common.warning"),{confirmButtonText:v("common.confirm"),cancelButtonText:v("common.cancel"),type:"warning"}).then(()=>{n.success(v("common.success"))}).catch(()=>{n.info("已取消")})},m=()=>{n.success(v("common.success")+"!")};return(k,w)=>{const H=Eo,T=No,f=Io,G=bt,O=Ho,te=Jo,B=Ge,L=Xe,Z=zt,D=Dt,U=ws,J=bs;return r(),C("div",fu,[t(J,{class:"test-card"},{header:s(()=>[e("h2",null,P(k.$t("app.title"))+" - 国际化测试",1)]),default:s(()=>[t(H,{"content-position":"left"},{default:s(()=>w[3]||(w[3]=[e("h3",null,"基础翻译测试",-1)])),_:1}),e("div",pu,[t(f,{column:2,border:""},{default:s(()=>[t(T,{label:k.$t("common.confirm")},{default:s(()=>[F(P(k.$t("common.cancel")),1)]),_:1},8,["label"]),t(T,{label:k.$t("common.save")},{default:s(()=>[F(P(k.$t("common.delete")),1)]),_:1},8,["label"]),t(T,{label:k.$t("common.edit")},{default:s(()=>[F(P(k.$t("common.add")),1)]),_:1},8,["label"]),t(T,{label:k.$t("common.search")},{default:s(()=>[F(P(k.$t("common.refresh")),1)]),_:1},8,["label"])]),_:1})]),t(H,{"content-position":"left"},{default:s(()=>w[4]||(w[4]=[e("h3",null,"Git 模块翻译",-1)])),_:1}),e("div",mu,[t(O,{wrap:""},{default:s(()=>[t(G,null,{default:s(()=>[F(P(k.$t("git.status")),1)]),_:1}),t(G,{type:"success"},{default:s(()=>[F(P(k.$t("git.commit")),1)]),_:1}),t(G,{type:"warning"},{default:s(()=>[F(P(k.$t("git.push")),1)]),_:1}),t(G,{type:"danger"},{default:s(()=>[F(P(k.$t("git.pull")),1)]),_:1}),t(G,{type:"info"},{default:s(()=>[F(P(k.$t("git.stash")),1)]),_:1})]),_:1}),e("div",gu,[e("p",null,[e("strong",null,P(k.$t("git.staged"))+":",1),F(" "+P(k.$t("git.stagedCount",{count:3})),1)]),e("p",null,[e("strong",null,P(k.$t("git.unstaged"))+":",1),F(" "+P(k.$t("git.unstagedCount",{count:7})),1)]),e("p",null,[e("strong",null,P(k.$t("git.untracked"))+":",1),F(" "+P(k.$t("git.untrackedCount",{count:2})),1)])])]),t(H,{"content-position":"left"},{default:s(()=>w[5]||(w[5]=[e("h3",null,"动态参数测试",-1)])),_:1}),e("div",vu,[t(O,{direction:"vertical",style:{width:"100%"}},{default:s(()=>[e("div",null,[t(te,{modelValue:o.value,"onUpdate:modelValue":w[0]||(w[0]=I=>o.value=I),min:0,max:100},null,8,["modelValue"]),e("span",hu,P(h.value),1)])]),_:1})]),t(H,{"content-position":"left"},{default:s(()=>w[6]||(w[6]=[e("h3",null,"Element Plus 组件国际化",-1)])),_:1}),e("div",yu,[t(O,{wrap:""},{default:s(()=>[t(B,{type:"primary",onClick:u},{default:s(()=>[F(P(k.$t("common.success")),1)]),_:1}),t(B,{type:"warning",onClick:z},{default:s(()=>[F(P(k.$t("common.confirm")),1)]),_:1}),t(B,{type:"danger"},{default:s(()=>[F(P(k.$t("common.delete")),1)]),_:1}),t(B,{type:"info"},{default:s(()=>[F(P(k.$t("common.refresh")),1)]),_:1})]),_:1})]),t(H,{"content-position":"left"},{default:s(()=>w[7]||(w[7]=[e("h3",null,"表单国际化",-1)])),_:1}),e("div",_u,[t(D,{model:{message:i.value},"label-width":"120px"},{default:s(()=>[t(Z,{label:k.$t("git.commitMessage")},{default:s(()=>[t(L,{modelValue:i.value,"onUpdate:modelValue":w[1]||(w[1]=I=>i.value=I),placeholder:k.$t("git.commitMessagePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),t(Z,null,{default:s(()=>[t(B,{type:"primary",onClick:m},{default:s(()=>[F(P(k.$t("common.submit")),1)]),_:1}),t(B,{onClick:w[2]||(w[2]=I=>i.value="")},{default:s(()=>[F(P(k.$t("common.reset")),1)]),_:1})]),_:1})]),_:1},8,["model"])]),t(H,{"content-position":"left"},{default:s(()=>w[8]||(w[8]=[e("h3",null,"Git 操作翻译",-1)])),_:1}),e("div",bu,[t(f,{column:1,border:""},{default:s(()=>[t(T,{label:k.$t("git.stageFile")},{default:s(()=>[F(P(k.$t("git.unstageFile")),1)]),_:1},8,["label"]),t(T,{label:k.$t("git.lockFile")},{default:s(()=>[F(P(k.$t("git.unlockFile")),1)]),_:1},8,["label"]),t(T,{label:k.$t("git.openFile")},{default:s(()=>[F(P(k.$t("git.openWithVSCode")),1)]),_:1},8,["label"]),t(T,{label:k.$t("git.copyPath")},{default:s(()=>[F(P(k.$t("git.pathCopied")),1)]),_:1},8,["label"])]),_:1})]),t(H,{"content-position":"left"},{default:s(()=>w[9]||(w[9]=[e("h3",null,"提交历史翻译",-1)])),_:1}),e("div",wu,[t(f,{column:2,border:""},{default:s(()=>[t(T,{label:k.$t("commit.author")},{default:s(()=>w[10]||(w[10]=[F("xuze")])),_:1},8,["label"]),t(T,{label:k.$t("commit.date")},{default:s(()=>w[11]||(w[11]=[F("2025-10-23")])),_:1},8,["label"]),t(T,{label:k.$t("commit.hash")},{default:s(()=>w[12]||(w[12]=[F("a1b2c3d")])),_:1},8,["label"]),t(T,{label:k.$t("commit.files")},{default:s(()=>w[13]||(w[13]=[F("5 files")])),_:1},8,["label"])]),_:1})]),t(H,{"content-position":"left"},{default:s(()=>w[14]||(w[14]=[e("h3",null,"错误信息翻译",-1)])),_:1}),e("div",ku,[t(U,{title:k.$t("errors.networkError"),type:"error",closable:!1,style:{"margin-bottom":"8px"}},null,8,["title"]),t(U,{title:k.$t("errors.serverError"),type:"error",closable:!1,style:{"margin-bottom":"8px"}},null,8,["title"]),t(U,{title:k.$t("errors.notFound"),type:"warning",closable:!1,style:{"margin-bottom":"8px"}},null,8,["title"]),t(U,{title:k.$t("errors.unauthorized"),type:"warning",closable:!1},null,8,["title"])]),t(H,{"content-position":"left"},{default:s(()=>w[15]||(w[15]=[e("h3",null,"脚本中使用 t() 函数",-1)])),_:1}),e("div",$u,[t(O,{direction:"vertical",style:{width:"100%"}},{default:s(()=>[w[18]||(w[18]=e("p",null,[F("在 script 中使用: "),e("code",null,"const message = t('git.commitSuccess')")],-1)),e("p",null,[w[16]||(w[16]=F("结果: ")),t(G,null,{default:s(()=>[F(P(a(v)("git.commitSuccess")),1)]),_:1})]),w[19]||(w[19]=e("p",null,[F("带参数: "),e("code",null,"t('git.stagedCount', "+P("{")+" count: 10 "+P("}")+")")],-1)),e("p",null,[w[17]||(w[17]=F("结果: ")),t(G,{type:"success"},{default:s(()=>[F(P(a(v)("git.stagedCount",{count:10})),1)]),_:1})])]),_:1})])]),_:1})])}}}),Su=Ce(Cu,[["__scopeId","data-v-d0442d3a"]]),Tu="data:image/svg+xml,%3csvg%20width='200'%20height='200'%20viewBox='0%200%20200%20200'%20xmlns='http://www.w3.org/2000/svg'%3e%3c!--%20主分支%20--%3e%3cline%20x1='40'%20y1='40'%20x2='40'%20y2='160'%20stroke='%2334495e'%20stroke-width='8'%20stroke-linecap='round'%20/%3e%3c!--%20特性分支%20--%3e%3cpath%20d='M40,70%20C60,70%2080,90%2080,110%20L80,130'%20stroke='%233498db'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20开发分支%20--%3e%3cpath%20d='M40,100%20C60,100%20100,110%20100,130%20L100,160'%20stroke='%232ecc71'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20修复分支%20--%3e%3cpath%20d='M40,130%20C60,130%20120,140%20120,160'%20stroke='%23e74c3c'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20合并点%20--%3e%3cpath%20d='M80,130%20C80,145%2060,145%2040,145'%20stroke='%233498db'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20节点%20--%3e%3ccircle%20cx='40'%20cy='40'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='70'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='100'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='130'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='145'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='160'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='80'%20cy='130'%20r='10'%20fill='%233498db'%20/%3e%3ccircle%20cx='100'%20cy='160'%20r='10'%20fill='%232ecc71'%20/%3e%3ccircle%20cx='120'%20cy='160'%20r='10'%20fill='%23e74c3c'%20/%3e%3c/svg%3e",Fu={common:{confirm:"确认",cancel:"取消",save:"保存",delete:"删除",edit:"编辑",add:"添加",search:"搜索",refresh:"刷新",close:"关闭",back:"返回",submit:"提交",reset:"重置",loading:"加载中...",success:"成功",error:"错误",warning:"警告",info:"信息",yes:"是",no:"否"},app:{title:"Zen GitSync",selectDirectory:"选择Git仓库目录",recentDirectories:"最近使用的仓库",noRecentDirectories:"暂无最近使用的仓库"},git:{status:"Git状态",commit:"提交",push:"推送",pull:"拉取",stash:"暂存",branch:"分支",remote:"远程",history:"提交历史",diff:"差异",staged:"已暂存的更改",unstaged:"未暂存的更改",untracked:"未跟踪的文件",stagedCount:"已暂存 {count} 个文件",unstagedCount:"未暂存 {count} 个文件",untrackedCount:"未跟踪 {count} 个文件",noChanges:"没有更改",selectFileToView:"请选择文件查看差异",noDiffContent:"该文件没有差异内容",commitMessage:"提交信息",commitMessagePlaceholder:"请输入提交信息...",commitSuccess:"提交成功",commitFailed:"提交失败",stageFile:"暂存文件",unstageFile:"取消暂存",revertChanges:"撤回修改",lockFile:"锁定文件",unlockFile:"解锁文件",lockedFiles:"锁定的文件",openFile:"打开文件",openWithVSCode:"用VSCode打开",copyPath:"复制文件路径",pathCopied:"路径已复制到剪贴板"},commit:{author:"作者",date:"日期",message:"提交信息",hash:"哈希值",files:"文件",viewDetails:"查看详情"},settings:{title:"设置",language:"语言",theme:"主题",autoUpdate:"自动更新状态",autoUpdateDesc:"自动刷新Git状态"},errors:{networkError:"网络错误",serverError:"服务器错误",notFound:"未找到",unauthorized:"未授权",forbidden:"禁止访问",unknown:"未知错误"}},Lu={common:{confirm:"Confirm",cancel:"Cancel",save:"Save",delete:"Delete",edit:"Edit",add:"Add",search:"Search",refresh:"Refresh",close:"Close",back:"Back",submit:"Submit",reset:"Reset",loading:"Loading...",success:"Success",error:"Error",warning:"Warning",info:"Info",yes:"Yes",no:"No"},app:{title:"Zen GitSync",selectDirectory:"Select Git Repository Directory",recentDirectories:"Recent Repositories",noRecentDirectories:"No recent repositories"},git:{status:"Git Status",commit:"Commit",push:"Push",pull:"Pull",stash:"Stash",branch:"Branch",remote:"Remote",history:"Commit History",diff:"Diff",staged:"Staged Changes",unstaged:"Unstaged Changes",untracked:"Untracked Files",stagedCount:"{count} file(s) staged",unstagedCount:"{count} file(s) unstaged",untrackedCount:"{count} file(s) untracked",noChanges:"No changes",selectFileToView:"Select a file to view diff",noDiffContent:"No diff content for this file",commitMessage:"Commit Message",commitMessagePlaceholder:"Enter commit message...",commitSuccess:"Commit successful",commitFailed:"Commit failed",stageFile:"Stage File",unstageFile:"Unstage File",revertChanges:"Revert Changes",lockFile:"Lock File",unlockFile:"Unlock File",lockedFiles:"Locked Files",openFile:"Open File",openWithVSCode:"Open with VSCode",copyPath:"Copy File Path",pathCopied:"Path copied to clipboard"},commit:{author:"Author",date:"Date",message:"Message",hash:"Hash",files:"Files",viewDetails:"View Details"},settings:{title:"Settings",language:"Language",theme:"Theme",autoUpdate:"Auto Update",autoUpdateDesc:"Automatically refresh Git status"},errors:{networkError:"Network Error",serverError:"Server Error",notFound:"Not Found",unauthorized:"Unauthorized",forbidden:"Forbidden",unknown:"Unknown Error"}},Vu=["zh-CN","en-US"],Pu=()=>{const E=localStorage.getItem("locale");return E&&Vu.includes(E)?E:(navigator.language.startsWith("zh"),"zh-CN")},$s=Wo({legacy:!1,locale:Pu(),fallbackLocale:"zh-CN",messages:{"zh-CN":Fu,"en-US":Lu},globalInjection:!0});function Bu(E){var v;$s.global.locale.value=E,localStorage.setItem("locale",E),(v=document.querySelector("html"))==null||v.setAttribute("lang",E)}function xu(){return $s.global.locale.value}const Du={"zh-CN":Hs,"en-US":qo};function zu(E){return Du[E]||Hs}const Ru=ms("locale",()=>{const E=c(xu()),v=Q(()=>zu(E.value));function o(i){Bu(i),E.value=i}return{currentLocale:E,elementPlusLocale:v,changeLocale:o}}),Uu={class:"main-header app-header"},ju={class:"header-left"},Ou=["src"],Gu={class:"header-info"},Au={key:0,class:"header-actions"},Mu={key:0,class:"command-history-section"},Eu={class:"user-name"},Iu={class:"main-container"},Nu={key:0,class:"i18n-test-wrapper"},Hu={key:1,class:"loading-container"},Ju={class:"loading-spinner"},Wu={key:2,class:"grid-layout"},qu={class:"git-status-panel"},Yu={key:0,class:"commit-form-panel"},Ku={class:"tips"},Qu={key:1,class:"commit-form-panel"},Xu={key:2,class:"log-list-panel"},Zu={class:"create-branch-content"},ed={class:"form-label"},td={class:"form-label"},sd={class:"create-branch-footer"},od={class:"footer-actions"},ad=["disabled"],ld={class:"main-footer app-footer p-4"},nd={key:0,class:"branch-info"},id={class:"branch-label","aria-label":"当前分支",title:"当前分支"},rd={key:1},cd={class:"repo-url"},ud=$e({__name:"App",setup(E){const v=c(""),o=c(null),i=c(null),h=c(null),u=Je(),z=Ze(),m=Ru(),k=c(!1),w=Q(()=>z.currentDirectory),H=c(!1),T=c(!1);function f(){H.value=!H.value;const A=document.documentElement;H.value?(A.setAttribute("data-theme","dark"),localStorage.setItem("theme","dark")):(A.removeAttribute("data-theme"),localStorage.setItem("theme","light"))}function G(){const A=localStorage.getItem("theme"),y=window.matchMedia("(prefers-color-scheme: dark)").matches;(A==="dark"||!A&&y)&&(H.value=!0,document.documentElement.setAttribute("data-theme","dark"))}function O(){z.config&&(v.value=`默认提交信息: ${z.config.defaultCommitMessage}`)}async function te(){try{const y=await(await fetch("/api/current_directory")).json();return z.setCurrentDirectory(y.directory||"未知目录"),y}catch(A){return console.error("获取当前目录失败:",A),{directory:"未知目录",isGitRepo:!1}}}ot(async()=>{console.log("---------- 页面初始化开始 ----------"),G();try{const A=await te();z.isLoaded||await z.loadConfig(),O(),u.isGitRepo=A.isGitRepo===!0,u.lastCheckedTime=Date.now(),u.isGitRepo?await Promise.all([u.getCurrentBranch(!0),u.getAllBranches(),u.getUserInfo(),u.getRemoteUrl(),u.getBranchStatus(!0)]):n.warning("当前目录不是Git仓库,部分功能将不可用")}catch(A){console.error("初始化失败:",A)}finally{k.value=!0,console.log("---------- 页面初始化完成 ----------"),setTimeout(()=>{ce()},100)}});const B=c(!1),L=c(""),Z=c("");async function D(){await u.createBranch(L.value,Z.value)&&(B.value=!1,L.value="",i.value&&i.value.refreshStatus(),u.refreshLog())}function U(){Z.value=u.currentBranch,B.value=!0}async function J(A){await u.changeBranch(A)&&(i.value&&i.value.refreshStatus(),u.refreshLog())}const I=c(!1);function ae(){I.value=!0}let ee=!1,b=!1,p=!1,_=0,V=0,N="",le="",pe=null;function W(){const A=document.querySelector(".grid-layout");if(!A)return;const y=getComputedStyle(A).gridTemplateColumns.split(" "),se=getComputedStyle(A).gridTemplateRows.split(" ");if(y.length>=3&&se.length>=3){const ie=parseFloat(y[0]),he=parseFloat(y[2]),be=ie+he,de=ie/be,ke=parseFloat(se[0]),Ae=parseFloat(se[2]),xe=ke+Ae,De=ke/xe;localStorage.setItem("zen-gitsync-layout-left-ratio",de.toString()),localStorage.setItem("zen-gitsync-layout-top-ratio",De.toString()),console.log(`布局比例已保存 - 左侧: ${(de*100).toFixed(0)}%, 上方: ${(De*100).toFixed(0)}%`),localStorage.setItem("zen-gitsync-layout-bottom-left-ratio",de.toString()),console.log(`底部布局比例已保存 - 左侧: ${(de*100).toFixed(0)}%`)}}function ce(){const A=document.querySelector(".grid-layout");if(!A)return;const y=localStorage.getItem("zen-gitsync-layout-left-ratio"),se=localStorage.getItem("zen-gitsync-layout-top-ratio");if(y){const ie=parseFloat(y),he=1-ie;A.style.gridTemplateColumns=`${ie}fr 8px ${he}fr`,console.log(`已恢复左侧比例: ${(ie*100).toFixed(0)}%`)}else A.style.gridTemplateColumns="1fr 8px 3fr";if(se){const ie=parseFloat(se),he=1-ie;A.style.gridTemplateRows=`${ie}fr 8px ${he}fr`,console.log(`已恢复上方比例: ${(ie*100).toFixed(0)}%`)}}function ue(A){var ie;const y=A.currentTarget;if(!y||!y.id)return;pe=y.id,pe==="v-resizer"?ee=!0:pe==="v-resizer-bottom"&&(b=!0),_=A.clientX;const se=document.querySelector(".grid-layout");N=getComputedStyle(se).gridTemplateColumns,(ie=document.getElementById(pe))==null||ie.classList.add("active"),document.addEventListener("mousemove",me),document.addEventListener("mouseup",Be),A.preventDefault()}function me(A){if(!ee&&!b)return;const y=document.querySelector(".grid-layout"),se=A.clientX-_,ie=N.split(" ");if(ie.length>=3){const he=parseFloat(ie[0]),be=parseFloat(ie[2]),de=he+be,ke=(he+se/y.clientWidth*de)/de,Ae=1-ke,xe=.1,De=.5;ke<xe?y.style.gridTemplateColumns=`${xe}fr 8px ${1-xe}fr`:ke>De?y.style.gridTemplateColumns=`${De}fr 8px ${1-De}fr`:y.style.gridTemplateColumns=`${ke}fr 8px ${Ae}fr`}}function Be(){var A,y;ee=!1,b=!1,(A=document.getElementById("v-resizer"))==null||A.classList.remove("active"),(y=document.getElementById("v-resizer-bottom"))==null||y.classList.remove("active"),document.removeEventListener("mousemove",me),document.removeEventListener("mouseup",Be),W()}function Fe(A){var se;p=!0,V=A.clientY;const y=document.querySelector(".grid-layout");le=getComputedStyle(y).gridTemplateRows,(se=document.getElementById("h-resizer"))==null||se.classList.add("active"),document.addEventListener("mousemove",x),document.addEventListener("mouseup",R),A.preventDefault()}function x(A){if(!p)return;const y=document.querySelector(".grid-layout"),se=A.clientY-V,ie=le.split(" ");if(ie.length>=3){const he=parseFloat(ie[0]),be=parseFloat(ie[2]),de=he+be,ke=(he+se/y.clientHeight*de)/de,Ae=1-ke,xe=.2,De=.8;ke<xe?y.style.gridTemplateRows=`${xe}fr 8px ${1-xe}fr`:ke>De?y.style.gridTemplateRows=`${De}fr 8px ${1-De}fr`:y.style.gridTemplateRows=`${ke}fr 8px ${Ae}fr`}}function R(){var A;p=!1,(A=document.getElementById("h-resizer"))==null||A.classList.remove("active"),document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",R),W()}return(A,y)=>{const se=Ue,ie=_e,he=Ge,be=bs,de=Xe,ke=zt,Ae=Pt,xe=Bt,De=Dt;return r(),q(a(Qo),{locale:a(m).elementPlusLocale},{default:s(()=>[e("header",Uu,[e("div",ju,[e("img",{src:a(Tu),alt:"Zen GitSync Logo",class:"logo"},null,8,Ou),y[10]||(y[10]=e("h1",null,"Zen GitSync",-1))]),e("div",Gu,[a(u).isGitRepo?(r(),C("div",Au,[a(u).isGitRepo?(r(),C("div",Mu,[t(jc)])):K("",!0),t(ie,{content:"编辑项目配置",placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn btn-icon-36 btn-scale-on-hover",onClick:y[0]||(y[0]=ve=>{var Ee;return(Ee=h.value)==null?void 0:Ee.openConfigEditor()})},[t(se,{class:"btn-icon"},{default:s(()=>[t(a(dt))]),_:1})])]),_:1}),t(ie,{content:H.value?"切换到浅色主题":"切换到深色主题",placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn btn-icon-36",onClick:f},[t(se,{class:"btn-icon"},{default:s(()=>[H.value?(r(),q(a(Yo),{key:0})):(r(),q(a(Ko),{key:1}))]),_:1})])]),_:1},8,["content"]),t(ie,{content:"Git 操作",placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn btn-icon-36 btn-rotate-on-hover",onClick:y[1]||(y[1]=ve=>{var Ee;return(Ee=h.value)==null?void 0:Ee.toggleGitOperationsDrawer()})},[t(se,{class:"btn-icon"},{default:s(()=>[t(a(Ds))]),_:1})])]),_:1})])):K("",!0),t(cs,{id:"user-info",class:"user-info-card",compact:""},{content:s(()=>[a(u).userName&&a(u).userEmail?(r(),q(ie,{key:0,content:a(u).userEmail,placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("span",Eu,P(a(u).userName),1)]),_:1},8,["content"])):(r(),C(Se,{key:1},[y[11]||(y[11]=e("span",{class:"user-label"},"用户: ",-1)),y[12]||(y[12]=e("span",{class:"user-warning"},"未配置",-1))],64))]),actions:s(()=>[t(ie,{content:"用户设置",placement:"bottom",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn btn-icon-28",onClick:ae},[t(se,{class:"btn-icon"},{default:s(()=>[t(a(It))]),_:1})])]),_:1})]),_:1})])]),e("main",Iu,[T.value?(r(),C("div",Nu,[t(Su),t(he,{type:"danger",onClick:y[2]||(y[2]=ve=>T.value=!1),style:{position:"fixed",top:"80px",right:"20px","z-index":"1000"}},{default:s(()=>y[13]||(y[13]=[F(" 关闭测试 ")])),_:1})])):K("",!0),k.value?(r(),C("div",Wu,[e("div",qu,[t(Nl,{ref_key:"gitStatusRef",ref:i,"initial-directory":w.value},null,8,["initial-directory"])]),e("div",{class:"vertical-resizer",id:"v-resizer",onMousedown:ue},null,32),a(u).isGitRepo?(r(),C("div",Yu,[!a(u).userName||!a(u).userEmail?(r(),q(be,{key:0,shadow:"hover"},{header:s(()=>y[16]||(y[16]=[e("h2",null,"Git用户未配置",-1)])),default:s(()=>[y[20]||(y[20]=e("p",null,"请先配置Git用户信息才能进行提交操作。",-1)),e("div",Ku,[y[18]||(y[18]=e("h3",null,"您可以通过以下方式配置:",-1)),y[19]||(y[19]=e("ol",null,[e("li",null,"点击右上角的设置按钮,配置用户名和邮箱"),e("li",null,"或者使用命令行配置:"),e("div",{class:"code-block"},[F(' git config --global user.name "您的用户名"'),e("br"),F(' git config --global user.email "您的邮箱" ')])],-1)),t(he,{type:"primary",onClick:ae},{default:s(()=>y[17]||(y[17]=[F(" 立即配置 ")])),_:1})])]),_:1})):(r(),q(Rr,{key:1,ref_key:"commitFormRef",ref:h},null,512))])):(r(),C("div",Qu,[t(be,{shadow:"hover"},{header:s(()=>y[21]||(y[21]=[e("h2",null,"Git仓库初始化",-1)])),default:s(()=>[y[22]||(y[22]=e("p",null,"当前目录不是Git仓库,请先初始化Git仓库或切换到Git仓库目录。",-1)),y[23]||(y[23]=e("div",{class:"tips"},[e("h3",null,"可以使用以下命令初始化仓库:"),e("div",{class:"code-block"},"git init")],-1))]),_:1})])),e("div",{class:"horizontal-resizer",id:"h-resizer",onMousedown:Fe},null,32),a(u).isGitRepo?(r(),C("div",Xu,[t(rc,{ref_key:"logListRef",ref:o},null,512)])):K("",!0),t(Ne,{modelValue:B.value,"onUpdate:modelValue":y[6]||(y[6]=ve=>B.value=ve),title:"创建新分支",size:"small","destroy-on-close":!0,"custom-class":"create-branch-dialog"},{footer:s(()=>[e("div",sd,[e("div",od,[e("button",{type:"button",class:"footer-btn cancel-btn",onClick:y[5]||(y[5]=ve=>B.value=!1)}," 取消 "),e("button",{type:"button",class:"footer-btn primary-btn",onClick:D,disabled:a(u).isCreatingBranch},[a(u).isCreatingBranch?(r(),q(se,{key:1,class:"is-loading"},{default:s(()=>y[26]||(y[26]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z"})],-1)])),_:1})):(r(),q(se,{key:0},{default:s(()=>[t(a(vt))]),_:1})),y[27]||(y[27]=e("span",null,"创建",-1))],8,ad)])])]),default:s(()=>[e("div",Zu,[t(De,{model:{newBranchName:L.value,selectedBaseBranch:Z.value},"label-position":"top"},{default:s(()=>[t(ke,null,{label:s(()=>[e("div",ed,[t(se,{class:"label-icon"},{default:s(()=>[t(a(zs))]),_:1}),y[24]||(y[24]=e("span",null,"新分支名称",-1))])]),default:s(()=>[t(de,{modelValue:L.value,"onUpdate:modelValue":y[3]||(y[3]=ve=>L.value=ve),placeholder:"请输入新分支名称",class:"modern-input",size:"large",onKeyup:_s(D,["enter"])},null,8,["modelValue"])]),_:1}),t(ke,null,{label:s(()=>[e("div",td,[t(se,{class:"label-icon"},{default:s(()=>[t(a(Ds))]),_:1}),y[25]||(y[25]=e("span",null,"基于分支",-1))])]),default:s(()=>[t(xe,{modelValue:Z.value,"onUpdate:modelValue":y[4]||(y[4]=ve=>Z.value=ve),placeholder:"选择基础分支",class:"modern-select",size:"large",style:{width:"100%"}},{default:s(()=>[(r(!0),C(Se,null,je(a(u).allBranches,ve=>(r(),q(Ae,{key:ve,label:ve,value:ve},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])])]),_:1},8,["modelValue"])])):(r(),C("div",Hu,[t(be,{class:"loading-card"},{default:s(()=>[e("div",Ju,[t(se,{class:"is-loading"},{default:s(()=>y[14]||(y[14]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32zM195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0zm-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"})],-1)])),_:1})]),y[15]||(y[15]=e("div",{class:"loading-text"},"加载中...",-1))]),_:1})]))]),e("footer",ld,[a(u).currentBranch?(r(),C("div",nd,[t(cs,{class:"branch-wrapper",compact:""},{content:s(()=>[t(ie,{content:"当前分支",placement:"top",effect:"dark","show-after":200},{default:s(()=>[e("span",id,[t(se,{class:"branch-icon"},{default:s(()=>y[28]||(y[28]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M256 160a96 96 0 1 1 0 192 96 96 0 0 1 0-192zm0 512a96 96 0 1 1 0 192 96 96 0 0 1 0-192zm512-480a96 96 0 1 1 0 192 96 96 0 0 1 0-192zM352 256h288a128 128 0 0 1 128 128v48a144 144 0 0 1-144 144H368a16 16 0 0 0-16 16v64h-96v-64a112 112 0 0 1 112-112h256a80 80 0 0 0 80-80v-16a64 64 0 0 0-64-64H352v-64z"})],-1)])),_:1})])]),_:1}),t(xe,{modelValue:a(u).currentBranch,"onUpdate:modelValue":y[7]||(y[7]=ve=>a(u).currentBranch=ve),onChange:J,loading:a(u).isChangingBranch,class:"branch-select"},{default:s(()=>[(r(!0),C(Se,null,je(a(u).allBranches,ve=>(r(),q(Ae,{key:ve,label:ve,value:ve},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"])]),actions:s(()=>[e("button",{class:"modern-btn btn-icon-28",onClick:U},[t(se,{class:"btn-icon"},{default:s(()=>[t(a(zs))]),_:1})])]),_:1})])):K("",!0),a(u).remoteUrl?(r(),C("div",rd,[t(cs,{class:"footer-right",compact:""},{content:s(()=>[y[29]||(y[29]=e("span",{class:"repo-url-label"},"远程仓库:",-1)),e("span",cd,P(a(u).remoteUrl),1)]),actions:s(()=>[t(ie,{content:"复制仓库地址",placement:"top",effect:"dark","show-after":200},{default:s(()=>[e("button",{class:"modern-btn btn-icon-28",onClick:y[8]||(y[8]=ve=>a(u).copyRemoteUrl())},[t(se,{class:"btn-icon"},{default:s(()=>[t(a(ds))]),_:1})])]),_:1})]),_:1})])):K("",!0)]),t(du,{modelValue:I.value,"onUpdate:modelValue":y[9]||(y[9]=ve=>I.value=ve)},null,8,["modelValue"])]),_:1},8,["locale"])}}}),dd=Ce(ud,[["__scopeId","data-v-ef207da3"]]),Cs=Xo(dd);Cs.use(Zo());Cs.use($s);Cs.mount("#app");