@ashwin-pc/pi-web 0.1.2

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,82 @@
1
+ /**
2
+ * pi-web bundled auto-session-name extension.
3
+ *
4
+ * Automatically names a session from the first user prompt using the active
5
+ * model. The name is set only once and only if the session has no name yet.
6
+ */
7
+
8
+ import { complete } from "@mariozechner/pi-ai";
9
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
10
+
11
+ type SessionEntry = {
12
+ type: string;
13
+ message?: {
14
+ role?: string;
15
+ };
16
+ };
17
+
18
+ function cleanSessionName(text: string) {
19
+ return text
20
+ .trim()
21
+ .replace(/^```(?:text)?\s*/i, "")
22
+ .replace(/```$/i, "")
23
+ .trim()
24
+ .replace(/^Title:\s*/i, "")
25
+ .replace(/^[\["'“”‘’]+|[\["'“”‘’]+$/g, "")
26
+ .replace(/[.!?]+$/g, "")
27
+ .trim();
28
+ }
29
+
30
+ export default function (pi: ExtensionAPI) {
31
+ pi.on("before_agent_start", async (event, ctx) => {
32
+ // Skip if this session already has a friendly name.
33
+ if (pi.getSessionName()) return;
34
+
35
+ // Only name new sessions from their first user prompt.
36
+ const branch = ctx.sessionManager.getBranch() as SessionEntry[];
37
+ const hasAssistantMessages = branch.some(
38
+ (entry) => entry.type === "message" && entry.message?.role === "assistant",
39
+ );
40
+ if (hasAssistantMessages) return;
41
+
42
+ const model = ctx.model;
43
+ if (!model) return;
44
+
45
+ const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
46
+ if (!auth.ok) return;
47
+
48
+ try {
49
+ const response = await complete(
50
+ model,
51
+ {
52
+ systemPrompt:
53
+ "You generate concise chat/session titles. Given the user's first prompt, respond with only a short title of 3–6 words. Do not use quotes, markdown, punctuation at the end, or explanations.",
54
+ messages: [
55
+ {
56
+ role: "user",
57
+ content: [{ type: "text", text: `Prompt: ${event.prompt}` }],
58
+ timestamp: Date.now(),
59
+ },
60
+ ],
61
+ },
62
+ { apiKey: auth.apiKey, headers: auth.headers, signal: ctx.signal },
63
+ );
64
+
65
+ if (response.stopReason === "error") {
66
+ console.error("[pi-web auto-session-name] model error:", response.errorMessage);
67
+ return;
68
+ }
69
+
70
+ const name = cleanSessionName(
71
+ response.content
72
+ .filter((part): part is { type: "text"; text: string } => part.type === "text")
73
+ .map((part) => part.text)
74
+ .join(""),
75
+ );
76
+
77
+ if (name) pi.setSessionName(name.slice(0, 80));
78
+ } catch (error) {
79
+ console.error("[pi-web auto-session-name] error:", String(error));
80
+ }
81
+ });
82
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ashwin Pc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,162 @@
1
+ # pi-web
2
+
3
+ A small local/Tailscale web UI for [`@mariozechner/pi-coding-agent`](https://www.npmjs.com/package/@mariozechner/pi-coding-agent).
4
+
5
+ ![pi-web showcase](tests/e2e/visual.spec.ts-snapshots/hero-showcase-desktop.png)
6
+
7
+ The app is TypeScript end-to-end:
8
+
9
+ - Git panel: inspect repo status, browse commit history, view per-file and per-commit diffs, and sync with `fetch` + rebase pull
10
+ - Shared diff viewer: side-by-side or stacked layouts with intraline highlighting, used by both edit tool cards and Git diffs
11
+ - `supervisor.ts` is a small stable dev supervisor that owns the public port and restarts the app server safely
12
+ - `server.ts` is the restartable Pi API/WebSocket server, run directly with `tsx`
13
+ - `src/main.ts` bootstraps the modular Vite frontend with HMR; see [docs/frontend-architecture.md](docs/frontend-architecture.md)
14
+ - in dev, `server.ts` embeds Vite middleware while `supervisor.ts` proxies API, WebSocket, and HMR traffic
15
+ - `contexts/web-ui.md` is always injected into agent sessions for web UI behavior like image/artifact rendering
16
+ - bundled pi extensions add pi-web defaults, including automatic session naming from the first prompt
17
+ - `AGENTS.md` provides normal project-specific pi instructions when the target cwd is this repo
18
+
19
+ ## Install
20
+
21
+ For development:
22
+
23
+ ```bash
24
+ npm install
25
+ ```
26
+
27
+ From a GitHub release asset:
28
+
29
+ ```bash
30
+ # Download pi-web-<version>.tgz from the release page, then:
31
+ npm install -g ./pi-web-*.tgz
32
+ pi-web
33
+ ```
34
+
35
+ `pi-web` starts the production server on `http://127.0.0.1:8787` by default. It runs Pi in the directory where you call the command; override with `PI_WEB_CWD=/path/to/project pi-web`.
36
+
37
+ ## Run locally with Vite HMR
38
+
39
+ ```bash
40
+ npm run dev
41
+ ```
42
+
43
+ This starts a stable TypeScript supervisor on `8787` and a restartable child server on `8788`. The public URL still serves:
44
+
45
+ - Vite frontend with HMR
46
+ - Pi API routes under `/api/*`
47
+ - Pi WebSocket at `/ws`
48
+
49
+ The supervisor also exposes:
50
+
51
+ - `POST /api/restart` - restart the child server safely
52
+ - `GET /__supervisor/status` - inspect child PID/generation
53
+
54
+ Open:
55
+
56
+ ```text
57
+ http://127.0.0.1:8787
58
+ ```
59
+
60
+ Edit files under `src/` and Vite will update the UI live. If the agent edits `server.ts`, call `POST /api/restart` instead of killing the public server; the supervisor stays alive and the browser reconnects.
61
+
62
+ By default, Pi operates in the directory where you start this server. To point Pi at another project:
63
+
64
+ ```bash
65
+ PI_WEB_CWD=/Users/ashwin/projects/comfy-lan-webapp npm run dev
66
+ ```
67
+
68
+ ## Screenshots
69
+
70
+ The README references the same deterministic Playwright visual snapshots used by `tests/e2e/visual.spec.ts`. When visual snapshots are intentionally updated, these images update with them.
71
+
72
+ <picture>
73
+ <source media="(max-width: 700px)" srcset="tests/e2e/visual.spec.ts-snapshots/hero-showcase-mobile.png">
74
+ <img alt="pi-web diff review" src="tests/e2e/visual.spec.ts-snapshots/diff-review-desktop.png">
75
+ </picture>
76
+
77
+ ### Git status, graph, and commit diffs
78
+
79
+ The Git button in the header opens a responsive Git panel. Desktop uses a split master/detail layout; mobile switches between status, graph, diff, and commit detail views.
80
+
81
+ <picture>
82
+ <source media="(max-width: 700px)" srcset="tests/e2e/visual.spec.ts-snapshots/git-diff-viewer-mobile.png">
83
+ <img alt="pi-web Git commit diff viewer" src="tests/e2e/visual.spec.ts-snapshots/git-diff-viewer-desktop.png">
84
+ </picture>
85
+
86
+ ### Conversation tree
87
+
88
+ Navigate in-file pi session branches with a compact tree drawer. The default view keeps tool noise hidden, while the full session structure remains available from the filter.
89
+
90
+ <picture>
91
+ <source media="(max-width: 700px)" srcset="tests/e2e/visual.spec.ts-snapshots/conversation-tree-mobile.png">
92
+ <img alt="pi-web conversation tree" src="tests/e2e/visual.spec.ts-snapshots/conversation-tree-desktop.png">
93
+ </picture>
94
+
95
+ ![pi-web mobile sessions](tests/e2e/visual.spec.ts-snapshots/sessions-drawer-mobile.png)
96
+
97
+ ## Production build
98
+
99
+ ```bash
100
+ npm run build
101
+ npm start
102
+ ```
103
+
104
+ `npm start` serves the compiled `dist/` app and API from one process.
105
+
106
+ ## Run on Tailscale with MagicDNS
107
+
108
+ Recommended: keep the Node app localhost-only and expose it with Tailscale Serve.
109
+
110
+ ```bash
111
+ npm run build
112
+ PI_WEB_TOKEN="$(openssl rand -hex 32)" \
113
+ PI_WEB_CWD=/Users/ashwin/projects/comfy-lan-webapp \
114
+ HOST=127.0.0.1 \
115
+ PORT=8787 \
116
+ npm start
117
+ ```
118
+
119
+ In another terminal:
120
+
121
+ ```bash
122
+ tailscale serve --bg http://127.0.0.1:8787
123
+ ```
124
+
125
+ Then open:
126
+
127
+ ```text
128
+ https://<machine-name>.<tailnet>.ts.net
129
+ ```
130
+
131
+ Click **Token** in the UI and paste the `PI_WEB_TOKEN` value.
132
+
133
+ ## Direct Tailnet bind
134
+
135
+ You can also bind directly to your Tailscale IP:
136
+
137
+ ```bash
138
+ PI_WEB_TOKEN="$(openssl rand -hex 32)" \
139
+ HOST="$(tailscale ip -4)" \
140
+ PORT=8787 \
141
+ npm start
142
+ ```
143
+
144
+ Then open:
145
+
146
+ ```text
147
+ http://<machine-name>:8787
148
+ ```
149
+
150
+ ## Environment variables
151
+
152
+ - `HOST` - bind host, default `127.0.0.1`
153
+ - `PORT` - bind port, default `8787`
154
+ - `PI_WEB_TOKEN` - optional bearer token for API/WebSocket access
155
+ - `PI_WEB_CWD` - project directory Pi should operate in, default current directory
156
+ - `PI_WEB_NO_SESSION=1` - use in-memory sessions only
157
+ - `PI_WEB_CHILD_PORT` - supervised child port, default `8788`
158
+ - `PI_WEB_RESTART_GRACE_MS` - delay between child stop/start, default `250`
159
+
160
+ ## Security
161
+
162
+ This app can drive Pi tools such as `bash`, `write`, and `edit`. Use Tailscale ACLs and set `PI_WEB_TOKEN`.
package/bin/pi-web.js ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { constants as osConstants } from "node:os";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ const appDir = fileURLToPath(new URL("..", import.meta.url));
7
+ const env = { ...process.env };
8
+
9
+ env.PI_WEB_CWD ||= process.cwd();
10
+ env.PI_WEB_DEV = "0";
11
+ env.NODE_ENV = "production";
12
+
13
+ const child = spawn(process.execPath, ["--import", "tsx", "supervisor.ts"], {
14
+ cwd: appDir,
15
+ env,
16
+ stdio: "inherit",
17
+ });
18
+
19
+ const forwardedSignals = ["SIGINT", "SIGTERM", "SIGHUP"];
20
+ for (const signal of forwardedSignals) {
21
+ process.on(signal, () => {
22
+ if (!child.killed) child.kill(signal);
23
+ });
24
+ }
25
+
26
+ child.on("exit", (code, signal) => {
27
+ for (const forwardedSignal of forwardedSignals) process.removeAllListeners(forwardedSignal);
28
+ const signalNumber = signal ? osConstants.signals[signal] : undefined;
29
+ process.exit(code ?? (signalNumber ? 128 + signalNumber : 0));
30
+ });
31
+
32
+ child.on("error", (error) => {
33
+ console.error(`pi-web failed to start: ${error.message}`);
34
+ process.exit(1);
35
+ });
@@ -0,0 +1,18 @@
1
+ # pi-web UI context
2
+
3
+ You are running inside pi-web, a browser UI harness around the pi coding agent.
4
+
5
+ ## User-visible artifacts
6
+
7
+ When creating files the user should view from the web UI, such as screenshots, diagrams, images, reports, or downloadable outputs:
8
+
9
+ - Write them under `.pi/web/artifacts/` in the current working directory.
10
+ - Reference images in your response with Markdown image syntax:
11
+ `![description](/api/artifacts/<filename>)`
12
+ - Reference non-image files in your response with Markdown link syntax:
13
+ `[filename](/api/artifacts/<filename>)`
14
+ - Markdown (`.md`, `.markdown`), HTML (`.html`, `.htm`), and video (`.mp4`, `.webm`, `.mov`, `.ogv`) artifact links are previewed inline in chat.
15
+ - Prefer short, stable, URL-safe filenames.
16
+ - Do not ask users to open arbitrary local filesystem paths like `/tmp/...` for user-visible artifacts unless they explicitly ask for the local path.
17
+
18
+ The `/api/artifacts/<filename>` route serves files from `.pi/web/artifacts/`.
Binary file
@@ -0,0 +1 @@
1
+ :root{color-scheme:dark;--bg: #0b0f14;--panel: #111821;--panel-2: #17212d;--border: #263342;--text: #e7edf5;--muted: #93a4b8;--accent: #7dd3fc;--danger: #fb7185;--user: #1e3a5f;--assistant: #17212d;--tool: #2a2336;--app-height: 100vh}*{box-sizing:border-box}html,body{width:100%;max-width:100%;height:var(--app-height);overflow:hidden}body{margin:0;min-height:var(--app-height);background:radial-gradient(circle at top,#142032 0,var(--bg) 42rem);color:var(--text);font:15px/1.5 ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.app{display:grid;grid-template-columns:1fr;grid-template-rows:auto minmax(0,1fr) auto auto;width:100%;min-width:0;height:var(--app-height);max-width:1100px;margin:0 auto;padding:0 0 16px;gap:0;overflow:hidden}.composer{grid-row:3;min-width:0;overflow:visible;background:color-mix(in srgb,var(--panel) 92%,transparent);border:1px solid var(--border);border-radius:16px;box-shadow:0 18px 60px #00000040;padding:0;margin:8px 16px 0}p{margin:0}.statusBar{grid-row:1;display:flex;align-items:center;gap:8px;min-width:0;padding:0 8px;height:24px;flex-shrink:0}.statusBar .iconButton{flex:0 0 auto;width:24px;min-width:24px;min-height:24px;height:24px;border-color:transparent;background:transparent}.statusBarButton:hover{border-color:transparent;color:var(--accent)}.statusBar .iconButton svg{width:15px;height:15px}.statusTitle{flex:0 0 auto;color:var(--text);font-size:12px;font-weight:700;letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:240px;cursor:pointer}.statusTitle:hover{color:var(--accent)}.statusTitleInput{width:min(240px,34vw);height:20px;border:1px solid var(--border);border-radius:4px;background:var(--panel-2);color:var(--text);font:inherit;font-weight:700;padding:0 6px}.statusPath{flex:1 1 auto;min-width:0;overflow:hidden;color:var(--muted);font-size:11px;text-overflow:ellipsis;white-space:nowrap}.connectionStatus{flex:0 0 auto;max-width:min(220px,34vw);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid color-mix(in srgb,var(--muted) 32%,transparent);border-radius:999px;padding:1px 8px;color:var(--muted);font-size:11px;line-height:17px}.connectionStatus[hidden]{display:none}.connectionStatus.reconnecting{border-color:color-mix(in srgb,var(--accent) 38%,transparent);color:var(--accent)}.connectionStatus.offline{border-color:color-mix(in srgb,var(--danger, #ef4444) 45%,transparent);color:var(--danger, #ef4444)}.connectionStatus.reconnected{border-color:color-mix(in srgb,var(--success, #22c55e) 45%,transparent);color:var(--success, #22c55e)}.connectionStatus.syncRequired{border-color:color-mix(in srgb,var(--accent) 50%,transparent);color:var(--accent);cursor:pointer}.messages{grid-row:2;min-height:0;overflow:auto;padding:8px 0 32px;display:flex;flex-direction:column;gap:0;-webkit-mask-image:linear-gradient(to bottom,transparent 0%,black 36px,black calc(100% - 36px),transparent 100%);mask-image:linear-gradient(to bottom,transparent 0%,black 36px,black calc(100% - 36px),transparent 100%)}.message{max-width:88%;padding:12px 14px;border:1px solid var(--border);border-radius:14px;white-space:pre-wrap;overflow-wrap:anywhere}.markdownBody{white-space:normal}.markdownBody>:first-child{margin-top:0}.markdownBody>:last-child{margin-bottom:0}.markdownBody p,.markdownBody ul,.markdownBody ol,.markdownBody blockquote,.markdownBody pre,.markdownBody table{margin:0 0 .8em}.markdownBody ul,.markdownBody ol{padding-left:1.4em}.markdownBody blockquote{border-left:3px solid var(--border);color:var(--muted);padding-left:1em}.markdownBody code{border:1px solid var(--border);border-radius:6px;background:var(--panel-2);padding:.1em .3em;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.92em}.markdownBody pre{overflow:auto;border:1px solid var(--border);border-radius:10px;background:var(--panel-2);padding:10px 12px;position:relative}.copyCode{position:absolute;top:8px;right:8px;display:inline-flex;align-items:center;justify-content:center;width:30px;min-width:30px;height:30px;min-height:30px;border:none;border-radius:8px;background:#0000;color:var(--muted);padding:0;visibility:hidden;opacity:0;transition:opacity .15s ease;cursor:pointer}.copyCode svg{width:15px;height:15px}.markdownBody pre:hover .copyCode,.markdownBody pre:focus-within .copyCode{visibility:visible;opacity:1}.copyCode:hover{border:none;background:#ffffff14;color:var(--text)}.markdownBody pre code{border:0;background:transparent;padding:0}.markdownBody pre code.hljs{display:block;overflow:visible;background:transparent;padding:0}.markdownBody table{display:block;overflow:auto;border-collapse:collapse}.markdownBody th,.markdownBody td{border:1px solid var(--border);padding:6px 8px}.markdownBody a{color:var(--accent)}.artifactPreview{margin:10px 0 14px;border:1px solid var(--border);border-radius:12px;background:var(--panel);overflow:hidden}.artifactPreviewHeader{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 10px;border-bottom:1px solid var(--border);color:var(--muted);font-size:12px}.artifactPreviewTitle{color:var(--text);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.artifactPreviewContent{padding:12px;max-height:70vh;overflow:auto}.artifactPreview--html .artifactPreviewContent{padding:0}.artifactPreviewFrame{display:block;width:100%;height:min(70vh,720px);border:0;background:#fff;border-radius:0}.artifactPreviewVideo{display:block;width:100%;max-height:min(70vh,720px);border-radius:0 0 12px 12px;background:#000}.artifactPreview--video .artifactPreviewContent{padding:0;overflow:hidden}.artifactPreview--error .artifactPreviewContent{color:#fecdd3}.markdownBody img{display:block;max-width:min(100%,900px);max-height:70vh;height:auto;border-radius:10px;object-fit:contain}.imageFrame{display:inline-flex;position:relative;max-width:100%;min-width:80px;min-height:60px;vertical-align:top}.imageFrame>img{max-width:100%}.imageActions{position:absolute;top:8px;right:8px;display:flex;gap:4px;visibility:hidden;opacity:0;transition:opacity .15s ease}.imageFrame:hover .imageActions,.imageFrame:focus-within .imageActions{visibility:visible;opacity:1}.imageAction{display:inline-flex;align-items:center;justify-content:center;width:30px;min-width:30px;height:30px;min-height:30px;border:none;border-radius:8px;background:#0000007a;color:#fff;padding:0;text-decoration:none;cursor:pointer;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.imageAction:hover{border:none;background:#000000ad}.imageAction svg{width:15px;height:15px}.message.collapsed .body{position:relative;max-height:18rem;overflow:hidden}.message.collapsed .body:after{content:"";position:absolute;inset:auto 0 0;height:4rem;background:linear-gradient(transparent,var(--message-bg, var(--panel)) 82%)}.messageToggle{display:inline-flex;height:auto;min-height:0;margin-top:4px;border:none;background:transparent;color:var(--accent);padding:1px 4px;font-size:11px;line-height:1.4}.messageToggle:hover{border:none}.message.user{--message-bg: var(--user);align-self:flex-end;background:var(--user);margin:12px 16px 12px 0}.messageText{display:block;white-space:pre-wrap;word-break:break-word}.messageImages{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.messageImageThumb{max-width:260px;max-height:200px;border-radius:6px;object-fit:contain;display:block}.messageImages .imageFrame:only-child .messageImageThumb{max-width:320px;max-height:280px}.messageImageMissing{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;border-radius:6px;background:#ffffff14;color:var(--muted);font-size:12px;border:1px dashed rgba(255,255,255,.2);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.imageOverlay{position:fixed;inset:0;z-index:9999;background:#000000d9;display:flex;align-items:center;justify-content:center;cursor:zoom-out}.imageOverlay img{max-width:92vw;max-height:92vh;border-radius:8px;object-fit:contain}.message.assistant{--message-bg: var(--bg);align-self:stretch;background:transparent;border:none;max-width:100%;width:100%}.message.system{align-self:center;max-width:100%;background:transparent;color:var(--muted);margin:8px 0}.jumpToLatestButton{position:fixed;left:50%;bottom:116px;z-index:20;transform:translate(-50%);width:auto;min-width:0;min-height:32px;border-color:color-mix(in srgb,var(--accent) 45%,var(--border));border-radius:999px;background:color-mix(in srgb,var(--panel) 88%,transparent);box-shadow:0 8px 28px #00000059;color:var(--accent);padding:5px 12px;font-size:12px;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.jumpToLatestButton:hover{background:color-mix(in srgb,var(--panel-2) 92%,transparent)}.jumpToLatestButton[hidden]{display:none}.message.system.compaction{align-self:stretch;background:#facc1514;border-color:#facc1547;color:#fde68a;margin:10px 16px}.message.system.compaction .compactionCancel{margin-top:8px;min-height:28px;padding:4px 10px;border-color:#facc1559;color:#fde68a;background:#facc1514}.message.system.compaction .compactionCancel:hover:not(:disabled){background:#facc1524}.message.error{border-color:var(--danger);color:#fecdd3}.contextMeter{--context-percent: 0%;position:absolute;top:-6px;left:14px;right:14px;z-index:2;display:block;width:auto;height:5px;min-height:5px;border:0;border-radius:999px;background:transparent;padding:0;overflow:visible;cursor:help}.contextMeter.warning,.contextMeter.danger{height:5px;min-height:5px}.contextMeter.unknown{top:-3px;height:2px;min-height:2px}.contextMeterTrack{position:absolute;top:0;left:0;right:0;height:3px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--muted) 6%,transparent)}.contextMeterFill{display:block;width:var(--context-percent);max-width:100%;height:100%;border-radius:999px;background:color-mix(in srgb,var(--accent) 64%,var(--muted));transition:width .18s ease,background-color .18s ease}.contextMeter.normal .contextMeterFill{background:color-mix(in srgb,var(--muted) 24%,transparent)}.contextMeter.active .contextMeterTrack{background:color-mix(in srgb,var(--muted) 14%,transparent)}.contextMeter.active .contextMeterFill{background:color-mix(in srgb,var(--accent) 72%,var(--muted))}.contextMeter.warning .contextMeterFill{background:#f59e0b}.contextMeter.danger .contextMeterFill{background:var(--danger)}.contextMeter.unknown .contextMeterTrack{background:color-mix(in srgb,var(--muted) 8%,transparent)}.contextMeterLabel{position:absolute;right:0;top:-13px;display:none;color:var(--muted);font-size:10px;font-weight:800;line-height:11px;letter-spacing:.02em;pointer-events:none}.contextMeter.warning .contextMeterLabel,.contextMeter.danger .contextMeterLabel{display:block}.contextMeter.warning .contextMeterLabel{color:#fbbf24}.contextMeter.danger .contextMeterLabel{color:var(--danger)}.contextMeterPopover{position:absolute;right:0;bottom:calc(100% + 8px);z-index:24;width:min(340px,calc(100vw - 32px));padding:12px;border:1px solid var(--border);border-radius:14px;background:var(--panel);box-shadow:0 18px 45px #00000059;color:var(--text);font-size:12px}.contextMeterPopover[hidden]{display:none}.contextMeterPopoverTitle{margin-bottom:8px;font-size:13px;font-weight:800}.contextMeterSummary{margin-bottom:10px;color:var(--accent);font-weight:800}.contextMeterRow{display:flex;justify-content:space-between;gap:16px;padding:3px 0;color:var(--muted)}.contextMeterRow strong{color:var(--text);font-weight:750}.contextMeterEmpty{margin:0;color:var(--muted);line-height:1.4}textarea{display:block;width:100%;min-height:54px;max-height:180px;resize:vertical;border:0;border-bottom:1px solid var(--border);border-radius:15px 15px 0 0;background:var(--panel-2);color:var(--text);padding:12px 14px;outline:none;font:inherit}textarea:focus{border-bottom-color:var(--accent)}.expandButton{display:none;position:absolute;top:8px;right:8px;width:28px;min-width:28px;min-height:28px;border-color:transparent;background:transparent;color:var(--muted);z-index:3}.expandButton:hover{border-color:transparent;color:var(--accent)}.expandButton svg{width:14px;height:14px}.composer:hover .expandButton,.composer.expanded .expandButton{display:inline-grid}.composer{position:relative}.slashCommandsPopover{position:absolute;left:0;right:0;bottom:calc(100% + 8px);z-index:30;display:grid;max-height:min(360px,50vh);overflow:auto;border:1px solid var(--border);border-radius:14px;background:var(--panel);box-shadow:0 18px 45px #00000059;padding:6px}.slashCommandsPopover[hidden]{display:none}.slashCommandItem{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 10px;width:100%;min-height:0;height:auto;border:1px solid transparent;border-radius:10px;background:transparent;padding:8px 10px;text-align:left;color:var(--text)}.slashCommandItem:hover,.slashCommandItem.active{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent)}.slashCommandName{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:750}.slashCommandDescription{grid-column:1 / -1;overflow:hidden;color:var(--muted);font-size:12px;text-overflow:ellipsis;white-space:nowrap}.slashCommandSource{align-self:center;border:1px solid var(--border);border-radius:999px;color:var(--muted);padding:1px 6px;font-size:10px;font-weight:800;text-transform:uppercase}.slashCommandsEmpty{padding:10px;color:var(--muted);font-size:12px}.composer.expanded .slashCommandsPopover{top:52px;bottom:auto}.composer.expanded{position:fixed;inset:16px;z-index:10;border-radius:20px;display:flex;flex-direction:column}.composer.expanded textarea{flex:1;max-height:none;resize:none;border-radius:19px 19px 0 0}.attachments{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:8px;border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--panel) 92%,transparent)}.attachments:empty{display:none}.attachmentChip{display:inline-flex;align-items:center;max-width:220px;gap:6px;border:1px solid var(--border);border-radius:999px;background:var(--panel-2);padding:3px 5px 3px 3px;color:var(--muted);font-size:12px}.attachmentChip img{width:24px;height:24px;border-radius:999px;object-fit:cover}.attachmentChip span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.removeAttachment{display:inline-grid;width:22px;min-width:22px;min-height:22px;place-items:center;border-radius:999px;padding:0}.removeAttachment svg{width:13px;height:13px}.composerFooter{display:flex;min-width:0;align-items:stretch;gap:0;height:40px;margin-top:0;padding:0;overflow:visible}button,select{height:40px;min-height:40px;border:1px solid var(--border);border-top:0;border-radius:0;background:var(--panel-2);color:var(--text);padding:4px 8px;font:inherit;font-size:12px}select{min-width:0;max-width:100%}.modelControl{position:relative;flex:1 1 0;min-width:0}.modelSettingsButton{display:flex;width:100%;min-width:0;align-items:center;gap:10px;justify-content:space-between;border-left:0;border-bottom:0;border-bottom-left-radius:15px;padding:4px 10px;text-align:left}.modelSettingsButton:hover{border-color:var(--accent)}.modelSettingsLabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modelSettingsThinking{display:inline-flex;flex:0 0 auto;align-items:center;gap:4px;color:var(--muted);font-size:11px;font-weight:700;white-space:nowrap}.modelSettingsThinking svg{width:14px;height:14px;stroke-width:2.25}.modelSettingsButton:not([data-thinking-level=off]) .modelSettingsThinking{color:var(--accent)}.modelSettingsPopover{position:absolute;left:0;bottom:calc(100% + 8px);z-index:20;display:grid;width:min(560px,calc(100vw - 32px));gap:10px;padding:12px;border:1px solid var(--border);border-radius:14px;background:var(--panel);box-shadow:0 18px 45px #00000059}.modelSettingsPopover[hidden]{display:none}.modelSettingsField{display:grid;gap:6px;color:var(--muted);font-size:12px;font-weight:700}.modelSettingsPopover select{width:100%;height:36px;min-height:36px;border:1px solid var(--border);border-radius:10px;background:var(--panel-2);color:var(--text)}.modelSettingsHint{margin:0;color:var(--muted);font-size:12px}.iconButton{display:inline-grid;width:40px;min-width:40px;place-items:center;padding:0;border-bottom:0}.iconButton svg{width:17px;height:17px;stroke-width:2.25}button{cursor:pointer;font-weight:650}button:hover{border-color:var(--accent)}.composer button:focus-visible,.composer select:focus-visible,.composer textarea:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--accent);position:relative;z-index:1}button:disabled{cursor:default;opacity:.45}button:disabled:hover{border-color:var(--border)}.composerFooter .iconButton:not(.primaryAction){border-color:transparent;background:transparent}.composerFooter .iconButton:not(.primaryAction):hover{border-color:transparent;color:var(--accent)}#queueToggle[aria-pressed=true]{color:var(--accent)}#primaryButton{border-bottom-right-radius:15px}.primaryAction{background:#0f4c75;border-color:#256b97}.dangerAction{background:#5f1824;border-color:#9f2a3d}.dangerAction:hover{border-color:var(--danger)}.composerFooter .iconButton.dangerAction{background:#5f1824;border-color:#9f2a3d}.composerFooter .iconButton.dangerAction:hover{border-color:var(--danger);background:#7a1f2e}:root{--session-drawer-width: 360px}.sessionBackdrop{position:fixed;inset:0;z-index:20;background:#0000006b}.sessionDrawer{position:fixed;inset:0 auto 0 0;z-index:21;display:flex;width:min(var(--session-drawer-width),calc(100vw - 32px));max-width:100vw;flex-direction:column;gap:0;border-right:1px solid var(--border);background:color-mix(in srgb,var(--panel) 96%,black);box-shadow:18px 0 60px #00000059;padding:0}.sessionDrawer[hidden],.sessionBackdrop[hidden]{display:none}.sessionDrawerHeader{display:flex;align-items:center;justify-content:space-between;gap:8px;height:40px;flex-shrink:0;padding:0 8px 0 16px;border-bottom:1px solid var(--border)}.sessionDrawerHeader h2{margin:0;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sessionDrawerHeader .iconButton{width:24px;min-width:24px;height:24px;min-height:24px;border:0;border-radius:6px;background:transparent;color:var(--muted)}.sessionDrawerHeader .iconButton svg{width:15px;height:15px}.sessionDrawerHeader .iconButton:hover{border:0;background:var(--panel-2);color:var(--text)}.sessionNewButton{display:flex;align-items:center;justify-content:center;gap:6px;margin:10px 12px;border-radius:6px;font-size:13px}.sessionList{display:flex;min-height:0;flex:1;flex-direction:column;gap:0;overflow:auto;padding:6px 0}.sessionFolderGroup{display:flex;flex-direction:column;gap:0}.sessionFolderGroup+.sessionFolderGroup{margin-top:4px;padding-top:4px;border-top:1px solid color-mix(in srgb,var(--border) 60%,transparent)}.sessionFolderHeader{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:2px 6px 2px 0}.sessionFolderToggle{display:flex;min-width:0;flex:1 1 auto;align-items:center;gap:5px;height:auto;min-height:28px;border:none;border-radius:0;background:transparent;padding:3px 8px;text-align:left}.sessionFolderToggle:hover{border:none;background:color-mix(in srgb,var(--text) 6%,transparent)}.sessionFolderChevron{flex:0 0 auto;width:12px;color:var(--muted);font-size:10px}.sessionFolderLabels{display:flex;min-width:0;flex-direction:column}.sessionFolderName{overflow:hidden;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);text-overflow:ellipsis;white-space:nowrap}.sessionFolderPath{overflow:hidden;color:color-mix(in srgb,var(--muted) 60%,transparent);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;text-overflow:ellipsis;white-space:nowrap}.sessionFolderNewButton{flex:0 0 auto;width:28px;min-width:28px;height:28px;min-height:28px;border:none;border-radius:6px;background:transparent;color:var(--muted);margin-right:4px}.sessionFolderNewButton:hover{border:none;background:var(--panel-2);color:var(--accent)}.sessionFolderNewButton svg{width:13px;height:13px}.sessionFolderMoreButton{height:28px;min-height:28px;border:none;border-radius:0;background:transparent;color:color-mix(in srgb,var(--muted) 70%,transparent);font-size:11px;padding:0 16px 0 28px;text-align:left;width:100%}.sessionFolderMoreButton:hover{border:none;background:color-mix(in srgb,var(--text) 6%,transparent);color:var(--accent)}.sessionItemTitleRow{display:flex;flex:1 1 auto;min-width:0;align-items:center;gap:6px}.sessionItemTitle{min-width:0;overflow:hidden;color:var(--text);font-size:13px;font-weight:500;text-overflow:ellipsis;white-space:nowrap}.sessionItemMeta{flex-shrink:0;font-size:11px;color:color-mix(in srgb,var(--muted) 70%,transparent)}.sessionSpinner{flex:0 0 auto;width:14px;height:14px;border:2px solid color-mix(in srgb,var(--accent) 28%,transparent);border-top-color:var(--accent);border-radius:999px;animation:sessionSpin .8s linear infinite}@keyframes sessionSpin{to{transform:rotate(360deg)}}.sessionEmpty{padding:12px 20px;font-size:13px;color:var(--muted)}.sessionItem{display:flex;flex-shrink:0;width:100%;align-items:stretch;border:0;border-radius:0;background:transparent;min-height:32px;line-height:1}.sessionItem:has(.sessionItemNavBtn:hover),.sessionItem:has(.sessionItemNavBtn:focus-visible){background:color-mix(in srgb,var(--text) 6%,transparent)}.sessionItem.current{background:color-mix(in srgb,var(--accent) 8%,transparent);box-shadow:inset 2px 0 0 var(--accent)}.sessionItemPinBtn{flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:32px;min-width:32px;height:32px;min-height:32px;border:0;border-radius:0;background:transparent;color:var(--muted);padding:0;cursor:pointer;opacity:.3;transition:opacity .15s ease,color .15s ease}.sessionItemPinBtn svg{width:13px;height:13px;stroke-width:2}.sessionItemPinBtn:hover{border:0;background:transparent;opacity:.8;color:var(--accent)}.sessionItemPinBtn.pinned{opacity:1;color:var(--accent)}.sessionItemPinBtn.pinned svg{fill:currentColor;stroke:currentColor}.sessionItemPinBtn:disabled{opacity:.15;cursor:default}.sessionItemPinBtn:disabled:hover{border:0;color:var(--muted)}.sessionItemNavBtn{flex:1 1 auto;min-width:0;display:flex;flex-direction:row;align-items:center;gap:8px;height:32px;min-height:32px;border:0;border-radius:0;background:transparent;padding:0 12px 0 4px;text-align:left;cursor:pointer}.sessionItemNavBtn:hover{border:0;background:transparent}.sessionItem.current .sessionItemNavBtn,.sessionItem.current .sessionItemTitle{color:var(--accent)}.sessionItem:not(.pinned):not(.current) .sessionItemNavBtn{opacity:.45}.sessionItem:not(.pinned):not(.current):hover .sessionItemNavBtn{opacity:1}.sessionBar{grid-row:4;display:flex;align-items:stretch;margin-top:8px;border-top:1px solid var(--border);background:color-mix(in srgb,var(--panel) 97%,black);overflow:hidden;padding-bottom:0}.sessionBar[hidden]{display:none}.sessionBarTab{flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;height:28px;border:0;border-top:2px solid transparent;border-radius:0;background:transparent;color:var(--muted);padding:0 6px;cursor:pointer;transition:color .12s ease,background-color .12s ease,border-color .12s ease}.sessionBarTab:hover{border-color:transparent;background:color-mix(in srgb,var(--text) 6%,transparent);color:var(--muted)}.sessionBarTab.active{border-top-color:var(--accent);color:var(--accent);background:color-mix(in srgb,var(--accent) 6%,transparent)}.sessionBarTab+.sessionBarTab{border-left:1px solid var(--border)}.sessionBarTabLabel{max-width:100%;overflow:hidden;font-size:12px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}@keyframes sessionBarRunPulse{0%,to{border-top-color:color-mix(in srgb,var(--accent) 25%,transparent)}50%{border-top-color:var(--accent)}}.sessionBarTab.running{animation:sessionBarRunPulse 1s ease-in-out infinite}body.hasPinnedSessions .app{padding-bottom:0}@media(max-width:700px){body.hasPinnedSessions .app{padding-bottom:0}body.hasPinnedSessions .composer{margin-bottom:0}}.settingsBackdrop{position:fixed;inset:0;z-index:30;background:#0000006b}.settingsPanel{position:fixed;inset:0 0 0 auto;z-index:31;display:flex;width:min(380px,calc(100vw - 32px));max-width:100vw;flex-direction:column;gap:16px;border-left:1px solid var(--border);background:color-mix(in srgb,var(--panel) 96%,black);box-shadow:-18px 0 60px #00000059;padding:16px}.settingsPanel[hidden],.settingsBackdrop[hidden]{display:none}.settingsHeader{display:flex;align-items:center;justify-content:space-between;gap:12px}.settingsHeader h2{margin:0;font-size:18px}.settingsHeader .iconButton{width:32px;min-width:32px;height:32px;min-height:32px;border:0;border-radius:8px;background:transparent;color:var(--muted)}.settingsHeader .iconButton:hover{border:0;background:var(--panel-2);color:var(--text)}.settingsSection{display:flex;flex-direction:column;gap:10px;border:1px solid var(--border);border-radius:14px;background:color-mix(in srgb,var(--panel-2) 42%,transparent);padding:12px}.settingsSection h3{margin:0;font-size:13px;letter-spacing:.01em}.settingsField{display:grid;grid-template-columns:minmax(0,1fr) minmax(150px,auto);align-items:center;gap:12px;color:var(--muted);font-size:13px}.settingsField select{width:100%;min-height:34px;border:1px solid var(--border);border-radius:9px;background:var(--panel);color:var(--text);padding:6px 8px}.settingsCheckbox{display:flex;align-items:center;gap:9px;color:var(--muted);font-size:13px}.settingsCheckbox input{accent-color:var(--accent)}.settingsHint{margin:0;color:var(--muted);font-size:12px}.settingsValue{overflow-wrap:anywhere;border:1px solid var(--border);border-radius:10px;background:var(--panel);color:var(--text);padding:8px 10px;font-size:12px}.settingsActions{display:flex;flex-wrap:wrap;gap:8px}.settingsActions button{min-height:32px;font-size:12px}.settingsStatus{min-height:18px;color:var(--muted);font-size:12px}.settingsStatus.error{color:var(--danger)}:root[data-density=compact] .message{padding:8px 10px}:root[data-density=compact] .message.user{margin:6px 12px 6px 0}:root[data-density=compact] .message.system{margin:4px 0}:root[data-density=compact] .markdownBody p,:root[data-density=compact] .markdownBody ul,:root[data-density=compact] .markdownBody ol,:root[data-density=compact] .markdownBody blockquote,:root[data-density=compact] .markdownBody pre,:root[data-density=compact] .markdownBody table{margin-bottom:.55em}.conversationTreeBackdrop{position:fixed;inset:0;z-index:30;background:#0000006b}.conversationTreePanel{--tree-panel-bg: color-mix(in srgb, var(--panel) 96%, black);--tree-line: color-mix(in srgb, var(--muted) 44%, transparent);--tree-line-active: color-mix(in srgb, var(--accent) 72%, transparent);position:fixed;inset:0 0 0 auto;z-index:31;display:flex;width:min(440px,calc(100vw - 28px));max-width:100vw;flex-direction:column;gap:12px;border-left:1px solid var(--border);background:var(--tree-panel-bg);box-shadow:-18px 0 60px #00000059;padding:16px}.conversationTreePanel[hidden],.conversationTreeBackdrop[hidden]{display:none}.conversationTreeHeader{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.conversationTreeTitle{display:grid;min-width:0;gap:2px}.conversationTreeTitle h2{margin:0;font-size:18px;line-height:1.2}.conversationTreeSummary,.conversationTreeStatus,.conversationTreeTime,.conversationTreeSelectionText span{color:var(--muted);font-size:12px}.conversationTreeCloseButton{width:32px;min-width:32px;height:32px;min-height:32px;border:0;border-radius:8px;background:transparent;color:var(--muted)}.conversationTreeCloseButton:hover{border:0;background:var(--panel-2);color:var(--text)}.conversationTreeControls{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}.conversationTreeSearch,.conversationTreeFilter{width:100%;height:36px;min-height:36px;border:1px solid var(--border);border-radius:10px;background:var(--panel-2);color:var(--text);padding:0 10px;font:inherit;font-size:13px}.conversationTreeFilter{width:132px}.conversationTreeSearch:focus,.conversationTreeFilter:focus,.conversationTreeCustomForm textarea:focus{outline:none;border-color:var(--accent)}.conversationTreeStatus{min-height:18px}.conversationTreeStatus.error{color:var(--danger)}.conversationTreeList{display:flex;min-height:0;flex:1;flex-direction:column;gap:2px;overflow:auto;padding-right:2px}.conversationTreeEmpty{margin:16px 4px;color:var(--muted);font-size:13px}.conversationTreeNode{position:relative;display:grid;grid-template-columns:18px minmax(0,1fr);align-items:center;gap:6px;width:100%;height:auto;min-height:28px;border:1px solid transparent;border-radius:7px;background:transparent;color:var(--text);padding:2px 6px;text-align:left}.conversationTreeNode:hover,.conversationTreeNode.selected{border-color:color-mix(in srgb,var(--accent) 32%,transparent);background:color-mix(in srgb,var(--panel-2) 58%,transparent)}.conversationTreeNode.activePath .conversationTreeRail:before{background:color-mix(in srgb,var(--accent) 55%,transparent)}.conversationTreeNode.currentLeaf{background:color-mix(in srgb,var(--accent) 9%,transparent)}.conversationTreeItem{position:relative;min-width:0}.conversationTreeChildren{position:relative;display:flex;flex-direction:column;gap:2px;margin-left:8px;padding-left:14px}.conversationTreeChildren:before{content:"";position:absolute;left:5px;top:0;bottom:0;width:1.5px;border-radius:999px;background:var(--tree-line)}.conversationTreeChildren>.conversationTreeItem:before{content:"";position:absolute;left:-9px;top:14px;width:10px;height:1.5px;border-radius:999px;background:var(--tree-line)}.conversationTreeChildren>.conversationTreeItem.activePath:before{background:var(--tree-line-active)}.conversationTreeChildren>.conversationTreeItem:last-child:after{content:"";position:absolute;left:-10px;top:16px;bottom:0;width:4px;background:var(--tree-panel-bg)}.conversationTreeItem.branchItem.inactivePath>.conversationTreeNode:not(.selected){opacity:.72}.conversationTreeRail{display:flex;justify-content:center}.conversationTreeGlyph{display:inline-block;width:7px;height:7px;min-width:7px;align-self:center;border-radius:999px;background:var(--muted);box-shadow:0 0 0 3px var(--tree-panel-bg)}.conversationTreeGlyph.user{background:#60a5fa}.conversationTreeGlyph.assistant{background:var(--accent)}.conversationTreeGlyph.toolCall,.conversationTreeGlyph.toolResult{background:#8b5cf6}.conversationTreeGlyph.branchSummary,.conversationTreeGlyph.compaction{background:#facc15}.conversationTreeGlyph.error{background:var(--danger)}.conversationTreeNodeMain{display:grid;grid-template-columns:auto minmax(0,1fr) auto;min-width:0;align-items:center;gap:6px}.conversationTreeNodeTop{display:contents}.conversationTreeBadges{display:flex;min-width:0;align-items:center;gap:5px}.conversationTreeRole{color:var(--text);font-size:11px;font-weight:800}.conversationTreeRole.user{color:#93c5fd}.conversationTreeRole.assistant{color:#bef264}.conversationTreeRole.toolCall,.conversationTreeRole.toolResult{color:color-mix(in srgb,var(--muted) 78%,transparent)}.conversationTreeRole.branchSummary,.conversationTreeRole.compaction{color:#fde68a}.conversationTreeRole.error{color:var(--danger)}.conversationTreeTime{display:none}.conversationTreePreview{display:block;min-width:0;overflow:hidden;color:color-mix(in srgb,var(--text) 90%,var(--muted));font-size:12px;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.conversationTreeNode.toolEntry .conversationTreePreview{color:color-mix(in srgb,var(--muted) 76%,transparent)}.conversationTreeBadge{display:inline-flex;max-width:100%;align-items:center;border:1px solid color-mix(in srgb,var(--muted) 28%,transparent);border-radius:999px;color:var(--muted);font-size:10px;font-weight:750;line-height:1.25;padding:0 5px}.conversationTreeBadge.label{color:#fde68a;border-color:color-mix(in srgb,#facc15 38%,transparent)}.conversationTreeBadge.branch{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 34%,transparent)}.conversationTreeBadge.current{color:#86efac;border-color:color-mix(in srgb,#22c55e 36%,transparent)}.conversationTreeSelection{display:grid;gap:10px;border:1px solid var(--border);border-radius:14px;background:color-mix(in srgb,var(--panel-2) 50%,transparent);padding:10px}.conversationTreeSelection[hidden]{display:none}.conversationTreeSelectionText{display:grid;min-width:0;gap:2px}.conversationTreeSelectionText strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.conversationTreeSelectionActions,.conversationTreeCustomActions{display:flex;flex-wrap:wrap;gap:8px}.conversationTreeSelectionActions button,.conversationTreeCustomActions button{height:34px;min-height:34px;border:1px solid var(--border);border-radius:10px;padding:0 10px}.conversationTreeCustomForm{display:grid;gap:8px}.conversationTreeCustomForm[hidden]{display:none}.conversationTreeCustomForm label{display:grid;gap:5px;color:var(--muted);font-size:12px;font-weight:750}.conversationTreeCustomForm textarea{width:100%;min-height:74px;resize:vertical;border:1px solid var(--border);border-radius:10px;background:var(--panel);color:var(--text);padding:8px 10px;font:inherit;font-size:13px}.conversationTreePanel.loading .conversationTreeNode,.conversationTreePanel.loading .conversationTreeSelectionActions button{pointer-events:none}@media(max-width:700px){.conversationTreePanel{inset:auto 0 0;width:100vw;max-height:min(88vh,calc(var(--app-height) - 16px));border:0;border-top:1px solid var(--border);border-radius:22px 22px 0 0;box-shadow:0 -18px 60px #0000006b;padding:14px max(12px,env(safe-area-inset-right)) max(14px,env(safe-area-inset-bottom)) max(12px,env(safe-area-inset-left))}.conversationTreeControls{grid-template-columns:1fr}.conversationTreeFilter{width:100%}.conversationTreeNode{min-height:32px;padding-left:6px}.conversationTreeSelectionActions button,.conversationTreeCustomActions button{flex:1 1 auto;height:40px;min-height:40px}}.emptyCwdChooser{grid-row:2;grid-column:1;display:flex;align-items:center;justify-content:center;z-index:1}.emptyCwdChooser[hidden]{display:none}.emptyCwdInner{max-width:min(680px,calc(100% - 32px));text-align:center;color:var(--text);padding:28px;border-radius:18px}.emptyCwdLabel{color:var(--muted);font-size:13px;margin-bottom:10px}.emptyCwdPath{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow-wrap:anywhere;margin-bottom:18px}.emptyCwdButton,.folderPickerActions button{min-height:34px;border-radius:10px;padding:0 14px}.folderPickerBackdrop{position:fixed;inset:0;z-index:40;display:flex;align-items:center;justify-content:center;background:#0000008c;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.folderPicker{width:min(720px,calc(100vw - 28px));height:min(560px,calc(100vh - 28px));display:flex;flex-direction:column;gap:12px;border:1px solid var(--border);border-radius:16px;background:var(--panel);box-shadow:0 22px 70px #00000073;padding:18px}.folderPicker h2{margin:0;font-size:16px}.folderPickerInput{width:100%;box-sizing:border-box;border:1px solid var(--border);border-radius:10px;background:var(--panel-2);color:var(--text);padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.folderPickerList{flex:1 1 0;min-height:0;overflow-y:auto;border:1px solid var(--border);border-radius:12px;padding:6px}.folderPickerRow{display:block;width:100%;min-height:34px;border:none;border-radius:8px;background:transparent;color:var(--text);text-align:left;padding:0 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.folderPickerRow:hover{border:none;background:var(--panel-2)}.folderPickerError{min-height:18px;color:var(--danger);font-size:13px}.folderPickerActions{display:flex;justify-content:flex-end;gap:10px}.toolCard{position:relative;align-self:stretch;flex-shrink:0;width:100%;max-width:100%;border:none;border-top:1px solid var(--border);border-radius:0;background:var(--tool);overflow:hidden;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}.toolCard--running{background:color-mix(in srgb,var(--panel-2) 80%,#1a3050)}.toolCard--success{background:color-mix(in srgb,var(--tool) 70%,#0f2a1a)}.toolCard--error{background:color-mix(in srgb,var(--tool) 60%,#2d0a0f)}.toolCardHeader{display:flex;align-items:center;gap:8px;padding:8px 12px}.toolCardExpandToggle,.toolCardCollapseToggle{align-items:center;justify-content:center;width:24px;height:24px;min-height:0;border:none;background:transparent;color:var(--accent);padding:0;font-size:16px;line-height:1;cursor:pointer;z-index:1}.toolCardExpandToggle{display:none;flex:0 0 auto}.toolCardCollapseToggle{position:absolute;right:8px;bottom:8px;display:inline-flex}.toolCardExpandToggle:hover,.toolCardCollapseToggle:hover{color:var(--text);border:none}.toolCardIcon{flex:0 0 auto;font-size:13px;line-height:1}.toolCard--running .toolCardIcon:before{content:"";display:inline-block;width:12px;height:12px;border-radius:50%;border:1.5px solid color-mix(in srgb,var(--muted) 30%,transparent);border-top-color:var(--muted);animation:toolSpin .65s linear infinite;vertical-align:-1px;box-sizing:border-box}.toolCard--success .toolCardIcon:before{content:"✓";color:#4ade80}.toolCard--error .toolCardIcon:before{content:"✗";color:var(--danger)}@keyframes toolSpin{to{transform:rotate(360deg)}}.toolCardLabel{flex:1 1 0;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.toolCardLabel.expanded{white-space:normal;overflow:visible;text-overflow:unset;word-break:break-all}.toolCardName{color:var(--text);font-weight:700;font-size:13px;letter-spacing:-.01em}.toolCardSubtitle{color:var(--muted);font-size:12px;margin-left:.4ch}.toolCardDetails{display:none;border-top:1px solid var(--border)}.toolCardSummary{display:block;padding:5px 12px;color:var(--muted);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none}.toolCardSummary::-webkit-details-marker{display:none}.toolCardSummary:before{content:"▶ ";font-size:9px;opacity:.6}details[open]>.toolCardSummary:before{content:"▼ "}.toolCardArgs{margin:0;padding:8px 12px 10px;white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px;color:var(--muted);max-height:280px;overflow:auto;border-top:1px solid var(--border)}.toolCardBody code.hljs{display:block;background:transparent;padding:0;color:inherit;font-size:inherit;white-space:pre-wrap;overflow-wrap:anywhere}.toolCardBody{margin:0;padding:0 12px 10px;white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px;color:var(--muted)}.toolCardBody.collapsed{position:relative;max-height:8rem;overflow:hidden;cursor:pointer;padding-right:36px}.toolCardBody.collapsed:after{content:"";position:absolute;inset:auto 0 0;height:3rem;background:linear-gradient(transparent,var(--tool-bg, var(--tool)) 82%)}.toolCard--running .toolCardBody.collapsed:after{--tool-bg: color-mix(in srgb, var(--panel-2) 80%, #1a3050)}.toolCard--success .toolCardBody.collapsed:after{--tool-bg: color-mix(in srgb, var(--tool) 70%, #0f2a1a)}.toolCard--error .toolCardBody.collapsed:after{--tool-bg: color-mix(in srgb, var(--tool) 60%, #2d0a0f)}:root[data-density=compact] .toolCard{font-size:12px}:root[data-density=compact] .toolCardHeader{min-height:29px;height:29px;padding:4px 10px;cursor:pointer;box-sizing:border-box}:root[data-density=compact] .toolCardExpandToggle{display:inline-flex;width:20px;height:20px;font-size:14px}:root[data-density=compact] .toolCardName{font-size:12px}:root[data-density=compact] .toolCardSubtitle{font-size:11px}:root[data-density=compact] .toolCardDetails{display:block}:root[data-density=compact] .toolCard.toolCard--compactCollapsed{height:30px;box-sizing:border-box}:root[data-density=compact] .toolCard.toolCard--compactCollapsed>:not(.toolCardHeader){display:none}.sessionItemMeta,.sessionEmpty{color:var(--muted);font-size:12px}@media(min-width:701px){.sessionBackdrop{display:none}body.sessionDrawerOpen .app{width:calc(100vw - var(--session-drawer-width));max-width:none;margin-left:var(--session-drawer-width);margin-right:0}body.sessionDrawerOpen .jumpToLatestButton{left:calc(50% + var(--session-drawer-width) / 2)}}@media(min-width:701px)and (max-width:1100px){.app{padding-top:10px}}@media(max-width:700px){.app{height:var(--app-height);min-height:0;padding:10px 0;padding-bottom:max(10px,env(safe-area-inset-bottom))}.composer{margin:0 10px;margin-bottom:max(0px,env(safe-area-inset-bottom))}.message.user{margin:12px 10px 12px 0}.contextMeterLabel{top:-13px;right:0}.contextMeterPopover{left:10px;right:10px;width:auto}.composerFooter{gap:4px}.modelControl{flex:1 1 0;width:0;min-width:0}.modelSettingsButton{padding-right:10px}.modelSettingsThinking{display:none}.modelSettingsPopover{width:min(420px,calc(100vw - 32px))}.composerFooter .iconButton{width:40px;min-width:40px;min-height:40px}.composerFooter .iconButton svg{width:17px;height:17px}.message{max-width:96%}.sessionDrawer{width:100vw;border-right:0}}.tokenOverlay{position:fixed;inset:0;background:var(--bg);display:flex;align-items:center;justify-content:center;z-index:1000}.tokenOverlay[hidden]{display:none}.tokenForm{display:flex;flex-direction:column;gap:12px;width:320px;padding:24px;background:var(--surface);border:1px solid var(--border);border-radius:8px}.tokenForm label{font-size:.9rem;color:var(--fg-muted)}.tokenForm input{background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--fg);padding:8px 10px;font-size:1rem;outline:none}.tokenForm input:focus{border-color:var(--accent)}.tokenForm button{padding:8px;border-radius:4px;border:1px solid #256b97;font-size:.95rem;cursor:pointer;color:var(--fg)}.diffToolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:5px 12px;border-top:1px solid var(--border);color:var(--muted);font-size:11px}.diffLayoutToggle{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--muted);padding:0;cursor:pointer}.diffLayoutToggle svg{width:14px;height:14px}.diffLayoutToggle:hover{color:var(--text);background:var(--panel-2);border-color:transparent}.diffContainer{margin:0;padding:0 0 6px;overflow-x:auto}.diffContainer.collapsed{position:relative;max-height:12rem;overflow:hidden;cursor:pointer;padding-right:36px}.diffContainer.collapsed:after{content:"";position:absolute;inset:auto 0 0;height:3rem;background:linear-gradient(transparent,var(--tool-bg, var(--tool)) 82%)}.toolCard--success .diffContainer.collapsed:after{--tool-bg: color-mix(in srgb, var(--tool) 70%, #0f2a1a)}.toolCard--error .diffContainer.collapsed:after{--tool-bg: color-mix(in srgb, var(--tool) 60%, #2d0a0f)}.diffSep{height:1px;background:var(--border);margin:4px 0}.diffTable{width:100%;min-width:620px;border-collapse:collapse;table-layout:fixed;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.5}.diffLine--del .diffCode--old,.diffLine--changed .diffCode--old{background:#ff505021}.diffLine--add .diffCode--new,.diffLine--changed .diffCode--new{background:#3cd2641f}.diffLine--same{opacity:.75}.diffGutter{width:18px;min-width:18px;text-align:center;padding:0 4px;-webkit-user-select:none;user-select:none;font-weight:700;opacity:.75;border-left:1px solid color-mix(in srgb,var(--border) 65%,transparent)}.diffLine--del .diffGutter,.diffLine--changed .diffGutter:first-child{color:#f87171}.diffLine--add .diffGutter,.diffLine--changed .diffGutter:nth-child(3){color:#4ade80}.diffCode{padding:0 8px 0 6px;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text);vertical-align:top}.diffWord--del{background:#f8717159;border-radius:2px}.diffWord--add{background:#4ade804d;border-radius:2px}@media(max-width:700px){.diffTable{min-width:0}}.diffContainer--stacked .diffTable{min-width:0}.diffContainer--stacked .diffLine{display:grid;grid-template-columns:24px 1fr}.diffContainer--stacked .diffGutter:nth-child(3){grid-column:1}.diffContainer--stacked .diffCode--new{grid-column:2}.diffContainer--stacked .diffLine--same .diffGutter:nth-child(3),.diffContainer--stacked .diffLine--same .diffCode--new{display:none}.gitPanel{position:fixed;inset:36px max(16px,calc((100vw - 1100px)/2 + 16px)) 16px auto;z-index:20;display:grid;grid-template-rows:auto minmax(0,1fr);width:min(920px,calc(100vw - 32px));background:color-mix(in srgb,var(--panel) 97%,black);border:1px solid var(--border);border-radius:16px;box-shadow:0 24px 80px #00000073;overflow:hidden}.gitPanel[hidden]{display:none}.gitPanelHeader{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1px solid var(--border)}.gitPanelHeader h2{margin:0;font-size:14px}.gitPanelHeader .iconButton{width:32px;min-width:32px;height:32px;min-height:32px;margin-left:auto;border:0;border-radius:8px;background:transparent;color:var(--muted)}.gitPanelHeader .iconButton:hover{border:0;background:var(--panel-2);color:var(--text)}.gitTabs{display:flex;gap:2px}.gitTab,.gitBackButton,.gitRebaseButton{height:30px;min-height:30px;border:0;border-radius:8px;background:transparent;color:var(--muted);padding:3px 9px;cursor:pointer}.gitTab.active,.gitTab:hover,.gitBackButton:hover,.gitRebaseButton:hover{color:var(--text);background:var(--panel-2)}.statusBarButton.active{color:var(--accent);border-color:transparent}.gitPanelBody{min-height:0;display:grid;grid-template-columns:minmax(260px,340px) minmax(0,1fr)}.gitPrimaryPane,.gitDetailPane{min-width:0;min-height:0;overflow:auto;padding:12px}.gitPrimaryPane{border-right:1px solid var(--border)}.gitRepoAccordion{border:1px solid var(--border);border-radius:10px;margin-bottom:10px;overflow:hidden;background:color-mix(in srgb,var(--panel-2) 55%,transparent)}.gitRepoAccordion summary{cursor:pointer;padding:8px 10px;color:var(--text);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gitRepoList{display:grid;gap:4px;padding:6px;border-top:1px solid var(--border)}.gitRepoItem{width:100%;display:grid;gap:2px;border:1px solid transparent;border-radius:8px;background:transparent;color:var(--text);padding:7px 8px;text-align:left;cursor:pointer;font:inherit}.gitRepoItem:hover,.gitRepoItem.selected{background:var(--panel-2);border-color:var(--border)}.gitRepoItem:disabled{cursor:default;opacity:.65}.gitRepoName{min-width:0;overflow-wrap:anywhere;font-size:13px}.gitRepoMeta,.gitRepoEmpty{color:var(--muted);font-size:11px}.gitChangesOverview h3,.gitStatusGroup h3{margin:10px 0 8px;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.08em}.gitRepoChangesList{display:grid;gap:8px}.gitRepoChangesAccordion{background:transparent}.gitRepoChangesAccordion>summary{list-style:none;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:7px;cursor:pointer;padding:5px 0;color:var(--text)}.gitRepoChangesAccordion>summary::-webkit-details-marker{display:none}.gitRepoDisclosure{color:var(--muted);font-size:18px;line-height:1;transition:transform .12s ease}.gitRepoChangesAccordion[open]>summary .gitRepoDisclosure{transform:rotate(90deg)}.gitRepoHeaderText{min-width:0;display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 10px}.gitRepoMeta{display:flex;flex-wrap:wrap;gap:0;min-width:0}.gitRepoMetaItem{color:var(--muted);white-space:nowrap}.gitRepoMetaItem:not(:last-child):after{content:"·";margin:0 6px;color:color-mix(in srgb,var(--muted) 55%,transparent)}.gitRebaseButton{width:28px;min-width:28px;height:28px;min-height:28px;display:inline-grid;place-items:center;padding:0}.gitRebaseButton svg{width:15px;height:15px}.gitRebaseButton:disabled{cursor:wait;opacity:.65}.gitRepoChangesBody{margin-left:8px;padding:1px 0 4px 10px}.gitTreeDir{position:relative;margin:0}.gitTreeDir>summary{list-style:none;display:flex;align-items:center;gap:4px;cursor:pointer;color:var(--text);padding:1px 0;font-size:13px;line-height:1.25;overflow-wrap:anywhere}.gitTreeDir>summary::-webkit-details-marker{display:none}.gitTreeDir>summary:before{content:"›";color:var(--muted);font-size:14px;line-height:1;transition:transform .12s ease}.gitTreeDir[open]>summary:before{transform:rotate(90deg)}.gitTreeChildren{margin-left:8px;padding-left:10px}.gitRepoChangesBody>.gitTreeDir,.gitRepoChangesBody>.gitTreeFile,.gitTreeChildren>.gitTreeDir,.gitTreeChildren>.gitTreeFile{position:relative}.gitRepoChangesBody>.gitTreeDir:before,.gitRepoChangesBody>.gitTreeFile:before,.gitTreeChildren>.gitTreeDir:before,.gitTreeChildren>.gitTreeFile:before{content:"";position:absolute;left:-10px;top:.78em;width:8px;border-top:1px solid var(--border)}.gitRepoChangesBody>.gitTreeDir:after,.gitRepoChangesBody>.gitTreeFile:after,.gitTreeChildren>.gitTreeDir:after,.gitTreeChildren>.gitTreeFile:after{content:"";position:absolute;left:-10px;top:-.15em;bottom:-.15em;border-left:1px solid var(--border)}.gitRepoChangesBody>.gitTreeDir:last-child:after,.gitRepoChangesBody>.gitTreeFile:last-child:after,.gitTreeChildren>.gitTreeDir:last-child:after,.gitTreeChildren>.gitTreeFile:last-child:after{bottom:auto;height:.93em}.gitFileItem,.gitCommitItem{width:100%;display:flex;gap:8px;border:1px solid transparent;border-radius:10px;background:transparent;color:var(--text);padding:8px;text-align:left;cursor:pointer;font:inherit;line-height:1.35}.gitFileItem.gitTreeFile{width:fit-content;max-width:100%;height:auto;min-height:0;position:relative;align-items:baseline;gap:4px;border:0;border-radius:4px;padding:1px 7px 1px 5px;line-height:1.25}.gitFileItem.gitTreeFile:hover,.gitFileItem.gitTreeFile.selected{background:color-mix(in srgb,var(--panel-2) 45%,transparent)}.gitFileItem:hover,.gitFileItem.selected,.gitCommitItem:hover,.gitCommitItem.selected{background:var(--panel-2);border-color:var(--border)}.gitStatusBadge{flex:0 0 auto;min-width:14px;text-align:center;color:var(--accent);font:11px ui-monospace,SFMono-Regular,Menlo,monospace}.gitStatusBadge.deleted,.gitDiffLine.del{color:var(--danger)}.gitStatusBadge.untracked,.gitStatusBadge.added,.gitDiffLine.add{color:#86efac}.gitStatusBadge.conflicted{color:#fbbf24}.gitFilePath{overflow-wrap:anywhere;font-size:13px}.gitDetailHeader{display:flex;align-items:center;gap:8px;margin-bottom:10px}.gitDetailHeader h3{margin:0;font-size:13px;overflow-wrap:anywhere}.gitEmpty{color:var(--muted);padding:16px}.gitImageDiff{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.gitImagePane{min-width:0;border:1px solid var(--border);border-radius:12px;overflow:hidden;background:color-mix(in srgb,var(--panel-2) 40%,transparent)}.gitImagePane h4{margin:0;padding:8px 10px 2px;font-size:12px;color:var(--text)}.gitImageName{padding:0 10px 8px;color:var(--muted);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gitImagePreview{min-height:180px;display:grid;place-items:center;padding:10px;color:var(--muted);background:#071018}.gitImagePreview img{display:block;max-width:100%;max-height:55vh;object-fit:contain}.gitPatchFile{border:1px solid var(--border);border-radius:10px;overflow:hidden;margin-bottom:10px;background:#071018}.gitPatchFile summary{cursor:pointer;padding:8px 10px;background:var(--panel-2);color:var(--text);font:12px ui-monospace,SFMono-Regular,Menlo,monospace;overflow-wrap:anywhere}.gitPatchFile .diffTable{min-width:0}.gitPatchMeta .diffCode{color:var(--muted);background:#7dd3fc0f}.gitCommitList{display:grid;gap:6px}.gitCommitItem{position:relative;display:grid;grid-template-columns:24px minmax(0,1fr);align-items:start;height:auto;min-height:58px;margin:0;appearance:none;-webkit-appearance:none;white-space:normal;overflow:visible}.gitCommitRail{width:18px;align-self:stretch;position:relative;flex:0 0 18px}.gitCommitRail:before{content:"";position:absolute;top:-9px;bottom:-9px;left:8px;width:2px;background:var(--border)}.gitCommitDot{position:absolute;top:8px;left:3px;width:12px;height:12px;border-radius:50%;background:var(--accent);border:2px solid var(--panel)}.gitCommitBody{display:grid;min-width:0;grid-auto-rows:min-content;gap:4px}.gitCommitSubject,.gitCommitMeta,.gitCommitRefs{display:block;position:static;min-width:0}.gitCommitSubject{font-size:13px;overflow-wrap:anywhere;line-height:1.35}.gitCommitMeta,.gitCommitRefs{color:var(--muted);font-size:11px;line-height:1.3}.gitCommitRefs{color:#fde68a}.gitCommitDetails{border:1px solid var(--border);border-radius:12px;padding:12px;background:var(--panel-2)}.gitCommitDetails h4{margin:0 0 8px}.gitCommitDetails code{display:block;overflow:auto;color:var(--accent);overflow-wrap:anywhere;white-space:normal}.gitSectionTitle{margin:14px 0 8px;font-size:13px;color:var(--muted)}.gitCommitFiles{border:1px solid var(--border);border-radius:10px;overflow:hidden;margin-bottom:12px}.gitCommitFile{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:8px;padding:7px 9px;border-bottom:1px solid var(--border);font-size:12px}.gitCommitFile:last-child{border-bottom:0}.gitCommitFileStatus{color:var(--accent);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.gitCommitFilePath{min-width:0;overflow-wrap:anywhere}.gitCommitFileStats{color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}@media(max-width:760px){.gitPanel{inset:0;width:auto;border:0;border-radius:0;z-index:100;-webkit-text-size-adjust:100%;text-size-adjust:100%}.gitPanelHeader{padding:max(6px,env(safe-area-inset-top)) 8px 6px;gap:6px}.gitPanelHeader h2{font-size:13px}.gitPanelHeader .iconButton{width:30px;min-width:30px;height:30px;min-height:30px}.gitTabs{flex:1 1 auto;justify-content:center}.gitTab{flex:1 1 0;max-width:88px;height:28px;min-height:28px;padding:2px 8px}.gitPanelBody{display:block;overflow:hidden}.gitPrimaryPane,.gitDetailPane{height:100%;overflow:auto;padding:10px;font-size:14px}.gitCommitList{gap:8px}.gitCommitItem{height:auto;min-height:0;padding:10px 8px}.gitCommitBody{gap:5px}.gitCommitSubject{font-size:14px;line-height:1.35}.gitCommitMeta,.gitCommitRefs{font-size:12px;line-height:1.3}.gitCommitRail:before{top:-12px;bottom:-12px}.gitPrimaryPane{border-right:0}.gitDetailPane,.gitPanel[data-view=diff] .gitPrimaryPane,.gitPanel[data-view=commit] .gitPrimaryPane{display:none}.gitPanel[data-view=diff] .gitDetailPane,.gitPanel[data-view=commit] .gitDetailPane{display:block}.gitImageDiff{grid-template-columns:minmax(0,1fr)}.gitImagePreview{min-height:140px}.gitRebaseButton{flex:0 0 auto;height:28px;min-height:28px;width:28px;min-width:28px}}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}