@boxes-dev/dvb 1.0.576 → 1.0.579

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.
@@ -24,14 +24,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  ));
25
25
 
26
26
  // src/bootstrap/runtimeManager.ts
27
- var import_node_child_process = require("node:child_process");
28
- var import_node_crypto2 = require("node:crypto");
27
+ var import_node_child_process2 = require("node:child_process");
28
+ var import_node_crypto3 = require("node:crypto");
29
29
  var import_node_module = require("node:module");
30
- var import_promises2 = __toESM(require("node:fs/promises"), 1);
31
- var import_node_fs7 = require("node:fs");
30
+ var import_promises3 = __toESM(require("node:fs/promises"), 1);
31
+ var import_node_fs8 = require("node:fs");
32
32
  var import_node_http = __toESM(require("node:http"), 1);
33
- var import_node_os2 = __toESM(require("node:os"), 1);
34
- var import_node_path11 = __toESM(require("node:path"), 1);
33
+ var import_node_os3 = __toESM(require("node:os"), 1);
34
+ var import_node_path12 = __toESM(require("node:path"), 1);
35
35
 
36
36
  // ../../node_modules/tar/dist/esm/index.min.js
37
37
  var import_events = __toESM(require("events"), 1);
@@ -3042,6 +3042,191 @@ var isSemverGreater = (candidateVersion, currentVersion) => {
3042
3042
  return comparison !== null && comparison > 0;
3043
3043
  };
3044
3044
 
3045
+ // src/bootstrap/standaloneManager.ts
3046
+ var import_node_child_process = require("node:child_process");
3047
+ var import_node_crypto2 = require("node:crypto");
3048
+ var import_node_fs7 = require("node:fs");
3049
+ var import_promises2 = __toESM(require("node:fs/promises"), 1);
3050
+ var import_node_os2 = __toESM(require("node:os"), 1);
3051
+ var import_node_path11 = __toESM(require("node:path"), 1);
3052
+ var DEFAULT_MANIFEST_URL = "https://deploy.boxes.dev/cli/latest.json";
3053
+ var resolveManifestUrl = () => {
3054
+ if ("https://deploy.boxes.dev/cli/latest.json") {
3055
+ return "https://deploy.boxes.dev/cli/latest.json";
3056
+ }
3057
+ return DEFAULT_MANIFEST_URL;
3058
+ };
3059
+ var isStandaloneMode = () => {
3060
+ const versionJsonPath = import_node_path11.default.join(
3061
+ import_node_path11.default.dirname(process.execPath),
3062
+ "version.json"
3063
+ );
3064
+ return (0, import_node_fs7.existsSync)(versionJsonPath);
3065
+ };
3066
+ var readLocalVersionMeta = () => {
3067
+ const versionJsonPath = import_node_path11.default.join(
3068
+ import_node_path11.default.dirname(process.execPath),
3069
+ "version.json"
3070
+ );
3071
+ if (!(0, import_node_fs7.existsSync)(versionJsonPath)) return null;
3072
+ try {
3073
+ return JSON.parse((0, import_node_fs7.readFileSync)(versionJsonPath, "utf-8"));
3074
+ } catch {
3075
+ return null;
3076
+ }
3077
+ };
3078
+ var resolveStandaloneDir = (homeDir) => import_node_path11.default.join(resolveDevboxDir(homeDir), "standalone");
3079
+ var resolveCurrentLink = (homeDir) => import_node_path11.default.join(resolveStandaloneDir(homeDir), "current");
3080
+ var checkStandaloneUpdate = async (homeDir = import_node_os2.default.homedir()) => {
3081
+ const local = readLocalVersionMeta();
3082
+ if (!local) return null;
3083
+ const manifestUrl = resolveManifestUrl();
3084
+ const res = await fetch(manifestUrl, {
3085
+ signal: AbortSignal.timeout(1e4)
3086
+ });
3087
+ if (!res.ok) {
3088
+ throw new Error(
3089
+ `Failed to fetch standalone manifest: ${res.status} ${res.statusText}`
3090
+ );
3091
+ }
3092
+ const manifest = await res.json();
3093
+ if (manifest.version === local.version) {
3094
+ return null;
3095
+ }
3096
+ const platformKey = `${local.platform}-${local.arch}`;
3097
+ const archive = manifest.archives?.[platformKey];
3098
+ if (!archive) {
3099
+ throw new Error(
3100
+ `No standalone archive for ${platformKey} in manifest v${manifest.version}`
3101
+ );
3102
+ }
3103
+ return {
3104
+ manifest,
3105
+ archive,
3106
+ currentVersion: local.version
3107
+ };
3108
+ };
3109
+ var downloadStandaloneUpdate = async (manifest, archive, homeDir = import_node_os2.default.homedir()) => {
3110
+ const standaloneDir = resolveStandaloneDir(homeDir);
3111
+ await import_promises2.default.mkdir(standaloneDir, { recursive: true });
3112
+ const local = readLocalVersionMeta();
3113
+ const platformKey = local ? `${local.platform}-${local.arch}` : `${process.platform}-${process.arch}`;
3114
+ const version = manifest.version;
3115
+ const versionDir = import_node_path11.default.join(standaloneDir, `${version}-${platformKey}`);
3116
+ const currentLink = resolveCurrentLink(homeDir);
3117
+ if ((0, import_node_fs7.existsSync)(import_node_path11.default.join(versionDir, "dvb"))) {
3118
+ await atomicSymlink(standaloneDir, currentLink, versionDir);
3119
+ return;
3120
+ }
3121
+ const tmpSuffix = `${version}-${platformKey}-${Date.now()}`;
3122
+ const tmpDir = import_node_path11.default.join(standaloneDir, `.tmp-${tmpSuffix}`);
3123
+ const tarballPath = import_node_path11.default.join(standaloneDir, `.download-${tmpSuffix}.tar.gz`);
3124
+ try {
3125
+ const res = await fetch(archive.url, {
3126
+ signal: AbortSignal.timeout(5 * 60 * 1e3)
3127
+ // 5 minute timeout for large download
3128
+ });
3129
+ if (!res.ok) {
3130
+ throw new Error(`Failed to download ${archive.url}: ${res.status}`);
3131
+ }
3132
+ const body = await res.arrayBuffer();
3133
+ (0, import_node_fs7.writeFileSync)(tarballPath, Buffer.from(body));
3134
+ const hash = (0, import_node_crypto2.createHash)("sha256");
3135
+ hash.update((0, import_node_fs7.readFileSync)(tarballPath));
3136
+ const actualHash = hash.digest("hex");
3137
+ if (actualHash !== archive.sha256) {
3138
+ throw new Error(
3139
+ `SHA256 mismatch: expected ${archive.sha256}, got ${actualHash}`
3140
+ );
3141
+ }
3142
+ await import_promises2.default.mkdir(tmpDir, { recursive: true });
3143
+ (0, import_node_child_process.execFileSync)("tar", [
3144
+ "xzf",
3145
+ tarballPath,
3146
+ "-C",
3147
+ tmpDir,
3148
+ "--strip-components=1"
3149
+ ]);
3150
+ try {
3151
+ (0, import_node_child_process.execFileSync)(import_node_path11.default.join(tmpDir, "dvb"), ["--help"], {
3152
+ stdio: "pipe",
3153
+ timeout: 15e3
3154
+ });
3155
+ } catch (err) {
3156
+ const exitErr = err;
3157
+ throw new Error(
3158
+ `Validation failed: dvb --help exited with code ${exitErr.status}`
3159
+ );
3160
+ }
3161
+ if ((0, import_node_fs7.existsSync)(versionDir)) {
3162
+ await import_promises2.default.rm(versionDir, { recursive: true });
3163
+ }
3164
+ await import_promises2.default.rename(tmpDir, versionDir);
3165
+ await atomicSymlink(standaloneDir, currentLink, versionDir);
3166
+ await pruneOldVersions(standaloneDir, version, platformKey);
3167
+ } finally {
3168
+ try {
3169
+ await import_promises2.default.rm(tmpDir, { recursive: true, force: true });
3170
+ } catch {
3171
+ }
3172
+ try {
3173
+ await import_promises2.default.unlink(tarballPath);
3174
+ } catch {
3175
+ }
3176
+ }
3177
+ };
3178
+ var updateStandaloneOnce = async (homeDir = import_node_os2.default.homedir()) => {
3179
+ const check = await checkStandaloneUpdate(homeDir);
3180
+ if (!check) {
3181
+ const local = readLocalVersionMeta();
3182
+ return {
3183
+ changed: false,
3184
+ previousVersion: local?.version ?? null,
3185
+ currentVersion: local?.version ?? "unknown"
3186
+ };
3187
+ }
3188
+ await downloadStandaloneUpdate(check.manifest, check.archive, homeDir);
3189
+ return {
3190
+ changed: true,
3191
+ previousVersion: check.currentVersion,
3192
+ currentVersion: check.manifest.version
3193
+ };
3194
+ };
3195
+ var atomicSymlink = async (parentDir, linkPath, target) => {
3196
+ const relTarget = import_node_path11.default.relative(parentDir, target);
3197
+ const tmpLink = import_node_path11.default.join(parentDir, `.current-tmp-${Date.now()}`);
3198
+ try {
3199
+ await import_promises2.default.symlink(relTarget, tmpLink);
3200
+ await import_promises2.default.rename(tmpLink, linkPath);
3201
+ } catch {
3202
+ try {
3203
+ await import_promises2.default.unlink(tmpLink);
3204
+ } catch {
3205
+ }
3206
+ try {
3207
+ await import_promises2.default.unlink(linkPath);
3208
+ } catch {
3209
+ }
3210
+ await import_promises2.default.symlink(relTarget, linkPath);
3211
+ }
3212
+ };
3213
+ var pruneOldVersions = async (standaloneDir, currentVersion, platformKey) => {
3214
+ try {
3215
+ const entries = await import_promises2.default.readdir(standaloneDir, { withFileTypes: true });
3216
+ const versionDirs = entries.filter(
3217
+ (e) => e.isDirectory() && !e.name.startsWith(".") && e.name !== "current" && e.name.endsWith(`-${platformKey}`)
3218
+ ).map((e) => e.name).sort().reverse();
3219
+ const toRemove = versionDirs.slice(2);
3220
+ for (const dir of toRemove) {
3221
+ await import_promises2.default.rm(import_node_path11.default.join(standaloneDir, dir), {
3222
+ recursive: true,
3223
+ force: true
3224
+ });
3225
+ }
3226
+ } catch {
3227
+ }
3228
+ };
3229
+
3045
3230
  // src/bootstrap/runtimeManager.ts
3046
3231
  var MIN_NODE_MAJOR = 22;
3047
3232
  var RUNTIME_PACKAGE_NAME = "@boxes-dev/dvb-runtime";
@@ -3070,10 +3255,10 @@ var resolveBasePath = () => {
3070
3255
  return __filename;
3071
3256
  }
3072
3257
  const argv1 = typeof process.argv[1] === "string" ? process.argv[1] : "";
3073
- return argv1 || import_node_path11.default.join(process.cwd(), "dvb");
3258
+ return argv1 || import_node_path12.default.join(process.cwd(), "dvb");
3074
3259
  };
3075
3260
  var readJsonFile = async (filePath) => {
3076
- const raw = await import_promises2.default.readFile(filePath, "utf8");
3261
+ const raw = await import_promises3.default.readFile(filePath, "utf8");
3077
3262
  return JSON.parse(raw);
3078
3263
  };
3079
3264
  var readJsonFileIfExists = async (filePath) => {
@@ -3088,14 +3273,14 @@ var readJsonFileIfExists = async (filePath) => {
3088
3273
  };
3089
3274
  var writeJsonFileAtomic = async (filePath, value) => {
3090
3275
  const tempPath = `${filePath}.tmp-${process.pid}-${Date.now()}`;
3091
- await import_promises2.default.mkdir(import_node_path11.default.dirname(filePath), { recursive: true, mode: 448 });
3092
- await import_promises2.default.writeFile(tempPath, JSON.stringify(value, null, 2), "utf8");
3093
- await import_promises2.default.rename(tempPath, filePath);
3276
+ await import_promises3.default.mkdir(import_node_path12.default.dirname(filePath), { recursive: true, mode: 448 });
3277
+ await import_promises3.default.writeFile(tempPath, JSON.stringify(value, null, 2), "utf8");
3278
+ await import_promises3.default.rename(tempPath, filePath);
3094
3279
  };
3095
3280
  var readStageVersion = async (runtimeDir) => {
3096
3281
  try {
3097
3282
  const manifest = await readJsonFile(
3098
- import_node_path11.default.join(runtimeDir, "package.json")
3283
+ import_node_path12.default.join(runtimeDir, "package.json")
3099
3284
  );
3100
3285
  if (typeof manifest.version !== "string") return null;
3101
3286
  const version = manifest.version.trim();
@@ -3104,25 +3289,25 @@ var readStageVersion = async (runtimeDir) => {
3104
3289
  return null;
3105
3290
  }
3106
3291
  };
3107
- var resolveRuntimeBinPath = (runtimeDir, kind) => import_node_path11.default.join(runtimeDir, "dist", "bin", `${kind}.cjs`);
3292
+ var resolveRuntimeBinPath = (runtimeDir, kind) => import_node_path12.default.join(runtimeDir, "dist", "bin", `${kind}.cjs`);
3108
3293
  var readLinkedRuntimeVersion = async (linkPath) => {
3109
3294
  try {
3110
- const runtimeDir = await import_promises2.default.realpath(linkPath);
3111
- const version = import_node_path11.default.basename(runtimeDir).trim();
3295
+ const runtimeDir = await import_promises3.default.realpath(linkPath);
3296
+ const version = import_node_path12.default.basename(runtimeDir).trim();
3112
3297
  return version.length > 0 ? version : null;
3113
3298
  } catch {
3114
3299
  return null;
3115
3300
  }
3116
3301
  };
3117
- var readCurrentRuntime = async (homeDir = import_node_os2.default.homedir()) => {
3302
+ var readCurrentRuntime = async (homeDir = import_node_os3.default.homedir()) => {
3118
3303
  const currentLink = resolveCurrentRuntimeLink(homeDir);
3119
3304
  try {
3120
- const runtimeDir = await import_promises2.default.realpath(currentLink);
3305
+ const runtimeDir = await import_promises3.default.realpath(currentLink);
3121
3306
  const version = await readStageVersion(runtimeDir);
3122
3307
  if (!version) return null;
3123
3308
  const dvbBin = resolveRuntimeBinPath(runtimeDir, "dvb");
3124
3309
  const dvbdBin = resolveRuntimeBinPath(runtimeDir, "dvbd");
3125
- if (!(0, import_node_fs7.existsSync)(dvbBin) || !(0, import_node_fs7.existsSync)(dvbdBin)) {
3310
+ if (!(0, import_node_fs8.existsSync)(dvbBin) || !(0, import_node_fs8.existsSync)(dvbdBin)) {
3126
3311
  return null;
3127
3312
  }
3128
3313
  return { version, runtimeDir };
@@ -3130,9 +3315,9 @@ var readCurrentRuntime = async (homeDir = import_node_os2.default.homedir()) =>
3130
3315
  return null;
3131
3316
  }
3132
3317
  };
3133
- var listLiveRuntimeVersions = async (homeDir = import_node_os2.default.homedir()) => {
3318
+ var listLiveRuntimeVersions = async (homeDir = import_node_os3.default.homedir()) => {
3134
3319
  const releasesDir = resolveRuntimeReleasesDir(homeDir);
3135
- const ps2 = (0, import_node_child_process.spawnSync)("ps", ["eww", "-Ao", "command="], {
3320
+ const ps2 = (0, import_node_child_process2.spawnSync)("ps", ["eww", "-Ao", "command="], {
3136
3321
  encoding: "utf8"
3137
3322
  });
3138
3323
  if (ps2.error || ps2.status !== 0 || typeof ps2.stdout !== "string") {
@@ -3154,7 +3339,7 @@ var listLiveRuntimeVersions = async (homeDir = import_node_os2.default.homedir()
3154
3339
  }
3155
3340
  return [...versions];
3156
3341
  };
3157
- var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) => {
3342
+ var pruneRuntimeReleases = async (homeDir = import_node_os3.default.homedir()) => {
3158
3343
  const releasesDir = resolveRuntimeReleasesDir(homeDir);
3159
3344
  const keep = /* @__PURE__ */ new Set();
3160
3345
  const current = await readCurrentRuntime(homeDir);
@@ -3175,7 +3360,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
3175
3360
  }
3176
3361
  }
3177
3362
  try {
3178
- const entries = await import_promises2.default.readdir(releasesDir, { withFileTypes: true });
3363
+ const entries = await import_promises3.default.readdir(releasesDir, { withFileTypes: true });
3179
3364
  for (const entry of entries) {
3180
3365
  if (!entry.isDirectory()) {
3181
3366
  continue;
@@ -3186,7 +3371,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
3186
3371
  if (keep.has(entry.name)) {
3187
3372
  continue;
3188
3373
  }
3189
- await import_promises2.default.rm(import_node_path11.default.join(releasesDir, entry.name), {
3374
+ await import_promises3.default.rm(import_node_path12.default.join(releasesDir, entry.name), {
3190
3375
  recursive: true,
3191
3376
  force: true
3192
3377
  });
@@ -3201,7 +3386,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
3201
3386
  var resolveBundledRuntimeRoot = () => {
3202
3387
  const require2 = (0, import_node_module.createRequire)(resolveBasePath());
3203
3388
  const manifestPath = require2.resolve(`${RUNTIME_PACKAGE_NAME}/package.json`);
3204
- return import_node_path11.default.dirname(manifestPath);
3389
+ return import_node_path12.default.dirname(manifestPath);
3205
3390
  };
3206
3391
  var readBundledRuntime = async () => {
3207
3392
  const runtimeDir = resolveBundledRuntimeRoot();
@@ -3211,20 +3396,20 @@ var readBundledRuntime = async () => {
3211
3396
  }
3212
3397
  return { version, runtimeDir };
3213
3398
  };
3214
- var ensureReleasesDir = async (homeDir = import_node_os2.default.homedir()) => {
3399
+ var ensureReleasesDir = async (homeDir = import_node_os3.default.homedir()) => {
3215
3400
  const releasesDir = resolveRuntimeReleasesDir(homeDir);
3216
- await import_promises2.default.mkdir(releasesDir, { recursive: true, mode: 448 });
3401
+ await import_promises3.default.mkdir(releasesDir, { recursive: true, mode: 448 });
3217
3402
  try {
3218
- await import_promises2.default.chmod(releasesDir, 448);
3403
+ await import_promises3.default.chmod(releasesDir, 448);
3219
3404
  } catch {
3220
3405
  }
3221
3406
  return releasesDir;
3222
3407
  };
3223
- var ensureUpdaterDir = async (homeDir = import_node_os2.default.homedir()) => {
3408
+ var ensureUpdaterDir = async (homeDir = import_node_os3.default.homedir()) => {
3224
3409
  const updaterDir = resolveUpdaterDir(homeDir);
3225
- await import_promises2.default.mkdir(updaterDir, { recursive: true, mode: 448 });
3410
+ await import_promises3.default.mkdir(updaterDir, { recursive: true, mode: 448 });
3226
3411
  try {
3227
- await import_promises2.default.chmod(updaterDir, 448);
3412
+ await import_promises3.default.chmod(updaterDir, 448);
3228
3413
  } catch {
3229
3414
  }
3230
3415
  return updaterDir;
@@ -3246,23 +3431,23 @@ var isProcessAlive = (pid) => {
3246
3431
  return code === "EPERM";
3247
3432
  }
3248
3433
  };
3249
- var createStageDir = async (version, homeDir = import_node_os2.default.homedir()) => {
3434
+ var createStageDir = async (version, homeDir = import_node_os3.default.homedir()) => {
3250
3435
  const releasesDir = await ensureReleasesDir(homeDir);
3251
- return await import_promises2.default.mkdtemp(
3252
- import_node_path11.default.join(
3436
+ return await import_promises3.default.mkdtemp(
3437
+ import_node_path12.default.join(
3253
3438
  releasesDir,
3254
3439
  `.tmp-${version.replace(/[^a-zA-Z0-9._-]+/g, "-")}-`
3255
3440
  )
3256
3441
  );
3257
3442
  };
3258
3443
  var copyBundledRuntimeToStage = async (bundled, stageDir) => {
3259
- await import_promises2.default.copyFile(
3260
- import_node_path11.default.join(bundled.runtimeDir, "package.json"),
3261
- import_node_path11.default.join(stageDir, "package.json")
3444
+ await import_promises3.default.copyFile(
3445
+ import_node_path12.default.join(bundled.runtimeDir, "package.json"),
3446
+ import_node_path12.default.join(stageDir, "package.json")
3262
3447
  );
3263
- await import_promises2.default.cp(
3264
- import_node_path11.default.join(bundled.runtimeDir, "dist"),
3265
- import_node_path11.default.join(stageDir, "dist"),
3448
+ await import_promises3.default.cp(
3449
+ import_node_path12.default.join(bundled.runtimeDir, "dist"),
3450
+ import_node_path12.default.join(stageDir, "dist"),
3266
3451
  {
3267
3452
  recursive: true
3268
3453
  }
@@ -3299,7 +3484,7 @@ var downloadTarball = async (url, filePath) => {
3299
3484
  throw new Error(`Runtime tarball download failed with ${response.status}.`);
3300
3485
  }
3301
3486
  const buffer = Buffer.from(await response.arrayBuffer());
3302
- await import_promises2.default.writeFile(filePath, buffer);
3487
+ await import_promises3.default.writeFile(filePath, buffer);
3303
3488
  };
3304
3489
  var extractRuntimeTarballToStage = async (tarballPath, stageDir) => {
3305
3490
  await lo({
@@ -3444,21 +3629,21 @@ var terminateChild = async (child) => {
3444
3629
  });
3445
3630
  };
3446
3631
  var validateRuntimeStage = async (stageDir, expectedVersion) => {
3447
- const socketDir = import_node_path11.default.join(
3632
+ const socketDir = import_node_path12.default.join(
3448
3633
  "/tmp",
3449
- `dvb-runtime-validate-${process.pid}-${(0, import_node_crypto2.randomUUID)().slice(0, 8)}`
3634
+ `dvb-runtime-validate-${process.pid}-${(0, import_node_crypto3.randomUUID)().slice(0, 8)}`
3450
3635
  );
3451
- const socketPath = import_node_path11.default.join(socketDir, "devboxd.sock");
3636
+ const socketPath = import_node_path12.default.join(socketDir, "devboxd.sock");
3452
3637
  const daemonBinPath = resolveRuntimeBinPath(stageDir, "dvbd");
3453
- if (!(0, import_node_fs7.existsSync)(daemonBinPath)) {
3638
+ if (!(0, import_node_fs8.existsSync)(daemonBinPath)) {
3454
3639
  throw new Error(`Runtime stage is missing ${daemonBinPath}.`);
3455
3640
  }
3456
3641
  const cliBinPath = resolveRuntimeBinPath(stageDir, "dvb");
3457
- if (!(0, import_node_fs7.existsSync)(cliBinPath)) {
3642
+ if (!(0, import_node_fs8.existsSync)(cliBinPath)) {
3458
3643
  throw new Error(`Runtime stage is missing ${cliBinPath}.`);
3459
3644
  }
3460
- await import_promises2.default.mkdir(socketDir, { recursive: true, mode: 448 });
3461
- const child = (0, import_node_child_process.spawn)(process.execPath, [daemonBinPath], {
3645
+ await import_promises3.default.mkdir(socketDir, { recursive: true, mode: 448 });
3646
+ const child = (0, import_node_child_process2.spawn)(process.execPath, [daemonBinPath], {
3462
3647
  env: {
3463
3648
  ...process.env,
3464
3649
  DEVBOX_SOCKET_PATH: socketPath
@@ -3479,9 +3664,9 @@ var validateRuntimeStage = async (stageDir, expectedVersion) => {
3479
3664
  `Runtime stage reported version ${validated.version}; expected ${expectedVersion}.`
3480
3665
  );
3481
3666
  }
3482
- const cliHomeDir = import_node_path11.default.join(socketDir, "home");
3483
- await import_promises2.default.mkdir(cliHomeDir, { recursive: true, mode: 448 });
3484
- const cliChild = (0, import_node_child_process.spawn)(process.execPath, [cliBinPath, "--help"], {
3667
+ const cliHomeDir = import_node_path12.default.join(socketDir, "home");
3668
+ await import_promises3.default.mkdir(cliHomeDir, { recursive: true, mode: 448 });
3669
+ const cliChild = (0, import_node_child_process2.spawn)(process.execPath, [cliBinPath, "--help"], {
3485
3670
  env: {
3486
3671
  ...process.env,
3487
3672
  HOME: cliHomeDir
@@ -3502,22 +3687,22 @@ var validateRuntimeStage = async (stageDir, expectedVersion) => {
3502
3687
  }
3503
3688
  } finally {
3504
3689
  await terminateChild(child);
3505
- await import_promises2.default.rm(socketDir, { recursive: true, force: true });
3690
+ await import_promises3.default.rm(socketDir, { recursive: true, force: true });
3506
3691
  }
3507
3692
  };
3508
3693
  var writeSymlinkAtomic = async (linkPath, target) => {
3509
3694
  const tempPath = `${linkPath}.tmp-${process.pid}-${Date.now()}`;
3510
- await import_promises2.default.symlink(target, tempPath);
3695
+ await import_promises3.default.symlink(target, tempPath);
3511
3696
  try {
3512
- await import_promises2.default.rename(tempPath, linkPath);
3697
+ await import_promises3.default.rename(tempPath, linkPath);
3513
3698
  } catch (error) {
3514
- await import_promises2.default.rm(linkPath, { recursive: true, force: true });
3515
- await import_promises2.default.rename(tempPath, linkPath);
3699
+ await import_promises3.default.rm(linkPath, { recursive: true, force: true });
3700
+ await import_promises3.default.rename(tempPath, linkPath);
3516
3701
  if (error instanceof Error) {
3517
3702
  }
3518
3703
  }
3519
3704
  };
3520
- var writeUpdaterHeartbeat = async (homeDir = import_node_os2.default.homedir()) => {
3705
+ var writeUpdaterHeartbeat = async (homeDir = import_node_os3.default.homedir()) => {
3521
3706
  const current = await readJsonFileIfExists(
3522
3707
  resolveUpdaterDaemonPath(homeDir)
3523
3708
  );
@@ -3529,7 +3714,7 @@ var writeUpdaterHeartbeat = async (homeDir = import_node_os2.default.homedir())
3529
3714
  heartbeatAt: (/* @__PURE__ */ new Date()).toISOString()
3530
3715
  });
3531
3716
  };
3532
- var claimUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) => {
3717
+ var claimUpdaterDaemon = async (homeDir = import_node_os3.default.homedir()) => {
3533
3718
  await ensureUpdaterDir(homeDir);
3534
3719
  const daemonPath = resolveUpdaterDaemonPath(homeDir);
3535
3720
  const record = {
@@ -3540,7 +3725,7 @@ var claimUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) =>
3540
3725
  };
3541
3726
  for (let attempt = 0; attempt < 2; attempt += 1) {
3542
3727
  try {
3543
- await import_promises2.default.writeFile(daemonPath, JSON.stringify(record, null, 2), {
3728
+ await import_promises3.default.writeFile(daemonPath, JSON.stringify(record, null, 2), {
3544
3729
  encoding: "utf8",
3545
3730
  flag: "wx"
3546
3731
  });
@@ -3554,20 +3739,20 @@ var claimUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) =>
3554
3739
  if (existing && isProcessAlive(existing.pid)) {
3555
3740
  return false;
3556
3741
  }
3557
- await import_promises2.default.rm(daemonPath, { force: true });
3742
+ await import_promises3.default.rm(daemonPath, { force: true });
3558
3743
  }
3559
3744
  }
3560
3745
  return false;
3561
3746
  };
3562
- var releaseUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) => {
3747
+ var releaseUpdaterDaemon = async (homeDir = import_node_os3.default.homedir()) => {
3563
3748
  const daemonPath = resolveUpdaterDaemonPath(homeDir);
3564
3749
  const current = await readJsonFileIfExists(daemonPath);
3565
3750
  if (!current || current.pid !== process.pid) {
3566
3751
  return;
3567
3752
  }
3568
- await import_promises2.default.rm(daemonPath, { force: true });
3753
+ await import_promises3.default.rm(daemonPath, { force: true });
3569
3754
  };
3570
- var writeUpdaterState = async (state, homeDir = import_node_os2.default.homedir()) => {
3755
+ var writeUpdaterState = async (state, homeDir = import_node_os3.default.homedir()) => {
3571
3756
  await ensureUpdaterDir(homeDir);
3572
3757
  await writeJsonFileAtomic(resolveUpdaterStatePath(homeDir), state);
3573
3758
  };
@@ -3583,12 +3768,12 @@ var waitWithShutdown = async (shutdown, timeoutMs) => {
3583
3768
  await new Promise((resolve) => setTimeout(resolve, delay));
3584
3769
  }
3585
3770
  };
3586
- var promoteRuntimeStage = async (stageDir, version, homeDir = import_node_os2.default.homedir()) => {
3771
+ var promoteRuntimeStage = async (stageDir, version, homeDir = import_node_os3.default.homedir()) => {
3587
3772
  const previous = await readCurrentRuntime(homeDir);
3588
3773
  const versionDir = resolveRuntimeVersionDir(version, homeDir);
3589
3774
  if (stageDir !== versionDir) {
3590
- await import_promises2.default.rm(versionDir, { recursive: true, force: true });
3591
- await import_promises2.default.rename(stageDir, versionDir);
3775
+ await import_promises3.default.rm(versionDir, { recursive: true, force: true });
3776
+ await import_promises3.default.rename(stageDir, versionDir);
3592
3777
  }
3593
3778
  if (previous && previous.version !== version) {
3594
3779
  await writeSymlinkAtomic(
@@ -3602,7 +3787,7 @@ var promoteRuntimeStage = async (stageDir, version, homeDir = import_node_os2.de
3602
3787
  } catch {
3603
3788
  }
3604
3789
  };
3605
- var installBundledRuntime = async (bundled, homeDir = import_node_os2.default.homedir()) => {
3790
+ var installBundledRuntime = async (bundled, homeDir = import_node_os3.default.homedir()) => {
3606
3791
  const stageDir = await createStageDir(bundled.version, homeDir);
3607
3792
  try {
3608
3793
  await copyBundledRuntimeToStage(bundled, stageDir);
@@ -3613,21 +3798,21 @@ var installBundledRuntime = async (bundled, homeDir = import_node_os2.default.ho
3613
3798
  runtimeDir: resolveRuntimeVersionDir(bundled.version, homeDir)
3614
3799
  };
3615
3800
  } catch (error) {
3616
- await import_promises2.default.rm(stageDir, { recursive: true, force: true });
3801
+ await import_promises3.default.rm(stageDir, { recursive: true, force: true });
3617
3802
  throw error;
3618
3803
  }
3619
3804
  };
3620
- var installDownloadedRuntime = async (manifest, homeDir = import_node_os2.default.homedir()) => {
3805
+ var installDownloadedRuntime = async (manifest, homeDir = import_node_os3.default.homedir()) => {
3621
3806
  const tarball = manifest.dist?.tarball?.trim();
3622
3807
  if (!tarball) {
3623
3808
  throw new Error("Runtime manifest is missing dist.tarball.");
3624
3809
  }
3625
3810
  const stageDir = await createStageDir(manifest.version, homeDir);
3626
- const tarballPath = import_node_path11.default.join(stageDir, "runtime.tgz");
3811
+ const tarballPath = import_node_path12.default.join(stageDir, "runtime.tgz");
3627
3812
  try {
3628
3813
  await downloadTarball(tarball, tarballPath);
3629
3814
  await extractRuntimeTarballToStage(tarballPath, stageDir);
3630
- await import_promises2.default.rm(tarballPath, { force: true });
3815
+ await import_promises3.default.rm(tarballPath, { force: true });
3631
3816
  await validateRuntimeStage(stageDir, manifest.version);
3632
3817
  await promoteRuntimeStage(stageDir, manifest.version, homeDir);
3633
3818
  return {
@@ -3635,11 +3820,11 @@ var installDownloadedRuntime = async (manifest, homeDir = import_node_os2.defaul
3635
3820
  runtimeDir: resolveRuntimeVersionDir(manifest.version, homeDir)
3636
3821
  };
3637
3822
  } catch (error) {
3638
- await import_promises2.default.rm(stageDir, { recursive: true, force: true });
3823
+ await import_promises3.default.rm(stageDir, { recursive: true, force: true });
3639
3824
  throw error;
3640
3825
  }
3641
3826
  };
3642
- var ensureBundledRuntimeStaged = async (homeDir = import_node_os2.default.homedir()) => {
3827
+ var ensureBundledRuntimeStaged = async (homeDir = import_node_os3.default.homedir()) => {
3643
3828
  const bundled = await readBundledRuntime();
3644
3829
  const current = await readCurrentRuntime(homeDir);
3645
3830
  if (current && compareSemver(current.version, bundled.version) === 0) {
@@ -3657,7 +3842,7 @@ var ensureBundledRuntimeStaged = async (homeDir = import_node_os2.default.homedi
3657
3842
  throw error;
3658
3843
  }
3659
3844
  };
3660
- var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() || import_node_os2.default.homedir()) => {
3845
+ var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() || import_node_os3.default.homedir()) => {
3661
3846
  assertNodeVersion();
3662
3847
  const bundled = await readBundledRuntime();
3663
3848
  const current = await ensureBundledRuntimeStaged(homeDir);
@@ -3678,7 +3863,7 @@ var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() || import_node
3678
3863
  source: "downloaded"
3679
3864
  };
3680
3865
  };
3681
- var writeUpdatePassState = async (result, homeDir = import_node_os2.default.homedir()) => {
3866
+ var writeUpdatePassState = async (result, homeDir = import_node_os3.default.homedir()) => {
3682
3867
  await writeUpdaterState(
3683
3868
  {
3684
3869
  status: "ok",
@@ -3691,7 +3876,7 @@ var writeUpdatePassState = async (result, homeDir = import_node_os2.default.home
3691
3876
  homeDir
3692
3877
  );
3693
3878
  };
3694
- var writeUpdatePassErrorState = async (currentVersion, error, homeDir = import_node_os2.default.homedir()) => {
3879
+ var writeUpdatePassErrorState = async (currentVersion, error, homeDir = import_node_os3.default.homedir()) => {
3695
3880
  await writeUpdaterState(
3696
3881
  {
3697
3882
  status: "error",
@@ -3704,7 +3889,7 @@ var writeUpdatePassErrorState = async (currentVersion, error, homeDir = import_n
3704
3889
  homeDir
3705
3890
  );
3706
3891
  };
3707
- var runUpdaterPass = async (homeDir = import_node_os2.default.homedir()) => {
3892
+ var runUpdaterPass = async (homeDir = import_node_os3.default.homedir()) => {
3708
3893
  const current = await readCurrentRuntime(homeDir);
3709
3894
  try {
3710
3895
  const result = await updateRuntimeOnce(homeDir);
@@ -3715,7 +3900,7 @@ var runUpdaterPass = async (homeDir = import_node_os2.default.homedir()) => {
3715
3900
  throw error;
3716
3901
  }
3717
3902
  };
3718
- var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() || import_node_os2.default.homedir()) => {
3903
+ var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() || import_node_os3.default.homedir()) => {
3719
3904
  assertNodeVersion();
3720
3905
  const claimed = await claimUpdaterDaemon(homeDir);
3721
3906
  if (!claimed) {
@@ -3735,6 +3920,12 @@ var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() || im
3735
3920
  await runUpdaterPass(homeDir);
3736
3921
  } catch {
3737
3922
  }
3923
+ if (isStandaloneMode()) {
3924
+ try {
3925
+ await updateStandaloneOnce(homeDir);
3926
+ } catch {
3927
+ }
3928
+ }
3738
3929
  await writeUpdaterHeartbeat(homeDir);
3739
3930
  await waitWithShutdown(shutdown, UPDATER_INTERVAL_MS);
3740
3931
  }