zen-gitsync 2.3.12 → 2.4.1

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