@leterhong/multichat 1.6.0 → 1.7.0

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 (83) hide show
  1. package/README.md +9 -22
  2. package/backend/dist/routes/agents.js +4 -2
  3. package/backend/dist/routes/agents.js.map +1 -1
  4. package/backend/dist/routes/assistants.js +4 -2
  5. package/backend/dist/routes/assistants.js.map +1 -1
  6. package/backend/dist/routes/chat.js +45 -13
  7. package/backend/dist/routes/chat.js.map +1 -1
  8. package/backend/dist/routes/control-plane.js +25 -18
  9. package/backend/dist/routes/control-plane.js.map +1 -1
  10. package/backend/dist/routes/conversations.js +116 -30
  11. package/backend/dist/routes/conversations.js.map +1 -1
  12. package/backend/dist/routes/import.js +5 -4
  13. package/backend/dist/routes/import.js.map +1 -1
  14. package/backend/dist/routes/mock.js +3 -0
  15. package/backend/dist/routes/mock.js.map +1 -1
  16. package/backend/dist/routes/prompt-templates.js +50 -0
  17. package/backend/dist/routes/prompt-templates.js.map +1 -0
  18. package/backend/dist/routes/providers.js +15 -4
  19. package/backend/dist/routes/providers.js.map +1 -1
  20. package/backend/dist/routes/runs.js +35 -16
  21. package/backend/dist/routes/runs.js.map +1 -1
  22. package/backend/dist/routes/tools.js +15 -13
  23. package/backend/dist/routes/tools.js.map +1 -1
  24. package/backend/dist/runtime/auto-snapshot.js +73 -0
  25. package/backend/dist/runtime/auto-snapshot.js.map +1 -0
  26. package/backend/dist/server.js +3 -0
  27. package/backend/dist/server.js.map +1 -1
  28. package/backend/package.json +5 -2
  29. package/backend/routes/agents.ts +6 -4
  30. package/backend/routes/assistants.ts +4 -2
  31. package/backend/routes/chat.ts +43 -13
  32. package/backend/routes/control-plane.ts +22 -14
  33. package/backend/routes/conversations.ts +105 -29
  34. package/backend/routes/import.ts +11 -10
  35. package/backend/routes/mock.ts +4 -0
  36. package/backend/routes/prompt-templates.ts +38 -0
  37. package/backend/routes/providers.ts +14 -4
  38. package/backend/routes/runs.ts +42 -20
  39. package/backend/routes/tools.ts +14 -12
  40. package/backend/runtime/auto-snapshot.ts +60 -0
  41. package/backend/server.ts +3 -0
  42. package/bin/multichat.mjs +18 -0
  43. package/frontend/dist/assets/agentPicker-DIOlVr1C.js +18 -0
  44. package/frontend/dist/assets/assets-D2_TVEqD.js +1 -0
  45. package/frontend/dist/assets/compare-BYqbOF36.js +1 -0
  46. package/frontend/dist/assets/conversations-DSJtvviE.js +1 -0
  47. package/frontend/dist/assets/data-D6TAf2h9.js +1 -0
  48. package/frontend/dist/assets/{extensionImport-CnTWKtWm.js → extensionImport-C2cHyfeC.js} +7 -7
  49. package/frontend/dist/assets/importExport-BWpKt1dW.js +69 -0
  50. package/frontend/dist/assets/index-BaUGyQ3C.js +46 -0
  51. package/frontend/dist/assets/index-DXwClNo-.css +1 -0
  52. package/frontend/dist/assets/init-DUZJcBWS.js +1 -0
  53. package/frontend/dist/assets/modal-CO4he94s.js +2 -0
  54. package/frontend/dist/assets/modelPicker-Ddloc_nz.js +14 -0
  55. package/frontend/dist/assets/pluginsUI-28Rxtlgo.js +16 -0
  56. package/frontend/dist/assets/react-CDEwA66Z.js +1 -0
  57. package/frontend/dist/assets/{render-DgAg1K8A.js → render-BVmIwN3C.js} +1 -1
  58. package/frontend/dist/assets/send-yu3ud0kM.js +14 -0
  59. package/frontend/dist/assets/settings-IUzleKUb.js +2 -0
  60. package/frontend/dist/assets/{shell-DFV2khQl.js → shell-BLqMMR-L.js} +1 -1
  61. package/frontend/dist/assets/workbench-ChZGUESv.js +40 -0
  62. package/frontend/dist/boot-fallback.js +16 -0
  63. package/frontend/dist/icon-maskable.svg +6 -3
  64. package/frontend/dist/icon.svg +6 -3
  65. package/frontend/dist/index.html +11 -4
  66. package/frontend/dist/manifest.webmanifest +2 -2
  67. package/frontend/dist/theme-seed.js +11 -0
  68. package/package.json +4 -1
  69. package/frontend/dist/assets/agentPicker-C39VzmYa.js +0 -13
  70. package/frontend/dist/assets/compare-BpaGD32J.js +0 -1
  71. package/frontend/dist/assets/conversations-COuLmg99.js +0 -7
  72. package/frontend/dist/assets/data-ZH7Dux1K.js +0 -1
  73. package/frontend/dist/assets/importExport-B3mB-9zs.js +0 -70
  74. package/frontend/dist/assets/index-CASVCOUO.js +0 -34
  75. package/frontend/dist/assets/index-DSvbjNLc.css +0 -1
  76. package/frontend/dist/assets/init-ZPK483vB.js +0 -1
  77. package/frontend/dist/assets/jsx-runtime-ZSsbr0oW.js +0 -9
  78. package/frontend/dist/assets/modal-CgHocv3n.js +0 -2
  79. package/frontend/dist/assets/modelPicker-EUmmVnbj.js +0 -14
  80. package/frontend/dist/assets/pluginsUI-B6jGUQkx.js +0 -16
  81. package/frontend/dist/assets/send-BJhZ_5YA.js +0 -14
  82. package/frontend/dist/assets/settings-DdnYwZl-.js +0 -2
  83. package/frontend/dist/assets/workbench-BY2J4vWC.js +0 -41
@@ -0,0 +1 @@
1
+ :root{--mc-space-1:4px;--mc-space-2:8px;--mc-space-3:12px;--mc-space-4:16px;--mc-space-5:20px;--mc-space-6:24px;--mc-space-8:32px;--mc-canvas:#eff1f5;--mc-surface:#fff;--mc-surface-subtle:#f5f6fa;--mc-surface-elevated:#fff;--mc-surface-hover:#eceef4;--mc-surface-active:#e2e4f0;--mc-sidebar:#e6e9ef;--mc-sidebar-raised:#fff;--mc-sidebar-title:#4c4f69;--mc-sidebar-text:#5c5f77;--mc-sidebar-muted:#8c8fa1;--mc-sidebar-faint:#9ca0b0;--mc-sidebar-hover:#dce0e8;--mc-sidebar-active:#d8dcf4;--mc-sidebar-line:#d9dce6;--mc-text:#4c4f69;--mc-text-muted:#6c6f85;--mc-text-subtle:#8c8fa1;--mc-text-faint:#9ca0b0;--mc-text-disabled:#bcc0cc;--mc-line-faint:#eceef4;--mc-line:#d9dce6;--mc-line-hover:#c6cadb;--mc-line-strong:#aab0c8;--mc-accent:#7287fd;--mc-accent-strong:#5a71f0;--mc-accent-soft:#e9e7fd;--mc-accent-glow:#7287fd38;--mc-accent-line:#7287fd73;--mc-accent-cyan:#179299;--mc-on-accent:#fff;--mc-user-surface:#e9e7fd;--mc-user-line:#d5d2f7;--mc-gradient-accent:linear-gradient(135deg,#7287fd,#8839ef 55%,#ea76cb);--mc-gradient-glow:#8839ef47;--mc-warning:#df8e1d;--mc-warning-soft:#fdf0d5;--mc-danger:#d20f39;--mc-danger-soft:#fde3e9;--mc-success:#40a02b;--mc-success-soft:#e6f2df;--mc-info:#04a5e5;--mc-info-soft:#e2f2fc;--mc-ai:#ea76cb;--mc-ai-soft:#fce9f5;--mc-radius-xs:6px;--mc-radius-sm:8px;--mc-radius-md:10px;--mc-radius-lg:14px;--mc-radius-xl:18px;--mc-radius-2xl:22px;--mc-radius-pill:999px;--mc-shadow-xs:0 1px 2px #1218280d;--mc-shadow-sm:0 2px 8px #1218280f;--mc-shadow:0 12px 32px #12182817;--mc-shadow-pop:0 24px 70px #0a101e3d;--mc-font-sans:"Inter","Aptos",-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;--mc-font-mono:"JetBrains Mono","SF Mono","Menlo","Consolas","Liberation Mono",monospace;--mc-easing:cubic-bezier(.22,.72,.2,1);--mc-duration-fast:.14s;--mc-duration:.2s;--mc-sidebar-width:240px;--mc-sidebar-collapsed:64px;--mc-topbar-height:52px;--mc-inspector-width:344px;--mc-reading-width:860px;--mc-z-base:1;--mc-z-sticky:20;--mc-z-drawer:60;--mc-z-overlay:100;--mc-z-toast:160;--mc-scrollbar-thumb:#464e603d;--mc-scrollbar-thumb-hover:#464e6066}:root[data-theme=dark]{--mc-canvas:#1e1e2e;--mc-surface:#24243a;--mc-surface-subtle:#2a2a42;--mc-surface-elevated:#26263e;--mc-surface-hover:#302f4d;--mc-surface-active:#38375a;--mc-sidebar:#181825;--mc-sidebar-raised:#1e1e2e;--mc-sidebar-title:#cdd6f4;--mc-sidebar-text:#a6adc8;--mc-sidebar-muted:#7f849c;--mc-sidebar-faint:#626382;--mc-sidebar-hover:#2b2b40;--mc-sidebar-active:#31315a;--mc-sidebar-line:#cdd6f414;--mc-text:#cdd6f4;--mc-text-muted:#a6adc8;--mc-text-subtle:#9399b2;--mc-text-faint:#737089;--mc-text-disabled:#52536b;--mc-line-faint:#cdd6f40f;--mc-line:#cdd6f41a;--mc-line-hover:#cdd6f429;--mc-line-strong:#cdd6f43d;--mc-accent:#89b4fa;--mc-accent-strong:#b4befe;--mc-accent-soft:#89b4fa24;--mc-accent-glow:#89b4fa33;--mc-accent-line:#89b4fa80;--mc-accent-cyan:#94e2d5;--mc-on-accent:#1e1e2e;--mc-user-surface:#89b4fa21;--mc-user-line:#89b4fa4d;--mc-gradient-accent:linear-gradient(135deg,#89b4fa,#cba6f7 55%,#f5c2e7);--mc-gradient-glow:#cba6f74d;--mc-warning:#f9e2af;--mc-warning-soft:#f9e2af1f;--mc-danger:#f38ba8;--mc-danger-soft:#f38ba81f;--mc-success:#a6e3a1;--mc-success-soft:#a6e3a11f;--mc-info:#6aa5f8;--mc-info-soft:#6aa5f81f;--mc-ai:#ab97f2;--mc-ai-soft:#ab97f221;--mc-shadow-xs:0 1px 2px #00000059;--mc-shadow-sm:0 2px 8px #0006;--mc-shadow:0 12px 32px #00000073;--mc-shadow-pop:0 24px 70px #0009;--mc-scrollbar-thumb:#ffffff29;--mc-scrollbar-thumb-hover:#ffffff4d;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*,:after,:before{box-sizing:border-box}#root,body,html{width:100%;height:100%}body{background:var(--mc-canvas);color:var(--mc-text);font-family:var(--mc-font-sans);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;font-size:14px;line-height:1.55}body,h1,h2,h3,h4,p{margin:0}button{color:inherit;cursor:pointer;font:inherit;background:0 0;border:0;padding:0}button:disabled{cursor:not-allowed;opacity:.55}input,select,textarea{color:inherit;font:inherit}a{color:var(--mc-accent);text-decoration:none}a:hover{text-decoration:underline}code,kbd,pre{font-family:var(--mc-font-mono)}kbd{background:var(--mc-surface-subtle);border:solid var(--mc-line);border-radius:var(--mc-radius-xs);color:var(--mc-text-muted);border-width:1px 1px 2px;padding:1px 6px;font-size:11px;display:inline-block}:focus-visible{border-radius:var(--mc-radius-xs);outline:2px solid var(--mc-accent);outline-offset:2px}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--mc-scrollbar-thumb);border-radius:var(--mc-radius-pill);border:2px solid #0000}::-webkit-scrollbar-thumb:hover{background:var(--mc-scrollbar-thumb-hover);border:2px solid #0000}::-webkit-scrollbar-track{background:0 0}*{scrollbar-color:var(--mc-scrollbar-thumb) transparent;scrollbar-width:thin}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.spacer{flex:1}.lead,.lead-tight,.muted{color:var(--mc-text-muted)}.lead,.lead-tight{font-size:13px;line-height:1.65}.lead-tight{line-height:1.5}.sep{background:var(--mc-line);flex:none;width:1px;height:18px}.left{text-align:left}.app{background:var(--mc-canvas);grid-template-columns:var(--mc-sidebar-width) minmax(0,1fr);width:100%;height:100dvh;display:grid;overflow:hidden}.app.shell-collapsed{grid-template-columns:var(--mc-sidebar-collapsed) minmax(0,1fr)}.sidebar{border-right:1px solid var(--mc-sidebar-line);flex-direction:column;gap:4px;min-width:0;min-height:0;padding:12px 10px 10px;display:flex;overflow:hidden auto}.sidebar-head,.sidebar>.brand{align-items:center;gap:10px;padding:2px 6px 10px;display:flex}.brand-logo{flex:none}.brand-copy{min-width:0}.brand-copy strong{color:var(--mc-sidebar-title);letter-spacing:-.01em;font-size:14.5px;font-weight:700;display:block}.brand-copy small,.brand-copy span{color:var(--mc-sidebar-muted);font-size:11px;display:block}.sidebar-collapse{margin-left:auto}.shell-collapsed .sidebar .brand-copy,.shell-collapsed .sidebar .recent-work-actions,.shell-collapsed .sidebar .sidebar-section-label,.shell-collapsed .sidebar .sidebar-workspace-switcher>svg,.shell-collapsed .sidebar kbd,.shell-collapsed .sidebar span:not(.workspace-switcher-mark):not(.recent-indicator):not(.model-glyph):not(.model-status-dot):not(.picker-status){display:none}.shell-collapsed .sidebar .new-task-button,.shell-collapsed .sidebar .primary-nav button,.shell-collapsed .sidebar .recent-work-open,.shell-collapsed .sidebar .sidebar-utility,.shell-collapsed .sidebar .sidebar-workspace-switcher{justify-content:center}.sidebar-workspace-switcher{border-radius:var(--mc-radius-md);text-align:left;transition:background var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:10px;width:100%;padding:9px 10px;display:flex}.sidebar-workspace-switcher:hover{background:var(--mc-sidebar-hover)}.sidebar-workspace-switcher span{flex:1;min-width:0}.sidebar-workspace-switcher strong{color:var(--mc-sidebar-title);font-size:13px;font-weight:650}.sidebar-workspace-switcher small,.sidebar-workspace-switcher strong{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.sidebar-workspace-switcher small{color:var(--mc-sidebar-muted);font-size:11px}.workspace-switcher-mark{background:var(--mc-accent);border-radius:var(--mc-radius-sm);color:var(--mc-on-accent);flex:none;justify-content:center;align-items:center;width:28px;height:28px;font-size:13px;font-weight:700;display:inline-flex}.sidebar-section-label{color:var(--mc-sidebar-faint);letter-spacing:.08em;text-transform:uppercase;padding:14px 10px 6px;font-size:10.5px;font-weight:700}.primary-nav{flex-direction:column;gap:2px;display:flex}.primary-nav button{border-radius:var(--mc-radius-md);color:var(--mc-sidebar-text);text-align:left;transition:background var(--mc-duration-fast) var(--mc-easing),color var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:10px;width:100%;padding:8px 10px;font-size:13px;font-weight:560;display:flex}.primary-nav button:hover{background:var(--mc-sidebar-hover);color:var(--mc-sidebar-title)}.primary-nav button.active{box-shadow:var(--mc-shadow-xs)}.recent-work{flex-direction:column;flex:1;min-height:0;margin-top:4px;display:flex}.recent-work-heading{justify-content:space-between;align-items:center;padding:12px 10px 6px;display:flex}.recent-work-heading span{color:var(--mc-sidebar-faint);letter-spacing:.08em;text-transform:uppercase;font-size:10.5px;font-weight:700}.recent-work-heading button{border-radius:var(--mc-radius-xs);color:var(--mc-sidebar-muted);font-size:11.5px}.recent-work-heading button:hover{color:var(--mc-accent)}.recent-work-list{flex-direction:column;gap:2px;min-height:0;display:flex;overflow-y:auto}.recent-work-row{border-radius:var(--mc-radius-md);transition:background var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:2px;display:flex}.recent-work-row:hover{background:var(--mc-sidebar-hover)}.recent-work-row.active{box-shadow:var(--mc-shadow-xs)}.recent-work-open{text-align:left;flex:1;align-items:center;gap:9px;min-width:0;padding:7px 6px 7px 10px;display:flex}.recent-indicator{background:var(--mc-line-strong);border-radius:50%;flex:none;width:6px;height:6px}.recent-work-row.active .recent-indicator{background:var(--mc-accent)}.recent-work-copy{flex:1;min-width:0}.recent-work-copy strong{color:var(--mc-sidebar-title);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:570;display:block;overflow:hidden}.recent-work-copy small{color:var(--mc-sidebar-muted);font-size:10.5px;display:block}.recent-work-actions{align-items:center;gap:2px;padding-right:6px;display:none}.recent-work-row:focus-within .recent-work-actions,.recent-work-row:hover .recent-work-actions{display:flex}.recent-work-actions button{border-radius:var(--mc-radius-xs);color:var(--mc-sidebar-muted);justify-content:center;align-items:center;width:24px;height:24px;display:inline-flex}.recent-work-actions button:hover{background:var(--mc-sidebar-hover);color:var(--mc-danger)}.sidebar p{color:var(--mc-sidebar-muted);padding:10px;font-size:11.5px}.sidebar-footer{border-top:1px solid var(--mc-sidebar-line);margin-top:auto;padding-top:8px}.sidebar-utility{border-radius:var(--mc-radius-md);color:var(--mc-sidebar-text);align-items:center;gap:10px;width:100%;padding:8px 10px;font-size:12.5px;display:flex}.sidebar-utility:hover{background:var(--mc-sidebar-hover)}.sidebar-utility kbd{margin-left:auto;font-size:10px}.new-task{margin:4px 0 2px;position:relative}.new-task-button{background:var(--mc-accent);border-radius:var(--mc-radius-md);color:var(--mc-on-accent);min-height:38px;transition:background var(--mc-duration-fast) var(--mc-easing),transform var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:9px;width:100%;padding:0 12px;font-size:13px;font-weight:650;display:flex}.new-task-button:hover{background:var(--mc-accent-strong)}.new-task-button:active{transform:scale(.985)}.new-task-button span{text-align:left;flex:1}.new-task-menu{animation:menu-in var(--mc-duration) var(--mc-easing);background:var(--mc-surface-elevated);border:1px solid var(--mc-line);border-radius:var(--mc-radius-lg);box-shadow:var(--mc-shadow);z-index:var(--mc-z-sticky);padding:6px;position:absolute;top:calc(100% + 6px);left:0;right:0}.new-task-menu button{border-radius:var(--mc-radius-md);text-align:left;align-items:flex-start;gap:10px;width:100%;padding:9px 10px;display:flex}.new-task-menu button:hover{background:var(--mc-surface-hover)}.new-task-menu svg{color:var(--mc-accent);margin-top:2px}.new-task-menu strong{font-size:13px;font-weight:640;display:block}.new-task-menu small{color:var(--mc-text-muted);font-size:11.5px;display:block}.workspace-frame{grid-template-rows:var(--mc-topbar-height) minmax(0,1fr);min-width:0;min-height:0;display:grid;overflow:hidden}.topbar{background:var(--mc-canvas);border-bottom:1px solid var(--mc-line-faint);grid-row:1;align-items:center;gap:8px;min-width:0;padding:0 14px 0 16px;display:flex}.topbar-context{min-width:0;margin-right:6px}.topbar-title{color:var(--mc-text);font-size:13.5px;font-weight:660}.topbar-path,.topbar-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.topbar-path{color:var(--mc-text-faint);font-size:11px}.topbar-spacer{flex:1}.global-search{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);color:var(--mc-text-faint);min-width:0;max-width:380px;transition:border-color var(--mc-duration-fast) var(--mc-easing);flex:1;align-items:center;gap:8px;padding:6px 10px;font-size:12.5px;display:flex}.global-search:hover{border-color:var(--mc-line-hover)}.global-search span{text-align:left;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.connection-status{border-radius:var(--mc-radius-pill);color:var(--mc-text-muted);white-space:nowrap;align-items:center;gap:7px;padding:4px 10px;font-size:11.5px;font-weight:600;display:inline-flex}.connection-status i{background:var(--mc-success);border-radius:50%;width:7px;height:7px}.connection-status.busy i{background:var(--mc-warning);animation:1.6s ease-out infinite pulse-dot}.mobile-menu{display:none}.mobile-scrim,.scrim{opacity:0;pointer-events:none;transition:opacity var(--mc-duration) var(--mc-easing);z-index:var(--mc-z-drawer);background:#090d146b;position:fixed;inset:0}.mobile-scrim.open,.scrim.open{opacity:1;pointer-events:auto}.main{grid-row:2;display:flex;position:relative;overflow:hidden}.content,.main{background:var(--mc-canvas);min-width:0;min-height:0}.content{flex:1;overflow:hidden auto}.icon-btn{border-radius:var(--mc-radius-md);color:var(--mc-text-muted);height:32px;transition:background var(--mc-duration-fast) var(--mc-easing),color var(--mc-duration-fast) var(--mc-easing),transform var(--mc-duration-fast) var(--mc-easing);justify-content:center;align-items:center;width:32px;display:inline-flex}.icon-btn:hover{background:var(--mc-surface-hover);color:var(--mc-text)}.icon-btn:active{transform:scale(.94)}.close-round{background:var(--mc-surface-subtle);border-radius:50%}.btn-primary{background:var(--mc-accent);border-radius:var(--mc-radius-md);color:var(--mc-on-accent);transition:background var(--mc-duration-fast) var(--mc-easing),transform var(--mc-duration-fast) var(--mc-easing),box-shadow var(--mc-duration-fast) var(--mc-easing);white-space:nowrap;align-items:center;gap:8px;padding:9px 18px;font-size:13px;font-weight:640;display:inline-flex}.btn-primary:hover{background:var(--mc-accent-strong);box-shadow:0 4px 14px var(--mc-accent-glow)}.btn-primary:active{transform:scale(.97)}.btn-ghost{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);color:var(--mc-text);transition:border-color var(--mc-duration-fast) var(--mc-easing),background var(--mc-duration-fast) var(--mc-easing),transform var(--mc-duration-fast) var(--mc-easing);white-space:nowrap;align-items:center;gap:7px;padding:8px 14px;font-size:12.5px;font-weight:570;display:inline-flex}.btn-ghost:hover{background:var(--mc-surface-hover);border-color:var(--mc-line-hover)}.btn-ghost:active{transform:scale(.97)}.btn-danger,.danger-ghost{color:var(--mc-danger)}.danger-ghost{border-radius:var(--mc-radius-md);background:0 0;border:1px solid #0000;align-items:center;gap:7px;padding:8px 14px;font-size:12.5px;font-weight:570;display:inline-flex}.danger-ghost:hover{background:var(--mc-danger-soft)}.btn-auto{border-radius:var(--mc-radius-md);color:var(--mc-accent-strong);align-items:center;gap:7px;padding:7px 12px;font-size:12.5px;font-weight:620;display:inline-flex}.btn-auto,.btn-auto:hover{background:var(--mc-accent-soft)}.btn-auto:hover{filter:brightness(.97)}:root[data-theme=dark] .btn-auto:hover{filter:brightness(1.15)}.field{flex-direction:column;gap:6px;min-width:0;display:flex}.field>label,.field>strong{color:var(--mc-text-muted);font-size:12px;font-weight:620}.field input,.field select,.field textarea,.form-control,input[type=number],input[type=password],input[type=search],input[type=text],select,textarea{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);color:var(--mc-text);transition:border-color var(--mc-duration-fast) var(--mc-easing),box-shadow var(--mc-duration-fast) var(--mc-easing);width:100%;padding:9px 12px;font-size:13px}.field input:hover,.field select:hover,.field textarea:hover,.form-control:hover{border-color:var(--mc-line-hover)}.field input:focus,.field select:focus,.field textarea:focus,.form-control:focus,input:focus,textarea:focus{border-color:var(--mc-accent);box-shadow:0 0 0 3px var(--mc-accent-glow);outline:none}.field textarea{resize:vertical;min-height:72px}.field-hint{color:var(--mc-text-faint);font-size:11.5px;line-height:1.5}input[type=range]{accent-color:var(--mc-accent);appearance:none;background:var(--mc-line);border-radius:var(--mc-radius-pill);cursor:pointer;border:0;width:100%;height:4px}input[type=range]::-webkit-slider-thumb{appearance:none;background:var(--mc-accent);border:2px solid var(--mc-surface);box-shadow:var(--mc-shadow-xs);border-radius:50%;width:16px;height:16px}input[type=checkbox]{accent-color:var(--mc-accent);width:16px;height:16px}select{appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--mc-text-faint) 50%),linear-gradient(135deg,var(--mc-text-faint) 50%,transparent 50%);background-position:calc(100% - 16px) 55%,calc(100% - 11px) 55%;background-repeat:no-repeat;background-size:5px 5px;padding-right:30px}.mc-tag{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-pill);color:var(--mc-text-muted);white-space:nowrap;align-items:center;gap:5px;padding:3px 9px;font-size:11px;font-weight:600;display:inline-flex}.mc-tag.on{color:var(--mc-accent-strong)}:root[data-theme=dark] .mc-tag.on{color:var(--mc-accent)}.mc-tags{flex-wrap:wrap;gap:6px;display:flex}.ok{color:var(--mc-success)}.warn{color:var(--mc-warning)}.danger,.error{color:var(--mc-danger)}.success{color:var(--mc-success)}.info{color:var(--mc-info)}.value{font-variant-numeric:tabular-nums;font-weight:640}.pmeta,.speed{color:var(--mc-text-faint);font-variant-numeric:tabular-nums;font-size:11.5px}.ui-skeleton{background:linear-gradient(100deg,var(--mc-surface-subtle) 40%,var(--mc-surface-hover) 50%,var(--mc-surface-subtle) 60%);border-radius:var(--mc-radius-md);background-size:200% 100%;animation:1.4s ease-in-out infinite skeleton-sweep}.home-workbench,.workspace-home{animation:view-in .35s var(--mc-easing);background:var(--mc-canvas);width:100%;min-height:100%;padding:0 0 64px}.home-hero{flex-direction:column;align-items:flex-start;width:min(1020px,100%);margin:0 auto;padding:clamp(30px,6vh,60px) 30px 8px;display:flex}.hero-eyebrow{color:var(--mc-accent);letter-spacing:.34em;text-transform:uppercase;margin:0 0 14px;font-size:11px;font-weight:700}.hero-display{color:var(--mc-text);letter-spacing:-.025em;margin:0 0 16px;font-size:clamp(34px,5vw,58px);font-weight:700;line-height:1.06}.hero-sub{color:var(--mc-text-muted);margin:0 0 24px;font-size:15px;line-height:1.7}.hero-cta-row{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.hero-cta-primary{background:var(--mc-accent);border-radius:var(--mc-radius-md);color:var(--mc-on-accent);transition:background var(--mc-duration-fast) var(--mc-easing),transform var(--mc-duration-fast) var(--mc-easing),box-shadow var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:8px;padding:11px 22px;font-size:13.5px;font-weight:650;display:inline-flex}.hero-cta-primary:hover{background:var(--mc-accent-strong);box-shadow:0 6px 18px var(--mc-accent-glow);transform:translateY(-1px)}.hero-cta-primary:active{transform:scale(.97)}.hero-cta-ghost{border-radius:var(--mc-radius-pill);color:var(--mc-text);gap:10px;padding:6px 18px 6px 7px;font-size:13px;font-weight:600}.hero-cta-ghost,.hero-play{align-items:center;display:inline-flex}.hero-play{background:var(--mc-surface);border:1px solid var(--mc-line);color:var(--mc-text-muted);height:32px;transition:border-color var(--mc-duration-fast) var(--mc-easing),color var(--mc-duration-fast) var(--mc-easing),background var(--mc-duration-fast) var(--mc-easing);border-radius:50%;justify-content:center;width:32px}.hero-play svg{margin-left:2px}.hero-cta-ghost:hover .hero-play{background:var(--mc-accent-soft);border-color:var(--mc-accent-line);color:var(--mc-accent)}.hero-live{color:var(--mc-text-faint);letter-spacing:.18em;text-transform:uppercase;align-items:center;gap:8px;margin-top:26px;font-size:11px;font-weight:650;display:inline-flex}.hero-live-dot{background:var(--mc-success);border-radius:50%;width:7px;height:7px}.hero-scroll-cue{border-radius:var(--mc-radius-pill);color:var(--mc-text-faint);letter-spacing:.26em;align-self:flex-end;align-items:center;gap:8px;margin-top:18px;padding:8px 13px;font-size:10.5px;font-weight:650;display:inline-flex}.hero-scroll-cue:hover{background:var(--mc-accent-soft);color:var(--mc-accent)}.hero-announce{border-bottom:1px solid var(--mc-line-faint);color:var(--mc-text-muted);justify-content:center;align-items:center;gap:8px;width:100%;padding:9px 18px;font-size:12px;display:flex}.hero-announce:hover{color:var(--mc-accent)}.home-task-entry{width:min(1020px,100%);margin:0 auto;padding:26px 30px 0}.home-workspace-context{color:var(--mc-text-subtle);align-items:center;gap:8px;min-height:20px;margin-bottom:10px;font-size:12px;display:flex}.home-page-label{color:var(--mc-accent);font-weight:680}.home-context-divider{background:var(--mc-text-faint);border-radius:50%;width:3px;height:3px}.home-workspace-context button{border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);align-items:center;gap:6px;padding:3px 8px;font-size:12px;display:inline-flex}.home-workspace-context button:hover{background:var(--mc-surface-hover);color:var(--mc-text)}.home-task-entry h1,.home-task-entry h2{color:var(--mc-text);letter-spacing:-.02em;font-size:24px;font-weight:700}.home-heading p{color:var(--mc-text-muted);margin-top:7px;font-size:13.5px}.home-main-grid{grid-template-columns:minmax(0,1fr) 300px;align-items:start;gap:18px;display:grid}.home-compose-column{flex-direction:column;gap:14px;min-width:0;display:flex}.universal-composer{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-lg);box-shadow:var(--mc-shadow-sm);transition:border-color var(--mc-duration-fast) var(--mc-easing),box-shadow var(--mc-duration-fast) var(--mc-easing);padding:14px}.universal-composer:focus-within{border-color:var(--mc-accent);box-shadow:0 0 0 3px var(--mc-accent-glow)}.home-mode-row{justify-content:space-between;align-items:center;gap:12px;margin-bottom:12px;display:flex}.task-mode-switch{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-md);gap:2px;padding:3px;display:inline-flex}.task-mode-switch button{border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);transition:background var(--mc-duration-fast) var(--mc-easing),color var(--mc-duration-fast) var(--mc-easing),box-shadow var(--mc-duration-fast) var(--mc-easing);padding:5px 13px;font-size:12.5px;font-weight:600}.task-mode-switch button:hover{color:var(--mc-text)}.task-mode-switch button.active{background:var(--mc-surface);box-shadow:var(--mc-shadow-xs);color:var(--mc-text)}.home-mode-description,.mode-description{color:var(--mc-text-faint);font-size:12px}.composer-input,.hero-input,textarea#heroInput{color:var(--mc-text);resize:none;background:0 0;border:0;width:100%;min-height:96px;padding:4px 6px;font-size:14px;line-height:1.6}.composer-input:focus,.hero-input:focus{box-shadow:none;border:0;outline:none}.composer-actions,.hero-actions{border-top:1px solid var(--mc-line-faint);align-items:center;gap:6px;padding-top:10px;display:flex}.composer-actions button,.composer-tool,.hero-actions button{border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);transition:background var(--mc-duration-fast) var(--mc-easing),color var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:6px;padding:6px 10px;font-size:12px;font-weight:560;display:inline-flex}.composer-actions button:hover,.composer-tool:hover,.hero-actions button:hover{background:var(--mc-surface-hover);color:var(--mc-text)}.composer-context-summary{color:var(--mc-text-faint);white-space:nowrap;font-size:11.5px}.contextual-agent,.hero-model,.model-picker{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);color:var(--mc-text);white-space:nowrap;align-items:center;gap:7px;max-width:220px;padding:6px 11px;font-size:12px;font-weight:580;display:inline-flex}.hero-model:hover,.model-picker:hover{background:var(--mc-surface-hover);border-color:var(--mc-line-hover)}.hero-model span,.mp-name{text-overflow:ellipsis;min-width:0;overflow:hidden}.send-btn{background:var(--mc-accent);border-radius:var(--mc-radius-md);color:var(--mc-on-accent);height:34px;transition:background var(--mc-duration-fast) var(--mc-easing),transform var(--mc-duration-fast) var(--mc-easing);flex:none;justify-content:center;align-items:center;width:34px;display:inline-flex}.send-btn:hover:not(:disabled){background:var(--mc-accent-strong)}.send-btn:active:not(:disabled){transform:scale(.92)}.send-btn.stop{background:var(--mc-danger);color:#fff}.home-quick{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.home-quick>span{color:var(--mc-text-faint);font-size:12px;font-weight:600}.home-quick button{background:var(--mc-surface);border:1px solid var(--mc-line);color:var(--mc-text-muted);transition:border-color var(--mc-duration-fast) var(--mc-easing),color var(--mc-duration-fast) var(--mc-easing),background var(--mc-duration-fast) var(--mc-easing);padding:6px 13px;font-size:12px}.home-quick button:hover{color:var(--mc-accent)}.home-footnote{color:var(--mc-text-faint);font-size:11.5px}.home-recent{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-lg);box-shadow:var(--mc-shadow-sm);padding:14px}.home-recent>header{border-bottom:1px solid var(--mc-line-faint);justify-content:space-between;align-items:flex-start;gap:10px;padding-bottom:10px;display:flex}.home-recent h2{font-size:14px;font-weight:680}.home-recent header p{color:var(--mc-text-faint);margin-top:2px;font-size:11.5px}.home-recent header>span{color:var(--mc-text-faint);white-space:nowrap;font-size:11px}.home-recent-list{flex-direction:column;padding-top:6px;display:flex}.home-recent-list button{border-radius:var(--mc-radius-md);text-align:left;transition:background var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:10px;width:100%;padding:9px 8px;display:flex}.home-recent-list button:hover{background:var(--mc-surface-hover)}.home-recent-mark{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);flex:none;justify-content:center;align-items:center;width:28px;height:28px;font-size:12px;font-weight:700;display:inline-flex}.home-recent-copy{flex:1;min-width:0}.home-recent-title{text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:590;display:block;overflow:hidden}.home-recent-meta{color:var(--mc-text-faint);font-size:10.5px;display:block}.home-recent-arrow{color:var(--mc-text-faint);opacity:.5;transition:transform var(--mc-duration) var(--mc-easing),opacity var(--mc-duration) var(--mc-easing)}.home-recent-list button:hover .home-recent-arrow{opacity:1;transform:translate(3px)}.home-recent-empty{color:var(--mc-text-muted);padding:18px 8px;font-size:12.5px}.home-recent-empty small{color:var(--mc-text-faint);margin-top:3px;font-size:11px;display:block}.chat-workspace{animation:view-in .3s var(--mc-easing);background:var(--mc-canvas);flex-direction:column;width:100%;height:100%;min-height:0;padding:0;display:flex}.conversation-canvas{flex-direction:column;flex:1;min-height:0;display:flex}.task-header{color:var(--mc-text-faint);justify-content:space-between;align-items:center;gap:12px;padding:10px 26px;font-size:11.5px;display:flex}.task-header>span:first-child{color:var(--mc-text-muted);font-weight:600}.task-header .running{align-items:center;gap:7px;display:inline-flex}.run-dot,.task-header .running i{background:var(--mc-accent);border-radius:50%;width:7px;height:7px}.task-header .running.running i,.task-header span.running i{animation:1.6s ease-out infinite pulse-dot}.transcript{flex:1;min-height:0;padding:6px 0 12px;overflow-y:auto}.transcript-virtual:focus{outline:none}.transcript-footer{height:8px}.msg{width:min(var(--mc-reading-width),calc(100% - 48px));gap:12px;margin:0 auto 22px;padding:0 2px;display:flex}.msg.user{flex-direction:row-reverse}.msg-avatar{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-md);color:var(--mc-text-muted);flex:none;justify-content:center;align-items:center;width:32px;height:32px;font-size:12px;font-weight:700;display:inline-flex;overflow:hidden}.msg-body{flex-direction:column;gap:6px;min-width:0;max-width:calc(100% - 44px);display:flex}.msg.user .msg-body{align-items:flex-end}.msg-role{align-items:center;gap:8px;min-height:18px;font-size:12px;display:flex}.message-identity{color:var(--mc-text-muted);align-items:center;gap:6px;font-weight:650;display:inline-flex}.model-status-dot{border-radius:50%;width:7px;height:7px}.msg-model{background:var(--mc-ai-soft);border-radius:var(--mc-radius-pill);color:var(--mc-ai);padding:2px 8px;font-size:10.5px;font-weight:650}.message-hover-meta{color:var(--mc-text-faint);opacity:0;transition:opacity var(--mc-duration) var(--mc-easing);font-size:11px}.msg:hover .message-hover-meta{opacity:1}.busy-label{color:var(--mc-text-faint);font-size:11px;font-weight:620}.msg-content{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-lg);overflow-wrap:break-word;min-width:0;max-width:100%;padding:10px 14px;font-size:14px;line-height:1.7}.msg-content.user-plain-text{border-bottom-right-radius:var(--mc-radius-xs);border-color:var(--mc-user-line);white-space:pre-wrap}.msg.streaming .msg-actions,.msg:hover .msg-actions{opacity:1}.msg-actions{opacity:0;transition:opacity var(--mc-duration) var(--mc-easing);align-items:center;gap:4px;display:flex}.msg-action{border-radius:var(--mc-radius-sm);color:var(--mc-text-faint);padding:4px 9px;font-size:11.5px}.msg-action:hover{background:var(--mc-surface-hover);color:var(--mc-text)}.msg-stats{color:var(--mc-text-faint);font-variant-numeric:tabular-nums;flex-wrap:wrap;gap:10px;font-size:11px;display:flex}.mc-trace,.think-row{background:var(--mc-surface);overflow:hidden}.mc-trace summary,.think-row summary{color:var(--mc-text-muted);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;padding:8px 12px;font-size:12px;font-weight:620;list-style:none;display:flex}.mc-trace summary::-webkit-details-marker{display:none}.think-row summary::-webkit-details-marker{display:none}.think-caret,.think-ico,.tool-caret,.trace-ico-svg{color:var(--mc-text-faint);flex:none}.think-caret{transition:transform var(--mc-duration) var(--mc-easing);margin-left:auto;transform:rotate(0)}.mc-trace[open] .think-caret,.think-row[open] .think-caret{transform:rotate(180deg)}.think-summary{color:var(--mc-text-faint);text-overflow:ellipsis;white-space:nowrap;min-width:0;margin-left:auto;font-size:11px;font-weight:500;overflow:hidden}.think-row[data-state=running] summary{color:var(--mc-accent)}.think-body,.tool-body,.trace-body{border-top:1px solid var(--mc-line-faint);color:var(--mc-text-muted);white-space:pre-wrap;max-height:260px;padding:10px 12px;font-size:12.5px;line-height:1.65;overflow-y:auto}.tool-name,.trace-label{color:var(--mc-text);font-weight:640}.tool-summary,.trace-count,.trace-dur,.trace-status,.trace-step{color:var(--mc-text-faint);font-size:11px}.trace-main{min-width:0}.mcp-warning{background:var(--mc-warning-soft);border-left:3px solid var(--mc-warning);border-radius:var(--mc-radius-sm);color:var(--mc-warning);margin-bottom:10px;padding:9px 12px;font-size:12px}.mcp-warning strong{margin-bottom:3px;display:block}.code-block{background:var(--mc-surface-subtle);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);margin:10px 0;position:relative;overflow:hidden}.code-block pre{margin:0;padding:12px 14px;font-size:12.5px;line-height:1.6;overflow-x:auto}.code-copy{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);opacity:0;transition:opacity var(--mc-duration) var(--mc-easing);padding:4px 10px;font-size:11px;position:absolute;top:6px;right:6px}.code-block:hover .code-copy{opacity:1}.composer-wrap{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-lg);box-shadow:var(--mc-shadow-sm);transition:border-color var(--mc-duration-fast) var(--mc-easing),box-shadow var(--mc-duration-fast) var(--mc-easing);width:min(var(--mc-reading-width),calc(100% - 48px));margin:0 auto 18px;padding:12px 14px}.composer-wrap:focus-within{border-color:var(--mc-accent);box-shadow:0 0 0 3px var(--mc-accent-glow)}.composer-start{width:min(640px,100% - 40px);margin-top:14px}.empty-task-shell{animation:view-in .35s var(--mc-easing);flex-direction:column;flex:1;justify-content:center;align-items:center;padding:30px 20px 60px;display:flex}.empty-task-heading{text-align:center;margin-bottom:18px}.empty-task-heading span{color:var(--mc-accent);letter-spacing:.3em;text-transform:uppercase;font-size:11px;font-weight:700}.empty-task-heading h1{letter-spacing:-.02em;margin:10px 0 8px;font-size:26px;font-weight:720}.empty-task-heading p{color:var(--mc-text-muted);font-size:13.5px}.composer{flex-direction:column;display:flex}.composer-hint{color:var(--mc-text-faint);text-align:center;margin-top:8px;font-size:11px}.composer-tool-label{color:var(--mc-text-muted)}.ctx-hint,.file-ctx{color:var(--mc-text-faint);font-size:11.5px}.ctx-hint,.file-ctx-body{padding:2px 0}.card-grid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;display:grid}.agent-card,.control-card-head,.mc-card,.passport-card,.provider-card,.skill-card,.tool-card,.workflow-block{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-lg)}.agent-card,.mc-card,.passport-card,.provider-card,.tool-card{transition:border-color var(--mc-duration-fast) var(--mc-easing),box-shadow var(--mc-duration) var(--mc-easing);flex-direction:column;gap:10px;padding:15px;display:flex}.mc-top,.passport-head,.provider-card-head,.tool-card>header{align-items:center;gap:10px;display:flex}.mc-ico{background:var(--mc-accent-soft);border-radius:var(--mc-radius-md);color:var(--mc-accent);flex:none;justify-content:center;align-items:center;width:34px;height:34px;display:inline-flex}.mc-title-wrap,.provider-identity{flex:1;min-width:0}.mc-title{font-size:13.5px;font-weight:660}.mc-sub,.mc-title,.provider-id,.tpl-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mc-sub,.provider-id,.tpl-name{color:var(--mc-text-faint);font-size:11.5px}.mc-desc{color:var(--mc-text-muted);min-height:0;font-size:12.5px;line-height:1.6}.mc-actions{flex-wrap:wrap;align-items:center;gap:7px;margin-top:auto;display:flex}.extension-card-actions{margin-top:4px}.mc-act{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);color:var(--mc-text);transition:border-color var(--mc-duration-fast) var(--mc-easing),background var(--mc-duration-fast) var(--mc-easing);white-space:nowrap;padding:6px 12px;font-size:12px;font-weight:580}.mc-act:hover{background:var(--mc-surface-hover);border-color:var(--mc-line-hover)}.mc-act.primary{background:var(--mc-accent-soft);border-color:var(--mc-accent-line);color:var(--mc-accent-strong)}:root[data-theme=dark] .mc-act.primary{color:var(--mc-accent)}.mc-act.danger{color:var(--mc-danger);border-color:#0000}.mc-act.danger:hover{background:var(--mc-danger-soft)}.mc-act.wide{flex:1;justify-content:center;min-width:0}.mc-toggle{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);color:var(--mc-text-muted);align-items:center;gap:8px;padding:6px 12px;font-size:12px;font-weight:580;display:inline-flex}.mc-toggle.on{background:var(--mc-accent-soft);border-color:var(--mc-accent-line);color:var(--mc-accent-strong)}:root[data-theme=dark] .mc-toggle.on{color:var(--mc-accent)}.mc-switch{background:var(--mc-line-strong);border-radius:var(--mc-radius-pill);height:15px;transition:background var(--mc-duration-fast) var(--mc-easing);width:26px;position:relative}.mc-switch:after{background:var(--mc-surface);content:"";height:11px;transition:transform var(--mc-duration-fast) var(--mc-easing);border-radius:50%;width:11px;position:absolute;top:2px;left:2px}.mc-toggle.on .mc-switch{background:var(--mc-accent)}.mc-toggle.on .mc-switch:after{transform:translate(11px)}.add-provider,.add-tile,.mc-add,.mc-add-tile{border:1px dashed var(--mc-line-strong);border-radius:var(--mc-radius-lg);color:var(--mc-text-muted);text-align:left;min-height:110px;transition:border-color var(--mc-duration-fast) var(--mc-easing),color var(--mc-duration-fast) var(--mc-easing),background var(--mc-duration-fast) var(--mc-easing);flex-direction:column;align-items:flex-start;gap:6px;padding:15px;display:flex}.add-provider:hover,.add-tile:hover,.mc-add:hover{background:var(--mc-accent-soft);border-color:var(--mc-accent-line);color:var(--mc-accent)}.plus-t{color:var(--mc-text);font-size:13px;font-weight:650}.mc-add .plus-t{color:inherit}.auth-error,.mc-sub{font-size:11.5px}.auth-error{background:var(--mc-danger-soft);border-radius:var(--mc-radius-sm);color:var(--mc-danger);-webkit-line-clamp:2;text-overflow:ellipsis;-webkit-box-orient:vertical;padding:8px 11px;line-height:1.5;display:-webkit-box;overflow:hidden}.activity-empty,.compare-empty,.control-empty,.empty-state,.extension-empty,.plan-empty,.provider-empty,.rail-empty,.usage-empty{border:1px dashed var(--mc-line);border-radius:var(--mc-radius-lg);color:var(--mc-text-muted);text-align:center;padding:26px 18px;font-size:12.5px}.settings{background:var(--mc-canvas);opacity:0;transition:opacity var(--mc-duration) var(--mc-easing),visibility 0s linear var(--mc-duration);visibility:hidden;z-index:var(--mc-z-overlay);display:flex;position:fixed;inset:0}.settings.open{opacity:1;transition:opacity var(--mc-duration) var(--mc-easing);visibility:visible}.settings-side{background:var(--mc-sidebar);border-right:1px solid var(--mc-line-faint);flex-direction:column;flex:none;gap:2px;width:264px;padding:16px 12px;display:flex;overflow-y:auto}.settings-brand{align-items:center;gap:10px;padding:4px 8px 16px;display:flex}.settings-brand strong{font-size:14px;font-weight:700;display:block}.settings-brand span{color:var(--mc-text-faint);font-size:11px}.settings-group-label{color:var(--mc-text-faint);letter-spacing:.08em;text-transform:uppercase;padding:12px 10px 5px;font-size:10.5px;font-weight:700}.settings-nav-group{flex-direction:column;gap:2px;display:flex}.settings-tab{border-radius:var(--mc-radius-md);color:var(--mc-text-muted);text-align:left;transition:background var(--mc-duration-fast) var(--mc-easing),color var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:10px;width:100%;padding:8px 10px;font-size:13px;font-weight:560;display:flex}.settings-tab:hover{background:var(--mc-sidebar-hover);color:var(--mc-text)}.settings-tab.active{background:var(--mc-sidebar-active);box-shadow:var(--mc-shadow-xs);color:var(--mc-text)}.tab-ico{color:var(--mc-text-faint);flex:none}.settings-tab.active .tab-ico{color:var(--mc-accent)}.settings-side-spacer{flex:1}.settings-body{flex:1;min-width:0;padding:30px clamp(20px,5vw,56px) 60px;overflow-y:auto}.settings-page-heading,.settings-subtitle{margin-bottom:20px}.settings-body h2,.settings-body h3{letter-spacing:-.01em;font-size:17px;font-weight:700}.settings-body>h3{margin:26px 0 12px;font-size:14px}.settings-top{position:absolute;top:14px;right:16px}.settings-group{margin-bottom:26px}.agent-studio-grid,.passport-grid,.provider-add-grid,.provider-grid,.usage-grid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;display:grid}.provider-card-fields,.provider-config-card{flex-direction:column;gap:12px;display:flex}.provider-config-card .field input,.provider-config-card .field textarea{background:var(--mc-surface)}.passport-summary,.provider-caps,.provider-summary{flex-wrap:wrap;gap:6px;display:flex}.provider-private,.provider-row,.provider-state{color:var(--mc-text-muted);align-items:center;gap:8px;font-size:12px;display:flex}.memory-mark,.picker-provider-mark,.provider-mark,.rail-current-model-mark,.snapshot-mark{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-xs);color:var(--mc-text-muted);flex:none;justify-content:center;align-items:center;width:22px;height:22px;font-size:11px;font-weight:700;display:inline-flex}.provider-probe-result,.provider-template-grid,.tool-test-result{margin-top:2px}.provider-probe-result,.tool-test-result{background:var(--mc-info-soft);border-radius:var(--mc-radius-sm);color:var(--mc-info);padding:9px 11px;font-size:11.5px;line-height:1.55}.provider-template-grid{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px;display:grid}.heading-actions-row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;margin-bottom:14px;display:flex}.settings-page-heading{flex-direction:column;gap:4px;display:flex}.compact-action{padding:7px 13px}.usage-layout,.usage-panel{flex-direction:column;gap:16px;display:flex}.usage-heading,.usage-heading-actions,.usage-panel-head{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.usage-kicker{color:var(--mc-text-faint);letter-spacing:.1em;text-transform:uppercase;font-size:11px;font-weight:700}.usage-metric,.usage-metrics{gap:12px;display:grid}.usage-metrics{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.usage-metric{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-lg);padding:14px}.usage-date,.usage-metric .label{color:var(--mc-text-faint);font-size:11px;font-weight:620}.usage-metric .value{letter-spacing:-.01em;font-size:20px}.usage-bar-input,.usage-bar-output,.usage-donut,.usage-heatmap,.usage-line,.usage-trend{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-lg);padding:14px}.usage-insights,.usage-legend,.usage-model-list,.usage-provider-list,.usage-ranges{color:var(--mc-text-muted);flex-wrap:wrap;gap:8px;font-size:12px;display:flex}.usage-loading{color:var(--mc-text-faint);padding:20px 0;font-size:12.5px}.usage-wide{grid-column:1/-1}.usage-page{flex-direction:column;gap:16px;display:flex}.execution-detail,.knowledge-results,.memory-list,.run-list,.snapshot-list{flex-direction:column;gap:8px;display:flex}.activity-item,.knowledge-hit,.memory-item,.run-row,.snapshot-item{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);transition:border-color var(--mc-duration-fast) var(--mc-easing),background var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:10px;padding:10px 12px;display:flex}.activity-item:hover,.knowledge-hit:hover,.memory-item:hover,.run-row:hover,.snapshot-item:hover{background:var(--mc-surface-hover);border-color:var(--mc-line-hover)}.knowledge-hit>div,.memory-item>div,.run-main{flex:1;min-width:0}.fc-name,.knowledge-hit strong,.memory-item strong,.run-title{text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:620;display:block;overflow:hidden}.activity-item small,.fc-meta,.knowledge-hit small,.memory-item small,.run-meta,.snapshot-item small{color:var(--mc-text-faint);font-size:11px;display:block}.activity-status,.execution-status,.inspector-status,.picker-option-state,.run-state,.run-status{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-pill);color:var(--mc-text-muted);white-space:nowrap;align-items:center;gap:6px;padding:3px 9px;font-size:10.5px;font-weight:650;display:inline-flex}.activity-status.completed,.execution-status.done,.picker-option-state.ok,.run-state.completed,.run-state.ready,.run-status.ready{background:var(--mc-success-soft);color:var(--mc-success)}.activity-status.running,.execution-status.running,.run-paused,.run-state.running,.run-status.running{background:var(--mc-info-soft);color:var(--mc-info)}.activity-status.error,.compare-cancelled,.compare-error,.execution-status.error,.run-state.error,.run-status.error{background:var(--mc-danger-soft);color:var(--mc-danger)}.run-open,.run-row-button{color:var(--mc-text-faint);flex:none}.run-open:hover,.run-row-button:hover{color:var(--mc-accent)}.compare-config,.compare-history,.compare-lab,.compare-result,.compare-results{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-lg)}.compare-config,.compare-lab{flex-direction:column;gap:14px;padding:16px;display:flex}.compare-results{gap:12px;margin-top:14px;padding:16px;display:grid}.compare-result{flex-direction:column;gap:10px;padding:14px;display:flex}.compare-result-body{color:var(--mc-text);overflow-wrap:break-word;font-size:13.5px;line-height:1.7}.compare-state{align-self:flex-start}.compare-context,.compare-intro,.compare-prompt-label,.compare-targets{color:var(--mc-text-muted);font-size:12.5px}.compare-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.compare-summary{color:var(--mc-text-muted);font-size:12.5px}.compare-history-item{border:1px solid var(--mc-line-faint);border-radius:var(--mc-radius-md);align-items:center;gap:10px;padding:9px 11px;font-size:12.5px;display:flex}.compare-history-empty{color:var(--mc-text-faint);font-size:12px}.compare-adopt{margin-left:auto}.compare-loading{color:var(--mc-text-faint);font-size:12.5px;animation:1.6s ease-in-out infinite skeleton-sweep}.modal{z-index:var(--mc-z-overlay);background:#090d1470;justify-content:center;align-items:center;padding:24px;display:none;position:fixed;inset:0}.modal.open{animation:fade-in var(--mc-duration) var(--mc-easing);display:flex}.modal-card{background:var(--mc-surface-elevated);border:1px solid var(--mc-line);border-radius:var(--mc-radius-xl);box-shadow:var(--mc-shadow-pop);width:min(760px,100%);max-height:min(86dvh,900px);padding:20px;overflow-y:auto}.modal.open .modal-card{animation:pop-in .28s var(--mc-easing)}.modal-close,.modal-heading{display:flex}.modal-heading{justify-content:space-between;align-items:center;gap:12px;margin-bottom:14px}.modal-heading h2{font-size:16px;font-weight:700}.command-palette{z-index:var(--mc-z-overlay);background:#090d1466;justify-content:center;align-items:flex-start;padding:12vh 20px 20px;display:none;position:fixed;inset:0}.command-palette.open{animation:fade-in var(--mc-duration) var(--mc-easing);display:flex}.command-panel{background:var(--mc-surface-elevated);border:1px solid var(--mc-line);border-radius:var(--mc-radius-xl);box-shadow:var(--mc-shadow-pop);width:min(600px,100%);max-height:68dvh;padding:10px;overflow:hidden auto}.command-palette.open .command-panel{animation:pop-in .24s var(--mc-easing)}.command-search-wrap{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);color:var(--mc-text-faint);align-items:center;gap:9px;padding:9px 11px;display:flex}.command-search-wrap input{color:var(--mc-text);background:0 0;border:0;flex:1;font-size:13.5px}.command-search-wrap input:focus{box-shadow:none;outline:none}.command-caption{color:var(--mc-text-faint);letter-spacing:.08em;text-transform:uppercase;padding:12px 10px 6px;font-size:10.5px;font-weight:700}.command-list{flex-direction:column;gap:2px;display:flex}.command-item{border-radius:var(--mc-radius-md);text-align:left;transition:background var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:10px;padding:9px 10px;display:flex}.command-item:focus-visible,.command-item:hover{background:var(--mc-surface-hover)}.command-item-copy{flex:1;min-width:0}.command-item-copy strong{font-size:13px;font-weight:590;display:block}.command-item-copy small{color:var(--mc-text-faint);font-size:11px;display:block}.command-item-group{color:var(--mc-text-faint);white-space:nowrap;font-size:10.5px}.command-empty{color:var(--mc-text-faint);text-align:center;padding:20px 10px;font-size:12.5px}.toast{background:var(--mc-surface-elevated);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);box-shadow:var(--mc-shadow);color:var(--mc-text);opacity:0;pointer-events:none;max-width:min(460px,100vw - 40px);transition:opacity var(--mc-duration) var(--mc-easing),transform var(--mc-duration) var(--mc-easing);z-index:var(--mc-z-toast);padding:11px 16px;font-size:13px;position:fixed;bottom:22px;left:50%;transform:translate(-50%)translateY(0)}.toast.open,.toast.show{opacity:1;transform:translate(-50%)translateY(-4px)}.toast.error{border-color:var(--mc-danger);color:var(--mc-danger)}.workspace-rail{background:var(--mc-sidebar);border-left:1px solid var(--mc-line);bottom:0;right:0;top:var(--mc-topbar-height);transition:transform .26s var(--mc-easing);visibility:hidden;width:min(var(--mc-inspector-width),94vw);z-index:var(--mc-z-drawer);flex-direction:column;display:flex;position:fixed;transform:translate(102%)}body.workflow-rail-open .workspace-rail{visibility:visible;transform:none}.workflow-rail-body,.workflow-rail-close,.workflow-rail-head{display:flex}.workflow-rail-head{justify-content:space-between;align-items:center;gap:10px;padding:12px 14px 8px}.workflow-rail-body{flex-direction:column;flex:1;gap:10px;min-height:0;padding:0 12px 16px;overflow-y:auto}.workflow-tabs,.workflow-task-tabs{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-md);gap:2px;padding:3px;display:flex}.workflow-tabs button,.workflow-task-tabs button{border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);flex:1;padding:6px 8px;font-size:12px;font-weight:600}.workflow-tabs button.active,.workflow-task-tabs button.active{background:var(--mc-surface);box-shadow:var(--mc-shadow-xs);color:var(--mc-text)}.rail-tab-panel,.workflow-block{flex-direction:column;gap:10px;display:flex}.workflow-block{padding:12px}.workflow-block-head{color:var(--mc-text-muted);justify-content:space-between;align-items:center;gap:8px;font-size:12px;font-weight:660;display:flex}.rail-model-switcher{border:0}.rail-model-switcher summary{cursor:pointer;list-style:none}.rail-model-switcher summary::-webkit-details-marker{display:none}.rail-model-menu{flex-direction:column;gap:2px;max-height:240px;margin-top:8px;display:flex;overflow-y:auto}.mp-option,.rail-model-menu button{border-radius:var(--mc-radius-sm);text-align:left;align-items:center;gap:8px;padding:7px 9px;font-size:12.5px;display:flex}.mp-option:hover,.rail-model-menu button:hover{background:var(--mc-surface-hover)}.rail-local-note,.rail-metric-grid{color:var(--mc-text-muted);font-size:11.5px}.rail-metric-grid{grid-template-columns:1fr 1fr;gap:8px;display:grid}.rail-metric-grid .value{font-size:16px}.mode-segments{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-md);gap:2px;padding:3px;display:flex}.mode-segments button{border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);flex:1;padding:5px 8px;font-size:12px;font-weight:600}.mode-segments button.active{background:var(--mc-surface);box-shadow:var(--mc-shadow-xs);color:var(--mc-text)}.verification-list{flex-direction:column;gap:6px;display:flex}.verification-list button{border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);text-align:left;align-items:center;gap:8px;padding:7px 9px;font-size:12.5px;display:flex}.verification-list button:hover{background:var(--mc-surface-hover)}.verification-list button.active{color:var(--mc-success)}.workflow-context-grid{grid-template-columns:1fr 1fr;gap:8px;display:grid}.workflow-folder-action{border:1px dashed var(--mc-line-strong);border-radius:var(--mc-radius-md);color:var(--mc-text-muted);align-items:center;gap:8px;padding:9px 10px;font-size:12.5px;display:flex}.workflow-folder-action:hover{border-color:var(--mc-accent-line);color:var(--mc-accent)}.workflow-rail-scrim{opacity:0;pointer-events:none;transition:opacity var(--mc-duration) var(--mc-easing);z-index:calc(var(--mc-z-drawer) - 1);background:#090d1452;position:fixed;inset:0}body.workflow-rail-open .workflow-rail-scrim{opacity:1;pointer-events:auto}.plan-block{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);flex-direction:column;gap:8px;padding:10px 12px;display:flex}.plan-progress-head{justify-content:space-between;align-items:center;font-size:12px;font-weight:640;display:flex}.plan-progress-track{background:var(--mc-line);border-radius:var(--mc-radius-pill);height:5px;overflow:hidden}.plan-progress-track i{background:var(--mc-accent);border-radius:inherit;height:100%;transition:width var(--mc-duration) var(--mc-easing);display:block}.plan-step-list{flex-direction:column;gap:4px;display:flex}.flight-step,.plan-step-list>div{border-radius:var(--mc-radius-sm);align-items:center;gap:8px;padding:5px 6px;font-size:12.5px;display:flex}.plan-step-remove,.plan-step-toggle{color:var(--mc-text-faint);margin-left:auto}.plan-step-remove:hover{color:var(--mc-danger)}.flight-timeline{flex-direction:column;gap:4px;display:flex}.flight-step{color:var(--mc-text-muted)}.execution-meta{color:var(--mc-text-faint);font-variant-numeric:tabular-nums;font-size:11px}.ctx-hint,.file-ctx-head{color:var(--mc-text-muted);font-size:11.5px;font-weight:600}.context-source-block,.context-source-list{flex-direction:column;gap:6px;display:flex}.context-source{color:var(--mc-text-muted);align-items:center;gap:8px;font-size:12px;display:flex}.context-budget{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);flex-direction:column;gap:8px;padding:10px 12px;display:flex}.context-budget-title{font-size:12px;font-weight:650}.context-budget-track{background:var(--mc-line);border-radius:var(--mc-radius-pill);height:5px;overflow:hidden}.context-budget-track i{background:var(--mc-accent);height:100%;display:block}.context-budget-legend{color:var(--mc-text-faint);gap:10px;font-size:10.5px;display:flex}.context-lens,.metrics-context-card{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);color:var(--mc-text-muted);padding:10px 12px;font-size:12px}.extension-heading,.extension-heading-actions,.extension-import-confirm{display:flex}.extension-heading{flex-direction:column;gap:4px;margin-bottom:16px}.extension-heading h3{font-size:16px;font-weight:700}.extension-heading-actions{flex-wrap:wrap;align-items:center;gap:8px}.extension-source{color:var(--mc-text-faint);align-items:center;gap:8px;font-size:11px;display:flex}.extension-source span:first-child{flex:none;font-weight:640}.extension-source span:last-child{min-width:0}.extension-command,.extension-source span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.extension-command{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);font-family:var(--mc-font-mono);padding:7px 10px;font-size:11.5px}.extension-tool-list{flex-wrap:wrap;gap:5px;display:flex}.extension-tool-list span{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-pill);color:var(--mc-text-muted);font-family:var(--mc-font-mono);padding:3px 8px;font-size:10.5px}.extension-dropzone{border:1px dashed var(--mc-line-strong);border-radius:var(--mc-radius-lg);color:var(--mc-text-muted);transition:border-color var(--mc-duration-fast) var(--mc-easing),background var(--mc-duration-fast) var(--mc-easing);flex-direction:column;align-items:center;gap:8px;padding:34px 20px;font-size:13px;display:flex}.extension-dropzone.over,.extension-dropzone:hover{background:var(--mc-accent-soft);border-color:var(--mc-accent)}.extension-drop-icon{color:var(--mc-text-faint)}.extension-import-list{flex-direction:column;gap:6px;display:flex}.extension-import-row{border:1px solid var(--mc-line-faint);border-radius:var(--mc-radius-sm);align-items:center;gap:9px;padding:8px 10px;font-size:12.5px;display:flex}.extension-import-name{font-weight:620}.extension-import-note,.extension-import-summary,.extension-import-warnings{color:var(--mc-text-muted);font-size:11.5px;line-height:1.55}.extension-import-kind,.extension-import-scope,.extension-import-tags{flex-wrap:wrap;gap:5px;display:flex}.extension-import-conflicts,.extension-import-warnings{color:var(--mc-warning)}.diff-context,.diff-summary,.extension-checks,.extension-diff{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);font-size:12.5px}.diff-context,.extension-diff{font-family:var(--mc-font-mono);white-space:pre-wrap;max-height:300px;padding:10px 12px;font-size:11.5px;overflow:auto}.diff-summary{color:var(--mc-text-muted);align-items:center;padding:8px 11px}.diff-actions,.diff-summary{gap:8px;display:flex}.approval-card,.approval-wrap,.extension-pick-status{font-size:12px}.approval-card,.approval-wrap{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);flex-direction:column;gap:8px;padding:10px 12px;display:flex}.ap-actions,.ap-args,.ap-head,.ap-perms{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.ap-tool{font-family:var(--mc-font-mono);font-size:12px;font-weight:640}.ap-args-label{color:var(--mc-text-faint);font-size:11px;font-weight:650}.ap-args{font-family:var(--mc-font-mono);overflow-wrap:anywhere;font-size:11.5px}.ap-args,.ap-perm{color:var(--mc-text-muted)}.ap-perm{border:1px solid var(--mc-line);border-radius:var(--mc-radius-pill);padding:3px 9px;font-size:11px}.ap-perm.ap-trust{border-color:var(--mc-success);color:var(--mc-success)}.ap-btn{border:1px solid var(--mc-line);border-radius:var(--mc-radius-sm);padding:5px 11px;font-size:12px}.ap-btn:hover{background:var(--mc-surface-hover)}.ap-btn.ap-approve{background:var(--mc-success);border-color:var(--mc-success);color:#fff}.ap-btn.ap-approve:hover{filter:brightness(.94)}.ap-btn.ap-reject{border-color:var(--mc-danger);color:var(--mc-danger)}.ap-btn.ap-reject:hover{background:var(--mc-danger-soft)}.ap-resolved{color:var(--mc-text-faint);font-size:11.5px}.extension-file-tree{border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);font-family:var(--mc-font-mono);max-height:260px;padding:8px 10px;overflow:auto}.extension-file-tree,.passport-issues,.passport-risk,.passport-type{color:var(--mc-text-muted);font-size:12px}.passport-toolbar{flex-wrap:wrap;gap:8px;display:flex}.passport-clean{color:var(--mc-success);font-size:12px}.passport-perms{flex-wrap:wrap;gap:6px;display:flex}.acceptance-block{background:var(--mc-info-soft);border-radius:var(--mc-radius-sm);color:var(--mc-info);padding:9px 11px;font-size:12px;line-height:1.55}.agent-capability-summary,.agent-studio-grid>*{min-width:0}.model-picker .model-picker-list,.model-picker-list{flex-direction:column;gap:2px;max-height:320px;display:flex;overflow-y:auto}.model-block{padding:10px 12px}.model-picker{position:relative}.picker-status{background:var(--mc-success);border-radius:50%;width:7px;height:7px}.mp-name,.picker-option-copy{min-width:0}.picker-dialog-intro{color:var(--mc-text-muted);margin-bottom:12px;font-size:12.5px}.picker-import-project{margin-top:10px}.cached,.estimate-note{color:var(--mc-text-faint);font-size:11px}.boot-error{color:var(--mc-danger);text-align:center;padding:20px}.import-bar,.import-bar-label{color:var(--mc-text-muted);align-items:center;gap:8px;font-size:12px;display:flex}.mini-btn{border:1px solid var(--mc-line);border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);padding:4px 10px;font-size:11.5px}.mini-btn:hover{background:var(--mc-surface-hover);color:var(--mc-text)}.row{align-items:center;gap:8px;display:flex}.folder,.resource-count,.resource-search,.resource-toolbar,.workspace-file-actions,.workspace-resource-list{color:var(--mc-text-muted);font-size:12px}.resource-toolbar{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.workspace-resource-list{flex-direction:column;gap:4px;display:flex}.inspector-checks,.inspector-facts,.inspector-metrics,.inspector-section{color:var(--mc-text-muted);flex-direction:column;gap:6px;font-size:12px;display:flex}.inspector-section-head{color:var(--mc-text);font-weight:660}.inspector-check,.inspector-note,.inspector-score{align-items:center;gap:7px;display:flex}.inspector-run{margin-top:4px}.inspector-empty{color:var(--mc-text-faint);padding:12px 0;font-size:12px}.fc-check,.fc-count,.fc-item,.fc-title{color:var(--mc-text-muted);font-size:12px}.fc-actions{gap:6px;display:flex}.execution-detail .run-detail-grid{grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px;display:grid}.run-detail-summary{color:var(--mc-text-muted);font-size:12px}.activity-summary.done,.execution-status.completed,.is-approved,.verification-list .done{color:var(--mc-success)}.is-rejected{color:var(--mc-danger)}.approved{color:var(--mc-success)}.rejected{color:var(--mc-danger)}.resolved{color:var(--mc-text-faint)}.active-state,.completed,.done,.on,.ready,.start,.started,.stop{font-weight:620}@keyframes view-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes pop-in{0%{opacity:0;transform:translateY(10px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes menu-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse-dot{0%{box-shadow:0 0 0 0 var(--mc-accent-glow)}70%{box-shadow:0 0 0 7px #0000}to{box-shadow:0 0 #0000}}@keyframes skeleton-sweep{0%{background-position:120% 0}to{background-position:-120% 0}}@media (width<=1100px){.home-main-grid{grid-template-columns:1fr}}@media (width<=800px){.app{grid-template-columns:1fr}.sidebar{transition:transform .26s var(--mc-easing);width:min(300px,86vw);z-index:calc(var(--mc-z-drawer) + 1);position:fixed;top:0;bottom:0;left:0;transform:translate(-102%)}.sidebar.open{transform:none}.mobile-menu{display:inline-flex}.global-search,.hero-scroll-cue{display:none}.home-hero,.home-task-entry{padding-inline:20px}.composer-wrap,.msg{width:calc(100% - 24px)}.settings-side{width:220px}}@media (prefers-reduced-motion:reduce){*,:after,:before{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.ap-badge{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-pill);color:var(--mc-text-muted);padding:2px 8px;font-size:10.5px;font-weight:650}.brand-core,.brand-flow,.brand-frame{display:block}.command-arrow{color:var(--mc-text-faint)}.compare-answer{background:var(--mc-surface-subtle);border:1px solid var(--mc-line);border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);white-space:pre-wrap;max-height:220px;padding:9px 11px;font-size:12.5px;overflow-y:auto}.confirm-message{color:var(--mc-text-muted);font-size:13px;line-height:1.6}.context-budget-card{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md);flex-direction:column;gap:8px;padding:10px 12px;display:flex}.diff-git-status{color:var(--mc-text-faint);font-family:var(--mc-font-mono);font-size:11px}.diff-message{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);white-space:pre-wrap;padding:8px 10px;font-size:12px}.diff-summary-icon{color:var(--mc-text-faint)}.memory-item.disabled{opacity:.62}.memory-actions,.memory-toggle{align-items:center;gap:6px;display:inline-flex}.memory-toggle{color:var(--mc-text-faint);margin-left:auto}.provider-state.local,.provider-state.ready{background:var(--mc-success-soft);color:var(--mc-success)}.provider-state.error,.provider-state.offline{background:var(--mc-danger-soft);color:var(--mc-danger)}.provider-card-footer{flex-wrap:wrap;align-items:center;gap:8px;margin-top:auto;display:flex}.passport-page,.provider-settings{flex-direction:column;gap:16px;display:flex}.activity-block,.activity-list{flex-direction:column;gap:6px;display:flex}.experiment-settings{flex-direction:column;gap:16px;display:flex}.experiment-requirement{background:var(--mc-warning-soft);border-radius:var(--mc-radius-sm);color:var(--mc-warning);padding:9px 12px;font-size:12.5px}.hero-tag{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-pill);color:var(--mc-text-muted);gap:6px;padding:4px 11px;font-size:11.5px}.hero-tag,.ico{align-items:center;display:inline-flex}.ico{justify-content:center}.add-tile .ico{font-size:18px}.mcp-security-note{background:var(--mc-info-soft);border-radius:var(--mc-radius-sm);color:var(--mc-info);padding:9px 11px;font-size:12px;line-height:1.55}.knowledge-search{border-top:1px solid var(--mc-line-faint);align-items:center;gap:8px;margin-top:12px;padding-top:12px;display:flex}.knowledge-search input{flex:1;min-width:0}.plan-add{border:1px dashed var(--mc-line-strong);border-radius:var(--mc-radius-sm);color:var(--mc-text-muted);align-self:flex-start;padding:6px 12px;font-size:12px}.plan-add:hover{border-color:var(--mc-accent-line);color:var(--mc-accent)}.rail-back{align-items:center;gap:6px;display:inline-flex}.rail-empty-action{background:var(--mc-accent-soft);border-radius:var(--mc-radius-md);color:var(--mc-accent-strong);align-self:flex-start;padding:7px 13px;font-size:12.5px;font-weight:620}:root[data-theme=dark] .rail-empty-action{color:var(--mc-accent)}.rail-empty-action:hover{filter:brightness(.97)}:root[data-theme=dark] .rail-empty-action:hover{filter:brightness(1.12)}.settings-close-side{margin-top:10px}.extension-picker-actions,.skill-card-actions,.tpl-actions{flex-wrap:wrap;align-items:center;gap:7px;margin-top:auto;display:flex}.task-only{display:none}.topbar .task-only,body.task-view .task-only{display:inline-flex}.tpl-meta{color:var(--mc-text-faint);font-size:11px}.tpl-save{margin-left:auto}.trace-title{color:var(--mc-text);font-size:12px;font-weight:640}.trace-sub{color:var(--mc-text-faint);font-size:11px}.usage-model-wrap{flex-direction:column;gap:8px;display:flex}.usage-legend .input{align-items:center;gap:5px;display:inline-flex}.usage-legend .input:before,.usage-legend .output:before{background:var(--mc-accent);content:"";border-radius:3px;width:9px;height:9px}.usage-legend .output:before{background:var(--mc-ai)}.memory-item .memory-actions button,.msg-actions .msg-action{color:var(--mc-text-faint)}.card-grid>.mc-add{justify-content:center}.provider-card-fields .row{flex-wrap:wrap}.command-list .command-item[aria-selected=true]{background:var(--mc-surface-hover)}input[type=checkbox]+label{cursor:pointer;align-items:center;gap:7px;display:inline-flex}label:has(input[type=checkbox]){cursor:pointer;align-items:center;gap:7px;display:inline-flex}.compare-actions .is-stopping{background:var(--mc-danger);color:#fff}.sidebar-close{border-radius:var(--mc-radius-md);color:var(--mc-sidebar-muted);align-items:center;gap:8px;padding:8px 10px;font-size:12.5px;display:inline-flex}.sidebar-close:hover{background:var(--mc-sidebar-hover);color:var(--mc-sidebar-title)}[hidden]{display:none!important}.hero-scroll-cue{justify-content:flex-end;align-self:auto;width:min(1020px,100%);margin:0 auto;padding:0 30px;display:flex}.home-hero{min-height:clamp(320px,calc(100vh - var(--mc-topbar-height) - 430px),480px);text-align:center;align-items:center;padding-top:clamp(48px,10vh,96px)}.hero-display{letter-spacing:-.02em}.hero-sub{max-width:520px}.hero-cta-row,.hero-live{justify-content:center}.hero-eyebrow,.hero-scroll-cue{display:none}.primary-nav button.active,.recent-work-row.active{box-shadow:none}.recent-work-row.active .recent-work-copy strong{font-weight:640}.composer-wrap,.universal-composer{border-radius:var(--mc-radius-xl);box-shadow:var(--mc-shadow-xs)}.composer-wrap:focus-within,.universal-composer:focus-within{box-shadow:var(--mc-shadow-sm)}.mode-segments,.task-mode-switch{background:0 0;gap:8px;padding:0}.mode-segments button,.task-mode-switch button{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-pill);box-shadow:none;color:var(--mc-text-muted);padding:6px 15px}.mode-segments button:hover,.task-mode-switch button:hover{background:var(--mc-surface);border-color:var(--mc-line-hover);color:var(--mc-text)}.mode-segments button.active,.task-mode-switch button.active{background:var(--mc-accent-soft);border-color:var(--mc-accent);box-shadow:none;color:var(--mc-accent)}.workflow-tabs,.workflow-task-tabs{background:0 0}.workflow-tabs button,.workflow-task-tabs button{border-radius:var(--mc-radius-pill);border:1px solid #0000}.workflow-tabs button.active,.workflow-task-tabs button.active{background:var(--mc-surface-subtle);border-color:var(--mc-line);box-shadow:none}.send-btn{border-radius:var(--mc-radius-lg)}.msg-content.user-plain-text{border-bottom-right-radius:var(--mc-radius-lg)}.msg-avatar{background:var(--mc-accent-soft);border-radius:var(--mc-radius-pill);color:var(--mc-accent)}.btn-primary{border-radius:var(--mc-radius-lg)}.hero-cta-primary{border-radius:var(--mc-radius-pill);padding:11px 26px}.btn-primary,.hero-cta-primary,.send-btn{box-shadow:none}.hero-cta-primary:hover{box-shadow:0 4px 14px var(--mc-accent-glow)}.home-quick button{background:var(--mc-surface-subtle);border-radius:var(--mc-radius-pill);border-color:#0000}.home-quick button:hover{background:var(--mc-accent-soft);border-color:var(--mc-accent-line)}.new-task-button{border-radius:var(--mc-radius-lg)}.hero-announce{background:var(--mc-surface-subtle);border-bottom-color:var(--mc-line-faint)}.hero-announce:hover{background:var(--mc-accent-soft)}.activity-status,.execution-status,.inspector-status,.mc-tag,.picker-option-state,.run-state,.run-status{border-radius:var(--mc-radius-sm)}.home-hero{min-height:0;padding-top:clamp(56px,14vh,130px);padding-bottom:6px}.hero-display{letter-spacing:0;font-size:clamp(26px,3.2vw,38px);font-weight:640}.hero-cta-row,.hero-live,.hero-sub{display:none}.home-task-entry{width:min(720px,100%);padding-top:34px}.home-main-grid{grid-template-columns:minmax(0,1fr)}.home-footnote,.home-quick,.home-recent{display:none}.home-task-entry h1,.home-task-entry h2{color:var(--mc-text-subtle);text-align:center;font-size:17px;font-weight:620}.home-heading p{display:none}.home-workspace-context{justify-content:center}.home-heading{margin-bottom:0}.home-workspace-context{display:none}.home-workbench{min-height:calc(100vh - var(--mc-topbar-height));flex-direction:column;padding-bottom:0;display:flex}.home-hero{margin-top:auto;padding-top:30px}.home-hero .hero-display{margin-bottom:4px;font-size:clamp(24px,2.6vw,34px)}.home-task-entry{margin-bottom:auto;padding-bottom:28px}.home-task-entry h1,.home-task-entry h2{margin-bottom:14px}.hero-input,textarea#heroInput{min-height:108px}.hero-announce,.topbar .global-search,.topbar-path{display:none}.topbar{gap:6px}.sidebar{background:var(--mc-sidebar);padding-top:14px}.sidebar-search{border-radius:var(--mc-radius-md);color:var(--mc-sidebar-muted);transition:background var(--mc-duration-fast) var(--mc-easing),color var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:10px;width:100%;margin:6px 0 2px;padding:8px 10px;font-size:13px;display:flex}.sidebar-search:hover{background:var(--mc-sidebar-hover);color:var(--mc-sidebar-title)}.recent-indicator,.recent-work-copy small{display:none}.recent-work-copy strong{color:var(--mc-sidebar-text);font-size:13px;font-weight:560}.recent-work-row.active .recent-work-copy strong{color:var(--mc-sidebar-title)}.recent-work-heading{padding-top:16px}.sidebar-footer{border-top:0}.msg .msg-content{background:0 0;border:0;padding:2px 0 0}.msg-content.user-plain-text{background:var(--mc-user-surface);border-radius:var(--mc-radius-lg);border:0;padding:10px 16px}.msg.user .msg-body{max-width:78%}.mc-trace,.think-row{background:var(--mc-surface-subtle);border:1px solid var(--mc-line);border-radius:var(--mc-radius-md)}.mcp-warning{border:1px solid var(--mc-warning-soft)}.composer-wrap,.universal-composer{background:var(--mc-surface);border:1px solid var(--mc-line)}.composer .composer-input,.hero-input,textarea#heroInput{font-size:15px}.topbar-title{font-size:14px;font-weight:600}.brand-mark{height:var(--brand-mark-size,34px);width:var(--brand-mark-size,34px);flex:none;justify-content:center;align-items:center;display:inline-flex}.brand-mark svg{width:100%;height:100%}.brand-mark .brand-frame{fill:var(--mc-accent-soft);stroke-width:1.4px}.brand-mark .brand-flow,.brand-mark svg>circle{fill:none;stroke:var(--mc-accent);stroke-linecap:round;stroke-width:1.8px}.brand-mark .brand-core{fill:var(--mc-accent);stroke:none}.msg-content table{border-collapse:collapse;width:100%;margin:12px 0;font-size:13px}.msg-content td,.msg-content th{border:1px solid var(--mc-line);text-align:left;vertical-align:top;padding:8px 12px}.msg-content th{background:var(--mc-surface-subtle);font-weight:650}.msg-content tr:nth-child(2n) td{background:color-mix(in srgb,var(--mc-surface-subtle) 55%,transparent)}.agent-capability-summary{color:var(--mc-text-muted);flex-wrap:wrap;gap:4px 14px;font-size:12px;display:flex}.agent-capability-summary strong{font-variant-numeric:tabular-nums;margin-right:3px}.agent-status{background:var(--mc-success-soft);border-radius:var(--mc-radius-pill);color:var(--mc-success);white-space:nowrap;align-items:center;gap:6px;padding:3px 10px;font-size:11px;font-weight:650;display:inline-flex}.agent-status i{background:currentColor;border-radius:50%;width:6px;height:6px}.compare-targets{border:0;flex-wrap:wrap;align-items:center;gap:8px;min-height:46px;margin:0;padding:0;display:flex}.compare-targets legend{color:var(--mc-text-muted);margin-bottom:8px;padding:0;font-size:12px;font-weight:630}.compare-targets label{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-pill);cursor:pointer;transition:border-color var(--mc-duration-fast) var(--mc-easing),background var(--mc-duration-fast) var(--mc-easing);align-items:center;gap:8px;padding:7px 13px;display:inline-flex}.compare-targets label:has(input:checked){background:var(--mc-accent-soft);border-color:var(--mc-accent)}.compare-targets input{accent-color:var(--mc-accent)}.compare-targets strong{font-size:12.5px;font-weight:620}.compare-targets small{color:var(--mc-text-faint);font-size:11px}.compare-results:not(:has(*)){display:none}.settings-body:empty:after{color:var(--mc-text-faint);content:"该设置页暂无内容";text-align:center;padding:40px 0;font-size:13px;display:block}.add-tile strong,.mc-add strong{color:var(--mc-text);font-size:13px;font-weight:650;display:block}.add-tile small,.mc-add small{color:var(--mc-text-muted);margin-top:2px;font-size:11.5px;line-height:1.5;display:block}.provider-summary{gap:14px}.provider-summary>span{white-space:nowrap}.settings-body>*{max-width:980px}.settings-body{padding-inline:clamp(20px,4vw,48px)}:root{--mc-radius-lg:16px;--mc-radius-xl:20px;--mc-radius-2xl:26px}.new-task-button,.send-btn:not(.stop){background:var(--mc-gradient-accent);box-shadow:0 4px 16px var(--mc-gradient-glow)}.new-task-button:hover,.send-btn:hover:not(:disabled){background:var(--mc-gradient-accent);box-shadow:0 6px 22px var(--mc-gradient-glow);filter:brightness(1.08)}.btn-primary,.hero-cta-primary{background:var(--mc-gradient-accent);border-radius:var(--mc-radius-pill)}.btn-primary:hover,.hero-cta-primary:hover{background:var(--mc-gradient-accent);box-shadow:0 6px 20px var(--mc-gradient-glow);filter:brightness(1.06)}.hero-display{background:var(--mc-gradient-accent);-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text}:root[data-theme=dark] .hero-display{background:linear-gradient(135deg,#89b4fa,#cba6f7 55%,#f5c2e7);-webkit-background-clip:text;background-clip:text}.brand-mark .brand-frame{fill:var(--mc-user-surface);stroke:var(--mc-accent-line)}.brand-mark .brand-flow,.brand-mark svg>circle{stroke:var(--mc-ai)}.brand-mark .brand-core{fill:var(--mc-ai)}.primary-nav button.active{box-shadow:none;color:var(--mc-sidebar-title)}.primary-nav button.active,.recent-work-row.active{background:var(--mc-sidebar-active)}.mode-segments button.active,.task-mode-switch button.active{background:var(--mc-gradient-accent);box-shadow:0 3px 12px var(--mc-gradient-glow);color:#fff;border-color:#0000}:root[data-theme=dark] .mode-segments button.active,:root[data-theme=dark] .task-mode-switch button.active{color:#1e1e2e}.composer-wrap:focus-within,.universal-composer:focus-within{border-color:var(--mc-accent-line);box-shadow:0 0 0 4px var(--mc-accent-glow)}.agent-card:hover,.mc-card:hover,.passport-card:hover,.provider-card:hover,.tool-card:hover{border-color:var(--mc-accent-line);box-shadow:0 8px 24px var(--mc-gradient-glow)}::selection{background:#cba6f759}::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--mc-ai) 45%,transparent);background-clip:content-box}::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--mc-ai) 70%,transparent);background-clip:content-box}.hero-cta-primary{box-shadow:0 6px 22px var(--mc-gradient-glow)}.msg-avatar{background:var(--mc-ai-soft);color:var(--mc-ai)}.hero-live-dot,.model-status-dot{background:var(--mc-ai)}.hero-live-dot{animation:2.4s ease-out infinite pulse-dot}.connection-status i{background:var(--mc-ai)}.mc-tag.on{background:var(--mc-accent-soft);color:var(--mc-accent)}.toast{border-radius:var(--mc-radius-lg);box-shadow:0 10px 34px var(--mc-gradient-glow)}.home-workbench{position:relative;overflow:hidden}.home-workbench:after,.home-workbench:before{content:"";filter:blur(90px);opacity:.5;pointer-events:none;z-index:0;border-radius:50%;position:fixed}.home-workbench:before{background:radial-gradient(circle at 30% 30%,#89b4fa80,#cba6f740 60%,#0000 75%);width:46vw;height:46vw;top:-18vw;right:-10vw}.home-workbench:after{background:radial-gradient(circle at 60% 40%,#f5c2e766,#89b4fa33 60%,#0000 75%);width:40vw;height:40vw;bottom:-16vw;left:-8vw}.workspace-home>:not(.hero-ambient){z-index:1;position:relative}.hero-ambient{display:none}.home-mascot{color:var(--mc-text);filter:drop-shadow(0 8px 22px var(--mc-gradient-glow));margin-bottom:10px}.mascot-antenna,.mascot-antenna-dot{fill:var(--mc-ai-soft)}.character-grid{grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:14px;margin-top:12px;display:grid}.home-characters{width:min(1020px,100%);margin:34px auto 0;padding:0 30px}.home-characters header h3{font-size:15px;font-weight:680}.home-characters header p{color:var(--mc-text-faint);margin-top:3px;font-size:12px}.character-card{background:var(--mc-surface);border:1px solid var(--mc-line);border-radius:var(--mc-radius-xl);text-align:left;transition:transform var(--mc-duration) var(--mc-easing),box-shadow var(--mc-duration) var(--mc-easing),border-color var(--mc-duration) var(--mc-easing);flex-direction:column;align-items:flex-start;gap:6px;padding:16px;display:flex;position:relative;overflow:hidden}.character-card:before{background:var(--hue,var(--mc-accent-soft));content:"";filter:blur(30px);opacity:.5;border-radius:50%;width:120px;height:120px;position:absolute;inset:-40% -20% auto auto}.character-card.hue-0{--hue:#89b4fa80}.character-card.hue-1{--hue:#cba6f780}.character-card.hue-2{--hue:#f5c2e780}.character-card.hue-3{--hue:#94e2d580}.character-card.hue-4{--hue:#f9e2af80}.character-card.hue-5{--hue:#fab38780}.character-card:hover{border-color:var(--mc-accent-line);box-shadow:0 10px 30px var(--mc-gradient-glow);transform:translateY(-3px)}.character-avatar{color:var(--mc-text);display:inline-flex}.character-card strong{color:var(--mc-text);font-size:13.5px;font-weight:660}.character-card small{color:var(--mc-text-muted);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:11.5px;line-height:1.5;display:-webkit-box;overflow:hidden}.character-go{color:var(--mc-accent);opacity:0;transition:opacity var(--mc-duration) var(--mc-easing),transform var(--mc-duration) var(--mc-easing);margin-top:4px;font-weight:700;transform:translate(-4px)}.character-card:hover .character-go{opacity:1;transform:translate(0)}
@@ -0,0 +1 @@
1
+ import{S as e,b as t,c as n,f as r,g as i,i as a,x as o,y as s}from"./index-BaUGyQ3C.js";async function c(){await d(),await l(),window.addEventListener(`popstate`,()=>{l()})}async function l(){let n=location.hash.replace(/^#\/?/,``).split(`/`).filter(Boolean).map(decodeURIComponent),r=e(`#modal`)?.classList.contains(`open`)&&e(`#modalCard`)?.classList.contains(`compare-modal-card`);if(n[0]!==`compare`&&r&&closeModal(),n[0]===`settings`)openSettings(n[1]||`general`);else if(e(`#settings`)?.classList.contains(`open`)&&closeSettings(),n[0]===`home`||!n[0])a(`home`);else if(n[0]===`compare`)openCompare();else if(n[0]===`chat`&&n[1]&&!u(n[1])){if(i.conversationsLoadFailed){a(`chat`),await openConversation(n[1]);return}i.currentConvId=null,i.messages=[],i.workflowScope=t(null,i.selectedProject?.id),i.workflow=s(i.workflowScope),a(`home`),history.replaceState(null,``,`#/home`),renderTopbar(),renderContent(),o(`该任务不存在或已被删除,已返回新任务页`,`error`)}else n[0]===`chat`&&n[1]&&n[1]!==i.currentConvId?(a(`chat`),await openConversation(n[1])):n[0]===`new`&&(i.currentConvId||i.messages.length?await newConversation():a(`home`),history.replaceState(null,``,`#/home`))}function u(e,t=i.conversations){return t.some(t=>t.id===e)}async function d(){await Promise.all([loadProviders(),loadConversations(),loadSkills(),loadTools(),loadMcpServers(),loadAgents(),loadPlugins(),loadRuntime(),loadRuns()]),r();let n=localStorage.getItem(`multichat_lastModel`);if(n){let[e,...t]=n.split(`:`),r=t.join(`:`),a=i.providers.find(t=>t.id===e);a&&(i.selectedProvider=a,i.selectedModel=r)}if(!i.selectedProvider&&i.providers.length>0){let e=i.providers[0];i.selectedProvider=e,i.selectedModel=e.models&&e.models[0]||e.defaultModel||e.model||``}await loadWorkspaces(),i.workflowScope=t(null,i.selectedProject?.id),i.workflow=s(i.workflowScope),renderTopbar(),renderContent(),renderSettings();let a=e(`#fcMin`);a&&(a.onclick=()=>{let t=e(`#fileCtxBody`);t&&(t.classList.toggle(`collapsed`),a.textContent=t.classList.contains(`collapsed`)?`▸`:`▾`)}),renderFileContext(),f();let o=e(`#convSearch`);o&&(o.oninput=e=>{i.convSearch=e.target.value,renderConvList()});let c=e(`#forkBtn`);c&&(c.onclick=p);let l=e(`#composerFileBtn`);l&&(l.onclick=()=>openSettings(`workspace`))}function f(){let t=e(`#content`);t&&(t.addEventListener(`dragover`,e=>{e.preventDefault(),t.classList.add(`drag-over`)}),t.addEventListener(`dragleave`,e=>{e.target===t&&t.classList.remove(`drag-over`)}),t.addEventListener(`drop`,async e=>{e.preventDefault(),t.classList.remove(`drag-over`);let r=e.dataTransfer&&e.dataTransfer.files;if(r&&r.length){if(!i.selectedProject)o(`请先在右上角选择工作区/项目`,`error`);else{for(let e of Array.from(r))if(e.size>2e6)o(`文件超过 2MB 限制,已跳过:`+e.name,`error`);else try{let t=await e.text(),r=await n(`/api/assets`,{method:`POST`,body:JSON.stringify({projectId:i.selectedProject.id,name:e.name,mimeType:e.type||`text/plain`,content:t})});i.assets=[r,...i.assets],i.selectedAssetIds=new Set([...i.selectedAssetIds,r.id]),o(`已添加文件:`+e.name)}catch(e){o(`文件添加失败:`+e.message,`error`)}renderFileContext()}}}))}async function p(){let t=i.messages.filter(e=>e.content&&!e.streaming).map(e=>({role:e.role,content:e.content,model:e.model}));if(!t.length){o(`当前没有可分支的内容`,`error`);return}let r=`分支 · `+(t.find(e=>e.role===`user`)?.content?.slice(0,20)||`新对话`);i.currentConvId=null,i.messages=[],e(`#topbarTitle`).textContent=`新对话(分支)`,renderContent(),renderConvList();try{let a=await n(`/api/conversations`,{method:`POST`,body:JSON.stringify({title:r,workspaceId:i.selectedWorkspace?.id||null,projectId:i.selectedProject?.id||null})});i.currentConvId=a.id,window.history.replaceState(null,``,`#/chat/${encodeURIComponent(a.id)}`),await n(`/api/conversations/`+a.id+`/messages`,{method:`POST`,body:JSON.stringify(t)}),i.messages=t,e(`#topbarTitle`).textContent=a.title||`对话`,await loadConversations(),renderContent(),renderConvList(),o(`已创建分支对话`)}catch(e){o(`分支失败:`+e.message,`error`)}}export{l as applyLocationRoute,c as bootstrap,p as forkConversation,d as initApp,u as isKnownConversation,f as setupDrop};
@@ -0,0 +1,2 @@
1
+ import{S as e,w as t}from"./index-BaUGyQ3C.js";var n=null,r,i=null,a=`input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [href], [tabindex="0"]`;function o(e){if(e)try{e.focus({preventScroll:!0})}catch{e.focus()}}function s({title:s,body:l,onMount:u,onClose:d=null}){let f=e(`#modal`),p=e(`#modalCard`),m=e(`#app`),h=e(`#settings`),g=`modalTitle-${Date.now()}`;r!==void 0&&(window.clearTimeout(r),r=void 0),n=document.activeElement instanceof HTMLElement?document.activeElement:null,i=typeof d==`function`?d:null,p.className=`modal-card`,p.innerHTML=`<div class="modal-heading"><h3 id="${g}">${t(s||``)}</h3><button type="button" class="modal-close" aria-label="关闭弹窗" title="关闭">✕</button></div>${l||``}`,f.setAttribute(`aria-labelledby`,g),f.setAttribute(`aria-hidden`,`false`),f.inert=!1,f.classList.add(`open`);let _=p.querySelector(`.modal-close`);_&&(_.onclick=c),u&&u(p),o(Array.from(p.querySelectorAll(a)).find(e=>!e.classList.contains(`modal-close`))||p),m.inert=!0,h.inert=!0}function c(){let t=e(`#modal`),a=e(`#app`),s=e(`#settings`);if(!t.classList.contains(`open`))return;let c=s.classList.contains(`open`),l=c?s:a;a.inert=c,s.inert=!c;let u=e(c?`#settingsBody`:`#settingsBtn`);o(n?.isConnected&&l.contains(n)?n:u),t.contains(document.activeElement)&&o(u),t.classList.remove(`open`),t.inert=!0,t.setAttribute(`aria-hidden`,`true`),n=null;let d=i;i=null,d?.(),r=window.setTimeout(()=>{t.classList.contains(`open`)||(e(`#modalCard`).innerHTML=``),r=void 0},160)}function l({title:n=`请确认`,message:r,confirmLabel:i=`确认`,cancelLabel:a=`取消`,danger:o=!1}){let l=!1;return new Promise(u=>{let d=e=>{l||(l=!0,u(e))};s({title:n,body:`<div class="confirm-message">${t(r)}</div><div class="row"><button type="button" class="btn-ghost" id="dialogCancel">${t(a)}</button><button type="button" class="${o?`btn-danger`:`btn-primary`} btn-auto" id="dialogAccept">${t(i)}</button></div>`,onMount:t=>{e(`#dialogCancel`,t).onclick=()=>{d(!1),c()},e(`#dialogAccept`,t).onclick=()=>{d(!0),c()}},onClose:()=>d(!1)})})}function u({title:n,message:r=``,label:i=`名称`,value:a=``,placeholder:o=``,required:l=!0,maxLength:u,multiline:d=!1,rows:f=5,confirmLabel:p=`确定`}){let m=!1;return new Promise(h=>{let g=e=>{m||(m=!0,h(e))},_=d?`<textarea name="value" rows="${f}" placeholder="${t(o)}" ${u?`maxlength="${u}"`:``} autofocus>${t(a)}</textarea>`:`<input name="value" value="${t(a)}" placeholder="${t(o)}" ${u?`maxlength="${u}"`:``} autofocus />`;s({title:n,body:`${r?`<p class="lead lead-tight">${t(r)}</p>`:``}
2
+ <form id="dialogPromptForm"><div class="field"><label>${t(i)}</label>${_}</div><div class="row"><button type="button" class="btn-ghost" id="dialogCancel">取消</button><button class="btn-primary btn-auto" type="submit">${t(p)}</button></div></form>`,onMount:t=>{e(`#dialogCancel`,t).onclick=()=>{g(null),c()},e(`#dialogPromptForm`,t).onsubmit=e=>{e.preventDefault();let n=(t.querySelector(`[name="value"]`)?.value??``).trim();(!l||n)&&(g(n),c())}},onClose:()=>g(null)})})}e(`#modal`).addEventListener(`click`,e=>{e.target.id===`modal`&&c()}),document.addEventListener(`keydown`,t=>{if(!e(`#modal`).classList.contains(`open`))return;if(t.key===`Escape`){t.preventDefault(),c();return}if(t.key!==`Tab`)return;let n=e(`#modalCard`),r=Array.from(n.querySelectorAll(a));if(!r.length){t.preventDefault(),n.focus();return}let i=r[0],o=r[r.length-1];t.shiftKey&&document.activeElement===i?(t.preventDefault(),o.focus()):!t.shiftKey&&document.activeElement===o&&(t.preventDefault(),i.focus())});export{c as closeModal,l as showConfirm,s as showModal,u as showPrompt};
@@ -0,0 +1,14 @@
1
+ import{g as e,w as t,x as n}from"./index-BaUGyQ3C.js";function r(){if(!e.providers.length){openSettings(`providers`),n(`请先添加模型`);return}let r=[];e.providers.forEach(e=>{let t=e.models||(e.model?[e.model]:[]),n=e.name||e.id,i={pid:e.id,providerName:n,apiType:e.apiType||`openai`,initial:n.trim().slice(0,1).toUpperCase()||`M`};t.length?t.forEach(e=>r.push({...i,model:e,modelLabel:e})):r.push({...i,model:``,modelLabel:`手动输入模型名`,custom:!0})}),showModal({title:`选择模型`,body:`<div class="picker-dialog-intro">
2
+ <span>为接下来的消息选择运行模型</span>
3
+ <span>${r.length} 个可用模型</span>
4
+ </div>
5
+ <div class="model-picker-list">
6
+ ${r.map(n=>{let r=e.selectedProvider?.id===n.pid&&e.selectedModel===n.model;return`<button type="button" class="picker-option${r?` active`:``}" data-pid="${t(n.pid)}" data-model="${t(n.model)}" data-custom="${+!!n.custom}" aria-pressed="${r}">
7
+ <span class="picker-provider-mark" aria-hidden="true">${t(n.initial)}</span>
8
+ <span class="picker-option-copy">
9
+ <strong>${t(n.modelLabel)}</strong>
10
+ <small>${t(n.providerName)} · ${t(n.apiType)}</small>
11
+ </span>
12
+ <span class="picker-option-state" aria-hidden="true">${r?`✓`:`›`}</span>
13
+ </button>`}).join(``)}
14
+ </div>`,onMount:t=>{t.classList.add(`model-picker-modal`),t.querySelectorAll(`.picker-option`).forEach(t=>{t.onclick=async()=>{let n=t.dataset.pid,r=e.providers.find(e=>e.id===n);if(!r)return;let i=t.dataset.model;if(t.dataset.custom===`1`){let e=await showPrompt({title:`自定义模型`,message:`为「${r.name||r.id}」输入模型名称`,label:`模型名称`,placeholder:`例如 deepseek-chat`,maxLength:120});if(!e)return;i=e.trim(),r.models||=[],r.models.includes(i)||r.models.push(i)}e.selectedProvider=r,e.selectedModel=i,localStorage.setItem(`multichat_lastModel`,n+`:`+i),a(),closeModal(),e.messages.length||renderContent()}})}})}function i(t,r){let i=e.providers.find(e=>e.id===t);!i||!(i.models||[]).includes(r)?n(`该模型已不可用,请刷新模型列表`,`error`):(e.selectedProvider=i,e.selectedModel=r,localStorage.setItem(`multichat_lastModel`,`${t}:${r}`),a(),renderContent())}function a(){renderInspector()}function o(){}export{r as openModelPicker,a as renderTopbar,i as selectModel,o as syncModelUI};
@@ -0,0 +1,16 @@
1
+ import{i as e,t}from"./react-CDEwA66Z.js";import{N as n,P as r,S as i,T as a,c as o,g as s,w as c,x as l}from"./index-BaUGyQ3C.js";var u=n(`box`,[[`path`,{d:`M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z`,key:`hh9hay`}],[`path`,{d:`m3.3 7 8.7 5 8.7-5`,key:`g66t2b`}],[`path`,{d:`M12 22V12`,key:`d0xqtd`}]]),d=n(`plug-zap`,[[`path`,{d:`M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z`,key:`goz73y`}],[`path`,{d:`m2 22 3-3`,key:`19mgm9`}],[`path`,{d:`M7.5 13.5 10 11`,key:`7xgeeb`}],[`path`,{d:`M10.5 16.5 13 14`,key:`10btkg`}],[`path`,{d:`m18 3-4 4h6l-4 4`,key:`16psg9`}]]),f=n(`upload`,[[`path`,{d:`M12 3v12`,key:`1x0j5s`}],[`path`,{d:`m17 8-5-5-5 5`,key:`7q97r8`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}]]),p=e(t(),1),m=r(),h=a();function g({plugins:e,sourceLabel:t,onImport:n,onToggle:r,onDiff:i,onDelete:a}){return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`div`,{className:`extension-heading`,children:(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`h3`,{children:`插件`}),(0,h.jsxs)(`p`,{className:`lead`,children:[`插件是完整能力包,以 `,(0,h.jsx)(`code`,{children:`.codex-plugin/plugin.json`}),` 为入口,可组合 Skills、MCP servers、hooks 及宿主专属组件。组件保持原目录,不复制进私有 JSON。`]})]})}),(0,h.jsxs)(`div`,{className:`card-grid`,children:[(0,h.jsxs)(`button`,{type:`button`,className:`mc-add`,onClick:n,children:[(0,h.jsx)(f,{size:20,"aria-hidden":!0}),(0,h.jsx)(`span`,{className:`plus-t`,children:`上传 / 安装插件包`}),(0,h.jsx)(`span`,{className:`mc-sub`,children:`ZIP 或完整目录 · 导入后默认停用`})]}),e.map(e=>{let n=e.components||{},o=e.key||e.id;return(0,h.jsxs)(`article`,{className:`mc-card`,children:[(0,h.jsxs)(`div`,{className:`mc-top`,children:[(0,h.jsx)(`div`,{className:`mc-ico`,children:(0,h.jsx)(u,{size:19,"aria-hidden":!0})}),(0,h.jsxs)(`div`,{className:`mc-title-wrap`,children:[(0,h.jsx)(`div`,{className:`mc-title`,children:e.name}),(0,h.jsxs)(`div`,{className:`mc-sub`,children:[e.id,` · v`,e.version]})]}),(0,h.jsx)(`span`,{className:`mc-tag${e.enabled?` on`:``}`,children:e.enabled?`MultiChat 已启用`:`已停用`})]}),(0,h.jsx)(`div`,{className:`mc-desc`,children:e.description||``}),(0,h.jsxs)(`div`,{className:`mc-tags`,children:[(0,h.jsx)(`span`,{className:`mc-tag${e.imported?` on`:``}`,children:e.imported?`已导入`:`项目内置`}),(0,h.jsxs)(`span`,{className:`mc-tag`,children:[n.skills||0,` Skills`]}),(0,h.jsxs)(`span`,{className:`mc-tag`,children:[n.mcpServers||0,` MCP`]}),n.agents?(0,h.jsxs)(`span`,{className:`mc-tag`,children:[n.agents,` Agents`]}):null,n.commands?(0,h.jsxs)(`span`,{className:`mc-tag`,children:[n.commands,` Commands`]}):null,n.hooks?(0,h.jsx)(`span`,{className:`mc-tag`,children:`Hooks`}):null]}),(0,h.jsxs)(`div`,{className:`extension-source`,children:[(0,h.jsx)(`span`,{children:t(e.source)}),(0,h.jsx)(`span`,{title:e.source?.path||``,children:e.source?.path||``})]}),(0,h.jsxs)(`div`,{className:`mc-actions extension-card-actions`,children:[(0,h.jsx)(`button`,{className:`mc-act wide`,type:`button`,onClick:()=>void i(e),children:`查看 Diff`}),e.removable&&(0,h.jsx)(`button`,{className:`mc-act wide danger`,type:`button`,onClick:()=>void a(e),children:`卸载`}),(0,h.jsxs)(`button`,{type:`button`,className:`mc-toggle${e.enabled?` on`:``}`,"aria-pressed":!!e.enabled,onClick:()=>void r(e),children:[(0,h.jsx)(`span`,{className:`mc-switch`,"aria-hidden":!0}),(0,h.jsx)(`span`,{children:e.enabled?`启用中`:`已停用`})]})]})]},o)}),!e.length&&(0,h.jsx)(`div`,{className:`extension-empty`,children:`未发现插件。请在项目的 .agents/plugins/marketplace.json 中登记标准插件包。`})]})]})}function _({servers:e,sourceLabel:t,onImport:n,onSync:r,onAdd:i,onDiscover:a,onEdit:o,onToggle:s,onTrust:c,onPrivate:l,onDelete:u}){return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(`div`,{className:`extension-heading`,children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`h3`,{children:`MCP servers`}),(0,h.jsxs)(`p`,{className:`lead`,children:[`每个 server 独立管理 transport、命令或 URL、环境变量、启用范围和实际 tools。Tools 通过实时 `,(0,h.jsx)(`code`,{children:`tools/list`}),` 发现。`]})]}),(0,h.jsxs)(`div`,{className:`extension-heading-actions`,children:[(0,h.jsx)(`button`,{className:`btn-ghost`,type:`button`,onClick:n,children:`导入 MCP JSON`}),(0,h.jsx)(`button`,{className:`btn-ghost`,type:`button`,onClick:()=>void r(),children:`同步到 Codex`}),(0,h.jsx)(`button`,{className:`btn-primary compact-action`,type:`button`,onClick:i,children:`添加 server`})]})]}),(0,h.jsxs)(`div`,{className:`card-grid`,children:[e.map(e=>{let n=e.transport===`http`?e.url:[e.command,...e.args||[]].join(` `);return(0,h.jsxs)(`article`,{className:`mc-card`,children:[(0,h.jsxs)(`div`,{className:`mc-top`,children:[(0,h.jsx)(`div`,{className:`mc-ico`,children:(0,h.jsx)(d,{size:19,"aria-hidden":!0})}),(0,h.jsxs)(`div`,{className:`mc-title-wrap`,children:[(0,h.jsx)(`div`,{className:`mc-title`,children:e.name}),(0,h.jsxs)(`div`,{className:`mc-sub`,children:[e.id,` · `,e.transport===`http`?`HTTP`:`STDIO`]})]}),(0,h.jsx)(`span`,{className:`mc-tag${e.status===`ready`?` on`:``}`,children:e.status===`ready`?`已连接`:e.status===`error`?`连接失败`:`未探测`})]}),(0,h.jsx)(`div`,{className:`mc-desc`,children:e.description||``}),(0,h.jsx)(`div`,{className:`extension-command`,children:n}),(0,h.jsxs)(`div`,{className:`mc-tags`,children:[(0,h.jsxs)(`span`,{className:`mc-tag`,children:[(e.tools||[]).length,` tools`]}),(e.targets||[]).map(e=>(0,h.jsx)(`span`,{className:`mc-tag on`,children:e},e)),(0,h.jsx)(`span`,{className:`mc-tag`,children:e.trustLevel===`trusted`?`受信任`:`需审批`})]}),!!e.tools?.length&&(0,h.jsx)(`div`,{className:`extension-tool-list`,children:e.tools.map(e=>(0,h.jsx)(`span`,{title:e.description||``,children:e.name},e.name))}),(0,h.jsxs)(`div`,{className:`extension-source`,children:[(0,h.jsx)(`span`,{children:t(e.source)}),(0,h.jsx)(`span`,{children:e.envKeys?.length?`env: ${e.envKeys.join(`, `)}`:`无环境变量`})]}),e.error&&(0,h.jsx)(`div`,{className:`auth-error`,title:e.error,children:e.error}),(0,h.jsxs)(`div`,{className:`mc-actions extension-card-actions left`,children:[(0,h.jsx)(`button`,{className:`mc-act wide primary`,type:`button`,disabled:!e.enabled,onClick:()=>void a(e),children:`探测 tools`}),(0,h.jsx)(`button`,{className:`mc-act wide`,type:`button`,onClick:()=>o(e),children:`配置`}),(0,h.jsx)(`button`,{className:`mc-act wide`,type:`button`,onClick:()=>void c(e),children:e.trustLevel===`trusted`?`改为需审批`:`设为受信任`}),e.transport===`http`&&(0,h.jsx)(`button`,{className:`mc-act wide`,type:`button`,onClick:()=>void l(e),children:e.allowPrivate?`阻止内网`:`允许内网`}),e.source?.kind!==`plugin`&&(0,h.jsx)(`button`,{className:`mc-act wide danger`,type:`button`,onClick:()=>void u(e),children:`删除`}),(0,h.jsxs)(`button`,{type:`button`,className:`mc-toggle${e.enabled?` on`:``}`,"aria-pressed":!!e.enabled,onClick:()=>void s(e),children:[(0,h.jsx)(`span`,{className:`mc-switch`,"aria-hidden":!0}),(0,h.jsx)(`span`,{children:e.enabled?`启用中`:`已停用`})]})]})]},e.id)}),!e.length&&(0,h.jsx)(`div`,{className:`extension-empty`,children:`还没有 MCP server。`})]})]})}var v=`<svg viewBox="0 0 24 24"><path d="M12 3v12M8 11l4 4 4-4M5 21h14"/></svg>`;function y(e){return{repo:`项目仓库`,managed:`MultiChat 托管`,user:`用户目录`,plugin:`插件`,builtin:`内置`}[e?.kind]||e?.kind||`未知来源`}function b(e,t,n=null){let r=String(t?.status||`clean`).trim()||`clean`,a=String(t?.diff||``).trim(),o=r===`clean`&&!a,s=r===`unavailable`,l=r===`external`,u=o?`clean`:s||l?`warning`:`changed`,d=r.split(/\r?\n/).filter(Boolean).length,f=o?`没有未提交变更`:s?`暂时无法读取变更`:l?`不在项目仓库中`:`检测到 ${d} 项未提交变更`,p=o?`当前内容与 Git 中记录的版本一致。`:s?`请确认当前目录可由 Git 读取后再试。`:l?`该内容位于项目仓库之外,无法提供项目级 Git 差异。`:`请在启用或发布前检查下面的差异内容。`,m=n?.name?`<div class="diff-context"><div><span>检查对象</span><strong>${c(n.name)}</strong></div>${n.meta?`<code title="${c(n.meta)}">${c(n.meta)}</code>`:``}</div>`:``,h=o?``:s||l?`<div class="diff-message ${s?`error`:`warning`}">${c(t?.error||`此目录不属于当前项目仓库。`)}</div>`:`<div class="diff-git-status"><span>Git 状态</span><code title="${c(r)}">${c(r)}</code></div>${a?`<pre class="extension-diff" aria-label="Git 变更内容">${c(a)}</pre>`:`<div class="diff-message">Git 已检测到状态变化,但没有可展示的文本差异。</div>`}`;showModal({title:e,body:`${m}<div class="diff-summary ${u}" role="status"><span class="diff-summary-icon" aria-hidden="true">${o?`✓`:s?`!`:`↗`}</span><div><strong>${f}</strong><span>${p}</span></div></div>${h}<div class="row diff-actions"><button class="btn-primary" id="diffClose">关闭</button></div>`,onMount:e=>{i(`#diffClose`,e).onclick=closeModal}})}function x(e,t){let n=String(e||``).trim();if(!n)return;let r;try{r=JSON.parse(n)}catch{throw Error(`${t} 必须是合法 JSON 对象`)}if(!r||typeof r!=`object`||Array.isArray(r))throw Error(`${t} 必须是 JSON 对象`);return r}function S(e=null){let t=!!e,n=t?s.mcpServers.find(t=>t.id===e):null,r=n?.source?.kind===`plugin`;showModal({title:t?`编辑 MCP server`:`添加 MCP server`,body:`<form id="mcpForm">
2
+ <p class="lead mcp-security-note">STDIO server 会按你的操作启动本地进程;“受信任”只控制工具调用是否逐次审批,不是进程沙箱。只配置你确认可信的命令。</p>
3
+ <div class="field"><label>Server ID</label><input name="id" value="${c(n?.id||``)}" placeholder="context7" ${t?`readonly`:``} required /></div>
4
+ <div class="field"><label>显示名称</label><input name="name" value="${c(n?.name||``)}" placeholder="Context7" required /></div>
5
+ <div class="field"><label>说明</label><input name="description" value="${c(n?.description||``)}" /></div>
6
+ <div class="field"><label>传输方式</label><select name="transport" id="mcpTransport"><option value="stdio" ${n?.transport===`http`?``:`selected`}>STDIO</option><option value="http" ${n?.transport===`http`?`selected`:``}>Streamable HTTP</option></select></div>
7
+ <div id="mcpStdioFields"><div class="field"><label>Command</label><input name="command" value="${c(n?.command||``)}" placeholder="npx" /></div><div class="field"><label>Args(每行一个,原样传递)</label><textarea name="args" rows="3" placeholder="-y&#10;@upstash/context7-mcp">${c((n?.args||[]).join(`
8
+ `))}</textarea></div><div class="field"><label>Working directory</label><input name="cwd" value="${c(n?.cwd||``)}" placeholder=".(相对项目根目录)" /></div><div class="field"><label>Environment JSON</label><textarea name="env" rows="2" placeholder='{"TOKEN":"value"}'></textarea>${n?.envKeys?.length?`<div class="pmeta">已保存:${c(n.envKeys.join(`, `))};留空即保留</div>`:``}</div></div>
9
+ <div id="mcpHttpFields"><div class="field"><label>URL</label><input name="url" value="${c(n?.url||``)}" placeholder="https://example.com/mcp" /></div><div class="field"><label>Bearer token 环境变量名</label><input name="bearerTokenEnvVar" value="${c(n?.bearerTokenEnvVar||``)}" placeholder="MCP_TOKEN" /></div><div class="field"><label>Headers JSON</label><textarea name="headers" rows="2" placeholder='{"X-Region":"cn"}'></textarea>${n?.headerKeys?.length?`<div class="pmeta">已保存:${c(n.headerKeys.join(`, `))};留空即保留</div>`:``}</div></div>
10
+ <div class="field"><label>信任级别</label><select name="trustLevel"><option value="untrusted" ${n?.trustLevel===`trusted`?``:`selected`}>未信任(调用前审批)</option><option value="trusted" ${n?.trustLevel===`trusted`?`selected`:``}>受信任</option></select></div>
11
+ <div class="field"><label>启用范围</label><div class="extension-checks"><label><input type="checkbox" name="target" value="multichat" ${(n?.targets||[`multichat`,`codex`]).includes(`multichat`)?`checked`:``}/> MultiChat</label><label><input type="checkbox" name="target" value="codex" ${(n?.targets||[`multichat`,`codex`]).includes(`codex`)?`checked`:``}/> 当前项目 Codex</label></div></div>
12
+ <div id="mcpErr" class="auth-error">${r?`此 server 来自插件,请在插件源中修改。`:``}</div>
13
+ <div class="row"><button type="button" class="btn-ghost" id="mcpCancel">取消</button><button class="btn-primary compact-action" type="submit" ${r?`disabled`:``}>保存</button></div>
14
+ </form>`,onMount:r=>{let a=i(`#mcpTransport`,r),s=()=>{i(`#mcpStdioFields`,r).style.display=a.value===`stdio`?``:`none`,i(`#mcpHttpFields`,r).style.display=a.value===`http`?``:`none`};a.onchange=s,s(),i(`#mcpCancel`,r).onclick=closeModal,i(`#mcpForm`,r).onsubmit=async a=>{a.preventDefault();let s=a.target,c=Object.fromEntries(new FormData(s).entries());c.args=String(c.args||``).split(/\r?\n/).map(e=>e.trim()).filter(Boolean),c.targets=Array.from(s.querySelectorAll(`input[name="target"]:checked`)).map(e=>e.value);try{let r=x(c.env,`Environment`);r?c.env=r:delete c.env;let i=x(c.headers,`Headers`);if(i?c.headers=i:delete c.headers,c.transport===`stdio`&&(!t||c.command!==n?.command||c.args.join(`
15
+ `)!==(n?.args||[]).join(`
16
+ `))&&!await showConfirm({title:`允许启动本地进程`,message:`允许 MultiChat 启动这个本地 MCP 进程?\n\n${c.command} ${c.args.join(` `)}`,confirmLabel:`允许并保存`}))return;let a=t?`/api/mcp-servers/${encodeURIComponent(e)}`:`/api/mcp-servers`;await o(a,{method:t?`PUT`:`POST`,body:JSON.stringify(c)}),await loadMcpServers(),renderSettings(`mcp`,!0),closeModal(),l(`MCP server 已保存并同步`)}catch(e){i(`#mcpErr`,r).textContent=e.message}}}})}var C=null;function w(){C?.unmount(),C=null}function T(e,t){let n=i(`#settingsBody`);w();let r=document.createElement(`div`);r.className=`settings-react-page`,n.replaceChildren(r),C=(0,m.createRoot)(r),C.render((0,p.createElement)(e,t))}function E(){T(g,{plugins:s.plugins||[],sourceLabel:y,onImport:()=>showExtensionImport(`plugin`),onToggle:async e=>{if(!(!e.enabled&&(e.components?.mcpServers||0)>0&&!await showConfirm({title:`启用插件`,message:`启用插件「${e.name}」?\n\n它包含 MCP server。只有被运行配置选中时才会连接,但本地进程仍以当前用户权限运行,请先审核来源和 Diff。`,confirmLabel:`启用插件`})))try{await o(`/api/plugins/${encodeURIComponent(e.key||e.id)}/toggle`,{method:`POST`,body:JSON.stringify({enabled:!e.enabled})}),await Promise.all([loadPlugins(),loadSkills(),loadMcpServers()]),renderSettings(`plugins`,!0),l(e.enabled?`插件已停用`:`插件已启用`)}catch(e){l(e.message,`error`)}},onDiff:async e=>{try{b(`插件变更`,await o(`/api/plugins/${encodeURIComponent(e.key||e.id)}/diff`),{name:e.name||`插件包`,meta:[e.id,e.version?`v${e.version}`:``].filter(Boolean).join(` · `)})}catch(e){l(e.message,`error`)}},onDelete:async e=>{if(await showConfirm({title:`卸载插件`,message:`卸载插件「${e.name}」?\n\n整包目录、项目市场条目,以及运行配置对其 Skill / MCP 的引用都会移除。`,confirmLabel:`卸载`,danger:!0}))try{await o(`/api/plugins/${encodeURIComponent(e.key||e.id)}`,{method:`DELETE`}),await Promise.all([loadPlugins(),loadSkills(),loadMcpServers(),loadAgents(),loadRuntime()]),renderSettings(`plugins`,!0),l(`插件已卸载`)}catch(e){l(e.message,`error`)}}})}function D(){let e=s.mcpServers||[],t=async()=>{await loadMcpServers(),renderSettings(`mcp`,!0)};T(_,{servers:e,sourceLabel:y,onImport:()=>showExtensionImport(`mcp`),onAdd:()=>S(),onEdit:e=>S(e.id),onSync:async()=>{try{let e=await o(`/api/mcp-servers/sync/codex`,{method:`POST`});l(`已同步 ${e.servers} 个 server 到项目 Codex 配置`)}catch(e){l(e.message,`error`)}},onDiscover:async e=>{try{let n=await o(`/api/mcp-servers/${encodeURIComponent(e.id)}/discover`,{method:`POST`});await t(),l(`发现 ${n.tools.length} 个 tools`)}catch(e){await t(),l(e.message,`error`)}},onToggle:async e=>{if(!e.enabled){let t=e.transport===`http`?e.url:[e.command,...e.args||[]].join(` `);if(!await showConfirm({title:`启用 MCP server`,message:`启用 MCP server「${e.name}」?\n\n${t}\n\nSTDIO 命令会以当前用户权限运行;HTTP server 会连接所示地址。`,confirmLabel:`启用`}))return}try{await o(`/api/mcp-servers/${encodeURIComponent(e.id)}`,{method:`PUT`,body:JSON.stringify({enabled:!e.enabled})}),await t(),l(e.enabled?`MCP server 已停用`:`MCP server 已启用`)}catch(e){l(e.message,`error`)}},onTrust:async e=>{try{let n=e.trustLevel===`trusted`?`untrusted`:`trusted`;await o(`/api/mcp-servers/${encodeURIComponent(e.id)}`,{method:`PUT`,body:JSON.stringify({trustLevel:n})}),await t(),l(n===`trusted`?`已设为受信任;工具调用将不再逐次审批`:`已恢复工具调用审批`)}catch(e){l(e.message,`error`)}},onPrivate:async e=>{if(e.allowPrivate||await showConfirm({title:`允许内网访问`,message:`允许此 HTTP MCP 访问 localhost 或内网地址?只应对你信任的服务器启用。`,confirmLabel:`允许内网`}))try{await o(`/api/mcp-servers/${encodeURIComponent(e.id)}`,{method:`PUT`,body:JSON.stringify({allowPrivate:!e.allowPrivate})}),await t(),l(e.allowPrivate?`已阻止内网地址`:`已允许内网地址`)}catch(e){l(e.message,`error`)}},onDelete:async e=>{if(await showConfirm({title:`删除 MCP server`,message:`删除这个 MCP server?项目 Codex 配置也会同步移除。`,confirmLabel:`删除`,danger:!0}))try{await o(`/api/mcp-servers/${encodeURIComponent(e.id)}`,{method:`DELETE`}),await t(),l(`已删除`)}catch(e){l(e.message,`error`)}}})}export{v as EXPORT_ICON,T as mountExtensionSettings,D as renderMcpServers,E as renderPlugins,b as showDiff,y as sourceLabel,f as t,w as unmountExtensionSettings};
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,o)=>(o=n==null?{}:e(i(n)),c(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n)),u=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.iterator;function p(e){return typeof e!=`object`||!e?null:(e=f&&e[f]||e[`@@iterator`],typeof e==`function`?e:null)}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function _(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}_.prototype.isReactComponent={},_.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},_.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function v(){}v.prototype=_.prototype;function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}var b=y.prototype=new v;b.constructor=y,h(b,_.prototype),b.isPureReactComponent=!0;var x=Array.isArray,S={H:null,A:null,T:null,S:null,V:null},C=Object.prototype.hasOwnProperty;function w(e,n,r,i,a,o){return r=o.ref,{$$typeof:t,type:e,key:n,ref:r===void 0?null:r,props:o}}function T(e,t){return w(e.type,t,void 0,void 0,void 0,e.props)}function E(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function D(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var O=/\/+/g;function k(e,t){return typeof e==`object`&&e&&e.key!=null?D(``+e.key):t.toString(36)}function A(){}function j(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(A,A):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function M(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,M(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+k(e,0):a,x(o)?(i=``,c!=null&&(i=c.replace(O,`$&/`)+`/`),M(o,r,i,``,function(e){return e})):o!=null&&(E(o)&&(o=T(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(O,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(x(e))for(var u=0;u<e.length;u++)a=e[u],s=l+k(a,u),c+=M(a,r,i,s,o);else if(u=p(e),typeof u==`function`)for(e=u.call(e),u=0;!(a=e.next()).done;)a=a.value,s=l+k(a,u++),c+=M(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return M(j(e),r,i,a,o);throw r=String(e),Error(`Objects are not valid as a React child (found: `+(r===`[object Object]`?`object with keys {`+Object.keys(e).join(`, `)+`}`:r)+`). If you meant to render a collection of children, use an array instead.`)}return c}function N(e,t,n){if(e==null)return e;var r=[],i=0;return M(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function P(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(t){(e._status===0||e._status===-1)&&(e._status=1,e._result=t)},function(t){(e._status===0||e._status===-1)&&(e._status=2,e._result=t)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var F=typeof reportError==`function`?reportError:function(e){if(typeof window==`object`&&typeof window.ErrorEvent==`function`){var t=new window.ErrorEvent(`error`,{bubbles:!0,cancelable:!0,message:typeof e==`object`&&e&&typeof e.message==`string`?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process==`object`&&typeof process.emit==`function`){process.emit(`uncaughtException`,e);return}console.error(e)};function I(){}e.Children={map:N,forEach:function(e,t,n){N(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return N(e,function(){t++}),t},toArray:function(e){return N(e,function(e){return e})||[]},only:function(e){if(!E(e))throw Error(`React.Children.only expected to receive a single React element child.`);return e}},e.Component=_,e.Fragment=r,e.Profiler=a,e.PureComponent=y,e.StrictMode=i,e.Suspense=l,e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=S,e.__COMPILER_RUNTIME={__proto__:null,c:function(e){return S.H.useMemoCache(e)}},e.cache=function(e){return function(){return e.apply(null,arguments)}},e.cloneElement=function(e,t,n){if(e==null)throw Error(`The argument must be a React element, but you passed `+e+`.`);var r=h({},e.props),i=e.key,a=void 0;if(t!=null)for(o in t.ref!==void 0&&(a=void 0),t.key!==void 0&&(i=``+t.key),t)!C.call(t,o)||o===`key`||o===`__self`||o===`__source`||o===`ref`&&t.ref===void 0||(r[o]=t[o]);var o=arguments.length-2;if(o===1)r.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];r.children=s}return w(e.type,i,void 0,void 0,a,r)},e.createContext=function(e){return e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:o,_context:e},e},e.createElement=function(e,t,n){var r,i={},a=null;if(t!=null)for(r in t.key!==void 0&&(a=``+t.key),t)C.call(t,r)&&r!==`key`&&r!==`__self`&&r!==`__source`&&(i[r]=t[r]);var o=arguments.length-2;if(o===1)i.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];i.children=s}if(e&&e.defaultProps)for(r in o=e.defaultProps,o)i[r]===void 0&&(i[r]=o[r]);return w(e,a,void 0,void 0,null,i)},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:c,render:e}},e.isValidElement=E,e.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:P}},e.memo=function(e,t){return{$$typeof:u,type:e,compare:t===void 0?null:t}},e.startTransition=function(e){var t=S.T,n={};S.T=n;try{var r=e(),i=S.S;i!==null&&i(n,r),typeof r==`object`&&r&&typeof r.then==`function`&&r.then(I,F)}catch(e){F(e)}finally{S.T=t}},e.unstable_useCacheRefresh=function(){return S.H.useCacheRefresh()},e.use=function(e){return S.H.use(e)},e.useActionState=function(e,t,n){return S.H.useActionState(e,t,n)},e.useCallback=function(e,t){return S.H.useCallback(e,t)},e.useContext=function(e){return S.H.useContext(e)},e.useDebugValue=function(){},e.useDeferredValue=function(e,t){return S.H.useDeferredValue(e,t)},e.useEffect=function(e,t,n){var r=S.H;if(typeof n==`function`)throw Error(`useEffect CRUD overload is not enabled in this build of React.`);return r.useEffect(e,t)},e.useId=function(){return S.H.useId()},e.useImperativeHandle=function(e,t,n){return S.H.useImperativeHandle(e,t,n)},e.useInsertionEffect=function(e,t){return S.H.useInsertionEffect(e,t)},e.useLayoutEffect=function(e,t){return S.H.useLayoutEffect(e,t)},e.useMemo=function(e,t){return S.H.useMemo(e,t)},e.useOptimistic=function(e,t){return S.H.useOptimistic(e,t)},e.useReducer=function(e,t,n){return S.H.useReducer(e,t,n)},e.useRef=function(e){return S.H.useRef(e)},e.useState=function(e){return S.H.useState(e)},e.useSyncExternalStore=function(e,t,n){return S.H.useSyncExternalStore(e,t,n)},e.useTransition=function(){return S.H.useTransition()},e.version=`19.1.1`})),d=o(((e,t)=>{t.exports=u()}));export{l as i,o as n,s as r,d as t};
@@ -1 +1 @@
1
- import{c as e}from"./index-CASVCOUO.js";function t(){e()}function n(e){e&&(e.style.height=`auto`,e.style.height=`${Math.min(240,e.scrollHeight)}px`)}export{n as autoresize,t as renderContent};
1
+ import{p as e}from"./index-BaUGyQ3C.js";function t(){e()}function n(e){e&&(e.style.height=`auto`,e.style.height=`${Math.min(240,e.scrollHeight)}px`)}export{n as autoresize,t as renderContent};
@@ -0,0 +1,14 @@
1
+ import{S as e,_ as t,b as n,c as r,g as i,u as a,v as o,x as s}from"./index-BaUGyQ3C.js";import{openModelPicker as c}from"./modelPicker-Ddloc_nz.js";async function l(t){if(i.streaming){d();return}let n=i.messages.length?e(`#input`):e(`#heroInput`),r=(t??n?.value??``).trim();if(r){if(!i.selectedProvider||!i.selectedModel)s(i.providers.length?`请先选择模型`:`请先添加模型`,`error`),i.providers.length?c():openSettings(`providers`);else{if(i.messages.push({role:`user`,content:r}),i.messages.push({role:`assistant`,content:``,streaming:!0,model:i.selectedModel,providerName:i.selectedProvider.name||i.selectedProvider.id,startTime:performance.now()}),n&&(n.value=``),i.streaming=!0,u(),renderContent(),i.messages.length){let t=e(`#input`);t&&t.focus()}try{await f()}catch(e){m(`无法创建或保存对话`,e),await h();return}await g()}}}function u(){renderContent()}function d(){if(i.abortCtrl&&(i.abortCtrl.abort(),i.abortCtrl=null),i.streaming){let e=i.messages[i.messages.length-1];e&&e.streaming&&(e.streaming=!1),i.streaming=!1,u(),renderContent(),p()}}async function f(){if(i.currentConvId)return;let t=i.messages.find(e=>e.role===`user`)?.content?.slice(0,24)||`新对话`,a=await r(`/api/conversations`,{method:`POST`,body:JSON.stringify({title:t,workspaceId:i.selectedWorkspace?.id||null,projectId:i.selectedProject?.id||null})});i.currentConvId=a.id;let s=n(a.id,a.projectId||i.selectedProject?.id);i.workflow=o(i.workflowScope,s,i.workflow),i.workflowScope=s,e(`#topbarTitle`).textContent=a.title||`对话`;let c=`#/chat/${encodeURIComponent(a.id)}`;location.hash!==c&&history.replaceState(null,``,c),await loadConversations()}async function p(){if(i.currentConvId)try{await r(`/api/conversations/`+i.currentConvId+`/messages`,{method:`POST`,body:JSON.stringify(i.messages.filter(e=>!e.streaming))})}catch{}}function m(e,t){let n=i.messages[i.messages.length-1];if(!n||n.role!==`assistant`)return;let r=t?.message?`:${t.message}`:``;n.content=n.content?`${n.content}\n\n**${e}**${r}`:`**${e}**${r}`,n.streaming=!1}async function h(){let e=i.messages[i.messages.length-1];e?.streaming&&(e.streaming=!1),i.abortCtrl=null,i.streaming=!1,u(),await p()}async function g(e){try{await _(e)}catch(e){if(e?.name===`AbortError`){let e=i.messages[i.messages.length-1];e&&(e.cancelled=!0,e.content||=`(已停止)`)}else m(`连接意外中断`,e),s(`连接意外中断,请重试`,`error`)}finally{await h()}}async function _(e){let n=i.selectedProvider,r=i.selectedModel;if(!n){let e=i.messages[i.messages.length-1];e&&(e.content=`**未选择模型**:请先在「设置 → 模型」中添加并选择模型。
2
+
3
+ → [打开 设置 → 模型连接](#/settings/providers)`,e.streaming=!1),renderContent();return}if(n.id!==`mock`&&![`ollama`,`lmstudio`,`mock`].includes((n.apiType||``).toLowerCase())&&!n.apiKey&&!n.apiKeyMasked){let e=i.messages[i.messages.length-1];e&&(e.content=`**缺少 API Key**:Provider「${n.name}」尚未填写 API Key。\n\n→ [打开 设置 → 模型连接填写 Key](#/settings/providers)`,e.streaming=!1),renderContent();return}if(!n.baseUrl){let e=i.messages[i.messages.length-1];e&&(e.content=`**缺少 API 地址**:Provider「${n.name}」尚未填写 baseUrl。\n\n→ [打开 设置 → 模型连接补全地址](#/settings/providers)`,e.streaming=!1),renderContent();return}let o=!!i.selectedAgent,s=o?`/api/agents/${i.selectedAgent.id}/chat`:`/v1/chat/completions`,c=t(i.workflow),l=i.messages.filter(e=>!e.streaming||e.role===`user`).map(e=>({role:e.role,content:e.content}));l.unshift({role:`system`,content:c});let u={model:n.id+`:`+r,providerId:n.id,messages:l,stream:!0,temperature:i.params.temperature,max_tokens:i.params.max_tokens,top_p:i.params.top_p,workspaceId:i.selectedWorkspace?.id||null,projectId:i.selectedProject?.id||null,conversationId:i.currentConvId||null,interactionId:`${i.currentConvId||`chat`}_${Date.now().toString(36)}`,assetIds:[...i.selectedAssetIds]};e&&(u.resumeFromRunId=e),i.abortCtrl=new AbortController;let d;try{d=await fetch(i.apiBase+s,{method:`POST`,headers:{"Content-Type":`application/json`,...a()},body:JSON.stringify(u),signal:i.abortCtrl.signal})}catch(e){if(e.name===`AbortError`){o&&i.currentRunId&&fetch(i.apiBase+`/api/runs/`+i.currentRunId+`/cancel`,{method:`POST`,headers:{"Content-Type":`application/json`,...a()}}).catch(()=>{});let e=i.messages[i.messages.length-1];e&&(e.streaming=!1,e.cancelled=!0,e.content||=`(已停止)`),renderContent();return}let t=i.messages[i.messages.length-1];t&&(t.content=`**网络错误**: `+e.message,t.streaming=!1),renderContent();return}if(!d.ok){let e=``;try{let t=await d.clone().json();e=(typeof t?.error==`string`?t.error:t?.error?.message)||t?.message||``}catch{}let t={400:`请求参数有误(通常是 model 名不识别或 messages 格式不对)`,401:`上游 API 鉴权失败 — API Key 无效或已过期`,403:`上游拒绝访问 — 可能原因:API Key 被禁用 / 余额不足 / IP 地区受限`,404:`上游接口或模型不存在 — 检查 baseUrl 和模型名`,429:`上游限流 — 请稍后重试或降低请求频率`,500:`上游服务器内部错误`,502:`MultiChat 无法连接上游 — 检查 baseUrl 是否可访问`,503:`上游服务暂不可用`}[d.status]||``,n=i.messages[i.messages.length-1];n&&(n.content=`**请求失败 (HTTP ${d.status})**${t?`:`+t:``}`+(e?`\n\n> ${e}`:``)+(o?`
4
+
5
+ 排查建议:① 设置 → 运行配置确认提示词与 Skill 关联正确;② 设置 → 模型连接确认 API Key 正确;③ 切换其他模型试一下。`:`
6
+
7
+ 排查建议:① 设置 → 模型 中确认 API Key 正确;② baseUrl 可在浏览器直接访问;③ 切换其他模型试一下。`)+(d.status===401||d.status===403?`
8
+
9
+ → [打开 设置 → 模型连接,测试或更换 API Key](#/settings/providers)`:``),n.streaming=!1),renderContent();return}if(!d.body){let e=i.messages[i.messages.length-1];e&&(e.content=`**错误**: 响应无 body`,e.streaming=!1),renderContent();return}let f=d.body.getReader(),m=new TextDecoder(`utf-8`),h=``,g=``;for(;;){let{value:e,done:t}=await f.read();if(t)break;h+=m.decode(e,{stream:!0});let n;for(;(n=h.indexOf(`
10
+
11
+ `))>=0;){let e=h.slice(0,n);h=h.slice(n+2);let t=e.split(`
12
+ `).find(e=>e.startsWith(`data:`));if(!t)continue;let r=t.slice(5).trim();if(r!==`[DONE]`)try{let e=JSON.parse(r),t=i.messages[i.messages.length-1];if(!t)continue;if(e.meta&&e.meta.agent){t.agentTag=e.meta.agent.name,t.mcpWarnings=e.meta.mcpWarnings||[],e.meta.run&&e.meta.run.id&&(i.currentRunId=e.meta.run.id),renderContent();continue}if(e.agentEvent){t.trace||=[];let n=e.agentEvent;if(n.type===`cancelled`)t.cancelled=!0;else if(n.type===`paused`)t.resumeRunId=n.runId,t.pauseReason=n.reason||`已达到本轮执行上限`,t.streaming=!1;else if(n.type===`approval_required`)t.pendingApprovals||={},t.pendingApprovals[n.approval.id]=n.approval;else if(n.type===`approval_resolved`){t.pendingApprovals||={};let e=t.pendingApprovals[n.approval.id]||{};t.pendingApprovals[n.approval.id]=Object.assign({},e,n.approval)}else if(n.step){let e=t.trace.findIndex(e=>e.sid===n.step.sid);e<0?t.trace.push(n.step):t.trace[e]=Object.assign({},t.trace[e],n.step)}renderContent();continue}if(e.error){g+=(g?`
13
+
14
+ `:``)+`**[错误]** `+(e.error.message||`未知错误`),t.content=g,t.streaming=!1,renderContent();continue}if(e.usage){t.usage=e.usage,e.model&&(t.model=e.model),renderContent();continue}if(e.choices&&e.choices[0]&&e.choices[0].delta&&e.choices[0].delta.tool_result){let n=e.choices[0].delta.tool_result;t.toolCalls||=[],t.toolCalls.push({id:n.id,name:n.name,content:n.content}),renderContent();continue}if(e.choices&&e.choices[0]&&e.choices[0].delta&&e.choices[0].delta.reasoning_content){let n=e.choices[0].delta.reasoning_content;t.reasoning||=``,t.reasoning+=n,renderContent();continue}let n=e?.choices?.[0]?.delta?.content??e?.choices?.[0]?.message?.content??``;n&&(g+=n,t.content=g,renderContent())}catch{}}}let _=i.messages[i.messages.length-1];_&&(_.streaming=!1,_.startTime&&(_.elapsedMs=Math.round(performance.now()-_.startTime))),renderContent(),p(),o&&loadRuns().then(()=>renderInspector())}async function v(e){await navigator.clipboard.writeText(i.messages[e]?.content||``),s(`已复制`)}async function y(e){let t=i.messages[e];if(!t)return;let n=await showPrompt({title:`编辑消息`,label:`消息内容`,value:t.content,multiline:!0,rows:7,required:!1,confirmLabel:`保存`});n!=null&&(t.content=n,i.messages=i.messages.slice(0,e+1),renderContent(),p())}async function b(e){i.streaming||(i.messages=i.messages.slice(0,e),i.messages.push({role:`assistant`,content:``,streaming:!0,model:i.selectedModel,providerName:i.selectedProvider?.name||i.selectedProvider?.id,startTime:performance.now()}),i.streaming=!0,renderContent(),await g())}async function x(e){if(i.streaming)return;let t=i.messages[e];t?.resumeRunId&&(i.messages.push({role:`assistant`,content:``,streaming:!0,model:i.selectedModel,providerName:i.selectedProvider?.name||i.selectedProvider?.id,startTime:performance.now()}),i.streaming=!0,renderContent(),await g(t.resumeRunId))}async function S(e,t){let n=i.currentRunId;if(!n){s(`无法定位运行任务`,`error`);return}let r=await fetch(i.apiBase+`/api/runs/`+n+`/approval/`+e,{method:`POST`,headers:{"Content-Type":`application/json`,...a()},body:JSON.stringify({action:t})}),o=await r.json().catch(()=>({}));if(!r.ok)throw s(`审批失败:`+(o?.error?.message||o?.error||`未知错误`),`error`),Error(o?.error?.message||o?.error||`审批失败`);let c=i.messages.find(t=>t.pendingApprovals&&t.pendingApprovals[e]),l=c?i.messages.indexOf(c):-1;if(c){let n=t===`approve`?`approved`:`rejected`;c.pendingApprovals[e]={...c.pendingApprovals[e],status:n,resolvedAt:new Date().toISOString()},renderContent()}s(t===`approve`?`已批准,Agent 继续执行`:`已拒绝`),o.resumable&&c&&l>=0&&(c.resumeRunId=n,c.pauseReason=t===`approve`?`授权已记录,正在从检查点继续。`:`拒绝已记录,正在让 Agent 收束本轮。`,await x(l))}export{v as copyMessage,y as editMessage,f as ensureConversation,b as regenerateMessage,S as resolveApproval,x as resumeMessage,p as saveCurrentMessages,l as send,d as stopStream,_ as streamReply,u as updateSendBtn};
@@ -0,0 +1,2 @@
1
+ import{i as e,t}from"./react-CDEwA66Z.js";import{A as n,C as r,D as i,E as a,M as o,N as s,O as c,S as l,T as u,a as d,c as f,d as p,g as m,h,j as g,k as _,l as v,m as y,n as b,o as x,s as S,w as C,x as w}from"./index-BaUGyQ3C.js";import{importProjectFolder as T}from"./assets-D2_TVEqD.js";import{adoptResult as E,compareTargets as D,executeTarget as O}from"./compare-BYqbOF36.js";import{applyProjectDefaults as ee,renderFileContext as k}from"./conversations-DSJtvviE.js";import{loadAgents as A,loadCapabilities as j,loadProjectControlData as M,loadProjects as N,loadProviders as P,loadRuns as te,loadSkills as ne,loadTools as re,loadUsage as ie,loadWorkspaces as ae}from"./data-D6TAf2h9.js";import{showExtensionImport as oe}from"./extensionImport-C2cHyfeC.js";import{doImport as se,exportEntity as ce,normalizeImport as le,showAddBuiltin as ue,showAddCustom as de,showAgentModal as fe,showSkillModal as F}from"./importExport-BWpKt1dW.js";import{closeModal as I,showModal as L}from"./modal-CO4he94s.js";import{renderTopbar as R}from"./modelPicker-Ddloc_nz.js";import{mountExtensionSettings as z,renderMcpServers as pe,renderPlugins as me,showDiff as he,sourceLabel as ge,t as B,unmountExtensionSettings as _e}from"./pluginsUI-28Rxtlgo.js";import{renderContent as ve}from"./render-BVmIwN3C.js";var V=s(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]),H=s(`file-pen-line`,[[`path`,{d:`m18 5-2.414-2.414A2 2 0 0 0 14.172 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2`,key:`142zxg`}],[`path`,{d:`M21.378 12.626a1 1 0 0 0-3.004-3.004l-4.01 4.012a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506z`,key:`2t3380`}],[`path`,{d:`M8 18h1`,key:`13wk12`}]]),ye=s(`pen-line`,[[`path`,{d:`M13 21h8`,key:`1jsn5i`}],[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}]]),U=e(t(),1),W=u();function be({params:e,theme:t,token:n,onSaveParams:r,onTheme:i,onSaveToken:a}){let[o,s]=(0,U.useState)(Number(e.temperature)),[c,l]=(0,U.useState)(Number(e.max_tokens)),[u,d]=(0,U.useState)(Number(e.top_p)),[f,p]=(0,U.useState)(n);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`h3`,{children:`偏好设置`}),(0,W.jsx)(`p`,{className:`lead`,children:`模型参数与外观`}),(0,W.jsxs)(`section`,{className:`provider-card`,children:[(0,W.jsx)(`h4`,{children:`模型参数`}),(0,W.jsx)(`div`,{className:`pmeta`,children:`应用于每次对话请求(OpenAI 兼容)`}),(0,W.jsxs)(`div`,{className:`field`,children:[(0,W.jsxs)(`label`,{htmlFor:`pTempReact`,children:[`温度 Temperature:`,o]}),(0,W.jsx)(`input`,{id:`pTempReact`,type:`range`,min:`0`,max:`2`,step:`0.1`,value:o,onChange:e=>s(Number(e.target.value))})]}),(0,W.jsxs)(`div`,{className:`field`,children:[(0,W.jsx)(`label`,{htmlFor:`pMaxReact`,children:`最大输出 Token`}),(0,W.jsx)(`input`,{id:`pMaxReact`,type:`number`,min:`1`,max:`128000`,value:c,onChange:e=>l(Number(e.target.value))})]}),(0,W.jsxs)(`div`,{className:`field`,children:[(0,W.jsxs)(`label`,{htmlFor:`pTopReact`,children:[`Top P:`,u]}),(0,W.jsx)(`input`,{id:`pTopReact`,type:`range`,min:`0`,max:`1`,step:`0.05`,value:u,onChange:e=>d(Number(e.target.value))})]}),(0,W.jsxs)(`div`,{className:`provider-row`,children:[(0,W.jsx)(`button`,{className:`btn-ghost`,type:`button`,onClick:()=>{s(.7),l(2e3),d(1)},children:`重置`}),(0,W.jsx)(`button`,{className:`btn-primary compact-action`,type:`button`,onClick:()=>r({temperature:o,max_tokens:c||2e3,top_p:u}),children:`保存`})]})]}),(0,W.jsxs)(`section`,{className:`provider-card`,children:[(0,W.jsx)(`h4`,{children:`外观`}),(0,W.jsxs)(`div`,{className:`field`,children:[(0,W.jsx)(`label`,{htmlFor:`themeReact`,children:`主题`}),(0,W.jsxs)(`select`,{id:`themeReact`,value:t,onChange:e=>i(e.target.value),children:[(0,W.jsx)(`option`,{value:`light`,children:`浅色`}),(0,W.jsx)(`option`,{value:`dark`,children:`深色`}),(0,W.jsx)(`option`,{value:`system`,children:`跟随系统`})]})]})]}),(0,W.jsxs)(`section`,{className:`provider-card`,children:[(0,W.jsx)(`h4`,{children:`本地服务访问保护`}),(0,W.jsx)(`div`,{className:`pmeta`,children:`仅在服务启用 MULTICHAT_API_TOKEN(兼容 MC_API_TOKEN)时填写;只保存在当前浏览器。`}),(0,W.jsxs)(`div`,{className:`field`,children:[(0,W.jsx)(`label`,{htmlFor:`serverTokenReact`,children:`访问令牌`}),(0,W.jsx)(`input`,{id:`serverTokenReact`,type:`password`,value:f,onChange:e=>p(e.target.value),autoComplete:`off`,placeholder:`未启用则留空`})]}),(0,W.jsxs)(`div`,{className:`provider-row`,children:[(0,W.jsx)(`button`,{className:`btn-ghost`,type:`button`,onClick:()=>{p(``),a(``)},children:`清除`}),(0,W.jsx)(`button`,{className:`btn-primary compact-action`,type:`button`,onClick:()=>a(f.trim()),children:`保存令牌`})]})]}),(0,W.jsxs)(`section`,{className:`provider-card`,children:[(0,W.jsx)(`h4`,{children:`关于`}),(0,W.jsxs)(`div`,{className:`pmeta`,children:[`MultiChat · 本地优先的多模型工作台`,(0,W.jsx)(`br`,{}),`模型、Skills、MCP 与插件按运行配置组合。`]})]})]})}function xe({provider:e,onSave:t,onDelete:n,onProbe:r}){let i=e.models||(e.model?[e.model]:[]),a=[`ollama`,`lmstudio`,`mock`].includes((e.apiType||``).toLowerCase())||e.id===`mock`,o=!!(e.apiKeyMasked||e.apiKey)||a,[s,c]=(0,U.useState)(``),[l,u]=(0,U.useState)(i.join(`, `)),[d,f]=(0,U.useState)(!!e.allowPrivate),[p,m]=(0,U.useState)(!1),[h,g]=(0,U.useState)(``),_=async()=>{m(!0),g(``);try{let t=await r(e),n=Array.isArray(t.models)?t.models:[];n.length?l.trim()?g(`✓ 连接成功 · 服务端返回 ${n.length} 个模型`):(u(n.join(`, `)),g(`✓ 连接成功 · 发现 ${n.length} 个模型,已填入列表,记得保存`)):g(`✓ 连接成功,但服务未返回模型清单;可手动填写`)}catch(e){g(`✗ ${e.message||`连接失败`}`)}finally{m(!1)}};return(0,W.jsxs)(`article`,{className:`provider-card provider-config-card`,children:[(0,W.jsxs)(`div`,{className:`provider-card-head`,children:[(0,W.jsx)(`span`,{className:`provider-mark`,"aria-hidden":!0,children:(e.name||e.id).trim().slice(0,1).toUpperCase()||`M`}),(0,W.jsxs)(`div`,{className:`provider-identity`,children:[(0,W.jsxs)(`h4`,{children:[e.name||e.id,` `,(0,W.jsx)(`span`,{className:`provider-id`,children:e.id})]}),(0,W.jsxs)(`div`,{className:`pmeta`,children:[e.apiType||`openai`,` · `,i.length?`${i.length} 个模型`:`手动输入模型`,(e.capabilities?.vision||e.capabilities?.reasoning)&&(0,W.jsxs)(`span`,{className:`provider-caps`,children:[e.capabilities.vision?`视觉`:``,e.capabilities.vision&&e.capabilities.reasoning?` · `:``,e.capabilities.reasoning?`推理`:``]})]})]}),(0,W.jsx)(`span`,{className:`provider-state ${o?a?`local`:`ready`:`missing`}`,children:o?a?`本地`:`已配置`:`待配置`})]}),(0,W.jsxs)(`div`,{className:`provider-card-fields`,children:[(0,W.jsxs)(`div`,{className:`field`,children:[(0,W.jsx)(`label`,{htmlFor:`provider-key-r-${e.id}`,children:`API 密钥`}),(0,W.jsx)(`input`,{id:`provider-key-r-${e.id}`,type:`password`,value:s,onChange:e=>c(e.target.value),placeholder:e.apiKeyMasked?`已安全保存 ····${e.apiKeyPreview||``}`:a?`本地提供方可留空`:`输入 API 密钥`,autoComplete:`new-password`})]}),(0,W.jsxs)(`div`,{className:`field`,children:[(0,W.jsx)(`label`,{htmlFor:`provider-models-r-${e.id}`,children:`模型列表`}),(0,W.jsx)(`textarea`,{id:`provider-models-r-${e.id}`,rows:1,value:l,onChange:e=>u(e.target.value)})]})]}),(0,W.jsxs)(`div`,{className:`provider-card-footer`,children:[(0,W.jsxs)(`label`,{className:`provider-private`,children:[(0,W.jsx)(`input`,{type:`checkbox`,checked:d,onChange:e=>f(e.target.checked)}),` 允许访问本机 / 内网`]}),(0,W.jsxs)(`div`,{className:`provider-row`,children:[(0,W.jsx)(`button`,{className:`btn-ghost`,type:`button`,disabled:p,onClick:()=>void _(),children:p?`测试中…`:`测试连接`}),(0,W.jsx)(`button`,{className:`btn-ghost danger-ghost`,type:`button`,onClick:()=>void n(e),children:`删除`}),(0,W.jsx)(`button`,{className:`btn-primary`,type:`button`,onClick:()=>void t(e,{...s?{apiKey:s}:{},models:l.split(/[,\n]/).map(e=>e.trim()).filter(Boolean),allowPrivate:d}),children:`保存`})]})]}),h&&(0,W.jsx)(`div`,{className:`provider-probe-result`,role:`status`,children:h})]})}function Se({providers:e,onSave:t,onDelete:n,onAddBuiltin:r,onAddCustom:i,onProbe:a}){let[o,s]=(0,U.useState)(e),c=o.reduce((e,t)=>e+(t.models?.length||+!!t.model),0),l=o.filter(e=>!!(e.apiKeyMasked||e.apiKey)||e.id===`mock`||[`ollama`,`lmstudio`,`mock`].includes((e.apiType||``).toLowerCase())).length;return(0,W.jsxs)(`section`,{className:`provider-settings`,children:[(0,W.jsxs)(`div`,{className:`settings-page-heading`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`h3`,{children:`模型连接`}),(0,W.jsx)(`p`,{className:`lead`,children:`管理提供方凭证和可选模型;所有配置仅保存在本地。`})]}),(0,W.jsxs)(`div`,{className:`provider-summary`,"aria-label":`模型配置概览`,children:[(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:o.length}),` 个提供方`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:c}),` 个模型`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:l}),` 个可用`]})]})]}),(0,W.jsxs)(`div`,{className:`provider-grid`,children:[o.map(e=>(0,W.jsx)(xe,{provider:e,onSave:t,onProbe:a,onDelete:async e=>{await n(e)&&s(t=>t.filter(t=>t.id!==e.id))}},e.id)),!o.length&&(0,W.jsx)(`div`,{className:`provider-empty`,children:`还没有添加任何模型,点击下方按钮开始配置。`})]}),(0,W.jsxs)(`div`,{className:`add-provider provider-add-grid`,children:[(0,W.jsxs)(`button`,{type:`button`,className:`add-tile`,onClick:r,children:[(0,W.jsx)(g,{className:`ico`,"aria-hidden":!0}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:`添加提供方`}),(0,W.jsx)(`small`,{children:`从内置模板快速配置`})]})]}),(0,W.jsxs)(`button`,{type:`button`,className:`add-tile`,onClick:i,children:[(0,W.jsx)(g,{className:`ico`,"aria-hidden":!0}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:`自定义提供方`}),(0,W.jsx)(`small`,{children:`接入 OpenAI 兼容服务`})]})]})]})]})}function Ce({initialSkills:e,sourceLabel:t,onToggle:n,onEdit:r,onDiff:a,onDelete:o,onImport:s,onAdd:l}){let[u,d]=(0,U.useState)(e),[f,p]=(0,U.useState)(``),[m,h]=(0,U.useState)(``),[v,y]=(0,U.useState)(``),b=(0,U.useMemo)(()=>[...new Set(u.map(e=>e.source?.kind||`managed`))],[u]),x=u.filter(e=>(!f||[e.name,e.id,e.description,t(e.source)].filter(Boolean).join(` `).toLowerCase().includes(f.toLowerCase()))&&(!m||(e.source?.kind||`managed`)===m)&&(!v||(e.enabled?`enabled`:`disabled`)===v));return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`h3`,{children:`Agent Skills`}),(0,W.jsxs)(`p`,{className:`lead`,children:[`每个 Skill 都是一个以 `,(0,W.jsx)(`code`,{children:`SKILL.md`}),` 为入口的目录,可附带 scripts、references 和 assets;这里的开关控制 MultiChat 是否使用它。`]}),(0,W.jsxs)(`div`,{className:`resource-toolbar`,"aria-label":`筛选 Skills`,children:[(0,W.jsxs)(`label`,{className:`resource-search`,children:[(0,W.jsx)(_,{size:15,"aria-hidden":!0}),(0,W.jsx)(`input`,{type:`search`,"aria-label":`搜索 Skills`,placeholder:`搜索名称、说明或 ID`,value:f,onChange:e=>p(e.target.value)})]}),(0,W.jsxs)(`select`,{"aria-label":`按来源筛选`,value:m,onChange:e=>h(e.target.value),children:[(0,W.jsx)(`option`,{value:``,children:`全部来源`}),b.map(e=>(0,W.jsx)(`option`,{value:e,children:t({kind:e})},e))]}),(0,W.jsxs)(`select`,{"aria-label":`按状态筛选`,value:v,onChange:e=>y(e.target.value),children:[(0,W.jsx)(`option`,{value:``,children:`全部状态`}),(0,W.jsx)(`option`,{value:`enabled`,children:`已启用`}),(0,W.jsx)(`option`,{value:`disabled`,children:`已停用`})]}),(0,W.jsxs)(`span`,{className:`resource-count`,children:[x.length,` / `,u.length,` 个 Skills`]})]}),(0,W.jsxs)(`div`,{className:`card-grid`,children:[x.map(e=>{let s=e.key||e.id,l=[`managed`,`repo`].includes(e.source?.kind);return(0,W.jsxs)(`article`,{className:`mc-card`,onClick:()=>l&&r(e),children:[(0,W.jsxs)(`div`,{className:`mc-top`,children:[(0,W.jsx)(`div`,{className:`mc-ico`,children:(0,W.jsx)(H,{size:19,"aria-hidden":!0})}),(0,W.jsxs)(`div`,{className:`mc-title-wrap`,children:[(0,W.jsx)(`div`,{className:`mc-title`,children:e.name}),(0,W.jsx)(`div`,{className:`mc-sub`,children:e.id})]})]}),(0,W.jsx)(`div`,{className:`mc-desc`,children:e.description||`(暂无描述)`}),(0,W.jsxs)(`div`,{className:`extension-source`,children:[t(e.source),` · `,e.scope||`project`]}),(0,W.jsx)(`div`,{className:`extension-command`,title:e.path||``,children:e.path||``}),(0,W.jsxs)(`div`,{className:`mc-tags`,children:[(0,W.jsx)(`span`,{className:`mc-tag${e.enabled?` on`:``}`,children:`SKILL.md`}),(0,W.jsxs)(`span`,{className:`mc-tag`,children:[`MultiChat `,e.enabled?`已启用`:`已停用`]}),(e.resources||[]).map(e=>(0,W.jsx)(`span`,{className:`mc-tag`,children:e},e)),e.invalid&&(0,W.jsx)(`span`,{className:`mc-tag danger`,children:`格式无效`})]}),(0,W.jsxs)(`div`,{className:`skill-card-actions`,children:[(0,W.jsxs)(`button`,{type:`button`,className:`mc-toggle${e.enabled?` on`:``}`,"aria-pressed":!!e.enabled,onClick:async t=>{t.stopPropagation(),await n(e)&&d(e=>e.map(e=>(e.key||e.id)===s?{...e,enabled:!e.enabled}:e))},children:[(0,W.jsx)(`span`,{className:`mc-switch`,"aria-hidden":!0}),(0,W.jsx)(`span`,{children:e.enabled?`启用中`:`已停用`})]}),(0,W.jsxs)(`div`,{className:`mc-actions extension-card-actions`,children:[[`repo`,`plugin`].includes(e.source?.kind)&&(0,W.jsx)(`button`,{className:`mc-act`,type:`button`,title:`查看 Git 变更`,onClick:t=>{t.stopPropagation(),a(e)},children:(0,W.jsx)(c,{size:15,"aria-hidden":!0})}),l&&(0,W.jsx)(`button`,{className:`mc-act`,type:`button`,title:`编辑`,onClick:t=>{t.stopPropagation(),r(e)},children:(0,W.jsx)(H,{size:15,"aria-hidden":!0})}),l&&(0,W.jsx)(`button`,{className:`mc-act danger`,type:`button`,title:`删除`,onClick:async t=>{t.stopPropagation(),await o(e)&&d(e=>e.filter(e=>(e.key||e.id)!==s))},children:(0,W.jsx)(i,{size:15,"aria-hidden":!0})})]})]})]},s)}),!x.length&&(0,W.jsx)(`div`,{className:`extension-empty`,children:`没有符合筛选条件的 Skill。`}),(0,W.jsxs)(`button`,{type:`button`,className:`mc-add`,onClick:s,children:[(0,W.jsx)(B,{size:20,"aria-hidden":!0}),(0,W.jsx)(`span`,{className:`plus-t`,children:`上传 / 导入 Skill`}),(0,W.jsx)(`span`,{className:`mc-sub`,children:`ZIP、SKILL.md 或完整目录`})]}),(0,W.jsxs)(`button`,{type:`button`,className:`mc-add`,onClick:l,children:[(0,W.jsx)(g,{size:20,"aria-hidden":!0}),(0,W.jsx)(`span`,{className:`plus-t`,children:`新建 Skill`})]})]})]})}function we({initialTools:e,onToggle:t,agents:n=[],onTest:r}){let[i,o]=(0,U.useState)(e),[s,c]=(0,U.useState)(``),[l,u]=(0,U.useState)({}),d=async(e,t)=>{c(e.id);try{let n=await r(e,t),i=n.ok?`✓ ${e.type===`calculator`?t+` = `:``}${typeof n.data==`string`?n.data:JSON.stringify(n.data)}(${n.elapsedMs}ms)`:`✗ ${n.error}`;u(t=>({...t,[e.id]:i}))}catch(t){u(n=>({...n,[e.id]:`✗ ${t.message}`}))}finally{c(``)}},f=async e=>{if(e.type===`calculator`){let t=await showPrompt({title:`试跑 · ${e.name}`,label:`数学表达式`,placeholder:`例如 (2 + 3) * 14 / 5`,maxLength:200});if(t==null||!t.trim())return;await d(e,t.trim())}else await d(e)},p=e=>n.filter(t=>(t.toolIds||[]).includes(e.id)).length;return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`h3`,{children:`内置工具`}),(0,W.jsx)(`p`,{className:`lead`,children:`这些是 MultiChat 自身实现的函数调用能力。停用后不会暴露给模型。`}),(0,W.jsxs)(`div`,{className:`card-grid`,children:[i.map(e=>{let n=[`datetime`,`calculator`].includes(e.type),r=p(e);return(0,W.jsxs)(`article`,{className:`mc-card`,children:[(0,W.jsxs)(`div`,{className:`mc-top`,children:[(0,W.jsx)(`div`,{className:`mc-ico`,children:(0,W.jsx)(a,{size:19,"aria-hidden":!0})}),(0,W.jsxs)(`div`,{className:`mc-title-wrap`,children:[(0,W.jsx)(`div`,{className:`mc-title`,children:e.name}),(0,W.jsxs)(`div`,{className:`mc-sub`,children:[e.id,` · `,e.type||`function`]})]})]}),(0,W.jsx)(`div`,{className:`mc-desc`,children:e.description||``}),(0,W.jsxs)(`div`,{className:`mc-tags`,children:[(e.permissions||[]).map(e=>(0,W.jsx)(`span`,{className:`mc-tag`,children:e},e)),(0,W.jsx)(`span`,{className:`mc-tag${e.enabled?` on`:``}`,children:e.enabled?`已启用`:`已停用`}),(0,W.jsx)(`span`,{className:`mc-tag${r?` on`:``}`,title:`引用该工具的运行配置数量`,children:r?`${r} 个运行配置引用`:`未被运行配置引用`})]}),(0,W.jsxs)(`div`,{className:`mc-actions extension-card-actions left`,children:[(0,W.jsxs)(`button`,{type:`button`,className:`mc-toggle${e.enabled?` on`:``}`,"aria-pressed":!!e.enabled,onClick:async()=>{await t(e)&&o(t=>t.map(t=>t.id===e.id?{...t,enabled:!t.enabled}:t))},children:[(0,W.jsx)(`span`,{className:`mc-switch`,"aria-hidden":!0}),(0,W.jsx)(`span`,{children:e.enabled?`启用中`:`已停用`})]}),n&&(0,W.jsx)(`button`,{type:`button`,className:`mc-act wide`,disabled:s===e.id,onClick:()=>void f(e),children:s===e.id?`试跑中…`:`试跑`})]}),l[e.id]&&(0,W.jsx)(`div`,{className:`tool-test-result`,role:`status`,children:l[e.id]})]},e.id)}),!i.length&&(0,W.jsx)(`div`,{className:`extension-empty`,children:`没有内置工具。`})]})]})}function G(e){let t=Number(e||0);return t>=1e9?`${(t/1e9).toFixed(t>=1e10?0:1)}B`:t>=1e6?`${(t/1e6).toFixed(t>=1e7?0:1)}M`:t>=1e3?`${(t/1e3).toFixed(t>=1e4?0:1)}K`:t.toLocaleString(`zh-CN`)}function Te(e){let t=d(e=>e.projects),n=d(e=>e.agents),r=d(e=>e.providers),a=d(e=>e.assets),o=d(e=>e.memories),s=d(e=>e.snapshots),c=d(e=>e.selectedProject),l=(0,U.useRef)(null),[u,f]=(0,U.useState)(c?.defaultAgentId||``),[p,m]=(0,U.useState)(c?.defaultProviderId&&c?.defaultModel?`${c.defaultProviderId}:${c.defaultModel}`:``),[h,g]=(0,U.useState)(``),[v,y]=(0,U.useState)(!1),[b,x]=(0,U.useState)(!1),[S,C]=(0,U.useState)(``),[w,T]=(0,U.useState)([]);(0,U.useEffect)(()=>{f(c?.defaultAgentId||``),m(c?.defaultProviderId&&c?.defaultModel?`${c.defaultProviderId}:${c.defaultModel}`:``),T([]),x(!1),C(``)},[c?.id,c?.defaultAgentId,c?.defaultProviderId,c?.defaultModel]);let E=r.flatMap(e=>(e.models||[]).map(t=>({value:`${e.id}:${t}`,label:`${e.name||e.id} · ${t}`}))),D=async t=>{if(t.preventDefault(),h.trim()&&c){y(!0),C(``);try{T(await e.onSearch(h.trim()))}catch(e){T([]),C(e.message)}finally{y(!1),x(!0)}}},O=async()=>{let[t,...n]=p.split(`:`);await e.onSaveDefaults(u||null,t||null,n.join(`:`)||null)};return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`h3`,{children:`项目与文件`}),(0,W.jsx)(`p`,{className:`lead`,children:`一个项目对应一个代码文件夹及其对话上下文;内部存储空间由 MultiChat 自动管理。`}),(0,W.jsxs)(`section`,{className:`provider-card`,children:[(0,W.jsxs)(`div`,{className:`control-card-head`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`h4`,{children:`当前项目`}),(0,W.jsx)(`div`,{className:`pmeta`,children:`切换项目时会自动载入对应的文件、记忆和默认模型。`})]}),(0,W.jsxs)(`button`,{className:`btn-primary compact-action`,type:`button`,onClick:()=>void e.onImportFolder(),children:[(0,W.jsx)(B,{size:15,"aria-hidden":!0}),` 打开项目文件夹`]})]}),(0,W.jsxs)(`div`,{className:`field`,children:[(0,W.jsx)(`label`,{htmlFor:`projectSelectReact`,children:`已打开的项目`}),(0,W.jsx)(`select`,{id:`projectSelectReact`,value:c?.id||``,onChange:t=>void e.onProjectChange(t.target.value),children:t.map(e=>(0,W.jsx)(`option`,{value:e.id,children:e.name===`收件箱`?`无项目(临时对话)`:e.name},e.id))})]}),(0,W.jsxs)(`div`,{className:`field`,children:[(0,W.jsx)(`label`,{htmlFor:`projectAgentReact`,children:`项目默认运行配置`}),(0,W.jsxs)(`select`,{id:`projectAgentReact`,value:u,onChange:e=>f(e.target.value),children:[(0,W.jsx)(`option`,{value:``,children:`(继承全局)`}),n.map(e=>(0,W.jsx)(`option`,{value:e.id,children:e.name},e.id))]})]}),(0,W.jsxs)(`div`,{className:`field`,children:[(0,W.jsx)(`label`,{htmlFor:`projectModelReact`,children:`项目默认模型`}),(0,W.jsxs)(`select`,{id:`projectModelReact`,value:p,onChange:e=>m(e.target.value),children:[(0,W.jsx)(`option`,{value:``,children:`(继承全局)`}),E.map(e=>(0,W.jsx)(`option`,{value:e.value,children:e.label},e.value))]})]}),(0,W.jsx)(`div`,{className:`provider-row`,children:(0,W.jsx)(`button`,{className:`btn-primary compact-action`,type:`button`,onClick:()=>void O(),children:`保存项目默认`})}),(0,W.jsx)(`div`,{className:`provider-row`,children:(0,W.jsx)(`button`,{className:`btn-ghost`,type:`button`,onClick:e.onNewProject,children:`新建空项目`})})]}),(0,W.jsxs)(`section`,{className:`provider-card`,children:[(0,W.jsx)(`h4`,{children:`项目文件`}),(0,W.jsx)(`div`,{className:`pmeta`,children:`支持本地文本文件和 URL 文本资源;对话时会按相关性截取并附带文件/行号来源。`}),(0,W.jsxs)(`div`,{className:`provider-row workspace-file-actions`,children:[(0,W.jsxs)(`button`,{className:`btn-ghost`,type:`button`,onClick:()=>l.current?.click(),children:[(0,W.jsx)(B,{size:15,"aria-hidden":!0}),` 上传本地文件`]}),(0,W.jsx)(`button`,{className:`btn-ghost`,type:`button`,onClick:e.onImportUrl,children:`从 URL 添加`}),(0,W.jsx)(`input`,{ref:l,type:`file`,accept:`.txt,.md,.json,.csv,.js,.ts,.py,.html,.css,.yaml,.yml`,hidden:!0,onChange:t=>{let n=t.target.files?.[0];n&&e.onUploadFile(n),t.target.value=``}})]}),(0,W.jsxs)(`div`,{className:`run-list workspace-resource-list`,children:[a.map(t=>(0,W.jsxs)(`div`,{className:`run-row`,children:[(0,W.jsx)(`span`,{className:`run-dot completed`}),(0,W.jsxs)(`div`,{className:`run-main`,children:[(0,W.jsx)(`div`,{className:`run-title`,children:t.name}),(0,W.jsxs)(`div`,{className:`run-meta`,children:[t.mimeType,` · `,t.size,` bytes · `,t.source]})]}),(0,W.jsx)(`button`,{className:`mc-act danger`,type:`button`,title:`删除`,"aria-label":`删除文件 ${t.name}`,onClick:()=>void e.onDeleteAsset(t.id),children:(0,W.jsx)(i,{size:15,"aria-hidden":!0})})]},t.id)),!a.length&&(0,W.jsx)(`div`,{className:`control-empty`,children:`当前项目还没有文件。`})]}),(0,W.jsxs)(`form`,{className:`knowledge-search`,onSubmit:D,children:[(0,W.jsxs)(`label`,{className:`resource-search`,children:[(0,W.jsx)(_,{size:15,"aria-hidden":!0}),(0,W.jsx)(`input`,{"aria-label":`搜索项目知识`,value:h,onChange:e=>g(e.target.value),placeholder:`搜索项目知识,例如:认证流程在哪里实现?`})]}),(0,W.jsx)(`button`,{className:`btn-ghost`,disabled:v,children:v?`检索中…`:`搜索知识`})]}),(0,W.jsxs)(`div`,{className:`knowledge-results`,"aria-live":`polite`,children:[S&&(0,W.jsx)(`div`,{className:`auth-error`,children:S}),w.map((e,t)=>(0,W.jsxs)(`article`,{className:`knowledge-hit`,children:[(0,W.jsxs)(`strong`,{children:[e.name,` `,(0,W.jsxs)(`span`,{children:[`L`,e.lineStart,`–L`,e.lineEnd]})]}),(0,W.jsx)(`p`,{children:String(e.snippet||``).slice(0,500)})]},`${e.id||e.name}-${t}`)),b&&!v&&!S&&w.length===0&&(0,W.jsx)(`div`,{className:`control-empty`,children:`没有找到相关片段。`})]})]}),(0,W.jsxs)(`section`,{className:`provider-card`,children:[(0,W.jsxs)(`div`,{className:`control-card-head`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`h4`,{children:`项目记忆`}),(0,W.jsx)(`div`,{className:`pmeta`,children:`由你明确维护的事实和偏好;可逐条停用,不会从聊天中偷偷学习。`})]}),(0,W.jsx)(`button`,{className:`btn-ghost`,type:`button`,onClick:e.onAddMemory,children:`新增记忆`})]}),(0,W.jsxs)(`div`,{className:`memory-list`,children:[o.map(t=>(0,W.jsxs)(`article`,{className:`memory-item${t.enabled===!1?` disabled`:``}`,children:[(0,W.jsxs)(`button`,{className:`memory-toggle`,type:`button`,"aria-pressed":t.enabled!==!1,onClick:()=>void e.onToggleMemory(t),children:[(0,W.jsx)(`i`,{}),t.enabled===!1?`已停用`:`已启用`]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`strong`,{children:t.title}),(0,W.jsx)(`p`,{children:t.content})]}),(0,W.jsxs)(`div`,{className:`memory-actions`,children:[(0,W.jsx)(`button`,{className:`mc-act`,type:`button`,onClick:()=>e.onEditMemory(t.id),children:`编辑`}),(0,W.jsx)(`button`,{className:`mc-act danger`,type:`button`,onClick:()=>void e.onDeleteMemory(t.id),children:`删除`})]})]},t.id)),!o.length&&(0,W.jsx)(`div`,{className:`control-empty`,children:`还没有项目记忆。只保存值得长期复用的事实和偏好。`})]})]}),(0,W.jsxs)(`section`,{className:`provider-card`,children:[(0,W.jsxs)(`div`,{className:`control-card-head`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`h4`,{children:`项目时光机`}),(0,W.jsx)(`div`,{className:`pmeta`,children:`保存项目设置、知识文件、记忆、默认运行配置和当前 Git 状态;恢复前会自动再备份一次。`})]}),(0,W.jsx)(`button`,{className:`btn-primary compact-action`,type:`button`,onClick:()=>void e.onCreateSnapshot(),children:`创建快照`})]}),(0,W.jsxs)(`div`,{className:`snapshot-list`,children:[s.map(t=>(0,W.jsxs)(`article`,{className:`snapshot-item`,children:[(0,W.jsx)(`span`,{className:`snapshot-mark`,children:t.git?.commit||`LOCAL`}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`strong`,{children:t.title}),(0,W.jsxs)(`p`,{children:[new Date(t.createdAt).toLocaleString(`zh-CN`),` · `,t.assets,` 文件 · `,t.memories,` 记忆 ·`,` `,G(t.size),`B`,t.git?.branch?` · ${t.git.branch}${t.git.dirty?`(有改动)`:``}`:``]})]}),(0,W.jsxs)(`div`,{className:`memory-actions`,children:[(0,W.jsx)(`button`,{className:`mc-act`,type:`button`,onClick:()=>void e.onRestoreSnapshot(t.id),children:`恢复`}),(0,W.jsx)(`button`,{className:`mc-act danger`,type:`button`,onClick:()=>void e.onDeleteSnapshot(t.id),children:`删除`})]})]},t.id)),!s.length&&(0,W.jsx)(`div`,{className:`control-empty`,children:`尚未创建项目快照。`})]})]})]})}function Ee({onEdit:e,onExport:t,onDelete:n,onImport:r}){let a=d(e=>e.agents),s=d(e=>e.selectedAgent),c=(0,U.useRef)(null);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`div`,{className:`settings-page-heading`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`div`,{className:`usage-kicker`,children:`AI TEAM`}),(0,W.jsx)(`h3`,{children:`智能体工作室`}),(0,W.jsx)(`p`,{className:`lead`,children:`把系统提示词、Skills、内置工具和 MCP 服务组合成可复用的 AI 角色。只有当前智能体选中的能力才会进入运行。`})]}),(0,W.jsxs)(`div`,{className:`extension-heading-actions`,children:[(0,W.jsxs)(`button`,{className:`btn-ghost`,type:`button`,onClick:()=>c.current?.click(),children:[(0,W.jsx)(B,{size:15,"aria-hidden":!0}),` 导入智能体`]}),(0,W.jsxs)(`button`,{className:`btn-primary compact-action`,type:`button`,onClick:()=>e(null),children:[(0,W.jsx)(g,{size:15,"aria-hidden":!0}),` 新建智能体`]}),(0,W.jsx)(`input`,{ref:c,type:`file`,accept:`.json,application/json`,hidden:!0,onChange:e=>{let t=e.target.files?.[0];t&&r(t),e.target.value=``}})]})]}),(0,W.jsxs)(`div`,{className:`card-grid agent-studio-grid`,children:[a.map(r=>{let a=r.skillRefs||r.skillIds||[],c=r.toolIds||[],l=r.mcpServerIds||[];return(0,W.jsxs)(`article`,{className:`mc-card agent-card`,onClick:()=>e(r.id),children:[(0,W.jsxs)(`div`,{className:`mc-top`,children:[(0,W.jsx)(`div`,{className:`mc-ico`,children:(0,W.jsx)(o,{size:19,"aria-hidden":!0})}),(0,W.jsxs)(`div`,{className:`mc-title-wrap`,children:[(0,W.jsx)(`div`,{className:`mc-title`,children:r.name}),(0,W.jsx)(`div`,{className:`mc-sub`,children:r.id})]}),(0,W.jsxs)(`span`,{className:`agent-status${s?.id===r.id?` active`:``}`,children:[(0,W.jsx)(`i`,{}),s?.id===r.id?`当前使用`:`可用`]})]}),(0,W.jsx)(`div`,{className:`mc-desc`,children:r.description||`尚未添加说明,可编辑智能体补充职责与适用任务。`}),(0,W.jsxs)(`div`,{className:`agent-capability-summary`,children:[(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:a.length}),` Skills`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:c.length}),` 工具`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:l.length}),` MCP`]})]}),(0,W.jsxs)(`div`,{className:`mc-tags`,children:[a.slice(0,3).map(e=>(0,W.jsx)(`span`,{className:`mc-tag`,children:e},e)),a.length>3&&(0,W.jsxs)(`span`,{className:`mc-tag`,children:[`+`,a.length-3]}),!a.length&&(0,W.jsx)(`span`,{className:`mc-tag muted`,children:`尚未绑定 Skill`})]}),(0,W.jsxs)(`div`,{className:`mc-actions extension-card-actions`,children:[(0,W.jsx)(`button`,{className:`mc-act`,type:`button`,title:`导出`,"aria-label":`导出 ${r.name}`,onClick:e=>{e.stopPropagation(),t(r)},children:(0,W.jsx)(V,{size:15,"aria-hidden":!0})}),(0,W.jsx)(`button`,{className:`mc-act`,type:`button`,title:`编辑`,"aria-label":`编辑 ${r.name}`,onClick:t=>{t.stopPropagation(),e(r.id)},children:(0,W.jsx)(ye,{size:15,"aria-hidden":!0})}),(0,W.jsx)(`button`,{className:`mc-act danger`,type:`button`,title:`删除`,"aria-label":`删除 ${r.name}`,onClick:e=>{e.stopPropagation(),n(r)},children:(0,W.jsx)(i,{size:15,"aria-hidden":!0})})]})]},r.id)}),!a.length&&(0,W.jsxs)(`div`,{className:`extension-empty`,children:[(0,W.jsx)(o,{size:22,"aria-hidden":!0}),(0,W.jsx)(`strong`,{children:`还没有智能体`}),(0,W.jsx)(`span`,{children:`创建一个角色,组合提示词、Skills 和工具。`})]})]})]})}var K={plugin:`插件`,skill:`Skill`,mcp:`MCP`,tool:`内置工具`},De={high:`高风险`,medium:`中风险`,low:`低风险`};function Oe({onRefresh:e}){let t=d(e=>e.capabilities),[r,i]=(0,U.useState)(``),[a,o]=(0,U.useState)(``),[s,c]=(0,U.useState)(``),l=(0,U.useMemo)(()=>(t?.items||[]).filter(e=>{let t=[e.name,e.id,e.source,e.scope,...e.permissions||[]].join(` `).toLowerCase();return(!r||t.includes(r.toLowerCase()))&&(!a||e.type===a)&&(!s||e.risk===s)}),[t,r,a,s]);return t?(0,W.jsxs)(`section`,{className:`passport-page`,children:[(0,W.jsxs)(`div`,{className:`settings-page-heading`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`div`,{className:`usage-kicker`,children:`能力治理`}),(0,W.jsx)(`h3`,{children:`能力审计`}),(0,W.jsx)(`p`,{className:`lead`,children:`统一查看每项能力的来源、版本、权限、信任边界和结构完整性。`})]}),(0,W.jsxs)(`button`,{className:`btn-ghost`,type:`button`,onClick:()=>void e(),children:[(0,W.jsx)(n,{size:15,"aria-hidden":!0}),` 重新扫描`]})]}),(0,W.jsxs)(`div`,{className:`passport-summary`,children:[(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:t.summary.total}),` 项能力`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:t.summary.enabled}),` 项启用`]}),(0,W.jsxs)(`span`,{className:t.summary.highRisk?`warn`:``,children:[(0,W.jsx)(`strong`,{children:t.summary.highRisk}),` 项高风险`]}),(0,W.jsxs)(`span`,{className:t.summary.issues?`warn`:``,children:[(0,W.jsx)(`strong`,{children:t.summary.issues}),` 个待处理问题`]})]}),(0,W.jsxs)(`div`,{className:`resource-toolbar passport-toolbar`,children:[(0,W.jsxs)(`label`,{className:`resource-search`,children:[(0,W.jsx)(_,{size:15,"aria-hidden":!0}),(0,W.jsx)(`input`,{type:`search`,"aria-label":`搜索能力`,placeholder:`搜索能力、来源或权限`,value:r,onChange:e=>i(e.target.value)})]}),(0,W.jsxs)(`select`,{"aria-label":`按类型筛选`,value:a,onChange:e=>o(e.target.value),children:[(0,W.jsx)(`option`,{value:``,children:`全部类型`}),Object.entries(K).map(([e,t])=>(0,W.jsx)(`option`,{value:e,children:t},e))]}),(0,W.jsxs)(`select`,{"aria-label":`按风险筛选`,value:s,onChange:e=>c(e.target.value),children:[(0,W.jsx)(`option`,{value:``,children:`全部风险`}),(0,W.jsx)(`option`,{value:`high`,children:`高风险`}),(0,W.jsx)(`option`,{value:`medium`,children:`中风险`}),(0,W.jsx)(`option`,{value:`low`,children:`低风险`})]}),(0,W.jsxs)(`span`,{className:`resource-count`,children:[l.length,` / `,t.items.length,` 项`]})]}),(0,W.jsx)(`div`,{className:`passport-grid`,children:l.map(e=>(0,W.jsxs)(`article`,{className:`passport-card`,children:[(0,W.jsxs)(`div`,{className:`passport-head`,children:[(0,W.jsx)(`span`,{className:`passport-type ${e.type}`,children:K[e.type]||e.type}),(0,W.jsx)(`span`,{className:`passport-risk ${e.risk}`,children:De[e.risk]||e.risk})]}),(0,W.jsx)(`h4`,{children:e.name}),(0,W.jsx)(`code`,{children:e.id}),(0,W.jsx)(`p`,{children:e.description||`暂无说明`}),(0,W.jsxs)(`dl`,{children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`来源`}),(0,W.jsxs)(`dd`,{children:[e.source,` · `,e.scope||`project`]})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`版本 / 完整性`}),(0,W.jsxs)(`dd`,{children:[e.version||`未声明`,` · `,e.integrity||`unknown`]})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`信任`}),(0,W.jsx)(`dd`,{children:e.trust||`unknown`})]})]}),(0,W.jsxs)(`div`,{className:`passport-perms`,children:[(e.permissions||[]).map(e=>(0,W.jsx)(`span`,{children:e},e)),!e.permissions?.length&&(0,W.jsx)(`span`,{className:`none`,children:`无特殊权限`})]}),e.issues?.length?(0,W.jsx)(`div`,{className:`passport-issues`,children:e.issues.map(e=>(0,W.jsx)(`span`,{children:e},e))}):(0,W.jsx)(`div`,{className:`passport-clean`,children:`结构检查通过`})]},`${e.type}:${e.id}`))}),!l.length&&(0,W.jsx)(`div`,{className:`extension-empty`,children:`没有符合筛选条件的能力。`})]}):(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`h3`,{children:`能力审计`}),(0,W.jsx)(`p`,{className:`lead`,children:`正在生成能力护照…`}),(0,W.jsx)(`div`,{className:`usage-loading`,role:`status`,"aria-label":`正在加载`})]})}var q=[`#6158e8`,`#16aabd`,`#9b77f2`,`#ef9f52`,`#46a575`,`#d65f7a`];function ke({rows:e=[]}){let t=Math.max(1,...e.map(e=>Number(e.totalTokens||0))),n=710/Math.max(1,e.length),r=e.map((e,r)=>`${38+r*n+n/2},${196-178*Number(e.totalTokens||0)/t}`).join(` `);return(0,W.jsxs)(`svg`,{className:`usage-trend`,viewBox:`0 0 760 226`,role:`img`,"aria-label":`每日 Token 用量趋势`,children:[(0,W.jsx)(`g`,{className:`usage-grid`,children:[0,.5,1].map(e=>(0,W.jsxs)(`g`,{children:[(0,W.jsx)(`line`,{x1:38,x2:748,y1:18+178*(1-e),y2:18+178*(1-e)}),(0,W.jsx)(`text`,{x:`0`,y:18+178*(1-e)+4,children:G(t*e)})]},e))}),e.map((e,r)=>{let i=38+r*n+Math.max(1,n*.16),a=Math.max(2,n*.68),o=178*Number(e.inputTokens||0)/t,s=178*Number(e.outputTokens||0)/t;return(0,W.jsxs)(`g`,{children:[(0,W.jsxs)(`title`,{children:[e.date,` · `,G(e.totalTokens),` tokens`]}),(0,W.jsx)(`rect`,{className:`usage-bar-input`,x:i,y:196-o,width:a,height:o,rx:`2`}),(0,W.jsx)(`rect`,{className:`usage-bar-output`,x:i,y:196-o-s,width:a,height:s,rx:`2`})]},e.date)}),r&&(0,W.jsx)(`polyline`,{className:`usage-line`,points:r}),(0,W.jsx)(`text`,{className:`usage-date`,x:38,y:221,children:e[0]?.date?.slice(5)||``}),(0,W.jsx)(`text`,{className:`usage-date`,x:748,y:221,textAnchor:`end`,children:e[e.length-1]?.date?.slice(5)||``})]})}function Ae({onRange:e,onExport:t}){let n=d(e=>e.usage),r=d(e=>e.usageLoading),i=d(e=>e.usageRange);if(r&&!n)return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`h3`,{children:`用量中心`}),(0,W.jsx)(`p`,{className:`lead`,children:`正在汇总本地运行记录…`}),(0,W.jsx)(`div`,{className:`usage-loading`,role:`status`,"aria-label":`正在加载`})]});let a=n?.totals||{},o=n?.daily||[],s=o[o.length-1]||{},c=n?.models||[],l=n?.providers||[],u=0,f=c.slice(0,6).map((e,t)=>{let n=u;return u+=Number(e.share||0)*360,`${q[t%q.length]} ${n}deg ${u}deg`}).join(`,`);return(0,W.jsxs)(`section`,{className:`usage-page`,children:[(0,W.jsxs)(`div`,{className:`settings-page-heading usage-heading`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`div`,{className:`usage-kicker`,children:`本地用量统计`}),(0,W.jsx)(`h3`,{children:`每日 Token 用量`}),(0,W.jsx)(`p`,{className:`lead`,children:`按本机请求汇总;上游未返回 usage 时会明确标记为估算,不读取任何提示词正文。`})]}),(0,W.jsxs)(`div`,{className:`usage-heading-actions`,children:[(0,W.jsx)(`div`,{className:`usage-ranges`,children:[[`7`,`近 7 天`],[`30`,`近 30 天`],[`all`,`全部`]].map(([t,n])=>(0,W.jsx)(`button`,{className:`usage-range${i===t?` active`:``}`,type:`button`,onClick:()=>void e(t),children:n},t))}),(0,W.jsxs)(`button`,{className:`btn-ghost`,type:`button`,onClick:()=>t(n,i),children:[(0,W.jsx)(V,{size:15,"aria-hidden":!0}),` 导出 CSV`]})]})]}),(0,W.jsxs)(`div`,{className:`usage-metrics`,children:[(0,W.jsxs)(`article`,{className:`usage-metric primary`,children:[(0,W.jsx)(`span`,{children:`Token 总量`}),(0,W.jsx)(`strong`,{children:G(a.totalTokens)}),(0,W.jsxs)(`small`,{children:[`输入 `,G(a.inputTokens),` · 输出 `,G(a.outputTokens)]})]}),(0,W.jsxs)(`article`,{className:`usage-metric`,children:[(0,W.jsx)(`span`,{children:`今日用量`}),(0,W.jsx)(`strong`,{children:G(s.totalTokens)}),(0,W.jsxs)(`small`,{children:[s.requests||0,` 次模型请求`]})]}),(0,W.jsxs)(`article`,{className:`usage-metric`,children:[(0,W.jsx)(`span`,{children:`有效交互`}),(0,W.jsx)(`strong`,{children:G(a.messages)}),(0,W.jsxs)(`small`,{children:[a.requests||0,` 次模型调用`]})]}),(0,W.jsxs)(`article`,{className:`usage-metric`,children:[(0,W.jsx)(`span`,{children:`活跃天数`}),(0,W.jsx)(`strong`,{children:a.activeDays||0}),(0,W.jsxs)(`small`,{children:[`连续 `,a.currentStreak||0,` 天 · 最长 `,a.longestStreak||0,` 天`]})]})]}),(0,W.jsxs)(`div`,{className:`usage-insights`,children:[(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{className:`success`}),`成功率 `,(0,W.jsxs)(`strong`,{children:[((a.successRate??1)*100).toFixed(1),`%`]})]}),(0,W.jsxs)(`span`,{children:[`日均 `,(0,W.jsx)(`strong`,{children:G(a.averagePerActiveDay)})]}),(0,W.jsxs)(`span`,{children:[`峰值时段`,` `,(0,W.jsxs)(`strong`,{children:[String(a.peakHour||0).padStart(2,`0`),`:00–`,String(((a.peakHour||0)+1)%24).padStart(2,`0`),`:00`]})]}),(0,W.jsxs)(`span`,{children:[`真实上报 `,(0,W.jsxs)(`strong`,{children:[((a.reportedShare||0)*100).toFixed(0),`%`]})]}),a.estimatedTokens?(0,W.jsxs)(`span`,{className:`estimate-note`,children:[`约 `,G(a.estimatedTokens),` Token 为本地估算`]}):null]}),(0,W.jsxs)(`div`,{className:`usage-layout`,children:[(0,W.jsxs)(`article`,{className:`usage-panel usage-wide`,children:[(0,W.jsxs)(`div`,{className:`usage-panel-head`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`h4`,{children:`按天趋势`}),(0,W.jsx)(`p`,{children:`深色为输入,浅色为输出;悬停柱形查看当天明细。`})]}),(0,W.jsxs)(`div`,{className:`usage-legend`,children:[(0,W.jsx)(`span`,{className:`input`}),`输入 `,(0,W.jsx)(`span`,{className:`output`}),`输出`]})]}),(0,W.jsx)(ke,{rows:o})]}),(0,W.jsxs)(`article`,{className:`usage-panel`,children:[(0,W.jsx)(`div`,{className:`usage-panel-head`,children:(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`h4`,{children:`模型用量`}),(0,W.jsx)(`p`,{children:`选定周期内的 Token 占比`})]})}),(0,W.jsxs)(`div`,{className:`usage-model-wrap`,children:[(0,W.jsx)(`div`,{className:`usage-donut`,style:{background:`conic-gradient(${f||`var(--mc-line) 0 360deg`})`},children:(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`strong`,{children:c.length}),(0,W.jsx)(`span`,{children:`模型`})]})}),(0,W.jsxs)(`div`,{className:`usage-model-list`,children:[c.slice(0,6).map((e,t)=>(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`i`,{style:{background:q[t%q.length]}}),(0,W.jsx)(`span`,{title:e.name,children:e.name}),(0,W.jsxs)(`strong`,{children:[(Number(e.share||0)*100).toFixed(1),`%`]}),(0,W.jsx)(`small`,{children:G(e.totalTokens)})]},e.name)),!c.length&&(0,W.jsx)(`p`,{className:`usage-empty`,children:`还没有用量记录`})]})]})]}),(0,W.jsxs)(`article`,{className:`usage-panel usage-wide`,children:[(0,W.jsxs)(`div`,{className:`usage-panel-head`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`h4`,{children:`活跃热力图`}),(0,W.jsx)(`p`,{children:`最近 26 周的本地模型调用`})]}),(0,W.jsxs)(`span`,{children:[n?.heatmap?.filter(e=>e.totalTokens>0).length||0,` 个活跃日`]})]}),(0,W.jsx)(`div`,{className:`usage-heatmap`,role:`img`,"aria-label":`最近 26 周活跃情况`,children:(n?.heatmap||[]).map(e=>{let t=e.totalTokens===0?0:e.totalTokens<1e3?1:e.totalTokens<1e4?2:e.totalTokens<1e5?3:4;return(0,W.jsx)(`i`,{"data-level":t,children:(0,W.jsxs)(`span`,{children:[e.date,` · `,G(e.totalTokens),` tokens`]})},e.date)})})]}),(0,W.jsxs)(`article`,{className:`usage-panel`,children:[(0,W.jsx)(`div`,{className:`usage-panel-head`,children:(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`h4`,{children:`提供方健康`}),(0,W.jsx)(`p`,{children:`请求、用量与错误率`})]})}),(0,W.jsxs)(`div`,{className:`usage-provider-list`,children:[l.map(e=>(0,W.jsxs)(`div`,{children:[(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`i`,{}),e.name]}),(0,W.jsx)(`strong`,{children:G(e.totalTokens)}),(0,W.jsxs)(`small`,{children:[e.requests,` 次 ·`,` `,e.requests?(e.errors/e.requests*100).toFixed(0):0,`% 错误`]})]},e.id||e.name)),!l.length&&(0,W.jsx)(`p`,{className:`usage-empty`,children:`还没有提供方记录`})]})]})]})]})}function je({onRefresh:e,onOpen:t}){let r=d(e=>e.runs||[]),i=r.filter(e=>e.status===`completed`).length,a=r.reduce((e,t)=>e+Number(t.usage?.totalTokens||0),0),o=e=>e===`completed`?`已完成`:e===`error`?`失败`:e===`cancelled`?`已取消`:`进行中`;return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`div`,{className:`settings-page-heading`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`div`,{className:`usage-kicker`,children:`运行记录`}),(0,W.jsx)(`h3`,{children:`执行与复盘`}),(0,W.jsx)(`p`,{className:`lead`,children:`复盘模型请求、工具权限、上下文来源、耗时与 Token;点击记录查看完整上下文。`})]}),(0,W.jsxs)(`div`,{className:`heading-actions-row`,children:[(0,W.jsx)(`button`,{className:`btn-ghost`,type:`button`,onClick:()=>{let e=document.createElement(`a`);e.href=`/api/runs/export`,e.download=``,e.click()},children:`导出审计包`}),(0,W.jsxs)(`button`,{className:`btn-ghost`,type:`button`,onClick:()=>void e(),children:[(0,W.jsx)(n,{size:15,"aria-hidden":!0}),` 刷新`]})]})]}),(0,W.jsxs)(`div`,{className:`passport-summary`,children:[(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:r.length}),` 条记录`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:i}),` 次完成`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:G(a)}),` tokens`]}),(0,W.jsxs)(`span`,{className:r.length-i?`warn`:``,children:[(0,W.jsx)(`strong`,{children:r.length-i}),` 次未完成`]})]}),(0,W.jsxs)(`div`,{className:`run-list`,children:[r.map(e=>(0,W.jsxs)(`button`,{className:`run-row run-row-button`,type:`button`,onClick:()=>t(e.id),children:[(0,W.jsx)(`span`,{className:`run-dot ${e.status||``}`}),(0,W.jsxs)(`div`,{className:`run-main`,children:[(0,W.jsxs)(`div`,{className:`run-title`,children:[e.agentName||e.agentId||`智能体运行`,` `,(0,W.jsx)(`span`,{children:e.provider?.name||``})]}),(0,W.jsxs)(`div`,{className:`run-meta`,children:[e.model||`未指定模型`,` · `,e.steps||0,` 步 · `,e.toolCalls||0,` 次工具 ·`,` `,G(e.usage?.totalTokens||0),` tokens ·`,` `,e.finishedAt?`${((Date.parse(e.finishedAt)-Date.parse(e.startedAt))/1e3).toFixed(1)}s`:`运行中`]})]}),(0,W.jsx)(`span`,{className:`run-status`,children:o(e.status)}),(0,W.jsx)(`span`,{className:`run-open`,children:`›`})]},e.id)),!r.length&&(0,W.jsx)(`div`,{className:`control-empty`,children:`还没有 Agent 运行记录。`})]})]})}var Me=`multichat_compare_history_v1`;function Ne(){try{let e=JSON.parse(localStorage.getItem(Me)||`[]`);return Array.isArray(e)?e.filter(e=>e&&typeof e.id==`string`&&typeof e.prompt==`string`&&Array.isArray(e.results)).map(e=>({id:e.id,prompt:e.prompt,createdAt:typeof e.createdAt==`string`?e.createdAt:``,projectName:typeof e.projectName==`string`?e.projectName:`未选择项目`,results:e.results.filter(e=>e&&typeof e.model==`string`&&typeof e.providerId==`string`)})).slice(0,12):[]}catch{return[]}}function Pe(e,t,n){let r=[{id:`experiment_${Date.now().toString(36)}`,prompt:e,createdAt:new Date().toISOString(),projectName:t,results:n},...Ne()].slice(0,12);try{localStorage.setItem(Me,JSON.stringify(r))}catch{w(`实验已完成,但本地历史无法保存`,`error`)}return r}function Fe({result:e,prompt:t,adopt:n}){let r=e.usage?.total_tokens??e.usage?.total??0,i=e.status===`running`?`运行中`:e.status===`error`?`失败`:e.status===`cancelled`?`已停止`:e.status===`success`?`完成`:`等待`;return(0,W.jsxs)(`article`,{className:`compare-result`,"data-state":e.status,children:[(0,W.jsxs)(`header`,{children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`strong`,{children:e.model}),(0,W.jsx)(`span`,{children:e.providerName})]}),(0,W.jsx)(`span`,{className:`compare-state`,children:i})]}),(0,W.jsxs)(`div`,{className:`compare-result-body`,children:[e.status===`running`&&(0,W.jsxs)(`div`,{className:`compare-loading`,"aria-label":`模型正在运行`,children:[(0,W.jsx)(`span`,{}),(0,W.jsx)(`span`,{}),(0,W.jsx)(`span`,{})]}),e.status===`error`&&(0,W.jsx)(`div`,{className:`compare-error`,children:e.error||`请求失败`}),e.status===`cancelled`&&(0,W.jsx)(`div`,{className:`compare-cancelled`,children:`本次模型请求已停止。`}),e.status===`success`&&(0,W.jsx)(`div`,{className:`compare-answer`,children:(0,W.jsx)(b,{children:e.text||``})}),e.status===`idle`&&(0,W.jsx)(`div`,{className:`compare-empty`,children:`等待开始`})]}),e.status===`success`&&(0,W.jsxs)(`footer`,{children:[(0,W.jsxs)(`span`,{children:[((e.elapsedMs||0)/1e3).toFixed(1),` 秒`]}),(0,W.jsxs)(`span`,{children:[Number(r).toLocaleString(`zh-CN`),` Token`]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`button`,{type:`button`,onClick:async()=>{try{await navigator.clipboard.writeText(e.text||``),w(`结果已复制`)}catch{w(`复制失败`,`error`)}},children:`复制`}),(0,W.jsx)(`button`,{type:`button`,className:`compare-adopt`,onClick:()=>void n(e,t),children:`采用到对话`})]})]})]})}function Ie({results:e}){let t=e.filter(e=>e.status===`success`);if(!t.length)return null;let n=[...t].sort((e,t)=>Number(e.elapsedMs||1/0)-Number(t.elapsedMs||1/0))[0],r=[...t.filter(e=>Number(e.usage?.total_tokens??e.usage?.total??0)>0)].sort((e,t)=>Number(e.usage?.total_tokens??e.usage?.total)-Number(t.usage?.total_tokens??t.usage?.total))[0];return(0,W.jsxs)(`section`,{className:`compare-summary`,"aria-label":`实验摘要`,children:[(0,W.jsxs)(`header`,{children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`span`,{children:`实验摘要`}),(0,W.jsx)(`strong`,{children:`只比较可验证指标`})]}),(0,W.jsxs)(`small`,{children:[t.length,` / `,e.length,` 个模型完成`]})]}),(0,W.jsxs)(`dl`,{children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`最快响应`}),(0,W.jsxs)(`dd`,{children:[n.model,(0,W.jsxs)(`small`,{children:[((n.elapsedMs||0)/1e3).toFixed(1),` 秒`]})]})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`最低消耗`}),(0,W.jsxs)(`dd`,{children:[r?.model||`暂无数据`,(0,W.jsx)(`small`,{children:r?`${Number(r.usage?.total_tokens??r.usage?.total).toLocaleString(`zh-CN`)} Token`:`上游未返回用量`})]})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`上下文口径`}),(0,W.jsxs)(`dd`,{children:[`完全一致`,(0,W.jsx)(`small`,{children:`同一任务、参数和项目资料`})]})]})]})]})}function Le({targets:e,defaultTargetIds:t,initialPrompt:n,projectName:r,fileCount:i,memoryCount:a,execute:o,adopt:s}){let[c,l]=(0,U.useState)(()=>new Set(t)),[u,d]=(0,U.useState)(n),[f,p]=(0,U.useState)([]),[m,h]=(0,U.useState)(Ne),[g,_]=(0,U.useState)(!1),v=(0,U.useRef)(null),y=(0,U.useMemo)(()=>e.filter(e=>c.has(e.id)),[e,c]);(0,U.useEffect)(()=>()=>v.current?.abort(),[]);let b=(e,t)=>{let n=new Set(c);if(t){if(n.size>=4){w(`一次最多实验 4 个模型`,`error`);return}n.add(e)}else n.delete(e);l(n)},x=async()=>{if(g){v.current?.abort();return}let e=u.trim();if(!e){w(`请输入实验任务`,`error`);return}if(y.length<2){w(`至少选择两个模型`,`error`);return}_(!0),p(y.map(e=>({...e,status:`running`})));let t=new AbortController;v.current=t;try{let n=await Promise.all(y.map(async n=>{let r=await o(n,e,t.signal);return p(e=>e.map(e=>e.id===n.id?r:e)),r}));n.some(e=>e.status===`success`)&&h(Pe(e,r,n))}finally{v.current===t&&(v.current=null),_(!1)}};return(0,W.jsxs)(`div`,{className:`compare-lab`,children:[(0,W.jsxs)(`div`,{className:`compare-intro`,children:[(0,W.jsx)(`div`,{children:(0,W.jsx)(`p`,{children:`同一任务、同一上下文,并行观察不同模型的答案。`})}),(0,W.jsxs)(`span`,{className:`compare-context`,children:[i,` 个文件 · `,a,` 条记忆`]})]}),(0,W.jsxs)(`div`,{className:`compare-config`,children:[(0,W.jsxs)(`fieldset`,{className:`compare-targets`,children:[(0,W.jsx)(`legend`,{children:`参与模型`}),e.map(e=>(0,W.jsxs)(`label`,{children:[(0,W.jsx)(`input`,{type:`checkbox`,checked:c.has(e.id),disabled:g,onChange:t=>b(e.id,t.target.checked)}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:e.model}),(0,W.jsx)(`small`,{children:e.providerName})]})]},e.id))]}),(0,W.jsx)(`label`,{className:`compare-prompt-label`,htmlFor:`comparePrompt`,children:`实验任务`}),(0,W.jsx)(`textarea`,{id:`comparePrompt`,className:`compare-prompt`,rows:3,placeholder:`输入要交给多个模型的相同任务…`,value:u,onChange:e=>d(e.target.value)}),(0,W.jsxs)(`div`,{className:`compare-actions`,children:[(0,W.jsxs)(`span`,{children:[`已选择 `,y.length,` 个模型`]}),(0,W.jsx)(`button`,{className:`btn-primary${g?` is-stopping`:``}`,type:`button`,disabled:!g&&y.length<2,onClick:()=>void x(),children:g?`停止实验`:f.length?`再次实验`:`开始实验`})]})]}),(0,W.jsx)(`div`,{className:`compare-results`,children:f.map(e=>(0,W.jsx)(Fe,{result:e,prompt:u.trim(),adopt:s},e.id))}),(0,W.jsx)(Ie,{results:f}),(0,W.jsxs)(`details`,{className:`compare-history`,open:!m.length,children:[(0,W.jsxs)(`summary`,{children:[(0,W.jsx)(`span`,{children:`历史实验`}),(0,W.jsxs)(`small`,{children:[m.length,` 条,保存在当前设备`]})]}),(0,W.jsx)(`div`,{children:m.length?m.map(e=>{let t=new Date(e.createdAt),n=Number.isNaN(t.getTime())?``:t.toLocaleString(`zh-CN`,{month:`numeric`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}),r=e.results.filter(e=>e.status===`success`).length;return(0,W.jsxs)(`button`,{type:`button`,className:`compare-history-item`,onClick:()=>{d(e.prompt),p(e.results)},children:[(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`strong`,{children:e.prompt}),(0,W.jsxs)(`small`,{children:[e.projectName,` · `,r,` 个结果`]})]}),(0,W.jsx)(`time`,{children:n})]},e.id)}):(0,W.jsx)(`div`,{className:`compare-history-empty`,children:`完成一次实验后,结果会保存在当前设备。`})})]})]})}function Re(e){return(0,W.jsxs)(`div`,{className:`settings-page experiment-settings`,children:[(0,W.jsx)(`div`,{className:`settings-page-heading`,children:(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`div`,{className:`usage-kicker`,children:`MODEL ARENA`}),(0,W.jsx)(`h3`,{children:`模型竞技场`}),(0,W.jsx)(`p`,{children:`用同一个任务、参数和项目上下文并行观察结果;首页和普通对话始终只运行当前主模型。`})]})}),e.targets.length<2&&(0,W.jsxs)(`div`,{className:`experiment-requirement`,children:[(0,W.jsx)(`strong`,{children:`还需要一个模型`}),(0,W.jsx)(`span`,{children:`至少连接两个模型后才能进行公平的并行实验。`})]}),(0,W.jsx)(Le,{...e})]})}var J=null;function ze(e=`general`){let t=l(`#settings`);t.classList.contains(`open`)||(J=document.activeElement instanceof HTMLElement?document.activeElement:null),t.inert=!1,t.setAttribute(`aria-hidden`,`false`),t.classList.add(`open`),l(`#scrim`).classList.add(`open`),X(e),l(`#settingsBody`)?.focus?.({preventScroll:!0}),l(`#app`).inert=!0;let n=`#/settings/${encodeURIComponent(e)}`;location.hash!==n&&history.pushState(null,``,n)}function Y(){let e=l(`#settings`);if(!e.classList.contains(`open`))return;let t=l(`#app`);t.inert=!1;let n=l(`#settingsBtn`),r=J?.isConnected&&t.contains(J)?J:n;try{r?.focus?.({preventScroll:!0})}catch{r?.focus?.()}e.contains(document.activeElement)&&n?.focus?.({preventScroll:!0}),e.classList.remove(`open`),e.inert=!0,e.setAttribute(`aria-hidden`,`true`),l(`#scrim`).classList.remove(`open`),J=null,window.dispatchEvent(new CustomEvent(`multichat:settingschange`,{detail:{open:!1}})),location.hash.startsWith(`#/settings/`)&&history.replaceState(null,``,m.currentConvId?`#/chat/${encodeURIComponent(m.currentConvId)}`:`#/new`)}l(`#scrim`).onclick=Y,l(`#closeSettings`).onclick=Y,l(`#closeSettingsTop`).onclick=Y,document.addEventListener(`keydown`,e=>{let t=l(`#settings`);if(!t.classList.contains(`open`)||l(`#modal`).classList.contains(`open`))return;if(e.key===`Escape`){Y();return}if(e.key!==`Tab`)return;let n=Array.from(t.querySelectorAll(`input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [href], [tabindex="0"]`)).filter(e=>e.offsetParent!==null);if(!n.length){e.preventDefault(),l(`#settingsBody`)?.focus();return}let r=n[0],i=n[n.length-1];e.shiftKey&&document.activeElement===r?(e.preventDefault(),i.focus()):!e.shiftKey&&document.activeElement===i&&(e.preventDefault(),r.focus())}),r(`.settings-tab[data-tab]`).forEach(e=>e.onclick=()=>X(e.dataset.tab));function X(e){if(m.currentTab=e,r(`.settings-tab[data-tab]`).forEach(t=>t.classList.toggle(`active`,t.dataset.tab===e)),Ve(e),window.dispatchEvent(new CustomEvent(`multichat:settingschange`,{detail:{open:!0,tab:e}})),l(`#settings`).classList.contains(`open`)){let t=`#/settings/${encodeURIComponent(e)}`;location.hash!==t&&history.replaceState(null,``,t)}e===`usage`?ie(m.usageRange):e===`capabilities`&&j()}var Be=[`general`,`workspace`,`providers`,`agents`,`experiment`,`skills`,`tools`,`mcp`,`plugins`,`capabilities`,`runs`,`usage`];function Ve(e=`general`,t=!1){let n=Be.includes(e)?e:`general`,r=l(`#settingsBody`);_e();let i=t?r.scrollTop:0;if(n===`general`)z(be,{params:m.params,theme:x(),token:v(),onSaveParams:e=>{m.params=e,y(),w(`已保存`)},onTheme:e=>{S(e),w(`主题已切换`)},onSaveToken:e=>{p(e),w(e.trim()?`访问令牌已保存`:`访问令牌已清除`)}});else if(n===`providers`)z(Se,{providers:m.providers,onSave:async(e,t)=>{try{return await f(`/api/providers/${encodeURIComponent(e.id)}`,{method:`PUT`,body:JSON.stringify(t)}),await P(),R(),w(`已保存`),!0}catch(e){return w(e.message,`error`),!1}},onDelete:async e=>{if(!await showConfirm({title:`删除模型提供方`,message:`删除「${e.name||e.id}」?此操作不可撤销。`,confirmLabel:`删除`,danger:!0}))return!1;try{return await f(`/api/providers/${encodeURIComponent(e.id)}`,{method:`DELETE`}),await P(),R(),w(`已删除`),!0}catch(e){return w(e.message,`error`),!1}},onAddBuiltin:ue,onAddCustom:de,onProbe:async e=>f(`/api/providers/${encodeURIComponent(e.id)}/probe`,{method:`POST`,body:JSON.stringify({})})});else if(n===`experiment`){let e=D(),t=[m.selectedProvider&&m.selectedModel?`${m.selectedProvider.id}:${m.selectedModel}`:``,...e.map(e=>e.id)].filter(Boolean).filter((e,t,n)=>n.indexOf(e)===t).slice(0,2),n=localStorage.getItem(`multichat_compare_draft`)||``,r=n||[...m.messages||[]].reverse().find(e=>e.role===`user`)?.content||``;n&&localStorage.removeItem(`multichat_compare_draft`),z(Re,{targets:e,defaultTargetIds:t,initialPrompt:r,projectName:m.selectedProject?.name||`未选择项目`,fileCount:m.selectedAssetIds?.size||0,memoryCount:(m.memories||[]).filter(e=>e.enabled!==!1).length,execute:O,adopt:async(e,t)=>{await E(e,t),Y(),window.requestAnimationFrame(()=>l(`#input`)?.focus())}})}else n===`skills`?z(Ce,{initialSkills:m.skills,sourceLabel:ge,onToggle:async e=>{try{return await f(`/api/skills/${encodeURIComponent(e.key||e.id)}/toggle`,{method:`POST`,body:JSON.stringify({enabled:!e.enabled})}),await ne(),!0}catch(e){return w(e.message,`error`),!1}},onEdit:e=>F(e.key||e.id),onDiff:async e=>{try{he(`Skill 变更`,await f(`/api/skills/${encodeURIComponent(e.key||e.id)}/diff`))}catch(e){w(e.message,`error`)}},onDelete:async e=>{if(!await showConfirm({title:`删除 Skill`,message:`删除该 Skill?关联运行配置的引用也将被移除。`,confirmLabel:`删除`,danger:!0}))return!1;try{return await f(`/api/skills/${encodeURIComponent(e.key||e.id)}`,{method:`DELETE`}),await Promise.all([ne(),A()]),!0}catch(e){return w(e.message,`error`),!1}},onImport:()=>oe(`skill`),onAdd:()=>F(null)}):n===`tools`?z(we,{initialTools:m.tools,agents:m.agents,onTest:async(e,t)=>f(`/api/tools/${encodeURIComponent(e.id)}/test`,{method:`POST`,body:JSON.stringify(t===void 0?{}:{expression:t})}),onToggle:async e=>{try{return await f(`/api/tools/${encodeURIComponent(e.id)}`,{method:`PUT`,body:JSON.stringify({enabled:!e.enabled})}),await re(),w(e.enabled?`工具已停用`:`工具已启用`),!0}catch(e){return w(e.message,`error`),!1}}}):n===`workspace`?He():n===`agents`?Ue():n===`plugins`?me():n===`mcp`?pe():n===`capabilities`?Z():n===`usage`?Ge():n===`runs`&&Ke();t&&requestAnimationFrame(()=>{r.scrollTop=Math.min(i,Math.max(0,r.scrollHeight-r.clientHeight))})}function He(){z(Te,{onProjectChange:async e=>{m.selectedProject=m.projects.find(t=>t.id===e)||null,m.selectedProject&&localStorage.setItem(`multichat_project`,m.selectedProject.id),await N(),R(),ve(),k()},onSaveDefaults:async(e,t,n)=>{if(!m.selectedProject)w(`请先选择项目`,`error`);else try{await f(`/api/projects/${encodeURIComponent(m.selectedProject.id)}`,{method:`PUT`,body:JSON.stringify({defaultAgentId:e,defaultProviderId:t,defaultModel:n})});let r={...m.selectedProject,defaultAgentId:e,defaultProviderId:t,defaultModel:n};m.selectedProject=r,m.projects=m.projects.map(e=>e.id===r.id?r:e),ee(),w(`已保存项目默认`)}catch(e){w(e.message,`error`)}},onNewProject:Je,onImportFolder:T,onImportUrl:Ye,onUploadFile:async e=>{if(m.selectedProject)try{await f(`/api/assets`,{method:`POST`,body:JSON.stringify({projectId:m.selectedProject.id,name:e.name,mimeType:e.type||`text/plain`,content:await e.text()})}),await N(),w(`文件已加入项目`)}catch(e){w(e.message,`error`)}},onDeleteAsset:async e=>{try{await f(`/api/assets/${encodeURIComponent(e)}`,{method:`DELETE`}),await N()}catch(e){w(e.message,`error`)}},onSearch:async e=>m.selectedProject?f(`/api/projects/${encodeURIComponent(m.selectedProject.id)}/search?q=${encodeURIComponent(e)}`):[],onAddMemory:()=>Q(),onEditMemory:e=>Q(e),onToggleMemory:async e=>{await f(`/api/memories/${encodeURIComponent(e.id)}`,{method:`PUT`,body:JSON.stringify({enabled:e.enabled===!1})}),await M()},onDeleteMemory:async e=>{await showConfirm({title:`删除项目记忆`,message:`删除这条项目记忆?`,confirmLabel:`删除`,danger:!0})&&(await f(`/api/memories/${encodeURIComponent(e)}`,{method:`DELETE`}),await M())},onCreateSnapshot:async()=>{if(!m.selectedProject)return;let e=await showPrompt({title:`新建项目快照`,label:`快照名称`,value:`项目快照 ${new Date().toLocaleString(`zh-CN`)}`,maxLength:120});if(e!=null)try{await f(`/api/snapshots`,{method:`POST`,body:JSON.stringify({projectId:m.selectedProject.id,title:e})}),await M(),w(`项目快照已创建`)}catch(e){w(e.message,`error`)}},onRestoreSnapshot:async e=>{if(await showConfirm({title:`恢复快照`,message:`恢复该快照?当前状态会先自动备份,随后替换项目文件、记忆和默认配置。`,confirmLabel:`恢复快照`,danger:!0}))try{await f(`/api/snapshots/${encodeURIComponent(e)}/restore`,{method:`POST`}),await Promise.all([N(),A()]),k(),w(`快照已恢复`)}catch(e){w(e.message,`error`)}},onDeleteSnapshot:async e=>{await showConfirm({title:`删除项目快照`,message:`删除该项目快照?`,confirmLabel:`删除`,danger:!0})&&(await f(`/api/snapshots/${encodeURIComponent(e)}`,{method:`DELETE`}),await M())}})}function Ue(){z(Ee,{onEdit:e=>fe(e),onExport:e=>ce(e,`agent`),onDelete:async e=>{if(await showConfirm({title:`删除运行配置`,message:`删除该运行配置?`,confirmLabel:`删除`,danger:!0})){try{await f(`/api/agents/${encodeURIComponent(e.id)}`,{method:`DELETE`})}catch(e){w(e.message,`error`);return}m.selectedAgent?.id===e.id&&(m.selectedAgent=null),h(),await A(),R()}},onImport:async e=>{try{await se(le(JSON.parse(await e.text())),`文件 ${e.name}`)}catch(e){w(`解析失败:${e.message}`,`error`)}}})}function Z(){z(Oe,{onRefresh:async()=>{m.capabilities=null,await j()}})}function We(e,t){let n=[[`date`,`input_tokens`,`output_tokens`,`total_tokens`,`requests`,`errors`],...(e?.daily||[]).map(e=>[e.date,e.inputTokens,e.outputTokens,e.totalTokens,e.requests,e.errors])],r=new Blob([n.map(e=>e.join(`,`)).join(`
2
+ `)],{type:`text/csv;charset=utf-8`}),i=document.createElement(`a`);i.href=URL.createObjectURL(r),i.download=`multichat-usage-${t}d.csv`,i.click(),setTimeout(()=>URL.revokeObjectURL(i.href),1e3)}function Ge(){z(Ae,{onRange:async e=>{m.usage=null,await ie(e)},onExport:We})}function Ke(){z(je,{onRefresh:te,onOpen:$})}function qe(){L({title:`新建工作区`,body:`<form id="workspaceForm"><div class="field"><label>名称</label><input name="name" required placeholder="例如:产品研发" /></div><div class="field"><label>描述</label><input name="description" placeholder="这个工作区用于什么" /></div><div class="row"><button type="button" class="btn-ghost" id="workspaceCancel">取消</button><button class="btn-primary" type="submit">创建</button></div></form>`,onMount:e=>{l(`#workspaceCancel`,e).onclick=I,l(`#workspaceForm`,e).onsubmit=async e=>{e.preventDefault();let t=Object.fromEntries(new FormData(e.target).entries());try{await f(`/api/workspaces`,{method:`POST`,body:JSON.stringify(t)}),await ae(),R(),I(),w(`工作区已创建`)}catch(e){w(e.message,`error`)}}}})}function Q(e=null){let t=e?m.memories.find(t=>t.id===e):null;L({title:t?`编辑项目记忆`:`新增项目记忆`,body:`<form id="memoryForm"><div class="field"><label>标题</label><input name="title" required maxlength="120" value="${C(t?.title||``)}" placeholder="例如:代码风格" /></div><div class="field"><label>事实或偏好</label><textarea name="content" required maxlength="4000" rows="6" placeholder="只记录可长期复用、由你确认的信息。">${C(t?.content||``)}</textarea><div class="pmeta">记忆作为上下文参考,不会被当作可执行指令。</div></div><div id="memoryErr" class="auth-error"></div><div class="row"><button type="button" class="btn-ghost" id="memoryCancel">取消</button><button class="btn-primary" type="submit">保存</button></div></form>`,onMount:e=>{l(`#memoryCancel`,e).onclick=I,l(`#memoryForm`,e).onsubmit=async n=>{n.preventDefault();let r={...Object.fromEntries(new FormData(n.target).entries()),projectId:m.selectedProject?.id,enabled:!t||t.enabled!==!1};try{await f(t?`/api/memories/${encodeURIComponent(t.id)}`:`/api/memories`,{method:t?`PUT`:`POST`,body:JSON.stringify(r)}),await M(),I(),w(`项目记忆已保存`)}catch(t){l(`#memoryErr`,e).textContent=t.message}}}})}function Je(){if(!m.selectedWorkspace)return w(`请先选择工作区`,`error`);L({title:`新建项目`,body:`<form id="projectForm"><div class="field"><label>名称</label><input name="name" required placeholder="例如:移动端重构" /></div><div class="field"><label>描述</label><input name="description" placeholder="项目目标或范围" /></div><div class="row"><button type="button" class="btn-ghost" id="projectCancel">取消</button><button class="btn-primary" type="submit">创建</button></div></form>`,onMount:e=>{l(`#projectCancel`,e).onclick=I,l(`#projectForm`,e).onsubmit=async e=>{e.preventDefault();let t=Object.fromEntries(new FormData(e.target).entries());t.workspaceId=m.selectedWorkspace.id;try{await f(`/api/projects`,{method:`POST`,body:JSON.stringify(t)}),await N(),I(),w(`项目已创建`)}catch(e){w(e.message,`error`)}}}})}function Ye(){if(!m.selectedProject)return w(`请先选择项目`,`error`);L({title:`从 URL 添加文件`,body:`<form id="assetUrlForm"><div class="field"><label>URL</label><input name="url" type="url" required placeholder="https://example.com/notes.md" /></div><div class="field"><label>显示名称(可选)</label><input name="name" placeholder="自动从 URL 推断" /></div><div id="assetUrlErr" class="auth-error"></div><div class="row"><button type="button" class="btn-ghost" id="assetUrlCancel">取消</button><button class="btn-primary" type="submit">添加</button></div></form>`,onMount:e=>{l(`#assetUrlCancel`,e).onclick=I,l(`#assetUrlForm`,e).onsubmit=async t=>{t.preventDefault();let n=Object.fromEntries(new FormData(t.target).entries());n.projectId=m.selectedProject.id;try{await f(`/api/assets`,{method:`POST`,body:JSON.stringify(n)}),await N(),I(),w(`远程文件已加入项目`)}catch(t){l(`#assetUrlErr`,e).textContent=t.message}}}})}async function $(e){try{let t=await f(`/api/runs/${encodeURIComponent(e)}`),n=(t.turns||[]).flatMap(e=>e.steps||[]),r=t.contextManifest||{},i=t.usage||{},a=(e,t)=>`<span><small>${C(e)}</small><strong>${C(t)}</strong></span>`,o=t.status===`completed`?`已完成`:t.status===`error`?`失败`:t.status===`cancelled`?`已取消`:`运行中`;L({title:`运行详情 · ${t.agentName||t.agentId}`,body:`<div class="run-detail-summary">${a(`状态`,o)}${a(`模型`,t.model||`—`)}${a(`Token`,G(i.totalTokens||0))}${a(`步骤`,String(n.length))}${a(`策略`,t.toolPolicy===`safe`?`安全`:`自动`)}</div><div class="run-detail-grid"><section><h4>执行时间线</h4><div class="flight-timeline">${n.map((e,t)=>`<article class="flight-step ${C(e.status)}"><i>${t+1}</i><div><strong>${e.kind===`tool_call`?C(e.tool||`工具调用`):`模型请求 · ${C(e.model||``)}`}</strong><p>${e.kind===`tool_call`?`${C((e.permissions||[]).join(`, `)||`无特殊权限`)} · ${C(e.risk||`low`)}`:`${e.messageCount||0} 条上下文 · ${G(e.usage?.total||0)} tokens`}</p>${e.error?`<code>${C(e.error)}</code>`:``}</div><span>${e.durationMs==null?C(e.status):`${(e.durationMs/1e3).toFixed(2)}s`}</span></article>`).join(``)||`<div class="control-empty">没有步骤轨迹。</div>`}</div></section><section><h4>上下文透镜</h4><div class="context-lens"><div><span>消息</span><strong>${r.messages||0}</strong></div><div><span>系统上下文</span><strong>${G(r.systemCharacters||0)} 字</strong></div><div><span>项目文件</span><strong>${(r.assets||[]).length}</strong></div><div><span>记忆</span><strong>${(r.memories||[]).length}</strong></div></div><div class="context-source"><h5>注入来源</h5>${[[`文件`,r.assets],[`记忆`,r.memories],[`Skills`,r.skills],[`工具`,r.tools],[`MCP`,r.mcpServers]].map(([e,t])=>`<div><strong>${e}</strong><span>${(t||[]).map(e=>C(e.name||e.id)).join(`、`)||`无`}</span></div>`).join(``)}</div><div class="context-source"><h5>Token 构成</h5><div><strong>输入</strong><span>${G(i.inputTokens||0)}</span></div><div><strong>输出</strong><span>${G(i.outputTokens||0)}</span></div><div><strong>缓存</strong><span>${G(i.cachedTokens||0)}</span></div><div><strong>估算</strong><span>${G(i.estimatedTokens||0)}</span></div></div></section></div><div class="row"><button class="btn-ghost" id="exportRun">导出运行快照</button><button class="btn-primary" id="closeRunDetail">关闭</button></div>`,onMount:e=>{e.classList.add(`run-detail-modal`),l(`#closeRunDetail`,e).onclick=I,l(`#exportRun`,e).onclick=()=>{let e=new Blob([JSON.stringify(t,null,2)],{type:`application/json`}),n=document.createElement(`a`);n.href=URL.createObjectURL(e),n.download=`${t.id}.json`,n.click(),setTimeout(()=>URL.revokeObjectURL(n.href),1e3)}}})}catch(e){w(e.message,`error`)}}export{Y as closeSettings,ze as openSettings,Z as renderCapabilities,Ke as renderRuns,Ve as renderSettings,Ge as renderUsage,Ye as showAssetUrlModal,Q as showMemoryModal,Je as showProjectForm,$ as showRunDetail,qe as showWorkspaceForm,X as switchSettingsTab};
@@ -1 +1 @@
1
- import{p as e}from"./index-CASVCOUO.js";function t(){let t=e(`#sidebar`),n=e(`#sidebarToggle`),r=e(`#sidebarClose`),i=e(`#mobileScrim`),a=e(`.main`);if(!t||!n||!i)return;let o=(e=!1)=>{a&&(a.inert=!1),e&&n.focus({preventScroll:!0}),t.classList.remove(`open`),i.classList.remove(`open`),n.setAttribute(`aria-expanded`,`false`),document.body.classList.remove(`mobile-nav-open`)},s=()=>{t.classList.add(`open`),i.classList.add(`open`),n.setAttribute(`aria-expanded`,`true`),document.body.classList.add(`mobile-nav-open`);let r=e(`#convSearch`);r&&r.focus({preventScroll:!0}),a&&(a.inert=!0)};n.onclick=()=>t.classList.contains(`open`)?o(!0):s(),r&&(r.onclick=()=>o(!0)),i.onclick=()=>o(!0),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&t.classList.contains(`open`)&&o(!0)}),window.addEventListener(`resize`,()=>{window.innerWidth>760&&o()})}export{t as setupShell};
1
+ import{S as e}from"./index-BaUGyQ3C.js";function t(){let t=e(`#sidebar`),n=e(`#sidebarToggle`),r=e(`#sidebarClose`),i=e(`#mobileScrim`),a=e(`.main`);if(!t||!n||!i)return;let o=(e=!1)=>{a&&(a.inert=!1),e&&n.focus({preventScroll:!0}),t.classList.remove(`open`),i.classList.remove(`open`),n.setAttribute(`aria-expanded`,`false`),document.body.classList.remove(`mobile-nav-open`)},s=()=>{t.classList.add(`open`),i.classList.add(`open`),n.setAttribute(`aria-expanded`,`true`),document.body.classList.add(`mobile-nav-open`);let r=e(`#convSearch`);r&&r.focus({preventScroll:!0}),a&&(a.inert=!0)};n.onclick=()=>t.classList.contains(`open`)?o(!0):s(),r&&(r.onclick=()=>o(!0)),i.onclick=()=>o(!0),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&t.classList.contains(`open`)&&o(!0)}),window.addEventListener(`resize`,()=>{window.innerWidth>760&&o()})}export{t as setupShell};