@executor-js/runtime-quickjs 0.0.1 → 0.0.2

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 CHANGED
@@ -1,13 +1,13 @@
1
- # @executor/runtime-quickjs
1
+ # @executor-js/runtime-quickjs
2
2
 
3
- [QuickJS](https://github.com/justjake/quickjs-emscripten) sandbox runtime for `@executor/execution`. Runs untrusted TypeScript/JavaScript in a WASM-backed interpreter with configurable timeout, memory limit, and stack size — safe enough to execute LLM-generated code that calls your registered tools.
3
+ [QuickJS](https://github.com/justjake/quickjs-emscripten) sandbox runtime for `@executor-js/execution`. Runs untrusted TypeScript/JavaScript in a WASM-backed interpreter with configurable timeout, memory limit, and stack size — safe enough to execute LLM-generated code that calls your registered tools.
4
4
 
5
5
  ## Install
6
6
 
7
7
  ```sh
8
- bun add @executor/execution @executor/runtime-quickjs
8
+ bun add @executor-js/execution @executor-js/runtime-quickjs
9
9
  # or
10
- npm install @executor/execution @executor/runtime-quickjs
10
+ npm install @executor-js/execution @executor-js/runtime-quickjs
11
11
  ```
12
12
 
13
13
  ## Usage
@@ -15,11 +15,11 @@ npm install @executor/execution @executor/runtime-quickjs
15
15
  Pass a `makeQuickJsExecutor()` as the `codeExecutor` when building the execution engine:
16
16
 
17
17
  ```ts
18
- import { createExecutor } from "@executor/sdk";
19
- import { createExecutionEngine } from "@executor/execution";
20
- import { makeQuickJsExecutor } from "@executor/runtime-quickjs";
18
+ import { createExecutor } from "@executor-js/sdk";
19
+ import { createExecutionEngine } from "@executor-js/execution";
20
+ import { makeQuickJsExecutor } from "@executor-js/runtime-quickjs";
21
21
 
22
- const executor = await createExecutor({ scope: { name: "my-app" } });
22
+ const executor = await createExecutor({ onElicitation: "accept-all" });
23
23
 
24
24
  const engine = createExecutionEngine({
25
25
  executor,
@@ -42,14 +42,13 @@ const engine = createExecutionEngine({
42
42
  ### Swapping the QuickJS build
43
43
 
44
44
  ```ts
45
- import { setQuickJSModule } from "@executor/runtime-quickjs";
46
- import { newQuickJSAsyncWASMModuleFromVariant } from "quickjs-emscripten";
47
- import variant from "@jitl/quickjs-ng-wasmfile-release-sync";
45
+ import { setQuickJSModule } from "@executor-js/runtime-quickjs";
46
+ import { newQuickJSWASMModule } from "quickjs-emscripten";
48
47
 
49
- setQuickJSModule(await newQuickJSAsyncWASMModuleFromVariant(variant));
48
+ setQuickJSModule(await newQuickJSWASMModule());
50
49
  ```
51
50
 
52
- Use this when you want a different WASM variant (e.g. debug builds, QuickJS-NG) than the default bundled one.
51
+ Use this when you want a different WASM variant (e.g. debug builds, QuickJS-NG) than the default bundled one. `newQuickJSWASMModule()` defaults to the release-sync variant; pass a different `@jitl/quickjs-*` variant to swap it.
53
52
 
54
53
  ## Status
55
54
 
package/dist/index.d.ts CHANGED
@@ -6,5 +6,13 @@ export type QuickJsExecutorOptions = {
6
6
  maxStackSizeBytes?: number;
7
7
  };
8
8
  export declare const setQuickJSModule: (mod: QuickJSWASMModule) => void;
9
- export declare const makeQuickJsExecutor: (options?: QuickJsExecutorOptions) => CodeExecutor;
9
+ declare const QuickJsExecutionError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
10
+ readonly _tag: "QuickJsExecutionError";
11
+ } & Readonly<A>;
12
+ declare class QuickJsExecutionError extends QuickJsExecutionError_base<{
13
+ readonly message: string;
14
+ }> {
15
+ }
16
+ export declare const makeQuickJsExecutor: (options?: QuickJsExecutorOptions) => CodeExecutor<QuickJsExecutionError>;
17
+ export {};
10
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAGlB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAKF,eAAO,MAAM,gBAAgB,GAAI,KAAK,iBAAiB,SAEtD,CAAC;AA6WF,eAAO,MAAM,mBAAmB,GAAI,UAAS,sBAA2B,KAAG,YAGzE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAGlB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAKF,eAAO,MAAM,gBAAgB,GAAI,KAAK,iBAAiB,SAEtD,CAAC;;;;AAKF,cAAM,qBAAsB,SAAQ,2BAA0C;IAC5E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAmXL,eAAO,MAAM,mBAAmB,GAC9B,UAAS,sBAA2B,KACnC,YAAY,CAAC,qBAAqB,CAGnC,CAAC"}
package/dist/index.js CHANGED
@@ -20,14 +20,14 @@ var EXECUTION_FILENAME = "executor-quickjs-runtime.js";
20
20
  var toError = (cause) => cause instanceof Error ? cause : new Error(String(cause));
21
21
  var toErrorMessage = (cause) => {
22
22
  if (typeof cause === "object" && cause !== null) {
23
- const stack = "stack" in cause && typeof cause.stack === "string" ? cause.stack : void 0;
24
23
  const message = "message" in cause && typeof cause.message === "string" ? cause.message : void 0;
25
- if (stack) {
26
- return stack;
27
- }
28
24
  if (message) {
29
25
  return message;
30
26
  }
27
+ const stack = "stack" in cause && typeof cause.stack === "string" ? cause.stack : void 0;
28
+ if (stack) {
29
+ return stack;
30
+ }
31
31
  }
32
32
  const error = toError(cause);
33
33
  return error.stack ?? error.message;
@@ -96,34 +96,34 @@ var buildExecutionSource = (code) => {
96
96
  "})()"
97
97
  ].join("\n");
98
98
  };
99
- var readPropDump = (context, handle, key) => {
100
- const prop = context.getProp(handle, key);
99
+ var readPropDump = (context2, handle, key) => {
100
+ const prop = context2.getProp(handle, key);
101
101
  try {
102
- return context.dump(prop);
102
+ return context2.dump(prop);
103
103
  } finally {
104
104
  prop.dispose();
105
105
  }
106
106
  };
107
- var readResultState = (context, handle) => ({
108
- settled: readPropDump(context, handle, "settled") === true,
109
- value: readPropDump(context, handle, "v"),
110
- error: readPropDump(context, handle, "e")
107
+ var readResultState = (context2, handle) => ({
108
+ settled: readPropDump(context2, handle, "settled") === true,
109
+ value: readPropDump(context2, handle, "v"),
110
+ error: readPropDump(context2, handle, "e")
111
111
  });
112
- var createLogBridge = (context, logs) => context.newFunction("__executor_log", (levelHandle, lineHandle) => {
113
- const level = context.getString(levelHandle);
114
- const line = context.getString(lineHandle);
112
+ var createLogBridge = (context2, logs) => context2.newFunction("__executor_log", (levelHandle, lineHandle) => {
113
+ const level = context2.getString(levelHandle);
114
+ const line = context2.getString(lineHandle);
115
115
  logs.push(`[${level}] ${line}`);
116
- return context.undefined;
116
+ return context2.undefined;
117
117
  });
118
- var createToolBridge = (context, toolInvoker, pendingDeferreds) => context.newFunction("__executor_invokeTool", (pathHandle, argsHandle) => {
119
- const path = context.getString(pathHandle);
120
- const args = argsHandle === void 0 || context.typeof(argsHandle) === "undefined" ? void 0 : context.dump(argsHandle);
121
- const deferred = context.newPromise();
118
+ var createToolBridge = (context2, toolInvoker, pendingDeferreds, runPromise) => context2.newFunction("__executor_invokeTool", (pathHandle, argsHandle) => {
119
+ const path = context2.getString(pathHandle);
120
+ const args = argsHandle === void 0 || context2.typeof(argsHandle) === "undefined" ? void 0 : context2.dump(argsHandle);
121
+ const deferred = context2.newPromise();
122
122
  pendingDeferreds.add(deferred);
123
123
  deferred.settled.finally(() => {
124
124
  pendingDeferreds.delete(deferred);
125
125
  });
126
- void Effect.runPromise(toolInvoker.invoke({ path, args })).then(
126
+ void runPromise(toolInvoker.invoke({ path, args })).then(
127
127
  (value) => {
128
128
  if (!deferred.alive) {
129
129
  return;
@@ -133,7 +133,7 @@ var createToolBridge = (context, toolInvoker, pendingDeferreds) => context.newFu
133
133
  deferred.resolve();
134
134
  return;
135
135
  }
136
- const valueHandle = context.newString(serialized);
136
+ const valueHandle = context2.newString(serialized);
137
137
  deferred.resolve(valueHandle);
138
138
  valueHandle.dispose();
139
139
  },
@@ -141,21 +141,21 @@ var createToolBridge = (context, toolInvoker, pendingDeferreds) => context.newFu
141
141
  if (!deferred.alive) {
142
142
  return;
143
143
  }
144
- const errorHandle = context.newError(toErrorMessage(cause));
144
+ const errorHandle = context2.newError(toErrorMessage(cause));
145
145
  deferred.reject(errorHandle);
146
146
  errorHandle.dispose();
147
147
  }
148
148
  );
149
149
  return deferred.handle;
150
150
  });
151
- var drainJobs = (context, runtime, deadlineMs, timeoutMs) => {
151
+ var drainJobs = (context2, runtime, deadlineMs, timeoutMs) => {
152
152
  while (runtime.hasPendingJob()) {
153
153
  if (Date.now() >= deadlineMs) {
154
154
  throw new Error(timeoutMessage(timeoutMs));
155
155
  }
156
156
  const pending = runtime.executePendingJobs();
157
157
  if (pending.error) {
158
- const error = context.dump(pending.error);
158
+ const error = context2.dump(pending.error);
159
159
  pending.error.dispose();
160
160
  throw toError(error);
161
161
  }
@@ -180,15 +180,15 @@ var waitForDeferreds = async (pendingDeferreds, deadlineMs, timeoutMs) => {
180
180
  }
181
181
  }
182
182
  };
183
- var drainAsync = async (context, runtime, pendingDeferreds, deadlineMs, timeoutMs) => {
184
- drainJobs(context, runtime, deadlineMs, timeoutMs);
183
+ var drainAsync = async (context2, runtime, pendingDeferreds, deadlineMs, timeoutMs) => {
184
+ drainJobs(context2, runtime, deadlineMs, timeoutMs);
185
185
  while (pendingDeferreds.size > 0) {
186
186
  await waitForDeferreds(pendingDeferreds, deadlineMs, timeoutMs);
187
- drainJobs(context, runtime, deadlineMs, timeoutMs);
187
+ drainJobs(context2, runtime, deadlineMs, timeoutMs);
188
188
  }
189
- drainJobs(context, runtime, deadlineMs, timeoutMs);
189
+ drainJobs(context2, runtime, deadlineMs, timeoutMs);
190
190
  };
191
- var evaluateInQuickJs = async (options, code, toolInvoker) => {
191
+ var evaluateInQuickJs = async (options, code, toolInvoker, runPromise) => {
192
192
  const timeoutMs = Math.max(100, options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
193
193
  const deadlineMs = Date.now() + timeoutMs;
194
194
  const logs = [];
@@ -203,17 +203,17 @@ var evaluateInQuickJs = async (options, code, toolInvoker) => {
203
203
  runtime.setMaxStackSize(options.maxStackSizeBytes);
204
204
  }
205
205
  runtime.setInterruptHandler(shouldInterruptAfterDeadline(deadlineMs));
206
- const context = runtime.newContext();
206
+ const context2 = runtime.newContext();
207
207
  try {
208
- const logBridge = createLogBridge(context, logs);
209
- context.setProp(context.global, "__executor_log", logBridge);
208
+ const logBridge = createLogBridge(context2, logs);
209
+ context2.setProp(context2.global, "__executor_log", logBridge);
210
210
  logBridge.dispose();
211
- const toolBridge = createToolBridge(context, toolInvoker, pendingDeferreds);
212
- context.setProp(context.global, "__executor_invokeTool", toolBridge);
211
+ const toolBridge = createToolBridge(context2, toolInvoker, pendingDeferreds, runPromise);
212
+ context2.setProp(context2.global, "__executor_invokeTool", toolBridge);
213
213
  toolBridge.dispose();
214
- const evaluated = context.evalCode(buildExecutionSource(code), EXECUTION_FILENAME);
214
+ const evaluated = context2.evalCode(buildExecutionSource(code), EXECUTION_FILENAME);
215
215
  if (evaluated.error) {
216
- const error = context.dump(evaluated.error);
216
+ const error = context2.dump(evaluated.error);
217
217
  evaluated.error.dispose();
218
218
  return {
219
219
  result: null,
@@ -221,13 +221,13 @@ var evaluateInQuickJs = async (options, code, toolInvoker) => {
221
221
  logs
222
222
  };
223
223
  }
224
- context.setProp(context.global, "__executor_result", evaluated.value);
224
+ context2.setProp(context2.global, "__executor_result", evaluated.value);
225
225
  evaluated.value.dispose();
226
- const stateResult = context.evalCode(
226
+ const stateResult = context2.evalCode(
227
227
  "(function(p){ var s = { v: void 0, e: void 0, settled: false }; var formatError = function(e){ if (e && typeof e === 'object') { var message = typeof e.message === 'string' ? e.message : ''; var stack = typeof e.stack === 'string' ? e.stack : ''; if (message && stack) { return stack.indexOf(message) === -1 ? message + '\\n' + stack : stack; } if (message) return message; if (stack) return stack; } return String(e); }; p.then(function(v){ s.v = v; s.settled = true; }, function(e){ s.e = formatError(e); s.settled = true; }); return s; })(__executor_result)"
228
228
  );
229
229
  if (stateResult.error) {
230
- const error = context.dump(stateResult.error);
230
+ const error = context2.dump(stateResult.error);
231
231
  stateResult.error.dispose();
232
232
  return {
233
233
  result: null,
@@ -237,8 +237,8 @@ var evaluateInQuickJs = async (options, code, toolInvoker) => {
237
237
  }
238
238
  const stateHandle = stateResult.value;
239
239
  try {
240
- await drainAsync(context, runtime, pendingDeferreds, deadlineMs, timeoutMs);
241
- const state = readResultState(context, stateHandle);
240
+ await drainAsync(context2, runtime, pendingDeferreds, deadlineMs, timeoutMs);
241
+ const state = readResultState(context2, stateHandle);
242
242
  if (!state.settled) {
243
243
  return {
244
244
  result: null,
@@ -267,7 +267,7 @@ var evaluateInQuickJs = async (options, code, toolInvoker) => {
267
267
  }
268
268
  }
269
269
  pendingDeferreds.clear();
270
- context.dispose();
270
+ context2.dispose();
271
271
  }
272
272
  } catch (cause) {
273
273
  return {
@@ -279,10 +279,18 @@ var evaluateInQuickJs = async (options, code, toolInvoker) => {
279
279
  runtime.dispose();
280
280
  }
281
281
  };
282
- var runInQuickJs = (options, code, toolInvoker) => Effect.tryPromise({
283
- try: () => evaluateInQuickJs(options, code, toolInvoker),
284
- catch: (cause) => new QuickJsExecutionError({ message: String(cause) })
285
- });
282
+ var runInQuickJs = (options, code, toolInvoker) => Effect.gen(function* () {
283
+ const context2 = yield* Effect.context();
284
+ const runPromise = Effect.runPromiseWith(context2);
285
+ return yield* Effect.tryPromise({
286
+ try: () => evaluateInQuickJs(options, code, toolInvoker, runPromise),
287
+ catch: (cause) => new QuickJsExecutionError({ message: String(cause) })
288
+ });
289
+ }).pipe(
290
+ Effect.withSpan("executor.code.exec.quickjs", {
291
+ attributes: { "executor.runtime": "quickjs" }
292
+ })
293
+ );
286
294
  var makeQuickJsExecutor = (options = {}) => ({
287
295
  execute: (code, toolInvoker) => runInQuickJs(options, code, toolInvoker)
288
296
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n recoverExecutionBody,\n type CodeExecutor,\n type ExecuteResult,\n type SandboxToolInvoker,\n} from \"@executor/codemode-core\";\nimport * as Data from \"effect/Data\";\nimport * as Effect from \"effect/Effect\";\nimport {\n getQuickJS,\n shouldInterruptAfterDeadline,\n type QuickJSContext,\n type QuickJSDeferredPromise,\n type QuickJSHandle,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from \"quickjs-emscripten\";\n\nexport type QuickJsExecutorOptions = {\n timeoutMs?: number;\n memoryLimitBytes?: number;\n maxStackSizeBytes?: number;\n};\n\n// Allow pre-loading a QuickJS module (e.g. with custom WASM bytes for compiled binaries)\nlet preloadedModule: QuickJSWASMModule | null = null;\n\nexport const setQuickJSModule = (mod: QuickJSWASMModule) => {\n preloadedModule = mod;\n};\n\nconst resolveQuickJS = (): Promise<QuickJSWASMModule> =>\n preloadedModule ? Promise.resolve(preloadedModule) : getQuickJS();\n\nclass QuickJsExecutionError extends Data.TaggedError(\"QuickJsExecutionError\")<{\n readonly message: string;\n}> {}\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60_000;\nconst EXECUTION_FILENAME = \"executor-quickjs-runtime.js\";\n\nconst toError = (cause: unknown): Error =>\n cause instanceof Error ? cause : new Error(String(cause));\n\nconst toErrorMessage = (cause: unknown): string => {\n if (typeof cause === \"object\" && cause !== null) {\n const stack = \"stack\" in cause && typeof cause.stack === \"string\" ? cause.stack : undefined;\n const message =\n \"message\" in cause && typeof cause.message === \"string\" ? cause.message : undefined;\n\n if (stack) {\n return stack;\n }\n\n if (message) {\n return message;\n }\n }\n\n const error = toError(cause);\n return error.stack ?? error.message;\n};\n\nconst serializeJson = (value: unknown, label: string): string | undefined => {\n if (typeof value === \"undefined\") {\n return undefined;\n }\n\n try {\n return JSON.stringify(value);\n } catch (cause) {\n throw new Error(`${label} is not JSON serializable: ${toError(cause).message}`);\n }\n};\n\nconst looksLikeInterruptedError = (message: string): boolean => /\\binterrupted\\b/i.test(message);\n\nconst timeoutMessage = (timeoutMs: number): string =>\n `QuickJS execution timed out after ${timeoutMs}ms`;\n\nconst normalizeExecutionError = (cause: unknown, deadlineMs: number, timeoutMs: number): string => {\n const message = toErrorMessage(cause);\n return Date.now() >= deadlineMs && looksLikeInterruptedError(message)\n ? timeoutMessage(timeoutMs)\n : message;\n};\n\nconst buildExecutionSource = (code: string): string => {\n const body = recoverExecutionBody(code);\n\n return [\n '\"use strict\";',\n \"const __invokeTool = __executor_invokeTool;\",\n \"const __log = __executor_log;\",\n \"try { delete globalThis.__executor_invokeTool; } catch {}\",\n \"try { delete globalThis.__executor_log; } catch {}\",\n \"const __formatLogArg = (value) => {\",\n \" if (typeof value === 'string') return value;\",\n \" try {\",\n \" return JSON.stringify(value);\",\n \" } catch {\",\n \" return String(value);\",\n \" }\",\n \"};\",\n \"const __formatLogLine = (args) => args.map(__formatLogArg).join(' ');\",\n \"const __makeToolsProxy = (path = []) => new Proxy(() => undefined, {\",\n \" get(_target, prop) {\",\n \" if (prop === 'then' || typeof prop === 'symbol') {\",\n \" return undefined;\",\n \" }\",\n \" return __makeToolsProxy([...path, String(prop)]);\",\n \" },\",\n \" apply(_target, _thisArg, args) {\",\n \" const toolPath = path.join('.');\",\n \" if (!toolPath) {\",\n \" throw new Error('Tool path missing in invocation');\",\n \" }\",\n \" return Promise.resolve(__invokeTool(toolPath, args[0])).then((raw) => raw === undefined ? undefined : JSON.parse(raw));\",\n \" },\",\n \"});\",\n \"const tools = __makeToolsProxy();\",\n \"const console = {\",\n \" log: (...args) => __log('log', __formatLogLine(args)),\",\n \" warn: (...args) => __log('warn', __formatLogLine(args)),\",\n \" error: (...args) => __log('error', __formatLogLine(args)),\",\n \" info: (...args) => __log('info', __formatLogLine(args)),\",\n \" debug: (...args) => __log('debug', __formatLogLine(args)),\",\n \"};\",\n \"const fetch = (..._args) => {\",\n \" throw new Error('fetch is disabled in QuickJS executor');\",\n \"};\",\n \"(async () => {\",\n body,\n \"})()\",\n ].join(\"\\n\");\n};\n\nconst readPropDump = (context: QuickJSContext, handle: QuickJSHandle, key: string): unknown => {\n const prop = context.getProp(handle, key);\n try {\n return context.dump(prop);\n } finally {\n prop.dispose();\n }\n};\n\nconst readResultState = (\n context: QuickJSContext,\n handle: QuickJSHandle,\n): {\n settled: boolean;\n value: unknown;\n error: unknown;\n} => ({\n settled: readPropDump(context, handle, \"settled\") === true,\n value: readPropDump(context, handle, \"v\"),\n error: readPropDump(context, handle, \"e\"),\n});\n\nconst createLogBridge = (context: QuickJSContext, logs: string[]): QuickJSHandle =>\n context.newFunction(\"__executor_log\", (levelHandle, lineHandle) => {\n const level = context.getString(levelHandle);\n const line = context.getString(lineHandle);\n logs.push(`[${level}] ${line}`);\n return context.undefined;\n });\n\nconst createToolBridge = (\n context: QuickJSContext,\n toolInvoker: SandboxToolInvoker,\n pendingDeferreds: Set<QuickJSDeferredPromise>,\n): QuickJSHandle =>\n context.newFunction(\"__executor_invokeTool\", (pathHandle, argsHandle) => {\n const path = context.getString(pathHandle);\n const args =\n argsHandle === undefined || context.typeof(argsHandle) === \"undefined\"\n ? undefined\n : context.dump(argsHandle);\n const deferred = context.newPromise();\n pendingDeferreds.add(deferred);\n deferred.settled.finally(() => {\n pendingDeferreds.delete(deferred);\n });\n\n void Effect.runPromise(toolInvoker.invoke({ path, args })).then(\n (value) => {\n if (!deferred.alive) {\n return;\n }\n\n const serialized = serializeJson(value, `Tool result for ${path}`);\n if (typeof serialized === \"undefined\") {\n deferred.resolve();\n return;\n }\n\n const valueHandle = context.newString(serialized);\n deferred.resolve(valueHandle);\n valueHandle.dispose();\n },\n (cause) => {\n if (!deferred.alive) {\n return;\n }\n\n const errorHandle = context.newError(toErrorMessage(cause));\n deferred.reject(errorHandle);\n errorHandle.dispose();\n },\n );\n\n return deferred.handle;\n });\n\nconst drainJobs = (\n context: QuickJSContext,\n runtime: QuickJSRuntime,\n deadlineMs: number,\n timeoutMs: number,\n): void => {\n while (runtime.hasPendingJob()) {\n if (Date.now() >= deadlineMs) {\n throw new Error(timeoutMessage(timeoutMs));\n }\n\n const pending = runtime.executePendingJobs();\n if (pending.error) {\n const error = context.dump(pending.error);\n pending.error.dispose();\n throw toError(error);\n }\n }\n};\n\nconst waitForDeferreds = async (\n pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>,\n deadlineMs: number,\n timeoutMs: number,\n): Promise<void> => {\n const remainingMs = deadlineMs - Date.now();\n if (remainingMs <= 0) {\n throw new Error(timeoutMessage(timeoutMs));\n }\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n Promise.race([...pendingDeferreds].map((deferred) => deferred.settled)),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(timeoutMessage(timeoutMs))), remainingMs);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n};\n\nconst drainAsync = async (\n context: QuickJSContext,\n runtime: QuickJSRuntime,\n pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>,\n deadlineMs: number,\n timeoutMs: number,\n): Promise<void> => {\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n\n while (pendingDeferreds.size > 0) {\n await waitForDeferreds(pendingDeferreds, deadlineMs, timeoutMs);\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n }\n\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n};\n\nconst evaluateInQuickJs = async (\n options: QuickJsExecutorOptions,\n code: string,\n toolInvoker: SandboxToolInvoker,\n): Promise<ExecuteResult> => {\n const timeoutMs = Math.max(100, options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n const deadlineMs = Date.now() + timeoutMs;\n const logs: string[] = [];\n const pendingDeferreds = new Set<QuickJSDeferredPromise>();\n const QuickJS = await resolveQuickJS();\n const runtime = QuickJS.newRuntime();\n\n try {\n if (options.memoryLimitBytes !== undefined) {\n runtime.setMemoryLimit(options.memoryLimitBytes);\n }\n\n if (options.maxStackSizeBytes !== undefined) {\n runtime.setMaxStackSize(options.maxStackSizeBytes);\n }\n\n runtime.setInterruptHandler(shouldInterruptAfterDeadline(deadlineMs));\n\n const context = runtime.newContext();\n try {\n const logBridge = createLogBridge(context, logs);\n context.setProp(context.global, \"__executor_log\", logBridge);\n logBridge.dispose();\n\n const toolBridge = createToolBridge(context, toolInvoker, pendingDeferreds);\n context.setProp(context.global, \"__executor_invokeTool\", toolBridge);\n toolBridge.dispose();\n\n const evaluated = context.evalCode(buildExecutionSource(code), EXECUTION_FILENAME);\n if (evaluated.error) {\n const error = context.dump(evaluated.error);\n evaluated.error.dispose();\n return {\n result: null,\n error: normalizeExecutionError(error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n context.setProp(context.global, \"__executor_result\", evaluated.value);\n evaluated.value.dispose();\n\n const stateResult = context.evalCode(\n \"(function(p){ var s = { v: void 0, e: void 0, settled: false }; var formatError = function(e){ if (e && typeof e === 'object') { var message = typeof e.message === 'string' ? e.message : ''; var stack = typeof e.stack === 'string' ? e.stack : ''; if (message && stack) { return stack.indexOf(message) === -1 ? message + '\\\\n' + stack : stack; } if (message) return message; if (stack) return stack; } return String(e); }; p.then(function(v){ s.v = v; s.settled = true; }, function(e){ s.e = formatError(e); s.settled = true; }); return s; })(__executor_result)\",\n );\n if (stateResult.error) {\n const error = context.dump(stateResult.error);\n stateResult.error.dispose();\n return {\n result: null,\n error: normalizeExecutionError(error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n const stateHandle = stateResult.value;\n try {\n await drainAsync(context, runtime, pendingDeferreds, deadlineMs, timeoutMs);\n const state = readResultState(context, stateHandle);\n if (!state.settled) {\n return {\n result: null,\n error: timeoutMessage(timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n if (typeof state.error !== \"undefined\") {\n return {\n result: null,\n error: normalizeExecutionError(state.error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n return {\n result: state.value,\n logs,\n } satisfies ExecuteResult;\n } finally {\n stateHandle.dispose();\n }\n } finally {\n for (const deferred of pendingDeferreds) {\n if (deferred.alive) {\n deferred.dispose();\n }\n }\n\n pendingDeferreds.clear();\n context.dispose();\n }\n } catch (cause) {\n return {\n result: null,\n error: normalizeExecutionError(cause, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n } finally {\n runtime.dispose();\n }\n};\n\nconst runInQuickJs = (\n options: QuickJsExecutorOptions,\n code: string,\n toolInvoker: SandboxToolInvoker,\n): Effect.Effect<ExecuteResult, QuickJsExecutionError> =>\n Effect.tryPromise({\n try: () => evaluateInQuickJs(options, code, toolInvoker),\n catch: (cause) => new QuickJsExecutionError({ message: String(cause) }),\n });\n\nexport const makeQuickJsExecutor = (options: QuickJsExecutorOptions = {}): CodeExecutor => ({\n execute: (code: string, toolInvoker: SandboxToolInvoker) =>\n runInQuickJs(options, code, toolInvoker),\n});\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OAIK;AACP,YAAY,UAAU;AACtB,YAAY,YAAY;AACxB;AAAA,EACE;AAAA,EACA;AAAA,OAMK;AASP,IAAI,kBAA4C;AAEzC,IAAM,mBAAmB,CAAC,QAA2B;AAC1D,oBAAkB;AACpB;AAEA,IAAM,iBAAiB,MACrB,kBAAkB,QAAQ,QAAQ,eAAe,IAAI,WAAW;AAElE,IAAM,wBAAN,cAAyC,iBAAY,uBAAuB,EAEzE;AAAC;AAEJ,IAAM,qBAAqB,IAAI;AAC/B,IAAM,qBAAqB;AAE3B,IAAM,UAAU,CAAC,UACf,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAE1D,IAAM,iBAAiB,CAAC,UAA2B;AACjD,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,QAAQ,WAAW,SAAS,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAClF,UAAM,UACJ,aAAa,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAE5E,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAEA,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,QAAQ,QAAQ,KAAK;AAC3B,SAAO,MAAM,SAAS,MAAM;AAC9B;AAEA,IAAM,gBAAgB,CAAC,OAAgB,UAAsC;AAC3E,MAAI,OAAO,UAAU,aAAa;AAChC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,GAAG,KAAK,8BAA8B,QAAQ,KAAK,EAAE,OAAO,EAAE;AAAA,EAChF;AACF;AAEA,IAAM,4BAA4B,CAAC,YAA6B,mBAAmB,KAAK,OAAO;AAE/F,IAAM,iBAAiB,CAAC,cACtB,qCAAqC,SAAS;AAEhD,IAAM,0BAA0B,CAAC,OAAgB,YAAoB,cAA8B;AACjG,QAAM,UAAU,eAAe,KAAK;AACpC,SAAO,KAAK,IAAI,KAAK,cAAc,0BAA0B,OAAO,IAChE,eAAe,SAAS,IACxB;AACN;AAEA,IAAM,uBAAuB,CAAC,SAAyB;AACrD,QAAM,OAAO,qBAAqB,IAAI;AAEtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,eAAe,CAAC,SAAyB,QAAuB,QAAyB;AAC7F,QAAM,OAAO,QAAQ,QAAQ,QAAQ,GAAG;AACxC,MAAI;AACF,WAAO,QAAQ,KAAK,IAAI;AAAA,EAC1B,UAAE;AACA,SAAK,QAAQ;AAAA,EACf;AACF;AAEA,IAAM,kBAAkB,CACtB,SACA,YAKI;AAAA,EACJ,SAAS,aAAa,SAAS,QAAQ,SAAS,MAAM;AAAA,EACtD,OAAO,aAAa,SAAS,QAAQ,GAAG;AAAA,EACxC,OAAO,aAAa,SAAS,QAAQ,GAAG;AAC1C;AAEA,IAAM,kBAAkB,CAAC,SAAyB,SAChD,QAAQ,YAAY,kBAAkB,CAAC,aAAa,eAAe;AACjE,QAAM,QAAQ,QAAQ,UAAU,WAAW;AAC3C,QAAM,OAAO,QAAQ,UAAU,UAAU;AACzC,OAAK,KAAK,IAAI,KAAK,KAAK,IAAI,EAAE;AAC9B,SAAO,QAAQ;AACjB,CAAC;AAEH,IAAM,mBAAmB,CACvB,SACA,aACA,qBAEA,QAAQ,YAAY,yBAAyB,CAAC,YAAY,eAAe;AACvE,QAAM,OAAO,QAAQ,UAAU,UAAU;AACzC,QAAM,OACJ,eAAe,UAAa,QAAQ,OAAO,UAAU,MAAM,cACvD,SACA,QAAQ,KAAK,UAAU;AAC7B,QAAM,WAAW,QAAQ,WAAW;AACpC,mBAAiB,IAAI,QAAQ;AAC7B,WAAS,QAAQ,QAAQ,MAAM;AAC7B,qBAAiB,OAAO,QAAQ;AAAA,EAClC,CAAC;AAED,OAAY,kBAAW,YAAY,OAAO,EAAE,MAAM,KAAK,CAAC,CAAC,EAAE;AAAA,IACzD,CAAC,UAAU;AACT,UAAI,CAAC,SAAS,OAAO;AACnB;AAAA,MACF;AAEA,YAAM,aAAa,cAAc,OAAO,mBAAmB,IAAI,EAAE;AACjE,UAAI,OAAO,eAAe,aAAa;AACrC,iBAAS,QAAQ;AACjB;AAAA,MACF;AAEA,YAAM,cAAc,QAAQ,UAAU,UAAU;AAChD,eAAS,QAAQ,WAAW;AAC5B,kBAAY,QAAQ;AAAA,IACtB;AAAA,IACA,CAAC,UAAU;AACT,UAAI,CAAC,SAAS,OAAO;AACnB;AAAA,MACF;AAEA,YAAM,cAAc,QAAQ,SAAS,eAAe,KAAK,CAAC;AAC1D,eAAS,OAAO,WAAW;AAC3B,kBAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,SAAS;AAClB,CAAC;AAEH,IAAM,YAAY,CAChB,SACA,SACA,YACA,cACS;AACT,SAAO,QAAQ,cAAc,GAAG;AAC9B,QAAI,KAAK,IAAI,KAAK,YAAY;AAC5B,YAAM,IAAI,MAAM,eAAe,SAAS,CAAC;AAAA,IAC3C;AAEA,UAAM,UAAU,QAAQ,mBAAmB;AAC3C,QAAI,QAAQ,OAAO;AACjB,YAAM,QAAQ,QAAQ,KAAK,QAAQ,KAAK;AACxC,cAAQ,MAAM,QAAQ;AACtB,YAAM,QAAQ,KAAK;AAAA,IACrB;AAAA,EACF;AACF;AAEA,IAAM,mBAAmB,OACvB,kBACA,YACA,cACkB;AAClB,QAAM,cAAc,aAAa,KAAK,IAAI;AAC1C,MAAI,eAAe,GAAG;AACpB,UAAM,IAAI,MAAM,eAAe,SAAS,CAAC;AAAA,EAC3C;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,QAAQ,KAAK;AAAA,MACjB,QAAQ,KAAK,CAAC,GAAG,gBAAgB,EAAE,IAAI,CAAC,aAAa,SAAS,OAAO,CAAC;AAAA,MACtE,IAAI,QAAe,CAAC,GAAG,WAAW;AAChC,gBAAQ,WAAW,MAAM,OAAO,IAAI,MAAM,eAAe,SAAS,CAAC,CAAC,GAAG,WAAW;AAAA,MACpF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,UAAE;AACA,QAAI,UAAU,QAAW;AACvB,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AACF;AAEA,IAAM,aAAa,OACjB,SACA,SACA,kBACA,YACA,cACkB;AAClB,YAAU,SAAS,SAAS,YAAY,SAAS;AAEjD,SAAO,iBAAiB,OAAO,GAAG;AAChC,UAAM,iBAAiB,kBAAkB,YAAY,SAAS;AAC9D,cAAU,SAAS,SAAS,YAAY,SAAS;AAAA,EACnD;AAEA,YAAU,SAAS,SAAS,YAAY,SAAS;AACnD;AAEA,IAAM,oBAAoB,OACxB,SACA,MACA,gBAC2B;AAC3B,QAAM,YAAY,KAAK,IAAI,KAAK,QAAQ,aAAa,kBAAkB;AACvE,QAAM,aAAa,KAAK,IAAI,IAAI;AAChC,QAAM,OAAiB,CAAC;AACxB,QAAM,mBAAmB,oBAAI,IAA4B;AACzD,QAAM,UAAU,MAAM,eAAe;AACrC,QAAM,UAAU,QAAQ,WAAW;AAEnC,MAAI;AACF,QAAI,QAAQ,qBAAqB,QAAW;AAC1C,cAAQ,eAAe,QAAQ,gBAAgB;AAAA,IACjD;AAEA,QAAI,QAAQ,sBAAsB,QAAW;AAC3C,cAAQ,gBAAgB,QAAQ,iBAAiB;AAAA,IACnD;AAEA,YAAQ,oBAAoB,6BAA6B,UAAU,CAAC;AAEpE,UAAM,UAAU,QAAQ,WAAW;AACnC,QAAI;AACF,YAAM,YAAY,gBAAgB,SAAS,IAAI;AAC/C,cAAQ,QAAQ,QAAQ,QAAQ,kBAAkB,SAAS;AAC3D,gBAAU,QAAQ;AAElB,YAAM,aAAa,iBAAiB,SAAS,aAAa,gBAAgB;AAC1E,cAAQ,QAAQ,QAAQ,QAAQ,yBAAyB,UAAU;AACnE,iBAAW,QAAQ;AAEnB,YAAM,YAAY,QAAQ,SAAS,qBAAqB,IAAI,GAAG,kBAAkB;AACjF,UAAI,UAAU,OAAO;AACnB,cAAM,QAAQ,QAAQ,KAAK,UAAU,KAAK;AAC1C,kBAAU,MAAM,QAAQ;AACxB,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,OAAO,wBAAwB,OAAO,YAAY,SAAS;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,QAAQ,QAAQ,QAAQ,qBAAqB,UAAU,KAAK;AACpE,gBAAU,MAAM,QAAQ;AAExB,YAAM,cAAc,QAAQ;AAAA,QAC1B;AAAA,MACF;AACA,UAAI,YAAY,OAAO;AACrB,cAAM,QAAQ,QAAQ,KAAK,YAAY,KAAK;AAC5C,oBAAY,MAAM,QAAQ;AAC1B,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,OAAO,wBAAwB,OAAO,YAAY,SAAS;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AAEA,YAAM,cAAc,YAAY;AAChC,UAAI;AACF,cAAM,WAAW,SAAS,SAAS,kBAAkB,YAAY,SAAS;AAC1E,cAAM,QAAQ,gBAAgB,SAAS,WAAW;AAClD,YAAI,CAAC,MAAM,SAAS;AAClB,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,OAAO,eAAe,SAAS;AAAA,YAC/B;AAAA,UACF;AAAA,QACF;AAEA,YAAI,OAAO,MAAM,UAAU,aAAa;AACtC,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,OAAO,wBAAwB,MAAM,OAAO,YAAY,SAAS;AAAA,YACjE;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,QAAQ,MAAM;AAAA,UACd;AAAA,QACF;AAAA,MACF,UAAE;AACA,oBAAY,QAAQ;AAAA,MACtB;AAAA,IACF,UAAE;AACA,iBAAW,YAAY,kBAAkB;AACvC,YAAI,SAAS,OAAO;AAClB,mBAAS,QAAQ;AAAA,QACnB;AAAA,MACF;AAEA,uBAAiB,MAAM;AACvB,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,wBAAwB,OAAO,YAAY,SAAS;AAAA,MAC3D;AAAA,IACF;AAAA,EACF,UAAE;AACA,YAAQ,QAAQ;AAAA,EAClB;AACF;AAEA,IAAM,eAAe,CACnB,SACA,MACA,gBAEO,kBAAW;AAAA,EAChB,KAAK,MAAM,kBAAkB,SAAS,MAAM,WAAW;AAAA,EACvD,OAAO,CAAC,UAAU,IAAI,sBAAsB,EAAE,SAAS,OAAO,KAAK,EAAE,CAAC;AACxE,CAAC;AAEI,IAAM,sBAAsB,CAAC,UAAkC,CAAC,OAAqB;AAAA,EAC1F,SAAS,CAAC,MAAc,gBACtB,aAAa,SAAS,MAAM,WAAW;AAC3C;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n recoverExecutionBody,\n type CodeExecutor,\n type ExecuteResult,\n type SandboxToolInvoker,\n} from \"@executor-js/codemode-core\";\nimport * as Data from \"effect/Data\";\nimport * as Effect from \"effect/Effect\";\nimport {\n getQuickJS,\n shouldInterruptAfterDeadline,\n type QuickJSContext,\n type QuickJSDeferredPromise,\n type QuickJSHandle,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from \"quickjs-emscripten\";\n\nexport type QuickJsExecutorOptions = {\n timeoutMs?: number;\n memoryLimitBytes?: number;\n maxStackSizeBytes?: number;\n};\n\n// Allow pre-loading a QuickJS module (e.g. with custom WASM bytes for compiled binaries)\nlet preloadedModule: QuickJSWASMModule | null = null;\n\nexport const setQuickJSModule = (mod: QuickJSWASMModule) => {\n preloadedModule = mod;\n};\n\nconst resolveQuickJS = (): Promise<QuickJSWASMModule> =>\n preloadedModule ? Promise.resolve(preloadedModule) : getQuickJS();\n\nclass QuickJsExecutionError extends Data.TaggedError(\"QuickJsExecutionError\")<{\n readonly message: string;\n}> {}\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60_000;\nconst EXECUTION_FILENAME = \"executor-quickjs-runtime.js\";\n\nconst toError = (cause: unknown): Error =>\n cause instanceof Error ? cause : new Error(String(cause));\n\nconst toErrorMessage = (cause: unknown): string => {\n if (typeof cause === \"object\" && cause !== null) {\n const message =\n \"message\" in cause && typeof cause.message === \"string\" ? cause.message : undefined;\n\n if (message) {\n return message;\n }\n\n const stack = \"stack\" in cause && typeof cause.stack === \"string\" ? cause.stack : undefined;\n\n if (stack) {\n return stack;\n }\n }\n\n const error = toError(cause);\n return error.stack ?? error.message;\n};\n\nconst serializeJson = (value: unknown, label: string): string | undefined => {\n if (typeof value === \"undefined\") {\n return undefined;\n }\n\n try {\n return JSON.stringify(value);\n } catch (cause) {\n throw new Error(`${label} is not JSON serializable: ${toError(cause).message}`);\n }\n};\n\nconst looksLikeInterruptedError = (message: string): boolean => /\\binterrupted\\b/i.test(message);\n\nconst timeoutMessage = (timeoutMs: number): string =>\n `QuickJS execution timed out after ${timeoutMs}ms`;\n\nconst normalizeExecutionError = (cause: unknown, deadlineMs: number, timeoutMs: number): string => {\n const message = toErrorMessage(cause);\n return Date.now() >= deadlineMs && looksLikeInterruptedError(message)\n ? timeoutMessage(timeoutMs)\n : message;\n};\n\nconst buildExecutionSource = (code: string): string => {\n const body = recoverExecutionBody(code);\n\n return [\n '\"use strict\";',\n \"const __invokeTool = __executor_invokeTool;\",\n \"const __log = __executor_log;\",\n \"try { delete globalThis.__executor_invokeTool; } catch {}\",\n \"try { delete globalThis.__executor_log; } catch {}\",\n \"const __formatLogArg = (value) => {\",\n \" if (typeof value === 'string') return value;\",\n \" try {\",\n \" return JSON.stringify(value);\",\n \" } catch {\",\n \" return String(value);\",\n \" }\",\n \"};\",\n \"const __formatLogLine = (args) => args.map(__formatLogArg).join(' ');\",\n \"const __makeToolsProxy = (path = []) => new Proxy(() => undefined, {\",\n \" get(_target, prop) {\",\n \" if (prop === 'then' || typeof prop === 'symbol') {\",\n \" return undefined;\",\n \" }\",\n \" return __makeToolsProxy([...path, String(prop)]);\",\n \" },\",\n \" apply(_target, _thisArg, args) {\",\n \" const toolPath = path.join('.');\",\n \" if (!toolPath) {\",\n \" throw new Error('Tool path missing in invocation');\",\n \" }\",\n \" return Promise.resolve(__invokeTool(toolPath, args[0])).then((raw) => raw === undefined ? undefined : JSON.parse(raw));\",\n \" },\",\n \"});\",\n \"const tools = __makeToolsProxy();\",\n \"const console = {\",\n \" log: (...args) => __log('log', __formatLogLine(args)),\",\n \" warn: (...args) => __log('warn', __formatLogLine(args)),\",\n \" error: (...args) => __log('error', __formatLogLine(args)),\",\n \" info: (...args) => __log('info', __formatLogLine(args)),\",\n \" debug: (...args) => __log('debug', __formatLogLine(args)),\",\n \"};\",\n \"const fetch = (..._args) => {\",\n \" throw new Error('fetch is disabled in QuickJS executor');\",\n \"};\",\n \"(async () => {\",\n body,\n \"})()\",\n ].join(\"\\n\");\n};\n\nconst readPropDump = (context: QuickJSContext, handle: QuickJSHandle, key: string): unknown => {\n const prop = context.getProp(handle, key);\n try {\n return context.dump(prop);\n } finally {\n prop.dispose();\n }\n};\n\nconst readResultState = (\n context: QuickJSContext,\n handle: QuickJSHandle,\n): {\n settled: boolean;\n value: unknown;\n error: unknown;\n} => ({\n settled: readPropDump(context, handle, \"settled\") === true,\n value: readPropDump(context, handle, \"v\"),\n error: readPropDump(context, handle, \"e\"),\n});\n\nconst createLogBridge = (context: QuickJSContext, logs: string[]): QuickJSHandle =>\n context.newFunction(\"__executor_log\", (levelHandle, lineHandle) => {\n const level = context.getString(levelHandle);\n const line = context.getString(lineHandle);\n logs.push(`[${level}] ${line}`);\n return context.undefined;\n });\n\ntype RunPromise = <A, E>(effect: Effect.Effect<A, E>) => Promise<A>;\n\nconst createToolBridge = (\n context: QuickJSContext,\n toolInvoker: SandboxToolInvoker,\n pendingDeferreds: Set<QuickJSDeferredPromise>,\n runPromise: RunPromise,\n): QuickJSHandle =>\n context.newFunction(\"__executor_invokeTool\", (pathHandle, argsHandle) => {\n const path = context.getString(pathHandle);\n const args =\n argsHandle === undefined || context.typeof(argsHandle) === \"undefined\"\n ? undefined\n : context.dump(argsHandle);\n const deferred = context.newPromise();\n pendingDeferreds.add(deferred);\n deferred.settled.finally(() => {\n pendingDeferreds.delete(deferred);\n });\n\n void runPromise(toolInvoker.invoke({ path, args })).then(\n (value) => {\n if (!deferred.alive) {\n return;\n }\n\n const serialized = serializeJson(value, `Tool result for ${path}`);\n if (typeof serialized === \"undefined\") {\n deferred.resolve();\n return;\n }\n\n const valueHandle = context.newString(serialized);\n deferred.resolve(valueHandle);\n valueHandle.dispose();\n },\n (cause) => {\n if (!deferred.alive) {\n return;\n }\n\n const errorHandle = context.newError(toErrorMessage(cause));\n deferred.reject(errorHandle);\n errorHandle.dispose();\n },\n );\n\n return deferred.handle;\n });\n\nconst drainJobs = (\n context: QuickJSContext,\n runtime: QuickJSRuntime,\n deadlineMs: number,\n timeoutMs: number,\n): void => {\n while (runtime.hasPendingJob()) {\n if (Date.now() >= deadlineMs) {\n throw new Error(timeoutMessage(timeoutMs));\n }\n\n const pending = runtime.executePendingJobs();\n if (pending.error) {\n const error = context.dump(pending.error);\n pending.error.dispose();\n throw toError(error);\n }\n }\n};\n\nconst waitForDeferreds = async (\n pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>,\n deadlineMs: number,\n timeoutMs: number,\n): Promise<void> => {\n const remainingMs = deadlineMs - Date.now();\n if (remainingMs <= 0) {\n throw new Error(timeoutMessage(timeoutMs));\n }\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n Promise.race([...pendingDeferreds].map((deferred) => deferred.settled)),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(timeoutMessage(timeoutMs))), remainingMs);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n};\n\nconst drainAsync = async (\n context: QuickJSContext,\n runtime: QuickJSRuntime,\n pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>,\n deadlineMs: number,\n timeoutMs: number,\n): Promise<void> => {\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n\n while (pendingDeferreds.size > 0) {\n await waitForDeferreds(pendingDeferreds, deadlineMs, timeoutMs);\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n }\n\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n};\n\nconst evaluateInQuickJs = async (\n options: QuickJsExecutorOptions,\n code: string,\n toolInvoker: SandboxToolInvoker,\n runPromise: RunPromise,\n): Promise<ExecuteResult> => {\n const timeoutMs = Math.max(100, options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n const deadlineMs = Date.now() + timeoutMs;\n const logs: string[] = [];\n const pendingDeferreds = new Set<QuickJSDeferredPromise>();\n const QuickJS = await resolveQuickJS();\n const runtime = QuickJS.newRuntime();\n\n try {\n if (options.memoryLimitBytes !== undefined) {\n runtime.setMemoryLimit(options.memoryLimitBytes);\n }\n\n if (options.maxStackSizeBytes !== undefined) {\n runtime.setMaxStackSize(options.maxStackSizeBytes);\n }\n\n runtime.setInterruptHandler(shouldInterruptAfterDeadline(deadlineMs));\n\n const context = runtime.newContext();\n try {\n const logBridge = createLogBridge(context, logs);\n context.setProp(context.global, \"__executor_log\", logBridge);\n logBridge.dispose();\n\n const toolBridge = createToolBridge(context, toolInvoker, pendingDeferreds, runPromise);\n context.setProp(context.global, \"__executor_invokeTool\", toolBridge);\n toolBridge.dispose();\n\n const evaluated = context.evalCode(buildExecutionSource(code), EXECUTION_FILENAME);\n if (evaluated.error) {\n const error = context.dump(evaluated.error);\n evaluated.error.dispose();\n return {\n result: null,\n error: normalizeExecutionError(error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n context.setProp(context.global, \"__executor_result\", evaluated.value);\n evaluated.value.dispose();\n\n const stateResult = context.evalCode(\n \"(function(p){ var s = { v: void 0, e: void 0, settled: false }; var formatError = function(e){ if (e && typeof e === 'object') { var message = typeof e.message === 'string' ? e.message : ''; var stack = typeof e.stack === 'string' ? e.stack : ''; if (message && stack) { return stack.indexOf(message) === -1 ? message + '\\\\n' + stack : stack; } if (message) return message; if (stack) return stack; } return String(e); }; p.then(function(v){ s.v = v; s.settled = true; }, function(e){ s.e = formatError(e); s.settled = true; }); return s; })(__executor_result)\",\n );\n if (stateResult.error) {\n const error = context.dump(stateResult.error);\n stateResult.error.dispose();\n return {\n result: null,\n error: normalizeExecutionError(error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n const stateHandle = stateResult.value;\n try {\n await drainAsync(context, runtime, pendingDeferreds, deadlineMs, timeoutMs);\n const state = readResultState(context, stateHandle);\n if (!state.settled) {\n return {\n result: null,\n error: timeoutMessage(timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n if (typeof state.error !== \"undefined\") {\n return {\n result: null,\n error: normalizeExecutionError(state.error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n return {\n result: state.value,\n logs,\n } satisfies ExecuteResult;\n } finally {\n stateHandle.dispose();\n }\n } finally {\n for (const deferred of pendingDeferreds) {\n if (deferred.alive) {\n deferred.dispose();\n }\n }\n\n pendingDeferreds.clear();\n context.dispose();\n }\n } catch (cause) {\n return {\n result: null,\n error: normalizeExecutionError(cause, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n } finally {\n runtime.dispose();\n }\n};\n\nconst runInQuickJs = (\n options: QuickJsExecutorOptions,\n code: string,\n toolInvoker: SandboxToolInvoker,\n): Effect.Effect<ExecuteResult, QuickJsExecutionError> =>\n Effect.gen(function* () {\n const context = yield* Effect.context<never>();\n const runPromise = Effect.runPromiseWith(context);\n return yield* Effect.tryPromise({\n try: () => evaluateInQuickJs(options, code, toolInvoker, runPromise),\n catch: (cause) => new QuickJsExecutionError({ message: String(cause) }),\n });\n }).pipe(\n Effect.withSpan(\"executor.code.exec.quickjs\", {\n attributes: { \"executor.runtime\": \"quickjs\" },\n }),\n );\n\nexport const makeQuickJsExecutor = (\n options: QuickJsExecutorOptions = {},\n): CodeExecutor<QuickJsExecutionError> => ({\n execute: (code: string, toolInvoker: SandboxToolInvoker) =>\n runInQuickJs(options, code, toolInvoker),\n});\n"],"mappings":"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","names":["context"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@executor-js/runtime-quickjs",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/kernel/runtime-quickjs",
5
5
  "bugs": {
6
6
  "url": "https://github.com/RhysSullivan/executor/issues"
@@ -34,16 +34,16 @@
34
34
  "typecheck:slow": "bunx tsc --noEmit -p tsconfig.json"
35
35
  },
36
36
  "dependencies": {
37
- "@executor-js/codemode-core": "0.0.1",
38
- "effect": "^3.21.0",
37
+ "@executor-js/codemode-core": "0.0.2",
38
+ "effect": "4.0.0-beta.59",
39
39
  "quickjs-emscripten": "^0.31.0"
40
40
  },
41
41
  "devDependencies": {
42
- "@effect/vitest": "^0.29.0",
42
+ "@effect/vitest": "4.0.0-beta.59",
43
43
  "@types/node": "^24.3.1",
44
44
  "bun-types": "^1.2.22",
45
45
  "tsup": "^8.5.0",
46
46
  "typescript": "^5.9.3",
47
- "vitest": "^4.1.3"
47
+ "vitest": "^4.1.5"
48
48
  }
49
49
  }