node-or-bun 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/LICENSE +21 -0
  3. package/README.md +118 -2
  4. package/dist/adapters/bun.d.ts +12 -0
  5. package/dist/adapters/bun.d.ts.map +1 -0
  6. package/dist/adapters/bun.js +263 -0
  7. package/dist/adapters/bun.js.map +1 -0
  8. package/dist/adapters/node.d.ts +11 -0
  9. package/dist/adapters/node.d.ts.map +1 -0
  10. package/dist/adapters/node.js +233 -0
  11. package/dist/adapters/node.js.map +1 -0
  12. package/dist/contract.d.ts +39 -0
  13. package/dist/contract.d.ts.map +1 -0
  14. package/dist/contract.js +4 -0
  15. package/dist/contract.js.map +1 -0
  16. package/dist/errors.d.ts +34 -0
  17. package/dist/errors.d.ts.map +1 -0
  18. package/dist/errors.js +35 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/executor.d.ts +3 -0
  21. package/dist/executor.d.ts.map +1 -0
  22. package/dist/executor.js +285 -0
  23. package/dist/executor.js.map +1 -0
  24. package/dist/index.d.ts +6 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +4 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/internal/capture.d.ts +9 -0
  29. package/dist/internal/capture.d.ts.map +1 -0
  30. package/dist/internal/capture.js +58 -0
  31. package/dist/internal/capture.js.map +1 -0
  32. package/dist/internal/classification.d.ts +32 -0
  33. package/dist/internal/classification.d.ts.map +1 -0
  34. package/dist/internal/classification.js +64 -0
  35. package/dist/internal/classification.js.map +1 -0
  36. package/dist/internal/input.d.ts +9 -0
  37. package/dist/internal/input.d.ts.map +1 -0
  38. package/dist/internal/input.js +62 -0
  39. package/dist/internal/input.js.map +1 -0
  40. package/dist/internal/settlement.d.ts +15 -0
  41. package/dist/internal/settlement.d.ts.map +1 -0
  42. package/dist/internal/settlement.js +39 -0
  43. package/dist/internal/settlement.js.map +1 -0
  44. package/dist/internal/termination.d.ts +8 -0
  45. package/dist/internal/termination.d.ts.map +1 -0
  46. package/dist/internal/termination.js +22 -0
  47. package/dist/internal/termination.js.map +1 -0
  48. package/dist/testing/conformance.d.ts +12 -0
  49. package/dist/testing/conformance.d.ts.map +1 -0
  50. package/dist/testing/conformance.js +462 -0
  51. package/dist/testing/conformance.js.map +1 -0
  52. package/package.json +63 -4
@@ -0,0 +1,285 @@
1
+ import { PROCESS_CLEANUP_STEP_MS } from "./contract.js";
2
+ import { ProcessRuntimeError, isProcessRuntimeError, processError, } from "./errors.js";
3
+ import { classifyProcessOutcome, } from "./internal/classification.js";
4
+ import { decodeCapture, drainCapture } from "./internal/capture.js";
5
+ import { snapshotRequest } from "./internal/input.js";
6
+ import { rejectedReasons, settleOperation, withCause, } from "./internal/settlement.js";
7
+ const deferred = () => {
8
+ let resolve;
9
+ const promise = new Promise((settle) => {
10
+ resolve = settle;
11
+ });
12
+ return { promise, resolve };
13
+ };
14
+ const wait = async (promise, timeoutMs) => {
15
+ let timer;
16
+ const timeout = new Promise((resolve) => {
17
+ timer = setTimeout(() => resolve({ status: "timeout" }), timeoutMs);
18
+ });
19
+ try {
20
+ return await Promise.race([
21
+ promise.then((value) => ({ status: "settled", value })),
22
+ timeout,
23
+ ]);
24
+ }
25
+ finally {
26
+ if (timer !== undefined) {
27
+ clearTimeout(timer);
28
+ }
29
+ }
30
+ };
31
+ const captureError = (value, streamName) => {
32
+ const code = isProcessRuntimeError(value) && value.code === "output-limit"
33
+ ? "output-limit"
34
+ : "stream";
35
+ return new ProcessRuntimeError(code, code === "output-limit" ? "captured output exceeded 4 MiB" : `${streamName} capture failed`, { cause: value });
36
+ };
37
+ const initiatingCause = (cause) => {
38
+ switch (cause) {
39
+ case "timeout":
40
+ return "timeout";
41
+ case "cancelled":
42
+ return "cancellation";
43
+ case "capture":
44
+ return "capture";
45
+ case "observation":
46
+ case "failed":
47
+ return "observation";
48
+ case "exited":
49
+ return "exit";
50
+ }
51
+ };
52
+ export const createProcessExecutor = (adapter) => {
53
+ if (adapter === null || typeof adapter !== "object" || typeof adapter.launch !== "function") {
54
+ throw processError("invalid-input", "adapter must expose launch(request)");
55
+ }
56
+ return {
57
+ run: async (request) => {
58
+ const snapshot = snapshotRequest(request);
59
+ const failure = deferred();
60
+ let initiatingFailure;
61
+ let observedExit = null;
62
+ let completionRequestedBeforeExitObservation = false;
63
+ let lateFailureCodes = [];
64
+ let captureReads;
65
+ let outputBounded = false;
66
+ const addLateFailureCode = (code) => {
67
+ if (!lateFailureCodes.includes(code)) {
68
+ lateFailureCodes = [...lateFailureCodes, code];
69
+ }
70
+ };
71
+ const beginFailure = (error, cause) => {
72
+ if (initiatingFailure !== undefined) {
73
+ if (cause === "capture")
74
+ addLateFailureCode(error.code);
75
+ return;
76
+ }
77
+ const state = {
78
+ cause: initiatingCause(cause),
79
+ code: error.code,
80
+ error,
81
+ };
82
+ initiatingFailure = state;
83
+ completionRequestedBeforeExitObservation = observedExit === null;
84
+ failure.resolve(state);
85
+ };
86
+ if (snapshot.signal !== undefined && Boolean(snapshot.signal.aborted)) {
87
+ throw new ProcessRuntimeError("cancelled", "process request was already cancelled", {
88
+ initiatingError: snapshot.signal.reason,
89
+ facts: {
90
+ initiatingCause: "cancellation",
91
+ completionRequestedBeforeExitObservation: true,
92
+ },
93
+ });
94
+ }
95
+ const onAbort = () => {
96
+ if (observedExit === null && initiatingFailure === undefined) {
97
+ beginFailure(processError("cancelled", "process request was cancelled", snapshot.signal?.reason), "cancelled");
98
+ }
99
+ };
100
+ snapshot.signal?.addEventListener("abort", onAbort, { once: true });
101
+ const timer = snapshot.timeoutMs === undefined
102
+ ? undefined
103
+ : setTimeout(() => {
104
+ if (observedExit === null && initiatingFailure === undefined) {
105
+ beginFailure(processError("timeout", "process deadline elapsed"), "timeout");
106
+ }
107
+ }, snapshot.timeoutMs);
108
+ if (snapshot.signal !== undefined && Boolean(snapshot.signal.aborted)) {
109
+ if (timer !== undefined)
110
+ clearTimeout(timer);
111
+ snapshot.signal.removeEventListener("abort", onAbort);
112
+ throw new ProcessRuntimeError("cancelled", "process request was already cancelled", {
113
+ initiatingError: snapshot.signal.reason,
114
+ facts: {
115
+ initiatingCause: "cancellation",
116
+ completionRequestedBeforeExitObservation: true,
117
+ },
118
+ });
119
+ }
120
+ let running;
121
+ try {
122
+ running = await adapter.launch(snapshot.launch);
123
+ }
124
+ catch (cause) {
125
+ if (timer !== undefined)
126
+ clearTimeout(timer);
127
+ snapshot.signal?.removeEventListener("abort", onAbort);
128
+ if (isProcessRuntimeError(cause) && cause.code === "cleanup") {
129
+ throw new ProcessRuntimeError("cleanup", "process cleanup did not complete", {
130
+ cause: cause.cause,
131
+ initiatingError: cause.initiatingError,
132
+ facts: {
133
+ ...cause.facts,
134
+ initiatingCause: cause.facts.initiatingCause ?? "launch",
135
+ incompleteCustody: true,
136
+ },
137
+ });
138
+ }
139
+ if (initiatingFailure !== undefined) {
140
+ throw new ProcessRuntimeError(initiatingFailure.code, initiatingFailure.error.message, {
141
+ cause: initiatingFailure.error.cause,
142
+ initiatingError: initiatingFailure.error,
143
+ facts: {
144
+ initiatingCause: initiatingFailure.cause,
145
+ completionRequestedBeforeExitObservation,
146
+ lateFailureCodes,
147
+ },
148
+ });
149
+ }
150
+ if (isProcessRuntimeError(cause)) {
151
+ throw cause;
152
+ }
153
+ throw new ProcessRuntimeError("launch", "process launch failed", {
154
+ cause,
155
+ initiatingError: cause,
156
+ facts: { initiatingCause: "launch" },
157
+ });
158
+ }
159
+ const stdoutRead = drainCapture(running.stdout, (cause) => {
160
+ beginFailure(captureError(cause, "stdout"), "capture");
161
+ });
162
+ const stderrRead = drainCapture(running.stderr, (cause) => {
163
+ beginFailure(captureError(cause, "stderr"), "capture");
164
+ });
165
+ outputBounded = true;
166
+ // Invariant assertion: the 4 MiB capture limits are in force for this
167
+ // run; the fact does not report whether truncation occurred (review-v2
168
+ // R11 disposition, documented invariant).
169
+ // Contract: drainCapture reports failures through beginFailure and its
170
+ // promise never rejects, so this chain cannot reject (review-v2 R17
171
+ // disposition, documented non-rejecting drain contract).
172
+ const captures = Promise.all([stdoutRead, stderrRead]).then((value) => {
173
+ captureReads = value;
174
+ return value;
175
+ });
176
+ const exitObservation = running.exited.then((exit) => {
177
+ observedExit = exit;
178
+ return { kind: "exit" };
179
+ }, (cause) => {
180
+ beginFailure(new ProcessRuntimeError("stream", "process observation failed", { cause }), "observation");
181
+ return { kind: "failure" };
182
+ });
183
+ const failureObservation = failure.promise.then(() => ({ kind: "failure" }));
184
+ const firstObservation = await Promise.race([exitObservation, failureObservation]);
185
+ if (firstObservation.kind === "exit" && initiatingFailure === undefined) {
186
+ if (timer !== undefined)
187
+ clearTimeout(timer);
188
+ snapshot.signal?.removeEventListener("abort", onAbort);
189
+ }
190
+ const closeAndSettleCapture = async () => {
191
+ const initiallySettled = await wait(captures, PROCESS_CLEANUP_STEP_MS);
192
+ if (initiallySettled.status === "settled" &&
193
+ initiallySettled.value.every((capture) => capture.normalEof)) {
194
+ return;
195
+ }
196
+ const forcedAfterEofDeadline = initiallySettled.status === "timeout";
197
+ let closeSettlement;
198
+ const close = settleOperation(() => running.closeCapture()).then((settlement) => {
199
+ closeSettlement = settlement;
200
+ return settlement;
201
+ });
202
+ const settled = await wait(Promise.all([close, settleOperation(() => captures)]).then(() => true), PROCESS_CLEANUP_STEP_MS);
203
+ const closeFailure = closeSettlement !== undefined && closeSettlement.status === "rejected"
204
+ ? closeSettlement
205
+ : undefined;
206
+ if (settled.status === "timeout") {
207
+ throw closeFailure === undefined
208
+ ? new Error("native capture close or reader settlement remained open")
209
+ : closeFailure.reason;
210
+ }
211
+ if (closeFailure !== undefined) {
212
+ throw closeFailure.reason === undefined
213
+ ? withCause(new Error("native capture closure failed"), undefined)
214
+ : closeFailure.reason;
215
+ }
216
+ if (forcedAfterEofDeadline) {
217
+ throw new Error("capture EOF deadline elapsed");
218
+ }
219
+ };
220
+ let cleanupFailure;
221
+ const cleanupSettlement = await settleOperation(() => running.cleanup(initiatingFailure?.cause === "timeout"
222
+ ? "timeout"
223
+ : initiatingFailure?.cause === "cancellation"
224
+ ? "cancelled"
225
+ : firstObservation.kind === "exit"
226
+ ? "exited"
227
+ : "failed"));
228
+ const closeSettlement = await settleOperation(() => closeAndSettleCapture());
229
+ const failures = rejectedReasons([cleanupSettlement, closeSettlement]);
230
+ if (failures.length > 0) {
231
+ cleanupFailure = {
232
+ reason: failures.length === 1
233
+ ? failures[0]
234
+ : new AggregateError(failures, "cleanup and capture closure both failed"),
235
+ };
236
+ }
237
+ if (timer !== undefined)
238
+ clearTimeout(timer);
239
+ snapshot.signal?.removeEventListener("abort", onAbort);
240
+ await wait(exitObservation, PROCESS_CLEANUP_STEP_MS);
241
+ let decodeFailure;
242
+ let output = null;
243
+ let stdout = "";
244
+ let stderr = "";
245
+ if (captureReads !== undefined) {
246
+ try {
247
+ stdout = decodeCapture(captureReads[0].bytes, snapshot.strictUtf8, "stdout");
248
+ stderr = decodeCapture(captureReads[1].bytes, snapshot.strictUtf8, "stderr");
249
+ output = { stdout, stderr };
250
+ }
251
+ catch (cause) {
252
+ decodeFailure = new ProcessRuntimeError("invalid-output", "captured output was not valid UTF-8", { cause });
253
+ addLateFailureCode("invalid-output");
254
+ }
255
+ }
256
+ const outcome = classifyProcessOutcome({
257
+ initiatingFailure,
258
+ cleanupFailure,
259
+ decodeFailure,
260
+ lateFailureCodes,
261
+ observedExit,
262
+ completionRequestedBeforeExitObservation,
263
+ outputBounded,
264
+ output,
265
+ });
266
+ if (outcome.kind === "error") {
267
+ throw outcome.error;
268
+ }
269
+ const finalExit = observedExit;
270
+ if (finalExit === null) {
271
+ throw new ProcessRuntimeError("stream", "process exited without an observed result", {
272
+ facts: outcome.facts,
273
+ output,
274
+ });
275
+ }
276
+ return {
277
+ ...finalExit,
278
+ stdout,
279
+ stderr,
280
+ facts: outcome.facts,
281
+ };
282
+ },
283
+ };
284
+ };
285
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type { CompletionCause, Exit, Launch, ProcessAdapter, ProcessExecutor, ProcessRunResult, Request, RunningProcess, } from "./contract.js";
2
+ export { PROCESS_CAPTURE_LIMIT_BYTES, PROCESS_CLEANUP_STEP_MS, PROCESS_TIMEOUT_MAX_MS, } from "./contract.js";
3
+ export { ProcessRuntimeError, isProcessRuntimeError, processError, } from "./errors.js";
4
+ export type { ProcessCapturedOutput, ProcessErrorCode, ProcessInitiatingCause, ProcessRuntimeErrorOptions, ProcessRuntimeFacts, } from "./errors.js";
5
+ export { createProcessExecutor } from "./executor.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,IAAI,EACJ,MAAM,EACN,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,OAAO,EACP,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { PROCESS_CAPTURE_LIMIT_BYTES, PROCESS_CLEANUP_STEP_MS, PROCESS_TIMEOUT_MAX_MS, } from "./contract.js";
2
+ export { ProcessRuntimeError, isProcessRuntimeError, processError, } from "./errors.js";
3
+ export { createProcessExecutor } from "./executor.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,GACb,MAAM,aAAa,CAAC;AAQrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type CaptureRead = {
2
+ readonly bytes: Uint8Array;
3
+ readonly overflow: boolean;
4
+ readonly normalEof: boolean;
5
+ };
6
+ export declare const concatBytes: (chunks: readonly Uint8Array[], length: number) => Uint8Array;
7
+ export declare const decodeCapture: (bytes: Uint8Array, strictUtf8: boolean, streamName: "stdout" | "stderr") => string;
8
+ export declare const drainCapture: (stream: AsyncIterable<Uint8Array>, onProblem: (error: unknown) => void) => Promise<CaptureRead>;
9
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/internal/capture.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;AASF,eAAO,MAAM,WAAW,WAAY,SAAS,UAAU,EAAE,UAAU,MAAM,KAAG,UAQ3E,CAAC;AAEF,eAAO,MAAM,aAAa,UACjB,UAAU,cACL,OAAO,cACP,QAAQ,GAAG,QAAQ,KAC9B,MASF,CAAC;AAEF,eAAO,MAAM,YAAY,WACf,aAAa,CAAC,UAAU,CAAC,aACtB,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KAClC,OAAO,CAAC,WAAW,CA2BrB,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { PROCESS_CAPTURE_LIMIT_BYTES } from "../contract.js";
2
+ import { processError } from "../errors.js";
3
+ const copyChunk = (value) => {
4
+ if (!(value instanceof Uint8Array)) {
5
+ throw processError("stream", "capture stream yielded a non-byte chunk");
6
+ }
7
+ return new Uint8Array(value);
8
+ };
9
+ export const concatBytes = (chunks, length) => {
10
+ const result = new Uint8Array(length);
11
+ let offset = 0;
12
+ for (const chunk of chunks) {
13
+ result.set(chunk, offset);
14
+ offset += chunk.byteLength;
15
+ }
16
+ return result;
17
+ };
18
+ export const decodeCapture = (bytes, strictUtf8, streamName) => {
19
+ try {
20
+ return new TextDecoder("utf-8", {
21
+ fatal: strictUtf8,
22
+ ignoreBOM: true,
23
+ }).decode(bytes);
24
+ }
25
+ catch (cause) {
26
+ throw processError("invalid-output", `${streamName} is not valid UTF-8`, cause);
27
+ }
28
+ };
29
+ export const drainCapture = async (stream, onProblem) => {
30
+ const chunks = [];
31
+ let length = 0;
32
+ let overflow = false;
33
+ try {
34
+ for await (const value of stream) {
35
+ const chunk = copyChunk(value);
36
+ if (overflow) {
37
+ continue;
38
+ }
39
+ const remaining = PROCESS_CAPTURE_LIMIT_BYTES - length;
40
+ const accepted = chunk.byteLength <= remaining ? chunk : chunk.subarray(0, Math.max(0, remaining));
41
+ if (accepted.byteLength > 0) {
42
+ chunks.push(accepted);
43
+ length += accepted.byteLength;
44
+ }
45
+ if (chunk.byteLength > remaining) {
46
+ overflow = true;
47
+ onProblem(processError("output-limit", "captured output exceeded 4 MiB"));
48
+ }
49
+ }
50
+ }
51
+ catch (cause) {
52
+ // Preserve the stream-specific reason at the executor boundary.
53
+ onProblem(cause);
54
+ return { bytes: concatBytes(chunks, length), overflow, normalEof: false };
55
+ }
56
+ return { bytes: concatBytes(chunks, length), overflow, normalEof: true };
57
+ };
58
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/internal/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Exit } from "../contract.js";
2
+ import { ProcessRuntimeError, type ProcessCapturedOutput, type ProcessErrorCode, type ProcessInitiatingCause, type ProcessRuntimeFacts } from "../errors.js";
3
+ export type InitiatingFailure = {
4
+ readonly cause: ProcessInitiatingCause;
5
+ readonly code: ProcessErrorCode;
6
+ readonly error: ProcessRuntimeError;
7
+ };
8
+ export type ClassificationInput = {
9
+ readonly initiatingFailure?: InitiatingFailure | undefined;
10
+ readonly cleanupFailure?: {
11
+ readonly reason: unknown;
12
+ } | undefined;
13
+ readonly decodeFailure?: ProcessRuntimeError | undefined;
14
+ readonly lateFailureCodes: readonly ProcessErrorCode[];
15
+ readonly observedExit: Exit | null;
16
+ readonly completionRequestedBeforeExitObservation: boolean;
17
+ readonly outputBounded: boolean;
18
+ readonly output: ProcessCapturedOutput | null;
19
+ };
20
+ /**
21
+ * The fixed facts-outside classifier from plan v4 section 3.2. Cleanup/forced
22
+ * EOF closure wins; otherwise the first initiating failure wins; otherwise a
23
+ * normal observed exit is a result and strict decode failure is `invalid-output`.
24
+ */
25
+ export declare const classifyProcessOutcome: ({ initiatingFailure, cleanupFailure, decodeFailure, lateFailureCodes, observedExit, completionRequestedBeforeExitObservation, outputBounded, output, }: ClassificationInput) => {
26
+ readonly kind: "result";
27
+ readonly facts: ProcessRuntimeFacts;
28
+ } | {
29
+ readonly kind: "error";
30
+ readonly error: ProcessRuntimeError;
31
+ };
32
+ //# sourceMappingURL=classification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classification.d.ts","sourceRoot":"","sources":["../../src/internal/classification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,mBAAmB,EACnB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACzB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,cAAc,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,gBAAgB,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACvD,QAAQ,CAAC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,wCAAwC,EAAE,OAAO,CAAC;IAC3D,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC/C,CAAC;AAqBF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,2JAShC,mBAAmB,KAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;CAwDhE,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { ProcessRuntimeError, } from "../errors.js";
2
+ const facts = ({ initiatingFailure, lateFailureCodes, observedExit, completionRequestedBeforeExitObservation, outputBounded, incompleteCustody, }) => Object.freeze({
3
+ initiatingCause: initiatingFailure?.cause ?? (observedExit === null ? null : "exit"),
4
+ completionRequestedBeforeExitObservation,
5
+ observedExit,
6
+ lateFailureCodes: Object.freeze([...lateFailureCodes]),
7
+ outputBounded,
8
+ incompleteCustody,
9
+ });
10
+ /**
11
+ * The fixed facts-outside classifier from plan v4 section 3.2. Cleanup/forced
12
+ * EOF closure wins; otherwise the first initiating failure wins; otherwise a
13
+ * normal observed exit is a result and strict decode failure is `invalid-output`.
14
+ */
15
+ export const classifyProcessOutcome = ({ initiatingFailure, cleanupFailure, decodeFailure, lateFailureCodes, observedExit, completionRequestedBeforeExitObservation, outputBounded, output, }) => {
16
+ const shared = {
17
+ initiatingFailure,
18
+ lateFailureCodes,
19
+ observedExit,
20
+ completionRequestedBeforeExitObservation,
21
+ outputBounded,
22
+ };
23
+ if (cleanupFailure !== undefined) {
24
+ return {
25
+ kind: "error",
26
+ error: new ProcessRuntimeError("cleanup", "process cleanup did not complete", {
27
+ output,
28
+ cause: cleanupFailure.reason,
29
+ initiatingError: initiatingFailure?.error ?? null,
30
+ facts: facts({ ...shared, incompleteCustody: true }),
31
+ }),
32
+ };
33
+ }
34
+ if (initiatingFailure !== undefined) {
35
+ return {
36
+ kind: "error",
37
+ error: new ProcessRuntimeError(initiatingFailure.code, initiatingFailure.error.message, {
38
+ output,
39
+ cause: initiatingFailure.error.cause,
40
+ initiatingError: initiatingFailure.error,
41
+ facts: facts({ ...shared, incompleteCustody: false }),
42
+ }),
43
+ };
44
+ }
45
+ if (decodeFailure !== undefined) {
46
+ return {
47
+ kind: "error",
48
+ error: new ProcessRuntimeError("invalid-output", decodeFailure.message, {
49
+ output,
50
+ cause: decodeFailure.cause,
51
+ initiatingError: decodeFailure,
52
+ facts: {
53
+ ...facts({ ...shared, incompleteCustody: false }),
54
+ initiatingCause: "decode",
55
+ },
56
+ }),
57
+ };
58
+ }
59
+ return {
60
+ kind: "result",
61
+ facts: facts({ ...shared, incompleteCustody: false }),
62
+ };
63
+ };
64
+ //# sourceMappingURL=classification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classification.js","sourceRoot":"","sources":["../../src/internal/classification.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,GAKpB,MAAM,cAAc,CAAC;AAmBtB,MAAM,KAAK,GAAG,CAAC,EACb,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,wCAAwC,EACxC,aAAa,EACb,iBAAiB,GAGlB,EAAuB,EAAE,CACxB,MAAM,CAAC,MAAM,CAAC;IACZ,eAAe,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACpF,wCAAwC;IACxC,YAAY;IACZ,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACtD,aAAa;IACb,iBAAiB;CAClB,CAAC,CAAC;AAEL;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EACrC,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,wCAAwC,EACxC,aAAa,EACb,MAAM,GACc,EAE8C,EAAE;IACpE,MAAM,MAAM,GAAG;QACb,iBAAiB;QACjB,gBAAgB;QAChB,YAAY;QACZ,wCAAwC;QACxC,aAAa;KACd,CAAC;IAEF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,IAAI,mBAAmB,CAAC,SAAS,EAAE,kCAAkC,EAAE;gBAC5E,MAAM;gBACN,KAAK,EAAE,cAAc,CAAC,MAAM;gBAC5B,eAAe,EAAE,iBAAiB,EAAE,KAAK,IAAI,IAAI;gBACjD,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;aACrD,CAAC;SACH,CAAC;IACJ,CAAC;IAED,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,IAAI,mBAAmB,CAC5B,iBAAiB,CAAC,IAAI,EACtB,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAC/B;gBACE,MAAM;gBACN,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK;gBACpC,eAAe,EAAE,iBAAiB,CAAC,KAAK;gBACxC,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC;aACtD,CACF;SACF,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,IAAI,mBAAmB,CAAC,gBAAgB,EAAE,aAAa,CAAC,OAAO,EAAE;gBACtE,MAAM;gBACN,KAAK,EAAE,aAAa,CAAC,KAAK;gBAC1B,eAAe,EAAE,aAAa;gBAC9B,KAAK,EAAE;oBACL,GAAG,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC;oBACjD,eAAe,EAAE,QAAQ;iBAC1B;aACF,CAAC;SACH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Launch, Request } from "../contract.js";
2
+ export type RequestSnapshot = {
3
+ readonly launch: Launch;
4
+ readonly signal: AbortSignal | undefined;
5
+ readonly timeoutMs: number | undefined;
6
+ readonly strictUtf8: boolean;
7
+ };
8
+ export declare const snapshotRequest: (request: Request) => RequestSnapshot;
9
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/internal/input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAItD,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;AA4BF,eAAO,MAAM,eAAe,YAAa,OAAO,KAAG,eAuClD,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { PROCESS_TIMEOUT_MAX_MS } from "../contract.js";
2
+ import { processError } from "../errors.js";
3
+ const hasNul = (value) => value.includes("\u0000");
4
+ const validateString = (value, field) => {
5
+ if (typeof value !== "string" || value.length === 0 || hasNul(value)) {
6
+ throw processError("invalid-input", `${field} must be a non-empty string without NUL`);
7
+ }
8
+ return value;
9
+ };
10
+ const snapshotEnvironment = (value) => {
11
+ if (value === undefined) {
12
+ return undefined;
13
+ }
14
+ const entries = Object.entries(value);
15
+ const validated = [];
16
+ for (const [key, entryValue] of entries) {
17
+ if (typeof key !== "string" || typeof entryValue !== "string" || hasNul(key) || hasNul(entryValue)) {
18
+ throw processError("invalid-input", "environment entries must be strings without NUL");
19
+ }
20
+ validated.push([key, entryValue]);
21
+ }
22
+ return Object.freeze(Object.fromEntries(validated));
23
+ };
24
+ export const snapshotRequest = (request) => {
25
+ if (request === null || typeof request !== "object") {
26
+ throw processError("invalid-input", "request must be an object");
27
+ }
28
+ const command = validateString(request.command, "command");
29
+ if (!Array.isArray(request.args)) {
30
+ throw processError("invalid-input", "args must be an array");
31
+ }
32
+ const args = [];
33
+ for (let index = 0; index < request.args.length; index += 1) {
34
+ const arg = request.args[index];
35
+ if (typeof arg !== "string" || hasNul(arg)) {
36
+ throw processError("invalid-input", `args[${index}] must be a string without NUL`);
37
+ }
38
+ args.push(arg);
39
+ }
40
+ const cwd = validateString(request.cwd, "cwd");
41
+ const environment = snapshotEnvironment(request.environment);
42
+ const timeoutMs = request.timeoutMs;
43
+ if (timeoutMs !== undefined &&
44
+ (!Number.isInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > PROCESS_TIMEOUT_MAX_MS)) {
45
+ throw processError("invalid-input", "timeoutMs must be an integer in 1..2147483647");
46
+ }
47
+ if (request.strictUtf8 !== undefined && typeof request.strictUtf8 !== "boolean") {
48
+ throw processError("invalid-input", "strictUtf8 must be a boolean");
49
+ }
50
+ return Object.freeze({
51
+ launch: Object.freeze({
52
+ command,
53
+ args: Object.freeze(args),
54
+ cwd,
55
+ ...(environment === undefined ? {} : { environment }),
56
+ }),
57
+ signal: request.signal,
58
+ timeoutMs,
59
+ strictUtf8: request.strictUtf8 ?? false,
60
+ });
61
+ };
62
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/internal/input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type Settlement<T> = {
2
+ readonly status: "fulfilled";
3
+ readonly value: T;
4
+ } | {
5
+ readonly status: "rejected";
6
+ readonly reason: unknown;
7
+ };
8
+ export type BoundedSettlement<T> = Settlement<T> | {
9
+ readonly status: "timeout";
10
+ };
11
+ export declare const settleOperation: <T>(operation: () => T | PromiseLike<T>) => Promise<Settlement<Awaited<T>>>;
12
+ export declare const settleWithin: <T>(operation: () => T | PromiseLike<T>, timeoutMs: number) => Promise<BoundedSettlement<Awaited<T>>>;
13
+ export declare const rejectedReasons: (settlements: readonly Settlement<unknown>[]) => unknown[];
14
+ export declare const withCause: <T extends object>(error: T, cause: unknown) => T;
15
+ //# sourceMappingURL=settlement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settlement.d.ts","sourceRoot":"","sources":["../../src/internal/settlement.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,CAAC,CAAC,IACpB;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAC3B,UAAU,CAAC,CAAC,CAAC,GACb;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAEnC,eAAO,MAAM,eAAe,GAAU,CAAC,aAC1B,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,KAClC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAMhC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAU,CAAC,aACvB,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,aACxB,MAAM,KAChB,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAmBvC,CAAC;AAEF,eAAO,MAAM,eAAe,gBACb,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,KAC1C,OAAO,EAGP,CAAC;AAEJ,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,SAAS,CAAC,SAAS,OAAO,KAAG,CAOtE,CAAC"}