cli-jaw 1.6.13 → 1.6.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/commands/memory.js +11 -0
- package/dist/bin/commands/memory.js.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/src/agent/memory-flush-controller.js +50 -13
- package/dist/src/agent/memory-flush-controller.js.map +1 -1
- package/dist/src/memory/identity.js +6 -3
- package/dist/src/memory/identity.js.map +1 -1
- package/dist/src/memory/reflect.js +47 -0
- package/dist/src/memory/reflect.js.map +1 -1
- package/dist/src/routes/jaw-memory.js +25 -1
- package/dist/src/routes/jaw-memory.js.map +1 -1
- package/dist/src/routes/memory.js +4 -1
- package/dist/src/routes/memory.js.map +1 -1
- package/package.json +1 -1
- package/public/assets/shark.svg +1 -0
- package/public/css/chat.css +20 -3
- package/public/css/layout.css +46 -15
- package/public/css/variables.css +3 -15
- package/public/dist/assets/{employees-C2G0-Rg9.js → employees-V7lNStu1.js} +1 -1
- package/public/dist/assets/index-Cpe1jccL.js +50 -0
- package/public/dist/assets/index-DVTRbkJF.css +1 -0
- package/public/dist/assets/locale-CxI5nTcf.js +3 -0
- package/public/dist/assets/render-BoxeLlL9.js +25 -0
- package/public/dist/assets/settings-BcKp6ppP.js +1 -0
- package/public/dist/assets/settings-CBCg5Jhh.js +40 -0
- package/public/dist/assets/skills-BuAXFNgp.js +1 -0
- package/public/dist/assets/{skills-C9o5E1Pc.js → skills-RbauGmBZ.js} +1 -1
- package/public/dist/assets/{slash-commands-DveLHSQt.js → slash-commands-BgKxc49D.js} +1 -1
- package/public/dist/assets/slash-commands-DXGb_iGA.js +1 -0
- package/public/dist/assets/ui-KQ8_sSP8.js +131 -0
- package/public/dist/assets/ui-rD__Mvbs.js +1 -0
- package/public/dist/assets/vendor-icons-C6LXvgi0.js +1 -0
- package/public/dist/assets/{ws-D39_cIa_.js → ws-BtTpgocf.js} +1 -1
- package/public/dist/index.html +25 -18
- package/public/index.html +23 -16
- package/public/js/features/avatar.ts +23 -63
- package/public/js/features/memory.ts +17 -5
- package/public/js/features/settings-templates.ts +6 -5
- package/public/js/icons.ts +10 -4
- package/public/js/locale.ts +30 -0
- package/public/js/render.ts +2 -1
- package/public/js/ui.ts +87 -71
- package/public/js/virtual-scroll-bootstrap.ts +42 -0
- package/public/js/virtual-scroll.ts +165 -51
- package/public/dist/assets/index-CDdXQQmm.css +0 -1
- package/public/dist/assets/index-CIWCSFl-.js +0 -50
- package/public/dist/assets/locale-DVVWjxKN.js +0 -1
- package/public/dist/assets/render-BFAkzW1S.js +0 -25
- package/public/dist/assets/settings-BtX9STQd.js +0 -41
- package/public/dist/assets/settings-DUWhygHi.js +0 -1
- package/public/dist/assets/skills-C6aTdbWY.js +0 -1
- package/public/dist/assets/slash-commands-C1p8kRBv.js +0 -1
- package/public/dist/assets/ui-BpZlLDtM.js +0 -1
- package/public/dist/assets/ui-Dx3w-H-4.js +0 -131
- package/public/dist/assets/vendor-icons-BqxEYYco.js +0 -1
|
@@ -24,10 +24,16 @@ export class VirtualScroll {
|
|
|
24
24
|
private _active = false;
|
|
25
25
|
private _totalHeight = 0;
|
|
26
26
|
private rafId: number | null = null;
|
|
27
|
-
private firstVisible =
|
|
28
|
-
private lastVisible =
|
|
27
|
+
private firstVisible = -1;
|
|
28
|
+
private lastVisible = -1;
|
|
29
|
+
|
|
30
|
+
// Prefix sum for O(log n) offset lookup
|
|
31
|
+
private prefixHeights: number[] = [0];
|
|
32
|
+
private prefixDirtyFrom = 0;
|
|
33
|
+
|
|
34
|
+
// Spacing model — measured from rendered .msg margin-bottom
|
|
35
|
+
private itemSpacing = 0;
|
|
29
36
|
|
|
30
|
-
/** Called after render() mounts items in viewport — for lazy rendering and widget activation */
|
|
31
37
|
onLazyRender: LazyRenderCallback | null = null;
|
|
32
38
|
onPostRender: ((viewport: HTMLElement) => void) | null = null;
|
|
33
39
|
|
|
@@ -44,8 +50,69 @@ export class VirtualScroll {
|
|
|
44
50
|
get active(): boolean { return this._active; }
|
|
45
51
|
get count(): number { return this.items.length; }
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
// ── Prefix sum helpers ──
|
|
54
|
+
|
|
55
|
+
private markPrefixDirty(from: number): void {
|
|
56
|
+
this.prefixDirtyFrom = Math.min(this.prefixDirtyFrom, Math.max(0, from));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private rebuildPrefixHeights(): void {
|
|
60
|
+
const n = this.items.length;
|
|
61
|
+
if (this.prefixHeights.length !== n + 1) {
|
|
62
|
+
this.prefixHeights = new Array(n + 1).fill(0);
|
|
63
|
+
this.prefixDirtyFrom = 0;
|
|
64
|
+
}
|
|
65
|
+
for (let i = this.prefixDirtyFrom; i < n; i++) {
|
|
66
|
+
this.prefixHeights[i + 1] = this.prefixHeights[i] + this.items[i].height;
|
|
67
|
+
}
|
|
68
|
+
this.prefixDirtyFrom = n;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Raw cumulative height up to (but not including) index */
|
|
72
|
+
private offsetForIndex(index: number): number {
|
|
73
|
+
this.rebuildPrefixHeights();
|
|
74
|
+
return this.prefixHeights[Math.max(0, Math.min(index, this.items.length))];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Effective offset including inter-item spacing (margin-bottom) */
|
|
78
|
+
private effectiveOffset(index: number): number {
|
|
79
|
+
return this.offsetForIndex(index) + index * this.itemSpacing;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Total effective height of all items with spacing */
|
|
83
|
+
private totalEffectiveHeight(): number {
|
|
84
|
+
const n = this.items.length;
|
|
85
|
+
if (n === 0) return 0;
|
|
86
|
+
return this.offsetForIndex(n) + (n - 1) * this.itemSpacing;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Binary search: find item index at given scroll offset */
|
|
90
|
+
private indexForOffset(offset: number): number {
|
|
91
|
+
this.rebuildPrefixHeights();
|
|
92
|
+
const n = this.items.length;
|
|
93
|
+
if (n === 0) return 0;
|
|
94
|
+
let lo = 0;
|
|
95
|
+
let hi = n - 1;
|
|
96
|
+
while (lo < hi) {
|
|
97
|
+
const mid = (lo + hi + 1) >> 1;
|
|
98
|
+
const effOff = this.prefixHeights[mid] + mid * this.itemSpacing;
|
|
99
|
+
if (effOff <= offset) lo = mid;
|
|
100
|
+
else hi = mid - 1;
|
|
101
|
+
}
|
|
102
|
+
return lo;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ── Spacing model ──
|
|
106
|
+
|
|
107
|
+
private refreshLayoutMetrics(): void {
|
|
108
|
+
const sample = this.viewport.querySelector<HTMLElement>('.msg');
|
|
109
|
+
if (sample) {
|
|
110
|
+
this.itemSpacing = parseFloat(getComputedStyle(sample).marginBottom) || 0;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ── Public API ──
|
|
115
|
+
|
|
49
116
|
flushToDOM(): void {
|
|
50
117
|
if (!this._active) return;
|
|
51
118
|
this.container.classList.remove('vs-active');
|
|
@@ -53,26 +120,65 @@ export class VirtualScroll {
|
|
|
53
120
|
if (this.rafId) { cancelAnimationFrame(this.rafId); this.rafId = null; }
|
|
54
121
|
this.container.innerHTML = this.items.map(it => it.html).join('');
|
|
55
122
|
this._active = false;
|
|
56
|
-
this.firstVisible =
|
|
57
|
-
this.lastVisible =
|
|
123
|
+
this.firstVisible = -1;
|
|
124
|
+
this.lastVisible = -1;
|
|
58
125
|
this.items = [];
|
|
59
126
|
this._totalHeight = 0;
|
|
127
|
+
this.prefixHeights = [0];
|
|
128
|
+
this.prefixDirtyFrom = 0;
|
|
129
|
+
this.itemSpacing = 0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Bulk-load items. Call AFTER registering onLazyRender/onPostRender. */
|
|
133
|
+
setItems(
|
|
134
|
+
items: VirtualItem[],
|
|
135
|
+
options?: { autoActivate?: boolean; toBottom?: boolean },
|
|
136
|
+
): void {
|
|
137
|
+
this.items = items;
|
|
138
|
+
this._totalHeight = items.reduce((sum, it) => sum + it.height, 0);
|
|
139
|
+
this.prefixHeights = new Array(items.length + 1).fill(0);
|
|
140
|
+
this.prefixDirtyFrom = 0;
|
|
141
|
+
if (options?.autoActivate === false) return;
|
|
142
|
+
if (!this._active && this.items.length >= THRESHOLD) {
|
|
143
|
+
this.activate(options?.toBottom ?? true);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Seed measured heights before activation. */
|
|
148
|
+
seedMeasuredHeights(startIndex: number, heights: number[]): void {
|
|
149
|
+
for (let offset = 0; offset < heights.length; offset++) {
|
|
150
|
+
const idx = startIndex + offset;
|
|
151
|
+
const item = this.items[idx];
|
|
152
|
+
if (!item) continue;
|
|
153
|
+
const oldH = item.height;
|
|
154
|
+
const nextH = heights[offset];
|
|
155
|
+
if (oldH === nextH) continue;
|
|
156
|
+
item.height = nextH;
|
|
157
|
+
this._totalHeight += nextH - oldH;
|
|
158
|
+
this.markPrefixDirty(idx);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Activate if threshold met. */
|
|
163
|
+
activateIfNeeded(toBottom = false): void {
|
|
164
|
+
if (!this._active && this.items.length >= THRESHOLD) {
|
|
165
|
+
this.activate(toBottom);
|
|
166
|
+
}
|
|
60
167
|
}
|
|
61
168
|
|
|
62
169
|
addItem(id: string, html: string): void {
|
|
63
170
|
const item: VirtualItem = { id, html, height: EST_HEIGHT };
|
|
64
171
|
this.items.push(item);
|
|
65
172
|
this._totalHeight += EST_HEIGHT;
|
|
173
|
+
this.markPrefixDirty(this.items.length - 1);
|
|
66
174
|
if (!this._active && this.items.length >= THRESHOLD) {
|
|
67
|
-
this.activate();
|
|
175
|
+
this.activate(true);
|
|
68
176
|
}
|
|
69
177
|
if (this._active) {
|
|
70
178
|
this.scheduleRender();
|
|
71
179
|
}
|
|
72
180
|
}
|
|
73
181
|
|
|
74
|
-
/** Append a live DOM element while keeping VS active.
|
|
75
|
-
* Serializes to HTML for virtual storage. */
|
|
76
182
|
appendLiveItem(div: HTMLElement): void {
|
|
77
183
|
if (!this._active) return;
|
|
78
184
|
const html = div.outerHTML;
|
|
@@ -80,12 +186,10 @@ export class VirtualScroll {
|
|
|
80
186
|
const item: VirtualItem = { id, html, height: EST_HEIGHT };
|
|
81
187
|
this.items.push(item);
|
|
82
188
|
this._totalHeight += EST_HEIGHT;
|
|
83
|
-
|
|
84
|
-
this.render();
|
|
189
|
+
this.markPrefixDirty(this.items.length - 1);
|
|
85
190
|
this.scrollToBottom();
|
|
86
191
|
}
|
|
87
192
|
|
|
88
|
-
/** Update cached HTML for a specific item index (used by lazy render). */
|
|
89
193
|
updateItemHtml(idx: number, html: string): void {
|
|
90
194
|
if (this.items[idx]) {
|
|
91
195
|
this.items[idx].html = html;
|
|
@@ -94,7 +198,7 @@ export class VirtualScroll {
|
|
|
94
198
|
|
|
95
199
|
private scrollHandler = () => this.scheduleRender();
|
|
96
200
|
|
|
97
|
-
private activate(): void {
|
|
201
|
+
private activate(toBottom = false): void {
|
|
98
202
|
this._active = true;
|
|
99
203
|
this._totalHeight = 0;
|
|
100
204
|
const existing = this.container.querySelectorAll('.msg');
|
|
@@ -103,14 +207,24 @@ export class VirtualScroll {
|
|
|
103
207
|
this.items[i].height = el.getBoundingClientRect().height;
|
|
104
208
|
}
|
|
105
209
|
});
|
|
106
|
-
// Rebuild _totalHeight from items array (covers both DOM-measured and estimated heights)
|
|
107
210
|
for (const item of this.items) {
|
|
108
211
|
this._totalHeight += item.height;
|
|
109
212
|
}
|
|
110
|
-
|
|
213
|
+
this.prefixHeights = new Array(this.items.length + 1).fill(0);
|
|
214
|
+
this.prefixDirtyFrom = 0;
|
|
215
|
+
|
|
111
216
|
this.container.classList.add('vs-active');
|
|
112
217
|
this.container.replaceChildren(this.spacerTop, this.viewport, this.spacerBottom);
|
|
113
218
|
this.container.addEventListener('scroll', this.scrollHandler, { passive: true });
|
|
219
|
+
|
|
220
|
+
if (toBottom) {
|
|
221
|
+
const total = this.totalEffectiveHeight();
|
|
222
|
+
this.spacerTop.style.height = `${total}px`;
|
|
223
|
+
this.spacerBottom.style.height = '0px';
|
|
224
|
+
this.container.scrollTop = this.container.scrollHeight;
|
|
225
|
+
this.firstVisible = -1;
|
|
226
|
+
this.lastVisible = -1;
|
|
227
|
+
}
|
|
114
228
|
this.render();
|
|
115
229
|
}
|
|
116
230
|
|
|
@@ -126,38 +240,28 @@ export class VirtualScroll {
|
|
|
126
240
|
const scrollTop = this.container.scrollTop;
|
|
127
241
|
const viewHeight = this.container.clientHeight;
|
|
128
242
|
|
|
129
|
-
|
|
130
|
-
let startIdx = this.items.length - 1; // fallback to bottom, not top
|
|
131
|
-
for (let i = 0; i < this.items.length; i++) {
|
|
132
|
-
if (accum + this.items[i].height > scrollTop) {
|
|
133
|
-
startIdx = i;
|
|
134
|
-
break;
|
|
135
|
-
}
|
|
136
|
-
accum += this.items[i].height;
|
|
137
|
-
}
|
|
138
|
-
|
|
243
|
+
const startIdx = this.indexForOffset(scrollTop);
|
|
139
244
|
const first = Math.max(0, startIdx - BUFFER);
|
|
140
|
-
|
|
245
|
+
|
|
141
246
|
let endIdx = startIdx;
|
|
142
247
|
for (let i = startIdx; i < this.items.length; i++) {
|
|
143
|
-
endAccum += this.items[i].height;
|
|
144
248
|
endIdx = i;
|
|
145
|
-
if (
|
|
249
|
+
if (this.effectiveOffset(i + 1) > scrollTop + viewHeight) break;
|
|
146
250
|
}
|
|
147
251
|
const last = Math.min(this.items.length - 1, endIdx + BUFFER);
|
|
148
252
|
|
|
149
|
-
if (first === this.firstVisible && last === this.lastVisible)
|
|
253
|
+
if (first === this.firstVisible && last === this.lastVisible) {
|
|
254
|
+
// Still update spacers when heights changed (RC3)
|
|
255
|
+
this.refreshLayoutMetrics();
|
|
256
|
+
const topSpace = this.effectiveOffset(first);
|
|
257
|
+
const botSpace = this.effectiveOffset(this.items.length) - this.effectiveOffset(last + 1);
|
|
258
|
+
this.spacerTop.style.height = `${topSpace}px`;
|
|
259
|
+
this.spacerBottom.style.height = `${botSpace}px`;
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
150
262
|
this.firstVisible = first;
|
|
151
263
|
this.lastVisible = last;
|
|
152
264
|
|
|
153
|
-
let topSpace = 0;
|
|
154
|
-
for (let i = 0; i < first; i++) topSpace += this.items[i].height;
|
|
155
|
-
let bottomSpace = 0;
|
|
156
|
-
for (let i = last + 1; i < this.items.length; i++) bottomSpace += this.items[i].height;
|
|
157
|
-
|
|
158
|
-
this.spacerTop.style.height = `${topSpace}px`;
|
|
159
|
-
this.spacerBottom.style.height = `${bottomSpace}px`;
|
|
160
|
-
|
|
161
265
|
// Build map of currently mounted items by vsIdx
|
|
162
266
|
const mounted = new Map<number, HTMLElement>();
|
|
163
267
|
for (const child of Array.from(this.viewport.children) as HTMLElement[]) {
|
|
@@ -165,7 +269,6 @@ export class VirtualScroll {
|
|
|
165
269
|
if (!isNaN(idx)) mounted.set(idx, child);
|
|
166
270
|
}
|
|
167
271
|
|
|
168
|
-
// Remove items no longer in range
|
|
169
272
|
for (const [idx, el] of mounted) {
|
|
170
273
|
if (idx < first || idx > last) {
|
|
171
274
|
el.remove();
|
|
@@ -173,7 +276,6 @@ export class VirtualScroll {
|
|
|
173
276
|
}
|
|
174
277
|
}
|
|
175
278
|
|
|
176
|
-
// Build ordered list — reuse existing or create new
|
|
177
279
|
const ordered: HTMLElement[] = [];
|
|
178
280
|
for (let i = first; i <= last; i++) {
|
|
179
281
|
const existing = mounted.get(i);
|
|
@@ -191,7 +293,6 @@ export class VirtualScroll {
|
|
|
191
293
|
}
|
|
192
294
|
}
|
|
193
295
|
|
|
194
|
-
// Reorder viewport children to match (minimal DOM moves)
|
|
195
296
|
let nodeRef = this.viewport.firstChild as HTMLElement | null;
|
|
196
297
|
for (const el of ordered) {
|
|
197
298
|
if (el !== nodeRef) {
|
|
@@ -201,7 +302,15 @@ export class VirtualScroll {
|
|
|
201
302
|
}
|
|
202
303
|
}
|
|
203
304
|
|
|
204
|
-
//
|
|
305
|
+
// Measure spacing from actual DOM AFTER mounting items
|
|
306
|
+
this.refreshLayoutMetrics();
|
|
307
|
+
|
|
308
|
+
// Compute spacers with correct spacing
|
|
309
|
+
const topSpace = this.effectiveOffset(first);
|
|
310
|
+
const botSpace = this.effectiveOffset(this.items.length) - this.effectiveOffset(last + 1);
|
|
311
|
+
this.spacerTop.style.height = `${topSpace}px`;
|
|
312
|
+
this.spacerBottom.style.height = `${botSpace}px`;
|
|
313
|
+
|
|
205
314
|
if (this.onLazyRender) {
|
|
206
315
|
const lazyTargets = this.viewport.querySelectorAll<HTMLElement>('.lazy-pending');
|
|
207
316
|
if (lazyTargets.length > 0) {
|
|
@@ -209,19 +318,14 @@ export class VirtualScroll {
|
|
|
209
318
|
}
|
|
210
319
|
}
|
|
211
320
|
|
|
212
|
-
// Fire post-render callback for widget activation
|
|
213
321
|
if (this.onPostRender) {
|
|
214
322
|
this.onPostRender(this.viewport);
|
|
215
323
|
}
|
|
216
324
|
|
|
217
|
-
// Batch-read heights AFTER lazy render + widget activation
|
|
218
325
|
this.remeasureVisible();
|
|
219
326
|
}
|
|
220
327
|
|
|
221
|
-
/** Batch-read heights from visible elements, batch-write to items array.
|
|
222
|
-
* Separated read/write passes = single forced reflow. */
|
|
223
328
|
private remeasureVisible(): void {
|
|
224
|
-
// Capture bottom-proximity BEFORE heights change
|
|
225
329
|
const wasAtBottom = this.container.scrollHeight - this.container.scrollTop - this.container.clientHeight < 80;
|
|
226
330
|
|
|
227
331
|
const rects: { idx: number; newH: number }[] = [];
|
|
@@ -237,23 +341,33 @@ export class VirtualScroll {
|
|
|
237
341
|
if (oldH !== newH) {
|
|
238
342
|
this.items[idx].height = newH;
|
|
239
343
|
this._totalHeight += (newH - oldH);
|
|
344
|
+
this.markPrefixDirty(idx);
|
|
240
345
|
heightChanged = true;
|
|
241
346
|
}
|
|
242
347
|
}
|
|
243
|
-
// Re-snap to bottom if user was there before heights grew
|
|
244
348
|
if (heightChanged && wasAtBottom) {
|
|
245
349
|
this.scrollToBottom();
|
|
246
350
|
}
|
|
247
351
|
}
|
|
248
352
|
|
|
353
|
+
/** Synchronous scroll — cancel pending RAF, update spacers, render directly */
|
|
249
354
|
scrollToBottom(): void {
|
|
355
|
+
if (this.rafId) { cancelAnimationFrame(this.rafId); this.rafId = null; }
|
|
356
|
+
const total = this.totalEffectiveHeight();
|
|
357
|
+
this.spacerTop.style.height = `${total}px`;
|
|
358
|
+
this.spacerBottom.style.height = '0px';
|
|
250
359
|
this.container.scrollTop = this.container.scrollHeight;
|
|
251
|
-
this.
|
|
360
|
+
this.firstVisible = -1;
|
|
361
|
+
this.lastVisible = -1;
|
|
362
|
+
this.render();
|
|
252
363
|
}
|
|
253
364
|
|
|
254
365
|
clear(): void {
|
|
255
366
|
this.items = [];
|
|
256
367
|
this._totalHeight = 0;
|
|
368
|
+
this.prefixHeights = [0];
|
|
369
|
+
this.prefixDirtyFrom = 0;
|
|
370
|
+
this.itemSpacing = 0;
|
|
257
371
|
if (this._active) {
|
|
258
372
|
this.container.classList.remove('vs-active');
|
|
259
373
|
this.container.removeEventListener('scroll', this.scrollHandler);
|
|
@@ -263,8 +377,8 @@ export class VirtualScroll {
|
|
|
263
377
|
this.container.innerHTML = '';
|
|
264
378
|
}
|
|
265
379
|
this._active = false;
|
|
266
|
-
this.firstVisible =
|
|
267
|
-
this.lastVisible =
|
|
380
|
+
this.firstVisible = -1;
|
|
381
|
+
this.lastVisible = -1;
|
|
268
382
|
this.onLazyRender = null;
|
|
269
383
|
this.onPostRender = null;
|
|
270
384
|
if (this.rafId) {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--bg:oklch(7% .01 280);--surface:oklch(11% .01 280);--border:oklch(17% .01 270);--text:oklch(92% .01 270);--text-dim:oklch(53% .02 270);--accent:oklch(78% .14 200);--accent2:oklch(70% .13 200);--green:oklch(78% .16 150);--user-bg:oklch(15% .02 270);--agent-bg:oklch(9% .01 270);--status-idle-bg:oklch(15% .02 150);--status-running-bg:oklch(17% .02 75);--status-running-color:oklch(81% .14 85);--code-bg:oklch(9% .01 250);--link-color:oklch(72% .12 250);--table-border:oklch(70% .13 200);--stop-btn:var(--error);--stop-btn-hover:oklch(57% .21 25);--toggle-off:oklch(35% 0 0);--toggle-on:oklch(100% 0 0);--delete-color:var(--error);--code-label-color:oklch(66% .01 250);--modal-bg:oklch(0% 0 0/.6);--font-display:"Chakra Petch", "Outfit", "Pretendard", "Apple SD Gothic Neo", "Malgun Gothic", system-ui, sans-serif;--font-ui:"Outfit", "Pretendard", "Apple SD Gothic Neo", "Malgun Gothic", -apple-system, system-ui, sans-serif;--font-mono:"SF Mono", "JetBrains Mono", "Fira Code", monospace;--sidebar-left-w:220px;--sidebar-right-w:260px;--sidebar-collapsed-w:48px;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-8:32px;--space-10:40px;--space-12:48px;--text-xs:11px;--text-sm:13px;--text-base:16px;--text-md:17px;--text-lg:19px;--text-xl:22px;--text-2xl:26px;--text-3xl:34px;--radius-sm:4px;--radius-md:8px;--radius-lg:12px;--radius-xl:16px;--radius-full:9999px;--ease-out-expo:cubic-bezier(.16, 1, .3, 1);--ease-spring:cubic-bezier(.34, 1.56, .64, 1);--duration-fast:.15s;--duration-base:.25s;--duration-slow:.4s;--error:oklch(63% .21 25);--error-dim:oklch(63% .21 25/.15);--success:oklch(72% .17 150);--success-dim:oklch(72% .17 150/.15);--warning:oklch(78% .16 75);--warning-dim:oklch(78% .16 75/.15);--noise-opacity:.03;--scanline-pct:1.2%;--glow-strength:5%;--toggle-w:36px;--toggle-h:20px;--toggle-knob:16px;--orc-glow:transparent;--orc-glow-P:oklch(63% .17 260);--orc-glow-A:oklch(78% .16 75);--orc-glow-B:oklch(72% .17 150);--orc-glow-C:oklch(60% .2 300);--orc-glow-D:transparent}*{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--font-ui);background:var(--bg);color:var(--text);grid-template-columns:var(--sidebar-left-w) 1fr var(--sidebar-right-w);will-change:grid-template-columns;height:100vh;transition:grid-template-columns .2s cubic-bezier(.4,0,.2,1);display:grid}body.left-collapsed{--sidebar-left-w:var(--sidebar-collapsed-w)}body.right-collapsed{--sidebar-right-w:var(--sidebar-collapsed-w)}[data-theme=light]{--bg:oklch(97% 0 0);--surface:oklch(100% 0 0);--border:oklch(90% .01 270);--text:oklch(15% .02 270);--text-dim:oklch(53% .02 270);--accent:oklch(62% .11 200);--accent2:oklch(52% .1 200);--green:oklch(62% .16 150);--user-bg:oklch(95% .01 270);--agent-bg:oklch(98% .005 270);--status-idle-bg:oklch(96% .04 150);--status-running-bg:oklch(97% .06 90);--status-running-color:oklch(56% .12 70);--code-bg:oklch(96% .005 250);--link-color:oklch(56% .18 260);--table-border:oklch(56% .18 260);--stop-btn:var(--error);--stop-btn-hover:oklch(48% .19 25);--toggle-off:oklch(80% 0 0);--toggle-on:oklch(100% 0 0);--delete-color:var(--error);--code-label-color:oklch(53% .02 270);--modal-bg:oklch(0% 0 0/.3);--error:oklch(57% .21 25);--error-dim:oklch(57% .21 25/.15);--success:oklch(62% .16 150);--success-dim:oklch(62% .16 150/.15);--warning:oklch(63% .15 70);--warning-dim:oklch(63% .15 70/.15);--noise-opacity:.015;--scanline-pct:0.8%;--glow-strength:3%;--orc-glow-P:oklch(56% .18 260);--orc-glow-A:oklch(63% .15 70);--orc-glow-B:oklch(62% .16 150);--orc-glow-C:oklch(53% .22 300);--orc-glow-D:transparent}label{color:var(--text-dim);margin-bottom:4px;font-size:11px;display:block}select,input[type=text]{background:var(--bg);border:1px solid var(--border);width:100%;color:var(--text);border-radius:6px;padding:6px 10px;font-family:inherit;font-size:12px}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:color-mix(in oklch, var(--accent) 30%, var(--text-dim))}*{scrollbar-width:thin;scrollbar-color:var(--border) transparent}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible{outline:2px solid var(--accent);outline-offset:1px}@keyframes revealUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes revealLeft{0%{opacity:0;transform:translate(-16px)}to{opacity:1;transform:translate(0)}}@keyframes revealRight{0%{opacity:0;transform:translate(16px)}to{opacity:1;transform:translate(0)}}@keyframes breathe{0%,to{opacity:.5}50%{opacity:.8}}@keyframes dotPing{0%,to{opacity:1}50%{opacity:.4}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.hidden{display:none}.gap-1{gap:var(--space-1)}.gap-2{gap:var(--space-2)}.gap-3{gap:var(--space-3)}.gap-4{gap:var(--space-4)}.flex{display:flex}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.flex-1{flex:1}.flex-wrap{flex-wrap:wrap}.w-full{width:100%}.text-xs{font-size:var(--text-xs)}.text-sm{font-size:var(--text-sm)}.text-dim{color:var(--text-dim)}.mono{font-family:var(--font-mono)}.fallback-desc{margin:2px 0 6px}.mt-1{margin-top:var(--space-1)}.mt-2{margin-top:var(--space-2)}.ml-6{margin-left:var(--space-6)}.mr-auto{margin-right:auto}.p-1{padding:var(--space-1)}.p-2{padding:var(--space-2)}.py-1{padding-top:var(--space-1);padding-bottom:var(--space-1)}.px-4{padding-left:var(--space-4);padding-right:var(--space-4)}.w-auto{width:auto}.input-sm{width:100%;padding:var(--space-1) var(--space-2);font-size:11px}.input-compact{width:100px;padding:3px var(--space-2);background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:11px}.btn-action-sm{padding:var(--space-1) var(--space-3);margin:0;font-size:11px}.btn-action-block{width:100%;padding:var(--space-2);font-size:var(--text-sm);margin:0}.hr-divider{border:none;border-top:1px solid var(--border);margin:var(--space-1) 0}.btn-modal-close{color:var(--text-dim);cursor:pointer;background:0 0;border:none;font-size:16px}.btn-refresh{justify-content:center;align-items:center;gap:var(--space-1);flex:1;height:32px;margin:0;padding:6px;font-size:11px;display:flex}.select-sm{padding:var(--space-1);background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:11px}.select-status-interval{min-width:60px;height:32px;padding:6px 8px}.input-agent-name{font-family:var(--font-display);font-size:var(--text-base);padding:var(--space-1) var(--space-2);flex:1;font-weight:600}.input-avatar{text-align:center;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);width:40px;color:var(--text);padding:4px;font-size:20px}.avatar-label{opacity:.6;user-select:none;font-size:14px}.perm-auto{cursor:default;width:100%;padding:6px 14px}.text-status{color:var(--text-dim);font-size:11px}.text-shortcut-hint{color:var(--text-dim);font-size:9px}.mono-path{font-family:var(--font-mono);word-break:break-all}.label-wide{min-width:120px;font-size:11px}.mem-tab-btn{color:var(--text-dim);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;padding:6px 12px;font-size:12px}.mem-tab-btn.active,.mem-tab.active .mem-tab-btn{color:var(--text)}.info-box{margin-top:var(--space-2);background:var(--bg);border-radius:var(--radius-sm);color:var(--text-dim);padding:6px;font-size:11px}.adv-status-banner{border-bottom:1px solid var(--border);color:var(--text-dim);padding:10px 12px;font-size:11px}.tab-strip{border-bottom:1px solid var(--border);padding:0 12px;display:flex}.section-header{margin-bottom:6px;font-size:12px;font-weight:600}.px-3{padding-left:var(--space-3);padding-right:var(--space-3)}.pb-3{padding-bottom:var(--space-3)}.p-3{padding:var(--space-3)}.mt-3{margin-top:var(--space-3)}.modal-template{flex-direction:column;width:640px;max-width:90vw;max-height:85vh;display:flex}.modal-scrollable{max-height:80vh;overflow-y:auto}.template-tree-area{flex:1;padding:12px 16px;overflow-y:auto}.template-editor-view{flex-direction:column}.template-editor-bar{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);border-bottom:1px solid var(--border);display:flex}.btn-back{border:1px solid var(--border);color:var(--text-dim);padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);cursor:pointer;background:0 0;font-size:11px}.btn-dev-toggle{background:var(--bg);border:1px solid var(--border);color:var(--text-dim);padding:var(--space-1) var(--space-3);border-radius:var(--radius-sm);cursor:pointer;font-size:11px}.template-textarea{min-height:350px;font-family:var(--font-mono);flex:1;font-size:12px}.template-hint{padding:var(--space-2) 0;color:var(--text-dim);font-size:11px}.queue-badge{background:var(--warning);color:var(--bg);border-radius:var(--radius-full);font-size:var(--text-xs);justify-content:center;align-items:center;min-width:18px;height:18px;font-weight:700;display:flex;position:absolute;top:-6px;right:-6px}.sidebar-left{background:linear-gradient(180deg, var(--surface) 0%, color-mix(in oklch, var(--surface) 95%, #000) 100%);border-right:1px solid color-mix(in oklch, var(--border) 80%, var(--accent) 20%);box-shadow:inset -1px 0 0 var(--border);animation:revealLeft .4s var(--ease-out-expo) 50ms both;flex-direction:column;gap:16px;padding:48px 16px 16px;display:flex;overflow-y:auto}.sidebar-left:before,.sidebar-right:before{content:"";pointer-events:none;z-index:0;background:repeating-linear-gradient(0deg, transparent, transparent 2px, color-mix(in oklch, var(--accent) var(--scanline-pct), transparent) 2px, color-mix(in oklch, var(--accent) var(--scanline-pct), transparent) 4px), linear-gradient(180deg, color-mix(in oklch, var(--accent) var(--glow-strength), transparent) 0%, transparent 200px);position:absolute;inset:0}.logo{color:var(--accent);font-size:26px;font-weight:700;font-family:var(--font-display);letter-spacing:1px;text-shadow:0 0 20px color-mix(in oklch, var(--accent) 30%, transparent)}.section-title{color:var(--text-dim);text-transform:uppercase;letter-spacing:1.5px;font-size:11px;font-family:var(--font-display);margin-bottom:4px;font-weight:600}.memory-list{font-size:12px;list-style:none}.memory-list li{border-bottom:1px solid var(--border);padding:4px 0}.memory-key{color:var(--accent2)}.stat{color:var(--text-dim);margin:2px 0;font-size:12px}.status-badge{letter-spacing:.5px;font-size:10px;font-weight:600;font-family:var(--font-display);border-radius:10px;align-items:center;padding:2px 8px;transition:background .3s,color .3s;display:inline-flex}.status-idle{background:var(--status-idle-bg);color:var(--green);box-shadow:0 0 6px color-mix(in oklch, var(--success) 20%, transparent)}.status-running{background:var(--status-running-bg);color:var(--status-running-color);box-shadow:0 0 6px color-mix(in oklch, var(--warning) 30%, transparent)}.btn-clear{border:1px solid var(--border);color:var(--text-dim);cursor:pointer;font-size:12px;font-family:var(--font-display);background:0 0;border-radius:6px;margin-top:auto;padding:8px;transition:border-color .15s,color .15s,transform .1s}.btn-clear:hover{border-color:var(--accent);color:var(--accent);transform:translateY(-1px)}.btn-clear:active{transform:translateY(0)}.sidebar-right{background:linear-gradient(180deg, var(--surface) 0%, color-mix(in oklch, var(--surface) 95%, #000) 100%);border-left:1px solid color-mix(in oklch, var(--border) 80%, var(--accent) 20%);box-shadow:inset 1px 0 0 var(--border);animation:revealRight .4s var(--ease-out-expo) .1s both;flex-direction:column;padding-top:48px;display:flex;overflow-y:auto}.tab-bar{border-bottom:1px solid var(--border);flex-shrink:0;display:flex}.tab-btn{color:var(--text-dim);font-size:11px;font-family:var(--font-display);cursor:pointer;text-transform:uppercase;letter-spacing:1px;background:0 0;border:none;border-bottom:2px solid #0000;flex:1;padding:10px 8px;transition:color .15s,border-bottom-color .15s}.tab-btn.active{color:var(--accent);border-bottom-color:var(--accent)}.tab-content{flex-direction:column;gap:12px;padding:16px;display:none}.tab-content.active{display:flex}.sidebar-save-bar{border-bottom:1px solid var(--border);flex-shrink:0;padding:6px 16px}.btn-save{background:var(--accent);color:#fff;width:100%;font-size:11px;font-family:var(--font-display);cursor:pointer;border:none;border-radius:6px;padding:6px;font-weight:600}.btn-save:hover{opacity:.9}.sidebar-hb-btn{background:var(--surface);border:1px solid var(--border);width:100%;color:var(--text);cursor:pointer;text-align:left;font-size:12px;font-family:var(--font-display);border-radius:6px;align-items:center;gap:4px;padding:6px;transition:border-color .15s,box-shadow .15s;display:inline-flex}.sidebar-hb-btn.w-auto{flex-shrink:0;width:auto}.sidebar-hb-btn:hover{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.sidebar-toggle{border:1px solid var(--border);color:var(--text-dim);cursor:pointer;background:0 0;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;font-size:12px;transition:border-color .15s,color .15s;display:flex}.sidebar-toggle:hover{border-color:var(--accent);color:var(--accent)}.sidebar-bottom{border-top:1px solid var(--border);flex-direction:column;gap:6px;margin-top:auto;padding-top:12px;display:flex}.avatar-control{min-width:0}.avatar-status-row{grid-template-columns:1fr 1fr;gap:8px;display:grid}.avatar-status{color:var(--text-dim);border:1px solid var(--border);text-align:center;border-radius:999px;padding:3px 8px;font-size:10px;line-height:1.3}.sidebar-left,.sidebar-right{contain:layout style;position:relative}.sidebar-left>:not(.sidebar-toggle),.sidebar-right>:not(.sidebar-toggle){opacity:1;transition:opacity .15s ease-in 50ms}.sidebar-left .sidebar-toggle,.sidebar-right .sidebar-toggle{z-index:2;position:absolute;top:10px}.sidebar-left .sidebar-toggle{left:10px}.sidebar-right .sidebar-toggle{right:10px}body.left-collapsed .sidebar-left>:not(.sidebar-toggle){opacity:0;pointer-events:none;transition:opacity .1s ease-out}body.left-collapsed .sidebar-left{padding:16px 10px;overflow:hidden}body.right-collapsed .sidebar-right>:not(.sidebar-toggle){opacity:0;pointer-events:none;transition:opacity .1s ease-out}body.right-collapsed .sidebar-right{padding:16px 10px;overflow:hidden}.avatar-upload-btn,.avatar-reset-btn{justify-content:center;padding-inline:8px}@media (width<=900px){body:not(.left-expanded){--sidebar-left-w:var(--sidebar-collapsed-w)}body:not(.left-expanded) .sidebar-left>:not(.sidebar-toggle){opacity:0;pointer-events:none}body:not(.left-expanded) .sidebar-left{padding:16px 10px;overflow:hidden}body:not(.right-expanded){--sidebar-right-w:var(--sidebar-collapsed-w)}body:not(.right-expanded) .sidebar-right>:not(.sidebar-toggle){opacity:0;pointer-events:none}body:not(.right-expanded) .sidebar-right{padding:16px 10px;overflow:hidden}}@media (width<=768px){body{grid-template-columns:1fr;grid-template-areas:"main";height:100dvh}.sidebar-left,.sidebar-right{z-index:100;width:min(280px,80vw);transition:transform .25s var(--ease-out-expo);padding-top:calc(48px + env(safe-area-inset-top,0px));padding-bottom:env(safe-area-inset-bottom,0px);visibility:hidden;pointer-events:none;position:fixed;top:0;bottom:0;transform:translate(-100%);min-width:unset!important}.sidebar-right{left:auto;right:0;transform:translate(100%)}body.left-expanded .sidebar-left,body.right-expanded .sidebar-right{visibility:visible;pointer-events:auto;transform:translate(0)}body.left-expanded:after,body.right-expanded:after{content:"";background:var(--modal-bg);z-index:99;animation:.2s fadeIn;position:fixed;inset:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}body:not(.left-expanded) .sidebar-left>:not(.sidebar-toggle){display:block}.sidebar-toggle{display:none}.chat-input-area{padding-bottom:env(safe-area-inset-bottom,0px)}.message.agent-message,.message.user-message{max-width:95%!important}}.mobile-nav{display:none}.lucide,[data-icon] svg,.icon-hydrated svg,.cli-provider-icon svg,.skill-emoji svg{vertical-align:-.125em;flex-shrink:0;width:1em;height:1em;display:inline-block}[data-icon],.icon-hydrated{align-items:center;line-height:1;display:inline-flex}.chat-area{border-left:1px solid var(--border);border-right:1px solid var(--border);background:var(--bg);flex-direction:column;min-height:0;display:flex;position:relative;overflow:hidden}.chat-area:after{content:"";pointer-events:none;z-index:0;opacity:var(--noise-opacity);mix-blend-mode:overlay;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");background-repeat:repeat;position:absolute;inset:0}[data-theme=light] .chat-area:after{display:none}.theme-switch{border:1px solid var(--border);background:var(--surface);cursor:pointer;border-radius:12px;flex-shrink:0;width:44px;height:24px;padding:0;transition:background .3s,border-color .3s;position:relative}.theme-switch:hover{border-color:var(--accent)}.theme-switch-knob{background:var(--text);border-radius:50%;width:16px;height:16px;transition:left .3s cubic-bezier(.4,0,.2,1),background .3s;position:absolute;top:3px;left:3px}.theme-switch-knob:after{content:"";width:10px;height:10px;box-shadow:-3px 0 0 var(--surface);background:0 0;border-radius:50%;transition:all .3s;position:absolute;top:3px;left:5px}.theme-switch.is-light .theme-switch-knob{background:var(--warning);left:23px}.theme-switch.is-light .theme-switch-knob:after{box-shadow:none;background:color-mix(in oklch, var(--warning) 80%, #fff);width:4px;height:4px;top:6px;left:6px}.chat-header{padding:var(--space-3) var(--space-5);border-bottom:1px solid var(--border);font-size:var(--text-md);font-weight:600;font-family:var(--font-display);letter-spacing:.5px;z-index:1;animation:revealUp .35s var(--ease-out-expo) .15s both;justify-content:space-between;align-items:center;display:flex;position:relative;box-shadow:0 1px 3px #0003}#headerCli{align-items:center;gap:4px;display:inline-flex}#headerCli svg{flex-shrink:0;width:1.1em;height:1.1em}.chat-messages{padding:var(--space-4) var(--space-5);gap:var(--space-3);z-index:1;animation:revealUp .4s var(--ease-out-expo) .2s both;contain:layout style paint;will-change:scroll-position;overflow-anchor:none;flex-direction:column;flex:1;display:flex;position:relative;overflow-y:auto}.chat-messages.vs-active{gap:0}.vs-viewport{gap:var(--space-3);overflow-anchor:none;flex-direction:column;display:flex}.msg{padding:var(--space-3) var(--space-4);border-radius:var(--radius-lg);font-size:var(--text-base);word-wrap:break-word;overflow-wrap:break-word;max-width:85%;transition:box-shadow var(--duration-base);contain:layout style;line-height:1.75;position:relative}@keyframes msgEnterAgent{0%{opacity:0;transform:translate(-8px)translateY(4px)}to{opacity:1;transform:none}}@keyframes msgEnterUser{0%{opacity:0;transform:translate(8px)translateY(4px)}to{opacity:1;transform:none}}@keyframes msgEnterSystem{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.msg-user{background:color-mix(in oklch, var(--accent) 10%, var(--surface));border:1px solid color-mix(in oklch, var(--accent) 18%, var(--border));border-radius:var(--radius-lg) var(--radius-lg) var(--radius-sm) var(--radius-lg);white-space:pre-wrap;align-self:flex-end;gap:var(--space-2);max-width:75%;animation:.25s cubic-bezier(.16,1,.3,1) msgEnterUser;display:flex}.user-icon{text-align:center;width:24px;height:24px;transition:opacity var(--duration-fast);flex-shrink:0;margin-top:2px;font-size:18px;line-height:24px}.user-body{flex:1;min-width:0;position:relative}.msg-agent{align-self:flex-start;gap:var(--space-2);max-width:100%;padding:var(--space-2) 0;transition:padding var(--duration-base);background:0 0;border:none;border-radius:0;animation:.25s cubic-bezier(.16,1,.3,1) msgEnterAgent;display:flex}.agent-icon{text-align:center;width:24px;height:24px;transition:opacity var(--duration-fast);flex-shrink:0;margin-top:2px;font-size:18px;line-height:24px}.agent-icon,.user-icon{background:color-mix(in oklch, var(--surface) 88%, var(--accent) 12%);box-shadow:inset 0 0 0 1px color-mix(in oklch, var(--border) 80%, var(--accent) 20%);border-radius:999px;place-items:center;display:grid;overflow:hidden}.avatar-image{object-fit:cover;border-radius:inherit;width:100%;height:100%;display:block}.agent-body{flex:1;min-width:0;position:relative}.msg-system{border:1px dashed var(--border);text-align:center;font-size:var(--text-xs);color:var(--text-dim);padding:var(--space-1) var(--space-3);background:0 0;align-self:center;max-width:80%;animation:.2s ease-out msgEnterSystem}.msg-user:after{content:"";top:var(--space-2);bottom:var(--space-2);background:var(--accent);opacity:0;width:3px;transition:opacity var(--duration-fast);border-radius:2px;position:absolute}.msg-agent:after{content:"";top:var(--space-2);bottom:var(--space-2);background:var(--accent);opacity:0;width:2px;transition:opacity var(--duration-fast);border-radius:1px;position:absolute;left:-4px}.msg-user:after{right:calc(-1 * var(--space-2))}.msg-agent:hover:after,.msg-user:hover:after{opacity:.3}.msg-user:hover{box-shadow:0 2px 12px color-mix(in oklch, var(--bg) 85%, transparent)}.msg-agent:hover{box-shadow:none}.msg-label{font-size:var(--text-xs);letter-spacing:.5px;text-transform:uppercase;color:var(--text-dim);margin-bottom:var(--space-1);align-items:center;gap:var(--space-1);font-weight:600;display:flex}.msg-user .msg-label:before{content:"";background:var(--success);border-radius:50%;width:6px;height:6px}.msg-type-success{border-color:var(--success);color:var(--success)}.msg-type-error{border-color:var(--error);color:var(--error)}.msg-type-info{border-color:var(--link-color);color:var(--link-color)}.msg-error{border-left:3px solid var(--error);background:var(--error-dim);padding:var(--space-3) var(--space-4);border-radius:var(--radius-sm) var(--radius-md) var(--radius-md) var(--radius-sm)}.msg-error .msg-label,.msg-error .msg-content a{color:var(--error)}.msg-error .msg-content code{border-color:var(--error)}.msg-copy{bottom:var(--space-2);border:1.5px solid var(--text-dim);cursor:pointer;opacity:0;width:12px;height:12px;transition:opacity var(--duration-fast), transform .1s, background var(--duration-fast);background:0 0;border-radius:2px;padding:0;position:absolute}.msg:hover .msg-copy{opacity:.7}.msg-copy:hover{opacity:1;color:var(--text);transform:scale(1.5)}.msg-agent .msg-copy{right:0;bottom:var(--space-2);top:auto;left:auto}.msg-user .msg-copy{left:var(--space-2)}.msg-copy:active{background:var(--accent);border-color:var(--accent);transform:scale(.75)}.msg-copy.copied{background:var(--accent);border-color:var(--accent);color:var(--bg);text-align:center;width:auto;min-width:12px;font-size:10px;line-height:12px;opacity:1!important}.stream-cursor{background:color-mix(in oklch, var(--accent) 40%, transparent);vertical-align:text-bottom;border-radius:2px;width:3px;height:1.1em;margin-left:2px;animation:1s ease-in-out infinite cursorPulse;display:inline-block}@keyframes cursorPulse{0%,to{opacity:.3}50%{opacity:.8}}.math-placeholder{color:var(--text-dim);opacity:.7;font-family:KaTeX_Math,Times New Roman,serif}div.math-placeholder{text-align:center;padding:.5em 0;display:block}.empty-state{justify-content:center;align-items:center;gap:var(--space-3);opacity:.4;user-select:none;flex-direction:column;height:100%;display:none}.chat-messages:empty~.empty-state,.empty-state.visible{display:flex}.empty-icon{font-size:48px;font-family:var(--font-display);color:var(--accent);text-shadow:0 0 20px color-mix(in oklch, var(--accent) 30%, transparent)}.empty-title{font-family:var(--font-display);font-size:var(--text-2xl);letter-spacing:2px;color:var(--text);font-weight:700}.empty-subtitle{font-size:var(--text-sm);color:var(--text-dim)}.skeleton-msg{padding:var(--space-4);border-radius:var(--radius-lg) var(--radius-lg) var(--radius-lg) var(--radius-sm);background:var(--agent-bg);border:1px solid var(--border);max-width:65%}.skeleton-line{background:linear-gradient(90deg, var(--border) 0%, color-mix(in oklch, var(--accent) 15%, var(--border)) 40%, var(--border) 80%);height:10px;margin-bottom:var(--space-2);background-size:300% 100%;border-radius:5px;animation:2s ease-in-out infinite shimmer}.skeleton-line:last-child{width:55%;margin-bottom:0}.skeleton-line:nth-child(2){width:80%;animation-delay:.15s}@keyframes shimmer{0%{background-position:300% 0}to{background-position:-100% 0}}@media (prefers-reduced-motion:reduce){.msg-agent,.msg-user,.msg-system,.stream-cursor,.skeleton-line{animation:none}}.chat-input-area{padding:var(--space-3) var(--space-5);border-top:1px solid var(--border);gap:var(--space-2);z-index:1;animation:revealUp .35s var(--ease-out-expo) .3s both;display:flex;position:relative;box-shadow:0 -1px 3px #00000026}.chat-input{background:var(--surface);border:1px solid var(--border);color:var(--text);border-radius:var(--radius-md);font-size:var(--text-sm);font-family:var(--font-mono);resize:none;max-height:192px;transition:height .1s ease, border-color var(--duration-fast), box-shadow var(--duration-base);flex:1;padding:10px 14px;overflow-y:auto}.chat-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in oklch, var(--accent) 12%, transparent), 0 0 20px color-mix(in oklch, var(--accent) 8%, transparent);outline:none}.chat-input:disabled{opacity:.5}.btn-send{background:linear-gradient(135deg, var(--accent) 0%, var(--accent2) 100%);color:#fff;border-radius:var(--radius-md);cursor:pointer;font-size:var(--text-base);font-weight:700;font-family:var(--font-display);letter-spacing:.5px;transition:transform var(--duration-fast), box-shadow var(--duration-base), filter var(--duration-fast);border:none;padding:10px 18px;position:relative;overflow:hidden}.btn-send:hover{box-shadow:0 4px 20px color-mix(in oklch, var(--accent) 45%, transparent), 0 0 40px color-mix(in oklch, var(--accent) 15%, transparent);filter:brightness(1.15);transform:translateY(-2px)}.btn-send:active{box-shadow:0 0 30px color-mix(in oklch, var(--accent) 50%, transparent);filter:brightness(1.3);transform:scale(.95)}.btn-send.stop-mode{background:var(--stop-btn);font-size:16px;transition:background .2s}.btn-send.stop-mode:hover{background:var(--stop-btn-hover)}.btn-send:disabled{opacity:.4;cursor:not-allowed}.btn-attach{border:1px solid var(--border);color:var(--text-dim);cursor:pointer;background:0 0;border-radius:8px;padding:10px 12px;font-size:16px;line-height:1;transition:border-color .2s,color .2s}.btn-attach:hover{border-color:var(--accent);color:var(--accent)}.drag-overlay{background:var(--error-dim);border:2px dashed var(--accent);z-index:100;color:var(--accent);pointer-events:none;border-radius:8px;justify-content:center;align-items:center;font-size:14px;display:none;position:absolute;inset:0}.drag-overlay.visible{display:flex}.file-preview{border-top:1px solid var(--border);background:var(--surface);color:var(--text-dim);flex-direction:column;gap:6px;padding:6px 20px;font-size:12px;display:none}.file-preview.visible{display:flex}.file-preview-header{justify-content:space-between;align-items:center;display:flex}.file-preview-title{text-transform:uppercase;letter-spacing:.5px;font-size:11px;font-weight:600}.file-preview-clear{color:var(--delete-color);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:2px 6px;font-size:11px;transition:background .15s}.file-preview-clear:hover{background:var(--error-dim)}.file-preview-list{flex-wrap:wrap;gap:6px;display:flex}.file-chip{background:var(--bg);border:1px solid var(--border);border-radius:6px;align-items:center;gap:6px;padding:4px 8px;font-size:11px;animation:.15s ease-out msgEnterSystem;display:inline-flex}.file-chip-thumb{border-radius:3px;height:24px}.file-chip-name{text-overflow:ellipsis;white-space:nowrap;max-width:180px;overflow:hidden}.file-chip-remove{color:var(--text-dim);cursor:pointer;background:0 0;border:none;padding:0 2px;font-size:12px;line-height:1;transition:color .15s}.file-chip-remove:hover{color:var(--delete-color)}.btn-voice{border:1px solid var(--border);cursor:pointer;min-width:44px;min-height:44px;color:var(--text);background:0 0;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;padding:6px 10px;font-size:1.1rem;transition:all .2s;display:inline-flex}.btn-voice svg{width:20px;height:20px}.btn-voice:hover{border-color:var(--accent);background:var(--surface)}.btn-voice.recording{background:var(--error-dim);border-color:var(--error);animation:1.5s ease-in-out infinite pulse-recording}@keyframes pulse-recording{0%,to{box-shadow:0 0 0 0 color-mix(in oklch, var(--error) 40%, transparent)}50%{box-shadow:0 0 0 6px color-mix(in oklch, var(--error) 0%, transparent)}}.voice-timer{font-family:var(--font-mono);color:var(--error);text-align:center;min-width:36px;font-size:11px;animation:1.5s ease-in-out infinite pulse-recording}.btn-voice-cancel{background:var(--error-dim);border:1px solid var(--error);cursor:pointer;min-width:44px;min-height:44px;color:var(--error);border-radius:8px;flex-shrink:0;padding:8px 12px;font-size:.9rem;transition:all .2s}.btn-voice-cancel:hover{background:color-mix(in oklch, var(--error) 30%, transparent)}.cmd-dropdown{background:var(--surface);border:1px solid var(--border);z-index:150;opacity:0;pointer-events:none;border-radius:10px 10px 0 0;max-height:280px;transition:opacity .15s ease-out,transform .15s ease-out;position:absolute;bottom:calc(100% + 2px);left:20px;right:20px;overflow-y:auto;transform:translateY(4px);box-shadow:0 -4px 14px #00000040}.cmd-dropdown.visible{opacity:1;pointer-events:auto;transform:translateY(0)}.cmd-item{cursor:pointer;border-left:3px solid #0000;align-items:center;gap:10px;padding:9px 12px;display:flex}.cmd-item:hover,.cmd-item.selected{background:color-mix(in oklch, var(--accent) 10%, transparent)}.cmd-item.selected{border-left-color:var(--accent);scroll-margin-block:4px}.cmd-name{min-width:96px;color:var(--accent);font-weight:700;font-family:var(--font-mono)}.cmd-desc{color:var(--text-dim);flex:1;font-size:12px}.cmd-args{color:var(--text-dim);opacity:.8;font-size:11px}.cmd-empty{color:var(--text-dim);cursor:default;font-style:italic}.cmd-dropdown::-webkit-scrollbar{width:4px}.cmd-dropdown::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}.typing-indicator{align-items:center;gap:4px;padding:8px 14px;display:none}.typing-indicator.active{display:flex}.typing-indicator .label{color:var(--text-dim);margin-right:6px;font-size:11px}.typing-dot{background:var(--accent);border-radius:50%;width:6px;height:6px;animation:1.2s ease-in-out infinite bounce}.typing-dot:nth-child(2){animation-delay:.15s}.typing-dot:nth-child(3){animation-delay:.3s}@keyframes bounce{0%,60%,to{opacity:.3;transform:translateY(0)}30%{opacity:.7;transform:translateY(-3px)}}.streaming-shimmer{background:linear-gradient(90deg, transparent, var(--accent), transparent);background-size:200% 100%;border-radius:2px;height:3px;animation:1.5s ease-in-out infinite streaming-shimmer}@keyframes streaming-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.status-badge{transition:background-color var(--duration-base) ease, scale .15s ease}.status-badge.status-running{animation:none}.status-badge.status-running:before{content:"";background:var(--status-running-color,var(--warning));border-radius:50%;width:6px;height:6px;margin-right:4px;animation:1.5s ease-in-out infinite dotPing;display:inline-block}.status-badge.status-idle{opacity:.7;animation:none}::view-transition-old(root),::view-transition-new(root){animation-duration:.2s}@supports (animation-timeline:view()){.msg{animation:linear both scroll-fade-in view();animation-range:entry entry 30%}@keyframes scroll-fade-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}}.file-path-link{cursor:pointer;color:var(--accent);text-underline-offset:3px;border-radius:2px;margin:0 -2px;padding:0 2px;text-decoration:underline 1px dotted;transition:background .15s,text-decoration-style .15s}.file-path-link:hover,.file-path-link:focus-visible{background:color-mix(in oklch, var(--accent) 12%, transparent);outline:none;text-decoration-style:solid}.file-path-link:active{background:color-mix(in oklch, var(--accent) 20%, transparent)}.file-path-link.opening{opacity:.6;animation:.6s ease-in-out infinite alternate file-path-pulse}.file-path-link.opened{background:oklch(72.2746% .192007 149.579/.15);text-decoration-color:#22c55e}.file-path-link.open-failed{background:oklch(63.6834% .207849 25.3313/.15);text-decoration-style:wavy;text-decoration-color:#ef4444}@keyframes file-path-pulse{0%{opacity:.6}to{opacity:1}}#chatMessages{transition:box-shadow .4s,border-color .4s}body[data-orc-state] #chatMessages{box-shadow:inset 0 0 30px -10px var(--orc-glow);border-color:var(--orc-glow)}body[data-orc-state] .chat-input-area{border-top:2px solid var(--orc-glow)}body:not([data-orc-state]) .chat-input-area{border-top:2px solid #0000;transition:border-color .4s}@keyframes orc-pulse{0%{box-shadow:inset 0 0 60px -10px var(--orc-glow)}50%{box-shadow:inset 0 0 20px -10px var(--orc-glow)}to{box-shadow:inset 0 0 30px -10px var(--orc-glow)}}body[data-orc-state].orc-pulse #chatMessages{animation:.6s ease-out orc-pulse}.orc-state-badge{font-size:10px;font-weight:700;font-family:var(--font-mono);letter-spacing:1px;background:color-mix(in oklch, var(--orc-glow) 20%, var(--surface));color:var(--orc-glow);border:1px solid var(--orc-glow);text-transform:uppercase;border-radius:4px;padding:2px 8px;display:inline-block}.pabc-roadmap{background:linear-gradient(135deg, var(--surface) 0%, color-mix(in oklch, var(--surface) 90%, #000) 100%);border:1px solid var(--border);border-radius:10px;align-items:center;padding:12px 22px;display:none;position:relative;overflow:visible;box-shadow:0 2px 16px #0000004d,inset 0 1px #ffffff08}.pabc-roadmap.visible{animation:.5s cubic-bezier(.22,1,.36,1) pabc-fadeSlideIn;display:flex}@keyframes pabc-fadeSlideIn{0%{opacity:0;transform:translateY(-12px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.pabc-dot{width:26px;height:26px;font-family:var(--font-display,var(--font-mono));z-index:2;letter-spacing:.5px;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:10px;font-weight:700;transition:all .5s cubic-bezier(.22,1,.36,1);display:flex}.pabc-dot.future{background:var(--surface);color:var(--text-dim);border:1px solid var(--border)}.pabc-dot.active{color:var(--bg);border:2px solid;transform:scale(1.1);box-shadow:0 0 14px -3px,0 0 4px -1px}.pabc-dot.done{color:color-mix(in oklch, var(--bg) 90%, transparent);border:1px solid color-mix(in oklch, var(--text) 10%, transparent);opacity:.65}.pabc-dot[data-phase=P].active,.pabc-dot[data-phase=P].done{background:var(--orc-glow-P)}.pabc-dot[data-phase=A].active,.pabc-dot[data-phase=A].done{background:var(--orc-glow-A)}.pabc-dot[data-phase=B].active,.pabc-dot[data-phase=B].done{background:var(--orc-glow-B)}.pabc-dot[data-phase=C].active,.pabc-dot[data-phase=C].done{background:var(--orc-glow-C)}.pabc-connector{background:linear-gradient(90deg, var(--border) 0%, color-mix(in oklch, var(--border) 60%, var(--surface)) 50%, var(--border) 100%);border-radius:1px;flex:1;min-width:44px;height:2px;transition:all .5s}.pabc-connector.done{background:linear-gradient(90deg, var(--text-dim) 0%, color-mix(in oklch, var(--text-dim) 70%, var(--surface)) 50%, var(--text-dim) 100%);box-shadow:0 0 6px -2px var(--text-dim)}.pabc-center{flex-direction:column;flex-shrink:0;align-items:center;padding:0 20px;display:flex}.pabc-brand{font-family:var(--font-display,var(--font-mono));letter-spacing:4px;background:linear-gradient(90deg, var(--orc-glow-P), var(--orc-glow-A), var(--orc-glow-B), var(--orc-glow-C));-webkit-text-fill-color:transparent;filter:brightness(1.1);background-clip:text;font-size:13px;font-weight:700}.pabc-tagline{font-family:var(--font-mono);color:var(--text-dim);letter-spacing:2px;text-transform:uppercase;opacity:.7;margin-top:2px;font-size:7px}.shark-runner{z-index:10;pointer-events:none;filter:drop-shadow(0 2px 4px #0006);background:url(/dist/assets/shark-sprite-B3AAuERd.png) 0 0/360px 24px no-repeat;width:36px;height:24px;transition:left 1.4s cubic-bezier(.25,.46,.45,.94);display:none;position:absolute;top:-13px;left:0}.shark-runner.running{animation:1s steps(10,end) infinite shark-run;display:block}@keyframes shark-run{to{background-position:-360px 0}}@keyframes pabc-shimmer{0%{opacity:1;filter:brightness()}25%{opacity:1;filter:brightness(1.4);box-shadow:0 0 24px #a855f733}to{opacity:0;transform:translateY(-8px)scale(.98)}}.pabc-roadmap.shimmer-out{animation:1s ease-out forwards pabc-shimmer}[data-theme=light] .pabc-roadmap{background:linear-gradient(135deg, var(--surface) 0%, color-mix(in oklch, var(--surface) 90%, #000) 100%);box-shadow:0 2px 12px #00000014,inset 0 1px #fff9}[data-theme=light] .pabc-dot.future{background:var(--surface);color:var(--text-dim)}[data-theme=light] .pabc-dot.active{color:var(--bg)}[data-theme=light] .pabc-dot.done{color:var(--bg);border-color:#0000000f}[data-theme=light] .pabc-connector{background:linear-gradient(90deg, var(--border) 0%, color-mix(in oklch, var(--border) 60%, var(--surface)) 50%, var(--border) 100%)}[data-theme=light] .pabc-connector.done{background:linear-gradient(90deg, var(--text-dim) 0%, color-mix(in oklch, var(--text-dim) 70%, var(--surface)) 50%, var(--text-dim) 100%);box-shadow:none}[data-theme=light] .shark-runner{filter:drop-shadow(0 1px 2px #00000026)}.cli-status-row{align-items:center;gap:8px;padding:4px 0;font-size:12px;display:flex}.cli-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}.cli-dot.ok{background:var(--green)}.cli-dot.warn{background:var(--warning);animation:2s ease-in-out infinite pulse-warn}@keyframes pulse-warn{0%,to{opacity:1}50%{opacity:.5}}.cli-dot.missing{background:var(--error)}.cli-provider-icon{flex-shrink:0;align-items:center;width:16px;height:16px;display:inline-flex}.cli-provider-icon svg{width:100%;height:100%}.cli-name{flex:1}.cli-path{color:var(--text-dim);text-overflow:ellipsis;white-space:nowrap;max-width:120px;font-size:10px;overflow:hidden}.settings-group{border:1px solid var(--border);border-radius:6px;padding:10px;transition:border-color .2s}.settings-group:hover{border-color:color-mix(in oklch, var(--border) 60%, var(--accent))}.settings-group h4{color:var(--text-dim);font-size:11px;font-family:var(--font-display);letter-spacing:.5px;align-items:center;gap:4px;margin-bottom:8px;display:flex}.settings-row{margin-bottom:6px}.settings-row:last-child{margin-bottom:0}.sub-row{border-left:2px solid var(--border);padding-left:8px}.perm-toggle{gap:8px;display:flex}.perm-btn{border:1px solid var(--border);color:var(--text-dim);cursor:pointer;text-align:center;background:0 0;border-radius:6px;flex:1;padding:6px;font-family:inherit;font-size:11px}.perm-btn.active{border-color:var(--accent);color:var(--accent);background:color-mix(in oklch, var(--accent) 10%, var(--bg))}textarea.prompt-editor{background:var(--bg);border:1px solid var(--border);width:100%;height:120px;color:var(--text);resize:vertical;border-radius:6px;padding:8px;font-family:inherit;font-size:11px}.skill-filter{border:1px solid var(--border);color:var(--text-dim);cursor:pointer;background:0 0;border-radius:12px;padding:4px 10px;font-family:inherit;font-size:10px}.skill-filter.active{border-color:var(--accent);color:var(--accent);background:color-mix(in oklch, var(--accent) 10%, var(--bg))}.skill-card{background:var(--bg);border:1px solid var(--border);border-radius:8px;margin-bottom:8px;padding:10px;transition:border-color .2s,transform .15s,box-shadow .15s}.skill-card:hover{border-color:var(--accent2);transform:translateY(-1px);box-shadow:0 2px 8px #0003}.skill-card.enabled{border-left:3px solid var(--green)}.skill-card-header{align-items:center;gap:8px;margin-bottom:4px;display:flex}.skill-emoji{flex-shrink:0;align-items:center;width:20px;height:20px;font-size:16px;display:inline-flex}.skill-name{flex:1;font-size:12px;font-weight:600}.skill-toggle{width:var(--toggle-w);height:var(--toggle-h);border-radius:calc(var(--toggle-h) / 2);cursor:pointer;border:none;transition:background .2s;position:relative}.skill-toggle.on{background:var(--green)}.skill-toggle.off{background:var(--toggle-off)}.skill-toggle:after{content:"";top:calc((var(--toggle-h) - var(--toggle-knob)) / 2);width:var(--toggle-knob);height:var(--toggle-knob);background:var(--toggle-on);border-radius:50%;transition:left .2s;position:absolute}.skill-toggle.on:after{left:calc(var(--toggle-w) - var(--toggle-knob) - (var(--toggle-h) - var(--toggle-knob)) / 2)}.skill-toggle.off:after{left:calc((var(--toggle-h) - var(--toggle-knob)) / 2)}.skill-desc{color:var(--text-dim);margin-bottom:4px;font-size:11px;line-height:1.4}.skill-req{color:var(--accent2);font-size:10px}.custom-model-input{background:var(--surface);width:100%;color:var(--text);border:1px solid var(--accent);font-size:11px;font-family:var(--font-mono);border-radius:4px;margin-top:4px;padding:4px 6px}.custom-model-input:focus{border-color:var(--accent2);outline:none}.cwd-display{font-family:var(--font-mono);color:var(--text-dim);background:var(--bg);border:1px solid var(--border);text-overflow:ellipsis;white-space:nowrap;border-radius:6px;padding:6px 8px;font-size:11px;display:block;overflow:hidden}.settings-fieldset{border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-3);margin-bottom:var(--space-3)}.settings-fieldset legend{font-weight:600;font-size:var(--text-sm);padding:0 var(--space-2);color:var(--text)}.modal-overlay{background:var(--modal-bg);-webkit-backdrop-filter:blur(10px)saturate(1.2);z-index:999;justify-content:center;align-items:center;display:none;position:fixed;inset:0}.modal-overlay.open{animation:.2s ease-out overlayIn;display:flex}@keyframes overlayIn{0%{opacity:0}to{opacity:1}}.modal-box{background:color-mix(in oklch, var(--surface) 85%, transparent);-webkit-backdrop-filter:blur(24px)saturate(1.5);border:1px solid color-mix(in oklch, var(--accent) 10%, var(--border));border-radius:var(--radius-xl);box-shadow:0 16px 48px #00000080, 0 0 0 1px #ffffff0a inset, 0 0 60px -20px color-mix(in oklch, var(--accent) 6%, transparent);width:500px;max-width:90vw;max-height:80vh;animation:modalBounce .35s var(--ease-spring);flex-direction:column;display:flex}@keyframes modalBounce{0%{opacity:0;transform:translateY(24px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}.modal-header{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:12px 16px;font-size:13px;font-weight:600;display:flex}.modal-textarea{background:var(--bg);min-height:250px;color:var(--text);resize:none;border:none;flex:1;padding:12px 16px;font-family:inherit;font-size:12px}.modal-footer{border-top:1px solid var(--border);justify-content:flex-end;gap:8px;padding:10px 16px;display:flex}.modal-footer .btn-save{width:auto;padding:6px 20px}.hb-job-card{background:var(--surface);border:1px solid var(--border);border-radius:8px;margin-bottom:8px;padding:10px}.hb-job-header{align-items:center;gap:6px;margin-bottom:6px;display:flex}.hb-job-header input[type=text]{background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:4px;flex:1;padding:4px 6px;font-size:11px}.hb-job-header select,.hb-job-header input[type=number]{background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:4px;padding:4px;font-size:11px}.hb-job-header input[type=number]{width:50px}.hb-job-schedule{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:6px;display:flex}.hb-job-schedule select,.hb-job-schedule input[type=number],.hb-job-schedule input[type=text]{background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:4px;padding:4px 6px;font-size:11px}.hb-job-schedule input[type=number]{width:72px}.hb-job-schedule input[type=text]{flex:120px}.hb-chip{color:var(--text-dim);font-size:11px}.hb-schedule-meta{margin:-2px 0 6px;font-size:11px}.hb-help{color:var(--text-dim)}.hb-error{color:var(--error)}.hb-toggle{width:var(--toggle-w);height:var(--toggle-h);border-radius:calc(var(--toggle-h) / 2);cursor:pointer;border:none;transition:background .2s;position:relative}.hb-toggle.on{background:var(--accent)}.hb-toggle.off{background:var(--toggle-off)}.hb-toggle:after{content:"";top:calc((var(--toggle-h) - var(--toggle-knob)) / 2);width:var(--toggle-knob);height:var(--toggle-knob);background:var(--toggle-on);border-radius:50%;transition:left .2s;position:absolute}.hb-toggle.on:after{left:calc(var(--toggle-w) - var(--toggle-knob) - 2px)}.hb-toggle.off:after{left:2px}.hb-del{color:var(--delete-color);cursor:pointer;background:0 0;border:none;font-size:14px}.hb-prompt{background:var(--bg);border:1px solid var(--border);width:100%;color:var(--text);resize:vertical;border-radius:4px;padding:4px 6px;font-size:11px}.hb-add{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:6px;width:100%;margin-top:4px;padding:8px;font-size:12px}.hb-add:hover{opacity:.9}.table-wrapper{margin:var(--space-3) 0;border:1px solid var(--border);border-radius:var(--radius-md);overflow-x:auto}.table-wrapper table{border-collapse:collapse;width:100%;font-size:var(--text-sm);border:none;margin:0}.table-wrapper th,.table-wrapper td{padding:var(--space-2) var(--space-3);text-align:left;border-bottom:1px solid var(--border)}.table-wrapper th{background:color-mix(in oklch, var(--accent) 8%, var(--surface));white-space:nowrap;border-bottom:2px solid color-mix(in oklch, var(--accent) 25%, var(--border));font-weight:600}.table-wrapper tr:nth-child(2n) td{background:color-mix(in oklch, var(--text) 2%, transparent)}.msg-content table{border-collapse:collapse;width:auto;font-size:var(--text-sm);border:1px solid var(--border);margin:8px 0}.msg-content th,.msg-content td{border:1px solid var(--border);text-align:left;padding:5px 12px}.msg-content th{background:color-mix(in oklch, var(--accent) 8%, var(--surface));white-space:nowrap;border-bottom:2px solid var(--border);font-weight:600}.msg-content tr:nth-child(2n){background:color-mix(in oklch, var(--text) 2%, transparent)}.code-block{border:1px solid var(--border);border-radius:var(--radius-md);margin:var(--space-3) 0;overflow:hidden}.code-header{padding:var(--space-1) var(--space-3);background:color-mix(in oklch, var(--text) 8%, var(--surface));border-bottom:1px solid var(--border);font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-dim);letter-spacing:.5px;justify-content:space-between;align-items:center;display:flex}.code-copy-btn{align-items:center;gap:var(--space-1);color:var(--text-dim);cursor:pointer;padding:2px var(--space-2);border-radius:var(--radius-sm);font-size:var(--text-xs);font-family:var(--font-mono);transition:color var(--duration-fast), background var(--duration-fast);opacity:0;background:0 0;border:none;display:flex}.code-block:hover .code-copy-btn{opacity:1}.code-copy-btn:hover{color:var(--text);background:color-mix(in oklch, var(--text) 8%, transparent)}.code-copy-btn.copied{color:var(--success)}.code-block pre{padding:var(--space-3) var(--space-4);background:var(--code-bg);font-family:var(--font-mono);font-size:var(--text-sm);border-radius:0;margin:0;line-height:1.5;overflow-x:auto}.code-block pre code{font-family:var(--font-mono);background:0 0;border-radius:0;padding:0}.msg-content pre:not(.code-block pre){background:var(--code-bg);border-radius:var(--radius-md);font-size:var(--text-sm);margin:8px 0;padding:12px;line-height:1.45;overflow-x:auto}.msg-content pre:not(.code-block pre) code{font-family:var(--font-mono);background:0 0;border-radius:0;padding:0}.msg-content .code-block pre{padding:var(--space-3) var(--space-4);background:var(--code-bg);font-family:var(--font-mono);font-size:var(--text-sm);border-radius:0;margin:0;line-height:1.5;overflow-x:auto}.msg-content code:not(pre code){font-family:var(--font-mono);background:color-mix(in oklch, var(--accent) 6%, var(--surface));padding:1px var(--space-1);border-radius:var(--radius-sm);border:1px solid var(--border);color:var(--text);word-break:break-word;overflow-wrap:break-word;font-size:.875em}.msg-content blockquote{border-left:3px solid var(--accent);color:var(--text-dim);background:color-mix(in oklch, var(--text) 2%, transparent);border-radius:0 var(--radius-sm) var(--radius-sm) 0;margin:8px 0;padding:4px 12px}.msg-content ul,.msg-content ol{margin:4px 0;padding-left:20px}.msg-content li{margin:2px 0}.msg-content a{color:var(--link-color);text-decoration:none}.msg-content a:hover{text-decoration:underline}.msg-content hr{border:none;border-top:1px solid var(--border);margin:12px 0}.msg-content h1{font-size:var(--text-xl);margin:var(--space-5) 0 var(--space-2);letter-spacing:-.02em;color:var(--text);font-weight:700;line-height:1.3}.msg-content h2{font-size:var(--text-lg);margin:var(--space-4) 0 var(--space-2);letter-spacing:-.01em;color:var(--text);font-weight:600}.msg-content h3{font-size:var(--text-md);margin:var(--space-3) 0 var(--space-1);color:var(--text);font-weight:600}.msg-content h4,.msg-content h5,.msg-content h6{font-size:var(--text-base);margin:var(--space-2) 0 var(--space-1);color:var(--text-dim);font-weight:600}.msg-content p{margin:.75em 0}.msg-content p:first-child{margin-top:0}.msg-content p:last-child{margin-bottom:0}.msg-content .katex-display{margin:var(--space-3) 0;padding:var(--space-2) 0;overflow:auto hidden}.msg-content .katex{font-size:1em}.msg-content .katex-display>.katex{font-size:1.1em}.msg-content .mermaid-container{text-align:center;background:color-mix(in oklch, var(--surface) 60%, transparent);border:1px solid var(--border);border-radius:var(--radius-lg);margin:8px 0;padding:16px 12px;position:relative;overflow-x:auto}.msg-content .mermaid-container svg{max-width:100%}.mermaid-zoom-btn{background:color-mix(in oklch, var(--text) 10%, transparent);border:1px solid color-mix(in oklch, var(--text) 15%, transparent);color:var(--text-dim);border-radius:var(--radius-md);cursor:pointer;width:28px;height:28px;transition:background var(--duration-fast), color var(--duration-fast);z-index:2;justify-content:center;align-items:center;font-size:14px;display:flex;position:absolute;top:6px;right:6px}.mermaid-zoom-btn:hover{background:color-mix(in oklch, var(--text) 20%, transparent);color:var(--text)}.mermaid-copy-btn,.mermaid-save-btn{background:color-mix(in oklch, var(--text) 10%, transparent);border:1px solid color-mix(in oklch, var(--text) 15%, transparent);color:var(--text-dim);border-radius:var(--radius-md);cursor:pointer;opacity:0;pointer-events:none;width:28px;height:28px;transition:opacity var(--duration-fast), background var(--duration-fast), color var(--duration-fast);z-index:2;justify-content:center;align-items:center;display:flex;position:absolute;top:6px}.mermaid-copy-btn{right:38px}.mermaid-save-btn{right:70px}.mermaid-container:hover .mermaid-zoom-btn,.mermaid-container:hover .mermaid-copy-btn,.mermaid-container:hover .mermaid-save-btn{opacity:1;pointer-events:auto}.mermaid-copy-btn:hover,.mermaid-save-btn:hover{background:color-mix(in oklch, var(--text) 20%, transparent);color:var(--text)}.mermaid-copy-btn.copied,.mermaid-save-btn.copied{color:var(--success)}.mermaid-overlay{z-index:9999;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.mermaid-overlay-backdrop{backdrop-filter:blur(6px);background:#000000bf;position:absolute;inset:0}.mermaid-overlay-content{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);max-width:95vw;max-height:95vh;padding:20px;animation:.2s ease-out mermaid-pop;position:relative;overflow:auto;box-shadow:0 20px 60px #00000080}@keyframes mermaid-pop{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.mermaid-overlay-close{background:color-mix(in oklch, var(--text) 15%, transparent);color:var(--text);border-radius:var(--radius-lg);cursor:pointer;width:36px;height:36px;transition:background var(--duration-fast);z-index:10;pointer-events:auto;border:none;justify-content:center;align-items:center;font-size:18px;display:flex;position:absolute;top:8px;right:8px}.mermaid-overlay-close:hover{background:color-mix(in oklch, var(--text) 30%, transparent);color:var(--text)}.mermaid-overlay-svg{z-index:0;justify-content:center;align-items:center;min-width:min(400px,90vw);min-height:200px;display:flex;position:relative}.msg-content .code-block-wrapper{position:relative}.msg-content .code-lang-label{font-size:var(--text-xs);color:var(--code-label-color);background:color-mix(in oklch, var(--text) 5%, transparent);border-radius:0 var(--radius-md) 0 var(--radius-sm);font-family:var(--font-mono);cursor:pointer;user-select:none;transition:background var(--duration-fast), transform var(--duration-fast), color var(--duration-fast);padding:2px 8px;position:absolute;top:0;right:0}.msg-content .code-lang-label:hover{background:color-mix(in oklch, var(--text) 12%, transparent);transform:scale(1.05)}.msg-content .code-lang-label.copied{color:var(--success)}.mermaid-error{border:1px solid var(--error);border-radius:var(--radius-md);padding:var(--space-2);margin:var(--space-1) 0}.mermaid-error-title{color:var(--error);font-size:var(--text-xs);margin-bottom:var(--space-1)}.mermaid-error-msg{color:var(--warning);font-size:var(--text-xs);margin-bottom:var(--space-2)}.mermaid-error-code{font-size:var(--text-xs);margin:0;overflow-x:auto}.tool-group{margin:0 0 var(--space-3);font-size:var(--text-sm)}.tool-group-summary{align-items:center;gap:var(--space-2);border:1px dashed var(--border);border-radius:var(--radius-md);color:var(--text-dim);cursor:pointer;padding:var(--space-1) var(--space-3);font-family:var(--font-ui);font-size:var(--text-xs);transition:color var(--duration-fast), border-color var(--duration-fast);text-align:left;background:0 0;width:100%;display:flex}.tool-group-summary:hover{color:var(--text);border-color:color-mix(in oklch, var(--accent) 40%, var(--border))}.tool-group-summary-text{flex:1}.tool-group-duration{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-dim)}.tool-group-chevron{font-size:var(--text-xs);transition:transform var(--duration-fast);display:inline-block}.tool-group.expanded .tool-group-chevron{transform:rotate(180deg)}.tool-status-dot,.tool-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px;display:inline-block}.tool-status-dot.running,.tool-dot.running{background:var(--warning);animation:1.5s ease-in-out infinite toolDotPulse}.tool-status-dot.done,.tool-dot.done{background:var(--success)}.tool-dot.pending{background:var(--text-dim);opacity:.5}.tool-status-dot.error,.tool-dot.error{background:var(--error)}@keyframes toolDotPulse{0%,to{opacity:1}50%{opacity:.4}}.tool-details{max-height:2000px;transition:max-height var(--duration-slow) ease-out, opacity var(--duration-base);padding-left:var(--space-4);border-left:1px solid var(--border);margin-left:var(--space-1);margin-top:var(--space-1);overflow:hidden}.tool-details.collapsed{opacity:0;pointer-events:none;max-height:0;margin-top:0}.tool-item{padding:var(--space-1) 0}.tool-item+.tool-item{border-top:1px solid color-mix(in oklch, var(--border) 50%, transparent)}.tool-item-header{align-items:center;gap:var(--space-2);font-size:var(--text-xs);display:flex}.tool-item-icon{flex-shrink:0}.tool-item-label{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.tool-item-toggle{align-items:start;gap:var(--space-2);width:100%;color:inherit;text-align:left;cursor:pointer;font-size:var(--text-xs);background:0 0;border:0;grid-template-columns:auto minmax(0,1fr) auto;padding:0;display:grid}.tool-item-main{gap:2px;min-width:0;display:grid}.tool-item-expandable .tool-item-label{white-space:normal;word-break:break-word}.tool-item-snippet{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-dim);word-break:break-word;-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.tool-item-chevron{color:var(--text-dim);transition:transform var(--duration-fast);font-size:10px}.tool-item.expanded .tool-item-chevron{transform:rotate(90deg)}.tool-item-details{border-left:1px solid color-mix(in oklch, var(--border) 70%, transparent);background:color-mix(in oklch, var(--surface) 70%, transparent);border-radius:0 var(--radius-sm) var(--radius-sm) 0;margin-left:22px;padding:8px 10px}.tool-item-details.collapsed{display:none}.tool-item-full{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-dim);white-space:pre-wrap;word-break:break-word;max-height:260px;margin:0;overflow-x:auto}.tool-item-time{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-dim);flex-shrink:0}.tool-activity-live{align-items:center;gap:var(--space-2);padding:var(--space-1) var(--space-3);font-size:var(--text-xs);color:var(--text-dim);border:1px dashed var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-2);animation:.2s ease-out msgEnterAgent;display:flex}.tool-activity-live .tool-status-dot{background:var(--warning);animation:1.5s ease-in-out infinite toolDotPulse}.tool-summary{font-size:var(--text-xs);color:var(--text-dim);margin-bottom:var(--space-2);border:1px dashed var(--border);border-radius:var(--radius-md);padding:var(--space-1) var(--space-3)}.tool-summary summary{cursor:pointer;user-select:none;align-items:center;gap:var(--space-1);display:flex}.tool-summary summary:before{content:"";background:var(--success);border-radius:50%;flex-shrink:0;width:8px;height:8px;display:inline-block}.tool-summary .tool-log{margin-top:var(--space-1);padding-top:var(--space-1);border-top:1px dashed var(--border);white-space:pre-wrap;line-height:1.6;font-family:var(--font-mono)}@media (prefers-reduced-motion:reduce){.tool-status-dot.running,.tool-dot.running,.tool-activity-live .tool-status-dot{animation:none}}.process-block{margin:0 0 var(--space-1);font-size:var(--text-sm);white-space:normal;line-height:1.3}.process-block+.msg-content .orchestrate-placeholder{display:none}.orchestrate-placeholder{font-size:var(--text-xs);opacity:.6}.process-summary{align-items:center;gap:var(--space-2);background:color-mix(in oklch, var(--surface) 50%, transparent);border:1px solid var(--border);border-radius:var(--radius-md);width:100%;color:var(--text-dim);cursor:pointer;padding:var(--space-1) var(--space-3);font-size:var(--text-xs);transition:border-color var(--duration-fast);display:flex}.process-summary:hover{border-color:color-mix(in oklch, var(--accent) 40%, var(--border))}.process-dot{border-radius:50%;flex-shrink:0;width:6px;height:6px}.process-dot.running{background:var(--warning);will-change:opacity;animation:1.5s ease-in-out infinite processDotPulse}.process-dot.done{background:var(--success)}@keyframes processDotPulse{0%,to{opacity:1}50%{opacity:.4}}.process-summary-text{text-align:left;flex:1}.process-duration{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-dim)}.process-chevron{color:var(--text-dim);transition:transform var(--duration-fast);font-size:10px}.process-details{padding-left:var(--space-3);border-left:1px solid var(--border);transition:grid-template-rows var(--duration-slow);grid-template-rows:1fr;margin-top:2px;margin-left:3px;display:grid}.process-block.collapsed .process-details{grid-template-rows:0fr}.process-details>.process-steps-inner{overflow:hidden}.process-step{font-size:var(--text-xs);gap:4px;padding:2px 0;display:grid}.process-step-toggle{align-items:start;gap:var(--space-2);width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:auto auto minmax(0,1fr) auto;padding:0;display:grid}.process-step-dot{border-radius:50%;flex-shrink:0;width:5px;height:5px}.process-step-dot.running{background:var(--warning);animation:1.5s ease-in-out infinite processDotPulse}.process-step-dot.done{background:var(--success)}.process-step-dot.error{background:var(--error)}.process-step-badge{letter-spacing:.5px;text-transform:uppercase;font-size:9px;font-weight:700;font-family:var(--font-mono);border-radius:3px;padding:1px 5px}.process-step-badge.thinking{background:color-mix(in oklch, var(--accent) 15%, transparent);color:var(--accent)}.process-step-badge.tool{background:color-mix(in oklch, var(--warning) 15%, transparent);color:var(--warning)}.process-step-badge.search{background:color-mix(in oklch, var(--success) 15%, transparent);color:var(--success)}.process-step-main{gap:2px;min-width:0;display:grid}.process-step-label{color:var(--text);word-break:break-word}.process-step-snippet{color:var(--text-dim);word-break:break-word;-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.process-step-chevron{color:var(--text-dim);transition:transform var(--duration-fast)}.process-step.expanded .process-step-chevron{transform:rotate(90deg)}.process-step-details{border-left:1px solid color-mix(in oklch, var(--border) 70%, transparent);background:color-mix(in oklch, var(--surface) 70%, transparent);border-radius:0 var(--radius-sm) var(--radius-sm) 0;margin-left:22px;padding:8px 10px}.process-step-details.collapsed{display:none}.process-step-full{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-dim);white-space:pre-wrap;word-break:break-word;max-height:600px;margin:0;overflow-x:auto}.process-step-label{word-break:break-word;overflow-wrap:break-word;white-space:normal}@media (prefers-reduced-motion:reduce){.process-dot.running,.process-step-dot.running{animation:none}}details.tool-block summary{cursor:pointer;align-items:center;gap:var(--space-2);padding:var(--space-1) var(--space-2);font-size:var(--text-sm);color:var(--text-dim);border-radius:var(--radius-sm);transition:background var(--duration-fast);list-style:none;display:flex}details.tool-block summary:hover{background:color-mix(in oklch, var(--accent) 8%, transparent)}details.tool-block summary:before{content:"";width:.5em;height:.5em;transition:transform var(--duration-fast);border-bottom:2px solid;border-right:2px solid;flex-shrink:0;display:inline-block;transform:rotate(-45deg)}details.tool-block[open] summary:before{transform:rotate(45deg)}details.tool-block .tool-content{content-visibility:auto;contain-intrinsic-size:auto 200px}.diagram-container{border-radius:var(--radius-md);margin:1rem 0;position:relative;overflow:hidden}.diagram-svg{background:var(--surface);border:1px solid var(--border);padding:var(--space-4)}.diagram-svg svg{width:100%;max-width:680px;height:auto;display:block}.diagram-widget{border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}.diagram-widget iframe{border:none;width:100%;min-height:60px;display:block}.diagram-loading{background:var(--surface);border:1px solid var(--border);justify-content:center;align-items:center;min-height:120px;display:flex}.diagram-spinner{border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;width:24px;height:24px;animation:.8s linear infinite diagram-spin}@keyframes diagram-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.diagram-spinner{animation:none}}.diagram-error{padding:var(--space-4);color:var(--text-dim);text-align:center;font-size:14px}.diagram-widget-pending{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);justify-content:center;align-items:center;min-height:120px;display:flex}.diagram-zoom-btn{top:var(--space-2);right:var(--space-2);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);width:32px;height:32px;color:var(--text-dim);cursor:pointer;opacity:0;pointer-events:none;transition:opacity var(--duration-fast);z-index:2;justify-content:center;align-items:center;font-size:16px;display:flex;position:absolute}.diagram-container:hover .diagram-zoom-btn,.diagram-container:focus-within .diagram-zoom-btn{opacity:1;pointer-events:auto}.diagram-zoom-btn:hover{background:var(--bg);color:var(--text)}.diagram-copy-btn,.diagram-save-btn{top:var(--space-2);right:var(--space-2);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);width:32px;height:32px;color:var(--text-dim);cursor:pointer;opacity:0;pointer-events:none;transition:opacity var(--duration-fast), color var(--duration-fast);z-index:2;justify-content:center;align-items:center;display:flex;position:absolute}.diagram-widget .diagram-save-btn,.diagram-svg .diagram-copy-btn{right:calc(var(--space-2) + 36px)}.diagram-svg .diagram-save-btn{right:calc(var(--space-2) + 72px)}.diagram-container:hover .diagram-copy-btn,.diagram-container:hover .diagram-save-btn,.diagram-container:focus-within .diagram-copy-btn,.diagram-container:focus-within .diagram-save-btn{opacity:1;pointer-events:auto}.diagram-copy-btn:hover,.diagram-save-btn:hover{background:var(--bg);color:var(--text)}.diagram-copy-btn.copied,.diagram-save-btn.copied{color:var(--success)}.diagram-overlay{z-index:9999;backdrop-filter:blur(4px);background:#000000b3;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.diagram-overlay-content{background:var(--surface);border-radius:var(--radius-lg);min-width:min(680px,90vw);max-width:95vw;max-height:90vh;padding:var(--space-6);overflow:auto;box-shadow:0 20px 60px #00000080}.diagram-overlay-content svg{width:100%;max-width:1200px;height:auto;display:block}.diagram-overlay-close{top:var(--space-4);right:var(--space-4);background:var(--surface);border:1px solid var(--border);width:40px;height:40px;color:var(--text);cursor:pointer;border-radius:50%;justify-content:center;align-items:center;font-size:20px;display:flex;position:absolute}.diagram-overlay-close:hover{background:var(--bg)}.c-blue-fill{fill:#1e3a5f}.c-blue-stroke{stroke:#3b82f6;fill:none}.c-blue-text{fill:#93c5fd}.c-blue-bg{fill:#1e3a5f;stroke:#3b82f6;stroke-width:1px}.c-purple-fill{fill:#3b1f5e}.c-purple-stroke{stroke:#8b5cf6;fill:none}.c-purple-text{fill:#c4b5fd}.c-purple-bg{fill:#3b1f5e;stroke:#8b5cf6;stroke-width:1px}.c-green-fill{fill:#14532d}.c-green-stroke{stroke:#22c55e;fill:none}.c-green-text{fill:#86efac}.c-green-bg{fill:#14532d;stroke:#22c55e;stroke-width:1px}.c-amber-fill{fill:#451a03}.c-amber-stroke{stroke:#f59e0b;fill:none}.c-amber-text{fill:#fcd34d}.c-amber-bg{fill:#451a03;stroke:#f59e0b;stroke-width:1px}.c-red-fill{fill:#450a0a}.c-red-stroke{stroke:#ef4444;fill:none}.c-red-text{fill:#fca5a5}.c-red-bg{fill:#450a0a;stroke:#ef4444;stroke-width:1px}.c-cyan-fill{fill:#083344}.c-cyan-stroke{stroke:#06b6d4;fill:none}.c-cyan-text{fill:#67e8f9}.c-cyan-bg{fill:#083344;stroke:#06b6d4;stroke-width:1px}.c-pink-fill{fill:#500724}.c-pink-stroke{stroke:#ec4899;fill:none}.c-pink-text{fill:#f9a8d4}.c-pink-bg{fill:#500724;stroke:#ec4899;stroke-width:1px}.c-slate-fill{fill:#1e293b}.c-slate-stroke{stroke:#64748b;fill:none}.c-slate-text{fill:#94a3b8}.c-slate-bg{fill:#1e293b;stroke:#64748b;stroke-width:1px}.c-orange-fill{fill:#431407}.c-orange-stroke{stroke:#f97316;fill:none}.c-orange-text{fill:#fdba74}.c-orange-bg{fill:#431407;stroke:#f97316;stroke-width:1px}.diagram-svg .node{rx:8;ry:8}.diagram-svg .connector{stroke:var(--border);stroke-width:1.5px;fill:none}.diagram-svg .label{text-anchor:middle;dominant-baseline:central;font-size:14px}.diagram-svg .diagram-title{text-anchor:middle;font-size:16px;font-weight:600}[data-theme=light] .c-blue-fill{fill:#dbeafe}[data-theme=light] .c-blue-stroke{stroke:#2563eb}[data-theme=light] .c-blue-text{fill:#1e40af}[data-theme=light] .c-blue-bg{fill:#dbeafe;stroke:#2563eb}[data-theme=light] .c-purple-fill{fill:#ede9fe}[data-theme=light] .c-purple-stroke{stroke:#7c3aed}[data-theme=light] .c-purple-text{fill:#5b21b6}[data-theme=light] .c-purple-bg{fill:#ede9fe;stroke:#7c3aed}[data-theme=light] .c-green-fill{fill:#dcfce7}[data-theme=light] .c-green-stroke{stroke:#16a34a}[data-theme=light] .c-green-text{fill:#15803d}[data-theme=light] .c-green-bg{fill:#dcfce7;stroke:#16a34a}[data-theme=light] .c-amber-fill{fill:#fef3c7}[data-theme=light] .c-amber-stroke{stroke:#d97706}[data-theme=light] .c-amber-text{fill:#92400e}[data-theme=light] .c-amber-bg{fill:#fef3c7;stroke:#d97706}[data-theme=light] .c-red-fill{fill:#fee2e2}[data-theme=light] .c-red-stroke{stroke:#dc2626}[data-theme=light] .c-red-text{fill:#991b1b}[data-theme=light] .c-red-bg{fill:#fee2e2;stroke:#dc2626}[data-theme=light] .c-cyan-fill{fill:#cffafe}[data-theme=light] .c-cyan-stroke{stroke:#0891b2}[data-theme=light] .c-cyan-text{fill:#155e75}[data-theme=light] .c-cyan-bg{fill:#cffafe;stroke:#0891b2}[data-theme=light] .c-pink-fill{fill:#fce7f3}[data-theme=light] .c-pink-stroke{stroke:#db2777}[data-theme=light] .c-pink-text{fill:#9d174d}[data-theme=light] .c-pink-bg{fill:#fce7f3;stroke:#db2777}[data-theme=light] .c-slate-fill{fill:#f1f5f9}[data-theme=light] .c-slate-stroke{stroke:#475569}[data-theme=light] .c-slate-text{fill:#334155}[data-theme=light] .c-slate-bg{fill:#f1f5f9;stroke:#475569}[data-theme=light] .c-orange-fill{fill:#ffedd5}[data-theme=light] .c-orange-stroke{stroke:#ea580c}[data-theme=light] .c-orange-text{fill:#9a3412}[data-theme=light] .c-orange-bg{fill:#ffedd5;stroke:#ea580c}[data-theme=light] .diagram-svg .connector{stroke:var(--border)}
|