@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,391 @@
1
+ /* ============================================
2
+ THEME STUDIO — Custom theme creator
3
+ Premium feature
4
+ ============================================ */
5
+
6
+ .tg-section {
7
+ padding: 4px 0;
8
+ }
9
+
10
+ .tg-header {
11
+ display: flex;
12
+ align-items: center;
13
+ gap: 8px;
14
+ margin-bottom: 14px;
15
+ }
16
+
17
+ .tg-title {
18
+ font-size: 0.85rem;
19
+ font-weight: 700;
20
+ color: var(--text);
21
+ letter-spacing: 0.3px;
22
+ }
23
+
24
+ .tg-badge {
25
+ font-size: 0.6rem;
26
+ font-weight: 600;
27
+ text-transform: uppercase;
28
+ letter-spacing: 0.05em;
29
+ padding: 2px 7px;
30
+ border-radius: 10px;
31
+ background: var(--accent);
32
+ color: var(--bg);
33
+ }
34
+
35
+ .tg-label {
36
+ font-size: 0.72rem;
37
+ font-weight: 600;
38
+ color: var(--text-muted);
39
+ text-transform: uppercase;
40
+ letter-spacing: 0.04em;
41
+ margin-bottom: 8px;
42
+ }
43
+
44
+ /* ── Saved themes list ── */
45
+ .tg-saved {
46
+ margin-bottom: 16px;
47
+ }
48
+
49
+ .tg-saved-list {
50
+ display: flex;
51
+ flex-direction: column;
52
+ gap: 4px;
53
+ }
54
+
55
+ .tg-saved-item {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: 10px;
59
+ padding: 8px 10px;
60
+ border-radius: 8px;
61
+ background: rgba(255, 255, 255, 0.03);
62
+ border: 1px solid transparent;
63
+ transition: background 0.15s, border-color 0.15s;
64
+ }
65
+
66
+ .tg-saved-item:hover {
67
+ background: rgba(255, 255, 255, 0.06);
68
+ }
69
+
70
+ .tg-saved-item.active {
71
+ border-color: var(--accent-20);
72
+ background: var(--accent-05);
73
+ }
74
+
75
+ .tg-saved-item.editing {
76
+ border-color: var(--accent);
77
+ background: var(--accent-10);
78
+ }
79
+
80
+ .tg-saved-swatch {
81
+ width: 20px;
82
+ height: 20px;
83
+ border-radius: 5px;
84
+ flex-shrink: 0;
85
+ border: 1px solid rgba(255, 255, 255, 0.1);
86
+ }
87
+
88
+ .tg-saved-name {
89
+ flex: 1;
90
+ font-size: 0.8rem;
91
+ color: var(--text);
92
+ font-weight: 500;
93
+ white-space: nowrap;
94
+ overflow: hidden;
95
+ text-overflow: ellipsis;
96
+ }
97
+
98
+ .tg-saved-badge {
99
+ font-size: 0.6rem;
100
+ font-weight: 600;
101
+ text-transform: uppercase;
102
+ color: var(--accent);
103
+ letter-spacing: 0.04em;
104
+ }
105
+
106
+ .tg-saved-actions {
107
+ display: flex;
108
+ gap: 2px;
109
+ opacity: 0;
110
+ transition: opacity 0.15s;
111
+ }
112
+
113
+ .tg-saved-item:hover .tg-saved-actions {
114
+ opacity: 1;
115
+ }
116
+
117
+ .tg-saved-btn {
118
+ background: none;
119
+ border: none;
120
+ color: var(--text-muted);
121
+ font-size: 0.8rem;
122
+ padding: 2px 6px;
123
+ border-radius: 4px;
124
+ cursor: pointer;
125
+ transition: color 0.15s, background 0.15s;
126
+ }
127
+
128
+ .tg-saved-btn:hover {
129
+ color: var(--text);
130
+ background: rgba(255, 255, 255, 0.08);
131
+ }
132
+
133
+ /* ── Editor ── */
134
+ .tg-editor {
135
+ border-top: 1px solid var(--border);
136
+ padding-top: 14px;
137
+ }
138
+
139
+ .tg-name-row {
140
+ margin-bottom: 14px;
141
+ }
142
+
143
+ .tg-name-input {
144
+ width: 100%;
145
+ padding: 8px 12px;
146
+ background: rgba(255, 255, 255, 0.05);
147
+ border: 1px solid var(--border);
148
+ border-radius: 8px;
149
+ color: var(--text);
150
+ font-size: 0.85rem;
151
+ font-weight: 600;
152
+ outline: none;
153
+ transition: border-color 0.15s;
154
+ box-sizing: border-box;
155
+ }
156
+
157
+ .tg-name-input:focus {
158
+ border-color: var(--accent);
159
+ }
160
+
161
+ .tg-name-input::placeholder {
162
+ color: var(--text-dim);
163
+ font-weight: 400;
164
+ }
165
+
166
+ /* ── Presets row ── */
167
+ .tg-presets-row {
168
+ margin-bottom: 14px;
169
+ }
170
+
171
+ .tg-presets {
172
+ display: flex;
173
+ flex-wrap: wrap;
174
+ gap: 6px;
175
+ }
176
+
177
+ .tg-preset {
178
+ display: flex;
179
+ align-items: center;
180
+ gap: 6px;
181
+ padding: 4px 10px 4px 4px;
182
+ background: rgba(255, 255, 255, 0.04);
183
+ border: 1px solid var(--border);
184
+ border-radius: 6px;
185
+ cursor: pointer;
186
+ transition: background 0.15s, border-color 0.15s;
187
+ }
188
+
189
+ .tg-preset:hover {
190
+ background: rgba(255, 255, 255, 0.08);
191
+ border-color: var(--text-dim);
192
+ }
193
+
194
+ .tg-preset-swatch {
195
+ width: 22px;
196
+ height: 22px;
197
+ border-radius: 4px;
198
+ flex-shrink: 0;
199
+ }
200
+
201
+ .tg-preset-name {
202
+ font-size: 0.7rem;
203
+ font-weight: 500;
204
+ color: var(--text-muted);
205
+ }
206
+
207
+ /* ── Color channels ── */
208
+ .tg-channels {
209
+ display: flex;
210
+ flex-direction: column;
211
+ gap: 8px;
212
+ margin-bottom: 14px;
213
+ }
214
+
215
+ .tg-channel {
216
+ display: flex;
217
+ align-items: center;
218
+ justify-content: space-between;
219
+ gap: 10px;
220
+ padding: 6px 0;
221
+ }
222
+
223
+ .tg-channel-info {
224
+ display: flex;
225
+ flex-direction: column;
226
+ min-width: 0;
227
+ }
228
+
229
+ .tg-channel-label {
230
+ font-size: 0.8rem;
231
+ font-weight: 600;
232
+ color: var(--text);
233
+ }
234
+
235
+ .tg-channel-desc {
236
+ font-size: 0.68rem;
237
+ color: var(--text-dim);
238
+ }
239
+
240
+ .tg-channel-controls {
241
+ display: flex;
242
+ align-items: center;
243
+ gap: 8px;
244
+ flex-shrink: 0;
245
+ }
246
+
247
+ /* ── Color picker ── */
248
+ .tg-picker-wrap {
249
+ position: relative;
250
+ width: 32px;
251
+ height: 32px;
252
+ flex-shrink: 0;
253
+ }
254
+
255
+ .tg-color-picker {
256
+ position: absolute;
257
+ inset: 0;
258
+ width: 100%;
259
+ height: 100%;
260
+ opacity: 0;
261
+ cursor: pointer;
262
+ z-index: 2;
263
+ }
264
+
265
+ .tg-picker-display {
266
+ width: 32px;
267
+ height: 32px;
268
+ border-radius: 6px;
269
+ border: 2px solid rgba(255, 255, 255, 0.1);
270
+ pointer-events: none;
271
+ transition: background 0.1s;
272
+ }
273
+
274
+ .tg-hex-input {
275
+ width: 80px;
276
+ padding: 5px 8px;
277
+ background: rgba(255, 255, 255, 0.05);
278
+ border: 1px solid var(--border);
279
+ border-radius: 6px;
280
+ color: var(--text);
281
+ font-family: 'Space Mono', monospace;
282
+ font-size: 0.75rem;
283
+ text-transform: uppercase;
284
+ letter-spacing: 0.03em;
285
+ outline: none;
286
+ transition: border-color 0.15s;
287
+ }
288
+
289
+ .tg-hex-input:focus {
290
+ border-color: var(--accent);
291
+ }
292
+
293
+ /* ── Preview ── */
294
+ .tg-preview {
295
+ border-radius: 10px;
296
+ overflow: hidden;
297
+ border: 1px solid var(--border);
298
+ margin-bottom: 14px;
299
+ }
300
+
301
+ .tg-preview-bar {
302
+ display: flex;
303
+ align-items: center;
304
+ gap: 8px;
305
+ padding: 8px 12px;
306
+ background: var(--bg-secondary);
307
+ transition: background 0.15s;
308
+ }
309
+
310
+ .tg-preview-dot {
311
+ width: 8px;
312
+ height: 8px;
313
+ border-radius: 50%;
314
+ flex-shrink: 0;
315
+ transition: background 0.15s;
316
+ }
317
+
318
+ .tg-preview-label {
319
+ font-size: 0.68rem;
320
+ font-weight: 600;
321
+ text-transform: uppercase;
322
+ letter-spacing: 0.05em;
323
+ transition: color 0.15s;
324
+ }
325
+
326
+ .tg-preview-chat {
327
+ padding: 10px 12px;
328
+ display: flex;
329
+ flex-direction: column;
330
+ gap: 6px;
331
+ min-height: 60px;
332
+ transition: background 0.15s;
333
+ }
334
+
335
+ .tg-preview-msg {
336
+ padding: 6px 10px;
337
+ border-radius: 8px;
338
+ font-size: 0.72rem;
339
+ max-width: 80%;
340
+ line-height: 1.4;
341
+ transition: background 0.15s, color 0.15s;
342
+ }
343
+
344
+ .tg-preview-assistant {
345
+ align-self: flex-start;
346
+ }
347
+
348
+ .tg-preview-user {
349
+ align-self: flex-end;
350
+ }
351
+
352
+ /* ── Action buttons ── */
353
+ .tg-actions {
354
+ display: flex;
355
+ gap: 8px;
356
+ }
357
+
358
+ .tg-btn {
359
+ flex: 1;
360
+ padding: 9px 16px;
361
+ border: none;
362
+ border-radius: 8px;
363
+ font-size: 0.8rem;
364
+ font-weight: 600;
365
+ cursor: pointer;
366
+ transition: opacity 0.15s, transform 0.1s;
367
+ }
368
+
369
+ .tg-btn:active {
370
+ transform: scale(0.97);
371
+ }
372
+
373
+ .tg-btn-primary {
374
+ background: var(--accent);
375
+ color: var(--bg);
376
+ }
377
+
378
+ .tg-btn-primary:hover {
379
+ opacity: 0.9;
380
+ }
381
+
382
+ .tg-btn-secondary {
383
+ background: rgba(255, 255, 255, 0.08);
384
+ color: var(--text-muted);
385
+ border: 1px solid var(--border);
386
+ }
387
+
388
+ .tg-btn-secondary:hover {
389
+ color: var(--text);
390
+ background: rgba(255, 255, 255, 0.12);
391
+ }