@openpond/evals 0.7.3 → 0.7.5

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.
@@ -0,0 +1,73 @@
1
+ import { spawn } from "node:child_process";
2
+ import { javascriptIsolateProcessSource } from "./javascript-isolate-process-source.js";
3
+ import { validateJavaScriptIsolateInput } from "./javascript-isolate.js";
4
+ import { assertBoundedTaskJson } from "./task-schema.js";
5
+ /** A Node subprocess owns the interpreter; completion always waits for its exit. */
6
+ export async function executeJavaScriptIsolateInProcess(input) {
7
+ input.signal?.throwIfAborted();
8
+ validateJavaScriptIsolateInput(input);
9
+ const { signal, ...data } = input;
10
+ const error = (suffix) => new Error(`${input.errorPrefix}_${suffix}`);
11
+ // The authored source remains JSON data passed to QuickJS, never host code.
12
+ const program = `globalThis.__openpondIsolateInput = JSON.parse(${JSON.stringify(JSON.stringify(data))});\n${javascriptIsolateProcessSource}`;
13
+ return new Promise((resolve, reject) => {
14
+ const child = spawn("node", ["--max-old-space-size=64", "--input-type=commonjs", "-"], {
15
+ stdio: ["pipe", "pipe", "pipe"],
16
+ env: { PATH: process.env.PATH },
17
+ windowsHide: true,
18
+ });
19
+ let failure;
20
+ let response = "";
21
+ let responseBytes = 0;
22
+ let stderrBytes = 0;
23
+ const stop = (cause) => {
24
+ failure ??= cause;
25
+ child.kill("SIGKILL");
26
+ };
27
+ const cancel = () => stop(signal?.reason instanceof Error ? signal.reason : error("cancelled"));
28
+ const timer = setTimeout(() => stop(error("timeout")), input.timeoutMs);
29
+ signal?.addEventListener("abort", cancel, { once: true });
30
+ child.stdout.setEncoding("utf8");
31
+ child.stdout.on("data", (chunk) => {
32
+ responseBytes += Buffer.byteLength(chunk);
33
+ if (responseBytes > input.maxResultBytes + 65_536)
34
+ stop(error("process_response_too_large"));
35
+ else
36
+ response += chunk;
37
+ });
38
+ child.stderr.on("data", (chunk) => {
39
+ stderrBytes += chunk.byteLength;
40
+ if (stderrBytes > 65_536)
41
+ stop(error("process_stderr_too_large"));
42
+ });
43
+ child.once("error", (cause) => { failure ??= cause; });
44
+ child.stdin.on("error", (cause) => stop(cause));
45
+ child.once("close", (code) => {
46
+ clearTimeout(timer);
47
+ signal?.removeEventListener("abort", cancel);
48
+ if (failure) {
49
+ reject(failure);
50
+ return;
51
+ }
52
+ try {
53
+ if (code !== 0)
54
+ throw error("process_exited_without_result");
55
+ const message = JSON.parse(response);
56
+ if (!message || typeof message !== "object" || !("ok" in message))
57
+ throw error("process_invalid_response");
58
+ if (message.ok !== true)
59
+ throw new Error("error" in message && typeof message.error === "string" ? message.error : `${input.errorPrefix}_execution_failed`);
60
+ if (!("result" in message))
61
+ throw error("process_invalid_response");
62
+ assertBoundedTaskJson(message.result, input.maxResultBytes);
63
+ resolve(message.result);
64
+ }
65
+ catch (cause) {
66
+ reject(cause instanceof Error ? cause : error("process_invalid_response"));
67
+ }
68
+ });
69
+ child.stdin.end(program);
70
+ if (signal?.aborted)
71
+ cancel();
72
+ });
73
+ }
@@ -1,6 +1,11 @@
1
1
  import { JavaScriptVerifierResultSchema } from "./javascript-verifier-contract.js";
2
2
  import { executeJavaScriptIsolateInWorker } from "./javascript-isolate-node.js";
3
+ import { executeJavaScriptIsolateInProcess } from "./javascript-isolate-process.js";
3
4
  /** Resolves/rejects only after the execution owner has stopped the worker. */
4
5
  export async function executeJavaScriptVerifierInWorker(input) {
5
6
  return JavaScriptVerifierResultSchema.parse(await executeJavaScriptIsolateInWorker({ ...input, exportName: input.exportName ?? "verify", maxResultBytes: 65_536, errorPrefix: "verifier" }));
6
7
  }
8
+ /** Uses a Node child process and waits for exit on success, failure, or cancellation. */
9
+ export async function executeJavaScriptVerifierInProcess(input) {
10
+ return JavaScriptVerifierResultSchema.parse(await executeJavaScriptIsolateInProcess({ ...input, exportName: input.exportName ?? "verify", maxResultBytes: 65_536, errorPrefix: "verifier" }));
11
+ }
@@ -2,4 +2,6 @@ import type { JavaScriptEnvironmentExecutionInput } from "./javascript-environme
2
2
  import { type JavaScriptEnvironmentResult } from "./javascript-environment-contract.js";
3
3
  /** The execution owner awaits termination before recording a step or cleanup. */
4
4
  export declare function executeJavaScriptEnvironmentInWorker(input: JavaScriptEnvironmentExecutionInput): Promise<JavaScriptEnvironmentResult>;
5
+ /** Uses a Node child process independently of the execution owner's runtime. */
6
+ export declare function executeJavaScriptEnvironmentInProcess(input: JavaScriptEnvironmentExecutionInput): Promise<JavaScriptEnvironmentResult>;
5
7
  //# sourceMappingURL=javascript-environment-node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"javascript-environment-node.d.ts","sourceRoot":"","sources":["../../../../src/javascript-environment-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAA2E,KAAK,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAGjK,iFAAiF;AACjF,wBAAsB,oCAAoC,CAAC,KAAK,EAAE,mCAAmC,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAG3I"}
1
+ {"version":3,"file":"javascript-environment-node.d.ts","sourceRoot":"","sources":["../../../../src/javascript-environment-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAA2E,KAAK,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAIjK,iFAAiF;AACjF,wBAAsB,oCAAoC,CAAC,KAAK,EAAE,mCAAmC,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAG3I;AAED,gFAAgF;AAChF,wBAAsB,qCAAqC,CAAC,KAAK,EAAE,mCAAmC,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAG5I"}
@@ -1 +1 @@
1
- {"version":3,"file":"javascript-environment.d.ts","sourceRoot":"","sources":["../../../../src/javascript-environment.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGvF,OAAO,EAAkH,KAAK,+BAA+B,EAAE,KAAK,8BAA8B,EAAE,KAAK,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnR,cAAc,sCAAsC,CAAC;AAErD,MAAM,WAAW,mCAAmC;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,8BAA8B,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,qFAAqF;AACrF,wBAAsB,4BAA4B,CAAC,KAAK,EAAE,mCAAmC,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAGnI;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,8BAA8B,CAAC;IAC1C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,0BAA0B,EAAE,CAAC;CACtC;AAED,qBAAa,gCAAiC,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,mBAAmB,GAAG,uBAAuB;gBAApE,IAAI,EAAE,cAAc,GAAG,mBAAmB,GAAG,uBAAuB;CAI1F;AAED,KAAK,MAAM,GAAG,CAAC,KAAK,EAAE,mCAAmC,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAEnG;uFACuF;AACvF,wBAAsB,kCAAkC,CAAC,KAAK,EAAE;IAC9D,UAAU,EAAE,+BAA+B,CAAC;IAC5C,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0EwB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE;;;oBAtG/D;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE;mBACtD,MAAM;cACX,MAAM;0BACM,MAAM;wBACR,MAAM;eACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBACtB,0BAA0B,EAAE;;oBAyFb,6BAA6B;mBAlB1B,OAAO,CAAC,IAAI,CAAC;GAqCxC"}
1
+ {"version":3,"file":"javascript-environment.d.ts","sourceRoot":"","sources":["../../../../src/javascript-environment.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGvF,OAAO,EAAkH,KAAK,+BAA+B,EAAE,KAAK,8BAA8B,EAAE,KAAK,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnR,cAAc,sCAAsC,CAAC;AAErD,MAAM,WAAW,mCAAmC;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,8BAA8B,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,qFAAqF;AACrF,wBAAsB,4BAA4B,CAAC,KAAK,EAAE,mCAAmC,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAGnI;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,8BAA8B,CAAC;IAC1C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,0BAA0B,EAAE,CAAC;CACtC;AAED,qBAAa,gCAAiC,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,mBAAmB,GAAG,uBAAuB;gBAApE,IAAI,EAAE,cAAc,GAAG,mBAAmB,GAAG,uBAAuB;CAI1F;AAED,KAAK,MAAM,GAAG,CAAC,KAAK,EAAE,mCAAmC,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAEnG;uFACuF;AACvF,wBAAsB,kCAAkC,CAAC,KAAK,EAAE;IAC9D,UAAU,EAAE,+BAA+B,CAAC;IAC5C,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4EwB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE;;;oBAxG/D;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE;mBACtD,MAAM;cACX,MAAM;0BACM,MAAM;wBACR,MAAM;eACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBACtB,0BAA0B,EAAE;;oBA2Fb,6BAA6B;mBApB1B,OAAO,CAAC,IAAI,CAAC;GAuCxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=javascript-isolate-process-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-isolate-process-entry.d.ts","sourceRoot":"","sources":["../../../../src/javascript-isolate-process-entry.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ /** Generated by the Evals build: trusted process host plus the embedded interpreter. */
2
+ export declare const javascriptIsolateProcessSource: string;
@@ -0,0 +1,4 @@
1
+ import { type JavaScriptIsolateInput } from "./javascript-isolate.js";
2
+ /** A Node subprocess owns the interpreter; completion always waits for its exit. */
3
+ export declare function executeJavaScriptIsolateInProcess(input: JavaScriptIsolateInput): Promise<unknown>;
4
+ //# sourceMappingURL=javascript-isolate-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-isolate-process.d.ts","sourceRoot":"","sources":["../../../../src/javascript-isolate-process.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkC,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGtG,oFAAoF;AACpF,wBAAsB,iCAAiC,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqDvG"}
@@ -2,4 +2,6 @@ import type { executeJavaScriptVerifier } from "./javascript-verifier.js";
2
2
  import { type JavaScriptVerifierResult } from "./javascript-verifier-contract.js";
3
3
  /** Resolves/rejects only after the execution owner has stopped the worker. */
4
4
  export declare function executeJavaScriptVerifierInWorker(input: Parameters<typeof executeJavaScriptVerifier>[0]): Promise<JavaScriptVerifierResult>;
5
+ /** Uses a Node child process and waits for exit on success, failure, or cancellation. */
6
+ export declare function executeJavaScriptVerifierInProcess(input: Parameters<typeof executeJavaScriptVerifier>[0]): Promise<JavaScriptVerifierResult>;
5
7
  //# sourceMappingURL=javascript-verifier-node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"javascript-verifier-node.d.ts","sourceRoot":"","sources":["../../../../src/javascript-verifier-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAkC,KAAK,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAGlH,8EAA8E;AAC9E,wBAAsB,iCAAiC,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAEjJ"}
1
+ {"version":3,"file":"javascript-verifier-node.d.ts","sourceRoot":"","sources":["../../../../src/javascript-verifier-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAkC,KAAK,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAIlH,8EAA8E;AAC9E,wBAAsB,iCAAiC,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAEjJ;AAED,yFAAyF;AACzF,wBAAsB,kCAAkC,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAElJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openpond/evals",
3
- "version": "0.7.3",
3
+ "version": "0.7.5",
4
4
  "description": "Portable Tasksets, graders, evaluation runs, receipts, conformance fixtures, and Work evidence for OpenPond Harnesses",
5
5
  "license": "MIT",
6
6
  "type": "module",