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
@@ -38,7 +38,62 @@
38
38
  .loop-stop-btn:hover {
39
39
  opacity: 0.85;
40
40
  }
41
- /* .loop-start-btn is now inside #session-actions, inherits sidebar button styles */
41
+ /* Ralph Loop sidebar section */
42
+ #ralph-loop-section {
43
+ display: none;
44
+ }
45
+ .ralph-section-inner {
46
+ display: flex;
47
+ flex-direction: column;
48
+ gap: 4px;
49
+ }
50
+ .ralph-section-header {
51
+ display: flex;
52
+ align-items: center;
53
+ gap: 6px;
54
+ font-size: 12px;
55
+ font-weight: 600;
56
+ color: var(--text);
57
+ }
58
+ .ralph-section-header .ralph-section-icon { display: inline-flex; color: var(--accent); }
59
+ .ralph-section-header .ralph-section-icon .lucide { width: 13px; height: 13px; }
60
+ .ralph-section-header .ralph-section-label { flex: 1; }
61
+ .ralph-section-header .loop-experimental { margin-left: 0; font-size: 9.5px; }
62
+ .ralph-section-body {
63
+ font-size: 11.5px;
64
+ color: var(--text-muted);
65
+ padding-left: 2px;
66
+ margin-top: 2px;
67
+ }
68
+ .ralph-section-hint {
69
+ color: var(--text-muted);
70
+ }
71
+ .ralph-section-status {
72
+ display: inline-flex;
73
+ align-items: center;
74
+ gap: 4px;
75
+ }
76
+ .ralph-section-status .lucide { width: 11px; height: 11px; }
77
+ .ralph-section-status.crafting { color: var(--accent); }
78
+ .ralph-section-status.ready { color: var(--success, #27ae60); font-weight: 600; }
79
+ .ralph-section-status.running { color: var(--accent); }
80
+ .ralph-section-status.done { color: var(--success, #27ae60); }
81
+ .ralph-section-tasks-link {
82
+ display: block;
83
+ margin-top: 2px;
84
+ font-size: 11px;
85
+ color: var(--accent);
86
+ text-decoration: none;
87
+ cursor: pointer;
88
+ }
89
+ .ralph-section-tasks-link:hover { text-decoration: underline; }
90
+
91
+ /* Section accent states */
92
+ .ralph-section-ready { border-left-color: var(--success, #27ae60); }
93
+ .ralph-section-running { border-left-color: var(--accent); }
94
+ .ralph-section-done { border-left-color: var(--success, #27ae60); }
95
+
96
+ /* .loop-start-btn is now inside #ralph-loop-section, inherits sidebar button styles */
42
97
  .loop-experimental {
43
98
  display: inline-flex;
44
99
  align-items: center;
@@ -638,10 +693,72 @@
638
693
  flex-direction: column;
639
694
  box-shadow: 0 8px 32px rgba(var(--shadow-rgb, 0,0,0), 0.5);
640
695
  }
696
+
697
+ /* Header — matches scheduler-detail-header */
698
+ .ralph-preview-header {
699
+ display: flex;
700
+ align-items: center;
701
+ gap: 12px;
702
+ padding: 16px 20px;
703
+ border-bottom: 1px solid rgba(var(--overlay-rgb, 0,0,0), 0.06);
704
+ flex-shrink: 0;
705
+ }
706
+ .ralph-preview-name {
707
+ font-weight: 700;
708
+ font-size: 16px;
709
+ color: var(--text);
710
+ flex: 1;
711
+ overflow: hidden;
712
+ text-overflow: ellipsis;
713
+ white-space: nowrap;
714
+ }
715
+ .ralph-preview-actions {
716
+ display: flex;
717
+ gap: 6px;
718
+ flex-shrink: 0;
719
+ }
720
+ .ralph-preview-action-btn {
721
+ display: inline-flex;
722
+ align-items: center;
723
+ gap: 5px;
724
+ background: var(--bg-alt);
725
+ border: 1px solid var(--border);
726
+ color: var(--text-secondary);
727
+ cursor: pointer;
728
+ padding: 5px 12px;
729
+ border-radius: 6px;
730
+ font-size: 12px;
731
+ font-weight: 600;
732
+ font-family: inherit;
733
+ transition: background 0.12s, color 0.12s, opacity 0.12s;
734
+ }
735
+ .ralph-preview-action-btn .lucide { width: 13px; height: 13px; }
736
+ .ralph-preview-action-btn:hover { background: var(--hover, rgba(var(--overlay-rgb), 0.06)); color: var(--text); }
737
+ .ralph-preview-action-btn.primary { background: var(--accent); color: #fff; border-color: var(--accent); }
738
+ .ralph-preview-action-btn.primary:hover { opacity: 0.9; }
739
+ .ralph-preview-action-btn:disabled { opacity: 0.4; pointer-events: none; }
740
+ .ralph-preview-action-icon {
741
+ display: flex;
742
+ align-items: center;
743
+ justify-content: center;
744
+ width: 30px;
745
+ height: 30px;
746
+ border: 1px solid var(--border);
747
+ border-radius: 6px;
748
+ background: none;
749
+ color: var(--text-muted);
750
+ cursor: pointer;
751
+ transition: background 0.12s, color 0.12s, border-color 0.12s;
752
+ }
753
+ .ralph-preview-action-icon .lucide { width: 14px; height: 14px; }
754
+ .ralph-preview-action-icon:hover { background: color-mix(in srgb, var(--error) 12%, transparent); color: var(--error); border-color: var(--error); }
755
+
756
+ /* Tabs */
641
757
  .ralph-preview-tabs {
642
758
  display: flex;
643
- border-bottom: 1px solid var(--border, #333);
644
- padding: 0 16px;
759
+ border-bottom: 1px solid rgba(var(--overlay-rgb, 0,0,0), 0.06);
760
+ padding: 0 20px;
761
+ flex-shrink: 0;
645
762
  }
646
763
  .ralph-tab {
647
764
  padding: 10px 16px;
@@ -651,8 +768,9 @@
651
768
  color: var(--text-secondary, #999);
652
769
  cursor: pointer;
653
770
  font-size: 13px;
654
- font-weight: 500;
655
- transition: color 0.15s, border-color 0.15s;
771
+ font-weight: 600;
772
+ font-family: inherit;
773
+ transition: color 0.12s, border-color 0.12s;
656
774
  }
657
775
  .ralph-tab:hover {
658
776
  color: var(--text, #fff);
@@ -661,10 +779,12 @@
661
779
  color: var(--text, #fff);
662
780
  border-bottom-color: var(--accent, #6c5ce7);
663
781
  }
782
+
783
+ /* Body */
664
784
  .ralph-preview-body {
665
785
  flex: 1;
666
786
  overflow-y: auto;
667
- padding: 16px 20px;
787
+ padding: 20px 24px;
668
788
  font-size: 13px;
669
789
  line-height: 1.6;
670
790
  color: var(--text, #fff);
@@ -681,10 +801,6 @@
681
801
  font-family: var(--font-mono, monospace);
682
802
  font-size: 12px;
683
803
  }
684
- .ralph-preview-dialog > .ralph-btn {
685
- margin: 0 16px 12px;
686
- align-self: flex-end;
687
- }
688
804
 
689
805
  /* Ralph Sticky (title-bar island, mirrors #todo-sticky pattern) */
690
806
  #ralph-sticky {
@@ -708,27 +824,29 @@
708
824
  user-select: none;
709
825
  }
710
826
  #ralph-sticky .ralph-sticky-header:hover { background: rgba(var(--overlay-rgb), 0.03); border-radius: 10px; }
827
+ #ralph-sticky .ralph-sticky-inner {
828
+ border-color: color-mix(in srgb, var(--accent, #6c5ce7) 40%, var(--border));
829
+ }
711
830
  #ralph-sticky .ralph-sticky-icon { display: inline-flex; color: var(--accent); }
712
831
  #ralph-sticky .ralph-sticky-icon .lucide { width: 14px; height: 14px; }
713
832
  #ralph-sticky .ralph-sticky-label { font-size: 12px; font-weight: 600; color: var(--text-secondary); }
714
- #ralph-sticky .ralph-sticky-status { font-size: 12px; color: var(--text-muted); }
833
+ #ralph-sticky .ralph-sticky-status { font-size: 12px; color: var(--accent); }
715
834
  #ralph-sticky .ralph-sticky-status .lucide { width: 12px; height: 12px; }
716
835
 
717
- /* Ready state — green accent with subtle pulse */
836
+ /* Ready state — accent color with glow */
718
837
  #ralph-sticky.ralph-ready .ralph-sticky-inner {
719
- border-color: var(--success, #27ae60);
838
+ border-color: var(--accent, #6c5ce7);
839
+ box-shadow: 0 0 12px 2px color-mix(in srgb, var(--accent, #6c5ce7) 35%, transparent);
840
+ animation: ralphReadyGlow 2s ease-in-out infinite;
720
841
  }
721
- #ralph-sticky.ralph-ready .ralph-sticky-icon { color: var(--success, #27ae60); }
842
+ #ralph-sticky.ralph-ready .ralph-sticky-icon { color: var(--accent, #6c5ce7); }
722
843
  #ralph-sticky.ralph-ready .ralph-sticky-status {
723
- color: var(--success, #27ae60);
844
+ color: var(--accent, #6c5ce7);
724
845
  font-weight: 600;
725
846
  }
726
- #ralph-sticky.ralph-ready .ralph-sticky-inner {
727
- animation: ralphReadyPulse 2.5s ease-in-out 3;
728
- }
729
- @keyframes ralphReadyPulse {
730
- 0%, 100% { box-shadow: 0 0 0 0 rgba(39, 174, 96, 0); }
731
- 50% { box-shadow: 0 0 8px 2px rgba(39, 174, 96, 0.25); }
847
+ @keyframes ralphReadyGlow {
848
+ 0%, 100% { box-shadow: 0 0 8px 1px color-mix(in srgb, var(--accent, #6c5ce7) 25%, transparent); }
849
+ 50% { box-shadow: 0 0 16px 4px color-mix(in srgb, var(--accent, #6c5ce7) 40%, transparent); }
732
850
  }
733
851
  #ralph-sticky .ralph-sticky-cancel {
734
852
  display: inline-flex;
@@ -762,8 +880,8 @@
762
880
  #ralph-sticky .ralph-sticky-action .lucide { width: 14px; height: 14px; }
763
881
  #ralph-sticky .ralph-sticky-action:hover { color: var(--accent); background: rgba(var(--overlay-rgb), 0.06); }
764
882
  #ralph-sticky .ralph-sticky-action:disabled { opacity: 0.3; cursor: not-allowed; }
765
- #ralph-sticky .ralph-sticky-start { color: var(--success, #27ae60); }
766
- #ralph-sticky .ralph-sticky-start:hover { color: var(--success, #27ae60); background: rgba(39, 174, 96, 0.1); }
883
+ #ralph-sticky .ralph-sticky-start { color: var(--accent, #6c5ce7); }
884
+ #ralph-sticky .ralph-sticky-start:hover { color: var(--accent, #6c5ce7); background: color-mix(in srgb, var(--accent, #6c5ce7) 12%, transparent); }
767
885
  #ralph-sticky .ralph-sticky-dismiss { color: var(--text-muted); margin-left: 0; }
768
886
  #ralph-sticky .ralph-sticky-dismiss:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb), 0.06); }
769
887
 
@@ -247,6 +247,8 @@
247
247
  text-align: start;
248
248
  }
249
249
 
250
+ /* Twemoji sizing inherited from global img.emoji in base.css */
251
+
250
252
  .md-content p { margin-bottom: 14px; }
251
253
  .md-content p:last-child { margin-bottom: 0; }
252
254
 
@@ -89,8 +89,8 @@
89
89
 
90
90
  .mobile-tab { position: relative; }
91
91
 
92
- /* --- Center "+" button --- */
93
- .mobile-tab-new {
92
+ /* --- Center Clay home button --- */
93
+ .mobile-tab-home {
94
94
  flex: 1;
95
95
  height: 100%;
96
96
  background: none;
@@ -102,18 +102,20 @@
102
102
  -webkit-tap-highlight-color: transparent;
103
103
  }
104
104
 
105
- .mobile-tab-new .lucide {
106
- width: 20px;
107
- height: 20px;
108
- padding: 8px;
109
- box-sizing: content-box;
110
- border-radius: 50%;
111
- background: var(--border);
112
- color: #fff;
113
- transition: transform 0.1s;
105
+ .mobile-home-icon {
106
+ width: 32px;
107
+ height: 32px;
108
+ border-radius: 8px;
109
+ transition: transform 0.1s, filter 0.2s;
110
+ filter: grayscale(1) brightness(1.3) opacity(0.5);
114
111
  }
115
112
 
116
- .mobile-tab-new:active .lucide {
113
+ .mobile-tab-home.active .mobile-home-icon {
114
+ filter: none;
115
+ }
116
+
117
+ .mobile-tab-home:active .mobile-home-icon {
118
+ filter: none;
117
119
  transform: scale(0.92);
118
120
  }
119
121
 
@@ -298,6 +300,30 @@
298
300
  padding-bottom: calc(var(--safe-bottom) + 16px);
299
301
  }
300
302
 
303
+ /* --- New session button --- */
304
+ .mobile-session-new {
305
+ display: flex;
306
+ align-items: center;
307
+ gap: 8px;
308
+ width: 100%;
309
+ padding: 12px 12px;
310
+ margin-bottom: 4px;
311
+ background: none;
312
+ border: none;
313
+ border-bottom: 1px solid var(--border-subtle);
314
+ color: var(--accent);
315
+ font-family: "Pretendard", system-ui, sans-serif;
316
+ font-size: 15px;
317
+ font-weight: 600;
318
+ cursor: pointer;
319
+ text-align: left;
320
+ -webkit-tap-highlight-color: transparent;
321
+ }
322
+
323
+ .mobile-session-new:active {
324
+ background: rgba(var(--overlay-rgb), 0.06);
325
+ }
326
+
301
327
  /* --- Session items inside sheet --- */
302
328
  .mobile-session-item {
303
329
  display: flex;