@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
|
@@ -1,253 +1,132 @@
|
|
|
1
|
-
import type { TargetCredentialStore } from './credential-store.
|
|
2
|
-
import type {
|
|
1
|
+
import type { TargetCredentialStore } from './credential-store.js';
|
|
2
|
+
import type { Clock } from './device-flow.js';
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
TargetSessionManager,
|
|
5
|
+
type TargetSessionDeps,
|
|
6
|
+
} from './target-session-manager.js';
|
|
7
|
+
import type { SettingsPort, TargetRecord } from './target-registry.js';
|
|
8
|
+
|
|
9
|
+
export {
|
|
10
|
+
LoginRequiredError,
|
|
11
|
+
TargetSessionManager,
|
|
12
|
+
type BrowserOpener,
|
|
13
|
+
type TargetSessionDeps,
|
|
14
|
+
type TargetSessionManagerInit,
|
|
15
|
+
} from './target-session-manager.js';
|
|
13
16
|
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
constructor(targetName: string) {
|
|
17
|
-
super(`Login required. Run: zeroshot target login ${targetName}`);
|
|
18
|
-
this.name = 'LoginRequiredError';
|
|
19
|
-
this.targetName = targetName;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface BrowserOpener {
|
|
24
|
-
open(url: string): Promise<void>;
|
|
17
|
+
export interface TargetAccessTokenProvider {
|
|
18
|
+
getAccessToken(signal?: AbortSignal): Promise<string>;
|
|
25
19
|
}
|
|
26
20
|
|
|
27
|
-
|
|
28
|
-
readonly
|
|
29
|
-
readonly
|
|
30
|
-
readonly
|
|
31
|
-
|
|
32
|
-
readonly discoveryEndpoints: {
|
|
33
|
-
readonly deviceAuthorizationEndpoint: string;
|
|
34
|
-
readonly tokenEndpoint: string;
|
|
35
|
-
readonly revocationEndpoint?: string;
|
|
36
|
-
readonly clientId: string;
|
|
37
|
-
readonly capsuleApiBaseUrl: string;
|
|
38
|
-
};
|
|
39
|
-
}
|
|
21
|
+
type LegacySessionDeps = Pick<TargetSessionDeps, 'http' | 'discoveryEndpoints'> & {
|
|
22
|
+
readonly settings?: SettingsPort;
|
|
23
|
+
readonly targetName?: string;
|
|
24
|
+
readonly clock?: Clock;
|
|
25
|
+
};
|
|
40
26
|
|
|
41
|
-
|
|
27
|
+
type TargetLoginArgs = readonly [
|
|
42
28
|
targetName: string,
|
|
43
29
|
target: TargetRecord,
|
|
44
30
|
credentialStore: TargetCredentialStore,
|
|
45
31
|
acquireLock: () => Promise<() => Promise<void>>,
|
|
46
32
|
settings: SettingsPort,
|
|
47
|
-
deps: TargetSessionDeps
|
|
48
|
-
|
|
49
|
-
const { http, clock, browserOpener, stderr, discoveryEndpoints } = deps;
|
|
50
|
-
const { deviceAuthorizationEndpoint, tokenEndpoint, clientId } = discoveryEndpoints;
|
|
51
|
-
|
|
52
|
-
const codeResponse = await requestDeviceCode(deviceAuthorizationEndpoint, clientId, http);
|
|
53
|
-
|
|
54
|
-
stderr.write(
|
|
55
|
-
`\nOpen this URL to authorize:\n ${codeResponse.verification_uri}\n\nEnter code: ${codeResponse.user_code}\n\n`
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
if (codeResponse.verification_uri_complete) {
|
|
59
|
-
try {
|
|
60
|
-
await browserOpener.open(codeResponse.verification_uri_complete);
|
|
61
|
-
} catch {
|
|
62
|
-
// Browser open is best-effort
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const tokenResponse = await pollForToken(
|
|
67
|
-
tokenEndpoint,
|
|
68
|
-
clientId,
|
|
69
|
-
codeResponse.device_code,
|
|
70
|
-
codeResponse.interval,
|
|
71
|
-
codeResponse.expires_in,
|
|
72
|
-
http,
|
|
73
|
-
clock,
|
|
74
|
-
undefined,
|
|
75
|
-
{ token: target.deviceToken, label: 'Zeroshot CLI' }
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
if (!tokenResponse.organization) {
|
|
79
|
-
throw new UnboundSessionError(codeResponse.verification_uri);
|
|
80
|
-
}
|
|
33
|
+
deps: TargetSessionDeps,
|
|
34
|
+
];
|
|
81
35
|
|
|
82
|
-
|
|
83
|
-
const release = await acquireLock();
|
|
84
|
-
try {
|
|
85
|
-
await credentialStore.set(serviceKey, TARGET_ACCOUNT, tokenResponse.refresh_token);
|
|
86
|
-
} finally {
|
|
87
|
-
await release();
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
updateTargetOrganization(targetName, tokenResponse.organization, settings);
|
|
91
|
-
|
|
92
|
-
return { organization: tokenResponse.organization };
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export async function refreshAccessToken(
|
|
36
|
+
type RefreshAccessArgs = readonly [
|
|
96
37
|
targetName: string,
|
|
97
38
|
target: TargetRecord,
|
|
98
39
|
credentialStore: TargetCredentialStore,
|
|
99
40
|
acquireLock: () => Promise<() => Promise<void>>,
|
|
100
|
-
deps:
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const { tokenEndpoint, revocationEndpoint, clientId } = discoveryEndpoints;
|
|
104
|
-
const serviceKey = targetServiceKey(target.id);
|
|
41
|
+
deps: LegacySessionDeps,
|
|
42
|
+
clock?: Clock,
|
|
43
|
+
];
|
|
105
44
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
const body = new URLSearchParams({
|
|
114
|
-
grant_type: 'refresh_token',
|
|
115
|
-
refresh_token: currentRefreshToken,
|
|
116
|
-
client_id: clientId,
|
|
117
|
-
audience: 'capsule',
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
let tokenResponse: TokenResponse;
|
|
121
|
-
const response = await http.fetch(tokenEndpoint, {
|
|
122
|
-
method: 'POST',
|
|
123
|
-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
124
|
-
body: body.toString(),
|
|
125
|
-
redirect: 'error',
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
if (!response.ok) {
|
|
129
|
-
const errorBody = (await response.json().catch(() => ({ error: 'unknown' }))) as {
|
|
130
|
-
error: string;
|
|
131
|
-
};
|
|
132
|
-
if (errorBody.error === 'invalid_grant') {
|
|
133
|
-
await credentialStore.delete(serviceKey, TARGET_ACCOUNT);
|
|
134
|
-
throw new LoginRequiredError(targetName);
|
|
135
|
-
}
|
|
136
|
-
throw new Error(`Token refresh failed (${response.status}): ${errorBody.error}`);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
tokenResponse = (await response.json()) as TokenResponse;
|
|
140
|
-
|
|
141
|
-
try {
|
|
142
|
-
await credentialStore.set(serviceKey, TARGET_ACCOUNT, tokenResponse.refresh_token);
|
|
143
|
-
} catch {
|
|
144
|
-
await bestEffortRevoke(tokenResponse.refresh_token, revocationEndpoint, clientId, http);
|
|
145
|
-
await credentialStore.delete(serviceKey, TARGET_ACCOUNT);
|
|
146
|
-
throw new LoginRequiredError(targetName);
|
|
147
|
-
}
|
|
45
|
+
type RevokeArgs = readonly [
|
|
46
|
+
target: TargetRecord,
|
|
47
|
+
credentialStore: TargetCredentialStore,
|
|
48
|
+
acquireLock: () => Promise<() => Promise<void>>,
|
|
49
|
+
deps: LegacySessionDeps,
|
|
50
|
+
force: boolean,
|
|
51
|
+
];
|
|
148
52
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
53
|
+
type LegacyManagerInit = {
|
|
54
|
+
readonly targetName: string;
|
|
55
|
+
readonly target: TargetRecord;
|
|
56
|
+
readonly credentialStore: TargetCredentialStore;
|
|
57
|
+
readonly acquireLock: () => Promise<() => Promise<void>>;
|
|
58
|
+
readonly deps: LegacySessionDeps;
|
|
59
|
+
readonly clock?: Clock;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
function transientSettings(targetName: string, target: TargetRecord): SettingsPort {
|
|
63
|
+
const state: { _targets: Record<string, TargetRecord> } = {
|
|
64
|
+
_targets: { [targetName]: target },
|
|
65
|
+
};
|
|
66
|
+
return {
|
|
67
|
+
load: () => state,
|
|
68
|
+
mutate: (mutator) => mutator(state),
|
|
69
|
+
};
|
|
153
70
|
}
|
|
154
71
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
body: body.toString(),
|
|
172
|
-
redirect: 'error',
|
|
173
|
-
});
|
|
174
|
-
} catch {
|
|
175
|
-
// Best-effort
|
|
176
|
-
}
|
|
72
|
+
function legacyManager(init: LegacyManagerInit): TargetSessionManager {
|
|
73
|
+
const clock = init.clock ?? init.deps.clock ?? { now: () => Date.now() };
|
|
74
|
+
return new TargetSessionManager({
|
|
75
|
+
targetName: init.targetName,
|
|
76
|
+
target: init.target,
|
|
77
|
+
credentialStore: init.credentialStore,
|
|
78
|
+
acquireLock: init.acquireLock,
|
|
79
|
+
settings: init.deps.settings ?? transientSettings(init.targetName, init.target),
|
|
80
|
+
deps: {
|
|
81
|
+
http: init.deps.http,
|
|
82
|
+
clock,
|
|
83
|
+
browserOpener: { open: () => Promise.resolve() },
|
|
84
|
+
stderr: { write: () => undefined },
|
|
85
|
+
discoveryEndpoints: init.deps.discoveryEndpoints,
|
|
86
|
+
},
|
|
87
|
+
});
|
|
177
88
|
}
|
|
178
89
|
|
|
179
|
-
export
|
|
180
|
-
|
|
90
|
+
export function targetLogin(...args: TargetLoginArgs): Promise<{ organization: { id: string } }> {
|
|
91
|
+
const [targetName, target, credentialStore, acquireLock, settings, deps] = args;
|
|
92
|
+
return new TargetSessionManager({
|
|
93
|
+
targetName,
|
|
94
|
+
target,
|
|
95
|
+
credentialStore,
|
|
96
|
+
acquireLock,
|
|
97
|
+
settings,
|
|
98
|
+
deps,
|
|
99
|
+
}).login();
|
|
181
100
|
}
|
|
182
101
|
|
|
183
|
-
export function
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
credentialStore
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
async getAccessToken(_signal?: AbortSignal): Promise<string> {
|
|
196
|
-
if (cachedToken && clock.now() < expiresAt - 30_000) {
|
|
197
|
-
return cachedToken;
|
|
198
|
-
}
|
|
199
|
-
const result = await refreshAccessToken(
|
|
200
|
-
targetName,
|
|
201
|
-
target,
|
|
202
|
-
credentialStore,
|
|
203
|
-
acquireLock,
|
|
204
|
-
deps
|
|
205
|
-
);
|
|
206
|
-
cachedToken = result.accessToken;
|
|
207
|
-
expiresAt = clock.now() + result.expiresIn * 1000;
|
|
208
|
-
return result.accessToken;
|
|
209
|
-
},
|
|
210
|
-
};
|
|
102
|
+
export async function refreshAccessToken(
|
|
103
|
+
...args: RefreshAccessArgs
|
|
104
|
+
): Promise<{ accessToken: string; expiresIn: number }> {
|
|
105
|
+
const [targetName, target, credentialStore, acquireLock, deps, clock] = args;
|
|
106
|
+
return legacyManager({
|
|
107
|
+
targetName,
|
|
108
|
+
target,
|
|
109
|
+
credentialStore,
|
|
110
|
+
acquireLock,
|
|
111
|
+
deps,
|
|
112
|
+
...(clock === undefined ? {} : { clock }),
|
|
113
|
+
}).getAccessTokenWithLifetime('capsule');
|
|
211
114
|
}
|
|
212
115
|
|
|
213
|
-
export
|
|
214
|
-
target
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
116
|
+
export function getAccessTokenProvider(...args: RefreshAccessArgs): TargetAccessTokenProvider {
|
|
117
|
+
const [targetName, target, credentialStore, acquireLock, deps, clock] = args;
|
|
118
|
+
return legacyManager({
|
|
119
|
+
targetName,
|
|
120
|
+
target,
|
|
121
|
+
credentialStore,
|
|
122
|
+
acquireLock,
|
|
123
|
+
deps,
|
|
124
|
+
...(clock === undefined ? {} : { clock }),
|
|
125
|
+
}).tokenProvider('capsule');
|
|
126
|
+
}
|
|
223
127
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
const body = new URLSearchParams({
|
|
229
|
-
token: refreshToken,
|
|
230
|
-
client_id: clientId,
|
|
231
|
-
token_type_hint: 'refresh_token',
|
|
232
|
-
});
|
|
233
|
-
try {
|
|
234
|
-
const response = await http.fetch(revocationEndpoint, {
|
|
235
|
-
method: 'POST',
|
|
236
|
-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
237
|
-
body: body.toString(),
|
|
238
|
-
redirect: 'error',
|
|
239
|
-
});
|
|
240
|
-
if (!response.ok && !force) {
|
|
241
|
-
throw new Error(
|
|
242
|
-
`Remote revocation failed (${response.status}). Use --force to remove anyway.`
|
|
243
|
-
);
|
|
244
|
-
}
|
|
245
|
-
} catch (err) {
|
|
246
|
-
if (!force) throw err;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
await credentialStore.delete(serviceKey, TARGET_ACCOUNT);
|
|
250
|
-
} finally {
|
|
251
|
-
await release();
|
|
252
|
-
}
|
|
128
|
+
export function revokeAndCleanup(...args: RevokeArgs): Promise<void> {
|
|
129
|
+
const [target, credentialStore, acquireLock, deps, force] = args;
|
|
130
|
+
const targetName = deps.targetName ?? target.id;
|
|
131
|
+
return legacyManager({ targetName, target, credentialStore, acquireLock, deps }).revoke(force);
|
|
253
132
|
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const MAX_TOKEN_BYTES = 16 * 1024;
|
|
2
|
+
const TOKEN_RESPONSE_FIELDS = [
|
|
3
|
+
'access_token',
|
|
4
|
+
'refresh_token',
|
|
5
|
+
'token_type',
|
|
6
|
+
'expires_in',
|
|
7
|
+
'refresh_expires_in',
|
|
8
|
+
'scope',
|
|
9
|
+
] as const;
|
|
10
|
+
|
|
11
|
+
export interface TokenResponse {
|
|
12
|
+
readonly access_token: string;
|
|
13
|
+
readonly refresh_token: string;
|
|
14
|
+
readonly token_type: 'Bearer';
|
|
15
|
+
readonly expires_in: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function boundedString(value: unknown, maxBytes: number): value is string {
|
|
19
|
+
return typeof value === 'string' && value.length > 0 &&
|
|
20
|
+
new TextEncoder().encode(value).byteLength <= maxBytes;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function tokenFieldsValid(token: Record<string, unknown>): boolean {
|
|
24
|
+
const fields = Object.keys(token);
|
|
25
|
+
return fields.length === TOKEN_RESPONSE_FIELDS.length &&
|
|
26
|
+
fields.every((key) => TOKEN_RESPONSE_FIELDS.includes(
|
|
27
|
+
key as (typeof TOKEN_RESPONSE_FIELDS)[number],
|
|
28
|
+
));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function tokenLifetimesValid(token: Record<string, unknown>): boolean {
|
|
32
|
+
return Number.isSafeInteger(token.expires_in) &&
|
|
33
|
+
(token.expires_in as number) > 0 &&
|
|
34
|
+
(token.expires_in as number) <= 86_400 &&
|
|
35
|
+
Number.isSafeInteger(token.refresh_expires_in) &&
|
|
36
|
+
(token.refresh_expires_in as number) > 0 &&
|
|
37
|
+
(token.refresh_expires_in as number) <= 31_536_000;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function tokenStringsValid(token: Record<string, unknown>): boolean {
|
|
41
|
+
return boundedString(token.access_token, MAX_TOKEN_BYTES) &&
|
|
42
|
+
boundedString(token.refresh_token, MAX_TOKEN_BYTES) &&
|
|
43
|
+
token.token_type === 'Bearer' &&
|
|
44
|
+
boundedString(token.scope, 512) &&
|
|
45
|
+
!/[\u0000-\u001f\u007f]/.test(token.scope);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function parseTokenResponse(value: unknown): TokenResponse {
|
|
49
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
50
|
+
throw new Error('Token response is malformed');
|
|
51
|
+
}
|
|
52
|
+
const token = value as Record<string, unknown>;
|
|
53
|
+
if (!tokenFieldsValid(token) || !tokenLifetimesValid(token) || !tokenStringsValid(token)) {
|
|
54
|
+
throw new Error('Token response is malformed');
|
|
55
|
+
}
|
|
56
|
+
return Object.freeze({
|
|
57
|
+
access_token: token.access_token,
|
|
58
|
+
refresh_token: token.refresh_token,
|
|
59
|
+
token_type: 'Bearer',
|
|
60
|
+
expires_in: token.expires_in,
|
|
61
|
+
}) as TokenResponse;
|
|
62
|
+
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
[package]
|
|
2
|
-
name = "zeroshot-oecp-server"
|
|
3
|
-
version = "0.1.0"
|
|
4
|
-
edition.workspace = true
|
|
5
|
-
rust-version.workspace = true
|
|
6
|
-
license.workspace = true
|
|
7
|
-
repository.workspace = true
|
|
8
|
-
publish = false
|
|
9
|
-
|
|
10
|
-
[dependencies]
|
|
11
|
-
tokio.workspace = true
|
|
12
|
-
zeroshot-engine = { package = "zeroshot-rust", path = "../../zeroshot-rust" }
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# syntax=docker/dockerfile:1
|
|
2
|
-
|
|
3
|
-
# The server and the existing Node worker ship together because OECP is the
|
|
4
|
-
# in-capsule process boundary. Capsule allocation and termination remain owned
|
|
5
|
-
# by Zero Cloud's control plane and capsule agent.
|
|
6
|
-
FROM rust@sha256:14b9b5f47dcc6644d0f0c1b35a2c2c5d0124f67159aaee28a348627523459b55 AS rust-builder
|
|
7
|
-
# Security package revisions intentionally follow the pinned Alpine release repositories.
|
|
8
|
-
# hadolint ignore=DL3018
|
|
9
|
-
RUN apk add --no-cache musl-dev
|
|
10
|
-
WORKDIR /build
|
|
11
|
-
COPY Cargo.toml Cargo.lock rust-toolchain.toml ./
|
|
12
|
-
COPY crates ./crates
|
|
13
|
-
COPY zeroshot-rust ./zeroshot-rust
|
|
14
|
-
COPY docker/zeroshot-oecp ./docker/zeroshot-oecp
|
|
15
|
-
# musl does not expose renameat2 through libc, although the Linux syscall is
|
|
16
|
-
# available. Keep the portable source API on glibc and use the syscall binding
|
|
17
|
-
# only for this musl image build.
|
|
18
|
-
RUN sed -i 's/libc::renameat2(/libc::syscall(libc::SYS_renameat2,/' \
|
|
19
|
-
zeroshot-rust/src/workspace_lease/types.rs \
|
|
20
|
-
&& grep -Fq 'libc::syscall(libc::SYS_renameat2,' \
|
|
21
|
-
zeroshot-rust/src/workspace_lease/types.rs
|
|
22
|
-
RUN rustup component add --toolchain 1.97.0 rustfmt clippy \
|
|
23
|
-
&& cargo +1.97.0 build --locked --release -p zeroshot-oecp-server \
|
|
24
|
-
&& rustup default 1.97.0 \
|
|
25
|
-
&& rustup toolchain uninstall 1.96.0 1.96.1
|
|
26
|
-
|
|
27
|
-
FROM node@sha256:c2cc26d8f991c2db236ad51a61efee843c482372d6d22570787309d511694110 AS node-builder
|
|
28
|
-
ARG CODEX_VERSION=0.146.0
|
|
29
|
-
# Security package revisions intentionally follow the pinned Alpine release repositories.
|
|
30
|
-
# hadolint ignore=DL3018
|
|
31
|
-
RUN apk add --no-cache build-base python3
|
|
32
|
-
WORKDIR /opt/zeroshot
|
|
33
|
-
COPY package.json package-lock.json ./
|
|
34
|
-
RUN npm ci --omit=dev --ignore-scripts --no-audit --no-fund \
|
|
35
|
-
&& npm rebuild better-sqlite3 node-pty \
|
|
36
|
-
&& npm install --global --no-audit --no-fund "@openai/codex@${CODEX_VERSION}"
|
|
37
|
-
COPY . .
|
|
38
|
-
|
|
39
|
-
FROM node@sha256:c2cc26d8f991c2db236ad51a61efee843c482372d6d22570787309d511694110 AS runtime
|
|
40
|
-
ARG ZEROSHOT_MIN_DISK_GB=10
|
|
41
|
-
ENV ZEROSHOT_MIN_DISK_GB=${ZEROSHOT_MIN_DISK_GB}
|
|
42
|
-
# Security package revisions intentionally follow the pinned Alpine release repositories.
|
|
43
|
-
# hadolint ignore=DL3018
|
|
44
|
-
RUN apk add --no-cache bash build-base ca-certificates git github-cli openssl python3 tini \
|
|
45
|
-
&& install -d -m 1777 /tmp \
|
|
46
|
-
&& install -d -m 0750 -o node -g node /workspace
|
|
47
|
-
COPY --from=node-builder --chown=node:node /opt/zeroshot /opt/zeroshot
|
|
48
|
-
COPY --from=node-builder /usr/local/lib/node_modules/@openai /usr/local/lib/node_modules/@openai
|
|
49
|
-
COPY --from=rust-builder --chown=node:node /usr/local/cargo/bin /usr/local/cargo/bin
|
|
50
|
-
COPY --from=rust-builder --chown=node:node /usr/local/rustup /usr/local/rustup
|
|
51
|
-
COPY --from=rust-builder /build/target/release/zeroshot-oecp-server /usr/local/bin/zeroshot-oecp-server
|
|
52
|
-
RUN ln -s /opt/zeroshot/bin/zeroshot-cluster-worker.js /usr/local/bin/zeroshot-cluster-worker \
|
|
53
|
-
&& ln -s /opt/zeroshot/cli/index.js /usr/local/bin/zeroshot \
|
|
54
|
-
&& ln -s /usr/local/lib/node_modules/@openai/codex/bin/codex.js /usr/local/bin/codex \
|
|
55
|
-
&& for command in cargo cargo-clippy cargo-fmt clippy-driver rustc rustdoc rustfmt rustup; do \
|
|
56
|
-
ln -s "/usr/local/cargo/bin/${command}" "/usr/local/bin/${command}"; \
|
|
57
|
-
done
|
|
58
|
-
ENV RUSTUP_HOME=/usr/local/rustup
|
|
59
|
-
ENV PATH=/usr/local/cargo/bin:${PATH}
|
|
60
|
-
# The official Node image defines this stable application user.
|
|
61
|
-
# hadolint ignore=DL3066
|
|
62
|
-
USER node
|
|
63
|
-
WORKDIR /workspace
|
|
64
|
-
EXPOSE 8083 8084
|
|
65
|
-
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/zeroshot-oecp-server"]
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
use std::{error::Error, net::SocketAddr, sync::Arc};
|
|
2
|
-
|
|
3
|
-
use tokio::net::TcpListener;
|
|
4
|
-
use zeroshot_engine::hosted_oecp::{serve, HostedBackend, OECP_PORT};
|
|
5
|
-
|
|
6
|
-
#[tokio::main]
|
|
7
|
-
async fn main() -> Result<(), Box<dyn Error>> {
|
|
8
|
-
if std::env::args().nth(1).as_deref() == Some("--healthcheck") {
|
|
9
|
-
println!("zeroshot OECP server ready");
|
|
10
|
-
return Ok(());
|
|
11
|
-
}
|
|
12
|
-
let backend = Arc::new(HostedBackend::new());
|
|
13
|
-
let listener = TcpListener::bind(SocketAddr::from(([127, 0, 0, 1], OECP_PORT))).await?;
|
|
14
|
-
serve(listener, backend, shutdown_signal()).await?;
|
|
15
|
-
Ok(())
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
#[cfg(unix)]
|
|
19
|
-
async fn shutdown_signal() {
|
|
20
|
-
use tokio::signal::unix::{signal, SignalKind};
|
|
21
|
-
|
|
22
|
-
let mut terminate = signal(SignalKind::terminate()).expect("SIGTERM handler must install");
|
|
23
|
-
tokio::select! {
|
|
24
|
-
_ = tokio::signal::ctrl_c() => {}
|
|
25
|
-
_ = terminate.recv() => {}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
#[cfg(not(unix))]
|
|
30
|
-
async fn shutdown_signal() {
|
|
31
|
-
let _result = tokio::signal::ctrl_c().await;
|
|
32
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.readBoundedJson = readBoundedJson;
|
|
4
|
-
async function readBoundedJson(response, maxBytes, errors) {
|
|
5
|
-
const declared = response.headers.get('content-length');
|
|
6
|
-
if (declared !== null && Number(declared) > maxBytes)
|
|
7
|
-
throw errors.tooLarge();
|
|
8
|
-
const reader = response.body?.getReader();
|
|
9
|
-
if (!reader) {
|
|
10
|
-
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
11
|
-
if (bytes.byteLength > maxBytes)
|
|
12
|
-
throw errors.tooLarge();
|
|
13
|
-
return parseJson(bytes, errors);
|
|
14
|
-
}
|
|
15
|
-
const chunks = [];
|
|
16
|
-
let total = 0;
|
|
17
|
-
for (;;) {
|
|
18
|
-
const { done, value } = await reader.read();
|
|
19
|
-
if (done)
|
|
20
|
-
break;
|
|
21
|
-
total += value.byteLength;
|
|
22
|
-
if (total > maxBytes) {
|
|
23
|
-
await reader.cancel();
|
|
24
|
-
throw errors.tooLarge();
|
|
25
|
-
}
|
|
26
|
-
chunks.push(value);
|
|
27
|
-
}
|
|
28
|
-
const bytes = new Uint8Array(total);
|
|
29
|
-
let offset = 0;
|
|
30
|
-
for (const chunk of chunks) {
|
|
31
|
-
bytes.set(chunk, offset);
|
|
32
|
-
offset += chunk.byteLength;
|
|
33
|
-
}
|
|
34
|
-
return parseJson(bytes, errors);
|
|
35
|
-
}
|
|
36
|
-
function parseJson(bytes, errors) {
|
|
37
|
-
try {
|
|
38
|
-
return JSON.parse(new TextDecoder().decode(bytes));
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
throw errors.invalid();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { type TargetAccessTokenProvider } from '../target-session.ts';
|
|
2
|
-
import type { HostedRunDependencies, HostedRunIntent } from './contracts.ts';
|
|
3
|
-
export declare const UUID: RegExp;
|
|
4
|
-
export declare const TERMINAL_STATES: Set<string>;
|
|
5
|
-
export interface HostedContext {
|
|
6
|
-
readonly targetName: string;
|
|
7
|
-
readonly organization: string;
|
|
8
|
-
readonly client: RunIntentClient;
|
|
9
|
-
}
|
|
10
|
-
export declare class HostedRunHttpError extends Error {
|
|
11
|
-
readonly status: number;
|
|
12
|
-
readonly code: string | null;
|
|
13
|
-
constructor(status: number, message: string, code?: string | null);
|
|
14
|
-
}
|
|
15
|
-
export declare class RunIntentClient {
|
|
16
|
-
private readonly baseUrl;
|
|
17
|
-
private readonly organization;
|
|
18
|
-
private readonly tokenProvider;
|
|
19
|
-
private readonly fetch;
|
|
20
|
-
constructor(baseUrl: string, organization: string, tokenProvider: TargetAccessTokenProvider, fetchImplementation: typeof globalThis.fetch);
|
|
21
|
-
submit(body: Record<string, unknown>, submissionKey: string): Promise<HostedRunIntent>;
|
|
22
|
-
get(intentId: string): Promise<HostedRunIntent>;
|
|
23
|
-
cancel(intentId: string): Promise<HostedRunIntent>;
|
|
24
|
-
private request;
|
|
25
|
-
}
|
|
26
|
-
export declare function context(targetName: string, deps: HostedRunDependencies): Promise<HostedContext>;
|