botmux 3.18.4 → 3.18.6

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.
Files changed (48) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +130 -21
  4. package/dist/cli.js.map +1 -1
  5. package/dist/core/binary-install-shape.d.ts +77 -0
  6. package/dist/core/binary-install-shape.d.ts.map +1 -0
  7. package/dist/core/binary-install-shape.js +117 -0
  8. package/dist/core/binary-install-shape.js.map +1 -0
  9. package/dist/core/binary-self-update.d.ts +82 -0
  10. package/dist/core/binary-self-update.d.ts.map +1 -0
  11. package/dist/core/binary-self-update.js +239 -0
  12. package/dist/core/binary-self-update.js.map +1 -0
  13. package/dist/core/maintenance.d.ts +88 -1
  14. package/dist/core/maintenance.d.ts.map +1 -1
  15. package/dist/core/maintenance.js +149 -8
  16. package/dist/core/maintenance.js.map +1 -1
  17. package/dist/core/release-download.d.ts +13 -0
  18. package/dist/core/release-download.d.ts.map +1 -0
  19. package/dist/core/release-download.js +130 -0
  20. package/dist/core/release-download.js.map +1 -0
  21. package/dist/dashboard/hd2d-assets.d.ts +2 -3
  22. package/dist/dashboard/hd2d-assets.d.ts.map +1 -1
  23. package/dist/dashboard/hd2d-assets.js +7 -109
  24. package/dist/dashboard/hd2d-assets.js.map +1 -1
  25. package/dist/dashboard/web/app.d.ts.map +1 -1
  26. package/dist/dashboard/web/app.js +7 -1
  27. package/dist/dashboard/web/app.js.map +1 -1
  28. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  29. package/dist/dashboard/web/settings-page.js.map +1 -1
  30. package/dist/dashboard-web/app.js +1 -1
  31. package/dist/dashboard.js +120 -13
  32. package/dist/dashboard.js.map +1 -1
  33. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  34. package/dist/setup/open-platform-automation.js +9 -12
  35. package/dist/setup/open-platform-automation.js.map +1 -1
  36. package/dist/utils/file-lock.d.ts +25 -0
  37. package/dist/utils/file-lock.d.ts.map +1 -1
  38. package/dist/utils/file-lock.js +34 -4
  39. package/dist/utils/file-lock.js.map +1 -1
  40. package/dist/utils/global-install.d.ts +19 -0
  41. package/dist/utils/global-install.d.ts.map +1 -1
  42. package/dist/utils/global-install.js +28 -1
  43. package/dist/utils/global-install.js.map +1 -1
  44. package/dist/utils/install-info.d.ts +37 -1
  45. package/dist/utils/install-info.d.ts.map +1 -1
  46. package/dist/utils/install-info.js +45 -3
  47. package/dist/utils/install-info.js.map +1 -1
  48. package/package.json +7 -7
@@ -20,6 +20,7 @@ import { spawn } from 'node:child_process';
20
20
  import { type MaintenanceConfig } from '../global-config.js';
21
21
  import { type RestartIntent } from '../services/restart-intent-store.js';
22
22
  import { type GlobalInstallPlan } from '../utils/global-install.js';
23
+ import { type BinaryInstallShape, type UpdateStrategy } from './binary-self-update.js';
23
24
  export interface MaintenanceState {
24
25
  /** Local date the auto-update run was last handled (fired or skipped). */
25
26
  autoUpdate?: {
@@ -39,6 +40,30 @@ export interface MaintenanceDeps {
39
40
  currentVersion: () => string;
40
41
  /** Updates the owning npm/pnpm/Bun global install (download/install only). */
41
42
  runUpdate: () => void;
43
+ /**
44
+ * What `runUpdate` actually installed, or '' when it could not be determined.
45
+ *
46
+ * ⚠️ WHY THIS EXISTS — THE BAKED VERSION SHADOWS A COMPLETED UPDATE, ON BOTH
47
+ * STRATEGIES. A compiled binary's version is baked in at compile time, and
48
+ * `botmuxVersionAt` returns that value for ANY directory you ask about. So
49
+ * `currentVersion()` after an update still reports this process's OLD version:
50
+ *
51
+ * · self-replace — the file on disk was swapped; nothing on disk is read.
52
+ * · package-manager — npm rewrote the install's package.json, but the baked
53
+ * value takes priority over reading it (measured:
54
+ * package.json says 3.19.0, the call returns 3.18.4).
55
+ *
56
+ * Either way `after === before`, so the tick logs "already on the latest
57
+ * version" and NEVER restarts onto what it just installed. Both branches
58
+ * therefore report the installed version explicitly — the self-replace path from
59
+ * what it downloaded, the package-manager path via `diskVersionAt` (which
60
+ * deliberately ignores the baked value).
61
+ *
62
+ * Returns '' when undeterminable, and the tick falls back to the re-read
63
+ * comparison. Under Node the baked value is absent, so all of this is a no-op
64
+ * and behaviour is byte-identical to before.
65
+ */
66
+ installedVersion?: () => string;
42
67
  writeIntent: (intent: RestartIntent) => void;
43
68
  /** Spawn a detached `botmux restart` (this process is then killed by pm2). */
44
69
  triggerRestart: () => void;
@@ -73,6 +98,23 @@ export declare function maintenanceRestartLogPath(): string;
73
98
  export declare function globalInstallUpdateCwd(): string;
74
99
  /** Run the ownership-aware update synchronously. */
75
100
  export declare function installLatestBotmuxSync(plan?: GlobalInstallPlan): void;
101
+ /**
102
+ * Apply an update for whatever install shape this process is, resolving the
103
+ * strategy first so a compiled binary is handled instead of being rejected as an
104
+ * "unsupported install".
105
+ *
106
+ * Shared by the CLI (`botmux update`), the dashboard's `/api/update/run` and the
107
+ * scheduled auto-update so the three cannot drift — they previously all funnelled
108
+ * into `resolveGlobalInstallPlan`, which is exactly the call that fails in
109
+ * compiled mode.
110
+ *
111
+ * @param spec the version spec for the package-manager path, and the version to
112
+ * download for the self-replace path ('latest' resolves upstream).
113
+ */
114
+ export declare function applyBotmuxUpdate(installRoot: string, version: string): Promise<{
115
+ strategy: UpdateStrategy['kind'];
116
+ detail: string;
117
+ }>;
76
118
  /**
77
119
  * Cross-process lock target that serializes global botmux updates
78
120
  * between the scheduled auto-update (this daemon process) and a
@@ -92,12 +134,43 @@ export declare function globalInstallUpdateLockTarget(): string;
92
134
  * restarts the rest (the 2026-06-11 incident). `setsid` starts it in a brand
93
135
  * new session, reparented to init, immune to botmux-0's teardown. Without
94
136
  * setsid we fall back to a plain spawn (still detached by the caller).
137
+ *
138
+ * ⚠️ COMPILED BINARY: there is no `cli.js` to pass. Under Node the shape is
139
+ * `node <dist/cli.js> restart`, where argv[2] is `restart`. A single-file
140
+ * executable IS the CLI, so the same shape becomes `<binary> <cli.js path>
141
+ * restart` — and argv[2] is then the PATH, not `restart`. MEASURED on the real
142
+ * v3.18.4 binary: it printed the help banner and **exited 0**, i.e. a restart
143
+ * that silently never happened while reporting success. So in standalone mode the
144
+ * entry argument is dropped entirely and the binary is invoked as
145
+ * `<binary> restart`.
95
146
  */
96
- export declare function buildRestartLauncher(node: string, cliEntry: string, hasSetsid: boolean): {
147
+ export declare function buildRestartLauncher(node: string, cliEntry: string, hasSetsid: boolean, standalone?: boolean): {
97
148
  cmd: string;
98
149
  args: string[];
99
150
  };
100
151
  export declare function detachedRestartEnv(inheritedEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
152
+ /**
153
+ * Resolve the executable a detached restart should launch.
154
+ *
155
+ * ⚠️ WHY `process.execPath` IS NOT ALWAYS RIGHT FOR A COMPILED BINARY. For the
156
+ * self-replacing (install.sh) shape it is exactly right: the path is stable and we
157
+ * just swapped the bytes underneath it. But for a PACKAGE-MANAGER-owned binary the
158
+ * running path can be VERSIONED — pnpm's virtual store yields
159
+ * `…/.pnpm/botmux-linux-x64@<old version>/node_modules/botmux-linux-x64/botmux`.
160
+ * After the update, npm/pnpm's postinstall has re-pointed the stable launcher at
161
+ * the NEW subpackage, while this process's `execPath` still names the OLD one. So
162
+ * restarting from `execPath` either fails with ENOENT (the old store entry was
163
+ * pruned) or silently starts the OLD binary — an update that reports success and
164
+ * does not take effect.
165
+ *
166
+ * The stable launcher (`~/.botmux/bin/botmux`) is what both installers maintain and
167
+ * re-point, so it is the correct target after a package-manager update. Fall back
168
+ * to `execPath` when it is missing (nothing else to go on) — that is the
169
+ * pre-existing behaviour.
170
+ *
171
+ * Pure over its inputs so every branch is testable without a compiled binary.
172
+ */
173
+ export declare function resolveStandaloneRestartExecutable(standalone: boolean, execPath: string, shape: BinaryInstallShape, launcherPath: string, launcherExists: boolean): string;
101
174
  /**
102
175
  * Spawn a detached `botmux restart`, immune to this process's own teardown
103
176
  * (setsid → a new session reparented to init, so PM2 killing the current
@@ -108,6 +181,20 @@ export declare function detachedRestartEnv(inheritedEnv?: NodeJS.ProcessEnv): No
108
181
  * @param reason short tag written to the log (e.g. 'auto-update', 'dashboard').
109
182
  */
110
183
  export declare function spawnDetachedRestart(reason: string, activePackageRoot?: string, restartLeaseId?: string): ReturnType<typeof spawn>;
184
+ /**
185
+ * Perform a binary self-replace in a CHILD process and block until it finishes.
186
+ *
187
+ * WHY A CHILD AND NOT AN `await` HERE: `runMaintenanceTick` is synchronous and
188
+ * runs inside `withFileLockSync`, so it cannot await the download. Re-execing this
189
+ * same binary with a hidden `__self-update` subcommand keeps the lock semantics
190
+ * byte-identical to the package-manager branch (spawn one child, wait, throw on a
191
+ * non-zero exit) without turning the whole tick async — which would change the
192
+ * locking shape for the npm path too, the one that is currently working.
193
+ *
194
+ * Returns the version that was installed (printed by the child on its last line),
195
+ * or '' when the child reported success without a parseable version.
196
+ */
197
+ export declare function runSelfReplaceBlocking(version?: string): string;
111
198
  /** Start the maintenance loop. Call only on the primary daemon (bot-0). */
112
199
  export declare function startMaintenance(): void;
113
200
  export declare function stopMaintenance(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../src/core/maintenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAY,KAAK,EAAa,MAAM,oBAAoB,CAAC;AAMhE,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG/E,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,qCAAqC,CAAC;AAQ7C,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAIpC,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,UAAU,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,iBAAiB,GAAG,SAAS,CAAC;IAChD,SAAS,EAAE,MAAM,gBAAgB,CAAC;IAClC,UAAU,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC1C,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,iEAAiE;IACjE,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACzC,6EAA6E;IAC7E,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,8EAA8E;IAC9E,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,8EAA8E;IAC9E,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CA8D9D;AAMD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CASpE;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAM9E;AAID;2CAC2C;AAC3C,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAE1C;uEACuE;AACvE,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,oDAAoD;AACpD,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,iBAA8C,GAAG,IAAI,CAWlG;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIvE;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CAEtD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,GACjB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAGjC;AAED,wBAAgB,kBAAkB,CAAC,YAAY,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,UAAU,CAuCnG;AAWD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,iBAAiB,CAAC,EAAE,MAAM,EAC1B,cAAc,CAAC,EAAE,MAAM,GACtB,UAAU,CAAC,OAAO,KAAK,CAAC,CAmC1B;AA2CD,2EAA2E;AAC3E,wBAAgB,gBAAgB,IAAI,IAAI,CAavC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
1
+ {"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../src/core/maintenance.ts"],"names":[],"mappings":"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"}
@@ -26,10 +26,13 @@ import { readGlobalConfig } from '../global-config.js';
26
26
  import { evaluateDue } from './maintenance-schedule.js';
27
27
  import { anyDaemonBusy } from './daemon-heartbeat.js';
28
28
  import { claimRestartLease, clearRestartLease, hasActiveRestartLease, writeRestartIntent, } from '../services/restart-intent-store.js';
29
- import { isLocalDevInstall, botmuxVersion, botmuxVersionAt, botmuxCliEntry, botmuxCliEntryAt, } from '../utils/install-info.js';
30
- import { resolveGlobalInstallPlan, } from '../utils/global-install.js';
29
+ import { isLocalDevInstall, botmuxVersion, botmuxInstallRoot, botmuxVersionAt, diskVersionAt, botmuxCliEntry, botmuxCliEntryAt, } from '../utils/install-info.js';
30
+ import { resolveGlobalInstallPlan, formatGlobalInstallCommand, UnsupportedGlobalInstallError, } from '../utils/global-install.js';
31
31
  import { withFileLockSync } from '../utils/file-lock.js';
32
32
  import { scrubWorkflowWorkerEnv, stripDashboardH5Env } from '../utils/child-env.js';
33
+ import { isStandaloneBinary } from './self-spawn.js';
34
+ import { currentUpdateStrategy, currentBinaryInstallShape, replaceStandaloneBinary, } from './binary-self-update.js';
35
+ import { globalWrapperPath } from '../utils/local-dev-update.js';
33
36
  /**
34
37
  * One maintenance tick. The schedule is driven solely by auto-update's time
35
38
  * (once/day). At that time: install the latest version (download only), and
@@ -67,7 +70,10 @@ export function runMaintenanceTick(deps) {
67
70
  deps.withUpdateLock(() => {
68
71
  before = deps.currentVersion();
69
72
  deps.runUpdate();
70
- after = deps.currentVersion();
73
+ // Both strategies report what they installed: a compiled binary's baked
74
+ // version shadows the disk on BOTH paths (see MaintenanceDeps.installedVersion).
75
+ const reported = deps.installedVersion?.() ?? '';
76
+ after = reported || deps.currentVersion();
71
77
  if (after !== before && cfg.autoRestart?.enabled) {
72
78
  deps.writeIntent({ kind: 'update', oldVersion: before, newVersion: after, at: new Date(now).toISOString() });
73
79
  try {
@@ -160,6 +166,32 @@ export function installLatestBotmuxSync(plan = resolveGlobalInstallPlan()) {
160
166
  throw new Error(`${plan.manager} install exited with ${result.status ?? result.signal ?? 'unknown status'}`);
161
167
  }
162
168
  }
169
+ /**
170
+ * Apply an update for whatever install shape this process is, resolving the
171
+ * strategy first so a compiled binary is handled instead of being rejected as an
172
+ * "unsupported install".
173
+ *
174
+ * Shared by the CLI (`botmux update`), the dashboard's `/api/update/run` and the
175
+ * scheduled auto-update so the three cannot drift — they previously all funnelled
176
+ * into `resolveGlobalInstallPlan`, which is exactly the call that fails in
177
+ * compiled mode.
178
+ *
179
+ * @param spec the version spec for the package-manager path, and the version to
180
+ * download for the self-replace path ('latest' resolves upstream).
181
+ */
182
+ export async function applyBotmuxUpdate(installRoot, version) {
183
+ const strategy = currentUpdateStrategy(installRoot);
184
+ if (strategy.kind === 'unsupported') {
185
+ throw new UnsupportedGlobalInstallError('unknown', process.execPath);
186
+ }
187
+ if (strategy.kind === 'self-replace') {
188
+ const r = await replaceStandaloneBinary(version, strategy.target);
189
+ return { strategy: 'self-replace', detail: `${r.asset} → ${r.target}` };
190
+ }
191
+ const plan = resolveGlobalInstallPlan(strategy.packageRoot, process.platform, `botmux@${version}`);
192
+ installLatestBotmuxSync(plan);
193
+ return { strategy: 'package-manager', detail: formatGlobalInstallCommand(plan) };
194
+ }
163
195
  /**
164
196
  * Cross-process lock target that serializes global botmux updates
165
197
  * between the scheduled auto-update (this daemon process) and a
@@ -185,11 +217,23 @@ export function globalInstallUpdateLockTarget() {
185
217
  * restarts the rest (the 2026-06-11 incident). `setsid` starts it in a brand
186
218
  * new session, reparented to init, immune to botmux-0's teardown. Without
187
219
  * setsid we fall back to a plain spawn (still detached by the caller).
220
+ *
221
+ * ⚠️ COMPILED BINARY: there is no `cli.js` to pass. Under Node the shape is
222
+ * `node <dist/cli.js> restart`, where argv[2] is `restart`. A single-file
223
+ * executable IS the CLI, so the same shape becomes `<binary> <cli.js path>
224
+ * restart` — and argv[2] is then the PATH, not `restart`. MEASURED on the real
225
+ * v3.18.4 binary: it printed the help banner and **exited 0**, i.e. a restart
226
+ * that silently never happened while reporting success. So in standalone mode the
227
+ * entry argument is dropped entirely and the binary is invoked as
228
+ * `<binary> restart`.
188
229
  */
189
- export function buildRestartLauncher(node, cliEntry, hasSetsid) {
230
+ export function buildRestartLauncher(node, cliEntry, hasSetsid, standalone = false) {
231
+ // A compiled binary dispatches its own subcommands; passing a cli.js path
232
+ // would shift `restart` to argv[3] where nothing reads it.
233
+ const entryArgs = standalone ? ['restart'] : [cliEntry, 'restart'];
190
234
  if (hasSetsid)
191
- return { cmd: 'setsid', args: [node, cliEntry, 'restart'] };
192
- return { cmd: node, args: [cliEntry, 'restart'] };
235
+ return { cmd: 'setsid', args: [node, ...entryArgs] };
236
+ return { cmd: node, args: entryArgs };
193
237
  }
194
238
  export function detachedRestartEnv(inheritedEnv = process.env) {
195
239
  const env = { ...inheritedEnv };
@@ -241,6 +285,37 @@ function setsidAvailable() {
241
285
  return false;
242
286
  }
243
287
  }
288
+ /**
289
+ * Resolve the executable a detached restart should launch.
290
+ *
291
+ * ⚠️ WHY `process.execPath` IS NOT ALWAYS RIGHT FOR A COMPILED BINARY. For the
292
+ * self-replacing (install.sh) shape it is exactly right: the path is stable and we
293
+ * just swapped the bytes underneath it. But for a PACKAGE-MANAGER-owned binary the
294
+ * running path can be VERSIONED — pnpm's virtual store yields
295
+ * `…/.pnpm/botmux-linux-x64@<old version>/node_modules/botmux-linux-x64/botmux`.
296
+ * After the update, npm/pnpm's postinstall has re-pointed the stable launcher at
297
+ * the NEW subpackage, while this process's `execPath` still names the OLD one. So
298
+ * restarting from `execPath` either fails with ENOENT (the old store entry was
299
+ * pruned) or silently starts the OLD binary — an update that reports success and
300
+ * does not take effect.
301
+ *
302
+ * The stable launcher (`~/.botmux/bin/botmux`) is what both installers maintain and
303
+ * re-point, so it is the correct target after a package-manager update. Fall back
304
+ * to `execPath` when it is missing (nothing else to go on) — that is the
305
+ * pre-existing behaviour.
306
+ *
307
+ * Pure over its inputs so every branch is testable without a compiled binary.
308
+ */
309
+ export function resolveStandaloneRestartExecutable(standalone, execPath, shape, launcherPath, launcherExists) {
310
+ if (!standalone)
311
+ return execPath;
312
+ // We own this exact path and just replaced its contents — re-exec it.
313
+ if (shape === 'curl-binary')
314
+ return execPath;
315
+ if (shape === 'npm-binary' && launcherExists)
316
+ return launcherPath;
317
+ return execPath;
318
+ }
244
319
  /**
245
320
  * Spawn a detached `botmux restart`, immune to this process's own teardown
246
321
  * (setsid → a new session reparented to init, so PM2 killing the current
@@ -261,8 +336,17 @@ export function spawnDetachedRestart(reason, activePackageRoot, restartLeaseId)
261
336
  catch {
262
337
  fd = undefined; // fall back to discarding output rather than failing the restart
263
338
  }
339
+ // A compiled binary has no cli.js on disk: `botmuxCliEntryAt` would hand back a
340
+ // path that does not exist (measured: "/dist/cli.js"), and passing it shifts the
341
+ // subcommand out of argv[2]. buildRestartLauncher drops it in that mode; we
342
+ // still compute it for the Node path, which is unchanged.
343
+ const standalone = isStandaloneBinary();
264
344
  const cliEntry = activePackageRoot ? botmuxCliEntryAt(activePackageRoot) : botmuxCliEntry();
265
- const { cmd, args } = buildRestartLauncher(process.execPath, cliEntry, setsidAvailable());
345
+ // A package-manager-owned binary's own path can be versioned (pnpm store); after
346
+ // the update the stable launcher points at the new one while execPath does not.
347
+ const launcher = globalWrapperPath();
348
+ const executable = resolveStandaloneRestartExecutable(standalone, process.execPath, standalone ? currentBinaryInstallShape() : 'unknown', launcher, existsSync(launcher));
349
+ const { cmd, args } = buildRestartLauncher(executable, cliEntry, setsidAvailable(), standalone);
266
350
  const child = spawn(cmd, args, {
267
351
  detached: true,
268
352
  stdio: fd !== undefined ? ['ignore', fd, fd] : 'ignore',
@@ -290,11 +374,45 @@ export function spawnDetachedRestart(reason, activePackageRoot, restartLeaseId)
290
374
  }
291
375
  return child;
292
376
  }
377
+ /**
378
+ * Perform a binary self-replace in a CHILD process and block until it finishes.
379
+ *
380
+ * WHY A CHILD AND NOT AN `await` HERE: `runMaintenanceTick` is synchronous and
381
+ * runs inside `withFileLockSync`, so it cannot await the download. Re-execing this
382
+ * same binary with a hidden `__self-update` subcommand keeps the lock semantics
383
+ * byte-identical to the package-manager branch (spawn one child, wait, throw on a
384
+ * non-zero exit) without turning the whole tick async — which would change the
385
+ * locking shape for the npm path too, the one that is currently working.
386
+ *
387
+ * Returns the version that was installed (printed by the child on its last line),
388
+ * or '' when the child reported success without a parseable version.
389
+ */
390
+ export function runSelfReplaceBlocking(version = 'latest') {
391
+ const result = spawnSync(process.execPath, ['__self-update', version], {
392
+ cwd: globalInstallUpdateCwd(),
393
+ env: process.env,
394
+ encoding: 'utf-8',
395
+ // The download is ~100MB+ over a possibly proxied link; the package-manager
396
+ // branch has no timeout either (npm's own) so match that and let the outer
397
+ // schedule slip a day rather than killing a partial swap.
398
+ maxBuffer: 1024 * 1024,
399
+ });
400
+ if (result.error)
401
+ throw result.error;
402
+ if (result.status !== 0) {
403
+ const detail = (result.stderr || result.stdout || '').trim().split('\n').slice(-3).join('; ');
404
+ throw new Error(`self-update exited with ${result.status ?? result.signal ?? 'unknown status'}${detail ? `: ${detail}` : ''}`);
405
+ }
406
+ const m = /BOTMUX_SELF_UPDATE_VERSION=(\S+)/.exec(result.stdout || '');
407
+ return m?.[1] ?? '';
408
+ }
293
409
  function productionDeps() {
294
410
  // Kept after a successful resolve so post-pnpm-update version/restart lookups
295
411
  // use the stable global node_modules/botmux symlink, not the removed
296
412
  // .pnpm/botmux@old runtime realpath.
297
413
  let installPlan;
414
+ // What runUpdate installed, for both strategies (see MaintenanceDeps.installedVersion).
415
+ let installedTo = '';
298
416
  return {
299
417
  now: () => Date.now(),
300
418
  readConfig: () => readGlobalConfig().maintenance,
@@ -311,9 +429,32 @@ function productionDeps() {
311
429
  ? botmuxVersionAt(installPlan.activePackageRoot)
312
430
  : botmuxVersion(),
313
431
  runUpdate: () => {
314
- installPlan ??= resolveGlobalInstallPlan();
432
+ installedTo = '';
433
+ const strategy = currentUpdateStrategy(botmuxInstallRoot());
434
+ if (strategy.kind === 'unsupported') {
435
+ throw new UnsupportedGlobalInstallError('unknown', process.execPath);
436
+ }
437
+ if (strategy.kind === 'self-replace') {
438
+ // The compiled binary owns its own file (install.sh location). The tick
439
+ // is synchronous and holds a cross-process lock, so run the async
440
+ // download to completion here rather than restructuring the whole tick:
441
+ // `runSelfReplaceBlocking` re-execs this binary with a hidden subcommand
442
+ // that performs the swap, which keeps the lock semantics identical to the
443
+ // package-manager branch (one child, awaited, non-zero exit ⇒ throw).
444
+ installedTo = runSelfReplaceBlocking();
445
+ return;
446
+ }
447
+ installPlan ??= resolveGlobalInstallPlan(strategy.packageRoot);
315
448
  installLatestBotmuxSync(installPlan);
449
+ // Report what landed on DISK. For a compiled binary installed by a package
450
+ // manager, `currentVersion()` (→ botmuxVersionAt) returns this process's
451
+ // BAKED version and so cannot see the update npm just performed — measured,
452
+ // and it would make the tick log "already on the latest version" and skip the
453
+ // restart. diskVersionAt deliberately ignores the baked value. Under Node the
454
+ // two agree, so this is a no-op there.
455
+ installedTo = diskVersionAt(installPlan.activePackageRoot);
316
456
  },
457
+ installedVersion: () => installedTo,
317
458
  writeIntent: (intent) => writeRestartIntent(intent),
318
459
  triggerRestart: () => {
319
460
  const leaseId = claimRestartLease();
@@ -1 +1 @@
1
- {"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../src/core/maintenance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../src/core/maintenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type IncomingMessage } from 'node:http';
2
+ /** Resolve an outbound proxy: explicit config wins, then the standard env vars
3
+ * (which Node's global fetch ignores — the whole reason we hand-roll this). */
4
+ export declare function resolveHttpProxy(): string | undefined;
5
+ /**
6
+ * GET a URL and resolve with the 200 response stream, following redirects and
7
+ * optionally tunnelling through an HTTP proxy.
8
+ *
9
+ * @param userAgent sent as `user-agent`; callers pass their own tag so server-side
10
+ * logs can tell the game assets apart from a self-update.
11
+ */
12
+ export declare function getReleaseStream(rawUrl: string, proxy: string | undefined, userAgent: string, redirectsLeft?: number): Promise<IncomingMessage>;
13
+ //# sourceMappingURL=release-download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-download.d.ts","sourceRoot":"","sources":["../../src/core/release-download.ts"],"names":[],"mappings":"AAqBA,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAKzE;gFACgF;AAChF,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAKrD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,EACjB,aAAa,SAAI,GAChB,OAAO,CAAC,eAAe,CAAC,CAuE1B"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Shared release-asset download: GET a URL through an optional proxy, following
3
+ * redirects, and resolve with the 200 response stream.
4
+ *
5
+ * Extracted from `dashboard/hd2d-assets.ts` so the binary self-update
6
+ * (`core/binary-self-update.ts`) reuses exactly this transport instead of
7
+ * growing a second copy. Both callers fetch GitHub Release assets, and both need
8
+ * the same three things the naive version gets wrong:
9
+ *
10
+ * · `node:http`/`node:https` rather than `fetch`, so an explicitly configured
11
+ * proxy is actually honoured — undici ignores the proxy env vars, and Bun's
12
+ * fetch goes the other way and honours them too eagerly (see
13
+ * `core/loopback-fetch.ts` for that direction).
14
+ * · CONNECT tunnelling for HTTPS-via-HTTP-proxy.
15
+ * · Tearing down each hop before following a redirect: a lingering TLS socket
16
+ * layered over a CONNECT tunnel stalls the NEXT hop's handshake (observed:
17
+ * github.com → release-assets… drops with "socket disconnected before secure
18
+ * TLS" unless hop 1 is closed). GitHub Release downloads ALWAYS redirect, so
19
+ * this is the normal path, not an edge case.
20
+ */
21
+ import { request as httpsRequest } from 'node:https';
22
+ import { request as httpRequest } from 'node:http';
23
+ import { connect as tlsConnect } from 'node:tls';
24
+ import { Buffer } from 'node:buffer';
25
+ import { readGlobalConfig } from '../global-config.js';
26
+ /** Resolve an outbound proxy: explicit config wins, then the standard env vars
27
+ * (which Node's global fetch ignores — the whole reason we hand-roll this). */
28
+ export function resolveHttpProxy() {
29
+ return readGlobalConfig().httpProxy
30
+ || process.env.HTTPS_PROXY || process.env.https_proxy
31
+ || process.env.HTTP_PROXY || process.env.http_proxy
32
+ || undefined;
33
+ }
34
+ /**
35
+ * GET a URL and resolve with the 200 response stream, following redirects and
36
+ * optionally tunnelling through an HTTP proxy.
37
+ *
38
+ * @param userAgent sent as `user-agent`; callers pass their own tag so server-side
39
+ * logs can tell the game assets apart from a self-update.
40
+ */
41
+ export function getReleaseStream(rawUrl, proxy, userAgent, redirectsLeft = 5) {
42
+ return new Promise((resolve, reject) => {
43
+ let target;
44
+ try {
45
+ target = new URL(rawUrl);
46
+ }
47
+ catch {
48
+ reject(new Error(`URL 非法: ${rawUrl}`));
49
+ return;
50
+ }
51
+ const isHttps = target.protocol === 'https:';
52
+ const handle = (res) => {
53
+ const sc = res.statusCode ?? 0;
54
+ if (sc >= 300 && sc < 400 && res.headers.location) {
55
+ // Tear down this hop's connection before following the redirect (see header).
56
+ res.destroy();
57
+ res.socket?.destroy();
58
+ if (redirectsLeft <= 0) {
59
+ reject(new Error('重定向次数过多'));
60
+ return;
61
+ }
62
+ resolve(getReleaseStream(new URL(res.headers.location, rawUrl).toString(), proxy, userAgent, redirectsLeft - 1));
63
+ return;
64
+ }
65
+ if (sc !== 200) {
66
+ res.resume();
67
+ reject(new Error(`HTTP ${sc}`));
68
+ return;
69
+ }
70
+ resolve(res);
71
+ };
72
+ let p;
73
+ if (proxy) {
74
+ try {
75
+ p = new URL(proxy);
76
+ }
77
+ catch {
78
+ reject(new Error(`代理地址非法: ${proxy}`));
79
+ return;
80
+ }
81
+ }
82
+ const proxyAuth = () => p?.username
83
+ ? { 'proxy-authorization': `Basic ${Buffer.from(`${decodeURIComponent(p.username)}:${decodeURIComponent(p.password)}`).toString('base64')}` }
84
+ : {};
85
+ if (p && isHttps) {
86
+ // HTTPS via HTTP proxy: open a CONNECT tunnel, then TLS over the socket.
87
+ const port = target.port || '443';
88
+ const creq = httpRequest({
89
+ host: p.hostname, port: Number(p.port || 80), method: 'CONNECT', agent: false,
90
+ path: `${target.hostname}:${port}`,
91
+ headers: { host: `${target.hostname}:${port}`, ...proxyAuth() },
92
+ });
93
+ creq.on('connect', (cres, socket) => {
94
+ if (cres.statusCode !== 200) {
95
+ reject(new Error(`代理 CONNECT 失败: HTTP ${cres.statusCode}`));
96
+ return;
97
+ }
98
+ const tls = tlsConnect({ socket, servername: target.hostname }, () => {
99
+ const greq = httpsRequest({
100
+ method: 'GET', path: `${target.pathname}${target.search}`,
101
+ headers: { host: target.host, 'user-agent': userAgent },
102
+ createConnection: () => tls,
103
+ }, handle);
104
+ greq.on('error', reject);
105
+ greq.end();
106
+ });
107
+ tls.on('error', reject);
108
+ });
109
+ creq.on('error', reject);
110
+ creq.end();
111
+ return;
112
+ }
113
+ if (p) {
114
+ // Plain HTTP via proxy: send the absolute-form request line to the proxy.
115
+ const greq = httpRequest({
116
+ host: p.hostname, port: Number(p.port || 80), method: 'GET', path: rawUrl,
117
+ headers: { host: target.host, 'user-agent': userAgent, ...proxyAuth() },
118
+ }, handle);
119
+ greq.on('error', reject);
120
+ greq.end();
121
+ return;
122
+ }
123
+ // Direct (no proxy).
124
+ const mod = isHttps ? httpsRequest : httpRequest;
125
+ const greq = mod(rawUrl, { headers: { 'user-agent': userAgent } }, handle);
126
+ greq.on('error', reject);
127
+ greq.end();
128
+ });
129
+ }
130
+ //# sourceMappingURL=release-download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-download.js","sourceRoot":"","sources":["../../src/core/release-download.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { resolveHttpProxy } from '../core/release-download.js';
2
+ export { resolveHttpProxy };
1
3
  export declare const HD2D_ASSETS_TAG = "hd2d-assets-v2";
2
4
  export declare const HD2D_CACHE_DIR: string;
3
5
  export type Hd2dState = 'absent' | 'downloading' | 'ready' | 'error';
@@ -11,9 +13,6 @@ export interface Hd2dStatus {
11
13
  * allow-list (defends the static route against path games). */
12
14
  export declare function hd2dAssetPath(name: string): string | null;
13
15
  export declare function hd2dStatus(): Hd2dStatus;
14
- /** Resolve an outbound proxy: explicit config wins, then the standard env vars
15
- * (which Node's global fetch ignores — the whole reason we hand-roll this). */
16
- export declare function resolveHttpProxy(): string | undefined;
17
16
  /** Idempotently kick off the asset download. Returns the current status
18
17
  * immediately; callers poll `/api/game/status` for progress. */
19
18
  export declare function startHd2dDownload(): Hd2dStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"hd2d-assets.d.ts","sourceRoot":"","sources":["../../src/dashboard/hd2d-assets.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAahD,eAAO,MAAM,cAAc,QAA+D,CAAC;AAG3F,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;AACrE,MAAM,WAAW,UAAU;IAAG,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAMjG;gEACgE;AAChE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzD;AAOD,wBAAgB,UAAU,IAAI,UAAU,CAKvC;AAQD;gFACgF;AAChF,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAKrD;AA2GD;iEACiE;AACjE,wBAAgB,iBAAiB,IAAI,UAAU,CAiB9C"}
1
+ {"version":3,"file":"hd2d-assets.d.ts","sourceRoot":"","sources":["../../src/dashboard/hd2d-assets.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAoB,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAMjF,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAahD,eAAO,MAAM,cAAc,QAA+D,CAAC;AAG3F,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;AACrE,MAAM,WAAW,UAAU;IAAG,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAMjG;gEACgE;AAChE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzD;AAOD,wBAAgB,UAAU,IAAI,UAAU,CAKvC;AAiCD;iEACiE;AACjE,wBAAgB,iBAAiB,IAAI,UAAU,CAiB9C"}