zen-gitsync 2.15.12 → 2.15.14

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 (32) hide show
  1. package/package.json +1 -1
  2. package/src/ui/public/assets/{AppVersionBadge-BaXEI9Aq.js → AppVersionBadge-BSuafd63.js} +1 -1
  3. package/src/ui/public/assets/{BranchSelector-DJhEF0y9.js → BranchSelector-uDO2AkvO.js} +1 -1
  4. package/src/ui/public/assets/{CommitForm-BfpcK-bz.js → CommitForm-Bgb7OmR-.js} +1 -1
  5. package/src/ui/public/assets/{ConsoleView-D838O0O6.js → ConsoleView-Dwk6AjyQ.js} +2 -2
  6. package/src/ui/public/assets/CustomCommandManager-C4vMV0bC.js +1 -0
  7. package/src/ui/public/assets/{EditorView-DnnqYNGF.js → EditorView-9dfVHtwM.js} +0 -0
  8. package/src/ui/public/assets/{FlowOrchestrationWorkspace-UgHpZ3FR.js → FlowOrchestrationWorkspace-DNDbbSR4.js} +1 -1
  9. package/src/ui/public/assets/{LogList-uUgskwwp.js → LogList-Dt0d5pwf.js} +1 -1
  10. package/src/ui/public/assets/MindmapView-BKCqQEZm.js +1 -0
  11. package/src/ui/public/assets/MindmapView-CWoqfZRL.css +1 -0
  12. package/src/ui/public/assets/{ProjectStartupButton-C3AwivIB.js → ProjectStartupButton-zkJ_jWOE.js} +1 -1
  13. package/src/ui/public/assets/{RemoteRepoCard-BbxeVpje.js → RemoteRepoCard-B9rAKWpv.js} +1 -1
  14. package/src/ui/public/assets/{SourceMapView-DKv-Y6t_.js → SourceMapView-D16Uv2YP.js} +1 -1
  15. package/src/ui/public/assets/{TemplateManager-Dzj8rXVw.js → TemplateManager-lD99G5UQ.js} +1 -1
  16. package/src/ui/public/assets/{WorkbenchView-DTgRoOkv.js → WorkbenchView-CKr50bPA.js} +1 -1
  17. package/src/ui/public/assets/flow-mindmap-DqCWpTyA.css +1 -0
  18. package/src/ui/public/assets/flow-mindmap-KELdVhuQ.js +136 -0
  19. package/src/ui/public/assets/{index-CpFreGqX.js → index-Ab7fcfdB.js} +2 -2
  20. package/src/ui/public/index.html +1 -1
  21. package/src/ui/server/routes/fileOpen.js +1 -0
  22. package/src/ui/server/routes/monitor.js +4 -4
  23. package/src/ui/server/routes/process.js +1 -1
  24. package/src/ui/server/routes/terminal.js +1 -1
  25. package/src/ui/server/routes/workbench/index.js +1 -1
  26. package/src/ui/server/routes/workbench/taskRunner.js +1 -1
  27. package/src/ui/server/socket/registerUiSocketHandlers.js +3 -2
  28. package/src/ui/public/assets/CustomCommandManager-BcCK46df.js +0 -1
  29. package/src/ui/public/assets/MindmapView-CCmFMiHR.js +0 -1
  30. package/src/ui/public/assets/MindmapView-KFcJx-i-.css +0 -1
  31. package/src/ui/public/assets/flow-mindmap-BLa-kSA7.js +0 -90
  32. package/src/ui/public/assets/flow-mindmap-C_aN-n3H.css +0 -1
@@ -10,7 +10,7 @@
10
10
  <link rel="preconnect" href="https://fonts.googleapis.com" />
11
11
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
12
12
  <link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
13
- <script type="module" crossorigin src="/assets/index-CpFreGqX.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-Ab7fcfdB.js"></script>
14
14
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-CMxvf4Kt.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/monaco-BFLoT2VD.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/element-plus-D8SQiesr.js">
@@ -286,6 +286,7 @@ export function registerFileOpenRoutes({
286
286
  const child = spawn(cmd, ['--version'], {
287
287
  stdio: 'ignore',
288
288
  shell: process.platform === 'win32',
289
+ windowsHide: true,
289
290
  });
290
291
  let done = false;
291
292
  const finish = (ok) => {
@@ -75,15 +75,15 @@ async function listPortsWindows({ all = false } = {}) {
75
75
  // 串行耗时 = 三者之和;并行后 = max(三者)),Windows 上 netstat 对大量
76
76
  // ESTABLISHED 连接很慢,并行能把 8-19s 压到 3-8s。
77
77
  const [tcpRes, udpRes, tasklistRes] = await Promise.all([
78
- execFileP('netstat', ['-ano', '-p', 'TCP']).catch((e) => {
78
+ execFileP('netstat', ['-ano', '-p', 'TCP'], { windowsHide: true }).catch((e) => {
79
79
  logger.warn(`[monitor] netstat TCP 失败: ${e?.message || e}`)
80
80
  return { stdout: '' }
81
81
  }),
82
- execFileP('netstat', ['-ano', '-p', 'UDP']).catch((e) => {
82
+ execFileP('netstat', ['-ano', '-p', 'UDP'], { windowsHide: true }).catch((e) => {
83
83
  logger.warn(`[monitor] netstat UDP 失败: ${e?.message || e}`)
84
84
  return { stdout: '' }
85
85
  }),
86
- execFileP('tasklist', ['/FO', 'CSV', '/NH']).catch((e) => {
86
+ execFileP('tasklist', ['/FO', 'CSV', '/NH'], { windowsHide: true }).catch((e) => {
87
87
  logger.warn(`[monitor] tasklist 失败: ${e?.message || e}`)
88
88
  return { stdout: '' }
89
89
  })
@@ -245,7 +245,7 @@ async function killProcess(pid, { force = false } = {}) {
245
245
  const args = ['/PID', String(pidNum), '/F']
246
246
  if (force) args.push('/T')
247
247
  try {
248
- await execFileP('taskkill', args)
248
+ await execFileP('taskkill', args, { windowsHide: true })
249
249
  } catch (e) {
250
250
  // taskkill 在中文 Windows 上 stderr 是 GBK 编码,promisify 默认 utf8 解码会乱码,
251
251
  // 无法可靠匹配 "找不到" 文案。改用 exit code 兜底:
@@ -44,7 +44,7 @@ export function registerProcessRoutes({
44
44
  if (process.platform === 'win32') {
45
45
  // 使用已导入的 exec
46
46
  // /F 强制终止, /T 终止进程树
47
- exec(`taskkill /pid ${processInfo.childProcess.pid} /T /F`, (error) => {
47
+ exec(`taskkill /pid ${processInfo.childProcess.pid} /T /F`, { windowsHide: true }, (error) => {
48
48
  if (error) {
49
49
  logger.error(`[进程管理] taskkill 失败:`, error);
50
50
  }
@@ -195,7 +195,7 @@ export function registerTerminalRoutes({
195
195
  if (!pid) return;
196
196
 
197
197
  if (process.platform === 'win32') {
198
- exec(`taskkill /pid ${pid} /T /F`, (error) => {
198
+ exec(`taskkill /pid ${pid} /T /F`, { windowsHide: true }, (error) => {
199
199
  if (error) {
200
200
  logger.warn(`[终端会话] taskkill 失败(可忽略): ${error?.message || error}`);
201
201
  }
@@ -1141,7 +1141,7 @@ ${desc ? `描述:${desc}` : '描述:(无)'}${attachmentBlock}${templateB
1141
1141
  try {
1142
1142
  if (process.platform === 'win32') {
1143
1143
  // Windows: child.kill(SIGTERM) 经常无效,用 taskkill 杀进程树
1144
- execFile('taskkill', ['/PID', String(child.pid), '/T', '/F'], (err) => {
1144
+ execFile('taskkill', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true }, (err) => {
1145
1145
  if (err) {
1146
1146
  logger.warn(`[workbench] taskkill ${child.pid} 失败: ${err.message}`);
1147
1147
  }
@@ -75,7 +75,7 @@ export function launchClaudeInNewWindow(cwd, promptText, resumeSessionId) {
75
75
  // 用 `where claude` 找到 claude.cmd,再从 cmd 内容推断对应 .exe 路径。
76
76
  let claudeExe = 'claude.exe';
77
77
  try {
78
- const cmdShim = execFileSync('where', ['claude'], { encoding: 'utf8' })
78
+ const cmdShim = execFileSync('where', ['claude'], { encoding: 'utf8', windowsHide: true })
79
79
  .split(/\r?\n/).map(s => s.trim()).find(s => /\.cmd$/i.test(s));
80
80
  if (cmdShim) {
81
81
  const txt = fs.readFileSync(cmdShim, 'utf8');
@@ -181,6 +181,7 @@ export function registerUiSocketHandlers({
181
181
  const childProcess = spawn(bin, args, {
182
182
  cwd: execDirectory,
183
183
  env: INTERACTIVE_ENV,
184
+ windowsHide: true,
184
185
  });
185
186
 
186
187
  runningProcesses.set(processId, {
@@ -296,7 +297,7 @@ export function registerUiSocketHandlers({
296
297
  if (childProcess && !childProcess.killed) {
297
298
  try {
298
299
  if (process.platform === 'win32') {
299
- exec(`taskkill /pid ${childProcess.pid} /T /F`, (error) => {
300
+ exec(`taskkill /pid ${childProcess.pid} /T /F`, { windowsHide: true }, (error) => {
300
301
  if (error) {
301
302
  logger.error(`[交互式命令] taskkill 失败:`, error);
302
303
  }
@@ -321,7 +322,7 @@ export function registerUiSocketHandlers({
321
322
  if (childProcess && !childProcess.killed) {
322
323
  try {
323
324
  if (process.platform === 'win32') {
324
- exec(`taskkill /pid ${childProcess.pid} /T /F`, () => {});
325
+ exec(`taskkill /pid ${childProcess.pid} /T /F`, { windowsHide: true }, () => {});
325
326
  } else {
326
327
  childProcess.kill('SIGTERM');
327
328
  setTimeout(() => {
@@ -1 +0,0 @@
1
- import{t as e}from"./ConsoleView-D838O0O6.js";export{e as default};
@@ -1 +0,0 @@
1
- import"./rolldown-runtime-CMxvf4Kt.js";import{Cn as e,Fn as t,Hn as n,It as r,Jn as i,Ln as a,Nt as o,Sn as s,Tn as c,U as l,Vn as u,Xn as d,Zn as ee,_n as f,_r as p,_t as m,a as h,ct as g,ft as _,gn as v,gr as te,hn as y,i as b,ln as ne,mn as x,mr as re,mt as S,pr as C,r as w,sr as T,tn as E,un as D,vn as O,xn as ie,yt as ae,zn as k}from"./element-plus-D8SQiesr.js";import{d as A,f as oe,s as se}from"./vendor-B9orL8iU.js";import{n as j,t as M}from"./_plugin-vue_export-helper-8ryIYVvs.js";import{n as ce,t as N}from"./configStore-D77uNk8X.js";import{a as le,i as ue,o as de,r as P,s as fe,t as pe}from"./flow-mindmap-BLa-kSA7.js";var F=[`aria-hidden`],I=[`aria-modal`],L={key:0,class:`canvas-modal-header`},R={key:0,class:`canvas-modal-title`},z={class:`canvas-modal-body`},B={key:1,class:`canvas-modal-footer`},me=c({__name:`CanvasModal`,props:{open:{type:Boolean,default:!1},title:{default:``},width:{default:480},closable:{type:Boolean,default:!0},closeOnBackdrop:{type:Boolean,default:!0}},emits:[`update:open`,`close`],setup(t,{emit:r}){let i=r;function a(){i(`update:open`,!1),i(`close`)}function o(){i(`update:open`,!1),i(`close`)}return(r,i)=>(k(),O(D,null,[e(E,{name:`cm-fade`},{default:d(()=>[t.open?(k(),O(`div`,{key:0,class:`canvas-modal-backdrop`,"aria-hidden":!t.open,onClick:i[0]||=e=>t.closeOnBackdrop&&o()},null,8,F)):f(``,!0)]),_:1}),e(E,{name:`cm-pop`},{default:d(()=>[t.open?(k(),O(`div`,{key:0,class:`canvas-modal`,style:te({width:t.width+`px`}),role:`dialog`,"aria-modal":t.open},[t.title||r.$slots.header?(k(),O(`header`,L,[t.title?(k(),O(`h3`,R,p(t.title),1)):f(``,!0),n(r.$slots,`header`),t.closable?(k(),O(`button`,{key:1,class:`canvas-modal-close`,title:`关闭`,type:`button`,onClick:a},[...i[1]||=[y(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`},[y(`path`,{d:`M6 6 L18 18 M18 6 L6 18`})],-1)]])):f(``,!0)])):f(``,!0),y(`div`,z,[n(r.$slots,`default`)]),r.$slots.footer?(k(),O(`footer`,B,[n(r.$slots,`footer`)])):f(``,!0)],12,I)):f(``,!0)]),_:3})],64))}}),he=A(`mindmap`,()=>{let e=N(),t=T(e.ui.mindmapDir||``),n=T([]),r=T(null),i=T(!1),a=T(!1),o=T(null),s=T(``),c=x(()=>r.value!==null),l=x(()=>n.value.length);function u(t){e.saveUiSettings({mindmapDir:t})}async function d(e){let r=e??t.value;if(!r){o.value=null,n.value=[];return}a.value=!0,o.value=null;try{let e=await(await fetch(`/api/mindmap/list?dir=${encodeURIComponent(r)}`)).json();e.success?(t.value=e.dir,n.value=e.files||[],u(e.dir)):(o.value=e.error||`读取目录失败`,n.value=[])}catch(e){o.value=e?.message||String(e),n.value=[]}finally{a.value=!1}}async function ee(e){await d(e)}async function f(e,t=!1){if(!t&&i.value&&r.value)throw Error(`UNSAVED_CHANGES`);a.value=!0,o.value=null;try{let t=await(await fetch(`/api/mindmap/read?path=${encodeURIComponent(e)}`)).json();t.success?(r.value={path:t.path,title:t.title,content:t.content,mtime:t.mtime},s.value=t.content,i.value=!1):o.value=t.error||`读取文件失败`}catch(e){o.value=e?.message||String(e)}finally{a.value=!1}}async function p(e,n=!1){if(!t.value)throw Error(`未选择目录`);if(!n&&i.value&&r.value)throw Error(`UNSAVED_CHANGES`);a.value=!0,o.value=null;try{let n=await(await fetch(`/api/mindmap/create`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({dir:t.value,name:e})})).json();if(n.success)r.value={path:n.path,title:n.title,content:n.content,mtime:n.mtime},s.value=n.content,i.value=!1,await d();else throw o.value=n.error||`新建失败`,Error(n.error||`新建失败`)}catch(e){throw e.message===`UNSAVED_CHANGES`||(o.value=e?.message||String(e)),e}finally{a.value=!1}}async function m(e){if(!r.value)throw Error(`没有打开的文件`);a.value=!0,o.value=null;try{let t=await(await fetch(`/api/mindmap/save`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:r.value.path,content:e})})).json();if(t.success)return r.value&&(r.value.content=e,r.value.mtime=t.mtime),s.value=e,i.value=!1,await d(),t;throw o.value=t.error||`保存失败`,Error(t.error||`保存失败`)}catch(e){throw o.value=e?.message||String(e),e}finally{a.value=!1}}async function h(e){let t=await(await fetch(`/api/mindmap/delete`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e})})).json();if(!t.success)throw Error(t.error||`删除失败`);return r.value&&r.value.path===e&&(r.value=null,i.value=!1,s.value=``),await d(),t}async function g(e,t){let n=await(await fetch(`/api/mindmap/rename`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e,newName:t})})).json();if(!n.success)throw Error(n.error||`重命名失败`);return r.value&&e===r.value.path&&(r.value={...r.value,path:n.path,title:t}),await d(),n}function _(){r.value&&(i.value=!0)}function v(){r.value=null,i.value=!1,s.value=``}return{currentDir:t,files:n,current:r,dirty:i,loading:a,error:o,hasCurrent:c,filesCount:l,listFiles:d,setDir:ee,openFile:f,createFile:p,saveCurrent:m,deleteFile:h,renameFile:g,markDirty:_,closeCurrent:v}}),ge={class:`mindmap-view`},_e={class:`mm-toolbar`},ve={class:`mm-toolbar-left`},ye=[`title`],be={key:1,class:`mm-dir-empty`},xe={class:`mm-toolbar-right`},Se={key:0,class:`mm-status`},Ce=[`title`],we={key:0,class:`mm-status-dirty`},Te={class:`mm-body`},Ee={class:`mm-sidebar`},De={class:`mm-sidebar-header`},Oe={class:`mm-sidebar-title`},ke={class:`mm-sidebar-list`},Ae={key:0,class:`mm-sidebar-error`},je={key:1,class:`mm-sidebar-empty`},Me={key:2,class:`mm-sidebar-empty`},Ne=[`onClick`],Pe={class:`mm-file-info`},Fe=[`title`],Ie={class:`mm-file-meta`},Le={class:`mm-editor`},Re={key:0,class:`mm-editor-empty`},ze={class:`mm-editor-empty-title`},Be={class:`mm-editor-empty-hint`},Ve=1500,V=M(c({__name:`MindmapView`,setup(n){let c=he(),te=N(),{currentLocale:E}=oe(ce()),A=x(()=>{let e=te.theme;return e===`dark`?!0:e===`light`?!1:window.matchMedia?.(`(prefers-color-scheme: dark)`).matches??!1}),M=T(null),F=T(!1);function I(){F.value=!0}function L(e){F.value=!1,e&&e.length>0&&c.setDir(e[0])}async function R(){if(!c.currentDir){b.warning(j(`@MINDMAP:请先选择目录`));return}if(!await U())return;let e=``;try{e=(await w.prompt(j(`@MINDMAP:输入文件名提示`),j(`@MINDMAP:新建思维导图`),{confirmButtonText:j(`@MINDMAP:新建`),cancelButtonText:j(`@MINDMAP:取消`),inputPlaceholder:j(`@MINDMAP:文件名占位`),inputValidator:e=>!e||!e.trim()?j(`@MINDMAP:名称不能为空`):/[\\/:*?"<>|]/.test(e)?j(`@MINDMAP:名称含非法字符`):!0})).value.trim()}catch{return}try{await c.createFile(e,!0),b.success(j(`@MINDMAP:已新建并打开`))}catch(e){b.error(e?.message||j(`@MINDMAP:新建失败`))}}async function z(e=!1){if(c.current)try{let t=M.value?.exportData();if(!t){e||b.warning(j(`@MINDMAP:无法获取数据`));return}await c.saveCurrent(t),e||b.success(j(`@MINDMAP:已保存`))}catch(e){b.error(e?.message||j(`@MINDMAP:保存失败`))}}let B=null;function V(){!c.current||!c.dirty||(B&&clearTimeout(B),B=setTimeout(()=>{B=null,c.current&&c.dirty&&z(!0)},Ve))}function H(){B&&=(clearTimeout(B),null)}async function U(){if(!c.dirty||!c.current)return!0;try{await w.confirm(j(`@MINDMAP:未保存提示`).replace(`{title}`,c.current.title),j(`@MINDMAP:未保存的改动`),{confirmButtonText:j(`@MINDMAP:保存`),cancelButtonText:j(`@MINDMAP:丢弃`),distinguishCancelAndClose:!0,type:`warning`}),H();let e=M.value?.exportData();return e&&(await c.saveCurrent(e),b.success(j(`@MINDMAP:已保存`))),!0}catch(e){return e===`cancel`?(H(),!0):!1}}async function He(e){if(!(c.current&&c.current.path===e)&&await U())try{await c.openFile(e,!0)}catch(e){b.error(e?.message||j(`@MINDMAP:打开失败`))}}async function Ue(e){try{await w.confirm(j(`@MINDMAP:确认删除提示`).replace(`{title}`,e.title),j(`@MINDMAP:删除`),{confirmButtonText:j(`@MINDMAP:删除`),cancelButtonText:j(`@MINDMAP:取消`),type:`warning`})}catch{return}try{await c.deleteFile(e.path),b.success(j(`@MINDMAP:已删除`))}catch(e){b.error(e?.message||j(`@MINDMAP:删除失败`))}}async function We(e){let t=``;try{t=(await w.prompt(j(`@MINDMAP:输入新名称提示`),j(`@MINDMAP:重命名`),{confirmButtonText:j(`@MINDMAP:确定`),cancelButtonText:j(`@MINDMAP:取消`),inputValue:e.title,inputValidator:e=>!e||!e.trim()?j(`@MINDMAP:名称不能为空`):/[\\/:*?"<>|]/.test(e)?j(`@MINDMAP:名称含非法字符`):!0})).value.trim()}catch{return}try{await c.renameFile(e.path,t),b.success(j(`@MINDMAP:已重命名`))}catch(e){b.error(e?.message||j(`@MINDMAP:重命名失败`))}}function Ge(e){c.markDirty(),V()}function Ke(e){Z.value=e?.[0]?.id??null}async function W(){if(!c.currentDir){b.warning(j(`@MINDMAP:请先选择目录`));return}let e=``,t=``;try{e=(await w.prompt(j(`@MINDMAP:粘贴Markdown提示`),j(`@MINDMAP:从Markdown导入`),{confirmButtonText:j(`@MINDMAP:导入`),cancelButtonText:j(`@MINDMAP:取消`),inputType:`textarea`,inputPlaceholder:j(`@MINDMAP:Markdown占位`),inputValidator:e=>!e||!e.trim()?j(`@MINDMAP:内容不能为空`):!0})).value}catch{return}try{t=(await w.prompt(j(`@MINDMAP:输入文件名提示`),j(`@MINDMAP:文件名`),{confirmButtonText:j(`@MINDMAP:新建`),cancelButtonText:j(`@MINDMAP:取消`),inputValidator:e=>!e||!e.trim()?j(`@MINDMAP:名称不能为空`):/[\\/:*?"<>|]/.test(e)?j(`@MINDMAP:名称含非法字符`):!0})).value.trim()}catch{return}try{await c.createFile(t,!0);let n=de(e,t),r=JSON.stringify(n,null,2);await c.saveCurrent(r),b.success(j(`@MINDMAP:已导入`))}catch(e){b.error(e?.message||j(`@MINDMAP:导入失败`))}}async function qe(){if(M.value)try{let e=M.value.getMarkdown();await navigator.clipboard.writeText(e),b.success(j(`@MINDMAP:已复制Markdown`))}catch(e){b.error(e?.message||j(`@MINDMAP:复制失败`))}}function G(e){(e.ctrlKey||e.metaKey)&&e.key===`s`&&(e.preventDefault(),c.current&&c.dirty&&(H(),z()))}let K=T(0);i(()=>c.current?.path,()=>{K.value++});let q=T(!1),J=T(!1),Y=T(!1),X=T(!1),Z=T(null),Q=T({autoBalanceOnChange:!1,lineWidthStart:4,lineWidthEnd:2,rainbowBranch:!1,branchPaletteId:`default`,customPalettes:[],lineStyle:`curve`,layoutMode:`mindmap`,taperedEdge:!0,showOrderBadge:!1});async function Je(){if(M.value)try{Q.value=M.value.getSettings()}catch{}}function Ye(){q.value=!0}function Xe(){if(M.value){try{M.value.exportData()}catch(e){b.error(e?.message||j(`@MINDMAP:获取数据失败`));return}J.value=!0}}async function Ze(){await Je(),Y.value=!0}async function Qe(e){if(e===`markdown`)await W();else try{let t=(await w.prompt(j(`@MINDMAP:粘贴导入内容`),j(`@MINDMAP:导入提示`),{confirmButtonText:j(`@MINDMAP:导入`),cancelButtonText:j(`@MINDMAP:取消`),inputType:`textarea`,inputPlaceholder:j(`@MINDMAP:粘贴JSON或TXT`),inputValidator:e=>!e||!e.trim()?j(`@MINDMAP:内容不能为空`):!0})).value.trim();if(e===`json`){let e=JSON.parse(t);if(!M.value?.importData(JSON.stringify(e)))throw Error(`invalid mindmap json`)}else if(!M.value?.importData(JSON.stringify({id:`root`,text:t,children:[]})))throw Error(`invalid mindmap json`);c.markDirty(),V(),b.success(j(`@MINDMAP:已导入`))}catch(e){if(e===`cancel`||e?.message===`cancel`)return;b.error(e?.message||j(`@MINDMAP:导入失败`))}}function $e(){X.value=!X.value}function et(e){Z.value=e.id}function tt(e){M.value&&(M.value.addChild(e),c.markDirty(),V())}function nt(e){M.value&&(M.value.addSibling(e),c.markDirty(),V())}function rt(e){M.value&&(Z.value=e)}function it(e){M.value&&(M.value.setNodeText(e.id,e.text),c.markDirty(),V())}function at(e){M.value&&(M.value.moveNode(e.srcId,e.targetId,e.position),c.markDirty(),V())}function ot(e){if(M.value){if(!M.value.importData(JSON.stringify(e))){b.error(j(`@MINDMAP:导入失败`));return}c.markDirty(),V(),b.success(j(`@MINDMAP:已导入`))}}function st(e){M.value&&(M.value.applySettings(e),Q.value=M.value.getSettings())}let $=x(()=>{let e=c.current?.content;if(!e)return null;try{return JSON.parse(e)}catch{return null}}),ct=x(()=>{if(!Z.value||!$.value)return;let e=t=>{if(!(!t||typeof t!=`object`)){if(t.id===Z.value)return typeof t.text==`string`?t.text:void 0;if(Array.isArray(t.children))for(let n of t.children){let t=e(n);if(t!==void 0)return t}}};return e($.value)});a(async()=>{window.addEventListener(`keydown`,G),c.currentDir&&await c.listFiles()}),t(()=>{window.removeEventListener(`keydown`,G),H()});function lt(e){if(!e)return`-`;let t=new Date(e),n=Date.now()-e;return n<6e4?j(`@MINDMAP:刚刚`):n<36e5?`${Math.floor(n/6e4)}${j(`@MINDMAP:分钟前`)}`:n<864e5?`${Math.floor(n/36e5)}${j(`@MINDMAP:小时前`)}`:`${t.getMonth()+1}/${t.getDate()} ${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`}function ut(e){return e?e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`:`0 B`}return(t,n)=>{let i=l,a=h;return k(),O(`div`,ge,[y(`div`,_e,[y(`div`,ve,[e(i,{size:`small`,icon:C(ae),onClick:I},{default:d(()=>[s(p(C(j)(`@MINDMAP:选择目录`)),1)]),_:1},8,[`icon`]),C(c).currentDir?(k(),O(`span`,{key:0,class:`mm-dir-path`,title:C(c).currentDir},p(C(c).currentDir),9,ye)):(k(),O(`span`,be,p(C(j)(`@MINDMAP:未选择目录`)),1))]),y(`div`,xe,[e(i,{size:`small`,icon:C(o),disabled:!C(c).currentDir,onClick:R},{default:d(()=>[s(p(C(j)(`@MINDMAP:新建`)),1)]),_:1},8,[`icon`,`disabled`]),e(i,{size:`small`,icon:C(_),disabled:!C(c).currentDir,onClick:W},{default:d(()=>[s(p(C(j)(`@MINDMAP:从MD导入`)),1)]),_:1},8,[`icon`,`disabled`]),e(i,{size:`small`,icon:C(S),disabled:!C(c).current,onClick:qe},{default:d(()=>[s(p(C(j)(`@MINDMAP:复制MD`)),1)]),_:1},8,[`icon`,`disabled`]),e(i,{size:`small`,type:`primary`,icon:C(m),disabled:!C(c).current||!C(c).dirty,loading:C(c).loading,onClick:n[0]||=()=>{H(),z()}},{default:d(()=>[s(p(C(j)(`@MINDMAP:保存`)),1)]),_:1},8,[`icon`,`disabled`,`loading`]),C(c).current?(k(),O(`span`,Se,[y(`span`,{class:`mm-status-title`,title:C(c).current.title},p(C(c).current.title),9,Ce),C(c).dirty?(k(),O(`span`,we,`●`)):f(``,!0)])):f(``,!0)])]),y(`div`,Te,[y(`div`,Ee,[y(`div`,De,[y(`span`,Oe,p(C(j)(`@MINDMAP:文件列表`)),1),e(i,{size:`small`,text:``,icon:C(r),loading:C(c).loading,onClick:n[1]||=e=>C(c).listFiles(),disabled:!C(c).currentDir},null,8,[`icon`,`loading`,`disabled`])]),ee((k(),O(`div`,ke,[C(c).error&&!C(c).loading?(k(),O(`div`,Ae,p(C(c).error),1)):C(c).currentDir?C(c).files.length===0?(k(),O(`div`,Me,p(C(j)(`@MINDMAP:暂无思维导图`)),1)):(k(!0),O(D,{key:3},u(C(c).files,t=>(k(),O(`div`,{key:t.path,class:re([`mm-file-item`,{active:C(c).current?.path===t.path}]),onClick:e=>He(t.path)},[n[7]||=ie(`<div class="mm-file-icon" data-v-46b6ab01><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-46b6ab01><circle cx="12" cy="12" r="2" data-v-46b6ab01></circle><circle cx="5" cy="5" r="2" data-v-46b6ab01></circle><circle cx="19" cy="5" r="2" data-v-46b6ab01></circle><circle cx="5" cy="19" r="2" data-v-46b6ab01></circle><circle cx="19" cy="19" r="2" data-v-46b6ab01></circle><line x1="10.5" y1="10.5" x2="6.5" y2="6.5" data-v-46b6ab01></line><line x1="13.5" y1="10.5" x2="17.5" y2="6.5" data-v-46b6ab01></line><line x1="10.5" y1="13.5" x2="6.5" y2="17.5" data-v-46b6ab01></line><line x1="13.5" y1="13.5" x2="17.5" y2="17.5" data-v-46b6ab01></line></svg></div>`,1),y(`div`,Pe,[y(`div`,{class:`mm-file-title`,title:t.title},p(t.title),9,Fe),y(`div`,Ie,p(lt(t.mtime))+` · `+p(ut(t.size)),1)]),y(`div`,{class:`mm-file-actions`,onClick:n[2]||=ne(()=>{},[`stop`])},[e(i,{size:`small`,text:``,icon:C(S),onClick:e=>We(t),title:C(j)(`@MINDMAP:重命名`)},null,8,[`icon`,`onClick`,`title`]),e(i,{size:`small`,text:``,type:`danger`,icon:C(g),onClick:e=>Ue(t),title:C(j)(`@MINDMAP:删除`)},null,8,[`icon`,`onClick`,`title`])])],10,Ne))),128)):(k(),O(`div`,je,p(C(j)(`@MINDMAP:请先选择目录`)),1))])),[[a,C(c).loading]])]),y(`div`,Le,[C(c).current?(k(),v(C(pe),{key:K.value,ref_key:`mmRef`,ref:M,data:$.value,"preview-mode":X.value,onChange:Ge,onSelect:Ke,onCanvasOutline:Ye,onCanvasData:Xe,onCanvasSettings:Ze,onCanvasImport:Qe,onCanvasTogglePreview:$e},null,8,[`data`,`preview-mode`])):(k(),O(`div`,Re,[n[8]||=ie(`<svg viewBox="0 0 24 24" width="56" height="56" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" data-v-46b6ab01><circle cx="12" cy="12" r="2" data-v-46b6ab01></circle><circle cx="5" cy="5" r="2" data-v-46b6ab01></circle><circle cx="19" cy="5" r="2" data-v-46b6ab01></circle><circle cx="5" cy="19" r="2" data-v-46b6ab01></circle><circle cx="19" cy="19" r="2" data-v-46b6ab01></circle><line x1="10.5" y1="10.5" x2="6.5" y2="6.5" data-v-46b6ab01></line><line x1="13.5" y1="10.5" x2="17.5" y2="6.5" data-v-46b6ab01></line><line x1="10.5" y1="13.5" x2="6.5" y2="17.5" data-v-46b6ab01></line><line x1="13.5" y1="13.5" x2="17.5" y2="17.5" data-v-46b6ab01></line></svg>`,1),y(`p`,ze,p(C(j)(`@MINDMAP:思维导图编辑器`)),1),y(`p`,Be,p(C(c).currentDir?C(j)(`@MINDMAP:从左侧选择或新建`):C(j)(`@MINDMAP:先选择目录提示`)),1)])),e(C(P),{open:q.value,"onUpdate:open":n[3]||=e=>q.value=e,title:C(j)(`@MINDMAP:大纲`),side:`right`,width:320,scope:`canvas`},{default:d(()=>[$.value?(k(),v(C(ue),{key:0,data:$.value,"selected-id":Z.value,onSelect:et,onAddChild:tt,onAddSibling:nt,onToggleCollapse:rt,onEdit:it,onMove:at},null,8,[`data`,`selected-id`])):f(``,!0)]),_:1},8,[`open`,`title`]),e(C(P),{open:J.value,"onUpdate:open":n[4]||=e=>J.value=e,title:C(j)(`@MINDMAP:思维导图数据`),side:`right`,width:480,scope:`canvas`},{default:d(()=>[$.value?(k(),v(C(le),{key:0,data:$.value,onImport:ot},null,8,[`data`])):f(``,!0)]),_:1},8,[`open`,`title`]),e(me,{open:Y.value,"onUpdate:open":n[5]||=e=>Y.value=e,title:C(j)(`@MINDMAP:思维导图设置`),width:520},{default:d(()=>[Y.value?(k(),v(C(fe),{key:0,settings:Q.value,"has-selection":!!Z.value,"selected-node-text":ct.value,"onUpdate:settings":st},null,8,[`settings`,`has-selection`,`selected-node-text`])):f(``,!0)]),_:1},8,[`open`,`title`])])]),e(C(se),{visible:F.value,mode:`directory`,theme:A.value?`dark`:`light`,locale:C(E),onClose:n[6]||=e=>F.value=!1,onConfirm:L},null,8,[`visible`,`theme`,`locale`])])}}}),[[`__scopeId`,`data-v-46b6ab01`]]);export{V as default};
@@ -1 +0,0 @@
1
- .canvas-modal-backdrop{z-index:50;background:#0f172a5c;position:absolute;inset:0}.canvas-modal{background:var(--el-bg-color,#fff);max-width:calc(100% - 32px);max-height:calc(100% - 32px);color:var(--el-text-color-primary,#1e293b);z-index:51;border-radius:6px;flex-direction:column;display:flex;position:absolute;top:50%;left:50%;overflow:hidden;transform:translate(-50%,-50%);box-shadow:0 12px 32px #0f172a2e}.canvas-modal-header{border-bottom:1px solid var(--el-border-color-lighter,#f1f5f9);flex-shrink:0;align-items:center;gap:8px;padding:12px 16px;display:flex}.canvas-modal-title{letter-spacing:.02em;flex:1;margin:0;font-size:13px;font-weight:600}.canvas-modal-close{color:#94a3b8;cursor:pointer;background:0 0;border:none;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;width:24px;height:24px;display:flex}.canvas-modal-close:hover{background:var(--el-fill-color-light,#f1f5f9);color:var(--el-text-color-primary,#1e293b)}.canvas-modal-body{flex:1;min-height:0;padding:16px;overflow:auto}.canvas-modal-footer{border-top:1px solid var(--el-border-color-lighter,#f1f5f9);flex-shrink:0;justify-content:flex-end;gap:8px;padding:10px 16px;display:flex}.cm-fade-enter-active,.cm-fade-leave-active{transition:opacity .18s}.cm-fade-enter-from,.cm-fade-leave-to{opacity:0}.cm-pop-enter-active,.cm-pop-leave-active{transition:opacity .18s,transform .22s}.cm-pop-enter-from,.cm-pop-leave-to{opacity:0;transform:translate(-50%,-50%)scale(.96)}.mindmap-view[data-v-46b6ab01]{background:var(--bg-page);flex-direction:column;height:100%;min-height:0;display:flex;overflow:hidden}.mm-toolbar[data-v-46b6ab01]{background:var(--bg-container);border-bottom:1px solid var(--border-color);flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:8px 14px;display:flex}.mm-toolbar-left[data-v-46b6ab01],.mm-toolbar-right[data-v-46b6ab01]{align-items:center;gap:8px;min-width:0;display:flex}.mm-toolbar-right[data-v-46b6ab01]{flex-shrink:0}.mm-dir-path[data-v-46b6ab01]{color:var(--text-secondary);font-size:12px;font-family:var(--font-mono,monospace);white-space:nowrap;text-overflow:ellipsis;background:var(--bg-subtle);border-radius:var(--radius-sm);max-width:320px;padding:2px 8px;overflow:hidden}.mm-dir-empty[data-v-46b6ab01]{color:var(--text-tertiary);font-size:12px;font-style:italic}.mm-status[data-v-46b6ab01]{color:var(--text-secondary);align-items:center;gap:4px;margin-left:4px;font-size:12px;display:flex}.mm-status-title[data-v-46b6ab01]{white-space:nowrap;text-overflow:ellipsis;max-width:160px;font-weight:500;overflow:hidden}.mm-status-dirty[data-v-46b6ab01]{color:var(--color-warning);font-size:14px;line-height:1}.mm-body[data-v-46b6ab01]{flex:1;min-height:0;display:flex;overflow:hidden}.mm-sidebar[data-v-46b6ab01]{background:var(--bg-container);border-right:1px solid var(--border-color);flex-direction:column;flex-shrink:0;width:240px;display:flex}.mm-sidebar-header[data-v-46b6ab01]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);justify-content:space-between;align-items:center;padding:8px 12px;display:flex}.mm-sidebar-title[data-v-46b6ab01]{color:var(--text-secondary);letter-spacing:.5px;text-transform:uppercase;font-size:12px;font-weight:600}.mm-sidebar-list[data-v-46b6ab01]{flex:1;min-height:0;padding:4px;overflow-y:auto}.mm-sidebar-empty[data-v-46b6ab01],.mm-sidebar-error[data-v-46b6ab01]{text-align:center;color:var(--text-tertiary);padding:24px 12px;font-size:12px}.mm-sidebar-error[data-v-46b6ab01]{color:var(--color-danger)}.mm-file-item[data-v-46b6ab01]{border-radius:var(--radius-md);cursor:pointer;align-items:center;gap:8px;padding:6px 8px;transition:background .15s;display:flex;position:relative}.mm-file-item[data-v-46b6ab01]:hover{background:var(--bg-hover)}.mm-file-item.active[data-v-46b6ab01]{background:color-mix(in srgb, var(--color-primary) 12%, transparent)}.mm-file-item.active .mm-file-title[data-v-46b6ab01]{color:var(--color-primary);font-weight:600}.mm-file-icon[data-v-46b6ab01]{color:var(--text-tertiary);flex-shrink:0;align-items:center;display:flex}.mm-file-item.active .mm-file-icon[data-v-46b6ab01]{color:var(--color-primary)}.mm-file-info[data-v-46b6ab01]{flex-direction:column;flex:1;gap:1px;min-width:0;display:flex}.mm-file-title[data-v-46b6ab01]{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;overflow:hidden}.mm-file-meta[data-v-46b6ab01]{color:var(--text-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:10.5px;overflow:hidden}.mm-file-actions[data-v-46b6ab01]{opacity:0;align-items:center;gap:2px;transition:opacity .15s;display:flex}.mm-file-item:hover .mm-file-actions[data-v-46b6ab01]{opacity:1}.mm-editor[data-v-46b6ab01]{background:var(--bg-container);flex:1;min-width:0;min-height:0;position:relative}.mm-editor[data-v-46b6ab01] .zm-mindmap,.mm-editor[data-v-46b6ab01]>*{width:100%;height:100%}.mm-editor-empty[data-v-46b6ab01]{color:var(--text-tertiary);flex-direction:column;justify-content:center;align-items:center;gap:8px;display:flex;position:absolute;inset:0}.mm-editor-empty svg[data-v-46b6ab01]{opacity:.4}.mm-editor-empty-title[data-v-46b6ab01]{color:var(--text-secondary);margin:8px 0 0;font-size:16px;font-weight:600}.mm-editor-empty-hint[data-v-46b6ab01]{color:var(--text-tertiary);margin:0;font-size:13px}@media (width<=900px){.mm-sidebar[data-v-46b6ab01]{width:180px}.mm-dir-path[data-v-46b6ab01]{max-width:160px}}.mm-outline-empty[data-v-46b6ab01]{color:var(--el-text-color-secondary);padding:16px;font-size:13px}.mm-data-json[data-v-46b6ab01]{white-space:pre-wrap;word-break:break-all;background:var(--el-fill-color-light);border-radius:4px;max-height:calc(100vh - 200px);margin:0;padding:12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.5;overflow:auto}