zen-gitsync 2.17.8 → 2.17.10

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 (112) hide show
  1. package/README.md +6 -0
  2. package/package.json +2 -1
  3. package/src/cli/ai/agent.js +210 -58
  4. package/src/cli/ai/context.js +58 -0
  5. package/src/cli/ai/context.test.js +117 -0
  6. package/src/cli/ai/extensions.js +131 -0
  7. package/src/cli/ai/extensions.test.js +158 -0
  8. package/src/cli/ai/mcp.js +498 -0
  9. package/src/cli/ai/mcp.test.js +275 -0
  10. package/src/cli/ai/runtime.test.js +32 -0
  11. package/src/cli/ai/skills.js +207 -0
  12. package/src/cli/ai/skills.test.js +126 -0
  13. package/src/cli/ai/termui.js +1 -0
  14. package/src/cli/ai/tools.js +94 -3
  15. package/src/cli/ai/tools.test.js +82 -0
  16. package/src/cli/ai/transport.js +18 -4
  17. package/src/cli/ai/turn.js +21 -5
  18. package/src/config.js +27 -3
  19. package/src/paths.js +11 -0
  20. package/src/ui/public/assets/AgentView-BV15UtEF.css +1 -0
  21. package/src/ui/public/assets/AgentView-C-AJo7KS.js +5 -0
  22. package/src/ui/public/assets/AppVersionBadge-B6R6eN2N.js +2 -0
  23. package/src/ui/public/assets/BranchSelector-Cj3kMWON.js +1 -0
  24. package/src/ui/public/assets/CommitForm-DpXuFG-F.js +6 -0
  25. package/src/ui/public/assets/CommonDialog-BLPHDsn0.js +1 -0
  26. package/src/ui/public/assets/EditorView-B1OnoXXf.js +1 -0
  27. package/src/ui/public/assets/FileDiffViewer-BQl0JcWd.js +14 -0
  28. package/src/ui/public/assets/{FlowExecutionViewer-uXrzZjsW.js → FlowExecutionViewer-BgEt5_Hz.js} +1 -1
  29. package/src/ui/public/assets/FlowOrchestrationWorkspace-CbLmsSF8.js +21 -0
  30. package/src/ui/public/assets/IconButton-aM3vaSIN.js +1 -0
  31. package/src/ui/public/assets/LogList-UjoVFZ-H.js +7 -0
  32. package/src/ui/public/assets/MindmapView-D_04v0n4.js +1 -0
  33. package/src/ui/public/assets/MonitorView-BD1_uzq7.js +1 -0
  34. package/src/ui/public/assets/ProjectStartupButton-BTYlVvzh.js +1 -0
  35. package/src/ui/public/assets/RemoteManagerDialog-20mpQMwu.js +1 -0
  36. package/src/ui/public/assets/RemoteRepoCard-DOrm17Xd.js +1 -0
  37. package/src/ui/public/assets/SourceMapView-nUU9bYPh.js +3 -0
  38. package/src/ui/public/assets/SvgIcon-LUynX3Iq.js +1 -0
  39. package/src/ui/public/assets/TemplateManager-Bo3Q7J9Y.js +1 -0
  40. package/src/ui/public/assets/UserInputNode-D5tSXiJz.js +1 -0
  41. package/src/ui/public/assets/{WorkbenchView-v3QFn6Ln.css → WorkbenchView-C_Gmzvj1.css} +1 -1
  42. package/src/ui/public/assets/WorkbenchView-UGC334JL.js +13 -0
  43. package/src/ui/public/assets/_plugin-vue_export-helper-D-D9qkRz.js +19 -0
  44. package/src/ui/public/assets/configStore-BLRcYJdf.js +1 -0
  45. package/src/ui/public/assets/{element-plus-KTmRV-so.js → element-plus-DcZ-TVp6.js} +3 -3
  46. package/src/ui/public/assets/flow-mindmap-D1VTkZh3.js +139 -0
  47. package/src/ui/public/assets/{gitStore-CpcS-MzM.js → gitStore-DMEDMZMk.js} +4 -4
  48. package/src/ui/public/assets/index-CW3xs-af.css +1 -0
  49. package/src/ui/public/assets/index-S0_gRyiO.js +26 -0
  50. package/src/ui/public/assets/{office-docx-BfSBpdBv.js → office-docx-C0g5Oepv.js} +5 -5
  51. package/src/ui/public/assets/{office-excel-S95W2mv4.js → office-excel-D-uYLKaA.js} +1 -1
  52. package/src/ui/public/assets/{office-pptx-DFFarGrk.js → office-pptx-De3fnc6M.js} +1 -1
  53. package/src/ui/public/assets/previewSandbox-DXAxqDVu.js +0 -0
  54. package/src/ui/public/assets/toolsStore-CpImRUhI.js +1 -0
  55. package/src/ui/public/assets/{useThemeObserver-B01D-Vl6.js → useThemeObserver-CG8k8U18.js} +1 -1
  56. package/src/ui/public/assets/{vendor-dO4B7wQf.js → vendor-BIgZEtkx.js} +27 -27
  57. package/src/ui/public/assets/vue-flow-CPCFgenl.js +39 -0
  58. package/src/ui/public/index.html +17 -17
  59. package/src/ui/server/index.js +4 -0
  60. package/src/ui/server/routes/config.js +16 -3
  61. package/src/ui/server/routes/exec.js +19 -11
  62. package/src/ui/server/routes/fileOpen.js +142 -2
  63. package/src/ui/server/routes/remoteRepos.js +604 -0
  64. package/src/ui/server/routes/remoteRepos.test.js +386 -0
  65. package/src/ui/server/routes/workbench/agentChat.js +86 -180
  66. package/src/ui/server/routes/workbench/agentChatShared.test.js +151 -0
  67. package/src/ui/server/routes/workbench/agentMarketplace.js +986 -0
  68. package/src/ui/server/routes/workbench/agentMarketplace.test.js +306 -0
  69. package/src/ui/server/routes/workbench/agentParity.test.js +167 -0
  70. package/src/ui/server/routes/workbench/agentRoutes.js +86 -1
  71. package/src/ui/server/routes/workbench/agentRoutes.test.js +50 -1
  72. package/src/ui/server/routes/workbench/jobStore.js +17 -3
  73. package/src/ui/server/routes/workbench/orchestratorStore.js +42 -2
  74. package/src/ui/server/routes/workbench/projectRegistry.js +6 -0
  75. package/src/ui/server/routes/workbench/projectRegistry.test.js +70 -0
  76. package/src/ui/server/routes/workbench/projectTool.js +198 -0
  77. package/src/ui/server/routes/workbench/projectTool.test.js +152 -0
  78. package/src/ui/server/routes/workbench/remoteCliPromptParity.test.js +177 -0
  79. package/src/ui/server/routes/workbench/taskRunner.js +269 -12
  80. package/src/ui/server/routes/workbench/taskRunner.toolcalls.test.js +307 -0
  81. package/src/ui/server/socket/registerUiSocketHandlers.js +18 -11
  82. package/src/utils/shellPath.js +253 -0
  83. package/src/utils/shellPath.test.js +221 -0
  84. package/src/ui/public/assets/AgentView-CdJaeRh0.js +0 -5
  85. package/src/ui/public/assets/AgentView-DAY4S5WN.css +0 -1
  86. package/src/ui/public/assets/AppVersionBadge-CiijSYfM.js +0 -2
  87. package/src/ui/public/assets/BranchSelector-BS7ajwvv.js +0 -1
  88. package/src/ui/public/assets/CommitForm-CEOSqXCA.js +0 -6
  89. package/src/ui/public/assets/CommonDialog-CAaEi-4T.js +0 -1
  90. package/src/ui/public/assets/EditorView-DyaFyRDD.js +0 -1
  91. package/src/ui/public/assets/FileDiffViewer-BvX9cQjR.js +0 -14
  92. package/src/ui/public/assets/FlowOrchestrationWorkspace-DIBpUSt_.js +0 -21
  93. package/src/ui/public/assets/IconButton-CnoW2on6.js +0 -1
  94. package/src/ui/public/assets/LogList-D2espSVo.js +0 -7
  95. package/src/ui/public/assets/MindmapView-CZF-rZVs.js +0 -1
  96. package/src/ui/public/assets/MonitorView-DjLr7qOG.js +0 -1
  97. package/src/ui/public/assets/ProjectStartupButton-DzsU-QIO.js +0 -1
  98. package/src/ui/public/assets/RemoteManagerDialog-CuuG2ucT.js +0 -1
  99. package/src/ui/public/assets/RemoteRepoCard-BGf8L0of.js +0 -1
  100. package/src/ui/public/assets/SourceMapView-CFb02m6z.js +0 -3
  101. package/src/ui/public/assets/SvgIcon-SRAeYjnN.js +0 -1
  102. package/src/ui/public/assets/TemplateManager-gedqAXl8.js +0 -1
  103. package/src/ui/public/assets/UserInputNode-BOCuMQW6.js +0 -1
  104. package/src/ui/public/assets/WorkbenchView-CRoR21LQ.js +0 -13
  105. package/src/ui/public/assets/_plugin-vue_export-helper-C8OE7U9H.js +0 -19
  106. package/src/ui/public/assets/configStore-CuMElTgV.js +0 -1
  107. package/src/ui/public/assets/flow-mindmap-CurCIiCp.js +0 -139
  108. package/src/ui/public/assets/index-cApp6w0b.css +0 -1
  109. package/src/ui/public/assets/index-yXm9JLGv.js +0 -24
  110. package/src/ui/public/assets/previewSandbox-DkXYEpLP.js +0 -0
  111. package/src/ui/public/assets/toolsStore-DGxlRe3Y.js +0 -1
  112. package/src/ui/public/assets/vue-flow-CsvDD38k.js +0 -39
@@ -1 +0,0 @@
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};