@execbox/core 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.
- package/README.md +8 -10
- package/dist/{errors-wS8yjQhS.js → errors-DdWVEGU8.js} +1 -1
- package/dist/{errors-wS8yjQhS.js.map → errors-DdWVEGU8.js.map} +1 -1
- package/dist/index.cjs +2 -10
- package/dist/index.d.cts +3 -37
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +3 -37
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/mcp/index.cjs +1 -1
- package/dist/mcp/index.d.cts.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/protocol/index.cjs +1 -1
- package/dist/protocol/index.cjs.map +1 -1
- package/dist/protocol/index.d.cts +2 -2
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +3 -3
- package/dist/protocol/index.js.map +1 -1
- package/dist/{resolveProvider-UqQxdF4j.js → resolveProvider-Bfj27oYs.js} +3 -3
- package/dist/{resolveProvider-UqQxdF4j.js.map → resolveProvider-Bfj27oYs.js.map} +1 -1
- package/dist/{resolveProvider-BZYSw8Qk.cjs → resolveProvider-CszBWDOY.cjs} +1 -43
- package/dist/{resolveProvider-BZYSw8Qk.cjs.map → resolveProvider-CszBWDOY.cjs.map} +1 -1
- package/dist/{runner-6GMM-5ur.js → runner-BqYkAnOm.js} +2 -2
- package/dist/{runner-6GMM-5ur.js.map → runner-BqYkAnOm.js.map} +1 -1
- package/dist/runtime.cjs +1 -1
- package/dist/runtime.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,18 +9,16 @@ Core execution contract for execbox. Use it to resolve host tools into callable
|
|
|
9
9
|
## Use `@execbox/core` When
|
|
10
10
|
|
|
11
11
|
- you want to expose host capabilities to guest code through explicit tool providers
|
|
12
|
-
- you want one execution contract across
|
|
12
|
+
- you want one execution contract across inline and worker-hosted QuickJS
|
|
13
13
|
- you want to wrap MCP servers or clients into callable namespaces instead of exposing raw tool loops
|
|
14
14
|
|
|
15
15
|
## Pair It With an Executor
|
|
16
16
|
|
|
17
17
|
`@execbox/core` defines the provider and tool boundary, but it does not execute guest code on its own.
|
|
18
18
|
|
|
19
|
-
| Package
|
|
20
|
-
|
|
|
21
|
-
| [`@execbox/quickjs`](https://www.npmjs.com/package/@execbox/quickjs)
|
|
22
|
-
| [`@execbox/remote`](https://www.npmjs.com/package/@execbox/remote) | Your runtime already lives behind an application-owned transport boundary. |
|
|
23
|
-
| [`@execbox/isolated-vm`](https://www.npmjs.com/package/@execbox/isolated-vm) | You explicitly want the `isolated-vm` runtime and can support its constraints. |
|
|
19
|
+
| Package | Start here when |
|
|
20
|
+
| -------------------------------------------------------------------- | --------------------------------------------------------------- |
|
|
21
|
+
| [`@execbox/quickjs`](https://www.npmjs.com/package/@execbox/quickjs) | You want the default path with inline or worker-hosted QuickJS. |
|
|
24
22
|
|
|
25
23
|
## Install
|
|
26
24
|
|
|
@@ -30,12 +28,12 @@ Most users start with QuickJS:
|
|
|
30
28
|
npm install @execbox/core @execbox/quickjs
|
|
31
29
|
```
|
|
32
30
|
|
|
33
|
-
Swap in `@execbox/remote` or `@execbox/isolated-vm` when you need a different runtime boundary.
|
|
34
|
-
|
|
35
31
|
## Runtime Implementer Surface
|
|
36
32
|
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
Most application code can skip this section.
|
|
34
|
+
|
|
35
|
+
Application code should usually import from `@execbox/core` or `@execbox/core/mcp`.
|
|
36
|
+
The `@execbox/core/protocol` and `@execbox/core/runtime` subpaths exist for execbox-owned runtime packages. `@execbox/core/protocol` carries the worker-hosted QuickJS message contract, while `@execbox/core/runtime` contains the manifest dispatcher, runtime option defaults, timeout helpers, log formatting, code normalization, and error normalization used to keep runtime implementations aligned.
|
|
39
37
|
|
|
40
38
|
## Smallest Working Usage
|
|
41
39
|
|
|
@@ -58,4 +58,4 @@ function isJsonSerializable(value, active = /* @__PURE__ */ new Set(), memo = /*
|
|
|
58
58
|
|
|
59
59
|
//#endregion
|
|
60
60
|
export { isExecuteFailure as n, isJsonSerializable as r, ExecuteFailure as t };
|
|
61
|
-
//# sourceMappingURL=errors-
|
|
61
|
+
//# sourceMappingURL=errors-DdWVEGU8.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors-
|
|
1
|
+
{"version":3,"file":"errors-DdWVEGU8.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import type { ExecuteErrorCode } from \"./types\";\n\n/**\n * Structured failure used internally to propagate executor and tool errors.\n */\nexport class ExecuteFailure extends Error {\n code: ExecuteErrorCode;\n\n /**\n * Creates a structured failure with a trusted executor or tool error code.\n */\n constructor(code: ExecuteErrorCode, message: string) {\n super(message);\n this.code = code;\n this.name = \"ExecuteFailure\";\n }\n}\n\n/**\n * Returns whether a thrown value is an {@link ExecuteFailure}.\n */\nexport function isExecuteFailure(value: unknown): value is ExecuteFailure {\n return value instanceof ExecuteFailure;\n}\n\n/**\n * Returns whether a value can be serialized through the JSON-only host/guest boundary.\n */\nexport function isJsonSerializable(\n value: unknown,\n active = new Set<object>(),\n memo = new WeakSet<object>(),\n): boolean {\n if (value === null) {\n return true;\n }\n\n switch (typeof value) {\n case \"string\":\n case \"boolean\":\n return true;\n case \"number\":\n return Number.isFinite(value);\n case \"bigint\":\n case \"function\":\n case \"symbol\":\n case \"undefined\":\n return false;\n case \"object\": {\n const objectValue = value as object;\n\n if (memo.has(objectValue)) {\n return true;\n }\n\n if (active.has(objectValue)) {\n return false;\n }\n\n active.add(objectValue);\n let isSerializable = false;\n\n try {\n if (Array.isArray(value)) {\n isSerializable = value.every((item) =>\n isJsonSerializable(item, active, memo),\n );\n return isSerializable;\n }\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return false;\n }\n\n isSerializable = Object.values(value).every((item) =>\n isJsonSerializable(item, active, memo),\n );\n return isSerializable;\n } finally {\n active.delete(objectValue);\n if (isSerializable) {\n memo.add(objectValue);\n }\n }\n }\n }\n\n return false;\n}\n"],"mappings":";;;;AAKA,IAAa,iBAAb,cAAoC,MAAM;CACxC;;;;CAKA,YAAY,MAAwB,SAAiB;AACnD,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;;;;;;AAOhB,SAAgB,iBAAiB,OAAyC;AACxE,QAAO,iBAAiB;;;;;AAM1B,SAAgB,mBACd,OACA,yBAAS,IAAI,KAAa,EAC1B,uBAAO,IAAI,SAAiB,EACnB;AACT,KAAI,UAAU,KACZ,QAAO;AAGT,SAAQ,OAAO,OAAf;EACE,KAAK;EACL,KAAK,UACH,QAAO;EACT,KAAK,SACH,QAAO,OAAO,SAAS,MAAM;EAC/B,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YACH,QAAO;EACT,KAAK,UAAU;GACb,MAAM,cAAc;AAEpB,OAAI,KAAK,IAAI,YAAY,CACvB,QAAO;AAGT,OAAI,OAAO,IAAI,YAAY,CACzB,QAAO;AAGT,UAAO,IAAI,YAAY;GACvB,IAAI,iBAAiB;AAErB,OAAI;AACF,QAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,sBAAiB,MAAM,OAAO,SAC5B,mBAAmB,MAAM,QAAQ,KAAK,CACvC;AACD,YAAO;;IAGT,MAAM,YAAY,OAAO,eAAe,MAAM;AAC9C,QAAI,cAAc,OAAO,aAAa,cAAc,KAClD,QAAO;AAGT,qBAAiB,OAAO,OAAO,MAAM,CAAC,OAAO,SAC3C,mBAAmB,MAAM,QAAQ,KAAK,CACvC;AACD,WAAO;aACC;AACR,WAAO,OAAO,YAAY;AAC1B,QAAI,eACF,MAAK,IAAI,YAAY;;;;AAM7B,QAAO"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
const require_resolveProvider = require('./resolveProvider-
|
|
1
|
+
const require_resolveProvider = require('./resolveProvider-CszBWDOY.cjs');
|
|
2
2
|
const require_errors = require('./errors-xD8r6fCf.cjs');
|
|
3
3
|
|
|
4
4
|
exports.ExecuteFailure = require_errors.ExecuteFailure;
|
|
5
|
-
exports.assertValidIdentifier = require_resolveProvider.assertValidIdentifier;
|
|
6
|
-
exports.generateTypesFromJsonSchema = require_resolveProvider.generateTypesFromJsonSchema;
|
|
7
5
|
exports.isExecuteFailure = require_errors.isExecuteFailure;
|
|
8
|
-
exports.
|
|
9
|
-
exports.isReservedWord = require_resolveProvider.isReservedWord;
|
|
10
|
-
exports.isValidIdentifier = require_resolveProvider.isValidIdentifier;
|
|
11
|
-
exports.resolveProvider = require_resolveProvider.resolveProvider;
|
|
12
|
-
exports.sanitizeIdentifier = require_resolveProvider.sanitizeIdentifier;
|
|
13
|
-
exports.sanitizeToolName = require_resolveProvider.sanitizeToolName;
|
|
14
|
-
exports.serializePropertyName = require_resolveProvider.serializePropertyName;
|
|
6
|
+
exports.resolveProvider = require_resolveProvider.resolveProvider;
|
package/dist/index.d.cts
CHANGED
|
@@ -2,49 +2,15 @@
|
|
|
2
2
|
* @packageDocumentation
|
|
3
3
|
* Public TypeScript declarations for this package entrypoint.
|
|
4
4
|
*/
|
|
5
|
-
import { _ as ToolProvider,
|
|
5
|
+
import { _ as ToolProvider, d as ExecuteResult, f as JsonSchema, g as ToolExecutionContext, h as ToolDescriptor, l as ExecuteError, m as ResolvedToolProvider, n as ExecutorRuntimeOptions, p as ResolvedToolDescriptor, t as ExecutionOptions, u as ExecuteErrorCode, v as ToolSchema } from "./runner-DSgvu6Ad.cjs";
|
|
6
6
|
import { n as ExecutorPoolOptions, t as Executor } from "./executor-BsE5nF-j.cjs";
|
|
7
|
-
import { n as isExecuteFailure,
|
|
7
|
+
import { n as isExecuteFailure, t as ExecuteFailure } from "./errors-B9ADBuDH.cjs";
|
|
8
8
|
|
|
9
|
-
//#region src/identifier.d.ts
|
|
10
|
-
/**
|
|
11
|
-
* Returns whether the value is a valid JavaScript identifier.
|
|
12
|
-
*/
|
|
13
|
-
declare function isValidIdentifier(value: string): boolean;
|
|
14
|
-
/**
|
|
15
|
-
* Returns whether the identifier is reserved in JavaScript source.
|
|
16
|
-
*/
|
|
17
|
-
declare function isReservedWord(value: string): boolean;
|
|
18
|
-
/**
|
|
19
|
-
* Throws when the value cannot be used as a bare JavaScript identifier.
|
|
20
|
-
*/
|
|
21
|
-
declare function assertValidIdentifier(value: string, label?: string): void;
|
|
22
|
-
/**
|
|
23
|
-
* Converts a raw identifier-like value into a safe JavaScript identifier.
|
|
24
|
-
*/
|
|
25
|
-
declare function sanitizeIdentifier(value: string): string;
|
|
26
|
-
/**
|
|
27
|
-
* Renders the name as a bare identifier when possible, otherwise as a string literal.
|
|
28
|
-
*/
|
|
29
|
-
declare function serializePropertyName(name: string): string;
|
|
30
|
-
//#endregion
|
|
31
|
-
//#region src/sanitize.d.ts
|
|
32
|
-
/**
|
|
33
|
-
* Converts a raw tool name into a safe JavaScript identifier.
|
|
34
|
-
*/
|
|
35
|
-
declare function sanitizeToolName(name: string): string;
|
|
36
|
-
//#endregion
|
|
37
9
|
//#region src/provider/resolveProvider.d.ts
|
|
38
10
|
/**
|
|
39
11
|
* Resolves a tool provider into the validated, sanitized shape consumed by executors.
|
|
40
12
|
*/
|
|
41
13
|
declare function resolveProvider(provider: ToolProvider): ResolvedToolProvider;
|
|
42
14
|
//#endregion
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Generates a namespace declaration for a provider's tool schemas.
|
|
46
|
-
*/
|
|
47
|
-
declare function generateTypesFromJsonSchema(providerName: string, tools: Record<string, TypegenToolDescriptor>): string;
|
|
48
|
-
//#endregion
|
|
49
|
-
export { type ExecuteError, type ExecuteErrorCode, ExecuteFailure, type ExecuteResult, type ExecutionOptions, type Executor, type ExecutorPoolOptions, type ExecutorRuntimeOptions, type JsonSchema, type ProviderManifest, type ProviderToolManifest, type ResolvedToolDescriptor, type ResolvedToolProvider, type ToolCall, type ToolCallResult, type ToolDescriptor, type ToolExecutionContext, type ToolProvider, type ToolSchema, type TypegenToolDescriptor, assertValidIdentifier, generateTypesFromJsonSchema, isExecuteFailure, isJsonSerializable, isReservedWord, isValidIdentifier, resolveProvider, sanitizeIdentifier, sanitizeToolName, serializePropertyName };
|
|
15
|
+
export { type ExecuteError, type ExecuteErrorCode, ExecuteFailure, type ExecuteResult, type ExecutionOptions, type Executor, type ExecutorPoolOptions, type ExecutorRuntimeOptions, type JsonSchema, type ResolvedToolDescriptor, type ResolvedToolProvider, type ToolDescriptor, type ToolExecutionContext, type ToolProvider, type ToolSchema, isExecuteFailure, resolveProvider };
|
|
50
16
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/provider/resolveProvider.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;iBA4CgB,eAAA,WAA0B,eAAe"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,49 +2,15 @@
|
|
|
2
2
|
* @packageDocumentation
|
|
3
3
|
* Public TypeScript declarations for this package entrypoint.
|
|
4
4
|
*/
|
|
5
|
-
import { _ as ToolProvider,
|
|
5
|
+
import { _ as ToolProvider, d as ExecuteResult, f as JsonSchema, g as ToolExecutionContext, h as ToolDescriptor, l as ExecuteError, m as ResolvedToolProvider, n as ExecutorRuntimeOptions, p as ResolvedToolDescriptor, t as ExecutionOptions, u as ExecuteErrorCode, v as ToolSchema } from "./runner-ClFrFnz9.js";
|
|
6
6
|
import { n as ExecutorPoolOptions, t as Executor } from "./executor-B7q7K_27.js";
|
|
7
|
-
import { n as isExecuteFailure,
|
|
7
|
+
import { n as isExecuteFailure, t as ExecuteFailure } from "./errors-DlbJQYs7.js";
|
|
8
8
|
|
|
9
|
-
//#region src/identifier.d.ts
|
|
10
|
-
/**
|
|
11
|
-
* Returns whether the value is a valid JavaScript identifier.
|
|
12
|
-
*/
|
|
13
|
-
declare function isValidIdentifier(value: string): boolean;
|
|
14
|
-
/**
|
|
15
|
-
* Returns whether the identifier is reserved in JavaScript source.
|
|
16
|
-
*/
|
|
17
|
-
declare function isReservedWord(value: string): boolean;
|
|
18
|
-
/**
|
|
19
|
-
* Throws when the value cannot be used as a bare JavaScript identifier.
|
|
20
|
-
*/
|
|
21
|
-
declare function assertValidIdentifier(value: string, label?: string): void;
|
|
22
|
-
/**
|
|
23
|
-
* Converts a raw identifier-like value into a safe JavaScript identifier.
|
|
24
|
-
*/
|
|
25
|
-
declare function sanitizeIdentifier(value: string): string;
|
|
26
|
-
/**
|
|
27
|
-
* Renders the name as a bare identifier when possible, otherwise as a string literal.
|
|
28
|
-
*/
|
|
29
|
-
declare function serializePropertyName(name: string): string;
|
|
30
|
-
//#endregion
|
|
31
|
-
//#region src/sanitize.d.ts
|
|
32
|
-
/**
|
|
33
|
-
* Converts a raw tool name into a safe JavaScript identifier.
|
|
34
|
-
*/
|
|
35
|
-
declare function sanitizeToolName(name: string): string;
|
|
36
|
-
//#endregion
|
|
37
9
|
//#region src/provider/resolveProvider.d.ts
|
|
38
10
|
/**
|
|
39
11
|
* Resolves a tool provider into the validated, sanitized shape consumed by executors.
|
|
40
12
|
*/
|
|
41
13
|
declare function resolveProvider(provider: ToolProvider): ResolvedToolProvider;
|
|
42
14
|
//#endregion
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Generates a namespace declaration for a provider's tool schemas.
|
|
46
|
-
*/
|
|
47
|
-
declare function generateTypesFromJsonSchema(providerName: string, tools: Record<string, TypegenToolDescriptor>): string;
|
|
48
|
-
//#endregion
|
|
49
|
-
export { type ExecuteError, type ExecuteErrorCode, ExecuteFailure, type ExecuteResult, type ExecutionOptions, type Executor, type ExecutorPoolOptions, type ExecutorRuntimeOptions, type JsonSchema, type ProviderManifest, type ProviderToolManifest, type ResolvedToolDescriptor, type ResolvedToolProvider, type ToolCall, type ToolCallResult, type ToolDescriptor, type ToolExecutionContext, type ToolProvider, type ToolSchema, type TypegenToolDescriptor, assertValidIdentifier, generateTypesFromJsonSchema, isExecuteFailure, isJsonSerializable, isReservedWord, isValidIdentifier, resolveProvider, sanitizeIdentifier, sanitizeToolName, serializePropertyName };
|
|
15
|
+
export { type ExecuteError, type ExecuteErrorCode, ExecuteFailure, type ExecuteResult, type ExecutionOptions, type Executor, type ExecutorPoolOptions, type ExecutorRuntimeOptions, type JsonSchema, type ResolvedToolDescriptor, type ResolvedToolProvider, type ToolDescriptor, type ToolExecutionContext, type ToolProvider, type ToolSchema, isExecuteFailure, resolveProvider };
|
|
50
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/provider/resolveProvider.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;iBA4CgB,eAAA,WAA0B,eAAe"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { n as isExecuteFailure, t as ExecuteFailure } from "./errors-DdWVEGU8.js";
|
|
2
|
+
import { t as resolveProvider } from "./resolveProvider-Bfj27oYs.js";
|
|
3
3
|
|
|
4
|
-
export { ExecuteFailure,
|
|
4
|
+
export { ExecuteFailure, isExecuteFailure, resolveProvider };
|
package/dist/mcp/index.cjs
CHANGED
package/dist/mcp/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/mcp/createMcpToolProvider.ts","../../src/mcp/codeMcpServer.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;AAYY,IAAA,CAAA,mBAAA,CAAA,CAAA,CAAmB;EAQnB,MAAA,CAAA,CAPF,MAOE;EAQA,UAAA,CAAA,CAAA,CAdG,
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/mcp/createMcpToolProvider.ts","../../src/mcp/codeMcpServer.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import "../
|
|
1
|
+
import "../errors-DdWVEGU8.js";
|
|
2
|
+
import { i as renderNamespaceDeclaration, n as schemaToType, r as renderDocComment, t as resolveProvider } from "../resolveProvider-Bfj27oYs.js";
|
|
3
3
|
import * as z from "zod";
|
|
4
4
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
5
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
package/dist/protocol/index.cjs
CHANGED
|
@@ -213,7 +213,7 @@ const SOURCE_MODE_EXEC_ARGV = [
|
|
|
213
213
|
"tsx"
|
|
214
214
|
];
|
|
215
215
|
/**
|
|
216
|
-
* Returns the extra Node flags needed to launch transport-backed
|
|
216
|
+
* Returns the extra Node flags needed to launch transport-backed worker entries
|
|
217
217
|
* directly from source during local development and tests.
|
|
218
218
|
*/
|
|
219
219
|
function getNodeTransportExecArgv(moduleUrl) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["getExecutionTimeoutMessage","createToolCallDispatcher","forceTerminateTimer: NodeJS.Timeout | undefined","extractProviderManifests","available: PoolEntry<T>[]","waiters: Array<{\n reject: (error: Error) => void;\n resolve: (lease: ResourcePoolLease<T>) => void;\n }>"],"sources":["../../src/protocol/messages.ts","../../src/protocol/hostSession.ts","../../src/protocol/nodeBootstrap.ts","../../src/protocol/resourcePool.ts"],"sourcesContent":["import type {\n ExecutorRuntimeOptions,\n ProviderManifest,\n ToolCall,\n ToolCallResult,\n} from \"../runner.ts\";\nimport type { ExecuteResult } from \"../types.ts\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isRuntimeOptions(value: unknown): value is ExecutorRuntimeOptions {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n isFiniteNumber(value.maxLogChars) &&\n isFiniteNumber(value.maxLogLines) &&\n isFiniteNumber(value.memoryLimitBytes) &&\n isFiniteNumber(value.timeoutMs)\n );\n}\n\nfunction isProviderManifest(value: unknown): value is ProviderManifest {\n if (!isRecord(value) || typeof value.name !== \"string\") {\n return false;\n }\n\n if (!isRecord(value.tools) || typeof value.types !== \"string\") {\n return false;\n }\n\n return Object.values(value.tools).every(\n (tool) =>\n isRecord(tool) &&\n typeof tool.originalName === \"string\" &&\n typeof tool.safeName === \"string\" &&\n (tool.description === undefined || typeof tool.description === \"string\"),\n );\n}\n\nfunction isExecuteError(\n value: unknown,\n): value is { code: string; message: string } {\n return (\n isRecord(value) &&\n typeof value.code === \"string\" &&\n typeof value.message === \"string\"\n );\n}\n\nfunction isDonePayload(value: unknown): value is DoneMessage {\n if (!isRecord(value) || !isFiniteNumber(value.durationMs)) {\n return false;\n }\n\n if (\n !Array.isArray(value.logs) ||\n !value.logs.every((log) => typeof log === \"string\")\n ) {\n return false;\n }\n\n if (typeof value.ok !== \"boolean\") {\n return false;\n }\n\n return value.ok ? true : isExecuteError(value.error);\n}\n\n/**\n * Message sent from dispatcher to runner to start one execution session.\n */\nexport interface ExecuteMessage {\n code: string;\n id: string;\n options: ExecutorRuntimeOptions;\n providers: ProviderManifest[];\n type: \"execute\";\n}\n\n/**\n * Message sent from dispatcher to request prompt cancellation.\n */\nexport interface CancelMessage {\n id: string;\n type: \"cancel\";\n}\n\n/**\n * Message sent from a runner when guest code invokes a host tool.\n */\nexport interface ToolCallMessage extends ToolCall {\n callId: string;\n type: \"tool_call\";\n}\n\n/**\n * Message carrying a trusted host tool result back to the runner.\n */\nexport type ToolResultMessage = {\n callId: string;\n type: \"tool_result\";\n} & ToolCallResult;\n\n/**\n * Message indicating the runner has finished bootstrapping guest execution timing.\n */\nexport interface StartedMessage {\n id: string;\n type: \"started\";\n}\n\n/**\n * Final successful execution result returned by a runner.\n *\n * Node IPC can omit `undefined` fields during serialization, so `result`\n * remains optional at the protocol boundary and is normalized by the host.\n */\nexport type DoneSuccessMessage<T = unknown> = {\n durationMs: number;\n id: string;\n logs: string[];\n ok: true;\n result?: T;\n type: \"done\";\n};\n\n/**\n * Final failed execution result returned by a runner.\n */\nexport type DoneFailureMessage = {\n id: string;\n type: \"done\";\n} & Extract<ExecuteResult, { ok: false }>;\n\n/**\n * Final execution result returned by a runner.\n */\nexport type DoneMessage = DoneSuccessMessage | DoneFailureMessage;\n\n/**\n * Messages accepted by a runner transport endpoint.\n */\nexport type DispatcherMessage =\n | CancelMessage\n | ExecuteMessage\n | ToolResultMessage;\n\n/**\n * Messages emitted by a runner transport endpoint.\n */\nexport type RunnerMessage = DoneMessage | StartedMessage | ToolCallMessage;\n\n/**\n * Returns whether an unknown value is a dispatcher-to-runner message.\n */\nexport function isDispatcherMessage(\n value: unknown,\n): value is DispatcherMessage {\n if (!isRecord(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n switch (value.type) {\n case \"cancel\":\n return typeof value.id === \"string\";\n case \"execute\":\n return (\n typeof value.code === \"string\" &&\n typeof value.id === \"string\" &&\n isRuntimeOptions(value.options) &&\n Array.isArray(value.providers) &&\n value.providers.every(isProviderManifest)\n );\n case \"tool_result\":\n if (typeof value.callId !== \"string\" || typeof value.ok !== \"boolean\") {\n return false;\n }\n\n if (value.ok) {\n return \"result\" in value;\n }\n\n return isExecuteError(value.error);\n default:\n return false;\n }\n}\n\n/**\n * Returns whether an unknown value is a runner-to-dispatcher message.\n */\nexport function isRunnerMessage(value: unknown): value is RunnerMessage {\n if (!isRecord(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n switch (value.type) {\n case \"started\":\n return typeof value.id === \"string\";\n case \"tool_call\":\n return (\n typeof value.callId === \"string\" &&\n typeof value.providerName === \"string\" &&\n typeof value.safeToolName === \"string\" &&\n \"input\" in value\n );\n case \"done\":\n return typeof value.id === \"string\" && isDonePayload(value);\n default:\n return false;\n }\n}\n","import {\n createToolCallDispatcher,\n extractProviderManifests,\n type ExecutorRuntimeOptions,\n} from \"../runner.ts\";\nimport { getExecutionTimeoutMessage } from \"../executor/shared.ts\";\nimport type { ExecuteResult, ResolvedToolProvider } from \"../types.ts\";\n\nimport type {\n DispatcherMessage,\n DoneMessage,\n RunnerMessage,\n ToolCallMessage,\n} from \"./messages.ts\";\nimport { isRunnerMessage } from \"./messages.ts\";\n\nconst DEFAULT_CANCEL_GRACE_MS = 25;\nconst HOST_TIMEOUT_BACKSTOP_MS = 100;\n\n/**\n * Describes an unexpected transport shutdown reported to the host session.\n */\nexport interface TransportCloseReason {\n code?: number | null;\n message: string;\n signal?: NodeJS.Signals | null;\n}\n\n/**\n * Minimal parent-side transport contract for worker/process-backed execution.\n */\nexport interface HostTransport {\n dispose(): Promise<void> | void;\n onClose(handler: (reason?: TransportCloseReason) => void): () => void;\n onError(handler: (error: Error) => void): () => void;\n onMessage(handler: (message: RunnerMessage) => void): () => void;\n send(message: DispatcherMessage): Promise<void> | void;\n terminate(): Promise<void> | void;\n}\n\n/**\n * Configuration for one transport-backed execution session.\n */\nexport interface HostTransportSessionOptions {\n cancelGraceMs?: number;\n code: string;\n executionId: string;\n onSettled?: (result: ExecuteResult) => Promise<void> | void;\n providers: ResolvedToolProvider[];\n runtimeOptions: Required<ExecutorRuntimeOptions>;\n signal?: AbortSignal;\n transport: HostTransport;\n}\n\nfunction toFailureResult(\n startedAt: number,\n timeoutTriggered: boolean,\n message: string,\n): ExecuteResult {\n return {\n durationMs: Date.now() - startedAt,\n error: {\n code: timeoutTriggered ? \"timeout\" : \"internal_error\",\n message: timeoutTriggered ? getExecutionTimeoutMessage() : message,\n },\n logs: [],\n ok: false,\n };\n}\n\nfunction normalizeDoneMessage(message: DoneMessage): ExecuteResult {\n if (!message.ok) {\n return {\n durationMs: message.durationMs,\n error: message.error,\n logs: message.logs,\n ok: false,\n };\n }\n\n return {\n durationMs: message.durationMs,\n logs: message.logs,\n ok: true,\n result: message.result,\n };\n}\n\n/**\n * Runs one host-side transport session, including timeout, cancellation,\n * tool-call dispatch, and result settlement.\n */\nexport async function runHostTransportSession(\n options: HostTransportSessionOptions,\n): Promise<ExecuteResult> {\n const startedAt = Date.now();\n const abortController = new AbortController();\n const dispatchToolCall = createToolCallDispatcher(\n options.providers,\n abortController.signal,\n );\n const abortSignal = options.signal;\n\n return await new Promise<ExecuteResult>((resolve) => {\n let finished = false;\n let timeoutTriggered = false;\n let cancellationStarted = false;\n let forceTerminateTimer: NodeJS.Timeout | undefined;\n const cancelGraceMs = options.cancelGraceMs ?? DEFAULT_CANCEL_GRACE_MS;\n\n const cleanup = () => {\n finished = true;\n abortController.abort();\n if (timeoutTimer) {\n clearTimeout(timeoutTimer);\n }\n if (forceTerminateTimer) {\n clearTimeout(forceTerminateTimer);\n }\n offClose();\n offError();\n offMessage();\n abortSignal?.removeEventListener(\"abort\", onAbortSignal);\n };\n\n const finish = (result: ExecuteResult) => {\n if (finished) {\n return;\n }\n\n cleanup();\n void Promise.resolve(options.onSettled?.(result))\n .catch(() => {})\n .finally(() => {\n void Promise.resolve(options.transport.dispose()).catch(() => {});\n });\n resolve(result);\n };\n\n const fail = (message: string) => {\n finish(toFailureResult(startedAt, timeoutTriggered, message));\n };\n\n const send = (message: DispatcherMessage) => {\n if (finished) {\n return;\n }\n\n try {\n const pendingSend = options.transport.send(message);\n void Promise.resolve(pendingSend).catch((error) => {\n if (finished) {\n return;\n }\n\n fail(error instanceof Error ? error.message : String(error));\n });\n } catch (error) {\n fail(error instanceof Error ? error.message : String(error));\n }\n };\n\n const startCancellation = () => {\n if (finished || cancellationStarted) {\n return;\n }\n\n cancellationStarted = true;\n timeoutTriggered = true;\n abortController.abort();\n send({\n id: options.executionId,\n type: \"cancel\",\n });\n forceTerminateTimer = setTimeout(() => {\n if (finished) {\n return;\n }\n\n void Promise.resolve(options.transport.terminate())\n .catch(() => {})\n .finally(() => {\n if (finished) {\n return;\n }\n\n finish(\n toFailureResult(startedAt, true, getExecutionTimeoutMessage()),\n );\n });\n }, cancelGraceMs);\n };\n\n const timeoutTimer = setTimeout(() => {\n startCancellation();\n }, options.runtimeOptions.timeoutMs + HOST_TIMEOUT_BACKSTOP_MS);\n\n const onMessage = (message: RunnerMessage) => {\n if (finished) {\n return;\n }\n\n if (!isRunnerMessage(message)) {\n return;\n }\n\n if (\"id\" in message && message.id !== options.executionId) {\n return;\n }\n\n if (message.type === \"started\") {\n return;\n }\n\n if (message.type === \"tool_call\") {\n void dispatchToolCall(message as ToolCallMessage)\n .then((result) => {\n send({\n ...result,\n callId: message.callId,\n type: \"tool_result\",\n });\n })\n .catch((error) => {\n send({\n callId: message.callId,\n error: {\n code: \"internal_error\",\n message: error instanceof Error ? error.message : String(error),\n },\n ok: false,\n type: \"tool_result\",\n });\n });\n return;\n }\n\n finish(normalizeDoneMessage(message));\n };\n\n const onError = (error: Error) => {\n fail(error.message);\n };\n\n const onClose = (reason?: TransportCloseReason) => {\n fail(reason?.message ?? \"Transport closed unexpectedly\");\n };\n\n const onAbortSignal = () => {\n startCancellation();\n };\n\n const offMessage = options.transport.onMessage(onMessage);\n const offError = options.transport.onError(onError);\n const offClose = options.transport.onClose(onClose);\n abortSignal?.addEventListener(\"abort\", onAbortSignal, { once: true });\n\n if (abortSignal?.aborted) {\n startCancellation();\n return;\n }\n\n send({\n code: options.code,\n id: options.executionId,\n options: options.runtimeOptions,\n providers: extractProviderManifests(options.providers),\n type: \"execute\",\n });\n });\n}\n","const SOURCE_MODE_EXEC_ARGV = [\"--conditions=source\", \"--import\", \"tsx\"];\n\n/**\n * Returns the extra Node flags needed to launch transport-backed child entries\n * directly from source during local development and tests.\n */\nexport function getNodeTransportExecArgv(\n moduleUrl: string,\n): string[] | undefined {\n return moduleUrl.endsWith(\".ts\") ? [...SOURCE_MODE_EXEC_ARGV] : undefined;\n}\n","/**\n * One checked-out pooled resource plus its release hook.\n */\nexport interface ResourcePoolLease<T> {\n release(reusable?: boolean): Promise<void>;\n value: T;\n}\n\n/**\n * Configuration for a reusable async resource pool.\n */\nexport interface ResourcePoolOptions<T> {\n create: () => Promise<T> | T;\n destroy: (value: T) => Promise<void> | void;\n idleTimeoutMs?: number;\n maxSize: number;\n minSize?: number;\n}\n\n/**\n * Minimal async pool contract used by the pooled executors.\n */\nexport interface ResourcePool<T> {\n acquire(): Promise<ResourcePoolLease<T>>;\n dispose(): Promise<void>;\n prewarm(count?: number): Promise<void>;\n}\n\ninterface PoolEntry<T> {\n idleTimer: NodeJS.Timeout | undefined;\n value: T;\n}\n\nfunction clampTarget(value: number, maxSize: number): number {\n return Math.max(0, Math.min(value, maxSize));\n}\n\n/**\n * Creates a bounded async resource pool with optional idle eviction.\n */\nexport function createResourcePool<T>(\n options: ResourcePoolOptions<T>,\n): ResourcePool<T> {\n const available: PoolEntry<T>[] = [];\n const waiters: Array<{\n reject: (error: Error) => void;\n resolve: (lease: ResourcePoolLease<T>) => void;\n }> = [];\n const inUse = new Set<PoolEntry<T>>();\n let disposed = false;\n let totalSize = 0;\n\n const minSize = clampTarget(options.minSize ?? 0, options.maxSize);\n\n const createEntry = async (): Promise<PoolEntry<T>> => {\n totalSize += 1;\n\n try {\n return {\n idleTimer: undefined,\n value: await options.create(),\n };\n } catch (error) {\n totalSize -= 1;\n throw error;\n }\n };\n\n const removeAvailableEntry = (entry: PoolEntry<T>): void => {\n const index = available.indexOf(entry);\n\n if (index >= 0) {\n available.splice(index, 1);\n }\n };\n\n const clearIdleTimer = (entry: PoolEntry<T>): void => {\n if (entry.idleTimer) {\n clearTimeout(entry.idleTimer);\n entry.idleTimer = undefined;\n }\n };\n\n const queueAvailableEntry = (entry: PoolEntry<T>): void => {\n available.push(entry);\n\n if ((options.idleTimeoutMs ?? 0) > 0) {\n entry.idleTimer = setTimeout(() => {\n if (disposed) {\n return;\n }\n\n if (available.includes(entry) && totalSize > minSize) {\n void destroyEntry(entry);\n }\n }, options.idleTimeoutMs);\n }\n };\n\n const destroyEntry = async (entry: PoolEntry<T>): Promise<void> => {\n clearIdleTimer(entry);\n removeAvailableEntry(entry);\n inUse.delete(entry);\n totalSize -= 1;\n await options.destroy(entry.value);\n };\n\n const leaseEntry = (entry: PoolEntry<T>): ResourcePoolLease<T> => {\n clearIdleTimer(entry);\n removeAvailableEntry(entry);\n inUse.add(entry);\n\n return {\n release: async (reusable = true) => {\n if (!inUse.has(entry)) {\n return;\n }\n\n inUse.delete(entry);\n\n if (disposed || !reusable) {\n await destroyEntry(entry);\n await fillWaiters();\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve(leaseEntry(entry));\n return;\n }\n\n queueAvailableEntry(entry);\n },\n value: entry.value,\n };\n };\n\n const fillWaiters = async (): Promise<void> => {\n while (!disposed && waiters.length > 0 && totalSize < options.maxSize) {\n const waiter = waiters.shift();\n if (!waiter) {\n return;\n }\n\n try {\n waiter.resolve(leaseEntry(await createEntry()));\n } catch (error) {\n waiter.reject(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n };\n\n return {\n acquire: async () => {\n if (disposed) {\n throw new Error(\"Resource pool is disposed\");\n }\n\n const entry = available.pop();\n if (entry) {\n return leaseEntry(entry);\n }\n\n if (totalSize < options.maxSize) {\n return leaseEntry(await createEntry());\n }\n\n return await new Promise<ResourcePoolLease<T>>((resolve, reject) => {\n waiters.push({ reject, resolve });\n });\n },\n dispose: async () => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n\n while (waiters.length > 0) {\n waiters.shift()?.reject(new Error(\"Resource pool is disposed\"));\n }\n\n const idleEntries = [...available];\n available.length = 0;\n await Promise.all(idleEntries.map((entry) => destroyEntry(entry)));\n },\n prewarm: async (count) => {\n if (disposed) {\n throw new Error(\"Resource pool is disposed\");\n }\n\n const target = clampTarget(count ?? minSize, options.maxSize);\n const missing = target - totalSize;\n\n if (missing <= 0) {\n return;\n }\n\n const created = await Promise.all(\n Array.from({ length: missing }, async () => await createEntry()),\n );\n\n for (const entry of created) {\n queueAvailableEntry(entry);\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["getExecutionTimeoutMessage","createToolCallDispatcher","forceTerminateTimer: NodeJS.Timeout | undefined","extractProviderManifests","available: PoolEntry<T>[]","waiters: Array<{\n reject: (error: Error) => void;\n resolve: (lease: ResourcePoolLease<T>) => void;\n }>"],"sources":["../../src/protocol/messages.ts","../../src/protocol/hostSession.ts","../../src/protocol/nodeBootstrap.ts","../../src/protocol/resourcePool.ts"],"sourcesContent":["import type {\n ExecutorRuntimeOptions,\n ProviderManifest,\n ToolCall,\n ToolCallResult,\n} from \"../runner.ts\";\nimport type { ExecuteResult } from \"../types.ts\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isRuntimeOptions(value: unknown): value is ExecutorRuntimeOptions {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n isFiniteNumber(value.maxLogChars) &&\n isFiniteNumber(value.maxLogLines) &&\n isFiniteNumber(value.memoryLimitBytes) &&\n isFiniteNumber(value.timeoutMs)\n );\n}\n\nfunction isProviderManifest(value: unknown): value is ProviderManifest {\n if (!isRecord(value) || typeof value.name !== \"string\") {\n return false;\n }\n\n if (!isRecord(value.tools) || typeof value.types !== \"string\") {\n return false;\n }\n\n return Object.values(value.tools).every(\n (tool) =>\n isRecord(tool) &&\n typeof tool.originalName === \"string\" &&\n typeof tool.safeName === \"string\" &&\n (tool.description === undefined || typeof tool.description === \"string\"),\n );\n}\n\nfunction isExecuteError(\n value: unknown,\n): value is { code: string; message: string } {\n return (\n isRecord(value) &&\n typeof value.code === \"string\" &&\n typeof value.message === \"string\"\n );\n}\n\nfunction isDonePayload(value: unknown): value is DoneMessage {\n if (!isRecord(value) || !isFiniteNumber(value.durationMs)) {\n return false;\n }\n\n if (\n !Array.isArray(value.logs) ||\n !value.logs.every((log) => typeof log === \"string\")\n ) {\n return false;\n }\n\n if (typeof value.ok !== \"boolean\") {\n return false;\n }\n\n return value.ok ? true : isExecuteError(value.error);\n}\n\n/**\n * Message sent from dispatcher to runner to start one execution session.\n */\nexport interface ExecuteMessage {\n code: string;\n id: string;\n options: ExecutorRuntimeOptions;\n providers: ProviderManifest[];\n type: \"execute\";\n}\n\n/**\n * Message sent from dispatcher to request prompt cancellation.\n */\nexport interface CancelMessage {\n id: string;\n type: \"cancel\";\n}\n\n/**\n * Message sent from a runner when guest code invokes a host tool.\n */\nexport interface ToolCallMessage extends ToolCall {\n callId: string;\n type: \"tool_call\";\n}\n\n/**\n * Message carrying a trusted host tool result back to the runner.\n */\nexport type ToolResultMessage = {\n callId: string;\n type: \"tool_result\";\n} & ToolCallResult;\n\n/**\n * Message indicating the runner has finished bootstrapping guest execution timing.\n */\nexport interface StartedMessage {\n id: string;\n type: \"started\";\n}\n\n/**\n * Final successful execution result returned by a runner.\n *\n * Node IPC can omit `undefined` fields during serialization, so `result`\n * remains optional at the protocol boundary and is normalized by the host.\n */\nexport type DoneSuccessMessage<T = unknown> = {\n durationMs: number;\n id: string;\n logs: string[];\n ok: true;\n result?: T;\n type: \"done\";\n};\n\n/**\n * Final failed execution result returned by a runner.\n */\nexport type DoneFailureMessage = {\n id: string;\n type: \"done\";\n} & Extract<ExecuteResult, { ok: false }>;\n\n/**\n * Final execution result returned by a runner.\n */\nexport type DoneMessage = DoneSuccessMessage | DoneFailureMessage;\n\n/**\n * Messages accepted by a runner transport endpoint.\n */\nexport type DispatcherMessage =\n | CancelMessage\n | ExecuteMessage\n | ToolResultMessage;\n\n/**\n * Messages emitted by a runner transport endpoint.\n */\nexport type RunnerMessage = DoneMessage | StartedMessage | ToolCallMessage;\n\n/**\n * Returns whether an unknown value is a dispatcher-to-runner message.\n */\nexport function isDispatcherMessage(\n value: unknown,\n): value is DispatcherMessage {\n if (!isRecord(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n switch (value.type) {\n case \"cancel\":\n return typeof value.id === \"string\";\n case \"execute\":\n return (\n typeof value.code === \"string\" &&\n typeof value.id === \"string\" &&\n isRuntimeOptions(value.options) &&\n Array.isArray(value.providers) &&\n value.providers.every(isProviderManifest)\n );\n case \"tool_result\":\n if (typeof value.callId !== \"string\" || typeof value.ok !== \"boolean\") {\n return false;\n }\n\n if (value.ok) {\n return \"result\" in value;\n }\n\n return isExecuteError(value.error);\n default:\n return false;\n }\n}\n\n/**\n * Returns whether an unknown value is a runner-to-dispatcher message.\n */\nexport function isRunnerMessage(value: unknown): value is RunnerMessage {\n if (!isRecord(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n switch (value.type) {\n case \"started\":\n return typeof value.id === \"string\";\n case \"tool_call\":\n return (\n typeof value.callId === \"string\" &&\n typeof value.providerName === \"string\" &&\n typeof value.safeToolName === \"string\" &&\n \"input\" in value\n );\n case \"done\":\n return typeof value.id === \"string\" && isDonePayload(value);\n default:\n return false;\n }\n}\n","import {\n createToolCallDispatcher,\n extractProviderManifests,\n type ExecutorRuntimeOptions,\n} from \"../runner.ts\";\nimport { getExecutionTimeoutMessage } from \"../executor/shared.ts\";\nimport type { ExecuteResult, ResolvedToolProvider } from \"../types.ts\";\n\nimport type {\n DispatcherMessage,\n DoneMessage,\n RunnerMessage,\n ToolCallMessage,\n} from \"./messages.ts\";\nimport { isRunnerMessage } from \"./messages.ts\";\n\nconst DEFAULT_CANCEL_GRACE_MS = 25;\nconst HOST_TIMEOUT_BACKSTOP_MS = 100;\n\n/**\n * Describes an unexpected transport shutdown reported to the host session.\n */\nexport interface TransportCloseReason {\n code?: number | null;\n message: string;\n signal?: NodeJS.Signals | null;\n}\n\n/**\n * Minimal parent-side transport contract for transport-backed execution.\n */\nexport interface HostTransport {\n dispose(): Promise<void> | void;\n onClose(handler: (reason?: TransportCloseReason) => void): () => void;\n onError(handler: (error: Error) => void): () => void;\n onMessage(handler: (message: RunnerMessage) => void): () => void;\n send(message: DispatcherMessage): Promise<void> | void;\n terminate(): Promise<void> | void;\n}\n\n/**\n * Configuration for one transport-backed execution session.\n */\nexport interface HostTransportSessionOptions {\n cancelGraceMs?: number;\n code: string;\n executionId: string;\n onSettled?: (result: ExecuteResult) => Promise<void> | void;\n providers: ResolvedToolProvider[];\n runtimeOptions: Required<ExecutorRuntimeOptions>;\n signal?: AbortSignal;\n transport: HostTransport;\n}\n\nfunction toFailureResult(\n startedAt: number,\n timeoutTriggered: boolean,\n message: string,\n): ExecuteResult {\n return {\n durationMs: Date.now() - startedAt,\n error: {\n code: timeoutTriggered ? \"timeout\" : \"internal_error\",\n message: timeoutTriggered ? getExecutionTimeoutMessage() : message,\n },\n logs: [],\n ok: false,\n };\n}\n\nfunction normalizeDoneMessage(message: DoneMessage): ExecuteResult {\n if (!message.ok) {\n return {\n durationMs: message.durationMs,\n error: message.error,\n logs: message.logs,\n ok: false,\n };\n }\n\n return {\n durationMs: message.durationMs,\n logs: message.logs,\n ok: true,\n result: message.result,\n };\n}\n\n/**\n * Runs one host-side transport session, including timeout, cancellation,\n * tool-call dispatch, and result settlement.\n */\nexport async function runHostTransportSession(\n options: HostTransportSessionOptions,\n): Promise<ExecuteResult> {\n const startedAt = Date.now();\n const abortController = new AbortController();\n const dispatchToolCall = createToolCallDispatcher(\n options.providers,\n abortController.signal,\n );\n const abortSignal = options.signal;\n\n return await new Promise<ExecuteResult>((resolve) => {\n let finished = false;\n let timeoutTriggered = false;\n let cancellationStarted = false;\n let forceTerminateTimer: NodeJS.Timeout | undefined;\n const cancelGraceMs = options.cancelGraceMs ?? DEFAULT_CANCEL_GRACE_MS;\n\n const cleanup = () => {\n finished = true;\n abortController.abort();\n if (timeoutTimer) {\n clearTimeout(timeoutTimer);\n }\n if (forceTerminateTimer) {\n clearTimeout(forceTerminateTimer);\n }\n offClose();\n offError();\n offMessage();\n abortSignal?.removeEventListener(\"abort\", onAbortSignal);\n };\n\n const finish = (result: ExecuteResult) => {\n if (finished) {\n return;\n }\n\n cleanup();\n void Promise.resolve(options.onSettled?.(result))\n .catch(() => {})\n .finally(() => {\n void Promise.resolve(options.transport.dispose()).catch(() => {});\n });\n resolve(result);\n };\n\n const fail = (message: string) => {\n finish(toFailureResult(startedAt, timeoutTriggered, message));\n };\n\n const send = (message: DispatcherMessage) => {\n if (finished) {\n return;\n }\n\n try {\n const pendingSend = options.transport.send(message);\n void Promise.resolve(pendingSend).catch((error) => {\n if (finished) {\n return;\n }\n\n fail(error instanceof Error ? error.message : String(error));\n });\n } catch (error) {\n fail(error instanceof Error ? error.message : String(error));\n }\n };\n\n const startCancellation = () => {\n if (finished || cancellationStarted) {\n return;\n }\n\n cancellationStarted = true;\n timeoutTriggered = true;\n abortController.abort();\n send({\n id: options.executionId,\n type: \"cancel\",\n });\n forceTerminateTimer = setTimeout(() => {\n if (finished) {\n return;\n }\n\n void Promise.resolve(options.transport.terminate())\n .catch(() => {})\n .finally(() => {\n if (finished) {\n return;\n }\n\n finish(\n toFailureResult(startedAt, true, getExecutionTimeoutMessage()),\n );\n });\n }, cancelGraceMs);\n };\n\n const timeoutTimer = setTimeout(() => {\n startCancellation();\n }, options.runtimeOptions.timeoutMs + HOST_TIMEOUT_BACKSTOP_MS);\n\n const onMessage = (message: RunnerMessage) => {\n if (finished) {\n return;\n }\n\n if (!isRunnerMessage(message)) {\n return;\n }\n\n if (\"id\" in message && message.id !== options.executionId) {\n return;\n }\n\n if (message.type === \"started\") {\n return;\n }\n\n if (message.type === \"tool_call\") {\n void dispatchToolCall(message as ToolCallMessage)\n .then((result) => {\n send({\n ...result,\n callId: message.callId,\n type: \"tool_result\",\n });\n })\n .catch((error) => {\n send({\n callId: message.callId,\n error: {\n code: \"internal_error\",\n message: error instanceof Error ? error.message : String(error),\n },\n ok: false,\n type: \"tool_result\",\n });\n });\n return;\n }\n\n finish(normalizeDoneMessage(message));\n };\n\n const onError = (error: Error) => {\n fail(error.message);\n };\n\n const onClose = (reason?: TransportCloseReason) => {\n fail(reason?.message ?? \"Transport closed unexpectedly\");\n };\n\n const onAbortSignal = () => {\n startCancellation();\n };\n\n const offMessage = options.transport.onMessage(onMessage);\n const offError = options.transport.onError(onError);\n const offClose = options.transport.onClose(onClose);\n abortSignal?.addEventListener(\"abort\", onAbortSignal, { once: true });\n\n if (abortSignal?.aborted) {\n startCancellation();\n return;\n }\n\n send({\n code: options.code,\n id: options.executionId,\n options: options.runtimeOptions,\n providers: extractProviderManifests(options.providers),\n type: \"execute\",\n });\n });\n}\n","const SOURCE_MODE_EXEC_ARGV = [\"--conditions=source\", \"--import\", \"tsx\"];\n\n/**\n * Returns the extra Node flags needed to launch transport-backed worker entries\n * directly from source during local development and tests.\n */\nexport function getNodeTransportExecArgv(\n moduleUrl: string,\n): string[] | undefined {\n return moduleUrl.endsWith(\".ts\") ? [...SOURCE_MODE_EXEC_ARGV] : undefined;\n}\n","/**\n * One checked-out pooled resource plus its release hook.\n */\nexport interface ResourcePoolLease<T> {\n release(reusable?: boolean): Promise<void>;\n value: T;\n}\n\n/**\n * Configuration for a reusable async resource pool.\n */\nexport interface ResourcePoolOptions<T> {\n create: () => Promise<T> | T;\n destroy: (value: T) => Promise<void> | void;\n idleTimeoutMs?: number;\n maxSize: number;\n minSize?: number;\n}\n\n/**\n * Minimal async pool contract used by the pooled executors.\n */\nexport interface ResourcePool<T> {\n acquire(): Promise<ResourcePoolLease<T>>;\n dispose(): Promise<void>;\n prewarm(count?: number): Promise<void>;\n}\n\ninterface PoolEntry<T> {\n idleTimer: NodeJS.Timeout | undefined;\n value: T;\n}\n\nfunction clampTarget(value: number, maxSize: number): number {\n return Math.max(0, Math.min(value, maxSize));\n}\n\n/**\n * Creates a bounded async resource pool with optional idle eviction.\n */\nexport function createResourcePool<T>(\n options: ResourcePoolOptions<T>,\n): ResourcePool<T> {\n const available: PoolEntry<T>[] = [];\n const waiters: Array<{\n reject: (error: Error) => void;\n resolve: (lease: ResourcePoolLease<T>) => void;\n }> = [];\n const inUse = new Set<PoolEntry<T>>();\n let disposed = false;\n let totalSize = 0;\n\n const minSize = clampTarget(options.minSize ?? 0, options.maxSize);\n\n const createEntry = async (): Promise<PoolEntry<T>> => {\n totalSize += 1;\n\n try {\n return {\n idleTimer: undefined,\n value: await options.create(),\n };\n } catch (error) {\n totalSize -= 1;\n throw error;\n }\n };\n\n const removeAvailableEntry = (entry: PoolEntry<T>): void => {\n const index = available.indexOf(entry);\n\n if (index >= 0) {\n available.splice(index, 1);\n }\n };\n\n const clearIdleTimer = (entry: PoolEntry<T>): void => {\n if (entry.idleTimer) {\n clearTimeout(entry.idleTimer);\n entry.idleTimer = undefined;\n }\n };\n\n const queueAvailableEntry = (entry: PoolEntry<T>): void => {\n available.push(entry);\n\n if ((options.idleTimeoutMs ?? 0) > 0) {\n entry.idleTimer = setTimeout(() => {\n if (disposed) {\n return;\n }\n\n if (available.includes(entry) && totalSize > minSize) {\n void destroyEntry(entry);\n }\n }, options.idleTimeoutMs);\n }\n };\n\n const destroyEntry = async (entry: PoolEntry<T>): Promise<void> => {\n clearIdleTimer(entry);\n removeAvailableEntry(entry);\n inUse.delete(entry);\n totalSize -= 1;\n await options.destroy(entry.value);\n };\n\n const leaseEntry = (entry: PoolEntry<T>): ResourcePoolLease<T> => {\n clearIdleTimer(entry);\n removeAvailableEntry(entry);\n inUse.add(entry);\n\n return {\n release: async (reusable = true) => {\n if (!inUse.has(entry)) {\n return;\n }\n\n inUse.delete(entry);\n\n if (disposed || !reusable) {\n await destroyEntry(entry);\n await fillWaiters();\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve(leaseEntry(entry));\n return;\n }\n\n queueAvailableEntry(entry);\n },\n value: entry.value,\n };\n };\n\n const fillWaiters = async (): Promise<void> => {\n while (!disposed && waiters.length > 0 && totalSize < options.maxSize) {\n const waiter = waiters.shift();\n if (!waiter) {\n return;\n }\n\n try {\n waiter.resolve(leaseEntry(await createEntry()));\n } catch (error) {\n waiter.reject(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n };\n\n return {\n acquire: async () => {\n if (disposed) {\n throw new Error(\"Resource pool is disposed\");\n }\n\n const entry = available.pop();\n if (entry) {\n return leaseEntry(entry);\n }\n\n if (totalSize < options.maxSize) {\n return leaseEntry(await createEntry());\n }\n\n return await new Promise<ResourcePoolLease<T>>((resolve, reject) => {\n waiters.push({ reject, resolve });\n });\n },\n dispose: async () => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n\n while (waiters.length > 0) {\n waiters.shift()?.reject(new Error(\"Resource pool is disposed\"));\n }\n\n const idleEntries = [...available];\n available.length = 0;\n await Promise.all(idleEntries.map((entry) => destroyEntry(entry)));\n },\n prewarm: async (count) => {\n if (disposed) {\n throw new Error(\"Resource pool is disposed\");\n }\n\n const target = clampTarget(count ?? minSize, options.maxSize);\n const missing = target - totalSize;\n\n if (missing <= 0) {\n return;\n }\n\n const created = await Promise.all(\n Array.from({ length: missing }, async () => await createEntry()),\n );\n\n for (const entry of created) {\n queueAvailableEntry(entry);\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -98,7 +98,7 @@ interface TransportCloseReason {
|
|
|
98
98
|
signal?: NodeJS.Signals | null;
|
|
99
99
|
}
|
|
100
100
|
/**
|
|
101
|
-
* Minimal parent-side transport contract for
|
|
101
|
+
* Minimal parent-side transport contract for transport-backed execution.
|
|
102
102
|
*/
|
|
103
103
|
interface HostTransport {
|
|
104
104
|
dispose(): Promise<void> | void;
|
|
@@ -129,7 +129,7 @@ declare function runHostTransportSession(options: HostTransportSessionOptions):
|
|
|
129
129
|
//#endregion
|
|
130
130
|
//#region src/protocol/nodeBootstrap.d.ts
|
|
131
131
|
/**
|
|
132
|
-
* Returns the extra Node flags needed to launch transport-backed
|
|
132
|
+
* Returns the extra Node flags needed to launch transport-backed worker entries
|
|
133
133
|
* directly from source during local development and tests.
|
|
134
134
|
*/
|
|
135
135
|
declare function getNodeTransportExecArgv(moduleUrl: string): string[] | undefined;
|
package/dist/protocol/index.d.ts
CHANGED
|
@@ -98,7 +98,7 @@ interface TransportCloseReason {
|
|
|
98
98
|
signal?: NodeJS.Signals | null;
|
|
99
99
|
}
|
|
100
100
|
/**
|
|
101
|
-
* Minimal parent-side transport contract for
|
|
101
|
+
* Minimal parent-side transport contract for transport-backed execution.
|
|
102
102
|
*/
|
|
103
103
|
interface HostTransport {
|
|
104
104
|
dispose(): Promise<void> | void;
|
|
@@ -129,7 +129,7 @@ declare function runHostTransportSession(options: HostTransportSessionOptions):
|
|
|
129
129
|
//#endregion
|
|
130
130
|
//#region src/protocol/nodeBootstrap.d.ts
|
|
131
131
|
/**
|
|
132
|
-
* Returns the extra Node flags needed to launch transport-backed
|
|
132
|
+
* Returns the extra Node flags needed to launch transport-backed worker entries
|
|
133
133
|
* directly from source during local development and tests.
|
|
134
134
|
*/
|
|
135
135
|
declare function getNodeTransportExecArgv(moduleUrl: string): string[] | undefined;
|
package/dist/protocol/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../errors-
|
|
2
|
-
import { n as extractProviderManifests, o as getExecutionTimeoutMessage, t as createToolCallDispatcher } from "../runner-
|
|
1
|
+
import "../errors-DdWVEGU8.js";
|
|
2
|
+
import { n as extractProviderManifests, o as getExecutionTimeoutMessage, t as createToolCallDispatcher } from "../runner-BqYkAnOm.js";
|
|
3
3
|
|
|
4
4
|
//#region src/protocol/messages.ts
|
|
5
5
|
function isRecord(value) {
|
|
@@ -213,7 +213,7 @@ const SOURCE_MODE_EXEC_ARGV = [
|
|
|
213
213
|
"tsx"
|
|
214
214
|
];
|
|
215
215
|
/**
|
|
216
|
-
* Returns the extra Node flags needed to launch transport-backed
|
|
216
|
+
* Returns the extra Node flags needed to launch transport-backed worker entries
|
|
217
217
|
* directly from source during local development and tests.
|
|
218
218
|
*/
|
|
219
219
|
function getNodeTransportExecArgv(moduleUrl) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["forceTerminateTimer: NodeJS.Timeout | undefined","available: PoolEntry<T>[]","waiters: Array<{\n reject: (error: Error) => void;\n resolve: (lease: ResourcePoolLease<T>) => void;\n }>"],"sources":["../../src/protocol/messages.ts","../../src/protocol/hostSession.ts","../../src/protocol/nodeBootstrap.ts","../../src/protocol/resourcePool.ts"],"sourcesContent":["import type {\n ExecutorRuntimeOptions,\n ProviderManifest,\n ToolCall,\n ToolCallResult,\n} from \"../runner.ts\";\nimport type { ExecuteResult } from \"../types.ts\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isRuntimeOptions(value: unknown): value is ExecutorRuntimeOptions {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n isFiniteNumber(value.maxLogChars) &&\n isFiniteNumber(value.maxLogLines) &&\n isFiniteNumber(value.memoryLimitBytes) &&\n isFiniteNumber(value.timeoutMs)\n );\n}\n\nfunction isProviderManifest(value: unknown): value is ProviderManifest {\n if (!isRecord(value) || typeof value.name !== \"string\") {\n return false;\n }\n\n if (!isRecord(value.tools) || typeof value.types !== \"string\") {\n return false;\n }\n\n return Object.values(value.tools).every(\n (tool) =>\n isRecord(tool) &&\n typeof tool.originalName === \"string\" &&\n typeof tool.safeName === \"string\" &&\n (tool.description === undefined || typeof tool.description === \"string\"),\n );\n}\n\nfunction isExecuteError(\n value: unknown,\n): value is { code: string; message: string } {\n return (\n isRecord(value) &&\n typeof value.code === \"string\" &&\n typeof value.message === \"string\"\n );\n}\n\nfunction isDonePayload(value: unknown): value is DoneMessage {\n if (!isRecord(value) || !isFiniteNumber(value.durationMs)) {\n return false;\n }\n\n if (\n !Array.isArray(value.logs) ||\n !value.logs.every((log) => typeof log === \"string\")\n ) {\n return false;\n }\n\n if (typeof value.ok !== \"boolean\") {\n return false;\n }\n\n return value.ok ? true : isExecuteError(value.error);\n}\n\n/**\n * Message sent from dispatcher to runner to start one execution session.\n */\nexport interface ExecuteMessage {\n code: string;\n id: string;\n options: ExecutorRuntimeOptions;\n providers: ProviderManifest[];\n type: \"execute\";\n}\n\n/**\n * Message sent from dispatcher to request prompt cancellation.\n */\nexport interface CancelMessage {\n id: string;\n type: \"cancel\";\n}\n\n/**\n * Message sent from a runner when guest code invokes a host tool.\n */\nexport interface ToolCallMessage extends ToolCall {\n callId: string;\n type: \"tool_call\";\n}\n\n/**\n * Message carrying a trusted host tool result back to the runner.\n */\nexport type ToolResultMessage = {\n callId: string;\n type: \"tool_result\";\n} & ToolCallResult;\n\n/**\n * Message indicating the runner has finished bootstrapping guest execution timing.\n */\nexport interface StartedMessage {\n id: string;\n type: \"started\";\n}\n\n/**\n * Final successful execution result returned by a runner.\n *\n * Node IPC can omit `undefined` fields during serialization, so `result`\n * remains optional at the protocol boundary and is normalized by the host.\n */\nexport type DoneSuccessMessage<T = unknown> = {\n durationMs: number;\n id: string;\n logs: string[];\n ok: true;\n result?: T;\n type: \"done\";\n};\n\n/**\n * Final failed execution result returned by a runner.\n */\nexport type DoneFailureMessage = {\n id: string;\n type: \"done\";\n} & Extract<ExecuteResult, { ok: false }>;\n\n/**\n * Final execution result returned by a runner.\n */\nexport type DoneMessage = DoneSuccessMessage | DoneFailureMessage;\n\n/**\n * Messages accepted by a runner transport endpoint.\n */\nexport type DispatcherMessage =\n | CancelMessage\n | ExecuteMessage\n | ToolResultMessage;\n\n/**\n * Messages emitted by a runner transport endpoint.\n */\nexport type RunnerMessage = DoneMessage | StartedMessage | ToolCallMessage;\n\n/**\n * Returns whether an unknown value is a dispatcher-to-runner message.\n */\nexport function isDispatcherMessage(\n value: unknown,\n): value is DispatcherMessage {\n if (!isRecord(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n switch (value.type) {\n case \"cancel\":\n return typeof value.id === \"string\";\n case \"execute\":\n return (\n typeof value.code === \"string\" &&\n typeof value.id === \"string\" &&\n isRuntimeOptions(value.options) &&\n Array.isArray(value.providers) &&\n value.providers.every(isProviderManifest)\n );\n case \"tool_result\":\n if (typeof value.callId !== \"string\" || typeof value.ok !== \"boolean\") {\n return false;\n }\n\n if (value.ok) {\n return \"result\" in value;\n }\n\n return isExecuteError(value.error);\n default:\n return false;\n }\n}\n\n/**\n * Returns whether an unknown value is a runner-to-dispatcher message.\n */\nexport function isRunnerMessage(value: unknown): value is RunnerMessage {\n if (!isRecord(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n switch (value.type) {\n case \"started\":\n return typeof value.id === \"string\";\n case \"tool_call\":\n return (\n typeof value.callId === \"string\" &&\n typeof value.providerName === \"string\" &&\n typeof value.safeToolName === \"string\" &&\n \"input\" in value\n );\n case \"done\":\n return typeof value.id === \"string\" && isDonePayload(value);\n default:\n return false;\n }\n}\n","import {\n createToolCallDispatcher,\n extractProviderManifests,\n type ExecutorRuntimeOptions,\n} from \"../runner.ts\";\nimport { getExecutionTimeoutMessage } from \"../executor/shared.ts\";\nimport type { ExecuteResult, ResolvedToolProvider } from \"../types.ts\";\n\nimport type {\n DispatcherMessage,\n DoneMessage,\n RunnerMessage,\n ToolCallMessage,\n} from \"./messages.ts\";\nimport { isRunnerMessage } from \"./messages.ts\";\n\nconst DEFAULT_CANCEL_GRACE_MS = 25;\nconst HOST_TIMEOUT_BACKSTOP_MS = 100;\n\n/**\n * Describes an unexpected transport shutdown reported to the host session.\n */\nexport interface TransportCloseReason {\n code?: number | null;\n message: string;\n signal?: NodeJS.Signals | null;\n}\n\n/**\n * Minimal parent-side transport contract for worker/process-backed execution.\n */\nexport interface HostTransport {\n dispose(): Promise<void> | void;\n onClose(handler: (reason?: TransportCloseReason) => void): () => void;\n onError(handler: (error: Error) => void): () => void;\n onMessage(handler: (message: RunnerMessage) => void): () => void;\n send(message: DispatcherMessage): Promise<void> | void;\n terminate(): Promise<void> | void;\n}\n\n/**\n * Configuration for one transport-backed execution session.\n */\nexport interface HostTransportSessionOptions {\n cancelGraceMs?: number;\n code: string;\n executionId: string;\n onSettled?: (result: ExecuteResult) => Promise<void> | void;\n providers: ResolvedToolProvider[];\n runtimeOptions: Required<ExecutorRuntimeOptions>;\n signal?: AbortSignal;\n transport: HostTransport;\n}\n\nfunction toFailureResult(\n startedAt: number,\n timeoutTriggered: boolean,\n message: string,\n): ExecuteResult {\n return {\n durationMs: Date.now() - startedAt,\n error: {\n code: timeoutTriggered ? \"timeout\" : \"internal_error\",\n message: timeoutTriggered ? getExecutionTimeoutMessage() : message,\n },\n logs: [],\n ok: false,\n };\n}\n\nfunction normalizeDoneMessage(message: DoneMessage): ExecuteResult {\n if (!message.ok) {\n return {\n durationMs: message.durationMs,\n error: message.error,\n logs: message.logs,\n ok: false,\n };\n }\n\n return {\n durationMs: message.durationMs,\n logs: message.logs,\n ok: true,\n result: message.result,\n };\n}\n\n/**\n * Runs one host-side transport session, including timeout, cancellation,\n * tool-call dispatch, and result settlement.\n */\nexport async function runHostTransportSession(\n options: HostTransportSessionOptions,\n): Promise<ExecuteResult> {\n const startedAt = Date.now();\n const abortController = new AbortController();\n const dispatchToolCall = createToolCallDispatcher(\n options.providers,\n abortController.signal,\n );\n const abortSignal = options.signal;\n\n return await new Promise<ExecuteResult>((resolve) => {\n let finished = false;\n let timeoutTriggered = false;\n let cancellationStarted = false;\n let forceTerminateTimer: NodeJS.Timeout | undefined;\n const cancelGraceMs = options.cancelGraceMs ?? DEFAULT_CANCEL_GRACE_MS;\n\n const cleanup = () => {\n finished = true;\n abortController.abort();\n if (timeoutTimer) {\n clearTimeout(timeoutTimer);\n }\n if (forceTerminateTimer) {\n clearTimeout(forceTerminateTimer);\n }\n offClose();\n offError();\n offMessage();\n abortSignal?.removeEventListener(\"abort\", onAbortSignal);\n };\n\n const finish = (result: ExecuteResult) => {\n if (finished) {\n return;\n }\n\n cleanup();\n void Promise.resolve(options.onSettled?.(result))\n .catch(() => {})\n .finally(() => {\n void Promise.resolve(options.transport.dispose()).catch(() => {});\n });\n resolve(result);\n };\n\n const fail = (message: string) => {\n finish(toFailureResult(startedAt, timeoutTriggered, message));\n };\n\n const send = (message: DispatcherMessage) => {\n if (finished) {\n return;\n }\n\n try {\n const pendingSend = options.transport.send(message);\n void Promise.resolve(pendingSend).catch((error) => {\n if (finished) {\n return;\n }\n\n fail(error instanceof Error ? error.message : String(error));\n });\n } catch (error) {\n fail(error instanceof Error ? error.message : String(error));\n }\n };\n\n const startCancellation = () => {\n if (finished || cancellationStarted) {\n return;\n }\n\n cancellationStarted = true;\n timeoutTriggered = true;\n abortController.abort();\n send({\n id: options.executionId,\n type: \"cancel\",\n });\n forceTerminateTimer = setTimeout(() => {\n if (finished) {\n return;\n }\n\n void Promise.resolve(options.transport.terminate())\n .catch(() => {})\n .finally(() => {\n if (finished) {\n return;\n }\n\n finish(\n toFailureResult(startedAt, true, getExecutionTimeoutMessage()),\n );\n });\n }, cancelGraceMs);\n };\n\n const timeoutTimer = setTimeout(() => {\n startCancellation();\n }, options.runtimeOptions.timeoutMs + HOST_TIMEOUT_BACKSTOP_MS);\n\n const onMessage = (message: RunnerMessage) => {\n if (finished) {\n return;\n }\n\n if (!isRunnerMessage(message)) {\n return;\n }\n\n if (\"id\" in message && message.id !== options.executionId) {\n return;\n }\n\n if (message.type === \"started\") {\n return;\n }\n\n if (message.type === \"tool_call\") {\n void dispatchToolCall(message as ToolCallMessage)\n .then((result) => {\n send({\n ...result,\n callId: message.callId,\n type: \"tool_result\",\n });\n })\n .catch((error) => {\n send({\n callId: message.callId,\n error: {\n code: \"internal_error\",\n message: error instanceof Error ? error.message : String(error),\n },\n ok: false,\n type: \"tool_result\",\n });\n });\n return;\n }\n\n finish(normalizeDoneMessage(message));\n };\n\n const onError = (error: Error) => {\n fail(error.message);\n };\n\n const onClose = (reason?: TransportCloseReason) => {\n fail(reason?.message ?? \"Transport closed unexpectedly\");\n };\n\n const onAbortSignal = () => {\n startCancellation();\n };\n\n const offMessage = options.transport.onMessage(onMessage);\n const offError = options.transport.onError(onError);\n const offClose = options.transport.onClose(onClose);\n abortSignal?.addEventListener(\"abort\", onAbortSignal, { once: true });\n\n if (abortSignal?.aborted) {\n startCancellation();\n return;\n }\n\n send({\n code: options.code,\n id: options.executionId,\n options: options.runtimeOptions,\n providers: extractProviderManifests(options.providers),\n type: \"execute\",\n });\n });\n}\n","const SOURCE_MODE_EXEC_ARGV = [\"--conditions=source\", \"--import\", \"tsx\"];\n\n/**\n * Returns the extra Node flags needed to launch transport-backed child entries\n * directly from source during local development and tests.\n */\nexport function getNodeTransportExecArgv(\n moduleUrl: string,\n): string[] | undefined {\n return moduleUrl.endsWith(\".ts\") ? [...SOURCE_MODE_EXEC_ARGV] : undefined;\n}\n","/**\n * One checked-out pooled resource plus its release hook.\n */\nexport interface ResourcePoolLease<T> {\n release(reusable?: boolean): Promise<void>;\n value: T;\n}\n\n/**\n * Configuration for a reusable async resource pool.\n */\nexport interface ResourcePoolOptions<T> {\n create: () => Promise<T> | T;\n destroy: (value: T) => Promise<void> | void;\n idleTimeoutMs?: number;\n maxSize: number;\n minSize?: number;\n}\n\n/**\n * Minimal async pool contract used by the pooled executors.\n */\nexport interface ResourcePool<T> {\n acquire(): Promise<ResourcePoolLease<T>>;\n dispose(): Promise<void>;\n prewarm(count?: number): Promise<void>;\n}\n\ninterface PoolEntry<T> {\n idleTimer: NodeJS.Timeout | undefined;\n value: T;\n}\n\nfunction clampTarget(value: number, maxSize: number): number {\n return Math.max(0, Math.min(value, maxSize));\n}\n\n/**\n * Creates a bounded async resource pool with optional idle eviction.\n */\nexport function createResourcePool<T>(\n options: ResourcePoolOptions<T>,\n): ResourcePool<T> {\n const available: PoolEntry<T>[] = [];\n const waiters: Array<{\n reject: (error: Error) => void;\n resolve: (lease: ResourcePoolLease<T>) => void;\n }> = [];\n const inUse = new Set<PoolEntry<T>>();\n let disposed = false;\n let totalSize = 0;\n\n const minSize = clampTarget(options.minSize ?? 0, options.maxSize);\n\n const createEntry = async (): Promise<PoolEntry<T>> => {\n totalSize += 1;\n\n try {\n return {\n idleTimer: undefined,\n value: await options.create(),\n };\n } catch (error) {\n totalSize -= 1;\n throw error;\n }\n };\n\n const removeAvailableEntry = (entry: PoolEntry<T>): void => {\n const index = available.indexOf(entry);\n\n if (index >= 0) {\n available.splice(index, 1);\n }\n };\n\n const clearIdleTimer = (entry: PoolEntry<T>): void => {\n if (entry.idleTimer) {\n clearTimeout(entry.idleTimer);\n entry.idleTimer = undefined;\n }\n };\n\n const queueAvailableEntry = (entry: PoolEntry<T>): void => {\n available.push(entry);\n\n if ((options.idleTimeoutMs ?? 0) > 0) {\n entry.idleTimer = setTimeout(() => {\n if (disposed) {\n return;\n }\n\n if (available.includes(entry) && totalSize > minSize) {\n void destroyEntry(entry);\n }\n }, options.idleTimeoutMs);\n }\n };\n\n const destroyEntry = async (entry: PoolEntry<T>): Promise<void> => {\n clearIdleTimer(entry);\n removeAvailableEntry(entry);\n inUse.delete(entry);\n totalSize -= 1;\n await options.destroy(entry.value);\n };\n\n const leaseEntry = (entry: PoolEntry<T>): ResourcePoolLease<T> => {\n clearIdleTimer(entry);\n removeAvailableEntry(entry);\n inUse.add(entry);\n\n return {\n release: async (reusable = true) => {\n if (!inUse.has(entry)) {\n return;\n }\n\n inUse.delete(entry);\n\n if (disposed || !reusable) {\n await destroyEntry(entry);\n await fillWaiters();\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve(leaseEntry(entry));\n return;\n }\n\n queueAvailableEntry(entry);\n },\n value: entry.value,\n };\n };\n\n const fillWaiters = async (): Promise<void> => {\n while (!disposed && waiters.length > 0 && totalSize < options.maxSize) {\n const waiter = waiters.shift();\n if (!waiter) {\n return;\n }\n\n try {\n waiter.resolve(leaseEntry(await createEntry()));\n } catch (error) {\n waiter.reject(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n };\n\n return {\n acquire: async () => {\n if (disposed) {\n throw new Error(\"Resource pool is disposed\");\n }\n\n const entry = available.pop();\n if (entry) {\n return leaseEntry(entry);\n }\n\n if (totalSize < options.maxSize) {\n return leaseEntry(await createEntry());\n }\n\n return await new Promise<ResourcePoolLease<T>>((resolve, reject) => {\n waiters.push({ reject, resolve });\n });\n },\n dispose: async () => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n\n while (waiters.length > 0) {\n waiters.shift()?.reject(new Error(\"Resource pool is disposed\"));\n }\n\n const idleEntries = [...available];\n available.length = 0;\n await Promise.all(idleEntries.map((entry) => destroyEntry(entry)));\n },\n prewarm: async (count) => {\n if (disposed) {\n throw new Error(\"Resource pool is disposed\");\n }\n\n const target = clampTarget(count ?? minSize, options.maxSize);\n const missing = target - totalSize;\n\n if (missing <= 0) {\n return;\n }\n\n const created = await Promise.all(\n Array.from({ length: missing }, async () => await createEntry()),\n );\n\n for (const entry of created) {\n queueAvailableEntry(entry);\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["forceTerminateTimer: NodeJS.Timeout | undefined","available: PoolEntry<T>[]","waiters: Array<{\n reject: (error: Error) => void;\n resolve: (lease: ResourcePoolLease<T>) => void;\n }>"],"sources":["../../src/protocol/messages.ts","../../src/protocol/hostSession.ts","../../src/protocol/nodeBootstrap.ts","../../src/protocol/resourcePool.ts"],"sourcesContent":["import type {\n ExecutorRuntimeOptions,\n ProviderManifest,\n ToolCall,\n ToolCallResult,\n} from \"../runner.ts\";\nimport type { ExecuteResult } from \"../types.ts\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isRuntimeOptions(value: unknown): value is ExecutorRuntimeOptions {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n isFiniteNumber(value.maxLogChars) &&\n isFiniteNumber(value.maxLogLines) &&\n isFiniteNumber(value.memoryLimitBytes) &&\n isFiniteNumber(value.timeoutMs)\n );\n}\n\nfunction isProviderManifest(value: unknown): value is ProviderManifest {\n if (!isRecord(value) || typeof value.name !== \"string\") {\n return false;\n }\n\n if (!isRecord(value.tools) || typeof value.types !== \"string\") {\n return false;\n }\n\n return Object.values(value.tools).every(\n (tool) =>\n isRecord(tool) &&\n typeof tool.originalName === \"string\" &&\n typeof tool.safeName === \"string\" &&\n (tool.description === undefined || typeof tool.description === \"string\"),\n );\n}\n\nfunction isExecuteError(\n value: unknown,\n): value is { code: string; message: string } {\n return (\n isRecord(value) &&\n typeof value.code === \"string\" &&\n typeof value.message === \"string\"\n );\n}\n\nfunction isDonePayload(value: unknown): value is DoneMessage {\n if (!isRecord(value) || !isFiniteNumber(value.durationMs)) {\n return false;\n }\n\n if (\n !Array.isArray(value.logs) ||\n !value.logs.every((log) => typeof log === \"string\")\n ) {\n return false;\n }\n\n if (typeof value.ok !== \"boolean\") {\n return false;\n }\n\n return value.ok ? true : isExecuteError(value.error);\n}\n\n/**\n * Message sent from dispatcher to runner to start one execution session.\n */\nexport interface ExecuteMessage {\n code: string;\n id: string;\n options: ExecutorRuntimeOptions;\n providers: ProviderManifest[];\n type: \"execute\";\n}\n\n/**\n * Message sent from dispatcher to request prompt cancellation.\n */\nexport interface CancelMessage {\n id: string;\n type: \"cancel\";\n}\n\n/**\n * Message sent from a runner when guest code invokes a host tool.\n */\nexport interface ToolCallMessage extends ToolCall {\n callId: string;\n type: \"tool_call\";\n}\n\n/**\n * Message carrying a trusted host tool result back to the runner.\n */\nexport type ToolResultMessage = {\n callId: string;\n type: \"tool_result\";\n} & ToolCallResult;\n\n/**\n * Message indicating the runner has finished bootstrapping guest execution timing.\n */\nexport interface StartedMessage {\n id: string;\n type: \"started\";\n}\n\n/**\n * Final successful execution result returned by a runner.\n *\n * Node IPC can omit `undefined` fields during serialization, so `result`\n * remains optional at the protocol boundary and is normalized by the host.\n */\nexport type DoneSuccessMessage<T = unknown> = {\n durationMs: number;\n id: string;\n logs: string[];\n ok: true;\n result?: T;\n type: \"done\";\n};\n\n/**\n * Final failed execution result returned by a runner.\n */\nexport type DoneFailureMessage = {\n id: string;\n type: \"done\";\n} & Extract<ExecuteResult, { ok: false }>;\n\n/**\n * Final execution result returned by a runner.\n */\nexport type DoneMessage = DoneSuccessMessage | DoneFailureMessage;\n\n/**\n * Messages accepted by a runner transport endpoint.\n */\nexport type DispatcherMessage =\n | CancelMessage\n | ExecuteMessage\n | ToolResultMessage;\n\n/**\n * Messages emitted by a runner transport endpoint.\n */\nexport type RunnerMessage = DoneMessage | StartedMessage | ToolCallMessage;\n\n/**\n * Returns whether an unknown value is a dispatcher-to-runner message.\n */\nexport function isDispatcherMessage(\n value: unknown,\n): value is DispatcherMessage {\n if (!isRecord(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n switch (value.type) {\n case \"cancel\":\n return typeof value.id === \"string\";\n case \"execute\":\n return (\n typeof value.code === \"string\" &&\n typeof value.id === \"string\" &&\n isRuntimeOptions(value.options) &&\n Array.isArray(value.providers) &&\n value.providers.every(isProviderManifest)\n );\n case \"tool_result\":\n if (typeof value.callId !== \"string\" || typeof value.ok !== \"boolean\") {\n return false;\n }\n\n if (value.ok) {\n return \"result\" in value;\n }\n\n return isExecuteError(value.error);\n default:\n return false;\n }\n}\n\n/**\n * Returns whether an unknown value is a runner-to-dispatcher message.\n */\nexport function isRunnerMessage(value: unknown): value is RunnerMessage {\n if (!isRecord(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n switch (value.type) {\n case \"started\":\n return typeof value.id === \"string\";\n case \"tool_call\":\n return (\n typeof value.callId === \"string\" &&\n typeof value.providerName === \"string\" &&\n typeof value.safeToolName === \"string\" &&\n \"input\" in value\n );\n case \"done\":\n return typeof value.id === \"string\" && isDonePayload(value);\n default:\n return false;\n }\n}\n","import {\n createToolCallDispatcher,\n extractProviderManifests,\n type ExecutorRuntimeOptions,\n} from \"../runner.ts\";\nimport { getExecutionTimeoutMessage } from \"../executor/shared.ts\";\nimport type { ExecuteResult, ResolvedToolProvider } from \"../types.ts\";\n\nimport type {\n DispatcherMessage,\n DoneMessage,\n RunnerMessage,\n ToolCallMessage,\n} from \"./messages.ts\";\nimport { isRunnerMessage } from \"./messages.ts\";\n\nconst DEFAULT_CANCEL_GRACE_MS = 25;\nconst HOST_TIMEOUT_BACKSTOP_MS = 100;\n\n/**\n * Describes an unexpected transport shutdown reported to the host session.\n */\nexport interface TransportCloseReason {\n code?: number | null;\n message: string;\n signal?: NodeJS.Signals | null;\n}\n\n/**\n * Minimal parent-side transport contract for transport-backed execution.\n */\nexport interface HostTransport {\n dispose(): Promise<void> | void;\n onClose(handler: (reason?: TransportCloseReason) => void): () => void;\n onError(handler: (error: Error) => void): () => void;\n onMessage(handler: (message: RunnerMessage) => void): () => void;\n send(message: DispatcherMessage): Promise<void> | void;\n terminate(): Promise<void> | void;\n}\n\n/**\n * Configuration for one transport-backed execution session.\n */\nexport interface HostTransportSessionOptions {\n cancelGraceMs?: number;\n code: string;\n executionId: string;\n onSettled?: (result: ExecuteResult) => Promise<void> | void;\n providers: ResolvedToolProvider[];\n runtimeOptions: Required<ExecutorRuntimeOptions>;\n signal?: AbortSignal;\n transport: HostTransport;\n}\n\nfunction toFailureResult(\n startedAt: number,\n timeoutTriggered: boolean,\n message: string,\n): ExecuteResult {\n return {\n durationMs: Date.now() - startedAt,\n error: {\n code: timeoutTriggered ? \"timeout\" : \"internal_error\",\n message: timeoutTriggered ? getExecutionTimeoutMessage() : message,\n },\n logs: [],\n ok: false,\n };\n}\n\nfunction normalizeDoneMessage(message: DoneMessage): ExecuteResult {\n if (!message.ok) {\n return {\n durationMs: message.durationMs,\n error: message.error,\n logs: message.logs,\n ok: false,\n };\n }\n\n return {\n durationMs: message.durationMs,\n logs: message.logs,\n ok: true,\n result: message.result,\n };\n}\n\n/**\n * Runs one host-side transport session, including timeout, cancellation,\n * tool-call dispatch, and result settlement.\n */\nexport async function runHostTransportSession(\n options: HostTransportSessionOptions,\n): Promise<ExecuteResult> {\n const startedAt = Date.now();\n const abortController = new AbortController();\n const dispatchToolCall = createToolCallDispatcher(\n options.providers,\n abortController.signal,\n );\n const abortSignal = options.signal;\n\n return await new Promise<ExecuteResult>((resolve) => {\n let finished = false;\n let timeoutTriggered = false;\n let cancellationStarted = false;\n let forceTerminateTimer: NodeJS.Timeout | undefined;\n const cancelGraceMs = options.cancelGraceMs ?? DEFAULT_CANCEL_GRACE_MS;\n\n const cleanup = () => {\n finished = true;\n abortController.abort();\n if (timeoutTimer) {\n clearTimeout(timeoutTimer);\n }\n if (forceTerminateTimer) {\n clearTimeout(forceTerminateTimer);\n }\n offClose();\n offError();\n offMessage();\n abortSignal?.removeEventListener(\"abort\", onAbortSignal);\n };\n\n const finish = (result: ExecuteResult) => {\n if (finished) {\n return;\n }\n\n cleanup();\n void Promise.resolve(options.onSettled?.(result))\n .catch(() => {})\n .finally(() => {\n void Promise.resolve(options.transport.dispose()).catch(() => {});\n });\n resolve(result);\n };\n\n const fail = (message: string) => {\n finish(toFailureResult(startedAt, timeoutTriggered, message));\n };\n\n const send = (message: DispatcherMessage) => {\n if (finished) {\n return;\n }\n\n try {\n const pendingSend = options.transport.send(message);\n void Promise.resolve(pendingSend).catch((error) => {\n if (finished) {\n return;\n }\n\n fail(error instanceof Error ? error.message : String(error));\n });\n } catch (error) {\n fail(error instanceof Error ? error.message : String(error));\n }\n };\n\n const startCancellation = () => {\n if (finished || cancellationStarted) {\n return;\n }\n\n cancellationStarted = true;\n timeoutTriggered = true;\n abortController.abort();\n send({\n id: options.executionId,\n type: \"cancel\",\n });\n forceTerminateTimer = setTimeout(() => {\n if (finished) {\n return;\n }\n\n void Promise.resolve(options.transport.terminate())\n .catch(() => {})\n .finally(() => {\n if (finished) {\n return;\n }\n\n finish(\n toFailureResult(startedAt, true, getExecutionTimeoutMessage()),\n );\n });\n }, cancelGraceMs);\n };\n\n const timeoutTimer = setTimeout(() => {\n startCancellation();\n }, options.runtimeOptions.timeoutMs + HOST_TIMEOUT_BACKSTOP_MS);\n\n const onMessage = (message: RunnerMessage) => {\n if (finished) {\n return;\n }\n\n if (!isRunnerMessage(message)) {\n return;\n }\n\n if (\"id\" in message && message.id !== options.executionId) {\n return;\n }\n\n if (message.type === \"started\") {\n return;\n }\n\n if (message.type === \"tool_call\") {\n void dispatchToolCall(message as ToolCallMessage)\n .then((result) => {\n send({\n ...result,\n callId: message.callId,\n type: \"tool_result\",\n });\n })\n .catch((error) => {\n send({\n callId: message.callId,\n error: {\n code: \"internal_error\",\n message: error instanceof Error ? error.message : String(error),\n },\n ok: false,\n type: \"tool_result\",\n });\n });\n return;\n }\n\n finish(normalizeDoneMessage(message));\n };\n\n const onError = (error: Error) => {\n fail(error.message);\n };\n\n const onClose = (reason?: TransportCloseReason) => {\n fail(reason?.message ?? \"Transport closed unexpectedly\");\n };\n\n const onAbortSignal = () => {\n startCancellation();\n };\n\n const offMessage = options.transport.onMessage(onMessage);\n const offError = options.transport.onError(onError);\n const offClose = options.transport.onClose(onClose);\n abortSignal?.addEventListener(\"abort\", onAbortSignal, { once: true });\n\n if (abortSignal?.aborted) {\n startCancellation();\n return;\n }\n\n send({\n code: options.code,\n id: options.executionId,\n options: options.runtimeOptions,\n providers: extractProviderManifests(options.providers),\n type: \"execute\",\n });\n });\n}\n","const SOURCE_MODE_EXEC_ARGV = [\"--conditions=source\", \"--import\", \"tsx\"];\n\n/**\n * Returns the extra Node flags needed to launch transport-backed worker entries\n * directly from source during local development and tests.\n */\nexport function getNodeTransportExecArgv(\n moduleUrl: string,\n): string[] | undefined {\n return moduleUrl.endsWith(\".ts\") ? [...SOURCE_MODE_EXEC_ARGV] : undefined;\n}\n","/**\n * One checked-out pooled resource plus its release hook.\n */\nexport interface ResourcePoolLease<T> {\n release(reusable?: boolean): Promise<void>;\n value: T;\n}\n\n/**\n * Configuration for a reusable async resource pool.\n */\nexport interface ResourcePoolOptions<T> {\n create: () => Promise<T> | T;\n destroy: (value: T) => Promise<void> | void;\n idleTimeoutMs?: number;\n maxSize: number;\n minSize?: number;\n}\n\n/**\n * Minimal async pool contract used by the pooled executors.\n */\nexport interface ResourcePool<T> {\n acquire(): Promise<ResourcePoolLease<T>>;\n dispose(): Promise<void>;\n prewarm(count?: number): Promise<void>;\n}\n\ninterface PoolEntry<T> {\n idleTimer: NodeJS.Timeout | undefined;\n value: T;\n}\n\nfunction clampTarget(value: number, maxSize: number): number {\n return Math.max(0, Math.min(value, maxSize));\n}\n\n/**\n * Creates a bounded async resource pool with optional idle eviction.\n */\nexport function createResourcePool<T>(\n options: ResourcePoolOptions<T>,\n): ResourcePool<T> {\n const available: PoolEntry<T>[] = [];\n const waiters: Array<{\n reject: (error: Error) => void;\n resolve: (lease: ResourcePoolLease<T>) => void;\n }> = [];\n const inUse = new Set<PoolEntry<T>>();\n let disposed = false;\n let totalSize = 0;\n\n const minSize = clampTarget(options.minSize ?? 0, options.maxSize);\n\n const createEntry = async (): Promise<PoolEntry<T>> => {\n totalSize += 1;\n\n try {\n return {\n idleTimer: undefined,\n value: await options.create(),\n };\n } catch (error) {\n totalSize -= 1;\n throw error;\n }\n };\n\n const removeAvailableEntry = (entry: PoolEntry<T>): void => {\n const index = available.indexOf(entry);\n\n if (index >= 0) {\n available.splice(index, 1);\n }\n };\n\n const clearIdleTimer = (entry: PoolEntry<T>): void => {\n if (entry.idleTimer) {\n clearTimeout(entry.idleTimer);\n entry.idleTimer = undefined;\n }\n };\n\n const queueAvailableEntry = (entry: PoolEntry<T>): void => {\n available.push(entry);\n\n if ((options.idleTimeoutMs ?? 0) > 0) {\n entry.idleTimer = setTimeout(() => {\n if (disposed) {\n return;\n }\n\n if (available.includes(entry) && totalSize > minSize) {\n void destroyEntry(entry);\n }\n }, options.idleTimeoutMs);\n }\n };\n\n const destroyEntry = async (entry: PoolEntry<T>): Promise<void> => {\n clearIdleTimer(entry);\n removeAvailableEntry(entry);\n inUse.delete(entry);\n totalSize -= 1;\n await options.destroy(entry.value);\n };\n\n const leaseEntry = (entry: PoolEntry<T>): ResourcePoolLease<T> => {\n clearIdleTimer(entry);\n removeAvailableEntry(entry);\n inUse.add(entry);\n\n return {\n release: async (reusable = true) => {\n if (!inUse.has(entry)) {\n return;\n }\n\n inUse.delete(entry);\n\n if (disposed || !reusable) {\n await destroyEntry(entry);\n await fillWaiters();\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve(leaseEntry(entry));\n return;\n }\n\n queueAvailableEntry(entry);\n },\n value: entry.value,\n };\n };\n\n const fillWaiters = async (): Promise<void> => {\n while (!disposed && waiters.length > 0 && totalSize < options.maxSize) {\n const waiter = waiters.shift();\n if (!waiter) {\n return;\n }\n\n try {\n waiter.resolve(leaseEntry(await createEntry()));\n } catch (error) {\n waiter.reject(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n };\n\n return {\n acquire: async () => {\n if (disposed) {\n throw new Error(\"Resource pool is disposed\");\n }\n\n const entry = available.pop();\n if (entry) {\n return leaseEntry(entry);\n }\n\n if (totalSize < options.maxSize) {\n return leaseEntry(await createEntry());\n }\n\n return await new Promise<ResourcePoolLease<T>>((resolve, reject) => {\n waiters.push({ reject, resolve });\n });\n },\n dispose: async () => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n\n while (waiters.length > 0) {\n waiters.shift()?.reject(new Error(\"Resource pool is disposed\"));\n }\n\n const idleEntries = [...available];\n available.length = 0;\n await Promise.all(idleEntries.map((entry) => destroyEntry(entry)));\n },\n prewarm: async (count) => {\n if (disposed) {\n throw new Error(\"Resource pool is disposed\");\n }\n\n const target = clampTarget(count ?? minSize, options.maxSize);\n const missing = target - totalSize;\n\n if (missing <= 0) {\n return;\n }\n\n const created = await Promise.all(\n Array.from({ length: missing }, async () => await createEntry()),\n );\n\n for (const entry of created) {\n queueAvailableEntry(entry);\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as isExecuteFailure, r as isJsonSerializable, t as ExecuteFailure } from "./errors-
|
|
1
|
+
import { n as isExecuteFailure, r as isJsonSerializable, t as ExecuteFailure } from "./errors-DdWVEGU8.js";
|
|
2
2
|
import Ajv from "ajv";
|
|
3
3
|
import * as zod from "zod";
|
|
4
4
|
|
|
@@ -284,5 +284,5 @@ function resolveProvider(provider) {
|
|
|
284
284
|
}
|
|
285
285
|
|
|
286
286
|
//#endregion
|
|
287
|
-
export { renderNamespaceDeclaration as
|
|
288
|
-
//# sourceMappingURL=resolveProvider-
|
|
287
|
+
export { renderNamespaceDeclaration as i, schemaToType as n, renderDocComment as r, resolveProvider as t };
|
|
288
|
+
//# sourceMappingURL=resolveProvider-Bfj27oYs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveProvider-UqQxdF4j.js","names":["isRecord","lines: string[]","originalToSafeName: Record<string, string>","safeToOriginalName: Record<string, string>","resolvedTools: Record<string, ResolvedToolDescriptor>","typegenTools: Record<string, TypegenToolDescriptor>"],"sources":["../src/identifier.ts","../src/sanitize.ts","../src/schema/normalizeSchema.ts","../src/typegen/render.ts","../src/typegen/jsonSchema.ts","../src/provider/resolveProvider.ts"],"sourcesContent":["const RESERVED_WORDS = new Set([\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"enum\",\n \"export\",\n \"extends\",\n \"false\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"new\",\n \"null\",\n \"return\",\n \"super\",\n \"switch\",\n \"this\",\n \"throw\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\",\n]);\n\nconst UNDERSCORE_CHAR_CODE = 95;\n\nfunction trimEdgeUnderscores(value: string): string {\n let start = 0;\n let end = value.length;\n\n while (start < end && value.charCodeAt(start) === UNDERSCORE_CHAR_CODE) {\n start += 1;\n }\n\n while (end > start && value.charCodeAt(end - 1) === UNDERSCORE_CHAR_CODE) {\n end -= 1;\n }\n\n return value.slice(start, end);\n}\n\n/**\n * Returns whether the value is a valid JavaScript identifier.\n */\nexport function isValidIdentifier(value: string): boolean {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);\n}\n\n/**\n * Returns whether the identifier is reserved in JavaScript source.\n */\nexport function isReservedWord(value: string): boolean {\n return RESERVED_WORDS.has(value);\n}\n\n/**\n * Throws when the value cannot be used as a bare JavaScript identifier.\n */\nexport function assertValidIdentifier(\n value: string,\n label = \"identifier\",\n): void {\n if (!isValidIdentifier(value) || isReservedWord(value)) {\n throw new Error(`Invalid ${label}: ${value}`);\n }\n}\n\n/**\n * Converts a raw identifier-like value into a safe JavaScript identifier.\n */\nexport function sanitizeIdentifier(value: string): string {\n const sanitized = value.trim().replace(/[^A-Za-z0-9_$]+/g, \"_\");\n\n const trimmed = trimEdgeUnderscores(sanitized);\n\n let safeName = trimmed.length > 0 ? trimmed : \"_\";\n\n if (/^[0-9]/.test(safeName)) {\n safeName = `_${safeName}`;\n }\n\n if (isReservedWord(safeName)) {\n safeName = `${safeName}_`;\n }\n\n return safeName;\n}\n\n/**\n * Renders the name as a bare identifier when possible, otherwise as a string literal.\n */\nexport function serializePropertyName(name: string): string {\n return isValidIdentifier(name) ? name : JSON.stringify(name);\n}\n","import { sanitizeIdentifier } from \"./identifier\";\n\n/**\n * Converts a raw tool name into a safe JavaScript identifier.\n */\nexport function sanitizeToolName(name: string): string {\n return sanitizeIdentifier(name);\n}\n","import * as zod from \"zod\";\nimport type { ZodRawShape, ZodTypeAny } from \"zod\";\n\nimport type { JsonSchema, ToolSchema } from \"../types\";\n\nconst z = \"z\" in zod && typeof zod.z === \"object\" ? zod.z : zod;\nconst toJsonSchema =\n (\"toJSONSchema\" in zod ? zod.toJSONSchema : undefined) ??\n (\"toJSONSchema\" in z ? z.toJSONSchema : undefined);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isZodSchema(value: unknown): value is ZodTypeAny {\n return isRecord(value) && typeof value.safeParse === \"function\";\n}\n\nfunction isZodRawShape(value: unknown): value is ZodRawShape {\n return (\n isRecord(value) &&\n Object.keys(value).length > 0 &&\n Object.values(value).every(isZodSchema)\n );\n}\n\nfunction normalizeZodSchema(schema: ZodTypeAny): JsonSchema {\n if (typeof toJsonSchema !== \"function\") {\n throw new Error(\"Installed zod package does not expose toJSONSchema\");\n }\n\n const jsonSchema = toJsonSchema(schema) as JsonSchema & {\n $schema?: string;\n };\n\n if (\"$schema\" in jsonSchema) {\n const { $schema: _ignored, ...rest } = jsonSchema;\n return rest;\n }\n\n return jsonSchema;\n}\n\n/**\n * Normalizes supported tool schema inputs to the JSON Schema form used internally.\n */\nexport function normalizeToolSchema(\n schema: ToolSchema | undefined,\n phase: \"input\" | \"output\",\n toolName: string,\n): JsonSchema | undefined {\n if (schema === undefined) {\n return undefined;\n }\n\n if (isZodSchema(schema)) {\n return normalizeZodSchema(schema);\n }\n\n if (isZodRawShape(schema)) {\n return normalizeZodSchema(z.object(schema));\n }\n\n if (isRecord(schema)) {\n return schema;\n }\n\n throw new Error(\n `Unsupported ${phase} schema for tool ${toolName}. Expected JSON Schema, a Zod schema, or an MCP-style Zod shape.`,\n );\n}\n","/**\n * Indents each line of the given string by a specified number of levels.\n */\nexport function indent(value: string, level = 1): string {\n return value\n .split(\"\\n\")\n .map((line) => `${\" \".repeat(level)}${line}`)\n .join(\"\\n\");\n}\n\n/**\n * Renders a short TSDoc-style block when documentation is available.\n */\nexport function renderDocComment(lines: string[]): string {\n if (lines.length === 0) {\n return \"\";\n }\n\n return [\"/**\", ...lines.map((line) => ` * ${line}`), \" */\"].join(\"\\n\");\n}\n\n/**\n * Renders a namespace declaration with optional members.\n */\nexport function renderNamespaceDeclaration(\n name: string,\n members: string[],\n): string {\n if (members.length === 0) {\n return `declare namespace ${name} {}`;\n }\n\n return `declare namespace ${name} {\\n${indent(members.join(\"\\n\\n\"))}\\n}`;\n}\n","import { isValidIdentifier, serializePropertyName } from \"../identifier\";\nimport type { JsonSchema, TypegenToolDescriptor } from \"../types\";\nimport { indent, renderDocComment, renderNamespaceDeclaration } from \"./render\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport { indent } from \"./render\";\n\n/**\n * Converts a supported JSON Schema fragment into a TypeScript type expression.\n */\nexport function schemaToType(\n schema: JsonSchema | undefined,\n level = 0,\n): string {\n if (!schema) {\n return \"unknown\";\n }\n\n if (\n \"allOf\" in schema ||\n \"anyOf\" in schema ||\n \"oneOf\" in schema ||\n \"$ref\" in schema ||\n Array.isArray(schema.type)\n ) {\n return \"unknown\";\n }\n\n switch (schema.type) {\n case \"string\":\n return \"string\";\n case \"number\":\n case \"integer\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"array\": {\n const itemType = schemaToType(\n isRecord(schema.items) ? (schema.items as JsonSchema) : undefined,\n level + 1,\n );\n\n if (isValidIdentifier(itemType)) {\n return `${itemType}[]`;\n }\n\n return `Array<${itemType}>`;\n }\n case \"object\": {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = new Set(\n Array.isArray(schema.required)\n ? schema.required.filter(\n (value): value is string => typeof value === \"string\",\n )\n : [],\n );\n const entries = Object.entries(properties);\n\n if (entries.length === 0) {\n return \"Record<string, unknown>\";\n }\n\n const lines = entries.map(([name, propertySchema]) => {\n const propertyType = schemaToType(\n isRecord(propertySchema) ? (propertySchema as JsonSchema) : undefined,\n level + 1,\n );\n const optionalToken = required.has(name) ? \"\" : \"?\";\n return `${serializePropertyName(name)}${optionalToken}: ${propertyType};`;\n });\n\n return `{\\n${indent(lines.join(\"\\n\"), level + 1)}\\n${\" \".repeat(level)}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction formatToolDeclaration(\n name: string,\n tool: TypegenToolDescriptor,\n): string {\n const lines: string[] = [];\n const comment = tool.description ? renderDocComment([tool.description]) : \"\";\n if (comment) {\n lines.push(comment);\n }\n\n const inputType = schemaToType(tool.inputSchema);\n const outputType = schemaToType(tool.outputSchema);\n lines.push(`function ${name}(input: ${inputType}): Promise<${outputType}>;`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates a namespace declaration for a provider's tool schemas.\n */\nexport function generateTypesFromJsonSchema(\n providerName: string,\n tools: Record<string, TypegenToolDescriptor>,\n): string {\n return renderNamespaceDeclaration(\n providerName,\n Object.entries(tools).map(([name, tool]) =>\n formatToolDeclaration(name, tool),\n ),\n );\n}\n","import Ajv, { type AnySchemaObject, type ValidateFunction } from \"ajv\";\n\nimport {\n ExecuteFailure,\n isExecuteFailure,\n isJsonSerializable,\n} from \"../errors\";\nimport { assertValidIdentifier } from \"../identifier\";\nimport { sanitizeToolName } from \"../sanitize\";\nimport { normalizeToolSchema } from \"../schema/normalizeSchema\";\nimport { generateTypesFromJsonSchema } from \"../typegen/jsonSchema\";\nimport type {\n JsonSchema,\n ResolvedToolDescriptor,\n ResolvedToolProvider,\n ToolExecutionContext,\n ToolProvider,\n TypegenToolDescriptor,\n} from \"../types\";\n\nconst DEFAULT_PROVIDER_NAME = \"codemode\";\nfunction assertValidNamespace(name: string): void {\n assertValidIdentifier(name, \"provider namespace\");\n}\n\nfunction compileValidator(\n ajv: Ajv,\n schema: JsonSchema | undefined,\n): ValidateFunction | undefined {\n return schema ? ajv.compile(schema as AnySchemaObject) : undefined;\n}\n\nfunction formatValidationMessage(\n ajv: Ajv,\n phase: \"input\" | \"output\",\n toolName: string,\n validator: ValidateFunction,\n): string {\n return `Invalid ${phase} for tool ${toolName}: ${ajv.errorsText(validator.errors)}`;\n}\n\n/**\n * Resolves a tool provider into the validated, sanitized shape consumed by executors.\n */\nexport function resolveProvider(provider: ToolProvider): ResolvedToolProvider {\n const name = provider.name ?? DEFAULT_PROVIDER_NAME;\n assertValidNamespace(name);\n\n // strict: false allows schemas with extra keywords (e.g. Zod-generated $schema)\n // that don't conform to the strict JSON Schema vocabulary.\n const ajv = new Ajv({\n allErrors: true,\n strict: false,\n });\n\n const originalToSafeName: Record<string, string> = {};\n const safeToOriginalName: Record<string, string> = {};\n const usedSafeNames = new Set<string>();\n const resolvedTools: Record<string, ResolvedToolDescriptor> = {};\n const typegenTools: Record<string, TypegenToolDescriptor> = {};\n\n for (const [originalName, descriptor] of Object.entries(provider.tools)) {\n const baseSafeName = sanitizeToolName(originalName);\n let safeName = baseSafeName;\n let suffix = 2;\n\n while (usedSafeNames.has(safeName)) {\n safeName = `${baseSafeName}__${suffix}`;\n suffix += 1;\n }\n\n usedSafeNames.add(safeName);\n originalToSafeName[originalName] = safeName;\n safeToOriginalName[safeName] = originalName;\n\n const inputSchema = normalizeToolSchema(\n descriptor.inputSchema,\n \"input\",\n originalName,\n );\n const outputSchema = normalizeToolSchema(\n descriptor.outputSchema,\n \"output\",\n originalName,\n );\n const inputValidator = compileValidator(ajv, inputSchema);\n const outputValidator = compileValidator(ajv, outputSchema);\n\n resolvedTools[safeName] = {\n description: descriptor.description,\n execute: async (\n input: unknown,\n context: ToolExecutionContext,\n ): Promise<unknown> => {\n if (inputValidator && !inputValidator(input)) {\n throw new ExecuteFailure(\n \"validation_error\",\n formatValidationMessage(ajv, \"input\", originalName, inputValidator),\n );\n }\n\n try {\n const result = await descriptor.execute(input, context);\n\n if (!isJsonSerializable(result)) {\n throw new ExecuteFailure(\n \"serialization_error\",\n `Tool ${originalName} returned a non-serializable value`,\n );\n }\n\n if (outputValidator && !outputValidator(result)) {\n throw new ExecuteFailure(\n \"validation_error\",\n formatValidationMessage(\n ajv,\n \"output\",\n originalName,\n outputValidator,\n ),\n );\n }\n\n return result;\n } catch (error) {\n if (isExecuteFailure(error)) {\n throw error;\n }\n\n throw new ExecuteFailure(\n \"tool_error\",\n error instanceof Error\n ? error.message\n : `Tool ${originalName} failed`,\n );\n }\n },\n inputSchema,\n originalName,\n outputSchema,\n safeName,\n };\n\n typegenTools[safeName] = {\n description: descriptor.description,\n inputSchema,\n outputSchema,\n };\n }\n\n return {\n name,\n originalToSafeName,\n safeToOriginalName,\n tools: resolvedTools,\n types: provider.types ?? generateTypesFromJsonSchema(name, typegenTools),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resolveProvider-Bfj27oYs.js","names":["isRecord","lines: string[]","originalToSafeName: Record<string, string>","safeToOriginalName: Record<string, string>","resolvedTools: Record<string, ResolvedToolDescriptor>","typegenTools: Record<string, TypegenToolDescriptor>"],"sources":["../src/identifier.ts","../src/sanitize.ts","../src/schema/normalizeSchema.ts","../src/typegen/render.ts","../src/typegen/jsonSchema.ts","../src/provider/resolveProvider.ts"],"sourcesContent":["const RESERVED_WORDS = new Set([\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"enum\",\n \"export\",\n \"extends\",\n \"false\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"new\",\n \"null\",\n \"return\",\n \"super\",\n \"switch\",\n \"this\",\n \"throw\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\",\n]);\n\nconst UNDERSCORE_CHAR_CODE = 95;\n\nfunction trimEdgeUnderscores(value: string): string {\n let start = 0;\n let end = value.length;\n\n while (start < end && value.charCodeAt(start) === UNDERSCORE_CHAR_CODE) {\n start += 1;\n }\n\n while (end > start && value.charCodeAt(end - 1) === UNDERSCORE_CHAR_CODE) {\n end -= 1;\n }\n\n return value.slice(start, end);\n}\n\n/**\n * Returns whether the value is a valid JavaScript identifier.\n */\nexport function isValidIdentifier(value: string): boolean {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);\n}\n\n/**\n * Returns whether the identifier is reserved in JavaScript source.\n */\nexport function isReservedWord(value: string): boolean {\n return RESERVED_WORDS.has(value);\n}\n\n/**\n * Throws when the value cannot be used as a bare JavaScript identifier.\n */\nexport function assertValidIdentifier(\n value: string,\n label = \"identifier\",\n): void {\n if (!isValidIdentifier(value) || isReservedWord(value)) {\n throw new Error(`Invalid ${label}: ${value}`);\n }\n}\n\n/**\n * Converts a raw identifier-like value into a safe JavaScript identifier.\n */\nexport function sanitizeIdentifier(value: string): string {\n const sanitized = value.trim().replace(/[^A-Za-z0-9_$]+/g, \"_\");\n\n const trimmed = trimEdgeUnderscores(sanitized);\n\n let safeName = trimmed.length > 0 ? trimmed : \"_\";\n\n if (/^[0-9]/.test(safeName)) {\n safeName = `_${safeName}`;\n }\n\n if (isReservedWord(safeName)) {\n safeName = `${safeName}_`;\n }\n\n return safeName;\n}\n\n/**\n * Renders the name as a bare identifier when possible, otherwise as a string literal.\n */\nexport function serializePropertyName(name: string): string {\n return isValidIdentifier(name) ? name : JSON.stringify(name);\n}\n","import { sanitizeIdentifier } from \"./identifier\";\n\n/**\n * Converts a raw tool name into a safe JavaScript identifier.\n */\nexport function sanitizeToolName(name: string): string {\n return sanitizeIdentifier(name);\n}\n","import * as zod from \"zod\";\nimport type { ZodRawShape, ZodTypeAny } from \"zod\";\n\nimport type { JsonSchema, ToolSchema } from \"../types\";\n\nconst z = \"z\" in zod && typeof zod.z === \"object\" ? zod.z : zod;\nconst toJsonSchema =\n (\"toJSONSchema\" in zod ? zod.toJSONSchema : undefined) ??\n (\"toJSONSchema\" in z ? z.toJSONSchema : undefined);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isZodSchema(value: unknown): value is ZodTypeAny {\n return isRecord(value) && typeof value.safeParse === \"function\";\n}\n\nfunction isZodRawShape(value: unknown): value is ZodRawShape {\n return (\n isRecord(value) &&\n Object.keys(value).length > 0 &&\n Object.values(value).every(isZodSchema)\n );\n}\n\nfunction normalizeZodSchema(schema: ZodTypeAny): JsonSchema {\n if (typeof toJsonSchema !== \"function\") {\n throw new Error(\"Installed zod package does not expose toJSONSchema\");\n }\n\n const jsonSchema = toJsonSchema(schema) as JsonSchema & {\n $schema?: string;\n };\n\n if (\"$schema\" in jsonSchema) {\n const { $schema: _ignored, ...rest } = jsonSchema;\n return rest;\n }\n\n return jsonSchema;\n}\n\n/**\n * Normalizes supported tool schema inputs to the JSON Schema form used internally.\n */\nexport function normalizeToolSchema(\n schema: ToolSchema | undefined,\n phase: \"input\" | \"output\",\n toolName: string,\n): JsonSchema | undefined {\n if (schema === undefined) {\n return undefined;\n }\n\n if (isZodSchema(schema)) {\n return normalizeZodSchema(schema);\n }\n\n if (isZodRawShape(schema)) {\n return normalizeZodSchema(z.object(schema));\n }\n\n if (isRecord(schema)) {\n return schema;\n }\n\n throw new Error(\n `Unsupported ${phase} schema for tool ${toolName}. Expected JSON Schema, a Zod schema, or an MCP-style Zod shape.`,\n );\n}\n","/**\n * Indents each line of the given string by a specified number of levels.\n */\nexport function indent(value: string, level = 1): string {\n return value\n .split(\"\\n\")\n .map((line) => `${\" \".repeat(level)}${line}`)\n .join(\"\\n\");\n}\n\n/**\n * Renders a short TSDoc-style block when documentation is available.\n */\nexport function renderDocComment(lines: string[]): string {\n if (lines.length === 0) {\n return \"\";\n }\n\n return [\"/**\", ...lines.map((line) => ` * ${line}`), \" */\"].join(\"\\n\");\n}\n\n/**\n * Renders a namespace declaration with optional members.\n */\nexport function renderNamespaceDeclaration(\n name: string,\n members: string[],\n): string {\n if (members.length === 0) {\n return `declare namespace ${name} {}`;\n }\n\n return `declare namespace ${name} {\\n${indent(members.join(\"\\n\\n\"))}\\n}`;\n}\n","import { isValidIdentifier, serializePropertyName } from \"../identifier\";\nimport type { JsonSchema, TypegenToolDescriptor } from \"../types\";\nimport { indent, renderDocComment, renderNamespaceDeclaration } from \"./render\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport { indent } from \"./render\";\n\n/**\n * Converts a supported JSON Schema fragment into a TypeScript type expression.\n */\nexport function schemaToType(\n schema: JsonSchema | undefined,\n level = 0,\n): string {\n if (!schema) {\n return \"unknown\";\n }\n\n if (\n \"allOf\" in schema ||\n \"anyOf\" in schema ||\n \"oneOf\" in schema ||\n \"$ref\" in schema ||\n Array.isArray(schema.type)\n ) {\n return \"unknown\";\n }\n\n switch (schema.type) {\n case \"string\":\n return \"string\";\n case \"number\":\n case \"integer\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"array\": {\n const itemType = schemaToType(\n isRecord(schema.items) ? (schema.items as JsonSchema) : undefined,\n level + 1,\n );\n\n if (isValidIdentifier(itemType)) {\n return `${itemType}[]`;\n }\n\n return `Array<${itemType}>`;\n }\n case \"object\": {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = new Set(\n Array.isArray(schema.required)\n ? schema.required.filter(\n (value): value is string => typeof value === \"string\",\n )\n : [],\n );\n const entries = Object.entries(properties);\n\n if (entries.length === 0) {\n return \"Record<string, unknown>\";\n }\n\n const lines = entries.map(([name, propertySchema]) => {\n const propertyType = schemaToType(\n isRecord(propertySchema) ? (propertySchema as JsonSchema) : undefined,\n level + 1,\n );\n const optionalToken = required.has(name) ? \"\" : \"?\";\n return `${serializePropertyName(name)}${optionalToken}: ${propertyType};`;\n });\n\n return `{\\n${indent(lines.join(\"\\n\"), level + 1)}\\n${\" \".repeat(level)}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction formatToolDeclaration(\n name: string,\n tool: TypegenToolDescriptor,\n): string {\n const lines: string[] = [];\n const comment = tool.description ? renderDocComment([tool.description]) : \"\";\n if (comment) {\n lines.push(comment);\n }\n\n const inputType = schemaToType(tool.inputSchema);\n const outputType = schemaToType(tool.outputSchema);\n lines.push(`function ${name}(input: ${inputType}): Promise<${outputType}>;`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates a namespace declaration for a provider's tool schemas.\n */\nexport function generateTypesFromJsonSchema(\n providerName: string,\n tools: Record<string, TypegenToolDescriptor>,\n): string {\n return renderNamespaceDeclaration(\n providerName,\n Object.entries(tools).map(([name, tool]) =>\n formatToolDeclaration(name, tool),\n ),\n );\n}\n","import Ajv, { type AnySchemaObject, type ValidateFunction } from \"ajv\";\n\nimport {\n ExecuteFailure,\n isExecuteFailure,\n isJsonSerializable,\n} from \"../errors\";\nimport { assertValidIdentifier } from \"../identifier\";\nimport { sanitizeToolName } from \"../sanitize\";\nimport { normalizeToolSchema } from \"../schema/normalizeSchema\";\nimport { generateTypesFromJsonSchema } from \"../typegen/jsonSchema\";\nimport type {\n JsonSchema,\n ResolvedToolDescriptor,\n ResolvedToolProvider,\n ToolExecutionContext,\n ToolProvider,\n TypegenToolDescriptor,\n} from \"../types\";\n\nconst DEFAULT_PROVIDER_NAME = \"codemode\";\nfunction assertValidNamespace(name: string): void {\n assertValidIdentifier(name, \"provider namespace\");\n}\n\nfunction compileValidator(\n ajv: Ajv,\n schema: JsonSchema | undefined,\n): ValidateFunction | undefined {\n return schema ? ajv.compile(schema as AnySchemaObject) : undefined;\n}\n\nfunction formatValidationMessage(\n ajv: Ajv,\n phase: \"input\" | \"output\",\n toolName: string,\n validator: ValidateFunction,\n): string {\n return `Invalid ${phase} for tool ${toolName}: ${ajv.errorsText(validator.errors)}`;\n}\n\n/**\n * Resolves a tool provider into the validated, sanitized shape consumed by executors.\n */\nexport function resolveProvider(provider: ToolProvider): ResolvedToolProvider {\n const name = provider.name ?? DEFAULT_PROVIDER_NAME;\n assertValidNamespace(name);\n\n // strict: false allows schemas with extra keywords (e.g. Zod-generated $schema)\n // that don't conform to the strict JSON Schema vocabulary.\n const ajv = new Ajv({\n allErrors: true,\n strict: false,\n });\n\n const originalToSafeName: Record<string, string> = {};\n const safeToOriginalName: Record<string, string> = {};\n const usedSafeNames = new Set<string>();\n const resolvedTools: Record<string, ResolvedToolDescriptor> = {};\n const typegenTools: Record<string, TypegenToolDescriptor> = {};\n\n for (const [originalName, descriptor] of Object.entries(provider.tools)) {\n const baseSafeName = sanitizeToolName(originalName);\n let safeName = baseSafeName;\n let suffix = 2;\n\n while (usedSafeNames.has(safeName)) {\n safeName = `${baseSafeName}__${suffix}`;\n suffix += 1;\n }\n\n usedSafeNames.add(safeName);\n originalToSafeName[originalName] = safeName;\n safeToOriginalName[safeName] = originalName;\n\n const inputSchema = normalizeToolSchema(\n descriptor.inputSchema,\n \"input\",\n originalName,\n );\n const outputSchema = normalizeToolSchema(\n descriptor.outputSchema,\n \"output\",\n originalName,\n );\n const inputValidator = compileValidator(ajv, inputSchema);\n const outputValidator = compileValidator(ajv, outputSchema);\n\n resolvedTools[safeName] = {\n description: descriptor.description,\n execute: async (\n input: unknown,\n context: ToolExecutionContext,\n ): Promise<unknown> => {\n if (inputValidator && !inputValidator(input)) {\n throw new ExecuteFailure(\n \"validation_error\",\n formatValidationMessage(ajv, \"input\", originalName, inputValidator),\n );\n }\n\n try {\n const result = await descriptor.execute(input, context);\n\n if (!isJsonSerializable(result)) {\n throw new ExecuteFailure(\n \"serialization_error\",\n `Tool ${originalName} returned a non-serializable value`,\n );\n }\n\n if (outputValidator && !outputValidator(result)) {\n throw new ExecuteFailure(\n \"validation_error\",\n formatValidationMessage(\n ajv,\n \"output\",\n originalName,\n outputValidator,\n ),\n );\n }\n\n return result;\n } catch (error) {\n if (isExecuteFailure(error)) {\n throw error;\n }\n\n throw new ExecuteFailure(\n \"tool_error\",\n error instanceof Error\n ? error.message\n : `Tool ${originalName} failed`,\n );\n }\n },\n inputSchema,\n originalName,\n outputSchema,\n safeName,\n };\n\n typegenTools[safeName] = {\n description: descriptor.description,\n inputSchema,\n outputSchema,\n };\n }\n\n return {\n name,\n originalToSafeName,\n safeToOriginalName,\n tools: resolvedTools,\n types: provider.types ?? generateTypesFromJsonSchema(name, typegenTools),\n };\n}\n"],"mappings":"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"}
|
|
@@ -319,30 +319,6 @@ Object.defineProperty(exports, '__toESM', {
|
|
|
319
319
|
return __toESM;
|
|
320
320
|
}
|
|
321
321
|
});
|
|
322
|
-
Object.defineProperty(exports, 'assertValidIdentifier', {
|
|
323
|
-
enumerable: true,
|
|
324
|
-
get: function () {
|
|
325
|
-
return assertValidIdentifier;
|
|
326
|
-
}
|
|
327
|
-
});
|
|
328
|
-
Object.defineProperty(exports, 'generateTypesFromJsonSchema', {
|
|
329
|
-
enumerable: true,
|
|
330
|
-
get: function () {
|
|
331
|
-
return generateTypesFromJsonSchema;
|
|
332
|
-
}
|
|
333
|
-
});
|
|
334
|
-
Object.defineProperty(exports, 'isReservedWord', {
|
|
335
|
-
enumerable: true,
|
|
336
|
-
get: function () {
|
|
337
|
-
return isReservedWord;
|
|
338
|
-
}
|
|
339
|
-
});
|
|
340
|
-
Object.defineProperty(exports, 'isValidIdentifier', {
|
|
341
|
-
enumerable: true,
|
|
342
|
-
get: function () {
|
|
343
|
-
return isValidIdentifier;
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
322
|
Object.defineProperty(exports, 'renderDocComment', {
|
|
347
323
|
enumerable: true,
|
|
348
324
|
get: function () {
|
|
@@ -361,28 +337,10 @@ Object.defineProperty(exports, 'resolveProvider', {
|
|
|
361
337
|
return resolveProvider;
|
|
362
338
|
}
|
|
363
339
|
});
|
|
364
|
-
Object.defineProperty(exports, 'sanitizeIdentifier', {
|
|
365
|
-
enumerable: true,
|
|
366
|
-
get: function () {
|
|
367
|
-
return sanitizeIdentifier;
|
|
368
|
-
}
|
|
369
|
-
});
|
|
370
|
-
Object.defineProperty(exports, 'sanitizeToolName', {
|
|
371
|
-
enumerable: true,
|
|
372
|
-
get: function () {
|
|
373
|
-
return sanitizeToolName;
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
340
|
Object.defineProperty(exports, 'schemaToType', {
|
|
377
341
|
enumerable: true,
|
|
378
342
|
get: function () {
|
|
379
343
|
return schemaToType;
|
|
380
344
|
}
|
|
381
345
|
});
|
|
382
|
-
|
|
383
|
-
enumerable: true,
|
|
384
|
-
get: function () {
|
|
385
|
-
return serializePropertyName;
|
|
386
|
-
}
|
|
387
|
-
});
|
|
388
|
-
//# sourceMappingURL=resolveProvider-BZYSw8Qk.cjs.map
|
|
346
|
+
//# sourceMappingURL=resolveProvider-CszBWDOY.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveProvider-BZYSw8Qk.cjs","names":["isRecord","lines: string[]","ajv","Ajv","originalToSafeName: Record<string, string>","safeToOriginalName: Record<string, string>","resolvedTools: Record<string, ResolvedToolDescriptor>","typegenTools: Record<string, TypegenToolDescriptor>","ExecuteFailure","isJsonSerializable","isExecuteFailure"],"sources":["../src/identifier.ts","../src/sanitize.ts","../src/schema/normalizeSchema.ts","../src/typegen/render.ts","../src/typegen/jsonSchema.ts","../src/provider/resolveProvider.ts"],"sourcesContent":["const RESERVED_WORDS = new Set([\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"enum\",\n \"export\",\n \"extends\",\n \"false\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"new\",\n \"null\",\n \"return\",\n \"super\",\n \"switch\",\n \"this\",\n \"throw\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\",\n]);\n\nconst UNDERSCORE_CHAR_CODE = 95;\n\nfunction trimEdgeUnderscores(value: string): string {\n let start = 0;\n let end = value.length;\n\n while (start < end && value.charCodeAt(start) === UNDERSCORE_CHAR_CODE) {\n start += 1;\n }\n\n while (end > start && value.charCodeAt(end - 1) === UNDERSCORE_CHAR_CODE) {\n end -= 1;\n }\n\n return value.slice(start, end);\n}\n\n/**\n * Returns whether the value is a valid JavaScript identifier.\n */\nexport function isValidIdentifier(value: string): boolean {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);\n}\n\n/**\n * Returns whether the identifier is reserved in JavaScript source.\n */\nexport function isReservedWord(value: string): boolean {\n return RESERVED_WORDS.has(value);\n}\n\n/**\n * Throws when the value cannot be used as a bare JavaScript identifier.\n */\nexport function assertValidIdentifier(\n value: string,\n label = \"identifier\",\n): void {\n if (!isValidIdentifier(value) || isReservedWord(value)) {\n throw new Error(`Invalid ${label}: ${value}`);\n }\n}\n\n/**\n * Converts a raw identifier-like value into a safe JavaScript identifier.\n */\nexport function sanitizeIdentifier(value: string): string {\n const sanitized = value.trim().replace(/[^A-Za-z0-9_$]+/g, \"_\");\n\n const trimmed = trimEdgeUnderscores(sanitized);\n\n let safeName = trimmed.length > 0 ? trimmed : \"_\";\n\n if (/^[0-9]/.test(safeName)) {\n safeName = `_${safeName}`;\n }\n\n if (isReservedWord(safeName)) {\n safeName = `${safeName}_`;\n }\n\n return safeName;\n}\n\n/**\n * Renders the name as a bare identifier when possible, otherwise as a string literal.\n */\nexport function serializePropertyName(name: string): string {\n return isValidIdentifier(name) ? name : JSON.stringify(name);\n}\n","import { sanitizeIdentifier } from \"./identifier\";\n\n/**\n * Converts a raw tool name into a safe JavaScript identifier.\n */\nexport function sanitizeToolName(name: string): string {\n return sanitizeIdentifier(name);\n}\n","import * as zod from \"zod\";\nimport type { ZodRawShape, ZodTypeAny } from \"zod\";\n\nimport type { JsonSchema, ToolSchema } from \"../types\";\n\nconst z = \"z\" in zod && typeof zod.z === \"object\" ? zod.z : zod;\nconst toJsonSchema =\n (\"toJSONSchema\" in zod ? zod.toJSONSchema : undefined) ??\n (\"toJSONSchema\" in z ? z.toJSONSchema : undefined);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isZodSchema(value: unknown): value is ZodTypeAny {\n return isRecord(value) && typeof value.safeParse === \"function\";\n}\n\nfunction isZodRawShape(value: unknown): value is ZodRawShape {\n return (\n isRecord(value) &&\n Object.keys(value).length > 0 &&\n Object.values(value).every(isZodSchema)\n );\n}\n\nfunction normalizeZodSchema(schema: ZodTypeAny): JsonSchema {\n if (typeof toJsonSchema !== \"function\") {\n throw new Error(\"Installed zod package does not expose toJSONSchema\");\n }\n\n const jsonSchema = toJsonSchema(schema) as JsonSchema & {\n $schema?: string;\n };\n\n if (\"$schema\" in jsonSchema) {\n const { $schema: _ignored, ...rest } = jsonSchema;\n return rest;\n }\n\n return jsonSchema;\n}\n\n/**\n * Normalizes supported tool schema inputs to the JSON Schema form used internally.\n */\nexport function normalizeToolSchema(\n schema: ToolSchema | undefined,\n phase: \"input\" | \"output\",\n toolName: string,\n): JsonSchema | undefined {\n if (schema === undefined) {\n return undefined;\n }\n\n if (isZodSchema(schema)) {\n return normalizeZodSchema(schema);\n }\n\n if (isZodRawShape(schema)) {\n return normalizeZodSchema(z.object(schema));\n }\n\n if (isRecord(schema)) {\n return schema;\n }\n\n throw new Error(\n `Unsupported ${phase} schema for tool ${toolName}. Expected JSON Schema, a Zod schema, or an MCP-style Zod shape.`,\n );\n}\n","/**\n * Indents each line of the given string by a specified number of levels.\n */\nexport function indent(value: string, level = 1): string {\n return value\n .split(\"\\n\")\n .map((line) => `${\" \".repeat(level)}${line}`)\n .join(\"\\n\");\n}\n\n/**\n * Renders a short TSDoc-style block when documentation is available.\n */\nexport function renderDocComment(lines: string[]): string {\n if (lines.length === 0) {\n return \"\";\n }\n\n return [\"/**\", ...lines.map((line) => ` * ${line}`), \" */\"].join(\"\\n\");\n}\n\n/**\n * Renders a namespace declaration with optional members.\n */\nexport function renderNamespaceDeclaration(\n name: string,\n members: string[],\n): string {\n if (members.length === 0) {\n return `declare namespace ${name} {}`;\n }\n\n return `declare namespace ${name} {\\n${indent(members.join(\"\\n\\n\"))}\\n}`;\n}\n","import { isValidIdentifier, serializePropertyName } from \"../identifier\";\nimport type { JsonSchema, TypegenToolDescriptor } from \"../types\";\nimport { indent, renderDocComment, renderNamespaceDeclaration } from \"./render\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport { indent } from \"./render\";\n\n/**\n * Converts a supported JSON Schema fragment into a TypeScript type expression.\n */\nexport function schemaToType(\n schema: JsonSchema | undefined,\n level = 0,\n): string {\n if (!schema) {\n return \"unknown\";\n }\n\n if (\n \"allOf\" in schema ||\n \"anyOf\" in schema ||\n \"oneOf\" in schema ||\n \"$ref\" in schema ||\n Array.isArray(schema.type)\n ) {\n return \"unknown\";\n }\n\n switch (schema.type) {\n case \"string\":\n return \"string\";\n case \"number\":\n case \"integer\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"array\": {\n const itemType = schemaToType(\n isRecord(schema.items) ? (schema.items as JsonSchema) : undefined,\n level + 1,\n );\n\n if (isValidIdentifier(itemType)) {\n return `${itemType}[]`;\n }\n\n return `Array<${itemType}>`;\n }\n case \"object\": {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = new Set(\n Array.isArray(schema.required)\n ? schema.required.filter(\n (value): value is string => typeof value === \"string\",\n )\n : [],\n );\n const entries = Object.entries(properties);\n\n if (entries.length === 0) {\n return \"Record<string, unknown>\";\n }\n\n const lines = entries.map(([name, propertySchema]) => {\n const propertyType = schemaToType(\n isRecord(propertySchema) ? (propertySchema as JsonSchema) : undefined,\n level + 1,\n );\n const optionalToken = required.has(name) ? \"\" : \"?\";\n return `${serializePropertyName(name)}${optionalToken}: ${propertyType};`;\n });\n\n return `{\\n${indent(lines.join(\"\\n\"), level + 1)}\\n${\" \".repeat(level)}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction formatToolDeclaration(\n name: string,\n tool: TypegenToolDescriptor,\n): string {\n const lines: string[] = [];\n const comment = tool.description ? renderDocComment([tool.description]) : \"\";\n if (comment) {\n lines.push(comment);\n }\n\n const inputType = schemaToType(tool.inputSchema);\n const outputType = schemaToType(tool.outputSchema);\n lines.push(`function ${name}(input: ${inputType}): Promise<${outputType}>;`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates a namespace declaration for a provider's tool schemas.\n */\nexport function generateTypesFromJsonSchema(\n providerName: string,\n tools: Record<string, TypegenToolDescriptor>,\n): string {\n return renderNamespaceDeclaration(\n providerName,\n Object.entries(tools).map(([name, tool]) =>\n formatToolDeclaration(name, tool),\n ),\n );\n}\n","import Ajv, { type AnySchemaObject, type ValidateFunction } from \"ajv\";\n\nimport {\n ExecuteFailure,\n isExecuteFailure,\n isJsonSerializable,\n} from \"../errors\";\nimport { assertValidIdentifier } from \"../identifier\";\nimport { sanitizeToolName } from \"../sanitize\";\nimport { normalizeToolSchema } from \"../schema/normalizeSchema\";\nimport { generateTypesFromJsonSchema } from \"../typegen/jsonSchema\";\nimport type {\n JsonSchema,\n ResolvedToolDescriptor,\n ResolvedToolProvider,\n ToolExecutionContext,\n ToolProvider,\n TypegenToolDescriptor,\n} from \"../types\";\n\nconst DEFAULT_PROVIDER_NAME = \"codemode\";\nfunction assertValidNamespace(name: string): void {\n assertValidIdentifier(name, \"provider namespace\");\n}\n\nfunction compileValidator(\n ajv: Ajv,\n schema: JsonSchema | undefined,\n): ValidateFunction | undefined {\n return schema ? ajv.compile(schema as AnySchemaObject) : undefined;\n}\n\nfunction formatValidationMessage(\n ajv: Ajv,\n phase: \"input\" | \"output\",\n toolName: string,\n validator: ValidateFunction,\n): string {\n return `Invalid ${phase} for tool ${toolName}: ${ajv.errorsText(validator.errors)}`;\n}\n\n/**\n * Resolves a tool provider into the validated, sanitized shape consumed by executors.\n */\nexport function resolveProvider(provider: ToolProvider): ResolvedToolProvider {\n const name = provider.name ?? DEFAULT_PROVIDER_NAME;\n assertValidNamespace(name);\n\n // strict: false allows schemas with extra keywords (e.g. Zod-generated $schema)\n // that don't conform to the strict JSON Schema vocabulary.\n const ajv = new Ajv({\n allErrors: true,\n strict: false,\n });\n\n const originalToSafeName: Record<string, string> = {};\n const safeToOriginalName: Record<string, string> = {};\n const usedSafeNames = new Set<string>();\n const resolvedTools: Record<string, ResolvedToolDescriptor> = {};\n const typegenTools: Record<string, TypegenToolDescriptor> = {};\n\n for (const [originalName, descriptor] of Object.entries(provider.tools)) {\n const baseSafeName = sanitizeToolName(originalName);\n let safeName = baseSafeName;\n let suffix = 2;\n\n while (usedSafeNames.has(safeName)) {\n safeName = `${baseSafeName}__${suffix}`;\n suffix += 1;\n }\n\n usedSafeNames.add(safeName);\n originalToSafeName[originalName] = safeName;\n safeToOriginalName[safeName] = originalName;\n\n const inputSchema = normalizeToolSchema(\n descriptor.inputSchema,\n \"input\",\n originalName,\n );\n const outputSchema = normalizeToolSchema(\n descriptor.outputSchema,\n \"output\",\n originalName,\n );\n const inputValidator = compileValidator(ajv, inputSchema);\n const outputValidator = compileValidator(ajv, outputSchema);\n\n resolvedTools[safeName] = {\n description: descriptor.description,\n execute: async (\n input: unknown,\n context: ToolExecutionContext,\n ): Promise<unknown> => {\n if (inputValidator && !inputValidator(input)) {\n throw new ExecuteFailure(\n \"validation_error\",\n formatValidationMessage(ajv, \"input\", originalName, inputValidator),\n );\n }\n\n try {\n const result = await descriptor.execute(input, context);\n\n if (!isJsonSerializable(result)) {\n throw new ExecuteFailure(\n \"serialization_error\",\n `Tool ${originalName} returned a non-serializable value`,\n );\n }\n\n if (outputValidator && !outputValidator(result)) {\n throw new ExecuteFailure(\n \"validation_error\",\n formatValidationMessage(\n ajv,\n \"output\",\n originalName,\n outputValidator,\n ),\n );\n }\n\n return result;\n } catch (error) {\n if (isExecuteFailure(error)) {\n throw error;\n }\n\n throw new ExecuteFailure(\n \"tool_error\",\n error instanceof Error\n ? error.message\n : `Tool ${originalName} failed`,\n );\n }\n },\n inputSchema,\n originalName,\n outputSchema,\n safeName,\n };\n\n typegenTools[safeName] = {\n description: descriptor.description,\n inputSchema,\n outputSchema,\n };\n }\n\n return {\n name,\n originalToSafeName,\n safeToOriginalName,\n tools: resolvedTools,\n types: provider.types ?? generateTypesFromJsonSchema(name, typegenTools),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resolveProvider-CszBWDOY.cjs","names":["isRecord","lines: string[]","ajv","Ajv","originalToSafeName: Record<string, string>","safeToOriginalName: Record<string, string>","resolvedTools: Record<string, ResolvedToolDescriptor>","typegenTools: Record<string, TypegenToolDescriptor>","ExecuteFailure","isJsonSerializable","isExecuteFailure"],"sources":["../src/identifier.ts","../src/sanitize.ts","../src/schema/normalizeSchema.ts","../src/typegen/render.ts","../src/typegen/jsonSchema.ts","../src/provider/resolveProvider.ts"],"sourcesContent":["const RESERVED_WORDS = new Set([\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"enum\",\n \"export\",\n \"extends\",\n \"false\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"new\",\n \"null\",\n \"return\",\n \"super\",\n \"switch\",\n \"this\",\n \"throw\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\",\n]);\n\nconst UNDERSCORE_CHAR_CODE = 95;\n\nfunction trimEdgeUnderscores(value: string): string {\n let start = 0;\n let end = value.length;\n\n while (start < end && value.charCodeAt(start) === UNDERSCORE_CHAR_CODE) {\n start += 1;\n }\n\n while (end > start && value.charCodeAt(end - 1) === UNDERSCORE_CHAR_CODE) {\n end -= 1;\n }\n\n return value.slice(start, end);\n}\n\n/**\n * Returns whether the value is a valid JavaScript identifier.\n */\nexport function isValidIdentifier(value: string): boolean {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);\n}\n\n/**\n * Returns whether the identifier is reserved in JavaScript source.\n */\nexport function isReservedWord(value: string): boolean {\n return RESERVED_WORDS.has(value);\n}\n\n/**\n * Throws when the value cannot be used as a bare JavaScript identifier.\n */\nexport function assertValidIdentifier(\n value: string,\n label = \"identifier\",\n): void {\n if (!isValidIdentifier(value) || isReservedWord(value)) {\n throw new Error(`Invalid ${label}: ${value}`);\n }\n}\n\n/**\n * Converts a raw identifier-like value into a safe JavaScript identifier.\n */\nexport function sanitizeIdentifier(value: string): string {\n const sanitized = value.trim().replace(/[^A-Za-z0-9_$]+/g, \"_\");\n\n const trimmed = trimEdgeUnderscores(sanitized);\n\n let safeName = trimmed.length > 0 ? trimmed : \"_\";\n\n if (/^[0-9]/.test(safeName)) {\n safeName = `_${safeName}`;\n }\n\n if (isReservedWord(safeName)) {\n safeName = `${safeName}_`;\n }\n\n return safeName;\n}\n\n/**\n * Renders the name as a bare identifier when possible, otherwise as a string literal.\n */\nexport function serializePropertyName(name: string): string {\n return isValidIdentifier(name) ? name : JSON.stringify(name);\n}\n","import { sanitizeIdentifier } from \"./identifier\";\n\n/**\n * Converts a raw tool name into a safe JavaScript identifier.\n */\nexport function sanitizeToolName(name: string): string {\n return sanitizeIdentifier(name);\n}\n","import * as zod from \"zod\";\nimport type { ZodRawShape, ZodTypeAny } from \"zod\";\n\nimport type { JsonSchema, ToolSchema } from \"../types\";\n\nconst z = \"z\" in zod && typeof zod.z === \"object\" ? zod.z : zod;\nconst toJsonSchema =\n (\"toJSONSchema\" in zod ? zod.toJSONSchema : undefined) ??\n (\"toJSONSchema\" in z ? z.toJSONSchema : undefined);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isZodSchema(value: unknown): value is ZodTypeAny {\n return isRecord(value) && typeof value.safeParse === \"function\";\n}\n\nfunction isZodRawShape(value: unknown): value is ZodRawShape {\n return (\n isRecord(value) &&\n Object.keys(value).length > 0 &&\n Object.values(value).every(isZodSchema)\n );\n}\n\nfunction normalizeZodSchema(schema: ZodTypeAny): JsonSchema {\n if (typeof toJsonSchema !== \"function\") {\n throw new Error(\"Installed zod package does not expose toJSONSchema\");\n }\n\n const jsonSchema = toJsonSchema(schema) as JsonSchema & {\n $schema?: string;\n };\n\n if (\"$schema\" in jsonSchema) {\n const { $schema: _ignored, ...rest } = jsonSchema;\n return rest;\n }\n\n return jsonSchema;\n}\n\n/**\n * Normalizes supported tool schema inputs to the JSON Schema form used internally.\n */\nexport function normalizeToolSchema(\n schema: ToolSchema | undefined,\n phase: \"input\" | \"output\",\n toolName: string,\n): JsonSchema | undefined {\n if (schema === undefined) {\n return undefined;\n }\n\n if (isZodSchema(schema)) {\n return normalizeZodSchema(schema);\n }\n\n if (isZodRawShape(schema)) {\n return normalizeZodSchema(z.object(schema));\n }\n\n if (isRecord(schema)) {\n return schema;\n }\n\n throw new Error(\n `Unsupported ${phase} schema for tool ${toolName}. Expected JSON Schema, a Zod schema, or an MCP-style Zod shape.`,\n );\n}\n","/**\n * Indents each line of the given string by a specified number of levels.\n */\nexport function indent(value: string, level = 1): string {\n return value\n .split(\"\\n\")\n .map((line) => `${\" \".repeat(level)}${line}`)\n .join(\"\\n\");\n}\n\n/**\n * Renders a short TSDoc-style block when documentation is available.\n */\nexport function renderDocComment(lines: string[]): string {\n if (lines.length === 0) {\n return \"\";\n }\n\n return [\"/**\", ...lines.map((line) => ` * ${line}`), \" */\"].join(\"\\n\");\n}\n\n/**\n * Renders a namespace declaration with optional members.\n */\nexport function renderNamespaceDeclaration(\n name: string,\n members: string[],\n): string {\n if (members.length === 0) {\n return `declare namespace ${name} {}`;\n }\n\n return `declare namespace ${name} {\\n${indent(members.join(\"\\n\\n\"))}\\n}`;\n}\n","import { isValidIdentifier, serializePropertyName } from \"../identifier\";\nimport type { JsonSchema, TypegenToolDescriptor } from \"../types\";\nimport { indent, renderDocComment, renderNamespaceDeclaration } from \"./render\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport { indent } from \"./render\";\n\n/**\n * Converts a supported JSON Schema fragment into a TypeScript type expression.\n */\nexport function schemaToType(\n schema: JsonSchema | undefined,\n level = 0,\n): string {\n if (!schema) {\n return \"unknown\";\n }\n\n if (\n \"allOf\" in schema ||\n \"anyOf\" in schema ||\n \"oneOf\" in schema ||\n \"$ref\" in schema ||\n Array.isArray(schema.type)\n ) {\n return \"unknown\";\n }\n\n switch (schema.type) {\n case \"string\":\n return \"string\";\n case \"number\":\n case \"integer\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"array\": {\n const itemType = schemaToType(\n isRecord(schema.items) ? (schema.items as JsonSchema) : undefined,\n level + 1,\n );\n\n if (isValidIdentifier(itemType)) {\n return `${itemType}[]`;\n }\n\n return `Array<${itemType}>`;\n }\n case \"object\": {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = new Set(\n Array.isArray(schema.required)\n ? schema.required.filter(\n (value): value is string => typeof value === \"string\",\n )\n : [],\n );\n const entries = Object.entries(properties);\n\n if (entries.length === 0) {\n return \"Record<string, unknown>\";\n }\n\n const lines = entries.map(([name, propertySchema]) => {\n const propertyType = schemaToType(\n isRecord(propertySchema) ? (propertySchema as JsonSchema) : undefined,\n level + 1,\n );\n const optionalToken = required.has(name) ? \"\" : \"?\";\n return `${serializePropertyName(name)}${optionalToken}: ${propertyType};`;\n });\n\n return `{\\n${indent(lines.join(\"\\n\"), level + 1)}\\n${\" \".repeat(level)}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction formatToolDeclaration(\n name: string,\n tool: TypegenToolDescriptor,\n): string {\n const lines: string[] = [];\n const comment = tool.description ? renderDocComment([tool.description]) : \"\";\n if (comment) {\n lines.push(comment);\n }\n\n const inputType = schemaToType(tool.inputSchema);\n const outputType = schemaToType(tool.outputSchema);\n lines.push(`function ${name}(input: ${inputType}): Promise<${outputType}>;`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates a namespace declaration for a provider's tool schemas.\n */\nexport function generateTypesFromJsonSchema(\n providerName: string,\n tools: Record<string, TypegenToolDescriptor>,\n): string {\n return renderNamespaceDeclaration(\n providerName,\n Object.entries(tools).map(([name, tool]) =>\n formatToolDeclaration(name, tool),\n ),\n );\n}\n","import Ajv, { type AnySchemaObject, type ValidateFunction } from \"ajv\";\n\nimport {\n ExecuteFailure,\n isExecuteFailure,\n isJsonSerializable,\n} from \"../errors\";\nimport { assertValidIdentifier } from \"../identifier\";\nimport { sanitizeToolName } from \"../sanitize\";\nimport { normalizeToolSchema } from \"../schema/normalizeSchema\";\nimport { generateTypesFromJsonSchema } from \"../typegen/jsonSchema\";\nimport type {\n JsonSchema,\n ResolvedToolDescriptor,\n ResolvedToolProvider,\n ToolExecutionContext,\n ToolProvider,\n TypegenToolDescriptor,\n} from \"../types\";\n\nconst DEFAULT_PROVIDER_NAME = \"codemode\";\nfunction assertValidNamespace(name: string): void {\n assertValidIdentifier(name, \"provider namespace\");\n}\n\nfunction compileValidator(\n ajv: Ajv,\n schema: JsonSchema | undefined,\n): ValidateFunction | undefined {\n return schema ? ajv.compile(schema as AnySchemaObject) : undefined;\n}\n\nfunction formatValidationMessage(\n ajv: Ajv,\n phase: \"input\" | \"output\",\n toolName: string,\n validator: ValidateFunction,\n): string {\n return `Invalid ${phase} for tool ${toolName}: ${ajv.errorsText(validator.errors)}`;\n}\n\n/**\n * Resolves a tool provider into the validated, sanitized shape consumed by executors.\n */\nexport function resolveProvider(provider: ToolProvider): ResolvedToolProvider {\n const name = provider.name ?? DEFAULT_PROVIDER_NAME;\n assertValidNamespace(name);\n\n // strict: false allows schemas with extra keywords (e.g. Zod-generated $schema)\n // that don't conform to the strict JSON Schema vocabulary.\n const ajv = new Ajv({\n allErrors: true,\n strict: false,\n });\n\n const originalToSafeName: Record<string, string> = {};\n const safeToOriginalName: Record<string, string> = {};\n const usedSafeNames = new Set<string>();\n const resolvedTools: Record<string, ResolvedToolDescriptor> = {};\n const typegenTools: Record<string, TypegenToolDescriptor> = {};\n\n for (const [originalName, descriptor] of Object.entries(provider.tools)) {\n const baseSafeName = sanitizeToolName(originalName);\n let safeName = baseSafeName;\n let suffix = 2;\n\n while (usedSafeNames.has(safeName)) {\n safeName = `${baseSafeName}__${suffix}`;\n suffix += 1;\n }\n\n usedSafeNames.add(safeName);\n originalToSafeName[originalName] = safeName;\n safeToOriginalName[safeName] = originalName;\n\n const inputSchema = normalizeToolSchema(\n descriptor.inputSchema,\n \"input\",\n originalName,\n );\n const outputSchema = normalizeToolSchema(\n descriptor.outputSchema,\n \"output\",\n originalName,\n );\n const inputValidator = compileValidator(ajv, inputSchema);\n const outputValidator = compileValidator(ajv, outputSchema);\n\n resolvedTools[safeName] = {\n description: descriptor.description,\n execute: async (\n input: unknown,\n context: ToolExecutionContext,\n ): Promise<unknown> => {\n if (inputValidator && !inputValidator(input)) {\n throw new ExecuteFailure(\n \"validation_error\",\n formatValidationMessage(ajv, \"input\", originalName, inputValidator),\n );\n }\n\n try {\n const result = await descriptor.execute(input, context);\n\n if (!isJsonSerializable(result)) {\n throw new ExecuteFailure(\n \"serialization_error\",\n `Tool ${originalName} returned a non-serializable value`,\n );\n }\n\n if (outputValidator && !outputValidator(result)) {\n throw new ExecuteFailure(\n \"validation_error\",\n formatValidationMessage(\n ajv,\n \"output\",\n originalName,\n outputValidator,\n ),\n );\n }\n\n return result;\n } catch (error) {\n if (isExecuteFailure(error)) {\n throw error;\n }\n\n throw new ExecuteFailure(\n \"tool_error\",\n error instanceof Error\n ? error.message\n : `Tool ${originalName} failed`,\n );\n }\n },\n inputSchema,\n originalName,\n outputSchema,\n safeName,\n };\n\n typegenTools[safeName] = {\n description: descriptor.description,\n inputSchema,\n outputSchema,\n };\n }\n\n return {\n name,\n originalToSafeName,\n safeToOriginalName,\n tools: resolvedTools,\n types: provider.types ?? generateTypesFromJsonSchema(name, typegenTools),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as isExecuteFailure, r as isJsonSerializable, t as ExecuteFailure } from "./errors-
|
|
1
|
+
import { n as isExecuteFailure, r as isJsonSerializable, t as ExecuteFailure } from "./errors-DdWVEGU8.js";
|
|
2
2
|
|
|
3
3
|
//#region src/executor/shared.ts
|
|
4
4
|
const EXECUTION_TIMEOUT_MESSAGE = "Execution timed out";
|
|
@@ -173,4 +173,4 @@ function createToolCallDispatcher(providers, signal) {
|
|
|
173
173
|
|
|
174
174
|
//#endregion
|
|
175
175
|
export { formatConsoleLine as a, normalizeThrownMessage as c, createTimeoutExecuteResult as i, normalizeThrownName as l, extractProviderManifests as n, getExecutionTimeoutMessage as o, createExecutionContext as r, isKnownExecuteErrorCode as s, createToolCallDispatcher as t, truncateLogs as u };
|
|
176
|
-
//# sourceMappingURL=runner-
|
|
176
|
+
//# sourceMappingURL=runner-BqYkAnOm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-6GMM-5ur.js","names":["truncated: string[]"],"sources":["../src/executor/shared.ts","../src/runner.ts"],"sourcesContent":["import type {\n ExecuteError,\n ExecuteErrorCode,\n ExecuteResult,\n ToolExecutionContext,\n} from \"../types\";\n\nconst EXECUTION_TIMEOUT_MESSAGE = \"Execution timed out\";\n\n/**\n * Canonical error codes that may safely cross trusted executor boundaries.\n */\nconst KNOWN_EXECUTE_ERROR_CODES = new Set<ExecuteErrorCode>([\n \"timeout\",\n \"memory_limit\",\n \"validation_error\",\n \"tool_error\",\n \"runtime_error\",\n \"serialization_error\",\n \"internal_error\",\n]);\n\n/**\n * Returns whether the value is one of execbox's stable execution error codes.\n */\nexport function isKnownExecuteErrorCode(\n value: unknown,\n): value is ExecuteErrorCode {\n return KNOWN_EXECUTE_ERROR_CODES.has(value as ExecuteErrorCode);\n}\n\n/**\n * Returns the stable timeout message used across executor implementations.\n */\nexport function getExecutionTimeoutMessage(): string {\n return EXECUTION_TIMEOUT_MESSAGE;\n}\n\n/**\n * Creates the canonical timeout failure result used for preflight cancellation.\n */\nexport function createTimeoutExecuteResult(durationMs = 0): ExecuteResult {\n return {\n durationMs,\n error: {\n code: \"timeout\",\n message: getExecutionTimeoutMessage(),\n } satisfies ExecuteError,\n logs: [],\n ok: false,\n };\n}\n\n/**\n * Normalizes an unknown thrown value into a human-readable message.\n */\nexport function normalizeThrownMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n const message = (error as { message?: unknown }).message;\n if (typeof message === \"string\") {\n return message;\n }\n }\n\n return String(error);\n}\n\n/**\n * Returns the thrown error name when one is available.\n */\nexport function normalizeThrownName(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.name;\n }\n\n if (typeof error === \"object\" && error !== null && \"name\" in error) {\n const name = (error as { name?: unknown }).name;\n if (typeof name === \"string\") {\n return name;\n }\n }\n\n return undefined;\n}\n\n/**\n * Builds the standard tool execution context passed to resolved tool wrappers.\n */\nexport function createExecutionContext(\n signal: AbortSignal,\n providerName: string,\n safeToolName: string,\n originalToolName: string,\n): ToolExecutionContext {\n return {\n originalToolName,\n providerName,\n safeToolName,\n signal,\n };\n}\n\n/**\n * Truncates captured logs to the configured line and character limits.\n */\nexport function truncateLogs(\n logs: string[],\n maxLogLines: number,\n maxLogChars: number,\n): string[] {\n const limitedLines = logs.slice(0, maxLogLines);\n let remainingChars = maxLogChars;\n const truncated: string[] = [];\n\n for (const line of limitedLines) {\n if (remainingChars <= 0) {\n break;\n }\n\n if (line.length <= remainingChars) {\n truncated.push(line);\n remainingChars -= line.length;\n continue;\n }\n\n truncated.push(line.slice(0, remainingChars));\n break;\n }\n\n return truncated;\n}\n\nfunction formatLogValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value === undefined) {\n return \"undefined\";\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Formats guest console arguments into a single host-side log line.\n */\nexport function formatConsoleLine(values: unknown[]): string {\n return values.map((value) => formatLogValue(value)).join(\" \");\n}\n","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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runner-BqYkAnOm.js","names":["truncated: string[]"],"sources":["../src/executor/shared.ts","../src/runner.ts"],"sourcesContent":["import type {\n ExecuteError,\n ExecuteErrorCode,\n ExecuteResult,\n ToolExecutionContext,\n} from \"../types\";\n\nconst EXECUTION_TIMEOUT_MESSAGE = \"Execution timed out\";\n\n/**\n * Canonical error codes that may safely cross trusted executor boundaries.\n */\nconst KNOWN_EXECUTE_ERROR_CODES = new Set<ExecuteErrorCode>([\n \"timeout\",\n \"memory_limit\",\n \"validation_error\",\n \"tool_error\",\n \"runtime_error\",\n \"serialization_error\",\n \"internal_error\",\n]);\n\n/**\n * Returns whether the value is one of execbox's stable execution error codes.\n */\nexport function isKnownExecuteErrorCode(\n value: unknown,\n): value is ExecuteErrorCode {\n return KNOWN_EXECUTE_ERROR_CODES.has(value as ExecuteErrorCode);\n}\n\n/**\n * Returns the stable timeout message used across executor implementations.\n */\nexport function getExecutionTimeoutMessage(): string {\n return EXECUTION_TIMEOUT_MESSAGE;\n}\n\n/**\n * Creates the canonical timeout failure result used for preflight cancellation.\n */\nexport function createTimeoutExecuteResult(durationMs = 0): ExecuteResult {\n return {\n durationMs,\n error: {\n code: \"timeout\",\n message: getExecutionTimeoutMessage(),\n } satisfies ExecuteError,\n logs: [],\n ok: false,\n };\n}\n\n/**\n * Normalizes an unknown thrown value into a human-readable message.\n */\nexport function normalizeThrownMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n const message = (error as { message?: unknown }).message;\n if (typeof message === \"string\") {\n return message;\n }\n }\n\n return String(error);\n}\n\n/**\n * Returns the thrown error name when one is available.\n */\nexport function normalizeThrownName(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.name;\n }\n\n if (typeof error === \"object\" && error !== null && \"name\" in error) {\n const name = (error as { name?: unknown }).name;\n if (typeof name === \"string\") {\n return name;\n }\n }\n\n return undefined;\n}\n\n/**\n * Builds the standard tool execution context passed to resolved tool wrappers.\n */\nexport function createExecutionContext(\n signal: AbortSignal,\n providerName: string,\n safeToolName: string,\n originalToolName: string,\n): ToolExecutionContext {\n return {\n originalToolName,\n providerName,\n safeToolName,\n signal,\n };\n}\n\n/**\n * Truncates captured logs to the configured line and character limits.\n */\nexport function truncateLogs(\n logs: string[],\n maxLogLines: number,\n maxLogChars: number,\n): string[] {\n const limitedLines = logs.slice(0, maxLogLines);\n let remainingChars = maxLogChars;\n const truncated: string[] = [];\n\n for (const line of limitedLines) {\n if (remainingChars <= 0) {\n break;\n }\n\n if (line.length <= remainingChars) {\n truncated.push(line);\n remainingChars -= line.length;\n continue;\n }\n\n truncated.push(line.slice(0, remainingChars));\n break;\n }\n\n return truncated;\n}\n\nfunction formatLogValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value === undefined) {\n return \"undefined\";\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Formats guest console arguments into a single host-side log line.\n */\nexport function formatConsoleLine(values: unknown[]): string {\n return values.map((value) => formatLogValue(value)).join(\" \");\n}\n","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"],"mappings":"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"}
|
package/dist/runtime.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_resolveProvider = require('./resolveProvider-
|
|
1
|
+
const require_resolveProvider = require('./resolveProvider-CszBWDOY.cjs');
|
|
2
2
|
const require_errors = require('./errors-xD8r6fCf.cjs');
|
|
3
3
|
const require_runner = require('./runner-CsrfDub-.cjs');
|
|
4
4
|
let acorn = require("acorn");
|
package/dist/runtime.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as isExecuteFailure, r as isJsonSerializable, t as ExecuteFailure } from "./errors-
|
|
2
|
-
import { a as formatConsoleLine, c as normalizeThrownMessage, i as createTimeoutExecuteResult, l as normalizeThrownName, n as extractProviderManifests, o as getExecutionTimeoutMessage, r as createExecutionContext, s as isKnownExecuteErrorCode, t as createToolCallDispatcher, u as truncateLogs } from "./runner-
|
|
1
|
+
import { n as isExecuteFailure, r as isJsonSerializable, t as ExecuteFailure } from "./errors-DdWVEGU8.js";
|
|
2
|
+
import { a as formatConsoleLine, c as normalizeThrownMessage, i as createTimeoutExecuteResult, l as normalizeThrownName, n as extractProviderManifests, o as getExecutionTimeoutMessage, r as createExecutionContext, s as isKnownExecuteErrorCode, t as createToolCallDispatcher, u as truncateLogs } from "./runner-BqYkAnOm.js";
|
|
3
3
|
import { parse } from "acorn";
|
|
4
4
|
|
|
5
5
|
//#region src/normalize.ts
|