magpie-agent-console 1.1.0 → 1.3.1
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.
- package/README.md +45 -8
- package/app/app.css +1 -1
- package/app/app.js +113 -90
- package/daemon/dist/main.js +2152 -293
- package/daemon/dist/main.js.map +1 -1
- package/index.mjs +4 -0
- package/lib/gate.mjs +25 -5
- package/lib/wrapper.mjs +184 -0
- package/package.json +3 -2
- package/page/boot.js +4 -0
package/README.md
CHANGED
|
@@ -41,7 +41,22 @@ UI principle: **obvious at a glance, nothing extra**. Three columns — sidebar
|
|
|
41
41
|
- **Persistent sessions**: each thread binds to a long-lived Agent process; after a daemon restart, running threads are marked closed and can be resumed (`--resume` / `thread/resume`)
|
|
42
42
|
- **Multiple Agents**: Claude Code, Codex, Cursor, Copilot, OpenCode, Pi, Devin, dsh; missing CLIs show an install hint
|
|
43
43
|
- **Model / permission / thinking**: per-thread; four permission modes and five thinking levels (what each Agent actually supports)
|
|
44
|
-
-
|
|
44
|
+
- **全部自动同意 / Auto-approve all (1.3)**: a permission mode for every Agent; the default stays 每次询问 / Always Ask. While a conversation is in it, a one-line strip above the composer (全部自动同意已开启 on the left, whose tooltip says what it does for this Agent, and a 改回每次询问 link on the right) and a warning-coloured mode chip stay on screen, at any width and in light and dark. What it does per Agent, as the menu hint says:
|
|
45
|
+
|
|
46
|
+
| Agent | What 全部自动同意 turns on |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| Codex | `approvalPolicy: never` + `sandbox: danger-full-access`: **the sandbox is off**, nothing asks |
|
|
49
|
+
| Claude Code | `--permission-mode bypassPermissions` (started with `--allow-dangerously-skip-permissions`): **skips all permission checks** |
|
|
50
|
+
| Copilot | its Allow All (`allow_all` on, agent mode) |
|
|
51
|
+
| Devin CLI | its Bypass Permissions mode |
|
|
52
|
+
| Cursor, OpenCode, dsh | no switch over ACP: Agent / Build mode, and the daemon answers each approval request with its **allow once** option |
|
|
53
|
+
| Pi | Pi never asks before its tools anyway (its extensions' own dialogs still ask you) |
|
|
54
|
+
|
|
55
|
+
The daemon only ever answers with the option for that one request (allow once / accept), never allow-always, so no lasting rule is written into the Agent's own config; when a request offers nothing narrower, the card stays for you. Plan approvals and questions are never answered for you. Every approval it gives is saved in the conversation (`permission_request` + `permission_resolved`, both `auto: true`) and shown as a quiet row after its tool calls, 已自动同意 3 项 · npm test · git status, that opens to each request's title, command or file and the answer. Turning the mode on also approves a card that is already waiting. Only the page (with its token) can switch it on.
|
|
56
|
+
|
|
57
|
+
**Upgrading from 1.2.** 1.2's 全部放行 (`bypassPermissions`) did nothing for Cursor and OpenCode (they had no such mode, so it fell back to 每次询问) and dsh still asked; from 1.3 the same setting would really auto-approve for them. It is not escalated silently: on the first 1.3 start, Cursor / OpenCode / dsh conversations saved in that mode go back to 每次询问 with a notice in the conversation, and if your default permission mode was 全部放行, new Cursor / OpenCode / dsh conversations keep starting in 每次询问; the first one shows a notice that the new mode exists, with a button to turn it on there. Claude Code, Codex, Copilot and Devin keep the mode, which already meant the same in 1.2. Choosing the default permission mode again in Settings ends this.
|
|
58
|
+
- **Structured timeline**: user message → thinking (expandable) → tool calls (read / edit / command, with line-level diffs) → todos → usage and duration; answer permission requests (tools / plan / questions) on the card. Since 1.3 every tool call is one compact row: a type icon, the command or path (monospace, relative to the project, never wrapping), `+N -M` for an edit and the status on the right; click a row for its output or diff, and a failed step opens by itself. A run of more than 6 tool calls (with the short thinking between them) folds into one summary row (改动 2 · 运行 3 · 读取 4 · 搜索 1 · 1 失败) that expands to the same rows; while it runs, one line shows the current step (正在运行:npm test…). The Agent's step list (Claude Code TodoWrite, Codex plan updates, an ACP agent's plan) is a checklist with N/M, and while it has open items an "N/M 个任务" pill above the composer jumps to it. Each reply ends with 复制 · model · time · duration (plus tokens / cost when the Agent reports them). Code blocks have a language label, line numbers, a wrap toggle and a copy button (the copy is the raw code). The look is grayscale and was inspired by [Better Paseo](https://github.com/RoundRedDot/better-paseo) (MIT); no code was copied
|
|
59
|
+
- **Instant send (1.3)**: your message shows in the timeline the moment you click 发送 and the composer switches to working at once. The daemon saves and pushes the message before it starts the Agent (spawn + ACP `initialize` / `session/new`, seconds on Windows) instead of after; the page draws it right away and swaps in the daemon's copy by a client message id, so it neither doubles nor jumps. A send that fails stays in place marked 发送失败 with 重试 / 移除. A message sent while a turn runs still goes to the queue list
|
|
45
60
|
- **Steer and queue**: steer while running, queue the next message, interrupt
|
|
46
61
|
- **Changes panel**: git status refresh every 3s, unified per-file diffs; discarded untracked files go to trash instead of a hard delete
|
|
47
62
|
- **Files panel**: lazy directory tree (respects `.gitignore`), syntax-highlighted preview
|
|
@@ -49,7 +64,12 @@ UI principle: **obvious at a glance, nothing extra**. Three columns — sidebar
|
|
|
49
64
|
- **Images**: attach or paste images (and text files). Only PNG, JPEG, GIF and WebP are sent as images. Claude Code and Codex take them natively; Claude Code gets a text file (up to 1 MB) as a plain-text document, Codex gets its path; any other file (SVG, binaries, images over Claude's 5 MB limit) goes by path, with a notice. An ACP Agent (Cursor, Copilot, OpenCode, Pi, Devin CLI, dsh) gets image blocks when its ACP `initialize` advertises `promptCapabilities.image`; otherwise it gets each image's file path (as text and a `resource_link`), so it can open it with its file tools, and the timeline says it can't see the image itself. The composer says so before you send once the Agent has been asked. dsh answers `initialize` for the route its ACP starts on (its `acp` config row, which ships as a model dsh's catalog doesn't have) and refuses image blocks otherwise, so Agent Console starts dsh with a `--patch` overlay that puts that row on the conversation's model: on a model that sees images (Magpie writes those as `input: [text, image]`) dsh then takes image blocks; after a switch to another model in the same chat, images go by path and dsh opens them with its `read_image` tool. Checked on 2026-10-31 with the real CLIs, a throwaway HOME, no sign-in and a local stand-in for the model API (`npm run test:real`, see `test/real/`): the image reaches the model request from Claude Code 2.1.316 (stream-json), Codex 0.165.0, Copilot 1.0.105 (BYOK), OpenCode 1.19.5, Pi (pi-acp 0.0.34 + pi 1.4.0) and dsh 0.2.1-rc.5; Devin CLI 3000.11.234 and Cursor 2026.10.22 advertise images and Devin gets the image block, but both need a sign-in to run a model. Inline media is capped at 10 MB per file and 16 MB per message (an ACP SDK peer refuses messages over 32 MB); larger images go by path
|
|
50
65
|
- **Import history**: import matching sessions from `~/.claude/projects` and `~/.codex/sessions` as new threads (resumable)
|
|
51
66
|
- **Thread management**: search (Ctrl+K), pin, rename, archive, delete (trash), export Markdown, thread info (usage / cost / session ID)
|
|
52
|
-
- **
|
|
67
|
+
- **Preview tab** (1.2): a small browser in the right panel for local dev servers (`localhost`, `127.0.0.1`, `[::1]`, `*.localhost`, `0.0.0.0`): address bar, back / forward, reload, open in the system browser, widen the panel. The address is remembered per conversation. Pages load through the daemon's local preview proxy (see the security model), so module scripts, `fetch` and HMR WebSockets work inside Magpie's sandboxed frame. Limits: popups, `alert` and native form posts don't run in the sandbox; `localStorage` / `sessionStorage` / `document.cookie` are in-memory and reset on reload, and cookies are not passed (use 用浏览器打开 / Open in browser for logins)
|
|
68
|
+
- **Links in chat** (1.2): local addresses in agent text, rendered Markdown and tool output (`localhost:5173`, `http://127.0.0.1:8080/x`, …) become links that open in the Preview tab; Ctrl/⌘+click, and any other `http(s)` link, opens the system browser through the daemon (`app.openExternal`: http/https only, re-serialized, run with `execFile` and no shell: `rundll32 url.dll,FileProtocolHandler` on Windows, `open` on macOS, `xdg-open` on Linux; if that fails the link is copied). The terminal is not linkified
|
|
69
|
+
- **File chips** (1.2): drag a row from the Files tab into the composer, or right-click → 插入到聊天 / Add to chat, to attach a path chip. Chips are sent as project-relative paths, checked by the daemon (inside the project, no `..`, no symlink escape, must exist, at most 50), and reach the Agent as a "Referenced files" section with absolute paths after your text (plus `resource_link` blocks for ACP Agents). Dropping files from the OS file manager still uploads them as attachments
|
|
70
|
+
- **Layout settings** (1.2): content width (narrow 640 / default 720 / wide 880 / full) and chat font size (12–18 px, default 13; timeline, composer, tool cards, diffs and the file viewer scale together, code 1 px smaller; the sidebar, top bar, panel tabs, menus and dialogs stay on the fixed 13 px UI scale); the sidebar collapses with the panel button at its top-left or Ctrl/⌘+B (collapses automatically in narrow windows); all persisted
|
|
71
|
+
- **Follows Magpie live** (1.2): light/dark, Magpie's neutral colours and its language follow Magpie while the page is open (and after a reconnect); the accent stays neutral grey
|
|
72
|
+
- **Mock Agent**: `AGENT_CONSOLE_MOCK=1` registers a demo Agent with 11 scripts (`default` / `perm` / `plan` / `ask` / `slow` / `error` / `long` / `exit` / `serve` / `tools` / `bashhint`) so UI work does not burn tokens
|
|
53
73
|
|
|
54
74
|
## Architecture
|
|
55
75
|
|
|
@@ -61,7 +81,8 @@ Magpie window
|
|
|
61
81
|
▼
|
|
62
82
|
Magpie plugin host (Bun) ── index.mjs + lib/gate.mjs "gate" on 127.0.0.1:<port> (default 3488)
|
|
63
83
|
│ first /open: spawns the daemon as a child process (node, --port 0, stdin lifeline, --parent-pid)
|
|
64
|
-
│ 302 → http://127.0.0.1:<
|
|
84
|
+
│ 302 → http://127.0.0.1:<port>/app?theme=…#t=<token>&p=<daemonPort> (1.3: the gate's wrapper page, lib/wrapper.mjs)
|
|
85
|
+
│ └─ <iframe src="http://127.0.0.1:<daemonPort>/?theme=…#t=<token>&w=1">
|
|
65
86
|
▼
|
|
66
87
|
daemon (Node, daemon/dist/main.js) ── HTTP + WebSocket on an ephemeral 127.0.0.1 port
|
|
67
88
|
└─ React app (app/) reads the token from location.hash, sends it as the x-agent-console header
|
|
@@ -80,10 +101,23 @@ The daemon can run Agents with full access to your machine, so the token that un
|
|
|
80
101
|
- token routes (`/api/*`, `/attachments/*`, WebSocket hello) accept `Origin: null` only as a way to *present* the token (the Magpie iframe has an opaque origin); `access-control-allow-origin: null` is emitted only on responses to requests that carried a valid token, plus the preflight for `/api/upload`; credentials are never allowed;
|
|
81
102
|
- any other origin gets 403 even with a valid token.
|
|
82
103
|
- **Host is checked on every request and WebSocket upgrade** (gate and daemon): it must be `127.0.0.1:<port>` or `localhost:<port>` with the actually bound port, otherwise 421. This blocks DNS rebinding, where the attacker's requests carry no `Origin` at all.
|
|
83
|
-
- The gate answers only `GET /open?k=<gate key>` (the daemon token is not accepted there), refuses any request that carries an `Origin` header, and sends `Cache-Control: no-store`, `X-Content-Type-Options: nosniff`, `Referrer-Policy: no-referrer`.
|
|
104
|
+
- The gate answers only `GET /open?k=<gate key>` (the daemon token is not accepted there) and `GET /app` (1.3, below), refuses any request that carries an `Origin` header, and sends `Cache-Control: no-store`, `X-Content-Type-Options: nosniff`, `Referrer-Policy: no-referrer`.
|
|
84
105
|
- WebSocket connections must send `hello` with the token within 5 seconds, otherwise they are closed with code 4401.
|
|
106
|
+
- **Coming back after sleep / a daemon restart (1.3).** Before 1.3 the plugin frame sat on the daemon's random port; when the daemon was gone after sleep and the WebView reloaded the frame, it showed "127.0.0.1 拒绝连接" with none of our script left to recover. Now `/open` redirects to the gate's own `GET /app`, a static page that frames the daemon page, so a reload lands on the stable gate port. The daemon page (told by `w=1`) posts `{ac_console:"alive"}` to it every 2 s while its WebSocket is open and `{ac_console:"lost"}` after 5 s without it; no alive within 12 s (6 s after the child frame loaded), a lost, or 15 s of silence while visible (time the wrapper's own timers were suspended doesn't count) sends the frame back through the Magpie page (`b`, as below), which restarts the daemon. At most 3 automatic tries in 2 minutes (`ac_try`), then a button. The wrapper holds no secret of its own: the token arrives only in its fragment and goes on only in the child's fragment, the gate key never reaches it, the child is always `http://127.0.0.1:<integer port>/`, `b` passes the same loopback Magpie-page check, only the Magpie theme protocol is relayed (theme events and hello answers down, the hello call up, messages checked by `event.source`), and it is served with a per-response nonce CSP (`default-src 'none'`, `frame-src http://127.0.0.1:*`, and `frame-ancestors 'self' http://127.0.0.1:* http://localhost:* http://[::1]:* http://wails.localhost:* wails:`, so only a loopback page or Magpie's own desktop window can frame it). Host and Origin checks apply to `/app` like to `/open`.
|
|
85
107
|
- **Coming back after a plugin host restart.** Magpie restarts its plugin host from time to time; the old host's daemon exits with it and the new host has a new gate key. `boot.js` passes its own page URL to the gate as `back`; the gate accepts it only if it is a loopback `/_magpie/plugin/<id>/index.html` URL and forwards it **only in the fragment** (`#t=…&b=…`). When the daemon page can't reconnect for 5 seconds (or on 重试 / Retry) it navigates back to that page, which reads the fresh `session.js` and opens the new gate. To tell a live host's `session.js` from one a killed host left behind (a hard kill can't delete it), the file carries `ts` and `beat`: from the first page open on, the host rewrites it every 4 s, and after a lost connection `boot.js` only takes a file written after the loss; a host that was never opened doesn't rewrite it, and a new host deletes a file whose writer (pid in `session-owner.json`, outside the page folder) is gone before Magpie serves the page. The daemon page checks the URL again before following it, so it is never an open redirect, and the token never leaves its own fragment.
|
|
86
108
|
|
|
109
|
+
### Preview proxy (1.2)
|
|
110
|
+
|
|
111
|
+
The Preview tab can't frame a dev server directly: Magpie's frame is sandboxed without `allow-same-origin`, so the page would run with an opaque origin and module scripts, `fetch` and storage break. The daemon runs a small reverse proxy instead:
|
|
112
|
+
|
|
113
|
+
- **Created only over the authenticated WebSocket** (`preview.open`); there is no HTTP route to start one.
|
|
114
|
+
- **Loopback targets only**: `localhost`, `*.localhost`, `127.0.0.0/8`, `0.0.0.0`, `::1`/`::`, `http:` or `https:`, no user-info, at most 2048 characters. Anything else is refused before a socket is opened.
|
|
115
|
+
- **Refused ports**: the daemon's own port, the gate (`--gate-port`, 3488), Magpie (3425, 3430, any port in `MAGPIE_ADDR` / `MAGPIE_WEB_ADDR` / `MAGPIE_URL`, and the gateway port saved in Magpie's own `settings.json`, read again on every open: the portable `data` folder beside Magpie, `$XDG_CONFIG_HOME/magpie`, `~/.config/magpie`), the proxy's own ports, plus `AGENT_CONSOLE_PREVIEW_DENY` (comma-separated). Whatever the port, a target whose `GET /` answers like Magpie's gateway (`{"name":"magpie",…}`), or that replies with `X-Magpie-*` headers, is refused; the check is repeated every minute and fails closed (no answer → nothing forwarded).
|
|
116
|
+
- **A key on every request**: each listener answers only at `http://ac<128-bit random key>.localhost:<port>`. The preview frame is an opaque origin (Magpie's sandbox is inherited), so its requests carry `Origin: null` and no `Referer`, exactly what any other web page can send from a sandboxed iframe of its own, and the port can be found by scanning. The host name is the one thing the browser attaches to every request the frame makes (navigations, module scripts and their imports, `fetch`, CSS `url()`, workers, the HMR WebSocket) that another page can't know. A request with any other `Host` is refused before anything is forwarded and gets no CORS headers: `127.0.0.1:<port>` / `localhost:<port>` → 403, anything else → 421 (DNS rebinding). Responses carry `Referrer-Policy: no-referrer` so the key isn't sent on to other sites. `preview.open` also returns a per-open nonce over the authenticated WebSocket; `GET /__agent_console__/ping` must echo it exactly (a plain 200 `ok` from a hostile DNS answer is refused and the listener is released). Before the keyed name is looked up, the panel probes a keyless canary (`acprobe<random>.localhost` on the same port) the same way. Apple WebKit before macOS 26 (Magpie's Mac app on 12–15, Safari with `magpie web`) asks network DNS for `*.localhost`, so it is refused before any such name is looked up and the listener is released. The macOS version doesn't come from the user agent (Apple froze it at `Mac OS X 10_15_7`, macOS 26+ included): `preview.open` reports the daemon's own `os.platform()` and the Darwin major of `os.release()` (25 = macOS 26), and the panel refuses only Apple WebKit on a Darwin host below 25, or when that answer is missing. The daemon listens on 127.0.0.1 only, so the page and the daemon run on the same machine; the keyless canary stays as the runtime check either way. Chromium / WebView2, WebKitGTK and WebKit on macOS 26+ resolve `*.localhost` to loopback themselves. Where the preview can't run, the panel offers the system browser instead.
|
|
117
|
+
- **One listener per target origin** on `127.0.0.1` with a random port (at most 8, least recently used closed first). Every request and upgrade checks `Host` (above) and `Origin` (absent, `null` or the proxy's own origin, else 403).
|
|
118
|
+
- **Headers**: upstream gets the target's `Host` and `Origin`; `Cookie`, `Forwarded` and `X-Forwarded-*` are dropped. Responses lose `X-Frame-Options`, the CSP `frame-ancestors` directive, `Set-Cookie` and upstream CORS headers; same-target redirects are rewritten to the proxy; CORS is answered for the opaque frame only, and only on requests that carry the key (`access-control-allow-origin: null`, no credentials). Cookies are dropped both ways because cookies for `127.0.0.1` are shared across ports. HTML gets one injected script (`/__agent_console__/preview.js`) that reports the address and title to the panel and accepts back / forward / reload from the parent frame only.
|
|
119
|
+
- **Closed when idle**: after 10 minutes without traffic (an open HMR socket counts as traffic), when the Preview tab closes or changes origin, when the last WebSocket client disconnects, and on daemon exit.
|
|
120
|
+
|
|
87
121
|
## Lifecycle
|
|
88
122
|
|
|
89
123
|
- Importing `index.mjs` has no side effects (no port, no process, no files).
|
|
@@ -103,9 +137,10 @@ The plugin runs wherever Magpie runs (Windows, macOS, Linux). It needs **Node.js
|
|
|
103
137
|
- **Terminal.** `node-pty` prebuilds cover win32/darwin/linux × x64/arm64 (Linux prebuilds are glibc only). Default shell: Windows `pwsh` → `powershell` → `cmd`; macOS/Linux `$SHELL` if it exists, else `zsh` (macOS) / `bash` / `sh`. If `node-pty` cannot load, a simple non-PTY terminal is used ([details](#when-node-pty-cant-be-loaded)). On macOS the exec bit of `node-pty`'s `spawn-helper` is restored if the package extraction dropped it.
|
|
104
138
|
- **Folder picker.** Windows: PowerShell `FolderBrowserDialog`; macOS: `osascript` "choose folder"; Linux: `zenity` or `kdialog` when a graphical session exists; otherwise type the path.
|
|
105
139
|
- **Paths.** Project paths are compared case-insensitively on Windows and macOS (and NFC-normalized on macOS); `realpath.native` resolves 8.3 short names and `subst` drives; UNC paths work. Discarding an untracked file moves it to the trash with a copy fallback when the project and data dir are on different drives.
|
|
106
|
-
- **
|
|
140
|
+
- **Git Bash for the agents (1.3).** On Windows `bash` on `PATH` is often `C:\Windows\System32\bash.exe`, the WSL launcher. The daemon looks for Git Bash next to `git.exe` on `PATH`, then in Program Files / Program Files (x86) / `%LOCALAPPDATA%\Programs\Git` / scoop, then `X:\Git` and `X:\Program Files\Git` on the other drives (probed in a short-lived child process with a 1.5 s limit, so a dead network drive can't stall it), never taking System32 / SysWOW64 / WindowsApps bash; 设置 → Bash 路径 / Settings → Bash path overrides it (validated). Each Agent spawn gets `CLAUDE_CODE_GIT_BASH_PATH` (Claude Code), `OPENCODE_GIT_BASH_PATH` (OpenCode) and Git's `bin` first on `PATH` (Pi's `where bash.exe`, dsh's `bash`) — per spawn only, no user config file is written and the terminal keeps your own environment. When none is found, Claude Code / Pi / dsh conversations show a hint with a Git for Windows link. Nothing changes on macOS / Linux.
|
|
141
|
+
- **Encoding.** Agent protocol output is UTF-8. Raw process output (Agent stderr, version / model probes, git errors, the no-PTY terminal) is decoded per chunk: valid UTF-8 stays UTF-8, anything else on Windows is read in the system ANSI code page (GBK on Chinese Windows) with Node's built-in `TextDecoder`, keeping at most 3 bytes of a character split across chunks; the PTY terminal already gets UTF-8 from ConPTY. The folder picker falls back to GBK (CP936); the file preview tries UTF-8, then GBK. Git runs with `core.quotepath=false` so Chinese file names show as-is.
|
|
107
142
|
- **Magpie desktop window → `http://127.0.0.1`.** Magpie's window origin is `wails://` on macOS/Linux and `http://wails.localhost` on Windows. The plugin frame navigates itself to the gate on `http://127.0.0.1`, as Magpie's plugin-runtime docs describe for page plugins. On macOS, Magpie's `Info.plist` has no ATS keys and ATS exempts IP-address hosts by default, and the main window has no CSP that could block the frame, so the navigation is allowed. This is the one item that still needs a run on a real Mac.
|
|
108
|
-
- **Clickjacking / `frame-ancestors`.**
|
|
143
|
+
- **Clickjacking / `frame-ancestors`.** The gate's `/app` wrapper (1.3) allows only loopback pages (`'self'`, `http://127.0.0.1:*`, `http://localhost:*`, `http://[::1]:*`) and Magpie's desktop window (`wails:` on macOS / Linux, `http://wails.localhost:*` on Windows) as its ancestors. `magpie web` opened through a non-loopback address (a LAN IP or a reverse proxy) is not in that list, so open it as `http://127.0.0.1:<port>` / `http://localhost:<port>` on the same computer to use the console there. The daemon page sets no `frame-ancestors` of its own: the wrapper is its only parent. Getting a working console into any frame still requires the gate key, which only Magpie's per-run page path hands out, and the token, which only travels in the gate's redirect fragment.
|
|
109
144
|
|
|
110
145
|
## Reproducible build
|
|
111
146
|
|
|
@@ -182,13 +217,15 @@ npm run shot:v1 # screenshot set (light/dark × scenes → _tmp/shots-v1/)
|
|
|
182
217
|
|
|
183
218
|
# Mock (no real tokens)
|
|
184
219
|
AGENT_CONSOLE_MOCK=1 npm run dev
|
|
185
|
-
# scripts: default /perm /plan /ask /slow /error /long (5000-event stress) /exit
|
|
220
|
+
# scripts: default /perm /plan /ask /slow /error /long (5000-event stress) /exit /serve (local links, 1.2)
|
|
221
|
+
# /tools (8 tool calls → folded summary) /winrun (long Windows commands + an approval) /tasks (checklist + code block) /bashhint (1.3)
|
|
186
222
|
```
|
|
187
223
|
|
|
188
224
|
| Env | Purpose |
|
|
189
225
|
|---|---|
|
|
190
226
|
| `AGENT_CONSOLE_PORT` | gate port in the plugin / daemon port in standalone mode (3488; plugin `options.port` wins) |
|
|
191
227
|
| `AGENT_CONSOLE_MOCK=1` | register the mock provider |
|
|
228
|
+
| `AGENT_CONSOLE_MOCK_START_MS` / `AGENT_CONSOLE_MOCK_DETECT_MS` | mock only: delay the Agent start / detection (a slow start like real Agents on Windows; e2e uses `E2E_MOCK_START_MS`, default 1200) |
|
|
192
229
|
| `AGENT_CONSOLE_TOKEN` | fixed page token (tests/screenshots only; do not set in production) |
|
|
193
230
|
| `AGENT_CONSOLE_IDLE_EXIT_MIN` | idle auto-exit minutes (default 60) |
|
|
194
231
|
| `XDG_CONFIG_HOME` | data root (`_tmp/xdg-dev` in development) |
|
|
@@ -199,4 +236,4 @@ Daemon CLI: `node daemon/dist/main.js [--port N|0] [--data DIR] [--token T] [--p
|
|
|
199
236
|
|
|
200
237
|
MIT (see LICENSE). Third-party licenses are in THIRD-PARTY-NOTICES.md: the 5 installed packages and the 11 bundled into `app/app.js` (mostly MIT; DOMPurify MPL-2.0/Apache-2.0, highlight.js BSD-3-Clause, lucide-react ISC). Build/test: esbuild, vitest, TypeScript, playwright-core.
|
|
201
238
|
|
|
202
|
-
Architecture takes cues from Paseo (persistent daemon + provider abstraction) and T3 Code (timeline shape and three-column layout) — ideas only, no copied code.
|
|
239
|
+
Architecture takes cues from Paseo (persistent daemon + provider abstraction) and T3 Code (timeline shape and three-column layout), and the 1.3 timeline look from Better Paseo (MIT) — ideas only, no copied code.
|
package/app/app.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
:root{--own-bg: #ffffff;--own-sb: #f8f8f7;--own-fg: #1f1f1f;--own-muted: #737373;--own-line: #ececec;--bg: var(--own-bg);--sb-bg: var(--own-sb);--fg: var(--own-fg);--muted: var(--own-muted);--line: var(--own-line);--meta: #a3a3a3;--text: #262626;--accent: #262626;--accent-2: #525252;--accent-fg: #ffffff;--accent-soft: #f0f0f0;--surface: color-mix(in oklab, var(--fg) 3%, var(--bg));--surface-hover: color-mix(in oklab, var(--fg) 6%, var(--bg));--chip-bg: #f4f5f5;--chip-line: #ececec;--pill-fg: #525252;--search-bg: #efefee;--tile-bg: color-mix(in oklab, var(--fg) 90%, var(--bg));--tile-fg: var(--bg);--badge-bg: color-mix(in oklab, var(--fg) 7%, var(--bg));--badge-fg: color-mix(in oklab, var(--fg) 80%, var(--bg));--run-bg: #f0f0f0;--run-fg: #404040;--cp-line: color-mix(in oklab, var(--fg) 11%, var(--bg));--cp-focus: #a3a3a3;--cp-ring: rgb(0 0 0 / .06);--active-bg: #ffffff;--active-line: #e6e6e6;--ok: #16a34a;--warn: #d97706;--danger: #dc2626;--info: #2563eb;--code-bg: #f4f5f5;--code-line: #eaeceb;--code-fg: #404040;--add-bg: #ecfdf3;--del-bg: #fef2f2;--r-s: 6px;--r-m: 8px;--r-l: 12px;--r-full: 999px;--font-ui: var(--magpie-font, "Segoe UI Variable Text", "Segoe UI", -apple-system, "PingFang SC", "Microsoft YaHei UI", system-ui, sans-serif);--font-mono: var(--magpie-code, "Cascadia Code", "Cascadia Mono", "JetBrains Mono", ui-monospace, Consolas, monospace);--fs-s: 12px;--fs-m: 13px;--fs-l: 14px;--fs-hero: 18px;--lh: 1.6;--col: 720px;--row: 26px;--shadow-pop: 0 8px 24px -6px rgb(0 0 0 / .16), 0 0 0 1px var(--line);--term-bg: #ffffff;--term-fg: #1e1e1e;--ease: cubic-bezier(.2,.7,.2,1);--dur-1: .12s;--dur-2: .2s;color-scheme:light}:root[data-theme=dark]{--own-bg: #1a1a1a;--own-sb: #151515;--own-fg: #ececec;--own-muted: #9b9b9b;--own-line: #2c2c2c;--meta: #7c7c7c;--text: #e2e2e2;--accent: #e5e5e5;--accent-2: #b3b3b3;--accent-fg: #171717;--accent-soft: #2e2e2e;--chip-bg: #252727;--chip-line: #323434;--pill-fg: #bdbdbd;--search-bg: #242424;--run-bg: #2e2e2e;--run-fg: #d4d4d4;--cp-focus: #6b6b6b;--cp-ring: rgb(255 255 255 / .07);--active-bg: #242424;--active-line: #333333;--info: #60a5fa;--code-bg: #232323;--code-line: #303030;--code-fg: #d4d4d4;--add-bg: rgb(22 163 74 / .16);--del-bg: rgb(220 38 38 / .16);--shadow-pop: 0 8px 24px -6px rgb(0 0 0 / .5), 0 0 0 1px var(--line);--term-bg: #0c0c0c;--term-fg: #cccccc;color-scheme:dark}:root[data-host-colors]{--bg: var(--magpie-card, var(--magpie-bg, var(--own-bg)));--sb-bg: var(--magpie-bg, var(--own-sb));--fg: var(--magpie-fg, var(--own-fg));--muted: var(--magpie-muted, var(--own-muted));--line: var(--magpie-line, var(--own-line))}@layer reset{html,body{margin:0;padding:0;height:100%}body{background:var(--bg);color:var(--fg);font-family:var(--font-ui);font-size:var(--fs-m);line-height:var(--lh);-webkit-font-smoothing:antialiased}*{box-sizing:border-box}#root{height:100%}button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}input,textarea{font:inherit;color:inherit}a{color:var(--accent)}:focus-visible{outline:2px solid color-mix(in oklab,var(--accent) 55%,var(--bg));outline-offset:-1px}}*{scrollbar-width:thin;scrollbar-color:color-mix(in oklab,var(--fg) 18%,transparent) transparent}*::-webkit-scrollbar{width:8px;height:8px}*::-webkit-scrollbar-thumb{background:color-mix(in oklab,var(--fg) 18%,transparent);border-radius:4px}*::-webkit-scrollbar-thumb:hover{background:color-mix(in oklab,var(--fg) 30%,transparent)}*::-webkit-scrollbar-track{background:transparent}.ibtn{width:28px;height:28px;flex:none;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--r-s);color:var(--muted);transition:background var(--dur-1),color var(--dur-1)}.ibtn:hover{background:var(--surface-hover);color:var(--fg)}.ibtn[disabled]{opacity:.35;cursor:default}.ibtn.on{color:var(--accent)}.ibtn svg{width:16px;height:16px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:30px;padding:0 14px;border-radius:var(--r-s);font-size:var(--fs-m);background:var(--surface-hover);color:var(--fg);transition:background var(--dur-1),filter var(--dur-1)}.btn:hover{filter:brightness(1.03)}.btn[disabled]{opacity:.4;cursor:default}.btn.primary{background:var(--accent);color:var(--accent-fg)}.btn.primary:hover{filter:brightness(1.08)}.btn.danger{color:var(--danger)}.btn.ghost{background:none}.btn.ghost:hover{background:var(--surface-hover)}.tinput{width:100%;height:30px;padding:0 10px;border:1px solid var(--line);border-radius:var(--r-s);background:var(--bg);font-size:var(--fs-m);outline:none}.tinput:focus{border-color:color-mix(in oklab,var(--accent) 55%,var(--bg))}.tinput.err{border-color:var(--danger)}.tinput::placeholder{color:var(--muted)}textarea.tinput{height:auto;min-height:60px;padding:6px 10px;resize:vertical}.menu{position:fixed;z-index:60;min-width:160px;max-width:280px;background:var(--bg);border-radius:var(--r-m);box-shadow:var(--shadow-pop);padding:4px;font-size:var(--fs-m)}.mi{display:flex;align-items:center;gap:8px;width:100%;height:28px;padding:0 10px;border-radius:var(--r-s);text-align:left;color:var(--fg)}.mi:hover:not([disabled]){background:var(--surface-hover)}.mi[disabled]{color:var(--muted);cursor:default}.mi.danger{color:var(--danger)}.mi .mi-check{margin-left:auto;color:var(--accent)}.msep{height:1px;margin:4px 6px;background:var(--line)}.mlabel{padding:6px 10px 2px;font-size:var(--fs-s);color:var(--muted)}.dlg-scrim{position:fixed;inset:0;z-index:70;background:#00000052;display:flex;align-items:center;justify-content:center;padding:24px}.dlg{width:440px;max-width:100%;max-height:80vh;display:flex;flex-direction:column;background:var(--bg);border-radius:var(--r-l);box-shadow:var(--shadow-pop)}.dlg-title{flex:none;padding:14px 16px 4px;font-size:var(--fs-l);font-weight:600}.dlg-body{flex:1;min-height:0;overflow-y:auto;padding:8px 16px}.dlg-foot{flex:none;display:flex;justify-content:flex-end;gap:8px;padding:10px 16px 14px}.dlg-row{margin:10px 0}.dlg-row-top{align-items:flex-start}.dlg-row>label{display:block;margin-bottom:4px;font-size:var(--fs-s);color:var(--muted)}.provider-list{display:flex;flex-direction:column;gap:6px;width:100%;max-height:280px;overflow:auto}.provider-list{display:flex;flex-direction:column;gap:6px;flex:1;min-width:0}.provider-redetect{align-self:flex-start;margin-bottom:4px}.provider-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;padding:6px 8px;border-radius:var(--r-m);background:var(--bg-2)}.provider-row.open{padding-bottom:10px}.provider-head{display:flex;align-items:center;gap:10px;flex:1;min-width:0;border:0;background:none;text-align:left;cursor:pointer;color:inherit;padding:0}.provider-detail{flex:1 1 100%;display:flex;flex-direction:column;gap:6px;padding:4px 0 0 28px}.provider-hint-row{display:flex;gap:8px;align-items:flex-start;flex-wrap:wrap}.btn.sm{font-size:var(--fs-s);padding:4px 10px;height:auto}.provider-meta{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.provider-name{font-size:var(--fs-m);font-weight:500}.provider-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.provider-dot-on{background:var(--ok, #3ecf8e)}.provider-dot-off{background:var(--muted);opacity:.5}.provider-dot-pending{background:var(--warn, #e6a817)}.provider-switch input{width:16px;height:16px;cursor:pointer}.dlg-hint{font-size:var(--fs-s);color:var(--muted)}.dlg-hint.err{color:var(--danger)}.toasts{position:fixed;left:50%;bottom:24px;transform:translate(-50%);z-index:80;display:flex;flex-direction:column;gap:8px;align-items:center}.toast{max-width:480px;padding:8px 14px;border-radius:var(--r-m);background:var(--fg);color:var(--bg);font-size:var(--fs-m);box-shadow:var(--shadow-pop);animation:toast-in var(--dur-2) var(--ease)}.toast.err{background:var(--danger);color:#fff}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}}.dot{width:6px;height:6px;border-radius:50%;flex:none;background:var(--muted)}.dot.run{background:var(--accent-2);animation:breathe 1.6s infinite}.dot.err{background:var(--danger)}.dot.wait{background:var(--warn);animation:breathe 1.6s infinite}@keyframes breathe{50%{opacity:.35}}.boot-screen{height:100%;display:flex;align-items:center;justify-content:center;gap:8px;color:var(--muted);font-size:var(--fs-m)}.boot-screen .btn{margin-top:12px}.boot-wrap{display:flex;flex-direction:column;align-items:center}.boot-dot{width:8px;height:8px;border-radius:50%;background:var(--muted)}.boot-dot[data-state=open]{background:var(--ok)}.boot-dot[data-state=reconnecting]{background:var(--warn)}.boot-dot[data-state=down]{background:var(--danger)}.vh{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}.menu.select-menu{z-index:80;overflow-y:auto;outline:none;max-width:320px}.sm-opt{cursor:pointer;user-select:none;height:auto;min-height:28px;padding:4px 8px 4px 10px}.sm-opt.on{background:var(--surface-hover)}.sm-opt.off{color:var(--muted);cursor:default}.sm-opt.off:hover{background:none}.sm-text{display:flex;flex-direction:column;min-width:0;flex:1 1 auto}.sm-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm-hint{font-size:var(--fs-s);color:var(--muted);white-space:normal;line-height:1.4}.sm-check{flex:none;width:14px;display:inline-flex;color:var(--accent)}.sm-opt[aria-selected=true] .sm-label{font-weight:500}.tinput.sm-field{display:flex;align-items:center;text-align:left;padding-right:26px;cursor:pointer;position:relative;color:var(--fg);background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%);background-position:calc(100% - 14px) 50%,calc(100% - 10px) 50%;background-size:4px 4px;background-repeat:no-repeat}.tinput.sm-field[aria-expanded=true]{border-color:color-mix(in oklab,var(--accent) 55%,var(--bg))}.sm-field .sm-val{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.app{display:flex;height:100vh;min-width:480px;overflow:hidden}.sidebar{width:var(--sb-w, 248px);flex:none;display:flex;flex-direction:column;background:var(--sb-bg);border-right:1px solid var(--line)}.sb-row{display:flex;align-items:center;gap:2px;height:40px;padding:8px 8px 4px;flex:none}.sb-row-search{height:36px;padding:0 8px 4px}.sb-new{flex:1;display:flex;align-items:center;gap:8px;height:28px;min-width:0;padding:0 8px 0 5px;border-radius:var(--r-s);font-size:var(--fs-m);font-weight:500;text-align:left;transition:background var(--dur-1);white-space:nowrap;overflow:hidden}.sb-new-tile{width:18px;height:18px;flex:none;border-radius:5px;background:var(--tile-bg);color:var(--tile-fg);display:inline-flex;align-items:center;justify-content:center}.sb-new-tile svg{stroke-width:2.2}.sb-new:hover{background:var(--surface-hover)}.sb-row .ibtn{width:28px;height:28px}.sb-search{flex:1;display:flex;align-items:center;gap:6px;height:28px;padding:0 8px;border-radius:var(--r-s);background:var(--search-bg);color:var(--meta)}.sb-search input::placeholder{color:var(--meta)}.sb-search input{flex:1;min-width:0;border:0;background:none;font-size:var(--fs-s);outline:none;color:var(--fg)}.sb-list{flex:1;overflow-y:auto;padding:0 8px 8px}.pj-group{margin-top:2px}.pj{display:flex;align-items:center;gap:2px;height:var(--row);padding:0 4px 0 0;border-radius:var(--r-s)}.pj:hover{background:var(--surface-hover)}.pj-toggle{flex:1;min-width:0;height:100%;display:flex;align-items:center;gap:6px;padding-left:2px;text-align:left;font-size:var(--fs-m);font-weight:500}.pj-caret{width:14px;flex:none;display:inline-flex;justify-content:center;color:var(--muted);transition:transform var(--dur-1)}.pj-caret.open{transform:rotate(90deg)}.pj-badge{width:18px;height:18px;flex:none;border-radius:5px;display:inline-flex;align-items:center;justify-content:center;background:var(--badge-bg);color:var(--badge-fg);font-size:11px;font-weight:600;line-height:1;text-transform:uppercase}.pj-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pj-count{flex:none;padding:0 6px;font-size:var(--fs-s);color:var(--meta)}.pj-act{width:22px;height:22px;flex:none;display:none;align-items:center;justify-content:center;border-radius:var(--r-s);color:var(--muted)}.pj:hover .pj-act,.pj-act:focus-visible{display:inline-flex}.pj:hover .pj-count{display:none}.pj-act:hover{background:var(--bg);color:var(--fg)}.pj-sessions{padding:1px 0 4px 22px;display:flex;flex-direction:column;gap:1px}.pj-more,.pj-empty{display:flex;align-items:center;width:100%;height:26px;padding:0 8px 0 21px;font-size:var(--fs-s);color:var(--muted);text-align:left;border-radius:var(--r-s)}.pj-more:hover{background:var(--surface-hover);color:var(--fg)}.t-item{display:flex;align-items:center;gap:8px;width:100%;height:var(--row);padding:0 4px 0 8px;border-radius:var(--r-s);position:relative;text-align:left;font-size:var(--fs-m);transition:background var(--dur-1)}.t-item:hover{background:var(--surface-hover)}.t-item.on{background:var(--active-bg);box-shadow:0 0 0 1px var(--active-line),0 1px 2px #0000000a;font-weight:500}.t-item.on:before{content:"";position:absolute;left:-1px;top:7px;bottom:7px;width:2px;border-radius:2px;background:var(--accent-2)}.t-item.archived{opacity:.55}.t-item.archived .t-title{font-style:italic}.t-item .dot{width:5px;height:5px}.t-pin{width:12px;flex:none;display:inline-flex;color:var(--muted)}.t-pin svg{width:10px;height:10px}.t-title{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.t-time{flex:none;font-size:11.5px;color:var(--meta);font-weight:400}.t-item:hover .t-time{display:none}.t-more{flex:none;width:22px;height:22px;display:none;align-items:center;justify-content:center;border-radius:var(--r-s);color:var(--muted)}.t-item:hover .t-more{display:inline-flex}.t-more:hover{background:var(--bg);color:var(--fg)}.t-rename{flex:1;min-width:0;height:24px;font-size:var(--fs-m);border:1px solid var(--accent);border-radius:var(--r-s);padding:0 6px;background:var(--bg)}.sb-empty{padding:20px 12px;text-align:center;color:var(--muted);font-size:var(--fs-s)}.sb-start{padding:28px 12px;text-align:center}.sb-start-t{font-size:var(--fs-m);font-weight:500}.sb-start-s{margin:4px 0 12px;font-size:var(--fs-s);color:var(--muted)}.rs{width:5px;flex:none;cursor:col-resize;position:relative}.rs:after{content:"";position:absolute;inset:0}.rs:hover:after,.rs.drag:after{background:color-mix(in oklab,var(--accent) 30%,transparent)}.rs-l{margin-left:-3px}.rs-r{margin-right:-3px}body.col-drag{cursor:col-resize;user-select:none}body.col-drag iframe,body.col-drag .xterm{pointer-events:none}.scrim{position:fixed;inset:0;z-index:45;background:#00000052;display:none}.scrim.show{display:block}.main{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--bg);position:relative}.topbar{height:40px;flex:none;display:flex;align-items:center;gap:6px;padding:0 10px;border-bottom:1px solid var(--line)}.tb-menu-btn{display:none}.tb-crumb{flex:none;max-width:26%;font-size:var(--fs-m);color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tb-sep{flex:none;color:var(--muted)}.tb-title{font-size:var(--fs-l);font-weight:500;max-width:40%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-radius:var(--r-s);padding:2px 6px;cursor:text}.tb-title:hover{background:var(--surface)}.tb-title.ghost{color:var(--muted);cursor:default}.tb-title.ghost:hover{background:none}.tb-rename{font-size:var(--fs-l);font-weight:500;border:1px solid var(--accent);border-radius:var(--r-s);padding:1px 6px;background:var(--bg);width:300px;max-width:46vw}.tb-pill{flex:none;display:inline-flex;align-items:center;gap:6px;height:22px;padding:0 9px;border-radius:var(--r-full);font-size:var(--fs-s);background:var(--surface);color:var(--muted)}.tb-pill.run{background:var(--run-bg);color:var(--run-fg)}.tb-pill-dot{width:7px;height:7px;border-radius:50%;background:var(--accent-2);box-shadow:0 0 0 3px color-mix(in oklab,var(--accent-2) 20%,transparent);animation:breathe 1.6s infinite}.tb-pill.wait{color:var(--warn)}.tb-pill.err{color:var(--danger)}.tb-right{margin-left:auto;display:flex;align-items:center;gap:2px}.tb-model{font-size:var(--fs-s);color:var(--muted);margin-right:4px;white-space:nowrap;max-width:160px;overflow:hidden;text-overflow:ellipsis}.connbar{flex:none;height:26px;display:flex;align-items:center;justify-content:center;font-size:var(--fs-s);background:color-mix(in oklab,var(--warn) 14%,var(--bg));color:var(--warn)}.scroll{flex:1;overflow-y:auto;overscroll-behavior:contain;position:relative}.tl-wrap{max-width:calc(var(--col) + 40px);min-width:0;margin:0 auto;padding:24px 20px 16px}.jump{position:absolute;right:24px;bottom:150px;width:34px;height:34px;border-radius:50%;background:var(--bg);box-shadow:var(--shadow-pop);display:flex;align-items:center;justify-content:center;color:var(--muted);z-index:5}.jump:hover{color:var(--fg)}.jump .jd{position:absolute;top:4px;right:4px;width:7px;height:7px;border-radius:50%;background:var(--accent)}.panel{width:var(--pn-w, 440px);flex:none;display:flex;flex-direction:column;background:var(--bg);border-left:1px solid var(--line)}.pn-head{flex:none;display:flex;align-items:center;gap:2px;height:40px;padding:0 6px;border-bottom:1px solid var(--line)}.pn-tabs{display:flex;gap:2px}.pn-tab{height:28px;padding:0 10px;border-radius:var(--r-s);font-size:var(--fs-m);color:var(--muted);display:inline-flex;align-items:center;gap:6px}.pn-tab:hover{background:var(--surface-hover);color:var(--fg)}.pn-tab.on{background:var(--surface-hover);color:var(--fg);font-weight:500}.pn-body{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.pn-close{margin-left:auto}.pn-empty{padding:20px;color:var(--muted);font-size:var(--fs-m);text-align:center}.pn-empty-sub{margin-top:6px;font-size:var(--fs-s);opacity:.8}.chg-head{flex:none;display:flex;align-items:center;gap:6px;height:34px;padding:0 8px;border-bottom:1px solid var(--line);font-size:var(--fs-m)}.chg-branch{display:inline-flex;align-items:center;gap:5px;color:var(--muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chg-head .ibtn{margin-left:auto}.chg-list{flex:none;max-height:40%;overflow-y:auto;border-bottom:1px solid var(--line)}.chg-list:empty{border-bottom:none}.chg-row{display:flex;align-items:center;gap:7px;padding:4px 8px;cursor:pointer;font-size:var(--fs-m);min-height:28px}.chg-row:hover,.chg-row.on{background:var(--surface-hover)}.chg-kind{flex:none;width:18px;height:18px;border-radius:var(--r-s);font-size:10px;display:inline-flex;align-items:center;justify-content:center;background:var(--surface);color:var(--muted)}.chg-kind.k-modified{color:var(--warn, #b45309)}.chg-kind.k-added,.chg-kind.k-untracked{color:var(--ok, #15803d)}.chg-kind.k-deleted{color:var(--danger)}.chg-kind.k-renamed{color:var(--accent)}.chg-path{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left}.chg-stat{flex:none;font-style:normal;font-size:var(--fs-s);font-variant-numeric:tabular-nums}.chg-stat .add{color:var(--ok, #15803d);font-style:normal}.chg-stat .del{color:var(--danger);font-style:normal}.chg-discard{flex:none;opacity:0}.chg-row:hover .chg-discard{opacity:1}.chg-diff{flex:1;min-height:0;overflow:auto}.ft-crumbs{flex:none;display:flex;align-items:center;gap:4px;min-height:34px;padding:0 8px;border-bottom:1px solid var(--line);font-size:var(--fs-m);overflow-x:auto;white-space:nowrap}.ft-crumb{color:var(--muted);font-size:var(--fs-m);padding:2px 4px;border-radius:var(--r-s)}.ft-crumb:hover{background:var(--surface-hover);color:var(--fg)}.ft-crumb-t{color:var(--fg)}.ft-crumb-t.muted{color:var(--muted)}.ft-tree{flex:none;max-height:45%;overflow-y:auto;padding:4px 0}.ft-row{display:flex;align-items:center;gap:5px;padding:3px 8px;cursor:pointer;font-size:var(--fs-m);min-height:24px}.ft-row:hover,.ft-row.on{background:var(--surface-hover)}.ft-row .caret{font-size:11px;color:var(--muted);display:inline-block;transition:transform var(--dur-1) var(--ease)}.ft-row .caret.open{transform:rotate(90deg)}.ft-dot{width:13px;flex:none}.ft-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ft-err{color:var(--danger);font-size:var(--fs-s);padding:2px 0}.ft-view{flex:1;min-height:0;overflow:auto;border-top:1px solid var(--line)}.ft-pre{margin:0;padding:10px 12px;font-family:var(--font-mono);font-size:var(--fs-s);line-height:1.55}.ft-pre code{background:none;padding:0;display:block;white-space:pre}.tm-tabs{flex:none;display:flex;align-items:center;gap:2px;padding:4px 6px;border-bottom:1px solid var(--line);overflow-x:auto}.tm-tab{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 6px 0 10px;border-radius:var(--r-s);font-size:var(--fs-m);color:var(--muted);white-space:nowrap}.tm-tab:hover,.tm-tab.on{background:var(--surface-hover);color:var(--fg)}.tm-x{color:var(--muted);padding:0 3px;border-radius:3px}.tm-x:hover{color:var(--danger);background:var(--surface-hover)}.tm-note{flex:none;padding:4px 10px;font-size:var(--fs-s);color:var(--warn);background:color-mix(in oklab,var(--warn) 10%,var(--bg));border-bottom:1px solid var(--line)}.tm-body{flex:1;min-height:0;position:relative;background:var(--term-bg)}.tm-view{position:absolute;inset:0;padding:6px 8px;background:var(--term-bg)}.tm-view .xterm{height:100%}.tm-view .xterm-viewport{background:var(--term-bg)!important}.tm-view .xterm-screen{padding:2px 0}.imp-list{max-height:320px;overflow-y:auto;display:flex;flex-direction:column;gap:2px}.imp-row{display:flex;align-items:center;gap:8px;padding:5px 6px;border-radius:var(--r-s);font-size:var(--fs-m);cursor:pointer}.imp-row:hover{background:var(--surface-hover)}.imp-row.done{opacity:.55;cursor:default}.imp-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.imp-meta{flex:none;color:var(--muted);font-size:var(--fs-s)}.info-grid{display:flex;flex-direction:column;gap:2px}.info-row{display:flex;align-items:center;gap:10px;padding:3px 2px;font-size:var(--fs-m)}.info-k{flex:none;width:74px;color:var(--muted)}.info-v{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--fs-s)}@media(min-width:760px){.sidebar.w-hide{display:none}.sidebar.w-hide+.rs-l{display:none}}@media(min-width:900px){.panel.w-hide{display:none}}@media(max-width:899px){.panel{position:fixed;right:0;top:0;bottom:0;z-index:46;width:min(var(--pn-w, 440px),92vw);transform:translate(100%);transition:transform var(--dur-2) var(--ease);box-shadow:var(--shadow-pop)}.panel.open{transform:none}.rs-r{display:none}}@media(max-width:759px){.sidebar{position:fixed;left:0;top:0;bottom:0;z-index:46;width:min(var(--sb-w, 248px),84vw);transform:translate(-100%);transition:transform var(--dur-2) var(--ease);box-shadow:var(--shadow-pop)}.sidebar.open{transform:none}.sidebar~.rs-l{display:none}.tb-menu-btn{display:inline-flex}.tl-wrap{padding:16px 14px 8px}.tb-model{display:none}}.dlg.cpal{width:520px;padding:6px}.cpal-in{width:100%;height:36px;padding:0 12px;border:0;background:none;outline:none;font-size:var(--fs-l);color:var(--fg)}.cpal-list{max-height:46vh;overflow-y:auto;padding:4px}.cpal-item{display:flex;align-items:center;gap:8px;width:100%;height:30px;padding:0 10px;border-radius:var(--r-s);text-align:left;font-size:var(--fs-m)}.cpal-item.on{background:var(--surface-hover)}.cpal-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cpal-hint{flex:none;font-size:var(--fs-s);color:var(--muted)}.um-row{display:flex;flex-direction:column;align-items:flex-end;margin:4px 0 16px}.um{position:relative;max-width:78%;background:var(--accent-soft);border-radius:14px 14px 4px;color:var(--fg);padding:6px 12px;font-size:var(--fs-l);line-height:1.6;white-space:pre-wrap;word-break:normal;overflow-wrap:break-word}.um:hover .um-act{display:flex}.um-act{position:absolute;left:-62px;top:4px;display:none;gap:2px}.um-act .ibtn{width:24px;height:24px}.um-img{display:block;max-width:200px;max-height:140px;border-radius:var(--r-s);margin-bottom:6px;cursor:zoom-in}.um-tag{font-size:var(--fs-s);color:var(--muted);margin-top:2px}.as{margin:4px 0}.md.streaming:after{content:"\258d";color:var(--accent);animation:breathe 1s infinite}.md{font-size:var(--fs-l);line-height:1.75;color:var(--text);word-break:normal;overflow-wrap:break-word}.md p{margin:0 0 8px}.md>:last-child{margin-bottom:0}.md a{color:var(--accent);text-decoration:underline;text-underline-offset:2px;text-decoration-color:color-mix(in oklab,var(--accent) 40%,transparent)}.md a:hover{text-decoration:underline}.md pre{position:relative;background:var(--code-bg);border:1px solid var(--code-line);border-radius:var(--r-m);padding:10px 12px;overflow-x:auto;font-family:var(--font-mono);font-size:var(--fs-s);line-height:1.55}.md code{font-family:var(--font-mono);font-size:12.5px;background:var(--code-bg);color:var(--code-fg);padding:1px 5px;border-radius:4px;border:1px solid var(--code-line)}.md pre code{background:none;padding:0;border:0;color:inherit}.md ul,.md ol{margin:6px 0;padding-left:22px}.md h1,.md h2,.md h3,.md h4{margin:12px 0 6px;font-size:var(--fs-l);font-weight:600}.md blockquote{margin:6px 0;padding-left:12px;border-left:3px solid var(--line);color:var(--muted)}.md table{border-collapse:collapse;margin:8px 0}.md th,.md td{border:1px solid var(--line);padding:4px 10px;font-size:var(--fs-s)}.cb-copy{position:absolute;top:6px;right:6px;font-size:var(--fs-s);color:var(--muted);padding:2px 8px;border-radius:var(--r-s);background:var(--bg);opacity:0;transition:opacity var(--dur-1)}.md pre:hover .cb-copy{opacity:1}.cb-copy:hover{color:var(--fg)}.rs-item{margin:4px 0 6px}.rs-head{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0;color:var(--meta);font-size:var(--fs-s)}.rs-head:hover{color:var(--fg)}.rs-head .caret{display:inline-block;transition:transform var(--dur-1)}.rs-head .caret.open{transform:rotate(90deg)}.rs-body{margin:2px 0 6px 5px;padding-left:12px;border-left:1px solid var(--line);color:var(--muted);font-size:var(--fs-s);line-height:1.65;white-space:pre-wrap}.todo-list{margin:2px 0 6px 5px;padding-left:12px;border-left:1px solid var(--line);list-style:none;font-size:var(--fs-s)}.todo{color:var(--muted)}.todo.in_progress{color:var(--fg)}.tg{margin:4px 0 10px}.tg-head{display:flex;align-items:center;gap:6px;width:100%;height:24px;padding:0;color:var(--meta);font-size:var(--fs-s);text-align:left}.tg-head:hover{color:var(--fg)}.tg-head .caret{transition:transform var(--dur-1)}.tg-head .caret.open{transform:rotate(90deg)}.tg-live{margin-left:auto;color:var(--accent);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.tg-list{margin:2px 0 0 5px;border-left:1px solid var(--line);padding-left:6px}.ts-head{display:flex;align-items:center;gap:8px;width:100%;height:26px;padding:0 6px;border-radius:var(--r-s);font-size:12.5px;text-align:left;color:var(--text)}.ts-head:hover{background:var(--surface-hover)}.ts-ic{width:14px;flex:none;text-align:center}.ts-ic.ok{color:var(--ok)}.ts-ic.fail{color:var(--danger)}.ts-ic.run{color:var(--accent-2);animation:breathe 1.2s infinite}.ts-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ts-meta{flex:none;color:var(--meta);font-variant-numeric:tabular-nums}.ts-meta.err{color:var(--danger)}.ts-out{margin:2px 8px 6px 30px}.ts-out pre{background:var(--code-bg);border-radius:var(--r-s);padding:8px 10px;font-family:var(--font-mono);font-size:var(--fs-s);line-height:1.5;overflow-x:auto;white-space:pre-wrap;word-break:break-all;margin:0}.ts-more{font-size:var(--fs-s);color:var(--accent);margin-bottom:4px}.diff{margin:2px 6px 6px 22px;border:1px solid var(--line);border-radius:var(--r-m);overflow:hidden}.diff-path{padding:4px 10px;font-size:var(--fs-s);color:var(--muted);background:var(--surface);border-bottom:1px solid var(--line);font-family:var(--font-mono)}.diff-pre{margin:0;padding:6px 0;font-family:var(--font-mono);font-size:var(--fs-s);line-height:1.5;overflow-x:auto}.dh-head{display:block;color:var(--muted);padding:0 10px}.dl{display:block;padding:0 10px;white-space:pre-wrap;word-break:break-all}.dl.add{background:var(--add-bg)}.dl.del{background:var(--del-bg)}.card{margin:8px 0;border-radius:10px;padding:12px 14px}.card.plan{border:1px solid var(--line)}.card.perm{border:1px solid color-mix(in oklab,var(--warn) 30%,var(--bg));background:color-mix(in oklab,var(--warn) 3%,var(--bg))}.card.perm.done{border-color:var(--line);opacity:.75}.card.ask{border:1px solid color-mix(in oklab,var(--info) 45%,var(--bg))}.card.ask.done{border-color:var(--line);opacity:.75}.err-card{border:1px solid color-mix(in oklab,var(--danger) 45%,var(--bg))}.err-line{color:var(--danger);font-size:var(--fs-m)}.perm-title{font-size:var(--fs-m);font-weight:500}.perm-cmd{margin:8px 0 0;background:var(--code-bg);border-radius:var(--r-s);padding:8px 10px;font-family:var(--font-mono);font-size:var(--fs-s);white-space:pre-wrap;word-break:break-all}.perm-path{margin-top:6px;font-family:var(--font-mono);font-size:var(--fs-s);color:var(--muted)}.perm-btns{display:flex;gap:8px;margin-top:10px}.perm-done{margin-top:8px;font-size:var(--fs-s);color:var(--muted)}.ask-q{margin-bottom:10px}.ask-t{font-size:var(--fs-m);font-weight:500;margin-bottom:6px}.ask-opts{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}.ask-free,.ask .btn.primary{margin-top:4px}.nt{margin:8px 0;text-align:center;font-size:var(--fs-s);color:var(--muted)}.nt.warn{color:var(--warn)}.nt.error{color:var(--danger)}.te{display:flex;justify-content:flex-start;align-items:center;gap:2px;margin:4px 0 18px -6px;font-size:var(--fs-s);color:var(--meta)}.te-meta{padding:0 6px;font-variant-numeric:tabular-nums}.te-act{height:24px;min-width:24px;display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:0 5px;border-radius:var(--r-s);color:var(--meta)}.te-act span{display:none}.te-act:hover{background:var(--surface-hover);color:var(--fg)}.te-files{color:var(--accent);font-size:var(--fs-s);margin-left:6px}.te-files:hover{text-decoration:underline}.empty-wrap{min-height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:14vh}.cp-hero-t{font-size:var(--fs-hero);font-weight:600}.cp-hero-s{margin-top:6px;font-size:var(--fs-s);color:var(--muted)}.empty-actions{margin-top:16px}.workspace-empty{padding-bottom:10vh}.q-list{max-width:var(--col);margin:0 auto 6px;display:flex;flex-direction:column;gap:4px}.q-item{display:flex;align-items:center;gap:8px;padding:4px 10px;background:var(--surface);border-radius:var(--r-s);font-size:var(--fs-s)}.q-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.q-item .ibtn{width:20px;height:20px}.composer{flex:none;padding:0 16px 16px}.cp-card{width:100%;max-width:var(--col);margin:0 auto;background:var(--bg);border-radius:14px;border:1px solid var(--cp-line);padding:12px 12px 8px 14px;box-shadow:0 1px 2px #0000000a;transition:border-color var(--dur-2) var(--ease),box-shadow var(--dur-2) var(--ease)}.cp-card:focus-within{border-color:var(--cp-focus);box-shadow:0 0 0 3px var(--cp-ring),0 1px 2px #0000000a}.cp-card.waiting{border-color:color-mix(in oklab,var(--warn) 45%,var(--bg))}.cp-card.danger{border-color:color-mix(in oklab,var(--danger) 40%,var(--bg))}.cp-danger{max-width:var(--col);margin:0 auto 6px;display:flex;align-items:center;gap:6px;color:var(--danger);font-size:var(--fs-s);padding:0 2px}.cp-hint{max-width:var(--col);margin:6px auto 0;font-size:11.5px;color:var(--meta);text-align:center}.att-note{padding:6px 10px 0;color:var(--muted);font-size:var(--fs-s)}.cp-ta-wrap{position:relative}.slash-pop{position:absolute;left:0;right:0;bottom:100%;margin-bottom:6px;max-height:min(240px,40vh);overflow:hidden;display:flex;flex-direction:column;z-index:20}.slash-pop .ap-scroll{max-height:inherit}.slash-pop .slash-h{padding:4px 10px 2px;font-size:var(--fs-xs);color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.slash-pop .mi.slash-item{height:auto;min-height:28px;padding:4px 10px;flex-direction:column;align-items:flex-start;gap:0}.slash-pop .slash-name{font-weight:500}.slash-pop .slash-desc{font-size:var(--fs-xs);color:var(--muted);line-height:1.3}.slash-pop .slash-hint{font-size:var(--fs-xs);color:var(--muted);font-family:var(--mono, monospace)}.slash-pop .mi.slash-item.sel{background:var(--surface-hover)}.cp-ta{width:100%;border:0;resize:none;background:none;outline:none;color:var(--text);font-size:var(--fs-l);line-height:22px;min-height:34px;max-height:264px;overflow-y:auto;display:block;padding:0}.cp-ta::placeholder{color:var(--meta)}.cp-bar{display:flex;align-items:center;flex-wrap:wrap;gap:2px;margin:4px 0 0 -6px;min-width:0}.pill-wrap{position:relative;flex:0 1 auto;min-width:0;max-width:100%}.pill{position:relative;display:inline-flex;align-items:center;gap:5px;height:26px;padding:0 8px;border-radius:7px;background:none;color:var(--pill-fg, var(--muted));border:1px solid transparent;font-size:var(--fs-s);max-width:min(240px,100%);min-width:0;white-space:nowrap;cursor:pointer;transition:background var(--dur-1)}.pill:hover{background:var(--surface-hover)}.pill svg{flex:none}.pill.chip{background:var(--chip-bg);border-color:var(--chip-line);padding:0 8px 0 4px;gap:6px;max-width:min(300px,100%)}.pill.chip:hover{background:var(--surface-hover)}.chip-logo{border-radius:5px}.chip-caret{color:var(--meta)}.pill .p-a{font-weight:500;color:var(--fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:0 0 auto;max-width:120px}.pill .p-t{color:var(--meta);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1 1 auto}.pill .p-t:before{content:"\b7";margin-right:5px}.ipill .ip-l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.ipill:focus-visible{outline:2px solid color-mix(in oklab,var(--accent) 45%,var(--bg));outline-offset:-1px}.ipill[aria-expanded=true]{background:var(--surface-hover)}.ipill.danger{color:var(--danger)}.mode-menu{max-width:300px}.cp-div{width:1px;height:14px;background:var(--line);margin:0 4px;flex:none}.cp-bar>.ibtn{flex:none}.cp-attach{color:var(--pill-fg, var(--muted))}.cp-card{container-type:inline-size;container-name:composer}@container composer (max-width: 520px){.pill .p-t{display:none}.pill{max-width:min(160px,100%)}.ipill .ip-l{max-width:64px}}@container composer (max-width: 380px){.pill{max-width:min(120px,100%);padding:0 6px}.ipill .ip-l{display:none}}.pop{position:absolute;bottom:32px;left:0;z-index:55;width:260px;background:var(--bg);border-radius:var(--r-m);box-shadow:var(--shadow-pop);padding:4px;max-height:60vh;overflow-y:auto}.agent-picker{width:min(300px,calc(100vw - 32px));padding:0;overflow:hidden;display:flex;flex-direction:column;max-height:min(420px,60vh)}.agent-picker .ap-search{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--line);flex:none;color:var(--muted)}.agent-picker .ap-search-in{flex:1;min-width:0;border:0;background:none;outline:none;font-size:var(--fs-s);color:var(--fg)}.agent-picker .ap-search-in::placeholder{color:var(--muted)}.agent-picker .ap-scroll{overflow-y:auto;padding:4px;flex:1;min-height:0}.agent-picker .ap-empty{padding:12px 10px;font-size:var(--fs-s);color:var(--muted);text-align:center}.agent-picker .ap-back{font-weight:600;margin-bottom:2px}.agent-picker .ap-back-icon{display:inline-flex;transform:rotate(180deg);margin-right:2px}.agent-picker .mi-row{display:flex;align-items:center;gap:6px;width:100%;text-align:left}.agent-picker .provider-pick-row{justify-content:space-between;gap:8px}.agent-picker .provider-pick-name{flex:0 1 auto;min-width:5.5rem;max-width:58%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;color:inherit}.agent-picker .provider-pick-meta{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:flex-end;gap:6px;min-width:0;margin-left:auto}.agent-picker .provider-pick-meta .dlg-hint{flex:none;font-size:10px;max-width:5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-picker .mi-row .mi-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-picker .mi-row .mi-sub{flex:none;max-width:38%;font-size:11px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-picker .model-pick-row{min-width:0}.agent-picker .model-pick-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-picker .model-pick-default{flex:0 1 58%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-picker .mi-meta{flex:none;font-size:11px;color:var(--muted);white-space:nowrap}.agent-picker .mi-tag{flex:none;font-size:10px;color:var(--accent)}.agent-picker .mi-caret{flex:none;color:var(--muted);display:inline-flex}.agent-picker .mi-check{flex:none;margin-left:auto;color:var(--accent)}.ap-sec{padding:4px 0}.ap-sec .tinput{height:26px;margin-bottom:4px}.ap-sec .mi{height:26px;font-size:var(--fs-s)}.att-bar{display:flex;flex-wrap:wrap;gap:6px;padding:0 0 6px}.att{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 8px;background:var(--surface-hover);border-radius:var(--r-s);font-size:var(--fs-s)}.att img{width:22px;height:22px;object-fit:cover;border-radius:4px}.att.up{opacity:.6}.att-name{max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.att-x{color:var(--muted);font-size:14px;line-height:1}.att-x:hover{color:var(--fg)}.cp-right{margin-left:auto;flex:none;display:flex;align-items:center;gap:8px}.cp-clock{font-size:var(--fs-s);color:var(--meta);font-variant-numeric:tabular-nums}.cp-send,.cp-stop{width:30px;height:30px;border-radius:50%;flex:none;display:inline-flex;align-items:center;justify-content:center;transition:filter var(--dur-1),opacity var(--dur-1)}.cp-send{background:var(--accent);color:var(--accent-fg)}.cp-send:hover{filter:brightness(1.08)}.cp-send[disabled]{opacity:.35;cursor:default;filter:none}.cp-stop{background:var(--fg);color:var(--bg)}.cp-stop:hover{filter:brightness(1.15)}@media(max-width:560px){.composer{padding:0 10px 10px}}.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;inset:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;inset:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}
|
|
1
|
+
:root{--own-bg: #ffffff;--own-sb: #f8f8f7;--own-fg: #1f1f1f;--own-muted: #737373;--own-line: #ececec;--bg: var(--own-bg);--sb-bg: var(--own-sb);--fg: var(--own-fg);--muted: var(--own-muted);--line: var(--own-line);--meta: #a3a3a3;--text: #262626;--accent: #262626;--accent-2: #525252;--accent-fg: #ffffff;--accent-soft: #f0f0f0;--surface: color-mix(in oklab, var(--fg) 3%, var(--bg));--surface-hover: color-mix(in oklab, var(--fg) 6%, var(--bg));--chip-bg: #f4f5f5;--chip-line: #ececec;--pill-fg: #525252;--search-bg: #efefee;--tile-bg: color-mix(in oklab, var(--fg) 90%, var(--bg));--tile-fg: var(--bg);--badge-bg: color-mix(in oklab, var(--fg) 7%, var(--bg));--badge-fg: color-mix(in oklab, var(--fg) 80%, var(--bg));--run-bg: #f0f0f0;--run-fg: #404040;--cp-line: color-mix(in oklab, var(--fg) 11%, var(--bg));--cp-focus: #a3a3a3;--cp-ring: rgb(0 0 0 / .06);--active-bg: #ffffff;--active-line: #e6e6e6;--ok: #16a34a;--warn: #d97706;--danger: #dc2626;--info: #2563eb;--code-bg: #f4f5f5;--code-line: #eaeceb;--code-fg: #404040;--add-bg: #ecfdf3;--del-bg: #fef2f2;--r-s: 6px;--r-m: 8px;--r-l: 12px;--r-full: 999px;--font-ui: var(--magpie-font, "Segoe UI Variable Text", "Segoe UI", -apple-system, "PingFang SC", "Microsoft YaHei UI", system-ui, sans-serif);--font-mono: var(--magpie-code, "Cascadia Code", "Cascadia Mono", "JetBrains Mono", ui-monospace, Consolas, monospace);--fs-xs: 11px;--fs-s: 12px;--fs-m: 13px;--fs-l: 14px;--fs-hero: 18px;--lh: 1.6;--col: 720px;--chat-fs: 13px;--chat-fs-s: max(12px, calc(var(--chat-fs) - 1px));--chat-code-fs: max(11.5px, calc(var(--chat-fs) - 1px));--chat-lh: 1.7;--row: 26px;--shadow-pop: 0 8px 24px -6px rgb(0 0 0 / .16), 0 0 0 1px var(--line);--term-bg: #ffffff;--term-fg: #1e1e1e;--ease: cubic-bezier(.2,.7,.2,1);--dur-1: .12s;--dur-2: .2s;color-scheme:light}:root[data-theme=dark]{--own-bg: #1a1a1a;--own-sb: #151515;--own-fg: #ececec;--own-muted: #9b9b9b;--own-line: #2c2c2c;--meta: #7c7c7c;--text: #e2e2e2;--accent: #e5e5e5;--accent-2: #b3b3b3;--accent-fg: #171717;--accent-soft: #2e2e2e;--chip-bg: #252727;--chip-line: #323434;--pill-fg: #bdbdbd;--search-bg: #242424;--run-bg: #2e2e2e;--run-fg: #d4d4d4;--cp-focus: #6b6b6b;--cp-ring: rgb(255 255 255 / .07);--active-bg: #242424;--active-line: #333333;--info: #60a5fa;--code-bg: #232323;--code-line: #303030;--code-fg: #d4d4d4;--add-bg: rgb(22 163 74 / .16);--del-bg: rgb(220 38 38 / .16);--shadow-pop: 0 8px 24px -6px rgb(0 0 0 / .5), 0 0 0 1px var(--line);--term-bg: #0c0c0c;--term-fg: #cccccc;color-scheme:dark}:root[data-host-colors]{--bg: var(--magpie-card, var(--magpie-bg, var(--own-bg)));--sb-bg: var(--magpie-bg, var(--own-sb));--fg: var(--magpie-fg, var(--own-fg));--muted: var(--magpie-muted, var(--own-muted));--line: var(--magpie-line, var(--own-line))}@layer reset{html,body{margin:0;padding:0;height:100%}body{background:var(--bg);color:var(--fg);font-family:var(--font-ui);font-size:var(--fs-m);line-height:var(--lh);-webkit-font-smoothing:antialiased}*{box-sizing:border-box}#root{height:100%}button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}input,textarea{font:inherit;color:inherit}a{color:var(--accent)}:focus-visible{outline:2px solid color-mix(in oklab,var(--accent) 55%,var(--bg));outline-offset:-1px}}*{scrollbar-width:thin;scrollbar-color:color-mix(in oklab,var(--fg) 18%,transparent) transparent}*::-webkit-scrollbar{width:8px;height:8px}*::-webkit-scrollbar-thumb{background:color-mix(in oklab,var(--fg) 18%,transparent);border-radius:4px}*::-webkit-scrollbar-thumb:hover{background:color-mix(in oklab,var(--fg) 30%,transparent)}*::-webkit-scrollbar-track{background:transparent}.ibtn{width:28px;height:28px;flex:none;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--r-s);color:var(--muted);transition:background var(--dur-1),color var(--dur-1)}.ibtn:hover{background:var(--surface-hover);color:var(--fg)}.ibtn[disabled]{opacity:.35;cursor:default}.ibtn.on{color:var(--accent)}.ibtn svg{width:16px;height:16px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:30px;padding:0 14px;border-radius:var(--r-s);font-size:var(--fs-m);background:var(--surface-hover);color:var(--fg);transition:background var(--dur-1),filter var(--dur-1)}.btn:hover{filter:brightness(1.03)}.btn[disabled]{opacity:.4;cursor:default}.btn.primary{background:var(--accent);color:var(--accent-fg)}.btn.primary:hover{filter:brightness(1.08)}.btn.danger{color:var(--danger)}.btn.ghost{background:none}.btn.ghost:hover{background:var(--surface-hover)}.tinput{width:100%;height:30px;padding:0 10px;border:1px solid var(--line);border-radius:var(--r-s);background:var(--bg);font-size:var(--fs-m);outline:none}.tinput:focus{border-color:color-mix(in oklab,var(--accent) 55%,var(--bg))}.tinput.err{border-color:var(--danger)}.tinput::placeholder{color:var(--muted)}textarea.tinput{height:auto;min-height:60px;padding:6px 10px;resize:vertical}.menu{position:fixed;z-index:60;min-width:160px;max-width:280px;background:var(--bg);border-radius:var(--r-m);box-shadow:var(--shadow-pop);padding:4px;font-size:var(--fs-m)}.mi{display:flex;align-items:center;gap:8px;width:100%;height:28px;padding:0 10px;border-radius:var(--r-s);text-align:left;color:var(--fg)}.mi:hover:not([disabled]){background:var(--surface-hover)}.mi[disabled]{color:var(--muted);cursor:default}.mi.danger{color:var(--danger)}.mi .mi-check{margin-left:auto;color:var(--accent)}.msep{height:1px;margin:4px 6px;background:var(--line)}.mlabel{padding:6px 10px 2px;font-size:var(--fs-s);color:var(--muted)}.dlg-scrim{position:fixed;inset:0;z-index:70;background:#00000052;display:flex;align-items:center;justify-content:center;padding:24px}.dlg{width:440px;max-width:100%;max-height:80vh;display:flex;flex-direction:column;background:var(--bg);border-radius:var(--r-l);box-shadow:var(--shadow-pop)}.dlg-title{flex:none;padding:14px 16px 4px;font-size:var(--fs-l);font-weight:600}.dlg-body{flex:1;min-height:0;overflow-y:auto;padding:8px 16px}.dlg-foot{flex:none;display:flex;justify-content:flex-end;gap:8px;padding:10px 16px 14px}.dlg-row{margin:10px 0}.dlg-row-top{align-items:flex-start}.dlg-row>label{display:block;margin-bottom:4px;font-size:var(--fs-s);color:var(--muted)}.provider-list{display:flex;flex-direction:column;gap:6px;width:100%;max-height:280px;overflow:auto}.provider-list{display:flex;flex-direction:column;gap:6px;flex:1;min-width:0}.provider-redetect{align-self:flex-start;margin-bottom:4px}.provider-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;padding:6px 8px;border-radius:var(--r-m);background:var(--bg-2)}.provider-row.open{padding-bottom:10px}.provider-head{display:flex;align-items:center;gap:10px;flex:1;min-width:0;border:0;background:none;text-align:left;cursor:pointer;color:inherit;padding:0}.provider-detail{flex:1 1 100%;display:flex;flex-direction:column;gap:6px;padding:4px 0 0 28px}.provider-hint-row{display:flex;gap:8px;align-items:flex-start;flex-wrap:wrap}.btn.sm{font-size:var(--fs-s);padding:4px 10px;height:auto}.provider-meta{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.provider-name{font-size:var(--fs-m);font-weight:500}.provider-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.provider-dot-on{background:var(--ok, #3ecf8e)}.provider-dot-off{background:var(--muted);opacity:.5}.provider-dot-pending{background:var(--warn, #e6a817)}.provider-switch input{width:16px;height:16px;cursor:pointer}.dlg-hint{font-size:var(--fs-s);color:var(--muted)}.dlg-hint.err{color:var(--danger)}.bash-set{display:flex;flex-direction:column;gap:4px;min-width:0}.bash-row{display:flex;gap:8px;align-items:center}.bash-row .tinput{flex:1;min-width:0;font-family:var(--font-mono)}.toasts{position:fixed;left:50%;bottom:24px;transform:translate(-50%);z-index:80;display:flex;flex-direction:column;gap:8px;align-items:center}.toast{max-width:480px;padding:8px 14px;border-radius:var(--r-m);background:var(--fg);color:var(--bg);font-size:var(--fs-m);box-shadow:var(--shadow-pop);animation:toast-in var(--dur-2) var(--ease)}.toast.err{background:var(--danger);color:#fff}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}}.dot{width:6px;height:6px;border-radius:50%;flex:none;background:var(--muted)}.dot.run{background:var(--accent-2);animation:breathe 1.6s infinite}.dot.err{background:var(--danger)}.dot.wait{background:var(--warn);animation:breathe 1.6s infinite}@keyframes breathe{50%{opacity:.35}}.boot-screen{height:100%;display:flex;align-items:center;justify-content:center;gap:8px;color:var(--muted);font-size:var(--fs-m)}.boot-screen .btn{margin-top:12px}.boot-wrap{display:flex;flex-direction:column;align-items:center}.boot-dot{width:8px;height:8px;border-radius:50%;background:var(--muted)}.boot-dot[data-state=open]{background:var(--ok)}.boot-dot[data-state=reconnecting]{background:var(--warn)}.boot-dot[data-state=down]{background:var(--danger)}.vh{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}.menu.select-menu{z-index:80;overflow-y:auto;outline:none;max-width:320px}.sm-opt{cursor:pointer;user-select:none;height:auto;min-height:28px;padding:4px 8px 4px 10px}.sm-opt.on{background:var(--surface-hover)}.sm-opt.off{color:var(--muted);cursor:default}.sm-opt.off:hover{background:none}.sm-text{display:flex;flex-direction:column;min-width:0;flex:1 1 auto}.sm-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm-label>svg{vertical-align:-2px;margin-right:5px}.sm-hint{font-size:var(--fs-s);color:var(--muted);white-space:normal;line-height:1.4}.sm-check{flex:none;width:14px;display:inline-flex;color:var(--accent)}.sm-opt[aria-selected=true] .sm-label{font-weight:500}.tinput.sm-field{display:flex;align-items:center;text-align:left;padding-right:26px;cursor:pointer;position:relative;color:var(--fg);background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%);background-position:calc(100% - 14px) 50%,calc(100% - 10px) 50%;background-size:4px 4px;background-repeat:no-repeat}.tinput.sm-field[aria-expanded=true]{border-color:color-mix(in oklab,var(--accent) 55%,var(--bg))}.sm-field .sm-val{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.app{display:flex;height:100vh;min-width:480px;overflow:hidden}.sidebar{width:var(--sb-w, 248px);flex:none;display:flex;flex-direction:column;background:var(--sb-bg);border-right:1px solid var(--line)}.sb-row{display:flex;align-items:center;gap:2px;height:40px;padding:8px 8px 4px;flex:none}.sb-row-search{height:36px;padding:0 8px 4px}.sb-new{flex:1;display:flex;align-items:center;gap:8px;height:28px;min-width:0;padding:0 8px 0 5px;border-radius:var(--r-s);font-size:var(--fs-m);font-weight:500;text-align:left;transition:background var(--dur-1);white-space:nowrap;overflow:hidden}.sb-new-tile{width:18px;height:18px;flex:none;border-radius:5px;background:var(--tile-bg);color:var(--tile-fg);display:inline-flex;align-items:center;justify-content:center}.sb-new-tile svg{stroke-width:2.2}.sb-new:hover{background:var(--surface-hover)}.sb-row .ibtn{width:28px;height:28px}.sb-search{flex:1;display:flex;align-items:center;gap:6px;height:28px;padding:0 8px;border-radius:var(--r-s);background:var(--search-bg);color:var(--meta)}.sb-search input::placeholder{color:var(--meta)}.sb-search input{flex:1;min-width:0;border:0;background:none;font-size:var(--fs-s);outline:none;color:var(--fg)}.sb-list{flex:1;overflow-y:auto;padding:0 8px 8px}.pj-group{margin-top:2px}.pj{display:flex;align-items:center;gap:2px;height:var(--row);padding:0 4px 0 0;border-radius:var(--r-s)}.pj:hover{background:var(--surface-hover)}.pj-toggle{flex:1;min-width:0;height:100%;display:flex;align-items:center;gap:6px;padding-left:2px;text-align:left;font-size:var(--fs-m);font-weight:500}.pj-caret{width:14px;flex:none;display:inline-flex;justify-content:center;color:var(--muted);transition:transform var(--dur-1)}.pj-caret.open{transform:rotate(90deg)}.pj-badge{width:18px;height:18px;flex:none;border-radius:5px;display:inline-flex;align-items:center;justify-content:center;background:var(--badge-bg);color:var(--badge-fg);font-size:var(--fs-xs);font-weight:600;line-height:1;text-transform:uppercase}.pj-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pj-count{flex:none;padding:0 6px;font-size:var(--fs-s);color:var(--meta)}.pj-act{width:22px;height:22px;flex:none;display:none;align-items:center;justify-content:center;border-radius:var(--r-s);color:var(--muted)}.pj:hover .pj-act,.pj-act:focus-visible{display:inline-flex}.pj:hover .pj-count{display:none}.pj-act:hover{background:var(--bg);color:var(--fg)}.pj-sessions{padding:1px 0 4px 22px;display:flex;flex-direction:column;gap:1px}.pj-more,.pj-empty{display:flex;align-items:center;width:100%;height:26px;padding:0 8px 0 21px;font-size:var(--fs-s);color:var(--muted);text-align:left;border-radius:var(--r-s)}.pj-more:hover{background:var(--surface-hover);color:var(--fg)}.t-item{display:flex;align-items:center;gap:8px;width:100%;height:var(--row);padding:0 4px 0 8px;border-radius:var(--r-s);position:relative;text-align:left;font-size:var(--fs-m);transition:background var(--dur-1)}.t-item:hover{background:var(--surface-hover)}.t-item.on{background:var(--active-bg);box-shadow:0 0 0 1px var(--active-line),0 1px 2px #0000000a;font-weight:500}.t-item.on:before{content:"";position:absolute;left:-1px;top:7px;bottom:7px;width:2px;border-radius:2px;background:var(--accent-2)}.t-item.archived{opacity:.55}.t-item.archived .t-title{font-style:italic}.t-item .dot{width:5px;height:5px}.t-pin{width:12px;flex:none;display:inline-flex;color:var(--muted)}.t-pin svg{width:10px;height:10px}.t-title{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.t-time{flex:none;font-size:var(--fs-xs);color:var(--meta);font-weight:400}.t-item:hover .t-time{display:none}.t-more{flex:none;width:22px;height:22px;display:none;align-items:center;justify-content:center;border-radius:var(--r-s);color:var(--muted)}.t-item:hover .t-more{display:inline-flex}.t-more:hover{background:var(--bg);color:var(--fg)}.t-rename{flex:1;min-width:0;height:24px;font-size:var(--fs-m);border:1px solid var(--accent);border-radius:var(--r-s);padding:0 6px;background:var(--bg)}.sb-empty{padding:20px 12px;text-align:center;color:var(--muted);font-size:var(--fs-s)}.sb-start{padding:28px 12px;text-align:center}.sb-start-t{font-size:var(--fs-m);font-weight:500}.sb-start-s{margin:4px 0 12px;font-size:var(--fs-s);color:var(--muted)}.rs{width:5px;flex:none;cursor:col-resize;position:relative}.rs:after{content:"";position:absolute;inset:0}.rs:hover:after,.rs.drag:after{background:color-mix(in oklab,var(--accent) 30%,transparent)}.rs-l{margin-left:-3px}.rs-r{margin-right:-3px}body.col-drag{cursor:col-resize;user-select:none}body.col-drag iframe,body.col-drag .xterm{pointer-events:none}.scrim{position:fixed;inset:0;z-index:45;background:#00000052;display:none}.scrim.show{display:block}.main{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--bg);position:relative}.topbar{height:40px;flex:none;display:flex;align-items:center;gap:6px;padding:0 10px;border-bottom:1px solid var(--line)}.tb-menu-btn{display:none}.tb-menu-btn.tb-sb-collapsed{display:inline-flex;margin-right:2px}.tb-crumb{flex:none;max-width:26%;font-size:var(--fs-m);color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tb-sep{flex:none;color:var(--muted)}.tb-title{font-size:var(--fs-l);font-weight:500;max-width:40%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-radius:var(--r-s);padding:2px 6px;cursor:text}.tb-title:hover{background:var(--surface)}.tb-title.ghost{color:var(--muted);cursor:default}.tb-title.ghost:hover{background:none}.tb-rename{font-size:var(--fs-l);font-weight:500;border:1px solid var(--accent);border-radius:var(--r-s);padding:1px 6px;background:var(--bg);width:300px;max-width:46vw}.tb-pill{flex:none;display:inline-flex;align-items:center;gap:6px;height:22px;padding:0 9px;border-radius:var(--r-full);font-size:var(--fs-s);background:var(--surface);color:var(--muted)}.tb-pill.run{background:var(--run-bg);color:var(--run-fg)}.tb-pill-dot{width:7px;height:7px;border-radius:50%;background:var(--accent-2);box-shadow:0 0 0 3px color-mix(in oklab,var(--accent-2) 20%,transparent);animation:breathe 1.6s infinite}.tb-pill.wait{color:var(--warn)}.tb-pill.err{color:var(--danger)}.tb-right{margin-left:auto;display:flex;align-items:center;gap:2px}.tb-model{font-size:var(--fs-s);color:var(--muted);margin-right:4px;white-space:nowrap;max-width:160px;overflow:hidden;text-overflow:ellipsis}.connbar{flex:none;height:26px;display:flex;align-items:center;justify-content:center;font-size:var(--fs-s);background:color-mix(in oklab,var(--warn) 14%,var(--bg));color:var(--warn)}.scroll{flex:1;overflow-y:auto;overscroll-behavior:contain;position:relative}.tl-wrap{max-width:calc(var(--col) + 40px);min-width:0;margin:0 auto;padding:24px 20px 16px}.jump{position:absolute;right:24px;bottom:150px;width:34px;height:34px;border-radius:50%;background:var(--bg);box-shadow:var(--shadow-pop);display:flex;align-items:center;justify-content:center;color:var(--muted);z-index:5}.jump:hover{color:var(--fg)}.jump svg{transform:rotate(90deg)}.jump .jd{position:absolute;top:4px;right:4px;width:7px;height:7px;border-radius:50%;background:var(--accent)}.panel{width:var(--pn-w, 440px);flex:none;display:flex;flex-direction:column;background:var(--bg);border-left:1px solid var(--line)}.pn-head{flex:none;display:flex;align-items:center;gap:2px;height:40px;padding:0 6px;border-bottom:1px solid var(--line)}.pn-tabs{display:flex;gap:2px}.pn-tab{height:28px;padding:0 10px;border-radius:var(--r-s);font-size:var(--fs-m);color:var(--muted);display:inline-flex;align-items:center;gap:6px}.pn-tab:hover{background:var(--surface-hover);color:var(--fg)}.pn-tab.on{background:var(--surface-hover);color:var(--fg);font-weight:500}.pn-body{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.pn-close{margin-left:auto}.pn-empty{padding:20px;color:var(--muted);font-size:var(--fs-m);text-align:center}.pn-empty-sub{margin-top:6px;font-size:var(--fs-s);opacity:.8}.chg-head{flex:none;display:flex;align-items:center;gap:6px;height:34px;padding:0 8px;border-bottom:1px solid var(--line);font-size:var(--fs-m)}.chg-branch{display:inline-flex;align-items:center;gap:5px;color:var(--muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chg-head .ibtn{margin-left:auto}.chg-list{flex:none;max-height:40%;overflow-y:auto;border-bottom:1px solid var(--line)}.chg-list:empty{border-bottom:none}.chg-row{display:flex;align-items:center;gap:7px;padding:4px 8px;cursor:pointer;font-size:var(--fs-m);min-height:28px}.chg-row:hover,.chg-row.on{background:var(--surface-hover)}.chg-kind{flex:none;width:18px;height:18px;border-radius:var(--r-s);font-size:10px;display:inline-flex;align-items:center;justify-content:center;background:var(--surface);color:var(--muted)}.chg-kind.k-modified{color:var(--warn, #b45309)}.chg-kind.k-added,.chg-kind.k-untracked{color:var(--ok, #15803d)}.chg-kind.k-deleted{color:var(--danger)}.chg-kind.k-renamed{color:var(--accent)}.chg-path{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left}.chg-stat{flex:none;font-style:normal;font-size:var(--fs-s);font-variant-numeric:tabular-nums}.chg-stat .add{color:var(--ok, #15803d);font-style:normal}.chg-stat .del{color:var(--danger);font-style:normal}.chg-discard{flex:none;opacity:0}.chg-row:hover .chg-discard{opacity:1}.chg-diff{flex:1;min-height:0;overflow:auto}.ft-crumbs{flex:none;display:flex;align-items:center;gap:4px;min-height:34px;padding:0 8px;border-bottom:1px solid var(--line);font-size:var(--fs-m);overflow-x:auto;white-space:nowrap}.ft-crumb{color:var(--muted);font-size:var(--fs-m);padding:2px 4px;border-radius:var(--r-s)}.ft-crumb:hover{background:var(--surface-hover);color:var(--fg)}.ft-crumb-t{color:var(--fg)}.ft-crumb-t.muted{color:var(--muted)}.ft-tree{flex:none;max-height:45%;overflow-y:auto;padding:4px 0}.ft-row{display:flex;align-items:center;gap:5px;padding:3px 8px;cursor:pointer;font-size:var(--fs-m);min-height:24px}.ft-row:hover,.ft-row.on{background:var(--surface-hover)}.ft-row .caret{font-size:var(--fs-xs);color:var(--muted);display:inline-block;transition:transform var(--dur-1) var(--ease)}.ft-row .caret.open{transform:rotate(90deg)}.ft-dot{width:13px;flex:none}.ft-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ft-err{color:var(--danger);font-size:var(--fs-s);padding:2px 0}.ft-view{flex:1;min-height:0;overflow:auto;border-top:1px solid var(--line)}.ft-pre{margin:0;padding:10px 12px;font-family:var(--font-mono);font-size:var(--chat-code-fs);line-height:1.55}.ft-pre code{background:none;padding:0;display:block;white-space:pre}.tm-tabs{flex:none;display:flex;align-items:center;gap:2px;padding:4px 6px;border-bottom:1px solid var(--line);overflow-x:auto}.tm-tab{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 6px 0 10px;border-radius:var(--r-s);font-size:var(--fs-m);color:var(--muted);white-space:nowrap}.tm-tab:hover,.tm-tab.on{background:var(--surface-hover);color:var(--fg)}.tm-x{color:var(--muted);padding:0 3px;border-radius:3px}.tm-x:hover{color:var(--danger);background:var(--surface-hover)}.tm-note{flex:none;padding:4px 10px;font-size:var(--fs-s);color:var(--warn);background:color-mix(in oklab,var(--warn) 10%,var(--bg));border-bottom:1px solid var(--line)}.tm-body{flex:1;min-height:0;position:relative;background:var(--term-bg)}.tm-view{position:absolute;inset:0;padding:6px 8px;background:var(--term-bg)}.tm-view .xterm{height:100%}.tm-view .xterm-viewport{background:var(--term-bg)!important}.tm-view .xterm-screen{padding:2px 0}.imp-list{max-height:320px;overflow-y:auto;display:flex;flex-direction:column;gap:2px}.imp-row{display:flex;align-items:center;gap:8px;padding:5px 6px;border-radius:var(--r-s);font-size:var(--fs-m);cursor:pointer}.imp-row:hover{background:var(--surface-hover)}.imp-row.done{opacity:.55;cursor:default}.imp-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.imp-meta{flex:none;color:var(--muted);font-size:var(--fs-s)}.info-grid{display:flex;flex-direction:column;gap:2px}.info-row{display:flex;align-items:center;gap:10px;padding:3px 2px;font-size:var(--fs-m)}.info-k{flex:none;width:74px;color:var(--muted)}.info-v{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--fs-s)}@media(min-width:760px){.sidebar{transition:margin-left var(--dur-2) var(--ease),visibility 0s linear 0s}.sidebar.w-hide{margin-left:calc(-1 * var(--sb-w, 248px));visibility:hidden;transition:margin-left var(--dur-2) var(--ease),visibility 0s linear var(--dur-2)}.sidebar.w-hide+.rs-l{display:none}}@media(prefers-reduced-motion:reduce){.sidebar,.sidebar.w-hide{transition:none}}.sb-row .sb-toggle{flex:none;color:var(--muted)}.sb-toggle:hover{color:var(--fg)}@media(min-width:900px){.panel.w-hide{display:none}}@media(max-width:899px){.panel{position:fixed;right:0;top:0;bottom:0;z-index:46;width:min(var(--pn-w, 440px),92vw);transform:translate(100%);transition:transform var(--dur-2) var(--ease);box-shadow:var(--shadow-pop)}.panel.open{transform:none}.rs-r{display:none}}@media(max-width:759px){.sidebar{position:fixed;left:0;top:0;bottom:0;z-index:46;width:min(var(--sb-w, 248px),84vw);transform:translate(-100%);transition:transform var(--dur-2) var(--ease);box-shadow:var(--shadow-pop)}.sidebar.open{transform:none}.sidebar~.rs-l{display:none}.tb-menu-btn{display:inline-flex}.tl-wrap{padding:16px 14px 8px}.tb-model{display:none}}.dlg.cpal{width:520px;padding:6px}.cpal-in{width:100%;height:36px;padding:0 12px;border:0;background:none;outline:none;font-size:var(--fs-l);color:var(--fg)}.cpal-list{max-height:46vh;overflow-y:auto;padding:4px}.cpal-item{display:flex;align-items:center;gap:8px;width:100%;height:30px;padding:0 10px;border-radius:var(--r-s);text-align:left;font-size:var(--fs-m)}.cpal-item.on{background:var(--surface-hover)}.cpal-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cpal-hint{flex:none;font-size:var(--fs-s);color:var(--muted)}.pv{flex:1;min-height:0;display:flex;flex-direction:column}.pv-bar{flex:none;display:flex;align-items:center;gap:2px;height:38px;padding:0 6px;border-bottom:1px solid var(--line)}.pv-bar .ibtn{width:26px;height:26px;flex:none;color:var(--muted)}.pv-bar .ibtn:hover:not(:disabled){color:var(--fg)}.pv-bar .ibtn:disabled{opacity:.35;cursor:default}.pv-addr{flex:1;min-width:0;height:26px;padding:0 8px;margin:0 2px;border-radius:var(--r-s);background:var(--search-bg);border:1px solid transparent;color:var(--fg);font-family:var(--font-mono);font-size:var(--fs-s);outline:none}.pv-addr:focus{border-color:var(--cp-focus);background:var(--bg)}.pv-addr.err{border-color:color-mix(in oklab,var(--danger) 60%,var(--bg))}.pv-note{flex:none;display:flex;align-items:center;gap:8px;padding:6px 10px;font-size:var(--fs-s);color:var(--muted);border-bottom:1px solid var(--line)}.pv-note.err{color:var(--danger)}.pv-note .btn{height:24px;font-size:var(--fs-s)}.pv-frame-wrap{flex:1;min-height:0;position:relative;background:var(--bg)}.pv-frame{position:absolute;inset:0;width:100%;height:100%;border:0;background:#fff}.pv-loading{position:absolute;top:0;left:0;right:0;height:2px;background:var(--accent-2);opacity:.5;animation:breathe 1s infinite}.pv-empty{padding:28px 22px;color:var(--muted);font-size:var(--fs-m);text-align:center;line-height:1.7}.pv-empty code{font-family:var(--font-mono);font-size:var(--fs-s);background:var(--code-bg);border:1px solid var(--code-line);border-radius:4px;padding:0 4px;color:var(--code-fg)}.pv-hint{margin-top:10px;font-size:var(--fs-s);color:var(--meta)}.ft-row[draggable=true]{cursor:default}.ft-row.dragging{opacity:.5}.um-row{display:flex;flex-direction:column;align-items:flex-end;margin:4px 0 8px}.um{position:relative;max-width:78%;background:var(--accent-soft);border-radius:14px 14px 4px;color:var(--fg);padding:6px 12px;font-size:var(--chat-fs);line-height:1.6;white-space:pre-wrap;word-break:normal;overflow-wrap:break-word}.um-act{display:flex;gap:2px;margin-top:2px;height:24px;opacity:0;transition:opacity var(--dur-1)}.um-row:hover .um-act,.um-act:focus-within{opacity:1}@media(hover:none){.um-act{opacity:1}}.um-act .ibtn{width:24px;height:24px;color:var(--meta)}.um-act .ibtn:hover,.um-act .ibtn:focus-visible{color:var(--fg)}.um-act .ibtn.done,.te-act.done{color:var(--fg)}.um-img{display:block;max-width:200px;max-height:140px;border-radius:var(--r-s);margin-bottom:6px;cursor:zoom-in}.um-tag{font-size:var(--chat-fs-s);color:var(--muted);margin-top:2px}.um-row.fresh .um{animation:um-in .14s var(--ease, ease-out) both}@keyframes um-in{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.um-row.fresh .um{animation:none}}.um-row.failed .um{box-shadow:inset 0 0 0 1px var(--danger)}.um-fail{display:flex;align-items:center;gap:8px;margin-top:4px;font-size:var(--chat-fs-s);color:var(--danger)}.um-fail-t{display:inline-flex;align-items:center;gap:4px}.um-fail-b{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:6px;border:1px solid var(--line);background:transparent;color:var(--fg);font:inherit;cursor:pointer}.um-fail-b:hover,.um-fail-b:focus-visible{background:var(--surface-hover)}.as{margin:4px 0}.md.streaming:after{content:"\258d";color:var(--accent);animation:breathe 1s infinite}.md{font-size:var(--chat-fs);line-height:var(--chat-lh);color:var(--text);word-break:normal;overflow-wrap:break-word}.md p{margin:0 0 .6em}.md>:last-child{margin-bottom:0}.md a{color:var(--accent);text-decoration:underline;text-underline-offset:2px;text-decoration-color:color-mix(in oklab,var(--accent) 40%,transparent)}.md a:hover{text-decoration:underline}.md pre{position:relative;background:var(--code-bg);border:1px solid var(--code-line);border-radius:var(--r-m);padding:10px 12px;overflow-x:auto;font-family:var(--font-mono);font-size:var(--chat-code-fs);line-height:1.55}.md code{font-family:var(--font-mono);font-size:var(--chat-code-fs);background:var(--code-bg);color:var(--code-fg);padding:1px 5px;border-radius:4px;border:1px solid var(--code-line)}.md pre code{background:none;padding:0;border:0;color:inherit;font-size:inherit}.md ul,.md ol{margin:.45em 0;padding-left:1.7em}.md li+li{margin-top:.15em}.md h1,.md h2,.md h3,.md h4{margin:.95em 0 .4em;font-weight:600;line-height:1.4}.md h1{font-size:calc(var(--chat-fs) + 4px)}.md h2{font-size:calc(var(--chat-fs) + 2px)}.md h3{font-size:calc(var(--chat-fs) + 1px)}.md h4{font-size:var(--chat-fs)}.md>h1:first-child,.md>h2:first-child,.md>h3:first-child,.md>h4:first-child{margin-top:.2em}.md blockquote{margin:6px 0;padding-left:12px;border-left:3px solid var(--line);color:var(--muted)}.md table{border-collapse:collapse;margin:8px 0}.md th,.md td{border:1px solid var(--line);padding:4px 10px;font-size:var(--chat-fs-s)}.md .cb{margin:.5em 0 .7em;border:1px solid var(--code-line);border-radius:var(--r-m);background:var(--code-bg);overflow:hidden}.md .cb pre{margin:0;border:0;border-radius:0;background:none;padding:2px 12px 10px}.cb-head{display:flex;align-items:center;gap:8px;height:28px;padding:0 6px 0 12px;font-size:var(--fs-xs);color:var(--meta);user-select:none;-webkit-user-select:none}.cb-lang{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono)}.cb-acts{flex:none;display:inline-flex;gap:2px}.cb-btn{width:24px;height:22px;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--r-s);color:var(--meta)}.cb-btn:hover,.cb-btn:focus-visible{background:var(--surface-hover);color:var(--fg)}.cb-btn[aria-pressed=true],.cb-btn.done{color:var(--fg)}.md .cb pre code{display:block;min-width:max-content}.md .cb.wrap pre code{min-width:0;white-space:pre-wrap;overflow-wrap:anywhere}.md .cb.numbered pre code{counter-reset:cb-line}.cb-l{display:block;min-height:1.55em}.cb.numbered .cb-l{position:relative;padding-left:3em}.cb.numbered .cb-l:before{counter-increment:cb-line;content:counter(cb-line);position:absolute;left:0;width:2em;text-align:right;color:var(--meta);opacity:.8;user-select:none;-webkit-user-select:none;font-variant-numeric:tabular-nums}.md .hljs-keyword,.md .hljs-built_in,.md .hljs-selector-tag,.md .hljs-type{color:var(--fg);font-weight:600}.md .hljs-string,.md .hljs-regexp,.md .hljs-attr,.md .hljs-symbol{color:color-mix(in oklab,var(--fg) 62%,var(--bg))}.md .hljs-comment,.md .hljs-quote{color:var(--meta);font-style:italic}.md .hljs-number,.md .hljs-literal{color:color-mix(in oklab,var(--fg) 75%,var(--bg))}.md .hljs-title,.md .hljs-title.function_,.md .hljs-section{color:var(--fg)}.md .hljs-meta,.md .hljs-variable.language_{color:var(--muted)}.rs-item{margin:4px 0 6px}.rs-head{display:inline-flex;align-items:center;gap:4px;min-height:22px;max-width:100%;padding:0;color:var(--meta);font-size:var(--chat-fs-s);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rs-head:hover{color:var(--fg)}.rs-head .caret{display:inline-block;transition:transform var(--dur-1)}.rs-head .caret.open{transform:rotate(90deg)}.rs-body{margin:2px 0 6px 5px;padding-left:12px;border-left:1px solid var(--line);color:var(--muted);font-size:var(--chat-fs-s);line-height:1.65;white-space:pre-wrap}.ck{margin:4px 0 8px;font-size:var(--chat-fs-s);border-radius:var(--r-m);transition:background var(--dur-2)}.ck.flash{animation:ck-flash 1.2s var(--ease)}@keyframes ck-flash{0%,40%{background:var(--surface-hover)}to{background:transparent}}.ck-head{display:flex;align-items:center;gap:6px;min-height:24px;padding:0 6px;color:var(--muted);white-space:nowrap;overflow:hidden}.ck-head svg{flex:none;color:var(--meta)}.ck-n{font-variant-numeric:tabular-nums;color:var(--fg);font-weight:500}.ck-list{list-style:none;margin:0;padding:0}.ck-i{display:flex;align-items:flex-start;gap:8px;padding:2px 6px;line-height:1.55;color:var(--muted)}.ck-box{flex:none;width:14px;height:calc(var(--chat-fs-s) * 1.55);display:inline-flex;align-items:center;justify-content:center;color:var(--meta)}.ck-i.done .ck-box{color:var(--muted)}.ck-i.done .ck-t{color:var(--meta)}.ck-i.doing .ck-t{color:var(--fg)}.ck-t{min-width:0;overflow-wrap:anywhere}.tg{margin:2px 0 8px;min-width:0}.tg-head{display:flex;align-items:center;gap:8px;width:100%;min-height:26px;padding:0 6px;overflow:hidden;border-radius:var(--r-s);color:var(--muted);font-size:var(--chat-fs-s);text-align:left;white-space:nowrap}.tg-head:hover{color:var(--fg);background:var(--surface-hover)}.tg-ic{width:14px;flex:none;display:inline-flex;justify-content:center;color:var(--meta)}.tg-head .caret{flex:none;color:var(--meta);transition:transform var(--dur-1)}.tg-head .caret.open{transform:rotate(90deg)}.tg-sum{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tg-fail{flex:none;color:var(--danger)}.tg-fail:before{content:"\b7";margin-right:6px;color:var(--meta)}.tg-run{display:flex;align-items:center;gap:8px;min-height:22px;padding-left:6px;color:var(--muted);font-size:var(--chat-fs-s);min-width:0;overflow:hidden;white-space:nowrap}.tg-run-text{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ts-noerr{color:var(--meta);font-size:var(--chat-fs-s);margin-bottom:4px}.tg-list{margin:0;padding:0}.tg.open>.tg-list{margin:2px 0 0 13px;padding-left:6px;border-left:1px solid var(--line)}.ts-head{display:flex;align-items:center;gap:8px;width:100%;min-height:26px;padding:0 6px;overflow:hidden;border-radius:var(--r-s);font-size:var(--chat-fs-s);text-align:left;color:var(--muted);white-space:nowrap}.ts-head:hover,.ts.open>.ts-head{background:var(--surface-hover);color:var(--fg)}.ts-ic{width:14px;flex:none;display:inline-flex;justify-content:center;color:var(--meta)}.ts-head:hover .ts-ic{color:var(--muted)}.ts-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ts-title.mono{font-family:var(--font-mono);font-size:var(--chat-code-fs)}.ts-think .ts-head{color:var(--meta)}.ts-think .rs-body{margin-left:28px}.ts-diff{flex:none;display:inline-flex;gap:5px;font-family:var(--font-mono);font-size:var(--chat-code-fs);font-variant-numeric:tabular-nums;color:var(--meta)}.ts-diff .add{color:var(--muted)}.ts-meta{flex:none;color:var(--meta);font-variant-numeric:tabular-nums}.ts-meta.err{color:var(--danger)}.ts-st{flex:none;width:14px;display:inline-flex;align-items:center;justify-content:center;margin-left:auto;color:var(--meta)}.ts-st.ok{color:var(--muted)}.ts-st.fail{color:var(--danger)}.ts.failed>.ts-head .ts-title{color:var(--fg)}.spin{display:inline-block;width:10px;height:10px;flex:none;border-radius:50%;border:1.5px solid color-mix(in oklab,var(--fg) 18%,transparent);border-top-color:var(--accent-2);animation:ac-spin .8s linear infinite}@keyframes ac-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.spin{animation-duration:2.4s}}.ts-out{margin:2px 6px 6px 28px}.ts-out pre{background:var(--code-bg);border-radius:var(--r-s);padding:8px 10px;font-family:var(--font-mono);font-size:var(--chat-code-fs);line-height:1.5;overflow-x:auto;white-space:pre-wrap;word-break:break-all;margin:0}.ts-more{font-size:var(--chat-fs-s);color:var(--accent);margin-bottom:4px}.diff{margin:2px 6px 6px 28px;border:1px solid var(--line);border-radius:var(--r-m);overflow:hidden}.diff-path{padding:4px 10px;font-size:var(--chat-code-fs);color:var(--muted);background:var(--surface);border-bottom:1px solid var(--line);font-family:var(--font-mono)}.diff-pre{margin:0;padding:6px 0;font-family:var(--font-mono);font-size:var(--chat-code-fs);line-height:1.5;overflow-x:auto}.dh-head{display:block;color:var(--muted);padding:0 10px}.dl{display:block;padding:0 10px;white-space:pre-wrap;word-break:break-all}.dl.add{background:var(--add-bg)}.dl.del{background:var(--del-bg)}.card{margin:8px 0;border-radius:10px;padding:12px 14px}.card.plan{border:1px solid var(--line)}.card.perm{border:1px solid color-mix(in oklab,var(--warn) 30%,var(--bg));background:color-mix(in oklab,var(--warn) 3%,var(--bg))}.card.perm.done{border-color:var(--line);opacity:.75}.card.ask{border:1px solid color-mix(in oklab,var(--info) 45%,var(--bg))}.card.ask.done{border-color:var(--line);opacity:.75}.err-card{border:1px solid color-mix(in oklab,var(--danger) 45%,var(--bg))}.err-line{color:var(--danger);font-size:var(--chat-fs)}.perm-title{font-size:var(--chat-fs);font-weight:500}.perm-cmd{margin:8px 0 0;background:var(--code-bg);border-radius:var(--r-s);padding:8px 10px;font-family:var(--font-mono);font-size:var(--chat-code-fs);white-space:pre-wrap;word-break:break-all}.perm-path{margin-top:6px;font-family:var(--font-mono);font-size:var(--chat-code-fs);color:var(--muted)}.perm-btns{display:flex;gap:8px;margin-top:10px}.perm-done{margin-top:8px;font-size:var(--chat-fs-s);color:var(--muted)}.ask-q{margin-bottom:10px}.ask-t{font-size:var(--chat-fs);font-weight:500;margin-bottom:6px}.ask-opts{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}.ask-free,.ask .btn.primary{margin-top:4px}.nt{margin:8px 0;text-align:center;font-size:var(--chat-fs-s);color:var(--muted)}.nt.warn{color:var(--warn)}.nt.error{color:var(--danger)}.nt-bash{text-align:left;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-m);line-height:1.6}.nt-actions{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}.te{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:2px 4px;margin:6px 0 18px -6px;font-size:var(--chat-fs-s);color:var(--meta);min-width:0}.te-m{display:inline-flex;align-items:center;gap:4px;padding:0 4px;height:24px;font-variant-numeric:tabular-nums;white-space:nowrap;min-width:0;max-width:100%}.te-m>span{overflow:hidden;text-overflow:ellipsis}.te-m svg{flex:none}.te-act{height:24px;min-width:24px;display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:0 6px;border-radius:var(--r-s);color:var(--meta);white-space:nowrap}.te-act:hover{background:var(--surface-hover);color:var(--fg)}.te-files{color:var(--accent);font-size:inherit;margin-left:6px}.te-files:hover{text-decoration:underline}.empty-wrap{min-height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:14vh}.cp-hero-t{font-size:var(--fs-hero);font-weight:600}.cp-hero-s{margin-top:6px;font-size:var(--fs-s);color:var(--muted)}.empty-actions{margin-top:16px}.workspace-empty{padding-bottom:10vh}.q-list{max-width:var(--col);margin:0 auto 6px;display:flex;flex-direction:column;gap:4px}.q-item{display:flex;align-items:center;gap:8px;padding:4px 10px;background:var(--surface);border-radius:var(--r-s);font-size:var(--fs-s)}.q-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.q-item .ibtn{width:20px;height:20px}a.ac-local{cursor:pointer}.ts-out pre a.ac-local,.md pre a.ac-local{color:inherit;text-decoration:underline;text-decoration-color:color-mix(in oklab,currentColor 45%,transparent);text-underline-offset:2px}.md code a.ac-local{color:inherit}.mention{display:inline-flex;align-items:center;gap:4px;max-width:260px;height:22px;padding:0 6px;border-radius:var(--r-s);background:var(--chip-bg);border:1px solid var(--chip-line);color:var(--pill-fg);font-size:var(--fs-s);font-family:var(--font-mono);white-space:nowrap;vertical-align:middle}.mention svg{flex:none}.mention-name{min-width:0;overflow:hidden;text-overflow:ellipsis}.um-mentions{display:flex;flex-wrap:wrap;gap:4px;margin:2px 0 4px;white-space:normal}.um .mention{background:color-mix(in oklab,var(--fg) 5%,var(--accent-soft))}.qs-pop{position:fixed;z-index:60;display:inline-flex;align-items:center;gap:5px;height:30px;padding:0 10px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--fg);font-size:var(--fs-s);box-shadow:0 4px 14px #0000001f,0 1px 2px #00000014;white-space:nowrap;cursor:pointer;user-select:none;-webkit-user-select:none}.qs-pop:hover{background:var(--surface-hover)}.qs-pop svg{flex:none;color:var(--muted)}.um-quote{display:block;margin:2px 0 6px;padding-left:8px;border-left:2px solid color-mix(in oklab,var(--fg) 30%,transparent);color:var(--muted);font-size:var(--chat-fs-s);max-height:7.5em;overflow:hidden}.apv{margin:0 0 8px;min-width:0}.apv-head{display:flex;align-items:center;gap:8px;width:100%;min-height:26px;padding:0 6px;overflow:hidden;border-radius:var(--r-s);color:var(--muted);font-size:var(--chat-fs-s);text-align:left;white-space:nowrap}.apv-head:hover,.apv.open>.apv-head{color:var(--fg);background:var(--surface-hover)}.apv-head .caret{flex:none;color:var(--meta);transition:transform var(--dur-1)}.apv-head .caret.open{transform:rotate(90deg)}.apv-ic{width:14px;flex:none;display:inline-flex;justify-content:center;color:var(--auto-fg, var(--warn))}.apv-n{flex:none}.apv-peek{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--meta);font-family:var(--font-mono);font-size:var(--chat-code-fs)}.apv-peek:before{content:"\b7";margin-right:8px;font-family:var(--font-ui)}.apv-list{margin:2px 0 0 13px;padding-left:6px;border-left:1px solid var(--line)}.apv-row{display:flex;align-items:center;gap:8px;min-height:26px;padding:0 6px;min-width:0;overflow:hidden;white-space:nowrap;border-radius:var(--r-s);color:var(--muted);font-size:var(--chat-fs-s)}.apv-row:hover{background:var(--surface-hover);color:var(--fg)}.apv-cmd,.apv-path,.apv-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.apv-cmd,.apv-path{font-family:var(--font-mono);font-size:var(--chat-code-fs)}.apv-meta{flex:none;margin-left:auto;color:var(--meta);font-size:var(--fs-xs)}.nt-auto{text-align:left;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-m);line-height:1.6;color:var(--text)}.nt-auto-h{display:flex;align-items:center;gap:6px;margin-bottom:2px}.composer{flex:none;padding:0 16px 16px}.cp-card{width:100%;max-width:var(--col);margin:0 auto;background:var(--bg);border-radius:14px;border:1px solid var(--cp-line);padding:12px 12px 8px 14px;box-shadow:0 1px 2px #0000000a;transition:border-color var(--dur-2) var(--ease),box-shadow var(--dur-2) var(--ease)}.cp-card:focus-within{border-color:var(--cp-focus);box-shadow:0 0 0 3px var(--cp-ring),0 1px 2px #0000000a}.cp-card.waiting{border-color:color-mix(in oklab,var(--warn) 45%,var(--bg))}:root{--auto-fg: #b45309;--auto-bg: color-mix(in oklab, #f59e0b 10%, var(--bg));--auto-line: color-mix(in oklab, #d97706 40%, var(--bg))}:root[data-theme=dark]{--auto-fg: #fbbf24;--auto-bg: color-mix(in oklab, #f59e0b 13%, var(--bg));--auto-line: color-mix(in oklab, #f59e0b 42%, var(--bg))}.cp-auto-on{max-width:var(--col);margin:0 auto 4px;display:flex;align-items:center;gap:6px;min-width:0;height:22px;padding:0 4px;white-space:nowrap;overflow:hidden;color:var(--muted);font-size:var(--fs-s);line-height:22px}.cp-auto-ic{flex:none;display:inline-flex;color:var(--auto-fg)}.cp-auto-t{flex:0 1 auto;min-width:0;display:inline-flex;align-items:center;gap:6px;overflow:hidden;cursor:help;border-radius:var(--r-s)}.cp-auto-t:focus-visible{outline:2px solid var(--auto-line);outline-offset:1px}.cp-auto-t b{min-width:0;overflow:hidden;text-overflow:ellipsis;color:var(--auto-fg);font-weight:600}.cp-auto-on .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.cp-auto-back{flex:none;margin-left:auto;padding:0 2px;border:0;background:none;white-space:nowrap;color:var(--fg);font-size:var(--fs-s);text-decoration:underline;text-underline-offset:2px;text-decoration-color:color-mix(in oklab,var(--fg) 35%,transparent);cursor:pointer}.cp-auto-back:hover{text-decoration-color:currentColor}.cp-card.auto-on{border-color:var(--auto-line)}.cp-card.auto-on:focus-within{border-color:var(--auto-fg)}.cp-hint{max-width:var(--col);margin:6px auto 0;font-size:var(--fs-xs);color:var(--meta);text-align:center}.att-note{padding:6px 10px 0;color:var(--muted);font-size:var(--fs-s)}.cp-ta-wrap{position:relative}.slash-pop{position:absolute;left:0;right:0;bottom:100%;margin-bottom:6px;max-height:min(240px,40vh);overflow:hidden;display:flex;flex-direction:column;z-index:20}.slash-pop .ap-scroll{max-height:inherit}.slash-pop .slash-h{padding:4px 10px 2px;font-size:var(--fs-xs);color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.slash-pop .mi.slash-item{height:auto;min-height:28px;padding:4px 10px;flex-direction:column;align-items:flex-start;gap:0}.slash-pop .slash-name{font-weight:500}.slash-pop .slash-desc{font-size:var(--fs-s);color:var(--muted);line-height:1.3}.slash-pop .slash-hint{font-size:var(--fs-s);color:var(--muted);font-family:var(--font-mono)}.slash-pop .mi.slash-item.sel{background:var(--surface-hover)}.cp-ta{width:100%;border:0;resize:none;background:none;outline:none;color:var(--text);font-size:var(--chat-fs);line-height:calc(var(--chat-fs) * 1.62);min-height:34px;max-height:calc(var(--chat-fs) * 1.62 * 12);overflow-y:auto;display:block;padding:0}.cp-ta::placeholder{color:var(--meta)}.cp-bar{display:flex;align-items:center;flex-wrap:wrap;gap:2px;margin:4px 0 0 -6px;min-width:0}.pill-wrap{position:relative;flex:0 1 auto;min-width:0;max-width:100%}.pill{position:relative;display:inline-flex;align-items:center;gap:5px;height:26px;padding:0 8px;border-radius:7px;background:none;color:var(--pill-fg, var(--muted));border:1px solid transparent;font-size:var(--fs-s);max-width:min(240px,100%);min-width:0;white-space:nowrap;cursor:pointer;transition:background var(--dur-1)}.pill:hover{background:var(--surface-hover)}.pill svg{flex:none}.pill.chip{background:var(--chip-bg);border-color:var(--chip-line);padding:0 8px 0 4px;gap:6px;max-width:min(300px,100%)}.pill.chip:hover{background:var(--surface-hover)}.chip-logo{border-radius:5px}.chip-caret{color:var(--meta)}.pill .p-a{font-weight:500;color:var(--fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:0 0 auto;max-width:120px}.pill .p-t{color:var(--meta);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1 1 auto}.pill .p-t:before{content:"\b7";margin-right:5px}.ipill .ip-l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.ipill:focus-visible{outline:2px solid color-mix(in oklab,var(--accent) 45%,var(--bg));outline-offset:-1px}.ipill[aria-expanded=true]{background:var(--surface-hover)}.ipill.danger{color:var(--danger)}.cp-bar .pill{height:24px;border-radius:6px;background:var(--chip-bg);border-color:var(--chip-line);padding:0 6px 0 7px;gap:5px}.cp-bar .pill:hover,.cp-bar .pill[aria-expanded=true]{background:var(--surface-hover)}.cp-bar .pill.chip{padding:0 6px 0 3px}.cp-bar .pill.chip .chip-logo{width:16px;height:16px}.cp-bar .ipill.danger{border-color:color-mix(in oklab,var(--danger) 35%,var(--chip-line))}.cp-bar{gap:4px}.cp-tasks{max-width:var(--col);margin:0 auto 6px;display:flex}.tasks-pill{display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 8px;border-radius:var(--r-full);border:1px solid var(--chip-line);background:var(--bg);color:var(--muted);font-size:var(--fs-xs);font-variant-numeric:tabular-nums}.tasks-pill:hover{color:var(--fg);background:var(--surface-hover)}.tasks-pill svg{flex:none;color:var(--meta)}.ipill.auto,.cp-bar .ipill.auto{color:var(--auto-fg);background:var(--auto-bg);border-color:var(--auto-line);font-weight:600}.ipill.auto:hover,.ipill.auto[aria-expanded=true],.cp-bar .ipill.auto:hover,.cp-bar .ipill.auto[aria-expanded=true]{background:color-mix(in oklab,var(--auto-fg) 16%,var(--bg))}.ipill.auto svg{color:var(--auto-fg)}.mi.warn .sm-label{color:var(--auto-fg)}.ipill.static{cursor:default}.mode-menu{max-width:300px}.cp-div{width:1px;height:14px;background:var(--line);margin:0 4px;flex:none}.cp-bar>.ibtn{flex:none}.cp-attach{color:var(--pill-fg, var(--muted))}.cp-card{container-type:inline-size;container-name:composer}@container composer (max-width: 520px){.pill .p-t{display:none}.pill{max-width:min(160px,100%)}.ipill .ip-l{max-width:64px}}@container composer (max-width: 380px){.pill{max-width:min(120px,100%);padding:0 6px}.ipill .ip-l{display:none}}.pop{position:absolute;bottom:32px;left:0;z-index:55;width:260px;background:var(--bg);border-radius:var(--r-m);box-shadow:var(--shadow-pop);padding:4px;max-height:60vh;overflow-y:auto}.agent-picker{width:min(300px,calc(100vw - 32px));padding:0;overflow:hidden;display:flex;flex-direction:column;max-height:min(420px,60vh)}.agent-picker .ap-search{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--line);flex:none;color:var(--muted)}.agent-picker .ap-search-in{flex:1;min-width:0;border:0;background:none;outline:none;font-size:var(--fs-s);color:var(--fg)}.agent-picker .ap-search-in::placeholder{color:var(--muted)}.agent-picker .ap-scroll{overflow-y:auto;padding:4px;flex:1;min-height:0}.agent-picker .ap-empty{padding:12px 10px;font-size:var(--fs-s);color:var(--muted);text-align:center}.agent-picker .ap-back{font-weight:600;margin-bottom:2px}.agent-picker .ap-back-icon{display:inline-flex;transform:rotate(180deg);margin-right:2px}.agent-picker .mi-row{display:flex;align-items:center;gap:6px;width:100%;text-align:left}.agent-picker .provider-pick-row{justify-content:space-between;gap:8px}.agent-picker .provider-pick-name{flex:0 1 auto;min-width:5.5rem;max-width:58%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;color:inherit}.agent-picker .provider-pick-meta{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:flex-end;gap:6px;min-width:0;margin-left:auto}.agent-picker .provider-pick-meta .dlg-hint{flex:none;font-size:10px;max-width:5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-picker .mi-row .mi-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-picker .mi-row .mi-sub{flex:none;max-width:38%;font-size:var(--fs-xs);color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-picker .model-pick-row{min-width:0}.agent-picker .model-pick-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-picker .model-pick-default{flex:0 1 58%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-picker .mi-meta{flex:none;font-size:var(--fs-xs);color:var(--muted);white-space:nowrap}.agent-picker .mi-tag{flex:none;font-size:10px;color:var(--accent)}.agent-picker .mi-caret{flex:none;color:var(--muted);display:inline-flex}.agent-picker .mi-check{flex:none;margin-left:auto;color:var(--accent)}.ap-sec{padding:4px 0}.ap-sec .tinput{height:26px;margin-bottom:4px}.ap-sec .mi{height:26px;font-size:var(--fs-s)}.att-bar{display:flex;flex-wrap:wrap;gap:6px;padding:0 0 6px}.att{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 8px;background:var(--surface-hover);border-radius:var(--r-s);font-size:var(--fs-s)}.att img{width:22px;height:22px;object-fit:cover;border-radius:4px}.att.up{opacity:.6}.att-name{max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.att-x{color:var(--muted);font-size:14px;line-height:1}.att-x:hover{color:var(--fg)}.cp-right{margin-left:auto;flex:none;display:flex;align-items:center;gap:8px}.cp-clock{font-size:var(--fs-s);color:var(--meta);font-variant-numeric:tabular-nums}.cp-send,.cp-stop{width:30px;height:30px;border-radius:50%;flex:none;display:inline-flex;align-items:center;justify-content:center;transition:filter var(--dur-1),opacity var(--dur-1)}.cp-send{background:var(--accent);color:var(--accent-fg)}.cp-send:hover{filter:brightness(1.08)}.cp-send[disabled]{opacity:.35;cursor:default;filter:none}.cp-stop{background:var(--fg);color:var(--bg)}.cp-stop:hover{filter:brightness(1.15)}@media(max-width:560px){.composer{padding:0 10px 10px}}.cp-card.drop-on{outline:1.5px dashed var(--cp-focus);outline-offset:2px}.cp-drop-hint{padding:4px 10px 0;font-size:var(--fs-s);color:var(--muted)}.att-bar .mention{height:24px}.qchip{display:inline-flex;align-items:center;gap:5px;height:24px;max-width:260px;padding:0 4px 0 8px;border-radius:6px;background:var(--surface-hover);color:var(--fg);font-size:var(--fs-s);min-width:0;border-left:2px solid color-mix(in oklab,var(--fg) 35%,transparent)}.qchip svg{flex:none;color:var(--muted)}.qchip-t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qchip-n{flex:none;color:var(--meta)}.qchip .att-x{flex:none;width:18px;height:18px;border-radius:4px}.qchip .att-x:hover{background:color-mix(in oklab,var(--fg) 10%,transparent)}.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;inset:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;inset:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}
|
|
2
2
|
/*! Bundled license information:
|
|
3
3
|
|
|
4
4
|
@xterm/xterm/css/xterm.css:
|