symbio 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,13 @@
1
1
  // Worker workspaces. In a git project a worker gets its own worktree on its own
2
2
  // branch (isolated copy of the committed files), unless it is set to share the
3
3
  // project folder. Without git, workers always share it. Workers in the project
4
- // folder rely on shared-asset grants alone.
4
+ // folder rely on shared-asset grants alone. In a project made of several repositories
5
+ // (repos.ts), a helper's worktree comes from the repository it was given (agent.repo), and its
6
+ // merges happen there.
5
7
  import { existsSync, promises as fs } from "node:fs";
6
8
  import path from "node:path";
7
9
  import { git } from "./git.js";
10
+ import { repoRoot } from "./repos.js";
8
11
  import { globalDir } from "./store.js";
9
12
  export async function isGitRepo(dir) {
10
13
  return existsSync(path.join(dir, ".git"));
@@ -14,8 +17,9 @@ export function inProjectFolder(project, agent) {
14
17
  const norm = (p) => (process.platform === "win32" ? path.resolve(p).toLowerCase() : path.resolve(p));
15
18
  return norm(agent.directory) === norm(project.directory);
16
19
  }
17
- export async function createWorkspace(project, agentName, mode = "own") {
18
- if (mode === "shared" || !(await isGitRepo(project.directory))) {
20
+ export async function createWorkspace(project, agentName, mode = "own", repo) {
21
+ const root = repoRoot(project, { repo });
22
+ if (mode === "shared" || !(await isGitRepo(root))) {
19
23
  return { directory: project.directory, branch: null, base: null };
20
24
  }
21
25
  const slug = agentName.toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "") || "agent";
@@ -24,14 +28,14 @@ export async function createWorkspace(project, agentName, mode = "own") {
24
28
  if (existsSync(directory))
25
29
  throw new Error(`A workspace for "${agentName}" already exists.`);
26
30
  await fs.mkdir(path.dirname(directory), { recursive: true });
27
- const base = await git(project.directory, "rev-parse", "HEAD").catch(() => "");
31
+ const base = await git(root, "rev-parse", "HEAD").catch(() => "");
28
32
  if (!base)
29
- throw new Error("The project's git repository has no commits yet; commit the current files first.");
30
- const branchExists = await git(project.directory, "rev-parse", "--verify", "--quiet", branch).then(() => true, () => false);
31
- await git(project.directory, "worktree", "add", ...(branchExists ? [directory, branch] : ["-b", branch, directory, base]));
32
- const dirty = await git(project.directory, "status", "--porcelain").catch(() => "");
33
+ throw new Error(`The ${repo ? `"${repo}" ` : "project's "}git repository has no commits yet; commit the current files first.`);
34
+ const branchExists = await git(root, "rev-parse", "--verify", "--quiet", branch).then(() => true, () => false);
35
+ await git(root, "worktree", "add", ...(branchExists ? [directory, branch] : ["-b", branch, directory, base]));
36
+ const dirty = await git(root, "status", "--porcelain").catch(() => "");
33
37
  const warning = dirty
34
- ? "The project folder has uncommitted changes; the new agent's workspace does not include them. Commit first if the agent needs them."
38
+ ? `The ${repo ? `"${repo}" repository` : "project folder"} has uncommitted changes; the new agent's workspace does not include them. Commit first if the agent needs them.`
35
39
  : undefined;
36
40
  return { directory, branch, base, warning };
37
41
  }
@@ -66,19 +70,21 @@ export async function mergeWorkspace(project, agent) {
66
70
  }
67
71
  if (committed.length === 0)
68
72
  return { ok: false, reason: `${agent.name} has no committed changes to merge.` };
69
- const mainDirty = await git(project.directory, "status", "--porcelain").catch(() => "");
73
+ const root = repoRoot(project, agent);
74
+ const where = agent.repo ? `The "${agent.repo}" repository` : "The project folder";
75
+ const mainDirty = await git(root, "status", "--porcelain").catch(() => "");
70
76
  if (mainDirty) {
71
- return { ok: false, reason: "The project folder has uncommitted changes. Commit or stash them before merging." };
77
+ return { ok: false, reason: `${where} has uncommitted changes. Commit or stash them before merging.` };
72
78
  }
73
79
  try {
74
- await git(project.directory, "merge", "--no-ff", "--no-edit", "-m", `Merge work from ${agent.name} (Symbio)`, agent.branch);
80
+ await git(root, "merge", "--no-ff", "--no-edit", "-m", `Merge work from ${agent.name} (Symbio)`, agent.branch);
75
81
  }
76
82
  catch (err) {
77
- const conflicts = (await git(project.directory, "diff", "--name-only", "--diff-filter=U").catch(() => ""))
83
+ const conflicts = (await git(root, "diff", "--name-only", "--diff-filter=U").catch(() => ""))
78
84
  .split("\n")
79
85
  .filter(Boolean);
80
- await git(project.directory, "merge", "--abort").catch(() => { });
81
- const main = await git(project.directory, "rev-parse", "--abbrev-ref", "HEAD").catch(() => "the main branch");
86
+ await git(root, "merge", "--abort").catch(() => { });
87
+ const main = await git(root, "rev-parse", "--abbrev-ref", "HEAD").catch(() => "the main branch");
82
88
  return {
83
89
  ok: false,
84
90
  reason: conflicts.length
@@ -95,7 +101,7 @@ export async function mergeWorkspace(project, agent) {
95
101
  export async function syncWorkspace(project, agent) {
96
102
  if (!agent.branch)
97
103
  return null;
98
- const head = await git(project.directory, "rev-parse", "HEAD");
104
+ const head = await git(repoRoot(project, agent), "rev-parse", "HEAD");
99
105
  await git(agent.directory, "merge", "--ff-only", head).catch(() => { });
100
106
  return head;
101
107
  }
@@ -108,11 +114,12 @@ export async function restoreWorkspace(project, agent) {
108
114
  if (!agent.branch || existsSync(agent.directory)) {
109
115
  return { directory: agent.directory, branch: agent.branch ?? null, base: agent.base ?? null, reset: false };
110
116
  }
111
- const base = await git(project.directory, "rev-parse", "HEAD");
112
- await git(project.directory, "worktree", "prune").catch(() => { });
113
- await git(project.directory, "branch", "-f", agent.branch, base);
117
+ const root = repoRoot(project, agent);
118
+ const base = await git(root, "rev-parse", "HEAD");
119
+ await git(root, "worktree", "prune").catch(() => { });
120
+ await git(root, "branch", "-f", agent.branch, base);
114
121
  await fs.mkdir(path.dirname(agent.directory), { recursive: true });
115
- await git(project.directory, "worktree", "add", agent.directory, agent.branch);
122
+ await git(root, "worktree", "add", agent.directory, agent.branch);
116
123
  return { directory: agent.directory, branch: agent.branch, base, reset: true };
117
124
  }
118
125
  /**
@@ -121,18 +128,19 @@ export async function restoreWorkspace(project, agent) {
121
128
  * moved. Returns false when there was nothing to do.
122
129
  */
123
130
  export async function reattachWorkspace(project, agent) {
124
- if (!agent.branch || existsSync(agent.directory) || !(await isGitRepo(project.directory)))
131
+ const root = repoRoot(project, agent);
132
+ if (!agent.branch || existsSync(agent.directory) || !(await isGitRepo(root)))
125
133
  return false;
126
- await git(project.directory, "worktree", "prune").catch(() => { });
127
- const branchExists = await git(project.directory, "rev-parse", "--verify", "--quiet", agent.branch).then(() => true, () => false);
134
+ await git(root, "worktree", "prune").catch(() => { });
135
+ const branchExists = await git(root, "rev-parse", "--verify", "--quiet", agent.branch).then(() => true, () => false);
128
136
  await fs.mkdir(path.dirname(agent.directory), { recursive: true });
129
- await git(project.directory, "worktree", "add", ...(branchExists ? [agent.directory, agent.branch] : ["-b", agent.branch, agent.directory, "HEAD"]));
137
+ await git(root, "worktree", "add", ...(branchExists ? [agent.directory, agent.branch] : ["-b", agent.branch, agent.directory, "HEAD"]));
130
138
  return true;
131
139
  }
132
140
  export async function removeWorkspace(project, agent) {
133
141
  if (!agent.branch)
134
142
  return;
135
- await git(project.directory, "worktree", "remove", "--force", agent.directory).catch(() => { });
143
+ await git(repoRoot(project, agent), "worktree", "remove", "--force", agent.directory).catch(() => { });
136
144
  }
137
145
  /**
138
146
  * Takes a helper out of its own worktree so it can work in the project folder. Refuses while
@@ -148,9 +156,10 @@ export async function leaveWorkspace(project, agent) {
148
156
  throw new Error(`${agent.name}'s own folder has work that isn't in the project yet (${files.slice(0, 8).join(", ")}${files.length > 8 ? ", …" : ""}). ` +
149
157
  "Merge it (or discard it) first.");
150
158
  }
151
- await git(project.directory, "worktree", "remove", "--force", agent.directory).catch(() => { });
152
- await git(project.directory, "worktree", "prune").catch(() => { });
153
- await git(project.directory, "branch", "-d", agent.branch).catch(() => { });
159
+ const root = repoRoot(project, agent);
160
+ await git(root, "worktree", "remove", "--force", agent.directory).catch(() => { });
161
+ await git(root, "worktree", "prune").catch(() => { });
162
+ await git(root, "branch", "-d", agent.branch).catch(() => { });
154
163
  }
155
164
  /**
156
165
  * Deletes helper folders left behind by projects that no longer exist (removing a project
@@ -1 +1 @@
1
- @font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2)format("woff2-variations");unicode-range:U+1F??}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-wght-normal-CkhJZR-_.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--bg:#0b0c0e;--bg-sunken:#08090a;--panel:#101114;--surface:#15161a;--surface-2:#1b1c21;--surface-hover:#202127;--border:#23252b;--border-strong:#30323a;--text:#ededef;--text-2:#a0a1ab;--text-3:#6c6d78;--accent:#6d6af5;--accent-hover:#7e7bf7;--accent-soft:#6d6af524;--accent-text:#aaa8ff;--green:#3fb27f;--green-soft:#3fb27f24;--amber:#d4a03a;--amber-soft:#d4a03a24;--red:#e5534b;--red-soft:#e5534b24;--blue:#4c8df6;--blue-soft:#4c8df624;--r-sm:4px;--r:6px;--r-lg:10px;--shadow-pop:0 12px 32px #00000073, 0 0 0 1px var(--border-strong);--font:"Inter Variable", Inter, "Segoe UI", system-ui, sans-serif;--mono:"JetBrains Mono", "Cascadia Code", Consolas, ui-monospace, monospace;font-family:var(--font);color:var(--text);background:var(--bg);--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;font-feature-settings:"cv11", "ss01";-webkit-font-smoothing:antialiased;font-size:13px;line-height:1.5}*{box-sizing:border-box}body{margin:0}a{color:inherit;text-decoration:none}h1,h2,h3{letter-spacing:-.015em;margin:0;font-weight:600}h1{font-size:20px}h2{font-size:15px}h3{font-size:13px}p{margin:0}code,pre,.mono{font-family:var(--mono);font-size:12px}:focus-visible{outline:2px solid var(--accent);outline-offset:1px}::selection{background:var(--accent-soft)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#2a2c33 padding-box content-box;border:3px solid #0000;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:#3a3c45 padding-box content-box;border:3px solid #0000}.muted{color:var(--text-2)}.subtle{color:var(--text-3)}.small{font-size:12px}.tnum{font-variant-numeric:tabular-nums}.grow{flex:1;min-width:0}.row{align-items:center;gap:8px;display:flex}.stack{flex-direction:column;gap:8px;display:flex}.spacer{flex:1}.center{text-align:center}.ellipsis{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.error{color:var(--red);background:var(--red-soft);border-radius:var(--r);border:1px solid #e5534b4d;padding:8px 12px;font-size:13px}.notice{color:var(--amber);background:var(--amber-soft);border-radius:var(--r);border:1px solid #d4a03a4d;padding:8px 12px;font-size:13px}.btn{border-radius:var(--r);border:1px solid var(--border-strong);background:var(--surface-2);height:30px;color:var(--text);font:inherit;cursor:pointer;white-space:nowrap;justify-content:center;align-items:center;gap:6px;padding:0 12px;font-size:13px;font-weight:500;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.btn:hover:not(:disabled){background:var(--surface-hover);border-color:#3a3d46}.btn:disabled{opacity:.45;cursor:not-allowed}.btn svg{flex:none}.btn.primary{background:var(--accent);color:#fff;border-color:#0000}.btn.primary:hover:not(:disabled){background:var(--accent-hover)}.btn.ghost{color:var(--text-2);background:0 0;border-color:#0000}.btn.ghost:hover:not(:disabled){background:var(--surface-2);color:var(--text)}.btn.danger{color:var(--red);background:0 0;border-color:#e5534b59}.btn.danger:hover:not(:disabled){background:var(--red-soft)}.btn.danger-solid{color:#fff;background:#c4392f;border-color:#0000}.btn.danger-solid:hover:not(:disabled){background:#d6453b}.btn.sm{height:26px;padding:0 9px;font-size:12px}.btn.icon{width:30px;padding:0}.btn.icon.sm{width:26px}.btn.icon.xs{width:20px;height:20px;color:var(--text-3)}.btn.icon.xs:hover{color:var(--text)}.title-input{max-width:260px;height:24px;padding:0 6px;font-weight:600}.btn.block{width:100%}.link{color:var(--accent-text);font:inherit;cursor:pointer;background:0 0;border:none;padding:0}.link:hover{text-decoration:underline}input,textarea,select{background:var(--bg-sunken);border:1px solid var(--border-strong);color:var(--text);border-radius:var(--r);font:inherit;outline:none;padding:7px 10px;font-size:13px;transition:border-color .12s,box-shadow .12s}input::placeholder,textarea::placeholder{color:var(--text-3)}input:focus,textarea:focus,select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}textarea{resize:vertical;line-height:1.5}input[type=checkbox],input[type=radio]{accent-color:var(--accent);margin:0}.field{flex-direction:column;gap:6px;display:flex}.field>span{color:var(--text-2);font-size:12px;font-weight:500}.field .hint{color:var(--text-3);font-size:12px}.field>.input-row{font-size:inherit;font-weight:inherit;gap:8px;display:flex}.input-row>input{flex:1;min-width:0}.input-row>.btn{flex-shrink:0}.field>.seg{align-self:flex-start}.field-row{gap:12px;display:flex}.field-row>.field{flex:1}.check{color:var(--text-2);cursor:pointer;align-items:center;gap:6px;font-size:12px;display:inline-flex}.seg{background:var(--bg-sunken);border:1px solid var(--border-strong);border-radius:var(--r);gap:2px;padding:2px;display:inline-flex}.seg button{border-radius:var(--r-sm);height:24px;color:var(--text-2);font:inherit;cursor:pointer;background:0 0;border:none;padding:0 10px;font-size:12px;font-weight:500}.seg button:hover{color:var(--text)}.seg button.on{background:var(--surface-hover);color:var(--text);box-shadow:0 0 0 1px var(--border-strong)}.choice{border:1px solid var(--border-strong);border-radius:var(--r);cursor:pointer;align-items:flex-start;gap:10px;padding:10px 12px;transition:border-color .12s,background .12s;display:flex}.choice:hover{border-color:#3a3d46}.choice:has(input:checked){background:var(--accent-soft);border-color:#6d6af599}.choice input{margin-top:3px}.choice-body{flex-direction:column;gap:2px;display:flex}.choice-title{align-items:center;gap:6px;font-weight:500;display:flex}.choice-desc{color:var(--text-2);font-size:12px}.tag{border-radius:var(--r-sm);height:20px;color:var(--text-2);background:var(--surface-2);border:1px solid var(--border);white-space:nowrap;align-items:center;gap:4px;padding:0 7px;font-size:11px;font-weight:500;display:inline-flex}.tag svg{width:11px;height:11px}.tag.accent{color:var(--accent-text);background:var(--accent-soft);border-color:#0000}.tag.green{color:var(--green);background:var(--green-soft);border-color:#0000}.tag.amber{color:var(--amber);background:var(--amber-soft);border-color:#0000}.tag.red{color:var(--red);background:var(--red-soft);border-color:#0000}.tag.blue{color:var(--blue);background:var(--blue-soft);border-color:#0000}.dot{background:var(--text-3);border-radius:50%;flex:none;width:7px;height:7px;display:inline-block;position:relative}.dot.idle{background:var(--text-3)}.dot.busy{background:var(--green)}.dot.busy:after{content:"";border:1.5px solid var(--green);opacity:0;border-radius:50%;animation:1.8s ease-out infinite ping;position:absolute;inset:-3px}.dot.waiting{background:var(--amber)}.dot.stuck,.dot.error{background:var(--red)}.dot.stopped{border:1.5px solid var(--text-3);background:0 0}@keyframes ping{0%{opacity:.8;transform:scale(.6)}to{opacity:0;transform:scale(1.9)}}.avatar{color:#fff;text-transform:uppercase;letter-spacing:0;border-radius:6px;flex:none;justify-content:center;align-items:center;width:24px;height:24px;font-size:11px;font-weight:600;display:inline-flex;position:relative}.avatar.sm{border-radius:4px;width:18px;height:18px;font-size:9px}.avatar.lg{border-radius:8px;width:30px;height:30px;font-size:13px}.avatar .dot{width:9px;height:9px;box-shadow:0 0 0 2px var(--panel);position:absolute;bottom:-3px;right:-3px}.avatar.human,.avatar.system{background:var(--surface-hover);color:var(--text-2)}.kbd{font-family:var(--mono);border-radius:var(--r-sm);border:1px solid var(--border-strong);color:var(--text-2);padding:1px 5px;font-size:11px}.app{flex-direction:column;height:100vh;display:flex}.topbar{border-bottom:1px solid var(--border);background:var(--panel);flex:none;align-items:center;gap:12px;height:48px;padding:0 14px 0 16px;display:flex}.remote-banner{background:var(--amber-soft);color:var(--amber);border-bottom:1px solid #d4a03a59;flex:none;align-items:center;gap:10px;padding:7px 14px 7px 16px;font-size:13px;display:flex}.remote-banner a{color:inherit;text-decoration:underline}.remote-banner .spacer{flex:1}.remote-code{letter-spacing:.08em;font-family:ui-monospace,monospace;font-weight:600}.remote-code.big{color:var(--text);font-size:22px}.brand{letter-spacing:-.01em;align-items:center;gap:9px;font-size:14px;font-weight:600;display:flex}.brand-logo{flex:none;width:22px;height:22px}.crumbs{color:var(--text-3);align-items:center;gap:6px;min-width:0;font-size:13px;display:flex}.crumbs a{color:var(--text-2)}.crumbs a:hover{color:var(--text)}.crumbs .current{color:var(--text);font-weight:500}.topbar-actions{align-items:center;gap:6px;margin-left:auto;display:flex}.runtime{border:1px solid var(--border);height:26px;color:var(--text-2);border-radius:999px;align-items:center;gap:7px;padding:0 10px;font-size:12px;display:inline-flex}.runtime .dot.running{background:var(--green)}.runtime .dot.starting{background:var(--amber)}.runtime .dot.crashed,.runtime .dot.stopped{background:var(--red)}.page{flex:1;min-height:0;overflow:auto}.page-inner{flex-direction:column;gap:24px;max-width:1040px;margin:0 auto;padding:32px 32px 64px;display:flex}.page-head{justify-content:space-between;align-items:flex-end;gap:16px;display:flex}.page-head p{color:var(--text-2);margin-top:4px}.page-title{align-items:center;gap:10px;display:flex}.page-title svg{color:var(--text-2)}.back{color:var(--text-2);cursor:pointer;font-size:13px;font:inherit;background:0 0;border:none;align-items:center;gap:6px;margin-bottom:14px;padding:0;display:inline-flex}.back:hover{color:var(--text)}.section{background:var(--panel);border:1px solid var(--border);border-radius:var(--r-lg)}.section-head{border-bottom:1px solid var(--border);justify-content:space-between;align-items:flex-start;gap:16px;padding:16px 18px;display:flex}.section-head p{color:var(--text-2);max-width:640px;margin-top:3px;font-size:12px}.section-body{padding:8px}.section-empty{text-align:center;color:var(--text-3);padding:28px 18px;font-size:13px}.list-row{border-radius:var(--r);align-items:center;gap:12px;padding:10px 12px;display:flex}.list-row:hover{background:var(--surface)}.list-row+.list-row{border-top:1px solid var(--border);border-radius:0}.list-row:hover+.list-row{border-top-color:#0000}.list-title{font-weight:500}.list-sub{color:var(--text-2);font-size:12px}.project-list{border:1px solid var(--border);border-radius:var(--r-lg);background:var(--panel);flex-direction:column;display:flex;overflow:visible}.project-row{color:inherit;grid-template-columns:minmax(0,1fr) auto auto auto;align-items:center;gap:20px;padding:14px 16px;transition:background .12s;display:grid}.project-row:first-child{border-radius:var(--r-lg) var(--r-lg) 0 0}.project-row:last-child{border-radius:0 0 var(--r-lg) var(--r-lg)}.project-row:only-child{border-radius:var(--r-lg)}.project-row+.project-row{border-top:1px solid var(--border)}.project-row:hover{background:var(--surface)}.project-name{align-items:center;gap:8px;font-size:14px;font-weight:600;display:flex}.project-dir{color:var(--text-3);font-size:12px;font-family:var(--mono);margin-top:2px}.avatar-stack{gap:3px;display:flex}.project-meta{color:var(--text-2);align-items:center;gap:6px;min-width:120px;font-size:12px;display:flex}.progress-mini{background:var(--surface-hover);border-radius:4px;width:70px;height:4px;overflow:hidden}.progress-mini>div{background:var(--green);border-radius:4px;height:100%}.empty{text-align:center;color:var(--text-2);flex-direction:column;align-items:center;gap:10px;padding:56px 20px;display:flex}.empty-icon{background:var(--surface);border:1px solid var(--border);width:44px;height:44px;color:var(--text-2);border-radius:12px;justify-content:center;align-items:center;margin-bottom:4px;display:flex}.empty h3{color:var(--text);font-size:14px}.locked{justify-content:center;align-items:center;max-width:460px;min-height:100vh;margin:0 auto;display:flex}.empty p{max-width:380px;font-size:13px}.backdrop{z-index:60;background:#0000008c;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.dialog{background:var(--panel);border:1px solid var(--border-strong);border-radius:12px;flex-direction:column;width:min(560px,100%);max-height:calc(100vh - 48px);display:flex;box-shadow:0 24px 64px #0000008c}.dialog.wide{width:min(880px,100%)}.dialog-head{align-items:center;gap:10px;padding:16px 18px 12px;display:flex}.dialog-head h2{flex:1}.dialog-sub{color:var(--text-2);margin-top:-6px;margin-bottom:8px;padding:0 18px;font-size:12px}.dialog-body{flex-direction:column;gap:14px;padding:8px 18px 16px;display:flex;overflow:auto}.dialog-foot{border-top:1px solid var(--border);justify-content:flex-end;align-items:center;gap:8px;padding:12px 18px;display:flex}.steps{color:var(--text-3);align-items:center;gap:6px;padding:0 18px 10px;font-size:12px;display:flex}.steps .step{align-items:center;gap:6px;display:flex}.steps .step-num{border:1px solid var(--border-strong);border-radius:50%;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;display:inline-flex}.steps .step.on{color:var(--text)}.steps .step.on .step-num{background:var(--accent);border-color:var(--accent);color:#fff}.steps .step.done .step-num{background:var(--surface-hover);color:var(--text-2)}.steps .sep{background:var(--border-strong);width:18px;height:1px}.drawer-backdrop{z-index:50;background:#0006;justify-content:flex-end;display:flex;position:fixed;inset:0}.drawer{background:var(--panel);border-left:1px solid var(--border-strong);flex-direction:column;width:440px;max-width:94vw;height:100%;display:flex;box-shadow:-24px 0 48px #0006}.drawer-head{border-bottom:1px solid var(--border);align-items:center;gap:10px;padding:14px 16px;display:flex}.drawer-head h2{flex:1}.drawer-body{flex-direction:column;flex:1;gap:12px;padding:14px 16px;display:flex;overflow:auto}.menu{flex:none;position:relative}.menu-list{z-index:40;background:var(--surface);min-width:200px;box-shadow:var(--shadow-pop);border-radius:8px;flex-direction:column;padding:4px;display:flex;position:absolute;top:calc(100% + 4px);right:0}.menu-list button{text-align:left;color:var(--text);font:inherit;border-radius:var(--r-sm);cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;padding:7px 9px;font-size:13px;display:flex}.menu-list button:hover{background:var(--surface-hover)}.menu-list button.danger{color:var(--red)}.menu-list svg{color:var(--text-2)}.menu-list button.danger svg{color:var(--red)}.project-view{grid-template-columns:248px minmax(0,1fr);height:100%;display:grid}.side{border-right:1px solid var(--border);background:var(--panel);flex-direction:column;min-height:0;display:flex}.side-scroll{flex-direction:column;flex:1;gap:18px;padding:10px 8px;display:flex;overflow:auto}.side-group-title{color:var(--text-3);letter-spacing:.02em;justify-content:space-between;align-items:center;padding:0 8px 6px;font-size:11px;font-weight:600;display:flex}.side-foot{border-top:1px solid var(--border);flex-direction:column;gap:8px;padding:10px 12px;display:flex}.usage-line{color:var(--text-2);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:6px;padding:2px 0;font-family:inherit;font-size:12px;display:flex}.usage-line:hover{color:var(--text)}.usage-line svg{color:var(--text-3)}.usage-total{white-space:nowrap;flex-direction:column;flex:none;align-items:flex-end;gap:2px;display:flex}.usage-total strong{font-size:18px}.usage-table{border-collapse:collapse;width:100%;font-size:12px}.usage-table th{text-align:left;color:var(--text-3);border-bottom:1px solid var(--border);white-space:nowrap;padding:6px 8px;font-weight:500}.usage-table td{border-bottom:1px solid var(--border);white-space:nowrap;padding:6px 8px}.usage-table .num{text-align:right}.usage-table tfoot td{border-bottom:none;font-weight:600}.usage-table tr.muted td{color:var(--text-3)}.price-row{flex-wrap:wrap;gap:8px}.price-row>.btn{justify-content:center;min-width:64px}.price-row .list-sub.warn{color:var(--amber)}.price-field{color:var(--text-3);flex-direction:column;gap:2px;font-size:11px;display:flex}.price-field input{width:84px;height:28px;padding:0 6px;font-size:12px}.agent-row{border-radius:var(--r);width:100%;color:var(--text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;padding:6px 8px;display:flex}.agent-row:hover{background:var(--surface)}.agent-row.active{background:var(--surface-2)}.agent-row .avatar .dot{box-shadow:0 0 0 2px var(--panel)}.agent-row:hover .avatar .dot,.agent-row.active .avatar .dot{box-shadow:0 0 0 2px var(--surface-2)}.agent-name{align-items:center;gap:6px;font-weight:500;display:flex}.agent-sub{color:var(--text-3);font-size:12px}.agent-sub.working{color:var(--green)}.agent-sub.waiting{color:var(--amber)}.agent-sub.problem{color:var(--red)}.stopped-toggle{color:var(--text-3);cursor:pointer;font-size:12px;font:inherit;background:0 0;border:none;align-items:center;gap:6px;padding:4px 8px;display:flex}.stopped-toggle:hover{color:var(--text-2)}.asset-row{border-radius:var(--r);align-items:center;gap:8px;padding:5px 8px;font-size:12px;display:flex}.asset-row:hover{background:var(--surface)}.asset-row svg{color:var(--text-3);flex:none}.asset-row.held svg{color:var(--amber)}.asset-name{color:var(--text);font-size:12px;font-weight:500}.asset-sub{color:var(--text-3);font-size:11px}.main{flex-direction:column;min-width:0;min-height:0;display:flex}.main-head{border-bottom:1px solid var(--border);flex:none;align-items:center;gap:4px;height:46px;padding:0 12px 0 8px;display:flex}.tabs{align-items:center;gap:2px;height:100%;display:flex}.tab{height:100%;color:var(--text-2);font:inherit;cursor:pointer;background:0 0;border:none;align-items:center;gap:7px;padding:0 10px;font-weight:500;display:inline-flex;position:relative}.tab:hover,.tab.active{color:var(--text)}.tab svg{color:var(--text-3)}.tab.active svg{color:var(--text-2)}.tab-underline{background:var(--text);border-radius:2px;height:2px;position:absolute;bottom:-1px;left:8px;right:8px}.tab .count{color:var(--text-3);font-variant-numeric:tabular-nums;font-size:11px}.tab-alert{background:var(--amber);color:#1a1405;border-radius:9px;align-items:center;gap:5px;height:18px;padding:0 7px;font-size:11px;font-weight:600;display:inline-flex}.tab-alert-dot{background:#1a1405;border-radius:50%;width:6px;height:6px;position:relative}.tab-alert-dot:after{content:"";background:#1a1405;border-radius:50%;animation:1.6s ease-out infinite ping;position:absolute;inset:0}.main-actions{align-items:center;gap:6px;margin-left:auto;display:flex}.needs-you{background:var(--amber-soft);height:28px;color:var(--amber);font:inherit;cursor:pointer;border:1px solid #d4a03a66;border-radius:999px;align-items:center;gap:7px;padding:0 10px;font-size:12px;font-weight:600;display:inline-flex}.needs-you:hover{background:#d4a03a38}.needs-you .count{background:var(--amber);color:#1a1405;border-radius:9px;justify-content:center;align-items:center;min-width:18px;height:18px;padding:0 5px;font-size:11px;display:inline-flex}.main-body{flex-direction:column;flex:1;min-height:0;display:flex}.banner{border-bottom:1px solid var(--border);flex:none;align-items:center;gap:12px;padding:9px 16px;font-size:13px;display:flex}.banner svg{flex:none}.banner.red{background:var(--red-soft);color:var(--text)}.banner.red svg{color:var(--red)}.banner.blue{background:var(--blue-soft)}.banner.blue svg{color:var(--blue)}.banner .muted{font-size:12px}.inbox-item{border:1px solid var(--border-strong);border-radius:var(--r-lg);background:var(--surface);flex-direction:column;gap:10px;padding:12px;display:flex}.inbox-item-head{align-items:center;gap:8px;font-size:13px;display:flex}.inbox-item-head .when{color:var(--text-3);margin-left:auto;font-size:11px}.inbox-kind{color:var(--text-3);text-transform:uppercase;letter-spacing:.04em;font-size:11px;font-weight:600}.command{background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--r);font-family:var(--mono);white-space:pre-wrap;word-break:break-word;max-height:180px;margin:0;padding:8px 10px;font-size:12px;overflow:auto}.inbox-reason{color:var(--text-2);font-size:12px}.inbox-actions{flex-wrap:wrap;gap:6px;display:flex}.inbox-empty{text-align:center;color:var(--text-3);padding:40px 10px}.session-note{border:1px dashed var(--border-strong);border-radius:var(--r);max-width:760px;color:var(--text-2);justify-content:space-between;align-items:center;gap:12px;margin:0 auto;padding:12px 14px;font-size:13px;display:flex}.chat{flex-direction:column;height:100%;min-height:0;display:flex}.chat-head{border-bottom:1px solid var(--border);align-items:center;gap:10px;padding:10px 20px;display:flex}.chat-head .title{font-weight:600}.chat-head .sub{color:var(--text-3);font-size:12px}.inline-select{field-sizing:content;border-radius:var(--r-sm);width:auto;height:auto;color:inherit;font:inherit;cursor:pointer;background:0 0;border:none;padding:0 2px}.inline-select:hover{color:var(--text);background:var(--surface-hover)}.inline-select:focus{box-shadow:none}.inline-select option{background:var(--panel);color:var(--text)}.chat-scroll{flex:1;padding:24px 24px 12px;overflow:auto}.chat-col{flex-direction:column;gap:18px;max-width:760px;margin:0 auto;display:flex}.chat-col>.load-older{align-self:center}.list-compact{flex-direction:column;gap:4px;display:flex}.msg-user{background:var(--surface-2);border:1px solid var(--border);white-space:pre-wrap;border-radius:12px 12px 4px;align-self:flex-end;max-width:82%;padding:9px 13px;font-size:14px;line-height:1.55}.msg-assistant{flex-direction:column;gap:8px;font-size:14px;line-height:1.65;display:flex}.msg-note{color:var(--text-3);text-align:center;justify-content:center;font-size:12px;line-height:1.5;display:flex}.msg-note>span{background:var(--panel);border:1px solid var(--border);border-radius:999px;max-width:88%;padding:4px 10px}.msg-agent{border:1px solid var(--border);border-radius:var(--r-lg);background:var(--panel);overflow:hidden}.msg-agent-head{border-bottom:1px solid var(--border);align-items:center;gap:8px;padding:8px 12px;font-size:12px;display:flex}.msg-agent-head strong{font-weight:600}.msg-agent-body{padding:10px 12px;font-size:13.5px}.msg-failure{color:var(--red);background:var(--red-soft);border-radius:var(--r);align-items:flex-start;gap:8px;padding:8px 12px;font-size:13px;display:flex}.msg-failure svg{flex:none;margin-top:2px}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md p{margin:0 0 10px}.md h1,.md h2,.md h3{margin:18px 0 8px}.md h1{font-size:18px}.md h2{font-size:16px}.md h3{font-size:14px}.md code{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--r-sm);padding:0 4px;font-size:.86em}.md pre{background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--r);padding:12px;overflow:auto}.md pre code{background:0 0;border:none;padding:0}.md ul,.md ol{margin:0 0 10px;padding-left:22px}.md li{margin:2px 0}.md table{border-collapse:collapse;margin:0 0 10px}.md th,.md td{border:1px solid var(--border-strong);padding:5px 9px}.md a{color:var(--accent-text)}.md blockquote{border-left:2px solid var(--border-strong);color:var(--text-2);margin:0 0 10px;padding-left:12px}.reasoning{color:var(--text-3);font-size:13px}.reasoning summary{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;list-style:none;display:inline-flex}.reasoning summary::-webkit-details-marker{display:none}.reasoning summary:hover{color:var(--text-2)}.reasoning-body{white-space:pre-wrap;border-left:2px solid var(--border-strong);margin-top:6px;padding:4px 0 4px 12px}.tool{border:1px solid var(--border);border-radius:var(--r);background:var(--panel);font-size:12px}.tool summary{cursor:pointer;color:var(--text-2);align-items:center;gap:8px;padding:6px 10px;list-style:none;display:flex}.tool summary::-webkit-details-marker{display:none}.tool summary:hover{color:var(--text)}.tool-name{color:var(--text);font-weight:500}.tool-arg{font-family:var(--mono);color:var(--text-3);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.tool-state{flex:none;display:inline-flex}.tool-state.done{color:var(--green)}.tool-state.failed{color:var(--red)}.tool-io{border-top:1px solid var(--border);max-height:260px;font-family:var(--mono);white-space:pre-wrap;color:var(--text-2);margin:0;padding:10px;font-size:12px;overflow:auto}.tool-io.out{background:var(--bg-sunken)}.spin{animation:.9s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.thinking{color:var(--text-3);align-items:center;gap:8px;font-size:13px;display:flex}.thinking.retrying{color:var(--amber)}.typing{gap:3px;display:inline-flex}.typing i{background:currentColor;border-radius:50%;width:5px;height:5px;animation:1.2s ease-in-out infinite typing}.typing i:nth-child(2){animation-delay:.15s}.typing i:nth-child(3){animation-delay:.3s}@keyframes typing{0%,80%,to{opacity:.3;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}.chat-empty{text-align:center;color:var(--text-2);padding:56px 20px}.chat-empty h2{color:var(--text);margin-bottom:6px;font-size:18px}.composer-wrap{padding:8px 24px 18px}.composer{border:1px solid var(--border-strong);background:var(--surface);border-radius:12px;max-width:760px;margin:0 auto;transition:border-color .12s,box-shadow .12s}.composer:focus-within{border-color:#44465a;box-shadow:0 0 0 3px #6d6af514}.composer textarea{resize:none;width:100%;box-shadow:none;background:0 0;border:none;padding:12px 14px 4px;font-size:14px}.composer textarea:focus{box-shadow:none}.composer-bar{align-items:center;gap:8px;padding:6px 8px 8px 14px;display:flex}.composer-hint{color:var(--text-3);font-size:11px}.form-card{border-radius:var(--r-lg);background:var(--panel);border:1px solid #d4a03a73;overflow:hidden}.form-card-head{border-bottom:1px solid var(--border);background:var(--amber-soft);align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:600;display:flex}.form-card-head svg{color:var(--amber)}.form-card-body{flex-direction:column;gap:14px;padding:12px 14px;display:flex}.form-field-title{margin-bottom:8px;font-size:13px;font-weight:500}.form-options{flex-direction:column;gap:6px;display:flex}.form-option{text-align:left;background:var(--surface);border:1px solid var(--border-strong);color:var(--text);font:inherit;border-radius:var(--r);cursor:pointer;flex-direction:column;gap:2px;padding:9px 12px;display:flex}.form-option:hover{border-color:#3a3d46}.form-option.on{border-color:var(--accent);background:var(--accent-soft)}.form-option:disabled{opacity:.45;cursor:not-allowed}.form-field-desc{color:var(--text-2);margin:-4px 0 8px;font-size:13px}.form-option span{color:var(--text-2);font-size:12px}.kanban{flex-direction:column;height:100%;min-height:0;display:flex}.kanban-head{border-bottom:1px solid var(--border);align-items:center;gap:16px;padding:14px 20px;display:flex}.kanban-goal{flex:1;min-width:0}.kanban-goal-text{font-size:14px;font-weight:500}.kanban-goal-meta{color:var(--text-3);align-items:center;gap:8px;margin-top:4px;font-size:12px;display:flex}.progress{color:var(--text-2);flex:none;align-items:center;gap:10px;font-size:12px;display:flex}.progress-track{background:var(--surface-hover);border-radius:6px;width:160px;height:6px;overflow:hidden}.progress-fill{background:var(--green);border-radius:6px;height:100%}.plan-banner{border:1px solid var(--border-strong);border-radius:var(--r-lg);background:var(--surface);flex-direction:column;gap:10px;margin:12px 20px 0;padding:12px 14px;display:flex}.plan-banner-row{align-items:center;gap:10px;display:flex}.plan-banner-row textarea{flex:1}.columns{flex:1;grid-template-columns:repeat(5,minmax(190px,1fr));gap:10px;min-height:0;padding:14px 20px 16px;display:grid;overflow-x:auto}.column{border-radius:var(--r-lg);background:var(--panel);border:1px solid var(--border);flex-direction:column;min-height:0;display:flex}.column-head{color:var(--text-2);align-items:center;gap:8px;padding:10px 12px;font-size:12px;font-weight:600;display:flex}.column-head svg{color:var(--text-3)}.col-in-progress .column-head svg{color:var(--green)}.col-blocked .column-head svg{color:var(--red)}.col-review .column-head svg{color:var(--amber)}.col-done .column-head svg{color:var(--accent-text)}.column-count{color:var(--text-3);font-variant-numeric:tabular-nums;margin-left:auto;font-size:11px}.column-body{flex-direction:column;flex:1;gap:6px;padding:0 8px 8px;display:flex;overflow-y:auto}.column-empty{text-align:center;color:var(--text-3);padding:14px 6px;font-size:12px}.task-card{text-align:left;font:inherit;color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:var(--r);cursor:pointer;flex-direction:column;gap:7px;padding:10px;transition:border-color .12s,background .12s;display:flex}.task-card:hover{border-color:var(--border-strong);background:var(--surface-2)}.task-card.ts-done .task-title{color:var(--text-2)}.task-top{color:var(--text-3);align-items:center;gap:6px;font-size:11px;display:flex}.task-id{font-family:var(--mono);color:var(--text-3);font-size:11px}.task-title{font-size:13px;font-weight:500;line-height:1.4}.task-meta{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.task-bottom{color:var(--text-2);align-items:center;gap:6px;font-size:12px;display:flex}.task-bottom .subtle{align-items:center;gap:3px;margin-left:auto;font-size:11px;display:inline-flex}.task-detail-meta{grid-template-columns:110px 1fr;gap:6px 12px;font-size:12px;display:grid}.task-detail-meta dt{color:var(--text-3)}.task-detail-meta dd{flex-wrap:wrap;align-items:center;gap:6px;margin:0;display:flex}.history{flex-direction:column;gap:10px;display:flex}.history-item{gap:10px;font-size:12px;display:flex}.history-item .when{color:var(--text-3);font-variant-numeric:tabular-nums;flex:none;width:54px}.history-item .what{color:var(--text-2);white-space:pre-wrap}.history-item .what strong{color:var(--text);font-weight:500}.timeline{flex:1;overflow:auto}.timeline-inner{max-width:820px;margin:0 auto;padding:16px 24px 32px}.timeline-toolbar{border-bottom:1px solid var(--border);color:var(--text-2);align-items:center;gap:10px;padding:10px 24px;font-size:12px;display:flex}.event{border-bottom:1px solid var(--border);grid-template-columns:28px minmax(0,1fr);gap:10px;padding:10px 0;display:grid}.event:last-child{border-bottom:none}.event-head{color:var(--text-2);flex-wrap:wrap;align-items:center;gap:6px;font-size:12px;display:flex}.event-head strong{color:var(--text);font-weight:600}.event-head .when{color:var(--text-3);font-variant-numeric:tabular-nums;margin-left:auto}.event-body{margin-top:4px;font-size:13px}.event.quiet .event-body{color:var(--text-2);font-size:12px}.event.open{background:linear-gradient(90deg, var(--amber-soft), transparent 70%);border-radius:var(--r);margin-left:-8px;padding-left:8px}.reply{align-items:flex-end;gap:8px;margin-top:8px;display:flex}.reply textarea{resize:none;flex:1}.docs{grid-template-columns:280px minmax(0,1fr);height:100%;min-height:0;display:grid}.docs-list{border-right:1px solid var(--border);flex-direction:column;gap:1px;padding:10px 8px;display:flex;overflow:auto}.docs-tree-folder{flex-direction:column;gap:1px;display:flex}.docs-search{background:var(--surface);border:1px solid var(--border);border-radius:var(--r);color:var(--text-3);flex:none;align-items:center;gap:6px;margin-bottom:8px;padding:0 4px 0 9px;display:flex}.docs-search:focus-within{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.docs-search input,.docs-search input:focus{box-shadow:none;background:0 0;border:none;border-radius:0}.docs-search input{min-width:0;color:var(--text);background:0 0;border:none;outline:none;flex:1;padding:7px 0;font-size:13px}.docs-folder{color:var(--text-2)}.docs-results{flex-direction:column;gap:10px;display:flex}.docs-result-file{flex-direction:column;gap:1px;display:flex}.docs-result-path{color:var(--text-2);align-items:center;gap:6px;padding:2px 8px;font-size:12px;display:flex}.docs-result-path svg{color:var(--text-3);flex:none}.docs-result-path .ellipsis{flex:1}.docs-result{text-align:left;font:inherit;border-radius:var(--r);cursor:pointer;color:var(--text-2);background:0 0;border:none;gap:8px;padding:5px 8px;font-size:12px;line-height:1.45;display:flex}.docs-result:hover{background:var(--surface);color:var(--text)}.docs-result-line{color:var(--text-3);font-family:var(--mono);text-align:right;flex:none;min-width:28px;padding-top:1px;font-size:11px}.docs-result-text{-webkit-line-clamp:3;word-break:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.docs-result mark{background:var(--accent-soft);color:var(--accent-text);border-radius:2px}.docs-result-more{color:var(--text-3);padding:2px 8px 0 44px;font-size:11px}.docs-page{align-items:flex-start;gap:40px;display:flex}.docs-page .md{flex:1;min-width:0}.docs-toc{flex-direction:column;flex:none;gap:1px;width:220px;max-height:calc(100vh - 200px);display:flex;position:sticky;top:0;overflow:auto}.docs-toc-title{text-transform:uppercase;letter-spacing:.04em;color:var(--text-3);padding:0 8px 6px;font-size:11px;font-weight:600}.docs-toc-item{text-align:left;font:inherit;color:var(--text-2);border-radius:var(--r-sm);cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;padding:3px 8px;font-size:12px;overflow:hidden}.docs-toc-item:hover{background:var(--surface);color:var(--text)}.docs-toc-item.level-1{color:var(--text);font-weight:500}.docs-toc-item.level-3{padding-left:20px}@media (width<=1280px){.docs-toc{display:none}}.md a.doc-path{text-decoration:none}.md a.doc-path code{color:var(--accent-text);border-color:var(--accent-soft)}.md a.doc-path:hover code{background:var(--accent-soft)}.docs-text{font-family:var(--mono);font-size:12.5px;line-height:1.6}.docs-text-line{border-radius:var(--r-sm);gap:14px;display:flex}.docs-text-no{color:var(--text-3);text-align:right;-webkit-user-select:none;user-select:none;flex:none;min-width:40px}.docs-text-content{white-space:pre-wrap;word-break:break-word}.docs-body .flash{animation:1.6s ease-out flash}@keyframes flash{0%,30%{background:var(--accent-soft)}to{background:0 0}}.docs-item{text-align:left;color:var(--text-2);font:inherit;border-radius:var(--r);cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;padding:6px 8px;font-size:13px;display:flex}.docs-item svg{color:var(--text-3);flex:none}.docs-item:hover{background:var(--surface);color:var(--text)}.docs-item.active{background:var(--surface-2);color:var(--text)}.docs-item .grow{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.docs-item-time{color:var(--text-3);flex:none;font-size:11px}.docs-view{flex-direction:column;min-width:0;min-height:0;display:flex}.docs-toolbar{border-bottom:1px solid var(--border);align-items:center;gap:8px;padding:8px 16px;display:flex}.docs-toolbar code{color:var(--text-2)}.docs-body{flex:1;padding:24px 32px 48px;overflow:auto}.docs-body .md{max-width:760px;font-size:14px;line-height:1.7}.docs-editor{resize:none;width:100%;height:100%;min-height:420px;font-family:var(--mono);font-size:13px;line-height:1.6}.settings-scroll{flex:1;overflow:auto}.settings-inner{flex-direction:column;gap:20px;max-width:780px;padding:24px 28px 64px;display:flex}.conn-icon{background:var(--surface-2);border:1px solid var(--border-strong);width:32px;height:32px;color:var(--text-2);border-radius:8px;flex:none;justify-content:center;align-items:center;display:inline-flex}.conn-icon.sm{border-radius:5px;width:22px;height:22px}.conn-test{align-items:center;gap:5px;margin-top:2px;font-size:12px;display:inline-flex}.conn-test.ok{color:var(--green)}.conn-test.bad{color:var(--red)}.pick-row{border:1px solid var(--border-strong);border-radius:var(--r);align-items:center;gap:10px;padding:8px 10px;display:flex}.pick-row+.pick-row{margin-top:6px}.pick-row.on{background:var(--accent-soft);border-color:#6d6af580}.pick-main{cursor:pointer;flex:1;align-items:center;gap:10px;min-width:0;display:flex}.danger-zone{border-color:#e5534b4d}.model-picker{border:1px solid var(--border-strong);border-radius:var(--r-lg);overflow:hidden}.model-picker-head{border-bottom:1px solid var(--border);background:var(--surface);align-items:center;gap:10px;padding:8px 10px;display:flex}.model-picker-head input{flex:1;height:28px;padding:4px 8px}.model-summary{border-bottom:1px solid var(--border);color:var(--text-2);flex-wrap:wrap;align-items:center;gap:6px;padding:8px 12px;font-size:12px;display:flex}.model-groups{max-height:300px;padding:4px;overflow:auto}.model-group-title{background:var(--panel);color:var(--text-3);z-index:1;padding:8px 8px 4px;font-size:11px;font-weight:600;position:sticky;top:0}.model-row{border-radius:var(--r-sm);cursor:pointer;align-items:center;gap:8px;padding:5px 8px;font-size:13px;display:flex}.model-row:hover{background:var(--surface)}.model-row.on{background:var(--accent-soft)}.model-row .check-box{border:1px solid var(--border-strong);color:#fff;border-radius:4px;flex:none;justify-content:center;align-items:center;width:15px;height:15px;display:inline-flex}.model-row.on .check-box{background:var(--accent);border-color:var(--accent)}.model-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lead-btn{color:var(--text-3);cursor:pointer;border-radius:var(--r-sm);background:0 0;border:none;padding:2px;display:inline-flex}.lead-btn:hover{color:var(--text);background:var(--surface-hover)}.lead-btn.on{color:var(--amber)}.folder-summary{border:1px solid var(--border-strong);border-radius:var(--r-lg);background:var(--surface);flex-direction:column;gap:10px;padding:12px 14px;display:flex}.folder-headline{flex-wrap:wrap;align-items:center;gap:8px;font-size:13px;display:flex}.folder-headline svg{color:var(--text-2)}.kind-bar{background:var(--surface-hover);border-radius:6px;gap:2px;height:6px;display:flex;overflow:hidden}.kind-seg{height:100%}.k0{background:#6d6af5}.k1{background:#3fb27f}.k2{background:#d4a03a}.k3{background:#c76bd6}.k4{background:#4c8df6}.k5{background:#6c6d78}.kind-legend{color:var(--text-2);flex-wrap:wrap;gap:4px 14px;font-size:12px;display:flex}.kind-legend i{border-radius:2px;width:8px;height:8px;margin-right:6px;display:inline-block}.top-level{color:var(--text-3);font-size:12px;font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.btn.ghost.active{color:var(--text);background:var(--surface-2)}.folder-browser{border:1px solid var(--border-strong);border-radius:var(--r);background:var(--bg-sunken);flex-direction:column;display:flex;overflow:hidden}.folder-browser-head{border-bottom:1px solid var(--border);align-items:center;gap:8px;padding:8px;display:flex}.folder-browser-path{min-width:0;color:var(--text);flex:1;font-size:12px}.folder-browser-places{border-bottom:1px solid var(--border);flex-wrap:wrap;gap:4px;padding:6px 8px;display:flex}.folder-browser-list{flex-direction:column;max-height:240px;padding:4px;display:flex;overflow:auto}.folder-browser-item{color:var(--text);font:inherit;text-align:left;border-radius:var(--r-sm);cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;padding:6px 8px;font-size:13px;display:flex}.folder-browser-item:hover{background:var(--surface-hover)}.folder-browser-item svg{color:var(--text-3);flex:none}.folder-browser-foot{border-top:1px solid var(--border);align-items:center;gap:8px;padding:8px;display:flex}.folder-browser-foot .spacer{flex:1}.docs-rules{color:var(--text);margin-bottom:6px;font-weight:500}.docs-rules svg{color:var(--accent-text)}.rules{flex-direction:column;gap:20px;font-size:13px;display:flex}.rules-filters{background:var(--panel);border:1px solid var(--border);border-radius:var(--r-lg);grid-template-columns:minmax(200px,1.4fr) repeat(5,minmax(120px,1fr));gap:12px;padding:14px 16px;display:grid}.rules-filters select:disabled{opacity:.5}.rules-filters-foot{grid-column:1/-1;align-items:center;gap:12px;display:flex}.rules-check{color:var(--text-2);cursor:pointer;align-items:center;gap:7px;font-size:13px;display:inline-flex}.rules-area h2{margin:4px 0 6px;font-size:16px}.rules-prefix{font-family:var(--mono);color:var(--text-3);margin-left:4px;font-size:12px;font-weight:400}.rules-stages{color:var(--text-3);flex-wrap:wrap;gap:4px 14px;margin:0 0 10px;display:flex}.rules-stages a{color:var(--accent-text);text-decoration:none}.rules-stages a:hover{text-decoration:underline}.rules-stage h3{margin:16px 0 8px;scroll-margin-top:12px;font-size:14px}.rules-table-wrap{border:1px solid var(--border);border-radius:var(--r-lg);overflow-x:auto}.rules-table{border-collapse:collapse;table-layout:fixed;width:100%;min-width:1000px}.rules-table th{text-align:left;text-transform:uppercase;letter-spacing:.04em;color:var(--text-3);background:var(--panel);border-bottom:1px solid var(--border);padding:9px 10px;font-size:11px;font-weight:600}.rules-table td{vertical-align:top;border-top:1px solid var(--border);color:var(--text-2);overflow-wrap:anywhere;padding:10px;line-height:1.5}.rules-table tr:first-child td{border-top:none}.rules-table tr.superseded td{opacity:.55}.rules-table tr{scroll-margin-top:12px}.rules-id{font-family:var(--mono);font-size:12px;font-weight:600;color:var(--accent-text)!important}.rules-superseded{font-family:var(--font);color:var(--text-3);margin-top:4px;font-size:11px;font-weight:400}.rules-md{color:var(--text)!important}.rules-md p{margin:0 0 6px}.rules-md p:last-child{margin:0}.rules-md ul,.rules-md ol{margin:0 0 6px;padding-left:18px}.rules-md code{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--r-sm);padding:0 4px;font-size:.86em}.rules-md a,.rules-cites a{color:var(--accent-text)}.rules-check-how{color:var(--text-3);margin-top:6px;font-size:12px}.rules-cites{color:var(--text)}.rules-cite{-webkit-text-decoration:underline dotted var(--text-3);text-decoration:underline dotted var(--text-3);text-underline-offset:3px}.rules-excerpt-toggle{font:inherit;color:var(--accent-text);cursor:pointer;background:0 0;border:none;align-items:center;gap:3px;margin-top:6px;padding:0;font-size:12px;display:inline-flex}.rules-excerpt{background:var(--accent-soft);border-left:2px solid var(--accent);border-radius:var(--r-sm);color:var(--text);margin:6px 0 0;padding:8px 10px;font-size:12.5px;font-style:italic}.rules-excerpt-src{color:var(--accent-text);margin-bottom:3px;font-size:11px;font-style:normal;font-weight:600}.rules-status{white-space:nowrap;align-items:center;gap:6px;font-weight:500;display:inline-flex}.rules-status.done{color:var(--green)}.rules-status.partial{color:var(--amber)}.rules-status.missing{color:var(--red)}.rules-status.na{color:var(--text-3)}.rule-dot{background:var(--amber);border-radius:50%;width:9px;height:9px;display:inline-block}.docs-body .rules~*{padding-right:24px}.docs-body:has(.rules){padding-right:24px}.update-badge{color:var(--accent-text)}.update-available{border:1px solid var(--accent-soft);background:var(--accent-soft);border-radius:var(--r-lg);flex-direction:column;gap:8px;padding:12px 14px;display:flex}.update-available svg{color:var(--accent-text)}.update-notes{flex-direction:column;gap:8px;max-height:260px;margin-top:4px;display:flex;overflow:auto}.update-notes ul{color:var(--text-2);margin:4px 0 0;padding-left:18px;font-size:12.5px;line-height:1.5}
1
+ @font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2)format("woff2-variations");unicode-range:U+1F??}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-wght-normal-CkhJZR-_.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--bg:#0b0c0e;--bg-sunken:#08090a;--panel:#101114;--surface:#15161a;--surface-2:#1b1c21;--surface-hover:#202127;--border:#23252b;--border-strong:#30323a;--text:#ededef;--text-2:#a0a1ab;--text-3:#6c6d78;--accent:#6d6af5;--accent-hover:#7e7bf7;--accent-soft:#6d6af524;--accent-text:#aaa8ff;--green:#3fb27f;--green-soft:#3fb27f24;--amber:#d4a03a;--amber-soft:#d4a03a24;--red:#e5534b;--red-soft:#e5534b24;--blue:#4c8df6;--blue-soft:#4c8df624;--r-sm:4px;--r:6px;--r-lg:10px;--shadow-pop:0 12px 32px #00000073, 0 0 0 1px var(--border-strong);--font:"Inter Variable", Inter, "Segoe UI", system-ui, sans-serif;--mono:"JetBrains Mono", "Cascadia Code", Consolas, ui-monospace, monospace;font-family:var(--font);color:var(--text);background:var(--bg);--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;font-feature-settings:"cv11", "ss01";-webkit-font-smoothing:antialiased;font-size:13px;line-height:1.5}*{box-sizing:border-box}body{margin:0}a{color:inherit;text-decoration:none}h1,h2,h3{letter-spacing:-.015em;margin:0;font-weight:600}h1{font-size:20px}h2{font-size:15px}h3{font-size:13px}p{margin:0}code,pre,.mono{font-family:var(--mono);font-size:12px}:focus-visible{outline:2px solid var(--accent);outline-offset:1px}::selection{background:var(--accent-soft)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#2a2c33 padding-box content-box;border:3px solid #0000;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:#3a3c45 padding-box content-box;border:3px solid #0000}.muted{color:var(--text-2)}.subtle{color:var(--text-3)}.small{font-size:12px}.tnum{font-variant-numeric:tabular-nums}.grow{flex:1;min-width:0}.row{align-items:center;gap:8px;display:flex}.stack{flex-direction:column;gap:8px;display:flex}.spacer{flex:1}.center{text-align:center}.ellipsis{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.error{color:var(--red);background:var(--red-soft);border-radius:var(--r);border:1px solid #e5534b4d;padding:8px 12px;font-size:13px}.notice{color:var(--amber);background:var(--amber-soft);border-radius:var(--r);border:1px solid #d4a03a4d;padding:8px 12px;font-size:13px}.btn{border-radius:var(--r);border:1px solid var(--border-strong);background:var(--surface-2);height:30px;color:var(--text);font:inherit;cursor:pointer;white-space:nowrap;justify-content:center;align-items:center;gap:6px;padding:0 12px;font-size:13px;font-weight:500;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.btn:hover:not(:disabled){background:var(--surface-hover);border-color:#3a3d46}.btn:disabled{opacity:.45;cursor:not-allowed}.btn svg{flex:none}.btn.primary{background:var(--accent);color:#fff;border-color:#0000}.btn.primary:hover:not(:disabled){background:var(--accent-hover)}.btn.ghost{color:var(--text-2);background:0 0;border-color:#0000}.btn.ghost:hover:not(:disabled){background:var(--surface-2);color:var(--text)}.btn.danger{color:var(--red);background:0 0;border-color:#e5534b59}.btn.danger:hover:not(:disabled){background:var(--red-soft)}.btn.danger-solid{color:#fff;background:#c4392f;border-color:#0000}.btn.danger-solid:hover:not(:disabled){background:#d6453b}.btn.sm{height:26px;padding:0 9px;font-size:12px}.btn.icon{width:30px;padding:0}.btn.icon.sm{width:26px}.btn.icon.xs{width:20px;height:20px;color:var(--text-3)}.btn.icon.xs:hover{color:var(--text)}.title-input{max-width:260px;height:24px;padding:0 6px;font-weight:600}.btn.block{width:100%}.link{color:var(--accent-text);font:inherit;cursor:pointer;background:0 0;border:none;padding:0}.link:hover{text-decoration:underline}input,textarea,select{background:var(--bg-sunken);border:1px solid var(--border-strong);color:var(--text);border-radius:var(--r);font:inherit;outline:none;padding:7px 10px;font-size:13px;transition:border-color .12s,box-shadow .12s}input::placeholder,textarea::placeholder{color:var(--text-3)}input:focus,textarea:focus,select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}textarea{resize:vertical;line-height:1.5}input[type=checkbox],input[type=radio]{accent-color:var(--accent);margin:0}.field{flex-direction:column;gap:6px;display:flex}.field>span{color:var(--text-2);font-size:12px;font-weight:500}.field .hint{color:var(--text-3);font-size:12px}.field>.input-row{font-size:inherit;font-weight:inherit;gap:8px;display:flex}.input-row>input{flex:1;min-width:0}.input-row>.btn{flex-shrink:0}.field>.seg{align-self:flex-start}.field-row{gap:12px;display:flex}.field-row>.field{flex:1}.check{color:var(--text-2);cursor:pointer;align-items:center;gap:6px;font-size:12px;display:inline-flex}.seg{background:var(--bg-sunken);border:1px solid var(--border-strong);border-radius:var(--r);gap:2px;padding:2px;display:inline-flex}.seg button{border-radius:var(--r-sm);height:24px;color:var(--text-2);font:inherit;cursor:pointer;background:0 0;border:none;padding:0 10px;font-size:12px;font-weight:500}.seg button:hover{color:var(--text)}.seg button.on{background:var(--surface-hover);color:var(--text);box-shadow:0 0 0 1px var(--border-strong)}.choice{border:1px solid var(--border-strong);border-radius:var(--r);cursor:pointer;align-items:flex-start;gap:10px;padding:10px 12px;transition:border-color .12s,background .12s;display:flex}.choice:hover{border-color:#3a3d46}.choice:has(input:checked){background:var(--accent-soft);border-color:#6d6af599}.choice input{margin-top:3px}.choice-body{flex-direction:column;gap:2px;display:flex}.choice-title{align-items:center;gap:6px;font-weight:500;display:flex}.choice-desc{color:var(--text-2);font-size:12px}.tag{border-radius:var(--r-sm);height:20px;color:var(--text-2);background:var(--surface-2);border:1px solid var(--border);white-space:nowrap;align-items:center;gap:4px;padding:0 7px;font-size:11px;font-weight:500;display:inline-flex}.tag svg{width:11px;height:11px}.tag.accent{color:var(--accent-text);background:var(--accent-soft);border-color:#0000}.tag.green{color:var(--green);background:var(--green-soft);border-color:#0000}.tag.amber{color:var(--amber);background:var(--amber-soft);border-color:#0000}.tag.red{color:var(--red);background:var(--red-soft);border-color:#0000}.tag.blue{color:var(--blue);background:var(--blue-soft);border-color:#0000}.dot{background:var(--text-3);border-radius:50%;flex:none;width:7px;height:7px;display:inline-block;position:relative}.dot.idle{background:var(--text-3)}.dot.busy{background:var(--green)}.dot.busy:after{content:"";border:1.5px solid var(--green);opacity:0;border-radius:50%;animation:1.8s ease-out infinite ping;position:absolute;inset:-3px}.dot.waiting{background:var(--amber)}.dot.stuck,.dot.error{background:var(--red)}.dot.stopped{border:1.5px solid var(--text-3);background:0 0}@keyframes ping{0%{opacity:.8;transform:scale(.6)}to{opacity:0;transform:scale(1.9)}}.avatar{color:#fff;text-transform:uppercase;letter-spacing:0;border-radius:6px;flex:none;justify-content:center;align-items:center;width:24px;height:24px;font-size:11px;font-weight:600;display:inline-flex;position:relative}.avatar.sm{border-radius:4px;width:18px;height:18px;font-size:9px}.avatar.lg{border-radius:8px;width:30px;height:30px;font-size:13px}.avatar .dot{width:9px;height:9px;box-shadow:0 0 0 2px var(--panel);position:absolute;bottom:-3px;right:-3px}.avatar.human,.avatar.system{background:var(--surface-hover);color:var(--text-2)}.kbd{font-family:var(--mono);border-radius:var(--r-sm);border:1px solid var(--border-strong);color:var(--text-2);padding:1px 5px;font-size:11px}.app{flex-direction:column;height:100vh;display:flex}.topbar{border-bottom:1px solid var(--border);background:var(--panel);flex:none;align-items:center;gap:12px;height:48px;padding:0 14px 0 16px;display:flex}.remote-banner{background:var(--amber-soft);color:var(--amber);border-bottom:1px solid #d4a03a59;flex:none;align-items:center;gap:10px;padding:7px 14px 7px 16px;font-size:13px;display:flex}.remote-banner a{color:inherit;text-decoration:underline}.remote-banner .spacer{flex:1}.remote-code{letter-spacing:.08em;font-family:ui-monospace,monospace;font-weight:600}.remote-code.big{color:var(--text);font-size:22px}.brand{letter-spacing:-.01em;align-items:center;gap:9px;font-size:14px;font-weight:600;display:flex}.brand-logo{flex:none;width:22px;height:22px}.crumbs{color:var(--text-3);align-items:center;gap:6px;min-width:0;font-size:13px;display:flex}.crumbs a{color:var(--text-2)}.crumbs a:hover{color:var(--text)}.crumbs .current{color:var(--text);font-weight:500}.topbar-actions{align-items:center;gap:6px;margin-left:auto;display:flex}.runtime{border:1px solid var(--border);height:26px;color:var(--text-2);border-radius:999px;align-items:center;gap:7px;padding:0 10px;font-size:12px;display:inline-flex}.runtime .dot.running{background:var(--green)}.runtime .dot.starting{background:var(--amber)}.runtime .dot.crashed,.runtime .dot.stopped{background:var(--red)}.page{flex:1;min-height:0;overflow:auto}.page-inner{flex-direction:column;gap:24px;max-width:1040px;margin:0 auto;padding:32px 32px 64px;display:flex}.page-head{justify-content:space-between;align-items:flex-end;gap:16px;display:flex}.page-head p{color:var(--text-2);margin-top:4px}.page-title{align-items:center;gap:10px;display:flex}.page-title svg{color:var(--text-2)}.back{color:var(--text-2);cursor:pointer;font-size:13px;font:inherit;background:0 0;border:none;align-items:center;gap:6px;margin-bottom:14px;padding:0;display:inline-flex}.back:hover{color:var(--text)}.section{background:var(--panel);border:1px solid var(--border);border-radius:var(--r-lg)}.section-head{border-bottom:1px solid var(--border);justify-content:space-between;align-items:flex-start;gap:16px;padding:16px 18px;display:flex}.section-head p{color:var(--text-2);max-width:640px;margin-top:3px;font-size:12px}.section-body{padding:8px}.section-empty{text-align:center;color:var(--text-3);padding:28px 18px;font-size:13px}.list-row{border-radius:var(--r);align-items:center;gap:12px;padding:10px 12px;display:flex}.list-row:hover{background:var(--surface)}.list-row+.list-row{border-top:1px solid var(--border);border-radius:0}.list-row:hover+.list-row{border-top-color:#0000}.list-title{font-weight:500}.list-sub{color:var(--text-2);font-size:12px}.project-list{border:1px solid var(--border);border-radius:var(--r-lg);background:var(--panel);flex-direction:column;display:flex;overflow:visible}.project-row{color:inherit;grid-template-columns:minmax(0,1fr) auto auto auto;align-items:center;gap:20px;padding:14px 16px;transition:background .12s;display:grid}.project-row:first-child{border-radius:var(--r-lg) var(--r-lg) 0 0}.project-row:last-child{border-radius:0 0 var(--r-lg) var(--r-lg)}.project-row:only-child{border-radius:var(--r-lg)}.project-row+.project-row{border-top:1px solid var(--border)}.project-row:hover{background:var(--surface)}.project-name{align-items:center;gap:8px;font-size:14px;font-weight:600;display:flex}.project-dir{color:var(--text-3);font-size:12px;font-family:var(--mono);margin-top:2px}.avatar-stack{gap:3px;display:flex}.project-meta{color:var(--text-2);align-items:center;gap:6px;min-width:120px;font-size:12px;display:flex}.progress-mini{background:var(--surface-hover);border-radius:4px;width:70px;height:4px;overflow:hidden}.progress-mini>div{background:var(--green);border-radius:4px;height:100%}.empty{text-align:center;color:var(--text-2);flex-direction:column;align-items:center;gap:10px;padding:56px 20px;display:flex}.empty-icon{background:var(--surface);border:1px solid var(--border);width:44px;height:44px;color:var(--text-2);border-radius:12px;justify-content:center;align-items:center;margin-bottom:4px;display:flex}.empty h3{color:var(--text);font-size:14px}.locked{justify-content:center;align-items:center;max-width:460px;min-height:100vh;margin:0 auto;display:flex}.empty p{max-width:380px;font-size:13px}.backdrop{z-index:60;background:#0000008c;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.dialog{background:var(--panel);border:1px solid var(--border-strong);border-radius:12px;flex-direction:column;width:min(560px,100%);max-height:calc(100vh - 48px);display:flex;box-shadow:0 24px 64px #0000008c}.dialog.wide{width:min(880px,100%)}.dialog-head{align-items:center;gap:10px;padding:16px 18px 12px;display:flex}.dialog-head h2{flex:1}.dialog-sub{color:var(--text-2);margin-top:-6px;margin-bottom:8px;padding:0 18px;font-size:12px}.dialog-body{flex-direction:column;gap:14px;padding:8px 18px 16px;display:flex;overflow:auto}.dialog-foot{border-top:1px solid var(--border);justify-content:flex-end;align-items:center;gap:8px;padding:12px 18px;display:flex}.steps{color:var(--text-3);align-items:center;gap:6px;padding:0 18px 10px;font-size:12px;display:flex}.steps .step{align-items:center;gap:6px;display:flex}.steps .step-num{border:1px solid var(--border-strong);border-radius:50%;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;display:inline-flex}.steps .step.on{color:var(--text)}.steps .step.on .step-num{background:var(--accent);border-color:var(--accent);color:#fff}.steps .step.done .step-num{background:var(--surface-hover);color:var(--text-2)}.steps .sep{background:var(--border-strong);width:18px;height:1px}.drawer-backdrop{z-index:50;background:#0006;justify-content:flex-end;display:flex;position:fixed;inset:0}.drawer{background:var(--panel);border-left:1px solid var(--border-strong);flex-direction:column;width:440px;max-width:94vw;height:100%;display:flex;box-shadow:-24px 0 48px #0006}.drawer-head{border-bottom:1px solid var(--border);align-items:center;gap:10px;padding:14px 16px;display:flex}.drawer-head h2{flex:1}.drawer-body{flex-direction:column;flex:1;gap:12px;padding:14px 16px;display:flex;overflow:auto}.menu{flex:none;position:relative}.menu-list{z-index:40;background:var(--surface);min-width:200px;box-shadow:var(--shadow-pop);border-radius:8px;flex-direction:column;padding:4px;display:flex;position:absolute;top:calc(100% + 4px);right:0}.menu-list button{text-align:left;color:var(--text);font:inherit;border-radius:var(--r-sm);cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;padding:7px 9px;font-size:13px;display:flex}.menu-list button:hover{background:var(--surface-hover)}.menu-list button.danger{color:var(--red)}.menu-list svg{color:var(--text-2)}.menu-list button.danger svg{color:var(--red)}.project-view{grid-template-columns:248px minmax(0,1fr);height:100%;display:grid}.side{border-right:1px solid var(--border);background:var(--panel);flex-direction:column;min-height:0;display:flex}.side-scroll{flex-direction:column;flex:1;gap:18px;padding:10px 8px;display:flex;overflow:auto}.side-group-title{color:var(--text-3);letter-spacing:.02em;justify-content:space-between;align-items:center;padding:0 8px 6px;font-size:11px;font-weight:600;display:flex}.side-foot{border-top:1px solid var(--border);flex-direction:column;gap:8px;padding:10px 12px;display:flex}.usage-line{color:var(--text-2);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:6px;padding:2px 0;font-family:inherit;font-size:12px;display:flex}.usage-line:hover{color:var(--text)}.usage-line svg{color:var(--text-3)}.usage-total{white-space:nowrap;flex-direction:column;flex:none;align-items:flex-end;gap:2px;display:flex}.usage-total strong{font-size:18px}.usage-table{border-collapse:collapse;width:100%;font-size:12px}.usage-table th{text-align:left;color:var(--text-3);border-bottom:1px solid var(--border);white-space:nowrap;padding:6px 8px;font-weight:500}.usage-table td{border-bottom:1px solid var(--border);white-space:nowrap;padding:6px 8px}.usage-table .num{text-align:right}.usage-table tfoot td{border-bottom:none;font-weight:600}.usage-table tr.muted td{color:var(--text-3)}.price-row{flex-wrap:wrap;gap:8px}.price-row>.btn{justify-content:center;min-width:64px}.price-row .list-sub.warn{color:var(--amber)}.price-field{color:var(--text-3);flex-direction:column;gap:2px;font-size:11px;display:flex}.price-field input{width:84px;height:28px;padding:0 6px;font-size:12px}.agent-row{border-radius:var(--r);width:100%;color:var(--text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;padding:6px 8px;display:flex}.agent-row:hover{background:var(--surface)}.agent-row.active{background:var(--surface-2)}.agent-row .avatar .dot{box-shadow:0 0 0 2px var(--panel)}.agent-row:hover .avatar .dot,.agent-row.active .avatar .dot{box-shadow:0 0 0 2px var(--surface-2)}.agent-name{align-items:center;gap:6px;font-weight:500;display:flex}.agent-sub{color:var(--text-3);font-size:12px}.agent-sub.working{color:var(--green)}.agent-sub.waiting{color:var(--amber)}.agent-sub.problem{color:var(--red)}.stopped-toggle{color:var(--text-3);cursor:pointer;font-size:12px;font:inherit;background:0 0;border:none;align-items:center;gap:6px;padding:4px 8px;display:flex}.stopped-toggle:hover{color:var(--text-2)}.asset-row{border-radius:var(--r);align-items:center;gap:8px;padding:5px 8px;font-size:12px;display:flex}.asset-row:hover{background:var(--surface)}.asset-row svg{color:var(--text-3);flex:none}.asset-row.held svg{color:var(--amber)}.asset-name{color:var(--text);font-size:12px;font-weight:500}.asset-sub{color:var(--text-3);font-size:11px}.main{flex-direction:column;min-width:0;min-height:0;display:flex}.main-head{border-bottom:1px solid var(--border);flex:none;align-items:center;gap:4px;height:46px;padding:0 12px 0 8px;display:flex}.tabs{align-items:center;gap:2px;height:100%;display:flex}.tab{height:100%;color:var(--text-2);font:inherit;cursor:pointer;background:0 0;border:none;align-items:center;gap:7px;padding:0 10px;font-weight:500;display:inline-flex;position:relative}.tab:hover,.tab.active{color:var(--text)}.tab svg{color:var(--text-3)}.tab.active svg{color:var(--text-2)}.tab-underline{background:var(--text);border-radius:2px;height:2px;position:absolute;bottom:-1px;left:8px;right:8px}.tab .count{color:var(--text-3);font-variant-numeric:tabular-nums;font-size:11px}.tab-alert{background:var(--amber);color:#1a1405;border-radius:9px;align-items:center;gap:5px;height:18px;padding:0 7px;font-size:11px;font-weight:600;display:inline-flex}.tab-alert-dot{background:#1a1405;border-radius:50%;width:6px;height:6px;position:relative}.tab-alert-dot:after{content:"";background:#1a1405;border-radius:50%;animation:1.6s ease-out infinite ping;position:absolute;inset:0}.main-actions{align-items:center;gap:6px;margin-left:auto;display:flex}.needs-you{background:var(--amber-soft);height:28px;color:var(--amber);font:inherit;cursor:pointer;border:1px solid #d4a03a66;border-radius:999px;align-items:center;gap:7px;padding:0 10px;font-size:12px;font-weight:600;display:inline-flex}.needs-you:hover{background:#d4a03a38}.needs-you .count{background:var(--amber);color:#1a1405;border-radius:9px;justify-content:center;align-items:center;min-width:18px;height:18px;padding:0 5px;font-size:11px;display:inline-flex}.main-body{flex-direction:column;flex:1;min-height:0;display:flex}.banner{border-bottom:1px solid var(--border);flex:none;align-items:center;gap:12px;padding:9px 16px;font-size:13px;display:flex}.banner svg{flex:none}.banner.red{background:var(--red-soft);color:var(--text)}.banner.red svg{color:var(--red)}.banner.blue{background:var(--blue-soft)}.banner.blue svg{color:var(--blue)}.banner .muted{font-size:12px}.inbox-item{border:1px solid var(--border-strong);border-radius:var(--r-lg);background:var(--surface);flex-direction:column;gap:10px;padding:12px;display:flex}.inbox-item-head{align-items:center;gap:8px;font-size:13px;display:flex}.inbox-item-head .when{color:var(--text-3);margin-left:auto;font-size:11px}.inbox-kind{color:var(--text-3);text-transform:uppercase;letter-spacing:.04em;font-size:11px;font-weight:600}.command{background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--r);font-family:var(--mono);white-space:pre-wrap;word-break:break-word;max-height:180px;margin:0;padding:8px 10px;font-size:12px;overflow:auto}.inbox-reason{color:var(--text-2);font-size:12px}.inbox-actions{flex-wrap:wrap;gap:6px;display:flex}.inbox-empty{text-align:center;color:var(--text-3);padding:40px 10px}.session-note{border:1px dashed var(--border-strong);border-radius:var(--r);max-width:760px;color:var(--text-2);justify-content:space-between;align-items:center;gap:12px;margin:0 auto;padding:12px 14px;font-size:13px;display:flex}.chat{flex-direction:column;height:100%;min-height:0;display:flex}.chat-head{border-bottom:1px solid var(--border);align-items:center;gap:10px;padding:10px 20px;display:flex}.chat-head .title{font-weight:600}.chat-head .sub{color:var(--text-3);font-size:12px}.inline-select{field-sizing:content;border-radius:var(--r-sm);width:auto;height:auto;color:inherit;font:inherit;cursor:pointer;background:0 0;border:none;padding:0 2px}.inline-select:hover{color:var(--text);background:var(--surface-hover)}.inline-select:focus{box-shadow:none}.inline-select option{background:var(--panel);color:var(--text)}.chat-scroll{flex:1;padding:24px 24px 12px;overflow:auto}.chat-col{flex-direction:column;gap:18px;max-width:760px;margin:0 auto;display:flex}.chat-col>.load-older{align-self:center}.list-compact{flex-direction:column;gap:4px;display:flex}.msg-user{background:var(--surface-2);border:1px solid var(--border);white-space:pre-wrap;border-radius:12px 12px 4px;align-self:flex-end;max-width:82%;padding:9px 13px;font-size:14px;line-height:1.55}.msg-assistant{flex-direction:column;gap:8px;font-size:14px;line-height:1.65;display:flex}.msg-note{color:var(--text-3);text-align:center;justify-content:center;font-size:12px;line-height:1.5;display:flex}.msg-note>span{background:var(--panel);border:1px solid var(--border);border-radius:999px;max-width:88%;padding:4px 10px}.msg-agent{border:1px solid var(--border);border-radius:var(--r-lg);background:var(--panel);overflow:hidden}.msg-agent-head{border-bottom:1px solid var(--border);align-items:center;gap:8px;padding:8px 12px;font-size:12px;display:flex}.msg-agent-head strong{font-weight:600}.msg-agent-body{padding:10px 12px;font-size:13.5px}.msg-failure{color:var(--red);background:var(--red-soft);border-radius:var(--r);align-items:flex-start;gap:8px;padding:8px 12px;font-size:13px;display:flex}.msg-failure svg{flex:none;margin-top:2px}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md p{margin:0 0 10px}.md h1,.md h2,.md h3{margin:18px 0 8px}.md h1{font-size:18px}.md h2{font-size:16px}.md h3{font-size:14px}.md code{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--r-sm);padding:0 4px;font-size:.86em}.md pre{background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--r);padding:12px;overflow:auto}.md pre code{background:0 0;border:none;padding:0}.md ul,.md ol{margin:0 0 10px;padding-left:22px}.md li{margin:2px 0}.md table{border-collapse:collapse;margin:0 0 10px}.md th,.md td{border:1px solid var(--border-strong);padding:5px 9px}.md a{color:var(--accent-text)}.md blockquote{border-left:2px solid var(--border-strong);color:var(--text-2);margin:0 0 10px;padding-left:12px}.reasoning{color:var(--text-3);font-size:13px}.reasoning summary{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;list-style:none;display:inline-flex}.reasoning summary::-webkit-details-marker{display:none}.reasoning summary:hover{color:var(--text-2)}.reasoning-body{white-space:pre-wrap;border-left:2px solid var(--border-strong);margin-top:6px;padding:4px 0 4px 12px}.tool{border:1px solid var(--border);border-radius:var(--r);background:var(--panel);font-size:12px}.tool summary{cursor:pointer;color:var(--text-2);align-items:center;gap:8px;padding:6px 10px;list-style:none;display:flex}.tool summary::-webkit-details-marker{display:none}.tool summary:hover{color:var(--text)}.tool-name{color:var(--text);font-weight:500}.tool-arg{font-family:var(--mono);color:var(--text-3);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.tool-state{flex:none;display:inline-flex}.tool-state.done{color:var(--green)}.tool-state.failed{color:var(--red)}.tool-io{border-top:1px solid var(--border);max-height:260px;font-family:var(--mono);white-space:pre-wrap;color:var(--text-2);margin:0;padding:10px;font-size:12px;overflow:auto}.tool-io.out{background:var(--bg-sunken)}.spin{animation:.9s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.thinking{color:var(--text-3);align-items:center;gap:8px;font-size:13px;display:flex}.thinking.retrying{color:var(--amber)}.typing{gap:3px;display:inline-flex}.typing i{background:currentColor;border-radius:50%;width:5px;height:5px;animation:1.2s ease-in-out infinite typing}.typing i:nth-child(2){animation-delay:.15s}.typing i:nth-child(3){animation-delay:.3s}@keyframes typing{0%,80%,to{opacity:.3;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}.chat-empty{text-align:center;color:var(--text-2);padding:56px 20px}.chat-empty h2{color:var(--text);margin-bottom:6px;font-size:18px}.composer-wrap{padding:8px 24px 18px}.composer{border:1px solid var(--border-strong);background:var(--surface);border-radius:12px;max-width:760px;margin:0 auto;transition:border-color .12s,box-shadow .12s}.composer:focus-within{border-color:#44465a;box-shadow:0 0 0 3px #6d6af514}.composer textarea{resize:none;width:100%;box-shadow:none;background:0 0;border:none;padding:12px 14px 4px;font-size:14px}.composer textarea:focus{box-shadow:none}.composer-bar{align-items:center;gap:8px;padding:6px 8px 8px 14px;display:flex}.composer-hint{color:var(--text-3);font-size:11px}.form-card{border-radius:var(--r-lg);background:var(--panel);border:1px solid #d4a03a73;overflow:hidden}.form-card-head{border-bottom:1px solid var(--border);background:var(--amber-soft);align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:600;display:flex}.form-card-head svg{color:var(--amber)}.form-card-body{flex-direction:column;gap:14px;padding:12px 14px;display:flex}.form-field-title{margin-bottom:8px;font-size:13px;font-weight:500}.form-options{flex-direction:column;gap:6px;display:flex}.form-option{text-align:left;background:var(--surface);border:1px solid var(--border-strong);color:var(--text);font:inherit;border-radius:var(--r);cursor:pointer;flex-direction:column;gap:2px;padding:9px 12px;display:flex}.form-option:hover{border-color:#3a3d46}.form-option.on{border-color:var(--accent);background:var(--accent-soft)}.form-option:disabled{opacity:.45;cursor:not-allowed}.form-field-desc{color:var(--text-2);margin:-4px 0 8px;font-size:13px}.form-option span{color:var(--text-2);font-size:12px}.kanban{flex-direction:column;height:100%;min-height:0;display:flex}.kanban-head{border-bottom:1px solid var(--border);align-items:center;gap:16px;padding:14px 20px;display:flex}.kanban-goal{flex:1;min-width:0}.kanban-goal-text{font-size:14px;font-weight:500}.kanban-goal-meta{color:var(--text-3);align-items:center;gap:8px;margin-top:4px;font-size:12px;display:flex}.progress{color:var(--text-2);flex:none;align-items:center;gap:10px;font-size:12px;display:flex}.progress-track{background:var(--surface-hover);border-radius:6px;width:160px;height:6px;overflow:hidden}.progress-fill{background:var(--green);border-radius:6px;height:100%}.plan-banner{border:1px solid var(--border-strong);border-radius:var(--r-lg);background:var(--surface);flex-direction:column;gap:10px;margin:12px 20px 0;padding:12px 14px;display:flex}.plan-banner-row{align-items:center;gap:10px;display:flex}.plan-banner-row textarea{flex:1}.columns{flex:1;grid-template-columns:repeat(5,minmax(190px,1fr));gap:10px;min-height:0;padding:14px 20px 16px;display:grid;overflow-x:auto}.column{border-radius:var(--r-lg);background:var(--panel);border:1px solid var(--border);flex-direction:column;min-height:0;display:flex}.column-head{color:var(--text-2);align-items:center;gap:8px;padding:10px 12px;font-size:12px;font-weight:600;display:flex}.column-head svg{color:var(--text-3)}.col-in-progress .column-head svg{color:var(--green)}.col-blocked .column-head svg{color:var(--red)}.col-review .column-head svg{color:var(--amber)}.col-done .column-head svg{color:var(--accent-text)}.column-count{color:var(--text-3);font-variant-numeric:tabular-nums;margin-left:auto;font-size:11px}.column-body{flex-direction:column;flex:1;gap:6px;padding:0 8px 8px;display:flex;overflow-y:auto}.column-empty{text-align:center;color:var(--text-3);padding:14px 6px;font-size:12px}.task-card{text-align:left;font:inherit;color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:var(--r);cursor:pointer;flex-direction:column;gap:7px;padding:10px;transition:border-color .12s,background .12s;display:flex}.task-card:hover{border-color:var(--border-strong);background:var(--surface-2)}.task-card.ts-done .task-title{color:var(--text-2)}.task-top{color:var(--text-3);align-items:center;gap:6px;font-size:11px;display:flex}.task-id{font-family:var(--mono);color:var(--text-3);font-size:11px}.task-title{font-size:13px;font-weight:500;line-height:1.4}.task-meta{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.task-bottom{color:var(--text-2);align-items:center;gap:6px;font-size:12px;display:flex}.task-bottom .subtle{align-items:center;gap:3px;margin-left:auto;font-size:11px;display:inline-flex}.task-detail-meta{grid-template-columns:110px 1fr;gap:6px 12px;font-size:12px;display:grid}.task-detail-meta dt{color:var(--text-3)}.task-detail-meta dd{flex-wrap:wrap;align-items:center;gap:6px;margin:0;display:flex}.history{flex-direction:column;gap:10px;display:flex}.history-item{gap:10px;font-size:12px;display:flex}.history-item .when{color:var(--text-3);font-variant-numeric:tabular-nums;flex:none;width:54px}.history-item .what{color:var(--text-2);white-space:pre-wrap}.history-item .what strong{color:var(--text);font-weight:500}.timeline{flex:1;overflow:auto}.timeline-inner{max-width:820px;margin:0 auto;padding:16px 24px 32px}.timeline-toolbar{border-bottom:1px solid var(--border);color:var(--text-2);align-items:center;gap:10px;padding:10px 24px;font-size:12px;display:flex}.event{border-bottom:1px solid var(--border);grid-template-columns:28px minmax(0,1fr);gap:10px;padding:10px 0;display:grid}.event:last-child{border-bottom:none}.event-head{color:var(--text-2);flex-wrap:wrap;align-items:center;gap:6px;font-size:12px;display:flex}.event-head strong{color:var(--text);font-weight:600}.event-head .when{color:var(--text-3);font-variant-numeric:tabular-nums;margin-left:auto}.event-body{margin-top:4px;font-size:13px}.event.quiet .event-body{color:var(--text-2);font-size:12px}.event.open{background:linear-gradient(90deg, var(--amber-soft), transparent 70%);border-radius:var(--r);margin-left:-8px;padding-left:8px}.reply{align-items:flex-end;gap:8px;margin-top:8px;display:flex}.reply textarea{resize:none;flex:1}.docs{grid-template-columns:280px minmax(0,1fr);height:100%;min-height:0;display:grid}.docs-list{border-right:1px solid var(--border);flex-direction:column;gap:1px;padding:10px 8px;display:flex;overflow:auto}.docs-tree-folder{flex-direction:column;gap:1px;display:flex}.docs-search{background:var(--surface);border:1px solid var(--border);border-radius:var(--r);color:var(--text-3);flex:none;align-items:center;gap:6px;margin-bottom:8px;padding:0 4px 0 9px;display:flex}.docs-search:focus-within{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.docs-search input,.docs-search input:focus{box-shadow:none;background:0 0;border:none;border-radius:0}.docs-search input{min-width:0;color:var(--text);background:0 0;border:none;outline:none;flex:1;padding:7px 0;font-size:13px}.docs-folder{color:var(--text-2)}.docs-results{flex-direction:column;gap:10px;display:flex}.docs-result-file{flex-direction:column;gap:1px;display:flex}.docs-result-path{color:var(--text-2);align-items:center;gap:6px;padding:2px 8px;font-size:12px;display:flex}.docs-result-path svg{color:var(--text-3);flex:none}.docs-result-path .ellipsis{flex:1}.docs-result{text-align:left;font:inherit;border-radius:var(--r);cursor:pointer;color:var(--text-2);background:0 0;border:none;gap:8px;padding:5px 8px;font-size:12px;line-height:1.45;display:flex}.docs-result:hover{background:var(--surface);color:var(--text)}.docs-result-line{color:var(--text-3);font-family:var(--mono);text-align:right;flex:none;min-width:28px;padding-top:1px;font-size:11px}.docs-result-text{-webkit-line-clamp:3;word-break:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.docs-result mark{background:var(--accent-soft);color:var(--accent-text);border-radius:2px}.docs-result-more{color:var(--text-3);padding:2px 8px 0 44px;font-size:11px}.docs-page{align-items:flex-start;gap:40px;display:flex}.docs-page .md{flex:1;min-width:0}.docs-toc{flex-direction:column;flex:none;gap:1px;width:220px;max-height:calc(100vh - 200px);display:flex;position:sticky;top:0;overflow:auto}.docs-toc-title{text-transform:uppercase;letter-spacing:.04em;color:var(--text-3);padding:0 8px 6px;font-size:11px;font-weight:600}.docs-toc-item{text-align:left;font:inherit;color:var(--text-2);border-radius:var(--r-sm);cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;padding:3px 8px;font-size:12px;overflow:hidden}.docs-toc-item:hover{background:var(--surface);color:var(--text)}.docs-toc-item.level-1{color:var(--text);font-weight:500}.docs-toc-item.level-3{padding-left:20px}@media (width<=1280px){.docs-toc{display:none}}.md a.doc-path{text-decoration:none}.md a.doc-path code{color:var(--accent-text);border-color:var(--accent-soft)}.md a.doc-path:hover code{background:var(--accent-soft)}.docs-text{font-family:var(--mono);font-size:12.5px;line-height:1.6}.docs-text-line{border-radius:var(--r-sm);gap:14px;display:flex}.docs-text-no{color:var(--text-3);text-align:right;-webkit-user-select:none;user-select:none;flex:none;min-width:40px}.docs-text-content{white-space:pre-wrap;word-break:break-word}.docs-body .flash{animation:1.6s ease-out flash}@keyframes flash{0%,30%{background:var(--accent-soft)}to{background:0 0}}.docs-item{text-align:left;color:var(--text-2);font:inherit;border-radius:var(--r);cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;padding:6px 8px;font-size:13px;display:flex}.docs-item svg{color:var(--text-3);flex:none}.docs-item:hover{background:var(--surface);color:var(--text)}.docs-item.active{background:var(--surface-2);color:var(--text)}.docs-item .grow{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.docs-item-time{color:var(--text-3);flex:none;font-size:11px}.docs-view{flex-direction:column;min-width:0;min-height:0;display:flex}.docs-toolbar{border-bottom:1px solid var(--border);align-items:center;gap:8px;padding:8px 16px;display:flex}.docs-toolbar code{color:var(--text-2)}.docs-body{flex:1;padding:24px 32px 48px;overflow:auto}.docs-body .md{max-width:760px;font-size:14px;line-height:1.7}.docs-editor{resize:none;width:100%;height:100%;min-height:420px;font-family:var(--mono);font-size:13px;line-height:1.6}.settings-scroll{flex:1;overflow:auto}.settings-inner{flex-direction:column;gap:20px;max-width:780px;padding:24px 28px 64px;display:flex}.conn-icon{background:var(--surface-2);border:1px solid var(--border-strong);width:32px;height:32px;color:var(--text-2);border-radius:8px;flex:none;justify-content:center;align-items:center;display:inline-flex}.conn-icon.sm{border-radius:5px;width:22px;height:22px}.conn-test{align-items:center;gap:5px;margin-top:2px;font-size:12px;display:inline-flex}.conn-test.ok{color:var(--green)}.conn-test.bad{color:var(--red)}.pick-row{border:1px solid var(--border-strong);border-radius:var(--r);align-items:center;gap:10px;padding:8px 10px;display:flex}.pick-row+.pick-row{margin-top:6px}.pick-row.on{background:var(--accent-soft);border-color:#6d6af580}.pick-main{cursor:pointer;flex:1;align-items:center;gap:10px;min-width:0;display:flex}.danger-zone{border-color:#e5534b4d}.model-picker{border:1px solid var(--border-strong);border-radius:var(--r-lg);overflow:hidden}.model-picker-head{border-bottom:1px solid var(--border);background:var(--surface);align-items:center;gap:10px;padding:8px 10px;display:flex}.model-picker-head input{flex:1;height:28px;padding:4px 8px}.model-summary{border-bottom:1px solid var(--border);color:var(--text-2);flex-wrap:wrap;align-items:center;gap:6px;padding:8px 12px;font-size:12px;display:flex}.model-groups{max-height:300px;padding:4px;overflow:auto}.model-group-title{background:var(--panel);color:var(--text-3);z-index:1;padding:8px 8px 4px;font-size:11px;font-weight:600;position:sticky;top:0}.model-row{border-radius:var(--r-sm);cursor:pointer;align-items:center;gap:8px;padding:5px 8px;font-size:13px;display:flex}.model-row:hover{background:var(--surface)}.model-row.on{background:var(--accent-soft)}.model-row .check-box{border:1px solid var(--border-strong);color:#fff;border-radius:4px;flex:none;justify-content:center;align-items:center;width:15px;height:15px;display:inline-flex}.model-row.on .check-box{background:var(--accent);border-color:var(--accent)}.model-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lead-btn{color:var(--text-3);cursor:pointer;border-radius:var(--r-sm);background:0 0;border:none;padding:2px;display:inline-flex}.lead-btn:hover{color:var(--text);background:var(--surface-hover)}.lead-btn.on{color:var(--amber)}.folder-summary{border:1px solid var(--border-strong);border-radius:var(--r-lg);background:var(--surface);flex-direction:column;gap:10px;padding:12px 14px;display:flex}.folder-headline{flex-wrap:wrap;align-items:center;gap:8px;font-size:13px;display:flex}.folder-headline svg{color:var(--text-2)}.kind-bar{background:var(--surface-hover);border-radius:6px;gap:2px;height:6px;display:flex;overflow:hidden}.kind-seg{height:100%}.k0{background:#6d6af5}.k1{background:#3fb27f}.k2{background:#d4a03a}.k3{background:#c76bd6}.k4{background:#4c8df6}.k5{background:#6c6d78}.kind-legend{color:var(--text-2);flex-wrap:wrap;gap:4px 14px;font-size:12px;display:flex}.kind-legend i{border-radius:2px;width:8px;height:8px;margin-right:6px;display:inline-block}.top-level{color:var(--text-3);font-size:12px;font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.btn.ghost.active{color:var(--text);background:var(--surface-2)}.folder-browser{border:1px solid var(--border-strong);border-radius:var(--r);background:var(--bg-sunken);flex-direction:column;display:flex;overflow:hidden}.folder-browser-head{border-bottom:1px solid var(--border);align-items:center;gap:8px;padding:8px;display:flex}.folder-browser-path{min-width:0;color:var(--text);flex:1;font-size:12px}.folder-browser-places{border-bottom:1px solid var(--border);flex-wrap:wrap;gap:4px;padding:6px 8px;display:flex}.folder-browser-list{flex-direction:column;max-height:240px;padding:4px;display:flex;overflow:auto}.folder-browser-item{color:var(--text);font:inherit;text-align:left;border-radius:var(--r-sm);cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;padding:6px 8px;font-size:13px;display:flex}.folder-browser-item:hover{background:var(--surface-hover)}.folder-browser-item svg{color:var(--text-3);flex:none}.folder-browser-foot{border-top:1px solid var(--border);align-items:center;gap:8px;padding:8px;display:flex}.folder-browser-foot .spacer{flex:1}.docs-rules{color:var(--text);margin-bottom:6px;font-weight:500}.docs-rules svg{color:var(--accent-text)}.rules{flex-direction:column;gap:20px;font-size:13px;display:flex}.rules-filters{background:var(--panel);border:1px solid var(--border);border-radius:var(--r-lg);grid-template-columns:minmax(200px,1.4fr) repeat(5,minmax(120px,1fr));gap:12px;padding:14px 16px;display:grid}.rules-filters select:disabled{opacity:.5}.rules-filters-foot{grid-column:1/-1;align-items:center;gap:12px;display:flex}.rules-check{color:var(--text-2);cursor:pointer;align-items:center;gap:7px;font-size:13px;display:inline-flex}.rules-area h2{margin:4px 0 6px;font-size:16px}.rules-prefix{font-family:var(--mono);color:var(--text-3);margin-left:4px;font-size:12px;font-weight:400}.rules-stages{color:var(--text-3);flex-wrap:wrap;gap:4px 14px;margin:0 0 10px;display:flex}.rules-stages a{color:var(--accent-text);text-decoration:none}.rules-stages a:hover{text-decoration:underline}.rules-stage h3{margin:16px 0 8px;scroll-margin-top:12px;font-size:14px}.rules-table-wrap{border:1px solid var(--border);border-radius:var(--r-lg);overflow-x:auto}.rules-table{border-collapse:collapse;table-layout:fixed;width:100%;min-width:1000px}.rules-table th{text-align:left;text-transform:uppercase;letter-spacing:.04em;color:var(--text-3);background:var(--panel);border-bottom:1px solid var(--border);padding:9px 10px;font-size:11px;font-weight:600}.rules-table td{vertical-align:top;border-top:1px solid var(--border);color:var(--text-2);overflow-wrap:anywhere;padding:10px;line-height:1.5}.rules-table tr:first-child td{border-top:none}.rules-table tr.superseded td{opacity:.55}.rules-table tr{scroll-margin-top:12px}.rules-id{font-family:var(--mono);font-size:12px;font-weight:600;color:var(--accent-text)!important}.rules-superseded{font-family:var(--font);color:var(--text-3);margin-top:4px;font-size:11px;font-weight:400}.rules-md{color:var(--text)!important}.rules-md p{margin:0 0 6px}.rules-md p:last-child{margin:0}.rules-md ul,.rules-md ol{margin:0 0 6px;padding-left:18px}.rules-md code{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--r-sm);padding:0 4px;font-size:.86em}.rules-md a,.rules-cites a{color:var(--accent-text)}.rules-check-how{color:var(--text-3);margin-top:6px;font-size:12px}.rules-cites{color:var(--text)}.rules-cite{-webkit-text-decoration:underline dotted var(--text-3);text-decoration:underline dotted var(--text-3);text-underline-offset:3px}.rules-excerpt-toggle{font:inherit;color:var(--accent-text);cursor:pointer;background:0 0;border:none;align-items:center;gap:3px;margin-top:6px;padding:0;font-size:12px;display:inline-flex}.rules-excerpt{background:var(--accent-soft);border-left:2px solid var(--accent);border-radius:var(--r-sm);color:var(--text);margin:6px 0 0;padding:8px 10px;font-size:12.5px;font-style:italic}.rules-excerpt-src{color:var(--accent-text);margin-bottom:3px;font-size:11px;font-style:normal;font-weight:600}.rules-status{white-space:nowrap;align-items:center;gap:6px;font-weight:500;display:inline-flex}.rules-status.done{color:var(--green)}.rules-status.partial{color:var(--amber)}.rules-status.missing{color:var(--red)}.rules-status.na{color:var(--text-3)}.rule-dot{background:var(--amber);border-radius:50%;width:9px;height:9px;display:inline-block}.docs-body .rules~*{padding-right:24px}.docs-body:has(.rules){padding-right:24px}.update-badge{color:var(--accent-text)}.update-available{border:1px solid var(--accent-soft);background:var(--accent-soft);border-radius:var(--r-lg);flex-direction:column;gap:8px;padding:12px 14px;display:flex}.update-available svg{color:var(--accent-text)}.update-notes{flex-direction:column;gap:8px;max-height:260px;margin-top:4px;display:flex;overflow:auto}.update-notes ul{color:var(--text-2);margin:4px 0 0;padding-left:18px;font-size:12.5px;line-height:1.5}.chat{position:relative}.att-thumb{border-radius:var(--r);background:var(--surface-2);border:1px solid var(--border);color:var(--text-3);flex:none;justify-content:center;align-items:center;display:inline-flex;overflow:hidden}.att-thumb img{object-fit:cover;width:100%;height:100%;display:block}.att-pending{flex-wrap:wrap;gap:6px;padding:8px 8px 0;display:flex}.att-chip{background:var(--surface);border:1px solid var(--border);border-radius:var(--r);max-width:240px;font:inherit;color:var(--text-2);align-items:center;gap:8px;padding:4px 6px 4px 4px;font-size:12px;display:inline-flex}.att-chip.uploading{opacity:.75}.att-chip.error{border-color:var(--red-soft);color:var(--red)}.att-chip-text{flex-direction:column;min-width:0;line-height:1.3;display:flex}.att-chip-sub{color:var(--text-3);font-size:11px}.att-sent{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.att-chip.sent{cursor:pointer;max-width:220px;padding:3px}.att-chip.sent:hover:not(:disabled){border-color:var(--border-strong);color:var(--text)}.att-chip.sent:disabled{cursor:default;opacity:.6}.att-chip.sent .ellipsis{padding-right:6px}.drop-overlay{z-index:20;border:2px dashed var(--accent);border-radius:var(--r-lg);color:var(--accent-text);pointer-events:none;background:#0b0c0ed1;flex-direction:column;justify-content:center;align-items:center;gap:8px;font-size:14px;display:flex;position:absolute;inset:8px}.files{flex-direction:column;gap:14px;height:100%;padding:20px 28px 40px;display:flex;position:relative;overflow:auto}.files-head{align-items:flex-start;gap:12px;display:flex}.files-head h2{margin:0 0 4px;font-size:16px}.files-grid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:12px;display:grid}.file-card{background:var(--panel);border:1px solid var(--border);border-radius:var(--r-lg);flex-direction:column;display:flex;overflow:hidden}.file-card-preview{background:var(--bg-sunken);border:none;border-bottom:1px solid var(--border);cursor:pointer;justify-content:center;align-items:center;height:140px;padding:4px;display:flex}.file-card-preview .att-thumb{background:0 0;border:none}.file-card-preview .att-thumb img{object-fit:contain}.file-card-body{flex-direction:column;gap:2px;min-width:0;padding:8px 10px 4px;display:flex}.file-card-name{color:var(--text);font-size:13px;font-weight:500}.file-card-sub{color:var(--text-3);font-size:11.5px}.file-card-actions{gap:2px;padding:4px 6px 6px;display:flex}.file-send{position:relative}.file-send-menu{z-index:10;background:var(--surface-2);border:1px solid var(--border-strong);border-radius:var(--r);min-width:140px;box-shadow:var(--shadow-pop);flex-direction:column;padding:4px;display:flex;position:absolute;bottom:100%;left:0}.file-send-menu button{text-align:left;font:inherit;color:var(--text-2);border-radius:var(--r-sm);cursor:pointer;background:0 0;border:none;padding:6px 8px;font-size:12.5px}.file-send-menu button:hover{background:var(--surface-hover);color:var(--text)}