@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,483 @@
1
+ /**
2
+ * Unified Panel System
3
+ * Shared styles for all panels (Settings, Activity, Satellites)
4
+ * Mobile: Full-page slide-in | Desktop: Floating panels
5
+ */
6
+
7
+ /* ==========================================================================
8
+ Panel Container
9
+ ========================================================================== */
10
+
11
+ /* Base panel styles - internal layout only, positioning handled by split-view or mobile.css */
12
+ .panel {
13
+ display: none;
14
+ flex-direction: column;
15
+ background: var(--bg);
16
+ overflow: hidden;
17
+ }
18
+
19
+ .panel.visible {
20
+ display: flex;
21
+ }
22
+
23
+ /* Desktop: panels render inside .side-panel-content via split-view.js
24
+ No positioning rules here - just fill the container */
25
+ @media (min-width: 1024px) {
26
+ .panel {
27
+ /* Inside side-panel, just fill the space */
28
+ width: 100%;
29
+ height: 100%;
30
+ max-height: 100%;
31
+ border: none;
32
+ border-radius: 0;
33
+ box-shadow: none;
34
+ background: var(--bg);
35
+ }
36
+
37
+ .panel.visible {
38
+ display: flex;
39
+ animation: panel-fade-in 0.2s ease-out;
40
+ }
41
+ }
42
+
43
+ @keyframes panel-fade-in {
44
+ from {
45
+ opacity: 0;
46
+ transform: scale(0.97);
47
+ }
48
+ to {
49
+ opacity: 1;
50
+ transform: scale(1);
51
+ }
52
+ }
53
+
54
+ /* Mobile: Full-page slide-in (< 1024px breakpoint to match split-view) */
55
+ @media (max-width: 1023px) {
56
+ .panel {
57
+ position: fixed !important;
58
+ inset: 0 !important;
59
+ width: 100% !important;
60
+ height: 100% !important;
61
+ max-width: 100% !important;
62
+ max-height: 100% !important;
63
+ border-radius: 0 !important;
64
+ transform: translateX(100%);
65
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
66
+ background: var(--bg) !important;
67
+ z-index: var(--z-sticky) !important;
68
+ overflow-y: auto;
69
+ -webkit-overflow-scrolling: touch;
70
+ overscroll-behavior: contain;
71
+ }
72
+
73
+ .panel.visible {
74
+ display: flex !important;
75
+ flex-direction: column;
76
+ transform: translateX(0);
77
+ }
78
+ }
79
+
80
+ /* ==========================================================================
81
+ Panel Header
82
+ ========================================================================== */
83
+
84
+ .panel-header {
85
+ display: flex;
86
+ align-items: center;
87
+ justify-content: space-between;
88
+ padding: var(--space-4) var(--space-5);
89
+ border-bottom: 1px solid var(--border);
90
+ background: var(--bg);
91
+ position: sticky;
92
+ top: 0;
93
+ z-index: 1;
94
+ flex-shrink: 0;
95
+ }
96
+
97
+ .panel-title {
98
+ font-size: var(--text-base);
99
+ font-weight: 600;
100
+ color: var(--text);
101
+ }
102
+
103
+ .panel-close {
104
+ min-width: 44px;
105
+ min-height: 44px;
106
+ display: flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ background: none;
110
+ border: none;
111
+ color: var(--text-muted);
112
+ font-size: var(--text-xl);
113
+ cursor: pointer;
114
+ border-radius: var(--radius-md);
115
+ transition: color 0.2s, background 0.2s;
116
+ }
117
+
118
+ .panel-close:hover {
119
+ color: var(--text);
120
+ background: var(--white-10);
121
+ }
122
+
123
+ .panel-close:focus-visible {
124
+ outline: 2px solid var(--accent);
125
+ outline-offset: 2px;
126
+ }
127
+
128
+ /* ==========================================================================
129
+ Panel Content
130
+ ========================================================================== */
131
+
132
+ .panel-content {
133
+ flex: 1;
134
+ overflow-y: auto;
135
+ padding: var(--space-4) var(--space-5);
136
+ -webkit-overflow-scrolling: touch;
137
+ }
138
+
139
+ /* Scrollbar styling for panel content */
140
+ .panel-content::-webkit-scrollbar {
141
+ width: 6px;
142
+ }
143
+
144
+ .panel-content::-webkit-scrollbar-track {
145
+ background: transparent;
146
+ }
147
+
148
+ .panel-content::-webkit-scrollbar-thumb {
149
+ background: var(--border);
150
+ border-radius: 3px;
151
+ }
152
+
153
+ .panel-content::-webkit-scrollbar-thumb:hover {
154
+ background: var(--text-muted);
155
+ }
156
+
157
+ /* ==========================================================================
158
+ Panel Row (Settings-style rows)
159
+ ========================================================================== */
160
+
161
+ .panel-row {
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: space-between;
165
+ gap: var(--space-4);
166
+ padding: var(--space-4) 0;
167
+ border-bottom: 1px solid var(--border);
168
+ }
169
+
170
+ .panel-row:last-child {
171
+ border-bottom: none;
172
+ }
173
+
174
+ .panel-row-info {
175
+ flex: 1;
176
+ min-width: 0; /* Allow text truncation */
177
+ }
178
+
179
+ .panel-row-label {
180
+ font-size: var(--text-base);
181
+ font-weight: 500;
182
+ color: var(--text);
183
+ }
184
+
185
+ .panel-row-desc {
186
+ font-size: var(--text-sm);
187
+ color: var(--text-muted);
188
+ margin-top: var(--space-1);
189
+ }
190
+
191
+ @media (max-width: 768px) {
192
+ .panel-row {
193
+ padding: var(--space-4) var(--space-5);
194
+ min-height: 60px;
195
+ margin: 0 calc(-1 * var(--space-5)); /* Extend to edges */
196
+ }
197
+ }
198
+
199
+ /* ==========================================================================
200
+ Panel Tabs
201
+ ========================================================================== */
202
+
203
+ .panel-tabs {
204
+ display: flex;
205
+ border-bottom: 1px solid var(--border);
206
+ padding: 0 var(--space-4);
207
+ flex-shrink: 0;
208
+ }
209
+
210
+ .panel-tab {
211
+ flex: 1;
212
+ padding: var(--space-3) var(--space-4);
213
+ background: none;
214
+ border: none;
215
+ border-bottom: 2px solid transparent;
216
+ color: var(--text-muted);
217
+ font-size: var(--text-sm);
218
+ font-weight: 500;
219
+ cursor: pointer;
220
+ transition: all 0.2s;
221
+ min-height: 44px; /* Touch-friendly */
222
+ }
223
+
224
+ .panel-tab:hover {
225
+ color: var(--text);
226
+ background: var(--white-05);
227
+ }
228
+
229
+ .panel-tab.active {
230
+ color: var(--accent);
231
+ border-bottom-color: var(--accent);
232
+ }
233
+
234
+ .panel-tab:focus-visible {
235
+ outline: 2px solid var(--accent);
236
+ outline-offset: -2px;
237
+ }
238
+
239
+ /* ==========================================================================
240
+ Panel List Items (Satellites-style)
241
+ ========================================================================== */
242
+
243
+ .panel-item {
244
+ display: flex;
245
+ align-items: center;
246
+ gap: var(--space-3);
247
+ padding: var(--space-3) var(--space-4);
248
+ margin: var(--space-1) 0;
249
+ border-radius: var(--radius-md);
250
+ cursor: pointer;
251
+ transition: background 0.2s;
252
+ border: 1px solid transparent;
253
+ min-height: 44px; /* Touch-friendly */
254
+ }
255
+
256
+ .panel-item:hover {
257
+ background: var(--white-05);
258
+ }
259
+
260
+ .panel-item.active {
261
+ background: rgba(99, 102, 241, 0.15);
262
+ border-color: var(--accent);
263
+ }
264
+
265
+ .panel-item:focus-visible {
266
+ outline: 2px solid var(--accent);
267
+ outline-offset: 2px;
268
+ }
269
+
270
+ .panel-item-icon {
271
+ font-size: var(--text-lg);
272
+ flex-shrink: 0;
273
+ }
274
+
275
+ .panel-item-name {
276
+ flex: 1;
277
+ font-size: var(--text-sm);
278
+ font-weight: 500;
279
+ color: var(--text);
280
+ min-width: 0; /* Allow text truncation */
281
+ overflow: hidden;
282
+ text-overflow: ellipsis;
283
+ white-space: nowrap;
284
+ }
285
+
286
+ .panel-item-badge {
287
+ font-size: var(--text-xs);
288
+ color: var(--text-muted);
289
+ background: var(--bg-input);
290
+ padding: 2px var(--space-2);
291
+ border-radius: var(--radius-full);
292
+ flex-shrink: 0;
293
+ }
294
+
295
+ .panel-item-status {
296
+ width: 8px;
297
+ height: 8px;
298
+ border-radius: 50%;
299
+ background: var(--success);
300
+ flex-shrink: 0;
301
+ }
302
+
303
+ .panel-item-status.offline {
304
+ background: var(--text-muted);
305
+ }
306
+
307
+ .panel-item-status.error {
308
+ background: var(--error);
309
+ }
310
+
311
+ /* ==========================================================================
312
+ Panel Actions (bottom area)
313
+ ========================================================================== */
314
+
315
+ .panel-actions {
316
+ padding: var(--space-4) var(--space-5);
317
+ border-top: 1px solid var(--border);
318
+ background: var(--bg);
319
+ flex-shrink: 0;
320
+ }
321
+
322
+ .panel-btn {
323
+ width: 100%;
324
+ padding: var(--space-3) var(--space-4);
325
+ background: var(--accent);
326
+ color: var(--text-inverse);
327
+ border: none;
328
+ border-radius: var(--radius-md);
329
+ font-size: var(--text-sm);
330
+ font-weight: 500;
331
+ cursor: pointer;
332
+ transition: background 0.2s, transform 0.1s;
333
+ min-height: 44px; /* Touch-friendly */
334
+ }
335
+
336
+ .panel-btn:hover {
337
+ background: var(--accent-hover);
338
+ transform: translateY(-1px);
339
+ }
340
+
341
+ .panel-btn:active {
342
+ transform: translateY(0);
343
+ }
344
+
345
+ .panel-btn:focus-visible {
346
+ outline: 2px solid var(--accent);
347
+ outline-offset: 2px;
348
+ }
349
+
350
+ .panel-btn.secondary {
351
+ background: transparent;
352
+ color: var(--text);
353
+ border: 1px solid var(--border);
354
+ }
355
+
356
+ .panel-btn.secondary:hover {
357
+ background: var(--white-05);
358
+ border-color: var(--text-muted);
359
+ }
360
+
361
+ .panel-btn + .panel-btn {
362
+ margin-top: var(--space-2);
363
+ }
364
+
365
+ /* Inline action buttons */
366
+ .panel-actions-inline {
367
+ display: flex;
368
+ gap: var(--space-2);
369
+ }
370
+
371
+ .panel-actions-inline .panel-btn {
372
+ flex: 1;
373
+ }
374
+
375
+ /* ==========================================================================
376
+ Panel Empty State
377
+ ========================================================================== */
378
+
379
+ .panel-empty {
380
+ display: flex;
381
+ flex-direction: column;
382
+ align-items: center;
383
+ justify-content: center;
384
+ padding: var(--space-8) var(--space-4);
385
+ text-align: center;
386
+ color: var(--text-muted);
387
+ }
388
+
389
+ .panel-empty-icon {
390
+ font-size: 2rem;
391
+ margin-bottom: var(--space-3);
392
+ opacity: 0.5;
393
+ }
394
+
395
+ .panel-empty-text {
396
+ font-size: var(--text-sm);
397
+ }
398
+
399
+ /* ==========================================================================
400
+ Panel Loading State
401
+ ========================================================================== */
402
+
403
+ .panel-loading {
404
+ display: flex;
405
+ align-items: center;
406
+ justify-content: center;
407
+ padding: var(--space-8);
408
+ }
409
+
410
+ .panel-loading::after {
411
+ content: '';
412
+ width: 24px;
413
+ height: 24px;
414
+ border: 2px solid var(--border);
415
+ border-top-color: var(--accent);
416
+ border-radius: 50%;
417
+ animation: panel-spin 0.8s linear infinite;
418
+ }
419
+
420
+ @keyframes panel-spin {
421
+ to {
422
+ transform: rotate(360deg);
423
+ }
424
+ }
425
+
426
+ /* ==========================================================================
427
+ Panel Section Headers
428
+ ========================================================================== */
429
+
430
+ .panel-section {
431
+ margin-top: var(--space-6);
432
+ }
433
+
434
+ .panel-section:first-child {
435
+ margin-top: 0;
436
+ }
437
+
438
+ .panel-section-title {
439
+ font-size: var(--text-xs);
440
+ font-weight: 600;
441
+ text-transform: uppercase;
442
+ letter-spacing: 0.05em;
443
+ color: var(--text-muted);
444
+ margin-bottom: var(--space-3);
445
+ padding: 0 var(--space-1);
446
+ }
447
+
448
+ /* ==========================================================================
449
+ Panel Divider
450
+ ========================================================================== */
451
+
452
+ .panel-divider {
453
+ height: 1px;
454
+ background: var(--border);
455
+ margin: var(--space-4) 0;
456
+ }
457
+
458
+ /* ==========================================================================
459
+ Responsive Adjustments
460
+ ========================================================================== */
461
+
462
+ /* Tablet adjustments (still mobile behavior until 1024px) */
463
+ @media (min-width: 481px) and (max-width: 1023px) {
464
+ .panel-content {
465
+ padding: var(--space-5) var(--space-6);
466
+ }
467
+ }
468
+
469
+ /* Reduced motion */
470
+ @media (prefers-reduced-motion: reduce) {
471
+ .panel {
472
+ transition: none;
473
+ }
474
+
475
+ .panel-btn {
476
+ transition: none;
477
+ }
478
+
479
+ .panel-loading::after {
480
+ animation: none;
481
+ }
482
+ }
483
+