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