zen-gitsync 2.4.1 → 2.4.3

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