zen-gitsync 2.3.3 → 2.3.5

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