clay-server 2.7.2 → 2.8.0

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 (58) hide show
  1. package/bin/cli.js +2 -1
  2. package/lib/config.js +7 -4
  3. package/lib/project.js +343 -15
  4. package/lib/public/app.js +1043 -135
  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 +10 -0
  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 +335 -42
  33. package/lib/public/modules/ascii-logo.js +389 -0
  34. package/lib/public/modules/filebrowser.js +2 -1
  35. package/lib/public/modules/markdown.js +118 -0
  36. package/lib/public/modules/notifications.js +50 -63
  37. package/lib/public/modules/playbook.js +578 -0
  38. package/lib/public/modules/profile.js +357 -0
  39. package/lib/public/modules/project-settings.js +4 -9
  40. package/lib/public/modules/scheduler.js +2826 -0
  41. package/lib/public/modules/server-settings.js +1 -1
  42. package/lib/public/modules/sidebar.js +378 -31
  43. package/lib/public/modules/sticky-notes.js +2 -0
  44. package/lib/public/modules/stt.js +272 -0
  45. package/lib/public/modules/terminal.js +32 -0
  46. package/lib/public/modules/theme.js +3 -10
  47. package/lib/public/modules/tools.js +2 -1
  48. package/lib/public/style.css +6 -0
  49. package/lib/public/sw.js +82 -3
  50. package/lib/public/wordmark-banded-20.png +0 -0
  51. package/lib/public/wordmark-banded-32.png +0 -0
  52. package/lib/public/wordmark-banded-64.png +0 -0
  53. package/lib/public/wordmark-banded-80.png +0 -0
  54. package/lib/scheduler.js +402 -0
  55. package/lib/sdk-bridge.js +3 -2
  56. package/lib/server.js +124 -3
  57. package/lib/sessions.js +35 -2
  58. package/package.json +1 -1
@@ -3,7 +3,7 @@ import { iconHtml, refreshIcons } from './icons.js';
3
3
 
4
4
  var ctx;
5
5
  var basePath = "/";
6
- var onboardingBanner, onboardingText, onboardingClose, onboardingDismissed;
6
+ var onboardingPill, onboardingText, onboardingClose, onboardingDismissed;
7
7
  var notifAlertEnabled, notifSoundEnabled, notifPermission;
8
8
  var audioCtx = null;
9
9
 
@@ -13,12 +13,12 @@ export function getNotifPermission() { return notifPermission; }
13
13
 
14
14
  export function showOnboarding(html) {
15
15
  onboardingText.innerHTML = html;
16
- onboardingBanner.classList.remove("hidden");
16
+ onboardingPill.classList.remove("hidden");
17
17
  refreshIcons();
18
18
  }
19
19
 
20
20
  export function hideOnboarding() {
21
- onboardingBanner.classList.add("hidden");
21
+ onboardingPill.classList.add("hidden");
22
22
  }
23
23
 
24
24
  export function playDoneSound() {
@@ -80,69 +80,57 @@ export function initNotifications(_ctx) {
80
80
  window.visualViewport.addEventListener("scroll", onViewportChange);
81
81
  }
82
82
 
83
- // --- Update banner ---
83
+ // --- Update pill badge ---
84
84
  (function () {
85
- var banner = $("update-banner");
86
- var closeBtn = $("update-banner-close");
87
- var howBtn = $("update-how");
85
+ var pillWrap = $("update-pill-wrap");
86
+ var pillBtn = $("update-pill");
87
+ var popover = $("update-popover");
88
88
  var updateNowBtn = $("update-now");
89
- if (!banner) return;
90
-
91
- // Build popover (manual update instructions)
92
- var popover = document.createElement("div");
93
- popover.id = "update-popover";
94
- popover.innerHTML =
95
- '<div class="popover-label">Run in your terminal:</div>' +
96
- '<div class="popover-cmd">' +
97
- '<code>npx clay-server@latest</code>' +
98
- '<button class="popover-copy" title="Copy">' + iconHtml("copy") + '</button>' +
99
- '</div>';
100
- banner.appendChild(popover);
101
- refreshIcons();
89
+ if (!pillWrap) return;
102
90
 
103
91
  var copyBtn = popover.querySelector(".popover-copy");
104
- copyBtn.addEventListener("click", function () {
105
- copyToClipboard("npx clay-server@latest").then(function () {
106
- copyBtn.classList.add("copied");
107
- copyBtn.innerHTML = iconHtml("check");
108
- refreshIcons();
109
- setTimeout(function () {
110
- copyBtn.classList.remove("copied");
111
- copyBtn.innerHTML = iconHtml("copy");
92
+ if (copyBtn) {
93
+ copyBtn.addEventListener("click", function (e) {
94
+ e.stopPropagation();
95
+ copyToClipboard("npx clay-server@latest").then(function () {
96
+ copyBtn.classList.add("copied");
97
+ copyBtn.innerHTML = iconHtml("check");
112
98
  refreshIcons();
113
- }, 1500);
99
+ setTimeout(function () {
100
+ copyBtn.classList.remove("copied");
101
+ copyBtn.innerHTML = iconHtml("copy");
102
+ refreshIcons();
103
+ }, 1500);
104
+ });
114
105
  });
115
- });
106
+ }
116
107
 
117
108
  // "Update now" button — trigger server-side update + restart
118
109
  if (updateNowBtn) {
119
- updateNowBtn.addEventListener("click", function () {
110
+ updateNowBtn.addEventListener("click", function (e) {
111
+ e.stopPropagation();
120
112
  if (ctx.ws && ctx.connected) {
121
113
  ctx.ws.send(JSON.stringify({ type: "update_now" }));
122
- updateNowBtn.textContent = "Updating...";
114
+ var textNode = updateNowBtn.lastChild;
115
+ if (textNode) textNode.textContent = " Updating...";
123
116
  updateNowBtn.disabled = true;
124
117
  }
125
118
  });
126
119
  }
127
120
 
128
- // "?" button toggle manual instructions popover
129
- howBtn.addEventListener("click", function (e) {
130
- e.stopPropagation();
131
- popover.classList.toggle("visible");
132
- });
121
+ // Toggle popover on pill click
122
+ if (pillBtn) {
123
+ pillBtn.addEventListener("click", function (e) {
124
+ e.stopPropagation();
125
+ popover.classList.toggle("visible");
126
+ });
127
+ }
133
128
 
134
129
  document.addEventListener("click", function (e) {
135
- if (!popover.contains(e.target) && e.target !== howBtn) {
130
+ if (!popover.contains(e.target) && e.target !== pillBtn && !pillBtn.contains(e.target)) {
136
131
  popover.classList.remove("visible");
137
132
  }
138
133
  });
139
-
140
- if (closeBtn) {
141
- closeBtn.addEventListener("click", function () {
142
- banner.classList.add("hidden");
143
- popover.classList.remove("visible");
144
- });
145
- }
146
134
  })();
147
135
 
148
136
  // --- Settings: Check for updates ---
@@ -199,10 +187,10 @@ export function initNotifications(_ctx) {
199
187
  }
200
188
  })();
201
189
 
202
- // --- Onboarding banner (HTTPS / Push) ---
203
- onboardingBanner = $("onboarding-banner");
204
- onboardingText = $("onboarding-banner-text");
205
- onboardingClose = $("onboarding-banner-close");
190
+ // --- Onboarding pill badge (HTTPS / Push) ---
191
+ onboardingPill = $("onboarding-pill");
192
+ onboardingText = $("onboarding-pill-text");
193
+ onboardingClose = $("onboarding-pill-close");
206
194
  onboardingDismissed = localStorage.getItem("onboarding-dismissed");
207
195
 
208
196
  if (onboardingClose) {
@@ -218,7 +206,7 @@ export function initNotifications(_ctx) {
218
206
  if (!onboardingDismissed) {
219
207
  showOnboarding(
220
208
  iconHtml("bell-ring") +
221
- ' Get alerts on your phone when Claude is done. <a href="/setup">Set up HTTPS</a>'
209
+ ' <a href="/setup">Set up HTTPS</a>'
222
210
  );
223
211
  }
224
212
  }
@@ -563,8 +551,7 @@ export function initNotifications(_ctx) {
563
551
  if (!onboardingDismissed) {
564
552
  showOnboarding(
565
553
  iconHtml("bell-ring") +
566
- ' Get notified when Claude responds. ' +
567
- '<button class="onboarding-cta" id="onboarding-enable-push">Enable push notifications</button>'
554
+ ' <button class="onboarding-cta" id="onboarding-enable-push">Enable push</button>'
568
555
  );
569
556
  var enableBtn = $("onboarding-enable-push");
570
557
  if (enableBtn) {
@@ -596,13 +583,13 @@ export function initNotifications(_ctx) {
596
583
  var open = debugMenu.classList.toggle("hidden");
597
584
  debugBtn.classList.toggle("active", !open);
598
585
 
599
- // Sync toggle states with current banner visibility
600
- var updateBanner = $("update-banner");
601
- if (debugToggleUpdate && updateBanner) {
602
- debugToggleUpdate.checked = !updateBanner.classList.contains("hidden");
586
+ // Sync toggle states with current pill visibility
587
+ var updatePillWrap = $("update-pill-wrap");
588
+ if (debugToggleUpdate && updatePillWrap) {
589
+ debugToggleUpdate.checked = !updatePillWrap.classList.contains("hidden");
603
590
  }
604
- if (debugToggleOnboarding && onboardingBanner) {
605
- debugToggleOnboarding.checked = !onboardingBanner.classList.contains("hidden");
591
+ if (debugToggleOnboarding && onboardingPill) {
592
+ debugToggleOnboarding.checked = !onboardingPill.classList.contains("hidden");
606
593
  }
607
594
  });
608
595
 
@@ -615,15 +602,15 @@ export function initNotifications(_ctx) {
615
602
 
616
603
  if (debugToggleUpdate) {
617
604
  debugToggleUpdate.addEventListener("change", function () {
618
- var banner = $("update-banner");
619
- if (!banner) return;
605
+ var pillWrap = $("update-pill-wrap");
606
+ if (!pillWrap) return;
620
607
  if (debugToggleUpdate.checked) {
621
608
  // Trigger real update check from server (debug mode uses v0.0.9)
622
609
  if (ctx.ws && ctx.connected) {
623
610
  ctx.ws.send(JSON.stringify({ type: "check_update" }));
624
611
  }
625
612
  } else {
626
- banner.classList.add("hidden");
613
+ pillWrap.classList.add("hidden");
627
614
  }
628
615
  refreshIcons();
629
616
  });
@@ -635,10 +622,10 @@ export function initNotifications(_ctx) {
635
622
  if (!onboardingText.innerHTML.trim()) {
636
623
  showOnboarding(
637
624
  iconHtml("bell-ring") +
638
- ' Get alerts on your phone when Claude is done. <a href="/setup">Set up HTTPS</a>'
625
+ ' <a href="/setup">Set up HTTPS</a>'
639
626
  );
640
627
  } else {
641
- onboardingBanner.classList.remove("hidden");
628
+ onboardingPill.classList.remove("hidden");
642
629
  }
643
630
  } else {
644
631
  hideOnboarding();