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 +1 -0
- package/lib/daemon.js +5 -8
- package/lib/public/app.js +52 -30
- package/package.json +1 -1
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
|
-
|
|
4180
|
-
|
|
4181
|
-
|
|
4182
|
-
|
|
4183
|
-
|
|
4184
|
-
|
|
4185
|
-
|
|
4186
|
-
|
|
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; },
|