clay-server 2.20.1-beta.7 → 2.20.1-beta.9

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/lib/config.js CHANGED
@@ -35,7 +35,11 @@ function getRealHome() {
35
35
  var REAL_HOME = getRealHome();
36
36
 
37
37
  // v3: ~/.clay/ (v2 was ~/.claude-relay/, v1 was {cwd}/.claude-relay/)
38
- var CLAY_HOME = process.env.CLAY_HOME || path.join(REAL_HOME, ".clay");
38
+ // If CLAY_CONFIG is set (daemon mode), derive CLAY_HOME from it so that
39
+ // daemon.json, users.json, sessions/, etc. all live in the same directory.
40
+ var CLAY_HOME = process.env.CLAY_HOME
41
+ || (process.env.CLAY_CONFIG ? path.dirname(process.env.CLAY_CONFIG) : null)
42
+ || path.join(REAL_HOME, ".clay");
39
43
  var LEGACY_HOME = path.join(REAL_HOME, ".claude-relay");
40
44
 
41
45
  // Auto-migrate v2 -> v3: rename ~/.claude-relay/ to ~/.clay/ (once, before anything reads)
package/lib/daemon.js CHANGED
@@ -1263,37 +1263,49 @@ function startListening() {
1263
1263
  config.pid = process.pid;
1264
1264
  saveConfig(config);
1265
1265
 
1266
- // Auto-provision Linux accounts on startup if OS users mode is enabled
1266
+ // Auto-provision Linux accounts on startup if OS users mode is enabled.
1267
+ // Run in setTimeout so the event loop stays free for IPC during startup.
1267
1268
  if (config.osUsers) {
1268
- try { ensureProjectsDir(); } catch (e) {}
1269
- var provResult = provisionAllUsers(usersModule);
1270
- if (provResult.provisioned.length > 0) {
1271
- console.log("[daemon] Auto-provisioned " + provResult.provisioned.length + " Linux account(s) on startup");
1272
- }
1273
- if (provResult.errors.length > 0) {
1274
- console.error("[daemon] Failed to provision " + provResult.errors.length + " account(s)");
1275
- }
1276
- // Set up ACLs for all existing projects on startup
1277
- for (var pi = 0; pi < config.projects.length; pi++) {
1278
- var proj = config.projects[pi];
1279
- if (proj.ownerId) {
1280
- var ownerUser = usersModule.findUserById(proj.ownerId);
1281
- if (ownerUser && ownerUser.linuxUser) {
1282
- grantProjectAccess(proj.path, ownerUser.linuxUser);
1269
+ setTimeout(function () {
1270
+ try { ensureProjectsDir(); } catch (e) {}
1271
+ try {
1272
+ var provResult = provisionAllUsers(usersModule);
1273
+ if (provResult.provisioned.length > 0) {
1274
+ console.log("[daemon] Auto-provisioned " + provResult.provisioned.length + " Linux account(s) on startup");
1275
+ }
1276
+ if (provResult.errors.length > 0) {
1277
+ console.error("[daemon] Failed to provision " + provResult.errors.length + " account(s)");
1283
1278
  }
1279
+ } catch (provErr) {
1280
+ console.error("[daemon] Startup provisioning error:", provErr.message);
1284
1281
  }
1285
- if ((proj.visibility || "public") === "public") {
1286
- grantAllUsersAccess(proj.path, usersModule);
1287
- } else {
1288
- var projAllowed = proj.allowedUsers || [];
1289
- for (var ai = 0; ai < projAllowed.length; ai++) {
1290
- var allowedUser = usersModule.findUserById(projAllowed[ai]);
1291
- if (allowedUser && allowedUser.linuxUser) {
1292
- grantProjectAccess(proj.path, allowedUser.linuxUser);
1282
+ // Set up ACLs for all existing projects on startup
1283
+ for (var pi = 0; pi < config.projects.length; pi++) {
1284
+ var proj = config.projects[pi];
1285
+ try {
1286
+ if (proj.ownerId) {
1287
+ var ownerUser = usersModule.findUserById(proj.ownerId);
1288
+ if (ownerUser && ownerUser.linuxUser) {
1289
+ grantProjectAccess(proj.path, ownerUser.linuxUser);
1290
+ }
1293
1291
  }
1292
+ if ((proj.visibility || "public") === "public") {
1293
+ grantAllUsersAccess(proj.path, usersModule);
1294
+ } else {
1295
+ var projAllowed = proj.allowedUsers || [];
1296
+ for (var ai = 0; ai < projAllowed.length; ai++) {
1297
+ var allowedUser = usersModule.findUserById(projAllowed[ai]);
1298
+ if (allowedUser && allowedUser.linuxUser) {
1299
+ grantProjectAccess(proj.path, allowedUser.linuxUser);
1300
+ }
1301
+ }
1302
+ }
1303
+ } catch (aclErr) {
1304
+ console.error("[daemon] Startup ACL error for " + proj.path + ":", aclErr.message);
1294
1305
  }
1295
1306
  }
1296
- }
1307
+ console.log("[daemon] Startup OS users provisioning complete.");
1308
+ }, 100);
1297
1309
  }
1298
1310
 
1299
1311
  // Check for crash info from a previous crash and notify clients
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clay-server",
3
- "version": "2.20.1-beta.7",
3
+ "version": "2.20.1-beta.9",
4
4
  "description": "Web UI for Claude Code. Any device. Push notifications.",
5
5
  "bin": {
6
6
  "clay-server": "./bin/cli.js",