@moxt-ai/mobius 0.0.385 → 0.0.387

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 (113) hide show
  1. package/dist/{chunk-OXXJU5VO.js → chunk-A62FEGIN.js} +20 -28
  2. package/dist/{chunk-OXXJU5VO.js.map → chunk-A62FEGIN.js.map} +3 -3
  3. package/dist/{chunk-VNT3WUWZ.js → chunk-S7PKNDIS.js} +2 -2
  4. package/dist/{chunk-VNT3WUWZ.js.map → chunk-S7PKNDIS.js.map} +1 -1
  5. package/dist/cli/handler/daemon/index.d.ts.map +1 -1
  6. package/dist/cli/handler/daemon/index.js +9 -4
  7. package/dist/cli/handler/daemon/index.js.map +1 -1
  8. package/dist/cli/handler/daemon/quit.d.ts.map +1 -1
  9. package/dist/cli/handler/daemon/quit.js +5 -4
  10. package/dist/cli/handler/daemon/quit.js.map +1 -1
  11. package/dist/cli/handler/daemon/release.js +1 -1
  12. package/dist/cli/handler/daemon/start.d.ts.map +1 -1
  13. package/dist/cli/handler/daemon/start.js +3 -3
  14. package/dist/cli/handler/daemon/start.js.map +1 -1
  15. package/dist/cli/handler/daemon/upgrade.d.ts.map +1 -1
  16. package/dist/cli/handler/daemon/upgrade.js +8 -24
  17. package/dist/cli/handler/daemon/upgrade.js.map +1 -1
  18. package/dist/cli/handler/pair/pair.js +3 -3
  19. package/dist/cli/handler/pair/pair.js.map +1 -1
  20. package/dist/cli/handler/pair/remove.js +1 -1
  21. package/dist/cli/handler/pair/stop.js +1 -1
  22. package/dist/cli/handler/version/index.d.ts.map +1 -1
  23. package/dist/cli/handler/version/index.js +6 -2
  24. package/dist/cli/handler/version/index.js.map +1 -1
  25. package/dist/{cli-WDPLOVF3.js → cli-43LPJ5ID.js} +412 -1143
  26. package/dist/cli-43LPJ5ID.js.map +7 -0
  27. package/dist/cli.js +1998 -6
  28. package/dist/cli.js.map +4 -4
  29. package/dist/daemon/control/protocol.d.ts +1 -133
  30. package/dist/daemon/control/protocol.d.ts.map +1 -1
  31. package/dist/daemon/control/protocol.js +4 -63
  32. package/dist/daemon/control/protocol.js.map +1 -1
  33. package/dist/daemon/lifecycle/daemon-client.d.ts +8 -0
  34. package/dist/daemon/lifecycle/daemon-client.d.ts.map +1 -0
  35. package/dist/daemon/lifecycle/daemon-client.js +154 -0
  36. package/dist/daemon/lifecycle/daemon-client.js.map +1 -0
  37. package/dist/daemon/lifecycle/{worker.d.ts → daemon.d.ts} +2 -2
  38. package/dist/daemon/lifecycle/daemon.d.ts.map +1 -0
  39. package/dist/daemon/lifecycle/daemon.js +266 -0
  40. package/dist/daemon/lifecycle/daemon.js.map +1 -0
  41. package/dist/daemon/lifecycle/unhandled-rejection.d.ts +1 -2
  42. package/dist/daemon/lifecycle/unhandled-rejection.d.ts.map +1 -1
  43. package/dist/daemon/lifecycle/unhandled-rejection.js +4 -7
  44. package/dist/daemon/lifecycle/unhandled-rejection.js.map +1 -1
  45. package/dist/daemon/upgrades/data.d.ts +0 -1
  46. package/dist/daemon/upgrades/data.d.ts.map +1 -1
  47. package/dist/daemon/upgrades/data.js +0 -5
  48. package/dist/daemon/upgrades/data.js.map +1 -1
  49. package/dist/engine/runtime/relay/session-event-publisher.d.ts.map +1 -1
  50. package/dist/engine/runtime/relay/session-event-publisher.js +6 -5
  51. package/dist/engine/runtime/relay/session-event-publisher.js.map +1 -1
  52. package/dist/engine/util/process/platform/windows.d.ts.map +1 -1
  53. package/dist/engine/util/process/platform/windows.js +7 -4
  54. package/dist/engine/util/process/platform/windows.js.map +1 -1
  55. package/dist/engine.js +2 -2
  56. package/dist/storage/daemon/daemon-lock.d.ts +9 -0
  57. package/dist/storage/daemon/daemon-lock.d.ts.map +1 -0
  58. package/dist/storage/daemon/{manager-lock.js → daemon-lock.js} +22 -7
  59. package/dist/storage/daemon/daemon-lock.js.map +1 -0
  60. package/dist/storage/state-root-layout.d.ts +0 -2
  61. package/dist/storage/state-root-layout.d.ts.map +1 -1
  62. package/dist/storage/state-root-layout.js +0 -2
  63. package/dist/storage/state-root-layout.js.map +1 -1
  64. package/package.json +1 -1
  65. package/dist/chunk-NEAZO2JN.js +0 -2002
  66. package/dist/chunk-NEAZO2JN.js.map +0 -7
  67. package/dist/cli/handler/daemon/manager.d.ts +0 -4
  68. package/dist/cli/handler/daemon/manager.d.ts.map +0 -1
  69. package/dist/cli/handler/daemon/manager.js +0 -9
  70. package/dist/cli/handler/daemon/manager.js.map +0 -1
  71. package/dist/cli/handler/daemon/worker.d.ts +0 -4
  72. package/dist/cli/handler/daemon/worker.d.ts.map +0 -1
  73. package/dist/cli/handler/daemon/worker.js +0 -7
  74. package/dist/cli/handler/daemon/worker.js.map +0 -1
  75. package/dist/cli-WDPLOVF3.js.map +0 -7
  76. package/dist/daemon/control/switch-status.d.ts +0 -4
  77. package/dist/daemon/control/switch-status.d.ts.map +0 -1
  78. package/dist/daemon/control/switch-status.js +0 -10
  79. package/dist/daemon/control/switch-status.js.map +0 -1
  80. package/dist/daemon/lifecycle/manager-client.d.ts +0 -8
  81. package/dist/daemon/lifecycle/manager-client.d.ts.map +0 -1
  82. package/dist/daemon/lifecycle/manager-client.js +0 -130
  83. package/dist/daemon/lifecycle/manager-client.js.map +0 -1
  84. package/dist/daemon/lifecycle/manager.d.ts +0 -3
  85. package/dist/daemon/lifecycle/manager.d.ts.map +0 -1
  86. package/dist/daemon/lifecycle/manager.js +0 -215
  87. package/dist/daemon/lifecycle/manager.js.map +0 -1
  88. package/dist/daemon/lifecycle/worker-lifecycle-log.d.ts +0 -14
  89. package/dist/daemon/lifecycle/worker-lifecycle-log.d.ts.map +0 -1
  90. package/dist/daemon/lifecycle/worker-lifecycle-log.js +0 -63
  91. package/dist/daemon/lifecycle/worker-lifecycle-log.js.map +0 -1
  92. package/dist/daemon/lifecycle/worker-process.d.ts +0 -26
  93. package/dist/daemon/lifecycle/worker-process.d.ts.map +0 -1
  94. package/dist/daemon/lifecycle/worker-process.js +0 -145
  95. package/dist/daemon/lifecycle/worker-process.js.map +0 -1
  96. package/dist/daemon/lifecycle/worker.d.ts.map +0 -1
  97. package/dist/daemon/lifecycle/worker.js +0 -213
  98. package/dist/daemon/lifecycle/worker.js.map +0 -1
  99. package/dist/daemon/upgrades/package.d.ts +0 -9
  100. package/dist/daemon/upgrades/package.d.ts.map +0 -1
  101. package/dist/daemon/upgrades/package.js +0 -157
  102. package/dist/daemon/upgrades/package.js.map +0 -1
  103. package/dist/daemon/upgrades/upgrade.d.ts +0 -21
  104. package/dist/daemon/upgrades/upgrade.d.ts.map +0 -1
  105. package/dist/daemon/upgrades/upgrade.js +0 -242
  106. package/dist/daemon/upgrades/upgrade.js.map +0 -1
  107. package/dist/storage/daemon/manager-lock.d.ts +0 -9
  108. package/dist/storage/daemon/manager-lock.d.ts.map +0 -1
  109. package/dist/storage/daemon/manager-lock.js.map +0 -1
  110. package/dist/storage/daemon/release-files.d.ts +0 -9
  111. package/dist/storage/daemon/release-files.d.ts.map +0 -1
  112. package/dist/storage/daemon/release-files.js +0 -14
  113. package/dist/storage/daemon/release-files.js.map +0 -1
@@ -0,0 +1,154 @@
1
+ import { spawn } from "node:child_process";
2
+ import { once } from "node:events";
3
+ import { setTimeout as delay } from "node:timers/promises";
4
+ import { isNodeError } from "../../engine/util/node-error.js";
5
+ import { daemonLockExists } from "../../storage/daemon/daemon-lock.js";
6
+ import { CONTROL_TIMEOUT_MILLISECONDS, sendLocalRequest } from "../control/local-client.js";
7
+ import { decodeKnownLifecycleResponse } from "../control/protocol.js";
8
+ async function spawnDaemon() {
9
+ const entry = process.argv[1];
10
+ if (entry === undefined) {
11
+ throw new Error("The CLI entrypoint is missing");
12
+ }
13
+ const child = spawn(process.execPath, [entry, "__daemon"], {
14
+ detached: true,
15
+ windowsHide: true,
16
+ env: process.env,
17
+ stdio: "ignore",
18
+ });
19
+ await once(child, "spawn");
20
+ child.unref();
21
+ return child;
22
+ }
23
+ async function launchDaemon(version) {
24
+ process.stdout.write(`Starting mobius daemon ${version}\n`);
25
+ return await spawnDaemon();
26
+ }
27
+ async function waitForDaemonExit(stateDirectory, signal) {
28
+ const deadline = AbortSignal.any([signal, AbortSignal.timeout(30_000)]);
29
+ while (!deadline.aborted) {
30
+ if (!(await daemonLockExists(stateDirectory))) {
31
+ return;
32
+ }
33
+ await new Promise((resolve, reject) => {
34
+ const timeout = setTimeout(finish, 20);
35
+ const abort = () => finish(deadline.reason);
36
+ function finish(cause) {
37
+ clearTimeout(timeout);
38
+ deadline.removeEventListener("abort", abort);
39
+ cause === undefined ? resolve() : reject(cause);
40
+ }
41
+ deadline.addEventListener("abort", abort, { once: true });
42
+ });
43
+ }
44
+ throw deadline.reason;
45
+ }
46
+ // The invoking CLI owns the release. npx resolves it before any daemon is stopped.
47
+ export async function ensureDaemon(stateDirectory, version, signal) {
48
+ const running = await readDaemonVersion(stateDirectory, signal);
49
+ if (running !== null) {
50
+ return running;
51
+ }
52
+ const deadline = AbortSignal.any([signal, AbortSignal.timeout(CONTROL_TIMEOUT_MILLISECONDS)]);
53
+ return await waitForDaemon(stateDirectory, version, deadline);
54
+ }
55
+ // Status keeps the released wire format; the worker field identifies the daemon.
56
+ export async function readDaemonVersion(stateDirectory, signal) {
57
+ try {
58
+ const response = decodeKnownLifecycleResponse(await sendLocalRequest(stateDirectory, "manager", { kind: "status" }, signal));
59
+ if (response?.kind === "status") {
60
+ return response.worker?.version ?? null;
61
+ }
62
+ }
63
+ catch (cause) {
64
+ if (!isNodeError(cause, "ENOENT") && !isNodeError(cause, "ECONNREFUSED")) {
65
+ throw cause;
66
+ }
67
+ }
68
+ return null;
69
+ }
70
+ async function waitForDaemon(stateDirectory, version, signal) {
71
+ let daemonStarted = false;
72
+ let child;
73
+ while (!signal.aborted) {
74
+ try {
75
+ let response = decodeKnownLifecycleResponse(await sendLocalRequest(stateDirectory, "manager", { kind: "status" }, signal));
76
+ if (response?.kind === "status" && response.worker === null) {
77
+ const entry = process.argv[1];
78
+ if (entry === undefined) {
79
+ throw new Error("The CLI entrypoint is missing");
80
+ }
81
+ // A released manager may still own control after its worker exits.
82
+ // Reuse its authenticated launch protocol instead of competing for its lock.
83
+ response = decodeKnownLifecycleResponse(await sendLocalRequest(stateDirectory, "manager", { kind: "ensure", launch: { entry, executable: process.execPath, version } }, signal));
84
+ }
85
+ if (response?.kind === "error") {
86
+ throw new Error(response.message);
87
+ }
88
+ if (response?.kind === "status" && response.worker !== null) {
89
+ if (daemonStarted) {
90
+ process.stdout.write(`Mobius daemon ${version} started\n`);
91
+ }
92
+ return response.worker.version;
93
+ }
94
+ throw new Error("The daemon could not return its status");
95
+ }
96
+ catch (cause) {
97
+ if (!isNodeError(cause, "ENOENT") && !isNodeError(cause, "ECONNREFUSED")) {
98
+ throw cause;
99
+ }
100
+ // A competing launcher can exit successfully after losing the lock.
101
+ // Check the shared endpoint first and keep waiting for its owner.
102
+ if (child !== undefined &&
103
+ (child.signalCode !== null ||
104
+ (child.exitCode !== null && (child.exitCode !== 0 || !(await daemonLockExists(stateDirectory)))))) {
105
+ throw new Error("The daemon exited before becoming ready");
106
+ }
107
+ if (!daemonStarted) {
108
+ child = await launchDaemon(version);
109
+ daemonStarted = true;
110
+ }
111
+ await new Promise((resolve, reject) => {
112
+ const timeout = setTimeout(finish, 50);
113
+ const abort = () => finish(signal.reason);
114
+ function finish(cause) {
115
+ clearTimeout(timeout);
116
+ signal.removeEventListener("abort", abort);
117
+ cause === undefined ? resolve() : reject(cause);
118
+ }
119
+ signal.addEventListener("abort", abort, { once: true });
120
+ });
121
+ }
122
+ }
123
+ throw signal.reason;
124
+ }
125
+ export async function stopDaemon(stateDirectory, signal) {
126
+ const deadline = AbortSignal.any([signal, AbortSignal.timeout(CONTROL_TIMEOUT_MILLISECONDS)]);
127
+ while (true) {
128
+ deadline.throwIfAborted();
129
+ try {
130
+ const response = decodeKnownLifecycleResponse(await sendLocalRequest(stateDirectory, "manager", { kind: "stop" }, deadline));
131
+ if (response?.kind === "error") {
132
+ throw new Error(response.message);
133
+ }
134
+ if (response?.kind !== "stopped") {
135
+ throw new Error("The Mobius daemon returned an unexpected response");
136
+ }
137
+ await waitForDaemonExit(stateDirectory, deadline);
138
+ return response;
139
+ }
140
+ catch (cause) {
141
+ deadline.throwIfAborted();
142
+ if (!isNodeError(cause, "ENOENT") && !isNodeError(cause, "ECONNREFUSED")) {
143
+ throw cause;
144
+ }
145
+ if (!(await daemonLockExists(stateDirectory))) {
146
+ return { kind: "stopped" };
147
+ }
148
+ // The owner may still be copying data or discovering Agents. Its missing
149
+ // socket is not proof of shutdown: wait for control or report the deadline.
150
+ await delay(50, undefined, { signal: deadline });
151
+ }
152
+ }
153
+ }
154
+ //# sourceMappingURL=daemon-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../../../src/daemon/lifecycle/daemon-client.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@ import type { InstallationDirectory } from "../../engine/storage/installation/in
2
2
  export declare function reloadDaemon(stateDirectory: InstallationDirectory, signal: AbortSignal): Promise<void>;
3
3
  /** Releases idle Agent processes of a running daemon; succeeds when no daemon is running. */
4
4
  export declare function releaseIdleAgentProcesses(stateDirectory: InstallationDirectory, signal: AbortSignal): Promise<void>;
5
- export declare function runWorker(version: string, signal: AbortSignal): Promise<void>;
6
- //# sourceMappingURL=worker.d.ts.map
5
+ export declare function runDaemon(version: string, signal: AbortSignal, owner?: "standalone" | "legacy-manager"): Promise<void>;
6
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/daemon/lifecycle/daemon.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yDAAyD,CAAC;AA8BrG,wBAAsB,YAAY,CAAC,cAAc,EAAE,qBAAqB,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB5G;AAED,6FAA6F;AAC7F,wBAAsB,yBAAyB,CAC3C,cAAc,EAAE,qBAAqB,EACrC,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,SAAS,CAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,EACnB,KAAK,GAAE,YAAY,GAAG,gBAA+B,GACtD,OAAO,CAAC,IAAI,CAAC,CAkCf"}
@@ -0,0 +1,266 @@
1
+ import { setTimeout as delay } from "node:timers/promises";
2
+ import { refreshAgentCatalog } from "../../engine/runtime/catalog/refresh-agent-catalog.js";
3
+ import { RuntimeInstallationStore } from "../../engine/runtime/connection/runtime-installation-store.js";
4
+ import { prepareRuntimeConnection } from "../../engine/runtime/pairing.js";
5
+ import { RuntimeLoop } from "../../engine/runtime/runtime-loop.js";
6
+ import { RuntimeAgentProcesses } from "../../engine/session/process/runtime-agent-processes.js";
7
+ import { RuntimeTurnActivity } from "../../engine/session/turn/runtime-turn-activity.js";
8
+ import { BoundedLineLog } from "../../engine/storage/logs/bounded-log.js";
9
+ import { logDirectory, WORKER_LIFECYCLE_LOG_FILENAME } from "../../engine/storage/logs/log-files.js";
10
+ import { isNodeError } from "../../engine/util/node-error.js";
11
+ import { acquireDaemonLock, daemonLockExists } from "../../storage/daemon/daemon-lock.js";
12
+ import { prepareMobiusEngineDataDir, resolveMaxAcpProcesses } from "../config.js";
13
+ import { sendLocalRequest } from "../control/local-client.js";
14
+ import { serveLocalControl } from "../control/local-server.js";
15
+ import { openMobiusControlInstallation } from "../pairing/pair-local-machine.js";
16
+ import { prepareVersionData, recordCurrentData } from "../upgrades/data.js";
17
+ import { surviveUnhandledRejections } from "./unhandled-rejection.js";
18
+ class DaemonRuntimeError extends Error {
19
+ code = "worker_runtime_failed";
20
+ constructor(connectionId, cause) {
21
+ super(`Runtime ${connectionId} failed`, { cause });
22
+ }
23
+ }
24
+ // Older daemons serve reload/release on a separate worker socket. A null reply
25
+ // means their manager did not recognize the command; no side effect occurred.
26
+ async function sendDaemonCommand(directory, kind, signal) {
27
+ const response = await sendLocalRequest(directory, "manager", { kind }, signal);
28
+ return response === null ? await sendLocalRequest(directory, "worker", { kind }, signal) : response;
29
+ }
30
+ export async function reloadDaemon(stateDirectory, signal) {
31
+ try {
32
+ const response = await sendDaemonCommand(stateDirectory, "reload", signal);
33
+ if (typeof response !== "object" ||
34
+ response === null ||
35
+ !("kind" in response) ||
36
+ response.kind !== "reloaded") {
37
+ throw new Error("Saved configuration could not be applied to the running daemon");
38
+ }
39
+ }
40
+ catch (cause) {
41
+ if (!isNodeError(cause, "ENOENT") && !isNodeError(cause, "ECONNREFUSED")) {
42
+ throw cause;
43
+ }
44
+ }
45
+ }
46
+ /** Releases idle Agent processes of a running daemon; succeeds when no daemon is running. */
47
+ export async function releaseIdleAgentProcesses(stateDirectory, signal) {
48
+ try {
49
+ const response = await sendDaemonCommand(stateDirectory, "release", signal);
50
+ if (typeof response === "object" && response !== null && "kind" in response && response.kind === "released") {
51
+ return;
52
+ }
53
+ throw new Error("The running daemon cannot release Agent sessions. Run `npx --yes @moxt-ai/mobius@latest restart` to update it first.");
54
+ }
55
+ catch (cause) {
56
+ if (!isNodeError(cause, "ENOENT") && !isNodeError(cause, "ECONNREFUSED")) {
57
+ throw cause;
58
+ }
59
+ }
60
+ }
61
+ export async function runDaemon(version, signal, owner = "standalone") {
62
+ if (owner === "legacy-manager" && !process.connected) {
63
+ throw new Error("The legacy worker entrypoint requires a manager IPC connection");
64
+ }
65
+ // Install before any await: an unhandled rejection during startup itself
66
+ // must not kill the daemon before the guard exists.
67
+ const rejectionGuard = surviveUnhandledRejections();
68
+ const shutdown = new AbortController();
69
+ const combined = AbortSignal.any([signal, shutdown.signal]);
70
+ const disconnect = () => shutdown.abort();
71
+ if (owner === "legacy-manager") {
72
+ process.once("disconnect", disconnect);
73
+ }
74
+ try {
75
+ await runDaemonRuntime(version, combined, shutdown, rejectionGuard, owner);
76
+ }
77
+ catch (cause) {
78
+ const control = await openMobiusControlInstallation(AbortSignal.timeout(5_000), process.env);
79
+ new BoundedLineLog(logDirectory(control.stateDirectory), WORKER_LIFECYCLE_LOG_FILENAME, 512 * 1024).record(JSON.stringify({
80
+ kind: "daemon_failed",
81
+ message: cause instanceof Error ? cause.message : "Daemon failed",
82
+ }));
83
+ throw cause;
84
+ }
85
+ finally {
86
+ shutdown.abort();
87
+ rejectionGuard.release();
88
+ if (owner === "legacy-manager") {
89
+ process.off("disconnect", disconnect);
90
+ if (process.connected) {
91
+ process.disconnect();
92
+ }
93
+ }
94
+ }
95
+ }
96
+ async function runDaemonRuntime(version, combined, shutdown, rejectionGuard, owner) {
97
+ const control = await openMobiusControlInstallation(combined, process.env);
98
+ const releaseDaemon = await acquireDaemonLock(control.stateDirectory, owner === "legacy-manager" ? "worker.lock" : "manager.lock");
99
+ if (releaseDaemon === null) {
100
+ return;
101
+ }
102
+ const lifecycleLog = new BoundedLineLog(logDirectory(control.stateDirectory), WORKER_LIFECYCLE_LOG_FILENAME, 512 * 1024);
103
+ lifecycleLog.record(JSON.stringify({ kind: "daemon_started", pid: process.pid, version, timestamp: new Date().toISOString() }));
104
+ try {
105
+ if (owner === "standalone") {
106
+ // A dead manager's worker may still be draining control requests. Its
107
+ // lock outlives socket cleanup, so wait before touching either data or sockets.
108
+ const deadline = AbortSignal.any([combined, AbortSignal.timeout(30_000)]);
109
+ while (await daemonLockExists(control.stateDirectory, "worker.lock")) {
110
+ await delay(50, undefined, { signal: deadline });
111
+ }
112
+ deadline.throwIfAborted();
113
+ }
114
+ await prepareVersionData(version, combined);
115
+ const engineDataDir = await prepareMobiusEngineDataDir(version, combined, process.env);
116
+ const installation = await RuntimeInstallationStore.open(engineDataDir, combined);
117
+ rejectionGuard.bindStateDirectory(control.stateDirectory);
118
+ const turnActivity = new RuntimeTurnActivity();
119
+ const agentProcesses = new RuntimeAgentProcesses();
120
+ const active = new Map();
121
+ const fail = (connectionId, cause) => {
122
+ console.error(`Runtime ${connectionId} failed; stopping the daemon`, cause);
123
+ shutdown.abort(new DaemonRuntimeError(connectionId, cause));
124
+ };
125
+ const reconcile = async () => {
126
+ const connections = await installation.listConnections(combined);
127
+ const enabled = new Set(connections
128
+ .filter((connection) => connection.activation === "active")
129
+ .map((connection) => connection.connectionId));
130
+ for (const [id, running] of active) {
131
+ if (enabled.has(id)) {
132
+ continue;
133
+ }
134
+ running.controller.abort();
135
+ await running.completion;
136
+ active.delete(id);
137
+ }
138
+ for (const connection of connections) {
139
+ if (!enabled.has(connection.connectionId) || active.has(connection.connectionId)) {
140
+ continue;
141
+ }
142
+ try {
143
+ const config = await prepareRuntimeConnection(installation, connection, combined, process.env, resolveMaxAcpProcesses(process.env));
144
+ const controller = new AbortController();
145
+ // Process diagnostics live beside the shared control directory,
146
+ // so every Runtime can include them in bug reports.
147
+ const loop = new RuntimeLoop(async () => config, {
148
+ processLogsDirectory: control.stateDirectory,
149
+ turnActivity,
150
+ agentProcesses,
151
+ });
152
+ const completion = loop
153
+ .run(AbortSignal.any([combined, controller.signal]))
154
+ .then(() => {
155
+ if (!combined.aborted && !controller.signal.aborted) {
156
+ fail(connection.connectionId, new Error("The Runtime stopped unexpectedly"));
157
+ }
158
+ }, (cause) => {
159
+ if (!combined.aborted && !controller.signal.aborted) {
160
+ fail(connection.connectionId, cause);
161
+ }
162
+ })
163
+ .finally(() => active.delete(connection.connectionId));
164
+ active.set(connection.connectionId, { config, controller, completion });
165
+ }
166
+ catch (cause) {
167
+ combined.throwIfAborted();
168
+ fail(connection.connectionId, cause);
169
+ throw cause;
170
+ }
171
+ }
172
+ };
173
+ const refreshRunningCatalogs = async (connectionIds) => {
174
+ await Promise.all([...connectionIds].map(async (connectionId) => {
175
+ const config = active.get(connectionId)?.config;
176
+ if (config?.rediscoverAgents === undefined) {
177
+ return;
178
+ }
179
+ try {
180
+ await refreshAgentCatalog(config, config.rediscoverAgents, AbortSignal.any([combined, AbortSignal.timeout(90_000)]));
181
+ }
182
+ catch (cause) {
183
+ combined.throwIfAborted();
184
+ // The Runtime keeps serving its previous catalog; the reload itself still applies.
185
+ console.error(`Runtime ${connectionId} could not refresh its Agent catalog`, cause);
186
+ }
187
+ }));
188
+ };
189
+ let reload = Promise.resolve();
190
+ const handle = async (request) => {
191
+ if (typeof request === "object" && request !== null && "kind" in request) {
192
+ if (request.kind === "status" || request.kind === "ensure") {
193
+ return { kind: "status", protocolVersion: 2, worker: { pid: process.pid, version } };
194
+ }
195
+ if (request.kind === "stop") {
196
+ return { kind: "stopped" };
197
+ }
198
+ }
199
+ if (typeof request === "object" && request !== null && "kind" in request && request.kind === "release") {
200
+ // Agents' own clients can continue the conversations that idle processes held.
201
+ await agentProcesses.retireIdleProcesses();
202
+ return { kind: "released" };
203
+ }
204
+ if (typeof request !== "object" || request === null || !("kind" in request) || request.kind !== "reload") {
205
+ return { kind: "error", code: "invalid_reload", message: "Expected a configuration reload" };
206
+ }
207
+ // A reload, such as `mobius start` after the user installs or signs in to an Agent, also re-reads the
208
+ // Agent inventory of Runtimes that were already running; Runtimes it starts read it themselves.
209
+ const running = new Set(active.keys());
210
+ const pending = reload.then(reconcile).then(async () => await refreshRunningCatalogs(running));
211
+ reload = pending.catch(() => undefined);
212
+ await pending;
213
+ return { kind: "reloaded" };
214
+ };
215
+ try {
216
+ await reconcile();
217
+ // CLI mutations follow this pointer as soon as status reports readiness.
218
+ await recordCurrentData(version, combined);
219
+ lifecycleLog.record(JSON.stringify({
220
+ kind: "daemon_ready",
221
+ pid: process.pid,
222
+ version,
223
+ timestamp: new Date().toISOString(),
224
+ }));
225
+ // A legacy manager still owns its endpoint; only standalone daemons serve both.
226
+ const servers = owner === "legacy-manager" ? ["worker"] : ["manager", "worker"];
227
+ const results = await Promise.allSettled(servers.map(async (endpoint) => {
228
+ try {
229
+ await serveLocalControl(control.stateDirectory, endpoint, combined, handle, () => {
230
+ if (owner === "legacy-manager") {
231
+ combined.throwIfAborted();
232
+ process.send?.({ kind: "worker-ready", version }, () => undefined);
233
+ }
234
+ }, (response) => {
235
+ if (typeof response === "object" &&
236
+ response !== null &&
237
+ "kind" in response &&
238
+ response.kind === "stopped") {
239
+ shutdown.abort();
240
+ }
241
+ });
242
+ }
243
+ finally {
244
+ shutdown.abort();
245
+ }
246
+ }));
247
+ for (const result of results) {
248
+ if (result.status === "rejected") {
249
+ throw result.reason;
250
+ }
251
+ }
252
+ if (shutdown.signal.reason instanceof DaemonRuntimeError) {
253
+ throw shutdown.signal.reason;
254
+ }
255
+ }
256
+ finally {
257
+ shutdown.abort();
258
+ await reload;
259
+ await Promise.all([...active.values()].map((running) => running.completion));
260
+ }
261
+ }
262
+ finally {
263
+ await releaseDaemon();
264
+ }
265
+ }
266
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/daemon/lifecycle/daemon.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,7 @@
1
1
  import type { InstallationDirectory } from "../../engine/storage/installation/installation-files.ts";
2
- export type DaemonProcessRole = "manager" | "worker";
3
2
  export interface UnhandledRejectionGuard {
4
3
  readonly bindStateDirectory: (stateDirectory: InstallationDirectory) => void;
5
4
  readonly release: () => void;
6
5
  }
7
- export declare function surviveUnhandledRejections(role: DaemonProcessRole): UnhandledRejectionGuard;
6
+ export declare function surviveUnhandledRejections(): UnhandledRejectionGuard;
8
7
  //# sourceMappingURL=unhandled-rejection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unhandled-rejection.d.ts","sourceRoot":"","sources":["../../../src/daemon/lifecycle/unhandled-rejection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yDAAyD,CAAC;AAQrG,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAqBrD,MAAM,WAAW,uBAAuB;IAGpC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,cAAc,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAChC;AAaD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,iBAAiB,GAAG,uBAAuB,CA6C3F"}
1
+ {"version":3,"file":"unhandled-rejection.d.ts","sourceRoot":"","sources":["../../../src/daemon/lifecycle/unhandled-rejection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yDAAyD,CAAC;AA2BrG,MAAM,WAAW,uBAAuB;IAGpC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,cAAc,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAChC;AAUD,wBAAgB,0BAA0B,IAAI,uBAAuB,CA6CpE"}
@@ -25,15 +25,12 @@ function describeRejection(reason) {
25
25
  // Node's default unhandled rejection mode kills the process, which would take
26
26
  // the whole daemon down for a stray floating promise. While this guard is
27
27
  // installed every unhandled rejection is recorded instead — stderr for the
28
- // supervised worker's captured tail, a bounded local log beside the other
28
+ // console, a bounded local log beside the other
29
29
  // daemon logs once its directory is bound. Recording is best-effort: a broken
30
30
  // log must never become the failure that kills the daemon.
31
31
  //
32
- // Each role writes its own file: BoundedLineLog rotation is not safe across
33
- // processes, so a file must have exactly one writer. The manager owns its file
34
- // through manager.lock; the worker must bind only after acquiring worker.lock,
35
- // which makes it the sole writer of its own file.
36
- export function surviveUnhandledRejections(role) {
32
+ // Bind after taking the daemon lock so the bounded log has exactly one writer.
33
+ export function surviveUnhandledRejections() {
37
34
  let log = null;
38
35
  const pending = [];
39
36
  const record = (reason) => {
@@ -63,7 +60,7 @@ export function surviveUnhandledRejections(role) {
63
60
  if (log !== null) {
64
61
  return;
65
62
  }
66
- log = new BoundedLineLog(logDirectory(stateDirectory), unhandledRejectionLogFilename(role), MAXIMUM_REJECTION_LOG_BYTES, (cause) => {
63
+ log = new BoundedLineLog(logDirectory(stateDirectory), unhandledRejectionLogFilename("worker"), MAXIMUM_REJECTION_LOG_BYTES, (cause) => {
67
64
  process.stderr.write(`The unhandled rejection log could not be written: ${String(cause)}\n`);
68
65
  });
69
66
  for (const entry of pending.splice(0)) {
@@ -1 +1 @@
1
- {"version":3,"file":"unhandled-rejection.js","sourceRoot":"","sources":["../../../src/daemon/lifecycle/unhandled-rejection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"unhandled-rejection.js","sourceRoot":"","sources":["../../../src/daemon/lifecycle/unhandled-rejection.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
1
  export declare function prepareVersionData(version: string, signal: AbortSignal): Promise<void>;
2
- export declare function discardRolledBackData(version: string, signal: AbortSignal): Promise<void>;
3
2
  export declare function recordCurrentData(version: string, signal: AbortSignal): Promise<void>;
4
3
  //# sourceMappingURL=data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/daemon/upgrades/data.ts"],"names":[],"mappings":"AAWA,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5F;AAID,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/F;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3F"}
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/daemon/upgrades/data.ts"],"names":[],"mappings":"AAWA,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5F;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3F"}
@@ -16,11 +16,6 @@ export async function prepareVersionData(version, signal) {
16
16
  await discardVersionData(root, targetVersion, signal);
17
17
  await copyVersionData(root, current, targetVersion, signal);
18
18
  }
19
- // A version whose switch rolled back never had the current data; once the previous version runs again, its copy is
20
- // stale, and its next attempt must inherit the current data rather than reuse that copy.
21
- export async function discardRolledBackData(version, signal) {
22
- await discardVersionData(readStateDirectory(), decodeRuntimeUpgradeVersion(version), signal);
23
- }
24
19
  export async function recordCurrentData(version, signal) {
25
20
  await writeCurrentDataVersion(readStateDirectory(), decodeRuntimeUpgradeVersion(version), signal);
26
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/daemon/upgrades/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EACH,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,GAC1B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,sHAAsH;AACtH,kCAAkC;AAClC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,MAAmB;IACzE,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,MAAM,aAAa,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAChD,OAAO;IACX,CAAC;IACD,6GAA6G;IAC7G,yFAAyF;IACzF,MAAM,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAChE,CAAC;AAED,mHAAmH;AACnH,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAe,EAAE,MAAmB;IAC5E,MAAM,kBAAkB,CAAC,kBAAkB,EAAE,EAAE,2BAA2B,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAmB;IACxE,MAAM,uBAAuB,CAAC,kBAAkB,EAAE,EAAE,2BAA2B,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;AACtG,CAAC"}
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/daemon/upgrades/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EACH,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,GAC1B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,sHAAsH;AACtH,kCAAkC;AAClC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,MAAmB;IACzE,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,MAAM,aAAa,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAChD,OAAO;IACX,CAAC;IACD,6GAA6G;IAC7G,yFAAyF;IACzF,MAAM,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAmB;IACxE,MAAM,uBAAuB,CAAC,kBAAkB,EAAE,EAAE,2BAA2B,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;AACtG,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-event-publisher.d.ts","sourceRoot":"","sources":["../../../../src/engine/runtime/relay/session-event-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EACjC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAiB,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAShE,eAAO,MAAM,uCAAuC,MAAM,CAAC;AAmB3D,+FAA+F;AAC/F,qBAAa,4BAA6B,YAAW,gBAAgB;;IASjE,YAAY,KAAK,EAAE,KAAK,EAEvB;IAED,QAAQ,CAAC,OAAO,WAAY,SAAS,KAAG,IAAI,CAO1C;IAEF,QAAQ,CAAC,UAAU,WAAY,SAAS,KAAG,IAAI,CAK7C;IAEF,QAAQ,CAAC,KAAK,QAAO,IAAI,CAMvB;IAEF,QAAQ,CAAC,KAAK,QAAO,IAAI,CAIvB;IAEF,QAAQ,CAAC,uBAAuB,cAAe,MAAM,aAAa,MAAM,QAAQ,MAAM,WAAW,MAAM,KAAG,IAAI,CAE5G;IACF,QAAQ,CAAC,aAAa,UAAW,yBAAyB,KAAG,IAAI,CAAsB;IACvF,QAAQ,CAAC,WAAW,UAAW,uBAAuB,KAAG,IAAI,CAAsB;IACnF,QAAQ,CAAC,aAAa,UAAW,uBAAuB,KAAG,IAAI,CAG7D;IAoBF,QAAQ,CAAC,OAAO,UAAW,gBAAgB,KAAG,IAAI,CAoEhD;IAkCF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAG1B;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAwC1B;CACL"}
1
+ {"version":3,"file":"session-event-publisher.d.ts","sourceRoot":"","sources":["../../../../src/engine/runtime/relay/session-event-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EACjC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAiB,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAShE,eAAO,MAAM,uCAAuC,MAAM,CAAC;AAmB3D,+FAA+F;AAC/F,qBAAa,4BAA6B,YAAW,gBAAgB;;IASjE,YAAY,KAAK,EAAE,KAAK,EAEvB;IAED,QAAQ,CAAC,OAAO,WAAY,SAAS,KAAG,IAAI,CAO1C;IAEF,QAAQ,CAAC,UAAU,WAAY,SAAS,KAAG,IAAI,CAK7C;IAEF,QAAQ,CAAC,KAAK,QAAO,IAAI,CAMvB;IAEF,QAAQ,CAAC,KAAK,QAAO,IAAI,CAIvB;IAEF,QAAQ,CAAC,uBAAuB,cAAe,MAAM,aAAa,MAAM,QAAQ,MAAM,WAAW,MAAM,KAAG,IAAI,CAE5G;IACF,QAAQ,CAAC,aAAa,UAAW,yBAAyB,KAAG,IAAI,CAAsB;IACvF,QAAQ,CAAC,WAAW,UAAW,uBAAuB,KAAG,IAAI,CAAsB;IACnF,QAAQ,CAAC,aAAa,UAAW,uBAAuB,KAAG,IAAI,CAG7D;IAoBF,QAAQ,CAAC,OAAO,UAAW,gBAAgB,KAAG,IAAI,CAoEhD;IAkCF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAG1B;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAyC1B;CACL"}
@@ -174,18 +174,18 @@ export class RuntimeSessionEventPublisher {
174
174
  if (connection.kind !== "connected" || connection.socket !== socket || socket.readyState !== WebSocket.OPEN) {
175
175
  return;
176
176
  }
177
- let attempted = 0;
177
+ let sent = 0;
178
178
  for (const batch of this.#pending) {
179
179
  const encoded = encodeDaemonToServiceMessage({ events: batch.events, kind: SESSION_EVENT_KIND });
180
180
  if (socket.bufferedAmount + Buffer.byteLength(encoded, "utf8") > MAX_BUFFERED_BYTES) {
181
181
  socket.close(LOCAL_BACKPRESSURE_CLOSE_CODE, "Live event transport overloaded");
182
182
  break;
183
183
  }
184
- // Once handed to the socket, a batch cannot be safely resent without acknowledgements.
185
- attempted += 1;
186
- this.#pendingBytes -= batch.bytes;
184
+ // Only discard a batch after the local socket accepts it; cloud delivery remains best effort.
187
185
  try {
188
186
  socket.send(encoded);
187
+ sent += 1;
188
+ this.#pendingBytes -= batch.bytes;
189
189
  for (const answer of batch.firstAnswers) {
190
190
  console.info(JSON.stringify({
191
191
  event: "runtime-first-answer-handoff-timing",
@@ -200,10 +200,11 @@ export class RuntimeSessionEventPublisher {
200
200
  }
201
201
  catch {
202
202
  console.warn("Live Session output could not be sent", { code: "live_event_send_failed" });
203
+ socket.close(LOCAL_BACKPRESSURE_CLOSE_CODE, "Live event handoff failed");
203
204
  break;
204
205
  }
205
206
  }
206
- this.#pending.splice(0, attempted);
207
+ this.#pending.splice(0, sent);
207
208
  if (this.#pending.length === 0) {
208
209
  this.#overflowReported = false;
209
210
  }