leduo-patrol 1.0.0 → 1.1.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 +17 -6
- package/dist/server/__tests__/launch-mode.test.js +17 -0
- package/dist/server/index.js +11 -7
- package/dist/server/launch-mode.js +109 -0
- package/dist/server/session-manager.js +4 -0
- package/dist/web/assets/{index-yhylkmhc.css → index-dLCw4V-i.css} +1 -1
- package/dist/web/assets/index-ki8toOFB.js +32 -0
- package/dist/web/index.html +2 -2
- package/package.json +8 -4
- package/dist/web/assets/index-BbPJ87hi.js +0 -33
package/README.md
CHANGED
|
@@ -83,12 +83,11 @@
|
|
|
83
83
|
- **目录浏览**:创建会话时可在允许根目录范围内浏览子目录,安全限制越权访问
|
|
84
84
|
|
|
85
85
|
### 工具与集成
|
|
86
|
-
- **VS Code Remote SSH**:侧边栏提供快捷按钮,一键在 VS Code 中打开远程目录(需配置环境变量)
|
|
87
86
|
- **内置终端**:下方可展开终端抽屉,通过 xterm.js 提供完整 PTY 终端体验(需服务端开启 `LEDUO_ENABLE_SHELL=true`)
|
|
88
87
|
|
|
89
88
|
### 界面与可访问性
|
|
90
89
|
- **访问 Key 认证**:所有请求(HTTP / WebSocket)均需携带 key;浏览器检测到无效 key 时展示输入页
|
|
91
|
-
- **Toast
|
|
90
|
+
- **Toast 通知**:后台事件(新会话、错误、会话恢复)以站内 toast 形式非侵入提示,支持跳转
|
|
92
91
|
- **错误聚合**:全局错误指示器汇总所有应用级错误,点击查看详情
|
|
93
92
|
- **键盘友好**:所有交互元素均有 focus-visible 样式,tab 与会话列表支持完整 ARIA 语义
|
|
94
93
|
- **响应式过渡**:状态切换(tab、会话选中、按钮 hover)均有平滑过渡动画
|
|
@@ -103,11 +102,21 @@
|
|
|
103
102
|
|
|
104
103
|
```bash
|
|
105
104
|
npm install
|
|
105
|
+
# 服务器模式(远程可访问,默认)
|
|
106
106
|
npm run dev
|
|
107
|
+
|
|
108
|
+
# 本地模式(仅监听 127.0.0.1)
|
|
109
|
+
npm run dev:local
|
|
107
110
|
```
|
|
108
111
|
|
|
109
112
|
默认情况下:
|
|
110
113
|
|
|
114
|
+
- 启动模式支持两种:
|
|
115
|
+
- `server`(默认):监听 `0.0.0.0`,便于远程连接
|
|
116
|
+
- `local`:监听 `127.0.0.1`,仅本机可访问
|
|
117
|
+
- 可通过命令行参数 `--mode=local|server` 或环境变量 `LEDUO_PATROL_BIND_MODE` 指定,命令行参数优先级更高
|
|
118
|
+
- 若未显式指定,启动时会在终端提示选择模式;并可选择记住到 `~/.leduo-patrol/launch-preferences.json`,后续自动复用
|
|
119
|
+
|
|
111
120
|
- 前端开发服务运行在自动探测到的可访问内网 IP(优先 `bond* / eth* / ens* / enp*` 网卡)上
|
|
112
121
|
- 后端服务运行在 `PORT`(默认 `3001`,端口冲突时会自动递增寻找可用端口)
|
|
113
122
|
- 启动日志只打印一个推荐访问地址,避免 `br-*`、`veth*` 等虚拟网卡地址干扰
|
|
@@ -120,7 +129,12 @@ npm run dev
|
|
|
120
129
|
|
|
121
130
|
```bash
|
|
122
131
|
npm run build
|
|
132
|
+
|
|
133
|
+
# 服务器模式(远程可访问,默认)
|
|
123
134
|
npm start
|
|
135
|
+
|
|
136
|
+
# 本地模式(仅监听 127.0.0.1)
|
|
137
|
+
npm run start:local
|
|
124
138
|
```
|
|
125
139
|
|
|
126
140
|
> 开发者向的编程与验证测试技巧请见 `AGENTS.md`。
|
|
@@ -130,19 +144,16 @@ npm start
|
|
|
130
144
|
```bash
|
|
131
145
|
PORT=3001
|
|
132
146
|
LEDUO_PATROL_WEB_PORT=5173
|
|
147
|
+
LEDUO_PATROL_BIND_MODE=server
|
|
133
148
|
LEDUO_PATROL_APP_NAME=乐多汪汪队
|
|
134
149
|
LEDUO_PATROL_WORKSPACE_PATH=/absolute/workspace/path
|
|
135
150
|
LEDUO_PATROL_ALLOWED_ROOTS=/absolute/workspace/path,/another/allowed/root
|
|
136
|
-
LEDUO_PATROL_SSH_HOST=user@example-host
|
|
137
|
-
LEDUO_PATROL_SSH_PATH=/absolute/workspace/path
|
|
138
|
-
LEDUO_PATROL_VSCODE_URI=vscode://vscode-remote/ssh-remote+user@example-host/absolute/workspace/path
|
|
139
151
|
ANTHROPIC_API_KEY=sk-...
|
|
140
152
|
LEDUO_PATROL_ACCESS_KEY=your-fixed-key
|
|
141
153
|
LEDUO_PATROL_AGENT_BIN=/absolute/path/to/claude-code-acp
|
|
142
154
|
LEDUO_ENABLE_SHELL=true
|
|
143
155
|
```
|
|
144
156
|
|
|
145
|
-
如果未设置 `LEDUO_PATROL_VSCODE_URI`,但设置了 `LEDUO_PATROL_SSH_HOST`,服务会自动生成一个 VS Code Remote SSH 链接。
|
|
146
157
|
如果设置了 `LEDUO_PATROL_ALLOWED_ROOTS`,网页中只能连接这些根目录之下的路径;未设置时默认只允许启动命令所在目录。
|
|
147
158
|
如果未设置 `LEDUO_PATROL_WORKSPACE_PATH`,默认工作目录为启动命令所在目录(`process.cwd()`),并在启动日志中提示如何通过环境变量修改。
|
|
148
159
|
如果未设置 `LEDUO_PATROL_ALLOWED_ROOTS`,默认允许根目录同样为启动命令所在目录,并会在启动日志中提示可配置项。
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { launchModeTestables } from "../launch-mode.js";
|
|
4
|
+
test("launch mode parseBindMode accepts local/server", () => {
|
|
5
|
+
assert.equal(launchModeTestables.parseBindMode("local"), "local");
|
|
6
|
+
assert.equal(launchModeTestables.parseBindMode("SERVER"), "server");
|
|
7
|
+
});
|
|
8
|
+
test("launch mode parseBindMode rejects invalid values", () => {
|
|
9
|
+
assert.equal(launchModeTestables.parseBindMode(""), null);
|
|
10
|
+
assert.equal(launchModeTestables.parseBindMode("lan"), null);
|
|
11
|
+
assert.equal(launchModeTestables.parseBindMode(undefined), null);
|
|
12
|
+
});
|
|
13
|
+
test("launch mode readOptionValue supports --mode=value and --mode value", () => {
|
|
14
|
+
assert.equal(launchModeTestables.readOptionValue(["--mode=local"], "--mode"), "local");
|
|
15
|
+
assert.equal(launchModeTestables.readOptionValue(["--mode", "server"], "--mode"), "server");
|
|
16
|
+
assert.equal(launchModeTestables.readOptionValue(["--foo", "bar"], "--mode"), undefined);
|
|
17
|
+
});
|
package/dist/server/index.js
CHANGED
|
@@ -12,6 +12,7 @@ import { ShellSession } from "./shell-session.js";
|
|
|
12
12
|
import { buildSingleFileDiff, buildWorkspaceDiffFilesSnapshot } from "./git-diff.js";
|
|
13
13
|
import { buildAccessCookie, createAccessKey, hasAuthorizedAccessCookie, isAccessKeyAuthorized } from "./access-key.js";
|
|
14
14
|
import { findAvailablePort, pickPreferredLanIp } from "./network.js";
|
|
15
|
+
import { resolveBindMode } from "./launch-mode.js";
|
|
15
16
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
16
17
|
const launchCwd = process.cwd();
|
|
17
18
|
const defaultWorkspacePath = process.env.LEDUO_PATROL_WORKSPACE_PATH ?? launchCwd;
|
|
@@ -27,6 +28,8 @@ const vscodeRemoteUri = process.env.LEDUO_PATROL_VSCODE_URI ??
|
|
|
27
28
|
const requestedPort = Number(process.env.PORT ?? 3001);
|
|
28
29
|
const devWebPort = Number(process.env.LEDUO_PATROL_WEB_PORT ?? 5173);
|
|
29
30
|
const isDevServer = process.env.npm_lifecycle_event === "dev:server";
|
|
31
|
+
const bindMode = await resolveBindMode();
|
|
32
|
+
const listenHost = bindMode === "local" ? "127.0.0.1" : "0.0.0.0";
|
|
30
33
|
const agentBinPath = resolveAgentBinPath();
|
|
31
34
|
const accessKey = process.env.LEDUO_PATROL_ACCESS_KEY?.trim() || createAccessKey();
|
|
32
35
|
const enableShell = process.env.LEDUO_ENABLE_SHELL === "true";
|
|
@@ -262,26 +265,27 @@ wss.on("connection", (socket, request) => {
|
|
|
262
265
|
shellSession = null;
|
|
263
266
|
});
|
|
264
267
|
});
|
|
265
|
-
const listenPort = await findAvailablePort(requestedPort);
|
|
268
|
+
const listenPort = await findAvailablePort(requestedPort, listenHost);
|
|
266
269
|
await new Promise((resolve) => {
|
|
267
|
-
server.listen(listenPort,
|
|
270
|
+
server.listen(listenPort, listenHost, () => resolve());
|
|
268
271
|
});
|
|
269
|
-
const
|
|
272
|
+
const displayHost = bindMode === "local" ? "127.0.0.1" : pickPreferredLanIp();
|
|
270
273
|
const accessPort = isDevServer ? devWebPort : listenPort;
|
|
271
|
-
console.log(
|
|
274
|
+
console.log(`Launch mode: ${bindMode === "local" ? "local (127.0.0.1 only)" : "server (remote accessible)"}`);
|
|
275
|
+
console.log(`${appName} server listening on http://${displayHost}:${listenPort}`);
|
|
272
276
|
if (listenPort !== requestedPort) {
|
|
273
277
|
console.log(`Port ${requestedPort} is busy, switched to ${listenPort}`);
|
|
274
278
|
}
|
|
275
279
|
if (isDevServer) {
|
|
276
|
-
console.log(`Dev Web URL (Vite default): http://${
|
|
280
|
+
console.log(`Dev Web URL (Vite default): http://${displayHost}:${devWebPort}`);
|
|
277
281
|
}
|
|
278
282
|
else if (hasBundledWeb) {
|
|
279
|
-
console.log(`Web UI is served by the same server port: http://${
|
|
283
|
+
console.log(`Web UI is served by the same server port: http://${displayHost}:${listenPort}`);
|
|
280
284
|
}
|
|
281
285
|
else {
|
|
282
286
|
console.log("Web UI is unavailable on this start because bundled assets are missing.");
|
|
283
287
|
}
|
|
284
|
-
console.log(`Access URL: http://${
|
|
288
|
+
console.log(`Access URL: http://${displayHost}:${accessPort}/?key=${accessKey}`);
|
|
285
289
|
function sendEvent(socket, event) {
|
|
286
290
|
if (socket.readyState !== WebSocket.OPEN) {
|
|
287
291
|
return;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { access, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
4
|
+
import readline from "node:readline/promises";
|
|
5
|
+
const DEFAULT_MODE = "server";
|
|
6
|
+
const PREFS_FILE_PATH = path.join(os.homedir(), ".leduo-patrol", "launch-preferences.json");
|
|
7
|
+
export async function resolveBindMode(options = {}) {
|
|
8
|
+
const argv = options.argv ?? process.argv.slice(2);
|
|
9
|
+
const stdin = options.stdin ?? process.stdin;
|
|
10
|
+
const stdout = options.stdout ?? process.stdout;
|
|
11
|
+
const argvMode = parseBindMode(readOptionValue(argv, "--mode"));
|
|
12
|
+
if (argvMode) {
|
|
13
|
+
return argvMode;
|
|
14
|
+
}
|
|
15
|
+
const envMode = parseBindMode(options.envMode ?? process.env.LEDUO_PATROL_BIND_MODE);
|
|
16
|
+
if (envMode) {
|
|
17
|
+
return envMode;
|
|
18
|
+
}
|
|
19
|
+
const rememberedMode = await loadRememberedMode();
|
|
20
|
+
if (rememberedMode) {
|
|
21
|
+
return rememberedMode;
|
|
22
|
+
}
|
|
23
|
+
if (!stdin.isTTY || !stdout.isTTY) {
|
|
24
|
+
return DEFAULT_MODE;
|
|
25
|
+
}
|
|
26
|
+
const selectedMode = await promptForMode(stdin, stdout);
|
|
27
|
+
const shouldRemember = await promptShouldRemember(stdin, stdout);
|
|
28
|
+
if (shouldRemember) {
|
|
29
|
+
await saveRememberedMode(selectedMode);
|
|
30
|
+
stdout.write(`已记住启动模式:${selectedMode}\n`);
|
|
31
|
+
}
|
|
32
|
+
return selectedMode;
|
|
33
|
+
}
|
|
34
|
+
function parseBindMode(raw) {
|
|
35
|
+
if (!raw) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const normalized = raw.trim().toLowerCase();
|
|
39
|
+
if (normalized === "local" || normalized === "server") {
|
|
40
|
+
return normalized;
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
function readOptionValue(argv, optionName) {
|
|
45
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
46
|
+
const arg = argv[i];
|
|
47
|
+
if (arg === optionName) {
|
|
48
|
+
return argv[i + 1];
|
|
49
|
+
}
|
|
50
|
+
if (arg.startsWith(`${optionName}=`)) {
|
|
51
|
+
return arg.slice(`${optionName}=`.length);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
async function promptForMode(stdin, stdout) {
|
|
57
|
+
const rl = readline.createInterface({ input: stdin, output: stdout });
|
|
58
|
+
try {
|
|
59
|
+
stdout.write("\n请选择启动模式:\n");
|
|
60
|
+
stdout.write(" 1) 服务器模式(server,监听 0.0.0.0,可远程连接)\n");
|
|
61
|
+
stdout.write(" 2) 本地模式(local,监听 127.0.0.1,仅本机访问)\n");
|
|
62
|
+
const answer = (await rl.question("输入 1/2,默认 1: ")).trim();
|
|
63
|
+
return answer === "2" || answer.toLowerCase() === "local" ? "local" : "server";
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
rl.close();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function promptShouldRemember(stdin, stdout) {
|
|
70
|
+
const rl = readline.createInterface({ input: stdin, output: stdout });
|
|
71
|
+
try {
|
|
72
|
+
const answer = (await rl.question("是否记住此模式用于后续启动?(y/N): ")).trim().toLowerCase();
|
|
73
|
+
return answer === "y" || answer === "yes";
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
rl.close();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function loadRememberedMode() {
|
|
80
|
+
if (!(await isReadable(PREFS_FILE_PATH))) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const raw = await readFile(PREFS_FILE_PATH, "utf8");
|
|
85
|
+
const parsed = JSON.parse(raw);
|
|
86
|
+
return parseBindMode(parsed.bindMode ?? "");
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function saveRememberedMode(mode) {
|
|
93
|
+
await mkdir(path.dirname(PREFS_FILE_PATH), { recursive: true });
|
|
94
|
+
const payload = { bindMode: mode };
|
|
95
|
+
await writeFile(PREFS_FILE_PATH, JSON.stringify(payload, null, 2), "utf8");
|
|
96
|
+
}
|
|
97
|
+
async function isReadable(filePath) {
|
|
98
|
+
try {
|
|
99
|
+
await access(filePath);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export const launchModeTestables = {
|
|
107
|
+
parseBindMode,
|
|
108
|
+
readOptionValue,
|
|
109
|
+
};
|
|
@@ -86,6 +86,8 @@ export class SessionManager {
|
|
|
86
86
|
clientSessionId: existingEntry.snapshot.clientSessionId,
|
|
87
87
|
title: existingEntry.snapshot.title,
|
|
88
88
|
workspacePath: existingEntry.snapshot.workspacePath,
|
|
89
|
+
defaultModeId: existingEntry.snapshot.defaultModeId,
|
|
90
|
+
currentModeId: existingEntry.snapshot.currentModeId,
|
|
89
91
|
},
|
|
90
92
|
});
|
|
91
93
|
return existingEntry.snapshot;
|
|
@@ -121,6 +123,8 @@ export class SessionManager {
|
|
|
121
123
|
clientSessionId: snapshot.clientSessionId,
|
|
122
124
|
title: snapshot.title,
|
|
123
125
|
workspacePath: snapshot.workspacePath,
|
|
126
|
+
defaultModeId: snapshot.defaultModeId,
|
|
127
|
+
currentModeId: snapshot.currentModeId,
|
|
124
128
|
},
|
|
125
129
|
});
|
|
126
130
|
await this.connectSession(entry);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{color-scheme:light;font-family:IBM Plex Sans,PingFang SC,Hiragino Sans GB,sans-serif;--bg: #f4efe6;--panel: rgba(255, 250, 242, .88);--line: rgba(58, 45, 33, .12);--text: #24180e;--muted: #6c5c4d;--brand: #d85b34;--brand-dark: #8f2d1e;--accent: #17756d;--shadow: 0 24px 80px rgba(64, 41, 19, .12);font-size:12px}*{box-sizing:border-box}body{margin:0;height:100vh;color:var(--text);background:radial-gradient(circle at top left,rgba(255,216,177,.9),transparent 28%),radial-gradient(circle at top right,rgba(111,182,173,.22),transparent 26%),linear-gradient(135deg,#f8f1e7,#efe5d9 48%,#efece6);overflow:hidden}button,textarea,input,select{font:inherit}button{cursor:pointer;border:0}code,pre{font-family:IBM Plex Mono,SFMono-Regular,monospace}#root{height:100vh}.access-gate{display:flex;align-items:center;justify-content:center;height:100vh;padding:16px}.access-card{width:min(520px,100%);padding:24px;display:grid;gap:12px}.access-card input{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#ffffffeb}.shell{display:grid;grid-template-columns:280px minmax(0,1fr) 280px;gap:12px;height:100vh;padding:12px}.panel{border:1px solid var(--line);border-radius:20px;background:var(--panel);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);box-shadow:var(--shadow);overflow:hidden}.masthead,.approvals{display:flex;flex-direction:column;padding:14px;min-height:0}.eyebrow{margin:0 0 8px;color:var(--brand-dark);font-size:12px;letter-spacing:.18em;text-transform:uppercase}h1,h2,h3,p{margin:0}h1{font-size:24px;line-height:1;font-weight:700}.lede{margin-top:8px;color:var(--muted);line-height:1.45;font-size:12px}.masthead-intro{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;flex-shrink:0}.brand-lockup{display:flex;align-items:flex-start;gap:10px;min-width:0}.brand-stack,.brand-copy{min-width:0}.masthead-lede{margin-top:8px}.brand-icon{width:44px;height:44px;flex:0 0 44px;border-radius:10px;border:1px solid var(--line);background:#fffffff2;object-fit:cover;box-shadow:0 8px 18px #2d1a0b29}.error-indicator{flex:0 0 auto;min-width:24px;height:24px;padding:0 6px;display:inline-flex;align-items:center;justify-content:center;gap:4px;border:1px solid rgba(177,59,47,.18);border-radius:999px;background:#c9304a1a;color:#9d2131;transition:transform .16s ease,background .16s ease,border-color .16s ease}.error-indicator:hover{transform:translateY(-1px);background:#c9304a29;border-color:#b13b2f52}.error-indicator-dot{width:8px;height:8px;border-radius:999px;background:currentColor;box-shadow:0 0 0 4px #c9304a1f}.error-indicator-count{font-size:10px;font-weight:700;line-height:1}.status-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-top:14px;flex-shrink:0}.status-card,.details,.approval-card,.composer,.bubble,.empty{border:1px solid var(--line);border-radius:14px;background:#ffffffb3}.status-card{padding:10px}.status-card span{display:block;color:var(--muted);font-size:11px;margin-bottom:4px}.status-card strong{display:block;font-size:12px;line-height:1.25;overflow-wrap:anywhere}.status-card-positive strong{color:#1f7a45}.status-card-negative strong{color:#b13b2f}.details{margin-top:10px;padding:12px;min-height:0}.details p,.details label{color:var(--muted);margin-bottom:6px}.details label{display:block;cursor:default}.details code{display:block;margin-bottom:10px;white-space:pre-wrap;font-size:11px;line-height:1.35}.details input,.details select,.composer select{width:100%;margin-bottom:10px;padding:8px 10px;border:1px solid var(--line);border-radius:10px;background:#ffffffe6;color:var(--text);font-size:12px}.actions{display:grid;gap:8px;margin-top:10px;padding-top:0}.actions.compact{margin-top:0;padding-top:0}.inline-actions{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:10px}.sidebar-tabs{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-top:10px;flex-shrink:0}.sidebar-tab{padding:8px 10px;border:1px solid var(--line);border-radius:10px;background:#ffffff9e;color:var(--muted);font-weight:400;transition:background .15s ease,border-color .15s ease,color .15s ease,box-shadow .15s ease}.sidebar-tab:not(.active):hover{background:#ffffffe0;border-color:#3a2d2138;color:var(--text)}.sidebar-tab:focus-visible{outline:2px solid var(--brand);outline-offset:2px}.sidebar-tab.active{background:#d85b3433;border-color:#d85b348c;color:var(--brand-dark);font-weight:600;box-shadow:0 1px 6px #d85b3424}.sidebar-body{display:flex;flex:1;min-height:0;margin-top:10px}.tab-panel{display:flex;flex:1;flex-direction:column;gap:8px;min-height:0}.create-panel{gap:6px}.create-panel .details{padding:10px}.create-panel .details p,.create-panel .details label{margin-bottom:4px;font-size:10px}.create-panel .details code{margin-bottom:8px;font-size:10px;line-height:1.3}.create-panel .details input,.create-panel .details select{margin-bottom:8px;padding:7px 9px;font-size:11px}.create-panel .inline-actions{gap:5px;margin-bottom:8px}.create-panel .primary,.create-panel .secondary{padding:9px 10px;font-size:11px}.tab-panel.fill .session-list{margin-top:0}.primary,.secondary{padding:10px 12px;border-radius:12px;transition:transform .16s ease,opacity .16s ease,background .16s ease}.primary{background:linear-gradient(135deg,var(--brand) 0%,#ef8852 100%);color:#fff7f0}.secondary{background:#17756d1f;color:var(--accent)}.primary:hover,.secondary:hover{transform:translateY(-1px)}.primary:disabled,.secondary:disabled{cursor:not-allowed;opacity:.45;transform:none}.transcript{display:grid;grid-template-rows:auto 1fr auto;min-height:0}.transcript-header{padding:14px 14px 10px}.transcript-header p{margin-top:8px;color:var(--muted)}.transcript-header h2{overflow-wrap:anywhere;word-break:break-word}.timeline{padding:0 14px 10px;overflow:auto;display:flex;flex-direction:column;gap:6px;min-height:0}.history-loader{width:100%;padding:7px 10px;font-size:11px;text-align:center}.bubble,.approval-card,.empty{padding:10px 12px}.approval-card pre{margin:0;white-space:pre-wrap;word-break:break-word;font-size:11px;line-height:1.45}.bubble.user{background:#d85b341f}.bubble.agent{background:#ffffffe6}.bubble.tool{background:#17756d1a}.bubble.error{background:#a02c201f}.bubble.thought{background:#8f2d1e14}.composer{margin:0 14px 14px;padding:10px}.composer-pending-placeholder{color:var(--text);background:linear-gradient(180deg,#fff3e5f5,#fff9f1e6);border-color:#d85b3452;box-shadow:0 8px 22px #d85b341f;font-size:11px;line-height:1.5}.composer-pending-title{margin-bottom:8px;font-size:11px;letter-spacing:.08em;text-transform:uppercase}.composer-pending-list{display:flex;flex-direction:column;gap:8px}.composer-pending-item{padding:8px;border:1px solid rgba(216,91,52,.24);border-radius:10px;background:#ffffffd6}.composer-pending-tool{margin-bottom:6px;color:var(--text);font-size:11px}.composer-mode-row{display:flex;align-items:center;gap:8px}.composer-mode-row span{color:var(--muted);flex-shrink:0}.composer-mode-row select{margin-bottom:0}.composer-pending-note-row{margin-top:6px;display:flex;gap:6px;align-items:center}.composer-pending-note-row input{flex:1;min-width:0;padding:6px 8px;border:1px solid rgba(58,45,33,.18);border-radius:8px;background:#fffffff5;color:var(--text);font-size:11px}.composer-pending-note-row .secondary{margin-top:0;width:auto;padding:6px 10px}.composer-pending-preview{margin:0 0 6px;max-height:120px;overflow:auto;padding:6px 8px;border-radius:8px;border:1px solid rgba(58,45,33,.16);background:#ffffffeb;font-size:10px;line-height:1.4;white-space:pre-wrap;word-break:break-word}.session-plan-preview{margin:0;max-height:280px;overflow:auto;padding:10px;border:1px solid var(--line);border-radius:10px;background:#ffffffdb;font-size:11px;line-height:1.45;white-space:pre-wrap;word-break:break-word}.session-plan-list{margin:0;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#ffffffdb;list-style:none;display:flex;flex-direction:column;gap:8px;max-height:280px;overflow:auto}.session-plan-list-item{display:flex;align-items:flex-start;gap:8px;font-size:11px;line-height:1.45}.session-plan-content{flex:1;word-break:break-word}.session-plan-status{margin-top:1px;width:14px;height:14px;border-radius:999px;border:1.5px solid rgba(58,45,33,.45);flex:0 0 14px;position:relative}.session-plan-status-completed{background:#4aab7029;border-color:#348756e6}.session-plan-status-completed:after{content:"";position:absolute;left:3px;top:1px;width:4px;height:7px;border:solid rgba(52,135,86,.95);border-width:0 2px 2px 0;transform:rotate(45deg)}.session-plan-status-in_progress{border-color:#2b60a5e6;border-top-color:#2b60a533;animation:session-plan-spin .9s linear infinite}.session-plan-status-pending,.session-plan-status-unknown{background:transparent}@keyframes session-plan-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.composer-pending-actions{display:flex;flex-wrap:wrap;gap:6px}.composer-pending-actions .secondary{width:auto;margin-top:0;padding:6px 10px}.composer-pending-queue{margin:0 0 8px;padding:8px 10px;border:1px solid rgba(58,45,33,.16);border-radius:10px;background:#fffaf2eb;font-size:11px}.composer-pending-queue-title{margin:0 0 6px;font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.composer-pending-queue-list{display:flex;flex-direction:column;gap:6px;max-height:160px;overflow-y:auto}.composer-pending-queue-item{display:flex;align-items:flex-start;gap:8px;padding:6px 8px;border:1px solid rgba(58,45,33,.12);border-radius:8px;background:#ffffffe0}.composer-pending-queue-text{flex:1;min-width:0;margin:0;font-size:11px;line-height:1.4;color:var(--text);white-space:pre-wrap;word-break:break-word;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.composer-pending-queue-actions{display:flex;gap:4px;flex-shrink:0}.composer-pending-queue-btn{padding:3px 7px;border-radius:6px;border:1px solid rgba(58,45,33,.2);background:#ffffffe6;color:var(--muted);font-size:10px;cursor:pointer;line-height:1.4;transition:background .12s,color .12s}.composer-pending-queue-btn:hover{background:#3a2d2114;color:var(--text)}.composer-pending-queue-btn-delete{border-color:#d85b344d;color:var(--brand)}.composer-pending-queue-btn-delete:hover{background:#d85b341a;color:var(--brand-dark)}.composer textarea{width:100%;min-height:72px;resize:vertical;border:0;background:transparent;outline:none;color:var(--text);font-size:12px;line-height:1.4}.composer-capability-summary{margin:6px 0;color:var(--muted);font-size:10px}.composer-input-shell{position:relative}.composer-image-previews{display:flex;flex-direction:column;gap:4px;padding:6px 0 4px}.composer-image-preview{display:flex;align-items:center;gap:8px;flex-shrink:0}.composer-image-preview-thumb{width:64px;height:48px;border-radius:6px;overflow:hidden;border:1px solid rgba(58,45,33,.16);background:#3a2d210f;flex-shrink:0}.composer-image-preview img{display:block;width:100%;height:100%;object-fit:cover}.composer .composer-image-preview-remove{flex-shrink:0;flex-grow:0;width:auto;margin-top:0;padding:2px 8px;border-radius:4px;border:1px solid rgba(58,45,33,.25);background:transparent;color:#3a2d2199;font-size:12px;line-height:1.4;cursor:pointer;white-space:nowrap;transition:background .12s,color .12s,border-color .12s}.composer .composer-image-preview-remove:hover{background:#c8371414;color:#c83714d9;border-color:#c8371459}.composer-pending-queue-images{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:4px}.composer-pending-queue-img{display:block;max-width:48px;max-height:48px;border-radius:4px;border:1px solid rgba(58,45,33,.16);object-fit:cover}.composer-completions{margin:0 0 8px;display:flex;flex-direction:column;gap:4px;max-height:200px;overflow:auto;border:1px solid var(--line);border-radius:10px;background:#fffffff2;padding:6px;box-shadow:inset 0 1px #ffffff80}.composer-completion-section{display:flex;flex-direction:column;gap:4px}.composer-completion-section-title{margin:2px 4px;font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}.composer-completion-item{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;border:1px solid transparent;border-radius:8px;background:#ffffffb8;color:var(--text);text-align:left}.composer-completion-item span{font-family:IBM Plex Mono,SFMono-Regular,monospace;font-size:11px}.composer-completion-item small{color:var(--muted);font-size:10px;line-height:1.2;text-align:right}.composer-completion-match{color:var(--brand-dark)}.composer-completion-rest{color:var(--text)}.composer-completion-item.active{border-color:#d85b3466;background:#d85b341f}.composer button{margin-top:8px;width:100%}.composer-actions{margin-top:8px;display:flex;align-items:center;gap:8px}.composer-actions .primary{margin-top:0;flex:1}.composer-actions .composer-cancel{margin-top:0;width:auto;min-width:0;padding:6px 9px;font-size:10px;line-height:1;display:inline-flex;align-items:center;gap:4px}.approvals{gap:8px}.session-list{display:flex;flex-direction:column;gap:6px;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;min-height:0;flex:1;padding-right:2px}.session-chip{display:flex;flex-shrink:0;flex-direction:column;gap:6px;width:100%;padding:10px 12px;text-align:left;border:1px solid var(--line);border-radius:12px;background:#ffffffad;color:var(--text);min-width:0;overflow:hidden;transition:background .15s ease,border-color .15s ease,transform .1s ease,box-shadow .15s ease}.session-chip:hover:not(.active){background:#ffffffe6;border-color:#3a2d2138;transform:translateY(-1px);box-shadow:0 2px 8px #40291314}.session-chip:focus-visible{outline:2px solid var(--brand);outline-offset:2px}.session-chip-title{display:-webkit-box;min-width:0;overflow:hidden;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow-wrap:anywhere;word-break:break-word;font-size:13px;font-weight:600;line-height:1.35}.session-chip.active{background:#d85b3429;border-color:#d85b3485;box-shadow:inset 3px 0 0 var(--brand)}.session-chip-meta{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0}.session-chip-status{display:flex;align-items:center;gap:6px;min-width:0;flex:1}.session-chip-mode{display:inline-flex;align-items:center;min-width:0;max-width:100%;padding:2px 8px;border:1px solid rgba(66,43,26,.18);border-radius:999px;font-size:10px;line-height:1.35;color:var(--muted);background:#fff9;white-space:nowrap}.session-chip-tag{display:inline-flex;align-items:center;min-width:0;max-width:100%;padding:2px 8px;border:1px solid transparent;border-radius:999px;font-size:10px;line-height:1.35;white-space:nowrap}.session-chip-tag-pending{background:#d85b3424;border-color:#d85b344d;color:var(--brand-dark)}.session-chip-tag-running{background:#17756d24;border-color:#17756d47;color:var(--accent)}.session-chip-tag-completed{background:#422b1a1a;border-color:#422b1a29;color:var(--text)}.session-chip-tag-error{background:#a02c2024;border-color:#a02c2047;color:#9a1c1c}.session-chip-tag-connecting{background:#14628a1f;border-color:#14628a38;color:#0a5c88}.session-chip-time,.session-chip-path{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:11px;line-height:1.55}.session-chip-time{flex-shrink:0}.session-chip-path{width:100%;white-space:normal;overflow-wrap:anywhere;word-break:break-word;padding-bottom:2px}.session-meta{margin-top:0}.session-meta-card{display:flex;flex-direction:column;gap:10px;background:linear-gradient(180deg,#ffffffd1,#f8f2e9eb)}.session-meta-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.session-meta-actions{display:flex;align-items:center;gap:6px;flex-wrap:nowrap;justify-content:flex-end;margin-top:2px}.session-meta-actions .secondary{min-width:112px;height:36px;display:inline-flex;align-items:center;justify-content:center;padding:0 12px}.session-meta-header h3{font-size:16px;line-height:1.1}.session-close{background:#af282824;color:#9a1c1c}.session-diff-trigger{background:#14628a24;color:#0a5c88}.session-meta-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.session-meta-item{padding:10px;border:1px solid var(--line);border-radius:12px;background:#ffffffd1}.session-meta-item-wide{grid-column:1 / -1}.session-meta-item span{display:block;margin-bottom:4px;color:var(--muted);font-size:11px}.session-meta-item code{display:block;margin:0;overflow-wrap:anywhere;word-break:break-word}.session-meta-item select{width:100%;margin:0;padding:8px 10px;border:1px solid var(--line);border-radius:10px;background:#ffffffe6;color:var(--text);font-size:12px}.session-meta-note{margin:6px 0 0;color:var(--muted);font-size:11px;line-height:1.45}.approval-card h3{margin-bottom:8px;font-size:12px}.approval-stack{display:flex;flex-direction:column;gap:8px}.approval-card-active{border-color:#d85b3459;background:linear-gradient(180deg,#fff7f2f5,#f8efe6eb);box-shadow:0 10px 24px #8f2d1e14}.approval-label{margin-bottom:6px;color:var(--brand-dark);font-size:11px;letter-spacing:.08em;text-transform:uppercase}.approval-hint{color:var(--muted);font-size:11px;line-height:1.45}.approval-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}.empty{color:var(--muted);font-size:11px}.timeline-row{display:grid;grid-template-columns:minmax(108px,max-content) minmax(0,1fr) max-content;gap:8px;align-items:center;box-sizing:border-box;width:calc(100% - (var(--timeline-depth, 0) * 18px));margin-left:calc(var(--timeline-depth, 0) * 18px);min-width:0;padding:8px 10px;border:1px solid var(--line);border-radius:12px;background:#ffffffb8;color:var(--text);text-align:left}.timeline-row-multiline{align-items:start}.timeline-row .timeline-meta{font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.timeline-row .timeline-kind{display:flex;align-items:center;gap:6px;min-width:0;font-size:11px;white-space:nowrap}.timeline-row .timeline-fold{color:var(--muted);font-size:10px;border:1px solid var(--line);border-radius:999px;padding:1px 6px}.timeline-row .timeline-body{min-width:0;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timeline-row .timeline-body.multiline{white-space:pre-wrap;text-overflow:clip;line-height:1.4;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:10;overflow:hidden}.timeline-row .timeline-meta{color:var(--muted);text-align:right;padding-left:8px}.timeline-row.user{background:#9952d624;border-color:#7e3fbf47}.timeline-running-indicator{display:inline-flex;align-items:center;gap:8px;margin-top:4px;padding:8px 10px;border:1px dashed rgba(23,117,109,.35);border-radius:10px;color:var(--accent);font-size:11px;background:#17756d0f}.timeline-running-dot{width:8px;height:8px;border-radius:999px;background:currentColor;animation:timeline-pulse 1.1s ease-in-out infinite}@keyframes timeline-pulse{0%,to{opacity:.35;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}.timeline-row.tool{background:#17756d1a}.timeline-row.error{background:#a02c201f}.timeline-row.thought{background:#8f2d1e14}.modal-backdrop{position:fixed;inset:0;z-index:500;display:flex;align-items:center;justify-content:center;padding:20px;background:#21140c61}.modal-card{width:min(920px,100%);max-height:calc(100vh - 40px);display:flex;flex-direction:column;gap:0;padding:0;border:1px solid var(--line);border-radius:18px;background:#fffcf7fa;box-shadow:var(--shadow);overflow:hidden}.system-modal-card{width:min(760px,100%)}.modal-header{flex-shrink:0;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:14px 14px 10px;border-bottom:1px solid var(--line)}.modal-scroll-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:12px 14px 14px}.modal-scroll-body>*+*{margin-top:10px}.modal-footer{flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:10px 14px 14px;border-top:1px solid var(--line);background:#fffcf7fa}.modal-footer .secondary{margin-top:0;width:auto;padding:7px 14px}.modal-meta-padded{padding:8px 14px 0}.modal-actions-inline{display:flex;align-items:center;gap:6px}.diff-title-wrap{min-width:0}.diff-title-path{display:inline-block;margin-top:4px;padding:2px 8px;border-radius:999px;background:#422b1a17;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-btn-refresh{background:#14628a24;color:#0a5c88}.modal-btn-close{background:#af282824;color:#9a1c1c}.readonly-badge{display:inline-block;margin-left:8px;padding:2px 8px;border-radius:999px;border:1px solid rgba(159,36,36,.35);background:#af28281f;color:#9a1c1c;font-size:10px;vertical-align:middle}.modal-meta{color:var(--muted);font-size:11px}.modal-body{margin:0;padding:12px;overflow:auto;border:1px solid var(--line);border-radius:12px;background:#ffffffc7;white-space:pre-wrap;word-break:break-word;font-size:11px;line-height:1.5}.markdown-body{white-space:normal}.markdown-body>:first-child{margin-top:0}.markdown-body>:last-child{margin-bottom:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin:.8em 0 .35em;line-height:1.3}.markdown-body p,.markdown-body ul{margin:.45em 0}.markdown-body ul{padding-left:1.2em}.markdown-body code{padding:.1em .35em;border-radius:6px;background:#422b1a17;font-family:JetBrains Mono,SFMono-Regular,ui-monospace,Menlo,Monaco,Consolas,monospace}.markdown-body pre{margin:.6em 0;padding:10px;border:1px solid var(--line);border-radius:8px;background:#ffffffd1;overflow:auto}.markdown-body pre code{padding:0;background:transparent}.markdown-body table{width:100%;border-collapse:collapse;margin:.6em 0;font-size:11px}.markdown-body th,.markdown-body td{border:1px solid var(--line);padding:6px 8px;text-align:left;vertical-align:top}.markdown-body th{background:#422b1a14;font-weight:600}.diff-toolbar-tabs{display:flex;align-items:center;gap:6px;margin-bottom:8px;flex-wrap:wrap}.diff-toolbar-tabs select{min-width:240px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;background:#ffffffe6}.diff-tab{padding:7px 10px;border:1px solid var(--line);border-radius:10px;background:#ffffffb3;color:var(--muted)}.diff-tab.active{background:#d85b3429;border-color:#d85b3473;color:var(--brand-dark)}.diff-block{margin:.6em 0;padding:0;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:auto}.diff-block code{display:block;padding:0;background:transparent}.diff-line{display:block;padding:0 10px;white-space:pre}.diff-line-header{color:#7b4d22;background:#85593014}.diff-line-file,.diff-line-hunk{color:#005c99;background:#005c991a}.diff-line-add{color:#0d5d2a;background:#11974a29}.diff-line-remove{color:#8f1f2f;background:#c9304a29}.system-modal-list{display:flex;flex-direction:column;gap:6px;overflow:auto;min-height:0}@media(max-width:1100px){.shell{grid-template-columns:1fr;height:auto}.transcript{min-height:70vh}body{overflow:auto}}.terminal-drawer{position:fixed;bottom:0;left:0;right:0;z-index:200;border-top:1px solid var(--line);background:#1a1a1a;color:#e8e8e8;display:flex;flex-direction:column;box-shadow:0 -8px 32px #00000040;transition:height .2s ease;height:36px}.terminal-drawer-open{height:320px}.terminal-drawer-header{display:flex;align-items:center;gap:12px;padding:0 12px;height:36px;flex-shrink:0;border-bottom:1px solid rgba(255,255,255,.08)}.terminal-drawer-toggle{display:flex;align-items:center;gap:6px;background:transparent;color:#e8e8e8;font-size:12px;font-weight:600;padding:4px 8px;border-radius:6px;cursor:pointer;letter-spacing:.04em;transition:background .15s}.terminal-drawer-toggle:hover{background:#ffffff1a}.terminal-drawer-icon{font-size:10px;opacity:.7}.terminal-drawer-note{font-size:11px;color:#e8e8e880;font-family:IBM Plex Mono,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.terminal-viewport{flex:1;overflow:hidden;padding:4px 8px;min-height:0}.terminal-viewport .xterm{height:100%}.terminal-viewport .xterm-viewport{overflow-y:auto!important}.shell.multi-session{padding-bottom:48px}.toast-container{position:fixed;top:16px;right:16px;z-index:9000;display:flex;flex-direction:column;gap:8px;max-width:360px;pointer-events:none}.toast-item{display:flex;align-items:flex-start;gap:8px;background:#1e1e1e;border:1px solid rgba(255,255,255,.12);border-left:3px solid #555;border-radius:8px;padding:10px 12px;box-shadow:0 4px 20px #00000080;animation:toast-slide-in .2s ease;pointer-events:all}.toast-permission{border-left-color:#f59e0b}.toast-completion{border-left-color:#10b981}.toast-content{flex:1;min-width:0}.toast-content-clickable{background:none;border:none;padding:0;text-align:left;cursor:pointer}.toast-content-clickable:hover .toast-body{color:#e8e8e8e6}.toast-title{display:block;font-size:12px;font-weight:700;color:#e8e8e8;margin-bottom:3px}.toast-body{display:block;font-size:11px;color:#e8e8e8a6;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toast-dismiss{flex-shrink:0;background:none;border:none;color:#e8e8e859;cursor:pointer;font-size:18px;line-height:1;padding:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:color .15s,background .15s}.toast-dismiss:hover{color:#e8e8e8;background:#ffffff14}@keyframes toast-slide-in{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}.modal-attached-images{display:flex;flex-wrap:wrap;gap:8px;padding:8px 16px 0}.modal-attached-image{max-width:240px;max-height:180px;border-radius:6px;border:1px solid rgba(58,45,33,.16);object-fit:contain;background:#3a2d210a}.timeline-image-badge{margin-left:4px;font-size:11px;opacity:.65}.tool-detail-view{display:flex;flex-direction:column;gap:8px;min-height:0}.tool-detail-fields{display:flex;flex-direction:column;gap:6px;padding:10px 12px;border:1px solid var(--line);border-radius:12px;background:#ffffffc7}.tool-detail-row{display:flex;gap:10px;align-items:flex-start;font-size:11px;line-height:1.5}.tool-detail-key{flex:0 0 40px;color:var(--muted);font-size:10px;padding-top:2px;white-space:nowrap}.tool-detail-val{flex:1;min-width:0;word-break:break-word;color:var(--text)}.tool-detail-code{font-family:IBM Plex Mono,SFMono-Regular,monospace;font-size:10px;white-space:pre-wrap;word-break:break-all}.tool-detail-status{display:inline-block;padding:1px 8px;border-radius:999px;font-size:10px;font-weight:500;letter-spacing:.03em}.tool-detail-status-completed{background:#34875624;color:#2a6e46;border:1px solid rgba(52,135,86,.32)}.tool-detail-status-pending{background:#d85b3424;color:#8f2d1e;border:1px solid rgba(216,91,52,.32)}.tool-detail-status-failed,.tool-detail-status-canceled,.tool-detail-status-cancelled{background:#a02c2024;color:#8f0000;border:1px solid rgba(160,44,32,.32)}.tool-detail-section{border:1px solid var(--line);border-radius:10px;background:#ffffff80;overflow:hidden}.tool-detail-summary{padding:7px 12px;font-size:11px;color:var(--muted);cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none}.tool-detail-summary::-webkit-details-marker{display:none}.tool-detail-summary:before{content:"▶ ";font-size:9px}.tool-detail-section[open]>.tool-detail-summary{color:var(--text);border-bottom:1px solid var(--line)}.tool-detail-section[open]>.tool-detail-summary:before{content:"▼ "}.tool-detail-content{margin:0;border-radius:0;border:none;background:transparent}.composer-send{display:inline-flex;align-items:center;gap:8px}.composer-send-shortcut{display:inline-flex;align-items:center;padding:1px 5px;border-radius:5px;background:#ffffff47;border:1px solid rgba(255,255,255,.5);font-family:IBM Plex Mono,SFMono-Regular,monospace;font-size:10px;font-weight:400;letter-spacing:0;line-height:1.4;opacity:.9}.composer-send:disabled .composer-send-shortcut{opacity:.45}.tool-read-output{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#ffffffc7}.tool-read-output-write .tool-read-header{background:#34875612;border-bottom-color:#34875633}.tool-read-output-write .tool-read-linecount{color:#2a6e46}.tool-read-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:6px 12px;background:#3a2d210d;border-bottom:1px solid var(--line)}.tool-read-path{font-family:IBM Plex Mono,SFMono-Regular,monospace;font-size:10px;color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-read-linecount{flex-shrink:0;font-size:10px;color:var(--muted)}.tool-read-body{overflow:auto;max-height:clamp(200px,50vh,480px)}.tool-read-table{width:100%;border-collapse:collapse;font-family:IBM Plex Mono,SFMono-Regular,monospace;font-size:10px;line-height:1.5}.tool-read-line:hover{background:#3a2d210a}.tool-read-lineno{width:1%;min-width:36px;padding:0 10px 0 12px;text-align:right;color:var(--muted);user-select:none;-webkit-user-select:none;vertical-align:top;white-space:nowrap}.tool-read-linetext{padding:0 12px 0 0;white-space:pre-wrap;word-break:break-all;vertical-align:top}.tool-read-truncated{padding:6px 12px;font-size:10px;color:var(--muted);border-top:1px solid var(--line);margin:0}.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;-webkit-user-select:text;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{color-scheme:light;font-family:IBM Plex Sans,PingFang SC,Hiragino Sans GB,sans-serif;--bg: #f4efe6;--panel: rgba(255, 250, 242, .88);--line: rgba(58, 45, 33, .12);--text: #24180e;--muted: #6c5c4d;--brand: #d85b34;--brand-dark: #8f2d1e;--accent: #17756d;--shadow: 0 24px 80px rgba(64, 41, 19, .12);font-size:12px}*{box-sizing:border-box}body{margin:0;height:100vh;color:var(--text);background:radial-gradient(circle at top left,rgba(255,216,177,.9),transparent 28%),radial-gradient(circle at top right,rgba(111,182,173,.22),transparent 26%),linear-gradient(135deg,#f8f1e7,#efe5d9 48%,#efece6);overflow:hidden}button,textarea,input,select{font:inherit}button{cursor:pointer;border:0}code,pre{font-family:IBM Plex Mono,SFMono-Regular,monospace}#root{height:100vh}.access-gate{display:flex;align-items:center;justify-content:center;height:100vh;padding:16px}.access-card{width:min(520px,100%);padding:24px;display:grid;gap:12px}.access-card input{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#ffffffeb}.shell{display:grid;grid-template-columns:280px minmax(0,1fr) 280px;gap:12px;height:100vh;padding:12px}.panel{border:1px solid var(--line);border-radius:20px;background:var(--panel);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);box-shadow:var(--shadow);overflow:hidden}.masthead,.approvals{display:flex;flex-direction:column;padding:14px;min-height:0}.eyebrow{margin:0 0 8px;color:var(--brand-dark);font-size:12px;letter-spacing:.18em;text-transform:uppercase}h1,h2,h3,p{margin:0}h1{font-size:24px;line-height:1;font-weight:700}.lede{margin-top:8px;color:var(--muted);line-height:1.45;font-size:12px}.masthead-intro{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;flex-shrink:0}.brand-lockup{display:flex;align-items:flex-start;gap:10px;min-width:0}.brand-stack,.brand-copy{min-width:0}.masthead-lede{margin-top:8px}.brand-icon{width:44px;height:44px;flex:0 0 44px;border-radius:10px;border:1px solid var(--line);background:#fffffff2;object-fit:cover;box-shadow:0 8px 18px #2d1a0b29}.error-indicator{flex:0 0 auto;min-width:24px;height:24px;padding:0 6px;display:inline-flex;align-items:center;justify-content:center;gap:4px;border:1px solid rgba(177,59,47,.18);border-radius:999px;background:#c9304a1a;color:#9d2131;transition:transform .16s ease,background .16s ease,border-color .16s ease}.error-indicator:hover{transform:translateY(-1px);background:#c9304a29;border-color:#b13b2f52}.error-indicator-dot{width:8px;height:8px;border-radius:999px;background:currentColor;box-shadow:0 0 0 4px #c9304a1f}.error-indicator-count{font-size:10px;font-weight:700;line-height:1}.status-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-top:14px;flex-shrink:0}.status-card,.details,.approval-card,.composer,.bubble,.empty{border:1px solid var(--line);border-radius:14px;background:#ffffffb3}.status-card{padding:10px}.status-card span{display:block;color:var(--muted);font-size:11px;margin-bottom:4px}.status-card strong{display:block;font-size:12px;line-height:1.25;overflow-wrap:anywhere}.status-card-positive strong{color:#1f7a45}.status-card-negative strong{color:#b13b2f}.details{margin-top:10px;padding:12px;min-height:0}.details p,.details label{color:var(--muted);margin-bottom:6px}.details label{display:block;cursor:default}.details code{display:block;margin-bottom:10px;white-space:pre-wrap;font-size:11px;line-height:1.35}.details input,.details select,.composer select{width:100%;margin-bottom:10px;padding:8px 10px;border:1px solid var(--line);border-radius:10px;background:#ffffffe6;color:var(--text);font-size:12px}.actions{display:grid;gap:8px;margin-top:10px;padding-top:0}.actions.compact{margin-top:0;padding-top:0}.inline-actions{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:10px}.sidebar-tabs{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-top:10px;flex-shrink:0}.sidebar-tab{padding:8px 10px;border:1px solid var(--line);border-radius:10px;background:#ffffff9e;color:var(--muted);font-weight:400;transition:background .15s ease,border-color .15s ease,color .15s ease,box-shadow .15s ease}.sidebar-tab:not(.active):hover{background:#ffffffe0;border-color:#3a2d2138;color:var(--text)}.sidebar-tab:focus-visible{outline:2px solid var(--brand);outline-offset:2px}.sidebar-tab.active{background:#d85b3433;border-color:#d85b348c;color:var(--brand-dark);font-weight:600;box-shadow:0 1px 6px #d85b3424}.sidebar-body{display:flex;flex:1;min-height:0;margin-top:10px}.tab-panel{display:flex;flex:1;flex-direction:column;gap:8px;min-height:0}.create-panel{gap:6px}.create-panel .details{padding:10px}.create-panel .details p,.create-panel .details label{margin-bottom:4px;font-size:10px}.create-panel .details code{margin-bottom:8px;font-size:10px;line-height:1.3}.create-panel .details input,.create-panel .details select{margin-bottom:8px;padding:7px 9px;font-size:11px}.create-panel .inline-actions{gap:5px;margin-bottom:8px}.create-panel .primary,.create-panel .secondary{padding:9px 10px;font-size:11px}.workspace-path-inline{display:grid;grid-template-columns:max-content auto minmax(220px,1fr);align-items:center;gap:6px;margin-bottom:8px}.workspace-path-root{display:inline-flex;align-items:center;margin-bottom:0;max-width:min(42vw,420px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.workspace-path-sep{color:var(--muted);font-size:12px}.workspace-path-inline input{width:100%;margin-bottom:0}.masthead .actions.compact{margin-top:12px}.workspace-suggestion-list{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.workspace-suggestion-item{max-width:100%;padding:4px 8px;border:1px solid var(--line);border-radius:999px;background:#ffffffe6;color:var(--text);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mode-tile-grid{display:flex;flex-wrap:wrap;gap:8px}.mode-tile{border:1px solid var(--line);border-radius:10px;padding:7px 10px;font-size:12px;color:var(--text);background:#ffffffeb}.mode-tile.active{border-color:var(--brand);background:#d85b341f;color:var(--brand-strong)}.tab-panel.fill .session-list{margin-top:0}.primary,.secondary{padding:10px 12px;border-radius:12px;transition:transform .16s ease,opacity .16s ease,background .16s ease}.primary{background:linear-gradient(135deg,var(--brand) 0%,#ef8852 100%);color:#fff7f0}.secondary{background:#17756d1f;color:var(--accent)}.primary:hover,.secondary:hover{transform:translateY(-1px)}.primary:disabled,.secondary:disabled{cursor:not-allowed;opacity:.45;transform:none}.transcript{display:grid;grid-template-rows:auto 1fr auto;min-height:0}.transcript-header{padding:14px 14px 10px}.transcript-header p{margin-top:8px;color:var(--muted)}.transcript-header h2{overflow-wrap:anywhere;word-break:break-word}.timeline{padding:0 14px 10px;overflow:auto;display:flex;flex-direction:column;gap:6px;min-height:0}.history-loader{width:100%;padding:7px 10px;font-size:11px;text-align:center}.bubble,.approval-card,.empty{padding:10px 12px}.approval-card pre{margin:0;white-space:pre-wrap;word-break:break-word;font-size:11px;line-height:1.45}.bubble.user{background:#d85b341f}.bubble.agent{background:#ffffffe6}.bubble.tool{background:#17756d1a}.bubble.error{background:#a02c201f}.bubble.thought{background:#8f2d1e14}.composer{margin:0 14px 14px;padding:10px}.composer-pending-placeholder{color:var(--text);background:linear-gradient(180deg,#fff3e5f5,#fff9f1e6);border-color:#d85b3452;box-shadow:0 8px 22px #d85b341f;font-size:11px;line-height:1.5}.composer-pending-title{margin-bottom:8px;font-size:11px;letter-spacing:.08em;text-transform:uppercase}.composer-pending-list{display:flex;flex-direction:column;gap:8px}.composer-pending-item{padding:8px;border:1px solid rgba(216,91,52,.24);border-radius:10px;background:#ffffffd6}.composer-pending-tool{margin-bottom:6px;color:var(--text);font-size:11px}.composer-mode-row{display:flex;align-items:center;gap:8px}.composer-mode-row span{color:var(--muted);flex-shrink:0}.composer-mode-row select{margin-bottom:0}.composer-pending-note-row{margin-top:6px;display:flex;gap:6px;align-items:center}.composer-pending-note-row input{flex:1;min-width:0;padding:6px 8px;border:1px solid rgba(58,45,33,.18);border-radius:8px;background:#fffffff5;color:var(--text);font-size:11px}.composer-pending-note-row .secondary{margin-top:0;width:auto;padding:6px 10px}.composer-pending-preview{margin:0 0 6px;max-height:120px;overflow:auto;padding:6px 8px;border-radius:8px;border:1px solid rgba(58,45,33,.16);background:#ffffffeb;font-size:10px;line-height:1.4;white-space:pre-wrap;word-break:break-word}.session-plan-preview{margin:0;max-height:280px;overflow:auto;padding:10px;border:1px solid var(--line);border-radius:10px;background:#ffffffdb;font-size:11px;line-height:1.45;white-space:pre-wrap;word-break:break-word}.session-plan-list{margin:0;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#ffffffdb;list-style:none;display:flex;flex-direction:column;gap:8px;max-height:280px;overflow:auto}.session-plan-list-item{display:flex;align-items:flex-start;gap:8px;font-size:11px;line-height:1.45}.session-plan-content{flex:1;word-break:break-word}.session-plan-status{margin-top:1px;width:14px;height:14px;border-radius:999px;border:1.5px solid rgba(58,45,33,.45);flex:0 0 14px;position:relative}.session-plan-status-completed{background:#4aab7029;border-color:#348756e6}.session-plan-status-completed:after{content:"";position:absolute;left:3px;top:1px;width:4px;height:7px;border:solid rgba(52,135,86,.95);border-width:0 2px 2px 0;transform:rotate(45deg)}.session-plan-status-in_progress{border-color:#2b60a5e6;border-top-color:#2b60a533;animation:session-plan-spin .9s linear infinite}.session-plan-status-pending,.session-plan-status-unknown{background:transparent}@keyframes session-plan-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.composer-pending-actions{display:flex;flex-wrap:wrap;gap:6px}.composer-pending-actions .secondary{width:auto;margin-top:0;padding:6px 10px}.composer-pending-queue{margin:0 0 8px;padding:8px 10px;border:1px solid rgba(58,45,33,.16);border-radius:10px;background:#fffaf2eb;font-size:11px}.composer-pending-queue-title{margin:0 0 6px;font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.composer-pending-queue-list{display:flex;flex-direction:column;gap:6px;max-height:160px;overflow-y:auto}.composer-pending-queue-item{display:flex;align-items:flex-start;gap:8px;padding:6px 8px;border:1px solid rgba(58,45,33,.12);border-radius:8px;background:#ffffffe0}.composer-pending-queue-text{flex:1;min-width:0;margin:0;font-size:11px;line-height:1.4;color:var(--text);white-space:pre-wrap;word-break:break-word;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.composer-pending-queue-actions{display:flex;gap:4px;flex-shrink:0}.composer-pending-queue-btn{padding:3px 7px;border-radius:6px;border:1px solid rgba(58,45,33,.2);background:#ffffffe6;color:var(--muted);font-size:10px;cursor:pointer;line-height:1.4;transition:background .12s,color .12s}.composer-pending-queue-btn:hover{background:#3a2d2114;color:var(--text)}.composer-pending-queue-btn-delete{border-color:#d85b344d;color:var(--brand)}.composer-pending-queue-btn-delete:hover{background:#d85b341a;color:var(--brand-dark)}.composer textarea{width:100%;min-height:72px;resize:vertical;border:0;background:transparent;outline:none;color:var(--text);font-size:12px;line-height:1.4}.composer-capability-summary{margin:6px 0;color:var(--muted);font-size:10px}.composer-input-shell{position:relative}.composer-image-previews{display:flex;flex-direction:column;gap:4px;padding:6px 0 4px}.composer-image-preview{display:flex;align-items:center;gap:8px;flex-shrink:0}.composer-image-preview-thumb{width:64px;height:48px;border-radius:6px;overflow:hidden;border:1px solid rgba(58,45,33,.16);background:#3a2d210f;flex-shrink:0}.composer-image-preview img{display:block;width:100%;height:100%;object-fit:cover}.composer .composer-image-preview-remove{flex-shrink:0;flex-grow:0;width:auto;margin-top:0;padding:2px 8px;border-radius:4px;border:1px solid rgba(58,45,33,.25);background:transparent;color:#3a2d2199;font-size:12px;line-height:1.4;cursor:pointer;white-space:nowrap;transition:background .12s,color .12s,border-color .12s}.composer .composer-image-preview-remove:hover{background:#c8371414;color:#c83714d9;border-color:#c8371459}.composer-pending-queue-images{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:4px}.composer-pending-queue-img{display:block;max-width:48px;max-height:48px;border-radius:4px;border:1px solid rgba(58,45,33,.16);object-fit:cover}.composer-completions{margin:0 0 8px;display:flex;flex-direction:column;gap:4px;max-height:200px;overflow:auto;border:1px solid var(--line);border-radius:10px;background:#fffffff2;padding:6px;box-shadow:inset 0 1px #ffffff80}.composer-completion-section{display:flex;flex-direction:column;gap:4px}.composer-completion-section-title{margin:2px 4px;font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}.composer-completion-item{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;border:1px solid transparent;border-radius:8px;background:#ffffffb8;color:var(--text);text-align:left}.composer-completion-item span{font-family:IBM Plex Mono,SFMono-Regular,monospace;font-size:11px}.composer-completion-item small{color:var(--muted);font-size:10px;line-height:1.2;text-align:right}.composer-completion-match{color:var(--brand-dark)}.composer-completion-rest{color:var(--text)}.composer-completion-item.active{border-color:#d85b3466;background:#d85b341f}.composer button{margin-top:8px;width:100%}.composer-actions{margin-top:8px;display:flex;align-items:center;gap:8px}.composer-actions .primary{margin-top:0;flex:1}.composer-actions .composer-cancel{margin-top:0;width:auto;min-width:0;padding:6px 9px;font-size:10px;line-height:1;display:inline-flex;align-items:center;gap:4px}.approvals{gap:8px}.session-list{display:flex;flex-direction:column;gap:6px;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;min-height:0;flex:1;padding-right:2px}.session-chip{display:flex;flex-shrink:0;flex-direction:column;gap:6px;width:100%;padding:10px 12px;text-align:left;border:1px solid var(--line);border-radius:12px;background:#ffffffad;color:var(--text);min-width:0;overflow:hidden;transition:background .15s ease,border-color .15s ease,transform .1s ease,box-shadow .15s ease}.session-chip:hover:not(.active){background:#ffffffe6;border-color:#3a2d2138;transform:translateY(-1px);box-shadow:0 2px 8px #40291314}.session-chip:focus-visible{outline:2px solid var(--brand);outline-offset:2px}.session-chip-title{display:-webkit-box;min-width:0;overflow:hidden;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow-wrap:anywhere;word-break:break-word;font-size:13px;font-weight:600;line-height:1.35}.session-chip.active{background:#d85b3429;border-color:#d85b3485;box-shadow:inset 3px 0 0 var(--brand)}.session-chip-meta{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0}.session-chip-status{display:flex;align-items:center;gap:6px;min-width:0;flex:1}.session-chip-mode{display:inline-flex;align-items:center;min-width:0;max-width:100%;padding:2px 8px;border:1px solid rgba(66,43,26,.18);border-radius:999px;font-size:10px;line-height:1.35;color:var(--muted);background:#fff9;white-space:nowrap}.session-chip-tag{display:inline-flex;align-items:center;min-width:0;max-width:100%;padding:2px 8px;border:1px solid transparent;border-radius:999px;font-size:10px;line-height:1.35;white-space:nowrap}.session-chip-tag-pending{background:#d85b3424;border-color:#d85b344d;color:var(--brand-dark)}.session-chip-tag-running{background:#17756d24;border-color:#17756d47;color:var(--accent)}.session-chip-tag-completed{background:#422b1a1a;border-color:#422b1a29;color:var(--text)}.session-chip-tag-error{background:#a02c2024;border-color:#a02c2047;color:#9a1c1c}.session-chip-tag-connecting{background:#14628a1f;border-color:#14628a38;color:#0a5c88}.session-chip-time,.session-chip-path{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:11px;line-height:1.55}.session-chip-time{flex-shrink:0}.session-chip-path{width:100%;white-space:normal;overflow-wrap:anywhere;word-break:break-word;padding-bottom:2px}.session-meta{margin-top:0}.session-meta-card{display:flex;flex-direction:column;gap:10px;background:linear-gradient(180deg,#ffffffd1,#f8f2e9eb)}.session-meta-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.session-meta-actions{display:flex;align-items:center;gap:6px;flex-wrap:nowrap;justify-content:flex-end;margin-top:2px}.session-meta-actions .secondary{min-width:112px;height:36px;display:inline-flex;align-items:center;justify-content:center;padding:0 12px}.session-meta-header h3{font-size:16px;line-height:1.1}.session-close{background:#af282824;color:#9a1c1c}.session-diff-trigger{background:#14628a24;color:#0a5c88}.session-meta-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.session-meta-item{padding:10px;border:1px solid var(--line);border-radius:12px;background:#ffffffd1}.session-meta-item-wide{grid-column:1 / -1}.session-meta-item span{display:block;margin-bottom:4px;color:var(--muted);font-size:11px}.session-meta-item code{display:block;margin:0;overflow-wrap:anywhere;word-break:break-word}.session-meta-item select{width:100%;margin:0;padding:8px 10px;border:1px solid var(--line);border-radius:10px;background:#ffffffe6;color:var(--text);font-size:12px}.session-meta-note{margin:6px 0 0;color:var(--muted);font-size:11px;line-height:1.45}.approval-card h3{margin-bottom:8px;font-size:12px}.approval-stack{display:flex;flex-direction:column;gap:8px}.approval-card-active{border-color:#d85b3459;background:linear-gradient(180deg,#fff7f2f5,#f8efe6eb);box-shadow:0 10px 24px #8f2d1e14}.approval-label{margin-bottom:6px;color:var(--brand-dark);font-size:11px;letter-spacing:.08em;text-transform:uppercase}.approval-hint{color:var(--muted);font-size:11px;line-height:1.45}.approval-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}.empty{color:var(--muted);font-size:11px}.timeline-row{display:grid;grid-template-columns:minmax(108px,max-content) minmax(0,1fr) max-content;gap:8px;align-items:center;box-sizing:border-box;width:calc(100% - (var(--timeline-depth, 0) * 18px));margin-left:calc(var(--timeline-depth, 0) * 18px);min-width:0;padding:8px 10px;border:1px solid var(--line);border-radius:12px;background:#ffffffb8;color:var(--text);text-align:left}.timeline-row-multiline{align-items:start}.timeline-row .timeline-meta{font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.timeline-row .timeline-kind{display:flex;align-items:center;gap:6px;min-width:0;font-size:11px;white-space:nowrap}.timeline-row .timeline-fold{color:var(--muted);font-size:10px;border:1px solid var(--line);border-radius:999px;padding:1px 6px}.timeline-row .timeline-body{min-width:0;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timeline-row .timeline-body.multiline{white-space:pre-wrap;text-overflow:clip;line-height:1.4;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:10;overflow:hidden}.timeline-row .timeline-meta{color:var(--muted);text-align:right;padding-left:8px}.timeline-row.user{background:#9952d624;border-color:#7e3fbf47}.timeline-running-indicator{display:inline-flex;align-items:center;gap:8px;margin-top:4px;padding:8px 10px;border:1px dashed rgba(23,117,109,.35);border-radius:10px;color:var(--accent);font-size:11px;background:#17756d0f}.timeline-running-dot{width:8px;height:8px;border-radius:999px;background:currentColor;animation:timeline-pulse 1.1s ease-in-out infinite}@keyframes timeline-pulse{0%,to{opacity:.35;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}.timeline-row.tool{background:#17756d1a}.timeline-row.error{background:#a02c201f}.timeline-row.thought{background:#8f2d1e14}.modal-backdrop{position:fixed;inset:0;z-index:500;display:flex;align-items:center;justify-content:center;padding:20px;background:#21140c61}.modal-card{width:min(920px,100%);max-height:calc(100vh - 40px);display:flex;flex-direction:column;gap:0;padding:0;border:1px solid var(--line);border-radius:18px;background:#fffcf7fa;box-shadow:var(--shadow);overflow:hidden}.system-modal-card{width:min(760px,100%)}.modal-header{flex-shrink:0;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:14px 14px 10px;border-bottom:1px solid var(--line)}.modal-scroll-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:12px 14px 14px}.modal-scroll-body>*+*{margin-top:10px}.modal-footer{flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:10px 14px 14px;border-top:1px solid var(--line);background:#fffcf7fa}.modal-footer .secondary{margin-top:0;width:auto;padding:7px 14px}.modal-meta-padded{padding:8px 14px 0}.modal-actions-inline{display:flex;align-items:center;gap:6px}.diff-title-wrap{min-width:0}.diff-title-path{display:inline-block;margin-top:4px;padding:2px 8px;border-radius:999px;background:#422b1a17;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-btn-refresh{background:#14628a24;color:#0a5c88}.modal-btn-close{background:#af282824;color:#9a1c1c}.readonly-badge{display:inline-block;margin-left:8px;padding:2px 8px;border-radius:999px;border:1px solid rgba(159,36,36,.35);background:#af28281f;color:#9a1c1c;font-size:10px;vertical-align:middle}.modal-meta{color:var(--muted);font-size:11px}.modal-body{margin:0;padding:12px;overflow:auto;border:1px solid var(--line);border-radius:12px;background:#ffffffc7;white-space:pre-wrap;word-break:break-word;font-size:11px;line-height:1.5}.markdown-body{white-space:normal}.markdown-body>:first-child{margin-top:0}.markdown-body>:last-child{margin-bottom:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin:.8em 0 .35em;line-height:1.3}.markdown-body p,.markdown-body ul{margin:.45em 0}.markdown-body ul{padding-left:1.2em}.markdown-body code{padding:.1em .35em;border-radius:6px;background:#422b1a17;font-family:JetBrains Mono,SFMono-Regular,ui-monospace,Menlo,Monaco,Consolas,monospace}.markdown-body pre{margin:.6em 0;padding:10px;border:1px solid var(--line);border-radius:8px;background:#ffffffd1;overflow:auto}.markdown-body pre code{padding:0;background:transparent}.markdown-body table{width:100%;border-collapse:collapse;margin:.6em 0;font-size:11px}.markdown-body th,.markdown-body td{border:1px solid var(--line);padding:6px 8px;text-align:left;vertical-align:top}.markdown-body th{background:#422b1a14;font-weight:600}.diff-toolbar-tabs{display:flex;align-items:center;gap:6px;margin-bottom:8px;flex-wrap:wrap}.diff-toolbar-tabs select{min-width:240px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;background:#ffffffe6}.diff-tab{padding:7px 10px;border:1px solid var(--line);border-radius:10px;background:#ffffffb3;color:var(--muted)}.diff-tab.active{background:#d85b3429;border-color:#d85b3473;color:var(--brand-dark)}.diff-block{margin:.6em 0;padding:0;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:auto}.diff-block code{display:block;padding:0;background:transparent}.diff-line{display:block;padding:0 10px;white-space:pre}.diff-line-header{color:#7b4d22;background:#85593014}.diff-line-file,.diff-line-hunk{color:#005c99;background:#005c991a}.diff-line-add{color:#0d5d2a;background:#11974a29}.diff-line-remove{color:#8f1f2f;background:#c9304a29}.system-modal-list{display:flex;flex-direction:column;gap:6px;overflow:auto;min-height:0}@media(max-width:1100px){.shell{grid-template-columns:1fr;height:auto}.transcript{min-height:70vh}body{overflow:auto}}.terminal-drawer{position:fixed;bottom:0;left:0;right:0;z-index:200;border-top:1px solid var(--line);background:#1a1a1a;color:#e8e8e8;display:flex;flex-direction:column;box-shadow:0 -8px 32px #00000040;transition:height .2s ease;height:36px}.terminal-drawer-open{height:320px}.terminal-drawer-header{display:flex;align-items:center;gap:12px;padding:0 12px;height:36px;flex-shrink:0;border-bottom:1px solid rgba(255,255,255,.08)}.terminal-drawer-toggle{display:flex;align-items:center;gap:6px;background:transparent;color:#e8e8e8;font-size:12px;font-weight:600;padding:4px 8px;border-radius:6px;cursor:pointer;letter-spacing:.04em;transition:background .15s}.terminal-drawer-toggle:hover{background:#ffffff1a}.terminal-drawer-icon{font-size:10px;opacity:.7}.terminal-drawer-note{font-size:11px;color:#e8e8e880;font-family:IBM Plex Mono,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.terminal-viewport{flex:1;overflow:hidden;padding:4px 8px;min-height:0}.terminal-viewport .xterm{height:100%}.terminal-viewport .xterm-viewport{overflow-y:auto!important}.shell.multi-session{padding-bottom:48px}.toast-container{position:fixed;top:16px;right:16px;z-index:9000;display:flex;flex-direction:column;gap:8px;max-width:360px;pointer-events:none}.toast-item{display:flex;align-items:flex-start;gap:8px;background:#1e1e1e;border:1px solid rgba(255,255,255,.12);border-left:3px solid #555;border-radius:8px;padding:10px 12px;box-shadow:0 4px 20px #00000080;animation:toast-slide-in .2s ease;pointer-events:all}.toast-permission{border-left-color:#f59e0b}.toast-completion{border-left-color:#10b981}.toast-content{flex:1;min-width:0}.toast-content-clickable{background:none;border:none;padding:0;text-align:left;cursor:pointer}.toast-content-clickable:hover .toast-body{color:#e8e8e8e6}.toast-title{display:block;font-size:12px;font-weight:700;color:#e8e8e8;margin-bottom:3px}.toast-body{display:block;font-size:11px;color:#e8e8e8a6;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toast-dismiss{flex-shrink:0;background:none;border:none;color:#e8e8e859;cursor:pointer;font-size:18px;line-height:1;padding:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:color .15s,background .15s}.toast-dismiss:hover{color:#e8e8e8;background:#ffffff14}@keyframes toast-slide-in{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}.modal-attached-images{display:flex;flex-wrap:wrap;gap:8px;padding:8px 16px 0}.modal-attached-image{max-width:240px;max-height:180px;border-radius:6px;border:1px solid rgba(58,45,33,.16);object-fit:contain;background:#3a2d210a}.timeline-image-badge{margin-left:4px;font-size:11px;opacity:.65}.tool-detail-view{display:flex;flex-direction:column;gap:8px;min-height:0}.tool-detail-fields{display:flex;flex-direction:column;gap:6px;padding:10px 12px;border:1px solid var(--line);border-radius:12px;background:#ffffffc7}.tool-detail-row{display:flex;gap:10px;align-items:flex-start;font-size:11px;line-height:1.5}.tool-detail-key{flex:0 0 40px;color:var(--muted);font-size:10px;padding-top:2px;white-space:nowrap}.tool-detail-val{flex:1;min-width:0;word-break:break-word;color:var(--text)}.tool-detail-code{font-family:IBM Plex Mono,SFMono-Regular,monospace;font-size:10px;white-space:pre-wrap;word-break:break-all}.tool-detail-status{display:inline-block;padding:1px 8px;border-radius:999px;font-size:10px;font-weight:500;letter-spacing:.03em}.tool-detail-status-completed{background:#34875624;color:#2a6e46;border:1px solid rgba(52,135,86,.32)}.tool-detail-status-pending{background:#d85b3424;color:#8f2d1e;border:1px solid rgba(216,91,52,.32)}.tool-detail-status-failed,.tool-detail-status-canceled,.tool-detail-status-cancelled{background:#a02c2024;color:#8f0000;border:1px solid rgba(160,44,32,.32)}.tool-detail-section{border:1px solid var(--line);border-radius:10px;background:#ffffff80;overflow:hidden}.tool-detail-summary{padding:7px 12px;font-size:11px;color:var(--muted);cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none}.tool-detail-summary::-webkit-details-marker{display:none}.tool-detail-summary:before{content:"▶ ";font-size:9px}.tool-detail-section[open]>.tool-detail-summary{color:var(--text);border-bottom:1px solid var(--line)}.tool-detail-section[open]>.tool-detail-summary:before{content:"▼ "}.tool-detail-content{margin:0;border-radius:0;border:none;background:transparent}.composer-send{display:inline-flex;align-items:center;gap:8px}.composer-send-shortcut{display:inline-flex;align-items:center;padding:1px 5px;border-radius:5px;background:#ffffff47;border:1px solid rgba(255,255,255,.5);font-family:IBM Plex Mono,SFMono-Regular,monospace;font-size:10px;font-weight:400;letter-spacing:0;line-height:1.4;opacity:.9}.composer-send:disabled .composer-send-shortcut{opacity:.45}.tool-read-output{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#ffffffc7}.tool-read-output-write .tool-read-header{background:#34875612;border-bottom-color:#34875633}.tool-read-output-write .tool-read-linecount{color:#2a6e46}.tool-read-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:6px 12px;background:#3a2d210d;border-bottom:1px solid var(--line)}.tool-read-path{font-family:IBM Plex Mono,SFMono-Regular,monospace;font-size:10px;color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-read-linecount{flex-shrink:0;font-size:10px;color:var(--muted)}.tool-read-body{overflow:auto;max-height:clamp(200px,50vh,480px)}.tool-read-table{width:100%;border-collapse:collapse;font-family:IBM Plex Mono,SFMono-Regular,monospace;font-size:10px;line-height:1.5}.tool-read-line:hover{background:#3a2d210a}.tool-read-lineno{width:1%;min-width:36px;padding:0 10px 0 12px;text-align:right;color:var(--muted);user-select:none;-webkit-user-select:none;vertical-align:top;white-space:nowrap}.tool-read-linetext{padding:0 12px 0 0;white-space:pre-wrap;word-break:break-all;vertical-align:top}.tool-read-truncated{padding:6px 12px;font-size:10px;color:var(--muted);border-top:1px solid var(--line);margin:0}.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;-webkit-user-select:text;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}
|