clay-server 2.5.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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +281 -0
  3. package/bin/cli.js +2385 -0
  4. package/lib/cli-sessions.js +270 -0
  5. package/lib/config.js +237 -0
  6. package/lib/daemon.js +489 -0
  7. package/lib/ipc.js +112 -0
  8. package/lib/notes.js +120 -0
  9. package/lib/pages.js +664 -0
  10. package/lib/project.js +1433 -0
  11. package/lib/public/app.js +2795 -0
  12. package/lib/public/apple-touch-icon-dark.png +0 -0
  13. package/lib/public/apple-touch-icon.png +0 -0
  14. package/lib/public/css/base.css +264 -0
  15. package/lib/public/css/diff.css +128 -0
  16. package/lib/public/css/filebrowser.css +1114 -0
  17. package/lib/public/css/highlight.css +144 -0
  18. package/lib/public/css/icon-strip.css +296 -0
  19. package/lib/public/css/input.css +573 -0
  20. package/lib/public/css/menus.css +856 -0
  21. package/lib/public/css/messages.css +1445 -0
  22. package/lib/public/css/mobile-nav.css +354 -0
  23. package/lib/public/css/overlays.css +697 -0
  24. package/lib/public/css/rewind.css +505 -0
  25. package/lib/public/css/server-settings.css +761 -0
  26. package/lib/public/css/sidebar.css +936 -0
  27. package/lib/public/css/sticky-notes.css +358 -0
  28. package/lib/public/css/title-bar.css +314 -0
  29. package/lib/public/favicon-dark.svg +1 -0
  30. package/lib/public/favicon.svg +1 -0
  31. package/lib/public/icon-192-dark.png +0 -0
  32. package/lib/public/icon-192.png +0 -0
  33. package/lib/public/icon-512-dark.png +0 -0
  34. package/lib/public/icon-512.png +0 -0
  35. package/lib/public/icon-mono.svg +1 -0
  36. package/lib/public/index.html +762 -0
  37. package/lib/public/manifest.json +27 -0
  38. package/lib/public/modules/diff.js +398 -0
  39. package/lib/public/modules/events.js +21 -0
  40. package/lib/public/modules/filebrowser.js +1411 -0
  41. package/lib/public/modules/fileicons.js +172 -0
  42. package/lib/public/modules/icons.js +54 -0
  43. package/lib/public/modules/input.js +584 -0
  44. package/lib/public/modules/markdown.js +356 -0
  45. package/lib/public/modules/notifications.js +649 -0
  46. package/lib/public/modules/qrcode.js +70 -0
  47. package/lib/public/modules/rewind.js +345 -0
  48. package/lib/public/modules/server-settings.js +510 -0
  49. package/lib/public/modules/sidebar.js +1083 -0
  50. package/lib/public/modules/state.js +3 -0
  51. package/lib/public/modules/sticky-notes.js +688 -0
  52. package/lib/public/modules/terminal.js +697 -0
  53. package/lib/public/modules/theme.js +738 -0
  54. package/lib/public/modules/tools.js +1608 -0
  55. package/lib/public/modules/utils.js +56 -0
  56. package/lib/public/style.css +15 -0
  57. package/lib/public/sw.js +75 -0
  58. package/lib/push.js +124 -0
  59. package/lib/sdk-bridge.js +989 -0
  60. package/lib/server.js +582 -0
  61. package/lib/sessions.js +424 -0
  62. package/lib/terminal-manager.js +187 -0
  63. package/lib/terminal.js +24 -0
  64. package/lib/themes/ayu-light.json +9 -0
  65. package/lib/themes/catppuccin-latte.json +9 -0
  66. package/lib/themes/catppuccin-mocha.json +9 -0
  67. package/lib/themes/clay-light.json +10 -0
  68. package/lib/themes/clay.json +10 -0
  69. package/lib/themes/dracula.json +9 -0
  70. package/lib/themes/everforest-light.json +9 -0
  71. package/lib/themes/everforest.json +9 -0
  72. package/lib/themes/github-light.json +9 -0
  73. package/lib/themes/gruvbox-dark.json +9 -0
  74. package/lib/themes/gruvbox-light.json +9 -0
  75. package/lib/themes/monokai.json +9 -0
  76. package/lib/themes/nord-light.json +9 -0
  77. package/lib/themes/nord.json +9 -0
  78. package/lib/themes/one-dark.json +9 -0
  79. package/lib/themes/one-light.json +9 -0
  80. package/lib/themes/rose-pine-dawn.json +9 -0
  81. package/lib/themes/rose-pine.json +9 -0
  82. package/lib/themes/solarized-dark.json +9 -0
  83. package/lib/themes/solarized-light.json +9 -0
  84. package/lib/themes/tokyo-night-light.json +9 -0
  85. package/lib/themes/tokyo-night.json +9 -0
  86. package/lib/updater.js +97 -0
  87. package/package.json +47 -0
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Everforest Light",
3
+ "author": "Sainnhe Park",
4
+ "variant": "light",
5
+ "base00": "fdf6e3", "base01": "f4f0d9", "base02": "e6e2cc", "base03": "a6b0a0",
6
+ "base04": "829181", "base05": "5c6a72", "base06": "3a464c", "base07": "272e33",
7
+ "base08": "f85552", "base09": "f57d26", "base0A": "dfa000", "base0B": "8da101",
8
+ "base0C": "35a77c", "base0D": "3a94c5", "base0E": "df69ba", "base0F": "9da9a0"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Everforest",
3
+ "author": "Sainnhe Park",
4
+ "variant": "dark",
5
+ "base00": "272e33", "base01": "2e383c", "base02": "414b50", "base03": "859289",
6
+ "base04": "9da9a0", "base05": "d3c6aa", "base06": "edeada", "base07": "fffbef",
7
+ "base08": "e67e80", "base09": "e69875", "base0A": "dbbc7f", "base0B": "a7c080",
8
+ "base0C": "83c092", "base0D": "7fbbb3", "base0E": "d699b6", "base0F": "9da9a0"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "GitHub Light",
3
+ "author": "GitHub",
4
+ "variant": "light",
5
+ "base00": "ffffff", "base01": "f6f8fa", "base02": "d8dee4", "base03": "afb8c1",
6
+ "base04": "6e7781", "base05": "424a53", "base06": "24292f", "base07": "1b1f24",
7
+ "base08": "cf222e", "base09": "bc4c00", "base0A": "9a6700", "base0B": "1a7f37",
8
+ "base0C": "0969da", "base0D": "0550ae", "base0E": "8250df", "base0F": "6e7781"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Gruvbox Dark",
3
+ "author": "Dawid Kurek, morhetz",
4
+ "variant": "dark",
5
+ "base00": "282828", "base01": "3c3836", "base02": "504945", "base03": "665c54",
6
+ "base04": "bdae93", "base05": "d5c4a1", "base06": "ebdbb2", "base07": "fbf1c7",
7
+ "base08": "fb4934", "base09": "fe8019", "base0A": "fabd2f", "base0B": "b8bb26",
8
+ "base0C": "8ec07c", "base0D": "83a598", "base0E": "d3869b", "base0F": "d65d0e"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Gruvbox Light",
3
+ "author": "Dawid Kurek, morhetz",
4
+ "variant": "light",
5
+ "base00": "fbf1c7", "base01": "ebdbb2", "base02": "d5c4a1", "base03": "a89984",
6
+ "base04": "7c6f64", "base05": "504945", "base06": "3c3836", "base07": "282828",
7
+ "base08": "9d0006", "base09": "af3a03", "base0A": "b57614", "base0B": "79740e",
8
+ "base0C": "427b58", "base0D": "076678", "base0E": "8f3f71", "base0F": "d65d0e"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Monokai",
3
+ "author": "Wimer Hazenberg",
4
+ "variant": "dark",
5
+ "base00": "272822", "base01": "383830", "base02": "49483e", "base03": "75715e",
6
+ "base04": "a59f85", "base05": "f8f8f2", "base06": "f5f4f1", "base07": "f9f8f5",
7
+ "base08": "f92672", "base09": "fd971f", "base0A": "f4bf75", "base0B": "a6e22e",
8
+ "base0C": "a1efe4", "base0D": "66d9ef", "base0E": "ae81ff", "base0F": "cc6633"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Nord Light",
3
+ "author": "threddast",
4
+ "variant": "light",
5
+ "base00": "E5E9F0", "base01": "C2D0E7", "base02": "B8C5DB", "base03": "AEBACF",
6
+ "base04": "60728C", "base05": "2E3440", "base06": "3B4252", "base07": "29838D",
7
+ "base08": "99324B", "base09": "AC4426", "base0A": "9A7500", "base0B": "4F894C",
8
+ "base0C": "398EAC", "base0D": "3B6EA8", "base0E": "97365B", "base0F": "5272AF"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Nord",
3
+ "author": "arcticicestudio",
4
+ "variant": "dark",
5
+ "base00": "2E3440", "base01": "3B4252", "base02": "434C5E", "base03": "4C566A",
6
+ "base04": "D8DEE9", "base05": "E5E9F0", "base06": "ECEFF4", "base07": "8FBCBB",
7
+ "base08": "BF616A", "base09": "D08770", "base0A": "EBCB8B", "base0B": "A3BE8C",
8
+ "base0C": "88C0D0", "base0D": "81A1C1", "base0E": "B48EAD", "base0F": "5E81AC"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "One Dark",
3
+ "author": "Lalit Magant",
4
+ "variant": "dark",
5
+ "base00": "282c34", "base01": "353b45", "base02": "3e4451", "base03": "545862",
6
+ "base04": "565c64", "base05": "abb2bf", "base06": "b6bdca", "base07": "c8ccd4",
7
+ "base08": "e06c75", "base09": "d19a66", "base0A": "e5c07b", "base0B": "98c379",
8
+ "base0C": "56b6c2", "base0D": "61afef", "base0E": "c678dd", "base0F": "be5046"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "One Light",
3
+ "author": "Daniel Pfeifer",
4
+ "variant": "light",
5
+ "base00": "FAFAFA", "base01": "F0F0F1", "base02": "E5E5E6", "base03": "A0A1A7",
6
+ "base04": "696C77", "base05": "383A42", "base06": "202227", "base07": "090A0B",
7
+ "base08": "CA1243", "base09": "D75F00", "base0A": "C18401", "base0B": "50A14F",
8
+ "base0C": "0184BC", "base0D": "4078F2", "base0E": "A626A4", "base0F": "986801"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Rosé Pine Dawn",
3
+ "author": "Emilia Dunfelt",
4
+ "variant": "light",
5
+ "base00": "faf4ed", "base01": "fffaf3", "base02": "dfdad9", "base03": "9893a5",
6
+ "base04": "797593", "base05": "575279", "base06": "26233a", "base07": "191724",
7
+ "base08": "b4637a", "base09": "ea9d34", "base0A": "d7827e", "base0B": "286983",
8
+ "base0C": "56949f", "base0D": "907aa9", "base0E": "ea9d34", "base0F": "cecacd"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Rosé Pine",
3
+ "author": "Emilia Dunfelt",
4
+ "variant": "dark",
5
+ "base00": "191724", "base01": "1f1d2e", "base02": "26233a", "base03": "6e6a86",
6
+ "base04": "908caa", "base05": "e0def4", "base06": "e0def4", "base07": "524f67",
7
+ "base08": "eb6f92", "base09": "f6c177", "base0A": "ebbcba", "base0B": "31748f",
8
+ "base0C": "9ccfd8", "base0D": "c4a7e7", "base0E": "f6c177", "base0F": "524f67"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Solarized Dark",
3
+ "author": "Ethan Schoonover",
4
+ "variant": "dark",
5
+ "base00": "002b36", "base01": "073642", "base02": "586e75", "base03": "657b83",
6
+ "base04": "839496", "base05": "93a1a1", "base06": "eee8d5", "base07": "fdf6e3",
7
+ "base08": "dc322f", "base09": "cb4b16", "base0A": "b58900", "base0B": "859900",
8
+ "base0C": "2aa198", "base0D": "268bd2", "base0E": "6c71c4", "base0F": "d33682"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Solarized Light",
3
+ "author": "Ethan Schoonover",
4
+ "variant": "light",
5
+ "base00": "fdf6e3", "base01": "eee8d5", "base02": "d3cbb7", "base03": "93a1a1",
6
+ "base04": "839496", "base05": "586e75", "base06": "073642", "base07": "002b36",
7
+ "base08": "dc322f", "base09": "cb4b16", "base0A": "b58900", "base0B": "859900",
8
+ "base0C": "2aa198", "base0D": "268bd2", "base0E": "6c71c4", "base0F": "d33682"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Tokyo Night Light",
3
+ "author": "folke",
4
+ "variant": "light",
5
+ "base00": "D5D6DB", "base01": "CBCCD1", "base02": "DFE0E5", "base03": "9699A3",
6
+ "base04": "4C505E", "base05": "343B59", "base06": "1A1B26", "base07": "1A1B26",
7
+ "base08": "8C4351", "base09": "965027", "base0A": "8F5E15", "base0B": "33635C",
8
+ "base0C": "0F4B6E", "base0D": "34548A", "base0E": "5A4A78", "base0F": "655259"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "Tokyo Night",
3
+ "author": "Michaël Ball",
4
+ "variant": "dark",
5
+ "base00": "1A1B26", "base01": "16161E", "base02": "2F3549", "base03": "444B6A",
6
+ "base04": "787C99", "base05": "A9B1D6", "base06": "CBCCD1", "base07": "D5D6DB",
7
+ "base08": "C0CAF5", "base09": "A9B1D6", "base0A": "0DB9D7", "base0B": "9ECE6A",
8
+ "base0C": "B4F9F8", "base0D": "2AC3DE", "base0E": "BB9AF7", "base0F": "F7768E"
9
+ }
package/lib/updater.js ADDED
@@ -0,0 +1,97 @@
1
+ const https = require("https");
2
+ const { execSync, spawn } = require("child_process");
3
+
4
+ // ANSI helpers (mirrors cli.js)
5
+ var isBasicTerm = process.env.TERM_PROGRAM === "Apple_Terminal";
6
+ var a = {
7
+ reset: "\x1b[0m",
8
+ bold: "\x1b[1m",
9
+ dim: "\x1b[2m",
10
+ clay: isBasicTerm ? "\x1b[34m" : "\x1b[38;2;88;87;252m", // #5857FC Indigo — active interaction
11
+ green: "\x1b[32m",
12
+ yellow: "\x1b[33m",
13
+ };
14
+
15
+ var sym = {
16
+ pointer: a.clay + "\u25C6" + a.reset,
17
+ done: a.green + "\u25C7" + a.reset,
18
+ bar: a.dim + "\u2502" + a.reset,
19
+ warn: a.yellow + "\u25B2" + a.reset,
20
+ };
21
+
22
+ function log(s) { console.log(" " + s); }
23
+
24
+ function fetchLatestVersion() {
25
+ return new Promise(function (resolve) {
26
+ var req = https.get("https://registry.npmjs.org/clay-server/latest", function (res) {
27
+ var data = "";
28
+ res.on("data", function (chunk) { data += chunk; });
29
+ res.on("end", function () {
30
+ try {
31
+ resolve(JSON.parse(data).version || null);
32
+ } catch (e) {
33
+ resolve(null);
34
+ }
35
+ });
36
+ });
37
+ req.on("error", function () { resolve(null); });
38
+ req.setTimeout(3000, function () {
39
+ req.destroy();
40
+ resolve(null);
41
+ });
42
+ });
43
+ }
44
+
45
+ function isNewer(latest, current) {
46
+ if (!latest || !current) return false;
47
+ var lp = latest.split(".").map(Number);
48
+ var cp = current.split(".").map(Number);
49
+ for (var i = 0; i < 3; i++) {
50
+ var l = lp[i] || 0;
51
+ var c = cp[i] || 0;
52
+ if (l > c) return true;
53
+ if (l < c) return false;
54
+ }
55
+ return false;
56
+ }
57
+
58
+ function performUpdate() {
59
+ try {
60
+ execSync("npm install -g clay-server@latest", { stdio: "pipe" });
61
+ return true;
62
+ } catch (e) {
63
+ return false;
64
+ }
65
+ }
66
+
67
+ function reExec() {
68
+ var args = process.argv.slice(1).concat("--no-update");
69
+ var child = spawn(process.execPath, args, { stdio: "inherit" });
70
+ child.on("exit", function (code) {
71
+ process.exit(code);
72
+ });
73
+ }
74
+
75
+ async function checkAndUpdate(currentVersion, skipUpdate) {
76
+ if (skipUpdate) return false;
77
+
78
+ var latest = await fetchLatestVersion();
79
+ if (!latest || !isNewer(latest, currentVersion)) return false;
80
+
81
+ log(sym.pointer + " " + a.bold + "Update available" + a.reset + " " + a.dim + currentVersion + " -> " + latest + a.reset);
82
+ log(sym.bar + " Installing...");
83
+
84
+ if (performUpdate()) {
85
+ log(sym.done + " Updated to " + a.green + latest + a.reset);
86
+ log("");
87
+ reExec();
88
+ return true;
89
+ }
90
+
91
+ log(sym.warn + " " + a.yellow + "Update failed" + a.reset + a.dim + " (permission denied?)" + a.reset);
92
+ log(sym.bar + " " + a.dim + "Run manually: npm install -g clay-server@latest" + a.reset);
93
+ log("");
94
+ return false;
95
+ }
96
+
97
+ module.exports = { checkAndUpdate, fetchLatestVersion, isNewer };
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "clay-server",
3
+ "version": "2.5.0",
4
+ "description": "Web UI for Claude Code. Any device. Push notifications.",
5
+ "bin": {
6
+ "clay-server": "./bin/cli.js"
7
+ },
8
+ "scripts": {
9
+ "dev": "node bin/cli.js --dev",
10
+ "prepack": "npm pkg delete bin.clay-dev",
11
+ "postpack": "npm pkg set bin.clay-dev=./bin/cli.js"
12
+ },
13
+ "files": [
14
+ "bin/",
15
+ "lib/"
16
+ ],
17
+ "keywords": [
18
+ "claude",
19
+ "claude-code",
20
+ "cli",
21
+ "mobile",
22
+ "remote",
23
+ "relay",
24
+ "web-ui",
25
+ "tailscale"
26
+ ],
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/chadbyte/claude-relay.git"
30
+ },
31
+ "bugs": {
32
+ "url": "https://github.com/chadbyte/claude-relay/issues"
33
+ },
34
+ "homepage": "https://github.com/chadbyte/claude-relay#readme",
35
+ "author": "Chad",
36
+ "dependencies": {
37
+ "@anthropic-ai/claude-agent-sdk": "^0.2.63",
38
+ "@lydell/node-pty": "^1.2.0-beta.3",
39
+ "qrcode-terminal": "^0.12.0",
40
+ "web-push": "^3.6.7",
41
+ "ws": "^8.18.0"
42
+ },
43
+ "license": "MIT",
44
+ "engines": {
45
+ "node": ">=20.0.0"
46
+ }
47
+ }