sensorium-mcp 3.1.0-refactor.18 → 3.1.0-refactor.20

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 (150) hide show
  1. package/dist/config/agent-settings.d.ts +6 -0
  2. package/dist/config/agent-settings.d.ts.map +1 -1
  3. package/dist/config/agent-settings.js +22 -0
  4. package/dist/config/agent-settings.js.map +1 -1
  5. package/dist/config/detail-grant.d.ts +39 -0
  6. package/dist/config/detail-grant.d.ts.map +1 -0
  7. package/dist/config/detail-grant.js +61 -0
  8. package/dist/config/detail-grant.js.map +1 -0
  9. package/dist/config/index.d.ts +1 -0
  10. package/dist/config/index.d.ts.map +1 -1
  11. package/dist/config/index.js +3 -3
  12. package/dist/config/index.js.map +1 -1
  13. package/dist/config/settings-store.d.ts.map +1 -1
  14. package/dist/config/settings-store.js +2 -3
  15. package/dist/config/settings-store.js.map +1 -1
  16. package/dist/dashboard/routes/copilot.d.ts.map +1 -1
  17. package/dist/dashboard/routes/copilot.js +17 -1
  18. package/dist/dashboard/routes/copilot.js.map +1 -1
  19. package/dist/dashboard/routes/threads-read.d.ts.map +1 -1
  20. package/dist/dashboard/routes/threads-read.js +15 -3
  21. package/dist/dashboard/routes/threads-read.js.map +1 -1
  22. package/dist/dashboard/routes/threads.d.ts.map +1 -1
  23. package/dist/dashboard/routes/threads.js +13 -4
  24. package/dist/dashboard/routes/threads.js.map +1 -1
  25. package/dist/dashboard/routes.d.ts.map +1 -1
  26. package/dist/dashboard/routes.js +11 -4
  27. package/dist/dashboard/routes.js.map +1 -1
  28. package/dist/dashboard/spa.html +11 -11
  29. package/dist/data/daily-marker.js +3 -3
  30. package/dist/data/daily-marker.js.map +1 -1
  31. package/dist/data/file-storage.d.ts.map +1 -1
  32. package/dist/data/file-storage.js +3 -3
  33. package/dist/data/file-storage.js.map +1 -1
  34. package/dist/data/memory/bootstrap.d.ts.map +1 -1
  35. package/dist/data/memory/bootstrap.js +2 -3
  36. package/dist/data/memory/bootstrap.js.map +1 -1
  37. package/dist/data/memory/migration-runner.d.ts.map +1 -1
  38. package/dist/data/memory/migration-runner.js +2 -3
  39. package/dist/data/memory/migration-runner.js.map +1 -1
  40. package/dist/data/memory/schema.js +2 -2
  41. package/dist/data/memory/schema.js.map +1 -1
  42. package/dist/index.js +54 -21
  43. package/dist/index.js.map +1 -1
  44. package/dist/lib/logger.d.ts.map +1 -1
  45. package/dist/lib/logger.js +21 -2
  46. package/dist/lib/logger.js.map +1 -1
  47. package/dist/lib/paths.d.ts +29 -0
  48. package/dist/lib/paths.d.ts.map +1 -0
  49. package/dist/lib/paths.js +36 -0
  50. package/dist/lib/paths.js.map +1 -0
  51. package/dist/server/factory.js +16 -6
  52. package/dist/server/factory.js.map +1 -1
  53. package/dist/server/http-server.d.ts.map +1 -1
  54. package/dist/server/http-server.js +22 -7
  55. package/dist/server/http-server.js.map +1 -1
  56. package/dist/services/agent-spawn.service.d.ts +3 -3
  57. package/dist/services/agent-spawn.service.d.ts.map +1 -1
  58. package/dist/services/agent-spawn.service.js +30 -9
  59. package/dist/services/agent-spawn.service.js.map +1 -1
  60. package/dist/services/background-runner.d.ts.map +1 -1
  61. package/dist/services/background-runner.js +22 -12
  62. package/dist/services/background-runner.js.map +1 -1
  63. package/dist/services/broker-client.d.ts +209 -0
  64. package/dist/services/broker-client.d.ts.map +1 -0
  65. package/dist/services/broker-client.js +359 -0
  66. package/dist/services/broker-client.js.map +1 -0
  67. package/dist/services/claude-spawn.service.d.ts +1 -1
  68. package/dist/services/claude-spawn.service.d.ts.map +1 -1
  69. package/dist/services/claude-spawn.service.js +25 -25
  70. package/dist/services/claude-spawn.service.js.map +1 -1
  71. package/dist/services/codex-spawn.service.d.ts +1 -1
  72. package/dist/services/codex-spawn.service.d.ts.map +1 -1
  73. package/dist/services/codex-spawn.service.js +19 -24
  74. package/dist/services/codex-spawn.service.js.map +1 -1
  75. package/dist/services/copilot-spawn.service.d.ts +1 -1
  76. package/dist/services/copilot-spawn.service.d.ts.map +1 -1
  77. package/dist/services/copilot-spawn.service.js +45 -36
  78. package/dist/services/copilot-spawn.service.js.map +1 -1
  79. package/dist/services/dispatcher/broker.d.ts +4 -3
  80. package/dist/services/dispatcher/broker.d.ts.map +1 -1
  81. package/dist/services/dispatcher/broker.js +23 -11
  82. package/dist/services/dispatcher/broker.js.map +1 -1
  83. package/dist/services/dispatcher/lock.js +2 -2
  84. package/dist/services/dispatcher/lock.js.map +1 -1
  85. package/dist/services/dispatcher/poller.d.ts.map +1 -1
  86. package/dist/services/dispatcher/poller.js +24 -5
  87. package/dist/services/dispatcher/poller.js.map +1 -1
  88. package/dist/services/flight-recorder.service.d.ts.map +1 -1
  89. package/dist/services/flight-recorder.service.js +43 -5
  90. package/dist/services/flight-recorder.service.js.map +1 -1
  91. package/dist/services/keeper.service.d.ts +9 -0
  92. package/dist/services/keeper.service.d.ts.map +1 -1
  93. package/dist/services/keeper.service.js +158 -34
  94. package/dist/services/keeper.service.js.map +1 -1
  95. package/dist/services/maintenance-signal.d.ts.map +1 -1
  96. package/dist/services/maintenance-signal.js +2 -3
  97. package/dist/services/maintenance-signal.js.map +1 -1
  98. package/dist/services/process.service.d.ts +76 -61
  99. package/dist/services/process.service.d.ts.map +1 -1
  100. package/dist/services/process.service.js +224 -608
  101. package/dist/services/process.service.js.map +1 -1
  102. package/dist/services/reconnect-snapshot.service.js +2 -2
  103. package/dist/services/reconnect-snapshot.service.js.map +1 -1
  104. package/dist/services/scheduler.d.ts +1 -0
  105. package/dist/services/scheduler.d.ts.map +1 -1
  106. package/dist/services/scheduler.js +69 -14
  107. package/dist/services/scheduler.js.map +1 -1
  108. package/dist/services/self-update.service.d.ts +14 -3
  109. package/dist/services/self-update.service.d.ts.map +1 -1
  110. package/dist/services/self-update.service.js +143 -74
  111. package/dist/services/self-update.service.js.map +1 -1
  112. package/dist/services/spawn-common.d.ts +49 -23
  113. package/dist/services/spawn-common.d.ts.map +1 -1
  114. package/dist/services/spawn-common.js +262 -47
  115. package/dist/services/spawn-common.js.map +1 -1
  116. package/dist/services/spawn-exit-watcher.d.ts +43 -0
  117. package/dist/services/spawn-exit-watcher.d.ts.map +1 -0
  118. package/dist/services/spawn-exit-watcher.js +127 -0
  119. package/dist/services/spawn-exit-watcher.js.map +1 -0
  120. package/dist/services/thread-health.service.d.ts +1 -1
  121. package/dist/services/thread-health.service.d.ts.map +1 -1
  122. package/dist/services/thread-health.service.js +11 -7
  123. package/dist/services/thread-health.service.js.map +1 -1
  124. package/dist/services/thread-lifecycle.service.js +2 -2
  125. package/dist/services/thread-lifecycle.service.js.map +1 -1
  126. package/dist/services/worker-cleanup.service.d.ts.map +1 -1
  127. package/dist/services/worker-cleanup.service.js +25 -99
  128. package/dist/services/worker-cleanup.service.js.map +1 -1
  129. package/dist/test-bootstrap.d.ts +39 -0
  130. package/dist/test-bootstrap.d.ts.map +1 -0
  131. package/dist/test-bootstrap.js +78 -0
  132. package/dist/test-bootstrap.js.map +1 -0
  133. package/dist/tools/defs/session-defs.js +1 -1
  134. package/dist/tools/defs/session-defs.js.map +1 -1
  135. package/dist/tools/defs/utility-defs.d.ts.map +1 -1
  136. package/dist/tools/defs/utility-defs.js +4 -3
  137. package/dist/tools/defs/utility-defs.js.map +1 -1
  138. package/dist/tools/delegate-tool.d.ts +1 -1
  139. package/dist/tools/delegate-tool.d.ts.map +1 -1
  140. package/dist/tools/delegate-tool.js +37 -6
  141. package/dist/tools/delegate-tool.js.map +1 -1
  142. package/dist/tools/session-tools.d.ts.map +1 -1
  143. package/dist/tools/session-tools.js +26 -9
  144. package/dist/tools/session-tools.js.map +1 -1
  145. package/dist/tools/utility-tools.js +1 -1
  146. package/dist/tools/utility-tools.js.map +1 -1
  147. package/dist/tools/wait/message-delivery.d.ts.map +1 -1
  148. package/dist/tools/wait/message-delivery.js +1 -2
  149. package/dist/tools/wait/message-delivery.js.map +1 -1
  150. package/package.json +2 -2
@@ -1,7 +1,15 @@
1
1
  /**
2
2
  * Self-update service — polls the npm registry for the version published on
3
- * the update channel and performs a graceful self-spawn update on ANY version
4
- * mismatch (newer OR older — the latter is the channel-switch rollback path).
3
+ * the update channel and triggers a graceful update on ANY version mismatch
4
+ * (newer OR older — the latter is the channel-switch rollback path).
5
+ *
6
+ * Single lifecycle owner (plan §4.5, Phase 4): this service no longer spawns
7
+ * its own replacement. It quiesces the agents, then asks the supervisor
8
+ * (POST /restart) to run the shared teardown/respawn choreography — the spawn
9
+ * command re-resolves the channel version by itself (npx). The pre-Phase-4
10
+ * self-spawn path survives only as the legacy fallback for dev mode without a
11
+ * supervisor, gated by the same SENSORIUM_BROKER_SPAWN cutover flag the spawn
12
+ * services use (see brokerSpawnMode in spawn-common.ts).
5
13
  *
6
14
  * Entry point: startSelfUpdatePoller({ pkgVersion, httpPort })
7
15
  * Call once after the HTTP server is listening (HTTP mode only).
@@ -11,7 +19,10 @@
11
19
  * SELF_UPDATE_POLL_INTERVAL_MS Registry check interval (default: 60000)
12
20
  * SELF_UPDATE_MIN_UPTIME_MS Min uptime before first update (default: 600000)
13
21
  * SELF_UPDATE_GRACE_MS Grace period for agents to observe flag (default: 30000)
14
- * MCP_START_COMMAND Replacement spawn command (default: npx -y sensorium-mcp@<target> --prefer-online)
22
+ * SENSORIUM_BROKER_SPAWN Cutover flag: 1/required = supervisor-only,
23
+ * 0/off = legacy self-spawn, unset = auto
24
+ * MCP_START_COMMAND Legacy-path replacement spawn command
25
+ * (default: npx -y sensorium-mcp@<target> --prefer-online)
15
26
  *
16
27
  * Update channel:
17
28
  * Derived from MCP_START_COMMAND — the npm spec tag in "sensorium-mcp@<tag>"
@@ -23,26 +34,38 @@
23
34
  */
24
35
  import { spawn } from "node:child_process";
25
36
  import { closeSync, mkdirSync, openSync, unlinkSync, writeFileSync } from "node:fs";
26
- import { homedir } from "node:os";
27
37
  import { join } from "node:path";
28
38
  import { log } from "../lib/logger.js";
39
+ import { dataDir } from "../lib/paths.js";
29
40
  import { emitMaintenanceSignal, hasObservedMaintenance } from "./maintenance-signal.js";
30
41
  import { writeReconnectSnapshot } from "./reconnect-snapshot.service.js";
31
42
  import { getActiveThreadIds } from "./process.service.js";
32
43
  import { getLiveWaitingThreadIds } from "../sessions/dashboard-registry.js";
44
+ import { brokerRequestRestart } from "./broker-client.js";
45
+ import { brokerSpawnMode } from "./spawn-common.js";
33
46
  // ---------------------------------------------------------------------------
34
47
  // Module-level state
35
48
  // ---------------------------------------------------------------------------
36
- const DATA_DIR = join(homedir(), ".remote-copilot-mcp");
49
+ const DATA_DIR = dataDir();
37
50
  const FLAG_PATH = join(DATA_DIR, "maintenance.flag");
38
51
  /** Poller state: the config trio is set once by startSelfUpdatePoller;
39
- * updateInProgress is the re-entrancy guard for check/update cycles. */
52
+ * updateInProgress is the re-entrancy guard for check/update cycles;
53
+ * restartDelegatedAt records when the supervisor accepted a restart — this
54
+ * process is then living on borrowed time until the supervisor kills it, and
55
+ * the poller must not fire another update cycle in the interim. */
40
56
  const state = {
41
57
  updateInProgress: false,
58
+ restartDelegatedAt: 0,
42
59
  currentVersion: "",
43
60
  httpPort: 0,
44
61
  beforeSpawnHook: null,
45
62
  };
63
+ // How long a supervisor-accepted restart may leave this process alive before
64
+ // the poller concludes the teardown failed (e.g. the kill EPERM-failed — the
65
+ // exact unkillable class this machine has produced) and resumes update polling.
66
+ // Generous: the supervisor's own ready-timeout is 5 min, so 15 min of still
67
+ // being alive means the restart is not coming. Self-healing over latching dead.
68
+ const DELEGATED_RESTART_GRACE_MS = 15 * 60 * 1000;
46
69
  // ---------------------------------------------------------------------------
47
70
  // Helpers
48
71
  // ---------------------------------------------------------------------------
@@ -181,15 +204,17 @@ export async function getRemoteVersion() {
181
204
  }
182
205
  }
183
206
  /**
184
- * Full update sequence:
207
+ * Full update sequence (plan §4.5 — the supervisor owns the mechanics):
185
208
  * 1. Write maintenance flag (wakes all active poll loops via fs.watch)
186
209
  * 2. Emit in-process signal (belt-and-suspenders for loops not using fs.watch)
187
210
  * 3. Grace period (agents observe flag and return maintenance response)
188
- * 4. Write reconnect snapshot
189
- * 5. Spawn replacement process (detached)
190
- * 7. Poll health endpoint until new server responds with targetVersion
191
- * 8a. Healthy → remove flag, exit(0) (new server already wrote its own server.pid)
192
- * 8b. Unhealthy → kill child, remove flag, abort (MCP continues on current version)
211
+ * 4. ACK-gated quiesce, then write reconnect snapshot
212
+ * 5. POST /restart to the supervisor → 202, and THIS process just keeps
213
+ * serving until the supervisor tears it down and respawns the channel
214
+ * version. The supervisor owns the maintenance flag from here (it rewrites
215
+ * it and always clears it after the respawn) — we must not touch it again.
216
+ * Fallback (supervisor unreachable / old binary without /restart): the
217
+ * legacy self-spawn path, allowed only outside "required" broker mode.
193
218
  */
194
219
  async function performUpdate(targetVersion) {
195
220
  state.updateInProgress = true;
@@ -200,9 +225,12 @@ async function performUpdate(targetVersion) {
200
225
  // Write maintenance flag
201
226
  try {
202
227
  mkdirSync(DATA_DIR, { recursive: true });
228
+ // `timestamp` is what checkMaintenanceFlag's 5-min stale auto-clear keys
229
+ // on (and what the supervisor's MaintenanceFlagWriter writes) — without it
230
+ // a flag leaked by a failed update would suppress agents forever.
203
231
  writeFileSync(FLAG_PATH, JSON.stringify({
204
232
  version: targetVersion,
205
- writtenAt: new Date().toISOString(),
233
+ timestamp: new Date().toISOString(),
206
234
  }));
207
235
  }
208
236
  catch (err) {
@@ -222,7 +250,7 @@ async function performUpdate(targetVersion) {
222
250
  await quiesceAgents();
223
251
  // Write reconnect snapshot so the new instance offers lightweight reconnect
224
252
  try {
225
- const threadIds = getActiveThreadIds();
253
+ const threadIds = await getActiveThreadIds();
226
254
  if (threadIds.length > 0) {
227
255
  writeReconnectSnapshot(threadIds);
228
256
  }
@@ -230,73 +258,33 @@ async function performUpdate(targetVersion) {
230
258
  catch (err) {
231
259
  log.warn(`[self-update] Reconnect snapshot failed (non-fatal): ${err}`);
232
260
  }
233
- // Close existing HTTP server to free the port for the replacement process
234
- const beforeSpawn = state.beforeSpawnHook;
235
- if (beforeSpawn) {
236
- log.info("[self-update] Closing HTTP server to free port...");
237
- await beforeSpawn();
238
- }
239
- // Spawn the replacement process (detached so it survives our exit)
240
- // Pin exact version to bypass stale npx cache (EPERM prevents cache clear on Windows)
241
- const defaultCmd = `npx -y sensorium-mcp@${targetVersion} --prefer-online`;
242
- const cmd = process.env.MCP_START_COMMAND ?? defaultCmd;
243
- log.info(`[self-update] Spawning replacement: ${cmd}`);
244
- const spawnLogPath = join(DATA_DIR, "update-spawn.log");
245
- mkdirSync(DATA_DIR, { recursive: true });
246
- const logFd = openSync(spawnLogPath, "a");
247
- const child = spawn(cmd, [], {
248
- detached: true,
249
- shell: true,
250
- stdio: ["ignore", logFd, logFd],
251
- env: { ...process.env },
252
- });
253
- closeSync(logFd);
254
- child.unref();
255
- if (child.pid == null) {
256
- throw new Error("Spawned child process has no PID — cannot proceed");
257
- }
258
- log.info(`[self-update] Replacement PID=${child.pid}, polling health on port ${state.httpPort}…`);
259
- const healthy = await waitForHealthy(state.httpPort, targetVersion);
260
- if (healthy) {
261
- // The new server writes its own server.pid on startup (index.ts) with the
262
- // real node PID. Do NOT overwrite here — child.pid is the transient shell
263
- // PID on both Windows (cmd.exe) and Unix (/bin/sh), dead by this point.
264
- // Remove maintenance flag — watcher MCPs unblock, new keepAlive threads start
265
- try {
266
- unlinkSync(FLAG_PATH);
267
- }
268
- catch {
269
- /* best-effort */
270
- }
271
- log.info(`[self-update] Update to v${targetVersion} complete. Exiting.`);
272
- process.exit(0);
273
- }
274
- else {
275
- log.error("[self-update] New process failed to become healthy. Aborting update.");
276
- // On Windows with shell:true, child.pid is the transient cmd.exe shell (already dead).
277
- // Attempt kill anyway, then fall back to port-based kill on Windows.
278
- try {
279
- child.kill();
261
+ // Delegate the restart to the supervisor — the single process-lifecycle
262
+ // owner. It answers 202 and then runs the shared teardown/respawn
263
+ // choreography (PrepareShutdown → kill → spawn → wait-ready → clear flag);
264
+ // the spawn command re-resolves the channel version via npx by itself.
265
+ const mode = brokerSpawnMode();
266
+ if (mode !== "off") {
267
+ const verdict = await brokerRequestRestart(`self-update v${state.currentVersion} -> v${targetVersion}`);
268
+ if (verdict !== null) {
269
+ state.restartDelegatedAt = Date.now();
270
+ log.info(`[self-update] Restart ${verdict === "accepted" ? "delegated to" : "already in progress at"} the supervisor — awaiting teardown (it owns the maintenance flag now).`);
271
+ return;
280
272
  }
281
- catch {
282
- /* may already be dead */
283
- }
284
- if (process.platform === "win32") {
273
+ if (mode === "required") {
274
+ // No fallback allowed and no restart is coming: unblock the agents by
275
+ // clearing our flag and retry on a later poll cycle.
276
+ log.error("[self-update] Supervisor unreachable (or predates /restart) and SENSORIUM_BROKER_SPAWN=required — update aborted, will retry next poll.");
285
277
  try {
286
- const { execSync } = await import("node:child_process");
287
- // Find and kill whatever is bound to our HTTP port
288
- execSync(`for /f "tokens=5" %a in ('netstat -ano ^| findstr :${state.httpPort} ^| findstr LISTENING') do taskkill /F /PID %a`, { shell: "cmd.exe", stdio: "ignore", timeout: 10_000 });
289
- log.info(`[self-update] Killed orphan process on port ${state.httpPort}`);
278
+ unlinkSync(FLAG_PATH);
290
279
  }
291
280
  catch {
292
- log.warn(`[self-update] Could not kill orphan on port ${state.httpPort} — manual cleanup may be needed`);
281
+ /* best-effort */
293
282
  }
283
+ return;
294
284
  }
295
- // Leave maintenance.flag intact so supervisor doesn't immediately race
296
- // with an orphaned spawned child that may still be starting.
297
- log.error("[self-update] Exiting (HTTP server closed, cannot recover). Supervisor will restart.");
298
- process.exit(1);
285
+ log.warn("[self-update] Supervisor unreachable (or predates /restart) — falling back to legacy self-spawn so an old supervisor binary cannot strand updates.");
299
286
  }
287
+ await legacySelfSpawnUpdate(targetVersion);
300
288
  }
301
289
  catch (err) {
302
290
  log.error(`[self-update] Update sequence failed: ${err}`);
@@ -311,11 +299,92 @@ async function performUpdate(targetVersion) {
311
299
  state.updateInProgress = false;
312
300
  }
313
301
  }
302
+ /**
303
+ * Legacy self-spawn update (pre-Phase-4): close the HTTP listener, spawn the
304
+ * replacement ourselves, health-poll it, and exit. Kept ONLY for dev mode
305
+ * without a supervisor (SENSORIUM_BROKER_SPAWN=off / non-Windows) and as the
306
+ * auto-mode fallback behind an old supervisor binary. The netstat/taskkill
307
+ * orphan-hunt this path once had is gone — no shell-outs anywhere in the stack
308
+ * (plan §3.2); a failed replacement is now cleaned up by whoever owns process
309
+ * mechanics (the supervisor's kill-by-port on its next restart) or manually in
310
+ * true dev mode.
311
+ */
312
+ async function legacySelfSpawnUpdate(targetVersion) {
313
+ // Close existing HTTP server to free the port for the replacement process
314
+ const beforeSpawn = state.beforeSpawnHook;
315
+ if (beforeSpawn) {
316
+ log.info("[self-update] Closing HTTP server to free port...");
317
+ await beforeSpawn();
318
+ }
319
+ // Spawn the replacement process (detached so it survives our exit)
320
+ // Pin exact version to bypass stale npx cache (EPERM prevents cache clear on Windows)
321
+ const defaultCmd = `npx -y sensorium-mcp@${targetVersion} --prefer-online`;
322
+ const cmd = process.env.MCP_START_COMMAND ?? defaultCmd;
323
+ log.info(`[self-update] Spawning replacement (legacy self-spawn): ${cmd}`);
324
+ const spawnLogPath = join(DATA_DIR, "update-spawn.log");
325
+ mkdirSync(DATA_DIR, { recursive: true });
326
+ const logFd = openSync(spawnLogPath, "a");
327
+ const child = spawn(cmd, [], {
328
+ detached: true,
329
+ shell: true,
330
+ stdio: ["ignore", logFd, logFd],
331
+ env: { ...process.env },
332
+ });
333
+ closeSync(logFd);
334
+ child.unref();
335
+ if (child.pid == null) {
336
+ throw new Error("Spawned child process has no PID — cannot proceed");
337
+ }
338
+ log.info(`[self-update] Replacement PID=${child.pid}, polling health on port ${state.httpPort}…`);
339
+ const healthy = await waitForHealthy(state.httpPort, targetVersion);
340
+ if (healthy) {
341
+ // The new server writes its own server.pid on startup (index.ts) with the
342
+ // real node PID. Do NOT overwrite here — child.pid is the transient shell
343
+ // PID on both Windows (cmd.exe) and Unix (/bin/sh), dead by this point.
344
+ // Remove maintenance flag — watcher MCPs unblock, new keepAlive threads start
345
+ try {
346
+ unlinkSync(FLAG_PATH);
347
+ }
348
+ catch {
349
+ /* best-effort */
350
+ }
351
+ log.info(`[self-update] Update to v${targetVersion} complete. Exiting.`);
352
+ process.exit(0);
353
+ }
354
+ else {
355
+ log.error("[self-update] New process failed to become healthy. Aborting update.");
356
+ // On Windows with shell:true, child.pid is the transient cmd.exe shell
357
+ // (already dead) — this kill is best-effort only. The old netstat/taskkill
358
+ // port-hunt is deliberately gone (no shell-outs).
359
+ try {
360
+ child.kill();
361
+ }
362
+ catch {
363
+ /* may already be dead */
364
+ }
365
+ // Leave maintenance.flag intact so a supervisor (if any) doesn't immediately
366
+ // race with an orphaned spawned child that may still be starting.
367
+ log.error("[self-update] Exiting (HTTP server closed, cannot recover). Supervisor will restart.");
368
+ process.exit(1);
369
+ }
370
+ }
314
371
  /**
315
372
  * Run one check cycle: compare remote version to current and trigger update
316
373
  * on any mismatch (an older remote means the channel moved back — downgrade).
317
374
  */
318
375
  export async function checkForUpdate() {
376
+ // Once the supervisor has accepted a restart, this process is only alive
377
+ // until the teardown reaches it — don't start another update cycle. But a
378
+ // bounded wait, not a latch: if the teardown never arrives (kill failed and
379
+ // we survived), resume polling rather than staying pinned to a stale version
380
+ // forever. The orchestrator clears the maintenance flag even on failure, so
381
+ // a retry starts from a clean slate.
382
+ if (state.restartDelegatedAt !== 0) {
383
+ if (Date.now() - state.restartDelegatedAt < DELEGATED_RESTART_GRACE_MS)
384
+ return;
385
+ log.warn(`[self-update] Supervisor accepted a restart ${Math.round((Date.now() - state.restartDelegatedAt) / 60_000)}m ago but this process is still alive — teardown presumed failed, resuming update polling.`);
386
+ state.restartDelegatedAt = 0;
387
+ }
319
388
  if (state.updateInProgress)
320
389
  return;
321
390
  state.updateInProgress = true;
@@ -1 +1 @@
1
- {"version":3,"file":"self-update.service.js","sourceRoot":"","sources":["../../src/services/self-update.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAE5E,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,CAAC,CAAC;AACxD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AAErD;wEACwE;AACxE,MAAM,KAAK,GAAG;IACZ,gBAAgB,EAAE,KAAK;IACvB,cAAc,EAAE,EAAE;IAClB,QAAQ,EAAE,CAAC;IACX,eAAe,EAAE,IAA2C;CAC7D,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,8EAA8E;AAC9E,gFAAgF;AAChF,6BAA6B;AAC7B,MAAM,cAAc,GAAG,OAAO,CAAC;AAC/B,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,aAAa;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;IAC7C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACnF,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,oCAAoC,OAAO,CAAC,MAAM,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/F,MAAM,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IACD,GAAG,CAAC,IAAI,CACN,8BAA8B,cAAc,8CAA8C,CAC3F,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC5C,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO;IAE9B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,+BAA+B,KAAK,cAAc,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC/C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,qDAAqD,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,cAAc,CAC3B,IAAY,EACZ,aAAqB,EACrB,SAAS,GAAG,OAAO;IAEnB,MAAM,GAAG,GAAG,oBAAoB,IAAI,SAAS,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtE,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAuC,CAAC;gBACvE,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa;oBAAE,OAAO,IAAI,CAAC;gBAChD,yDAAyD;YAC3D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;8CAO8C;AAC9C,SAAS,gBAAgB;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAChD,MAAM,CAAC,GAAG,4CAA4C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnC,yEAAyE;QACzE,0EAA0E;QAC1E,GAAG,CAAC,IAAI,CACN,8DAA8D,GAAG,wBAAwB,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,4CAA4C,kBAAkB,CAAC,OAAO,CAAC,EAAE,EACzE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CACxC,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,GAAG,CAAC,IAAI,CACN,oCAAoC,QAAQ,CAAC,MAAM,iBAAiB,OAAO,cAAc,CAC1F,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC7D,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,KAAK,UAAU,aAAa,CAAC,aAAqB;IAChD,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC9B,IAAI,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,2BAA2B,KAAK,CAAC,cAAc,QAAQ,aAAa,EAAE,CAAC,CAAC;QAEjF,mDAAmD;QACnD,KAAK,cAAc,CAAC,4BAA4B,KAAK,CAAC,cAAc,QAAQ,aAAa,KAAK,CAAC,CAAC;QAEhG,yBAAyB;QACzB,IAAI,CAAC;YACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,aAAa,CACX,SAAS,EACT,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,mDAAmD,GAAG,EAAE,CAAC,CAAC;YACpE,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,mEAAmE;QACnE,qBAAqB,EAAE,CAAC;QAExB,mEAAmE;QACnE,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9E,GAAG,CAAC,IAAI,CAAC,+BAA+B,OAAO,IAAI,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QAErB,4EAA4E;QAC5E,qEAAqE;QACrE,oDAAoD;QACpD,MAAM,aAAa,EAAE,CAAC;QAEtB,4EAA4E;QAC5E,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;YACvC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,sBAAsB,CAAC,SAAS,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,wDAAwD,GAAG,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,0EAA0E;QAC1E,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,CAAC;QAC1C,IAAI,WAAW,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YAC9D,MAAM,WAAW,EAAE,CAAC;QACtB,CAAC;QAED,mEAAmE;QACnE,sFAAsF;QACtF,MAAM,UAAU,GAAG,wBAAwB,aAAa,kBAAkB,CAAC;QAC3E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,UAAU,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;QAEvD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QACxD,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE;YAC3B,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;YAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,GAAG,CAAC,IAAI,CACN,iCAAiC,KAAK,CAAC,GAAG,4BAA4B,KAAK,CAAC,QAAQ,GAAG,CACxF,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAEpE,IAAI,OAAO,EAAE,CAAC;YACZ,0EAA0E;YAC1E,0EAA0E;YAC1E,wEAAwE;YAExE,8EAA8E;YAC9E,IAAI,CAAC;gBACH,UAAU,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,iBAAiB;YACnB,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,4BAA4B,aAAa,qBAAqB,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;YAClF,uFAAuF;YACvF,qEAAqE;YACrE,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;oBACxD,mDAAmD;oBACnD,QAAQ,CACN,sDAAsD,KAAK,CAAC,QAAQ,gDAAgD,EACpH,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CACvD,CAAC;oBACF,GAAG,CAAC,IAAI,CAAC,+CAA+C,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5E,CAAC;gBAAC,MAAM,CAAC;oBACP,GAAG,CAAC,IAAI,CACN,+CAA+C,KAAK,CAAC,QAAQ,iCAAiC,CAC/F,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,uEAAuE;YACvE,6DAA6D;YAC7D,GAAG,CAAC,KAAK,CACP,sFAAsF,CACvF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,UAAU,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,KAAK,CAAC,gBAAgB;QAAE,OAAO;IACnC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAE7E,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,WAAW,EAAE,CAAC;YAC1C,GAAG,CAAC,KAAK,CACP,oCAAoC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,WAAW,GAAG,IAAI,GAAG,CACjG,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC/C,IAAI,aAAa,KAAK,IAAI;YAAE,OAAO;QAEnC,IAAI,aAAa,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC;YAC3C,0EAA0E;YAC1E,2EAA2E;YAC3E,4CAA4C;YAC5C,OAAO;QACT,CAAC;QAED,GAAG,CAAC,IAAI,CACN,2CAA2C,aAAa,eAAe,KAAK,CAAC,cAAc,cAAc,CAC1G,CAAC;QACF,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;IACjC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAIrC;IACC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,OAAO,EAAE,CAAC;QAChD,GAAG,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAC7E,OAAO;IACT,CAAC;IAED,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;IACzC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IAAI,MAAM,CAAC,aAAa;QAAE,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,aAAa,CAAC;IAEvE,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IAExF,GAAG,CAAC,IAAI,CACN,2CAA2C,KAAK,CAAC,cAAc,eAAe,QAAQ,KAAK,CAC5F,CAAC;IAEF,WAAW,CAAC,GAAG,EAAE;QACf,KAAK,cAAc,EAAE,CAAC;IACxB,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"self-update.service.js","sourceRoot":"","sources":["../../src/services/self-update.service.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,6 @@
8
8
  * agent module stay focused on its own CLI invocation without duplicating the
9
9
  * lifecycle plumbing.
10
10
  */
11
- import { type ChildProcess, type SpawnOptions } from "node:child_process";
12
11
  import { type ThreadLifecycleService } from "./thread-lifecycle.service.js";
13
12
  import type { SensoriumTransport } from "./mcp-config.service.js";
14
13
  /** Result shape shared by every spawn function. */
@@ -28,6 +27,8 @@ export declare const sanitizeSpawnEnv: (extra?: Record<string, string | undefine
28
27
  * separately and are unaffected.
29
28
  */
30
29
  export declare const stripDenylistedEnvVars: (vars: Record<string, string>) => Record<string, string>;
30
+ /** Test hook: clear the CLI resolution cache. */
31
+ export declare function resetCliPathCacheForTest(): void;
31
32
  export declare const resolveCliPath: (name: string, prefer?: RegExp) => string | null;
32
33
  /** On Windows: prefer .exe, fall back to .cmd, refuse extensionless shims (e.g. Volta). */
33
34
  export declare function resolveWindowsCliPath(name: string): string | null;
@@ -51,14 +52,12 @@ export declare function buildThreadLogPath(name: string, threadId: number, ext:
51
52
  * delivers its own autonomous-loop prompt over stdin instead). */
52
53
  export declare const buildSessionPrompt: (name: string, threadId: number) => string;
53
54
  /**
54
- * Spawn options shared by every agent child: detached from this (ephemeral)
55
- * server process, stdout/stderr on the child-owned log fd, and .cmd/.bat
56
- * launched through a shell on Windows. `stdin` defaults to "ignore"; Codex
57
- * passes "pipe" because it delivers its prompt over stdin.
55
+ * Everything needed to start an agent process, agent-specific policy already
56
+ * applied (env assembly, CLI args, prompt delivery). The SAME plan drives both
57
+ * spawn mechanics: POST /proc/spawn on the supervisor broker (the process
58
+ * owner target state, plan §4.1) and the legacy local `spawn()` fallback.
58
59
  */
59
- export declare function detachedChildOptions(cliPath: string, outFd: number, env: NodeJS.ProcessEnv, cwd: string | undefined, stdin?: "ignore" | "pipe"): SpawnOptions;
60
- interface RegisterSpawnOpts {
61
- child: ChildProcess;
60
+ export interface AgentLaunchPlan {
62
61
  threadId: number;
63
62
  name: string;
64
63
  logFilePath: string;
@@ -66,23 +65,50 @@ interface RegisterSpawnOpts {
66
65
  agentLabel: string;
67
66
  memorySourceThreadId?: number;
68
67
  threadType?: "worker" | "branch";
68
+ exe: string;
69
+ args: string[];
70
+ env: NodeJS.ProcessEnv;
71
+ cwd?: string;
72
+ /** Prompt-sized payload written to the child's stdin then EOF'd (Codex);
73
+ * undefined → stdin ignored/NUL. */
74
+ stdinData?: string;
69
75
  }
76
+ export type BrokerSpawnMode = "required" | "auto" | "off";
70
77
  /**
71
- * Shared tail of every agent spawn: open the log fd, run the agent-specific
72
- * spawn callback, register the child for lifecycle bookkeeping, and translate
73
- * any exception into an error result.
78
+ * Staged cutover switch (plan hard criterion 7 — zero-disruption migration):
79
+ * SENSORIUM_BROKER_SPAWN=1 broker REQUIRED — a broker failure fails the
80
+ * spawn loudly, never a silent local fallback;
81
+ * SENSORIUM_BROKER_SPAWN=0 legacy local spawning only;
82
+ * unset auto — broker first, and if it is unreachable or
83
+ * predates /proc/spawn, WARN and spawn locally so
84
+ * an MCP update cannot strand agents behind an
85
+ * old supervisor binary. Locally-spawned processes
86
+ * are adopted into jobs+registry by the
87
+ * supervisor's boot reconciliation / /proc/adopt.
88
+ * Job objects are Windows-only, so non-Windows resolves to "off" unless forced.
89
+ */
90
+ export declare function brokerSpawnMode(): BrokerSpawnMode;
91
+ export declare function spawnReconcileDelayForTest(ms: number | null): void;
92
+ /**
93
+ * Launch an agent process for a thread. Broker path first (the supervisor owns
94
+ * spawn/observe/kill; children land in the thread's job object so the whole
95
+ * tree stays killable), legacy local path per the cutover flag above.
96
+ *
97
+ * Duplicate-agent guarantee: the legacy local fallback runs ONLY on definitive
98
+ * evidence that the broker created nothing — a spawn error answer, an absent
99
+ * endpoint (404/401), or a connection that was never established. An uncertain
100
+ * outcome (timeout, dropped connection) goes through reconcileUncertainSpawn
101
+ * instead, so no timeout value can ever yield two agents for one thread.
74
102
  *
75
- * stdout/stderr go to a file descriptor the CHILD owns, not a pipe drained by
76
- * this (ephemeral) server process. A pipe's only reader is this node process;
77
- * when it dies on a self-update/restart the orphaned, detached child keeps
78
- * writing, the ~64KB OS pipe buffer fills, and the next write() blocks the
79
- * child's event loop forever — killing MCP polling, the API stream and any
80
- * reconnect (the exact zombie we saw on thread 20869). A file fd is duplicated
81
- * into the child at spawn and drained by the OS, so it survives our restarts.
82
- * (64KB blocking is a PIPE phenomenon, not a file.)
103
+ * In the local path stdout/stderr go to a file descriptor the CHILD owns, not
104
+ * a pipe drained by this (ephemeral) server process. A pipe's only reader is
105
+ * this node process; when it dies on a self-update/restart the orphaned,
106
+ * detached child keeps writing, the ~64KB OS pipe buffer fills, and the next
107
+ * write() blocks the child's event loop forever — killing MCP polling, the API
108
+ * stream and any reconnect (the exact zombie we saw on thread 20869). A file
109
+ * fd is duplicated into the child at spawn and drained by the OS, so it
110
+ * survives our restarts. The broker path keeps the identical design with the
111
+ * supervisor opening the file handle (spawn-to-file-fd, plan §6 "keep").
83
112
  */
84
- export declare function launchAgentChild(opts: Omit<RegisterSpawnOpts, "child"> & {
85
- spawnChild: (outFd: number) => ChildProcess;
86
- }, threadLifecycle: ThreadLifecycleService): SpawnResult;
87
- export {};
113
+ export declare function launchAgent(plan: AgentLaunchPlan, threadLifecycle: ThreadLifecycleService): Promise<SpawnResult>;
88
114
  //# sourceMappingURL=spawn-common.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spawn-common.d.ts","sourceRoot":"","sources":["../../src/services/spawn-common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAa,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA8BrF,OAAO,EAAe,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA6BlE,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAwB/E,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KAAG,MAAM,CAAC,UAKpF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAI1F,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,MAAM,GAAG,IAsBvE,CAAC;AAEF,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBjE;AASD,eAAO,MAAM,yBAAyB,GAAI,mBAAmB,MAAM,KAAG,MAAM,GAAG,SAK9E,CAAC;AAOF,eAAO,MAAM,0BAA0B,QAAO,OAAmC,CAAC;AAClF,eAAO,MAAM,2BAA2B,GAAI,GAAG,OAAO,KAAG,IAExD,CAAC;AAQF;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,GACjB;IAAE,SAAS,EAAE,kBAAkB,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAYvD;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAMhG;AAED;kEACkE;AAClE,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MACkD,CAAC;AAEvH;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,KAAK,GAAE,QAAQ,GAAG,MAAiB,GAClC,YAAY,CASd;AAID,UAAU,iBAAiB;IACzB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAClC;AAoOD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,GAAG;IAAE,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,YAAY,CAAA;CAAE,EACxF,eAAe,EAAE,sBAAsB,GACtC,WAAW,CAmBb"}
1
+ {"version":3,"file":"spawn-common.d.ts","sourceRoot":"","sources":["../../src/services/spawn-common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgCH,OAAO,EAAe,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA+BlE,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAwB/E,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KAAG,MAAM,CAAC,UAKpF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAI1F,CAAC;AAWF,iDAAiD;AACjD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,MAAM,GAAG,IA2BvE,CAAC;AAEF,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BjE;AASD,eAAO,MAAM,yBAAyB,GAAI,mBAAmB,MAAM,KAAG,MAAM,GAAG,SAK9E,CAAC;AAOF,eAAO,MAAM,0BAA0B,QAAO,OAAmC,CAAC;AAClF,eAAO,MAAM,2BAA2B,GAAI,GAAG,OAAO,KAAG,IAExD,CAAC;AASF;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,GACjB;IAAE,SAAS,EAAE,kBAAkB,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAYvD;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAMhG;AAED;kEACkE;AAClE,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MACkD,CAAC;AAuRvH;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;yCACqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,IAAI,eAAe,CAKjD;AAiDD,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAElE;AA4ED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,eAAe,EACrB,eAAe,EAAE,sBAAsB,GACtC,OAAO,CAAC,WAAW,CAAC,CAyCtB"}