@netnodeag/kraftwerk 0.23.0 → 0.25.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.
@@ -0,0 +1,13 @@
1
+ /** A verified running instance, shaped like a switcher entry. */
2
+ export interface DiscoveredInstance {
3
+ name: string;
4
+ url: string;
5
+ icon?: string;
6
+ live: true;
7
+ }
8
+ /** Write this instance's registry file (call once the server listens). */
9
+ export declare function registerInstance(port: number): Promise<void>;
10
+ /** Remove this instance's registry file. Sync so exit handlers can call it. */
11
+ export declare function unregisterInstance(): void;
12
+ /** All other running instances, verified live. Cached briefly — /api/meta is polled. */
13
+ export declare function discoverInstances(): Promise<DiscoveredInstance[]>;
@@ -0,0 +1,94 @@
1
+ import fsSync, { promises as fs } from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ /**
5
+ * Instance registry: every running inspector writes a small json file to
6
+ * ~/.kraftwerk/instances/<pid>.json so other local instances can discover
7
+ * it — the workspace switcher lists running workspaces automatically, no
8
+ * kraftwerk.yml `switcher:` config needed. Registered ports are verified
9
+ * by probing /api/meta on read (fresh name/icon, detects port reuse);
10
+ * entries that stop answering are pruned, so crashes leave no ghosts.
11
+ */
12
+ const DIR = path.join(os.homedir(), ".kraftwerk", "instances");
13
+ const selfFile = () => path.join(DIR, `${process.pid}.json`);
14
+ let selfPort = null;
15
+ /** Write this instance's registry file (call once the server listens). */
16
+ export async function registerInstance(port) {
17
+ selfPort = port;
18
+ try {
19
+ await fs.mkdir(DIR, { recursive: true });
20
+ const rec = { pid: process.pid, port, startedAt: new Date().toISOString() };
21
+ await fs.writeFile(selfFile(), JSON.stringify(rec));
22
+ }
23
+ catch { } // best-effort — without it discovery just won't see us
24
+ }
25
+ /** Remove this instance's registry file. Sync so exit handlers can call it. */
26
+ export function unregisterInstance() {
27
+ try {
28
+ fsSync.unlinkSync(selfFile());
29
+ }
30
+ catch { }
31
+ }
32
+ /**
33
+ * Probe one registered port: is a kraftwerk inspector answering? `probe=1`
34
+ * tells the other side to skip its own discovery — two instances probing
35
+ * each other's /api/meta must not recurse.
36
+ */
37
+ async function probe(port) {
38
+ try {
39
+ const r = await fetch(`http://127.0.0.1:${port}/api/meta?probe=1`, {
40
+ signal: AbortSignal.timeout(400),
41
+ });
42
+ if (!r.ok)
43
+ return null;
44
+ const meta = (await r.json());
45
+ if (typeof meta.version !== "string")
46
+ return null; // some other app took the port
47
+ return {
48
+ name: meta.projectName || `localhost:${port}`,
49
+ url: `http://localhost:${port}`,
50
+ icon: meta.projectIcon || undefined,
51
+ live: true,
52
+ };
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ let cache = null;
59
+ /** All other running instances, verified live. Cached briefly — /api/meta is polled. */
60
+ export async function discoverInstances() {
61
+ if (cache && Date.now() - cache.at < 5_000)
62
+ return cache.entries;
63
+ let files;
64
+ try {
65
+ files = await fs.readdir(DIR);
66
+ }
67
+ catch {
68
+ return [];
69
+ }
70
+ const probed = await Promise.all(files
71
+ .filter((f) => f.endsWith(".json"))
72
+ .map(async (f) => {
73
+ let rec;
74
+ try {
75
+ rec = JSON.parse(await fs.readFile(path.join(DIR, f), "utf8"));
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ if (rec.pid === process.pid || rec.port === selfPort)
81
+ return null;
82
+ const found = await probe(rec.port);
83
+ if (!found) {
84
+ await fs.unlink(path.join(DIR, f)).catch(() => { }); // stale — prune
85
+ return null;
86
+ }
87
+ return found;
88
+ }));
89
+ const entries = probed
90
+ .filter((e) => e != null)
91
+ .sort((a, b) => a.name.localeCompare(b.name));
92
+ cache = { at: Date.now(), entries };
93
+ return entries;
94
+ }
@@ -10,6 +10,8 @@ import { cancelChat, createChat, deleteChat, disposeAllBackends, getChat, listCh
10
10
  import { bundleDetail, conceptDetail, createBundle, knowledgeIndex, putConcept, verifyFromUi, } from "./knowledge.js";
11
11
  import { deleteMember, getMember, listMembers, saveMember, teamRoot, } from "./team.js";
12
12
  import { deleteAgentSkill, getSkill, listAgentSkills, listSkills, readSkill, saveAgentSkill, skillsRoot, } from "./skills.js";
13
+ import { discoverInstances, registerInstance, unregisterInstance } from "./instances.js";
14
+ import { getSettings, saveSettings } from "./settings.js";
13
15
  import { deleteRoutine, routineStatuses, runRoutineNow, saveRoutine, startRoutineScheduler, } from "./routines.js";
14
16
  /**
15
17
  * The inspector server: a plain node:http server with no dependencies.
@@ -75,13 +77,37 @@ async function getPkgVersion() {
75
77
  pkgVersion ??= await getDiskVersion();
76
78
  return pkgVersion;
77
79
  }
80
+ /** Package name from package.json (registry lookups). */
81
+ async function getPkgName() {
82
+ try {
83
+ const raw = await fs.readFile(new URL("../../package.json", import.meta.url), "utf8");
84
+ return JSON.parse(raw).name ?? "";
85
+ }
86
+ catch {
87
+ return "";
88
+ }
89
+ }
78
90
  async function handleApi(req, res, url) {
79
91
  const seg = url.pathname.split("/").filter(Boolean); // ["api", ...]
80
92
  const method = req.method ?? "GET";
81
- // GET /api/meta — package version + project name ("environment") for the UI
93
+ // GET /api/meta — package version + project name ("environment") for the UI.
94
+ // ?probe=1 marks a discovery probe from another instance: answer identity
95
+ // only, skip our own discovery (two instances must not probe each other
96
+ // recursively).
82
97
  if (seg.length === 2 && seg[1] === "meta" && method === "GET") {
83
98
  const project = await resolveProject(getProjectRoot()).catch(() => null);
84
99
  const projectName = project?.config.name ?? (project ? path.basename(project.root) : "");
100
+ const manual = project?.config.switcher ?? [];
101
+ const discovered = url.searchParams.get("probe") === "1" ? [] : await discoverInstances();
102
+ // Manual switcher entries keep their configured name/icon; discovered
103
+ // instances that duplicate one only contribute the live flag.
104
+ const norm = (u) => u.replace(/\/+$/, "").replace("127.0.0.1", "localhost").toLowerCase();
105
+ const manualUrls = new Set(manual.map((e) => norm(e.url)));
106
+ const liveUrls = new Set(discovered.map((d) => norm(d.url)));
107
+ const switcher = [
108
+ ...manual.map((e) => (liveUrls.has(norm(e.url)) ? { ...e, live: true } : e)),
109
+ ...discovered.filter((d) => !manualUrls.has(norm(d.url))),
110
+ ];
85
111
  return json(res, {
86
112
  version: await getPkgVersion(),
87
113
  // A differing disk version means an upgrade landed while this process
@@ -90,9 +116,40 @@ async function handleApi(req, res, url) {
90
116
  restartable: supervised(),
91
117
  projectName,
92
118
  projectIcon: project?.config.icon ?? "",
93
- switcher: project?.config.switcher ?? [],
119
+ switcher,
94
120
  });
95
121
  }
122
+ // GET /api/settings — kraftwerk.yml (parsed + resolved paths) for the settings page
123
+ if (seg.length === 2 && seg[1] === "settings" && method === "GET") {
124
+ return json(res, await getSettings());
125
+ }
126
+ // PUT /api/settings — write the UI-editable subset (name, icon, switcher) back
127
+ if (seg.length === 2 && seg[1] === "settings" && method === "PUT") {
128
+ try {
129
+ const input = JSON.parse(await readBody(req));
130
+ return json(res, await saveSettings(input));
131
+ }
132
+ catch (err) {
133
+ return json(res, { error: err.message }, 400);
134
+ }
135
+ }
136
+ // GET /api/update-check — ask the npm registry for the latest published version
137
+ if (seg.length === 2 && seg[1] === "update-check" && method === "GET") {
138
+ const name = await getPkgName();
139
+ const current = await getDiskVersion();
140
+ try {
141
+ const r = await fetch(`https://registry.npmjs.org/${name}/latest`, {
142
+ signal: AbortSignal.timeout(5_000),
143
+ });
144
+ if (!r.ok)
145
+ throw new Error(String(r.status));
146
+ const latest = (await r.json()).version ?? "";
147
+ return json(res, { name, current, latest });
148
+ }
149
+ catch {
150
+ return json(res, { name, current, latest: "", error: "npm registry unreachable" }, 502);
151
+ }
152
+ }
96
153
  // POST /api/restart — exit with the respawn code; the `kraftwerk ui` supervisor relaunches
97
154
  if (seg.length === 2 && seg[1] === "restart" && method === "POST") {
98
155
  if (!supervised()) {
@@ -550,10 +607,14 @@ export function startInspector(opts) {
550
607
  for (const sig of ["SIGINT", "SIGTERM"]) {
551
608
  process.once(sig, () => {
552
609
  disposeAllBackends();
610
+ unregisterInstance();
553
611
  process.exit(sig === "SIGINT" ? 130 : 143);
554
612
  });
555
613
  }
556
- process.once("exit", disposeAllBackends);
614
+ process.once("exit", () => {
615
+ disposeAllBackends();
616
+ unregisterInstance();
617
+ });
557
618
  const server = http.createServer(async (req, res) => {
558
619
  try {
559
620
  const url = new URL(req.url ?? "/", "http://localhost");
@@ -568,6 +629,10 @@ export function startInspector(opts) {
568
629
  });
569
630
  return new Promise((resolve, reject) => {
570
631
  server.once("error", reject);
571
- server.listen(opts.port, () => resolve(server));
632
+ server.listen(opts.port, () => {
633
+ const addr = server.address();
634
+ void registerInstance(typeof addr === "object" && addr ? addr.port : opts.port);
635
+ resolve(server);
636
+ });
572
637
  });
573
638
  }
@@ -0,0 +1,27 @@
1
+ import { type ProjectConfig, type SwitcherEntry } from "../config.js";
2
+ /**
3
+ * Workspace settings: read kraftwerk.yml for the UI and write the
4
+ * UI-editable subset (name, icon, switcher) back. Edits go through the
5
+ * yaml Document API so comments and every other key survive untouched;
6
+ * a missing kraftwerk.yml is created at the project root on first save.
7
+ */
8
+ export interface SettingsView {
9
+ root: string;
10
+ configPath: string;
11
+ exists: boolean;
12
+ config: ProjectConfig;
13
+ resolved: {
14
+ workflowsRoot: string | null;
15
+ outputDir: string;
16
+ port: number;
17
+ };
18
+ }
19
+ export interface SaveSettingsInput {
20
+ /** Omitted = untouched; empty string = remove the key. */
21
+ name?: string;
22
+ icon?: string;
23
+ /** Omitted = untouched; empty list = remove the key. */
24
+ switcher?: SwitcherEntry[];
25
+ }
26
+ export declare function getSettings(): Promise<SettingsView>;
27
+ export declare function saveSettings(input: SaveSettingsInput): Promise<SettingsView>;
@@ -0,0 +1,59 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { parseDocument } from "yaml";
4
+ import { resolveProject } from "../config.js";
5
+ import { getProjectRoot } from "./context.js";
6
+ export async function getSettings() {
7
+ const project = await resolveProject(getProjectRoot());
8
+ return {
9
+ root: project.root,
10
+ configPath: project.configPath ?? path.join(project.root, "kraftwerk.yml"),
11
+ exists: !!project.configPath,
12
+ config: project.config,
13
+ resolved: {
14
+ workflowsRoot: project.workflowsRoot ?? null,
15
+ outputDir: project.outputDir,
16
+ port: project.config.port ?? 1981,
17
+ },
18
+ };
19
+ }
20
+ function cleanSwitcher(value) {
21
+ if (!Array.isArray(value))
22
+ throw new Error("switcher must be a list");
23
+ return value.map((entry, i) => {
24
+ const name = typeof entry?.name === "string" ? entry.name.trim() : "";
25
+ const url = typeof entry?.url === "string" ? entry.url.trim() : "";
26
+ if (!name)
27
+ throw new Error(`switcher entry ${i + 1}: name is required`);
28
+ if (!/^https?:\/\//.test(url))
29
+ throw new Error(`switcher entry ${i + 1}: url must start with http:// or https://`);
30
+ const icon = typeof entry.icon === "string" ? entry.icon.trim() : "";
31
+ return icon ? { name, url, icon } : { name, url };
32
+ });
33
+ }
34
+ export async function saveSettings(input) {
35
+ if (input.name !== undefined && typeof input.name !== "string")
36
+ throw new Error("name must be a string");
37
+ if (input.icon !== undefined && typeof input.icon !== "string")
38
+ throw new Error("icon must be a string");
39
+ const switcher = input.switcher === undefined ? undefined : cleanSwitcher(input.switcher);
40
+ const project = await resolveProject(getProjectRoot());
41
+ const configPath = project.configPath ?? path.join(project.root, "kraftwerk.yml");
42
+ const raw = project.configPath ? await fs.readFile(configPath, "utf8") : "";
43
+ const doc = parseDocument(raw);
44
+ if (doc.errors.length > 0)
45
+ throw new Error(`${path.basename(configPath)}: ${doc.errors[0].message}`);
46
+ const setOrDelete = (key, value) => {
47
+ if (value === undefined)
48
+ return; // untouched
49
+ if (value === "" || (Array.isArray(value) && value.length === 0))
50
+ doc.delete(key);
51
+ else
52
+ doc.set(key, value);
53
+ };
54
+ setOrDelete("name", input.name?.trim());
55
+ setOrDelete("icon", input.icon?.trim());
56
+ setOrDelete("switcher", switcher);
57
+ await fs.writeFile(configPath, doc.toString());
58
+ return getSettings();
59
+ }
@@ -0,0 +1 @@
1
+ @font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/roboto-latin-400-normal-BqEyEoaF.woff2) format("woff2"),url(/assets/roboto-latin-400-normal-D27F5sTu.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/roboto-latin-500-normal-7RbcRiD8.woff2) format("woff2"),url(/assets/roboto-latin-500-normal-fsTFPL3E.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/roboto-latin-700-normal-BZpUvMxY.woff2) format("woff2"),url(/assets/roboto-latin-700-normal-YuyVweIx.woff) format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/roboto-mono-latin-400-normal-GekRknry.woff2) format("woff2"),url(/assets/roboto-mono-latin-400-normal-DBZPkcnn.woff) format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/roboto-mono-latin-500-normal-pxIOXZmA.woff2) format("woff2"),url(/assets/roboto-mono-latin-500-normal-D6j6AMzd.woff) format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/roboto-mono-latin-700-normal-foxDnrFi.woff2) format("woff2"),url(/assets/roboto-mono-latin-700-normal-CHYrj1DZ.woff) format("woff")}@font-face{font-family:Material Symbols Rounded;font-style:normal;font-weight:400;font-display:block;src:url(/assets/material-symbols-rounded-DxXFL64Y.woff2) format("woff2")}.material-symbols-rounded{font-family:Material Symbols Rounded;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-feature-settings:"liga"}:root{--font-sans: "Roboto";--font-mono: "Roboto Mono";--topbar-h: 53px;--primary: #f4efea;--on-primary: #191919;--primary-container: #3a3733;--on-primary-container: #f4efea;--secondary: #cfc9c0;--on-secondary: #24231f;--secondary-container: #3a3733;--on-secondary-container: #e8e2d9;--tertiary: #b8c2a2;--tertiary-container: #38402b;--on-tertiary-container: #d8e0c4;--error: #ffb4ab;--on-error: #690005;--error-container: #93000a;--on-error-container: #ffdad6;--success: #8fd48c;--success-container: #12411a;--on-success-container: #aaf2a4;--surface: #191919;--on-surface: #f4efea;--on-surface-variant: #b5b0a8;--surface-container-lowest: #121211;--surface-container-low: #201f1e;--surface-container: #262523;--surface-container-high: #2f2d2a;--surface-container-highest: #3a3733;--outline: #8f8a82;--outline-variant: #44423e;--inverse-surface: #f4efea;--inverse-on-surface: #2f2d2a;--elev-1: 0 1px 2px rgba(0, 0, 0, .3), 0 1px 3px 1px rgba(0, 0, 0, .15);--elev-2: 0 1px 2px rgba(0, 0, 0, .3), 0 2px 6px 2px rgba(0, 0, 0, .15);--elev-3: 0 1px 3px rgba(0, 0, 0, .3), 0 4px 8px 3px rgba(0, 0, 0, .15);color-scheme:dark}:root[data-theme=light]{--primary: #191919;--on-primary: #ffffff;--primary-container: #e7e0d7;--on-primary-container: #191919;--secondary: #5e5b56;--on-secondary: #ffffff;--secondary-container: #e7e0d7;--on-secondary-container: #2a2926;--tertiary: #66705a;--tertiary-container: #dde2cf;--on-tertiary-container: #232818;--error: #ba1a1a;--on-error: #ffffff;--error-container: #ffdad6;--on-error-container: #410002;--success: #2e6b30;--success-container: #d3ecd0;--on-success-container: #0b2e10;--surface: #f4efea;--on-surface: #191919;--on-surface-variant: #5e5b56;--surface-container-lowest: #ffffff;--surface-container-low: #faf7f3;--surface-container: #ece6df;--surface-container-high: #e6dfd6;--surface-container-highest: #ded6cb;--outline: #8a857c;--outline-variant: #d8d1c7;--inverse-surface: #2b2a27;--inverse-on-surface: #f6f2ec;--elev-1: 0 1px 2px rgba(32, 27, 19, .18), 0 1px 3px 1px rgba(32, 27, 19, .08);--elev-2: 0 1px 2px rgba(32, 27, 19, .18), 0 2px 6px 2px rgba(32, 27, 19, .08);--elev-3: 0 1px 3px rgba(32, 27, 19, .18), 0 4px 8px 3px rgba(32, 27, 19, .08);color-scheme:light}*{box-sizing:border-box;margin:0;padding:0}html{height:100%}body{min-height:100%;background:var(--surface);color:var(--on-surface);font-family:var(--font-sans),system-ui,sans-serif;font-size:14px;line-height:1.5;letter-spacing:.01em;-webkit-font-smoothing:antialiased}a{color:inherit;text-decoration:none}button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}code,pre,.mono{font-family:var(--font-mono),monospace}.ms{font-variation-settings:"FILL" 0,"wght" 400,"GRAD" 0,"opsz" 20;font-size:18px;line-height:1;vertical-align:-4px;flex:none;-webkit-user-select:none;user-select:none}.ms.ms-fill{font-variation-settings:"FILL" 1,"wght" 400,"GRAD" 0,"opsz" 20}.ms.ms-sm{font-size:15px;vertical-align:-3px}.ms.ms-lg{font-size:22px;vertical-align:-5px}.topbar{position:sticky;top:0;z-index:10;height:var(--topbar-h);display:flex;align-items:center;gap:14px;padding:0 20px;background:color-mix(in srgb,var(--surface-container) 92%,transparent);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--outline-variant)}.wordmark{display:flex;align-items:center;gap:10px}.home-link{width:26px;height:26px;border-radius:9px;display:grid;place-items:center;font-size:15px;line-height:1;transition:background .12s ease}.home-link:hover{background:color-mix(in srgb,var(--on-surface) 8%,transparent)}.wordmark small{font-size:12px;color:var(--on-surface-variant)}.wordmark .env-name{font-size:16px;font-weight:600;letter-spacing:-.01em;color:var(--on-surface);padding:4px 8px;border-radius:10px;white-space:nowrap;max-width:300px;overflow:hidden;text-overflow:ellipsis}.switcher-wrap{position:relative;display:inline-flex}.env-switch{display:inline-flex;align-items:center;gap:5px;transition:background .12s ease,color .12s ease}.env-switch:hover{background:color-mix(in srgb,var(--on-surface) 8%,transparent)}.env-switch svg{flex:none;opacity:.55}.switcher-pop{position:absolute;top:calc(100% + 10px);left:0;z-index:20;min-width:320px;max-width:min(440px,90vw);background:var(--surface-container-high);border-radius:16px;box-shadow:var(--elev-3);padding:8px}.switcher-head{padding:8px 12px 6px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.6px;color:var(--on-surface-variant)}.switcher-item{display:flex;align-items:center;gap:12px;padding:10px 12px;border-radius:12px;color:var(--on-surface);transition:background .12s ease}a.switcher-item:hover{background:color-mix(in srgb,var(--on-surface) 8%,transparent)}.switcher-item.current{cursor:default}.switcher-icon{flex:none;width:36px;height:36px;border-radius:11px;display:grid;place-items:center;background:var(--secondary-container);font-size:18px;line-height:1}.switcher-text{display:flex;flex-direction:column;min-width:0;gap:1px}.switcher-name{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.switcher-sub{font-size:11.5px;color:var(--on-surface-variant);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--success);margin-right:5px;vertical-align:1px}.settings-screen{max-width:860px;margin:0 auto;display:flex;flex-direction:column;gap:16px}.settings-head{display:flex;align-items:center;gap:12px}.settings-head h1{margin:0;font-size:22px;font-weight:600;letter-spacing:-.01em;display:inline-flex;align-items:center;gap:10px}.settings-head .spacer{flex:1}.settings-saved{font-size:12.5px;color:var(--success);display:inline-flex;align-items:center;gap:4px}.settings-saved .ms{vertical-align:0}.settings-err{font-size:12.5px;color:var(--error)}.settings-note{font-size:12px;color:var(--on-surface-variant)}.settings-note code{font-size:11px}.settings-row-x{align-self:flex-end;opacity:1;margin-bottom:6px}.settings-file{font-size:11px;color:var(--on-surface-variant);max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.settings-kv-list{display:flex;flex-direction:column;padding:6px 0 10px}.settings-kv{display:grid;grid-template-columns:110px 1fr;column-gap:14px;row-gap:1px;padding:8px 18px;align-items:baseline}.settings-kv+.settings-kv{border-top:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}.settings-kv code{font-size:12px;overflow-wrap:break-word;word-break:break-all}.settings-kv-hint{grid-column:2;font-size:11px;color:var(--on-surface-variant)}.switcher-hint{margin-left:auto;flex:none;font-size:10.5px;font-weight:600;letter-spacing:.4px;text-transform:uppercase;color:var(--on-surface-variant);padding:2px 8px;border-radius:999px;border:1px solid var(--outline-variant)}.topbar .spacer{flex:1}.topbar nav{display:flex;gap:4px;position:absolute;left:50%;transform:translate(-50%)}@media(max-width:1100px){.topbar nav{position:static;transform:none;margin-left:12px}}.topbar nav a{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:500;letter-spacing:.01em;text-transform:capitalize;color:var(--on-surface-variant);padding:6px 14px;border-radius:999px;transition:background .12s ease,color .12s ease}.topbar nav a .ms{font-size:17px}.topbar nav a:hover{color:var(--on-surface);background:color-mix(in srgb,var(--on-surface) 8%,transparent)}.topbar nav .nav-apart{margin-left:28px;position:relative}.topbar nav .nav-apart:before{content:"";position:absolute;left:-16px;top:50%;height:18px;width:1px;transform:translateY(-50%);background:var(--outline-variant)}.info-wrap{position:relative;display:inline-flex}.info-btn{display:grid;place-items:center;width:32px;height:32px;border-radius:50%;color:var(--on-surface-variant);transition:background .12s ease,color .12s ease}.info-btn:hover{background:color-mix(in srgb,var(--on-surface) 8%,transparent);color:var(--on-surface)}.info-pop{position:absolute;top:calc(100% + 8px);right:0;z-index:20;min-width:340px;max-width:min(480px,90vw);background:var(--surface-container-high);border-radius:12px;box-shadow:var(--elev-2);padding:8px 0}.info-row{display:flex;flex-direction:column;gap:2px;padding:8px 16px}.info-row+.info-row{border-top:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}.info-v{font-size:13px;color:var(--on-surface)}.info-path{font-size:11px;color:var(--on-surface-variant);overflow-wrap:break-word;word-break:break-all}.info-actions{flex-direction:row;align-items:center;justify-content:space-between;flex-wrap:wrap}.info-actions .theme-btn{flex:none}.theme-btn,.update-btn{border:1px solid var(--outline);border-radius:999px;padding:6px 14px;font-size:12.5px;font-weight:500;color:var(--on-surface-variant);transition:background .12s ease,color .12s ease}.theme-btn:hover,.update-btn:hover:not(:disabled){background:color-mix(in srgb,var(--primary) 10%,transparent);color:var(--on-surface)}.update-btn{display:inline-flex;align-items:center;gap:6px;flex:none;text-decoration:none}.update-btn:disabled{opacity:.6;cursor:default}.update-btn .ms{vertical-align:0}.update-result{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--on-surface-variant)}.update-result .ms{vertical-align:0;color:var(--success)}.update-result.newer{color:var(--primary);font-weight:500;flex-basis:100%}.update-result.newer code{font-size:11px}.relaunch-note{margin-right:10px;padding:4px 12px;border-radius:999px;font:inherit;font-size:12px;cursor:pointer;color:var(--primary);border:1px solid var(--primary);background:color-mix(in srgb,var(--primary) 10%,transparent)}.relaunch-note:hover{background:color-mix(in srgb,var(--primary) 18%,transparent)}.relaunch-note:disabled{opacity:.7;cursor:default}.expert-toggle{display:inline-flex;align-items:center;gap:7px;padding:4px 8px;margin-right:2px;border-radius:999px;font-family:var(--font-mono),monospace;font-size:11px;letter-spacing:.5px;color:var(--on-surface-variant);transition:color .12s ease}.expert-toggle:hover{color:var(--on-surface)}.expert-track{position:relative;width:26px;height:15px;border-radius:999px;background:color-mix(in srgb,var(--on-surface) 14%,transparent);transition:background .14s ease}.expert-knob{position:absolute;top:2px;left:2px;width:11px;height:11px;border-radius:50%;background:var(--surface);transition:left .14s ease,background .14s ease}.expert-toggle.on{color:var(--on-surface)}.expert-toggle.on .expert-track{background:var(--primary)}.expert-toggle.on .expert-knob{left:13px;background:var(--on-primary, var(--surface))}html[data-expert=off] .topbar nav,html[data-expert=off] .chat-thread .detail-head .chip.agent,html[data-expert=off] .chat-thread .detail-head .rid{display:none}.shell{max-width:1240px;margin:0 auto;padding:26px 20px 80px}.microlabel{font-size:11px;font-weight:500;letter-spacing:.045em;text-transform:capitalize;color:var(--on-surface-variant)}.num{font-variant-numeric:tabular-nums}.lamp{width:9px;height:9px;border-radius:50%;flex:none;position:relative}.lamp.ok{background:var(--success)}.lamp.failed,.lamp.blocked{background:var(--error)}.lamp.aborted{background:var(--outline-variant)}.lamp.pending{background:transparent;border:1.5px solid var(--outline)}.lamp.running{background:var(--primary);animation:lamp-pulse 1.4s ease-in-out infinite}@keyframes lamp-pulse{0%,to{box-shadow:0 0 color-mix(in srgb,var(--primary) 45%,transparent);opacity:1}50%{box-shadow:0 0 0 5px color-mix(in srgb,var(--primary) 18%,transparent);opacity:.8}}.status-word{font-size:12px;font-weight:500;letter-spacing:.03em;text-transform:capitalize}.status-word.ok{color:var(--success)}.status-word.failed,.status-word.blocked{color:var(--error)}.status-word.running{color:var(--primary)}.status-word.aborted,.status-word.pending{color:var(--on-surface-variant)}.page-head{display:flex;align-items:baseline;gap:14px;margin:6px 2px 20px}.page-head .spacer{flex:1}.page-head h1{font-size:24px;font-weight:400;letter-spacing:0}.page-head .count{color:var(--on-surface-variant);font-size:13px}.run-list{display:grid;gap:10px}.run-card{display:grid;grid-template-columns:12px 200px 1fr auto;gap:8px 16px;align-items:center;background:var(--surface-container-low);border:0;border-radius:12px;padding:14px 20px;box-shadow:var(--elev-1);transition:box-shadow .15s ease,background .15s ease}.run-card:hover{background:color-mix(in srgb,var(--on-surface) 5%,var(--surface-container-low));box-shadow:var(--elev-2)}.run-card .rid{font-family:var(--font-mono),monospace;font-size:12.5px;color:var(--on-surface-variant)}.run-card .wf{font-weight:500;font-size:14px}.run-card .req{color:var(--on-surface-variant);font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:52ch}.run-card .meta{display:flex;gap:18px;align-items:center;font-family:var(--font-mono),monospace;font-size:12px;color:var(--on-surface-variant)}.progress-track{width:90px;height:4px;border-radius:999px;background:var(--surface-container-highest);overflow:hidden}.progress-track i{display:block;height:100%;background:var(--primary);border-radius:999px}.run-card.is-ok .progress-track i{background:var(--success)}.run-card.is-failed .progress-track i{background:var(--error)}.empty{border:1px dashed var(--outline-variant);border-radius:16px;padding:40px;text-align:center;color:var(--on-surface-variant)}.crumbs{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--on-surface-variant);margin-bottom:14px}.crumbs a:hover{color:var(--primary)}.crumbs .sep{color:var(--outline-variant)}.detail-head{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;margin-bottom:6px}.detail-head h1{font-size:22px;font-weight:400}.detail-head .rid{font-family:var(--font-mono),monospace;font-size:12px;color:var(--on-surface-variant)}.detail-req{color:var(--on-surface-variant);font-size:13px;margin-bottom:18px;max-width:90ch}.statgrid{display:flex;flex-wrap:wrap;gap:26px;margin-bottom:22px}.stat .microlabel{margin-bottom:1px}.stat .v{font-family:var(--font-mono),monospace;font-size:15px;font-weight:500}.columns{display:grid;grid-template-columns:minmax(430px,5fr) minmax(360px,4fr);gap:18px;align-items:start}@media(max-width:1020px){.columns{grid-template-columns:1fr}}.panel{background:var(--surface-container-low);border:0;border-radius:16px;box-shadow:var(--elev-1);overflow:hidden}.panel-head{display:flex;align-items:center;gap:10px;padding:12px 18px;border-bottom:1px solid var(--outline-variant);background:var(--surface-container)}.panel-head .microlabel{color:var(--on-surface-variant);font-size:12px}.panel-head .spacer{flex:1}.phases{padding:6px 0}.phase-row{position:relative;padding:10px 18px 10px 42px}.phase-row+.phase-row{border-top:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}.phase-row .lamp{position:absolute;left:19px;top:16px}.phase-row:before{content:"";position:absolute;left:23px;top:0;bottom:0;width:1px;background:var(--outline-variant)}.phase-row:first-child:before{top:16px}.phase-row:last-child:before{bottom:auto;height:16px}.phase-row .lamp{z-index:1}.phase-top{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}.phase-name{font-weight:500;font-size:14px}.chip{font-family:var(--font-mono),monospace;font-size:11px;border:1px solid var(--outline-variant);border-radius:8px;padding:2px 10px;color:var(--on-surface-variant)}.chip.agent{border-color:transparent;background:var(--secondary-container);color:var(--on-secondary-container)}.phase-top .right{margin-left:auto;display:flex;gap:14px;font-family:var(--font-mono),monospace;font-size:11.5px;color:var(--on-surface-variant)}.phase-sub{margin-top:3px;font-size:12.5px;color:var(--on-surface-variant);max-width:72ch}.phase-activity{margin-top:3px;font-family:var(--font-mono),monospace;font-size:11.5px;color:var(--primary)}.phase-activity:before{content:"▸ "}.gate-line{margin-top:5px;display:flex;flex-wrap:wrap;gap:6px}.gate{display:inline-flex;align-items:center;gap:5px;font-family:var(--font-mono),monospace;font-size:11px;border-radius:8px;padding:2px 10px;background:var(--success-container);color:var(--on-success-container)}.gate.failed{background:var(--error-container);color:var(--on-error-container)}.gate-fail-msg{margin-top:4px;font-size:12px;color:var(--error)}.file-list{max-height:300px;overflow:auto}.file-row{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:8px 18px;font-family:var(--font-mono),monospace;font-size:12.5px;border-bottom:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent);color:var(--on-surface-variant);transition:background .1s ease}.file-row:last-child{border-bottom:0}.file-row:hover{background:color-mix(in srgb,var(--on-surface) 6%,transparent);color:var(--on-surface)}.file-row.active{background:var(--secondary-container);color:var(--on-secondary-container)}.file-row .fname{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-row .fsize{color:var(--outline);font-size:11px}.viewer{border-top:1px solid var(--outline-variant)}.viewer-body pre{padding:14px 18px;overflow:auto;max-height:560px;font-size:12px;line-height:1.55;white-space:pre-wrap;word-break:break-word;color:var(--on-surface-variant)}.viewer-body iframe{width:100%;height:620px;border:0;background:#fff;display:block}.viewer-body img{max-width:100%;display:block;padding:14px 18px}.viewer-note{padding:6px 18px;font-size:11px;color:var(--on-surface-variant);border-bottom:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}.open-raw{font-size:12px;font-weight:500;color:var(--primary);border:1px solid var(--outline);border-radius:999px;padding:3px 12px;transition:background .12s ease}.open-raw:hover{background:color-mix(in srgb,var(--primary) 10%,transparent)}.live-note{display:inline-flex;align-items:center;gap:7px;font-size:11px;color:var(--on-surface-variant)}.wf-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px}.wf-card{display:flex;flex-direction:column;gap:6px;background:var(--surface-container-low);border:0;border-radius:16px;padding:18px 20px;box-shadow:var(--elev-1);transition:box-shadow .15s ease,background .15s ease}.wf-card:hover{background:color-mix(in srgb,var(--on-surface) 5%,var(--surface-container-low));box-shadow:var(--elev-2)}.wf-card-head{display:flex;align-items:baseline;gap:10px}.wf-name{font-weight:500;font-size:16px}.wf-desc{color:var(--on-surface-variant);font-size:13px;flex:1}.wf-meta{display:flex;gap:8px;font-family:var(--font-mono),monospace;font-size:11.5px;color:var(--on-surface-variant)}.wf-workspace{font-size:11.5px;color:var(--on-surface-variant);white-space:pre-wrap}.aid-0{--aid: var(--primary)}.aid-1{--aid: #4fb8a8}.aid-2{--aid: #a78bfa}.aid-3{--aid: #e5793b}.agent-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:0}.agent-card{padding:14px 18px;border-right:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent);border-bottom:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}.agent-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.agent-head b{font-size:14px;font-weight:500}.agent-head .spacer{flex:1}.agent-id{font-size:11px;color:var(--on-surface-variant)}.agent-dot{width:10px;height:10px;border-radius:50%;background:var(--aid)}.agent-tools{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.tool-chip{font-family:var(--font-mono),monospace;font-size:11px;border:1px solid var(--outline-variant);border-radius:8px;padding:1px 8px;color:var(--on-surface-variant)}.agent-persona{margin-top:8px;font-size:12px;color:var(--on-surface-variant);line-height:1.55;white-space:pre-wrap}.pipeline{padding:8px 0}.step-node{position:relative;display:flex;gap:14px;padding:12px 18px}.step-node+.step-node{border-top:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}.step-node:before{content:"";position:absolute;left:31px;top:0;bottom:0;width:1px;background:var(--outline-variant)}.step-node:first-child:before{top:18px}.step-node:last-child:before{bottom:auto;height:18px}.step-index{position:relative;z-index:1;flex:none;width:26px;height:26px;border-radius:50%;margin-top:1px;display:grid;place-items:center;font-family:var(--font-mono),monospace;font-size:11.5px;font-weight:700;background:color-mix(in srgb,var(--aid) 18%,var(--surface-container-low));border:1px solid color-mix(in srgb,var(--aid) 55%,var(--outline-variant));color:var(--aid)}.step-index.is-script{--aid: var(--on-surface-variant)}.step-body{flex:1;min-width:0}.agent-chip{border-color:color-mix(in srgb,var(--aid) 50%,var(--outline-variant));color:var(--aid);background:transparent}.step-source{margin-top:6px}.step-source summary{cursor:pointer;font-size:12px;font-weight:500;color:var(--on-surface-variant);-webkit-user-select:none;user-select:none}.step-source summary:hover{color:var(--primary)}.step-source pre{margin-top:6px;padding:10px 12px;border:0;border-radius:12px;background:var(--surface-container-high);font-size:11.5px;line-height:1.55;white-space:pre-wrap;word-break:break-word;color:var(--on-surface-variant);max-height:360px;overflow:auto}.gate.neutral{background:var(--surface-container-high);color:var(--on-surface-variant);border:0}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--outline-variant);border-radius:999px;border:2px solid transparent;background-clip:content-box}::-webkit-scrollbar-track{background:transparent}.run-form{display:flex;gap:10px}.run-form input[type=text]{flex:1;font:13px/1.4 var(--font-mono),monospace;color:var(--on-surface);background:var(--surface-container-high);border:1px solid transparent;border-radius:999px;padding:10px 18px;outline:none;transition:border-color .12s ease,background .12s ease}.run-form input[type=text]:focus{border-color:var(--primary);background:var(--surface-container-highest)}.run-btn{font:500 13.5px/1 var(--font-sans),sans-serif;white-space:nowrap;color:var(--on-primary);background:var(--primary);border-radius:999px;padding:11px 24px;transition:box-shadow .12s ease,filter .12s ease}.run-btn:hover{box-shadow:var(--elev-1);filter:brightness(1.06)}.run-btn:disabled{opacity:.38;cursor:not-allowed;filter:none;box-shadow:none}.run-btn.tonal{color:var(--on-secondary-container);background:var(--secondary-container)}.run-opts{display:flex;flex-wrap:wrap;gap:6px 22px;margin-top:12px}.run-opts label{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--on-surface-variant);cursor:pointer}.run-opts input[type=checkbox]{accent-color:var(--primary);width:15px;height:15px}.run-opts .opt-hint{color:var(--outline)}.sandbox-chip{border:1px solid var(--outline-variant);color:var(--on-surface-variant)}.stop-btn{font:500 13px/1 var(--font-sans),sans-serif;color:var(--error);background:transparent;border:1px solid var(--outline);border-radius:999px;padding:8px 18px;transition:background .12s ease,border-color .12s ease}.stop-btn:hover{background:color-mix(in srgb,var(--error) 10%,transparent);border-color:var(--error)}.stop-btn:disabled{opacity:.38;cursor:default}.shell:has(.runs-screen){max-width:none;padding:0}.runs-screen{display:grid;grid-template-columns:300px minmax(0,1fr);align-items:start}.runs-side{position:sticky;top:var(--topbar-h);height:calc(100vh - var(--topbar-h));display:flex;flex-direction:column;border-right:1px solid var(--outline-variant);background:var(--surface-container-low)}.side-head{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--outline-variant);background:var(--surface-container)}.side-head .spacer{flex:1}.side-list{flex:1;overflow-y:auto;padding:6px}.side-pinned{padding:6px;border-top:1px solid var(--outline-variant)}.side-pinned .side-row{margin-bottom:0}.side-row{display:flex;align-items:flex-start;gap:9px;padding:9px 12px;border-radius:12px;margin-bottom:2px;transition:background .1s ease}.side-row .lamp{margin-top:4px}.side-row:hover{background:color-mix(in srgb,var(--on-surface) 6%,transparent)}.side-row.active{background:var(--secondary-container)}.side-row.active .side-wf{color:var(--on-secondary-container)}.side-row-body{flex:1;min-width:0}.side-row-top{display:flex;align-items:baseline;gap:8px}.side-wf{font-weight:500;font-size:12.5px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.side-when{font-family:var(--font-mono),monospace;font-size:10.5px;color:var(--on-surface-variant)}.side-row-sub{display:flex;align-items:baseline;gap:8px;margin-top:1px}.side-row-sub .side-when{font-size:9px;opacity:.8}.side-req{flex:1;font-size:11.5px;color:var(--on-surface-variant);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.side-row.active .side-req{color:var(--on-secondary-container)}.side-meta{font-family:var(--font-mono),monospace;font-size:10.5px;color:var(--on-surface-variant)}.runs-main{padding:18px 22px 40px;min-width:0}.runs-main:has(>.chat-main){padding:0}.runs-main .detail-head .spacer{flex:1}.tabs{display:flex;gap:0;background:transparent;border:1px solid var(--outline);border-radius:999px;padding:0;overflow:hidden}.tabs button{font-size:12.5px;font-weight:500;letter-spacing:.01em;text-transform:capitalize;color:var(--on-surface-variant);padding:7px 18px;border-radius:0;transition:background .12s ease,color .12s ease}.tabs button+button{border-left:1px solid var(--outline)}.tabs button:hover{background:color-mix(in srgb,var(--on-surface) 6%,transparent);color:var(--on-surface)}.tabs button.active{background:var(--secondary-container);color:var(--on-secondary-container);box-shadow:none}.run-tab{max-width:1080px}.art-layout{display:grid;grid-template-columns:280px minmax(0,1fr);gap:14px;height:calc(100vh - 172px);min-height:420px}.art-files{display:flex;flex-direction:column;min-height:0}.art-files .file-list{flex:1;max-height:none}.art-viewer{display:flex;flex-direction:column;min-height:0}.art-viewer .viewer{flex:1;display:flex;flex-direction:column;min-height:0;border-top:0}.art-viewer .viewer-body{flex:1;min-height:0}.art-viewer .viewer-body iframe{height:100%}.art-viewer .viewer-body pre{max-height:none;height:100%;box-sizing:border-box}.art-viewer .viewer-body img{max-height:100%;object-fit:contain}.art-viewer .empty{flex:1;display:grid;place-items:center}.md-toolbar{display:flex;align-items:center;gap:12px}.md-toolbar .tabs button{font-size:11px;padding:3px 12px;text-transform:none}.md-body{height:100%;box-sizing:border-box;overflow:auto;padding:16px 22px;font-size:13.5px;line-height:1.6;color:var(--on-surface)}.md-body>:first-child{margin-top:0}.md-body h1,.md-body h2,.md-body h3,.md-body h4{margin:1.4em 0 .5em;line-height:1.25;font-weight:600}.md-body h1{font-size:20px}.md-body h2{font-size:16px;border-bottom:1px solid var(--outline-variant);padding-bottom:4px}.md-body h3{font-size:14px}.md-body p,.md-body ul,.md-body ol{margin:.6em 0}.md-body ul,.md-body ol{padding-left:1.6em}.md-body li+li{margin-top:.2em}.md-body a{color:var(--primary)}.md-body code{font-family:var(--font-mono),monospace;font-size:12px;background:color-mix(in srgb,var(--on-surface) 8%,transparent);padding:1px 5px;border-radius:4px}.md-body pre{background:color-mix(in srgb,var(--on-surface) 6%,transparent);border:1px solid var(--outline-variant);border-radius:8px;padding:10px 14px;overflow-x:auto;margin:.8em 0}.md-body pre code{background:none;padding:0}.md-body blockquote{margin:.8em 0;padding:2px 14px;border-left:3px solid var(--outline);color:var(--on-surface-variant)}.md-body table{border-collapse:collapse;margin:.8em 0;font-size:12.5px}.md-body th,.md-body td{border:1px solid var(--outline-variant);padding:5px 10px;text-align:left}.md-body th{background:color-mix(in srgb,var(--on-surface) 5%,transparent)}.md-body hr{border:0;border-top:1px solid var(--outline-variant);margin:1.2em 0}.md-body img{max-width:100%}@media(max-width:940px){.runs-screen{grid-template-columns:1fr}.runs-side{display:none}.art-layout{grid-template-columns:1fr;height:auto}.art-files .file-list{max-height:240px}.art-viewer .viewer-body iframe{height:560px}}.chat-main{display:flex;flex-direction:column;height:calc(100vh - var(--topbar-h));padding:16px 20px}.chat-thread{display:flex;flex-direction:column;flex:1;min-height:0;max-width:980px;width:100%;margin:0 auto}.chat-thread .detail-head{flex:none}.chat-thread .detail-head .rid{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:34ch}.chat-scroll{flex:1;min-height:0;overflow-y:auto;padding:14px 2px 20px;display:flex;flex-direction:column;gap:10px}.chat-scroll .empty{margin:auto;border:0}.msg{max-width:76ch;white-space:pre-wrap;word-break:break-word;font-size:14px;line-height:1.6}.msg.user{align-self:flex-end;background:var(--primary-container);color:var(--on-primary-container);border:0;border-radius:20px 20px 6px;padding:10px 16px}.msg.agent{align-self:flex-start;background:var(--surface-container);border:0;border-radius:20px 20px 20px 6px;padding:10px 16px}.msg.agent.chat-md{white-space:normal;height:auto;overflow:visible;padding:10px 16px;font-size:14px}.msg.agent.chat-md img{border-radius:10px;margin:4px 0;display:block}.msg.agent.chat-md pre{max-width:100%}.msg.error{align-self:flex-start;color:var(--error);font-size:12.5px}.msg.thought{align-self:flex-start;max-width:76ch}.msg.thought summary{cursor:pointer;font-size:12px;font-weight:500;color:var(--on-surface-variant);-webkit-user-select:none;user-select:none}.msg.thought div{margin-top:5px;padding:8px 12px;border-left:2px solid var(--outline-variant);color:var(--on-surface-variant);font-size:12px;white-space:pre-wrap;word-break:break-word}.tool-card{align-self:flex-start;display:inline-flex;align-items:flex-start;gap:8px;font-family:var(--font-mono),monospace;font-size:11px;color:var(--on-surface-variant);background:transparent;border:0;padding:0 2px;max-width:90ch}.tool-card+.tool-card{margin-top:-6px}.tool-card .lamp{margin-top:4px;width:7px;height:7px}.tool-card .chip.tool-kind{flex-shrink:0;border:0;background:transparent;padding:0;font-size:10px;text-transform:uppercase;letter-spacing:.5px;min-width:64px}.tool-card .tool-title{white-space:pre-wrap;word-break:break-word;overflow:visible;line-height:1.5;min-width:0}.perm-card{align-self:flex-start;border:0;background:var(--tertiary-container);color:var(--on-tertiary-container);border-radius:16px;padding:12px 16px;max-width:76ch;box-shadow:var(--elev-1)}.perm-card .perm-title{font-size:13.5px}.perm-card .perm-title .microlabel{color:var(--tertiary);margin-right:8px;font-weight:700}:root[data-theme=light] .perm-card .perm-title .microlabel{color:var(--on-tertiary-container)}.perm-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.perm-btn{font:500 13px/1 var(--font-sans),sans-serif;border-radius:999px;padding:8px 18px;border:1px solid var(--outline);transition:background .12s ease,filter .12s ease}.perm-btn.allow{color:var(--on-primary);background:var(--primary);border-color:transparent}.perm-btn.allow:hover{filter:brightness(1.06);box-shadow:var(--elev-1)}.perm-btn.deny{color:inherit}.perm-btn.deny:hover{border-color:var(--error);color:var(--error)}.perm-resolved{margin-top:6px;font-size:12px;color:var(--on-surface-variant);font-family:var(--font-mono),monospace}.chat-working{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--on-surface-variant)}.composer{flex:none;display:flex;gap:10px;align-items:flex-end;padding:12px 0 4px;border-top:1px solid var(--outline-variant);position:relative}.skill-menu{position:absolute;bottom:100%;left:0;right:0;margin-bottom:6px;display:flex;flex-direction:column;overflow:hidden;background:var(--surface-container-high);border:1px solid var(--outline-variant);border-radius:14px;box-shadow:var(--elev-1);z-index:5}.skill-menu button{display:flex;align-items:baseline;gap:6px;text-align:left;padding:9px 14px;font-size:13px;background:transparent;border:0}.skill-menu button b{font-weight:500;font-family:var(--font-mono),monospace;font-size:12.5px}.skill-menu button span{color:var(--on-surface-variant);font-size:12px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.skill-menu button .skill-src{margin-left:auto;flex:none;font-size:10.5px;text-transform:uppercase;letter-spacing:.04em}.skill-menu button:hover,.skill-menu button.active{background:color-mix(in srgb,var(--on-surface) 7%,transparent)}.composer textarea{flex:1;resize:none;font:14px/1.5 var(--font-sans),sans-serif;color:var(--on-surface);background:var(--surface-container-high);border:1px solid transparent;border-radius:24px;padding:12px 18px;outline:none;transition:border-color .12s ease,background .12s ease}.composer textarea:focus{border-color:var(--primary);background:var(--surface-container-highest)}.new-chat{max-width:640px;margin:0 auto;width:100%}.new-chat-panel{overflow:visible}.agent-pick{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;padding:14px 16px}.agent-pick-btn{display:flex;flex-direction:column;gap:3px;text-align:left;border:1px solid var(--outline-variant);border-radius:12px;padding:12px 14px;background:transparent;transition:background .12s ease,border-color .12s ease}.agent-pick-btn b{font-size:13.5px;font-weight:500}.agent-pick-btn span{font-size:11.5px;color:var(--on-surface-variant)}.agent-pick-btn:hover{background:color-mix(in srgb,var(--on-surface) 5%,transparent)}.agent-pick-btn.active{border-color:transparent;background:var(--secondary-container);color:var(--on-secondary-container)}.agent-pick-btn.active span{color:var(--on-secondary-container)}@media(max-width:940px){.chat-main{height:auto;min-height:calc(100vh - var(--topbar-h))}.agent-pick{grid-template-columns:1fr}}.know-intro{padding:12px 18px;font-size:13px;line-height:1.6;color:var(--on-surface-variant)}.know-intro code{font-size:11.5px}.know-newbundle{display:flex;gap:10px;padding:14px 18px}.know-newbundle input{flex:1;font:13px/1.4 var(--font-mono),monospace;color:var(--on-surface);background:var(--surface-container-high);border:1px solid transparent;border-radius:999px;padding:10px 18px;outline:none;transition:border-color .12s ease,background .12s ease}.know-newbundle input:focus{border-color:var(--primary);background:var(--surface-container-highest)}.know-table{width:100%;border-collapse:collapse;font-size:13px}.know-table td{padding:9px 18px;border-bottom:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent);vertical-align:baseline}.know-table tr:last-child td{border-bottom:none}.know-table a{color:var(--on-surface);text-decoration:none}.know-table a:hover b{color:var(--primary)}.know-id{font-family:var(--font-mono),monospace;font-size:11px;color:var(--on-surface-variant);margin-left:8px}.know-type{font-size:11.5px;color:var(--on-surface-variant);white-space:nowrap}.know-flags{text-align:right;white-space:nowrap}.chip.trust.unverified{color:var(--on-surface-variant)}.chip.trust.machine-confirmed{border-color:transparent;background:var(--secondary-container);color:var(--on-secondary-container)}.chip.trust.human-reviewed{border-color:transparent;color:var(--on-success-container);background:var(--success-container)}.chip.stale,.chip.deprecated{border-color:transparent;color:var(--on-error-container);background:var(--error-container)}.chip.draft{border-color:color-mix(in srgb,var(--primary) 45%,var(--outline-variant));color:var(--primary)}.dash{width:100%;max-width:1180px;margin:0 auto;padding:24px 28px 40px;box-sizing:border-box}.dash-actions{display:flex;gap:10px;margin:0 0 18px}.wf-pick-wrap{position:relative}.wf-pick-pop{position:absolute;top:calc(100% + 6px);left:0;z-index:30;min-width:280px;max-height:340px;overflow-y:auto;background:var(--surface-container);border:1px solid var(--outline-variant);border-radius:12px;padding:6px;box-shadow:var(--elev-2, 0 8px 24px rgb(0 0 0 / .18));display:flex;flex-direction:column}.wf-pick-item{display:flex;flex-direction:column;gap:2px;padding:8px 10px;border-radius:8px;text-decoration:none;color:inherit}.wf-pick-item:hover{background:color-mix(in srgb,var(--on-surface) 6%,transparent)}.wf-pick-name{font-size:13px;font-weight:500}.wf-pick-desc{font-size:11.5px;color:var(--on-surface-variant)}.wf-pick-empty{padding:8px 10px;font-size:12px;color:var(--on-surface-variant)}.dash-team{display:grid;grid-template-columns:repeat(6,1fr);gap:14px;margin-bottom:18px}@media(max-width:1100px){.dash-team{grid-template-columns:repeat(4,1fr)}}@media(max-width:800px){.dash-team{grid-template-columns:repeat(3,1fr)}}@media(max-width:560px){.dash-team{grid-template-columns:repeat(2,1fr)}}.dash-team-empty{margin-bottom:18px}.dash-member{display:flex;flex-direction:column;background:var(--surface-container-low, var(--surface-container));border:1px solid var(--outline-variant);border-radius:16px;overflow:hidden;cursor:pointer}.dash-member:hover{border-color:var(--outline)}.lamp.idle{background:transparent;border:1.5px solid var(--outline-variant)}.dash-member-id{display:flex;flex-direction:column;align-items:center;gap:6px;padding:20px 16px 12px;text-align:center;text-decoration:none;color:inherit;flex:1}.dash-member-id:hover .dash-member-name{color:var(--primary)}.dash-member-name{font-size:15px;font-weight:600}.dash-member-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}.dash-member-state{font-size:11px;color:var(--on-surface-variant)}.dash-member-state a{color:var(--primary);text-decoration:none}.dash-chat-btn{padding:4px 13px;font-size:12px;color:var(--primary);background:transparent;border:1px solid var(--outline)}.dash-chat-btn:hover{background:color-mix(in srgb,var(--primary) 10%,transparent);box-shadow:none;filter:none}.dash-feed{margin:0}.agent-avatar{position:relative;flex:none;width:38px;height:38px;border-radius:50%;display:grid;place-items:center;background:var(--secondary-container);font-size:19px;line-height:1}.agent-avatar .lamp{position:absolute;right:-1px;bottom:-1px;width:10px;height:10px;border:2px solid var(--surface-container-low)}.agent-avatar .lamp.idle{background:var(--outline-variant)}.agent-avatar.sm{width:30px;height:30px;font-size:15px}.agent-avatar.lg{width:56px;height:56px;font-size:28px}.agent-avatar.lg .lamp{width:12px;height:12px;right:1px;bottom:1px}.dash-alert{display:flex;align-items:center;gap:8px;width:100%;margin:0 0 14px;padding:9px 14px;text-align:left;cursor:pointer;font-size:12.5px;border:1px solid color-mix(in srgb,var(--error) 40%,transparent);border-radius:12px;background:var(--error-container);color:var(--on-error-container)}.dash-alert:hover{filter:brightness(1.04)}.dash-feed-filter{display:flex;gap:6px}.feed-chip{font-size:11px;border:1px solid var(--outline-variant);border-radius:8px;padding:2px 10px;background:transparent;color:var(--on-surface-variant);cursor:pointer}.feed-chip:hover{color:var(--on-surface)}.feed-chip.on{border-color:transparent;background:var(--primary-container);color:var(--on-primary-container)}.feed-chip.on.failed{background:var(--error-container);color:var(--on-error-container)}.feed-day{padding:12px 18px 3px;border-top:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}.feed-group:first-child .feed-day{border-top:none;padding-top:6px}.feed-group+.feed-group .m3-row{border-top:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}.feed-group .feed-day+.m3-row{border-top:none}.dash-mini{display:flex;gap:18px;font-size:12px;color:var(--on-surface-variant);flex-wrap:wrap}.dash-mini a{color:inherit;text-decoration:none}.dash-mini a:hover{color:var(--primary);text-decoration:underline}.dash-mini b{font-weight:600;color:var(--on-surface)}.dash-mini a:hover b{color:var(--primary)}.chip.dash-kind{flex:none}.chip.status{flex:none;border-color:transparent;font-family:var(--font-sans),sans-serif;font-weight:500}.chip.status.ok{background:var(--success-container);color:var(--on-success-container)}.chip.status.failed{background:var(--error-container);color:var(--on-error-container)}.chip.status.running{background:var(--primary-container);color:var(--on-primary-container)}.chip.status.aborted{background:var(--surface-container-high);color:var(--on-surface-variant)}.chip.dash-kind.run{border-color:transparent;background:var(--primary-container);color:var(--on-primary-container)}.chip.dash-kind.session{border-color:transparent;background:var(--tertiary-container);color:var(--on-tertiary-container)}.chip.dash-kind.knowledge{border-color:transparent;background:var(--success-container);color:var(--on-success-container)}html[data-expert=off] .dash-mini,html[data-expert=off] .chip.dash-kind{display:none}.lamp.dim{background:var(--outline-variant)}.chip.skill-src{flex:none}.chip.skill-src.workspace{border-color:transparent;background:var(--success-container);color:var(--on-success-container)}.chip.skill-src.project,.chip.skill-src.user{color:var(--on-surface-variant)}.chip.skill-src.agent{border-color:transparent;background:var(--secondary-container);color:var(--on-secondary-container)}.skills-local-head{border-top:1px solid var(--outline-variant);margin-top:10px}.skill-desc{margin:-6px 2px 14px}.skill-path{word-break:break-all}.know-sub{display:flex;align-items:center;gap:8px;margin:-8px 2px 14px}.know-sub .rid{font-family:var(--font-mono),monospace;font-size:12px;color:var(--on-surface-variant)}.know-meta{display:flex;flex-direction:column;gap:8px;padding:12px 18px;font-size:13px}.know-meta>div{display:flex;gap:14px;align-items:baseline}.know-meta .microlabel{width:90px;flex:none}.know-verify-entry{display:inline-block;margin-right:14px}.know-folder-row td{padding:10px 18px 4px;border-bottom:none}.know-folder{font-family:var(--font-mono),monospace;font-size:11px;color:var(--on-surface-variant);letter-spacing:.04em}.know-indent{padding-left:32px!important}.side-group{border-radius:10px}.side-group+.side-group{margin-top:12px}.side-group.drop-over{outline:1.5px dashed var(--primary);outline-offset:-1.5px;background:color-mix(in srgb,var(--primary) 7%,transparent)}.side-group-head{display:flex;align-items:center;gap:6px;padding:6px 10px 2px}.side-group-count{font-size:10px;color:var(--on-surface-variant)}.side-group-x{padding:0 4px;font:inherit;font-size:11px;color:var(--on-surface-variant);background:transparent;border:none;cursor:pointer;opacity:0}.side-group:hover .side-group-x{opacity:1}.side-group-x:hover{color:var(--on-surface)}.side-group-empty{padding:6px 10px 8px;font-size:11px;color:var(--on-surface-variant)}.side-row.dragging{opacity:.4}.side-group-add{display:block;margin:12px 10px 4px;padding:4px 10px;font:inherit;font-size:11px;color:var(--on-surface-variant);background:transparent;border:1px dashed var(--outline-variant);border-radius:8px;cursor:pointer;text-align:left}.side-group-add:hover{color:var(--primary);border-color:var(--outline)}.side-group-new{padding:10px 10px 4px}.side-group-new input{width:100%;box-sizing:border-box}.side-group-rename{flex:1;min-width:0;font:inherit;font-size:11px}.team-screen{grid-template-columns:240px minmax(0,1fr)}.team-screen.has-sessions{grid-template-columns:240px 260px minmax(0,1fr)}.team-screen.has-sessions.has-knowledge{grid-template-columns:240px 260px minmax(0,1fr) var(--kside-w, 460px)}.knowledge-side{position:sticky;border-left:1px solid var(--outline-variant);border-right:0}.kside-resizer{position:absolute;left:-3px;top:0;bottom:0;width:7px;cursor:col-resize;z-index:4}.kside-resizer:hover{background:color-mix(in srgb,var(--primary) 25%,transparent)}.kside-headline{display:flex;flex-direction:column;gap:1px;min-width:0}.kside-hint{font-size:10.5px;color:var(--on-surface-variant);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kside-bundle{padding:6px 8px 10px}.kside-bundle+.kside-bundle{border-top:1px solid var(--outline-variant)}.kside-bundle-head{display:flex;align-items:center;gap:2px;padding:2px 0}.kside-bundle-toggle{display:flex;align-items:center;gap:7px;flex:1;min-width:0;padding:6px 8px;border-radius:10px;text-align:left}.kside-bundle-toggle:hover{background:color-mix(in srgb,var(--on-surface) 5%,transparent)}.kside-bundle-name{font-size:12px;font-weight:600;color:var(--on-surface);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kside-count{flex:none;font-size:10.5px;line-height:17px;color:var(--on-surface-variant);background:var(--surface-container-highest);border-radius:999px;padding:0 7px}.kside-open{flex:none;width:26px;height:26px;display:grid;place-items:center;border-radius:50%;color:var(--on-surface-variant);font-size:13px}.kside-open:hover{background:color-mix(in srgb,var(--on-surface) 8%,transparent);color:var(--on-surface)}.kside-chev{flex:none;width:15px;line-height:1;color:var(--on-surface-variant);display:inline-block;transition:transform .14s ease}.kside-chev .ms{font-size:15px;vertical-align:0;display:block}.kside-chev.open{transform:rotate(90deg)}.kside-row{display:flex;align-items:center;gap:7px;width:100%;text-align:left;padding:6px 8px 6px 18px;font-size:12px;color:var(--on-surface-variant);border-radius:10px}.kside-row:hover{background:color-mix(in srgb,var(--on-surface) 5%,transparent);color:var(--on-surface)}.kside-concept.open>.kside-row{background:var(--secondary-container);color:var(--on-secondary-container);font-weight:500}.kside-concept.open>.kside-row .kside-chev{color:inherit}.kside-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kside-stale{flex:none;font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--error, #b3261e);border:1px solid currentColor;border-radius:999px;padding:0 6px;cursor:help}.kside-card{margin:4px 0 10px 18px;border-radius:12px;overflow:hidden;background:var(--surface-container-high);border:1px solid color-mix(in srgb,var(--outline-variant) 70%,transparent)}.kside-card>.viewer-note{padding:12px 14px}.kside-card-bar{display:flex;align-items:center;gap:10px;padding:7px 12px;border-bottom:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent);background:color-mix(in srgb,var(--surface-container-highest) 65%,transparent)}.kside-type{font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:var(--on-surface-variant);border:1px solid var(--outline-variant);border-radius:999px;padding:1px 7px}.kside-updated{font-size:10.5px;color:var(--on-surface-variant)}.kside-md.md-body{height:auto;overflow:visible;padding:12px 14px 14px;font-size:12px}.concept-md{height:auto;overflow:visible}.kside-actions{display:flex;justify-content:flex-end;gap:8px;margin:2px 0 0}.kside-edit{padding:10px 12px}.kside-edit .concept-edit{width:100%;box-sizing:border-box}.kside-edit .kside-actions{margin-top:8px}.kside-reopen{position:fixed;right:14px;top:60px;z-index:5;font-size:11px;color:var(--on-surface-variant);background:var(--surface-container-high);border:1px solid var(--outline-variant);border-radius:999px;padding:4px 12px}.kside-reopen:hover{color:var(--on-surface);background:var(--surface-container-highest, var(--surface-container-high))}@media(max-width:1099px){.knowledge-side,.kside-reopen{display:none}.team-screen.has-sessions.has-knowledge{grid-template-columns:240px 260px minmax(0,1fr)}}.member-view{display:flex;flex-direction:column;gap:16px}.member-view .detail-head{margin-bottom:0}.m3-list{display:flex;flex-direction:column;padding:4px 0}.m3-row{display:flex;align-items:center;gap:14px;padding:12px 18px;text-align:left;color:inherit}.m3-row+.m3-row,.m3-expand+.m3-row{border-top:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}button.m3-toggle{background:none;border:0;width:100%;font:inherit;cursor:pointer}button.m3-toggle:hover{background:color-mix(in srgb,var(--on-surface) 4%,transparent)}.m3-ico{flex:none;width:32px;height:32px;display:grid;place-items:center;font-size:14px;color:var(--on-secondary-container);background:var(--secondary-container);border-radius:50%}.m3-ico .ms{font-size:17px;vertical-align:0}.m3-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}.m3-head{font-size:13.5px;font-weight:500;display:flex;align-items:center;gap:8px}.m3-sub{font-size:12px;color:var(--on-surface-variant);line-height:1.5}.m3-sub code{font-size:11px}.m3-sub a{color:inherit}.m3-ellipsis{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.m3-chev{flex:none;color:var(--on-surface-variant);display:inline-flex;transition:transform .14s ease}.m3-chev .ms{vertical-align:0}.m3-chev.open{transform:rotate(180deg)}.m3-expand{padding:2px 18px 16px 64px}.m3-expand pre{margin:0;white-space:pre-wrap;font:12.5px/1.65 var(--font-mono),monospace}.m3-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:3px}.m3-chips .chip{text-decoration:none}.m3-switch{position:relative;flex:none;display:inline-block;width:44px;height:24px;cursor:pointer}.m3-switch input{position:absolute;inset:0;opacity:0;margin:0;cursor:pointer}.m3-switch-track{position:absolute;inset:0;border-radius:999px;pointer-events:none;background:var(--surface-container-highest);border:2px solid var(--outline-variant);transition:background .14s ease,border-color .14s ease}.m3-switch-track:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--on-surface-variant);transition:transform .14s ease,background .14s ease}.m3-switch input:checked+.m3-switch-track{background:var(--primary);border-color:var(--primary)}.m3-switch input:checked+.m3-switch-track:after{transform:translate(20px);background:var(--on-primary)}a.m3-row{text-decoration:none}a.m3-row:hover{background:color-mix(in srgb,var(--on-surface) 4%,transparent)}a.m3-row:hover .m3-head{color:var(--primary)}.m3-subhead{padding:14px 18px 4px;font-family:var(--font-mono),monospace;font-size:11px;letter-spacing:.05em;color:var(--on-surface-variant)}.m3-row+.m3-subhead{border-top:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent);margin-top:4px}.know-log{padding:2px 0 10px}.know-log-row{display:flex;gap:10px;padding:4px 18px;align-items:baseline}.know-log-text{font-size:12.5px;color:var(--on-surface-variant);line-height:1.55;min-width:0;overflow-wrap:break-word}.know-log-text a{color:var(--primary)}.chip.log-kind{flex:none}.chip.log-verification{border-color:transparent;background:var(--success-container);color:var(--on-success-container)}.chip.log-creation,.chip.log-initialization{border-color:transparent;background:var(--secondary-container);color:var(--on-secondary-container)}.detail-cols{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:16px;align-items:start}@media(max-width:1020px){.detail-cols{grid-template-columns:1fr}}.detail-rail{display:flex;flex-direction:column;gap:16px;min-width:0}.rail-list{padding:4px 0}.rail-kv{display:flex;flex-direction:column;gap:3px;padding:10px 18px}.rail-kv+.rail-kv{border-top:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}.rail-kv .v{font-size:12.5px;color:var(--on-surface);overflow-wrap:break-word;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.rail-kv .v.dim{color:var(--on-surface-variant)}.rail-kv a{color:var(--primary)}.concept-edit{display:block;width:100%;border:0;outline:none;resize:vertical;padding:14px 18px;background:var(--surface-container-lowest);color:var(--on-surface);font:12.5px/1.65 var(--font-mono),monospace;border-bottom:1px solid color-mix(in srgb,var(--outline-variant) 55%,transparent)}.side-row .row-x{flex:none;align-self:center;opacity:0;border:0;background:transparent;color:var(--on-surface-variant);font-size:11px;line-height:1;padding:4px 6px;border-radius:8px;cursor:pointer;transition:opacity .1s ease,background .1s ease,color .1s ease}.side-row:hover .row-x,.side-row .row-x:focus-visible{opacity:1}.side-row .row-x:hover{background:color-mix(in srgb,var(--error) 18%,transparent);color:var(--error)}.team-wf-list{display:flex;flex-wrap:wrap;gap:8px;padding:12px 18px}.team-wf-list .chip{text-decoration:none}.team-form{display:flex;flex-direction:column;gap:14px;padding:18px;max-width:680px}.team-form-row{display:flex;gap:10px;align-items:flex-end}.team-field{display:flex;flex-direction:column;gap:5px}.team-field,.team-field-label{font-size:11px;font-weight:500;color:var(--on-surface-variant);letter-spacing:.045em;text-transform:capitalize}.team-field input,.team-field select,.team-field textarea{font:13px/1.5 var(--font-mono),monospace;color:var(--on-surface);background:var(--surface-container-high);border:1px solid transparent;border-radius:12px;padding:9px 14px;outline:none;text-transform:none;letter-spacing:normal;transition:border-color .12s ease,background .12s ease}.team-field textarea{resize:vertical;font-family:var(--font-mono),monospace}.team-field input:focus,.team-field select:focus,.team-field textarea:focus{border-color:var(--primary);background:var(--surface-container-highest)}.emoji-pick{display:flex;gap:6px;flex-wrap:wrap}.emoji-pick button{font-size:16px;padding:6px 10px;background:transparent;border:1px solid var(--outline-variant);border-radius:12px;cursor:pointer;transition:background .12s ease,border-color .12s ease}.emoji-pick button:hover{background:color-mix(in srgb,var(--on-surface) 6%,transparent)}.emoji-pick button.active{border-color:transparent;background:var(--secondary-container)}.wf-checks{display:flex;flex-direction:column;gap:7px;padding:4px 0}.wf-checks label{display:flex;align-items:baseline;gap:8px;font-size:13px;color:var(--on-surface-variant);text-transform:none;letter-spacing:normal;cursor:pointer}.wf-checks input[type=checkbox]{accent-color:var(--primary)}.wf-checks b{font-family:var(--font-mono),monospace;font-size:12px}.wf-checks .opt-hint{color:var(--outline);font-size:11.5px}@media(max-width:900px){.team-screen,.team-screen.has-sessions,.team-screen.has-sessions.has-knowledge{grid-template-columns:1fr}.team-form-row{flex-direction:column;align-items:stretch}}