clay-server 2.8.2 → 2.9.1

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 (38) hide show
  1. package/README.md +2 -0
  2. package/bin/cli.js +122 -2
  3. package/lib/config.js +20 -1
  4. package/lib/daemon.js +40 -0
  5. package/lib/pages.js +671 -27
  6. package/lib/project.js +280 -42
  7. package/lib/public/app.js +321 -84
  8. package/lib/public/css/admin.css +576 -0
  9. package/lib/public/css/base.css +3 -0
  10. package/lib/public/css/filebrowser.css +8 -1
  11. package/lib/public/css/home-hub.css +1 -1
  12. package/lib/public/css/icon-strip.css +1 -0
  13. package/lib/public/css/input.css +4 -0
  14. package/lib/public/css/menus.css +16 -51
  15. package/lib/public/css/messages.css +1 -0
  16. package/lib/public/css/mobile-nav.css +2 -2
  17. package/lib/public/css/overlays.css +177 -20
  18. package/lib/public/css/scheduler.css +1 -0
  19. package/lib/public/css/server-settings.css +37 -34
  20. package/lib/public/css/sidebar.css +49 -0
  21. package/lib/public/css/title-bar.css +45 -8
  22. package/lib/public/index.html +96 -25
  23. package/lib/public/manifest.json +2 -2
  24. package/lib/public/modules/admin.js +631 -0
  25. package/lib/public/modules/markdown.js +9 -5
  26. package/lib/public/modules/notifications.js +15 -103
  27. package/lib/public/modules/profile.js +21 -0
  28. package/lib/public/modules/project-settings.js +4 -1
  29. package/lib/public/modules/scheduler.js +55 -48
  30. package/lib/public/modules/server-settings.js +26 -4
  31. package/lib/public/modules/sidebar.js +111 -5
  32. package/lib/public/style.css +1 -0
  33. package/lib/push.js +6 -0
  34. package/lib/server.js +1075 -27
  35. package/lib/sessions.js +127 -41
  36. package/lib/smtp.js +221 -0
  37. package/lib/users.js +459 -0
  38. package/package.json +2 -1
@@ -5,8 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
6
6
  <meta name="apple-mobile-web-app-capable" content="yes">
7
7
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
8
- <link rel="manifest" href="manifest.json">
9
- <meta name="theme-color" content="#2F2E2B">
8
+ <script>
9
+ (function(){
10
+ var isIOS=/iPad|iPhone|iPod/.test(navigator.userAgent)||(navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1);
11
+ if(!isIOS){var l=document.createElement("link");l.rel="manifest";l.href="manifest.json";document.head.appendChild(l)}
12
+ })();
13
+ </script>
14
+ <meta name="theme-color" content="#282a36">
10
15
  <link rel="icon" type="image/png" href="favicon-banded.png">
11
16
  <link rel="apple-touch-icon" href="apple-touch-icon.png">
12
17
  <title>Clay</title>
@@ -17,20 +22,16 @@
17
22
  <script>
18
23
  (function(){try{var k="clay-theme-vars",v=localStorage.getItem(k),r=document.documentElement;if(v){var o=JSON.parse(v),p;for(p in o)r.style.setProperty(p,o[p]);var vt=localStorage.getItem(k.replace("-vars","-variant"));if(vt==="light"){r.classList.add("light-theme");r.classList.remove("dark-theme")}else{r.classList.add("dark-theme");r.classList.remove("light-theme")}var m=document.querySelector('meta[name="theme-color"]');if(m&&o["--bg"])m.setAttribute("content",o["--bg"])}else{var sl=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches;if(sl){r.classList.add("light-theme");r.classList.remove("dark-theme")}}}catch(e){}})();
19
24
  </script>
25
+ <script>if(window.navigator.standalone||window.matchMedia("(display-mode:standalone)").matches){document.documentElement.classList.add("pwa-standalone")}</script>
20
26
  <link rel="stylesheet" href="style.css">
21
27
  </head>
22
28
  <body>
23
29
  <div id="layout">
24
30
  <!-- === Top Bar (full width, forms reverse-ㄱ with icon strip) === -->
25
31
  <div id="top-bar">
26
- <a href="https://github.com/chadbyte/clay" target="_blank" rel="noopener" class="top-bar-title"><img class="top-bar-icon" src="favicon-banded.png" width="16" height="16" alt="">Clay <span id="footer-version" class="footer-version"></span></a>
27
- <div class="top-bar-actions">
28
- <!-- Pill badges (formerly banners) -->
29
- <div id="skip-perms-pill" class="top-bar-pill pill-error hidden"><i data-lucide="shield-off"></i> <span>Skip perms</span></div>
30
- <div id="onboarding-pill" class="top-bar-pill pill-accent hidden">
31
- <span class="onboarding-pill-text" id="onboarding-pill-text"></span>
32
- <button id="onboarding-pill-close" class="pill-close" aria-label="Dismiss"><i data-lucide="x"></i></button>
33
- </div>
32
+ <button id="pwa-install-pill" class="top-bar-install-btn hidden" title="Install app"><i data-lucide="download"></i></button>
33
+ <div class="top-bar-center">
34
+ <a href="https://github.com/chadbyte/clay" target="_blank" rel="noopener" class="top-bar-title"><img class="top-bar-icon" src="favicon-banded.png" width="16" height="16" alt="">Clay <span id="footer-version" class="footer-version"></span></a>
34
35
  <div id="update-pill-wrap" class="hidden">
35
36
  <button id="update-pill" class="top-bar-pill pill-success"><i data-lucide="arrow-up-circle"></i> <span id="update-version"></span></button>
36
37
  <div id="update-popover" class="top-bar-popover">
@@ -38,22 +39,11 @@
38
39
  <div class="popover-row"><div class="popover-label">Or run manually:</div><div class="popover-cmd"><code>npx clay-server@latest</code><button class="popover-copy" title="Copy"><i data-lucide="copy"></i></button></div></div>
39
40
  </div>
40
41
  </div>
42
+ </div>
43
+ <div class="top-bar-actions">
44
+ <!-- Pill badges -->
45
+ <div id="skip-perms-pill" class="top-bar-pill pill-error hidden"><i data-lucide="shield-off"></i> <span>Skip perms</span></div>
41
46
  <span id="client-count" class="hidden"></span>
42
- <div id="debug-menu-wrap" class="hidden">
43
- <button id="debug-btn" title="Debug"><i data-lucide="bug"></i></button>
44
- <div id="debug-menu" class="hidden">
45
- <label class="notif-option">
46
- <span>Update banner</span>
47
- <input type="checkbox" id="debug-toggle-update">
48
- <span class="toggle-track"><span class="toggle-thumb"></span></span>
49
- </label>
50
- <label class="notif-option">
51
- <span>Onboarding banner</span>
52
- <input type="checkbox" id="debug-toggle-onboarding">
53
- <span class="toggle-track"><span class="toggle-thumb"></span></span>
54
- </label>
55
- </div>
56
- </div>
57
47
  <label id="theme-toggle-btn" class="theme-toggle" title="Toggle dark/light mode">
58
48
  <input type="checkbox" id="theme-toggle-check">
59
49
  <span class="theme-toggle-track">
@@ -148,6 +138,7 @@
148
138
  <span class="title-bar-project-name" id="title-bar-project-name"></span>
149
139
  <i data-lucide="chevron-down" class="title-bar-chevron"></i>
150
140
  </button>
141
+ <span id="sidebar-presence" class="sidebar-presence"></span>
151
142
  </div>
152
143
  <div id="sidebar">
153
144
  <div id="sidebar-tools">
@@ -564,6 +555,7 @@
564
555
  <div class="user-island-avatar"><span class="user-island-avatar-letter">?</span></div>
565
556
  <div class="user-island-info">
566
557
  <span class="user-island-name">Awesome Clay User</span>
558
+ <span class="user-island-cta hidden">Personalize your name</span>
567
559
  </div>
568
560
  </div>
569
561
  <div class="user-island-actions">
@@ -610,6 +602,28 @@
610
602
  <div class="server-settings-nav">
611
603
  <div class="server-settings-nav-inner">
612
604
  <div class="server-settings-nav-header" id="settings-server-name"></div>
605
+ <select id="settings-nav-dropdown" class="settings-nav-dropdown">
606
+ <optgroup label="General">
607
+ <option value="overview" selected>Status</option>
608
+ <option value="notifications">Notifications</option>
609
+ </optgroup>
610
+ <optgroup label="Session">
611
+ <option value="models">Model &amp; Behavior</option>
612
+ <option value="claudemd">CLAUDE.md</option>
613
+ <option value="environment">Environment Variables</option>
614
+ </optgroup>
615
+ <optgroup label="Admin" class="settings-admin-only">
616
+ <option value="admin-users">Users</option>
617
+ <option value="admin-invites">Invites</option>
618
+ <option value="admin-projects">Projects</option>
619
+ <option value="admin-smtp">Email (SMTP)</option>
620
+ </optgroup>
621
+ <optgroup label="Server">
622
+ <option value="security">Security</option>
623
+ <option value="restart">Restart Server</option>
624
+ <option value="shutdown">Shutdown Server</option>
625
+ </optgroup>
626
+ </select>
613
627
  <div class="server-settings-nav-items">
614
628
  <div class="settings-nav-category">General</div>
615
629
  <button class="settings-nav-item active" data-section="overview"><span>Status</span></button>
@@ -619,6 +633,12 @@
619
633
  <button class="settings-nav-item" data-section="models"><span>Model &amp; Behavior</span></button>
620
634
  <button class="settings-nav-item" data-section="claudemd"><span>CLAUDE.md</span></button>
621
635
  <button class="settings-nav-item" data-section="environment"><span>Environment Variables</span></button>
636
+ <div class="settings-nav-separator settings-admin-only"></div>
637
+ <div class="settings-nav-category settings-admin-only">Admin</div>
638
+ <button class="settings-nav-item settings-admin-only" data-section="admin-users"><span>Users</span></button>
639
+ <button class="settings-nav-item settings-admin-only" data-section="admin-invites"><span>Invites</span></button>
640
+ <button class="settings-nav-item settings-admin-only" data-section="admin-projects"><span>Projects</span></button>
641
+ <button class="settings-nav-item settings-admin-only" data-section="admin-smtp"><span>Email (SMTP)</span></button>
622
642
  <div class="settings-nav-separator"></div>
623
643
  <div class="settings-nav-category">Server</div>
624
644
  <button class="settings-nav-item" data-section="security"><span>Security</span></button>
@@ -879,6 +899,25 @@
879
899
  </div>
880
900
  </div>
881
901
  </div>
902
+ <!-- Admin sections (multi-user, admin only) -->
903
+ <div class="server-settings-section settings-admin-only" data-section="admin-users">
904
+ <h2>Users</h2>
905
+ <div class="settings-card" id="admin-users-body"></div>
906
+ </div>
907
+ <div class="server-settings-section settings-admin-only" data-section="admin-invites">
908
+ <h2>Invites</h2>
909
+ <div class="settings-card" id="admin-invites-body"></div>
910
+ </div>
911
+ <div class="server-settings-section settings-admin-only" data-section="admin-projects">
912
+ <h2>Project Access</h2>
913
+ <div class="settings-card" id="admin-projects-body"></div>
914
+ </div>
915
+ <div class="server-settings-section settings-admin-only" data-section="admin-smtp">
916
+ <h2>Email (SMTP)</h2>
917
+ <div class="settings-card" id="admin-smtp-body"></div>
918
+ </div>
919
+
920
+ </div>
882
921
  </div>
883
922
  </div>
884
923
  <div class="server-settings-close-col">
@@ -996,6 +1035,20 @@
996
1035
  </div>
997
1036
  </div>
998
1037
 
1038
+ <div id="skill-install-modal" class="hidden">
1039
+ <div class="confirm-backdrop"></div>
1040
+ <div class="confirm-dialog skill-install-dialog">
1041
+ <div class="skill-install-title" id="skill-install-title"></div>
1042
+ <div class="skill-install-reason" id="skill-install-reason"></div>
1043
+ <div class="skill-install-list" id="skill-install-list"></div>
1044
+ <div id="skill-install-status" class="hidden"></div>
1045
+ <div class="confirm-actions">
1046
+ <button class="confirm-btn confirm-cancel" id="skill-install-cancel">Cancel</button>
1047
+ <button class="confirm-btn confirm-delete" id="skill-install-ok">Install</button>
1048
+ </div>
1049
+ </div>
1050
+ </div>
1051
+
999
1052
  <div id="add-project-modal" class="hidden">
1000
1053
  <div class="confirm-backdrop"></div>
1001
1054
  <div class="confirm-dialog add-project-dialog">
@@ -1357,10 +1410,28 @@
1357
1410
  <script src="https://cdn.jsdelivr.net/npm/dompurify@3/dist/purify.min.js"></script>
1358
1411
  <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/highlight.min.js"></script>
1359
1412
  <script src="https://cdn.jsdelivr.net/npm/lucide@0.468.0/dist/umd/lucide.min.js"></script>
1413
+ <script src="https://cdn.jsdelivr.net/npm/twemoji@14.0.2/dist/twemoji.min.js"></script>
1360
1414
  <script src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js"></script>
1361
1415
  <script src="https://cdn.jsdelivr.net/npm/qrcode-generator@1.4.4/qrcode.min.js"></script>
1362
1416
  <script src="https://cdn.jsdelivr.net/npm/@xterm/xterm@5/lib/xterm.min.js"></script>
1363
1417
  <script src="https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0/lib/addon-fit.min.js"></script>
1364
1418
  <script type="module" src="app.js"></script>
1419
+ <div id="pwa-install-modal" class="pwa-modal hidden">
1420
+ <div class="pwa-modal-backdrop"></div>
1421
+ <div class="pwa-modal-card">
1422
+ <div class="pwa-modal-icon">📲</div>
1423
+ <h3 class="pwa-modal-title">Add to Home Screen</h3>
1424
+ <p class="pwa-modal-desc">Add Clay to your home screen for a better experience.</p>
1425
+ <ul class="pwa-modal-benefits">
1426
+ <li><i data-lucide="maximize" class="pwa-benefit-icon"></i>Full-screen — no browser toolbar</li>
1427
+ <li><i data-lucide="bell" class="pwa-benefit-icon"></i>Push notifications when tasks finish</li>
1428
+ <li><i data-lucide="zap" class="pwa-benefit-icon"></i>Instant launch from home screen</li>
1429
+ </ul>
1430
+ <div class="pwa-modal-buttons">
1431
+ <button id="pwa-modal-confirm" class="pwa-modal-btn primary">Continue</button>
1432
+ <button id="pwa-modal-cancel" class="pwa-modal-btn secondary">Not now</button>
1433
+ </div>
1434
+ </div>
1435
+ </div>
1365
1436
  </body>
1366
1437
  </html>
@@ -5,8 +5,8 @@
5
5
  "start_url": "/",
6
6
  "scope": "/",
7
7
  "display": "standalone",
8
- "background_color": "#2F2E2B",
9
- "theme_color": "#2F2E2B",
8
+ "background_color": "#282a36",
9
+ "theme_color": "#282a36",
10
10
  "icons": [
11
11
  {
12
12
  "src": "icon-192.png",