clay-server 2.22.0-beta.3 → 2.22.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.
package/bin/cli.js CHANGED
@@ -1546,6 +1546,7 @@ async function forkDaemon(mode, keepAwake, extraProjects, addCwd, wantOsUsers) {
1546
1546
  builtinCert: hasBuiltinCert,
1547
1547
  mkcertDetected: mkcertDetected,
1548
1548
  debug: debugMode,
1549
+ headless: headlessMode,
1549
1550
  keepAwake: keepAwake,
1550
1551
  dangerouslySkipPermissions: dangerouslySkipPermissions,
1551
1552
  osUsers: wantOsUsers || osUsersMode,
package/lib/daemon.js CHANGED
@@ -98,14 +98,6 @@ if (config.tls) {
98
98
  }
99
99
 
100
100
  var caRoot = null;
101
- try {
102
- var { execSync } = require("child_process");
103
- caRoot = path.join(
104
- execSync("mkcert -CAROOT", { encoding: "utf8", stdio: "pipe" }).trim(),
105
- "rootCA.pem"
106
- );
107
- if (!fs.existsSync(caRoot)) caRoot = null;
108
- } catch (e) {}
109
101
 
110
102
  // --- Resolve LAN IP for share URL ---
111
103
  var os2 = require("os");
@@ -655,6 +647,7 @@ var relay = createServer({
655
647
  port: config.port,
656
648
  tls: !!tlsOptions,
657
649
  debug: !!config.debug,
650
+ headless: !!config.headless,
658
651
  keepAwake: !!config.keepAwake,
659
652
  autoContinueOnRateLimit: !!config.autoContinueOnRateLimit,
660
653
  pinEnabled: !!config.pinHash,
@@ -1182,6 +1175,10 @@ var ipc = createIPCServer(socketPath(), function (msg) {
1182
1175
  return { ok: true };
1183
1176
 
1184
1177
  case "update": {
1178
+ if (config.headless) {
1179
+ console.log("[daemon] Update & restart requested via IPC — blocked (headless mode)");
1180
+ return { ok: false, error: "Auto-update is disabled in headless mode" };
1181
+ }
1185
1182
  console.log("[daemon] Update & restart requested via IPC");
1186
1183
 
1187
1184
  // Dev mode (config.debug): just exit with code 120, cli.js dev watcher respawns daemon
package/lib/public/app.js CHANGED
@@ -4027,6 +4027,48 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
4027
4027
  if (savedMainWs === this) return;
4028
4028
  };
4029
4029
 
4030
+ function showUpdateAvailable(msg) {
4031
+ var updatePillWrap = $("update-pill-wrap");
4032
+ var updateVersion = $("update-version");
4033
+ if (updatePillWrap && updateVersion && msg.version) {
4034
+ updateVersion.textContent = "v" + msg.version;
4035
+ updatePillWrap.classList.remove("hidden");
4036
+ var updPill = $("update-pill");
4037
+ var updResetBtn = $("update-now");
4038
+ if (isHeadlessMode) {
4039
+ // In headless mode, hide auto-update button and show manual guide only
4040
+ if (updPill) updPill.innerHTML = '<i data-lucide="arrow-up-circle"></i> <span id="update-version">v' + msg.version + '</span> available. Update manually';
4041
+ if (updResetBtn) updResetBtn.style.display = "none";
4042
+ } else {
4043
+ // Reset button state (may be stuck on "Updating..." after restart)
4044
+ if (updResetBtn) {
4045
+ updResetBtn.innerHTML = '<i data-lucide="download"></i> Update now';
4046
+ updResetBtn.disabled = false;
4047
+ updResetBtn.style.display = "";
4048
+ }
4049
+ }
4050
+ // Update manual command based on version (beta vs stable)
4051
+ var updManualCmd = $("update-manual-cmd");
4052
+ if (updManualCmd) {
4053
+ var updTag = msg.version.indexOf("-beta") !== -1 ? "beta" : "latest";
4054
+ updManualCmd.textContent = "npx clay-server@" + updTag;
4055
+ }
4056
+ refreshIcons();
4057
+ }
4058
+ // Update the settings check-for-updates button
4059
+ var settingsUpdBtn = $("settings-update-check");
4060
+ if (settingsUpdBtn && msg.version) {
4061
+ settingsUpdBtn.innerHTML = "";
4062
+ var ic = document.createElement("i");
4063
+ ic.setAttribute("data-lucide", "arrow-up-circle");
4064
+ settingsUpdBtn.appendChild(ic);
4065
+ settingsUpdBtn.appendChild(document.createTextNode(" Update available (v" + msg.version + ")"));
4066
+ settingsUpdBtn.classList.add("settings-btn-update-available");
4067
+ settingsUpdBtn.disabled = false;
4068
+ refreshIcons();
4069
+ }
4070
+ }
4071
+
4030
4072
  ws.onmessage = function (event) {
4031
4073
  // If this WS is stashed while in mate DM, only allow skill_installed through
4032
4074
  if (savedMainWs === this) {
@@ -4176,36 +4218,14 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
4176
4218
  break;
4177
4219
 
4178
4220
  case "update_available":
4179
- var updatePillWrap = $("update-pill-wrap");
4180
- var updateVersion = $("update-version");
4181
- if (updatePillWrap && updateVersion && msg.version) {
4182
- updateVersion.textContent = "v" + msg.version;
4183
- updatePillWrap.classList.remove("hidden");
4184
- // Reset button state (may be stuck on "Updating..." after restart)
4185
- var updResetBtn = $("update-now");
4186
- if (updResetBtn) {
4187
- updResetBtn.innerHTML = '<i data-lucide="download"></i> Update now';
4188
- updResetBtn.disabled = false;
4189
- }
4190
- // Update manual command based on version (beta vs stable)
4191
- var updManualCmd = $("update-manual-cmd");
4192
- if (updManualCmd) {
4193
- var updTag = msg.version.indexOf("-beta") !== -1 ? "beta" : "latest";
4194
- updManualCmd.textContent = "npx clay-server@" + updTag;
4195
- }
4196
- refreshIcons();
4197
- }
4198
- // Update the settings check-for-updates button
4199
- var settingsUpdBtn = $("settings-update-check");
4200
- if (settingsUpdBtn && msg.version) {
4201
- settingsUpdBtn.innerHTML = "";
4202
- var ic = document.createElement("i");
4203
- ic.setAttribute("data-lucide", "arrow-up-circle");
4204
- settingsUpdBtn.appendChild(ic);
4205
- settingsUpdBtn.appendChild(document.createTextNode(" Update available (v" + msg.version + ")"));
4206
- settingsUpdBtn.classList.add("settings-btn-update-available");
4207
- settingsUpdBtn.disabled = false;
4208
- refreshIcons();
4221
+ // In multi-user mode, only show update UI to admins
4222
+ if (isMultiUserMode) {
4223
+ checkAdminAccess().then(function (isAdmin) {
4224
+ if (!isAdmin) return;
4225
+ showUpdateAvailable(msg);
4226
+ });
4227
+ } else {
4228
+ showUpdateAvailable(msg);
4209
4229
  }
4210
4230
  break;
4211
4231
 
@@ -5150,6 +5170,7 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
5150
5170
  break;
5151
5171
 
5152
5172
  case "daemon_config":
5173
+ if (msg.config && msg.config.headless) isHeadlessMode = true;
5153
5174
  updateDaemonConfig(msg.config);
5154
5175
  break;
5155
5176
 
@@ -5637,6 +5658,7 @@ import { initDebate, handleDebateStarted, handleDebateResumed, handleDebateTurn,
5637
5658
 
5638
5659
  // --- Admin (multi-user mode) ---
5639
5660
  var isMultiUserMode = false;
5661
+ var isHeadlessMode = false;
5640
5662
  var myUserId = null;
5641
5663
  initAdmin({
5642
5664
  get projectList() { return cachedProjects; },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clay-server",
3
- "version": "2.22.0-beta.3",
3
+ "version": "2.22.0",
4
4
  "description": "Self-hosted Claude Code in your browser. Multi-session, multi-user, push notifications.",
5
5
  "bin": {
6
6
  "clay-server": "./bin/cli.js",