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.
- package/package.json +1 -1
- package/src/ui/public/assets/{AppVersionBadge-BaXEI9Aq.js → AppVersionBadge-BSuafd63.js} +1 -1
- package/src/ui/public/assets/{BranchSelector-DJhEF0y9.js → BranchSelector-uDO2AkvO.js} +1 -1
- package/src/ui/public/assets/{CommitForm-BfpcK-bz.js → CommitForm-Bgb7OmR-.js} +1 -1
- package/src/ui/public/assets/{ConsoleView-D838O0O6.js → ConsoleView-Dwk6AjyQ.js} +2 -2
- package/src/ui/public/assets/CustomCommandManager-C4vMV0bC.js +1 -0
- package/src/ui/public/assets/{EditorView-DnnqYNGF.js → EditorView-9dfVHtwM.js} +0 -0
- package/src/ui/public/assets/{FlowOrchestrationWorkspace-UgHpZ3FR.js → FlowOrchestrationWorkspace-DNDbbSR4.js} +1 -1
- package/src/ui/public/assets/{LogList-uUgskwwp.js → LogList-Dt0d5pwf.js} +1 -1
- package/src/ui/public/assets/MindmapView-BKCqQEZm.js +1 -0
- package/src/ui/public/assets/MindmapView-CWoqfZRL.css +1 -0
- package/src/ui/public/assets/{ProjectStartupButton-C3AwivIB.js → ProjectStartupButton-zkJ_jWOE.js} +1 -1
- package/src/ui/public/assets/{RemoteRepoCard-BbxeVpje.js → RemoteRepoCard-B9rAKWpv.js} +1 -1
- package/src/ui/public/assets/{SourceMapView-DKv-Y6t_.js → SourceMapView-D16Uv2YP.js} +1 -1
- package/src/ui/public/assets/{TemplateManager-Dzj8rXVw.js → TemplateManager-lD99G5UQ.js} +1 -1
- package/src/ui/public/assets/{WorkbenchView-DTgRoOkv.js → WorkbenchView-CKr50bPA.js} +1 -1
- package/src/ui/public/assets/flow-mindmap-DqCWpTyA.css +1 -0
- package/src/ui/public/assets/flow-mindmap-KELdVhuQ.js +136 -0
- package/src/ui/public/assets/{index-CpFreGqX.js → index-Ab7fcfdB.js} +2 -2
- package/src/ui/public/index.html +1 -1
- package/src/ui/server/routes/fileOpen.js +1 -0
- package/src/ui/server/routes/monitor.js +4 -4
- package/src/ui/server/routes/process.js +1 -1
- package/src/ui/server/routes/terminal.js +1 -1
- package/src/ui/server/routes/workbench/index.js +1 -1
- package/src/ui/server/routes/workbench/taskRunner.js +1 -1
- package/src/ui/server/socket/registerUiSocketHandlers.js +3 -2
- package/src/ui/public/assets/CustomCommandManager-BcCK46df.js +0 -1
- package/src/ui/public/assets/MindmapView-CCmFMiHR.js +0 -1
- package/src/ui/public/assets/MindmapView-KFcJx-i-.css +0 -1
- package/src/ui/public/assets/flow-mindmap-BLa-kSA7.js +0 -90
- package/src/ui/public/assets/flow-mindmap-C_aN-n3H.css +0 -1
package/src/ui/public/index.html
CHANGED
|
@@ -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-
|
|
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">
|
|
@@ -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}
|