teleton 0.7.2 → 0.7.4

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 (31) hide show
  1. package/README.md +31 -12
  2. package/dist/{chunk-ND2X5FWB.js → chunk-5PLZ3KSO.js} +16 -3
  3. package/dist/{chunk-NERLQY2H.js → chunk-BGC2IUM5.js} +73 -15
  4. package/dist/{chunk-FNV5FF35.js → chunk-EK7M5K26.js} +29 -13
  5. package/dist/chunk-JQDLW7IE.js +107 -0
  6. package/dist/{chunk-VSMUAU5X.js → chunk-LAQOUFOJ.js} +2419 -2132
  7. package/dist/chunk-QOQWUUA4.js +158 -0
  8. package/dist/{chunk-LRCPA7SC.js → chunk-RMLQS3X6.js} +15 -3
  9. package/dist/{chunk-UDD7FYOU.js → chunk-WIKM24GZ.js} +1 -18
  10. package/dist/{chunk-RBU6JXD3.js → chunk-XDYDA2KV.js} +1 -1
  11. package/dist/{chunk-JHKWHGBM.js → chunk-YFG2QHLA.js} +380 -47
  12. package/dist/cli/index.js +216 -272
  13. package/dist/{client-3VWE7NC4.js → client-RTNALK7W.js} +3 -2
  14. package/dist/{get-my-gifts-RI7FAXAL.js → get-my-gifts-TPVUGUWT.js} +1 -1
  15. package/dist/index.js +9 -10
  16. package/dist/{memory-5SS3Q5EA.js → memory-JQZ6MTRU.js} +2 -2
  17. package/dist/{migrate-M7SJMDOL.js → migrate-GS5ACQDA.js} +2 -2
  18. package/dist/{server-NPSODUMA.js → server-TCJOBV3D.js} +292 -11
  19. package/dist/{setup-server-C7ZTPHD5.js → setup-server-YHYJLAMA.js} +77 -112
  20. package/dist/{tool-index-MIVK3D7H.js → tool-index-6HBRVXVG.js} +1 -1
  21. package/dist/web/assets/index-B6M9knfJ.css +1 -0
  22. package/dist/web/assets/index-DAGeQfVZ.js +72 -0
  23. package/dist/web/assets/{index.es-D81xLR29.js → index.es-CqZHj0tz.js} +1 -1
  24. package/dist/web/index.html +2 -2
  25. package/package.json +2 -2
  26. package/dist/chunk-EHEV7FJ7.js +0 -157
  27. package/dist/chunk-QUAPFI2N.js +0 -42
  28. package/dist/endpoint-FLYNEZ2F.js +0 -7
  29. package/dist/format-transactions-FD74HI5N.js +0 -9
  30. package/dist/web/assets/index-BqwoDycr.js +0 -72
  31. package/dist/web/assets/index-CRDIf07k.css +0 -1
@@ -1,3 +1,6 @@
1
+ import {
2
+ getModelsForProvider
3
+ } from "./chunk-QOQWUUA4.js";
1
4
  import {
2
5
  ConfigSchema,
3
6
  DealsConfigSchema,
@@ -8,13 +11,16 @@ import {
8
11
  isNewWorkspace,
9
12
  saveWallet,
10
13
  walletExists
11
- } from "./chunk-NERLQY2H.js";
12
- import "./chunk-QUAPFI2N.js";
14
+ } from "./chunk-BGC2IUM5.js";
15
+ import {
16
+ getClaudeCodeApiKey,
17
+ isClaudeCodeTokenValid
18
+ } from "./chunk-JQDLW7IE.js";
13
19
  import {
14
20
  getProviderMetadata,
15
21
  getSupportedProviders,
16
22
  validateApiKeyFormat
17
- } from "./chunk-LRCPA7SC.js";
23
+ } from "./chunk-RMLQS3X6.js";
18
24
  import "./chunk-XBKSS6DM.js";
19
25
  import {
20
26
  TELEGRAM_MAX_MESSAGE_LENGTH
@@ -74,7 +80,31 @@ var TelegramAuthManager = class {
74
80
  baseLogger: gramLogger
75
81
  });
76
82
  await client.connect();
77
- const result = await client.sendCode({ apiId, apiHash }, phone);
83
+ const result = await client.invoke(
84
+ new Api.auth.SendCode({
85
+ phoneNumber: phone,
86
+ apiId,
87
+ apiHash,
88
+ settings: new Api.CodeSettings({})
89
+ })
90
+ );
91
+ if (result instanceof Api.auth.SentCodeSuccess) {
92
+ await client.disconnect();
93
+ throw new Error("Account already authenticated (SentCodeSuccess)");
94
+ }
95
+ let codeDelivery = "sms";
96
+ let fragmentUrl;
97
+ let codeLength;
98
+ if (result.type instanceof Api.auth.SentCodeTypeApp) {
99
+ codeDelivery = "app";
100
+ codeLength = result.type.length;
101
+ } else if (result.type instanceof Api.auth.SentCodeTypeFragmentSms) {
102
+ codeDelivery = "fragment";
103
+ fragmentUrl = result.type.url;
104
+ codeLength = result.type.length;
105
+ } else if ("length" in result.type) {
106
+ codeLength = result.type.length;
107
+ }
78
108
  const id = randomBytes(16).toString("hex");
79
109
  const expiresAt = Date.now() + SESSION_TTL_MS;
80
110
  this.session = {
@@ -83,6 +113,8 @@ var TelegramAuthManager = class {
83
113
  phone,
84
114
  phoneCodeHash: result.phoneCodeHash,
85
115
  state: "code_sent",
116
+ fragmentUrl,
117
+ codeLength,
86
118
  codeAttempts: 0,
87
119
  passwordAttempts: 0,
88
120
  createdAt: Date.now(),
@@ -91,7 +123,7 @@ var TelegramAuthManager = class {
91
123
  timer: setTimeout(() => this.cleanup(), SESSION_TTL_MS)
92
124
  };
93
125
  log.info("Telegram verification code sent");
94
- return { authSessionId: id, codeViaApp: result.isCodeViaApp, expiresAt };
126
+ return { authSessionId: id, codeDelivery, fragmentUrl, codeLength, expiresAt };
95
127
  }
96
128
  /**
97
129
  * Verify the code entered by the user
@@ -182,10 +214,24 @@ var TelegramAuthManager = class {
182
214
  if (result instanceof Api.auth.SentCode) {
183
215
  session.phoneCodeHash = result.phoneCodeHash;
184
216
  session.codeAttempts = 0;
185
- const codeViaApp = result.type instanceof Api.auth.SentCodeTypeApp;
186
- return { codeViaApp };
217
+ let codeDelivery = "sms";
218
+ let fragmentUrl;
219
+ let codeLength;
220
+ if (result.type instanceof Api.auth.SentCodeTypeApp) {
221
+ codeDelivery = "app";
222
+ codeLength = result.type.length;
223
+ } else if (result.type instanceof Api.auth.SentCodeTypeFragmentSms) {
224
+ codeDelivery = "fragment";
225
+ fragmentUrl = result.type.url;
226
+ codeLength = result.type.length;
227
+ } else if ("length" in result.type) {
228
+ codeLength = result.type.length;
229
+ }
230
+ session.fragmentUrl = fragmentUrl;
231
+ session.codeLength = codeLength;
232
+ return { codeDelivery, fragmentUrl, codeLength };
187
233
  }
188
- return { codeViaApp: false };
234
+ return { codeDelivery: "sms" };
189
235
  }
190
236
  /**
191
237
  * Cancel and clean up session
@@ -242,106 +288,6 @@ var TelegramAuthManager = class {
242
288
 
243
289
  // src/webui/routes/setup.ts
244
290
  var log2 = createLogger("Setup");
245
- var MODEL_OPTIONS = {
246
- anthropic: [
247
- {
248
- value: "claude-opus-4-5-20251101",
249
- name: "Claude Opus 4.5",
250
- description: "Most capable, $5/M"
251
- },
252
- { value: "claude-sonnet-4-0", name: "Claude Sonnet 4", description: "Balanced, $3/M" },
253
- {
254
- value: "claude-haiku-4-5-20251001",
255
- name: "Claude Haiku 4.5",
256
- description: "Fast & cheap, $1/M"
257
- },
258
- {
259
- value: "claude-3-5-haiku-20241022",
260
- name: "Claude 3.5 Haiku",
261
- description: "Cheapest, $0.80/M"
262
- }
263
- ],
264
- openai: [
265
- { value: "gpt-5", name: "GPT-5", description: "Most capable, 400K ctx, $1.25/M" },
266
- { value: "gpt-4o", name: "GPT-4o", description: "Balanced, 128K ctx, $2.50/M" },
267
- { value: "gpt-4.1", name: "GPT-4.1", description: "1M ctx, $2/M" },
268
- { value: "gpt-4.1-mini", name: "GPT-4.1 Mini", description: "1M ctx, cheap, $0.40/M" },
269
- { value: "o3", name: "o3", description: "Reasoning, 200K ctx, $2/M" }
270
- ],
271
- google: [
272
- { value: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast, 1M ctx, $0.30/M" },
273
- {
274
- value: "gemini-2.5-pro",
275
- name: "Gemini 2.5 Pro",
276
- description: "Most capable, 1M ctx, $1.25/M"
277
- },
278
- { value: "gemini-2.0-flash", name: "Gemini 2.0 Flash", description: "Cheap, 1M ctx, $0.10/M" }
279
- ],
280
- xai: [
281
- { value: "grok-4-fast", name: "Grok 4 Fast", description: "Vision, 2M ctx, $0.20/M" },
282
- { value: "grok-4", name: "Grok 4", description: "Reasoning, 256K ctx, $3/M" },
283
- { value: "grok-3", name: "Grok 3", description: "Stable, 131K ctx, $3/M" }
284
- ],
285
- groq: [
286
- {
287
- value: "meta-llama/llama-4-maverick-17b-128e-instruct",
288
- name: "Llama 4 Maverick",
289
- description: "Vision, 131K ctx, $0.20/M"
290
- },
291
- { value: "qwen/qwen3-32b", name: "Qwen3 32B", description: "Reasoning, 131K ctx, $0.29/M" },
292
- {
293
- value: "deepseek-r1-distill-llama-70b",
294
- name: "DeepSeek R1 70B",
295
- description: "Reasoning, 131K ctx, $0.75/M"
296
- },
297
- {
298
- value: "llama-3.3-70b-versatile",
299
- name: "Llama 3.3 70B",
300
- description: "General purpose, 131K ctx, $0.59/M"
301
- }
302
- ],
303
- openrouter: [
304
- { value: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5", description: "200K ctx, $5/M" },
305
- { value: "openai/gpt-5", name: "GPT-5", description: "400K ctx, $1.25/M" },
306
- { value: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "1M ctx, $0.30/M" },
307
- {
308
- value: "deepseek/deepseek-r1",
309
- name: "DeepSeek R1",
310
- description: "Reasoning, 64K ctx, $0.70/M"
311
- },
312
- { value: "x-ai/grok-4", name: "Grok 4", description: "256K ctx, $3/M" }
313
- ],
314
- moonshot: [
315
- { value: "kimi-k2.5", name: "Kimi K2.5", description: "Free, 256K ctx, multimodal" },
316
- {
317
- value: "kimi-k2-thinking",
318
- name: "Kimi K2 Thinking",
319
- description: "Free, 256K ctx, reasoning"
320
- }
321
- ],
322
- mistral: [
323
- {
324
- value: "devstral-small-2507",
325
- name: "Devstral Small",
326
- description: "Coding, 128K ctx, $0.10/M"
327
- },
328
- {
329
- value: "devstral-medium-latest",
330
- name: "Devstral Medium",
331
- description: "Coding, 262K ctx, $0.40/M"
332
- },
333
- {
334
- value: "mistral-large-latest",
335
- name: "Mistral Large",
336
- description: "General, 128K ctx, $2/M"
337
- },
338
- {
339
- value: "magistral-small",
340
- name: "Magistral Small",
341
- description: "Reasoning, 128K ctx, $0.50/M"
342
- }
343
- ]
344
- };
345
291
  function maskKey(key) {
346
292
  if (key.length <= 10) return "***";
347
293
  return key.slice(0, 6) + "..." + key.slice(-4);
@@ -390,14 +336,15 @@ function createSetupRoutes() {
390
336
  toolLimit: p.toolLimit,
391
337
  keyPrefix: p.keyPrefix,
392
338
  consoleUrl: p.consoleUrl,
393
- requiresApiKey: p.id !== "cocoon" && p.id !== "local",
339
+ requiresApiKey: p.id !== "cocoon" && p.id !== "local" && p.id !== "claude-code",
340
+ autoDetectsKey: p.id === "claude-code",
394
341
  requiresBaseUrl: p.id === "local"
395
342
  }));
396
343
  return c.json({ success: true, data: providers });
397
344
  });
398
345
  app.get("/models/:provider", (c) => {
399
346
  const provider = c.req.param("provider");
400
- const models = MODEL_OPTIONS[provider] || [];
347
+ const models = getModelsForProvider(provider);
401
348
  const result = [
402
349
  ...models,
403
350
  {
@@ -409,6 +356,25 @@ function createSetupRoutes() {
409
356
  ];
410
357
  return c.json({ success: true, data: result });
411
358
  });
359
+ app.get("/detect-claude-code-key", (c) => {
360
+ try {
361
+ const key = getClaudeCodeApiKey();
362
+ const masked = key;
363
+ return c.json({
364
+ success: true,
365
+ data: {
366
+ found: true,
367
+ maskedKey: masked,
368
+ valid: isClaudeCodeTokenValid()
369
+ }
370
+ });
371
+ } catch {
372
+ return c.json({
373
+ success: true,
374
+ data: { found: false, maskedKey: null, valid: false }
375
+ });
376
+ }
377
+ });
412
378
  app.post("/validate/api-key", async (c) => {
413
379
  try {
414
380
  const body = await c.req.json();
@@ -691,7 +657,6 @@ function createSetupRoutes() {
691
657
  },
692
658
  storage: {
693
659
  sessions_file: `${workspace.root}/sessions.json`,
694
- pairing_file: `${workspace.root}/pairing.json`,
695
660
  memory_file: `${workspace.root}/memory.json`,
696
661
  history_limit: 100
697
662
  },
@@ -710,7 +675,7 @@ function createSetupRoutes() {
710
675
  logging: { level: "info", pretty: true },
711
676
  dev: { hot_reload: false },
712
677
  tool_rag: {
713
- enabled: true,
678
+ enabled: false,
714
679
  top_k: 25,
715
680
  always_include: [
716
681
  "telegram_send_message",
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  serializeEmbedding
3
- } from "./chunk-FNV5FF35.js";
3
+ } from "./chunk-EK7M5K26.js";
4
4
  import "./chunk-XBKSS6DM.js";
5
5
  import {
6
6
  TOOL_RAG_KEYWORD_WEIGHT,
@@ -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}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::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-secondary);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)}.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)}