@boxes-dev/dvb 1.0.576 → 1.0.578

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,182 @@ 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(import_node_path11.default.dirname(process.execPath), "version.json");
3061
+ return (0, import_node_fs7.existsSync)(versionJsonPath);
3062
+ };
3063
+ var readLocalVersionMeta = () => {
3064
+ const versionJsonPath = import_node_path11.default.join(import_node_path11.default.dirname(process.execPath), "version.json");
3065
+ if (!(0, import_node_fs7.existsSync)(versionJsonPath)) return null;
3066
+ try {
3067
+ return JSON.parse((0, import_node_fs7.readFileSync)(versionJsonPath, "utf-8"));
3068
+ } catch {
3069
+ return null;
3070
+ }
3071
+ };
3072
+ var resolveStandaloneDir = (homeDir) => import_node_path11.default.join(resolveDevboxDir(homeDir), "standalone");
3073
+ var resolveCurrentLink = (homeDir) => import_node_path11.default.join(resolveStandaloneDir(homeDir), "current");
3074
+ var checkStandaloneUpdate = async (homeDir = import_node_os2.default.homedir()) => {
3075
+ const local = readLocalVersionMeta();
3076
+ if (!local) return null;
3077
+ const manifestUrl = resolveManifestUrl();
3078
+ const res = await fetch(manifestUrl, {
3079
+ signal: AbortSignal.timeout(1e4)
3080
+ });
3081
+ if (!res.ok) {
3082
+ throw new Error(
3083
+ `Failed to fetch standalone manifest: ${res.status} ${res.statusText}`
3084
+ );
3085
+ }
3086
+ const manifest = await res.json();
3087
+ if (manifest.version === local.version) {
3088
+ return null;
3089
+ }
3090
+ const platformKey = `${local.platform}-${local.arch}`;
3091
+ const archive = manifest.archives?.[platformKey];
3092
+ if (!archive) {
3093
+ throw new Error(
3094
+ `No standalone archive for ${platformKey} in manifest v${manifest.version}`
3095
+ );
3096
+ }
3097
+ return {
3098
+ manifest,
3099
+ archive,
3100
+ currentVersion: local.version
3101
+ };
3102
+ };
3103
+ var downloadStandaloneUpdate = async (manifest, archive, homeDir = import_node_os2.default.homedir()) => {
3104
+ const standaloneDir = resolveStandaloneDir(homeDir);
3105
+ await import_promises2.default.mkdir(standaloneDir, { recursive: true });
3106
+ const local = readLocalVersionMeta();
3107
+ const platformKey = local ? `${local.platform}-${local.arch}` : `${process.platform}-${process.arch}`;
3108
+ const version = manifest.version;
3109
+ const versionDir = import_node_path11.default.join(standaloneDir, `${version}-${platformKey}`);
3110
+ const currentLink = resolveCurrentLink(homeDir);
3111
+ if ((0, import_node_fs7.existsSync)(import_node_path11.default.join(versionDir, "dvb"))) {
3112
+ await atomicSymlink(standaloneDir, currentLink, versionDir);
3113
+ return;
3114
+ }
3115
+ const tmpSuffix = `${version}-${platformKey}-${Date.now()}`;
3116
+ const tmpDir = import_node_path11.default.join(standaloneDir, `.tmp-${tmpSuffix}`);
3117
+ const tarballPath = import_node_path11.default.join(standaloneDir, `.download-${tmpSuffix}.tar.gz`);
3118
+ try {
3119
+ const res = await fetch(archive.url, {
3120
+ signal: AbortSignal.timeout(5 * 60 * 1e3)
3121
+ // 5 minute timeout for large download
3122
+ });
3123
+ if (!res.ok) {
3124
+ throw new Error(`Failed to download ${archive.url}: ${res.status}`);
3125
+ }
3126
+ const body = await res.arrayBuffer();
3127
+ (0, import_node_fs7.writeFileSync)(tarballPath, Buffer.from(body));
3128
+ const hash = (0, import_node_crypto2.createHash)("sha256");
3129
+ hash.update((0, import_node_fs7.readFileSync)(tarballPath));
3130
+ const actualHash = hash.digest("hex");
3131
+ if (actualHash !== archive.sha256) {
3132
+ throw new Error(
3133
+ `SHA256 mismatch: expected ${archive.sha256}, got ${actualHash}`
3134
+ );
3135
+ }
3136
+ await import_promises2.default.mkdir(tmpDir, { recursive: true });
3137
+ (0, import_node_child_process.execFileSync)("tar", [
3138
+ "xzf",
3139
+ tarballPath,
3140
+ "-C",
3141
+ tmpDir,
3142
+ "--strip-components=1"
3143
+ ]);
3144
+ try {
3145
+ (0, import_node_child_process.execFileSync)(import_node_path11.default.join(tmpDir, "dvb"), ["--help"], {
3146
+ stdio: "pipe",
3147
+ timeout: 15e3
3148
+ });
3149
+ } catch (err) {
3150
+ const exitErr = err;
3151
+ throw new Error(
3152
+ `Validation failed: dvb --help exited with code ${exitErr.status}`
3153
+ );
3154
+ }
3155
+ if ((0, import_node_fs7.existsSync)(versionDir)) {
3156
+ await import_promises2.default.rm(versionDir, { recursive: true });
3157
+ }
3158
+ await import_promises2.default.rename(tmpDir, versionDir);
3159
+ await atomicSymlink(standaloneDir, currentLink, versionDir);
3160
+ await pruneOldVersions(standaloneDir, version, platformKey);
3161
+ } finally {
3162
+ try {
3163
+ await import_promises2.default.rm(tmpDir, { recursive: true, force: true });
3164
+ } catch {
3165
+ }
3166
+ try {
3167
+ await import_promises2.default.unlink(tarballPath);
3168
+ } catch {
3169
+ }
3170
+ }
3171
+ };
3172
+ var updateStandaloneOnce = async (homeDir = import_node_os2.default.homedir()) => {
3173
+ const check = await checkStandaloneUpdate(homeDir);
3174
+ if (!check) {
3175
+ const local = readLocalVersionMeta();
3176
+ return {
3177
+ changed: false,
3178
+ previousVersion: local?.version ?? null,
3179
+ currentVersion: local?.version ?? "unknown"
3180
+ };
3181
+ }
3182
+ await downloadStandaloneUpdate(check.manifest, check.archive, homeDir);
3183
+ return {
3184
+ changed: true,
3185
+ previousVersion: check.currentVersion,
3186
+ currentVersion: check.manifest.version
3187
+ };
3188
+ };
3189
+ var atomicSymlink = async (parentDir, linkPath, target) => {
3190
+ const relTarget = import_node_path11.default.relative(parentDir, target);
3191
+ const tmpLink = import_node_path11.default.join(parentDir, `.current-tmp-${Date.now()}`);
3192
+ try {
3193
+ await import_promises2.default.symlink(relTarget, tmpLink);
3194
+ await import_promises2.default.rename(tmpLink, linkPath);
3195
+ } catch {
3196
+ try {
3197
+ await import_promises2.default.unlink(tmpLink);
3198
+ } catch {
3199
+ }
3200
+ try {
3201
+ await import_promises2.default.unlink(linkPath);
3202
+ } catch {
3203
+ }
3204
+ await import_promises2.default.symlink(relTarget, linkPath);
3205
+ }
3206
+ };
3207
+ var pruneOldVersions = async (standaloneDir, currentVersion, platformKey) => {
3208
+ try {
3209
+ const entries = await import_promises2.default.readdir(standaloneDir, { withFileTypes: true });
3210
+ const versionDirs = entries.filter(
3211
+ (e) => e.isDirectory() && !e.name.startsWith(".") && e.name !== "current" && e.name.endsWith(`-${platformKey}`)
3212
+ ).map((e) => e.name).sort().reverse();
3213
+ const toRemove = versionDirs.slice(2);
3214
+ for (const dir of toRemove) {
3215
+ await import_promises2.default.rm(import_node_path11.default.join(standaloneDir, dir), { recursive: true, force: true });
3216
+ }
3217
+ } catch {
3218
+ }
3219
+ };
3220
+
3045
3221
  // src/bootstrap/runtimeManager.ts
3046
3222
  var MIN_NODE_MAJOR = 22;
3047
3223
  var RUNTIME_PACKAGE_NAME = "@boxes-dev/dvb-runtime";
@@ -3070,10 +3246,10 @@ var resolveBasePath = () => {
3070
3246
  return __filename;
3071
3247
  }
3072
3248
  const argv1 = typeof process.argv[1] === "string" ? process.argv[1] : "";
3073
- return argv1 || import_node_path11.default.join(process.cwd(), "dvb");
3249
+ return argv1 || import_node_path12.default.join(process.cwd(), "dvb");
3074
3250
  };
3075
3251
  var readJsonFile = async (filePath) => {
3076
- const raw = await import_promises2.default.readFile(filePath, "utf8");
3252
+ const raw = await import_promises3.default.readFile(filePath, "utf8");
3077
3253
  return JSON.parse(raw);
3078
3254
  };
3079
3255
  var readJsonFileIfExists = async (filePath) => {
@@ -3088,14 +3264,14 @@ var readJsonFileIfExists = async (filePath) => {
3088
3264
  };
3089
3265
  var writeJsonFileAtomic = async (filePath, value) => {
3090
3266
  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);
3267
+ await import_promises3.default.mkdir(import_node_path12.default.dirname(filePath), { recursive: true, mode: 448 });
3268
+ await import_promises3.default.writeFile(tempPath, JSON.stringify(value, null, 2), "utf8");
3269
+ await import_promises3.default.rename(tempPath, filePath);
3094
3270
  };
3095
3271
  var readStageVersion = async (runtimeDir) => {
3096
3272
  try {
3097
3273
  const manifest = await readJsonFile(
3098
- import_node_path11.default.join(runtimeDir, "package.json")
3274
+ import_node_path12.default.join(runtimeDir, "package.json")
3099
3275
  );
3100
3276
  if (typeof manifest.version !== "string") return null;
3101
3277
  const version = manifest.version.trim();
@@ -3104,25 +3280,25 @@ var readStageVersion = async (runtimeDir) => {
3104
3280
  return null;
3105
3281
  }
3106
3282
  };
3107
- var resolveRuntimeBinPath = (runtimeDir, kind) => import_node_path11.default.join(runtimeDir, "dist", "bin", `${kind}.cjs`);
3283
+ var resolveRuntimeBinPath = (runtimeDir, kind) => import_node_path12.default.join(runtimeDir, "dist", "bin", `${kind}.cjs`);
3108
3284
  var readLinkedRuntimeVersion = async (linkPath) => {
3109
3285
  try {
3110
- const runtimeDir = await import_promises2.default.realpath(linkPath);
3111
- const version = import_node_path11.default.basename(runtimeDir).trim();
3286
+ const runtimeDir = await import_promises3.default.realpath(linkPath);
3287
+ const version = import_node_path12.default.basename(runtimeDir).trim();
3112
3288
  return version.length > 0 ? version : null;
3113
3289
  } catch {
3114
3290
  return null;
3115
3291
  }
3116
3292
  };
3117
- var readCurrentRuntime = async (homeDir = import_node_os2.default.homedir()) => {
3293
+ var readCurrentRuntime = async (homeDir = import_node_os3.default.homedir()) => {
3118
3294
  const currentLink = resolveCurrentRuntimeLink(homeDir);
3119
3295
  try {
3120
- const runtimeDir = await import_promises2.default.realpath(currentLink);
3296
+ const runtimeDir = await import_promises3.default.realpath(currentLink);
3121
3297
  const version = await readStageVersion(runtimeDir);
3122
3298
  if (!version) return null;
3123
3299
  const dvbBin = resolveRuntimeBinPath(runtimeDir, "dvb");
3124
3300
  const dvbdBin = resolveRuntimeBinPath(runtimeDir, "dvbd");
3125
- if (!(0, import_node_fs7.existsSync)(dvbBin) || !(0, import_node_fs7.existsSync)(dvbdBin)) {
3301
+ if (!(0, import_node_fs8.existsSync)(dvbBin) || !(0, import_node_fs8.existsSync)(dvbdBin)) {
3126
3302
  return null;
3127
3303
  }
3128
3304
  return { version, runtimeDir };
@@ -3130,9 +3306,9 @@ var readCurrentRuntime = async (homeDir = import_node_os2.default.homedir()) =>
3130
3306
  return null;
3131
3307
  }
3132
3308
  };
3133
- var listLiveRuntimeVersions = async (homeDir = import_node_os2.default.homedir()) => {
3309
+ var listLiveRuntimeVersions = async (homeDir = import_node_os3.default.homedir()) => {
3134
3310
  const releasesDir = resolveRuntimeReleasesDir(homeDir);
3135
- const ps2 = (0, import_node_child_process.spawnSync)("ps", ["eww", "-Ao", "command="], {
3311
+ const ps2 = (0, import_node_child_process2.spawnSync)("ps", ["eww", "-Ao", "command="], {
3136
3312
  encoding: "utf8"
3137
3313
  });
3138
3314
  if (ps2.error || ps2.status !== 0 || typeof ps2.stdout !== "string") {
@@ -3154,7 +3330,7 @@ var listLiveRuntimeVersions = async (homeDir = import_node_os2.default.homedir()
3154
3330
  }
3155
3331
  return [...versions];
3156
3332
  };
3157
- var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) => {
3333
+ var pruneRuntimeReleases = async (homeDir = import_node_os3.default.homedir()) => {
3158
3334
  const releasesDir = resolveRuntimeReleasesDir(homeDir);
3159
3335
  const keep = /* @__PURE__ */ new Set();
3160
3336
  const current = await readCurrentRuntime(homeDir);
@@ -3175,7 +3351,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
3175
3351
  }
3176
3352
  }
3177
3353
  try {
3178
- const entries = await import_promises2.default.readdir(releasesDir, { withFileTypes: true });
3354
+ const entries = await import_promises3.default.readdir(releasesDir, { withFileTypes: true });
3179
3355
  for (const entry of entries) {
3180
3356
  if (!entry.isDirectory()) {
3181
3357
  continue;
@@ -3186,7 +3362,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
3186
3362
  if (keep.has(entry.name)) {
3187
3363
  continue;
3188
3364
  }
3189
- await import_promises2.default.rm(import_node_path11.default.join(releasesDir, entry.name), {
3365
+ await import_promises3.default.rm(import_node_path12.default.join(releasesDir, entry.name), {
3190
3366
  recursive: true,
3191
3367
  force: true
3192
3368
  });
@@ -3201,7 +3377,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
3201
3377
  var resolveBundledRuntimeRoot = () => {
3202
3378
  const require2 = (0, import_node_module.createRequire)(resolveBasePath());
3203
3379
  const manifestPath = require2.resolve(`${RUNTIME_PACKAGE_NAME}/package.json`);
3204
- return import_node_path11.default.dirname(manifestPath);
3380
+ return import_node_path12.default.dirname(manifestPath);
3205
3381
  };
3206
3382
  var readBundledRuntime = async () => {
3207
3383
  const runtimeDir = resolveBundledRuntimeRoot();
@@ -3211,20 +3387,20 @@ var readBundledRuntime = async () => {
3211
3387
  }
3212
3388
  return { version, runtimeDir };
3213
3389
  };
3214
- var ensureReleasesDir = async (homeDir = import_node_os2.default.homedir()) => {
3390
+ var ensureReleasesDir = async (homeDir = import_node_os3.default.homedir()) => {
3215
3391
  const releasesDir = resolveRuntimeReleasesDir(homeDir);
3216
- await import_promises2.default.mkdir(releasesDir, { recursive: true, mode: 448 });
3392
+ await import_promises3.default.mkdir(releasesDir, { recursive: true, mode: 448 });
3217
3393
  try {
3218
- await import_promises2.default.chmod(releasesDir, 448);
3394
+ await import_promises3.default.chmod(releasesDir, 448);
3219
3395
  } catch {
3220
3396
  }
3221
3397
  return releasesDir;
3222
3398
  };
3223
- var ensureUpdaterDir = async (homeDir = import_node_os2.default.homedir()) => {
3399
+ var ensureUpdaterDir = async (homeDir = import_node_os3.default.homedir()) => {
3224
3400
  const updaterDir = resolveUpdaterDir(homeDir);
3225
- await import_promises2.default.mkdir(updaterDir, { recursive: true, mode: 448 });
3401
+ await import_promises3.default.mkdir(updaterDir, { recursive: true, mode: 448 });
3226
3402
  try {
3227
- await import_promises2.default.chmod(updaterDir, 448);
3403
+ await import_promises3.default.chmod(updaterDir, 448);
3228
3404
  } catch {
3229
3405
  }
3230
3406
  return updaterDir;
@@ -3246,23 +3422,23 @@ var isProcessAlive = (pid) => {
3246
3422
  return code === "EPERM";
3247
3423
  }
3248
3424
  };
3249
- var createStageDir = async (version, homeDir = import_node_os2.default.homedir()) => {
3425
+ var createStageDir = async (version, homeDir = import_node_os3.default.homedir()) => {
3250
3426
  const releasesDir = await ensureReleasesDir(homeDir);
3251
- return await import_promises2.default.mkdtemp(
3252
- import_node_path11.default.join(
3427
+ return await import_promises3.default.mkdtemp(
3428
+ import_node_path12.default.join(
3253
3429
  releasesDir,
3254
3430
  `.tmp-${version.replace(/[^a-zA-Z0-9._-]+/g, "-")}-`
3255
3431
  )
3256
3432
  );
3257
3433
  };
3258
3434
  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")
3435
+ await import_promises3.default.copyFile(
3436
+ import_node_path12.default.join(bundled.runtimeDir, "package.json"),
3437
+ import_node_path12.default.join(stageDir, "package.json")
3262
3438
  );
3263
- await import_promises2.default.cp(
3264
- import_node_path11.default.join(bundled.runtimeDir, "dist"),
3265
- import_node_path11.default.join(stageDir, "dist"),
3439
+ await import_promises3.default.cp(
3440
+ import_node_path12.default.join(bundled.runtimeDir, "dist"),
3441
+ import_node_path12.default.join(stageDir, "dist"),
3266
3442
  {
3267
3443
  recursive: true
3268
3444
  }
@@ -3299,7 +3475,7 @@ var downloadTarball = async (url, filePath) => {
3299
3475
  throw new Error(`Runtime tarball download failed with ${response.status}.`);
3300
3476
  }
3301
3477
  const buffer = Buffer.from(await response.arrayBuffer());
3302
- await import_promises2.default.writeFile(filePath, buffer);
3478
+ await import_promises3.default.writeFile(filePath, buffer);
3303
3479
  };
3304
3480
  var extractRuntimeTarballToStage = async (tarballPath, stageDir) => {
3305
3481
  await lo({
@@ -3444,21 +3620,21 @@ var terminateChild = async (child) => {
3444
3620
  });
3445
3621
  };
3446
3622
  var validateRuntimeStage = async (stageDir, expectedVersion) => {
3447
- const socketDir = import_node_path11.default.join(
3623
+ const socketDir = import_node_path12.default.join(
3448
3624
  "/tmp",
3449
- `dvb-runtime-validate-${process.pid}-${(0, import_node_crypto2.randomUUID)().slice(0, 8)}`
3625
+ `dvb-runtime-validate-${process.pid}-${(0, import_node_crypto3.randomUUID)().slice(0, 8)}`
3450
3626
  );
3451
- const socketPath = import_node_path11.default.join(socketDir, "devboxd.sock");
3627
+ const socketPath = import_node_path12.default.join(socketDir, "devboxd.sock");
3452
3628
  const daemonBinPath = resolveRuntimeBinPath(stageDir, "dvbd");
3453
- if (!(0, import_node_fs7.existsSync)(daemonBinPath)) {
3629
+ if (!(0, import_node_fs8.existsSync)(daemonBinPath)) {
3454
3630
  throw new Error(`Runtime stage is missing ${daemonBinPath}.`);
3455
3631
  }
3456
3632
  const cliBinPath = resolveRuntimeBinPath(stageDir, "dvb");
3457
- if (!(0, import_node_fs7.existsSync)(cliBinPath)) {
3633
+ if (!(0, import_node_fs8.existsSync)(cliBinPath)) {
3458
3634
  throw new Error(`Runtime stage is missing ${cliBinPath}.`);
3459
3635
  }
3460
- await import_promises2.default.mkdir(socketDir, { recursive: true, mode: 448 });
3461
- const child = (0, import_node_child_process.spawn)(process.execPath, [daemonBinPath], {
3636
+ await import_promises3.default.mkdir(socketDir, { recursive: true, mode: 448 });
3637
+ const child = (0, import_node_child_process2.spawn)(process.execPath, [daemonBinPath], {
3462
3638
  env: {
3463
3639
  ...process.env,
3464
3640
  DEVBOX_SOCKET_PATH: socketPath
@@ -3479,9 +3655,9 @@ var validateRuntimeStage = async (stageDir, expectedVersion) => {
3479
3655
  `Runtime stage reported version ${validated.version}; expected ${expectedVersion}.`
3480
3656
  );
3481
3657
  }
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"], {
3658
+ const cliHomeDir = import_node_path12.default.join(socketDir, "home");
3659
+ await import_promises3.default.mkdir(cliHomeDir, { recursive: true, mode: 448 });
3660
+ const cliChild = (0, import_node_child_process2.spawn)(process.execPath, [cliBinPath, "--help"], {
3485
3661
  env: {
3486
3662
  ...process.env,
3487
3663
  HOME: cliHomeDir
@@ -3502,22 +3678,22 @@ var validateRuntimeStage = async (stageDir, expectedVersion) => {
3502
3678
  }
3503
3679
  } finally {
3504
3680
  await terminateChild(child);
3505
- await import_promises2.default.rm(socketDir, { recursive: true, force: true });
3681
+ await import_promises3.default.rm(socketDir, { recursive: true, force: true });
3506
3682
  }
3507
3683
  };
3508
3684
  var writeSymlinkAtomic = async (linkPath, target) => {
3509
3685
  const tempPath = `${linkPath}.tmp-${process.pid}-${Date.now()}`;
3510
- await import_promises2.default.symlink(target, tempPath);
3686
+ await import_promises3.default.symlink(target, tempPath);
3511
3687
  try {
3512
- await import_promises2.default.rename(tempPath, linkPath);
3688
+ await import_promises3.default.rename(tempPath, linkPath);
3513
3689
  } catch (error) {
3514
- await import_promises2.default.rm(linkPath, { recursive: true, force: true });
3515
- await import_promises2.default.rename(tempPath, linkPath);
3690
+ await import_promises3.default.rm(linkPath, { recursive: true, force: true });
3691
+ await import_promises3.default.rename(tempPath, linkPath);
3516
3692
  if (error instanceof Error) {
3517
3693
  }
3518
3694
  }
3519
3695
  };
3520
- var writeUpdaterHeartbeat = async (homeDir = import_node_os2.default.homedir()) => {
3696
+ var writeUpdaterHeartbeat = async (homeDir = import_node_os3.default.homedir()) => {
3521
3697
  const current = await readJsonFileIfExists(
3522
3698
  resolveUpdaterDaemonPath(homeDir)
3523
3699
  );
@@ -3529,7 +3705,7 @@ var writeUpdaterHeartbeat = async (homeDir = import_node_os2.default.homedir())
3529
3705
  heartbeatAt: (/* @__PURE__ */ new Date()).toISOString()
3530
3706
  });
3531
3707
  };
3532
- var claimUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) => {
3708
+ var claimUpdaterDaemon = async (homeDir = import_node_os3.default.homedir()) => {
3533
3709
  await ensureUpdaterDir(homeDir);
3534
3710
  const daemonPath = resolveUpdaterDaemonPath(homeDir);
3535
3711
  const record = {
@@ -3540,7 +3716,7 @@ var claimUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) =>
3540
3716
  };
3541
3717
  for (let attempt = 0; attempt < 2; attempt += 1) {
3542
3718
  try {
3543
- await import_promises2.default.writeFile(daemonPath, JSON.stringify(record, null, 2), {
3719
+ await import_promises3.default.writeFile(daemonPath, JSON.stringify(record, null, 2), {
3544
3720
  encoding: "utf8",
3545
3721
  flag: "wx"
3546
3722
  });
@@ -3554,20 +3730,20 @@ var claimUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) =>
3554
3730
  if (existing && isProcessAlive(existing.pid)) {
3555
3731
  return false;
3556
3732
  }
3557
- await import_promises2.default.rm(daemonPath, { force: true });
3733
+ await import_promises3.default.rm(daemonPath, { force: true });
3558
3734
  }
3559
3735
  }
3560
3736
  return false;
3561
3737
  };
3562
- var releaseUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) => {
3738
+ var releaseUpdaterDaemon = async (homeDir = import_node_os3.default.homedir()) => {
3563
3739
  const daemonPath = resolveUpdaterDaemonPath(homeDir);
3564
3740
  const current = await readJsonFileIfExists(daemonPath);
3565
3741
  if (!current || current.pid !== process.pid) {
3566
3742
  return;
3567
3743
  }
3568
- await import_promises2.default.rm(daemonPath, { force: true });
3744
+ await import_promises3.default.rm(daemonPath, { force: true });
3569
3745
  };
3570
- var writeUpdaterState = async (state, homeDir = import_node_os2.default.homedir()) => {
3746
+ var writeUpdaterState = async (state, homeDir = import_node_os3.default.homedir()) => {
3571
3747
  await ensureUpdaterDir(homeDir);
3572
3748
  await writeJsonFileAtomic(resolveUpdaterStatePath(homeDir), state);
3573
3749
  };
@@ -3583,12 +3759,12 @@ var waitWithShutdown = async (shutdown, timeoutMs) => {
3583
3759
  await new Promise((resolve) => setTimeout(resolve, delay));
3584
3760
  }
3585
3761
  };
3586
- var promoteRuntimeStage = async (stageDir, version, homeDir = import_node_os2.default.homedir()) => {
3762
+ var promoteRuntimeStage = async (stageDir, version, homeDir = import_node_os3.default.homedir()) => {
3587
3763
  const previous = await readCurrentRuntime(homeDir);
3588
3764
  const versionDir = resolveRuntimeVersionDir(version, homeDir);
3589
3765
  if (stageDir !== versionDir) {
3590
- await import_promises2.default.rm(versionDir, { recursive: true, force: true });
3591
- await import_promises2.default.rename(stageDir, versionDir);
3766
+ await import_promises3.default.rm(versionDir, { recursive: true, force: true });
3767
+ await import_promises3.default.rename(stageDir, versionDir);
3592
3768
  }
3593
3769
  if (previous && previous.version !== version) {
3594
3770
  await writeSymlinkAtomic(
@@ -3602,7 +3778,7 @@ var promoteRuntimeStage = async (stageDir, version, homeDir = import_node_os2.de
3602
3778
  } catch {
3603
3779
  }
3604
3780
  };
3605
- var installBundledRuntime = async (bundled, homeDir = import_node_os2.default.homedir()) => {
3781
+ var installBundledRuntime = async (bundled, homeDir = import_node_os3.default.homedir()) => {
3606
3782
  const stageDir = await createStageDir(bundled.version, homeDir);
3607
3783
  try {
3608
3784
  await copyBundledRuntimeToStage(bundled, stageDir);
@@ -3613,21 +3789,21 @@ var installBundledRuntime = async (bundled, homeDir = import_node_os2.default.ho
3613
3789
  runtimeDir: resolveRuntimeVersionDir(bundled.version, homeDir)
3614
3790
  };
3615
3791
  } catch (error) {
3616
- await import_promises2.default.rm(stageDir, { recursive: true, force: true });
3792
+ await import_promises3.default.rm(stageDir, { recursive: true, force: true });
3617
3793
  throw error;
3618
3794
  }
3619
3795
  };
3620
- var installDownloadedRuntime = async (manifest, homeDir = import_node_os2.default.homedir()) => {
3796
+ var installDownloadedRuntime = async (manifest, homeDir = import_node_os3.default.homedir()) => {
3621
3797
  const tarball = manifest.dist?.tarball?.trim();
3622
3798
  if (!tarball) {
3623
3799
  throw new Error("Runtime manifest is missing dist.tarball.");
3624
3800
  }
3625
3801
  const stageDir = await createStageDir(manifest.version, homeDir);
3626
- const tarballPath = import_node_path11.default.join(stageDir, "runtime.tgz");
3802
+ const tarballPath = import_node_path12.default.join(stageDir, "runtime.tgz");
3627
3803
  try {
3628
3804
  await downloadTarball(tarball, tarballPath);
3629
3805
  await extractRuntimeTarballToStage(tarballPath, stageDir);
3630
- await import_promises2.default.rm(tarballPath, { force: true });
3806
+ await import_promises3.default.rm(tarballPath, { force: true });
3631
3807
  await validateRuntimeStage(stageDir, manifest.version);
3632
3808
  await promoteRuntimeStage(stageDir, manifest.version, homeDir);
3633
3809
  return {
@@ -3635,11 +3811,11 @@ var installDownloadedRuntime = async (manifest, homeDir = import_node_os2.defaul
3635
3811
  runtimeDir: resolveRuntimeVersionDir(manifest.version, homeDir)
3636
3812
  };
3637
3813
  } catch (error) {
3638
- await import_promises2.default.rm(stageDir, { recursive: true, force: true });
3814
+ await import_promises3.default.rm(stageDir, { recursive: true, force: true });
3639
3815
  throw error;
3640
3816
  }
3641
3817
  };
3642
- var ensureBundledRuntimeStaged = async (homeDir = import_node_os2.default.homedir()) => {
3818
+ var ensureBundledRuntimeStaged = async (homeDir = import_node_os3.default.homedir()) => {
3643
3819
  const bundled = await readBundledRuntime();
3644
3820
  const current = await readCurrentRuntime(homeDir);
3645
3821
  if (current && compareSemver(current.version, bundled.version) === 0) {
@@ -3657,7 +3833,7 @@ var ensureBundledRuntimeStaged = async (homeDir = import_node_os2.default.homedi
3657
3833
  throw error;
3658
3834
  }
3659
3835
  };
3660
- var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() || import_node_os2.default.homedir()) => {
3836
+ var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() || import_node_os3.default.homedir()) => {
3661
3837
  assertNodeVersion();
3662
3838
  const bundled = await readBundledRuntime();
3663
3839
  const current = await ensureBundledRuntimeStaged(homeDir);
@@ -3678,7 +3854,7 @@ var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() || import_node
3678
3854
  source: "downloaded"
3679
3855
  };
3680
3856
  };
3681
- var writeUpdatePassState = async (result, homeDir = import_node_os2.default.homedir()) => {
3857
+ var writeUpdatePassState = async (result, homeDir = import_node_os3.default.homedir()) => {
3682
3858
  await writeUpdaterState(
3683
3859
  {
3684
3860
  status: "ok",
@@ -3691,7 +3867,7 @@ var writeUpdatePassState = async (result, homeDir = import_node_os2.default.home
3691
3867
  homeDir
3692
3868
  );
3693
3869
  };
3694
- var writeUpdatePassErrorState = async (currentVersion, error, homeDir = import_node_os2.default.homedir()) => {
3870
+ var writeUpdatePassErrorState = async (currentVersion, error, homeDir = import_node_os3.default.homedir()) => {
3695
3871
  await writeUpdaterState(
3696
3872
  {
3697
3873
  status: "error",
@@ -3704,7 +3880,7 @@ var writeUpdatePassErrorState = async (currentVersion, error, homeDir = import_n
3704
3880
  homeDir
3705
3881
  );
3706
3882
  };
3707
- var runUpdaterPass = async (homeDir = import_node_os2.default.homedir()) => {
3883
+ var runUpdaterPass = async (homeDir = import_node_os3.default.homedir()) => {
3708
3884
  const current = await readCurrentRuntime(homeDir);
3709
3885
  try {
3710
3886
  const result = await updateRuntimeOnce(homeDir);
@@ -3715,7 +3891,7 @@ var runUpdaterPass = async (homeDir = import_node_os2.default.homedir()) => {
3715
3891
  throw error;
3716
3892
  }
3717
3893
  };
3718
- var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() || import_node_os2.default.homedir()) => {
3894
+ var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() || import_node_os3.default.homedir()) => {
3719
3895
  assertNodeVersion();
3720
3896
  const claimed = await claimUpdaterDaemon(homeDir);
3721
3897
  if (!claimed) {
@@ -3735,6 +3911,12 @@ var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() || im
3735
3911
  await runUpdaterPass(homeDir);
3736
3912
  } catch {
3737
3913
  }
3914
+ if (isStandaloneMode()) {
3915
+ try {
3916
+ await updateStandaloneOnce(homeDir);
3917
+ } catch {
3918
+ }
3919
+ }
3738
3920
  await writeUpdaterHeartbeat(homeDir);
3739
3921
  await waitWithShutdown(shutdown, UPDATER_INTERVAL_MS);
3740
3922
  }