@symerian/symi 3.5.0 → 3.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/bundled/boot-md/handler.js +4 -4
  3. package/dist/bundled/session-memory/handler.js +4 -4
  4. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  5. package/dist/{chrome-C_I81hbq.js → chrome-B7-rO4i9.js} +4 -4
  6. package/dist/{chrome-BKUACyeO.js → chrome-DPjznJQ-.js} +4 -4
  7. package/dist/control-ui/css/revert-red-theme.md +141 -0
  8. package/dist/control-ui/css/style.css +5843 -0
  9. package/dist/control-ui/css/style.css.backup-2026-03-03-162525 +3546 -0
  10. package/dist/control-ui/css/style.css.backup-before-red-2026-03-03-162525 +3546 -0
  11. package/dist/control-ui/css/style.css.backup-before-red-theme-2026-03-03-162530 +3546 -0
  12. package/dist/control-ui/css/style.css.pre-2row +2165 -0
  13. package/dist/control-ui/css/style.css.pre-brand +1776 -0
  14. package/dist/control-ui/css/style.css.pre-history +1974 -0
  15. package/dist/control-ui/css/style.css.pre-nav +2264 -0
  16. package/dist/control-ui/css/style.css.pre-newsession +1898 -0
  17. package/dist/control-ui/css/style.css.pre-queue +2195 -0
  18. package/dist/control-ui/css/style.css.pre-red-prompt +2524 -0
  19. package/dist/control-ui/css/style.css.pre-stop +2239 -0
  20. package/dist/control-ui/css/style.css.pre-textarea +2184 -0
  21. package/dist/control-ui/css/style.css.pre-watchdog +1848 -0
  22. package/dist/control-ui/css/style.css.red-theme +2999 -0
  23. package/dist/control-ui/index.html +1049 -0
  24. package/dist/control-ui/js/app.js +1304 -0
  25. package/dist/control-ui/js/app.js.pre-2row +463 -0
  26. package/dist/control-ui/js/app.js.pre-heartbeat-filter +595 -0
  27. package/dist/control-ui/js/app.js.pre-newsession +408 -0
  28. package/dist/control-ui/js/app.js.pre-queue +476 -0
  29. package/dist/control-ui/js/app.js.pre-stop +564 -0
  30. package/dist/control-ui/js/app.js.pre-textarea +467 -0
  31. package/dist/control-ui/js/app.js.pre-watchdog +293 -0
  32. package/dist/control-ui/js/connections.js +438 -0
  33. package/dist/control-ui/js/gateway.js +233 -0
  34. package/dist/control-ui/js/gateway.js.pre-stop +110 -0
  35. package/dist/control-ui/js/history.js +732 -0
  36. package/dist/control-ui/js/logs.js +238 -0
  37. package/dist/control-ui/js/menu.js +232 -0
  38. package/dist/control-ui/js/menu.js.pre-nav +66 -0
  39. package/dist/control-ui/js/metrics.js +53 -0
  40. package/dist/control-ui/js/models.js +138 -0
  41. package/dist/control-ui/js/render.js +882 -0
  42. package/dist/control-ui/js/render.test.js +112 -0
  43. package/dist/control-ui/js/scheduling.js +461 -0
  44. package/dist/control-ui/js/settings.js +910 -0
  45. package/dist/control-ui/js/slash-autocomplete.js +168 -0
  46. package/dist/control-ui/js/subagents.js +560 -0
  47. package/dist/control-ui/js/utils.js +29 -0
  48. package/dist/control-ui/vendor/highlight.min.js +2518 -0
  49. package/dist/control-ui/vendor/marked.min.js +69 -0
  50. package/dist/{deliver-DyO3QD8O.js → deliver-DTRkeYm3.js} +4 -4
  51. package/dist/{deliver-Cjyb6h4g.js → deliver-oWGJwzFf.js} +4 -4
  52. package/dist/extensionAPI.js +4 -4
  53. package/dist/llm-slug-generator.js +4 -4
  54. package/dist/{manager-rvtFoeFT.js → manager-CFenq_aO.js} +1 -1
  55. package/dist/{manager-PTSjHNVq.js → manager-CsxTf96V.js} +1 -1
  56. package/dist/{pi-embedded-BPuUM-gD.js → pi-embedded-Cdub5Vs9.js} +10 -10
  57. package/dist/{pw-ai-BFS9ezWe.js → pw-ai-BOOB8qoi.js} +1 -1
  58. package/dist/{pw-ai-Cx-Ko_FL.js → pw-ai-D2pEVS5n.js} +1 -1
  59. package/dist/{synthesis-7UL3pCpj.js → synthesis-Be9nYyDd.js} +4 -4
  60. package/dist/{synthesis-fD8J2vag.js → synthesis-CBIT6Vnk.js} +4 -4
  61. package/dist/{unified-runner-BIiKFnNF.js → unified-runner-BVvvnjXW.js} +10 -10
  62. package/package.json +3 -3
@@ -0,0 +1,2184 @@
1
+ /* ── Reset & Base ─────────────────────────────────────────────────── */
2
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
3
+
4
+ :root {
5
+ --bg: #07070f;
6
+ --glass-bg: rgba(255,255,255,0.04);
7
+ --glass-bg-hover: rgba(255,255,255,0.07);
8
+ --glass-border: rgba(255,255,255,0.08);
9
+ --glass-border-strong: rgba(255,255,255,0.14);
10
+ --text: rgba(255,255,255,0.92);
11
+ --text-muted: rgba(255,255,255,0.45);
12
+ --text-dim: rgba(255,255,255,0.25);
13
+ --accent-cyan: #00d4ff;
14
+ --accent-purple: #8b5cf6;
15
+ --accent-pink: #f472b6;
16
+ --accent-green: #34d399;
17
+ --accent-blue: #60a5fa;
18
+ --shadow: 0 8px 32px rgba(0,0,0,0.5);
19
+ --blur: blur(24px) saturate(160%);
20
+ --font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
21
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'SF Mono', Consolas, monospace;
22
+ }
23
+
24
+ html, body {
25
+ height: 100%;
26
+ width: 100%;
27
+ overflow: hidden;
28
+ background: var(--bg);
29
+ color: var(--text);
30
+ font-family: var(--font);
31
+ font-size: 13px;
32
+ line-height: 1.5;
33
+ -webkit-font-smoothing: antialiased;
34
+ }
35
+
36
+ /* ── Background ───────────────────────────────────────────────────── */
37
+ .bg-orbs {
38
+ position: fixed;
39
+ inset: 0;
40
+ pointer-events: none;
41
+ z-index: 0;
42
+ overflow: hidden;
43
+ }
44
+
45
+ .orb {
46
+ position: absolute;
47
+ border-radius: 50%;
48
+ filter: blur(120px);
49
+ opacity: 0.18;
50
+ animation: drift 20s ease-in-out infinite alternate;
51
+ }
52
+
53
+ .orb-1 {
54
+ width: 700px; height: 700px;
55
+ background: radial-gradient(circle, var(--accent-cyan), transparent 70%);
56
+ top: -200px; left: -150px;
57
+ animation-duration: 25s;
58
+ }
59
+
60
+ .orb-2 {
61
+ width: 600px; height: 600px;
62
+ background: radial-gradient(circle, var(--accent-purple), transparent 70%);
63
+ bottom: -100px; right: -100px;
64
+ animation-duration: 30s;
65
+ animation-delay: -8s;
66
+ }
67
+
68
+ .orb-3 {
69
+ width: 500px; height: 500px;
70
+ background: radial-gradient(circle, var(--accent-pink), transparent 70%);
71
+ top: 40%; left: 45%;
72
+ animation-duration: 22s;
73
+ animation-delay: -4s;
74
+ opacity: 0.1;
75
+ }
76
+
77
+ @keyframes drift {
78
+ 0% { transform: translate(0, 0) scale(1); }
79
+ 33% { transform: translate(60px, -40px) scale(1.05); }
80
+ 66% { transform: translate(-40px, 60px) scale(0.95); }
81
+ 100% { transform: translate(30px, 20px) scale(1.02); }
82
+ }
83
+
84
+ .bg-grid {
85
+ position: fixed;
86
+ inset: 0;
87
+ z-index: 0;
88
+ pointer-events: none;
89
+ background-image:
90
+ linear-gradient(rgba(255,255,255,0.015) 1px, transparent 1px),
91
+ linear-gradient(90deg, rgba(255,255,255,0.015) 1px, transparent 1px);
92
+ background-size: 48px 48px;
93
+ mask-image: radial-gradient(ellipse 80% 80% at 50% 50%, black 40%, transparent 100%);
94
+ }
95
+
96
+ /* ── Glass Panel ──────────────────────────────────────────────────── */
97
+ .glass-panel {
98
+ position: relative;
99
+ background: var(--glass-bg);
100
+ backdrop-filter: var(--blur);
101
+ -webkit-backdrop-filter: var(--blur);
102
+ border: 1px solid var(--glass-border);
103
+ border-radius: 14px;
104
+ padding: 14px;
105
+ box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.06);
106
+ transition: border-color 0.3s, box-shadow 0.3s;
107
+ }
108
+
109
+ .glass-panel:hover {
110
+ border-color: var(--glass-border-strong);
111
+ box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.1), 0 0 0 1px rgba(0,212,255,0.05);
112
+ }
113
+
114
+ .glass-panel::before {
115
+ content: '';
116
+ position: absolute;
117
+ inset: 0;
118
+ border-radius: 16px;
119
+ background: linear-gradient(135deg, rgba(255,255,255,0.04) 0%, transparent 60%);
120
+ pointer-events: none;
121
+ }
122
+
123
+ .panel-sm { padding: 10px 12px; }
124
+
125
+ .panel-label {
126
+ font-size: 10px;
127
+ font-family: var(--font-mono);
128
+ font-weight: 600;
129
+ letter-spacing: 0.18em;
130
+ color: var(--accent-cyan);
131
+ margin-bottom: 12px;
132
+ opacity: 0.9;
133
+ }
134
+
135
+ /* ── Brand Panel ─────────────────────────────────────────────────── */
136
+ .brand-panel {
137
+ display: flex;
138
+ align-items: center;
139
+ gap: 14px;
140
+ padding: 14px 16px;
141
+ overflow: hidden;
142
+ }
143
+
144
+ .brand-panel::after {
145
+ content: '';
146
+ position: absolute;
147
+ inset: 0;
148
+ border-radius: 14px;
149
+ background: linear-gradient(
150
+ 120deg,
151
+ rgba(0,212,255,0.06) 0%,
152
+ rgba(139,92,246,0.06) 50%,
153
+ rgba(0,212,255,0.03) 100%
154
+ );
155
+ pointer-events: none;
156
+ }
157
+
158
+ .brand-mark {
159
+ flex-shrink: 0;
160
+ width: 36px;
161
+ height: 36px;
162
+ border-radius: 10px;
163
+ background: linear-gradient(135deg, rgba(0,212,255,0.15), rgba(139,92,246,0.15));
164
+ border: 1px solid rgba(0,212,255,0.2);
165
+ display: flex;
166
+ align-items: center;
167
+ justify-content: center;
168
+ font-size: 16px;
169
+ box-shadow: 0 0 16px rgba(0,212,255,0.1), inset 0 1px 0 rgba(255,255,255,0.1);
170
+ }
171
+
172
+ .brand-text {
173
+ display: flex;
174
+ flex-direction: column;
175
+ gap: 2px;
176
+ min-width: 0;
177
+ }
178
+
179
+ .brand-name {
180
+ font-family: var(--font-mono);
181
+ font-size: 18px;
182
+ font-weight: 700;
183
+ letter-spacing: 0.22em;
184
+ background: linear-gradient(90deg, #00d4ff 0%, #a78bfa 60%, #00d4ff 120%);
185
+ background-size: 200% auto;
186
+ -webkit-background-clip: text;
187
+ -webkit-text-fill-color: transparent;
188
+ background-clip: text;
189
+ animation: brand-shimmer 6s linear infinite;
190
+ line-height: 1;
191
+ }
192
+
193
+ .brand-sub {
194
+ font-family: var(--font-mono);
195
+ font-size: 9px;
196
+ letter-spacing: 0.16em;
197
+ color: var(--text-dim);
198
+ opacity: 0.6;
199
+ text-transform: uppercase;
200
+ }
201
+
202
+ @keyframes brand-shimmer {
203
+ 0% { background-position: 0% center; }
204
+ 100% { background-position: 200% center; }
205
+ }
206
+
207
+ /* ── Metric Rows ──────────────────────────────────────────────────── */
208
+ .metric-row {
209
+ display: flex;
210
+ align-items: center;
211
+ gap: 8px;
212
+ margin-bottom: 7px;
213
+ }
214
+
215
+ .metric-row:last-child { margin-bottom: 0; }
216
+
217
+ .metric-name {
218
+ font-family: var(--font-mono);
219
+ font-size: 10px;
220
+ color: var(--text-muted);
221
+ width: 38px;
222
+ flex-shrink: 0;
223
+ }
224
+
225
+ .metric-bar {
226
+ flex: 1;
227
+ height: 3px;
228
+ background: rgba(255,255,255,0.08);
229
+ border-radius: 99px;
230
+ overflow: hidden;
231
+ }
232
+
233
+ .metric-fill {
234
+ --accent: var(--accent-cyan);
235
+ height: 100%;
236
+ width: 0%;
237
+ border-radius: 99px;
238
+ background: var(--accent);
239
+ box-shadow: 0 0 6px var(--accent);
240
+ transition: width 1s cubic-bezier(0.4, 0, 0.2, 1);
241
+ }
242
+
243
+ .metric-val {
244
+ font-family: var(--font-mono);
245
+ font-size: 10px;
246
+ color: var(--text-muted);
247
+ width: 40px;
248
+ text-align: right;
249
+ flex-shrink: 0;
250
+ }
251
+
252
+ /* ── Network / Status Rows ────────────────────────────────────────── */
253
+ .net-row {
254
+ display: flex;
255
+ align-items: center;
256
+ gap: 7px;
257
+ margin-bottom: 8px;
258
+ min-height: 20px;
259
+ }
260
+ .net-row:last-child { margin-bottom: 0; }
261
+
262
+ .net-name {
263
+ font-size: 12px;
264
+ color: var(--text);
265
+ flex: 1;
266
+ }
267
+ .net-name.muted { color: var(--text-muted); }
268
+
269
+ .net-ip {
270
+ font-family: var(--font-mono);
271
+ font-size: 11px;
272
+ color: var(--text-muted);
273
+ }
274
+
275
+ .status-dot {
276
+ width: 7px; height: 7px;
277
+ border-radius: 50%;
278
+ flex-shrink: 0;
279
+ }
280
+ .dot-green { background: var(--accent-green); box-shadow: 0 0 6px var(--accent-green); }
281
+ .dot-blue { background: var(--accent-blue); box-shadow: 0 0 6px var(--accent-blue); }
282
+ .dot-yellow { background: #fbbf24; box-shadow: 0 0 6px #fbbf24; }
283
+
284
+ .pulse {
285
+ animation: pulse-glow 2s ease-in-out infinite;
286
+ }
287
+ @keyframes pulse-glow {
288
+ 0%, 100% { opacity: 1; box-shadow: 0 0 6px var(--accent-green); }
289
+ 50% { opacity: 0.5; box-shadow: 0 0 12px var(--accent-green), 0 0 24px var(--accent-green); }
290
+ }
291
+
292
+ .divider {
293
+ height: 1px;
294
+ background: var(--glass-border);
295
+ margin: 8px 0;
296
+ }
297
+
298
+ .badge {
299
+ font-family: var(--font-mono);
300
+ font-size: 9px;
301
+ font-weight: 700;
302
+ letter-spacing: 0.08em;
303
+ padding: 2px 7px;
304
+ border-radius: 99px;
305
+ }
306
+ .badge-green { background: rgba(52,211,153,0.12); color: var(--accent-green); border: 1px solid rgba(52,211,153,0.2); }
307
+ .badge-blue { background: rgba(96,165,250,0.12); color: var(--accent-blue); border: 1px solid rgba(96,165,250,0.2); }
308
+ .badge-cyan { background: rgba(0,212,255,0.10); color: var(--accent-cyan); border: 1px solid rgba(0,212,255,0.2); }
309
+
310
+ /* ── Big Stats ────────────────────────────────────────────────────── */
311
+ .big-stat {
312
+ font-family: var(--font-mono);
313
+ font-size: 15px;
314
+ font-weight: 600;
315
+ color: var(--text);
316
+ letter-spacing: 0.02em;
317
+ margin: 2px 0 2px;
318
+ }
319
+ .stat-sub {
320
+ font-size: 10px;
321
+ color: var(--text-dim);
322
+ letter-spacing: 0.05em;
323
+ }
324
+
325
+ /* ── Model rows ───────────────────────────────────────────────────── */
326
+ .model-row {
327
+ display: flex;
328
+ align-items: center;
329
+ gap: 8px;
330
+ margin-bottom: 8px;
331
+ }
332
+ .model-row:last-child { margin-bottom: 0; }
333
+
334
+ .model-icon {
335
+ font-size: 15px;
336
+ color: var(--accent-cyan);
337
+ flex-shrink: 0;
338
+ text-shadow: 0 0 8px var(--accent-cyan);
339
+ }
340
+ .model-icon.dim { color: var(--text-dim); text-shadow: none; }
341
+
342
+ .model-name {
343
+ font-family: var(--font-mono);
344
+ font-size: 12px;
345
+ color: var(--text);
346
+ }
347
+ .model-name.dim { color: var(--text-dim); }
348
+
349
+ .model-sub {
350
+ font-size: 10px;
351
+ color: var(--text-dim);
352
+ letter-spacing: 0.06em;
353
+ margin-top: 2px;
354
+ }
355
+
356
+ .active-model .model-name { color: var(--accent-cyan); }
357
+
358
+ /* ── Agent Status Orb ─────────────────────────────────────────────── */
359
+ .agent-status-panel { text-align: center; }
360
+
361
+ .aso-orb-wrap {
362
+ width: 120px;
363
+ height: 120px;
364
+ margin: 10px auto 14px;
365
+ }
366
+
367
+ .aso-svg {
368
+ width: 100%;
369
+ height: 100%;
370
+ overflow: visible;
371
+ }
372
+
373
+ /* Orbit guide tracks — faint rings */
374
+ .aso-track {
375
+ fill: none;
376
+ stroke: rgba(255,255,255,0.07);
377
+ stroke-width: 1;
378
+ }
379
+
380
+ /* Arc segments */
381
+ .aso-arc {
382
+ fill: none;
383
+ stroke: var(--aso-color);
384
+ stroke-width: 1.8;
385
+ stroke-linecap: round;
386
+ filter: drop-shadow(0 0 3px var(--aso-color));
387
+ }
388
+ .aso-arc-dim { opacity: 0.5; }
389
+
390
+ /* Core halo */
391
+ .aso-core-halo {
392
+ fill: var(--aso-color);
393
+ opacity: 0.12;
394
+ filter: blur(6px);
395
+ }
396
+
397
+ /* Core dot */
398
+ .aso-core {
399
+ fill: var(--aso-color);
400
+ filter: drop-shadow(0 0 5px var(--aso-color));
401
+ }
402
+
403
+ /* Rotation groups — transform-origin at SVG center (50,50) */
404
+ .aso-rot {
405
+ transform-box: fill-box;
406
+ transform-origin: center;
407
+ }
408
+
409
+ /* ── State: idle — slow cyan ── */
410
+ #agent-status-panel[data-state="idle"] { --aso-color: rgba(0,212,255,0.75); }
411
+ #agent-status-panel[data-state="idle"] .aso-rot1 { animation: aso-spin 8s linear infinite; }
412
+ #agent-status-panel[data-state="idle"] .aso-rot2 { animation: aso-spin 13s linear infinite reverse; }
413
+ #agent-status-panel[data-state="idle"] .aso-rot3 { animation: aso-spin 10s linear infinite; }
414
+ #agent-status-panel[data-state="idle"] .aso-rot4 { animation: aso-spin 17s linear infinite reverse; }
415
+ #agent-status-panel[data-state="idle"] .aso-rot5 { animation: aso-spin 12s linear infinite; }
416
+ #agent-status-panel[data-state="idle"] .aso-core { animation: aso-breathe 3.5s ease-in-out infinite; }
417
+
418
+ /* ── State: waiting — amber, a bit faster ── */
419
+ #agent-status-panel[data-state="waiting"] { --aso-color: #f59e0b; }
420
+ #agent-status-panel[data-state="waiting"] .aso-rot1 { animation: aso-spin 4s linear infinite; }
421
+ #agent-status-panel[data-state="waiting"] .aso-rot2 { animation: aso-spin 6s linear infinite reverse; }
422
+ #agent-status-panel[data-state="waiting"] .aso-rot3 { animation: aso-spin 5s linear infinite; }
423
+ #agent-status-panel[data-state="waiting"] .aso-rot4 { animation: aso-spin 9s linear infinite reverse; }
424
+ #agent-status-panel[data-state="waiting"] .aso-rot5 { animation: aso-spin 6s linear infinite; }
425
+ #agent-status-panel[data-state="waiting"] .aso-core { animation: aso-pulse 1s ease-in-out infinite; }
426
+
427
+ /* ── State: thinking — violet, fast spin ── */
428
+ #agent-status-panel[data-state="thinking"] { --aso-color: #a78bfa; }
429
+ #agent-status-panel[data-state="thinking"] .aso-rot1 { animation: aso-spin 1.1s linear infinite; }
430
+ #agent-status-panel[data-state="thinking"] .aso-rot2 { animation: aso-spin 0.7s linear infinite reverse; }
431
+ #agent-status-panel[data-state="thinking"] .aso-rot3 { animation: aso-spin 1.4s linear infinite; }
432
+ #agent-status-panel[data-state="thinking"] .aso-rot4 { animation: aso-spin 0.5s linear infinite reverse; }
433
+ #agent-status-panel[data-state="thinking"] .aso-rot5 { animation: aso-spin 1.8s linear infinite; }
434
+ #agent-status-panel[data-state="thinking"] .aso-core { animation: aso-pulse 0.45s ease-in-out infinite; }
435
+
436
+ /* ── State: streaming — green, medium flow ── */
437
+ #agent-status-panel[data-state="streaming"] { --aso-color: #34d399; }
438
+ #agent-status-panel[data-state="streaming"] .aso-rot1 { animation: aso-spin 2.2s linear infinite; }
439
+ #agent-status-panel[data-state="streaming"] .aso-rot2 { animation: aso-spin 3.5s linear infinite reverse; }
440
+ #agent-status-panel[data-state="streaming"] .aso-rot3 { animation: aso-spin 2.8s linear infinite; }
441
+ #agent-status-panel[data-state="streaming"] .aso-rot4 { animation: aso-spin 4.5s linear infinite reverse; }
442
+ #agent-status-panel[data-state="streaming"] .aso-rot5 { animation: aso-spin 3.2s linear infinite; }
443
+ #agent-status-panel[data-state="streaming"] .aso-core { animation: aso-pulse 0.7s ease-in-out infinite; }
444
+
445
+ /* ── State: done — brief flash, stays green ── */
446
+ #agent-status-panel[data-state="done"] { --aso-color: #34d399; }
447
+ #agent-status-panel[data-state="done"] .aso-rot1 { animation: aso-spin 0.4s linear infinite; }
448
+ #agent-status-panel[data-state="done"] .aso-rot2 { animation: aso-spin 0.3s linear infinite reverse; }
449
+ #agent-status-panel[data-state="done"] .aso-rot3 { animation: aso-spin 0.5s linear infinite; }
450
+ #agent-status-panel[data-state="done"] .aso-rot4 { animation: aso-spin 0.25s linear infinite reverse; }
451
+ #agent-status-panel[data-state="done"] .aso-rot5 { animation: aso-spin 0.6s linear infinite; }
452
+ #agent-status-panel[data-state="done"] .aso-core { animation: aso-flash 0.4s ease-out forwards; }
453
+
454
+ /* ERROR state — red/pink, irregular erratic pulse to signal distress */
455
+ #agent-status-panel[data-state="error"] { --aso-color: #f87171; }
456
+ #agent-status-panel[data-state="error"] .aso-rot1 { animation: aso-spin 2.1s linear infinite; }
457
+ #agent-status-panel[data-state="error"] .aso-rot2 { animation: aso-spin 1.4s linear infinite reverse; }
458
+ #agent-status-panel[data-state="error"] .aso-rot3 { animation: aso-spin 3.3s linear infinite; }
459
+ #agent-status-panel[data-state="error"] .aso-rot4 { animation: aso-spin 1.8s linear infinite reverse; }
460
+ #agent-status-panel[data-state="error"] .aso-rot5 { animation: aso-spin 2.7s linear infinite; }
461
+ #agent-status-panel[data-state="error"] .aso-core { animation: aso-error-pulse 0.6s ease-in-out infinite; }
462
+
463
+ @keyframes aso-error-pulse {
464
+ 0%, 100% { opacity: 1; transform: scale(1); }
465
+ 50% { opacity: 0.4; transform: scale(0.75); }
466
+ }
467
+
468
+ /* ── Run error bubble (failure message in the feed) ──────────────── */
469
+ .run-error-bubble {
470
+ display: flex;
471
+ align-items: flex-start;
472
+ gap: 10px;
473
+ background: rgba(248, 113, 113, 0.06) !important;
474
+ border-color: rgba(248, 113, 113, 0.25) !important;
475
+ }
476
+
477
+ .run-error-icon {
478
+ font-size: 15px;
479
+ flex-shrink: 0;
480
+ margin-top: 1px;
481
+ color: #f87171;
482
+ filter: drop-shadow(0 0 4px rgba(248,113,113,0.5));
483
+ }
484
+
485
+ .run-error-text {
486
+ color: #fca5a5 !important;
487
+ font-size: 13px;
488
+ line-height: 1.5;
489
+ }
490
+
491
+ /* Partial/failed stream bubble — dim to indicate incomplete */
492
+ .stream-failed {
493
+ opacity: 0.6;
494
+ border-color: rgba(248,113,113,0.2) !important;
495
+ }
496
+ .stream-failed::after {
497
+ content: ' [incomplete]';
498
+ font-size: 11px;
499
+ color: #f87171;
500
+ font-family: var(--font-mono);
501
+ opacity: 0.7;
502
+ }
503
+
504
+ /* ── Keyframes ── */
505
+ @keyframes aso-spin {
506
+ from { transform: rotate(0deg); }
507
+ to { transform: rotate(360deg); }
508
+ }
509
+ @keyframes aso-breathe {
510
+ 0%, 100% { transform: scale(1); opacity: 0.75; }
511
+ 50% { transform: scale(1.45); opacity: 1; }
512
+ }
513
+ @keyframes aso-pulse {
514
+ 0%, 100% { transform: scale(1); }
515
+ 50% { transform: scale(1.6); }
516
+ }
517
+ @keyframes aso-flash {
518
+ 0% { transform: scale(2.5); opacity: 1; }
519
+ 60% { transform: scale(1.2); opacity: 1; }
520
+ 100% { transform: scale(1); opacity: 1; }
521
+ }
522
+
523
+ /* ── Status label & sub-text ── */
524
+ .aso-label {
525
+ font-family: var(--font-mono);
526
+ font-size: 11px;
527
+ font-weight: 700;
528
+ letter-spacing: 0.22em;
529
+ color: var(--aso-color);
530
+ margin-bottom: 5px;
531
+ text-shadow: 0 0 8px var(--aso-color);
532
+ transition: color 0.4s ease, text-shadow 0.4s ease;
533
+ }
534
+ .aso-sub {
535
+ font-size: 10px;
536
+ color: var(--text-dim);
537
+ letter-spacing: 0.04em;
538
+ }
539
+
540
+ /* ── Layout columns ───────────────────────────────────────────────── */
541
+ .metrics-col {
542
+ position: fixed;
543
+ top: 24px;
544
+ bottom: 120px;
545
+ width: 360px;
546
+ display: flex;
547
+ flex-direction: column;
548
+ gap: 12px;
549
+ z-index: 10;
550
+ overflow-y: auto;
551
+ scrollbar-width: none;
552
+ padding-bottom: 8px;
553
+ }
554
+ .metrics-col::-webkit-scrollbar { display: none; }
555
+
556
+ /* Anchor panels adjacent to the centered 740px chat column, 16px gap */
557
+ .metrics-left { left: calc(50% - 370px - 16px - 360px); }
558
+ .metrics-right { right: calc(50% - 370px - 16px - 360px); }
559
+
560
+ /* ── Response Area ────────────────────────────────────────────────── */
561
+ .response-area {
562
+ position: fixed;
563
+ top: 0;
564
+ left: calc(50% - 370px);
565
+ right: calc(50% - 370px);
566
+ bottom: 150px;
567
+ z-index: 5;
568
+ display: flex;
569
+ flex-direction: column;
570
+ justify-content: flex-start;
571
+ padding: 32px 0 16px;
572
+ overflow-y: auto;
573
+ overflow-x: hidden;
574
+ pointer-events: none;
575
+ }
576
+
577
+ /* Constrain all response content to a readable column, centered */
578
+ .response-area > * {
579
+ width: 100%;
580
+ max-width: 740px;
581
+ margin-left: auto;
582
+ margin-right: auto;
583
+ flex-shrink: 0;
584
+ pointer-events: auto;
585
+ }
586
+
587
+ /* ── Message Bubbles ──────────────────────────────────────────────── */
588
+ .message {
589
+ pointer-events: auto;
590
+ width: 100%;
591
+ max-width: 740px;
592
+ margin-bottom: 16px;
593
+ animation: waterfall 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards;
594
+ opacity: 0;
595
+ transform: translateY(-20px);
596
+ /* Allow bubble to fit content — don't impose a forced width on the child */
597
+ display: block;
598
+ }
599
+
600
+ @keyframes waterfall {
601
+ to { opacity: 1; transform: translateY(0); }
602
+ }
603
+
604
+ .message.user-msg .bubble {
605
+ background: rgba(0,212,255,0.07);
606
+ border: 1px solid rgba(0,212,255,0.18);
607
+ border-radius: 12px 12px 4px 12px;
608
+ padding: 10px 14px;
609
+ display: inline-block;
610
+ float: right;
611
+ max-width: 75%;
612
+ backdrop-filter: blur(12px);
613
+ color: var(--text);
614
+ font-size: 14.5px;
615
+ clear: both;
616
+ }
617
+
618
+ .message.symi-msg .bubble {
619
+ background: var(--glass-bg);
620
+ border: 1px solid var(--glass-border);
621
+ border-radius: 4px 12px 12px 12px;
622
+ padding: 12px 16px;
623
+ backdrop-filter: var(--blur);
624
+ -webkit-backdrop-filter: var(--blur);
625
+ box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.04);
626
+ font-size: 14.5px;
627
+ line-height: 1.75;
628
+ color: var(--text);
629
+ position: relative;
630
+ clear: both;
631
+ display: inline-block;
632
+ width: fit-content;
633
+ max-width: 100%;
634
+ box-sizing: border-box;
635
+ overflow: visible;
636
+ }
637
+
638
+ .message.symi-msg .bubble::before {
639
+ content: '';
640
+ position: absolute;
641
+ top: 0; left: 0; right: 0;
642
+ height: 1px;
643
+ background: linear-gradient(90deg, transparent, rgba(0,212,255,0.3), transparent);
644
+ }
645
+
646
+ .message-clearfix { clear: both; }
647
+
648
+ .typing-cursor {
649
+ display: inline-block;
650
+ width: 2px;
651
+ height: 1em;
652
+ background: var(--accent-cyan);
653
+ margin-left: 2px;
654
+ vertical-align: text-bottom;
655
+ animation: blink 1s step-end infinite;
656
+ box-shadow: 0 0 4px var(--accent-cyan);
657
+ }
658
+ @keyframes blink {
659
+ 0%, 100% { opacity: 1; }
660
+ 50% { opacity: 0; }
661
+ }
662
+
663
+ /* ── Floating Prompt Bar ──────────────────────────────────────────── */
664
+ .prompt-wrap {
665
+ position: fixed;
666
+ bottom: 28px;
667
+ left: calc(50% - 370px);
668
+ right: calc(50% - 370px);
669
+ z-index: 20;
670
+ display: flex;
671
+ justify-content: center;
672
+ }
673
+
674
+ .prompt-bar {
675
+ width: 100%;
676
+ max-width: 720px;
677
+ display: flex;
678
+ flex-direction: column;
679
+ gap: 10px;
680
+ background: rgba(255,255,255,0.05);
681
+ backdrop-filter: blur(32px) saturate(200%);
682
+ -webkit-backdrop-filter: blur(32px) saturate(200%);
683
+ border: 1px solid rgba(255,255,255,0.12);
684
+ border-radius: 20px;
685
+ padding: 14px 16px 12px;
686
+ box-shadow:
687
+ 0 0 0 1px rgba(0,212,255,0.08),
688
+ 0 8px 40px rgba(0,0,0,0.6),
689
+ 0 0 60px rgba(0,212,255,0.04),
690
+ inset 0 1px 0 rgba(255,255,255,0.08);
691
+ transition: border-color 0.3s, box-shadow 0.3s;
692
+ cursor: text;
693
+ }
694
+
695
+ /* ── Prompt rows ──────────────────────────────────────────────────── */
696
+ .prompt-row-main {
697
+ display: flex;
698
+ align-items: center;
699
+ gap: 12px;
700
+ width: 100%;
701
+ }
702
+
703
+ .prompt-row-actions {
704
+ display: flex;
705
+ align-items: center;
706
+ justify-content: flex-end;
707
+ gap: 8px;
708
+ width: 100%;
709
+ padding-top: 2px;
710
+ border-top: 1px solid rgba(255,255,255,0.05);
711
+ }
712
+
713
+ .prompt-bar:focus-within {
714
+ border-color: rgba(0,212,255,0.3);
715
+ box-shadow:
716
+ 0 0 0 1px rgba(0,212,255,0.15),
717
+ 0 8px 40px rgba(0,0,0,0.6),
718
+ 0 0 80px rgba(0,212,255,0.08),
719
+ inset 0 1px 0 rgba(255,255,255,0.1);
720
+ }
721
+
722
+ .prompt-icon {
723
+ color: var(--accent-cyan);
724
+ opacity: 0.7;
725
+ flex-shrink: 0;
726
+ display: flex;
727
+ align-items: center;
728
+ filter: drop-shadow(0 0 4px var(--accent-cyan));
729
+ }
730
+
731
+ .prompt-bar input {
732
+ flex: 1;
733
+ background: transparent;
734
+ border: none;
735
+ outline: none;
736
+ color: var(--text);
737
+ font-family: var(--font);
738
+ font-size: 14px;
739
+ letter-spacing: 0.01em;
740
+ caret-color: var(--accent-cyan);
741
+ }
742
+
743
+ .prompt-bar input::placeholder {
744
+ color: var(--text-dim);
745
+ }
746
+
747
+ .send-btn {
748
+ background: rgba(0,212,255,0.12);
749
+ border: 1px solid rgba(0,212,255,0.2);
750
+ border-radius: 50%;
751
+ width: 32px;
752
+ height: 32px;
753
+ display: flex;
754
+ align-items: center;
755
+ justify-content: center;
756
+ color: var(--accent-cyan);
757
+ cursor: pointer;
758
+ flex-shrink: 0;
759
+ transition: background 0.2s, transform 0.15s, box-shadow 0.2s;
760
+ }
761
+
762
+ .send-btn:hover {
763
+ background: rgba(0,212,255,0.22);
764
+ box-shadow: 0 0 16px rgba(0,212,255,0.25);
765
+ transform: scale(1.05);
766
+ }
767
+
768
+ .send-btn:active {
769
+ transform: scale(0.95);
770
+ }
771
+
772
+ /* ── New Session Button ───────────────────────────────────────────── */
773
+ .prompt-divider {
774
+ width: 1px;
775
+ height: 18px;
776
+ background: rgba(255,255,255,0.08);
777
+ flex-shrink: 0;
778
+ }
779
+
780
+ .new-session-btn {
781
+ display: flex;
782
+ align-items: center;
783
+ gap: 5px;
784
+ background: rgba(139,92,246,0.1);
785
+ border: 1px solid rgba(139,92,246,0.2);
786
+ border-radius: 8px;
787
+ padding: 0 11px;
788
+ height: 28px;
789
+ color: rgba(139,92,246,0.85);
790
+ cursor: pointer;
791
+ flex-shrink: 0;
792
+ transition: background 0.2s, box-shadow 0.2s, transform 0.15s, opacity 0.2s;
793
+ }
794
+
795
+ .new-session-btn:hover {
796
+ background: rgba(139,92,246,0.2);
797
+ box-shadow: 0 0 16px rgba(139,92,246,0.2);
798
+ transform: scale(1.03);
799
+ }
800
+
801
+ .new-session-btn:active {
802
+ transform: scale(0.96);
803
+ }
804
+
805
+ .new-session-btn:disabled {
806
+ opacity: 0.3;
807
+ cursor: not-allowed;
808
+ transform: none;
809
+ }
810
+
811
+ .new-session-label {
812
+ font-family: var(--font-mono);
813
+ font-size: 11px;
814
+ letter-spacing: 0.08em;
815
+ font-weight: 600;
816
+ }
817
+
818
+ /* ── New Session Cleared State ───────────────────────────────────── */
819
+ .session-cleared {
820
+ display: flex;
821
+ flex-direction: column;
822
+ align-items: center;
823
+ justify-content: center;
824
+ gap: 10px;
825
+ padding: 60px 20px;
826
+ opacity: 0;
827
+ animation: session-cleared-in 0.5s ease forwards;
828
+ }
829
+
830
+ .session-cleared-icon {
831
+ font-size: 28px;
832
+ opacity: 0.3;
833
+ }
834
+
835
+ .session-cleared-text {
836
+ font-family: var(--font-mono);
837
+ font-size: 12px;
838
+ letter-spacing: 0.12em;
839
+ color: var(--text-dim);
840
+ opacity: 0.5;
841
+ }
842
+
843
+ @keyframes session-cleared-in {
844
+ from { opacity: 0; transform: translateY(8px); }
845
+ to { opacity: 1; transform: translateY(0); }
846
+ }
847
+
848
+ /* ── Thinking Bubble ──────────────────────────────────────────────── */
849
+ .thinking-bubble {
850
+ background: rgba(0,212,255,0.04) !important;
851
+ border-color: rgba(0,212,255,0.15) !important;
852
+ padding: 10px 16px !important;
853
+ }
854
+
855
+ .think-header {
856
+ display: flex;
857
+ align-items: center;
858
+ gap: 10px;
859
+ margin-bottom: 8px;
860
+ }
861
+
862
+ .think-badge {
863
+ font-family: var(--font-mono);
864
+ font-size: 9px;
865
+ font-weight: 700;
866
+ letter-spacing: 0.15em;
867
+ color: var(--accent-cyan);
868
+ text-shadow: 0 0 8px var(--accent-cyan);
869
+ }
870
+
871
+ .think-dots span {
872
+ display: inline-block;
873
+ color: var(--accent-cyan);
874
+ animation: dot-pulse 1.2s ease-in-out infinite;
875
+ font-size: 14px;
876
+ opacity: 0;
877
+ }
878
+ .think-dots span:nth-child(1) { animation-delay: 0s; }
879
+ .think-dots span:nth-child(2) { animation-delay: 0.2s; }
880
+ .think-dots span:nth-child(3) { animation-delay: 0.4s; }
881
+
882
+ @keyframes dot-pulse {
883
+ 0%, 100% { opacity: 0; transform: translateY(0); }
884
+ 50% { opacity: 1; transform: translateY(-3px); }
885
+ }
886
+
887
+ .think-bar-wrap {
888
+ height: 2px;
889
+ background: rgba(255,255,255,0.06);
890
+ border-radius: 99px;
891
+ overflow: hidden;
892
+ }
893
+
894
+ .think-bar {
895
+ height: 100%;
896
+ width: 0%;
897
+ background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
898
+ border-radius: 99px;
899
+ animation: think-scan 1s ease-in-out infinite;
900
+ }
901
+
902
+ @keyframes think-scan {
903
+ 0% { width: 0%; margin-left: 0%; opacity: 1; }
904
+ 50% { width: 60%; margin-left: 20%; opacity: 1; }
905
+ 100% { width: 0%; margin-left: 100%; opacity: 0; }
906
+ }
907
+
908
+ /* ── Streaming Bubble ─────────────────────────────────────────────── */
909
+ .stream-bubble {
910
+ position: relative;
911
+ }
912
+
913
+ .stream-bubble.streaming {
914
+ width: 100% !important;
915
+ border-color: rgba(0,212,255,0.25) !important;
916
+ box-shadow:
917
+ 0 8px 32px rgba(0,0,0,0.5),
918
+ 0 0 20px rgba(0,212,255,0.06),
919
+ inset 0 1px 0 rgba(255,255,255,0.06) !important;
920
+ animation: stream-pulse 1.8s ease-in-out infinite;
921
+ }
922
+
923
+ @keyframes stream-pulse {
924
+ 0%, 100% { box-shadow: 0 8px 32px rgba(0,0,0,0.5), 0 0 20px rgba(0,212,255,0.06), inset 0 1px 0 rgba(255,255,255,0.06); }
925
+ 50% { box-shadow: 0 8px 32px rgba(0,0,0,0.5), 0 0 40px rgba(0,212,255,0.12), inset 0 1px 0 rgba(255,255,255,0.06); }
926
+ }
927
+
928
+ .stream-bubble.streaming::after {
929
+ content: '';
930
+ position: absolute;
931
+ top: 0; left: 0; right: 0;
932
+ height: 1px;
933
+ background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
934
+ opacity: 0.6;
935
+ animation: top-scan 2s linear infinite;
936
+ }
937
+
938
+ @keyframes top-scan {
939
+ 0% { transform: scaleX(0); transform-origin: left; opacity: 0.8; }
940
+ 50% { transform: scaleX(1); transform-origin: left; opacity: 0.6; }
941
+ 100% { transform: scaleX(0); transform-origin: right; opacity: 0; }
942
+ }
943
+
944
+ .stream-bubble.done {
945
+ width: fit-content;
946
+ max-width: 100%;
947
+ border-color: rgba(255,255,255,0.1) !important;
948
+ transition: border-color 0.8s, box-shadow 0.8s, width 0.3s ease;
949
+ }
950
+
951
+ /* ── Character spawn animation ────────────────────────────────────── */
952
+ .char-spawn {
953
+ display: inline;
954
+ color: transparent;
955
+ text-shadow: none;
956
+ transition: color 0.12s ease, text-shadow 0.2s ease;
957
+ }
958
+
959
+ .char-spawn.char-visible {
960
+ color: var(--text);
961
+ text-shadow: 0 0 8px rgba(0,212,255,0.4);
962
+ animation: char-settle 0.4s ease forwards;
963
+ }
964
+
965
+ @keyframes char-settle {
966
+ 0% { color: var(--accent-cyan); text-shadow: 0 0 12px var(--accent-cyan), 0 0 24px rgba(0,212,255,0.3); }
967
+ 40% { color: rgba(200,240,255,0.95); text-shadow: 0 0 6px rgba(0,212,255,0.2); }
968
+ 100% { color: var(--text); text-shadow: none; }
969
+ }
970
+
971
+ /* ── Telemetry footer ─────────────────────────────────────────────── */
972
+ .telemetry {
973
+ display: flex;
974
+ align-items: center;
975
+ gap: 6px;
976
+ margin-top: 10px;
977
+ padding-top: 8px;
978
+ border-top: 1px solid rgba(255,255,255,0.05);
979
+ opacity: 0;
980
+ transform: translateY(4px);
981
+ transition: opacity 0.5s ease 0.2s, transform 0.5s ease 0.2s;
982
+ }
983
+
984
+ .telemetry.tele-visible {
985
+ opacity: 1;
986
+ transform: translateY(0);
987
+ }
988
+
989
+ .tele-item {
990
+ font-family: var(--font-mono);
991
+ font-size: 9px;
992
+ color: var(--text-dim);
993
+ letter-spacing: 0.06em;
994
+ }
995
+
996
+ .tele-sep {
997
+ color: rgba(255,255,255,0.12);
998
+ font-size: 9px;
999
+ }
1000
+
1001
+ /* ── Send button loading state ────────────────────────────────────── */
1002
+ .send-btn.btn-loading {
1003
+ animation: btn-spin 1s linear infinite;
1004
+ }
1005
+ @keyframes btn-spin {
1006
+ to { transform: rotate(360deg); }
1007
+ }
1008
+
1009
+ /* ── Connection status ────────────────────────────────────────────── */
1010
+ .conn-status {
1011
+ position: fixed;
1012
+ top: 16px;
1013
+ left: 50%;
1014
+ transform: translateX(-50%);
1015
+ z-index: 30;
1016
+ display: flex;
1017
+ align-items: center;
1018
+ gap: 7px;
1019
+ background: var(--glass-bg);
1020
+ backdrop-filter: var(--blur);
1021
+ -webkit-backdrop-filter: var(--blur);
1022
+ border: 1px solid var(--glass-border);
1023
+ border-radius: 99px;
1024
+ padding: 5px 12px;
1025
+ pointer-events: none;
1026
+ }
1027
+
1028
+ .conn-label {
1029
+ font-family: var(--font-mono);
1030
+ font-size: 9px;
1031
+ letter-spacing: 0.1em;
1032
+ color: var(--text-dim);
1033
+ }
1034
+
1035
+ .dot-red { background: #f87171; box-shadow: 0 0 6px #f87171; }
1036
+
1037
+ /* ── UI Toggle button ─────────────────────────────────────────────── */
1038
+ .ui-toggle {
1039
+ position: fixed;
1040
+ top: 16px;
1041
+ right: 24px;
1042
+ z-index: 30;
1043
+ display: flex;
1044
+ align-items: center;
1045
+ gap: 7px;
1046
+ background: var(--glass-bg);
1047
+ backdrop-filter: var(--blur);
1048
+ -webkit-backdrop-filter: var(--blur);
1049
+ border: 1px solid var(--glass-border);
1050
+ border-radius: 99px;
1051
+ padding: 6px 14px;
1052
+ color: var(--text-muted);
1053
+ font-size: 11px;
1054
+ font-family: var(--font-mono);
1055
+ letter-spacing: 0.05em;
1056
+ text-decoration: none;
1057
+ transition: border-color 0.2s, color 0.2s, box-shadow 0.2s;
1058
+ }
1059
+
1060
+ .ui-toggle:hover {
1061
+ border-color: var(--glass-border-strong);
1062
+ color: var(--text);
1063
+ box-shadow: 0 0 16px rgba(0,212,255,0.08);
1064
+ }
1065
+
1066
+ /* ── Scrollbar ────────────────────────────────────────────────────── */
1067
+ .response-area::-webkit-scrollbar { display: none; }
1068
+ .response-area { scrollbar-width: none; }
1069
+
1070
+ /* ═══════════════════════════════════════════════════════════════════
1071
+ CONTENT TYPES — Markdown, Thinking, Tool Cards, Code
1072
+ ═══════════════════════════════════════════════════════════════════ */
1073
+
1074
+ /* ── Markdown prose ────────────────────────────────────────────────── */
1075
+ .msg-text {
1076
+ font-size: 14.5px;
1077
+ line-height: 1.75;
1078
+ color: var(--text);
1079
+ word-wrap: break-word;
1080
+ overflow-wrap: anywhere;
1081
+ word-break: break-word;
1082
+ }
1083
+
1084
+ /* Paragraph spacing */
1085
+ .msg-text :where(p, ul, ol, pre, blockquote, table) { margin: 0; }
1086
+ .msg-text :where(p + p,
1087
+ p + ul, p + ol, p + pre, p + blockquote, p + table,
1088
+ ul + p, ol + p, pre + p, blockquote + p, table + p) { margin-top: 0.75em; }
1089
+ .msg-text :where(li + li) { margin-top: 0.25em; }
1090
+
1091
+ /* Headings */
1092
+ .msg-text :where(h1, h2, h3, h4, h5, h6) {
1093
+ font-weight: 600;
1094
+ line-height: 1.3;
1095
+ color: rgba(255,255,255,0.96);
1096
+ margin: 1.1em 0 0.4em;
1097
+ }
1098
+ .msg-text :where(h1) { font-size: 1.35em; border-bottom: 1px solid var(--glass-border); padding-bottom: 0.3em; }
1099
+ .msg-text :where(h2) { font-size: 1.18em; border-bottom: 1px solid rgba(255,255,255,0.05); padding-bottom: 0.2em; }
1100
+ .msg-text :where(h3) { font-size: 1.06em; }
1101
+ .msg-text :where(h4, h5, h6) { font-size: 1em; color: rgba(255,255,255,0.8); }
1102
+ .msg-text :where(h1, h2, h3, h4, h5, h6):first-child { margin-top: 0.3em; }
1103
+
1104
+ /* Lists */
1105
+ .msg-text :where(ul, ol) { padding-left: 1.4em; }
1106
+ .msg-text :where(ul) { list-style-type: disc; }
1107
+ .msg-text :where(ol) { list-style-type: decimal; }
1108
+ .msg-text :where(ul ul) { list-style-type: circle; margin-top: 0.25em; }
1109
+
1110
+ /* Text formatting */
1111
+ .msg-text :where(strong) { font-weight: 600; color: rgba(255,255,255,0.97); }
1112
+ .msg-text :where(em) { font-style: italic; color: rgba(255,255,255,0.82); }
1113
+ .msg-text :where(del) { text-decoration: line-through; opacity: 0.6; }
1114
+ .msg-text :where(mark) { background: rgba(251,191,36,0.2); color: #fbbf24; border-radius: 2px; padding: 0 3px; }
1115
+ .msg-text :where(sup) { font-size: 0.75em; vertical-align: super; }
1116
+ .msg-text :where(sub) { font-size: 0.75em; vertical-align: sub; }
1117
+
1118
+ /* Links */
1119
+ .msg-text :where(a) { color: var(--accent-cyan); text-decoration: none; border-bottom: 1px solid rgba(0,212,255,0.3); }
1120
+ .msg-text :where(a:hover) { border-bottom-color: var(--accent-cyan); }
1121
+
1122
+ /* Horizontal rule */
1123
+ .msg-text :where(hr) {
1124
+ border: none;
1125
+ border-top: 1px solid var(--glass-border);
1126
+ margin: 1em 0;
1127
+ }
1128
+
1129
+ /* Blockquote */
1130
+ .msg-text :where(blockquote) {
1131
+ border-left: 2px solid rgba(0,212,255,0.3);
1132
+ margin: 0.6em 0;
1133
+ padding: 6px 14px;
1134
+ background: rgba(0,212,255,0.03);
1135
+ color: var(--text-muted);
1136
+ border-radius: 0 6px 6px 0;
1137
+ }
1138
+ .msg-text :where(blockquote blockquote) {
1139
+ border-left-color: rgba(139,92,246,0.4);
1140
+ background: rgba(139,92,246,0.03);
1141
+ margin-top: 6px;
1142
+ }
1143
+
1144
+ /* ── Tables ─────────────────────────────────────────────────────────── */
1145
+ .msg-text :where(table) {
1146
+ width: 100%;
1147
+ border-collapse: collapse;
1148
+ font-size: 13px;
1149
+ margin-top: 0.75em;
1150
+ border: 1px solid var(--glass-border);
1151
+ border-radius: 8px;
1152
+ overflow: hidden;
1153
+ }
1154
+
1155
+ .msg-text :where(thead) {
1156
+ background: rgba(0,212,255,0.06);
1157
+ }
1158
+
1159
+ .msg-text :where(th) {
1160
+ font-family: var(--font-mono);
1161
+ font-size: 10.5px;
1162
+ font-weight: 600;
1163
+ letter-spacing: 0.08em;
1164
+ text-transform: uppercase;
1165
+ color: var(--accent-cyan);
1166
+ border: 1px solid var(--glass-border);
1167
+ padding: 8px 12px;
1168
+ text-align: left;
1169
+ background: rgba(0,0,0,0.15);
1170
+ }
1171
+
1172
+ .msg-text :where(td) {
1173
+ border: 1px solid var(--glass-border);
1174
+ padding: 7px 12px;
1175
+ vertical-align: top;
1176
+ color: var(--text);
1177
+ line-height: 1.5;
1178
+ }
1179
+
1180
+ .msg-text :where(tr:nth-child(even) td) {
1181
+ background: rgba(255,255,255,0.015);
1182
+ }
1183
+
1184
+ .msg-text :where(tr:hover td) {
1185
+ background: rgba(0,212,255,0.03);
1186
+ }
1187
+
1188
+ /* ── Inline code ────────────────────────────────────────────────────── */
1189
+ .inline-code,
1190
+ .msg-text :where(:not(pre) > code) {
1191
+ font-family: var(--font-mono);
1192
+ font-size: 0.875em;
1193
+ background: rgba(255,255,255,0.08);
1194
+ border: 1px solid rgba(255,255,255,0.1);
1195
+ border-radius: 4px;
1196
+ padding: 0.1em 0.4em;
1197
+ color: var(--accent-cyan);
1198
+ }
1199
+
1200
+ /* ── Code blocks — full-featured ────────────────────────────────────── */
1201
+ .code-block {
1202
+ margin: 0.75em 0;
1203
+ border: 1px solid var(--glass-border);
1204
+ border-radius: 10px;
1205
+ overflow: hidden;
1206
+ background: rgba(0,0,0,0.45);
1207
+ font-family: var(--font-mono);
1208
+ }
1209
+
1210
+ /* Full-width breakout — code gets the whole column regardless of bubble */
1211
+ .code-block-full {
1212
+ width: 100%;
1213
+ max-width: 100%;
1214
+ }
1215
+
1216
+ /* ── Header ── */
1217
+ .code-header {
1218
+ display: flex;
1219
+ align-items: center;
1220
+ justify-content: space-between;
1221
+ padding: 7px 12px;
1222
+ background: rgba(255,255,255,0.04);
1223
+ border-bottom: 1px solid var(--glass-border);
1224
+ gap: 10px;
1225
+ }
1226
+
1227
+ .code-header-left { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
1228
+ .code-header-right { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
1229
+
1230
+ /* Language badge with per-language color */
1231
+ .code-lang-badge {
1232
+ font-family: var(--font-mono);
1233
+ font-size: 10px;
1234
+ font-weight: 700;
1235
+ letter-spacing: 0.06em;
1236
+ text-transform: uppercase;
1237
+ color: var(--lang-color, var(--accent-cyan));
1238
+ display: flex;
1239
+ align-items: center;
1240
+ gap: 2px;
1241
+ flex-shrink: 0;
1242
+ text-shadow: 0 0 8px var(--lang-color, var(--accent-cyan));
1243
+ }
1244
+
1245
+ /* Filename */
1246
+ .code-filename {
1247
+ font-family: var(--font-mono);
1248
+ font-size: 11px;
1249
+ color: var(--text-muted);
1250
+ background: rgba(255,255,255,0.05);
1251
+ border: 1px solid var(--glass-border);
1252
+ border-radius: 4px;
1253
+ padding: 1px 7px;
1254
+ white-space: nowrap;
1255
+ overflow: hidden;
1256
+ text-overflow: ellipsis;
1257
+ max-width: 200px;
1258
+ }
1259
+
1260
+ /* Line count */
1261
+ .code-lines-count {
1262
+ font-family: var(--font-mono);
1263
+ font-size: 9.5px;
1264
+ color: var(--text-dim);
1265
+ white-space: nowrap;
1266
+ }
1267
+
1268
+ /* Expand button */
1269
+ .code-expand-btn {
1270
+ font-size: 14px;
1271
+ background: transparent;
1272
+ border: none;
1273
+ color: var(--text-dim);
1274
+ cursor: pointer;
1275
+ padding: 0 4px;
1276
+ line-height: 1;
1277
+ transition: color 0.2s;
1278
+ }
1279
+ .code-expand-btn:hover { color: var(--text); }
1280
+
1281
+ /* Copy button */
1282
+ .code-copy {
1283
+ display: flex;
1284
+ align-items: center;
1285
+ gap: 5px;
1286
+ font-family: var(--font-mono);
1287
+ font-size: 10px;
1288
+ color: var(--text-dim);
1289
+ background: transparent;
1290
+ border: none;
1291
+ cursor: pointer;
1292
+ padding: 3px 8px;
1293
+ border-radius: 4px;
1294
+ transition: color 0.2s, background 0.2s;
1295
+ white-space: nowrap;
1296
+ }
1297
+ .code-copy:hover { color: var(--text); background: rgba(255,255,255,0.06); }
1298
+ .code-copy.copied { color: var(--accent-green); }
1299
+
1300
+ /* ── Code body ── */
1301
+ .code-body { overflow: hidden; }
1302
+ .code-body-collapsed { max-height: 400px; overflow: hidden; position: relative; }
1303
+ .code-body-collapsed::after {
1304
+ content: '';
1305
+ position: absolute;
1306
+ bottom: 0; left: 0; right: 0;
1307
+ height: 80px;
1308
+ background: linear-gradient(to bottom, transparent, rgba(0,0,0,0.8));
1309
+ pointer-events: none;
1310
+ }
1311
+ .code-expanded .code-body-collapsed { max-height: none; overflow: auto; }
1312
+ .code-expanded .code-body-collapsed::after { display: none; }
1313
+
1314
+ /* Show more button */
1315
+ .code-show-more {
1316
+ display: block;
1317
+ width: 100%;
1318
+ padding: 8px;
1319
+ background: rgba(255,255,255,0.03);
1320
+ border: none;
1321
+ border-top: 1px solid var(--glass-border);
1322
+ color: var(--text-dim);
1323
+ font-family: var(--font-mono);
1324
+ font-size: 10px;
1325
+ cursor: pointer;
1326
+ letter-spacing: 0.06em;
1327
+ transition: background 0.2s, color 0.2s;
1328
+ text-align: center;
1329
+ }
1330
+ .code-show-more:hover { background: rgba(255,255,255,0.06); color: var(--text); }
1331
+
1332
+ /* ── Line numbers ── */
1333
+ .code-pre {
1334
+ margin: 0;
1335
+ padding: 12px 0;
1336
+ overflow-x: auto;
1337
+ font-size: 12.5px;
1338
+ line-height: 1.65;
1339
+ }
1340
+
1341
+ .code-numbered { display: block; }
1342
+
1343
+ .code-line {
1344
+ display: flex;
1345
+ min-height: 1.65em;
1346
+ }
1347
+
1348
+ .code-line:hover { background: rgba(255,255,255,0.03); }
1349
+
1350
+ .line-num {
1351
+ display: inline-block;
1352
+ min-width: 44px;
1353
+ padding: 0 12px 0 14px;
1354
+ color: rgba(255,255,255,0.2);
1355
+ text-align: right;
1356
+ user-select: none;
1357
+ border-right: 1px solid rgba(255,255,255,0.06);
1358
+ flex-shrink: 0;
1359
+ font-size: 11px;
1360
+ line-height: inherit;
1361
+ }
1362
+
1363
+ .line-content {
1364
+ display: inline-block;
1365
+ padding: 0 16px;
1366
+ white-space: pre;
1367
+ flex: 1;
1368
+ }
1369
+
1370
+ .hljs { background: transparent !important; padding: 0 !important; }
1371
+
1372
+ /* ── Thinking block ─────────────────────────────────────────────────── */
1373
+ .msg-thinking { margin: 4px 0 8px; }
1374
+
1375
+ .thinking-toggle {
1376
+ display: flex;
1377
+ align-items: center;
1378
+ gap: 7px;
1379
+ background: transparent;
1380
+ border: none;
1381
+ cursor: pointer;
1382
+ padding: 4px 0;
1383
+ color: var(--text-dim);
1384
+ font-size: 11px;
1385
+ font-family: var(--font-mono);
1386
+ letter-spacing: 0.05em;
1387
+ transition: color 0.2s;
1388
+ }
1389
+ .thinking-toggle:hover { color: var(--text-muted); }
1390
+ .thinking-icon { color: var(--accent-purple); }
1391
+ .thinking-chevron { font-size: 9px; transition: transform 0.2s; }
1392
+
1393
+ .thinking-body {
1394
+ max-height: 0;
1395
+ overflow: hidden;
1396
+ transition: max-height 0.35s ease;
1397
+ }
1398
+ .thinking-body.thinking-open { max-height: 600px; overflow-y: auto; }
1399
+
1400
+ .thinking-text {
1401
+ margin-top: 6px;
1402
+ padding: 10px 14px;
1403
+ border: 1px dashed rgba(139,92,246,0.25);
1404
+ border-radius: 8px;
1405
+ background: rgba(139,92,246,0.04);
1406
+ font-size: 12px;
1407
+ line-height: 1.65;
1408
+ color: var(--text-muted);
1409
+ white-space: pre-wrap;
1410
+ font-family: var(--font-mono);
1411
+ }
1412
+
1413
+ /* ── Tool call card ─────────────────────────────────────────────────── */
1414
+ .msg-tool-card {
1415
+ margin: 4px 0;
1416
+ border: 1px solid var(--glass-border);
1417
+ border-radius: 8px;
1418
+ overflow: hidden;
1419
+ background: rgba(255,255,255,0.02);
1420
+ }
1421
+
1422
+ .tool-header {
1423
+ display: flex;
1424
+ align-items: center;
1425
+ gap: 8px;
1426
+ width: 100%;
1427
+ padding: 8px 12px;
1428
+ background: transparent;
1429
+ border: none;
1430
+ cursor: pointer;
1431
+ text-align: left;
1432
+ color: var(--text-muted);
1433
+ font-size: 12px;
1434
+ transition: background 0.2s;
1435
+ }
1436
+ .tool-header:hover { background: rgba(255,255,255,0.03); }
1437
+ .tool-icon { font-size: 13px; flex-shrink: 0; }
1438
+ .tool-name { flex: 1; font-family: var(--font-mono); font-size: 11px; color: var(--text); }
1439
+ .tool-chevron { font-size: 9px; color: var(--text-dim); }
1440
+
1441
+ .tool-body {
1442
+ max-height: 0;
1443
+ overflow: hidden;
1444
+ transition: max-height 0.3s ease;
1445
+ border-top: 0 solid var(--glass-border);
1446
+ }
1447
+ .tool-body.tool-open { max-height: 320px; overflow-y: auto; border-top-width: 1px; }
1448
+
1449
+ .tool-input {
1450
+ margin: 0;
1451
+ padding: 10px 14px;
1452
+ font-family: var(--font-mono);
1453
+ font-size: 11.5px;
1454
+ line-height: 1.5;
1455
+ color: var(--text-muted);
1456
+ white-space: pre-wrap;
1457
+ word-break: break-all;
1458
+ background: rgba(0,0,0,0.25);
1459
+ }
1460
+
1461
+ /* ── Tool result ────────────────────────────────────────────────────── */
1462
+ .msg-tool-result {
1463
+ margin: 2px 0 6px;
1464
+ border: 1px solid rgba(52,211,153,0.14);
1465
+ border-radius: 8px;
1466
+ overflow: hidden;
1467
+ background: rgba(52,211,153,0.02);
1468
+ }
1469
+
1470
+ .result-header {
1471
+ display: flex;
1472
+ align-items: center;
1473
+ gap: 8px;
1474
+ padding: 6px 12px;
1475
+ font-size: 11px;
1476
+ color: var(--text-dim);
1477
+ }
1478
+ .result-icon { color: var(--accent-green); font-size: 12px; }
1479
+ .result-label { font-family: var(--font-mono); letter-spacing: 0.06em; flex: 1; }
1480
+
1481
+ .result-expand {
1482
+ font-family: var(--font-mono);
1483
+ font-size: 9px;
1484
+ background: transparent;
1485
+ border: 1px solid var(--glass-border);
1486
+ border-radius: 4px;
1487
+ color: var(--text-dim);
1488
+ cursor: pointer;
1489
+ padding: 2px 8px;
1490
+ transition: color 0.2s;
1491
+ }
1492
+ .result-expand:hover { color: var(--text); }
1493
+
1494
+ .result-preview { max-height: 0; overflow: hidden; transition: max-height 0.3s ease; border-top: 0 solid rgba(52,211,153,0.14); }
1495
+ .result-open { max-height: 260px; overflow-y: auto; border-top-width: 1px; }
1496
+
1497
+ .result-text {
1498
+ margin: 0;
1499
+ padding: 8px 14px;
1500
+ font-family: var(--font-mono);
1501
+ font-size: 11.5px;
1502
+ line-height: 1.5;
1503
+ color: var(--text-muted);
1504
+ white-space: pre-wrap;
1505
+ word-break: break-all;
1506
+ background: rgba(0,0,0,0.2);
1507
+ }
1508
+
1509
+ /* ── Message image ──────────────────────────────────────────────────── */
1510
+ .msg-image img {
1511
+ max-width: 100%;
1512
+ border-radius: 8px;
1513
+ border: 1px solid var(--glass-border);
1514
+ margin: 4px 0;
1515
+ }
1516
+
1517
+ /* ── Copy button ────────────────────────────────────────────────────── */
1518
+ .msg-copy-btn {
1519
+ position: absolute;
1520
+ top: 8px;
1521
+ right: 8px;
1522
+ background: rgba(255,255,255,0.06);
1523
+ border: 1px solid var(--glass-border);
1524
+ border-radius: 6px;
1525
+ color: var(--text-dim);
1526
+ cursor: pointer;
1527
+ padding: 5px 6px;
1528
+ opacity: 0;
1529
+ transition: opacity 0.2s, color 0.2s, background 0.2s;
1530
+ display: flex;
1531
+ align-items: center;
1532
+ line-height: 1;
1533
+ }
1534
+ .stream-bubble:hover .msg-copy-btn,
1535
+ .msg-copy-visible { opacity: 1; }
1536
+ .msg-copy-btn:hover { color: var(--text); background: rgba(255,255,255,0.1); }
1537
+ .msg-copy-btn.copied { color: var(--accent-green); }
1538
+
1539
+ /* ── Timestamp ──────────────────────────────────────────────────────── */
1540
+ .msg-timestamp {
1541
+ font-family: var(--font-mono);
1542
+ font-size: 9.5px;
1543
+ color: var(--text-dim);
1544
+ margin-top: 10px;
1545
+ letter-spacing: 0.05em;
1546
+ }
1547
+
1548
+
1549
+ /* ── Task lists ─────────────────────────────────────────────────────── */
1550
+ .msg-text :where(li.task-item) {
1551
+ list-style: none;
1552
+ margin-left: -1.4em;
1553
+ padding-left: 0.2em;
1554
+ display: flex;
1555
+ align-items: baseline;
1556
+ gap: 7px;
1557
+ }
1558
+
1559
+ .task-cb {
1560
+ appearance: none;
1561
+ -webkit-appearance: none;
1562
+ width: 14px;
1563
+ height: 14px;
1564
+ border: 1.5px solid var(--glass-border-strong);
1565
+ border-radius: 3px;
1566
+ background: transparent;
1567
+ flex-shrink: 0;
1568
+ position: relative;
1569
+ top: 2px;
1570
+ cursor: default;
1571
+ }
1572
+
1573
+ .task-cb:checked {
1574
+ background: var(--accent-cyan);
1575
+ border-color: var(--accent-cyan);
1576
+ }
1577
+
1578
+ .task-cb:checked::after {
1579
+ content: '';
1580
+ position: absolute;
1581
+ top: 1px; left: 3px;
1582
+ width: 5px; height: 8px;
1583
+ border: 2px solid #000;
1584
+ border-top: none;
1585
+ border-left: none;
1586
+ transform: rotate(45deg);
1587
+ }
1588
+
1589
+ .task-done > * { opacity: 0.55; }
1590
+ .task-done .task-cb + span,
1591
+ .task-done .task-cb ~ * { text-decoration: line-through; }
1592
+
1593
+ /* ── Table overflow wrapper ──────────────────────────────────────────── */
1594
+ .msg-text :where(table) {
1595
+ display: block;
1596
+ overflow-x: auto;
1597
+ white-space: nowrap;
1598
+ }
1599
+ /* Allow cells to wrap when content isn't too wide */
1600
+ .msg-text :where(th, td) {
1601
+ white-space: normal;
1602
+ min-width: 80px;
1603
+ }
1604
+
1605
+ /* ── Details / Summary (collapsible sections) ─────────────────────────── */
1606
+ .msg-text :where(details) {
1607
+ border: 1px solid var(--glass-border);
1608
+ border-radius: 8px;
1609
+ padding: 0;
1610
+ margin: 0.6em 0;
1611
+ overflow: hidden;
1612
+ background: rgba(255,255,255,0.02);
1613
+ }
1614
+
1615
+ .msg-text :where(summary) {
1616
+ padding: 8px 14px;
1617
+ cursor: pointer;
1618
+ font-weight: 600;
1619
+ font-size: 13px;
1620
+ color: var(--text-muted);
1621
+ list-style: none;
1622
+ display: flex;
1623
+ align-items: center;
1624
+ gap: 8px;
1625
+ user-select: none;
1626
+ transition: background 0.2s;
1627
+ }
1628
+ .msg-text :where(summary):hover { background: rgba(255,255,255,0.03); }
1629
+ .msg-text :where(summary)::before {
1630
+ content: '▸';
1631
+ font-size: 9px;
1632
+ color: var(--accent-cyan);
1633
+ transition: transform 0.2s;
1634
+ }
1635
+ .msg-text :where(details[open] summary)::before {
1636
+ transform: rotate(90deg);
1637
+ }
1638
+ .msg-text :where(details) > *:not(summary) {
1639
+ padding: 0 14px 10px;
1640
+ }
1641
+
1642
+ /* ── Spacing improvements ────────────────────────────────────────────── */
1643
+ .bubble-content + .bubble-content { margin-top: 0.5em; }
1644
+
1645
+ .msg-text :where(h1 + p, h2 + p, h3 + p) { margin-top: 0.4em; }
1646
+ .msg-text :where(p:last-child, ul:last-child, ol:last-child) { margin-bottom: 0; }
1647
+
1648
+ /* Separator after heading when followed by block content */
1649
+ .msg-text :where(h2, h3) {
1650
+ padding-top: 0.3em;
1651
+ }
1652
+
1653
+ /* Better nested list indent */
1654
+ .msg-text :where(ul ul, ol ol, ul ol, ol ul) {
1655
+ margin-top: 0.25em;
1656
+ margin-bottom: 0.25em;
1657
+ padding-left: 1.2em;
1658
+ }
1659
+
1660
+ /* ── Keyboard shortcut styling ───────────────────────────────────────── */
1661
+ .msg-text :where(kbd) {
1662
+ font-family: var(--font-mono);
1663
+ font-size: 0.8em;
1664
+ background: rgba(255,255,255,0.1);
1665
+ border: 1px solid rgba(255,255,255,0.2);
1666
+ border-bottom: 2px solid rgba(255,255,255,0.15);
1667
+ border-radius: 4px;
1668
+ padding: 1px 5px;
1669
+ color: var(--text);
1670
+ }
1671
+
1672
+ /* ── Abbr tooltip ────────────────────────────────────────────────────── */
1673
+ .msg-text :where(abbr[title]) {
1674
+ border-bottom: 1px dotted var(--text-muted);
1675
+ cursor: help;
1676
+ text-decoration: none;
1677
+ }
1678
+
1679
+ /* ── Scrollbar ────────────────────────────────────────────────────── */
1680
+ .response-area::-webkit-scrollbar { display: none; }
1681
+ .response-area { scrollbar-width: none; }
1682
+
1683
+ /* ══════════════════════════════════════════════════════════════════════
1684
+ COMMAND MENU SYSTEM
1685
+ ══════════════════════════════════════════════════════════════════════ */
1686
+
1687
+ /* ── Group accent colours ─────────────────────────────────────────── */
1688
+ :root {
1689
+ --cmd-chat: #00d4ff;
1690
+ --cmd-control: #60a5fa;
1691
+ --cmd-agent: #a78bfa;
1692
+ --cmd-settings: #f59e0b;
1693
+ --cmd-resources: #34d399;
1694
+ }
1695
+
1696
+ /* ── Menu Trigger Button ──────────────────────────────────────────── */
1697
+ .menu-trigger {
1698
+ position: fixed;
1699
+ top: 20px;
1700
+ left: 20px;
1701
+ z-index: 50;
1702
+ width: 38px;
1703
+ height: 38px;
1704
+ display: flex;
1705
+ align-items: center;
1706
+ justify-content: center;
1707
+ background: var(--glass-bg);
1708
+ backdrop-filter: var(--blur);
1709
+ -webkit-backdrop-filter: var(--blur);
1710
+ border: 1px solid var(--glass-border);
1711
+ border-radius: 10px;
1712
+ color: var(--text-muted);
1713
+ cursor: pointer;
1714
+ transition: color 0.2s, border-color 0.2s, box-shadow 0.2s, transform 0.2s;
1715
+ }
1716
+ .menu-trigger:hover {
1717
+ color: var(--accent-cyan);
1718
+ border-color: rgba(0,212,255,0.35);
1719
+ box-shadow: 0 0 12px rgba(0,212,255,0.15);
1720
+ }
1721
+ .menu-trigger:active { transform: scale(0.93); }
1722
+
1723
+ /* Icon swap: grid → close */
1724
+ .menu-icon-close { display: none; }
1725
+ .menu-trigger.menu-open .menu-icon-grid { display: none; }
1726
+ .menu-trigger.menu-open .menu-icon-close { display: block; color: var(--accent-cyan); }
1727
+ .menu-trigger.menu-open {
1728
+ color: var(--accent-cyan);
1729
+ border-color: rgba(0,212,255,0.4);
1730
+ box-shadow: 0 0 16px rgba(0,212,255,0.2);
1731
+ }
1732
+
1733
+ /* ── Full-Screen Overlay ──────────────────────────────────────────── */
1734
+ .cmd-overlay {
1735
+ position: fixed;
1736
+ inset: 0;
1737
+ z-index: 40;
1738
+ display: flex;
1739
+ align-items: center;
1740
+ justify-content: center;
1741
+ /* Hidden state */
1742
+ opacity: 0;
1743
+ pointer-events: none;
1744
+ transform: scale(0.97);
1745
+ transition: opacity 0.28s ease, transform 0.28s ease;
1746
+ }
1747
+ .cmd-overlay.open {
1748
+ opacity: 1;
1749
+ pointer-events: auto;
1750
+ transform: scale(1);
1751
+ }
1752
+
1753
+ /* Dark glass backdrop */
1754
+ .cmd-backdrop {
1755
+ position: absolute;
1756
+ inset: 0;
1757
+ background: rgba(6, 8, 14, 0.9);
1758
+ backdrop-filter: blur(24px);
1759
+ -webkit-backdrop-filter: blur(24px);
1760
+ }
1761
+
1762
+ /* Shell (content on top of backdrop) */
1763
+ .cmd-shell {
1764
+ position: relative;
1765
+ z-index: 1;
1766
+ width: 100%;
1767
+ max-width: 1080px;
1768
+ padding: 0 32px;
1769
+ display: flex;
1770
+ flex-direction: column;
1771
+ gap: 24px;
1772
+ }
1773
+
1774
+ /* ── Header Bar ───────────────────────────────────────────────────── */
1775
+ .cmd-header {
1776
+ display: flex;
1777
+ align-items: center;
1778
+ justify-content: space-between;
1779
+ padding-bottom: 16px;
1780
+ border-bottom: 1px solid var(--glass-border);
1781
+ }
1782
+ .cmd-brand {
1783
+ display: flex;
1784
+ align-items: center;
1785
+ gap: 10px;
1786
+ }
1787
+ .cmd-brand-glyph {
1788
+ font-size: 22px;
1789
+ color: var(--accent-cyan);
1790
+ text-shadow: 0 0 12px var(--accent-cyan);
1791
+ animation: aso-breathe 3s ease-in-out infinite;
1792
+ }
1793
+ .cmd-brand-name {
1794
+ font-family: var(--font-mono);
1795
+ font-size: 18px;
1796
+ font-weight: 700;
1797
+ color: var(--text);
1798
+ letter-spacing: 0.15em;
1799
+ }
1800
+ .cmd-brand-sep {
1801
+ font-size: 16px;
1802
+ color: var(--text-dim);
1803
+ margin: 0 2px;
1804
+ }
1805
+ .cmd-brand-sub {
1806
+ font-family: var(--font-mono);
1807
+ font-size: 11px;
1808
+ color: var(--text-dim);
1809
+ letter-spacing: 0.22em;
1810
+ padding-top: 2px;
1811
+ }
1812
+ .cmd-esc-hint {
1813
+ font-size: 11px;
1814
+ color: var(--text-dim);
1815
+ display: flex;
1816
+ align-items: center;
1817
+ gap: 5px;
1818
+ }
1819
+ .cmd-kbd {
1820
+ font-family: var(--font-mono);
1821
+ font-size: 10px;
1822
+ padding: 2px 6px;
1823
+ background: rgba(255,255,255,0.07);
1824
+ border: 1px solid rgba(255,255,255,0.12);
1825
+ border-radius: 4px;
1826
+ color: var(--text-muted);
1827
+ }
1828
+
1829
+ /* ── Command Grid ─────────────────────────────────────────────────── */
1830
+ .cmd-grid {
1831
+ display: grid;
1832
+ grid-template-columns: 200px 1fr 200px;
1833
+ grid-template-rows: auto auto;
1834
+ gap: 14px;
1835
+ width: 100%;
1836
+ }
1837
+
1838
+ .cmd-group--chat { grid-column: 1; grid-row: 1 / 3; }
1839
+ .cmd-group--control { grid-column: 2; grid-row: 1; }
1840
+ .cmd-group--agent { grid-column: 3; grid-row: 1; }
1841
+ .cmd-group--settings { grid-column: 2; grid-row: 2; }
1842
+ .cmd-group--resources { grid-column: 3; grid-row: 2; }
1843
+
1844
+ /* ── Group Card ───────────────────────────────────────────────────── */
1845
+ .cmd-group {
1846
+ background: var(--glass-bg);
1847
+ border: 1px solid var(--glass-border);
1848
+ border-radius: 16px;
1849
+ padding: 18px;
1850
+ display: flex;
1851
+ flex-direction: column;
1852
+ gap: 14px;
1853
+ /* Stagger-reveal when overlay opens */
1854
+ opacity: 0;
1855
+ transform: translateY(14px);
1856
+ transition: border-color 0.25s, box-shadow 0.25s;
1857
+ }
1858
+ .cmd-overlay.open .cmd-group {
1859
+ animation: cmd-card-in 0.32s ease forwards;
1860
+ }
1861
+ .cmd-overlay.open .cmd-group:nth-child(1) { animation-delay: 30ms; }
1862
+ .cmd-overlay.open .cmd-group:nth-child(2) { animation-delay: 80ms; }
1863
+ .cmd-overlay.open .cmd-group:nth-child(3) { animation-delay: 130ms; }
1864
+ .cmd-overlay.open .cmd-group:nth-child(4) { animation-delay: 180ms; }
1865
+ .cmd-overlay.open .cmd-group:nth-child(5) { animation-delay: 230ms; }
1866
+
1867
+ @keyframes cmd-card-in {
1868
+ from { opacity: 0; transform: translateY(14px); }
1869
+ to { opacity: 1; transform: translateY(0); }
1870
+ }
1871
+
1872
+ /* Per-group accent borders & hover glow */
1873
+ .cmd-group--chat:hover { border-color: rgba(0,212,255,0.35); box-shadow: 0 0 20px rgba(0,212,255,0.06); }
1874
+ .cmd-group--control:hover { border-color: rgba(96,165,250,0.35); box-shadow: 0 0 20px rgba(96,165,250,0.06); }
1875
+ .cmd-group--agent:hover { border-color: rgba(167,139,250,0.35); box-shadow: 0 0 20px rgba(167,139,250,0.06); }
1876
+ .cmd-group--settings:hover { border-color: rgba(245,158,11,0.35); box-shadow: 0 0 20px rgba(245,158,11,0.06); }
1877
+ .cmd-group--resources:hover { border-color: rgba(52,211,153,0.35); box-shadow: 0 0 20px rgba(52,211,153,0.06); }
1878
+
1879
+ /* ── Group Header ─────────────────────────────────────────────────── */
1880
+ .cmd-group-hd {
1881
+ display: flex;
1882
+ align-items: center;
1883
+ gap: 9px;
1884
+ padding-bottom: 10px;
1885
+ border-bottom: 1px solid var(--glass-border);
1886
+ }
1887
+ .cmd-group-svg {
1888
+ width: 16px;
1889
+ height: 16px;
1890
+ flex-shrink: 0;
1891
+ }
1892
+ .cmd-group-label {
1893
+ font-family: var(--font-mono);
1894
+ font-size: 10px;
1895
+ font-weight: 700;
1896
+ letter-spacing: 0.2em;
1897
+ }
1898
+
1899
+ /* Accent colours on group labels and icons */
1900
+ .cmd-group--chat .cmd-group-hd { color: var(--cmd-chat); }
1901
+ .cmd-group--control .cmd-group-hd { color: var(--cmd-control); }
1902
+ .cmd-group--agent .cmd-group-hd { color: var(--cmd-agent); }
1903
+ .cmd-group--settings .cmd-group-hd { color: var(--cmd-settings); }
1904
+ .cmd-group--resources .cmd-group-hd { color: var(--cmd-resources); }
1905
+
1906
+ /* ── Items List ───────────────────────────────────────────────────── */
1907
+ .cmd-items {
1908
+ display: flex;
1909
+ flex-direction: column;
1910
+ gap: 6px;
1911
+ flex: 1;
1912
+ }
1913
+
1914
+ /* 3-column sub-grid for CONTROL (6 items) */
1915
+ .cmd-items--grid {
1916
+ display: grid;
1917
+ grid-template-columns: 1fr 1fr 1fr;
1918
+ gap: 8px;
1919
+ }
1920
+
1921
+ /* ── Individual Item ──────────────────────────────────────────────── */
1922
+ .cmd-item {
1923
+ display: flex;
1924
+ align-items: center;
1925
+ gap: 10px;
1926
+ padding: 10px 12px;
1927
+ border-radius: 10px;
1928
+ border: 1px solid transparent;
1929
+ background: rgba(255,255,255,0.025);
1930
+ text-decoration: none;
1931
+ cursor: pointer;
1932
+ transition: background 0.18s, border-color 0.18s, transform 0.15s;
1933
+ }
1934
+ .cmd-item:hover {
1935
+ background: rgba(255,255,255,0.06);
1936
+ transform: translateY(-1px);
1937
+ }
1938
+ /* Per-group item hover accent */
1939
+ .cmd-group--chat .cmd-item:hover { border-color: rgba(0,212,255,0.3); }
1940
+ .cmd-group--control .cmd-item:hover { border-color: rgba(96,165,250,0.3); }
1941
+ .cmd-group--agent .cmd-item:hover { border-color: rgba(167,139,250,0.3); }
1942
+ .cmd-group--settings .cmd-item:hover { border-color: rgba(245,158,11,0.3); }
1943
+ .cmd-group--resources .cmd-item:hover { border-color: rgba(52,211,153,0.3); }
1944
+
1945
+ .cmd-item-icon {
1946
+ font-size: 16px;
1947
+ flex-shrink: 0;
1948
+ width: 20px;
1949
+ text-align: center;
1950
+ opacity: 0.7;
1951
+ }
1952
+ .cmd-group--chat .cmd-item-icon { color: var(--cmd-chat); }
1953
+ .cmd-group--control .cmd-item-icon { color: var(--cmd-control); }
1954
+ .cmd-group--agent .cmd-item-icon { color: var(--cmd-agent); }
1955
+ .cmd-group--settings .cmd-item-icon { color: var(--cmd-settings); }
1956
+ .cmd-group--resources .cmd-item-icon { color: var(--cmd-resources); }
1957
+
1958
+ .cmd-item-body {
1959
+ display: flex;
1960
+ flex-direction: column;
1961
+ gap: 2px;
1962
+ min-width: 0;
1963
+ flex: 1;
1964
+ }
1965
+ .cmd-item-name {
1966
+ font-family: var(--font-mono);
1967
+ font-size: 12px;
1968
+ font-weight: 600;
1969
+ color: var(--text);
1970
+ white-space: nowrap;
1971
+ overflow: hidden;
1972
+ text-overflow: ellipsis;
1973
+ }
1974
+ .cmd-item-desc {
1975
+ font-size: 10px;
1976
+ color: var(--text-dim);
1977
+ white-space: nowrap;
1978
+ overflow: hidden;
1979
+ text-overflow: ellipsis;
1980
+ }
1981
+ .cmd-item-badge {
1982
+ font-family: var(--font-mono);
1983
+ font-size: 8px;
1984
+ font-weight: 700;
1985
+ letter-spacing: 0.1em;
1986
+ padding: 2px 6px;
1987
+ border-radius: 99px;
1988
+ background: rgba(0,212,255,0.12);
1989
+ color: var(--accent-cyan);
1990
+ border: 1px solid rgba(0,212,255,0.25);
1991
+ flex-shrink: 0;
1992
+ }
1993
+
1994
+ /* ── History button ─────────────────────────────────────────────────── */
1995
+ .history-btn {
1996
+ display: flex; align-items: center; gap: 5px;
1997
+ padding: 5px 11px;
1998
+ height: 28px;
1999
+ background: rgba(139,92,246,0.08);
2000
+ border: 1px solid rgba(139,92,246,0.2);
2001
+ border-radius: 8px;
2002
+ color: rgba(139,92,246,0.85);
2003
+ font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.08em; font-weight: 600;
2004
+ cursor: pointer; transition: all 0.2s; white-space: nowrap; flex-shrink: 0;
2005
+ }
2006
+ .history-btn:hover {
2007
+ background: rgba(139,92,246,0.16);
2008
+ border-color: rgba(139,92,246,0.4);
2009
+ box-shadow: 0 0 12px rgba(139,92,246,0.12);
2010
+ }
2011
+ .history-btn-label { font-size: 10px; }
2012
+
2013
+ /* ── History overlay + drawer ───────────────────────────────────────── */
2014
+ .history-overlay {
2015
+ position: fixed; inset: 0; z-index: 1100;
2016
+ background: rgba(0,0,0,0.55);
2017
+ backdrop-filter: blur(4px);
2018
+ opacity: 0; pointer-events: none;
2019
+ transition: opacity 0.25s ease;
2020
+ }
2021
+ .history-overlay.open { opacity: 1; pointer-events: auto; }
2022
+
2023
+ .history-drawer {
2024
+ position: fixed; top: 0; right: -440px; height: 100vh; width: 420px;
2025
+ z-index: 1101;
2026
+ background: rgba(10,12,20,0.97);
2027
+ border-left: 1px solid rgba(139,92,246,0.25);
2028
+ box-shadow: -20px 0 60px rgba(0,0,0,0.6);
2029
+ display: flex; flex-direction: column;
2030
+ transition: right 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2031
+ }
2032
+ .history-drawer.open { right: 0; }
2033
+
2034
+ .history-drawer-header {
2035
+ display: flex; align-items: center; justify-content: space-between;
2036
+ padding: 16px 18px 14px;
2037
+ border-bottom: 1px solid rgba(139,92,246,0.15);
2038
+ flex-shrink: 0;
2039
+ }
2040
+ .history-drawer-title {
2041
+ display: flex; align-items: center; gap: 7px;
2042
+ font-family: var(--font-mono); font-size: 11px; font-weight: 700;
2043
+ letter-spacing: 0.14em; color: rgba(139,92,246,0.9);
2044
+ }
2045
+ .history-close-btn {
2046
+ background: none; border: none; color: var(--text-dim);
2047
+ font-size: 13px; cursor: pointer; padding: 4px 6px; border-radius: 4px;
2048
+ transition: color 0.15s, background 0.15s;
2049
+ }
2050
+ .history-close-btn:hover { color: var(--text-primary); background: rgba(255,255,255,0.06); }
2051
+
2052
+ .history-drawer-body {
2053
+ flex: 1; overflow-y: auto; padding: 12px 0;
2054
+ }
2055
+ .history-drawer-body::-webkit-scrollbar { width: 4px; }
2056
+ .history-drawer-body::-webkit-scrollbar-track { background: transparent; }
2057
+ .history-drawer-body::-webkit-scrollbar-thumb { background: rgba(139,92,246,0.3); border-radius: 2px; }
2058
+
2059
+ .history-loading {
2060
+ padding: 24px 18px;
2061
+ color: var(--text-dim);
2062
+ font-size: 12px; font-family: var(--font-mono);
2063
+ text-align: center;
2064
+ }
2065
+
2066
+ /* ── Session list items ─────────────────────────────────────────────── */
2067
+ .history-session-item {
2068
+ padding: 12px 18px;
2069
+ cursor: pointer;
2070
+ border-bottom: 1px solid rgba(255,255,255,0.04);
2071
+ transition: background 0.15s;
2072
+ position: relative;
2073
+ }
2074
+ .history-session-item:hover { background: rgba(139,92,246,0.07); }
2075
+ .history-session-item:last-child { border-bottom: none; }
2076
+
2077
+ .history-session-meta {
2078
+ display: flex; align-items: center; justify-content: space-between;
2079
+ margin-bottom: 5px;
2080
+ }
2081
+ .history-session-date {
2082
+ font-family: var(--font-mono); font-size: 10px; font-weight: 600;
2083
+ color: rgba(139,92,246,0.8); letter-spacing: 0.06em;
2084
+ }
2085
+ .history-session-count {
2086
+ font-family: var(--font-mono); font-size: 9px;
2087
+ color: var(--text-dim); letter-spacing: 0.05em;
2088
+ }
2089
+ .history-session-preview {
2090
+ font-size: 12px; color: var(--text-secondary);
2091
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
2092
+ line-height: 1.4;
2093
+ }
2094
+ .history-session-badge {
2095
+ display: inline-block; margin-bottom: 4px;
2096
+ font-family: var(--font-mono); font-size: 9px; font-weight: 700;
2097
+ letter-spacing: 0.1em; padding: 2px 6px; border-radius: 99px;
2098
+ }
2099
+ .history-session-badge.live {
2100
+ background: rgba(0,212,255,0.12); color: var(--accent-cyan);
2101
+ border: 1px solid rgba(0,212,255,0.25);
2102
+ }
2103
+ .history-session-badge.archived {
2104
+ background: rgba(139,92,246,0.1); color: rgba(139,92,246,0.7);
2105
+ border: 1px solid rgba(139,92,246,0.2);
2106
+ }
2107
+
2108
+ /* ── Archive viewer banner ──────────────────────────────────────────── */
2109
+ .archive-banner {
2110
+ display: flex; align-items: center; justify-content: space-between;
2111
+ padding: 10px 14px; margin: 0 0 8px;
2112
+ background: rgba(139,92,246,0.1);
2113
+ border-bottom: 1px solid rgba(139,92,246,0.2);
2114
+ flex-shrink: 0;
2115
+ }
2116
+ .archive-banner-label {
2117
+ font-family: var(--font-mono); font-size: 10px;
2118
+ color: rgba(139,92,246,0.8); letter-spacing: 0.08em;
2119
+ }
2120
+ .archive-banner-back {
2121
+ font-family: var(--font-mono); font-size: 10px; font-weight: 600;
2122
+ color: rgba(139,92,246,0.9); cursor: pointer;
2123
+ background: none; border: none; padding: 3px 8px;
2124
+ border: 1px solid rgba(139,92,246,0.3); border-radius: 6px;
2125
+ transition: all 0.15s;
2126
+ }
2127
+ .archive-banner-back:hover { background: rgba(139,92,246,0.15); }
2128
+
2129
+ .history-transcript {
2130
+ flex: 1; overflow-y: auto; padding: 8px 12px;
2131
+ }
2132
+ .history-transcript::-webkit-scrollbar { width: 4px; }
2133
+ .history-transcript::-webkit-scrollbar-thumb { background: rgba(139,92,246,0.3); border-radius: 2px; }
2134
+
2135
+ .history-msg {
2136
+ margin-bottom: 12px; font-size: 12.5px; line-height: 1.5;
2137
+ }
2138
+ .history-msg-role {
2139
+ font-family: var(--font-mono); font-size: 9px; font-weight: 700;
2140
+ letter-spacing: 0.1em; margin-bottom: 3px;
2141
+ }
2142
+ .history-msg-role.user { color: var(--accent-cyan); }
2143
+ .history-msg-role.assistant { color: rgba(139,92,246,0.8); }
2144
+ .history-msg-text {
2145
+ color: var(--text-secondary); padding: 6px 10px;
2146
+ background: rgba(255,255,255,0.025);
2147
+ border-radius: 6px; border-left: 2px solid rgba(255,255,255,0.08);
2148
+ white-space: pre-wrap; word-break: break-word;
2149
+ }
2150
+ .history-msg.assistant .history-msg-text {
2151
+ border-left-color: rgba(139,92,246,0.3);
2152
+ }
2153
+ .history-msg.user .history-msg-text {
2154
+ border-left-color: rgba(0,212,255,0.25);
2155
+ }
2156
+
2157
+ .history-empty {
2158
+ padding: 32px 18px; text-align: center;
2159
+ color: var(--text-dim); font-size: 12px; font-family: var(--font-mono);
2160
+ }
2161
+
2162
+ /* ── Archive toast ──────────────────────────────────────────────────── */
2163
+ .session-archive-toast {
2164
+ position: fixed; bottom: 80px; left: 50%; transform: translateX(-50%) translateY(20px);
2165
+ z-index: 1200;
2166
+ display: flex; align-items: center; gap: 7px;
2167
+ padding: 8px 16px;
2168
+ background: rgba(15,17,28,0.95);
2169
+ border: 1px solid rgba(139,92,246,0.35);
2170
+ border-radius: 99px;
2171
+ font-size: 11.5px; font-family: var(--font-mono); color: var(--text-secondary);
2172
+ box-shadow: 0 4px 24px rgba(0,0,0,0.5), 0 0 20px rgba(139,92,246,0.08);
2173
+ opacity: 0; pointer-events: none;
2174
+ transition: opacity 0.25s ease, transform 0.25s ease;
2175
+ white-space: nowrap;
2176
+ }
2177
+ .session-archive-toast.show {
2178
+ opacity: 1; pointer-events: auto; transform: translateX(-50%) translateY(0);
2179
+ }
2180
+ #session-archive-link {
2181
+ color: rgba(139,92,246,0.9); cursor: pointer; font-weight: 600;
2182
+ text-decoration: underline; text-underline-offset: 2px;
2183
+ }
2184
+ #session-archive-link:hover { color: rgba(139,92,246,1); }