@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,2165 @@
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: 110px;
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
+ align-items: center;
679
+ gap: 12px;
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: 99px;
685
+ padding: 12px 16px;
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-bar:focus-within {
696
+ border-color: rgba(0,212,255,0.3);
697
+ box-shadow:
698
+ 0 0 0 1px rgba(0,212,255,0.15),
699
+ 0 8px 40px rgba(0,0,0,0.6),
700
+ 0 0 80px rgba(0,212,255,0.08),
701
+ inset 0 1px 0 rgba(255,255,255,0.1);
702
+ }
703
+
704
+ .prompt-icon {
705
+ color: var(--accent-cyan);
706
+ opacity: 0.7;
707
+ flex-shrink: 0;
708
+ display: flex;
709
+ align-items: center;
710
+ filter: drop-shadow(0 0 4px var(--accent-cyan));
711
+ }
712
+
713
+ .prompt-bar input {
714
+ flex: 1;
715
+ background: transparent;
716
+ border: none;
717
+ outline: none;
718
+ color: var(--text);
719
+ font-family: var(--font);
720
+ font-size: 14px;
721
+ letter-spacing: 0.01em;
722
+ caret-color: var(--accent-cyan);
723
+ }
724
+
725
+ .prompt-bar input::placeholder {
726
+ color: var(--text-dim);
727
+ }
728
+
729
+ .send-btn {
730
+ background: rgba(0,212,255,0.12);
731
+ border: 1px solid rgba(0,212,255,0.2);
732
+ border-radius: 50%;
733
+ width: 32px;
734
+ height: 32px;
735
+ display: flex;
736
+ align-items: center;
737
+ justify-content: center;
738
+ color: var(--accent-cyan);
739
+ cursor: pointer;
740
+ flex-shrink: 0;
741
+ transition: background 0.2s, transform 0.15s, box-shadow 0.2s;
742
+ }
743
+
744
+ .send-btn:hover {
745
+ background: rgba(0,212,255,0.22);
746
+ box-shadow: 0 0 16px rgba(0,212,255,0.25);
747
+ transform: scale(1.05);
748
+ }
749
+
750
+ .send-btn:active {
751
+ transform: scale(0.95);
752
+ }
753
+
754
+ /* ── New Session Button ───────────────────────────────────────────── */
755
+ .prompt-divider {
756
+ width: 1px;
757
+ height: 18px;
758
+ background: rgba(255,255,255,0.08);
759
+ flex-shrink: 0;
760
+ }
761
+
762
+ .new-session-btn {
763
+ display: flex;
764
+ align-items: center;
765
+ gap: 5px;
766
+ background: rgba(139,92,246,0.1);
767
+ border: 1px solid rgba(139,92,246,0.2);
768
+ border-radius: 99px;
769
+ padding: 0 10px;
770
+ height: 32px;
771
+ color: rgba(139,92,246,0.85);
772
+ cursor: pointer;
773
+ flex-shrink: 0;
774
+ transition: background 0.2s, box-shadow 0.2s, transform 0.15s, opacity 0.2s;
775
+ }
776
+
777
+ .new-session-btn:hover {
778
+ background: rgba(139,92,246,0.2);
779
+ box-shadow: 0 0 16px rgba(139,92,246,0.2);
780
+ transform: scale(1.03);
781
+ }
782
+
783
+ .new-session-btn:active {
784
+ transform: scale(0.96);
785
+ }
786
+
787
+ .new-session-btn:disabled {
788
+ opacity: 0.3;
789
+ cursor: not-allowed;
790
+ transform: none;
791
+ }
792
+
793
+ .new-session-label {
794
+ font-family: var(--font-mono);
795
+ font-size: 11px;
796
+ letter-spacing: 0.08em;
797
+ font-weight: 600;
798
+ }
799
+
800
+ /* ── New Session Cleared State ───────────────────────────────────── */
801
+ .session-cleared {
802
+ display: flex;
803
+ flex-direction: column;
804
+ align-items: center;
805
+ justify-content: center;
806
+ gap: 10px;
807
+ padding: 60px 20px;
808
+ opacity: 0;
809
+ animation: session-cleared-in 0.5s ease forwards;
810
+ }
811
+
812
+ .session-cleared-icon {
813
+ font-size: 28px;
814
+ opacity: 0.3;
815
+ }
816
+
817
+ .session-cleared-text {
818
+ font-family: var(--font-mono);
819
+ font-size: 12px;
820
+ letter-spacing: 0.12em;
821
+ color: var(--text-dim);
822
+ opacity: 0.5;
823
+ }
824
+
825
+ @keyframes session-cleared-in {
826
+ from { opacity: 0; transform: translateY(8px); }
827
+ to { opacity: 1; transform: translateY(0); }
828
+ }
829
+
830
+ /* ── Thinking Bubble ──────────────────────────────────────────────── */
831
+ .thinking-bubble {
832
+ background: rgba(0,212,255,0.04) !important;
833
+ border-color: rgba(0,212,255,0.15) !important;
834
+ padding: 10px 16px !important;
835
+ }
836
+
837
+ .think-header {
838
+ display: flex;
839
+ align-items: center;
840
+ gap: 10px;
841
+ margin-bottom: 8px;
842
+ }
843
+
844
+ .think-badge {
845
+ font-family: var(--font-mono);
846
+ font-size: 9px;
847
+ font-weight: 700;
848
+ letter-spacing: 0.15em;
849
+ color: var(--accent-cyan);
850
+ text-shadow: 0 0 8px var(--accent-cyan);
851
+ }
852
+
853
+ .think-dots span {
854
+ display: inline-block;
855
+ color: var(--accent-cyan);
856
+ animation: dot-pulse 1.2s ease-in-out infinite;
857
+ font-size: 14px;
858
+ opacity: 0;
859
+ }
860
+ .think-dots span:nth-child(1) { animation-delay: 0s; }
861
+ .think-dots span:nth-child(2) { animation-delay: 0.2s; }
862
+ .think-dots span:nth-child(3) { animation-delay: 0.4s; }
863
+
864
+ @keyframes dot-pulse {
865
+ 0%, 100% { opacity: 0; transform: translateY(0); }
866
+ 50% { opacity: 1; transform: translateY(-3px); }
867
+ }
868
+
869
+ .think-bar-wrap {
870
+ height: 2px;
871
+ background: rgba(255,255,255,0.06);
872
+ border-radius: 99px;
873
+ overflow: hidden;
874
+ }
875
+
876
+ .think-bar {
877
+ height: 100%;
878
+ width: 0%;
879
+ background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
880
+ border-radius: 99px;
881
+ animation: think-scan 1s ease-in-out infinite;
882
+ }
883
+
884
+ @keyframes think-scan {
885
+ 0% { width: 0%; margin-left: 0%; opacity: 1; }
886
+ 50% { width: 60%; margin-left: 20%; opacity: 1; }
887
+ 100% { width: 0%; margin-left: 100%; opacity: 0; }
888
+ }
889
+
890
+ /* ── Streaming Bubble ─────────────────────────────────────────────── */
891
+ .stream-bubble {
892
+ position: relative;
893
+ }
894
+
895
+ .stream-bubble.streaming {
896
+ width: 100% !important;
897
+ border-color: rgba(0,212,255,0.25) !important;
898
+ box-shadow:
899
+ 0 8px 32px rgba(0,0,0,0.5),
900
+ 0 0 20px rgba(0,212,255,0.06),
901
+ inset 0 1px 0 rgba(255,255,255,0.06) !important;
902
+ animation: stream-pulse 1.8s ease-in-out infinite;
903
+ }
904
+
905
+ @keyframes stream-pulse {
906
+ 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); }
907
+ 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); }
908
+ }
909
+
910
+ .stream-bubble.streaming::after {
911
+ content: '';
912
+ position: absolute;
913
+ top: 0; left: 0; right: 0;
914
+ height: 1px;
915
+ background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
916
+ opacity: 0.6;
917
+ animation: top-scan 2s linear infinite;
918
+ }
919
+
920
+ @keyframes top-scan {
921
+ 0% { transform: scaleX(0); transform-origin: left; opacity: 0.8; }
922
+ 50% { transform: scaleX(1); transform-origin: left; opacity: 0.6; }
923
+ 100% { transform: scaleX(0); transform-origin: right; opacity: 0; }
924
+ }
925
+
926
+ .stream-bubble.done {
927
+ width: fit-content;
928
+ max-width: 100%;
929
+ border-color: rgba(255,255,255,0.1) !important;
930
+ transition: border-color 0.8s, box-shadow 0.8s, width 0.3s ease;
931
+ }
932
+
933
+ /* ── Character spawn animation ────────────────────────────────────── */
934
+ .char-spawn {
935
+ display: inline;
936
+ color: transparent;
937
+ text-shadow: none;
938
+ transition: color 0.12s ease, text-shadow 0.2s ease;
939
+ }
940
+
941
+ .char-spawn.char-visible {
942
+ color: var(--text);
943
+ text-shadow: 0 0 8px rgba(0,212,255,0.4);
944
+ animation: char-settle 0.4s ease forwards;
945
+ }
946
+
947
+ @keyframes char-settle {
948
+ 0% { color: var(--accent-cyan); text-shadow: 0 0 12px var(--accent-cyan), 0 0 24px rgba(0,212,255,0.3); }
949
+ 40% { color: rgba(200,240,255,0.95); text-shadow: 0 0 6px rgba(0,212,255,0.2); }
950
+ 100% { color: var(--text); text-shadow: none; }
951
+ }
952
+
953
+ /* ── Telemetry footer ─────────────────────────────────────────────── */
954
+ .telemetry {
955
+ display: flex;
956
+ align-items: center;
957
+ gap: 6px;
958
+ margin-top: 10px;
959
+ padding-top: 8px;
960
+ border-top: 1px solid rgba(255,255,255,0.05);
961
+ opacity: 0;
962
+ transform: translateY(4px);
963
+ transition: opacity 0.5s ease 0.2s, transform 0.5s ease 0.2s;
964
+ }
965
+
966
+ .telemetry.tele-visible {
967
+ opacity: 1;
968
+ transform: translateY(0);
969
+ }
970
+
971
+ .tele-item {
972
+ font-family: var(--font-mono);
973
+ font-size: 9px;
974
+ color: var(--text-dim);
975
+ letter-spacing: 0.06em;
976
+ }
977
+
978
+ .tele-sep {
979
+ color: rgba(255,255,255,0.12);
980
+ font-size: 9px;
981
+ }
982
+
983
+ /* ── Send button loading state ────────────────────────────────────── */
984
+ .send-btn.btn-loading {
985
+ animation: btn-spin 1s linear infinite;
986
+ }
987
+ @keyframes btn-spin {
988
+ to { transform: rotate(360deg); }
989
+ }
990
+
991
+ /* ── Connection status ────────────────────────────────────────────── */
992
+ .conn-status {
993
+ position: fixed;
994
+ top: 16px;
995
+ left: 50%;
996
+ transform: translateX(-50%);
997
+ z-index: 30;
998
+ display: flex;
999
+ align-items: center;
1000
+ gap: 7px;
1001
+ background: var(--glass-bg);
1002
+ backdrop-filter: var(--blur);
1003
+ -webkit-backdrop-filter: var(--blur);
1004
+ border: 1px solid var(--glass-border);
1005
+ border-radius: 99px;
1006
+ padding: 5px 12px;
1007
+ pointer-events: none;
1008
+ }
1009
+
1010
+ .conn-label {
1011
+ font-family: var(--font-mono);
1012
+ font-size: 9px;
1013
+ letter-spacing: 0.1em;
1014
+ color: var(--text-dim);
1015
+ }
1016
+
1017
+ .dot-red { background: #f87171; box-shadow: 0 0 6px #f87171; }
1018
+
1019
+ /* ── UI Toggle button ─────────────────────────────────────────────── */
1020
+ .ui-toggle {
1021
+ position: fixed;
1022
+ top: 16px;
1023
+ right: 24px;
1024
+ z-index: 30;
1025
+ display: flex;
1026
+ align-items: center;
1027
+ gap: 7px;
1028
+ background: var(--glass-bg);
1029
+ backdrop-filter: var(--blur);
1030
+ -webkit-backdrop-filter: var(--blur);
1031
+ border: 1px solid var(--glass-border);
1032
+ border-radius: 99px;
1033
+ padding: 6px 14px;
1034
+ color: var(--text-muted);
1035
+ font-size: 11px;
1036
+ font-family: var(--font-mono);
1037
+ letter-spacing: 0.05em;
1038
+ text-decoration: none;
1039
+ transition: border-color 0.2s, color 0.2s, box-shadow 0.2s;
1040
+ }
1041
+
1042
+ .ui-toggle:hover {
1043
+ border-color: var(--glass-border-strong);
1044
+ color: var(--text);
1045
+ box-shadow: 0 0 16px rgba(0,212,255,0.08);
1046
+ }
1047
+
1048
+ /* ── Scrollbar ────────────────────────────────────────────────────── */
1049
+ .response-area::-webkit-scrollbar { display: none; }
1050
+ .response-area { scrollbar-width: none; }
1051
+
1052
+ /* ═══════════════════════════════════════════════════════════════════
1053
+ CONTENT TYPES — Markdown, Thinking, Tool Cards, Code
1054
+ ═══════════════════════════════════════════════════════════════════ */
1055
+
1056
+ /* ── Markdown prose ────────────────────────────────────────────────── */
1057
+ .msg-text {
1058
+ font-size: 14.5px;
1059
+ line-height: 1.75;
1060
+ color: var(--text);
1061
+ word-wrap: break-word;
1062
+ overflow-wrap: anywhere;
1063
+ word-break: break-word;
1064
+ }
1065
+
1066
+ /* Paragraph spacing */
1067
+ .msg-text :where(p, ul, ol, pre, blockquote, table) { margin: 0; }
1068
+ .msg-text :where(p + p,
1069
+ p + ul, p + ol, p + pre, p + blockquote, p + table,
1070
+ ul + p, ol + p, pre + p, blockquote + p, table + p) { margin-top: 0.75em; }
1071
+ .msg-text :where(li + li) { margin-top: 0.25em; }
1072
+
1073
+ /* Headings */
1074
+ .msg-text :where(h1, h2, h3, h4, h5, h6) {
1075
+ font-weight: 600;
1076
+ line-height: 1.3;
1077
+ color: rgba(255,255,255,0.96);
1078
+ margin: 1.1em 0 0.4em;
1079
+ }
1080
+ .msg-text :where(h1) { font-size: 1.35em; border-bottom: 1px solid var(--glass-border); padding-bottom: 0.3em; }
1081
+ .msg-text :where(h2) { font-size: 1.18em; border-bottom: 1px solid rgba(255,255,255,0.05); padding-bottom: 0.2em; }
1082
+ .msg-text :where(h3) { font-size: 1.06em; }
1083
+ .msg-text :where(h4, h5, h6) { font-size: 1em; color: rgba(255,255,255,0.8); }
1084
+ .msg-text :where(h1, h2, h3, h4, h5, h6):first-child { margin-top: 0.3em; }
1085
+
1086
+ /* Lists */
1087
+ .msg-text :where(ul, ol) { padding-left: 1.4em; }
1088
+ .msg-text :where(ul) { list-style-type: disc; }
1089
+ .msg-text :where(ol) { list-style-type: decimal; }
1090
+ .msg-text :where(ul ul) { list-style-type: circle; margin-top: 0.25em; }
1091
+
1092
+ /* Text formatting */
1093
+ .msg-text :where(strong) { font-weight: 600; color: rgba(255,255,255,0.97); }
1094
+ .msg-text :where(em) { font-style: italic; color: rgba(255,255,255,0.82); }
1095
+ .msg-text :where(del) { text-decoration: line-through; opacity: 0.6; }
1096
+ .msg-text :where(mark) { background: rgba(251,191,36,0.2); color: #fbbf24; border-radius: 2px; padding: 0 3px; }
1097
+ .msg-text :where(sup) { font-size: 0.75em; vertical-align: super; }
1098
+ .msg-text :where(sub) { font-size: 0.75em; vertical-align: sub; }
1099
+
1100
+ /* Links */
1101
+ .msg-text :where(a) { color: var(--accent-cyan); text-decoration: none; border-bottom: 1px solid rgba(0,212,255,0.3); }
1102
+ .msg-text :where(a:hover) { border-bottom-color: var(--accent-cyan); }
1103
+
1104
+ /* Horizontal rule */
1105
+ .msg-text :where(hr) {
1106
+ border: none;
1107
+ border-top: 1px solid var(--glass-border);
1108
+ margin: 1em 0;
1109
+ }
1110
+
1111
+ /* Blockquote */
1112
+ .msg-text :where(blockquote) {
1113
+ border-left: 2px solid rgba(0,212,255,0.3);
1114
+ margin: 0.6em 0;
1115
+ padding: 6px 14px;
1116
+ background: rgba(0,212,255,0.03);
1117
+ color: var(--text-muted);
1118
+ border-radius: 0 6px 6px 0;
1119
+ }
1120
+ .msg-text :where(blockquote blockquote) {
1121
+ border-left-color: rgba(139,92,246,0.4);
1122
+ background: rgba(139,92,246,0.03);
1123
+ margin-top: 6px;
1124
+ }
1125
+
1126
+ /* ── Tables ─────────────────────────────────────────────────────────── */
1127
+ .msg-text :where(table) {
1128
+ width: 100%;
1129
+ border-collapse: collapse;
1130
+ font-size: 13px;
1131
+ margin-top: 0.75em;
1132
+ border: 1px solid var(--glass-border);
1133
+ border-radius: 8px;
1134
+ overflow: hidden;
1135
+ }
1136
+
1137
+ .msg-text :where(thead) {
1138
+ background: rgba(0,212,255,0.06);
1139
+ }
1140
+
1141
+ .msg-text :where(th) {
1142
+ font-family: var(--font-mono);
1143
+ font-size: 10.5px;
1144
+ font-weight: 600;
1145
+ letter-spacing: 0.08em;
1146
+ text-transform: uppercase;
1147
+ color: var(--accent-cyan);
1148
+ border: 1px solid var(--glass-border);
1149
+ padding: 8px 12px;
1150
+ text-align: left;
1151
+ background: rgba(0,0,0,0.15);
1152
+ }
1153
+
1154
+ .msg-text :where(td) {
1155
+ border: 1px solid var(--glass-border);
1156
+ padding: 7px 12px;
1157
+ vertical-align: top;
1158
+ color: var(--text);
1159
+ line-height: 1.5;
1160
+ }
1161
+
1162
+ .msg-text :where(tr:nth-child(even) td) {
1163
+ background: rgba(255,255,255,0.015);
1164
+ }
1165
+
1166
+ .msg-text :where(tr:hover td) {
1167
+ background: rgba(0,212,255,0.03);
1168
+ }
1169
+
1170
+ /* ── Inline code ────────────────────────────────────────────────────── */
1171
+ .inline-code,
1172
+ .msg-text :where(:not(pre) > code) {
1173
+ font-family: var(--font-mono);
1174
+ font-size: 0.875em;
1175
+ background: rgba(255,255,255,0.08);
1176
+ border: 1px solid rgba(255,255,255,0.1);
1177
+ border-radius: 4px;
1178
+ padding: 0.1em 0.4em;
1179
+ color: var(--accent-cyan);
1180
+ }
1181
+
1182
+ /* ── Code blocks — full-featured ────────────────────────────────────── */
1183
+ .code-block {
1184
+ margin: 0.75em 0;
1185
+ border: 1px solid var(--glass-border);
1186
+ border-radius: 10px;
1187
+ overflow: hidden;
1188
+ background: rgba(0,0,0,0.45);
1189
+ font-family: var(--font-mono);
1190
+ }
1191
+
1192
+ /* Full-width breakout — code gets the whole column regardless of bubble */
1193
+ .code-block-full {
1194
+ width: 100%;
1195
+ max-width: 100%;
1196
+ }
1197
+
1198
+ /* ── Header ── */
1199
+ .code-header {
1200
+ display: flex;
1201
+ align-items: center;
1202
+ justify-content: space-between;
1203
+ padding: 7px 12px;
1204
+ background: rgba(255,255,255,0.04);
1205
+ border-bottom: 1px solid var(--glass-border);
1206
+ gap: 10px;
1207
+ }
1208
+
1209
+ .code-header-left { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
1210
+ .code-header-right { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
1211
+
1212
+ /* Language badge with per-language color */
1213
+ .code-lang-badge {
1214
+ font-family: var(--font-mono);
1215
+ font-size: 10px;
1216
+ font-weight: 700;
1217
+ letter-spacing: 0.06em;
1218
+ text-transform: uppercase;
1219
+ color: var(--lang-color, var(--accent-cyan));
1220
+ display: flex;
1221
+ align-items: center;
1222
+ gap: 2px;
1223
+ flex-shrink: 0;
1224
+ text-shadow: 0 0 8px var(--lang-color, var(--accent-cyan));
1225
+ }
1226
+
1227
+ /* Filename */
1228
+ .code-filename {
1229
+ font-family: var(--font-mono);
1230
+ font-size: 11px;
1231
+ color: var(--text-muted);
1232
+ background: rgba(255,255,255,0.05);
1233
+ border: 1px solid var(--glass-border);
1234
+ border-radius: 4px;
1235
+ padding: 1px 7px;
1236
+ white-space: nowrap;
1237
+ overflow: hidden;
1238
+ text-overflow: ellipsis;
1239
+ max-width: 200px;
1240
+ }
1241
+
1242
+ /* Line count */
1243
+ .code-lines-count {
1244
+ font-family: var(--font-mono);
1245
+ font-size: 9.5px;
1246
+ color: var(--text-dim);
1247
+ white-space: nowrap;
1248
+ }
1249
+
1250
+ /* Expand button */
1251
+ .code-expand-btn {
1252
+ font-size: 14px;
1253
+ background: transparent;
1254
+ border: none;
1255
+ color: var(--text-dim);
1256
+ cursor: pointer;
1257
+ padding: 0 4px;
1258
+ line-height: 1;
1259
+ transition: color 0.2s;
1260
+ }
1261
+ .code-expand-btn:hover { color: var(--text); }
1262
+
1263
+ /* Copy button */
1264
+ .code-copy {
1265
+ display: flex;
1266
+ align-items: center;
1267
+ gap: 5px;
1268
+ font-family: var(--font-mono);
1269
+ font-size: 10px;
1270
+ color: var(--text-dim);
1271
+ background: transparent;
1272
+ border: none;
1273
+ cursor: pointer;
1274
+ padding: 3px 8px;
1275
+ border-radius: 4px;
1276
+ transition: color 0.2s, background 0.2s;
1277
+ white-space: nowrap;
1278
+ }
1279
+ .code-copy:hover { color: var(--text); background: rgba(255,255,255,0.06); }
1280
+ .code-copy.copied { color: var(--accent-green); }
1281
+
1282
+ /* ── Code body ── */
1283
+ .code-body { overflow: hidden; }
1284
+ .code-body-collapsed { max-height: 400px; overflow: hidden; position: relative; }
1285
+ .code-body-collapsed::after {
1286
+ content: '';
1287
+ position: absolute;
1288
+ bottom: 0; left: 0; right: 0;
1289
+ height: 80px;
1290
+ background: linear-gradient(to bottom, transparent, rgba(0,0,0,0.8));
1291
+ pointer-events: none;
1292
+ }
1293
+ .code-expanded .code-body-collapsed { max-height: none; overflow: auto; }
1294
+ .code-expanded .code-body-collapsed::after { display: none; }
1295
+
1296
+ /* Show more button */
1297
+ .code-show-more {
1298
+ display: block;
1299
+ width: 100%;
1300
+ padding: 8px;
1301
+ background: rgba(255,255,255,0.03);
1302
+ border: none;
1303
+ border-top: 1px solid var(--glass-border);
1304
+ color: var(--text-dim);
1305
+ font-family: var(--font-mono);
1306
+ font-size: 10px;
1307
+ cursor: pointer;
1308
+ letter-spacing: 0.06em;
1309
+ transition: background 0.2s, color 0.2s;
1310
+ text-align: center;
1311
+ }
1312
+ .code-show-more:hover { background: rgba(255,255,255,0.06); color: var(--text); }
1313
+
1314
+ /* ── Line numbers ── */
1315
+ .code-pre {
1316
+ margin: 0;
1317
+ padding: 12px 0;
1318
+ overflow-x: auto;
1319
+ font-size: 12.5px;
1320
+ line-height: 1.65;
1321
+ }
1322
+
1323
+ .code-numbered { display: block; }
1324
+
1325
+ .code-line {
1326
+ display: flex;
1327
+ min-height: 1.65em;
1328
+ }
1329
+
1330
+ .code-line:hover { background: rgba(255,255,255,0.03); }
1331
+
1332
+ .line-num {
1333
+ display: inline-block;
1334
+ min-width: 44px;
1335
+ padding: 0 12px 0 14px;
1336
+ color: rgba(255,255,255,0.2);
1337
+ text-align: right;
1338
+ user-select: none;
1339
+ border-right: 1px solid rgba(255,255,255,0.06);
1340
+ flex-shrink: 0;
1341
+ font-size: 11px;
1342
+ line-height: inherit;
1343
+ }
1344
+
1345
+ .line-content {
1346
+ display: inline-block;
1347
+ padding: 0 16px;
1348
+ white-space: pre;
1349
+ flex: 1;
1350
+ }
1351
+
1352
+ .hljs { background: transparent !important; padding: 0 !important; }
1353
+
1354
+ /* ── Thinking block ─────────────────────────────────────────────────── */
1355
+ .msg-thinking { margin: 4px 0 8px; }
1356
+
1357
+ .thinking-toggle {
1358
+ display: flex;
1359
+ align-items: center;
1360
+ gap: 7px;
1361
+ background: transparent;
1362
+ border: none;
1363
+ cursor: pointer;
1364
+ padding: 4px 0;
1365
+ color: var(--text-dim);
1366
+ font-size: 11px;
1367
+ font-family: var(--font-mono);
1368
+ letter-spacing: 0.05em;
1369
+ transition: color 0.2s;
1370
+ }
1371
+ .thinking-toggle:hover { color: var(--text-muted); }
1372
+ .thinking-icon { color: var(--accent-purple); }
1373
+ .thinking-chevron { font-size: 9px; transition: transform 0.2s; }
1374
+
1375
+ .thinking-body {
1376
+ max-height: 0;
1377
+ overflow: hidden;
1378
+ transition: max-height 0.35s ease;
1379
+ }
1380
+ .thinking-body.thinking-open { max-height: 600px; overflow-y: auto; }
1381
+
1382
+ .thinking-text {
1383
+ margin-top: 6px;
1384
+ padding: 10px 14px;
1385
+ border: 1px dashed rgba(139,92,246,0.25);
1386
+ border-radius: 8px;
1387
+ background: rgba(139,92,246,0.04);
1388
+ font-size: 12px;
1389
+ line-height: 1.65;
1390
+ color: var(--text-muted);
1391
+ white-space: pre-wrap;
1392
+ font-family: var(--font-mono);
1393
+ }
1394
+
1395
+ /* ── Tool call card ─────────────────────────────────────────────────── */
1396
+ .msg-tool-card {
1397
+ margin: 4px 0;
1398
+ border: 1px solid var(--glass-border);
1399
+ border-radius: 8px;
1400
+ overflow: hidden;
1401
+ background: rgba(255,255,255,0.02);
1402
+ }
1403
+
1404
+ .tool-header {
1405
+ display: flex;
1406
+ align-items: center;
1407
+ gap: 8px;
1408
+ width: 100%;
1409
+ padding: 8px 12px;
1410
+ background: transparent;
1411
+ border: none;
1412
+ cursor: pointer;
1413
+ text-align: left;
1414
+ color: var(--text-muted);
1415
+ font-size: 12px;
1416
+ transition: background 0.2s;
1417
+ }
1418
+ .tool-header:hover { background: rgba(255,255,255,0.03); }
1419
+ .tool-icon { font-size: 13px; flex-shrink: 0; }
1420
+ .tool-name { flex: 1; font-family: var(--font-mono); font-size: 11px; color: var(--text); }
1421
+ .tool-chevron { font-size: 9px; color: var(--text-dim); }
1422
+
1423
+ .tool-body {
1424
+ max-height: 0;
1425
+ overflow: hidden;
1426
+ transition: max-height 0.3s ease;
1427
+ border-top: 0 solid var(--glass-border);
1428
+ }
1429
+ .tool-body.tool-open { max-height: 320px; overflow-y: auto; border-top-width: 1px; }
1430
+
1431
+ .tool-input {
1432
+ margin: 0;
1433
+ padding: 10px 14px;
1434
+ font-family: var(--font-mono);
1435
+ font-size: 11.5px;
1436
+ line-height: 1.5;
1437
+ color: var(--text-muted);
1438
+ white-space: pre-wrap;
1439
+ word-break: break-all;
1440
+ background: rgba(0,0,0,0.25);
1441
+ }
1442
+
1443
+ /* ── Tool result ────────────────────────────────────────────────────── */
1444
+ .msg-tool-result {
1445
+ margin: 2px 0 6px;
1446
+ border: 1px solid rgba(52,211,153,0.14);
1447
+ border-radius: 8px;
1448
+ overflow: hidden;
1449
+ background: rgba(52,211,153,0.02);
1450
+ }
1451
+
1452
+ .result-header {
1453
+ display: flex;
1454
+ align-items: center;
1455
+ gap: 8px;
1456
+ padding: 6px 12px;
1457
+ font-size: 11px;
1458
+ color: var(--text-dim);
1459
+ }
1460
+ .result-icon { color: var(--accent-green); font-size: 12px; }
1461
+ .result-label { font-family: var(--font-mono); letter-spacing: 0.06em; flex: 1; }
1462
+
1463
+ .result-expand {
1464
+ font-family: var(--font-mono);
1465
+ font-size: 9px;
1466
+ background: transparent;
1467
+ border: 1px solid var(--glass-border);
1468
+ border-radius: 4px;
1469
+ color: var(--text-dim);
1470
+ cursor: pointer;
1471
+ padding: 2px 8px;
1472
+ transition: color 0.2s;
1473
+ }
1474
+ .result-expand:hover { color: var(--text); }
1475
+
1476
+ .result-preview { max-height: 0; overflow: hidden; transition: max-height 0.3s ease; border-top: 0 solid rgba(52,211,153,0.14); }
1477
+ .result-open { max-height: 260px; overflow-y: auto; border-top-width: 1px; }
1478
+
1479
+ .result-text {
1480
+ margin: 0;
1481
+ padding: 8px 14px;
1482
+ font-family: var(--font-mono);
1483
+ font-size: 11.5px;
1484
+ line-height: 1.5;
1485
+ color: var(--text-muted);
1486
+ white-space: pre-wrap;
1487
+ word-break: break-all;
1488
+ background: rgba(0,0,0,0.2);
1489
+ }
1490
+
1491
+ /* ── Message image ──────────────────────────────────────────────────── */
1492
+ .msg-image img {
1493
+ max-width: 100%;
1494
+ border-radius: 8px;
1495
+ border: 1px solid var(--glass-border);
1496
+ margin: 4px 0;
1497
+ }
1498
+
1499
+ /* ── Copy button ────────────────────────────────────────────────────── */
1500
+ .msg-copy-btn {
1501
+ position: absolute;
1502
+ top: 8px;
1503
+ right: 8px;
1504
+ background: rgba(255,255,255,0.06);
1505
+ border: 1px solid var(--glass-border);
1506
+ border-radius: 6px;
1507
+ color: var(--text-dim);
1508
+ cursor: pointer;
1509
+ padding: 5px 6px;
1510
+ opacity: 0;
1511
+ transition: opacity 0.2s, color 0.2s, background 0.2s;
1512
+ display: flex;
1513
+ align-items: center;
1514
+ line-height: 1;
1515
+ }
1516
+ .stream-bubble:hover .msg-copy-btn,
1517
+ .msg-copy-visible { opacity: 1; }
1518
+ .msg-copy-btn:hover { color: var(--text); background: rgba(255,255,255,0.1); }
1519
+ .msg-copy-btn.copied { color: var(--accent-green); }
1520
+
1521
+ /* ── Timestamp ──────────────────────────────────────────────────────── */
1522
+ .msg-timestamp {
1523
+ font-family: var(--font-mono);
1524
+ font-size: 9.5px;
1525
+ color: var(--text-dim);
1526
+ margin-top: 10px;
1527
+ letter-spacing: 0.05em;
1528
+ }
1529
+
1530
+
1531
+ /* ── Task lists ─────────────────────────────────────────────────────── */
1532
+ .msg-text :where(li.task-item) {
1533
+ list-style: none;
1534
+ margin-left: -1.4em;
1535
+ padding-left: 0.2em;
1536
+ display: flex;
1537
+ align-items: baseline;
1538
+ gap: 7px;
1539
+ }
1540
+
1541
+ .task-cb {
1542
+ appearance: none;
1543
+ -webkit-appearance: none;
1544
+ width: 14px;
1545
+ height: 14px;
1546
+ border: 1.5px solid var(--glass-border-strong);
1547
+ border-radius: 3px;
1548
+ background: transparent;
1549
+ flex-shrink: 0;
1550
+ position: relative;
1551
+ top: 2px;
1552
+ cursor: default;
1553
+ }
1554
+
1555
+ .task-cb:checked {
1556
+ background: var(--accent-cyan);
1557
+ border-color: var(--accent-cyan);
1558
+ }
1559
+
1560
+ .task-cb:checked::after {
1561
+ content: '';
1562
+ position: absolute;
1563
+ top: 1px; left: 3px;
1564
+ width: 5px; height: 8px;
1565
+ border: 2px solid #000;
1566
+ border-top: none;
1567
+ border-left: none;
1568
+ transform: rotate(45deg);
1569
+ }
1570
+
1571
+ .task-done > * { opacity: 0.55; }
1572
+ .task-done .task-cb + span,
1573
+ .task-done .task-cb ~ * { text-decoration: line-through; }
1574
+
1575
+ /* ── Table overflow wrapper ──────────────────────────────────────────── */
1576
+ .msg-text :where(table) {
1577
+ display: block;
1578
+ overflow-x: auto;
1579
+ white-space: nowrap;
1580
+ }
1581
+ /* Allow cells to wrap when content isn't too wide */
1582
+ .msg-text :where(th, td) {
1583
+ white-space: normal;
1584
+ min-width: 80px;
1585
+ }
1586
+
1587
+ /* ── Details / Summary (collapsible sections) ─────────────────────────── */
1588
+ .msg-text :where(details) {
1589
+ border: 1px solid var(--glass-border);
1590
+ border-radius: 8px;
1591
+ padding: 0;
1592
+ margin: 0.6em 0;
1593
+ overflow: hidden;
1594
+ background: rgba(255,255,255,0.02);
1595
+ }
1596
+
1597
+ .msg-text :where(summary) {
1598
+ padding: 8px 14px;
1599
+ cursor: pointer;
1600
+ font-weight: 600;
1601
+ font-size: 13px;
1602
+ color: var(--text-muted);
1603
+ list-style: none;
1604
+ display: flex;
1605
+ align-items: center;
1606
+ gap: 8px;
1607
+ user-select: none;
1608
+ transition: background 0.2s;
1609
+ }
1610
+ .msg-text :where(summary):hover { background: rgba(255,255,255,0.03); }
1611
+ .msg-text :where(summary)::before {
1612
+ content: '▸';
1613
+ font-size: 9px;
1614
+ color: var(--accent-cyan);
1615
+ transition: transform 0.2s;
1616
+ }
1617
+ .msg-text :where(details[open] summary)::before {
1618
+ transform: rotate(90deg);
1619
+ }
1620
+ .msg-text :where(details) > *:not(summary) {
1621
+ padding: 0 14px 10px;
1622
+ }
1623
+
1624
+ /* ── Spacing improvements ────────────────────────────────────────────── */
1625
+ .bubble-content + .bubble-content { margin-top: 0.5em; }
1626
+
1627
+ .msg-text :where(h1 + p, h2 + p, h3 + p) { margin-top: 0.4em; }
1628
+ .msg-text :where(p:last-child, ul:last-child, ol:last-child) { margin-bottom: 0; }
1629
+
1630
+ /* Separator after heading when followed by block content */
1631
+ .msg-text :where(h2, h3) {
1632
+ padding-top: 0.3em;
1633
+ }
1634
+
1635
+ /* Better nested list indent */
1636
+ .msg-text :where(ul ul, ol ol, ul ol, ol ul) {
1637
+ margin-top: 0.25em;
1638
+ margin-bottom: 0.25em;
1639
+ padding-left: 1.2em;
1640
+ }
1641
+
1642
+ /* ── Keyboard shortcut styling ───────────────────────────────────────── */
1643
+ .msg-text :where(kbd) {
1644
+ font-family: var(--font-mono);
1645
+ font-size: 0.8em;
1646
+ background: rgba(255,255,255,0.1);
1647
+ border: 1px solid rgba(255,255,255,0.2);
1648
+ border-bottom: 2px solid rgba(255,255,255,0.15);
1649
+ border-radius: 4px;
1650
+ padding: 1px 5px;
1651
+ color: var(--text);
1652
+ }
1653
+
1654
+ /* ── Abbr tooltip ────────────────────────────────────────────────────── */
1655
+ .msg-text :where(abbr[title]) {
1656
+ border-bottom: 1px dotted var(--text-muted);
1657
+ cursor: help;
1658
+ text-decoration: none;
1659
+ }
1660
+
1661
+ /* ── Scrollbar ────────────────────────────────────────────────────── */
1662
+ .response-area::-webkit-scrollbar { display: none; }
1663
+ .response-area { scrollbar-width: none; }
1664
+
1665
+ /* ══════════════════════════════════════════════════════════════════════
1666
+ COMMAND MENU SYSTEM
1667
+ ══════════════════════════════════════════════════════════════════════ */
1668
+
1669
+ /* ── Group accent colours ─────────────────────────────────────────── */
1670
+ :root {
1671
+ --cmd-chat: #00d4ff;
1672
+ --cmd-control: #60a5fa;
1673
+ --cmd-agent: #a78bfa;
1674
+ --cmd-settings: #f59e0b;
1675
+ --cmd-resources: #34d399;
1676
+ }
1677
+
1678
+ /* ── Menu Trigger Button ──────────────────────────────────────────── */
1679
+ .menu-trigger {
1680
+ position: fixed;
1681
+ top: 20px;
1682
+ left: 20px;
1683
+ z-index: 50;
1684
+ width: 38px;
1685
+ height: 38px;
1686
+ display: flex;
1687
+ align-items: center;
1688
+ justify-content: center;
1689
+ background: var(--glass-bg);
1690
+ backdrop-filter: var(--blur);
1691
+ -webkit-backdrop-filter: var(--blur);
1692
+ border: 1px solid var(--glass-border);
1693
+ border-radius: 10px;
1694
+ color: var(--text-muted);
1695
+ cursor: pointer;
1696
+ transition: color 0.2s, border-color 0.2s, box-shadow 0.2s, transform 0.2s;
1697
+ }
1698
+ .menu-trigger:hover {
1699
+ color: var(--accent-cyan);
1700
+ border-color: rgba(0,212,255,0.35);
1701
+ box-shadow: 0 0 12px rgba(0,212,255,0.15);
1702
+ }
1703
+ .menu-trigger:active { transform: scale(0.93); }
1704
+
1705
+ /* Icon swap: grid → close */
1706
+ .menu-icon-close { display: none; }
1707
+ .menu-trigger.menu-open .menu-icon-grid { display: none; }
1708
+ .menu-trigger.menu-open .menu-icon-close { display: block; color: var(--accent-cyan); }
1709
+ .menu-trigger.menu-open {
1710
+ color: var(--accent-cyan);
1711
+ border-color: rgba(0,212,255,0.4);
1712
+ box-shadow: 0 0 16px rgba(0,212,255,0.2);
1713
+ }
1714
+
1715
+ /* ── Full-Screen Overlay ──────────────────────────────────────────── */
1716
+ .cmd-overlay {
1717
+ position: fixed;
1718
+ inset: 0;
1719
+ z-index: 40;
1720
+ display: flex;
1721
+ align-items: center;
1722
+ justify-content: center;
1723
+ /* Hidden state */
1724
+ opacity: 0;
1725
+ pointer-events: none;
1726
+ transform: scale(0.97);
1727
+ transition: opacity 0.28s ease, transform 0.28s ease;
1728
+ }
1729
+ .cmd-overlay.open {
1730
+ opacity: 1;
1731
+ pointer-events: auto;
1732
+ transform: scale(1);
1733
+ }
1734
+
1735
+ /* Dark glass backdrop */
1736
+ .cmd-backdrop {
1737
+ position: absolute;
1738
+ inset: 0;
1739
+ background: rgba(6, 8, 14, 0.9);
1740
+ backdrop-filter: blur(24px);
1741
+ -webkit-backdrop-filter: blur(24px);
1742
+ }
1743
+
1744
+ /* Shell (content on top of backdrop) */
1745
+ .cmd-shell {
1746
+ position: relative;
1747
+ z-index: 1;
1748
+ width: 100%;
1749
+ max-width: 1080px;
1750
+ padding: 0 32px;
1751
+ display: flex;
1752
+ flex-direction: column;
1753
+ gap: 24px;
1754
+ }
1755
+
1756
+ /* ── Header Bar ───────────────────────────────────────────────────── */
1757
+ .cmd-header {
1758
+ display: flex;
1759
+ align-items: center;
1760
+ justify-content: space-between;
1761
+ padding-bottom: 16px;
1762
+ border-bottom: 1px solid var(--glass-border);
1763
+ }
1764
+ .cmd-brand {
1765
+ display: flex;
1766
+ align-items: center;
1767
+ gap: 10px;
1768
+ }
1769
+ .cmd-brand-glyph {
1770
+ font-size: 22px;
1771
+ color: var(--accent-cyan);
1772
+ text-shadow: 0 0 12px var(--accent-cyan);
1773
+ animation: aso-breathe 3s ease-in-out infinite;
1774
+ }
1775
+ .cmd-brand-name {
1776
+ font-family: var(--font-mono);
1777
+ font-size: 18px;
1778
+ font-weight: 700;
1779
+ color: var(--text);
1780
+ letter-spacing: 0.15em;
1781
+ }
1782
+ .cmd-brand-sep {
1783
+ font-size: 16px;
1784
+ color: var(--text-dim);
1785
+ margin: 0 2px;
1786
+ }
1787
+ .cmd-brand-sub {
1788
+ font-family: var(--font-mono);
1789
+ font-size: 11px;
1790
+ color: var(--text-dim);
1791
+ letter-spacing: 0.22em;
1792
+ padding-top: 2px;
1793
+ }
1794
+ .cmd-esc-hint {
1795
+ font-size: 11px;
1796
+ color: var(--text-dim);
1797
+ display: flex;
1798
+ align-items: center;
1799
+ gap: 5px;
1800
+ }
1801
+ .cmd-kbd {
1802
+ font-family: var(--font-mono);
1803
+ font-size: 10px;
1804
+ padding: 2px 6px;
1805
+ background: rgba(255,255,255,0.07);
1806
+ border: 1px solid rgba(255,255,255,0.12);
1807
+ border-radius: 4px;
1808
+ color: var(--text-muted);
1809
+ }
1810
+
1811
+ /* ── Command Grid ─────────────────────────────────────────────────── */
1812
+ .cmd-grid {
1813
+ display: grid;
1814
+ grid-template-columns: 200px 1fr 200px;
1815
+ grid-template-rows: auto auto;
1816
+ gap: 14px;
1817
+ width: 100%;
1818
+ }
1819
+
1820
+ .cmd-group--chat { grid-column: 1; grid-row: 1 / 3; }
1821
+ .cmd-group--control { grid-column: 2; grid-row: 1; }
1822
+ .cmd-group--agent { grid-column: 3; grid-row: 1; }
1823
+ .cmd-group--settings { grid-column: 2; grid-row: 2; }
1824
+ .cmd-group--resources { grid-column: 3; grid-row: 2; }
1825
+
1826
+ /* ── Group Card ───────────────────────────────────────────────────── */
1827
+ .cmd-group {
1828
+ background: var(--glass-bg);
1829
+ border: 1px solid var(--glass-border);
1830
+ border-radius: 16px;
1831
+ padding: 18px;
1832
+ display: flex;
1833
+ flex-direction: column;
1834
+ gap: 14px;
1835
+ /* Stagger-reveal when overlay opens */
1836
+ opacity: 0;
1837
+ transform: translateY(14px);
1838
+ transition: border-color 0.25s, box-shadow 0.25s;
1839
+ }
1840
+ .cmd-overlay.open .cmd-group {
1841
+ animation: cmd-card-in 0.32s ease forwards;
1842
+ }
1843
+ .cmd-overlay.open .cmd-group:nth-child(1) { animation-delay: 30ms; }
1844
+ .cmd-overlay.open .cmd-group:nth-child(2) { animation-delay: 80ms; }
1845
+ .cmd-overlay.open .cmd-group:nth-child(3) { animation-delay: 130ms; }
1846
+ .cmd-overlay.open .cmd-group:nth-child(4) { animation-delay: 180ms; }
1847
+ .cmd-overlay.open .cmd-group:nth-child(5) { animation-delay: 230ms; }
1848
+
1849
+ @keyframes cmd-card-in {
1850
+ from { opacity: 0; transform: translateY(14px); }
1851
+ to { opacity: 1; transform: translateY(0); }
1852
+ }
1853
+
1854
+ /* Per-group accent borders & hover glow */
1855
+ .cmd-group--chat:hover { border-color: rgba(0,212,255,0.35); box-shadow: 0 0 20px rgba(0,212,255,0.06); }
1856
+ .cmd-group--control:hover { border-color: rgba(96,165,250,0.35); box-shadow: 0 0 20px rgba(96,165,250,0.06); }
1857
+ .cmd-group--agent:hover { border-color: rgba(167,139,250,0.35); box-shadow: 0 0 20px rgba(167,139,250,0.06); }
1858
+ .cmd-group--settings:hover { border-color: rgba(245,158,11,0.35); box-shadow: 0 0 20px rgba(245,158,11,0.06); }
1859
+ .cmd-group--resources:hover { border-color: rgba(52,211,153,0.35); box-shadow: 0 0 20px rgba(52,211,153,0.06); }
1860
+
1861
+ /* ── Group Header ─────────────────────────────────────────────────── */
1862
+ .cmd-group-hd {
1863
+ display: flex;
1864
+ align-items: center;
1865
+ gap: 9px;
1866
+ padding-bottom: 10px;
1867
+ border-bottom: 1px solid var(--glass-border);
1868
+ }
1869
+ .cmd-group-svg {
1870
+ width: 16px;
1871
+ height: 16px;
1872
+ flex-shrink: 0;
1873
+ }
1874
+ .cmd-group-label {
1875
+ font-family: var(--font-mono);
1876
+ font-size: 10px;
1877
+ font-weight: 700;
1878
+ letter-spacing: 0.2em;
1879
+ }
1880
+
1881
+ /* Accent colours on group labels and icons */
1882
+ .cmd-group--chat .cmd-group-hd { color: var(--cmd-chat); }
1883
+ .cmd-group--control .cmd-group-hd { color: var(--cmd-control); }
1884
+ .cmd-group--agent .cmd-group-hd { color: var(--cmd-agent); }
1885
+ .cmd-group--settings .cmd-group-hd { color: var(--cmd-settings); }
1886
+ .cmd-group--resources .cmd-group-hd { color: var(--cmd-resources); }
1887
+
1888
+ /* ── Items List ───────────────────────────────────────────────────── */
1889
+ .cmd-items {
1890
+ display: flex;
1891
+ flex-direction: column;
1892
+ gap: 6px;
1893
+ flex: 1;
1894
+ }
1895
+
1896
+ /* 3-column sub-grid for CONTROL (6 items) */
1897
+ .cmd-items--grid {
1898
+ display: grid;
1899
+ grid-template-columns: 1fr 1fr 1fr;
1900
+ gap: 8px;
1901
+ }
1902
+
1903
+ /* ── Individual Item ──────────────────────────────────────────────── */
1904
+ .cmd-item {
1905
+ display: flex;
1906
+ align-items: center;
1907
+ gap: 10px;
1908
+ padding: 10px 12px;
1909
+ border-radius: 10px;
1910
+ border: 1px solid transparent;
1911
+ background: rgba(255,255,255,0.025);
1912
+ text-decoration: none;
1913
+ cursor: pointer;
1914
+ transition: background 0.18s, border-color 0.18s, transform 0.15s;
1915
+ }
1916
+ .cmd-item:hover {
1917
+ background: rgba(255,255,255,0.06);
1918
+ transform: translateY(-1px);
1919
+ }
1920
+ /* Per-group item hover accent */
1921
+ .cmd-group--chat .cmd-item:hover { border-color: rgba(0,212,255,0.3); }
1922
+ .cmd-group--control .cmd-item:hover { border-color: rgba(96,165,250,0.3); }
1923
+ .cmd-group--agent .cmd-item:hover { border-color: rgba(167,139,250,0.3); }
1924
+ .cmd-group--settings .cmd-item:hover { border-color: rgba(245,158,11,0.3); }
1925
+ .cmd-group--resources .cmd-item:hover { border-color: rgba(52,211,153,0.3); }
1926
+
1927
+ .cmd-item-icon {
1928
+ font-size: 16px;
1929
+ flex-shrink: 0;
1930
+ width: 20px;
1931
+ text-align: center;
1932
+ opacity: 0.7;
1933
+ }
1934
+ .cmd-group--chat .cmd-item-icon { color: var(--cmd-chat); }
1935
+ .cmd-group--control .cmd-item-icon { color: var(--cmd-control); }
1936
+ .cmd-group--agent .cmd-item-icon { color: var(--cmd-agent); }
1937
+ .cmd-group--settings .cmd-item-icon { color: var(--cmd-settings); }
1938
+ .cmd-group--resources .cmd-item-icon { color: var(--cmd-resources); }
1939
+
1940
+ .cmd-item-body {
1941
+ display: flex;
1942
+ flex-direction: column;
1943
+ gap: 2px;
1944
+ min-width: 0;
1945
+ flex: 1;
1946
+ }
1947
+ .cmd-item-name {
1948
+ font-family: var(--font-mono);
1949
+ font-size: 12px;
1950
+ font-weight: 600;
1951
+ color: var(--text);
1952
+ white-space: nowrap;
1953
+ overflow: hidden;
1954
+ text-overflow: ellipsis;
1955
+ }
1956
+ .cmd-item-desc {
1957
+ font-size: 10px;
1958
+ color: var(--text-dim);
1959
+ white-space: nowrap;
1960
+ overflow: hidden;
1961
+ text-overflow: ellipsis;
1962
+ }
1963
+ .cmd-item-badge {
1964
+ font-family: var(--font-mono);
1965
+ font-size: 8px;
1966
+ font-weight: 700;
1967
+ letter-spacing: 0.1em;
1968
+ padding: 2px 6px;
1969
+ border-radius: 99px;
1970
+ background: rgba(0,212,255,0.12);
1971
+ color: var(--accent-cyan);
1972
+ border: 1px solid rgba(0,212,255,0.25);
1973
+ flex-shrink: 0;
1974
+ }
1975
+
1976
+ /* ── History button ─────────────────────────────────────────────────── */
1977
+ .history-btn {
1978
+ display: flex; align-items: center; gap: 5px;
1979
+ padding: 6px 10px;
1980
+ background: rgba(139,92,246,0.08);
1981
+ border: 1px solid rgba(139,92,246,0.2);
1982
+ border-radius: 8px;
1983
+ color: rgba(139,92,246,0.85);
1984
+ font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.08em; font-weight: 600;
1985
+ cursor: pointer; transition: all 0.2s; white-space: nowrap;
1986
+ }
1987
+ .history-btn:hover {
1988
+ background: rgba(139,92,246,0.16);
1989
+ border-color: rgba(139,92,246,0.4);
1990
+ box-shadow: 0 0 12px rgba(139,92,246,0.12);
1991
+ }
1992
+ .history-btn-label { font-size: 10px; }
1993
+
1994
+ /* ── History overlay + drawer ───────────────────────────────────────── */
1995
+ .history-overlay {
1996
+ position: fixed; inset: 0; z-index: 1100;
1997
+ background: rgba(0,0,0,0.55);
1998
+ backdrop-filter: blur(4px);
1999
+ opacity: 0; pointer-events: none;
2000
+ transition: opacity 0.25s ease;
2001
+ }
2002
+ .history-overlay.open { opacity: 1; pointer-events: auto; }
2003
+
2004
+ .history-drawer {
2005
+ position: fixed; top: 0; right: -440px; height: 100vh; width: 420px;
2006
+ z-index: 1101;
2007
+ background: rgba(10,12,20,0.97);
2008
+ border-left: 1px solid rgba(139,92,246,0.25);
2009
+ box-shadow: -20px 0 60px rgba(0,0,0,0.6);
2010
+ display: flex; flex-direction: column;
2011
+ transition: right 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2012
+ }
2013
+ .history-drawer.open { right: 0; }
2014
+
2015
+ .history-drawer-header {
2016
+ display: flex; align-items: center; justify-content: space-between;
2017
+ padding: 16px 18px 14px;
2018
+ border-bottom: 1px solid rgba(139,92,246,0.15);
2019
+ flex-shrink: 0;
2020
+ }
2021
+ .history-drawer-title {
2022
+ display: flex; align-items: center; gap: 7px;
2023
+ font-family: var(--font-mono); font-size: 11px; font-weight: 700;
2024
+ letter-spacing: 0.14em; color: rgba(139,92,246,0.9);
2025
+ }
2026
+ .history-close-btn {
2027
+ background: none; border: none; color: var(--text-dim);
2028
+ font-size: 13px; cursor: pointer; padding: 4px 6px; border-radius: 4px;
2029
+ transition: color 0.15s, background 0.15s;
2030
+ }
2031
+ .history-close-btn:hover { color: var(--text-primary); background: rgba(255,255,255,0.06); }
2032
+
2033
+ .history-drawer-body {
2034
+ flex: 1; overflow-y: auto; padding: 12px 0;
2035
+ }
2036
+ .history-drawer-body::-webkit-scrollbar { width: 4px; }
2037
+ .history-drawer-body::-webkit-scrollbar-track { background: transparent; }
2038
+ .history-drawer-body::-webkit-scrollbar-thumb { background: rgba(139,92,246,0.3); border-radius: 2px; }
2039
+
2040
+ .history-loading {
2041
+ padding: 24px 18px;
2042
+ color: var(--text-dim);
2043
+ font-size: 12px; font-family: var(--font-mono);
2044
+ text-align: center;
2045
+ }
2046
+
2047
+ /* ── Session list items ─────────────────────────────────────────────── */
2048
+ .history-session-item {
2049
+ padding: 12px 18px;
2050
+ cursor: pointer;
2051
+ border-bottom: 1px solid rgba(255,255,255,0.04);
2052
+ transition: background 0.15s;
2053
+ position: relative;
2054
+ }
2055
+ .history-session-item:hover { background: rgba(139,92,246,0.07); }
2056
+ .history-session-item:last-child { border-bottom: none; }
2057
+
2058
+ .history-session-meta {
2059
+ display: flex; align-items: center; justify-content: space-between;
2060
+ margin-bottom: 5px;
2061
+ }
2062
+ .history-session-date {
2063
+ font-family: var(--font-mono); font-size: 10px; font-weight: 600;
2064
+ color: rgba(139,92,246,0.8); letter-spacing: 0.06em;
2065
+ }
2066
+ .history-session-count {
2067
+ font-family: var(--font-mono); font-size: 9px;
2068
+ color: var(--text-dim); letter-spacing: 0.05em;
2069
+ }
2070
+ .history-session-preview {
2071
+ font-size: 12px; color: var(--text-secondary);
2072
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
2073
+ line-height: 1.4;
2074
+ }
2075
+ .history-session-badge {
2076
+ display: inline-block; margin-bottom: 4px;
2077
+ font-family: var(--font-mono); font-size: 9px; font-weight: 700;
2078
+ letter-spacing: 0.1em; padding: 2px 6px; border-radius: 99px;
2079
+ }
2080
+ .history-session-badge.live {
2081
+ background: rgba(0,212,255,0.12); color: var(--accent-cyan);
2082
+ border: 1px solid rgba(0,212,255,0.25);
2083
+ }
2084
+ .history-session-badge.archived {
2085
+ background: rgba(139,92,246,0.1); color: rgba(139,92,246,0.7);
2086
+ border: 1px solid rgba(139,92,246,0.2);
2087
+ }
2088
+
2089
+ /* ── Archive viewer banner ──────────────────────────────────────────── */
2090
+ .archive-banner {
2091
+ display: flex; align-items: center; justify-content: space-between;
2092
+ padding: 10px 14px; margin: 0 0 8px;
2093
+ background: rgba(139,92,246,0.1);
2094
+ border-bottom: 1px solid rgba(139,92,246,0.2);
2095
+ flex-shrink: 0;
2096
+ }
2097
+ .archive-banner-label {
2098
+ font-family: var(--font-mono); font-size: 10px;
2099
+ color: rgba(139,92,246,0.8); letter-spacing: 0.08em;
2100
+ }
2101
+ .archive-banner-back {
2102
+ font-family: var(--font-mono); font-size: 10px; font-weight: 600;
2103
+ color: rgba(139,92,246,0.9); cursor: pointer;
2104
+ background: none; border: none; padding: 3px 8px;
2105
+ border: 1px solid rgba(139,92,246,0.3); border-radius: 6px;
2106
+ transition: all 0.15s;
2107
+ }
2108
+ .archive-banner-back:hover { background: rgba(139,92,246,0.15); }
2109
+
2110
+ .history-transcript {
2111
+ flex: 1; overflow-y: auto; padding: 8px 12px;
2112
+ }
2113
+ .history-transcript::-webkit-scrollbar { width: 4px; }
2114
+ .history-transcript::-webkit-scrollbar-thumb { background: rgba(139,92,246,0.3); border-radius: 2px; }
2115
+
2116
+ .history-msg {
2117
+ margin-bottom: 12px; font-size: 12.5px; line-height: 1.5;
2118
+ }
2119
+ .history-msg-role {
2120
+ font-family: var(--font-mono); font-size: 9px; font-weight: 700;
2121
+ letter-spacing: 0.1em; margin-bottom: 3px;
2122
+ }
2123
+ .history-msg-role.user { color: var(--accent-cyan); }
2124
+ .history-msg-role.assistant { color: rgba(139,92,246,0.8); }
2125
+ .history-msg-text {
2126
+ color: var(--text-secondary); padding: 6px 10px;
2127
+ background: rgba(255,255,255,0.025);
2128
+ border-radius: 6px; border-left: 2px solid rgba(255,255,255,0.08);
2129
+ white-space: pre-wrap; word-break: break-word;
2130
+ }
2131
+ .history-msg.assistant .history-msg-text {
2132
+ border-left-color: rgba(139,92,246,0.3);
2133
+ }
2134
+ .history-msg.user .history-msg-text {
2135
+ border-left-color: rgba(0,212,255,0.25);
2136
+ }
2137
+
2138
+ .history-empty {
2139
+ padding: 32px 18px; text-align: center;
2140
+ color: var(--text-dim); font-size: 12px; font-family: var(--font-mono);
2141
+ }
2142
+
2143
+ /* ── Archive toast ──────────────────────────────────────────────────── */
2144
+ .session-archive-toast {
2145
+ position: fixed; bottom: 80px; left: 50%; transform: translateX(-50%) translateY(20px);
2146
+ z-index: 1200;
2147
+ display: flex; align-items: center; gap: 7px;
2148
+ padding: 8px 16px;
2149
+ background: rgba(15,17,28,0.95);
2150
+ border: 1px solid rgba(139,92,246,0.35);
2151
+ border-radius: 99px;
2152
+ font-size: 11.5px; font-family: var(--font-mono); color: var(--text-secondary);
2153
+ box-shadow: 0 4px 24px rgba(0,0,0,0.5), 0 0 20px rgba(139,92,246,0.08);
2154
+ opacity: 0; pointer-events: none;
2155
+ transition: opacity 0.25s ease, transform 0.25s ease;
2156
+ white-space: nowrap;
2157
+ }
2158
+ .session-archive-toast.show {
2159
+ opacity: 1; pointer-events: auto; transform: translateX(-50%) translateY(0);
2160
+ }
2161
+ #session-archive-link {
2162
+ color: rgba(139,92,246,0.9); cursor: pointer; font-weight: 600;
2163
+ text-decoration: underline; text-underline-offset: 2px;
2164
+ }
2165
+ #session-archive-link:hover { color: rgba(139,92,246,1); }