clay-server 2.7.2 → 2.8.2

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 (55) hide show
  1. package/bin/cli.js +31 -17
  2. package/lib/config.js +7 -4
  3. package/lib/project.js +343 -15
  4. package/lib/public/app.js +1039 -134
  5. package/lib/public/apple-touch-icon-dark.png +0 -0
  6. package/lib/public/apple-touch-icon.png +0 -0
  7. package/lib/public/clay-logo.png +0 -0
  8. package/lib/public/css/base.css +18 -1
  9. package/lib/public/css/filebrowser.css +1 -0
  10. package/lib/public/css/home-hub.css +455 -0
  11. package/lib/public/css/icon-strip.css +6 -5
  12. package/lib/public/css/loop.css +141 -23
  13. package/lib/public/css/messages.css +2 -0
  14. package/lib/public/css/mobile-nav.css +38 -12
  15. package/lib/public/css/overlays.css +205 -169
  16. package/lib/public/css/playbook.css +264 -0
  17. package/lib/public/css/profile.css +268 -0
  18. package/lib/public/css/scheduler-modal.css +1429 -0
  19. package/lib/public/css/scheduler.css +1305 -0
  20. package/lib/public/css/sidebar.css +305 -11
  21. package/lib/public/css/sticky-notes.css +23 -19
  22. package/lib/public/css/stt.css +155 -0
  23. package/lib/public/css/title-bar.css +14 -6
  24. package/lib/public/favicon-banded-32.png +0 -0
  25. package/lib/public/favicon-banded.png +0 -0
  26. package/lib/public/icon-192-dark.png +0 -0
  27. package/lib/public/icon-192.png +0 -0
  28. package/lib/public/icon-512-dark.png +0 -0
  29. package/lib/public/icon-512.png +0 -0
  30. package/lib/public/icon-banded-76.png +0 -0
  31. package/lib/public/icon-banded-96.png +0 -0
  32. package/lib/public/index.html +336 -44
  33. package/lib/public/modules/ascii-logo.js +442 -0
  34. package/lib/public/modules/markdown.js +18 -0
  35. package/lib/public/modules/notifications.js +50 -63
  36. package/lib/public/modules/playbook.js +578 -0
  37. package/lib/public/modules/profile.js +357 -0
  38. package/lib/public/modules/project-settings.js +1 -9
  39. package/lib/public/modules/scheduler.js +2826 -0
  40. package/lib/public/modules/server-settings.js +1 -1
  41. package/lib/public/modules/sidebar.js +376 -32
  42. package/lib/public/modules/stt.js +272 -0
  43. package/lib/public/modules/terminal.js +32 -0
  44. package/lib/public/modules/theme.js +3 -10
  45. package/lib/public/style.css +6 -0
  46. package/lib/public/sw.js +82 -3
  47. package/lib/public/wordmark-banded-20.png +0 -0
  48. package/lib/public/wordmark-banded-32.png +0 -0
  49. package/lib/public/wordmark-banded-64.png +0 -0
  50. package/lib/public/wordmark-banded-80.png +0 -0
  51. package/lib/scheduler.js +402 -0
  52. package/lib/sdk-bridge.js +3 -2
  53. package/lib/server.js +124 -3
  54. package/lib/sessions.js +35 -2
  55. package/package.json +1 -1
@@ -11,211 +11,165 @@
11
11
  position: relative;
12
12
  }
13
13
 
14
- /* --- Onboarding banner (sits above #top-bar) --- */
15
- #onboarding-banner {
16
- flex-shrink: 0;
17
- display: flex;
14
+ /* --- Top-bar pill badges (formerly full-width banners) --- */
15
+ .top-bar-pill {
16
+ display: inline-flex;
18
17
  align-items: center;
19
- justify-content: center;
20
- gap: 8px;
21
- padding: 6px 16px;
22
- background: var(--accent-8);
23
- border-bottom: 1px solid var(--accent-15);
24
- font-size: 12px;
25
- color: var(--text-secondary);
26
- z-index: 20;
18
+ gap: 4px;
19
+ padding: 2px 8px;
20
+ border-radius: 10px;
21
+ font-size: 11px;
22
+ font-weight: 600;
23
+ white-space: nowrap;
24
+ user-select: none;
25
+ line-height: 1;
27
26
  }
28
27
 
29
- #onboarding-banner.hidden { display: none; }
28
+ .top-bar-pill .lucide { width: 12px; height: 12px; }
29
+ .top-bar-pill.hidden { display: none; }
30
30
 
31
- .onboarding-banner-text {
32
- display: flex;
33
- align-items: center;
34
- gap: 6px;
35
- }
36
-
37
- .onboarding-banner-text .lucide { width: 13px; height: 13px; color: var(--accent); }
31
+ /* Pill color variants */
32
+ .pill-success { background: color-mix(in srgb, var(--success) 12%, transparent); color: var(--success); }
33
+ .pill-accent { background: color-mix(in srgb, var(--accent) 12%, transparent); color: var(--accent); }
34
+ .pill-error { background: color-mix(in srgb, var(--error) 12%, transparent); color: var(--error); }
38
35
 
39
- .onboarding-banner-text a,
40
- .onboarding-banner-text button.onboarding-cta {
41
- color: var(--accent);
42
- font-weight: 500;
43
- text-decoration: none;
44
- background: none;
36
+ /* Clickable pill (update) */
37
+ button.top-bar-pill {
45
38
  border: none;
46
- font-family: inherit;
47
- font-size: inherit;
48
39
  cursor: pointer;
49
- padding: 0;
40
+ font-family: inherit;
41
+ transition: background 0.15s;
50
42
  }
43
+ button.top-bar-pill.pill-success:hover { background: color-mix(in srgb, var(--success) 20%, transparent); }
51
44
 
52
- .onboarding-banner-text a:hover,
53
- .onboarding-banner-text button.onboarding-cta:hover { text-decoration: underline; }
54
- .onboarding-step { color: var(--accent); font-weight: 600; font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; margin-right: 4px; }
55
-
56
- #onboarding-banner-close {
45
+ /* Pill close button (onboarding) */
46
+ .pill-close {
57
47
  background: none;
58
48
  border: none;
59
- color: var(--text-dimmer);
49
+ color: inherit;
60
50
  cursor: pointer;
61
- padding: 2px;
62
- display: flex;
51
+ padding: 0;
52
+ display: inline-flex;
63
53
  align-items: center;
64
- flex-shrink: 0;
54
+ opacity: 0.6;
55
+ transition: opacity 0.15s;
56
+ margin-left: 2px;
57
+ }
58
+ .pill-close:hover { opacity: 1; }
59
+ .pill-close .lucide { width: 10px; height: 10px; }
60
+
61
+ /* Onboarding pill text */
62
+ .onboarding-pill-text { display: inline-flex; align-items: center; gap: 4px; }
63
+ .onboarding-pill-text .lucide { width: 12px; height: 12px; }
64
+ .onboarding-pill-text a,
65
+ .onboarding-pill-text button.onboarding-cta {
66
+ color: inherit;
67
+ font-weight: 600;
68
+ text-decoration: underline;
69
+ background: none;
70
+ border: none;
71
+ font-family: inherit;
72
+ font-size: inherit;
73
+ cursor: pointer;
74
+ padding: 0;
65
75
  }
66
76
 
67
- #onboarding-banner-close .lucide { width: 14px; height: 14px; }
68
- #onboarding-banner-close:hover { color: var(--text-secondary); }
69
-
70
- /* --- Update / Announce banner (sits above #top-bar, full width) --- */
71
- #update-banner {
72
- flex-shrink: 0;
73
- display: flex;
74
- align-items: center;
75
- justify-content: center;
76
- gap: 8px;
77
- padding: 6px 16px;
78
- background: var(--success-8);
79
- border-bottom: 1px solid var(--success-15);
80
- font-size: 12px;
81
- color: var(--text-secondary);
77
+ /* Update pill wrapper */
78
+ #update-pill-wrap {
82
79
  position: relative;
83
- z-index: 20;
80
+ display: inline-flex;
84
81
  }
82
+ #update-pill-wrap.hidden { display: none; }
85
83
 
86
- #update-banner.hidden { display: none; }
84
+ /* Top-bar popover (shared) */
85
+ .top-bar-popover {
86
+ display: none;
87
+ position: absolute;
88
+ top: calc(100% + 6px);
89
+ right: 0;
90
+ background: var(--code-bg);
91
+ border: 1px solid var(--border);
92
+ border-radius: 10px;
93
+ padding: 8px;
94
+ z-index: 200;
95
+ box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
96
+ white-space: nowrap;
97
+ min-width: 200px;
98
+ }
87
99
 
88
- .update-banner-text {
100
+ .top-bar-popover.visible { display: block; }
101
+
102
+ .popover-row { padding: 4px 0; }
103
+ .popover-row + .popover-row { border-top: 1px solid var(--border-subtle); padding-top: 8px; margin-top: 4px; }
104
+
105
+ .popover-action {
89
106
  display: flex;
90
107
  align-items: center;
91
108
  gap: 6px;
92
- }
93
-
94
- .update-banner-text .lucide { width: 13px; height: 13px; color: var(--success); }
95
- .update-banner-text strong { color: var(--text); font-weight: 600; }
96
-
97
- #update-now {
98
- background: var(--success-15);
99
- border: 1px solid var(--success-25);
109
+ width: 100%;
110
+ background: none;
111
+ border: none;
100
112
  border-radius: 6px;
101
- color: var(--success);
113
+ color: var(--text-secondary);
102
114
  cursor: pointer;
103
115
  font-family: inherit;
104
- font-size: 11px;
116
+ font-size: 12px;
105
117
  font-weight: 500;
106
- padding: 3px 10px;
107
- flex-shrink: 0;
108
- transition: background 0.15s;
109
- }
110
-
111
- #update-now:hover { background: var(--success-25); }
112
- #update-now:disabled { opacity: 0.6; cursor: default; }
113
-
114
- #update-how {
115
- background: transparent;
116
- border: 1px solid var(--text-dimmer);
117
- border-radius: 6px;
118
- color: var(--text-dimmer);
119
- cursor: pointer;
120
- font-family: inherit;
121
- font-size: 11px;
122
- font-weight: 600;
123
- padding: 3px 7px;
124
- flex-shrink: 0;
118
+ padding: 6px 8px;
125
119
  transition: background 0.15s, color 0.15s;
126
120
  }
127
121
 
128
- #update-how:hover { background: rgba(var(--overlay-rgb), 0.05); color: var(--text-secondary); }
122
+ .popover-action .lucide { width: 14px; height: 14px; }
123
+ .popover-action:hover { background: rgba(var(--overlay-rgb), 0.06); color: var(--text); }
124
+ .popover-action:disabled { opacity: 0.5; cursor: default; }
129
125
 
130
- #update-popover {
131
- display: none;
132
- position: absolute;
133
- top: 100%;
134
- left: 50%;
135
- transform: translateX(-50%);
136
- background: var(--code-bg);
137
- border: 1px solid var(--border);
138
- border-radius: 10px;
139
- padding: 12px 16px;
140
- z-index: 200;
141
- box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
142
- white-space: nowrap;
143
- }
144
-
145
- #update-popover.visible { display: block; }
126
+ .popover-action-primary { color: var(--success); }
127
+ .popover-action-primary:hover { background: var(--success-8); color: var(--success); }
146
128
 
147
- #update-popover .popover-label {
148
- font-size: 12px;
129
+ .popover-label {
130
+ font-size: 11px;
149
131
  color: var(--text-muted);
150
- margin-bottom: 6px;
132
+ margin-bottom: 4px;
133
+ padding: 0 8px;
151
134
  }
152
135
 
153
- #update-popover .popover-cmd {
136
+ .popover-cmd {
154
137
  display: flex;
155
138
  align-items: center;
156
- gap: 8px;
139
+ gap: 6px;
140
+ padding: 0 8px;
157
141
  }
158
142
 
159
- #update-popover .popover-cmd code {
143
+ .popover-cmd code {
160
144
  font-family: "Roboto Mono", monospace;
161
- font-size: 13px;
145
+ font-size: 12px;
162
146
  color: var(--text);
163
147
  background: rgba(var(--overlay-rgb), 0.06);
164
- padding: 6px 12px;
148
+ padding: 4px 8px;
165
149
  border-radius: 6px;
166
150
  user-select: all;
167
151
  -webkit-user-select: all;
168
152
  }
169
153
 
170
- #update-popover .popover-copy {
154
+ .popover-copy {
171
155
  background: none;
172
156
  border: 1px solid var(--border);
173
157
  border-radius: 6px;
174
158
  color: var(--text-muted);
175
159
  cursor: pointer;
176
- padding: 5px 7px;
160
+ padding: 4px 6px;
177
161
  display: flex;
178
162
  align-items: center;
179
163
  justify-content: center;
180
164
  transition: color 0.15s, border-color 0.15s;
181
165
  }
182
166
 
183
- #update-popover .popover-copy .lucide { width: 14px; height: 14px; }
184
- #update-popover .popover-copy:hover { color: var(--text); border-color: var(--text-dimmer); }
185
- #update-popover .popover-copy.copied { color: var(--success); border-color: var(--success); }
186
-
187
- #update-banner-close {
188
- background: none;
189
- border: none;
190
- color: var(--text-dimmer);
191
- cursor: pointer;
192
- padding: 2px;
193
- display: flex;
194
- align-items: center;
195
- flex-shrink: 0;
196
- }
197
-
198
- #update-banner-close .lucide { width: 14px; height: 14px; }
199
- #update-banner-close:hover { color: var(--text-secondary); }
167
+ .popover-copy .lucide { width: 13px; height: 13px; }
168
+ .popover-copy:hover { color: var(--text); border-color: var(--text-dimmer); }
169
+ .popover-copy.copied { color: var(--success); border-color: var(--success); }
200
170
 
201
- /* --- Skip permissions banner (sits above #top-bar) --- */
202
- #skip-perms-banner {
203
- flex-shrink: 0;
204
- display: flex;
205
- align-items: center;
206
- justify-content: center;
207
- gap: 8px;
208
- padding: 6px 16px;
209
- background: var(--error-12);
210
- border-bottom: 1px solid var(--error-25);
211
- font-size: 12px;
212
- font-weight: 500;
213
- color: var(--error);
214
- z-index: 20;
215
- }
216
-
217
- #skip-perms-banner.hidden { display: none; }
218
- #skip-perms-banner .lucide { width: 14px; height: 14px; flex-shrink: 0; }
171
+ /* Skip permissions pill */
172
+ #skip-perms-pill .lucide { width: 12px; height: 12px; flex-shrink: 0; }
219
173
 
220
174
  /* --- Confirm modal --- */
221
175
  #confirm-modal {
@@ -294,6 +248,96 @@
294
248
 
295
249
  .confirm-ok:hover { opacity: 0.85; }
296
250
 
251
+ /* --- Remove project task dialog --- */
252
+ .remove-project-task-modal {
253
+ position: fixed;
254
+ inset: 0;
255
+ z-index: 310;
256
+ display: flex;
257
+ align-items: center;
258
+ justify-content: center;
259
+ }
260
+ .remove-project-task-backdrop {
261
+ position: absolute;
262
+ inset: 0;
263
+ background: rgba(0, 0, 0, 0.45);
264
+ }
265
+ .remove-project-task-dialog {
266
+ position: relative;
267
+ background: var(--bg);
268
+ border: 1px solid var(--border);
269
+ border-radius: 12px;
270
+ padding: 24px;
271
+ min-width: 340px;
272
+ max-width: 420px;
273
+ box-shadow: 0 8px 32px rgba(var(--shadow-rgb), 0.5);
274
+ }
275
+ .remove-project-task-title {
276
+ font-size: 15px;
277
+ font-weight: 700;
278
+ color: var(--text);
279
+ margin-bottom: 8px;
280
+ }
281
+ .remove-project-task-text {
282
+ font-size: 13px;
283
+ color: var(--text-secondary);
284
+ line-height: 1.5;
285
+ margin-bottom: 16px;
286
+ }
287
+ .remove-project-task-label {
288
+ font-size: 12px;
289
+ font-weight: 600;
290
+ color: var(--text-muted);
291
+ margin-bottom: 6px;
292
+ }
293
+ .remove-project-task-select {
294
+ width: 100%;
295
+ padding: 6px 10px;
296
+ border: 1px solid var(--border);
297
+ border-radius: 6px;
298
+ background: var(--bg-alt);
299
+ color: var(--text);
300
+ font-size: 13px;
301
+ font-family: inherit;
302
+ margin-bottom: 10px;
303
+ }
304
+ .remove-project-task-options {
305
+ display: flex;
306
+ flex-direction: column;
307
+ gap: 8px;
308
+ }
309
+ .remove-project-task-btn {
310
+ padding: 8px 16px;
311
+ border: 1px solid var(--border);
312
+ border-radius: 8px;
313
+ font-size: 13px;
314
+ font-weight: 600;
315
+ font-family: inherit;
316
+ cursor: pointer;
317
+ transition: background 0.12s, color 0.12s, border-color 0.12s;
318
+ }
319
+ .remove-project-task-btn.move {
320
+ background: var(--accent);
321
+ color: #fff;
322
+ border-color: var(--accent);
323
+ }
324
+ .remove-project-task-btn.move:hover { opacity: 0.85; }
325
+ .remove-project-task-btn.delete {
326
+ background: transparent;
327
+ color: var(--error);
328
+ border-color: var(--error);
329
+ }
330
+ .remove-project-task-btn.delete:hover {
331
+ background: color-mix(in srgb, var(--error) 12%, transparent);
332
+ }
333
+ .remove-project-task-btn.cancel {
334
+ background: transparent;
335
+ color: var(--text-secondary);
336
+ }
337
+ .remove-project-task-btn.cancel:hover {
338
+ background: rgba(var(--overlay-rgb), 0.06);
339
+ }
340
+
297
341
  /* --- Resume modal --- */
298
342
  /* --- Rewind modal --- */
299
343
  #rewind-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
@@ -659,14 +703,14 @@
659
703
 
660
704
  /* --- Connect overlay --- */
661
705
  #connect-overlay {
662
- position: absolute;
706
+ position: fixed;
663
707
  inset: 0;
664
708
  display: flex;
665
709
  flex-direction: column;
666
710
  align-items: center;
667
711
  justify-content: center;
668
- background: var(--bg);
669
- z-index: 50;
712
+ background: #000;
713
+ z-index: 999;
670
714
  transition: opacity 0.6s ease;
671
715
  }
672
716
 
@@ -675,26 +719,18 @@
675
719
  pointer-events: none;
676
720
  }
677
721
 
678
- .connect-logo {
679
- width: 48px;
680
- height: 48px;
681
- border-radius: 12px;
682
- animation: connect-breathe 3s ease-in-out infinite;
683
- }
684
-
685
- .connect-wordmark {
686
- margin-top: 12px;
687
- font-family: "Nunito", sans-serif;
688
- font-size: 20px;
689
- font-weight: 800;
690
- color: var(--text-dimmer);
691
- letter-spacing: 0.5px;
692
- animation: connect-breathe 3s ease-in-out infinite;
693
- animation-delay: 0.3s;
722
+ #ascii-logo-canvas {
723
+ width: 100%;
724
+ height: 100%;
725
+ max-width: 800px;
726
+ max-height: 400px;
694
727
  }
695
728
 
696
- @keyframes connect-breathe {
697
- 0%, 100% { opacity: 0.35; }
698
- 50% { opacity: 0.7; }
729
+ #connect-overlay-msg {
730
+ color: #555;
731
+ font-family: var(--font-mono);
732
+ font-size: 0.85rem;
733
+ margin-top: 1.2rem;
734
+ letter-spacing: 0.03em;
699
735
  }
700
736