@mooncompany/uplink-chat 0.5.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.

Potentially problematic release.


This version of @mooncompany/uplink-chat might be problematic. Click here for more details.

Files changed (158) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/bin/uplink.js +279 -0
  4. package/middleware/error-handler.js +69 -0
  5. package/package.json +93 -0
  6. package/public/css/agents.36b98c0f.css +1469 -0
  7. package/public/css/agents.css +1469 -0
  8. package/public/css/app.a6a7f8f5.css +2731 -0
  9. package/public/css/app.css +2731 -0
  10. package/public/css/artifacts.css +444 -0
  11. package/public/css/commands.css +55 -0
  12. package/public/css/connection.css +131 -0
  13. package/public/css/dashboard.css +233 -0
  14. package/public/css/developer.css +328 -0
  15. package/public/css/files.css +123 -0
  16. package/public/css/markdown.css +156 -0
  17. package/public/css/message-actions.css +278 -0
  18. package/public/css/mobile.css +614 -0
  19. package/public/css/panels-unified.css +483 -0
  20. package/public/css/premium.css +415 -0
  21. package/public/css/realtime.css +189 -0
  22. package/public/css/satellites.css +401 -0
  23. package/public/css/shortcuts.css +185 -0
  24. package/public/css/split-view.4def0262.css +673 -0
  25. package/public/css/split-view.css +673 -0
  26. package/public/css/theme-generator.css +391 -0
  27. package/public/css/themes.css +387 -0
  28. package/public/css/timestamps.css +54 -0
  29. package/public/css/variables.css +78 -0
  30. package/public/dist/bundle.b55050c4.js +15757 -0
  31. package/public/favicon.svg +24 -0
  32. package/public/img/agents/ada.png +0 -0
  33. package/public/img/agents/clarice.png +0 -0
  34. package/public/img/agents/dennis-nedry.png +0 -0
  35. package/public/img/agents/elliot-alderson.png +0 -0
  36. package/public/img/agents/main.png +0 -0
  37. package/public/img/agents/scotty.png +0 -0
  38. package/public/img/agents/top-flight-security.png +0 -0
  39. package/public/index.html +1083 -0
  40. package/public/js/agents-data.js +234 -0
  41. package/public/js/agents-ui.js +72 -0
  42. package/public/js/agents.js +1525 -0
  43. package/public/js/app.js +79 -0
  44. package/public/js/appearance-settings.js +111 -0
  45. package/public/js/artifacts.js +432 -0
  46. package/public/js/audio-queue.js +168 -0
  47. package/public/js/bootstrap.js +54 -0
  48. package/public/js/chat.js +1211 -0
  49. package/public/js/commands.js +581 -0
  50. package/public/js/connection-api.js +121 -0
  51. package/public/js/connection.js +1231 -0
  52. package/public/js/context-tracker.js +271 -0
  53. package/public/js/core.js +172 -0
  54. package/public/js/dashboard.js +452 -0
  55. package/public/js/developer.js +432 -0
  56. package/public/js/encryption.js +124 -0
  57. package/public/js/errors.js +122 -0
  58. package/public/js/event-bus.js +77 -0
  59. package/public/js/fetch-utils.js +171 -0
  60. package/public/js/file-handler.js +229 -0
  61. package/public/js/files.js +352 -0
  62. package/public/js/gateway-chat.js +538 -0
  63. package/public/js/logger.js +112 -0
  64. package/public/js/markdown.js +190 -0
  65. package/public/js/message-actions.js +431 -0
  66. package/public/js/message-renderer.js +288 -0
  67. package/public/js/missed-messages.js +235 -0
  68. package/public/js/mobile-debug.js +95 -0
  69. package/public/js/notifications.js +367 -0
  70. package/public/js/offline-queue.js +178 -0
  71. package/public/js/onboarding.js +543 -0
  72. package/public/js/panels.js +156 -0
  73. package/public/js/premium.js +412 -0
  74. package/public/js/realtime-voice.js +844 -0
  75. package/public/js/satellite-sync.js +256 -0
  76. package/public/js/satellite-ui.js +175 -0
  77. package/public/js/satellites.js +1516 -0
  78. package/public/js/settings.js +1087 -0
  79. package/public/js/shortcuts.js +381 -0
  80. package/public/js/split-chat.js +1234 -0
  81. package/public/js/split-resize.js +211 -0
  82. package/public/js/splitview.js +340 -0
  83. package/public/js/storage.js +408 -0
  84. package/public/js/streaming-handler.js +324 -0
  85. package/public/js/stt-settings.js +316 -0
  86. package/public/js/theme-generator.js +661 -0
  87. package/public/js/themes.js +164 -0
  88. package/public/js/timestamps.js +198 -0
  89. package/public/js/tts-settings.js +575 -0
  90. package/public/js/ui.js +267 -0
  91. package/public/js/update-notifier.js +143 -0
  92. package/public/js/utils/constants.js +165 -0
  93. package/public/js/utils/sanitize.js +93 -0
  94. package/public/js/utils/sse-parser.js +195 -0
  95. package/public/js/voice.js +883 -0
  96. package/public/manifest.json +58 -0
  97. package/public/moon_texture.jpg +0 -0
  98. package/public/sw.js +221 -0
  99. package/public/three.min.js +6 -0
  100. package/server/channel.js +529 -0
  101. package/server/chat.js +270 -0
  102. package/server/config-store.js +362 -0
  103. package/server/config.js +159 -0
  104. package/server/context.js +131 -0
  105. package/server/gateway-commands.js +211 -0
  106. package/server/gateway-proxy.js +318 -0
  107. package/server/index.js +22 -0
  108. package/server/logger.js +89 -0
  109. package/server/middleware/auth.js +188 -0
  110. package/server/middleware.js +218 -0
  111. package/server/openclaw-discover.js +308 -0
  112. package/server/premium/index.js +156 -0
  113. package/server/premium/license.js +140 -0
  114. package/server/realtime/bridge.js +837 -0
  115. package/server/realtime/index.js +349 -0
  116. package/server/realtime/tts-stream.js +446 -0
  117. package/server/routes/agents.js +564 -0
  118. package/server/routes/artifacts.js +174 -0
  119. package/server/routes/chat.js +311 -0
  120. package/server/routes/config-settings.js +345 -0
  121. package/server/routes/config.js +603 -0
  122. package/server/routes/files.js +307 -0
  123. package/server/routes/index.js +18 -0
  124. package/server/routes/media.js +451 -0
  125. package/server/routes/missed-messages.js +107 -0
  126. package/server/routes/premium.js +75 -0
  127. package/server/routes/push.js +156 -0
  128. package/server/routes/satellite.js +406 -0
  129. package/server/routes/status.js +251 -0
  130. package/server/routes/stt.js +35 -0
  131. package/server/routes/voice.js +260 -0
  132. package/server/routes/webhooks.js +203 -0
  133. package/server/routes.js +206 -0
  134. package/server/runtime-config.js +336 -0
  135. package/server/share.js +305 -0
  136. package/server/stt/faster-whisper.js +72 -0
  137. package/server/stt/groq.js +51 -0
  138. package/server/stt/index.js +196 -0
  139. package/server/stt/openai.js +49 -0
  140. package/server/sync.js +244 -0
  141. package/server/tailscale-https.js +175 -0
  142. package/server/tts.js +646 -0
  143. package/server/update-checker.js +172 -0
  144. package/server/utils/filename.js +129 -0
  145. package/server/utils.js +147 -0
  146. package/server/watchdog.js +318 -0
  147. package/server/websocket/broadcast.js +359 -0
  148. package/server/websocket/connections.js +339 -0
  149. package/server/websocket/index.js +215 -0
  150. package/server/websocket/routing.js +277 -0
  151. package/server/websocket/sync.js +102 -0
  152. package/server.js +404 -0
  153. package/utils/detect-tool-usage.js +93 -0
  154. package/utils/errors.js +158 -0
  155. package/utils/html-escape.js +84 -0
  156. package/utils/id-sanitize.js +94 -0
  157. package/utils/response.js +130 -0
  158. package/utils/with-retry.js +105 -0
@@ -0,0 +1,1469 @@
1
+ /* Agent selector in satellite launch prompt */
2
+ .satellite-agent-field {
3
+ display: flex;
4
+ align-items: center;
5
+ gap: var(--space-2);
6
+ margin-bottom: var(--space-2);
7
+ }
8
+
9
+ .satellite-agent-label {
10
+ font-size: 11px;
11
+ color: var(--text-muted);
12
+ text-transform: uppercase;
13
+ letter-spacing: 0.05em;
14
+ white-space: nowrap;
15
+ }
16
+
17
+ .satellite-agent-select {
18
+ flex: 1;
19
+ padding: var(--space-2) var(--space-3);
20
+ border: 1px solid var(--border);
21
+ border-radius: var(--radius-md);
22
+ background: var(--bg-input);
23
+ color: var(--text);
24
+ font-size: var(--text-sm);
25
+ }
26
+
27
+ .satellite-agent-select:focus {
28
+ outline: none;
29
+ border-color: var(--accent);
30
+ }
31
+
32
+ /* Agent badge on satellite items */
33
+ .satellite-agent-badge {
34
+ font-size: 11px;
35
+ padding: 1px 4px;
36
+ border-radius: var(--radius-sm);
37
+ background: var(--accent-10);
38
+ color: var(--accent);
39
+ border: 1px solid var(--accent-20, rgba(255,255,255,0.1));
40
+ }
41
+
42
+ /* ============================================
43
+ NAV TABS (Sessions / Agents toggle)
44
+ ============================================ */
45
+
46
+ .satellite-nav-tabs {
47
+ display: flex;
48
+ gap: 0;
49
+ }
50
+
51
+ .satellite-nav-tab {
52
+ background: none;
53
+ border: none;
54
+ color: var(--text-muted);
55
+ font-family: 'Space Mono', monospace;
56
+ font-size: var(--text-xs);
57
+ letter-spacing: 0.5px;
58
+ text-transform: uppercase;
59
+ padding: var(--space-1) var(--space-3);
60
+ cursor: pointer;
61
+ border-bottom: 2px solid transparent;
62
+ transition: color 0.15s ease, border-color 0.15s ease;
63
+ }
64
+
65
+ .satellite-nav-tab:hover {
66
+ color: var(--text);
67
+ }
68
+
69
+ .satellite-nav-tab.active {
70
+ color: var(--accent);
71
+ border-bottom-color: var(--accent);
72
+ }
73
+
74
+ /* Tab content areas */
75
+ .satellite-tab-content {
76
+ display: flex;
77
+ flex-direction: column;
78
+ flex: 1;
79
+ overflow: hidden;
80
+ }
81
+
82
+ .agents-tab-content {
83
+ display: flex;
84
+ flex-direction: column;
85
+ flex: 1;
86
+ overflow-y: auto;
87
+ overflow-x: hidden;
88
+ }
89
+
90
+ /* ============================================
91
+ AGENTS MODULE STYLES
92
+ ============================================ */
93
+
94
+ /* Loading state */
95
+ .agents-loading {
96
+ display: flex;
97
+ align-items: center;
98
+ justify-content: center;
99
+ gap: var(--space-2);
100
+ padding: var(--space-6);
101
+ color: var(--text-muted);
102
+ font-size: var(--text-sm);
103
+ }
104
+
105
+ .agents-loading-dot {
106
+ width: 8px;
107
+ height: 8px;
108
+ border-radius: 50%;
109
+ background: var(--accent);
110
+ animation: pulse 1.2s ease-in-out infinite;
111
+ }
112
+
113
+ /* Empty state */
114
+ .agents-empty {
115
+ display: flex;
116
+ flex-direction: column;
117
+ align-items: center;
118
+ justify-content: center;
119
+ gap: var(--space-2);
120
+ padding: var(--space-6);
121
+ color: var(--text-muted);
122
+ }
123
+
124
+ .agents-empty-icon {
125
+ font-size: var(--text-3xl);
126
+ opacity: 0.5;
127
+ }
128
+
129
+ .agents-empty-text {
130
+ font-size: var(--text-sm);
131
+ }
132
+
133
+ /* List header */
134
+ .agents-list-header {
135
+ display: flex;
136
+ align-items: center;
137
+ justify-content: space-between;
138
+ padding: var(--space-2) var(--space-4);
139
+ border-bottom: 1px solid var(--white-05);
140
+ }
141
+
142
+ .agents-list-count {
143
+ font-size: var(--text-xs);
144
+ color: var(--text-muted);
145
+ text-transform: uppercase;
146
+ letter-spacing: 0.5px;
147
+ }
148
+
149
+ .agents-refresh-btn {
150
+ background: none;
151
+ border: none;
152
+ color: var(--text-muted);
153
+ cursor: pointer;
154
+ font-size: var(--text-base);
155
+ padding: var(--space-1);
156
+ border-radius: var(--radius-md);
157
+ transition: color 0.15s, background 0.15s;
158
+ }
159
+
160
+ .agents-refresh-btn:hover {
161
+ color: var(--text);
162
+ background: var(--white-05);
163
+ }
164
+
165
+ /* Agent list */
166
+ .agents-list {
167
+ flex: 1;
168
+ overflow-y: auto;
169
+ }
170
+
171
+ /* Agent item */
172
+ .agent-item {
173
+ display: flex;
174
+ align-items: center;
175
+ gap: var(--space-3);
176
+ padding: var(--space-3) var(--space-4);
177
+ cursor: pointer;
178
+ transition: background 0.15s;
179
+ border-bottom: 1px solid var(--white-05);
180
+ }
181
+
182
+ .agent-item:hover {
183
+ background: var(--white-05);
184
+ }
185
+
186
+ .agent-item:last-child {
187
+ border-bottom: none;
188
+ }
189
+
190
+ .agent-item-emoji {
191
+ font-size: var(--text-xl);
192
+ flex-shrink: 0;
193
+ }
194
+
195
+ .agent-item-avatar {
196
+ width: 32px;
197
+ height: 32px;
198
+ flex-shrink: 0;
199
+ display: flex;
200
+ align-items: center;
201
+ justify-content: center;
202
+ font-size: var(--text-xl);
203
+ }
204
+
205
+ .agent-list-avatar-img {
206
+ width: 32px;
207
+ height: 32px;
208
+ border-radius: 50%;
209
+ object-fit: cover;
210
+ }
211
+
212
+ .agent-item-info {
213
+ flex: 1;
214
+ min-width: 0;
215
+ }
216
+
217
+ .agent-item-name-row {
218
+ display: flex;
219
+ align-items: center;
220
+ gap: var(--space-2);
221
+ flex-wrap: wrap;
222
+ }
223
+
224
+ .agent-item-name {
225
+ font-size: var(--text-sm);
226
+ font-weight: 600;
227
+ color: var(--text);
228
+ white-space: nowrap;
229
+ overflow: hidden;
230
+ text-overflow: ellipsis;
231
+ }
232
+
233
+ .agent-item-theme {
234
+ font-size: var(--text-xs);
235
+ color: var(--text-secondary, var(--text-muted));
236
+ margin-top: 1px;
237
+ white-space: nowrap;
238
+ overflow: hidden;
239
+ text-overflow: ellipsis;
240
+ opacity: 0.7;
241
+ }
242
+
243
+ .agent-item-meta {
244
+ display: flex;
245
+ align-items: center;
246
+ gap: var(--space-1);
247
+ margin-top: 2px;
248
+ font-size: var(--text-xs);
249
+ color: var(--text-muted);
250
+ }
251
+
252
+ .agent-meta-sep {
253
+ opacity: 0.4;
254
+ }
255
+
256
+ .agent-item-chevron {
257
+ color: var(--text-muted);
258
+ font-size: var(--text-lg);
259
+ flex-shrink: 0;
260
+ opacity: 0.5;
261
+ }
262
+
263
+ /* Agent badges */
264
+ .agent-badge {
265
+ display: inline-block;
266
+ font-size: 10px;
267
+ padding: 1px 6px;
268
+ border-radius: var(--radius-full);
269
+ font-weight: 600;
270
+ text-transform: uppercase;
271
+ letter-spacing: 0.5px;
272
+ line-height: 1.4;
273
+ }
274
+
275
+ .agent-badge-default {
276
+ background: rgba(99, 102, 241, 0.2);
277
+ color: var(--accent);
278
+ }
279
+
280
+ .agent-badge-sandbox {
281
+ background: rgba(245, 158, 11, 0.2);
282
+ color: rgb(245, 158, 11);
283
+ }
284
+
285
+ .agent-badge-partial {
286
+ background: rgba(245, 158, 11, 0.1);
287
+ color: rgb(217, 147, 38);
288
+ }
289
+
290
+ .agent-badge-off {
291
+ background: var(--white-05);
292
+ color: var(--text-muted);
293
+ }
294
+
295
+ /* ============================================
296
+ AGENT DETAIL VIEW
297
+ ============================================ */
298
+
299
+ .agent-detail {
300
+ padding: 0;
301
+ }
302
+
303
+ /* Hero banner — 1:1 square avatar */
304
+ .agent-detail-hero {
305
+ position: relative;
306
+ width: 100%;
307
+ aspect-ratio: 1 / 1;
308
+ max-height: 400px;
309
+ overflow: hidden;
310
+ cursor: pointer;
311
+ background: var(--bg-input, #1a1a2e);
312
+ }
313
+
314
+ .agent-detail-hero-img {
315
+ width: 100%;
316
+ height: 100%;
317
+ object-fit: contain;
318
+ display: none;
319
+ background: var(--bg-input, #1a1a2e);
320
+ }
321
+
322
+ .agent-detail-hero-fallback {
323
+ font-size: 80px;
324
+ display: flex;
325
+ align-items: center;
326
+ justify-content: center;
327
+ width: 100%;
328
+ height: 100%;
329
+ background: linear-gradient(135deg, var(--bg-input, #1a1a2e) 0%, var(--accent-bg, rgba(120,90,255,0.15)) 100%);
330
+ }
331
+
332
+ .agent-detail-hero-overlay {
333
+ position: absolute;
334
+ inset: 0;
335
+ background: linear-gradient(transparent 50%, rgba(0,0,0,0.75) 100%);
336
+ display: flex;
337
+ flex-direction: column;
338
+ justify-content: space-between;
339
+ padding: var(--space-3) var(--space-4);
340
+ }
341
+
342
+ .agent-detail-hero-nav {
343
+ display: flex;
344
+ justify-content: space-between;
345
+ align-items: center;
346
+ }
347
+
348
+ .agent-detail-hero .agent-avatar-overlay {
349
+ position: absolute;
350
+ inset: 0;
351
+ background: rgba(0, 0, 0, 0.4);
352
+ display: flex;
353
+ align-items: center;
354
+ justify-content: center;
355
+ font-size: 24px;
356
+ opacity: 0;
357
+ transition: opacity 0.2s;
358
+ pointer-events: none;
359
+ border-radius: 0;
360
+ }
361
+
362
+ .agent-detail-hero:hover .agent-avatar-overlay {
363
+ opacity: 1;
364
+ }
365
+
366
+ .agent-detail-hero .agent-badge-default {
367
+ position: absolute;
368
+ bottom: var(--space-3);
369
+ right: var(--space-4);
370
+ }
371
+
372
+ .agent-detail-hero-info {
373
+ display: flex;
374
+ flex-direction: column;
375
+ gap: 2px;
376
+ }
377
+
378
+ .agent-detail-back {
379
+ background: rgba(0, 0, 0, 0.4);
380
+ border: 1px solid rgba(255, 255, 255, 0.15);
381
+ color: #fff;
382
+ cursor: pointer;
383
+ font-size: var(--text-sm);
384
+ padding: var(--space-1) var(--space-2);
385
+ border-radius: 6px;
386
+ transition: background 0.15s;
387
+ backdrop-filter: blur(4px);
388
+ }
389
+
390
+ .agent-detail-back:hover {
391
+ background: rgba(0, 0, 0, 0.6);
392
+ }
393
+
394
+ /* Danger zone — bottom of detail page */
395
+ .agent-detail-danger-zone {
396
+ padding: var(--space-4);
397
+ border-top: 1px solid var(--white-05);
398
+ display: flex;
399
+ justify-content: center;
400
+ }
401
+
402
+ .agent-detail-delete {
403
+ background: transparent;
404
+ border: 1px solid rgba(239, 68, 68, 0.4);
405
+ color: #ef4444;
406
+ cursor: pointer;
407
+ font-size: var(--text-sm);
408
+ padding: var(--space-2) var(--space-4);
409
+ border-radius: 6px;
410
+ transition: background 0.15s, border-color 0.15s;
411
+ width: 100%;
412
+ }
413
+
414
+ .agent-detail-delete:hover {
415
+ background: rgba(239, 68, 68, 0.1);
416
+ border-color: #ef4444;
417
+ }
418
+
419
+ .agent-detail-name {
420
+ display: block;
421
+ font-weight: 700;
422
+ font-size: var(--text-lg, 1.125rem);
423
+ color: #fff;
424
+ text-shadow: 0 1px 3px rgba(0,0,0,0.5);
425
+ }
426
+
427
+ .agent-detail-hero-info .agent-detail-id {
428
+ display: block;
429
+ font-size: var(--text-xs);
430
+ color: rgba(255,255,255,0.7);
431
+ font-family: 'Space Mono', monospace;
432
+ text-shadow: 0 1px 2px rgba(0,0,0,0.5);
433
+ }
434
+
435
+ .agent-detail-theme-block {
436
+ padding: var(--space-2) var(--space-4);
437
+ border-bottom: 1px solid var(--white-05);
438
+ }
439
+
440
+ .agent-detail-theme {
441
+ display: block;
442
+ font-size: var(--text-xs);
443
+ color: var(--text-muted);
444
+ font-style: italic;
445
+ line-height: 1.4;
446
+ }
447
+
448
+ /* Legacy agent avatar upload (for list view) */
449
+ .agent-avatar-upload {
450
+ position: relative;
451
+ width: 48px;
452
+ height: 48px;
453
+ min-width: 48px;
454
+ min-height: 48px;
455
+ max-width: 48px;
456
+ max-height: 48px;
457
+ border-radius: 50%;
458
+ cursor: pointer;
459
+ flex-shrink: 0;
460
+ overflow: hidden;
461
+ background: var(--bg-input);
462
+ display: flex;
463
+ align-items: center;
464
+ justify-content: center;
465
+ }
466
+
467
+ .agent-avatar-preview {
468
+ width: 48px;
469
+ height: 48px;
470
+ object-fit: cover;
471
+ border-radius: 50%;
472
+ display: none;
473
+ }
474
+
475
+ .agent-avatar-fallback {
476
+ font-size: var(--text-2xl);
477
+ display: flex;
478
+ align-items: center;
479
+ justify-content: center;
480
+ width: 100%;
481
+ height: 100%;
482
+ }
483
+
484
+ .agent-avatar-upload .agent-avatar-overlay {
485
+ position: absolute;
486
+ inset: 0;
487
+ background: rgba(0, 0, 0, 0.5);
488
+ display: flex;
489
+ align-items: center;
490
+ justify-content: center;
491
+ font-size: 16px;
492
+ opacity: 0;
493
+ transition: opacity 0.2s;
494
+ border-radius: 50%;
495
+ pointer-events: none;
496
+ }
497
+
498
+ .agent-avatar-upload:hover .agent-avatar-overlay {
499
+ opacity: 1;
500
+ }
501
+
502
+ .agent-detail-id {
503
+ display: block;
504
+ font-size: var(--text-xs);
505
+ color: var(--text-muted);
506
+ font-family: 'Space Mono', monospace;
507
+ }
508
+
509
+ /* Sections */
510
+ .agent-section {
511
+ border-bottom: 1px solid var(--white-05);
512
+ }
513
+
514
+ .agent-section:last-child {
515
+ border-bottom: none;
516
+ }
517
+
518
+ .agent-section-header {
519
+ padding: var(--space-2) var(--space-4);
520
+ background: var(--black-10);
521
+ }
522
+
523
+ .agent-section-title {
524
+ font-family: 'Space Mono', monospace;
525
+ font-size: var(--text-xs);
526
+ color: var(--text-muted);
527
+ text-transform: uppercase;
528
+ letter-spacing: 0.5px;
529
+ }
530
+
531
+ .agent-section-body {
532
+ padding: var(--space-2) var(--space-4);
533
+ }
534
+
535
+ /* Detail rows */
536
+ .agent-detail-row {
537
+ display: flex;
538
+ align-items: flex-start;
539
+ gap: var(--space-3);
540
+ padding: var(--space-1) 0;
541
+ }
542
+
543
+ .agent-detail-label {
544
+ font-size: var(--text-xs);
545
+ color: var(--text-muted);
546
+ min-width: 90px;
547
+ flex-shrink: 0;
548
+ padding-top: 2px;
549
+ }
550
+
551
+ .agent-detail-value {
552
+ font-size: var(--text-sm);
553
+ color: var(--text);
554
+ word-break: break-all;
555
+ }
556
+
557
+ .agent-detail-mono {
558
+ font-family: 'Space Mono', monospace;
559
+ font-size: var(--text-xs);
560
+ }
561
+
562
+ .agent-detail-muted {
563
+ color: var(--text-muted);
564
+ font-style: italic;
565
+ }
566
+
567
+ .agent-detail-inherited {
568
+ color: var(--text-muted);
569
+ font-size: 10px;
570
+ font-style: italic;
571
+ font-family: var(--font-sans, sans-serif);
572
+ }
573
+
574
+ /* In split view, hide satellite's own header (use side-panel header for consistency) */
575
+ .side-panel-content .satellite-nav-header {
576
+ display: none !important;
577
+ }
578
+
579
+ /* Show inline tabs when satellite nav header is hidden in split view */
580
+ .side-panel-content .satellite-nav-tabs-inline {
581
+ display: flex !important;
582
+ gap: 0;
583
+ padding: 0 var(--space-4);
584
+ border-bottom: 1px solid var(--border);
585
+ flex-shrink: 0;
586
+ }
587
+
588
+ /* Navigator inside side-panel: fill the space, remove fixed positioning */
589
+ .side-panel-content .satellite-navigator {
590
+ position: static;
591
+ width: 100%;
592
+ max-width: none;
593
+ max-height: none;
594
+ height: 100%;
595
+ border: none;
596
+ border-radius: 0;
597
+ box-shadow: none;
598
+ z-index: auto;
599
+ }
600
+
601
+ .side-panel-content .satellite-navigator.visible {
602
+ display: flex !important;
603
+ }
604
+
605
+ /* Tool tags */
606
+ .agent-tool-tags {
607
+ display: flex;
608
+ flex-wrap: wrap;
609
+ gap: 4px;
610
+ }
611
+
612
+ .agent-tool-tag {
613
+ display: inline-block;
614
+ font-size: 10px;
615
+ padding: 2px 6px;
616
+ border-radius: var(--radius-md);
617
+ background: var(--white-05);
618
+ color: var(--text-muted);
619
+ font-family: 'Space Mono', monospace;
620
+ }
621
+
622
+ .agent-tool-allow {
623
+ background: rgba(34, 197, 94, 0.15);
624
+ color: rgb(34, 197, 94);
625
+ }
626
+
627
+ .agent-tool-deny {
628
+ background: rgba(239, 68, 68, 0.15);
629
+ color: rgb(239, 68, 68);
630
+ }
631
+
632
+ /* Section header with edit button */
633
+ .agent-section-header {
634
+ display: flex;
635
+ align-items: center;
636
+ justify-content: space-between;
637
+ }
638
+
639
+ .agent-section-actions {
640
+ display: flex;
641
+ gap: 6px;
642
+ }
643
+
644
+ .agent-section-btn {
645
+ font-size: 10px;
646
+ padding: 2px 8px;
647
+ border-radius: var(--radius-md);
648
+ border: 1px solid var(--border);
649
+ background: transparent;
650
+ color: var(--text-muted);
651
+ cursor: pointer;
652
+ font-family: 'Space Mono', monospace;
653
+ text-transform: uppercase;
654
+ letter-spacing: 0.5px;
655
+ transition: all 0.15s ease;
656
+ }
657
+
658
+ .agent-section-btn:hover {
659
+ color: var(--text-primary);
660
+ border-color: var(--text-muted);
661
+ }
662
+
663
+ .agent-section-edit:hover {
664
+ color: var(--accent);
665
+ border-color: var(--accent);
666
+ }
667
+
668
+ .agent-section-save {
669
+ background: var(--accent);
670
+ color: var(--bg);
671
+ border-color: var(--accent);
672
+ }
673
+
674
+ .agent-section-save:hover {
675
+ opacity: 0.9;
676
+ }
677
+
678
+ .agent-section-cancel:hover {
679
+ color: var(--text-primary);
680
+ }
681
+
682
+ /* Edit form fields */
683
+ .agent-edit-field {
684
+ margin-bottom: 10px;
685
+ }
686
+
687
+ .agent-edit-field:last-child {
688
+ margin-bottom: 0;
689
+ }
690
+
691
+ .agent-edit-label {
692
+ display: block;
693
+ font-size: 10px;
694
+ color: var(--text-muted);
695
+ text-transform: uppercase;
696
+ letter-spacing: 0.5px;
697
+ margin-bottom: 4px;
698
+ font-family: 'Space Mono', monospace;
699
+ }
700
+
701
+ .agent-edit-hint {
702
+ text-transform: none;
703
+ letter-spacing: 0;
704
+ opacity: 0.6;
705
+ }
706
+
707
+ .agent-edit-input,
708
+ .agent-edit-select,
709
+ .agent-edit-textarea {
710
+ width: 100%;
711
+ padding: 6px 8px;
712
+ border: 1px solid var(--border);
713
+ border-radius: var(--radius-md);
714
+ background: var(--black-20);
715
+ color: var(--text-primary);
716
+ font-size: 12px;
717
+ font-family: 'Space Mono', monospace;
718
+ outline: none;
719
+ transition: border-color 0.15s ease;
720
+ }
721
+
722
+ .agent-edit-input:focus,
723
+ .agent-edit-select:focus,
724
+ .agent-edit-textarea:focus {
725
+ border-color: var(--accent);
726
+ }
727
+
728
+ .agent-edit-input-short {
729
+ width: 80px;
730
+ }
731
+
732
+ .agent-edit-select {
733
+ cursor: pointer;
734
+ }
735
+
736
+ .agent-edit-textarea {
737
+ resize: vertical;
738
+ min-height: 60px;
739
+ }
740
+
741
+ /* Tool groups editor */
742
+ .agent-tools-grid {
743
+ margin-top: 8px;
744
+ }
745
+
746
+ .agent-tool-group {
747
+ margin-bottom: 8px;
748
+ border: 1px solid var(--white-05);
749
+ border-radius: var(--radius-md);
750
+ overflow: hidden;
751
+ }
752
+
753
+ .agent-tool-group-label {
754
+ display: flex;
755
+ align-items: center;
756
+ gap: 6px;
757
+ padding: 6px 8px;
758
+ background: var(--black-20);
759
+ cursor: pointer;
760
+ font-size: 12px;
761
+ color: var(--text-primary);
762
+ }
763
+
764
+ .agent-tool-group-label:hover {
765
+ background: var(--white-05);
766
+ }
767
+
768
+ .agent-tool-group-hint {
769
+ font-size: 9px;
770
+ color: var(--text-muted);
771
+ margin-left: auto;
772
+ font-family: 'Space Mono', monospace;
773
+ }
774
+
775
+ .agent-tool-group-items {
776
+ display: flex;
777
+ flex-wrap: wrap;
778
+ gap: 2px;
779
+ padding: 4px 8px 6px;
780
+ }
781
+
782
+ .agent-tool-item-label {
783
+ display: flex;
784
+ align-items: center;
785
+ gap: 4px;
786
+ font-size: 11px;
787
+ color: var(--text-muted);
788
+ cursor: pointer;
789
+ padding: 2px 4px;
790
+ border-radius: 3px;
791
+ }
792
+
793
+ .agent-tool-item-label:hover {
794
+ color: var(--text-primary);
795
+ background: var(--white-05);
796
+ }
797
+
798
+ .agent-tool-group-check,
799
+ .agent-tool-item-check {
800
+ accent-color: var(--accent);
801
+ }
802
+
803
+ /* Agent list actions (create button) */
804
+ .agents-list-actions {
805
+ padding: 8px 12px;
806
+ }
807
+
808
+ .agents-create-btn {
809
+ width: 100%;
810
+ padding: 8px 12px;
811
+ border: 1px dashed var(--border);
812
+ border-radius: var(--radius-md);
813
+ background: transparent;
814
+ color: var(--text-muted);
815
+ font-size: 12px;
816
+ font-family: 'Space Mono', monospace;
817
+ cursor: pointer;
818
+ transition: all 0.15s ease;
819
+ }
820
+
821
+ .agents-create-btn:hover {
822
+ border-color: var(--accent);
823
+ color: var(--accent);
824
+ background: var(--white-05);
825
+ }
826
+
827
+ .agents-create-submit {
828
+ border-style: solid;
829
+ background: var(--accent);
830
+ color: var(--bg);
831
+ border-color: var(--accent);
832
+ }
833
+
834
+ .agents-create-submit:hover {
835
+ opacity: 0.9;
836
+ color: var(--bg);
837
+ border-color: var(--accent);
838
+ }
839
+
840
+ /* Create form */
841
+ .agent-create-title {
842
+ font-size: 16px;
843
+ font-weight: 600;
844
+ color: var(--text-primary);
845
+ padding: 0 12px 4px;
846
+ }
847
+
848
+ .agent-create-warning {
849
+ font-size: 11px;
850
+ color: var(--text-muted);
851
+ padding: 6px 12px;
852
+ margin: 0 12px 8px;
853
+ background: rgba(234, 179, 8, 0.1);
854
+ border: 1px solid rgba(234, 179, 8, 0.25);
855
+ border-radius: var(--radius-md);
856
+ }
857
+
858
+ /* Delete button in detail header */
859
+ .agent-detail-delete {
860
+ font-size: 10px;
861
+ padding: 3px 8px;
862
+ border-radius: var(--radius-md);
863
+ border: 1px solid rgba(239, 68, 68, 0.4);
864
+ background: transparent;
865
+ color: rgb(239, 68, 68);
866
+ cursor: pointer;
867
+ font-family: 'Space Mono', monospace;
868
+ text-transform: uppercase;
869
+ letter-spacing: 0.5px;
870
+ transition: all 0.15s ease;
871
+ }
872
+
873
+ .agent-detail-delete:hover {
874
+ background: rgba(239, 68, 68, 0.15);
875
+ border-color: rgb(239, 68, 68);
876
+ }
877
+
878
+ /* Delete confirmation overlay */
879
+ .agent-confirm-overlay {
880
+ position: absolute;
881
+ top: 0;
882
+ left: 0;
883
+ right: 0;
884
+ bottom: 0;
885
+ background: var(--black-80);
886
+ display: flex;
887
+ align-items: center;
888
+ justify-content: center;
889
+ z-index: 10;
890
+ padding: 20px;
891
+ }
892
+
893
+ .agent-confirm-dialog {
894
+ background: var(--bg-secondary);
895
+ border: 1px solid var(--border);
896
+ border-radius: var(--radius-xl);
897
+ padding: 16px;
898
+ max-width: 320px;
899
+ width: 100%;
900
+ }
901
+
902
+ .agent-confirm-title {
903
+ font-size: 14px;
904
+ font-weight: 600;
905
+ color: var(--text-primary);
906
+ margin-bottom: 8px;
907
+ }
908
+
909
+ .agent-confirm-body {
910
+ font-size: 12px;
911
+ color: var(--text-muted);
912
+ margin-bottom: 12px;
913
+ line-height: 1.4;
914
+ }
915
+
916
+ .agent-confirm-actions {
917
+ display: flex;
918
+ gap: 8px;
919
+ justify-content: flex-end;
920
+ }
921
+
922
+ .agent-confirm-delete {
923
+ background: rgb(239, 68, 68) !important;
924
+ color: white !important;
925
+ border-color: rgb(239, 68, 68) !important;
926
+ }
927
+
928
+ .agent-confirm-delete:hover {
929
+ opacity: 0.9;
930
+ }
931
+
932
+ /* Restart overlay */
933
+ .agent-restart-overlay {
934
+ display: flex;
935
+ align-items: center;
936
+ justify-content: center;
937
+ height: 200px;
938
+ }
939
+
940
+ .agent-restart-content {
941
+ text-align: center;
942
+ }
943
+
944
+ .agent-restart-title {
945
+ font-size: 14px;
946
+ font-weight: 600;
947
+ color: var(--accent);
948
+ margin-top: 12px;
949
+ }
950
+
951
+ .agent-restart-sub {
952
+ font-size: 11px;
953
+ color: var(--text-muted);
954
+ margin-top: 4px;
955
+ }
956
+
957
+ /* Raw JSON section */
958
+ .agent-raw-toggle {
959
+ cursor: pointer;
960
+ }
961
+
962
+ .agent-raw-toggle:hover .agent-section-title {
963
+ color: var(--text-primary);
964
+ }
965
+
966
+ .agent-raw-chevron {
967
+ color: var(--text-muted);
968
+ font-size: 12px;
969
+ transition: transform 0.15s ease;
970
+ }
971
+
972
+ .agent-raw-json {
973
+ font-family: 'Space Mono', monospace;
974
+ font-size: 10px;
975
+ line-height: 1.5;
976
+ color: var(--text-muted);
977
+ background: var(--black-20);
978
+ border: 1px solid var(--white-05);
979
+ border-radius: var(--radius-md);
980
+ padding: 8px;
981
+ margin: 0;
982
+ overflow-x: auto;
983
+ white-space: pre;
984
+ max-height: 300px;
985
+ overflow-y: auto;
986
+ }
987
+
988
+ .agent-raw-copy {
989
+ margin-top: 6px;
990
+ font-size: 10px;
991
+ padding: 3px 8px;
992
+ border-radius: var(--radius-md);
993
+ border: 1px solid var(--border);
994
+ background: transparent;
995
+ color: var(--text-muted);
996
+ cursor: pointer;
997
+ font-family: 'Space Mono', monospace;
998
+ }
999
+
1000
+ .agent-raw-copy:hover {
1001
+ color: var(--accent);
1002
+ border-color: var(--accent);
1003
+ }
1004
+
1005
+ /* Tool presets */
1006
+ .agent-preset-bar {
1007
+ display: flex;
1008
+ flex-wrap: wrap;
1009
+ gap: 4px;
1010
+ }
1011
+
1012
+ .agent-preset-btn {
1013
+ font-size: 10px;
1014
+ padding: 3px 8px;
1015
+ border-radius: var(--radius-md);
1016
+ border: 1px solid var(--border);
1017
+ background: transparent;
1018
+ color: var(--text-muted);
1019
+ cursor: pointer;
1020
+ font-family: 'Space Mono', monospace;
1021
+ transition: all 0.15s ease;
1022
+ }
1023
+
1024
+ .agent-preset-btn:hover {
1025
+ border-color: var(--accent);
1026
+ color: var(--accent);
1027
+ }
1028
+
1029
+ .agent-preset-btn.active {
1030
+ background: var(--accent);
1031
+ color: var(--bg);
1032
+ border-color: var(--accent);
1033
+ }
1034
+
1035
+ /* Binding / routing editor */
1036
+ .agent-binding-info {
1037
+ font-size: 11px;
1038
+ color: var(--text-muted);
1039
+ line-height: 1.4;
1040
+ margin-bottom: 8px;
1041
+ }
1042
+
1043
+ .agent-binding-info em {
1044
+ color: var(--accent);
1045
+ font-style: normal;
1046
+ }
1047
+
1048
+ .agent-bindings-list {
1049
+ display: flex;
1050
+ flex-direction: column;
1051
+ gap: 8px;
1052
+ }
1053
+
1054
+ .agent-bindings-empty {
1055
+ font-size: 11px;
1056
+ padding: 8px 0;
1057
+ }
1058
+
1059
+ .agent-binding-row {
1060
+ display: flex;
1061
+ gap: 6px;
1062
+ align-items: flex-start;
1063
+ padding: 8px;
1064
+ background: var(--black-20);
1065
+ border: 1px solid var(--white-05);
1066
+ border-radius: var(--radius-md);
1067
+ }
1068
+
1069
+ .agent-binding-fields {
1070
+ flex: 1;
1071
+ display: grid;
1072
+ grid-template-columns: 1fr 1fr;
1073
+ gap: 6px;
1074
+ }
1075
+
1076
+ .agent-binding-fields .agent-edit-field {
1077
+ margin-bottom: 0;
1078
+ }
1079
+
1080
+ .agent-binding-fields .agent-edit-label {
1081
+ font-size: 9px;
1082
+ margin-bottom: 2px;
1083
+ }
1084
+
1085
+ .agent-binding-fields .agent-edit-input,
1086
+ .agent-binding-fields .agent-edit-select {
1087
+ font-size: 11px;
1088
+ padding: 4px 6px;
1089
+ }
1090
+
1091
+ .agent-binding-remove {
1092
+ flex-shrink: 0;
1093
+ width: 24px;
1094
+ height: 24px;
1095
+ display: flex;
1096
+ align-items: center;
1097
+ justify-content: center;
1098
+ border: 1px solid rgba(239, 68, 68, 0.3);
1099
+ background: transparent;
1100
+ color: rgba(239, 68, 68, 0.6);
1101
+ border-radius: var(--radius-md);
1102
+ cursor: pointer;
1103
+ font-size: 12px;
1104
+ margin-top: 14px;
1105
+ transition: all 0.15s ease;
1106
+ }
1107
+
1108
+ .agent-binding-remove:hover {
1109
+ background: rgba(239, 68, 68, 0.15);
1110
+ color: rgb(239, 68, 68);
1111
+ border-color: rgb(239, 68, 68);
1112
+ }
1113
+
1114
+ .agent-binding-add {
1115
+ margin-top: 8px;
1116
+ font-size: 11px;
1117
+ padding: 6px 12px;
1118
+ border: 1px dashed var(--border);
1119
+ background: transparent;
1120
+ color: var(--text-muted);
1121
+ border-radius: var(--radius-md);
1122
+ cursor: pointer;
1123
+ font-family: 'Space Mono', monospace;
1124
+ width: 100%;
1125
+ transition: all 0.15s ease;
1126
+ }
1127
+
1128
+ .agent-binding-add:hover {
1129
+ border-color: var(--accent);
1130
+ color: var(--accent);
1131
+ }
1132
+
1133
+ /* ============================================
1134
+ SWITCH OVERLAY
1135
+ ============================================ */
1136
+
1137
+ .satellite-switch-overlay {
1138
+ position: absolute;
1139
+ top: 0;
1140
+ left: 0;
1141
+ right: 0;
1142
+ bottom: 0;
1143
+ background: var(--black-80);
1144
+ display: flex;
1145
+ align-items: center;
1146
+ justify-content: center;
1147
+ z-index: 100;
1148
+ animation: fadeIn 0.15s ease;
1149
+ backdrop-filter: blur(2px);
1150
+ }
1151
+
1152
+ .satellite-switch-spinner {
1153
+ display: flex;
1154
+ flex-direction: column;
1155
+ align-items: center;
1156
+ gap: 8px;
1157
+ color: var(--text);
1158
+ font-size: 14px;
1159
+ }
1160
+
1161
+ .satellite-switch-spinner span:first-child {
1162
+ font-size: 32px;
1163
+ animation: satellitePulse 1s ease-in-out infinite;
1164
+ }
1165
+
1166
+ @keyframes satellitePulse {
1167
+ 0%, 100% { transform: scale(1); opacity: 1; }
1168
+ 50% { transform: scale(1.1); opacity: 0.7; }
1169
+ }
1170
+
1171
+ /* Input area disabled state during switch */
1172
+ .input-area.switching-satellite,
1173
+ .chat-input.switching-satellite {
1174
+ pointer-events: none;
1175
+ opacity: 0.5;
1176
+ transition: opacity 0.15s ease;
1177
+ }
1178
+
1179
+ /* ============================================
1180
+ PENDING DELETE STATE
1181
+ ============================================ */
1182
+
1183
+ .satellite-item.pending-delete {
1184
+ background: rgba(239, 68, 68, 0.15) !important;
1185
+ border-color: var(--error) !important;
1186
+ animation: pendingPulse 1s ease-in-out infinite;
1187
+ }
1188
+
1189
+ .satellite-item.pending-delete .satellite-item-delete {
1190
+ background: var(--error);
1191
+ color: white;
1192
+ border-radius: var(--radius-md);
1193
+ }
1194
+
1195
+ @keyframes pendingPulse {
1196
+ 0%, 100% { opacity: 1; }
1197
+ 50% { opacity: 0.7; }
1198
+ }
1199
+
1200
+ /* ============================================
1201
+ ANIMATIONS
1202
+ ============================================ */
1203
+
1204
+ @keyframes fadeIn {
1205
+ from { opacity: 0; }
1206
+ to { opacity: 1; }
1207
+ }
1208
+
1209
+ @keyframes pulse {
1210
+ 0%, 100% { opacity: 1; }
1211
+ 50% { opacity: 0.5; }
1212
+ }
1213
+
1214
+ @keyframes blink {
1215
+ 0%, 100% { opacity: 1; }
1216
+ 50% { opacity: 0.3; }
1217
+ }
1218
+
1219
+ /* ============================================
1220
+ MOBILE (< 480px)
1221
+ ============================================ */
1222
+
1223
+ @media (max-width: 480px) {
1224
+ .satellite-navigator {
1225
+ bottom: 140px;
1226
+ left: var(--space-4);
1227
+ right: var(--space-4);
1228
+ width: auto;
1229
+ }
1230
+ }
1231
+
1232
+ /* Accessibility: Respect reduced motion preference (M-09) */
1233
+ @media (prefers-reduced-motion: reduce) {
1234
+ *,
1235
+ *::before,
1236
+ *::after {
1237
+ animation-duration: 0.01ms !important;
1238
+ animation-iteration-count: 1 !important;
1239
+ transition-duration: 0.01ms !important;
1240
+ }
1241
+ }
1242
+
1243
+ /* === SHORTCUTS === */
1244
+
1245
+ /* ============================================
1246
+ KEYBOARD SHORTCUTS PANEL STYLES
1247
+ ============================================ */
1248
+
1249
+ .shortcuts-panel {
1250
+ position: fixed;
1251
+ top: 0;
1252
+ left: 0;
1253
+ right: 0;
1254
+ bottom: 0;
1255
+ background: rgba(0, 0, 0, 0.85);
1256
+ display: none;
1257
+ align-items: center;
1258
+ justify-content: center;
1259
+ z-index: var(--z-overlay);
1260
+ padding: var(--space-5);
1261
+ }
1262
+
1263
+ .shortcuts-panel.visible {
1264
+ display: flex;
1265
+ }
1266
+
1267
+ .shortcuts-panel-header {
1268
+ display: flex;
1269
+ align-items: center;
1270
+ justify-content: space-between;
1271
+ padding: var(--space-5) var(--space-6);
1272
+ border-bottom: 1px solid var(--border);
1273
+ }
1274
+
1275
+ .shortcuts-panel-header h3 {
1276
+ font-size: var(--text-lg);
1277
+ font-weight: 500;
1278
+ color: var(--text);
1279
+ margin: 0;
1280
+ }
1281
+
1282
+ .shortcuts-close {
1283
+ background: none;
1284
+ border: none;
1285
+ color: var(--text-muted);
1286
+ font-size: var(--text-2xl);
1287
+ cursor: pointer;
1288
+ min-width: 44px;
1289
+ min-height: 44px;
1290
+ display: flex;
1291
+ align-items: center;
1292
+ justify-content: center;
1293
+ line-height: 1;
1294
+ border-radius: var(--radius-md);
1295
+ }
1296
+
1297
+ .shortcuts-close:hover {
1298
+ color: var(--text);
1299
+ }
1300
+
1301
+ .shortcuts-panel > .shortcuts-panel-header,
1302
+ .shortcuts-panel > .shortcuts-list,
1303
+ .shortcuts-panel > .shortcuts-footer {
1304
+ /* Direct children styling */
1305
+ }
1306
+
1307
+ .shortcuts-panel-inner {
1308
+ background: var(--bg-secondary);
1309
+ border: 1px solid var(--border);
1310
+ border-radius: var(--radius-xl);
1311
+ width: 100%;
1312
+ max-width: 450px;
1313
+ max-height: 80vh;
1314
+ overflow: hidden;
1315
+ display: flex;
1316
+ flex-direction: column;
1317
+ }
1318
+
1319
+ .shortcuts-list {
1320
+ flex: 1;
1321
+ overflow-y: auto;
1322
+ padding: var(--space-3) 0;
1323
+ }
1324
+
1325
+ .shortcut-row {
1326
+ display: flex;
1327
+ align-items: center;
1328
+ justify-content: space-between;
1329
+ padding: var(--space-3) var(--space-6);
1330
+ transition: background 0.15s;
1331
+ }
1332
+
1333
+ .shortcut-row:hover {
1334
+ background: rgba(0, 240, 255, 0.05);
1335
+ }
1336
+
1337
+ .shortcut-desc {
1338
+ font-size: var(--text-base);
1339
+ color: var(--text);
1340
+ }
1341
+
1342
+ .shortcut-key {
1343
+ font-family: 'Space Mono', monospace;
1344
+ font-size: var(--text-sm);
1345
+ background: var(--bg-input);
1346
+ border: 1px solid var(--border);
1347
+ border-radius: var(--radius-md);
1348
+ padding: var(--space-1) var(--space-2);
1349
+ color: var(--accent);
1350
+ min-width: 60px;
1351
+ text-align: center;
1352
+ cursor: pointer;
1353
+ transition: all 0.15s ease;
1354
+ }
1355
+
1356
+ .shortcut-key:hover {
1357
+ border-color: var(--accent);
1358
+ background: rgba(0, 240, 255, 0.1);
1359
+ }
1360
+
1361
+ .shortcut-key.editing {
1362
+ border-color: var(--accent);
1363
+ background: rgba(0, 240, 255, 0.2);
1364
+ animation: pulse-border 1s infinite;
1365
+ color: var(--text);
1366
+ }
1367
+
1368
+ @keyframes pulse-border {
1369
+ 0%, 100% { border-color: var(--accent); }
1370
+ 50% { border-color: transparent; }
1371
+ }
1372
+
1373
+ .shortcuts-hint {
1374
+ padding: 0 var(--space-6);
1375
+ margin: 0 0 var(--space-2) 0;
1376
+ font-size: var(--text-xs);
1377
+ color: var(--text-muted);
1378
+ }
1379
+
1380
+ .shortcuts-footer {
1381
+ padding: var(--space-4) var(--space-6);
1382
+ border-top: 1px solid var(--border);
1383
+ display: flex;
1384
+ justify-content: flex-end;
1385
+ }
1386
+
1387
+ .shortcuts-reset {
1388
+ background: transparent;
1389
+ border: 1px solid var(--border);
1390
+ border-radius: var(--radius-md);
1391
+ padding: var(--space-2) var(--space-4);
1392
+ color: var(--text-muted);
1393
+ font-size: var(--text-sm);
1394
+ cursor: pointer;
1395
+ transition: all 0.15s;
1396
+ }
1397
+
1398
+ .shortcuts-reset:hover {
1399
+ border-color: var(--text-muted);
1400
+ color: var(--text);
1401
+ }
1402
+
1403
+ /* Settings button style */
1404
+ .setting-btn {
1405
+ background: var(--bg-input);
1406
+ border: 1px solid var(--border);
1407
+ border-radius: var(--radius-md);
1408
+ padding: var(--space-2) var(--space-4);
1409
+ color: var(--text-muted);
1410
+ font-size: var(--text-sm);
1411
+ cursor: pointer;
1412
+ transition: all 0.15s;
1413
+ }
1414
+
1415
+ .setting-btn:hover {
1416
+ border-color: var(--accent);
1417
+ color: var(--accent);
1418
+ }
1419
+
1420
+ /* Accessibility: Respect reduced motion preference (M-09) */
1421
+ @media (prefers-reduced-motion: reduce) {
1422
+ *,
1423
+ *::before,
1424
+ *::after {
1425
+ animation-duration: 0.01ms !important;
1426
+ animation-iteration-count: 1 !important;
1427
+ transition-duration: 0.01ms !important;
1428
+ }
1429
+ }
1430
+
1431
+ /* === TIMESTAMPS === */
1432
+
1433
+ /* ============================================
1434
+ TIMESTAMPS STYLES
1435
+ Small light text under message content
1436
+ ============================================ */
1437
+
1438
+ /* Timestamp inside message bubble */
1439
+ .message-timestamp {
1440
+ display: none;
1441
+ font-size: 0.65rem;
1442
+ font-family: 'Space Mono', monospace;
1443
+ color: var(--text-dim);
1444
+ margin-top: 6px;
1445
+ opacity: 0.5;
1446
+ user-select: none;
1447
+ line-height: 1;
1448
+ }
1449
+
1450
+ /* Show when enabled */
1451
+ .message.show-timestamp .message-timestamp {
1452
+ display: block;
1453
+ }
1454
+
1455
+ /* Slightly brighter on hover */
1456
+ .message:hover .message-timestamp {
1457
+ opacity: 0.8;
1458
+ }
1459
+
1460
+ /* Right-align for user messages */
1461
+ .message.user .message-timestamp {
1462
+ text-align: right;
1463
+ }
1464
+
1465
+ /* Left-align for assistant messages */
1466
+ .message.assistant .message-timestamp {
1467
+ text-align: left;
1468
+ }
1469
+