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
@@ -0,0 +1,264 @@
1
+ /* ==========================================================================
2
+ Playbook — interactive step-by-step tutorial modal
3
+ ========================================================================== */
4
+
5
+ .playbook-overlay {
6
+ position: fixed;
7
+ inset: 0;
8
+ background: rgba(0, 0, 0, 0.45);
9
+ z-index: 400;
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ animation: playbookFadeIn 0.2s ease;
14
+ }
15
+ .playbook-overlay.hidden {
16
+ display: none;
17
+ }
18
+
19
+ @keyframes playbookFadeIn {
20
+ from { opacity: 0; }
21
+ to { opacity: 1; }
22
+ }
23
+
24
+ .playbook-modal {
25
+ background: var(--bg);
26
+ border: 1px solid var(--border-subtle);
27
+ border-radius: 16px;
28
+ width: 420px;
29
+ max-width: 90vw;
30
+ max-height: 80vh;
31
+ overflow-y: auto;
32
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
33
+ outline: none;
34
+ animation: playbookSlideIn 0.25s ease;
35
+ display: flex;
36
+ flex-direction: column;
37
+ }
38
+ .playbook-modal.hidden {
39
+ display: none;
40
+ }
41
+
42
+ @keyframes playbookSlideIn {
43
+ from { opacity: 0; transform: translateY(12px) scale(0.97); }
44
+ to { opacity: 1; transform: translateY(0) scale(1); }
45
+ }
46
+
47
+ /* --- Header --- */
48
+ .playbook-header {
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: space-between;
52
+ padding: 18px 20px 0;
53
+ }
54
+ .playbook-header-left {
55
+ display: flex;
56
+ align-items: center;
57
+ gap: 8px;
58
+ }
59
+ .playbook-icon {
60
+ font-size: 18px;
61
+ }
62
+ .playbook-title {
63
+ font-size: 13px;
64
+ font-weight: 600;
65
+ color: var(--text-muted);
66
+ text-transform: uppercase;
67
+ letter-spacing: 0.5px;
68
+ }
69
+ .playbook-close {
70
+ background: none;
71
+ border: none;
72
+ color: var(--text-dimmer);
73
+ font-size: 20px;
74
+ cursor: pointer;
75
+ padding: 4px 8px;
76
+ border-radius: 6px;
77
+ line-height: 1;
78
+ transition: color 0.15s, background 0.15s;
79
+ }
80
+ .playbook-close:hover {
81
+ color: var(--text);
82
+ background: rgba(var(--overlay-rgb), 0.08);
83
+ }
84
+
85
+ /* --- Progress dots --- */
86
+ .playbook-progress {
87
+ display: flex;
88
+ gap: 6px;
89
+ justify-content: center;
90
+ padding: 16px 20px 4px;
91
+ }
92
+ .playbook-progress-dot {
93
+ width: 8px;
94
+ height: 8px;
95
+ border-radius: 50%;
96
+ background: var(--border-subtle);
97
+ transition: background 0.3s ease, transform 0.3s ease;
98
+ }
99
+ .playbook-progress-dot.done {
100
+ background: var(--accent);
101
+ opacity: 0.5;
102
+ }
103
+ .playbook-progress-dot.active {
104
+ background: var(--accent);
105
+ transform: scale(1.25);
106
+ }
107
+
108
+ /* --- Body --- */
109
+ .playbook-body {
110
+ padding: 16px 24px 8px;
111
+ flex: 1;
112
+ }
113
+ .playbook-step-title {
114
+ font-size: 20px;
115
+ font-weight: 700;
116
+ color: var(--text);
117
+ margin: 0 0 10px;
118
+ letter-spacing: -0.3px;
119
+ }
120
+ .playbook-step-body {
121
+ font-size: 14px;
122
+ line-height: 1.6;
123
+ color: var(--text-secondary);
124
+ }
125
+ .playbook-step-body strong {
126
+ color: var(--text);
127
+ font-weight: 600;
128
+ }
129
+ .playbook-step-note {
130
+ font-size: 12px;
131
+ color: var(--text-dimmer);
132
+ margin-top: 12px;
133
+ padding: 8px 12px;
134
+ background: rgba(var(--overlay-rgb), 0.04);
135
+ border-radius: 8px;
136
+ }
137
+
138
+ /* --- Action buttons --- */
139
+ .playbook-actions {
140
+ display: flex;
141
+ gap: 8px;
142
+ padding: 16px 24px 20px;
143
+ justify-content: flex-end;
144
+ }
145
+ .playbook-btn {
146
+ padding: 8px 18px;
147
+ border-radius: 8px;
148
+ font-size: 13px;
149
+ font-weight: 600;
150
+ cursor: pointer;
151
+ transition: background 0.15s, transform 0.1s;
152
+ border: none;
153
+ }
154
+ .playbook-btn:active {
155
+ transform: scale(0.97);
156
+ }
157
+ .playbook-btn:disabled {
158
+ opacity: 0.6;
159
+ cursor: default;
160
+ }
161
+ .playbook-btn-primary {
162
+ background: var(--accent);
163
+ color: #fff;
164
+ }
165
+ .playbook-btn-primary:hover:not(:disabled) {
166
+ filter: brightness(1.1);
167
+ }
168
+ .playbook-btn-secondary {
169
+ background: rgba(var(--overlay-rgb), 0.06);
170
+ color: var(--text-muted);
171
+ border: 1px solid var(--border-subtle);
172
+ }
173
+ .playbook-btn-secondary:hover:not(:disabled) {
174
+ background: rgba(var(--overlay-rgb), 0.1);
175
+ color: var(--text);
176
+ }
177
+
178
+ /* --- Hub playbook cards --- */
179
+ .hub-playbooks {
180
+ animation: hubCardIn 0.4s ease 0.20s both;
181
+ }
182
+ .hub-playbooks-grid {
183
+ display: flex;
184
+ gap: 8px;
185
+ flex-wrap: wrap;
186
+ }
187
+ .hub-playbook-card {
188
+ display: flex;
189
+ align-items: center;
190
+ gap: 10px;
191
+ padding: 10px 14px;
192
+ background: rgba(var(--overlay-rgb), 0.03);
193
+ border: 1px solid var(--border-subtle);
194
+ border-radius: 10px;
195
+ cursor: pointer;
196
+ transition: background 0.15s, border-color 0.15s;
197
+ flex: 1;
198
+ min-width: 180px;
199
+ }
200
+ .hub-playbook-card:hover {
201
+ background: rgba(var(--overlay-rgb), 0.07);
202
+ border-color: var(--accent);
203
+ }
204
+ .hub-playbook-card.completed {
205
+ background: rgba(76, 175, 80, 0.08);
206
+ border-color: rgba(76, 175, 80, 0.25);
207
+ }
208
+ .hub-playbook-card.completed:hover {
209
+ background: rgba(76, 175, 80, 0.14);
210
+ border-color: rgba(76, 175, 80, 0.4);
211
+ }
212
+ .hub-playbook-card-icon {
213
+ font-size: 18px;
214
+ flex-shrink: 0;
215
+ }
216
+ .hub-playbook-card-body {
217
+ flex: 1;
218
+ min-width: 0;
219
+ }
220
+ .hub-playbook-card-title {
221
+ font-size: 13px;
222
+ font-weight: 600;
223
+ color: var(--text);
224
+ }
225
+ .hub-playbook-card-desc {
226
+ font-size: 11px;
227
+ color: var(--text-dimmer);
228
+ overflow: hidden;
229
+ text-overflow: ellipsis;
230
+ white-space: nowrap;
231
+ }
232
+ .hub-playbook-card-check {
233
+ color: var(--success);
234
+ font-size: 14px;
235
+ flex-shrink: 0;
236
+ }
237
+
238
+ /* --- Tip "Try it" button (inline after text) --- */
239
+ .hub-tip-try {
240
+ display: inline;
241
+ padding: 0;
242
+ border: none;
243
+ background: none;
244
+ color: var(--accent);
245
+ font-size: inherit;
246
+ font-weight: 600;
247
+ cursor: pointer;
248
+ margin-left: 6px;
249
+ font-family: inherit;
250
+ }
251
+ .hub-tip-try:hover {
252
+ background: var(--accent-12);
253
+ }
254
+
255
+ /* --- Mobile --- */
256
+ @media (max-width: 768px) {
257
+ .playbook-modal {
258
+ width: 95vw;
259
+ border-radius: 12px;
260
+ }
261
+ .hub-playbook-card {
262
+ min-width: 140px;
263
+ }
264
+ }
@@ -0,0 +1,268 @@
1
+ /* --- Profile Popover (Discord-style, above user island) --- */
2
+ .profile-popover {
3
+ position: absolute;
4
+ bottom: calc(100% + 8px);
5
+ left: 0;
6
+ width: 280px;
7
+ background: var(--bg-alt);
8
+ border: 1px solid var(--border);
9
+ border-radius: 14px;
10
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35);
11
+ z-index: 100;
12
+ overflow: visible;
13
+ animation: profile-popover-in 0.15s ease-out;
14
+ }
15
+
16
+ @keyframes profile-popover-in {
17
+ from { opacity: 0; transform: translateY(8px); }
18
+ to { opacity: 1; transform: translateY(0); }
19
+ }
20
+
21
+ /* Banner */
22
+ .profile-banner {
23
+ height: 52px;
24
+ position: relative;
25
+ transition: background 0.2s ease;
26
+ border-radius: 14px 14px 0 0;
27
+ z-index: 1;
28
+ }
29
+
30
+ .profile-close-btn {
31
+ position: absolute;
32
+ top: 6px;
33
+ right: 8px;
34
+ width: 24px;
35
+ height: 24px;
36
+ border: none;
37
+ background: rgba(0, 0, 0, 0.3);
38
+ color: #fff;
39
+ border-radius: 50%;
40
+ font-size: 16px;
41
+ line-height: 1;
42
+ cursor: pointer;
43
+ display: flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ transition: background 0.15s;
47
+ }
48
+
49
+ .profile-close-btn:hover {
50
+ background: rgba(0, 0, 0, 0.5);
51
+ }
52
+
53
+ /* Avatar row (overlaps banner) */
54
+ .profile-avatar-row {
55
+ display: flex;
56
+ align-items: flex-end;
57
+ gap: 10px;
58
+ padding: 0 14px;
59
+ margin-top: -28px;
60
+ margin-bottom: 12px;
61
+ position: relative;
62
+ z-index: 2;
63
+ }
64
+
65
+ .profile-popover-avatar {
66
+ width: 60px;
67
+ height: 60px;
68
+ border-radius: 50%;
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ flex-shrink: 0;
73
+ border: 3px solid var(--bg-alt);
74
+ background: var(--bg);
75
+ position: relative;
76
+ }
77
+
78
+ .profile-popover-avatar-img {
79
+ width: 100%;
80
+ height: 100%;
81
+ object-fit: cover;
82
+ border-radius: 50%;
83
+ }
84
+
85
+ /* Shuffle button next to Avatar label */
86
+ .profile-shuffle-btn {
87
+ background: none;
88
+ border: none;
89
+ padding: 0;
90
+ margin-left: 4px;
91
+ cursor: pointer;
92
+ color: var(--text-muted);
93
+ vertical-align: middle;
94
+ transition: color 0.15s;
95
+ display: inline-flex;
96
+ align-items: center;
97
+ }
98
+
99
+ .profile-shuffle-btn .lucide {
100
+ width: 12px;
101
+ height: 12px;
102
+ }
103
+
104
+ .profile-shuffle-btn:hover {
105
+ color: var(--text);
106
+ }
107
+
108
+ .profile-name-display {
109
+ font-family: "Pretendard", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
110
+ font-size: 15px;
111
+ font-weight: 700;
112
+ color: var(--text);
113
+ white-space: nowrap;
114
+ overflow: hidden;
115
+ text-overflow: ellipsis;
116
+ padding-bottom: 6px;
117
+ }
118
+
119
+ /* Body */
120
+ .profile-popover-body {
121
+ padding: 0 14px 14px;
122
+ }
123
+
124
+ /* Fields */
125
+ .profile-field {
126
+ margin-bottom: 12px;
127
+ }
128
+
129
+ .profile-field:last-child {
130
+ margin-bottom: 0;
131
+ }
132
+
133
+ .profile-field-label {
134
+ display: block;
135
+ font-family: "Pretendard", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
136
+ font-size: 11px;
137
+ font-weight: 700;
138
+ text-transform: uppercase;
139
+ color: var(--text-dimmer);
140
+ letter-spacing: 0.5px;
141
+ margin-bottom: 6px;
142
+ }
143
+
144
+ .profile-field-hint {
145
+ font-size: 10px;
146
+ color: var(--text-dimmer);
147
+ font-weight: 400;
148
+ text-transform: none;
149
+ letter-spacing: 0;
150
+ font-style: italic;
151
+ }
152
+
153
+ /* Text input */
154
+ .profile-field-input {
155
+ width: 100%;
156
+ padding: 7px 10px;
157
+ background: var(--bg);
158
+ border: 1px solid var(--border);
159
+ border-radius: 8px;
160
+ color: var(--text);
161
+ font-family: "Pretendard", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
162
+ font-size: 13px;
163
+ font-weight: 500;
164
+ outline: none;
165
+ transition: border-color 0.15s;
166
+ box-sizing: border-box;
167
+ }
168
+
169
+ .profile-field-input:focus {
170
+ border-color: var(--accent);
171
+ }
172
+
173
+ .profile-field-input::placeholder {
174
+ color: var(--text-dimmer);
175
+ font-style: italic;
176
+ }
177
+
178
+ /* Select dropdown */
179
+ .profile-field-select {
180
+ width: 100%;
181
+ padding: 7px 10px;
182
+ background: var(--bg);
183
+ border: 1px solid var(--border);
184
+ border-radius: 8px;
185
+ color: var(--text);
186
+ font-family: "Pretendard", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
187
+ font-size: 13px;
188
+ font-weight: 500;
189
+ outline: none;
190
+ cursor: pointer;
191
+ -webkit-appearance: none;
192
+ appearance: none;
193
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23888' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 5l3 3 3-3'/%3E%3C/svg%3E");
194
+ background-repeat: no-repeat;
195
+ background-position: right 10px center;
196
+ padding-right: 28px;
197
+ box-sizing: border-box;
198
+ transition: border-color 0.15s;
199
+ }
200
+
201
+ .profile-field-select:focus {
202
+ border-color: var(--accent);
203
+ }
204
+
205
+ /* Avatar style grid */
206
+ .profile-avatar-grid {
207
+ display: grid;
208
+ grid-template-columns: repeat(4, 1fr);
209
+ gap: 6px;
210
+ }
211
+
212
+ .profile-avatar-option {
213
+ width: 100%;
214
+ aspect-ratio: 1;
215
+ border-radius: 10px;
216
+ border: 2px solid var(--border);
217
+ background: var(--bg);
218
+ cursor: pointer;
219
+ padding: 3px;
220
+ overflow: hidden;
221
+ display: flex;
222
+ align-items: center;
223
+ justify-content: center;
224
+ transition: border-color 0.15s, transform 0.1s;
225
+ }
226
+
227
+ .profile-avatar-option img {
228
+ width: 100%;
229
+ height: 100%;
230
+ object-fit: contain;
231
+ border-radius: 6px;
232
+ }
233
+
234
+ .profile-avatar-option:hover {
235
+ border-color: var(--text-muted);
236
+ transform: scale(1.05);
237
+ }
238
+
239
+ .profile-avatar-option.profile-avatar-option-active {
240
+ border-color: var(--accent);
241
+ box-shadow: 0 0 0 1px var(--accent);
242
+ }
243
+
244
+ /* Color swatch grid */
245
+ .profile-color-grid {
246
+ display: flex;
247
+ flex-wrap: wrap;
248
+ gap: 6px;
249
+ }
250
+
251
+ .profile-color-swatch {
252
+ width: 22px;
253
+ height: 22px;
254
+ border-radius: 50%;
255
+ border: 2px solid transparent;
256
+ cursor: pointer;
257
+ transition: transform 0.15s, border-color 0.15s;
258
+ padding: 0;
259
+ }
260
+
261
+ .profile-color-swatch:hover {
262
+ transform: scale(1.15);
263
+ }
264
+
265
+ .profile-color-swatch.profile-color-active {
266
+ border-color: #fff;
267
+ box-shadow: 0 0 0 2px var(--accent);
268
+ }