zen-gitsync 2.18.16 → 2.18.18

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 (64) hide show
  1. package/README.md +44 -6
  2. package/package.json +3 -2
  3. package/src/ui/public/assets/AgentView-BE7GD8rc.css +1 -0
  4. package/src/ui/public/assets/AgentView-fJbuH0N-.js +12 -0
  5. package/src/ui/public/assets/{AppVersionBadge-C8aeLqSe.js → AppVersionBadge-BfgAvMQg.js} +2 -2
  6. package/src/ui/public/assets/BranchSelector-B55Ta_HD.js +4 -0
  7. package/src/ui/public/assets/{ChatSilenceBadge-CX-Q1BK4.js → ChatSilenceBadge-BDltHrA2.js} +1 -1
  8. package/src/ui/public/assets/{CommitForm-5QT3698o.js → CommitForm-C1Jql1he.js} +3 -3
  9. package/src/ui/public/assets/{CommonDialog-DcXSTg3n.js → CommonDialog-lhBO3OFL.js} +1 -1
  10. package/src/ui/public/assets/EditorView-Dvi9Js01.css +1 -0
  11. package/src/ui/public/assets/EditorView-nJTaLq6D.js +46 -0
  12. package/src/ui/public/assets/{FlowExecutionViewer-CJQEtP0d.js → FlowExecutionViewer-BPMqArlZ.js} +1 -1
  13. package/src/ui/public/assets/{FlowOrchestrationWorkspace-DxclUFA_.js → FlowOrchestrationWorkspace-Cq-1Knnp.js} +1 -1
  14. package/src/ui/public/assets/{LogList-BXIbzGgN.js → LogList-Bk7GAfle.js} +4 -4
  15. package/src/ui/public/assets/{MindmapView-Cp8DqQ1U.js → MindmapView-CBOfycTa.js} +1 -1
  16. package/src/ui/public/assets/MindmapView-DZHwQrhd.css +1 -0
  17. package/src/ui/public/assets/MonitorView-3g87o1gD.js +3 -0
  18. package/src/ui/public/assets/MonitorView-DFLZjKpz.css +1 -0
  19. package/src/ui/public/assets/ProjectManagerView-DgMq7Jed.js +10 -0
  20. package/src/ui/public/assets/{ProjectManagerView-DVIx9AVp.css → ProjectManagerView-DhC-Y5PR.css} +1 -1
  21. package/src/ui/public/assets/ProjectStartupButton-CkJEFz-S.js +1 -0
  22. package/src/ui/public/assets/{RecentDirectoriesChat-CYvrKZJ0.js → RecentDirectoriesChat-CQ6vjPkE.js} +1 -1
  23. package/src/ui/public/assets/RemoteManagerDialog-D9arrFOG.js +4 -0
  24. package/src/ui/public/assets/{RemoteRepoCard-Bf19DvWd.js → RemoteRepoCard-ZQ_SMlQZ.js} +1 -1
  25. package/src/ui/public/assets/{SourceMapView-BeVBU82G.js → SourceMapView-1q3TRufj.js} +1 -1
  26. package/src/ui/public/assets/{SvgIcon-kIrDXBzK.js → SvgIcon-CfjWD31j.js} +1 -1
  27. package/src/ui/public/assets/{UserInputNode-DdStei_J.js → UserInputNode-BdU3sSVR.js} +1 -1
  28. package/src/ui/public/assets/WorkbenchView-D6orzzEp.css +1 -0
  29. package/src/ui/public/assets/WorkbenchView-D8WdRklc.js +360 -0
  30. package/src/ui/public/assets/_plugin-vue_export-helper-D4DL0jyB.js +19 -0
  31. package/src/ui/public/assets/agentConversations-DJ8rPauy.js +10 -0
  32. package/src/ui/public/assets/{configStore-Bo0r1aq6.js → configStore-BmWis0h4.js} +1 -1
  33. package/src/ui/public/assets/{index-9h6sH4q0.js → index-DRDito6l.js} +106 -97
  34. package/src/ui/public/assets/index-DSQ6mp_N.css +1 -0
  35. package/src/ui/public/assets/{relativeTime-BzT7yFma.js → relativeTime-BpGKkKiW.js} +1 -1
  36. package/src/ui/public/assets/toolsStore-CmVXtAw_.js +1 -0
  37. package/src/ui/public/assets/useOrchestrator-DKr4ShyB.js +1 -0
  38. package/src/ui/public/assets/useWorkbenchProjects-D169QQnx.js +9 -0
  39. package/src/ui/public/index.html +7 -7
  40. package/src/ui/server/routes/fileOpen.js +277 -0
  41. package/src/ui/server/routes/workbench/agentMarketplace.js +17 -1
  42. package/src/ui/server/routes/workbench/runExternalTurn.js +9 -0
  43. package/src/ui/server/routes/workbench/runExternalTurn.test.js +20 -0
  44. package/src/ui/server/routes/workbench/taskRunner.codebuddy.test.js +42 -0
  45. package/src/ui/server/routes/workbench/taskRunner.js +34 -3
  46. package/src/ui/public/assets/AgentView-C-6_QbmJ.css +0 -1
  47. package/src/ui/public/assets/AgentView-CW4NHZhG.js +0 -12
  48. package/src/ui/public/assets/BranchSelector-B1qhhHaR.js +0 -4
  49. package/src/ui/public/assets/EditorView-DkXHZdKh.css +0 -1
  50. package/src/ui/public/assets/EditorView-eCxdCV3J.js +0 -38
  51. package/src/ui/public/assets/MindmapView-B2Oz9nCS.css +0 -1
  52. package/src/ui/public/assets/MonitorView-BDHs5wki.js +0 -3
  53. package/src/ui/public/assets/MonitorView-CTtuMls4.css +0 -1
  54. package/src/ui/public/assets/ProjectManagerView-BN-Rk3dE.js +0 -10
  55. package/src/ui/public/assets/ProjectStartupButton-B0UZ1c5m.js +0 -1
  56. package/src/ui/public/assets/RemoteManagerDialog-ByB-9iUe.js +0 -4
  57. package/src/ui/public/assets/WorkbenchView-DK2vT3Dr.css +0 -1
  58. package/src/ui/public/assets/WorkbenchView-DtOjBTLw.js +0 -358
  59. package/src/ui/public/assets/_plugin-vue_export-helper-BhoBCXbu.js +0 -19
  60. package/src/ui/public/assets/agentConversations-DYws7uRd.js +0 -10
  61. package/src/ui/public/assets/index-mEFBooIF.css +0 -1
  62. package/src/ui/public/assets/toolsStore-Dw93cKG_.js +0 -1
  63. package/src/ui/public/assets/useOrchestrator-5ZwvNS0V.js +0 -1
  64. package/src/ui/public/assets/useWorkbenchProjects-CQY-iTuV.js +0 -7
@@ -640,21 +640,52 @@ export async function launchCodebuddyPrint(cwd, promptText, resumeSessionId) {
640
640
  * 多处实现"的失效方式有惨痛记忆:不报错,只是悄悄少一半数据)。
641
641
  *
642
642
  * 已知被忽略的事件:system/status、system/task_*(后台任务,已被
643
- * CODEBUDDY_CODE_DISABLE_BACKGROUND_TASKS 禁用)、ai-title、result。
643
+ * CODEBUDDY_CODE_DISABLE_BACKGROUND_TASKS 禁用)、ai-title、成功的 result。
644
+ * `type:'error'` 与 `result.is_error` 例外 —— 它们是"进程退出码 0 但本轮失败"的
645
+ * 唯一线索(如会话找不到、认证失败),必须落 job.agentError(见 handler 内注释)。
644
646
  * (导出仅为回归测试可见:taskRunner.codebuddy.test.js)
645
647
  */
646
648
  export function createCodebuddyEventHandler(job, appendOutput, appendThinking, toolCalls) {
647
649
  const tracker = toolCalls || createToolCallTracker(job);
648
650
  return (evt) => {
649
651
  if (!evt || typeof evt !== 'object') return;
650
- // init:session_id 落 job.claudeSessionId(--resume 续接用)
652
+ // init:session_id 落 job.claudeSessionId(--resume 续接用)。
653
+ //
654
+ // ⚠️ **只认第一条**,后续 init 一律忽略。cbc 会把**子智能体**会话的 init 也写进
655
+ // 同一条 stdout(2026-10-21 实测:一轮里 4 条 init —— 主会话 78 件工具、中间那条
656
+ // 36 件工具的子会话、结尾又把主会话补一遍)。子会话**不注册进会话库**
657
+ // (CLI 日志原话 "Child session skipped registration"),拿它的 id 去 --resume
658
+ // 只会得到一条 `{"type":"error","error":"No conversation found with session ID: …"}`,
659
+ // 进程退出码仍是 0 —— 表现就是"续接时不输出、直接结束"。
660
+ // 主会话的 init 必定最先到(子智能体是主会话跑起来才派出去的),所以首条即真值;
661
+ // 续接时首条回来的 id 与 --resume 传入的 id 也实测一致(不会丢上下文)。
651
662
  if (evt.type === 'system' && evt.subtype === 'init' && typeof evt.session_id === 'string') {
652
- if (!job.claudeSessionId || job.claudeSessionId !== evt.session_id) {
663
+ if (!job.claudeSessionId) {
653
664
  job.claudeSessionId = evt.session_id;
654
665
  publish('job:update', job);
655
666
  }
656
667
  return;
657
668
  }
669
+ // 协议层报错:实测形状 `{"type":"error","error":"<文案>"}`(如会话找不到、
670
+ // 认证失败),**退出码照样是 0**。落 job.agentError 让终态判成 error,
671
+ // 否则一轮空输出会被记成"已完成"(另四家 handler 同一口径)。
672
+ if (evt.type === 'error') {
673
+ const msg = typeof evt.error === 'string'
674
+ ? evt.error
675
+ : (typeof evt.error?.message === 'string' ? evt.error.message : '');
676
+ if (msg && !job.agentError) job.agentError = msg;
677
+ return;
678
+ }
679
+ // result 的失败分支同上一类:cbc 发的是
680
+ // `{type:'result',subtype:'error_during_execution',is_error:true,errors:[…]}`
681
+ // (拿到的是错误对象数组,没有 result 字符串),success 分支才带 result。
682
+ if (evt.type === 'result' && evt.is_error) {
683
+ const detail = Array.isArray(evt.errors) ? evt.errors.filter(Boolean).join('; ') : '';
684
+ const msg = detail || (typeof evt.result === 'string' ? evt.result : '')
685
+ || evt.subtype || 'codebuddy 执行出错';
686
+ if (!job.agentError) job.agentError = msg;
687
+ return;
688
+ }
658
689
  // 工具结果:与 claude 完全同构 —— user 事件的 content 是块数组,
659
690
  // 里面才是 tool_result(用户自己那条 prompt 的 content 是字符串,不会走到这)
660
691
  if (evt.type === 'user') {
@@ -1 +0,0 @@
1
- .marketplace-panel[data-v-e9f9e851]{background:var(--bg-container);flex-direction:column;height:100%;min-height:0;display:flex}.mp-toolbar[data-v-e9f9e851]{flex-shrink:0;align-items:center;gap:12px;padding:12px 16px 8px;display:flex}.mp-search[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);max-width:420px;height:32px;transition:border-color var(--transition-fast) ease;flex:1;align-items:center;gap:6px;padding:0 10px;display:flex}.mp-search[data-v-e9f9e851]:focus-within{border-color:var(--color-primary)}.mp-search .mp-search-icon[data-v-e9f9e851]{color:var(--text-meta);flex-shrink:0}.mp-search .mp-search-input[data-v-e9f9e851]{color:var(--text-primary);font-size:var(--font-size-mid);background:0 0;border:none;outline:none;flex:1;font-family:inherit}.mp-search .mp-search-input[data-v-e9f9e851]::placeholder{color:var(--text-meta)}.mp-target[data-v-e9f9e851]{flex-shrink:0}.mp-refresh[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);width:30px;height:30px;color:var(--text-secondary);cursor:pointer;transition:var(--transition-ui-fast);justify-content:center;align-items:center;display:flex}.mp-refresh[data-v-e9f9e851]:hover{color:var(--color-primary);border-color:var(--color-primary)}.mp-refresh.spinning svg[data-v-e9f9e851]{animation:.9s linear infinite mkt-spin-e9f9e851}@keyframes mkt-spin-e9f9e851{to{transform:rotate(360deg)}}.mp-toolbar-sub[data-v-e9f9e851]{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:12px;padding:0 16px 10px;display:flex}.mp-target-hint[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-meta)}.mp-target-hint b[data-v-e9f9e851]{color:var(--color-primary);font-weight:600}.mp-source-filter[data-v-e9f9e851]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.mp-chip[data-v-e9f9e851]{font-size:var(--font-size-sm);border:1px solid var(--border-color);border-radius:var(--radius-xl);color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:2px 10px;font-family:inherit}.mp-chip[data-v-e9f9e851]:hover{color:var(--text-secondary);border-color:var(--text-tertiary)}.mp-chip.active[data-v-e9f9e851]{color:var(--color-primary);border-color:var(--color-primary);background:color-mix(in srgb, var(--color-primary) 8%, transparent)}.mp-chip.clear[data-v-e9f9e851]{color:var(--text-meta);border-style:dashed}.mp-body[data-v-e9f9e851]{flex:1;min-height:0;padding:0 16px 20px;overflow-y:auto}.mp-group[data-v-e9f9e851]{margin-bottom:20px}.mp-group.installed[data-v-e9f9e851]{border-top:1px dashed var(--border-color);padding-top:14px}.mp-group-header[data-v-e9f9e851]{align-items:center;gap:8px;margin-bottom:10px;display:flex}.mp-group-title[data-v-e9f9e851]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mp-group-count[data-v-e9f9e851]{min-width:20px;height:18px;font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-meta);justify-content:center;align-items:center;padding:0 6px;display:inline-flex}.mp-group-error[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--color-warning-dark);align-items:center;gap:4px;display:inline-flex}.mp-group-link[data-v-e9f9e851]{color:var(--text-meta);transition:color var(--transition-fast) ease;display:inline-flex}.mp-group-link[data-v-e9f9e851]:hover{color:var(--color-primary)}.mp-grid[data-v-e9f9e851]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;display:grid}.mp-card[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);transition:border-color var(--transition-fast) ease, box-shadow var(--transition-fast) ease;flex-direction:column;gap:6px;padding:12px;display:flex}.mp-card[data-v-e9f9e851]:hover{border-color:color-mix(in srgb, var(--color-primary) 40%, var(--border-color));box-shadow:var(--shadow-sm)}.mp-card-head[data-v-e9f9e851]{align-items:center;gap:8px;display:flex}.mp-card-name[data-v-e9f9e851]{min-width:0;font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-weight:600;overflow:hidden}.mp-card-metric[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-meta);flex-shrink:0;align-items:center;gap:3px;display:inline-flex}.mp-card-desc[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:36px;margin:0;line-height:1.5;display:-webkit-box;overflow:hidden}.mp-card-meta[data-v-e9f9e851]{flex-wrap:wrap;align-items:center;gap:6px;min-height:18px;display:flex}.mp-meta-pkg[data-v-e9f9e851],.mp-meta-repo[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;max-width:220px;overflow:hidden}.mp-tag[data-v-e9f9e851]{font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-meta);flex-shrink:0;padding:1px 6px}.mp-tag.remote[data-v-e9f9e851]{background:color-mix(in srgb, var(--color-info,var(--action-teal)) 14%, transparent);color:var(--color-info,var(--action-teal))}.mp-tag.warn[data-v-e9f9e851]{background:color-mix(in srgb, var(--color-warning) 14%, transparent);color:var(--color-warning-dark)}.mp-card-foot[data-v-e9f9e851]{align-items:center;gap:8px;margin-top:2px;display:flex}.mp-card-link[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-meta);text-decoration:none}.mp-card-link[data-v-e9f9e851]:hover{color:var(--color-primary);text-decoration:underline}.mp-foot-spacer[data-v-e9f9e851]{flex:1}.mp-install-btn[data-v-e9f9e851]{font-size:var(--font-size-sm);border:1px solid var(--color-primary);border-radius:var(--radius-base);color:var(--color-primary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:4px 14px;font-family:inherit}.mp-install-btn[data-v-e9f9e851]:hover:not(:disabled){background:var(--color-primary);color:#fff}.mp-install-btn[data-v-e9f9e851]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-installed-chip[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--color-success,var(--action-emerald));align-items:center;gap:3px;display:inline-flex}.mp-not-installable[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-meta)}.mp-empty[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-meta);padding:16px 0}.mp-empty.all[data-v-e9f9e851]{text-align:center;padding:48px 0}.mp-installed-block[data-v-e9f9e851]{margin-bottom:12px}.mp-installed-target[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-meta);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px;font-weight:600}.mp-installed-list[data-v-e9f9e851]{flex-direction:column;gap:4px;display:flex}.mp-installed-row[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-base);background:var(--bg-panel);align-items:center;gap:10px;padding:6px 10px;display:flex}.mp-installed-name[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:500;overflow:hidden}.mp-installed-id[data-v-e9f9e851]{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;max-width:40%;overflow:hidden}.mp-reveal-btn[data-v-e9f9e851],.mp-remove-btn[data-v-e9f9e851]{font-size:var(--font-size-xs);border:1px solid var(--border-color);border-radius:var(--radius-xs);color:var(--text-meta);cursor:pointer;white-space:nowrap;transition:var(--transition-ui-fast);background:0 0;align-items:center;gap:4px;padding:3px 10px;font-family:inherit;display:inline-flex}.mp-reveal-btn[data-v-e9f9e851]:disabled,.mp-remove-btn[data-v-e9f9e851]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-reveal-btn[data-v-e9f9e851]:hover:not(:disabled){color:var(--text-primary);border-color:var(--text-tertiary)}.mp-remove-btn[data-v-e9f9e851]:hover:not(:disabled){color:var(--color-danger-dark);border-color:var(--color-danger)}@media (prefers-reduced-motion:reduce){.mp-refresh.spinning svg[data-v-e9f9e851]{animation:none}}.mkt-form[data-v-e9f9e851]{flex-direction:column;gap:12px;display:flex}.mkt-form-name[data-v-e9f9e851]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mkt-field[data-v-e9f9e851]{flex-direction:column;gap:4px;display:flex}.mkt-field label[data-v-e9f9e851]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:600}.mkt-field input[data-v-e9f9e851]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-container);height:30px;color:var(--text-primary);font-size:var(--font-size-mid);transition:border-color var(--transition-fast) ease;padding:0 8px;font-family:inherit}.mkt-field input[data-v-e9f9e851]:focus{border-color:var(--color-primary);outline:none}.mkt-hint[data-v-e9f9e851]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0}.mkt-cancel[data-v-e9f9e851],.mkt-confirm[data-v-e9f9e851]{font-size:var(--font-size-mid);border-radius:var(--radius-base);cursor:pointer;transition:var(--transition-ui-fast);padding:6px 16px;font-family:inherit}.mkt-cancel[data-v-e9f9e851]{border:1px solid var(--border-color);color:var(--text-secondary);background:0 0;margin-right:8px}.mkt-cancel[data-v-e9f9e851]:hover{color:var(--text-primary);border-color:var(--text-tertiary)}.mkt-confirm[data-v-e9f9e851]{border:1px solid var(--color-primary);background:var(--color-primary);color:#fff}.mkt-confirm[data-v-e9f9e851]:hover{opacity:.9}.schedule-panel[data-v-63dc658b]{flex-direction:column;flex:1;gap:12px;min-height:0;padding:16px 20px 24px;display:flex;overflow-y:auto}.schedule-toolbar[data-v-63dc658b]{justify-content:space-between;align-items:center;gap:12px;display:flex}.schedule-summary[data-v-63dc658b]{color:var(--text-secondary);font-size:12px}.schedule-error[data-v-63dc658b]{color:var(--text-danger);background:color-mix(in srgb, var(--color-danger) 8%, transparent);border:1px solid color-mix(in srgb, var(--color-danger) 25%, transparent);border-radius:6px;padding:8px 10px;font-size:12px}.schedule-loading[data-v-63dc658b],.schedule-empty[data-v-63dc658b]{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:40px 20px;font-size:13px;display:flex}.schedule-empty-title[data-v-63dc658b]{color:var(--text-primary);margin:0;font-size:14px;font-weight:500}.schedule-empty-desc[data-v-63dc658b]{text-align:center;max-width:440px;color:var(--text-tertiary);margin:0;font-size:12px;line-height:1.7}.schedule-list[data-v-63dc658b]{flex-direction:column;gap:8px;display:flex}.schedule-card[data-v-63dc658b]{background:var(--bg-card);border:1px solid var(--border-color);border-radius:8px;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px;transition:border-color .15s,background .15s;display:flex}.schedule-card[data-v-63dc658b]:hover{border-color:var(--border-color-medium)}.schedule-card.is-running[data-v-63dc658b]{border-color:var(--tint-primary-35);background:var(--tint-primary-04)}.schedule-card.is-disabled .schedule-name[data-v-63dc658b]{color:var(--text-secondary)}.schedule-card-body[data-v-63dc658b]{flex-direction:column;gap:4px;min-width:0;display:flex}.schedule-card-head[data-v-63dc658b]{align-items:center;gap:8px;min-width:0;display:flex}.schedule-name[data-v-63dc658b]{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.schedule-running[data-v-63dc658b]{color:var(--color-primary);background:var(--tint-primary-10);white-space:nowrap;border-radius:4px;padding:1px 6px;font-size:11px}.schedule-card-sub[data-v-63dc658b]{color:var(--text-secondary);white-space:nowrap;align-items:center;gap:6px;min-width:0;font-size:12px;display:flex;overflow:hidden}.schedule-desc[data-v-63dc658b]{text-overflow:ellipsis;overflow:hidden}.schedule-sep[data-v-63dc658b]{color:var(--text-tertiary)}.schedule-last[data-v-63dc658b]{text-overflow:ellipsis;overflow:hidden}.schedule-last.is-ok[data-v-63dc658b]{color:var(--text-success)}.schedule-last.is-error[data-v-63dc658b]{color:var(--text-danger)}.schedule-last.is-skipped[data-v-63dc658b]{color:var(--text-warning)}.schedule-last.is-muted[data-v-63dc658b]{color:var(--text-tertiary)}.sch-link[data-v-63dc658b]{color:var(--color-primary);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px}.sch-link[data-v-63dc658b]:hover{text-decoration:underline}.schedule-card-side[data-v-63dc658b]{flex-shrink:0;align-items:center;gap:12px;display:flex}.schedule-next[data-v-63dc658b]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.schedule-next.is-muted[data-v-63dc658b]{color:var(--text-tertiary)}.schedule-actions[data-v-63dc658b]{align-items:center;gap:2px;display:flex}.sch-switch[data-v-63dc658b]{border:1px solid var(--border-color-medium);background:var(--bg-subtle);cursor:pointer;border-radius:10px;flex-shrink:0;width:34px;height:20px;padding:0;transition:background .15s,border-color .15s;position:relative}.sch-switch .sch-switch-knob[data-v-63dc658b]{background:var(--text-tertiary);border-radius:50%;width:14px;height:14px;transition:transform .15s,background .15s;position:absolute;top:2px;left:2px}.sch-switch.on[data-v-63dc658b]{background:var(--tint-primary-18);border-color:var(--tint-primary-45)}.sch-switch.on .sch-switch-knob[data-v-63dc658b]{background:var(--color-primary);transform:translate(14px)}.sch-btn[data-v-63dc658b]{border:1px solid var(--border-color);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:6px;padding:3px 10px;font-size:12px;transition:background .15s,color .15s,border-color .15s}.sch-btn[data-v-63dc658b]:hover:not(:disabled){background:var(--bg-subtle-hover);color:var(--text-primary);border-color:var(--border-color-medium)}.sch-btn[data-v-63dc658b]:disabled{opacity:.5;cursor:default}.sch-btn-primary[data-v-63dc658b]{background:var(--tint-primary-10);border-color:var(--tint-primary-35);color:var(--color-primary)}.sch-btn-primary[data-v-63dc658b]:hover:not(:disabled){background:var(--tint-primary-18);color:var(--color-primary);border-color:var(--tint-primary-45)}.sch-btn-danger[data-v-63dc658b]{color:var(--text-danger)}.sch-btn-danger[data-v-63dc658b]:hover:not(:disabled){background:color-mix(in srgb, var(--color-danger) 8%, transparent);color:var(--text-danger);border-color:color-mix(in srgb, var(--color-danger) 30%, transparent)}.sch-form[data-v-63dc658b]{flex-direction:column;gap:14px;display:flex}.sch-field[data-v-63dc658b]{flex-direction:column;gap:6px;display:flex}.sch-field-label[data-v-63dc658b]{color:var(--text-secondary);font-size:12px}.sch-input[data-v-63dc658b]{box-sizing:border-box;width:100%;color:var(--text-primary);background:var(--bg-container);border:1px solid var(--border-color-medium);border-radius:6px;outline:none;padding:6px 10px;font-family:inherit;font-size:13px;transition:border-color .15s}.sch-input[data-v-63dc658b]:focus{border-color:var(--tint-primary-55)}.sch-select[data-v-63dc658b]{cursor:pointer}.sch-select-sm[data-v-63dc658b]{width:auto;min-width:64px}.sch-input-cron[data-v-63dc658b]{font-family:var(--font-mono,monospace)}.sch-textarea[data-v-63dc658b]{resize:vertical;min-height:72px;line-height:1.6}.sch-freq-row[data-v-63dc658b]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.sch-inline-label[data-v-63dc658b]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.sch-hint[data-v-63dc658b]{color:var(--text-tertiary);font-size:11px}.sch-radio-row[data-v-63dc658b]{flex-wrap:wrap;align-items:center;gap:16px;display:flex}.sch-radio[data-v-63dc658b]{color:var(--text-secondary);cursor:pointer;align-items:center;gap:6px;font-size:12px;display:inline-flex}.sch-radio input[data-v-63dc658b]{accent-color:var(--color-primary);cursor:pointer;margin:0}.sch-form-error[data-v-63dc658b]{color:var(--text-danger);margin:0;font-size:12px}.sch-form-footer[data-v-63dc658b]{justify-content:flex-end;gap:8px;margin-top:14px;display:flex}.sch-confirm-text[data-v-63dc658b]{color:var(--text-primary);margin:0;font-size:13px;line-height:1.7}.aps[data-v-f9ada51b]{background:var(--bg-container);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.aps__scroll[data-v-f9ada51b]{flex-direction:column;flex:1;gap:14px;max-width:860px;min-height:0;padding:16px 18px 24px;line-height:1.5;display:flex;overflow-y:auto}.aps__head[data-v-f9ada51b]{flex-direction:column;gap:5px;display:flex}.aps__title[data-v-f9ada51b]{font-size:var(--font-size-lg);color:var(--text-primary);margin:0;font-weight:600}.aps__intro[data-v-f9ada51b]{font-size:var(--font-size-sm);color:var(--text-meta);margin:0;line-height:1.6}.aps__card[data-v-f9ada51b]{background:var(--bg-panel);border:1px solid var(--border-color);border-radius:var(--radius-lg);flex-direction:column;gap:9px;padding:14px 16px;display:flex}.aps__card-head[data-v-f9ada51b]{align-items:baseline;gap:8px;display:flex}.aps__card-title[data-v-f9ada51b]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.aps__label[data-v-f9ada51b]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:500}.aps__count[data-v-f9ada51b]{font-size:var(--font-size-xs);color:var(--text-meta);font-variant-numeric:tabular-nums;margin-left:auto}.aps__field[data-v-f9ada51b]{flex-direction:column;gap:5px;display:flex}.aps__hint[data-v-f9ada51b]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0;line-height:1.6}.aps__area[data-v-f9ada51b]{box-sizing:border-box;resize:vertical;width:100%;min-height:92px;max-height:320px;font-size:var(--font-size-mid);color:var(--text-primary);background:var(--bg-subtle);border:1px solid var(--border-color);border-radius:var(--radius-md);transition:border-color var(--transition-fast) var(--ease-custom);outline:none;padding:7px 9px;font-family:inherit;line-height:1.5}.aps__area[data-v-f9ada51b]:focus{border-color:var(--color-primary)}.aps__area[data-v-f9ada51b]::placeholder{color:var(--text-meta)}.aps__area[data-v-f9ada51b]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.aps__foot[data-v-f9ada51b]{align-items:center;gap:8px;display:flex}.aps__spacer[data-v-f9ada51b]{flex:1}.aps__saved[data-v-f9ada51b]{font-size:var(--font-size-xs);color:var(--text-meta)}.aps__btn[data-v-f9ada51b]{color:var(--text-secondary);font-size:var(--font-size-sm);border-radius:var(--radius-md);cursor:pointer;transition:color var(--transition-fast) var(--ease-custom), background var(--transition-fast) var(--ease-custom);background:0 0;border:none;padding:0 12px;line-height:28px}.aps__btn[data-v-f9ada51b]:hover:not(:disabled){color:var(--color-primary);background:var(--bg-container-hover)}.aps__btn[data-v-f9ada51b]:disabled{opacity:var(--disabled-opacity);cursor:default}.aps__btn[data-v-f9ada51b]:focus-visible{outline:var(--focus-outline);outline-offset:1px}.aps__btn--primary[data-v-f9ada51b]{background:var(--color-primary);color:#fff}.aps__btn--primary[data-v-f9ada51b]:hover:not(:disabled){background:var(--color-primary);color:#fff;opacity:.88}.agent-view[data-v-bd681ddd]{background:var(--bg-container);height:100%;min-height:0;display:flex}.agent-sidebar[data-v-bd681ddd]{background:var(--bg-panel);border-right:1px solid var(--border-color);transition:width var(--transition-base) var(--ease-custom);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.agent-conversations[data-v-bd681ddd]{flex:1;min-height:0;padding:10px 6px 8px 12px}.agent-sidebar.is-convs-collapsed .agent-conversations[data-v-bd681ddd]{padding:10px 4px 8px}.sidebar-resizer[data-v-bd681ddd]{cursor:col-resize;width:4px;transition:background var(--transition-fast) ease;background:0 0;flex-shrink:0}.sidebar-resizer[data-v-bd681ddd]:hover,.sidebar-resizer.active[data-v-bd681ddd]{background:var(--color-primary);opacity:.3}.agent-chat-area[data-v-bd681ddd]{flex-direction:column;flex:1;min-width:0;display:flex;position:relative;overflow:hidden}.agent-engine[data-v-bd681ddd]{margin-bottom:7px;margin-left:auto}.agent-copy[data-v-bd681ddd]{margin-bottom:7px;margin-left:2px}.agent-silence[data-v-bd681ddd]{margin-bottom:7px;margin-left:10px}.agent-tabs[data-v-bd681ddd]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:4px;padding:8px 12px 0;display:flex}.agent-tab[data-v-bd681ddd]{color:var(--text-meta);font-size:var(--font-size-mid);cursor:pointer;transition:color var(--transition-fast) ease, border-color var(--transition-fast) ease, background var(--transition-fast) ease;border-radius:var(--radius-base) var(--radius-base) 0 0;background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:7px 14px 9px;font-family:inherit;display:inline-flex}.agent-tab[data-v-bd681ddd]:hover{color:var(--text-secondary);background:var(--bg-hover)}.agent-tab.active[data-v-bd681ddd]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:600}.agent-tab-body[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-pane[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.agent-tab-body[data-v-bd681ddd]>.marketplace-panel{flex:1;min-height:0}.chat-loading[data-v-bd681ddd]{color:var(--text-meta);font-size:var(--font-size-base);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}.agent-list-page[data-v-bd681ddd]{background:var(--bg-panel);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-list-page .agent-conversations[data-v-bd681ddd]{padding:12px 12px 10px 14px}.agent-page-bar[data-v-bd681ddd]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 12px 0 6px;display:flex}.agent-page-back[data-v-bd681ddd]{border-radius:var(--radius-xs);width:24px;height:24px;color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.agent-page-back[data-v-bd681ddd]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-page-title[data-v-bd681ddd]{min-width:0;font-size:var(--font-size-mid);color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.agent-chat-host[data-v-bd681ddd]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-host[data-v-bd681ddd] .acu-avatar--left{background:0 0}.agent-chat-host[data-v-bd681ddd] .acu-bubble-row.is-assistant .acu-bubble-main{width:var(--acu-bubble-max-width);max-width:var(--acu-bubble-max-width);position:relative}.agent-chat-host[data-v-bd681ddd] .acu-bubble-row.is-assistant .acu-bubble{align-self:flex-start}.agent-chat-host[data-v-bd681ddd] .acu-message-meta{margin:0;position:absolute;top:0;right:0}.agent-chat-host[data-v-bd681ddd] .acu-input-queue{--acu-queue-edge:var(--role-pending-edge);--acu-queue-surface:var(--role-pending-surface);--acu-queue-ink:var(--role-pending-ink);--acu-queue-wash:var(--role-pending-wash)}.agent-chat-host[data-v-bd681ddd] .acu-welcome-logo{background:var(--welcome-avatar) center/46px 46px no-repeat;width:56px;height:56px;box-shadow:none}.agent-chat-host[data-v-bd681ddd] .acu-welcome-logo>svg{display:none}.agent-chat-host[data-v-bd681ddd] .acu-welcome-grid{flex-wrap:wrap;display:flex}.agent-chat-host[data-v-bd681ddd] .acu-welcome-grid>.acu-preset-q{flex:260px;min-width:0}[data-theme=dark]{background:var(--bg-panel)}
@@ -1,12 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Bn as t,Cn as n,Dt as r,Et as i,Gn as a,Gt as o,In as s,J as c,Kr as l,M as u,Mn as d,Pn as f,Qn as p,Rt as m,Sn as h,Tn as g,Un as _,Vt as v,W as y,Wr as b,Xr as x,Yn as S,_n as C,a as w,ar as T,ct as E,dn as D,en as ee,et as te,fn as O,gr as k,i as A,ir as j,j as M,jr as N,kn as P,ln as F,lr as I,mr as L,nr as R,on as z,pn as B,pt as V,qn as H,r as ne,wn as U,xn as W,xt as re}from"./element-plus-Bz6lYur-.js";import{c as ie,t as ae}from"./vendor-C2k0GBzj.js";import{n as G,t as K}from"./_plugin-vue_export-helper-BhoBCXbu.js";import{t as q}from"./configStore-Bo0r1aq6.js";import{t as oe}from"./CommonDialog-DcXSTg3n.js";import{G as se,J as ce,b as le,q as ue}from"./index-9h6sH4q0.js";import{a as de,c as fe,i as pe,l as me,m as he,n as ge,o as _e,r as ve,s as ye,t as be,u as xe}from"./agentConversations-DYws7uRd.js";import{c as Se,d as Ce,n as we,t as Te,u as Ee}from"./ChatSilenceBadge-CX-Q1BK4.js";import{t as De}from"./useOrchestrator-5ZwvNS0V.js";async function J(e,t){let n=await fetch(e,{headers:{"Content-Type":`application/json`},...t}),r={};try{r=await n.json()}catch{}if(!n.ok||r.success===!1)throw Error(r.error||`请求失败 (${n.status})`);return r}async function Oe(){let e=await J(`/api/schedules`);return Array.isArray(e.tasks)?e.tasks:[]}async function ke(e){return(await J(`/api/schedules`,{method:`POST`,body:JSON.stringify(e)})).task}async function Ae(e,t){return(await J(`/api/schedules/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify(t)})).task}async function je(e){await J(`/api/schedules/${encodeURIComponent(e)}`,{method:`DELETE`})}async function Me(e){await J(`/api/schedules/${encodeURIComponent(e)}/run`,{method:`POST`})}async function Ne(e){await J(`/api/schedules/${encodeURIComponent(e)}/stop`,{method:`POST`})}function Pe(e){if(typeof EventSource>`u`)return()=>{};let t=new EventSource(`/api/schedules/events`);return t.onmessage=t=>{try{e(JSON.parse(t.data))}catch{}},()=>t.close()}var Y=e=>/^\d+$/.test(e)?Number(e):null;function Fe(e){let t=String(e||``).trim(),n=t.split(/\s+/);if(n.length!==5)return{kind:`custom`,raw:t};let[r,i,a,o,s]=n,c=Y(r),l=Y(i);if(t===`* * * * *`)return{kind:`every-minute`,raw:t};let u=r.match(/^\*\/(\d+)$/);if(u&&i===`*`&&a===`*`&&o===`*`&&s===`*`)return{kind:`every-n-minutes`,n:Number(u[1]),raw:t};if(c!==null&&i===`*`&&a===`*`&&o===`*`&&s===`*`)return{kind:`hourly`,minute:c,raw:t};if(c!==null&&l!==null&&a===`*`&&o===`*`&&s===`*`)return{kind:`daily`,hour:l,minute:c,raw:t};let d=Y(s);if(c!==null&&l!==null&&a===`*`&&o===`*`&&d!==null)return{kind:`weekly`,weekday:d%7,hour:l,minute:c,raw:t};let f=Y(a);return c!==null&&l!==null&&f!==null&&o===`*`&&s===`*`?{kind:`monthly`,day:f,hour:l,minute:c,raw:t}:{kind:`custom`,raw:t}}var X=e=>String(e).padStart(2,`0`),Ie=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime();function Z(e,t=new Date){if(!e)return{kind:`none`};let n=new Date(e);if(Number.isNaN(n.getTime()))return{kind:`none`};let r=`${X(n.getHours())}:${X(n.getMinutes())}`,i=Math.round((Ie(n)-Ie(t))/864e5);return i<0?{kind:`date`,date:`${n.getMonth()+1}-${X(n.getDate())}`,time:r}:i===0?{kind:`today`,time:r}:i===1?{kind:`tomorrow`,time:r}:i<7?{kind:`weekday`,weekday:n.getDay(),time:r}:{kind:`date`,date:`${n.getMonth()+1}-${X(n.getDate())}`,time:r}}function Le(e){switch(e){case`ok`:return`ok`;case`error`:case`timed-out`:return`error`;case`skipped-busy`:case`missed`:case`cancelled`:return`skipped`;default:return`pending`}}function Re(e){let t=Number(e);if(!Number.isFinite(t)||t<0)return``;if(t<1e3)return`<1s`;let n=Math.round(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60);return r<60?`${r}m${X(n%60)}s`:`${Math.floor(r/60)}h${X(r%60)}m`}function ze(e){let t=Math.min(59,Math.max(0,Math.floor(e.minute))),n=Math.min(23,Math.max(0,Math.floor(e.hour))),r=(Math.floor(e.weekday)%7+7)%7;switch(e.freq){case`minutes`:return`*/${Math.min(59,Math.max(1,Math.floor(e.everyMinutes??30)))} * * * *`;case`hourly`:return`${t} * * * *`;case`daily`:return`${t} ${n} * * *`;case`weekly`:return`${t} ${n} * * ${r}`;case`custom`:return String(e.custom||``).trim()}}s(),I();var Q=d({__name:`MarketplacePanel`,props:{type:{type:String,required:!0}},setup(e,{expose:t}){t();let n=e,r=q(),a=k([]),s=k([]),c=k(!1),l=k(``),u=k(``),d=k([]),f=k(`project`),p=k(new Set),h=k(new Set),g=k(new Set),_=W(()=>r.currentDirectory||``),y=null;async function b(){if(!c.value){c.value=!0;try{let e=new URLSearchParams({type:n.type,cwd:_.value});u.value&&e.set(`q`,u.value),d.value.length&&e.set(`sources`,d.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();t?.success?(a.value=t.groups||[],s.value=t.installed||[]):A.error(t?.error||G(`@MKT:加载失败`))}catch{A.error(G(`@MKT:加载失败`))}finally{c.value=!1}}}R(l,e=>{y&&clearTimeout(y),y=setTimeout(()=>{u.value=e.trim(),b()},400)}),R(d,()=>b()),R(()=>n.type,()=>{d.value=[],u.value=``,l.value=``,b()}),R(_,()=>b()),b();let x=W(()=>{let e=_.value?_.value.split(/[\\/]/).filter(Boolean).pop():``;return f.value===`project`?e||G(`@MKT:当前项目`):G(`@MKT:g ai 智能体`)});function S(e){return e.stars?`${C(e.stars)} ★`:e.downloads?`${C(e.downloads)} ${G(`@MKT:周下载`)}`:e.uses?`${C(e.uses)} ${G(`@MKT:次使用`)}`:``}function C(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function w(e){return`${e.id}`}function T(e){return p.value.has(w(e))}let D=W(()=>{let e={project:[],global:[]};for(let t of s.value)(e[t.target]||=[]).push(t);return e}),O=L({visible:!1,item:null,env:{},args:``});function j(e){return n.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function M(e){O.item=e,O.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),O.args=(e.args||[]).join(` `),O.visible=!0}function N(){let e=O.item;if(O.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(O.env).filter(([,e])=>e.trim()!==``)),n=O.args.trim()?O.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;F(e,{env:t,...n?{args:n}:{}})}async function P(e){if(!e.installed||await I(e)){if(j(e)){M(e);return}await F(e,{})}}async function F(e,t){let r=w(e);p.value.add(r);try{let r=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:f.value,cwd:_.value,item:{...e,...t}})}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){A.error(i?.error||G(`@MKT:安装失败`));return}i.item?.warning&&A.warning(i.item.warning),i.item?.envKeys?.length?A.warning(`${G(`@MKT:还缺环境变量`)}: ${i.item.envKeys.join(`, `)}`):A.success(G(`@MKT:安装成功`)),await b()}catch{A.error(G(`@MKT:安装失败`))}finally{p.value.delete(r)}}async function I(e){try{return await ne.confirm(`${e.name} ${G(`@MKT:已安装,要重新安装吗?`)}`,G(`@MKT:重新安装`),{confirmButtonText:G(`@MKT:重装`),cancelButtonText:G(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function z(e){let t=`${e.target}:${e.id}`;g.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:e.target,cwd:_.value,id:e.id})}),r=await t.json().catch(()=>null);(!t.ok||!r?.success)&&A.error(r?.error||G(`@MKT:打开失败`))}catch{A.error(G(`@MKT:打开失败`))}finally{g.value.delete(t)}}async function B(e){try{await ne.confirm(`${G(`@MKT:确定卸载`)} ${e.name}?`,G(`@MKT:卸载`),{confirmButtonText:G(`@MKT:卸载`),cancelButtonText:G(`@MKT:取消`),type:`warning`})}catch{return}let t=`${e.target}:${e.id}`;h.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:_.value}),r=await fetch(`/api/agent/marketplace/item/${n.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){A.error(i?.error||G(`@MKT:卸载失败`));return}A.success(G(`@MKT:已卸载`)),await b()}catch{A.error(G(`@MKT:卸载失败`))}finally{h.value.delete(t)}}let H={props:n,configStore:r,groups:a,installed:s,loading:c,searchInput:l,query:u,selectedSources:d,installTarget:f,installing:p,removing:h,revealing:g,cwd:_,get searchTimer(){return y},set searchTimer(e){y=e},loadCatalog:b,targetLabel:x,metricText:S,formatCount:C,cardKey:w,isBusy:T,installedByTarget:D,configDialog:O,needsConfig:j,openConfigDialog:M,confirmConfig:N,onInstall:P,doInstall:F,confirmReinstall:I,onReveal:z,onRemove:B,get $t(){return G},get Search(){return v},get Refresh(){return m},get Delete(){return E},get Link(){return i},get Check(){return te},get Star(){return o},get Download(){return V},get Warning(){return ee},get FolderOpened(){return re},CommonDialog:oe};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}});s(),z(),N();var Be={class:`marketplace-panel`},Ve={class:`mp-toolbar`},He={class:`mp-search`},Ue=[`placeholder`],$={class:`mp-toolbar-sub`},We={class:`mp-target-hint`},Ge={class:`mp-source-filter`},Ke=[`onClick`],qe={class:`mp-body`},Je={class:`mp-group-header`},Ye={class:`mp-group-title`},Xe={key:0,class:`mp-group-count`},Ze={key:1,class:`mp-group-error`},Qe=[`href`,`title`],$e={key:0,class:`mp-grid`},et={class:`mp-card-head`},tt=[`title`],nt={key:0,class:`mp-card-metric`},rt=[`title`],it={class:`mp-card-meta`},at=[`title`],ot=[`title`],st={key:2,class:`mp-tag remote`},ct={class:`mp-card-foot`},lt=[`href`],ut={key:1,class:`mp-installed-chip`},dt=[`disabled`,`onClick`],ft={key:3,class:`mp-not-installable`},pt={key:1,class:`mp-empty`},mt={key:0,class:`mp-group installed`},ht={class:`mp-group-header`},gt={class:`mp-group-title`},_t={class:`mp-group-count`},vt={key:0,class:`mp-installed-block`},yt={class:`mp-installed-target`},bt={class:`mp-installed-list`},xt=[`title`],St=[`title`],Ct={key:1,class:`mp-meta-pkg`},wt={key:2,class:`mp-tag warn`},Tt=[`disabled`,`title`,`onClick`],Et=[`disabled`,`onClick`],Dt={key:1,class:`mp-empty all`},Ot={key:0,class:`mkt-form`},kt={class:`mkt-form-name`},At=[`onUpdate:modelValue`,`placeholder`],jt={key:0,class:`mkt-field`},Mt={class:`mkt-hint`};function Nt(t,r,i,a,o,s){let l=c,d=M,f=u,p=y,m=w;return H(),g(`div`,Be,[U(` ── 工具栏 ───────────────────────────────── `),h(`div`,Ve,[h(`div`,He,[e(l,{class:`mp-search-icon`},{default:j(()=>[e(a.Search)]),_:1}),T(h(`input`,{"onUpdate:modelValue":r[0]||=e=>a.searchInput=e,class:`mp-search-input`,type:`text`,placeholder:i.type===`skill`?a.$t(`@MKT:搜索 Skill...`):a.$t(`@MKT:搜索 MCP 服务...`)},null,8,Ue),[[B,a.searchInput]])]),e(f,{modelValue:a.installTarget,"onUpdate:modelValue":r[1]||=e=>a.installTarget=e,size:`small`,class:`mp-target`},{default:j(()=>[e(d,{value:`project`},{default:j(()=>[P(x(a.$t(`@MKT:当前项目`)),1)]),_:1}),e(d,{value:`global`},{default:j(()=>[P(x(a.$t(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),e(p,{content:a.$t(`@MKT:刷新`),placement:`top`,"show-after":300},{default:j(()=>[h(`button`,{class:b([`mp-refresh`,{spinning:a.loading}]),onClick:a.loadCatalog},[e(l,null,{default:j(()=>[e(a.Refresh)]),_:1})],2)]),_:1},8,[`content`])]),h(`div`,$,[h(`span`,We,[P(x(a.$t(`@MKT:安装到`))+` `,1),h(`b`,null,x(a.targetLabel),1)]),h(`div`,Ge,[(H(!0),g(C,null,S(a.groups,e=>(H(),g(`button`,{key:e.id,class:b([`mp-chip`,{active:a.selectedSources.includes(e.id)}]),onClick:()=>{let t=a.selectedSources.indexOf(e.id);t>=0?a.selectedSources.splice(t,1):a.selectedSources.push(e.id)}},x(e.label),11,Ke))),128)),a.selectedSources.length?(H(),g(`button`,{key:0,class:`mp-chip clear`,onClick:r[2]||=e=>a.selectedSources=[]},x(a.$t(`@MKT:全部来源`)),1)):U(`v-if`,!0)])]),U(` ── 内容 ─────────────────────────────────── `),T((H(),g(`div`,qe,[(H(!0),g(C,null,S(a.groups,t=>(H(),g(`section`,{key:t.id,class:`mp-group`},[h(`header`,Je,[h(`h3`,Ye,x(t.label),1),t.status===`ok`?(H(),g(`span`,Xe,x(t.items.length),1)):(H(),g(`span`,Ze,[e(l,null,{default:j(()=>[e(a.Warning)]),_:1}),P(` `+x(t.error||a.$t(`@MKT:来源不可用`)),1)])),t.homepage?(H(),g(`a`,{key:2,class:`mp-group-link`,href:t.homepage,target:`_blank`,rel:`noopener noreferrer`,title:t.homepage},[e(l,null,{default:j(()=>[e(a.Link)]),_:1})],8,Qe)):U(`v-if`,!0)]),t.status===`ok`&&t.items.length?(H(),g(`div`,$e,[(H(!0),g(C,null,S(t.items,t=>(H(),g(`article`,{key:a.cardKey(t),class:`mp-card`},[h(`div`,et,[h(`span`,{class:`mp-card-name`,title:t.name},x(t.name),9,tt),a.metricText(t)?(H(),g(`span`,nt,[e(l,null,{default:j(()=>[t.stars?(H(),n(a.Star,{key:0})):(H(),n(a.Download,{key:1}))]),_:2},1024),P(` `+x(a.metricText(t)),1)])):U(`v-if`,!0)]),h(`p`,{class:`mp-card-desc`,title:t.description},x(t.description||a.$t(`@MKT:暂无描述`)),9,rt),h(`div`,it,[t.package?(H(),g(`code`,{key:0,class:`mp-meta-pkg`,title:t.package},x(t.package),9,at)):t.repository?(H(),g(`span`,{key:1,class:`mp-meta-repo`,title:t.repository+(t.subpath?` · `+t.subpath:``)},[P(x(t.repository),1),t.subpath?(H(),g(C,{key:0},[P(` · `+x(t.subpath),1)],64)):U(`v-if`,!0)],8,ot)):U(`v-if`,!0),t.transport===`remote`?(H(),g(`span`,st,x(a.$t(`@MKT:远程服务`)),1)):U(`v-if`,!0),(H(!0),g(C,null,S((t.tags||[]).slice(0,2),e=>(H(),g(`span`,{key:e,class:`mp-tag`},x(e),1))),128))]),h(`div`,ct,[t.upstream?(H(),g(`a`,{key:0,class:`mp-card-link`,href:t.upstream,target:`_blank`,rel:`noopener noreferrer`},x(a.$t(`@MKT:查看来源`)),9,lt)):U(`v-if`,!0),r[6]||=h(`span`,{class:`mp-foot-spacer`},null,-1),t.installed?(H(),g(`span`,ut,[e(l,null,{default:j(()=>[e(a.Check)]),_:1}),P(x(a.$t(`@MKT:已安装`)),1)])):t.installable===!1?(H(),g(`span`,ft,x(a.$t(`@MKT:暂不支持一键安装`)),1)):(H(),g(`button`,{key:2,class:`mp-install-btn`,disabled:a.isBusy(t),onClick:e=>a.onInstall(t)},x(a.isBusy(t)?a.$t(`@MKT:安装中...`):a.$t(`@MKT:安装`)),9,dt))])]))),128))])):t.status===`ok`?(H(),g(`div`,pt,x(a.$t(`@MKT:该来源暂无结果`)),1)):U(`v-if`,!0)]))),128)),U(` ── 已安装 ─────────────────────────────── `),a.installed.length?(H(),g(`section`,mt,[h(`header`,ht,[h(`h3`,gt,x(a.$t(`@MKT:已安装`)),1),h(`span`,_t,x(a.installed.length),1)]),(H(),g(C,null,S([`project`,`global`],t=>h(`div`,{key:t},[a.installedByTarget[t]?.length?(H(),g(`div`,vt,[h(`div`,yt,x(t===`project`?a.$t(`@MKT:当前项目`):a.$t(`@MKT:g ai 智能体`)),1),h(`div`,bt,[(H(!0),g(C,null,S(a.installedByTarget[t],n=>(H(),g(`div`,{key:t+n.id,class:`mp-installed-row`},[h(`span`,{class:`mp-installed-name`,title:n.name},x(n.name),9,xt),U(` 实际落盘的标识:SKILL.md 里的 name 常与仓库名不同(如仓库 taste-skill
2
- 里的 skill 自称 brandkit),不显示这个用户就对不上广场卡片上的名字 `),n.id&&n.id!==n.name?(H(),g(`code`,{key:0,class:`mp-installed-id`,title:n.dir||n.file||n.id},x(n.id),9,St)):U(`v-if`,!0),n.package?(H(),g(`code`,Ct,x(n.package),1)):U(`v-if`,!0),n.requiredEnv?.length?(H(),g(`span`,wt,x(a.$t(`@MKT:待配置`))+`: `+x(n.requiredEnv.join(`, `)),1)):U(`v-if`,!0),r[7]||=h(`span`,{class:`mp-foot-spacer`},null,-1),h(`button`,{class:`mp-reveal-btn`,disabled:a.revealing.has(t+n.id),title:n.dir||n.file||``,onClick:e=>a.onReveal(n)},[e(l,null,{default:j(()=>[e(a.FolderOpened)]),_:1}),P(` `+x(a.$t(`@MKT:打开文件夹`)),1)],8,Tt),h(`button`,{class:`mp-remove-btn`,disabled:a.removing.has(t+n.id),onClick:e=>a.onRemove(n)},[e(l,null,{default:j(()=>[e(a.Delete)]),_:1}),P(` `+x(a.removing.has(t+n.id)?a.$t(`@MKT:卸载中...`):a.$t(`@MKT:卸载`)),1)],8,Et)]))),128))])])):U(`v-if`,!0)])),64))])):U(`v-if`,!0),!a.loading&&!a.groups.length?(H(),g(`div`,Dt,x(a.$t(`@MKT:加载失败`)),1)):U(`v-if`,!0)])),[[m,a.loading]]),U(` ── MCP 安装前配置 ───────────────────────── `),e(a.CommonDialog,{modelValue:a.configDialog.visible,"onUpdate:modelValue":r[5]||=e=>a.configDialog.visible=e,title:a.$t(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:j(()=>[h(`button`,{class:`mkt-cancel`,onClick:r[4]||=e=>a.configDialog.visible=!1},x(a.$t(`@MKT:取消`)),1),h(`button`,{class:`mkt-confirm`,onClick:a.confirmConfig},x(a.$t(`@MKT:安装`)),1)]),default:j(()=>[a.configDialog.item?(H(),g(`div`,Ot,[h(`p`,kt,x(a.configDialog.item.name),1),(H(!0),g(C,null,S(Object.keys(a.configDialog.env),e=>(H(),g(`div`,{key:e,class:`mkt-field`},[h(`label`,null,x(e),1),T(h(`input`,{"onUpdate:modelValue":t=>a.configDialog.env[e]=t,type:`text`,autocomplete:`off`,placeholder:a.$t(`@MKT:环境变量值`),spellcheck:`false`},null,8,At),[[B,a.configDialog.env[e]]])]))),128)),a.configDialog.item.args?.length?(H(),g(`div`,jt,[h(`label`,null,x(a.$t(`@MKT:启动参数`)),1),T(h(`input`,{"onUpdate:modelValue":r[3]||=e=>a.configDialog.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[B,a.configDialog.args]]),h(`p`,Mt,x(a.$t(`@MKT:参数提示`)),1)])):U(`v-if`,!0)])):U(`v-if`,!0)]),_:1},8,[`modelValue`,`title`])])}var Pt=K(Q,[[`render`,Nt],[`__scopeId`,`data-v-e9f9e851`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/MarketplacePanel.vue`]]);s(),I();var Ft=d({__name:`SchedulePanel`,emits:[`open-session`],setup(e,{expose:t,emit:n}){t();let r=n,i=q(),o=k([]),s=k(!0),c=k(``),l=k({}),u=null,d=null;async function f(){try{o.value=await Oe(),c.value=``}catch(e){c.value=e?.message||String(e)}finally{s.value=!1}}function p(){d===null&&(d=window.setTimeout(()=>{d=null,f()},150))}a(async()=>{await f(),u=Pe(e=>{[`tasks_changed`,`task_started`,`task_finished`,`hello`].includes(e.type)&&p()})}),_(()=>{u?.(),d!==null&&window.clearTimeout(d)});let m=W(()=>{let e=o.value.filter(e=>e.enabled).length,t=o.value.length-e;return o.value.length?G(`@SCHED:{on} 个启用 · {off} 个停用`,{on:e,off:t}):``}),h=[`@SCHED:周日`,`@SCHED:周一`,`@SCHED:周二`,`@SCHED:周三`,`@SCHED:周四`,`@SCHED:周五`,`@SCHED:周六`];function g(e){let t=Fe(e.schedule);switch(t.kind){case`every-minute`:return G(`@SCHED:每分钟`);case`every-n-minutes`:return G(`@SCHED:每 {n} 分钟`,{n:t.n});case`hourly`:return G(`@SCHED:每小时第 {minute} 分钟`,{minute:t.minute});case`daily`:return G(`@SCHED:每天 {time}`,{time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`weekly`:return G(`@SCHED:每周 {weekday} {time}`,{weekday:G(h[t.weekday]),time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`monthly`:return G(`@SCHED:每月 {day} 日 {time}`,{day:t.day,time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});default:return t.raw}}function v(e){if(!e.enabled)return G(`@SCHED:已停用`);if(e.running)return G(`@SCHED:运行中...`);let t=Z(e.nextRunAt);switch(t.kind){case`none`:return``;case`today`:return G(`@SCHED:下次 今天 {time}`,{time:t.time});case`tomorrow`:return G(`@SCHED:下次 明天 {time}`,{time:t.time});case`weekday`:return G(`@SCHED:下次 {weekday} {time}`,{weekday:G(h[t.weekday]),time:t.time});case`date`:return G(`@SCHED:下次 {date} {time}`,{date:t.date,time:t.time})}}function y(e){let t=e.lastRun;if(!t)return G(`@SCHED:还没执行过`);switch(t.status){case`ok`:return G(`@SCHED:成功`);case`error`:return G(`@SCHED:失败`);case`timed-out`:return G(`@SCHED:超时中止`);case`skipped-busy`:return G(`@SCHED:已跳过(会话忙)`);case`missed`:return G(`@SCHED:已错过(未运行)`);case`cancelled`:return G(`@SCHED:已停止`);default:return t.status}}function b(e){let t=e.lastRun;if(!t)return G(`@SCHED:还没执行过`);let n=Re(t.durationMs),r=G(`@SCHED:上次 {status}`,{status:y(e)});return n?`${r} · ${n}`:r}function x(e){return e.lastRun?`is-${Le(e.lastRun.status)}`:`is-muted`}async function S(e,t){if(!l.value[e.id]){l.value={...l.value,[e.id]:!0};try{await t(),await f()}catch(e){A.error(e?.message||String(e))}finally{let t={...l.value};delete t[e.id],l.value=t}}}function C(e){return S(e,()=>Ae(e.id,{enabled:!e.enabled}))}function w(e){return S(e,()=>Me(e.id))}function T(e){return S(e,()=>Ne(e.id))}let E=k(!1),D=k(null);function ee(e){D.value=e,E.value=!0}async function te(){let e=D.value;if(e)try{await je(e.id),E.value=!1,await f()}catch(e){A.error(e?.message||String(e))}}let O=k(!1),j=k(``),M=k(``),N=k(!1),P=k({name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:``,prompt:``,onMissed:`run`,enabled:!0}),F=W(()=>[{value:`minutes`,label:G(`@SCHED:每 N 分钟`)},{value:`hourly`,label:G(`@SCHED:每小时`)},{value:`daily`,label:G(`@SCHED:每天`)},{value:`weekly`,label:G(`@SCHED:每周`)},{value:`custom`,label:G(`@SCHED:自定义 cron`)}]),I=W(()=>ze({freq:P.value.freq,everyMinutes:P.value.everyMinutes,minute:P.value.minute,hour:P.value.hour,weekday:P.value.weekday,custom:P.value.custom}));function L(){P.value={name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:i.currentDirectory||``,prompt:``,onMissed:`run`,enabled:!0},M.value=``}function R(){j.value=``,L(),O.value=!0}function z(e){j.value=e.id;let t=Fe(e.schedule),n={name:e.name,freq:`custom`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:e.schedule,cwd:e.cwd,prompt:e.prompt,onMissed:e.onMissed===`skip`?`skip`:`run`,enabled:e.enabled};switch(t.kind){case`every-n-minutes`:n.freq=`minutes`,n.everyMinutes=t.n;break;case`hourly`:n.freq=`hourly`,n.minute=t.minute;break;case`daily`:n.freq=`daily`,n.minute=t.minute,n.hour=t.hour;break;case`weekly`:n.freq=`weekly`,n.minute=t.minute,n.hour=t.hour,n.weekday=t.weekday;break;default:n.freq=`custom`}P.value=n,M.value=``,O.value=!0}async function B(){let e=P.value;if(!e.name.trim()){M.value=G(`@SCHED:任务名不能为空`);return}if(!e.prompt.trim()){M.value=G(`@SCHED:提示词不能为空`);return}let t=I.value;if(!t){M.value=G(`@SCHED:cron 表达式不能为空`);return}let n={name:e.name.trim(),schedule:t,cwd:e.cwd.trim(),prompt:e.prompt.trim(),enabled:e.enabled,onMissed:e.onMissed};N.value=!0;try{j.value?await Ae(j.value,n):await ke(n),O.value=!1,await f()}catch(e){M.value=e?.message||String(e)}finally{N.value=!1}}let V={emit:r,configStore:i,tasks:o,loading:s,errorMsg:c,pending:l,get disposeEvents(){return u},set disposeEvents(e){u=e},get refreshTimer(){return d},set refreshTimer(e){d=e},refresh:f,scheduleRefresh:p,summaryText:m,WEEKDAY_KEYS:h,descText:g,nextText:v,lastStatusText:y,lastText:b,lastClass:x,withPending:S,toggle:C,runNow:w,stop:T,confirmVisible:E,confirmTarget:D,askRemove:ee,confirmRemove:te,formVisible:O,editingId:j,formError:M,saving:N,form:P,freqOptions:F,cronPreview:I,resetForm:L,openCreate:R,openEdit:z,submitForm:B,get $t(){return G},CommonDialog:oe};return Object.defineProperty(V,"__isScriptSetup",{enumerable:!1,value:!0}),V}});N(),s(),z();var It={class:`schedule-panel`},Lt={class:`schedule-toolbar`},Rt={class:`schedule-summary`},zt={key:0,class:`schedule-error`},Bt={key:1,class:`schedule-loading`},Vt={key:2,class:`schedule-empty`},Ht={class:`schedule-empty-title`},Ut={class:`schedule-empty-desc`},Wt={key:3,class:`schedule-list`},Gt={class:`schedule-card-body`},Kt={class:`schedule-card-head`},qt={class:`schedule-name`},Jt={key:0,class:`schedule-running`},Yt=[`aria-checked`,`aria-label`,`onClick`],Xt={class:`schedule-card-sub`},Zt={class:`schedule-desc`},Qt=[`onClick`],$t={class:`schedule-card-side`},en={class:`schedule-actions`},tn=[`disabled`,`onClick`],nn=[`disabled`,`onClick`],rn=[`onClick`],an=[`onClick`],on={class:`sch-form`},sn={class:`sch-field`},cn={class:`sch-field-label`},ln=[`placeholder`],un={class:`sch-field`},dn={class:`sch-field-label`},fn={class:`sch-freq-row`},pn=[`value`],mn={class:`sch-inline-label`},hn=[`value`],gn={class:`sch-inline-label`},_n=[`value`],vn=[`value`],yn=[`value`],bn={class:`sch-inline-label`},xn=[`value`],Sn={class:`sch-inline-label`},Cn=[`placeholder`],wn={class:`sch-hint`},Tn={class:`sch-field`},En={class:`sch-field-label`},Dn=[`placeholder`],On={class:`sch-field`},kn={class:`sch-field-label`},An=[`placeholder`],jn={class:`sch-field`},Mn={class:`sch-field-label`},Nn={class:`sch-radio-row`},Pn={class:`sch-radio`},Fn={class:`sch-radio`},In={class:`sch-radio`},Ln={key:0,class:`sch-form-error`},Rn={class:`sch-form-footer`},zn=[`disabled`],Bn={class:`sch-confirm-text`},Vn={class:`sch-form-footer`};function Hn(t,n,r,i,a,o){return H(),g(`div`,It,[h(`div`,Lt,[h(`span`,Rt,x(i.summaryText),1),h(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,onClick:i.openCreate},x(i.$t(`@SCHED:新建任务`)),1)]),i.errorMsg?(H(),g(`div`,zt,x(i.$t(`@SCHED:操作失败:{error}`,{error:i.errorMsg})),1)):U(`v-if`,!0),i.loading?(H(),g(`div`,Bt,x(i.$t(`@SCHED:加载中...`)),1)):i.tasks.length?(H(),g(`div`,Wt,[(H(!0),g(C,null,S(i.tasks,e=>(H(),g(`article`,{key:e.id,class:b([`schedule-card`,{"is-disabled":!e.enabled,"is-running":!!e.running}])},[h(`div`,Gt,[h(`div`,Kt,[h(`span`,qt,x(e.name),1),e.running?(H(),g(`span`,Jt,x(i.$t(`@SCHED:运行中`)),1)):U(`v-if`,!0),h(`button`,{type:`button`,class:b([`sch-switch`,{on:e.enabled}]),role:`switch`,"aria-checked":e.enabled,"aria-label":e.enabled?i.$t(`@SCHED:停用`):i.$t(`@SCHED:启用`),onClick:t=>i.toggle(e)},[...n[17]||=[h(`span`,{class:`sch-switch-knob`},null,-1)]],10,Yt)]),h(`div`,Xt,[h(`span`,Zt,x(i.descText(e)),1),n[18]||=h(`span`,{class:`schedule-sep`},`·`,-1),h(`span`,{class:b([`schedule-last`,i.lastClass(e)])},x(i.lastText(e)),3),e.sessionId?(H(),g(`button`,{key:0,type:`button`,class:`sch-link`,onClick:t=>i.emit(`open-session`,e.sessionId)},x(i.$t(`@SCHED:查看会话`)),9,Qt)):U(`v-if`,!0)])]),h(`div`,$t,[h(`div`,{class:b([`schedule-next`,{"is-muted":!e.enabled}])},x(i.nextText(e)),3),h(`div`,en,[e.running?(H(),g(`button`,{key:0,type:`button`,class:`sch-btn`,disabled:!!i.pending[e.id],onClick:t=>i.stop(e)},x(i.$t(`@SCHED:停止`)),9,tn)):(H(),g(`button`,{key:1,type:`button`,class:`sch-btn`,disabled:!!i.pending[e.id],onClick:t=>i.runNow(e)},x(i.$t(`@SCHED:运行`)),9,nn)),h(`button`,{type:`button`,class:`sch-btn`,onClick:t=>i.openEdit(e)},x(i.$t(`@SCHED:编辑`)),9,rn),h(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:t=>i.askRemove(e)},x(i.$t(`@SCHED:删除`)),9,an)])])],2))),128))])):(H(),g(`div`,Vt,[h(`p`,Ht,x(i.$t(`@SCHED:还没有定时任务`)),1),h(`p`,Ut,x(i.$t(`@SCHED:让 g ai 在指定时间自动做事:定时拉代码、定时巡检、定时汇总。也可以在对话里直接说「每天 9 点帮我…」,让 g ai 来创建。`)),1)])),U(` 新建 / 编辑 `),e(i.CommonDialog,{modelValue:i.formVisible,"onUpdate:modelValue":n[14]||=e=>i.formVisible=e,title:i.editingId?i.$t(`@SCHED:编辑任务`):i.$t(`@SCHED:新建任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`medium`,width:`560px`,"z-index":3e6,"custom-class":`schedule-dialog`},{default:j(()=>[h(`div`,on,[h(`label`,sn,[h(`span`,cn,x(i.$t(`@SCHED:任务名`)),1),T(h(`input`,{"onUpdate:modelValue":n[0]||=e=>i.form.name=e,class:`sch-input`,type:`text`,placeholder:i.$t(`@SCHED:如:每日拉代码`)},null,8,ln),[[B,i.form.name]])]),h(`div`,un,[h(`span`,dn,x(i.$t(`@SCHED:执行计划`)),1),h(`div`,fn,[T(h(`select`,{"onUpdate:modelValue":n[1]||=e=>i.form.freq=e,class:`sch-input sch-select`},[(H(!0),g(C,null,S(i.freqOptions,e=>(H(),g(`option`,{key:e.value,value:e.value},x(e.label),9,pn))),128))],512),[[O,i.form.freq]]),i.form.freq===`minutes`?(H(),g(C,{key:0},[h(`span`,mn,x(i.$t(`@SCHED:每`)),1),T(h(`select`,{"onUpdate:modelValue":n[2]||=e=>i.form.everyMinutes=e,class:`sch-input sch-select sch-select-sm`},[(H(),g(C,null,S([5,10,15,20,30,60],e=>h(`option`,{key:e,value:e},x(e),9,hn)),64))],512),[[O,i.form.everyMinutes,void 0,{number:!0}]]),h(`span`,gn,x(i.$t(`@SCHED:分钟`)),1)],64)):i.form.freq===`daily`||i.form.freq===`weekly`?(H(),g(C,{key:1},[i.form.freq===`weekly`?T((H(),g(`select`,{key:0,"onUpdate:modelValue":n[3]||=e=>i.form.weekday=e,class:`sch-input sch-select sch-select-sm`},[(H(),g(C,null,S(i.WEEKDAY_KEYS,(e,t)=>h(`option`,{key:t,value:t},x(i.$t(e)),9,_n)),64))],512)),[[O,i.form.weekday,void 0,{number:!0}]]):U(`v-if`,!0),T(h(`select`,{"onUpdate:modelValue":n[4]||=e=>i.form.hour=e,class:`sch-input sch-select sch-select-sm`},[(H(),g(C,null,S(24,e=>h(`option`,{key:e-1,value:e-1},x(String(e-1).padStart(2,`0`)),9,vn)),64))],512),[[O,i.form.hour,void 0,{number:!0}]]),n[19]||=h(`span`,{class:`sch-inline-label`},`:`,-1),T(h(`select`,{"onUpdate:modelValue":n[5]||=e=>i.form.minute=e,class:`sch-input sch-select sch-select-sm`},[(H(),g(C,null,S(60,e=>h(`option`,{key:e-1,value:e-1},x(String(e-1).padStart(2,`0`)),9,yn)),64))],512),[[O,i.form.minute,void 0,{number:!0}]])],64)):i.form.freq===`hourly`?(H(),g(C,{key:2},[h(`span`,bn,x(i.$t(`@SCHED:第`)),1),T(h(`select`,{"onUpdate:modelValue":n[6]||=e=>i.form.minute=e,class:`sch-input sch-select sch-select-sm`},[(H(),g(C,null,S(60,e=>h(`option`,{key:e-1,value:e-1},x(String(e-1).padStart(2,`0`)),9,xn)),64))],512),[[O,i.form.minute,void 0,{number:!0}]]),h(`span`,Sn,x(i.$t(`@SCHED:分钟`)),1)],64)):T((H(),g(`input`,{key:3,"onUpdate:modelValue":n[7]||=e=>i.form.custom=e,class:`sch-input sch-input-cron`,type:`text`,spellcheck:`false`,placeholder:i.$t(`@SCHED:如:0 9 * * 1-5`)},null,8,Cn)),[[B,i.form.custom]])]),h(`span`,wn,x(i.$t(`@SCHED:cron:{cron}(分 时 日 月 周,本地时间)`,{cron:i.cronPreview||`—`})),1)]),h(`label`,Tn,[h(`span`,En,x(i.$t(`@SCHED:项目目录`)),1),T(h(`input`,{"onUpdate:modelValue":n[8]||=e=>i.form.cwd=e,class:`sch-input`,type:`text`,spellcheck:`false`,placeholder:i.$t(`@SCHED:任务在该目录下执行(默认当前项目)`)},null,8,Dn),[[B,i.form.cwd]])]),h(`label`,On,[h(`span`,kn,x(i.$t(`@SCHED:提示词`)),1),T(h(`textarea`,{"onUpdate:modelValue":n[9]||=e=>i.form.prompt=e,class:`sch-input sch-textarea`,rows:`4`,placeholder:i.$t(`@SCHED:到点后发给 g ai 的完整指令,例如:检查所有仓库远端更新,有变更就 pull;写成一次自足的请求(未来那一轮没有现在的上下文)`)},null,8,An),[[B,i.form.prompt]])]),h(`div`,jn,[h(`span`,Mn,x(i.$t(`@SCHED:错过补偿`)),1),h(`div`,Nn,[h(`label`,Pn,[T(h(`input`,{"onUpdate:modelValue":n[10]||=e=>i.form.onMissed=e,type:`radio`,value:`run`},null,512),[[D,i.form.onMissed]]),h(`span`,null,x(i.$t(`@SCHED:补跑一次(g ui 重新运行后)`)),1)]),h(`label`,Fn,[T(h(`input`,{"onUpdate:modelValue":n[11]||=e=>i.form.onMissed=e,type:`radio`,value:`skip`},null,512),[[D,i.form.onMissed]]),h(`span`,null,x(i.$t(`@SCHED:跳过`)),1)]),h(`label`,In,[T(h(`input`,{"onUpdate:modelValue":n[12]||=e=>i.form.enabled=e,type:`checkbox`},null,512),[[F,i.form.enabled]]),h(`span`,null,x(i.$t(`@SCHED:创建后启用`)),1)])])]),i.formError?(H(),g(`p`,Ln,x(i.formError),1)):U(`v-if`,!0)]),h(`div`,Rn,[h(`button`,{type:`button`,class:`sch-btn`,onClick:n[13]||=e=>i.formVisible=!1},x(i.$t(`@SCHED:取消`)),1),h(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,disabled:i.saving,onClick:i.submitForm},x(i.saving?i.$t(`@SCHED:保存中...`):i.$t(`@SCHED:保存`)),9,zn)])]),_:1},8,[`modelValue`,`title`]),U(` 删除确认 `),e(i.CommonDialog,{modelValue:i.confirmVisible,"onUpdate:modelValue":n[16]||=e=>i.confirmVisible=e,title:i.$t(`@SCHED:删除任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`small`,width:`400px`,"z-index":3e6,"custom-class":`schedule-dialog-confirm`},{default:j(()=>[h(`p`,Bn,x(i.$t(`@SCHED:确定删除「{name}」吗?已产生的会话会保留,但任务不再执行。`,{name:i.confirmTarget?.name||``})),1),h(`div`,Vn,[h(`button`,{type:`button`,class:`sch-btn`,onClick:n[15]||=e=>i.confirmVisible=!1},x(i.$t(`@SCHED:取消`)),1),h(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:i.confirmRemove},x(i.$t(`@SCHED:删除`)),1)])]),_:1},8,[`modelValue`,`title`])])}var Un=K(Ft,[[`render`,Hn],[`__scopeId`,`data-v-63dc658b`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/SchedulePanel.vue`]]);s(),I();var Wn=4e3,Gn=d({__name:`AgentPromptSettings`,setup(e,{expose:t}){t();let n=q(),{defaultPrompt:r,projectPrompts:i,loadOrchestrator:o,saveDefaultPrompt:s,saveProjectPrompt:c}=De(),l=k(``),u=k(!1),d=k(!1),f=W(()=>n.agentDefaultPrompt||``),p=W(()=>l.value.trim()!==f.value.trim());async function m(){if(!u.value&&p.value){u.value=!0;try{await n.saveAiSettings({agentDefaultPrompt:l.value})&&(l.value=f.value,d.value=!0,A.success(G(`@AGENT:已保存 g ai 默认提示词`)))}finally{u.value=!1}}}let h=W(()=>n.currentDirectory||``),g=W(()=>ce(h.value)||h.value),_=W(()=>{let e=ue(h.value);return e&&i.value?.[e]?.prompt||``}),v=k(``),y=k(``),b=k(!1),x=k(!1),S=k(!1),C=W(()=>v.value.trim()!==(r.value||``).trim()||!!h.value&&y.value.trim()!==_.value.trim());function w(){v.value=r.value||``,y.value=_.value}a(async()=>{l.value=f.value,w();let e=await o(!0);S.value=!e,e&&w()});async function T(){if(!b.value&&C.value){b.value=!0;try{let e=!0,t=v.value.trim();t!==(r.value||``).trim()&&(e=await s(t));let n=y.value.trim();e&&h.value&&n!==_.value.trim()&&(e=await c(h.value,n)),e&&(w(),x.value=!0)}finally{b.value=!1}}}let E={configStore:n,defaultPrompt:r,projectPrompts:i,loadOrchestrator:o,saveDefaultPrompt:s,saveProjectPrompt:c,MAX_CHARS:Wn,gaiDraft:l,savingGai:u,gaiSaved:d,gaiStored:f,gaiDirty:p,saveGai:m,projectPath:h,projectName:g,projectPrompt:_,globalDraft:v,projectDraft:y,savingDispatch:b,dispatchSaved:x,dispatchLoadFailed:S,dispatchDirty:C,syncDispatchDraft:w,saveDispatch:T,get $t(){return G}};return Object.defineProperty(E,"__isScriptSetup",{enumerable:!1,value:!0}),E}});N(),s(),z();var Kn={class:`aps`},qn={class:`aps__scroll`},Jn={class:`aps__head`},Yn={class:`aps__title`},Xn={class:`aps__intro`},Zn={class:`aps__card aps__card--gai`},Qn={class:`aps__card-head`},$n={class:`aps__card-title`},er={class:`aps__count`},tr={class:`aps__hint`},nr=[`placeholder`],rr={class:`aps__foot`},ir={key:0,class:`aps__saved`},ar=[`disabled`],or={class:`aps__card aps__card--dispatch`},sr={class:`aps__card-head`},cr={class:`aps__card-title`},lr={class:`aps__hint`},ur={class:`aps__field`},dr={class:`aps__card-head`},fr={class:`aps__label`,for:`aps-global`},pr={class:`aps__count`},mr=[`placeholder`],hr={class:`aps__field`},gr={class:`aps__card-head`},_r={class:`aps__label`,for:`aps-project`},vr={key:0,class:`aps__count`},yr=[`disabled`,`placeholder`],br={class:`aps__hint`},xr={class:`aps__foot`},Sr={key:0,class:`aps__saved`},Cr={key:1,class:`aps__saved`},wr=[`disabled`];function Tr(e,t,n,r,i,a){return H(),g(`div`,Kn,[h(`div`,qn,[h(`header`,Jn,[h(`h3`,Yn,x(r.$t(`@AGENT:提示词设置`)),1),h(`p`,Xn,x(r.$t(`@AGENT:这里配的两块提示词,和 g ai 对话时每一轮都会自动带上。改完下一次发消息就生效,不用新开会话。`)),1)]),U(` ── ① g ai 智能体的默认提示词 ── `),h(`section`,Zn,[h(`div`,Qn,[h(`h4`,$n,x(r.$t(`@AGENT:g ai 智能体的默认提示词`)),1),h(`span`,er,x(r.gaiDraft.length)+` / `+x(r.MAX_CHARS),1)]),h(`p`,tr,x(r.$t(`@AGENT:只作用于 g ai 自己:每次对话都会带上(定时任务也一样)。派发出去的任务读不到这一段。`)),1),T(h(`textarea`,{id:`aps-gai`,"onUpdate:modelValue":t[0]||=e=>r.gaiDraft=e,class:`aps__area`,rows:`6`,maxlength:r.MAX_CHARS,placeholder:r.$t(`@AGENT:例如:回答用中文;改完代码先跑一遍验证再汇报;不要动 dist 目录`)},null,8,nr),[[B,r.gaiDraft]]),h(`div`,rr,[r.gaiSaved&&!r.gaiDirty?(H(),g(`span`,ir,x(r.$t(`@AGENT:已保存`)),1)):U(`v-if`,!0),t[3]||=h(`span`,{class:`aps__spacer`},null,-1),h(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:r.savingGai||!r.gaiDirty,onClick:r.saveGai},x(r.savingGai?r.$t(`@AGENT:保存中…`):r.$t(`@AGENT:保存`)),9,ar)])]),U(` ── ② 派发任务的提示词 ── `),h(`section`,or,[h(`div`,sr,[h(`h4`,cr,x(r.$t(`@AGENT:派发任务的提示词`)),1)]),h(`p`,lr,x(r.$t(`@AGENT:与工作台「预设提示词」是同一份设置,在哪边改都一样。派发任务时附加在指令之前,和 g ai 对话时也会带上。`)),1),h(`div`,ur,[h(`div`,dr,[h(`label`,fr,x(r.$t(`@AGENT:全局提示词`)),1),h(`span`,pr,x(r.globalDraft.length)+` / `+x(r.MAX_CHARS),1)]),T(h(`textarea`,{id:`aps-global`,"onUpdate:modelValue":t[1]||=e=>r.globalDraft=e,class:`aps__area`,rows:`5`,maxlength:r.MAX_CHARS,placeholder:r.$t(`@AGENT:对所有项目生效。例如:回答用中文;改完代码必须跑一遍测试;不要动 dist 目录`)},null,8,mr),[[B,r.globalDraft]])]),h(`div`,hr,[h(`div`,gr,[h(`label`,_r,x(r.projectPath?r.$t(`@AGENT:「{name}」的项目提示词`,{name:r.projectName}):r.$t(`@AGENT:项目提示词`)),1),r.projectPath?(H(),g(`span`,vr,x(r.projectDraft.length)+` / `+x(r.MAX_CHARS),1)):U(`v-if`,!0)]),T(h(`textarea`,{id:`aps-project`,"onUpdate:modelValue":t[2]||=e=>r.projectDraft=e,class:`aps__area`,rows:`5`,maxlength:r.MAX_CHARS,disabled:!r.projectPath,placeholder:r.projectPath?r.$t(`@AGENT:只在这个项目派发/对话时附加。例如:包管理器用 pnpm;改动集中在 src/ui 下`):r.$t(`@AGENT:当前没有打开项目,项目级提示词暂时不能设置`)},null,8,yr),[[B,r.projectDraft]]),h(`p`,br,x(r.projectPath?r.$t(`@AGENT:项目提示词追加在全局提示词之后(不覆盖全局),在「{name}」里派发或对话时一起带上`,{name:r.projectName}):r.$t(`@AGENT:先在左上角切到一个项目,才能设置它的提示词`)),1)]),h(`div`,xr,[r.dispatchSaved&&!r.dispatchDirty?(H(),g(`span`,Sr,x(r.$t(`@AGENT:已保存`)),1)):r.dispatchLoadFailed?(H(),g(`span`,Cr,x(r.$t(`@AGENT:读取设置失败,请稍后重试`)),1)):U(`v-if`,!0),t[4]||=h(`span`,{class:`aps__spacer`},null,-1),h(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:r.savingDispatch||!r.dispatchDirty,onClick:r.saveDispatch},x(r.savingDispatch?r.$t(`@AGENT:保存中…`):r.$t(`@AGENT:保存`)),9,wr)])])])])}var Er=K(Gn,[[`render`,Tr],[`__scopeId`,`data-v-f9ada51b`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AgentPromptSettings.vue`]]);s(),I();var Dr=1100,Or=40,kr=d({__name:`AgentView`,setup(e,{expose:n}){n();let i=q(),o=se(),s=k(null),{width:l,narrow:u}=Ce(s),p=k(`chat`),m=k(`chat`),h=W(()=>m.value===`mcp`?`mcp`:`skill`),g=(...e)=>d({render:()=>f(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`},e.map(e=>f(`path`,{d:e})))}),v=W(()=>[{id:`chat`,label:G(`@AGENT:对话`),icon:g(`M12 11v.01`,`M8 11v.01`,`M16 11v.01`,`M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-5l-5 3v-3h-2a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3l12 0`)},{id:`schedule`,label:G(`@AGENT:定时任务`),icon:g(`M5 13a7 7 0 1 0 14 0a7 7 0 0 0-14 0`,`M14.5 10.5l-2.5 2.5`,`M17 8l1-1`,`M14 3h-4`)},{id:`skill`,label:G(`@AGENT:Skill 广场`),icon:g(`M6.331 8h11.339a2 2 0 0 1 1.977 2.304l-1.255 8.152a3 3 0 0 1-2.966 2.544h-6.852a3 3 0 0 1-2.965-2.544l-1.255-8.152a2 2 0 0 1 1.977-2.304`,`M9 11v-5a3 3 0 0 1 6 0v5`)},{id:`mcp`,label:G(`@AGENT:MCP 广场`),icon:g(`M7 12l5 5l-1.5 1.5a3.536 3.536 0 1 1-5-5l1.5-1.5`,`M17 12l-5-5l1.5-1.5a3.536 3.536 0 1 1 5 5l-1.5 1.5`,`M3 21l2.5-2.5`,`M18.5 5.5l2.5-2.5`,`M10 11l-2 2`,`M13 14l-2 2`)},{id:`settings`,label:G(`@AGENT:设置`),icon:g(`M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 0 0-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 0 0-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 0 0-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 0 0-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 0 0 1.066-2.573c-.94-1.543.826-3.31 2.37-2.37c1 .608 2.296.07 2.572-1.065`,`M9 12a3 3 0 1 0 6 0a3 3 0 0 0-6 0`)}]),{sessions:y,sessionsLoading:b,currentSessionId:x,messages:S,displayMessages:C,isStreaming:w,sessionLoading:T,loadSessions:E,loadSession:D,deleteSession:ee,renameSession:te,newSession:O,sendMessage:A,retryTurn:j,questionPanel:M,answeringQuestion:N,answerQuestion:P,isSessionGenerating:F,currentEngine:I,pendingEngine:L,isEngineLocked:z,pickEngine:B,stop:V,inputContextUsage:H,queuedMessages:ne,queuePaused:U,removeQueuedMessage:re,flushQueued:K,silentMs:oe}=xe(),ce=W(()=>z.value?I.value:L.value);function ue(e){z.value||B(e)}let De=W(()=>{let e=i.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),J=W(()=>{let e=i.models.find(e=>e.isDefault);return e&&(e.name||e.model)||``}),Oe=W(()=>fe(y.value,F)),ke=de(),Ae=W(()=>Oe.value.find(e=>e.id===x.value)?.title||G(`@AGENT:对话`)),je={"--welcome-avatar":`url("${be}")`},Me=W(()=>le(i.agentPresetPrompts));async function Ne(e){await A(e.text,e.files),await t(),Z()}async function Y(e){await A(e.prompt),await t(),Z()}let Fe=_e(),X=k(null),Ie=ye();function Z(e=!0){X.value?.scrollToBottom(e)}R(()=>S.value.length,()=>{t(()=>Z(!1))});function Le(e){D(e),p.value=`chat`}function Re(e){e&&(m.value=`chat`,Le(e))}function ze(){O(),p.value=`chat`}let Q=k(280),Be=k(!1),{convListCollapsed:Ve,setConvListCollapsed:He}=Ee();function Ue(e){if(Ve.value)return;Be.value=!0;let t=e.clientX,n=Q.value,r=e=>{let r=e.clientX-t,i=Math.max(200,Math.min(500,n+r));Q.value=i},i=()=>{Be.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}R(u,e=>{e||(p.value=`chat`)}),R(()=>[i.currentDirectory,w.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await E(),x.value&&!w.value&&!y.value.some(e=>e.sessionId===x.value)&&O()},{immediate:!0});let $=null;a(()=>{$=Pe(e=>{e.type===`task_finished`&&E().catch(()=>{})})}),_(()=>{$?.(),$=null});let We={configStore:i,gitStore:o,rootRef:s,width:l,narrow:u,TABS_SILENCE_MIN_WIDTH:Dr,chatPage:p,activeTab:m,marketplaceType:h,tablerIcon:g,tabs:v,sessions:y,sessionsLoading:b,currentSessionId:x,messages:S,displayMessages:C,isStreaming:w,sessionLoading:T,loadSessions:E,loadSession:D,deleteSession:ee,renameSession:te,newSession:O,sendMessage:A,retryTurn:j,questionPanel:M,answeringQuestion:N,answerQuestion:P,isSessionGenerating:F,currentEngine:I,pendingEngine:L,isEngineLocked:z,pickEngine:B,stop:V,inputContextUsage:H,queuedMessages:ne,queuePaused:U,removeQueuedMessage:re,flushQueued:K,silentMs:oe,displayEngine:ce,handleEngineSelect:ue,chatTheme:De,inputModelName:J,conversationItems:Oe,conversationLabels:ke,currentSessionTitle:Ae,welcomeAvatarStyle:je,presetQuestions:Me,onSend:Ne,onSelectPreset:Y,questionLabels:Fe,chatContainerRef:X,queueLabels:Ie,scrollToBottom:Z,selectSession:Le,handleScheduleOpenSession:Re,handleNewSession:ze,sidebarWidth:Q,isResizing:Be,convListCollapsed:Ve,setConvListCollapsed:He,CONV_RAIL_WIDTH:Or,startResize:Ue,get disposeScheduleEvents(){return $},set disposeScheduleEvents(e){$=e},get $t(){return G},get ElIcon(){return c},get Loading(){return r},get ChatContainer(){return ie},get ConversationList(){return ae},get AGENT_UPLOAD_ACCEPT(){return me},get AGENT_ASSISTANT_NAME(){return ge},get AGENT_ASSISTANT_AVATAR(){return be},get MESSAGE_RAIL_CONFIG(){return pe},get MESSAGE_META_CONFIG(){return ve},get agentEngineName(){return he},MarketplacePanel:Pt,SchedulePanel:Un,AgentPromptSettings:Er,AgentEngineSelector:Se,CopySessionButton:we,ChatSilenceBadge:Te};return Object.defineProperty(We,"__isScriptSetup",{enumerable:!1,value:!0}),We}});s(),N();var Ar={ref:`rootRef`,class:`agent-view`},jr={class:`agent-chat-area`},Mr={class:`agent-tabs`,role:`tablist`},Nr=[`aria-selected`,`onClick`],Pr={class:`agent-tab-body`},Fr={key:0,class:`agent-chat-pane`},Ir={key:0,class:`agent-list-page`},Lr={key:0,class:`agent-page-bar`},Rr=[`title`,`aria-label`],zr={class:`agent-page-title`},Br={key:0,class:`chat-loading`};function Vr(t,r,i,a,o,s){return H(),g(`div`,Ar,[U(` ═══ 宽屏:左侧会话列表(只在「对话」Tab 显示)═══
3
- 窄屏时这一整块不渲染,会话列表改成 body 里的一个整页(见 .agent-list-page) `),a.activeTab===`chat`&&!a.narrow?(H(),g(C,{key:0},[h(`aside`,{class:b([`agent-sidebar`,{"is-convs-collapsed":a.convListCollapsed}]),style:l({width:(a.convListCollapsed?a.CONV_RAIL_WIDTH:a.sidebarWidth)+`px`})},[U(` 会话列表:UI 与交互都在组件库的 ConversationList 里(含收起 / 展开) `),e(a.ConversationList,{class:`agent-conversations`,items:a.conversationItems,"active-id":a.currentSessionId,loading:a.sessionsLoading,labels:a.conversationLabels,collapsible:``,collapsed:a.convListCollapsed,"onUpdate:collapsed":a.setConvListCollapsed,onSelect:a.selectSession,onNew:a.handleNewSession,onRename:a.renameSession,onDelete:a.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`collapsed`,`onUpdate:collapsed`,`onRename`,`onDelete`])],6),U(` 拖拽分隔条(收起时藏起来:40px 的收纳条没有可拖的余地) `),a.convListCollapsed?U(`v-if`,!0):(H(),g(`div`,{key:0,class:b([`sidebar-resizer`,{active:a.isResizing}]),onMousedown:a.startResize},null,34))],64)):U(`v-if`,!0),U(` ═══ 右侧:Tab 栏 + 内容区 ═══ `),h(`main`,jr,[h(`nav`,Mr,[(H(!0),g(C,null,S(a.tabs,t=>(H(),g(`button`,{key:t.id,type:`button`,class:b([`agent-tab`,{active:a.activeTab===t.id}]),role:`tab`,"aria-selected":a.activeTab===t.id,onClick:e=>a.activeTab=t.id},[e(a.ElIcon,null,{default:j(()=>[(H(),n(p(t.icon)))]),_:2},1024),h(`span`,null,x(t.label),1)],10,Nr))),128)),U(` ═══ 引擎选择器 ═══
4
- 与工作台执行器下拉同一套交互(点击展开、未安装标出来、点了直接开安装弹窗)。
5
- 下拉本体收口在 AgentEngineSelector,文件空间 g ai 面板复用同一份实现。
6
- 会话一旦落盘就置灰:引擎在会话建立时锁定(三家续聊标识互不通用),要换请新建。 `),a.activeTab===`chat`?(H(),n(a.AgentEngineSelector,{key:0,class:`agent-engine`,engine:a.displayEngine,locked:a.isEngineLocked,onSelect:a.handleEngineSelect},null,8,[`engine`,`locked`])):U(`v-if`,!0),U(` 复制整条会话(默认精简范围,小箭头可选全量)——与工作台的「复制执行内容」同一套口径 `),a.activeTab===`chat`?(H(),n(a.CopySessionButton,{key:1,class:`agent-copy`,messages:a.messages,title:a.currentSessionTitle,engine:a.agentEngineName(a.displayEngine)},null,8,[`messages`,`title`,`engine`])):U(`v-if`,!0),U(` 本轮静默:挂在 Tab 行最右端(与引擎 / 复制同一条右对齐线)。
7
- 等回答时不算静默 —— 那一轮挂着是在等用户点选项(见 ChatSilenceBadge 文件头)。 `),a.activeTab===`chat`&&a.width>=a.TABS_SILENCE_MIN_WIDTH?(H(),n(a.ChatSilenceBadge,{key:2,class:`agent-silence`,"silent-ms":a.silentMs,streaming:a.isStreaming&&!a.questionPanel},null,8,[`silent-ms`,`streaming`])):U(`v-if`,!0)]),h(`div`,Pr,[U(` ── 对话 ── `),a.activeTab===`chat`?(H(),g(`div`,Fr,[U(` 窄屏 · 会话列表页:列表独占整页 `),a.narrow&&a.chatPage===`list`?(H(),g(`div`,Ir,[e(a.ConversationList,{class:`agent-conversations`,items:a.conversationItems,"active-id":a.currentSessionId,loading:a.sessionsLoading,labels:a.conversationLabels,onSelect:a.selectSession,onNew:a.handleNewSession,onRename:a.renameSession,onDelete:a.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])])):(H(),g(C,{key:1},[U(` 对话页(窄屏时顶上多一条返回条;宽屏左侧就摆着列表,不需要) `),a.narrow?(H(),g(`div`,Lr,[h(`button`,{type:`button`,class:`agent-page-back`,title:a.$t(`@AGENT:返回会话列表`),"aria-label":a.$t(`@AGENT:返回会话列表`),onClick:r[0]||=e=>a.chatPage=`list`},[...r[1]||=[h(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[h(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),h(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,Rr),h(`span`,zr,x(a.currentSessionTitle),1)])):U(`v-if`,!0),U(`
8
- 对话宿主:单独开一层裁剪边界。
9
- 欢迎页在矮/窄窗口里会比可用高度还高,而它是垂直居中的 —— 溢出的部分
10
- 会**向上**跑出 .acu-chat,盖到刚加的返回条上(把返回条的点击也一起吃掉,
11
- e2e 实测就是这个症状)。宿主的 overflow:hidden 把它裁在自己这一格里。
12
- `),h(`div`,{class:`agent-chat-host`,style:a.welcomeAvatarStyle},[U(` 加载中 `),a.sessionLoading?(H(),g(`div`,Br,[e(a.ElIcon,{class:`is-loading`,size:32},{default:j(()=>[e(a.Loading)]),_:1}),h(`span`,null,x(a.$t(`@AGENT:加载会话中...`)),1)])):(H(),g(C,{key:1},[U(` ChatContainer `),e(a.ChatContainer,{ref:`chatContainerRef`,messages:a.displayMessages,"preset-questions":a.presetQuestions,"welcome-title":a.$t(`@AGENT:智能体助手`),"welcome-description":a.$t(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":a.AGENT_ASSISTANT_NAME,"assistant-avatar":a.AGENT_ASSISTANT_AVATAR,theme:a.chatTheme,generating:a.isStreaming,"allow-queue":!0,queued:a.queuedMessages,"queue-paused":a.queuePaused,"queue-labels":a.queueLabels,"upload-config":{accept:a.AGENT_UPLOAD_ACCEPT},"context-usage":a.inputContextUsage,"git-branch":a.gitStore.currentBranch||void 0,model:a.inputModelName||void 0,placeholder:a.isStreaming?a.$t(`@AGENT:生成中,发送后会排队,等本轮跑完自动接上…`):a.$t(`@AGENT:输入消息,Enter 发送`),question:a.questionPanel,"question-submitting":a.answeringQuestion,"question-labels":a.questionLabels,"plan-config":{labels:{title:a.$t(`@AGENT:计划`),raw:a.$t(`@AGENT:原始参数`)}},"message-rail-config":a.MESSAGE_RAIL_CONFIG,"message-meta-config":a.MESSAGE_META_CONFIG,onSend:a.onSend,onSelect:a.onSelectPreset,onStop:a.stop,onUnqueue:a.removeQueuedMessage,onFlushQueued:a.flushQueued,onAnswer:a.answerQuestion,onRetry:a.retryTurn},null,8,`messages.preset-questions.welcome-title.welcome-description.assistant-name.assistant-avatar.theme.generating.queued.queue-paused.queue-labels.upload-config.context-usage.git-branch.model.placeholder.question.question-submitting.question-labels.plan-config.message-rail-config.message-meta-config.onStop.onUnqueue.onFlushQueued.onAnswer.onRetry`.split(`.`))],2112))])],64))])):a.activeTab===`schedule`?(H(),g(C,{key:1},[U(` ── 定时任务 ── `),e(a.SchedulePanel,{onOpenSession:a.handleScheduleOpenSession})],2112)):a.activeTab===`skill`||a.activeTab===`mcp`?(H(),g(C,{key:2},[U(` ── Skill 广场 / MCP 广场 ── `),e(a.MarketplacePanel,{type:a.marketplaceType},null,8,[`type`])],2112)):(H(),g(C,{key:3},[U(` ── 设置(提示词设置)── `),e(a.AgentPromptSettings)],2112))])])],512)}var Hr=K(kr,[[`render`,Vr],[`__scopeId`,`data-v-bd681ddd`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/AgentView.vue`]]);export{Hr as default};
@@ -1,4 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Cn as t,F as n,Ft as r,G as i,I as a,In as o,J as s,K as c,Mn as l,Sn as u,Tn as d,U as f,Wr as p,Xr as m,Yn as h,_ as g,_n as _,et as v,gr as y,hn as b,ir as x,jr as S,jt as C,lr as w,on as T,qn as E,wn as D,xn as O}from"./element-plus-Bz6lYur-.js";import{n as k,t as A}from"./_plugin-vue_export-helper-BhoBCXbu.js";import{t as j}from"./CommonDialog-DcXSTg3n.js";import{G as M,K as N}from"./index-9h6sH4q0.js";o(),w();var P=l({__name:`BranchSelector`,emits:[`branchChanged`],setup(e,{expose:t,emit:n}){t();let i=M(),a=n,o=y(!1),s=y(``),c=O(()=>{let e=s.value.trim().toLowerCase();return e?i.allBranches.filter(t=>t.toLowerCase().includes(e)):i.allBranches});async function l(e){if(e===i.currentBranch){o.value=!1;return}o.value=!1,await i.changeBranch(e)&&(a(`branchChanged`),i.refreshLog())}let u=y(!1),d=y(``),f=y(``);function p(){o.value=!1,f.value=i.currentBranch,u.value=!0}async function m(){await i.createBranch(d.value,f.value)&&(u.value=!1,d.value=``,a(`branchChanged`))}let h=y(!1);async function g(){if(!h.value){h.value=!0;try{await Promise.all([i.getCurrentBranch(!0),i.getBranchStatus(!0),i.getAllBranches()]),a(`branchChanged`),i.refreshLog()}finally{h.value=!1}}}let _={gitStore:i,emit:a,branchPopoverVisible:o,branchFilter:s,filteredBranches:c,selectBranch:l,createBranchDialogVisible:u,newBranchName:d,selectedBaseBranch:f,openCreateBranchDialog:p,createNewBranch:m,isRefreshingBranch:h,refreshCurrentBranch:g,get $t(){return k},get Plus(){return r},get Menu(){return C},get Check(){return v},CommonDialog:j,IconButton:N};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}});o(),S(),T();var F={key:0,class:`branch-info`},I={class:`branch-wrapper`},L={class:`branch-btn`},R={class:`branch-btn-name`},z={class:`branch-btn-caret`},B={class:`branch-popover-inner`},V={class:`branch-search`},H={class:`branch-list`},U=[`onClick`],W={key:1,class:`branch-item-check-placeholder`},G={class:`branch-item-name`},K={key:0,class:`branch-empty`},q={class:`branch-popover-footer`},J={class:`create-branch-content`},Y={class:`form-label`},X={class:`form-label`},Z={class:`dialog-footer`},Q={class:`footer-actions`},$=[`disabled`];function ee(r,o,l,v,y,S){let C=s,w=f,T=g,O=c,k=n,A=a,j=i;return v.gitStore.currentBranch?(E(),d(`div`,F,[u(`div`,I,[D(` VSCode 风格分支按钮 + 弹出列表 `),e(T,{visible:v.branchPopoverVisible,"onUpdate:visible":o[1]||=e=>v.branchPopoverVisible=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:o[2]||=e=>v.branchFilter=``},{reference:x(()=>[u(`button`,L,[D(` git-branch.svg(Tabler icons,MIT) `),o[8]||=u(`svg`,{class:`branch-btn-icon`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[u(`path`,{d:`M5 18a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M5 6a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M15 6a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M7 8l0 8`}),u(`path`,{d:`M9 18h6a2 2 0 0 0 2-2v-5`}),u(`path`,{d:`M14 14l3-3l3 3`})],-1),u(`span`,R,m(v.gitStore.currentBranch),1),u(`span`,z,[D(` chevron-down.svg(Tabler icons,MIT) `),e(C,null,{default:x(()=>[...o[7]||=[u(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[u(`path`,{d:`M6 9l6 6l6 -6`})],-1)]]),_:1})])])]),default:x(()=>[u(`div`,B,[D(` 搜索框 `),u(`div`,V,[e(w,{modelValue:v.branchFilter,"onUpdate:modelValue":o[0]||=e=>v.branchFilter=e,placeholder:v.$t(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),D(` 分支列表 `),u(`div`,H,[(E(!0),d(_,null,h(v.filteredBranches,n=>(E(),d(`div`,{key:n,class:p([`branch-item`,{"is-active":n===v.gitStore.currentBranch}]),onClick:e=>v.selectBranch(n)},[n===v.gitStore.currentBranch?(E(),t(C,{key:0,class:`branch-item-check`},{default:x(()=>[e(v.Check)]),_:1})):(E(),d(`span`,W)),D(` git-branch.svg(Tabler icons,MIT) `),o[9]||=u(`svg`,{class:`branch-item-icon`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[u(`path`,{d:`M5 18a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M5 6a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M15 6a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),u(`path`,{d:`M7 8l0 8`}),u(`path`,{d:`M9 18h6a2 2 0 0 0 2-2v-5`}),u(`path`,{d:`M14 14l3-3l3 3`})],-1),u(`span`,G,m(n),1)],10,U))),128)),v.filteredBranches.length===0?(E(),d(`div`,K,m(v.$t(`@F13B4:没有匹配的分支`)),1)):D(`v-if`,!0)]),D(` 底部:创建新分支 `),u(`div`,q,[u(`button`,{class:`branch-create-btn`,onClick:v.openCreateBranchDialog},[e(C,null,{default:x(()=>[e(v.Plus)]),_:1}),u(`span`,null,m(v.$t(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),D(` 刷新按钮(size=small:与 RemoteRepoCard 状态栏那两颗同档。
2
- IconButton 默认走 medium = 38px 盒 / 20px 字形(--icon-glyph-size-md),
3
- 比邻居大一整档 —— 用户 2026-10-16 反馈"footer 这枚刷新比其他的都大"。
4
- 图标本身本来就是 Tabler refresh,不用换。) `),e(v.IconButton,{size:`small`,tooltip:v.$t(`@CMDCON:刷新`),onClick:v.refreshCurrentBranch},{default:x(()=>[D(` refresh.svg(Tabler icons,MIT) `),e(C,{class:p({"is-loading":v.isRefreshingBranch})},{default:x(()=>[...o[10]||=[u(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[u(`path`,{d:`M20 11a8.1 8.1 0 0 0-15.5-2m-.5-4v4h4`}),u(`path`,{d:`M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4`})],-1)]]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),D(` 创建分支对话框 `),e(v.CommonDialog,{modelValue:v.createBranchDialogVisible,"onUpdate:modelValue":o[6]||=e=>v.createBranchDialogVisible=e,title:v.$t(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:x(()=>[u(`div`,Z,[u(`div`,Q,[u(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:o[5]||=e=>v.createBranchDialogVisible=!1},m(v.$t(`@F13B4:取消`)),1),u(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:v.createNewBranch,disabled:v.gitStore.isCreatingBranch},[v.gitStore.isCreatingBranch?(E(),t(C,{key:1,class:`is-loading`},{default:x(()=>[...o[11]||=[u(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[u(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z`})],-1)]]),_:1})):(E(),t(C,{key:0},{default:x(()=>[e(v.Check)]),_:1})),u(`span`,null,m(v.$t(`@F13B4:创建`)),1)],8,$)])])]),default:x(()=>[u(`div`,J,[e(j,{model:{newBranchName:v.newBranchName,selectedBaseBranch:v.selectedBaseBranch},"label-position":`top`},{default:x(()=>[e(O,null,{label:x(()=>[u(`div`,Y,[e(C,{class:`label-icon`},{default:x(()=>[e(v.Plus)]),_:1}),u(`span`,null,m(v.$t(`@F13B4:新分支名称`)),1)])]),default:x(()=>[e(w,{modelValue:v.newBranchName,"onUpdate:modelValue":o[3]||=e=>v.newBranchName=e,placeholder:v.$t(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:b(v.createNewBranch,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),e(O,null,{label:x(()=>[u(`div`,X,[e(C,{class:`label-icon`},{default:x(()=>[e(v.Menu)]),_:1}),u(`span`,null,m(v.$t(`@F13B4:基于分支`)),1)])]),default:x(()=>[e(A,{modelValue:v.selectedBaseBranch,"onUpdate:modelValue":o[4]||=e=>v.selectedBaseBranch=e,placeholder:v.$t(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:x(()=>[(E(!0),d(_,null,h(v.gitStore.allBranches,e=>(E(),t(k,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):D(`v-if`,!0)}var te=A(P,[[`render`,ee],[`__scopeId`,`data-v-9548a76f`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/BranchSelector.vue`]]);export{te as default};
@@ -1 +0,0 @@
1
- .mindmap-preview[data-v-3969a8bf]{background:var(--bg-container,#fff);flex-direction:column;width:100%;height:100%;display:flex}.mindmap-preview-header[data-v-3969a8bf]{background:var(--bg-panel,var(--md-bg-subtle));font-size:var(--font-size-sm);align-items:center;gap:12px;padding:8px 14px;display:flex}.mindmap-preview-title[data-v-3969a8bf]{color:var(--text-primary,var(--md-text-strong));letter-spacing:.5px;font-weight:600}.mindmap-preview-hint[data-v-3969a8bf]{color:var(--text-secondary,var(--md-text-muted));font-size:var(--font-size-xs)}.mindmap-preview-canvas[data-v-3969a8bf]{flex:1;width:100%;min-height:0}.mindmap-preview-canvas[data-v-3969a8bf] .zm-mindmap,.mindmap-preview-canvas[data-v-3969a8bf]>*{width:100%;height:100%}.editor-agent-panel[data-v-7cc12c51]{background:var(--bg-panel);border-left:1px solid var(--border-color);flex-direction:column;flex-grow:1;flex-basis:0;min-width:200px;min-height:0;display:flex;overflow:hidden}.agent-panel-header[data-v-7cc12c51]{border-bottom:1px solid var(--border-color);flex-shrink:0;align-items:center;gap:8px;height:34px;padding:0 6px 0 12px;display:flex}.agent-panel-title[data-v-7cc12c51]{font-size:var(--font-size-xs);letter-spacing:.08em;text-transform:uppercase;color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:700;overflow:hidden}.agent-panel-spacer[data-v-7cc12c51]{flex:1}.agent-panel-engine[data-v-7cc12c51]{flex:none}.agent-panel-silence[data-v-7cc12c51]{flex:none;margin-right:4px}.agent-panel-icon-btn[data-v-7cc12c51]{border-radius:var(--radius-xs);width:24px;height:24px;color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.agent-panel-icon-btn[data-v-7cc12c51]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-panel-body[data-v-7cc12c51]{flex:1;grid-template:"stage"minmax(0,1fr)"composer"/minmax(0,1fr);min-height:0;display:grid}.agent-panel-body.is-wide[data-v-7cc12c51]{transition:grid-template-columns var(--transition-base) var(--ease-custom);grid-template-columns:240px minmax(0,1fr);grid-template-areas:"list chat""list composer"}.agent-panel-body.is-wide.is-convs-collapsed[data-v-7cc12c51]{grid-template-columns:40px minmax(0,1fr)}.agent-panel-body.is-wide.is-convs-collapsed .agent-panel-convs[data-v-7cc12c51]{padding:8px 4px}.agent-panel-convs[data-v-7cc12c51]{grid-area:stage;min-height:0;padding:8px 10px;overflow-y:auto}.agent-panel-chat[data-v-7cc12c51]{grid-area:stage;min-height:0;display:flex}.agent-panel-body.is-wide .agent-panel-convs[data-v-7cc12c51]{grid-area:list}.agent-panel-body.is-wide .agent-panel-chat[data-v-7cc12c51]{grid-area:chat}.agent-panel-composer[data-v-7cc12c51]{padding:var(--acu-space-3) var(--acu-space-4) var(--acu-space-4);background:linear-gradient(to top, var(--acu-bg) 70%, transparent);grid-area:composer}.agent-panel-composer[data-v-7cc12c51] .acu-input-queue{--acu-queue-edge:var(--role-pending-edge);--acu-queue-surface:var(--role-pending-surface);--acu-queue-ink:var(--role-pending-ink);--acu-queue-wash:var(--role-pending-wash)}.agent-panel-chat[data-v-7cc12c51]>.acu-chat{flex:1;min-width:0}.agent-panel-chat[data-v-7cc12c51] .acu-avatar--left{background:0 0}.agent-panel-chat[data-v-7cc12c51] .acu-bubble-row.is-assistant .acu-bubble-main{width:var(--acu-bubble-max-width);max-width:var(--acu-bubble-max-width);position:relative}.agent-panel-chat[data-v-7cc12c51] .acu-bubble-row.is-assistant .acu-bubble{align-self:flex-start}.agent-panel-chat[data-v-7cc12c51] .acu-message-meta{margin:0;position:absolute;top:0;right:0}.agent-panel-composer[data-v-7cc12c51] .acu-input-wrap>.agent-context-slot{gap:var(--acu-space-2,8px);padding:var(--acu-space-2,8px) var(--acu-space-2,8px) 0;flex-wrap:wrap;display:flex}.agent-panel-composer[data-v-7cc12c51] .acu-input-attachments>.agent-context-slot{display:inline-flex}.agent-context-att[data-v-7cc12c51]{align-items:center;gap:var(--acu-space-2,8px);max-width:180px;padding:var(--acu-space-2,8px) var(--acu-space-3,12px);border:1px solid var(--acu-border);border-radius:var(--acu-radius-sm,8px);background:var(--acu-bg,var(--bg-container));color:var(--acu-text-secondary,var(--text-secondary));font-size:var(--acu-font-size-xs,12px);display:inline-flex;position:relative}.agent-context-att-icon[data-v-7cc12c51]{opacity:.75;flex-shrink:0}.agent-context-att-name[data-v-7cc12c51]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.agent-context-att-remove[data-v-7cc12c51]{border-radius:var(--acu-radius-full,999px);background:var(--acu-text,var(--text-primary));width:18px;height:18px;color:var(--acu-bg,var(--bg-container));cursor:pointer;box-shadow:var(--acu-shadow-sm,0 1px 2px #0003);transition:transform var(--acu-duration-fast,.15s) var(--acu-easing,ease);border:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute;top:-6px;right:-6px}.agent-context-att-remove[data-v-7cc12c51]:hover{transform:scale(1.12)}.agent-context-att-remove[data-v-7cc12c51]:active{transform:scale(1.02)}.editor-view[data-v-fc2ebf13]{background:var(--bg-container);width:100%;height:100%;box-shadow:var(--shadow-sm);border-radius:0;display:flex;overflow:hidden}.editor-sidebar[data-v-fc2ebf13]{background:var(--bg-panel);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.sidebar-header[data-v-fc2ebf13]{flex-shrink:0;justify-content:space-between;align-items:center;padding:8px 10px 6px;display:flex}.sidebar-title[data-v-fc2ebf13]{font-size:var(--font-size-xs);letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);-webkit-user-select:none;user-select:none;font-weight:700}.sidebar-action-btn[data-v-fc2ebf13]{cursor:pointer;color:var(--text-meta);border-radius:var(--radius-base);background:0 0;border:none;align-items:center;padding:3px;display:flex}.sidebar-action-btn[data-v-fc2ebf13]:hover{color:var(--text-primary);background:var(--bg-hover)}.sidebar-search[data-v-fc2ebf13]{flex-shrink:0;align-items:center;padding:6px 10px;display:flex;position:relative}.sidebar-search-icon[data-v-fc2ebf13]{color:var(--text-meta);pointer-events:none;position:absolute;left:18px}.sidebar-search-input[data-v-fc2ebf13]{min-width:0;height:26px;font-size:var(--font-size-sm);color:var(--text-primary);background:var(--bg-input,#ffffff0a);border:1px solid var(--border-color);border-radius:var(--radius-base);transition:border-color var(--transition-fast), background var(--transition-fast);outline:none;flex:1;padding:0 24px 0 26px}.sidebar-search-input[data-v-fc2ebf13]::placeholder{color:var(--text-meta)}.sidebar-search-input[data-v-fc2ebf13]:hover{border-color:var(--text-tertiary)}.sidebar-search-input[data-v-fc2ebf13]:focus{border-color:var(--color-primary);background:var(--bg-panel)}.sidebar-search-clear[data-v-fc2ebf13]{cursor:pointer;width:18px;height:18px;color:var(--text-meta);transition:background var(--transition-fast), color var(--transition-fast);background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;display:flex;position:absolute;right:14px}.sidebar-search-clear[data-v-fc2ebf13]:hover{background:var(--bg-hover);color:var(--text-primary)}.tree-name-hit[data-v-fc2ebf13]{color:var(--color-warning-light);border-radius:var(--radius-xs);background:#f59e0b26;padding:0 1px}.search-section-head[data-v-fc2ebf13]{letter-spacing:.04em;color:var(--text-meta);-webkit-user-select:none;user-select:none;align-items:center;gap:6px;padding:7px 12px 3px;font-size:11px;font-weight:600;display:flex}.search-section-count[data-v-fc2ebf13]{text-align:center;min-width:14px;color:var(--text-meta);background:var(--bg-hover);border-radius:var(--radius-xs);padding:0 4px;font-size:10px;line-height:14px}.search-section-note[data-v-fc2ebf13]{color:var(--text-meta);margin-left:auto;font-size:10px;font-weight:400}.content-results[data-v-fc2ebf13]{margin-top:6px;padding-bottom:6px}.content-results>.search-section-head[data-v-fc2ebf13],.content-results-status[data-v-fc2ebf13]{border-top:1px solid var(--border-color)}.content-results-status[data-v-fc2ebf13]{color:var(--text-meta);align-items:center;gap:6px;padding:8px 12px;font-size:12px;display:flex}.content-search-spin[data-v-fc2ebf13]{border:1.5px solid var(--color-primary);border-top-color:#0000;border-radius:50%;flex-shrink:0;width:11px;height:11px;animation:.8s linear infinite spin-fc2ebf13}.content-hit-file[data-v-fc2ebf13]{cursor:pointer;height:24px;color:var(--text-primary);transition:background var(--transition-fast);align-items:center;gap:5px;padding:0 8px 0 12px;display:flex}.content-hit-file[data-v-fc2ebf13]:hover,.content-hit-line[data-v-fc2ebf13]:hover{background:var(--bg-hover)}.content-hit-name[data-v-fc2ebf13]{font-size:var(--font-size-mid);white-space:nowrap}.content-hit-dir[data-v-fc2ebf13]{min-width:0;color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:11px;overflow:hidden}.content-hit-total[data-v-fc2ebf13]{text-align:center;min-width:16px;color:var(--text-meta);background:var(--bg-hover);border-radius:var(--radius-xs);flex-shrink:0;font-size:10px;line-height:14px}.content-hit-line[data-v-fc2ebf13]{cursor:pointer;align-items:baseline;gap:6px;padding:1px 10px 1px 24px;display:flex}.content-hit-ln[data-v-fc2ebf13]{text-align:right;width:30px;color:var(--text-meta);flex-shrink:0;font-family:JetBrains Mono,Consolas,monospace;font-size:10.5px}.content-hit-text[data-v-fc2ebf13]{min-width:0;color:var(--text-secondary);white-space:pre;text-overflow:ellipsis;flex:1;font-family:JetBrains Mono,Consolas,monospace;font-size:11px;overflow:hidden}.content-hit-mark[data-v-fc2ebf13]{color:var(--color-warning-light);border-radius:var(--radius-xs);background:#f59e0b26;padding:0 1px}.sidebar-tree[data-v-fc2ebf13]{flex:1;padding:4px 0;overflow:hidden auto}.tree-node[data-v-fc2ebf13]{cursor:pointer;border-radius:var(--radius-base);-webkit-user-select:none;user-select:none;height:24px;color:var(--text-primary);font-size:var(--font-size-mid);transition:background var(--transition-fast);white-space:nowrap;align-items:center;gap:4px;padding-right:8px;display:flex;overflow:hidden}.tree-node[data-v-fc2ebf13]:hover{background:var(--bg-hover)}.tree-node--active[data-v-fc2ebf13]{background:var(--tint-primary-12);color:var(--color-primary)}.tree-node--selected[data-v-fc2ebf13]{outline-offset:-1px;background:#63b3ed26;outline:1px solid #63b3ed59}.tree-arrow[data-v-fc2ebf13]{color:var(--text-meta);transition:transform var(--transition-fast);flex-shrink:0;align-items:center;width:12px;display:flex}.tree-arrow.expanded[data-v-fc2ebf13]{transform:rotate(90deg)}.tree-arrow-spacer[data-v-fc2ebf13]{flex-shrink:0;width:12px}.tree-icon[data-v-fc2ebf13]{font-size:var(--font-size-base);flex-shrink:0;align-items:center;line-height:1;display:flex}.tree-icon.mit-icon[data-v-fc2ebf13]{fill:currentColor;vertical-align:middle;width:14px;height:14px;display:inline-block}.tree-icon--dir[data-v-fc2ebf13]{color:#e8b84b}.tree-name[data-v-fc2ebf13]{text-overflow:ellipsis;min-width:0;font-size:var(--font-size-mid);flex:1;overflow:hidden}.tree-loading[data-v-fc2ebf13]{border:1.5px solid var(--color-primary);border-top-color:#0000;border-radius:50%;flex-shrink:0;width:10px;height:10px;animation:.8s linear infinite spin-fc2ebf13;display:inline-block}.tree-empty[data-v-fc2ebf13]{font-size:var(--font-size-sm);color:var(--text-meta);text-align:center;padding:24px 12px}.sidebar-loading[data-v-fc2ebf13]{flex:1;justify-content:center;align-items:center;display:flex}.spin-icon[data-v-fc2ebf13]{border:2px solid var(--color-primary);border-top-color:#0000;border-radius:50%;width:20px;height:20px;animation:.8s linear infinite spin-fc2ebf13;display:inline-block}@keyframes spin-fc2ebf13{to{transform:rotate(360deg)}}.editor-resizer[data-v-fc2ebf13]{cursor:col-resize;width:6px;transition:background var(--transition-fast);z-index:2;background:0 0;flex-shrink:0;position:relative}.editor-resizer[data-v-fc2ebf13]:after{content:"";background:var(--color-gray-300);border-radius:var(--radius-xs);width:2px;height:32px;transition:background var(--transition-fast), height var(--transition-fast);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.editor-resizer[data-v-fc2ebf13]:hover{background:var(--tint-primary-06)}.editor-resizer[data-v-fc2ebf13]:hover:after{background:var(--color-primary);height:48px;box-shadow:0 0 8px #3b82f666}.editor-main[data-v-fc2ebf13]{flex-direction:column;flex:1;display:flex;overflow:hidden}.editor-tabs[data-v-fc2ebf13]{background:var(--bg-panel);scrollbar-width:none;flex-shrink:0;display:flex;overflow:auto hidden}.editor-tabs[data-v-fc2ebf13]::-webkit-scrollbar{display:none}.editor-tab[data-v-fc2ebf13]{cursor:pointer;height:34px;font-size:var(--font-size-mid);color:var(--text-secondary);transition:background var(--transition-fast), color var(--transition-fast);-webkit-user-select:none;user-select:none;flex-shrink:0;align-items:center;gap:6px;min-width:80px;max-width:200px;padding:0 12px;display:flex}.editor-tab[data-v-fc2ebf13]:hover{background:var(--bg-hover);color:var(--text-primary)}.editor-tab.active[data-v-fc2ebf13]{background:var(--bg-container);color:var(--text-primary);border-bottom:2px solid var(--color-primary)}.tab-name[data-v-fc2ebf13]{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.tab-dirty-dot[data-v-fc2ebf13]{background:var(--color-warning);border-radius:50%;flex-shrink:0;width:6px;height:6px}.tab-close[data-v-fc2ebf13]{cursor:pointer;color:var(--text-meta);border-radius:var(--radius-base);opacity:0;transition:opacity var(--transition-fast), background var(--transition-fast);background:0 0;border:none;flex-shrink:0;align-items:center;padding:2px;display:flex}.editor-tab:hover .tab-close[data-v-fc2ebf13],.editor-tab.active .tab-close[data-v-fc2ebf13]{opacity:1}.tab-close[data-v-fc2ebf13]:hover{background:var(--bg-hover);color:var(--color-danger-dark)}.editor-empty[data-v-fc2ebf13]{flex:1}.monaco-container[data-v-fc2ebf13]{flex:1;min-width:0;overflow:hidden}.monaco-container.hidden[data-v-fc2ebf13]{display:none}.image-tab-placeholder[data-v-fc2ebf13]{justify-content:center;align-items:center;gap:var(--spacing-sm);color:var(--text-secondary);background:var(--bg-container);text-align:center;padding:var(--spacing-lg);flex-direction:column;flex:1;display:flex}.image-tab-placeholder-title[data-v-fc2ebf13]{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--text-primary);word-break:break-all;margin:0}.image-tab-placeholder-hint[data-v-fc2ebf13]{font-size:var(--font-size-sm);color:var(--text-meta);margin:0}.editor-body[data-v-fc2ebf13]{flex:1;min-height:0;display:flex;overflow:hidden}.preview-resizer[data-v-fc2ebf13]{cursor:col-resize;width:6px;transition:background var(--transition-fast);z-index:2;background:0 0;flex-shrink:0;order:99;margin-left:auto;position:relative}.preview-resizer[data-v-fc2ebf13]:after{content:"";background:var(--color-gray-300);border-radius:var(--radius-xs);width:2px;height:32px;transition:background var(--transition-fast), height var(--transition-fast);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.preview-resizer[data-v-fc2ebf13]:hover{background:var(--tint-primary-06)}.preview-resizer[data-v-fc2ebf13]:hover:after{background:var(--color-primary);height:48px;box-shadow:0 0 8px #3b82f666}.preview-panel[data-v-fc2ebf13]{background:var(--bg-panel);flex-direction:column;flex:1 1 0;min-width:200px;display:flex;overflow:hidden}.preview-header[data-v-fc2ebf13]{background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 10px;display:flex}.preview-title[data-v-fc2ebf13]{font-size:var(--font-size-xs);letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);-webkit-user-select:none;user-select:none;font-weight:700}.preview-ext-badge[data-v-fc2ebf13]{font-size:var(--font-size-xs);border-radius:var(--radius-base);background:var(--tint-primary-16);color:var(--color-primary);letter-spacing:.04em;padding:1px 5px;font-weight:600}.preview-header-spacer[data-v-fc2ebf13]{flex:1}.preview-close-btn[data-v-fc2ebf13]{cursor:pointer;color:var(--text-meta);border-radius:var(--radius-base);transition:color var(--transition-fast), background var(--transition-fast);background:0 0;border:none;align-items:center;padding:3px;display:flex}.preview-close-btn[data-v-fc2ebf13]:hover{color:var(--color-danger-dark);background:var(--bg-hover)}.preview-body[data-v-fc2ebf13]{flex-direction:column;flex:1;display:flex;overflow:hidden}.preview-copybar[data-v-fc2ebf13]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;padding:6px 10px;display:flex}.preview-copy-btn[data-v-fc2ebf13]{border:1px solid var(--border-color);border-radius:var(--radius-base);background:var(--bg-panel);color:var(--text-secondary);font-size:var(--font-size-xs);cursor:pointer;white-space:nowrap;transition:background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);align-items:center;gap:5px;padding:3px 10px;font-weight:600;display:inline-flex}.preview-copy-btn[data-v-fc2ebf13]:hover:not(:disabled){background:var(--bg-hover);color:var(--text-primary)}.preview-copy-btn[data-v-fc2ebf13]:disabled{opacity:.6;cursor:default}.preview-copy-btn.done[data-v-fc2ebf13]{border-color:var(--color-primary);color:var(--color-primary);background:var(--tint-primary-12)}.preview-copy-btn--primary[data-v-fc2ebf13]{background:var(--color-primary);color:#fff;border-color:#0000}.preview-copy-btn--primary[data-v-fc2ebf13]:hover:not(:disabled){background:var(--color-primary-dark,var(--color-primary));color:#fff}.preview-copy-btn--primary.done[data-v-fc2ebf13]{background:var(--color-primary);color:#fff;border-color:#0000}.preview-copy-btn-icon[data-v-fc2ebf13]{opacity:.75;font-family:monospace;font-size:11px}.preview-copy-embed[data-v-fc2ebf13]{color:var(--text-meta);font-size:var(--font-size-xs);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:5px;margin-left:auto;display:inline-flex}.preview-copy-embed input[data-v-fc2ebf13]{accent-color:var(--color-primary);margin:0}.preview-iframe[data-v-fc2ebf13]{background:0 0;border:none;flex:1;width:100%;height:100%}.preview-markdown[data-v-fc2ebf13]{flex:1;width:100%;height:100%;overflow:auto}.preview-mindmap[data-v-fc2ebf13]{background:var(--bg-container,#fff);flex-direction:column;flex:1;width:100%;height:100%;display:flex;overflow:hidden}.mindmap-toggle-btn.disabled[data-v-fc2ebf13]{opacity:.45;cursor:not-allowed}.mindmap-toggle-btn.active[data-v-fc2ebf13]{color:#fff;background:linear-gradient(#6366f1 0%,#4f46e5 100%);border-color:#4f46e5}.preview-image-wrap[data-v-fc2ebf13]{background:var(--bg-container);flex:1;justify-content:center;align-items:center;padding:16px;display:flex;overflow:auto}.preview-image-wrap img[data-v-fc2ebf13]{object-fit:contain;border-radius:var(--radius-base);max-width:100%;max-height:100%;box-shadow:0 2px 12px #0003}.editor-tabs-spacer[data-v-fc2ebf13]{flex:1}.preview-toggle-btn[data-v-fc2ebf13]{cursor:pointer;height:34px;color:var(--text-secondary);font-size:var(--font-size-sm);white-space:nowrap;transition:background var(--transition-fast), color var(--transition-fast);background:0 0;border:none;flex-shrink:0;align-items:center;gap:5px;padding:0 10px;display:flex}.preview-toggle-btn[data-v-fc2ebf13]:hover{background:var(--bg-hover);color:var(--text-primary)}.preview-toggle-btn.active[data-v-fc2ebf13]{color:var(--color-primary);background:var(--tint-primary-08)}.sidebar-actions[data-v-fc2ebf13]{align-items:center;gap:2px;display:flex}.tree-inline-input-row[data-v-fc2ebf13]{cursor:default;background:var(--bg-hover)}.tree-inline-input[data-v-fc2ebf13]{min-width:0;height:20px;font-size:var(--font-size-mid);background:var(--bg-container);border:1px solid var(--color-primary);border-radius:var(--radius-base);color:var(--text-primary);outline:none;flex:1;padding:0 5px;font-family:inherit}.ctx-menu[data-v-fc2ebf13]{z-index:var(--z-menu-float);background:var(--bg-container);border:1px solid var(--border-color);border-radius:var(--radius-md);-webkit-user-select:none;user-select:none;min-width:160px;padding:4px;position:fixed;box-shadow:0 8px 24px #00000059}.ctx-menu-icon[data-v-fc2ebf13]{flex-shrink:0;width:13px;height:13px}.ctx-menu-item[data-v-fc2ebf13]{border-radius:var(--radius-base);cursor:pointer;width:100%;font-size:var(--font-size-mid);color:var(--text-primary);text-align:left;transition:background var(--transition-fast);background:0 0;border:none;align-items:center;gap:8px;padding:6px 10px;display:flex}.ctx-menu-item[data-v-fc2ebf13]:hover{background:var(--bg-hover)}.ctx-menu-item--danger[data-v-fc2ebf13]{color:var(--color-danger-dark)}.ctx-menu-item--danger[data-v-fc2ebf13]:hover{background:#ef44441a}.ctx-menu-sep[data-v-fc2ebf13]{background:var(--border-color);height:1px;margin:4px 2px}
@@ -1,38 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Bn as t,Cn as n,Gn as r,In as i,Kr as a,Mn as o,On as s,Sn as c,Tn as l,Un as ee,W as te,Wr as u,Xr as d,Yn as f,_n as p,_r as ne,ar as m,gn as h,gr as g,hn as _,i as v,ir as y,jr as b,kn as x,ln as re,lr as ie,mn as S,nr as C,on as w,pn as T,qn as E,r as ae,wn as D,xn as O,yn as k}from"./element-plus-Bz6lYur-.js";import{c as oe,l as se,t as ce}from"./vendor-C2k0GBzj.js";import{n as A,t as j}from"./_plugin-vue_export-helper-BhoBCXbu.js";import{t as le}from"./SvgIcon-kIrDXBzK.js";import{t as ue}from"./configStore-Bo0r1aq6.js";import{a as de,c as fe,i as pe,n as me,o as he,r as ge,s as _e}from"./monaco-CvMddat7.js";import{n as M,r as ve}from"./flow-mindmap-CpjwoduB.js";import{B as ye,F as be,H as xe,I as Se,L as Ce,P as we,R as Te,V as Ee,a as De,f as Oe,z as ke}from"./index-9h6sH4q0.js";import{a as Ae,c as je,i as Me,l as Ne,m as Pe,n as Fe,o as Ie,r as Le,s as Re,t as ze,u as Be}from"./agentConversations-DYws7uRd.js";import{c as N,d as P,n as F,t as Ve,u as He}from"./ChatSilenceBadge-CX-Q1BK4.js";function Ue(e){return{ts:`typescript`,tsx:`typescript`,js:`javascript`,mjs:`javascript`,cjs:`javascript`,jsx:`javascript`,vue:`html`,html:`html`,htm:`html`,css:`css`,scss:`scss`,less:`less`,json:`json`,jsonc:`json`,md:`markdown`,markdown:`markdown`,yaml:`yaml`,yml:`yaml`,toml:`ini`,xml:`xml`,svg:`xml`,sh:`shell`,bash:`shell`,zsh:`shell`,fish:`shell`,ps1:`powershell`,py:`python`,go:`go`,rs:`rust`,java:`java`,kt:`kotlin`,rb:`ruby`,php:`php`,c:`c`,cpp:`cpp`,h:`cpp`,cs:`csharp`,sql:`sql`,graphql:`graphql`,gql:`graphql`,txt:`plaintext`,log:`plaintext`,ini:`ini`,env:`ini`,gitignore:`ini`,dockerfile:`dockerfile`}[e.toLowerCase()]??`plaintext`}i();var I=o({__name:`MindmapPreview`,props:{content:{type:String,required:!0}},setup(e,{expose:t}){t();let n=e,r={props:n,data:O(()=>ve(n.content||``,`未命名文档`)),get MindMap(){return M}};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}});i();var L={class:`mindmap-preview`},R={class:`mindmap-preview-canvas`};function z(t,n,r,i,a,o){return E(),l(`div`,L,[n[0]||=c(`div`,{class:`mindmap-preview-header`},[c(`span`,{class:`mindmap-preview-title`},`整篇导图`),c(`span`,{class:`mindmap-preview-hint`},`基于整篇 Markdown 自动生成 · 阅读模式`)],-1),c(`div`,R,[e(i.MindMap,{data:i.data,"preview-mode":``},null,8,[`data`])])])}var We=j(I,[[`render`,z],[`__scopeId`,`data-v-3969a8bf`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/MindmapPreview.vue`]]);i(),ie();var B=o({__name:`EditorAgentPanel`,props:{activeFilePath:{type:[String,null],required:!1},activeFileName:{type:String,required:!1},active:{type:Boolean,required:!1}},emits:[`close`],setup(e,{expose:n,emit:i}){n();let a=e,o=i,{theme:s}=ke(),c=O(()=>s.value===`dark`?`dark`:`light`),{sessions:l,sessionsLoading:te,currentSessionId:u,messages:d,displayMessages:f,isStreaming:p,questionPanel:ne,answeringQuestion:m,isSessionGenerating:h,currentEngine:_,pendingEngine:v,isEngineLocked:y,pickEngine:b,loadSessions:x,loadSession:re,deleteSession:ie,renameSession:S,newSession:w,sendMessage:T,retryTurn:E,answerQuestion:ae,stop:D,inputContextUsage:k,queuedMessages:j,queuePaused:le,removeQueuedMessage:ue,flushQueued:de,silentMs:fe}=Be(),pe=O(()=>y.value?_.value:v.value);function me(e){y.value||b(e)}let he=O(()=>je(l.value,h)),ge=Ae(),_e=Ie(),M=Re(),ve=O(()=>he.value.find(e=>e.id===u.value)?.title||``),ye=g(null),be=g(null),xe=g(null),Se=g(null),Ce=g(null),{width:we,narrow:Te}=P(Ce),Ee=g(`chat`),{convListCollapsed:De,setConvListCollapsed:Oe}=He(),Ue=O(()=>!Te.value&&De.value),I=g(null),L=g(!1),R=null,z=O(()=>!!a.activeFileName&&!L.value);function We(e){return Array.from(e.children).find(e=>e.classList?.contains(`acu-input-attachments`))??null}function B(){let e=be.value?.$el;if(!e)return;let n=e.querySelector(`.agent-context-slot`);if(!z.value){if(!n)return;I.value=null,t(()=>n.remove());return}let r=I.value&&e.contains(I.value)?I.value:n;r||(r=document.createElement(`div`),r.className=`agent-context-slot`);let i=We(e),a=i??e;r.parentElement!==a&&a.insertBefore(r,i?i.firstChild:e.firstChild),I.value=r}function V(e=!0){ye.value?.scrollToBottom(e)}async function Ge(e){let n=L.value?void 0:a.activeFilePath||void 0;await T(e.text,e.files,{openFilePath:n}),await t(),V()}function Ke(e){re(e),Ee.value=`chat`}function H(){w(),Ee.value=`chat`}C(()=>d.value.length,()=>{t(()=>V(!1))});function U(){let e=Se.value;!e||typeof MutationObserver>`u`||(R?.disconnect(),R=new MutationObserver(()=>B()),R.observe(e,{childList:!0,subtree:!0}))}C(()=>a.active,e=>{e&&(Ee.value=`chat`,x().catch(()=>{}),t(()=>{B(),V(!1)}))}),C(Te,e=>{e||(Ee.value=`chat`)}),C(()=>a.activeFilePath,()=>{L.value=!1}),C(z,e=>{e&&t(B)}),r(()=>{x().catch(()=>{}),t(()=>{B(),U()})}),ee(()=>{R?.disconnect(),R=null,I.value=null});let qe={props:a,emit:o,theme:s,chatTheme:c,sessions:l,sessionsLoading:te,currentSessionId:u,messages:d,displayMessages:f,isStreaming:p,questionPanel:ne,answeringQuestion:m,isSessionGenerating:h,currentEngine:_,pendingEngine:v,isEngineLocked:y,pickEngine:b,loadSessions:x,loadSession:re,deleteSession:ie,renameSession:S,newSession:w,sendMessage:T,retryTurn:E,answerQuestion:ae,stop:D,inputContextUsage:k,queuedMessages:j,queuePaused:le,removeQueuedMessage:ue,flushQueued:de,silentMs:fe,displayEngine:pe,onEngineSelect:me,conversationItems:he,conversationLabels:ge,questionLabels:_e,queueLabels:M,currentSessionTitle:ve,chatRef:ye,inputRef:be,chatHostRef:xe,composerRef:Se,rootRef:Ce,width:we,narrow:Te,page:Ee,convListCollapsed:De,setConvListCollapsed:Oe,convsCollapsed:Ue,contextSlot:I,contextDismissed:L,get slotObserver(){return R},set slotObserver(e){R=e},showContextCard:z,findAttachmentsHost:We,syncContextSlot:B,scrollToBottom:V,onSend:Ge,onSelectSession:Ke,onNewSession:H,watchChatDom:U,get $t(){return A},get ChatContainer(){return oe},get ChatInput(){return se},get ConversationList(){return ce},get AGENT_UPLOAD_ACCEPT(){return Ne},get agentEngineName(){return Pe},get AGENT_ASSISTANT_NAME(){return Fe},get AGENT_ASSISTANT_AVATAR(){return ze},get MESSAGE_RAIL_CONFIG(){return Me},get MESSAGE_META_CONFIG(){return Le},AgentEngineSelector:N,CopySessionButton:F,ChatSilenceBadge:Ve};return Object.defineProperty(qe,"__isScriptSetup",{enumerable:!1,value:!0}),qe}});i(),b(),w();var V={ref:`rootRef`,class:`editor-agent-panel`},Ge={class:`agent-panel-header`},Ke=[`title`,`aria-label`],H={class:`agent-panel-title`},U={key:1,class:`agent-panel-title`},qe=[`title`,`aria-label`],Je=[`title`],Ye={class:`agent-panel-convs`},W={ref:`chatHostRef`,class:`agent-panel-chat`},Xe=[`data-theme`],Ze=[`title`],Qe={class:`agent-context-att-name`},$e=[`title`,`aria-label`];function et(t,r,i,a,o,ee){return E(),l(p,null,[D(`
2
- 文件空间右侧的 g ai 对话面板。
3
- - 够宽(≥680px,判据同「智能体」视图):左边一列会话历史 + 右边对话,历史**直接摆在那儿**,
4
- 不用先点按钮翻过去;不够宽就折成两页,头部按钮来回翻
5
- - 输入框常驻底部:ChatContainer 传 show-input=false,输入框拆出来自己摆在面板最下方。
6
- 于是两种形态、两个页面都有输入框 —— 列表页也能直接开聊,翻页时草稿与附件都不丢
7
- - 复用的都是组件库的独立导出:ConversationList(列表)+ ChatContainer(气泡区)+ ChatInput(输入框)
8
- - "当前打开的文档"通过请求级注入告知模型(sendMessage 的 openFilePath 选项);
9
- 它修饰的是**这一条消息的上下文**,所以做成附件卡片、搬进输入框内部(见 contextSlot)
10
- - 自己持有一个 useAgentChat 实例:runs/refs 与「对话」Tab 隔离,互不打断
11
- `),c(`div`,V,[c(`div`,Ge,[D(` 窄屏的列表页:整条 header 让给「返回对话 + 标题」 `),a.narrow&&a.page===`list`?(E(),l(p,{key:0},[c(`button`,{class:`agent-panel-icon-btn agent-panel-back-btn`,title:a.$t(`@EDITOR:返回对话`),"aria-label":a.$t(`@EDITOR:返回对话`),onClick:r[0]||=e=>a.page=`chat`},[...r[4]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[c(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),c(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,Ke),c(`span`,H,d(a.$t(`@EDITOR:会话列表`)),1)],64)):(E(),l(`span`,U,d(a.$t(`@EDITOR:g ai 对话`)),1)),r[7]||=c(`div`,{class:`agent-panel-spacer`},null,-1),D(` 本轮静默:与「智能体」页、主 Agent 控制台同一枚(等回答时不算静默) `),!a.narrow||a.page===`chat`?(E(),n(a.ChatSilenceBadge,{key:2,class:`agent-panel-silence`,"silent-ms":a.silentMs,streaming:a.isStreaming&&!a.questionPanel},null,8,[`silent-ms`,`streaming`])):D(`v-if`,!0),D(` 引擎切换:与「智能体」视图同一套(同一个 AgentEngineSelector)。
12
- 宽屏左边摆着历史,对话区一直在,所以常驻;窄屏只在对话页出现 ——
13
- 列表页没有正在跑的对话,摆这儿只会挤占标题。 `),!a.narrow||a.page===`chat`?(E(),n(a.AgentEngineSelector,{key:3,class:`agent-panel-engine`,engine:a.displayEngine,locked:a.isEngineLocked,onSelect:a.onEngineSelect},null,8,[`engine`,`locked`])):D(`v-if`,!0),D(` 复制整条会话:只有对话页才有"当前这条会话"可复制(列表页连引擎选择器都不摆) `),!a.narrow||a.page===`chat`?(E(),n(a.CopySessionButton,{key:4,class:`agent-panel-copy`,messages:a.messages,title:a.currentSessionTitle,engine:a.agentEngineName(a.displayEngine)},null,8,[`messages`,`title`,`engine`])):D(`v-if`,!0),D(` 会话列表按钮:只有"列表是独立一页"时才需要它(宽屏列表就在旁边) `),a.narrow&&a.page===`chat`?(E(),l(`button`,{key:5,class:`agent-panel-icon-btn agent-panel-list-btn`,title:a.$t(`@EDITOR:会话列表`),"aria-label":a.$t(`@EDITOR:会话列表`),onClick:r[1]||=e=>a.page=`list`},[...r[5]||=[s(`<svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" data-v-7cc12c51><line x1="8" y1="6" x2="21" y2="6" data-v-7cc12c51></line><line x1="8" y1="12" x2="21" y2="12" data-v-7cc12c51></line><line x1="8" y1="18" x2="21" y2="18" data-v-7cc12c51></line><line x1="3" y1="6" x2="3.01" y2="6" data-v-7cc12c51></line><line x1="3" y1="12" x2="3.01" y2="12" data-v-7cc12c51></line><line x1="3" y1="18" x2="3.01" y2="18" data-v-7cc12c51></line></svg>`,1)]],8,qe)):D(`v-if`,!0),c(`button`,{class:`agent-panel-icon-btn`,title:a.$t(`@EDITOR:关闭对话`),onClick:r[2]||=e=>a.emit(`close`)},[...r[6]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`},[c(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),c(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,Je)]),c(`div`,{class:u([`agent-panel-body`,{"is-wide":!a.narrow,"is-convs-collapsed":a.convsCollapsed}])},[D(` 会话历史:宽屏是常驻左列(可收起),窄屏是独享整页 `),m(c(`div`,Ye,[e(a.ConversationList,{"show-search":!0,items:a.conversationItems,"active-id":a.currentSessionId,loading:a.sessionsLoading,labels:a.conversationLabels,collapsible:!a.narrow,collapsed:a.convsCollapsed,"onUpdate:collapsed":a.setConvListCollapsed,onSelect:a.onSelectSession,onNew:a.onNewSession,onRename:a.renameSession,onDelete:a.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`collapsible`,`collapsed`,`onUpdate:collapsed`,`onRename`,`onDelete`])],512),[[S,!a.narrow||a.page===`list`]]),D(` 气泡区:输入框已经不在这里了(show-input=false),见下面常驻的那一条 `),m(c(`div`,W,[e(a.ChatContainer,{ref:`chatRef`,"show-input":!1,messages:a.displayMessages,"assistant-name":a.AGENT_ASSISTANT_NAME,"assistant-avatar":a.AGENT_ASSISTANT_AVATAR,theme:a.chatTheme,question:a.questionPanel,"question-submitting":a.answeringQuestion,"question-labels":a.questionLabels,"plan-config":{labels:{title:a.$t(`@AGENT:计划`),raw:a.$t(`@AGENT:原始参数`)}},"message-rail-config":a.MESSAGE_RAIL_CONFIG,"message-meta-config":a.MESSAGE_META_CONFIG,onAnswer:a.answerQuestion,onRetry:a.retryTurn},null,8,[`messages`,`assistant-name`,`assistant-avatar`,`theme`,`question`,`question-submitting`,`question-labels`,`plan-config`,`message-rail-config`,`message-meta-config`,`onAnswer`,`onRetry`])],512),[[S,!a.narrow||a.page===`chat`]]),D(`
14
- 输入框常驻:两种形态、两个页面都在最下方(与演示页同一套做法)。
15
- 它被拆到 ChatContainer 外面,所以 acu-root 与 data-theme 得自己套上:
16
- 库把盒模型重置限定在 .acu-root 子树里,而 ChatInput 根节点是 div(不是 button),
17
- 少了它就会退回 content-box、横着溢出面板。
18
-
19
- v-if="width > 0":**等量到本面板的宽度再挂载输入框**。库的 ChatInput 只在
20
- onMounted 里量一次 scrollHeight,量到的宽度不对就再也纠不回来 —— 实测首帧挂载时
21
- 容器还没宽度,占位文案被折成十几行,textarea 直接顶到 200px 上限并一直卡在那里。
22
- 宽度是 useNarrowPane 在 onMounted 里同步量到的,所以这里晚的只是一次重渲染。
23
- `),a.width>0?(E(),l(`div`,{key:0,ref:`composerRef`,class:`agent-panel-composer acu-root`,"data-theme":a.chatTheme},[e(a.ChatInput,{ref:`inputRef`,generating:a.isStreaming,"allow-queue":!0,queued:a.queuedMessages,"queue-paused":a.queuePaused,"queue-labels":a.queueLabels,placeholder:a.isStreaming?a.$t(`@AGENT:生成中,发送后会排队,等本轮跑完自动接上…`):a.$t(`@AGENT:输入消息,Enter 发送`),"upload-config":{accept:a.AGENT_UPLOAD_ACCEPT},"context-usage":a.inputContextUsage,onSend:a.onSend,onStop:a.stop,onUnqueue:a.removeQueuedMessage,onFlushQueued:a.flushQueued},null,8,[`generating`,`queued`,`queue-paused`,`queue-labels`,`placeholder`,`upload-config`,`context-usage`,`onStop`,`onUnqueue`,`onFlushQueued`]),D(`
24
- 当前文档:**和添加的附件同处一行、同一副样子**。
25
- 组件库的 ChatContainer / ChatInput 没有任何插槽(dist 里 \`slots\` 出现 0 次),
26
- 没法声明式地往输入框里放东西,所以:
27
- · 往 \`.acu-input-wrap\` 插一个锚点,再把卡片 Teleport 进去(节点仍是 Vue 渲染的);
28
- · **有附件行(.acu-input-attachments)时锚点住进它内部** —— 卡片因此成为那一行的
29
- flex item,与附件并排、共用同一套 gap/wrap。只插在输入框最前面是不行的:
30
- Vue 更新输入框时会用自己的锚点 \`insertBefore\`,把外来节点挤到后面去。
31
- `),a.contextSlot?(E(),n(k,{key:0,to:a.contextSlot},[a.showContextCard?(E(),l(`div`,{key:0,class:`agent-context-att`,title:i.activeFilePath||``},[r[9]||=c(`svg`,{class:`agent-context-att-icon`,viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.7`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`},[c(`path`,{d:`M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z`}),c(`polyline`,{points:`14 3 14 8 19 8`})],-1),c(`span`,Qe,d(i.activeFileName),1),c(`button`,{type:`button`,class:`agent-context-att-remove`,title:a.$t(`@EDITOR:不引用当前文档`),"aria-label":a.$t(`@EDITOR:不引用当前文档`),onClick:r[3]||=e=>a.contextDismissed=!0},[...r[8]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`10`,height:`10`,fill:`none`,stroke:`currentColor`,"stroke-width":`3`,"stroke-linecap":`round`,"aria-hidden":`true`},[c(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),c(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,$e)],8,Ze)):D(`v-if`,!0)],8,[`to`])):D(`v-if`,!0)],8,Xe)):D(`v-if`,!0)],2)],512)],2112)}var tt=j(B,[[`render`,et],[`__scopeId`,`data-v-7cc12c51`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/EditorAgentPanel.vue`]]),nt=1080,rt=6e5,it=.86;function at(e){if(!e||e.startsWith(`data:`))return!1;if(e.startsWith(`blob:`)||e.startsWith(`/`))return!0;try{return new URL(e,location.href).origin===location.origin}catch{return!1}}async function ot(e){try{let t=await fetch(e);if(!t.ok)return null;let n=await t.blob();return await new Promise(e=>{let t=new FileReader;t.onload=()=>e(t.result||``),t.onerror=()=>e(``),t.readAsDataURL(n)})}catch{return null}}function G(e){return new Promise(t=>{let n=!1,r=e=>{n||(n=!0,t(e))};if(typeof Image>`u`){r(e);return}let i=new Image,a=setTimeout(()=>r(e),4e3);i.onload=()=>{if(clearTimeout(a),!(i.naturalWidth>nt||e.length>rt)){r(e);return}try{let t=Math.min(1,nt/i.naturalWidth),n=Math.max(1,Math.round(i.naturalWidth*t)),a=Math.max(1,Math.round(i.naturalHeight*t)),o=document.createElement(`canvas`);o.width=n,o.height=a;let s=o.getContext(`2d`);if(!s){r(e);return}s.fillStyle=`#ffffff`,s.fillRect(0,0,n,a),s.drawImage(i,0,0,n,a),r(o.toDataURL(`image/jpeg`,it))}catch{r(e)}},i.onerror=()=>{clearTimeout(a),r(e)},i.src=e})}async function st(e){let t=await ot(e);return t?G(t):null}async function ct(e){let t=Array.from(e.querySelectorAll(`img`)).filter(e=>at(e.getAttribute(`src`)||``)),n=0;return await Promise.all(t.map(async e=>{let t=await st(e.getAttribute(`src`)||``);t?e.setAttribute(`src`,t):n+=1})),n}function lt(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}var K={h1:`font-size:26px;font-weight:700;line-height:1.35;margin:28px 0 16px;color:#111;`,h2:`font-size:22px;font-weight:700;line-height:1.4;margin:26px 0 14px;color:#111;`,h3:`font-size:19px;font-weight:700;line-height:1.45;margin:22px 0 12px;color:#222;`,h4:`font-size:17px;font-weight:600;line-height:1.5;margin:20px 0 10px;color:#333;`,h5:`font-size:16px;font-weight:600;line-height:1.5;margin:18px 0 8px;color:#333;`,h6:`font-size:15px;font-weight:600;line-height:1.5;margin:18px 0 8px;color:#555;`,p:`font-size:16px;line-height:1.8;margin:16px 0;color:#333;`,li:`font-size:16px;line-height:1.8;margin:0 0 6px;color:#333;`,ul:`margin:16px 0;padding-left:24px;`,ol:`margin:16px 0;padding-left:24px;`,blockquote:`margin:16px 0;padding:8px 16px;border-left:4px solid #e2e2e2;background:#f7f7f7;color:#666;font-size:15px;line-height:1.8;`,hr:`border:none;border-top:1px solid #e5e5e5;margin:26px 0;`,a:`color:#576b95;text-decoration:none;`,strong:`font-weight:700;color:#111;`,em:`font-style:italic;color:#555;`,code:`font-family:Menlo,Consolas,Monaco,monospace;font-size:0.92em;background:#f2f3f5;color:#c7254e;padding:1px 5px;border-radius:3px;`,pre:`font-family:Menlo,Consolas,Monaco,monospace;font-size:13px;line-height:1.6;background:#f6f8fa;color:#24292f;padding:12px 14px;border-radius:6px;overflow-x:auto;margin:16px 0;`,table:`border-collapse:collapse;width:100%;margin:16px 0;font-size:14px;`,th:`border:1px solid #e0e0e0;padding:8px 10px;background:#f6f8fa;font-weight:600;text-align:left;color:#333;`,td:`border:1px solid #e0e0e0;padding:8px 10px;color:#333;`,img:`max-width:100%;height:auto;display:block;margin:16px auto;border-radius:6px;`};function ut(e){e.querySelectorAll(`*`).forEach(e=>{let t=K[e.tagName.toLowerCase()];t&&e.setAttribute(`style`,t)}),e.querySelectorAll(`pre code`).forEach(e=>e.setAttribute(`style`,`background:none;padding:0;color:inherit;font-size:inherit;`))}async function dt(e,t){let n=e.cloneNode(!0),r=t?await ct(n):0;return{html:n.innerHTML,leftover:r}}async function ft(e,t){let n=e.cloneNode(!0),r=t.inline?await ct(n):0;ut(n);let i=(t.title||``).trim();return{html:`<section style="font-size:16px;line-height:1.8;color:#333;word-break:break-word;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;">${i?`<h1 style="font-size:26px;font-weight:700;line-height:1.35;margin:0 0 22px;color:#111;">${lt(i)}</h1>`:``}${n.innerHTML}</section>`,leftover:r}}i(),ie();var pt=2,mt=6e4,ht=3e4,gt=o({__name:`EditorView`,props:{pendingFilePath:{type:[String,null],required:!1}},setup(e,{expose:n}){n(),self.MonacoEnvironment={getWorker(e,t){return t===`json`?new _e:t===`css`||t===`scss`||t===`less`?new he:t===`html`||t===`handlebars`||t===`razor`?new de:t===`typescript`||t===`javascript`?new pe:new fe}};let i=e,a=ue(),o=Oe(),s=g([]),c=g(!1),l=g(``),u=g(``),d=null;function f(){l.value=``,u.value=``,d&&=(clearTimeout(d),null)}C(l,e=>{d&&clearTimeout(d),d=setTimeout(()=>{u.value=e,d=null},180)});let p=g([]),m=g(0),h=g(``),_=g(!1),y=g(!1),b=null,x=0;function re(){b?.abort(),b=null,x+=1,p.value=[],m.value=0,h.value=``,_.value=!1,y.value=!1}async function ie(e){let t=e.trim(),n=a.currentDirectory;if(!n||t.length<pt){re();return}if(t===h.value&&_.value)return;b?.abort();let r=++x,i=new AbortController;b=i,_.value=!0,h.value=t;try{let e=await(await fetch(`/api/search_content`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:n,query:t}),signal:i.signal})).json().catch(()=>null);if(r!==x)return;if(!e?.success){p.value=[],m.value=0,y.value=!1;return}p.value=Array.isArray(e.files)?e.files:[],m.value=typeof e.totalMatches==`number`?e.totalMatches:0,y.value=!!e.truncated}catch(e){if(e?.name===`AbortError`||r!==x)return;p.value=[],m.value=0,y.value=!1}finally{r===x&&(_.value=!1)}}C(u,e=>{ie(e)}),ee(()=>{d&&clearTimeout(d),b?.abort(),T(),ot()});let S=null;function w(){T(),a.ui.fileTreeAutoRefresh&&(S=setInterval(()=>{document.hidden||a.currentDirectory&&(l.value.trim()||j())},mt))}function T(){S&&=(clearInterval(S),null)}C(()=>a.currentDirectory,async()=>{if(z=!1,re(),w(),await D(),N.value.some(e=>e.isDirty)){z=!0;return}N.value=[],P.value=null,Je(),await Ge()}),C(()=>a.ui.fileTreeAutoRefresh,()=>{w()});async function E(e,t=0){let n=await(await fetch(`/api/browse_directory?path=${encodeURIComponent(e)}`)).json();return n.success?n.items.map(e=>({...e,depth:t,expanded:!1,loading:!1,children:(e.type,void 0)})):[]}async function D(){let e=a.currentDirectory;if(e){c.value=!0;try{s.value=await E(e,0)}finally{c.value=!1}}}function k(e,t=new Set){for(let n of e)n.type===`directory`&&n.expanded&&(t.add(n.path),n.children&&k(n.children,t));return t}function oe(e,t=0){return(e||[]).map(e=>{let n={name:e.name,path:e.path,type:e.type,depth:t,expanded:!1,loading:!1};return n.type===`directory`&&Array.isArray(e.children)&&(n.children=oe(e.children,t+1),n.expanded=!0),n})}async function se(e){let t=a.currentDirectory;if(!t)return null;try{let n=await(await fetch(`/api/browse_directory_tree`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:t,expand:e})})).json().catch(()=>null);return!n?.success||!Array.isArray(n.items)?null:oe(n.items,0)}catch{return null}}function ce(e,t){let n=new Map(e.map(e=>[e.path,e])),r=e.length!==t.length;if(!r){for(let n=0;n<t.length;n++)if(e[n].path!==t[n].path){r=!0;break}}for(let e=0;e<t.length;e++){let i=t[e],a=n.get(i.path);a&&(t[e]=a,a.name!==i.name&&(a.name=i.name,r=!0),a.type===`directory`&&a.expanded&&Array.isArray(i.children)&&(Array.isArray(a.children)?ce(a.children,i.children)&&(a.children=i.children,r=!0):(a.children=i.children,r=!0)))}return r}async function j(e={}){if(!a.currentDirectory)return;let t=await se([...k(s.value)]);if(!t){e.notifyOnError&&v.error(A(`@EDITOR:刷新失败`));return}if(s.value.length===0){s.value=t;return}ce(s.value,t)&&(s.value=t)}async function M(e){if(e.type===`directory`){if(e.expanded)e.expanded=!1;else{if(!e.children){e.loading=!0;try{e.children=await E(e.path,e.depth+1)}finally{e.loading=!1}}e.expanded=!0}}}function ve(e){let t=[];for(let n of e)t.push(n),n.type===`directory`&&n.expanded&&n.children&&t.push(...ve(n.children));return t}let Ae=O(()=>u.value.trim().toLowerCase());function je(e,t){if(!t)return e;let n=[];for(let r of e){let e=r.name.toLowerCase().includes(t);if(r.type===`directory`){let i=r.children?je(r.children,t):[];if(!e&&i.length===0)continue;n.push({...r,expanded:!0,children:r.children===void 0?void 0:i})}else e&&n.push(r)}return n}function Me(e,t){for(let n of e){if(n.path===t)return n;if(n.children){let e=Me(n.children,t);if(e)return e}}return null}let Ne=O(()=>je(s.value,Ae.value)),Pe=O(()=>Ae.value.length>0&&Ne.value.length===0),Fe=O(()=>Pe.value&&p.value.length===0&&!_.value);function Ie(e){let t=u.value.trim();if(!t)return[{text:e,hit:!1}];let n=e.toLowerCase(),r=t.toLowerCase(),i=[],a=0,o=n.indexOf(r,a);for(;o!==-1;)o>a&&i.push({text:e.slice(a,o),hit:!1}),i.push({text:e.slice(o,o+r.length),hit:!0}),a=o+r.length,o=n.indexOf(r,a);return a<e.length&&i.push({text:e.slice(a),hit:!1}),i}async function Le(e,n){if(await Ve({name:e.name,path:e.path,type:`file`,depth:0}),!n||n<1)return;await t();let r=H.value;r&&r.getModel()&&I()?.path===e.path&&(r.revealLineInCenter(n,ge.ScrollType.Smooth),r.setPosition({lineNumber:n,column:1}),r.focus())}let Re=g(null);function ze(){let e=Re.value;e&&(e.focus(),e.select())}function Be(){l.value?(f(),Re.value?.focus()):(Re.value?.blur(),H.value?.focus())}let N=g([]),P=g(null),F=g(null);async function Ve(e){if(F.value=e,e.type!==`file`){M(Me(s.value,e.path)??e);return}let n=N.value.find(t=>t.path===e.path);if(console.log(`[debug-open-in-editor] EditorView openFile existing tab check:`,{path:e.path,found:!!n,tabsCount:N.value.length}),n){P.value=e.path,t(()=>W());return}let r=e.name.split(`.`).pop()||``;if(Xt.has(r.toLowerCase())){let t={path:e.path,name:e.name,content:``,originalContent:``,isDirty:!1,language:`plaintext`,diskMtimeMs:null};N.value.push(t),P.value=e.path,X.value=!0;return}if(ye(e.name)){let t={path:e.path,name:e.name,content:``,originalContent:``,isDirty:!1,language:`office`,diskMtimeMs:null};N.value.push(t),P.value=e.path,Z.value=!1,X.value=!0;return}try{let t=await fetch(`/api/editor/file?path=${encodeURIComponent(e.path)}`),n=await t.json();if(console.log(`[debug-open-in-editor] EditorView fetch /api/editor/file response:`,{path:e.path,status:t.status,data:n}),!n.success){v.error(`${A(`@EDITOR:打开文件失败: `)}${n.error}`);return}let i=Ue(r),a=U.get(e.path);a&&!a.isDisposed()&&a.setValue(n.content);let o={path:e.path,name:e.name,content:n.content,originalContent:n.content,isDirty:!1,language:i,diskMtimeMs:typeof n.mtimeMs==`number`?n.mtimeMs:null};console.log(`[debug-open-in-editor] EditorView pushing tab:`,{path:o.path,name:o.name,contentLen:o.content.length,lang:o.language}),N.value.push(o),P.value=e.path,console.log(`[debug-open-in-editor] EditorView tabs after push:`,N.value.length,`activeTabPath=`,P.value)}catch(e){console.log(`[debug-open-in-editor] EditorView fetch threw:`,e),v.error(`${A(`@EDITOR:打开文件失败: `)}${e.message}`)}}C(()=>i.pendingFilePath,async e=>{if(console.log(`[debug-open-in-editor] EditorView watcher fired, filePath=`,e),!e)return;await t();let n=e.split(/[\\/]/).pop()||e;console.log(`[debug-open-in-editor] EditorView calling openFile, name=`,n,`path=`,e),await Ve({name:n,path:e,type:`file`,depth:0}),console.log(`[debug-open-in-editor] EditorView openFile returned`)},{immediate:!0});function He(e,t){t.stopPropagation();let n=N.value.findIndex(t=>t.path===e);n!==-1&&(!N.value[n].isDirty||confirm(A(`@EDITOR:文件未保存,确认关闭?`)))&&(N.value.splice(n,1),P.value===e&&(P.value=N.value[Math.min(n,N.value.length-1)]?.path??null))}let I=()=>N.value.find(e=>e.path===P.value)??null,L=O(()=>({expandedDirs:[...k(s.value)],tabs:N.value.map(e=>e.path),activeTab:P.value})),R=!1,z=!1;function B(){z&&!R&&a.isUiLoaded&&a.saveEditorWorkspace(L.value)}C(L,()=>B());async function V(e){if(N.value.some(t=>t.path===e))return;let t=e.split(/[\\/]/).pop()||e,n=(t.split(`.`).pop()||``).toLowerCase();if(Xt.has(n)){N.value.push({path:e,name:t,content:``,originalContent:``,isDirty:!1,language:`plaintext`,diskMtimeMs:null});return}if(ye(t)){N.value.push({path:e,name:t,content:``,originalContent:``,isDirty:!1,language:`office`,diskMtimeMs:null});return}try{let r=await(await fetch(`/api/editor/file?path=${encodeURIComponent(e)}`)).json();if(!r.success)return;let i=U.get(e);i&&!i.isDisposed()&&H.value?.getModel()!==i&&(i.dispose(),U.delete(e)),N.value.push({path:e,name:t,content:r.content,originalContent:r.content,isDirty:!1,language:Ue(n),diskMtimeMs:typeof r.mtimeMs==`number`?r.mtimeMs:null})}catch{}}async function Ge(){try{for(let e=0;e<100&&!a.isUiLoaded;e++)await new Promise(e=>setTimeout(e,50));if(!a.isUiLoaded)return;ut.value=a.ui.editorSidebarWidth;let e=a.getEditorWorkspace();if(!e)return;R=!0;try{if(e.expandedDirs.length>0){let t=await se(e.expandedDirs);t&&(s.value=t)}for(let t of e.tabs)await V(t);if(!i.pendingFilePath&&e.activeTab&&N.value.some(t=>t.path===e.activeTab)){P.value=e.activeTab;let t=I(),n=(t?.name.split(`.`).pop()||``).toLowerCase();t&&(Xt.has(n)||ye(t.name))&&(X.value=!0)}}finally{R=!1}}finally{z=!0,B()}}let Ke=g(null),H=ne(null),U=new Map;function qe(e){let t=U.get(e.path);return(!t||t.isDisposed())&&(t=ge.createModel(e.content,e.language,me.file(e.path)),U.set(e.path,t)),t}function Je(){H.value?.setModel(null);for(let e of U.values())e.isDisposed()||e.dispose();U.clear()}function Ye(){if(!Ke.value)return;let e=document.documentElement.getAttribute(`data-theme`)===`dark`;H.value=ge.create(Ke.value,{theme:e?`vs-dark`:`vs`,fontSize:13,lineHeight:20,fontFamily:`'JetBrains Mono', 'Fira Code', 'Cascadia Code', Consolas, monospace`,minimap:{enabled:!0},scrollBeyondLastLine:!1,renderWhitespace:`selection`,automaticLayout:!0,tabSize:2,wordWrap:`off`,smoothScrolling:!0,cursorBlinking:`smooth`,padding:{top:8,bottom:8},editContext:!1}),H.value.onDidChangeModelContent(()=>{let e=I();if(!e)return;let t=H.value.getValue();e.content=t,e.isDirty=t!==e.originalContent}),H.value.onDidBlurEditorText(()=>{a.ui.editorAutoSave&&I()?.isDirty&&ct(!1),requestAnimationFrame(()=>{if(!K.value||K.value.offsetParent===null)return;let e=document.activeElement;e&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.isContentEditable||e.classList?.contains(`native-edit-context`)||e.classList?.contains(`monaco-editor`))||W()})})}C(P,e=>{if(!H.value||!e)return;let n=N.value.find(t=>t.path===e);if(!n)return;let r=qe(n);H.value.setModel(r),t(()=>W()),nt(e)});function W(){if(!H.value)return;H.value.focus();let e=document.querySelector(`.monaco-editor .native-edit-context`);e&&document.activeElement!==e&&requestAnimationFrame(()=>e.focus?.())}let Xe=0,Ze=new Map;async function Qe(e){try{let t=await(await fetch(`/api/editor/file?path=${encodeURIComponent(e)}&meta=1`)).json();return!t?.success||typeof t.mtimeMs!=`number`?null:{mtimeMs:t.mtimeMs}}catch{return null}}async function $e(e){try{let t=await(await fetch(`/api/editor/file?path=${encodeURIComponent(e)}`)).json();return t?.success?{content:t.content,mtimeMs:typeof t.mtimeMs==`number`?t.mtimeMs:null}:null}catch{return null}}function et(e,t,n){e.content=t,e.originalContent=t,e.isDirty=!1,e.diskMtimeMs=n;let r=U.get(e.path);if(!r||r.isDisposed())return;let i=H.value;if(!i||i.getModel()!==r){r.setValue(t);return}let a=i.saveViewState();r.pushEditOperations([],[{range:r.getFullModelRange(),text:t}],()=>null),i.restoreViewState(a)}async function nt(e){if(!e)return;let t=N.value.find(t=>t.path===e);if(!t||t.diskMtimeMs===null)return;let n=++Xe,r=await Qe(e);if(n!==Xe||N.value.find(t=>t.path===e)!==t||!r||r.mtimeMs===t.diskMtimeMs)return;if(t.isDirty){if(Ze.get(e)===r.mtimeMs)return;Ze.set(e,r.mtimeMs);try{await ae.confirm(A(`@EDITOR:这个文件在磁盘上已被改动,你这边也有未保存的编辑。重新加载会丢弃你的改动。`),A(`@EDITOR:文件已被外部改动`),{confirmButtonText:A(`@EDITOR:重新加载`),cancelButtonText:A(`@EDITOR:保留我的`),type:`warning`})}catch{return}if(t.isDirty)return}let i=await $e(e);i&&N.value.find(t=>t.path===e)===t&&et(t,i.content,i.mtimeMs)}function rt(){document.hidden||nt(P.value)}let it=null;function at(){ot(),it=setInterval(()=>{document.hidden||nt(P.value)},ht)}function ot(){it&&=(clearInterval(it),null)}C(()=>N.value.filter(e=>e.isDirty).length,e=>{o.setDirtyCount(e)},{immediate:!0}),ee(()=>o.setDirtyCount(0)),ke(()=>{let e=document.documentElement.getAttribute(`data-theme`)===`dark`;ge.setTheme(e?`vs-dark`:`vs`)});let G=null;function st(){if(G||!K.value)return;let e=[K.value],t=K.value.parentElement;for(;t;){if(t.classList.contains(`view-pane`)||t.classList.contains(`editor-pane`)){e.push(t);break}t=t.parentElement}G=new MutationObserver(()=>{K.value&&K.value.offsetParent!==null&&P.value&&H.value&&(nt(P.value),requestAnimationFrame(()=>{let e=document.activeElement;e&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.isContentEditable||e.classList?.contains(`native-edit-context`)||e.classList?.contains(`monaco-editor`))||W()}))});let n=G;e.forEach(e=>n.observe(e,{attributes:!0,attributeFilter:[`style`,`class`,`hidden`]}))}r(async()=>{Ye(),await D(),await Ge(),st(),w(),window.addEventListener(`focus`,rt),document.addEventListener(`visibilitychange`,rt),at(),P.value&&t(()=>W())}),ee(()=>{G?.disconnect(),G=null,window.removeEventListener(`focus`,rt),document.removeEventListener(`visibilitychange`,rt),H.value?.dispose(),U.forEach(e=>e.dispose()),U.clear()});async function ct(e=!1){let t=I();if(t)try{let n=await(await fetch(`/api/editor/file`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:t.path,content:t.content})})).json();if(!n.success){v.error(`${A(`@EDITOR:保存失败: `)}${n.error}`);return}t.originalContent=t.content,t.isDirty=!1,typeof n.mtimeMs==`number`&&(t.diskMtimeMs=n.mtimeMs),e||v.success(A(`@EDITOR:已保存`))}catch(e){v.error(`${A(`@EDITOR:保存失败: `)}${e.message}`)}}function lt(e){let t=e.ctrlKey||e.metaKey;if(t&&e.key.toLowerCase()===`f`){e.preventDefault(),ze();return}t&&e.key===`s`&&(e.preventDefault(),ct())}r(()=>window.addEventListener(`keydown`,lt)),ee(()=>window.removeEventListener(`keydown`,lt));let K=g(null),ut=g(a.ui.editorSidebarWidth),gt=!1,_t=0,vt=0;function yt(e){gt=!0,_t=e.clientX,vt=ut.value,document.addEventListener(`mousemove`,bt),document.addEventListener(`mouseup`,xt),e.preventDefault()}function bt(e){if(!gt)return;let t=e.clientX-_t;ut.value=Math.max(140,Math.min(400,vt+t))}function xt(){gt=!1,document.removeEventListener(`mousemove`,bt),document.removeEventListener(`mouseup`,xt),ut.value!==a.ui.editorSidebarWidth&&a.setEditorSidebarWidth(ut.value)}function St(e){return e.type===`directory`?xe(e.name):Ee(e.name)}let q=g(null),Ct=g(null),wt=g(null),Tt=g(null);function Et(){let e=F.value;return e?e.type===`directory`?{parentPath:e.path,afterNode:e,depth:e.depth+1}:{parentPath:e.path.includes(`/`)||e.path.includes(`\\`)?e.path.replace(/[\\/][^\\/]+$/,``):a.currentDirectory??``,afterNode:e,depth:e.depth}:{parentPath:a.currentDirectory??``,afterNode:null,depth:0}}async function Dt(){let e=Et();F.value?.type===`directory`&&!F.value.expanded&&await M(F.value),q.value={...e,kind:`file`,value:``},await t(),wt.value?.focus()}async function Ot(){let e=Et();F.value?.type===`directory`&&!F.value.expanded&&await M(F.value),q.value={...e,kind:`directory`,value:``},await t(),wt.value?.focus()}function kt(){q.value=null}async function At(){let e=q.value;if(!e||!e.value.trim()){q.value=null;return}let t=e.value.trim(),n=e.parentPath.replace(/[/\\]$/,``)+`/`+t;if(e.kind===`file`){let e=await(await fetch(`/api/editor/file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:n})})).json();if(!e.success){v.error(e.error);return}v.success(A(`@EDITOR:创建成功`))}else{let e=await(await fetch(`/api/editor/directory`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:n})})).json();if(!e.success){v.error(e.error);return}v.success(A(`@EDITOR:创建成功`))}q.value=null,await j()}function jt(e){e.key===`Enter`&&(e.preventDefault(),At()),e.key===`Escape`&&(e.preventDefault(),kt())}let J=g(null),Mt=g(null);function Nt(e,t){e.preventDefault(),J.value={x:e.clientX,y:e.clientY,node:t}}function Y(){J.value=null}async function Pt(){let e=J.value?.node;Y(),e&&(F.value=e),e?.type===`directory`&&!e.expanded&&await M(e);let n=Et();q.value={...n,kind:`file`,value:``},await t(),wt.value?.focus()}async function Ft(){let e=J.value?.node;Y(),e&&(F.value=e),e?.type===`directory`&&!e.expanded&&await M(e);let n=Et();q.value={...n,kind:`directory`,value:``},await t(),wt.value?.focus()}async function It(){let e=J.value?.node;Y(),e&&(Ct.value={node:e,value:e.name},await t(),Tt.value?.focus(),Tt.value?.select())}async function Lt(){let e=Ct.value;if(!e||!e.value.trim()||e.value.trim()===e.node.name){Ct.value=null;return}let t=e.value.trim(),n=e.node.path.replace(/[\\/][^\\/]+$/,``).replace(/[/\\]$/,``)+`/`+t,r=await(await fetch(`/api/editor/rename`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({oldPath:e.node.path,newPath:n})})).json();if(!r.success){v.error(r.error);return}let i=N.value.find(t=>t.path===e.node.path);i&&(i.path=n,i.name=t,P.value===e.node.path&&(P.value=n)),Ct.value=null,await j()}function Rt(e){e.key===`Enter`&&(e.preventDefault(),Lt()),e.key===`Escape`&&(e.preventDefault(),Ct.value=null)}async function zt(){let e=J.value?.node;if(Y(),!e)return;let t=e.type===`directory`?A(`@EDITOR:文件夹`):A(`@EDITOR:文件`);if(!confirm(`${A(`@EDITOR:确认删除`)} ${t} "${e.name}"?`))return;let n=await(await fetch(`/api/editor/entry?path=${encodeURIComponent(e.path)}`,{method:`DELETE`})).json();if(!n.success){v.error(n.error);return}let r=N.value.findIndex(t=>t.path===e.path);r!==-1&&(N.value.splice(r,1),P.value===e.path&&(P.value=N.value[Math.max(0,r-1)]?.path??null)),v.success(A(`@EDITOR:已删除`)),await j()}async function Bt(){let e=J.value?.node;if(Y(),e)try{let t=await(await fetch(`/api/editor/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e.path})})).json();t.success||v.error(t.error)}catch(e){v.error(e?.message||String(e))}}function Vt(e){let t=a.currentDirectory;if(!t)return e;let n=e=>e.replace(/\\/g,`/`).replace(/\/+$/,``),r=n(t),i=n(e);return i===r?`.`:i.startsWith(r+`/`)?i.slice(r.length+1):i}async function Ht(e){try{if(navigator.clipboard&&window.isSecureContext)return await navigator.clipboard.writeText(e),!0}catch{}try{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.left=`-9999px`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);return document.body.removeChild(t),n}catch{return!1}}async function Ut(){let e=J.value?.node;Y(),e&&(await Ht(e.path)?v.success(A(`@EDITOR:已复制到剪贴板`)):v.error(A(`@EDITOR:复制失败`)))}async function Wt(){let e=J.value?.node;Y(),e&&(await Ht(Vt(e.path))?v.success(A(`@EDITOR:已复制到剪贴板`)):v.error(A(`@EDITOR:复制失败`)))}async function Gt(){let e=J.value?.node;if(Y(),e)try{let t=await(await fetch(`/api/editor/open-in-vscode`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e.path})})).json();t.success||v.error(t.error||A(`@EDITOR:VSCode 未安装`))}catch(e){v.error(e?.message||String(e))}}let Kt=new Set([`html`,`htm`]),qt=O(()=>{let e=J.value?.node;if(!e||e.type!==`file`)return!1;let t=e.name.slice(e.name.lastIndexOf(`.`)+1).toLowerCase();return Kt.has(t)});async function Jt(){let e=J.value?.node;if(Y(),e)try{let t=await(await fetch(`/api/editor/open-in-browser`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e.path})})).json();t.success||v.error(t.error||A(`@EDITOR:浏览器打开失败`))}catch(e){v.error(e?.message||String(e))}}r(()=>document.addEventListener(`click`,Y)),ee(()=>document.removeEventListener(`click`,Y));let Yt=new Set([`md`,`html`,`htm`,`svg`]),Xt=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`ico`,`bmp`]),X=g(!1),Z=g(!1),Zt=g(!1),Qt=g(!1),$t=g(0),Q=O(()=>N.value.find(e=>e.path===P.value)??null),en=O(()=>Q.value?.language===`plaintext`&&Q.value?.content===``),tn=O(()=>Q.value?.language===`office`),$=O(()=>(Q.value?.name??``).split(`.`).pop()?.toLowerCase()??``),nn=O(()=>Yt.has($.value)||Xt.has($.value)||ye($.value)),rn=O(()=>((Q.value?.content??``).match(/^#{1,6}\s+/gm)||[]).length),an=O(()=>$.value===`md`&&rn.value>0);C(P,()=>{X.value&&!nn.value&&(X.value=!1),Z.value&&!an.value&&(Z.value=!1)});function on(){nn.value&&(X.value||(Z.value=!1,Zt.value=!1),X.value=!X.value)}function sn(){an.value&&(Z.value||(X.value=!1,Zt.value=!1),Z.value=!Z.value)}function cn(){Zt.value||(X.value=!1,Z.value=!1),Zt.value=!Zt.value,Qt.value=!0}let ln=g(null),un=g(!1),dn=g(``),fn=g(!0),pn=null,mn=O(()=>!Z.value&&X.value&&$.value===`md`&&!!Q.value);function hn(){return Q.value?.content??``}function gn(){return hn().match(/^\s*#\s+(.+?)\s*(?:\r?\n|$)/)?.[1]?.trim()??``}function _n(e,t,n){if(!e){v.error(A(`@EDITOR:复制失败`));return}dn.value=n,pn&&clearTimeout(pn),pn=setTimeout(()=>{dn.value=``},1800),t>0?v.warning(A(`@EDITOR:{n} 张图片未能转成 Base64,已保留原地址`,{n:t})):v.success(A(`@EDITOR:已复制`))}async function vn(){_n(await Ht(hn()),0,`md`)}async function yn(){let e=ln.value?.getRenderedElement();if(e){un.value=!0;try{let{html:t,leftover:n}=await dt(e,fn.value);_n(await Ht(t),n,`html`)}finally{un.value=!1}}}function bn(e){let t=document.createElement(`div`);t.style.cssText=`position:fixed;top:-9999px;left:-9999px;opacity:0;`,t.innerHTML=e,document.body.appendChild(t);try{let e=window.getSelection(),n=document.createRange();n.selectNodeContents(t),e?.removeAllRanges(),e?.addRange(n);let r=document.execCommand(`copy`);return e?.removeAllRanges(),r}catch{return!1}finally{document.body.removeChild(t)}}async function xn(){let e=ln.value?.getRenderedElement();if(e){un.value=!0;try{let{html:t,leftover:n}=await ft(e,{inline:fn.value,title:gn()}),r=hn(),i=!1;try{navigator.clipboard?.write&&typeof ClipboardItem<`u`&&(await navigator.clipboard.write([new ClipboardItem({"text/html":new Blob([t],{type:`text/html`}),"text/plain":new Blob([r],{type:`text/plain`})})]),i=!0)}catch{i=!1}i||=bn(t),_n(i,n,`rich`)}finally{un.value=!1}}}let Sn=O(()=>{let e=Q.value;if(!e)return``;let t=$.value,n=document.documentElement.getAttribute(`data-theme`)===`light`?`#ffffff`:`#0d1117`;return t===`html`||t===`htm`?be(e.content):t===`svg`?`<!DOCTYPE html><html><head><meta charset="utf-8"><style>html,body{margin:0;padding:0;background:${n};display:flex;align-items:center;justify-content:center;min-height:100vh;}svg{max-width:100%;max-height:90vh;}</style></head><body>${e.content}</body></html>`:``}),Cn=!1,wn=0,Tn=0;function En(e){Cn=!0,wn=e.clientX,Tn=$t.value,document.addEventListener(`mousemove`,Dn),document.addEventListener(`mouseup`,On),e.preventDefault()}function Dn(e){if(!Cn)return;let t=e.clientX-wn;$t.value=Math.max(200,Math.min(900,Tn+t))}function On(){Cn=!1,document.removeEventListener(`mousemove`,Dn),document.removeEventListener(`mouseup`,On)}let kn={props:i,configStore:a,editorTabsStore:o,treeNodes:s,treeLoading:c,searchQuery:l,debouncedSearchQuery:u,get searchDebounceTimer(){return d},set searchDebounceTimer(e){d=e},clearSearch:f,CONTENT_SEARCH_MIN_LEN:pt,contentHits:p,contentTotalMatches:m,contentQuery:h,contentSearching:_,contentTruncated:y,get contentAbort(){return b},set contentAbort(e){b=e},get contentSeq(){return x},set contentSeq(e){x=e},resetContentSearch:re,runContentSearch:ie,TREE_POLL_MS:mt,get treePollTimer(){return S},set treePollTimer(e){S=e},startTreePolling:w,stopTreePolling:T,loadDir:E,initTree:D,collectExpandedPaths:k,toTreeNodes:oe,fetchTreeSnapshot:se,reconcileTree:ce,refreshTree:j,toggleDir:M,flattenTree:ve,searchQueryLower:Ae,filterTree:je,findNodeByPath:Me,visibleTree:Ne,noSearchResults:Pe,noAnySearchResults:Fe,highlightText:Ie,openContentHit:Le,searchInputRef:Re,focusSearchInput:ze,onSearchEscape:Be,tabs:N,activeTabPath:P,selectedNode:F,openFile:Ve,closeTab:He,activeTab:I,workspaceSnapshot:L,get workspaceRestoring(){return R},set workspaceRestoring(e){R=e},get workspaceHydrated(){return z},set workspaceHydrated(e){z=e},persistWorkspace:B,restoreTab:V,restoreWorkspace:Ge,editorContainerRef:Ke,editorInstance:H,modelCache:U,getOrCreateModel:qe,disposeAllModels:Je,mountEditor:Ye,focusEditor:W,get diskSyncSeq(){return Xe},set diskSyncSeq(e){Xe=e},diskConflictPromptedAt:Ze,fetchFileMeta:Qe,fetchFileContent:$e,applyDiskContent:et,syncActiveTabWithDisk:nt,handleWindowFocus:rt,DISK_SYNC_POLL_MS:ht,get diskSyncTimer(){return it},set diskSyncTimer(e){it=e},startDiskSyncPolling:at,stopDiskSyncPolling:ot,get viewVisibilityObserver(){return G},set viewVisibilityObserver(e){G=e},setupViewVisibilityObserver:st,saveCurrentFile:ct,handleKeydown:lt,containerRef:K,sidebarWidth:ut,get isResizing(){return gt},set isResizing(e){gt=e},get resizeStartX(){return _t},set resizeStartX(e){_t=e},get resizeStartW(){return vt},set resizeStartW(e){vt=e},startSidebarResize:yt,onSidebarResize:bt,stopSidebarResize:xt,getNodeSpriteId:St,inlineInput:q,renameInput:Ct,inlineInputRef:wt,renameInputRef:Tt,getTargetDir:Et,startNewFile:Dt,startNewFolder:Ot,cancelInlineInput:kt,confirmInlineInput:At,handleInlineKeydown:jt,ctxMenu:J,ctxMenuRef:Mt,openContextMenu:Nt,closeContextMenu:Y,ctxNewFile:Pt,ctxNewFolder:Ft,ctxRename:It,confirmRename:Lt,handleRenameKeydown:Rt,ctxDelete:zt,ctxRevealInExplorer:Bt,toWorkspaceRelative:Vt,copyToClipboard:Ht,ctxCopyAbsolutePath:Ut,ctxCopyRelativePath:Wt,ctxOpenInVscode:Gt,BROWSER_OPEN_EXTS:Kt,ctxMenuCanOpenInBrowser:qt,ctxOpenInBrowser:Jt,PREVIEW_TEXT_EXTS:Yt,IMAGE_EXTS:Xt,showPreview:X,showMindmap:Z,showAgentChat:Zt,agentOpened:Qt,previewWidth:$t,activeTabRef:Q,activeTabIsImage:en,activeTabIsOffice:tn,activeExt:$,isPreviewable:nn,mindmapTitleCount:rn,isMindmapable:an,togglePreview:on,toggleMindmap:sn,toggleAgentChat:cn,mdPreviewRef:ln,mdCopyBusy:un,mdCopiedType:dn,mdCopyInlineImages:fn,get mdCopiedTimer(){return pn},set mdCopiedTimer(e){pn=e},mdCopyAvailable:mn,mdSourceText:hn,mdDocTitle:gn,mdCopyFeedback:_n,copyMarkdownSource:vn,copyRenderedHtml:yn,copyRichTextBySelection:bn,copyRichTextToClipboard:xn,previewSrcdoc:Sn,get isPreviewResizing(){return Cn},set isPreviewResizing(e){Cn=e},get previewResizeStartX(){return wn},set previewResizeStartX(e){wn=e},get previewResizeStartW(){return Tn},set previewResizeStartW(e){Tn=e},startPreviewResize:En,onPreviewResize:Dn,stopPreviewResize:On,get $t(){return A},get ElTooltip(){return te},get getFileIconClass(){return Ee},ImagePreview:Te,OfficePreview:Se,MarkdownPreview:Ce,MindmapPreview:We,EditorAgentPanel:tt,EmptyState:De,SvgIcon:le,get PREVIEW_IFRAME_SANDBOX(){return we}};return Object.defineProperty(kn,"__isScriptSetup",{enumerable:!1,value:!0}),kn}});i(),b(),w();var _t={class:`editor-view`,ref:`containerRef`},vt={class:`sidebar-header`},yt={class:`sidebar-title`},bt={class:`sidebar-actions`},xt={class:`sidebar-search`},St=[`placeholder`,`title`],q=[`title`,`aria-label`],Ct={key:0,class:`sidebar-tree`},wt={key:0,class:`search-section-head`},Tt={key:1,class:`tree-arrow-spacer`},Et={class:`tree-icon mit-icon`,"aria-hidden":`true`},Dt=[`xlink:href`],Ot=[`onClick`,`onContextmenu`],kt={key:1,class:`tree-arrow-spacer`},At={key:2,class:`tree-icon mit-icon`,"aria-hidden":`true`},jt=[`xlink:href`],J={key:3,class:`tree-icon mit-icon`,"aria-hidden":`true`},Mt=[`xlink:href`],Nt=[`title`],Y={key:0,class:`tree-name-hit`},Pt={key:4,class:`tree-loading`},Ft={key:0,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{"flex-shrink":`0`,color:`var(--color-warning-dark)`}},It={key:1,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{"flex-shrink":`0`,color:`var(--text-meta)`}},Lt=[`placeholder`],Rt={key:1,class:`tree-node tree-inline-input-row`,style:{paddingLeft:`12px`}},zt={key:0,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{"flex-shrink":`0`,color:`var(--color-warning-dark)`}},Bt={key:1,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{"flex-shrink":`0`,color:`var(--text-meta)`}},Vt=[`placeholder`],Ht=[`data-query`],Ut={key:0,class:`content-results-status`},Wt={class:`search-section-head`},Gt={class:`search-section-count`},Kt={key:0,class:`search-section-note`},qt=[`title`,`onClick`],Jt={class:`tree-icon mit-icon`,"aria-hidden":`true`},Yt=[`xlink:href`],Xt={class:`content-hit-name`},X={class:`content-hit-dir`},Z={class:`content-hit-total`},Zt=[`title`,`onClick`],Qt={class:`content-hit-ln`},$t={class:`content-hit-text`},Q={key:0,class:`content-hit-mark`},en={key:3,class:`tree-empty`},tn={key:1,class:`sidebar-loading`},$={class:`editor-main`},nn={key:0,class:`editor-tabs`},rn=[`onClick`,`title`],an={class:`tab-name`},on={key:0,class:`tab-dirty-dot`},sn=[`onClick`],cn=[`title`],ln=[`disabled`,`title`],un=[`title`],dn={class:`editor-body`},fn={key:0,class:`image-tab-placeholder`},pn={viewBox:`0 0 24 24`,width:`56`,height:`56`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{opacity:`.35`}},mn={class:`image-tab-placeholder-title`},hn={class:`image-tab-placeholder-hint`},gn={class:`preview-header`},_n={class:`preview-title`},vn={class:`preview-ext-badge`},yn=[`title`],bn={class:`preview-body`},xn={key:0,class:`preview-copybar`},Sn=[`disabled`,`title`],Cn=[`disabled`,`title`],wn=[`disabled`,`title`],Tn=[`title`],En=[`sandbox`,`srcdoc`];function Dn(t,r,i,o,ee,te){return E(),l(p,null,[c(`div`,_t,[D(` 左侧文件树 `),c(`div`,{class:`editor-sidebar`,style:a({width:o.sidebarWidth+`px`})},[c(`div`,vt,[c(`span`,yt,d(o.$t(`@EDITOR:资源管理器`)),1),c(`div`,bt,[e(o.ElTooltip,{content:o.$t(`@EDITOR:新建文件`),placement:`bottom`,"show-after":300},{default:y(()=>[c(`button`,{class:`sidebar-action-btn`,onClick:o.startNewFile},[D(` file-plus.svg(Tabler icons,MIT) `),r[12]||=c(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M14 3v4a1 1 0 0 0 1 1h4`}),c(`path`,{d:`M17 21h-10a2 2 0 0 1-2-2v-14a2 2 0 0 1 2-2h7l5 5v11a2 2 0 0 1-2 2`}),c(`path`,{d:`M12 11l0 6`}),c(`path`,{d:`M9 14l6 0`})],-1)])]),_:1},8,[`content`]),e(o.ElTooltip,{content:o.$t(`@EDITOR:新建文件夹`),placement:`bottom`,"show-after":300},{default:y(()=>[c(`button`,{class:`sidebar-action-btn`,onClick:o.startNewFolder},[D(` folder-plus.svg(Tabler icons,MIT) `),r[13]||=c(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M12 19h-7a2 2 0 0 1-2-2v-11a2 2 0 0 1 2-2h4l3 3h7a2 2 0 0 1 2 2v3.5`}),c(`path`,{d:`M16 19h6`}),c(`path`,{d:`M19 16v6`})],-1)])]),_:1},8,[`content`]),e(o.ElTooltip,{content:o.$t(`@EDITOR:刷新`),placement:`bottom`,"show-after":300},{default:y(()=>[c(`button`,{class:`sidebar-action-btn`,onClick:r[0]||=e=>o.refreshTree({notifyOnError:!0})},[D(` refresh.svg(Tabler icons,MIT) `),r[14]||=c(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M20 11a8.1 8.1 0 0 0-15.5-2m-.5-4v4h4`}),c(`path`,{d:`M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4`})],-1)])]),_:1},8,[`content`])])]),c(`div`,xt,[r[16]||=c(`svg`,{class:`sidebar-search-icon`,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`},[c(`circle`,{cx:`11`,cy:`11`,r:`7`}),c(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})],-1),m(c(`input`,{ref:`searchInputRef`,"onUpdate:modelValue":r[1]||=e=>o.searchQuery=e,type:`text`,class:`sidebar-search-input`,placeholder:o.$t(`@EDITOR:搜索文件名或内容...`),title:o.$t(`@EDITOR:搜索文件名或内容...`),spellcheck:`false`,autocomplete:`off`,onKeydown:_(o.onSearchEscape,[`escape`])},null,40,St),[[T,o.searchQuery]]),o.searchQuery?(E(),l(`button`,{key:0,class:`sidebar-search-clear`,title:o.$t(`@EDITOR:清除搜索`),"aria-label":o.$t(`@EDITOR:清除搜索`),onClick:o.clearSearch},[...r[15]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`},[c(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),c(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,q)):D(`v-if`,!0)]),o.treeLoading?(E(),l(`div`,tn,[...r[26]||=[c(`span`,{class:`spin-icon`},null,-1)]])):(E(),l(`div`,Ct,[D(` 搜索态下给上方森林一个分组标题:下面还有「内容匹配」,不标一下分不清两块 `),o.searchQueryLower&&o.visibleTree.length>0?(E(),l(`div`,wt,d(o.$t(`@EDITOR:名称匹配`)),1)):D(`v-if`,!0),(E(!0),l(p,null,f(o.flattenTree(o.visibleTree),e=>(E(),l(p,{key:e.path},[D(` 重命名时用输入框替换节点 `),o.renameInput&&o.renameInput.node.path===e.path?(E(),l(`div`,{key:0,class:`tree-node tree-inline-input-row`,style:a({paddingLeft:12+e.depth*14+`px`})},[e.type===`directory`?(E(),l(`span`,{key:0,class:u([`tree-arrow`,{expanded:e.expanded}])},[...r[17]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`10`,height:`10`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[c(`polyline`,{points:`9 18 15 12 9 6`})],-1)]],2)):(E(),l(`span`,Tt)),(E(),l(`svg`,Et,[c(`use`,{"xlink:href":`#${o.getNodeSpriteId(e)}`},null,8,Dt)])),m(c(`input`,{ref_for:!0,ref:`renameInputRef`,"onUpdate:modelValue":r[2]||=e=>o.renameInput.value=e,onKeydown:o.handleRenameKeydown,onBlur:o.confirmRename,onClick:r[3]||=h(()=>{},[`stop`])},null,544),[[T,o.renameInput.value]])],4)):(E(),l(p,{key:1},[D(` 普通节点 `),c(`div`,{class:u([`tree-node`,{"tree-node--dir":e.type===`directory`,"tree-node--file":e.type===`file`,"tree-node--active":o.activeTabPath===e.path,"tree-node--selected":o.selectedNode?.path===e.path&&o.activeTabPath!==e.path}]),style:a({paddingLeft:12+e.depth*14+`px`}),onClick:t=>o.openFile(e),onContextmenu:t=>o.openContextMenu(t,e)},[D(` 展开箭头 `),e.type===`directory`?(E(),l(`span`,{key:0,class:u([`tree-arrow`,{expanded:e.expanded}])},[...r[18]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`10`,height:`10`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[c(`polyline`,{points:`9 18 15 12 9 6`})],-1)]],2)):(E(),l(`span`,kt)),D(` 图标 `),e.type===`directory`?(E(),l(`svg`,At,[c(`use`,{"xlink:href":`#${o.getNodeSpriteId(e)}`},null,8,jt)])):(E(),l(`svg`,J,[c(`use`,{"xlink:href":`#${o.getNodeSpriteId(e)}`},null,8,Mt)])),D(` 名称(命中关键字高亮) `),c(`span`,{class:`tree-name`,title:e.path},[(E(!0),l(p,null,f(o.highlightText(e.name),(e,t)=>(E(),l(p,{key:t},[e.hit?(E(),l(`span`,Y,d(e.text),1)):(E(),l(p,{key:1},[x(d(e.text),1)],64))],64))),128))],8,Nt),e.loading?(E(),l(`span`,Pt)):D(`v-if`,!0)],46,Ot)],2112)),D(` 内联新建输入框:紧跟在 afterNode 之后 `),o.inlineInput&&o.inlineInput.afterNode?.path===e.path?(E(),l(`div`,{key:2,class:`tree-node tree-inline-input-row`,style:a({paddingLeft:12+o.inlineInput.depth*14+`px`})},[r[21]||=c(`span`,{class:`tree-arrow-spacer`},null,-1),o.inlineInput.kind===`directory`?(E(),l(`svg`,Ft,[...r[19]||=[c(`path`,{d:`M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z`},null,-1)]])):(E(),l(`svg`,It,[...r[20]||=[c(`path`,{d:`M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z`},null,-1),c(`polyline`,{points:`14 2 14 8 20 8`},null,-1)]])),m(c(`input`,{ref_for:!0,ref:`inlineInputRef`,class:`tree-inline-input`,"onUpdate:modelValue":r[4]||=e=>o.inlineInput.value=e,placeholder:o.inlineInput.kind===`file`?o.$t(`@EDITOR:输入文件名`):o.$t(`@EDITOR:输入文件夹名`),onKeydown:o.handleInlineKeydown,onBlur:o.cancelInlineInput,onClick:r[5]||=h(()=>{},[`stop`])},null,40,Lt),[[T,o.inlineInput.value]])],4)):D(`v-if`,!0)],64))),128)),D(` 根级输入框(无选中节点时出现在列表末尾) `),o.inlineInput&&o.inlineInput.afterNode===null?(E(),l(`div`,Rt,[r[24]||=c(`span`,{class:`tree-arrow-spacer`},null,-1),o.inlineInput.kind===`directory`?(E(),l(`svg`,zt,[...r[22]||=[c(`path`,{d:`M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z`},null,-1)]])):(E(),l(`svg`,Bt,[...r[23]||=[c(`path`,{d:`M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z`},null,-1),c(`polyline`,{points:`14 2 14 8 20 8`},null,-1)]])),m(c(`input`,{ref:`inlineInputRef`,class:`tree-inline-input`,"onUpdate:modelValue":r[6]||=e=>o.inlineInput.value=e,placeholder:o.inlineInput.kind===`file`?o.$t(`@EDITOR:输入文件名`):o.$t(`@EDITOR:输入文件夹名`),onKeydown:o.handleInlineKeydown,onBlur:o.cancelInlineInput,onClick:r[7]||=h(()=>{},[`stop`])},null,40,Vt),[[T,o.inlineInput.value]])])):D(`v-if`,!0),D(` 内容匹配:搜索框的第二块结果。名称在树里已经能懒加载,内容命中只能平铺 `),o.searchQueryLower?(E(),l(`div`,{key:2,class:`content-results`,"data-query":o.contentQuery},[o.contentSearching?(E(),l(`div`,Ut,[r[25]||=c(`span`,{class:`content-search-spin`},null,-1),c(`span`,null,d(o.$t(`@EDITOR:正在搜索文件内容...`)),1)])):o.contentHits.length>0?(E(),l(p,{key:1},[c(`div`,Wt,[c(`span`,null,d(o.$t(`@EDITOR:内容匹配`)),1),c(`span`,Gt,d(o.contentTotalMatches),1),o.contentTruncated?(E(),l(`span`,Kt,d(o.$t(`@EDITOR:结果过多,已截断`)),1)):D(`v-if`,!0)]),(E(!0),l(p,null,f(o.contentHits,e=>(E(),l(`div`,{key:e.path,class:`content-hit`},[c(`div`,{class:`content-hit-file`,title:e.relPath,onClick:t=>o.openContentHit(e,e.matches[0]?.line)},[(E(),l(`svg`,Jt,[c(`use`,{"xlink:href":`#${o.getFileIconClass(e.name)}`},null,8,Yt)])),c(`span`,Xt,d(e.name),1),c(`span`,X,d(e.dir),1),c(`span`,Z,d(e.total),1)],8,qt),(E(!0),l(p,null,f(e.matches,t=>(E(),l(`div`,{key:`${e.path}:${t.line}`,class:`content-hit-line`,title:o.$t(`@EDITOR:点击跳到该行`),onClick:n=>o.openContentHit(e,t.line)},[c(`span`,Qt,d(t.line),1),c(`span`,$t,[(E(!0),l(p,null,f(o.highlightText(t.text),(e,t)=>(E(),l(p,{key:t},[e.hit?(E(),l(`span`,Q,d(e.text),1)):(E(),l(p,{key:1},[x(d(e.text),1)],64))],64))),128))])],8,Zt))),128))]))),128))],64)):D(`v-if`,!0)],8,Ht)):D(`v-if`,!0),!o.inlineInput&&(o.noAnySearchResults||o.treeNodes.length===0)?(E(),l(`div`,en,d(o.noAnySearchResults?o.$t(`@EDITOR:未找到匹配文件`):o.$t(`@EDITOR:暂无文件`)),1)):D(`v-if`,!0)]))],4),D(` 拖拽分隔条 `),c(`div`,{class:`editor-resizer`,onMousedown:o.startSidebarResize},null,32),D(` 右侧编辑区 `),c(`div`,$,[D(` 标签栏 `),o.tabs.length>0?(E(),l(`div`,nn,[(E(!0),l(p,null,f(o.tabs,e=>(E(),l(`div`,{key:e.path,class:u([`editor-tab`,{active:o.activeTabPath===e.path,dirty:e.isDirty}]),onClick:t=>o.activeTabPath=e.path,title:e.path},[c(`span`,an,d(e.name),1),e.isDirty?(E(),l(`span`,on)):D(`v-if`,!0),c(`button`,{class:`tab-close`,onClick:t=>o.closeTab(e.path,t)},[...r[27]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`},[c(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),c(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,sn)],10,rn))),128)),r[31]||=c(`div`,{class:`editor-tabs-spacer`},null,-1),D(` 预览切换按钮 `),o.isPreviewable?(E(),l(`button`,{key:0,class:u([`preview-toggle-btn`,{active:o.showPreview}]),title:o.showPreview?o.$t(`@EDITOR:关闭预览`):o.$t(`@EDITOR:打开预览`),onClick:o.togglePreview},[D(` eye.svg(Tabler icons,MIT) `),r[28]||=c(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M10 12a2 2 0 1 0 4 0a2 2 0 0 0-4 0`}),c(`path`,{d:`M21 12c-2.4 4-5.4 6-9 6c-3.6 0-6.6-2-9-6c2.4-4 5.4-6 9-6c3.6 0 6.6 2 9 6`})],-1),c(`span`,null,d(o.$t(`@EDITOR:预览`)),1)],10,cn)):D(`v-if`,!0),D(` 思维导图:整篇 markdown 渲染为一张大导图 `),o.isMindmapable?(E(),l(`button`,{key:1,class:u([`preview-toggle-btn mindmap-toggle-btn`,{active:o.showMindmap,disabled:!o.isMindmapable}]),disabled:!o.isMindmapable,title:o.isMindmapable?o.showMindmap?o.$t(`@EDITOR:关闭思维导图`):o.$t(`@EDITOR:打开思维导图`):o.$t(`@EDITOR:需要至少一个 # 标题`),onClick:o.toggleMindmap},[D(` topology-star.svg(Tabler icons,MIT):中心节点 + 四向辐射(与左栏「思维导图」同款) `),r[29]||=s(`<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" data-v-fc2ebf13><path d="M8 18a2 2 0 1 0-4 0a2 2 0 0 0 4 0" data-v-fc2ebf13></path><path d="M20 6a2 2 0 1 0-4 0a2 2 0 0 0 4 0" data-v-fc2ebf13></path><path d="M8 6a2 2 0 1 0-4 0a2 2 0 0 0 4 0" data-v-fc2ebf13></path><path d="M20 18a2 2 0 1 0-4 0a2 2 0 0 0 4 0" data-v-fc2ebf13></path><path d="M14 12a2 2 0 1 0-4 0a2 2 0 0 0 4 0" data-v-fc2ebf13></path><path d="M7.5 7.5l3 3" data-v-fc2ebf13></path><path d="M7.5 16.5l3-3" data-v-fc2ebf13></path><path d="M13.5 13.5l3 3" data-v-fc2ebf13></path><path d="M16.5 7.5l-3 3" data-v-fc2ebf13></path></svg>`,1),c(`span`,null,d(o.$t(`@EDITOR:思维导图`)),1)],10,ln)):D(`v-if`,!0),D(` g ai 对话:文件空间右侧的智能体面板(与预览/思维导图互斥) `),c(`button`,{class:u([`preview-toggle-btn agent-toggle-btn`,{active:o.showAgentChat}]),title:o.showAgentChat?o.$t(`@EDITOR:关闭 g ai 对话`):o.$t(`@EDITOR:打开 g ai 对话`),onClick:o.toggleAgentChat},[D(` message-chatbot.svg(Tabler icons,MIT):对话气泡+机器人脸。
32
- 原来是自绘双星闪光 —— 用户偏好「AI 功能不用星星/闪光贴标签」,顺带换掉 `),r[30]||=s(`<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" data-v-fc2ebf13><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-5l-5 3v-3h-2a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3h12" data-v-fc2ebf13></path><path d="M9.5 9h.01" data-v-fc2ebf13></path><path d="M14.5 9h.01" data-v-fc2ebf13></path><path d="M9.5 13a3.5 3.5 0 0 0 5 0" data-v-fc2ebf13></path></svg>`,1),c(`span`,null,d(o.$t(`@EDITOR:g ai 对话`)),1)],10,un)])):D(`v-if`,!0),D(` 无文件打开时的提示 `),o.tabs.length===0?(E(),n(o.EmptyState,{key:1,class:`editor-empty`,title:o.$t(`@EDITOR:从左侧选择文件打开`),hint:o.$t(`@EDITOR:Ctrl+S 保存`)},{icon:y(()=>[...r[32]||=[c(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[c(`path`,{d:`M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z`}),c(`polyline`,{points:`14 2 14 8 20 8`})],-1)]]),_:1},8,[`title`,`hint`])):D(`v-if`,!0),D(` Monaco 容器(始终挂载,tab 为空或 image tab 时隐藏) `),c(`div`,dn,[c(`div`,{class:u([`monaco-container`,{hidden:o.tabs.length===0||o.activeTabIsImage||o.activeTabIsOffice}]),ref:`editorContainerRef`},null,2),D(` 图片 tab 时的占位提示(主预览区在右侧 preview-panel) `),o.activeTabIsImage&&o.tabs.length>0&&!o.showPreview&&!o.showMindmap?(E(),l(`div`,fn,[(E(),l(`svg`,pn,[...r[33]||=[c(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`},null,-1),c(`circle`,{cx:`9`,cy:`9`,r:`2`},null,-1),c(`path`,{d:`m21 15-5-5L5 21`},null,-1)]])),c(`p`,mn,d(o.activeTabRef?.name),1),c(`p`,hn,d(o.$t(`@EDITOR:这是图片文件,已在右侧预览面板中打开`)),1)])):D(`v-if`,!0),D(` 预览分隔条(在面板右侧,拉动调整面板宽度) `),(o.showPreview||o.showMindmap||o.showAgentChat)&&o.tabs.length>0?(E(),l(`div`,{key:1,class:`preview-resizer`,onMousedown:o.startPreviewResize},null,32)):D(`v-if`,!0),D(` g ai 对话面板:v-if 懒挂载 + v-show 保状态(切到预览再切回来,进行中的流还在) `),o.agentOpened?m((E(),n(o.EditorAgentPanel,{key:2,active:o.showAgentChat&&o.tabs.length>0,"active-file-path":o.activeTabPath,"active-file-name":o.activeTabRef?.name??``,style:a({flexBasis:o.previewWidth+`px`}),onClose:r[8]||=e=>o.showAgentChat=!1},null,8,[`active`,`active-file-path`,`active-file-name`,`style`])),[[S,o.showAgentChat&&o.tabs.length>0]]):D(`v-if`,!0),D(` 预览面板 `),(o.showPreview||o.showMindmap)&&o.tabs.length>0?(E(),l(`div`,{key:3,class:`preview-panel`,style:a({flexBasis:o.previewWidth+`px`})},[c(`div`,gn,[c(`span`,_n,d(o.showMindmap?o.$t(`@EDITOR:思维导图`):o.$t(`@EDITOR:预览`)),1),c(`span`,vn,d(o.activeExt.toUpperCase()),1),r[35]||=c(`div`,{class:`preview-header-spacer`},null,-1),c(`button`,{class:`preview-close-btn`,title:o.showMindmap?o.$t(`@EDITOR:关闭思维导图`):o.$t(`@EDITOR:关闭预览`),onClick:r[9]||=e=>o.showMindmap?o.showMindmap=!1:o.showPreview=!1},[...r[34]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`},[c(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),c(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,yn)]),c(`div`,bn,[D(` 复制栏:Markdown 预览导出到公众号 / 其它富文本编辑器 `),o.mdCopyAvailable?(E(),l(`div`,xn,[c(`button`,{class:u([`preview-copy-btn`,{done:o.mdCopiedType===`md`}]),disabled:o.mdCopyBusy,title:o.$t(`@EDITOR:复制 Markdown 源码`),onClick:o.copyMarkdownSource},[r[36]||=c(`span`,{class:`preview-copy-btn-icon`},`{ }`,-1),c(`span`,null,d(o.mdCopiedType===`md`?o.$t(`@EDITOR:已复制`):`Markdown`),1)],10,Sn),c(`button`,{class:u([`preview-copy-btn`,{done:o.mdCopiedType===`html`}]),disabled:o.mdCopyBusy,title:o.$t(`@EDITOR:复制渲染后的 HTML(图片按开关内嵌)`),onClick:o.copyRenderedHtml},[r[37]||=c(`span`,{class:`preview-copy-btn-icon`},`</>`,-1),c(`span`,null,d(o.mdCopiedType===`html`?o.$t(`@EDITOR:已复制`):`HTML`),1)],10,Cn),c(`button`,{class:u([`preview-copy-btn preview-copy-btn--primary`,{done:o.mdCopiedType===`rich`}]),disabled:o.mdCopyBusy,title:o.$t(`@EDITOR:复制为富文本,可直接粘贴到公众号编辑器`),onClick:o.copyRichTextToClipboard},[r[38]||=c(`span`,{class:`preview-copy-btn-icon`},`⊞`,-1),c(`span`,null,d(o.mdCopyBusy?o.$t(`@EDITOR:转换图片中…`):o.mdCopiedType===`rich`?o.$t(`@EDITOR:已复制`):o.$t(`@EDITOR:复制富文本`)),1)],10,wn),c(`label`,{class:`preview-copy-embed`,title:o.$t(`@EDITOR:复制时把本地图片转成 Base64 内嵌,关闭后保留原图地址`)},[m(c(`input`,{"onUpdate:modelValue":r[10]||=e=>o.mdCopyInlineImages=e,type:`checkbox`},null,512),[[re,o.mdCopyInlineImages]]),c(`span`,null,d(o.$t(`@EDITOR:图片转 Base64`)),1)],8,Tn)])):D(`v-if`,!0),D(` 思维导图:整篇 markdown → 一张大导图 `),o.showMindmap&&o.activeExt===`md`&&o.activeTabRef?(E(),n(o.MindmapPreview,{key:1,content:o.activeTabRef.content,class:`preview-mindmap`},null,8,[`content`])):o.showPreview&&o.activeExt===`md`&&o.activeTabRef?(E(),l(p,{key:2},[D(` Markdown → in-app 渲染 `),D(` :key 按文件路径切 —— 预览的滚动容器就是这个组件自己的根节点
33
- (.preview-markdown[overflow:auto]),不换 key 时切 tab 走的是同类型
34
- 组件 → Vue 复用同一个 DOM 节点、只把内容换掉,scrollTop 不在 patch
35
- 范围里,会从上一个文件原样带过来(表现为"新文件预览停在上一个文件的
36
- 滚动位置")。key 随路径变 → 重建节点,天然回到顶部。
37
- 注意 key 只取 path、不取 content:同一个文件里改字时预览是实时镜像,
38
- 那种情况下不该把用户踢回顶部。 `),(E(),n(o.MarkdownPreview,{ref:`mdPreviewRef`,key:o.activeTabRef.path,content:o.activeTabRef.content,"base-path":o.activeTabRef.path,class:`preview-markdown`},null,8,[`content`,`base-path`]))],2112)):o.showPreview&&[`html`,`htm`,`svg`].includes(o.activeExt)?(E(),l(p,{key:3},[D(` HTML / SVG → sandboxed iframe (JS 可执行,不透明 origin 隔离宿主) `),c(`iframe`,{class:`preview-iframe`,sandbox:o.PREVIEW_IFRAME_SANDBOX,srcdoc:o.previewSrcdoc},null,8,En)],2112)):o.showPreview&&o.IMAGE_EXTS.has(o.activeExt)&&o.activeTabRef?(E(),l(p,{key:4},[D(` 图片预览(使用增强版 ImagePreview,支持缩放/拖拽) `),e(o.ImagePreview,{"file-path":o.activeTabRef.path,"file-name":o.activeTabRef.name},null,8,[`file-path`,`file-name`])],2112)):o.showPreview&&o.activeTabIsOffice&&o.activeTabRef?(E(),n(o.OfficePreview,{key:5,"file-path":o.activeTabRef.path},null,8,[`file-path`])):D(`v-if`,!0)])],4)):D(`v-if`,!0)])])],512),D(` 右键菜单 `),(E(),n(k,{to:`body`},[o.ctxMenu?(E(),l(`div`,{key:0,ref:`ctxMenuRef`,class:`ctx-menu`,style:a({left:o.ctxMenu.x+`px`,top:o.ctxMenu.y+`px`}),onClick:r[11]||=h(()=>{},[`stop`])},[c(`button`,{class:`ctx-menu-item`,onClick:o.ctxNewFile},[D(` file-plus.svg(Tabler icons,MIT) `),r[39]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M14 3v4a1 1 0 0 0 1 1h4`}),c(`path`,{d:`M17 21h-10a2 2 0 0 1-2-2v-14a2 2 0 0 1 2-2h7l5 5v11a2 2 0 0 1-2 2`}),c(`path`,{d:`M12 11l0 6`}),c(`path`,{d:`M9 14l6 0`})],-1),x(` `+d(o.$t(`@EDITOR:新建文件`)),1)]),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxNewFolder},[D(` folder-plus.svg(Tabler icons,MIT) `),r[40]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M12 19h-7a2 2 0 0 1-2-2v-11a2 2 0 0 1 2-2h4l3 3h7a2 2 0 0 1 2 2v3.5`}),c(`path`,{d:`M16 19h6`}),c(`path`,{d:`M19 16v6`})],-1),x(` `+d(o.$t(`@EDITOR:新建文件夹`)),1)]),r[47]||=c(`div`,{class:`ctx-menu-sep`},null,-1),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxCopyAbsolutePath},[D(` copy.svg(Tabler icons,MIT) `),r[41]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M7 9.667a2.667 2.667 0 0 1 2.667-2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1-2.667 2.667h-8.666a2.667 2.667 0 0 1-2.667-2.667l0-8.666`}),c(`path`,{d:`M4.012 16.737a2.005 2.005 0 0 1-1.012-1.737v-10c0-1.1.9-2 2-2h10c.75 0 1.158.385 1.5 1`})],-1),x(` `+d(o.$t(`@EDITOR:复制绝对路径`)),1)]),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxCopyRelativePath},[D(` link.svg(Tabler icons,MIT) `),r[42]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M9 15l6-6`}),c(`path`,{d:`M11 6l.463-.536a5 5 0 0 1 7.071 7.072l-.534.464`}),c(`path`,{d:`M13 18l-.397.534a5.068 5.068 0 0 1-7.127 0a4.972 4.972 0 0 1 0-7.071l.524-.463`})],-1),x(` `+d(o.$t(`@EDITOR:复制相对路径`)),1)]),r[48]||=c(`div`,{class:`ctx-menu-sep`},null,-1),D(` 只有 HTML 才有"用浏览器打开":浏览器能直接渲染出结果 `),o.ctxMenuCanOpenInBrowser?(E(),l(`button`,{key:0,class:`ctx-menu-item`,onClick:o.ctxOpenInBrowser},[D(` world.svg(Tabler icons,MIT) `),r[43]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M3 12a9 9 0 1 0 18 0a9 9 0 0 0-18 0`}),c(`path`,{d:`M3.6 9h16.8`}),c(`path`,{d:`M3.6 15h16.8`}),c(`path`,{d:`M11.5 3a17 17 0 0 0 0 18`}),c(`path`,{d:`M12.5 3a17 17 0 0 1 0 18`})],-1),x(` `+d(o.$t(`@EDITOR:在浏览器中打开`)),1)])):D(`v-if`,!0),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxRevealInExplorer},[D(` folder-open.svg(Tabler icons,MIT) `),r[44]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M5 19l2.757-7.351a1 1 0 0 1 .936-.649h12.307a1 1 0 0 1 .986 1.164l-.996 5.211a2 2 0 0 1-1.964 1.625h-14.026a2 2 0 0 1-2-2v-11a2 2 0 0 1 2-2h4l3 3h7a2 2 0 0 1 2 2v2`})],-1),x(` `+d(o.$t(`@EDITOR:在资源管理器中打开`)),1)]),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxOpenInVscode},[e(o.SvgIcon,{"icon-class":`vscode`,"class-name":`ctx-menu-icon`}),x(` `+d(o.$t(`@EDITOR:在 VSCode 中打开`)),1)]),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxRename},[D(` edit.svg(Tabler icons,MIT) `),r[45]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M7 7h-1a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-1`}),c(`path`,{d:`M20.385 6.585a2.1 2.1 0 0 0-2.97-2.97l-8.415 8.385v3h3l8.385-8.415`}),c(`path`,{d:`M16 5l3 3`})],-1),x(` `+d(o.$t(`@EDITOR:重命名`)),1)]),c(`button`,{class:`ctx-menu-item ctx-menu-item--danger`,onClick:o.ctxDelete},[D(` trash.svg(Tabler icons,MIT) `),r[46]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M4 7l16 0`}),c(`path`,{d:`M10 11l0 6`}),c(`path`,{d:`M14 11l0 6`}),c(`path`,{d:`M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2l1-12`}),c(`path`,{d:`M9 7v-3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v3`})],-1),x(` `+d(o.$t(`@EDITOR:删除`)),1)])],4)):D(`v-if`,!0)]))],64)}var On=j(gt,[[`render`,Dn],[`__scopeId`,`data-v-fc2ebf13`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/EditorView.vue`]]);export{On as default};
@@ -1 +0,0 @@
1
- .mindmap-view[data-v-b157fbd3]{background:var(--bg-page);flex-direction:column;height:100%;min-height:0;display:flex;overflow:hidden}.mm-toolbar[data-v-b157fbd3]{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-b157fbd3],.mm-toolbar-right[data-v-b157fbd3]{align-items:center;gap:8px;min-width:0;display:flex}.mm-toolbar-left[data-v-b157fbd3]{flex:1}.mm-toolbar-right[data-v-b157fbd3],.mm-dir-tag[data-v-b157fbd3]{flex-shrink:0}.mm-dir-tooltip[data-v-b157fbd3]{word-break:break-all;max-width:520px;line-height:1.6}.mm-dir-empty[data-v-b157fbd3]{font-size:var(--font-size-sm);color:var(--text-meta);font-style:italic}.mm-status[data-v-b157fbd3]{font-size:var(--font-size-sm);color:var(--text-secondary);align-items:center;gap:4px;margin-left:4px;display:flex}.mm-status-title[data-v-b157fbd3]{white-space:nowrap;text-overflow:ellipsis;max-width:160px;font-weight:500;overflow:hidden}.mm-status-dirty[data-v-b157fbd3]{color:var(--color-warning-dark);font-size:var(--font-size-base);line-height:1}.mm-body[data-v-b157fbd3]{flex:1;min-height:0;display:flex;overflow:hidden}.mm-sidebar[data-v-b157fbd3]{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-b157fbd3]{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-b157fbd3]{font-size:var(--font-size-sm);color:var(--text-secondary);letter-spacing:.5px;text-transform:uppercase;font-weight:600}.mm-sidebar-list[data-v-b157fbd3]{flex:1;min-height:0;padding:4px;overflow-y:auto}.mm-sidebar-empty[data-v-b157fbd3]{padding:24px 12px}.mm-sidebar-error[data-v-b157fbd3]{text-align:center;font-size:var(--font-size-sm);color:var(--color-danger-dark);padding:24px 12px}.mm-group[data-v-b157fbd3]{margin-bottom:2px}.mm-group-header[data-v-b157fbd3]{border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast) ease;align-items:center;gap:6px;padding:6px;display:flex}.mm-group-header[data-v-b157fbd3]:hover{background:var(--bg-container-hover)}.mm-group-header.active[data-v-b157fbd3]{background:color-mix(in srgb, var(--color-primary) 12%, var(--bg-container))}.mm-group-caret[data-v-b157fbd3]{font-size:var(--font-size-sm);color:var(--text-meta);transition:transform var(--transition-fast) ease;flex-shrink:0}.mm-group-caret.collapsed[data-v-b157fbd3]{transform:rotate(-90deg)}.mm-group-info[data-v-b157fbd3]{flex-direction:column;flex:1;gap:1px;min-width:0;display:flex}.mm-group-name[data-v-b157fbd3]{align-items:baseline;gap:4px;min-width:0;display:flex}.mm-group-title[data-v-b157fbd3]{font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-weight:600;overflow:hidden}.mm-group-header.active .mm-group-title[data-v-b157fbd3]{color:var(--color-primary)}.mm-group-count[data-v-b157fbd3]{font-size:var(--font-size-xs);color:var(--text-meta);flex-shrink:0}.mm-group-path[data-v-b157fbd3]{font-size:var(--font-size-xs);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mm-group-body[data-v-b157fbd3]{padding-left:8px}.mm-group-error[data-v-b157fbd3]{font-size:var(--font-size-sm);color:var(--color-danger-dark);justify-content:space-between;align-items:center;gap:4px;padding:8px 8px 8px 12px;display:flex}.mm-file-item[data-v-b157fbd3]{border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast) ease;align-items:center;gap:8px;padding:6px 8px;display:flex;position:relative}.mm-file-item[data-v-b157fbd3]:hover{background:var(--bg-container-hover)}.mm-file-item.active[data-v-b157fbd3]{background:color-mix(in srgb, var(--color-primary) 12%, var(--bg-container))}.mm-file-item.active .mm-file-title[data-v-b157fbd3]{color:var(--color-primary);font-weight:600}.mm-file-info[data-v-b157fbd3]{flex-direction:column;flex:1;gap:1px;min-width:0;display:flex}.mm-file-title[data-v-b157fbd3]{font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mm-file-meta[data-v-b157fbd3]{font-size:var(--font-size-xs);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mm-file-actions[data-v-b157fbd3]{background:inherit;opacity:0;pointer-events:none;transition:opacity var(--transition-fast) ease, background var(--transition-fast) ease;align-items:center;gap:2px;padding-left:8px;display:flex;position:absolute;top:0;bottom:0;right:8px}.mm-file-item:hover .mm-file-actions[data-v-b157fbd3]{opacity:1;pointer-events:auto}html:not(.dark) .mm-file-actions[data-v-b157fbd3] .el-button--danger{color:var(--git-status-locked)}.mm-editor[data-v-b157fbd3]{background:var(--bg-container);flex:1;min-width:0;min-height:0;position:relative}.mm-editor[data-v-b157fbd3] .zm-mindmap,.mm-editor[data-v-b157fbd3]>*{width:100%;height:100%}.mm-editor-empty[data-v-b157fbd3]{position:absolute;inset:0}.ctx-menu[data-v-b157fbd3]{z-index:var(--z-menu-float);background:var(--bg-container);border:1px solid var(--border-color);border-radius:var(--radius-md);-webkit-user-select:none;user-select:none;min-width:160px;padding:4px;position:fixed;box-shadow:0 8px 24px #00000059}.ctx-menu-item[data-v-b157fbd3]{border-radius:var(--radius-base);cursor:pointer;width:100%;font-size:var(--font-size-mid);color:var(--text-primary);text-align:left;transition:background var(--transition-fast);background:0 0;border:none;align-items:center;gap:8px;padding:6px 10px;display:flex}.ctx-menu-item[data-v-b157fbd3]:hover{background:var(--bg-hover)}.ctx-menu-item--danger[data-v-b157fbd3]{color:var(--color-danger-dark)}.ctx-menu-item--danger[data-v-b157fbd3]:hover{background:#ef44441a}.ctx-menu-sep[data-v-b157fbd3]{background:var(--border-color);height:1px;margin:4px 2px}@media (width<=900px){.mm-sidebar[data-v-b157fbd3]{width:180px}}
@@ -1,3 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Cn as t,Gn as n,In as r,J as i,Kr as a,Mn as o,On as s,Rt as c,Sn as l,Tn as u,U as d,Un as ee,Vt as f,W as p,Wr as m,Xr as h,Yn as g,_n as _,g as v,gr as y,i as b,ir as x,jr as S,kn as C,lr as w,m as te,qn as T,r as E,wn as D,xn as O,z as k}from"./element-plus-Bz6lYur-.js";import{n as A,t as j}from"./_plugin-vue_export-helper-BhoBCXbu.js";import{i as M}from"./index-9h6sH4q0.js";r(),w();var N=o({__name:`MonitorView`,setup(e,{expose:t}){t();let r=M(),i=y(``),a=y(`port`),o=y(`asc`);function s(e){a.value===e?o.value=o.value===`asc`?`desc`:`asc`:(a.value=e,o.value=`asc`)}let l=O(()=>{let e=r.ports.slice(),t=i.value.trim().toLowerCase();t&&(e=e.filter(e=>String(e.localPort).includes(t)||String(e.pid).includes(t)||(e.processName||``).toLowerCase().includes(t)||(e.localAddress||``).toLowerCase().includes(t)||(e.protocol||``).toLowerCase().includes(t)||(e.state||``).toLowerCase().includes(t)));let n=o.value===`asc`?1:-1;return e.sort((e,t)=>{let r,i;return a.value===`port`?(r=e.localPort,i=t.localPort):a.value===`pid`?(r=Number(e.pid)||0,i=Number(t.pid)||0):(r=(e.processName||``).toLowerCase(),i=(t.processName||``).toLowerCase()),r<i?-1*n:r>i?1*n:0}),e});function u(e){if(!Number.isFinite(e)||e<=0)return`0 B`;let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${n.toFixed(r===0?0:1)} ${t[r]}`}function d(e){if(!Number.isFinite(e)||e<=0)return`-`;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60),i=Math.floor(e%60),a=[];return t>0&&a.push(`${t} ${A(`@MONITOR:天`)}`),n>0&&a.push(`${n} ${A(`@MONITOR:时`)}`),r>0&&a.push(`${r} ${A(`@MONITOR:分`)}`),a.push(`${i} ${A(`@MONITOR:秒`)}`),a.join(` `)}function p(e){return e>=90?`var(--color-danger)`:e>=70?`var(--color-warning)`:`var(--color-success)`}let m=y(new Set),h=new Set([0,1,4]),g=new Set([`system`,`idle`,`registry`,`memory compression`,`secure system`,`smss.exe`,`csrss.exe`,`wininit.exe`,`winlogon.exe`,`services.exe`,`lsass.exe`,`svchost.exe`,`fontdrvhost.exe`,`dwm.exe`]);function _(e){if(h.has(Number(e.pid)))return!0;let t=(e.processName||``).trim().toLowerCase();return t?g.has(t)||g.has(t.replace(/\.exe$/,``)):!1}async function v(e){let t=e.pid,n=e.processName||A(`@MONITOR:未知进程`);try{await E.confirm(A(`@MONITOR:确认终止进程提示`).replace(`{pid}`,String(t)).replace(`{process}`,n).replace(`{port}`,String(e.localPort)),A(`@MONITOR:终止进程`),{confirmButtonText:A(`@MONITOR:终止`),cancelButtonText:A(`@MONITOR:取消`),type:`warning`})}catch{return}m.value.add(t);try{await r.killProcess(t,!0),b.success(A(`@MONITOR:已终止进程`).replace(`{pid}`,String(t)))}catch(e){b.error(e?.message||A(`@MONITOR:终止进程失败`))}finally{m.value.delete(t)}}function x(){r.refresh().catch(e=>{b.error(e?.message||A(`@MONITOR:刷新失败`))})}function S(e){r.setAutoRefresh(e)}function C(e){r.setShowAllPorts(e)}n(()=>{r.startAutoRefresh()}),ee(()=>{r.stopAutoRefresh()});let w={store:r,portSearch:i,sortField:a,sortOrder:o,toggleSort:s,filteredPorts:l,formatBytes:u,formatUptime:d,usageColor:p,killingPids:m,SYSTEM_PIDS:h,SYSTEM_PROCESS_NAMES:g,isProtectedProcess:_,handleKill:v,handleManualRefresh:x,handleAutoRefreshChange:S,handleShowAllPortsChange:C,get $t(){return A},get Refresh(){return c},get Search(){return f}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}});r(),S();var P={class:`monitor-view`},F={class:`monitor-toolbar`},I={class:`toolbar-title`},L={key:0,class:`toolbar-host`},R={class:`toolbar-actions`},z={class:`toolbar-label`},B={class:`toolbar-label`},V={class:`metric-card`},H={class:`metric-card__header`},U={class:`metric-card__body`},W={class:`metric-sub`},G=[`title`],K={class:`metric-card`},q={class:`metric-card__header`},J={class:`metric-card__body`},Y={class:`metric-sub`},X={class:`metric-card__footer`},Z={class:`metric-card`},Q={class:`metric-card__header`},ne={class:`metric-card__body`},re={class:`metric-value`},ie={class:`metric-sub`},ae={class:`metric-card__footer`},oe={class:`metric-card`},se={class:`metric-card__header`},ce={class:`metric-card__body`},le={class:`metric-value`},ue={class:`metric-sub`},de={class:`metric-card__footer`},fe={key:0,class:`metric-card disk-card`},pe={class:`metric-card__header`},me={key:0,class:`disks-rows`},he={class:`disk-row`},ge={class:`disk-mount`},_e={class:`disk-usage`},ve={key:1,class:`disks-empty`},ye={key:2,class:`metric-card__footer disks-summary`},be={key:1,class:`monitor-placeholder`},xe={key:2,class:`monitor-error`},Se={key:3,class:`monitor-ports`},Ce={class:`ports-header`},we={class:`ports-title`},Te={class:`ports-table-wrap`},Ee={class:`ports-table`},De={class:`col-protocol`},Oe={class:`col-address`},ke={class:`col-state`},Ae={class:`col-action`},je={class:`col-protocol`},Me={class:`col-address`},Ne={class:`col-port`},Pe={class:`port-num`},$={class:`col-state`},Fe={class:`col-pid`},Ie=[`title`],Le={class:`col-action`},Re=[`title`],ze={key:0},Be={colspan:`7`,class:`ports-empty`};function Ve(n,r,o,c,ee,f){let y=te,b=p,S=k,w=v,E=i,O=d;return T(),u(`div`,P,[D(` 顶部工具栏 `),l(`div`,F,[l(`div`,I,[r[4]||=l(`svg`,{viewBox:`0 0 24 24`,width:`18`,height:`18`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[l(`path`,{d:`M22 12h-4l-3 9L9 3l-3 9H2`})],-1),l(`span`,null,h(c.$t(`@MONITOR:系统监控`)),1),c.store.overview?(T(),u(`span`,L,h(c.store.overview.system.hostname)+` · `+h(c.store.overview.system.platform)+`/`+h(c.store.overview.system.arch),1)):D(`v-if`,!0)]),l(`div`,R,[e(b,{content:c.$t(`@MONITOR:显示所有连接`),placement:`bottom`},{default:x(()=>[e(y,{"model-value":c.store.showAllPorts,onChange:c.handleShowAllPortsChange,size:`small`},null,8,[`model-value`])]),_:1},8,[`content`]),l(`span`,z,h(c.$t(`@MONITOR:全部连接`)),1),e(b,{content:c.$t(`@MONITOR:自动刷新`),placement:`bottom`},{default:x(()=>[e(y,{"model-value":c.store.autoRefresh,onChange:c.handleAutoRefreshChange,size:`small`},null,8,[`model-value`])]),_:1},8,[`content`]),l(`span`,B,h(c.$t(`@MONITOR:自动`)),1),e(S,{size:`small`,icon:c.Refresh,loading:c.store.loading,onClick:c.handleManualRefresh},{default:x(()=>[C(h(c.$t(`@MONITOR:刷新`)),1)]),_:1},8,[`icon`,`loading`])])]),D(` KPI 卡片 + 磁盘占用 `),c.store.overview?(T(),u(`div`,{key:0,class:m([`monitor-cards`,{"monitor-cards--no-disks":!c.store.overview?.disks}])},[l(`div`,V,[l(`div`,H,[D(` cpu.svg(Tabler icons,MIT) `),r[5]||=s(`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" data-v-15c5cbca><path d="M5 6a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1h-12a1 1 0 0 1-1-1l0-12" data-v-15c5cbca></path><path d="M9 9h6v6h-6l0-6" data-v-15c5cbca></path><path d="M3 10h2" data-v-15c5cbca></path><path d="M3 14h2" data-v-15c5cbca></path><path d="M10 3v2" data-v-15c5cbca></path><path d="M14 3v2" data-v-15c5cbca></path><path d="M21 10h-2" data-v-15c5cbca></path><path d="M21 14h-2" data-v-15c5cbca></path><path d="M14 21v-2" data-v-15c5cbca></path><path d="M10 21v-2" data-v-15c5cbca></path></svg>`,1),l(`span`,null,h(c.$t(`@MONITOR:CPU 占用`)),1)]),l(`div`,U,[l(`div`,{class:`metric-value`,style:a({color:c.usageColor(c.store.overview.cpu.usage)})},[C(h(c.store.overview.cpu.usage.toFixed(1)),1),r[6]||=l(`span`,{class:`metric-unit`},`%`,-1)],4),l(`div`,W,h(c.store.overview.cpu.cores)+` `+h(c.$t(`@MONITOR:核心`)),1)]),e(w,{percentage:c.store.overview.cpu.usage,"stroke-width":6,"show-text":!1,color:c.usageColor(c.store.overview.cpu.usage)},null,8,[`percentage`,`color`]),l(`div`,{class:`metric-card__footer`,title:c.store.overview.cpu.model},h(c.store.overview.cpu.model),9,G)]),l(`div`,K,[l(`div`,q,[D(` memory.svg(Tabler icons,MIT):内存条 `),r[7]||=s(`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" data-v-15c5cbca><path d="M12 11v2" data-v-15c5cbca></path><path d="M16 11v2" data-v-15c5cbca></path><path d="M3 7h18a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-18a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1" data-v-15c5cbca></path><path d="M8 11v2" data-v-15c5cbca></path><path d="M4 17v2" data-v-15c5cbca></path><path d="M7 17v2" data-v-15c5cbca></path><path d="M10 17v2" data-v-15c5cbca></path><path d="M20 17v2" data-v-15c5cbca></path><path d="M17 17v2" data-v-15c5cbca></path><path d="M13 17v2" data-v-15c5cbca></path></svg>`,1),l(`span`,null,h(c.$t(`@MONITOR:内存占用`)),1)]),l(`div`,J,[l(`div`,{class:`metric-value`,style:a({color:c.usageColor(c.store.overview.memory.usagePercent)})},[C(h(c.store.overview.memory.usagePercent.toFixed(1)),1),r[8]||=l(`span`,{class:`metric-unit`},`%`,-1)],4),l(`div`,Y,h(c.formatBytes(c.store.overview.memory.used))+` / `+h(c.formatBytes(c.store.overview.memory.total)),1)]),e(w,{percentage:c.store.overview.memory.usagePercent,"stroke-width":6,"show-text":!1,color:c.usageColor(c.store.overview.memory.usagePercent)},null,8,[`percentage`,`color`]),l(`div`,X,h(c.$t(`@MONITOR:空闲`))+` `+h(c.formatBytes(c.store.overview.memory.free)),1)]),l(`div`,Z,[l(`div`,Q,[D(` clock.svg(Tabler icons,MIT) `),r[9]||=l(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`M3 12a9 9 0 1 0 18 0a9 9 0 0 0-18 0`}),l(`path`,{d:`M12 7v5l3 3`})],-1),l(`span`,null,h(c.$t(`@MONITOR:系统运行时间`)),1)]),l(`div`,ne,[l(`div`,re,h(c.formatUptime(c.store.overview.system.uptime)),1),l(`div`,ie,h(c.store.overview.system.nodeVersion),1)]),l(`div`,ae,h(c.store.overview.system.hostname),1)]),l(`div`,oe,[l(`div`,se,[D(` activity.svg(Tabler icons,MIT) `),r[10]||=l(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`M3 12h4l3 8l4-16l3 8h4`})],-1),l(`span`,null,h(c.$t(`@MONITOR:监听端口`)),1)]),l(`div`,ce,[l(`div`,le,h(c.store.ports.length),1),l(`div`,ue,h(c.$t(`@MONITOR:TCP`))+` `+h(c.store.ports.filter(e=>e.protocol===`TCP`).length)+` · `+h(c.$t(`@MONITOR:UDP`))+` `+h(c.store.ports.filter(e=>e.protocol===`UDP`).length),1)]),l(`div`,de,h(c.store.showAllPorts?c.$t(`@MONITOR:显示全部连接`):c.$t(`@MONITOR:仅监听端口`)),1)]),D(` 磁盘占用:与四个 KPI 卡片同排 `),c.store.overview.disks?(T(),u(`div`,fe,[l(`div`,pe,[D(` database.svg(Tabler icons,MIT):磁盘占用(存储语义) `),r[11]||=l(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`M4 6a8 3 0 1 0 16 0a8 3 0 1 0-16 0`}),l(`path`,{d:`M4 6v6a8 3 0 0 0 16 0v-6`}),l(`path`,{d:`M4 12v6a8 3 0 0 0 16 0v-6`})],-1),l(`span`,null,h(c.$t(`@MONITOR:磁盘占用`)),1)]),c.store.overview.disks.drives.length>0?(T(),u(`div`,me,[(T(!0),u(_,null,g(c.store.overview.disks.drives,t=>(T(),u(`div`,{class:`disk-item`,key:t.mount},[l(`div`,he,[l(`span`,ge,h(t.mount),1),e(w,{class:`disk-bar`,percentage:t.usagePercent,"stroke-width":6,"show-text":!1,color:c.usageColor(t.usagePercent)},null,8,[`percentage`,`color`]),l(`span`,{class:`disk-percent`,style:a({color:c.usageColor(t.usagePercent)})},h(t.usagePercent.toFixed(1))+`% `,5)]),D(` 用量走第二行(挂在进度条左边界下面):卡片最窄时也放得下,
2
- 不会把百分比挤出卡片右边缘 `),l(`div`,_e,h(c.formatBytes(t.used))+` / `+h(c.formatBytes(t.total)),1)]))),128))])):(T(),u(`div`,ve,h(c.$t(`@MONITOR:暂无磁盘数据`)),1)),D(` 汇总行只在「多块盘」时才有信息量:单盘时它逐字等于上面那一行,
3
- 同屏写两遍同一组数字 `),c.store.overview.disks.drives.length>1?(T(),u(`div`,ye,h(c.formatBytes(c.store.overview.disks.used))+` / `+h(c.formatBytes(c.store.overview.disks.total))+` · `+h(c.store.overview.disks.usagePercent.toFixed(1))+`% `,1)):D(`v-if`,!0)])):D(`v-if`,!0)],2)):D(`v-if`,!0),D(` 加载占位 `),!c.store.overview&&c.store.loading?(T(),u(`div`,be,[e(E,{class:`is-loading`},{default:x(()=>[e(c.Refresh)]),_:1}),l(`span`,null,h(c.$t(`@MONITOR:加载中`)),1)])):D(`v-if`,!0),D(` 错误提示 `),c.store.error&&!c.store.overview?(T(),u(`div`,xe,[r[12]||=l(`svg`,{viewBox:`0 0 24 24`,width:`20`,height:`20`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[l(`circle`,{cx:`12`,cy:`12`,r:`10`}),l(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),l(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})],-1),l(`span`,null,h(c.store.error),1),e(S,{size:`small`,onClick:c.handleManualRefresh},{default:x(()=>[C(h(c.$t(`@MONITOR:重试`)),1)]),_:1})])):D(`v-if`,!0),D(` 端口列表 `),c.store.overview?(T(),u(`div`,Se,[l(`div`,Ce,[l(`span`,we,h(c.$t(`@MONITOR:端口占用列表`)),1),e(O,{modelValue:c.portSearch,"onUpdate:modelValue":r[0]||=e=>c.portSearch=e,placeholder:c.$t(`@MONITOR:搜索端口 / PID / 进程名`),size:`small`,clearable:``,class:`ports-search`},{prefix:x(()=>[e(E,null,{default:x(()=>[e(c.Search)]),_:1})]),_:1},8,[`modelValue`,`placeholder`])]),l(`div`,Te,[l(`table`,Ee,[l(`thead`,null,[l(`tr`,null,[l(`th`,De,h(c.$t(`@MONITOR:协议`)),1),l(`th`,Oe,h(c.$t(`@MONITOR:本地地址`)),1),l(`th`,{class:`col-port sortable`,onClick:r[1]||=e=>c.toggleSort(`port`)},[C(h(c.$t(`@MONITOR:端口`))+` `,1),l(`span`,{class:m([`sort-arrow`,{active:c.sortField===`port`,desc:c.sortOrder===`desc`}])},`↕`,2)]),l(`th`,ke,h(c.$t(`@MONITOR:状态`)),1),l(`th`,{class:`col-pid sortable`,onClick:r[2]||=e=>c.toggleSort(`pid`)},[r[13]||=C(` PID `,-1),l(`span`,{class:m([`sort-arrow`,{active:c.sortField===`pid`,desc:c.sortOrder===`desc`}])},`↕`,2)]),l(`th`,{class:`col-process sortable`,onClick:r[3]||=e=>c.toggleSort(`process`)},[C(h(c.$t(`@MONITOR:进程`))+` `,1),l(`span`,{class:m([`sort-arrow`,{active:c.sortField===`process`,desc:c.sortOrder===`desc`}])},`↕`,2)]),l(`th`,Ae,h(c.$t(`@MONITOR:操作`)),1)])]),l(`tbody`,null,[(T(!0),u(_,null,g(c.filteredPorts,(e,n)=>(T(),u(`tr`,{key:`${e.protocol}-${e.localPort}-${e.pid}-${n}`},[l(`td`,je,[l(`span`,{class:m([`proto-badge`,`proto-${e.protocol.toLowerCase()}`])},h(e.protocol),3)]),l(`td`,Me,h(e.localAddress),1),l(`td`,Ne,[l(`span`,Pe,h(e.localPort),1)]),l(`td`,$,[l(`span`,{class:m([`state-tag`,`state-${(e.state||`unknown`).toLowerCase()}`])},h(e.state||`-`),3)]),l(`td`,Fe,h(e.pid),1),l(`td`,{class:`col-process`,title:e.processName},h(e.processName||c.$t(`@MONITOR:未知`)),9,Ie),l(`td`,Le,[c.isProtectedProcess(e)?(T(),u(`span`,{key:0,class:`kill-protected`,title:c.$t(`@MONITOR:系统进程,不可终止`)},h(c.$t(`@MONITOR:系统`)),9,Re)):(T(),t(S,{key:1,class:`kill-btn`,size:`small`,text:``,loading:c.killingPids.has(e.pid),disabled:c.killingPids.has(e.pid),onClick:t=>c.handleKill(e)},{default:x(()=>[C(h(c.$t(`@MONITOR:终止`)),1)]),_:1},8,[`loading`,`disabled`,`onClick`]))])]))),128)),c.filteredPorts.length===0?(T(),u(`tr`,ze,[l(`td`,Be,h(c.portSearch?c.$t(`@MONITOR:无匹配结果`):c.$t(`@MONITOR:暂无端口占用`)),1)])):D(`v-if`,!0)])])])])):D(`v-if`,!0)])}var He=j(N,[[`render`,Ve],[`__scopeId`,`data-v-15c5cbca`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/MonitorView.vue`]]);export{He as default};