teleton 0.7.3 → 0.7.5

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 (36) hide show
  1. package/README.md +64 -35
  2. package/dist/{chunk-RBU6JXD3.js → chunk-2GLHOJ5C.js} +268 -59
  3. package/dist/chunk-5UVXJMOX.js +292 -0
  4. package/dist/{chunk-DAMCNMYL.js → chunk-AVDWXYQ7.js} +73 -28
  5. package/dist/{chunk-RMLQS3X6.js → chunk-CB2Y45HA.js} +106 -1
  6. package/dist/{chunk-5PLZ3KSO.js → chunk-DMXTIRUW.js} +5 -6
  7. package/dist/{chunk-A4GCOHCE.js → chunk-G2LLMJXJ.js} +1751 -116
  8. package/dist/{chunk-FNV5FF35.js → chunk-LCCVZ4D2.js} +32 -16
  9. package/dist/{chunk-BU453WX4.js → chunk-OGMVWDVU.js} +4172 -3792
  10. package/dist/chunk-QOQWUUA4.js +158 -0
  11. package/dist/{chunk-4DU3C27M.js → chunk-R4YSJ4EY.js} +5 -1
  12. package/dist/{chunk-XBKSS6DM.js → chunk-VFA7QMCZ.js} +5 -3
  13. package/dist/{chunk-VAUJSSD3.js → chunk-XQUHC3JZ.js} +1 -1
  14. package/dist/{chunk-RO62LO6Z.js → chunk-YP25WTQK.js} +2 -0
  15. package/dist/cli/index.js +234 -289
  16. package/dist/{client-RTNALK7W.js → client-O37XDCJB.js} +4 -5
  17. package/dist/index.js +12 -13
  18. package/dist/{memory-5SS3Q5EA.js → memory-KQALFUV3.js} +6 -7
  19. package/dist/{migrate-M7SJMDOL.js → migrate-UV3WEL5D.js} +6 -7
  20. package/dist/{server-FOC5P7U6.js → server-BHHJGUDF.js} +324 -16
  21. package/dist/{setup-server-BVVD2PR6.js → setup-server-G7UG2DI3.js} +26 -118
  22. package/dist/store-H4XPNGC2.js +34 -0
  23. package/dist/{task-dependency-resolver-WKZWJLLM.js → task-dependency-resolver-VMEVJRPO.js} +2 -2
  24. package/dist/{task-executor-PD3H4MLO.js → task-executor-WWSPBJ4V.js} +1 -1
  25. package/dist/{tool-index-MIVK3D7H.js → tool-index-2KH3OB6X.js} +5 -5
  26. package/dist/web/assets/index-BrVqauzj.css +1 -0
  27. package/dist/web/assets/index-Bx8JW3gV.js +72 -0
  28. package/dist/web/assets/{index.es-7MTSV5SL.js → index.es-Pet5-M13.js} +1 -1
  29. package/dist/web/index.html +2 -2
  30. package/package.json +3 -3
  31. package/dist/chunk-JQDLW7IE.js +0 -107
  32. package/dist/chunk-UCN6TI25.js +0 -143
  33. package/dist/web/assets/index-By_fs4Jl.js +0 -72
  34. package/dist/web/assets/index-CRDIf07k.css +0 -1
  35. package/scripts/patch-gramjs.sh +0 -46
  36. package/scripts/postinstall.mjs +0 -16
@@ -1,3 +1,6 @@
1
+ import {
2
+ getModelsForProvider
3
+ } from "./chunk-QOQWUUA4.js";
1
4
  import {
2
5
  ConfigSchema,
3
6
  DealsConfigSchema,
@@ -8,24 +11,22 @@ import {
8
11
  isNewWorkspace,
9
12
  saveWallet,
10
13
  walletExists
11
- } from "./chunk-DAMCNMYL.js";
14
+ } from "./chunk-AVDWXYQ7.js";
12
15
  import {
13
16
  getClaudeCodeApiKey,
14
- isClaudeCodeTokenValid
15
- } from "./chunk-JQDLW7IE.js";
16
- import {
17
17
  getProviderMetadata,
18
18
  getSupportedProviders,
19
+ isClaudeCodeTokenValid,
19
20
  validateApiKeyFormat
20
- } from "./chunk-RMLQS3X6.js";
21
- import "./chunk-XBKSS6DM.js";
21
+ } from "./chunk-CB2Y45HA.js";
22
+ import "./chunk-VFA7QMCZ.js";
22
23
  import {
23
24
  TELEGRAM_MAX_MESSAGE_LENGTH
24
- } from "./chunk-RO62LO6Z.js";
25
+ } from "./chunk-YP25WTQK.js";
25
26
  import {
26
27
  fetchWithTimeout
27
- } from "./chunk-VAUJSSD3.js";
28
- import "./chunk-4DU3C27M.js";
28
+ } from "./chunk-XQUHC3JZ.js";
29
+ import "./chunk-R4YSJ4EY.js";
29
30
  import {
30
31
  TELETON_ROOT
31
32
  } from "./chunk-EYWNOHMJ.js";
@@ -89,6 +90,10 @@ var TelegramAuthManager = class {
89
90
  await client.disconnect();
90
91
  throw new Error("Account already authenticated (SentCodeSuccess)");
91
92
  }
93
+ if (!(result instanceof Api.auth.SentCode)) {
94
+ await client.disconnect();
95
+ throw new Error("Unexpected auth response (payment required or unknown)");
96
+ }
92
97
  let codeDelivery = "sms";
93
98
  let fragmentUrl;
94
99
  let codeLength;
@@ -285,111 +290,6 @@ var TelegramAuthManager = class {
285
290
 
286
291
  // src/webui/routes/setup.ts
287
292
  var log2 = createLogger("Setup");
288
- var MODEL_OPTIONS = {
289
- anthropic: [
290
- {
291
- value: "claude-opus-4-6",
292
- name: "Claude Opus 4.6",
293
- description: "Most capable, 1M ctx, $5/M"
294
- },
295
- {
296
- value: "claude-opus-4-5-20251101",
297
- name: "Claude Opus 4.5",
298
- description: "Previous gen, 200K ctx, $5/M"
299
- },
300
- { value: "claude-sonnet-4-0", name: "Claude Sonnet 4", description: "Balanced, $3/M" },
301
- {
302
- value: "claude-haiku-4-5-20251001",
303
- name: "Claude Haiku 4.5",
304
- description: "Fast & cheap, $1/M"
305
- },
306
- {
307
- value: "claude-haiku-4-5-20251001",
308
- name: "Claude Haiku 4.5",
309
- description: "Fast & cheap, $1/M"
310
- }
311
- ],
312
- openai: [
313
- { value: "gpt-5", name: "GPT-5", description: "Most capable, 400K ctx, $1.25/M" },
314
- { value: "gpt-4o", name: "GPT-4o", description: "Balanced, 128K ctx, $2.50/M" },
315
- { value: "gpt-4.1", name: "GPT-4.1", description: "1M ctx, $2/M" },
316
- { value: "gpt-4.1-mini", name: "GPT-4.1 Mini", description: "1M ctx, cheap, $0.40/M" },
317
- { value: "o3", name: "o3", description: "Reasoning, 200K ctx, $2/M" }
318
- ],
319
- google: [
320
- { value: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast, 1M ctx, $0.30/M" },
321
- {
322
- value: "gemini-2.5-pro",
323
- name: "Gemini 2.5 Pro",
324
- description: "Most capable, 1M ctx, $1.25/M"
325
- },
326
- { value: "gemini-2.0-flash", name: "Gemini 2.0 Flash", description: "Cheap, 1M ctx, $0.10/M" }
327
- ],
328
- xai: [
329
- { value: "grok-4-fast", name: "Grok 4 Fast", description: "Vision, 2M ctx, $0.20/M" },
330
- { value: "grok-4", name: "Grok 4", description: "Reasoning, 256K ctx, $3/M" },
331
- { value: "grok-3", name: "Grok 3", description: "Stable, 131K ctx, $3/M" }
332
- ],
333
- groq: [
334
- {
335
- value: "meta-llama/llama-4-maverick-17b-128e-instruct",
336
- name: "Llama 4 Maverick",
337
- description: "Vision, 131K ctx, $0.20/M"
338
- },
339
- { value: "qwen/qwen3-32b", name: "Qwen3 32B", description: "Reasoning, 131K ctx, $0.29/M" },
340
- {
341
- value: "deepseek-r1-distill-llama-70b",
342
- name: "DeepSeek R1 70B",
343
- description: "Reasoning, 131K ctx, $0.75/M"
344
- },
345
- {
346
- value: "llama-3.3-70b-versatile",
347
- name: "Llama 3.3 70B",
348
- description: "General purpose, 131K ctx, $0.59/M"
349
- }
350
- ],
351
- openrouter: [
352
- { value: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5", description: "200K ctx, $5/M" },
353
- { value: "openai/gpt-5", name: "GPT-5", description: "400K ctx, $1.25/M" },
354
- { value: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "1M ctx, $0.30/M" },
355
- {
356
- value: "deepseek/deepseek-r1",
357
- name: "DeepSeek R1",
358
- description: "Reasoning, 64K ctx, $0.70/M"
359
- },
360
- { value: "x-ai/grok-4", name: "Grok 4", description: "256K ctx, $3/M" }
361
- ],
362
- moonshot: [
363
- { value: "kimi-k2.5", name: "Kimi K2.5", description: "Free, 256K ctx, multimodal" },
364
- {
365
- value: "kimi-k2-thinking",
366
- name: "Kimi K2 Thinking",
367
- description: "Free, 256K ctx, reasoning"
368
- }
369
- ],
370
- mistral: [
371
- {
372
- value: "devstral-small-2507",
373
- name: "Devstral Small",
374
- description: "Coding, 128K ctx, $0.10/M"
375
- },
376
- {
377
- value: "devstral-medium-latest",
378
- name: "Devstral Medium",
379
- description: "Coding, 262K ctx, $0.40/M"
380
- },
381
- {
382
- value: "mistral-large-latest",
383
- name: "Mistral Large",
384
- description: "General, 128K ctx, $2/M"
385
- },
386
- {
387
- value: "magistral-small",
388
- name: "Magistral Small",
389
- description: "Reasoning, 128K ctx, $0.50/M"
390
- }
391
- ]
392
- };
393
293
  function maskKey(key) {
394
294
  if (key.length <= 10) return "***";
395
295
  return key.slice(0, 6) + "..." + key.slice(-4);
@@ -446,8 +346,7 @@ function createSetupRoutes() {
446
346
  });
447
347
  app.get("/models/:provider", (c) => {
448
348
  const provider = c.req.param("provider");
449
- const modelKey = provider === "claude-code" ? "anthropic" : provider;
450
- const models = MODEL_OPTIONS[modelKey] || [];
349
+ const models = getModelsForProvider(provider);
451
350
  const result = [
452
351
  ...models,
453
352
  {
@@ -760,7 +659,6 @@ function createSetupRoutes() {
760
659
  },
761
660
  storage: {
762
661
  sessions_file: `${workspace.root}/sessions.json`,
763
- pairing_file: `${workspace.root}/pairing.json`,
764
662
  memory_file: `${workspace.root}/memory.json`,
765
663
  history_limit: 100
766
664
  },
@@ -779,7 +677,7 @@ function createSetupRoutes() {
779
677
  logging: { level: "info", pretty: true },
780
678
  dev: { hot_reload: false },
781
679
  tool_rag: {
782
- enabled: true,
680
+ enabled: false,
783
681
  top_k: 25,
784
682
  always_include: [
785
683
  "telegram_send_message",
@@ -792,10 +690,20 @@ function createSetupRoutes() {
792
690
  ],
793
691
  skip_unlimited_providers: false
794
692
  },
693
+ capabilities: {
694
+ exec: {
695
+ mode: input.capabilities?.exec?.mode ?? "off",
696
+ scope: "admin-only",
697
+ allowlist: [],
698
+ limits: { timeout: 120, max_output: 5e4 },
699
+ audit: { log_commands: true }
700
+ }
701
+ },
795
702
  mcp: { servers: {} },
796
703
  plugins: {},
797
704
  ...input.cocoon ? { cocoon: input.cocoon } : {},
798
705
  ...input.tonapi_key ? { tonapi_key: input.tonapi_key } : {},
706
+ ...input.toncenter_api_key ? { toncenter_api_key: input.toncenter_api_key } : {},
799
707
  ...input.tavily_api_key ? { tavily_api_key: input.tavily_api_key } : {}
800
708
  };
801
709
  ConfigSchema.parse(config);
@@ -0,0 +1,34 @@
1
+ import {
2
+ getOrCreateSession,
3
+ getSession,
4
+ incrementMessageCount,
5
+ loadSessionStore,
6
+ pruneOldSessions,
7
+ resetSession,
8
+ resetSessionWithPolicy,
9
+ saveSessionStore,
10
+ shouldResetSession,
11
+ updateSession
12
+ } from "./chunk-5UVXJMOX.js";
13
+ import "./chunk-2GLHOJ5C.js";
14
+ import "./chunk-LCCVZ4D2.js";
15
+ import "./chunk-VFA7QMCZ.js";
16
+ import "./chunk-YP25WTQK.js";
17
+ import "./chunk-XQUHC3JZ.js";
18
+ import "./chunk-R4YSJ4EY.js";
19
+ import "./chunk-EYWNOHMJ.js";
20
+ import "./chunk-RCMD3U65.js";
21
+ import "./chunk-NUGDTPE4.js";
22
+ import "./chunk-QGM4M3NI.js";
23
+ export {
24
+ getOrCreateSession,
25
+ getSession,
26
+ incrementMessageCount,
27
+ loadSessionStore,
28
+ pruneOldSessions,
29
+ resetSession,
30
+ resetSessionWithPolicy,
31
+ saveSessionStore,
32
+ shouldResetSession,
33
+ updateSession
34
+ };
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  MAX_DEPENDENTS_PER_TASK
3
- } from "./chunk-RO62LO6Z.js";
3
+ } from "./chunk-YP25WTQK.js";
4
4
  import {
5
5
  BATCH_TRIGGER_DELAY_MS
6
- } from "./chunk-4DU3C27M.js";
6
+ } from "./chunk-R4YSJ4EY.js";
7
7
  import {
8
8
  createLogger
9
9
  } from "./chunk-RCMD3U65.js";
@@ -6,7 +6,7 @@ import {
6
6
  MAX_TOTAL_PROMPT_CHARS,
7
7
  SECONDS_PER_DAY,
8
8
  SECONDS_PER_HOUR
9
- } from "./chunk-RO62LO6Z.js";
9
+ } from "./chunk-YP25WTQK.js";
10
10
  import "./chunk-QGM4M3NI.js";
11
11
 
12
12
  // src/telegram/task-executor.ts
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  serializeEmbedding
3
- } from "./chunk-FNV5FF35.js";
4
- import "./chunk-XBKSS6DM.js";
3
+ } from "./chunk-LCCVZ4D2.js";
4
+ import "./chunk-VFA7QMCZ.js";
5
5
  import {
6
6
  TOOL_RAG_KEYWORD_WEIGHT,
7
7
  TOOL_RAG_MIN_SCORE,
8
8
  TOOL_RAG_VECTOR_WEIGHT
9
- } from "./chunk-RO62LO6Z.js";
10
- import "./chunk-VAUJSSD3.js";
11
- import "./chunk-4DU3C27M.js";
9
+ } from "./chunk-YP25WTQK.js";
10
+ import "./chunk-XQUHC3JZ.js";
11
+ import "./chunk-R4YSJ4EY.js";
12
12
  import "./chunk-EYWNOHMJ.js";
13
13
  import {
14
14
  createLogger
@@ -0,0 +1 @@
1
+ *{box-sizing:border-box;margin:0;padding:0}:root{color-scheme:dark;--bg: #000000;--surface: rgba(255, 255, 255, .05);--surface-hover: rgba(255, 255, 255, .08);--surface-active: rgba(255, 255, 255, .12);--glass: rgba(255, 255, 255, .06);--glass-border: rgba(255, 255, 255, .1);--glass-border-strong: rgba(255, 255, 255, .15);--text: rgba(255, 255, 255, .92);--text-secondary: rgba(255, 255, 255, .55);--text-tertiary: rgba(255, 255, 255, .5);--text-on-accent: #ffffff;--accent: #0A84FF;--accent-dim: rgba(10, 132, 255, .15);--green: #30D158;--green-dim: rgba(48, 209, 88, .15);--orange: rgba(255, 255, 255, .55);--orange-dim: rgba(255, 255, 255, .06);--red: #FF453A;--red-dim: rgba(255, 69, 58, .15);--purple: #BF5AF2;--purple-dim: rgba(191, 90, 242, .15);--cyan: #64D2FF;--cyan-dim: rgba(100, 210, 255, .15);--separator: rgba(255, 255, 255, .08);--sidebar-bg: rgba(255, 255, 255, .03);--scrollbar: rgba(255, 255, 255, .1);--scrollbar-hover: rgba(255, 255, 255, .2);--shadow-sm: 0 1px 3px rgba(0, 0, 0, .3);--thumb-bg: #ffffff;--radius-sm: 10px;--radius-md: 14px;--radius-lg: 20px;--radius-xl: 26px;--font-xs: 11px;--font-sm: 12px;--font-md: 13px;--font-base: 14px;--font-lg: 16px;--font-xl: 20px;--font-mono: "SF Mono", "Fira Code", "Cascadia Code", monospace;--space-xs: 4px;--space-sm: 8px;--space-md: 12px;--space-lg: 16px;--space-xl: 24px;--space-2xl: 32px;--blur: 40px;--blur-heavy: 80px}html,body{height:100%}body{font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;background:var(--bg);color:var(--text);line-height:1.5;font-size:14px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#root{min-height:100vh}.container{display:flex;min-height:100vh}.sidebar{width:220px;padding:20px 12px;background:var(--sidebar-bg);border-right:1px solid var(--separator);display:flex;flex-direction:column;gap:4px;position:sticky;top:0;height:100vh;overflow-y:auto}.sidebar-brand{padding:4px 12px 20px;font-size:15px;font-weight:600;letter-spacing:-.2px;color:var(--text)}.sidebar nav{display:flex;flex-direction:column;gap:2px}.sidebar a{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:var(--radius-sm);color:var(--text-secondary);text-decoration:none;font-size:13px;font-weight:500;transition:all .2s ease}.sidebar a:hover{color:var(--text);background:var(--surface);text-decoration:none}.sidebar a.active{color:var(--text);background:var(--surface-hover);text-decoration:none}.sidebar-link-disabled{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:var(--radius-sm);color:var(--text-tertiary);font-size:13px;font-weight:500;opacity:.4;cursor:default;-webkit-user-select:none;user-select:none}.main{flex:1;padding:32px;max-width:1080px;min-width:0;margin:0 auto}.header{margin-bottom:28px}.header h1{font-size:22px;font-weight:600;letter-spacing:-.4px;margin-bottom:4px}.header p{color:var(--text-secondary);font-size:13px}.card{background:var(--glass);backdrop-filter:blur(var(--blur)) saturate(180%);-webkit-backdrop-filter:blur(var(--blur)) saturate(180%);border:1px solid var(--glass-border);border-radius:var(--radius-lg);padding:20px;margin-bottom:16px}.card h2{font-size:15px;font-weight:600;letter-spacing:-.2px}.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:20px}.stat-card{background:var(--glass);backdrop-filter:blur(var(--blur)) saturate(180%);-webkit-backdrop-filter:blur(var(--blur)) saturate(180%);border:1px solid var(--glass-border);border-radius:var(--radius-md);padding:16px}.stat-card h3{font-size:12px;font-weight:500;color:var(--text-secondary);margin-bottom:6px;text-transform:uppercase;letter-spacing:.5px}.stat-card .value{font-size:24px;font-weight:600;letter-spacing:-.5px}.status-bar{padding:14px 18px!important}.status-row{display:flex;align-items:center;justify-content:center;gap:24px;flex-wrap:wrap}.status-divider{height:1px;background:var(--separator);margin:10px 0}.metric{display:flex;align-items:baseline;gap:6px}.metric-label{font-size:11px;font-weight:500;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.4px}.metric-value{font-size:14px;font-weight:600;color:var(--text)}.metric-value.mono{font-size:13px;font-family:SF Mono,Fira Code,monospace}.dashboard-root{display:flex;flex-direction:column;height:calc(100vh - 64px);min-height:0}.dashboard-settings{display:grid;grid-template-columns:1fr 1fr;gap:12px}@media(max-width:640px){.dashboard-settings{grid-template-columns:1fr}}.dashboard-logs{flex:1;min-height:0;display:flex;flex-direction:column;margin-bottom:0!important}.dashboard-logs-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.dashboard-logs-scroll{flex:1;min-height:0;overflow-y:auto}button{font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;background:var(--accent);color:var(--text-on-accent);border:none;padding:8px 16px;border-radius:var(--radius-sm);cursor:pointer;font-size:13px;font-weight:500;transition:opacity .15s ease}button:hover{opacity:.85}button:disabled{opacity:.4;cursor:not-allowed}input,textarea,select{font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;background:var(--surface);border:1px solid var(--glass-border);color:var(--text);padding:10px 14px;border-radius:var(--radius-sm);font-size:13px;outline:none;transition:border-color .2s ease}select{-moz-appearance:none;appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.55)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center;padding-right:36px;cursor:pointer}.custom-select{position:relative}.custom-select-trigger{width:100%;display:flex;align-items:center;justify-content:space-between;background:var(--surface);border:1px solid var(--glass-border);color:var(--text);padding:10px 14px;border-radius:var(--radius-sm);font-size:13px;font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;cursor:pointer;transition:border-color .2s ease}.custom-select-trigger:hover{border-color:var(--glass-border-strong);opacity:1}.custom-select-trigger:focus{border-color:var(--accent)}.custom-select-trigger svg{color:var(--text-secondary);flex-shrink:0}.custom-select-menu{background:var(--bg);border:1px solid var(--glass-border-strong);border-radius:var(--radius-sm);padding:4px;z-index:10000;box-shadow:0 8px 24px #00000080;max-height:200px;overflow-y:auto}.custom-select-option{padding:8px 12px;border-radius:6px;font-size:13px;color:var(--text-secondary);cursor:pointer;transition:all .1s ease}.custom-select-option:hover,.custom-select-option.focused,.custom-select-option.active{background:var(--surface-hover);color:var(--text)}.custom-select-option.active.focused{background:var(--surface-active);color:var(--text)}input:focus,textarea:focus,select:focus{border-color:var(--accent)}input:focus-visible,textarea:focus-visible,select:focus-visible{outline:2px solid var(--accent);outline-offset:2px}input::placeholder,textarea::placeholder{color:var(--text-tertiary)}textarea{width:100%;min-height:400px;font-family:SF Mono,Fira Code,Cascadia Code,monospace;font-size:13px;line-height:1.6;resize:vertical;border-radius:var(--radius-md)}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:none;opacity:.8}.badge{display:inline-flex;align-items:center;padding:2px 7px;border-radius:4px;font-size:11px;font-weight:500;letter-spacing:.2px;background:var(--surface);color:var(--text-secondary);border:1px solid var(--separator)}.badge.count{color:var(--text)}.badge.warn{color:var(--text-secondary);border-color:#ffffff1f}.badge.error{color:var(--red);border-color:color-mix(in srgb,var(--red) 30%,transparent)}.badge.always{color:var(--green);border-color:color-mix(in srgb,var(--green) 30%,transparent)}.tabs{display:flex;gap:2px;padding:3px;background:var(--surface);border:1px solid var(--glass-border);border-radius:var(--radius-sm);margin-bottom:16px}.tab{position:relative;padding:7px 16px;background:none;border:none;color:var(--text-secondary);cursor:pointer;border-radius:8px;font-size:13px;font-weight:500;transition:all .2s ease;flex:1;text-align:center}.tab:hover{color:var(--text);opacity:1}.tab.active{color:var(--text);background:var(--surface-active);box-shadow:0 1px 3px #0003}.tab .tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;margin-left:6px;border-radius:9px;font-size:11px;font-weight:600;background:var(--glass);color:var(--text-tertiary)}.tab.active .tab-count{background:var(--surface-active);color:var(--text)}button.btn-ghost{background:var(--surface);color:var(--text-secondary);border:1px solid var(--glass-border)}button.btn-ghost:hover{background:var(--surface-hover);color:var(--text);opacity:1}button.btn-danger{background:var(--surface);color:var(--text);border:1px solid var(--glass-border)}button.btn-danger:hover{background:var(--surface-hover);opacity:1}button.btn-sm{padding:5px 10px;font-size:12px;border-radius:8px}.tag-pill{display:inline-flex;align-items:center;padding:3px 9px;border-radius:12px;font-size:11px;font-weight:500;background:var(--surface);color:var(--text-secondary);border:1px solid var(--glass-border);cursor:pointer;transition:all .15s ease}.tag-pill:hover,.tag-pill.active{background:var(--surface-hover);color:var(--text);border-color:var(--glass-border-strong)}.form-group{margin-bottom:16px}.form-group label:not(.label-inline):not(.card-toggle):not(.toggle){display:block;margin-bottom:6px;font-size:13px;font-weight:500;color:var(--text)}.alert{padding:10px 14px;border-radius:var(--radius-sm);margin-bottom:16px;font-size:13px}.alert.success,.alert.error{background:#ffffff0a;color:var(--text-secondary);border:1px solid rgba(255,255,255,.08)}.file-row{transition:background-color .15s ease}.file-row:hover{background-color:var(--sidebar-bg)}.icon-button{background:none;border:none;cursor:pointer;padding:4px 6px;font-size:15px;opacity:.5;filter:grayscale(1);transition:opacity .15s,filter .15s}.icon-button:hover{opacity:1;filter:none}.log-entry{font-family:SF Mono,Fira Code,Cascadia Code,monospace;font-size:12px;padding:5px 0;border-bottom:1px solid var(--separator);line-height:1.5}.log-entry:last-child{border-bottom:none}.accordion-header{position:relative;z-index:2;padding:14px 16px;cursor:pointer;display:flex;align-items:center;gap:12px;transition:background-color .15s ease}.accordion-header:hover{background-color:var(--sidebar-bg)}.accordion-chevron{font-size:10px;color:var(--text-secondary);width:12px;flex-shrink:0}.tool-row{position:relative;padding:10px 14px;background:var(--surface);border-radius:var(--radius-sm);display:flex;justify-content:space-between;align-items:center;transition:background .15s ease}.tool-row:hover{background:var(--surface-hover)}.tool-name{font-size:13px;font-weight:500;margin-bottom:2px}.tool-desc{font-size:12px;color:var(--text-secondary)}.plugin-meta{font-size:12px;color:var(--text-secondary);margin-bottom:8px}.result-item{padding:14px;background:var(--surface);border-radius:var(--radius-sm);margin-bottom:8px}.result-meta{font-size:12px;color:var(--text-secondary);margin-bottom:6px}.result-text{font-size:13px;line-height:1.6}.status-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px}.status-dot.connected{background:var(--green)}.status-dot.disconnected{background:var(--red)}.login-container{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:2rem}.login-card{background:var(--glass);backdrop-filter:blur(var(--blur)) saturate(180%);-webkit-backdrop-filter:blur(var(--blur)) saturate(180%);border:1px solid var(--glass-border);border-radius:var(--radius-xl);padding:32px;max-width:380px;width:100%}.login-card h1{font-size:20px;font-weight:600;margin-bottom:8px;letter-spacing:-.3px}.login-card p{color:var(--text-secondary);font-size:13px;margin-bottom:24px;line-height:1.5}.section-title{font-size:13px;font-weight:600;color:var(--text);text-transform:uppercase;letter-spacing:.5px;margin-bottom:12px}.empty{color:var(--text-tertiary);font-size:13px;padding:20px 0;text-align:center}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--scrollbar);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-hover)}.scope-seg{display:inline-flex;padding:3px;background:var(--glass);border-radius:10px;gap:2px}.scope-seg button{padding:4px 10px;font-size:11px;font-weight:500;background:none;color:var(--text-tertiary);border:none;border-radius:7px;cursor:pointer;transition:all .2s ease}.scope-seg button:hover:not(:disabled):not(.active){color:var(--text-secondary);opacity:1}.scope-seg button.active{background:var(--surface-active);color:var(--text)}.scope-seg.lg{padding:4px;border-radius:12px;gap:4px;width:100%}.scope-seg.lg button{flex:1;padding:10px 20px;font-size:14px;font-weight:600;border-radius:8px}.scope-seg.disabled{opacity:.4;pointer-events:none}.toggle{position:relative;width:42px;height:26px;flex-shrink:0;cursor:pointer}.toggle input{opacity:0;width:0;height:0;position:absolute}.toggle-track{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--scrollbar);border-radius:13px;transition:background .25s ease}.toggle input:checked+.toggle-track{background:var(--accent)}.toggle-thumb{position:absolute;top:3px;left:3px;width:20px;height:20px;background:var(--thumb-bg);border-radius:50%;transition:transform .25s cubic-bezier(.4,0,.2,1);box-shadow:var(--shadow-sm)}.toggle input:checked~.toggle-thumb{transform:translate(16px)}.toggle input:disabled+.toggle-track{opacity:.4}.toggle input:disabled~.toggle-thumb{opacity:.4}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:100}.modal{background:var(--bg);border:1px solid var(--glass-border-strong);border-radius:var(--radius-lg);padding:24px;max-width:480px;width:90%;max-height:80vh;overflow-y:auto;box-shadow:0 16px 48px #00000080}.loading{color:var(--text-tertiary);font-size:13px;padding:40px 0;text-align:center}.setup-container{max-width:720px;margin:0 auto;padding:40px 24px;min-height:100vh}.setup-header{margin-bottom:32px}.setup-header h1{font-size:22px;font-weight:600;letter-spacing:-.4px;margin-bottom:8px}.setup-content{margin-top:28px}.setup-nav{display:flex;gap:10px;margin-top:20px;padding-top:16px;border-top:1px solid var(--separator);max-width:720px}.step-indicator{display:flex;align-items:flex-start;padding:16px 0;margin-bottom:12px;max-width:720px}.step-cell{display:flex;flex-direction:column;align-items:flex-start;flex:1;min-width:0;position:relative}.step-cell:last-child{flex:0 0 auto}.step-cell-top{display:flex;align-items:center;width:100%}.step-dot{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;flex-shrink:0;background:var(--surface);color:var(--text-tertiary);border:1px solid var(--glass-border);transition:all .2s ease}.step-dot.active{background:var(--surface-active);color:var(--text);border-color:var(--glass-border-strong)}.step-dot.completed{background:var(--green-dim);color:var(--green);border-color:#30d1584d}.step-line{flex:1;height:1px;background:var(--glass-border);margin:0 8px;min-width:8px}.step-line.completed{background:#30d1584d}.step-label{font-size:10px;color:var(--text-primary);opacity:.3;text-align:center;white-space:nowrap;margin-top:6px;width:28px;position:relative;left:0;transition:opacity .2s ease}.step-label{overflow:visible;width:max-content;transform:translate(calc(12px - 50%))}.step-label.active{opacity:1;font-weight:500;color:var(--accent)}.step-label.completed{opacity:.5}.provider-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px}.provider-card{background:var(--surface);border:1px solid var(--glass-border);border-radius:var(--radius-md);padding:14px;cursor:pointer;transition:all .15s ease}.provider-card:hover{background:var(--surface-hover);border-color:var(--glass-border-strong)}.provider-card.selected{border-color:#ffffff4d;background:#ffffff14}.provider-card h3{font-size:13px;font-weight:600;margin-bottom:4px}.provider-card .provider-meta{font-size:11px;color:var(--text-secondary)}.mnemonic-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:6px;margin:12px 0;list-style:none;padding:0}.mnemonic-word{display:flex;align-items:center;gap:6px;padding:6px 8px;background:var(--surface);border-radius:6px;font-size:12px;font-family:SF Mono,Fira Code,monospace}.mnemonic-word .num{color:var(--text-tertiary);font-size:10px;min-width:16px}.guide-dropdown{margin-bottom:20px;border-radius:var(--radius-sm);border:1px solid rgba(255,255,255,.08);background:#ffffff08}.guide-dropdown summary{padding:10px 14px;font-size:13px;font-weight:500;color:var(--text);cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px}.guide-dropdown summary::-webkit-details-marker{display:none}.guide-dropdown summary:before{content:"▶";font-size:9px;color:var(--text-tertiary);transition:transform .2s ease}.guide-dropdown[open] summary:before{transform:rotate(90deg)}.guide-dropdown summary:hover{color:var(--text)}.guide-content{padding:0 14px 14px;font-size:13px;line-height:1.6;color:var(--text-secondary);border-top:1px solid rgba(255,255,255,.06)}.guide-section{margin-top:12px}.guide-section strong{color:var(--text);font-size:12px;text-transform:uppercase;letter-spacing:.5px}.guide-section ol{margin:6px 0 0 20px;padding:0}.guide-section ol li{margin-bottom:4px}.guide-section p{margin:6px 0 0}.guide-section code{background:#ffffff14;padding:1px 5px;border-radius:3px;font-size:12px}.warning-card{padding:14px 16px;border-radius:var(--radius-sm);margin-bottom:16px;font-size:13px;line-height:1.6;background:#ffffff0a;color:var(--text-secondary);border:1px solid rgba(255,255,255,.08)}.warning-card strong{color:var(--text)}.info-panel{padding:12px 14px;border-radius:var(--radius-sm);margin-bottom:16px;font-size:13px;line-height:1.5;background:#ffffff0a;color:var(--text-secondary);border:1px solid rgba(255,255,255,.08)}.code-input{text-align:center;font-size:24px;font-weight:600;letter-spacing:8px;padding:12px 20px;max-width:200px;font-family:SF Mono,Fira Code,monospace}.step-title{font-size:var(--font-lg);font-weight:600;letter-spacing:-.2px;margin-bottom:var(--space-xs)}.step-description{font-size:var(--font-md);color:#ffffffbf;margin-bottom:var(--space-lg)}.helper-text{font-size:var(--font-sm);color:var(--text-secondary);margin-top:var(--space-xs)}.helper-text.error{color:var(--red)}.helper-text.success{color:var(--green)}.form-row{display:flex;align-items:center;gap:var(--space-sm)}.password-wrapper{position:relative;display:flex;align-items:center}.eye-toggle{position:absolute;right:8px;background:none;border:none;cursor:pointer;opacity:.4;padding:4px;display:flex;align-items:center;color:var(--text)}.eye-toggle:hover{opacity:.8}.label-inline{display:flex;align-items:flex-start;gap:12px;cursor:pointer}.info-box{padding:var(--space-md) 14px;border-radius:var(--radius-sm);font-size:var(--font-md);line-height:1.5;background:var(--surface);color:var(--text-secondary);border:1px solid var(--separator);margin-bottom:var(--space-lg)}.code-block{display:inline-block;padding:10px 20px;background:var(--surface);border-radius:var(--radius-sm);font-size:var(--font-base);font-family:var(--font-mono)}.mono{font-family:var(--font-mono)}.text-center{text-align:center}.text-muted{color:var(--text-secondary)}.w-full{width:100%}.card-toggle{display:flex;align-items:center;justify-content:space-between}.card-toggle.open{margin-bottom:var(--space-md)}.module-list{display:flex;flex-direction:column}.module-item{padding:14px 0;border-bottom:1px solid var(--glass-border)}.module-item:first-child{padding-top:0}.module-item:last-child{border-bottom:none}.module-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.module-info{display:flex;flex-direction:column;gap:2px}.module-info strong{font-size:var(--font-md)}.module-desc{font-size:var(--font-sm);color:var(--text-tertiary)}.module-body{margin-top:var(--space-md);padding-top:var(--space-sm)}.review-list{display:flex;flex-direction:column;gap:var(--space-xs);font-size:var(--font-md)}.review-label{color:var(--text-secondary)}.review-unset{color:var(--text-tertiary);font-style:italic}.label-inline input[type=checkbox],.label-inline input[type=radio]{-moz-appearance:none;appearance:none;-webkit-appearance:none;width:18px;height:18px;padding:0;flex-shrink:0;border:1.5px solid var(--glass-border-strong);background:var(--surface);cursor:pointer;transition:all .15s ease;position:relative;margin-top:3px}.label-inline input[type=checkbox]{border-radius:5px}.label-inline input[type=radio]{border-radius:50%}.label-inline input[type=checkbox]:checked{background:var(--accent);border-color:var(--accent)}.label-inline input[type=checkbox]:checked:after{content:"";position:absolute;left:5px;top:2px;width:5px;height:9px;border:solid var(--text-on-accent);border-width:0 2px 2px 0;transform:rotate(45deg)}.label-inline input[type=radio]:checked{border-color:var(--accent);background:var(--surface)}.label-inline input[type=radio]:checked:after{content:"";position:absolute;top:4px;left:4px;width:8px;height:8px;border-radius:50%;background:var(--accent)}.label-inline input[type=checkbox]:focus-visible,.label-inline input[type=radio]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}button.btn-lg{padding:12px 24px;font-size:var(--font-base);font-weight:600}.step-content{animation:step-fade-in .15s ease-out;max-width:720px}@keyframes step-fade-in{0%{opacity:0}to{opacity:1}}.provider-switch-zone{padding:14px 16px;background:var(--surface);border:1px solid var(--glass-border-strong);border-radius:var(--radius-sm);animation:step-fade-in .15s ease-out}.spinner{display:inline-block;width:14px;height:14px;border:2px solid var(--glass-border);border-top-color:currentColor;border-radius:50%;animation:spin .6s linear infinite;vertical-align:middle}.spinner.sm{width:12px;height:12px;border-width:1.5px}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width:768px){.container{flex-direction:column}.sidebar{width:100%;height:auto;position:relative;flex-direction:row;overflow-x:auto;padding:12px;border-right:none;border-bottom:1px solid var(--separator)}.sidebar-brand{padding:0 12px 0 4px}.sidebar-brand img{height:32px!important}.sidebar nav{flex-direction:row;gap:2px}.sidebar a{white-space:nowrap;padding:6px 10px}.step-indicator{padding:12px 0;margin-bottom:8px}.step-dot{width:22px;height:22px;font-size:9px}.step-label{font-size:8px}.main{padding:20px 16px}button{min-height:44px;padding:10px 16px}button.btn-sm,button.btn-ghost{min-height:36px}input,textarea,select,.custom-select-trigger{min-height:44px;font-size:16px}}.pill-bar{display:inline-flex;gap:var(--space-sm);padding:var(--space-xs);background:var(--surface);border:1px solid var(--glass-border);border-radius:var(--radius-md);margin-bottom:var(--space-xl);overflow-x:auto}.pill-bar button{padding:var(--space-sm) var(--space-lg);border-radius:var(--radius-sm);border:none;background:transparent;color:var(--text-secondary);font-size:var(--font-md);font-weight:500;cursor:pointer;white-space:nowrap;transition:all .15s ease}.pill-bar button:hover{color:var(--text);background:var(--surface-hover)}.pill-bar button.active{background:var(--accent);color:var(--text-on-accent)}