zen-gitsync 2.3.13 → 2.4.2

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