@way_marks/server 4.0.2 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ /**
3
+ * MCP tools for agent monitoring.
4
+ *
5
+ * Registers three read-only MCP tools into an existing waymark MCP server:
6
+ * - list_agent_sessions → all live Claude + Codex sessions
7
+ * - get_rate_limits → Claude + Codex rate limit windows
8
+ * - get_agent_ports → ports spawned by agents + orphan ports
9
+ *
10
+ * Drop-in integration for packages/server/src/mcp/server.ts:
11
+ *
12
+ * import { registerAgentMonitorTools } from './tools/agent-monitor';
13
+ * registerAgentMonitorTools(server, collector);
14
+ *
15
+ * where `collector` is a shared MultiCollector instance.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.AGENT_MONITOR_TOOL_DEFINITIONS = void 0;
19
+ exports.fetchSnapshotFromApi = fetchSnapshotFromApi;
20
+ exports.handleAgentMonitorToolCall = handleAgentMonitorToolCall;
21
+ // ─── Tool definitions ─────────────────────────────────────────────────────────
22
+ const LIST_AGENT_SESSIONS_TOOL = {
23
+ name: 'list_agent_sessions',
24
+ description: 'List all currently running (and recently finished) AI agent sessions on this machine. ' +
25
+ 'Returns Claude Code and Codex CLI sessions with token usage, context window %, status, ' +
26
+ 'current task, git stats, and child processes.',
27
+ inputSchema: {
28
+ type: 'object',
29
+ properties: {
30
+ agentFilter: {
31
+ type: 'string',
32
+ enum: ['all', 'claude', 'codex'],
33
+ description: 'Filter by agent type. Default: "all".',
34
+ },
35
+ statusFilter: {
36
+ type: 'string',
37
+ enum: ['all', 'active', 'waiting', 'done'],
38
+ description: 'Filter by session status. Default: "all".',
39
+ },
40
+ },
41
+ required: [],
42
+ },
43
+ };
44
+ const GET_RATE_LIMITS_TOOL = {
45
+ name: 'get_rate_limits',
46
+ description: 'Get Claude Code and Codex CLI rate limit usage for this machine. ' +
47
+ 'Returns 5-hour and 7-day window percentages and reset timestamps. ' +
48
+ 'Claude data requires the StatusLine hook (run `waymark --setup` to install).',
49
+ inputSchema: {
50
+ type: 'object',
51
+ properties: {},
52
+ required: [],
53
+ },
54
+ };
55
+ const GET_AGENT_PORTS_TOOL = {
56
+ name: 'get_agent_ports',
57
+ description: 'List TCP ports opened by AI agent child processes. ' +
58
+ 'Also reports orphan ports — ports held by processes whose parent agent session has ended.',
59
+ inputSchema: {
60
+ type: 'object',
61
+ properties: {},
62
+ required: [],
63
+ },
64
+ };
65
+ // ─── Exports ──────────────────────────────────────────────────────────────────
66
+ /**
67
+ * Tool definitions to merge into the existing ListToolsRequestSchema response.
68
+ *
69
+ * Integration in packages/server/src/mcp/server.ts:
70
+ *
71
+ * import { AGENT_MONITOR_TOOL_DEFINITIONS, handleAgentMonitorToolCall } from './tools/agent-monitor';
72
+ *
73
+ * // In ListToolsRequestSchema handler:
74
+ * tools: [...existingTools, ...AGENT_MONITOR_TOOL_DEFINITIONS]
75
+ *
76
+ * // In CallToolRequestSchema handler:
77
+ * const handled = await handleAgentMonitorToolCall(name, args, () => latestSnapshot);
78
+ * if (handled) return handled;
79
+ */
80
+ exports.AGENT_MONITOR_TOOL_DEFINITIONS = [
81
+ LIST_AGENT_SESSIONS_TOOL,
82
+ GET_RATE_LIMITS_TOOL,
83
+ GET_AGENT_PORTS_TOOL,
84
+ ];
85
+ /**
86
+ * Fetch the current snapshot from the sibling API process.
87
+ * Returns an empty snapshot when the API isn't reachable (e.g. the MCP server
88
+ * was started without `waymark start`). Callers should not have to special-case
89
+ * the offline path — the agent just sees an empty session list.
90
+ */
91
+ async function fetchSnapshotFromApi(port, fetchFn = fetch) {
92
+ const url = `http://127.0.0.1:${port}/api/agent-monitor/snapshot`;
93
+ try {
94
+ const ac = new AbortController();
95
+ const t = setTimeout(() => ac.abort(), 1500);
96
+ const res = await fetchFn(url, { signal: ac.signal });
97
+ clearTimeout(t);
98
+ if (!res.ok)
99
+ return emptySnapshot();
100
+ const body = await res.json();
101
+ return {
102
+ sessions: body.sessions ?? [],
103
+ rateLimits: body.rateLimits ?? [],
104
+ orphanPorts: body.orphanPorts ?? [],
105
+ collectedAt: body.collectedAt ?? Date.now(),
106
+ };
107
+ }
108
+ catch {
109
+ return emptySnapshot();
110
+ }
111
+ }
112
+ function emptySnapshot() {
113
+ return { sessions: [], rateLimits: [], orphanPorts: [], collectedAt: Date.now() };
114
+ }
115
+ /**
116
+ * Handle a tool call for one of the agent-monitor tools.
117
+ * Call this from within the existing CallToolRequestSchema handler:
118
+ *
119
+ * const handled = await handleAgentMonitorToolCall(name, args, getSnapshot);
120
+ * if (handled) return handled;
121
+ * // ... existing tool dispatch ...
122
+ */
123
+ /**
124
+ * `getSnapshot` may be sync or async. The API process supplies a sync getter
125
+ * over its in-process `MultiCollector`; the MCP process supplies an async
126
+ * fetcher that hits the API's `/api/agent-monitor/snapshot` endpoint, so the
127
+ * two processes share a single source of truth instead of running parallel
128
+ * collectors with drifting data.
129
+ */
130
+ async function handleAgentMonitorToolCall(name, args, getSnapshot) {
131
+ if (name === 'list_agent_sessions') {
132
+ const snapshot = await getSnapshot();
133
+ return handleListAgentSessions(args, snapshot);
134
+ }
135
+ if (name === 'get_rate_limits') {
136
+ const snapshot = await getSnapshot();
137
+ return handleGetRateLimits(snapshot);
138
+ }
139
+ if (name === 'get_agent_ports') {
140
+ const snapshot = await getSnapshot();
141
+ return handleGetAgentPorts(snapshot);
142
+ }
143
+ return null;
144
+ }
145
+ // ─── Tool handlers ─────────────────────────────────────────────────────────────
146
+ function handleListAgentSessions(args, snapshot) {
147
+ const agentFilter = args['agentFilter'] || 'all';
148
+ const statusFilter = args['statusFilter'] || 'all';
149
+ let sessions = snapshot.sessions;
150
+ if (agentFilter !== 'all') {
151
+ sessions = sessions.filter((s) => s.agentCli === agentFilter);
152
+ }
153
+ if (statusFilter !== 'all') {
154
+ if (statusFilter === 'active') {
155
+ sessions = sessions.filter((s) => s.status === 'thinking' || s.status === 'executing');
156
+ }
157
+ else {
158
+ sessions = sessions.filter((s) => s.status === statusFilter);
159
+ }
160
+ }
161
+ const data = sessions.map(sessionToJson);
162
+ return {
163
+ content: [{
164
+ type: 'text',
165
+ text: JSON.stringify({ sessions: data, count: data.length, collectedAt: snapshot.collectedAt }, null, 2),
166
+ }],
167
+ };
168
+ }
169
+ function handleGetRateLimits(snapshot) {
170
+ const limits = snapshot.rateLimits.map(rateLimitToJson);
171
+ return {
172
+ content: [{
173
+ type: 'text',
174
+ text: JSON.stringify({ rateLimits: limits, collectedAt: snapshot.collectedAt }, null, 2),
175
+ }],
176
+ };
177
+ }
178
+ function handleGetAgentPorts(snapshot) {
179
+ // Gather ports from all sessions' children
180
+ const agentPorts = [];
181
+ for (const session of snapshot.sessions) {
182
+ for (const child of session.children) {
183
+ if (child.port != null) {
184
+ agentPorts.push({
185
+ sessionId: session.sessionId,
186
+ agentCli: session.agentCli,
187
+ pid: child.pid,
188
+ port: child.port,
189
+ command: child.command,
190
+ });
191
+ }
192
+ }
193
+ }
194
+ const orphanPorts = snapshot.orphanPorts.map(orphanToJson);
195
+ return {
196
+ content: [{
197
+ type: 'text',
198
+ text: JSON.stringify({
199
+ agentPorts,
200
+ orphanPorts,
201
+ collectedAt: snapshot.collectedAt,
202
+ }, null, 2),
203
+ }],
204
+ };
205
+ }
206
+ // ─── JSON serialisers ─────────────────────────────────────────────────────────
207
+ function sessionToJson(s) {
208
+ return {
209
+ agentCli: s.agentCli,
210
+ pid: s.pid,
211
+ sessionId: s.sessionId,
212
+ cwd: s.cwd,
213
+ projectName: s.projectName,
214
+ startedAt: s.startedAt,
215
+ startedAtIso: new Date(s.startedAt).toISOString(),
216
+ status: s.status,
217
+ model: s.model,
218
+ effort: s.effort || undefined,
219
+ contextPercent: Math.round(s.contextPercent * 10) / 10,
220
+ contextWindow: s.contextWindow,
221
+ tokens: {
222
+ input: s.totalInputTokens,
223
+ output: s.totalOutputTokens,
224
+ cacheRead: s.totalCacheRead,
225
+ cacheCreate: s.totalCacheCreate,
226
+ total: s.totalInputTokens + s.totalOutputTokens + s.totalCacheRead + s.totalCacheCreate,
227
+ },
228
+ turnCount: s.turnCount,
229
+ currentTasks: s.currentTasks,
230
+ memMb: s.memMb,
231
+ version: s.version || undefined,
232
+ git: {
233
+ branch: s.gitBranch || undefined,
234
+ added: s.gitAdded,
235
+ modified: s.gitModified,
236
+ },
237
+ subagents: s.subagents.length > 0 ? s.subagents : undefined,
238
+ children: s.children.length > 0 ? s.children.map((c) => ({
239
+ pid: c.pid,
240
+ command: c.command,
241
+ memKb: c.memKb,
242
+ port: c.port,
243
+ })) : undefined,
244
+ // Omit toolCalls, fileAccesses, and token history from MCP output to keep responses compact.
245
+ // Access them via the REST API if needed.
246
+ };
247
+ }
248
+ function rateLimitToJson(r) {
249
+ return {
250
+ source: r.source,
251
+ fiveHour: r.fiveHourPct != null ? {
252
+ usedPercent: r.fiveHourPct,
253
+ resetsAt: r.fiveHourResetsAt,
254
+ resetsAtIso: r.fiveHourResetsAt ? new Date(r.fiveHourResetsAt * 1000).toISOString() : undefined,
255
+ } : null,
256
+ sevenDay: r.sevenDayPct != null ? {
257
+ usedPercent: r.sevenDayPct,
258
+ resetsAt: r.sevenDayResetsAt,
259
+ resetsAtIso: r.sevenDayResetsAt ? new Date(r.sevenDayResetsAt * 1000).toISOString() : undefined,
260
+ } : null,
261
+ updatedAt: r.updatedAt,
262
+ updatedAtIso: r.updatedAt ? new Date(r.updatedAt * 1000).toISOString() : undefined,
263
+ };
264
+ }
265
+ function orphanToJson(o) {
266
+ return {
267
+ port: o.port,
268
+ pid: o.pid,
269
+ command: o.command,
270
+ projectName: o.projectName,
271
+ };
272
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@way_marks/server",
3
- "version": "4.0.2",
3
+ "version": "4.3.0",
4
4
  "description": "Waymark MCP server and dashboard",
5
5
  "author": "Waymark <hello@waymarks.dev>",
6
6
  "license": "MIT",
@@ -1 +1 @@
1
- @font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2) format("woff2"),url(/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2) format("woff2"),url(/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2) format("woff2"),url(/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2) format("woff2"),url(/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2) format("woff2"),url(/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2) format("woff2"),url(/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2) format("woff2"),url(/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2) format("woff2"),url(/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--font-sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;--bg-0: #0a0b0d;--bg-1: #101215;--bg-2: #16191d;--bg-3: #1d2126;--bg-4: #262b31;--line: #22262c;--line-strong: #2d3238;--ink-0: #f5f6f7;--ink-1: #d6d9dd;--ink-2: #a8aeb6;--ink-3: #8c929b;--ink-4: #6a7079;--acc: oklch(.72 .09 195);--acc-dim: oklch(.72 .09 195 / .15);--acc-ink: oklch(.95 .03 195);--ok: oklch(.74 .13 155);--ok-dim: oklch(.74 .13 155 / .14);--warn: oklch(.78 .13 75);--warn-dim: oklch(.78 .13 75 / .14);--err: oklch(.68 .19 25);--err-dim: oklch(.68 .19 25 / .14);--info: oklch(.72 .12 240);--info-dim: oklch(.72 .12 240 / .14);--pending: oklch(.8 .14 85);--pending-dim: oklch(.8 .14 85 / .14);--r-1: 4px;--r-2: 6px;--r-3: 10px;--r-4: 14px;--nav-w: 232px;--drawer-w: 560px;--shadow-drawer: 0 24px 48px -12px rgba(0, 0, 0, .6), 0 8px 16px -4px rgba(0, 0, 0, .4);--shadow-pop: 0 8px 24px -8px rgba(0, 0, 0, .5);--row-py: 10px;--gap: 14px;--focus-ring: 0 0 0 2px var(--bg-0), 0 0 0 4px var(--acc)}[data-theme=light]{--bg-0: #fafaf8;--bg-1: #ffffff;--bg-2: #f4f4f2;--bg-3: #ebebe8;--bg-4: #dcdcd8;--line: #dedcd6;--line-strong: #c4c2bc;--ink-0: #0a0b0d;--ink-1: #1d2126;--ink-2: #3a3e44;--ink-3: #5a5e65;--ink-4: #8c9099;--acc: oklch(.5 .1 195);--acc-dim: oklch(.5 .1 195 / .1);--acc-ink: oklch(.32 .09 195);--ok: oklch(.48 .14 155);--ok-dim: oklch(.48 .14 155 / .12);--warn: oklch(.56 .14 75);--warn-dim: oklch(.56 .14 75 / .12);--err: oklch(.5 .2 25);--err-dim: oklch(.5 .2 25 / .12);--info: oklch(.5 .14 240);--info-dim: oklch(.5 .14 240 / .12);--pending: oklch(.58 .15 85);--pending-dim: oklch(.58 .15 85 / .12)}[data-density=compact]{--row-py: 8px;--gap: 10px}[data-density=comfy]{--row-py: 14px;--gap: 16px}[data-density=spacious]{--row-py: 20px;--gap: 22px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body{height:100%}body{font-family:var(--font-sans);font-feature-settings:"ss01","cv11";font-size:13px;line-height:1.5;color:var(--ink-1);background:var(--bg-0);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}button{font:inherit;color:inherit;background:none;border:none;cursor:pointer}button:focus-visible{outline:none;box-shadow:var(--focus-ring);border-radius:var(--r-2)}input,select,textarea{font:inherit;color:inherit}input:focus-visible{outline:none}a{color:inherit;text-decoration:none}code,kbd,.mono{font-family:var(--font-mono)}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}#root{min-height:100vh}.app{display:grid;grid-template-columns:var(--nav-w) 1fr;min-height:100vh}.nav{background:var(--bg-0);border-right:1px solid var(--line);padding:18px 14px;display:flex;flex-direction:column;gap:22px;position:sticky;top:0;height:100vh;overflow-y:auto}.brand{display:flex;align-items:center;gap:10px;padding:2px 4px}.brand-mark{width:26px;height:26px;border-radius:var(--r-2);background:linear-gradient(135deg,var(--acc),oklch(.66 .1 230));display:grid;place-items:center;color:var(--bg-0);font-family:var(--font-mono);font-weight:600;font-size:13px;letter-spacing:-.04em}.brand-name{font-weight:600;font-size:14px;color:var(--ink-0);letter-spacing:-.01em}.brand-sub{font-size:10.5px;color:var(--ink-3);font-family:var(--font-mono)}.nav-section-label{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);padding:0 8px;margin-bottom:4px;font-weight:600}.nav-list{list-style:none;display:flex;flex-direction:column;gap:1px}.nav-item{display:flex;align-items:center;gap:10px;padding:6px 8px;border-radius:var(--r-2);color:var(--ink-2);cursor:pointer;font-size:13px;transition:background .1s,color .1s;position:relative;width:100%;text-align:left}.nav-item:hover{background:var(--bg-2);color:var(--ink-1)}.nav-item.active{background:var(--bg-2);color:var(--ink-0)}.nav-item.active:before{content:"";position:absolute;left:-14px;top:6px;bottom:6px;width:2px;background:var(--acc);border-radius:0 2px 2px 0}.nav-icon{width:16px;height:16px;opacity:.85;flex-shrink:0}.nav-label{flex:1}.nav-count{font-family:var(--font-mono);font-size:11px;color:var(--ink-3);background:var(--bg-2);padding:1px 6px;border-radius:10px;min-width:18px;text-align:center}.nav-item.active .nav-count{background:var(--bg-3);color:var(--ink-1)}.nav-count.attn{background:var(--pending-dim);color:var(--pending)}.nav-footer{margin-top:auto;padding-top:16px;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:10px;font-size:11.5px}.status-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px #5ec3862e;animation:pulse 2s ease-in-out infinite;flex-shrink:0}.status-dot.off{background:var(--ink-4);box-shadow:none;animation:none}@keyframes pulse{0%,to{box-shadow:0 0 0 2px #5ec38647}50%{box-shadow:0 0 0 5px #5ec38600}}.server-row{display:flex;align-items:center;gap:8px;color:var(--ink-2)}.server-port{margin-left:auto;color:var(--ink-3);font-family:var(--font-mono)}.main{display:flex;flex-direction:column;min-width:0;background:var(--bg-0)}.topbar{display:flex;align-items:center;gap:14px;padding:12px 28px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--bg-0) 85%,transparent);position:sticky;top:0;z-index:40;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.crumbs{display:flex;align-items:center;gap:8px;min-width:0}.crumb{color:var(--ink-2);font-size:13px;white-space:nowrap}.crumb.current{color:var(--ink-0);font-weight:500}.crumb-sep{color:var(--ink-4)}.crumb-project{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r-2);color:var(--ink-1);font-size:12.5px;cursor:pointer;transition:background .1s}.crumb-project:hover{background:var(--bg-3)}.crumb-project .mono{color:var(--ink-3);font-size:11px}.search{flex:1;max-width:420px;display:flex;align-items:center;gap:8px;padding:6px 10px;background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-2);color:var(--ink-2);transition:border-color .1s}.search:focus-within{border-color:var(--ink-4)}.search input{flex:1;background:none;border:none;outline:none;font-size:13px;color:var(--ink-0);min-width:0}.search input::placeholder{color:var(--ink-3)}.kbd{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-3);padding:1px 5px;border:1px solid var(--line);border-radius:3px;background:var(--bg-2)}.topbar-right{display:flex;align-items:center;gap:8px;margin-left:auto}.icon-btn{width:30px;height:30px;display:grid;place-items:center;border-radius:var(--r-2);color:var(--ink-2);transition:background .1s,color .1s;position:relative}.icon-btn:hover{background:var(--bg-2);color:var(--ink-0)}.icon-btn svg{width:16px;height:16px}.icon-btn .dot-badge{position:absolute;top:6px;right:6px;width:6px;height:6px;border-radius:50%;background:var(--pending)}.page{padding:28px 28px 40px;max-width:1280px;width:100%;margin:0 auto}.page-header{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:24px;flex-wrap:wrap}.page-title{font-size:22px;font-weight:600;color:var(--ink-0);letter-spacing:-.015em;line-height:1.1}.page-sub{margin-top:6px;color:var(--ink-2);font-size:13px;max-width:640px}.page-meta{display:flex;gap:16px;align-items:center;font-size:12px;color:var(--ink-3);font-family:var(--font-mono)}.page-meta .live{display:inline-flex;align-items:center;gap:6px;color:var(--ok)}.pill-row{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:18px}.pill{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;background:var(--bg-1);border:1px solid var(--line);border-radius:999px;color:var(--ink-2);font-size:12px;cursor:pointer;transition:background .1s,border-color .1s,color .1s;white-space:nowrap}.pill:hover{background:var(--bg-2);color:var(--ink-1)}.pill.active{background:var(--bg-3);border-color:var(--line-strong);color:var(--ink-0)}.pill-count{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-3);padding:0 5px;background:var(--bg-2);border-radius:10px;min-width:18px;text-align:center}.pill.active .pill-count{background:var(--bg-1);color:var(--ink-1)}.pill.attn{color:var(--pending)}.pill.attn .pill-count{background:var(--pending-dim);color:var(--pending)}.toolbar{display:flex;align-items:center;gap:8px;margin-bottom:14px;flex-wrap:wrap}.toolbar-spacer{flex:1}.select{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-2);font-size:12px;color:var(--ink-1);cursor:pointer}.select:hover{background:var(--bg-2)}.select svg{width:12px;height:12px;opacity:.7}.approval-banner{margin-bottom:18px;padding:14px 18px;background:linear-gradient(180deg,var(--pending-dim),transparent);border:1px solid oklch(.8 .14 85 / .35);border-radius:var(--r-3);display:flex;align-items:center;gap:16px}.approval-banner-dot{width:8px;height:8px;border-radius:50%;background:var(--pending);box-shadow:0 0 0 4px var(--pending-dim);animation:pulse-p 1.6s ease-in-out infinite;flex-shrink:0}@keyframes pulse-p{0%,to{box-shadow:0 0 0 4px #e7b64347}50%{box-shadow:0 0 0 9px #e7b64300}}.approval-banner-text{flex:1}.approval-banner-title{font-weight:600;color:var(--ink-0);font-size:13.5px}.approval-banner-sub{color:var(--ink-2);font-size:12.5px;margin-top:2px}.session-group{margin-bottom:18px;border:1px solid var(--line);border-radius:var(--r-3);background:var(--bg-1);overflow:hidden}.session-group.live{border-color:#5ec38652}.session-header{display:flex;align-items:center;gap:14px;padding:12px 16px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .1s}.session-header:hover{background:var(--bg-2)}.session-chevron{width:14px;height:14px;color:var(--ink-3);transition:transform .15s;flex-shrink:0}.session-group.collapsed .session-chevron{transform:rotate(-90deg)}.session-avatar{width:26px;height:26px;border-radius:50%;background:var(--bg-3);display:grid;place-items:center;font-family:var(--font-mono);font-size:10.5px;color:var(--ink-1);flex-shrink:0}.session-summary{flex:1;min-width:0}.session-summary-top{display:flex;align-items:baseline;gap:10px;color:var(--ink-0);font-size:13.5px;font-weight:500}.session-summary-bottom{font-size:11.5px;color:var(--ink-3);font-family:var(--font-mono);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-live-tag{display:inline-flex;align-items:center;gap:5px;font-size:11px;color:var(--ok);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em}.session-live-tag:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--ok);animation:pulse-s 1.4s ease-in-out infinite}@keyframes pulse-s{0%,to{opacity:1}50%{opacity:.4}}.session-stats{display:flex;gap:14px;font-family:var(--font-mono);font-size:11px;color:var(--ink-3)}.session-stats strong{color:var(--ink-1);font-weight:500}.session-stats .stat.warn{color:var(--pending)}.session-stats .stat.err{color:var(--err)}.session-actions-menu{display:flex;gap:4px}.session-rollback{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;font-size:11.5px;color:var(--ink-2);border:1px solid var(--line);border-radius:var(--r-2);background:var(--bg-2);opacity:0;transition:opacity .1s,color .1s,background .1s}.session-header:hover .session-rollback,.session-header:focus-within .session-rollback{opacity:1}.session-rollback:hover{color:var(--ink-0);background:var(--bg-3)}.session-body{border-top:1px solid var(--line);max-height:3000px;overflow:hidden;transition:max-height .2s ease-out}.session-group.collapsed .session-body{max-height:0;border-top-color:transparent}.action-row{display:grid;grid-template-columns:3px 1fr auto;align-items:center;gap:0 14px;border-top:1px solid var(--line);position:relative;transition:background .1s}.action-row:first-child{border-top:none}.action-row:hover,.action-row.focused,.action-row:focus-within{background:var(--bg-2)}.action-row.obs{opacity:.58}.action-row-open{display:grid;grid-template-columns:auto 110px 1fr auto;align-items:center;gap:14px;padding:var(--row-py, 10px) 0;background:transparent;border:none;text-align:left;width:100%;cursor:pointer;color:inherit;font:inherit}.action-row-open:focus-visible{outline:none;box-shadow:inset 3px 0 0 var(--acc);border-radius:0 var(--r-2) var(--r-2) 0}.action-row>.row-rail{padding:2px 0 2px 16px}.action-row>.row-actions{padding:var(--row-py, 10px) 16px var(--row-py, 10px) 0}.row-rail{align-self:stretch;background:transparent;border-radius:2px;margin:2px 0}.action-row[data-state=pending] .row-rail{background:var(--pending)}.action-row[data-state=blocked] .row-rail{background:var(--err)}.action-row[data-state=rejected] .row-rail{background:var(--err);opacity:.7}.action-row[data-state=error] .row-rail{background:var(--err)}.action-row[data-state=rolledback] .row-rail{background:var(--ink-4)}.action-row[data-state=approved] .row-rail{background:var(--ok)}.action-row[data-state=ok] .row-rail{background:transparent}.row-time{font-family:var(--font-mono);font-size:11px;color:var(--ink-3);white-space:nowrap}.tool-tag{display:inline-flex;align-items:center;gap:6px;padding:2px 8px;border-radius:var(--r-2);font-family:var(--font-mono);font-size:11px;background:var(--bg-2);border:1px solid var(--line);color:var(--ink-1);white-space:nowrap;line-height:1.5}.tool-tag .tdot{width:6px;height:6px;border-radius:50%;background:var(--ink-3)}.tool-tag[data-tool=write_file] .tdot{background:var(--warn)}.tool-tag[data-tool=read_file] .tdot{background:var(--info)}.tool-tag[data-tool=bash] .tdot{background:#a299b4}.tool-tag[data-tool=delete_file] .tdot{background:var(--err)}.row-intent{min-width:0;display:flex;flex-direction:column;gap:2px}.intent-line{display:flex;align-items:baseline;gap:8px;color:var(--ink-0);font-size:13.5px;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.intent-path{font-family:var(--font-mono);font-size:12.5px;color:var(--ink-1);overflow:hidden;text-overflow:ellipsis}.intent-path .dim{color:var(--ink-3)}.intent-sub{font-size:11.5px;color:var(--ink-3);font-family:var(--font-mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:8px}.policy-chip{display:inline-flex;align-items:center;gap:4px;padding:1px 7px;border-radius:10px;font-size:10.5px;font-family:var(--font-mono);border:1px solid var(--line);background:var(--bg-2);color:var(--ink-2);white-space:nowrap;flex-shrink:0}.policy-chip.allow{color:var(--ok);border-color:#5ec3864d;background:var(--ok-dim)}.policy-chip.block{color:var(--err);border-color:#f75d594d;background:var(--err-dim)}.policy-chip.pending{color:var(--pending);border-color:#e7b64359;background:var(--pending-dim)}.policy-chip.obs{color:var(--info);border-color:#55aee84d;background:var(--info-dim)}.status-tag{font-family:var(--font-mono);font-size:11px;color:var(--ink-2);white-space:nowrap;display:flex;align-items:center;gap:6px}.status-tag .sdot{width:6px;height:6px;border-radius:50%}.status-tag[data-s=success] .sdot{background:var(--ok)}.status-tag[data-s=pending] .sdot{background:var(--pending);animation:pulse-s 1.4s ease-in-out infinite}.status-tag[data-s=error] .sdot,.status-tag[data-s=blocked] .sdot{background:var(--err)}.status-tag[data-s=rejected] .sdot{background:var(--err);opacity:.7}.status-tag[data-s=rolledback] .sdot{background:var(--ink-4)}.status-tag[data-s=approved] .sdot{background:var(--ok)}.row-actions{display:flex;gap:6px;align-items:center}.btn{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:var(--r-2);font-size:11.5px;border:1px solid var(--line);background:var(--bg-2);color:var(--ink-1);transition:background .1s,border-color .1s,color .1s;white-space:nowrap}.btn:hover{background:var(--bg-3)}.btn.primary{background:var(--acc);border-color:var(--acc);color:var(--bg-0);font-weight:500}[data-theme=light] .btn.primary{color:#fff}.btn.primary:hover{filter:brightness(1.08)}.btn.ok{background:var(--ok-dim);border-color:#5ec38666;color:var(--ok)}.btn.ok:hover{background:#5ec38638}.btn.danger{background:var(--err-dim);border-color:#f75d5959;color:var(--err)}.btn.danger:hover{background:#f75d5938}.btn.ghost{background:transparent}.btn:disabled{opacity:.5;cursor:default}.btn-lg{padding:7px 14px;font-size:13px}.muted{color:var(--ink-3)}.error-text{color:var(--err);font-family:var(--font-mono);font-size:11px}.empty{padding:56px 24px;text-align:center;color:var(--ink-3);border:1px dashed var(--line);border-radius:var(--r-3);background:var(--bg-1)}.empty-title{color:var(--ink-1);font-size:14px;margin-bottom:4px;font-weight:500}.empty-sub{font-size:12.5px;max-width:420px;margin:0 auto;line-height:1.5}.empty-hint{margin-top:14px;padding:10px 14px;background:var(--bg-0);border:1px solid var(--line);border-radius:var(--r-2);font-family:var(--font-mono);font-size:11.5px;color:var(--ink-2);display:inline-block;text-align:left}.banner{padding:12px 16px;border-radius:var(--r-3);border:1px solid var(--line);background:var(--bg-1);font-size:12.5px;color:var(--ink-2);margin-bottom:18px;display:flex;align-items:center;gap:10px}.banner.err{border-color:#f75d5959;background:var(--err-dim);color:var(--err)}.banner.warn{border-color:#e7b64359;background:var(--pending-dim);color:var(--pending)}.skeleton{background:linear-gradient(90deg,var(--bg-1) 0%,var(--bg-2) 50%,var(--bg-1) 100%);background-size:200% 100%;animation:shimmer 1.2s linear infinite;border-radius:var(--r-2)}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.scrim{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:80;animation:fadein .15s}.drawer{position:fixed;top:0;right:0;width:var(--drawer-w);max-width:100vw;height:100vh;background:var(--bg-1);border-left:1px solid var(--line);box-shadow:var(--shadow-drawer);z-index:90;display:flex;flex-direction:column;animation:slidein .18s ease-out}@keyframes fadein{0%{opacity:0}to{opacity:1}}@keyframes slidein{0%{transform:translate(24px);opacity:0}to{transform:translate(0);opacity:1}}.drawer-head{padding:16px 20px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:12px}.drawer-head-title{font-size:14px;font-weight:600;color:var(--ink-0)}.drawer-head-sub{font-family:var(--font-mono);font-size:11px;color:var(--ink-3);margin-top:2px}.drawer-close{width:28px;height:28px;display:grid;place-items:center;border-radius:var(--r-2);color:var(--ink-2);margin-left:auto}.drawer-close:hover{background:var(--bg-2);color:var(--ink-0)}.drawer-body{flex:1;overflow-y:auto;padding:20px}.drawer-section{margin-bottom:24px}.drawer-section-title{font-size:10.5px;text-transform:uppercase;letter-spacing:.09em;color:var(--ink-3);margin-bottom:10px;font-weight:500}.kv-grid{display:grid;grid-template-columns:120px 1fr;gap:6px 16px;font-size:12.5px}.kv-grid dt{color:var(--ink-3);font-family:var(--font-mono);font-size:11.5px}.kv-grid dd{color:var(--ink-1);font-family:var(--font-mono);font-size:12px;word-break:break-all}.code-block{background:var(--bg-0);border:1px solid var(--line);border-radius:var(--r-2);padding:10px 12px;font-family:var(--font-mono);font-size:11.5px;line-height:1.55;color:var(--ink-1);white-space:pre-wrap;word-break:break-all;max-height:320px;overflow-y:auto}.code-block .comment{color:var(--ink-3)}.diff{border:1px solid var(--line);border-radius:var(--r-2);background:var(--bg-0);overflow:hidden}.diff-hdr{display:flex;font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);background:var(--bg-2);border-bottom:1px solid var(--line)}.diff-hdr>div{flex:1;padding:6px 12px}.diff-hdr>div+div{border-left:1px solid var(--line)}.diff-body{display:flex;font-family:var(--font-mono);font-size:11px;line-height:1.55;max-height:260px;overflow:auto}.diff-body>pre{flex:1;padding:10px 12px;margin:0;white-space:pre-wrap;word-break:break-all;color:var(--ink-2)}.diff-body>pre+pre{border-left:1px solid var(--line)}.diff-body .add{background:#5ec38621;color:var(--ok);display:block;margin:0 -12px;padding:0 12px}.diff-body .del{background:#f75d5921;color:var(--err);display:block;margin:0 -12px;padding:0 12px}.drawer-foot{border-top:1px solid var(--line);padding:14px 20px;display:flex;gap:10px;align-items:center;background:var(--bg-1)}.drawer-foot .spacer{flex:1}.card{background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-3);overflow:hidden}.card-header{padding:14px 18px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:12px}.card-title{font-weight:600;color:var(--ink-0);font-size:13.5px}.card-sub{color:var(--ink-3);font-size:12px}.card-body{padding:18px}.card-body.flush{padding:0}.list{list-style:none}.list>li{padding:12px 18px;border-top:1px solid var(--line);display:flex;align-items:center;gap:14px}.list>li:first-child{border-top:none}.list-title{color:var(--ink-0);font-size:13px;font-weight:500}.list-sub{color:var(--ink-3);font-size:11.5px;font-family:var(--font-mono);margin-top:2px}.toast-stack{position:fixed;bottom:20px;left:50%;transform:translate(-50%);z-index:120;display:flex;flex-direction:column;gap:8px;pointer-events:none}.toast{pointer-events:auto;background:var(--bg-1);border:1px solid var(--line-strong);border-radius:var(--r-3);padding:10px 14px;font-size:12.5px;color:var(--ink-1);box-shadow:var(--shadow-pop);min-width:220px;max-width:480px;display:flex;gap:10px;align-items:center;animation:slideup .2s ease-out}@keyframes slideup{0%{transform:translateY(8px);opacity:0}to{transform:translateY(0);opacity:1}}.toast.ok{border-color:#5ec38666}.toast.err{border-color:#f75d5966;color:var(--err)}.modal-scrim{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);z-index:110;display:grid;place-items:center;padding:16px;animation:fadein .12s}.modal{width:min(480px,100%);background:var(--bg-1);border:1px solid var(--line-strong);border-radius:var(--r-3);box-shadow:var(--shadow-pop);overflow:hidden}.modal-head{padding:16px 20px;border-bottom:1px solid var(--line)}.modal-title{font-size:14px;font-weight:600;color:var(--ink-0)}.modal-body{padding:16px 20px;color:var(--ink-1);font-size:13px}.modal-body textarea,.modal-body input{margin-top:10px;width:100%;padding:8px 10px;background:var(--bg-0);border:1px solid var(--line);border-radius:var(--r-2);color:var(--ink-0);font-size:12.5px;font-family:var(--font-mono);outline:none;resize:vertical}.modal-body textarea:focus,.modal-body input:focus{border-color:var(--ink-4)}.modal-foot{padding:12px 20px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:8px}.tweaks{position:fixed;bottom:20px;right:20px;z-index:70;background:var(--bg-1);border:1px solid var(--line-strong);border-radius:var(--r-3);box-shadow:var(--shadow-pop);padding:14px 16px;width:260px}.tweaks h4{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);margin-bottom:10px;font-weight:500}.tweak-row{display:flex;align-items:center;justify-content:space-between;padding:5px 0;font-size:12px}.tweak-row label{color:var(--ink-1)}.tweak-group{display:inline-flex;background:var(--bg-2);padding:2px;border-radius:var(--r-2);gap:2px}.tweak-group button{padding:3px 8px;border-radius:4px;font-size:11px;color:var(--ink-2)}.tweak-group button.on{background:var(--bg-4);color:var(--ink-0)}.accent-swatches{display:flex;gap:6px}.accent-swatch{width:20px;height:20px;border-radius:50%;border:2px solid transparent;transition:border-color .1s,transform .1s;cursor:pointer}.accent-swatch.on{border-color:var(--ink-0);transform:scale(1.08)}.settings{display:grid;grid-template-columns:200px 1fr;gap:28px}.settings-nav{display:flex;flex-direction:column;gap:2px;position:sticky;top:84px;align-self:start}.settings-nav a{display:flex;align-items:center;gap:10px;padding:6px 10px;border-radius:var(--r-2);color:var(--ink-2);font-size:13px;transition:background .1s,color .1s;cursor:pointer;text-decoration:none}.settings-nav a:hover{background:var(--bg-2);color:var(--ink-1)}.settings-nav a.active{background:var(--bg-2);color:var(--ink-0)}.settings-nav a svg{opacity:.8;flex-shrink:0}.settings-section{display:flex;flex-direction:column;gap:18px;min-width:0}.settings-section h2{font-size:15px;font-weight:600;color:var(--ink-0);letter-spacing:-.01em}.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px 14px}.field{display:flex;flex-direction:column;gap:6px}.field label{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);font-weight:500}.field input,.field textarea,.field select{padding:7px 10px;background:var(--bg-0);border:1px solid var(--line);border-radius:var(--r-2);color:var(--ink-0);font-size:12.5px;font-family:var(--font-mono);outline:none;transition:border-color .1s}.field input:focus,.field textarea:focus,.field select:focus{border-color:var(--ink-4)}.field .hint{font-size:11px;color:var(--ink-3)}@media (max-width: 900px){.settings{grid-template-columns:1fr;gap:18px}.settings-nav{position:static;flex-direction:row;overflow-x:auto;border-bottom:1px solid var(--line);padding-bottom:6px}}.queue{display:grid;grid-template-columns:repeat(auto-fit,minmax(420px,1fr));gap:14px}.queue-card{display:flex;flex-direction:column}.queue-card .card-body{flex:1}.queue-card .drawer-foot{padding:12px 18px;border-top:1px solid var(--line)}.policy-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}.policy-card{background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-3);padding:14px 16px}.policy-card-title{display:flex;align-items:center;gap:8px;font-size:12.5px;font-weight:600;color:var(--ink-0);margin-bottom:10px}.policy-rule{display:flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:12px;padding:5px 0;border-top:1px dashed var(--line);color:var(--ink-1)}.policy-rule:first-of-type{border-top:none}.policy-rule .tag{margin-left:auto;font-size:9.5px;color:var(--ink-3);text-transform:uppercase;letter-spacing:.08em;font-weight:600}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:18px}.stat-card{background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-3);padding:14px 16px}.stat-label{font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);margin-bottom:8px}.stat-value{font-size:26px;font-weight:500;color:var(--ink-0);font-family:var(--font-sans);letter-spacing:-.02em;line-height:1}.stat-delta{font-family:var(--font-mono);font-size:11px;margin-top:6px;color:var(--ink-3)}.stat-delta.up{color:var(--ok)}.stat-delta.down{color:var(--err)}.spark{width:100%;height:50px;margin-top:10px}.drawer-body::-webkit-scrollbar,.code-block::-webkit-scrollbar{width:8px}.drawer-body::-webkit-scrollbar-thumb,.code-block::-webkit-scrollbar-thumb{background:var(--bg-3);border-radius:4px}@media (max-width: 900px){.app{grid-template-columns:1fr}.nav{position:static;height:auto;border-right:none;border-bottom:1px solid var(--line)}.page{padding:20px 16px 32px}.topbar{padding:10px 16px;gap:10px}.search{max-width:none}.action-row{grid-template-columns:3px 1fr}.action-row>.row-actions{grid-column:2;padding:0 14px 12px;justify-self:end}.action-row-open{grid-template-columns:auto 1fr;grid-template-areas:"time intent" "tool tool" "status status";gap:8px 12px;padding:12px 14px}.action-row-open>.row-time{grid-area:time}.action-row-open>.tool-tag{grid-area:tool;justify-self:start}.action-row-open>.row-intent{grid-area:intent}.action-row-open>.status-tag{grid-area:status;justify-self:start}.drawer{width:100vw}.kv-grid{grid-template-columns:100px 1fr}}
1
+ @font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2) format("woff2"),url(/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2) format("woff2"),url(/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2) format("woff2"),url(/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2) format("woff2"),url(/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2) format("woff2"),url(/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2) format("woff2"),url(/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2) format("woff2"),url(/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2) format("woff2"),url(/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2) format("woff2"),url(/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--font-sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;--bg-0: #0a0b0d;--bg-1: #101215;--bg-2: #16191d;--bg-3: #1d2126;--bg-4: #262b31;--line: #22262c;--line-strong: #2d3238;--ink-0: #f5f6f7;--ink-1: #d6d9dd;--ink-2: #a8aeb6;--ink-3: #8c929b;--ink-4: #6a7079;--acc: oklch(.72 .09 195);--acc-dim: oklch(.72 .09 195 / .15);--acc-ink: oklch(.95 .03 195);--ok: oklch(.74 .13 155);--ok-dim: oklch(.74 .13 155 / .14);--warn: oklch(.78 .13 75);--warn-dim: oklch(.78 .13 75 / .14);--err: oklch(.68 .19 25);--err-dim: oklch(.68 .19 25 / .14);--info: oklch(.72 .12 240);--info-dim: oklch(.72 .12 240 / .14);--pending: oklch(.8 .14 85);--pending-dim: oklch(.8 .14 85 / .14);--r-1: 4px;--r-2: 6px;--r-3: 10px;--r-4: 14px;--nav-w: 232px;--drawer-w: 560px;--shadow-drawer: 0 24px 48px -12px rgba(0, 0, 0, .6), 0 8px 16px -4px rgba(0, 0, 0, .4);--shadow-pop: 0 8px 24px -8px rgba(0, 0, 0, .5);--row-py: 10px;--gap: 14px;--focus-ring: 0 0 0 2px var(--bg-0), 0 0 0 4px var(--acc)}[data-theme=light]{--bg-0: #fafaf8;--bg-1: #ffffff;--bg-2: #f4f4f2;--bg-3: #ebebe8;--bg-4: #dcdcd8;--line: #dedcd6;--line-strong: #c4c2bc;--ink-0: #0a0b0d;--ink-1: #1d2126;--ink-2: #3a3e44;--ink-3: #5a5e65;--ink-4: #8c9099;--acc: oklch(.5 .1 195);--acc-dim: oklch(.5 .1 195 / .1);--acc-ink: oklch(.32 .09 195);--ok: oklch(.48 .14 155);--ok-dim: oklch(.48 .14 155 / .12);--warn: oklch(.56 .14 75);--warn-dim: oklch(.56 .14 75 / .12);--err: oklch(.5 .2 25);--err-dim: oklch(.5 .2 25 / .12);--info: oklch(.5 .14 240);--info-dim: oklch(.5 .14 240 / .12);--pending: oklch(.58 .15 85);--pending-dim: oklch(.58 .15 85 / .12)}[data-density=compact]{--row-py: 8px;--gap: 10px}[data-density=comfy]{--row-py: 14px;--gap: 16px}[data-density=spacious]{--row-py: 20px;--gap: 22px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body{height:100%}body{font-family:var(--font-sans);font-feature-settings:"ss01","cv11";font-size:13px;line-height:1.5;color:var(--ink-1);background:var(--bg-0);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}button{font:inherit;color:inherit;background:none;border:none;cursor:pointer}button:focus-visible{outline:none;box-shadow:var(--focus-ring);border-radius:var(--r-2)}input,select,textarea{font:inherit;color:inherit}input:focus-visible{outline:none}a{color:inherit;text-decoration:none}code,kbd,.mono{font-family:var(--font-mono)}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}#root{min-height:100vh}.app{display:grid;grid-template-columns:var(--nav-w) 1fr;min-height:100vh}.nav{background:var(--bg-0);border-right:1px solid var(--line);padding:18px 14px;display:flex;flex-direction:column;gap:22px;position:sticky;top:0;height:100vh;overflow-y:auto}.brand{display:flex;align-items:center;gap:10px;padding:2px 4px}.brand-mark{width:26px;height:26px;border-radius:var(--r-2);background:linear-gradient(135deg,var(--acc),oklch(.66 .1 230));display:grid;place-items:center;color:var(--bg-0);font-family:var(--font-mono);font-weight:600;font-size:13px;letter-spacing:-.04em}.brand-name{font-weight:600;font-size:14px;color:var(--ink-0);letter-spacing:-.01em}.brand-sub{font-size:10.5px;color:var(--ink-3);font-family:var(--font-mono)}.nav-section-label{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);padding:0 8px;margin-bottom:4px;font-weight:600}.nav-list{list-style:none;display:flex;flex-direction:column;gap:1px}.nav-item{display:flex;align-items:center;gap:10px;padding:6px 8px;border-radius:var(--r-2);color:var(--ink-2);cursor:pointer;font-size:13px;transition:background .1s,color .1s;position:relative;width:100%;text-align:left}.nav-item:hover{background:var(--bg-2);color:var(--ink-1)}.nav-item.active{background:var(--bg-2);color:var(--ink-0)}.nav-item.active:before{content:"";position:absolute;left:-14px;top:6px;bottom:6px;width:2px;background:var(--acc);border-radius:0 2px 2px 0}.nav-icon{width:16px;height:16px;opacity:.85;flex-shrink:0}.nav-label{flex:1}.nav-count{font-family:var(--font-mono);font-size:11px;color:var(--ink-3);background:var(--bg-2);padding:1px 6px;border-radius:10px;min-width:18px;text-align:center}.nav-item.active .nav-count{background:var(--bg-3);color:var(--ink-1)}.nav-count.attn{background:var(--pending-dim);color:var(--pending)}.nav-footer{margin-top:auto;padding-top:16px;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:10px;font-size:11.5px}.status-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px #5ec3862e;animation:pulse 2s ease-in-out infinite;flex-shrink:0}.status-dot.off{background:var(--ink-4);box-shadow:none;animation:none}@keyframes pulse{0%,to{box-shadow:0 0 0 2px #5ec38647}50%{box-shadow:0 0 0 5px #5ec38600}}.server-row{display:flex;align-items:center;gap:8px;color:var(--ink-2)}.server-port{margin-left:auto;color:var(--ink-3);font-family:var(--font-mono)}.main{display:flex;flex-direction:column;min-width:0;background:var(--bg-0)}.topbar{display:flex;align-items:center;gap:14px;padding:12px 28px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--bg-0) 85%,transparent);position:sticky;top:0;z-index:40;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.crumbs{display:flex;align-items:center;gap:8px;min-width:0}.crumb{color:var(--ink-2);font-size:13px;white-space:nowrap}.crumb.current{color:var(--ink-0);font-weight:500}.crumb-sep{color:var(--ink-4)}.crumb-project{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r-2);color:var(--ink-1);font-size:12.5px;cursor:pointer;transition:background .1s}.crumb-project:hover{background:var(--bg-3)}.crumb-project .mono{color:var(--ink-3);font-size:11px}.search{flex:1;max-width:420px;display:flex;align-items:center;gap:8px;padding:6px 10px;background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-2);color:var(--ink-2);transition:border-color .1s}.search:focus-within{border-color:var(--ink-4)}.search input{flex:1;background:none;border:none;outline:none;font-size:13px;color:var(--ink-0);min-width:0}.search input::placeholder{color:var(--ink-3)}.kbd{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-3);padding:1px 5px;border:1px solid var(--line);border-radius:3px;background:var(--bg-2)}.topbar-right{display:flex;align-items:center;gap:8px;margin-left:auto}.icon-btn{width:30px;height:30px;display:grid;place-items:center;border-radius:var(--r-2);color:var(--ink-2);transition:background .1s,color .1s;position:relative}.icon-btn:hover{background:var(--bg-2);color:var(--ink-0)}.icon-btn svg{width:16px;height:16px}.icon-btn .dot-badge{position:absolute;top:6px;right:6px;width:6px;height:6px;border-radius:50%;background:var(--pending)}.page{padding:28px 28px 40px;max-width:1280px;width:100%;margin:0 auto}.page-header{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:24px;flex-wrap:wrap}.page-title{font-size:22px;font-weight:600;color:var(--ink-0);letter-spacing:-.015em;line-height:1.1}.page-sub{margin-top:6px;color:var(--ink-2);font-size:13px;max-width:640px}.page-meta{display:flex;gap:16px;align-items:center;font-size:12px;color:var(--ink-3);font-family:var(--font-mono)}.page-meta .live{display:inline-flex;align-items:center;gap:6px;color:var(--ok)}.pill-row{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:18px}.pill{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;background:var(--bg-1);border:1px solid var(--line);border-radius:999px;color:var(--ink-2);font-size:12px;cursor:pointer;transition:background .1s,border-color .1s,color .1s;white-space:nowrap}.pill:hover{background:var(--bg-2);color:var(--ink-1)}.pill.active{background:var(--bg-3);border-color:var(--line-strong);color:var(--ink-0)}.pill-count{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-3);padding:0 5px;background:var(--bg-2);border-radius:10px;min-width:18px;text-align:center}.pill.active .pill-count{background:var(--bg-1);color:var(--ink-1)}.pill.attn{color:var(--pending)}.pill.attn .pill-count{background:var(--pending-dim);color:var(--pending)}.toolbar{display:flex;align-items:center;gap:8px;margin-bottom:14px;flex-wrap:wrap}.toolbar-spacer{flex:1}.select{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-2);font-size:12px;color:var(--ink-1);cursor:pointer}.select:hover{background:var(--bg-2)}.select svg{width:12px;height:12px;opacity:.7}.approval-banner{margin-bottom:18px;padding:14px 18px;background:linear-gradient(180deg,var(--pending-dim),transparent);border:1px solid oklch(.8 .14 85 / .35);border-radius:var(--r-3);display:flex;align-items:center;gap:16px}.approval-banner-dot{width:8px;height:8px;border-radius:50%;background:var(--pending);box-shadow:0 0 0 4px var(--pending-dim);animation:pulse-p 1.6s ease-in-out infinite;flex-shrink:0}@keyframes pulse-p{0%,to{box-shadow:0 0 0 4px #e7b64347}50%{box-shadow:0 0 0 9px #e7b64300}}.approval-banner-text{flex:1}.approval-banner-title{font-weight:600;color:var(--ink-0);font-size:13.5px}.approval-banner-sub{color:var(--ink-2);font-size:12.5px;margin-top:2px}.session-group{margin-bottom:18px;border:1px solid var(--line);border-radius:var(--r-3);background:var(--bg-1);overflow:hidden}.session-group.live{border-color:#5ec38652}.session-header{display:flex;align-items:center;gap:14px;padding:12px 16px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .1s}.session-header:hover{background:var(--bg-2)}.session-chevron{width:14px;height:14px;color:var(--ink-3);transition:transform .15s;flex-shrink:0}.session-group.collapsed .session-chevron{transform:rotate(-90deg)}.session-avatar{width:26px;height:26px;border-radius:50%;background:var(--bg-3);display:grid;place-items:center;font-family:var(--font-mono);font-size:10.5px;color:var(--ink-1);flex-shrink:0}.session-summary{flex:1;min-width:0}.session-summary-top{display:flex;align-items:baseline;gap:10px;color:var(--ink-0);font-size:13.5px;font-weight:500}.session-summary-bottom{font-size:11.5px;color:var(--ink-3);font-family:var(--font-mono);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-live-tag{display:inline-flex;align-items:center;gap:5px;font-size:11px;color:var(--ok);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em}.session-live-tag:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--ok);animation:pulse-s 1.4s ease-in-out infinite}@keyframes pulse-s{0%,to{opacity:1}50%{opacity:.4}}.session-stats{display:flex;gap:14px;font-family:var(--font-mono);font-size:11px;color:var(--ink-3)}.session-stats strong{color:var(--ink-1);font-weight:500}.session-stats .stat.warn{color:var(--pending)}.session-stats .stat.err{color:var(--err)}.session-actions-menu{display:flex;gap:4px}.session-rollback{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;font-size:11.5px;color:var(--ink-2);border:1px solid var(--line);border-radius:var(--r-2);background:var(--bg-2);opacity:0;transition:opacity .1s,color .1s,background .1s}.session-header:hover .session-rollback,.session-header:focus-within .session-rollback{opacity:1}.session-rollback:hover{color:var(--ink-0);background:var(--bg-3)}.session-body{border-top:1px solid var(--line);max-height:3000px;overflow:hidden;transition:max-height .2s ease-out}.session-group.collapsed .session-body{max-height:0;border-top-color:transparent}.action-row{display:grid;grid-template-columns:3px 1fr auto;align-items:center;gap:0 14px;border-top:1px solid var(--line);position:relative;transition:background .1s}.action-row:first-child{border-top:none}.action-row:hover,.action-row.focused,.action-row:focus-within{background:var(--bg-2)}.action-row.obs{opacity:.58}.action-row-open{display:grid;grid-template-columns:auto 110px 1fr auto;align-items:center;gap:14px;padding:var(--row-py, 10px) 0;background:transparent;border:none;text-align:left;width:100%;cursor:pointer;color:inherit;font:inherit}.action-row-open:focus-visible{outline:none;box-shadow:inset 3px 0 0 var(--acc);border-radius:0 var(--r-2) var(--r-2) 0}.action-row>.row-rail{padding:2px 0 2px 16px}.action-row>.row-actions{padding:var(--row-py, 10px) 16px var(--row-py, 10px) 0}.row-rail{align-self:stretch;background:transparent;border-radius:2px;margin:2px 0}.action-row[data-state=pending] .row-rail{background:var(--pending)}.action-row[data-state=blocked] .row-rail{background:var(--err)}.action-row[data-state=rejected] .row-rail{background:var(--err);opacity:.7}.action-row[data-state=error] .row-rail{background:var(--err)}.action-row[data-state=rolledback] .row-rail{background:var(--ink-4)}.action-row[data-state=approved] .row-rail{background:var(--ok)}.action-row[data-state=ok] .row-rail{background:transparent}.row-time{font-family:var(--font-mono);font-size:11px;color:var(--ink-3);white-space:nowrap}.tool-tag{display:inline-flex;align-items:center;gap:6px;padding:2px 8px;border-radius:var(--r-2);font-family:var(--font-mono);font-size:11px;background:var(--bg-2);border:1px solid var(--line);color:var(--ink-1);white-space:nowrap;line-height:1.5}.tool-tag .tdot{width:6px;height:6px;border-radius:50%;background:var(--ink-3)}.tool-tag[data-tool=write_file] .tdot{background:var(--warn)}.tool-tag[data-tool=read_file] .tdot{background:var(--info)}.tool-tag[data-tool=bash] .tdot{background:#a299b4}.tool-tag[data-tool=delete_file] .tdot{background:var(--err)}.row-intent{min-width:0;display:flex;flex-direction:column;gap:2px}.intent-line{display:flex;align-items:baseline;gap:8px;color:var(--ink-0);font-size:13.5px;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.intent-path{font-family:var(--font-mono);font-size:12.5px;color:var(--ink-1);overflow:hidden;text-overflow:ellipsis}.intent-path .dim{color:var(--ink-3)}.intent-sub{font-size:11.5px;color:var(--ink-3);font-family:var(--font-mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:8px}.policy-chip{display:inline-flex;align-items:center;gap:4px;padding:1px 7px;border-radius:10px;font-size:10.5px;font-family:var(--font-mono);border:1px solid var(--line);background:var(--bg-2);color:var(--ink-2);white-space:nowrap;flex-shrink:0}.policy-chip.allow{color:var(--ok);border-color:#5ec3864d;background:var(--ok-dim)}.policy-chip.block{color:var(--err);border-color:#f75d594d;background:var(--err-dim)}.policy-chip.pending{color:var(--pending);border-color:#e7b64359;background:var(--pending-dim)}.policy-chip.obs{color:var(--info);border-color:#55aee84d;background:var(--info-dim)}.status-tag{font-family:var(--font-mono);font-size:11px;color:var(--ink-2);white-space:nowrap;display:flex;align-items:center;gap:6px}.status-tag .sdot{width:6px;height:6px;border-radius:50%}.status-tag[data-s=success] .sdot{background:var(--ok)}.status-tag[data-s=pending] .sdot{background:var(--pending);animation:pulse-s 1.4s ease-in-out infinite}.status-tag[data-s=error] .sdot,.status-tag[data-s=blocked] .sdot{background:var(--err)}.status-tag[data-s=rejected] .sdot{background:var(--err);opacity:.7}.status-tag[data-s=rolledback] .sdot{background:var(--ink-4)}.status-tag[data-s=approved] .sdot{background:var(--ok)}.row-actions{display:flex;gap:6px;align-items:center}.btn{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:var(--r-2);font-size:11.5px;border:1px solid var(--line);background:var(--bg-2);color:var(--ink-1);transition:background .1s,border-color .1s,color .1s;white-space:nowrap}.btn:hover{background:var(--bg-3)}.btn.primary{background:var(--acc);border-color:var(--acc);color:var(--bg-0);font-weight:500}[data-theme=light] .btn.primary{color:#fff}.btn.primary:hover{filter:brightness(1.08)}.btn.ok{background:var(--ok-dim);border-color:#5ec38666;color:var(--ok)}.btn.ok:hover{background:#5ec38638}.btn.danger{background:var(--err-dim);border-color:#f75d5959;color:var(--err)}.btn.danger:hover{background:#f75d5938}.btn.ghost{background:transparent}.btn:disabled{opacity:.5;cursor:default}.btn-lg{padding:7px 14px;font-size:13px}.muted{color:var(--ink-3)}.error-text{color:var(--err);font-family:var(--font-mono);font-size:11px}.empty{padding:56px 24px;text-align:center;color:var(--ink-3);border:1px dashed var(--line);border-radius:var(--r-3);background:var(--bg-1)}.empty-title{color:var(--ink-1);font-size:14px;margin-bottom:4px;font-weight:500}.empty-sub{font-size:12.5px;max-width:420px;margin:0 auto;line-height:1.5}.empty-hint{margin-top:14px;padding:10px 14px;background:var(--bg-0);border:1px solid var(--line);border-radius:var(--r-2);font-family:var(--font-mono);font-size:11.5px;color:var(--ink-2);display:inline-block;text-align:left}.banner{padding:12px 16px;border-radius:var(--r-3);border:1px solid var(--line);background:var(--bg-1);font-size:12.5px;color:var(--ink-2);margin-bottom:18px;display:flex;align-items:center;gap:10px}.banner.err{border-color:#f75d5959;background:var(--err-dim);color:var(--err)}.banner.warn{border-color:#e7b64359;background:var(--pending-dim);color:var(--pending)}.skeleton{background:linear-gradient(90deg,var(--bg-1) 0%,var(--bg-2) 50%,var(--bg-1) 100%);background-size:200% 100%;animation:shimmer 1.2s linear infinite;border-radius:var(--r-2)}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.scrim{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:80;animation:fadein .15s}.drawer{position:fixed;top:0;right:0;width:var(--drawer-w);max-width:100vw;height:100vh;background:var(--bg-1);border-left:1px solid var(--line);box-shadow:var(--shadow-drawer);z-index:90;display:flex;flex-direction:column;animation:slidein .18s ease-out}@keyframes fadein{0%{opacity:0}to{opacity:1}}@keyframes slidein{0%{transform:translate(24px);opacity:0}to{transform:translate(0);opacity:1}}.drawer-head{padding:16px 20px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:12px}.drawer-head-title{font-size:14px;font-weight:600;color:var(--ink-0)}.drawer-head-sub{font-family:var(--font-mono);font-size:11px;color:var(--ink-3);margin-top:2px}.drawer-close{width:28px;height:28px;display:grid;place-items:center;border-radius:var(--r-2);color:var(--ink-2);margin-left:auto}.drawer-close:hover{background:var(--bg-2);color:var(--ink-0)}.drawer-body{flex:1;overflow-y:auto;padding:20px}.drawer-section{margin-bottom:24px}.drawer-section-title{font-size:10.5px;text-transform:uppercase;letter-spacing:.09em;color:var(--ink-3);margin-bottom:10px;font-weight:500}.kv-grid{display:grid;grid-template-columns:120px 1fr;gap:6px 16px;font-size:12.5px}.kv-grid dt{color:var(--ink-3);font-family:var(--font-mono);font-size:11.5px}.kv-grid dd{color:var(--ink-1);font-family:var(--font-mono);font-size:12px;word-break:break-all}.code-block{background:var(--bg-0);border:1px solid var(--line);border-radius:var(--r-2);padding:10px 12px;font-family:var(--font-mono);font-size:11.5px;line-height:1.55;color:var(--ink-1);white-space:pre-wrap;word-break:break-all;max-height:320px;overflow-y:auto}.code-block .comment{color:var(--ink-3)}.diff{border:1px solid var(--line);border-radius:var(--r-2);background:var(--bg-0);overflow:hidden}.diff-hdr{display:flex;font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);background:var(--bg-2);border-bottom:1px solid var(--line)}.diff-hdr>div{flex:1;padding:6px 12px}.diff-hdr>div+div{border-left:1px solid var(--line)}.diff-body{display:flex;font-family:var(--font-mono);font-size:11px;line-height:1.55;max-height:260px;overflow:auto}.diff-body>pre{flex:1;padding:10px 12px;margin:0;white-space:pre-wrap;word-break:break-all;color:var(--ink-2)}.diff-body>pre+pre{border-left:1px solid var(--line)}.diff-body .add{background:#5ec38621;color:var(--ok);display:block;margin:0 -12px;padding:0 12px}.diff-body .del{background:#f75d5921;color:var(--err);display:block;margin:0 -12px;padding:0 12px}.drawer-foot{border-top:1px solid var(--line);padding:14px 20px;display:flex;gap:10px;align-items:center;background:var(--bg-1)}.drawer-foot .spacer{flex:1}.card{background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-3);overflow:hidden}.card-header{padding:14px 18px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:12px}.card-title{font-weight:600;color:var(--ink-0);font-size:13.5px}.card-sub{color:var(--ink-3);font-size:12px}.card-body{padding:18px}.card-body.flush{padding:0}.list{list-style:none}.list>li{padding:12px 18px;border-top:1px solid var(--line);display:flex;align-items:center;gap:14px}.list>li:first-child{border-top:none}.list-title{color:var(--ink-0);font-size:13px;font-weight:500}.list-sub{color:var(--ink-3);font-size:11.5px;font-family:var(--font-mono);margin-top:2px}.toast-stack{position:fixed;bottom:20px;left:50%;transform:translate(-50%);z-index:120;display:flex;flex-direction:column;gap:8px;pointer-events:none}.toast{pointer-events:auto;background:var(--bg-1);border:1px solid var(--line-strong);border-radius:var(--r-3);padding:10px 14px;font-size:12.5px;color:var(--ink-1);box-shadow:var(--shadow-pop);min-width:220px;max-width:480px;display:flex;gap:10px;align-items:center;animation:slideup .2s ease-out}@keyframes slideup{0%{transform:translateY(8px);opacity:0}to{transform:translateY(0);opacity:1}}.toast.ok{border-color:#5ec38666}.toast.err{border-color:#f75d5966;color:var(--err)}.modal-scrim{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);z-index:110;display:grid;place-items:center;padding:16px;animation:fadein .12s}.modal{width:min(480px,100%);background:var(--bg-1);border:1px solid var(--line-strong);border-radius:var(--r-3);box-shadow:var(--shadow-pop);overflow:hidden}.modal-head{padding:16px 20px;border-bottom:1px solid var(--line)}.modal-title{font-size:14px;font-weight:600;color:var(--ink-0)}.modal-body{padding:16px 20px;color:var(--ink-1);font-size:13px}.modal-body textarea,.modal-body input{margin-top:10px;width:100%;padding:8px 10px;background:var(--bg-0);border:1px solid var(--line);border-radius:var(--r-2);color:var(--ink-0);font-size:12.5px;font-family:var(--font-mono);outline:none;resize:vertical}.modal-body textarea:focus,.modal-body input:focus{border-color:var(--ink-4)}.modal-foot{padding:12px 20px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:8px}.tweaks{position:fixed;bottom:20px;right:20px;z-index:70;background:var(--bg-1);border:1px solid var(--line-strong);border-radius:var(--r-3);box-shadow:var(--shadow-pop);padding:14px 16px;width:260px}.tweaks h4{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);margin-bottom:10px;font-weight:500}.tweak-row{display:flex;align-items:center;justify-content:space-between;padding:5px 0;font-size:12px}.tweak-row label{color:var(--ink-1)}.tweak-group{display:inline-flex;background:var(--bg-2);padding:2px;border-radius:var(--r-2);gap:2px}.tweak-group button{padding:3px 8px;border-radius:4px;font-size:11px;color:var(--ink-2)}.tweak-group button.on{background:var(--bg-4);color:var(--ink-0)}.accent-swatches{display:flex;gap:6px}.accent-swatch{width:20px;height:20px;border-radius:50%;border:2px solid transparent;transition:border-color .1s,transform .1s;cursor:pointer}.accent-swatch.on{border-color:var(--ink-0);transform:scale(1.08)}.settings{display:grid;grid-template-columns:200px 1fr;gap:28px}.settings-nav{display:flex;flex-direction:column;gap:2px;position:sticky;top:84px;align-self:start}.settings-nav a{display:flex;align-items:center;gap:10px;padding:6px 10px;border-radius:var(--r-2);color:var(--ink-2);font-size:13px;transition:background .1s,color .1s;cursor:pointer;text-decoration:none}.settings-nav a:hover{background:var(--bg-2);color:var(--ink-1)}.settings-nav a.active{background:var(--bg-2);color:var(--ink-0)}.settings-nav a svg{opacity:.8;flex-shrink:0}.settings-section{display:flex;flex-direction:column;gap:18px;min-width:0}.settings-section h2{font-size:15px;font-weight:600;color:var(--ink-0);letter-spacing:-.01em}.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px 14px}.field{display:flex;flex-direction:column;gap:6px}.field label{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);font-weight:500}.field input,.field textarea,.field select{padding:7px 10px;background:var(--bg-0);border:1px solid var(--line);border-radius:var(--r-2);color:var(--ink-0);font-size:12.5px;font-family:var(--font-mono);outline:none;transition:border-color .1s}.field input:focus,.field textarea:focus,.field select:focus{border-color:var(--ink-4)}.field .hint{font-size:11px;color:var(--ink-3)}@media (max-width: 900px){.settings{grid-template-columns:1fr;gap:18px}.settings-nav{position:static;flex-direction:row;overflow-x:auto;border-bottom:1px solid var(--line);padding-bottom:6px}}.queue{display:grid;grid-template-columns:repeat(auto-fit,minmax(420px,1fr));gap:14px}.queue-card{display:flex;flex-direction:column}.queue-card .card-body{flex:1}.queue-card .drawer-foot{padding:12px 18px;border-top:1px solid var(--line)}.policy-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}.policy-card{background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-3);padding:14px 16px}.policy-card-title{display:flex;align-items:center;gap:8px;font-size:12.5px;font-weight:600;color:var(--ink-0);margin-bottom:10px}.policy-rule{display:flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:12px;padding:5px 0;border-top:1px dashed var(--line);color:var(--ink-1)}.policy-rule:first-of-type{border-top:none}.policy-rule .tag{margin-left:auto;font-size:9.5px;color:var(--ink-3);text-transform:uppercase;letter-spacing:.08em;font-weight:600}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:18px}.stat-card{background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-3);padding:14px 16px}.stat-label{font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);margin-bottom:8px}.stat-value{font-size:26px;font-weight:500;color:var(--ink-0);font-family:var(--font-sans);letter-spacing:-.02em;line-height:1}.stat-delta{font-family:var(--font-mono);font-size:11px;margin-top:6px;color:var(--ink-3)}.stat-delta.up{color:var(--ok)}.stat-delta.down{color:var(--err)}.spark{width:100%;height:50px;margin-top:10px}.badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;font-size:10px;font-family:var(--font-mono);font-weight:600;text-transform:uppercase;letter-spacing:.05em;border:1px solid transparent;white-space:nowrap;flex-shrink:0}.badge-default{background:var(--bg-3);color:var(--ink-2);border-color:var(--line)}.badge-thinking,.badge-executing{background:var(--acc-dim);color:var(--acc-ink);border-color:#57b6b659}.badge-waiting{background:var(--pending-dim);color:var(--pending);border-color:#e7b64359}.badge-ok{background:var(--ok-dim);color:var(--ok);border-color:#5ec38659}.badge-err{background:var(--err-dim);color:var(--err);border-color:#f75d5959}.page-meta .badge-ok{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:999px;font-size:11px;font-family:var(--font-mono);background:var(--ok-dim);color:var(--ok);border:1px solid oklch(.74 .13 155 / .3)}.tab-row{display:flex;gap:2px;border-bottom:1px solid var(--line);margin-bottom:18px}.tab-btn{padding:8px 14px;font-size:13px;color:var(--ink-3);border-bottom:2px solid transparent;margin-bottom:-1px;border-radius:var(--r-2) var(--r-2) 0 0;transition:color .1s,background .1s,border-color .1s}.tab-btn:hover{color:var(--ink-1);background:var(--bg-2)}.tab-btn.active{color:var(--ink-0);border-bottom-color:var(--acc);font-weight:500}.filter-row{display:flex;gap:12px;margin-bottom:16px;flex-wrap:wrap;align-items:center}.filter-group{display:inline-flex;gap:2px;background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-3);padding:3px}.filter-btn{padding:4px 11px;border-radius:var(--r-2);font-size:12px;color:var(--ink-2);transition:background .1s,color .1s}.filter-btn:hover{background:var(--bg-2);color:var(--ink-1)}.filter-btn.active{background:var(--bg-4);color:var(--ink-0);font-weight:500}.session-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px;margin-bottom:20px}.session-card{background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-3);padding:14px 16px;cursor:pointer;transition:background .1s,border-color .12s,box-shadow .12s;display:flex;flex-direction:column;gap:8px;text-align:left;width:100%}.session-card:hover{background:var(--bg-2);border-color:var(--line-strong)}.session-card.selected{border-color:var(--acc);background:var(--acc-dim);box-shadow:0 0 0 1px var(--acc)}.session-card:focus-visible{outline:none;box-shadow:var(--focus-ring)}.session-card-header{display:flex;align-items:center;gap:7px;flex-wrap:wrap}.session-agent{font-family:var(--font-mono);font-size:12px;font-weight:600;color:var(--ink-0)}.session-pid{font-family:var(--font-mono);font-size:11px;color:var(--ink-3)}.session-age{margin-left:auto;font-family:var(--font-mono);font-size:11px;color:var(--ink-4)}.session-project{font-size:12.5px;font-weight:500;color:var(--ink-0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-task{font-size:11.5px;color:var(--ink-2);font-style:italic;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-metrics{display:flex;gap:16px;padding-top:8px;border-top:1px solid var(--line);flex-wrap:wrap}.metric-item{display:flex;flex-direction:column;gap:3px;min-width:52px}.metric-label{font-size:9.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-4);font-weight:600}.metric-value{font-family:var(--font-mono);font-size:13px;font-weight:500;color:var(--ink-0)}.context-bar{height:3px;border-radius:2px;background:var(--bg-3);margin-top:3px;overflow:hidden;min-width:64px;width:100%}.context-fill{height:100%;background:var(--acc);border-radius:2px;transition:width .4s ease-out}.context-fill-warn{background:var(--warn)}.session-git{display:flex;gap:8px;align-items:center;font-family:var(--font-mono);font-size:11px}.git-branch{color:var(--ink-3)}.git-added{color:var(--ok)}.git-modified{color:var(--warn)}.session-model{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-4);margin-top:auto}.session-detail{background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-3);margin-top:4px;overflow:hidden;animation:fadein .15s}.detail-header{display:flex;align-items:center;padding:12px 18px;border-bottom:1px solid var(--line);gap:12px}.detail-title{font-size:14px;font-weight:600;color:var(--ink-0);flex:1}.detail-grid{display:grid;grid-template-columns:140px 1fr;gap:8px 16px;padding:16px 18px}.detail-grid dt{color:var(--ink-3);font-family:var(--font-mono);font-size:11.5px;align-self:baseline}.detail-grid dd{color:var(--ink-1);font-family:var(--font-mono);font-size:12px;word-break:break-all;align-self:baseline}.detail-grid dd code{font-size:11px;color:var(--ink-2)}.detail-section{padding:14px 18px;border-top:1px solid var(--line)}.detail-section h3{font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);margin-bottom:10px;font-weight:600}.tool-calls-list,.file-access-list,.children-list{list-style:none;display:flex;flex-direction:column;gap:3px}.tool-call-item{display:flex;align-items:baseline;gap:8px;padding:4px 8px;border-radius:var(--r-1);background:var(--bg-0);font-size:11.5px}.tool-call-item code{color:var(--acc-ink)}.tool-arg{color:var(--ink-3);font-family:var(--font-mono);font-size:11px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-duration{color:var(--ink-4);font-family:var(--font-mono);font-size:10.5px;margin-left:auto;white-space:nowrap}.file-access-item{display:flex;align-items:center;gap:8px;padding:3px 8px;border-radius:var(--r-1);background:var(--bg-0);font-size:11.5px}.fa-op{font-size:9.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-3);background:var(--bg-2);border:1px solid var(--line);border-radius:3px;padding:1px 5px;white-space:nowrap}.file-access-item code{font-size:11px;color:var(--ink-1)}.children-list li{padding:3px 8px;font-size:11.5px;background:var(--bg-0);border-radius:var(--r-1)}.children-list code{color:var(--ink-1)}.empty-state{padding:56px 24px;text-align:center;color:var(--ink-3);border:1px dashed var(--line);border-radius:var(--r-3);background:var(--bg-1)}.empty-state p{margin-top:10px;font-size:13px}.text-muted{color:var(--ink-3);font-size:12px}.tab-content{padding:4px 0}.rate-limit-empty,.ports-empty{padding:32px 24px;text-align:center;color:var(--ink-3);border:1px dashed var(--line);border-radius:var(--r-3);background:var(--bg-1);font-size:13px}.rate-limit-badges{display:flex;flex-direction:column;gap:8px}.rate-limit-row{display:flex;align-items:center;gap:12px;padding:10px 14px;background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-2)}.rate-source{font-family:var(--font-mono);font-size:12px;color:var(--ink-1);min-width:120px;font-weight:500}.rate-pill{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;font-family:var(--font-mono);font-size:11px;border:1px solid transparent}.rate-pill.pill-ok{background:var(--ok-dim);color:var(--ok);border-color:#5ec3864d}.rate-pill.pill-warn{background:var(--warn-dim);color:var(--warn);border-color:#e8aa4e59}.rate-pill.pill-danger{background:var(--err-dim);color:var(--err);border-color:#f75d5959}.rate-reset{margin-left:auto;font-size:11px;color:var(--ink-3);font-family:var(--font-mono)}.ports-list{display:flex;flex-direction:column;gap:20px}.ports-section-title{font-size:12px;font-weight:600;color:var(--ink-0);margin-bottom:10px}.ports-section-title.orphan{color:var(--warn)}.ports-table{width:100%;border-collapse:collapse;font-size:12.5px;background:var(--bg-1);border:1px solid var(--line);border-radius:var(--r-2);overflow:hidden}.ports-table th{text-align:left;padding:7px 12px;font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-3);font-weight:600;border-bottom:1px solid var(--line);background:var(--bg-2)}.ports-table td{padding:8px 12px;border-bottom:1px solid var(--line);color:var(--ink-1);font-family:var(--font-mono);font-size:12px}.ports-table tr:last-child td{border-bottom:none}.ports-table tr:hover td{background:var(--bg-2)}.port-session-id{color:var(--ink-3);font-size:11px}.orphan-row td{color:var(--warn)}.drawer-body::-webkit-scrollbar,.code-block::-webkit-scrollbar{width:8px}.drawer-body::-webkit-scrollbar-thumb,.code-block::-webkit-scrollbar-thumb{background:var(--bg-3);border-radius:4px}@media (max-width: 900px){.app{grid-template-columns:1fr}.nav{position:static;height:auto;border-right:none;border-bottom:1px solid var(--line)}.page{padding:20px 16px 32px}.topbar{padding:10px 16px;gap:10px}.search{max-width:none}.action-row{grid-template-columns:3px 1fr}.action-row>.row-actions{grid-column:2;padding:0 14px 12px;justify-self:end}.action-row-open{grid-template-columns:auto 1fr;grid-template-areas:"time intent" "tool tool" "status status";gap:8px 12px;padding:12px 14px}.action-row-open>.row-time{grid-area:time}.action-row-open>.tool-tag{grid-area:tool;justify-self:start}.action-row-open>.row-intent{grid-area:intent}.action-row-open>.status-tag{grid-area:status;justify-self:start}.drawer{width:100vw}.kv-grid{grid-template-columns:100px 1fr}}