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