@mooncompany/uplink-chat 0.5.2 → 0.32.3

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 (215) hide show
  1. package/LICENSE +14 -1
  2. package/README.md +105 -3
  3. package/bin/uplink.js +3 -0
  4. package/middleware/error-handler.js +1 -0
  5. package/package.json +89 -5
  6. package/public/css/agents.1fd7567a.css +1499 -0
  7. package/public/css/app.bc7e7484.css +2819 -0
  8. package/public/css/artifacts.css +488 -0
  9. package/public/css/commands.css +77 -0
  10. package/public/css/connection.css +131 -0
  11. package/public/css/cron-panel.css +364 -0
  12. package/public/css/dashboard.css +233 -0
  13. package/public/css/developer.css +342 -0
  14. package/public/css/files.css +123 -0
  15. package/public/css/markdown.css +156 -0
  16. package/public/css/message-actions.css +285 -0
  17. package/public/css/mobile.css +614 -0
  18. package/public/css/panels-unified.css +485 -0
  19. package/public/css/premium.css +415 -0
  20. package/public/css/realtime.css +189 -0
  21. package/public/css/satellites.7fa72088.css +632 -0
  22. package/public/css/settings-redesign.css +1322 -0
  23. package/public/css/shortcuts.css +185 -0
  24. package/public/css/split-view.4bc23474.css +858 -0
  25. package/public/css/themes.css +387 -0
  26. package/public/css/timestamps.css +54 -0
  27. package/public/css/variables.css +81 -0
  28. package/public/dist/bundle.493af136.js +1 -0
  29. package/public/favicon-256.png +0 -0
  30. package/public/icon-192.png +0 -0
  31. package/public/icon-512.png +0 -0
  32. package/public/img/icons/icon-alert-triangle.svg +17 -0
  33. package/public/img/icons/icon-brain.svg +20 -0
  34. package/public/img/icons/icon-brand-python.svg +19 -0
  35. package/public/img/icons/icon-camera.svg +16 -0
  36. package/public/img/icons/icon-chart-bar.svg +18 -0
  37. package/public/img/icons/icon-check.svg +15 -0
  38. package/public/img/icons/icon-circle-check.svg +16 -0
  39. package/public/img/icons/icon-clipboard.svg +16 -0
  40. package/public/img/icons/icon-cloud.svg +15 -0
  41. package/public/img/icons/icon-confetti.svg +24 -0
  42. package/public/img/icons/icon-device-mobile.svg +17 -0
  43. package/public/img/icons/icon-diamond.svg +16 -0
  44. package/public/img/icons/icon-file-text.svg +19 -0
  45. package/public/img/icons/icon-file-type-css.svg +19 -0
  46. package/public/img/icons/icon-file-type-csv.svg +19 -0
  47. package/public/img/icons/icon-file-type-doc.svg +19 -0
  48. package/public/img/icons/icon-file-type-html.svg +23 -0
  49. package/public/img/icons/icon-file-type-js.svg +18 -0
  50. package/public/img/icons/icon-file-type-pdf.svg +20 -0
  51. package/public/img/icons/icon-file-zip.svg +22 -0
  52. package/public/img/icons/icon-file.svg +16 -0
  53. package/public/img/icons/icon-folder.svg +15 -0
  54. package/public/img/icons/icon-headphones.svg +17 -0
  55. package/public/img/icons/icon-hourglass.svg +18 -0
  56. package/public/img/icons/icon-keyboard.svg +22 -0
  57. package/public/img/icons/icon-link.svg +17 -0
  58. package/public/img/icons/icon-lock-open.svg +17 -0
  59. package/public/img/icons/icon-lock.svg +17 -0
  60. package/public/img/icons/icon-mail.svg +16 -0
  61. package/public/img/icons/icon-message-dots.svg +18 -0
  62. package/public/img/icons/icon-microphone-2.svg +16 -0
  63. package/public/img/icons/icon-microphone.svg +18 -0
  64. package/public/img/icons/icon-movie.svg +22 -0
  65. package/public/img/icons/icon-music.svg +18 -0
  66. package/public/img/icons/icon-palette.svg +18 -0
  67. package/public/img/icons/icon-paperclip.svg +15 -0
  68. package/public/img/icons/icon-pencil.svg +16 -0
  69. package/public/img/icons/icon-photo.svg +18 -0
  70. package/public/img/icons/icon-presentation.svg +19 -0
  71. package/public/img/icons/icon-robot.svg +23 -0
  72. package/public/img/icons/icon-rocket.svg +17 -0
  73. package/public/img/icons/icon-satellite.svg +20 -0
  74. package/public/img/icons/icon-settings.svg +16 -0
  75. package/public/img/icons/icon-shield-lock.svg +17 -0
  76. package/public/img/icons/icon-sparkles.svg +15 -0
  77. package/public/img/icons/icon-star-filled.svg +11 -0
  78. package/public/img/icons/icon-tool.svg +15 -0
  79. package/public/img/icons/icon-trash.svg +19 -0
  80. package/public/img/icons/icon-volume.svg +17 -0
  81. package/public/img/icons/icon-world.svg +19 -0
  82. package/public/img/icons/icon-x.svg +16 -0
  83. package/public/img/logo.svg +13 -0
  84. package/public/img/wordmark.svg +35 -0
  85. package/public/index.html +1195 -0
  86. package/public/js/agents-data.js +1 -0
  87. package/public/js/agents-ui.js +1 -0
  88. package/public/js/agents.js +1 -0
  89. package/public/js/app.js +1 -0
  90. package/public/js/appearance-settings.js +1 -0
  91. package/public/js/artifacts.js +1 -0
  92. package/public/js/audio-pcm-processor.js +1 -0
  93. package/public/js/audio-queue.js +1 -0
  94. package/public/js/bootstrap.js +1 -0
  95. package/public/js/chat.js +1 -0
  96. package/public/js/commands.js +1 -0
  97. package/public/js/connection-api.js +1 -0
  98. package/public/js/connection.js +1 -0
  99. package/public/js/context-tracker.js +1 -0
  100. package/public/js/core.js +1 -0
  101. package/public/js/cron-panel.js +1 -0
  102. package/public/js/dashboard.js +1 -0
  103. package/public/js/developer.js +1 -0
  104. package/public/js/encryption.js +1 -0
  105. package/public/js/errors.js +1 -0
  106. package/public/js/event-bus.js +1 -0
  107. package/public/js/fetch-utils.js +1 -0
  108. package/public/js/file-handler.js +1 -0
  109. package/public/js/files.js +1 -0
  110. package/public/js/gateway-chat.js +1 -0
  111. package/public/js/logger.js +1 -0
  112. package/public/js/markdown.js +1 -0
  113. package/public/js/message-actions.js +1 -0
  114. package/public/js/message-renderer.js +1 -0
  115. package/public/js/missed-messages.js +1 -0
  116. package/public/js/mobile-debug.js +1 -0
  117. package/public/js/notifications.js +1 -0
  118. package/public/js/offline-queue.js +1 -0
  119. package/public/js/onboarding.js +1 -0
  120. package/public/js/panels.js +1 -0
  121. package/public/js/premium.js +1 -0
  122. package/public/js/primary-header.js +1 -0
  123. package/public/js/realtime-voice.js +1 -0
  124. package/public/js/satellite-sync.js +1 -0
  125. package/public/js/satellite-ui.js +1 -0
  126. package/public/js/satellites.js +1 -0
  127. package/public/js/settings.js +1 -0
  128. package/public/js/shortcuts.js +1 -0
  129. package/public/js/split-chat.js +1 -0
  130. package/public/js/split-resize.js +1 -0
  131. package/public/js/splitview.js +1 -0
  132. package/public/js/storage.js +1 -0
  133. package/public/js/streaming-handler.js +1 -0
  134. package/public/js/stt-settings.js +1 -0
  135. package/public/js/themes.js +1 -0
  136. package/public/js/timestamps.js +1 -0
  137. package/public/js/tts-settings.js +1 -0
  138. package/public/js/ui.js +1 -0
  139. package/public/js/update-notifier.js +1 -0
  140. package/public/js/utils/constants.js +1 -0
  141. package/public/js/utils/icons.js +1 -0
  142. package/public/js/utils/sanitize.js +1 -0
  143. package/public/js/utils/sse-parser.js +1 -0
  144. package/public/js/vad.js +1 -0
  145. package/public/js/vendor/dompurify.min.js +2 -0
  146. package/public/js/voice-settings-v2.js +1 -0
  147. package/public/js/voice.js +1 -0
  148. package/public/manifest.json +66 -0
  149. package/public/moon_texture.jpg +0 -0
  150. package/public/sw.js +1 -0
  151. package/public/three.min.js +6 -0
  152. package/public/u-icon.png +0 -0
  153. package/server/channel.js +1 -0
  154. package/server/chat.js +1 -0
  155. package/server/config-store.js +1 -0
  156. package/server/config.js +1 -0
  157. package/server/context.js +1 -0
  158. package/server/gateway-api-proxy.js +1 -0
  159. package/server/gateway-commands.js +1 -0
  160. package/server/gateway-proxy.js +1 -0
  161. package/server/index.js +1 -0
  162. package/server/logger.js +1 -0
  163. package/server/message-store.js +1 -0
  164. package/server/middleware/auth.js +1 -0
  165. package/server/middleware.js +1 -0
  166. package/server/openclaw-discover.js +1 -0
  167. package/server/premium/index.js +1 -0
  168. package/server/premium/license.js +1 -0
  169. package/server/realtime/bridge.js +1 -0
  170. package/server/realtime/index.js +1 -0
  171. package/server/realtime/tts-stream.js +1 -0
  172. package/server/routes/agents.js +1 -0
  173. package/server/routes/artifacts.js +1 -0
  174. package/server/routes/chat.js +1 -0
  175. package/server/routes/config-settings.js +1 -0
  176. package/server/routes/config.js +1 -0
  177. package/server/routes/cron.js +1 -0
  178. package/server/routes/files.js +1 -0
  179. package/server/routes/index.js +1 -0
  180. package/server/routes/media.js +1 -0
  181. package/server/routes/missed-messages.js +1 -0
  182. package/server/routes/premium.js +1 -0
  183. package/server/routes/push.js +1 -0
  184. package/server/routes/satellite.js +1 -0
  185. package/server/routes/status.js +1 -0
  186. package/server/routes/stt.js +1 -0
  187. package/server/routes/voice.js +1 -0
  188. package/server/routes/webhooks.js +1 -0
  189. package/server/routes.js +1 -0
  190. package/server/runtime-config.js +1 -0
  191. package/server/share.js +1 -0
  192. package/server/stt/faster-whisper.js +1 -0
  193. package/server/stt/groq.js +1 -0
  194. package/server/stt/index.js +1 -0
  195. package/server/stt/openai.js +1 -0
  196. package/server/sync.js +1 -0
  197. package/server/tailscale-https.js +1 -0
  198. package/server/tts.js +1 -0
  199. package/server/update-checker.js +1 -0
  200. package/server/utils/filename.js +1 -0
  201. package/server/utils.js +1 -0
  202. package/server/watchdog.js +3 -0
  203. package/server/websocket/broadcast.js +1 -0
  204. package/server/websocket/connections.js +1 -0
  205. package/server/websocket/index.js +1 -0
  206. package/server/websocket/routing.js +1 -0
  207. package/server/websocket/sync.js +1 -0
  208. package/server.js +1 -0
  209. package/utils/detect-tool-usage.js +1 -0
  210. package/utils/errors.js +1 -0
  211. package/utils/html-escape.js +1 -0
  212. package/utils/id-sanitize.js +1 -0
  213. package/utils/response.js +1 -0
  214. package/utils/with-retry.js +1 -0
  215. package/index.js +0 -2
@@ -0,0 +1,632 @@
1
+ /* ============================================
2
+ SATELLITES MODULE STYLES
3
+ EXACT match to Activity panel (.dev-panel)
4
+ ============================================ */
5
+
6
+ /* Panel Container - matches dev-panel exactly */
7
+ .satellite-navigator {
8
+ position: fixed;
9
+ bottom: 160px;
10
+ right: var(--space-4);
11
+ width: 360px;
12
+ max-width: calc(100vw - var(--space-8));
13
+ max-height: 400px;
14
+ background: var(--bg-secondary);
15
+ border: 1px solid var(--border);
16
+ border-radius: var(--radius-xl);
17
+ z-index: var(--z-modal);
18
+ display: none;
19
+ flex-direction: column;
20
+ overflow: hidden;
21
+ box-shadow: 0 10px 40px var(--black-40);
22
+ }
23
+
24
+ .satellite-navigator.visible {
25
+ display: flex;
26
+ }
27
+
28
+ /* Header - matches dev-panel-header exactly */
29
+ .satellite-nav-header {
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: space-between;
33
+ padding: var(--space-3) var(--space-4);
34
+ border-bottom: 1px solid var(--border);
35
+ background: var(--black-20);
36
+ }
37
+
38
+ .satellite-nav-title {
39
+ font-family: var(--font-mono);
40
+ font-size: var(--text-sm);
41
+ color: var(--accent);
42
+ letter-spacing: 1px;
43
+ text-transform: uppercase;
44
+ }
45
+
46
+ .satellite-nav-close {
47
+ background: none;
48
+ border: none;
49
+ color: var(--text-muted);
50
+ font-size: var(--text-2xl);
51
+ cursor: pointer;
52
+ min-width: 44px;
53
+ min-height: 44px;
54
+ display: flex;
55
+ align-items: center;
56
+ justify-content: center;
57
+ line-height: 1;
58
+ border-radius: var(--radius-md);
59
+ }
60
+
61
+ .satellite-nav-close:hover {
62
+ color: var(--text);
63
+ }
64
+
65
+ /* Session Status Row */
66
+ .satellite-session-status {
67
+ display: flex;
68
+ align-items: center;
69
+ gap: var(--space-2);
70
+ padding: var(--space-2) var(--space-4);
71
+ font-size: var(--text-xs);
72
+ color: var(--text-muted);
73
+ border-bottom: 1px solid var(--border);
74
+ background: rgba(0, 0, 0, 0.1);
75
+ }
76
+
77
+ .session-indicator {
78
+ font-size: 8px;
79
+ transition: color 0.3s;
80
+ }
81
+
82
+ .session-indicator.connected {
83
+ color: var(--success);
84
+ animation: pulse 2s infinite;
85
+ }
86
+
87
+ .session-indicator.disconnected {
88
+ color: var(--error);
89
+ }
90
+
91
+ .session-indicator.loading {
92
+ color: var(--warning);
93
+ animation: blink 1s infinite;
94
+ }
95
+
96
+ .session-key {
97
+ font-family: var(--font-mono, monospace);
98
+ font-size: 10px;
99
+ opacity: 0.7;
100
+ cursor: pointer;
101
+ transition: opacity 0.2s;
102
+ overflow: hidden;
103
+ text-overflow: ellipsis;
104
+ white-space: nowrap;
105
+ max-width: 200px;
106
+ }
107
+
108
+ .session-key:hover {
109
+ opacity: 1;
110
+ }
111
+
112
+ /* Satellite List - content area */
113
+ .satellite-list {
114
+ flex: 1;
115
+ overflow-y: auto;
116
+ padding: 0;
117
+ }
118
+
119
+ /* Satellite Item — conversation row */
120
+ .satellite-item {
121
+ display: flex;
122
+ align-items: center;
123
+ gap: var(--space-3);
124
+ padding: var(--space-3) var(--space-4);
125
+ margin: 0;
126
+ cursor: pointer;
127
+ transition: background 0.15s;
128
+ border-bottom: 1px solid var(--white-05);
129
+ position: relative;
130
+ }
131
+
132
+ .satellite-item:last-child {
133
+ border-bottom: none;
134
+ }
135
+
136
+ .satellite-item:hover {
137
+ background: var(--white-05);
138
+ }
139
+
140
+ .satellite-item.current {
141
+ background: var(--accent-10, rgba(99, 102, 241, 0.12));
142
+ }
143
+
144
+ /* Avatar */
145
+ .satellite-item-avatar-wrap {
146
+ flex-shrink: 0;
147
+ width: 48px;
148
+ height: 48px;
149
+ border-radius: 50%;
150
+ overflow: hidden;
151
+ display: flex;
152
+ align-items: center;
153
+ justify-content: center;
154
+ background: var(--white-05);
155
+ }
156
+
157
+ .satellite-item-avatar {
158
+ width: 48px;
159
+ height: 48px;
160
+ border-radius: 50%;
161
+ object-fit: cover;
162
+ }
163
+
164
+ .satellite-item-avatar-fallback {
165
+ display: none;
166
+ align-items: center;
167
+ justify-content: center;
168
+ width: 48px;
169
+ height: 48px;
170
+ color: var(--text-muted);
171
+ }
172
+
173
+ .satellite-item-avatar-wrap.no-avatar .satellite-item-avatar-fallback {
174
+ display: flex;
175
+ }
176
+
177
+ /* Content area - name/time on top, preview below */
178
+ .satellite-item-content {
179
+ flex: 1;
180
+ min-width: 0;
181
+ display: flex;
182
+ flex-direction: column;
183
+ gap: 2px;
184
+ }
185
+
186
+ .satellite-item-top-row {
187
+ display: flex;
188
+ align-items: baseline;
189
+ justify-content: space-between;
190
+ gap: var(--space-2);
191
+ }
192
+
193
+ .satellite-item-name {
194
+ font-size: var(--text-sm);
195
+ font-weight: 600;
196
+ color: var(--text);
197
+ white-space: nowrap;
198
+ overflow: hidden;
199
+ text-overflow: ellipsis;
200
+ min-width: 0;
201
+ }
202
+
203
+ .satellite-item-time {
204
+ font-size: 11px;
205
+ color: var(--text-muted);
206
+ white-space: nowrap;
207
+ flex-shrink: 0;
208
+ }
209
+
210
+ .satellite-item-bottom-row {
211
+ display: flex;
212
+ align-items: center;
213
+ justify-content: space-between;
214
+ gap: var(--space-2);
215
+ }
216
+
217
+ .satellite-item-preview {
218
+ font-size: var(--text-xs);
219
+ color: var(--text-muted);
220
+ white-space: nowrap;
221
+ overflow: hidden;
222
+ text-overflow: ellipsis;
223
+ min-width: 0;
224
+ line-height: 1.4;
225
+ }
226
+
227
+ .satellite-preview-you {
228
+ color: var(--accent);
229
+ font-weight: 500;
230
+ }
231
+
232
+ .satellite-item-unread {
233
+ flex-shrink: 0;
234
+ min-width: 20px;
235
+ height: 20px;
236
+ border-radius: 10px;
237
+ background: var(--accent);
238
+ color: var(--text-inverse, #fff);
239
+ font-size: 11px;
240
+ font-weight: 600;
241
+ display: flex;
242
+ align-items: center;
243
+ justify-content: center;
244
+ padding: 0 6px;
245
+ }
246
+
247
+ .satellite-unread-dot {
248
+ width: 8px;
249
+ height: 8px;
250
+ border-radius: 50%;
251
+ background: var(--accent);
252
+ flex-shrink: 0;
253
+ margin-left: auto;
254
+ }
255
+
256
+ /* Item Actions (edit, delete buttons) - overlay on hover */
257
+ .satellite-item-actions {
258
+ display: flex;
259
+ gap: var(--space-1);
260
+ opacity: 0;
261
+ transition: opacity 0.15s;
262
+ flex-shrink: 0;
263
+ position: absolute;
264
+ right: var(--space-2);
265
+ top: 50%;
266
+ transform: translateY(-50%);
267
+ background: var(--bg-secondary);
268
+ border-radius: var(--radius-md);
269
+ padding: 2px;
270
+ box-shadow: 0 2px 8px var(--black-20);
271
+ }
272
+
273
+ .satellite-item:hover .satellite-item-actions {
274
+ opacity: 1;
275
+ }
276
+
277
+ /* Show actions on touch devices */
278
+ @media (hover: none), (pointer: coarse) {
279
+ .satellite-item-actions {
280
+ opacity: 1;
281
+ position: static;
282
+ transform: none;
283
+ background: none;
284
+ box-shadow: none;
285
+ padding: 0;
286
+ }
287
+ }
288
+
289
+ .satellite-item-btn {
290
+ background: none;
291
+ border: none;
292
+ min-width: 32px;
293
+ min-height: 32px;
294
+ display: flex;
295
+ align-items: center;
296
+ justify-content: center;
297
+ font-size: var(--text-sm);
298
+ border-radius: var(--radius-md);
299
+ cursor: pointer;
300
+ transition: background 0.15s;
301
+ color: var(--text-muted);
302
+ touch-action: manipulation;
303
+ }
304
+
305
+ .satellite-item-btn:hover {
306
+ background: var(--white-10);
307
+ color: var(--text);
308
+ }
309
+
310
+ /* Bottom Actions */
311
+ .satellite-nav-actions {
312
+ padding: var(--space-3) var(--space-4);
313
+ border-top: 1px solid var(--border);
314
+ }
315
+
316
+ .satellite-nav-btn {
317
+ width: 100%;
318
+ padding: var(--space-2) var(--space-4);
319
+ background: var(--accent);
320
+ color: var(--text-inverse);
321
+ border: none;
322
+ border-radius: var(--radius-md);
323
+ font-size: var(--text-sm);
324
+ font-weight: 500;
325
+ cursor: pointer;
326
+ transition: background 0.2s, transform 0.1s;
327
+ }
328
+
329
+ .satellite-nav-btn:hover {
330
+ background: var(--accent-hover);
331
+ transform: translateY(-1px);
332
+ }
333
+
334
+ .satellite-nav-btn:active {
335
+ transform: translateY(0);
336
+ }
337
+
338
+ /* ============================================
339
+ NAME PROMPT (for new satellite)
340
+ ============================================ */
341
+
342
+ .satellite-name-prompt {
343
+ padding: var(--space-3);
344
+ border-bottom: 1px solid var(--border);
345
+ background: var(--bg);
346
+ position: relative;
347
+ z-index: 10;
348
+ }
349
+
350
+ .satellite-name-input {
351
+ width: 100%;
352
+ padding: var(--space-2) var(--space-3);
353
+ border: 1px solid var(--border);
354
+ border-radius: var(--radius-md);
355
+ background: var(--bg-input);
356
+ color: var(--text);
357
+ font-size: var(--text-base);
358
+ margin-bottom: var(--space-2);
359
+ }
360
+
361
+ .satellite-name-input:focus {
362
+ outline: none;
363
+ border-color: var(--accent);
364
+ }
365
+
366
+ /* Agent selector field */
367
+ .satellite-agent-field {
368
+ margin-bottom: var(--space-2);
369
+ display: flex;
370
+ align-items: center;
371
+ gap: var(--space-2);
372
+ }
373
+
374
+ .satellite-agent-label {
375
+ font-size: var(--text-xs);
376
+ color: var(--text-muted);
377
+ text-transform: uppercase;
378
+ letter-spacing: 0.05em;
379
+ flex-shrink: 0;
380
+ }
381
+
382
+ /* Custom dropdown */
383
+ .satellite-agent-dropdown {
384
+ position: relative;
385
+ flex: 1;
386
+ min-width: 0;
387
+ }
388
+
389
+ .satellite-agent-trigger {
390
+ display: flex;
391
+ align-items: center;
392
+ justify-content: space-between;
393
+ width: 100%;
394
+ padding: var(--space-2) var(--space-3);
395
+ border: 1px solid var(--border);
396
+ border-radius: var(--radius-md);
397
+ background: var(--bg-input);
398
+ color: var(--text);
399
+ font-size: var(--text-sm);
400
+ cursor: pointer;
401
+ transition: border-color 0.15s;
402
+ white-space: nowrap;
403
+ }
404
+
405
+ .satellite-agent-trigger:hover {
406
+ border-color: var(--accent);
407
+ }
408
+
409
+ .satellite-agent-trigger:focus {
410
+ outline: none;
411
+ border-color: var(--accent);
412
+ }
413
+
414
+ .satellite-agent-chevron {
415
+ flex-shrink: 0;
416
+ transition: transform 0.15s;
417
+ opacity: 0.6;
418
+ }
419
+
420
+ .satellite-agent-dropdown.open .satellite-agent-chevron {
421
+ transform: rotate(180deg);
422
+ }
423
+
424
+ /* Options list */
425
+ .satellite-agent-options {
426
+ display: none;
427
+ position: absolute;
428
+ top: calc(100% + 4px);
429
+ left: 0;
430
+ min-width: 100%;
431
+ width: max-content;
432
+ max-height: 200px;
433
+ overflow-y: auto;
434
+ background: var(--bg);
435
+ border: 1px solid var(--border);
436
+ border-radius: var(--radius-md);
437
+ z-index: var(--z-modal, 500);
438
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
439
+ padding: var(--space-1) 0;
440
+ }
441
+
442
+ /* Themed scrollbar for agent list */
443
+ .satellite-agent-options::-webkit-scrollbar {
444
+ width: 6px;
445
+ }
446
+
447
+ .satellite-agent-options::-webkit-scrollbar-track {
448
+ background: transparent;
449
+ }
450
+
451
+ .satellite-agent-options::-webkit-scrollbar-thumb {
452
+ background: var(--accent-30, rgba(255, 165, 0, 0.3));
453
+ border-radius: 3px;
454
+ }
455
+
456
+ .satellite-agent-options::-webkit-scrollbar-thumb:hover {
457
+ background: var(--accent-50, rgba(255, 165, 0, 0.5));
458
+ }
459
+
460
+ /* Firefox scrollbar */
461
+ .satellite-agent-options {
462
+ scrollbar-width: thin;
463
+ scrollbar-color: var(--accent-30, rgba(255, 165, 0, 0.3)) transparent;
464
+ }
465
+
466
+ .satellite-agent-dropdown.open .satellite-agent-options {
467
+ display: block;
468
+ }
469
+
470
+ .satellite-agent-option {
471
+ padding: var(--space-2) var(--space-3);
472
+ font-size: var(--text-sm);
473
+ color: var(--text);
474
+ cursor: pointer;
475
+ transition: background 0.1s;
476
+ border-radius: var(--radius-sm, 4px);
477
+ margin: 0 var(--space-1);
478
+ white-space: nowrap;
479
+ }
480
+
481
+ .satellite-agent-option:hover {
482
+ background: var(--white-05, var(--hover));
483
+ }
484
+
485
+ .satellite-agent-option.selected {
486
+ background: var(--accent-10, rgba(255, 165, 0, 0.1));
487
+ color: var(--accent);
488
+ }
489
+
490
+ .satellite-prompt-buttons {
491
+ display: flex;
492
+ gap: var(--space-2);
493
+ justify-content: flex-end;
494
+ }
495
+
496
+ .satellite-prompt-cancel,
497
+ .satellite-prompt-create {
498
+ padding: var(--space-2) var(--space-4);
499
+ border-radius: var(--radius-md);
500
+ font-size: var(--text-sm);
501
+ cursor: pointer;
502
+ border: none;
503
+ }
504
+
505
+ .satellite-prompt-cancel {
506
+ background: transparent;
507
+ color: var(--text-muted);
508
+ border: 1px solid var(--border);
509
+ }
510
+
511
+ .satellite-prompt-cancel:hover {
512
+ background: var(--white-05);
513
+ }
514
+
515
+ .satellite-prompt-create {
516
+ background: var(--accent);
517
+ color: var(--text-inverse);
518
+ }
519
+
520
+ .satellite-prompt-create:hover {
521
+ background: var(--accent-hover);
522
+ }
523
+
524
+ /* ============================================
525
+ SWITCH OVERLAY
526
+ ============================================ */
527
+
528
+ .satellite-switch-overlay {
529
+ position: absolute;
530
+ top: 0;
531
+ left: 0;
532
+ right: 0;
533
+ bottom: 0;
534
+ background: var(--black-80);
535
+ display: flex;
536
+ align-items: center;
537
+ justify-content: center;
538
+ z-index: 100;
539
+ animation: fadeIn 0.15s ease;
540
+ backdrop-filter: blur(2px);
541
+ }
542
+
543
+ .satellite-switch-spinner {
544
+ display: flex;
545
+ flex-direction: column;
546
+ align-items: center;
547
+ gap: 8px;
548
+ color: var(--text);
549
+ font-size: 14px;
550
+ }
551
+
552
+ .satellite-switch-spinner span:first-child {
553
+ font-size: 32px;
554
+ animation: satellitePulse 1s ease-in-out infinite;
555
+ }
556
+
557
+ @keyframes satellitePulse {
558
+ 0%, 100% { transform: scale(1); opacity: 1; }
559
+ 50% { transform: scale(1.1); opacity: 0.7; }
560
+ }
561
+
562
+ /* Input area disabled state during switch */
563
+ .input-area.switching-satellite,
564
+ .chat-input.switching-satellite {
565
+ pointer-events: none;
566
+ opacity: 0.5;
567
+ transition: opacity 0.15s ease;
568
+ }
569
+
570
+ /* ============================================
571
+ PENDING DELETE STATE
572
+ ============================================ */
573
+
574
+ .satellite-item.pending-delete {
575
+ background: rgba(239, 68, 68, 0.15) !important;
576
+ border-color: var(--error) !important;
577
+ animation: pendingPulse 1s ease-in-out infinite;
578
+ }
579
+
580
+ .satellite-item.pending-delete .satellite-item-delete {
581
+ background: var(--error);
582
+ color: white;
583
+ border-radius: var(--radius-md);
584
+ }
585
+
586
+ @keyframes pendingPulse {
587
+ 0%, 100% { opacity: 1; }
588
+ 50% { opacity: 0.7; }
589
+ }
590
+
591
+ /* ============================================
592
+ ANIMATIONS
593
+ ============================================ */
594
+
595
+ @keyframes fadeIn {
596
+ from { opacity: 0; }
597
+ to { opacity: 1; }
598
+ }
599
+
600
+ @keyframes pulse {
601
+ 0%, 100% { opacity: 1; }
602
+ 50% { opacity: 0.5; }
603
+ }
604
+
605
+ @keyframes blink {
606
+ 0%, 100% { opacity: 1; }
607
+ 50% { opacity: 0.3; }
608
+ }
609
+
610
+ /* ============================================
611
+ MOBILE (< 480px)
612
+ ============================================ */
613
+
614
+ @media (max-width: 480px) {
615
+ .satellite-navigator {
616
+ bottom: 140px;
617
+ left: var(--space-4);
618
+ right: var(--space-4);
619
+ width: auto;
620
+ }
621
+ }
622
+
623
+ /* Accessibility: Respect reduced motion preference (M-09) */
624
+ @media (prefers-reduced-motion: reduce) {
625
+ *,
626
+ *::before,
627
+ *::after {
628
+ animation-duration: 0.01ms !important;
629
+ animation-iteration-count: 1 !important;
630
+ transition-duration: 0.01ms !important;
631
+ }
632
+ }