dextunnel 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/LICENSE +211 -0
  2. package/README.md +112 -0
  3. package/SECURITY.md +27 -0
  4. package/SUPPORT.md +43 -0
  5. package/package.json +44 -0
  6. package/public/client-shared.js +1831 -0
  7. package/public/favicon.svg +11 -0
  8. package/public/host.html +29 -0
  9. package/public/host.js +2079 -0
  10. package/public/index.html +28 -0
  11. package/public/index.js +98 -0
  12. package/public/live-bridge-lifecycle.js +258 -0
  13. package/public/live-bridge-retry-state.js +61 -0
  14. package/public/live-selection-intent.js +79 -0
  15. package/public/remote-operator-state.js +316 -0
  16. package/public/remote.html +167 -0
  17. package/public/remote.js +3967 -0
  18. package/public/styles.css +2793 -0
  19. package/public/surface-view-state.js +89 -0
  20. package/public/voice-dictation.js +45 -0
  21. package/src/bin/desktop-rehydration-smoke.mjs +111 -0
  22. package/src/bin/dextunnel.mjs +41 -0
  23. package/src/bin/doctor.mjs +48 -0
  24. package/src/bin/launch-attest.mjs +39 -0
  25. package/src/bin/launch-status.mjs +49 -0
  26. package/src/bin/mobile-link-proxy.mjs +221 -0
  27. package/src/bin/mobile-proof.mjs +164 -0
  28. package/src/bin/mobile-transport-smoke.mjs +200 -0
  29. package/src/bin/probe-codex-app-server-write.mjs +36 -0
  30. package/src/bin/probe-codex-app-server.mjs +30 -0
  31. package/src/lib/agent-room-context.mjs +54 -0
  32. package/src/lib/agent-room-runtime.mjs +355 -0
  33. package/src/lib/agent-room-service.mjs +335 -0
  34. package/src/lib/agent-room-state.mjs +406 -0
  35. package/src/lib/agent-room-store.mjs +71 -0
  36. package/src/lib/agent-room-text.mjs +48 -0
  37. package/src/lib/app-server-contract.mjs +66 -0
  38. package/src/lib/app-server-runtime.mjs +60 -0
  39. package/src/lib/attachment-service.mjs +119 -0
  40. package/src/lib/bridge-api-handler.mjs +719 -0
  41. package/src/lib/bridge-runtime-lifecycle.mjs +51 -0
  42. package/src/lib/bridge-status-builder.mjs +60 -0
  43. package/src/lib/codex-app-server-client.mjs +1511 -0
  44. package/src/lib/companion-state.mjs +453 -0
  45. package/src/lib/control-lease-service.mjs +180 -0
  46. package/src/lib/debug-harness-service.mjs +173 -0
  47. package/src/lib/desktop-integration.mjs +146 -0
  48. package/src/lib/desktop-rehydration-smoke.mjs +269 -0
  49. package/src/lib/dextunnel-cli.mjs +122 -0
  50. package/src/lib/discovery-docs.mjs +1321 -0
  51. package/src/lib/fake-codex-app-server-bridge.mjs +340 -0
  52. package/src/lib/install-preflight.mjs +373 -0
  53. package/src/lib/interaction-resolution-service.mjs +185 -0
  54. package/src/lib/interaction-state.mjs +360 -0
  55. package/src/lib/launch-release-bar.mjs +158 -0
  56. package/src/lib/live-control-state.mjs +107 -0
  57. package/src/lib/live-payload-builder.mjs +298 -0
  58. package/src/lib/live-selection-transition-state.mjs +49 -0
  59. package/src/lib/live-transcript-state.mjs +549 -0
  60. package/src/lib/mobile-network-profile.mjs +39 -0
  61. package/src/lib/mock-codex-adapter.mjs +62 -0
  62. package/src/lib/operator-diagnostics.mjs +82 -0
  63. package/src/lib/repo-changes-service.mjs +527 -0
  64. package/src/lib/runtime-config.mjs +106 -0
  65. package/src/lib/selection-state-service.mjs +214 -0
  66. package/src/lib/session-store.mjs +355 -0
  67. package/src/lib/shared-room-state.mjs +473 -0
  68. package/src/lib/shared-selection-state.mjs +40 -0
  69. package/src/lib/sse-hub.mjs +35 -0
  70. package/src/lib/static-surface-service.mjs +71 -0
  71. package/src/lib/surface-access.mjs +189 -0
  72. package/src/lib/surface-presence-service.mjs +118 -0
  73. package/src/lib/surface-request-guard.mjs +52 -0
  74. package/src/lib/thread-sync-state.mjs +536 -0
  75. package/src/lib/watcher-lifecycle.mjs +287 -0
  76. package/src/server.mjs +1446 -0
@@ -0,0 +1,2793 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --bg: #060c12;
4
+ --bg-deep: #09111a;
5
+ --panel: rgba(10, 19, 29, 0.96);
6
+ --panel-raised: rgba(14, 25, 38, 0.92);
7
+ --panel-soft: rgba(18, 32, 46, 0.78);
8
+ --border: rgba(93, 146, 89, 0.32);
9
+ --border-bright: rgba(131, 255, 96, 0.5);
10
+ --accent: #7cff47;
11
+ --accent-strong: #efffe3;
12
+ --accent-soft: rgba(124, 255, 71, 0.14);
13
+ --sidebar-group-accent: #f4d86c;
14
+ --danger: #ff8492;
15
+ --danger-soft: rgba(255, 132, 146, 0.14);
16
+ --text: #d8e3ec;
17
+ --text-strong: #f3fbff;
18
+ --text-dim: #91a7b7;
19
+ --text-muted: #6e8495;
20
+ --shadow: 0 20px 60px rgba(0, 0, 0, 0.34);
21
+ --font-ui: "Avenir Next", "SF Pro Display", "Segoe UI", sans-serif;
22
+ --font-mono: "Fura Mono", "Fira Code", "SFMono-Regular", Consolas, monospace;
23
+ }
24
+
25
+ * {
26
+ box-sizing: border-box;
27
+ }
28
+
29
+ html,
30
+ body {
31
+ margin: 0;
32
+ min-height: 100%;
33
+ }
34
+
35
+ html {
36
+ -webkit-text-size-adjust: 100%;
37
+ }
38
+
39
+ body {
40
+ color: var(--text);
41
+ font-family: var(--font-ui);
42
+ background:
43
+ radial-gradient(circle at top, rgba(48, 104, 39, 0.14), transparent 34%),
44
+ radial-gradient(circle at 85% 20%, rgba(72, 131, 49, 0.08), transparent 24%),
45
+ linear-gradient(180deg, #08131d 0%, #050a0f 100%);
46
+ position: relative;
47
+ }
48
+
49
+ body::before {
50
+ content: "";
51
+ position: fixed;
52
+ inset: 0;
53
+ pointer-events: none;
54
+ background:
55
+ repeating-linear-gradient(
56
+ 180deg,
57
+ rgba(124, 255, 71, 0.028) 0,
58
+ rgba(124, 255, 71, 0.028) 1px,
59
+ transparent 1px,
60
+ transparent 5px
61
+ );
62
+ opacity: 0.4;
63
+ }
64
+
65
+ .landing-shell {
66
+ min-height: 100vh;
67
+ padding: 28px;
68
+ }
69
+
70
+ .landing-grid {
71
+ display: grid;
72
+ gap: 18px;
73
+ max-width: 1180px;
74
+ margin: 0 auto;
75
+ }
76
+
77
+ .panel {
78
+ border: 1px solid var(--border);
79
+ background: linear-gradient(180deg, rgba(10, 18, 28, 0.94), rgba(8, 14, 20, 0.96));
80
+ box-shadow: var(--shadow);
81
+ padding: 22px 24px;
82
+ }
83
+
84
+ .hero-panel {
85
+ display: grid;
86
+ gap: 14px;
87
+ }
88
+
89
+ .info-panel {
90
+ display: grid;
91
+ gap: 14px;
92
+ }
93
+
94
+ .eyebrow {
95
+ margin: 0;
96
+ font-family: var(--font-mono);
97
+ font-size: 11px;
98
+ letter-spacing: 0.18em;
99
+ text-transform: uppercase;
100
+ color: var(--accent);
101
+ }
102
+
103
+ .hero-panel h1,
104
+ .info-panel h2 {
105
+ margin: 0;
106
+ font-family: var(--font-mono);
107
+ color: var(--text-strong);
108
+ }
109
+
110
+ .hero-panel h1 {
111
+ max-width: 18ch;
112
+ font-size: clamp(2rem, 4vw, 3.4rem);
113
+ line-height: 0.98;
114
+ letter-spacing: 0.04em;
115
+ text-transform: uppercase;
116
+ }
117
+
118
+ .info-panel h2 {
119
+ font-size: clamp(1rem, 2vw, 1.35rem);
120
+ letter-spacing: 0.08em;
121
+ text-transform: uppercase;
122
+ }
123
+
124
+ .lede,
125
+ .landing-meta {
126
+ margin: 0;
127
+ max-width: 60rem;
128
+ color: var(--text-dim);
129
+ line-height: 1.65;
130
+ }
131
+
132
+ .hero-actions {
133
+ display: flex;
134
+ flex-wrap: wrap;
135
+ gap: 10px;
136
+ }
137
+
138
+ .cta {
139
+ display: inline-flex;
140
+ align-items: center;
141
+ justify-content: center;
142
+ min-height: 42px;
143
+ padding: 0 16px;
144
+ border: 1px solid rgba(124, 255, 71, 0.35);
145
+ background: rgba(22, 43, 30, 0.82);
146
+ color: var(--accent-strong);
147
+ text-decoration: none;
148
+ text-transform: uppercase;
149
+ letter-spacing: 0.12em;
150
+ font-family: var(--font-mono);
151
+ font-size: 12px;
152
+ }
153
+
154
+ .cta:hover,
155
+ .cta:focus-visible {
156
+ border-color: var(--border-bright);
157
+ background: rgba(29, 55, 37, 0.94);
158
+ outline: none;
159
+ }
160
+
161
+ .cta-subtle {
162
+ background: rgba(10, 18, 28, 0.78);
163
+ }
164
+
165
+ .install-panel {
166
+ gap: 16px;
167
+ }
168
+
169
+ .install-panel-head {
170
+ display: flex;
171
+ justify-content: space-between;
172
+ align-items: flex-start;
173
+ gap: 16px;
174
+ }
175
+
176
+ .install-summary {
177
+ max-width: none;
178
+ }
179
+
180
+ .landing-status-badge {
181
+ display: inline-flex;
182
+ align-items: center;
183
+ min-height: 30px;
184
+ padding: 5px 10px;
185
+ border: 1px solid rgba(96, 131, 151, 0.18);
186
+ background: rgba(10, 18, 28, 0.78);
187
+ color: var(--text-dim);
188
+ font-family: var(--font-mono);
189
+ font-size: 11px;
190
+ letter-spacing: 0.14em;
191
+ text-transform: uppercase;
192
+ white-space: nowrap;
193
+ }
194
+
195
+ .landing-status-badge.is-ready {
196
+ border-color: rgba(124, 255, 71, 0.34);
197
+ background: rgba(22, 43, 30, 0.82);
198
+ color: var(--accent-strong);
199
+ }
200
+
201
+ .landing-status-badge.is-warning,
202
+ .landing-status-badge.is-loading {
203
+ border-color: rgba(255, 217, 139, 0.3);
204
+ background: rgba(39, 31, 13, 0.78);
205
+ color: #ffe1a5;
206
+ }
207
+
208
+ .landing-status-badge.is-error {
209
+ border-color: rgba(255, 132, 146, 0.34);
210
+ background: rgba(46, 19, 25, 0.82);
211
+ color: #ffd3da;
212
+ }
213
+
214
+ .preflight-grid {
215
+ display: grid;
216
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
217
+ gap: 12px;
218
+ }
219
+
220
+ .preflight-card {
221
+ display: grid;
222
+ gap: 8px;
223
+ padding: 14px;
224
+ border: 1px solid rgba(96, 131, 151, 0.18);
225
+ background: rgba(10, 18, 28, 0.78);
226
+ }
227
+
228
+ .preflight-card.is-ready {
229
+ border-color: rgba(124, 255, 71, 0.24);
230
+ background: rgba(16, 29, 20, 0.84);
231
+ }
232
+
233
+ .preflight-card.is-warning {
234
+ border-color: rgba(255, 217, 139, 0.22);
235
+ background: rgba(33, 28, 14, 0.84);
236
+ }
237
+
238
+ .preflight-card.is-error {
239
+ border-color: rgba(255, 132, 146, 0.24);
240
+ background: rgba(38, 18, 22, 0.86);
241
+ }
242
+
243
+ .preflight-card-label {
244
+ margin: 0;
245
+ font-family: var(--font-mono);
246
+ font-size: 11px;
247
+ letter-spacing: 0.14em;
248
+ text-transform: uppercase;
249
+ color: var(--text-strong);
250
+ }
251
+
252
+ .preflight-card-detail {
253
+ margin: 0;
254
+ color: var(--text-dim);
255
+ line-height: 1.5;
256
+ }
257
+
258
+ .plain-list {
259
+ margin: 0;
260
+ padding-left: 18px;
261
+ display: grid;
262
+ gap: 8px;
263
+ color: var(--text-dim);
264
+ }
265
+
266
+ .numbered-list {
267
+ padding-left: 22px;
268
+ }
269
+
270
+ .command-block {
271
+ display: grid;
272
+ gap: 8px;
273
+ padding: 14px;
274
+ border: 1px solid rgba(96, 131, 151, 0.18);
275
+ background: rgba(8, 17, 25, 0.96);
276
+ }
277
+
278
+ .command-block-title {
279
+ margin: 0;
280
+ font-family: var(--font-mono);
281
+ font-size: 11px;
282
+ letter-spacing: 0.14em;
283
+ text-transform: uppercase;
284
+ color: var(--text-muted);
285
+ }
286
+
287
+ .command-block code {
288
+ font-family: var(--font-mono);
289
+ color: var(--text-strong);
290
+ }
291
+
292
+ a {
293
+ color: inherit;
294
+ }
295
+
296
+ button,
297
+ input,
298
+ select,
299
+ textarea {
300
+ font: inherit;
301
+ color: inherit;
302
+ }
303
+
304
+ button,
305
+ select,
306
+ summary,
307
+ textarea,
308
+ input[type="text"],
309
+ input[type="password"] {
310
+ touch-action: manipulation;
311
+ -webkit-tap-highlight-color: transparent;
312
+ }
313
+
314
+ button {
315
+ cursor: pointer;
316
+ }
317
+
318
+ select,
319
+ textarea,
320
+ input[type="text"],
321
+ input[type="password"] {
322
+ width: 100%;
323
+ margin: 0;
324
+ border: 1px solid var(--border);
325
+ background: rgba(8, 17, 25, 0.96);
326
+ color: var(--text-strong);
327
+ -webkit-text-fill-color: var(--text-strong);
328
+ padding: 13px 14px;
329
+ outline: none;
330
+ }
331
+
332
+ textarea::placeholder,
333
+ input[type="text"]::placeholder,
334
+ input[type="password"]::placeholder {
335
+ color: var(--text-muted);
336
+ -webkit-text-fill-color: var(--text-muted);
337
+ opacity: 1;
338
+ }
339
+
340
+ select:focus,
341
+ textarea:focus,
342
+ input[type="text"]:focus,
343
+ input[type="password"]:focus {
344
+ border-color: var(--border-bright);
345
+ box-shadow: inset 0 0 0 1px rgba(137, 228, 195, 0.25);
346
+ }
347
+
348
+ select {
349
+ appearance: none;
350
+ padding-right: 42px;
351
+ background-image:
352
+ linear-gradient(45deg, transparent 50%, var(--text-dim) 50%),
353
+ linear-gradient(135deg, var(--text-dim) 50%, transparent 50%);
354
+ background-position:
355
+ calc(100% - 18px) calc(50% - 2px),
356
+ calc(100% - 12px) calc(50% - 2px);
357
+ background-size: 6px 6px, 6px 6px;
358
+ background-repeat: no-repeat;
359
+ }
360
+
361
+ option {
362
+ background: #09131b;
363
+ color: var(--text-strong);
364
+ -webkit-text-fill-color: var(--text-strong);
365
+ }
366
+
367
+ option:checked,
368
+ option:hover,
369
+ option:focus {
370
+ background: #173142;
371
+ color: var(--text-strong);
372
+ }
373
+
374
+ textarea {
375
+ min-height: 124px;
376
+ resize: vertical;
377
+ line-height: 1.6;
378
+ font-family: var(--font-mono);
379
+ }
380
+
381
+ .app-shell {
382
+ min-height: 100vh;
383
+ padding: 24px;
384
+ }
385
+
386
+ .terminal-shell {
387
+ max-width: 980px;
388
+ margin: 0 auto;
389
+ }
390
+
391
+ .remote-shell-main {
392
+ max-width: 1320px;
393
+ }
394
+
395
+ .host-terminal {
396
+ max-width: 1180px;
397
+ }
398
+
399
+ .host-layout-grid {
400
+ display: grid;
401
+ grid-template-columns: minmax(320px, 0.9fr) minmax(0, 1.45fr);
402
+ gap: 0;
403
+ }
404
+
405
+ .host-admin-column,
406
+ .host-mirror-column {
407
+ display: grid;
408
+ align-content: start;
409
+ }
410
+
411
+ .host-admin-column {
412
+ border-right: 1px solid rgba(47, 85, 108, 0.26);
413
+ background: linear-gradient(180deg, rgba(8, 15, 23, 0.7), rgba(8, 14, 20, 0.42));
414
+ }
415
+
416
+ .host-mirror-column {
417
+ background: linear-gradient(180deg, rgba(8, 14, 20, 0.28), rgba(7, 12, 18, 0.2));
418
+ }
419
+
420
+ .terminal-window {
421
+ position: relative;
422
+ border: 1px solid var(--border);
423
+ background: linear-gradient(180deg, rgba(10, 18, 28, 0.97), rgba(6, 12, 18, 0.98));
424
+ box-shadow: var(--shadow);
425
+ }
426
+
427
+ .terminal-window::after {
428
+ content: "";
429
+ position: absolute;
430
+ inset: 0;
431
+ pointer-events: none;
432
+ background:
433
+ linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent 22%),
434
+ linear-gradient(90deg, transparent, rgba(124, 255, 71, 0.03), transparent);
435
+ opacity: 0.9;
436
+ }
437
+
438
+ .remote-window {
439
+ display: grid;
440
+ grid-template-columns: minmax(236px, 280px) minmax(0, 1fr);
441
+ align-items: start;
442
+ overflow: hidden;
443
+ }
444
+
445
+ .remote-window:not(.is-sidebar-open) {
446
+ grid-template-columns: 0 minmax(0, 1fr);
447
+ }
448
+
449
+ .remote-window:not(.is-sidebar-open) .remote-sidebar {
450
+ opacity: 0;
451
+ pointer-events: none;
452
+ padding-left: 0;
453
+ padding-right: 0;
454
+ border-right: 0;
455
+ }
456
+
457
+ .remote-main {
458
+ min-width: 0;
459
+ display: grid;
460
+ align-content: start;
461
+ }
462
+
463
+ .remote-sidebar-overlay {
464
+ display: none;
465
+ }
466
+
467
+ .remote-sidebar {
468
+ position: relative;
469
+ z-index: 1;
470
+ display: grid;
471
+ align-content: start;
472
+ gap: 14px;
473
+ min-height: 100%;
474
+ padding: 16px 12px 18px;
475
+ border-right: 1px solid rgba(47, 85, 108, 0.34);
476
+ background: linear-gradient(180deg, rgba(9, 15, 23, 0.96), rgba(7, 12, 18, 0.98));
477
+ overflow: hidden;
478
+ }
479
+
480
+ .remote-sidebar-head {
481
+ display: grid;
482
+ gap: 2px;
483
+ padding: 2px 6px 0;
484
+ }
485
+
486
+ .remote-sidebar-kicker {
487
+ margin: 0;
488
+ font-family: var(--font-mono);
489
+ font-size: 11px;
490
+ letter-spacing: 0.18em;
491
+ text-transform: uppercase;
492
+ color: var(--accent);
493
+ }
494
+
495
+ .remote-sidebar-note {
496
+ margin: 0;
497
+ font-size: 11px;
498
+ color: var(--text-muted);
499
+ }
500
+
501
+ .remote-sidebar-groups {
502
+ display: grid;
503
+ gap: 14px;
504
+ }
505
+
506
+ .remote-sidebar-group {
507
+ display: grid;
508
+ gap: 6px;
509
+ }
510
+
511
+ .remote-sidebar-group-label {
512
+ margin: 0;
513
+ padding: 0 6px;
514
+ font-family: var(--font-mono);
515
+ font-size: 11px;
516
+ font-weight: 700;
517
+ letter-spacing: 0.12em;
518
+ text-transform: uppercase;
519
+ color: var(--sidebar-group-accent);
520
+ text-shadow: 0 0 16px rgba(244, 216, 108, 0.16);
521
+ }
522
+
523
+ .remote-sidebar-group.is-active .remote-sidebar-group-label {
524
+ color: var(--sidebar-group-accent);
525
+ }
526
+
527
+ .remote-thread-list {
528
+ display: grid;
529
+ gap: 4px;
530
+ }
531
+
532
+ .remote-thread-row {
533
+ display: grid;
534
+ gap: 3px;
535
+ width: 100%;
536
+ min-height: 0;
537
+ padding: 8px 10px;
538
+ border: 1px solid rgba(96, 131, 151, 0.18);
539
+ background: rgba(10, 18, 28, 0.78);
540
+ text-align: left;
541
+ color: var(--text);
542
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.02);
543
+ }
544
+
545
+ .remote-thread-row:hover:not(:disabled),
546
+ .remote-thread-row:focus-visible {
547
+ border-color: rgba(124, 255, 71, 0.28);
548
+ background: linear-gradient(180deg, rgba(22, 35, 48, 0.98), rgba(13, 22, 32, 0.96));
549
+ color: var(--text-strong);
550
+ outline: none;
551
+ }
552
+
553
+ .remote-thread-row.is-selected {
554
+ border-color: rgba(124, 255, 71, 0.34);
555
+ background: rgba(22, 43, 30, 0.82);
556
+ box-shadow:
557
+ inset 0 0 0 1px rgba(124, 255, 71, 0.08),
558
+ 0 6px 18px rgba(0, 0, 0, 0.12);
559
+ }
560
+
561
+ .remote-thread-row.is-pending {
562
+ border-color: rgba(137, 228, 195, 0.6);
563
+ }
564
+
565
+ .remote-thread-row-title {
566
+ min-width: 0;
567
+ overflow: hidden;
568
+ text-overflow: ellipsis;
569
+ white-space: nowrap;
570
+ font-size: 13px;
571
+ line-height: 1.2;
572
+ color: var(--text-strong);
573
+ }
574
+
575
+ .remote-thread-row-meta {
576
+ display: flex;
577
+ justify-content: space-between;
578
+ align-items: baseline;
579
+ gap: 8px;
580
+ min-width: 0;
581
+ font-family: var(--font-mono);
582
+ font-size: 10px;
583
+ letter-spacing: 0.08em;
584
+ color: var(--text-dim);
585
+ text-transform: uppercase;
586
+ }
587
+
588
+ .remote-sidebar-empty {
589
+ padding: 10px 12px;
590
+ border: 1px solid rgba(96, 131, 151, 0.18);
591
+ background: rgba(10, 18, 28, 0.78);
592
+ font-size: 12px;
593
+ color: var(--text-dim);
594
+ }
595
+
596
+ .terminal-hero,
597
+ .terminal-panel {
598
+ position: relative;
599
+ z-index: 1;
600
+ }
601
+
602
+ .window-lights,
603
+ .terminal-dot {
604
+ display: none;
605
+ }
606
+
607
+ .terminal-path,
608
+ .terminal-kicker,
609
+ .terminal-marquee,
610
+ .status-chip,
611
+ .section-kicker,
612
+ .inline-status,
613
+ .card-label,
614
+ .card-time,
615
+ .card-note,
616
+ .selector-control span,
617
+ .composer-status,
618
+ .command-preview,
619
+ .question-help,
620
+ .terminal-block,
621
+ .empty-card,
622
+ .attachment-copy span,
623
+ .attachment-remove {
624
+ font-family: var(--font-mono);
625
+ }
626
+
627
+ .terminal-path {
628
+ font-size: 11px;
629
+ letter-spacing: 0.18em;
630
+ text-transform: uppercase;
631
+ color: var(--text-dim);
632
+ }
633
+
634
+ .terminal-hero {
635
+ display: grid;
636
+ gap: 4px;
637
+ padding: 10px 16px 8px;
638
+ border-bottom: 1px solid var(--border);
639
+ }
640
+
641
+ .remote-hero {
642
+ gap: 6px;
643
+ }
644
+
645
+ .remote-hero-row {
646
+ display: flex;
647
+ justify-content: space-between;
648
+ align-items: flex-start;
649
+ gap: 12px;
650
+ }
651
+
652
+ .remote-hero-primary {
653
+ display: flex;
654
+ align-items: center;
655
+ gap: 10px;
656
+ min-width: 0;
657
+ }
658
+
659
+ .remote-hero-copy {
660
+ display: grid;
661
+ gap: 4px;
662
+ min-width: 0;
663
+ }
664
+
665
+ .remote-top-actions {
666
+ align-items: center;
667
+ justify-content: flex-end;
668
+ }
669
+
670
+ .sidebar-toggle-button {
671
+ min-height: 31px;
672
+ gap: 8px;
673
+ padding: 0 10px;
674
+ }
675
+
676
+ .hamburger-icon {
677
+ display: grid;
678
+ gap: 3px;
679
+ width: 12px;
680
+ }
681
+
682
+ .hamburger-icon span {
683
+ display: block;
684
+ width: 12px;
685
+ height: 1.5px;
686
+ border-radius: 999px;
687
+ background: currentColor;
688
+ }
689
+
690
+ .sidebar-toggle-label {
691
+ white-space: nowrap;
692
+ }
693
+
694
+ .host-hero {
695
+ gap: 6px;
696
+ padding-top: 12px;
697
+ padding-bottom: 10px;
698
+ }
699
+
700
+ .terminal-kicker,
701
+ .section-kicker {
702
+ margin: 0;
703
+ font-size: 11px;
704
+ letter-spacing: 0.18em;
705
+ text-transform: uppercase;
706
+ color: var(--accent);
707
+ }
708
+
709
+ .terminal-statusline {
710
+ display: grid;
711
+ grid-template-columns: minmax(0, 1fr);
712
+ align-items: center;
713
+ gap: 10px;
714
+ min-height: 14px;
715
+ }
716
+
717
+ .terminal-marquee {
718
+ display: block;
719
+ min-width: 0;
720
+ overflow: hidden;
721
+ text-overflow: ellipsis;
722
+ white-space: nowrap;
723
+ font-size: 11px;
724
+ line-height: 1.2;
725
+ letter-spacing: 0.16em;
726
+ text-transform: uppercase;
727
+ color: var(--accent);
728
+ transition:
729
+ opacity 180ms ease,
730
+ transform 180ms ease,
731
+ filter 180ms ease;
732
+ will-change: opacity, transform;
733
+ }
734
+
735
+ .terminal-marquee.is-static:not(.is-busy) {
736
+ animation: none;
737
+ }
738
+
739
+ .terminal-marquee.is-busy {
740
+ color: var(--accent-strong);
741
+ text-shadow: 0 0 18px rgba(124, 255, 71, 0.2);
742
+ animation: marqueePulse 1.15s ease-in-out infinite;
743
+ }
744
+
745
+ .terminal-marquee::after {
746
+ content: "_";
747
+ margin-left: 3px;
748
+ animation: caretBlink 1.1s steps(1, end) infinite;
749
+ }
750
+
751
+ .terminal-marquee.is-busy::after {
752
+ content: "...";
753
+ display: inline-block;
754
+ width: 0;
755
+ overflow: hidden;
756
+ vertical-align: baseline;
757
+ animation: marqueeDots 1.15s steps(4, end) infinite;
758
+ }
759
+
760
+ .terminal-marquee.is-static:not(.is-busy)::after {
761
+ content: "";
762
+ animation: none;
763
+ }
764
+
765
+ .status-chip,
766
+ .inline-status {
767
+ display: inline-flex;
768
+ align-items: center;
769
+ gap: 6px;
770
+ min-height: 30px;
771
+ padding: 6px 10px;
772
+ border: 1px solid var(--border);
773
+ background: var(--panel-raised);
774
+ font-size: 12px;
775
+ letter-spacing: 0.12em;
776
+ text-transform: uppercase;
777
+ color: var(--accent-strong);
778
+ }
779
+
780
+ .terminal-hero h1 {
781
+ margin: 0;
782
+ font-family: var(--font-mono);
783
+ font-size: clamp(0.95rem, 2vw, 1.2rem);
784
+ line-height: 1.08;
785
+ letter-spacing: 0.12em;
786
+ text-transform: uppercase;
787
+ color: var(--accent-strong);
788
+ }
789
+
790
+ .host-hero h1 {
791
+ font-size: clamp(0.95rem, 1.7vw, 1.15rem);
792
+ letter-spacing: 0.1em;
793
+ }
794
+
795
+ .terminal-subline {
796
+ margin: 0;
797
+ max-width: 48rem;
798
+ font-size: 10px;
799
+ line-height: 1.2;
800
+ color: var(--text-dim);
801
+ overflow: hidden;
802
+ text-overflow: ellipsis;
803
+ white-space: nowrap;
804
+ }
805
+
806
+ .host-hero .terminal-subline {
807
+ max-width: none;
808
+ font-size: 11px;
809
+ }
810
+
811
+ .participant-roster {
812
+ display: flex;
813
+ flex-wrap: nowrap;
814
+ gap: 5px;
815
+ margin-top: 1px;
816
+ overflow-x: auto;
817
+ scrollbar-width: none;
818
+ }
819
+
820
+ .participant-roster::-webkit-scrollbar {
821
+ display: none;
822
+ }
823
+
824
+ .participant-pill {
825
+ display: inline-flex;
826
+ align-items: center;
827
+ gap: 8px;
828
+ min-height: 22px;
829
+ padding: 0 7px;
830
+ border: 1px solid rgba(96, 131, 151, 0.18);
831
+ background: rgba(10, 18, 28, 0.76);
832
+ font-family: var(--font-mono);
833
+ font-size: 10px;
834
+ letter-spacing: 0.08em;
835
+ text-transform: uppercase;
836
+ color: var(--text-dim);
837
+ white-space: nowrap;
838
+ }
839
+
840
+ .participant-pill-label {
841
+ color: var(--text-strong);
842
+ }
843
+
844
+ .participant-pill-meta {
845
+ color: var(--text-muted);
846
+ }
847
+
848
+ .participant-pill.is-dormant {
849
+ opacity: 0.82;
850
+ }
851
+
852
+ .participant-pill.is-ready {
853
+ border-color: rgba(124, 255, 71, 0.24);
854
+ background: rgba(16, 29, 20, 0.84);
855
+ }
856
+
857
+ .participant-pill.is-ready .participant-pill-meta {
858
+ color: #9cff84;
859
+ }
860
+
861
+ .participant-pill.is-keyboard {
862
+ border-color: rgba(124, 255, 71, 0.36);
863
+ background: rgba(22, 43, 30, 0.82);
864
+ }
865
+
866
+ .participant-pill.is-keyboard .participant-pill-meta {
867
+ color: var(--accent);
868
+ }
869
+
870
+ .participant-pill-accent .participant-pill-label {
871
+ color: #8ddcff;
872
+ }
873
+
874
+ .participant-pill-remote .participant-pill-label {
875
+ color: #73ff73;
876
+ }
877
+
878
+ .participant-pill-desktop .participant-pill-label {
879
+ color: #ffd98b;
880
+ }
881
+
882
+ .participant-pill-claude .participant-pill-label {
883
+ color: #ffdd92;
884
+ }
885
+
886
+ .participant-pill-spark .participant-pill-label {
887
+ color: #ff8fd8;
888
+ }
889
+
890
+ .participant-pill-nix .participant-pill-label {
891
+ color: #7ce7ff;
892
+ }
893
+
894
+ .participant-pill-tool .participant-pill-label {
895
+ color: #8cdab9;
896
+ }
897
+
898
+ .participant-pill-updates .participant-pill-label,
899
+ .participant-pill-system .participant-pill-label {
900
+ color: var(--accent);
901
+ }
902
+
903
+ .terminal-panel {
904
+ display: grid;
905
+ gap: 14px;
906
+ padding: 18px 24px;
907
+ border-top: 1px solid rgba(47, 85, 108, 0.34);
908
+ background: linear-gradient(180deg, rgba(10, 18, 28, 0.88), rgba(8, 15, 23, 0.82));
909
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.015);
910
+ overflow: hidden;
911
+ }
912
+
913
+ .remote-status-panel {
914
+ gap: 10px;
915
+ padding-top: 12px;
916
+ padding-bottom: 12px;
917
+ }
918
+
919
+ .host-admin-panel,
920
+ .host-feed-panel,
921
+ .host-debug {
922
+ align-content: start;
923
+ }
924
+
925
+ .host-admin-panel,
926
+ .host-debug,
927
+ .host-admin-column .terminal-panel:last-child {
928
+ border-top-color: rgba(47, 85, 108, 0.28);
929
+ }
930
+
931
+ .host-admin-panel .section-head h2,
932
+ .host-feed-panel .section-head h2 {
933
+ font-size: 17px;
934
+ }
935
+
936
+ .host-admin-actions {
937
+ align-items: center;
938
+ }
939
+
940
+ .host-admin-actions .command-button {
941
+ flex: 0 0 auto;
942
+ }
943
+
944
+ .host-feed-panel .feed-list {
945
+ gap: 10px;
946
+ }
947
+
948
+ .host-feed-panel .transcript-card,
949
+ .host-feed-panel .command-card {
950
+ padding: 12px 14px 14px;
951
+ }
952
+
953
+ .host-feed-panel .card-clamped .transcript-copy {
954
+ -webkit-line-clamp: 2;
955
+ }
956
+
957
+ .host-feed-panel .transcript-copy {
958
+ font-size: 14px;
959
+ line-height: 1.64;
960
+ }
961
+
962
+ .host-shell .participant-roster {
963
+ display: none !important;
964
+ }
965
+
966
+ .host-shell .sync-note {
967
+ max-width: 42rem;
968
+ }
969
+
970
+ .panel-emphasis {
971
+ border-top-color: rgba(124, 255, 71, 0.28);
972
+ background:
973
+ linear-gradient(180deg, rgba(20, 33, 28, 0.9), rgba(9, 16, 22, 0.92)),
974
+ linear-gradient(90deg, rgba(124, 255, 71, 0.05), transparent 30%);
975
+ box-shadow:
976
+ inset 0 0 0 1px rgba(124, 255, 71, 0.16),
977
+ 0 10px 24px rgba(0, 0, 0, 0.16);
978
+ }
979
+
980
+ .panel-emphasis::before {
981
+ content: "";
982
+ position: absolute;
983
+ inset: 0 auto auto 0;
984
+ width: 100%;
985
+ height: 2px;
986
+ background: linear-gradient(90deg, rgba(124, 255, 71, 0.72), rgba(124, 255, 71, 0.12));
987
+ pointer-events: none;
988
+ z-index: 1;
989
+ }
990
+
991
+ .selector-grid {
992
+ display: grid;
993
+ grid-template-columns: repeat(2, minmax(0, 1fr));
994
+ gap: 12px;
995
+ }
996
+
997
+ .selector-grid-remote {
998
+ grid-template-columns: minmax(170px, 0.9fr) minmax(230px, 1.25fr) auto;
999
+ align-items: end;
1000
+ gap: 10px;
1001
+ }
1002
+
1003
+ .selector-control {
1004
+ display: grid;
1005
+ gap: 8px;
1006
+ }
1007
+
1008
+ .selector-control span {
1009
+ font-size: 11px;
1010
+ letter-spacing: 0.18em;
1011
+ text-transform: uppercase;
1012
+ color: var(--text-dim);
1013
+ }
1014
+
1015
+ .selector-grid-remote .selector-control {
1016
+ gap: 5px;
1017
+ }
1018
+
1019
+ .selector-grid-remote .selector-control span {
1020
+ font-size: 10px;
1021
+ letter-spacing: 0.14em;
1022
+ }
1023
+
1024
+ .selector-grid-remote .selector-control select {
1025
+ min-height: 44px;
1026
+ padding: 9px 12px;
1027
+ padding-right: 36px;
1028
+ font-size: 15px;
1029
+ }
1030
+
1031
+ .selector-actions {
1032
+ display: flex;
1033
+ align-items: flex-end;
1034
+ min-height: 44px;
1035
+ }
1036
+
1037
+ .control-row,
1038
+ .section-head {
1039
+ display: flex;
1040
+ justify-content: space-between;
1041
+ align-items: flex-start;
1042
+ gap: 14px;
1043
+ flex-wrap: wrap;
1044
+ }
1045
+
1046
+ .control-row-secondary {
1047
+ align-items: center;
1048
+ margin-top: 6px;
1049
+ }
1050
+
1051
+ .toolbar-strip,
1052
+ .filter-group {
1053
+ flex-wrap: nowrap;
1054
+ overflow-x: auto;
1055
+ scrollbar-width: none;
1056
+ }
1057
+
1058
+ .toolbar-strip::-webkit-scrollbar,
1059
+ .filter-group::-webkit-scrollbar {
1060
+ display: none;
1061
+ }
1062
+
1063
+ .control-label {
1064
+ margin: 0;
1065
+ font-size: 11px;
1066
+ letter-spacing: 0.18em;
1067
+ text-transform: uppercase;
1068
+ color: var(--text-dim);
1069
+ }
1070
+
1071
+ .section-head h2 {
1072
+ margin: 2px 0 0;
1073
+ font-size: 21px;
1074
+ line-height: 1.08;
1075
+ color: var(--text-strong);
1076
+ }
1077
+
1078
+ .filter-group,
1079
+ .button-row {
1080
+ display: flex;
1081
+ flex-wrap: wrap;
1082
+ gap: 8px;
1083
+ }
1084
+
1085
+ .toolbar-strip {
1086
+ align-items: center;
1087
+ gap: 7px;
1088
+ }
1089
+
1090
+ .selector-actions .toolbar-strip {
1091
+ gap: 6px;
1092
+ }
1093
+
1094
+ .selector-actions .command-button {
1095
+ min-height: 44px;
1096
+ }
1097
+
1098
+ .selector-actions .command-button-compact {
1099
+ min-height: 44px;
1100
+ }
1101
+
1102
+ .feed-tools {
1103
+ display: grid;
1104
+ grid-template-columns: minmax(0, 1fr) auto;
1105
+ align-items: center;
1106
+ gap: 8px;
1107
+ width: 100%;
1108
+ }
1109
+
1110
+ .feed-tools .filter-group {
1111
+ min-width: 0;
1112
+ justify-content: flex-end;
1113
+ }
1114
+
1115
+ #expand-all-button {
1116
+ margin-left: 0;
1117
+ width: 12ch;
1118
+ min-width: 12ch;
1119
+ justify-content: center;
1120
+ justify-self: end;
1121
+ white-space: nowrap;
1122
+ }
1123
+
1124
+ .feed-head {
1125
+ justify-content: flex-start;
1126
+ align-items: center;
1127
+ min-height: 0;
1128
+ padding-top: 2px;
1129
+ }
1130
+
1131
+ .remote-feed-panel {
1132
+ gap: 10px;
1133
+ padding-top: 12px;
1134
+ }
1135
+
1136
+ .filter-button,
1137
+ .attachment-picker,
1138
+ .attachment-remove {
1139
+ display: inline-flex;
1140
+ align-items: center;
1141
+ justify-content: center;
1142
+ }
1143
+
1144
+ .command-button,
1145
+ .attachment-picker,
1146
+ .attachment-remove {
1147
+ display: inline-flex;
1148
+ align-items: center;
1149
+ justify-content: center;
1150
+ border: 1px solid rgba(111, 160, 137, 0.2);
1151
+ background: linear-gradient(180deg, rgba(20, 31, 43, 0.98), rgba(12, 20, 29, 0.94));
1152
+ color: var(--text);
1153
+ min-height: 37px;
1154
+ padding: 0 14px;
1155
+ font-size: 12px;
1156
+ letter-spacing: 0.06em;
1157
+ text-transform: uppercase;
1158
+ box-shadow:
1159
+ inset 0 1px 0 rgba(255, 255, 255, 0.03),
1160
+ 0 4px 14px rgba(0, 0, 0, 0.14);
1161
+ transition:
1162
+ border-color 120ms ease,
1163
+ background 120ms ease,
1164
+ color 120ms ease,
1165
+ transform 120ms ease,
1166
+ box-shadow 120ms ease;
1167
+ }
1168
+
1169
+ .command-button-compact {
1170
+ min-height: 31px;
1171
+ padding: 0 10px;
1172
+ font-size: 10px;
1173
+ letter-spacing: 0.12em;
1174
+ }
1175
+
1176
+ .command-button-subtle {
1177
+ border-color: rgba(96, 131, 151, 0.2);
1178
+ background: rgba(10, 18, 28, 0.74);
1179
+ color: var(--text-dim);
1180
+ }
1181
+
1182
+ .command-button-subtle:hover:not(:disabled),
1183
+ .command-button-subtle:focus-visible {
1184
+ color: var(--text);
1185
+ }
1186
+
1187
+ .filter-button {
1188
+ gap: 7px;
1189
+ border: 1px solid rgba(96, 131, 151, 0.18);
1190
+ background: rgba(10, 18, 28, 0.76);
1191
+ color: var(--text-dim);
1192
+ min-height: 24px;
1193
+ padding: 0 8px;
1194
+ font-size: 10px;
1195
+ letter-spacing: 0.04em;
1196
+ text-transform: uppercase;
1197
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.02);
1198
+ }
1199
+
1200
+ .command-button.is-busy,
1201
+ .filter-button.is-busy,
1202
+ .attachment-picker.is-busy,
1203
+ .attachment-remove.is-busy {
1204
+ border-color: rgba(137, 228, 195, 0.72);
1205
+ color: var(--accent-strong);
1206
+ }
1207
+
1208
+ .command-button.is-busy::before,
1209
+ .filter-button.is-busy::before,
1210
+ .attachment-picker.is-busy::before,
1211
+ .attachment-remove.is-busy::before {
1212
+ content: "";
1213
+ width: 7px;
1214
+ height: 7px;
1215
+ margin-right: 8px;
1216
+ border-radius: 999px;
1217
+ background: currentColor;
1218
+ animation: status-pulse 1s ease-in-out infinite;
1219
+ }
1220
+
1221
+ .filter-button.is-active {
1222
+ border-color: rgba(124, 255, 71, 0.34);
1223
+ background: rgba(22, 43, 30, 0.82);
1224
+ color: var(--accent-strong);
1225
+ box-shadow:
1226
+ inset 0 0 0 1px rgba(124, 255, 71, 0.08),
1227
+ 0 6px 18px rgba(0, 0, 0, 0.12);
1228
+ }
1229
+
1230
+ .command-button:hover,
1231
+ .filter-button:hover,
1232
+ .attachment-picker:hover,
1233
+ .attachment-remove:hover {
1234
+ border-color: rgba(124, 255, 71, 0.28);
1235
+ background: linear-gradient(180deg, rgba(22, 35, 48, 0.98), rgba(13, 22, 32, 0.96));
1236
+ color: var(--text-strong);
1237
+ }
1238
+
1239
+ .command-button:active,
1240
+ .filter-button:active,
1241
+ .attachment-picker:active,
1242
+ .attachment-remove:active {
1243
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.02);
1244
+ }
1245
+
1246
+ .command-button:focus-visible,
1247
+ .filter-button:focus-visible,
1248
+ .attachment-picker:focus-visible,
1249
+ .attachment-remove:focus-visible {
1250
+ outline: 1px solid rgba(124, 255, 71, 0.48);
1251
+ outline-offset: 1px;
1252
+ }
1253
+
1254
+ .button-primary {
1255
+ border-color: rgba(124, 255, 71, 0.34);
1256
+ background: linear-gradient(180deg, rgba(34, 63, 33, 0.95), rgba(18, 34, 18, 0.96));
1257
+ color: var(--accent-strong);
1258
+ box-shadow:
1259
+ inset 0 0 0 1px rgba(124, 255, 71, 0.12),
1260
+ 0 8px 22px rgba(10, 24, 10, 0.24);
1261
+ }
1262
+
1263
+ .button-primary:hover {
1264
+ background: linear-gradient(180deg, rgba(42, 78, 40, 0.98), rgba(22, 43, 22, 0.98));
1265
+ }
1266
+
1267
+ .button-danger {
1268
+ border-color: rgba(255, 132, 146, 0.28);
1269
+ background: linear-gradient(180deg, rgba(63, 26, 35, 0.95), rgba(34, 16, 21, 0.96));
1270
+ color: #ffd7de;
1271
+ }
1272
+
1273
+ .button-danger:hover {
1274
+ background: rgba(255, 132, 146, 0.2);
1275
+ }
1276
+
1277
+ .command-button:disabled,
1278
+ .filter-button:disabled,
1279
+ .attachment-picker:disabled,
1280
+ .attachment-remove:disabled {
1281
+ opacity: 0.52;
1282
+ cursor: not-allowed;
1283
+ transform: none;
1284
+ }
1285
+
1286
+ .terminal-block,
1287
+ .empty-card,
1288
+ .transcript-card,
1289
+ .command-card,
1290
+ .question-field,
1291
+ .attachment-chip,
1292
+ .change-card {
1293
+ border: 1px solid var(--border);
1294
+ background: var(--panel-soft);
1295
+ }
1296
+
1297
+ .terminal-block,
1298
+ .empty-card {
1299
+ padding: 15px;
1300
+ color: var(--text-dim);
1301
+ }
1302
+
1303
+ .stacked-form {
1304
+ display: grid;
1305
+ gap: 14px;
1306
+ }
1307
+
1308
+ .feed-list,
1309
+ .command-log,
1310
+ .question-list,
1311
+ .attachment-list,
1312
+ .changes-list {
1313
+ display: grid;
1314
+ gap: 8px;
1315
+ }
1316
+
1317
+ .history-sentinel {
1318
+ height: 1px;
1319
+ margin: 0;
1320
+ pointer-events: none;
1321
+ }
1322
+
1323
+ .transcript-card,
1324
+ .command-card {
1325
+ padding: 10px 12px 11px;
1326
+ border-left: 2px solid transparent;
1327
+ }
1328
+
1329
+ .card-expandable {
1330
+ cursor: pointer;
1331
+ }
1332
+
1333
+ .card-expandable:hover {
1334
+ border-color: var(--border-bright);
1335
+ }
1336
+
1337
+ .transcript-assistant {
1338
+ border-left-color: #68bfe9;
1339
+ }
1340
+
1341
+ .transcript-user {
1342
+ border-left-color: #eac97f;
1343
+ }
1344
+
1345
+ .transcript-system,
1346
+ .transcript-tool,
1347
+ .transcript-commentary {
1348
+ border-left-color: #7bc0a7;
1349
+ }
1350
+
1351
+ .transcript-marker {
1352
+ border-left-width: 0;
1353
+ border-color: rgba(92, 190, 154, 0.2);
1354
+ background: linear-gradient(180deg, rgba(18, 31, 36, 0.94), rgba(12, 23, 26, 0.98));
1355
+ padding: 11px 14px 12px;
1356
+ }
1357
+
1358
+ .transcript-marker .card-head {
1359
+ margin-bottom: 4px;
1360
+ }
1361
+
1362
+ .transcript-marker .card-meta {
1363
+ justify-content: center;
1364
+ }
1365
+
1366
+ .transcript-marker .card-label,
1367
+ .transcript-marker .card-note,
1368
+ .transcript-marker .card-time {
1369
+ color: #8cdab9;
1370
+ }
1371
+
1372
+ .transcript-marker .transcript-copy {
1373
+ font-size: 13px;
1374
+ line-height: 1.55;
1375
+ text-align: center;
1376
+ color: var(--text-dim);
1377
+ }
1378
+
1379
+ .transcript-control-marker {
1380
+ border-color: rgba(104, 191, 233, 0.22);
1381
+ background: linear-gradient(180deg, rgba(12, 23, 34, 0.95), rgba(10, 18, 28, 0.99));
1382
+ }
1383
+
1384
+ .transcript-control-marker .card-label,
1385
+ .transcript-control-marker .card-note,
1386
+ .transcript-control-marker .card-time {
1387
+ color: #86cdea;
1388
+ }
1389
+
1390
+ .transcript-surface-marker {
1391
+ border-color: rgba(91, 220, 187, 0.2);
1392
+ background: linear-gradient(180deg, rgba(11, 28, 28, 0.95), rgba(9, 22, 23, 0.99));
1393
+ }
1394
+
1395
+ .transcript-surface-marker .card-label,
1396
+ .transcript-surface-marker .card-note,
1397
+ .transcript-surface-marker .card-time {
1398
+ color: #7fe0c0;
1399
+ }
1400
+
1401
+ .card-head {
1402
+ display: flex;
1403
+ justify-content: space-between;
1404
+ align-items: center;
1405
+ gap: 10px;
1406
+ margin-bottom: 4px;
1407
+ }
1408
+
1409
+ .card-meta {
1410
+ display: inline-flex;
1411
+ align-items: baseline;
1412
+ gap: 8px;
1413
+ min-width: 0;
1414
+ flex-wrap: wrap;
1415
+ flex: 1 1 auto;
1416
+ }
1417
+
1418
+ .card-tail {
1419
+ display: inline-flex;
1420
+ align-items: center;
1421
+ gap: 7px;
1422
+ flex: 0 0 auto;
1423
+ min-width: 0;
1424
+ }
1425
+
1426
+ .card-label {
1427
+ font-size: 11px;
1428
+ letter-spacing: 0.12em;
1429
+ text-transform: uppercase;
1430
+ color: var(--text-dim);
1431
+ opacity: 1;
1432
+ }
1433
+
1434
+ .card-origin {
1435
+ display: inline-flex;
1436
+ align-items: center;
1437
+ border: 1px solid rgba(115, 255, 115, 0.28);
1438
+ background: rgba(17, 43, 24, 0.84);
1439
+ color: #73ff73;
1440
+ min-height: 20px;
1441
+ padding: 0 6px;
1442
+ font-size: 10px;
1443
+ letter-spacing: 0.16em;
1444
+ text-transform: uppercase;
1445
+ }
1446
+
1447
+ .card-time {
1448
+ font-size: 10px;
1449
+ letter-spacing: 0.12em;
1450
+ text-transform: uppercase;
1451
+ color: var(--text-muted);
1452
+ white-space: nowrap;
1453
+ }
1454
+
1455
+ .card-expand-hint {
1456
+ font-family: var(--font-mono);
1457
+ font-size: 11px;
1458
+ letter-spacing: 0.16em;
1459
+ text-transform: uppercase;
1460
+ color: var(--text-muted);
1461
+ }
1462
+
1463
+ .card-note {
1464
+ margin-bottom: 6px;
1465
+ font-size: 10px;
1466
+ letter-spacing: 0.14em;
1467
+ text-transform: uppercase;
1468
+ color: var(--text-muted);
1469
+ }
1470
+
1471
+ .transcript-origin-remote .card-label {
1472
+ color: #73ff73;
1473
+ }
1474
+
1475
+ .participant-codex .card-label {
1476
+ color: #8ddcff;
1477
+ }
1478
+
1479
+ .participant-remote .card-label {
1480
+ color: #73ff73;
1481
+ }
1482
+
1483
+ .participant-desktop .card-label {
1484
+ color: #ffd98b;
1485
+ }
1486
+
1487
+ .participant-claude .card-label {
1488
+ color: #ffdd92;
1489
+ }
1490
+
1491
+ .participant-spark .card-label {
1492
+ color: #ff8fd8;
1493
+ }
1494
+
1495
+ .participant-nix .card-label {
1496
+ color: #7ce7ff;
1497
+ }
1498
+
1499
+ .participant-updates .card-label,
1500
+ .participant-system .card-label {
1501
+ color: var(--accent);
1502
+ }
1503
+
1504
+ .participant-tool .card-label {
1505
+ color: #8cdab9;
1506
+ }
1507
+
1508
+ .transcript-copy {
1509
+ color: var(--text-strong);
1510
+ font-family: var(--font-mono);
1511
+ font-size: 14px;
1512
+ line-height: 1.55;
1513
+ overflow-wrap: anywhere;
1514
+ }
1515
+
1516
+ .transcript-copy p {
1517
+ margin: 0 0 10px;
1518
+ }
1519
+
1520
+ .transcript-copy p:last-child {
1521
+ margin-bottom: 0;
1522
+ }
1523
+
1524
+ .card-actions {
1525
+ display: flex;
1526
+ flex-wrap: wrap;
1527
+ gap: 8px;
1528
+ margin-top: 12px;
1529
+ }
1530
+
1531
+ .transcript-action {
1532
+ display: inline-flex;
1533
+ align-items: center;
1534
+ justify-content: center;
1535
+ min-height: 24px;
1536
+ padding: 0 8px;
1537
+ border: 1px solid rgba(96, 131, 151, 0.18);
1538
+ background: rgba(12, 21, 31, 0.82);
1539
+ font-family: var(--font-mono);
1540
+ font-size: 10px;
1541
+ letter-spacing: 0.12em;
1542
+ text-transform: uppercase;
1543
+ color: var(--text-dim);
1544
+ transition:
1545
+ border-color 120ms ease,
1546
+ background 120ms ease,
1547
+ color 120ms ease;
1548
+ }
1549
+
1550
+ .transcript-action:hover {
1551
+ border-color: rgba(124, 255, 71, 0.28);
1552
+ color: var(--text-strong);
1553
+ }
1554
+
1555
+ .transcript-action:focus-visible {
1556
+ outline: 1px solid rgba(124, 255, 71, 0.48);
1557
+ outline-offset: 1px;
1558
+ }
1559
+
1560
+ .transcript-action.is-busy {
1561
+ border-color: rgba(137, 228, 195, 0.72);
1562
+ color: var(--accent-strong);
1563
+ }
1564
+
1565
+ .transcript-action.is-busy::before {
1566
+ content: "";
1567
+ width: 6px;
1568
+ height: 6px;
1569
+ margin-right: 7px;
1570
+ border-radius: 999px;
1571
+ background: currentColor;
1572
+ animation: status-pulse 1s ease-in-out infinite;
1573
+ }
1574
+
1575
+ .transcript-action:disabled {
1576
+ opacity: 0.62;
1577
+ cursor: not-allowed;
1578
+ }
1579
+
1580
+ .transcript-action.is-danger {
1581
+ border-color: rgba(255, 132, 146, 0.22);
1582
+ color: #ffd7de;
1583
+ }
1584
+
1585
+ .transcript-action.is-success {
1586
+ border-color: rgba(124, 255, 71, 0.24);
1587
+ color: var(--accent-strong);
1588
+ }
1589
+
1590
+ .card-clamped .transcript-copy {
1591
+ display: -webkit-box;
1592
+ -webkit-box-orient: vertical;
1593
+ -webkit-line-clamp: 3;
1594
+ overflow: hidden;
1595
+ }
1596
+
1597
+ .card-clamp-1 .transcript-copy {
1598
+ -webkit-line-clamp: 1;
1599
+ }
1600
+
1601
+ .card-clamp-3 .transcript-copy {
1602
+ -webkit-line-clamp: 3;
1603
+ }
1604
+
1605
+ .transcript-copy code,
1606
+ .command-preview {
1607
+ border: 1px solid rgba(87, 133, 161, 0.38);
1608
+ background: rgba(8, 18, 28, 0.92);
1609
+ color: var(--accent-strong);
1610
+ }
1611
+
1612
+ .inline-link,
1613
+ .transcript-copy a {
1614
+ color: var(--accent);
1615
+ text-decoration: none;
1616
+ }
1617
+
1618
+ .transcript-copy code {
1619
+ padding: 1px 5px;
1620
+ }
1621
+
1622
+ .command-preview {
1623
+ margin: 10px 0 0;
1624
+ padding: 12px;
1625
+ overflow-x: auto;
1626
+ white-space: pre-wrap;
1627
+ font-size: 12px;
1628
+ line-height: 1.55;
1629
+ }
1630
+
1631
+ .question-field {
1632
+ display: grid;
1633
+ gap: 8px;
1634
+ padding: 12px;
1635
+ }
1636
+
1637
+ .interaction-flow {
1638
+ display: grid;
1639
+ gap: 4px;
1640
+ margin-bottom: 10px;
1641
+ padding: 10px 12px;
1642
+ border: 1px solid rgba(124, 255, 71, 0.16);
1643
+ background: rgba(12, 24, 17, 0.86);
1644
+ }
1645
+
1646
+ .interaction-flow-label,
1647
+ .interaction-flow-copy {
1648
+ margin: 0;
1649
+ }
1650
+
1651
+ .interaction-flow-label {
1652
+ font-size: 11px;
1653
+ letter-spacing: 0.16em;
1654
+ text-transform: uppercase;
1655
+ color: var(--accent);
1656
+ }
1657
+
1658
+ .interaction-flow-copy {
1659
+ font-size: 12px;
1660
+ line-height: 1.55;
1661
+ color: var(--text-dim);
1662
+ }
1663
+
1664
+ .question-help {
1665
+ font-size: 11px;
1666
+ line-height: 1.5;
1667
+ letter-spacing: 0.08em;
1668
+ text-transform: uppercase;
1669
+ color: var(--text-dim);
1670
+ }
1671
+
1672
+ .composer-status {
1673
+ margin: 0;
1674
+ font-size: 12px;
1675
+ letter-spacing: 0.16em;
1676
+ text-transform: uppercase;
1677
+ color: var(--text-dim);
1678
+ }
1679
+
1680
+ .ui-status {
1681
+ margin: 10px 0 0;
1682
+ min-height: 13px;
1683
+ font-family: var(--font-mono);
1684
+ font-size: 10px;
1685
+ letter-spacing: 0.12em;
1686
+ text-transform: uppercase;
1687
+ color: var(--text-dim);
1688
+ }
1689
+
1690
+ .sync-note {
1691
+ margin: 10px 0 0;
1692
+ font-family: var(--font-mono);
1693
+ font-size: 10px;
1694
+ letter-spacing: 0.1em;
1695
+ line-height: 1.45;
1696
+ text-transform: uppercase;
1697
+ color: var(--text-dim);
1698
+ }
1699
+
1700
+ .desktop-recovery-shell {
1701
+ display: grid;
1702
+ gap: 8px;
1703
+ justify-items: start;
1704
+ }
1705
+
1706
+ .desktop-restart-confirm {
1707
+ display: grid;
1708
+ gap: 8px;
1709
+ padding: 10px 12px;
1710
+ border: 1px solid rgba(255, 132, 146, 0.18);
1711
+ background: rgba(34, 16, 21, 0.52);
1712
+ }
1713
+
1714
+ .desktop-restart-confirm .sync-note {
1715
+ margin: 0;
1716
+ color: #ffd7de;
1717
+ }
1718
+
1719
+ .operator-diagnostics {
1720
+ display: flex;
1721
+ flex-wrap: wrap;
1722
+ gap: 6px;
1723
+ margin-top: 6px;
1724
+ }
1725
+
1726
+ .diagnostic-chip {
1727
+ display: inline-flex;
1728
+ align-items: center;
1729
+ gap: 6px;
1730
+ min-height: 26px;
1731
+ padding: 4px 8px;
1732
+ border: 1px solid var(--border);
1733
+ background: rgba(15, 24, 34, 0.82);
1734
+ font-family: var(--font-mono);
1735
+ font-size: 10px;
1736
+ letter-spacing: 0.12em;
1737
+ text-transform: uppercase;
1738
+ color: var(--text-dim);
1739
+ }
1740
+
1741
+ .diagnostic-chip.is-warn {
1742
+ border-color: rgba(255, 214, 128, 0.28);
1743
+ color: #ffd88e;
1744
+ }
1745
+
1746
+ .diagnostic-chip.is-info {
1747
+ border-color: rgba(124, 255, 71, 0.18);
1748
+ color: var(--text-dim);
1749
+ }
1750
+
1751
+ .ui-status.is-busy {
1752
+ color: var(--accent-strong);
1753
+ }
1754
+
1755
+ .ui-status.is-error {
1756
+ color: #ffd0d6;
1757
+ }
1758
+
1759
+ .ui-status.is-success {
1760
+ color: var(--accent-strong);
1761
+ }
1762
+
1763
+ .composer-shell {
1764
+ gap: 12px;
1765
+ padding-top: 16px;
1766
+ padding-bottom: 16px;
1767
+ }
1768
+
1769
+ .composer-shell .section-head {
1770
+ align-items: center;
1771
+ gap: 10px;
1772
+ }
1773
+
1774
+ .composer-shell .section-head h2 {
1775
+ font-size: 16px;
1776
+ line-height: 1;
1777
+ }
1778
+
1779
+ .composer-shell .section-kicker {
1780
+ margin-bottom: 4px;
1781
+ font-size: 10px;
1782
+ }
1783
+
1784
+ .composer-shell .inline-status {
1785
+ min-height: 30px;
1786
+ padding: 6px 9px;
1787
+ font-size: 11px;
1788
+ letter-spacing: 0.1em;
1789
+ }
1790
+
1791
+ .inline-status.is-busy {
1792
+ color: var(--accent-strong);
1793
+ }
1794
+
1795
+ .composer-shell .stacked-form {
1796
+ gap: 10px;
1797
+ }
1798
+
1799
+ .composer-shell .button-row {
1800
+ gap: 8px;
1801
+ }
1802
+
1803
+ .composer-command-row {
1804
+ align-items: center;
1805
+ }
1806
+
1807
+ .composer-shell .command-button,
1808
+ .composer-shell .attachment-picker {
1809
+ min-height: 40px;
1810
+ padding-left: 12px;
1811
+ padding-right: 12px;
1812
+ }
1813
+
1814
+ .composer-shell textarea {
1815
+ min-height: 96px;
1816
+ padding: 10px 12px;
1817
+ font-size: 14px;
1818
+ line-height: 1.55;
1819
+ }
1820
+
1821
+ #composer-arm-panel {
1822
+ display: grid;
1823
+ gap: 8px;
1824
+ padding: 10px 12px;
1825
+ }
1826
+
1827
+ .composer-warning-copy {
1828
+ margin: 0;
1829
+ font-family: var(--font-mono);
1830
+ font-size: 11px;
1831
+ letter-spacing: 0.12em;
1832
+ text-transform: uppercase;
1833
+ color: var(--text-dim);
1834
+ }
1835
+
1836
+ .composer-status-sending {
1837
+ color: var(--accent);
1838
+ }
1839
+
1840
+ .composer-status-success {
1841
+ color: var(--accent-strong);
1842
+ }
1843
+
1844
+ .composer-status-error {
1845
+ color: #ffd0d6;
1846
+ }
1847
+
1848
+ .queue-shell {
1849
+ display: grid;
1850
+ gap: 8px;
1851
+ padding: 10px 12px;
1852
+ border: 1px solid rgba(124, 255, 71, 0.18);
1853
+ background: rgba(11, 21, 24, 0.9);
1854
+ }
1855
+
1856
+ .queue-shell-head {
1857
+ display: flex;
1858
+ align-items: center;
1859
+ justify-content: space-between;
1860
+ gap: 8px;
1861
+ }
1862
+
1863
+ .queue-shell-label {
1864
+ margin: 0;
1865
+ font-family: var(--font-mono);
1866
+ font-size: 11px;
1867
+ letter-spacing: 0.16em;
1868
+ text-transform: uppercase;
1869
+ color: var(--accent);
1870
+ }
1871
+
1872
+ .queue-list {
1873
+ display: grid;
1874
+ gap: 6px;
1875
+ }
1876
+
1877
+ .queue-item {
1878
+ display: grid;
1879
+ grid-template-columns: minmax(0, 1fr) auto;
1880
+ gap: 8px;
1881
+ align-items: center;
1882
+ padding: 8px 10px;
1883
+ border: 1px solid rgba(96, 131, 151, 0.18);
1884
+ background: rgba(10, 18, 28, 0.76);
1885
+ }
1886
+
1887
+ .queue-item-copy {
1888
+ display: flex;
1889
+ align-items: baseline;
1890
+ gap: 8px;
1891
+ min-width: 0;
1892
+ }
1893
+
1894
+ .queue-item-slot,
1895
+ .queue-item-preview,
1896
+ .queue-item-remove {
1897
+ font-family: var(--font-mono);
1898
+ }
1899
+
1900
+ .queue-item-slot {
1901
+ flex: 0 0 auto;
1902
+ font-size: 10px;
1903
+ letter-spacing: 0.16em;
1904
+ text-transform: uppercase;
1905
+ color: var(--accent);
1906
+ }
1907
+
1908
+ .queue-item-preview {
1909
+ min-width: 0;
1910
+ overflow: hidden;
1911
+ text-overflow: ellipsis;
1912
+ white-space: nowrap;
1913
+ font-size: 12px;
1914
+ color: var(--text-strong);
1915
+ }
1916
+
1917
+ .queue-item-remove {
1918
+ border: 0;
1919
+ background: transparent;
1920
+ padding: 0;
1921
+ font-size: 10px;
1922
+ letter-spacing: 0.16em;
1923
+ text-transform: uppercase;
1924
+ color: var(--text-dim);
1925
+ }
1926
+
1927
+ .queue-item-remove:hover,
1928
+ .queue-item-remove:focus-visible {
1929
+ color: var(--accent-strong);
1930
+ outline: none;
1931
+ }
1932
+
1933
+ .feed-section {
1934
+ display: grid;
1935
+ gap: 10px;
1936
+ }
1937
+
1938
+ .feed-section-head,
1939
+ .feed-section-summary {
1940
+ display: flex;
1941
+ justify-content: space-between;
1942
+ align-items: center;
1943
+ gap: 12px;
1944
+ flex-wrap: wrap;
1945
+ }
1946
+
1947
+ .feed-section-details {
1948
+ border: 1px solid rgba(96, 131, 151, 0.18);
1949
+ background: rgba(11, 19, 28, 0.84);
1950
+ }
1951
+
1952
+ .feed-section-summary {
1953
+ list-style: none;
1954
+ cursor: pointer;
1955
+ padding: 9px 12px;
1956
+ }
1957
+
1958
+ .feed-section-summary::-webkit-details-marker {
1959
+ display: none;
1960
+ }
1961
+
1962
+ .feed-section-summary::after {
1963
+ content: "+";
1964
+ margin-left: auto;
1965
+ font-family: var(--font-mono);
1966
+ font-size: 14px;
1967
+ letter-spacing: 0.1em;
1968
+ color: var(--text-dim);
1969
+ }
1970
+
1971
+ .feed-section-details[open] .feed-section-summary::after {
1972
+ content: "-";
1973
+ }
1974
+
1975
+ .feed-section-kicker {
1976
+ margin: 0;
1977
+ font-family: var(--font-mono);
1978
+ font-size: 10px;
1979
+ letter-spacing: 0.16em;
1980
+ text-transform: uppercase;
1981
+ color: var(--accent);
1982
+ }
1983
+
1984
+ .feed-section-summary h3,
1985
+ .feed-section-head h3 {
1986
+ margin: 3px 0 0;
1987
+ font-size: 15px;
1988
+ line-height: 1.08;
1989
+ color: var(--text-strong);
1990
+ }
1991
+
1992
+ .feed-section-changes {
1993
+ padding-bottom: 0;
1994
+ border-bottom: 0;
1995
+ }
1996
+
1997
+ .feed-section-details .changes-list {
1998
+ padding: 0 12px 12px;
1999
+ }
2000
+
2001
+ .feed-section-details .feed-list {
2002
+ padding: 0 12px 12px;
2003
+ }
2004
+
2005
+ @keyframes status-pulse {
2006
+ 0%,
2007
+ 100% {
2008
+ opacity: 0.35;
2009
+ }
2010
+
2011
+ 50% {
2012
+ opacity: 1;
2013
+ }
2014
+ }
2015
+
2016
+ @keyframes marqueePulse {
2017
+ 0%,
2018
+ 100% {
2019
+ opacity: 0.68;
2020
+ transform: translateY(0);
2021
+ }
2022
+
2023
+ 50% {
2024
+ opacity: 1;
2025
+ transform: translateY(-0.5px);
2026
+ }
2027
+ }
2028
+
2029
+ @keyframes marqueeDots {
2030
+ 0% {
2031
+ width: 0;
2032
+ opacity: 0.3;
2033
+ }
2034
+
2035
+ 33% {
2036
+ width: 0.45em;
2037
+ opacity: 0.65;
2038
+ }
2039
+
2040
+ 66% {
2041
+ width: 0.85em;
2042
+ opacity: 0.85;
2043
+ }
2044
+
2045
+ 100% {
2046
+ width: 1.2em;
2047
+ opacity: 1;
2048
+ }
2049
+ }
2050
+
2051
+ .attachment-row {
2052
+ display: flex;
2053
+ flex-wrap: wrap;
2054
+ align-items: center;
2055
+ gap: 12px;
2056
+ }
2057
+
2058
+ .composer-command-row .attachment-picker,
2059
+ .composer-command-row .dictation-button {
2060
+ flex: 0 0 auto;
2061
+ }
2062
+
2063
+ .attachment-input {
2064
+ display: none;
2065
+ }
2066
+
2067
+ .attachment-picker {
2068
+ width: max-content;
2069
+ display: inline-flex;
2070
+ align-items: center;
2071
+ }
2072
+
2073
+ .dictation-button {
2074
+ min-height: 46px;
2075
+ padding: 8px 14px;
2076
+ align-items: center;
2077
+ gap: 10px;
2078
+ }
2079
+
2080
+ .dictation-button-copy {
2081
+ display: grid;
2082
+ gap: 2px;
2083
+ text-align: left;
2084
+ }
2085
+
2086
+ .dictation-button-label {
2087
+ font-size: 13px;
2088
+ letter-spacing: 0.12em;
2089
+ text-transform: uppercase;
2090
+ color: var(--text-strong);
2091
+ }
2092
+
2093
+ .dictation-button-meta {
2094
+ font-size: 10px;
2095
+ letter-spacing: 0.14em;
2096
+ text-transform: uppercase;
2097
+ color: var(--text-dim);
2098
+ }
2099
+
2100
+ .dictation-button.is-armed {
2101
+ border-color: rgba(152, 238, 111, 0.55);
2102
+ box-shadow: inset 0 0 0 1px rgba(152, 238, 111, 0.14);
2103
+ }
2104
+
2105
+ .dictation-button.is-listening {
2106
+ border-color: var(--accent);
2107
+ box-shadow: inset 0 0 0 1px rgba(152, 238, 111, 0.18), 0 0 0 1px rgba(152, 238, 111, 0.08);
2108
+ }
2109
+
2110
+ .dictation-indicator {
2111
+ display: inline-flex;
2112
+ align-items: center;
2113
+ gap: 10px;
2114
+ min-height: 40px;
2115
+ padding: 0 12px;
2116
+ border: 1px solid rgba(152, 238, 111, 0.22);
2117
+ background: rgba(14, 24, 32, 0.82);
2118
+ color: var(--text-dim);
2119
+ }
2120
+
2121
+ .attachment-list {
2122
+ flex-basis: 100%;
2123
+ width: 100%;
2124
+ }
2125
+
2126
+ .dictation-indicator.is-live {
2127
+ border-color: rgba(152, 238, 111, 0.52);
2128
+ color: var(--text-strong);
2129
+ }
2130
+
2131
+ .dictation-indicator-text {
2132
+ font-size: 11px;
2133
+ letter-spacing: 0.12em;
2134
+ text-transform: uppercase;
2135
+ }
2136
+
2137
+ .dictation-wave {
2138
+ display: inline-flex;
2139
+ align-items: end;
2140
+ gap: 3px;
2141
+ height: 18px;
2142
+ }
2143
+
2144
+ .dictation-wave span {
2145
+ width: 3px;
2146
+ height: 6px;
2147
+ background: rgba(152, 238, 111, 0.48);
2148
+ transform-origin: center bottom;
2149
+ animation: dictation-wave-idle 1.4s ease-in-out infinite;
2150
+ }
2151
+
2152
+ .dictation-wave span:nth-child(2) {
2153
+ animation-delay: 0.12s;
2154
+ }
2155
+
2156
+ .dictation-wave span:nth-child(3) {
2157
+ animation-delay: 0.24s;
2158
+ }
2159
+
2160
+ .dictation-wave span:nth-child(4) {
2161
+ animation-delay: 0.36s;
2162
+ }
2163
+
2164
+ .dictation-wave span:nth-child(5) {
2165
+ animation-delay: 0.48s;
2166
+ }
2167
+
2168
+ .dictation-indicator.is-live .dictation-wave span,
2169
+ .dictation-button.is-listening .dictation-wave span {
2170
+ background: var(--accent);
2171
+ animation-name: dictation-wave-live;
2172
+ animation-duration: 0.72s;
2173
+ }
2174
+
2175
+ @keyframes dictation-wave-idle {
2176
+ 0%,
2177
+ 100% {
2178
+ transform: scaleY(0.55);
2179
+ opacity: 0.45;
2180
+ }
2181
+
2182
+ 50% {
2183
+ transform: scaleY(1);
2184
+ opacity: 0.75;
2185
+ }
2186
+ }
2187
+
2188
+ @keyframes dictation-wave-live {
2189
+ 0%,
2190
+ 100% {
2191
+ transform: scaleY(0.45);
2192
+ opacity: 0.55;
2193
+ }
2194
+
2195
+ 40% {
2196
+ transform: scaleY(1.55);
2197
+ opacity: 1;
2198
+ }
2199
+
2200
+ 70% {
2201
+ transform: scaleY(0.82);
2202
+ opacity: 0.85;
2203
+ }
2204
+ }
2205
+
2206
+ .attachment-picker.is-listening {
2207
+ border-color: var(--accent);
2208
+ color: var(--text-strong);
2209
+ box-shadow: inset 0 0 0 1px rgba(152, 238, 111, 0.16);
2210
+ }
2211
+
2212
+ .attachment-chip {
2213
+ display: grid;
2214
+ grid-template-columns: 72px minmax(0, 1fr) auto;
2215
+ gap: 12px;
2216
+ align-items: center;
2217
+ padding: 10px;
2218
+ }
2219
+
2220
+ .attachment-preview {
2221
+ width: 72px;
2222
+ height: 72px;
2223
+ object-fit: cover;
2224
+ border: 1px solid var(--border);
2225
+ background: rgba(8, 16, 24, 0.96);
2226
+ }
2227
+
2228
+ .attachment-copy {
2229
+ display: grid;
2230
+ gap: 5px;
2231
+ min-width: 0;
2232
+ }
2233
+
2234
+ .attachment-copy strong {
2235
+ overflow: hidden;
2236
+ text-overflow: ellipsis;
2237
+ white-space: nowrap;
2238
+ color: var(--text-strong);
2239
+ }
2240
+
2241
+ .attachment-copy span {
2242
+ font-size: 11px;
2243
+ letter-spacing: 0.12em;
2244
+ text-transform: uppercase;
2245
+ color: var(--text-dim);
2246
+ }
2247
+
2248
+ .attachment-remove {
2249
+ min-height: 36px;
2250
+ padding: 0 12px;
2251
+ }
2252
+
2253
+ .change-card {
2254
+ margin: 0;
2255
+ }
2256
+
2257
+ .change-summary {
2258
+ list-style: none;
2259
+ display: flex;
2260
+ align-items: baseline;
2261
+ justify-content: space-between;
2262
+ gap: 12px;
2263
+ padding: 8px 12px;
2264
+ cursor: pointer;
2265
+ }
2266
+
2267
+ .change-summary::-webkit-details-marker {
2268
+ display: none;
2269
+ }
2270
+
2271
+ .change-path,
2272
+ .change-meta,
2273
+ .change-note,
2274
+ .diff-block {
2275
+ font-family: var(--font-mono);
2276
+ }
2277
+
2278
+ .change-path {
2279
+ color: var(--text-strong);
2280
+ font-size: 10px;
2281
+ letter-spacing: 0.05em;
2282
+ text-transform: uppercase;
2283
+ overflow-wrap: anywhere;
2284
+ }
2285
+
2286
+ .change-meta,
2287
+ .change-note {
2288
+ font-size: 10px;
2289
+ letter-spacing: 0.12em;
2290
+ text-transform: uppercase;
2291
+ color: var(--accent);
2292
+ }
2293
+
2294
+ .change-relevance {
2295
+ padding: 0 16px 10px;
2296
+ font-family: var(--font-mono);
2297
+ font-size: 11px;
2298
+ letter-spacing: 0.12em;
2299
+ text-transform: uppercase;
2300
+ color: var(--text-dim);
2301
+ }
2302
+
2303
+ .change-note {
2304
+ padding: 0 16px 10px;
2305
+ }
2306
+
2307
+ .diff-block {
2308
+ margin: 0;
2309
+ padding: 0 16px 16px;
2310
+ white-space: pre-wrap;
2311
+ overflow-wrap: anywhere;
2312
+ font-size: 12px;
2313
+ line-height: 1.55;
2314
+ color: var(--text-dim);
2315
+ }
2316
+
2317
+ .host-debug {
2318
+ background: rgba(12, 20, 30, 0.82);
2319
+ }
2320
+
2321
+ .panel-hidden {
2322
+ display: none !important;
2323
+ }
2324
+
2325
+ [hidden] {
2326
+ display: none !important;
2327
+ }
2328
+
2329
+ .panel-pop {}
2330
+
2331
+ .card-new {}
2332
+
2333
+ @keyframes panelFade {
2334
+ from {
2335
+ opacity: 0;
2336
+ }
2337
+
2338
+ to {
2339
+ opacity: 1;
2340
+ }
2341
+ }
2342
+
2343
+ @keyframes cardPulse {
2344
+ 0% {
2345
+ box-shadow: inset 0 0 0 1px rgba(137, 228, 195, 0.4);
2346
+ }
2347
+
2348
+ 100% {
2349
+ box-shadow: none;
2350
+ }
2351
+ }
2352
+
2353
+ @keyframes marqueePulse {
2354
+ 0%,
2355
+ 100% {
2356
+ opacity: 0.68;
2357
+ }
2358
+
2359
+ 50% {
2360
+ opacity: 1;
2361
+ }
2362
+ }
2363
+
2364
+ @keyframes caretBlink {
2365
+ 0%,
2366
+ 50% {
2367
+ opacity: 1;
2368
+ }
2369
+
2370
+ 50.01%,
2371
+ 100% {
2372
+ opacity: 0;
2373
+ }
2374
+ }
2375
+
2376
+ @media (max-width: 1180px) {
2377
+ .app-shell {
2378
+ padding: 16px;
2379
+ }
2380
+
2381
+ .landing-shell {
2382
+ padding: 16px;
2383
+ }
2384
+
2385
+ .panel {
2386
+ padding: 18px 16px;
2387
+ }
2388
+
2389
+ .install-panel-head {
2390
+ flex-direction: column;
2391
+ align-items: flex-start;
2392
+ }
2393
+
2394
+ .hero-panel h1 {
2395
+ max-width: none;
2396
+ font-size: clamp(1.65rem, 10vw, 2.6rem);
2397
+ }
2398
+
2399
+ .remote-shell-main {
2400
+ max-width: none;
2401
+ }
2402
+
2403
+ .host-layout-grid {
2404
+ grid-template-columns: 1fr;
2405
+ }
2406
+
2407
+ .host-admin-column {
2408
+ border-right: 0;
2409
+ border-bottom: 1px solid rgba(47, 85, 108, 0.26);
2410
+ }
2411
+
2412
+ .remote-window,
2413
+ .remote-window:not(.is-sidebar-open) {
2414
+ grid-template-columns: 1fr;
2415
+ }
2416
+
2417
+ .remote-sidebar {
2418
+ position: absolute;
2419
+ inset: 0 auto 0 0;
2420
+ z-index: 3;
2421
+ width: min(320px, 78vw);
2422
+ max-width: 320px;
2423
+ max-height: 100dvh;
2424
+ min-height: 100%;
2425
+ padding: 16px 12px 18px;
2426
+ border-right: 1px solid rgba(47, 85, 108, 0.34);
2427
+ box-shadow: 16px 0 48px rgba(0, 0, 0, 0.32);
2428
+ transform: translateX(-100%);
2429
+ transition: transform 140ms ease, opacity 140ms ease;
2430
+ overflow: auto;
2431
+ }
2432
+
2433
+ .remote-window.is-sidebar-open .remote-sidebar {
2434
+ opacity: 1;
2435
+ pointer-events: auto;
2436
+ transform: translateX(0);
2437
+ }
2438
+
2439
+ .remote-sidebar-overlay {
2440
+ display: block;
2441
+ position: absolute;
2442
+ position: absolute;
2443
+ inset: 0;
2444
+ z-index: 2;
2445
+ border: 0;
2446
+ padding: 0;
2447
+ background: rgba(3, 8, 14, 0.42);
2448
+ backdrop-filter: blur(2px);
2449
+ opacity: 0;
2450
+ pointer-events: none;
2451
+ transition: opacity 140ms ease;
2452
+ }
2453
+
2454
+ .remote-window.is-sidebar-open .remote-sidebar-overlay {
2455
+ opacity: 1;
2456
+ pointer-events: auto;
2457
+ }
2458
+
2459
+ .terminal-hero,
2460
+ .terminal-panel {
2461
+ padding-left: 16px;
2462
+ padding-right: 16px;
2463
+ }
2464
+
2465
+ .selector-grid {
2466
+ grid-template-columns: 1fr;
2467
+ }
2468
+
2469
+ .selector-grid-remote {
2470
+ grid-template-columns: 1fr;
2471
+ align-items: stretch;
2472
+ }
2473
+
2474
+ .selector-actions {
2475
+ width: 100%;
2476
+ min-height: 0;
2477
+ }
2478
+
2479
+ .section-head,
2480
+ .control-row {
2481
+ flex-direction: column;
2482
+ align-items: stretch;
2483
+ }
2484
+
2485
+ .feed-head {
2486
+ flex-direction: row;
2487
+ align-items: center;
2488
+ }
2489
+
2490
+ .terminal-statusline {
2491
+ grid-template-columns: 1fr;
2492
+ }
2493
+
2494
+ .feed-tools {
2495
+ display: grid;
2496
+ grid-template-columns: minmax(0, 1fr) auto;
2497
+ justify-content: flex-start;
2498
+ align-items: center;
2499
+ width: 100%;
2500
+ gap: 8px;
2501
+ }
2502
+
2503
+ .button-row {
2504
+ width: 100%;
2505
+ }
2506
+
2507
+ .toolbar-strip {
2508
+ width: 100%;
2509
+ gap: 6px;
2510
+ flex-wrap: wrap;
2511
+ overflow: visible;
2512
+ }
2513
+
2514
+ .toolbar-strip .command-button {
2515
+ flex: 0 0 auto;
2516
+ min-height: 40px;
2517
+ padding: 0 12px;
2518
+ font-size: 16px;
2519
+ letter-spacing: 0.08em;
2520
+ white-space: nowrap;
2521
+ }
2522
+
2523
+ .filter-group {
2524
+ width: auto;
2525
+ min-width: 0;
2526
+ justify-content: flex-end;
2527
+ flex-wrap: wrap;
2528
+ gap: 6px;
2529
+ margin-left: 0;
2530
+ overflow: visible;
2531
+ }
2532
+
2533
+ #expand-all-button {
2534
+ justify-self: end;
2535
+ }
2536
+
2537
+ .command-button {
2538
+ flex: 1 1 auto;
2539
+ justify-content: center;
2540
+ }
2541
+
2542
+ .filter-button {
2543
+ flex: 0 0 auto;
2544
+ min-height: 26px;
2545
+ padding: 0 8px;
2546
+ font-size: 10px;
2547
+ white-space: nowrap;
2548
+ }
2549
+
2550
+ .remote-shell .terminal-hero {
2551
+ padding-top: 14px;
2552
+ padding-bottom: 12px;
2553
+ }
2554
+
2555
+ .remote-hero-row {
2556
+ flex-direction: column;
2557
+ align-items: stretch;
2558
+ }
2559
+
2560
+ .remote-hero-primary {
2561
+ flex-wrap: nowrap;
2562
+ justify-content: flex-start;
2563
+ align-items: flex-start;
2564
+ }
2565
+
2566
+ .remote-top-actions {
2567
+ justify-content: flex-start;
2568
+ }
2569
+
2570
+ .sidebar-toggle-button {
2571
+ flex: 0 0 auto;
2572
+ width: 32px;
2573
+ min-width: 32px;
2574
+ min-height: 32px;
2575
+ padding: 0;
2576
+ justify-content: center;
2577
+ }
2578
+
2579
+ .remote-shell .terminal-panel {
2580
+ gap: 12px;
2581
+ padding-top: 16px;
2582
+ padding-bottom: 16px;
2583
+ }
2584
+
2585
+ .remote-shell .remote-feed-panel {
2586
+ gap: 6px;
2587
+ padding-top: 8px;
2588
+ }
2589
+
2590
+ .remote-status-panel {
2591
+ gap: 8px;
2592
+ padding-top: 8px;
2593
+ padding-bottom: 8px;
2594
+ }
2595
+
2596
+ .host-hero {
2597
+ padding-top: 10px;
2598
+ padding-bottom: 8px;
2599
+ }
2600
+
2601
+ .host-shell .terminal-panel {
2602
+ gap: 12px;
2603
+ padding-top: 14px;
2604
+ padding-bottom: 14px;
2605
+ }
2606
+
2607
+ .remote-shell .transcript-card,
2608
+ .remote-shell .command-card {
2609
+ padding: 11px 12px 12px;
2610
+ }
2611
+
2612
+ .remote-shell .card-clamped .transcript-copy {
2613
+ -webkit-line-clamp: 1;
2614
+ }
2615
+
2616
+ .feed-head {
2617
+ margin-top: 0;
2618
+ }
2619
+
2620
+ .remote-shell .composer-shell {
2621
+ gap: 4px;
2622
+ padding-top: 8px;
2623
+ padding-bottom: 8px;
2624
+ }
2625
+
2626
+ .remote-shell .composer-shell .section-head {
2627
+ flex-direction: row;
2628
+ align-items: center;
2629
+ justify-content: space-between;
2630
+ gap: 6px;
2631
+ flex-wrap: nowrap;
2632
+ }
2633
+
2634
+ .remote-shell .composer-shell .section-head > div {
2635
+ min-width: 0;
2636
+ }
2637
+
2638
+ .remote-shell .composer-shell .section-kicker {
2639
+ display: none;
2640
+ }
2641
+
2642
+ .remote-shell .composer-shell .section-head h2 {
2643
+ font-size: 12px;
2644
+ line-height: 1;
2645
+ }
2646
+
2647
+ .remote-shell .composer-shell .inline-status {
2648
+ min-width: 0;
2649
+ max-width: min(58vw, 360px);
2650
+ min-height: 20px;
2651
+ padding: 2px 6px;
2652
+ font-size: 8px;
2653
+ letter-spacing: 0.08em;
2654
+ white-space: nowrap;
2655
+ overflow: hidden;
2656
+ text-overflow: ellipsis;
2657
+ }
2658
+
2659
+ .remote-shell .composer-shell .stacked-form {
2660
+ gap: 4px;
2661
+ }
2662
+
2663
+ .remote-shell .composer-shell textarea {
2664
+ min-height: 52px;
2665
+ padding: 8px 10px;
2666
+ font-size: 16px;
2667
+ line-height: 1.35;
2668
+ }
2669
+
2670
+ .remote-shell .composer-command-row {
2671
+ flex-wrap: nowrap;
2672
+ overflow-x: auto;
2673
+ gap: 4px;
2674
+ scrollbar-width: none;
2675
+ }
2676
+
2677
+ .remote-shell .composer-command-row::-webkit-scrollbar {
2678
+ display: none;
2679
+ }
2680
+
2681
+ .remote-shell .attachment-row {
2682
+ gap: 6px;
2683
+ }
2684
+
2685
+ .remote-shell .dictation-button,
2686
+ .remote-shell .dictation-indicator,
2687
+ .remote-shell .attachment-picker,
2688
+ .remote-shell .composer-shell .command-button {
2689
+ min-height: 28px;
2690
+ padding-left: 6px;
2691
+ padding-right: 6px;
2692
+ font-size: 8px;
2693
+ letter-spacing: 0.08em;
2694
+ white-space: nowrap;
2695
+ flex: 0 0 auto;
2696
+ }
2697
+
2698
+ .remote-shell .dictation-button-copy {
2699
+ gap: 0;
2700
+ }
2701
+
2702
+ .remote-shell .dictation-button-label {
2703
+ font-size: 9px;
2704
+ }
2705
+
2706
+ .remote-shell .dictation-button-meta,
2707
+ .remote-shell .dictation-indicator-text {
2708
+ font-size: 8px;
2709
+ }
2710
+
2711
+ .remote-shell .dictation-button-meta {
2712
+ display: none;
2713
+ }
2714
+
2715
+ .remote-shell .composer-status {
2716
+ font-size: 9px;
2717
+ letter-spacing: 0.12em;
2718
+ }
2719
+
2720
+ .attachment-chip {
2721
+ grid-template-columns: 1fr;
2722
+ }
2723
+
2724
+ .attachment-preview {
2725
+ width: 100%;
2726
+ height: 160px;
2727
+ }
2728
+ }
2729
+
2730
+ @media (max-width: 900px) and (max-height: 500px) and (orientation: landscape) {
2731
+ .remote-shell .transcript-card,
2732
+ .remote-shell .command-card {
2733
+ padding: 7px 9px 8px;
2734
+ }
2735
+
2736
+ .remote-shell .card-label,
2737
+ .remote-shell .card-time {
2738
+ font-size: 8px;
2739
+ }
2740
+
2741
+ .remote-shell .transcript-copy {
2742
+ font-size: 9px;
2743
+ line-height: 1.3;
2744
+ }
2745
+
2746
+ .remote-shell .transcript-copy p {
2747
+ margin-bottom: 5px;
2748
+ }
2749
+ }
2750
+
2751
+ @media (max-width: 720px) {
2752
+ .feed-head {
2753
+ align-items: center;
2754
+ }
2755
+
2756
+ .feed-tools {
2757
+ grid-template-columns: minmax(0, 1fr) auto;
2758
+ align-items: center;
2759
+ gap: 4px;
2760
+ }
2761
+
2762
+ .feed-tools .filter-group {
2763
+ justify-content: flex-end;
2764
+ flex-wrap: nowrap;
2765
+ gap: 4px;
2766
+ }
2767
+
2768
+ .filter-button {
2769
+ min-height: 24px;
2770
+ padding: 0 6px;
2771
+ font-size: 8px;
2772
+ letter-spacing: 0.08em;
2773
+ }
2774
+
2775
+ #expand-all-button {
2776
+ width: auto;
2777
+ min-width: 9.5ch;
2778
+ min-height: 24px;
2779
+ padding: 0 8px;
2780
+ font-size: 8px;
2781
+ letter-spacing: 0.08em;
2782
+ justify-self: end;
2783
+ }
2784
+ }
2785
+
2786
+ @media (prefers-reduced-motion: reduce) {
2787
+ .terminal-marquee,
2788
+ .terminal-marquee::after,
2789
+ .panel-pop,
2790
+ .card-new {
2791
+ animation: none !important;
2792
+ }
2793
+ }