@the-open-engine/zeroshot 6.29.0 → 6.30.0
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.
- package/CHANGELOG.md +4 -0
- package/cli/index.js +2 -4
- package/lib/agent-cli-provider/adapters/codex.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/codex.js +0 -1
- package/lib/agent-cli-provider/adapters/codex.js.map +1 -1
- package/lib/agent-cli-provider/contract-actions.d.ts +1 -1
- package/lib/agent-cli-provider/contract-actions.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-actions.js +5 -5
- package/lib/agent-cli-provider/contract-actions.js.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.d.ts +1 -1
- package/lib/agent-cli-provider/contract-invoke.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.js +2 -2
- package/lib/agent-cli-provider/contract-invoke.js.map +1 -1
- package/lib/agent-cli-provider/contract-support.d.ts +1 -1
- package/lib/agent-cli-provider/contract-support.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-support.js +2 -2
- package/lib/agent-cli-provider/contract-support.js.map +1 -1
- package/lib/agent-cli-provider/contract.d.ts +1 -0
- package/lib/agent-cli-provider/contract.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract.js +1 -1
- package/lib/agent-cli-provider/contract.js.map +1 -1
- package/lib/agent-cli-provider/index.d.ts +1 -1
- package/lib/agent-cli-provider/index.d.ts.map +1 -1
- package/lib/agent-cli-provider/index.js +2 -1
- package/lib/agent-cli-provider/index.js.map +1 -1
- package/lib/agent-cli-provider/provider-registry.d.ts +1 -0
- package/lib/agent-cli-provider/provider-registry.d.ts.map +1 -1
- package/lib/agent-cli-provider/provider-registry.js +4 -0
- package/lib/agent-cli-provider/provider-registry.js.map +1 -1
- package/lib/agent-cli-provider/single-agent-runtime.d.ts +3 -3
- package/lib/agent-cli-provider/single-agent-runtime.d.ts.map +1 -1
- package/lib/agent-cli-provider/single-agent-runtime.js +22 -48
- package/lib/agent-cli-provider/single-agent-runtime.js.map +1 -1
- package/lib/cluster/client.cjs +30 -7
- package/lib/cluster/client.d.cts +52 -0
- package/lib/cluster/client.d.mts +52 -0
- package/lib/cluster/client.d.ts +4 -6
- package/lib/cluster/client.mjs +32 -9
- package/lib/cluster/connection-state.cjs +25 -0
- package/lib/cluster/connection-state.d.cts +13 -0
- package/lib/cluster/connection-state.d.mts +13 -0
- package/lib/cluster/connection-state.d.ts +13 -0
- package/lib/cluster/connection-state.mjs +21 -0
- package/lib/{target/hosted-run/contracts.js → cluster/connection-types.cjs} +0 -1
- package/lib/cluster/connection-types.d.cts +33 -0
- package/lib/cluster/connection-types.d.mts +33 -0
- package/lib/cluster/connection-types.d.ts +33 -0
- package/lib/cluster/connection-types.mjs +1 -0
- package/lib/cluster/connection.cjs +18 -46
- package/lib/cluster/connection.d.cts +26 -0
- package/lib/cluster/connection.d.mts +26 -0
- package/lib/cluster/connection.d.ts +7 -25
- package/lib/cluster/connection.mjs +12 -42
- package/lib/cluster/errors.cjs +9 -1
- package/lib/cluster/errors.d.cts +29 -0
- package/lib/cluster/errors.d.mts +29 -0
- package/lib/cluster/errors.d.ts +4 -0
- package/lib/cluster/errors.mjs +7 -0
- package/lib/cluster/frames.d.cts +12 -0
- package/lib/cluster/frames.d.mts +12 -0
- package/lib/cluster/generated/protocol-schema.d.cts +1 -0
- package/lib/cluster/generated/protocol-schema.d.mts +1 -0
- package/lib/cluster/generated/protocol.d.cts +781 -0
- package/lib/cluster/generated/protocol.d.mts +781 -0
- package/lib/cluster/index.cjs +2 -2
- package/lib/cluster/index.d.cts +13 -0
- package/lib/cluster/index.d.mts +13 -0
- package/lib/cluster/index.d.ts +3 -3
- package/lib/cluster/index.mjs +2 -2
- package/lib/cluster/json-source.cjs +1 -0
- package/lib/cluster/json-source.d.cts +5 -0
- package/lib/cluster/json-source.d.mts +5 -0
- package/lib/cluster/json-source.d.ts +1 -0
- package/lib/cluster/json-source.mjs +1 -0
- package/lib/cluster/payload-value.cjs +1 -0
- package/lib/cluster/payload-value.d.cts +8 -0
- package/lib/cluster/payload-value.d.mts +8 -0
- package/lib/cluster/payload-value.d.ts +1 -0
- package/lib/cluster/payload-value.mjs +1 -0
- package/lib/cluster/queue.d.cts +15 -0
- package/lib/cluster/queue.d.mts +15 -0
- package/lib/cluster/socket.cjs +8 -0
- package/lib/cluster/socket.d.cts +13 -0
- package/lib/cluster/socket.d.mts +13 -0
- package/lib/cluster/socket.d.ts +2 -0
- package/lib/cluster/socket.mjs +7 -0
- package/lib/cluster/subscriptions.d.cts +73 -0
- package/lib/cluster/subscriptions.d.mts +73 -0
- package/lib/cluster/subscriptions.d.ts +5 -1
- package/lib/cluster/validators.cjs +1 -0
- package/lib/cluster/validators.d.cts +7 -0
- package/lib/cluster/validators.d.mts +7 -0
- package/lib/cluster/validators.d.ts +1 -0
- package/lib/cluster/validators.mjs +1 -0
- package/lib/cluster-worker/engine-adapter-common.js +37 -0
- package/lib/cluster-worker/engine-adapter.js +24 -30
- package/lib/cluster-worker/engine-start.js +59 -0
- package/lib/cluster-worker/index.js +49 -67
- package/lib/cluster-worker/profiles.js +1 -42
- package/lib/cluster-worker/runtime-dependencies.js +49 -0
- package/lib/cluster-worker/runtime-support.js +2 -34
- package/lib/cluster-worker/terminal-normalizer.js +9 -10
- package/lib/hosted-session/authority.cjs +61 -0
- package/lib/hosted-session/authority.d.cts +3 -0
- package/lib/hosted-session/authority.d.mts +3 -0
- package/lib/hosted-session/authority.d.ts +3 -0
- package/lib/hosted-session/authority.mjs +57 -0
- package/lib/hosted-session/coordinator.cjs +78 -51
- package/lib/hosted-session/coordinator.d.cts +11 -0
- package/lib/hosted-session/coordinator.d.mts +11 -0
- package/lib/hosted-session/coordinator.d.ts +4 -2
- package/lib/hosted-session/coordinator.mjs +75 -51
- package/lib/hosted-session/errors.cjs +25 -0
- package/lib/hosted-session/errors.d.cts +10 -0
- package/lib/hosted-session/errors.d.mts +10 -0
- package/lib/hosted-session/errors.d.ts +10 -0
- package/lib/hosted-session/errors.mjs +19 -0
- package/lib/hosted-session/index.cjs +4 -1
- package/lib/hosted-session/index.d.cts +2 -0
- package/lib/hosted-session/index.d.mts +2 -0
- package/lib/hosted-session/index.d.ts +2 -2
- package/lib/hosted-session/index.mjs +1 -1
- package/lib/hosted-session/reconnecting-watch.cjs +131 -0
- package/lib/hosted-session/reconnecting-watch.d.cts +13 -0
- package/lib/hosted-session/reconnecting-watch.d.mts +13 -0
- package/lib/hosted-session/reconnecting-watch.d.ts +13 -0
- package/lib/hosted-session/reconnecting-watch.mjs +127 -0
- package/lib/hosted-session/types.d.cts +32 -0
- package/lib/hosted-session/types.d.mts +32 -0
- package/lib/hosted-session/types.d.ts +19 -7
- package/lib/hosted-target/access-url.cjs +44 -0
- package/lib/hosted-target/access-url.d.cts +2 -0
- package/lib/hosted-target/access-url.d.mts +2 -0
- package/lib/hosted-target/access-url.d.ts +2 -0
- package/lib/hosted-target/access-url.mjs +41 -0
- package/lib/hosted-target/adapter-request.cjs +12 -0
- package/lib/hosted-target/adapter-request.d.cts +17 -0
- package/lib/hosted-target/adapter-request.d.mts +17 -0
- package/lib/hosted-target/adapter-request.d.ts +17 -0
- package/lib/hosted-target/adapter-request.mjs +9 -0
- package/lib/hosted-target/adapter-types.cjs +2 -0
- package/lib/hosted-target/adapter-types.d.cts +27 -0
- package/lib/hosted-target/adapter-types.d.mts +27 -0
- package/lib/hosted-target/adapter-types.d.ts +27 -0
- package/lib/hosted-target/adapter-types.mjs +1 -0
- package/lib/hosted-target/bounds.cjs +10 -0
- package/lib/hosted-target/bounds.d.cts +7 -0
- package/lib/hosted-target/bounds.d.mts +7 -0
- package/lib/hosted-target/bounds.d.ts +7 -0
- package/lib/hosted-target/bounds.mjs +7 -0
- package/lib/hosted-target/capsule-error-response.cjs +76 -0
- package/lib/hosted-target/capsule-error-response.d.cts +2 -0
- package/lib/hosted-target/capsule-error-response.d.mts +2 -0
- package/lib/hosted-target/capsule-error-response.d.ts +2 -0
- package/lib/hosted-target/capsule-error-response.mjs +73 -0
- package/lib/hosted-target/errors.cjs +88 -0
- package/lib/hosted-target/errors.d.cts +36 -0
- package/lib/hosted-target/errors.d.mts +36 -0
- package/lib/hosted-target/errors.d.ts +36 -0
- package/lib/hosted-target/errors.mjs +75 -0
- package/lib/hosted-target/index.cjs +16 -0
- package/lib/hosted-target/index.d.cts +3 -0
- package/lib/hosted-target/index.d.mts +3 -0
- package/lib/hosted-target/index.d.ts +3 -0
- package/lib/hosted-target/index.mjs +2 -0
- package/lib/hosted-target/response-validation.cjs +169 -0
- package/lib/hosted-target/response-validation.d.cts +5 -0
- package/lib/hosted-target/response-validation.d.mts +5 -0
- package/lib/hosted-target/response-validation.d.ts +5 -0
- package/lib/hosted-target/response-validation.mjs +163 -0
- package/lib/hosted-target/retry-executor.cjs +51 -0
- package/lib/hosted-target/retry-executor.d.cts +8 -0
- package/lib/hosted-target/retry-executor.d.mts +8 -0
- package/lib/hosted-target/retry-executor.d.ts +8 -0
- package/lib/hosted-target/retry-executor.mjs +48 -0
- package/lib/hosted-target/retry.cjs +78 -0
- package/lib/hosted-target/retry.d.cts +9 -0
- package/lib/hosted-target/retry.d.mts +9 -0
- package/lib/hosted-target/retry.d.ts +9 -0
- package/lib/hosted-target/retry.mjs +73 -0
- package/lib/hosted-target/target-adapter.cjs +10 -0
- package/lib/hosted-target/target-adapter.d.cts +3 -0
- package/lib/hosted-target/target-adapter.d.mts +3 -0
- package/lib/hosted-target/target-adapter.d.ts +3 -0
- package/lib/hosted-target/target-adapter.mjs +7 -0
- package/lib/hosted-target/types.cjs +4 -0
- package/lib/hosted-target/types.d.cts +50 -0
- package/lib/hosted-target/types.d.mts +50 -0
- package/lib/hosted-target/types.d.ts +50 -0
- package/lib/hosted-target/types.mjs +1 -0
- package/lib/hosted-target/zero-cloud-v1-adapter.cjs +185 -0
- package/lib/hosted-target/zero-cloud-v1-adapter.d.cts +13 -0
- package/lib/hosted-target/zero-cloud-v1-adapter.d.mts +13 -0
- package/lib/hosted-target/zero-cloud-v1-adapter.d.ts +13 -0
- package/lib/hosted-target/zero-cloud-v1-adapter.mjs +181 -0
- package/lib/start-cluster.js +3 -3
- package/lib/target/bounded-response.cjs +51 -0
- package/lib/target/bounded-response.d.cts +1 -0
- package/lib/target/bounded-response.d.mts +1 -0
- package/lib/target/bounded-response.d.ts +1 -0
- package/lib/target/bounded-response.js +51 -0
- package/lib/target/bounded-response.mjs +48 -0
- package/lib/target/credential-lock.js +1 -3
- package/lib/target/credential-store.js +9 -4
- package/lib/target/device-flow.cjs +213 -0
- package/lib/target/device-flow.d.cts +54 -0
- package/lib/target/device-flow.d.mts +54 -0
- package/lib/target/device-flow.d.ts +26 -14
- package/lib/target/device-flow.js +162 -58
- package/lib/target/device-flow.mjs +203 -0
- package/lib/target/discovery-errors.cjs +10 -0
- package/lib/target/discovery-errors.d.cts +3 -0
- package/lib/target/discovery-errors.d.mts +3 -0
- package/lib/target/discovery-errors.d.ts +3 -0
- package/lib/target/discovery-errors.js +10 -0
- package/lib/target/discovery-errors.mjs +6 -0
- package/lib/target/discovery-sections.cjs +191 -0
- package/lib/target/discovery-sections.d.cts +52 -0
- package/lib/target/discovery-sections.d.mts +52 -0
- package/lib/target/discovery-sections.d.ts +52 -0
- package/lib/target/discovery-sections.js +191 -0
- package/lib/target/discovery-sections.mjs +179 -0
- package/lib/target/discovery-validation.cjs +109 -0
- package/lib/target/discovery-validation.d.cts +28 -0
- package/lib/target/discovery-validation.d.mts +28 -0
- package/lib/target/discovery-validation.d.ts +28 -0
- package/lib/target/discovery-validation.js +109 -0
- package/lib/target/discovery-validation.mjs +99 -0
- package/lib/target/discovery.cjs +112 -0
- package/lib/target/discovery.d.cts +74 -0
- package/lib/target/discovery.d.mts +74 -0
- package/lib/target/discovery.d.ts +67 -5
- package/lib/target/discovery.js +94 -79
- package/lib/target/discovery.mjs +105 -0
- package/lib/target/index.d.ts +6 -6
- package/lib/target/index.js +36 -36
- package/lib/target/oauth-http.d.ts +2 -0
- package/lib/target/oauth-http.js +25 -0
- package/lib/target/refresh-exchange.d.ts +11 -0
- package/lib/target/refresh-exchange.js +24 -0
- package/lib/target/refresh-revocation.d.ts +8 -0
- package/lib/target/refresh-revocation.js +19 -0
- package/lib/target/route-template.cjs +85 -0
- package/lib/target/route-template.d.cts +7 -0
- package/lib/target/route-template.d.mts +7 -0
- package/lib/target/route-template.d.ts +7 -0
- package/lib/target/route-template.js +85 -0
- package/lib/target/route-template.mjs +81 -0
- package/lib/target/session-errors.d.ts +4 -0
- package/lib/target/session-errors.js +12 -0
- package/lib/target/session-verification.d.ts +10 -0
- package/lib/target/session-verification.js +42 -0
- package/lib/target/target-registry.d.ts +7 -3
- package/lib/target/target-registry.js +41 -10
- package/lib/target/target-session-manager.d.ts +48 -0
- package/lib/target/target-session-manager.js +226 -0
- package/lib/target/target-session.d.ts +39 -32
- package/lib/target/target-session.js +63 -151
- package/lib/target/token-response.cjs +51 -0
- package/lib/target/token-response.d.cts +7 -0
- package/lib/target/token-response.d.mts +7 -0
- package/lib/target/token-response.d.ts +7 -0
- package/lib/target/token-response.js +51 -0
- package/lib/target/token-response.mjs +48 -0
- package/package.json +14 -7
- package/protocol/openengine-cluster/v1/worker.schema.json +171 -9
- package/scripts/build-cluster.js +23 -3
- package/scripts/opcore-introduced-check.js +0 -2
- package/src/agent-cli-provider/adapters/codex.ts +0 -1
- package/src/agent-cli-provider/contract-actions.ts +9 -5
- package/src/agent-cli-provider/contract-invoke.ts +3 -2
- package/src/agent-cli-provider/contract-support.ts +12 -6
- package/src/agent-cli-provider/contract.ts +6 -1
- package/src/agent-cli-provider/index.ts +1 -0
- package/src/agent-cli-provider/provider-registry.ts +4 -0
- package/src/agent-cli-provider/single-agent-runtime.ts +32 -45
- package/src/cluster/client.ts +42 -15
- package/src/cluster/connection-state.ts +33 -0
- package/src/cluster/connection-types.ts +28 -0
- package/src/cluster/connection.ts +37 -68
- package/src/cluster/errors.ts +5 -0
- package/src/cluster/index.ts +3 -1
- package/src/cluster/json-source.ts +1 -0
- package/src/cluster/payload-value.ts +1 -0
- package/src/cluster/socket.ts +13 -0
- package/src/cluster/subscriptions.ts +7 -2
- package/src/cluster/validators.ts +1 -0
- package/src/cluster/ws.d.ts +1 -1
- package/src/hosted-session/authority.ts +77 -0
- package/src/hosted-session/coordinator.ts +113 -56
- package/src/hosted-session/errors.ts +21 -0
- package/src/hosted-session/index.ts +14 -2
- package/src/hosted-session/reconnecting-watch.ts +148 -0
- package/src/hosted-session/types.ts +22 -8
- package/src/hosted-target/access-url.ts +46 -0
- package/src/hosted-target/adapter-request.ts +28 -0
- package/src/hosted-target/adapter-types.ts +39 -0
- package/src/hosted-target/bounds.ts +1 -0
- package/src/hosted-target/capsule-error-response.ts +107 -0
- package/src/hosted-target/errors.ts +36 -35
- package/src/hosted-target/index.ts +10 -23
- package/src/hosted-target/response-validation.ts +170 -62
- package/src/hosted-target/retry-executor.ts +62 -0
- package/src/hosted-target/retry.ts +47 -11
- package/src/hosted-target/target-adapter.ts +12 -8
- package/src/hosted-target/types.ts +19 -18
- package/src/hosted-target/zero-cloud-v1-adapter.ts +229 -316
- package/src/isolation-manager.js +1 -16
- package/src/target/bounded-response.ts +68 -0
- package/src/target/credential-lock.ts +1 -3
- package/src/target/credential-store.ts +14 -10
- package/src/target/device-flow.ts +209 -85
- package/src/target/discovery-errors.ts +6 -0
- package/src/target/discovery-sections.ts +251 -0
- package/src/target/discovery-validation.ts +144 -0
- package/src/target/discovery.ts +163 -97
- package/src/target/index.ts +15 -11
- package/src/target/oauth-http.ts +27 -0
- package/src/target/refresh-exchange.ts +36 -0
- package/src/target/refresh-revocation.ts +29 -0
- package/src/target/route-template.ts +105 -0
- package/src/target/session-errors.ts +9 -0
- package/src/target/session-verification.ts +51 -0
- package/src/target/target-registry.ts +60 -27
- package/src/target/target-session-manager.ts +285 -0
- package/src/target/target-session.ts +105 -226
- package/src/target/token-response.ts +62 -0
- package/docker/zeroshot-oecp/Cargo.toml +0 -12
- package/docker/zeroshot-oecp/Dockerfile +0 -65
- package/docker/zeroshot-oecp/src/main.rs +0 -32
- package/lib/target/bounded-json.d.ts +0 -6
- package/lib/target/bounded-json.js +0 -43
- package/lib/target/hosted-run/client.d.ts +0 -26
- package/lib/target/hosted-run/client.js +0 -158
- package/lib/target/hosted-run/commands.d.ts +0 -4
- package/lib/target/hosted-run/commands.js +0 -113
- package/lib/target/hosted-run/contracts.d.ts +0 -49
- package/lib/target/hosted-run/input.d.ts +0 -5
- package/lib/target/hosted-run/input.js +0 -200
- package/lib/target/hosted-run.d.ts +0 -4
- package/lib/target/hosted-run.js +0 -12
- package/src/target/bounded-json.ts +0 -48
- package/src/target/hosted-run/client.ts +0 -198
- package/src/target/hosted-run/commands.ts +0 -140
- package/src/target/hosted-run/contracts.ts +0 -53
- package/src/target/hosted-run/input.ts +0 -199
- package/src/target/hosted-run.ts +0 -8
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
const { cloneJson } = require('./object-utils');
|
|
4
4
|
const { inputFromRequest } = require('./engine-input');
|
|
5
|
+
const {
|
|
6
|
+
createAdapterFacade,
|
|
7
|
+
declaredFailureEvent,
|
|
8
|
+
frozenResourceStatus,
|
|
9
|
+
} = require('./engine-adapter-common');
|
|
5
10
|
|
|
6
11
|
const TERMINAL_TOPICS = new Set(['CLUSTER_COMPLETE', 'CLUSTER_FAILED']);
|
|
7
12
|
|
|
@@ -9,21 +14,20 @@ function messageKey(message) {
|
|
|
9
14
|
return message.id ?? `${message.timestamp}:${message.topic}:${message.sender}`;
|
|
10
15
|
}
|
|
11
16
|
|
|
17
|
+
function completionPayload(data) {
|
|
18
|
+
const payload = {};
|
|
19
|
+
if (Object.prototype.hasOwnProperty.call(data, 'result')) payload.result = data.result;
|
|
20
|
+
if (Object.prototype.hasOwnProperty.call(data, 'artifacts')) payload.artifacts = data.artifacts;
|
|
21
|
+
return payload;
|
|
22
|
+
}
|
|
23
|
+
|
|
12
24
|
function terminalEventFromMessage(message) {
|
|
13
25
|
const data = message.content?.data || {};
|
|
14
26
|
if (message.topic === 'CLUSTER_COMPLETE') {
|
|
15
|
-
let prSummary = null;
|
|
16
|
-
if (typeof data.pr_url === 'string' && data.pr_url) {
|
|
17
|
-
const number = Number.isSafeInteger(data.pr_number) ? ` #${data.pr_number}` : '';
|
|
18
|
-
prSummary = `Pull request${number} created: ${data.pr_url}`;
|
|
19
|
-
}
|
|
20
27
|
return {
|
|
21
28
|
type: 'complete',
|
|
22
|
-
summary:
|
|
23
|
-
...(
|
|
24
|
-
...(Object.prototype.hasOwnProperty.call(data, 'artifacts')
|
|
25
|
-
? { artifacts: data.artifacts }
|
|
26
|
-
: {}),
|
|
29
|
+
summary: data.reason || message.content?.text,
|
|
30
|
+
...completionPayload(data),
|
|
27
31
|
};
|
|
28
32
|
}
|
|
29
33
|
return {
|
|
@@ -133,7 +137,7 @@ class CurrentEngineAdapter {
|
|
|
133
137
|
try {
|
|
134
138
|
this.foldDurableMessages();
|
|
135
139
|
} catch {
|
|
136
|
-
this.resource.onEvent(
|
|
140
|
+
this.resource.onEvent(declaredFailureEvent());
|
|
137
141
|
}
|
|
138
142
|
});
|
|
139
143
|
}
|
|
@@ -198,12 +202,12 @@ class CurrentEngineAdapter {
|
|
|
198
202
|
foldClusterState(cluster) {
|
|
199
203
|
if (!cluster) {
|
|
200
204
|
if (!this.terminalObserved) {
|
|
201
|
-
this.resource.onEvent(
|
|
205
|
+
this.resource.onEvent(declaredFailureEvent());
|
|
202
206
|
}
|
|
203
207
|
return 'released';
|
|
204
208
|
}
|
|
205
209
|
if (!this.terminalObserved && ['failed', 'stopped', 'killed'].includes(cluster.state)) {
|
|
206
|
-
this.resource.onEvent(
|
|
210
|
+
this.resource.onEvent(declaredFailureEvent());
|
|
207
211
|
} else if (cluster.state === 'running') {
|
|
208
212
|
this.resource.onEvent({ type: 'running' });
|
|
209
213
|
}
|
|
@@ -215,13 +219,11 @@ class CurrentEngineAdapter {
|
|
|
215
219
|
this.foldDurableMessages();
|
|
216
220
|
const cluster = this.orchestrator.getCluster(this.resource.clusterId);
|
|
217
221
|
if (!cluster && !this.startSettled) {
|
|
218
|
-
return
|
|
222
|
+
return frozenResourceStatus(this.resource, 'starting');
|
|
219
223
|
}
|
|
220
224
|
const state = this.foldClusterState(cluster);
|
|
221
|
-
if (!cluster) return
|
|
222
|
-
return
|
|
223
|
-
clusterId: this.resource.clusterId,
|
|
224
|
-
state,
|
|
225
|
+
if (!cluster) return frozenResourceStatus(this.resource, state);
|
|
226
|
+
return frozenResourceStatus(this.resource, state, {
|
|
225
227
|
messageCount: cluster.ledger.count({ cluster_id: this.resource.clusterId }),
|
|
226
228
|
pidAliveDiagnostic: this.orchestrator.getStatus(this.resource.clusterId).isZombie !== true,
|
|
227
229
|
});
|
|
@@ -233,16 +235,16 @@ class CurrentEngineAdapter {
|
|
|
233
235
|
this.stopPromise ||= this.stopResource();
|
|
234
236
|
return this.stopPromise;
|
|
235
237
|
}
|
|
236
|
-
|
|
237
238
|
async waitForAllocatedCluster() {
|
|
238
239
|
let cluster = this.orchestrator.getCluster(this.resource.clusterId);
|
|
239
240
|
while (!cluster && !this.startSettled && !this.closed) {
|
|
240
|
-
await new Promise((resolve) =>
|
|
241
|
+
await new Promise((resolve) => {
|
|
242
|
+
setTimeout(resolve, 10);
|
|
243
|
+
});
|
|
241
244
|
cluster = this.orchestrator.getCluster(this.resource.clusterId);
|
|
242
245
|
}
|
|
243
246
|
return cluster;
|
|
244
247
|
}
|
|
245
|
-
|
|
246
248
|
stopAllocatedCluster(cluster = this.orchestrator.getCluster(this.resource.clusterId)) {
|
|
247
249
|
if (!cluster) return Promise.resolve(false);
|
|
248
250
|
if (cluster.state === 'stopped' || cluster.state === 'killed') return Promise.resolve(true);
|
|
@@ -251,7 +253,6 @@ class CurrentEngineAdapter {
|
|
|
251
253
|
.then(() => true);
|
|
252
254
|
return this.allocatedStopPromise;
|
|
253
255
|
}
|
|
254
|
-
|
|
255
256
|
async stopResource() {
|
|
256
257
|
this.cleanupPromise ||= this.waitForAllocatedCluster()
|
|
257
258
|
.then((cluster) => this.stopAllocatedCluster(cluster))
|
|
@@ -283,14 +284,7 @@ class CurrentEngineAdapter {
|
|
|
283
284
|
}
|
|
284
285
|
|
|
285
286
|
function createCurrentEngineAdapter(options = {}) {
|
|
286
|
-
|
|
287
|
-
return Object.freeze({
|
|
288
|
-
start: adapter.start.bind(adapter),
|
|
289
|
-
status: adapter.status.bind(adapter),
|
|
290
|
-
stop: adapter.stop.bind(adapter),
|
|
291
|
-
waitForCleanup: adapter.waitForCleanup.bind(adapter),
|
|
292
|
-
close: adapter.close.bind(adapter),
|
|
293
|
-
});
|
|
287
|
+
return createAdapterFacade(new CurrentEngineAdapter(options));
|
|
294
288
|
}
|
|
295
289
|
|
|
296
290
|
module.exports = { createCurrentEngineAdapter, inputFromRequest, terminalEventFromMessage };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { CANCELLED, createArtifactPreparation } = require('./runtime-support');
|
|
4
|
+
|
|
5
|
+
function createEngineStart(runtime, request, clusterId) {
|
|
6
|
+
const prepareArtifacts =
|
|
7
|
+
request.source === 'artifact'
|
|
8
|
+
? createArtifactPreparation({
|
|
9
|
+
resolver: runtime.artifactResolver,
|
|
10
|
+
artifacts: request.artifacts,
|
|
11
|
+
clusterId,
|
|
12
|
+
getProfile: () => runtime.profile,
|
|
13
|
+
signal: runtime.preparationController.signal,
|
|
14
|
+
reportFailure: runtime.cleanupFailureReporter,
|
|
15
|
+
})
|
|
16
|
+
: null;
|
|
17
|
+
return Promise.resolve(
|
|
18
|
+
runtime.engineAdapter.start({
|
|
19
|
+
request,
|
|
20
|
+
profile: runtime.profile,
|
|
21
|
+
...(prepareArtifacts ? { prepareArtifacts } : {}),
|
|
22
|
+
clusterId,
|
|
23
|
+
onEvent: runtime.onEngineEvent,
|
|
24
|
+
})
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function assertEngineResource(resource, request, clusterId) {
|
|
29
|
+
if (resource?.clusterId && resource.clusterId !== clusterId) {
|
|
30
|
+
throw new Error('Engine allocated a cluster with a different id');
|
|
31
|
+
}
|
|
32
|
+
if (request.source === 'artifact' && resource?.artifactsStaged !== true) {
|
|
33
|
+
throw new Error('Engine started without staging artifact input');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function acceptEngineStart(runtime, resource, request, clusterId) {
|
|
38
|
+
if (resource === CANCELLED) {
|
|
39
|
+
if (!runtime.machine.terminalReceipt) await runtime.machine.result();
|
|
40
|
+
return runtime.machine.status();
|
|
41
|
+
}
|
|
42
|
+
assertEngineResource(resource, request, clusterId);
|
|
43
|
+
if (runtime.machine.state === 'starting') runtime.machine.transition('running');
|
|
44
|
+
return runtime.machine.status();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function handleEngineStartFailure(runtime, error) {
|
|
48
|
+
if (runtime.claimTerminalAuthority('engine:start')) {
|
|
49
|
+
runtime.machine.terminal(runtime.failureReceipt('failed', 'crash', 'declared_failure'));
|
|
50
|
+
}
|
|
51
|
+
await runtime.stopEngine();
|
|
52
|
+
if (runtime.terminalAuthority !== 'engine:start' && !runtime.machine.terminalReceipt) {
|
|
53
|
+
await runtime.machine.result();
|
|
54
|
+
return runtime.machine.status();
|
|
55
|
+
}
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
module.exports = { acceptEngineStart, createEngineStart, handleEngineStartFailure };
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const { validateLegacyShipRequest } = require('./contracts');
|
|
4
|
-
const { createCurrentEngineAdapter } = require('./engine-adapter');
|
|
5
4
|
const { cloneJson, deepFreeze } = require('./object-utils');
|
|
6
5
|
const { createDeploymentProfileRegistry, DEFAULT_BOUNDS } = require('./profiles');
|
|
7
6
|
const {
|
|
8
7
|
CANCELLED,
|
|
9
8
|
assertIsolatedProfile,
|
|
10
|
-
createArtifactPreparation,
|
|
11
9
|
errorOutcome,
|
|
12
10
|
resolveRuntimeDependencies,
|
|
13
11
|
runCancellable,
|
|
14
12
|
} = require('./runtime-support');
|
|
13
|
+
const {
|
|
14
|
+
acceptEngineStart,
|
|
15
|
+
createEngineStart,
|
|
16
|
+
handleEngineStartFailure,
|
|
17
|
+
} = require('./engine-start');
|
|
15
18
|
const { releaseEngine, stopEngine } = require('./runtime-engine');
|
|
16
19
|
const { LegacyWorkerStateMachine } = require('./state-machine');
|
|
17
20
|
const { createTerminalNormalizer } = require('./terminal-normalizer');
|
|
@@ -131,49 +134,14 @@ class LegacyClusterWorkerRuntime {
|
|
|
131
134
|
async startEngine(request, clusterId) {
|
|
132
135
|
this.engineStartAttempted = true;
|
|
133
136
|
try {
|
|
134
|
-
const
|
|
135
|
-
request
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
getProfile: () => this.profile,
|
|
141
|
-
signal: this.preparationController.signal,
|
|
142
|
-
reportFailure: this.cleanupFailureReporter,
|
|
143
|
-
})
|
|
144
|
-
: null;
|
|
145
|
-
const engineStart = Promise.resolve(
|
|
146
|
-
this.engineAdapter.start({
|
|
147
|
-
request,
|
|
148
|
-
profile: this.profile,
|
|
149
|
-
...(prepareArtifacts ? { prepareArtifacts } : {}),
|
|
150
|
-
clusterId,
|
|
151
|
-
onEvent: this.onEngineEvent,
|
|
152
|
-
})
|
|
153
|
-
);
|
|
154
|
-
const resource = await Promise.race([engineStart, this.terminalClaimed]);
|
|
155
|
-
if (resource === CANCELLED) {
|
|
156
|
-
if (!this.machine.terminalReceipt) await this.machine.result();
|
|
157
|
-
return this.machine.status();
|
|
158
|
-
}
|
|
159
|
-
if (resource?.clusterId && resource.clusterId !== clusterId) {
|
|
160
|
-
throw new Error('Engine allocated a cluster with a different id');
|
|
161
|
-
}
|
|
162
|
-
if (request.source === 'artifact' && resource?.artifactsStaged !== true) {
|
|
163
|
-
throw new Error('Engine started without staging artifact input');
|
|
164
|
-
}
|
|
165
|
-
if (this.machine.state === 'starting') this.machine.transition('running');
|
|
166
|
-
return this.machine.status();
|
|
137
|
+
const resource = await Promise.race([
|
|
138
|
+
createEngineStart(this, request, clusterId),
|
|
139
|
+
this.terminalClaimed,
|
|
140
|
+
]);
|
|
141
|
+
const status = await acceptEngineStart(this, resource, request, clusterId);
|
|
142
|
+
return status;
|
|
167
143
|
} catch (error) {
|
|
168
|
-
|
|
169
|
-
this.machine.terminal(this.failureReceipt('failed', 'crash', 'declared_failure'));
|
|
170
|
-
}
|
|
171
|
-
await this.stopEngine();
|
|
172
|
-
if (this.terminalAuthority !== 'engine:start' && !this.machine.terminalReceipt) {
|
|
173
|
-
await this.machine.result();
|
|
174
|
-
return this.machine.status();
|
|
175
|
-
}
|
|
176
|
-
throw error;
|
|
144
|
+
return handleEngineStartFailure(this, error);
|
|
177
145
|
}
|
|
178
146
|
}
|
|
179
147
|
beginLifecycle() {
|
|
@@ -187,7 +155,7 @@ class LegacyClusterWorkerRuntime {
|
|
|
187
155
|
this.armExecutionTimeout(this.initialExecutionBound());
|
|
188
156
|
return clusterId;
|
|
189
157
|
}
|
|
190
|
-
|
|
158
|
+
claimStartRequest(request) {
|
|
191
159
|
if (this.startClaimed) throw new Error('Worker facade permits exactly one start');
|
|
192
160
|
const requestSnapshot = deepFreeze(cloneJson(request));
|
|
193
161
|
validateLegacyShipRequest(requestSnapshot);
|
|
@@ -196,33 +164,43 @@ class LegacyClusterWorkerRuntime {
|
|
|
196
164
|
}
|
|
197
165
|
// Claim synchronously so concurrent calls cannot allocate two resources.
|
|
198
166
|
this.startClaimed = true;
|
|
199
|
-
|
|
167
|
+
return requestSnapshot;
|
|
168
|
+
}
|
|
169
|
+
resolveStartProfile(request) {
|
|
170
|
+
const profileResolution = this.profileRegistry.resolve(
|
|
171
|
+
request.isolationProfile,
|
|
172
|
+
request.providerProfile,
|
|
173
|
+
Object.freeze({ signal: this.preparationController.signal })
|
|
174
|
+
);
|
|
175
|
+
if (!profileResolution || typeof profileResolution.then !== 'function') {
|
|
176
|
+
this.profile = assertIsolatedProfile(profileResolution, request);
|
|
177
|
+
}
|
|
178
|
+
return profileResolution;
|
|
179
|
+
}
|
|
180
|
+
async handleStartFailure(error) {
|
|
181
|
+
if (this.terminalAuthority !== null) {
|
|
182
|
+
if (!this.machine.terminalReceipt) await this.machine.result();
|
|
183
|
+
return this.machine.status();
|
|
184
|
+
}
|
|
185
|
+
if (!this.machine.clusterId) {
|
|
186
|
+
this.startClaimed = false;
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
189
|
+
if (this.claimTerminalAuthority('engine:start-setup')) {
|
|
190
|
+
this.machine.terminal(this.failureReceipt('failed', 'crash', 'declared_failure'));
|
|
191
|
+
}
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
async start(request) {
|
|
195
|
+
const requestSnapshot = this.claimStartRequest(request);
|
|
200
196
|
try {
|
|
201
|
-
const profileResolution = this.
|
|
202
|
-
|
|
203
|
-
requestSnapshot.providerProfile,
|
|
204
|
-
Object.freeze({ signal: this.preparationController.signal })
|
|
205
|
-
);
|
|
206
|
-
if (!profileResolution || typeof profileResolution.then !== 'function') {
|
|
207
|
-
this.profile = assertIsolatedProfile(profileResolution, requestSnapshot);
|
|
208
|
-
}
|
|
209
|
-
clusterId = this.beginLifecycle();
|
|
197
|
+
const profileResolution = this.resolveStartProfile(requestSnapshot);
|
|
198
|
+
const clusterId = this.beginLifecycle();
|
|
210
199
|
const prepared = await this.prepareStart(requestSnapshot, clusterId, profileResolution);
|
|
211
200
|
if (prepared === CANCELLED) return this.machine.status();
|
|
212
201
|
return this.startEngine(requestSnapshot, clusterId);
|
|
213
202
|
} catch (error) {
|
|
214
|
-
|
|
215
|
-
if (!this.machine.terminalReceipt) await this.machine.result();
|
|
216
|
-
return this.machine.status();
|
|
217
|
-
}
|
|
218
|
-
if (!this.machine.clusterId) {
|
|
219
|
-
this.startClaimed = false;
|
|
220
|
-
throw error;
|
|
221
|
-
}
|
|
222
|
-
if (this.machine.clusterId && this.claimTerminalAuthority('engine:start-setup')) {
|
|
223
|
-
this.machine.terminal(this.failureReceipt('failed', 'crash', 'declared_failure'));
|
|
224
|
-
}
|
|
225
|
-
throw error;
|
|
203
|
+
return this.handleStartFailure(error);
|
|
226
204
|
}
|
|
227
205
|
}
|
|
228
206
|
status() {
|
|
@@ -283,6 +261,10 @@ class LegacyClusterWorkerRuntime {
|
|
|
283
261
|
}
|
|
284
262
|
}
|
|
285
263
|
|
|
264
|
+
function createCurrentEngineAdapter(...args) {
|
|
265
|
+
return require('./engine-adapter').createCurrentEngineAdapter(...args);
|
|
266
|
+
}
|
|
267
|
+
|
|
286
268
|
function createLegacyClusterWorker(dependencies = {}) {
|
|
287
269
|
return createWorkerFacade(new LegacyClusterWorkerRuntime(dependencies));
|
|
288
270
|
}
|
|
@@ -24,44 +24,6 @@ const DEFAULT_PROVIDER_PROFILES = Object.freeze({
|
|
|
24
24
|
}),
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
-
const HOSTED_CODEX_OPENROUTER_PROFILE = 'provider.codex-openrouter@1';
|
|
28
|
-
const HOSTED_CODEX_OPENROUTER_PR_PROFILE = 'provider.codex-openrouter-pr@1';
|
|
29
|
-
const DEFAULT_HOSTED_MODEL = 'openai/gpt-5.4';
|
|
30
|
-
|
|
31
|
-
function providerProfilesFromEnvironment(environment = process.env) {
|
|
32
|
-
if (environment.ZEROSHOT_HOSTED_CODEX_OPENROUTER !== '1') {
|
|
33
|
-
return DEFAULT_PROVIDER_PROFILES;
|
|
34
|
-
}
|
|
35
|
-
const model = environment.ZEROSHOT_HOSTED_MODEL || DEFAULT_HOSTED_MODEL;
|
|
36
|
-
const levelOverrides = Object.freeze({
|
|
37
|
-
level1: Object.freeze({ model, reasoningEffort: 'medium' }),
|
|
38
|
-
level2: Object.freeze({ model, reasoningEffort: 'high' }),
|
|
39
|
-
level3: Object.freeze({ model, reasoningEffort: 'xhigh' }),
|
|
40
|
-
});
|
|
41
|
-
const hostedSettings = {
|
|
42
|
-
templateParams: { task_type: 'TASK' },
|
|
43
|
-
providerSettings: {
|
|
44
|
-
codex: {
|
|
45
|
-
defaultLevel: 'level2',
|
|
46
|
-
levelOverrides,
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
return deepFreeze({
|
|
51
|
-
...DEFAULT_PROVIDER_PROFILES,
|
|
52
|
-
[HOSTED_CODEX_OPENROUTER_PROFILE]: {
|
|
53
|
-
configName: 'base-templates/single-worker',
|
|
54
|
-
providerOverride: 'codex',
|
|
55
|
-
settings: hostedSettings,
|
|
56
|
-
},
|
|
57
|
-
[HOSTED_CODEX_OPENROUTER_PR_PROFILE]: {
|
|
58
|
-
configName: 'base-templates/worker-validator',
|
|
59
|
-
providerOverride: 'codex',
|
|
60
|
-
settings: hostedSettings,
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
|
|
65
27
|
function own(map, key) {
|
|
66
28
|
return Object.prototype.hasOwnProperty.call(map, key) ? map[key] : null;
|
|
67
29
|
}
|
|
@@ -76,7 +38,7 @@ function validateBounds(bounds) {
|
|
|
76
38
|
|
|
77
39
|
function createDeploymentProfileRegistry(options = {}) {
|
|
78
40
|
const isolationProfiles = options.isolationProfiles || DEFAULT_ISOLATION_PROFILES;
|
|
79
|
-
const providerProfiles = options.providerProfiles ||
|
|
41
|
+
const providerProfiles = options.providerProfiles || DEFAULT_PROVIDER_PROFILES;
|
|
80
42
|
const defaultBounds = { ...DEFAULT_BOUNDS, ...(options.bounds || {}) };
|
|
81
43
|
validateBounds(defaultBounds);
|
|
82
44
|
const bounds = deepFreeze(defaultBounds);
|
|
@@ -115,8 +77,5 @@ module.exports = {
|
|
|
115
77
|
DEFAULT_BOUNDS,
|
|
116
78
|
DEFAULT_ISOLATION_PROFILES,
|
|
117
79
|
DEFAULT_PROVIDER_PROFILES,
|
|
118
|
-
HOSTED_CODEX_OPENROUTER_PROFILE,
|
|
119
|
-
HOSTED_CODEX_OPENROUTER_PR_PROFILE,
|
|
120
80
|
createDeploymentProfileRegistry,
|
|
121
|
-
providerProfilesFromEnvironment,
|
|
122
81
|
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { randomUUID } = require('crypto');
|
|
4
|
+
const { createDeploymentProfileRegistry } = require('./profiles');
|
|
5
|
+
|
|
6
|
+
const DEPENDENCY_KEYS = new Set([
|
|
7
|
+
'profileRegistry',
|
|
8
|
+
'artifactResolver',
|
|
9
|
+
'artifactReceiptSink',
|
|
10
|
+
'engineAdapter',
|
|
11
|
+
'clock',
|
|
12
|
+
'timers',
|
|
13
|
+
'idFactory',
|
|
14
|
+
'cleanupFailureReporter',
|
|
15
|
+
]);
|
|
16
|
+
|
|
17
|
+
function assertRuntimeDependencies(dependencies) {
|
|
18
|
+
const unknownDependencies = Object.keys(dependencies).filter((key) => !DEPENDENCY_KEYS.has(key));
|
|
19
|
+
if (unknownDependencies.length > 0) {
|
|
20
|
+
throw new Error(`Unsupported worker dependencies: ${unknownDependencies.join(', ')}`);
|
|
21
|
+
}
|
|
22
|
+
if (
|
|
23
|
+
dependencies.cleanupFailureReporter !== undefined &&
|
|
24
|
+
typeof dependencies.cleanupFailureReporter !== 'function'
|
|
25
|
+
) {
|
|
26
|
+
throw new Error('cleanupFailureReporter must be a function');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function applyRuntimeDependencyDefaults(dependencies, defaultCleanupFailureReporter) {
|
|
31
|
+
return {
|
|
32
|
+
profileRegistry: dependencies.profileRegistry || createDeploymentProfileRegistry(),
|
|
33
|
+
artifactResolver: dependencies.artifactResolver || null,
|
|
34
|
+
artifactReceiptSink: dependencies.artifactReceiptSink || null,
|
|
35
|
+
engineAdapter:
|
|
36
|
+
dependencies.engineAdapter || require('./engine-adapter').createCurrentEngineAdapter(),
|
|
37
|
+
clock: dependencies.clock || (() => Date.now()),
|
|
38
|
+
timers: dependencies.timers || { setTimeout, clearTimeout },
|
|
39
|
+
idFactory: dependencies.idFactory || (() => `legacy-worker-${randomUUID()}`),
|
|
40
|
+
cleanupFailureReporter: dependencies.cleanupFailureReporter || defaultCleanupFailureReporter,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function resolveRuntimeDependencies(dependencies, defaultCleanupFailureReporter) {
|
|
45
|
+
assertRuntimeDependencies(dependencies);
|
|
46
|
+
return applyRuntimeDependencyDefaults(dependencies, defaultCleanupFailureReporter);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
module.exports = { resolveRuntimeDependencies };
|
|
@@ -1,25 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const { randomUUID } = require('crypto');
|
|
4
3
|
const { validateArtifactRef, validateWorkerOutcome } = require('./contracts');
|
|
5
|
-
const { createCurrentEngineAdapter } = require('./engine-adapter');
|
|
6
4
|
const { cloneJson, deepFreeze } = require('./object-utils');
|
|
7
|
-
const { createDeploymentProfileRegistry } = require('./profiles');
|
|
8
5
|
const { resolveRunPlan } = require('../run-plan');
|
|
6
|
+
const { resolveRuntimeDependencies: resolveDependencies } = require('./runtime-dependencies');
|
|
9
7
|
|
|
10
8
|
const CANCELLED = Symbol('cancelled');
|
|
11
9
|
|
|
12
|
-
const DEPENDENCY_KEYS = new Set([
|
|
13
|
-
'profileRegistry',
|
|
14
|
-
'artifactResolver',
|
|
15
|
-
'artifactReceiptSink',
|
|
16
|
-
'engineAdapter',
|
|
17
|
-
'clock',
|
|
18
|
-
'timers',
|
|
19
|
-
'idFactory',
|
|
20
|
-
'cleanupFailureReporter',
|
|
21
|
-
]);
|
|
22
|
-
|
|
23
10
|
async function stageArtifacts(resolver, artifacts, context) {
|
|
24
11
|
if (artifacts.length === 0) return deepFreeze({ artifacts: [] });
|
|
25
12
|
if (context.signal?.aborted) return CANCELLED;
|
|
@@ -200,26 +187,7 @@ async function stopEngineWithinBound({ engineAdapter, timers, shutdownMs }) {
|
|
|
200
187
|
}
|
|
201
188
|
|
|
202
189
|
function resolveRuntimeDependencies(dependencies) {
|
|
203
|
-
|
|
204
|
-
if (unknownDependencies.length > 0) {
|
|
205
|
-
throw new Error(`Unsupported worker dependencies: ${unknownDependencies.join(', ')}`);
|
|
206
|
-
}
|
|
207
|
-
if (
|
|
208
|
-
dependencies.cleanupFailureReporter !== undefined &&
|
|
209
|
-
typeof dependencies.cleanupFailureReporter !== 'function'
|
|
210
|
-
) {
|
|
211
|
-
throw new Error('cleanupFailureReporter must be a function');
|
|
212
|
-
}
|
|
213
|
-
return {
|
|
214
|
-
profileRegistry: dependencies.profileRegistry || createDeploymentProfileRegistry(),
|
|
215
|
-
artifactResolver: dependencies.artifactResolver || null,
|
|
216
|
-
artifactReceiptSink: dependencies.artifactReceiptSink || null,
|
|
217
|
-
engineAdapter: dependencies.engineAdapter || createCurrentEngineAdapter(),
|
|
218
|
-
clock: dependencies.clock || (() => Date.now()),
|
|
219
|
-
timers: dependencies.timers || { setTimeout, clearTimeout },
|
|
220
|
-
idFactory: dependencies.idFactory || (() => `legacy-worker-${randomUUID()}`),
|
|
221
|
-
cleanupFailureReporter: dependencies.cleanupFailureReporter || defaultCleanupFailureReporter,
|
|
222
|
-
};
|
|
190
|
+
return resolveDependencies(dependencies, defaultCleanupFailureReporter);
|
|
223
191
|
}
|
|
224
192
|
|
|
225
193
|
function assertProfilePlan(profile) {
|
|
@@ -5,17 +5,16 @@ const { cloneJson, deepFreeze } = require('./object-utils');
|
|
|
5
5
|
const { collectReceipts } = require('./runtime-support');
|
|
6
6
|
|
|
7
7
|
async function resultFromEvent(event, options) {
|
|
8
|
-
let
|
|
9
|
-
let
|
|
10
|
-
let declaredArtifacts = event.artifacts;
|
|
8
|
+
let result;
|
|
9
|
+
let declaredArtifacts;
|
|
11
10
|
if (Object.prototype.hasOwnProperty.call(event, 'result')) {
|
|
12
11
|
validateLegacyShipResult(event.result);
|
|
13
|
-
|
|
14
|
-
status = event.result.status;
|
|
12
|
+
result = event.result;
|
|
15
13
|
declaredArtifacts = event.result.artifacts;
|
|
16
14
|
} else {
|
|
17
|
-
|
|
18
|
-
validateLegacyShipResult(
|
|
15
|
+
result = { summary: event.summary, status: 'succeeded', artifacts: [] };
|
|
16
|
+
validateLegacyShipResult(result);
|
|
17
|
+
declaredArtifacts = [];
|
|
19
18
|
}
|
|
20
19
|
const artifacts = await collectReceipts(options.artifactReceiptSink, declaredArtifacts, {
|
|
21
20
|
clusterId: options.machine.clusterId,
|
|
@@ -24,9 +23,9 @@ async function resultFromEvent(event, options) {
|
|
|
24
23
|
reportCleanupFailure: options.cleanupFailureReporter,
|
|
25
24
|
});
|
|
26
25
|
if (artifacts === options.cancelled) return options.cancelled;
|
|
27
|
-
const
|
|
28
|
-
validateLegacyShipResult(
|
|
29
|
-
return
|
|
26
|
+
const normalized = { ...result, artifacts };
|
|
27
|
+
validateLegacyShipResult(normalized);
|
|
28
|
+
return normalized;
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
function createTerminalNormalizer(options) {
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizedAuthority = normalizedAuthority;
|
|
4
|
+
exports.validateHostedAccess = validateHostedAccess;
|
|
5
|
+
const index_js_1 = require("../cluster/index.cjs");
|
|
6
|
+
const LOOPBACK_HOSTS = Object.freeze({
|
|
7
|
+
'127.0.0.1': true,
|
|
8
|
+
'::1': true,
|
|
9
|
+
'[::1]': true,
|
|
10
|
+
});
|
|
11
|
+
function parseCanonicalUrl(value, message, code) {
|
|
12
|
+
try {
|
|
13
|
+
if (/[\u0000-\u0020\u007f]/.test(value))
|
|
14
|
+
throw new TypeError('unsafe URL code point');
|
|
15
|
+
const url = new URL(value);
|
|
16
|
+
if (url.href !== value && url.origin !== value)
|
|
17
|
+
throw new TypeError('non-canonical URL');
|
|
18
|
+
return url;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new index_js_1.ClusterConfigError(message, code);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function hasOriginSuffix(url) {
|
|
25
|
+
return Boolean(url.username ||
|
|
26
|
+
url.password ||
|
|
27
|
+
url.pathname !== '/' ||
|
|
28
|
+
url.search ||
|
|
29
|
+
url.hash);
|
|
30
|
+
}
|
|
31
|
+
function normalizedAuthority(value) {
|
|
32
|
+
const message = 'targetAuthority must be an HTTPS or literal-loopback HTTP origin';
|
|
33
|
+
const url = parseCanonicalUrl(value, message, 'INVALID_TARGET_AUTHORITY');
|
|
34
|
+
const loopbackHttp = url.protocol === 'http:' && LOOPBACK_HOSTS[url.hostname] === true;
|
|
35
|
+
if ((url.protocol !== 'https:' && !loopbackHttp) || hasOriginSuffix(url) ||
|
|
36
|
+
value !== url.origin) {
|
|
37
|
+
throw new index_js_1.ClusterConfigError(message, 'INVALID_TARGET_AUTHORITY');
|
|
38
|
+
}
|
|
39
|
+
return url.origin;
|
|
40
|
+
}
|
|
41
|
+
function accessAuthorityMatches(endpoint, target) {
|
|
42
|
+
const expectedProtocol = target.protocol === 'http:' ? 'ws:' : 'wss:';
|
|
43
|
+
return (endpoint.protocol === expectedProtocol &&
|
|
44
|
+
endpoint.host === target.host &&
|
|
45
|
+
!endpoint.username &&
|
|
46
|
+
!endpoint.password &&
|
|
47
|
+
!endpoint.search &&
|
|
48
|
+
!endpoint.hash);
|
|
49
|
+
}
|
|
50
|
+
function validateHostedAccess(access, targetAuthority) {
|
|
51
|
+
const endpoint = parseCanonicalUrl(access.websocketUrl, 'access endpoint must be an absolute target WebSocket URL', 'INVALID_ACCESS_ENDPOINT');
|
|
52
|
+
if (endpoint.href !== access.websocketUrl ||
|
|
53
|
+
!accessAuthorityMatches(endpoint, new URL(targetAuthority))) {
|
|
54
|
+
throw new index_js_1.ClusterConfigError('access endpoint must remain on the exact target authority', 'INVALID_ACCESS_ENDPOINT');
|
|
55
|
+
}
|
|
56
|
+
if (access.protocol !== 'openengine.cluster/v1' ||
|
|
57
|
+
access.tokenType !== 'Bearer' ||
|
|
58
|
+
access.accessToken.length === 0) {
|
|
59
|
+
throw new index_js_1.ClusterConfigError('access grant does not match the hosted session contract', 'INVALID_ACCESS_GRANT');
|
|
60
|
+
}
|
|
61
|
+
}
|