@execbox/quickjs 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +9 -10
  2. package/dist/index.cjs +16 -239
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +6 -6
  5. package/dist/index.d.cts.map +1 -1
  6. package/dist/index.d.ts +6 -6
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +17 -240
  9. package/dist/index.js.map +1 -1
  10. package/dist/{protocolEndpoint-ByylXGle.cjs → protocolEndpoint-BGyrwlr_.cjs} +2 -2
  11. package/dist/protocolEndpoint-BGyrwlr_.cjs.map +1 -0
  12. package/dist/{protocolEndpoint-CwyUhKrN.js → protocolEndpoint-Ceadcq_L.js} +3 -3
  13. package/dist/protocolEndpoint-Ceadcq_L.js.map +1 -0
  14. package/dist/remoteEndpoint.cjs +1 -1
  15. package/dist/remoteEndpoint.js +2 -2
  16. package/dist/runner/index.d.cts +2 -2
  17. package/dist/runner/index.d.cts.map +1 -1
  18. package/dist/runner/index.d.ts +2 -2
  19. package/dist/runner/index.d.ts.map +1 -1
  20. package/dist/runner/index.js +1 -1
  21. package/dist/runner/protocolEndpoint.cjs +1 -1
  22. package/dist/runner/protocolEndpoint.d.cts +2 -2
  23. package/dist/runner/protocolEndpoint.d.ts +2 -2
  24. package/dist/runner/protocolEndpoint.js +2 -2
  25. package/dist/runner-DRLfwiqY.cjs.map +1 -1
  26. package/dist/{runner-DJ5AWw-k.js → runner-oZXbguX3.js} +1 -1
  27. package/dist/runner-oZXbguX3.js.map +1 -0
  28. package/dist/{types-7wOdERLE.d.ts → types-C-XfFJ7u.d.cts} +8 -21
  29. package/dist/types-C-XfFJ7u.d.cts.map +1 -0
  30. package/dist/{types-BMA2zKnX.d.cts → types-CE7SvejR.d.ts} +8 -21
  31. package/dist/types-CE7SvejR.d.ts.map +1 -0
  32. package/dist/workerEntry.cjs +1 -1
  33. package/dist/workerEntry.js +2 -2
  34. package/package.json +2 -2
  35. package/dist/processEntry.cjs +0 -17
  36. package/dist/processEntry.cjs.map +0 -1
  37. package/dist/processEntry.d.cts +0 -5
  38. package/dist/processEntry.d.ts +0 -5
  39. package/dist/processEntry.js +0 -18
  40. package/dist/processEntry.js.map +0 -1
  41. package/dist/protocolEndpoint-ByylXGle.cjs.map +0 -1
  42. package/dist/protocolEndpoint-CwyUhKrN.js.map +0 -1
  43. package/dist/runner-DJ5AWw-k.js.map +0 -1
  44. package/dist/types-7wOdERLE.d.ts.map +0 -1
  45. package/dist/types-BMA2zKnX.d.cts.map +0 -1
@@ -7,14 +7,14 @@ import { DispatcherMessage, RunnerMessage } from "@execbox/core/protocol";
7
7
  //#region src/runner/protocolEndpoint.d.ts
8
8
 
9
9
  /**
10
- * Minimal worker/process-side port used by the shared QuickJS protocol endpoint.
10
+ * Minimal worker-side port used by the shared QuickJS protocol endpoint.
11
11
  */
12
12
  interface QuickJsProtocolPort {
13
13
  onMessage(handler: (message: DispatcherMessage) => void): void | (() => void);
14
14
  send(message: RunnerMessage): void;
15
15
  }
16
16
  /**
17
- * Attaches the shared QuickJS protocol loop to a worker/process messaging port.
17
+ * Attaches the shared QuickJS protocol loop to a worker messaging port.
18
18
  */
19
19
  declare function attachQuickJsProtocolEndpoint(port: QuickJsProtocolPort): () => void;
20
20
  //#endregion
@@ -1,4 +1,4 @@
1
- import "../runner-DJ5AWw-k.js";
2
- import { t as attachQuickJsProtocolEndpoint } from "../protocolEndpoint-CwyUhKrN.js";
1
+ import "../runner-oZXbguX3.js";
2
+ import { t as attachQuickJsProtocolEndpoint } from "../protocolEndpoint-Ceadcq_L.js";
3
3
 
4
4
  export { attachQuickJsProtocolEndpoint };
@@ -1 +1 @@
1
- {"version":3,"file":"runner-DRLfwiqY.cjs","names":["ExecuteFailure","RELEASE_SYNC","rejection: unknown","ExecuteFailure","input: unknown","responsePromise: Promise<ToolCallResult>","resultHandle: QuickJSHandle | undefined","logs: string[]"],"sources":["../src/quickjsBridge.ts","../src/runner/index.ts"],"sourcesContent":["import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\n\nimport { ExecuteFailure } from \"@execbox/core/runtime\";\nimport type { ExecuteErrorCode } from \"@execbox/core\";\n\n/**\n * Creates a guest-visible error object that carries a trusted host error code marker.\n */\nexport function createGuestErrorHandle(\n context: QuickJSContext,\n code: ExecuteErrorCode,\n message: string,\n trustedHostErrorKey: string,\n): QuickJSHandle {\n const errorHandle = context.newError({ message, name: \"Error\" });\n const codeHandle = context.newString(code);\n const trustedHostMarkerHandle = context.true;\n\n try {\n context.setProp(errorHandle, \"code\", codeHandle);\n context.setProp(errorHandle, trustedHostErrorKey, trustedHostMarkerHandle);\n return errorHandle;\n } finally {\n codeHandle.dispose();\n trustedHostMarkerHandle.dispose();\n }\n}\n\n/**\n * Converts a guest QuickJS handle into a JSON-compatible host value.\n */\nexport function fromGuestHandle(\n context: QuickJSContext,\n handle: QuickJSHandle,\n): unknown {\n const guestType = context.typeof(handle);\n\n if (guestType === \"undefined\") {\n return undefined;\n }\n\n if (\n guestType === \"function\" ||\n guestType === \"symbol\" ||\n guestType === \"bigint\"\n ) {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n }\n\n const jsonHandle = context.getProp(context.global, \"JSON\");\n const stringifyHandle = context.getProp(jsonHandle, \"stringify\");\n\n try {\n const stringified = context.unwrapResult(\n context.callFunction(stringifyHandle, jsonHandle, handle),\n );\n const stringifiedType = context.typeof(stringified);\n\n if (stringifiedType === \"undefined\") {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n }\n\n const jsonValue = context.getString(stringified);\n return JSON.parse(jsonValue);\n } catch (error) {\n if (error instanceof ExecuteFailure) {\n throw error;\n }\n\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n } finally {\n stringifyHandle.dispose();\n jsonHandle.dispose();\n }\n}\n\n/**\n * Converts a host JSON-compatible value into a guest QuickJS handle.\n */\nexport function toGuestHandle(\n context: QuickJSContext,\n value: unknown,\n): QuickJSHandle {\n if (value === undefined) {\n return context.undefined;\n }\n\n const jsonValue = JSON.stringify(value);\n\n if (jsonValue === undefined) {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Host value is not JSON-serializable\",\n );\n }\n\n return context.unwrapResult(\n context.evalCode(`(${jsonValue})`, \"host-value.json\"),\n );\n}\n","/**\n * @packageDocumentation\n * Public API for the `@execbox/quickjs/runner` entrypoint.\n */\nimport { randomUUID } from \"node:crypto\";\n\nimport {\n RELEASE_SYNC,\n isFail,\n memoizePromiseFactory,\n newQuickJSWASMModule,\n shouldInterruptAfterDeadline,\n type QuickJSContext,\n type QuickJSHandle,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from \"quickjs-emscripten\";\n\nimport {\n ExecuteFailure,\n formatConsoleLine,\n getExecutionTimeoutMessage,\n isExecuteFailure,\n isKnownExecuteErrorCode,\n normalizeCode,\n normalizeThrownMessage,\n resolveExecutorRuntimeOptions,\n truncateLogs,\n} from \"@execbox/core/runtime\";\nimport type {\n ExecuteError,\n ExecuteResult,\n ExecutorRuntimeOptions,\n ProviderManifest,\n ToolCall,\n ToolCallResult,\n} from \"@execbox/core\";\n\nimport {\n createGuestErrorHandle,\n fromGuestHandle,\n toGuestHandle,\n} from \"../quickjsBridge.ts\";\nimport type { QuickJsInlineExecutorOptions } from \"../types.ts\";\n\nexport type {\n QuickJsExecutorHost,\n QuickJsExecutorOptions,\n QuickJsHostedMode,\n QuickJsInlineExecutorOptions,\n QuickJsProcessExecutorOptions,\n QuickJsWorkerExecutorOptions,\n WorkerResourceLimits,\n} from \"../types.ts\";\n\nconst loadDefaultModule = memoizePromiseFactory(() =>\n newQuickJSWASMModule(RELEASE_SYNC),\n);\n\n/**\n * Transport-neutral host tool call emitted from a QuickJS session.\n */\nexport type QuickJsSessionToolCall = ToolCall;\n\n/**\n * Input required to run one transport-backed QuickJS execution session.\n */\nexport interface QuickJsSessionRequest {\n /** Optional abort controller that should be triggered when execution stops. */\n abortController?: AbortController;\n\n /** Guest JavaScript source to evaluate inside QuickJS. */\n code: string;\n\n /** Host callback used to fulfill guest tool calls. */\n onToolCall: (call: ToolCall) => Promise<ToolCallResult> | ToolCallResult;\n\n /** Optional hook invoked once the guest runtime has started. */\n onStarted?: () => void;\n\n /** Transport-safe provider manifests exposed to the guest runtime. */\n providers: ProviderManifest[];\n\n /** Optional caller-owned abort signal for the session. */\n signal?: AbortSignal;\n}\n\n/**\n * Options controlling one transport-backed QuickJS session.\n */\nexport type QuickJsSessionOptions = ExecutorRuntimeOptions &\n Pick<QuickJsInlineExecutorOptions, \"loadModule\"> & {\n /** Optional preloaded QuickJS WASM module instance. */\n module?: QuickJSWASMModule;\n };\n\n/**\n * Converts unexpected executor failures into stable public result errors.\n */\nfunction toExecuteError(error: unknown, deadline: number): ExecuteError {\n if (isExecuteFailure(error)) {\n return {\n code: error.code,\n message: error.message,\n };\n }\n\n const message = normalizeThrownMessage(error);\n\n if (Date.now() > deadline || message.includes(\"interrupted\")) {\n return {\n code: \"timeout\",\n message: getExecutionTimeoutMessage(),\n };\n }\n\n if (message.toLowerCase().includes(\"out of memory\")) {\n return {\n code: \"memory_limit\",\n message,\n };\n }\n\n return {\n code: \"runtime_error\",\n message,\n };\n}\n\nfunction errorFromGuestHandle(\n context: QuickJSContext,\n handle: QuickJSHandle,\n trustedHostErrorKey: string,\n): ExecuteError {\n const codeHandle = context.getProp(handle, \"code\");\n const messageHandle = context.getProp(handle, \"message\");\n const trustedMarkerHandle = context.getProp(handle, trustedHostErrorKey);\n\n try {\n const code =\n context.typeof(codeHandle) === \"string\"\n ? context.getString(codeHandle)\n : undefined;\n const trustedHostError = context.typeof(trustedMarkerHandle) === \"boolean\";\n const message =\n context.typeof(messageHandle) === \"string\"\n ? context.getString(messageHandle)\n : normalizeThrownMessage(context.dump(handle));\n\n if (trustedHostError && isKnownExecuteErrorCode(code)) {\n return {\n code,\n message,\n };\n }\n\n return {\n code: \"runtime_error\",\n message,\n };\n } finally {\n codeHandle.dispose();\n messageHandle.dispose();\n trustedMarkerHandle.dispose();\n }\n}\n\nasync function waitForPromiseSettlement(\n runtime: QuickJSRuntime,\n promise: Promise<unknown>,\n deadline: number,\n trustedHostErrorKey: string,\n): Promise<void> {\n let settled = false;\n let rejection: unknown;\n\n promise.then(\n () => {\n settled = true;\n },\n (error) => {\n settled = true;\n rejection = error;\n },\n );\n\n while (!settled) {\n if (Date.now() > deadline) {\n throw new ExecuteFailure(\"timeout\", getExecutionTimeoutMessage());\n }\n\n const pendingJobsResult = runtime.executePendingJobs(-1);\n if (isFail(pendingJobsResult)) {\n const pendingError = pendingJobsResult.error;\n\n try {\n const executeError = errorFromGuestHandle(\n pendingError.context,\n pendingError,\n trustedHostErrorKey,\n );\n throw new ExecuteFailure(executeError.code, executeError.message);\n } finally {\n pendingError.dispose();\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n\n if (rejection !== undefined) {\n throw rejection;\n }\n}\n\nfunction injectConsole(context: QuickJSContext, logs: string[]): void {\n const consoleHandle = context.newObject();\n\n try {\n for (const methodName of [\"log\", \"info\", \"warn\", \"error\"]) {\n const methodHandle = context.newFunction(methodName, (...args) => {\n logs.push(formatConsoleLine(args.map((arg) => context.dump(arg))));\n return context.undefined;\n });\n\n context.setProp(consoleHandle, methodName, methodHandle);\n methodHandle.dispose();\n }\n\n context.setProp(context.global, \"console\", consoleHandle);\n } finally {\n consoleHandle.dispose();\n }\n}\n\nfunction injectProviders(\n context: QuickJSContext,\n providers: ProviderManifest[],\n signal: AbortSignal,\n trustedHostErrorKey: string,\n onToolCall: QuickJsSessionRequest[\"onToolCall\"],\n): void {\n for (const provider of providers) {\n const providerHandle = context.newObject();\n\n try {\n for (const [safeToolName] of Object.entries(provider.tools)) {\n const toolHandle = createToolHandle(\n context,\n provider.name,\n safeToolName,\n signal,\n trustedHostErrorKey,\n onToolCall,\n );\n context.setProp(providerHandle, safeToolName, toolHandle);\n toolHandle.dispose();\n }\n\n context.setProp(context.global, provider.name, providerHandle);\n } finally {\n providerHandle.dispose();\n }\n }\n}\n\nfunction createToolHandle(\n context: QuickJSContext,\n providerName: string,\n safeToolName: string,\n signal: AbortSignal,\n trustedHostErrorKey: string,\n onToolCall: QuickJsSessionRequest[\"onToolCall\"],\n): QuickJSHandle {\n return context.newFunction(safeToolName, (...args) => {\n const deferred = context.newPromise();\n const disposeDeferred = () => {\n if (context.alive && deferred.alive) {\n deferred.dispose();\n }\n };\n let input: unknown;\n\n try {\n input =\n args[0] === undefined ? undefined : fromGuestHandle(context, args[0]);\n } catch (error) {\n const executeError = isExecuteFailure(error)\n ? error\n : new ExecuteFailure(\n \"serialization_error\",\n \"Guest code passed a non-serializable tool input\",\n );\n const errorHandle = createGuestErrorHandle(\n context,\n executeError.code,\n executeError.message,\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n return deferred.handle;\n } finally {\n errorHandle.dispose();\n queueMicrotask(disposeDeferred);\n }\n }\n const onAbort = () => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n const errorHandle = createGuestErrorHandle(\n context,\n \"timeout\",\n getExecutionTimeoutMessage(),\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n } finally {\n errorHandle.dispose();\n disposeDeferred();\n }\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n let responsePromise: Promise<ToolCallResult>;\n\n try {\n if (signal.aborted) {\n throw new ExecuteFailure(\"timeout\", getExecutionTimeoutMessage());\n }\n\n responsePromise = Promise.resolve(\n onToolCall({\n input,\n providerName,\n safeToolName,\n }),\n );\n } catch (error) {\n responsePromise = Promise.reject(error);\n }\n\n void responsePromise\n .then((response) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n let resultHandle: QuickJSHandle | undefined;\n\n try {\n if (!response.ok) {\n const errorHandle = createGuestErrorHandle(\n context,\n response.error.code,\n response.error.message,\n trustedHostErrorKey,\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n return;\n }\n\n resultHandle = toGuestHandle(context, response.result);\n deferred.resolve(resultHandle);\n } finally {\n resultHandle?.dispose();\n disposeDeferred();\n }\n })\n .catch((error) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n const errorHandle = createGuestErrorHandle(\n context,\n isExecuteFailure(error) ? error.code : \"internal_error\",\n normalizeThrownMessage(error),\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n } finally {\n errorHandle.dispose();\n disposeDeferred();\n }\n });\n\n return deferred.handle;\n });\n}\n\n/**\n * Runs one QuickJS-backed execution session using a transport-neutral tool callback.\n */\nexport async function runQuickJsSession(\n request: QuickJsSessionRequest,\n options: QuickJsSessionOptions = {},\n): Promise<ExecuteResult> {\n const runtimeOptions = resolveExecutorRuntimeOptions(options);\n const loadModule = async () => {\n if (options.module) {\n return options.module;\n }\n\n const loaded = options.loadModule\n ? await options.loadModule()\n : await loadDefaultModule();\n return loaded as QuickJSWASMModule;\n };\n const { maxLogChars, maxLogLines, memoryLimitBytes, timeoutMs } =\n runtimeOptions;\n const startedAt = Date.now();\n const logs: string[] = [];\n const abortController = new AbortController();\n const trustedHostErrorKey = `__execboxHostError_${randomUUID()}`;\n const signal =\n request.abortController?.signal ?? request.signal ?? abortController.signal;\n const module = await loadModule();\n const runtime = module.newRuntime();\n let deadline = Number.POSITIVE_INFINITY;\n runtime.setMemoryLimit(memoryLimitBytes);\n const context = runtime.newContext();\n\n try {\n injectConsole(context, logs);\n injectProviders(\n context,\n request.providers,\n signal,\n trustedHostErrorKey,\n request.onToolCall,\n );\n const executionStartedAt = Date.now();\n deadline = executionStartedAt + timeoutMs;\n const shouldInterrupt = shouldInterruptAfterDeadline(deadline);\n runtime.setInterruptHandler((currentRuntime) => {\n return signal.aborted || shouldInterrupt(currentRuntime);\n });\n request.onStarted?.();\n\n const executableSource = normalizeCode(request.code);\n const functionHandle = context.unwrapResult(\n context.evalCode(`(${executableSource})`, \"sandbox-user-code.js\"),\n );\n\n try {\n const promiseHandle = context.unwrapResult(\n context.callFunction(functionHandle, context.undefined),\n );\n\n try {\n const promiseResult = context.resolvePromise(promiseHandle);\n await waitForPromiseSettlement(\n runtime,\n promiseResult,\n deadline,\n trustedHostErrorKey,\n );\n const settledResult = await promiseResult;\n\n if (isFail(settledResult)) {\n const errorHandle = settledResult.error;\n\n try {\n return {\n durationMs: Date.now() - startedAt,\n error: errorFromGuestHandle(\n context,\n errorHandle,\n trustedHostErrorKey,\n ),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n errorHandle.dispose();\n }\n }\n\n try {\n const value = fromGuestHandle(context, settledResult.value);\n\n return {\n durationMs: Date.now() - startedAt,\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: true,\n result: value,\n };\n } catch (error) {\n return {\n durationMs: Date.now() - startedAt,\n error: toExecuteError(error, deadline),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n settledResult.value.dispose();\n }\n } finally {\n promiseHandle.dispose();\n }\n } finally {\n functionHandle.dispose();\n }\n } catch (error) {\n abortController.abort();\n\n return {\n durationMs: Date.now() - startedAt,\n error: toExecuteError(error, deadline),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n request.abortController?.abort();\n abortController.abort();\n context.dispose();\n runtime.dispose();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"runner-DRLfwiqY.cjs","names":["ExecuteFailure","RELEASE_SYNC","rejection: unknown","ExecuteFailure","input: unknown","responsePromise: Promise<ToolCallResult>","resultHandle: QuickJSHandle | undefined","logs: string[]"],"sources":["../src/quickjsBridge.ts","../src/runner/index.ts"],"sourcesContent":["import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\n\nimport { ExecuteFailure } from \"@execbox/core/runtime\";\nimport type { ExecuteErrorCode } from \"@execbox/core\";\n\n/**\n * Creates a guest-visible error object that carries a trusted host error code marker.\n */\nexport function createGuestErrorHandle(\n context: QuickJSContext,\n code: ExecuteErrorCode,\n message: string,\n trustedHostErrorKey: string,\n): QuickJSHandle {\n const errorHandle = context.newError({ message, name: \"Error\" });\n const codeHandle = context.newString(code);\n const trustedHostMarkerHandle = context.true;\n\n try {\n context.setProp(errorHandle, \"code\", codeHandle);\n context.setProp(errorHandle, trustedHostErrorKey, trustedHostMarkerHandle);\n return errorHandle;\n } finally {\n codeHandle.dispose();\n trustedHostMarkerHandle.dispose();\n }\n}\n\n/**\n * Converts a guest QuickJS handle into a JSON-compatible host value.\n */\nexport function fromGuestHandle(\n context: QuickJSContext,\n handle: QuickJSHandle,\n): unknown {\n const guestType = context.typeof(handle);\n\n if (guestType === \"undefined\") {\n return undefined;\n }\n\n if (\n guestType === \"function\" ||\n guestType === \"symbol\" ||\n guestType === \"bigint\"\n ) {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n }\n\n const jsonHandle = context.getProp(context.global, \"JSON\");\n const stringifyHandle = context.getProp(jsonHandle, \"stringify\");\n\n try {\n const stringified = context.unwrapResult(\n context.callFunction(stringifyHandle, jsonHandle, handle),\n );\n const stringifiedType = context.typeof(stringified);\n\n if (stringifiedType === \"undefined\") {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n }\n\n const jsonValue = context.getString(stringified);\n return JSON.parse(jsonValue);\n } catch (error) {\n if (error instanceof ExecuteFailure) {\n throw error;\n }\n\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n } finally {\n stringifyHandle.dispose();\n jsonHandle.dispose();\n }\n}\n\n/**\n * Converts a host JSON-compatible value into a guest QuickJS handle.\n */\nexport function toGuestHandle(\n context: QuickJSContext,\n value: unknown,\n): QuickJSHandle {\n if (value === undefined) {\n return context.undefined;\n }\n\n const jsonValue = JSON.stringify(value);\n\n if (jsonValue === undefined) {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Host value is not JSON-serializable\",\n );\n }\n\n return context.unwrapResult(\n context.evalCode(`(${jsonValue})`, \"host-value.json\"),\n );\n}\n","/**\n * @packageDocumentation\n * Public API for the `@execbox/quickjs/runner` entrypoint.\n */\nimport { randomUUID } from \"node:crypto\";\n\nimport {\n RELEASE_SYNC,\n isFail,\n memoizePromiseFactory,\n newQuickJSWASMModule,\n shouldInterruptAfterDeadline,\n type QuickJSContext,\n type QuickJSHandle,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from \"quickjs-emscripten\";\n\nimport {\n ExecuteFailure,\n formatConsoleLine,\n getExecutionTimeoutMessage,\n isExecuteFailure,\n isKnownExecuteErrorCode,\n normalizeCode,\n normalizeThrownMessage,\n resolveExecutorRuntimeOptions,\n truncateLogs,\n} from \"@execbox/core/runtime\";\nimport type {\n ExecuteError,\n ExecuteResult,\n ExecutorRuntimeOptions,\n ProviderManifest,\n ToolCall,\n ToolCallResult,\n} from \"@execbox/core\";\n\nimport {\n createGuestErrorHandle,\n fromGuestHandle,\n toGuestHandle,\n} from \"../quickjsBridge.ts\";\nimport type { QuickJsInlineExecutorOptions } from \"../types.ts\";\n\nexport type {\n QuickJsExecutorHost,\n QuickJsExecutorOptions,\n QuickJsHostedMode,\n QuickJsInlineExecutorOptions,\n QuickJsWorkerExecutorOptions,\n WorkerResourceLimits,\n} from \"../types.ts\";\n\nconst loadDefaultModule = memoizePromiseFactory(() =>\n newQuickJSWASMModule(RELEASE_SYNC),\n);\n\n/**\n * Transport-neutral host tool call emitted from a QuickJS session.\n */\nexport type QuickJsSessionToolCall = ToolCall;\n\n/**\n * Input required to run one transport-backed QuickJS execution session.\n */\nexport interface QuickJsSessionRequest {\n /** Optional abort controller that should be triggered when execution stops. */\n abortController?: AbortController;\n\n /** Guest JavaScript source to evaluate inside QuickJS. */\n code: string;\n\n /** Host callback used to fulfill guest tool calls. */\n onToolCall: (call: ToolCall) => Promise<ToolCallResult> | ToolCallResult;\n\n /** Optional hook invoked once the guest runtime has started. */\n onStarted?: () => void;\n\n /** Transport-safe provider manifests exposed to the guest runtime. */\n providers: ProviderManifest[];\n\n /** Optional caller-owned abort signal for the session. */\n signal?: AbortSignal;\n}\n\n/**\n * Options controlling one transport-backed QuickJS session.\n */\nexport type QuickJsSessionOptions = ExecutorRuntimeOptions &\n Pick<QuickJsInlineExecutorOptions, \"loadModule\"> & {\n /** Optional preloaded QuickJS WASM module instance. */\n module?: QuickJSWASMModule;\n };\n\n/**\n * Converts unexpected executor failures into stable public result errors.\n */\nfunction toExecuteError(error: unknown, deadline: number): ExecuteError {\n if (isExecuteFailure(error)) {\n return {\n code: error.code,\n message: error.message,\n };\n }\n\n const message = normalizeThrownMessage(error);\n\n if (Date.now() > deadline || message.includes(\"interrupted\")) {\n return {\n code: \"timeout\",\n message: getExecutionTimeoutMessage(),\n };\n }\n\n if (message.toLowerCase().includes(\"out of memory\")) {\n return {\n code: \"memory_limit\",\n message,\n };\n }\n\n return {\n code: \"runtime_error\",\n message,\n };\n}\n\nfunction errorFromGuestHandle(\n context: QuickJSContext,\n handle: QuickJSHandle,\n trustedHostErrorKey: string,\n): ExecuteError {\n const codeHandle = context.getProp(handle, \"code\");\n const messageHandle = context.getProp(handle, \"message\");\n const trustedMarkerHandle = context.getProp(handle, trustedHostErrorKey);\n\n try {\n const code =\n context.typeof(codeHandle) === \"string\"\n ? context.getString(codeHandle)\n : undefined;\n const trustedHostError = context.typeof(trustedMarkerHandle) === \"boolean\";\n const message =\n context.typeof(messageHandle) === \"string\"\n ? context.getString(messageHandle)\n : normalizeThrownMessage(context.dump(handle));\n\n if (trustedHostError && isKnownExecuteErrorCode(code)) {\n return {\n code,\n message,\n };\n }\n\n return {\n code: \"runtime_error\",\n message,\n };\n } finally {\n codeHandle.dispose();\n messageHandle.dispose();\n trustedMarkerHandle.dispose();\n }\n}\n\nasync function waitForPromiseSettlement(\n runtime: QuickJSRuntime,\n promise: Promise<unknown>,\n deadline: number,\n trustedHostErrorKey: string,\n): Promise<void> {\n let settled = false;\n let rejection: unknown;\n\n promise.then(\n () => {\n settled = true;\n },\n (error) => {\n settled = true;\n rejection = error;\n },\n );\n\n while (!settled) {\n if (Date.now() > deadline) {\n throw new ExecuteFailure(\"timeout\", getExecutionTimeoutMessage());\n }\n\n const pendingJobsResult = runtime.executePendingJobs(-1);\n if (isFail(pendingJobsResult)) {\n const pendingError = pendingJobsResult.error;\n\n try {\n const executeError = errorFromGuestHandle(\n pendingError.context,\n pendingError,\n trustedHostErrorKey,\n );\n throw new ExecuteFailure(executeError.code, executeError.message);\n } finally {\n pendingError.dispose();\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n\n if (rejection !== undefined) {\n throw rejection;\n }\n}\n\nfunction injectConsole(context: QuickJSContext, logs: string[]): void {\n const consoleHandle = context.newObject();\n\n try {\n for (const methodName of [\"log\", \"info\", \"warn\", \"error\"]) {\n const methodHandle = context.newFunction(methodName, (...args) => {\n logs.push(formatConsoleLine(args.map((arg) => context.dump(arg))));\n return context.undefined;\n });\n\n context.setProp(consoleHandle, methodName, methodHandle);\n methodHandle.dispose();\n }\n\n context.setProp(context.global, \"console\", consoleHandle);\n } finally {\n consoleHandle.dispose();\n }\n}\n\nfunction injectProviders(\n context: QuickJSContext,\n providers: ProviderManifest[],\n signal: AbortSignal,\n trustedHostErrorKey: string,\n onToolCall: QuickJsSessionRequest[\"onToolCall\"],\n): void {\n for (const provider of providers) {\n const providerHandle = context.newObject();\n\n try {\n for (const [safeToolName] of Object.entries(provider.tools)) {\n const toolHandle = createToolHandle(\n context,\n provider.name,\n safeToolName,\n signal,\n trustedHostErrorKey,\n onToolCall,\n );\n context.setProp(providerHandle, safeToolName, toolHandle);\n toolHandle.dispose();\n }\n\n context.setProp(context.global, provider.name, providerHandle);\n } finally {\n providerHandle.dispose();\n }\n }\n}\n\nfunction createToolHandle(\n context: QuickJSContext,\n providerName: string,\n safeToolName: string,\n signal: AbortSignal,\n trustedHostErrorKey: string,\n onToolCall: QuickJsSessionRequest[\"onToolCall\"],\n): QuickJSHandle {\n return context.newFunction(safeToolName, (...args) => {\n const deferred = context.newPromise();\n const disposeDeferred = () => {\n if (context.alive && deferred.alive) {\n deferred.dispose();\n }\n };\n let input: unknown;\n\n try {\n input =\n args[0] === undefined ? undefined : fromGuestHandle(context, args[0]);\n } catch (error) {\n const executeError = isExecuteFailure(error)\n ? error\n : new ExecuteFailure(\n \"serialization_error\",\n \"Guest code passed a non-serializable tool input\",\n );\n const errorHandle = createGuestErrorHandle(\n context,\n executeError.code,\n executeError.message,\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n return deferred.handle;\n } finally {\n errorHandle.dispose();\n queueMicrotask(disposeDeferred);\n }\n }\n const onAbort = () => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n const errorHandle = createGuestErrorHandle(\n context,\n \"timeout\",\n getExecutionTimeoutMessage(),\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n } finally {\n errorHandle.dispose();\n disposeDeferred();\n }\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n let responsePromise: Promise<ToolCallResult>;\n\n try {\n if (signal.aborted) {\n throw new ExecuteFailure(\"timeout\", getExecutionTimeoutMessage());\n }\n\n responsePromise = Promise.resolve(\n onToolCall({\n input,\n providerName,\n safeToolName,\n }),\n );\n } catch (error) {\n responsePromise = Promise.reject(error);\n }\n\n void responsePromise\n .then((response) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n let resultHandle: QuickJSHandle | undefined;\n\n try {\n if (!response.ok) {\n const errorHandle = createGuestErrorHandle(\n context,\n response.error.code,\n response.error.message,\n trustedHostErrorKey,\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n return;\n }\n\n resultHandle = toGuestHandle(context, response.result);\n deferred.resolve(resultHandle);\n } finally {\n resultHandle?.dispose();\n disposeDeferred();\n }\n })\n .catch((error) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n const errorHandle = createGuestErrorHandle(\n context,\n isExecuteFailure(error) ? error.code : \"internal_error\",\n normalizeThrownMessage(error),\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n } finally {\n errorHandle.dispose();\n disposeDeferred();\n }\n });\n\n return deferred.handle;\n });\n}\n\n/**\n * Runs one QuickJS-backed execution session using a transport-neutral tool callback.\n */\nexport async function runQuickJsSession(\n request: QuickJsSessionRequest,\n options: QuickJsSessionOptions = {},\n): Promise<ExecuteResult> {\n const runtimeOptions = resolveExecutorRuntimeOptions(options);\n const loadModule = async () => {\n if (options.module) {\n return options.module;\n }\n\n const loaded = options.loadModule\n ? await options.loadModule()\n : await loadDefaultModule();\n return loaded as QuickJSWASMModule;\n };\n const { maxLogChars, maxLogLines, memoryLimitBytes, timeoutMs } =\n runtimeOptions;\n const startedAt = Date.now();\n const logs: string[] = [];\n const abortController = new AbortController();\n const trustedHostErrorKey = `__execboxHostError_${randomUUID()}`;\n const signal =\n request.abortController?.signal ?? request.signal ?? abortController.signal;\n const module = await loadModule();\n const runtime = module.newRuntime();\n let deadline = Number.POSITIVE_INFINITY;\n runtime.setMemoryLimit(memoryLimitBytes);\n const context = runtime.newContext();\n\n try {\n injectConsole(context, logs);\n injectProviders(\n context,\n request.providers,\n signal,\n trustedHostErrorKey,\n request.onToolCall,\n );\n const executionStartedAt = Date.now();\n deadline = executionStartedAt + timeoutMs;\n const shouldInterrupt = shouldInterruptAfterDeadline(deadline);\n runtime.setInterruptHandler((currentRuntime) => {\n return signal.aborted || shouldInterrupt(currentRuntime);\n });\n request.onStarted?.();\n\n const executableSource = normalizeCode(request.code);\n const functionHandle = context.unwrapResult(\n context.evalCode(`(${executableSource})`, \"sandbox-user-code.js\"),\n );\n\n try {\n const promiseHandle = context.unwrapResult(\n context.callFunction(functionHandle, context.undefined),\n );\n\n try {\n const promiseResult = context.resolvePromise(promiseHandle);\n await waitForPromiseSettlement(\n runtime,\n promiseResult,\n deadline,\n trustedHostErrorKey,\n );\n const settledResult = await promiseResult;\n\n if (isFail(settledResult)) {\n const errorHandle = settledResult.error;\n\n try {\n return {\n durationMs: Date.now() - startedAt,\n error: errorFromGuestHandle(\n context,\n errorHandle,\n trustedHostErrorKey,\n ),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n errorHandle.dispose();\n }\n }\n\n try {\n const value = fromGuestHandle(context, settledResult.value);\n\n return {\n durationMs: Date.now() - startedAt,\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: true,\n result: value,\n };\n } catch (error) {\n return {\n durationMs: Date.now() - startedAt,\n error: toExecuteError(error, deadline),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n settledResult.value.dispose();\n }\n } finally {\n promiseHandle.dispose();\n }\n } finally {\n functionHandle.dispose();\n }\n } catch (error) {\n abortController.abort();\n\n return {\n durationMs: Date.now() - startedAt,\n error: toExecuteError(error, deadline),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n request.abortController?.abort();\n abortController.abort();\n context.dispose();\n runtime.dispose();\n }\n}\n"],"mappings":"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"}
@@ -340,4 +340,4 @@ async function runQuickJsSession(request, options = {}) {
340
340
 
341
341
  //#endregion
342
342
  export { runQuickJsSession as t };
343
- //# sourceMappingURL=runner-DJ5AWw-k.js.map
343
+ //# sourceMappingURL=runner-oZXbguX3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-oZXbguX3.js","names":["rejection: unknown","input: unknown","responsePromise: Promise<ToolCallResult>","resultHandle: QuickJSHandle | undefined","logs: string[]"],"sources":["../src/quickjsBridge.ts","../src/runner/index.ts"],"sourcesContent":["import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\n\nimport { ExecuteFailure } from \"@execbox/core/runtime\";\nimport type { ExecuteErrorCode } from \"@execbox/core\";\n\n/**\n * Creates a guest-visible error object that carries a trusted host error code marker.\n */\nexport function createGuestErrorHandle(\n context: QuickJSContext,\n code: ExecuteErrorCode,\n message: string,\n trustedHostErrorKey: string,\n): QuickJSHandle {\n const errorHandle = context.newError({ message, name: \"Error\" });\n const codeHandle = context.newString(code);\n const trustedHostMarkerHandle = context.true;\n\n try {\n context.setProp(errorHandle, \"code\", codeHandle);\n context.setProp(errorHandle, trustedHostErrorKey, trustedHostMarkerHandle);\n return errorHandle;\n } finally {\n codeHandle.dispose();\n trustedHostMarkerHandle.dispose();\n }\n}\n\n/**\n * Converts a guest QuickJS handle into a JSON-compatible host value.\n */\nexport function fromGuestHandle(\n context: QuickJSContext,\n handle: QuickJSHandle,\n): unknown {\n const guestType = context.typeof(handle);\n\n if (guestType === \"undefined\") {\n return undefined;\n }\n\n if (\n guestType === \"function\" ||\n guestType === \"symbol\" ||\n guestType === \"bigint\"\n ) {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n }\n\n const jsonHandle = context.getProp(context.global, \"JSON\");\n const stringifyHandle = context.getProp(jsonHandle, \"stringify\");\n\n try {\n const stringified = context.unwrapResult(\n context.callFunction(stringifyHandle, jsonHandle, handle),\n );\n const stringifiedType = context.typeof(stringified);\n\n if (stringifiedType === \"undefined\") {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n }\n\n const jsonValue = context.getString(stringified);\n return JSON.parse(jsonValue);\n } catch (error) {\n if (error instanceof ExecuteFailure) {\n throw error;\n }\n\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n } finally {\n stringifyHandle.dispose();\n jsonHandle.dispose();\n }\n}\n\n/**\n * Converts a host JSON-compatible value into a guest QuickJS handle.\n */\nexport function toGuestHandle(\n context: QuickJSContext,\n value: unknown,\n): QuickJSHandle {\n if (value === undefined) {\n return context.undefined;\n }\n\n const jsonValue = JSON.stringify(value);\n\n if (jsonValue === undefined) {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Host value is not JSON-serializable\",\n );\n }\n\n return context.unwrapResult(\n context.evalCode(`(${jsonValue})`, \"host-value.json\"),\n );\n}\n","/**\n * @packageDocumentation\n * Public API for the `@execbox/quickjs/runner` entrypoint.\n */\nimport { randomUUID } from \"node:crypto\";\n\nimport {\n RELEASE_SYNC,\n isFail,\n memoizePromiseFactory,\n newQuickJSWASMModule,\n shouldInterruptAfterDeadline,\n type QuickJSContext,\n type QuickJSHandle,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from \"quickjs-emscripten\";\n\nimport {\n ExecuteFailure,\n formatConsoleLine,\n getExecutionTimeoutMessage,\n isExecuteFailure,\n isKnownExecuteErrorCode,\n normalizeCode,\n normalizeThrownMessage,\n resolveExecutorRuntimeOptions,\n truncateLogs,\n} from \"@execbox/core/runtime\";\nimport type {\n ExecuteError,\n ExecuteResult,\n ExecutorRuntimeOptions,\n ProviderManifest,\n ToolCall,\n ToolCallResult,\n} from \"@execbox/core\";\n\nimport {\n createGuestErrorHandle,\n fromGuestHandle,\n toGuestHandle,\n} from \"../quickjsBridge.ts\";\nimport type { QuickJsInlineExecutorOptions } from \"../types.ts\";\n\nexport type {\n QuickJsExecutorHost,\n QuickJsExecutorOptions,\n QuickJsHostedMode,\n QuickJsInlineExecutorOptions,\n QuickJsWorkerExecutorOptions,\n WorkerResourceLimits,\n} from \"../types.ts\";\n\nconst loadDefaultModule = memoizePromiseFactory(() =>\n newQuickJSWASMModule(RELEASE_SYNC),\n);\n\n/**\n * Transport-neutral host tool call emitted from a QuickJS session.\n */\nexport type QuickJsSessionToolCall = ToolCall;\n\n/**\n * Input required to run one transport-backed QuickJS execution session.\n */\nexport interface QuickJsSessionRequest {\n /** Optional abort controller that should be triggered when execution stops. */\n abortController?: AbortController;\n\n /** Guest JavaScript source to evaluate inside QuickJS. */\n code: string;\n\n /** Host callback used to fulfill guest tool calls. */\n onToolCall: (call: ToolCall) => Promise<ToolCallResult> | ToolCallResult;\n\n /** Optional hook invoked once the guest runtime has started. */\n onStarted?: () => void;\n\n /** Transport-safe provider manifests exposed to the guest runtime. */\n providers: ProviderManifest[];\n\n /** Optional caller-owned abort signal for the session. */\n signal?: AbortSignal;\n}\n\n/**\n * Options controlling one transport-backed QuickJS session.\n */\nexport type QuickJsSessionOptions = ExecutorRuntimeOptions &\n Pick<QuickJsInlineExecutorOptions, \"loadModule\"> & {\n /** Optional preloaded QuickJS WASM module instance. */\n module?: QuickJSWASMModule;\n };\n\n/**\n * Converts unexpected executor failures into stable public result errors.\n */\nfunction toExecuteError(error: unknown, deadline: number): ExecuteError {\n if (isExecuteFailure(error)) {\n return {\n code: error.code,\n message: error.message,\n };\n }\n\n const message = normalizeThrownMessage(error);\n\n if (Date.now() > deadline || message.includes(\"interrupted\")) {\n return {\n code: \"timeout\",\n message: getExecutionTimeoutMessage(),\n };\n }\n\n if (message.toLowerCase().includes(\"out of memory\")) {\n return {\n code: \"memory_limit\",\n message,\n };\n }\n\n return {\n code: \"runtime_error\",\n message,\n };\n}\n\nfunction errorFromGuestHandle(\n context: QuickJSContext,\n handle: QuickJSHandle,\n trustedHostErrorKey: string,\n): ExecuteError {\n const codeHandle = context.getProp(handle, \"code\");\n const messageHandle = context.getProp(handle, \"message\");\n const trustedMarkerHandle = context.getProp(handle, trustedHostErrorKey);\n\n try {\n const code =\n context.typeof(codeHandle) === \"string\"\n ? context.getString(codeHandle)\n : undefined;\n const trustedHostError = context.typeof(trustedMarkerHandle) === \"boolean\";\n const message =\n context.typeof(messageHandle) === \"string\"\n ? context.getString(messageHandle)\n : normalizeThrownMessage(context.dump(handle));\n\n if (trustedHostError && isKnownExecuteErrorCode(code)) {\n return {\n code,\n message,\n };\n }\n\n return {\n code: \"runtime_error\",\n message,\n };\n } finally {\n codeHandle.dispose();\n messageHandle.dispose();\n trustedMarkerHandle.dispose();\n }\n}\n\nasync function waitForPromiseSettlement(\n runtime: QuickJSRuntime,\n promise: Promise<unknown>,\n deadline: number,\n trustedHostErrorKey: string,\n): Promise<void> {\n let settled = false;\n let rejection: unknown;\n\n promise.then(\n () => {\n settled = true;\n },\n (error) => {\n settled = true;\n rejection = error;\n },\n );\n\n while (!settled) {\n if (Date.now() > deadline) {\n throw new ExecuteFailure(\"timeout\", getExecutionTimeoutMessage());\n }\n\n const pendingJobsResult = runtime.executePendingJobs(-1);\n if (isFail(pendingJobsResult)) {\n const pendingError = pendingJobsResult.error;\n\n try {\n const executeError = errorFromGuestHandle(\n pendingError.context,\n pendingError,\n trustedHostErrorKey,\n );\n throw new ExecuteFailure(executeError.code, executeError.message);\n } finally {\n pendingError.dispose();\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n\n if (rejection !== undefined) {\n throw rejection;\n }\n}\n\nfunction injectConsole(context: QuickJSContext, logs: string[]): void {\n const consoleHandle = context.newObject();\n\n try {\n for (const methodName of [\"log\", \"info\", \"warn\", \"error\"]) {\n const methodHandle = context.newFunction(methodName, (...args) => {\n logs.push(formatConsoleLine(args.map((arg) => context.dump(arg))));\n return context.undefined;\n });\n\n context.setProp(consoleHandle, methodName, methodHandle);\n methodHandle.dispose();\n }\n\n context.setProp(context.global, \"console\", consoleHandle);\n } finally {\n consoleHandle.dispose();\n }\n}\n\nfunction injectProviders(\n context: QuickJSContext,\n providers: ProviderManifest[],\n signal: AbortSignal,\n trustedHostErrorKey: string,\n onToolCall: QuickJsSessionRequest[\"onToolCall\"],\n): void {\n for (const provider of providers) {\n const providerHandle = context.newObject();\n\n try {\n for (const [safeToolName] of Object.entries(provider.tools)) {\n const toolHandle = createToolHandle(\n context,\n provider.name,\n safeToolName,\n signal,\n trustedHostErrorKey,\n onToolCall,\n );\n context.setProp(providerHandle, safeToolName, toolHandle);\n toolHandle.dispose();\n }\n\n context.setProp(context.global, provider.name, providerHandle);\n } finally {\n providerHandle.dispose();\n }\n }\n}\n\nfunction createToolHandle(\n context: QuickJSContext,\n providerName: string,\n safeToolName: string,\n signal: AbortSignal,\n trustedHostErrorKey: string,\n onToolCall: QuickJsSessionRequest[\"onToolCall\"],\n): QuickJSHandle {\n return context.newFunction(safeToolName, (...args) => {\n const deferred = context.newPromise();\n const disposeDeferred = () => {\n if (context.alive && deferred.alive) {\n deferred.dispose();\n }\n };\n let input: unknown;\n\n try {\n input =\n args[0] === undefined ? undefined : fromGuestHandle(context, args[0]);\n } catch (error) {\n const executeError = isExecuteFailure(error)\n ? error\n : new ExecuteFailure(\n \"serialization_error\",\n \"Guest code passed a non-serializable tool input\",\n );\n const errorHandle = createGuestErrorHandle(\n context,\n executeError.code,\n executeError.message,\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n return deferred.handle;\n } finally {\n errorHandle.dispose();\n queueMicrotask(disposeDeferred);\n }\n }\n const onAbort = () => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n const errorHandle = createGuestErrorHandle(\n context,\n \"timeout\",\n getExecutionTimeoutMessage(),\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n } finally {\n errorHandle.dispose();\n disposeDeferred();\n }\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n let responsePromise: Promise<ToolCallResult>;\n\n try {\n if (signal.aborted) {\n throw new ExecuteFailure(\"timeout\", getExecutionTimeoutMessage());\n }\n\n responsePromise = Promise.resolve(\n onToolCall({\n input,\n providerName,\n safeToolName,\n }),\n );\n } catch (error) {\n responsePromise = Promise.reject(error);\n }\n\n void responsePromise\n .then((response) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n let resultHandle: QuickJSHandle | undefined;\n\n try {\n if (!response.ok) {\n const errorHandle = createGuestErrorHandle(\n context,\n response.error.code,\n response.error.message,\n trustedHostErrorKey,\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n return;\n }\n\n resultHandle = toGuestHandle(context, response.result);\n deferred.resolve(resultHandle);\n } finally {\n resultHandle?.dispose();\n disposeDeferred();\n }\n })\n .catch((error) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n const errorHandle = createGuestErrorHandle(\n context,\n isExecuteFailure(error) ? error.code : \"internal_error\",\n normalizeThrownMessage(error),\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n } finally {\n errorHandle.dispose();\n disposeDeferred();\n }\n });\n\n return deferred.handle;\n });\n}\n\n/**\n * Runs one QuickJS-backed execution session using a transport-neutral tool callback.\n */\nexport async function runQuickJsSession(\n request: QuickJsSessionRequest,\n options: QuickJsSessionOptions = {},\n): Promise<ExecuteResult> {\n const runtimeOptions = resolveExecutorRuntimeOptions(options);\n const loadModule = async () => {\n if (options.module) {\n return options.module;\n }\n\n const loaded = options.loadModule\n ? await options.loadModule()\n : await loadDefaultModule();\n return loaded as QuickJSWASMModule;\n };\n const { maxLogChars, maxLogLines, memoryLimitBytes, timeoutMs } =\n runtimeOptions;\n const startedAt = Date.now();\n const logs: string[] = [];\n const abortController = new AbortController();\n const trustedHostErrorKey = `__execboxHostError_${randomUUID()}`;\n const signal =\n request.abortController?.signal ?? request.signal ?? abortController.signal;\n const module = await loadModule();\n const runtime = module.newRuntime();\n let deadline = Number.POSITIVE_INFINITY;\n runtime.setMemoryLimit(memoryLimitBytes);\n const context = runtime.newContext();\n\n try {\n injectConsole(context, logs);\n injectProviders(\n context,\n request.providers,\n signal,\n trustedHostErrorKey,\n request.onToolCall,\n );\n const executionStartedAt = Date.now();\n deadline = executionStartedAt + timeoutMs;\n const shouldInterrupt = shouldInterruptAfterDeadline(deadline);\n runtime.setInterruptHandler((currentRuntime) => {\n return signal.aborted || shouldInterrupt(currentRuntime);\n });\n request.onStarted?.();\n\n const executableSource = normalizeCode(request.code);\n const functionHandle = context.unwrapResult(\n context.evalCode(`(${executableSource})`, \"sandbox-user-code.js\"),\n );\n\n try {\n const promiseHandle = context.unwrapResult(\n context.callFunction(functionHandle, context.undefined),\n );\n\n try {\n const promiseResult = context.resolvePromise(promiseHandle);\n await waitForPromiseSettlement(\n runtime,\n promiseResult,\n deadline,\n trustedHostErrorKey,\n );\n const settledResult = await promiseResult;\n\n if (isFail(settledResult)) {\n const errorHandle = settledResult.error;\n\n try {\n return {\n durationMs: Date.now() - startedAt,\n error: errorFromGuestHandle(\n context,\n errorHandle,\n trustedHostErrorKey,\n ),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n errorHandle.dispose();\n }\n }\n\n try {\n const value = fromGuestHandle(context, settledResult.value);\n\n return {\n durationMs: Date.now() - startedAt,\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: true,\n result: value,\n };\n } catch (error) {\n return {\n durationMs: Date.now() - startedAt,\n error: toExecuteError(error, deadline),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n settledResult.value.dispose();\n }\n } finally {\n promiseHandle.dispose();\n }\n } finally {\n functionHandle.dispose();\n }\n } catch (error) {\n abortController.abort();\n\n return {\n durationMs: Date.now() - startedAt,\n error: toExecuteError(error, deadline),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n request.abortController?.abort();\n abortController.abort();\n context.dispose();\n runtime.dispose();\n }\n}\n"],"mappings":"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"}
@@ -9,9 +9,9 @@ import { ExecutorPoolOptions, ExecutorRuntimeOptions } from "@execbox/core";
9
9
  /**
10
10
  * Host boundary options available to the QuickJS executor.
11
11
  */
12
- type QuickJsExecutorHost = "inline" | "worker" | "process";
12
+ type QuickJsExecutorHost = "inline" | "worker";
13
13
  /**
14
- * Lifecycle modes for hosted QuickJS shells.
14
+ * Lifecycle modes for worker-hosted QuickJS shells.
15
15
  */
16
16
  type QuickJsHostedMode = "pooled" | "ephemeral";
17
17
  /**
@@ -40,32 +40,19 @@ interface QuickJsInlineExecutorOptions extends ExecutorRuntimeOptions {
40
40
  interface QuickJsWorkerExecutorOptions extends ExecutorRuntimeOptions {
41
41
  /** Uses a worker thread to host each QuickJS runtime. */
42
42
  host: "worker";
43
- /** Time to wait before forcefully tearing down a hung hosted shell. */
43
+ /** Time to wait before forcefully tearing down a hung worker shell. */
44
44
  cancelGraceMs?: number;
45
- /** Whether to reuse hosted shells or spawn a fresh one per execution. */
45
+ /** Whether to reuse worker shells or spawn a fresh one per execution. */
46
46
  mode?: QuickJsHostedMode;
47
- /** Pool sizing and idle-eviction settings for pooled hosted shells. */
47
+ /** Pool sizing and idle-eviction settings for pooled worker shells. */
48
48
  pool?: ExecutorPoolOptions;
49
49
  /** Optional worker thread V8 limits used as a coarse safety backstop. */
50
50
  workerResourceLimits?: WorkerResourceLimits;
51
51
  }
52
- /**
53
- * Options for constructing a process-backed QuickJS executor.
54
- */
55
- interface QuickJsProcessExecutorOptions extends ExecutorRuntimeOptions {
56
- /** Uses a child process to host each QuickJS runtime. */
57
- host: "process";
58
- /** Time to wait before forcefully tearing down a hung hosted shell. */
59
- cancelGraceMs?: number;
60
- /** Whether to reuse hosted shells or spawn a fresh one per execution. */
61
- mode?: QuickJsHostedMode;
62
- /** Pool sizing and idle-eviction settings for pooled hosted shells. */
63
- pool?: ExecutorPoolOptions;
64
- }
65
52
  /**
66
53
  * Options for constructing a QuickJS executor.
67
54
  */
68
- type QuickJsExecutorOptions = QuickJsInlineExecutorOptions | QuickJsWorkerExecutorOptions | QuickJsProcessExecutorOptions;
55
+ type QuickJsExecutorOptions = QuickJsInlineExecutorOptions | QuickJsWorkerExecutorOptions;
69
56
  //#endregion
70
- export { QuickJsProcessExecutorOptions as a, QuickJsInlineExecutorOptions as i, QuickJsExecutorOptions as n, QuickJsWorkerExecutorOptions as o, QuickJsHostedMode as r, WorkerResourceLimits as s, QuickJsExecutorHost as t };
71
- //# sourceMappingURL=types-7wOdERLE.d.ts.map
57
+ export { QuickJsWorkerExecutorOptions as a, QuickJsInlineExecutorOptions as i, QuickJsExecutorOptions as n, WorkerResourceLimits as o, QuickJsHostedMode as r, QuickJsExecutorHost as t };
58
+ //# sourceMappingURL=types-C-XfFJ7u.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-C-XfFJ7u.d.cts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAQA,CAAA,CAAA;AAKY,IAAA,CALA,mBAAA,CAAA,CAAA,CAKiB,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA;AAK7B,CAAA,CAAA;AAYA,CAAA,CAAA,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA;AAWA,CAAA,CAAA;AAQS,IAAA,CApCG,iBAAA,CAAA,CAAA,CAoCH,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA;;;;AARmE,SAAA,CAvB3D,oBAAA,CAuB2D;EAoBhE,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,IAAA,CAAA,EAAA,CAAA,GAAA,CAAA,GAAA,CAAA,UAAA,CAAA,IAAA,CAAA,EAAA,CAAA,SAAA,CAAA,CAAA,CAAA;;;;;;;;;;UA/BK,4BAAA,CAAA,OAAA,CAAqC;;;;qBAKjC;;;;;UAMJ,4BAAA,CAAA,OAAA,CAAqC;;;;;;SAQ7C;;SAGA;;yBAGgB;;;;;KAMb,sBAAA,CAAA,CAAA,CACR,+BACA"}
@@ -9,9 +9,9 @@ import { ExecutorPoolOptions, ExecutorRuntimeOptions } from "@execbox/core";
9
9
  /**
10
10
  * Host boundary options available to the QuickJS executor.
11
11
  */
12
- type QuickJsExecutorHost = "inline" | "worker" | "process";
12
+ type QuickJsExecutorHost = "inline" | "worker";
13
13
  /**
14
- * Lifecycle modes for hosted QuickJS shells.
14
+ * Lifecycle modes for worker-hosted QuickJS shells.
15
15
  */
16
16
  type QuickJsHostedMode = "pooled" | "ephemeral";
17
17
  /**
@@ -40,32 +40,19 @@ interface QuickJsInlineExecutorOptions extends ExecutorRuntimeOptions {
40
40
  interface QuickJsWorkerExecutorOptions extends ExecutorRuntimeOptions {
41
41
  /** Uses a worker thread to host each QuickJS runtime. */
42
42
  host: "worker";
43
- /** Time to wait before forcefully tearing down a hung hosted shell. */
43
+ /** Time to wait before forcefully tearing down a hung worker shell. */
44
44
  cancelGraceMs?: number;
45
- /** Whether to reuse hosted shells or spawn a fresh one per execution. */
45
+ /** Whether to reuse worker shells or spawn a fresh one per execution. */
46
46
  mode?: QuickJsHostedMode;
47
- /** Pool sizing and idle-eviction settings for pooled hosted shells. */
47
+ /** Pool sizing and idle-eviction settings for pooled worker shells. */
48
48
  pool?: ExecutorPoolOptions;
49
49
  /** Optional worker thread V8 limits used as a coarse safety backstop. */
50
50
  workerResourceLimits?: WorkerResourceLimits;
51
51
  }
52
- /**
53
- * Options for constructing a process-backed QuickJS executor.
54
- */
55
- interface QuickJsProcessExecutorOptions extends ExecutorRuntimeOptions {
56
- /** Uses a child process to host each QuickJS runtime. */
57
- host: "process";
58
- /** Time to wait before forcefully tearing down a hung hosted shell. */
59
- cancelGraceMs?: number;
60
- /** Whether to reuse hosted shells or spawn a fresh one per execution. */
61
- mode?: QuickJsHostedMode;
62
- /** Pool sizing and idle-eviction settings for pooled hosted shells. */
63
- pool?: ExecutorPoolOptions;
64
- }
65
52
  /**
66
53
  * Options for constructing a QuickJS executor.
67
54
  */
68
- type QuickJsExecutorOptions = QuickJsInlineExecutorOptions | QuickJsWorkerExecutorOptions | QuickJsProcessExecutorOptions;
55
+ type QuickJsExecutorOptions = QuickJsInlineExecutorOptions | QuickJsWorkerExecutorOptions;
69
56
  //#endregion
70
- export { QuickJsProcessExecutorOptions as a, QuickJsInlineExecutorOptions as i, QuickJsExecutorOptions as n, QuickJsWorkerExecutorOptions as o, QuickJsHostedMode as r, WorkerResourceLimits as s, QuickJsExecutorHost as t };
71
- //# sourceMappingURL=types-BMA2zKnX.d.cts.map
57
+ export { QuickJsWorkerExecutorOptions as a, QuickJsInlineExecutorOptions as i, QuickJsExecutorOptions as n, WorkerResourceLimits as o, QuickJsHostedMode as r, QuickJsExecutorHost as t };
58
+ //# sourceMappingURL=types-CE7SvejR.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-CE7SvejR.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAQA,CAAA,CAAA;AAKY,IAAA,CALA,mBAAA,CAAA,CAAA,CAKiB,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA;AAK7B,CAAA,CAAA;AAYA,CAAA,CAAA,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA;AAWA,CAAA,CAAA;AAQS,IAAA,CApCG,iBAAA,CAAA,CAAA,CAoCH,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA;;;;AARmE,SAAA,CAvB3D,oBAAA,CAuB2D;EAoBhE,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,IAAA,CAAA,EAAA,CAAA,GAAA,CAAA,GAAA,CAAA,UAAA,CAAA,IAAA,CAAA,EAAA,CAAA,SAAA,CAAA,CAAA,CAAA;;;;;;;;;;UA/BK,4BAAA,CAAA,OAAA,CAAqC;;;;qBAKjC;;;;;UAMJ,4BAAA,CAAA,OAAA,CAAqC;;;;;;SAQ7C;;SAGA;;yBAGgB;;;;;KAMb,sBAAA,CAAA,CAAA,CACR,+BACA"}
@@ -1,5 +1,5 @@
1
1
  require('./runner-DRLfwiqY.cjs');
2
- const require_protocolEndpoint = require('./protocolEndpoint-ByylXGle.cjs');
2
+ const require_protocolEndpoint = require('./protocolEndpoint-BGyrwlr_.cjs');
3
3
  let node_worker_threads = require("node:worker_threads");
4
4
 
5
5
  //#region src/workerEntry.ts
@@ -1,5 +1,5 @@
1
- import "./runner-DJ5AWw-k.js";
2
- import { t as attachQuickJsProtocolEndpoint } from "./protocolEndpoint-CwyUhKrN.js";
1
+ import "./runner-oZXbguX3.js";
2
+ import { t as attachQuickJsProtocolEndpoint } from "./protocolEndpoint-Ceadcq_L.js";
3
3
  import { parentPort } from "node:worker_threads";
4
4
 
5
5
  //#region src/workerEntry.ts
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@execbox/quickjs",
3
- "version": "0.5.0",
4
- "description": "QuickJS executor for the execbox core package across inline, worker, and process hosts.",
3
+ "version": "0.6.0",
4
+ "description": "QuickJS executor for the execbox core package across inline and worker hosts.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "engines": {
@@ -1,17 +0,0 @@
1
- require('./runner-DRLfwiqY.cjs');
2
- const require_protocolEndpoint = require('./protocolEndpoint-ByylXGle.cjs');
3
-
4
- //#region src/processEntry.ts
5
- if (typeof process.send !== "function") throw new Error("QuickJsExecutor process host requires a child process IPC channel");
6
- require_protocolEndpoint.attachQuickJsProtocolEndpoint({
7
- onMessage(handler) {
8
- process.on("message", handler);
9
- return () => process.off("message", handler);
10
- },
11
- send(message) {
12
- process.send?.(message);
13
- }
14
- });
15
-
16
- //#endregion
17
- //# sourceMappingURL=processEntry.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"processEntry.cjs","names":["attachQuickJsProtocolEndpoint"],"sources":["../src/processEntry.ts"],"sourcesContent":["import type { DispatcherMessage, RunnerMessage } from \"@execbox/core/protocol\";\n\nimport { attachQuickJsProtocolEndpoint } from \"./runner/protocolEndpoint.ts\";\n\nif (typeof process.send !== \"function\") {\n throw new Error(\n \"QuickJsExecutor process host requires a child process IPC channel\",\n );\n}\n\nattachQuickJsProtocolEndpoint({\n onMessage(handler: (message: DispatcherMessage) => void): () => void {\n process.on(\"message\", handler);\n return () => process.off(\"message\", handler);\n },\n send(message: RunnerMessage): void {\n process.send?.(message);\n },\n});\n"],"mappings":";;;;AAIA,IAAI,OAAO,QAAQ,SAAS,WAC1B,OAAM,IAAI,MACR,oEACD;AAGHA,uDAA8B;CAC5B,UAAU,SAA2D;AACnE,UAAQ,GAAG,WAAW,QAAQ;AAC9B,eAAa,QAAQ,IAAI,WAAW,QAAQ;;CAE9C,KAAK,SAA8B;AACjC,UAAQ,OAAO,QAAQ;;CAE1B,CAAC"}
@@ -1,5 +0,0 @@
1
- /**
2
- * @packageDocumentation
3
- * Public TypeScript declarations for this package entrypoint.
4
- */
5
- export { };
@@ -1,5 +0,0 @@
1
- /**
2
- * @packageDocumentation
3
- * Public TypeScript declarations for this package entrypoint.
4
- */
5
- export { };
@@ -1,18 +0,0 @@
1
- import "./runner-DJ5AWw-k.js";
2
- import { t as attachQuickJsProtocolEndpoint } from "./protocolEndpoint-CwyUhKrN.js";
3
-
4
- //#region src/processEntry.ts
5
- if (typeof process.send !== "function") throw new Error("QuickJsExecutor process host requires a child process IPC channel");
6
- attachQuickJsProtocolEndpoint({
7
- onMessage(handler) {
8
- process.on("message", handler);
9
- return () => process.off("message", handler);
10
- },
11
- send(message) {
12
- process.send?.(message);
13
- }
14
- });
15
-
16
- //#endregion
17
- export { };
18
- //# sourceMappingURL=processEntry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"processEntry.js","names":[],"sources":["../src/processEntry.ts"],"sourcesContent":["import type { DispatcherMessage, RunnerMessage } from \"@execbox/core/protocol\";\n\nimport { attachQuickJsProtocolEndpoint } from \"./runner/protocolEndpoint.ts\";\n\nif (typeof process.send !== \"function\") {\n throw new Error(\n \"QuickJsExecutor process host requires a child process IPC channel\",\n );\n}\n\nattachQuickJsProtocolEndpoint({\n onMessage(handler: (message: DispatcherMessage) => void): () => void {\n process.on(\"message\", handler);\n return () => process.off(\"message\", handler);\n },\n send(message: RunnerMessage): void {\n process.send?.(message);\n },\n});\n"],"mappings":";;;;AAIA,IAAI,OAAO,QAAQ,SAAS,WAC1B,OAAM,IAAI,MACR,oEACD;AAGH,8BAA8B;CAC5B,UAAU,SAA2D;AACnE,UAAQ,GAAG,WAAW,QAAQ;AAC9B,eAAa,QAAQ,IAAI,WAAW,QAAQ;;CAE9C,KAAK,SAA8B;AACjC,UAAQ,OAAO,QAAQ;;CAE1B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocolEndpoint-ByylXGle.cjs","names":["activeAbortController: AbortController | undefined","activeExecutionId: string | undefined","runQuickJsSession"],"sources":["../src/runner/protocolEndpoint.ts"],"sourcesContent":["/**\n * @packageDocumentation\n * Public API for the `@execbox/quickjs/runner/protocol-endpoint` entrypoint.\n */\nimport { randomUUID } from \"node:crypto\";\n\nimport { isDispatcherMessage } from \"@execbox/core/protocol\";\nimport type {\n DispatcherMessage,\n ExecuteMessage,\n RunnerMessage,\n} from \"@execbox/core/protocol\";\nimport type { ToolCallResult } from \"@execbox/core\";\n\nimport { runQuickJsSession } from \"./index.ts\";\n\n/**\n * Minimal worker/process-side port used by the shared QuickJS protocol endpoint.\n */\nexport interface QuickJsProtocolPort {\n onMessage(handler: (message: DispatcherMessage) => void): void | (() => void);\n send(message: RunnerMessage): void;\n}\n\n/**\n * Attaches the shared QuickJS protocol loop to a worker/process messaging port.\n */\nexport function attachQuickJsProtocolEndpoint(\n port: QuickJsProtocolPort,\n): () => void {\n const pendingToolCalls = new Map<string, (result: ToolCallResult) => void>();\n let activeAbortController: AbortController | undefined;\n let activeExecutionId: string | undefined;\n\n async function startExecution(message: ExecuteMessage): Promise<void> {\n if (activeExecutionId) {\n port.send({\n durationMs: 0,\n error: {\n code: \"internal_error\",\n message: \"QuickJS endpoint already has an active execution\",\n },\n id: message.id,\n logs: [],\n ok: false,\n type: \"done\",\n });\n return;\n }\n\n const abortController = new AbortController();\n activeAbortController = abortController;\n activeExecutionId = message.id;\n\n try {\n const result = await runQuickJsSession(\n {\n abortController,\n code: message.code,\n onStarted: () => {\n port.send({\n id: message.id,\n type: \"started\",\n });\n },\n onToolCall: (call) =>\n new Promise<ToolCallResult>((resolve) => {\n const callId = randomUUID();\n pendingToolCalls.set(callId, resolve);\n port.send({\n ...call,\n callId,\n type: \"tool_call\",\n });\n }),\n providers: message.providers,\n },\n message.options,\n );\n\n port.send({\n ...result,\n id: message.id,\n type: \"done\",\n });\n } catch (error) {\n port.send({\n durationMs: 0,\n error: {\n code: \"internal_error\",\n message: error instanceof Error ? error.message : String(error),\n },\n id: message.id,\n logs: [],\n ok: false,\n type: \"done\",\n });\n } finally {\n pendingToolCalls.clear();\n activeAbortController = undefined;\n activeExecutionId = undefined;\n }\n }\n\n const maybeDetach = port.onMessage((message: DispatcherMessage) => {\n if (!isDispatcherMessage(message)) {\n return;\n }\n\n switch (message.type) {\n case \"cancel\":\n if (message.id === activeExecutionId) {\n activeAbortController?.abort();\n }\n break;\n case \"execute\":\n void startExecution(message);\n break;\n case \"tool_result\": {\n const resolve = pendingToolCalls.get(message.callId);\n pendingToolCalls.delete(message.callId);\n resolve?.(message);\n break;\n }\n }\n });\n\n return () => {\n if (typeof maybeDetach === \"function\") {\n maybeDetach();\n }\n pendingToolCalls.clear();\n activeAbortController?.abort();\n activeAbortController = undefined;\n activeExecutionId = undefined;\n };\n}\n"],"mappings":";;;;;;;;;;;;AA2BA,SAAgB,8BACd,MACY;CACZ,MAAM,mCAAmB,IAAI,KAA+C;CAC5E,IAAIA;CACJ,IAAIC;CAEJ,eAAe,eAAe,SAAwC;AACpE,MAAI,mBAAmB;AACrB,QAAK,KAAK;IACR,YAAY;IACZ,OAAO;KACL,MAAM;KACN,SAAS;KACV;IACD,IAAI,QAAQ;IACZ,MAAM,EAAE;IACR,IAAI;IACJ,MAAM;IACP,CAAC;AACF;;EAGF,MAAM,kBAAkB,IAAI,iBAAiB;AAC7C,0BAAwB;AACxB,sBAAoB,QAAQ;AAE5B,MAAI;GACF,MAAM,SAAS,MAAMC,iCACnB;IACE;IACA,MAAM,QAAQ;IACd,iBAAiB;AACf,UAAK,KAAK;MACR,IAAI,QAAQ;MACZ,MAAM;MACP,CAAC;;IAEJ,aAAa,SACX,IAAI,SAAyB,YAAY;KACvC,MAAM,sCAAqB;AAC3B,sBAAiB,IAAI,QAAQ,QAAQ;AACrC,UAAK,KAAK;MACR,GAAG;MACH;MACA,MAAM;MACP,CAAC;MACF;IACJ,WAAW,QAAQ;IACpB,EACD,QAAQ,QACT;AAED,QAAK,KAAK;IACR,GAAG;IACH,IAAI,QAAQ;IACZ,MAAM;IACP,CAAC;WACK,OAAO;AACd,QAAK,KAAK;IACR,YAAY;IACZ,OAAO;KACL,MAAM;KACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KAChE;IACD,IAAI,QAAQ;IACZ,MAAM,EAAE;IACR,IAAI;IACJ,MAAM;IACP,CAAC;YACM;AACR,oBAAiB,OAAO;AACxB,2BAAwB;AACxB,uBAAoB;;;CAIxB,MAAM,cAAc,KAAK,WAAW,YAA+B;AACjE,MAAI,kDAAqB,QAAQ,CAC/B;AAGF,UAAQ,QAAQ,MAAhB;GACE,KAAK;AACH,QAAI,QAAQ,OAAO,kBACjB,wBAAuB,OAAO;AAEhC;GACF,KAAK;AACH,IAAK,eAAe,QAAQ;AAC5B;GACF,KAAK,eAAe;IAClB,MAAM,UAAU,iBAAiB,IAAI,QAAQ,OAAO;AACpD,qBAAiB,OAAO,QAAQ,OAAO;AACvC,cAAU,QAAQ;AAClB;;;GAGJ;AAEF,cAAa;AACX,MAAI,OAAO,gBAAgB,WACzB,cAAa;AAEf,mBAAiB,OAAO;AACxB,yBAAuB,OAAO;AAC9B,0BAAwB;AACxB,sBAAoB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocolEndpoint-CwyUhKrN.js","names":["activeAbortController: AbortController | undefined","activeExecutionId: string | undefined"],"sources":["../src/runner/protocolEndpoint.ts"],"sourcesContent":["/**\n * @packageDocumentation\n * Public API for the `@execbox/quickjs/runner/protocol-endpoint` entrypoint.\n */\nimport { randomUUID } from \"node:crypto\";\n\nimport { isDispatcherMessage } from \"@execbox/core/protocol\";\nimport type {\n DispatcherMessage,\n ExecuteMessage,\n RunnerMessage,\n} from \"@execbox/core/protocol\";\nimport type { ToolCallResult } from \"@execbox/core\";\n\nimport { runQuickJsSession } from \"./index.ts\";\n\n/**\n * Minimal worker/process-side port used by the shared QuickJS protocol endpoint.\n */\nexport interface QuickJsProtocolPort {\n onMessage(handler: (message: DispatcherMessage) => void): void | (() => void);\n send(message: RunnerMessage): void;\n}\n\n/**\n * Attaches the shared QuickJS protocol loop to a worker/process messaging port.\n */\nexport function attachQuickJsProtocolEndpoint(\n port: QuickJsProtocolPort,\n): () => void {\n const pendingToolCalls = new Map<string, (result: ToolCallResult) => void>();\n let activeAbortController: AbortController | undefined;\n let activeExecutionId: string | undefined;\n\n async function startExecution(message: ExecuteMessage): Promise<void> {\n if (activeExecutionId) {\n port.send({\n durationMs: 0,\n error: {\n code: \"internal_error\",\n message: \"QuickJS endpoint already has an active execution\",\n },\n id: message.id,\n logs: [],\n ok: false,\n type: \"done\",\n });\n return;\n }\n\n const abortController = new AbortController();\n activeAbortController = abortController;\n activeExecutionId = message.id;\n\n try {\n const result = await runQuickJsSession(\n {\n abortController,\n code: message.code,\n onStarted: () => {\n port.send({\n id: message.id,\n type: \"started\",\n });\n },\n onToolCall: (call) =>\n new Promise<ToolCallResult>((resolve) => {\n const callId = randomUUID();\n pendingToolCalls.set(callId, resolve);\n port.send({\n ...call,\n callId,\n type: \"tool_call\",\n });\n }),\n providers: message.providers,\n },\n message.options,\n );\n\n port.send({\n ...result,\n id: message.id,\n type: \"done\",\n });\n } catch (error) {\n port.send({\n durationMs: 0,\n error: {\n code: \"internal_error\",\n message: error instanceof Error ? error.message : String(error),\n },\n id: message.id,\n logs: [],\n ok: false,\n type: \"done\",\n });\n } finally {\n pendingToolCalls.clear();\n activeAbortController = undefined;\n activeExecutionId = undefined;\n }\n }\n\n const maybeDetach = port.onMessage((message: DispatcherMessage) => {\n if (!isDispatcherMessage(message)) {\n return;\n }\n\n switch (message.type) {\n case \"cancel\":\n if (message.id === activeExecutionId) {\n activeAbortController?.abort();\n }\n break;\n case \"execute\":\n void startExecution(message);\n break;\n case \"tool_result\": {\n const resolve = pendingToolCalls.get(message.callId);\n pendingToolCalls.delete(message.callId);\n resolve?.(message);\n break;\n }\n }\n });\n\n return () => {\n if (typeof maybeDetach === \"function\") {\n maybeDetach();\n }\n pendingToolCalls.clear();\n activeAbortController?.abort();\n activeAbortController = undefined;\n activeExecutionId = undefined;\n };\n}\n"],"mappings":";;;;;;;;;;;;AA2BA,SAAgB,8BACd,MACY;CACZ,MAAM,mCAAmB,IAAI,KAA+C;CAC5E,IAAIA;CACJ,IAAIC;CAEJ,eAAe,eAAe,SAAwC;AACpE,MAAI,mBAAmB;AACrB,QAAK,KAAK;IACR,YAAY;IACZ,OAAO;KACL,MAAM;KACN,SAAS;KACV;IACD,IAAI,QAAQ;IACZ,MAAM,EAAE;IACR,IAAI;IACJ,MAAM;IACP,CAAC;AACF;;EAGF,MAAM,kBAAkB,IAAI,iBAAiB;AAC7C,0BAAwB;AACxB,sBAAoB,QAAQ;AAE5B,MAAI;GACF,MAAM,SAAS,MAAM,kBACnB;IACE;IACA,MAAM,QAAQ;IACd,iBAAiB;AACf,UAAK,KAAK;MACR,IAAI,QAAQ;MACZ,MAAM;MACP,CAAC;;IAEJ,aAAa,SACX,IAAI,SAAyB,YAAY;KACvC,MAAM,SAAS,YAAY;AAC3B,sBAAiB,IAAI,QAAQ,QAAQ;AACrC,UAAK,KAAK;MACR,GAAG;MACH;MACA,MAAM;MACP,CAAC;MACF;IACJ,WAAW,QAAQ;IACpB,EACD,QAAQ,QACT;AAED,QAAK,KAAK;IACR,GAAG;IACH,IAAI,QAAQ;IACZ,MAAM;IACP,CAAC;WACK,OAAO;AACd,QAAK,KAAK;IACR,YAAY;IACZ,OAAO;KACL,MAAM;KACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KAChE;IACD,IAAI,QAAQ;IACZ,MAAM,EAAE;IACR,IAAI;IACJ,MAAM;IACP,CAAC;YACM;AACR,oBAAiB,OAAO;AACxB,2BAAwB;AACxB,uBAAoB;;;CAIxB,MAAM,cAAc,KAAK,WAAW,YAA+B;AACjE,MAAI,CAAC,oBAAoB,QAAQ,CAC/B;AAGF,UAAQ,QAAQ,MAAhB;GACE,KAAK;AACH,QAAI,QAAQ,OAAO,kBACjB,wBAAuB,OAAO;AAEhC;GACF,KAAK;AACH,IAAK,eAAe,QAAQ;AAC5B;GACF,KAAK,eAAe;IAClB,MAAM,UAAU,iBAAiB,IAAI,QAAQ,OAAO;AACpD,qBAAiB,OAAO,QAAQ,OAAO;AACvC,cAAU,QAAQ;AAClB;;;GAGJ;AAEF,cAAa;AACX,MAAI,OAAO,gBAAgB,WACzB,cAAa;AAEf,mBAAiB,OAAO;AACxB,yBAAuB,OAAO;AAC9B,0BAAwB;AACxB,sBAAoB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner-DJ5AWw-k.js","names":["rejection: unknown","input: unknown","responsePromise: Promise<ToolCallResult>","resultHandle: QuickJSHandle | undefined","logs: string[]"],"sources":["../src/quickjsBridge.ts","../src/runner/index.ts"],"sourcesContent":["import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\n\nimport { ExecuteFailure } from \"@execbox/core/runtime\";\nimport type { ExecuteErrorCode } from \"@execbox/core\";\n\n/**\n * Creates a guest-visible error object that carries a trusted host error code marker.\n */\nexport function createGuestErrorHandle(\n context: QuickJSContext,\n code: ExecuteErrorCode,\n message: string,\n trustedHostErrorKey: string,\n): QuickJSHandle {\n const errorHandle = context.newError({ message, name: \"Error\" });\n const codeHandle = context.newString(code);\n const trustedHostMarkerHandle = context.true;\n\n try {\n context.setProp(errorHandle, \"code\", codeHandle);\n context.setProp(errorHandle, trustedHostErrorKey, trustedHostMarkerHandle);\n return errorHandle;\n } finally {\n codeHandle.dispose();\n trustedHostMarkerHandle.dispose();\n }\n}\n\n/**\n * Converts a guest QuickJS handle into a JSON-compatible host value.\n */\nexport function fromGuestHandle(\n context: QuickJSContext,\n handle: QuickJSHandle,\n): unknown {\n const guestType = context.typeof(handle);\n\n if (guestType === \"undefined\") {\n return undefined;\n }\n\n if (\n guestType === \"function\" ||\n guestType === \"symbol\" ||\n guestType === \"bigint\"\n ) {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n }\n\n const jsonHandle = context.getProp(context.global, \"JSON\");\n const stringifyHandle = context.getProp(jsonHandle, \"stringify\");\n\n try {\n const stringified = context.unwrapResult(\n context.callFunction(stringifyHandle, jsonHandle, handle),\n );\n const stringifiedType = context.typeof(stringified);\n\n if (stringifiedType === \"undefined\") {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n }\n\n const jsonValue = context.getString(stringified);\n return JSON.parse(jsonValue);\n } catch (error) {\n if (error instanceof ExecuteFailure) {\n throw error;\n }\n\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Guest code returned a non-serializable value\",\n );\n } finally {\n stringifyHandle.dispose();\n jsonHandle.dispose();\n }\n}\n\n/**\n * Converts a host JSON-compatible value into a guest QuickJS handle.\n */\nexport function toGuestHandle(\n context: QuickJSContext,\n value: unknown,\n): QuickJSHandle {\n if (value === undefined) {\n return context.undefined;\n }\n\n const jsonValue = JSON.stringify(value);\n\n if (jsonValue === undefined) {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Host value is not JSON-serializable\",\n );\n }\n\n return context.unwrapResult(\n context.evalCode(`(${jsonValue})`, \"host-value.json\"),\n );\n}\n","/**\n * @packageDocumentation\n * Public API for the `@execbox/quickjs/runner` entrypoint.\n */\nimport { randomUUID } from \"node:crypto\";\n\nimport {\n RELEASE_SYNC,\n isFail,\n memoizePromiseFactory,\n newQuickJSWASMModule,\n shouldInterruptAfterDeadline,\n type QuickJSContext,\n type QuickJSHandle,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from \"quickjs-emscripten\";\n\nimport {\n ExecuteFailure,\n formatConsoleLine,\n getExecutionTimeoutMessage,\n isExecuteFailure,\n isKnownExecuteErrorCode,\n normalizeCode,\n normalizeThrownMessage,\n resolveExecutorRuntimeOptions,\n truncateLogs,\n} from \"@execbox/core/runtime\";\nimport type {\n ExecuteError,\n ExecuteResult,\n ExecutorRuntimeOptions,\n ProviderManifest,\n ToolCall,\n ToolCallResult,\n} from \"@execbox/core\";\n\nimport {\n createGuestErrorHandle,\n fromGuestHandle,\n toGuestHandle,\n} from \"../quickjsBridge.ts\";\nimport type { QuickJsInlineExecutorOptions } from \"../types.ts\";\n\nexport type {\n QuickJsExecutorHost,\n QuickJsExecutorOptions,\n QuickJsHostedMode,\n QuickJsInlineExecutorOptions,\n QuickJsProcessExecutorOptions,\n QuickJsWorkerExecutorOptions,\n WorkerResourceLimits,\n} from \"../types.ts\";\n\nconst loadDefaultModule = memoizePromiseFactory(() =>\n newQuickJSWASMModule(RELEASE_SYNC),\n);\n\n/**\n * Transport-neutral host tool call emitted from a QuickJS session.\n */\nexport type QuickJsSessionToolCall = ToolCall;\n\n/**\n * Input required to run one transport-backed QuickJS execution session.\n */\nexport interface QuickJsSessionRequest {\n /** Optional abort controller that should be triggered when execution stops. */\n abortController?: AbortController;\n\n /** Guest JavaScript source to evaluate inside QuickJS. */\n code: string;\n\n /** Host callback used to fulfill guest tool calls. */\n onToolCall: (call: ToolCall) => Promise<ToolCallResult> | ToolCallResult;\n\n /** Optional hook invoked once the guest runtime has started. */\n onStarted?: () => void;\n\n /** Transport-safe provider manifests exposed to the guest runtime. */\n providers: ProviderManifest[];\n\n /** Optional caller-owned abort signal for the session. */\n signal?: AbortSignal;\n}\n\n/**\n * Options controlling one transport-backed QuickJS session.\n */\nexport type QuickJsSessionOptions = ExecutorRuntimeOptions &\n Pick<QuickJsInlineExecutorOptions, \"loadModule\"> & {\n /** Optional preloaded QuickJS WASM module instance. */\n module?: QuickJSWASMModule;\n };\n\n/**\n * Converts unexpected executor failures into stable public result errors.\n */\nfunction toExecuteError(error: unknown, deadline: number): ExecuteError {\n if (isExecuteFailure(error)) {\n return {\n code: error.code,\n message: error.message,\n };\n }\n\n const message = normalizeThrownMessage(error);\n\n if (Date.now() > deadline || message.includes(\"interrupted\")) {\n return {\n code: \"timeout\",\n message: getExecutionTimeoutMessage(),\n };\n }\n\n if (message.toLowerCase().includes(\"out of memory\")) {\n return {\n code: \"memory_limit\",\n message,\n };\n }\n\n return {\n code: \"runtime_error\",\n message,\n };\n}\n\nfunction errorFromGuestHandle(\n context: QuickJSContext,\n handle: QuickJSHandle,\n trustedHostErrorKey: string,\n): ExecuteError {\n const codeHandle = context.getProp(handle, \"code\");\n const messageHandle = context.getProp(handle, \"message\");\n const trustedMarkerHandle = context.getProp(handle, trustedHostErrorKey);\n\n try {\n const code =\n context.typeof(codeHandle) === \"string\"\n ? context.getString(codeHandle)\n : undefined;\n const trustedHostError = context.typeof(trustedMarkerHandle) === \"boolean\";\n const message =\n context.typeof(messageHandle) === \"string\"\n ? context.getString(messageHandle)\n : normalizeThrownMessage(context.dump(handle));\n\n if (trustedHostError && isKnownExecuteErrorCode(code)) {\n return {\n code,\n message,\n };\n }\n\n return {\n code: \"runtime_error\",\n message,\n };\n } finally {\n codeHandle.dispose();\n messageHandle.dispose();\n trustedMarkerHandle.dispose();\n }\n}\n\nasync function waitForPromiseSettlement(\n runtime: QuickJSRuntime,\n promise: Promise<unknown>,\n deadline: number,\n trustedHostErrorKey: string,\n): Promise<void> {\n let settled = false;\n let rejection: unknown;\n\n promise.then(\n () => {\n settled = true;\n },\n (error) => {\n settled = true;\n rejection = error;\n },\n );\n\n while (!settled) {\n if (Date.now() > deadline) {\n throw new ExecuteFailure(\"timeout\", getExecutionTimeoutMessage());\n }\n\n const pendingJobsResult = runtime.executePendingJobs(-1);\n if (isFail(pendingJobsResult)) {\n const pendingError = pendingJobsResult.error;\n\n try {\n const executeError = errorFromGuestHandle(\n pendingError.context,\n pendingError,\n trustedHostErrorKey,\n );\n throw new ExecuteFailure(executeError.code, executeError.message);\n } finally {\n pendingError.dispose();\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n\n if (rejection !== undefined) {\n throw rejection;\n }\n}\n\nfunction injectConsole(context: QuickJSContext, logs: string[]): void {\n const consoleHandle = context.newObject();\n\n try {\n for (const methodName of [\"log\", \"info\", \"warn\", \"error\"]) {\n const methodHandle = context.newFunction(methodName, (...args) => {\n logs.push(formatConsoleLine(args.map((arg) => context.dump(arg))));\n return context.undefined;\n });\n\n context.setProp(consoleHandle, methodName, methodHandle);\n methodHandle.dispose();\n }\n\n context.setProp(context.global, \"console\", consoleHandle);\n } finally {\n consoleHandle.dispose();\n }\n}\n\nfunction injectProviders(\n context: QuickJSContext,\n providers: ProviderManifest[],\n signal: AbortSignal,\n trustedHostErrorKey: string,\n onToolCall: QuickJsSessionRequest[\"onToolCall\"],\n): void {\n for (const provider of providers) {\n const providerHandle = context.newObject();\n\n try {\n for (const [safeToolName] of Object.entries(provider.tools)) {\n const toolHandle = createToolHandle(\n context,\n provider.name,\n safeToolName,\n signal,\n trustedHostErrorKey,\n onToolCall,\n );\n context.setProp(providerHandle, safeToolName, toolHandle);\n toolHandle.dispose();\n }\n\n context.setProp(context.global, provider.name, providerHandle);\n } finally {\n providerHandle.dispose();\n }\n }\n}\n\nfunction createToolHandle(\n context: QuickJSContext,\n providerName: string,\n safeToolName: string,\n signal: AbortSignal,\n trustedHostErrorKey: string,\n onToolCall: QuickJsSessionRequest[\"onToolCall\"],\n): QuickJSHandle {\n return context.newFunction(safeToolName, (...args) => {\n const deferred = context.newPromise();\n const disposeDeferred = () => {\n if (context.alive && deferred.alive) {\n deferred.dispose();\n }\n };\n let input: unknown;\n\n try {\n input =\n args[0] === undefined ? undefined : fromGuestHandle(context, args[0]);\n } catch (error) {\n const executeError = isExecuteFailure(error)\n ? error\n : new ExecuteFailure(\n \"serialization_error\",\n \"Guest code passed a non-serializable tool input\",\n );\n const errorHandle = createGuestErrorHandle(\n context,\n executeError.code,\n executeError.message,\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n return deferred.handle;\n } finally {\n errorHandle.dispose();\n queueMicrotask(disposeDeferred);\n }\n }\n const onAbort = () => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n const errorHandle = createGuestErrorHandle(\n context,\n \"timeout\",\n getExecutionTimeoutMessage(),\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n } finally {\n errorHandle.dispose();\n disposeDeferred();\n }\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n let responsePromise: Promise<ToolCallResult>;\n\n try {\n if (signal.aborted) {\n throw new ExecuteFailure(\"timeout\", getExecutionTimeoutMessage());\n }\n\n responsePromise = Promise.resolve(\n onToolCall({\n input,\n providerName,\n safeToolName,\n }),\n );\n } catch (error) {\n responsePromise = Promise.reject(error);\n }\n\n void responsePromise\n .then((response) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n let resultHandle: QuickJSHandle | undefined;\n\n try {\n if (!response.ok) {\n const errorHandle = createGuestErrorHandle(\n context,\n response.error.code,\n response.error.message,\n trustedHostErrorKey,\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n return;\n }\n\n resultHandle = toGuestHandle(context, response.result);\n deferred.resolve(resultHandle);\n } finally {\n resultHandle?.dispose();\n disposeDeferred();\n }\n })\n .catch((error) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (!context.alive || !deferred.alive) {\n disposeDeferred();\n return;\n }\n\n const errorHandle = createGuestErrorHandle(\n context,\n isExecuteFailure(error) ? error.code : \"internal_error\",\n normalizeThrownMessage(error),\n trustedHostErrorKey,\n );\n\n try {\n deferred.reject(errorHandle);\n } finally {\n errorHandle.dispose();\n disposeDeferred();\n }\n });\n\n return deferred.handle;\n });\n}\n\n/**\n * Runs one QuickJS-backed execution session using a transport-neutral tool callback.\n */\nexport async function runQuickJsSession(\n request: QuickJsSessionRequest,\n options: QuickJsSessionOptions = {},\n): Promise<ExecuteResult> {\n const runtimeOptions = resolveExecutorRuntimeOptions(options);\n const loadModule = async () => {\n if (options.module) {\n return options.module;\n }\n\n const loaded = options.loadModule\n ? await options.loadModule()\n : await loadDefaultModule();\n return loaded as QuickJSWASMModule;\n };\n const { maxLogChars, maxLogLines, memoryLimitBytes, timeoutMs } =\n runtimeOptions;\n const startedAt = Date.now();\n const logs: string[] = [];\n const abortController = new AbortController();\n const trustedHostErrorKey = `__execboxHostError_${randomUUID()}`;\n const signal =\n request.abortController?.signal ?? request.signal ?? abortController.signal;\n const module = await loadModule();\n const runtime = module.newRuntime();\n let deadline = Number.POSITIVE_INFINITY;\n runtime.setMemoryLimit(memoryLimitBytes);\n const context = runtime.newContext();\n\n try {\n injectConsole(context, logs);\n injectProviders(\n context,\n request.providers,\n signal,\n trustedHostErrorKey,\n request.onToolCall,\n );\n const executionStartedAt = Date.now();\n deadline = executionStartedAt + timeoutMs;\n const shouldInterrupt = shouldInterruptAfterDeadline(deadline);\n runtime.setInterruptHandler((currentRuntime) => {\n return signal.aborted || shouldInterrupt(currentRuntime);\n });\n request.onStarted?.();\n\n const executableSource = normalizeCode(request.code);\n const functionHandle = context.unwrapResult(\n context.evalCode(`(${executableSource})`, \"sandbox-user-code.js\"),\n );\n\n try {\n const promiseHandle = context.unwrapResult(\n context.callFunction(functionHandle, context.undefined),\n );\n\n try {\n const promiseResult = context.resolvePromise(promiseHandle);\n await waitForPromiseSettlement(\n runtime,\n promiseResult,\n deadline,\n trustedHostErrorKey,\n );\n const settledResult = await promiseResult;\n\n if (isFail(settledResult)) {\n const errorHandle = settledResult.error;\n\n try {\n return {\n durationMs: Date.now() - startedAt,\n error: errorFromGuestHandle(\n context,\n errorHandle,\n trustedHostErrorKey,\n ),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n errorHandle.dispose();\n }\n }\n\n try {\n const value = fromGuestHandle(context, settledResult.value);\n\n return {\n durationMs: Date.now() - startedAt,\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: true,\n result: value,\n };\n } catch (error) {\n return {\n durationMs: Date.now() - startedAt,\n error: toExecuteError(error, deadline),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n settledResult.value.dispose();\n }\n } finally {\n promiseHandle.dispose();\n }\n } finally {\n functionHandle.dispose();\n }\n } catch (error) {\n abortController.abort();\n\n return {\n durationMs: Date.now() - startedAt,\n error: toExecuteError(error, deadline),\n logs: truncateLogs(logs, maxLogLines, maxLogChars),\n ok: false,\n };\n } finally {\n request.abortController?.abort();\n abortController.abort();\n context.dispose();\n runtime.dispose();\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-7wOdERLE.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAQA,CAAA,CAAA;AAKY,IAAA,CALA,mBAAA,CAAA,CAAA,CAKiB,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA;AAK7B,CAAA,CAAA;AAYA,CAAA,CAAA,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA;AAWA,CAAA,CAAA;AAQS,IAAA,CApCG,iBAAA,CAAA,CAAA,CAoCH,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA;;;;AARmE,SAAA,CAvB3D,oBAAA,CAuB2D;EAoB3D,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,IAAA,CAAA,EAAA,CAAA,GAAA,CAAA,GAAA,CAAA,UAAA,CAAA,IAAA,CAAA,EAAA,CAAA,SAAA,CAAA,CAAA,CAAA;EAQR,sBAAA,CAAA,CAAA,CAAA,MAAA;EAGA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,IAAA,CAAA,EAAA,CAAA,GAAA,CAAA,KAAA,CAAA,UAAA,CAAA,IAAA,CAAA,EAAA,CAAA,SAAA,CAAA,CAAA,CAAA;EAX8C,wBAAA,CAAA,CAAA,CAAA,MAAA;EAAsB,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,EAAA,CAAA,KAAA,CAAA,IAAA,CAAA,EAAA,CAAA,SAAA,CAAA,CAAA,CAAA;EAiBjE,WAAA,CAAA,CAAA,CAAA,MAAA;;;;;UAhDK,4BAAA,CAAA,OAAA,CAAqC;;;;qBAKjC;;;;;UAMJ,4BAAA,CAAA,OAAA,CAAqC;;;;;;SAQ7C;;SAGA;;yBAGgB;;;;;UAMR,6BAAA,CAAA,OAAA,CAAsC;;;;;;SAQ9C;;SAGA;;;;;KAMG,sBAAA,CAAA,CAAA,CACR,+BACA,+BACA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-BMA2zKnX.d.cts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAQA,CAAA,CAAA;AAKY,IAAA,CALA,mBAAA,CAAA,CAAA,CAKiB,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA;AAK7B,CAAA,CAAA;AAYA,CAAA,CAAA,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA;AAWA,CAAA,CAAA;AAQS,IAAA,CApCG,iBAAA,CAAA,CAAA,CAoCH,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA;;;;AARmE,SAAA,CAvB3D,oBAAA,CAuB2D;EAoB3D,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,IAAA,CAAA,EAAA,CAAA,GAAA,CAAA,GAAA,CAAA,UAAA,CAAA,IAAA,CAAA,EAAA,CAAA,SAAA,CAAA,CAAA,CAAA;EAQR,sBAAA,CAAA,CAAA,CAAA,MAAA;EAGA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,IAAA,CAAA,EAAA,CAAA,GAAA,CAAA,KAAA,CAAA,UAAA,CAAA,IAAA,CAAA,EAAA,CAAA,SAAA,CAAA,CAAA,CAAA;EAX8C,wBAAA,CAAA,CAAA,CAAA,MAAA;EAAsB,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,EAAA,CAAA,KAAA,CAAA,IAAA,CAAA,EAAA,CAAA,SAAA,CAAA,CAAA,CAAA;EAiBjE,WAAA,CAAA,CAAA,CAAA,MAAA;;;;;UAhDK,4BAAA,CAAA,OAAA,CAAqC;;;;qBAKjC;;;;;UAMJ,4BAAA,CAAA,OAAA,CAAqC;;;;;;SAQ7C;;SAGA;;yBAGgB;;;;;UAMR,6BAAA,CAAA,OAAA,CAAsC;;;;;;SAQ9C;;SAGA;;;;;KAMG,sBAAA,CAAA,CAAA,CACR,+BACA,+BACA"}