portless-studio 0.1.3 → 0.1.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.
@@ -0,0 +1,30 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { parseTerminalHistory, } from "../../../core/terminals/terminal-history.js";
4
+ import { writeFileAtomic } from "./atomic-write.js";
5
+ const FILE_NAME = "terminals.json";
6
+ /** `terminals.json` in the config file's folder. */
7
+ export function terminalHistoryPathFor(configPath) {
8
+ return path.join(path.dirname(configPath), FILE_NAME);
9
+ }
10
+ /**
11
+ * The terminals running when Studio stopped and the recent commands per folder, as
12
+ * `{ "running": [...], "recentCommands": { "<folder>": [...] } }`. Studio writes it on its own.
13
+ */
14
+ export class JsonTerminalHistoryStore {
15
+ path;
16
+ constructor(filePath) {
17
+ this.path = filePath;
18
+ }
19
+ read() {
20
+ try {
21
+ return parseTerminalHistory(JSON.parse(fs.readFileSync(this.path, "utf8")));
22
+ }
23
+ catch {
24
+ return parseTerminalHistory(null);
25
+ }
26
+ }
27
+ write(history) {
28
+ writeFileAtomic(this.path, `${JSON.stringify(history, null, 2)}\n`);
29
+ }
30
+ }
@@ -19,22 +19,51 @@ export function parseProcNetTcp(text) {
19
19
  }
20
20
  return sockets;
21
21
  }
22
+ /** Clock ticks per second, the unit of `/proc/<pid>/stat` times; 100 on every common kernel. */
23
+ export const DEFAULT_CLOCK_TICKS = 100;
24
+ /**
25
+ * When a process started, in epoch milliseconds, from field 22 of `/proc/<pid>/stat` (clock ticks
26
+ * since boot) and `btime` in `/proc/stat` (boot time in epoch seconds). Null when unreadable.
27
+ */
28
+ export function processStartTime(stat, procStat, ticksPerSecond) {
29
+ if (stat === null || procStat === null || ticksPerSecond <= 0)
30
+ return null;
31
+ // The command name in field 2 may hold spaces and parentheses, so count fields after the last ")".
32
+ const fields = stat
33
+ .slice(stat.lastIndexOf(")") + 1)
34
+ .trim()
35
+ .split(/\s+/);
36
+ const ticks = Number(fields[19]);
37
+ const boot = Number(/^btime\s+(\d+)$/m.exec(procStat)?.[1]);
38
+ if (!Number.isFinite(ticks) || !Number.isFinite(boot) || boot <= 0)
39
+ return null;
40
+ return Math.round(boot * 1000 + (ticks * 1000) / ticksPerSecond);
41
+ }
42
+ /** `getconf CLK_TCK`, or the usual 100 when it cannot run. */
43
+ export async function readClockTicks(io) {
44
+ const answer = await io.run("getconf", ["CLK_TCK"]).catch(() => null);
45
+ const ticks = Number(answer?.stdout.trim());
46
+ return Number.isInteger(ticks) && ticks > 0 ? ticks : DEFAULT_CLOCK_TICKS;
47
+ }
22
48
  /**
23
49
  * Lists listening ports from `/proc`. A socket is linked to its process through the
24
50
  * `/proc/<pid>/fd/*` links; processes of other users cannot be read and stay unknown.
25
51
  */
26
- export async function listLinuxPorts(io) {
52
+ export async function listLinuxPorts(io, ticksPerSecond = async () => DEFAULT_CLOCK_TICKS) {
27
53
  const sockets = [
28
54
  ...parseProcNetTcp(io.readFile("/proc/net/tcp") ?? ""),
29
55
  ...parseProcNetTcp(io.readFile("/proc/net/tcp6") ?? ""),
30
56
  ];
31
57
  const pids = pidsByInode(io, new Set(sockets.map((socket) => socket.inode)));
58
+ const ticks = pids.size > 0 ? await ticksPerSecond() : DEFAULT_CLOCK_TICKS;
59
+ const procStat = pids.size > 0 ? io.readFile("/proc/stat") : null;
32
60
  const byPort = new Map();
33
61
  for (const socket of sockets) {
34
62
  const known = byPort.get(socket.port);
35
63
  if (known?.pid != null)
36
64
  continue;
37
65
  const pid = pids.get(socket.inode) ?? null;
66
+ const startedAt = pid === null ? null : processStartTime(io.readFile(`/proc/${pid}/stat`), procStat, ticks);
38
67
  byPort.set(socket.port, {
39
68
  port: socket.port,
40
69
  pid,
@@ -43,6 +72,7 @@ export async function listLinuxPorts(io) {
43
72
  executable: pid === null
44
73
  ? null
45
74
  : (io.readLink(`/proc/${pid}/exe`)?.replace(DELETED_SUFFIX, "") ?? null),
75
+ ...(startedAt === null ? {} : { startedAt }),
46
76
  });
47
77
  }
48
78
  return [...byPort.values()].sort((a, b) => a.port - b.port);
@@ -48,28 +48,57 @@ export function parsePsExecutables(text) {
48
48
  }
49
49
  return executables;
50
50
  }
51
+ /**
52
+ * Reads `ps -o pid=,etime= -p ...` into pid -> start in epoch milliseconds. `etime` is the time
53
+ * since the process started as `[[dd-]hh:]mm:ss`, which unlike `lstart` reads the same in every
54
+ * locale.
55
+ */
56
+ export function parsePsStartTimes(text, now) {
57
+ const starts = new Map();
58
+ for (const line of text.split("\n")) {
59
+ const match = /^\s*(\d+)\s+(?:(\d+)-)?(?:(\d{1,2}):)?(\d{1,2}):(\d{2})\s*$/.exec(line);
60
+ if (!match)
61
+ continue;
62
+ const [, pid, days, hours, minutes, seconds] = match;
63
+ const elapsed = ((Number(days ?? 0) * 24 + Number(hours ?? 0)) * 60 + Number(minutes)) * 60 + Number(seconds);
64
+ starts.set(Number(pid), now - elapsed * 1000);
65
+ }
66
+ return starts;
67
+ }
51
68
  /** Lists listening ports with `lsof` and `ps`, which ship with macOS. */
52
- export async function listMacosPorts(io) {
69
+ export async function listMacosPorts(io, starts = new Map(), now = Date.now) {
53
70
  const listen = await io.run("lsof", ["-nP", "-iTCP", "-sTCP:LISTEN", "-F", "pcn"]);
54
71
  const rows = parseLsofListen(listen.stdout);
55
72
  if (rows.length === 0)
56
73
  return [];
57
74
  const pids = [...new Set(rows.map((row) => row.pid))];
58
- const [cwd, ps] = await Promise.all([
75
+ for (const pid of starts.keys())
76
+ if (!pids.includes(pid))
77
+ starts.delete(pid);
78
+ const unknownStarts = pids.filter((pid) => !starts.has(pid));
79
+ const [cwd, ps, elapsed] = await Promise.all([
59
80
  io.run("lsof", ["-a", "-d", "cwd", "-p", pids.join(","), "-F", "pn"]),
60
81
  // -ww: without it ps cuts long paths at the terminal width.
61
82
  io.run("ps", ["-ww", "-o", "pid=,comm=", "-p", pids.join(",")]),
83
+ unknownStarts.length === 0
84
+ ? null
85
+ : io.run("ps", ["-o", "pid=,etime=", "-p", unknownStarts.join(",")]),
62
86
  ]);
87
+ const read = parsePsStartTimes(elapsed?.stdout ?? "", now());
88
+ for (const pid of unknownStarts)
89
+ starts.set(pid, read.get(pid) ?? null);
63
90
  const cwds = parseLsofCwds(cwd.stdout);
64
91
  const executables = parsePsExecutables(ps.stdout);
65
92
  const byPort = new Map();
66
93
  for (const row of rows) {
67
94
  if (byPort.has(row.port))
68
95
  continue;
96
+ const startedAt = starts.get(row.pid) ?? null;
69
97
  byPort.set(row.port, {
70
98
  ...row,
71
99
  cwd: cwds.get(row.pid) ?? null,
72
100
  executable: executables.get(row.pid) ?? null,
101
+ ...(startedAt === null ? {} : { startedAt }),
73
102
  });
74
103
  }
75
104
  return [...byPort.values()].sort((a, b) => a.port - b.port);
@@ -1,7 +1,7 @@
1
1
  import { request } from "node:http";
2
2
  import { STUDIO_HEADER } from "../../../core/api/contract.js";
3
3
  import { isDebuggerVersionInfo } from "../../../core/ports/helper-ports.js";
4
- import { listLinuxPorts } from "./linux-ports.js";
4
+ import { listLinuxPorts, readClockTicks } from "./linux-ports.js";
5
5
  import { listMacosPorts } from "./macos-ports.js";
6
6
  import { nodeSystemIo } from "./system-io.js";
7
7
  import { listWindowsPorts } from "./windows-ports.js";
@@ -18,9 +18,12 @@ export function listPortsFor(platform, io) {
18
18
  const cache = new Map();
19
19
  return () => listWindowsPorts(io, cache);
20
20
  }
21
- if (platform === "darwin")
22
- return () => listMacosPorts(io);
23
- return () => listLinuxPorts(io);
21
+ if (platform === "darwin") {
22
+ const starts = new Map();
23
+ return () => listMacosPorts(io, starts);
24
+ }
25
+ let ticks = null;
26
+ return () => listLinuxPorts(io, () => (ticks ??= readClockTicks(io)));
24
27
  }
25
28
  /**
26
29
  * Wraps a platform lister with the HTTP check. A port is probed once per process that owns it,
@@ -58,10 +58,12 @@ export function parseWin32Processes(text) {
58
58
  continue;
59
59
  const executable = Reflect.get(item, "ExecutablePath");
60
60
  const commandLine = Reflect.get(item, "CommandLine");
61
+ const startedAt = Reflect.get(item, "StartedAt");
61
62
  processes.set(pid, {
62
63
  name: name.replace(/\.exe$/i, ""),
63
64
  executable: typeof executable === "string" && executable !== "" ? executable : null,
64
65
  commandLine: typeof commandLine === "string" && commandLine !== "" ? commandLine : null,
66
+ ...(typeof startedAt === "number" && startedAt > 0 ? { startedAt } : {}),
65
67
  });
66
68
  }
67
69
  return processes;
@@ -159,6 +161,9 @@ export async function listWindowsPorts(io, cache = new Map(), now = Date.now) {
159
161
  processName: system ?? info?.name ?? "",
160
162
  cwd: folderFromCommandLine(info?.commandLine ?? null),
161
163
  executable: info?.executable ?? null,
164
+ ...(system === undefined && info?.startedAt !== undefined
165
+ ? { startedAt: info.startedAt }
166
+ : {}),
162
167
  });
163
168
  }
164
169
  return [...byPort.values()].sort((a, b) => a.port - b.port);
@@ -181,7 +186,10 @@ async function readProcesses(io, pids) {
181
186
  return { processes: new Map(), complete: true };
182
187
  const filter = pids.map((pid) => `ProcessId=${pid}`).join(" OR ");
183
188
  const script = `Get-CimInstance Win32_Process -Filter '${filter}' | ` +
184
- "Select-Object ProcessId, Name, ExecutablePath, CommandLine | ConvertTo-Json -Compress";
189
+ "Select-Object ProcessId, Name, ExecutablePath, CommandLine, " +
190
+ // A plain number, because ConvertTo-Json writes dates differently in each PowerShell version.
191
+ "@{n='StartedAt';e={if ($_.CreationDate) { [DateTimeOffset]::new($_.CreationDate).ToUnixTimeMilliseconds() }}} | " +
192
+ "ConvertTo-Json -Compress";
185
193
  const queried = await io.run("powershell", powershellArgs(script));
186
194
  const processes = queried.exitCode === 0 ? parseWin32Processes(queried.stdout) : new Map();
187
195
  if (processes.size > 0)
@@ -243,6 +243,10 @@ export function createHttpServer(options) {
243
243
  return sendAppError(res, created.error);
244
244
  return sendJson(res, 201, created.value);
245
245
  }
246
+ if (pathname === API_PATHS.terminalsRecentCommands && method === "GET") {
247
+ const body = { recentCommands: terminals.recentCommands() };
248
+ return sendJson(res, 200, body);
249
+ }
246
250
  if (pathname === API_PATHS.terminalsEvents && method === "GET") {
247
251
  terminalStreams.list(res);
248
252
  return;
@@ -23,9 +23,13 @@ const CONTENT_TYPES = {
23
23
  };
24
24
  const COMPRESSIBLE = new Set([".html", ".js", ".mjs", ".css", ".json", ".map", ".svg", ".txt"]);
25
25
  const MIN_COMPRESS_BYTES = 1024;
26
- /** No inline scripts, no third parties, never framed. Vite builds need nothing more. */
26
+ /**
27
+ * No inline scripts, no third parties, never framed. Inline styles are allowed because the
28
+ * terminal (xterm.js) paints ANSI colors through <style> elements it creates at runtime; scripts
29
+ * stay locked to the page's own files.
30
+ */
27
31
  const HTML_HEADERS = {
28
- "Content-Security-Policy": "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; " +
32
+ "Content-Security-Policy": "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; " +
29
33
  "font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'none'; " +
30
34
  "form-action 'none'; frame-ancestors 'none'",
31
35
  "X-Frame-Options": "DENY",
@@ -18,6 +18,7 @@ import { createDetachedLauncher } from "./infrastructure/apps/detached-launcher.
18
18
  import { JsonCustomAppStore, JsonRouteProjectStore, openWithPathFor, routeProjectsPathFor, } from "./infrastructure/apps/json-stores.js";
19
19
  import { autoNamedPathFor, JsonAutoNamedStore, } from "./infrastructure/config/json-auto-named-store.js";
20
20
  import { defaultConfigPath, JsonConfigStore } from "./infrastructure/config/json-config-store.js";
21
+ import { JsonTerminalHistoryStore, terminalHistoryPathFor, } from "./infrastructure/config/json-terminal-history-store.js";
21
22
  import { JsonUpdateCache, updateCheckPathFor } from "./infrastructure/config/json-update-cache.js";
22
23
  import { proxyStartRecordPathFor, readProxyStartRecord, recordProxyStarts, } from "./infrastructure/config/proxy-start-record.js";
23
24
  import { PortlessRegistry } from "./infrastructure/portless/portless-registry.js";
@@ -96,6 +97,7 @@ export function createStudioServices(options = {}) {
96
97
  folders: nodeTerminalFolders(),
97
98
  processTree: systemProcessTree(),
98
99
  homeDir: os.homedir(),
100
+ history: new JsonTerminalHistoryStore(terminalHistoryPathFor(configPath)),
99
101
  workspace: {
100
102
  openableFolders: () => runtime.openableFolders(),
101
103
  snapshot: () => runtime.readSnapshot(),
@@ -178,6 +180,7 @@ export function createUninstallServices(configPath = defaultConfigPath()) {
178
180
  routeProjectsPathFor(configPath),
179
181
  openWithPathFor(configPath),
180
182
  updateCheckPathFor(configPath),
183
+ terminalHistoryPathFor(configPath),
181
184
  ];
182
185
  const processes = new SystemProcessControl({
183
186
  platform: process.platform,
@@ -238,6 +241,11 @@ export async function startServer(options) {
238
241
  studio.start();
239
242
  // The short-URL forwarder settles before anyone prints or registers a URL.
240
243
  await studio.ready();
244
+ // Terminals that were running when Studio stopped; never holds up the start.
245
+ void studio
246
+ .settings()
247
+ .then((config) => services.terminals?.restore(config.restoreTerminals))
248
+ .catch(() => { });
241
249
  return {
242
250
  url: `http://${LOOPBACK}:${port}`,
243
251
  port,
@@ -0,0 +1 @@
1
+ @font-face{font-family:Geist;src:url(/assets/Geist-Variable-Bj2R_7yk.woff2)format("woff2");font-weight:100 900;font-style:normal;font-display:swap}@font-face{font-family:Geist Mono;src:url(/assets/GeistMono-Variable-Dispecij.woff2)format("woff2");font-weight:100 900;font-style:normal;font-display:swap}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--font-sans:"Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;--font-mono:"Geist Mono", ui-monospace, "SFMono-Regular", "Menlo", "Consolas", monospace;--text-2xs:.6875rem;--text-xs:.75rem;--text-sm:.8125rem;--text-md:.875rem;--text-lg:1rem;--text-xl:1.25rem;--leading-tight:1.25;--leading-normal:1.5;--weight-regular:400;--weight-medium:500;--weight-semibold:600;--tracking-tight:-.01em;--space-0-5:2px;--space-1:4px;--space-1-5:6px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-8:32px;--space-10:40px;--space-12:48px;--space-16:64px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:12px;--radius-full:999px;--control-height-xs:22px;--control-height-sm:28px;--control-height-md:32px;--control-height-lg:40px;--row-min-height:56px;--content-width:1040px;--dialog-width:440px;--dialog-width-lg:560px;--command-width:560px;--dot-size:8px;--icon-size:16px;--duration-fast:.1s;--duration-normal:.16s;--duration-slow:.24s;--ease-out:cubic-bezier(.2, .8, .2, 1);--z-sticky:10;--z-overlay:50;--z-toast:60;--color-bg:#fff;--color-bg-subtle:#fafafa;--color-bg-muted:#f2f2f2;--color-bg-hover:#f5f5f5;--color-bg-selected:#f0f6ff;--color-bg-overlay:#00000052;--color-border:#ebebeb;--color-border-strong:#d4d4d4;--color-text:#171717;--color-text-secondary:#5c5c5c;--color-text-tertiary:#737373;--color-text-inverse:#fff;--color-accent:#006bff;--color-accent-hover:#005ee0;--color-accent-text:#0060e6;--color-accent-subtle:#ebf3ff;--color-accent-ring:#006bff73;--color-success:#12a150;--color-success-text:#0b7a3b;--color-success-subtle:#e9f8ef;--color-warning:#e5a000;--color-warning-text:#8a5a00;--color-warning-subtle:#fff6e0;--color-danger:#e5484d;--color-danger-hover:#cf3c41;--color-danger-text:#c42b31;--color-danger-subtle:#fdecec;--shadow-sm:0 1px 2px #0000000a;--shadow-overlay:0 1px 1px #00000005, 0 8px 24px #00000014, 0 24px 48px #0000000f;--focus-ring:0 0 0 2px var(--color-bg), 0 0 0 4px var(--color-accent-ring);--term-light-background:#fff;--term-light-foreground:#171717;--term-light-cursor:#006bff;--term-light-selection:#cfe2ff;--term-light-black:#171717;--term-light-red:#c42b31;--term-light-green:#0b7a3b;--term-light-yellow:#8a5a00;--term-light-blue:#0060e6;--term-light-magenta:#9a33b8;--term-light-cyan:#08788a;--term-light-white:#6e6e6e;--term-light-bright-black:#5c5c5c;--term-light-bright-red:#e5484d;--term-light-bright-green:#12a150;--term-light-bright-yellow:#b07800;--term-light-bright-blue:#3d8bff;--term-light-bright-magenta:#b65fd1;--term-light-bright-cyan:#0b97ad;--term-light-bright-white:#8f8f8f;--term-dark-background:#111;--term-dark-foreground:#ededed;--term-dark-cursor:#52a8ff;--term-dark-selection:#1f3a5f;--term-dark-black:#2e2e2e;--term-dark-red:#ff6b70;--term-dark-green:#3ecf8e;--term-dark-yellow:#f5b638;--term-dark-blue:#52a8ff;--term-dark-magenta:#d08bf2;--term-dark-cyan:#3dc7d9;--term-dark-white:#d4d4d4;--term-dark-bright-black:#737373;--term-dark-bright-red:#ff8589;--term-dark-bright-green:#5fdba2;--term-dark-bright-yellow:#f5c56a;--term-dark-bright-blue:#7cbcff;--term-dark-bright-magenta:#e0aaf8;--term-dark-bright-cyan:#7ad9e6;--term-dark-bright-white:#fff;--term-background:var(--color-bg-subtle);--term-foreground:var(--color-text);--term-cursor:var(--color-accent);--term-selection:var(--term-light-selection);--term-black:var(--term-light-black);--term-red:var(--term-light-red);--term-green:var(--term-light-green);--term-yellow:var(--term-light-yellow);--term-blue:var(--term-light-blue);--term-magenta:var(--term-light-magenta);--term-cyan:var(--term-light-cyan);--term-white:var(--term-light-white);--term-bright-black:var(--term-light-bright-black);--term-bright-red:var(--term-light-bright-red);--term-bright-green:var(--term-light-bright-green);--term-bright-yellow:var(--term-light-bright-yellow);--term-bright-blue:var(--term-light-bright-blue);--term-bright-magenta:var(--term-light-bright-magenta);--term-bright-cyan:var(--term-light-bright-cyan);--term-bright-white:var(--term-light-bright-white)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--color-bg:#0a0a0a;--color-bg-subtle:#111;--color-bg-muted:#1a1a1a;--color-bg-hover:#161616;--color-bg-selected:#0f1a2b;--color-bg-overlay:#0009;--color-border:#232323;--color-border-strong:#333;--color-text:#ededed;--color-text-secondary:#a1a1a1;--color-text-tertiary:#8f8f8f;--color-text-inverse:#fff;--color-accent:#006bff;--color-accent-hover:#1a7aff;--color-accent-text:#52a8ff;--color-accent-subtle:#0d2240;--color-accent-ring:#52a8ff8c;--color-success:#3ecf8e;--color-success-text:#5fdba2;--color-success-subtle:#0e2a1c;--color-warning:#f5b638;--color-warning-text:#f5c56a;--color-warning-subtle:#2c2210;--color-danger:#f2555a;--color-danger-hover:#ff6b70;--color-danger-text:#ff8589;--color-danger-subtle:#2e1214;--shadow-sm:0 1px 2px #0000004d;--shadow-overlay:0 0 0 1px #ffffff0f, 0 16px 48px #0009;--term-background:var(--color-bg-subtle);--term-foreground:var(--color-text);--term-cursor:var(--color-accent-text);--term-selection:var(--term-dark-selection);--term-black:var(--term-dark-black);--term-red:var(--term-dark-red);--term-green:var(--term-dark-green);--term-yellow:var(--term-dark-yellow);--term-blue:var(--term-dark-blue);--term-magenta:var(--term-dark-magenta);--term-cyan:var(--term-dark-cyan);--term-white:var(--term-dark-white);--term-bright-black:var(--term-dark-bright-black);--term-bright-red:var(--term-dark-bright-red);--term-bright-green:var(--term-dark-bright-green);--term-bright-yellow:var(--term-dark-bright-yellow);--term-bright-blue:var(--term-dark-bright-blue);--term-bright-magenta:var(--term-dark-bright-magenta);--term-bright-cyan:var(--term-dark-bright-cyan);--term-bright-white:var(--term-dark-bright-white)}}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--color-bg:#0a0a0a;--color-bg-subtle:#111;--color-bg-muted:#1a1a1a;--color-bg-hover:#161616;--color-bg-selected:#0f1a2b;--color-bg-overlay:#0009;--color-border:#232323;--color-border-strong:#333;--color-text:#ededed;--color-text-secondary:#a1a1a1;--color-text-tertiary:#8f8f8f;--color-text-inverse:#fff;--color-accent:#006bff;--color-accent-hover:#1a7aff;--color-accent-text:#52a8ff;--color-accent-subtle:#0d2240;--color-accent-ring:#52a8ff8c;--color-success:#3ecf8e;--color-success-text:#5fdba2;--color-success-subtle:#0e2a1c;--color-warning:#f5b638;--color-warning-text:#f5c56a;--color-warning-subtle:#2c2210;--color-danger:#f2555a;--color-danger-hover:#ff6b70;--color-danger-text:#ff8589;--color-danger-subtle:#2e1214;--shadow-sm:0 1px 2px #0000004d;--shadow-overlay:0 0 0 1px #ffffff0f, 0 16px 48px #0009;--term-background:var(--color-bg-subtle);--term-foreground:var(--color-text);--term-cursor:var(--color-accent-text);--term-selection:var(--term-dark-selection);--term-black:var(--term-dark-black);--term-red:var(--term-dark-red);--term-green:var(--term-dark-green);--term-yellow:var(--term-dark-yellow);--term-blue:var(--term-dark-blue);--term-magenta:var(--term-dark-magenta);--term-cyan:var(--term-dark-cyan);--term-white:var(--term-dark-white);--term-bright-black:var(--term-dark-bright-black);--term-bright-red:var(--term-dark-bright-red);--term-bright-green:var(--term-dark-bright-green);--term-bright-yellow:var(--term-dark-bright-yellow);--term-bright-blue:var(--term-dark-bright-blue);--term-bright-magenta:var(--term-dark-bright-magenta);--term-bright-cyan:var(--term-dark-bright-cyan);--term-bright-white:var(--term-dark-bright-white)}@media (prefers-reduced-motion:reduce){:root{--duration-fast:0s;--duration-normal:0s;--duration-slow:0s}}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}body{background:var(--color-bg);min-height:100vh;color:var(--color-text);font-family:var(--font-sans);font-size:var(--text-md);line-height:var(--leading-normal);font-feature-settings:"ss01", "cv11";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility;margin:0}h1,h2,h3,p{margin:0}button,input{font:inherit;color:inherit}a{color:inherit;text-decoration:none}code,kbd{font-family:var(--font-mono)}:focus-visible{box-shadow:var(--focus-ring);outline:none}::selection{background:var(--color-accent-subtle)}.visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._button_7jx99_1{justify-content:center;align-items:center;gap:var(--space-1-5);border-radius:var(--radius-md);font-weight:var(--weight-medium);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);border:1px solid #0000;flex-shrink:0;display:inline-flex}._button_7jx99_1:disabled{cursor:not-allowed;opacity:.5}._xs_7jx99_24{height:var(--control-height-xs);padding:0 var(--space-1-5);font-size:var(--text-xs);border-radius:var(--radius-sm)}._sm_7jx99_31{height:var(--control-height-sm);padding:0 var(--space-2);font-size:var(--text-sm)}._md_7jx99_37{height:var(--control-height-md);padding:0 var(--space-3);font-size:var(--text-md)}._iconOnly_7jx99_43._xs_7jx99_24{width:var(--control-height-xs);padding:0}._iconOnly_7jx99_43._sm_7jx99_31{width:var(--control-height-sm);padding:0}._iconOnly_7jx99_43._md_7jx99_37{width:var(--control-height-md);padding:0}._primary_7jx99_58{background:var(--color-text);color:var(--color-bg)}._primary_7jx99_58:hover:not(:disabled){background:var(--color-text-secondary)}._secondary_7jx99_67{background:var(--color-bg);border-color:var(--color-border-strong);color:var(--color-text);box-shadow:var(--shadow-sm)}._secondary_7jx99_67:hover:not(:disabled){background:var(--color-bg-hover)}._ghost_7jx99_78{color:var(--color-text-secondary);background:0 0}._ghost_7jx99_78:hover:not(:disabled){background:var(--color-bg-muted);color:var(--color-text)}._danger_7jx99_88{background:var(--color-danger);color:var(--color-text-inverse)}._danger_7jx99_88:hover:not(:disabled){background:var(--color-danger-hover)}._kbd_33zsz_1{min-width:18px;height:18px;padding:0 var(--space-1);border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg-subtle);color:var(--color-text-tertiary);font-family:var(--font-sans);font-size:var(--text-2xs);font-weight:var(--weight-medium);justify-content:center;align-items:center;line-height:1;display:inline-flex}._dot_9vwwe_1{width:var(--dot-size);height:var(--dot-size);border-radius:var(--radius-full);flex-shrink:0;display:inline-block;position:relative}._success_9vwwe_10{background:var(--color-success)}._warning_9vwwe_14{background:var(--color-warning)}._danger_9vwwe_18{background:var(--color-danger)}._neutral_9vwwe_22{background:var(--color-border-strong)}._pulse_9vwwe_26:after{content:"";border-radius:inherit;background:inherit;animation:_pulse_9vwwe_26 1.6s var(--ease-out) infinite;position:absolute;inset:0}@keyframes _pulse_9vwwe_26{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(2.4)}}@media (prefers-reduced-motion:reduce){._pulse_9vwwe_26:after{animation:none}}._indicator_1ak1m_1{align-items:center;gap:var(--space-1-5);color:var(--color-text-secondary);font-size:var(--text-xs);white-space:nowrap;display:inline-flex}._header_10zm7_1{z-index:var(--z-sticky);border-bottom:1px solid var(--color-border);background:color-mix(in srgb, var(--color-bg) 85%, transparent);-webkit-backdrop-filter:saturate(1.8)blur(12px);backdrop-filter:saturate(1.8)blur(12px);position:sticky;top:0}._inner_10zm7_10{align-items:center;gap:var(--space-4);max-width:var(--content-width);height:56px;padding:0 var(--space-6);margin:0 auto;display:flex}._brand_10zm7_20{align-items:center;gap:var(--space-2);display:flex}._mark_10zm7_26{width:22px;height:22px;color:var(--color-text)}._title_10zm7_32{font-size:var(--text-md);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);white-space:nowrap}._titleMuted_10zm7_39{color:var(--color-text-tertiary);font-weight:var(--weight-medium)}._status_10zm7_44{align-items:center;gap:var(--space-3);min-width:0;display:flex}._autoMode_10zm7_51{align-items:center;gap:var(--space-1);color:var(--color-accent-text);font-size:var(--text-xs);font-weight:var(--weight-medium);white-space:nowrap;display:inline-flex}._actions_10zm7_61{align-items:center;gap:var(--space-1);margin-left:auto;display:flex}@media (max-width:720px){._inner_10zm7_10{padding:0 var(--space-4)}._status_10zm7_44{display:none}}@media (max-width:480px){._commandButton_10zm7_79,._healthLabel_10zm7_80,._namePortLabel_10zm7_81{display:none}}@media (max-width:400px){._actions_10zm7_61 ._themeToggle_10zm7_88{display:none}}._root_3mv2t_1{position:relative}._trigger_3mv2t_5{border-radius:var(--radius-full);cursor:pointer;background:0 0;border:0;padding:0;display:inline-flex}._trigger_3mv2t_5:hover>*{border-color:var(--color-border-strong)}._trigger_3mv2t_5:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}._menu_3mv2t_23{top:calc(100% + var(--space-1));z-index:var(--z-overlay);min-width:160px;padding:var(--space-1);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg);box-shadow:var(--shadow-overlay);flex-direction:column;display:flex;position:absolute;left:0}._item_3mv2t_38{padding:var(--space-1-5) var(--space-2);border-radius:var(--radius-md);color:var(--color-text);font:inherit;font-size:var(--text-sm);text-align:left;cursor:pointer;background:0 0;border:0}._item_3mv2t_38:hover:not(:disabled),._item_3mv2t_38:focus-visible{background:var(--color-bg-hover);outline:none}._item_3mv2t_38:disabled{color:var(--color-text-tertiary);cursor:default}._pill_wqgcm_1{align-items:center;gap:var(--space-1-5);height:var(--control-height-sm);padding:0 var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-full);background:var(--color-bg);color:var(--color-text-secondary);font-size:var(--text-xs);white-space:nowrap;display:inline-flex}._state_wqgcm_15{color:var(--color-text);font-weight:var(--weight-medium)}._divider_wqgcm_20{background:var(--color-border);width:1px;height:12px}._detail_wqgcm_26{align-items:center;gap:var(--space-1);display:inline-flex}._mono_wqgcm_32{font-family:var(--font-mono);font-variant-numeric:tabular-nums}._command_jyfy8_1{align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-2) var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle);text-align:left;display:flex}._text_jyfy8_12{gap:var(--space-0-5);flex:1;min-width:0;display:grid}._description_jyfy8_19{color:var(--color-text-tertiary);font-size:var(--text-xs)}._code_jyfy8_24{color:var(--color-text);font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._prompt_jyfy8_32{margin-right:var(--space-2);color:var(--color-text-tertiary);-webkit-user-select:none;user-select:none}._empty_lremh_1{align-items:center;gap:var(--space-3);padding:var(--space-12) var(--space-6);border:1px dashed var(--color-border-strong);border-radius:var(--radius-lg);text-align:center;flex-direction:column;display:flex}._icon_lremh_12{width:var(--control-height-lg);height:var(--control-height-lg);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg-subtle);color:var(--color-text-secondary);justify-content:center;align-items:center;display:inline-flex}._title_lremh_24{font-size:var(--text-lg);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight)}._text_lremh_30{max-width:44ch;color:var(--color-text-secondary);font-size:var(--text-sm)}._commands_lremh_36{gap:var(--space-2);width:100%;max-width:400px;margin:var(--space-2) 0;display:grid}._error_sh8gq_1{align-items:center;gap:var(--space-3);padding:var(--space-12) var(--space-6);border:1px solid var(--color-border);border-radius:var(--radius-lg);text-align:center;flex-direction:column;display:flex}._icon_sh8gq_12{width:var(--control-height-lg);height:var(--control-height-lg);border-radius:var(--radius-lg);background:var(--color-danger-subtle);color:var(--color-danger-text);justify-content:center;align-items:center;display:inline-flex}._title_sh8gq_23{font-size:var(--text-lg);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight)}._text_sh8gq_29{max-width:48ch;color:var(--color-text-secondary);font-size:var(--text-sm)}._code_sh8gq_35{padding:0 var(--space-1);border-radius:var(--radius-sm);background:var(--color-bg-muted);color:var(--color-text);font-size:var(--text-xs)}._bar_xy3ny_1{align-items:center;gap:var(--space-3);margin-bottom:var(--space-3);display:flex}._search_xy3ny_8{flex:1;align-items:center;min-width:0;display:flex;position:relative}._searchIcon_xy3ny_16{left:var(--space-3);color:var(--color-text-tertiary);pointer-events:none;position:absolute}._input_xy3ny_23{width:100%;min-width:0;height:var(--control-height-md);padding:0 var(--space-8) 0 var(--space-8);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);font-size:var(--text-md);transition:border-color var(--duration-fast) var(--ease-out)}._input_xy3ny_23::-webkit-search-cancel-button{display:none}._input_xy3ny_23::placeholder{color:var(--color-text-tertiary)}._input_xy3ny_23:hover{border-color:var(--color-border-strong)}._input_xy3ny_23:focus-visible{border-color:var(--color-accent)}._hint_xy3ny_51{right:var(--space-2);pointer-events:none;position:absolute}._count_xy3ny_57{color:var(--color-text-tertiary);font-size:var(--text-sm);font-variant-numeric:tabular-nums;white-space:nowrap}@media (max-width:400px){._count_xy3ny_57{display:none}}._list_md00l_1{border:1px solid var(--color-border);border-radius:var(--radius-lg);overflow:hidden}._row_md00l_7{align-items:center;gap:var(--space-3);min-height:var(--row-min-height);padding:var(--space-2) var(--space-4);border-bottom:1px solid var(--color-border);display:flex}._row_md00l_7:last-child{border-bottom:0}._dot_md00l_20,._line_md00l_21{background:var(--color-bg-muted);animation:1.4s ease-in-out infinite _shimmer_md00l_1}._dot_md00l_20{width:var(--dot-size);height:var(--dot-size);border-radius:var(--radius-full)}._lines_md00l_32{gap:var(--space-1-5);display:grid}._line_md00l_21{border-radius:var(--radius-sm);width:160px;height:10px}._short_md00l_43{width:220px;height:8px}@keyframes _shimmer_md00l_1{50%{opacity:.5}}@media (prefers-reduced-motion:reduce){._dot_md00l_20,._line_md00l_21{animation:none}}._backdrop_btpjf_1{z-index:var(--z-overlay);padding:14vh var(--space-4) var(--space-4);background:var(--color-bg-overlay);animation:_fade-in_btpjf_1 var(--duration-normal) var(--ease-out);justify-content:center;align-items:flex-start;display:flex;position:fixed;inset:0}._panel_btpjf_13{width:100%;max-width:var(--dialog-width);max-height:calc(100dvh - 14vh - var(--space-4));overscroll-behavior:contain;border:1px solid var(--color-border);border-radius:var(--radius-xl);background:var(--color-bg);box-shadow:var(--shadow-overlay);animation:_rise-in_btpjf_1 var(--duration-normal) var(--ease-out);overflow-y:auto}._large_btpjf_27{max-width:var(--dialog-width-lg)}._header_btpjf_31{gap:var(--space-1);padding:var(--space-5) var(--space-5) 0;display:grid}._title_btpjf_37{font-size:var(--text-lg);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight)}._description_btpjf_43{color:var(--color-text-secondary);font-size:var(--text-sm)}@keyframes _fade-in_btpjf_1{0%{opacity:0}}@keyframes _rise-in_btpjf_1{0%{opacity:0;transform:translateY(4px)scale(.99)}}._field_x40sl_1{gap:var(--space-1-5);min-width:0;display:grid}._label_x40sl_7{font-size:var(--text-sm);font-weight:var(--weight-medium);color:var(--color-text)}._input_x40sl_13{width:100%;min-width:0;height:var(--control-height-lg);padding:0 var(--space-3);border:1px solid var(--color-border-strong);border-radius:var(--radius-md);background:var(--color-bg);font-size:var(--text-md);transition:border-color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out)}._input_x40sl_13::placeholder{color:var(--color-text-tertiary)}._input_x40sl_13:hover:not(:disabled){border-color:var(--color-text-tertiary)}._input_x40sl_13:focus-visible{border-color:var(--color-accent)}._input_x40sl_13[aria-invalid=true]{border-color:var(--color-danger)}._input_x40sl_13:disabled{background:var(--color-bg-subtle);color:var(--color-text-secondary)}._mono_x40sl_48{font-family:var(--font-mono);font-size:var(--text-sm);font-variant-numeric:tabular-nums}._hint_x40sl_54,._error_x40sl_55{font-size:var(--text-xs)}._hint_x40sl_54{color:var(--color-text-tertiary)}._error_x40sl_55{color:var(--color-danger-text)}._body_9kmcr_1{gap:var(--space-4);padding:var(--space-4) var(--space-5) var(--space-5);display:grid}._groups_9kmcr_7{gap:var(--space-1);margin:0;padding:0;list-style:none;display:grid}._group_9kmcr_7{align-items:center;gap:var(--space-2);width:100%;min-width:0;padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);color:var(--color-text);font:inherit;font-size:var(--text-sm);text-align:left;cursor:pointer;display:flex}._group_9kmcr_7:hover{border-color:var(--color-border-strong);background:var(--color-bg-subtle)}._group_9kmcr_7:focus-visible{box-shadow:var(--focus-ring);outline:none}._group_9kmcr_7[aria-current=true]{border-color:var(--color-accent)}._groupIcon_9kmcr_46{color:var(--color-text-tertiary);flex-shrink:0}._groupName_9kmcr_51{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._note_9kmcr_59{color:var(--color-text-tertiary);font-size:var(--text-xs);flex-shrink:0}._create_9kmcr_65{align-items:end;gap:var(--space-2);grid-template-columns:minmax(0,1fr) auto;display:grid}._footer_9kmcr_72{justify-content:flex-end;gap:var(--space-2);padding-top:var(--space-4);border-top:1px solid var(--color-border);flex-wrap:wrap;display:flex}@media (max-width:420px){._create_9kmcr_65{grid-template-columns:minmax(0,1fr)}}._noMatches_mxbn9_1{align-items:center;gap:var(--space-2);padding:var(--space-10) var(--space-6);border:1px solid var(--color-border);border-radius:var(--radius-lg);color:var(--color-text-secondary);font-size:var(--text-sm);flex-direction:column;display:flex}._query_mxbn9_13{color:var(--color-text);font-family:var(--font-mono)}._root_hqony_1{position:relative}._trigger_hqony_5{width:var(--control-height-sm);height:var(--control-height-sm);border-radius:var(--radius-md);color:var(--color-text-secondary);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}._trigger_hqony_5:hover{background:var(--color-bg-hover);color:var(--color-text)}._trigger_hqony_5:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}._badge_hqony_30{min-width:16px;height:16px;padding:0 var(--space-1);border-radius:var(--radius-full);background:var(--color-accent);color:var(--color-bg);font-size:var(--text-xs);font-weight:var(--weight-semibold);text-align:center;line-height:16px;position:absolute;top:2px;right:2px}._menu_hqony_46{top:calc(100% + var(--space-1));z-index:var(--z-overlay);width:min(340px, calc(100vw - 2 * var(--space-4)));max-height:min(420px,70vh);padding:var(--space-1);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg);box-shadow:var(--shadow-overlay);flex-direction:column;display:flex;position:absolute;right:0;overflow-y:auto}._empty_hqony_63{padding:var(--space-3);color:var(--color-text-secondary);font-size:var(--text-sm)}._item_hqony_69{gap:var(--space-0-5);min-width:0;padding:var(--space-2);border-radius:var(--radius-md);color:var(--color-text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex-direction:column;display:flex}._item_hqony_69:hover,._item_hqony_69:focus-visible{background:var(--color-bg-hover);outline:none}._itemHead_hqony_90{align-items:baseline;gap:var(--space-2);min-width:0;display:flex}._itemTitle_hqony_97{min-width:0;font-size:var(--text-sm);font-weight:var(--weight-medium);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}._time_hqony_107{color:var(--color-text-tertiary);font-size:var(--text-xs);font-variant-numeric:tabular-nums;flex-shrink:0}._itemBody_hqony_114{color:var(--color-text-secondary);font-size:var(--text-xs);overflow-wrap:anywhere}._banner_195vz_1{align-items:flex-start;gap:var(--space-2);margin-bottom:var(--space-4);padding:var(--space-3) var(--space-4);border:1px solid color-mix(in srgb, var(--color-warning) 40%, transparent);border-radius:var(--radius-lg);background:var(--color-warning-subtle);color:var(--color-warning-text);font-size:var(--text-sm);display:flex}._icon_195vz_14{flex-shrink:0;margin-top:2px}._strong_195vz_19{font-weight:var(--weight-semibold)}._code_195vz_23{padding:0 var(--space-1);border-radius:var(--radius-sm);background:color-mix(in srgb, var(--color-warning) 18%, transparent);font-size:var(--text-xs)}._icon_14w05_1{border-radius:var(--radius-sm);flex-shrink:0;justify-content:center;align-items:center;line-height:1;display:inline-flex;overflow:hidden}._md_14w05_11{width:16px;height:16px}._sm_14w05_16{width:14px;height:14px}._image_14w05_21{object-fit:contain}._text_14w05_25{font-size:var(--text-xs)}._monogram_14w05_29{background:hsl(var(--monogram-hue) 60% 50% / .18);color:hsl(var(--monogram-hue) 55% 42%);font-family:var(--font-sans);font-size:9px;font-weight:var(--weight-semibold);letter-spacing:-.02em}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) ._monogram_14w05_29{color:hsl(var(--monogram-hue) 70% 72%)}}:root[data-theme=dark] ._monogram_14w05_29{color:hsl(var(--monogram-hue) 70% 72%)}._header_6codc_1{align-items:center;gap:var(--space-3);min-height:var(--control-height-md);padding:var(--space-1) var(--space-3) var(--space-1) var(--space-2);background:var(--color-bg-subtle);display:flex}._heading_6codc_10{min-width:0;font-size:var(--text-sm);font-weight:var(--weight-medium)}._toggle_6codc_16{align-items:center;gap:var(--space-1-5);max-width:100%;padding:var(--space-1) var(--space-2);border-radius:var(--radius-md);color:var(--color-text);font:inherit;cursor:pointer;background:0 0;border:0;display:flex}._toggle_6codc_16:hover{background:var(--color-bg-hover)}._toggle_6codc_16:focus-visible{box-shadow:var(--focus-ring);outline:none}._chevron_6codc_39{color:var(--color-text-tertiary);transition:transform var(--duration-fast) var(--ease-out);flex-shrink:0}._closed_6codc_45{transform:rotate(-90deg)}._label_6codc_49{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._count_6codc_55{color:var(--color-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0}._summary_6codc_61{align-items:center;gap:var(--space-1-5);color:var(--color-text-tertiary);font-size:var(--text-xs);white-space:nowrap;flex-shrink:0;margin-left:auto;display:inline-flex}._actions_6codc_72{gap:var(--space-0-5);flex-shrink:0;display:inline-flex}._summary_6codc_61+._actions_6codc_72{margin-left:0}._heading_6codc_10+._actions_6codc_72{margin-left:auto}@media (max-width:480px){._summaryText_6codc_87{display:none}}._list_1s4a7_1{border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg);margin:0;padding:0;list-style:none;overflow:hidden}._group_1s4a7_11{border-bottom:1px solid var(--color-border)}._group_1s4a7_11:last-child{border-bottom:0}._groupRows_1s4a7_19{border-top:1px solid var(--color-border);margin:0;padding:0;list-style:none}._badge_172nr_1{align-items:center;gap:var(--space-1);height:20px;padding:0 var(--space-1-5);border-radius:var(--radius-sm);font-size:var(--text-xs);font-weight:var(--weight-medium);white-space:nowrap;line-height:1;display:inline-flex}._neutral_172nr_14{background:var(--color-bg-muted);color:var(--color-text-secondary)}._accent_172nr_19{background:var(--color-accent-subtle);color:var(--color-accent-text)}._success_172nr_24{background:var(--color-success-subtle);color:var(--color-success-text)}._warning_172nr_29{background:var(--color-warning-subtle);color:var(--color-warning-text)}._danger_172nr_34{background:var(--color-danger-subtle);color:var(--color-danger-text)}._directUrl_wk1ct_1{border-radius:var(--radius-sm);max-width:100%;color:var(--color-text-tertiary);cursor:copy;font-family:var(--font-mono);font-size:var(--text-xs);text-align:left;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;padding:0;overflow:hidden}._directUrl_wk1ct_1:hover{color:var(--color-text-secondary);text-underline-offset:3px;text-decoration:underline}._directUrl_wk1ct_1:focus-visible{box-shadow:var(--focus-ring);outline:none}._location_1pxmu_1{align-items:center;gap:var(--space-0-5) var(--space-2);min-width:0;color:var(--color-text-tertiary);font-size:var(--text-xs);flex-wrap:wrap;display:flex}._part_1pxmu_11{align-items:center;gap:var(--space-1);min-width:0;max-width:100%;display:inline-flex}._icon_1pxmu_19{flex-shrink:0}._text_1pxmu_23{font-family:var(--font-mono);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._row_lqkgm_1{--row-actions-width:216px;--row-background:var(--color-bg);grid-template-columns:var(--dot-size) minmax(0, 1fr) auto var(--row-actions-width);align-items:center;gap:var(--space-3);min-height:var(--row-min-height);padding:var(--space-2) var(--space-4);border-bottom:1px solid var(--color-border);transition:background-color var(--duration-fast) var(--ease-out);display:grid;position:relative}._row_lqkgm_1:last-child{border-bottom:0}._row_lqkgm_1:hover{--row-background:var(--color-bg-subtle);background:var(--row-background)}._row_lqkgm_1[data-selected]{--row-background:var(--color-bg-hover);background:var(--row-background)}._status_lqkgm_33{justify-content:center;display:inline-flex}._row_lqkgm_1[data-selected]:before{content:"";top:var(--space-2);bottom:var(--space-2);border-radius:0 var(--radius-sm) var(--radius-sm) 0;background:var(--color-accent);width:2px;position:absolute;left:0}._identity_lqkgm_49{gap:var(--space-0-5);flex-direction:column;min-width:0;display:flex}._nameLine_lqkgm_56{align-items:center;gap:var(--space-1);min-width:0;display:flex}._favoriteMark_lqkgm_63{color:var(--color-warning);flex-shrink:0;display:inline-flex}._favoriteMark_lqkgm_63 svg,._starOn_lqkgm_70{fill:currentColor}._starOn_lqkgm_70{color:var(--color-warning)}._name_lqkgm_56{color:var(--color-text);font-size:var(--text-md);font-weight:var(--weight-medium);letter-spacing:var(--tracking-tight);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._name_lqkgm_56:hover{text-decoration:underline;-webkit-text-decoration-color:var(--color-border-strong);text-decoration-color:var(--color-border-strong);text-underline-offset:3px}._url_lqkgm_94{color:var(--color-text-tertiary);font-family:var(--font-mono);font-size:var(--text-xs);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._meta_lqkgm_103{place-items:center stretch;gap:var(--space-3);grid-template-columns:auto 52px 7ch 11ch;display:grid}._tunnelCell_lqkgm_112{justify-self:end}._kind_lqkgm_116{display:inline-flex}._tunnelCell_lqkgm_112{min-width:0}._port_lqkgm_124,._uptime_lqkgm_125{white-space:nowrap;color:var(--color-text-secondary);font-family:var(--font-mono);font-size:var(--text-xs);font-variant-numeric:tabular-nums;text-align:right;overflow:hidden}._uptime_lqkgm_125[data-state=down]{color:var(--color-text-tertiary)}._actionsCell_lqkgm_139{align-self:stretch;position:relative}._actions_lqkgm_139,._confirm_lqkgm_145{justify-content:flex-end;align-items:center;gap:var(--space-0-5);padding-left:var(--space-2);background:var(--row-background);box-shadow:calc(-1 * var(--space-2)) 0 var(--space-2) var(--row-background);white-space:nowrap;display:flex;position:absolute;top:50%;right:0;transform:translateY(-50%)}._actions_lqkgm_139{opacity:0;pointer-events:none;transition:opacity var(--duration-fast) var(--ease-out)}._row_lqkgm_1:hover ._actions_lqkgm_139,._row_lqkgm_1:focus-within ._actions_lqkgm_139,._row_lqkgm_1[data-selected] ._actions_lqkgm_139{opacity:1;pointer-events:auto}._confirm_lqkgm_145{gap:var(--space-1)}._confirmText_lqkgm_177{margin-right:var(--space-1);color:var(--color-text-secondary);font-size:var(--text-sm);white-space:nowrap}@media (max-width:1024px){._row_lqkgm_1{--row-actions-width:142px}}@media (max-width:720px){._row_lqkgm_1{grid-template-columns:var(--dot-size) minmax(0, 1fr) auto}._meta_lqkgm_103{display:none}._actionsCell_lqkgm_139{align-self:center}._actions_lqkgm_139,._confirm_lqkgm_145{box-shadow:none;padding-left:0;position:static;transform:none}._actions_lqkgm_139{opacity:1;pointer-events:auto}}@media (max-width:480px){._row_lqkgm_1{grid-template-columns:var(--dot-size) minmax(0, 1fr)}._actionsCell_lqkgm_139{grid-column:2/-1}._actions_lqkgm_139,._confirm_lqkgm_145{justify-content:flex-start}}._chip_1v407_1{align-items:center;gap:var(--space-1);height:18px;padding:0 var(--space-1-5);border:1px solid var(--color-border);border-radius:var(--radius-full);background:var(--color-bg);color:var(--color-text-secondary);font-family:var(--font-mono);font-size:var(--text-2xs);white-space:nowrap;cursor:pointer;flex-shrink:0;line-height:1;display:inline-flex}._chip_1v407_1:hover{border-color:var(--color-border-strong);color:var(--color-text)}._dot_1v407_24{border-radius:var(--radius-full);background:var(--color-text-tertiary);width:6px;height:6px}._chip_1v407_1[data-status=running] ._dot_1v407_24{background:var(--color-success)}._chip_1v407_1[data-status=failed]{color:var(--color-danger-text)}._chip_1v407_1[data-status=failed] ._dot_1v407_24{background:var(--color-danger)}._tunnels_1rof0_1{gap:var(--space-1);flex-wrap:wrap;display:inline-flex}._tunnel_1rof0_1{height:20px;padding:0 var(--space-1-5);border:1px solid var(--color-border);border-radius:var(--radius-sm);color:var(--color-text-secondary);font-size:var(--text-xs);font-weight:var(--weight-medium);transition:border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);align-items:center;display:inline-flex}._tunnel_1rof0_1:hover{border-color:var(--color-border-strong);color:var(--color-text)}._hints_1dy1z_1{justify-content:center;gap:var(--space-2) var(--space-5);margin:var(--space-6) 0 0;color:var(--color-text-tertiary);font-size:var(--text-xs);flex-wrap:wrap;padding:0;list-style:none;display:flex}._hint_1dy1z_1{align-items:center;gap:var(--space-1);display:inline-flex}._hint_1dy1z_1 span{margin-left:var(--space-0-5)}@media (max-width:720px){._hints_1dy1z_1{display:none}}._body_iqzeq_1{gap:var(--space-5);padding:var(--space-4) var(--space-5) var(--space-5);grid-template-columns:repeat(auto-fit,minmax(220px,1fr));display:grid}._group_iqzeq_8{min-width:0}._title_iqzeq_12{margin-bottom:var(--space-2);color:var(--color-text-tertiary);font-size:var(--text-xs);font-weight:var(--weight-medium);text-transform:uppercase;letter-spacing:.04em}._list_iqzeq_21{gap:var(--space-1-5);margin:0;display:grid}._item_iqzeq_27{justify-content:space-between;align-items:center;gap:var(--space-3);min-width:0;display:flex}._label_iqzeq_35{min-width:0;color:var(--color-text);font-size:var(--text-sm)}._keys_iqzeq_41{align-items:center;gap:var(--space-1);flex-shrink:0;margin:0;display:flex}._combo_iqzeq_49{align-items:center;gap:var(--space-0-5);display:inline-flex}._or_iqzeq_55{margin:0 var(--space-1);color:var(--color-text-tertiary);font-size:var(--text-xs)}._page_17faa_1{min-height:100dvh;padding:var(--space-4);justify-content:center;align-items:center;display:flex}._card_17faa_9{gap:var(--space-3);width:100%;max-width:var(--dialog-width);display:grid}._title_17faa_16{font-size:var(--text-xl);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight)}._text_17faa_22{color:var(--color-text-secondary);font-size:var(--text-sm)}._root_nclys_1{flex-shrink:0;position:relative}._trigger_nclys_6{align-items:center;gap:var(--space-1-5);height:var(--control-height-sm);padding:0 var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);color:var(--color-text);font:inherit;font-size:var(--text-sm);cursor:pointer;display:inline-flex}._trigger_nclys_6:hover{border-color:var(--color-border-strong)}._trigger_nclys_6:focus-visible{box-shadow:var(--focus-ring);outline:none}._trigger_nclys_6[aria-expanded=true]{border-color:var(--color-border-strong);background:var(--color-bg-hover)}._triggerIcon_nclys_35{color:var(--color-text-tertiary);flex-shrink:0}._badge_nclys_40{min-width:16px;height:16px;padding:0 var(--space-1);border-radius:var(--radius-full);background:var(--color-accent);color:var(--color-bg);font-size:var(--text-2xs);font-weight:var(--weight-medium);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;display:inline-flex}._panel_nclys_55{top:calc(100% + var(--space-1));z-index:var(--z-overlay);gap:var(--space-2);width:260px;max-width:calc(100vw - 2 * var(--space-4));max-height:min(70vh,520px);padding:var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg);box-shadow:var(--shadow-overlay);flex-direction:column;display:flex;position:absolute;left:0;overflow-y:auto}._section_nclys_74{gap:var(--space-0-5);border:0;flex-direction:column;min-width:0;margin:0;padding:0;display:flex}._legend_nclys_84{padding:0 var(--space-1-5) var(--space-1);color:var(--color-text-tertiary);font-size:var(--text-xs);font-weight:var(--weight-medium)}._option_nclys_91{align-items:center;gap:var(--space-2);min-width:0;padding:var(--space-1) var(--space-1-5);border-radius:var(--radius-md);color:var(--color-text);font-size:var(--text-sm);cursor:pointer;display:flex}._option_nclys_91:hover,._option_nclys_91:focus-within{background:var(--color-bg-hover)}._checkbox_nclys_108{accent-color:var(--color-accent);cursor:pointer;flex-shrink:0;margin:0}._checkbox_nclys_108:focus-visible{box-shadow:var(--focus-ring);outline:none}._optionLabel_nclys_120{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._search_nclys_128{height:var(--control-height-sm);margin:0 var(--space-0-5) var(--space-1);padding:0 var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);color:var(--color-text);font:inherit;font-size:var(--text-sm)}._search_nclys_128:focus-visible{box-shadow:var(--focus-ring);outline:none}._projects_nclys_145{gap:var(--space-0-5);flex-direction:column;max-height:220px;display:flex;overflow-y:auto}._empty_nclys_153{padding:var(--space-1) var(--space-1-5);color:var(--color-text-tertiary);font-size:var(--text-xs);margin:0}._footer_nclys_160{padding-top:var(--space-2);border-top:1px solid var(--color-border);justify-content:flex-end;display:flex}._summary_nclys_167{align-items:center;gap:var(--space-0-5);height:24px;padding:0 var(--space-0-5) 0 var(--space-2);border-radius:var(--radius-full);background:var(--color-accent-subtle);color:var(--color-accent-text);font-size:var(--text-xs);white-space:nowrap;display:inline-flex}._clear_nclys_180{border-radius:var(--radius-full);width:20px;height:20px;color:inherit;cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}._clear_nclys_180:hover{background:var(--color-bg-hover)}._clear_nclys_180:focus-visible{box-shadow:var(--focus-ring);outline:none}@media (max-width:480px){._panel_nclys_55{width:auto;max-width:none;max-height:75vh;padding:var(--space-3) var(--space-4) var(--space-4);border-radius:var(--radius-xl) var(--radius-xl) 0 0;position:fixed;inset:auto 0 0}._option_nclys_91{padding:var(--space-1-5)}}._controls_1q3tz_1{align-items:center;gap:var(--space-2);min-width:0;margin-bottom:var(--space-3);flex-wrap:wrap;display:flex}._select_1q3tz_10{align-items:center;gap:var(--space-1-5);min-width:0;max-width:100%;color:var(--color-text-tertiary);font-size:var(--text-xs);display:inline-flex}._select_1q3tz_10 select{min-width:0;max-width:160px;height:var(--control-height-sm);padding:0 var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);color:var(--color-text);font:inherit;font-size:var(--text-sm)}._select_1q3tz_10 select:hover{border-color:var(--color-border-strong)}._select_1q3tz_10 select:focus-visible{box-shadow:var(--focus-ring);outline:none}._flipped_1q3tz_42{transform:scaleY(-1)}._divider_1q3tz_46{background:var(--color-border);width:1px;height:16px}@media (max-width:480px){._selectLabel_1q3tz_53,._divider_1q3tz_46{display:none}}._root_tkq97_1{flex-shrink:1;min-width:0;position:relative}._trigger_tkq97_7{align-items:center;gap:var(--space-1-5);max-width:180px;height:var(--control-height-md);padding:0 var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);color:var(--color-text);font:inherit;font-size:var(--text-sm);font-weight:var(--weight-medium);cursor:pointer;display:inline-flex}._trigger_tkq97_7:hover{border-color:var(--color-border-strong)}._trigger_tkq97_7:focus-visible{box-shadow:var(--focus-ring);outline:none}._triggerIcon_tkq97_33{color:var(--color-text-tertiary);flex-shrink:0}._triggerLabel_tkq97_38{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._modified_tkq97_45{border-radius:var(--radius-full);background:var(--color-accent);flex-shrink:0;width:6px;height:6px}._menu_tkq97_53{top:calc(100% + var(--space-1));z-index:var(--z-overlay);width:max-content;min-width:200px;max-width:min(280px, calc(100vw - 2 * var(--space-4)));padding:var(--space-1);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg);box-shadow:var(--shadow-overlay);flex-direction:column;display:flex;position:absolute;left:0}._item_tkq97_70{align-items:center;gap:var(--space-1-5);min-width:0;padding:var(--space-1-5) var(--space-2);border-radius:var(--radius-md);color:var(--color-text);font:inherit;font-size:var(--text-sm);text-align:left;cursor:pointer;background:0 0;border:0;display:flex}._item_tkq97_70:hover:not(:disabled),._item_tkq97_70:focus-visible{background:var(--color-bg-hover);outline:none}._item_tkq97_70:disabled{color:var(--color-text-tertiary);cursor:default}._check_tkq97_97{width:14px;color:var(--color-accent);flex-shrink:0;display:inline-flex}._itemLabel_tkq97_104{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._note_tkq97_112{color:var(--color-text-tertiary);font-size:var(--text-xs);flex-shrink:0}._separator_tkq97_118{margin:var(--space-1) 0;border:0;border-top:1px solid var(--color-border)}._form_1eh0e_1{gap:var(--space-4);padding:var(--space-4) var(--space-5) var(--space-5);display:grid}._fields_1eh0e_7{align-items:start;gap:var(--space-3);grid-template-columns:minmax(0,1fr) 112px;display:grid}._preview_1eh0e_14{align-items:center;gap:var(--space-2);min-width:0;padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);background:var(--color-bg-subtle);font-size:var(--text-sm);display:flex}._previewLabel_1eh0e_25{color:var(--color-text-tertiary);flex-shrink:0}._previewUrl_1eh0e_30{color:var(--color-text);font-family:var(--font-mono);font-size:var(--text-xs);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._conflict_1eh0e_39{align-items:center;gap:var(--space-3);padding:var(--space-3);border:1px solid color-mix(in srgb, var(--color-danger) 35%, transparent);border-radius:var(--radius-md);background:var(--color-danger-subtle);color:var(--color-danger-text);font-size:var(--text-sm);display:flex}._conflict_1eh0e_39 p{flex:1}._serverError_1eh0e_55{color:var(--color-danger-text);font-size:var(--text-sm)}._footer_1eh0e_60{align-items:center;gap:var(--space-2);padding-top:var(--space-4);border-top:1px solid var(--color-border);display:flex}._hint_1eh0e_68{align-items:center;gap:var(--space-1);color:var(--color-text-tertiary);font-size:var(--text-xs);margin-right:auto;display:inline-flex}._field_198lv_1{justify-content:space-between;align-items:center;gap:var(--space-3);min-width:0;display:flex}._text_198lv_9{gap:var(--space-0-5);min-width:0;display:grid}._label_198lv_15{color:var(--color-text);font-size:var(--text-sm);font-weight:var(--weight-medium);cursor:pointer}._description_198lv_22{color:var(--color-text-tertiary);font-size:var(--text-xs)}._track_198lv_27{border-radius:var(--radius-full);background:var(--color-border-strong);cursor:pointer;width:32px;height:18px;transition:background-color var(--duration-fast) var(--ease-out);border:0;flex-shrink:0;padding:0;position:relative}._track_198lv_27[aria-checked=true]{background:var(--color-accent)}._track_198lv_27:disabled{cursor:not-allowed;opacity:.5}._thumb_198lv_49{border-radius:var(--radius-full);background:var(--color-text-inverse);width:14px;height:14px;box-shadow:var(--shadow-sm);transition:transform var(--duration-fast) var(--ease-out);position:absolute;top:2px;left:2px}._track_198lv_27[aria-checked=true] ._thumb_198lv_49{transform:translate(14px)}._other_1qcbn_1{gap:var(--space-1);min-width:0;display:grid}._toggle_1qcbn_7{justify-self:start;align-items:center;gap:var(--space-1);padding:var(--space-1) var(--space-2);border-radius:var(--radius-md);color:var(--color-text-tertiary);font-size:var(--text-xs);cursor:pointer;background:0 0;border:0;display:inline-flex}._toggle_1qcbn_7:hover{background:var(--color-bg-hover);color:var(--color-text-secondary)}._toggle_1qcbn_7:focus-visible{box-shadow:var(--focus-ring);outline:none}._chevron_1qcbn_31{transition:transform var(--duration-fast) var(--ease-out);flex-shrink:0}._closed_1qcbn_36{transform:rotate(-90deg)}._list_1qcbn_40{margin:0;padding:0;list-style:none}._row_1qcbn_46{align-items:baseline;gap:var(--space-1) var(--space-3);min-width:0;padding:var(--space-1) var(--space-2);color:var(--color-text-tertiary);font-size:var(--text-xs);flex-wrap:wrap;display:flex}._port_1qcbn_57{color:var(--color-text-secondary);font-family:var(--font-mono);font-variant-numeric:tabular-nums}._process_1qcbn_63{font-family:var(--font-mono)}._reason_1qcbn_67{overflow-wrap:anywhere;min-width:0}._row_mk1vv_1{align-items:center;gap:var(--space-3);min-height:var(--row-min-height);padding:var(--space-2) var(--space-4);border-bottom:1px solid var(--color-border);grid-template-columns:10ch minmax(0,1fr) auto;display:grid}._row_mk1vv_1:last-child{border-bottom:0}._row_mk1vv_1:hover,._row_mk1vv_1:focus-within{background:var(--color-bg-subtle)}._portCell_mk1vv_21{gap:var(--space-0-5);flex-direction:column;min-width:0;display:flex}._uptime_mk1vv_28{color:var(--color-text-tertiary);font-family:var(--font-mono);font-size:var(--text-2xs);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden}._uptime_mk1vv_28:empty{display:none}._port_mk1vv_21{color:var(--color-text);font-family:var(--font-mono);font-size:var(--text-sm);font-variant-numeric:tabular-nums}._info_mk1vv_48{gap:var(--space-0-5);flex-direction:column;min-width:0;display:flex}._titleLine_mk1vv_55{align-items:center;gap:var(--space-1-5);min-width:0;display:flex}._suggestion_mk1vv_62,._noSuggestion_mk1vv_63{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._suggestion_mk1vv_62{color:var(--color-text);font-family:var(--font-mono);font-size:var(--text-sm);font-weight:var(--weight-medium)}._noSuggestion_mk1vv_63{color:var(--color-text-tertiary);font-size:var(--text-sm);font-style:italic}._process_mk1vv_82{align-items:baseline;gap:var(--space-1);min-width:0;color:var(--color-text-tertiary);font-size:var(--text-xs);display:flex}._processName_mk1vv_91{font-family:var(--font-mono);flex-shrink:0}._docker_mk1vv_96{flex-shrink:0;align-self:center}._separator_mk1vv_101{flex-shrink:0}._folder_mk1vv_105{font-family:var(--font-mono);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._extraPorts_mk1vv_112{align-items:baseline;gap:var(--space-0-5) var(--space-2);min-width:0;color:var(--color-text-tertiary);font-size:var(--text-xs);flex-wrap:wrap;display:flex}._actions_mk1vv_122{justify-content:flex-end;align-items:center;gap:var(--space-1);min-width:0;display:flex}@media (max-width:480px){._row_mk1vv_1{padding:var(--space-3);grid-template-columns:10ch minmax(0,1fr)}._actions_mk1vv_122{grid-column:1/-1}}._confirmText_mk1vv_141{margin-right:var(--space-1);color:var(--color-text-secondary);font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._section_omuic_1{gap:var(--space-3);min-width:0;margin-bottom:var(--space-6);display:grid}._header_omuic_8{justify-content:space-between;align-items:flex-end;gap:var(--space-3) var(--space-4);flex-wrap:wrap;min-width:0;display:flex}._intro_omuic_17{gap:var(--space-1);flex:280px;min-width:0;display:grid}._title_omuic_24{align-items:center;gap:var(--space-2);color:var(--color-text);font-size:var(--text-md);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);display:flex}._collapse_omuic_34{align-items:center;gap:var(--space-2);min-width:0;margin-left:calc(-1 * var(--space-2));padding:var(--space-1) var(--space-2);border-radius:var(--radius-md);color:inherit;font:inherit;letter-spacing:inherit;text-align:left;cursor:pointer;background:0 0;border:0;display:inline-flex}._collapse_omuic_34:hover{background:var(--color-bg-hover)}._collapse_omuic_34:focus-visible{box-shadow:var(--focus-ring);outline:none}._chevron_omuic_60{color:var(--color-text-tertiary);transition:transform var(--duration-fast) var(--ease-out);flex-shrink:0}._closed_omuic_66{transform:rotate(-90deg)}._body_omuic_70{gap:var(--space-2);min-width:0;display:grid}._titleIcon_omuic_76{color:var(--color-accent-text);flex-shrink:0}._count_omuic_81{font-variant-numeric:tabular-nums}._text_omuic_85{max-width:60ch;color:var(--color-text-secondary);font-size:var(--text-sm)}._controls_omuic_91{align-items:center;gap:var(--space-3);flex-wrap:wrap;min-width:0;display:flex}._autoSwitch_omuic_99{gap:var(--space-2)}._list_omuic_103{border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg);margin:0;padding:0;list-style:none;overflow:hidden}._body_1641z_1{gap:var(--space-4);padding:var(--space-4) var(--space-5) var(--space-5);display:grid}._routes_1641z_7{gap:var(--space-0-5);border:0;grid-template-columns:repeat(auto-fill,minmax(12rem,1fr));min-width:0;margin:0;padding:0;display:grid}._legend_1641z_17{margin-bottom:var(--space-1);color:var(--color-text-secondary);font-size:var(--text-xs);padding:0}._option_1641z_24{align-items:center;gap:var(--space-2);min-width:0;padding:var(--space-1) var(--space-1-5);border-radius:var(--radius-md);color:var(--color-text);font-family:var(--font-mono);font-size:var(--text-sm);cursor:pointer;display:flex}._option_1641z_24:hover,._option_1641z_24:focus-within{background:var(--color-bg-hover)}._checkbox_1641z_42{accent-color:var(--color-accent);cursor:pointer;flex-shrink:0;margin:0}._checkbox_1641z_42:focus-visible{box-shadow:var(--focus-ring);outline:none}._optionLabel_1641z_54{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._fields_1641z_62{gap:var(--space-3);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}._error_1641z_68{color:var(--color-danger-text);font-size:var(--text-sm);margin:0}._preview_1641z_74{min-height:3lh;max-height:14rem;padding:var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle);color:var(--color-text);font-family:var(--font-mono);font-size:var(--text-sm);white-space:pre;margin:0;display:block;overflow:auto}._footer_1641z_90{justify-content:flex-end;gap:var(--space-2);padding-top:var(--space-4);border-top:1px solid var(--color-border);display:flex}@media (max-width:520px){._fields_1641z_62{grid-template-columns:minmax(0,1fr)}}._body_1hmb6_1{gap:var(--space-4);padding:var(--space-4) var(--space-5) 0;display:grid}._loading_1hmb6_7,._error_1hmb6_8{font-size:var(--text-sm)}._loading_1hmb6_7{color:var(--color-text-tertiary)}._error_1hmb6_8{color:var(--color-danger-text)}._checks_1hmb6_20{border:1px solid var(--color-border);border-radius:var(--radius-lg);list-style:none;display:grid}._check_1hmb6_20{gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--color-border);grid-template-columns:auto minmax(0,1fr);display:grid}._check_1hmb6_20:last-child{border-bottom:0}._dot_1hmb6_39{height:calc(var(--text-md) * var(--leading-normal));align-items:center;display:flex}._text_1hmb6_45{gap:var(--space-1-5);min-width:0;display:grid}._title_1hmb6_51{color:var(--color-text);font-size:var(--text-md);font-weight:var(--weight-medium);overflow-wrap:anywhere}._detail_1hmb6_58{color:var(--color-text-secondary);font-size:var(--text-sm);overflow-wrap:anywhere}._studio_1hmb6_64{gap:var(--space-2);display:grid}._sectionTitle_1hmb6_69{color:var(--color-text);font-size:var(--text-sm);font-weight:var(--weight-semibold)}._studioRow_1hmb6_75{justify-content:space-between;align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}._buttons_1hmb6_83{gap:var(--space-2);display:flex}._footer_1hmb6_88{justify-content:flex-end;gap:var(--space-2);margin:0 calc(-1 * var(--space-5));padding:var(--space-3) var(--space-5) var(--space-5);border-top:1px solid var(--color-border);background:var(--color-bg);display:flex;position:sticky;bottom:0}._spinner_1j02j_1{border-radius:var(--radius-full);border:2px solid;border-right-color:#0000;flex-shrink:0;animation:.7s linear infinite _spin_1j02j_1;display:inline-block}@keyframes _spin_1j02j_1{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){._spinner_1j02j_1{animation-duration:2s}}._banner_em7ta_1{gap:var(--space-4);min-width:0;margin-bottom:var(--space-4);padding:var(--space-5);border:1px solid color-mix(in srgb, var(--color-warning) 40%, transparent);border-radius:var(--radius-lg);background:var(--color-warning-subtle);display:grid}._header_em7ta_12{align-items:flex-start;gap:var(--space-3);min-width:0;display:flex}._icon_em7ta_19{width:var(--control-height-md);height:var(--control-height-md);border-radius:var(--radius-md);background:color-mix(in srgb, var(--color-warning) 18%, transparent);color:var(--color-warning-text);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}._intro_em7ta_31{gap:var(--space-1);min-width:0;display:grid}._title_em7ta_37{color:var(--color-text);font-size:var(--text-md);font-weight:var(--weight-semibold)}._text_em7ta_43{max-width:60ch;color:var(--color-text-secondary);font-size:var(--text-sm)}._actions_em7ta_49{align-items:center;gap:var(--space-3);flex-wrap:wrap;min-width:0;display:flex}._command_em7ta_57{flex:260px;min-width:0}._hint_em7ta_62{color:var(--color-text-secondary);font-size:var(--text-xs)}._error_em7ta_67{gap:var(--space-2);min-width:0;padding:var(--space-3);border:1px solid color-mix(in srgb, var(--color-danger) 40%, transparent);border-radius:var(--radius-md);background:var(--color-danger-subtle);color:var(--color-danger-text);font-size:var(--text-sm);display:grid}._errorTitle_em7ta_79{font-weight:var(--weight-semibold)}._errorHint_em7ta_83{color:var(--color-text-secondary);font-size:var(--text-xs)}._details_em7ta_88{min-width:0;font-size:var(--text-xs)}._summary_em7ta_93{color:var(--color-text-secondary);cursor:pointer}._log_em7ta_98{max-height:240px;padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg);color:var(--color-text);font-family:var(--font-mono);font-size:var(--text-xs);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;line-height:1.5;overflow:auto}._details_em7ta_88 ._log_em7ta_98{margin-top:var(--space-2)}@media (max-width:480px){._banner_em7ta_1{padding:var(--space-4)}}._backdrop_1hrgh_1{z-index:var(--z-overlay);padding:12vh var(--space-4) var(--space-4);background:var(--color-bg-overlay);animation:_fade-in_1hrgh_1 var(--duration-normal) var(--ease-out);justify-content:center;align-items:flex-start;display:flex;position:fixed;inset:0}._panel_1hrgh_13{width:100%;max-width:var(--command-width);border:1px solid var(--color-border);border-radius:var(--radius-xl);background:var(--color-bg);max-height:min(480px,70vh);box-shadow:var(--shadow-overlay);animation:_rise-in_1hrgh_1 var(--duration-normal) var(--ease-out);flex-direction:column;display:flex;overflow:hidden}._search_1hrgh_27{align-items:center;gap:var(--space-2);padding:0 var(--space-4);border-bottom:1px solid var(--color-border);display:flex}._searchIcon_1hrgh_35{color:var(--color-text-tertiary)}._input_1hrgh_39{height:52px;font-size:var(--text-lg);background:0 0;border:0;outline:none;flex:1}._input_1hrgh_39:focus-visible{box-shadow:none}._input_1hrgh_39::placeholder{color:var(--color-text-tertiary)}._list_1hrgh_56{padding:var(--space-2);overflow-y:auto}._groupLabel_1hrgh_61{padding:var(--space-2) var(--space-2) var(--space-1);color:var(--color-text-tertiary);font-size:var(--text-xs);font-weight:var(--weight-medium)}._option_1hrgh_68{align-items:center;gap:var(--space-2);min-height:40px;padding:0 var(--space-2);border-radius:var(--radius-md);color:var(--color-text);font-size:var(--text-md);cursor:pointer;display:flex}._option_1hrgh_68[aria-selected=true]{background:var(--color-bg-muted)}._optionIcon_1hrgh_84{color:var(--color-text-secondary);flex-shrink:0}._optionLabel_1hrgh_89{flex-shrink:0}._optionDetail_1hrgh_93{min-width:0;color:var(--color-text-tertiary);font-family:var(--font-mono);font-size:var(--text-xs);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}._optionShortcut_1hrgh_104{gap:var(--space-1);margin-left:auto;display:flex}._empty_1hrgh_110{padding:var(--space-8) var(--space-4);color:var(--color-text-secondary);font-size:var(--text-sm);text-align:center}@keyframes _fade-in_1hrgh_1{0%{opacity:0}}@keyframes _rise-in_1hrgh_1{0%{opacity:0;transform:translateY(4px)scale(.99)}}._page_xltpu_1{min-height:100vh}._main_xltpu_5{max-width:var(--content-width);padding:var(--space-8) var(--space-6) var(--space-16);margin:0 auto}._sectionTitle_xltpu_11{margin-bottom:var(--space-3);color:var(--color-text);font-size:var(--text-md);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight)}@media (max-width:720px){._main_xltpu_5{padding:var(--space-4) var(--space-4) var(--space-10)}}._menu_rltcq_1{z-index:var(--z-overlay);min-width:200px;max-width:calc(100vw - 16px);max-height:calc(100vh - 16px);padding:var(--space-1);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg);box-shadow:var(--shadow-overlay);flex-direction:column;display:flex;position:fixed;overflow-y:auto}._item_rltcq_17{align-items:center;gap:var(--space-2);min-width:0;height:var(--control-height-sm);padding:0 var(--space-2);border-radius:var(--radius-md);color:var(--color-text);font:inherit;font-size:var(--text-sm);text-align:left;cursor:pointer;background:0 0;border:0;display:flex}._item_rltcq_17:focus{background:var(--color-bg-hover);outline:none}._item_rltcq_17[aria-disabled=true]{color:var(--color-text-tertiary);cursor:default}._item_rltcq_17[aria-expanded=true]{background:var(--color-bg-hover)}._icon_rltcq_48,._chevron_rltcq_49{color:var(--color-text-secondary);flex-shrink:0}._label_rltcq_54{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}._separator_rltcq_61{height:1px;margin:var(--space-1) 0;background:var(--color-border);border:0}._chip_ovhzf_1{align-items:center;gap:var(--space-0-5);min-width:0;max-width:100%;height:var(--control-height-xs);padding:0 var(--space-0-5) 0 var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-full);background:var(--color-bg-muted);color:var(--color-text);font-size:var(--text-xs);display:inline-flex}._mono_ovhzf_16{font-family:var(--font-mono);font-variant-numeric:tabular-nums}._label_ovhzf_21{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._remove_ovhzf_27{border-radius:var(--radius-full);width:18px;height:18px;color:var(--color-text-tertiary);cursor:pointer;background:0 0;border:0;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}._remove_ovhzf_27:hover{background:var(--color-bg-hover);color:var(--color-text)}._field_1rxm8_1{gap:var(--space-1-5);min-width:0;display:grid}._label_1rxm8_7{color:var(--color-text);font-size:var(--text-sm);font-weight:var(--weight-medium)}._box_1rxm8_13{align-items:center;gap:var(--space-1);min-width:0;min-height:var(--control-height-lg);padding:var(--space-1) var(--space-2);border:1px solid var(--color-border-strong);border-radius:var(--radius-md);background:var(--color-bg);transition:border-color var(--duration-fast) var(--ease-out);flex-wrap:wrap;display:flex}._box_1rxm8_13:hover{border-color:var(--color-text-tertiary)}._box_1rxm8_13:focus-within{border-color:var(--color-accent)}._box_1rxm8_13[data-invalid]{border-color:var(--color-danger)}._chips_1rxm8_39{margin:0;padding:0;list-style:none;display:contents}._item_1rxm8_46{min-width:0;max-width:100%;display:flex}._input_1rxm8_52{min-width:80px;height:var(--control-height-sm);padding:0 var(--space-1);font-size:var(--text-md);background:0 0;border:0;flex:80px}._input_1rxm8_52:focus-visible{box-shadow:none;outline:none}._input_1rxm8_52::placeholder{color:var(--color-text-tertiary)}._mono_1rxm8_71{font-family:var(--font-mono);font-size:var(--text-sm)}._hint_1rxm8_76,._error_1rxm8_77{font-size:var(--text-xs)}._hint_1rxm8_76{color:var(--color-text-tertiary)}._error_1rxm8_77{color:var(--color-danger-text)}._field_phr4w_1{gap:var(--space-2);min-width:0;display:grid}._list_phr4w_7{gap:var(--space-1-5);margin:0;padding:0;list-style:none;display:grid}._row_phr4w_15{align-items:center;gap:var(--space-2);grid-template-columns:auto minmax(0,1fr) minmax(0,1.4fr) auto;min-width:0;display:grid}._name_phr4w_23{font-family:var(--font-mono);font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._input_phr4w_31{width:100%;min-width:0;height:var(--control-height-md);padding:0 var(--space-2);border:1px solid var(--color-border-strong);border-radius:var(--radius-md);background:var(--color-bg);font-size:var(--text-sm)}._input_phr4w_31::placeholder{color:var(--color-text-tertiary)}._input_phr4w_31:focus-visible{border-color:var(--color-accent);box-shadow:var(--focus-ring);outline:none}._hint_phr4w_52,._error_phr4w_53{font-size:var(--text-xs);margin:0}._hint_phr4w_52{color:var(--color-text-tertiary)}._error_phr4w_53{color:var(--color-danger-text)}._field_1g0tu_1{gap:var(--space-1-5);flex-direction:column;min-width:0;display:flex}._label_1g0tu_8{color:var(--color-text);font-size:var(--text-sm);font-weight:var(--weight-medium)}._select_1g0tu_14{width:100%;min-width:0;height:var(--control-height-md);padding:0 var(--space-2);border:1px solid var(--color-border-strong);border-radius:var(--radius-md);background:var(--color-bg);color:var(--color-text);font:inherit;font-size:var(--text-sm)}._select_1g0tu_14:focus-visible{box-shadow:var(--focus-ring);outline:none}._hint_1g0tu_32{color:var(--color-text-tertiary);font-size:var(--text-xs)}._form_e485r_1{gap:var(--space-5);min-width:0;padding:var(--space-4) var(--space-5) 0;display:grid}._loading_e485r_8{align-items:center;gap:var(--space-2);padding:var(--space-6) var(--space-5);color:var(--color-text-secondary);font-size:var(--text-sm);display:flex}._file_e485r_17{align-items:flex-start;gap:var(--space-2);min-width:0;padding:var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle);display:flex}._fileText_e485r_28{gap:var(--space-1);flex:1;min-width:0;display:grid}._path_e485r_35{color:var(--color-text);font-family:var(--font-mono);font-size:var(--text-xs);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._fileHint_e485r_44{color:var(--color-text-tertiary);font-size:var(--text-xs)}._group_e485r_49{gap:var(--space-4);border:0;min-width:0;margin:0;padding:0;display:grid}._legend_e485r_58{margin-bottom:var(--space-3);color:var(--color-text-tertiary);font-size:var(--text-xs);font-weight:var(--weight-medium);letter-spacing:.04em;text-transform:uppercase;padding:0}._short_e485r_68{max-width:200px}._formError_e485r_72{margin:0 var(--space-5);color:var(--color-danger-text);font-size:var(--text-sm)}._form_e485r_1 ._formError_e485r_72{margin:0}._footer_e485r_83{justify-content:flex-end;gap:var(--space-2);margin:0 calc(-1 * var(--space-5));padding:var(--space-3) var(--space-5) var(--space-5);border-top:1px solid var(--color-border);background:var(--color-bg);display:flex;position:sticky;bottom:0}._preview_e485r_95{color:var(--color-text-secondary);font-size:var(--text-xs);margin:0}._previewName_e485r_101{color:var(--color-text);font-family:var(--font-mono)}._tokens_e485r_106{gap:var(--space-1);color:var(--color-text-secondary);font-size:var(--text-xs);margin:0;display:grid}._token_e485r_106{gap:var(--space-2);grid-template-columns:6rem minmax(0,1fr);display:grid}._token_e485r_106 dt,._token_e485r_106 dd{margin:0}._columns_e485r_125{gap:var(--space-3);grid-template-columns:repeat(auto-fit,minmax(140px,1fr));display:grid}._preview_1yvt6_1{--preview-bg:var(--term-background);--preview-fg:var(--term-foreground);--preview-cursor:var(--term-cursor);--preview-red:var(--term-red);--preview-green:var(--term-green);--preview-yellow:var(--term-yellow);--preview-blue:var(--term-blue);--preview-magenta:var(--term-magenta);--preview-cyan:var(--term-cyan);--preview-dim:var(--term-bright-black);padding:var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--preview-bg);color:var(--preview-fg);font-family:var(--font-mono);white-space:pre;overflow:hidden}._preview_1yvt6_1[data-theme=dark]{--preview-bg:var(--term-dark-background);--preview-fg:var(--term-dark-foreground);--preview-cursor:var(--term-dark-cursor);--preview-red:var(--term-dark-red);--preview-green:var(--term-dark-green);--preview-yellow:var(--term-dark-yellow);--preview-blue:var(--term-dark-blue);--preview-magenta:var(--term-dark-magenta);--preview-cyan:var(--term-dark-cyan);--preview-dim:var(--term-dark-bright-black)}._preview_1yvt6_1[data-theme=light]{--preview-bg:var(--term-light-background);--preview-fg:var(--term-light-foreground);--preview-cursor:var(--term-light-cursor);--preview-red:var(--term-light-red);--preview-green:var(--term-light-green);--preview-yellow:var(--term-light-yellow);--preview-blue:var(--term-light-blue);--preview-magenta:var(--term-light-magenta);--preview-cyan:var(--term-light-cyan);--preview-dim:var(--term-light-bright-black)}._red_1yvt6_49{color:var(--preview-red)}._green_1yvt6_53{color:var(--preview-green)}._yellow_1yvt6_57{color:var(--preview-yellow)}._blue_1yvt6_61{color:var(--preview-blue)}._magenta_1yvt6_65{color:var(--preview-magenta)}._cyan_1yvt6_69{color:var(--preview-cyan)}._dim_1yvt6_73{color:var(--preview-dim)}._bold_1yvt6_77{font-weight:var(--weight-semibold)}._cursor_1yvt6_81{vertical-align:text-bottom;background:var(--preview-cursor);width:.6em;height:1.1em;display:inline-block}._cursor_1yvt6_81[data-style=bar]{width:2px}._cursor_1yvt6_81[data-style=underline]{vertical-align:baseline;height:2px}._cursor_1yvt6_81[data-blink]{animation:1s step-end infinite _blink_1yvt6_1}@keyframes _blink_1yvt6_1{50%{opacity:0}}@media (prefers-reduced-motion:reduce){._cursor_1yvt6_81[data-blink]{animation:none}}._field_1vtvp_1{gap:var(--space-2);min-width:0;display:grid}._list_1vtvp_7{gap:var(--space-1-5);margin:0;padding:0;list-style:none;display:grid}._row_1vtvp_15{align-items:center;gap:var(--space-2);grid-template-columns:minmax(0,.7fr) minmax(0,1.6fr) auto;min-width:0;display:grid}._input_1vtvp_23{width:100%;min-width:0;height:var(--control-height-md);padding:0 var(--space-2);border:1px solid var(--color-border-strong);border-radius:var(--radius-md);background:var(--color-bg);font-size:var(--text-sm)}._mono_1vtvp_34{font-family:var(--font-mono)}._input_1vtvp_23::placeholder{color:var(--color-text-tertiary)}._input_1vtvp_23:focus-visible{border-color:var(--color-accent);box-shadow:var(--focus-ring);outline:none}._actions_1vtvp_48{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}._hint_1vtvp_55,._error_1vtvp_56,._saved_1vtvp_57{font-size:var(--text-xs);margin:0}._hint_1vtvp_55,._saved_1vtvp_57{color:var(--color-text-tertiary)}._hint_1vtvp_55 code{font-family:var(--font-mono);overflow-wrap:anywhere}._error_1vtvp_56{color:var(--color-danger-text)}@media (max-width:480px){._row_1vtvp_15{grid-template-columns:minmax(0,1fr) auto}._row_1vtvp_15 ._mono_1vtvp_34{grid-area:2/1/auto/2}}._banner_1a7pw_1{align-items:flex-start;gap:var(--space-2);margin-bottom:var(--space-4);padding:var(--space-3) var(--space-4);border:1px solid color-mix(in srgb, var(--color-accent) 35%, transparent);border-radius:var(--radius-lg);background:var(--color-accent-subtle);color:var(--color-text);font-size:var(--text-sm);display:flex}._icon_1a7pw_14{color:var(--color-accent-text);flex-shrink:0;margin-top:2px}._text_1a7pw_20{flex:1;min-width:0}._strong_1a7pw_25{font-weight:var(--weight-semibold)}._code_1a7pw_29{padding:0 var(--space-1);border-radius:var(--radius-sm);background:color-mix(in srgb, var(--color-accent) 14%, transparent);font-size:var(--text-xs);overflow-wrap:anywhere}._form_7sorc_1{gap:var(--space-3);width:100%;max-width:var(--dialog-width-lg);min-width:0;padding:var(--space-4);flex-direction:column;display:flex;overflow-y:auto}._field_7sorc_12{gap:var(--space-1-5);flex-direction:column;min-width:0;display:flex}._label_7sorc_19{color:var(--color-text);font-size:var(--text-sm);font-weight:var(--weight-medium)}._select_7sorc_25{width:100%;min-width:0;height:var(--control-height-md);padding:0 var(--space-2);border:1px solid var(--color-border-strong);border-radius:var(--radius-md);background:var(--color-bg);color:var(--color-text);font:inherit;font-size:var(--text-sm);text-overflow:ellipsis}._buttons_7sorc_39{justify-content:flex-end;gap:var(--space-2);display:flex}._empty_7sorc_45{color:var(--color-text-secondary);font-size:var(--text-sm)}._recent_7sorc_50{align-items:center;gap:var(--space-1-5);flex-wrap:wrap;min-width:0;display:flex}._recentLabel_7sorc_58{color:var(--color-text-tertiary);font-size:var(--text-xs)}._recentCommand_7sorc_63{max-width:100%;height:var(--control-height-xs);padding:0 var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-full);background:var(--color-bg);color:var(--color-text-secondary);font-family:var(--font-mono);font-size:var(--text-2xs);text-overflow:ellipsis;white-space:nowrap;cursor:pointer;overflow:hidden}._recentCommand_7sorc_63:hover{border-color:var(--color-border-strong);color:var(--color-text)}._recentCommand_7sorc_63:focus-visible{box-shadow:var(--focus-ring);outline:none}._panel_17a6g_1{z-index:var(--z-sticky);border-color:var(--color-border);background:var(--color-bg);min-width:0;max-width:100vw;min-height:0;max-height:100vh;box-shadow:var(--shadow-overlay);border-style:solid;border-width:0;flex-direction:column;display:flex;position:fixed}._panel_17a6g_1[data-dock=bottom]{height:var(--panel-size);max-height:calc(100vh - var(--space-16));border-top-width:1px;bottom:0;left:0;right:0}._panel_17a6g_1[data-dock=right]{width:var(--panel-size);max-width:calc(100vw - var(--space-16) * 5);box-shadow:none;border-left-width:1px;top:0;bottom:0;right:0}._handle_17a6g_37{z-index:2;touch-action:none;position:absolute}._panel_17a6g_1[data-dock=bottom] ._handle_17a6g_37{top:calc(var(--space-1) * -1);height:var(--space-2);cursor:row-resize;left:0;right:0}._panel_17a6g_1[data-dock=right] ._handle_17a6g_37{top:0;bottom:0;left:calc(var(--space-1) * -1);width:var(--space-2);cursor:col-resize}._handle_17a6g_37:focus-visible,._handle_17a6g_37:hover{background:var(--color-accent-ring)}._header_17a6g_64{align-items:center;gap:var(--space-2);min-width:0;min-height:calc(var(--control-height-sm) + var(--space-2));padding:var(--space-1) var(--space-2);border-bottom:1px solid var(--color-border);display:flex}._heading_17a6g_74{min-width:0;color:var(--color-text);font-size:var(--text-sm);font-weight:var(--weight-medium);flex:1}._headingCount_17a6g_82{margin-left:var(--space-1);color:var(--color-text-tertiary);font-weight:var(--weight-regular)}._actions_17a6g_88{align-items:center;gap:var(--space-1);flex-shrink:0;margin-left:auto;display:flex}._restored_17a6g_96{align-items:center;gap:var(--space-2);padding:var(--space-1-5) var(--space-3);border-bottom:1px solid var(--color-border);background:var(--color-warning-subtle);color:var(--color-warning-text);font-size:var(--text-xs);flex-wrap:wrap;display:flex}._restoredText_17a6g_108{flex:1;min-width:0}._main_17a6g_113{flex:1;min-width:0;min-height:0;display:flex}._detail_17a6g_120{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}._toolbar_17a6g_128{align-items:center;gap:var(--space-2) var(--space-3);min-width:0;padding:var(--space-1) var(--space-3);border-bottom:1px solid var(--color-border);font-size:var(--text-xs);flex-wrap:wrap;display:flex}._renameRow_17a6g_139{padding:var(--space-1) var(--space-3);border-bottom:1px solid var(--color-border)}._status_17a6g_144{color:var(--color-text-secondary);font-weight:var(--weight-medium);flex-shrink:0}._status_17a6g_144[data-status=running]{color:var(--color-success-text)}._status_17a6g_144[data-status=failed]{color:var(--color-danger-text)}._status_17a6g_144[data-status=restart]{color:var(--color-warning-text)}._command_17a6g_162{min-width:0;max-width:100%;color:var(--color-text-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._ports_17a6g_171{gap:var(--space-2);flex-wrap:wrap;min-width:0;display:flex}._portLinks_17a6g_178{gap:var(--space-1);white-space:nowrap;display:flex}._portLink_17a6g_178{color:var(--color-text-secondary);font-family:var(--font-mono);font-size:var(--text-xs)}._portLink_17a6g_178:hover{color:var(--color-text);text-underline-offset:3px;text-decoration:underline}._named_17a6g_196{color:var(--color-text-tertiary);white-space:nowrap}._toolbarActions_17a6g_201{gap:var(--space-1);flex-wrap:wrap;margin-left:auto;display:flex}._body_17a6g_208{flex:1;min-width:0;min-height:0;display:flex}@media (max-width:640px){._panel_17a6g_1[data-dock]{border-width:0;width:auto;max-width:none;height:auto;max-height:none;inset:0}._handle_17a6g_37,._dockToggle_17a6g_226{display:none}}@media (max-width:480px){._newLabel_17a6g_232{display:none}}._sidebar_1m2dp_1{border-right:1px solid var(--color-border);background:var(--color-bg);flex-direction:column;flex-shrink:0;min-height:0;display:flex;position:relative}._filter_1m2dp_11{align-items:center;gap:var(--space-1-5);margin:var(--space-2);padding:0 var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-md);color:var(--color-text-tertiary);display:flex}._filter_1m2dp_11:focus-within{border-color:var(--color-border-strong)}._filterInput_1m2dp_26{min-width:0;height:var(--control-height-sm);color:var(--color-text);font:inherit;font-size:var(--text-xs);background:0 0;border:0;outline:none;flex:1}._list_1m2dp_38{min-height:0;padding:var(--space-1) var(--space-1-5) var(--space-3);scrollbar-width:thin;flex:1;overflow-y:auto}._group_1m2dp_46+._group_1m2dp_46{margin-top:var(--space-2)}._groupHeader_1m2dp_50{align-items:baseline;gap:var(--space-1-5);min-width:0;padding:var(--space-1-5) var(--space-1-5) var(--space-1);color:var(--color-text-tertiary);font-size:var(--text-2xs);display:flex}._groupName_1m2dp_60{font-weight:var(--weight-medium);text-overflow:ellipsis;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;overflow:hidden}._branch_1m2dp_69{align-items:center;gap:var(--space-0-5);min-width:0;font-family:var(--font-mono);text-overflow:ellipsis;white-space:nowrap;flex-shrink:1;display:inline-flex;overflow:hidden}._item_1m2dp_81{border-radius:var(--radius-md);color:var(--color-text-secondary);align-items:center;display:flex;position:relative}._item_1m2dp_81:hover{background:var(--color-bg-hover)}._item_1m2dp_81[data-active]{background:var(--color-bg-selected);color:var(--color-text)}._itemButton_1m2dp_98{gap:var(--space-0-5);min-width:0;padding:var(--space-1-5) var(--space-6) var(--space-1-5) var(--space-2);border-radius:var(--radius-md);color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex-direction:column;flex:1;display:flex}._itemButton_1m2dp_98:focus-visible{box-shadow:var(--focus-ring);outline:none}._titleLine_1m2dp_118{align-items:center;gap:var(--space-1-5);min-width:0;display:flex}._title_1m2dp_118{min-width:0;font-size:var(--text-sm);font-weight:var(--weight-medium);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}._ports_1m2dp_135,._exit_1m2dp_136{align-items:center;gap:var(--space-0-5);color:var(--color-text-tertiary);font-size:var(--text-2xs);flex-shrink:0;display:inline-flex}._command_1m2dp_145{padding-left:calc(var(--dot-size) + var(--space-1-5));color:var(--color-text-tertiary);font-family:var(--font-mono);font-size:var(--text-2xs);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._close_1m2dp_155{top:var(--space-1);right:var(--space-1);width:var(--control-height-xs);height:var(--control-height-xs);border-radius:var(--radius-sm);color:var(--color-text-tertiary);cursor:pointer;opacity:0;background:0 0;border:0;place-items:center;display:grid;position:absolute}._item_1m2dp_81:hover ._close_1m2dp_155,._item_1m2dp_81:focus-within ._close_1m2dp_155{opacity:1}._close_1m2dp_155:hover{background:var(--color-bg-muted);color:var(--color-text)}._empty_1m2dp_181{padding:var(--space-2);color:var(--color-text-tertiary);font-size:var(--text-xs)}._handle_1m2dp_187{top:0;right:calc(var(--space-1) * -1);z-index:1;width:var(--space-2);cursor:col-resize;touch-action:none;position:absolute;bottom:0}._handle_1m2dp_187:focus-visible{background:var(--color-accent-ring)}@media (hover:none){._close_1m2dp_155{opacity:1}}._dot_17kef_1{width:var(--dot-size);height:var(--dot-size);border-radius:var(--radius-full);background:var(--color-text-tertiary);flex-shrink:0}._dot_17kef_1[data-status=running]{background:var(--color-success)}._dot_17kef_1[data-status=failed]{background:var(--color-danger)}._dot_17kef_1[data-status=restart]{background:var(--color-warning)}._field_1kk5v_1{width:100%;min-width:0;max-width:220px;height:var(--control-height-sm);padding:0 var(--space-2);border:1px solid var(--color-border-strong);border-radius:var(--radius-md);background:var(--color-bg);color:var(--color-text);font-family:var(--font-mono);font-size:var(--text-xs)}._field_1kk5v_1:focus-visible{box-shadow:var(--focus-ring);outline:none}._select_mbg7i_1{width:100%;min-width:0;max-width:360px;height:var(--control-height-sm);padding:0 var(--space-2);border:1px solid var(--color-border-strong);border-radius:var(--radius-md);background:var(--color-bg);color:var(--color-text);font:inherit;font-size:var(--text-xs);text-overflow:ellipsis;flex:1}._select_mbg7i_1:focus-visible{box-shadow:var(--focus-ring);outline:none}._tabs_1wr2h_1{align-items:center;gap:var(--space-3);scrollbar-width:thin;flex:1;min-width:0;display:flex;overflow-x:auto}._group_1wr2h_11{align-items:center;gap:var(--space-1);flex-shrink:0;display:flex}._groupName_1wr2h_18{color:var(--color-text-tertiary);font-size:var(--text-2xs);font-weight:var(--weight-medium);text-transform:uppercase;letter-spacing:.04em;white-space:nowrap}._branch_1wr2h_27{margin-left:var(--space-1-5);font-family:var(--font-mono);font-weight:var(--weight-regular);text-transform:none;letter-spacing:normal}._tab_1wr2h_1{height:var(--control-height-sm);border-radius:var(--radius-md);color:var(--color-text-secondary);align-items:center;display:flex}._tab_1wr2h_1:hover,._tab_1wr2h_1[data-active]{background:var(--color-bg-hover);color:var(--color-text)}._tabButton_1wr2h_49{align-items:center;gap:var(--space-1-5);max-width:180px;height:100%;padding:0 var(--space-1) 0 var(--space-2);border-radius:var(--radius-md);color:inherit;cursor:pointer;background:0 0;border:0;display:flex}._tabButton_1wr2h_49:focus-visible{box-shadow:var(--focus-ring);outline:none}._title_1wr2h_68{font-family:var(--font-mono);font-size:var(--text-xs);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._close_1wr2h_76{width:var(--control-height-xs);height:var(--control-height-xs);margin-right:var(--space-0-5);border-radius:var(--radius-sm);color:var(--color-text-tertiary);cursor:pointer;background:0 0;border:0;place-items:center;display:grid}._close_1wr2h_76:hover{background:var(--color-bg-muted);color:var(--color-text)}._view_x5xux_1{background:var(--term-background);flex:1;min-width:0;min-height:0;position:relative}._view_x5xux_1[data-theme=dark]{background:var(--term-dark-background)}._view_x5xux_1[data-theme=light]{background:var(--term-light-background)}._screen_x5xux_17{inset:var(--space-2) 0 0 var(--space-3);position:absolute;overflow:hidden}._message_x5xux_23{top:var(--space-3);left:var(--space-3);color:var(--color-text-tertiary);font-size:var(--text-sm);position:absolute}._jump_x5xux_31{right:var(--space-4);bottom:var(--space-3);z-index:1;align-items:center;gap:var(--space-1);height:var(--control-height-xs);padding:0 var(--space-3);border:1px solid var(--color-border-strong);border-radius:var(--radius-full);background:var(--color-bg);box-shadow:var(--shadow-overlay);color:var(--color-text);font-size:var(--text-xs);font-weight:var(--weight-medium);cursor:pointer;display:flex;position:absolute}._jump_x5xux_31:hover{background:var(--color-bg-hover)}._jump_x5xux_31:focus-visible{box-shadow:var(--focus-ring);outline:none}._form_1eeox_1{gap:var(--space-4);padding:var(--space-4) var(--space-5) var(--space-5);display:grid}._footer_1eeox_7{justify-content:flex-end;align-items:center;gap:var(--space-2);padding-top:var(--space-4);border-top:1px solid var(--color-border);flex-wrap:wrap;display:flex}._region_x3wy8_1{right:var(--space-4);bottom:var(--space-4);z-index:var(--z-toast);gap:var(--space-2);width:min(360px, calc(100vw - 2 * var(--space-4)));pointer-events:none;flex-direction:column;display:flex;position:fixed}._toast_x3wy8_13{align-items:flex-start;gap:var(--space-2);padding:var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg);box-shadow:var(--shadow-overlay);pointer-events:auto;animation:_slide-in_x3wy8_1 var(--duration-slow) var(--ease-out);display:flex}._icon_x3wy8_26{flex-shrink:0;margin-top:2px}._neutral_x3wy8_31 ._icon_x3wy8_26{color:var(--color-text-secondary)}._success_x3wy8_35 ._icon_x3wy8_26{color:var(--color-success)}._error_x3wy8_39 ._icon_x3wy8_26{color:var(--color-danger)}._body_x3wy8_43{flex:1;min-width:0}._title_x3wy8_48{font-size:var(--text-md);font-weight:var(--weight-medium)}._description_x3wy8_53{margin-top:var(--space-0-5);color:var(--color-text-secondary);font-size:var(--text-sm);overflow-wrap:anywhere}._action_x3wy8_60{margin-top:var(--space-2);padding:var(--space-0-5) var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);color:var(--color-text);font:inherit;font-size:var(--text-sm);font-weight:var(--weight-medium);cursor:pointer}._action_x3wy8_60:hover{background:var(--color-bg-hover)}._action_x3wy8_60:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}._close_x3wy8_82{width:var(--control-height-xs);height:var(--control-height-xs);border-radius:var(--radius-sm);color:var(--color-text-tertiary);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}._close_x3wy8_82:hover{background:var(--color-bg-muted);color:var(--color-text)}@keyframes _slide-in_x3wy8_1{0%{opacity:0;transform:translateY(8px)}}._layout_lsew_1{min-height:100vh;padding-right:var(--terminal-room-right);padding-bottom:var(--terminal-room-bottom)}._toggle_lsew_7{right:var(--space-4);bottom:var(--space-4);z-index:var(--z-sticky);align-items:center;gap:var(--space-1-5);height:var(--control-height-sm);padding:0 var(--space-3);border:1px solid var(--color-border-strong);border-radius:var(--radius-full);background:var(--color-bg);box-shadow:var(--shadow-sm);color:var(--color-text-secondary);font-size:var(--text-xs);font-weight:var(--weight-medium);cursor:pointer;display:flex;position:fixed}._toggle_lsew_7:hover{color:var(--color-text)}._count_lsew_31{min-width:var(--space-4);padding:0 var(--space-1);border-radius:var(--radius-full);background:var(--color-bg-muted);color:var(--color-text);text-align:center}@media (max-width:640px){._layout_lsew_1{padding:0}}._waiting_lsew_46{width:var(--dot-size);height:var(--dot-size);border-radius:var(--radius-full);background:var(--color-warning)}