@execbox/quickjs 0.4.0 → 0.5.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 (46) hide show
  1. package/README.md +39 -38
  2. package/dist/index.cjs +8 -71
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.js +2 -65
  7. package/dist/index.js.map +1 -1
  8. package/dist/processEntry.cjs +2 -2
  9. package/dist/processEntry.js +2 -2
  10. package/dist/{protocolEndpoint-DGOUVf6J.cjs → protocolEndpoint-ByylXGle.cjs} +4 -39
  11. package/dist/protocolEndpoint-ByylXGle.cjs.map +1 -0
  12. package/dist/{protocolEndpoint-T_JEz8YY.js → protocolEndpoint-CwyUhKrN.js} +3 -38
  13. package/dist/protocolEndpoint-CwyUhKrN.js.map +1 -0
  14. package/dist/remoteEndpoint.cjs +45 -0
  15. package/dist/remoteEndpoint.cjs.map +1 -0
  16. package/dist/remoteEndpoint.d.cts +29 -0
  17. package/dist/remoteEndpoint.d.cts.map +1 -0
  18. package/dist/remoteEndpoint.d.ts +29 -0
  19. package/dist/remoteEndpoint.d.ts.map +1 -0
  20. package/dist/remoteEndpoint.js +45 -0
  21. package/dist/remoteEndpoint.js.map +1 -0
  22. package/dist/runner/index.cjs +1 -1
  23. package/dist/runner/index.d.cts +1 -1
  24. package/dist/runner/index.d.ts +1 -1
  25. package/dist/runner/index.js +1 -1
  26. package/dist/runner/protocolEndpoint.cjs +2 -2
  27. package/dist/runner/protocolEndpoint.d.cts.map +1 -1
  28. package/dist/runner/protocolEndpoint.d.ts.map +1 -1
  29. package/dist/runner/protocolEndpoint.js +2 -2
  30. package/dist/runner-DJ5AWw-k.js +343 -0
  31. package/dist/runner-DJ5AWw-k.js.map +1 -0
  32. package/dist/runner-DRLfwiqY.cjs +348 -0
  33. package/dist/runner-DRLfwiqY.cjs.map +1 -0
  34. package/dist/{types-BeVqrcj8.d.ts → types-7wOdERLE.d.ts} +1 -1
  35. package/dist/{types-BeVqrcj8.d.ts.map → types-7wOdERLE.d.ts.map} +1 -1
  36. package/dist/{types-CnNmLawC.d.cts → types-BMA2zKnX.d.cts} +1 -1
  37. package/dist/{types-CnNmLawC.d.cts.map → types-BMA2zKnX.d.cts.map} +1 -1
  38. package/dist/workerEntry.cjs +2 -2
  39. package/dist/workerEntry.js +2 -2
  40. package/package.json +11 -2
  41. package/dist/protocolEndpoint-DGOUVf6J.cjs.map +0 -1
  42. package/dist/protocolEndpoint-T_JEz8YY.js.map +0 -1
  43. package/dist/runner-CteKTaPD.js +0 -5654
  44. package/dist/runner-CteKTaPD.js.map +0 -1
  45. package/dist/runner-DRt0kpEk.cjs +0 -5707
  46. package/dist/runner-DRt0kpEk.cjs.map +0 -1
package/README.md CHANGED
@@ -1,41 +1,16 @@
1
1
  # @execbox/quickjs
2
2
 
3
- QuickJS executor backend for `@execbox/core`, supporting inline, worker-hosted, and process-hosted execution.
3
+ Default execbox executor for most deployments. It runs guest JavaScript in QuickJS and lets you keep the same API as you move between inline, worker-hosted, and process-hosted execution.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/%40execbox%2Fquickjs?style=flat-square)](https://www.npmjs.com/package/@execbox/quickjs)
6
6
  [![License](https://img.shields.io/github/license/aallam/execbox?style=flat-square)](https://github.com/aallam/execbox/blob/main/LICENSE)
7
+ [![Docs](https://img.shields.io/badge/docs-site-0ea5e9?style=flat-square)](https://execbox.aallam.com)
7
8
 
8
- Docs: https://execbox.aallam.com
9
+ ## Use `@execbox/quickjs` When
9
10
 
10
- ## Choose QuickJS When
11
-
12
- - you want the easiest execbox backend to install
13
- - you do not want a native addon in CI or local development
14
- - you want fresh runtimes, captured `console.*` output, and JSON-only tool boundaries
15
- - you want to move from inline execution to worker or child-process hosts without changing packages
16
-
17
- ## Security Notes
18
-
19
- - Each execution gets a fresh QuickJS runtime with no ambient Node globals injected by execbox.
20
- - Tool calls cross a JSON-only bridge, and executor timeouts propagate abort signals to in-flight provider work.
21
- - In the default deployment model, provider definitions are controlled by the host application, while hostile users control guest code and tool inputs.
22
- - This package is designed for host-controlled deployments and does not by itself create a hard isolation boundary for hostile code.
23
- - If you need a stronger boundary, use `host: "process"`, move execution behind `@execbox/remote`, or place the runtime behind a container or VM.
24
-
25
- ## Architecture Docs
26
-
27
- - [Execbox architecture overview](https://github.com/aallam/execbox/blob/main/docs/architecture/README.md)
28
- - [Execbox executors](https://github.com/aallam/execbox/blob/main/docs/architecture/execbox-executors.md)
29
- - [Execbox MCP adapters and protocol](https://github.com/aallam/execbox/blob/main/docs/architecture/execbox-mcp-and-protocol.md)
30
-
31
- ## Examples
32
-
33
- - [Basic provider execution](https://github.com/aallam/execbox/blob/main/examples/execbox-basic.ts)
34
- - [Process-hosted QuickJS execution](https://github.com/aallam/execbox/blob/main/examples/execbox-process.ts)
35
- - [Worker-backed QuickJS execution](https://github.com/aallam/execbox/blob/main/examples/execbox-worker.ts)
36
- - [MCP provider wrapping](https://github.com/aallam/execbox/blob/main/examples/execbox-mcp-provider.ts)
37
- - [MCP server wrapper](https://github.com/aallam/execbox/blob/main/examples/execbox-mcp-server.ts)
38
- - [Full examples index](https://github.com/aallam/execbox/tree/main/examples)
11
+ - you want the default execbox path with the easiest setup
12
+ - you do not want a native addon in local development or CI
13
+ - you want one package that can stay inline, move off-thread, or move into a child process later
39
14
 
40
15
  ## Install
41
16
 
@@ -43,16 +18,14 @@ Docs: https://execbox.aallam.com
43
18
  npm install @execbox/core @execbox/quickjs
44
19
  ```
45
20
 
46
- Advanced consumers can also import the reusable QuickJS runner from `@execbox/quickjs/runner`.
47
- Hosted worker/process execution and `@execbox/remote` also reuse the shared QuickJS protocol endpoint from `@execbox/quickjs/runner/protocol-endpoint`.
48
-
49
- ## Usage
21
+ ## Smallest Working Usage
50
22
 
51
23
  ```ts
52
24
  import { resolveProvider } from "@execbox/core";
53
25
  import { QuickJsExecutor } from "@execbox/quickjs";
54
26
 
55
27
  const provider = resolveProvider({
28
+ name: "tools",
56
29
  tools: {
57
30
  echo: {
58
31
  execute: async (input) => input,
@@ -61,14 +34,22 @@ const provider = resolveProvider({
61
34
  });
62
35
 
63
36
  const executor = new QuickJsExecutor();
64
- const result = await executor.execute("await codemode.echo({ ok: true })", [
37
+ const result = await executor.execute(`await tools.echo({ ok: true })`, [
65
38
  provider,
66
39
  ]);
40
+
41
+ console.log(result);
67
42
  ```
68
43
 
69
- Each execution runs in a fresh QuickJS runtime with timeout handling, captured logs, and JSON-only result and tool boundaries.
44
+ ## Host Modes
45
+
46
+ `QuickJsExecutor` keeps the same execution API while changing where the runtime lives:
70
47
 
71
- `QuickJsExecutor` defaults to inline execution. Set `host: "worker"` when you want pooled worker-shell reuse, or `host: "process"` when you want pooled child-process reuse with a stronger lifecycle split.
48
+ | Mode | Use it when |
49
+ | ----------------- | --------------------------------------------------------------------------- |
50
+ | Inline (default) | You want the lowest-friction development path. |
51
+ | `host: "worker"` | You want QuickJS off the main thread with pooled worker shells. |
52
+ | `host: "process"` | You want QuickJS hosted in a child process with a stronger lifecycle split. |
72
53
 
73
54
  ```ts
74
55
  const executor = new QuickJsExecutor({
@@ -81,3 +62,23 @@ const executor = new QuickJsExecutor({
81
62
 
82
63
  await executor.prewarm();
83
64
  ```
65
+
66
+ ## Advanced Imports
67
+
68
+ - `@execbox/quickjs/runner` exports the reusable QuickJS runner
69
+ - `@execbox/quickjs/runner/protocol-endpoint` exports the shared protocol endpoint used by hosted and remote flows
70
+ - `@execbox/quickjs/remote-endpoint` exports the QuickJS runner endpoint adapter for `@execbox/remote` transports
71
+
72
+ ## Operational Notes
73
+
74
+ - Each execution gets a fresh QuickJS runtime with JSON-only tool and result boundaries.
75
+ - This package is the default deployment path, not a hard security boundary for hostile or multi-tenant code.
76
+ - If you need a stronger boundary, prefer `host: "process"` or move execution behind `@execbox/remote`.
77
+
78
+ ## Read Next
79
+
80
+ - [Getting Started](https://execbox.aallam.com/getting-started)
81
+ - [Examples](https://execbox.aallam.com/examples)
82
+ - [Security & Boundaries](https://execbox.aallam.com/security)
83
+ - [Executors](https://execbox.aallam.com/architecture/execbox-executors)
84
+ - [MCP And Protocol](https://execbox.aallam.com/architecture/execbox-mcp-and-protocol)
package/dist/index.cjs CHANGED
@@ -1,4 +1,5 @@
1
- const require_runner = require('./runner-DRt0kpEk.cjs');
1
+ const require_runner = require('./runner-DRLfwiqY.cjs');
2
+ let __execbox_core_runtime = require("@execbox/core/runtime");
2
3
  let node_child_process = require("node:child_process");
3
4
  let node_url = require("node:url");
4
5
  let __execbox_core_protocol = require("@execbox/core/protocol");
@@ -6,70 +7,6 @@ let node_crypto = require("node:crypto");
6
7
  let node_os = require("node:os");
7
8
  let node_worker_threads = require("node:worker_threads");
8
9
 
9
- //#region ../core/src/runner.ts
10
- function toTrustedExecuteError(error) {
11
- if (require_runner.isExecuteFailure(error)) return {
12
- code: error.code,
13
- message: error.message
14
- };
15
- return {
16
- code: "tool_error",
17
- message: require_runner.normalizeThrownMessage(error)
18
- };
19
- }
20
- /**
21
- * Converts resolved providers into manifest metadata that reveals only namespace details.
22
- */
23
- function extractProviderManifests(providers) {
24
- return providers.map((provider) => ({
25
- name: provider.name,
26
- tools: Object.fromEntries(Object.entries(provider.tools).map(([safeToolName, descriptor]) => [safeToolName, {
27
- description: descriptor.description,
28
- originalName: descriptor.originalName,
29
- safeName: descriptor.safeName
30
- }])),
31
- types: provider.types
32
- }));
33
- }
34
- /**
35
- * Creates a host-side dispatcher for runner-emitted tool calls.
36
- */
37
- function createToolCallDispatcher(providers, signal) {
38
- const providerMap = new Map(providers.map((provider) => [provider.name, provider]));
39
- return async (call) => {
40
- const provider = providerMap.get(call.providerName);
41
- const descriptor = provider?.tools[call.safeToolName];
42
- if (!provider || !descriptor) return {
43
- error: {
44
- code: "internal_error",
45
- message: `Unknown tool ${call.providerName}.${call.safeToolName}`
46
- },
47
- ok: false
48
- };
49
- try {
50
- if (signal.aborted) return {
51
- error: {
52
- code: "timeout",
53
- message: require_runner.getExecutionTimeoutMessage()
54
- },
55
- ok: false
56
- };
57
- const result = await descriptor.execute(call.input, require_runner.createExecutionContext(signal, provider.name, descriptor.safeName, descriptor.originalName));
58
- if (result !== void 0 && !require_runner.isJsonSerializable(result)) throw new require_runner.ExecuteFailure("serialization_error", "Host value is not JSON-serializable");
59
- return {
60
- ok: true,
61
- result
62
- };
63
- } catch (error) {
64
- return {
65
- error: toTrustedExecuteError(error),
66
- ok: false
67
- };
68
- }
69
- };
70
- }
71
-
72
- //#endregion
73
10
  //#region src/hosted/shared.ts
74
11
  /**
75
12
  * Default grace period before a hosted shell is forcefully terminated.
@@ -140,7 +77,7 @@ async function runHostedTransportSession(options) {
140
77
  executionId: (0, node_crypto.randomUUID)(),
141
78
  onSettled: options.onSettled,
142
79
  providers: options.providers,
143
- runtimeOptions: require_runner.resolveExecutorRuntimeOptions(options.executorOptions, options.requestOptions),
80
+ runtimeOptions: (0, __execbox_core_runtime.resolveExecutorRuntimeOptions)(options.executorOptions, options.requestOptions),
144
81
  signal: options.requestOptions?.signal,
145
82
  transport: options.transport
146
83
  });
@@ -358,7 +295,7 @@ var ProcessHostedQuickJsExecutor = class {
358
295
  * Executes guest code in a child-process-hosted QuickJS shell.
359
296
  */
360
297
  async execute(code, providers, options = {}) {
361
- if (options.signal?.aborted) return require_runner.createTimeoutExecuteResult();
298
+ if (options.signal?.aborted) return (0, __execbox_core_runtime.createTimeoutExecuteResult)();
362
299
  await this.warmup;
363
300
  if (this.pool) {
364
301
  const lease = await this.pool.acquire();
@@ -557,7 +494,7 @@ var WorkerHostedQuickJsExecutor = class {
557
494
  * Executes guest code in a worker-thread-hosted QuickJS shell.
558
495
  */
559
496
  async execute(code, providers, options = {}) {
560
- if (options.signal?.aborted) return require_runner.createTimeoutExecuteResult();
497
+ if (options.signal?.aborted) return (0, __execbox_core_runtime.createTimeoutExecuteResult)();
561
498
  await this.warmup;
562
499
  if (this.pool) {
563
500
  const lease = await this.pool.acquire();
@@ -620,9 +557,9 @@ var QuickJsExecutor = class {
620
557
  */
621
558
  async execute(code, providers, options = {}) {
622
559
  if (this.hostedExecutor) return await this.hostedExecutor.execute(code, providers, options);
623
- if (options.signal?.aborted) return require_runner.createTimeoutExecuteResult();
560
+ if (options.signal?.aborted) return (0, __execbox_core_runtime.createTimeoutExecuteResult)();
624
561
  const abortController = new AbortController();
625
- const onToolCall = createToolCallDispatcher(providers, abortController.signal);
562
+ const onToolCall = (0, __execbox_core_runtime.createToolCallDispatcher)(providers, abortController.signal);
626
563
  const onAbort = () => {
627
564
  abortController.abort();
628
565
  };
@@ -632,7 +569,7 @@ var QuickJsExecutor = class {
632
569
  abortController,
633
570
  code,
634
571
  onToolCall,
635
- providers: extractProviderManifests(providers)
572
+ providers: (0, __execbox_core_runtime.extractProviderManifests)(providers)
636
573
  }, {
637
574
  ...this.options,
638
575
  ...options
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["isExecuteFailure","normalizeThrownMessage","getExecutionTimeoutMessage","createExecutionContext","isJsonSerializable","ExecuteFailure","DEFAULT_POOL_OPTIONS: Required<ExecutorPoolOptions>","resolveExecutorRuntimeOptions","closeReason: TransportCloseReason | undefined","resolvePoolOptions","leases: Array<{\n release: (reusable: boolean) => Promise<void>;\n value: ProcessShell;\n }>","createTimeoutExecuteResult","child: ChildProcess","closeReason: TransportCloseReason | undefined","Worker","leases: Array<{\n release: (reusable: boolean) => Promise<void>;\n value: WorkerShell;\n }>","createTimeoutExecuteResult","createTimeoutExecuteResult","runQuickJsSession"],"sources":["../../core/src/runner.ts","../src/hosted/shared.ts","../src/hosted/processHostedExecutor.ts","../src/hosted/workerHostedExecutor.ts","../src/quickjsExecutor.ts"],"sourcesContent":["import {\n createExecutionContext,\n getExecutionTimeoutMessage,\n normalizeThrownMessage,\n} from \"./executor/shared.ts\";\nimport {\n ExecuteFailure,\n isExecuteFailure,\n isJsonSerializable,\n} from \"./errors.ts\";\nimport type { ExecuteError, ResolvedToolProvider } from \"./types.ts\";\n\n/**\n * Transport-safe metadata for one exposed tool.\n */\nexport interface ProviderToolManifest {\n description?: string;\n originalName: string;\n safeName: string;\n}\n\n/**\n * Namespace manifest shared with runner implementations.\n */\nexport interface ProviderManifest {\n name: string;\n tools: Record<string, ProviderToolManifest>;\n types: string;\n}\n\n/**\n * Execution limits forwarded to runner implementations.\n */\nexport interface ExecutorRuntimeOptions {\n maxLogChars?: number;\n maxLogLines?: number;\n memoryLimitBytes?: number;\n timeoutMs?: number;\n}\n\n/**\n * Public execution options accepted by executors per call.\n */\nexport interface ExecutionOptions extends ExecutorRuntimeOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Tool invocation request emitted from a runner.\n */\nexport interface ToolCall {\n input: unknown;\n providerName: string;\n safeToolName: string;\n}\n\n/**\n * Trusted host response to a tool invocation request.\n */\nexport type ToolCallResult =\n | {\n ok: true;\n result: unknown;\n }\n | {\n error: ExecuteError;\n ok: false;\n };\n\nfunction toTrustedExecuteError(error: unknown): ExecuteError {\n if (isExecuteFailure(error)) {\n return {\n code: error.code,\n message: error.message,\n };\n }\n\n return {\n code: \"tool_error\",\n message: normalizeThrownMessage(error),\n };\n}\n\n/**\n * Converts resolved providers into manifest metadata that reveals only namespace details.\n */\nexport function extractProviderManifests(\n providers: ResolvedToolProvider[],\n): ProviderManifest[] {\n return providers.map((provider) => ({\n name: provider.name,\n tools: Object.fromEntries(\n Object.entries(provider.tools).map(([safeToolName, descriptor]) => [\n safeToolName,\n {\n description: descriptor.description,\n originalName: descriptor.originalName,\n safeName: descriptor.safeName,\n },\n ]),\n ),\n types: provider.types,\n }));\n}\n\n/**\n * Creates a host-side dispatcher for runner-emitted tool calls.\n */\nexport function createToolCallDispatcher(\n providers: ResolvedToolProvider[],\n signal: AbortSignal,\n): (call: ToolCall) => Promise<ToolCallResult> {\n const providerMap = new Map(\n providers.map((provider) => [provider.name, provider] as const),\n );\n\n return async (call) => {\n const provider = providerMap.get(call.providerName);\n const descriptor = provider?.tools[call.safeToolName];\n\n if (!provider || !descriptor) {\n return {\n error: {\n code: \"internal_error\",\n message: `Unknown tool ${call.providerName}.${call.safeToolName}`,\n },\n ok: false,\n };\n }\n\n try {\n if (signal.aborted) {\n return {\n error: {\n code: \"timeout\",\n message: getExecutionTimeoutMessage(),\n },\n ok: false,\n };\n }\n\n const result = await descriptor.execute(\n call.input,\n createExecutionContext(\n signal,\n provider.name,\n descriptor.safeName,\n descriptor.originalName,\n ),\n );\n\n if (result !== undefined && !isJsonSerializable(result)) {\n throw new ExecuteFailure(\n \"serialization_error\",\n \"Host value is not JSON-serializable\",\n );\n }\n\n return {\n ok: true,\n result,\n };\n } catch (error) {\n return {\n error: toTrustedExecuteError(error),\n ok: false,\n };\n }\n };\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport {\n runHostTransportSession,\n type HostTransport,\n} from \"@execbox/core/protocol\";\nimport type { ExecutorPoolOptions } from \"@execbox/core\";\nimport {\n resolveExecutorRuntimeOptions,\n type ExecutionOptions,\n type ExecuteResult,\n type ExecutorRuntimeOptions,\n type ResolvedToolProvider,\n} from \"../../../core/src/runtime.ts\";\n\n/**\n * Default grace period before a hosted shell is forcefully terminated.\n */\nconst DEFAULT_CANCEL_GRACE_MS = 25;\n\n/**\n * Default pooling limits shared by the hosted QuickJS executors.\n */\nconst DEFAULT_POOL_OPTIONS: Required<ExecutorPoolOptions> = {\n idleTimeoutMs: 30_000,\n maxSize: 1,\n minSize: 0,\n prewarm: false,\n};\n\n/**\n * Minimal code used to warm a hosted shell without touching user providers.\n */\nconst DEFAULT_PREWARM_CODE = \"undefined\";\n\nexport { DEFAULT_CANCEL_GRACE_MS, DEFAULT_POOL_OPTIONS, DEFAULT_PREWARM_CODE };\n\n/**\n * Wraps a transport so warmup and pooled execution can borrow it without\n * taking ownership of its lifecycle.\n */\nexport function createBorrowedTransport(\n transport: HostTransport,\n): HostTransport {\n return {\n dispose() {},\n onClose: transport.onClose,\n onError: transport.onError,\n onMessage: transport.onMessage,\n send: transport.send,\n terminate: transport.terminate,\n };\n}\n\n/**\n * Resolves how many pooled shells should be prewarmed from the pool settings.\n */\nexport function getPrewarmCount(pool: ExecutorPoolOptions | undefined): number {\n if (!pool?.prewarm) {\n return 0;\n }\n\n if (typeof pool.prewarm === \"number\") {\n return Math.max(0, Math.min(pool.prewarm, pool.maxSize));\n }\n\n return Math.max(1, Math.min(pool.minSize ?? 1, pool.maxSize));\n}\n\n/**\n * Caps an explicit warmup request to the configured pool boundaries.\n */\nexport function getWarmupTarget(\n count: number | undefined,\n poolOptions: ExecutorPoolOptions,\n): number {\n return Math.max(\n 0,\n Math.min(count ?? poolOptions.minSize ?? 0, poolOptions.maxSize),\n );\n}\n\n/**\n * Returns whether a hosted execution result is safe to return to a pool.\n */\nexport function isReusableResult(result: ExecuteResult): boolean {\n return (\n result.ok || ![\"internal_error\", \"timeout\"].includes(result.error.code)\n );\n}\n\n/**\n * Normalizes a failed warmup result into an actionable host-side error.\n */\nexport function toWarmupError(label: string, result: ExecuteResult): Error {\n if (result.ok) {\n return new Error(`Failed to prewarm pooled ${label}`);\n }\n\n return new Error(\n `Failed to prewarm pooled ${label}: ${result.error.message}`,\n );\n}\n\n/**\n * Runs one transport-backed execution session with resolved runtime limits and\n * a fresh execution identifier.\n */\nexport async function runHostedTransportSession(options: {\n cancelGraceMs: number;\n code: string;\n executorOptions: ExecutorRuntimeOptions;\n onSettled?: (result: ExecuteResult) => Promise<void> | void;\n providers: ResolvedToolProvider[];\n requestOptions?: ExecutionOptions;\n transport: HostTransport;\n}): Promise<ExecuteResult> {\n return await runHostTransportSession({\n cancelGraceMs: options.cancelGraceMs,\n code: options.code,\n executionId: randomUUID(),\n onSettled: options.onSettled,\n providers: options.providers,\n runtimeOptions: resolveExecutorRuntimeOptions(\n options.executorOptions,\n options.requestOptions,\n ),\n signal: options.requestOptions?.signal,\n transport: options.transport,\n });\n}\n\n/**\n * Exercises a set of leased shells with a warmup run and releases each lease\n * according to the warmup result.\n */\nexport async function warmHostedPool<Shell>(options: {\n count: number;\n getTransport: (shell: Shell) => HostTransport;\n label: string;\n onRelease: (shell: Shell, reusable: boolean) => Promise<void>;\n runSession: (\n transport: HostTransport,\n code: string,\n providers: ResolvedToolProvider[],\n ) => Promise<ExecuteResult>;\n shells: Shell[];\n}): Promise<void> {\n const results = await Promise.allSettled(\n options.shells.map(async (shell) => {\n let reusable = false;\n\n try {\n const result = await options.runSession(\n createBorrowedTransport(options.getTransport(shell)),\n DEFAULT_PREWARM_CODE,\n [],\n );\n reusable = result.ok;\n if (!result.ok) {\n throw toWarmupError(options.label, result);\n }\n } finally {\n await options.onRelease(shell, reusable);\n }\n }),\n );\n\n const rejected = results.find((result) => result.status === \"rejected\");\n if (rejected?.status === \"rejected\") {\n throw rejected.reason;\n }\n}\n","import { fork, type ChildProcess } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n createResourcePool,\n getNodeTransportExecArgv,\n type HostTransport,\n type ResourcePool,\n type RunnerMessage,\n type TransportCloseReason,\n} from \"@execbox/core/protocol\";\nimport {\n createTimeoutExecuteResult,\n type ExecutionOptions,\n type Executor,\n type ExecuteResult,\n type ResolvedToolProvider,\n} from \"../../../core/src/runtime.ts\";\nimport type { ExecutorPoolOptions } from \"@execbox/core\";\n\nimport type { QuickJsProcessExecutorOptions } from \"../types.ts\";\nimport {\n DEFAULT_CANCEL_GRACE_MS,\n DEFAULT_POOL_OPTIONS,\n createBorrowedTransport,\n getPrewarmCount,\n getWarmupTarget,\n isReusableResult,\n runHostedTransportSession,\n warmHostedPool,\n} from \"./shared.ts\";\n\ninterface ProcessShell {\n child: ChildProcess;\n transport: HostTransport;\n}\n\nfunction resolveProcessEntryPath(): string {\n const extension = import.meta.url.endsWith(\".ts\") ? \".ts\" : \".js\";\n return fileURLToPath(new URL(`../processEntry${extension}`, import.meta.url));\n}\n\nfunction createUnexpectedExitMessage(\n code: number | null,\n signal: NodeJS.Signals | null,\n): string {\n if (code !== null) {\n return `Child process exited unexpectedly with code ${code}`;\n }\n\n if (signal) {\n return `Child process exited unexpectedly with signal ${signal}`;\n }\n\n return \"Child process exited unexpectedly\";\n}\n\nfunction createChildProcess(): ChildProcess {\n return fork(resolveProcessEntryPath(), [], {\n execArgv: getNodeTransportExecArgv(import.meta.url),\n stdio: [\"ignore\", \"ignore\", \"ignore\", \"ipc\"],\n });\n}\n\nfunction createProcessTransport(child: ChildProcess): HostTransport {\n let terminated = false;\n let closeReason: TransportCloseReason | undefined;\n const closeHandlers = new Set<(reason?: TransportCloseReason) => void>();\n const errorHandlers = new Set<(error: Error) => void>();\n const messageHandlers = new Set<(message: RunnerMessage) => void>();\n\n const terminateChild = () => {\n if (terminated) {\n return;\n }\n\n terminated = true;\n child.kill(\"SIGKILL\");\n };\n\n const notifyClose = (reason: TransportCloseReason) => {\n if (closeReason) {\n return;\n }\n\n closeReason = reason;\n for (const handler of closeHandlers) {\n handler(reason);\n }\n };\n\n const onDisconnect = () => {\n notifyClose({\n message: \"Child process disconnected unexpectedly\",\n });\n };\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n notifyClose({\n code,\n message: createUnexpectedExitMessage(code, signal),\n signal,\n });\n };\n const onError = (error: Error) => {\n for (const handler of errorHandlers) {\n handler(error);\n }\n };\n const onMessage = (message: unknown) => {\n for (const handler of messageHandlers) {\n handler(message as RunnerMessage);\n }\n };\n\n child.on(\"disconnect\", onDisconnect);\n child.on(\"exit\", onExit);\n child.on(\"error\", onError);\n child.on(\"message\", onMessage);\n\n return {\n dispose: () => {\n child.off(\"disconnect\", onDisconnect);\n child.off(\"exit\", onExit);\n child.off(\"error\", onError);\n child.off(\"message\", onMessage);\n terminateChild();\n },\n onClose: (handler) => {\n closeHandlers.add(handler);\n if (closeReason) {\n queueMicrotask(() => {\n if (closeHandlers.has(handler)) {\n handler(closeReason);\n }\n });\n }\n return () => {\n closeHandlers.delete(handler);\n };\n },\n onError: (handler) => {\n errorHandlers.add(handler);\n return () => errorHandlers.delete(handler);\n },\n onMessage: (handler) => {\n messageHandlers.add(handler);\n return () => messageHandlers.delete(handler);\n },\n send: (message) =>\n new Promise<void>((resolve, reject) => {\n if (!child.connected || typeof child.send !== \"function\") {\n reject(new Error(\"Child process disconnected unexpectedly\"));\n return;\n }\n\n child.send(message, (error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n }),\n terminate: () => {\n terminateChild();\n },\n };\n}\n\nfunction createProcessShell(): ProcessShell {\n const child = createChildProcess();\n return {\n child,\n transport: createProcessTransport(child),\n };\n}\n\nfunction resolvePoolOptions(\n options: QuickJsProcessExecutorOptions,\n): ExecutorPoolOptions | undefined {\n if (options.mode === \"ephemeral\") {\n return undefined;\n }\n\n return {\n ...DEFAULT_POOL_OPTIONS,\n ...options.pool,\n };\n}\n\n/**\n * Child-process executor that runs guest code inside a dedicated QuickJS runtime per call.\n */\nexport class ProcessHostedQuickJsExecutor implements Executor {\n private readonly cancelGraceMs: number;\n private readonly options: QuickJsProcessExecutorOptions;\n private readonly pool: ResourcePool<ProcessShell> | undefined;\n private readonly poolOptions: ExecutorPoolOptions | undefined;\n private readonly warmup: Promise<void> | undefined;\n\n /**\n * Creates a hosted QuickJS executor that launches child-process shells on demand.\n */\n constructor(options: QuickJsProcessExecutorOptions) {\n this.cancelGraceMs = options.cancelGraceMs ?? DEFAULT_CANCEL_GRACE_MS;\n this.options = options;\n const poolOptions = resolvePoolOptions(options);\n this.poolOptions = poolOptions;\n\n if (poolOptions) {\n this.pool = createResourcePool({\n create: async () => createProcessShell(),\n destroy: async (shell) => {\n await shell.transport.dispose();\n },\n idleTimeoutMs: poolOptions.idleTimeoutMs,\n maxSize: poolOptions.maxSize,\n minSize: poolOptions.minSize,\n });\n const prewarmCount = getPrewarmCount(poolOptions);\n if (prewarmCount > 0) {\n this.warmup = this.warmPool(prewarmCount);\n }\n }\n }\n\n /**\n * Disposes any pooled child-process shells owned by this executor.\n */\n async dispose(): Promise<void> {\n await this.pool?.dispose();\n }\n\n /**\n * Prewarms pooled child-process shells up to the requested count.\n */\n async prewarm(count?: number): Promise<void> {\n if (!this.pool || !this.poolOptions) {\n return;\n }\n\n const target = getWarmupTarget(count, this.poolOptions);\n if (target <= 0) {\n return;\n }\n\n await this.warmPool(target);\n }\n\n private async runTransportSession(\n transport: HostTransport,\n code: string,\n providers: ResolvedToolProvider[],\n options: ExecutionOptions = {},\n onSettled?: (result: ExecuteResult) => Promise<void> | void,\n ): Promise<ExecuteResult> {\n return await runHostedTransportSession({\n cancelGraceMs: this.cancelGraceMs,\n code,\n executorOptions: this.options,\n onSettled,\n providers,\n requestOptions: options,\n transport,\n });\n }\n\n private async warmPool(count: number): Promise<void> {\n if (!this.pool) {\n return;\n }\n\n await this.pool.prewarm(count);\n\n const leases: Array<{\n release: (reusable: boolean) => Promise<void>;\n value: ProcessShell;\n }> = [];\n try {\n for (let index = 0; index < count; index += 1) {\n leases.push(await this.pool.acquire());\n }\n } catch (error) {\n await Promise.allSettled(\n leases.map(async (lease) => await lease.release(false)),\n );\n throw error;\n }\n\n await warmHostedPool({\n count,\n getTransport: (lease) => lease.value.transport,\n label: \"child process\",\n onRelease: async (lease, reusable) => await lease.release(reusable),\n runSession: async (transport, code, providers) =>\n await this.runTransportSession(transport, code, providers),\n shells: leases,\n });\n }\n\n /**\n * Executes guest code in a child-process-hosted QuickJS shell.\n */\n async execute(\n code: string,\n providers: ResolvedToolProvider[],\n options: ExecutionOptions = {},\n ): Promise<ExecuteResult> {\n if (options.signal?.aborted) {\n return createTimeoutExecuteResult();\n }\n\n await this.warmup;\n if (this.pool) {\n const lease = await this.pool.acquire();\n\n return await this.runTransportSession(\n createBorrowedTransport(lease.value.transport),\n code,\n providers,\n options,\n async (result) => {\n await lease.release(isReusableResult(result));\n },\n );\n }\n\n let child: ChildProcess;\n\n try {\n child = createChildProcess();\n } catch (error) {\n return {\n durationMs: 0,\n error: {\n code: \"internal_error\",\n message: error instanceof Error ? error.message : String(error),\n },\n logs: [],\n ok: false,\n };\n }\n\n return await this.runTransportSession(\n createProcessTransport(child),\n code,\n providers,\n options,\n );\n }\n}\n","import { availableParallelism } from \"node:os\";\nimport { Worker } from \"node:worker_threads\";\n\nimport {\n createResourcePool,\n getNodeTransportExecArgv,\n type HostTransport,\n type ResourcePool,\n type RunnerMessage,\n type TransportCloseReason,\n} from \"@execbox/core/protocol\";\nimport {\n createTimeoutExecuteResult,\n type ExecutionOptions,\n type Executor,\n type ExecuteResult,\n type ResolvedToolProvider,\n} from \"../../../core/src/runtime.ts\";\nimport type { ExecutorPoolOptions } from \"@execbox/core\";\n\nimport type { QuickJsWorkerExecutorOptions } from \"../types.ts\";\nimport {\n DEFAULT_CANCEL_GRACE_MS,\n DEFAULT_POOL_OPTIONS,\n createBorrowedTransport,\n getPrewarmCount,\n getWarmupTarget,\n isReusableResult,\n runHostedTransportSession,\n warmHostedPool,\n} from \"./shared.ts\";\n\nconst DEFAULT_POOLED_WORKER_MAX_SIZE = 4;\n\ninterface WorkerShell {\n transport: HostTransport;\n worker: Worker;\n}\n\nfunction resolveWorkerEntryUrl(): URL {\n const extension = import.meta.url.endsWith(\".ts\") ? \".ts\" : \".js\";\n return new URL(`../workerEntry${extension}`, import.meta.url);\n}\n\nfunction createWorkerTransport(worker: Worker): HostTransport {\n let terminated = false;\n let closeReason: TransportCloseReason | undefined;\n const closeHandlers = new Set<(reason?: TransportCloseReason) => void>();\n const errorHandlers = new Set<(error: Error) => void>();\n const messageHandlers = new Set<(message: RunnerMessage) => void>();\n\n const terminateWorker = async () => {\n if (terminated) {\n return;\n }\n\n terminated = true;\n await worker.terminate().catch(() => {});\n };\n\n const notifyClose = (reason: TransportCloseReason) => {\n if (closeReason) {\n return;\n }\n\n closeReason = reason;\n for (const handler of closeHandlers) {\n handler(reason);\n }\n };\n\n const onExit = (code: number) => {\n notifyClose({\n code,\n message: `Worker exited unexpectedly with code ${code}`,\n });\n };\n const onError = (error: Error) => {\n for (const handler of errorHandlers) {\n handler(error);\n }\n };\n const onMessage = (message: unknown) => {\n for (const handler of messageHandlers) {\n handler(message as RunnerMessage);\n }\n };\n\n worker.on(\"exit\", onExit);\n worker.on(\"error\", onError);\n worker.on(\"message\", onMessage);\n\n return {\n dispose: async () => {\n worker.off(\"exit\", onExit);\n worker.off(\"error\", onError);\n worker.off(\"message\", onMessage);\n await terminateWorker();\n },\n onClose: (handler) => {\n closeHandlers.add(handler);\n if (closeReason) {\n queueMicrotask(() => {\n if (closeHandlers.has(handler)) {\n handler(closeReason);\n }\n });\n }\n return () => closeHandlers.delete(handler);\n },\n onError: (handler) => {\n errorHandlers.add(handler);\n return () => errorHandlers.delete(handler);\n },\n onMessage: (handler) => {\n messageHandlers.add(handler);\n return () => messageHandlers.delete(handler);\n },\n send: (message) => {\n worker.postMessage(message);\n },\n terminate: async () => {\n await terminateWorker();\n },\n };\n}\n\nfunction createWorkerShell(options: QuickJsWorkerExecutorOptions): WorkerShell {\n const worker = new Worker(resolveWorkerEntryUrl(), {\n execArgv: getNodeTransportExecArgv(import.meta.url),\n resourceLimits: options.workerResourceLimits,\n });\n\n return {\n transport: createWorkerTransport(worker),\n worker,\n };\n}\n\nfunction getDefaultPoolMaxSize(): number {\n try {\n return Math.max(\n 1,\n Math.min(availableParallelism(), DEFAULT_POOLED_WORKER_MAX_SIZE),\n );\n } catch {\n return 1;\n }\n}\n\nfunction resolvePoolOptions(\n options: QuickJsWorkerExecutorOptions,\n): ExecutorPoolOptions | undefined {\n if (options.mode === \"ephemeral\") {\n return undefined;\n }\n\n return {\n ...DEFAULT_POOL_OPTIONS,\n maxSize: getDefaultPoolMaxSize(),\n ...options.pool,\n };\n}\n\n/**\n * Worker-thread executor that runs guest code inside a dedicated QuickJS runtime per call.\n */\nexport class WorkerHostedQuickJsExecutor implements Executor {\n private readonly cancelGraceMs: number;\n private readonly options: QuickJsWorkerExecutorOptions;\n private readonly pool: ResourcePool<WorkerShell> | undefined;\n private readonly poolOptions: ExecutorPoolOptions | undefined;\n private readonly warmup: Promise<void> | undefined;\n\n /**\n * Creates a hosted QuickJS executor that launches worker-thread shells on demand.\n */\n constructor(options: QuickJsWorkerExecutorOptions) {\n this.cancelGraceMs = options.cancelGraceMs ?? DEFAULT_CANCEL_GRACE_MS;\n this.options = options;\n const poolOptions = resolvePoolOptions(options);\n this.poolOptions = poolOptions;\n\n if (poolOptions) {\n this.pool = createResourcePool({\n create: async () => createWorkerShell(options),\n destroy: async (shell) => {\n await shell.transport.dispose();\n },\n idleTimeoutMs: poolOptions.idleTimeoutMs,\n maxSize: poolOptions.maxSize,\n minSize: poolOptions.minSize,\n });\n const prewarmCount = getPrewarmCount(poolOptions);\n if (prewarmCount > 0) {\n this.warmup = this.warmPool(prewarmCount);\n }\n }\n }\n\n /**\n * Disposes any pooled worker-thread shells owned by this executor.\n */\n async dispose(): Promise<void> {\n await this.pool?.dispose();\n }\n\n /**\n * Prewarms pooled worker-thread shells up to the requested count.\n */\n async prewarm(count?: number): Promise<void> {\n if (!this.pool || !this.poolOptions) {\n return;\n }\n\n const target = getWarmupTarget(count, this.poolOptions);\n if (target <= 0) {\n return;\n }\n\n await this.warmPool(target);\n }\n\n private async runTransportSession(\n transport: HostTransport,\n code: string,\n providers: ResolvedToolProvider[],\n options: ExecutionOptions = {},\n onSettled?: (result: ExecuteResult) => Promise<void> | void,\n ): Promise<ExecuteResult> {\n return await runHostedTransportSession({\n cancelGraceMs: this.cancelGraceMs,\n code,\n executorOptions: this.options,\n onSettled,\n providers,\n requestOptions: options,\n transport,\n });\n }\n\n private async warmPool(count: number): Promise<void> {\n if (!this.pool) {\n return;\n }\n\n await this.pool.prewarm(count);\n\n const leases: Array<{\n release: (reusable: boolean) => Promise<void>;\n value: WorkerShell;\n }> = [];\n try {\n for (let index = 0; index < count; index += 1) {\n leases.push(await this.pool.acquire());\n }\n } catch (error) {\n await Promise.allSettled(\n leases.map(async (lease) => await lease.release(false)),\n );\n throw error;\n }\n\n await warmHostedPool({\n count,\n getTransport: (lease) => lease.value.transport,\n label: \"worker shell\",\n onRelease: async (lease, reusable) => await lease.release(reusable),\n runSession: async (transport, code, providers) =>\n await this.runTransportSession(transport, code, providers),\n shells: leases,\n });\n }\n\n /**\n * Executes guest code in a worker-thread-hosted QuickJS shell.\n */\n async execute(\n code: string,\n providers: ResolvedToolProvider[],\n options: ExecutionOptions = {},\n ): Promise<ExecuteResult> {\n if (options.signal?.aborted) {\n return createTimeoutExecuteResult();\n }\n\n await this.warmup;\n if (this.pool) {\n const lease = await this.pool.acquire();\n\n return await this.runTransportSession(\n createBorrowedTransport(lease.value.transport),\n code,\n providers,\n options,\n async (result) => {\n await lease.release(isReusableResult(result));\n },\n );\n }\n\n const worker = new Worker(resolveWorkerEntryUrl(), {\n execArgv: getNodeTransportExecArgv(import.meta.url),\n resourceLimits: this.options.workerResourceLimits,\n });\n\n return await this.runTransportSession(\n createWorkerTransport(worker),\n code,\n providers,\n options,\n );\n }\n}\n","import {\n createTimeoutExecuteResult,\n createToolCallDispatcher,\n extractProviderManifests,\n} from \"../../core/src/runtime.ts\";\nimport type {\n ExecutionOptions,\n ExecuteResult,\n Executor,\n ResolvedToolProvider,\n} from \"@execbox/core\";\n\nimport { ProcessHostedQuickJsExecutor } from \"./hosted/processHostedExecutor.ts\";\nimport { WorkerHostedQuickJsExecutor } from \"./hosted/workerHostedExecutor.ts\";\nimport { runQuickJsSession } from \"./runner/index.ts\";\nimport type {\n QuickJsExecutorOptions,\n QuickJsInlineExecutorOptions,\n QuickJsProcessExecutorOptions,\n QuickJsWorkerExecutorOptions,\n} from \"./types\";\n\nfunction isWorkerOptions(\n options: QuickJsExecutorOptions,\n): options is QuickJsWorkerExecutorOptions {\n return options.host === \"worker\";\n}\n\nfunction isProcessOptions(\n options: QuickJsExecutorOptions,\n): options is QuickJsProcessExecutorOptions {\n return options.host === \"process\";\n}\n\n/**\n * QuickJS-backed executor for inline, worker-backed, or process-backed JavaScript runs.\n */\nexport class QuickJsExecutor implements Executor {\n private readonly hostedExecutor: Executor | undefined;\n private readonly options: QuickJsInlineExecutorOptions | undefined;\n\n /**\n * Creates a QuickJS executor with inline QuickJS by default, or a hosted\n * worker/process shell when `host` is explicitly set.\n */\n constructor(options: QuickJsExecutorOptions = {}) {\n if (isWorkerOptions(options)) {\n this.hostedExecutor = new WorkerHostedQuickJsExecutor(options);\n return;\n }\n\n if (isProcessOptions(options)) {\n this.hostedExecutor = new ProcessHostedQuickJsExecutor(options);\n return;\n }\n\n this.options = options;\n }\n\n /**\n * Disposes any pooled hosted shells owned by this executor.\n */\n async dispose(): Promise<void> {\n await this.hostedExecutor?.dispose?.();\n }\n\n /**\n * Prewarms pooled hosted shells when the executor is running in worker or\n * process mode. Inline mode treats this as a no-op.\n */\n async prewarm(count?: number): Promise<void> {\n await this.hostedExecutor?.prewarm?.(count);\n }\n\n /**\n * Executes JavaScript against the provided tool namespaces in a fresh QuickJS runtime.\n */\n async execute(\n code: string,\n providers: ResolvedToolProvider[],\n options: ExecutionOptions = {},\n ): Promise<ExecuteResult> {\n if (this.hostedExecutor) {\n return await this.hostedExecutor.execute(code, providers, options);\n }\n\n if (options.signal?.aborted) {\n return createTimeoutExecuteResult();\n }\n\n const abortController = new AbortController();\n const onToolCall = createToolCallDispatcher(\n providers,\n abortController.signal,\n );\n const onAbort = () => {\n abortController.abort();\n };\n\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n try {\n return await runQuickJsSession(\n {\n abortController,\n code,\n onToolCall,\n providers: extractProviderManifests(providers),\n },\n {\n ...this.options,\n ...options,\n },\n );\n } finally {\n options.signal?.removeEventListener(\"abort\", onAbort);\n abortController.abort();\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["DEFAULT_POOL_OPTIONS: Required<ExecutorPoolOptions>","closeReason: TransportCloseReason | undefined","resolvePoolOptions","leases: Array<{\n release: (reusable: boolean) => Promise<void>;\n value: ProcessShell;\n }>","child: ChildProcess","closeReason: TransportCloseReason | undefined","Worker","leases: Array<{\n release: (reusable: boolean) => Promise<void>;\n value: WorkerShell;\n }>","runQuickJsSession"],"sources":["../src/hosted/shared.ts","../src/hosted/processHostedExecutor.ts","../src/hosted/workerHostedExecutor.ts","../src/quickjsExecutor.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport {\n runHostTransportSession,\n type HostTransport,\n} from \"@execbox/core/protocol\";\nimport type { ExecutorPoolOptions } from \"@execbox/core\";\nimport { resolveExecutorRuntimeOptions } from \"@execbox/core/runtime\";\nimport type {\n ExecutionOptions,\n ExecuteResult,\n ExecutorRuntimeOptions,\n ResolvedToolProvider,\n} from \"@execbox/core\";\n\n/**\n * Default grace period before a hosted shell is forcefully terminated.\n */\nconst DEFAULT_CANCEL_GRACE_MS = 25;\n\n/**\n * Default pooling limits shared by the hosted QuickJS executors.\n */\nconst DEFAULT_POOL_OPTIONS: Required<ExecutorPoolOptions> = {\n idleTimeoutMs: 30_000,\n maxSize: 1,\n minSize: 0,\n prewarm: false,\n};\n\n/**\n * Minimal code used to warm a hosted shell without touching user providers.\n */\nconst DEFAULT_PREWARM_CODE = \"undefined\";\n\nexport { DEFAULT_CANCEL_GRACE_MS, DEFAULT_POOL_OPTIONS, DEFAULT_PREWARM_CODE };\n\n/**\n * Wraps a transport so warmup and pooled execution can borrow it without\n * taking ownership of its lifecycle.\n */\nexport function createBorrowedTransport(\n transport: HostTransport,\n): HostTransport {\n return {\n dispose() {},\n onClose: transport.onClose,\n onError: transport.onError,\n onMessage: transport.onMessage,\n send: transport.send,\n terminate: transport.terminate,\n };\n}\n\n/**\n * Resolves how many pooled shells should be prewarmed from the pool settings.\n */\nexport function getPrewarmCount(pool: ExecutorPoolOptions | undefined): number {\n if (!pool?.prewarm) {\n return 0;\n }\n\n if (typeof pool.prewarm === \"number\") {\n return Math.max(0, Math.min(pool.prewarm, pool.maxSize));\n }\n\n return Math.max(1, Math.min(pool.minSize ?? 1, pool.maxSize));\n}\n\n/**\n * Caps an explicit warmup request to the configured pool boundaries.\n */\nexport function getWarmupTarget(\n count: number | undefined,\n poolOptions: ExecutorPoolOptions,\n): number {\n return Math.max(\n 0,\n Math.min(count ?? poolOptions.minSize ?? 0, poolOptions.maxSize),\n );\n}\n\n/**\n * Returns whether a hosted execution result is safe to return to a pool.\n */\nexport function isReusableResult(result: ExecuteResult): boolean {\n return (\n result.ok || ![\"internal_error\", \"timeout\"].includes(result.error.code)\n );\n}\n\n/**\n * Normalizes a failed warmup result into an actionable host-side error.\n */\nexport function toWarmupError(label: string, result: ExecuteResult): Error {\n if (result.ok) {\n return new Error(`Failed to prewarm pooled ${label}`);\n }\n\n return new Error(\n `Failed to prewarm pooled ${label}: ${result.error.message}`,\n );\n}\n\n/**\n * Runs one transport-backed execution session with resolved runtime limits and\n * a fresh execution identifier.\n */\nexport async function runHostedTransportSession(options: {\n cancelGraceMs: number;\n code: string;\n executorOptions: ExecutorRuntimeOptions;\n onSettled?: (result: ExecuteResult) => Promise<void> | void;\n providers: ResolvedToolProvider[];\n requestOptions?: ExecutionOptions;\n transport: HostTransport;\n}): Promise<ExecuteResult> {\n return await runHostTransportSession({\n cancelGraceMs: options.cancelGraceMs,\n code: options.code,\n executionId: randomUUID(),\n onSettled: options.onSettled,\n providers: options.providers,\n runtimeOptions: resolveExecutorRuntimeOptions(\n options.executorOptions,\n options.requestOptions,\n ),\n signal: options.requestOptions?.signal,\n transport: options.transport,\n });\n}\n\n/**\n * Exercises a set of leased shells with a warmup run and releases each lease\n * according to the warmup result.\n */\nexport async function warmHostedPool<Shell>(options: {\n count: number;\n getTransport: (shell: Shell) => HostTransport;\n label: string;\n onRelease: (shell: Shell, reusable: boolean) => Promise<void>;\n runSession: (\n transport: HostTransport,\n code: string,\n providers: ResolvedToolProvider[],\n ) => Promise<ExecuteResult>;\n shells: Shell[];\n}): Promise<void> {\n const results = await Promise.allSettled(\n options.shells.map(async (shell) => {\n let reusable = false;\n\n try {\n const result = await options.runSession(\n createBorrowedTransport(options.getTransport(shell)),\n DEFAULT_PREWARM_CODE,\n [],\n );\n reusable = result.ok;\n if (!result.ok) {\n throw toWarmupError(options.label, result);\n }\n } finally {\n await options.onRelease(shell, reusable);\n }\n }),\n );\n\n const rejected = results.find((result) => result.status === \"rejected\");\n if (rejected?.status === \"rejected\") {\n throw rejected.reason;\n }\n}\n","import { fork, type ChildProcess } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n createResourcePool,\n getNodeTransportExecArgv,\n type HostTransport,\n type ResourcePool,\n type RunnerMessage,\n type TransportCloseReason,\n} from \"@execbox/core/protocol\";\nimport { createTimeoutExecuteResult } from \"@execbox/core/runtime\";\nimport type {\n ExecutionOptions,\n Executor,\n ExecutorPoolOptions,\n ExecuteResult,\n ResolvedToolProvider,\n} from \"@execbox/core\";\n\nimport type { QuickJsProcessExecutorOptions } from \"../types.ts\";\nimport {\n DEFAULT_CANCEL_GRACE_MS,\n DEFAULT_POOL_OPTIONS,\n createBorrowedTransport,\n getPrewarmCount,\n getWarmupTarget,\n isReusableResult,\n runHostedTransportSession,\n warmHostedPool,\n} from \"./shared.ts\";\n\ninterface ProcessShell {\n child: ChildProcess;\n transport: HostTransport;\n}\n\nfunction resolveProcessEntryPath(): string {\n const extension = import.meta.url.endsWith(\".ts\") ? \".ts\" : \".js\";\n return fileURLToPath(new URL(`../processEntry${extension}`, import.meta.url));\n}\n\nfunction createUnexpectedExitMessage(\n code: number | null,\n signal: NodeJS.Signals | null,\n): string {\n if (code !== null) {\n return `Child process exited unexpectedly with code ${code}`;\n }\n\n if (signal) {\n return `Child process exited unexpectedly with signal ${signal}`;\n }\n\n return \"Child process exited unexpectedly\";\n}\n\nfunction createChildProcess(): ChildProcess {\n return fork(resolveProcessEntryPath(), [], {\n execArgv: getNodeTransportExecArgv(import.meta.url),\n stdio: [\"ignore\", \"ignore\", \"ignore\", \"ipc\"],\n });\n}\n\nfunction createProcessTransport(child: ChildProcess): HostTransport {\n let terminated = false;\n let closeReason: TransportCloseReason | undefined;\n const closeHandlers = new Set<(reason?: TransportCloseReason) => void>();\n const errorHandlers = new Set<(error: Error) => void>();\n const messageHandlers = new Set<(message: RunnerMessage) => void>();\n\n const terminateChild = () => {\n if (terminated) {\n return;\n }\n\n terminated = true;\n child.kill(\"SIGKILL\");\n };\n\n const notifyClose = (reason: TransportCloseReason) => {\n if (closeReason) {\n return;\n }\n\n closeReason = reason;\n for (const handler of closeHandlers) {\n handler(reason);\n }\n };\n\n const onDisconnect = () => {\n notifyClose({\n message: \"Child process disconnected unexpectedly\",\n });\n };\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n notifyClose({\n code,\n message: createUnexpectedExitMessage(code, signal),\n signal,\n });\n };\n const onError = (error: Error) => {\n for (const handler of errorHandlers) {\n handler(error);\n }\n };\n const onMessage = (message: unknown) => {\n for (const handler of messageHandlers) {\n handler(message as RunnerMessage);\n }\n };\n\n child.on(\"disconnect\", onDisconnect);\n child.on(\"exit\", onExit);\n child.on(\"error\", onError);\n child.on(\"message\", onMessage);\n\n return {\n dispose: () => {\n child.off(\"disconnect\", onDisconnect);\n child.off(\"exit\", onExit);\n child.off(\"error\", onError);\n child.off(\"message\", onMessage);\n terminateChild();\n },\n onClose: (handler) => {\n closeHandlers.add(handler);\n if (closeReason) {\n queueMicrotask(() => {\n if (closeHandlers.has(handler)) {\n handler(closeReason);\n }\n });\n }\n return () => {\n closeHandlers.delete(handler);\n };\n },\n onError: (handler) => {\n errorHandlers.add(handler);\n return () => errorHandlers.delete(handler);\n },\n onMessage: (handler) => {\n messageHandlers.add(handler);\n return () => messageHandlers.delete(handler);\n },\n send: (message) =>\n new Promise<void>((resolve, reject) => {\n if (!child.connected || typeof child.send !== \"function\") {\n reject(new Error(\"Child process disconnected unexpectedly\"));\n return;\n }\n\n child.send(message, (error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n }),\n terminate: () => {\n terminateChild();\n },\n };\n}\n\nfunction createProcessShell(): ProcessShell {\n const child = createChildProcess();\n return {\n child,\n transport: createProcessTransport(child),\n };\n}\n\nfunction resolvePoolOptions(\n options: QuickJsProcessExecutorOptions,\n): ExecutorPoolOptions | undefined {\n if (options.mode === \"ephemeral\") {\n return undefined;\n }\n\n return {\n ...DEFAULT_POOL_OPTIONS,\n ...options.pool,\n };\n}\n\n/**\n * Child-process executor that runs guest code inside a dedicated QuickJS runtime per call.\n */\nexport class ProcessHostedQuickJsExecutor implements Executor {\n private readonly cancelGraceMs: number;\n private readonly options: QuickJsProcessExecutorOptions;\n private readonly pool: ResourcePool<ProcessShell> | undefined;\n private readonly poolOptions: ExecutorPoolOptions | undefined;\n private readonly warmup: Promise<void> | undefined;\n\n /**\n * Creates a hosted QuickJS executor that launches child-process shells on demand.\n */\n constructor(options: QuickJsProcessExecutorOptions) {\n this.cancelGraceMs = options.cancelGraceMs ?? DEFAULT_CANCEL_GRACE_MS;\n this.options = options;\n const poolOptions = resolvePoolOptions(options);\n this.poolOptions = poolOptions;\n\n if (poolOptions) {\n this.pool = createResourcePool({\n create: async () => createProcessShell(),\n destroy: async (shell) => {\n await shell.transport.dispose();\n },\n idleTimeoutMs: poolOptions.idleTimeoutMs,\n maxSize: poolOptions.maxSize,\n minSize: poolOptions.minSize,\n });\n const prewarmCount = getPrewarmCount(poolOptions);\n if (prewarmCount > 0) {\n this.warmup = this.warmPool(prewarmCount);\n }\n }\n }\n\n /**\n * Disposes any pooled child-process shells owned by this executor.\n */\n async dispose(): Promise<void> {\n await this.pool?.dispose();\n }\n\n /**\n * Prewarms pooled child-process shells up to the requested count.\n */\n async prewarm(count?: number): Promise<void> {\n if (!this.pool || !this.poolOptions) {\n return;\n }\n\n const target = getWarmupTarget(count, this.poolOptions);\n if (target <= 0) {\n return;\n }\n\n await this.warmPool(target);\n }\n\n private async runTransportSession(\n transport: HostTransport,\n code: string,\n providers: ResolvedToolProvider[],\n options: ExecutionOptions = {},\n onSettled?: (result: ExecuteResult) => Promise<void> | void,\n ): Promise<ExecuteResult> {\n return await runHostedTransportSession({\n cancelGraceMs: this.cancelGraceMs,\n code,\n executorOptions: this.options,\n onSettled,\n providers,\n requestOptions: options,\n transport,\n });\n }\n\n private async warmPool(count: number): Promise<void> {\n if (!this.pool) {\n return;\n }\n\n await this.pool.prewarm(count);\n\n const leases: Array<{\n release: (reusable: boolean) => Promise<void>;\n value: ProcessShell;\n }> = [];\n try {\n for (let index = 0; index < count; index += 1) {\n leases.push(await this.pool.acquire());\n }\n } catch (error) {\n await Promise.allSettled(\n leases.map(async (lease) => await lease.release(false)),\n );\n throw error;\n }\n\n await warmHostedPool({\n count,\n getTransport: (lease) => lease.value.transport,\n label: \"child process\",\n onRelease: async (lease, reusable) => await lease.release(reusable),\n runSession: async (transport, code, providers) =>\n await this.runTransportSession(transport, code, providers),\n shells: leases,\n });\n }\n\n /**\n * Executes guest code in a child-process-hosted QuickJS shell.\n */\n async execute(\n code: string,\n providers: ResolvedToolProvider[],\n options: ExecutionOptions = {},\n ): Promise<ExecuteResult> {\n if (options.signal?.aborted) {\n return createTimeoutExecuteResult();\n }\n\n await this.warmup;\n if (this.pool) {\n const lease = await this.pool.acquire();\n\n return await this.runTransportSession(\n createBorrowedTransport(lease.value.transport),\n code,\n providers,\n options,\n async (result) => {\n await lease.release(isReusableResult(result));\n },\n );\n }\n\n let child: ChildProcess;\n\n try {\n child = createChildProcess();\n } catch (error) {\n return {\n durationMs: 0,\n error: {\n code: \"internal_error\",\n message: error instanceof Error ? error.message : String(error),\n },\n logs: [],\n ok: false,\n };\n }\n\n return await this.runTransportSession(\n createProcessTransport(child),\n code,\n providers,\n options,\n );\n }\n}\n","import { availableParallelism } from \"node:os\";\nimport { Worker } from \"node:worker_threads\";\n\nimport {\n createResourcePool,\n getNodeTransportExecArgv,\n type HostTransport,\n type ResourcePool,\n type RunnerMessage,\n type TransportCloseReason,\n} from \"@execbox/core/protocol\";\nimport { createTimeoutExecuteResult } from \"@execbox/core/runtime\";\nimport type {\n ExecutionOptions,\n Executor,\n ExecutorPoolOptions,\n ExecuteResult,\n ResolvedToolProvider,\n} from \"@execbox/core\";\n\nimport type { QuickJsWorkerExecutorOptions } from \"../types.ts\";\nimport {\n DEFAULT_CANCEL_GRACE_MS,\n DEFAULT_POOL_OPTIONS,\n createBorrowedTransport,\n getPrewarmCount,\n getWarmupTarget,\n isReusableResult,\n runHostedTransportSession,\n warmHostedPool,\n} from \"./shared.ts\";\n\nconst DEFAULT_POOLED_WORKER_MAX_SIZE = 4;\n\ninterface WorkerShell {\n transport: HostTransport;\n worker: Worker;\n}\n\nfunction resolveWorkerEntryUrl(): URL {\n const extension = import.meta.url.endsWith(\".ts\") ? \".ts\" : \".js\";\n return new URL(`../workerEntry${extension}`, import.meta.url);\n}\n\nfunction createWorkerTransport(worker: Worker): HostTransport {\n let terminated = false;\n let closeReason: TransportCloseReason | undefined;\n const closeHandlers = new Set<(reason?: TransportCloseReason) => void>();\n const errorHandlers = new Set<(error: Error) => void>();\n const messageHandlers = new Set<(message: RunnerMessage) => void>();\n\n const terminateWorker = async () => {\n if (terminated) {\n return;\n }\n\n terminated = true;\n await worker.terminate().catch(() => {});\n };\n\n const notifyClose = (reason: TransportCloseReason) => {\n if (closeReason) {\n return;\n }\n\n closeReason = reason;\n for (const handler of closeHandlers) {\n handler(reason);\n }\n };\n\n const onExit = (code: number) => {\n notifyClose({\n code,\n message: `Worker exited unexpectedly with code ${code}`,\n });\n };\n const onError = (error: Error) => {\n for (const handler of errorHandlers) {\n handler(error);\n }\n };\n const onMessage = (message: unknown) => {\n for (const handler of messageHandlers) {\n handler(message as RunnerMessage);\n }\n };\n\n worker.on(\"exit\", onExit);\n worker.on(\"error\", onError);\n worker.on(\"message\", onMessage);\n\n return {\n dispose: async () => {\n worker.off(\"exit\", onExit);\n worker.off(\"error\", onError);\n worker.off(\"message\", onMessage);\n await terminateWorker();\n },\n onClose: (handler) => {\n closeHandlers.add(handler);\n if (closeReason) {\n queueMicrotask(() => {\n if (closeHandlers.has(handler)) {\n handler(closeReason);\n }\n });\n }\n return () => closeHandlers.delete(handler);\n },\n onError: (handler) => {\n errorHandlers.add(handler);\n return () => errorHandlers.delete(handler);\n },\n onMessage: (handler) => {\n messageHandlers.add(handler);\n return () => messageHandlers.delete(handler);\n },\n send: (message) => {\n worker.postMessage(message);\n },\n terminate: async () => {\n await terminateWorker();\n },\n };\n}\n\nfunction createWorkerShell(options: QuickJsWorkerExecutorOptions): WorkerShell {\n const worker = new Worker(resolveWorkerEntryUrl(), {\n execArgv: getNodeTransportExecArgv(import.meta.url),\n resourceLimits: options.workerResourceLimits,\n });\n\n return {\n transport: createWorkerTransport(worker),\n worker,\n };\n}\n\nfunction getDefaultPoolMaxSize(): number {\n try {\n return Math.max(\n 1,\n Math.min(availableParallelism(), DEFAULT_POOLED_WORKER_MAX_SIZE),\n );\n } catch {\n return 1;\n }\n}\n\nfunction resolvePoolOptions(\n options: QuickJsWorkerExecutorOptions,\n): ExecutorPoolOptions | undefined {\n if (options.mode === \"ephemeral\") {\n return undefined;\n }\n\n return {\n ...DEFAULT_POOL_OPTIONS,\n maxSize: getDefaultPoolMaxSize(),\n ...options.pool,\n };\n}\n\n/**\n * Worker-thread executor that runs guest code inside a dedicated QuickJS runtime per call.\n */\nexport class WorkerHostedQuickJsExecutor implements Executor {\n private readonly cancelGraceMs: number;\n private readonly options: QuickJsWorkerExecutorOptions;\n private readonly pool: ResourcePool<WorkerShell> | undefined;\n private readonly poolOptions: ExecutorPoolOptions | undefined;\n private readonly warmup: Promise<void> | undefined;\n\n /**\n * Creates a hosted QuickJS executor that launches worker-thread shells on demand.\n */\n constructor(options: QuickJsWorkerExecutorOptions) {\n this.cancelGraceMs = options.cancelGraceMs ?? DEFAULT_CANCEL_GRACE_MS;\n this.options = options;\n const poolOptions = resolvePoolOptions(options);\n this.poolOptions = poolOptions;\n\n if (poolOptions) {\n this.pool = createResourcePool({\n create: async () => createWorkerShell(options),\n destroy: async (shell) => {\n await shell.transport.dispose();\n },\n idleTimeoutMs: poolOptions.idleTimeoutMs,\n maxSize: poolOptions.maxSize,\n minSize: poolOptions.minSize,\n });\n const prewarmCount = getPrewarmCount(poolOptions);\n if (prewarmCount > 0) {\n this.warmup = this.warmPool(prewarmCount);\n }\n }\n }\n\n /**\n * Disposes any pooled worker-thread shells owned by this executor.\n */\n async dispose(): Promise<void> {\n await this.pool?.dispose();\n }\n\n /**\n * Prewarms pooled worker-thread shells up to the requested count.\n */\n async prewarm(count?: number): Promise<void> {\n if (!this.pool || !this.poolOptions) {\n return;\n }\n\n const target = getWarmupTarget(count, this.poolOptions);\n if (target <= 0) {\n return;\n }\n\n await this.warmPool(target);\n }\n\n private async runTransportSession(\n transport: HostTransport,\n code: string,\n providers: ResolvedToolProvider[],\n options: ExecutionOptions = {},\n onSettled?: (result: ExecuteResult) => Promise<void> | void,\n ): Promise<ExecuteResult> {\n return await runHostedTransportSession({\n cancelGraceMs: this.cancelGraceMs,\n code,\n executorOptions: this.options,\n onSettled,\n providers,\n requestOptions: options,\n transport,\n });\n }\n\n private async warmPool(count: number): Promise<void> {\n if (!this.pool) {\n return;\n }\n\n await this.pool.prewarm(count);\n\n const leases: Array<{\n release: (reusable: boolean) => Promise<void>;\n value: WorkerShell;\n }> = [];\n try {\n for (let index = 0; index < count; index += 1) {\n leases.push(await this.pool.acquire());\n }\n } catch (error) {\n await Promise.allSettled(\n leases.map(async (lease) => await lease.release(false)),\n );\n throw error;\n }\n\n await warmHostedPool({\n count,\n getTransport: (lease) => lease.value.transport,\n label: \"worker shell\",\n onRelease: async (lease, reusable) => await lease.release(reusable),\n runSession: async (transport, code, providers) =>\n await this.runTransportSession(transport, code, providers),\n shells: leases,\n });\n }\n\n /**\n * Executes guest code in a worker-thread-hosted QuickJS shell.\n */\n async execute(\n code: string,\n providers: ResolvedToolProvider[],\n options: ExecutionOptions = {},\n ): Promise<ExecuteResult> {\n if (options.signal?.aborted) {\n return createTimeoutExecuteResult();\n }\n\n await this.warmup;\n if (this.pool) {\n const lease = await this.pool.acquire();\n\n return await this.runTransportSession(\n createBorrowedTransport(lease.value.transport),\n code,\n providers,\n options,\n async (result) => {\n await lease.release(isReusableResult(result));\n },\n );\n }\n\n const worker = new Worker(resolveWorkerEntryUrl(), {\n execArgv: getNodeTransportExecArgv(import.meta.url),\n resourceLimits: this.options.workerResourceLimits,\n });\n\n return await this.runTransportSession(\n createWorkerTransport(worker),\n code,\n providers,\n options,\n );\n }\n}\n","import {\n createTimeoutExecuteResult,\n createToolCallDispatcher,\n extractProviderManifests,\n} from \"@execbox/core/runtime\";\nimport type {\n ExecutionOptions,\n ExecuteResult,\n Executor,\n ResolvedToolProvider,\n} from \"@execbox/core\";\n\nimport { ProcessHostedQuickJsExecutor } from \"./hosted/processHostedExecutor.ts\";\nimport { WorkerHostedQuickJsExecutor } from \"./hosted/workerHostedExecutor.ts\";\nimport { runQuickJsSession } from \"./runner/index.ts\";\nimport type {\n QuickJsExecutorOptions,\n QuickJsInlineExecutorOptions,\n QuickJsProcessExecutorOptions,\n QuickJsWorkerExecutorOptions,\n} from \"./types\";\n\nfunction isWorkerOptions(\n options: QuickJsExecutorOptions,\n): options is QuickJsWorkerExecutorOptions {\n return options.host === \"worker\";\n}\n\nfunction isProcessOptions(\n options: QuickJsExecutorOptions,\n): options is QuickJsProcessExecutorOptions {\n return options.host === \"process\";\n}\n\n/**\n * QuickJS-backed executor for inline, worker-backed, or process-backed JavaScript runs.\n */\nexport class QuickJsExecutor implements Executor {\n private readonly hostedExecutor: Executor | undefined;\n private readonly options: QuickJsInlineExecutorOptions | undefined;\n\n /**\n * Creates a QuickJS executor with inline QuickJS by default, or a hosted\n * worker/process shell when `host` is explicitly set.\n */\n constructor(options: QuickJsExecutorOptions = {}) {\n if (isWorkerOptions(options)) {\n this.hostedExecutor = new WorkerHostedQuickJsExecutor(options);\n return;\n }\n\n if (isProcessOptions(options)) {\n this.hostedExecutor = new ProcessHostedQuickJsExecutor(options);\n return;\n }\n\n this.options = options;\n }\n\n /**\n * Disposes any pooled hosted shells owned by this executor.\n */\n async dispose(): Promise<void> {\n await this.hostedExecutor?.dispose?.();\n }\n\n /**\n * Prewarms pooled hosted shells when the executor is running in worker or\n * process mode. Inline mode treats this as a no-op.\n */\n async prewarm(count?: number): Promise<void> {\n await this.hostedExecutor?.prewarm?.(count);\n }\n\n /**\n * Executes JavaScript against the provided tool namespaces in a fresh QuickJS runtime.\n */\n async execute(\n code: string,\n providers: ResolvedToolProvider[],\n options: ExecutionOptions = {},\n ): Promise<ExecuteResult> {\n if (this.hostedExecutor) {\n return await this.hostedExecutor.execute(code, providers, options);\n }\n\n if (options.signal?.aborted) {\n return createTimeoutExecuteResult();\n }\n\n const abortController = new AbortController();\n const onToolCall = createToolCallDispatcher(\n providers,\n abortController.signal,\n );\n const onAbort = () => {\n abortController.abort();\n };\n\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n try {\n return await runQuickJsSession(\n {\n abortController,\n code,\n onToolCall,\n providers: extractProviderManifests(providers),\n },\n {\n ...this.options,\n ...options,\n },\n );\n } finally {\n options.signal?.removeEventListener(\"abort\", onAbort);\n abortController.abort();\n }\n }\n}\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -2,7 +2,7 @@
2
2
  * @packageDocumentation
3
3
  * Public TypeScript declarations for this package entrypoint.
4
4
  */
5
- import { a as QuickJsProcessExecutorOptions, i as QuickJsInlineExecutorOptions, n as QuickJsExecutorOptions, o as QuickJsWorkerExecutorOptions, r as QuickJsHostedMode, s as WorkerResourceLimits, t as QuickJsExecutorHost } from "./types-CnNmLawC.cjs";
5
+ import { a as QuickJsProcessExecutorOptions, i as QuickJsInlineExecutorOptions, n as QuickJsExecutorOptions, o as QuickJsWorkerExecutorOptions, r as QuickJsHostedMode, s as WorkerResourceLimits, t as QuickJsExecutorHost } from "./types-BMA2zKnX.cjs";
6
6
  import { ExecuteResult, ExecutionOptions, Executor, ResolvedToolProvider } from "@execbox/core";
7
7
 
8
8
  //#region src/quickjsExecutor.d.ts
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * @packageDocumentation
3
3
  * Public TypeScript declarations for this package entrypoint.
4
4
  */
5
- import { a as QuickJsProcessExecutorOptions, i as QuickJsInlineExecutorOptions, n as QuickJsExecutorOptions, o as QuickJsWorkerExecutorOptions, r as QuickJsHostedMode, s as WorkerResourceLimits, t as QuickJsExecutorHost } from "./types-BeVqrcj8.js";
5
+ import { a as QuickJsProcessExecutorOptions, i as QuickJsInlineExecutorOptions, n as QuickJsExecutorOptions, o as QuickJsWorkerExecutorOptions, r as QuickJsHostedMode, s as WorkerResourceLimits, t as QuickJsExecutorHost } from "./types-7wOdERLE.js";
6
6
  import { ExecuteResult, ExecutionOptions, Executor, ResolvedToolProvider } from "@execbox/core";
7
7
 
8
8
  //#region src/quickjsExecutor.d.ts
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
- import { a as isJsonSerializable, c as getExecutionTimeoutMessage, i as isExecuteFailure, l as normalizeThrownMessage, n as resolveExecutorRuntimeOptions, o as createExecutionContext, r as ExecuteFailure, s as createTimeoutExecuteResult, t as runQuickJsSession } from "./runner-CteKTaPD.js";
1
+ import { t as runQuickJsSession } from "./runner-DJ5AWw-k.js";
2
+ import { createTimeoutExecuteResult, createToolCallDispatcher, extractProviderManifests, resolveExecutorRuntimeOptions } from "@execbox/core/runtime";
2
3
  import { fork } from "node:child_process";
3
4
  import { fileURLToPath } from "node:url";
4
5
  import { createResourcePool, getNodeTransportExecArgv, runHostTransportSession } from "@execbox/core/protocol";
@@ -6,70 +7,6 @@ import { randomUUID } from "node:crypto";
6
7
  import { availableParallelism } from "node:os";
7
8
  import { Worker } from "node:worker_threads";
8
9
 
9
- //#region ../core/src/runner.ts
10
- function toTrustedExecuteError(error) {
11
- if (isExecuteFailure(error)) return {
12
- code: error.code,
13
- message: error.message
14
- };
15
- return {
16
- code: "tool_error",
17
- message: normalizeThrownMessage(error)
18
- };
19
- }
20
- /**
21
- * Converts resolved providers into manifest metadata that reveals only namespace details.
22
- */
23
- function extractProviderManifests(providers) {
24
- return providers.map((provider) => ({
25
- name: provider.name,
26
- tools: Object.fromEntries(Object.entries(provider.tools).map(([safeToolName, descriptor]) => [safeToolName, {
27
- description: descriptor.description,
28
- originalName: descriptor.originalName,
29
- safeName: descriptor.safeName
30
- }])),
31
- types: provider.types
32
- }));
33
- }
34
- /**
35
- * Creates a host-side dispatcher for runner-emitted tool calls.
36
- */
37
- function createToolCallDispatcher(providers, signal) {
38
- const providerMap = new Map(providers.map((provider) => [provider.name, provider]));
39
- return async (call) => {
40
- const provider = providerMap.get(call.providerName);
41
- const descriptor = provider?.tools[call.safeToolName];
42
- if (!provider || !descriptor) return {
43
- error: {
44
- code: "internal_error",
45
- message: `Unknown tool ${call.providerName}.${call.safeToolName}`
46
- },
47
- ok: false
48
- };
49
- try {
50
- if (signal.aborted) return {
51
- error: {
52
- code: "timeout",
53
- message: getExecutionTimeoutMessage()
54
- },
55
- ok: false
56
- };
57
- const result = await descriptor.execute(call.input, createExecutionContext(signal, provider.name, descriptor.safeName, descriptor.originalName));
58
- if (result !== void 0 && !isJsonSerializable(result)) throw new ExecuteFailure("serialization_error", "Host value is not JSON-serializable");
59
- return {
60
- ok: true,
61
- result
62
- };
63
- } catch (error) {
64
- return {
65
- error: toTrustedExecuteError(error),
66
- ok: false
67
- };
68
- }
69
- };
70
- }
71
-
72
- //#endregion
73
10
  //#region src/hosted/shared.ts
74
11
  /**
75
12
  * Default grace period before a hosted shell is forcefully terminated.