@moxt-ai/mobius 0.0.346 → 0.0.347

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 (43) hide show
  1. package/dist/cli.js +2246 -2066
  2. package/dist/cli.js.map +4 -4
  3. package/dist/daemon/lifecycle/worker.d.ts.map +1 -1
  4. package/dist/daemon/lifecycle/worker.js +10 -9
  5. package/dist/daemon/lifecycle/worker.js.map +1 -1
  6. package/dist/daemon/pairing/pair-local-machine.d.ts +5 -21
  7. package/dist/daemon/pairing/pair-local-machine.d.ts.map +1 -1
  8. package/dist/daemon/pairing/pair-local-machine.js +22 -254
  9. package/dist/daemon/pairing/pair-local-machine.js.map +1 -1
  10. package/dist/engine/acp/harness/codex/session-update.d.ts.map +1 -1
  11. package/dist/engine/acp/harness/codex/session-update.js +5 -1
  12. package/dist/engine/acp/harness/codex/session-update.js.map +1 -1
  13. package/dist/engine/index.d.ts +0 -2
  14. package/dist/engine/index.d.ts.map +1 -1
  15. package/dist/engine/index.js +0 -2
  16. package/dist/engine/index.js.map +1 -1
  17. package/dist/engine/runtime/connection/connection-manager.d.ts +13 -0
  18. package/dist/engine/runtime/connection/connection-manager.d.ts.map +1 -0
  19. package/dist/engine/runtime/connection/connection-manager.js +13 -0
  20. package/dist/engine/runtime/connection/connection-manager.js.map +1 -0
  21. package/dist/engine/runtime/connection/runtime-installation-store.d.ts +0 -2
  22. package/dist/engine/runtime/connection/runtime-installation-store.d.ts.map +1 -1
  23. package/dist/engine/runtime/connection/runtime-installation-store.js +0 -6
  24. package/dist/engine/runtime/connection/runtime-installation-store.js.map +1 -1
  25. package/dist/engine/runtime/engine.d.ts +25 -36
  26. package/dist/engine/runtime/engine.d.ts.map +1 -1
  27. package/dist/engine/runtime/engine.js +76 -127
  28. package/dist/engine/runtime/engine.js.map +1 -1
  29. package/dist/engine/runtime/pairing.d.ts +19 -0
  30. package/dist/engine/runtime/pairing.d.ts.map +1 -0
  31. package/dist/engine/runtime/pairing.js +227 -0
  32. package/dist/engine/runtime/pairing.js.map +1 -0
  33. package/dist/engine/runtime/runtime-loop.d.ts +43 -0
  34. package/dist/engine/runtime/runtime-loop.d.ts.map +1 -0
  35. package/dist/engine/runtime/runtime-loop.js +123 -0
  36. package/dist/engine/runtime/runtime-loop.js.map +1 -0
  37. package/dist/engine.js +2059 -1955
  38. package/dist/engine.js.map +4 -4
  39. package/dist/exports/engine.d.ts +2 -4
  40. package/dist/exports/engine.d.ts.map +1 -1
  41. package/dist/exports/engine.js +1 -4
  42. package/dist/exports/engine.js.map +1 -1
  43. package/package.json +1 -1
@@ -0,0 +1,227 @@
1
+ import { hostname } from "node:os";
2
+ import { basename, resolve } from "node:path";
3
+ import { isIdentifier, mobiusApiUrl } from "@moxt-ai/mobius-sdk/protocol";
4
+ import { fetch } from "undici";
5
+ import { discoverLocalAgentInventory } from "../agent/discovery/discover-local-agents.js";
6
+ import { RuntimeAgentDependencies } from "../agent/runtime-agents.js";
7
+ import { ensureCanonicalDirectory } from "../storage/files/local-files.js";
8
+ import { environmentProxyDispatcher } from "../util/network/environment-proxy.js";
9
+ import { isRecord } from "../util/value-utils.js";
10
+ import { publishAgentCatalog } from "./catalog/publish-agent-catalog.js";
11
+ import { createCatalogAgentResolver } from "./catalog/resolve-catalog-agent.js";
12
+ import { createRuntimeConfig, OpaqueRuntimeReconnectTarget, RuntimeLocalContext, } from "./config.js";
13
+ const PAIRING_TIMEOUT_MILLISECONDS = 20_000;
14
+ const PAIRING_CODE_PATTERN = /^[A-HJ-NP-Z2-9]{4}(?:-[A-HJ-NP-Z2-9]{4}){4}$/;
15
+ const TOKEN_PATTERN = /^[a-zA-Z0-9_-]{32,256}$/;
16
+ const CLAIM_RESPONSE_KEYS = ["appId", "channelId", "daemonToken", "runtimeId"];
17
+ const REDEEM_RESPONSE_KEYS = ["appId", "channelId", "runtimeCredential", "runtimeId"];
18
+ export class PairingClientError extends Error {
19
+ code;
20
+ constructor(code, message, options = {}) {
21
+ super(message, options);
22
+ this.code = code;
23
+ this.name = "PairingClientError";
24
+ }
25
+ }
26
+ function hasExactKeys(value, expectedKeys) {
27
+ const keys = Object.keys(value);
28
+ return keys.length === expectedKeys.length && expectedKeys.every((key) => Object.hasOwn(value, key));
29
+ }
30
+ export function parseRelayOrigin(value) {
31
+ let url;
32
+ try {
33
+ url = new URL(value);
34
+ }
35
+ catch (error) {
36
+ throw new PairingClientError("invalid_relay_url", "The relay URL is invalid", { cause: error });
37
+ }
38
+ if (url.protocol !== "https:" && url.protocol !== "http:") {
39
+ throw new PairingClientError("invalid_relay_url", "The relay URL must use http or https");
40
+ }
41
+ if (url.username.length > 0 || url.password.length > 0) {
42
+ throw new PairingClientError("invalid_relay_url", "The relay URL cannot contain credentials");
43
+ }
44
+ if (url.protocol === "http:" && url.hostname !== "127.0.0.1" && url.hostname !== "localhost") {
45
+ throw new PairingClientError("invalid_relay_url", "A remote relay must use https");
46
+ }
47
+ url.hash = "";
48
+ url.pathname = "/";
49
+ url.search = "";
50
+ return url;
51
+ }
52
+ export function parsePairingCode(value) {
53
+ const code = value.trim().toUpperCase();
54
+ if (!PAIRING_CODE_PATTERN.test(code)) {
55
+ throw new PairingClientError("invalid_pairing_code", "The pairing code must match the code shown in the browser");
56
+ }
57
+ return code;
58
+ }
59
+ export function validatePairingId(value) {
60
+ if (!isIdentifier(value)) {
61
+ throw new PairingClientError("invalid_pairing_id", "The Runtime pairing ID is invalid");
62
+ }
63
+ return value;
64
+ }
65
+ async function resolveDefaultWorkspace(path) {
66
+ const requestedWorkspace = resolve(path);
67
+ let defaultWorkspace;
68
+ try {
69
+ defaultWorkspace = await ensureCanonicalDirectory(requestedWorkspace);
70
+ }
71
+ catch (error) {
72
+ throw new PairingClientError("invalid_workspace", "The default workspace cannot be resolved", { cause: error });
73
+ }
74
+ if (defaultWorkspace === null) {
75
+ throw new PairingClientError("invalid_workspace", "The default workspace is not a directory");
76
+ }
77
+ return defaultWorkspace;
78
+ }
79
+ async function readJsonResponse(response) {
80
+ if (response.headers.get("cf-mitigated") === "challenge") {
81
+ throw new PairingClientError("relay_challenge", "Cloudflare is protecting this temporary preview. Claim the deployment or use an authenticated deployment, then pair again");
82
+ }
83
+ const encoded = await response.text();
84
+ try {
85
+ return JSON.parse(encoded);
86
+ }
87
+ catch (error) {
88
+ throw new PairingClientError("invalid_relay_response", "The relay returned an invalid response", {
89
+ cause: error,
90
+ });
91
+ }
92
+ }
93
+ function readRelayError(value) {
94
+ if (isRecord(value)) {
95
+ const error = value["error"];
96
+ if (isRecord(error)) {
97
+ const code = error["code"];
98
+ const message = error["message"];
99
+ if (typeof code === "string" && typeof message === "string") {
100
+ return new PairingClientError(code, message);
101
+ }
102
+ }
103
+ }
104
+ return new PairingClientError("pairing_failed", "The relay could not pair this machine");
105
+ }
106
+ function decodePairingResponse(value, credentialField, expectedKeys) {
107
+ if (!isRecord(value) || !hasExactKeys(value, expectedKeys)) {
108
+ throw new PairingClientError("invalid_relay_response", "The relay returned an invalid pairing response");
109
+ }
110
+ const appId = value["appId"];
111
+ const channelId = value["channelId"];
112
+ const runtimeCredential = value[credentialField];
113
+ const runtimeId = value["runtimeId"];
114
+ if (typeof appId !== "string" ||
115
+ !isIdentifier(appId) ||
116
+ typeof channelId !== "string" ||
117
+ !isIdentifier(channelId) ||
118
+ typeof runtimeCredential !== "string" ||
119
+ !TOKEN_PATTERN.test(runtimeCredential) ||
120
+ typeof runtimeId !== "string" ||
121
+ !isIdentifier(runtimeId)) {
122
+ throw new PairingClientError("invalid_relay_response", "The relay returned an invalid pairing response");
123
+ }
124
+ return { appId, channelId, runtimeCredential, runtimeId };
125
+ }
126
+ async function claimPairing(options, defaultWorkspace, localAgents, signal) {
127
+ const agents = localAgents.map((agent) => ({
128
+ agentPath: agent.agentIdentity.requestedPath,
129
+ agentVersion: agent.agentVersion,
130
+ agentSettingsDiscovery: true,
131
+ capabilities: agent.capabilities,
132
+ id: agent.id,
133
+ label: agent.label,
134
+ sessionTurnConfiguration: true,
135
+ }));
136
+ const endpoint = options.pairingId.length > 0
137
+ ? mobiusApiUrl(options.relayOrigin, `/v1/runtime-pairings/${encodeURIComponent(options.pairingId)}/redeem`)
138
+ : mobiusApiUrl(options.relayOrigin, "/pairings/claim");
139
+ let response;
140
+ try {
141
+ response = await fetch(endpoint, {
142
+ body: JSON.stringify({
143
+ agents,
144
+ machineName: hostname(),
145
+ pairingCode: options.code,
146
+ workspaceName: basename(defaultWorkspace) || "Local workspace",
147
+ }),
148
+ dispatcher: environmentProxyDispatcher,
149
+ headers: { "content-type": "application/json" },
150
+ method: "POST",
151
+ signal: AbortSignal.any([signal, AbortSignal.timeout(PAIRING_TIMEOUT_MILLISECONDS)]),
152
+ });
153
+ }
154
+ catch (error) {
155
+ signal.throwIfAborted();
156
+ throw new PairingClientError("relay_unavailable", "The pairing relay could not be reached", { cause: error });
157
+ }
158
+ const value = await readJsonResponse(response);
159
+ if (!response.ok) {
160
+ throw readRelayError(value);
161
+ }
162
+ return options.pairingId.length > 0
163
+ ? decodePairingResponse(value, "runtimeCredential", REDEEM_RESPONSE_KEYS)
164
+ : decodePairingResponse(value, "daemonToken", CLAIM_RESPONSE_KEYS);
165
+ }
166
+ function buildSavedRuntimeConfig(connection, defaultWorkspace, inventory, localContext) {
167
+ const relayUrl = mobiusApiUrl(connection.relayOrigin, "/v1/runtimes/connect");
168
+ relayUrl.protocol = relayUrl.protocol === "https:" ? "wss:" : "ws:";
169
+ relayUrl.searchParams.set("token", connection.runtimeCredential);
170
+ const config = createRuntimeConfig({
171
+ defaultWorkspace,
172
+ channelId: connection.channelId,
173
+ relayUrl,
174
+ }, new RuntimeAgentDependencies(inventory.readyAgents()), localContext, new OpaqueRuntimeReconnectTarget(connection.connectionId), createCatalogAgentResolver((refreshSignal) => discoverLocalAgentInventory({
175
+ defaultWorkspace,
176
+ dataDirectory: localContext.stateDirectory,
177
+ environment: localContext.agentLaunchEnvironment,
178
+ signal: refreshSignal,
179
+ }), () => config, publishAgentCatalog), (refreshSignal) => discoverLocalAgentInventory({
180
+ defaultWorkspace,
181
+ dataDirectory: localContext.stateDirectory,
182
+ environment: localContext.agentLaunchEnvironment,
183
+ signal: refreshSignal,
184
+ }).then((inventory) => inventory.readyAgents()));
185
+ return config;
186
+ }
187
+ async function pairRuntime(installation, options, signal, environment) {
188
+ const localContext = new RuntimeLocalContext(installation.stateDirectory, environment);
189
+ const defaultWorkspace = await resolveDefaultWorkspace(options.workspace);
190
+ const inventory = await discoverLocalAgentInventory({
191
+ defaultWorkspace,
192
+ dataDirectory: localContext.stateDirectory,
193
+ environment: localContext.agentLaunchEnvironment,
194
+ signal,
195
+ });
196
+ const claim = await claimPairing(options, defaultWorkspace, inventory.readyAgents(), signal);
197
+ const connection = await installation.saveConnection({
198
+ appId: claim.appId,
199
+ channelId: claim.channelId,
200
+ defaultWorkspace,
201
+ pairingId: options.pairingId,
202
+ relayOrigin: options.relayOrigin,
203
+ runtimeCredential: claim.runtimeCredential,
204
+ runtimeId: claim.runtimeId,
205
+ }, signal);
206
+ return connection;
207
+ }
208
+ export async function pairRuntimeConnection(installation, options, signal, environment) {
209
+ return await pairRuntime(installation, {
210
+ code: parsePairingCode(options.pairingCode),
211
+ pairingId: options.pairingId.length === 0 ? "" : validatePairingId(options.pairingId),
212
+ relayOrigin: parseRelayOrigin(options.relayOrigin),
213
+ workspace: options.defaultWorkspace,
214
+ }, signal, environment);
215
+ }
216
+ export async function prepareRuntimeConnection(installation, connection, signal, environment, maxAcpProcesses) {
217
+ const localContext = new RuntimeLocalContext(installation.stateDirectory, environment, maxAcpProcesses);
218
+ const defaultWorkspace = await resolveDefaultWorkspace(connection.defaultWorkspace);
219
+ const inventory = await discoverLocalAgentInventory({
220
+ defaultWorkspace,
221
+ dataDirectory: localContext.stateDirectory,
222
+ environment: localContext.agentLaunchEnvironment,
223
+ signal,
224
+ });
225
+ return buildSavedRuntimeConfig(connection, defaultWorkspace, inventory, localContext);
226
+ }
227
+ //# sourceMappingURL=pairing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../../../src/engine/runtime/pairing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { RuntimeUpgradeResult } from "@moxt-ai/mobius-sdk/protocol";
2
+ import type { RuntimeTurnActivity } from "../session/turn/runtime-turn-activity.ts";
3
+ import { type RuntimeConfig } from "./config.ts";
4
+ import type { RuntimeInstallationStore } from "./connection/runtime-installation-store.ts";
5
+ export interface MobiusRuntimeConnection {
6
+ readonly channelId: string;
7
+ readonly defaultWorkspace: string;
8
+ readonly relayUrl: string;
9
+ readonly runtimeCredential: string;
10
+ }
11
+ export declare class MobiusRuntimeConfigurationError extends Error {
12
+ readonly code = "runtime_configuration_invalid";
13
+ constructor(message: string, options?: ErrorOptions);
14
+ }
15
+ interface PrepareProvidedRuntimeParams {
16
+ readonly installation: RuntimeInstallationStore;
17
+ readonly connection: MobiusRuntimeConnection;
18
+ readonly signal: AbortSignal;
19
+ readonly agentLaunchEnvironment: Readonly<NodeJS.ProcessEnv>;
20
+ readonly maxAcpProcesses: number;
21
+ }
22
+ export declare function prepareProvidedRuntime({ installation, connection, signal, agentLaunchEnvironment, maxAcpProcesses, }: PrepareProvidedRuntimeParams): Promise<RuntimeConfig>;
23
+ /** Internal, single-execution owner. Never exported from the package's public API. */
24
+ export declare class RuntimeLoop {
25
+ #private;
26
+ constructor(prepare: (signal: AbortSignal) => Promise<RuntimeConfig>, options?: RuntimeLoopOptions);
27
+ readonly run: (signal: AbortSignal) => Promise<void>;
28
+ }
29
+ export interface RuntimeLoopOptions {
30
+ readonly turnActivity?: RuntimeTurnActivity;
31
+ readonly onConnectionStatus?: (status: "online" | "reconnecting") => void;
32
+ readonly onExecutionCountChange?: (count: number) => void;
33
+ /** Reports a finished daemon upgrade to the relay. The daemon worker supplies it. */
34
+ readonly reportUpgradeAvailability?: (send: (result: RuntimeUpgradeResult) => void, signal: AbortSignal) => Promise<void>;
35
+ /**
36
+ * State directory of the daemon processes supervising this Runtime. Passed
37
+ * through to `runRuntime` so the local bug-report log can read the
38
+ * manager-written worker lifecycle and unhandled-rejection logs. Read-only.
39
+ */
40
+ readonly processLogsDirectory?: string;
41
+ }
42
+ export {};
43
+ //# sourceMappingURL=runtime-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-loop.d.ts","sourceRoot":"","sources":["../../../src/engine/runtime/runtime-loop.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAMzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAIpF,OAAO,EAAuB,KAAK,aAAa,EAAuB,MAAM,aAAa,CAAC;AAC3F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAK3F,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACtC;AAED,qBAAa,+BAAgC,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,mCAAmC;IAEhD,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAGtD;CACJ;AAmDD,UAAU,4BAA4B;IAClC,QAAQ,CAAC,YAAY,EAAE,wBAAwB,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACpC;AAED,wBAAsB,sBAAsB,CAAC,EACzC,YAAY,EACZ,UAAU,EACV,MAAM,EACN,sBAAsB,EACtB,eAAe,GAClB,EAAE,4BAA4B,GAAG,OAAO,CAAC,aAAa,CAAC,CAiCvD;AAED,sFAAsF;AACtF,qBAAa,WAAW;;IAKpB,YAAY,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,GAAE,kBAAuB,EAGrG;IAED,QAAQ,CAAC,GAAG,WAAkB,WAAW,KAAG,OAAO,CAAC,IAAI,CAAC,CA+BvD;CACL;AAED,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,cAAc,KAAK,IAAI,CAAC;IAC1E,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,qFAAqF;IACrF,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CACjC,IAAI,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,EAC5C,MAAM,EAAE,WAAW,KAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC1C"}
@@ -0,0 +1,123 @@
1
+ import { resolve } from "node:path";
2
+ import { discoverLocalAgentInventory, supportedLocalAgentSpecifications, } from "../agent/discovery/discover-local-agents.js";
3
+ import { RuntimeAgentDependencies } from "../agent/runtime-agents.js";
4
+ import { ensureCanonicalDirectory } from "../storage/files/local-files.js";
5
+ import { publishAgentCatalog } from "./catalog/publish-agent-catalog.js";
6
+ import { createCatalogAgentResolver } from "./catalog/resolve-catalog-agent.js";
7
+ import { createRuntimeConfig, RuntimeLocalContext } from "./config.js";
8
+ import { runRuntime } from "./run.js";
9
+ const RUNTIME_CREDENTIAL_PATTERN = /^[a-zA-Z0-9_-]{32,256}$/;
10
+ export class MobiusRuntimeConfigurationError extends Error {
11
+ code = "runtime_configuration_invalid";
12
+ constructor(message, options = {}) {
13
+ super(message, options);
14
+ this.name = "MobiusRuntimeConfigurationError";
15
+ }
16
+ }
17
+ function validateRuntimeRelay(relayUrl) {
18
+ if (relayUrl.protocol !== "ws:" && relayUrl.protocol !== "wss:") {
19
+ throw new MobiusRuntimeConfigurationError("The Runtime relay URL must use WebSocket transport");
20
+ }
21
+ const credential = relayUrl.searchParams.get("token") ?? "";
22
+ if (credential.length === 0) {
23
+ throw new MobiusRuntimeConfigurationError("The Runtime relay credential is required");
24
+ }
25
+ if (!RUNTIME_CREDENTIAL_PATTERN.test(credential)) {
26
+ throw new MobiusRuntimeConfigurationError("The Runtime relay credential is invalid");
27
+ }
28
+ }
29
+ function validateRuntimeConfiguration(config) {
30
+ validateRuntimeRelay(config.relayUrl);
31
+ }
32
+ function relayUrlFromConnection(connection) {
33
+ let relayUrl;
34
+ try {
35
+ relayUrl = new URL(connection.relayUrl);
36
+ }
37
+ catch (error) {
38
+ throw new MobiusRuntimeConfigurationError("The Runtime relay URL is invalid", { cause: error });
39
+ }
40
+ relayUrl.searchParams.set("token", connection.runtimeCredential);
41
+ validateRuntimeRelay(relayUrl);
42
+ return relayUrl;
43
+ }
44
+ async function resolveWorkspace(path) {
45
+ const requested = resolve(path);
46
+ let resolved;
47
+ try {
48
+ resolved = await ensureCanonicalDirectory(requested);
49
+ }
50
+ catch (error) {
51
+ throw new MobiusRuntimeConfigurationError("The Runtime workspace cannot be resolved", { cause: error });
52
+ }
53
+ if (resolved === null) {
54
+ throw new MobiusRuntimeConfigurationError("The Runtime workspace is not a directory");
55
+ }
56
+ return resolved;
57
+ }
58
+ export async function prepareProvidedRuntime({ installation, connection, signal, agentLaunchEnvironment, maxAcpProcesses, }) {
59
+ signal.throwIfAborted();
60
+ const relayUrl = relayUrlFromConnection(connection);
61
+ const localContext = new RuntimeLocalContext(installation.stateDirectory, agentLaunchEnvironment, maxAcpProcesses);
62
+ const defaultWorkspace = await resolveWorkspace(connection.defaultWorkspace);
63
+ const specifications = supportedLocalAgentSpecifications();
64
+ const discoveryEnvironment = localContext.agentLaunchEnvironment;
65
+ const discover = async (refreshSignal) => await discoverLocalAgentInventory({
66
+ defaultWorkspace,
67
+ dataDirectory: localContext.stateDirectory,
68
+ environment: discoveryEnvironment,
69
+ signal: refreshSignal,
70
+ specifications,
71
+ });
72
+ const inventory = await discover(signal);
73
+ const config = createRuntimeConfig({
74
+ channelId: connection.channelId,
75
+ defaultWorkspace,
76
+ relayUrl,
77
+ }, new RuntimeAgentDependencies(inventory.readyAgents()), localContext, null, createCatalogAgentResolver((refreshSignal) => discover(refreshSignal), () => config, publishAgentCatalog), (refreshSignal) => discover(refreshSignal).then((inventory) => inventory.readyAgents()));
78
+ return config;
79
+ }
80
+ /** Internal, single-execution owner. Never exported from the package's public API. */
81
+ export class RuntimeLoop {
82
+ #prepare;
83
+ #options;
84
+ #state = { kind: "created" };
85
+ constructor(prepare, options = {}) {
86
+ this.#prepare = prepare;
87
+ this.#options = options;
88
+ }
89
+ run = async (signal) => {
90
+ if (this.#state.kind !== "created") {
91
+ throw new MobiusRuntimeConfigurationError("A Runtime loop can only be started once");
92
+ }
93
+ signal.throwIfAborted();
94
+ // Claim this execution before asynchronous preparation can yield.
95
+ this.#state = { kind: "preparing" };
96
+ try {
97
+ const config = await this.#prepare(signal);
98
+ signal.throwIfAborted();
99
+ validateRuntimeConfiguration(config);
100
+ this.#state = { kind: "running", config };
101
+ await runRuntime(config, signal, undefined, {
102
+ ...(this.#options.turnActivity === undefined ? {} : { turnActivity: this.#options.turnActivity }),
103
+ onExecutionCountChange: (count) => {
104
+ this.#options.onExecutionCountChange?.(count);
105
+ },
106
+ ...(this.#options.onConnectionStatus === undefined
107
+ ? {}
108
+ : { onConnectionStatus: this.#options.onConnectionStatus }),
109
+ ...(this.#options.reportUpgradeAvailability === undefined
110
+ ? {}
111
+ : { reportUpgradeAvailability: this.#options.reportUpgradeAvailability }),
112
+ ...(this.#options.processLogsDirectory === undefined
113
+ ? {}
114
+ : { processLogsDirectory: this.#options.processLogsDirectory }),
115
+ });
116
+ }
117
+ finally {
118
+ this.#state = { kind: "finished" };
119
+ this.#options.onExecutionCountChange?.(0);
120
+ }
121
+ };
122
+ }
123
+ //# sourceMappingURL=runtime-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-loop.js","sourceRoot":"","sources":["../../../src/engine/runtime/runtime-loop.ts"],"names":[],"mappings":"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"}