clay-server 2.10.0 → 2.11.0-beta.10
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.
- package/bin/cli.js +157 -1
- package/lib/daemon.js +341 -2
- package/lib/dm.js +135 -0
- package/lib/os-users.js +301 -0
- package/lib/pages.js +36 -0
- package/lib/project.js +386 -67
- package/lib/public/app.js +675 -17
- package/lib/public/css/admin.css +99 -10
- package/lib/public/css/filebrowser.css +22 -0
- package/lib/public/css/icon-strip.css +162 -1
- package/lib/public/css/menus.css +23 -0
- package/lib/public/css/messages.css +245 -0
- package/lib/public/css/overlays.css +88 -0
- package/lib/public/css/server-settings.css +30 -2
- package/lib/public/css/sidebar.css +4 -0
- package/lib/public/index.html +140 -66
- package/lib/public/modules/admin.js +179 -12
- package/lib/public/modules/input.js +13 -2
- package/lib/public/modules/notifications.js +3 -1
- package/lib/public/modules/project-settings.js +154 -168
- package/lib/public/modules/server-settings.js +78 -189
- package/lib/public/modules/settings-defaults.js +243 -0
- package/lib/public/modules/sidebar.js +112 -6
- package/lib/public/modules/terminal.js +48 -10
- package/lib/public/modules/tools.js +214 -1
- package/lib/sdk-bridge.js +634 -6
- package/lib/sdk-worker.js +446 -0
- package/lib/server.js +335 -3
- package/lib/sessions.js +26 -0
- package/lib/terminal-manager.js +2 -2
- package/lib/terminal.js +20 -4
- package/lib/updater.js +38 -11
- package/lib/users.js +79 -0
- package/package.json +2 -2
package/lib/public/css/admin.css
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
display: flex;
|
|
24
24
|
align-items: center;
|
|
25
25
|
justify-content: space-between;
|
|
26
|
-
|
|
26
|
+
padding: 8px 16px;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
.admin-section-header h3 {
|
|
@@ -49,6 +49,11 @@
|
|
|
49
49
|
transition: opacity 0.15s;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
.admin-action-btn svg {
|
|
53
|
+
width: 14px;
|
|
54
|
+
height: 14px;
|
|
55
|
+
}
|
|
56
|
+
|
|
52
57
|
.admin-action-btn:hover {
|
|
53
58
|
opacity: 0.9;
|
|
54
59
|
}
|
|
@@ -64,7 +69,7 @@
|
|
|
64
69
|
display: flex;
|
|
65
70
|
align-items: center;
|
|
66
71
|
justify-content: space-between;
|
|
67
|
-
padding: 10px
|
|
72
|
+
padding: 10px 16px;
|
|
68
73
|
border-radius: 10px;
|
|
69
74
|
transition: background 0.1s;
|
|
70
75
|
}
|
|
@@ -124,6 +129,11 @@
|
|
|
124
129
|
transition: color 0.15s, background 0.15s;
|
|
125
130
|
}
|
|
126
131
|
|
|
132
|
+
.admin-remove-btn svg {
|
|
133
|
+
width: 16px;
|
|
134
|
+
height: 16px;
|
|
135
|
+
}
|
|
136
|
+
|
|
127
137
|
.admin-remove-btn:hover {
|
|
128
138
|
color: #e5534b;
|
|
129
139
|
background: rgba(229, 83, 75, 0.1);
|
|
@@ -140,7 +150,7 @@
|
|
|
140
150
|
display: flex;
|
|
141
151
|
align-items: center;
|
|
142
152
|
justify-content: space-between;
|
|
143
|
-
padding: 10px
|
|
153
|
+
padding: 10px 16px;
|
|
144
154
|
border-radius: 10px;
|
|
145
155
|
}
|
|
146
156
|
|
|
@@ -178,6 +188,11 @@
|
|
|
178
188
|
align-items: center;
|
|
179
189
|
}
|
|
180
190
|
|
|
191
|
+
.admin-copy-link-btn svg {
|
|
192
|
+
width: 14px;
|
|
193
|
+
height: 14px;
|
|
194
|
+
}
|
|
195
|
+
|
|
181
196
|
.admin-copy-link-btn:hover {
|
|
182
197
|
color: var(--accent);
|
|
183
198
|
background: var(--accent-8);
|
|
@@ -200,6 +215,11 @@
|
|
|
200
215
|
align-items: center;
|
|
201
216
|
}
|
|
202
217
|
|
|
218
|
+
.admin-revoke-btn svg {
|
|
219
|
+
width: 14px;
|
|
220
|
+
height: 14px;
|
|
221
|
+
}
|
|
222
|
+
|
|
203
223
|
.admin-revoke-btn:hover {
|
|
204
224
|
color: #ef4444;
|
|
205
225
|
background: rgba(239, 68, 68, 0.1);
|
|
@@ -216,7 +236,7 @@
|
|
|
216
236
|
display: flex;
|
|
217
237
|
align-items: center;
|
|
218
238
|
justify-content: space-between;
|
|
219
|
-
padding: 10px
|
|
239
|
+
padding: 10px 16px;
|
|
220
240
|
border-radius: 10px;
|
|
221
241
|
}
|
|
222
242
|
|
|
@@ -247,6 +267,7 @@
|
|
|
247
267
|
gap: 8px;
|
|
248
268
|
}
|
|
249
269
|
|
|
270
|
+
.admin-owner-select,
|
|
250
271
|
.admin-vis-select {
|
|
251
272
|
background: var(--bg-alt);
|
|
252
273
|
border: 1px solid var(--border);
|
|
@@ -258,6 +279,11 @@
|
|
|
258
279
|
font-family: inherit;
|
|
259
280
|
}
|
|
260
281
|
|
|
282
|
+
.admin-owner-select {
|
|
283
|
+
max-width: 140px;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.admin-owner-select:focus,
|
|
261
287
|
.admin-vis-select:focus {
|
|
262
288
|
border-color: var(--accent);
|
|
263
289
|
outline: none;
|
|
@@ -274,6 +300,11 @@
|
|
|
274
300
|
align-items: center;
|
|
275
301
|
}
|
|
276
302
|
|
|
303
|
+
.admin-manage-users-btn svg {
|
|
304
|
+
width: 16px;
|
|
305
|
+
height: 16px;
|
|
306
|
+
}
|
|
307
|
+
|
|
277
308
|
.admin-manage-users-btn:hover {
|
|
278
309
|
color: var(--accent);
|
|
279
310
|
background: var(--accent-8);
|
|
@@ -327,6 +358,11 @@
|
|
|
327
358
|
display: flex;
|
|
328
359
|
}
|
|
329
360
|
|
|
361
|
+
.admin-modal-close svg {
|
|
362
|
+
width: 16px;
|
|
363
|
+
height: 16px;
|
|
364
|
+
}
|
|
365
|
+
|
|
330
366
|
.admin-modal-close:hover {
|
|
331
367
|
color: var(--text);
|
|
332
368
|
}
|
|
@@ -442,18 +478,18 @@
|
|
|
442
478
|
|
|
443
479
|
/* --- SMTP Configuration Form --- */
|
|
444
480
|
.admin-smtp-form {
|
|
445
|
-
padding:
|
|
481
|
+
padding: 8px 0;
|
|
446
482
|
}
|
|
447
483
|
|
|
448
484
|
.admin-smtp-status {
|
|
449
485
|
display: flex;
|
|
450
486
|
align-items: center;
|
|
451
487
|
gap: 8px;
|
|
452
|
-
padding:
|
|
488
|
+
padding: 10px 16px;
|
|
453
489
|
border-radius: 8px;
|
|
454
490
|
font-size: 13px;
|
|
455
491
|
font-weight: 500;
|
|
456
|
-
margin
|
|
492
|
+
margin: 0 16px 16px;
|
|
457
493
|
}
|
|
458
494
|
|
|
459
495
|
.admin-smtp-status svg {
|
|
@@ -480,7 +516,7 @@
|
|
|
480
516
|
margin-bottom: 16px;
|
|
481
517
|
}
|
|
482
518
|
|
|
483
|
-
.admin-smtp-row label {
|
|
519
|
+
.admin-smtp-row > label:not(.admin-smtp-toggle) {
|
|
484
520
|
display: block;
|
|
485
521
|
font-size: 12px;
|
|
486
522
|
font-weight: 600;
|
|
@@ -516,17 +552,27 @@
|
|
|
516
552
|
.admin-smtp-toggle {
|
|
517
553
|
display: flex;
|
|
518
554
|
align-items: center;
|
|
519
|
-
gap:
|
|
555
|
+
gap: 10px;
|
|
520
556
|
font-size: 13px;
|
|
557
|
+
font-weight: 400;
|
|
558
|
+
text-transform: none;
|
|
559
|
+
letter-spacing: normal;
|
|
521
560
|
color: var(--text);
|
|
522
561
|
cursor: pointer;
|
|
523
|
-
|
|
562
|
+
margin-top: 6px;
|
|
524
563
|
}
|
|
525
564
|
|
|
526
565
|
.admin-smtp-toggle input[type="checkbox"] {
|
|
527
566
|
accent-color: var(--accent);
|
|
528
567
|
width: 16px;
|
|
529
568
|
height: 16px;
|
|
569
|
+
flex-shrink: 0;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
.admin-smtp-row-otp {
|
|
573
|
+
margin-top: 4px;
|
|
574
|
+
padding-top: 12px;
|
|
575
|
+
border-top: 1px solid var(--border);
|
|
530
576
|
}
|
|
531
577
|
|
|
532
578
|
.admin-smtp-actions {
|
|
@@ -561,6 +607,49 @@
|
|
|
561
607
|
color: var(--accent);
|
|
562
608
|
}
|
|
563
609
|
|
|
610
|
+
/* --- Temp PIN display (admin-created user credentials) --- */
|
|
611
|
+
.admin-temp-pin-box {
|
|
612
|
+
background: var(--bg-alt);
|
|
613
|
+
border: 1px solid var(--border);
|
|
614
|
+
border-radius: 10px;
|
|
615
|
+
padding: 12px 16px;
|
|
616
|
+
margin-top: 12px;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
.admin-temp-pin-row {
|
|
620
|
+
display: flex;
|
|
621
|
+
align-items: center;
|
|
622
|
+
justify-content: space-between;
|
|
623
|
+
padding: 6px 0;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
.admin-temp-pin-row + .admin-temp-pin-row {
|
|
627
|
+
border-top: 1px solid var(--border);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
.admin-temp-pin-label {
|
|
631
|
+
font-size: 12px;
|
|
632
|
+
font-weight: 600;
|
|
633
|
+
color: var(--text-muted);
|
|
634
|
+
text-transform: uppercase;
|
|
635
|
+
letter-spacing: 0.3px;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
.admin-temp-pin-value {
|
|
639
|
+
font-size: 14px;
|
|
640
|
+
color: var(--text);
|
|
641
|
+
background: var(--bg);
|
|
642
|
+
padding: 4px 10px;
|
|
643
|
+
border-radius: 6px;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
.admin-temp-pin-highlight {
|
|
647
|
+
font-size: 18px;
|
|
648
|
+
font-weight: 700;
|
|
649
|
+
letter-spacing: 3px;
|
|
650
|
+
color: var(--accent);
|
|
651
|
+
}
|
|
652
|
+
|
|
564
653
|
/* --- Session visibility indicator --- */
|
|
565
654
|
.session-private-icon {
|
|
566
655
|
display: inline-flex;
|
|
@@ -268,6 +268,28 @@
|
|
|
268
268
|
}
|
|
269
269
|
.ps-text-input:focus { border-color: var(--accent); }
|
|
270
270
|
|
|
271
|
+
/* Profile: owner row */
|
|
272
|
+
.ps-owner-row {
|
|
273
|
+
display: flex;
|
|
274
|
+
align-items: center;
|
|
275
|
+
gap: 8px;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.ps-transfer-form {
|
|
279
|
+
margin-top: 8px;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.ps-select {
|
|
283
|
+
width: 100%;
|
|
284
|
+
padding: 6px 10px;
|
|
285
|
+
border: 1px solid var(--border);
|
|
286
|
+
border-radius: 6px;
|
|
287
|
+
background: var(--bg);
|
|
288
|
+
color: var(--text);
|
|
289
|
+
font-size: 13px;
|
|
290
|
+
margin-bottom: 8px;
|
|
291
|
+
}
|
|
292
|
+
|
|
271
293
|
/* Profile: icon row */
|
|
272
294
|
.ps-icon-row {
|
|
273
295
|
display: flex;
|
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
========================================================================== */
|
|
4
4
|
|
|
5
5
|
#icon-strip {
|
|
6
|
+
position: relative;
|
|
6
7
|
width: 72px;
|
|
7
8
|
flex-shrink: 0;
|
|
8
9
|
background: var(--sidebar-bg);
|
|
9
10
|
display: flex;
|
|
10
11
|
flex-direction: column;
|
|
11
12
|
align-items: center;
|
|
12
|
-
padding: 0 0
|
|
13
|
+
padding: 0 0 80px;
|
|
13
14
|
overflow: hidden;
|
|
14
15
|
z-index: 2;
|
|
15
16
|
}
|
|
@@ -114,6 +115,7 @@
|
|
|
114
115
|
/* --- Scrollable project list area --- */
|
|
115
116
|
.icon-strip-projects {
|
|
116
117
|
width: 100%;
|
|
118
|
+
min-height: 0;
|
|
117
119
|
overflow-y: auto;
|
|
118
120
|
overflow-x: hidden;
|
|
119
121
|
display: flex;
|
|
@@ -605,6 +607,165 @@
|
|
|
605
607
|
height: 22px;
|
|
606
608
|
}
|
|
607
609
|
|
|
610
|
+
/* --- User avatars (circle, above my-avatar at bottom) --- */
|
|
611
|
+
.icon-strip-users {
|
|
612
|
+
position: absolute;
|
|
613
|
+
bottom: 74px; /* above user-island (58px + 8px bottom + 8px gap) */
|
|
614
|
+
left: 50%;
|
|
615
|
+
transform: translateX(-50%);
|
|
616
|
+
width: 56px;
|
|
617
|
+
display: flex;
|
|
618
|
+
flex-direction: column;
|
|
619
|
+
align-items: center;
|
|
620
|
+
gap: 0;
|
|
621
|
+
padding: 6px 0;
|
|
622
|
+
background: var(--bg-alt);
|
|
623
|
+
border-radius: 8px;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
.icon-strip-users.hidden {
|
|
627
|
+
display: none;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/* "Invite" mini button at bottom of user strip */
|
|
631
|
+
.icon-strip-invite {
|
|
632
|
+
position: relative;
|
|
633
|
+
width: 40px;
|
|
634
|
+
height: 32px;
|
|
635
|
+
border-radius: 10px;
|
|
636
|
+
background: transparent;
|
|
637
|
+
border: none;
|
|
638
|
+
display: flex;
|
|
639
|
+
align-items: center;
|
|
640
|
+
justify-content: center;
|
|
641
|
+
cursor: pointer;
|
|
642
|
+
flex-shrink: 0;
|
|
643
|
+
color: var(--text-dimmer);
|
|
644
|
+
transition: color 0.2s, background 0.2s;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
.icon-strip-invite:hover {
|
|
648
|
+
color: var(--accent);
|
|
649
|
+
background: rgba(var(--overlay-rgb), 0.08);
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
.icon-strip-invite .lucide {
|
|
653
|
+
width: 16px;
|
|
654
|
+
height: 16px;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
.icon-strip-user {
|
|
658
|
+
position: relative;
|
|
659
|
+
width: 42px;
|
|
660
|
+
height: 42px;
|
|
661
|
+
border-radius: 0;
|
|
662
|
+
background: transparent;
|
|
663
|
+
display: flex;
|
|
664
|
+
align-items: center;
|
|
665
|
+
justify-content: center;
|
|
666
|
+
cursor: pointer;
|
|
667
|
+
flex-shrink: 0;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
.icon-strip-user-avatar {
|
|
671
|
+
width: 34px;
|
|
672
|
+
height: 34px;
|
|
673
|
+
border-radius: 50%;
|
|
674
|
+
object-fit: cover;
|
|
675
|
+
transition: opacity 0.2s ease, transform 0.2s ease;
|
|
676
|
+
opacity: 0.7;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
.icon-strip-user:hover .icon-strip-user-avatar {
|
|
680
|
+
opacity: 1;
|
|
681
|
+
transform: scale(1.08);
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
.icon-strip-user.active .icon-strip-user-avatar {
|
|
685
|
+
opacity: 1;
|
|
686
|
+
box-shadow: 0 0 0 2px var(--accent);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/* Online status dot (bottom-right on avatar, like project blink dot) */
|
|
690
|
+
.icon-strip-user-online {
|
|
691
|
+
position: absolute;
|
|
692
|
+
bottom: 5px;
|
|
693
|
+
right: 5px;
|
|
694
|
+
width: 10px;
|
|
695
|
+
height: 10px;
|
|
696
|
+
border-radius: 50%;
|
|
697
|
+
background: var(--text-dimmer);
|
|
698
|
+
border: 2px solid var(--sidebar-bg);
|
|
699
|
+
opacity: 1;
|
|
700
|
+
transition: opacity 0.2s, background 0.3s;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
.icon-strip-user.online .icon-strip-user-online {
|
|
704
|
+
background: var(--success);
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
/* DM unread badge */
|
|
708
|
+
.icon-strip-user-badge {
|
|
709
|
+
position: absolute;
|
|
710
|
+
top: -2px;
|
|
711
|
+
right: -2px;
|
|
712
|
+
min-width: 18px;
|
|
713
|
+
height: 18px;
|
|
714
|
+
border-radius: 9px;
|
|
715
|
+
background: #e74c3c;
|
|
716
|
+
color: #fff;
|
|
717
|
+
font-size: 11px;
|
|
718
|
+
font-weight: 700;
|
|
719
|
+
display: none;
|
|
720
|
+
align-items: center;
|
|
721
|
+
justify-content: center;
|
|
722
|
+
padding: 0 5px;
|
|
723
|
+
line-height: 18px;
|
|
724
|
+
text-align: center;
|
|
725
|
+
box-shadow: 0 0 0 2px var(--bg);
|
|
726
|
+
z-index: 2;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
.icon-strip-user-badge.has-unread {
|
|
730
|
+
display: flex;
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
/* Pill for user icons */
|
|
734
|
+
.icon-strip-user:hover .icon-strip-pill {
|
|
735
|
+
opacity: 1;
|
|
736
|
+
height: 20px;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
.icon-strip-user.active .icon-strip-pill {
|
|
740
|
+
opacity: 1;
|
|
741
|
+
height: 32px;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
/* DM mode: keep same position (user-island gone but layout stays) */
|
|
745
|
+
|
|
746
|
+
/* --- My avatar at bottom of icon strip (always present, behind user-island) --- */
|
|
747
|
+
/* Positioned to align exactly with user-island avatar (left:8px + padding:6px + 18px center = 32px from left edge of layout-body) */
|
|
748
|
+
/* icon-strip is 72px wide, so 32px from left = left offset within icon-strip */
|
|
749
|
+
.icon-strip-me {
|
|
750
|
+
position: absolute;
|
|
751
|
+
bottom: 19px; /* vertically center with user-island (bottom:8px + height:58px/2 - 16px) */
|
|
752
|
+
left: 32px;
|
|
753
|
+
transform: translateX(-50%);
|
|
754
|
+
display: flex;
|
|
755
|
+
align-items: center;
|
|
756
|
+
justify-content: center;
|
|
757
|
+
width: 32px;
|
|
758
|
+
height: 32px;
|
|
759
|
+
z-index: 1; /* below user-island z-index: 15 */
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
.icon-strip-me-avatar {
|
|
763
|
+
width: 32px;
|
|
764
|
+
height: 32px;
|
|
765
|
+
border-radius: 50%;
|
|
766
|
+
object-fit: cover;
|
|
767
|
+
}
|
|
768
|
+
|
|
608
769
|
/* --- Per-project presence avatars --- */
|
|
609
770
|
/* --- Mobile: hide icon strip --- */
|
|
610
771
|
@media (max-width: 768px) {
|
package/lib/public/css/menus.css
CHANGED
|
@@ -617,6 +617,29 @@
|
|
|
617
617
|
background: var(--accent);
|
|
618
618
|
}
|
|
619
619
|
|
|
620
|
+
.config-budget-row {
|
|
621
|
+
padding: 4px 14px 8px;
|
|
622
|
+
display: flex;
|
|
623
|
+
align-items: center;
|
|
624
|
+
gap: 8px;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
.config-budget-label {
|
|
628
|
+
font-size: 11px;
|
|
629
|
+
color: var(--text-muted);
|
|
630
|
+
white-space: nowrap;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
.config-budget-input {
|
|
634
|
+
width: 80px;
|
|
635
|
+
padding: 4px 6px;
|
|
636
|
+
border: 1px solid var(--border);
|
|
637
|
+
border-radius: 4px;
|
|
638
|
+
background: var(--bg);
|
|
639
|
+
color: var(--text);
|
|
640
|
+
font-size: 11px;
|
|
641
|
+
}
|
|
642
|
+
|
|
620
643
|
/* --- Info panels container --- */
|
|
621
644
|
#info-panels {
|
|
622
645
|
position: fixed;
|