zen-gitsync 2.17.6 → 2.17.8

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.
Files changed (70) hide show
  1. package/README.md +39 -2
  2. package/package.json +1 -1
  3. package/scripts/release.js +139 -48
  4. package/src/cli/ai/agent.js +108 -324
  5. package/src/cli/ai/cli.integration.test.js +124 -0
  6. package/src/cli/ai/context.js +90 -0
  7. package/src/cli/ai/modelSetup.js +38 -0
  8. package/src/cli/ai/runtime.test.js +181 -0
  9. package/src/cli/ai/safety.js +27 -4
  10. package/src/cli/ai/safety.test.js +13 -0
  11. package/src/cli/ai/telemetry.js +43 -0
  12. package/src/cli/ai/termui.js +181 -51
  13. package/src/cli/ai/termui.test.js +165 -16
  14. package/src/cli/ai/tools.js +27 -5
  15. package/src/cli/ai/tools.test.js +23 -0
  16. package/src/cli/ai/transport.js +89 -0
  17. package/src/cli/ai/turn.js +126 -0
  18. package/src/config.js +34 -4
  19. package/src/ui/public/assets/AgentView-CdJaeRh0.js +5 -0
  20. package/src/ui/public/assets/AgentView-DAY4S5WN.css +1 -0
  21. package/src/ui/public/assets/{AppVersionBadge-DV6KuLqb.js → AppVersionBadge-CiijSYfM.js} +2 -2
  22. package/src/ui/public/assets/{BranchSelector-DGXDAOkR.js → BranchSelector-BS7ajwvv.js} +1 -1
  23. package/src/ui/public/assets/{CommitForm-BYBj7UUa.js → CommitForm-CEOSqXCA.js} +3 -3
  24. package/src/ui/public/assets/{CommonDialog-DWMCeujE.js → CommonDialog-CAaEi-4T.js} +1 -1
  25. package/src/ui/public/assets/{EditorView-D-TEQZso.js → EditorView-DyaFyRDD.js} +1 -1
  26. package/src/ui/public/assets/{FileDiffViewer-C4ZANajI.js → FileDiffViewer-BvX9cQjR.js} +1 -1
  27. package/src/ui/public/assets/{FlowExecutionViewer-DUv7mBuG.js → FlowExecutionViewer-uXrzZjsW.js} +1 -1
  28. package/src/ui/public/assets/{FlowOrchestrationWorkspace-BiSuvzL7.js → FlowOrchestrationWorkspace-DIBpUSt_.js} +1 -1
  29. package/src/ui/public/assets/{IconButton-BltPKVbV.js → IconButton-CnoW2on6.js} +1 -1
  30. package/src/ui/public/assets/{LogList-BY1Haq9r.js → LogList-D2espSVo.js} +1 -1
  31. package/src/ui/public/assets/{MindmapView-BKsvCnYv.js → MindmapView-CZF-rZVs.js} +1 -1
  32. package/src/ui/public/assets/{MonitorView-B3_NaJRy.js → MonitorView-DjLr7qOG.js} +1 -1
  33. package/src/ui/public/assets/{ProjectStartupButton-DP3eDVRp.js → ProjectStartupButton-DzsU-QIO.js} +1 -1
  34. package/src/ui/public/assets/{RemoteManagerDialog-Bl9b_iRv.js → RemoteManagerDialog-CuuG2ucT.js} +1 -1
  35. package/src/ui/public/assets/{RemoteRepoCard-TQ3DxDnq.js → RemoteRepoCard-BGf8L0of.js} +1 -1
  36. package/src/ui/public/assets/{SourceMapView-BF-Mzv3V.js → SourceMapView-CFb02m6z.js} +1 -1
  37. package/src/ui/public/assets/{SvgIcon-DxazW7dI.js → SvgIcon-SRAeYjnN.js} +1 -1
  38. package/src/ui/public/assets/{TemplateManager-BN6gWFWX.js → TemplateManager-gedqAXl8.js} +1 -1
  39. package/src/ui/public/assets/{UserInputNode-CPwvIfP6.js → UserInputNode-BOCuMQW6.js} +1 -1
  40. package/src/ui/public/assets/WorkbenchView-CRoR21LQ.js +13 -0
  41. package/src/ui/public/assets/WorkbenchView-v3QFn6Ln.css +1 -0
  42. package/src/ui/public/assets/_plugin-vue_export-helper-C8OE7U9H.js +19 -0
  43. package/src/ui/public/assets/configStore-CuMElTgV.js +1 -0
  44. package/src/ui/public/assets/{gitStore-CYrdjXPU.js → gitStore-CpcS-MzM.js} +1 -1
  45. package/src/ui/public/assets/index-cApp6w0b.css +1 -0
  46. package/src/ui/public/assets/index-yXm9JLGv.js +24 -0
  47. package/src/ui/public/assets/{previewSandbox-D_j5PWX1.js → previewSandbox-DkXYEpLP.js} +0 -0
  48. package/src/ui/public/assets/{toolsStore-BiC2mmC3.js → toolsStore-DGxlRe3Y.js} +1 -1
  49. package/src/ui/public/assets/vendor-4ojsjDYc.css +1 -0
  50. package/src/ui/public/assets/{vendor-92fKgtnz.js → vendor-dO4B7wQf.js} +28 -28
  51. package/src/ui/public/index.html +14 -14
  52. package/src/ui/server/routes/config.js +8 -3
  53. package/src/ui/server/routes/fileOpen.js +48 -2
  54. package/src/ui/server/routes/fs.js +37 -0
  55. package/src/ui/server/routes/gAiLauncher.test.js +70 -0
  56. package/src/ui/server/routes/workbench/index.js +37 -6
  57. package/src/ui/server/routes/workbench/jobStore.js +4 -0
  58. package/src/ui/server/routes/workbench/taskRunner.js +276 -96
  59. package/src/ui/server/routes/workbench/taskRunner.opencode.test.js +126 -0
  60. package/src/ui/server/utils/directoryFetch.js +209 -0
  61. package/src/ui/server/utils/directoryFetch.test.js +232 -0
  62. package/src/ui/public/assets/AgentView-BC3F0F6m.js +0 -4
  63. package/src/ui/public/assets/AgentView-CzUeyQfR.css +0 -1
  64. package/src/ui/public/assets/WorkbenchView-CDu61WWs.js +0 -13
  65. package/src/ui/public/assets/WorkbenchView-DEejub9Z.css +0 -1
  66. package/src/ui/public/assets/_plugin-vue_export-helper-B7A-NgBp.js +0 -19
  67. package/src/ui/public/assets/configStore-Dx84lvTX.js +0 -1
  68. package/src/ui/public/assets/index-DNHOYMCg.js +0 -24
  69. package/src/ui/public/assets/index-Dsfmp6w8.css +0 -1
  70. package/src/ui/public/assets/vendor-B1UrVTTI.css +0 -1
@@ -0,0 +1 @@
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{Bn as e,Tn as t,a as n,br as r,n as i,or as a,pr as o,t as s}from"./element-plus-KTmRV-so.js";import{m as c}from"./vendor-dO4B7wQf.js";import{a as l,n as u,r as d}from"./_plugin-vue_export-helper-C8OE7U9H.js";var f={"zh-CN":i,"en-US":s};function p(e){return f[e]||i}o(),e();var m=c(`locale`,()=>{let e=r(d()),n=t(()=>p(e.value));async function i(t){l(t),e.value=t;let n=h();n.locale!==t&&await n.saveGeneralSettings({locale:t})}return{currentLocale:e,elementPlusLocale:n,changeLocale:i}});o(),e();var h=c(`config`,()=>{let e=r(``),i=r([]),o=r([]),s=r([]),c=r([]),d=r([]),f=r([]),p=r([]),h=r([]),g=r(!1),_=r({enabled:!1,type:`command`,refId:``}),v=r(!1),y=r(!1),b=r(``),x=r(``),S=r(``),C=r(!0),w=r(!1),T=r(!0),E=r(!1),D=r(!1),O=r(!0),k=r(`light`),A=r(`zh-CN`),j=r([]),M=r(200),N=r(`claude`),P={layout:{leftRatio:.25,midRatio:.375,rightRatio:.375,topRatio:.5},layoutsByProject:{},aiDiffSummaryByProject:{},fileListViewMode:`list`,fileDiffSplitPercent:35,diffPreviewSplitPercent:55,commandConsole:{expanded:!0,useTerminal:!0,showTerminalSessions:!0,splitPercent:25},editorAutoSave:!1,mindmapDir:``},F=r(JSON.parse(JSON.stringify(P))),I=r(!1);function L(e){S.value=e||``}let R=t(()=>{let e=S.value;return e?F.value.aiDiffSummaryByProject[e]!==!1:!1});function ee(){let e=S.value;if(e&&F.value.layoutsByProject?.[e]){F.value.layout={...F.value.layoutsByProject[e]};return}}function z(e){let t=document.documentElement;e===`dark`?t.setAttribute(`data-theme`,`dark`):e===`light`?t.removeAttribute(`data-theme`):window.matchMedia(`(prefers-color-scheme: dark)`).matches?t.setAttribute(`data-theme`,`dark`):t.removeAttribute(`data-theme`)}function B(){let e=document.documentElement.getAttribute(`data-theme`)===`dark`?`light`:`dark`;return k.value=e,z(e),$({theme:e}).catch(e=>{console.error(`保存主题切换结果失败:`,e)}),e}z(k.value);let V=t(()=>({defaultCommitMessage:e.value,descriptionTemplates:i.value,scopeTemplates:o.value,messageTemplates:s.value,commandTemplates:c.value,lockedFiles:d.value,customCommands:f.value,orchestrations:p.value,startupItems:h.value,startupAutoRun:g.value,afterQuickPushAction:_.value,currentDirectory:S.value})),te=t(()=>!!(b.value&&b.value.trim()));async function ne(){try{let e=await fetch(`/api/config/open-file`,{method:`POST`,headers:{"Content-Type":`application/json`}}),t=await e.json().catch(()=>({}));return e.ok&&t?.success?(n.success(u(`@D50BB:已打开系统配置文件`)),!0):(n.error(`${u(`@D50BB:打开系统配置文件失败: `)}${t?.error||``}`),!1)}catch(e){return n.error(`${u(`@D50BB:打开系统配置文件失败: `)}${e.message}`),!1}}async function H(t=!1){if(!t&&y.value&&!v.value)return console.log(u(`@D50BB:使用缓存的配置信息`)),V.value;v.value=!0;try{v.value=!0,console.log(u(`@D50BB:加载配置信息...`));let t=await fetch(`/api/config/getConfig`),r=await t.json().catch(()=>({}));if(!t.ok||r&&r.success===!1){let e=String(r?.error||u(`@D50BB:加载配置失败`)),t=String(r?.configPath||``),i=t?`\n${u(`@D50BB:配置文件`)}: ${t}`:``;return n.error(`${u(`@D50BB:加载配置失败: `)}${e}${i}`),b.value=e,x.value=t,null}if(b.value=``,x.value=``,e.value=r.defaultCommitMessage||``,i.value=r.descriptionTemplates||[],o.value=r.scopeTemplates||[],s.value=r.messageTemplates||[],c.value=r.commandTemplates||[],d.value=r.lockedFiles||[],f.value=r.customCommands||[],p.value=r.orchestrations||[],h.value=(r.startupItems||[]).map(e=>({id:String(e?.id??``),type:e?.type===`workflow`?`workflow`:`command`,refId:String(e?.refId??e?.commandId??``),createdAt:Number(e?.createdAt??Date.now()),enabled:typeof e?.enabled!=`boolean`||e.enabled})).filter(e=>e.id&&e.refId),g.value=r.startupAutoRun||!1,_.value={enabled:!!r?.afterQuickPushAction?.enabled,type:r?.afterQuickPushAction?.type===`workflow`?`workflow`:`command`,refId:String(r?.afterQuickPushAction?.refId||``).trim()},r.isStandardCommit!==void 0&&(T.value=!!r.isStandardCommit),r.skipHooks!==void 0&&(E.value=!!r.skipHooks),r.autoQuickPushOnEnter!==void 0&&(D.value=!!r.autoQuickPushOnEnter),r.autoSetDefaultMessage!==void 0&&(w.value=!!r.autoSetDefaultMessage),r.autoClosePushModal!==void 0&&(C.value=!!r.autoClosePushModal),r.pullBeforePush!==void 0&&(O.value=!!r.pullBeforePush),Array.isArray(r.models)&&(j.value=r.models),Number.isFinite(Number(r.aiMaxToolIterations))&&Number(r.aiMaxToolIterations)>0&&(M.value=Math.floor(Number(r.aiMaxToolIterations))),(r.taskExecutor===`claude`||r.taskExecutor===`opencode`)&&(N.value=r.taskExecutor),r.theme&&[`light`,`dark`,`auto`].includes(r.theme)&&(k.value=r.theme,z(r.theme)),r.locale&&[`zh-CN`,`en-US`].includes(r.locale)){A.value=r.locale,l(r.locale);let e=m();e.currentLocale=r.locale}if(r.currentDirectory&&(S.value=r.currentDirectory),r.ui==null){let e=e=>{try{return localStorage.getItem(e)}catch{return null}},t={},n=e(`zen-gitsync-layout-left-ratio`),r=e(`zen-gitsync-layout-mid-ratio`),i=e(`zen-gitsync-layout-right-ratio`),a=e(`zen-gitsync-layout-top-ratio`);if(n||r||i||a){let e=(e,t)=>{let n=e==null?NaN:parseFloat(e);return Number.isFinite(n)?n:t};t.layout={leftRatio:e(n,P.layout.leftRatio),midRatio:e(r,P.layout.midRatio),rightRatio:e(i,P.layout.rightRatio),topRatio:e(a,P.layout.topRatio)}}let o=e(`zen-gitsync-file-list-view-mode`);(o===`list`||o===`tree`)&&(t.fileListViewMode=o);let s=e(`zen-gitsync-filediff-ratio`)??e(`fileDiff.splitPercent`);if(s!=null){let e=parseFloat(s);Number.isFinite(e)&&(t.fileDiffSplitPercent=Math.min(85,Math.max(15,e)))}let c=e(`useTerminal`),l=e(`isConsoleExpanded`),u=e(`showTerminalSessions`),d=e(`zen-gitsync-commandconsole-ratio`);if(c!==null||l!==null||u!==null||d!=null){let e=d==null?NaN:parseFloat(d);t.commandConsole={useTerminal:c!==`false`,expanded:l!==`false`,showTerminalSessions:u==null||u===`true`,splitPercent:Number.isFinite(e)?Math.min(85,Math.max(15,e)):P.commandConsole.splitPercent}}let f=e(`zen-gitsync-editor-auto-save`);f!=null&&(t.editorAutoSave=f===`true`),Object.keys(t).length>0&&(F.value={...F.value,...t}),Object.keys(t).length>0&&q(t,{immediate:!0}).catch(e=>{console.error(`迁移 UI 设置到文件失败:`,e)});try{[`zen-gitsync-theme`,`zen-gitsync-locale`,`zen-gitsync-editor-auto-save`,`zen-gitsync-file-list-view-mode`,`zen-gitsync-filediff-ratio`,`fileDiff.splitPercent`,`isConsoleExpanded`,`useTerminal`,`showTerminalSessions`,`zen-gitsync-commandconsole-ratio`,`zen-gitsync-layout-left-ratio`,`zen-gitsync-layout-mid-ratio`,`zen-gitsync-layout-right-ratio`,`zen-gitsync-layout-top-ratio`,`locale`].forEach(e=>localStorage.removeItem(e))}catch{}}else{let e=r.ui.layoutsByProject&&typeof r.ui.layoutsByProject==`object`&&!Array.isArray(r.ui.layoutsByProject)?r.ui.layoutsByProject:{},t={};for(let[n,r]of Object.entries(e))if(r&&typeof r==`object`&&!Array.isArray(r)){let e=r;t[n]={leftRatio:Number.isFinite(Number(e.leftRatio))?Number(e.leftRatio):P.layout.leftRatio,midRatio:Number.isFinite(Number(e.midRatio))?Number(e.midRatio):P.layout.midRatio,rightRatio:Number.isFinite(Number(e.rightRatio))?Number(e.rightRatio):P.layout.rightRatio,topRatio:Number.isFinite(Number(e.topRatio))?Number(e.topRatio):P.layout.topRatio}}let n=r.ui.aiDiffSummaryByProject&&typeof r.ui.aiDiffSummaryByProject==`object`&&!Array.isArray(r.ui.aiDiffSummaryByProject)?r.ui.aiDiffSummaryByProject:{},i={};for(let[e,t]of Object.entries(n))typeof t==`boolean`&&(i[e]=t);let a={...P.layout,...r.ui.layout||{}};F.value={layout:a,layoutsByProject:t,aiDiffSummaryByProject:i,fileListViewMode:r.ui.fileListViewMode===`tree`?`tree`:`list`,fileDiffSplitPercent:Number.isFinite(Number(r.ui.fileDiffSplitPercent))?Math.min(85,Math.max(15,Number(r.ui.fileDiffSplitPercent))):P.fileDiffSplitPercent,diffPreviewSplitPercent:Number.isFinite(Number(r.ui.diffPreviewSplitPercent))?Math.min(85,Math.max(25,Number(r.ui.diffPreviewSplitPercent))):P.diffPreviewSplitPercent,commandConsole:{expanded:typeof r.ui.commandConsole?.expanded==`boolean`?r.ui.commandConsole.expanded:P.commandConsole.expanded,useTerminal:typeof r.ui.commandConsole?.useTerminal==`boolean`?r.ui.commandConsole.useTerminal:P.commandConsole.useTerminal,showTerminalSessions:typeof r.ui.commandConsole?.showTerminalSessions==`boolean`?r.ui.commandConsole.showTerminalSessions:P.commandConsole.showTerminalSessions,splitPercent:Number.isFinite(Number(r.ui.commandConsole?.splitPercent))?Math.min(85,Math.max(15,Number(r.ui.commandConsole.splitPercent))):P.commandConsole.splitPercent},editorAutoSave:typeof r.ui.editorAutoSave==`boolean`?r.ui.editorAutoSave:P.editorAutoSave,mindmapDir:typeof r.ui.mindmapDir==`string`?r.ui.mindmapDir:P.mindmapDir}}return ee(),I.value=!0,y.value=!0,console.log(u(`@D50BB:配置信息加载完成`)),V.value}catch(e){return console.error(`加载配置失败:`,e),n.error(`${u(`@D50BB:加载配置失败: `)}${e.message}`),b.value=e.message,null}finally{v.value=!1}}async function U(){try{await fetch(`/api/config/save-commit-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({isStandardCommit:T.value,skipHooks:E.value,autoQuickPushOnEnter:D.value,autoSetDefaultMessage:w.value,autoClosePushModal:C.value,pullBeforePush:O.value})})}catch(e){console.error(`保存提交设置失败:`,e)}}a([T,E,D,w,C,O],()=>{y.value&&U()});let W=null,G={};async function K(){if(W&&=(clearTimeout(W),null),Object.keys(G).length===0)return;let e=G;G={};try{await fetch(`/api/config/save-ui-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})}catch(e){console.error(`保存 UI 设置失败:`,e)}}async function q(e,t={}){if(I.value){if(t.immediate){Object.assign(G,e),await K();return}Object.assign(G,e),W&&clearTimeout(W),W=setTimeout(()=>{K()},300)}}async function J(){F.value.layout={...P.layout};let e=S.value;return e&&(F.value.layoutsByProject={...F.value.layoutsByProject,[e]:{...F.value.layout}}),await q({layoutsByProject:F.value.layoutsByProject},{immediate:!0}),F.value.layout}async function Y(e){let t=S.value;t&&(F.value.aiDiffSummaryByProject={...F.value.aiDiffSummaryByProject,[t]:e},await q({aiDiffSummaryByProject:{[t]:e}},{immediate:!0}))}a(()=>F.value.fileListViewMode,e=>{I.value&&q({fileListViewMode:e})}),a(()=>F.value.fileDiffSplitPercent,e=>{I.value&&q({fileDiffSplitPercent:e})}),a(()=>F.value.diffPreviewSplitPercent,e=>{I.value&&e!=null&&q({diffPreviewSplitPercent:e})}),a(()=>F.value.editorAutoSave,e=>{I.value&&q({editorAutoSave:e})}),a(()=>F.value.layout,e=>{if(!I.value)return;let t=S.value;t&&(F.value.layoutsByProject={...F.value.layoutsByProject,[t]:e},q({layoutsByProject:F.value.layoutsByProject}))},{deep:!0}),a(()=>F.value.commandConsole,e=>{I.value&&q({commandConsole:e})},{deep:!0}),typeof window<`u`&&window.addEventListener(`beforeunload`,()=>{K()});async function X(t){try{let r=await(await fetch(`/api/config/saveDefaultMessage`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({defaultCommitMessage:t})})).json();return r.success?(e.value=t,n.success(u(`@D50BB:默认提交信息已保存`)),!0):(n.error(`${u(`@D50BB:保存失败: `)}${r.error}`),!1)}catch(e){return n.error(`${u(`@D50BB:保存失败: `)}${e.message}`),!1}}async function re(e){try{let t=await(await fetch(`/api/config/save-after-quick-push-action`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({afterQuickPushAction:{enabled:!!e?.enabled,type:e?.type===`workflow`?`workflow`:`command`,refId:String(e?.refId||``).trim()}})})).json();return t.success?(_.value={enabled:!!e?.enabled,type:e?.type===`workflow`?`workflow`:`command`,refId:String(e?.refId||``).trim()},!0):(n.error(`保存提交后启动项失败: ${t.error}`),!1)}catch(e){return n.error(`保存提交后启动项失败: ${e.message}`),!1}}async function ie(e,t){try{let r=await(await fetch(`/api/config/save-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return r.success?(t===`description`?i.value.includes(e)||i.value.push(e):t===`scope`?o.value.includes(e)||o.value.push(e):t===`message`?s.value.includes(e)||s.value.push(e):t===`command`&&(c.value.includes(e)||c.value.push(e)),n.success(u(`@D50BB:模板已保存`)),!0):(n.error(`${u(`@D50BB:保存模板失败: `)}${r.error}`),!1)}catch(e){return n.error(`${u(`@D50BB:保存模板失败: `)}${e.message}`),!1}}async function ae(e,t){try{let r=await(await fetch(`/api/config/delete-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return r.success?(t===`description`?i.value=i.value.filter(t=>t!==e):t===`scope`?o.value=o.value.filter(t=>t!==e):t===`message`?s.value=s.value.filter(t=>t!==e):t===`command`&&(c.value=c.value.filter(t=>t!==e)),n.success(u(`@D50BB:模板已删除`)),!0):(n.error(`${u(`@D50BB:删除模板失败: `)}${r.error}`),!1)}catch(e){return n.error(`${u(`@D50BB:删除模板失败: `)}${e.message}`),!1}}async function oe(e,t,r){try{let a=await(await fetch(`/api/config/update-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({oldTemplate:e,newTemplate:t,type:r})})).json();if(a.success){if(r===`description`){let n=i.value.indexOf(e);n!==-1&&(i.value[n]=t)}else if(r===`scope`){let n=o.value.indexOf(e);n!==-1&&(o.value[n]=t)}else if(r===`message`){let n=s.value.indexOf(e);n!==-1&&(s.value[n]=t)}else if(r===`command`){let n=c.value.indexOf(e);n!==-1&&(c.value[n]=t)}return n.success(u(`@D50BB:模板已更新`)),!0}return n.error(`${u(`@D50BB:更新模板失败: `)}${a.error}`),!1}catch(e){return n.error(`${u(`@D50BB:更新模板失败: `)}${e.message}`),!1}}async function se(e,t){try{let r=await(await fetch(`/api/config/pin-template`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({template:e,type:t})})).json();return r.success?(t===`description`?(i.value=i.value.filter(t=>t!==e),i.value.unshift(e)):t===`scope`?(o.value=o.value.filter(t=>t!==e),o.value.unshift(e)):t===`message`?(s.value=s.value.filter(t=>t!==e),s.value.unshift(e)):t===`command`&&(c.value=c.value.filter(t=>t!==e),c.value.unshift(e)),n.success(u(`@D50BB:模板已置顶`)),!0):(n.error(`${u(`@D50BB:置顶模板失败: `)}${r.error}`),!1)}catch(e){return n.error(`${u(`@D50BB:置顶模板失败: `)}${e.message}`),!1}}async function Z(){try{let e=await(await fetch(`/api/locked-files`)).json();return e.success?(d.value=e.lockedFiles||[],e.lockedFiles):(n.error(`${u(`@D50BB:加载锁定文件列表失败: `)}${e.error}`),[])}catch(e){return console.error(`加载锁定文件列表失败:`,e),n.error(`${u(`@D50BB:加载锁定文件列表失败: `)}${e.message}`),[]}}async function ce(e){try{let t=await(await fetch(`/api/lock-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?(await Z(),n.success(`${u(`@D50BB:文件已锁定: `)}${e}`),!0):(n.error(`${u(`@D50BB:锁定文件失败: `)}${t.error}`),!1)}catch(e){return console.error(`锁定文件失败:`,e),n.error(`${u(`@D50BB:锁定文件失败: `)}${e.message}`),!1}}async function le(e){try{let t=await(await fetch(`/api/unlock-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?(await Z(),n.success(`${u(`@D50BB:文件已解锁: `)}${e}`),!0):(n.error(`${u(`@D50BB:解锁文件失败: `)}${t.error}`),!1)}catch(e){return console.error(`解锁文件失败:`,e),n.error(`${u(`@D50BB:解锁文件失败: `)}${e.message}`),!1}}async function ue(e){try{let t=await(await fetch(`/api/check-file-lock`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?t.isLocked:(console.error(`检查文件锁定状态失败:`,t.error),!1)}catch(e){return console.error(`检查文件锁定状态失败:`,e),!1}}async function de(e){try{let t=await(await fetch(`/api/config/save-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({command:e})})).json();return t.success?(await H(!0),n.success(u(`@CMD01:命令已保存`)),!0):(n.error(`${u(`@CMD01:保存命令失败: `)}${t.error}`),!1)}catch(e){return n.error(`${u(`@CMD01:保存命令失败: `)}${e.message}`),!1}}async function fe(e){try{let t=await(await fetch(`/api/config/delete-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e})})).json();return t.success?(await H(!0),n.success(u(`@CMD01:命令已删除`)),!0):(n.error(`${u(`@CMD01:删除命令失败: `)}${t.error}`),!1)}catch(e){return n.error(`${u(`@CMD01:删除命令失败: `)}${e.message}`),!1}}async function Q(e,t){try{let r=await(await fetch(`/api/config/update-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e,command:t})})).json();return r.success?(await H(!0),n.success(u(`@CMD01:命令已更新`)),!0):(n.error(`${u(`@CMD01:更新命令失败: `)}${r.error}`),!1)}catch(e){return n.error(`${u(`@CMD01:更新命令失败: `)}${e.message}`),!1}}async function pe(e){try{let t=await(await fetch(`/api/config/pin-custom-command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e})})).json();return t.success?(await H(!0),!0):(n.error(t.error),!1)}catch(e){return n.error(e.message),!1}}async function me(e){try{let t=await(await fetch(`/api/config/save-orchestration`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({orchestration:e})})).json();return t.success?(await H(!0),n.success(u(`@ORCH:编排已保存`)),t.orchestration||null):(n.error(`${u(`@ORCH:保存编排失败: `)}${t.error}`),null)}catch(e){return n.error(`${u(`@ORCH:保存编排失败: `)}${e.message}`),null}}async function he(e){try{let t=await(await fetch(`/api/config/delete-orchestration`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e})})).json();return t.success?(await H(!0),n.success(u(`@ORCH:编排已删除`)),!0):(n.error(`${u(`@ORCH:删除编排失败: `)}${t.error}`),!1)}catch(e){return n.error(`${u(`@ORCH:删除编排失败: `)}${e.message}`),!1}}async function ge(e,t){try{let r=await(await fetch(`/api/config/update-orchestration`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e,orchestration:t})})).json();return r.success?(await H(!0),n.success(u(`@ORCH:编排已更新`)),!0):(n.error(`${u(`@ORCH:更新编排失败: `)}${r.error}`),!1)}catch(e){return n.error(`${u(`@ORCH:更新编排失败: `)}${e.message}`),!1}}async function _e(e,t){try{let r=await(await fetch(`/api/config/save-startup-items`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({startupItems:e,startupAutoRun:t===void 0?g.value:t})})).json();return r.success?(h.value=e,t!==void 0&&(g.value=t),!0):(n.error(`保存启动项失败: ${r.error}`),!1)}catch(e){return n.error(`保存启动项失败: ${e.message}`),!1}}async function ve(e){try{let t=await(await fetch(`/api/config/save-ai-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({aiMaxToolIterations:e.aiMaxToolIterations})})).json();return t.success?(M.value=Number(t.aiMaxToolIterations)||e.aiMaxToolIterations,!0):(n.error(`${u(`@D50BB:保存 AI 设置失败: `)}${t.error}`),!1)}catch(e){return n.error(`${u(`@D50BB:保存 AI 设置失败: `)}${e.message}`),!1}}async function ye(e){try{let t=await(await fetch(`/api/config/save-models`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({models:e})})).json();return t.success?(j.value=e,!0):(n.error(`${u(`@D50BB:保存模型失败: `)}${t.error}`),!1)}catch(e){return n.error(`${u(`@D50BB:保存模型失败: `)}${e.message}`),!1}}async function $(e){try{let t=await(await fetch(`/api/config/save-general-settings`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})).json();if(t.success){if(e.theme&&(k.value=e.theme,z(e.theme)),e.locale){A.value=e.locale,l(e.locale);let t=m();t.currentLocale=e.locale}return(e.taskExecutor===`claude`||e.taskExecutor===`opencode`)&&(N.value=e.taskExecutor),!0}return n.error(`保存通用设置失败: ${t.error}`),!1}catch(e){return n.error(`保存通用设置失败: ${e.message}`),!1}}return{models:j,aiMaxToolIterations:M,taskExecutor:N,defaultCommitMessage:e,descriptionTemplates:i,scopeTemplates:o,messageTemplates:s,commandTemplates:c,lockedFiles:d,customCommands:f,orchestrations:p,startupItems:h,startupAutoRun:g,afterQuickPushAction:_,isLoading:v,isLoaded:y,configLoadError:b,configFilePath:x,hasConfigLoadError:te,currentDirectory:S,config:V,autoClosePushModal:C,autoSetDefaultMessage:w,isStandardCommit:T,skipHooks:E,autoQuickPushOnEnter:D,pullBeforePush:O,theme:k,locale:A,ui:F,isUiLoaded:I,aiDiffSummaryEnabled:R,loadConfig:H,setCurrentDirectory:L,openSystemConfigFile:ne,saveTemplate:ie,saveModels:ye,saveAiSettings:ve,saveGeneralSettings:$,saveUiSettings:q,setAiDiffSummaryEnabled:Y,resetUiLayout:J,applyTheme:z,toggleTheme:B,saveDefaultMessage:X,deleteTemplate:ae,updateTemplate:oe,pinTemplate:se,loadLockedFiles:Z,lockFile:ce,unlockFile:le,isFileLocked:ue,saveCustomCommand:de,deleteCustomCommand:fe,updateCustomCommand:Q,pinCustomCommand:pe,saveOrchestration:me,deleteOrchestration:he,updateOrchestration:ge,saveStartupItems:_e,saveAfterQuickPushAction:re,saveCommitSettings:U}});export{m as n,h as t};
@@ -1,4 +1,4 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{Bn as e,Tn as t,Xn as n,Yn as r,a as i,br as a,pr as o}from"./element-plus-KTmRV-so.js";import{m as s}from"./vendor-92fKgtnz.js";import{n as c}from"./_plugin-vue_export-helper-B7A-NgBp.js";import{t as ee}from"./socket-io-TBtw0msS.js";import{t as te}from"./configStore-Dx84lvTX.js";var l=new Set([`5173`,`4173`,`5544`]),u=3e3;function d(){if(typeof window>`u`)return u;let e=window.location.port||`80`;if(l.has(e)){{let e=5546;if(!Number.isNaN(e))return e}return u}let t=parseInt(e,10);return Number.isNaN(t)?u:t}var f={PROCESS_INIT_FAILED:()=>c(`@PUSH:未能启动 git 进程(Windows 错误 0xC0000142:系统加载 DLL 失败)。这通常是系统的一次性瞬时故障,不是仓库的问题——请直接重试推送。`),PROCESS_DLL_NOT_FOUND:()=>c(`@PUSH:未能启动 git 进程(Windows 错误 0xC0000135:缺少依赖 DLL)。请检查 Git 安装是否完整,必要时重装 Git for Windows。`),PROCESS_NO_MEMORY:()=>c(`@PUSH:系统内存不足,git 进程未能启动(Windows 错误 0xC0000017)。请关闭一些程序后重试。`),PROCESS_CRASHED:()=>c(`@PUSH:git 进程崩溃(Windows 错误 0xC0000005:访问冲突),没有产生任何输出。请重试;若反复出现,检查安全软件是否拦截了 git。`),PROCESS_INTERRUPTED:()=>c(`@PUSH:推送已被中断(Windows 错误 0xC000013A)。`),GIT_NOT_FOUND:()=>c(`@PUSH:找不到 git 命令,请先安装 Git 并确保它在 PATH 中。`),PROCESS_EXITED:e=>c(`@PUSH:git 进程异常退出(退出码 {code}),且没有产生任何输出——通常是进程未能成功启动,请重试。`,{code:p(e.exitCode)})};function p(e){if(typeof e!=`number`||!Number.isFinite(e))return String(e);let t=e>>>0;return t>=2147483648?`0x${t.toString(16).toUpperCase()}`:String(t)}function ne(e){if(!e)return c(`@PUSH:未知错误`);let t=e.errorCode?f[e.errorCode]:void 0;return t?t(e):e.error||c(`@PUSH:未知错误`)}o(),e();var m=800,re=2e3,ie=d(),ae=`chore: init`,h=s(`git`,()=>{let e=te(),o=a(``),s=a([]),l=a(``),u=a(``),d=a(!1),f=a(!1),p=a(!1),h=a(0),g=a(``),_=a(!1),v=a([]),y=a(!1),oe=a(``),se=a(!1),ce=t(()=>v.value.length>1),b=a([]),x=a(!1),S=a(!1),C=a(!1),w=a(!1),le=a(!1),T=a(0),E=a(0),D=a(!1),O=a(``),ue=a(0),k=a(``),A=a(null),j=a(``),de=a(``),M=a([]),fe=a({staged:[],unstaged:[],untracked:[]}),N=a([]),P=a(!1),F=a(!1),I=a(!1),L=a(!1),R=a(!1),pe=a(1),me=a(!0),he=a(0),ge=0,_e=a([]),ve=a(!1),ye=a(!1),z=a(!1),B=a(!1);function be(){o.value=``,s.value=[],l.value=``,u.value=``,d.value=!1,f.value=!1,p.value=!1,h.value=0,T.value=0,E.value=0,D.value=!1,O.value=``,ue.value=0,x.value=!1,S.value=!1,C.value=!1,w.value=!1,g.value=``,_.value=!1,v.value=[],y.value=!1,oe.value=``,se.value=!1,b.value=[],M.value=[],fe.value={staged:[],unstaged:[],untracked:[]},N.value=[],P.value=!1,F.value=!1,I.value=!1,L.value=!1,R.value=!1,pe.value=1,me.value=!0,he.value=0}async function V(e=!1,t=!1){if(p.value)try{console.log(c(`@C298B:获取分支状态...`));let n=`/api/branch-status`,r=[];e&&r.push(`force=true`),t&&r.push(`countOnly=true`),r.length>0&&(n+=`?`+r.join(`&`));let i=await(await fetch(n)).json();if(i){let e=T.value,t=E.value,n=D.value,r=O.value;if(T.value=i.ahead||0,E.value=i.behind||0,D.value=i.hasUpstream||!1,O.value=i.upstreamBranch||``,console.log(`${c(`@C298B:分支状态更新:领先 `)}${T.value}${c(`@C298B: 个提交,落后 `)}${E.value}${c(`@C298B: 个提交,上游分支:`)}${D.value?O.value:c(`@C298B:无`)}`),T.value!==e||E.value!==t||D.value!==n||O.value!==r){let n=Date.now();n-ge>=re?(ge=n,console.log(`[getBranchStatus] 检测到分支状态变化 (ahead: ${e}→${T.value}, behind: ${t}→${E.value}, upstream: ${r||`无`}→${O.value||`无`}), 自动刷新右侧提交历史`),W(!1)):console.log(`[getBranchStatus] 分支状态变化但在 ${re}ms 节流窗口内,跳过自动刷新`)}}}catch(e){console.error(`获取分支状态失败:`,e),T.value=0,E.value=0,D.value=!1,O.value=``}}async function xe(){let e=Date.now();if(e-h.value<1e3)return console.log(`使用缓存的Git仓库状态:`,p.value?`是`:c(`@C298B:不是`)),p.value;try{let t=await(await fetch(`/api/current_directory`)).json();return p.value=t.isGitRepo===!0,h.value=e,console.log(`${c(`@C298B:当前目录`)}${p.value?c(`@C298B:是`):c(`@C298B:不是`)}${c(`@C298B:Git仓库`)}`),p.value}catch(t){return console.error(`检查Git仓库状态失败:`,t),p.value=!1,h.value=e,!1}}async function H(e=!1){try{let t=await(await fetch(e?`/api/branch?force=true`:`/api/branch`)).json();t.branch&&(o.value=t.branch,console.log(`${c(`@C298B:当前分支更新为: `)}${t.branch}${e?c(`@C298B: (强制刷新)`):``}`))}catch(e){console.error(`获取分支信息失败:`,e)}}async function U(){if(p.value)try{console.log(c(`@C298B:获取所有分支...`));let e=await(await fetch(`/api/branches`)).json();e.branches&&Array.isArray(e.branches)&&(s.value=e.branches,ue.value=Date.now(),console.log(`${c(`@C298B:获取到`)}${e.branches.length}${c(`@C298B:个分支`)}`))}catch(e){console.error(`获取所有分支信息失败:`,e)}}async function Se(e){console.log(`切换到分支:`,e);try{d.value=!0;let t=await(await fetch(`/api/checkout`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({branch:e})})).json();return t.success?(i({message:`${c(`@C298B:已切换到分支: `)}${t.branch||e}`,type:`success`}),await H(!0),await V(!0),!0):(i({message:`${c(`@C298B:切换分支失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:切换分支失败: `)}${e.message}`,type:`error`}),!1}finally{d.value=!1}}async function Ce(){try{let e=await(await fetch(`/api/user-info`)).json();l.value=e.name||``,u.value=e.email||``}catch(e){console.error(`获取用户信息失败:`,e)}}async function we(e,t){if(!e.trim())return i({message:c(`@C298B:分支名称不能为空`),type:`warning`}),!1;try{f.value=!0;let n=await(await fetch(`/api/create-branch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({newBranchName:e,baseBranch:t||o.value})})).json();return n.success?(i({message:`${c(`@C298B:已创建并切换到分支: `)}${e}`,type:`success`}),await H(!0),await V(!0),await U(),!0):(i({message:`${c(`@C298B:创建分支失败: `)}${n.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:创建分支失败: `)}${e.message}`,type:`error`}),!1}finally{f.value=!1}}async function Te(){try{let e=await(await fetch(`/api/clear-user-config`,{method:`POST`})).json();return e.success?(l.value=``,u.value=``,i({message:c(`@C298B:已清除Git用户配置`),type:`success`}),!0):(i({message:`${c(`@C298B:清除配置失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:清除配置失败: `)}${e.message}`,type:`error`}),!1}}async function Ee(e,t){try{let n=await(await fetch(`/api/restore-user-config`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e,email:t})})).json();return n.success?(l.value=e,u.value=t,i({message:c(`@C298B:已恢复Git用户配置`),type:`success`}),!0):(i({message:`${c(`@C298B:恢复配置失败: `)}${n.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:恢复配置失败: `)}${e.message}`,type:`error`}),!1}}async function De(){if(!p.value)return i({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),{success:!1,needsMerge:!1,error:c(`@C298B:当前目录不是Git仓库`),fullError:``,pullOutput:``};try{S.value=!0;let e=await(await fetch(`/api/pull`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:拉取成功`),type:`success`}),await Promise.all([V(!0),U(),Me()]),{success:!0,hadChanges:!0}):{success:!1,needsMerge:e.needsMerge||!1,error:e.error||``,fullError:e.fullError||e.error||``,pullOutput:e.pullOutput||``}}catch(e){return{success:!1,needsMerge:!1,error:e.message,fullError:e.message,pullOutput:``}}finally{S.value=!1}}async function Oe(){if(!p.value)return!1;if(!D.value)return console.log(`[bootFetch] no upstream, skip`),!1;try{C.value=!0;let e=E.value;console.log(`[bootFetch] start silent fetch --all, beforeBehind=${e}`);let t=await(await fetch(`/api/fetch-all`,{method:`POST`})).json();if(!t.success)return console.warn(`[bootFetch] fetch --all failed:`,t.error),!1;await V(!0);let n=E.value,r=n<e;return console.log(`[bootFetch] afterBehind=${n}, hasNewRemoteCommits=${r}`),r?(await W(!0),!0):!1}catch(e){return console.warn(`[bootFetch] silent fetch error (ignored):`,e.message),!1}finally{C.value=!1}}async function ke(){if(!p.value)return i({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),!1;try{C.value=!0;let e=await(await fetch(`/api/fetch-all`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:获取所有远程分支信息成功`),type:`success`}),await Promise.all([V(),U()]),!0):(i({message:`${c(`@C298B:获取远程分支信息失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:获取远程分支信息失败: `)}${e.message}`,type:`error`}),!1}finally{C.value=!1}}async function Ae(){A.value&&(pt(),A.value.disconnect());try{let e=`http://localhost:${ie}`;if(console.log(`尝试连接Socket.IO服务器:`,e),A.value=ee(e,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:[`websocket`,`polling`]}),!A.value){console.error(`Socket.IO初始化失败: socket为null`);return}console.log(c(`@C298B:Socket.IO客户端已创建,开始注册事件监听器...`)),A.value.on(`connect`,()=>{console.log(`✅ Socket.IO连接成功,事件监听器已生效,Socket ID:`,A.value?.id)}),A.value.on(`project_info`,e=>{j.value=e.projectPath,de.value=e.projectRoomId,console.log(`${c(`@C298B:当前项目: `)}${e.projectPath}`),console.log(`${c(`@C298B:房间ID: `)}${e.projectRoomId}`)}),A.value.on(`project_changed`,e=>{console.log(`${c(`@C298B:项目已切换: `)}${e.oldProjectPath} -> ${e.newProjectPath}`),j.value=e.newProjectPath,de.value=e.newProjectRoomId,A.value&&A.value.emit(`join_room`,e.newProjectRoomId),console.log(`${c(`@C298B:已加入新项目房间: `)}${e.newProjectRoomId}`)}),A.value.on(`disconnect`,e=>{console.log(`与Socket.IO服务器断开连接:`,e)}),A.value.on(`git_status_update`,e=>{if(console.log(`✅ 成功监听到 git_status_update 事件:`,new Date().toLocaleTimeString()),console.log(`git_status_update data ==>`,e),console.log(`currentProjectPath.value ==>`,j.value),console.log(`data.projectPath ==>`,e.projectPath),e.projectPath&&j.value&&e.projectPath!==j.value){console.log(`${c(`@C298B:忽略不同项目的状态更新: `)}${e.projectPath}`);return}console.log(c(`@C298B:正在更新 Git 文件状态...`)),e.porcelain!==void 0&&je(e.porcelain)}),A.value.on(`connect_error`,e=>{console.error(`Socket连接错误:`,e.message)}),A.value.on(`connect_timeout`,()=>{console.error(c(`@C298B:Socket连接超时`))}),A.value.on(`reconnect`,e=>{console.log(`${c(`@C298B:Socket重连成功,尝试次数: `)}${e}`)}),A.value.on(`reconnect_attempt`,e=>{console.log(`${c(`@C298B:Socket尝试重连,第 `)}${e}${c(`@C298B: 次尝试`)}`)}),A.value.on(`reconnect_error`,e=>{console.error(`Socket重连错误:`,e.message)}),A.value.on(`reconnect_failed`,()=>{console.error(c(`@C298B:Socket重连失败,已达到最大重试次数`))}),console.log(c(`@C298B:Socket.IO事件监听器注册完成:connect, project_info, project_changed, git_status_update, monitoring_status`)),A.value&&!A.value.connected&&(console.log(c(`@C298B:Socket未连接,尝试手动连接...`)),A.value.connect())}catch(e){console.error(`Socket.IO连接初始化失败:`,e)}}function je(e){if(e===void 0||e===``){N.value=[];return}let t=e.split(`
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{Bn as e,Tn as t,Xn as n,Yn as r,a as i,br as a,pr as o}from"./element-plus-KTmRV-so.js";import{m as s}from"./vendor-dO4B7wQf.js";import{n as c}from"./_plugin-vue_export-helper-C8OE7U9H.js";import{t as ee}from"./socket-io-TBtw0msS.js";import{t as te}from"./configStore-CuMElTgV.js";var l=new Set([`5173`,`4173`,`5544`]),u=3e3;function d(){if(typeof window>`u`)return u;let e=window.location.port||`80`;if(l.has(e)){{let e=5545;if(!Number.isNaN(e))return e}return u}let t=parseInt(e,10);return Number.isNaN(t)?u:t}var f={PROCESS_INIT_FAILED:()=>c(`@PUSH:未能启动 git 进程(Windows 错误 0xC0000142:系统加载 DLL 失败)。这通常是系统的一次性瞬时故障,不是仓库的问题——请直接重试推送。`),PROCESS_DLL_NOT_FOUND:()=>c(`@PUSH:未能启动 git 进程(Windows 错误 0xC0000135:缺少依赖 DLL)。请检查 Git 安装是否完整,必要时重装 Git for Windows。`),PROCESS_NO_MEMORY:()=>c(`@PUSH:系统内存不足,git 进程未能启动(Windows 错误 0xC0000017)。请关闭一些程序后重试。`),PROCESS_CRASHED:()=>c(`@PUSH:git 进程崩溃(Windows 错误 0xC0000005:访问冲突),没有产生任何输出。请重试;若反复出现,检查安全软件是否拦截了 git。`),PROCESS_INTERRUPTED:()=>c(`@PUSH:推送已被中断(Windows 错误 0xC000013A)。`),GIT_NOT_FOUND:()=>c(`@PUSH:找不到 git 命令,请先安装 Git 并确保它在 PATH 中。`),PROCESS_EXITED:e=>c(`@PUSH:git 进程异常退出(退出码 {code}),且没有产生任何输出——通常是进程未能成功启动,请重试。`,{code:p(e.exitCode)})};function p(e){if(typeof e!=`number`||!Number.isFinite(e))return String(e);let t=e>>>0;return t>=2147483648?`0x${t.toString(16).toUpperCase()}`:String(t)}function ne(e){if(!e)return c(`@PUSH:未知错误`);let t=e.errorCode?f[e.errorCode]:void 0;return t?t(e):e.error||c(`@PUSH:未知错误`)}o(),e();var m=800,re=2e3,ie=d(),ae=`chore: init`,h=s(`git`,()=>{let e=te(),o=a(``),s=a([]),l=a(``),u=a(``),d=a(!1),f=a(!1),p=a(!1),h=a(0),g=a(``),_=a(!1),v=a([]),y=a(!1),oe=a(``),se=a(!1),ce=t(()=>v.value.length>1),b=a([]),x=a(!1),S=a(!1),C=a(!1),w=a(!1),le=a(!1),T=a(0),E=a(0),D=a(!1),O=a(``),ue=a(0),k=a(``),A=a(null),j=a(``),de=a(``),M=a([]),fe=a({staged:[],unstaged:[],untracked:[]}),N=a([]),P=a(!1),F=a(!1),I=a(!1),L=a(!1),R=a(!1),pe=a(1),me=a(!0),he=a(0),ge=0,_e=a([]),ve=a(!1),ye=a(!1),z=a(!1),B=a(!1);function be(){o.value=``,s.value=[],l.value=``,u.value=``,d.value=!1,f.value=!1,p.value=!1,h.value=0,T.value=0,E.value=0,D.value=!1,O.value=``,ue.value=0,x.value=!1,S.value=!1,C.value=!1,w.value=!1,g.value=``,_.value=!1,v.value=[],y.value=!1,oe.value=``,se.value=!1,b.value=[],M.value=[],fe.value={staged:[],unstaged:[],untracked:[]},N.value=[],P.value=!1,F.value=!1,I.value=!1,L.value=!1,R.value=!1,pe.value=1,me.value=!0,he.value=0}async function V(e=!1,t=!1){if(p.value)try{console.log(c(`@C298B:获取分支状态...`));let n=`/api/branch-status`,r=[];e&&r.push(`force=true`),t&&r.push(`countOnly=true`),r.length>0&&(n+=`?`+r.join(`&`));let i=await(await fetch(n)).json();if(i){let e=T.value,t=E.value,n=D.value,r=O.value;if(T.value=i.ahead||0,E.value=i.behind||0,D.value=i.hasUpstream||!1,O.value=i.upstreamBranch||``,console.log(`${c(`@C298B:分支状态更新:领先 `)}${T.value}${c(`@C298B: 个提交,落后 `)}${E.value}${c(`@C298B: 个提交,上游分支:`)}${D.value?O.value:c(`@C298B:无`)}`),T.value!==e||E.value!==t||D.value!==n||O.value!==r){let n=Date.now();n-ge>=re?(ge=n,console.log(`[getBranchStatus] 检测到分支状态变化 (ahead: ${e}→${T.value}, behind: ${t}→${E.value}, upstream: ${r||`无`}→${O.value||`无`}), 自动刷新右侧提交历史`),W(!1)):console.log(`[getBranchStatus] 分支状态变化但在 ${re}ms 节流窗口内,跳过自动刷新`)}}}catch(e){console.error(`获取分支状态失败:`,e),T.value=0,E.value=0,D.value=!1,O.value=``}}async function xe(){let e=Date.now();if(e-h.value<1e3)return console.log(`使用缓存的Git仓库状态:`,p.value?`是`:c(`@C298B:不是`)),p.value;try{let t=await(await fetch(`/api/current_directory`)).json();return p.value=t.isGitRepo===!0,h.value=e,console.log(`${c(`@C298B:当前目录`)}${p.value?c(`@C298B:是`):c(`@C298B:不是`)}${c(`@C298B:Git仓库`)}`),p.value}catch(t){return console.error(`检查Git仓库状态失败:`,t),p.value=!1,h.value=e,!1}}async function H(e=!1){try{let t=await(await fetch(e?`/api/branch?force=true`:`/api/branch`)).json();t.branch&&(o.value=t.branch,console.log(`${c(`@C298B:当前分支更新为: `)}${t.branch}${e?c(`@C298B: (强制刷新)`):``}`))}catch(e){console.error(`获取分支信息失败:`,e)}}async function U(){if(p.value)try{console.log(c(`@C298B:获取所有分支...`));let e=await(await fetch(`/api/branches`)).json();e.branches&&Array.isArray(e.branches)&&(s.value=e.branches,ue.value=Date.now(),console.log(`${c(`@C298B:获取到`)}${e.branches.length}${c(`@C298B:个分支`)}`))}catch(e){console.error(`获取所有分支信息失败:`,e)}}async function Se(e){console.log(`切换到分支:`,e);try{d.value=!0;let t=await(await fetch(`/api/checkout`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({branch:e})})).json();return t.success?(i({message:`${c(`@C298B:已切换到分支: `)}${t.branch||e}`,type:`success`}),await H(!0),await V(!0),!0):(i({message:`${c(`@C298B:切换分支失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:切换分支失败: `)}${e.message}`,type:`error`}),!1}finally{d.value=!1}}async function Ce(){try{let e=await(await fetch(`/api/user-info`)).json();l.value=e.name||``,u.value=e.email||``}catch(e){console.error(`获取用户信息失败:`,e)}}async function we(e,t){if(!e.trim())return i({message:c(`@C298B:分支名称不能为空`),type:`warning`}),!1;try{f.value=!0;let n=await(await fetch(`/api/create-branch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({newBranchName:e,baseBranch:t||o.value})})).json();return n.success?(i({message:`${c(`@C298B:已创建并切换到分支: `)}${e}`,type:`success`}),await H(!0),await V(!0),await U(),!0):(i({message:`${c(`@C298B:创建分支失败: `)}${n.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:创建分支失败: `)}${e.message}`,type:`error`}),!1}finally{f.value=!1}}async function Te(){try{let e=await(await fetch(`/api/clear-user-config`,{method:`POST`})).json();return e.success?(l.value=``,u.value=``,i({message:c(`@C298B:已清除Git用户配置`),type:`success`}),!0):(i({message:`${c(`@C298B:清除配置失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:清除配置失败: `)}${e.message}`,type:`error`}),!1}}async function Ee(e,t){try{let n=await(await fetch(`/api/restore-user-config`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e,email:t})})).json();return n.success?(l.value=e,u.value=t,i({message:c(`@C298B:已恢复Git用户配置`),type:`success`}),!0):(i({message:`${c(`@C298B:恢复配置失败: `)}${n.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:恢复配置失败: `)}${e.message}`,type:`error`}),!1}}async function De(){if(!p.value)return i({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),{success:!1,needsMerge:!1,error:c(`@C298B:当前目录不是Git仓库`),fullError:``,pullOutput:``};try{S.value=!0;let e=await(await fetch(`/api/pull`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:拉取成功`),type:`success`}),await Promise.all([V(!0),U(),Me()]),{success:!0,hadChanges:!0}):{success:!1,needsMerge:e.needsMerge||!1,error:e.error||``,fullError:e.fullError||e.error||``,pullOutput:e.pullOutput||``}}catch(e){return{success:!1,needsMerge:!1,error:e.message,fullError:e.message,pullOutput:``}}finally{S.value=!1}}async function Oe(){if(!p.value)return!1;if(!D.value)return console.log(`[bootFetch] no upstream, skip`),!1;try{C.value=!0;let e=E.value;console.log(`[bootFetch] start silent fetch --all, beforeBehind=${e}`);let t=await(await fetch(`/api/fetch-all`,{method:`POST`})).json();if(!t.success)return console.warn(`[bootFetch] fetch --all failed:`,t.error),!1;await V(!0);let n=E.value,r=n<e;return console.log(`[bootFetch] afterBehind=${n}, hasNewRemoteCommits=${r}`),r?(await W(!0),!0):!1}catch(e){return console.warn(`[bootFetch] silent fetch error (ignored):`,e.message),!1}finally{C.value=!1}}async function ke(){if(!p.value)return i({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),!1;try{C.value=!0;let e=await(await fetch(`/api/fetch-all`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:获取所有远程分支信息成功`),type:`success`}),await Promise.all([V(),U()]),!0):(i({message:`${c(`@C298B:获取远程分支信息失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:获取远程分支信息失败: `)}${e.message}`,type:`error`}),!1}finally{C.value=!1}}async function Ae(){A.value&&(pt(),A.value.disconnect());try{let e=`http://localhost:${ie}`;if(console.log(`尝试连接Socket.IO服务器:`,e),A.value=ee(e,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:[`websocket`,`polling`]}),!A.value){console.error(`Socket.IO初始化失败: socket为null`);return}console.log(c(`@C298B:Socket.IO客户端已创建,开始注册事件监听器...`)),A.value.on(`connect`,()=>{console.log(`✅ Socket.IO连接成功,事件监听器已生效,Socket ID:`,A.value?.id)}),A.value.on(`project_info`,e=>{j.value=e.projectPath,de.value=e.projectRoomId,console.log(`${c(`@C298B:当前项目: `)}${e.projectPath}`),console.log(`${c(`@C298B:房间ID: `)}${e.projectRoomId}`)}),A.value.on(`project_changed`,e=>{console.log(`${c(`@C298B:项目已切换: `)}${e.oldProjectPath} -> ${e.newProjectPath}`),j.value=e.newProjectPath,de.value=e.newProjectRoomId,A.value&&A.value.emit(`join_room`,e.newProjectRoomId),console.log(`${c(`@C298B:已加入新项目房间: `)}${e.newProjectRoomId}`)}),A.value.on(`disconnect`,e=>{console.log(`与Socket.IO服务器断开连接:`,e)}),A.value.on(`git_status_update`,e=>{if(console.log(`✅ 成功监听到 git_status_update 事件:`,new Date().toLocaleTimeString()),console.log(`git_status_update data ==>`,e),console.log(`currentProjectPath.value ==>`,j.value),console.log(`data.projectPath ==>`,e.projectPath),e.projectPath&&j.value&&e.projectPath!==j.value){console.log(`${c(`@C298B:忽略不同项目的状态更新: `)}${e.projectPath}`);return}console.log(c(`@C298B:正在更新 Git 文件状态...`)),e.porcelain!==void 0&&je(e.porcelain)}),A.value.on(`connect_error`,e=>{console.error(`Socket连接错误:`,e.message)}),A.value.on(`connect_timeout`,()=>{console.error(c(`@C298B:Socket连接超时`))}),A.value.on(`reconnect`,e=>{console.log(`${c(`@C298B:Socket重连成功,尝试次数: `)}${e}`)}),A.value.on(`reconnect_attempt`,e=>{console.log(`${c(`@C298B:Socket尝试重连,第 `)}${e}${c(`@C298B: 次尝试`)}`)}),A.value.on(`reconnect_error`,e=>{console.error(`Socket重连错误:`,e.message)}),A.value.on(`reconnect_failed`,()=>{console.error(c(`@C298B:Socket重连失败,已达到最大重试次数`))}),console.log(c(`@C298B:Socket.IO事件监听器注册完成:connect, project_info, project_changed, git_status_update, monitoring_status`)),A.value&&!A.value.connected&&(console.log(c(`@C298B:Socket未连接,尝试手动连接...`)),A.value.connect())}catch(e){console.error(`Socket.IO连接初始化失败:`,e)}}function je(e){if(e===void 0||e===``){N.value=[];return}let t=e.split(`
2
2
  `),n=[];for(let e of t){let t=e.match(/^([ MADRCU\?]{2})\s+(.+)$/);if(t){let e=``,r=t[1],i=r.charAt(0),a=r.charAt(1);e=r===`UU`||r===`AA`||r===`DD`||r===`AU`||r===`UA`||r===`DU`||r===`UD`?`conflicted`:i===`A`||i===`M`||i===`D`||i===`R`?`added`:i===` `&&a===`M`?`modified`:i===` `&&a===`D`?`deleted`:i===` `&&a===`A`?`intent-to-add`:r===`??`?`untracked`:`other`,n.push({path:t[2],type:e})}}N.value=n}async function W(e=!0){if(!p.value){console.log(c(`@C298B:当前目录不是Git仓库,跳过加载提交历史`));return}try{P.value=!0,console.log(c(`@C298B:开始加载提交历史...`));let e=new Date().getTime(),t=await(await fetch(`/api/log?page=1&with_parents=true&_t=${e}`)).json();t&&t.data&&Array.isArray(t.data)?(M.value=[...t.data],console.log(`${c(`@C298B:提交历史加载完成,共 `)}${M.value.length}${c(`@C298B: 条记录`)}`)):(console.warn(`API返回的提交历史格式不正确:`,t),M.value=[])}catch(t){console.error(`获取提交历史失败:`,t),e&&i({message:`${c(`@C298B:获取提交历史失败: `)}${t.message}`,type:`error`})}finally{P.value=!1}}async function Me(){console.log(c(`@C298B:刷新提交历史...`)),pe.value=1,me.value=!1,await W(!0),he.value=M.value.length,console.log(c(`@C298B:提交历史刷新完成`))}async function G(){if(!p.value){console.log(c(`@C298B:当前目录不是Git仓库,跳过加载Git状态`));return}try{F.value=!0,await K()}catch(e){console.error(`获取Git状态失败:`,e),i({message:`${c(`@C298B:获取Git状态失败: `)}${e.message}`,type:`error`})}finally{F.value=!1}}async function K(){if(console.log(c(`@C298B:开始获取Git状态(porcelain格式)...`)),!p.value){console.log(c(`@C298B:当前目录不是Git仓库,跳过加载Git状态`));return}try{let e=await(await fetch(`/api/status_porcelain`)).json();e.status===void 0?N.value=[]:je(e.status),le.value=!!e.isMergeInProgress,e.isMergeInProgress&&e.mergeMessage&&!k.value&&(k.value=String(e.mergeMessage))}catch(e){console.error(`获取Git状态(porcelain)失败:`,e),i({message:`${c(`@C298B:获取Git状态(porcelain)失败: `)}${e.message}`,type:`error`}),N.value=[]}}async function Ne(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{I.value=!0;let t=N.value.filter(t=>{let n=t.path.replace(/\\/g,`/`);return!e.lockedFiles.some(e=>{let t=e.replace(/\\/g,`/`);return n===t})});if(t.length===0)return i({message:c(`@C298B:没有需要暂存的文件(所有文件都被锁定)`),type:`warning`}),!1;if(t.length===N.value.length){let e=await(await fetch(`/api/add`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:文件已添加到暂存区`),type:`success`}),await K(),!0):(i({message:`${c(`@C298B:添加文件失败: `)}${e.error}`,type:`error`}),!1)}{let e=await(await fetch(`/api/add-filtered`,{method:`POST`})).json();if(e.success){let e=N.value.length-t.length,n=`${c(`@C298B:已添加 `)}${t.length}${c(`@C298B: 个文件到暂存区`)}`;return e>0&&(n+=`${c(`@C298B:,跳过 `)}${e}${c(`@C298B: 个锁定文件`)}`),i({message:n,type:`success`}),await K(),!0}return i({message:`${c(`@C298B:添加文件失败: `)}${e.error}`,type:`error`}),!1}}catch(e){return i({message:`${c(`@C298B:添加文件失败: `)}${e.message}`,type:`error`}),!1}finally{I.value=!1}}async function Pe(e={}){let{silent:t=!1}=e;if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{I.value=!0;let e=await(await fetch(`/api/add-all`,{method:`POST`})).json();return e.success?(t||i({message:c(`@C298B:所有文件已添加到暂存区`),type:`success`}),await K(),!0):(i({message:`${c(`@C298B:添加文件失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:添加文件失败: `)}${e.message}`,type:`error`}),!1}finally{I.value=!1}}async function Fe(e){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{I.value=!0;let t=await(await fetch(`/api/add-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?(i({message:c(`@C298B:文件已暂存`),type:`success`}),G(),!0):(i({message:`${c(`@C298B:暂存文件失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:暂存文件失败: `)}${e.message}`,type:`error`}),!1}finally{I.value=!1}}async function Ie(e){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{R.value=!0;let t=await(await fetch(`/api/unstage-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePath:e})})).json();return t.success?(i({message:c(`@C298B:已取消暂存文件`),type:`success`}),G(),!0):(i({message:`${c(`@C298B:取消暂存失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:取消暂存失败: `)}${e.message}`,type:`error`}),!1}finally{R.value=!1}}function q(e){return new Promise(t=>setTimeout(t,e))}async function J(e,t=!1,n={}){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;let{autoRefresh:r=!0}=n;try{L.value=!0;let n=await(await fetch(`/api/commit`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({message:e,hasNewlines:e.includes(`
3
3
  `),noVerify:t})})).json();if(n.success){let e=Array.isArray(n.skippedLockedFiles)?n.skippedLockedFiles:[],t=c(`@C298B:提交成功`);if(e.length>0&&(t+=c(`@C298B:,已跳过 `)+e.length+c(`@C298B: 个锁定文件`)),i({message:t,type:`success`}),r&&(await K(),await W(!1),V(!0)),g.value&&!D.value&&o.value)try{let e=await(await fetch(`/api/git/push-with-upstream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({branch:o.value})})).json();e.success?(D.value=!0,O.value=`origin/${o.value}`,T.value=0,E.value=0,i.success(c(`@C298B:已自动推送并设置上游分支`)),await U(),V(!0)):i.warning(`${c(`@C298B:自动推送建上游失败: `)}${e.error||``}`)}catch(e){i.warning(`${c(`@C298B:自动推送建上游失败: `)}${e.message}`)}return!0}{let e=Array.isArray(n.skippedLockedFiles)?n.skippedLockedFiles:[],t=n.error||``;return e.length>0&&(t+=`(${c(`@C298B:跳过 `)}${e.length}${c(`@C298B: 个锁定文件`)})`),i({message:`${c(`@C298B:commitChanges 提交失败: `)}${t}`,type:`error`}),!1}}catch(e){return i({message:`${c(`@C298B:提交失败: `)}${e.message}`,type:`error`}),!1}finally{L.value=!1}}async function Le(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{x.value=!0;let e=await(await fetch(`/api/push`,{method:`POST`})).json();return e.success?(T.value=0,E.value=0,await Promise.all([G(),W()]),console.log(`推送成功,分支状态已设置为同步 (ahead=0, behind=0)`),!0):(e.errorCode===`EMPTY_REPO`?i({message:e.error||c(`@C298B:当前仓库没有任何提交,请先暂存并提交至少一个文件后再推送。`),type:`warning`}):i({message:`${c(`@C298B:推送失败: `)}${ne(e)}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),!1}finally{x.value=!1}}async function Re(e,t){return p.value?new Promise(n=>{try{x.value=!0,fetch(`/api/push-with-progress`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t?{remote:t}:{})}).then(t=>{let r=t.body?.getReader(),a=new TextDecoder;if(!r)throw Error(`无法读取响应流`);(async()=>{try{for(;;){let{done:t,value:o}=await r.read();if(t)break;let s=a.decode(o,{stream:!0}).split(`
4
4
  `);for(let t of s)if(t.startsWith(`data: `))try{let r=JSON.parse(t.slice(6));if(e&&e(r),r.type===`error`){x.value=!1,r.errorCode===`EMPTY_REPO`?i({message:r.error||c(`@C298B:当前仓库没有任何提交,请先暂存并提交至少一个文件后再推送。`),type:`warning`}):i({message:`${c(`@C298B:推送失败: `)}${r.error||c(`@C298B:未知错误`)}`,type:`error`}),n(!1);return}r.type===`complete`&&(x.value=!1,r.success?(T.value=0,E.value=0,Promise.all([G(),W()]),n(!0)):(i({message:`${c(`@C298B:推送失败: `)}${ne(r)}`,type:`error`}),n(!1)))}catch(e){console.error(`解析SSE数据失败:`,e)}}}catch(e){console.error(`读取流失败:`,e),x.value=!1,i({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),n(!1)}})()}).catch(e=>{x.value=!1,i({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),n(!1)})}catch(e){x.value=!1,i({message:`${c(`@C298B:推送失败: `)}${e.message}`,type:`error`}),n(!1)}}):(i.warning(c(`@C298B:当前目录不是Git仓库`)),!1)}async function ze(e,t={}){if(!p.value)return i({message:c(`@C298B:当前目录不是Git仓库`),type:`warning`}),!1;if(!e)return i({message:c(`@C298B:请选择要合并的分支`),type:`warning`}),!1;if(e===o.value)return i({message:c(`@C298B:不能合并当前分支到自身`),type:`warning`}),!1;let n=`Merge branch '${e}' into ${o.value}`;try{w.value=!0;let r=await fetch(`/api/merge`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({branch:e,...t})}),a=await r.json();return r.status===409?(k.value=t.message||n,i({message:c(`@C298B:合并分支时发生冲突,请手动解决`),type:`warning`,duration:5e3}),!1):(k.value=``,a.success?(i({message:`${c(`@C298B:成功合并分支 `)}${e}${c(`@C298B: 到 `)}${o.value}`,type:`success`}),await G(),await V(),!0):(i({message:`${c(`@C298B:合并分支失败: `)}${a.error}`,type:`error`}),!1))}catch(e){return i({message:`${c(`@C298B:合并分支失败: `)}${e.message}`,type:`error`}),!1}finally{w.value=!1}}async function Be(e,t=!1){if(console.log(c(`@C298B:开始暂存并提交操作...`)),!await Ne())return!1;console.log(c(`@C298B:暂存完成,等待Git操作完成...`)),await q(m),console.log(c(`@C298B:开始提交更改...`));let n=await J(e,t);return console.log(c(`@C298B:暂存并提交操作完成`)),n}async function Ve(e,t=!1){try{if(console.log(c(`@C298B:开始暂存文件...`)),!await Ne()||(console.log(c(`@C298B:暂存完成,等待Git操作完成...`)),await q(m),console.log(c(`@C298B:开始提交更改...`)),!await J(e,t)))return!1;console.log(c(`@C298B:提交完成,等待Git操作完成...`)),await q(m),console.log(c(`@C298B:开始推送到远程...`));let n=await Le();return console.log(c(`@C298B:一键推送操作完成,状态已统一刷新`)),n}catch(e){console.error(`一键推送操作失败:`,e);try{(await(await fetch(`/api/remove-lock`,{method:`POST`})).json()).success&&i({message:c(`@C298B:检测到Git锁定文件冲突,已自动清理,请重试操作`),type:`warning`})}catch(e){console.error(`清理锁定文件失败:`,e)}i({message:`${c(`@C298B:操作失败: `)}${e.message}`,type:`error`});try{await Promise.all([G(),W(),V()])}catch(e){console.error(`刷新状态失败:`,e)}return!1}}async function He(e,t=!1){if(!Z.value||Q.value.size===0)return Be(e,t);let n=$.value;return n.length===0?(i.warning(c(`@C298B:请选择要暂存的文件`)),!1):(console.log(c(`@C298B:开始暂存所选文件并提交...`,{n:n.length})),await Dt(n)?(await q(m),J(e,t)):!1)}async function Ue(e,t=!1){if(!Z.value||Q.value.size===0)return Ve(e,t);let n=$.value;return n.length===0?(i.warning(c(`@C298B:请选择要暂存的文件`)),!1):!await Dt(n)||(await q(m),!await J(e,t))?!1:(await q(m),Le())}async function We(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{R.value=!0;let e=await(await fetch(`/api/reset-head`,{method:`POST`})).json();return e.success?(i({message:c(`@C298B:已重置暂存区`),type:`success`}),G(),!0):(i({message:`${c(`@C298B:重置暂存区失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:重置暂存区失败: `)}${e.message}`,type:`error`}),!1}finally{R.value=!1}}async function Ge(e){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{R.value=!0;let t=await(await fetch(`/api/reset-to-remote`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({branch:e})})).json();return t.success?(i({message:`${c(`@C298B:已重置分支 `)}${e}${c(`@C298B: 到远程状态`)}`,type:`success`}),G(),W(),await H(!0),await U(),!0):(i({message:`${c(`@C298B:重置分支失败: `)}${t.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:重置分支失败: `)}${e.message}`,type:`error`}),!1}finally{R.value=!1}}async function Ke(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{R.value=!0;let e=await(await fetch(`/api/discard-all-changes`,{method:`POST`})).json();return e.success?(i.success(c(`@C298B:已清除所有本地更改`)),G(),W(),!0):(i.error(`${c(`@C298B:操作失败: `)}${e.error}`),!1)}catch(e){return i.error(`${c(`@C298B:操作失败: `)}${e.message}`),!1}finally{R.value=!1}}async function qe(e){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;if(!Array.isArray(e)||e.length===0)return i.warning(c(`@C298B:未选择任何文件`)),!1;try{R.value=!0;let t=await(await fetch(`/api/revert_files`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePaths:e})})).json();if(t.success){let n=Number(t?.count??e.length),r=Array.isArray(t?.results)?t.results.filter(e=>!e?.success).map(e=>String(e?.path||``)):[];return r.length>0?i.warning(`${c(`@C298B:已清除 `)}${n-r.length}${c(`@C298B: 个文件,失败 `)}${r.length}${c(`@C298B: 个`)}`):i.success(`${c(`@C298B:已清除 `)}${n}${c(`@C298B: 个所选文件`)}`),G(),W(),!0}return i.error(`${c(`@C298B:操作失败: `)}${t.error}`),!1}catch(e){return i.error(`${c(`@C298B:操作失败: `)}${e.message}`),!1}finally{R.value=!1}}async function Je(){if(p.value)try{_.value=!0,console.log(c(`@C298B:获取远程仓库地址...`));let e=await(await fetch(`/api/remote-url`)).json();e.success?(g.value=e.url||``,console.log(`${c(`@C298B:获取到远程仓库地址: `)}${g.value}`)):(console.warn(`获取远程仓库地址失败:`,e.error),g.value=``)}catch(e){console.error(`获取远程仓库地址失败:`,e),g.value=``}finally{_.value=!1}}async function Ye(){try{let e=await(await fetch(`/api/git-init`,{method:`POST`})).json();return e.success?(await xe(),!0):(i.error(e.error||c(`@C298B:Git仓库初始化失败`)),!1)}catch(e){return i.error(`${c(`@C298B:Git仓库初始化失败: `)}${e.message}`),!1}}async function Xe(e,t=`origin`){try{let n=await(await fetch(`/api/add-remote`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:t,url:e})})).json();return n.success?(await Promise.all([Je(),Y()]),!0):(i.error(n.error||c(`@C298B:添加远程仓库失败`)),!1)}catch(e){return i.error(`${c(`@C298B:添加远程仓库失败: `)}${e.message}`),!1}}async function Y(){if(p.value)try{y.value=!0;let e=await(await fetch(`/api/remotes`)).json();if(e.success){v.value=e.remotes||[],oe.value=e.pushDefault||``;let t=v.value.find(e=>e.isUpstream),n=v.value.find(e=>e.name===`origin`),r=t||n||v.value[0];g.value=r?.fetchUrl||``}}catch(e){console.error(`获取远程仓库列表失败:`,e)}finally{y.value=!1}}async function Ze(){await Promise.all([Y(),V(!0)])}async function Qe(e,t){try{let n=await(await fetch(`/api/remote/rename`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({oldName:e,newName:t})})).json();return n.success?(i.success(c(`@C298B:远程仓库已重命名`)),await Ze(),!0):(i.error(n.error||c(`@C298B:重命名远程仓库失败`)),!1)}catch(e){return i.error(`${c(`@C298B:重命名远程仓库失败: `)}${e.message}`),!1}}async function $e(e){try{let t=await(await fetch(`/api/remote/remove`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e})})).json();return t.success?(i.success(c(`@C298B:远程仓库已删除`)),t.wasUpstream&&i.info(c(`@C298B:已解除当前分支的上游跟踪`)),await Ze(),!0):(i.error(t.error||c(`@C298B:删除远程仓库失败`)),!1)}catch(e){return i.error(`${c(`@C298B:删除远程仓库失败: `)}${e.message}`),!1}}async function et(e,t){try{let n=await(await fetch(`/api/remote/set-url`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e,url:t})})).json();return n.success?(i.success(c(`@C298B:远程地址已更新`)),n.hasExplicitPushUrls&&i.info(c(`@C298B:该远程配置了独立的推送地址,不受本次修改影响`)),await Ze(),!0):(i.error(n.error||c(`@C298B:更新远程地址失败`)),!1)}catch(e){return i.error(`${c(`@C298B:更新远程地址失败: `)}${e.message}`),!1}}async function tt(e,t){try{let n=await(await fetch(`/api/remote/push-urls`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e,pushUrls:t})})).json();return n.success?(i.success(c(`@C298B:推送地址已更新`)),await Y(),!0):(i.error(n.error||c(`@C298B:更新推送地址失败`)),!1)}catch(e){return i.error(`${c(`@C298B:更新推送地址失败: `)}${e.message}`),!1}}async function nt(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{x.value=!0,b.value=[];let e=await(await fetch(`/api/push-all-remotes`,{method:`POST`})).json();if(Array.isArray(e.results)&&(b.value=e.results),e.success)return T.value=0,E.value=0,i.success(c(`@C298B:全部远程推送完成`)),await Promise.all([G(),W(),Y()]),!0;if(Array.isArray(e.results)&&e.results.length>0){let t=e.results.filter(e=>!e.ok);i.error(`${c(`@C298B:部分远程推送失败: `)}${t.map(e=>e.name).join(`, `)}`)}else i.warning(e.error||c(`@C298B:推送失败`));return!1}catch(e){return i.error(`${c(`@C298B:推送失败: `)}${e.message}`),!1}finally{x.value=!1}}async function rt(){try{let e=await(await fetch(`/api/attach-remote-branch`,{method:`POST`})).json();return e.success?(e.attached?(i.success(c(`@C298B:已检出远程分支 {branch} 并建立跟踪`,{branch:e.branch})),await Promise.all([H(!0),U(),V(!0),W(!1),K()])):e.empty&&i.info(c(`@C298B:远程仓库为空,提交首个 commit 后可一键推送建上游`)),e):(i.warning(`${c(`@C298B:关联远程分支失败: `)}${e.error||``}`),e)}catch(e){return i.warning(`${c(`@C298B:关联远程分支失败: `)}${e.message}`),{success:!1,error:e.message}}}async function it(e=ae){return M.value.length>0?`skipped-has-commits`:await Pe({silent:!0})?N.value.some(e=>e.type===`added`)?await J(e.trim()||`chore: init`)?`committed`:`failed`:`skipped-no-files`:`failed`}async function at(){try{let e=await(await fetch(`/api/diff-head`)).json();return e.success?e.diff?(await navigator.clipboard.writeText(e.diff),i({message:c(`@C298B:已复制全量 Diff`),type:`success`}),!0):(i({message:c(`@C298B:没有可复制的 Diff`),type:`warning`}),!1):(i({message:`${c(`@C298B:复制失败: `)}${e.error}`,type:`error`}),!1)}catch(e){return i({message:`${c(`@C298B:复制失败: `)}${e.message}`,type:`error`}),!1}}let ot=[`github.com`,`gitlab.com`,`bitbucket.org`,`gitee.com`,`coding.net`,`codeup.aliyun.com`],st=t(()=>{let e=g.value.trim();if(!e)return null;if(/^https?:\/\//i.test(e))return e.replace(/\.git$/i,``);let t=e.match(/^[\w.-]+@([^:]+):(.+?)(?:\.git)?$/i);if(t){let e=t[1],n=t[2];return ot.includes(e.toLowerCase())?`https://${e}/${n}`:null}let n=e.match(/^ssh:\/\/(?:[\w.-]+@)?([^/:]+)(?::\d+)?\/(.+?)(?:\.git)?$/i);if(n){let e=n[1],t=n[2];return ot.includes(e.toLowerCase())?`https://${e}/${t}`:null}return null}),ct=t(()=>st.value!==null);function lt(){let e=st.value;return e?(window.open(e,`_blank`,`noopener,noreferrer`),!0):(i({message:c(`@C298B:该远程仓库地址无法识别为可访问的网页地址`),type:`warning`}),!1)}async function ut(){if(!g.value)return i({message:c(`@C298B:没有可复制的远程仓库地址`),type:`warning`}),!1;try{return await navigator.clipboard.writeText(g.value),i({message:c(`@C298B:已复制远程仓库地址`),type:`success`}),!0}catch(e){return console.error(`复制远程仓库地址失败:`,e),i({message:`${c(`@C298B:复制失败: `)}${e.message}`,type:`error`}),!1}}async function dt(){if(!g.value)return i({message:c(`@C298B:没有可复制的远程仓库地址`),type:`warning`}),!1;try{let e=`git clone ${g.value}`;return await navigator.clipboard.writeText(e),i({message:c(`@F13B4:已复制克隆命令`),type:`success`}),!0}catch(e){return console.error(`复制克隆命令失败:`,e),i({message:`${c(`@C298B:复制失败: `)}${e.message}`,type:`error`}),!1}}r(()=>{Ae()});function ft(){A.value&&=(pt(),A.value.disconnect(),null)}function pt(){if(A.value)for(let e of[`connect`,`project_info`,`project_changed`,`disconnect`,`git_status_update`,`connect_error`,`connect_timeout`,`reconnect`,`reconnect_attempt`,`reconnect_error`,`reconnect_failed`])try{A.value.off(e)}catch{}}n(()=>{ft()});async function X(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),[];try{ve.value=!0;let e=await(await fetch(`/api/stash-list`)).json();return e.success?(_e.value=e.stashes,e.stashes):(i.error(`${c(`@C298B:获取stash列表失败: `)}${e.error}`),[])}catch(e){return console.error(`获取stash列表失败:`,e),i.error(`${c(`@C298B:获取stash列表失败: `)}${e.message}`),[]}finally{ve.value=!1}}async function mt(e,t=!1,n=!0){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{B.value=!0;let r=await(await fetch(`/api/stash-save`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({message:e,includeUntracked:t,excludeLocked:n})})).json();return r.success?(i.success(r.message),await X(),await G(),!0):(i.warning(r.message),!1)}catch(e){return console.error(`保存stash失败:`,e),i.error(`${c(`@C298B:保存stash失败: `)}${e.message}`),!1}finally{B.value=!1}}async function ht(e,t,n=!1){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;if(!e||e.length===0)return i.warning(c(`@C298B:请选择要储藏的文件`)),!1;try{B.value=!0;let r=await(await fetch(`/api/stash-save-partial`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({files:e,message:t,includeUntracked:n})})).json();return r.success?(i.success(r.message),await X(),await G(),!0):(i.warning(r.message),!1)}catch(e){return console.error(`保存部分stash失败:`,e),i.error(`${c(`@C298B:保存stash失败: `)}${e.message}`),!1}finally{B.value=!1}}async function gt(e,t=!1){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{ye.value=!0;let n=await fetch(`/api/stash-apply`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({stashId:e,pop:t})}),r=await n.json();return n.status===409?(i.warning(c(`@C298B:应用stash时发生冲突,请手动解决`)),!1):r.success?(i.success(r.message),await X(),await G(),!0):(i.error(`${c(`@C298B:应用stash失败: `)}${r.error}`),!1)}catch(e){return console.error(`应用stash失败:`,e),i.error(`${c(`@C298B:应用stash失败: `)}${e.message}`),!1}finally{ye.value=!1}}async function _t(e){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{z.value=!0;let t=await(await fetch(`/api/stash-drop`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({stashId:e})})).json();return t.success?(i.success(t.message),await X(),!0):(i.error(`${c(`@C298B:删除stash失败: `)}${t.error}`),!1)}catch(e){return console.error(`删除stash失败:`,e),i.error(`${c(`@C298B:删除stash失败: `)}${e.message}`),!1}finally{z.value=!1}}async function vt(){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;try{z.value=!0;let e=await(await fetch(`/api/stash-clear`,{method:`POST`})).json();return e.success?(i.success(e.message),_e.value=[],!0):(i.error(`${c(`@C298B:清空stash失败: `)}${e.error}`),!1)}catch(e){return console.error(`清空stash失败:`,e),i.error(`${c(`@C298B:清空stash失败: `)}${e.message}`),!1}finally{z.value=!1}}let yt=t(()=>N.value.some(e=>e.type===`conflicted`)),Z=a(!1),Q=a(new Set);function bt(){Z.value=!Z.value,Z.value||(Q.value=new Set)}function xt(){Z.value=!0}function St(){Z.value=!1,Q.value=new Set}function Ct(e){let t=new Set(Q.value);t.has(e)?t.delete(e):t.add(e),Q.value=t}function wt(){Q.value=new Set(N.value.map(e=>e.path))}function Tt(){Q.value=new Set}let $=t(()=>{if(!Z.value)return[];let t=new Set(e.lockedFiles.map(e=>e.replace(/\\/g,`/`))),n=[];for(let e of Q.value){let r=e.replace(/\\/g,`/`);if(t.has(r))continue;let i=N.value.find(t=>t.path===e);i&&[`modified`,`deleted`,`untracked`,`intent-to-add`].includes(i.type)&&n.push(e)}return n}),Et=t(()=>$.value.length>0);async function Dt(e){if(!p.value)return i.warning(c(`@C298B:当前目录不是Git仓库`)),!1;let t=[...new Set(e.filter(e=>typeof e==`string`&&e.length>0))];if(t.length===0)return i.warning(c(`@C298B:请选择要暂存的文件`)),!1;try{I.value=!0;let e=await(await fetch(`/api/add-files`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filePaths:t})})).json();if(e.success){let n=e.successCount??t.length;i.success(n>0?`${c(`@C298B:已暂存 `)}${n}${c(`@C298B: 个所选文件`)}`:c(`@C298B:文件已添加到暂存区`));let r=new Set(Q.value);for(let e of t)r.delete(e);return Q.value=r,await K(),!0}return i.error(`${c(`@C298B:暂存失败: `)}${e.error||``}`),!1}catch(e){return i.error(`${c(`@C298B:暂存失败: `)}${e.message}`),!1}finally{I.value=!1}}return{currentBranch:o,allBranches:s,userName:l,userEmail:u,isChangingBranch:d,isCreatingBranch:f,isGitRepo:p,lastCheckedTime:h,branchAhead:T,branchBehind:E,hasUpstream:D,upstreamBranch:O,lastBranchesTime:ue,remoteUrl:g,isLoadingRemoteUrl:_,remotes:v,isLoadingRemotes:y,pushDefaultRemote:oe,isRemoteManagerVisible:se,hasMultipleRemotes:ce,lastPushAllResults:b,remoteWebUrl:st,isRemoteBrowsable:ct,openRemoteWebUrl:lt,hasConflictedFiles:yt,stashes:_e,isLoadingStashes:ve,isApplyingStash:ye,isDroppingStash:z,isSavingStash:B,log:M,status:fe,fileList:N,isLoadingLog:P,isLoadingStatus:F,isAddingFiles:I,isCommiting:L,isResetting:R,currentPage:pe,hasMoreData:me,totalCommits:he,isPushing:x,isGitPulling:S,isGitFetching:C,isGitMerging:w,isMergeInProgress:le,pendingMergeMessage:k,isSelectionMode:Z,selectedFiles:Q,selectedUnstagedPaths:$,hasSelectableFiles:Et,toggleSelectionMode:bt,enterSelectionMode:xt,exitSelectionMode:St,toggleFileSelection:Ct,selectAllFiles:wt,clearSelection:Tt,$reset:be,checkGitRepo:xe,getCurrentBranch:H,getAllBranches:U,changeBranch:Se,getUserInfo:Ce,createBranch:we,clearUserConfig:Te,restoreUserConfig:Ee,getBranchStatus:V,gitPull:De,gitFetchAll:ke,bootFetch:Oe,initSocketConnection:Ae,parseStatusPorcelain:je,fetchLog:W,refreshLog:Me,fetchStatus:G,fetchStatusPorcelain:K,addToStage:Ne,addAllToStage:Pe,addFileToStage:Fe,stageFiles:Dt,unstageFile:Ie,commitChanges:J,pushToRemote:Le,pushToRemoteWithProgress:Re,addAndCommit:Be,addCommitAndPush:Ve,stageSelectedAndCommit:He,stageSelectedAndCommitAndPush:Ue,resetHead:We,resetToRemote:Ge,discardAllChanges:Ke,discardSelectedFiles:qe,getRemoteUrl:Je,addRemote:Xe,fetchRemotes:Y,renameRemote:Qe,removeRemote:$e,setRemoteUrl:et,setRemotePushUrls:tt,pushAllRemotes:nt,attachRemoteBranch:rt,gitInit:Ye,createInitialCommit:it,copyRemoteUrl:ut,copyCloneCommand:dt,copyCurrentDiff:at,mergeBranch:ze,getStashList:X,saveStash:mt,savePartialStash:ht,applyStash:gt,dropStash:_t,clearAllStashes:vt,socket:A,disconnectSocket:ft}});export{ne as n,d as r,h as t};