claude-relay 2.4.2 → 2.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.
Files changed (75) hide show
  1. package/bin/cli.js +1 -2350
  2. package/package.json +7 -42
  3. package/LICENSE +0 -21
  4. package/README.md +0 -281
  5. package/lib/cli-sessions.js +0 -270
  6. package/lib/config.js +0 -222
  7. package/lib/daemon.js +0 -423
  8. package/lib/ipc.js +0 -112
  9. package/lib/pages.js +0 -714
  10. package/lib/project.js +0 -1224
  11. package/lib/public/app.js +0 -2157
  12. package/lib/public/apple-touch-icon.png +0 -0
  13. package/lib/public/css/base.css +0 -145
  14. package/lib/public/css/diff.css +0 -128
  15. package/lib/public/css/filebrowser.css +0 -1076
  16. package/lib/public/css/highlight.css +0 -144
  17. package/lib/public/css/input.css +0 -512
  18. package/lib/public/css/menus.css +0 -683
  19. package/lib/public/css/messages.css +0 -1159
  20. package/lib/public/css/overlays.css +0 -731
  21. package/lib/public/css/rewind.css +0 -529
  22. package/lib/public/css/sidebar.css +0 -794
  23. package/lib/public/favicon.svg +0 -26
  24. package/lib/public/icon-192.png +0 -0
  25. package/lib/public/icon-512.png +0 -0
  26. package/lib/public/icon-mono.svg +0 -19
  27. package/lib/public/index.html +0 -460
  28. package/lib/public/manifest.json +0 -27
  29. package/lib/public/modules/diff.js +0 -398
  30. package/lib/public/modules/events.js +0 -21
  31. package/lib/public/modules/filebrowser.js +0 -1375
  32. package/lib/public/modules/fileicons.js +0 -172
  33. package/lib/public/modules/icons.js +0 -54
  34. package/lib/public/modules/input.js +0 -578
  35. package/lib/public/modules/markdown.js +0 -149
  36. package/lib/public/modules/notifications.js +0 -643
  37. package/lib/public/modules/qrcode.js +0 -70
  38. package/lib/public/modules/rewind.js +0 -334
  39. package/lib/public/modules/sidebar.js +0 -628
  40. package/lib/public/modules/state.js +0 -3
  41. package/lib/public/modules/terminal.js +0 -658
  42. package/lib/public/modules/theme.js +0 -622
  43. package/lib/public/modules/tools.js +0 -1410
  44. package/lib/public/modules/utils.js +0 -56
  45. package/lib/public/style.css +0 -10
  46. package/lib/public/sw.js +0 -75
  47. package/lib/push.js +0 -125
  48. package/lib/sdk-bridge.js +0 -771
  49. package/lib/server.js +0 -577
  50. package/lib/sessions.js +0 -402
  51. package/lib/terminal-manager.js +0 -187
  52. package/lib/terminal.js +0 -24
  53. package/lib/themes/ayu-light.json +0 -9
  54. package/lib/themes/catppuccin-latte.json +0 -9
  55. package/lib/themes/catppuccin-mocha.json +0 -9
  56. package/lib/themes/claude-light.json +0 -9
  57. package/lib/themes/claude.json +0 -9
  58. package/lib/themes/dracula.json +0 -9
  59. package/lib/themes/everforest-light.json +0 -9
  60. package/lib/themes/everforest.json +0 -9
  61. package/lib/themes/github-light.json +0 -9
  62. package/lib/themes/gruvbox-dark.json +0 -9
  63. package/lib/themes/gruvbox-light.json +0 -9
  64. package/lib/themes/monokai.json +0 -9
  65. package/lib/themes/nord-light.json +0 -9
  66. package/lib/themes/nord.json +0 -9
  67. package/lib/themes/one-dark.json +0 -9
  68. package/lib/themes/one-light.json +0 -9
  69. package/lib/themes/rose-pine-dawn.json +0 -9
  70. package/lib/themes/rose-pine.json +0 -9
  71. package/lib/themes/solarized-dark.json +0 -9
  72. package/lib/themes/solarized-light.json +0 -9
  73. package/lib/themes/tokyo-night-light.json +0 -9
  74. package/lib/themes/tokyo-night.json +0 -9
  75. package/lib/updater.js +0 -96
@@ -1,529 +0,0 @@
1
- /* --- Rewindable user messages (always active) --- */
2
- .msg-user[data-uuid] .bubble {
3
- cursor: pointer;
4
- transition: box-shadow 0.2s;
5
- position: relative;
6
- }
7
-
8
- .msg-user[data-uuid] .bubble:hover {
9
- box-shadow: 0 0 0 1.5px var(--text-dimmer);
10
- }
11
-
12
- .msg-user[data-uuid] .bubble::after {
13
- content: "Click to rewind";
14
- position: absolute;
15
- bottom: -22px;
16
- right: 0;
17
- font-size: 11px;
18
- color: var(--text-dimmer);
19
- opacity: 0;
20
- transition: opacity 0.15s;
21
- pointer-events: none;
22
- white-space: nowrap;
23
- }
24
-
25
- .msg-user[data-uuid] .bubble:hover::after {
26
- opacity: 1;
27
- }
28
-
29
- /* --- Rewind mode (timeline visible, strong markers) --- */
30
- #app.rewind-mode .msg-user[data-uuid] .bubble::after {
31
- content: "Rewind to here";
32
- color: var(--accent);
33
- }
34
-
35
- #app.rewind-mode .msg-user[data-uuid] .bubble {
36
- box-shadow: 0 0 0 2px var(--accent);
37
- }
38
-
39
- #app.rewind-mode .msg-user[data-uuid] .bubble:hover {
40
- box-shadow: 0 0 0 2px var(--accent-hover), 0 0 12px var(--accent-20);
41
- }
42
-
43
- #app.rewind-mode .msg-user:not([data-uuid]) { opacity: 0.35; }
44
- #app.rewind-mode .msg-assistant { opacity: 0.5; }
45
- #app.rewind-mode .tool-item { opacity: 0.4; }
46
- #app.rewind-mode .thinking-item { opacity: 0.4; }
47
- #app.rewind-mode .permission-container { opacity: 0.4; }
48
-
49
- .rewind-mode-banner {
50
- position: absolute;
51
- bottom: 76px;
52
- left: 50%;
53
- transform: translateX(-50%);
54
- padding: 8px 12px 8px 14px;
55
- font-size: 12px;
56
- color: var(--accent);
57
- display: flex;
58
- align-items: center;
59
- gap: 8px;
60
- background: var(--bg-alt);
61
- border: 1px solid var(--accent-25);
62
- border-radius: 20px;
63
- box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.3);
64
- z-index: 10;
65
- white-space: nowrap;
66
- }
67
-
68
- .rewind-mode-banner .lucide { width: 14px; height: 14px; }
69
-
70
- .rewind-banner-text {
71
- font-weight: 500;
72
- }
73
-
74
- .rewind-exit-btn {
75
- display: flex;
76
- align-items: center;
77
- justify-content: center;
78
- width: 22px;
79
- height: 22px;
80
- border-radius: 50%;
81
- border: none;
82
- background: var(--accent-15);
83
- color: var(--accent);
84
- cursor: pointer;
85
- padding: 0;
86
- flex-shrink: 0;
87
- transition: background 0.15s;
88
- }
89
-
90
- .rewind-exit-btn .lucide { width: 12px; height: 12px; }
91
- .rewind-exit-btn:hover { background: var(--accent-30); }
92
-
93
- /* --- Rewind timeline --- */
94
- .rewind-timeline {
95
- position: absolute;
96
- right: 8px;
97
- z-index: 10;
98
- pointer-events: none;
99
- }
100
-
101
- .rewind-timeline-track {
102
- position: relative;
103
- width: 2px;
104
- height: 100%;
105
- margin-left: auto;
106
- margin-right: 4px;
107
- background: var(--border);
108
- border-radius: 1px;
109
- }
110
-
111
- .rewind-timeline-viewport {
112
- position: absolute;
113
- left: -3px;
114
- width: 8px;
115
- background: var(--accent-20);
116
- border-radius: 4px;
117
- pointer-events: none;
118
- transition: top 0.1s ease, height 0.1s ease;
119
- }
120
-
121
- .rewind-timeline-marker {
122
- position: absolute;
123
- right: -5px;
124
- transform: translateY(-50%);
125
- height: 26px;
126
- max-width: 160px;
127
- padding: 0 10px 0 7px;
128
- border-radius: 13px;
129
- background: var(--bg-alt);
130
- border: 1.5px solid var(--border);
131
- cursor: pointer;
132
- pointer-events: all;
133
- display: flex;
134
- align-items: center;
135
- gap: 5px;
136
- white-space: nowrap;
137
- transition: border-color 0.15s, background 0.15s, box-shadow 0.15s;
138
- z-index: 1;
139
- }
140
-
141
- .rewind-timeline-marker .lucide {
142
- width: 13px;
143
- height: 13px;
144
- color: var(--text-dimmer);
145
- flex-shrink: 0;
146
- transition: color 0.15s;
147
- }
148
-
149
- .rewind-timeline-marker .marker-text {
150
- font-size: 11px;
151
- color: var(--text-muted);
152
- overflow: hidden;
153
- text-overflow: ellipsis;
154
- transition: color 0.15s;
155
- }
156
-
157
- .rewind-timeline-marker:hover {
158
- border-color: var(--accent);
159
- box-shadow: 0 2px 8px rgba(var(--shadow-rgb), 0.3);
160
- }
161
-
162
- .rewind-timeline-marker:hover .lucide,
163
- .rewind-timeline-marker:hover .marker-text {
164
- color: var(--accent);
165
- }
166
-
167
- .rewind-timeline-marker.in-view {
168
- border-color: var(--accent);
169
- background: var(--accent-bg);
170
- }
171
-
172
- .rewind-timeline-marker.in-view .lucide,
173
- .rewind-timeline-marker.in-view .marker-text {
174
- color: var(--accent);
175
- }
176
-
177
- @media (max-width: 768px) {
178
- .rewind-timeline-marker { max-width: 120px; height: 22px; padding: 0 7px 0 5px; gap: 3px; }
179
- .rewind-timeline-marker .lucide { width: 11px; height: 11px; }
180
- .rewind-timeline-marker .marker-text { font-size: 10px; }
181
- }
182
-
183
- .sys-msg {
184
- max-width: var(--content-width);
185
- margin: 6px auto;
186
- padding: 0 20px;
187
- text-align: center;
188
- }
189
-
190
- .sys-msg .sys-text {
191
- font-size: 12px;
192
- color: var(--text-dimmer);
193
- font-style: italic;
194
- }
195
-
196
- .sys-msg.error .sys-text { color: var(--error); }
197
-
198
- /* ==========================================================================
199
- Activity Indicator
200
- ========================================================================== */
201
-
202
- .activity-inline {
203
- max-width: var(--content-width);
204
- margin: 10px auto;
205
- padding: 0 20px;
206
- display: flex;
207
- align-items: center;
208
- gap: 8px;
209
- font-size: 14px;
210
- color: var(--accent);
211
- }
212
-
213
- .activity-inline .activity-icon {
214
- display: inline-flex;
215
- animation: sparkle 2s ease-in-out infinite;
216
- flex-shrink: 0;
217
- }
218
-
219
- .activity-inline .activity-icon .lucide {
220
- width: 16px;
221
- height: 16px;
222
- }
223
-
224
- .activity-inline .activity-text {
225
- overflow: hidden;
226
- text-overflow: ellipsis;
227
- white-space: nowrap;
228
- background: linear-gradient(90deg, var(--accent) 0%, var(--accent-hover) 50%, var(--accent) 100%);
229
- background-size: 200% auto;
230
- -webkit-background-clip: text;
231
- -webkit-text-fill-color: transparent;
232
- background-clip: text;
233
- animation: text-shimmer 3s ease-in-out infinite;
234
- }
235
-
236
- @keyframes text-shimmer {
237
- 0% { background-position: 200% center; }
238
- 100% { background-position: -200% center; }
239
- }
240
-
241
- /* ==========================================================================
242
- AskUserQuestion
243
- ========================================================================== */
244
-
245
- .ask-user-container {
246
- max-width: var(--content-width);
247
- margin: 12px auto;
248
- padding: 0 20px;
249
- }
250
-
251
- .ask-user-question {
252
- margin-bottom: 14px;
253
- }
254
-
255
- .ask-user-question-text {
256
- font-size: 15px;
257
- font-weight: 500;
258
- color: var(--text);
259
- margin-bottom: 10px;
260
- }
261
-
262
- .ask-user-options {
263
- display: flex;
264
- flex-wrap: wrap;
265
- gap: 8px;
266
- margin-bottom: 10px;
267
- }
268
-
269
- .ask-user-option {
270
- background: var(--bg-alt);
271
- border: 1px solid var(--border);
272
- border-radius: 12px;
273
- padding: 10px 16px;
274
- cursor: pointer;
275
- transition: background 0.15s, border-color 0.15s;
276
- text-align: left;
277
- max-width: 100%;
278
- color: inherit;
279
- font-family: inherit;
280
- }
281
-
282
- .ask-user-option:hover {
283
- background: rgba(var(--overlay-rgb), 0.06);
284
- border-color: var(--accent);
285
- }
286
-
287
- .ask-user-option .option-label {
288
- font-size: 14px;
289
- font-weight: 500;
290
- color: var(--text);
291
- }
292
-
293
- .ask-user-option .option-desc {
294
- font-size: 12px;
295
- color: var(--text-muted);
296
- margin-top: 3px;
297
- }
298
-
299
- .ask-user-option.selected {
300
- border-color: var(--accent);
301
- background: var(--accent-bg);
302
- }
303
-
304
- .ask-user-other {
305
- display: flex;
306
- gap: 8px;
307
- align-items: center;
308
- }
309
-
310
- .ask-user-other input {
311
- flex: 1;
312
- background: var(--input-bg);
313
- border: 1px solid var(--border);
314
- border-radius: 10px;
315
- color: var(--text);
316
- font-size: 14px;
317
- font-family: inherit;
318
- padding: 10px 14px;
319
- outline: none;
320
- transition: border-color 0.2s;
321
- }
322
-
323
- .ask-user-other input:focus { border-color: var(--text-dimmer); }
324
- .ask-user-other input::placeholder { color: var(--text-muted); }
325
-
326
- .ask-user-submit {
327
- background: var(--accent);
328
- color: #fff;
329
- border: none;
330
- border-radius: 10px;
331
- padding: 10px 18px;
332
- font-size: 13px;
333
- font-weight: 600;
334
- cursor: pointer;
335
- flex-shrink: 0;
336
- transition: background 0.15s;
337
- }
338
-
339
- .ask-user-submit:hover { background: var(--accent-hover); }
340
- .ask-user-submit:disabled { opacity: 0.4; cursor: default; }
341
-
342
- .ask-user-skip {
343
- background: transparent;
344
- border: 1px solid var(--border);
345
- border-radius: 10px;
346
- padding: 7px 18px;
347
- font-size: 13px;
348
- font-weight: 500;
349
- font-family: inherit;
350
- color: var(--text-muted);
351
- cursor: pointer;
352
- transition: background 0.15s, color 0.15s, border-color 0.15s;
353
- }
354
-
355
- .ask-user-skip:hover {
356
- background: rgba(var(--overlay-rgb), 0.04);
357
- color: var(--text-secondary);
358
- border-color: var(--text-dimmer);
359
- }
360
-
361
- .ask-user-container.answered .ask-user-skip { display: none; }
362
-
363
- .ask-user-container.answered .ask-user-option { cursor: default; opacity: 0.5; }
364
- .ask-user-container.answered .ask-user-option.selected { opacity: 1; }
365
- .ask-user-container.answered .ask-user-other input { opacity: 0.5; pointer-events: none; }
366
- .ask-user-container.answered .ask-user-submit { display: none; }
367
-
368
- /* ==========================================================================
369
- Permission Request
370
- ========================================================================== */
371
-
372
- .permission-container {
373
- max-width: var(--content-width);
374
- margin: 12px auto;
375
- padding: 0 20px;
376
- }
377
-
378
- .permission-container > :not(:last-child) { margin-bottom: 0; }
379
-
380
- .permission-header {
381
- display: flex;
382
- align-items: center;
383
- gap: 8px;
384
- padding: 10px 14px;
385
- background: rgba(var(--overlay-rgb), 0.03);
386
- border: 1px solid var(--border);
387
- border-bottom: none;
388
- border-radius: 12px 12px 0 0;
389
- color: var(--text-secondary);
390
- }
391
-
392
- .permission-icon { display: inline-flex; flex-shrink: 0; color: var(--text-muted); }
393
- .permission-icon .lucide { width: 16px; height: 16px; }
394
- .permission-title { font-size: 13px; font-weight: 500; }
395
-
396
- .permission-body {
397
- padding: 14px 16px;
398
- border: 1px solid var(--border);
399
- border-top: none;
400
- border-bottom: none;
401
- background: rgba(var(--overlay-rgb), 0.015);
402
- }
403
-
404
- .permission-summary {
405
- display: flex;
406
- align-items: center;
407
- gap: 10px;
408
- margin-bottom: 6px;
409
- }
410
-
411
- .permission-tool-name {
412
- font-weight: 600;
413
- font-size: 14px;
414
- color: var(--text);
415
- flex-shrink: 0;
416
- }
417
-
418
- .permission-tool-desc {
419
- font-size: 13px;
420
- color: var(--text-muted);
421
- font-family: "SF Mono", Menlo, Monaco, monospace;
422
- overflow: hidden;
423
- text-overflow: ellipsis;
424
- white-space: nowrap;
425
- }
426
-
427
- .permission-reason {
428
- font-size: 12px;
429
- color: var(--text-dimmer);
430
- font-style: italic;
431
- margin-bottom: 8px;
432
- }
433
-
434
- .permission-details { margin-top: 8px; }
435
- .permission-details summary {
436
- font-size: 12px;
437
- color: var(--text-dimmer);
438
- cursor: pointer;
439
- user-select: none;
440
- padding: 4px 0;
441
- }
442
- .permission-details summary:hover { color: var(--text-muted); }
443
-
444
- .permission-details pre {
445
- background: var(--code-bg);
446
- border: 1px solid var(--border-subtle);
447
- border-radius: 8px;
448
- padding: 10px 12px;
449
- font-family: "SF Mono", Menlo, Monaco, monospace;
450
- font-size: 12px;
451
- line-height: 1.5;
452
- color: var(--text-muted);
453
- white-space: pre-wrap;
454
- word-break: break-all;
455
- margin: 6px 0 0;
456
- max-height: 200px;
457
- overflow-y: auto;
458
- }
459
-
460
- .permission-actions {
461
- display: flex;
462
- gap: 8px;
463
- padding: 10px 14px;
464
- border: 1px solid var(--border);
465
- border-top: none;
466
- border-radius: 0 0 12px 12px;
467
- background: rgba(var(--overlay-rgb), 0.015);
468
- }
469
-
470
- .permission-btn {
471
- padding: 7px 16px;
472
- border-radius: 8px;
473
- border: 1px solid transparent;
474
- font-size: 13px;
475
- font-weight: 500;
476
- font-family: inherit;
477
- cursor: pointer;
478
- transition: opacity 0.15s, background 0.15s;
479
- }
480
-
481
- .permission-btn:hover { opacity: 0.85; }
482
-
483
- .permission-allow { background: var(--text-dimmer); color: #fff; }
484
- .permission-allow:hover { background: var(--text-muted); opacity: 1; }
485
- .permission-allow-session { background: var(--bg-alt); color: var(--text-secondary); border-color: var(--border); }
486
- .permission-allow-session:hover { background: var(--input-bg); opacity: 1; }
487
- .permission-deny { background: transparent; border-color: var(--border); color: var(--text-muted); }
488
- .permission-deny:hover { background: var(--error-8); border-color: var(--error); color: var(--error); opacity: 1; }
489
-
490
- /* Resolved states */
491
- .permission-container.resolved .permission-btn { display: none; }
492
- .permission-decision-label { font-size: 13px; font-weight: 500; }
493
-
494
- .permission-container.resolved-allowed .permission-decision-label { color: var(--text-muted); }
495
-
496
- .permission-container.resolved-denied .permission-header {
497
- border-color: var(--error-15);
498
- }
499
- .permission-container.resolved-denied .permission-body { border-color: var(--error-15); }
500
- .permission-container.resolved-denied .permission-actions { border-color: var(--error-15); }
501
- .permission-container.resolved-denied .permission-decision-label { color: var(--error); }
502
-
503
- .permission-container.resolved-cancelled .permission-decision-label { color: var(--text-dimmer); }
504
-
505
- .permission-container.resolved { opacity: 0.5; }
506
-
507
- /* ==========================================================================
508
- Images
509
- ========================================================================== */
510
-
511
- .bubble-images {
512
- display: flex;
513
- flex-wrap: wrap;
514
- gap: 6px;
515
- margin-bottom: 8px;
516
- }
517
-
518
- .bubble-images:last-child { margin-bottom: 0; }
519
-
520
- .bubble-img {
521
- max-width: 240px;
522
- max-height: 180px;
523
- border-radius: 12px;
524
- object-fit: cover;
525
- cursor: pointer;
526
- }
527
-
528
- .bubble-img:hover { opacity: 0.85; }
529
-