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.
- package/README.md +31 -12
- package/dist/{chunk-ND2X5FWB.js → chunk-5PLZ3KSO.js} +16 -3
- package/dist/{chunk-NERLQY2H.js → chunk-BGC2IUM5.js} +73 -15
- package/dist/{chunk-FNV5FF35.js → chunk-EK7M5K26.js} +29 -13
- package/dist/chunk-JQDLW7IE.js +107 -0
- package/dist/{chunk-VSMUAU5X.js → chunk-LAQOUFOJ.js} +2419 -2132
- package/dist/chunk-QOQWUUA4.js +158 -0
- package/dist/{chunk-LRCPA7SC.js → chunk-RMLQS3X6.js} +15 -3
- package/dist/{chunk-UDD7FYOU.js → chunk-WIKM24GZ.js} +1 -18
- package/dist/{chunk-RBU6JXD3.js → chunk-XDYDA2KV.js} +1 -1
- package/dist/{chunk-JHKWHGBM.js → chunk-YFG2QHLA.js} +380 -47
- package/dist/cli/index.js +216 -272
- package/dist/{client-3VWE7NC4.js → client-RTNALK7W.js} +3 -2
- package/dist/{get-my-gifts-RI7FAXAL.js → get-my-gifts-TPVUGUWT.js} +1 -1
- package/dist/index.js +9 -10
- package/dist/{memory-5SS3Q5EA.js → memory-JQZ6MTRU.js} +2 -2
- package/dist/{migrate-M7SJMDOL.js → migrate-GS5ACQDA.js} +2 -2
- package/dist/{server-NPSODUMA.js → server-TCJOBV3D.js} +292 -11
- package/dist/{setup-server-C7ZTPHD5.js → setup-server-YHYJLAMA.js} +77 -112
- package/dist/{tool-index-MIVK3D7H.js → tool-index-6HBRVXVG.js} +1 -1
- package/dist/web/assets/index-B6M9knfJ.css +1 -0
- package/dist/web/assets/index-DAGeQfVZ.js +72 -0
- package/dist/web/assets/{index.es-D81xLR29.js → index.es-CqZHj0tz.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +2 -2
- package/dist/chunk-EHEV7FJ7.js +0 -157
- package/dist/chunk-QUAPFI2N.js +0 -42
- package/dist/endpoint-FLYNEZ2F.js +0 -7
- package/dist/format-transactions-FD74HI5N.js +0 -9
- package/dist/web/assets/index-BqwoDycr.js +0 -72
- 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-
|
|
12
|
-
import
|
|
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-
|
|
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.
|
|
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,
|
|
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
|
-
|
|
186
|
-
|
|
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 {
|
|
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 =
|
|
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:
|
|
678
|
+
enabled: false,
|
|
714
679
|
top_k: 25,
|
|
715
680
|
always_include: [
|
|
716
681
|
"telegram_send_message",
|
|
@@ -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)}
|