@alpacakit/agents 0.1.0-beta.20 → 0.1.0-beta.21
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/README.md +60 -0
- package/dist/agents/claude.d.ts.map +1 -1
- package/dist/agents/claude.js +3 -0
- package/dist/agents/codex.d.ts.map +1 -1
- package/dist/agents/codex.js +4 -0
- package/dist/agents/openai-compatible/config.d.ts.map +1 -1
- package/dist/agents/openai-compatible/config.js +5 -0
- package/dist/agents/openai-compatible/fetch-engine.d.ts.map +1 -1
- package/dist/agents/openai-compatible/fetch-engine.js +6 -0
- package/dist/agents/openai-compatible/pi/module.d.ts.map +1 -1
- package/dist/agents/openai-compatible/pi/module.js +1 -0
- package/dist/agents/openai-compatible/pi/sandbox.js +2 -0
- package/dist/agents/openai-compatible/response.js +1 -0
- package/dist/auth/profile-store.d.ts.map +1 -1
- package/dist/auth/profile-store.js +1 -0
- package/dist/auth/secrets.d.ts.map +1 -1
- package/dist/auth/secrets.js +2 -0
- package/dist/codex/app-server.js +6 -0
- package/dist/core/controlled-process.d.ts +98 -0
- package/dist/core/controlled-process.d.ts.map +1 -0
- package/dist/core/controlled-process.js +29 -0
- package/dist/core/error.d.ts +25 -0
- package/dist/core/error.d.ts.map +1 -1
- package/dist/core/error.js +32 -0
- package/dist/core/node-controlled-exec.d.ts +3 -0
- package/dist/core/node-controlled-exec.d.ts.map +1 -0
- package/dist/core/node-controlled-exec.js +32 -0
- package/dist/core/node-ports.d.ts +1 -0
- package/dist/core/node-ports.d.ts.map +1 -1
- package/dist/core/node-ports.js +9 -1
- package/dist/core/ports.d.ts +5 -0
- package/dist/core/ports.d.ts.map +1 -1
- package/dist/fleet/fleet.d.ts.map +1 -1
- package/dist/fleet/fleet.js +5 -2
- package/dist/fleet/store.d.ts.map +1 -1
- package/dist/fleet/store.js +3 -0
- package/dist/host/github-dir.d.ts.map +1 -1
- package/dist/host/github-dir.js +5 -0
- package/dist/host/mcp-list.d.ts.map +1 -1
- package/dist/host/mcp-list.js +1 -0
- package/dist/host/run-command.d.ts.map +1 -1
- package/dist/host/run-command.js +2 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/internal/controlled-process/authentication.d.ts +13 -0
- package/dist/internal/controlled-process/authentication.d.ts.map +1 -0
- package/dist/internal/controlled-process/authentication.js +112 -0
- package/dist/internal/controlled-process/child-fd.d.ts +5 -0
- package/dist/internal/controlled-process/child-fd.d.ts.map +1 -0
- package/dist/internal/controlled-process/child-fd.js +47 -0
- package/dist/internal/controlled-process/framed-transport.d.ts +6 -0
- package/dist/internal/controlled-process/framed-transport.d.ts.map +1 -0
- package/dist/internal/controlled-process/framed-transport.js +117 -0
- package/dist/internal/controlled-process/host-controller.d.ts +23 -0
- package/dist/internal/controlled-process/host-controller.d.ts.map +1 -0
- package/dist/internal/controlled-process/host-controller.js +908 -0
- package/dist/internal/controlled-process/lifecycle.d.ts +5 -0
- package/dist/internal/controlled-process/lifecycle.d.ts.map +1 -0
- package/dist/internal/controlled-process/lifecycle.js +22 -0
- package/dist/internal/controlled-process/model.d.ts +99 -0
- package/dist/internal/controlled-process/model.d.ts.map +1 -0
- package/dist/internal/controlled-process/model.js +1 -0
- package/dist/internal/controlled-process/record-store.d.ts +17 -0
- package/dist/internal/controlled-process/record-store.d.ts.map +1 -0
- package/dist/internal/controlled-process/record-store.js +170 -0
- package/dist/internal/controlled-process/record.d.ts +12 -0
- package/dist/internal/controlled-process/record.d.ts.map +1 -0
- package/dist/internal/controlled-process/record.js +87 -0
- package/dist/internal/controlled-process/schema.d.ts +133 -0
- package/dist/internal/controlled-process/schema.d.ts.map +1 -0
- package/dist/internal/controlled-process/schema.js +99 -0
- package/dist/internal/controlled-process/shim-entry.d.ts +2 -0
- package/dist/internal/controlled-process/shim-entry.d.ts.map +1 -0
- package/dist/internal/controlled-process/shim-entry.js +2 -0
- package/dist/internal/controlled-process/shim-runtime.d.ts +2 -0
- package/dist/internal/controlled-process/shim-runtime.d.ts.map +1 -0
- package/dist/internal/controlled-process/shim-runtime.js +57 -0
- package/dist/internal/controlled-process/supervisor-coordinator.d.ts +67 -0
- package/dist/internal/controlled-process/supervisor-coordinator.d.ts.map +1 -0
- package/dist/internal/controlled-process/supervisor-coordinator.js +325 -0
- package/dist/internal/controlled-process/supervisor-entry.d.ts +2 -0
- package/dist/internal/controlled-process/supervisor-entry.d.ts.map +1 -0
- package/dist/internal/controlled-process/supervisor-entry.js +2 -0
- package/dist/internal/controlled-process/supervisor-model.d.ts +92 -0
- package/dist/internal/controlled-process/supervisor-model.d.ts.map +1 -0
- package/dist/internal/controlled-process/supervisor-model.js +1 -0
- package/dist/internal/controlled-process/supervisor-platform.d.ts +16 -0
- package/dist/internal/controlled-process/supervisor-platform.d.ts.map +1 -0
- package/dist/internal/controlled-process/supervisor-platform.js +104 -0
- package/dist/internal/controlled-process/supervisor-runtime.d.ts +11 -0
- package/dist/internal/controlled-process/supervisor-runtime.d.ts.map +1 -0
- package/dist/internal/controlled-process/supervisor-runtime.js +773 -0
- package/dist/internal/controlled-process/supervisor-schema.d.ts +100 -0
- package/dist/internal/controlled-process/supervisor-schema.d.ts.map +1 -0
- package/dist/internal/controlled-process/supervisor-schema.js +73 -0
- package/dist/internal/controlled-process/supervisor-transport.d.ts +46 -0
- package/dist/internal/controlled-process/supervisor-transport.d.ts.map +1 -0
- package/dist/internal/controlled-process/supervisor-transport.js +368 -0
- package/dist/internal/controlled-process/supervisor-values.d.ts +39 -0
- package/dist/internal/controlled-process/supervisor-values.d.ts.map +1 -0
- package/dist/internal/controlled-process/supervisor-values.js +38 -0
- package/dist/internal/controlled-process/token.d.ts +4 -0
- package/dist/internal/controlled-process/token.d.ts.map +1 -0
- package/dist/internal/controlled-process/token.js +38 -0
- package/dist/internal/controlled-process/values.d.ts +39 -0
- package/dist/internal/controlled-process/values.d.ts.map +1 -0
- package/dist/internal/controlled-process/values.js +38 -0
- package/dist/kernel/cli-agent.d.ts.map +1 -1
- package/dist/kernel/cli-agent.js +330 -34
- package/dist/kernel/cli-login.d.ts.map +1 -1
- package/dist/kernel/cli-login.js +5 -0
- package/dist/kernel/env-template.js +1 -0
- package/dist/kernel/facets.d.ts.map +1 -1
- package/dist/kernel/facets.js +1 -0
- package/dist/kernel/keyed.d.ts.map +1 -1
- package/dist/kernel/keyed.js +1 -0
- package/dist/kernel/login.js +2 -0
- package/dist/kernel/options.d.ts +14 -0
- package/dist/kernel/options.d.ts.map +1 -1
- package/dist/kernel/options.js +3 -0
- package/dist/kernel/process-lifecycle-failure.d.ts +5 -0
- package/dist/kernel/process-lifecycle-failure.d.ts.map +1 -0
- package/dist/kernel/process-lifecycle-failure.js +5 -0
- package/dist/kernel/run.d.ts.map +1 -1
- package/dist/kernel/run.js +11 -0
- package/dist/kernel/runtime.d.ts.map +1 -1
- package/dist/kernel/runtime.js +2 -0
- package/dist/keyring/resolver.d.ts.map +1 -1
- package/dist/keyring/resolver.js +2 -0
- package/dist/structured/run-structured.js +1 -0
- package/dist/testing/fake-controlled-exec.d.ts +21 -0
- package/dist/testing/fake-controlled-exec.d.ts.map +1 -0
- package/dist/testing/fake-controlled-exec.js +172 -0
- package/dist/testing/fake-exec.d.ts.map +1 -1
- package/dist/testing/fake-exec.js +64 -54
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const supervisorBootstrapSchema: z.ZodReadonly<z.ZodObject<{
|
|
3
|
+
kind: z.ZodLiteral<"bootstrap">;
|
|
4
|
+
runtimeDirectory: z.ZodString;
|
|
5
|
+
shimEntryPath: z.ZodString;
|
|
6
|
+
worker: z.ZodReadonly<z.ZodObject<{
|
|
7
|
+
command: z.ZodString;
|
|
8
|
+
args: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
9
|
+
cwd: z.ZodString;
|
|
10
|
+
env: z.ZodReadonly<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
11
|
+
stdin: z.ZodNullable<z.ZodString>;
|
|
12
|
+
}, z.core.$strip>>;
|
|
13
|
+
timing: z.ZodReadonly<z.ZodObject<{
|
|
14
|
+
termGraceMs: z.ZodNumber;
|
|
15
|
+
killProbeTimeoutMs: z.ZodNumber;
|
|
16
|
+
probeIntervalMs: z.ZodNumber;
|
|
17
|
+
}, z.core.$strip>>;
|
|
18
|
+
}, z.core.$strip>>;
|
|
19
|
+
export declare const supervisorHostAckSchema: z.ZodReadonly<z.ZodObject<{
|
|
20
|
+
kind: z.ZodLiteral<"host_ack">;
|
|
21
|
+
}, z.core.$strip>>;
|
|
22
|
+
export declare const supervisorIdentityFrameSchema: z.ZodReadonly<z.ZodObject<{
|
|
23
|
+
kind: z.ZodLiteral<"identity">;
|
|
24
|
+
identity: z.ZodReadonly<z.ZodObject<{
|
|
25
|
+
pid: z.ZodPipe<z.ZodNumber, z.ZodTransform<import("./model.js").ShimProcessId, number>>;
|
|
26
|
+
processStartToken: z.ZodPipe<z.ZodString, z.ZodTransform<import("./model.js").ProcessStartToken, string>>;
|
|
27
|
+
}, z.core.$strip>>;
|
|
28
|
+
}, z.core.$strip>>;
|
|
29
|
+
export declare const supervisorLaunchFailedFrameSchema: z.ZodReadonly<z.ZodObject<{
|
|
30
|
+
kind: z.ZodLiteral<"launch_failed">;
|
|
31
|
+
reason: z.ZodString;
|
|
32
|
+
}, z.core.$strip>>;
|
|
33
|
+
export declare const shimBootstrapSchema: z.ZodReadonly<z.ZodObject<{
|
|
34
|
+
kind: z.ZodLiteral<"shim_bootstrap">;
|
|
35
|
+
worker: z.ZodReadonly<z.ZodObject<{
|
|
36
|
+
command: z.ZodString;
|
|
37
|
+
args: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
38
|
+
cwd: z.ZodString;
|
|
39
|
+
env: z.ZodReadonly<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
40
|
+
stdin: z.ZodNullable<z.ZodString>;
|
|
41
|
+
}, z.core.$strip>>;
|
|
42
|
+
}, z.core.$strip>>;
|
|
43
|
+
export declare const shimAckSchema: z.ZodReadonly<z.ZodObject<{
|
|
44
|
+
kind: z.ZodLiteral<"shim_ack">;
|
|
45
|
+
}, z.core.$strip>>;
|
|
46
|
+
export declare const shimRunningSchema: z.ZodReadonly<z.ZodObject<{
|
|
47
|
+
kind: z.ZodLiteral<"shim_running">;
|
|
48
|
+
}, z.core.$strip>>;
|
|
49
|
+
export declare const workerExitSchema: z.ZodReadonly<z.ZodObject<{
|
|
50
|
+
kind: z.ZodLiteral<"worker_exit">;
|
|
51
|
+
code: z.ZodNullable<z.ZodNumber>;
|
|
52
|
+
signal: z.ZodNullable<z.ZodString>;
|
|
53
|
+
}, z.core.$strip>>;
|
|
54
|
+
export declare const supervisorRequestSchema: z.ZodDiscriminatedUnion<[z.ZodReadonly<z.ZodObject<{
|
|
55
|
+
kind: z.ZodLiteral<"probe">;
|
|
56
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
57
|
+
kind: z.ZodLiteral<"terminate">;
|
|
58
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
59
|
+
kind: z.ZodLiteral<"release">;
|
|
60
|
+
}, z.core.$strip>>], "kind">;
|
|
61
|
+
export declare const supervisorResponseSchema: z.ZodDiscriminatedUnion<[z.ZodReadonly<z.ZodObject<{
|
|
62
|
+
kind: z.ZodLiteral<"termination">;
|
|
63
|
+
result: z.ZodDiscriminatedUnion<[z.ZodReadonly<z.ZodObject<{
|
|
64
|
+
kind: z.ZodLiteral<"absent">;
|
|
65
|
+
proof: z.ZodEnum<{
|
|
66
|
+
supervisor_probe: "supervisor_probe";
|
|
67
|
+
boot_changed: "boot_changed";
|
|
68
|
+
released_receipt: "released_receipt";
|
|
69
|
+
}>;
|
|
70
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
71
|
+
kind: z.ZodLiteral<"pending">;
|
|
72
|
+
phase: z.ZodEnum<{
|
|
73
|
+
term_grace: "term_grace";
|
|
74
|
+
kill_probe: "kill_probe";
|
|
75
|
+
}>;
|
|
76
|
+
retryAfterMs: z.ZodNumber;
|
|
77
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
78
|
+
kind: z.ZodLiteral<"unkillable">;
|
|
79
|
+
reason: z.ZodEnum<{
|
|
80
|
+
invalid_identity: "invalid_identity";
|
|
81
|
+
boot_identity_unavailable: "boot_identity_unavailable";
|
|
82
|
+
supervisor_unreachable: "supervisor_unreachable";
|
|
83
|
+
record_authentication_failed: "record_authentication_failed";
|
|
84
|
+
record_identity_mismatch: "record_identity_mismatch";
|
|
85
|
+
protocol_failure: "protocol_failure";
|
|
86
|
+
probe_permission_denied: "probe_permission_denied";
|
|
87
|
+
shim_lost_with_live_group: "shim_lost_with_live_group";
|
|
88
|
+
group_survived_sigkill: "group_survived_sigkill";
|
|
89
|
+
}>;
|
|
90
|
+
}, z.core.$strip>>], "kind">;
|
|
91
|
+
workerExit: z.ZodNullable<z.ZodReadonly<z.ZodObject<{
|
|
92
|
+
code: z.ZodNullable<z.ZodNumber>;
|
|
93
|
+
signal: z.ZodNullable<z.ZodString>;
|
|
94
|
+
}, z.core.$strip>>>;
|
|
95
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
96
|
+
kind: z.ZodLiteral<"released">;
|
|
97
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
98
|
+
kind: z.ZodLiteral<"release_before_absent">;
|
|
99
|
+
}, z.core.$strip>>], "kind">;
|
|
100
|
+
//# sourceMappingURL=supervisor-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor-schema.d.ts","sourceRoot":"","sources":["../../../src/internal/controlled-process/supervisor-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0CxB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;kBAMK,CAAC;AAE5C,eAAO,MAAM,uBAAuB;;kBAEK,CAAC;AAE1C,eAAO,MAAM,6BAA6B;;;;;;kBAGK,CAAC;AAEhD,eAAO,MAAM,iCAAiC;;;kBAGK,CAAC;AAEpD,eAAO,MAAM,mBAAmB;;;;;;;;;kBAGK,CAAC;AAEtC,eAAO,MAAM,aAAa;;kBAEK,CAAC;AAEhC,eAAO,MAAM,iBAAiB;;kBAEK,CAAC;AAEpC,eAAO,MAAM,gBAAgB;;;;kBAIK,CAAC;AAEnC,eAAO,MAAM,uBAAuB;;;;;;4BAIK,CAAC;AAE1C,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAaK,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { strictReadonlyObject } from "@alpacakit/core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { SHIM_FRAME_KIND, SUPERVISOR_BOOTSTRAP_FRAME_KIND, SUPERVISOR_REQUEST_KIND, SUPERVISOR_RESPONSE_KIND, } from "./supervisor-values.js";
|
|
4
|
+
import { childProcessTerminationResultSchema, controlledProcessIdentitySchema, } from "./schema.js";
|
|
5
|
+
const nonBlankStringSchema = z
|
|
6
|
+
.string()
|
|
7
|
+
.min(1)
|
|
8
|
+
.refine((value) => value.trim() !== "");
|
|
9
|
+
const durationSchema = z.number().int().positive().max(Number.MAX_SAFE_INTEGER);
|
|
10
|
+
const workerOptionsSchema = strictReadonlyObject({
|
|
11
|
+
command: nonBlankStringSchema,
|
|
12
|
+
args: z.array(z.string()).readonly(),
|
|
13
|
+
cwd: nonBlankStringSchema,
|
|
14
|
+
env: z.record(z.string(), z.string()).readonly(),
|
|
15
|
+
stdin: z.string().nullable(),
|
|
16
|
+
});
|
|
17
|
+
const timingOptionsSchema = strictReadonlyObject({
|
|
18
|
+
termGraceMs: durationSchema,
|
|
19
|
+
killProbeTimeoutMs: durationSchema,
|
|
20
|
+
probeIntervalMs: durationSchema,
|
|
21
|
+
});
|
|
22
|
+
export const supervisorBootstrapSchema = strictReadonlyObject({
|
|
23
|
+
kind: z.literal(SUPERVISOR_BOOTSTRAP_FRAME_KIND.bootstrap),
|
|
24
|
+
runtimeDirectory: nonBlankStringSchema,
|
|
25
|
+
shimEntryPath: nonBlankStringSchema,
|
|
26
|
+
worker: workerOptionsSchema,
|
|
27
|
+
timing: timingOptionsSchema,
|
|
28
|
+
});
|
|
29
|
+
export const supervisorHostAckSchema = strictReadonlyObject({
|
|
30
|
+
kind: z.literal(SUPERVISOR_BOOTSTRAP_FRAME_KIND.hostAck),
|
|
31
|
+
});
|
|
32
|
+
export const supervisorIdentityFrameSchema = strictReadonlyObject({
|
|
33
|
+
kind: z.literal(SUPERVISOR_BOOTSTRAP_FRAME_KIND.identity),
|
|
34
|
+
identity: controlledProcessIdentitySchema,
|
|
35
|
+
});
|
|
36
|
+
export const supervisorLaunchFailedFrameSchema = strictReadonlyObject({
|
|
37
|
+
kind: z.literal(SUPERVISOR_BOOTSTRAP_FRAME_KIND.launchFailed),
|
|
38
|
+
reason: z.string().min(1),
|
|
39
|
+
});
|
|
40
|
+
export const shimBootstrapSchema = strictReadonlyObject({
|
|
41
|
+
kind: z.literal(SHIM_FRAME_KIND.bootstrap),
|
|
42
|
+
worker: workerOptionsSchema,
|
|
43
|
+
});
|
|
44
|
+
export const shimAckSchema = strictReadonlyObject({
|
|
45
|
+
kind: z.literal(SHIM_FRAME_KIND.ack),
|
|
46
|
+
});
|
|
47
|
+
export const shimRunningSchema = strictReadonlyObject({
|
|
48
|
+
kind: z.literal(SHIM_FRAME_KIND.running),
|
|
49
|
+
});
|
|
50
|
+
export const workerExitSchema = strictReadonlyObject({
|
|
51
|
+
kind: z.literal(SHIM_FRAME_KIND.workerExit),
|
|
52
|
+
code: z.number().int().nullable(),
|
|
53
|
+
signal: z.string().nullable(),
|
|
54
|
+
});
|
|
55
|
+
export const supervisorRequestSchema = z.discriminatedUnion("kind", [
|
|
56
|
+
strictReadonlyObject({ kind: z.literal(SUPERVISOR_REQUEST_KIND.probe) }),
|
|
57
|
+
strictReadonlyObject({ kind: z.literal(SUPERVISOR_REQUEST_KIND.terminate) }),
|
|
58
|
+
strictReadonlyObject({ kind: z.literal(SUPERVISOR_REQUEST_KIND.release) }),
|
|
59
|
+
]);
|
|
60
|
+
export const supervisorResponseSchema = z.discriminatedUnion("kind", [
|
|
61
|
+
strictReadonlyObject({
|
|
62
|
+
kind: z.literal(SUPERVISOR_RESPONSE_KIND.termination),
|
|
63
|
+
result: childProcessTerminationResultSchema,
|
|
64
|
+
workerExit: strictReadonlyObject({
|
|
65
|
+
code: z.number().int().nullable(),
|
|
66
|
+
signal: z.string().nullable(),
|
|
67
|
+
}).nullable(),
|
|
68
|
+
}),
|
|
69
|
+
strictReadonlyObject({ kind: z.literal(SUPERVISOR_RESPONSE_KIND.released) }),
|
|
70
|
+
strictReadonlyObject({
|
|
71
|
+
kind: z.literal(SUPERVISOR_RESPONSE_KIND.releaseBeforeAbsent),
|
|
72
|
+
}),
|
|
73
|
+
]);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ControlledProcessRecordId, SupervisorCapability } from "./model.js";
|
|
2
|
+
import type { SupervisorRequest, SupervisorResponse } from "./supervisor-model.js";
|
|
3
|
+
export type SupervisorSessionHandler = (request: SupervisorRequest) => Promise<SupervisorResponse>;
|
|
4
|
+
type SupervisorSocketState = {
|
|
5
|
+
readonly kind: "owned";
|
|
6
|
+
} | {
|
|
7
|
+
readonly kind: "ownership_lost";
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: "closed";
|
|
10
|
+
};
|
|
11
|
+
export declare class SupervisorSocketServer {
|
|
12
|
+
private readonly socketPath;
|
|
13
|
+
private readonly uid;
|
|
14
|
+
private readonly recordId;
|
|
15
|
+
private readonly capability;
|
|
16
|
+
private readonly handler;
|
|
17
|
+
private server;
|
|
18
|
+
private ownedSocket;
|
|
19
|
+
private bound;
|
|
20
|
+
private ownershipLost;
|
|
21
|
+
private closed;
|
|
22
|
+
private readonly sessions;
|
|
23
|
+
private finalizationPromise;
|
|
24
|
+
private closePromise;
|
|
25
|
+
constructor(socketPath: string, uid: number, recordId: ControlledProcessRecordId, capability: SupervisorCapability, handler: SupervisorSessionHandler);
|
|
26
|
+
listen(): Promise<void>;
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
observeOwnership(): Promise<SupervisorSocketState>;
|
|
29
|
+
finalize(): Promise<SupervisorSocketState>;
|
|
30
|
+
settleAcceptedSessions(): Promise<void>;
|
|
31
|
+
private finalizeOwnedSocket;
|
|
32
|
+
private inspectOwnership;
|
|
33
|
+
private latchOwnershipLost;
|
|
34
|
+
private handle;
|
|
35
|
+
}
|
|
36
|
+
export declare function requestSupervisor(input: {
|
|
37
|
+
readonly socketPath: string;
|
|
38
|
+
readonly uid: number;
|
|
39
|
+
readonly recordId: ControlledProcessRecordId;
|
|
40
|
+
readonly capability: SupervisorCapability;
|
|
41
|
+
readonly request: SupervisorRequest;
|
|
42
|
+
readonly signal: AbortSignal;
|
|
43
|
+
}): Promise<SupervisorResponse>;
|
|
44
|
+
export declare function assertSecureSocket(socketPath: string, uid: number): Promise<void>;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=supervisor-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor-transport.d.ts","sourceRoot":"","sources":["../../../src/internal/controlled-process/supervisor-transport.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EAIrB,MAAM,YAAY,CAAC;AAQpB,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AAe/B,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,iBAAiB,KACvB,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAYjC,KAAK,qBAAqB,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GACnC;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAMhC,qBAAa,sBAAsB;IAW/B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd1B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,mBAAmB,CAA+C;IAC1E,OAAO,CAAC,YAAY,CAA8B;gBAG/B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,yBAAyB,EACnC,UAAU,EAAE,oBAAoB,EAChC,OAAO,EAAE,wBAAwB;IAG9C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAmE7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAIlD,QAAQ,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAK1C,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;YAIzB,mBAAmB;YAsCnB,gBAAgB;IAuB9B,OAAO,CAAC,kBAAkB;YAKZ,MAAM;CAmCrB;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuC9B;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAWf"}
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { chmod, lstat, unlink } from "node:fs/promises";
|
|
3
|
+
import { createConnection, createServer, } from "node:net";
|
|
4
|
+
import { consumeClientProof, createClientProof, issueSupervisorChallenge, verifySupervisorChallenge, } from "./authentication.js";
|
|
5
|
+
import { readFramedRecords, readRequiredFrame, writeFramedRecord, } from "./framed-transport.js";
|
|
6
|
+
import { supervisorChallengeSchema, supervisorClientChallengeSchema, supervisorClientNonceSchema, supervisorClientProofSchema, supervisorServerNonceSchema, } from "./schema.js";
|
|
7
|
+
import { supervisorRequestSchema, supervisorResponseSchema, } from "./supervisor-schema.js";
|
|
8
|
+
import { SUPERVISOR_AUTHENTICATION_FRAME_KIND, SUPERVISOR_AUTHENTICATION_RESULT_KIND, } from "./values.js";
|
|
9
|
+
const SOCKET_MODE = 0o600;
|
|
10
|
+
const PERMISSION_BITS = 0o777;
|
|
11
|
+
const NONCE_BYTES = 32;
|
|
12
|
+
const CONNECTION_TIMEOUT_MS = 1_000;
|
|
13
|
+
const OWNED_SOCKET_STATE = { kind: "owned" };
|
|
14
|
+
const OWNERSHIP_LOST_SOCKET_STATE = { kind: "ownership_lost" };
|
|
15
|
+
const CLOSED_SOCKET_STATE = { kind: "closed" };
|
|
16
|
+
export class SupervisorSocketServer {
|
|
17
|
+
socketPath;
|
|
18
|
+
uid;
|
|
19
|
+
recordId;
|
|
20
|
+
capability;
|
|
21
|
+
handler;
|
|
22
|
+
server = null;
|
|
23
|
+
ownedSocket = null;
|
|
24
|
+
bound = false;
|
|
25
|
+
ownershipLost = false;
|
|
26
|
+
closed = false;
|
|
27
|
+
sessions = new Set();
|
|
28
|
+
finalizationPromise = null;
|
|
29
|
+
closePromise = null;
|
|
30
|
+
constructor(socketPath, uid, recordId, capability, handler) {
|
|
31
|
+
this.socketPath = socketPath;
|
|
32
|
+
this.uid = uid;
|
|
33
|
+
this.recordId = recordId;
|
|
34
|
+
this.capability = capability;
|
|
35
|
+
this.handler = handler;
|
|
36
|
+
}
|
|
37
|
+
async listen() {
|
|
38
|
+
await assertSocketTargetAbsent(this.socketPath);
|
|
39
|
+
const server = createServer((socket) => {
|
|
40
|
+
if (this.ownershipLost || this.closed) {
|
|
41
|
+
socket.destroy();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const onTimeout = () => {
|
|
45
|
+
socket.destroy();
|
|
46
|
+
};
|
|
47
|
+
const stopSessionControls = () => {
|
|
48
|
+
socket.setTimeout(0);
|
|
49
|
+
socket.off("timeout", onTimeout);
|
|
50
|
+
};
|
|
51
|
+
socket.setTimeout(CONNECTION_TIMEOUT_MS, onTimeout);
|
|
52
|
+
const session = this.handle(socket).then(() => {
|
|
53
|
+
stopSessionControls();
|
|
54
|
+
return observeSocketClose(socket);
|
|
55
|
+
}, () => {
|
|
56
|
+
stopSessionControls();
|
|
57
|
+
socket.destroy();
|
|
58
|
+
return observeSocketClose(socket);
|
|
59
|
+
});
|
|
60
|
+
this.sessions.add(session);
|
|
61
|
+
void session.finally(() => this.sessions.delete(session));
|
|
62
|
+
});
|
|
63
|
+
this.server = server;
|
|
64
|
+
try {
|
|
65
|
+
await new Promise((resolve, reject) => {
|
|
66
|
+
server.once("error", reject);
|
|
67
|
+
server.listen(this.socketPath, () => {
|
|
68
|
+
server.off("error", reject);
|
|
69
|
+
resolve();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
this.bound = true;
|
|
73
|
+
try {
|
|
74
|
+
this.ownedSocket = await readOwnedSocketIdentity(this.socketPath, this.uid);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
this.latchOwnershipLost();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
await chmod(this.socketPath, SOCKET_MODE);
|
|
81
|
+
await assertSecureSocket(this.socketPath, this.uid);
|
|
82
|
+
}
|
|
83
|
+
catch (primaryFailure) {
|
|
84
|
+
let finalization;
|
|
85
|
+
try {
|
|
86
|
+
finalization = await this.finalize();
|
|
87
|
+
}
|
|
88
|
+
catch (cleanupFailure) {
|
|
89
|
+
throw new AggregateError([primaryFailure, cleanupFailure], "Supervisor socket listen and cleanup both failed.");
|
|
90
|
+
}
|
|
91
|
+
if (finalization.kind === OWNERSHIP_LOST_SOCKET_STATE.kind) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
throw primaryFailure;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
close() {
|
|
98
|
+
this.closePromise ??= this.finalize().then(() => undefined);
|
|
99
|
+
return this.closePromise;
|
|
100
|
+
}
|
|
101
|
+
observeOwnership() {
|
|
102
|
+
return this.inspectOwnership();
|
|
103
|
+
}
|
|
104
|
+
finalize() {
|
|
105
|
+
this.finalizationPromise ??= this.finalizeOwnedSocket();
|
|
106
|
+
return this.finalizationPromise;
|
|
107
|
+
}
|
|
108
|
+
settleAcceptedSessions() {
|
|
109
|
+
return Promise.all(this.sessions).then(() => undefined);
|
|
110
|
+
}
|
|
111
|
+
async finalizeOwnedSocket() {
|
|
112
|
+
const server = this.server;
|
|
113
|
+
if (!this.bound || server?.listening !== true) {
|
|
114
|
+
this.server = null;
|
|
115
|
+
this.ownedSocket = null;
|
|
116
|
+
this.closed = true;
|
|
117
|
+
return CLOSED_SOCKET_STATE;
|
|
118
|
+
}
|
|
119
|
+
const started = await this.inspectOwnership();
|
|
120
|
+
if (started.kind !== OWNED_SOCKET_STATE.kind) {
|
|
121
|
+
return started;
|
|
122
|
+
}
|
|
123
|
+
const final = await this.inspectOwnership();
|
|
124
|
+
if (final.kind !== OWNED_SOCKET_STATE.kind) {
|
|
125
|
+
return final;
|
|
126
|
+
}
|
|
127
|
+
const ownedSocket = this.ownedSocket;
|
|
128
|
+
if (ownedSocket === null) {
|
|
129
|
+
return this.latchOwnershipLost();
|
|
130
|
+
}
|
|
131
|
+
await new Promise((resolve, reject) => {
|
|
132
|
+
server.close((error) => {
|
|
133
|
+
if (error === undefined) {
|
|
134
|
+
resolve();
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
reject(error);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
await this.settleAcceptedSessions();
|
|
142
|
+
await unlinkOwnedSocket(this.socketPath, ownedSocket);
|
|
143
|
+
this.server = null;
|
|
144
|
+
this.ownedSocket = null;
|
|
145
|
+
this.bound = false;
|
|
146
|
+
this.closed = true;
|
|
147
|
+
return CLOSED_SOCKET_STATE;
|
|
148
|
+
}
|
|
149
|
+
async inspectOwnership() {
|
|
150
|
+
if (this.ownershipLost) {
|
|
151
|
+
return OWNERSHIP_LOST_SOCKET_STATE;
|
|
152
|
+
}
|
|
153
|
+
if (this.closed) {
|
|
154
|
+
return CLOSED_SOCKET_STATE;
|
|
155
|
+
}
|
|
156
|
+
const ownedSocket = this.ownedSocket;
|
|
157
|
+
if (!this.bound || ownedSocket === null) {
|
|
158
|
+
return this.latchOwnershipLost();
|
|
159
|
+
}
|
|
160
|
+
let current;
|
|
161
|
+
try {
|
|
162
|
+
current = await readOwnedSocketIdentity(this.socketPath, this.uid);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return this.latchOwnershipLost();
|
|
166
|
+
}
|
|
167
|
+
return current.device === ownedSocket.device &&
|
|
168
|
+
current.inode === ownedSocket.inode
|
|
169
|
+
? OWNED_SOCKET_STATE
|
|
170
|
+
: this.latchOwnershipLost();
|
|
171
|
+
}
|
|
172
|
+
latchOwnershipLost() {
|
|
173
|
+
this.ownershipLost = true;
|
|
174
|
+
return OWNERSHIP_LOST_SOCKET_STATE;
|
|
175
|
+
}
|
|
176
|
+
async handle(socket) {
|
|
177
|
+
const frames = readFramedRecords(socket)[Symbol.asyncIterator]();
|
|
178
|
+
const challenge = supervisorClientChallengeSchema.parse(await readRequiredFrame(frames));
|
|
179
|
+
if (challenge.recordId !== this.recordId) {
|
|
180
|
+
socket.destroy();
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const issued = issueSupervisorChallenge(challenge, randomServerNonce(), this.capability);
|
|
184
|
+
await writeFramedRecord(socket, issued.challenge);
|
|
185
|
+
const proof = supervisorClientProofSchema.parse(await readRequiredFrame(frames));
|
|
186
|
+
const authentication = consumeClientProof(issued.state, proof, this.capability);
|
|
187
|
+
if (authentication.kind !== SUPERVISOR_AUTHENTICATION_RESULT_KIND.accepted) {
|
|
188
|
+
socket.destroy();
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const request = supervisorRequestSchema.parse(await readRequiredFrame(frames));
|
|
192
|
+
await writeFramedRecord(socket, await this.handler(request));
|
|
193
|
+
socket.end();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
export async function requestSupervisor(input) {
|
|
197
|
+
input.signal.throwIfAborted();
|
|
198
|
+
await assertSecureSocket(input.socketPath, input.uid);
|
|
199
|
+
input.signal.throwIfAborted();
|
|
200
|
+
const connection = await connect(input.socketPath, input.signal);
|
|
201
|
+
const { socket } = connection;
|
|
202
|
+
let response;
|
|
203
|
+
try {
|
|
204
|
+
const frames = readFramedRecords(socket)[Symbol.asyncIterator]();
|
|
205
|
+
const clientChallenge = {
|
|
206
|
+
kind: SUPERVISOR_AUTHENTICATION_FRAME_KIND.clientChallenge,
|
|
207
|
+
recordId: input.recordId,
|
|
208
|
+
clientNonce: randomClientNonce(),
|
|
209
|
+
};
|
|
210
|
+
await writeFramedRecord(socket, clientChallenge);
|
|
211
|
+
const challenge = supervisorChallengeSchema.parse(await readRequiredFrame(frames));
|
|
212
|
+
if (challenge.recordId !== clientChallenge.recordId ||
|
|
213
|
+
challenge.clientNonce !== clientChallenge.clientNonce ||
|
|
214
|
+
!verifySupervisorChallenge(challenge, input.capability)) {
|
|
215
|
+
throw new Error("Supervisor socket authentication failed.");
|
|
216
|
+
}
|
|
217
|
+
await writeFramedRecord(socket, createClientProof(challenge, input.capability));
|
|
218
|
+
await writeFramedRecord(socket, input.request);
|
|
219
|
+
response = supervisorResponseSchema.parse(await readRequiredFrame(frames));
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
input.signal.throwIfAborted();
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
await connection.close();
|
|
227
|
+
}
|
|
228
|
+
input.signal.throwIfAborted();
|
|
229
|
+
return response;
|
|
230
|
+
}
|
|
231
|
+
export async function assertSecureSocket(socketPath, uid) {
|
|
232
|
+
const stat = await lstat(socketPath);
|
|
233
|
+
if (stat.isSymbolicLink() || !stat.isSocket()) {
|
|
234
|
+
throw new Error("Supervisor socket must be a real Unix socket.");
|
|
235
|
+
}
|
|
236
|
+
if (stat.uid !== uid) {
|
|
237
|
+
throw new Error("Supervisor socket owner does not match uid.");
|
|
238
|
+
}
|
|
239
|
+
if ((stat.mode & PERMISSION_BITS) !== SOCKET_MODE) {
|
|
240
|
+
throw new Error("Supervisor socket mode must be 0600.");
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async function readOwnedSocketIdentity(socketPath, uid) {
|
|
244
|
+
const stat = await lstat(socketPath);
|
|
245
|
+
if (stat.isSymbolicLink() || !stat.isSocket()) {
|
|
246
|
+
throw new Error("Supervisor owned socket must be a real Unix socket.");
|
|
247
|
+
}
|
|
248
|
+
if (stat.uid !== uid) {
|
|
249
|
+
throw new Error("Supervisor owned socket owner does not match uid.");
|
|
250
|
+
}
|
|
251
|
+
return { device: stat.dev, inode: stat.ino };
|
|
252
|
+
}
|
|
253
|
+
async function unlinkOwnedSocket(socketPath, ownedSocket) {
|
|
254
|
+
let current;
|
|
255
|
+
try {
|
|
256
|
+
current = await lstat(socketPath);
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
if (isErrno(error, "ENOENT")) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
if (current.dev !== ownedSocket.device || current.ino !== ownedSocket.inode) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
await unlink(socketPath);
|
|
268
|
+
}
|
|
269
|
+
async function connect(socketPath, signal) {
|
|
270
|
+
signal.throwIfAborted();
|
|
271
|
+
const socket = createConnection(socketPath);
|
|
272
|
+
const closed = observeSocketClose(socket);
|
|
273
|
+
let controlsStopped = false;
|
|
274
|
+
const stopControls = () => {
|
|
275
|
+
if (controlsStopped) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
controlsStopped = true;
|
|
279
|
+
signal.removeEventListener("abort", onAbort);
|
|
280
|
+
socket.setTimeout(0);
|
|
281
|
+
socket.off("timeout", onTimeout);
|
|
282
|
+
};
|
|
283
|
+
const onTimeout = () => {
|
|
284
|
+
stopControls();
|
|
285
|
+
socket.destroy(new Error("Supervisor socket request timed out."));
|
|
286
|
+
};
|
|
287
|
+
const onAbort = () => {
|
|
288
|
+
stopControls();
|
|
289
|
+
socket.destroy();
|
|
290
|
+
};
|
|
291
|
+
socket.setTimeout(CONNECTION_TIMEOUT_MS, onTimeout);
|
|
292
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
293
|
+
try {
|
|
294
|
+
await waitForSocketConnect(socket);
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
stopControls();
|
|
298
|
+
socket.destroy();
|
|
299
|
+
await closed;
|
|
300
|
+
signal.throwIfAborted();
|
|
301
|
+
throw error;
|
|
302
|
+
}
|
|
303
|
+
let closePromise = null;
|
|
304
|
+
return {
|
|
305
|
+
socket,
|
|
306
|
+
close: () => {
|
|
307
|
+
closePromise ??= (async () => {
|
|
308
|
+
stopControls();
|
|
309
|
+
socket.destroy();
|
|
310
|
+
await closed;
|
|
311
|
+
})();
|
|
312
|
+
return closePromise;
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
function waitForSocketConnect(socket) {
|
|
317
|
+
return new Promise((resolve, reject) => {
|
|
318
|
+
const cleanup = () => {
|
|
319
|
+
socket.off("connect", connected);
|
|
320
|
+
socket.off("error", failed);
|
|
321
|
+
socket.off("close", closed);
|
|
322
|
+
};
|
|
323
|
+
const connected = () => {
|
|
324
|
+
cleanup();
|
|
325
|
+
resolve();
|
|
326
|
+
};
|
|
327
|
+
const failed = (error) => {
|
|
328
|
+
cleanup();
|
|
329
|
+
reject(error);
|
|
330
|
+
};
|
|
331
|
+
const closed = () => {
|
|
332
|
+
cleanup();
|
|
333
|
+
reject(new Error("Supervisor socket closed before connect."));
|
|
334
|
+
};
|
|
335
|
+
socket.once("connect", connected);
|
|
336
|
+
socket.once("error", failed);
|
|
337
|
+
socket.once("close", closed);
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
function observeSocketClose(socket) {
|
|
341
|
+
if (socket.closed) {
|
|
342
|
+
return Promise.resolve();
|
|
343
|
+
}
|
|
344
|
+
return new Promise((resolve) => {
|
|
345
|
+
socket.once("close", () => resolve());
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
async function assertSocketTargetAbsent(socketPath) {
|
|
349
|
+
try {
|
|
350
|
+
await lstat(socketPath);
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
if (isErrno(error, "ENOENT")) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
throw error;
|
|
357
|
+
}
|
|
358
|
+
throw new Error("Supervisor socket path already exists.");
|
|
359
|
+
}
|
|
360
|
+
function randomClientNonce() {
|
|
361
|
+
return supervisorClientNonceSchema.parse(randomBytes(NONCE_BYTES).toString("hex"));
|
|
362
|
+
}
|
|
363
|
+
function randomServerNonce() {
|
|
364
|
+
return supervisorServerNonceSchema.parse(randomBytes(NONCE_BYTES).toString("hex"));
|
|
365
|
+
}
|
|
366
|
+
function isErrno(error, code) {
|
|
367
|
+
return error instanceof Error && "code" in error && error.code === code;
|
|
368
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare const SUPERVISOR_BOOTSTRAP_FRAME_KIND: {
|
|
2
|
+
readonly bootstrap: "bootstrap";
|
|
3
|
+
readonly hostAck: "host_ack";
|
|
4
|
+
readonly identity: "identity";
|
|
5
|
+
readonly launchFailed: "launch_failed";
|
|
6
|
+
};
|
|
7
|
+
export declare const SHIM_FRAME_KIND: {
|
|
8
|
+
readonly bootstrap: "shim_bootstrap";
|
|
9
|
+
readonly ack: "shim_ack";
|
|
10
|
+
readonly running: "shim_running";
|
|
11
|
+
readonly workerExit: "worker_exit";
|
|
12
|
+
};
|
|
13
|
+
export declare const SUPERVISOR_REQUEST_KIND: {
|
|
14
|
+
readonly probe: "probe";
|
|
15
|
+
readonly terminate: "terminate";
|
|
16
|
+
readonly release: "release";
|
|
17
|
+
};
|
|
18
|
+
export declare const SUPERVISOR_RESPONSE_KIND: {
|
|
19
|
+
readonly termination: "termination";
|
|
20
|
+
readonly released: "released";
|
|
21
|
+
readonly releaseBeforeAbsent: "release_before_absent";
|
|
22
|
+
};
|
|
23
|
+
export declare const PROCESS_PROBE_KIND: {
|
|
24
|
+
readonly alive: "alive";
|
|
25
|
+
readonly absent: "absent";
|
|
26
|
+
readonly denied: "denied";
|
|
27
|
+
readonly failed: "failed";
|
|
28
|
+
};
|
|
29
|
+
export declare const PROCESS_SIGNAL_RESULT_KIND: {
|
|
30
|
+
readonly sent: "sent";
|
|
31
|
+
readonly absent: "absent";
|
|
32
|
+
readonly denied: "denied";
|
|
33
|
+
readonly failed: "failed";
|
|
34
|
+
};
|
|
35
|
+
export declare const OUTPUT_CHANNEL_KIND: {
|
|
36
|
+
readonly stdout: "stdout";
|
|
37
|
+
readonly stderr: "stderr";
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=supervisor-values.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor-values.d.ts","sourceRoot":"","sources":["../../../src/internal/controlled-process/supervisor-values.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,+BAA+B;;;;;CAKlC,CAAC;AAEX,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAEX,eAAO,MAAM,uBAAuB;;;;CAI1B,CAAC;AAEX,eAAO,MAAM,wBAAwB;;;;CAI3B,CAAC;AAEX,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAC;AAEX,eAAO,MAAM,0BAA0B;;;;;CAK7B,CAAC;AAEX,eAAO,MAAM,mBAAmB;;;CAGtB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export const SUPERVISOR_BOOTSTRAP_FRAME_KIND = {
|
|
2
|
+
bootstrap: "bootstrap",
|
|
3
|
+
hostAck: "host_ack",
|
|
4
|
+
identity: "identity",
|
|
5
|
+
launchFailed: "launch_failed",
|
|
6
|
+
};
|
|
7
|
+
export const SHIM_FRAME_KIND = {
|
|
8
|
+
bootstrap: "shim_bootstrap",
|
|
9
|
+
ack: "shim_ack",
|
|
10
|
+
running: "shim_running",
|
|
11
|
+
workerExit: "worker_exit",
|
|
12
|
+
};
|
|
13
|
+
export const SUPERVISOR_REQUEST_KIND = {
|
|
14
|
+
probe: "probe",
|
|
15
|
+
terminate: "terminate",
|
|
16
|
+
release: "release",
|
|
17
|
+
};
|
|
18
|
+
export const SUPERVISOR_RESPONSE_KIND = {
|
|
19
|
+
termination: "termination",
|
|
20
|
+
released: "released",
|
|
21
|
+
releaseBeforeAbsent: "release_before_absent",
|
|
22
|
+
};
|
|
23
|
+
export const PROCESS_PROBE_KIND = {
|
|
24
|
+
alive: "alive",
|
|
25
|
+
absent: "absent",
|
|
26
|
+
denied: "denied",
|
|
27
|
+
failed: "failed",
|
|
28
|
+
};
|
|
29
|
+
export const PROCESS_SIGNAL_RESULT_KIND = {
|
|
30
|
+
sent: "sent",
|
|
31
|
+
absent: "absent",
|
|
32
|
+
denied: "denied",
|
|
33
|
+
failed: "failed",
|
|
34
|
+
};
|
|
35
|
+
export const OUTPUT_CHANNEL_KIND = {
|
|
36
|
+
stdout: "stdout",
|
|
37
|
+
stderr: "stderr",
|
|
38
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ProcessStartToken, ProcessStartTokenFields } from "./model.js";
|
|
2
|
+
export declare function encodeProcessStartToken(fields: ProcessStartTokenFields): ProcessStartToken;
|
|
3
|
+
export declare function decodeProcessStartToken(value: unknown): ProcessStartTokenFields;
|
|
4
|
+
//# sourceMappingURL=token.d.ts.map
|