@typescript-agent-harness/cli 0.35.0 → 0.36.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,437 @@
1
+ /** Connects to the browser-level endpoint Chrome lists at `/json/version`. */
2
+ export async function connectCdp(port) {
3
+ const version = (await (await fetch(`http://127.0.0.1:${port}/json/version`)).json());
4
+ const ws = new WebSocket(version.webSocketDebuggerUrl);
5
+ await new Promise((resolve, reject) => {
6
+ ws.addEventListener("open", () => resolve(), { once: true });
7
+ ws.addEventListener("error", () => reject(new Error(`could not connect to the browser on port ${port}`)), { once: true });
8
+ });
9
+ let id = 0;
10
+ const pending = new Map();
11
+ const listeners = [];
12
+ const closers = [];
13
+ ws.addEventListener("message", (event) => {
14
+ const msg = JSON.parse(String(event.data));
15
+ if (msg.id !== undefined) {
16
+ const waiter = pending.get(msg.id);
17
+ pending.delete(msg.id);
18
+ if (msg.error)
19
+ waiter?.reject(new Error(msg.error.message));
20
+ else
21
+ waiter?.resolve(msg.result ?? {});
22
+ }
23
+ else if (msg.method) {
24
+ for (const listener of listeners)
25
+ listener(msg.method, msg.params ?? {}, msg.sessionId);
26
+ }
27
+ });
28
+ ws.addEventListener("close", () => {
29
+ for (const waiter of pending.values())
30
+ waiter.reject(new Error("the browser connection closed"));
31
+ pending.clear();
32
+ for (const closer of closers)
33
+ closer();
34
+ });
35
+ return {
36
+ send(method, params = {}, sessionId) {
37
+ return new Promise((resolve, reject) => {
38
+ if (ws.readyState !== WebSocket.OPEN)
39
+ return reject(new Error("the browser connection closed"));
40
+ id += 1;
41
+ pending.set(id, { resolve, reject });
42
+ ws.send(JSON.stringify({ id, method, params, ...(sessionId ? { sessionId } : {}) }));
43
+ });
44
+ },
45
+ on: (listener) => void listeners.push(listener),
46
+ onClose: (listener) => void closers.push(listener),
47
+ close: () => ws.close(),
48
+ };
49
+ }
50
+ const SELF = new Set(["127.0.0.1", "localhost", "[::1]"]);
51
+ /** What the panel may open: web pages other than tah itself (`port`), a blank page, or one of this server's file previews. */
52
+ export function browserURL(input, port) {
53
+ const text = input.trim();
54
+ if (text === "about:blank")
55
+ return text;
56
+ let url;
57
+ try {
58
+ if (text.startsWith("/")) {
59
+ url = new URL(text, `http://127.0.0.1:${port}`);
60
+ return url.pathname.startsWith("/preview/") ? url.href : undefined;
61
+ }
62
+ url = new URL(text);
63
+ }
64
+ catch {
65
+ return undefined;
66
+ }
67
+ if (url.protocol !== "http:" && url.protocol !== "https:")
68
+ return undefined;
69
+ const urlPort = Number(url.port || (url.protocol === "https:" ? 443 : 80));
70
+ if (SELF.has(url.hostname) && urlPort === port)
71
+ return undefined;
72
+ return url.href;
73
+ }
74
+ const num = (value, name) => {
75
+ if (typeof value !== "number" || !Number.isFinite(value))
76
+ throw new Error(`"${name}" must be a number`);
77
+ return value;
78
+ };
79
+ const int = (value, name) => {
80
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0)
81
+ throw new Error(`"${name}" must be a non-negative integer`);
82
+ return value;
83
+ };
84
+ const str = (value, name) => {
85
+ if (typeof value !== "string")
86
+ throw new Error(`"${name}" must be a string`);
87
+ return value;
88
+ };
89
+ const oneOf = (value, name, values) => {
90
+ if (!values.includes(value))
91
+ throw new Error(`"${name}" must be one of ${values.join(", ")}`);
92
+ return value;
93
+ };
94
+ /** Checks a `POST /api/browser/input` body; unknown fields are dropped. */
95
+ export function parseInput(body) {
96
+ switch (body.type) {
97
+ case "mouse":
98
+ return {
99
+ type: "mouse",
100
+ event: oneOf(body.event, "event", ["move", "down", "up"]),
101
+ x: num(body.x, "x"),
102
+ y: num(body.y, "y"),
103
+ button: oneOf(body.button, "button", ["left", "middle", "right", "none"]),
104
+ clickCount: int(body.clickCount, "clickCount"),
105
+ modifiers: int(body.modifiers, "modifiers"),
106
+ };
107
+ case "wheel":
108
+ return {
109
+ type: "wheel",
110
+ x: num(body.x, "x"),
111
+ y: num(body.y, "y"),
112
+ dx: num(body.dx, "dx"),
113
+ dy: num(body.dy, "dy"),
114
+ modifiers: int(body.modifiers, "modifiers"),
115
+ };
116
+ case "key": {
117
+ const key = {
118
+ type: "key",
119
+ event: oneOf(body.event, "event", ["down", "up"]),
120
+ key: str(body.key, "key"),
121
+ code: str(body.code, "code"),
122
+ keyCode: int(body.keyCode, "keyCode"),
123
+ modifiers: int(body.modifiers, "modifiers"),
124
+ };
125
+ return body.text === undefined ? key : { ...key, text: str(body.text, "text") };
126
+ }
127
+ case "text":
128
+ return { type: "text", text: str(body.text, "text") };
129
+ }
130
+ throw new Error('"type" must be one of mouse, wheel, key, text');
131
+ }
132
+ const MOUSE = { move: "mouseMoved", down: "mousePressed", up: "mouseReleased" };
133
+ /** The CDP command for one input. */
134
+ export function cdpInput(input) {
135
+ switch (input.type) {
136
+ case "mouse": {
137
+ const { x, y, button, clickCount, modifiers } = input;
138
+ return ["Input.dispatchMouseEvent", { type: MOUSE[input.event], x, y, button, clickCount, modifiers }];
139
+ }
140
+ case "wheel":
141
+ return [
142
+ "Input.dispatchMouseEvent",
143
+ { type: "mouseWheel", x: input.x, y: input.y, deltaX: input.dx, deltaY: input.dy, modifiers: input.modifiers },
144
+ ];
145
+ case "key": {
146
+ const params = {
147
+ type: input.event === "up" ? "keyUp" : input.text ? "keyDown" : "rawKeyDown",
148
+ key: input.key,
149
+ code: input.code,
150
+ windowsVirtualKeyCode: input.keyCode,
151
+ modifiers: input.modifiers,
152
+ };
153
+ if (input.text)
154
+ params.text = input.text;
155
+ // Chrome on macOS selects all only through the editing command, not the key press.
156
+ if (input.event === "down" && input.key.toLowerCase() === "a" && input.modifiers & 6)
157
+ params.commands = ["selectAll"];
158
+ return ["Input.dispatchKeyEvent", params];
159
+ }
160
+ case "text":
161
+ return ["Input.insertText", { text: input.text }];
162
+ }
163
+ }
164
+ const message = (err) => (err instanceof Error ? err.message : String(err));
165
+ /** The browser panel's side of the open folder's browser. */
166
+ export function createScreen(opts) {
167
+ const listeners = new Set();
168
+ const tabs = new Map();
169
+ let cdp;
170
+ let owner;
171
+ let connecting;
172
+ let active = null;
173
+ let session;
174
+ let showing = Promise.resolve();
175
+ let casting = false;
176
+ let lastFrame;
177
+ let error;
178
+ let dialog;
179
+ let disposed = false;
180
+ const state = () => {
181
+ const b = opts.browser();
182
+ return {
183
+ available: b !== undefined,
184
+ running: b?.running() ?? false,
185
+ agent: b?.agentAttached() ?? false,
186
+ tabs: [...tabs.values()],
187
+ active,
188
+ ...(error === undefined ? {} : { error }),
189
+ ...(dialog === undefined ? {} : { dialog }),
190
+ };
191
+ };
192
+ const emit = (event) => {
193
+ for (const listener of listeners)
194
+ listener(event);
195
+ };
196
+ const push = () => emit({ type: "state", state: state() });
197
+ const forget = () => {
198
+ tabs.clear();
199
+ active = null;
200
+ session = undefined;
201
+ casting = false;
202
+ lastFrame = undefined;
203
+ dialog = undefined;
204
+ };
205
+ const drop = () => {
206
+ const c = cdp;
207
+ cdp = undefined;
208
+ owner = undefined;
209
+ forget();
210
+ c?.close();
211
+ };
212
+ async function cast(on) {
213
+ const c = cdp;
214
+ const s = session;
215
+ if (!c || !s || casting === on)
216
+ return;
217
+ casting = on;
218
+ await c.send(on ? "Page.startScreencast" : "Page.stopScreencast", on ? { format: "jpeg", quality: 70 } : {}, s).catch(() => { });
219
+ }
220
+ /** Shows tab `id`: attaches to it (detaching the previous one) and streams it while someone watches. */
221
+ function show(id) {
222
+ const c = cdp;
223
+ if (!c)
224
+ return Promise.resolve();
225
+ const previous = session;
226
+ active = id;
227
+ session = undefined;
228
+ casting = false;
229
+ lastFrame = undefined;
230
+ dialog = undefined;
231
+ push();
232
+ showing = (async () => {
233
+ if (previous)
234
+ await c.send("Target.detachFromTarget", { sessionId: previous }).catch(() => { });
235
+ const { sessionId } = (await c.send("Target.attachToTarget", { targetId: id, flatten: true }));
236
+ if (active !== id || cdp !== c) {
237
+ await c.send("Target.detachFromTarget", { sessionId }).catch(() => { });
238
+ return;
239
+ }
240
+ session = sessionId;
241
+ await c.send("Target.activateTarget", { targetId: id }).catch(() => { });
242
+ await c.send("Page.enable", {}, sessionId).catch(() => { });
243
+ if (listeners.size > 0)
244
+ await cast(true);
245
+ })().catch(() => { });
246
+ return showing;
247
+ }
248
+ const onEvent = (c) => (method, params, sessionId) => {
249
+ if (c !== cdp)
250
+ return;
251
+ if (method === "Page.screencastFrame") {
252
+ if (sessionId === undefined || sessionId !== session)
253
+ return;
254
+ void c.send("Page.screencastFrameAck", { sessionId: params.sessionId }, sessionId).catch(() => { });
255
+ const meta = params.metadata;
256
+ lastFrame = { type: "frame", data: params.data, width: meta.deviceWidth, height: meta.deviceHeight };
257
+ emit(lastFrame);
258
+ return;
259
+ }
260
+ if (method === "Page.javascriptDialogOpening" || method === "Page.javascriptDialogClosed") {
261
+ if (sessionId === undefined || sessionId !== session)
262
+ return;
263
+ dialog = method === "Page.javascriptDialogOpening" ? { type: params.type, message: params.message } : undefined;
264
+ return push();
265
+ }
266
+ const info = params.targetInfo;
267
+ if (method === "Target.targetCreated" && info?.type === "page") {
268
+ tabs.set(info.targetId, { id: info.targetId, title: info.title, url: info.url });
269
+ void show(info.targetId);
270
+ }
271
+ else if (method === "Target.targetInfoChanged" && info && tabs.has(info.targetId)) {
272
+ tabs.set(info.targetId, { id: info.targetId, title: info.title, url: info.url });
273
+ push();
274
+ }
275
+ else if (method === "Target.targetDestroyed") {
276
+ const id = params.targetId;
277
+ if (!tabs.delete(id))
278
+ return;
279
+ if (active !== id)
280
+ return push();
281
+ active = null;
282
+ session = undefined;
283
+ casting = false;
284
+ lastFrame = undefined;
285
+ dialog = undefined;
286
+ const last = [...tabs.keys()].at(-1);
287
+ if (last)
288
+ void show(last);
289
+ else
290
+ push();
291
+ }
292
+ };
293
+ function connect() {
294
+ if (cdp)
295
+ return Promise.resolve(cdp);
296
+ connecting ??= (async () => {
297
+ const b = opts.browser();
298
+ const port = b?.cdpPort();
299
+ if (!b || port === undefined)
300
+ return undefined;
301
+ const c = await (opts.connect ?? connectCdp)(port);
302
+ if (disposed) {
303
+ c.close();
304
+ return undefined;
305
+ }
306
+ cdp = c;
307
+ owner = b;
308
+ c.on(onEvent(c));
309
+ c.onClose(() => {
310
+ if (cdp !== c)
311
+ return;
312
+ cdp = undefined;
313
+ owner = undefined;
314
+ forget();
315
+ push();
316
+ });
317
+ await c.send("Target.setDiscoverTargets", { discover: true });
318
+ const { targetInfos } = (await c.send("Target.getTargets"));
319
+ for (const t of targetInfos) {
320
+ if (t.type === "page" && !tabs.has(t.targetId))
321
+ tabs.set(t.targetId, { id: t.targetId, title: t.title, url: t.url });
322
+ }
323
+ const last = [...tabs.keys()].at(-1);
324
+ if (active === null && last)
325
+ await show(last);
326
+ else
327
+ push();
328
+ return c;
329
+ })().finally(() => (connecting = undefined));
330
+ return connecting;
331
+ }
332
+ /** The connection and the shown tab's session, once attached. */
333
+ async function ready() {
334
+ const c = cdp ?? (opts.browser()?.running() ? await connect() : undefined);
335
+ let shown;
336
+ do {
337
+ shown = showing;
338
+ await shown;
339
+ } while (shown !== showing);
340
+ if (!c || cdp !== c || !session)
341
+ throw new Error("the browser is not open");
342
+ return { c, s: session };
343
+ }
344
+ async function sync() {
345
+ const b = opts.browser();
346
+ if (cdp && (b !== owner || !b?.running()))
347
+ drop();
348
+ if (b?.running() && !cdp && listeners.size > 0) {
349
+ try {
350
+ await connect();
351
+ error = undefined;
352
+ }
353
+ catch (err) {
354
+ error = message(err);
355
+ }
356
+ }
357
+ push();
358
+ }
359
+ return {
360
+ state,
361
+ subscribe(listener) {
362
+ listeners.add(listener);
363
+ listener({ type: "state", state: state() });
364
+ if (lastFrame)
365
+ listener(lastFrame);
366
+ if (listeners.size === 1)
367
+ void (cdp ? cast(true) : sync());
368
+ return () => {
369
+ listeners.delete(listener);
370
+ if (listeners.size === 0)
371
+ void cast(false);
372
+ };
373
+ },
374
+ sync,
375
+ async open(url) {
376
+ const b = opts.browser();
377
+ if (!b)
378
+ throw new Error("the built-in browser is off in this folder");
379
+ error = undefined;
380
+ try {
381
+ await b.launch();
382
+ if (cdp && owner !== b)
383
+ drop();
384
+ if (!(await connect()))
385
+ throw new Error("could not find the browser's debugging port");
386
+ }
387
+ catch (err) {
388
+ error = message(err);
389
+ push();
390
+ throw err;
391
+ }
392
+ if (url) {
393
+ const { c, s } = await ready();
394
+ await c.send("Page.navigate", { url }, s);
395
+ }
396
+ push();
397
+ },
398
+ async nav(action) {
399
+ const { c, s } = await ready();
400
+ if (action === "reload") {
401
+ await c.send("Page.reload", {}, s);
402
+ return;
403
+ }
404
+ const history = (await c.send("Page.getNavigationHistory", {}, s));
405
+ const entry = history.entries[history.currentIndex - 1];
406
+ if (entry)
407
+ await c.send("Page.navigateToHistoryEntry", { entryId: entry.id }, s);
408
+ },
409
+ async tab(id) {
410
+ if (!tabs.has(id))
411
+ throw new Error(`no tab "${id}"`);
412
+ await show(id);
413
+ },
414
+ async input(input) {
415
+ const { c, s } = await ready();
416
+ const [method, params] = cdpInput(input);
417
+ await c.send(method, params, s);
418
+ },
419
+ async dialog(accept, text) {
420
+ const { c, s } = await ready();
421
+ await c.send("Page.handleJavaScriptDialog", { accept, ...(text === undefined ? {} : { promptText: text }) }, s);
422
+ },
423
+ async close() {
424
+ const b = opts.browser();
425
+ drop();
426
+ error = undefined;
427
+ await b?.close();
428
+ push();
429
+ },
430
+ dispose() {
431
+ disposed = true;
432
+ listeners.clear();
433
+ drop();
434
+ },
435
+ };
436
+ }
437
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/serve/screen.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- :root{--bg:#fff;--panel:#f6f7f9;--border:#e3e5e8;--text:#1f2328;--muted:#6b7280;--accent:#0e7490;--accent-text:#fff;--ok:#15803d;--fail:#b91c1c;--warn:#b45309;--code-bg:#f3f4f6;--hl-keyword:#cf222e;--hl-string:#0a3069;--hl-comment:#6e7781;--hl-number:#0550ae;--hl-title:#8250df;--hl-attr:#953800;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;color:var(--text);background:var(--bg);font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;font-size:15px;line-height:1.6}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--bg:#0f1115;--panel:#161a20;--border:#2a2f37;--text:#e6e6e6;--muted:#9aa1ab;--accent:#22a6c4;--accent-text:#0f1115;--ok:#4ade80;--fail:#f87171;--warn:#fbbf24;--code-bg:#1c2028;--hl-keyword:#ff7b72;--hl-string:#a5d6ff;--hl-comment:#8b949e;--hl-number:#79c0ff;--hl-title:#d2a8ff;--hl-attr:#ffa657}}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}button{font:inherit;color:var(--text);background:var(--panel);border:1px solid var(--border);cursor:pointer;border-radius:6px;padding:4px 12px}button:disabled{opacity:.5;cursor:default}button.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-text)}button.danger{color:var(--fail)}code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px}.app{height:100%;display:flex}.sidebar{border-right:1px solid var(--border);background:var(--panel);flex-direction:column;flex-shrink:0;width:260px;display:flex}.sidebar-brand{justify-content:space-between;align-items:center;padding:12px 10px 6px 14px;display:flex}.brand{align-items:center;gap:8px;font-size:16px;font-weight:700;display:flex}.brand-mark{background:var(--accent);width:22px;height:22px;color:var(--accent-text);border-radius:6px;flex:none;justify-content:center;align-items:center;font-size:12px;font-weight:700;display:flex}.new-session{text-align:left;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;margin:4px 8px 10px;padding:6px 10px;font-size:14px;display:flex}.new-session svg{color:var(--muted)}.new-session:not(:disabled):hover{background:var(--border)}.ws-header{letter-spacing:.3px;text-transform:uppercase;color:var(--muted);justify-content:space-between;align-items:center;padding:0 8px 4px 14px;font-size:12px;font-weight:600;display:flex}.ws-header-tools{gap:2px;display:flex}.icon-btn{color:var(--muted);background:0 0;border:none;padding:4px;display:flex}.icon-btn:not(:disabled):hover,.icon-btn.on{background:var(--border);color:var(--text)}.sidebar-search{border:1px solid var(--accent);background:var(--bg);color:var(--muted);border-radius:7px;align-items:center;gap:6px;margin:0 8px 6px;padding:3px 4px 3px 8px;display:flex}.sidebar-search input{min-width:0;color:var(--text);font:inherit;background:0 0;border:none;outline:none;flex:1;font-size:14px}.sidebar mark{color:#1f2328;background:#fde68a;border-radius:2px}.sidebar.rail{align-items:center;gap:6px;width:56px;padding:12px 0 10px}.sidebar.rail .brand-mark{width:28px;height:28px;margin-bottom:4px;font-size:14px}.rail-btn{width:36px;height:36px;color:var(--muted);background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;padding:0;display:flex}.rail-btn:not(:disabled):hover{background:var(--border);color:var(--text)}.rail-btn svg{width:18px;height:18px}.rail-gap{flex:1}.sidebar-note{color:var(--muted);padding:0 12px 8px;font-size:13px}.sessions{padding:0 8px 12px;overflow-y:auto}.sessions ul{margin:0;padding:0;list-style:none}.ws>ul{padding-left:16px}.sessions-heading{color:var(--muted);padding:8px 8px 4px;font-size:12px}.session-item{border-radius:6px;margin-bottom:2px}.session-item:hover{background:var(--bg)}.session-item.current{background:var(--bg);box-shadow:inset 2px 0 0 var(--accent)}.session{align-items:center;gap:4px;width:100%;padding:2px 4px 2px 8px;display:flex}.session-pick{text-align:left;min-width:0;color:inherit;font:inherit;background:0 0;border:none;flex:1;padding:2px 0;display:flex}.session .preview{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.session-time{color:var(--muted);flex:none;font-size:12px}.session-status{flex:none;justify-content:center;align-items:center;width:12px;display:flex}.session-status .spinner{width:10px;height:10px}.status-dot{background:var(--warn);border-radius:50%;width:7px;height:7px}.session-badge{color:var(--warn);background:color-mix(in srgb, var(--warn) 14%, transparent);border-radius:4px;flex:none;padding:0 5px;font-size:11px}.ws-more{color:var(--muted);background:0 0;border:none;margin:0 0 4px 16px;padding:0 8px;font-size:12.5px;display:block}.ws-more:hover{color:var(--text)}.menu-label{letter-spacing:.3px;text-transform:uppercase;color:var(--muted);padding:4px 10px 2px;font-size:11px}.menu-check{width:16px;color:var(--accent);display:inline-block}.session-tools{flex:none;gap:2px;display:none}.session-item:hover .session-time{display:none}.session-item:hover .session-tools{display:flex}.session-tools button{color:var(--muted);background:0 0;border:none;border-radius:4px;padding:3px;display:flex}.session-tools button:hover,.session-tools button.on{color:var(--text)}.session-tools button:hover{background:var(--panel)}.context-menu{z-index:10;border:1px solid var(--border);background:var(--bg);border-radius:8px;min-width:160px;margin:0;padding:4px;list-style:none;position:fixed;box-shadow:0 6px 20px #00000026}.context-menu button{text-align:left;background:0 0;border:none;width:100%;padding:4px 10px;font-size:14px}.context-menu button:not(:disabled):hover{background:var(--panel)}.ws-head{color:var(--muted);align-items:center;gap:4px;padding:6px 4px 2px 2px;font-size:12px;display:flex}.ws-head.active .ws-name{color:var(--text);font-weight:600}.ws-head.missing{opacity:.6}.ws-toggle{min-width:0;color:inherit;text-align:left;background:0 0;border:none;flex:1;align-items:center;gap:4px;padding:0 4px;font-size:12px;display:flex}.ws-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ws-note{flex:none}.ws-tools{flex:none;gap:2px;display:none}.ws-head:hover .ws-tools{display:flex}.ws-tools button{color:var(--muted);background:0 0;border:none;padding:3px;display:flex}.ws-chevron{flex:none;display:flex}.ws-tools button:hover{background:var(--panel);color:var(--text)}.session-folder{text-overflow:ellipsis;white-space:nowrap;max-width:72px;color:var(--muted);flex:none;font-size:12px;overflow:hidden}.session-item:hover .session-folder{display:none}.modal-backdrop{z-index:20;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal{border:1px solid var(--border);background:var(--bg);border-radius:10px;flex-direction:column;gap:8px;width:min(520px,90vw);max-height:70vh;padding:12px;display:flex}.crumbs{flex-wrap:wrap;display:flex}.crumbs button,.dirs button{text-align:left;background:0 0;border:none;padding:2px 4px}.dirs{border:1px solid var(--border);border-radius:6px;min-height:160px;margin:0;padding:0;list-style:none;overflow-y:auto}.dirs button{width:100%;padding:4px 8px}.dirs button:hover,.crumbs button:hover{background:var(--panel)}.modal-title{font-weight:600}.recent button{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.dir-path{color:var(--muted);margin-left:8px;font-size:12px}.new-folder-where{align-items:center;gap:8px;font-size:13px;display:flex}.where-path{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--muted);flex:1;overflow:hidden}.modal-error{color:var(--fail);font-size:13px}.sidebar-user{align-items:center;gap:8px;margin:auto 8px 8px;padding:6px 4px 6px 8px;display:flex}.avatar{background:var(--accent);width:24px;height:24px;color:var(--accent-text);border-radius:50%;flex:none;justify-content:center;align-items:center;font-size:12px;font-weight:600;display:flex}.user-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:13px;overflow:hidden}.settings{border:1px solid var(--border);background:var(--bg);border-radius:12px;width:min(860px,94vw);height:min(600px,86vh);display:flex;overflow:hidden;box-shadow:0 16px 48px #0003}.settings-nav{border-right:1px solid var(--border);background:var(--panel);flex-direction:column;flex:none;gap:2px;width:180px;padding:16px 8px;display:flex}.settings-nav-title{color:var(--muted);padding:0 8px 10px;font-size:13px}.settings-nav button{text-align:left;background:0 0;border:none;border-radius:6px;padding:6px 8px;font-size:14px}.settings-nav button.active{background:var(--bg);font-weight:600}.settings-body{flex-direction:column;flex:1;gap:14px;min-width:0;padding:20px 28px;display:flex;overflow-y:auto}.settings-head{justify-content:space-between;align-items:center;display:flex}.settings-head h2{margin:0;font-size:18px}.settings-desc{color:var(--muted);margin:-6px 0 0;font-size:13px}.model-cards{border:1px solid var(--border);border-radius:8px;margin:0;padding:0;list-style:none}.model-card{align-items:center;gap:10px;padding:10px 12px;display:flex}.model-card+.model-card{border-top:1px solid var(--border)}.model-main{flex:1;min-width:0}.model-name{font-weight:600}.model-meta{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.model-card>button:not(.icon-btn){padding:3px 12px;font-size:13px}.badge{background:color-mix(in srgb, var(--accent) 15%, transparent);color:var(--accent);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600}.settings-subhead{color:var(--muted);margin-top:6px;font-size:12px;font-weight:600}.skill-desc{-webkit-line-clamp:2;color:var(--muted);-webkit-box-orient:vertical;font-size:12px;display:-webkit-box;overflow:hidden}.settings-empty,.settings-note{color:var(--muted);font-size:13px}.add-model{align-self:flex-start}.model-form{border:1px solid var(--border);border-radius:8px;flex-direction:column;gap:12px;padding:14px;display:flex}.model-form label{flex-direction:column;gap:4px;font-size:13px;display:flex}.model-form label em{color:var(--muted);font-style:normal;font-weight:400}.model-form input{border:1px solid var(--border);font:inherit;background:var(--bg);color:inherit;border-radius:6px;padding:6px 8px}.model-form small{color:var(--muted);font-size:12px}.model-form label.check{flex-direction:row;align-items:center;gap:6px}.model-form label.check input{margin:0;padding:0}.model-form .check-note{margin-top:-8px}.model-vision{color:var(--muted);cursor:pointer;align-items:center;gap:4px;font-size:12px;display:flex}.model-vision input{margin:0}button.link{color:var(--accent);font-size:inherit;cursor:pointer;background:0 0;border:none;padding:0}button.link:not(:disabled):hover{text-decoration:underline}.spacer{flex:1}.session-rename{border:1px solid var(--border);width:100%;font:inherit;background:var(--panel);color:var(--fg);border-radius:4px;padding:4px 6px}.user-attach-fallback{color:var(--muted);font-size:13px}main{flex-direction:column;flex:1;min-width:0;display:flex}.banner{color:var(--warn);border-bottom:1px solid var(--border);padding:6px 16px;font-size:13px}.messages{flex:1;padding:16px max(16px,50% - 430px);overflow-y:auto}.empty{text-align:center;flex-direction:column;justify-content:center;align-items:center;min-height:min(52vh,420px);padding:24px 16px;display:flex}.empty-title{letter-spacing:-.02em;color:var(--text);font-size:1.25rem;font-weight:600}.empty-hint{max-width:28rem;color:var(--muted);margin:8px 0 0;font-size:14px}.user{background:var(--panel);white-space:pre-wrap;word-break:break-word;border-radius:8px;margin:20px 0 8px;padding:8px 12px}.user-attach{flex-wrap:wrap;gap:6px;margin-bottom:6px;display:flex}.user-attach-chip{background:var(--bg);border:1px solid var(--border);color:var(--muted);white-space:nowrap;border-radius:999px;padding:2px 8px;font-size:12px}.reply{word-break:break-word}.reply pre{background:var(--code-bg);border-radius:6px;padding:10px 12px;overflow-x:auto}.reply :not(pre)>code{background:var(--code-bg);border-radius:4px;padding:1px 4px}.reply table{border-collapse:collapse}.reply th,.reply td{border:1px solid var(--border);padding:4px 8px}.hljs-keyword,.hljs-selector-tag,.hljs-literal{color:var(--hl-keyword)}.hljs-string,.hljs-regexp{color:var(--hl-string)}.hljs-comment,.hljs-quote{color:var(--hl-comment);font-style:italic}.hljs-number,.hljs-variable{color:var(--hl-number)}.hljs-title,.hljs-section,.hljs-function{color:var(--hl-title)}.hljs-attr,.hljs-attribute,.hljs-built_in,.hljs-type{color:var(--hl-attr)}.tool{white-space:nowrap;align-items:center;gap:8px;margin:4px 0;font-size:14px;display:flex;overflow:hidden}.tool .dot{color:var(--accent)}.tool.failed .dot,.tool.failed .result{color:var(--fail)}.tool .name{font-weight:600}.tool .summary{color:var(--muted);text-overflow:ellipsis;overflow:hidden}.tool.ok .result{color:var(--ok)}.steps{margin:6px 0}.steps-head{max-width:100%;color:var(--muted);white-space:nowrap;background:0 0;border:none;align-items:center;gap:6px;padding:2px 4px 2px 0;font-size:13px;display:flex;overflow:hidden}.steps-head:hover{color:var(--text)}.steps-title{font-weight:600}.steps-detail{text-overflow:ellipsis;overflow:hidden}.steps-failed{color:var(--fail)}.steps-body{border-left:1px solid var(--border);margin-left:6px;padding-left:12px}.notice{color:var(--muted);margin:4px 0;font-size:13px}.notice.error{color:var(--fail)}.thinking{color:var(--muted);align-items:center;gap:8px;margin:8px 0;display:flex}.spinner{border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;width:12px;height:12px;animation:.8s linear infinite spin;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.card{border:1px solid var(--warn);border-radius:8px;margin:12px 0;padding:12px}.card-title{margin-bottom:8px;font-weight:600}.card-body{background:var(--code-bg);white-space:pre-wrap;border-radius:6px;max-height:240px;margin:0 0 12px;padding:8px;overflow:auto}.card-actions{gap:8px;display:flex}.composer-wrap{padding:8px max(16px,50% - 430px)}.todos{border:1px solid var(--border);background:var(--panel);border-radius:8px;margin:0 max(16px,50% - 430px);padding:6px 10px;font-size:13px}.todos-head{max-width:100%;color:var(--muted);background:0 0;border:none;align-items:center;gap:6px;padding:0;display:flex}.todos-head:hover{color:var(--text)}.todos-title{font-weight:600}.todos-current{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.todos-list{max-height:160px;margin:6px 0 2px;padding:0;list-style:none;overflow-y:auto}.todos-list li{gap:6px;padding:1px 0;display:flex}.todos-list li.completed{color:var(--muted);text-decoration:line-through}.todos-list li.in_progress{font-weight:600}.todos-mark{flex:none;width:1em}.attach-rail{gap:8px;padding-bottom:8px;display:flex;overflow-x:auto}.attach-card{border:1px solid var(--border);background:var(--panel);border-radius:12px;flex:none;align-items:center;gap:8px;min-width:180px;max-width:240px;height:64px;padding:6px 8px;display:flex;position:relative}.attach-card img{object-fit:cover;border-radius:6px;width:48px;height:48px}.attach-ext{width:48px;height:48px;color:var(--muted);background:var(--bg);border-radius:6px;place-items:center;font-size:11px;font-weight:600;display:grid}.attach-meta{flex:1;min-width:0}.attach-name{text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.attach-sub{color:var(--muted);font-size:11px}.attach-card.error .attach-sub{color:var(--fail)}.attach-remove{width:22px;line-height:1;position:absolute;top:2px;right:2px;border-radius:11px!important;height:22px!important;padding:0!important}.composer{border:1px solid var(--border);background:var(--bg);border-radius:12px;flex-direction:column;padding:8px 8px 6px 12px;display:flex}.composer:focus-within{border-color:var(--accent)}.composer textarea{resize:none;font:inherit;color:var(--text);background:0 0;border:none;outline:none;padding:2px 0}.composer-bar{align-items:center;gap:6px;margin-top:4px;display:flex}.composer-bar .attach-btn{width:30px;height:30px;color:var(--muted);background:0 0;border:none;border-radius:8px;padding:0;font-size:20px;line-height:1}.composer-bar .attach-btn:not(:disabled):hover{background:var(--border);color:var(--text)}.send-btn{background:var(--accent);border-color:var(--accent);width:32px;height:32px;color:var(--accent-text);border-radius:50%;place-items:center;padding:0;display:grid}.send-btn.stop{background:var(--text);border-color:var(--text);color:var(--bg)}.model-picker{position:relative}.model-btn{max-width:260px;height:30px;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;background:0 0;border:none;border-radius:8px;align-items:center;gap:4px;padding:0 6px 0 10px;font-size:13px;display:flex;overflow:hidden}.model-chev{flex:none;display:inline-flex;transform:rotate(-90deg)}.model-btn:not(:disabled):hover,.model-btn.on{background:var(--border);color:var(--text)}.context-menu.model-menu{min-width:240px;max-height:50vh;position:absolute;bottom:calc(100% + 6px);right:0;overflow-y:auto}.model-menu ul{margin:0;padding:0;list-style:none}.model-menu button{white-space:nowrap;align-items:center;display:flex}.model-menu .menu-label{letter-spacing:0;text-transform:none;font-size:12px}.model-gear{color:var(--muted);margin-right:6px;display:inline-flex}.model-gear svg{width:13px;height:13px}.model-key{color:var(--muted);margin-left:auto;padding-left:12px;font-size:11.5px}.model-check{box-sizing:content-box;text-align:right;width:16px;color:var(--accent);flex:none;margin-left:auto;padding-left:12px}.model-key+.model-check{margin-left:0}.menu-sep{border-top:1px solid var(--border);margin:4px 2px}.status{color:var(--muted);justify-content:space-between;gap:12px;padding:4px max(16px,50% - 430px) 10px;font-size:12px;display:flex}.status button.link:disabled{color:var(--muted);cursor:default}.signed-out{text-align:center;max-width:480px;color:var(--muted);margin:20vh auto}.file-link{cursor:pointer;text-decoration:underline;-webkit-text-decoration-color:var(--border);text-decoration-color:var(--border);text-underline-offset:2px}.file-link:hover{-webkit-text-decoration-color:var(--accent);text-decoration-color:var(--accent)}button.file-link{font:inherit;color:inherit;text-align:left;background:0 0;border:none;padding:0}button.user-attach-chip{border:1px solid var(--border);background:var(--bg);color:var(--muted);padding:2px 8px;font-size:12px}.file-preview{border-left:1px solid var(--border);background:var(--bg);flex-direction:column;flex:none;min-width:280px;display:flex;position:relative}.preview-resize{cursor:col-resize;z-index:1;width:6px;position:absolute;top:0;bottom:0;left:-3px}.preview-head{border-bottom:1px solid var(--border);background:var(--panel);align-items:center;gap:6px;padding:8px 10px;font-size:13px;display:flex}.preview-title{text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;flex:1;min-width:0;overflow:hidden}.preview-head button{padding:2px 8px;font-size:13px}.preview-body{flex-direction:column;flex:1;min-height:0;display:flex;overflow:auto}.preview-frame{background:#fff;border:none;flex:1;width:100%}.preview-image,.preview-video{max-width:100%;margin:12px auto;display:block}.preview-markdown,.preview-code{padding:12px 16px}.preview-text{white-space:pre;margin:0;padding:12px 16px;font-size:13px}.preview-note{color:var(--warn);margin-bottom:8px;font-size:12px}.preview-empty{color:var(--muted);text-align:center;margin:auto;padding:24px}@media (width<=900px){.file-preview{z-index:15;max-width:100%;position:fixed;top:0;bottom:0;right:0;box-shadow:-8px 0 24px #0003}}
1
+ :root{--bg:#fff;--panel:#f6f7f9;--border:#e3e5e8;--text:#1f2328;--muted:#6b7280;--accent:#0e7490;--accent-text:#fff;--ok:#15803d;--fail:#b91c1c;--warn:#b45309;--code-bg:#f3f4f6;--hl-keyword:#cf222e;--hl-string:#0a3069;--hl-comment:#6e7781;--hl-number:#0550ae;--hl-title:#8250df;--hl-attr:#953800;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;color:var(--text);background:var(--bg);font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;font-size:15px;line-height:1.6}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--bg:#0f1115;--panel:#161a20;--border:#2a2f37;--text:#e6e6e6;--muted:#9aa1ab;--accent:#22a6c4;--accent-text:#0f1115;--ok:#4ade80;--fail:#f87171;--warn:#fbbf24;--code-bg:#1c2028;--hl-keyword:#ff7b72;--hl-string:#a5d6ff;--hl-comment:#8b949e;--hl-number:#79c0ff;--hl-title:#d2a8ff;--hl-attr:#ffa657}}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}button{font:inherit;color:var(--text);background:var(--panel);border:1px solid var(--border);cursor:pointer;border-radius:6px;padding:4px 12px}button:disabled{opacity:.5;cursor:default}button.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-text)}button.danger{color:var(--fail)}code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px}.app{height:100%;display:flex}.sidebar{border-right:1px solid var(--border);background:var(--panel);flex-direction:column;flex-shrink:0;width:260px;display:flex}.sidebar-brand{justify-content:space-between;align-items:center;padding:12px 10px 6px 14px;display:flex}.brand{align-items:center;gap:8px;font-size:16px;font-weight:700;display:flex}.brand-mark{background:var(--accent);width:22px;height:22px;color:var(--accent-text);border-radius:6px;flex:none;justify-content:center;align-items:center;font-size:12px;font-weight:700;display:flex}.new-session{text-align:left;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;margin:4px 8px 10px;padding:6px 10px;font-size:14px;display:flex}.new-session svg{color:var(--muted)}.new-session:not(:disabled):hover{background:var(--border)}.ws-header{letter-spacing:.3px;text-transform:uppercase;color:var(--muted);justify-content:space-between;align-items:center;padding:0 8px 4px 14px;font-size:12px;font-weight:600;display:flex}.ws-header-tools{gap:2px;display:flex}.icon-btn{color:var(--muted);background:0 0;border:none;padding:4px;display:flex}.icon-btn:not(:disabled):hover,.icon-btn.on{background:var(--border);color:var(--text)}.sidebar-search{border:1px solid var(--accent);background:var(--bg);color:var(--muted);border-radius:7px;align-items:center;gap:6px;margin:0 8px 6px;padding:3px 4px 3px 8px;display:flex}.sidebar-search input{min-width:0;color:var(--text);font:inherit;background:0 0;border:none;outline:none;flex:1;font-size:14px}.sidebar mark{color:#1f2328;background:#fde68a;border-radius:2px}.sidebar.rail{align-items:center;gap:6px;width:56px;padding:12px 0 10px}.sidebar.rail .brand-mark{width:28px;height:28px;margin-bottom:4px;font-size:14px}.rail-btn{width:36px;height:36px;color:var(--muted);background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;padding:0;display:flex}.rail-btn:not(:disabled):hover{background:var(--border);color:var(--text)}.rail-btn svg{width:18px;height:18px}.rail-gap{flex:1}.sidebar-note{color:var(--muted);padding:0 12px 8px;font-size:13px}.sessions{padding:0 8px 12px;overflow-y:auto}.sessions ul{margin:0;padding:0;list-style:none}.ws>ul{padding-left:16px}.sessions-heading{color:var(--muted);padding:8px 8px 4px;font-size:12px}.session-item{border-radius:6px;margin-bottom:2px}.session-item:hover{background:var(--bg)}.session-item.current{background:var(--bg);box-shadow:inset 2px 0 0 var(--accent)}.session{align-items:center;gap:4px;width:100%;padding:2px 4px 2px 8px;display:flex}.session-pick{text-align:left;min-width:0;color:inherit;font:inherit;background:0 0;border:none;flex:1;padding:2px 0;display:flex}.session .preview{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.session-time{color:var(--muted);flex:none;font-size:12px}.session-status{flex:none;justify-content:center;align-items:center;width:12px;display:flex}.session-status .spinner{width:10px;height:10px}.status-dot{background:var(--warn);border-radius:50%;width:7px;height:7px}.session-badge{color:var(--warn);background:color-mix(in srgb, var(--warn) 14%, transparent);border-radius:4px;flex:none;padding:0 5px;font-size:11px}.ws-more{color:var(--muted);background:0 0;border:none;margin:0 0 4px 16px;padding:0 8px;font-size:12.5px;display:block}.ws-more:hover{color:var(--text)}.menu-label{letter-spacing:.3px;text-transform:uppercase;color:var(--muted);padding:4px 10px 2px;font-size:11px}.menu-check{width:16px;color:var(--accent);display:inline-block}.session-tools{flex:none;gap:2px;display:none}.session-item:hover .session-time{display:none}.session-item:hover .session-tools{display:flex}.session-tools button{color:var(--muted);background:0 0;border:none;border-radius:4px;padding:3px;display:flex}.session-tools button:hover,.session-tools button.on{color:var(--text)}.session-tools button:hover{background:var(--panel)}.context-menu{z-index:10;border:1px solid var(--border);background:var(--bg);border-radius:8px;min-width:160px;margin:0;padding:4px;list-style:none;position:fixed;box-shadow:0 6px 20px #00000026}.context-menu button{text-align:left;background:0 0;border:none;width:100%;padding:4px 10px;font-size:14px}.context-menu button:not(:disabled):hover{background:var(--panel)}.ws-head{color:var(--muted);align-items:center;gap:4px;padding:6px 4px 2px 2px;font-size:12px;display:flex}.ws-head.active .ws-name{color:var(--text);font-weight:600}.ws-head.missing{opacity:.6}.ws-toggle{min-width:0;color:inherit;text-align:left;background:0 0;border:none;flex:1;align-items:center;gap:4px;padding:0 4px;font-size:12px;display:flex}.ws-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ws-note{flex:none}.ws-tools{flex:none;gap:2px;display:none}.ws-head:hover .ws-tools{display:flex}.ws-tools button{color:var(--muted);background:0 0;border:none;padding:3px;display:flex}.ws-chevron{flex:none;display:flex}.ws-tools button:hover{background:var(--panel);color:var(--text)}.session-folder{text-overflow:ellipsis;white-space:nowrap;max-width:72px;color:var(--muted);flex:none;font-size:12px;overflow:hidden}.session-item:hover .session-folder{display:none}.modal-backdrop{z-index:20;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal{border:1px solid var(--border);background:var(--bg);border-radius:10px;flex-direction:column;gap:8px;width:min(520px,90vw);max-height:70vh;padding:12px;display:flex}.crumbs{flex-wrap:wrap;display:flex}.crumbs button,.dirs button{text-align:left;background:0 0;border:none;padding:2px 4px}.dirs{border:1px solid var(--border);border-radius:6px;min-height:160px;margin:0;padding:0;list-style:none;overflow-y:auto}.dirs button{width:100%;padding:4px 8px}.dirs button:hover,.crumbs button:hover{background:var(--panel)}.modal-title{font-weight:600}.recent button{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.dir-path{color:var(--muted);margin-left:8px;font-size:12px}.new-folder-where{align-items:center;gap:8px;font-size:13px;display:flex}.where-path{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--muted);flex:1;overflow:hidden}.modal-error{color:var(--fail);font-size:13px}.sidebar-user{align-items:center;gap:8px;margin:auto 8px 8px;padding:6px 4px 6px 8px;display:flex}.avatar{background:var(--accent);width:24px;height:24px;color:var(--accent-text);border-radius:50%;flex:none;justify-content:center;align-items:center;font-size:12px;font-weight:600;display:flex}.user-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:13px;overflow:hidden}.settings{border:1px solid var(--border);background:var(--bg);border-radius:12px;width:min(860px,94vw);height:min(600px,86vh);display:flex;overflow:hidden;box-shadow:0 16px 48px #0003}.settings-nav{border-right:1px solid var(--border);background:var(--panel);flex-direction:column;flex:none;gap:2px;width:180px;padding:16px 8px;display:flex}.settings-nav-title{color:var(--muted);padding:0 8px 10px;font-size:13px}.settings-nav button{text-align:left;background:0 0;border:none;border-radius:6px;padding:6px 8px;font-size:14px}.settings-nav button.active{background:var(--bg);font-weight:600}.settings-body{flex-direction:column;flex:1;gap:14px;min-width:0;padding:20px 28px;display:flex;overflow-y:auto}.settings-head{justify-content:space-between;align-items:center;display:flex}.settings-head h2{margin:0;font-size:18px}.settings-desc{color:var(--muted);margin:-6px 0 0;font-size:13px}.model-cards{border:1px solid var(--border);border-radius:8px;margin:0;padding:0;list-style:none}.model-card{align-items:center;gap:10px;padding:10px 12px;display:flex}.model-card+.model-card{border-top:1px solid var(--border)}.model-main{flex:1;min-width:0}.model-name{font-weight:600}.model-meta{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.model-card>button:not(.icon-btn){padding:3px 12px;font-size:13px}.badge{background:color-mix(in srgb, var(--accent) 15%, transparent);color:var(--accent);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600}.settings-subhead{color:var(--muted);margin-top:6px;font-size:12px;font-weight:600}.skill-desc{-webkit-line-clamp:2;color:var(--muted);-webkit-box-orient:vertical;font-size:12px;display:-webkit-box;overflow:hidden}.settings-empty,.settings-note{color:var(--muted);font-size:13px}.add-model{align-self:flex-start}.model-form{border:1px solid var(--border);border-radius:8px;flex-direction:column;gap:12px;padding:14px;display:flex}.model-form label{flex-direction:column;gap:4px;font-size:13px;display:flex}.model-form label em{color:var(--muted);font-style:normal;font-weight:400}.model-form input{border:1px solid var(--border);font:inherit;background:var(--bg);color:inherit;border-radius:6px;padding:6px 8px}.model-form small{color:var(--muted);font-size:12px}.model-form label.check{flex-direction:row;align-items:center;gap:6px}.model-form label.check input{margin:0;padding:0}.model-form .check-note{margin-top:-8px}.model-vision{color:var(--muted);cursor:pointer;align-items:center;gap:4px;font-size:12px;display:flex}.model-vision input{margin:0}button.link{color:var(--accent);font-size:inherit;cursor:pointer;background:0 0;border:none;padding:0}button.link:not(:disabled):hover{text-decoration:underline}.spacer{flex:1}.session-rename{border:1px solid var(--border);width:100%;font:inherit;background:var(--panel);color:var(--fg);border-radius:4px;padding:4px 6px}.user-attach-fallback{color:var(--muted);font-size:13px}main{flex-direction:column;flex:1;min-width:0;display:flex}.banner{color:var(--warn);border-bottom:1px solid var(--border);padding:6px 16px;font-size:13px}.messages{flex:1;padding:16px max(16px,50% - 430px);overflow-y:auto}.empty{text-align:center;flex-direction:column;justify-content:center;align-items:center;min-height:min(52vh,420px);padding:24px 16px;display:flex}.empty-title{letter-spacing:-.02em;color:var(--text);font-size:1.25rem;font-weight:600}.empty-hint{max-width:28rem;color:var(--muted);margin:8px 0 0;font-size:14px}.user{background:var(--panel);white-space:pre-wrap;word-break:break-word;border-radius:8px;margin:20px 0 8px;padding:8px 12px}.user-attach{flex-wrap:wrap;gap:6px;margin-bottom:6px;display:flex}.user-attach-chip{background:var(--bg);border:1px solid var(--border);color:var(--muted);white-space:nowrap;border-radius:999px;padding:2px 8px;font-size:12px}.reply{word-break:break-word}.reply pre{background:var(--code-bg);border-radius:6px;padding:10px 12px;overflow-x:auto}.reply :not(pre)>code{background:var(--code-bg);border-radius:4px;padding:1px 4px}.reply table{border-collapse:collapse}.reply th,.reply td{border:1px solid var(--border);padding:4px 8px}.hljs-keyword,.hljs-selector-tag,.hljs-literal{color:var(--hl-keyword)}.hljs-string,.hljs-regexp{color:var(--hl-string)}.hljs-comment,.hljs-quote{color:var(--hl-comment);font-style:italic}.hljs-number,.hljs-variable{color:var(--hl-number)}.hljs-title,.hljs-section,.hljs-function{color:var(--hl-title)}.hljs-attr,.hljs-attribute,.hljs-built_in,.hljs-type{color:var(--hl-attr)}.tool{white-space:nowrap;align-items:center;gap:8px;margin:4px 0;font-size:14px;display:flex;overflow:hidden}.tool .dot{color:var(--accent)}.tool.failed .dot,.tool.failed .result{color:var(--fail)}.tool .name{font-weight:600}.tool .summary{color:var(--muted);text-overflow:ellipsis;overflow:hidden}.tool.ok .result{color:var(--ok)}.steps{margin:6px 0}.steps-head{max-width:100%;color:var(--muted);white-space:nowrap;background:0 0;border:none;align-items:center;gap:6px;padding:2px 4px 2px 0;font-size:13px;display:flex;overflow:hidden}.steps-head:hover{color:var(--text)}.steps-title{font-weight:600}.steps-detail{text-overflow:ellipsis;overflow:hidden}.steps-failed{color:var(--fail)}.steps-body{border-left:1px solid var(--border);margin-left:6px;padding-left:12px}.notice{color:var(--muted);margin:4px 0;font-size:13px}.notice.error{color:var(--fail)}.thinking{color:var(--muted);align-items:center;gap:8px;margin:8px 0;display:flex}.spinner{border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;width:12px;height:12px;animation:.8s linear infinite spin;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.card{border:1px solid var(--warn);border-radius:8px;margin:12px 0;padding:12px}.card-title{margin-bottom:8px;font-weight:600}.card-body{background:var(--code-bg);white-space:pre-wrap;border-radius:6px;max-height:240px;margin:0 0 12px;padding:8px;overflow:auto}.card-actions{gap:8px;display:flex}.composer-wrap{padding:8px max(16px,50% - 430px)}.todos{border:1px solid var(--border);background:var(--panel);border-radius:8px;margin:0 max(16px,50% - 430px);padding:6px 10px;font-size:13px}.todos-head{max-width:100%;color:var(--muted);background:0 0;border:none;align-items:center;gap:6px;padding:0;display:flex}.todos-head:hover{color:var(--text)}.todos-title{font-weight:600}.todos-current{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.todos-list{max-height:160px;margin:6px 0 2px;padding:0;list-style:none;overflow-y:auto}.todos-list li{gap:6px;padding:1px 0;display:flex}.todos-list li.completed{color:var(--muted);text-decoration:line-through}.todos-list li.in_progress{font-weight:600}.todos-mark{flex:none;width:1em}.attach-rail{gap:8px;padding-bottom:8px;display:flex;overflow-x:auto}.attach-card{border:1px solid var(--border);background:var(--panel);border-radius:12px;flex:none;align-items:center;gap:8px;min-width:180px;max-width:240px;height:64px;padding:6px 8px;display:flex;position:relative}.attach-card img{object-fit:cover;border-radius:6px;width:48px;height:48px}.attach-ext{width:48px;height:48px;color:var(--muted);background:var(--bg);border-radius:6px;place-items:center;font-size:11px;font-weight:600;display:grid}.attach-meta{flex:1;min-width:0}.attach-name{text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.attach-sub{color:var(--muted);font-size:11px}.attach-card.error .attach-sub{color:var(--fail)}.attach-remove{width:22px;line-height:1;position:absolute;top:2px;right:2px;border-radius:11px!important;height:22px!important;padding:0!important}.composer{border:1px solid var(--border);background:var(--bg);border-radius:12px;flex-direction:column;padding:8px 8px 6px 12px;display:flex}.composer:focus-within{border-color:var(--accent)}.composer textarea{resize:none;font:inherit;color:var(--text);background:0 0;border:none;outline:none;padding:2px 0}.composer-bar{align-items:center;gap:6px;margin-top:4px;display:flex}.composer-bar .attach-btn{width:30px;height:30px;color:var(--muted);background:0 0;border:none;border-radius:8px;padding:0;font-size:20px;line-height:1}.composer-bar .attach-btn:not(:disabled):hover{background:var(--border);color:var(--text)}.send-btn{background:var(--accent);border-color:var(--accent);width:32px;height:32px;color:var(--accent-text);border-radius:50%;place-items:center;padding:0;display:grid}.send-btn.stop{background:var(--text);border-color:var(--text);color:var(--bg)}.model-picker{position:relative}.model-btn{max-width:260px;height:30px;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;background:0 0;border:none;border-radius:8px;align-items:center;gap:4px;padding:0 6px 0 10px;font-size:13px;display:flex;overflow:hidden}.model-chev{flex:none;display:inline-flex;transform:rotate(-90deg)}.model-btn:not(:disabled):hover,.model-btn.on{background:var(--border);color:var(--text)}.context-menu.model-menu{min-width:240px;max-height:50vh;position:absolute;bottom:calc(100% + 6px);right:0;overflow-y:auto}.model-menu ul{margin:0;padding:0;list-style:none}.model-menu button{white-space:nowrap;align-items:center;display:flex}.model-menu .menu-label{letter-spacing:0;text-transform:none;font-size:12px}.model-gear{color:var(--muted);margin-right:6px;display:inline-flex}.model-gear svg{width:13px;height:13px}.model-key{color:var(--muted);margin-left:auto;padding-left:12px;font-size:11.5px}.model-check{box-sizing:content-box;text-align:right;width:16px;color:var(--accent);flex:none;margin-left:auto;padding-left:12px}.model-key+.model-check{margin-left:0}.menu-sep{border-top:1px solid var(--border);margin:4px 2px}.status{color:var(--muted);justify-content:space-between;gap:12px;padding:4px max(16px,50% - 430px) 10px;font-size:12px;display:flex}.status button.link:disabled{color:var(--muted);cursor:default}.signed-out{text-align:center;max-width:480px;color:var(--muted);margin:20vh auto}.file-link{cursor:pointer;text-decoration:underline;-webkit-text-decoration-color:var(--border);text-decoration-color:var(--border);text-underline-offset:2px}.file-link:hover{-webkit-text-decoration-color:var(--accent);text-decoration-color:var(--accent)}button.file-link{font:inherit;color:inherit;text-align:left;background:0 0;border:none;padding:0}button.user-attach-chip{border:1px solid var(--border);background:var(--bg);color:var(--muted);padding:2px 8px;font-size:12px}.side-panel{border-left:1px solid var(--border);background:var(--bg);flex-direction:column;flex:none;min-width:280px;display:flex;position:relative}.preview-resize{cursor:col-resize;z-index:1;width:6px;position:absolute;top:0;bottom:0;left:-3px}.preview-head{border-bottom:1px solid var(--border);background:var(--panel);align-items:center;gap:6px;padding:8px 10px;font-size:13px;display:flex}.preview-title{text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;flex:1;min-width:0;overflow:hidden}.preview-head button{padding:2px 8px;font-size:13px}.preview-body{flex-direction:column;flex:1;min-height:0;display:flex;overflow:auto}.preview-frame{background:#fff;border:none;flex:1;width:100%}.preview-image,.preview-video{max-width:100%;margin:12px auto;display:block}.preview-markdown,.preview-code{padding:12px 16px}.preview-text{white-space:pre;margin:0;padding:12px 16px;font-size:13px}.preview-note{color:var(--warn);margin-bottom:8px;font-size:12px}.preview-empty{color:var(--muted);text-align:center;margin:auto;padding:24px}.side-switch{background:var(--panel);gap:4px;padding:6px 10px 0;display:flex}.side-switch button{padding:2px 10px;font-size:12px}.side-switch button.active{background:var(--bg);font-weight:600}.browser-address{flex:1;min-width:0;display:flex}.browser-address input{flex:1;min-width:0;padding:3px 8px;font-size:12px}.browser-head select{max-width:120px;font-size:12px}.browser-agent{color:var(--accent);background:var(--panel);border-bottom:1px solid var(--border);padding:4px 10px;font-size:12px}.browser-error{margin:0;padding:4px 10px}.browser-dialog{background:var(--panel);border-bottom:1px solid var(--border);flex-wrap:wrap;align-items:center;gap:6px;padding:6px 10px;font-size:12px;display:flex}.browser-dialog span{white-space:pre-wrap;overflow-wrap:anywhere;flex:1;min-width:0}.browser-dialog input{flex:1;min-width:120px;padding:3px 8px;font-size:12px}.browser-screen{background:var(--panel);flex-direction:column;flex:1;min-height:0;display:flex;overflow:auto}.browser-frame{position:relative}.browser-frame img{-webkit-user-select:none;user-select:none;width:100%;height:auto;display:block}.browser-keys{resize:none;opacity:0;cursor:default;caret-color:#0000;border:none;width:100%;height:100%;padding:0;position:absolute;inset:0}@media (width<=900px){.side-panel{z-index:15;max-width:100%;position:fixed;top:0;bottom:0;right:0;box-shadow:-8px 0 24px #0003}}