teleton 0.7.4 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +43 -30
  2. package/dist/chunk-3RG5ZIWI.js +10 -0
  3. package/dist/{chunk-U7FQYCBQ.js → chunk-7TECSLJ4.js} +2 -2
  4. package/dist/{chunk-LAQOUFOJ.js → chunk-H36RFKRI.js} +7583 -11185
  5. package/dist/{chunk-RO62LO6Z.js → chunk-IJBWWQE4.js} +4 -0
  6. package/dist/{chunk-BGC2IUM5.js → chunk-JHYZYFZJ.js} +69 -20
  7. package/dist/{chunk-QOQWUUA4.js → chunk-OJCLKU5Z.js} +68 -2
  8. package/dist/{chunk-OCLG5GKI.js → chunk-P36I6OIV.js} +2 -2
  9. package/dist/chunk-PHSAHTK4.js +314 -0
  10. package/dist/{chunk-5PLZ3KSO.js → chunk-QVBSUYVX.js} +14 -42
  11. package/dist/{chunk-4DU3C27M.js → chunk-R4YSJ4EY.js} +5 -1
  12. package/dist/chunk-RQBAMUCV.js +10281 -0
  13. package/dist/{chunk-XDYDA2KV.js → chunk-SD4NLLYG.js} +293 -64
  14. package/dist/chunk-TVRZJIZX.js +292 -0
  15. package/dist/{chunk-EK7M5K26.js → chunk-U56QTM46.js} +3 -3
  16. package/dist/{chunk-XBKSS6DM.js → chunk-VFA7QMCZ.js} +5 -3
  17. package/dist/{chunk-VAUJSSD3.js → chunk-XQUHC3JZ.js} +1 -1
  18. package/dist/cli/index.js +96 -33
  19. package/dist/{client-RTNALK7W.js → client-LNZTDQSA.js} +6 -7
  20. package/dist/{get-my-gifts-TPVUGUWT.js → get-my-gifts-OMGKOEPM.js} +1 -1
  21. package/dist/index.js +15 -17
  22. package/dist/{memory-JQZ6MTRU.js → memory-AS7WKGTW.js} +7 -8
  23. package/dist/{migrate-GS5ACQDA.js → migrate-POHWYEIW.js} +7 -8
  24. package/dist/{multipart-parser-S3YC6NRJ.js → multipart-parser-UFQLJOV2.js} +2 -2
  25. package/dist/{paths-TMNTEDDD.js → paths-XA2RJH4S.js} +1 -1
  26. package/dist/{server-TCJOBV3D.js → server-H3QA252W.js} +39 -12
  27. package/dist/{setup-server-YHYJLAMA.js → setup-server-QXED3D2L.js} +24 -12
  28. package/dist/store-GAFULOOX.js +34 -0
  29. package/dist/{task-dependency-resolver-WKZWJLLM.js → task-dependency-resolver-3FIKQ7Z6.js} +3 -3
  30. package/dist/{task-executor-PD3H4MLO.js → task-executor-RUTFG6VG.js} +2 -2
  31. package/dist/{tasks-QSCWSMPS.js → tasks-BEZ4QRI2.js} +1 -1
  32. package/dist/{tool-adapter-Y3TCEQOC.js → tool-adapter-IH5VGBOO.js} +1 -1
  33. package/dist/{tool-index-6HBRVXVG.js → tool-index-H3SHOJC3.js} +6 -6
  34. package/dist/{transcript-UDJZP6NK.js → transcript-IMNE6KU3.js} +2 -2
  35. package/dist/web/assets/index-BrVqauzj.css +1 -0
  36. package/dist/web/assets/index-DYeEkvJ6.js +72 -0
  37. package/dist/web/assets/{index.es-CqZHj0tz.js → index.es-DkU1GvWU.js} +1 -1
  38. package/dist/web/index.html +2 -2
  39. package/package.json +2 -2
  40. package/dist/BigInteger-DQ33LTTE.js +0 -5
  41. package/dist/chunk-JQDLW7IE.js +0 -107
  42. package/dist/chunk-QGM4M3NI.js +0 -37
  43. package/dist/chunk-RMLQS3X6.js +0 -161
  44. package/dist/chunk-TSKJCWQQ.js +0 -1263
  45. package/dist/chunk-UCN6TI25.js +0 -143
  46. package/dist/chunk-YFG2QHLA.js +0 -3585
  47. package/dist/web/assets/index-B6M9knfJ.css +0 -1
  48. package/dist/web/assets/index-DAGeQfVZ.js +0 -72
  49. package/scripts/patch-gramjs.sh +0 -46
  50. package/scripts/postinstall.mjs +0 -16
@@ -16,8 +16,7 @@ import {
16
16
  initializeMemory,
17
17
  runMigrations,
18
18
  setSchemaVersion
19
- } from "./chunk-XDYDA2KV.js";
20
- import "./chunk-UCN6TI25.js";
19
+ } from "./chunk-SD4NLLYG.js";
21
20
  import {
22
21
  AnthropicEmbeddingProvider,
23
22
  CachedEmbeddingProvider,
@@ -27,18 +26,18 @@ import {
27
26
  deserializeEmbedding,
28
27
  hashText,
29
28
  serializeEmbedding
30
- } from "./chunk-EK7M5K26.js";
31
- import "./chunk-XBKSS6DM.js";
32
- import "./chunk-RO62LO6Z.js";
33
- import "./chunk-VAUJSSD3.js";
34
- import "./chunk-4DU3C27M.js";
29
+ } from "./chunk-U56QTM46.js";
30
+ import "./chunk-VFA7QMCZ.js";
31
+ import "./chunk-IJBWWQE4.js";
32
+ import "./chunk-XQUHC3JZ.js";
33
+ import "./chunk-R4YSJ4EY.js";
35
34
  import "./chunk-EYWNOHMJ.js";
36
35
  import "./chunk-RCMD3U65.js";
37
36
  import {
38
37
  TaskStore,
39
38
  getTaskStore
40
39
  } from "./chunk-NUGDTPE4.js";
41
- import "./chunk-QGM4M3NI.js";
40
+ import "./chunk-3RG5ZIWI.js";
42
41
  export {
43
42
  AnthropicEmbeddingProvider,
44
43
  CURRENT_SCHEMA_VERSION,
@@ -1,12 +1,11 @@
1
1
  import {
2
2
  getDatabase
3
- } from "./chunk-XDYDA2KV.js";
4
- import "./chunk-UCN6TI25.js";
5
- import "./chunk-EK7M5K26.js";
6
- import "./chunk-XBKSS6DM.js";
7
- import "./chunk-RO62LO6Z.js";
8
- import "./chunk-VAUJSSD3.js";
9
- import "./chunk-4DU3C27M.js";
3
+ } from "./chunk-SD4NLLYG.js";
4
+ import "./chunk-U56QTM46.js";
5
+ import "./chunk-VFA7QMCZ.js";
6
+ import "./chunk-IJBWWQE4.js";
7
+ import "./chunk-XQUHC3JZ.js";
8
+ import "./chunk-R4YSJ4EY.js";
10
9
  import {
11
10
  TELETON_ROOT
12
11
  } from "./chunk-EYWNOHMJ.js";
@@ -14,7 +13,7 @@ import {
14
13
  createLogger
15
14
  } from "./chunk-RCMD3U65.js";
16
15
  import "./chunk-NUGDTPE4.js";
17
- import "./chunk-QGM4M3NI.js";
16
+ import "./chunk-3RG5ZIWI.js";
18
17
 
19
18
  // src/session/migrate.ts
20
19
  import { readFileSync, existsSync, renameSync } from "fs";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  br,
3
3
  qn
4
- } from "./chunk-U7FQYCBQ.js";
5
- import "./chunk-QGM4M3NI.js";
4
+ } from "./chunk-7TECSLJ4.js";
5
+ import "./chunk-3RG5ZIWI.js";
6
6
 
7
7
  // node_modules/node-fetch-native/dist/chunks/multipart-parser.mjs
8
8
  import "http";
@@ -5,7 +5,7 @@ import {
5
5
  WORKSPACE_PATHS,
6
6
  WORKSPACE_ROOT
7
7
  } from "./chunk-EYWNOHMJ.js";
8
- import "./chunk-QGM4M3NI.js";
8
+ import "./chunk-3RG5ZIWI.js";
9
9
  export {
10
10
  ALLOWED_EXTENSIONS,
11
11
  MAX_FILE_SIZES,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getModelsForProvider
3
- } from "./chunk-QOQWUUA4.js";
3
+ } from "./chunk-OJCLKU5Z.js";
4
4
  import {
5
5
  CONFIGURABLE_KEYS,
6
6
  WorkspaceSecurityError,
@@ -10,6 +10,7 @@ import {
10
10
  deletePluginSecret,
11
11
  ensurePluginDeps,
12
12
  getNestedValue,
13
+ getTokenUsage,
13
14
  listPluginSecretKeys,
14
15
  readRawConfig,
15
16
  setNestedValue,
@@ -19,21 +20,31 @@ import {
19
20
  validateWritePath,
20
21
  writePluginSecret,
21
22
  writeRawConfig
22
- } from "./chunk-YFG2QHLA.js";
23
- import "./chunk-BGC2IUM5.js";
24
- import "./chunk-TSKJCWQQ.js";
23
+ } from "./chunk-RQBAMUCV.js";
24
+ import {
25
+ invalidateEndpointCache,
26
+ invalidateTonClientCache,
27
+ setToncenterApiKey
28
+ } from "./chunk-JHYZYFZJ.js";
29
+ import "./chunk-TVRZJIZX.js";
30
+ import "./chunk-7TECSLJ4.js";
25
31
  import {
26
32
  getErrorMessage
27
33
  } from "./chunk-XBE4JB7C.js";
34
+ import "./chunk-QVBSUYVX.js";
28
35
  import {
29
36
  getProviderMetadata,
30
37
  validateApiKeyFormat
31
- } from "./chunk-RMLQS3X6.js";
32
- import "./chunk-UCN6TI25.js";
33
- import "./chunk-XBKSS6DM.js";
34
- import "./chunk-RO62LO6Z.js";
35
- import "./chunk-VAUJSSD3.js";
36
- import "./chunk-4DU3C27M.js";
38
+ } from "./chunk-PHSAHTK4.js";
39
+ import "./chunk-P36I6OIV.js";
40
+ import "./chunk-SD4NLLYG.js";
41
+ import "./chunk-U56QTM46.js";
42
+ import {
43
+ setTonapiKey
44
+ } from "./chunk-VFA7QMCZ.js";
45
+ import "./chunk-IJBWWQE4.js";
46
+ import "./chunk-XQUHC3JZ.js";
47
+ import "./chunk-R4YSJ4EY.js";
37
48
  import {
38
49
  WORKSPACE_PATHS,
39
50
  WORKSPACE_ROOT
@@ -46,7 +57,7 @@ import {
46
57
  import {
47
58
  getTaskStore
48
59
  } from "./chunk-NUGDTPE4.js";
49
- import "./chunk-QGM4M3NI.js";
60
+ import "./chunk-3RG5ZIWI.js";
50
61
 
51
62
  // src/webui/server.ts
52
63
  import { Hono as Hono12 } from "hono";
@@ -134,7 +145,9 @@ function createStatusRoutes(deps) {
134
145
  model: config.agent.model,
135
146
  provider: config.agent.provider,
136
147
  sessionCount: sessionCountRow?.count ?? 0,
137
- toolCount: deps.toolRegistry.getAll().length
148
+ toolCount: deps.toolRegistry.getAll().length,
149
+ tokenUsage: getTokenUsage(),
150
+ platform: process.platform
138
151
  };
139
152
  const response = {
140
153
  success: true,
@@ -1240,6 +1253,14 @@ function createTasksRoutes(deps) {
1240
1253
 
1241
1254
  // src/webui/routes/config.ts
1242
1255
  import { Hono as Hono10 } from "hono";
1256
+ var CONFIG_SIDE_EFFECTS = {
1257
+ tonapi_key: (v) => setTonapiKey(v),
1258
+ toncenter_api_key: (v) => {
1259
+ setToncenterApiKey(v);
1260
+ invalidateEndpointCache();
1261
+ invalidateTonClientCache();
1262
+ }
1263
+ };
1243
1264
  function createConfigRoutes(deps) {
1244
1265
  const app = new Hono10();
1245
1266
  app.get("/", (c) => {
@@ -1258,6 +1279,7 @@ function createConfigRoutes(deps) {
1258
1279
  type: meta.type,
1259
1280
  category: meta.category,
1260
1281
  description: meta.description,
1282
+ hotReload: meta.hotReload,
1261
1283
  ...meta.options ? { options: meta.options } : {},
1262
1284
  ...meta.optionLabels ? { optionLabels: meta.optionLabels } : {},
1263
1285
  ...meta.itemType ? { itemType: meta.itemType } : {}
@@ -1328,6 +1350,7 @@ function createConfigRoutes(deps) {
1328
1350
  type: meta.type,
1329
1351
  category: meta.category,
1330
1352
  description: meta.description,
1353
+ hotReload: meta.hotReload,
1331
1354
  ...meta.itemType ? { itemType: meta.itemType } : {}
1332
1355
  };
1333
1356
  return c.json({ success: true, data: result });
@@ -1367,6 +1390,7 @@ function createConfigRoutes(deps) {
1367
1390
  writeRawConfig(raw, deps.configPath);
1368
1391
  const runtimeConfig = deps.agent.getConfig();
1369
1392
  setNestedValue(runtimeConfig, key, parsed);
1393
+ CONFIG_SIDE_EFFECTS[key]?.(parsed);
1370
1394
  if (key === "telegram.owner_id" && typeof parsed === "number") {
1371
1395
  const rtAdminIds = getNestedValue(runtimeConfig, "telegram.admin_ids") ?? [];
1372
1396
  if (!rtAdminIds.includes(parsed)) {
@@ -1382,6 +1406,7 @@ function createConfigRoutes(deps) {
1382
1406
  type: meta.type,
1383
1407
  category: meta.category,
1384
1408
  description: meta.description,
1409
+ hotReload: meta.hotReload,
1385
1410
  ...meta.options ? { options: meta.options } : {}
1386
1411
  };
1387
1412
  return c.json({ success: true, data: result });
@@ -1411,6 +1436,7 @@ function createConfigRoutes(deps) {
1411
1436
  writeRawConfig(raw, deps.configPath);
1412
1437
  const runtimeConfig = deps.agent.getConfig();
1413
1438
  deleteNestedValue(runtimeConfig, key);
1439
+ CONFIG_SIDE_EFFECTS[key]?.(void 0);
1414
1440
  const result = {
1415
1441
  key,
1416
1442
  label: meta.label,
@@ -1420,6 +1446,7 @@ function createConfigRoutes(deps) {
1420
1446
  type: meta.type,
1421
1447
  category: meta.category,
1422
1448
  description: meta.description,
1449
+ hotReload: meta.hotReload,
1423
1450
  ...meta.options ? { options: meta.options } : {},
1424
1451
  ...meta.itemType ? { itemType: meta.itemType } : {}
1425
1452
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getModelsForProvider
3
- } from "./chunk-QOQWUUA4.js";
3
+ } from "./chunk-OJCLKU5Z.js";
4
4
  import {
5
5
  ConfigSchema,
6
6
  DealsConfigSchema,
@@ -11,31 +11,29 @@ import {
11
11
  isNewWorkspace,
12
12
  saveWallet,
13
13
  walletExists
14
- } from "./chunk-BGC2IUM5.js";
14
+ } from "./chunk-JHYZYFZJ.js";
15
15
  import {
16
16
  getClaudeCodeApiKey,
17
- isClaudeCodeTokenValid
18
- } from "./chunk-JQDLW7IE.js";
19
- import {
20
17
  getProviderMetadata,
21
18
  getSupportedProviders,
19
+ isClaudeCodeTokenValid,
22
20
  validateApiKeyFormat
23
- } from "./chunk-RMLQS3X6.js";
24
- import "./chunk-XBKSS6DM.js";
21
+ } from "./chunk-PHSAHTK4.js";
22
+ import "./chunk-VFA7QMCZ.js";
25
23
  import {
26
24
  TELEGRAM_MAX_MESSAGE_LENGTH
27
- } from "./chunk-RO62LO6Z.js";
25
+ } from "./chunk-IJBWWQE4.js";
28
26
  import {
29
27
  fetchWithTimeout
30
- } from "./chunk-VAUJSSD3.js";
31
- import "./chunk-4DU3C27M.js";
28
+ } from "./chunk-XQUHC3JZ.js";
29
+ import "./chunk-R4YSJ4EY.js";
32
30
  import {
33
31
  TELETON_ROOT
34
32
  } from "./chunk-EYWNOHMJ.js";
35
33
  import {
36
34
  createLogger
37
35
  } from "./chunk-RCMD3U65.js";
38
- import "./chunk-QGM4M3NI.js";
36
+ import "./chunk-3RG5ZIWI.js";
39
37
 
40
38
  // src/webui/setup-server.ts
41
39
  import { Hono as Hono2 } from "hono";
@@ -92,6 +90,10 @@ var TelegramAuthManager = class {
92
90
  await client.disconnect();
93
91
  throw new Error("Account already authenticated (SentCodeSuccess)");
94
92
  }
93
+ if (!(result instanceof Api.auth.SentCode)) {
94
+ await client.disconnect();
95
+ throw new Error("Unexpected auth response (payment required or unknown)");
96
+ }
95
97
  let codeDelivery = "sms";
96
98
  let fragmentUrl;
97
99
  let codeLength;
@@ -359,7 +361,7 @@ function createSetupRoutes() {
359
361
  app.get("/detect-claude-code-key", (c) => {
360
362
  try {
361
363
  const key = getClaudeCodeApiKey();
362
- const masked = key;
364
+ const masked = key.slice(0, 12) + "****" + key.slice(-4);
363
365
  return c.json({
364
366
  success: true,
365
367
  data: {
@@ -688,10 +690,20 @@ function createSetupRoutes() {
688
690
  ],
689
691
  skip_unlimited_providers: false
690
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
+ },
691
702
  mcp: { servers: {} },
692
703
  plugins: {},
693
704
  ...input.cocoon ? { cocoon: input.cocoon } : {},
694
705
  ...input.tonapi_key ? { tonapi_key: input.tonapi_key } : {},
706
+ ...input.toncenter_api_key ? { toncenter_api_key: input.toncenter_api_key } : {},
695
707
  ...input.tavily_api_key ? { tavily_api_key: input.tavily_api_key } : {}
696
708
  };
697
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-TVRZJIZX.js";
13
+ import "./chunk-SD4NLLYG.js";
14
+ import "./chunk-U56QTM46.js";
15
+ import "./chunk-VFA7QMCZ.js";
16
+ import "./chunk-IJBWWQE4.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-3RG5ZIWI.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,13 +1,13 @@
1
1
  import {
2
2
  MAX_DEPENDENTS_PER_TASK
3
- } from "./chunk-RO62LO6Z.js";
3
+ } from "./chunk-IJBWWQE4.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";
10
- import "./chunk-QGM4M3NI.js";
10
+ import "./chunk-3RG5ZIWI.js";
11
11
 
12
12
  // src/telegram/task-dependency-resolver.ts
13
13
  var log = createLogger("Telegram");
@@ -6,8 +6,8 @@ import {
6
6
  MAX_TOTAL_PROMPT_CHARS,
7
7
  SECONDS_PER_DAY,
8
8
  SECONDS_PER_HOUR
9
- } from "./chunk-RO62LO6Z.js";
10
- import "./chunk-QGM4M3NI.js";
9
+ } from "./chunk-IJBWWQE4.js";
10
+ import "./chunk-3RG5ZIWI.js";
11
11
 
12
12
  // src/telegram/task-executor.ts
13
13
  function truncateJson(data, maxChars = MAX_JSON_FIELD_CHARS) {
@@ -2,7 +2,7 @@ import {
2
2
  TaskStore,
3
3
  getTaskStore
4
4
  } from "./chunk-NUGDTPE4.js";
5
- import "./chunk-QGM4M3NI.js";
5
+ import "./chunk-3RG5ZIWI.js";
6
6
  export {
7
7
  TaskStore,
8
8
  getTaskStore
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createLogger
3
3
  } from "./chunk-RCMD3U65.js";
4
- import "./chunk-QGM4M3NI.js";
4
+ import "./chunk-3RG5ZIWI.js";
5
5
 
6
6
  // src/cocoon/tool-adapter.ts
7
7
  import { randomUUID } from "crypto";
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  serializeEmbedding
3
- } from "./chunk-EK7M5K26.js";
4
- import "./chunk-XBKSS6DM.js";
3
+ } from "./chunk-U56QTM46.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-IJBWWQE4.js";
10
+ import "./chunk-XQUHC3JZ.js";
11
+ import "./chunk-R4YSJ4EY.js";
12
12
  import "./chunk-EYWNOHMJ.js";
13
13
  import {
14
14
  createLogger
15
15
  } from "./chunk-RCMD3U65.js";
16
- import "./chunk-QGM4M3NI.js";
16
+ import "./chunk-3RG5ZIWI.js";
17
17
 
18
18
  // src/agent/tools/tool-index.ts
19
19
  var log = createLogger("ToolRAG");
@@ -7,10 +7,10 @@ import {
7
7
  getTranscriptSize,
8
8
  readTranscript,
9
9
  transcriptExists
10
- } from "./chunk-OCLG5GKI.js";
10
+ } from "./chunk-P36I6OIV.js";
11
11
  import "./chunk-EYWNOHMJ.js";
12
12
  import "./chunk-RCMD3U65.js";
13
- import "./chunk-QGM4M3NI.js";
13
+ import "./chunk-3RG5ZIWI.js";
14
14
  export {
15
15
  appendToTranscript,
16
16
  archiveTranscript,
@@ -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)}