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
Binary file
Binary file
@@ -58,6 +58,13 @@
58
58
  font-display: swap;
59
59
  }
60
60
 
61
+ /* --- Twemoji COLR Font (cross-platform consistent emoji via font, no JS parsing) --- */
62
+ @font-face {
63
+ font-family: 'Twemoji';
64
+ src: url('https://cdn.jsdelivr.net/npm/twemoji-colr-font@15.0.3/twemoji.woff2') format('woff2');
65
+ font-display: swap;
66
+ }
67
+
61
68
  /* --- Reset & Variables --- */
62
69
  * {
63
70
  margin: 0;
@@ -73,6 +80,16 @@
73
80
  ::-webkit-scrollbar-thumb { background: rgba(var(--overlay-rgb),0.15); border-radius: 3px; }
74
81
  ::-webkit-scrollbar-thumb:hover { background: rgba(var(--overlay-rgb),0.25); }
75
82
 
83
+ /* --- Global Twemoji baseline --- */
84
+ img.emoji {
85
+ height: 1.2em;
86
+ width: 1.2em;
87
+ vertical-align: -0.2em;
88
+ margin: 0 1px;
89
+ display: inline;
90
+ pointer-events: none;
91
+ }
92
+
76
93
  :root {
77
94
  --bg: #282a36;
78
95
  --bg-alt: #363447;
@@ -149,7 +166,7 @@ html, body {
149
166
  height: 100%;
150
167
  background: var(--bg);
151
168
  color: var(--text);
152
- font-family: "Pretendard", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
169
+ font-family: "Pretendard", "Twemoji", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
153
170
  font-size: 15px;
154
171
  line-height: 1.6;
155
172
  overflow: hidden;
@@ -28,6 +28,7 @@
28
28
 
29
29
  #session-actions button .lucide { width: 16px; height: 16px; flex-shrink: 0; }
30
30
  #session-actions button:hover { background: var(--sidebar-hover); color: var(--text-secondary); }
31
+ #session-actions button.active { background: var(--sidebar-hover); color: var(--text); }
31
32
 
32
33
  .sidebar-badge {
33
34
  background: var(--accent);
@@ -0,0 +1,455 @@
1
+ /* ==========================================================================
2
+ Home Hub — Personalized command center & dashboard
3
+ ========================================================================== */
4
+
5
+ /* Hub covers #main-area (sidebar + chat), sits inside it with absolute */
6
+ #home-hub {
7
+ position: absolute;
8
+ inset: 0;
9
+ display: flex;
10
+ flex-direction: column;
11
+ align-items: center;
12
+ overflow-y: auto;
13
+ background: var(--bg);
14
+ z-index: 200;
15
+ padding: 48px 24px 40px;
16
+ border-top-left-radius: 8px;
17
+ animation: hubFadeIn 0.35s ease;
18
+ }
19
+ /* Close button (X / ESC) */
20
+ .home-hub-close-btn {
21
+ position: absolute;
22
+ top: 16px;
23
+ right: 20px;
24
+ display: flex;
25
+ flex-direction: column;
26
+ align-items: center;
27
+ width: 40px;
28
+ height: 40px;
29
+ border-radius: 50%;
30
+ border: 2px solid var(--text-dimmer);
31
+ background: none;
32
+ color: var(--text-dimmer);
33
+ cursor: pointer;
34
+ padding: 0;
35
+ justify-content: center;
36
+ transition: border-color 0.15s, color 0.15s;
37
+ z-index: 5;
38
+ }
39
+ .home-hub-close-btn .lucide {
40
+ width: 18px;
41
+ height: 18px;
42
+ }
43
+ .home-hub-close-btn span {
44
+ font-size: 10px;
45
+ font-weight: 600;
46
+ letter-spacing: 0.5px;
47
+ position: absolute;
48
+ top: calc(100% + 6px);
49
+ font-family: inherit;
50
+ }
51
+ .home-hub-close-btn:hover {
52
+ border-color: var(--text-secondary);
53
+ color: var(--text-secondary);
54
+ }
55
+ .home-hub-close-btn.hidden {
56
+ display: none;
57
+ }
58
+
59
+ #home-hub.hidden {
60
+ display: none;
61
+ }
62
+
63
+ @keyframes hubFadeIn {
64
+ from { opacity: 0; transform: translateY(8px); }
65
+ to { opacity: 1; transform: translateY(0); }
66
+ }
67
+
68
+ @keyframes hubCardIn {
69
+ from { opacity: 0; transform: translateY(6px); }
70
+ to { opacity: 1; transform: translateY(0); }
71
+ }
72
+
73
+ .home-hub-inner {
74
+ width: 100%;
75
+ max-width: 720px;
76
+ display: flex;
77
+ flex-direction: column;
78
+ gap: 14px;
79
+ }
80
+
81
+
82
+ /* --- Greeting --- */
83
+ .hub-greeting {
84
+ text-align: center;
85
+ padding: 8px 0 4px;
86
+ }
87
+ .hub-greeting h1 {
88
+ font-size: 28px;
89
+ font-weight: 700;
90
+ color: var(--text);
91
+ margin: 0;
92
+ letter-spacing: -0.5px;
93
+ }
94
+ .hub-greeting p {
95
+ font-size: 14px;
96
+ color: var(--text-muted);
97
+ margin: 6px 0 0;
98
+ font-weight: 400;
99
+ }
100
+ /* Twemoji sizing inherited from global img.emoji in base.css */
101
+
102
+ /* --- Card base --- */
103
+ .hub-card {
104
+ background: var(--bg-alt);
105
+ border: 1px solid var(--border-subtle);
106
+ border-radius: 12px;
107
+ padding: 16px;
108
+ }
109
+ .hub-card-header {
110
+ display: flex;
111
+ align-items: center;
112
+ justify-content: space-between;
113
+ margin-bottom: 12px;
114
+ }
115
+ .hub-card-title {
116
+ font-size: 12px;
117
+ font-weight: 600;
118
+ text-transform: uppercase;
119
+ letter-spacing: 0.6px;
120
+ color: var(--text-muted);
121
+ }
122
+ .hub-card-count {
123
+ font-size: 11px;
124
+ font-weight: 600;
125
+ color: var(--accent);
126
+ background: var(--accent-12);
127
+ padding: 2px 8px;
128
+ border-radius: 10px;
129
+ }
130
+
131
+ /* --- Two-column layout --- */
132
+ .hub-columns {
133
+ display: grid;
134
+ grid-template-columns: 1fr 1fr;
135
+ gap: 12px;
136
+ animation: hubCardIn 0.4s ease 0.08s both;
137
+ }
138
+
139
+ /* --- Upcoming tasks --- */
140
+ .hub-upcoming-list {
141
+ display: flex;
142
+ flex-direction: column;
143
+ gap: 2px;
144
+ }
145
+ .hub-upcoming-item {
146
+ display: flex;
147
+ align-items: center;
148
+ gap: 10px;
149
+ padding: 8px 10px;
150
+ border-radius: 8px;
151
+ cursor: pointer;
152
+ transition: background 0.15s ease;
153
+ }
154
+ .hub-upcoming-item:hover {
155
+ background: rgba(var(--overlay-rgb), 0.06);
156
+ }
157
+ .hub-upcoming-dot {
158
+ width: 8px;
159
+ height: 8px;
160
+ border-radius: 50%;
161
+ flex-shrink: 0;
162
+ background: var(--accent);
163
+ }
164
+ .hub-upcoming-time {
165
+ font-size: 12px;
166
+ font-weight: 500;
167
+ color: var(--text-muted);
168
+ min-width: 56px;
169
+ flex-shrink: 0;
170
+ font-variant-numeric: tabular-nums;
171
+ }
172
+ .hub-upcoming-name {
173
+ font-size: 13px;
174
+ color: var(--text);
175
+ flex: 1;
176
+ min-width: 0;
177
+ overflow: hidden;
178
+ text-overflow: ellipsis;
179
+ white-space: nowrap;
180
+ }
181
+ .hub-upcoming-project {
182
+ font-size: 11px;
183
+ color: var(--text-dimmer);
184
+ flex-shrink: 0;
185
+ max-width: 80px;
186
+ overflow: hidden;
187
+ text-overflow: ellipsis;
188
+ white-space: nowrap;
189
+ }
190
+ .hub-upcoming-more {
191
+ font-size: 12px;
192
+ color: var(--text-dimmer);
193
+ text-align: center;
194
+ padding: 4px 0;
195
+ }
196
+ /* Empty state */
197
+ .hub-upcoming-empty {
198
+ text-align: center;
199
+ padding: 16px 8px;
200
+ }
201
+ .hub-upcoming-empty-icon {
202
+ font-size: 24px;
203
+ margin-bottom: 8px;
204
+ opacity: 0.5;
205
+ }
206
+ .hub-upcoming-empty-text {
207
+ font-size: 13px;
208
+ color: var(--text-dimmer);
209
+ margin-bottom: 12px;
210
+ }
211
+ .hub-upcoming-cta {
212
+ display: inline-flex;
213
+ align-items: center;
214
+ gap: 6px;
215
+ padding: 6px 14px;
216
+ border-radius: 8px;
217
+ border: 1px solid var(--border-subtle);
218
+ background: none;
219
+ color: var(--accent);
220
+ font-size: 12px;
221
+ font-weight: 600;
222
+ cursor: pointer;
223
+ transition: background 0.15s ease, border-color 0.15s ease;
224
+ }
225
+ .hub-upcoming-cta:hover {
226
+ background: var(--accent-12);
227
+ border-color: var(--accent);
228
+ }
229
+ .hub-upcoming-cta svg {
230
+ width: 14px;
231
+ height: 14px;
232
+ }
233
+
234
+ /* --- Projects summary --- */
235
+ .hub-projects-list {
236
+ display: flex;
237
+ flex-direction: column;
238
+ gap: 2px;
239
+ }
240
+ .hub-project-item {
241
+ display: flex;
242
+ align-items: center;
243
+ gap: 10px;
244
+ padding: 8px 10px;
245
+ border-radius: 8px;
246
+ cursor: pointer;
247
+ transition: background 0.15s ease;
248
+ }
249
+ .hub-project-item:hover {
250
+ background: rgba(var(--overlay-rgb), 0.06);
251
+ }
252
+ .hub-project-dot {
253
+ width: 8px;
254
+ height: 8px;
255
+ border-radius: 50%;
256
+ flex-shrink: 0;
257
+ background: var(--text-dimmer);
258
+ transition: background 0.3s ease;
259
+ }
260
+ .hub-project-dot.processing {
261
+ background: var(--success);
262
+ box-shadow: 0 0 6px rgba(80, 250, 123, 0.4);
263
+ }
264
+ .hub-project-icon {
265
+ font-size: 14px;
266
+ width: 20px;
267
+ text-align: center;
268
+ flex-shrink: 0;
269
+ }
270
+ .hub-project-name {
271
+ font-size: 13px;
272
+ color: var(--text);
273
+ flex: 1;
274
+ min-width: 0;
275
+ overflow: hidden;
276
+ text-overflow: ellipsis;
277
+ white-space: nowrap;
278
+ }
279
+ .hub-project-sessions {
280
+ font-size: 11px;
281
+ color: var(--text-dimmer);
282
+ background: rgba(var(--overlay-rgb), 0.06);
283
+ padding: 2px 7px;
284
+ border-radius: 8px;
285
+ flex-shrink: 0;
286
+ }
287
+
288
+ /* --- Week strip --- */
289
+ .hub-week {
290
+ animation: hubCardIn 0.4s ease 0.16s both;
291
+ }
292
+ .hub-week-strip {
293
+ display: grid;
294
+ grid-template-columns: repeat(7, 1fr);
295
+ gap: 4px;
296
+ text-align: center;
297
+ }
298
+ .hub-week-day {
299
+ display: flex;
300
+ flex-direction: column;
301
+ align-items: center;
302
+ gap: 4px;
303
+ padding: 8px 4px;
304
+ border-radius: 10px;
305
+ cursor: default;
306
+ transition: background 0.15s ease;
307
+ }
308
+ .hub-week-day:hover {
309
+ background: rgba(var(--overlay-rgb), 0.04);
310
+ }
311
+ .hub-week-day.today {
312
+ background: var(--accent-12);
313
+ }
314
+ .hub-week-day.today .hub-week-num {
315
+ background: var(--accent);
316
+ color: var(--bg);
317
+ border-radius: 50%;
318
+ width: 28px;
319
+ height: 28px;
320
+ display: flex;
321
+ align-items: center;
322
+ justify-content: center;
323
+ }
324
+ .hub-week-label {
325
+ font-size: 11px;
326
+ font-weight: 500;
327
+ color: var(--text-dimmer);
328
+ text-transform: uppercase;
329
+ letter-spacing: 0.3px;
330
+ }
331
+ .hub-week-num {
332
+ font-size: 14px;
333
+ font-weight: 600;
334
+ color: var(--text);
335
+ width: 28px;
336
+ height: 28px;
337
+ display: flex;
338
+ align-items: center;
339
+ justify-content: center;
340
+ }
341
+ .hub-week-dots {
342
+ display: flex;
343
+ gap: 3px;
344
+ justify-content: center;
345
+ min-height: 6px;
346
+ }
347
+ .hub-week-dot {
348
+ width: 5px;
349
+ height: 5px;
350
+ border-radius: 50%;
351
+ background: var(--accent);
352
+ }
353
+
354
+ /* --- Tip Card --- */
355
+ .hub-tip {
356
+ background: var(--bg-alt);
357
+ border: 1px solid var(--border-subtle);
358
+ border-radius: 12px;
359
+ padding: 16px 18px;
360
+ display: flex;
361
+ align-items: flex-start;
362
+ gap: 12px;
363
+ animation: hubCardIn 0.4s ease 0.24s both;
364
+ }
365
+ .hub-tip-icon {
366
+ flex-shrink: 0;
367
+ width: 32px;
368
+ height: 32px;
369
+ border-radius: 8px;
370
+ background: var(--accent-12);
371
+ display: flex;
372
+ align-items: center;
373
+ justify-content: center;
374
+ font-size: 16px;
375
+ }
376
+ .hub-tip-body {
377
+ flex: 1;
378
+ min-width: 0;
379
+ }
380
+ .hub-tip-label {
381
+ font-size: 11px;
382
+ font-weight: 600;
383
+ text-transform: uppercase;
384
+ letter-spacing: 0.5px;
385
+ color: var(--accent);
386
+ margin-bottom: 4px;
387
+ }
388
+ .hub-tip-text {
389
+ font-size: 13.5px;
390
+ line-height: 1.5;
391
+ color: var(--text-secondary);
392
+ }
393
+ .hub-tip-nav {
394
+ flex-shrink: 0;
395
+ display: flex;
396
+ gap: 2px;
397
+ align-items: center;
398
+ }
399
+ .hub-tip-prev,
400
+ .hub-tip-next {
401
+ background: none;
402
+ border: none;
403
+ color: var(--text-dimmer);
404
+ cursor: pointer;
405
+ padding: 4px;
406
+ border-radius: 6px;
407
+ transition: color 0.15s, background 0.15s;
408
+ display: flex;
409
+ align-items: center;
410
+ justify-content: center;
411
+ }
412
+ .hub-tip-prev:hover,
413
+ .hub-tip-next:hover {
414
+ color: var(--text-muted);
415
+ background: rgba(var(--overlay-rgb), 0.06);
416
+ }
417
+ .hub-tip-prev svg,
418
+ .hub-tip-next svg {
419
+ width: 14px;
420
+ height: 14px;
421
+ }
422
+
423
+ /* Hide user island when hub is visible */
424
+ #main-area:has(#home-hub:not(.hidden)) ~ #user-island,
425
+ #layout-body:has(#home-hub:not(.hidden)) #user-island {
426
+ opacity: 0;
427
+ pointer-events: none;
428
+ transition: opacity 0.2s ease;
429
+ }
430
+
431
+ /* --- Mobile --- */
432
+ @media (max-width: 768px) {
433
+ #home-hub {
434
+ padding: 32px 16px 32px;
435
+ }
436
+ .hub-greeting h1 {
437
+ font-size: 22px;
438
+ }
439
+ .home-hub-inner {
440
+ max-width: 100%;
441
+ }
442
+ .hub-columns {
443
+ grid-template-columns: 1fr;
444
+ }
445
+ .hub-week-label {
446
+ font-size: 10px;
447
+ }
448
+ .hub-week-num {
449
+ font-size: 13px;
450
+ }
451
+ }
452
+
453
+ /* ==========================================================================
454
+ (Certificate section removed — now handled by Trust Certificate playbook)
455
+ ========================================================================== */
@@ -52,7 +52,7 @@
52
52
  object-fit: cover;
53
53
  }
54
54
 
55
- .icon-strip-home:hover .footer-mascot {
55
+ .icon-strip-home:hover .icon-strip-logo {
56
56
  opacity: 0.8;
57
57
  }
58
58
 
@@ -411,10 +411,11 @@
411
411
  width: 22px;
412
412
  height: 22px;
413
413
  filter:
414
- drop-shadow(1px 0 0 rgba(0,0,0,0.18))
415
- drop-shadow(-1px 0 0 rgba(0,0,0,0.18))
416
- drop-shadow(0 1px 0 rgba(0,0,0,0.18))
417
- drop-shadow(0 -1px 0 rgba(0,0,0,0.18));
414
+ drop-shadow(1px 0 0 rgba(0,0,0,0.25))
415
+ drop-shadow(-1px 0 0 rgba(0,0,0,0.25))
416
+ drop-shadow(0 1px 0 rgba(0,0,0,0.25))
417
+ drop-shadow(0 -1px 0 rgba(0,0,0,0.25))
418
+ drop-shadow(0 0 4px rgba(255,255,255,0.35));
418
419
  }
419
420
 
420
421
  /* --- Project context menu --- */