@wu529778790/open-im 1.11.10-beta.1 → 1.11.10-beta.3

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.
@@ -1,4 +1,4 @@
1
- import { getConfiguredAiCommands } from '../config.js';
1
+ import { getConfiguredAiCommands, loadConfig } from '../config.js';
2
2
  import { ClaudeSDKAdapter } from './claude-sdk-adapter.js';
3
3
  import { CodexAdapter } from './codex-adapter.js';
4
4
  import { CodeBuddyAdapter } from './codebuddy-adapter.js';
@@ -37,7 +37,32 @@ export function initAdapters(config) {
37
37
  }
38
38
  }
39
39
  export function getAdapter(aiCommand) {
40
- return adapters.get(aiCommand);
40
+ const existing = adapters.get(aiCommand);
41
+ if (existing)
42
+ return existing;
43
+ // 懒加载:启动时未初始化的工具(例如启动用 claude,运行中切到 opencode)
44
+ // 按需创建并缓存,避免返回 undefined 导致消息处理失败。
45
+ const factory = ADAPTER_FACTORIES[aiCommand];
46
+ if (!factory)
47
+ return undefined;
48
+ let config;
49
+ try {
50
+ config = loadConfig();
51
+ }
52
+ catch (err) {
53
+ log.error(`Lazy-create adapter "${aiCommand}" failed to load config:`, err);
54
+ return undefined;
55
+ }
56
+ const adapter = factory(config);
57
+ adapters.set(aiCommand, adapter);
58
+ log.info(`${aiCommand} adapter lazy-created (was not enabled at startup)`);
59
+ // SDK 工具需要懒启动 server,与 initAdapters 行为一致
60
+ if (aiCommand === 'opencode' && !isOpencodeRunning()) {
61
+ startOpencode().catch((err) => {
62
+ log.warn(`OpenCode SDK server lazy-start failed (will retry on first use): ${err}`);
63
+ });
64
+ }
65
+ return adapter;
41
66
  }
42
67
  export function cleanupAdapters() {
43
68
  ClaudeSDKAdapter.destroy();
@@ -31,6 +31,7 @@ export declare class CommandHandler {
31
31
  private handleNew;
32
32
  private handlePwd;
33
33
  private handleStatus;
34
+ private handleSwitchAi;
34
35
  private handleCd;
35
36
  private handleHistory;
36
37
  private handleDelete;
@@ -1,10 +1,10 @@
1
- import { resolvePlatformAiCommand } from '../config.js';
1
+ import { resolvePlatformAiCommand, loadConfig, loadFileConfig, saveFileConfig, } from '../config.js';
2
2
  import { escapePathForMarkdown } from '../shared/utils.js';
3
3
  import { getAutopilotPendingStatus } from '../shared/ai-task.js';
4
4
  import { TERMINAL_ONLY_COMMANDS } from '../constants.js';
5
5
  import { createLogger } from '../logger.js';
6
6
  import { ClaudeSDKAdapter } from '../adapters/claude-sdk-adapter.js';
7
- import { AI_TOOL_BY_ID } from '../adapters/tool-registry.js';
7
+ import { AI_TOOL_BY_ID, AI_TOOLS, isAiCommand } from '../adapters/tool-registry.js';
8
8
  const log = createLogger('Commands');
9
9
  function formatRelativeTime(ts) {
10
10
  const sec = Math.floor((Date.now() - ts) / 1000);
@@ -104,6 +104,8 @@ export class CommandHandler {
104
104
  return this.handlePwd(chatId, userId);
105
105
  if (t === '/status')
106
106
  return this.handleStatus(chatId, userId, platform);
107
+ if (t === '/a' || t.startsWith('/a '))
108
+ return this.handleSwitchAi(chatId, t.slice(2).trim(), platform);
107
109
  if (t === '/autopilot')
108
110
  return this.handleAutopilotStatus(chatId, userId);
109
111
  // 快捷命令 — 直接发送预设 prompt 给 AI
@@ -182,6 +184,7 @@ export class CommandHandler {
182
184
  '/plugins - 查看已安装插件',
183
185
  '/context - 查看上下文窗口占用',
184
186
  '/status - 显示状态',
187
+ '/a [工具名] - 查看或切换 AI 工具(claude/codex/codebuddy/opencode)',
185
188
  '/cd <路径> - 切换工作目录',
186
189
  '/pwd - 当前工作目录',
187
190
  '/autopilot - 查看限流自动恢复状态',
@@ -289,7 +292,9 @@ export class CommandHandler {
289
292
  return true;
290
293
  }
291
294
  async handleStatus(chatId, userId, platform) {
292
- const aiCommand = resolvePlatformAiCommand(this.deps.config, platform);
295
+ // 重新读取配置,使 /a 切换后立即反映新工具(与 AI 请求路径一致)
296
+ const config = loadConfig();
297
+ const aiCommand = resolvePlatformAiCommand(config, platform);
293
298
  const version = await this.getAiVersion(aiCommand);
294
299
  const workDir = this.deps.sessionManager.getWorkDir(userId);
295
300
  const convId = this.deps.sessionManager.getConvId(userId);
@@ -319,6 +324,45 @@ export class CommandHandler {
319
324
  await this.replySender().sendTextReply(chatId, lines.join('\n'));
320
325
  return true;
321
326
  }
327
+ async handleSwitchAi(chatId, arg, platform) {
328
+ // 无参数:显示当前工具 + 可选列表
329
+ if (!arg) {
330
+ const current = resolvePlatformAiCommand(loadConfig(), platform);
331
+ const lines = ['🔄 切换 AI 工具:', '', `当前 (${platform}): ${current}`, '', '可选:'];
332
+ for (const tool of AI_TOOLS) {
333
+ const mark = tool.id === current ? ' (当前)' : '';
334
+ lines.push(` /a ${tool.id} - ${tool.label}${mark}`);
335
+ }
336
+ lines.push('', '用法: /a <工具名>');
337
+ await this.replySender().sendTextReply(chatId, lines.join('\n'));
338
+ return true;
339
+ }
340
+ // 校验工具名
341
+ if (!isAiCommand(arg)) {
342
+ const valid = AI_TOOLS.map((t) => t.id).join(', ');
343
+ await this.replySender().sendTextReply(chatId, `❌ 未知工具: ${arg}\n\n可选: ${valid}`);
344
+ return true;
345
+ }
346
+ // 持久化到 config.json(load→mutate→save 模式,与 saveKeepaliveConfig 一致)
347
+ try {
348
+ const file = loadFileConfig();
349
+ if (!file.platforms)
350
+ file.platforms = {};
351
+ // 所有平台配置都含 aiCommand?: AiCommand,按此最小契约写入即可
352
+ const platforms = file.platforms;
353
+ const platCfg = platforms[platform] ?? {};
354
+ platCfg.aiCommand = arg;
355
+ platforms[platform] = platCfg;
356
+ saveFileConfig(file);
357
+ const label = AI_TOOL_BY_ID[arg]?.label ?? arg;
358
+ await this.replySender().sendTextReply(chatId, `✅ 已将 ${platform} 的 AI 工具切换为 ${label} (${arg})\n下一条消息生效,无需重启。`);
359
+ }
360
+ catch (err) {
361
+ log.error('Failed to switch aiCommand:', err);
362
+ await this.replySender().sendTextReply(chatId, '❌ 切换失败,请查看日志。');
363
+ }
364
+ return true;
365
+ }
322
366
  async handleCd(chatId, userId, dir, _platform) {
323
367
  // 如果 dir 为空,显示目录选择界面
324
368
  if (!dir) {
@@ -11,7 +11,7 @@
11
11
  * 4. Start typing indicator
12
12
  * 5. Run AI task via runAITask with platform-specific callbacks
13
13
  */
14
- import { resolvePlatformAiCommand } from '../config.js';
14
+ import { resolvePlatformAiCommand, loadConfig } from '../config.js';
15
15
  import { getAdapter } from '../adapters/registry.js';
16
16
  import { runAITask } from '../shared/ai-task.js';
17
17
  import { createLogger } from '../logger.js';
@@ -27,10 +27,20 @@ const log = createLogger('PlatformAI');
27
27
  * 5. run AI task with platform callbacks
28
28
  */
29
29
  export function createPlatformAIRequestHandler(deps) {
30
- const { platform, config, sessionManager, sender, throttleMs, runningTasks, minContentDeltaChars, taskKeyBuilder, onThinkingToText, extraInit, taskCallbacks, taskCallbacksFactory, } = deps;
30
+ const { platform, config: initialConfig, sessionManager, sender, throttleMs, runningTasks, minContentDeltaChars, taskKeyBuilder, onThinkingToText, extraInit, taskCallbacks, taskCallbacksFactory, } = deps;
31
31
  async function handleAIRequest(params) {
32
32
  const { userId, chatId, prompt, workDir, convId, replyToMessageId, signal } = params;
33
33
  log.info(`[${platform}] AI request: userId=${userId}, chatId=${chatId}, promptLength=${prompt.length}`);
34
+ // 每条消息重新读取配置,使平台 aiCommand 的修改无需重启即可生效。
35
+ // loadFileConfig 有 mtime 缓存,文件未变时几乎零开销;变更后自动返回新值。
36
+ let config;
37
+ try {
38
+ config = loadConfig();
39
+ }
40
+ catch (err) {
41
+ log.warn(`[${platform}] Failed to reload config, using startup snapshot:`, err);
42
+ config = initialConfig;
43
+ }
34
44
  // 1. Resolve AI command and adapter
35
45
  const aiCommand = resolvePlatformAiCommand(config, platform);
36
46
  const toolAdapter = getAdapter(aiCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wu529778790/open-im",
3
- "version": "1.11.10-beta.1",
3
+ "version": "1.11.10-beta.3",
4
4
  "description": "Your AI coding assistant, in every chat app. Multi-platform IM bridge for Claude Code, Codex, and CodeBuddy.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1 +1 @@
1
- @import"https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap";:root{--c-bg: #fafafa;--c-surface: #ffffff;--c-surface-alt: #f5f5f5;--c-border: #e5e5e5;--c-border-foc: #a3a3a3;--c-text: #1a1a2e;--c-text-2: #525252;--c-text-3: #a3a3a3;--c-accent: #6366f1;--c-accent-h: #4f46e5;--c-accent-bg: #eef2ff;--c-accent-bdr: #c7d2fe;--c-ok: #10b981;--c-ok-bg: #ecfdf5;--c-ok-bdr: #a7f3d0;--c-warn: #f59e0b;--c-warn-bg: #fffbeb;--c-warn-bdr: #fde68a;--c-err: #ef4444;--c-err-bg: #fef2f2;--c-err-bdr: #fecaca;--shadow-xs: 0 1px 2px rgba(0,0,0,.05);--shadow-s: 0 1px 3px rgba(0,0,0,.1), 0 1px 2px rgba(0,0,0,.06);--shadow-m: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -2px rgba(0,0,0,.1);--shadow-l: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -4px rgba(0,0,0,.1);--shadow-glow: 0 0 20px rgba(99,102,241,.15);--r-s: 6px;--r-m: 8px;--r-l: 12px;--r-xl: 16px;--font-display: "Space Grotesk", -apple-system, sans-serif;--font-body: "Inter", -apple-system, sans-serif;--font-mono: "JetBrains Mono", "SF Mono", monospace;--fast: .12s ease;--norm: .2s ease;--slow: .3s ease}:root.dark{--c-bg: #0a0a0f;--c-surface: #141418;--c-surface-alt: #1e1e24;--c-border: #2a2a32;--c-border-foc: #52525e;--c-text: #f0f0f5;--c-text-2: #a0a0ae;--c-text-3: #5a5a68;--c-accent: #818cf8;--c-accent-h: #6366f1;--c-accent-bg: rgba(99,102,241,.12);--c-accent-bdr: rgba(99,102,241,.3);--c-ok-bg: rgba(16,185,129,.12);--c-ok-bdr: rgba(16,185,129,.3);--c-warn-bg: rgba(245,158,11,.12);--c-warn-bdr: rgba(245,158,11,.3);--c-err-bg: rgba(239,68,68,.12);--c-err-bdr: rgba(239,68,68,.3);--shadow-xs: 0 1px 2px rgba(0,0,0,.3);--shadow-s: 0 1px 3px rgba(0,0,0,.4), 0 1px 2px rgba(0,0,0,.3);--shadow-m: 0 4px 6px -1px rgba(0,0,0,.4), 0 2px 4px -2px rgba(0,0,0,.3);--shadow-l: 0 10px 15px -3px rgba(0,0,0,.4), 0 4px 6px -4px rgba(0,0,0,.3);--shadow-glow: 0 0 20px rgba(129,140,248,.2)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--font-body);font-size:14px;line-height:1.5;color:var(--c-text);background:var(--c-bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:focus-visible{outline:2px solid var(--c-accent);outline-offset:2px}.content{padding:32px 40px 64px;max-width:800px;width:100%;margin:0 auto}.config-editor-wrap{max-width:none}.app-header{position:sticky;top:0;z-index:15;background:var(--c-surface);border-bottom:1px solid var(--c-border)}.app-header-main,.app-header-context{padding:0 40px;display:flex;align-items:center;justify-content:space-between;gap:16px}.app-header-main{min-height:56px;border-bottom:1px solid var(--c-border)}.app-header-context{min-height:64px;padding-top:12px;padding-bottom:12px}.app-header-brand{display:flex;align-items:center;gap:12px;flex-shrink:0}.app-header-logo{width:32px;height:32px;border-radius:var(--r-m);border:1px solid var(--c-border);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;color:var(--c-accent)}.app-header-logo svg{width:16px;height:16px}.app-header-brand-text{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--c-text);letter-spacing:-.01em}.app-nav{display:flex;align-items:center;gap:6px;min-width:0}.app-nav-item{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:34px;padding:0 12px;border:1px solid transparent;border-radius:999px;background:transparent;color:var(--c-text-2);cursor:pointer;font-size:12px;font-weight:500;white-space:nowrap;transition:all var(--fast)}.app-nav-item svg{width:14px;height:14px}.app-nav-item:hover{background:var(--c-surface-alt);color:var(--c-text)}.app-nav-item.active{background:var(--c-accent-bg);border-color:var(--c-accent-bdr);color:var(--c-accent)}.app-header-spacer{flex:1}.app-header-status{font-size:12px;font-weight:500;display:inline-flex;align-items:center;gap:8px;padding:0 10px;min-height:32px;border-radius:999px;border:1px solid var(--c-border);background:var(--c-surface-alt);color:var(--c-text-2);white-space:nowrap}.app-header-status.running{border-color:var(--c-ok-bdr);background:var(--c-ok-bg);color:var(--c-ok)}.app-header-status.idle{color:var(--c-text-2)}.app-header-status .dot{width:8px;height:8px;border-radius:50%;display:inline-block}.app-header-status .dot.running{background:var(--c-ok);box-shadow:0 0 12px var(--c-ok);animation:pulse 2s infinite}.app-header-status .dot.idle{background:var(--c-text-3)}.app-header-status-meta{color:inherit;opacity:.8}.app-header-tools{display:flex;align-items:center;gap:8px;flex-shrink:0}.app-context-copy{min-width:0}.app-context-title{font-family:var(--font-display);font-size:20px;font-weight:600;color:var(--c-text);letter-spacing:-.02em}.app-context-hint{margin-top:4px;font-size:13px;color:var(--c-text-3);line-height:1.5;max-width:72ch}.app-context-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap;flex-shrink:0}@keyframes pulse{0%,to{opacity:1}50%{opacity:.6}}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:32px}.stat-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);padding:20px;transition:all var(--norm)}.stat-card:hover{box-shadow:var(--shadow-m);transform:translateY(-2px)}.stat-label{font-size:11px;font-weight:600;color:var(--c-text-3);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px}.stat-value{font-family:var(--font-display);font-size:32px;font-weight:700;color:var(--c-text);line-height:1;letter-spacing:-.02em}.stat-meta{font-size:12px;color:var(--c-text-3);margin-top:6px}.section{margin-bottom:40px}.section-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:20px;flex-wrap:wrap;gap:8px}.section-title{font-family:var(--font-display);font-size:18px;font-weight:600;color:var(--c-text);letter-spacing:-.01em}.section-desc{font-size:13px;color:var(--c-text-3)}.card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:hidden;transition:all var(--norm)}.card:hover{box-shadow:var(--shadow-s)}.card-head{padding:16px 20px;border-bottom:1px solid var(--c-border);display:flex;justify-content:space-between;align-items:center;gap:12px;cursor:pointer}.card-head:hover{background:var(--c-surface-alt)}.card-title{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--c-text)}.card-body{padding:20px}.platform-grid{display:grid;grid-template-columns:1fr;gap:16px}.platform-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:visible;transition:all var(--norm)}.platform-card:hover{box-shadow:var(--shadow-m);border-color:var(--c-border-foc)}.platform-card.disabled{opacity:.85}.platform-card.enabled{border-color:var(--c-accent-bdr);box-shadow:0 0 0 1px var(--c-accent-bdr)}.platform-card-head{padding:16px 20px;display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer;border-radius:var(--r-l) var(--r-l) 0 0}.platform-card-head:hover{background:var(--c-surface-alt)}.platform-card-meta{display:flex;align-items:center;gap:12px;min-width:0}.platform-card-icon{width:40px;height:40px;border-radius:var(--r-m);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;font-size:22px;line-height:1;flex-shrink:0}.platform-card-title-block{display:flex;flex-direction:column;gap:2px;min-width:0}.platform-card-name{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--c-text)}.platform-card-desc{font-size:12px;color:var(--c-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.platform-card-right{display:grid;grid-template-columns:minmax(104px,116px) minmax(72px,84px) 40px minmax(72px,84px);align-items:center;gap:10px;flex-shrink:0}.platform-card-control{display:flex;align-items:center;justify-content:center;min-width:0}.platform-card-control-menu{width:40px}.platform-status-badge{display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0;text-align:center;font-size:11px;font-weight:500;padding:3px 8px;border-radius:999px;border:1px solid transparent;white-space:nowrap}.platform-status-badge.on{background:var(--c-ok-bg);color:var(--c-ok);border-color:var(--c-ok-bdr)}.platform-status-badge.off{color:var(--c-text-3)}.platform-card-chevron{font-size:12px;color:var(--c-text-3);transition:transform var(--fast)}.platform-card-body{padding:16px 20px 20px;border-top:1px solid var(--c-border);border-radius:0 0 var(--r-l) var(--r-l)}.ai-command-picker{background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-m);padding:12px 14px;display:flex;flex-direction:column;gap:6px;margin-bottom:16px}.ai-command-picker-title{font-family:var(--font-display);font-size:13px;font-weight:600;color:var(--c-text)}.ai-command-picker-hint{font-size:12px;color:var(--c-text-2)}.ai-command-picker .form-select{margin-top:2px}.platform-card-divider{border:0;border-top:1px solid var(--c-border);margin:0 0 16px}.platform-card-hint{font-size:12px;color:var(--c-text-3);line-height:1.5;margin-bottom:16px}.platform-card-help{margin-top:16px;padding:10px 14px;background:var(--c-surface-alt);border-radius:var(--r-m);font-size:12px;color:var(--c-text-2);line-height:1.6}.platform-card-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px}.platform-card-ai-tag{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0;font-size:11px;font-weight:500;padding:3px 10px;border-radius:999px;background:var(--c-surface-alt);color:var(--c-text-2);border:1px solid var(--c-border);cursor:pointer;white-space:nowrap;transition:all var(--fast)}.platform-card-ai-tag:hover{border-color:var(--c-accent-bdr);color:var(--c-text)}.platform-card-ai-dropdown{position:absolute;top:calc(100% + 4px);right:0;min-width:140px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-m);box-shadow:var(--shadow-m, 0 8px 24px rgba(0, 0, 0, .12));z-index:20;padding:4px}.platform-card-ai-option{display:block;width:100%;text-align:left;background:transparent;border:0;padding:6px 10px;font-size:12px;color:var(--c-text);cursor:pointer;border-radius:var(--r-s, 4px)}.platform-card-ai-option:hover{background:var(--c-surface-alt)}.platform-card-ai-option.active{color:var(--c-accent);font-weight:600}.platform-card-menu{position:relative;flex-shrink:0}.platform-card-menu-btn{width:32px;height:32px;background:transparent;border:0;padding:0;font-size:18px;line-height:1;color:var(--c-text-3);cursor:pointer;border-radius:var(--r-s, 4px);transition:all var(--fast)}.platform-card-menu-btn:hover{background:var(--c-surface-alt);color:var(--c-text)}.platform-card-menu-dropdown{position:absolute;top:calc(100% + 4px);right:0;min-width:160px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-m);box-shadow:var(--shadow-m, 0 8px 24px rgba(0, 0, 0, .12));z-index:20;padding:4px}.platform-card-menu-item{display:block;width:100%;text-align:left;background:transparent;border:0;padding:8px 12px;font-size:13px;color:var(--c-text);cursor:pointer;border-radius:var(--r-s, 4px)}.platform-card-menu-item:hover{background:var(--c-surface-alt)}.platform-card-menu-item.danger{color:var(--c-err, #d33)}.platform-card-menu-item.danger:hover{background:#dc353514}.platform-card-menu-item:disabled{opacity:.4;cursor:not-allowed}.platform-card-config-btn{min-width:72px}.platform-card-right .toggle{justify-content:center;width:100%}.qr-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:1000;padding:16px}.qr-modal{position:relative;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);box-shadow:var(--shadow-l, 0 12px 40px rgba(0, 0, 0, .2));padding:28px 28px 24px;width:100%;max-width:360px;text-align:center}.qr-modal-close{position:absolute;top:8px;right:12px;background:transparent;border:0;font-size:22px;line-height:1;color:var(--c-text-3);cursor:pointer;padding:4px 8px;border-radius:var(--r-m)}.qr-modal-close:hover{background:var(--c-surface-alt);color:var(--c-text)}.qr-modal-title{font-family:var(--font-display);font-size:16px;font-weight:600;color:var(--c-text);margin-bottom:16px}.qr-modal-img-wrap{display:flex;align-items:center;justify-content:center;margin-bottom:14px}.qr-modal-img{width:220px;height:220px;border:1px solid var(--c-border);border-radius:var(--r-m)}.qr-modal-hint{font-size:13px;color:var(--c-text-2);line-height:1.5;margin-bottom:8px}.qr-modal-status{font-size:13px;color:var(--c-text-2);line-height:1.5}.qr-modal-status.muted{color:var(--c-text-3)}.qr-modal-status.ok{color:var(--c-ok);font-weight:600}.qr-modal-status.err{color:var(--c-err, var(--c-text));font-weight:500;word-break:break-word}.qr-modal-actions{display:flex;gap:8px;justify-content:center;margin-top:16px}.form-group{margin-bottom:14px}.form-group:last-child{margin-bottom:0}.form-label{display:block;font-size:12px;font-weight:500;color:var(--c-text-2);margin-bottom:5px}.form-input,.form-select,.form-textarea{width:100%;padding:8px 10px;font-family:inherit;font-size:13px;color:var(--c-text);background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-s);transition:border-color var(--fast),box-shadow var(--fast);outline:none}.form-input:focus,.form-select:focus,.form-textarea:focus{border-color:var(--c-accent);box-shadow:0 0 0 3px var(--c-accent-bg)}.form-input.mono,.form-textarea.mono{font-family:var(--font-mono);font-size:12px}.form-textarea{min-height:80px;resize:vertical}.form-hint{font-size:11px;color:var(--c-text-3);margin-top:4px;line-height:1.4}.form-hint a{color:var(--c-accent)}.form-hint code{font-family:var(--font-mono);font-size:10px;padding:1px 4px;background:var(--c-surface-alt);border-radius:3px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:7px 14px;font-family:var(--font-body);font-size:13px;font-weight:500;border-radius:var(--r-s);border:1px solid transparent;cursor:pointer;text-decoration:none;transition:all var(--fast);white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-p{background:var(--c-accent);color:#fff}.btn-p:hover:not(:disabled){background:var(--c-accent-h);box-shadow:var(--shadow-glow)}.btn-s{background:var(--c-surface);color:var(--c-text);border-color:var(--c-border)}.btn-s:hover:not(:disabled){background:var(--c-surface-alt);border-color:var(--c-border-foc)}.btn-g{background:transparent;color:var(--c-text-2)}.btn-g:hover:not(:disabled){background:var(--c-surface-alt);color:var(--c-text)}.btn-d{background:var(--c-err-bg);color:var(--c-err);border-color:var(--c-err-bdr)}.btn-d:hover:not(:disabled){background:var(--c-err);color:#fff}.btn-w{background:var(--c-warn-bg);color:var(--c-warn);border-color:var(--c-warn-bdr)}.btn-w:hover:not(:disabled){background:var(--c-warn);color:#fff}.btn-sm{padding:5px 10px;font-size:12px}.btn-lg{padding:10px 20px;font-size:14px}.toggle{display:inline-flex;align-items:center;gap:8px;cursor:pointer;flex-shrink:0}.toggle-input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.toggle-track{position:relative;width:36px;height:20px;background:var(--c-border-foc);border-radius:999px;transition:background var(--fast);flex-shrink:0}.toggle-track:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;background:#fff;border-radius:50%;transition:transform var(--fast);box-shadow:var(--shadow-xs)}.toggle-input:checked+.toggle-track{background:var(--c-accent);box-shadow:0 0 10px var(--c-accent)}.toggle-input:checked+.toggle-track:after{transform:translate(16px)}.tabs{display:inline-flex;gap:2px;padding:3px;background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-m)}.tab{padding:6px 12px;font-size:12px;font-weight:500;color:var(--c-text-2);background:transparent;border:none;border-radius:var(--r-s);cursor:pointer;transition:all var(--fast)}.tab:hover{color:var(--c-text)}.tab.active{background:var(--c-surface);color:var(--c-text);box-shadow:var(--shadow-xs)}.msg{padding:10px 14px;border-radius:var(--r-m);font-size:13px;line-height:1.5}.msg-ok{background:var(--c-ok-bg);color:var(--c-ok)}.msg-err{background:var(--c-err-bg);color:var(--c-err)}.msg-w{background:var(--c-warn-bg);color:var(--c-warn)}.badge{display:inline-flex;align-items:center;padding:2px 8px;font-size:11px;font-weight:500;border-radius:999px}.badge-ok{background:var(--c-ok-bg);color:var(--c-ok)}.badge-err{background:var(--c-err-bg);color:var(--c-err)}.badge-w{background:var(--c-warn-bg);color:var(--c-warn)}.badge-info{background:var(--c-accent-bg);color:var(--c-accent)}.field-tip{font-size:11px;color:var(--c-text-3);line-height:1.45;margin-top:5px}.field-tip a{color:var(--c-accent)}.field-tip code{font-family:var(--font-mono);font-size:10px;padding:1px 4px;background:var(--c-surface-alt);border-radius:3px}.mt-4{margin-top:16px}.mt-6{margin-top:24px}.gap-2{gap:8px}.gap-3{gap:12px}.text-center{text-align:center}.mono{font-family:var(--font-mono)}.hidden{display:none!important}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.toast-stack{position:fixed;top:92px;right:24px;z-index:40;display:flex;flex-direction:column;gap:10px;pointer-events:none}.toast-msg{display:flex;align-items:flex-start;gap:12px;min-width:280px;max-width:min(420px,calc(100vw - 32px));border:1px solid transparent;box-shadow:var(--shadow-l);pointer-events:auto}.toast-msg.msg-ok{border-color:var(--c-ok-bdr)}.toast-msg.msg-err{border-color:var(--c-err-bdr)}.toast-msg-body{flex:1;min-width:0;word-break:break-word}.toast-close{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;margin-top:-1px;border:0;border-radius:999px;background:transparent;color:inherit;cursor:pointer;opacity:.7;transition:background var(--fast),opacity var(--fast)}.toast-close:hover{background:#0000000f;opacity:1}.dark-btn{padding:4px 8px;border-radius:var(--r-s);border:1px solid var(--c-border);background:var(--c-surface);color:var(--c-text-2);cursor:pointer;font-size:14px;line-height:1;transition:all var(--fast);display:inline-flex;align-items:center;justify-content:center}.dark-btn:hover{border-color:var(--c-border-foc);color:var(--c-text)}.config-stack{display:flex;flex-direction:column;gap:16px}.config-card .card-title{font-family:var(--font-mono);font-size:13px}.config-card textarea{width:100%}.config-editor{display:flex;gap:0;min-height:400px;border:1px solid var(--c-border);border-radius:8px;overflow:hidden}.config-editor-sidebar{width:280px;flex-shrink:0;border-right:1px solid var(--c-border);background:var(--c-surface-alt);overflow-y:auto;padding:8px 0}.config-editor-sidebar .file-item{display:flex;align-items:center;gap:6px;padding:8px 16px;cursor:pointer;font-size:13px;color:var(--c-text-2);transition:background .15s}.config-editor-sidebar .file-item:hover{background:var(--c-hover)}.config-editor-sidebar .file-item.active{background:var(--c-active);color:var(--c-text);font-weight:600}.config-editor-sidebar .file-item .icon{width:16px;text-align:center;font-size:14px;flex-shrink:0}.config-editor-sidebar .file-item .label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.config-editor-sidebar .file-item.sub{padding-left:36px;font-size:12px}.config-editor-sidebar .file-group-label{padding:12px 16px 4px;font-size:11px;font-weight:600;color:var(--c-text-3);text-transform:uppercase;letter-spacing:.5px}.config-editor-body{flex:1;display:flex;flex-direction:column;padding:16px;overflow:auto}.config-editor-body .file-hint{font-size:12px;color:var(--c-text-3);margin:0 0 12px}.config-editor-body .file-path{font-family:var(--font-mono);font-size:11px;color:var(--c-text-3);margin-bottom:12px;word-break:break-all}.config-editor-body textarea{width:100%;min-height:300px;resize:vertical;font-family:var(--font-mono);font-size:13px;line-height:1.5;padding:12px;border:1px solid var(--c-border);border-radius:6px;background:var(--c-bg);color:var(--c-text);-moz-tab-size:2;tab-size:2}.config-editor-body textarea:focus{outline:none;border-color:var(--c-primary)}.wizard-wrap{display:flex;justify-content:center;padding-top:16px}.wizard{width:100%;max-width:580px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-xl);box-shadow:var(--shadow-l);overflow:hidden}.wizard-bar{height:3px;background:var(--c-border)}.wizard-bar-fill{height:100%;background:var(--c-accent);transition:width .4s cubic-bezier(.4,0,.2,1)}.wizard-steps{display:flex;padding:20px 24px 0;gap:0}.wizard-step-ind{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;position:relative}.wizard-step-ind+.wizard-step-ind:before{content:"";position:absolute;top:12px;right:calc(50% + 16px);width:calc(100% - 32px);height:1px;background:var(--c-border)}.wizard-step-ind.done+.wizard-step-ind:before{background:var(--c-accent)}.wizard-step-dot{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;background:var(--c-surface-alt);color:var(--c-text-3);border:2px solid var(--c-border);position:relative;z-index:1;transition:all var(--norm)}.wizard-step-ind.active .wizard-step-dot{background:var(--c-accent);color:#fff;border-color:var(--c-accent);box-shadow:0 0 12px var(--c-accent)}.wizard-step-ind.done .wizard-step-dot{background:var(--c-ok);color:#fff;border-color:var(--c-ok)}.wizard-step-label{font-size:11px;font-weight:500;color:var(--c-text-3);white-space:nowrap}.wizard-step-ind.active .wizard-step-label{color:var(--c-accent);font-weight:600}.wizard-step-ind.done .wizard-step-label{color:var(--c-ok)}.wizard-body{padding:28px 32px;min-height:260px}.wizard-icon{font-size:36px;margin-bottom:12px}.wizard-title{font-family:var(--font-display);font-size:20px;font-weight:700;color:var(--c-text);margin-bottom:6px;letter-spacing:-.02em}.wizard-desc{font-size:13px;color:var(--c-text-2);line-height:1.6;margin-bottom:24px}.wizard-checklist{display:flex;flex-direction:column;gap:10px}.wizard-check{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--c-text)}.wizard-check-num{width:24px;height:24px;border-radius:50%;background:var(--c-accent-bg);color:var(--c-accent);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex-shrink:0}.wizard-chips{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}.wizard-platform-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:hidden;transition:border-color var(--fast)}.wizard-platform-card.on{border-color:var(--c-accent)}.wizard-platform-head{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;cursor:pointer;gap:8px}.wizard-platform-head:hover{background:var(--c-surface-alt)}.wizard-platform-meta{display:flex;align-items:center;gap:10px;min-width:0}.wizard-platform-icon{width:36px;height:36px;border-radius:var(--r-m);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;font-size:20px;line-height:1;flex-shrink:0}.wizard-platform-title-block{display:flex;flex-direction:column;gap:1px;min-width:0}.wizard-platform-name{font-family:var(--font-display);font-size:14px;font-weight:600}.wizard-platform-desc{font-size:12px;color:var(--c-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wizard-platform-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.wizard-platform-chevron{font-size:12px;color:var(--c-text-3)}.wizard-platform-body{padding:0 16px 16px;border-top:1px solid var(--c-border)}.wizard-cred{background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-l);padding:20px;margin-bottom:14px}.wizard-cred:last-child{margin-bottom:0}.wizard-cred-name{font-family:var(--font-display);font-size:14px;font-weight:600;margin-bottom:14px;color:var(--c-text)}.wizard-radio-group{display:flex;flex-direction:column;gap:8px}.wizard-radio{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:2px solid var(--c-border);border-radius:var(--r-m);cursor:pointer;transition:all var(--fast)}.wizard-radio:hover{border-color:var(--c-accent-bdr)}.wizard-radio.on{border-color:var(--c-accent);background:var(--c-accent-bg)}.wizard-radio input[type=radio]{margin-top:2px;accent-color:var(--c-accent)}.wizard-radio-body{display:flex;flex-direction:column;gap:2px}.wizard-radio-label{font-size:13px;font-weight:600;color:var(--c-text)}.wizard-radio-desc{font-size:12px;color:var(--c-text-3)}.wizard-review-block{margin-bottom:20px}.wizard-review-head{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--c-text-3);margin-bottom:10px}.wizard-kv{display:flex;justify-content:space-between;align-items:center;padding:7px 0;border-bottom:1px solid var(--c-border);font-size:12px}.wizard-kv span{color:var(--c-text-2)}.wizard-kv code{font-family:var(--font-mono);font-size:11px;color:var(--c-text);background:var(--c-surface-alt);padding:2px 6px;border-radius:4px}.wizard-platforms{display:flex;flex-wrap:wrap;gap:6px}.wizard-platform-pill{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:var(--c-surface-alt);border-radius:999px;font-size:12px;font-weight:500}.wizard-platform-pill .cmd{font-size:10px;padding:1px 6px;border-radius:999px;background:var(--c-accent-bg);color:var(--c-accent);font-weight:500}.wizard-done{text-align:center;padding:20px 0}.wizard-nav{display:flex;align-items:center;padding:16px 32px 24px;gap:10px}.wizard-nav-spacer{flex:1}.wizard-pulse{animation:wiz-pulse 1.2s ease-in-out infinite}@keyframes wiz-pulse{0%,to{opacity:1}50%{opacity:.4}}.conn{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:32px}.conn-card{width:100%;max-width:420px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-xl);box-shadow:var(--shadow-l);padding:32px}.conn-logo{width:40px;height:40px;border-radius:var(--r-m);background:var(--c-accent);display:flex;align-items:center;justify-content:center;margin-bottom:20px}.conn-logo svg{width:22px;height:22px;color:#fff}.conn-title{font-family:var(--font-display);font-size:20px;font-weight:700;color:var(--c-text);margin-bottom:6px;letter-spacing:-.02em}.conn-desc{font-size:13px;color:var(--c-text-2);margin-bottom:24px;line-height:1.5}.conn-row{display:flex;gap:8px}.conn-input{flex:1;padding:8px 10px;font-family:var(--font-mono);font-size:13px;color:var(--c-text);background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-s);outline:none;transition:border-color var(--fast)}.conn-input:focus{border-color:var(--c-accent);box-shadow:0 0 0 3px var(--c-accent-bg)}.conn-status{font-size:12px;margin-top:10px;color:var(--c-text-3)}.conn-status.ok{color:var(--c-ok)}.conn-status.err{color:var(--c-err)}@media(max-width:1024px){.stats-grid{grid-template-columns:1fr}}@media(max-width:768px){.content{padding:20px 16px 40px}.toast-stack{top:140px;right:16px;left:16px}.toast-msg{min-width:0;max-width:none}.app-header-main,.app-header-context{padding-left:16px;padding-right:16px}.app-header-main{min-height:auto;padding-top:12px;padding-bottom:12px;flex-wrap:wrap;align-items:flex-start}.app-nav{order:3;width:100%;overflow-x:auto;padding-bottom:2px}.app-header-spacer{display:none}.app-header-context{min-height:auto;align-items:flex-start;flex-direction:column}.app-context-actions{width:100%;justify-content:flex-start}.platform-grid{grid-template-columns:1fr}.platform-card-head{align-items:flex-start;flex-direction:column}.platform-card-right{width:100%;grid-template-columns:repeat(4,minmax(0,1fr))}.platform-card-control-menu,.platform-card-menu-btn{width:100%}.wizard-chips{grid-template-columns:1fr}}
1
+ @import"https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap";:root{--c-bg: #fafafa;--c-surface: #ffffff;--c-surface-alt: #f5f5f5;--c-border: #e5e5e5;--c-border-foc: #a3a3a3;--c-text: #1a1a2e;--c-text-2: #525252;--c-text-3: #a3a3a3;--c-accent: #6366f1;--c-accent-h: #4f46e5;--c-accent-bg: #eef2ff;--c-accent-bdr: #c7d2fe;--c-ok: #10b981;--c-ok-bg: #ecfdf5;--c-ok-bdr: #a7f3d0;--c-warn: #f59e0b;--c-warn-bg: #fffbeb;--c-warn-bdr: #fde68a;--c-err: #ef4444;--c-err-bg: #fef2f2;--c-err-bdr: #fecaca;--shadow-xs: 0 1px 2px rgba(0,0,0,.05);--shadow-s: 0 1px 3px rgba(0,0,0,.1), 0 1px 2px rgba(0,0,0,.06);--shadow-m: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -2px rgba(0,0,0,.1);--shadow-l: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -4px rgba(0,0,0,.1);--shadow-glow: 0 0 20px rgba(99,102,241,.15);--r-s: 6px;--r-m: 8px;--r-l: 12px;--r-xl: 16px;--font-display: "Space Grotesk", -apple-system, sans-serif;--font-body: "Inter", -apple-system, sans-serif;--font-mono: "JetBrains Mono", "SF Mono", monospace;--fast: .12s ease;--norm: .2s ease;--slow: .3s ease}:root.dark{--c-bg: #0a0a0f;--c-surface: #141418;--c-surface-alt: #1e1e24;--c-border: #2a2a32;--c-border-foc: #52525e;--c-text: #f0f0f5;--c-text-2: #a0a0ae;--c-text-3: #5a5a68;--c-accent: #818cf8;--c-accent-h: #6366f1;--c-accent-bg: rgba(99,102,241,.12);--c-accent-bdr: rgba(99,102,241,.3);--c-ok-bg: rgba(16,185,129,.12);--c-ok-bdr: rgba(16,185,129,.3);--c-warn-bg: rgba(245,158,11,.12);--c-warn-bdr: rgba(245,158,11,.3);--c-err-bg: rgba(239,68,68,.12);--c-err-bdr: rgba(239,68,68,.3);--shadow-xs: 0 1px 2px rgba(0,0,0,.3);--shadow-s: 0 1px 3px rgba(0,0,0,.4), 0 1px 2px rgba(0,0,0,.3);--shadow-m: 0 4px 6px -1px rgba(0,0,0,.4), 0 2px 4px -2px rgba(0,0,0,.3);--shadow-l: 0 10px 15px -3px rgba(0,0,0,.4), 0 4px 6px -4px rgba(0,0,0,.3);--shadow-glow: 0 0 20px rgba(129,140,248,.2)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--font-body);font-size:14px;line-height:1.5;color:var(--c-text);background:var(--c-bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:focus-visible{outline:2px solid var(--c-accent);outline-offset:2px}.content{padding:32px 40px 64px;max-width:800px;width:100%;margin:0 auto}.config-editor-wrap{max-width:none}.app-header{position:sticky;top:0;z-index:15;background:var(--c-surface);border-bottom:1px solid var(--c-border)}.app-header-main,.app-header-context{padding:0 40px;display:flex;align-items:center;justify-content:space-between;gap:16px}.app-header-main{min-height:56px;border-bottom:1px solid var(--c-border)}.app-header-context{min-height:64px;padding-top:12px;padding-bottom:12px}.app-header-brand{display:flex;align-items:center;gap:12px;flex-shrink:0}.app-header-logo{width:32px;height:32px;border-radius:var(--r-m);border:1px solid var(--c-border);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;color:var(--c-accent)}.app-header-logo svg{width:16px;height:16px}.app-header-brand-text{font-family:var(--font-display);font-size:15px;font-weight:600;color:var(--c-text);letter-spacing:-.01em}.app-nav{display:flex;align-items:center;gap:6px;min-width:0}.app-nav-item{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:34px;padding:0 12px;border:1px solid transparent;border-radius:999px;background:transparent;color:var(--c-text-2);cursor:pointer;font-size:12px;font-weight:500;white-space:nowrap;transition:all var(--fast)}.app-nav-item svg{width:14px;height:14px}.app-nav-item:hover{background:var(--c-surface-alt);color:var(--c-text)}.app-nav-item.active{background:var(--c-accent-bg);border-color:var(--c-accent-bdr);color:var(--c-accent)}.app-header-spacer{flex:1}.app-header-status{font-size:12px;font-weight:500;display:inline-flex;align-items:center;gap:8px;padding:0 10px;min-height:32px;border-radius:999px;border:1px solid var(--c-border);background:var(--c-surface-alt);color:var(--c-text-2);white-space:nowrap}.app-header-status.running{border-color:var(--c-ok-bdr);background:var(--c-ok-bg);color:var(--c-ok)}.app-header-status.idle{color:var(--c-text-2)}.app-header-status .dot{width:8px;height:8px;border-radius:50%;display:inline-block}.app-header-status .dot.running{background:var(--c-ok);box-shadow:0 0 12px var(--c-ok);animation:pulse 2s infinite}.app-header-status .dot.idle{background:var(--c-text-3)}.app-header-status-meta{color:inherit;opacity:.8}.app-header-tools{display:flex;align-items:center;gap:8px;flex-shrink:0}.app-context-copy{min-width:0}.app-context-title{font-family:var(--font-display);font-size:20px;font-weight:600;color:var(--c-text);letter-spacing:-.02em}.app-context-hint{margin-top:4px;font-size:13px;color:var(--c-text-3);line-height:1.5;max-width:72ch}.app-context-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap;flex-shrink:0}@keyframes pulse{0%,to{opacity:1}50%{opacity:.6}}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:32px}.stat-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);padding:20px;transition:all var(--norm)}.stat-card:hover{box-shadow:var(--shadow-m);transform:translateY(-2px)}.stat-label{font-size:11px;font-weight:600;color:var(--c-text-3);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px}.stat-value{font-family:var(--font-display);font-size:32px;font-weight:700;color:var(--c-text);line-height:1;letter-spacing:-.02em}.stat-meta{font-size:12px;color:var(--c-text-3);margin-top:6px}.section{margin-bottom:40px}.section-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:20px;flex-wrap:wrap;gap:8px}.section-title{font-family:var(--font-display);font-size:18px;font-weight:600;color:var(--c-text);letter-spacing:-.01em}.section-desc{font-size:13px;color:var(--c-text-3)}.card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:hidden;transition:all var(--norm)}.card:hover{box-shadow:var(--shadow-s)}.card-head{padding:16px 20px;border-bottom:1px solid var(--c-border);display:flex;justify-content:space-between;align-items:center;gap:12px;cursor:pointer}.card-head:hover{background:var(--c-surface-alt)}.card-title{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--c-text)}.card-body{padding:20px}.platform-grid{display:grid;grid-template-columns:1fr;gap:16px}.platform-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:visible;transition:all var(--norm)}.platform-card:hover{box-shadow:var(--shadow-m);border-color:var(--c-border-foc)}.platform-card.disabled{opacity:.85}.platform-card.enabled{border-color:var(--c-accent-bdr);box-shadow:0 0 0 1px var(--c-accent-bdr)}.platform-card-head{padding:16px 20px;display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer;border-radius:var(--r-l) var(--r-l) 0 0}.platform-card-head:hover{background:var(--c-surface-alt)}.platform-card-meta{display:flex;align-items:center;gap:12px;min-width:0}.platform-card-icon{width:40px;height:40px;border-radius:var(--r-m);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;font-size:22px;line-height:1;flex-shrink:0}.platform-card-title-block{display:flex;flex-direction:column;gap:2px;min-width:0}.platform-card-name{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--c-text)}.platform-card-desc{font-size:12px;color:var(--c-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.platform-card-right{display:grid;grid-template-columns:minmax(104px,116px) minmax(72px,84px) 40px minmax(72px,84px);align-items:center;gap:10px;flex-shrink:0}.platform-card-control{display:flex;align-items:center;justify-content:center;min-width:0}.platform-card-control-menu{width:40px}.platform-status-badge{display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0;text-align:center;font-size:11px;font-weight:500;padding:3px 8px;border-radius:999px;border:1px solid transparent;white-space:nowrap}.platform-status-badge.on{background:var(--c-ok-bg);color:var(--c-ok);border-color:var(--c-ok-bdr)}.platform-status-badge.off{color:var(--c-text-3)}.platform-card-chevron{font-size:12px;color:var(--c-text-3);transition:transform var(--fast)}.platform-card-body{padding:16px 20px 20px;border-top:1px solid var(--c-border);border-radius:0 0 var(--r-l) var(--r-l)}.ai-command-picker{background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-m);padding:12px 14px;display:flex;flex-direction:column;gap:6px;margin-bottom:16px}.ai-command-picker-title{font-family:var(--font-display);font-size:13px;font-weight:600;color:var(--c-text)}.ai-command-picker-hint{font-size:12px;color:var(--c-text-2)}.ai-command-picker .form-select{margin-top:2px}.platform-card-divider{border:0;border-top:1px solid var(--c-border);margin:0 0 16px}.platform-card-hint{font-size:12px;color:var(--c-text-3);line-height:1.5;margin-bottom:16px}.platform-card-help{margin-top:16px;padding:10px 14px;background:var(--c-surface-alt);border-radius:var(--r-m);font-size:12px;color:var(--c-text-2);line-height:1.6}.platform-card-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px}.platform-card-ai-tag{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0;font-size:11px;font-weight:500;padding:3px 10px;border-radius:999px;background:var(--c-surface-alt);color:var(--c-text-2);border:1px solid var(--c-border);cursor:pointer;white-space:nowrap;transition:all var(--fast)}.platform-card-ai-tag:hover{border-color:var(--c-accent-bdr);color:var(--c-text)}.platform-card-ai-dropdown{position:absolute;top:calc(100% + 4px);right:0;min-width:140px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-m);box-shadow:var(--shadow-m, 0 8px 24px rgba(0, 0, 0, .12));z-index:20;padding:4px}.platform-card-ai-option{display:block;width:100%;text-align:left;background:transparent;border:0;padding:6px 10px;font-size:12px;color:var(--c-text);cursor:pointer;border-radius:var(--r-s, 4px)}.platform-card-ai-option:hover{background:var(--c-surface-alt)}.platform-card-ai-option.active{color:var(--c-accent);font-weight:600}.platform-card-menu{position:relative;flex-shrink:0}.platform-card-menu-btn{width:32px;height:32px;background:transparent;border:0;padding:0;font-size:18px;line-height:1;color:var(--c-text-3);cursor:pointer;border-radius:var(--r-s, 4px);transition:all var(--fast)}.platform-card-menu-btn:hover{background:var(--c-surface-alt);color:var(--c-text)}.platform-card-menu-dropdown{position:absolute;top:calc(100% + 4px);right:0;min-width:160px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-m);box-shadow:var(--shadow-m, 0 8px 24px rgba(0, 0, 0, .12));z-index:20;padding:4px}.platform-card-menu-item{display:block;width:100%;text-align:left;background:transparent;border:0;padding:8px 12px;font-size:13px;color:var(--c-text);cursor:pointer;border-radius:var(--r-s, 4px)}.platform-card-menu-item:hover{background:var(--c-surface-alt)}.platform-card-menu-item.danger{color:var(--c-err, #d33)}.platform-card-menu-item.danger:hover{background:#dc353514}.platform-card-menu-item:disabled{opacity:.4;cursor:not-allowed}.platform-card-config-btn{min-width:72px}.platform-card-right .toggle{justify-content:center;width:100%}.qr-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:1000;padding:16px}.qr-modal{position:relative;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);box-shadow:var(--shadow-l, 0 12px 40px rgba(0, 0, 0, .2));padding:28px 28px 24px;width:100%;max-width:360px;text-align:center}.qr-modal-close{position:absolute;top:8px;right:12px;background:transparent;border:0;font-size:22px;line-height:1;color:var(--c-text-3);cursor:pointer;padding:4px 8px;border-radius:var(--r-m)}.qr-modal-close:hover{background:var(--c-surface-alt);color:var(--c-text)}.qr-modal-title{font-family:var(--font-display);font-size:16px;font-weight:600;color:var(--c-text);margin-bottom:16px}.qr-modal-img-wrap{display:flex;align-items:center;justify-content:center;margin-bottom:14px}.qr-modal-img{width:220px;height:220px;border:1px solid var(--c-border);border-radius:var(--r-m)}.qr-modal-hint{font-size:13px;color:var(--c-text-2);line-height:1.5;margin-bottom:8px}.qr-modal-status{font-size:13px;color:var(--c-text-2);line-height:1.5}.qr-modal-status.muted{color:var(--c-text-3)}.qr-modal-status.ok{color:var(--c-ok);font-weight:600}.qr-modal-status.err{color:var(--c-err, var(--c-text));font-weight:500;word-break:break-word}.qr-modal-actions{display:flex;gap:8px;justify-content:center;margin-top:16px}.form-group{margin-bottom:14px}.form-group:last-child{margin-bottom:0}.form-label{display:block;font-size:12px;font-weight:500;color:var(--c-text-2);margin-bottom:5px}.form-input,.form-select,.form-textarea{width:100%;padding:8px 10px;font-family:inherit;font-size:13px;color:var(--c-text);background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-s);transition:border-color var(--fast),box-shadow var(--fast);outline:none}.form-input:focus,.form-select:focus,.form-textarea:focus{border-color:var(--c-accent);box-shadow:0 0 0 3px var(--c-accent-bg)}.form-input.mono,.form-textarea.mono{font-family:var(--font-mono);font-size:12px}.form-textarea{min-height:80px;resize:vertical}.form-hint{font-size:11px;color:var(--c-text-3);margin-top:4px;line-height:1.4}.form-hint a{color:var(--c-accent)}.form-hint code{font-family:var(--font-mono);font-size:10px;padding:1px 4px;background:var(--c-surface-alt);border-radius:3px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:7px 14px;font-family:var(--font-body);font-size:13px;font-weight:500;border-radius:var(--r-s);border:1px solid transparent;cursor:pointer;text-decoration:none;transition:all var(--fast);white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-p{background:var(--c-accent);color:#fff}.btn-p:hover:not(:disabled){background:var(--c-accent-h);box-shadow:var(--shadow-glow)}.btn-s{background:var(--c-surface);color:var(--c-text);border-color:var(--c-border)}.btn-s:hover:not(:disabled){background:var(--c-surface-alt);border-color:var(--c-border-foc)}.btn-g{background:transparent;color:var(--c-text-2)}.btn-g:hover:not(:disabled){background:var(--c-surface-alt);color:var(--c-text)}.btn-d{background:var(--c-err-bg);color:var(--c-err);border-color:var(--c-err-bdr)}.btn-d:hover:not(:disabled){background:var(--c-err);color:#fff}.btn-w{background:var(--c-warn-bg);color:var(--c-warn);border-color:var(--c-warn-bdr)}.btn-w:hover:not(:disabled){background:var(--c-warn);color:#fff}.btn-sm{padding:5px 10px;font-size:12px}.btn-lg{padding:10px 20px;font-size:14px}.toggle{display:inline-flex;align-items:center;gap:8px;cursor:pointer;flex-shrink:0}.toggle-input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.toggle-track{position:relative;width:36px;height:20px;background:var(--c-border-foc);border-radius:999px;transition:background var(--fast);flex-shrink:0}.toggle-track:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;background:#fff;border-radius:50%;transition:transform var(--fast);box-shadow:var(--shadow-xs)}.toggle-input:checked+.toggle-track{background:var(--c-accent);box-shadow:0 0 10px var(--c-accent)}.toggle-input:checked+.toggle-track:after{transform:translate(16px)}.tabs{display:inline-flex;gap:2px;padding:3px;background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-m)}.tab{padding:6px 12px;font-size:12px;font-weight:500;color:var(--c-text-2);background:transparent;border:none;border-radius:var(--r-s);cursor:pointer;transition:all var(--fast)}.tab:hover{color:var(--c-text)}.tab.active{background:var(--c-surface);color:var(--c-text);box-shadow:var(--shadow-xs)}.msg{padding:10px 14px;border-radius:var(--r-m);font-size:13px;line-height:1.5}.msg-ok{background:var(--c-ok-bg);color:var(--c-ok)}.msg-err{background:var(--c-err-bg);color:var(--c-err)}.msg-w{background:var(--c-warn-bg);color:var(--c-warn)}.badge{display:inline-flex;align-items:center;padding:2px 8px;font-size:11px;font-weight:500;border-radius:999px}.badge-ok{background:var(--c-ok-bg);color:var(--c-ok)}.badge-err{background:var(--c-err-bg);color:var(--c-err)}.badge-w{background:var(--c-warn-bg);color:var(--c-warn)}.badge-info{background:var(--c-accent-bg);color:var(--c-accent)}.field-tip{font-size:11px;color:var(--c-text-3);line-height:1.45;margin-top:5px}.field-tip a{color:var(--c-accent)}.field-tip code{font-family:var(--font-mono);font-size:10px;padding:1px 4px;background:var(--c-surface-alt);border-radius:3px}.mt-4{margin-top:16px}.mt-6{margin-top:24px}.gap-2{gap:8px}.gap-3{gap:12px}.text-center{text-align:center}.mono{font-family:var(--font-mono)}.hidden{display:none!important}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.toast-stack{position:fixed;top:92px;right:24px;z-index:40;display:flex;flex-direction:column;gap:10px;pointer-events:none}.toast-msg{display:flex;align-items:flex-start;gap:12px;min-width:280px;max-width:min(420px,calc(100vw - 32px));border:1px solid transparent;box-shadow:var(--shadow-l);pointer-events:auto}.toast-msg.msg-ok{border-color:var(--c-ok-bdr)}.toast-msg.msg-err{border-color:var(--c-err-bdr)}.toast-msg-body{flex:1;min-width:0;word-break:break-word}.toast-close{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;margin-top:-1px;border:0;border-radius:999px;background:transparent;color:inherit;cursor:pointer;opacity:.7;transition:background var(--fast),opacity var(--fast)}.toast-close:hover{background:#0000000f;opacity:1}.dark-btn{padding:4px 8px;border-radius:var(--r-s);border:1px solid var(--c-border);background:var(--c-surface);color:var(--c-text-2);cursor:pointer;font-size:14px;line-height:1;transition:all var(--fast);display:inline-flex;align-items:center;justify-content:center}.dark-btn:hover{border-color:var(--c-border-foc);color:var(--c-text)}.config-stack{display:flex;flex-direction:column;gap:16px}.config-card .card-title{font-family:var(--font-mono);font-size:13px}.config-card textarea{width:100%}.config-editor{display:flex;gap:0;height:calc(100vh - 220px);min-height:420px;border:1px solid var(--c-border);border-radius:8px;overflow:hidden}.config-editor-sidebar{width:280px;flex-shrink:0;border-right:1px solid var(--c-border);background:var(--c-surface-alt);overflow-y:auto;padding:8px 0}.config-editor-sidebar .file-item{display:flex;align-items:center;gap:6px;padding:8px 16px;cursor:pointer;font-size:13px;color:var(--c-text-2);transition:background .15s}.config-editor-sidebar .file-item:hover{background:var(--c-hover)}.config-editor-sidebar .file-item.active{background:var(--c-active);color:var(--c-text);font-weight:600}.config-editor-sidebar .file-item .icon{width:16px;text-align:center;font-size:14px;flex-shrink:0}.config-editor-sidebar .file-item .label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.config-editor-sidebar .file-item.sub{padding-left:36px;font-size:12px}.config-editor-sidebar .file-group-label{padding:12px 16px 4px;font-size:11px;font-weight:600;color:var(--c-text-3);text-transform:uppercase;letter-spacing:.5px}.config-editor-body{flex:1;display:flex;flex-direction:column;padding:16px;overflow:hidden;min-height:0}.config-editor-body .file-hint{font-size:12px;color:var(--c-text-3);margin:0 0 12px}.config-editor-body .file-path{font-family:var(--font-mono);font-size:11px;color:var(--c-text-3);margin-bottom:12px;word-break:break-all}.config-editor-body textarea{width:100%;flex:1;min-height:0;resize:vertical;font-family:var(--font-mono);font-size:13px;line-height:1.5;padding:12px;border:1px solid var(--c-border);border-radius:6px;background:var(--c-bg);color:var(--c-text);-moz-tab-size:2;tab-size:2}.config-editor-body textarea:focus{outline:none;border-color:var(--c-primary)}.wizard-wrap{display:flex;justify-content:center;padding-top:16px}.wizard{width:100%;max-width:580px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-xl);box-shadow:var(--shadow-l);overflow:hidden}.wizard-bar{height:3px;background:var(--c-border)}.wizard-bar-fill{height:100%;background:var(--c-accent);transition:width .4s cubic-bezier(.4,0,.2,1)}.wizard-steps{display:flex;padding:20px 24px 0;gap:0}.wizard-step-ind{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;position:relative}.wizard-step-ind+.wizard-step-ind:before{content:"";position:absolute;top:12px;right:calc(50% + 16px);width:calc(100% - 32px);height:1px;background:var(--c-border)}.wizard-step-ind.done+.wizard-step-ind:before{background:var(--c-accent)}.wizard-step-dot{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;background:var(--c-surface-alt);color:var(--c-text-3);border:2px solid var(--c-border);position:relative;z-index:1;transition:all var(--norm)}.wizard-step-ind.active .wizard-step-dot{background:var(--c-accent);color:#fff;border-color:var(--c-accent);box-shadow:0 0 12px var(--c-accent)}.wizard-step-ind.done .wizard-step-dot{background:var(--c-ok);color:#fff;border-color:var(--c-ok)}.wizard-step-label{font-size:11px;font-weight:500;color:var(--c-text-3);white-space:nowrap}.wizard-step-ind.active .wizard-step-label{color:var(--c-accent);font-weight:600}.wizard-step-ind.done .wizard-step-label{color:var(--c-ok)}.wizard-body{padding:28px 32px;min-height:260px}.wizard-icon{font-size:36px;margin-bottom:12px}.wizard-title{font-family:var(--font-display);font-size:20px;font-weight:700;color:var(--c-text);margin-bottom:6px;letter-spacing:-.02em}.wizard-desc{font-size:13px;color:var(--c-text-2);line-height:1.6;margin-bottom:24px}.wizard-checklist{display:flex;flex-direction:column;gap:10px}.wizard-check{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--c-text)}.wizard-check-num{width:24px;height:24px;border-radius:50%;background:var(--c-accent-bg);color:var(--c-accent);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex-shrink:0}.wizard-chips{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}.wizard-platform-card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-l);overflow:hidden;transition:border-color var(--fast)}.wizard-platform-card.on{border-color:var(--c-accent)}.wizard-platform-head{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;cursor:pointer;gap:8px}.wizard-platform-head:hover{background:var(--c-surface-alt)}.wizard-platform-meta{display:flex;align-items:center;gap:10px;min-width:0}.wizard-platform-icon{width:36px;height:36px;border-radius:var(--r-m);background:var(--c-surface-alt);display:flex;align-items:center;justify-content:center;font-size:20px;line-height:1;flex-shrink:0}.wizard-platform-title-block{display:flex;flex-direction:column;gap:1px;min-width:0}.wizard-platform-name{font-family:var(--font-display);font-size:14px;font-weight:600}.wizard-platform-desc{font-size:12px;color:var(--c-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wizard-platform-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.wizard-platform-chevron{font-size:12px;color:var(--c-text-3)}.wizard-platform-body{padding:0 16px 16px;border-top:1px solid var(--c-border)}.wizard-cred{background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-l);padding:20px;margin-bottom:14px}.wizard-cred:last-child{margin-bottom:0}.wizard-cred-name{font-family:var(--font-display);font-size:14px;font-weight:600;margin-bottom:14px;color:var(--c-text)}.wizard-radio-group{display:flex;flex-direction:column;gap:8px}.wizard-radio{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:2px solid var(--c-border);border-radius:var(--r-m);cursor:pointer;transition:all var(--fast)}.wizard-radio:hover{border-color:var(--c-accent-bdr)}.wizard-radio.on{border-color:var(--c-accent);background:var(--c-accent-bg)}.wizard-radio input[type=radio]{margin-top:2px;accent-color:var(--c-accent)}.wizard-radio-body{display:flex;flex-direction:column;gap:2px}.wizard-radio-label{font-size:13px;font-weight:600;color:var(--c-text)}.wizard-radio-desc{font-size:12px;color:var(--c-text-3)}.wizard-review-block{margin-bottom:20px}.wizard-review-head{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--c-text-3);margin-bottom:10px}.wizard-kv{display:flex;justify-content:space-between;align-items:center;padding:7px 0;border-bottom:1px solid var(--c-border);font-size:12px}.wizard-kv span{color:var(--c-text-2)}.wizard-kv code{font-family:var(--font-mono);font-size:11px;color:var(--c-text);background:var(--c-surface-alt);padding:2px 6px;border-radius:4px}.wizard-platforms{display:flex;flex-wrap:wrap;gap:6px}.wizard-platform-pill{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:var(--c-surface-alt);border-radius:999px;font-size:12px;font-weight:500}.wizard-platform-pill .cmd{font-size:10px;padding:1px 6px;border-radius:999px;background:var(--c-accent-bg);color:var(--c-accent);font-weight:500}.wizard-done{text-align:center;padding:20px 0}.wizard-nav{display:flex;align-items:center;padding:16px 32px 24px;gap:10px}.wizard-nav-spacer{flex:1}.wizard-pulse{animation:wiz-pulse 1.2s ease-in-out infinite}@keyframes wiz-pulse{0%,to{opacity:1}50%{opacity:.4}}.conn{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:32px}.conn-card{width:100%;max-width:420px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-xl);box-shadow:var(--shadow-l);padding:32px}.conn-logo{width:40px;height:40px;border-radius:var(--r-m);background:var(--c-accent);display:flex;align-items:center;justify-content:center;margin-bottom:20px}.conn-logo svg{width:22px;height:22px;color:#fff}.conn-title{font-family:var(--font-display);font-size:20px;font-weight:700;color:var(--c-text);margin-bottom:6px;letter-spacing:-.02em}.conn-desc{font-size:13px;color:var(--c-text-2);margin-bottom:24px;line-height:1.5}.conn-row{display:flex;gap:8px}.conn-input{flex:1;padding:8px 10px;font-family:var(--font-mono);font-size:13px;color:var(--c-text);background:var(--c-surface-alt);border:1px solid var(--c-border);border-radius:var(--r-s);outline:none;transition:border-color var(--fast)}.conn-input:focus{border-color:var(--c-accent);box-shadow:0 0 0 3px var(--c-accent-bg)}.conn-status{font-size:12px;margin-top:10px;color:var(--c-text-3)}.conn-status.ok{color:var(--c-ok)}.conn-status.err{color:var(--c-err)}@media(max-width:1024px){.stats-grid{grid-template-columns:1fr}}@media(max-width:768px){.content{padding:20px 16px 40px}.toast-stack{top:140px;right:16px;left:16px}.toast-msg{min-width:0;max-width:none}.app-header-main,.app-header-context{padding-left:16px;padding-right:16px}.app-header-main{min-height:auto;padding-top:12px;padding-bottom:12px;flex-wrap:wrap;align-items:flex-start}.app-nav{order:3;width:100%;overflow-x:auto;padding-bottom:2px}.app-header-spacer{display:none}.app-header-context{min-height:auto;align-items:flex-start;flex-direction:column}.app-context-actions{width:100%;justify-content:flex-start}.platform-grid{grid-template-columns:1fr}.platform-card-head{align-items:flex-start;flex-direction:column}.platform-card-right{width:100%;grid-template-columns:repeat(4,minmax(0,1fr))}.platform-card-control-menu,.platform-card-menu-btn{width:100%}.wizard-chips{grid-template-columns:1fr}}
@@ -7,8 +7,8 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com" />
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
9
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
10
- <script type="module" crossorigin src="./assets/index-DMoM2juo.js"></script>
11
- <link rel="stylesheet" crossorigin href="./assets/index-ByFnYJaR.css">
10
+ <script type="module" crossorigin src="./assets/index-DmvOPUfa.js"></script>
11
+ <link rel="stylesheet" crossorigin href="./assets/index-DKQMHruB.css">
12
12
  </head>
13
13
  <body>
14
14
  <div id="root"></div>